[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n# Unix-style newlines with a newline ending every file\n[*]\nend_of_line = crlf\ninsert_final_newline = true\nindent_style = space\nindent_size = 4\ncsharp_new_line_before_open_brace = all\ncsharp_new_line_before_else = true\ncsharp_new_line_before_catch = true\ncsharp_new_line_before_finally = true\n"
  },
  {
    "path": ".gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbuild/\nbld/\n[Bb]in/\n[Oo]bj/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# DNX\nproject.lock.json\nartifacts/\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opensdf\n*.sdf\n*.cachefile\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n## TODO: Comment the next line if you want to checkin your\n## web deploy settings but do note that will include unencrypted\n## passwords\n#*.pubxml\n\n*.publishproj\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n\n# Windows Azure Build Output\ncsx/\n*.build.csdef\n\n# Windows Store app package directory\nAppPackages/\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n[Ss]tyle[Cc]op.*\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# LightSwitch generated files\nGeneratedArtifacts/\n_Pvt_Extensions/\nModelManifest.xml\n*.bacpac\n/*.rb\n/*.bat\n/tools/XmlGenerator/*.sqlite\n"
  },
  {
    "path": "EVEMon.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"src\", \"src\", \"{D7B1651B-8895-4254-8EBF-029CBEE3C1E3}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"tests\", \"tests\", \"{B2FD94FF-A895-4519-A97F-6DEA32F15F8E}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"tools\", \"tools\", \"{9AB16E7E-E520-4444-8E8E-165129CC93B3}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"EVEMon\", \"src\\EVEMon\\EVEMon.csproj\", \"{A2E5EFE0-614A-4567-95E5-92A4D94169AC}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{696E929A-6A4A-4C6D-A8B2-C4F25F781940} = {696E929A-6A4A-4C6D-A8B2-C4F25F781940}\n\t\t{8C4A87A0-780E-4765-ADD0-146091FE26F4} = {8C4A87A0-780E-4765-ADD0-146091FE26F4}\n\t\t{87682BB1-CCE5-4CA4-BDE8-1A2ACF0B3CE0} = {87682BB1-CCE5-4CA4-BDE8-1A2ACF0B3CE0}\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"EVEMon.Common\", \"src\\EVEMon.Common\\EVEMon.Common.csproj\", \"{C0665275-3E0B-4117-81B0-751206ED03CD}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"EVEMon.LogitechG15\", \"src\\EVEMon.LogitechG15\\EVEMon.LogitechG15.csproj\", \"{3067BDFB-C02D-4CAF-96AA-4D8F9F986180}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"EVEMon.PieChart\", \"src\\EVEMon.PieChart\\EVEMon.PieChart.csproj\", \"{696E929A-6A4A-4C6D-A8B2-C4F25F781940}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"EVEMon.WindowsApi\", \"src\\EVEMon.WindowsApi\\EVEMon.WindowsApi.csproj\", \"{D942D976-6185-4ECD-A83B-60260100D12E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"EVEMon.Watchdog\", \"src\\EVEMon.Watchdog\\EVEMon.Watchdog.csproj\", \"{8C4A87A0-780E-4765-ADD0-146091FE26F4}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Tests.EVEMon.Common\", \"tests\\Tests.EVEMon.Common\\Tests.EVEMon.Common.csproj\", \"{C61CB94F-31DF-48BE-8053-FCE7DC6ECD7F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"InstallBuilder\", \"tools\\InstallBuilder\\InstallBuilder.csproj\", \"{5CE8E302-3577-41BC-A35F-C88AC625F7A7}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{87682BB1-CCE5-4CA4-BDE8-1A2ACF0B3CE0} = {87682BB1-CCE5-4CA4-BDE8-1A2ACF0B3CE0}\n\t\t{A2E5EFE0-614A-4567-95E5-92A4D94169AC} = {A2E5EFE0-614A-4567-95E5-92A4D94169AC}\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"XmlGenerator\", \"tools\\XmlGenerator\\XmlGenerator.csproj\", \"{9366D54A-B516-4A1D-987B-B1BCE31D2A72}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"PatchXmlCreator\", \"tools\\PatchXmlCreator\\PatchXmlCreator.csproj\", \"{E6907BAD-CDF4-4B3C-AF2E-E854D2E2D959}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ResFileCreator\", \"tools\\ResFileCreator\\ResFileCreator.csproj\", \"{87682BB1-CCE5-4CA4-BDE8-1A2ACF0B3CE0}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{A7AC1A9C-97FC-4937-A8CA-684650A99D01}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t.editorconfig = .editorconfig\n\t\tSharedAssemblyInfo.cs = SharedAssemblyInfo.cs\n\t\tSharedAssemblyInfo.template.cs = SharedAssemblyInfo.template.cs\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Tests.EVEMon\", \"tests\\Tests.EVEMon\\Tests.EVEMon.csproj\", \"{FD639BF6-3414-4FB2-8325-61744D44F028}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Tests.Helpers\", \"tests\\Tests.Helpers\\Tests.Helpers.csproj\", \"{1917E258-0979-4333-8B20-5D66E8986E1C}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tSnapshot|Any CPU = Snapshot|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{A2E5EFE0-614A-4567-95E5-92A4D94169AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A2E5EFE0-614A-4567-95E5-92A4D94169AC}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A2E5EFE0-614A-4567-95E5-92A4D94169AC}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A2E5EFE0-614A-4567-95E5-92A4D94169AC}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A2E5EFE0-614A-4567-95E5-92A4D94169AC}.Snapshot|Any CPU.ActiveCfg = Snapshot|Any CPU\n\t\t{A2E5EFE0-614A-4567-95E5-92A4D94169AC}.Snapshot|Any CPU.Build.0 = Snapshot|Any CPU\n\t\t{C0665275-3E0B-4117-81B0-751206ED03CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C0665275-3E0B-4117-81B0-751206ED03CD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C0665275-3E0B-4117-81B0-751206ED03CD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C0665275-3E0B-4117-81B0-751206ED03CD}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C0665275-3E0B-4117-81B0-751206ED03CD}.Snapshot|Any CPU.ActiveCfg = Snapshot|Any CPU\n\t\t{C0665275-3E0B-4117-81B0-751206ED03CD}.Snapshot|Any CPU.Build.0 = Snapshot|Any CPU\n\t\t{3067BDFB-C02D-4CAF-96AA-4D8F9F986180}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3067BDFB-C02D-4CAF-96AA-4D8F9F986180}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3067BDFB-C02D-4CAF-96AA-4D8F9F986180}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3067BDFB-C02D-4CAF-96AA-4D8F9F986180}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3067BDFB-C02D-4CAF-96AA-4D8F9F986180}.Snapshot|Any CPU.ActiveCfg = Snapshot|Any CPU\n\t\t{3067BDFB-C02D-4CAF-96AA-4D8F9F986180}.Snapshot|Any CPU.Build.0 = Snapshot|Any CPU\n\t\t{696E929A-6A4A-4C6D-A8B2-C4F25F781940}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{696E929A-6A4A-4C6D-A8B2-C4F25F781940}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{696E929A-6A4A-4C6D-A8B2-C4F25F781940}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{696E929A-6A4A-4C6D-A8B2-C4F25F781940}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{696E929A-6A4A-4C6D-A8B2-C4F25F781940}.Snapshot|Any CPU.ActiveCfg = Snapshot|Any CPU\n\t\t{696E929A-6A4A-4C6D-A8B2-C4F25F781940}.Snapshot|Any CPU.Build.0 = Snapshot|Any CPU\n\t\t{D942D976-6185-4ECD-A83B-60260100D12E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D942D976-6185-4ECD-A83B-60260100D12E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D942D976-6185-4ECD-A83B-60260100D12E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D942D976-6185-4ECD-A83B-60260100D12E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D942D976-6185-4ECD-A83B-60260100D12E}.Snapshot|Any CPU.ActiveCfg = Snapshot|Any CPU\n\t\t{D942D976-6185-4ECD-A83B-60260100D12E}.Snapshot|Any CPU.Build.0 = Snapshot|Any CPU\n\t\t{8C4A87A0-780E-4765-ADD0-146091FE26F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8C4A87A0-780E-4765-ADD0-146091FE26F4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8C4A87A0-780E-4765-ADD0-146091FE26F4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8C4A87A0-780E-4765-ADD0-146091FE26F4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8C4A87A0-780E-4765-ADD0-146091FE26F4}.Snapshot|Any CPU.ActiveCfg = Snapshot|Any CPU\n\t\t{8C4A87A0-780E-4765-ADD0-146091FE26F4}.Snapshot|Any CPU.Build.0 = Snapshot|Any CPU\n\t\t{C61CB94F-31DF-48BE-8053-FCE7DC6ECD7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C61CB94F-31DF-48BE-8053-FCE7DC6ECD7F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C61CB94F-31DF-48BE-8053-FCE7DC6ECD7F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C61CB94F-31DF-48BE-8053-FCE7DC6ECD7F}.Snapshot|Any CPU.ActiveCfg = Snapshot|Any CPU\n\t\t{5CE8E302-3577-41BC-A35F-C88AC625F7A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5CE8E302-3577-41BC-A35F-C88AC625F7A7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5CE8E302-3577-41BC-A35F-C88AC625F7A7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5CE8E302-3577-41BC-A35F-C88AC625F7A7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5CE8E302-3577-41BC-A35F-C88AC625F7A7}.Snapshot|Any CPU.ActiveCfg = Snapshot|Any CPU\n\t\t{5CE8E302-3577-41BC-A35F-C88AC625F7A7}.Snapshot|Any CPU.Build.0 = Snapshot|Any CPU\n\t\t{9366D54A-B516-4A1D-987B-B1BCE31D2A72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9366D54A-B516-4A1D-987B-B1BCE31D2A72}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9366D54A-B516-4A1D-987B-B1BCE31D2A72}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9366D54A-B516-4A1D-987B-B1BCE31D2A72}.Snapshot|Any CPU.ActiveCfg = Snapshot|Any CPU\n\t\t{E6907BAD-CDF4-4B3C-AF2E-E854D2E2D959}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E6907BAD-CDF4-4B3C-AF2E-E854D2E2D959}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E6907BAD-CDF4-4B3C-AF2E-E854D2E2D959}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E6907BAD-CDF4-4B3C-AF2E-E854D2E2D959}.Snapshot|Any CPU.ActiveCfg = Snapshot|Any CPU\n\t\t{87682BB1-CCE5-4CA4-BDE8-1A2ACF0B3CE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{87682BB1-CCE5-4CA4-BDE8-1A2ACF0B3CE0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{87682BB1-CCE5-4CA4-BDE8-1A2ACF0B3CE0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{87682BB1-CCE5-4CA4-BDE8-1A2ACF0B3CE0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{87682BB1-CCE5-4CA4-BDE8-1A2ACF0B3CE0}.Snapshot|Any CPU.ActiveCfg = Snapshot|Any CPU\n\t\t{87682BB1-CCE5-4CA4-BDE8-1A2ACF0B3CE0}.Snapshot|Any CPU.Build.0 = Snapshot|Any CPU\n\t\t{FD639BF6-3414-4FB2-8325-61744D44F028}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FD639BF6-3414-4FB2-8325-61744D44F028}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FD639BF6-3414-4FB2-8325-61744D44F028}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FD639BF6-3414-4FB2-8325-61744D44F028}.Snapshot|Any CPU.ActiveCfg = Snapshot|Any CPU\n\t\t{1917E258-0979-4333-8B20-5D66E8986E1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1917E258-0979-4333-8B20-5D66E8986E1C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1917E258-0979-4333-8B20-5D66E8986E1C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1917E258-0979-4333-8B20-5D66E8986E1C}.Snapshot|Any CPU.ActiveCfg = Snapshot|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{A2E5EFE0-614A-4567-95E5-92A4D94169AC} = {D7B1651B-8895-4254-8EBF-029CBEE3C1E3}\n\t\t{C0665275-3E0B-4117-81B0-751206ED03CD} = {D7B1651B-8895-4254-8EBF-029CBEE3C1E3}\n\t\t{3067BDFB-C02D-4CAF-96AA-4D8F9F986180} = {D7B1651B-8895-4254-8EBF-029CBEE3C1E3}\n\t\t{696E929A-6A4A-4C6D-A8B2-C4F25F781940} = {D7B1651B-8895-4254-8EBF-029CBEE3C1E3}\n\t\t{D942D976-6185-4ECD-A83B-60260100D12E} = {D7B1651B-8895-4254-8EBF-029CBEE3C1E3}\n\t\t{8C4A87A0-780E-4765-ADD0-146091FE26F4} = {D7B1651B-8895-4254-8EBF-029CBEE3C1E3}\n\t\t{C61CB94F-31DF-48BE-8053-FCE7DC6ECD7F} = {B2FD94FF-A895-4519-A97F-6DEA32F15F8E}\n\t\t{5CE8E302-3577-41BC-A35F-C88AC625F7A7} = {9AB16E7E-E520-4444-8E8E-165129CC93B3}\n\t\t{9366D54A-B516-4A1D-987B-B1BCE31D2A72} = {9AB16E7E-E520-4444-8E8E-165129CC93B3}\n\t\t{E6907BAD-CDF4-4B3C-AF2E-E854D2E2D959} = {9AB16E7E-E520-4444-8E8E-165129CC93B3}\n\t\t{87682BB1-CCE5-4CA4-BDE8-1A2ACF0B3CE0} = {9AB16E7E-E520-4444-8E8E-165129CC93B3}\n\t\t{FD639BF6-3414-4FB2-8325-61744D44F028} = {B2FD94FF-A895-4519-A97F-6DEA32F15F8E}\n\t\t{1917E258-0979-4333-8B20-5D66E8986E1C} = {B2FD94FF-A895-4519-A97F-6DEA32F15F8E}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "README.md",
    "content": "[![GPL licensed](https://img.shields.io/badge/license-GPL%20v2-blue.svg)]()\n[![GitHub tag](https://img.shields.io/github/tag/peterhaneve/evemon.svg)]()\n\n# **EVEMon** \n\nA lightweight, easy-to-use standalone Windows application designed to assist you in keeping track of your EVE Online character progression.\n\nFor complete info on *How To Contribute* please visit the [wiki](https://bitbucket.org/EVEMonDevTeam/evemon/wiki) section\n\n**Maintainer of the ESI fork:**\n\n[EVE:Peter Han](https://github.com/peterhaneve/evemon) (GitHub)\n\n**Owner:** \n\n[EVEMonDevTeam](https://github.com/evemondevteam/) (GitHub)\n\n[EVEMonDevTeam](https://bitbucket.org/EVEMonDevTeam) (Bitbucket)\n\n**Website:** [EVEMon](https://evemondevteam.github.io/evemon/)\n\n**Documentation:** [EVEMon Docs](https://evemon.readthedocs.org/)\n\n**Feedback & Ideas:** [On UserVoice](https://evemon.uservoice.com/)\n\n**Admins:**\n\n[JimiC](https://github.com/JimiC) (GitHub)\n\n[Jimi C](https://bitbucket.org/Desmont_McCallock) (Bitbucket)"
  },
  {
    "path": "SharedAssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyDescription(\"EVEMon Offline Character Utility for ESI, repository URL: https://github.com/peterhaneve/evemon\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"EVEMon Development Team\")]\n[assembly: AssemblyProduct(\"EVEMon\")]\n[assembly: AssemblyCopyright(\"Copyright © 2006-2021, EVEMon Development Team\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Friend assembly for unit testing\n[assembly: InternalsVisibleTo(\"Tests.EVEMon.Common\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n[assembly: AssemblyVersion(\"4.0.20.0\")]\n[assembly: AssemblyFileVersion(\"4.0.20.4986\")]\n[assembly: AssemblyInformationalVersion(\"4.0.20\")]\n\n// Neutral Language\n[assembly: NeutralResourcesLanguage(\"en-US\")]\n"
  },
  {
    "path": "SharedAssemblyInfo.template.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyDescription(\"EVEMon Offline Character Utility for ESI, repository URL: https://github.com/peterhaneve/evemon\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"EVEMon Development Team\")]\n[assembly: AssemblyProduct(\"EVEMon\")]\n[assembly: AssemblyCopyright(\"Copyright © 2006-$UTCYEAR$, EVEMon Development Team\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Friend assembly for unit testing\n[assembly: InternalsVisibleTo(\"Tests.EVEMon.Common\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n[assembly: AssemblyVersion(\"4.0.20.0\")]\n[assembly: AssemblyFileVersion(\"4.0.20.$REVNUM$\")]\n[assembly: AssemblyInformationalVersion(\"4.0.20\")]\n\n// Neutral Language\n[assembly: NeutralResourcesLanguage(\"en-US\")]\n"
  },
  {
    "path": "designs/AutoUpdate-Architecture.bmml",
    "content": "<mockup version=\"1.0\" skin=\"sketch\" measuredW=\"957\" measuredH=\"1233\" mockupW=\"698\" mockupH=\"1173\">\n  <controls>\n    <control controlID=\"0\" controlTypeID=\"__group__\" x=\"424\" y=\"238\" w=\"-1\" h=\"-1\" measuredW=\"120\" measuredH=\"156\" zOrder=\"0\" locked=\"false\" isInGroup=\"-1\">\n      <groupChildrenDescriptors>\n        <control controlID=\"5\" controlTypeID=\"__group__\" x=\"0\" y=\"0\" w=\"120\" h=\"156\" measuredW=\"120\" measuredH=\"156\" zOrder=\"0\" locked=\"false\" isInGroup=\"11\">\n          <groupChildrenDescriptors>\n            <control controlID=\"0\" controlTypeID=\"com.balsamiq.mockups::RoundButton\" x=\"0\" y=\"0\" w=\"120\" h=\"29\" measuredW=\"32\" measuredH=\"32\" zOrder=\"2\" locked=\"false\" isInGroup=\"4\">\n              <controlProperties>\n                <text/>\n              </controlProperties>\n            </control>\n            <control controlID=\"1\" controlTypeID=\"com.balsamiq.mockups::RoundButton\" x=\"0\" y=\"127\" w=\"120\" h=\"29\" measuredW=\"32\" measuredH=\"32\" zOrder=\"0\" locked=\"false\" isInGroup=\"4\">\n              <controlProperties>\n                <shape>circle</shape>\n                <text/>\n              </controlProperties>\n            </control>\n            <control controlID=\"2\" controlTypeID=\"com.balsamiq.mockups::Canvas\" x=\"0\" y=\"13\" w=\"120\" h=\"131\" measuredW=\"100\" measuredH=\"70\" zOrder=\"1\" locked=\"false\" isInGroup=\"4\"/>\n            <control controlID=\"3\" controlTypeID=\"com.balsamiq.mockups::Canvas\" x=\"2\" y=\"74\" w=\"114\" h=\"70\" measuredW=\"100\" measuredH=\"70\" zOrder=\"3\" locked=\"false\" isInGroup=\"4\">\n              <controlProperties>\n                <borderStyle>none</borderStyle>\n              </controlProperties>\n            </control>\n          </groupChildrenDescriptors>\n        </control>\n        <control controlID=\"8\" controlTypeID=\"com.balsamiq.mockups::Label\" x=\"37\" y=\"58\" w=\"45\" h=\"25\" measuredW=\"45\" measuredH=\"25\" zOrder=\"1\" locked=\"false\" isInGroup=\"11\">\n          <controlProperties>\n            <text>Google</text>\n          </controlProperties>\n        </control>\n        <control controlID=\"9\" controlTypeID=\"com.balsamiq.mockups::Label\" x=\"25\" y=\"83\" w=\"69\" h=\"25\" measuredW=\"69\" measuredH=\"25\" zOrder=\"2\" locked=\"false\" isInGroup=\"11\">\n          <controlProperties>\n            <text>AppEngine</text>\n          </controlProperties>\n        </control>\n      </groupChildrenDescriptors>\n    </control>\n    <control controlID=\"1\" controlTypeID=\"__group__\" x=\"249\" y=\"238\" w=\"-1\" h=\"-1\" measuredW=\"120\" measuredH=\"156\" zOrder=\"1\" locked=\"false\" isInGroup=\"-1\">\n      <groupChildrenDescriptors>\n        <control controlID=\"4\" controlTypeID=\"__group__\" x=\"0\" y=\"0\" w=\"120\" h=\"156\" measuredW=\"120\" measuredH=\"156\" zOrder=\"0\" locked=\"false\" isInGroup=\"12\">\n          <groupChildrenDescriptors>\n            <control controlID=\"0\" controlTypeID=\"com.balsamiq.mockups::RoundButton\" x=\"0\" y=\"0\" w=\"120\" h=\"29\" measuredW=\"32\" measuredH=\"32\" zOrder=\"2\" locked=\"false\" isInGroup=\"4\">\n              <controlProperties>\n                <text/>\n              </controlProperties>\n            </control>\n            <control controlID=\"1\" controlTypeID=\"com.balsamiq.mockups::RoundButton\" x=\"0\" y=\"127\" w=\"120\" h=\"29\" measuredW=\"32\" measuredH=\"32\" zOrder=\"0\" locked=\"false\" isInGroup=\"4\">\n              <controlProperties>\n                <shape>circle</shape>\n                <text/>\n              </controlProperties>\n            </control>\n            <control controlID=\"2\" controlTypeID=\"com.balsamiq.mockups::Canvas\" x=\"0\" y=\"13\" w=\"120\" h=\"131\" measuredW=\"100\" measuredH=\"70\" zOrder=\"1\" locked=\"false\" isInGroup=\"4\"/>\n            <control controlID=\"3\" controlTypeID=\"com.balsamiq.mockups::Canvas\" x=\"2\" y=\"74\" w=\"114\" h=\"70\" measuredW=\"100\" measuredH=\"70\" zOrder=\"3\" locked=\"false\" isInGroup=\"4\">\n              <controlProperties>\n                <borderStyle>none</borderStyle>\n              </controlProperties>\n            </control>\n          </groupChildrenDescriptors>\n        </control>\n        <control controlID=\"7\" controlTypeID=\"com.balsamiq.mockups::Label\" x=\"23\" y=\"73\" w=\"75\" h=\"25\" measuredW=\"75\" measuredH=\"25\" zOrder=\"1\" locked=\"false\" isInGroup=\"12\">\n          <controlProperties>\n            <text>BattleClinic</text>\n          </controlProperties>\n        </control>\n      </groupChildrenDescriptors>\n    </control>\n    <control controlID=\"2\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"409\" y=\"147\" w=\"77\" h=\"100\" measuredW=\"150\" measuredH=\"100\" zOrder=\"2\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <leftArrow>false</leftArrow>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"3\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"292\" y=\"147\" w=\"77\" h=\"100\" measuredW=\"150\" measuredH=\"100\" zOrder=\"3\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <direction>bottom</direction>\n        <leftArrow>true</leftArrow>\n        <rightArrow>false</rightArrow>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"4\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"314\" y=\"56\" w=\"158\" h=\"123\" measuredW=\"109\" measuredH=\"123\" zOrder=\"4\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Update.xml%20Silos</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"5\" controlTypeID=\"__group__\" x=\"750\" y=\"238\" w=\"-1\" h=\"-1\" measuredW=\"120\" measuredH=\"156\" zOrder=\"5\" locked=\"false\" isInGroup=\"-1\">\n      <groupChildrenDescriptors>\n        <control controlID=\"4\" controlTypeID=\"__group__\" x=\"0\" y=\"0\" w=\"120\" h=\"156\" measuredW=\"120\" measuredH=\"156\" zOrder=\"0\" locked=\"false\" isInGroup=\"12\">\n          <groupChildrenDescriptors>\n            <control controlID=\"0\" controlTypeID=\"com.balsamiq.mockups::RoundButton\" x=\"0\" y=\"0\" w=\"120\" h=\"29\" measuredW=\"32\" measuredH=\"32\" zOrder=\"2\" locked=\"false\" isInGroup=\"4\">\n              <controlProperties>\n                <text/>\n              </controlProperties>\n            </control>\n            <control controlID=\"1\" controlTypeID=\"com.balsamiq.mockups::RoundButton\" x=\"0\" y=\"127\" w=\"120\" h=\"29\" measuredW=\"32\" measuredH=\"32\" zOrder=\"0\" locked=\"false\" isInGroup=\"4\">\n              <controlProperties>\n                <shape>circle</shape>\n                <text/>\n              </controlProperties>\n            </control>\n            <control controlID=\"2\" controlTypeID=\"com.balsamiq.mockups::Canvas\" x=\"0\" y=\"13\" w=\"120\" h=\"131\" measuredW=\"100\" measuredH=\"70\" zOrder=\"1\" locked=\"false\" isInGroup=\"4\"/>\n            <control controlID=\"3\" controlTypeID=\"com.balsamiq.mockups::Canvas\" x=\"2\" y=\"74\" w=\"114\" h=\"70\" measuredW=\"100\" measuredH=\"70\" zOrder=\"3\" locked=\"false\" isInGroup=\"4\">\n              <controlProperties>\n                <borderStyle>none</borderStyle>\n              </controlProperties>\n            </control>\n          </groupChildrenDescriptors>\n        </control>\n        <control controlID=\"7\" controlTypeID=\"com.balsamiq.mockups::Label\" x=\"23\" y=\"73\" w=\"75\" h=\"25\" measuredW=\"75\" measuredH=\"25\" zOrder=\"1\" locked=\"false\" isInGroup=\"12\">\n          <controlProperties>\n            <text>BattleClinic</text>\n          </controlProperties>\n        </control>\n      </groupChildrenDescriptors>\n    </control>\n    <control controlID=\"6\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"793\" y=\"147\" w=\"77\" h=\"100\" measuredW=\"150\" measuredH=\"100\" zOrder=\"6\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <direction>bottom</direction>\n        <leftArrow>true</leftArrow>\n        <rightArrow>false</rightArrow>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"7\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"672\" y=\"50\" w=\"275\" h=\"137\" measuredW=\"109\" measuredH=\"123\" zOrder=\"7\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Content%20Silos%3A%0A%20-%20DataFiles%20%28*.xml.gz%29%0A%20-%20Binaries%20%28Installer%2C%20ZIP%20Archive%29</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"12\" controlTypeID=\"com.balsamiq.mockups::TextArea\" x=\"249\" y=\"409\" w=\"678\" h=\"814\" measuredW=\"200\" measuredH=\"140\" zOrder=\"8\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>%3Cupdate%3E%0A%20%3Cpackage%20name%3D%22EVEMon%22%3E%0A%20%20%3Cdate%3E09/01/10%3C/date%3E%0A%20%20%3Cversion%3E1.3.1.2138%3C/version%3E%0A%20%20%3Cinstaller%3EEVEMon-install-1.3.1.2138.exe%3C/installer%3E%0A%20%20%3Carguments%3E/S%20/AUTORUN%20/SKIPDOTNET%20/D%3D%25EVEMON_EXECUTABLE_PATH%25%3C/arguments%3E%0A%20%20%3Cservers%3E%0A%20%20%20%3Cserver%3Ehttp%3A//evemon.static.battleclinic.com/builds/installers/%3C/server%3E%0A%20%20%20%3Cserver%3Ehttp%3A//evemon.battleclinic.com/builds/installers/%3C/server%3E%0A%20%20%20%3Cserver%3Ehttp%3A//evemon-cdn.appspot.com/builds/installers/%3C/server%3E%0A%20%20%3C/servers%3E%0A%20%20%3Ccontributors%3E%0A%20%20%20%3Ccontributor%3ERichard%20Slater%3C/contributor%3E%0A%20%20%20%3Ccontributor%3EAlice%3C/contributor%3E%0A%20%20%20%3Ccontributor%3EBob%3C/contributor%3E%0A%20%20%3C/contributors%3E%0A%20%20%3Cimportant%3E%0A%3C%21%5BCDATA%5BImportant%20messages%20go%20here%5D%5D%3E%0A%20%20%3C/important%3E%0A%20%20%3Cmessage%3E%0A%3C%21%5BCDATA%5BMessages%20about%20the%20release%20go%20here%5D%5D%3E%0A%20%20%3C/message%3E%0A%20%3C/package%3E%0A%20%3Cdatafiles%3E%0A%20%20%3Cdatafile%3E%0A%20%20%20%20%3Cname%3Eeve-certificates-en-US.xml.gz%3C/name%3E%0A%20%20%20%20%3Cculture%3Een-US%3C/culture%3E%0A%20%20%20%20%3Cversion%3E2249%3C/version%3E%0A%20%20%20%20%3CminimumAssembly%3E1.3.1.2138%3C/minimumAssembly%3E%0A%20%20%20%20%3Cdate%3E25/05/2010%3C/date%3E%0A%20%20%20%20%3Cmd5%3E9ced7a636195498d6df59a3e669e585a%3C/md5%3E%0A%20%20%20%20%3Cservers%3E%0A%20%20%20%20%20%3Cserver%3Ehttp%3A//evemon.static.battleclinic.com/builds/installers/%3C/server%3E%0A%20%20%20%20%20%3Cserver%3Ehttp%3A//evemon.battleclinic.com/builds/installers/%3C/server%3E%0A%20%20%20%20%20%3Cserver%3Ehttp%3A//evemon-cdn.appspot.com/builds/installers/%3C/server%3E%0A%20%20%20%20%3C/servers%3E%0A%20%20%20%20%3Cmessage%3E%3C%21%5BCDATA%5BMessage%20Goes%20Here%5D%5D%3E%3C/message%3E%0A%20%20%3C/datafile%3E%0A%20%3C/datafiles%3E%0A%3C/update%3E</text>\n      </controlProperties>\n    </control>\n  </controls>\n</mockup>"
  },
  {
    "path": "designs/AutoUpdate-UI-EVEMonUpdate.bmml",
    "content": "<mockup version=\"1.0\" skin=\"sketch\" measuredW=\"1151\" measuredH=\"772\" mockupW=\"1046\" mockupH=\"683\">\n  <controls>\n    <control controlID=\"19\" controlTypeID=\"com.balsamiq.mockups::TitleWindow\" x=\"353\" y=\"84\" w=\"450\" h=\"322\" measuredW=\"450\" measuredH=\"400\" zOrder=\"0\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>EVEMon%20Update</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"22\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"361\" y=\"415\" w=\"427\" h=\"347\" measuredW=\"109\" measuredH=\"123\" zOrder=\"1\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>New%20external%20EVEMon%20Update%20written%20in%20Pure%20.NET%202.0%20%28as%20EVEMon%20is%20now%29%20for%20maximum%20compatibility.%0A%20-%20identify%20missing%20dependancies%0A%20-%20download%20updates%0A%20-%20repair%20damaged%20or%20missing%20EVEMon%20data%0A%20-%20clear%20out%20redundant%20files%20in%20%25APPDATA%25%5CEVEMon%0A%20%0AEVEMon.Update.dll%20provides%20shared%20services%2C%20so%20EVEMon%20can%20identify%20if%20an%20data%20or%20program%20update%20is%20available%2C%20then%20close%20and%20launch%20updater.%0A%20%0AEVEMon%20Update%20will%20request%20admin%20privalages%20on%20Windows%207/Vista%20to%20update%20Program%20Files%20and%20Data%20stored%20in%20EVEMon%5CResources</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"34\" controlTypeID=\"com.balsamiq.mockups::Label\" x=\"361\" y=\"138\" w=\"-1\" h=\"-1\" measuredW=\"68\" measuredH=\"25\" zOrder=\"2\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Data%20Files</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"36\" controlTypeID=\"com.balsamiq.mockups::Label\" x=\"361\" y=\"277\" w=\"-1\" h=\"-1\" measuredW=\"55\" measuredH=\"25\" zOrder=\"3\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Binaries</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"38\" controlTypeID=\"com.balsamiq.mockups::Canvas\" x=\"361\" y=\"301\" w=\"433\" h=\"39\" measuredW=\"100\" measuredH=\"70\" zOrder=\"4\" locked=\"false\" isInGroup=\"-1\"/>\n    <control controlID=\"39\" controlTypeID=\"com.balsamiq.mockups::Label\" x=\"367\" y=\"308\" w=\"126\" h=\"25\" measuredW=\"96\" measuredH=\"25\" zOrder=\"5\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>EVEMon%201.3.2</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"40\" controlTypeID=\"com.balsamiq.mockups::ProgressBar\" x=\"531\" y=\"310\" w=\"256\" h=\"20\" measuredW=\"100\" measuredH=\"20\" zOrder=\"6\" locked=\"false\" isInGroup=\"-1\"/>\n    <control controlID=\"47\" controlTypeID=\"com.balsamiq.mockups::Canvas\" x=\"361\" y=\"162\" w=\"433\" h=\"115\" measuredW=\"100\" measuredH=\"70\" zOrder=\"7\" locked=\"false\" isInGroup=\"-1\"/>\n    <control controlID=\"48\" controlTypeID=\"com.balsamiq.mockups::Label\" x=\"367\" y=\"169\" w=\"126\" h=\"25\" measuredW=\"126\" measuredH=\"25\" zOrder=\"8\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Blueprints%20Datafile</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"49\" controlTypeID=\"com.balsamiq.mockups::ProgressBar\" x=\"531\" y=\"171\" w=\"249\" h=\"20\" measuredW=\"100\" measuredH=\"20\" zOrder=\"9\" locked=\"false\" isInGroup=\"-1\"/>\n    <control controlID=\"50\" controlTypeID=\"com.balsamiq.mockups::Label\" x=\"367\" y=\"194\" w=\"139\" h=\"25\" measuredW=\"139\" measuredH=\"25\" zOrder=\"10\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Certificates%20Datafile</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"51\" controlTypeID=\"com.balsamiq.mockups::ProgressBar\" x=\"531\" y=\"196\" w=\"249\" h=\"20\" measuredW=\"100\" measuredH=\"20\" zOrder=\"11\" locked=\"false\" isInGroup=\"-1\"/>\n    <control controlID=\"52\" controlTypeID=\"com.balsamiq.mockups::Label\" x=\"367\" y=\"220\" w=\"97\" h=\"25\" measuredW=\"97\" measuredH=\"25\" zOrder=\"12\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Items%20Datafile</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"53\" controlTypeID=\"com.balsamiq.mockups::ProgressBar\" x=\"531\" y=\"222\" w=\"249\" h=\"20\" measuredW=\"100\" measuredH=\"20\" zOrder=\"13\" locked=\"false\" isInGroup=\"-1\"/>\n    <control controlID=\"54\" controlTypeID=\"com.balsamiq.mockups::Label\" x=\"367\" y=\"245\" w=\"94\" h=\"25\" measuredW=\"94\" measuredH=\"25\" zOrder=\"14\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Ships%20Datafile</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"55\" controlTypeID=\"com.balsamiq.mockups::ProgressBar\" x=\"531\" y=\"247\" w=\"249\" h=\"20\" measuredW=\"100\" measuredH=\"20\" zOrder=\"15\" locked=\"false\" isInGroup=\"-1\"/>\n    <control controlID=\"59\" controlTypeID=\"com.balsamiq.mockups::MenuBar\" x=\"353\" y=\"105\" w=\"450\" h=\"29\" measuredW=\"142\" measuredH=\"29\" zOrder=\"16\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Update%2C%20Tools</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"62\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"930\" y=\"79\" w=\"211\" h=\"268\" measuredW=\"109\" measuredH=\"123\" zOrder=\"19\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Multi-threaded%20download%20from%20multiple%20sources%3A%0A%20-%20Static.BattleClinic%0A%20-%20EVE%20Files%0A%20-%20Zofu%0A%20-%20Google%20AppEngine*%0A%20-%20AmazonS3*%0A%20-%20Windows%20Azure*%0A%20%0A*%20%7E%240.15/GB</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"63\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"780\" y=\"232\" w=\"164\" h=\"28\" measuredW=\"150\" measuredH=\"100\" zOrder=\"17\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <direction>top</direction>\n        <leftArrow>true</leftArrow>\n        <rightArrow>false</rightArrow>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"64\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"780\" y=\"205\" w=\"164\" h=\"28\" measuredW=\"150\" measuredH=\"100\" zOrder=\"18\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <direction>top</direction>\n        <leftArrow>true</leftArrow>\n        <rightArrow>false</rightArrow>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"65\" controlTypeID=\"com.balsamiq.mockups::Button\" x=\"672\" y=\"347\" w=\"116\" h=\"29\" measuredW=\"116\" measuredH=\"28\" zOrder=\"20\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Apply%20Updates</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"66\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"780\" y=\"363\" w=\"164\" h=\"28\" measuredW=\"150\" measuredH=\"100\" zOrder=\"21\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <direction>top</direction>\n        <leftArrow>true</leftArrow>\n        <rightArrow>false</rightArrow>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"67\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"930\" y=\"360\" w=\"211\" h=\"103\" measuredW=\"109\" measuredH=\"123\" zOrder=\"22\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Downloads%20not%20applied%20untill%20MD5s%20checked</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"71\" controlTypeID=\"com.balsamiq.mockups::Menu\" x=\"354\" y=\"126\" w=\"236\" h=\"-1\" measuredW=\"150\" measuredH=\"85\" zOrder=\"23\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Check%20for%20Updates%0Ax%20Automatically%20Apply%0Ax%20Start%20EVEMon%20when%20Applied</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"72\" controlTypeID=\"com.balsamiq.mockups::Menu\" x=\"437\" y=\"126\" w=\"160\" h=\"-1\" measuredW=\"150\" measuredH=\"35\" zOrder=\"24\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Cleanup%20AppData</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"73\" controlTypeID=\"com.balsamiq.mockups::Button\" x=\"548\" y=\"348\" w=\"116\" h=\"29\" measuredW=\"101\" measuredH=\"28\" zOrder=\"25\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>View%20Details</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"74\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"243\" y=\"360\" w=\"312\" h=\"28\" measuredW=\"150\" measuredH=\"100\" zOrder=\"26\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <direction>bottom</direction>\n        <leftArrow>false</leftArrow>\n        <rightArrow>true</rightArrow>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"75\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"95\" y=\"340\" w=\"211\" h=\"123\" measuredW=\"109\" measuredH=\"123\" zOrder=\"27\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Displays%20a%20dialog%20detailing%20the%20messages%20from%20Update.xml</text>\n      </controlProperties>\n    </control>\n  </controls>\n</mockup>"
  },
  {
    "path": "designs/AutoUpdate-UI-UpdateDetails.bmml",
    "content": "<mockup version=\"1.0\" skin=\"sketch\" measuredW=\"910\" measuredH=\"659\" mockupW=\"628\" mockupH=\"583\">\n  <controls>\n    <control controlID=\"0\" controlTypeID=\"com.balsamiq.mockups::TitleWindow\" x=\"272\" y=\"66\" w=\"628\" h=\"583\" measuredW=\"450\" measuredH=\"400\" zOrder=\"0\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Update%20Details</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"2\" controlTypeID=\"com.balsamiq.mockups::TextArea\" x=\"287\" y=\"104\" w=\"598\" h=\"506\" measuredW=\"200\" measuredH=\"140\" zOrder=\"1\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>EVEMon%201.3.2%3A%0A%20%0A%21%21%21%20Important%20Notice%20%21%21%21%0A%20%0AContributors%3A%0A%20*%20Alice%0A%20*%20Bob%0A%20*%20Charlie%0A%20%0AMessages%20about%20EVEMon%201.3.2%0A%20%0ABlueprints%20Datafile%20%2825%20May%202010%20-%20Version%202249%29%0AMessage%0A%20%0ACertificates%20Datafile%20%2825%20May%202010%20-%20Version%202249%29%0AMessage</text>\n        <verticalScrollbar>true</verticalScrollbar>\n      </controlProperties>\n    </control>\n    <control controlID=\"3\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"402\" y=\"120\" w=\"150\" h=\"26\" measuredW=\"150\" measuredH=\"100\" zOrder=\"2\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"4\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"526\" y=\"98\" w=\"213\" h=\"70\" measuredW=\"109\" measuredH=\"123\" zOrder=\"3\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Bold/Larger%20Title</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"5\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"417\" y=\"161\" w=\"150\" h=\"49\" measuredW=\"150\" measuredH=\"100\" zOrder=\"4\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"6\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"526\" y=\"161\" w=\"213\" h=\"70\" measuredW=\"109\" measuredH=\"123\" zOrder=\"5\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Red%20Important%20Notice</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"7\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"466\" y=\"447\" w=\"213\" h=\"105\" measuredW=\"109\" measuredH=\"123\" zOrder=\"6\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Text%20is%20in%20a%20RTF%20box%20for%20easy%20formatting.</text>\n      </controlProperties>\n    </control>\n  </controls>\n</mockup>"
  },
  {
    "path": "designs/PosMonitor.bmml",
    "content": "<mockup version=\"1.0\" skin=\"sketch\" measuredW=\"1304\" measuredH=\"797\" mockupW=\"1161\" mockupH=\"756\">\n  <controls>\n    <control controlID=\"2\" controlTypeID=\"com.balsamiq.mockups::TitleWindow\" x=\"440\" y=\"31\" w=\"533\" h=\"756\" measuredW=\"450\" measuredH=\"400\" zOrder=\"0\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <bottomheight>26</bottomheight>\n        <close>true</close>\n        <dragger>true</dragger>\n        <maximizeRestore>true</maximizeRestore>\n        <minimize>true</minimize>\n        <text>EVEMon</text>\n        <topheight>27</topheight>\n      </controlProperties>\n    </control>\n    <control controlID=\"4\" controlTypeID=\"com.balsamiq.mockups::TabBar\" x=\"446\" y=\"60\" w=\"520\" h=\"698\" measuredW=\"310\" measuredH=\"100\" zOrder=\"1\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Scetrov%2C%20Vortecs%2C%20Haust%20Vindur</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"6\" controlTypeID=\"com.balsamiq.mockups::Label\" x=\"618\" y=\"91\" w=\"-1\" h=\"-1\" measuredW=\"63\" measuredH=\"29\" zOrder=\"2\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <size>16</size>\n        <text>Scetrov</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"8\" controlTypeID=\"com.balsamiq.mockups::Paragraph\" x=\"618\" y=\"122\" w=\"200\" h=\"52\" measuredW=\"200\" measuredH=\"140\" zOrder=\"3\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <bold>false</bold>\n        <size>10</size>\n        <text>Male%20Gallente%20Gallente%0ACorporation%3A%20OcUK%0ABalance%3A%201%2C203%2C482%2C742%20ISK%0A%20</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"10\" controlTypeID=\"com.balsamiq.mockups::Paragraph\" x=\"618\" y=\"174\" w=\"139\" h=\"82\" measuredW=\"200\" measuredH=\"140\" zOrder=\"4\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <bold>false</bold>\n        <size>10</size>\n        <text>Inteligence%3A%2024.20%0APerception%2019.80%0ACharisma%3A%2019.80%0AWilpower%3A%2019.80%0AMemory%3A%2030.80</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"11\" controlTypeID=\"com.balsamiq.mockups::Paragraph\" x=\"818\" y=\"173\" w=\"139\" h=\"83\" measuredW=\"200\" measuredH=\"140\" zOrder=\"5\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <align>right</align>\n        <bold>false</bold>\n        <size>10</size>\n        <text>Known%20Skills%3A%20221%0ASkills%20at%20Level%20V%3A%20112%0ATotal%20SP%3A%2092%2C704%2C844%0AClone%20Limit%3A%20120%2C000%2C000%0AClone%20Grade%20Tau</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"12\" controlTypeID=\"com.balsamiq.mockups::RoundButton\" x=\"912\" y=\"103\" w=\"-1\" h=\"-1\" measuredW=\"32\" measuredH=\"32\" zOrder=\"6\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <color>0</color>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"13\" controlTypeID=\"com.balsamiq.mockups::Label\" x=\"903\" y=\"138\" w=\"-1\" h=\"-1\" measuredW=\"49\" measuredH=\"20\" zOrder=\"7\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <size>10</size>\n        <text>00%3A59%3A59</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"18\" controlTypeID=\"com.balsamiq.mockups::Button\" x=\"453\" y=\"256\" w=\"-1\" h=\"-1\" measuredW=\"58\" measuredH=\"28\" zOrder=\"8\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Skills</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"19\" controlTypeID=\"com.balsamiq.mockups::Button\" x=\"511\" y=\"255\" w=\"-1\" h=\"-1\" measuredW=\"65\" measuredH=\"28\" zOrder=\"9\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Queue</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"20\" controlTypeID=\"com.balsamiq.mockups::Button\" x=\"579\" y=\"256\" w=\"-1\" h=\"-1\" measuredW=\"121\" measuredH=\"28\" zOrder=\"10\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Market%20Orders</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"22\" controlTypeID=\"com.balsamiq.mockups::Button\" x=\"698\" y=\"256\" w=\"-1\" h=\"-1\" measuredW=\"57\" measuredH=\"28\" zOrder=\"11\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <state>selected</state>\n        <text>POSs</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"24\" controlTypeID=\"__group__\" x=\"461\" y=\"667\" w=\"-1\" h=\"-1\" measuredW=\"490\" measuredH=\"76\" zOrder=\"12\" locked=\"false\" isInGroup=\"-1\">\n      <groupChildrenDescriptors>\n        <control controlID=\"14\" controlTypeID=\"com.balsamiq.mockups::ProgressBar\" x=\"0\" y=\"0\" w=\"490\" h=\"20\" measuredW=\"100\" measuredH=\"20\" zOrder=\"0\" locked=\"false\" isInGroup=\"24\"/>\n        <control controlID=\"15\" controlTypeID=\"com.balsamiq.mockups::Paragraph\" x=\"0\" y=\"20\" w=\"111\" h=\"56\" measuredW=\"200\" measuredH=\"140\" zOrder=\"1\" locked=\"false\" isInGroup=\"24\">\n          <controlProperties>\n            <bold>true</bold>\n            <size>10</size>\n            <text>Currently%20Training%3A%0A237%20SP/Hour</text>\n          </controlProperties>\n        </control>\n        <control controlID=\"16\" controlTypeID=\"com.balsamiq.mockups::Paragraph\" x=\"118\" y=\"20\" w=\"239\" h=\"56\" measuredW=\"200\" measuredH=\"140\" zOrder=\"2\" locked=\"false\" isInGroup=\"24\">\n          <controlProperties>\n            <bold>false</bold>\n            <size>10</size>\n            <text>Projectile%20Weapon%20Rigging%20IV%0A2%20hours%2C%2013%20minutes%2C%2055%20seconds%0ASat%2022/04/2010%2018%3A42%3A15</text>\n          </controlProperties>\n        </control>\n      </groupChildrenDescriptors>\n    </control>\n    <control controlID=\"26\" controlTypeID=\"com.balsamiq.mockups::Accordion\" x=\"453\" y=\"289\" w=\"504\" h=\"370\" measuredW=\"241\" measuredH=\"226\" zOrder=\"13\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Wormhole%20POS%20%28%2322345%29%20/%20J100150%20/%20Online%0APOS%20%2388472%20/%20Elonya%20/%20Online%0APOS%20%2344538%20/%20Piak%20/%20Offline%0APOS%20%2344476%20/%20Piekura%20/%20Offline</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"27\" controlTypeID=\"com.balsamiq.mockups::DataGrid\" x=\"457\" y=\"322\" w=\"494\" h=\"247\" measuredW=\"420\" measuredH=\"226\" zOrder=\"14\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <borderStyle>none</borderStyle>\n        <hasHeader>true</hasHeader>\n        <rowHeight>16</rowHeight>\n        <selectedIndex>-1</selectedIndex>\n        <text>Item%20Required%2C%20Quantity%2C%20Cycles%20Remaining%2C%20Time%20Untill%20%0ACharters%2C%2050%2C%2010%2C%2010h%0ACoolant%2C%201344%2C%20168%2C%207d%0AEnriched%20Uranium%2C%20672%2C%20168%2C%207d%0AHelium%20Isotopes%2C%2075600%2C%20168%2C%207d%0AMechanical%20Parts%2C%20840%2C%20168%2C%207d%0AOxygen%2C%204200%2C%20168%2C%207d%0ARobotics%2C%20168%2C%20168%2C%207d%0AHeavy%20Water%2C%201854%2C%20-%2C%20-%0ALiquid%20Ozone%2C%201245%2C%20-%2C%20-</text>\n        <value>0</value>\n        <verticalScrollbar>true</verticalScrollbar>\n      </controlProperties>\n    </control>\n    <control controlID=\"29\" controlTypeID=\"com.balsamiq.mockups::Icon\" x=\"926\" y=\"294\" w=\"-1\" h=\"-1\" measuredW=\"24\" measuredH=\"24\" zOrder=\"15\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <borderStyle>none</borderStyle>\n        <color>0</color>\n        <icon>AlertIcon%7Csmall</icon>\n      </controlProperties>\n    </control>\n    <control controlID=\"30\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"951\" y=\"150\" w=\"150\" h=\"144\" measuredW=\"150\" measuredH=\"100\" zOrder=\"16\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <backgroundAlpha>1</backgroundAlpha>\n        <curvature>1</curvature>\n        <direction>bottom</direction>\n        <rightArrow>false</rightArrow>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"31\" controlTypeID=\"com.balsamiq.mockups::Icon\" x=\"926\" y=\"573\" w=\"-1\" h=\"-1\" measuredW=\"24\" measuredH=\"24\" zOrder=\"17\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <borderStyle>none</borderStyle>\n        <color>0</color>\n        <icon>AlertIcon%7Csmall</icon>\n      </controlProperties>\n    </control>\n    <control controlID=\"32\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"1068\" y=\"103\" w=\"226\" h=\"162\" measuredW=\"109\" measuredH=\"123\" zOrder=\"18\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Warning%20icon%20denotes%20a%20POS%20that%20requires%20attention.%20If%20we%20create%20a%20generic%20accordion%20it%20probably%20best%20to%20allow%20%22Owner%20Draw%22%20for%20the%20title%20section.</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"33\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"888\" y=\"440\" w=\"204\" h=\"50\" measuredW=\"150\" measuredH=\"100\" zOrder=\"19\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <backgroundAlpha>1</backgroundAlpha>\n        <curvature>1</curvature>\n        <direction>top</direction>\n        <rightArrow>false</rightArrow>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"34\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"1068\" y=\"459\" w=\"226\" h=\"138\" measuredW=\"109\" measuredH=\"123\" zOrder=\"20\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Individual%20list%20items%20can%20be%20colourd%20to%20show%20thresholds%20%28Red%20%3D%20%3C1d%2C%20Yello%20%3D%201-3%20days%2C%20Green%20%3D%204-7%20days%29%20</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"35\" controlTypeID=\"com.balsamiq.mockups::VCurly\" x=\"172\" y=\"295\" w=\"249\" h=\"358\" measuredW=\"180\" measuredH=\"140\" zOrder=\"21\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <direction>right</direction>\n        <text>Accordion%20allows%20the%20display%20of%20essential%20information%20about%20the%20POS%20What%2C%20Where%20and%20Status%20along%20with%20a%20notification%20icon.%20Expanding%20one%20will%20collapse%20all%20others%20ensuring%20that%20space%20is%20maximized.</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"36\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"879\" y=\"536\" w=\"204\" h=\"151\" measuredW=\"150\" measuredH=\"100\" zOrder=\"22\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <backgroundAlpha>1</backgroundAlpha>\n        <curvature>1</curvature>\n        <direction>top</direction>\n        <rightArrow>false</rightArrow>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"37\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"1068\" y=\"605\" w=\"226\" h=\"138\" measuredW=\"109\" measuredH=\"123\" zOrder=\"23\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Variable%20fuels%20would%20show%20a%20hyphen%20when%20PG/CPU%20not%20set.</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"38\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"888\" y=\"313\" w=\"204\" h=\"85\" measuredW=\"150\" measuredH=\"100\" zOrder=\"24\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <backgroundAlpha>1</backgroundAlpha>\n        <curvature>-1</curvature>\n        <direction>top</direction>\n        <rightArrow>false</rightArrow>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"39\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"1068\" y=\"284\" w=\"226\" h=\"167\" measuredW=\"109\" measuredH=\"123\" zOrder=\"25\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Right%20click%20menu%20on%20title%20bar%20allows%20user%20to%20access%20a%20configuration%20dialog%20box%20to%20set%20a%20Custom%20Name%2C%20PG%20and%20CPU%20usage.</text>\n      </controlProperties>\n    </control>\n    <control controlID=\"44\" controlTypeID=\"__group__\" x=\"461\" y=\"103\" w=\"-1\" h=\"-1\" measuredW=\"143\" measuredH=\"143\" zOrder=\"26\" locked=\"false\" isInGroup=\"-1\">\n      <groupChildrenDescriptors>\n        <control controlID=\"40\" controlTypeID=\"com.balsamiq.mockups::RoundButton\" x=\"42\" y=\"15\" w=\"58\" h=\"84\" measuredW=\"32\" measuredH=\"32\" zOrder=\"3\" locked=\"false\" isInGroup=\"44\">\n          <controlProperties>\n            <text/>\n          </controlProperties>\n        </control>\n        <control controlID=\"41\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"89\" y=\"84\" w=\"52\" h=\"58\" measuredW=\"150\" measuredH=\"100\" zOrder=\"1\" locked=\"false\" isInGroup=\"44\">\n          <controlProperties>\n            <leftArrow>false</leftArrow>\n            <rightArrow>false</rightArrow>\n          </controlProperties>\n        </control>\n        <control controlID=\"42\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"0\" y=\"82\" w=\"59\" h=\"58\" measuredW=\"150\" measuredH=\"100\" zOrder=\"2\" locked=\"false\" isInGroup=\"44\">\n          <controlProperties>\n            <direction>bottom</direction>\n            <leftArrow>false</leftArrow>\n            <rightArrow>false</rightArrow>\n          </controlProperties>\n        </control>\n        <control controlID=\"43\" controlTypeID=\"com.balsamiq.mockups::Canvas\" x=\"0\" y=\"0\" w=\"143\" h=\"143\" measuredW=\"100\" measuredH=\"70\" zOrder=\"0\" locked=\"false\" isInGroup=\"44\"/>\n      </groupChildrenDescriptors>\n    </control>\n    <control controlID=\"46\" controlTypeID=\"com.balsamiq.mockups::Arrow\" x=\"257\" y=\"209\" w=\"204\" h=\"85\" measuredW=\"150\" measuredH=\"100\" zOrder=\"27\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <backgroundAlpha>1</backgroundAlpha>\n        <curvature>1</curvature>\n        <direction>top</direction>\n        <leftArrow>false</leftArrow>\n        <rightArrow>true</rightArrow>\n        <text/>\n      </controlProperties>\n    </control>\n    <control controlID=\"47\" controlTypeID=\"com.balsamiq.mockups::StickyNote\" x=\"133\" y=\"120\" w=\"226\" h=\"167\" measuredW=\"109\" measuredH=\"123\" zOrder=\"28\" locked=\"false\" isInGroup=\"-1\">\n      <controlProperties>\n        <text>Single%20click%20a%20heading%20and%20it%20will%20expand%20one%20heading%20and%20collapse%20all%20others%2C%20clicking%20an%20expanded%20heading%20will%20not%20have%20any%20effect.</text>\n      </controlProperties>\n    </control>\n  </controls>\n</mockup>"
  },
  {
    "path": "src/EVEMon/APIErrorHandling/APIErrorWindow.Designer.cs",
    "content": "﻿namespace EVEMon.ApiErrorHandling\n{\n    partial class ApiErrorWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ApiErrorWindow));\n            this.ErrorLabel = new System.Windows.Forms.Label();\n            this.IconPictureBox = new System.Windows.Forms.PictureBox();\n            this.MainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.CopyToClipboardLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.DetailsPanel = new System.Windows.Forms.Panel();\n            this.DetailsTextBox = new System.Windows.Forms.TextBox();\n            this.TroubleshooterPanel = new System.Windows.Forms.Panel();\n            ((System.ComponentModel.ISupportInitialize)(this.IconPictureBox)).BeginInit();\n            this.MainTableLayoutPanel.SuspendLayout();\n            this.DetailsPanel.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // ErrorLabel\n            // \n            this.ErrorLabel.AutoSize = true;\n            this.ErrorLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ErrorLabel.Location = new System.Drawing.Point(53, 10);\n            this.ErrorLabel.Name = \"ErrorLabel\";\n            this.ErrorLabel.Size = new System.Drawing.Size(521, 40);\n            this.ErrorLabel.TabIndex = 1;\n            this.ErrorLabel.Text = \"Error details.\";\n            // \n            // IconPictureBox\n            // \n            this.IconPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.IconPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"IconPictureBox.Image\")));\n            this.IconPictureBox.Location = new System.Drawing.Point(13, 13);\n            this.IconPictureBox.Name = \"IconPictureBox\";\n            this.IconPictureBox.Size = new System.Drawing.Size(34, 34);\n            this.IconPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\n            this.IconPictureBox.TabIndex = 0;\n            this.IconPictureBox.TabStop = false;\n            // \n            // MainTableLayoutPanel\n            // \n            this.MainTableLayoutPanel.AutoSize = true;\n            this.MainTableLayoutPanel.ColumnCount = 2;\n            this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.MainTableLayoutPanel.Controls.Add(this.ErrorLabel, 1, 0);\n            this.MainTableLayoutPanel.Controls.Add(this.IconPictureBox, 0, 0);\n            this.MainTableLayoutPanel.Controls.Add(this.CopyToClipboardLinkLabel, 1, 1);\n            this.MainTableLayoutPanel.Controls.Add(this.DetailsPanel, 0, 2);\n            this.MainTableLayoutPanel.Controls.Add(this.TroubleshooterPanel, 0, 3);\n            this.MainTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.MainTableLayoutPanel.Location = new System.Drawing.Point(0, 0);\n            this.MainTableLayoutPanel.Name = \"MainTableLayoutPanel\";\n            this.MainTableLayoutPanel.Padding = new System.Windows.Forms.Padding(10, 10, 10, 0);\n            this.MainTableLayoutPanel.RowCount = 4;\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.Size = new System.Drawing.Size(587, 466);\n            this.MainTableLayoutPanel.TabIndex = 3;\n            // \n            // CopyToClipboardLinkLabel\n            // \n            this.CopyToClipboardLinkLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.CopyToClipboardLinkLabel.AutoSize = true;\n            this.CopyToClipboardLinkLabel.Location = new System.Drawing.Point(487, 50);\n            this.CopyToClipboardLinkLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.CopyToClipboardLinkLabel.Name = \"CopyToClipboardLinkLabel\";\n            this.CopyToClipboardLinkLabel.Padding = new System.Windows.Forms.Padding(0, 5, 0, 5);\n            this.CopyToClipboardLinkLabel.Size = new System.Drawing.Size(90, 23);\n            this.CopyToClipboardLinkLabel.TabIndex = 4;\n            this.CopyToClipboardLinkLabel.TabStop = true;\n            this.CopyToClipboardLinkLabel.Text = \"Copy to Clipboard\";\n            this.CopyToClipboardLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.CopyToClipboardLinkLabel_LinkClicked);\n            // \n            // DetailsPanel\n            // \n            this.DetailsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.DetailsPanel.BackColor = System.Drawing.SystemColors.Window;\n            this.DetailsPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.MainTableLayoutPanel.SetColumnSpan(this.DetailsPanel, 2);\n            this.DetailsPanel.Controls.Add(this.DetailsTextBox);\n            this.DetailsPanel.Location = new System.Drawing.Point(10, 73);\n            this.DetailsPanel.Margin = new System.Windows.Forms.Padding(0, 0, 0, 10);\n            this.DetailsPanel.Name = \"DetailsPanel\";\n            this.DetailsPanel.Padding = new System.Windows.Forms.Padding(10);\n            this.DetailsPanel.Size = new System.Drawing.Size(567, 371);\n            this.DetailsPanel.TabIndex = 2;\n            // \n            // DetailsTextBox\n            // \n            this.DetailsTextBox.BackColor = System.Drawing.SystemColors.Window;\n            this.DetailsTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.DetailsTextBox.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.DetailsTextBox.Location = new System.Drawing.Point(10, 10);\n            this.DetailsTextBox.Multiline = true;\n            this.DetailsTextBox.Name = \"DetailsTextBox\";\n            this.DetailsTextBox.ReadOnly = true;\n            this.DetailsTextBox.Size = new System.Drawing.Size(545, 349);\n            this.DetailsTextBox.TabIndex = 3;\n            this.DetailsTextBox.Text = \"No error details are available.\";\n            // \n            // TroubleshooterPanel\n            // \n            this.TroubleshooterPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.TroubleshooterPanel.AutoSize = true;\n            this.TroubleshooterPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.TroubleshooterPanel.BackColor = System.Drawing.SystemColors.InactiveCaption;\n            this.TroubleshooterPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.MainTableLayoutPanel.SetColumnSpan(this.TroubleshooterPanel, 2);\n            this.TroubleshooterPanel.ForeColor = System.Drawing.SystemColors.ControlText;\n            this.TroubleshooterPanel.Location = new System.Drawing.Point(10, 454);\n            this.TroubleshooterPanel.Margin = new System.Windows.Forms.Padding(0, 0, 0, 10);\n            this.TroubleshooterPanel.Name = \"TroubleshooterPanel\";\n            this.TroubleshooterPanel.Size = new System.Drawing.Size(567, 2);\n            this.TroubleshooterPanel.TabIndex = 2;\n            this.TroubleshooterPanel.Visible = false;\n            // \n            // ApiErrorWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.SystemColors.Window;\n            this.ClientSize = new System.Drawing.Size(587, 466);\n            this.Controls.Add(this.MainTableLayoutPanel);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.MinimumSize = new System.Drawing.Size(500, 500);\n            this.Name = \"ApiErrorWindow\";\n            this.Text = \"API Error Details\";\n            ((System.ComponentModel.ISupportInitialize)(this.IconPictureBox)).EndInit();\n            this.MainTableLayoutPanel.ResumeLayout(false);\n            this.MainTableLayoutPanel.PerformLayout();\n            this.DetailsPanel.ResumeLayout(false);\n            this.DetailsPanel.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label ErrorLabel;\n        private System.Windows.Forms.PictureBox IconPictureBox;\n        private System.Windows.Forms.TableLayoutPanel MainTableLayoutPanel;\n        private System.Windows.Forms.TextBox DetailsTextBox;\n        private System.Windows.Forms.Panel TroubleshooterPanel;\n        private System.Windows.Forms.LinkLabel CopyToClipboardLinkLabel;\n        private System.Windows.Forms.Panel DetailsPanel;\n    }\n}"
  },
  {
    "path": "src/EVEMon/APIErrorHandling/APIErrorWindow.cs",
    "content": "﻿using EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Notifications;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Drawing;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Windows.Forms;\n\nnamespace EVEMon.ApiErrorHandling\n{\n    /// <summary>\n    /// Displays an error window if appropriate a troubleshooter is displayed to help the user resolve the issue.\n    /// </summary>\n    public partial class ApiErrorWindow : EVEMonForm\n    {\n        private readonly HttpTimeoutTroubleshooter m_httpTimeoutTroubleshooter = new HttpTimeoutTroubleshooter();\n\n        private APIErrorNotificationEventArgs m_notification;\n        private ApiErrorTroubleshooter m_troubleshooter;\n        private bool m_troubleshooterUsed;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        public ApiErrorWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Gets or sets the notification for this error.\n        /// </summary>\n        internal APIErrorNotificationEventArgs Notification\n        {\n            get { return m_notification; }\n            set\n            {\n                if (value != null)\n                {\n                    var exception = value.Result?.Exception;\n                    string errorText = GetErrorLabelText(value);\n                    m_notification = value;\n                    ErrorLabel.Text = errorText;\n                    // Several clients are getting TrustFailure for badly configured SSL\n                    // certificates, provide better debugging info\n                    if (errorText.ToLower().Contains(\"trustfailure\"))\n                        DetailsTextBox.Text = Properties.Resources.ErrorTrustFailure;\n                    else if (exception != null)\n                        DetailsTextBox.Text = exception.ToString();\n                    DisplayTroubleshooter(exception);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Displays the troubleshooter.\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        private void DisplayTroubleshooter(Exception exception)\n        {\n            TroubleshooterPanel.Visible = false;\n\n            m_troubleshooter = GetTroubleshooter(exception);\n\n            if (m_troubleshooter == null)\n                return;\n\n            TroubleshooterPanel.Visible = true;\n            TroubleshooterPanel.Controls.Add(m_troubleshooter);\n\n            m_troubleshooter.ErrorResolved += troubleshooter_ErrorResolved;\n            m_troubleshooter.Dock = DockStyle.Fill;\n        }\n\n        /// <summary>\n        /// Gets the troubleshooter.\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        /// <returns>A troubleshooter for the error message.</returns>\n        private ApiErrorTroubleshooter GetTroubleshooter(Exception exception)\n        {\n            var httpException = exception as HttpWebClientServiceException;\n            return httpException?.Status == HttpWebClientServiceExceptionStatus.Timeout ?\n                m_httpTimeoutTroubleshooter : null;\n        }\n\n        /// <summary>\n        /// Handles the ErrorResolved event when a http timeout is displayed of the troubleshooter control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"ApiErrorTroubleshooterEventArgs\"/> instance containing the event data.</param>\n        private void troubleshooter_ErrorResolved(object sender, ApiErrorTroubleshooterEventArgs e)\n        {\n            m_troubleshooterUsed = true;\n\n            if (e == null)\n                return;\n\n            if (!e.Resolved)\n            {\n                TroubleshooterPanel.BackColor = Color.DarkSalmon;\n                return;\n            }\n\n            EveMonClient.Notifications.Invalidate(new NotificationInvalidationEventArgs(\n                m_notification));\n            PerformAction(e.Action);\n        }\n\n        /// <summary>\n        /// Performs the action.\n        /// </summary>\n        /// <param name=\"action\">The action.</param>\n        private void PerformAction(ResolutionAction action)\n        {\n            switch (action)\n            {\n                case ResolutionAction.Close:\n                    Close();\n                    break;\n                case ResolutionAction.HideTroubleshooter:\n                    TroubleshooterPanel.Hide();\n                    break;\n                case ResolutionAction.None:\n                    TroubleshooterPanel.BackColor = Color.PaleGreen;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Gets the error label text.\n        /// </summary>\n        /// <param name=\"value\">The value.</param>\n        /// <returns>String representing the error.</returns>\n        private static string GetErrorLabelText(APIErrorNotificationEventArgs value)\n        {\n            if (value == null)\n                return \"No error selected.\";\n            return value.ToString() + Environment.NewLine + (value.Result == null ?\n                \"No details were provided.\" : GetErrorLabelTextDetail(value.Result));\n        }\n\n        /// <summary>\n        /// Gets the error label text detail.\n        /// </summary>\n        /// <param name=\"result\">The value.</param>\n        private static string GetErrorLabelTextDetail(IAPIResult result)\n        {\n            switch (result.ErrorType)\n            {\n                case APIErrorType.None:\n                    return \"No error specified\";\n                case APIErrorType.CCP:\n                    return $\"CCP Error: {result.ErrorMessage}\";\n                case APIErrorType.Http:\n                    return $\"HTTP error: {result.ErrorMessage}\";\n                case APIErrorType.Xml:\n                    return $\"XML error: {result.ErrorMessage}\";\n                case APIErrorType.Json:\n                    return $\"XSLT error: {result.ErrorMessage}\";\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n        \n        /// <summary>\n        /// On closing, disposes of the troubleshooter.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosed(FormClosedEventArgs e)\n        {\n            base.OnFormClosed(e);\n\n            if (m_troubleshooter != null)\n            {\n                m_troubleshooter.Dispose();\n                m_troubleshooter = null;\n            }\n        }\n\n        /// <summary>\n        /// Handles the LinkClicked event of the CopyToClipboardLinkLabel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.LinkLabelLinkClickedEventArgs\"/> instance containing the event data.</param>\n        private void CopyToClipboardLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            StringBuilder builder = new StringBuilder();\n\n            builder.Append(\"EVEMon \");\n            builder.AppendLine(EveMonClient.FileVersionInfo.FileVersion);\n            builder.AppendLine().AppendLine(\"API Error:\");\n            builder.AppendLine(GetErrorLabelText(Notification));\n\n            if (m_troubleshooter != null)\n            {\n                builder.AppendLine();\n                builder.Append(\"A troubleshooter was displayed \" + (m_troubleshooterUsed ?\n                    \"and used.\" : \"but not used.\"));\n            }\n            try\n            {\n                Clipboard.Clear();\n                Clipboard.SetText(builder.ToString(), TextDataFormat.Text);\n            }\n            catch (ExternalException ex)\n            {\n                // Occurs when another process is using the clipboard\n                ExceptionHandler.LogException(ex, true);\n                MessageBox.Show(Properties.Resources.ErrorClipboardFailure, \"Error copying\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/APIErrorHandling/APIErrorWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"IconPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAA\n        vgAAAL4BsOPnlwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAfySURBVFhHnVcJ\n        UFXXGf7fY9/hsT42RRYJGpCaEGuEiQZLZyoSY6tGJ622ksQk0xii0TSSqZnaTBNt1NFXbdRKQJEdVCQs\n        bmCwFHwsrSLIIvseUFkE1K//uU8I6EWdnJmP4f1n+b5/O/deAvCTkEsUlENUlk4UnU2kkFvzLJA1Pg1M\n        bpKnVLY1vR6G753ssY/oD3LrngWyxqeBBUSV+nljOCkOrZGrkUpUpSIylVv7NMganwQmN2Xv27s+fBuo\n        qsLQEQ3ynZ2wi2iD3PqnQdb4JLCATaWzfTCSGg+UlQGXLqH5zeVIILph8xOiIGucCkxulqOn7OzexM5W\n        VACXLwNnz2Lwqx045+KIL4nel9v3JMgapwJX+5ZS/5kY4dyjqAg4fx44fRpISEDjinDEEtW6EpnL7Z0K\n        skY5MLl5tp5ed3fUO0BxMXDhAnDmDJCUBMTEYGBrFLKdHbCD6AO5/VNB1iiHLKJPSgOew0j8USA/H8jK\n        AkpKgORk4MABYNcu3Fy6GEeI6r2JLOTOkIOs8VEwuUWWvt4PkvdcdMjO1qVAjIYG4OuvgR070B/5O2Sq\n        7fE5t6nY9yyQNT6KTKJtpYF+GIk7DOTmAhkZGOnqQnl5OUZHR4GjHJVt24CoKNT9IgQHiBo8iCzlznoU\n        ssaJYHKrTH39Xsl7rnicPAkUFiIyMpJ3E2bOnIl+0REffQRs2IDby5Ygw8kO0USb5c57FLLGiThF9Fnp\n        z2Zh9OhBXcUnJgJ9fQgJCZEECFy8eBHYuRNYuxZYsQI1wUHYS9Tky+LlzpwIWeMYmNz6tIF+X4+49cYq\n        XhQgj7CwsHEBBQUFwNWrwKpVQHg4bgfPQ7KjHT4h2jp21lSQNY4hg2h76QuzMfrNPiAlBYiNBXp7eQqI\n        iIgYF6DVaiUbtjJfaCgwfz6q5/pjJ1GLH5ENz8ieLyBrFGBym5MGBre7hfdpaUBcHO6LGng4Vq5cOS6g\n        urpaZywtBRYsAAIDccvXCwn2Kmwi+pRnZDkEZI0CaUR/0b74PEb/sRc4fhw4dAjDHR08pRvr1q0bF9DS\n        0vLQCjxYvx7w9QVXJ677++ILotbZRLY8Jcsja2RyVbqhwR0p9/H80Dl8GMNcA0NDQzytGxs3bhwXcOvW\n        rYdWYJQ7RJAL9Pl44pidDTZyIfOULJesMYXor9ogf/wQFoChDyOB/fvRW1+PgYEB3L9/n5cA27dvHxdw\n        7949ySbG3bt3Mbp6NfpmuEPrYIbiWV7YTtThT2TH049xPWZgcrtUQ4P+ll8vRpeXEu2eSrRueQudnZ24\n        c+eO7uLhsWfPHonc2NhY+i3GgwcPMDg4iNacLJyzViDXSoHv3e0Ro7LGe0Sf85LH+B4zJBH9TftSADrn\n        uaGDBbR4G6L+cgHa29u5/fskDwVRLHeEEGBnJxzTjZGREUlkF9+ShWHByLZUIIvxbx8PbCPq5Cg48LJJ\n        fJN+MLl9iqHBQPPyUHQyeRt7X/fOb1BbWysVWk9PD/r7+6UoNDU1QU9PD5s3iwsPUmpEjQiRQmxlegqy\n        LBTINCdcUKtwxNoSb3Nhs+hJnJN+8FvNV9p57P1LrlLoW3yMUHkhDzdu3JAIRRpEwQkiIUIIEyEX5MPD\n        w5L3QmRrayvq6upwLvRlnDIjZJhxKjxc8TFRdwCR40TOieSOSUaGg8J7EfrWGUrUvreKL7iruH79Om7e\n        vIm2tjaJQBAJIRqNhq+HOCktokCF90KkECtEaxPikWFKSDUh5Npb4Z+WFvg9EXfmj7zj/8QT/f3KvDno\n        CHKWQt/sY4zK/HOSAAHhbXNzs0TQy7fhwYMHpRoQKOJHsyDv7u6WvK/njhGixb6c0BAkGxMSjRTId1WL\n        luyZQ6SeJIDJnRKNDIeaXn9VF3rJ+zfGyQWq+A1YREEQiCLbvXu3RK5QKCQBglzkvrGxETU1NeP7riSe\n        YHJCvCEh09ocGnMzvEnEr486bunPMaLdJT8PRMeLain0TR5KVH/xp0kCrl27Jh0sCIQIkY41a9YgOjpa\n        ioogFxES3guxY/sqWNwJJj9mQIjVJ5znhxS3ZC9HwVkSwOTOJ4yM7jYte1UXehbQMJ2r38sYVREvo/K1\n        YFyLCMZ/lwajYmkIKl57BeURC1EWsQhaRkn4IhQtWYTCXy1EwS9fwYWwEOSFLkDOogXIYqTNcMXxh+RH\n        9Qjp5qbYZ2qCVUT8KcHjW6K9JfMD0TbXSQp9I3tfP41T4K5ElZsSlS5K/M9ZgXK1AlpHBYoduK/tuapt\n        OacqBc7bKJDHF47o+TPccqLq07nwUqS860Ifx+QxTH5ESTjEQc9T2eAtor7niVwpRk/vPy2rw9EW5IqW\n        F1zQNNcZDXPUqAtQo8bfCdWzHFHp54Crvvao8LFDmZctrnjaoni6CkXTbFDoZoNLLta4qLbCeSdLnHWw\n        QI6dOb5TmXHOTXHKyhTpFiZINTNGsokxEo2NkGNpji+NjLCAaAmxorTvvKfj7Cxv5Pp5Iec5T2T7zkAW\n        316ZbD/tNQ0nPd2R4eGGtOmuSHF3QbKbGomuTjjBHyPxagcc4w/UWM7ttw62iOFH8L9sbXBYZYVvrLn1\n        rCxwgAk1FmbYb6YL/x4W8q5SOcR1sJD43c2AG/NjfmBo/sz4jMHXpuZTBr/RaLYwNjP4ua6JYnzA+CPj\n        fca7jA0MvuE0kYz1DO5zzVrGbxlc7Zo1jDcYnHPNCsZyxjKi/XwtLyYiy/8DCw1adqdtwiAAAAAASUVO\n        RK5CYII=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/APIErrorHandling/HttpTimeoutTroubleshooter.Designer.cs",
    "content": "﻿namespace EVEMon.ApiErrorHandling\n{\n    partial class HttpTimeoutTroubleshooter\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.MainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.ExplanationLabel = new System.Windows.Forms.Label();\n            this.TimeoutLabel = new System.Windows.Forms.Label();\n            this.TimeoutDropDown = new System.Windows.Forms.ComboBox();\n            this.SetTimeoutButton = new System.Windows.Forms.Button();\n            this.MainTableLayoutPanel.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // MainTableLayoutPanel\n            // \n            this.MainTableLayoutPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.MainTableLayoutPanel.AutoSize = true;\n            this.MainTableLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.MainTableLayoutPanel.ColumnCount = 2;\n            this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 28.57143F));\n            this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 71.42857F));\n            this.MainTableLayoutPanel.Controls.Add(this.ExplanationLabel, 0, 0);\n            this.MainTableLayoutPanel.Controls.Add(this.TimeoutLabel, 0, 1);\n            this.MainTableLayoutPanel.Controls.Add(this.TimeoutDropDown, 1, 1);\n            this.MainTableLayoutPanel.Controls.Add(this.SetTimeoutButton, 1, 2);\n            this.MainTableLayoutPanel.Location = new System.Drawing.Point(0, 0);\n            this.MainTableLayoutPanel.Name = \"MainTableLayoutPanel\";\n            this.MainTableLayoutPanel.RowCount = 3;\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.Size = new System.Drawing.Size(357, 97);\n            this.MainTableLayoutPanel.TabIndex = 0;\n            // \n            // ExplanationLabel\n            // \n            this.ExplanationLabel.AutoSize = true;\n            this.MainTableLayoutPanel.SetColumnSpan(this.ExplanationLabel, 2);\n            this.ExplanationLabel.Location = new System.Drawing.Point(5, 5);\n            this.ExplanationLabel.Margin = new System.Windows.Forms.Padding(5);\n            this.ExplanationLabel.Name = \"ExplanationLabel\";\n            this.ExplanationLabel.Size = new System.Drawing.Size(343, 26);\n            this.ExplanationLabel.TabIndex = 0;\n            this.ExplanationLabel.Text = \"The server EVEMon contacted did not respond in a timely manner, you can extend th\" +\n    \"e length of time EVEMon waits before giving up:\";\n            // \n            // TimeoutLabel\n            // \n            this.TimeoutLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.TimeoutLabel.AutoSize = true;\n            this.TimeoutLabel.Location = new System.Drawing.Point(49, 41);\n            this.TimeoutLabel.Margin = new System.Windows.Forms.Padding(5);\n            this.TimeoutLabel.Name = \"TimeoutLabel\";\n            this.TimeoutLabel.Size = new System.Drawing.Size(48, 13);\n            this.TimeoutLabel.TabIndex = 1;\n            this.TimeoutLabel.Text = \"Timeout:\";\n            this.TimeoutLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // TimeoutDropDown\n            // \n            this.TimeoutDropDown.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.TimeoutDropDown.Items.AddRange(new object[] {\n            \"10 Seconds (Default)\",\n            \"15 Seconds\",\n            \"20 Seconds\",\n            \"30 Seconds\",\n            \"40 Seconds\",\n            \"50 Seconds\",\n            \"1 Minute\"});\n            this.TimeoutDropDown.Location = new System.Drawing.Point(105, 39);\n            this.TimeoutDropDown.Name = \"TimeoutDropDown\";\n            this.TimeoutDropDown.Size = new System.Drawing.Size(140, 21);\n            this.TimeoutDropDown.TabIndex = 2;\n            // \n            // SetTimeoutButton\n            // \n            this.SetTimeoutButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.SetTimeoutButton.Location = new System.Drawing.Point(248, 66);\n            this.SetTimeoutButton.Name = \"SetTimeoutButton\";\n            this.SetTimeoutButton.Size = new System.Drawing.Size(106, 28);\n            this.SetTimeoutButton.TabIndex = 3;\n            this.SetTimeoutButton.Text = \"Set Timeout\";\n            this.SetTimeoutButton.UseVisualStyleBackColor = true;\n            this.SetTimeoutButton.Click += new System.EventHandler(this.SetTimeoutButton_Click);\n            // \n            // HttpTimeoutTroubleshooter\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.Controls.Add(this.MainTableLayoutPanel);\n            this.Name = \"HttpTimeoutTroubleshooter\";\n            this.Size = new System.Drawing.Size(358, 100);\n            this.MainTableLayoutPanel.ResumeLayout(false);\n            this.MainTableLayoutPanel.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel MainTableLayoutPanel;\n        private System.Windows.Forms.Label ExplanationLabel;\n        private System.Windows.Forms.Label TimeoutLabel;\n        private System.Windows.Forms.ComboBox TimeoutDropDown;\n        private System.Windows.Forms.Button SetTimeoutButton;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/APIErrorHandling/HttpTimeoutTroubleshooter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.ApiErrorHandling\n{\n    /// <summary>\n    /// Http Timeout Troubleshooter displays when a HTTP Timeout has occurred.\n    /// </summary>\n    public partial class HttpTimeoutTroubleshooter : ApiErrorTroubleshooter\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"HttpTimeoutTroubleshooter\"/> class.\n        /// </summary>\n        public HttpTimeoutTroubleshooter()\n        {\n            InitializeComponent();\n\n            List<TimeoutOption> options = new List<TimeoutOption>();\n            UpdateSettings updateSettings = new UpdateSettings();\n\n            // Lets add 10 - 60 to the list\n            for (int i = 10; i <= 60; i += 10)\n            {\n                string text = string.Empty;\n\n                if (i == updateSettings.HttpTimeout)\n                    text = \"Default\";\n\n                if (i == Settings.Updates.HttpTimeout)\n                    text = \"Current\";\n\n                options.Add(new TimeoutOption(i, text));\n            }\n\n            // If the current is set to something odd we add it and sort by Seconds\n            if (options.All(x => x.Seconds != Settings.Updates.HttpTimeout))\n                options.Add(new TimeoutOption(Settings.Updates.HttpTimeout, \"Current\"));\n\n            // If the default is not in the list we add it\n            if (options.All(x => x.Seconds != updateSettings.HttpTimeout))\n                options.Add(new TimeoutOption(updateSettings.HttpTimeout, \"Default\"));\n\n            options.Sort((a, b) => a.Seconds.CompareTo(b.Seconds));\n\n            // Databind\n            TimeoutDropDown.DataSource = options;\n            TimeoutDropDown.DisplayMember = \"Label\";\n            TimeoutDropDown.ValueMember = \"Seconds\";\n        }\n\n        /// <summary>\n        /// Handles the Click event of the SetTimeoutButton control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void SetTimeoutButton_Click(object sender, EventArgs e)\n        {\n            Settings.Updates.HttpTimeout = (int)TimeoutDropDown.SelectedValue;\n            OnErrorResolved(ResolutionAction.Close);\n        }\n\n        /// <summary>\n        /// Private class to store and format suitable time spans.\n        /// </summary>\n        private class TimeoutOption\n        {\n            private readonly string m_text;\n\n            /// <summary>\n            /// Initializes a new instance of the <see cref=\"TimeoutOption\"/> class.\n            /// </summary>\n            /// <param name=\"seconds\">The seconds.</param>\n            /// <param name=\"text\">The text.</param>\n            public TimeoutOption(int seconds, string text)\n            {\n                Seconds = seconds;\n                m_text = text;\n            }\n\n            /// <summary>\n            /// Gets or sets the seconds.\n            /// </summary>\n            /// <value>The seconds.</value>\n            public int Seconds { get; }\n\n            /// <summary>\n            /// Gets the label.\n            /// </summary>\n            /// <value>The label.</value>\n            public string Label\n            {\n                get\n                {\n                    StringBuilder builder = new StringBuilder();\n\n                    if (Seconds % 60 == 0)\n                    {\n                        int minutes = Seconds / 60;\n                        builder.Append($\"{minutes} Minute{(minutes.S())}\");\n                    }\n                    else\n                        builder.Append($\"{Seconds} Seconds\");\n\n                    if (!string.IsNullOrEmpty(m_text))\n                        builder.Append($\" ({m_text})\");\n\n                    return builder.ToString();\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/APIErrorHandling/HttpTimeoutTroubleshooter.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/About/AboutWindow.Designer.cs",
    "content": "namespace EVEMon.About\n{\n    partial class AboutWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutWindow));\n            this.LegalLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n            this.GplLabel = new System.Windows.Forms.Label();\n            this.HeaderLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n            this.LogoPictureBox = new System.Windows.Forms.PictureBox();\n            this.VerCopyLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n            this.EVEMonLabel = new System.Windows.Forms.Label();\n            this.VersionLabel = new System.Windows.Forms.Label();\n            this.CopyrightLabel = new System.Windows.Forms.Label();\n            this.DevelopmentTeamLabel = new System.Windows.Forms.Label();\n            this.HomePageLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.BodyLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.leftPanel = new System.Windows.Forms.FlowLayoutPanel();\n            this.AuthorsLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n            this.CreatedByLabel = new System.Windows.Forms.Label();\n            this.ContinuedByLabel = new System.Windows.Forms.Label();\n            this.DonationsLabel = new System.Windows.Forms.Label();\n            this.DevContribLabel = new System.Windows.Forms.Label();\n            this.devsList = new System.Windows.Forms.ListView();\n            this.CredentialsLabels = new System.Windows.Forms.Label();\n            this.credentialsFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n            this.ccpGamesLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.ccpDocsLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.bitbucketLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.gitHubLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.eveMarketerLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.eveMarketDataLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.googleApisLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.dropboxSDKLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.oneDriveSDKLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.lironLeviLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.battleClinicLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.stackOverflowLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.forgotLabel = new System.Windows.Forms.Label();\n            this.LegalLayoutPanel.SuspendLayout();\n            this.HeaderLayoutPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.LogoPictureBox)).BeginInit();\n            this.VerCopyLayoutPanel.SuspendLayout();\n            this.BodyLayoutPanel.SuspendLayout();\n            this.leftPanel.SuspendLayout();\n            this.AuthorsLayoutPanel.SuspendLayout();\n            this.credentialsFlowLayoutPanel.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // LegalLayoutPanel\n            // \n            this.LegalLayoutPanel.AutoSize = true;\n            this.LegalLayoutPanel.Controls.Add(this.GplLabel);\n            this.LegalLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.LegalLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.LegalLayoutPanel.Location = new System.Drawing.Point(0, 100);\n            this.LegalLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.LegalLayoutPanel.Name = \"LegalLayoutPanel\";\n            this.LegalLayoutPanel.Size = new System.Drawing.Size(307, 221);\n            this.LegalLayoutPanel.TabIndex = 10;\n            // \n            // GplLabel\n            // \n            this.GplLabel.AutoSize = true;\n            this.GplLabel.Location = new System.Drawing.Point(3, 9);\n            this.GplLabel.Margin = new System.Windows.Forms.Padding(3, 9, 3, 30);\n            this.GplLabel.Name = \"GplLabel\";\n            this.GplLabel.Size = new System.Drawing.Size(301, 182);\n            this.GplLabel.TabIndex = 6;\n            this.GplLabel.Text = resources.GetString(\"GplLabel.Text\");\n            // \n            // HeaderLayoutPanel\n            // \n            this.HeaderLayoutPanel.AutoSize = true;\n            this.HeaderLayoutPanel.Controls.Add(this.LogoPictureBox);\n            this.HeaderLayoutPanel.Controls.Add(this.VerCopyLayoutPanel);\n            this.HeaderLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.HeaderLayoutPanel.Location = new System.Drawing.Point(0, 0);\n            this.HeaderLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.HeaderLayoutPanel.Name = \"HeaderLayoutPanel\";\n            this.HeaderLayoutPanel.Size = new System.Drawing.Size(251, 100);\n            this.HeaderLayoutPanel.TabIndex = 0;\n            this.HeaderLayoutPanel.WrapContents = false;\n            // \n            // LogoPictureBox\n            // \n            this.LogoPictureBox.Dock = System.Windows.Forms.DockStyle.Top;\n            this.LogoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"LogoPictureBox.Image\")));\n            this.LogoPictureBox.Location = new System.Drawing.Point(0, 0);\n            this.LogoPictureBox.Margin = new System.Windows.Forms.Padding(0);\n            this.LogoPictureBox.Name = \"LogoPictureBox\";\n            this.LogoPictureBox.Size = new System.Drawing.Size(100, 100);\n            this.LogoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.LogoPictureBox.TabIndex = 7;\n            this.LogoPictureBox.TabStop = false;\n            // \n            // VerCopyLayoutPanel\n            // \n            this.VerCopyLayoutPanel.AutoSize = true;\n            this.VerCopyLayoutPanel.Controls.Add(this.EVEMonLabel);\n            this.VerCopyLayoutPanel.Controls.Add(this.VersionLabel);\n            this.VerCopyLayoutPanel.Controls.Add(this.CopyrightLabel);\n            this.VerCopyLayoutPanel.Controls.Add(this.DevelopmentTeamLabel);\n            this.VerCopyLayoutPanel.Controls.Add(this.HomePageLinkLabel);\n            this.VerCopyLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.VerCopyLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.VerCopyLayoutPanel.Location = new System.Drawing.Point(100, 0);\n            this.VerCopyLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.VerCopyLayoutPanel.Name = \"VerCopyLayoutPanel\";\n            this.VerCopyLayoutPanel.Padding = new System.Windows.Forms.Padding(0, 17, 0, 0);\n            this.VerCopyLayoutPanel.Size = new System.Drawing.Size(151, 100);\n            this.VerCopyLayoutPanel.TabIndex = 8;\n            this.VerCopyLayoutPanel.WrapContents = false;\n            // \n            // EVEMonLabel\n            // \n            this.EVEMonLabel.AutoSize = true;\n            this.EVEMonLabel.Location = new System.Drawing.Point(3, 17);\n            this.EVEMonLabel.Name = \"EVEMonLabel\";\n            this.EVEMonLabel.Size = new System.Drawing.Size(49, 13);\n            this.EVEMonLabel.TabIndex = 0;\n            this.EVEMonLabel.Text = \"EVEMon\";\n            // \n            // VersionLabel\n            // \n            this.VersionLabel.AutoSize = true;\n            this.VersionLabel.Location = new System.Drawing.Point(3, 30);\n            this.VersionLabel.Name = \"VersionLabel\";\n            this.VersionLabel.Size = new System.Drawing.Size(59, 13);\n            this.VersionLabel.TabIndex = 1;\n            this.VersionLabel.Text = \"Version {0}\";\n            // \n            // CopyrightLabel\n            // \n            this.CopyrightLabel.AutoSize = true;\n            this.CopyrightLabel.Location = new System.Drawing.Point(3, 43);\n            this.CopyrightLabel.Name = \"CopyrightLabel\";\n            this.CopyrightLabel.Size = new System.Drawing.Size(107, 13);\n            this.CopyrightLabel.TabIndex = 5;\n            this.CopyrightLabel.Text = \"Copyright  2006-{0}\";\n            // \n            // DevelopmentTeamLabel\n            // \n            this.DevelopmentTeamLabel.AutoSize = true;\n            this.DevelopmentTeamLabel.Location = new System.Drawing.Point(3, 56);\n            this.DevelopmentTeamLabel.Name = \"DevelopmentTeamLabel\";\n            this.DevelopmentTeamLabel.Size = new System.Drawing.Size(145, 13);\n            this.DevelopmentTeamLabel.TabIndex = 6;\n            this.DevelopmentTeamLabel.Text = \"EVEMon Development Team\";\n            // \n            // HomePageLinkLabel\n            // \n            this.HomePageLinkLabel.AutoSize = true;\n            this.HomePageLinkLabel.Location = new System.Drawing.Point(3, 69);\n            this.HomePageLinkLabel.Name = \"HomePageLinkLabel\";\n            this.HomePageLinkLabel.Size = new System.Drawing.Size(38, 13);\n            this.HomePageLinkLabel.TabIndex = 0;\n            this.HomePageLinkLabel.TabStop = true;\n            this.HomePageLinkLabel.Text = \"http://\";\n            this.HomePageLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.HomePageLinkLabel_LinkClicked);\n            // \n            // BodyLayoutPanel\n            // \n            this.BodyLayoutPanel.AutoSize = true;\n            this.BodyLayoutPanel.ColumnCount = 3;\n            this.BodyLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 53.59629F));\n            this.BodyLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.BodyLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 46.40371F));\n            this.BodyLayoutPanel.Controls.Add(this.leftPanel, 0, 0);\n            this.BodyLayoutPanel.Controls.Add(this.DevContribLabel, 1, 0);\n            this.BodyLayoutPanel.Controls.Add(this.devsList, 1, 1);\n            this.BodyLayoutPanel.Controls.Add(this.CredentialsLabels, 2, 0);\n            this.BodyLayoutPanel.Controls.Add(this.credentialsFlowLayoutPanel, 2, 1);\n            this.BodyLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.BodyLayoutPanel.Location = new System.Drawing.Point(9, 9);\n            this.BodyLayoutPanel.Name = \"BodyLayoutPanel\";\n            this.BodyLayoutPanel.RowCount = 2;\n            this.BodyLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.BodyLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.BodyLayoutPanel.Size = new System.Drawing.Size(779, 403);\n            this.BodyLayoutPanel.TabIndex = 11;\n            // \n            // leftPanel\n            // \n            this.leftPanel.Controls.Add(this.HeaderLayoutPanel);\n            this.leftPanel.Controls.Add(this.LegalLayoutPanel);\n            this.leftPanel.Controls.Add(this.AuthorsLayoutPanel);\n            this.leftPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.leftPanel.Location = new System.Drawing.Point(3, 3);\n            this.leftPanel.Name = \"leftPanel\";\n            this.BodyLayoutPanel.SetRowSpan(this.leftPanel, 2);\n            this.leftPanel.Size = new System.Drawing.Size(313, 397);\n            this.leftPanel.TabIndex = 7;\n            // \n            // AuthorsLayoutPanel\n            // \n            this.AuthorsLayoutPanel.AutoSize = true;\n            this.AuthorsLayoutPanel.Controls.Add(this.CreatedByLabel);\n            this.AuthorsLayoutPanel.Controls.Add(this.ContinuedByLabel);\n            this.AuthorsLayoutPanel.Controls.Add(this.DonationsLabel);\n            this.AuthorsLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.AuthorsLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.AuthorsLayoutPanel.Location = new System.Drawing.Point(0, 321);\n            this.AuthorsLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.AuthorsLayoutPanel.Name = \"AuthorsLayoutPanel\";\n            this.AuthorsLayoutPanel.Size = new System.Drawing.Size(285, 39);\n            this.AuthorsLayoutPanel.TabIndex = 0;\n            this.AuthorsLayoutPanel.WrapContents = false;\n            // \n            // CreatedByLabel\n            // \n            this.CreatedByLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.CreatedByLabel.AutoSize = true;\n            this.CreatedByLabel.Location = new System.Drawing.Point(3, 0);\n            this.CreatedByLabel.Name = \"CreatedByLabel\";\n            this.CreatedByLabel.Size = new System.Drawing.Size(279, 13);\n            this.CreatedByLabel.TabIndex = 2;\n            this.CreatedByLabel.Text = \"Originally created by Timothy \\'Six Anari\\' Fries of Goonfleet.\";\n            // \n            // ContinuedByLabel\n            // \n            this.ContinuedByLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.ContinuedByLabel.AutoSize = true;\n            this.ContinuedByLabel.Location = new System.Drawing.Point(3, 13);\n            this.ContinuedByLabel.Name = \"ContinuedByLabel\";\n            this.ContinuedByLabel.Size = new System.Drawing.Size(257, 13);\n            this.ContinuedByLabel.TabIndex = 3;\n            this.ContinuedByLabel.Text = \"Continued by the listed \\'Developers and contributors\\'.\";\n            // \n            // DonationsLabel\n            // \n            this.DonationsLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.DonationsLabel.AutoSize = true;\n            this.DonationsLabel.Location = new System.Drawing.Point(3, 26);\n            this.DonationsLabel.Name = \"DonationsLabel\";\n            this.DonationsLabel.Size = new System.Drawing.Size(211, 13);\n            this.DonationsLabel.TabIndex = 4;\n            this.DonationsLabel.Text = \"Donations of ISK are always appreciated. ;)\";\n            // \n            // DevContribLabel\n            // \n            this.DevContribLabel.AutoSize = true;\n            this.DevContribLabel.Location = new System.Drawing.Point(322, 0);\n            this.DevContribLabel.Name = \"DevContribLabel\";\n            this.DevContribLabel.Size = new System.Drawing.Size(140, 13);\n            this.DevContribLabel.TabIndex = 8;\n            this.DevContribLabel.Text = \"Developers and contributors\";\n            // \n            // devsList\n            // \n            this.devsList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.devsList.FullRowSelect = true;\n            this.devsList.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;\n            this.devsList.Location = new System.Drawing.Point(322, 16);\n            this.devsList.MultiSelect = false;\n            this.devsList.Name = \"devsList\";\n            this.devsList.Size = new System.Drawing.Size(176, 384);\n            this.devsList.TabIndex = 9;\n            this.devsList.UseCompatibleStateImageBehavior = false;\n            this.devsList.View = System.Windows.Forms.View.Details;\n            // \n            // CredentialsLabels\n            // \n            this.CredentialsLabels.AutoSize = true;\n            this.CredentialsLabels.Location = new System.Drawing.Point(504, 0);\n            this.CredentialsLabels.Name = \"CredentialsLabels\";\n            this.CredentialsLabels.Size = new System.Drawing.Size(183, 13);\n            this.CredentialsLabels.TabIndex = 10;\n            this.CredentialsLabels.Text = \"External contributions and credentials\";\n            // \n            // credentialsFlowLayoutPanel\n            // \n            this.credentialsFlowLayoutPanel.Controls.Add(this.ccpGamesLinkLabel);\n            this.credentialsFlowLayoutPanel.Controls.Add(this.ccpDocsLinkLabel);\n            this.credentialsFlowLayoutPanel.Controls.Add(this.bitbucketLinkLabel);\n            this.credentialsFlowLayoutPanel.Controls.Add(this.gitHubLinkLabel);\n            this.credentialsFlowLayoutPanel.Controls.Add(this.eveMarketerLinkLabel);\n            this.credentialsFlowLayoutPanel.Controls.Add(this.eveMarketDataLinkLabel);\n            this.credentialsFlowLayoutPanel.Controls.Add(this.googleApisLinkLabel);\n            this.credentialsFlowLayoutPanel.Controls.Add(this.dropboxSDKLinkLabel);\n            this.credentialsFlowLayoutPanel.Controls.Add(this.oneDriveSDKLinkLabel);\n            this.credentialsFlowLayoutPanel.Controls.Add(this.lironLeviLinkLabel);\n            this.credentialsFlowLayoutPanel.Controls.Add(this.battleClinicLinkLabel);\n            this.credentialsFlowLayoutPanel.Controls.Add(this.stackOverflowLinkLabel);\n            this.credentialsFlowLayoutPanel.Controls.Add(this.forgotLabel);\n            this.credentialsFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.credentialsFlowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.credentialsFlowLayoutPanel.Location = new System.Drawing.Point(504, 16);\n            this.credentialsFlowLayoutPanel.Name = \"credentialsFlowLayoutPanel\";\n            this.credentialsFlowLayoutPanel.Size = new System.Drawing.Size(272, 384);\n            this.credentialsFlowLayoutPanel.TabIndex = 11;\n            // \n            // ccpGamesLinkLabel\n            // \n            this.ccpGamesLinkLabel.AutoSize = true;\n            this.ccpGamesLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\n            this.ccpGamesLinkLabel.Location = new System.Drawing.Point(0, 0);\n            this.ccpGamesLinkLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.ccpGamesLinkLabel.Name = \"ccpGamesLinkLabel\";\n            this.ccpGamesLinkLabel.Padding = new System.Windows.Forms.Padding(5, 3, 0, 3);\n            this.ccpGamesLinkLabel.Size = new System.Drawing.Size(235, 32);\n            this.ccpGamesLinkLabel.TabIndex = 7;\n            this.ccpGamesLinkLabel.Text = \"CCP Games for their efforts towards community developers.\";\n            this.ccpGamesLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel_LinkClicked);\n            // \n            // ccpDocsLinkLabel\n            // \n            this.ccpDocsLinkLabel.AutoSize = true;\n            this.ccpDocsLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\n            this.ccpDocsLinkLabel.Location = new System.Drawing.Point(0, 32);\n            this.ccpDocsLinkLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.ccpDocsLinkLabel.Name = \"ccpDocsLinkLabel\";\n            this.ccpDocsLinkLabel.Padding = new System.Windows.Forms.Padding(5, 3, 0, 3);\n            this.ccpDocsLinkLabel.Size = new System.Drawing.Size(217, 19);\n            this.ccpDocsLinkLabel.TabIndex = 8;\n            this.ccpDocsLinkLabel.Text = \"CCP 3rd party docs for their documentation.\";\n            this.ccpDocsLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel_LinkClicked);\n            // \n            // bitbucketLinkLabel\n            // \n            this.bitbucketLinkLabel.AutoSize = true;\n            this.bitbucketLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\n            this.bitbucketLinkLabel.Location = new System.Drawing.Point(0, 51);\n            this.bitbucketLinkLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.bitbucketLinkLabel.Name = \"bitbucketLinkLabel\";\n            this.bitbucketLinkLabel.Padding = new System.Windows.Forms.Padding(5, 3, 0, 3);\n            this.bitbucketLinkLabel.Size = new System.Drawing.Size(165, 19);\n            this.bitbucketLinkLabel.TabIndex = 21;\n            this.bitbucketLinkLabel.Text = \"Bitbucket for hosting the project.\";\n            this.bitbucketLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel_LinkClicked);\n            // \n            // gitHubLinkLabel\n            // \n            this.gitHubLinkLabel.AutoSize = true;\n            this.gitHubLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\n            this.gitHubLinkLabel.Location = new System.Drawing.Point(0, 70);\n            this.gitHubLinkLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.gitHubLinkLabel.Name = \"gitHubLinkLabel\";\n            this.gitHubLinkLabel.Padding = new System.Windows.Forms.Padding(5, 3, 0, 3);\n            this.gitHubLinkLabel.Size = new System.Drawing.Size(238, 32);\n            this.gitHubLinkLabel.TabIndex = 22;\n            this.gitHubLinkLabel.Text = \"GitHub for hosting the project and providing our representation site.\";\n            this.gitHubLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel_LinkClicked);\n            // \n            // eveMarketerLinkLabel\n            // \n            this.eveMarketerLinkLabel.AutoSize = true;\n            this.eveMarketerLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\n            this.eveMarketerLinkLabel.Location = new System.Drawing.Point(0, 102);\n            this.eveMarketerLinkLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.eveMarketerLinkLabel.Name = \"eveMarketerLinkLabel\";\n            this.eveMarketerLinkLabel.Padding = new System.Windows.Forms.Padding(5, 3, 0, 3);\n            this.eveMarketerLinkLabel.Size = new System.Drawing.Size(216, 19);\n            this.eveMarketerLinkLabel.TabIndex = 12;\n            this.eveMarketerLinkLabel.Text = \"EVEMarketer for their market data and API.\";\n            this.eveMarketerLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel_LinkClicked);\n            // \n            // eveMarketDataLinkLabel\n            // \n            this.eveMarketDataLinkLabel.AutoSize = true;\n            this.eveMarketDataLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\n            this.eveMarketDataLinkLabel.Location = new System.Drawing.Point(0, 121);\n            this.eveMarketDataLinkLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.eveMarketDataLinkLabel.Name = \"eveMarketDataLinkLabel\";\n            this.eveMarketDataLinkLabel.Padding = new System.Windows.Forms.Padding(5, 3, 0, 3);\n            this.eveMarketDataLinkLabel.Size = new System.Drawing.Size(233, 19);\n            this.eveMarketDataLinkLabel.TabIndex = 19;\n            this.eveMarketDataLinkLabel.Text = \"EVE-MarketData for their market data and API.\";\n            this.eveMarketDataLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel_LinkClicked);\n            // \n            // googleApisLinkLabel\n            // \n            this.googleApisLinkLabel.AutoSize = true;\n            this.googleApisLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\n            this.googleApisLinkLabel.Location = new System.Drawing.Point(0, 140);\n            this.googleApisLinkLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.googleApisLinkLabel.Name = \"googleApisLinkLabel\";\n            this.googleApisLinkLabel.Padding = new System.Windows.Forms.Padding(5, 3, 0, 3);\n            this.googleApisLinkLabel.Size = new System.Drawing.Size(132, 19);\n            this.googleApisLinkLabel.TabIndex = 10;\n            this.googleApisLinkLabel.Text = \"Google for their API SDK.\";\n            this.googleApisLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel_LinkClicked);\n            // \n            // dropboxSDKLinkLabel\n            // \n            this.dropboxSDKLinkLabel.AutoSize = true;\n            this.dropboxSDKLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\n            this.dropboxSDKLinkLabel.Location = new System.Drawing.Point(0, 159);\n            this.dropboxSDKLinkLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.dropboxSDKLinkLabel.Name = \"dropboxSDKLinkLabel\";\n            this.dropboxSDKLinkLabel.Padding = new System.Windows.Forms.Padding(5, 3, 0, 3);\n            this.dropboxSDKLinkLabel.Size = new System.Drawing.Size(138, 19);\n            this.dropboxSDKLinkLabel.TabIndex = 17;\n            this.dropboxSDKLinkLabel.Text = \"Dropbox for their API SDK.\";\n            this.dropboxSDKLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel_LinkClicked);\n            // \n            // oneDriveSDKLinkLabel\n            // \n            this.oneDriveSDKLinkLabel.AutoSize = true;\n            this.oneDriveSDKLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\n            this.oneDriveSDKLinkLabel.Location = new System.Drawing.Point(0, 178);\n            this.oneDriveSDKLinkLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.oneDriveSDKLinkLabel.Name = \"oneDriveSDKLinkLabel\";\n            this.oneDriveSDKLinkLabel.Padding = new System.Windows.Forms.Padding(5, 3, 0, 3);\n            this.oneDriveSDKLinkLabel.Size = new System.Drawing.Size(189, 19);\n            this.oneDriveSDKLinkLabel.TabIndex = 18;\n            this.oneDriveSDKLinkLabel.Text = \"Microsoft OneDrive for their API SDK.\";\n            this.oneDriveSDKLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel_LinkClicked);\n            // \n            // lironLeviLinkLabel\n            // \n            this.lironLeviLinkLabel.AutoSize = true;\n            this.lironLeviLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\n            this.lironLeviLinkLabel.Location = new System.Drawing.Point(0, 197);\n            this.lironLeviLinkLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.lironLeviLinkLabel.Name = \"lironLeviLinkLabel\";\n            this.lironLeviLinkLabel.Padding = new System.Windows.Forms.Padding(5, 3, 0, 3);\n            this.lironLeviLinkLabel.Size = new System.Drawing.Size(141, 19);\n            this.lironLeviLinkLabel.TabIndex = 15;\n            this.lironLeviLinkLabel.Text = \"Liron Levi for his MultiPanel\";\n            this.lironLeviLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel_LinkClicked);\n            // \n            // battleClinicLinkLabel\n            // \n            this.battleClinicLinkLabel.AutoSize = true;\n            this.battleClinicLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\n            this.battleClinicLinkLabel.Location = new System.Drawing.Point(0, 216);\n            this.battleClinicLinkLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.battleClinicLinkLabel.Name = \"battleClinicLinkLabel\";\n            this.battleClinicLinkLabel.Padding = new System.Windows.Forms.Padding(5, 3, 0, 3);\n            this.battleClinicLinkLabel.Size = new System.Drawing.Size(270, 32);\n            this.battleClinicLinkLabel.TabIndex = 20;\n            this.battleClinicLinkLabel.Text = \"BattleClinic, especially SghnDubh and MrCue, and the rest of the staff for the de\" +\n    \"cade long support.\";\n            // \n            // stackOverflowLinkLabel\n            // \n            this.stackOverflowLinkLabel.AutoSize = true;\n            this.stackOverflowLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\n            this.stackOverflowLinkLabel.Location = new System.Drawing.Point(0, 248);\n            this.stackOverflowLinkLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.stackOverflowLinkLabel.Name = \"stackOverflowLinkLabel\";\n            this.stackOverflowLinkLabel.Padding = new System.Windows.Forms.Padding(5, 3, 0, 3);\n            this.stackOverflowLinkLabel.Size = new System.Drawing.Size(264, 32);\n            this.stackOverflowLinkLabel.TabIndex = 16;\n            this.stackOverflowLinkLabel.Text = \"The users of Stack Overflow who contributed advice and code snippits.\";\n            this.stackOverflowLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabel_LinkClicked);\n            // \n            // forgotLabel\n            // \n            this.forgotLabel.AutoSize = true;\n            this.forgotLabel.Location = new System.Drawing.Point(0, 280);\n            this.forgotLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.forgotLabel.Name = \"forgotLabel\";\n            this.forgotLabel.Padding = new System.Windows.Forms.Padding(5, 3, 0, 3);\n            this.forgotLabel.Size = new System.Drawing.Size(266, 58);\n            this.forgotLabel.TabIndex = 14;\n            this.forgotLabel.Text = \"And also the ones we forgot, the ones who lurk in the shadows of the forums to he\" +\n    \"lp us deal with users, all the people who reported bugs to the forums and the on\" +\n    \"es who dared to test our betas.\";\n            // \n            // AboutWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.BackColor = System.Drawing.SystemColors.Window;\n            this.ClientSize = new System.Drawing.Size(797, 421);\n            this.Controls.Add(this.BodyLayoutPanel);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"AboutWindow\";\n            this.Padding = new System.Windows.Forms.Padding(9);\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"About EVEMon\";\n            this.LegalLayoutPanel.ResumeLayout(false);\n            this.LegalLayoutPanel.PerformLayout();\n            this.HeaderLayoutPanel.ResumeLayout(false);\n            this.HeaderLayoutPanel.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.LogoPictureBox)).EndInit();\n            this.VerCopyLayoutPanel.ResumeLayout(false);\n            this.VerCopyLayoutPanel.PerformLayout();\n            this.BodyLayoutPanel.ResumeLayout(false);\n            this.BodyLayoutPanel.PerformLayout();\n            this.leftPanel.ResumeLayout(false);\n            this.leftPanel.PerformLayout();\n            this.AuthorsLayoutPanel.ResumeLayout(false);\n            this.AuthorsLayoutPanel.PerformLayout();\n            this.credentialsFlowLayoutPanel.ResumeLayout(false);\n            this.credentialsFlowLayoutPanel.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.FlowLayoutPanel LegalLayoutPanel;\n        private System.Windows.Forms.FlowLayoutPanel HeaderLayoutPanel;\n        private System.Windows.Forms.PictureBox LogoPictureBox;\n        private System.Windows.Forms.FlowLayoutPanel VerCopyLayoutPanel;\n        private System.Windows.Forms.Label EVEMonLabel;\n        private System.Windows.Forms.Label VersionLabel;\n        private System.Windows.Forms.Label CopyrightLabel;\n        private System.Windows.Forms.LinkLabel HomePageLinkLabel;\n        private System.Windows.Forms.Label GplLabel;\n        private System.Windows.Forms.TableLayoutPanel BodyLayoutPanel;\n        private System.Windows.Forms.FlowLayoutPanel AuthorsLayoutPanel;\n        private System.Windows.Forms.Label CreatedByLabel;\n        private System.Windows.Forms.Label ContinuedByLabel;\n        private System.Windows.Forms.Label DonationsLabel;\n        private System.Windows.Forms.FlowLayoutPanel leftPanel;\n        private System.Windows.Forms.Label DevContribLabel;\n        private System.Windows.Forms.ListView devsList;\n        private System.Windows.Forms.Label CredentialsLabels;\n        private System.Windows.Forms.FlowLayoutPanel credentialsFlowLayoutPanel;\n        private System.Windows.Forms.LinkLabel ccpGamesLinkLabel;\n        private System.Windows.Forms.LinkLabel ccpDocsLinkLabel;\n        private System.Windows.Forms.LinkLabel googleApisLinkLabel;\n        private System.Windows.Forms.LinkLabel eveMarketerLinkLabel;\n        private System.Windows.Forms.Label forgotLabel;\n        private System.Windows.Forms.LinkLabel lironLeviLinkLabel;\n        private System.Windows.Forms.LinkLabel stackOverflowLinkLabel;\n        private System.Windows.Forms.Label DevelopmentTeamLabel;\n        private System.Windows.Forms.LinkLabel dropboxSDKLinkLabel;\n        private System.Windows.Forms.LinkLabel eveMarketDataLinkLabel;\n        private System.Windows.Forms.LinkLabel oneDriveSDKLinkLabel;\n        private System.Windows.Forms.LinkLabel bitbucketLinkLabel;\n        private System.Windows.Forms.LinkLabel gitHubLinkLabel;\n        private System.Windows.Forms.LinkLabel battleClinicLinkLabel;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/About/AboutWindow.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.About\n{\n    /// <summary>\n    /// Displays the About Window (Help -&gt; About) containing contrib,\n    /// legal and version information about the application.\n    /// </summary>\n    public partial class AboutWindow : EVEMonForm\n    {\n        private readonly SortedList m_headers;\n        private readonly SortedList m_developersList;\n\n        /// <summary>\n        /// Setup the list of developers and the standard font\n        /// </summary>\n        public AboutWindow()\n        {\n            InitializeComponent();\n\n            devsList.SelectedIndexChanged += devsList_SelectedIndexChanged;\n\n            EVEMonLabel.Font = FontFactory.GetDefaultFont(8.25F, FontStyle.Bold);\n            DevContribLabel.Font = FontFactory.GetDefaultFont(8.25F, FontStyle.Bold);\n            CredentialsLabels.Font = FontFactory.GetDefaultFont(8.25F, FontStyle.Bold);\n\n            // list of headings\n            m_headers = new SortedList\n                            {\n                                { 1, \"Guru\" },\n                                { 2, \"Guru (Retired)\" },\n                                { 3, \"Consultants\"},\n                                { 4, \"Developers\" },\n                                { 5, \"Developers (Retired)\" },\n                                { 6, \"Contributors\" }\n                            };\n\n            // list of developers by heading\n            m_developersList = new SortedList\n                               {\n                                   // EVEMon Guru\n                                   { \"Blitz Bandis\", 1 },\n                                   // Guru (Retired)\n                                   { \"Jimi\", 2 },\n                                   { \"Araan Sunn\", 2 },\n                                   { \"Six Anari\", 2 },\n                                   { \"Anders Chydenius\", 2 },\n                                   { \"Brad Stone\", 2 },\n                                   { \"Eewec Ourbyni\", 2 },\n                                   { \"Richard Slater\", 2 },\n                                   { \"Vehlin\", 2 },\n                                   // Consultants\n                                   { \"MrCue\", 3 },\n                                   { \"Nericus Demeeny\", 3 },\n                                   { \"Tonto Auri\", 3 },\n                                   // Developers\n                                   { \"Peter Han\", 4 },\n                                   // Developers (Retired)\n                                   { \"Collin Grady\", 5 },\n                                   { \"DCShadow\", 5 },\n                                   { \"DonQuiche\", 5 },\n                                   { \"Grauw\", 5 },\n                                   { \"Jalon Mevek\", 5 },\n                                   { \"Labogh\", 5 },\n                                   { \"romanl\", 5 },\n                                   { \"Safrax\", 5 },\n                                   { \"Stevil Knevil\", 5 },\n                                   { \"TheBelgarion\", 5 },\n                                   // Contributors\n                                   { \"Abomb\", 6 },\n                                   { \"Adam Butt\", 6 },\n                                   { \"Aethlyn\", 6 },\n                                   { \"Aevum Decessus\", 6 },\n                                   { \"aliceturing\", 6 },\n                                   { \"aMUSiC\", 6 },\n                                   { \"Arengor\", 6 },\n                                   { \"ATGardner\", 6 },\n                                   { \"Barend\", 6 },\n                                   { \"berin\", 6 },\n                                   { \"bugusnot\", 6 },\n                                   { \"Candle\", 6 },\n                                   { \"coeus\", 6 },\n                                   { \"CrazyMahone\", 6 },\n                                   { \"CyberTech\", 6 },\n                                   { \"Derath Ellecon\", 6 },\n                                   { \"Dariana\", 6 },\n                                   { \"Eviro\", 6 },\n                                   { \"exi\", 6 },\n                                   { \"FangVV\", 6 },\n                                   { \"Femaref\", 6 },\n                                   { \"Flash\", 6 },\n                                   { \"Galideeth\", 6 },\n                                   { \"gareth\", 6 },\n                                   { \"gavinl\", 6 },\n                                   { \"GoneWacko\", 6 },\n                                   { \"Good speed\", 6 },\n                                   { \"happyslinky\", 6 },\n                                   { \"Innocent Enemy\", 6 },\n                                   { \"Jazzy_Josh\", 6 },\n                                   { \"jdread\", 6 },\n                                   { \"Jeff Zellner\", 6 },\n                                   { \"jthiesen\", 6 },\n                                   { \"justinian\", 6 },\n                                   { \"Kelos Pelmand\", 6 },\n                                   { \"Kingdud\", 6 },\n                                   { \"Kw4h\", 6 },\n                                   { \"Kunnis Niam\", 6 },\n                                   { \"lerthe61\", 6 },\n                                   { \"Lexiica\", 6 },\n                                   { \"Master of Dice\", 6 },\n                                   { \"Maximilian Kernbach\", 6 },\n                                   { \"MaZ\", 6 },\n                                   { \"mexx24\", 6 },\n                                   { \"Michayel Lyon\", 6 },\n                                   { \"mintoko\", 6 },\n                                   { \"misterilla\", 6 },\n                                   { \"Moq\", 6 },\n                                   { \"morgangreenacre\", 6 },\n                                   { \"Namistai\", 6 },\n                                   { \"Nascent Nimbus\", 6 },\n                                   { \"NetMage\", 6 },\n                                   { \"Nagapito\", 6 },\n                                   { \"Nilyen\", 6 },\n                                   { \"Nimrel\", 6 },\n                                   { \"Niom\", 6 },\n                                   { \"Pharazon\", 6 },\n                                   { \"Phoenix Flames\", 6 },\n                                   { \"phorge\", 6 },\n                                   { \"Protag\", 6 },\n                                   { \"Optica\", 6 },\n                                   { \"Quantix Blackstar\", 6 },\n                                   { \"Risako\", 6 },\n                                   { \"Ruldar\", 6 },\n                                   { \"Safarian Lanar\", 6 },\n                                   { \"scoobyrich\", 6 },\n                                   { \"Sertan Deras\", 6 },\n                                   { \"shaver\", 6 },\n                                   { \"Shocky\", 6 },\n                                   { \"Shwehan Juanis\", 6 },\n                                   { \"skolima\", 6 },\n                                   { \"Spiff Nutter\", 6 },\n                                   { \"stiez\", 6 },\n                                   { \"Subkahnshus\", 6 },\n                                   { \"SyndicateAexeron\", 6 },\n                                   { \"The_Assimilator\", 6 },\n                                   { \"TheConstructor\", 6 },\n                                   { \"Travis Puderbaugh\", 6 },\n                                   { \"Trin\", 6 },\n                                   { \"vardoj\", 6 },\n                                   { \"Waste Land\", 6 },\n                                   { \"wrok\", 6 },\n                                   { \"xNomeda\", 6 },\n                                   { \"ykoehler\", 6 },\n                                   { \"Zarra Kri\", 6 },\n                                   { \"Zofu\", 6 }\n                               };\n        }\n\n        /// <summary>\n        /// Prevents the user to select an item in the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void devsList_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (devsList.SelectedItems.Count != 0)\n                devsList.SelectedItems.Clear();\n        }\n\n        /// <summary>\n        /// Populates and adds links to the various labels and list\n        /// boxes on the form.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            HomePageLinkLabel.Text = NetworkConstants.EVEMonMainPage;\n            CopyrightLabel.Text = string.Format(CultureConstants.DefaultCulture, CopyrightLabel.Text, DateTime.UtcNow.Year);\n            VersionLabel.Text = GetVersionText();\n\n            AddDevelopersToListView();\n\n            AddLinkToLabel(ccpGamesLinkLabel, \"CCP Games\", \"http://www.ccpgames.com/\");\n            AddLinkToLabel(ccpDocsLinkLabel, \"CCP 3rd party docs\", \"https://eveonline-third-party-documentation.readthedocs.org/en/latest/\");\n            AddLinkToLabel(bitbucketLinkLabel, \"Bitbucket\", \"https://bitbucket.org/\");\n            AddLinkToLabel(gitHubLinkLabel, \"GitHub\", \"https://github.com/\");\n            AddLinkToLabel(eveMarketerLinkLabel, \"EVEMarketer\", \"http://www.evemarketer.com/\");\n            AddLinkToLabel(eveMarketDataLinkLabel, \"EVE-MarketData\", \"http://eve-marketdata.com/\");\n            AddLinkToLabel(googleApisLinkLabel, \"Google\", \"https://github.com/google/google-api-dotnet-client/\");\n            AddLinkToLabel(dropboxSDKLinkLabel, \"Dropbox\", \"https://github.com/dropbox/dropbox-sdk-dotnet/\");\n            AddLinkToLabel(oneDriveSDKLinkLabel, \"Microsoft OneDrive\", \"https://github.com/OneDrive/onedrive-sdk-csharp/\");\n            AddLinkToLabel(lironLeviLinkLabel, \"Liron Levi\", \"http://www.codeproject.com/Articles/37397/A-Multipanel-Control-in-C/\");\n            AddLinkToLabel(stackOverflowLinkLabel, \"Stack Overflow\", \"http://stackoverflow.com/\");\n        }\n\n        /// <summary>\n        /// Gets the version text.\n        /// </summary>\n        /// <returns></returns>\n        private string GetVersionText()\n        {\n            FileVersionInfo version = EveMonClient.FileVersionInfo;\n\n            // Adds environment process info\n            VersionLabel.Text += $\" ({(Environment.Is64BitProcess ? \"64\" : \"32\")} bit)\";\n\n            // Returns the application product version (AssemblyInformationalVersion)\n            // or the application file version (AssemblyFileVersion)\n            // if the build is in SNAPSHOT\n            if (!EveMonClient.IsDebugBuild)\n            {\n                return string.Format(CultureConstants.InvariantCulture, VersionLabel.Text,\n                    EveMonClient.IsSnapshotBuild ? version.FileVersion : version.ProductVersion);\n            }\n\n            // Returns the application file version (AssemblyFileVersion) \n            // and adds \" (Debug)\" to the version number if the build is in DEBUG\n            VersionLabel.Text += @\" (Debug)\";\n            return string.Format(CultureConstants.InvariantCulture, VersionLabel.Text, version.FileVersion);\n        }\n\n        /// <summary>\n        /// Little function to allow us to add links to a link label\n        /// after the contents has been set, purely by the contained\n        /// text\n        /// </summary>\n        /// <remarks>\n        /// At present this function only works on the first instance\n        /// of a string within the text property of the link label,\n        /// further insances will be ignored.\n        /// </remarks>\n        /// <param name=\"label\">LinkLabel to act upon</param>\n        /// <param name=\"linkText\">text to make a link</param>\n        /// <param name=\"url\">URL for the link to point to</param>\n        private static void AddLinkToLabel(LinkLabel label, string linkText, string url)\n        {\n            int start = label.Text.IndexOf(linkText, StringComparison.Ordinal);\n            int length = linkText.Length;\n\n            label.Links.Add(start, length, url);\n        }\n\n        /// <summary>\n        /// Loops through the list of headings and developers and adds\n        /// them to the list box.\n        /// </summary>\n        private void AddDevelopersToListView()\n        {\n            devsList.Columns.Add(new ColumnHeader());\n\n            // Set up the list of developers\n            for (int i = 0; i < m_headers.Count; i++)\n            {\n                ListViewGroup group = new ListViewGroup(m_headers.GetByIndex(i).ToString());\n                devsList.Groups.Add(group);\n\n                for (int j = 0; j < m_developersList.Count; j++)\n                {\n                    if (!m_headers.GetKey(i).Equals(m_developersList.GetByIndex(j)))\n                        continue;\n\n                    ListViewItem item = new ListViewItem(m_developersList.GetKey(j).ToString(), group);\n                    devsList.Items.Add(item);\n                }\n            }\n\n            devsList.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);\n        }\n\n        /// <summary>\n        /// Handles the LinkClicked event of the llHomePage LinkLabel.\n        /// Navigates to the EVEMon website in a browser.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.LinkLabelLinkClickedEventArgs\"/> instance containing the event data.</param>\n        private void HomePageLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            Util.OpenURL(new Uri(NetworkConstants.EVEMonMainPage));\n        }\n\n        /// <summary>\n        /// Handles the LinkClicked event of the IconSourceLinkLabel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.LinkLabelLinkClickedEventArgs\"/> instance containing the event data.</param>\n        private void LinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            if (e.Link.LinkData.GetType() != typeof(string))\n                return;\n\n            try\n            {\n                Uri linkUri = new Uri(e.Link.LinkData.ToString());\n                Util.OpenURL(linkUri);\n            }\n            catch (UriFormatException ex)\n            {\n                // uri is malformed, never mind just ignore it\n                ExceptionHandler.LogException(ex, true);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/About/AboutWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"GplLabel.Text\" xml:space=\"preserve\">\n    <value>This program is free software; you can redistribute it and/or modify it under the terms of version 2 the GNU General Public License as published by the Free Software Foundation.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA</value>\n  </data>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"LogoPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsMAAALDAE/QCLIAAA2cElE\n        QVR4Xu2dd5QU1fa2u4chM+QkGQSGHAyAcs0BA2LCgCgGUAyIgGSHLEFyRpIkyUFykJzjDBNhyFnMoiKm\n        q/t7333O6anu6RnA+/vnW8ta61mnurq6umq/Z4dTVV3tu4apEHgaTAB7wXnwLZB/yYgsf/t8/i8xfxSs\n        Al1BHZAF/OMpL/gAnAD4gnBf/C/XwS+A4jQEEeC6prtBKgi34X/53/gTjAbs8Fed/OAFcAmE29i//N/A\n        iLMOFAOZTi3AryDcRgz+SJBdfBG5QZ4MiAomy7WQ9xrIdxXyXyMFwlAwzOsQIgt5KBxCEQ94n/bxRaS3\n        XzDbQREQdrof/ATSfzAil/iyVxZfnjvFF/UgaAQeEl/eh0FjQ74m4HFP+yR4DDxh58PxlPjyk6bgGQ/P\n        iq/A86AZeCE8BZuDFsEUegW0DEOrNAq/Ad4Mpsg7oA1417ZtxVe0QxrFOlo6W7qIr3h3ECO+G3qCXqAP\n        +BD0t20/s6zQ6+LLWQudOGt6uxqWgRwgaMoPwuQMv/iyloIQ98LojwaRq3hTqdHgHWn4YFd59JkPpUmz\n        QWk8TwaY1ru82UchDAZDQhgqTV4YBkZkwkgwWpo0HwXYWl4cYxkHxodhAvgYTAxhkjR5aTL4BEwD04Np\n        MQPM8jBHmrw8F8yTJq8slEbN5sltj82QirdPksgyw8VXchgYATBfehwYC5Hbwcvgnels7PsLtAVBUx+Q\n        fuVs5dI8Iu8jEpH/ManT8F0ZOnqJ7I89KonJpyQp5YwkHzorKYfPALbXyrkMOJ85qWwvoL0aX1wHFz18\n        GcJXIXwtKUeAa0Fy6jeSdPgbSUj5WrbsOicd+26VkrdMFl+pURBjvPjKTAJ4fUNfiIJwmN7W34DiQKfC\n        4BQIXokxM8/9Njw9LNmLPCmdYj6RPftS5WDCCcvJYBJP/R9wOgPOXANnM+GcHEwK5XwIF8LwhYeLIXxp\n        +UoOJn+d1oKNO87J46+tEn+ZjyHKRCMIoaeEzy2dgU7PgeA3Ge/y3AGvoGc0kpxFH5choxbL3v1Hgjlw\n        NIRj18jxq3AiPbFeTmbAqevgtOWM5WwGnLOcl71xjgshfAEuevhS2XXgorzcfrP4y1KMqeAT8ZWdYcJ+\n        qM19vkSguWSqXZBGttJWjIfEn+8Reav9ONm6I0m270r2kGI5FMLhDJaFkirbd4fjSCYczYBj18DxEE4Y\n        9pwEp8Jw2sMZD2fT2HsOnPdwwcMX4KJs3HlBbn9yhUeQmSa3aBUWZPfLoDrwxdsFaeSqr2Iwb9x6d3tZ\n        v/mgbNwSb0nwkCgbt3pJugrJVyElAw7Jxm2HMyH1KhwJw7EwHDdsP+HhJDgVhtPgTAhnNVQZzoML4AuZ\n        t/ykFKk713hHObSElVeo3c0pKt/PngVmnBF1nwqSo+iTMmrCMlmz/kAYYi1xloOZsyE+DAmeNhyJlqSr\n        kOwhJQyHTLsRrXLYkurhiIej4Jis2USO29bNkxOWk+CUh9OyZvMZcNZyDpxX3uy+G0LMFl/5eYb8T3uF\n        cGgeCV5IV4p6AGOExlLnP+/JZyt2ybJVe9Kzei/YZ9l/DRywxKZnTVwmHMyEeJBwFRItSSDZgvm1KeBQ\n        GA5bUsGR9Kw7ajkOToRwEpySZZ+fBmfAWVm2/pwyb8VpyVN9vhVkIcY/bwXb3dAXhCzkSDsvSl0M6lq2\n        GS0Ll+4Iw06wy8NuWbQ8Ttsglu2x7M2EfZb9YThwFfCdmbH8YDDL2MaDBJCUxorkNAKvD4XhsOWILFx5\n        NIRj4Lhh1QlwCpwGZwyrz0rDpushxgKwyAxCQ22fsSDIHxDkwyHzZfaCLR62hmGbzF64A2y3hM7vzIBd\n        YHd4Fu3JhL1g31XYDw6kY95nCTJ3SYLMXnzQQzzgMsuSRJDkIRmkgEO2tfOfpVqOgKMhHJPZS0+Ak+AU\n        OA3OyKud9kOMJeKrsMyWvyG2z1iQR1SQsZNWyrRPNxhmk42WTR42gy22dfNethrmkG12fnsm7AA7M2EX\n        2J0xc/eAvSHsU6bP3S/T5x2QaUosiMNy2yoHQXww80kiSALJlhRwSKYtOBxCquWoTFt4XKYvOikzFp/B\n        /Cml08AkCLIUgiz/J4I0kXGTV8mkaessn8uk6V7Wgw3XwCbDDNtO34z5LZmwFWzLgO1gRybslEkzd4Ww\n        G+zxsFcmzdqHFmi73zDrAIgFcZaDMulTRzxIAIkgKY3ZySDFcshyGKTKpDlHwXHLSaX7kBQjRoWVEKR9\n        sN0N4QRBUteQ1VhGjFumXjJ20qoQVoO1ljUydjJaMmUz2nVpr3X+c8t6y4ZM2IhtbMqALRmw1bIthO0y\n        duoODzvB7hD2eNgrYz/ZBw7I2GmxgK2bjwMHQbwl0ZIkY6d7SQaHZeyMVHAEHAXHwHFwQjoPpCCrxHfj\n        GvEV7RRsd0PmIeujkYtl+NilYJkMH7fcwwqwMj3j19j5VZ52dTDj14ZhneVzy/owbMyATTJ8wuYwbPW0\n        22T4xzssO8GuYCbuBnvAXk+7DxywxMrwSXGWgyAeJHhIlOGTk0EKOCTDpxy2pIKj4Bg4Ie0/PGwFWSdZ\n        SvYOtrshI0EwtEfI6jd4vgwavggslkEjyBLwGVhqWeZpwzByRRhWglXBjFqTCWvBOvB5BmwIYaNpRxPM\n        j94EtsigMVvtPNfh57Dtkcuxnzim4QsNI7HPY3bLoHFxMmjsXrAP7AcHLLF4j+D9cQct8TJofCJIAilp\n        TDgMUsERcBQclza9D0GMzw1FOwfb3ZCRILy+8bj07D9H+n40HyxIawcv8rAELM6Ez4IZsszDcssKsDIT\n        VoHVGbBG+g5ly3W4LrY1eCnAd+v+Au7jsI3Sd+BU6dt/LBhjGQ1G2ZaMB+PwmbnSd8ROsAvsBnul78j9\n        lgNpjIqXfqOTMX/QMCoR4DUZnQIOeUgFx+TNmBTxV9wg/kqbxV+sW7DdDZkJ0kS69p4pMR/OkZh+n4LZ\n        Zv7DuWA+mGfhfBj6LwxhEVgShs8kZsDSMOC9AcvAigxYic8ukJg+4wy9x4IxYCRejzdwWd+pEjNwnVmn\n        1zAwBAy2rYfeI8AoQ7/pEvPRVokZvAfsBfuCGbIfxFriJGboQZAAkiRmWLKHFHAIpErM8GPSstshiLER\n        bPkngjwu78d8Kp17zZPOPWeAmWAWXnMZ6GnbXrMtc0KYC/BZbe06/Lxua7p07j1fOveYIp1jJoIJYKx0\n        /mC0dO4+HAw19JiG9ZYG08ex3GyP632Az3wwCvPD0j6r81jeYxI+t9jMdxsIBmQA3gt8Hm2PydK5/w6w\n        G+yRzgP2hbDfMPAgSPCQCJKk8yBySDp/dNiSKi06JllBtpmrjaG2z1yQJ+XdTpOlXdep0q7bJ5ZpYIZt\n        p1tmhoD1Og2Rdh0HggHgQ2n3fl/QW9p16AF6Yr6X2S7f64T1Og+181hfP9vfzHcZJ+26z7bMAZ9i+/j+\n        rpPw3lh8bpj9Dq7P70Pr4OtOH5ltxCzGMszrfvSxeOfta/3cILT87GBp98FCadd7F9gt7frssewF+8B+\n        adf3gHTofwhtAog3bT+SDFIA3nMgob/QHuMQeIev0g7xFesebHdDOEGiIIi5Ft663QR5+/3JHqZ42k8C\n        vP7eZGnVdhJA+3ZfadX6fWn1RgfQPj2tO4JOWK+PtHqrG+gOukqrN4FrdT5GWr0zCPNdPHQ26Hps+Vms\n        99YHoIdtsexNLsfrt3tLqzbDpVX7+ZjvheX4XGtug9viNrzbdt+Lz7zV03z27QHS6v1V0qrzNmnVZadl\n        N9gD9kqrrvvAAXmj+0F5u0cCSDRtzyRLirzd6xBIBUfkmTYQpOJGI8o/EeTVt8dKq3cnpNF2orzWZoI8\n        1myw1Li9k9xQ5S0pUP51yVumpUSRks9IVMFoiSpwIygfnoKVJapQFYkqcpNEFa4DaoIaWFbNULgWqI33\n        b5aoog3t+3it61qK1jOfL3KrWa/ILWZZgPqggWlLNJGoCjFYB/OFqoOqtuV3uhbfwVa/C9vVz94mUcXu\n        NsdUbaZEVV8AFkreGovAEslbcylYBpZL/tqrpdBNa6VMw/Vyy+Pb5dk2sdKqWzJIMXQ/BA7LE28mQpDN\n        YBMEueYckibIi6+PlJffHCMt3hwLxsujzw1WEfx6R0iYO0FyVBNf1mLiiyzqAa+5LGtx8zprSfFlK4N1\n        K4No8WW/EVSwLchRKaTFOpx36wdakLM6qGGuLQTamratjXXwftS9KDExKubybOVBWXOvgGLnA/uA93W7\n        3BbIdQuoh893FH+52eIvPwfMF3+FRWAxWAI+A8sBRt8cY4AsFVdL5fu2wCPikTeSpUWnFHBIHn0dglTa\n        CpBDrt9DnpRnXxkmzVqOkOdbjpLbH4yRrEVgdL1FJ8ztOTxwGttr/IAgN5iWZCtlD7wKoKGrGiOoobnM\n        weUQ2LU5Oe9wnwHZKxqDqrEdHoNTFL0VBwam0blMjc95rBvoDHYZv9uK6s9VV/y564sfx+YvPVYiKswD\n        C60YRojAqRAVY7UO+nw3rlXy1tksD7dMkGbtDimNXoUglbcbrksQ3luVv6k80XywPP3SULnzkd4QozmW\n        PRdeDHoMDUPDUwxtKQI9wglkW14eVkFoVIpgWzUsjeKMyt4LTwqLe48tYS93n3GvnaEB7xPzeoi+Z4X0\n        rgf88Dp/rtoWKwi5obdEVlyC3r/MnLEtjzYgBFvAUyJu4FdxPTxhk0TV2SGPtEqUp99Jlntfijf5Q6us\n        D4LtbggjCO8i5E1s+Z+RR54ZIA8+OUBy3tAijAhAb1YDeR/AgaLnhxXEzjtoSBqDvVs/wxAGkVwoCxiV\n        eAXwwt7vjIuWxqSw3K6+73mP87luxvvwLBo/8BmGRCOKP0dFUAlUtoLUBHXAzRDjVhXEV/R98ZXjBaaF\n        4DMIsCJNiAAQBwM/Y3SCfIEQVbTBLoiSJHc0S4B37BRf9C4I0iPY7oaMBOHdhM/I/U/0lTI128D4zjOA\n        E8FLrltxoDRqiPGVEoChzLYBQRAagoxt5z29Nc1THDYMaWu9gttiOHK5JdDjPT3feaJu03yHEYEthMhZ\n        JY1cDFUUpK7NITg23mPAOzDLfmq9Y6lBRbHC0DvoFa6K0lxBQTAIjN4hNRrHS4NnUWVF74Eo1ytIfghS\n        4Fm59d4YiSzykvWGDMQgcO+rC0Ix4BE0CHMHc0LAwA4amEa0HqQGpCgOruPEoMEd7On8DPJF4LUVw20L\n        32e8gEI4nBjRoCpgkeCKgjpWjAYAiT337TBib+MdiidsMWeoGE4QiOFyRWWMOSBCzlr75aYnIUhlCgKK\n        9wq2uyEjQZ5WQcrWamuNnokYfI8VDXu4Gt8rhBODoYliWC/QxOkJIYHeTmM6Q/K1FYL3FXsNzHBDIzuv\n        0DyE7fGkqC5zy2lsGpo4QZx3AAqRp6Fdl6JRCHKTgYJQCHpIbqzHUlWFYMjyioFEHiQIPMQriIqwT8rd\n        gxxS+QAEiv1ngkSVeTWMAF5exHpI6HRvNS4NHyoCPMd5gBoZRmVP1pjOOO7p4Qpf04O4Dg1tjeWMTrQX\n        szejI2iJipZ5AuUpw4zGfo3/9cBtMPrtJgxBKOcZppLzwu1ye/QMeoTHM9jmuUt8pUZDABg/UF0BDVVM\n        4i6RmzBlQhYF2W3ZJ3lvRg6JPmgo3ifY7oYMBCnwjAoSWRQGDydCAIQzeggFYa/UsOXxhFCcB2gvpMFh\n        aO3t7NE0tjWOGtuKpgbnaxtGtPfScPhONZ5p/RSiGMYLLFGj7oQIFMKKEXU3vAEiUgj1Mq8gFJrfye/h\n        dzB30CMgCMQ0YL7Ie+ZmtwrIHTeivFUxnIewsmK5S1HgIQoGfxq6kMTVQ/ZLZHWKESe+KhCGd8eH2j5j\n        D2kKQZDIA6HKK4KHQi8buMM8sIDxIYweOEXia5ewrTeoYW1oYM+mAdgLXZjQJO3EoAA0EhMs12VcZyih\n        sRvCAxqYNuoe8RftgEHr02ZeRbkTPRuhhuGG21KPxPerxzlBLCoyPc16h1cMDgNKT7D3VS2wAnDMwTKX\n        Yw6GKlRXATG8YYuCIIlX3mtCFamaIr4SA4PtbggnSF4rBktbCsKEHioGPQOoIK8gdj8odRq2lfc6DU1H\n        Ow/tOw+X9l1GSIdu46VD13HSofskMMXQbSL4WIkqgQ6R+w557Z3Rus77oPFzg1QQE4Y4NoAQCl7T+Hkb\n        iR+1vT9fYwxS74EQ/5E8JZ6SNp2m6Oc7dBsndz3UQQWpf+970r7raEMXfIfOjwPjpX23SYD7wtbMd+y9\n        Sjr2P2CJlU6DzNnbzoNS5ZbH0fuDPMMrhsshhOUu8ge9owqSO39HEmr7jAVBXlDDh4phhVD4AxnkGIIQ\n        9273pfLbb7/L778b/vjjj3T8+eefAf773/8G+Ouvv4IoXXcAjN9AOvXdJH///TeWiVy+8peUq90uLQyp\n        V9xlXtMj8j2CuIzBFr2CHpHnDmnfcx22/5fy0+U/JfpmjNghSI9BqwP78ccfJHg/3TE4fvvtt3T8+uuv\n        cuXKr2lXAVUIlz9sDgmIQQ8B0fttyELouvaQ5RUkVIQwYiivSJvuq7DzPJjwApDMRCA0PilVoz16/m1S\n        oPTjknL0BywTZe7SVMlaAMZXUf4D7kgTIN9jOMgPTciBmMWjW8vX3/6K7/2vwqt/Jk9FywcDVgUJQK5V\n        BMeVK1eUdyiIJnMnhAPiBEIVhQBVUGXRQ6LRFu8bbHdDRoIwVIUTAiFKW68grylte24NHNz3P/4pk2ft\n        lEmfLJPJ01aAlWC5TJ6+WibPWCNTZu2QKTM3gy0y5VPMz0I7c4NMnbVRKVjuRQiCJI2Q1Kz1jIAg6Mxy\n        z+NDIQAqH4rBe5A1T6AC4jWcEghreC9LgcZ6yw6F+AMfOnH6khQqi8pRBakmMQONIDT8hYs/ysTpG8Fm\n        mThjO9ghH8/YrUya/41MWnhFJi/6VaYs/hXzv2D+F/lkyRWZsewXmb/mF3nk9dQwoYpewcqKYuxDCzFI\n        NMOVhZ0n1PaZe4hXCHoKRCgMl7ce4YRwvPDOMtmwNUXWb0nQuxk1QWoiRxJ1gzn0TjUKkzMTNQypOSDX\n        TZ4ylfmB7a02HN0tKzdeUM/566+/5UDST5K9CEbNFCT3f9IEoYeUHKLLbn1whFz5NS0cvfKuvdtcy+Wa\n        8uKbk+XzTfHKqI+RmHU5igdN5hQb2+WdN/xpmv4Kyv3oBlUWf6rGZTzTqyGKQrCiokdQDOsVKHNN68Rg\n        qEo0sOy9AWE51PbX5yFM4BSEP54MFkOhYKxKaHBWWIGKy2EFQQmrJao7cefGDcwLmqARkpis3aAM27zt\n        of7y82WGur9g4L+kdcdFRoQ8d1swz8rwhj5I7g/Kpp1nVAiyff838JiH8b3oIFriAm9ZHViGKkwrOVtl\n        sdPxJ2ishkrzJ2mfgClGGFZcZWfB0EjUKoYLUzvFzxK3EkSpZMYeRgxWVxCEQriwdf1J3QkBQysMVwxV\n        IUJYHn1prvQZsk56DlopvEmhx8Al0nPgZ5alWL5Uen20AqyU3kPWSu/Ba6TX4M8xvw4tWYv3VmP5Oslb\n        Gh5pS1vTY++Uj2ceCOSfcxf/K4VubG2qKXiQegs7UbHO8mzLqfAOk8su/fi73P0YCwRbMmuJGy13PNIX\n        +8ibKCz2hoseA5Zhv5djGdrBm6TvaN5JkiD9xqRKv3EnpN/Yo/Ih2zFHpc+oFBkw4Zw5YahiIEyBnLVQ\n        SVEQHXtwVE4BrGdouGKLKqvEdXkIqyuKYUNVgNBQlfbT4wGjdwUlZnKtk/cz3AaTujGiGw/crgJ8+c3v\n        Whz8gVA0ZALCgXoJwgtDF/Yvb/WZcuzUj0jATMq/y6zFx9TrTLjiOIODwypI6iu1QnKJmfzyyy/puHz5\n        coCff/45wE8//aT8+ONP8maPZAhAL6G3uEEgcwe8Qr0Bxue4g0JUPYzWinLdgmjY8orhBEkTwQsFMUa1\n        Vr7KFCqCl1LV28B4HAS6QZoR5v1ey7Tnk29/+E2q3IaQooKgyir8tvQff85WQ7+hwvpNKtXlhSkOQt0o\n        nPPVpXt/CvLPRHBCGH6Ulu/NNOGMHkIxONbQ8YYNTSoIUEGSxV8tRbLXRiFw3SGrQHMI4EIWwxVxHkIR\n        mEuMGP7CreSV9htk2YZvZdSMizJkynkZPPm8DAGDJ58LMGTyWXBOhk3lvHttGDoFLWCbrwy+1xvP7Ug+\n        Z7Gn5EDid1aU32X55yclskAjFaX63RPl4temPL1y5TfpPXSj5qa0ZO7aGnJ/049l8KTjMsTD4EnHdNng\n        iWZ+CBg65bhMmHNGJsw+LxPnfiET5wFtL8jHc8yy+5/6CAUAqr0SaFUQl8CdIC5UudeAnsKKMNT2mSd1\n        rxAWFQO9DtWWX2llKPKm5S0k1fv05J0/ewXA5M4Ki9WWO3PLUydMqCGnLhQk2UBv5mkUCBLkJbfLo82n\n        2pBkPOG+p8ZieT39PYYbIxw/9Z3kK9kE2+B5LnOuK00QJ45XKHfahF5p8w1DHfMXn+TAEpU/aeZvzvVh\n        AGNMwucDAXhWI+/94CHksC5GFDU+z1vZUyWazCkMwlvVI+KrdtQIGGr7jAWhd4SIAfwQhEJkLdUD7RtG\n        FCvEi+12yqL1v6F2/woj4VXGkHruykvIib3AiUXPuSUVhFUQjKXntbzGrCFZ8taXhauOqxhkf/xXcl/T\n        KQg3JidcvnxFXnprOoxJr+J5L3oJt0GjGyEebDpSBo3dDXZJm26LsYznyiiG57yZCoJt8PQQ4z1/PVsG\n        FVYpiMGzvrzAxEdnsPNGsezGOCj/42Z93lnCZK7hi9WVrbIYvqqduF5B8lkPcSK8Al41FDbhyXhHmhhk\n        wJg9Nh/8rQPDtn2SEF+nS8u2U+U1ZZqH6WCmbd1rw6ttP5XcxTGmoDD8aR0JlKb0oOpS+45O8u33jPm/\n        qgBffs18YHLC1j1fSI5iz5rc4nAGVy+4RboPWB/IB0mHL8rL786TFm1mSwtt5wK24N350qLtCmkdkyqt\n        e5yQNn1OSuuexzF/RFp2S5HXuqZI1dt7QpB7TbWnP5bF/hbA9/O6ifMOV2kxuVc7dv2C8DYfI4QXioLW\n        hSngfZBL/9F7ghKz9zQJ8Z5CcWMEL8wJhOGoZI33jSDsseyt1jsC4QXha9jHewMiXL5sEvKlH3+R+g+P\n        M4NEhrh8GH+w92roowcYUbp9uNyToH8McOnSpXT88MMPAb7//vsA3333ndKqAzyMYyAVhGU4xXkAwuC7\n        eUoFidxX9RBEQCKvxnBlufYc4gRx3hGMS+QG5hMnyG4YPliIaxXBCJF2zqhkHfQeisCyVstWDuAYzph7\n        4CkIRcUqvSgpR38OCMKqaMHqi+idqBCjENP5OfZWNRReq7hGlO79V/xPIji+/fY7ea09Bql6dpmDWIQ4\n        nu7X0zr4Tt4UUQ0JPCAGPMNxXR5SsBmMnyaIni4p6M5decVwHtJann9rucxZehzJ1cDf9k2cFSfjPtkl\n        Y6fy10yGcVO3od0K2AYzZso2GT9tjxS48V0rCA6OPU49hDAPuHh/q7TpuhAlKcvTy3L2ws8SfdccCPIM\n        DIPP0Tiux/I2IOch8LhGz4yUUZM2gc0e+BpM3CQjlY0eNsnY6QkybmYqOAIOy9hpCTLmk1i5owkSPb9D\n        T+WYQayePVBB5sH4FIRhirnjOLwF86TE4GC7GzJK6hyppyXzAN7BIHIIhQiAPOIr2hYtjEkXpuG0h8M4\n        mriZtF3yDr1A5MkR7NF6FRDeoEmWItgk70IW34fBc5TtLQdTLiH0/Cx9x5xCLnvbxG+tyCAIB5V8RAg7\n        jw4wmagJk72rprgel7F1uPUcWMbO6E6b8BwXb3QrjvzBTkkhXCWo3sGwdb/4y8+F8eEZVZ0QnKeHnIIg\n        Q4PtbrhWQeAlAUGsKF4x1FMoCgzCq2tqPBvzmej0Kh0rKoerrBweYdjDVACIw4MjfE+3R7BtCsWqpniM\n        NHljr6Se+EnyVJlhqpz8TxgDOuMwhLEi4snCIKMDbkcNToF4qsYRRhAaudQIU/re0Nvcp8UHnbHcdYNT\n        Pdlpc0n+pyVL5Y1GAAqiHkJOGihqqO0zCllpZa8doWuocoNCJwhF8EJBEL60VKVBGe9hbB4QjZhOhBBs\n        BaXjmNzoufy8Ggk9m2VrIAfwxrV6Uqx6b2n80hzpPjhWVm6+JG1j1sh9j/cz4w8mcsZ0isZr4bwYhP0v\n        WOoB6dh9tFSuzSuSFMUrAqHXsOQF7BjqVbbnc57C8oxysa4QpL0aPXC22ZvUmbuKfyBZquy1gtgwpaEL\n        3lH9zD8RxIoREIS4kOUqLA/wjqw3vCMPNmkjjR5rJY0av2p47HWpfzfEhJdUr/swXrcMUL4KvAdiNLjr\n        OV2PPPxUJ3noyS7S8N6XJSIvex0M5TwDlKjwgPQbNFVSjlyUX678EThVw3L7p59/lb0HUuTdjqMlbwlU\n        OdxXffweDIkBXoXqT8h33/8o8YlHpXYDHGOQFzgoDFpN0hSCyyheA6lxxyBp+sZyebPzCql1h/fqJD2D\n        wgAKQjthIKk3NQSEIPCU6qetIBhghto+Y0F4cjEjQQDzB3tJiCCFojvJn6iuvOUv2bUnQQ0/5ZP5Qcu7\n        xCCOwnP27U8MWk7jJqUclxyF2NuQA5A3InLXlWead5JTp821kcwmfj4u4aQ0eHgUYvVAwGcg9pXyNZqp\n        IJy+/uZ7eapZF/HnobG9goTC9+kpt8nAEYvt+TeRdl0wONQQxbBKD0HnYrmb/0mENozgy82WrNUx/qAA\n        LkxRiOrnMQ9K/J8IQtDrVARWV15B3oIgHbX0DZ1276UgVWXytEV2iZm6fAD3hyD7Y5PskrQp+RAEKYDQ\n        gVDoz/eQvPJGD3jEr/ZdwSj9D4zSv5BpCw6hktsucxZuk+TDZ1Bi/9euIfLFlz/LXU8vMKIgRJSr9TbK\n        VSMIp8sYWLbvOlIi83kTPrFe4k7b8FwaDD9w9Gb7SQqC8Y6KgGrKJnENVQxlev/vIgiCgWH1s0YUtP4a\n        58UPQfzVz11vyHKC8OQikzmxHhIYEBJWWrbaylQQ9BTkiPSCoBZHkg8vyAkjCMLAAy12IBxd0eXs/eu3\n        JEq9RqMkogSqHCZZ3oyBnpm1wN3yaNNukphyXtfldP7iz1LhNlRHJYdKmbo95JtvL9l3zESPnP7pSslf\n        AsZVESBGAHpHWgU1cPQW+ykI0nWKyVEssykEPbkwihqWs7xVqMIyyVpttzE+8Nc4JxGk5jnJAvylrtlD\n        3MlFihEqCChMD3FCOOghb2YiCGIpDD/5kwV2iZlUkOwVIEiiXZI2GUFulZwF60lswlldxnAxd+E6yV8S\n        lU3hd7BvyE0wtN59b43G+5LL1Z8qu+O+0s9wmr4gUSLLjoIgPdMJ4qb1m/ZKeeQYc2aZYljvUEHgQXg9\n        cMRyuzYFQfmrHkLvQDLnyJwnF3lVsRzGQzeuQVLfboSAAIazEOOsRNY6KxH/XBCGLAqCgydBgtBbrMeo\n        IO8HCTJt5jJp+sL7cs9D+AyqprAekr283PdQc2na7B2Z8eln9p00D3n6hQ7qFZzi4lOlSFmEBsZ1VjgY\n        7UbwIZMqCIyWh6EHSbbkCKl+51D56hsTni799JvUuXeYlKnaNENBOB07fk5uuxfeHmUTdBB3ycBhs+2a\n        VhB9bjGhd2AcxkTNayN6E91qiUCV5a9hRDCckUhLRKlrDlmhggCvIAFRnBigiCl5C1XuFCQIfwWbNn6o\n        lUEOSRujdOz6kX3HCJKrUH2ZM3+NvqYoLd7gbT4cFKL3UgSbPH3FOple6sYCGAjyzPTwsUv0s0zCXXtN\n        hSDPyzeeHDJj9lr56uvv7SszUbDmLQdKlvzwQg1FbPmokcYycPhCuxaOrdsMibgBg0N2TC2t+5uzwMwf\n        N65SD4mI3iURMD6FcETWPK1kuX5B3H1ZIJ0gHjHUUyAIKFQZIQsx2U28W9GUqxggwpCTpy2275ipSwx6\n        lI6+zSi9Y7eh9h0KckqKlX9YheH0yy+/S4maMACrGv5cgmUpS1qepOPDilnpuN7MHlvyI7nv6THyl63I\n        lq+Nk7LVX5Rvv/tJXzP8PdeilzS8/x05esyERDdd+fV36dl/umQtiO1QFNgjovj7MmTCfrsGPWQy9gPj\n        GXqqhip7vUTv910jvAvFH70vSAQvWUpd90jdKwjDFsWwuSRIECZ3jyBeD+FOqyD0EISs6UvtO2bq0mOM\n        6e064KsLQUbad4yHlK/WRL786jt9/cOln80Z5nyPQog+aB/DfiKh8pYcGoP7xUqHiZbeUqyzVGo4Hh3E\n        CBKfdEpKV3lOvv7WCSLyzMsDYPAHpFyNF2Rf7GEVyU3sWDPnbZTCN7rc2VoGjVpt3+WxMaljH5jLdB+m\n        mf3QG7EhCm+2jj4QIsQpyVrL8D8IggGUCmEpbCstHSAydBkxjCDBOaTdB4twwIixHP2i506enpYUOakg\n        jPscWOWqA0GG2XesINWfRB74QV//8MNPpvezyODTPbmPzBsYY0RUQFVDL2FocadPMLiteOeigCCJySek\n        VNXmQYI8+RJCJpMytlu84tOycOk2fc9NFGjXvuNSri48E5VnUFLvNh3fgw7Bc1v0DF7AKotlvDtef1W1\n        DB6yV43vhMhW+6SStdZJyVIa3x1q+8wF4Wjd4sQIjEmsGOkE6RAcsj5YjPjaBoZDtUJBppmY7qYuPXAg\n        DC8MPwhFHbsNt+9QkJMw0nNy+OhFfc0LUUXLweBF2xkD8HySnqtqJv5ys4wxuB9amqNFwr+z6ZJAQbDm\n        870Q5MVgQZojJzH88fwbPCVboUdlxLil8vvvf+o6bjp99lt58KkPkUPSio52XZG8eS8xqyreo8Xcwce/\n        cnzBxA5R/JV3qvG9ZKt1Qom8PkF497sThOMRDxq6vIK4Mckb6QWJWQJBYEDGWs0hoYIw9rtTDw0hyCj7\n        DgQ5fFpyl24lS1Ye0Nf0vKdaIOdwJKzXtSeZkMHXvObNn5uVwvZoDHpLsa7SZ8Ru/SynPoNmSKkqL2CE\n        bpK6CvIiQxZCoHoUOiF6fLaizaVjj08x8Pxd13MTx0H7447bVzw2eAL3wQ4C1SsoCDsML/lWxhgEOSSb\n        E6OmEcJwHIJc1+l3JwhDVoggQfdmuRziBEHISuch/AuIthrXJ09L62GcjCDo5epB/wnOIakXJEfxZvLS\n        6wMDsX3HvnOSv+yrmh/0VDj3k2GM38/xCHuqGmmBlG8wSc5dMPnnZ3hX/Xs7GA/5xpS93OZjz6My0r/T\n        4PPBkHss/vyN5emXBqAA+FnXDTe164uxlfvxDn8jQlF4Ol7/7qKd+CttFX+VeI8QxyV7bccxCHLNF6iu\n        xUPCCfJ6xoLwzg18Np0gMUiGTOgUhYJ0H2/foYeclRyFG0ne0s/JUYwPODH88AJSjmKoAukl/H5+lp7C\n        aksFGSeF6i6XVZsuiJFRZOmqPZK9yONSqlorj4f8LY2fQ0/WcMWyFtvQ/z1hDkLlBK++q3FfOXnma10/\n        dOKDZszP2uAZvLG6LJI6T5vwHF/xHuKvuBaCxKkQ2WodUyhEvnqmvT5B9AEBL4DMBGG4oiBukEhBQsre\n        gCDYUSRj3v3unbr0MLfwmJN39UNyCAaGBRHKYKimLw9BKfqbLmeSnr1gEyqoCeLn9Qme9mYix8AsokQP\n        qf/oVNmy5xtdlxNvhqhxG3ottlOiyqvy5ddpHtL4uYH4LJ9MweMlCFtKWtkfXe992ecJVW7i037Mz9jg\n        IbxJjo9bKtrReAm9FXmO9/lmq5mAHDcTbaIKkb32UeU6BeFOegXxDhIRMgKCpIlhknpGHgJBcMCTZ4QI\n        EoOBlL3GQYLL3pOSoxCvL9wjkUVbSrc+0+XPP822acyvvrksi1ef0vuCu/WZJf2HLpK1m0/KjxiVu+nS\n        j5fl2VeG6M/c6Aklqr0DQdI85NHnYBT1Cj4owfwUPADznhWJz3dZgXEMP+Omdv2OmFDFH+aw3C0Oz2Ao\n        1duDkM+Av/IOibgRoQziZI3eIDkgRI7aRyR7rSMQ5HpulAsSxCOGCkIPoSihgrxlPCS07NW/DzKJnb8N\n        8U7GQ9wJPCT17mPsO04QlqT0ksYSWfh5ea/n+sDA7mrTqTNfSZPn+yIf2DAEo5eo8lqQhzRC5RQY3KkQ\n        rC7hHfQQ9RKeZDWhO3fp12XiDHMjB6d2/VKNILyzhMfIE4s8A84b6Ip3M+LoPyGYny9EVlyoYuSonapk\n        LXPdgnCnuEMUwo1JCEWxXhIYHBpB8lXoIFt2HpVtu48pz7SciuXILzy1gJ3t0muGbNuZKNt2xIM4af4q\n        6nu9EohxCjzl+Rbdsfygvj9zzhrJVgAeovkFiZvlbalhUr3eGzLt07XyxcVvg06108AsV0+c+koGj1wo\n        JavAs0OSdeHyzfW59dt2pshWUO8+9GoVBOMJzZs45sCYC8fI4wpUla9L1hIdpVOvRXp3fbsPjyF37IPR\n        Z2M9lv0YIOr5LIQrhq1iKIlZ/ZUaiWWDJUe1dSpE9lpWkNIIl6G2z1gQ7qATxCuGxXmJGySqINwpc0uQ\n        ATvHa+wcPTP58sHB7IV8TSiC+9VtAO8ZVpbDriRm4rYj9Kj7JCL//VKmWjPh/1p16LFEenw4Tdp0HCsP\n        PtFNilZ8SfwBIZCo+csqfboRkrcmbD42hPAYrVeoZ9hooB0NnUhFwDEWZHjG/vNGiUKt9abAV96dLa90\n        PWluDeX5K/6pGKMAYelNQegpvNyrJfp4yXNTEoQ4HOAfCkK3DScIexBFAQFBXOsRhC2Nz8EfYytDg57K\n        ZpiC4SmCjpR5UpAicIBoz0cpEIPXx931anYQvY/2PrNNd0GIZwNUAFZLEENF8BAkhvUIPUZik7kelw3J\n        GhW8QhBWkjyud8RfrJ3krLFZIngnIjsJb3hgdcUnPaggvYwYHMCizRK9XUXIXusQ2kOSE2QrjQov1PaZ\n        CxJcbQQRJAhziYOicMedt0AUGo0GZc+jUTlPQ6snEIrDKssJ4vEKErh5APBORC1TKYoVWns5jKoCeYVw\n        ZaxN2E4MrqtG57ERFwW4zInA48D+u9wQ+Es95kMYH54QUXGVRPBBMoEkjvBEyqOQQe7w828p9JdWMyBE\n        MsYjEIGCKCnwkP9ZEJPcFO1JNtamE4RiOEFwMNwGvUDPmuLg2fPdRR3nGd5WxbCCqHdgPfUIbgOthiEa\n        n9chaHi07AQcS1AE7f0cR1AIM54wQvCYrHhqdAgQOD5WkjgWHfQ6QRiG4H1aJSIH8j4sjqdY2gI/BoL+\n        imv0FI2eLmHu4AidP5Hmvby8LFBiMKqsFeoVWWukoPRNgTgpEAQClb6e34cECeIRQrEChRNEy2HGXwii\n        Ls7KA9CAFIEHx8+y19O4vOKmockmbucVhNc7iPMOhaJ4vMN5A0MMK0L1BieANb5ic4XuP4+JRQnCUEAI\n        7jf3nyGXnYn5D97A6ywqAtCQxEEfE3Y38aPnR1RcaZK2gkEuwxSqLj9vsi63QJf7K66TLBWXGy+pkSzZ\n        QI5aSf9UEHcQHpwQAXgwztVtrHWiOEEoAmM710HFod7DbevFH4pFcRiaCL3HehB7vxNDRbDra2s9hCLQ\n        a1jJMSwFBLBiBEKT8wTmB4ZaGN15g5bw1qO5HU3Q9AqWr12sGKiagF6h5Egc4SiiErxBz/YCPY82Sa8S\n        RlTFKJ6C8MQjSuOIiqsle02IUMOg86UQ3kJtn7EgNtaGFQQHpYQK4kTxCsLEzt6GGKzhA/AgtfLAQbAI\n        0GQMsQIiUBwnAo3PJM0rd4RhibhwxTzxhNlfNTDDEMVwHuE8nCKwYvLAyogiqCdjX7mPKgQ9gnnCjrp5\n        0pJ5AonaXxJjB+YJ3siA/ffz11JlpmN+oj4cM2u1OISlZAgSa8IZRvH+ylslovLGgBjZaiQqkdcuiOfh\n        M9rDmPR4UGxdAmRPs+6uYxIH3Z5i0PXZ46wgKgrCFQ3Pz/DA6Sk8/0TDURQ1NLxAqySGKysCDa7v2Uup\n        Lkxp5UQx6BUQQDsLvj9oP/Fd3mRNwzuPcEla9435wnkG8obzCorBvMBKqkR/c6qGr7WCmiiR1RPhCfPV\n        AxiGmBty1UlS8tSNQ3W1VbLXiDUCVANYP7J6AoRJkCyl/vHTgNwBOtjbnCD0lFBBbNjyihEIBUDfx7o8\n        eJaHTJb8XGDMwN7vBQLRs+gN6i0Ug54BQVzS1v1kHnFeATHUY7k/Lix5UI+AIBxNOxE0WSNnqBD0CP7x\n        MIVgx+F9XUja9GzmCl7LLz0JHrEfvX87ylgjghHChCQaP3edhCARsoHsNQ2R1ywIn0oaOEgngnN7JwZ7\n        Hr2DVYn3wOkZnlAViMssF3nQTJI0AsMCBcFBa0jAgXOen1WPoDDW+Fo52bJVhbBeQTF0H60AAW/gPPbJ\n        i/NYLV8ZmmznKMYTghSBuQIdQ0MUbz2FsXi3o7tez8Ef0XzBhwhM03I2a7W9khsC5LslSfLeTBIxALTe\n        UM0IwNYJkr1GvKFmPHIIjjvU9laQi54F5m9XC1AQikAoAIXgAdMjKAK9gQdqD9ahYvDAEQICIvDgPb2P\n        B69/fc1eyPqdT0tAGEBI0DDGC1pu7KDGt/PcF3aUoHDqOogNSxqSuB/OQ+kJ7BC2dFVv4CCOIQnQ+Lof\n        JkcE9kE9gZUTPMH9QydbXjouOwul7HIdb2Sttkfy35oIQRKlQL1EKdQgAfMwvhXAEA9hDDlqHgwQWRT7\n        6LW74W3g2+VZYOAfEuuBegUIDUuE+YIHb4VQb/B6hKnZNTRoKECl4hJlQAj0Qq3jaQT2xDHYDrbN8KMn\n        OJmg6QXsHPh+bSkAOwg7hPVONT47AnMDcwL3gQI4EbgP9ATuA4WgJzAkMRzxFIc9zaE/6sQImxfAVIRP\n        zZVAvUzLh18uNgm7wnKJrLpHCtVP0Ef3FbktQYrdniBF0eaoZT1BMQJoWytOciqxEhGFwXCo3X2+R4Bv\n        uGeBIUc0DtIrgIu/VgQ1vkUFoCGcMWgAeoMrF51H2PM7vH9JhaAhnBCMywwJjM0oK3mGlN/HbakINkTy\n        +wIdwHaCgDe66sgKoB2B30sB6AHsCNwHJmq7DyqCORtrwtFk6w1ABeBzeiECb+vhCNxdHdTnY22QLFV2\n        S/GGCfCOBLTxECNeStwRj9xxEEZ3xEmu2obcIE8dzFdbKn7m6mC7fw8qAN+D4L8g7U1/doQGjEX0oF0u\n        cMmZBvCeSqABrDek8wQngo3HagCIwGpFDYHeyPM9+rQdGoMwPs/E+hgB8zudAHrGGC2/T7/bie96v+0A\n        TnTNAy4Z87soNo3Onm8NX26O+G9ciZ6+S/y8HMufoOkfP/LOET51lDe88ZrHNghgH7/EefsYjSxVD6gQ\n        hRvES/HbD8JDDkqZuw5KFCosZ/wg6sbivQOSrQi832tvwzaQBfhyg2QQvAJ/7E+D0Og0hlZJdtQa8ABC\n        4zM5oxfSCOoBNASrE55WcNWJM4hNjC4kaI9kbLahQQ3CGwfQI/XEHb/XCe++m6GHIjjPw3oUAoancX3l\n        sC1Nvgw5GCfY2G+emWi3bZ8oykcssUpicmaP5t2G+jRRGl6feeWe5oOxRXScXpb1V8F6VZEHqh2UGxoa\n        WOYWbxgnFe6Lk4K3xqkoeW+KVfLd7DggeaLR+SKyBdva0BIEplYg/Up8nCuNoD3e0+sDRkDPDw1B7jQC\n        qxMFhlfj8HYZ3rtEYLCAAIsMFdyzcFfAULw0ysexoofye5zgLvazFOV3l6TgTMJDxF92GpKpMZZux4UX\n        fQS4e5yrffJbZXgE1vPzMRfRbJl0USHVTUSSNjkhe02MI+ABZr14CBAPAchBfI8he404KfEfQwGIUOHe\n        OIl+MFZK3xkrherFSuH6B4LIGz1OIrIWTm9nn+8oiAKBiX+snj65Ez5tgaFAe7s5+LQE6EIP4z9DDw1v\n        Y7CGHvRKZ/hy7JlLjHGcwfTfBHjVzT7RUx8I5nqmeSKbn+vxu0ryQg+/z+Ucwu+cgKpnGXp5omSBwczj\n        WRla+DAxboOPTbLPP4zmA8X4pJ5E8Vfl+gYtSwHHB3nqIidAFOYDhqL8t8Sr52RDUmZiplA5gEnOxitK\n        3hErRRrESuUHYqVKo1gpdYcRoEgDUH+/FK2/R/JV6if+yHR5g/wBngPppirgAkj/oYic5uQfLzKpNzAc\n        URSGIyZmlw/oEZMkeyWECA1HhMJQlDnA/lOyCkNvIOy9FIZe4RImxKkII1bcgoHXVvEz5ruTeBSG4c/m\n        n8iKiyVXjc0SGQ0hdBs8ZUGwnRshtLbrUBl9LhGVNoCNkqXyBqxvyFZlg+SoukFyVtsguaqvV3LXWC95\n        a38uhW/5XG6obyh66zrJWwvUXif5QFRNslYK1FkrxeqtldK3r5HK966RSveskeL11kiRm1dL4ToLJW/F\n        3pI1Tw3Y0Z/eroaRwA/CTo3AtyDcB0GEGTjyRz1B5PdQIAwFLYXEFxkOuHGmYJ2g70j7Lj9CAAn7mXTL\n        HOZ7/aFkTU8EyJItjQjX2vfc+5HZ0+A6xJ8FHTmsHZW/wUIQFKrCTfXAWRBuI//yfwOr2okgK7imqTrY\n        BP4C4Tb4L/+cS6ADyA6ua6J6rL4OgnAb/pfr4zKYCqqB/2nKBe4HTD47wUlw6l+uiVSwBLwLyoMMk/e/\n        07/Tv9O/0/93k8/3/wAELnmClucj0gAAAABJRU5ErkJggg==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/CharacterDeletionWindow.Designer.cs",
    "content": "﻿namespace EVEMon.ApiCredentialsManagement\n{\n    partial class CharacterDeletionWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterDeletionWindow));\n            System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(\"123456\");\n            System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem(\"234567\");\n            System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem(\"3456789\");\n            System.Windows.Forms.ListViewItem listViewItem4 = new System.Windows.Forms.ListViewItem(\"123123123\");\n            System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem(\"455345\");\n            System.Windows.Forms.ListViewItem listViewItem6 = new System.Windows.Forms.ListViewItem(\"1234553234\");\n            System.Windows.Forms.ListViewItem listViewItem7 = new System.Windows.Forms.ListViewItem(\"1235435\");\n            System.Windows.Forms.ListViewItem listViewItem8 = new System.Windows.Forms.ListViewItem(\"12314124\");\n            System.Windows.Forms.ListViewItem listViewItem9 = new System.Windows.Forms.ListViewItem(\"1235454\");\n            System.Windows.Forms.ListViewItem listViewItem10 = new System.Windows.Forms.ListViewItem(\"45656456\");\n            this.pictureBox1 = new System.Windows.Forms.PictureBox();\n            this.characterToRemoveLabel = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.cancelButton = new System.Windows.Forms.Button();\n            this.deleteButton = new System.Windows.Forms.Button();\n            this.noCharactersLabel = new System.Windows.Forms.Label();\n            this.esiKeysListView = new System.Windows.Forms.ListView();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();\n            this.SuspendLayout();\n            // \n            // pictureBox1\n            // \n            this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox1.Image\")));\n            this.pictureBox1.Location = new System.Drawing.Point(13, 13);\n            this.pictureBox1.Name = \"pictureBox1\";\n            this.pictureBox1.Size = new System.Drawing.Size(32, 32);\n            this.pictureBox1.TabIndex = 0;\n            this.pictureBox1.TabStop = false;\n            // \n            // characterToRemoveLabel\n            // \n            this.characterToRemoveLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.characterToRemoveLabel.AutoSize = true;\n            this.characterToRemoveLabel.ForeColor = System.Drawing.SystemColors.ControlText;\n            this.characterToRemoveLabel.Location = new System.Drawing.Point(51, 22);\n            this.characterToRemoveLabel.Name = \"characterToRemoveLabel\";\n            this.characterToRemoveLabel.Size = new System.Drawing.Size(214, 13);\n            this.characterToRemoveLabel.TabIndex = 1;\n            this.characterToRemoveLabel.Text = \"You are about to delete the character \\\"{0}\\\".\";\n            this.characterToRemoveLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.ForeColor = System.Drawing.Color.DarkRed;\n            this.label2.Location = new System.Drawing.Point(51, 44);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(168, 13);\n            this.label2.TabIndex = 2;\n            this.label2.Text = \"All your data and plans will be lost!\";\n            // \n            // cancelButton\n            // \n            this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.cancelButton.Location = new System.Drawing.Point(327, 142);\n            this.cancelButton.Name = \"cancelButton\";\n            this.cancelButton.Size = new System.Drawing.Size(75, 23);\n            this.cancelButton.TabIndex = 3;\n            this.cancelButton.Text = \"&Cancel\";\n            this.cancelButton.UseVisualStyleBackColor = true;\n            this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);\n            // \n            // deleteButton\n            // \n            this.deleteButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.deleteButton.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.deleteButton.Location = new System.Drawing.Point(246, 142);\n            this.deleteButton.Name = \"deleteButton\";\n            this.deleteButton.Size = new System.Drawing.Size(75, 23);\n            this.deleteButton.TabIndex = 4;\n            this.deleteButton.Text = \"&Delete\";\n            this.deleteButton.UseVisualStyleBackColor = true;\n            this.deleteButton.Click += new System.EventHandler(this.deleteButton_Click);\n            // \n            // noCharactersLabel\n            // \n            this.noCharactersLabel.AutoSize = true;\n            this.noCharactersLabel.Location = new System.Drawing.Point(51, 66);\n            this.noCharactersLabel.Name = \"noCharactersLabel\";\n            this.noCharactersLabel.Size = new System.Drawing.Size(181, 13);\n            this.noCharactersLabel.TabIndex = 6;\n            this.noCharactersLabel.Text = \"The ESI key{0} will also be removed:\";\n            // \n            // esiKeysListView\n            // \n            this.esiKeysListView.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.esiKeysListView.Items.AddRange(new System.Windows.Forms.ListViewItem[] {\n            listViewItem1,\n            listViewItem2,\n            listViewItem3,\n            listViewItem4,\n            listViewItem5,\n            listViewItem6,\n            listViewItem7,\n            listViewItem8,\n            listViewItem9,\n            listViewItem10});\n            this.esiKeysListView.Location = new System.Drawing.Point(238, 66);\n            this.esiKeysListView.Name = \"esiKeysListView\";\n            this.esiKeysListView.Size = new System.Drawing.Size(192, 94);\n            this.esiKeysListView.TabIndex = 7;\n            this.esiKeysListView.UseCompatibleStateImageBehavior = false;\n            this.esiKeysListView.View = System.Windows.Forms.View.List;\n            // \n            // CharacterDeletionWindow\n            // \n            this.AcceptButton = this.cancelButton;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.SystemColors.Window;\n            this.ClientSize = new System.Drawing.Size(414, 177);\n            this.Controls.Add(this.noCharactersLabel);\n            this.Controls.Add(this.deleteButton);\n            this.Controls.Add(this.cancelButton);\n            this.Controls.Add(this.label2);\n            this.Controls.Add(this.characterToRemoveLabel);\n            this.Controls.Add(this.pictureBox1);\n            this.Controls.Add(this.esiKeysListView);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"CharacterDeletionWindow\";\n            this.Text = \"Delete Character\";\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.PictureBox pictureBox1;\n        private System.Windows.Forms.Label characterToRemoveLabel;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Button cancelButton;\n        private System.Windows.Forms.Button deleteButton;\n        private System.Windows.Forms.Label noCharactersLabel;\n        private System.Windows.Forms.ListView esiKeysListView;\n    }\n}"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/CharacterDeletionWindow.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.ApiCredentialsManagement\n{\n    public partial class CharacterDeletionWindow : EVEMonForm\n    {\n        private readonly Character m_character;\n        private List<ESIKey> m_esiKeys;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        private CharacterDeletionWindow()\n        {\n            InitializeComponent();\n            characterToRemoveLabel.Font = FontFactory.GetFont(\"Tahoma\", FontStyle.Bold);\n        }\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        public CharacterDeletionWindow(Character character)\n            : this()\n        {\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Occurs when the control loads.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode)\n                return;\n\n            esiKeysListView.Items.Clear();\n\n            // Replaces end of text with character's name\n            characterToRemoveLabel.Text = string.Format(CultureConstants.DefaultCulture,\n                characterToRemoveLabel.Text, m_character.Name);\n\n            // Find the API keys bind only to this character\n            m_esiKeys = EveMonClient.ESIKeys.Select(apiKey => new\n            {\n                apiKey, identities = apiKey.CharacterIdentities\n            }).Where(apiKey => apiKey.identities.Count() == 1 && apiKey.identities.\n                Contains(m_character.Identity)).Select(apiKey => apiKey.apiKey).ToList();\n\n            esiKeysListView.Items.AddRange(m_esiKeys.Select(key => new ListViewItem(\n                key.ID.ToString(CultureConstants.DefaultCulture))).ToArray());\n\n            // Checks whether there will be no characters left after this deletion and hide/display the relevant labels\n            bool noCharactersLeft = m_esiKeys.Any() && m_character is CCPCharacter;\n            noCharactersLabel.Text = string.Format(CultureConstants.DefaultCulture,\n                noCharactersLabel.Text, m_esiKeys.Count.S());\n\n            noCharactersLabel.Visible = noCharactersLeft;\n\n            // Resize window if there is no ESI key to remove\n            if (!noCharactersLeft)\n                Size = new Size(Size.Width, Size.Height - esiKeysListView.Height / 2);\n        }\n\n        /// <summary>\n        /// Delete button click.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void deleteButton_Click(object sender, EventArgs e)\n        {\n            // Always clear the ESI keys since keys are locked to a character\n            // Note: Keep this order of removal\n            m_esiKeys.ForEach(apiKey => EveMonClient.ESIKeys.Remove(apiKey));\n            EveMonClient.Characters.Remove(m_character);\n            Close();\n        }\n\n        /// <summary>\n        /// Closes the window.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cancelButton_Click(object sender, EventArgs e)\n        {\n            Close();\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/CharacterDeletionWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"pictureBox1.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAA\n        4wAAAOMBD+bfpwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAfaSURBVFhHnZd7\n        UFTXHccPTxGRN4rWmKbG94O05p0ZMyZR7JiJbdrRaZ3pDE39w2knJZnYNmlMizUSRAiY+EBDTQJG5CFv\n        UDRS2CUFkiDEgDxkQZbHsg92997dZRdYvv2dw6Og18fkzHyGub9zz/1+f7/zO/cuDMAPQipjT1rLWKM2\n        h+2XSpmH0j0PgmLwfpD4XKncc8B97SXYr4RDlcpeU7rvQVAM3g8y8KZTtQzo/wRj13diMI+1RYYyf6V7\n        74di8F6QuD9lr3Pf+D1grcG4NhX2ywtQlcz2Kt1/PxSD94IMvOVUPQoMnAHMVwFTCcYad2Awl3X8kCoo\n        Bu8Gic+Tyjz17lbacnMliZcBhgsY74qDvSICqmT2J6V190IxeDeo2//qrF5Be59O4hdJPB8YPEfVSMfo\n        tW3Qn2edqx9iAUpr74ZiUAkSD5BKvYzu1j8AQ5dIvJDEs0j8U6DvBNxtb8B+KRzqJPZnpfV3QzGohFTC\n        3naqV5LYacBYBEoXsKjJwOeANgW4dQgj9ZthyGJdT69i85WeoYRi8HZIfD5lP+S+Qdkbi0k8h8SraIrG\n        cBeJJwBd/8TY9zGwl4Wh5gh7k697EBSDt0MG3nWqV9HenyTxXEB3FiOOQTQ1NWF0dJSq8AnQ+TbQEQtX\n        7bMwfMFuPb6cBSo963YUgzMh8SCpxMs8foM6nzoeg2fF8duzZw+tZli5ciVshkYSp6Tb9oojaSsJwVeJ\n        bJ/S825HMTgTqZi951StAXo/mux4Ov+jQ9i0aZMwwKmqou3oSQRa6eXU/Bu4ajbCeJZpN69nQUrPnIli\n        cAoSD5ZLvC3j/NyLjifxoSs0BURHR08bUKlUgK0ZaNkNfP8qxuqfh1wUjNrD7G9Tz7obisEppCIW51Kv\n        pexTSfwzOgFpIns+duzYMW2goaFBxKB5F/huO9D4ApzVa2DMYH3bfsZCaEbx+RzFIIfEQ+Rib0nsvY6O\n        Wv8puA3lNDUxdu3aNW2gvb19Iig3kfhLQMNzGP1qA+SCINQlsL/TjKIGRzHIkQrZQZd6He1tEonT2ace\n        cNl1NDUxYmJipg309fVNRoHxtj8C3zxObMRw5XIYP2P9rzzBwmhKUUcxSOKhcrGPPN5C554+uej9GK6B\n        QgwPD9P0xIiNjZ02YLVaJ6N8h+qEOGdUvR62/Pn4OoG9R1OKWopBMnDIRYvdDdsoI3qz9iTDbOiC3W6H\n        2+2mW4C4uLhpA2NjYyLGh9PpxGjzaxhRrcNQ3hLYKpbAdIYN7nyWhdP0HVp3BEg8XC7ysbmvbaV9jMII\n        GbE0vgO9Xg9ZlidePDRSU1OFuJ+fn7jmY3x8HA6HAybNZWqbCPR/GgZTXiTk3AB8E88O0C136N0RkApY\n        gsi+/hlRQmd1FHo6aqHT6WCxWESGXCgjI0MYCA/niU2MkZERYdJgMKCvaDv6/x2KvvRgyOWRMKUz/W+f\n        Ywvotll6sy5IPEIu9LGL7Gs2iDLq615HZ2enaDSTyQSbzSaqoNVq4eXlhX37+AsPYmt4j3CT3OytpkIS\n        D4H2VBB9oMIg5czFt/HsIJmepTnrQspniS71BrjrnhGld1ZFoe27KnR0dAhBvg284bgQN8GN8ZJzcZfL\n        JbLnJvv7+6HRaNCdEw1tWiBunQiAVBKGodPMGPM8WzhTc6b4QsreMZW9q5pnH4vm5ma0traiu7sbAwMD\n        QoALcSPHjx9HZmam2BbeoDx7bpKb5aZba7PRc2I+uo/Ngy4zEFLWHDS8z+JnVmGmgWSXagPGap8WpXdW\n        P4a26yphgMOz7e3tFQJmsxlpaWmiBzh1dXVC3Gg0iuy7urqEab5OkxWN7o/8oTnqB0tRIIbSmGnvi2zR\n        LAMkHikX+g67G7aI0ruq1kJf+8a0OKetrU1UgQvwJktJSRHiHh4ewgAX53vf09ODmzdvTq+78d9sdB2d\n        i84P59Cp8If0hQ+uHWSHp6owYeACSxlRR2Gs7ilReud/1qD368RZBlpaWsSDuQA3wbdj9+7d2L9/v6gK\n        F+cV4tlzs9Nrm+qhSfFDZ7IvOo54w5zvx6tgfn0rWywMkPhiucDXKbJXTWQ/fHU17F+ug7FqJ/SVxNVf\n        Y/AKcflX0NNfPf9bQdeXXoWu/JcYKP0FHbtXoC3Yjp68n0Nzfis6s7ag8+yL6Dz1qMj+5hEftB/2gva0\n        D6yZXmg8wJJ4FZiUx46OqB7DaO2TlP1aOCvXwPHlKvpnYwVsF5dDLlsGa/EjsBQ+TO6XwpS7BMbsxTCc\n        W0S/TRZClxFBv0vD0Ednvvd0sOh60XgfzxOl16SQeBJln+iN9g880RrvgaFcqsQJZondypYwa65Xvbtx\n        Oxl4CiM1T8Cl3kjH76dwVEbBcXU9GVkLuWI1pPIVsJYuh6VkGcyFP8YQN3OBzOSQmfOR0J9bQIbCqdtD\n        6csdjL4zgehND6CM56InzY+Ooi+dBm9qSE8y7Qnr5wwnf8deZuZslu+oWIrhK8vguPwTOCoegePSw3Bc\n        XApH+UNwlP0IjtLFsJcugr0kEvbiBbAXRhBhsBWE0scmBPIFetvlBdErNxByTgDk7HmQz/tDzvKDdG4O\n        4UvN5w2JSm/NJPEMD1hOsuF3XmabWXUC87l+jP2lIZUdb0ghPiSSJ0kijswgkTg8SQLxwSTxxKEZvE8c\n        JP41yQEi7v98+w927K1tbAtjLPB/l3OEO2LTS/UAAAAASUVORK5CYII=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/CharacterImportationWindow.Designer.cs",
    "content": "﻿using EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.ApiCredentialsManagement\n{\n    partial class CharacterImportationWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.labelName = new System.Windows.Forms.Label();\n            this.labelErrorHeader = new System.Windows.Forms.Label();\n            this.urlRadio = new System.Windows.Forms.RadioButton();\n            this.urlTextBox = new System.Windows.Forms.TextBox();\n            this.fileRadio = new System.Windows.Forms.RadioButton();\n            this.fileTextBox = new System.Windows.Forms.TextBox();\n            this.fileButton = new System.Windows.Forms.Button();\n            this.urlThrobber = new EVEMon.Common.Controls.Throbber();\n            this.namePanel = new System.Windows.Forms.Panel();\n            this.nameTextBox = new System.Windows.Forms.TextBox();\n            this.errorPanel = new System.Windows.Forms.FlowLayoutPanel();\n            this.labelError = new System.Windows.Forms.Label();\n            this.okButton = new System.Windows.Forms.Button();\n            this.cancelButton = new System.Windows.Forms.Button();\n            this.delayQueryTimer = new System.Windows.Forms.Timer(this.components);\n            ((System.ComponentModel.ISupportInitialize)(this.urlThrobber)).BeginInit();\n            this.namePanel.SuspendLayout();\n            this.errorPanel.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // labelName\n            // \n            this.labelName.AutoSize = true;\n            this.labelName.Location = new System.Drawing.Point(5, 7);\n            this.labelName.Name = \"labelName\";\n            this.labelName.Size = new System.Drawing.Size(35, 13);\n            this.labelName.TabIndex = 0;\n            this.labelName.Text = \"Name\";\n            // \n            // labelErrorHeader\n            // \n            this.labelErrorHeader.AutoSize = true;\n            this.labelErrorHeader.ForeColor = System.Drawing.Color.DarkRed;\n            this.labelErrorHeader.Location = new System.Drawing.Point(3, 0);\n            this.labelErrorHeader.Name = \"labelErrorHeader\";\n            this.labelErrorHeader.Size = new System.Drawing.Size(260, 13);\n            this.labelErrorHeader.TabIndex = 8;\n            this.labelErrorHeader.Text = \"An error occurred while trying to import this character :\";\n            // \n            // urlRadio\n            // \n            this.urlRadio.AutoSize = true;\n            this.urlRadio.Checked = true;\n            this.urlRadio.Location = new System.Drawing.Point(13, 13);\n            this.urlRadio.Name = \"urlRadio\";\n            this.urlRadio.Size = new System.Drawing.Size(69, 17);\n            this.urlRadio.TabIndex = 0;\n            this.urlRadio.TabStop = true;\n            this.urlRadio.Text = \"Use URL\";\n            this.urlRadio.UseVisualStyleBackColor = true;\n            this.urlRadio.CheckedChanged += new System.EventHandler(this.radio_CheckedChanged);\n            // \n            // urlTextBox\n            // \n            this.urlTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.urlTextBox.Location = new System.Drawing.Point(85, 13);\n            this.urlTextBox.Name = \"urlTextBox\";\n            this.urlTextBox.Size = new System.Drawing.Size(457, 20);\n            this.urlTextBox.TabIndex = 1;\n            // \n            // fileRadio\n            // \n            this.fileRadio.AutoSize = true;\n            this.fileRadio.Location = new System.Drawing.Point(13, 49);\n            this.fileRadio.Name = \"fileRadio\";\n            this.fileRadio.Size = new System.Drawing.Size(63, 17);\n            this.fileRadio.TabIndex = 2;\n            this.fileRadio.TabStop = true;\n            this.fileRadio.Text = \"Use File\";\n            this.fileRadio.UseVisualStyleBackColor = true;\n            this.fileRadio.CheckedChanged += new System.EventHandler(this.radio_CheckedChanged);\n            // \n            // fileTextBox\n            // \n            this.fileTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.fileTextBox.Location = new System.Drawing.Point(85, 49);\n            this.fileTextBox.Name = \"fileTextBox\";\n            this.fileTextBox.ReadOnly = true;\n            this.fileTextBox.Size = new System.Drawing.Size(457, 20);\n            this.fileTextBox.TabIndex = 3;\n            // \n            // fileButton\n            // \n            this.fileButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.fileButton.Location = new System.Drawing.Point(548, 47);\n            this.fileButton.Name = \"fileButton\";\n            this.fileButton.Size = new System.Drawing.Size(29, 23);\n            this.fileButton.TabIndex = 4;\n            this.fileButton.Text = \"...\";\n            this.fileButton.UseVisualStyleBackColor = true;\n            this.fileButton.Click += new System.EventHandler(this.fileButton_Click);\n            // \n            // urlThrobber\n            // \n            this.urlThrobber.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.urlThrobber.Location = new System.Drawing.Point(548, 10);\n            this.urlThrobber.MaximumSize = new System.Drawing.Size(24, 24);\n            this.urlThrobber.MinimumSize = new System.Drawing.Size(24, 24);\n            this.urlThrobber.Name = \"urlThrobber\";\n            this.urlThrobber.Size = new System.Drawing.Size(24, 24);\n            this.urlThrobber.State = ThrobberState.Stopped;\n            this.urlThrobber.TabIndex = 5;\n            this.urlThrobber.TabStop = false;\n            // \n            // namePanel\n            // \n            this.namePanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.namePanel.Controls.Add(this.nameTextBox);\n            this.namePanel.Controls.Add(this.labelName);\n            this.namePanel.Location = new System.Drawing.Point(85, 87);\n            this.namePanel.Name = \"namePanel\";\n            this.namePanel.Size = new System.Drawing.Size(280, 31);\n            this.namePanel.TabIndex = 5;\n            // \n            // nameTextBox\n            // \n            this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.nameTextBox.Location = new System.Drawing.Point(45, 4);\n            this.nameTextBox.Name = \"nameTextBox\";\n            this.nameTextBox.Size = new System.Drawing.Size(232, 20);\n            this.nameTextBox.TabIndex = 1;\n            // \n            // errorPanel\n            // \n            this.errorPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.errorPanel.Controls.Add(this.labelErrorHeader);\n            this.errorPanel.Controls.Add(this.labelError);\n            this.errorPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.errorPanel.Location = new System.Drawing.Point(80, 87);\n            this.errorPanel.Name = \"errorPanel\";\n            this.errorPanel.Size = new System.Drawing.Size(492, 31);\n            this.errorPanel.TabIndex = 9;\n            // \n            // labelError\n            // \n            this.labelError.AutoSize = true;\n            this.labelError.ForeColor = System.Drawing.Color.DarkRed;\n            this.labelError.Location = new System.Drawing.Point(3, 13);\n            this.labelError.Name = \"labelError\";\n            this.labelError.Size = new System.Drawing.Size(35, 13);\n            this.labelError.TabIndex = 9;\n            this.labelError.Text = \"label2\";\n            // \n            // okButton\n            // \n            this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.okButton.Location = new System.Drawing.Point(416, 126);\n            this.okButton.Name = \"okButton\";\n            this.okButton.Size = new System.Drawing.Size(75, 23);\n            this.okButton.TabIndex = 6;\n            this.okButton.Text = \"OK\";\n            this.okButton.UseVisualStyleBackColor = true;\n            this.okButton.Click += new System.EventHandler(this.okButton_Click);\n            // \n            // cancelButton\n            // \n            this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.cancelButton.Location = new System.Drawing.Point(497, 126);\n            this.cancelButton.Name = \"cancelButton\";\n            this.cancelButton.Size = new System.Drawing.Size(75, 23);\n            this.cancelButton.TabIndex = 7;\n            this.cancelButton.Text = \"Cancel\";\n            this.cancelButton.UseVisualStyleBackColor = true;\n            // \n            // delayQueryTimer\n            // \n            this.delayQueryTimer.Interval = 400;\n            this.delayQueryTimer.Tick += new System.EventHandler(this.delayQueryTimer_Tick);\n            // \n            // CharacterImportationWindow\n            // \n            this.AcceptButton = this.okButton;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.SystemColors.Window;\n            this.CancelButton = this.cancelButton;\n            this.ClientSize = new System.Drawing.Size(589, 161);\n            this.Controls.Add(this.cancelButton);\n            this.Controls.Add(this.okButton);\n            this.Controls.Add(this.errorPanel);\n            this.Controls.Add(this.namePanel);\n            this.Controls.Add(this.urlThrobber);\n            this.Controls.Add(this.fileButton);\n            this.Controls.Add(this.fileTextBox);\n            this.Controls.Add(this.fileRadio);\n            this.Controls.Add(this.urlTextBox);\n            this.Controls.Add(this.urlRadio);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.MinimumSize = new System.Drawing.Size(597, 193);\n            this.Name = \"CharacterImportationWindow\";\n            this.Text = \"Character Importation\";\n            ((System.ComponentModel.ISupportInitialize)(this.urlThrobber)).EndInit();\n            this.namePanel.ResumeLayout(false);\n            this.namePanel.PerformLayout();\n            this.errorPanel.ResumeLayout(false);\n            this.errorPanel.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n        #endregion\n\n        private System.Windows.Forms.RadioButton urlRadio;\n        private System.Windows.Forms.TextBox urlTextBox;\n        private System.Windows.Forms.RadioButton fileRadio;\n        private System.Windows.Forms.TextBox fileTextBox;\n        private System.Windows.Forms.Button fileButton;\n        private Throbber urlThrobber;\n        private System.Windows.Forms.Panel namePanel;\n        private System.Windows.Forms.TextBox nameTextBox;\n        private System.Windows.Forms.Button okButton;\n        private System.Windows.Forms.Button cancelButton;\n        private System.Windows.Forms.Timer delayQueryTimer;\n        private System.Windows.Forms.FlowLayoutPanel errorPanel;\n        private System.Windows.Forms.Label labelError;\n        private System.Windows.Forms.Label labelErrorHeader;\n        private System.Windows.Forms.Label labelName;\n    }\n}"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/CharacterImportationWindow.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\n\nusing EVEMon.Common.Collections.Global;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.ApiCredentialsManagement\n{\n    /// <summary>\n    /// A windows to import characters from files or urls.\n    /// </summary>\n    public partial class CharacterImportationWindow : EVEMonForm\n    {\n        // When multiple downloads are fired, we only want to react to the latest one, this is done through versioning.\n        private int m_version;\n        private UriCharacterEventArgs m_args;\n        private UriCharacter m_uriCharacter;\n\n        /// <summary>\n        /// Constructor for a new character creation.\n        /// </summary>\n        public CharacterImportationWindow()\n        {\n            InitializeComponent();\n            errorPanel.Visible = false;\n            namePanel.Visible = false;\n            okButton.Enabled = false;\n        }\n\n        /// <summary>\n        /// Constructor to update a character.\n        /// </summary>\n        public CharacterImportationWindow(UriCharacter uriCharacter)\n            : this()\n        {\n            m_uriCharacter = uriCharacter;\n        }\n\n        /// <summary>\n        /// On load, subscribe events.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            urlTextBox.TextChanged += urlTextBox_TextChanged;\n\n            if (m_uriCharacter == null)\n                return;\n\n            if (m_uriCharacter.Uri.IsFile)\n            {\n                fileTextBox.Text = m_uriCharacter.Uri.ToString();\n                fileRadio.Checked = true;\n            }\n            else\n            {\n                urlTextBox.Text = m_uriCharacter.Uri.ToString();\n                urlRadio.Checked = true;\n            }\n        }\n\n        /// <summary>\n        /// Enable or disable the proper controls when the user changes the radio buttons.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void radio_CheckedChanged(object sender, EventArgs e)\n        {\n            urlTextBox.Enabled = urlRadio.Checked;\n            urlThrobber.Enabled = urlRadio.Checked;\n\n            fileButton.Enabled = fileRadio.Checked;\n            fileTextBox.Enabled = fileRadio.Checked;\n        }\n\n        /// <summary>\n        /// When the users changes the url, we query from the web.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void urlTextBox_TextChanged(object sender, EventArgs e)\n        {\n            delayQueryTimer.Stop();\n            delayQueryTimer.Start();\n        }\n\n        /// <summary>\n        /// We would like to check the provided url anytime the url textbox changes but it would be stressful, so we only do it when the user didn't type \n        /// anything in the last 400ms. Once this timer expires, we do the check.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void delayQueryTimer_Tick(object sender, EventArgs e)\n        {\n            await TryUri(urlTextBox.Text);\n        }\n\n        /// <summary>\n        /// When the users clicks the \"...\" button, we open a file selection dialog, then try to read the specified XML.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void fileButton_Click(object sender, EventArgs e)\n        {\n            using (OpenFileDialog form = new OpenFileDialog())\n            {\n                form.Title = @\"Import character file\";\n                form.Filter = @\"CCP XML Character (*.xml)|*.xml\";\n                form.FilterIndex = 0;\n\n                DialogResult dr = form.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n\n                fileTextBox.Text = form.FileName;\n                fileRadio.Checked = true;\n                await TryUri(form.FileName);\n            }\n        }\n\n        /// <summary>\n        /// Try to download a character XML from the given URI.\n        /// </summary>\n        /// <param name=\"uri\"></param>\n        private async Task TryUri(string uri)\n        {\n            m_version++;\n            m_args = null;\n\n            // Update controls\n            okButton.Enabled = false;\n            namePanel.Visible = false;\n            errorPanel.Visible = false;\n            urlThrobber.State = ThrobberState.Rotating;\n\n            // Starts querying the web or the hard drive, and invokes the given callback on result\n            int version = m_version;\n            var result = await GlobalCharacterCollection.TryAddOrUpdateFromUriAsync(new Uri(uri));\n            if (version != m_version)\n                return;\n\n            urlThrobber.State = ThrobberState.Stopped;\n\n            // Was there an error ?\n            if (result.HasError)\n            {\n                okButton.Enabled = false;\n                errorPanel.Visible = true;\n                labelError.Text = result.Error;\n                return;\n            }\n\n            nameTextBox.Text = result.CharacterName;\n            namePanel.Visible = true;\n            okButton.Enabled = true;\n            m_args = result;\n        }\n\n        /// <summary>\n        /// When the user clicks the OK button, we may have to generate the character\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void okButton_Click(object sender, EventArgs e)\n        {\n            // Shouldn't occur but, well...\n            if (m_args == null || m_args.HasError)\n            {\n                DialogResult = DialogResult.Cancel;\n                return;\n            }\n\n            // Generates or updates the character\n            if (m_uriCharacter == null)\n                m_uriCharacter = m_args.CreateCharacter();\n            else\n                m_args.UpdateCharacter(m_uriCharacter);\n\n            m_uriCharacter.Name = nameTextBox.Text;\n\n            DialogResult = DialogResult.OK;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/CharacterImportationWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"delayQueryTimer.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/EsiKeyDeletionWindow.Designer.cs",
    "content": "﻿namespace EVEMon.ApiCredentialsManagement\n{\n    sealed partial class EsiKeyDeletionWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(\"John Doe\");\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EsiKeyDeletionWindow));\n            this.deletionLabel = new System.Windows.Forms.Label();\n            this.cancelButton = new System.Windows.Forms.Button();\n            this.deleteButton = new System.Windows.Forms.Button();\n            this.charactersListView = new System.Windows.Forms.ListView();\n            this.pictureBox = new System.Windows.Forms.PictureBox();\n            this.infoLabel = new System.Windows.Forms.Label();\n            this.deleteWarningLabel = new System.Windows.Forms.Label();\n            this.charactersListGroupBox = new System.Windows.Forms.GroupBox();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();\n            this.charactersListGroupBox.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // deletionLabel\n            // \n            this.deletionLabel.AutoSize = true;\n            this.deletionLabel.Location = new System.Drawing.Point(51, 22);\n            this.deletionLabel.Name = \"deletionLabel\";\n            this.deletionLabel.Size = new System.Drawing.Size(238, 13);\n            this.deletionLabel.TabIndex = 4;\n            this.deletionLabel.Text = \"You are about to delete the ESI key with ID : {0}.\";\n            this.deletionLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // cancelButton\n            // \n            this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.cancelButton.Location = new System.Drawing.Point(435, 180);\n            this.cancelButton.Name = \"cancelButton\";\n            this.cancelButton.Size = new System.Drawing.Size(75, 23);\n            this.cancelButton.TabIndex = 0;\n            this.cancelButton.Text = \"&Cancel\";\n            this.cancelButton.UseVisualStyleBackColor = true;\n            // \n            // deleteButton\n            // \n            this.deleteButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.deleteButton.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.deleteButton.Location = new System.Drawing.Point(354, 180);\n            this.deleteButton.Name = \"deleteButton\";\n            this.deleteButton.Size = new System.Drawing.Size(75, 23);\n            this.deleteButton.TabIndex = 1;\n            this.deleteButton.Text = \"&Delete\";\n            this.deleteButton.UseVisualStyleBackColor = true;\n            this.deleteButton.Click += new System.EventHandler(this.deleteButton_Click);\n            // \n            // charactersListView\n            // \n            this.charactersListView.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.charactersListView.CheckBoxes = true;\n            listViewItem1.StateImageIndex = 0;\n            this.charactersListView.Items.AddRange(new System.Windows.Forms.ListViewItem[] {\n            listViewItem1});\n            this.charactersListView.Location = new System.Drawing.Point(308, 28);\n            this.charactersListView.Name = \"charactersListView\";\n            this.charactersListView.Size = new System.Drawing.Size(181, 77);\n            this.charactersListView.TabIndex = 2;\n            this.charactersListView.UseCompatibleStateImageBehavior = false;\n            this.charactersListView.View = System.Windows.Forms.View.List;\n            // \n            // pictureBox\n            // \n            this.pictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox.Image\")));\n            this.pictureBox.Location = new System.Drawing.Point(13, 13);\n            this.pictureBox.Name = \"pictureBox\";\n            this.pictureBox.Size = new System.Drawing.Size(32, 32);\n            this.pictureBox.TabIndex = 3;\n            this.pictureBox.TabStop = false;\n            // \n            // infoLabel\n            // \n            this.infoLabel.Location = new System.Drawing.Point(6, 28);\n            this.infoLabel.Name = \"infoLabel\";\n            this.infoLabel.Size = new System.Drawing.Size(296, 48);\n            this.infoLabel.TabIndex = 6;\n            this.infoLabel.Text = \"If you choose to leave your character, it will be displayed as cached and automat\" +\n    \"ically reconnected once it is found on another one of your ESI keys.\";\n            // \n            // deleteWarningLabel\n            // \n            this.deleteWarningLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.deleteWarningLabel.ForeColor = System.Drawing.Color.DarkRed;\n            this.deleteWarningLabel.Location = new System.Drawing.Point(6, 90);\n            this.deleteWarningLabel.Name = \"deleteWarningLabel\";\n            this.deleteWarningLabel.Size = new System.Drawing.Size(304, 15);\n            this.deleteWarningLabel.TabIndex = 7;\n            this.deleteWarningLabel.Text = \"Removing characters means losing all their data and plans!\";\n            // \n            // charactersListGroupBox\n            // \n            this.charactersListGroupBox.Controls.Add(this.deleteWarningLabel);\n            this.charactersListGroupBox.Controls.Add(this.infoLabel);\n            this.charactersListGroupBox.Controls.Add(this.charactersListView);\n            this.charactersListGroupBox.Location = new System.Drawing.Point(15, 60);\n            this.charactersListGroupBox.Name = \"charactersListGroupBox\";\n            this.charactersListGroupBox.Size = new System.Drawing.Size(495, 114);\n            this.charactersListGroupBox.TabIndex = 8;\n            this.charactersListGroupBox.TabStop = false;\n            this.charactersListGroupBox.Text = \"Select the characters you want to remove\";\n            // \n            // EsiKeyDeletionWindow\n            // \n            this.AcceptButton = this.cancelButton;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.SystemColors.Window;\n            this.CancelButton = this.cancelButton;\n            this.ClientSize = new System.Drawing.Size(522, 215);\n            this.Controls.Add(this.charactersListGroupBox);\n            this.Controls.Add(this.deletionLabel);\n            this.Controls.Add(this.pictureBox);\n            this.Controls.Add(this.deleteButton);\n            this.Controls.Add(this.cancelButton);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;\n            this.Name = \"EsiKeyDeletionWindow\";\n            this.Text = \"Delete an ESI key\";\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();\n            this.charactersListGroupBox.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Button cancelButton;\n        private System.Windows.Forms.Button deleteButton;\n        private System.Windows.Forms.ListView charactersListView;\n        private System.Windows.Forms.PictureBox pictureBox;\n        private System.Windows.Forms.Label infoLabel;\n        private System.Windows.Forms.Label deleteWarningLabel;\n        private System.Windows.Forms.GroupBox charactersListGroupBox;\n        private System.Windows.Forms.Label deletionLabel;\n    }\n}"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/EsiKeyDeletionWindow.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.ApiCredentialsManagement\n{\n    public sealed partial class EsiKeyDeletionWindow : EVEMonForm\n    {\n        private readonly ESIKey m_apiKey;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        private EsiKeyDeletionWindow()\n        {\n            InitializeComponent();\n            deletionLabel.Font = FontFactory.GetFont(\"Tahoma\", FontStyle.Bold);\n        }\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"esiKey\">The ESI key.</param>\n        /// <exception cref=\"System.ArgumentNullException\">esiKey</exception>\n        public EsiKeyDeletionWindow(ESIKey esiKey)\n            : this()\n        {\n            esiKey.ThrowIfNull(nameof(esiKey), \"ESI key can't be null\");\n\n            m_apiKey = esiKey;\n        }\n\n        /// <summary>\n        /// Occurs when the control loads.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode)\n                return;\n\n            charactersListView.ItemCheck += charactersListView_ItemCheck;\n            deletionLabel.Text = string.Format(CultureConstants.DefaultCulture, deletionLabel.Text, m_apiKey.ID);\n\n            // Add characters\n            charactersListView.Items.Clear();\n\n            foreach (ListViewItem item in m_apiKey.CharacterIdentities.Select(\n                id => new ListViewItem(id.CharacterName)\n                          {\n                              Tag = id.CCPCharacter,\n                              Checked = id.CCPCharacter != null &&\n                                        id.CCPCharacter.Identity.ESIKeys.All(key => key == m_apiKey),\n                          }))\n            {\n                // Gray out a character with another associated API key\n                if (!item.Checked)\n                    item.ForeColor = SystemColors.GrayText;\n\n                // Strikeout and gray out a character in the API key's ignored list\n                if (item.Tag == null)\n                {\n                    item.Font = FontFactory.GetFont(Font, FontStyle.Strikeout);\n                    item.ForeColor = SystemColors.GrayText;\n                    item.Checked = true;\n                }\n\n                charactersListView.Items.Add(item);\n            }\n\n            // If character list is empty resize the window\n            if (charactersListView.Items.Count != 0)\n                return;\n\n            charactersListGroupBox.Visible = false;\n            Size = new Size(Size.Width - charactersListGroupBox.Height / 2, Size.Height - charactersListGroupBox.Height);\n        }\n\n        /// <summary>\n        /// Handles the ItemCheck event of the charactersListView control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.ItemCheckEventArgs\"/> instance containing the event data.</param>\n        private void charactersListView_ItemCheck(object sender, ItemCheckEventArgs e)\n        {\n            CCPCharacter ccpCharacter = charactersListView.Items[e.Index].Tag as CCPCharacter;\n            if (ccpCharacter == null)\n                e.NewValue = CheckState.Checked;\n\n            if (ccpCharacter != null && ccpCharacter.Identity.ESIKeys.Any(key => key != m_apiKey))\n                e.NewValue = CheckState.Unchecked;\n        }\n\n        /// <summary>\n        /// \"Delete\" button.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void deleteButton_Click(object sender, EventArgs e)\n        {\n            // Remove the API key\n            EveMonClient.ESIKeys.Remove(m_apiKey);\n\n            // Remove the characters from the collection\n            foreach (CCPCharacter ccpCharacter in charactersListView.Items.Cast<ListViewItem>().Where(\n                item => item.Checked).Select(item => item.Tag as CCPCharacter).Where(\n                    ccpCharacter => ccpCharacter != null).Where(\n                        ccpCharacter => !ccpCharacter.Identity.ESIKeys.Any()))\n            {\n                EveMonClient.Characters.Remove(ccpCharacter);\n            }\n\n            // Closes the window\n            Close();\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/EsiKeyDeletionWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"pictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAA\n        4wAAAOMBD+bfpwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAfaSURBVFhHnZd7\n        UFTXHccPTxGRN4rWmKbG94O05p0ZMyZR7JiJbdrRaZ3pDE39w2knJZnYNmlMizUSRAiY+EBDTQJG5CFv\n        UDRS2CUFkiDEgDxkQZbHsg92997dZRdYvv2dw6Og18fkzHyGub9zz/1+f7/zO/cuDMAPQipjT1rLWKM2\n        h+2XSpmH0j0PgmLwfpD4XKncc8B97SXYr4RDlcpeU7rvQVAM3g8y8KZTtQzo/wRj13diMI+1RYYyf6V7\n        74di8F6QuD9lr3Pf+D1grcG4NhX2ywtQlcz2Kt1/PxSD94IMvOVUPQoMnAHMVwFTCcYad2Awl3X8kCoo\n        Bu8Gic+Tyjz17lbacnMliZcBhgsY74qDvSICqmT2J6V190IxeDeo2//qrF5Be59O4hdJPB8YPEfVSMfo\n        tW3Qn2edqx9iAUpr74ZiUAkSD5BKvYzu1j8AQ5dIvJDEs0j8U6DvBNxtb8B+KRzqJPZnpfV3QzGohFTC\n        3naqV5LYacBYBEoXsKjJwOeANgW4dQgj9ZthyGJdT69i85WeoYRi8HZIfD5lP+S+Qdkbi0k8h8SraIrG\n        cBeJJwBd/8TY9zGwl4Wh5gh7k697EBSDt0MG3nWqV9HenyTxXEB3FiOOQTQ1NWF0dJSq8AnQ+TbQEQtX\n        7bMwfMFuPb6cBSo963YUgzMh8SCpxMs8foM6nzoeg2fF8duzZw+tZli5ciVshkYSp6Tb9oojaSsJwVeJ\n        bJ/S825HMTgTqZi951StAXo/mux4Ov+jQ9i0aZMwwKmqou3oSQRa6eXU/Bu4ajbCeJZpN69nQUrPnIli\n        cAoSD5ZLvC3j/NyLjifxoSs0BURHR08bUKlUgK0ZaNkNfP8qxuqfh1wUjNrD7G9Tz7obisEppCIW51Kv\n        pexTSfwzOgFpIns+duzYMW2goaFBxKB5F/huO9D4ApzVa2DMYH3bfsZCaEbx+RzFIIfEQ+Rib0nsvY6O\n        Wv8puA3lNDUxdu3aNW2gvb19Iig3kfhLQMNzGP1qA+SCINQlsL/TjKIGRzHIkQrZQZd6He1tEonT2ace\n        cNl1NDUxYmJipg309fVNRoHxtj8C3zxObMRw5XIYP2P9rzzBwmhKUUcxSOKhcrGPPN5C554+uej9GK6B\n        QgwPD9P0xIiNjZ02YLVaJ6N8h+qEOGdUvR62/Pn4OoG9R1OKWopBMnDIRYvdDdsoI3qz9iTDbOiC3W6H\n        2+2mW4C4uLhpA2NjYyLGh9PpxGjzaxhRrcNQ3hLYKpbAdIYN7nyWhdP0HVp3BEg8XC7ysbmvbaV9jMII\n        GbE0vgO9Xg9ZlidePDRSU1OFuJ+fn7jmY3x8HA6HAybNZWqbCPR/GgZTXiTk3AB8E88O0C136N0RkApY\n        gsi+/hlRQmd1FHo6aqHT6WCxWESGXCgjI0MYCA/niU2MkZERYdJgMKCvaDv6/x2KvvRgyOWRMKUz/W+f\n        Ywvotll6sy5IPEIu9LGL7Gs2iDLq615HZ2enaDSTyQSbzSaqoNVq4eXlhX37+AsPYmt4j3CT3OytpkIS\n        D4H2VBB9oMIg5czFt/HsIJmepTnrQspniS71BrjrnhGld1ZFoe27KnR0dAhBvg284bgQN8GN8ZJzcZfL\n        JbLnJvv7+6HRaNCdEw1tWiBunQiAVBKGodPMGPM8WzhTc6b4QsreMZW9q5pnH4vm5ma0traiu7sbAwMD\n        QoALcSPHjx9HZmam2BbeoDx7bpKb5aZba7PRc2I+uo/Ngy4zEFLWHDS8z+JnVmGmgWSXagPGap8WpXdW\n        P4a26yphgMOz7e3tFQJmsxlpaWmiBzh1dXVC3Gg0iuy7urqEab5OkxWN7o/8oTnqB0tRIIbSmGnvi2zR\n        LAMkHikX+g67G7aI0ruq1kJf+8a0OKetrU1UgQvwJktJSRHiHh4ewgAX53vf09ODmzdvTq+78d9sdB2d\n        i84P59Cp8If0hQ+uHWSHp6owYeACSxlRR2Gs7ilReud/1qD368RZBlpaWsSDuQA3wbdj9+7d2L9/v6gK\n        F+cV4tlzs9Nrm+qhSfFDZ7IvOo54w5zvx6tgfn0rWywMkPhiucDXKbJXTWQ/fHU17F+ug7FqJ/SVxNVf\n        Y/AKcflX0NNfPf9bQdeXXoWu/JcYKP0FHbtXoC3Yjp68n0Nzfis6s7ag8+yL6Dz1qMj+5hEftB/2gva0\n        D6yZXmg8wJJ4FZiUx46OqB7DaO2TlP1aOCvXwPHlKvpnYwVsF5dDLlsGa/EjsBQ+TO6XwpS7BMbsxTCc\n        W0S/TRZClxFBv0vD0Ednvvd0sOh60XgfzxOl16SQeBJln+iN9g880RrvgaFcqsQJZondypYwa65Xvbtx\n        Oxl4CiM1T8Cl3kjH76dwVEbBcXU9GVkLuWI1pPIVsJYuh6VkGcyFP8YQN3OBzOSQmfOR0J9bQIbCqdtD\n        6csdjL4zgehND6CM56InzY+Ooi+dBm9qSE8y7Qnr5wwnf8deZuZslu+oWIrhK8vguPwTOCoegePSw3Bc\n        XApH+UNwlP0IjtLFsJcugr0kEvbiBbAXRhBhsBWE0scmBPIFetvlBdErNxByTgDk7HmQz/tDzvKDdG4O\n        4UvN5w2JSm/NJPEMD1hOsuF3XmabWXUC87l+jP2lIZUdb0ghPiSSJ0kijswgkTg8SQLxwSTxxKEZvE8c\n        JP41yQEi7v98+w927K1tbAtjLPB/l3OEO2LTS/UAAAAASUVORK5CYII=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/EsiKeyUpdateOrAdditionWindow.Designer.cs",
    "content": "﻿using EVEMon.Common.Controls;\nusing EVEMon.Common.Controls.MultiPanel;\nusing EVEMon.Common.Helpers;\nusing System;\n\nnamespace EVEMon.ApiCredentialsManagement\n{\n    partial class EsiKeyUpdateOrAdditionWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n            try\n            {\n                m_server.Dispose();\n            }\n            catch (Exception ex)\n            {\n                // Do not rethrow while disposing\n                ExceptionHandler.LogException(ex, true);\n            }\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n\t\t\tthis.components = new System.ComponentModel.Container();\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EsiKeyUpdateOrAdditionWindow));\n\t\t\tSystem.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(\"Mary Jane\");\n\t\t\tSystem.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem(\"Ali Baba\");\n\t\t\tSystem.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem(\"John Doe\");\n\t\t\tthis.GuideLabel = new System.Windows.Forms.Label();\n\t\t\tthis.ButtonNext = new System.Windows.Forms.Button();\n\t\t\tthis.ButtonPrevious = new System.Windows.Forms.Button();\n\t\t\tthis.ButtonCancel = new System.Windows.Forms.Button();\n\t\t\tthis.MultiPanel = new EVEMon.Common.Controls.MultiPanel.MultiPanel();\n\t\t\tthis.CredentialsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.Throbber = new EVEMon.Common.Controls.Throbber();\n\t\t\tthis.ButtonESILogin = new System.Windows.Forms.Button();\n\t\t\tthis.ResultPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.KeyTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n\t\t\tthis.KeyLabel = new System.Windows.Forms.Label();\n\t\t\tthis.KeyPicture = new System.Windows.Forms.PictureBox();\n\t\t\tthis.CharactersGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.ResultsMultiPanel = new EVEMon.Common.Controls.MultiPanel.MultiPanel();\n\t\t\tthis.CharactersListPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.CharactersListView = new System.Windows.Forms.ListView();\n\t\t\tthis.WarningLabel = new System.Windows.Forms.Label();\n\t\t\tthis.AuthenticationErrorPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.AuthenticationErrorGuideLabel = new System.Windows.Forms.Label();\n\t\t\tthis.LoginDeniedErrorPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.LoginDeniedLinkLabel = new System.Windows.Forms.LinkLabel();\n\t\t\tthis.GeneralErrorPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.GeneralErrorLabel = new System.Windows.Forms.Label();\n\t\t\tthis.ESITokenFailedErrorPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.ESITokenFailedLabel = new System.Windows.Forms.Label();\n\t\t\tthis.CachedWarningPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.CachedWarningLabel = new System.Windows.Forms.Label();\n\t\t\tthis.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);\n\t\t\tthis.LabelShiftClick = new System.Windows.Forms.Label();\n\t\t\tthis.MultiPanel.SuspendLayout();\n\t\t\tthis.CredentialsPage.SuspendLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.Throbber)).BeginInit();\n\t\t\tthis.ResultPage.SuspendLayout();\n\t\t\tthis.KeyTableLayoutPanel.SuspendLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.KeyPicture)).BeginInit();\n\t\t\tthis.CharactersGroupBox.SuspendLayout();\n\t\t\tthis.ResultsMultiPanel.SuspendLayout();\n\t\t\tthis.CharactersListPage.SuspendLayout();\n\t\t\tthis.AuthenticationErrorPage.SuspendLayout();\n\t\t\tthis.LoginDeniedErrorPage.SuspendLayout();\n\t\t\tthis.GeneralErrorPage.SuspendLayout();\n\t\t\tthis.ESITokenFailedErrorPage.SuspendLayout();\n\t\t\tthis.CachedWarningPage.SuspendLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// GuideLabel\n\t\t\t// \n\t\t\tthis.GuideLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.GuideLabel.Location = new System.Drawing.Point(3, 3);\n\t\t\tthis.GuideLabel.Name = \"GuideLabel\";\n\t\t\tthis.GuideLabel.Size = new System.Drawing.Size(267, 79);\n\t\t\tthis.GuideLabel.TabIndex = 3;\n\t\t\tthis.GuideLabel.Text = \"Ensure that the character shown is the correct character to import.\\r\\n\\r\\nCharacters\" +\n    \" can be imported and hidden later through the ESI keys management window.\";\n\t\t\t// \n\t\t\t// ButtonNext\n\t\t\t// \n\t\t\tthis.ButtonNext.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.ButtonNext.Location = new System.Drawing.Point(337, 177);\n\t\t\tthis.ButtonNext.Name = \"ButtonNext\";\n\t\t\tthis.ButtonNext.Size = new System.Drawing.Size(75, 23);\n\t\t\tthis.ButtonNext.TabIndex = 1;\n\t\t\tthis.ButtonNext.Text = \"&Next >\";\n\t\t\tthis.ButtonNext.UseVisualStyleBackColor = true;\n\t\t\tthis.ButtonNext.Click += new System.EventHandler(this.ButtonNext_Click);\n\t\t\t// \n\t\t\t// ButtonPrevious\n\t\t\t// \n\t\t\tthis.ButtonPrevious.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.ButtonPrevious.Enabled = false;\n\t\t\tthis.ButtonPrevious.Location = new System.Drawing.Point(256, 177);\n\t\t\tthis.ButtonPrevious.Name = \"ButtonPrevious\";\n\t\t\tthis.ButtonPrevious.Size = new System.Drawing.Size(75, 23);\n\t\t\tthis.ButtonPrevious.TabIndex = 0;\n\t\t\tthis.ButtonPrevious.Text = \"< &Previous\";\n\t\t\tthis.ButtonPrevious.UseVisualStyleBackColor = true;\n\t\t\tthis.ButtonPrevious.Click += new System.EventHandler(this.ButtonPrevious_Click);\n\t\t\t// \n\t\t\t// ButtonCancel\n\t\t\t// \n\t\t\tthis.ButtonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.ButtonCancel.CausesValidation = false;\n\t\t\tthis.ButtonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n\t\t\tthis.ButtonCancel.Location = new System.Drawing.Point(435, 177);\n\t\t\tthis.ButtonCancel.Name = \"ButtonCancel\";\n\t\t\tthis.ButtonCancel.Size = new System.Drawing.Size(75, 23);\n\t\t\tthis.ButtonCancel.TabIndex = 2;\n\t\t\tthis.ButtonCancel.Text = \"&Cancel\";\n\t\t\tthis.ButtonCancel.UseVisualStyleBackColor = true;\n\t\t\tthis.ButtonCancel.Click += new System.EventHandler(this.ButtonCancel_Click);\n\t\t\t// \n\t\t\t// MultiPanel\n\t\t\t// \n\t\t\tthis.MultiPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.MultiPanel.Controls.Add(this.CredentialsPage);\n\t\t\tthis.MultiPanel.Controls.Add(this.ResultPage);\n\t\t\tthis.MultiPanel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.MultiPanel.Name = \"MultiPanel\";\n\t\t\tthis.MultiPanel.SelectedPage = this.CredentialsPage;\n\t\t\tthis.MultiPanel.Size = new System.Drawing.Size(522, 171);\n\t\t\tthis.MultiPanel.TabIndex = 0;\n\t\t\t// \n\t\t\t// CredentialsPage\n\t\t\t// \n\t\t\tthis.CredentialsPage.CausesValidation = false;\n\t\t\tthis.CredentialsPage.Controls.Add(this.LabelShiftClick);\n\t\t\tthis.CredentialsPage.Controls.Add(this.Throbber);\n\t\t\tthis.CredentialsPage.Controls.Add(this.ButtonESILogin);\n\t\t\tthis.CredentialsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.CredentialsPage.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.CredentialsPage.Name = \"CredentialsPage\";\n\t\t\tthis.CredentialsPage.Size = new System.Drawing.Size(522, 171);\n\t\t\tthis.CredentialsPage.TabIndex = 0;\n\t\t\tthis.CredentialsPage.Text = \"credentialsPage\";\n\t\t\t// \n\t\t\t// Throbber\n\t\t\t// \n\t\t\tthis.Throbber.Anchor = System.Windows.Forms.AnchorStyles.Top;\n\t\t\tthis.Throbber.Location = new System.Drawing.Point(249, 76);\n\t\t\tthis.Throbber.MaximumSize = new System.Drawing.Size(24, 24);\n\t\t\tthis.Throbber.MinimumSize = new System.Drawing.Size(24, 24);\n\t\t\tthis.Throbber.Name = \"Throbber\";\n\t\t\tthis.Throbber.Size = new System.Drawing.Size(24, 24);\n\t\t\tthis.Throbber.State = EVEMon.Common.Enumerations.ThrobberState.Stopped;\n\t\t\tthis.Throbber.TabIndex = 1;\n\t\t\tthis.Throbber.TabStop = false;\n\t\t\tthis.Throbber.Visible = false;\n\t\t\t// \n\t\t\t// ButtonESILogin\n\t\t\t// \n\t\t\tthis.ButtonESILogin.Anchor = System.Windows.Forms.AnchorStyles.Top;\n\t\t\tthis.ButtonESILogin.Image = ((System.Drawing.Image)(resources.GetObject(\"ButtonESILogin.Image\")));\n\t\t\tthis.ButtonESILogin.Location = new System.Drawing.Point(126, 12);\n\t\t\tthis.ButtonESILogin.Name = \"ButtonESILogin\";\n\t\t\tthis.ButtonESILogin.Size = new System.Drawing.Size(270, 45);\n\t\t\tthis.ButtonESILogin.TabIndex = 0;\n\t\t\tthis.ButtonESILogin.UseVisualStyleBackColor = true;\n\t\t\tthis.ButtonESILogin.Click += new System.EventHandler(this.ButtonESILogin_Click);\n\t\t\t// \n\t\t\t// ResultPage\n\t\t\t// \n\t\t\tthis.ResultPage.Controls.Add(this.KeyTableLayoutPanel);\n\t\t\tthis.ResultPage.Controls.Add(this.CharactersGroupBox);\n\t\t\tthis.ResultPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.ResultPage.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.ResultPage.Name = \"ResultPage\";\n\t\t\tthis.ResultPage.Size = new System.Drawing.Size(522, 171);\n\t\t\tthis.ResultPage.TabIndex = 2;\n\t\t\tthis.ResultPage.Text = \"resultPage\";\n\t\t\t// \n\t\t\t// KeyTableLayoutPanel\n\t\t\t// \n\t\t\tthis.KeyTableLayoutPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.KeyTableLayoutPanel.AutoSize = true;\n\t\t\tthis.KeyTableLayoutPanel.ColumnCount = 2;\n\t\t\tthis.KeyTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 8.141962F));\n\t\t\tthis.KeyTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 91.85804F));\n\t\t\tthis.KeyTableLayoutPanel.Controls.Add(this.KeyLabel, 1, 0);\n\t\t\tthis.KeyTableLayoutPanel.Controls.Add(this.KeyPicture, 0, 0);\n\t\t\tthis.KeyTableLayoutPanel.Location = new System.Drawing.Point(12, 12);\n\t\t\tthis.KeyTableLayoutPanel.Name = \"KeyTableLayoutPanel\";\n\t\t\tthis.KeyTableLayoutPanel.RowCount = 1;\n\t\t\tthis.KeyTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n\t\t\tthis.KeyTableLayoutPanel.Size = new System.Drawing.Size(498, 38);\n\t\t\tthis.KeyTableLayoutPanel.TabIndex = 0;\n\t\t\t// \n\t\t\t// KeyLabel\n\t\t\t// \n\t\t\tthis.KeyLabel.AutoSize = true;\n\t\t\tthis.KeyLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.KeyLabel.Location = new System.Drawing.Point(43, 0);\n\t\t\tthis.KeyLabel.Name = \"KeyLabel\";\n\t\t\tthis.KeyLabel.Size = new System.Drawing.Size(452, 38);\n\t\t\tthis.KeyLabel.TabIndex = 1;\n\t\t\tthis.KeyLabel.Text = \"Short description on info retrieval procedure.\";\n\t\t\tthis.KeyLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n\t\t\t// \n\t\t\t// KeyPicture\n\t\t\t// \n\t\t\tthis.KeyPicture.Image = ((System.Drawing.Image)(resources.GetObject(\"KeyPicture.Image\")));\n\t\t\tthis.KeyPicture.Location = new System.Drawing.Point(3, 3);\n\t\t\tthis.KeyPicture.Name = \"KeyPicture\";\n\t\t\tthis.KeyPicture.Size = new System.Drawing.Size(32, 32);\n\t\t\tthis.KeyPicture.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\n\t\t\tthis.KeyPicture.TabIndex = 0;\n\t\t\tthis.KeyPicture.TabStop = false;\n\t\t\t// \n\t\t\t// CharactersGroupBox\n\t\t\t// \n\t\t\tthis.CharactersGroupBox.Controls.Add(this.ResultsMultiPanel);\n\t\t\tthis.CharactersGroupBox.Location = new System.Drawing.Point(12, 50);\n\t\t\tthis.CharactersGroupBox.Name = \"CharactersGroupBox\";\n\t\t\tthis.CharactersGroupBox.Size = new System.Drawing.Size(479, 118);\n\t\t\tthis.CharactersGroupBox.TabIndex = 3;\n\t\t\tthis.CharactersGroupBox.TabStop = false;\n\t\t\tthis.CharactersGroupBox.Text = \"Characters exposed by API key\";\n\t\t\t// \n\t\t\t// ResultsMultiPanel\n\t\t\t// \n\t\t\tthis.ResultsMultiPanel.Controls.Add(this.CharactersListPage);\n\t\t\tthis.ResultsMultiPanel.Controls.Add(this.AuthenticationErrorPage);\n\t\t\tthis.ResultsMultiPanel.Controls.Add(this.LoginDeniedErrorPage);\n\t\t\tthis.ResultsMultiPanel.Controls.Add(this.GeneralErrorPage);\n\t\t\tthis.ResultsMultiPanel.Controls.Add(this.ESITokenFailedErrorPage);\n\t\t\tthis.ResultsMultiPanel.Controls.Add(this.CachedWarningPage);\n\t\t\tthis.ResultsMultiPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.ResultsMultiPanel.Location = new System.Drawing.Point(3, 16);\n\t\t\tthis.ResultsMultiPanel.Name = \"ResultsMultiPanel\";\n\t\t\tthis.ResultsMultiPanel.SelectedPage = this.ESITokenFailedErrorPage;\n\t\t\tthis.ResultsMultiPanel.Size = new System.Drawing.Size(473, 99);\n\t\t\tthis.ResultsMultiPanel.TabIndex = 5;\n\t\t\t// \n\t\t\t// CharactersListPage\n\t\t\t// \n\t\t\tthis.CharactersListPage.Controls.Add(this.CharactersListView);\n\t\t\tthis.CharactersListPage.Controls.Add(this.GuideLabel);\n\t\t\tthis.CharactersListPage.Controls.Add(this.WarningLabel);\n\t\t\tthis.CharactersListPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.CharactersListPage.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.CharactersListPage.Name = \"CharactersListPage\";\n\t\t\tthis.CharactersListPage.Size = new System.Drawing.Size(473, 99);\n\t\t\tthis.CharactersListPage.TabIndex = 0;\n\t\t\tthis.CharactersListPage.Text = \"charactersListPage\";\n\t\t\t// \n\t\t\t// CharactersListView\n\t\t\t// \n\t\t\tthis.CharactersListView.BorderStyle = System.Windows.Forms.BorderStyle.None;\n\t\t\tthis.CharactersListView.FullRowSelect = true;\n\t\t\tthis.CharactersListView.HideSelection = false;\n\t\t\tlistViewItem1.StateImageIndex = 0;\n\t\t\tlistViewItem2.StateImageIndex = 0;\n\t\t\tlistViewItem3.Checked = true;\n\t\t\tlistViewItem3.StateImageIndex = 1;\n\t\t\tthis.CharactersListView.Items.AddRange(new System.Windows.Forms.ListViewItem[] {\n            listViewItem1,\n            listViewItem2,\n            listViewItem3});\n\t\t\tthis.CharactersListView.Location = new System.Drawing.Point(276, 3);\n\t\t\tthis.CharactersListView.Name = \"CharactersListView\";\n\t\t\tthis.CharactersListView.Size = new System.Drawing.Size(197, 76);\n\t\t\tthis.CharactersListView.TabIndex = 2;\n\t\t\tthis.CharactersListView.UseCompatibleStateImageBehavior = false;\n\t\t\tthis.CharactersListView.View = System.Windows.Forms.View.List;\n\t\t\t// \n\t\t\t// WarningLabel\n\t\t\t// \n\t\t\tthis.WarningLabel.AutoSize = true;\n\t\t\tthis.WarningLabel.ForeColor = System.Drawing.Color.DarkRed;\n\t\t\tthis.WarningLabel.Location = new System.Drawing.Point(3, 82);\n\t\t\tthis.WarningLabel.Name = \"WarningLabel\";\n\t\t\tthis.WarningLabel.Size = new System.Drawing.Size(402, 13);\n\t\t\tthis.WarningLabel.TabIndex = 4;\n\t\t\tthis.WarningLabel.Text = \"Beware! When you remove characters, all their data and plans will be definitely l\" +\n    \"ost !\";\n\t\t\t// \n\t\t\t// AuthenticationErrorPage\n\t\t\t// \n\t\t\tthis.AuthenticationErrorPage.Controls.Add(this.AuthenticationErrorGuideLabel);\n\t\t\tthis.AuthenticationErrorPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.AuthenticationErrorPage.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.AuthenticationErrorPage.Name = \"AuthenticationErrorPage\";\n\t\t\tthis.AuthenticationErrorPage.Size = new System.Drawing.Size(473, 99);\n\t\t\tthis.AuthenticationErrorPage.TabIndex = 1;\n\t\t\tthis.AuthenticationErrorPage.Text = \"authenticationErrorPage\";\n\t\t\t// \n\t\t\t// AuthenticationErrorGuideLabel\n\t\t\t// \n\t\t\tthis.AuthenticationErrorGuideLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.AuthenticationErrorGuideLabel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.AuthenticationErrorGuideLabel.Name = \"AuthenticationErrorGuideLabel\";\n\t\t\tthis.AuthenticationErrorGuideLabel.Padding = new System.Windows.Forms.Padding(54, 0, 0, 0);\n\t\t\tthis.AuthenticationErrorGuideLabel.Size = new System.Drawing.Size(473, 99);\n\t\t\tthis.AuthenticationErrorGuideLabel.TabIndex = 0;\n\t\t\tthis.AuthenticationErrorGuideLabel.Text = resources.GetString(\"AuthenticationErrorGuideLabel.Text\");\n\t\t\tthis.AuthenticationErrorGuideLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n\t\t\t// \n\t\t\t// LoginDeniedErrorPage\n\t\t\t// \n\t\t\tthis.LoginDeniedErrorPage.Controls.Add(this.LoginDeniedLinkLabel);\n\t\t\tthis.LoginDeniedErrorPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.LoginDeniedErrorPage.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.LoginDeniedErrorPage.Name = \"LoginDeniedErrorPage\";\n\t\t\tthis.LoginDeniedErrorPage.Size = new System.Drawing.Size(473, 99);\n\t\t\tthis.LoginDeniedErrorPage.TabIndex = 2;\n\t\t\tthis.LoginDeniedErrorPage.Text = \"loginDeniedErrorPage\";\n\t\t\t// \n\t\t\t// LoginDeniedLinkLabel\n\t\t\t// \n\t\t\tthis.LoginDeniedLinkLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.LoginDeniedLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(149, 49);\n\t\t\tthis.LoginDeniedLinkLabel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.LoginDeniedLinkLabel.Name = \"LoginDeniedLinkLabel\";\n\t\t\tthis.LoginDeniedLinkLabel.Padding = new System.Windows.Forms.Padding(40, 0, 0, 0);\n\t\t\tthis.LoginDeniedLinkLabel.Size = new System.Drawing.Size(473, 99);\n\t\t\tthis.LoginDeniedLinkLabel.TabIndex = 0;\n\t\t\tthis.LoginDeniedLinkLabel.TabStop = true;\n\t\t\tthis.LoginDeniedLinkLabel.Text = resources.GetString(\"LoginDeniedLinkLabel.Text\");\n\t\t\tthis.LoginDeniedLinkLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n\t\t\tthis.LoginDeniedLinkLabel.UseCompatibleTextRendering = true;\n\t\t\tthis.LoginDeniedLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LoginDeniedLinkLabel_LinkClicked);\n\t\t\t// \n\t\t\t// GeneralErrorPage\n\t\t\t// \n\t\t\tthis.GeneralErrorPage.Controls.Add(this.GeneralErrorLabel);\n\t\t\tthis.GeneralErrorPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.GeneralErrorPage.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.GeneralErrorPage.Name = \"GeneralErrorPage\";\n\t\t\tthis.GeneralErrorPage.Size = new System.Drawing.Size(473, 99);\n\t\t\tthis.GeneralErrorPage.TabIndex = 3;\n\t\t\tthis.GeneralErrorPage.Text = \"generalErrorPage\";\n\t\t\t// \n\t\t\t// GeneralErrorLabel\n\t\t\t// \n\t\t\tthis.GeneralErrorLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.GeneralErrorLabel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.GeneralErrorLabel.Name = \"GeneralErrorLabel\";\n\t\t\tthis.GeneralErrorLabel.Padding = new System.Windows.Forms.Padding(50, 0, 50, 0);\n\t\t\tthis.GeneralErrorLabel.Size = new System.Drawing.Size(473, 99);\n\t\t\tthis.GeneralErrorLabel.TabIndex = 0;\n\t\t\tthis.GeneralErrorLabel.Text = \"An error occurred while retrieving the information.\\r\\n\\r\\nThe error message was: {0}\" +\n    \"\";\n\t\t\tthis.GeneralErrorLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n\t\t\t// \n\t\t\t// ESITokenFailedErrorPage\n\t\t\t// \n\t\t\tthis.ESITokenFailedErrorPage.Controls.Add(this.ESITokenFailedLabel);\n\t\t\tthis.ESITokenFailedErrorPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.ESITokenFailedErrorPage.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.ESITokenFailedErrorPage.Name = \"ESITokenFailedErrorPage\";\n\t\t\tthis.ESITokenFailedErrorPage.Size = new System.Drawing.Size(473, 99);\n\t\t\tthis.ESITokenFailedErrorPage.TabIndex = 5;\n\t\t\tthis.ESITokenFailedErrorPage.Text = \"\";\n\t\t\t// \n\t\t\t// ESITokenFailedLabel\n\t\t\t// \n\t\t\tthis.ESITokenFailedLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.ESITokenFailedLabel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.ESITokenFailedLabel.Name = \"ESITokenFailedLabel\";\n\t\t\tthis.ESITokenFailedLabel.Padding = new System.Windows.Forms.Padding(35, 0, 0, 0);\n\t\t\tthis.ESITokenFailedLabel.Size = new System.Drawing.Size(473, 99);\n\t\t\tthis.ESITokenFailedLabel.TabIndex = 0;\n\t\t\tthis.ESITokenFailedLabel.Text = \"EVEMon did not receive a valid response from the CCP SSO server.\\r\\n\\r\\nTry again in \" +\n    \"a few minutes.\";\n\t\t\tthis.ESITokenFailedLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n\t\t\t// \n\t\t\t// CachedWarningPage\n\t\t\t// \n\t\t\tthis.CachedWarningPage.Controls.Add(this.CachedWarningLabel);\n\t\t\tthis.CachedWarningPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.CachedWarningPage.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.CachedWarningPage.Name = \"CachedWarningPage\";\n\t\t\tthis.CachedWarningPage.Size = new System.Drawing.Size(473, 98);\n\t\t\tthis.CachedWarningPage.TabIndex = 6;\n\t\t\tthis.CachedWarningPage.Text = \"cachedWarningPage\";\n\t\t\t// \n\t\t\t// CachedWarningLabel\n\t\t\t// \n\t\t\tthis.CachedWarningLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.CachedWarningLabel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.CachedWarningLabel.Name = \"CachedWarningLabel\";\n\t\t\tthis.CachedWarningLabel.Size = new System.Drawing.Size(473, 98);\n\t\t\tthis.CachedWarningLabel.TabIndex = 0;\n\t\t\tthis.CachedWarningLabel.Text = \"Due to the fact that the cached timer has not yet expired,\\r\\nyour query attempt wi\" +\n    \"ll result in getting the same data you already have.\\r\\nTry again after: {0}\";\n\t\t\tthis.CachedWarningLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n\t\t\t// \n\t\t\t// errorProvider\n\t\t\t// \n\t\t\tthis.errorProvider.ContainerControl = this;\n\t\t\t// \n\t\t\t// LabelShiftClick\n\t\t\t// \n\t\t\tthis.LabelShiftClick.Anchor = System.Windows.Forms.AnchorStyles.Top;\n\t\t\tthis.LabelShiftClick.AutoSize = true;\n\t\t\tthis.LabelShiftClick.Location = new System.Drawing.Point(111, 60);\n\t\t\tthis.LabelShiftClick.Name = \"LabelShiftClick\";\n\t\t\tthis.LabelShiftClick.Size = new System.Drawing.Size(301, 13);\n\t\t\tthis.LabelShiftClick.TabIndex = 2;\n\t\t\tthis.LabelShiftClick.Text = \"SHIFT+Click will copy ESI authentication URL to the clipboard\";\n\t\t\tthis.LabelShiftClick.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n\t\t\t// \n\t\t\t// EsiKeyUpdateOrAdditionWindow\n\t\t\t// \n\t\t\tthis.AcceptButton = this.ButtonNext;\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n\t\t\tthis.BackColor = System.Drawing.SystemColors.Window;\n\t\t\tthis.CancelButton = this.ButtonCancel;\n\t\t\tthis.ClientSize = new System.Drawing.Size(522, 212);\n\t\t\tthis.Controls.Add(this.ButtonCancel);\n\t\t\tthis.Controls.Add(this.ButtonPrevious);\n\t\t\tthis.Controls.Add(this.ButtonNext);\n\t\t\tthis.Controls.Add(this.MultiPanel);\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\n\t\t\tthis.MaximizeBox = false;\n\t\t\tthis.MinimizeBox = false;\n\t\t\tthis.Name = \"EsiKeyUpdateOrAdditionWindow\";\n\t\t\tthis.Text = \"ESI Key Import\";\n\t\t\tthis.MultiPanel.ResumeLayout(false);\n\t\t\tthis.CredentialsPage.ResumeLayout(false);\n\t\t\tthis.CredentialsPage.PerformLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.Throbber)).EndInit();\n\t\t\tthis.ResultPage.ResumeLayout(false);\n\t\t\tthis.ResultPage.PerformLayout();\n\t\t\tthis.KeyTableLayoutPanel.ResumeLayout(false);\n\t\t\tthis.KeyTableLayoutPanel.PerformLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.KeyPicture)).EndInit();\n\t\t\tthis.CharactersGroupBox.ResumeLayout(false);\n\t\t\tthis.ResultsMultiPanel.ResumeLayout(false);\n\t\t\tthis.CharactersListPage.ResumeLayout(false);\n\t\t\tthis.CharactersListPage.PerformLayout();\n\t\t\tthis.AuthenticationErrorPage.ResumeLayout(false);\n\t\t\tthis.LoginDeniedErrorPage.ResumeLayout(false);\n\t\t\tthis.GeneralErrorPage.ResumeLayout(false);\n\t\t\tthis.ESITokenFailedErrorPage.ResumeLayout(false);\n\t\t\tthis.CachedWarningPage.ResumeLayout(false);\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();\n\t\t\tthis.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private MultiPanel MultiPanel;\n        private MultiPanelPage CredentialsPage;\n        private System.Windows.Forms.Button ButtonNext;\n        private System.Windows.Forms.Button ButtonPrevious;\n        private System.Windows.Forms.Button ButtonCancel;\n        private MultiPanelPage ResultPage;\n        private System.Windows.Forms.PictureBox KeyPicture;\n        private System.Windows.Forms.GroupBox CharactersGroupBox;\n        private System.Windows.Forms.ListView CharactersListView;\n        private System.Windows.Forms.Label WarningLabel;\n        private System.Windows.Forms.TableLayoutPanel KeyTableLayoutPanel;\n        private System.Windows.Forms.Label KeyLabel;\n        private MultiPanel ResultsMultiPanel;\n        private MultiPanelPage CharactersListPage;\n        private MultiPanelPage AuthenticationErrorPage;\n        private System.Windows.Forms.Label AuthenticationErrorGuideLabel;\n        private System.Windows.Forms.ErrorProvider errorProvider;\n        private MultiPanelPage LoginDeniedErrorPage;\n        private System.Windows.Forms.LinkLabel LoginDeniedLinkLabel;\n        private MultiPanelPage GeneralErrorPage;\n        private System.Windows.Forms.Label GeneralErrorLabel;\n        private MultiPanelPage ESITokenFailedErrorPage;\n        private System.Windows.Forms.Label ESITokenFailedLabel;\n        private MultiPanelPage CachedWarningPage;\n        private System.Windows.Forms.Label CachedWarningLabel;\n        private System.Windows.Forms.Label GuideLabel;\n        private System.Windows.Forms.Button ButtonESILogin;\n        private Throbber Throbber;\n\t\tprivate System.Windows.Forms.Label LabelShiftClick;\n\t}\n}\n"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/EsiKeyUpdateOrAdditionWindow.cs",
    "content": "﻿using EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Controls.MultiPanel;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Properties;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.Service;\nusing EVEMon.SettingsUI;\nusing System;\nusing System.IO;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\n\nnamespace EVEMon.ApiCredentialsManagement\n{\n    public partial class EsiKeyUpdateOrAdditionWindow : EVEMonForm\n    {\n        private readonly SSOAuthenticationService m_authService;\n        private readonly bool m_updateMode;\n        private bool m_keyValid;\n        private ESIKey m_esiKey;\n        private ESIKeyCreationEventArgs m_creationArgs;\n        private readonly SSOWebServerHttpListener m_server;\n        private readonly string m_state;\n\n        /// <summary>\n        /// Constructor for new ESI credential.\n        /// </summary>\n        public EsiKeyUpdateOrAdditionWindow()\n        {\n            InitializeComponent();\n            m_keyValid = false;\n            m_server = new SSOWebServerHttpListener();\n            m_state = DateTime.UtcNow.ToFileTime().ToString();\n            m_authService = SSOAuthenticationService.GetInstance();\n        }\n\n        /// <summary>\n        /// Constructor for editing existing ESI credentials.\n        /// </summary>\n        /// <param name=\"esiKey\"></param>\n        public EsiKeyUpdateOrAdditionWindow(ESIKey esiKey)\n            : this()\n        {\n            m_esiKey = esiKey;\n            m_updateMode = m_esiKey != null;\n        }\n\n        /// <summary>\n        /// Starts the SSO server.\n        /// </summary>\n        private void StartServer()\n        {\n            try\n            {\n                m_server.Start();\n                WaitForToken();\n            }\n            catch (IOException)\n            {\n                MessageBox.Show(string.Format(Properties.Resources.ErrorSSOStartup,\n                    SSOWebServerHttpListener.PORT), @\"Cannot start authentication\", MessageBoxButtons.OK,\n                    MessageBoxIcon.Exclamation);\n            }\n        }\n\n        /// <summary>\n        /// Starts waiting for a token in the background, calling UpdateTokens when it arrives\n        /// or fails.\n        /// </summary>\n        private void WaitForToken()\n        {\n            m_server.BeginWaitForCode(m_state, UpdateTokens);\n        }\n\n        /// <summary>\n        /// Receives the result and updates the code text box if needed.\n        /// </summary>\n        /// <param name=\"results\"></param>\n        private void UpdateTokens(Task<string> results)\n        {\n            string code;\n            if (results.IsFaulted)\n            {\n                // Retry and log\n                ExceptionHandler.LogException(results.Exception, true);\n                WaitForToken();\n            }\n            else if (!results.IsCanceled && !string.IsNullOrEmpty(code = results.Result))\n            {\n                // If a token is received, use SSOAuthenticationService to convert to a token\n                // null is returned if the user cancels\n                m_authService.VerifyAuthCode(code, GoToResults);\n                Throbber.State = ThrobberState.Rotating;\n                Throbber.Visible = true;\n            }\n        }\n        \n        /// <summary>\n        /// Update the controls visibility depending on whether we are in update or creation mode.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode)\n                return;\n\n            if (m_authService == null)\n            {\n                MessageBox.Show(Properties.Resources.ErrorSetClientID, @\"Client ID not set\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n                Close();\n                // General > Network...\n                using (SettingsForm form = new SettingsForm(0, 1))\n                {\n                    form.ShowDialog(this);\n                }\n            }\n\n            WarningLabel.Visible = m_updateMode;\n            CharactersListView.Items.Clear();\n\n            MultiPanel.SelectedPage = CredentialsPage;\n            MultiPanel.SelectionChange += MultiPanel_SelectionChange;\n            UpdateButtons(CredentialsPage);\n        }\n\n        /// <summary>\n        /// When we switch panels, we update the \"next\", \"previous\" and \"cancel\" buttons.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"args\"></param>\n        private void MultiPanel_SelectionChange(object sender, MultiPanelSelectionChangeEventArgs args)\n        {\n            UpdateButtons(args?.NewPage ?? MultiPanel.SelectedPage);\n        }\n\n        /// <summary>\n        /// When we switch panels, we update the \"next\", \"previous\" and \"cancel\" buttons.\n        /// </summary>\n        /// <param name=\"newPage\">The page selected.</param>\n        private void UpdateButtons(MultiPanelPage newPage)\n        {\n            bool nextPrev = false;\n            if (newPage == CredentialsPage)\n                StartServer();\n            else\n            {\n                nextPrev = true;\n                ButtonNext.Text = m_updateMode ? \"&Update\" : \"&Import\";\n                ButtonNext.Focus();\n            }\n            ButtonPrevious.Visible = nextPrev;\n            ButtonPrevious.Enabled = nextPrev;\n            ButtonNext.Visible = nextPrev;\n            // Disable \"Import\" on error\n            ButtonNext.Enabled = nextPrev && (newPage != ResultPage || m_keyValid);\n            Throbber.State = ThrobberState.Stopped;\n            Throbber.Visible = false;\n        }\n\n        /// <summary>\n        /// Previous.\n        /// When the previous button is clicked, we select the first page.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void ButtonPrevious_Click(object sender, EventArgs e)\n        {\n            if (MultiPanel.SelectedPage == ResultPage)\n                MultiPanel.SelectedPage = CredentialsPage;\n        }\n\n        /// <summary>\n        /// Cancel.\n        /// Closes the window.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void ButtonCancel_Click(object sender, EventArgs e)\n        {\n            m_creationArgs = null;\n            Close();\n        }\n\n        /// <summary>\n        /// Next / Import / Update.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void ButtonNext_Click(object sender, EventArgs e)\n        {\n            // Only works on the last page\n            if (MultiPanel.SelectedPage == ResultPage)\n                Complete();\n        }\n\n        /// <summary>\n        /// Goes to the results page once the key has been received from the server.\n        /// </summary>\n        private void GoToResults(AccessResponse response)\n        {\n            // Fail if an empty response is received\n            bool failed = string.IsNullOrEmpty(response?.AccessToken) || string.IsNullOrEmpty(\n                response?.RefreshToken);\n            // If the arguments have not been invalidated since the last time...\n            if (m_creationArgs != null)\n                MultiPanel.SelectedPage = ResultPage;\n            else if (failed)\n            {\n                // Error when fetching the key\n                KeyPicture.Image = Resources.KeyWrong32;\n                KeyLabel.Text = Properties.Resources.ErrorNoToken;\n                CharactersGroupBox.Text = @\"Error report\";\n                ResultsMultiPanel.SelectedPage = ESITokenFailedErrorPage;\n                MultiPanel.SelectedPage = ResultPage;\n                m_keyValid = false;\n            }\n            else\n            {\n                long newID = DateTime.UtcNow.ToFileTime();\n                // Are we updating existing API key?\n                if (m_updateMode)\n                    m_esiKey.TryUpdateAsync(response, OnUpdated);\n                else\n                    ESIKey.TryAddOrUpdateAsync(newID, response, OnUpdated);\n            }\n        }\n\n        /// <summary>\n        /// Validates the operation and closes the window.\n        /// </summary>\n        private void Complete()\n        {\n            if (m_creationArgs == null)\n                return;\n\n            m_esiKey = m_creationArgs.CreateOrUpdate();\n            \n            // Closes the window\n            Close();\n        }\n\n        /// <summary>\n        /// When ESI credentials have been updated.\n        /// </summary>\n        /// <returns></returns>\n        private void OnUpdated(object sender, ESIKeyCreationEventArgs e)\n        {\n            m_creationArgs = e;\n            var error = e.CCPError;\n            CharactersGroupBox.Text = \"Characters exposed by ESI key\";\n            // Updates the picture and label for key type\n            if (error != null)\n            {\n                string message = error.ErrorMessage;\n                KeyPicture.Image = Resources.KeyWrong32;\n                KeyLabel.Text = message;\n                CharactersGroupBox.Text = \"Error report\";\n                ResultsMultiPanel.SelectedPage = GetErrorPage(e, message);\n                m_keyValid = false;\n            }\n            else\n            {\n                var id = e.Identity;\n                KeyPicture.Image = Resources.DefaultCharacterImage32;\n                KeyLabel.Text = \"This is a character ESI key.\";\n                ResultsMultiPanel.SelectedPage = CharactersListPage;\n                // Updates the characters list\n                CharactersListView.Items.Clear();\n                CharactersListView.Items.Add(new ListViewItem(id.CharacterName)\n                {\n                    Tag = id,\n                });\n                m_keyValid = true;\n            }\n            // Issue a warning if the ESI key has no scopes\n            if (e.AccessMask == 0UL)\n            {\n                WarningLabel.Text = Properties.Resources.ErrorNoScopes;\n                WarningLabel.Visible = true;\n            }\n            // Issue a warning if the ESI key does not have the basic scopes\n            else if (e.AccessMask < (long)CCPAPIMethodsEnum.BasicCharacterFeatures)\n            {\n                WarningLabel.Text = Properties.Resources.ErrorFewScopes;\n                WarningLabel.Visible = true;\n            }\n            else\n                WarningLabel.Visible = m_updateMode;\n            // Selects the last page\n            MultiPanel.SelectedPage = ResultPage;\n        }\n\n        /// <summary>\n        /// Gets the error page.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"ESIKeyCreationEventArgs\"/> instance containing the\n        /// event data.</param>\n        /// <param name=\"message\">The error message.</param>\n        /// <returns>The error page to display.</returns>\n        private MultiPanelPage GetErrorPage(ESIKeyCreationEventArgs e, string message)\n        {\n            if (e.CCPError.IsAuthenticationFailure)\n                return AuthenticationErrorPage;\n\n            if (e.CCPError.IsLoginDeniedByAccountStatus)\n                return LoginDeniedErrorPage;\n            \n            GeneralErrorLabel.Text = string.Format(CultureConstants.DefaultCulture,\n                GeneralErrorLabel.Text, message);\n            return GeneralErrorPage;\n        }\n\n        /// <summary>\n        /// On the first page, when a textbox is changed, we ensure the previously generated\n        /// <see cref=\"ESIKeyCreationEventArgs\"/> is destroyed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void IDTextBox_TextChanged(object sender, EventArgs e)\n        {\n            m_creationArgs = null;\n        }\n\n        /// <summary>\n        /// On the first page, when a textbox is changed, we ensure the previously generated\n        /// <see cref=\"ESIKeyCreationEventArgs\"/> is destroyed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void VerificationCodeTextBox_TextChanged(object sender, EventArgs e)\n        {\n            m_creationArgs = null;\n        }\n        \n        /// <summary>\n        /// Handles the LinkClicked event of the LoginDeniedLinkLabel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.LinkLabelLinkClickedEventArgs\"/>\n        /// instance containing the event data.</param>\n        private void LoginDeniedLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            Util.OpenURL(new Uri(NetworkConstants.CCPAccountManage));\n        }\n        \n        /// <summary>\n        /// Starts a browser with the ESI login page.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event\n        /// data.</param>\n        private void ButtonESILogin_Click(object sender, EventArgs e)\n        {\n            if (ModifierKeys.HasFlag(Keys.Shift)) {\n                if (m_authService != null)\n                    Clipboard.SetText(m_authService.GetAuthenticationURL(m_state,\n                        SSOWebServerHttpListener.PORT).ToString());\n            } else\n                m_authService?.SpawnBrowserForLogin(m_state, SSOWebServerHttpListener.PORT);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/EsiKeyUpdateOrAdditionWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"ButtonESILogin.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAQ4AAAAtCAYAAABf/oWJAAAABGdBTUEAALGPC/xhBQAADFFJREFUeF7t\n        ndmLFUcbh4dcfH+MQYioQRAENReKxgu9cblQiMuFASN8omBgIK6j457FcUvUjGiiYBKXJGrivuAurtEk\n        Jrf5E76L/ubp4Xd4T83by8zpidNaAw/dVfWrt5aufruqTp8zbe3t7W/t2rWr86uvvkoOHjwYqRj6dd++\n        fW5aJFInevzE/7q6upa08dcTWPvrr78mf/75Z/LHH39EKoL+fPnyZfLjjz8mu3fvdjWRSJ3466+/krNn\n        z+JAZrV9+eWXaeTTp08jFfLs2bPk77//Tk6cOJE6Dk8TidSN3377LemZdbxs+/rrr5MnT55EKoZOxkPL\n        cXiaSKSO9Mw4kjbWLl5ipDWs42CPw9NEInWDcZ06ju7ublcQaQ06mKXK6dOnkz179riaSKRuMK6ZQbcd\n        OHAgefz4caRi6GQcx08//ZQ6Dk8TibTKo0eP3PjBgnHd1dUVHcdgQQfzyQozjr1797qaSKRuNDkOvFak\n        Wuhk9jiYcbDH4WkikbrBuN65c2fStn///tSLRKqFtaDe4+AlME8TidQNxnV0HIMIHcxS5eeff05iH0de\n        J7744otex8HLSlXAyyFe/JsIfcFS5cyZMwnLQU8TKSaOqaFH6jh4c9RLjLQOSxUcBx95e+mRSB35/PPP\n        kzY27uyuaaQ6WKrIcXjpkUgdaTgObx0TaR2+A/TLL78khw8fdtMjkbrB3l3qOHjHwBMUMWzYsEqYN29e\n        am/lypVN8ceOHetTZh5Hjx5tyo894rFv41tBZbHGe//999Oj4jxYquA4jhw54qZHInUDx/HZZ58NHcdx\n        586dZOzYsY34KVOmpNOisFwPPl+ePHlyIy927t69m6YNhuNYunRp6phWr17diAthLchShZ8s+Oabb1xN\n        JFI3mhwHgf7i3VgDgRtbNpkC2bTt27c3lZkFOpsPO0qr0nHIJjONNWvWpEfFheA4mHFcuHAh+fbbb11N\n        HuRbt25dCueeBnBKH330UTJz5swU9Ldu3eqjo4/mz5+fajgW9S3p2JKOclQfzqVTfJG9spw8ebLRFi9d\n        qC55fWOx9Q/BBuXasPKF10H94mHLCyl7nTx0w6ps9T8PL2xV1fdlYFynjoPvUXiCIuwN9cknn6SvVg8E\n        e5HooGnTpjXsjhkzJp2J2HJDbt++neqUh/zqaLCOg+WFV4ey2HKLeP78eTrjuHjxYrrs8jR5MDhUbw2U\n        EAaMNBbaaQdluAwUeYOdAYlGNzBa5cO+dIqXrhW4brbdilddbH2lyeqbEFv/EGzYcu2NaPPRp6qLhy3P\n        UvY6FRH2g9cvgw2O49NPP+3dHOWz8v5if1LsypUrroZCvPg8vv/++6bOXbFihasTy5cvb9KT36bztXbV\n        87vvvmtKG0xwHGyO4hiPHz/uavJglqI2ce5p3n333TR9wYIFaRjnpjzr16/PjENPmPyyFTJr1qxUw5Ew\n        eWUHLl261BQvXavwoKC9ts2qi+oPqkdW34TY+nNuUVtsuvKpr7jJCasu48eP72NHeULKXKcyhP2AHdqv\n        +v9bpJujA/2RmVOnTlUCN1Zoe+HChY2OHT58eHLu3Lk+GuCjTtKlXbRoUR8N9r1yB0JoOw+8MzMOysdh\n        eZo82FBVu7zN1ax0PYU4El67dm1D5+U9f/58I96SZwcI23jpLDht0qUFnr6EOSpOGuoCNg9HblKVoXyq\n        B0ttTdmXLFmS2R7sKI+XDmGbAYdBHLazNHmUvU7qFzScE8+S0sujvrF5ytoANKQB5zdv3mxKL2LHjh0J\n        vznqJhahzmgVbY5aLl++nLzzzjsNzZw5c/poYPbs2Q3NiBEj0nyhZjA2R8uA42DWwVKFWZCnyYOLrXLD\n        Cw9ccK9eiucpR5iBQ5gbwOqK0CDlSFh2dRNztPHSWXAcpIFuaIVVPxuHxrbbpgmVo7Ce5mF6SFZ/WbSk\n        8+rGjUg47Jciyl4n2Q3bQ1g3tjTkzQvn2dB4sJRti6AvUsfBkqK/hIUPFG5szz77JlZ36NChpnTCNn3V\n        qlVN6aJKx+HZz4Ip3e+//54u43AcniYPu+bmPEy3a++8eE1vOVpdEWE+2SWspzCzMBsf2gDSgDbgRBUG\n        wmongxu9bbfCKo/NRcq0dj/++OM0nNUfwqZzbpGGt6ilYe/M1kXlql8mTJjQZIOnsOxYSJONvHjb35RN\n        eUqnHlZD3rxwlg0b5jwMY6MMqeOoYnO0FbixPfsPHjxIxo0b19C99957ycOHD9M0jhMnTmykoUMf2oAq\n        HYdnPws5DmZB7Nh7mjzsoOU8TLcDLy9eTyGOhDWFFVl1C/PJLmGdcyPb+NAGyA46tUlPRMLUx+a37fZs\n        KE4a9Y2Xz6J6ekjDslJx2FMe6iuN6hKS1X5bbl58mTaGmqJwaENl2rp6efJochzedKQIdoOr4N69e659\n        YP9FDYeOjo40ns0hG5/XBux75Q4Ez34WdDCbozgOvlrvafJodamieA0MjmE6eLYhKx9hpr2cc0PZ+NCG\n        zccyQOf2aM/Rh0sVUF2kAWlUfy+fReWAyhVWp6UY8exrcG7bprqgsza4mawdQZrKzYsv08ZQUxQObahM\n        rhtakBO3efLAeWzbtq13c9ROQ8rCOwyCtamnaRUqOX369EbjR40alX5NnaPiZsyY0fCEHrxRqnry6ren\n        GQw047h69Wq6ietp8rBPUM7DdD09IC/eTl+tThrPNoT5ZFdhu3di40M0/SedGQrnWrJgQ+Xoy5a23bIh\n        DXVQnDSqv5fPktVfIWoXR7XNlqu6ZLU3JKvcML5MG0NNUTi0oTJxFmgtWUutEMZ16jjYlfYERahCsGzZ\n        svSr4wPhhx9+cO0L1l5vv/12o6yRI0c2zonnIykvn7BLlUmTJrl1KItnPws6+MWLF8mNGzfSXwHzNHnY\n        G0EDx2LX49yIitfNyRORMHsAhBks0oDyerZBg5AjYQ06hRlosmHjQ+QkNFhVD47cmHrCqw223bKhumTd\n        EFn5LKp/VrqQTk4DbB+pLlntDSl7ncq0MdQUhUMbalvZunswrhufqoTffiuDKtQqc+fOde1bFi9e7Ob9\n        8MMPXb0F+17egeDZz4JpHZ+q4DiYJXmaPJgdqVzOw3T7iQVPAMXrRvzggw/SsKan1k6RbdC0lyNh2VFY\n        yxWheI/Ro0f30ck+UGdpbd0UJy11UJw0Xpv0E3cW2w9hmsXaEbRV6apL2N6wTIXLXqcybQw1ReHQBuVz\n        PnXq1EY650pXXB6M661bt/Y6Dm189AdVqFWyNkct169fb5ppAGHiPb3lVW2O4p1xHAw6/m2ep8nDPkFD\n        eHKg0UDh6U2cptlAfjR2w4/Big59qAuRbY6E9bRSGPTUDONDZAvY6yDOvs1KvaW17Q7zU2/ll0b19/JZ\n        VH8P9aewacw8FM9NY9sSUtSXeddJGluXIk1ROLTBPp3CaEBh0pSniNRx8IvFXmIR7DNUAS9tefZDbCPV\n        cE8Xgn2v3IHg2c8Cx8FSBcfBF908TR72RghR27nYGiyCwclGnbWlTy4EDkQ3fdFg50hY/a8w8NaxbNr4\n        EHvtVHdbJ3stbbsVRzlydipHGtXfy2exdQix5YPaDjgqbQqGaSFZfVnmOind1kVa2Q01RWHPBmWqL0U4\n        XorYsmVLr+Owa5ihCh/BanrHZ+hMBT3dUILNURwHn6x46VXB2pmBAV466L2EPE1kcClznf4N7Fjg3NNk\n        wR5HrRwHsEGJ4+jvRuWrgGUKMw4uDN8l8DSRSN1oOA5+6twTDFX4OrsXP9TAcQCOg49kPU0kUjdwHJs3\n        b+51HBrkkepgmcILYPyg0LVr11xNJFJHGo7D2wDxsJtEA6UKG3WAduKd+Zo4Mw5PE4nUkU2bNiVtvFHp\n        JUZaA8eBd75//36pj42HAm+KU4+0RsNx8GSMVIvWg3z6wz5HmB6J1JXOzs5exxFugERaB89MJ/MxMl+0\n        8zSRSN1oOA5+Bizc/Ii0Dh3Mkek/ziNMj0TqCK8YNByHpiBlkNd5E+lP29HSyTgOliue5nXnTR4rrys4\n        j40bNyZt/NS5J4i0BjcNncyShS8HeRpLvMnebOpy/ZscB5WOVAsOQ0dmHWF6JFJHcB6p4+Crtp4g0jqa\n        cciJRIYu3BBefKQZxnJHR8c/bZ2dnQf4vQgGeaRaNLWLRF4X+I3aHp/x37b29vb/bNiw4SS/VMQvh0ci\n        r5Lu7m43vj9UYSPSF37eoGe2sau9vf2t/wPbtfoAS6Ir0gAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"KeyPicture.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQg\n        djMuMzap5+IlAAAD2ElEQVRYR+3TbUxbVRwG8BZ1iZlAYnz5sA+GRDrDBxUdb6OFhPJW+sLEbdlWoIVB\n        w6SD4oD1FRgwpzJ1REOyoRkDTJxM3SJjbsCWbZbKGJRNhFJC3XQbzpjFxEhcYnx8ermswY+yj32SX+69\n        555z/ufk3iMJJ5xwwgnnv4mXSNeQgpoSH1vjtqSm3t8WKwvw+VOqJSU9KXZ/eEmSSLekSCO+sSQk/NVV\n        YsRw7R5MOR2Ytdvhdzgw7XJi1GHH2fo69Fbu+of99eLQ1UcukW5qlafCW1+L6RoL5t8+gF/7+rDo9eK+\n        zydYnJjAvdOn8UvnxxhXa6CQRpwQh68+aRJpZdurr+BmWxsW3e6QkZGVPB6BV6OFcu3a2xxnEBVTkaiQ\n        9KIdou20jQrocbFsKGysbk9Ogn9vPfw1NZirq8Pdw4fxR39/CHe/7HttPoZLSzFoNArOGow4w+sAP11/\n        iQFf8/6k0YCTBgO+NBTjBPUZitBTqIcmMmqc9Z4SSy+FDW92KOQYY8fPOcknRYW4ykl+O3IEv3d3L+np\n        eWDhrQNYaN2PO62tuN3cglstLfipuRk36QYF9jVhnuaaGuGn2aYGzDQ2wF1RhlPFepTLZLdYM0YsLyyg\n        vjM9DZeqd4P3RjId32VCoKoK9w4dWtLeLrjQ0IhBpxODjiVD/EHP8wc977STAxfoosuBSy674HKDHW6X\n        DSPkcVkxWFWBU0VboX3m2Z/F8sICbF3KDEy9dxDqqOixdGnEuWG7FTfMZiywgIBFg6ZtNkxbrZjh6fDx\n        VCyfkjkWnrJUw1NqgN9uQ6DBiWtVZlws3o4JcwV+dNjwQ201vtqSD7N8Y3CjH4jlhQW4erMzMWUyYfbo\n        Ufi6j2FmZznmS3divqzsgUB5eQj7+viNJze/jvGCAoy+tgkDGhU6VDk4p8rGsE6NXrLy036Yl43PVEr0\n        5inxxsaUYPGDYumlsKHpeG42rqnVuK7R4DqP2RSvAq02RKcTrpN872XfUVUujum0aGSRvSnJ0Mc+H5z8\n        sik2FvuylMiOjLrL593UqY6O/rNQJgu+bxXLhhJs/EKdi6tpabiyYQOuJCSEJCZibFlSEsYUaTjDosGd\n        vpuZgR0xMX9zfAXl0YvifCraQ1FCAYb3kRQnPq4MX7R8lJWBb/N1mMzhQuQKjMbHw73+BYzExcHz0ssY\n        5QK+S5XDk5mJd/i5OKaXKilRnOb/h5M8Rz3pEY8Etq5bB1dyIrpyczDEnQ7o8tGjUeN9FrYmJ6NkvQxZ\n        T0TeYf+VZ/lhhRM/TVraT0OiDrKQmmLpUbF7OOGEE84qI5H8C2HafbcrbFdPAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"AuthenticationErrorGuideLabel.Text\" xml:space=\"preserve\">\n    <value>Either the ID or the Verification Code (or both) you provided was wrong.\n\nSelect the \"Previous\" button and retry, entering the correct credentials.\n\nIf this account was freshly created, you have to wait, at least one hour,\nfor CCP to include it in the API.</value>\n  </data>\n  <data name=\"LoginDeniedLinkLabel.Text\" xml:space=\"preserve\">\n    <value>The subscription of the account, this API key belongs to, has expired.\n\nIf the API key belongs to one of your accounts, consider re-subscribing at :\nhttps://secure.eveonline.com/AccountManMenu.aspx\n</value>\n  </data>\n  <metadata name=\"errorProvider.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/EsiKeysListBox.cs",
    "content": "﻿using EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Properties;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing System.Windows.Forms.VisualStyles;\n\nnamespace EVEMon.ApiCredentialsManagement\n{\n    /// <summary>\n    /// Displays a list of API keys.\n    /// </summary>\n    public sealed class EsiKeysListBox : NoFlickerListBox\n    {\n        private readonly Font m_smallFont;\n        private readonly Font m_smallBoldFont;\n        private readonly Font m_strikeoutFont;\n        private readonly Font m_middleFont;\n        private readonly Font m_boldFont;\n\n        private readonly List<ESIKey> m_esiKeys = new List<ESIKey>();\n        private bool m_pendingUpdate;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public EsiKeysListBox()\n        {\n            DrawMode = DrawMode.OwnerDrawFixed;\n            DrawItem += OnDrawItem;\n            \n            m_smallFont = FontFactory.GetFont(Font.FontFamily, 6.5f);\n            m_smallBoldFont = FontFactory.GetFont(m_smallFont, FontStyle.Bold);\n            m_strikeoutFont = FontFactory.GetFont(m_smallFont, FontStyle.Strikeout);\n            m_middleFont = FontFactory.GetFont(Font.FontFamily, 8.0f);\n            m_boldFont = FontFactory.GetFont(Font, FontStyle.Bold);\n        }\n\n        /// <summary>\n        /// Releases the unmanaged resources used by the <see cref=\"T:System.Windows.Forms.Control\"/> \n        /// and its child controls and optionally releases the managed resources.\n        /// </summary>\n        /// <param name=\"disposing\">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param>\n        protected override void Dispose(bool disposing)\n        {\n            DrawItem -= OnDrawItem;\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of displayed ESI keys.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        public IEnumerable<ESIKey> ESIKeys\n        {\n            get { return m_esiKeys; }\n            set\n            {\n                m_esiKeys.Clear();\n                if (value != null)\n                    m_esiKeys.AddRange(value);\n\n                UpdateContent();\n            }\n        }\n\n        /// <summary>\n        /// Gets the size of the check box.\n        /// </summary>\n        /// <value>The size of the check box.</value>\n        internal static Size CheckBoxSize => new Size(12, 12);\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            if (!Visible)\n            {\n                m_pendingUpdate = true;\n                return;\n            }\n            m_pendingUpdate = false;\n\n            int scrollBarPosition = TopIndex;\n            ESIKey oldSelection = SelectedItem as ESIKey;\n\n            BeginUpdate();\n            try\n            {\n                Items.Clear();\n                foreach (ESIKey apiKey in ESIKeys)\n                {\n                    Items.Add(apiKey);\n                    if (apiKey == oldSelection)\n                        SelectedIndex = Items.Count - 1;\n                }\n            }\n            finally\n            {\n                EndUpdate();\n                TopIndex = scrollBarPosition;\n            }\n        }\n\n        /// <summary>\n        /// When the visibility changes, we check whether there is an update pending.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (Visible && m_pendingUpdate)\n                UpdateContent();\n        }\n\n        /// <summary>\n        /// Draws the ESI key info.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void OnDrawItem(object sender, DrawItemEventArgs e)\n        {\n            ItemHeight = m_boldFont.Height + m_middleFont.Height + m_smallBoldFont.Height * 2;\n\n            // Background\n            Graphics g = e.Graphics;\n            bool isSelected = (e.State & DrawItemState.Selected) == DrawItemState.Selected;\n            Brush fontBrush = isSelected ? SystemBrushes.HighlightText : SystemBrushes.ControlText;\n            e.DrawBackground();\n\n            if (e.Index < 0 || e.Index >= Items.Count)\n                return;\n\n            ESIKey esiKey = (ESIKey)Items[e.Index];\n            Image icon = GetIcon(esiKey);\n\n            Margin = new Padding((ItemHeight - icon.Height) / 2);\n            int left = e.Bounds.Left + Margin.Left;\n            int top = e.Bounds.Top + Margin.Top / 4;\n\n            // Draws the checbox\n            CheckBoxRenderer.DrawCheckBox(g, new Point(left, (ItemHeight - CheckBoxSize.Height) / 2),\n                                          esiKey.Monitored ? CheckBoxState.CheckedNormal : CheckBoxState.UncheckedNormal);\n            left += CheckBoxSize.Width + Margin.Left * 2;\n\n            // Draws the picture of the API key type\n            g.DrawImage(icon, new Rectangle(left, top + Margin.Top, icon.Width, icon.Height));\n\n            // Texts drawing\n            DrawTexts(g, esiKey, left, top, fontBrush, icon);\n\n            e.DrawFocusRectangle();\n        }\n\n        /// <summary>\n        /// Draws the texts.\n        /// </summary>\n        /// <param name=\"top\">The top.</param>\n        /// <param name=\"g\">The g.</param>\n        /// <param name=\"esiKey\">The ESI key.</param>\n        /// <param name=\"left\">The left.</param>\n        /// <param name=\"fontBrush\">The font brush.</param>\n        /// <param name=\"icon\">The icon.</param>\n        private void DrawTexts(Graphics g, ESIKey esiKey, int left, int top, Brush fontBrush, Image icon)\n        {\n            // Draws the texts on the upper third\n            left += icon.Width + Margin.Left;\n\n            // Api key ID\n            string apiKeyId = esiKey.ID.ToString(CultureConstants.InvariantCulture);\n            g.DrawString(apiKeyId, m_boldFont, fontBrush, new Point(left, top + 2));\n            int indentedLeft = left + g.MeasureString(apiKeyId, m_boldFont).ToSize().Width + Margin.Left * 2;\n\n            // Api key verification code\n            string tokenText = string.IsNullOrEmpty(esiKey.AccessToken) ? \"No access token\" : \"Access token present\";\n            g.DrawString(tokenText, Font, fontBrush, new Point(indentedLeft, top));\n            indentedLeft += g.MeasureString(esiKey.AccessToken, Font).ToSize().Width + Margin.Left * 2;\n\n            // Draw the texts on the middle third\n            top += g.MeasureString(apiKeyId, Font).ToSize().Height;\n\n#if false\n            // Account header\n            string accountHeader = \"Account\";\n            g.DrawString(accountHeader, m_boldFont, fontBrush, new Point(left, top));\n            indentedLeft = left + g.MeasureString(accountHeader, m_boldFont).ToSize().Width + Margin.Left * 2;\n\n            // Account created\n            string accountCreatedText = esiKey.AccountCreated != DateTime.MinValue\n                ? esiKey.AccountCreated.ToLocalTime().ToString(CultureConstants.DefaultCulture)\n                : \"-\";\n            string accountCreated = $\"Created: {accountCreatedText}\";\n\n            g.DrawString(accountCreated, m_middleFont, fontBrush, new Point(indentedLeft, top));\n            indentedLeft += g.MeasureString(accountCreated, m_middleFont).ToSize().Width + Margin.Left * 2;\n\n            // Account paid until\n            string accountPaidUntilText = esiKey.AccountExpires != DateTime.MinValue\n                ? esiKey.AccountExpires.ToLocalTime().ToString(CultureConstants.DefaultCulture)\n                : \"-\";\n            string accountPaidUntil = $\"Paid Until: {accountPaidUntilText}\";\n            g.DrawString(accountPaidUntil, m_middleFont, fontBrush, new Point(indentedLeft, top));\n            indentedLeft += g.MeasureString(accountPaidUntil, m_middleFont).ToSize().Width + Margin.Left * 2;\n\n            // Account status header\n            string accountStatusHeader = \"Status: \";   \n            g.DrawString(accountStatusHeader, m_middleFont, fontBrush, new Point(indentedLeft, top));\n            indentedLeft += g.MeasureString(accountStatusHeader, m_middleFont).ToSize().Width;\n\n            // Account status body\n            string accountStatusBody = esiKey.AccountExpires != DateTime.MinValue\n                ? esiKey.AccountExpires > DateTime.UtcNow\n                    ? \"Active\"\n                    : \"Expired\"\n                : \"-\";\n            Brush accountStatusBrush = esiKey.AccountExpires != DateTime.MinValue\n                ? new SolidBrush(esiKey.AccountExpires > DateTime.UtcNow ? Color.DarkGreen : Color.Red)\n                : fontBrush;\n            g.DrawString(accountStatusBody, m_middleFont, accountStatusBrush, new Point(indentedLeft, top));\n            \n            // Draws the texts on the lower third\n            top += g.MeasureString(accountCreated, m_middleFont).ToSize().Height;\n#endif\n            bool isFirst = true;\n\n            foreach (CharacterIdentity identity in esiKey.CharacterIdentities)\n            {\n                // Draws \"; \" between ids\n                if (!isFirst)\n                {\n                    g.DrawString(\"; \", m_smallFont, fontBrush, new Point(left, top));\n                    left += g.MeasureString(\"; \", Font).ToSize().Width;\n                }\n                isFirst = false;\n\n                // Selects font\n                Font font = m_smallFont;\n                CCPCharacter ccpCharacter = identity.CCPCharacter;\n                if (ccpCharacter != null && ccpCharacter.Monitored)\n                    font = m_smallBoldFont;\n\n                // Draws character's name\n                g.DrawString(identity.CharacterName, font, fontBrush, new Point(left, top));\n                left += g.MeasureString(identity.CharacterName, font).ToSize().Width;\n            }\n        }\n        \n        /// <summary>\n        /// Gets the icon.\n        /// </summary>\n        /// <param name=\"apiKey\">The API key.</param>\n        /// <returns></returns>\n        private static Image GetIcon(ESIKey apiKey)\n        {\n            Image icon;\n            if (apiKey.HasError)\n                icon = Resources.KeyWrong32;\n            else\n                icon = Resources.DefaultCharacterImage32;\n            return icon;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/EsiKeysManagementWindow.Designer.cs",
    "content": "﻿using EVEMon.Common.Controls.MultiPanel;\n\nnamespace EVEMon.ApiCredentialsManagement\n{\n    partial class EsiKeysManagementWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n\t\t\tSystem.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(new string[] {\n            \"\",\n            \"CCP\",\n            \"987654321\",\n            \"John Doe\",\n            \"123456\",\n            \"Auto\",\n            \"(none)\"}, 0);\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EsiKeysManagementWindow));\n\t\t\tthis.esiKeysLabel = new System.Windows.Forms.Label();\n\t\t\tthis.charactersLabel = new System.Windows.Forms.Label();\n\t\t\tthis.esiKeyListLabel = new System.Windows.Forms.Label();\n\t\t\tthis.charactersListLabel = new System.Windows.Forms.Label();\n\t\t\tthis.closeButton = new System.Windows.Forms.Button();\n\t\t\tthis.tabControl = new System.Windows.Forms.TabControl();\n\t\t\tthis.charactersTabPage = new System.Windows.Forms.TabPage();\n\t\t\tthis.charactersPagePanel = new System.Windows.Forms.Panel();\n\t\t\tthis.charactersMultiPanel = new EVEMon.Common.Controls.MultiPanel.MultiPanel();\n\t\t\tthis.charactersListPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.charactersListView = new System.Windows.Forms.ListView();\n\t\t\tthis.columnMonitored = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.columnType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.columnID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.columnName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.columnESIKeyID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.columnStatus = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.columnUri = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.noCharactersPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.charactersToolStrip = new System.Windows.Forms.ToolStrip();\n\t\t\tthis.importCharacterMenu = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.deleteCharacterMenu = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.editUriMenu = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.groupingMenu = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.esiKeysTabPage = new System.Windows.Forms.TabPage();\n\t\t\tthis.esiKeysPagePanel = new System.Windows.Forms.Panel();\n\t\t\tthis.esiKeysMultiPanel = new EVEMon.Common.Controls.MultiPanel.MultiPanel();\n\t\t\tthis.esiKeysListPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.esiKeysListBox = new EVEMon.ApiCredentialsManagement.EsiKeysListBox();\n\t\t\tthis.noESIKeysPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.esiKeysToolStrip = new System.Windows.Forms.ToolStrip();\n\t\t\tthis.addESIKeyMenu = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.deleteESIKeyMenu = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.editESIKeyMenu = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.tabControl.SuspendLayout();\n\t\t\tthis.charactersTabPage.SuspendLayout();\n\t\t\tthis.charactersPagePanel.SuspendLayout();\n\t\t\tthis.charactersMultiPanel.SuspendLayout();\n\t\t\tthis.charactersListPage.SuspendLayout();\n\t\t\tthis.noCharactersPage.SuspendLayout();\n\t\t\tthis.charactersToolStrip.SuspendLayout();\n\t\t\tthis.esiKeysTabPage.SuspendLayout();\n\t\t\tthis.esiKeysPagePanel.SuspendLayout();\n\t\t\tthis.esiKeysMultiPanel.SuspendLayout();\n\t\t\tthis.esiKeysListPage.SuspendLayout();\n\t\t\tthis.noESIKeysPage.SuspendLayout();\n\t\t\tthis.esiKeysToolStrip.SuspendLayout();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// esiKeysLabel\n\t\t\t// \n\t\t\tthis.esiKeysLabel.AutoSize = true;\n\t\t\tthis.esiKeysLabel.Dock = System.Windows.Forms.DockStyle.Top;\n\t\t\tthis.esiKeysLabel.ForeColor = System.Drawing.SystemColors.Highlight;\n\t\t\tthis.esiKeysLabel.Location = new System.Drawing.Point(3, 3);\n\t\t\tthis.esiKeysLabel.Name = \"esiKeysLabel\";\n\t\t\tthis.esiKeysLabel.Size = new System.Drawing.Size(50, 13);\n\t\t\tthis.esiKeysLabel.TabIndex = 1;\n\t\t\tthis.esiKeysLabel.Text = \"ESI Keys\";\n\t\t\t// \n\t\t\t// charactersLabel\n\t\t\t// \n\t\t\tthis.charactersLabel.AutoSize = true;\n\t\t\tthis.charactersLabel.Dock = System.Windows.Forms.DockStyle.Top;\n\t\t\tthis.charactersLabel.ForeColor = System.Drawing.SystemColors.Highlight;\n\t\t\tthis.charactersLabel.Location = new System.Drawing.Point(3, 3);\n\t\t\tthis.charactersLabel.Name = \"charactersLabel\";\n\t\t\tthis.charactersLabel.Size = new System.Drawing.Size(58, 13);\n\t\t\tthis.charactersLabel.TabIndex = 5;\n\t\t\tthis.charactersLabel.Text = \"Characters\";\n\t\t\t// \n\t\t\t// esiKeyListLabel\n\t\t\t// \n\t\t\tthis.esiKeyListLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.esiKeyListLabel.ForeColor = System.Drawing.SystemColors.ControlDarkDark;\n\t\t\tthis.esiKeyListLabel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.esiKeyListLabel.Name = \"esiKeyListLabel\";\n\t\t\tthis.esiKeyListLabel.Size = new System.Drawing.Size(796, 318);\n\t\t\tthis.esiKeyListLabel.TabIndex = 0;\n\t\t\tthis.esiKeyListLabel.Text = \"First add your ESI key using the above buttons.\";\n\t\t\tthis.esiKeyListLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n\t\t\t// \n\t\t\t// charactersListLabel\n\t\t\t// \n\t\t\tthis.charactersListLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.charactersListLabel.ForeColor = System.Drawing.SystemColors.ControlDarkDark;\n\t\t\tthis.charactersListLabel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.charactersListLabel.Name = \"charactersListLabel\";\n\t\t\tthis.charactersListLabel.Size = new System.Drawing.Size(796, 318);\n\t\t\tthis.charactersListLabel.TabIndex = 10;\n\t\t\tthis.charactersListLabel.Text = \"First add your ESI key at ESI Keys section, characters will then appear in this l\" +\n    \"ist.\\r\\nYou can also import XML character sheets from files or URLs.\";\n\t\t\tthis.charactersListLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n\t\t\t// \n\t\t\t// closeButton\n\t\t\t// \n\t\t\tthis.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.closeButton.CausesValidation = false;\n\t\t\tthis.closeButton.Location = new System.Drawing.Point(732, 406);\n\t\t\tthis.closeButton.Name = \"closeButton\";\n\t\t\tthis.closeButton.Size = new System.Drawing.Size(90, 23);\n\t\t\tthis.closeButton.TabIndex = 9;\n\t\t\tthis.closeButton.Text = \"&Close\";\n\t\t\tthis.closeButton.UseVisualStyleBackColor = true;\n\t\t\tthis.closeButton.Click += new System.EventHandler(this.closeButton_Click);\n\t\t\t// \n\t\t\t// tabControl\n\t\t\t// \n\t\t\tthis.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.tabControl.Controls.Add(this.charactersTabPage);\n\t\t\tthis.tabControl.Controls.Add(this.esiKeysTabPage);\n\t\t\tthis.tabControl.Location = new System.Drawing.Point(12, 12);\n\t\t\tthis.tabControl.Name = \"tabControl\";\n\t\t\tthis.tabControl.SelectedIndex = 0;\n\t\t\tthis.tabControl.Size = new System.Drawing.Size(810, 388);\n\t\t\tthis.tabControl.TabIndex = 12;\n\t\t\t// \n\t\t\t// charactersTabPage\n\t\t\t// \n\t\t\tthis.charactersTabPage.Controls.Add(this.charactersPagePanel);\n\t\t\tthis.charactersTabPage.Controls.Add(this.charactersLabel);\n\t\t\tthis.charactersTabPage.Location = new System.Drawing.Point(4, 22);\n\t\t\tthis.charactersTabPage.Name = \"charactersTabPage\";\n\t\t\tthis.charactersTabPage.Padding = new System.Windows.Forms.Padding(3);\n\t\t\tthis.charactersTabPage.Size = new System.Drawing.Size(802, 362);\n\t\t\tthis.charactersTabPage.TabIndex = 1;\n\t\t\tthis.charactersTabPage.Text = \"Characters\";\n\t\t\tthis.charactersTabPage.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// charactersPagePanel\n\t\t\t// \n\t\t\tthis.charactersPagePanel.Controls.Add(this.charactersMultiPanel);\n\t\t\tthis.charactersPagePanel.Controls.Add(this.charactersToolStrip);\n\t\t\tthis.charactersPagePanel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.charactersPagePanel.Location = new System.Drawing.Point(3, 16);\n\t\t\tthis.charactersPagePanel.Name = \"charactersPagePanel\";\n\t\t\tthis.charactersPagePanel.Size = new System.Drawing.Size(796, 343);\n\t\t\tthis.charactersPagePanel.TabIndex = 16;\n\t\t\t// \n\t\t\t// charactersMultiPanel\n\t\t\t// \n\t\t\tthis.charactersMultiPanel.Controls.Add(this.charactersListPage);\n\t\t\tthis.charactersMultiPanel.Controls.Add(this.noCharactersPage);\n\t\t\tthis.charactersMultiPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.charactersMultiPanel.Location = new System.Drawing.Point(0, 25);\n\t\t\tthis.charactersMultiPanel.Name = \"charactersMultiPanel\";\n\t\t\tthis.charactersMultiPanel.SelectedPage = this.charactersListPage;\n\t\t\tthis.charactersMultiPanel.Size = new System.Drawing.Size(796, 318);\n\t\t\tthis.charactersMultiPanel.TabIndex = 15;\n\t\t\t// \n\t\t\t// charactersListPage\n\t\t\t// \n\t\t\tthis.charactersListPage.BackColor = System.Drawing.SystemColors.Window;\n\t\t\tthis.charactersListPage.Controls.Add(this.charactersListView);\n\t\t\tthis.charactersListPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.charactersListPage.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.charactersListPage.Name = \"charactersListPage\";\n\t\t\tthis.charactersListPage.Size = new System.Drawing.Size(796, 318);\n\t\t\tthis.charactersListPage.TabIndex = 0;\n\t\t\tthis.charactersListPage.Text = \"charactersListPage\";\n\t\t\t// \n\t\t\t// charactersListView\n\t\t\t// \n\t\t\tthis.charactersListView.CheckBoxes = true;\n\t\t\tthis.charactersListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.columnMonitored,\n            this.columnType,\n            this.columnID,\n            this.columnName,\n            this.columnESIKeyID,\n            this.columnStatus,\n            this.columnUri});\n\t\t\tthis.charactersListView.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.charactersListView.FullRowSelect = true;\n\t\t\tthis.charactersListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\n\t\t\tlistViewItem1.StateImageIndex = 0;\n\t\t\tthis.charactersListView.Items.AddRange(new System.Windows.Forms.ListViewItem[] {\n            listViewItem1});\n\t\t\tthis.charactersListView.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.charactersListView.MultiSelect = false;\n\t\t\tthis.charactersListView.Name = \"charactersListView\";\n\t\t\tthis.charactersListView.Size = new System.Drawing.Size(796, 318);\n\t\t\tthis.charactersListView.TabIndex = 12;\n\t\t\tthis.charactersListView.UseCompatibleStateImageBehavior = false;\n\t\t\tthis.charactersListView.View = System.Windows.Forms.View.Details;\n\t\t\tthis.charactersListView.ColumnWidthChanging += new System.Windows.Forms.ColumnWidthChangingEventHandler(this.charactersListView_ColumnWidthChanging);\n\t\t\tthis.charactersListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.charactersListView_ItemChecked);\n\t\t\tthis.charactersListView.SelectedIndexChanged += new System.EventHandler(this.charactersListView_SelectedIndexChanged);\n\t\t\tthis.charactersListView.DoubleClick += new System.EventHandler(this.charactersListView_DoubleClick);\n\t\t\tthis.charactersListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.charactersListView_KeyDown);\n\t\t\t// \n\t\t\t// columnMonitored\n\t\t\t// \n\t\t\tthis.columnMonitored.Text = \"\";\n\t\t\tthis.columnMonitored.Width = 36;\n\t\t\t// \n\t\t\t// columnType\n\t\t\t// \n\t\t\tthis.columnType.Text = \"Type\";\n\t\t\tthis.columnType.Width = 49;\n\t\t\t// \n\t\t\t// columnID\n\t\t\t// \n\t\t\tthis.columnID.Text = \"ID\";\n\t\t\tthis.columnID.Width = 84;\n\t\t\t// \n\t\t\t// columnName\n\t\t\t// \n\t\t\tthis.columnName.Text = \"Name\";\n\t\t\tthis.columnName.Width = 117;\n\t\t\t// \n\t\t\t// columnESIKeyID\n\t\t\t// \n\t\t\tthis.columnESIKeyID.Text = \"Key ID\";\n\t\t\tthis.columnESIKeyID.Width = 75;\n\t\t\t// \n\t\t\t// columnStatus\n\t\t\t// \n\t\t\tthis.columnStatus.Text = \"Status\";\n\t\t\t// \n\t\t\t// columnUri\n\t\t\t// \n\t\t\tthis.columnUri.Text = \"Uri\";\n\t\t\tthis.columnUri.Width = 358;\n\t\t\t// \n\t\t\t// noCharactersPage\n\t\t\t// \n\t\t\tthis.noCharactersPage.Controls.Add(this.charactersListLabel);\n\t\t\tthis.noCharactersPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.noCharactersPage.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.noCharactersPage.Name = \"noCharactersPage\";\n\t\t\tthis.noCharactersPage.Size = new System.Drawing.Size(796, 318);\n\t\t\tthis.noCharactersPage.TabIndex = 1;\n\t\t\tthis.noCharactersPage.Text = \"noCharactersPage\";\n\t\t\t// \n\t\t\t// charactersToolStrip\n\t\t\t// \n\t\t\tthis.charactersToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n\t\t\tthis.charactersToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.importCharacterMenu,\n            this.deleteCharacterMenu,\n            this.editUriMenu,\n            this.groupingMenu});\n\t\t\tthis.charactersToolStrip.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.charactersToolStrip.Name = \"charactersToolStrip\";\n\t\t\tthis.charactersToolStrip.Size = new System.Drawing.Size(796, 25);\n\t\t\tthis.charactersToolStrip.TabIndex = 13;\n\t\t\t// \n\t\t\t// importCharacterMenu\n\t\t\t// \n\t\t\tthis.importCharacterMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"importCharacterMenu.Image\")));\n\t\t\tthis.importCharacterMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.importCharacterMenu.Name = \"importCharacterMenu\";\n\t\t\tthis.importCharacterMenu.Size = new System.Drawing.Size(72, 22);\n\t\t\tthis.importCharacterMenu.Text = \"&Import...\";\n\t\t\tthis.importCharacterMenu.Click += new System.EventHandler(this.importCharacterMenu_Click);\n\t\t\t// \n\t\t\t// deleteCharacterMenu\n\t\t\t// \n\t\t\tthis.deleteCharacterMenu.Enabled = false;\n\t\t\tthis.deleteCharacterMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"deleteCharacterMenu.Image\")));\n\t\t\tthis.deleteCharacterMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.deleteCharacterMenu.Name = \"deleteCharacterMenu\";\n\t\t\tthis.deleteCharacterMenu.Size = new System.Drawing.Size(69, 22);\n\t\t\tthis.deleteCharacterMenu.Text = \"&Delete...\";\n\t\t\tthis.deleteCharacterMenu.Click += new System.EventHandler(this.deleteCharacterMenu_Click);\n\t\t\t// \n\t\t\t// editUriMenu\n\t\t\t// \n\t\t\tthis.editUriMenu.Enabled = false;\n\t\t\tthis.editUriMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"editUriMenu.Image\")));\n\t\t\tthis.editUriMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.editUriMenu.Name = \"editUriMenu\";\n\t\t\tthis.editUriMenu.Size = new System.Drawing.Size(74, 22);\n\t\t\tthis.editUriMenu.Text = \"&Edit Uri...\";\n\t\t\tthis.editUriMenu.Click += new System.EventHandler(this.editUriButton_Click);\n\t\t\t// \n\t\t\t// groupingMenu\n\t\t\t// \n\t\t\tthis.groupingMenu.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n\t\t\tthis.groupingMenu.Checked = true;\n\t\t\tthis.groupingMenu.CheckOnClick = true;\n\t\t\tthis.groupingMenu.CheckState = System.Windows.Forms.CheckState.Checked;\n\t\t\tthis.groupingMenu.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;\n\t\t\tthis.groupingMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.groupingMenu.Name = \"groupingMenu\";\n\t\t\tthis.groupingMenu.Size = new System.Drawing.Size(101, 22);\n\t\t\tthis.groupingMenu.Text = \"&Group characters\";\n\t\t\tthis.groupingMenu.Click += new System.EventHandler(this.groupingMenu_Click);\n\t\t\t// \n\t\t\t// esiKeysTabPage\n\t\t\t// \n\t\t\tthis.esiKeysTabPage.Controls.Add(this.esiKeysPagePanel);\n\t\t\tthis.esiKeysTabPage.Controls.Add(this.esiKeysLabel);\n\t\t\tthis.esiKeysTabPage.Location = new System.Drawing.Point(4, 22);\n\t\t\tthis.esiKeysTabPage.Name = \"esiKeysTabPage\";\n\t\t\tthis.esiKeysTabPage.Padding = new System.Windows.Forms.Padding(3);\n\t\t\tthis.esiKeysTabPage.Size = new System.Drawing.Size(802, 362);\n\t\t\tthis.esiKeysTabPage.TabIndex = 0;\n\t\t\tthis.esiKeysTabPage.Text = \"ESI Keys\";\n\t\t\tthis.esiKeysTabPage.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// esiKeysPagePanel\n\t\t\t// \n\t\t\tthis.esiKeysPagePanel.Controls.Add(this.esiKeysMultiPanel);\n\t\t\tthis.esiKeysPagePanel.Controls.Add(this.esiKeysToolStrip);\n\t\t\tthis.esiKeysPagePanel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.esiKeysPagePanel.Location = new System.Drawing.Point(3, 16);\n\t\t\tthis.esiKeysPagePanel.Name = \"esiKeysPagePanel\";\n\t\t\tthis.esiKeysPagePanel.Size = new System.Drawing.Size(796, 343);\n\t\t\tthis.esiKeysPagePanel.TabIndex = 17;\n\t\t\t// \n\t\t\t// esiKeysMultiPanel\n\t\t\t// \n\t\t\tthis.esiKeysMultiPanel.Controls.Add(this.esiKeysListPage);\n\t\t\tthis.esiKeysMultiPanel.Controls.Add(this.noESIKeysPage);\n\t\t\tthis.esiKeysMultiPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.esiKeysMultiPanel.Location = new System.Drawing.Point(0, 25);\n\t\t\tthis.esiKeysMultiPanel.Name = \"esiKeysMultiPanel\";\n\t\t\tthis.esiKeysMultiPanel.SelectedPage = this.noESIKeysPage;\n\t\t\tthis.esiKeysMultiPanel.Size = new System.Drawing.Size(796, 318);\n\t\t\tthis.esiKeysMultiPanel.TabIndex = 16;\n\t\t\t// \n\t\t\t// esiKeysListPage\n\t\t\t// \n\t\t\tthis.esiKeysListPage.BackColor = System.Drawing.SystemColors.Window;\n\t\t\tthis.esiKeysListPage.Controls.Add(this.esiKeysListBox);\n\t\t\tthis.esiKeysListPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.esiKeysListPage.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.esiKeysListPage.Name = \"esiKeysListPage\";\n\t\t\tthis.esiKeysListPage.Size = new System.Drawing.Size(796, 318);\n\t\t\tthis.esiKeysListPage.TabIndex = 0;\n\t\t\tthis.esiKeysListPage.Text = \"\";\n\t\t\t// \n\t\t\t// esiKeysListBox\n\t\t\t// \n\t\t\tthis.esiKeysListBox.BorderStyle = System.Windows.Forms.BorderStyle.None;\n\t\t\tthis.esiKeysListBox.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.esiKeysListBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;\n\t\t\tthis.esiKeysListBox.FormattingEnabled = true;\n\t\t\tthis.esiKeysListBox.ItemHeight = 46;\n\t\t\tthis.esiKeysListBox.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.esiKeysListBox.Name = \"esiKeysListBox\";\n\t\t\tthis.esiKeysListBox.Size = new System.Drawing.Size(796, 318);\n\t\t\tthis.esiKeysListBox.TabIndex = 0;\n\t\t\tthis.esiKeysListBox.MouseClick += new System.Windows.Forms.MouseEventHandler(this.apiKeysListBox_MouseClick);\n\t\t\tthis.esiKeysListBox.SelectedIndexChanged += new System.EventHandler(this.apiKeysListBox_SelectedIndexChanged);\n\t\t\tthis.esiKeysListBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.esiKeysListBox_KeyDown);\n\t\t\tthis.esiKeysListBox.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.apiKeysListBox_MouseDoubleClick);\n\t\t\t// \n\t\t\t// noESIKeysPage\n\t\t\t// \n\t\t\tthis.noESIKeysPage.Controls.Add(this.esiKeyListLabel);\n\t\t\tthis.noESIKeysPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.noESIKeysPage.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.noESIKeysPage.Name = \"noESIKeysPage\";\n\t\t\tthis.noESIKeysPage.Size = new System.Drawing.Size(796, 318);\n\t\t\tthis.noESIKeysPage.TabIndex = 1;\n\t\t\tthis.noESIKeysPage.Text = \"\";\n\t\t\t// \n\t\t\t// esiKeysToolStrip\n\t\t\t// \n\t\t\tthis.esiKeysToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n\t\t\tthis.esiKeysToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.addESIKeyMenu,\n            this.deleteESIKeyMenu,\n            this.editESIKeyMenu});\n\t\t\tthis.esiKeysToolStrip.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.esiKeysToolStrip.Name = \"esiKeysToolStrip\";\n\t\t\tthis.esiKeysToolStrip.Size = new System.Drawing.Size(796, 25);\n\t\t\tthis.esiKeysToolStrip.TabIndex = 3;\n\t\t\t// \n\t\t\t// addESIKeyMenu\n\t\t\t// \n\t\t\tthis.addESIKeyMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"addESIKeyMenu.Image\")));\n\t\t\tthis.addESIKeyMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.addESIKeyMenu.Name = \"addESIKeyMenu\";\n\t\t\tthis.addESIKeyMenu.Size = new System.Drawing.Size(58, 22);\n\t\t\tthis.addESIKeyMenu.Text = \"&Add...\";\n\t\t\tthis.addESIKeyMenu.Click += new System.EventHandler(this.addESIKeyMenu_Click);\n\t\t\t// \n\t\t\t// deleteESIKeyMenu\n\t\t\t// \n\t\t\tthis.deleteESIKeyMenu.Enabled = false;\n\t\t\tthis.deleteESIKeyMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"deleteESIKeyMenu.Image\")));\n\t\t\tthis.deleteESIKeyMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.deleteESIKeyMenu.Name = \"deleteESIKeyMenu\";\n\t\t\tthis.deleteESIKeyMenu.Size = new System.Drawing.Size(69, 22);\n\t\t\tthis.deleteESIKeyMenu.Text = \"&Delete...\";\n\t\t\tthis.deleteESIKeyMenu.Click += new System.EventHandler(this.deleteESIKeyMenu_Click);\n\t\t\t// \n\t\t\t// editESIKeyMenu\n\t\t\t// \n\t\t\tthis.editESIKeyMenu.Enabled = false;\n\t\t\tthis.editESIKeyMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"editESIKeyMenu.Image\")));\n\t\t\tthis.editESIKeyMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.editESIKeyMenu.Name = \"editESIKeyMenu\";\n\t\t\tthis.editESIKeyMenu.Size = new System.Drawing.Size(56, 22);\n\t\t\tthis.editESIKeyMenu.Text = \"&Edit...\";\n\t\t\tthis.editESIKeyMenu.Click += new System.EventHandler(this.editAPIKeyMenu_Click);\n\t\t\t// \n\t\t\t// EsiKeysManagementWindow\n\t\t\t// \n\t\t\tthis.AcceptButton = this.closeButton;\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n\t\t\tthis.BackColor = System.Drawing.SystemColors.Window;\n\t\t\tthis.CausesValidation = false;\n\t\t\tthis.ClientSize = new System.Drawing.Size(834, 441);\n\t\t\tthis.Controls.Add(this.tabControl);\n\t\t\tthis.Controls.Add(this.closeButton);\n\t\t\tthis.MaximizeBox = false;\n\t\t\tthis.MinimumSize = new System.Drawing.Size(600, 400);\n\t\t\tthis.Name = \"EsiKeysManagementWindow\";\n\t\t\tthis.Text = \"ESI Keys Management\";\n\t\t\tthis.tabControl.ResumeLayout(false);\n\t\t\tthis.charactersTabPage.ResumeLayout(false);\n\t\t\tthis.charactersTabPage.PerformLayout();\n\t\t\tthis.charactersPagePanel.ResumeLayout(false);\n\t\t\tthis.charactersPagePanel.PerformLayout();\n\t\t\tthis.charactersMultiPanel.ResumeLayout(false);\n\t\t\tthis.charactersListPage.ResumeLayout(false);\n\t\t\tthis.noCharactersPage.ResumeLayout(false);\n\t\t\tthis.charactersToolStrip.ResumeLayout(false);\n\t\t\tthis.charactersToolStrip.PerformLayout();\n\t\t\tthis.esiKeysTabPage.ResumeLayout(false);\n\t\t\tthis.esiKeysTabPage.PerformLayout();\n\t\t\tthis.esiKeysPagePanel.ResumeLayout(false);\n\t\t\tthis.esiKeysPagePanel.PerformLayout();\n\t\t\tthis.esiKeysMultiPanel.ResumeLayout(false);\n\t\t\tthis.esiKeysListPage.ResumeLayout(false);\n\t\t\tthis.noESIKeysPage.ResumeLayout(false);\n\t\t\tthis.esiKeysToolStrip.ResumeLayout(false);\n\t\t\tthis.esiKeysToolStrip.PerformLayout();\n\t\t\tthis.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Button closeButton;\n        private System.Windows.Forms.TabControl tabControl;\n        private System.Windows.Forms.TabPage esiKeysTabPage;\n        private System.Windows.Forms.TabPage charactersTabPage;\n        private System.Windows.Forms.ListView charactersListView;\n        private System.Windows.Forms.ColumnHeader columnType;\n        private System.Windows.Forms.ColumnHeader columnName;\n        private System.Windows.Forms.ColumnHeader columnESIKeyID;\n        private System.Windows.Forms.ColumnHeader columnUri;\n        private System.Windows.Forms.ColumnHeader columnMonitored;\n        private MultiPanel esiKeysMultiPanel;\n        private MultiPanelPage esiKeysListPage;\n        private MultiPanelPage noESIKeysPage;\n        private MultiPanel charactersMultiPanel;\n        private MultiPanelPage charactersListPage;\n        private MultiPanelPage noCharactersPage;\n        private System.Windows.Forms.ToolStrip charactersToolStrip;\n        private System.Windows.Forms.ToolStripButton importCharacterMenu;\n        private System.Windows.Forms.ToolStripButton deleteCharacterMenu;\n        private System.Windows.Forms.ToolStripButton editUriMenu;\n        private System.Windows.Forms.ToolStripButton groupingMenu;\n        private System.Windows.Forms.ToolStrip esiKeysToolStrip;\n        private System.Windows.Forms.ToolStripButton addESIKeyMenu;\n        private System.Windows.Forms.ToolStripButton deleteESIKeyMenu;\n        private System.Windows.Forms.ToolStripButton editESIKeyMenu;\n        private System.Windows.Forms.Panel charactersPagePanel;\n        private System.Windows.Forms.Panel esiKeysPagePanel;\n        private System.Windows.Forms.Label esiKeysLabel;\n        private System.Windows.Forms.Label charactersLabel;\n        private System.Windows.Forms.Label esiKeyListLabel;\n        private System.Windows.Forms.Label charactersListLabel;\n        private EsiKeysListBox esiKeysListBox;\n        private System.Windows.Forms.ColumnHeader columnID;\n        private System.Windows.Forms.ColumnHeader columnStatus;\n    }\n}"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/EsiKeysManagementWindow.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.ApiCredentialsManagement\n{\n    public partial class EsiKeysManagementWindow : EVEMonForm\n    {\n        private readonly Dictionary<Character, bool> m_monitoredCharacters = new Dictionary<Character, bool>();\n\n        private int m_refreshingCharactersCounter;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public EsiKeysManagementWindow()\n        {\n            InitializeComponent();\n\n            esiKeysListBox.Font = FontFactory.GetFont(\"Tahoma\", 9.75f);\n            charactersListView.Font = FontFactory.GetFont(\"Tahoma\", 9.75f);\n            esiKeysLabel.Font = FontFactory.GetFont(\"Tahoma\", 12F);\n            esiKeyListLabel.Font = FontFactory.GetFont(\"Tahoma\", 12F);\n            charactersLabel.Font = FontFactory.GetFont(\"Tahoma\", 12F);\n            charactersListLabel.Font = FontFactory.GetFont(\"Tahoma\", 12F);\n        }\n\n        /// <summary>\n        /// On loading, intialize the controls and subscribe events.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode)\n                return;\n\n            ListViewHelper.EnableDoubleBuffer(charactersListView);\n\n            EveMonClient.ESIKeyCollectionChanged += EveMonClient_ESIKeyCollectionChanged;\n            EveMonClient.ESIKeyInfoUpdated += EveMonClient_ESIKeyInfoUpdated;\n            EveMonClient.CharacterCollectionChanged += EveMonClient_CharacterCollectionChanged;\n            EveMonClient.CharacterUpdated += EveMonClient_CharacterUpdated;\n            EveMonClient.AccountStatusUpdated += EveMonClient_AccountStatusUpdated;\n            Disposed += OnDisposing;\n\n            UpdateESIKeysList();\n            UpdateCharactersList();\n            AdjustLastColumn();\n\n            // Selects the second page if no API key known so far\n            if (EveMonClient.Characters.Count == 0)\n                tabControl.SelectedIndex = 1;\n        }\n\n        /// <summary>\n        /// Occurs on disposing.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposing(object sender, EventArgs e)\n        {\n            // Unsubscribe events\n            EveMonClient.ESIKeyCollectionChanged -= EveMonClient_ESIKeyCollectionChanged;\n            EveMonClient.ESIKeyInfoUpdated -= EveMonClient_ESIKeyInfoUpdated;\n            EveMonClient.CharacterCollectionChanged -= EveMonClient_CharacterCollectionChanged;\n            EveMonClient.CharacterUpdated -= EveMonClient_CharacterUpdated;\n            EveMonClient.AccountStatusUpdated -= EveMonClient_AccountStatusUpdated;\n            Disposed -= OnDisposing;\n\n            // Update the monitored status of selected characters\n            foreach (var monitoredCharacter in m_monitoredCharacters)\n                if (EveMonClient.Characters.Contains(monitoredCharacter.Key))\n                    monitoredCharacter.Key.Monitored = monitoredCharacter.Value;\n        }\n\n        /// <summary>\n        /// When the size changes, we adjust the characters' columns.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnSizeChanged(EventArgs e)\n        {\n            base.OnSizeChanged(e);\n\n            if (charactersListView != null)\n                AdjustLastColumn();\n        }\n\n\n        #region Global Events Handlers\n\n        /// <summary>\n        /// When the ESI key collection changes, we update the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_ESIKeyCollectionChanged(object sender, EventArgs e)\n        {\n            UpdateESIKeysList();\n        }\n\n        /// <summary>\n        /// When the ESI key info updates, we update the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_ESIKeyInfoUpdated(object sender, EventArgs e)\n        {\n            if (!Visible)\n                return;\n\n            esiKeysListBox.Invalidate();\n        }\n\n        /// <summary>\n        /// When the characters collection changed, we update the characters list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterCollectionChanged(object sender, EventArgs e)\n        {\n            UpdateCharactersList();\n        }\n\n        /// <summary>\n        /// When the character changes, the displayed names changes too.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            UpdateCharactersList();\n        }\n\n        /// <summary>\n        /// When the account status updates, we update the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_AccountStatusUpdated(object sender, EventArgs e)\n        {\n            if (!Visible)\n                return;\n\n            esiKeysListBox.Invalidate();\n        }\n\n        #endregion\n\n\n        #region ESI keys management\n\n        /// <summary>\n        /// Updates the ESI keys list.\n        /// </summary>\n        private void UpdateESIKeysList()\n        {\n            if (!Visible)\n                return;\n\n            esiKeysListBox.ESIKeys = EveMonClient.ESIKeys;\n            esiKeysMultiPanel.SelectedPage = EveMonClient.ESIKeys.Any() ? esiKeysListPage : noESIKeysPage;\n        }\n\n        /// <summary>\n        /// Handles the MouseClick event of the apiKeysListBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void apiKeysListBox_MouseClick(object sender, MouseEventArgs e)\n        {\n            bool itemClicked = false;\n\n            // Search for the clicked item\n            for (int index = 0; index < esiKeysListBox.ESIKeys.Count(); index++)\n            {\n                Rectangle rect = esiKeysListBox.GetItemRectangle(index);\n\n                // Did click occured generally on the item ?\n                if (!rect.Contains(e.Location))\n                    continue;\n\n                itemClicked = true;\n\n                int yOffset = (rect.Height - EsiKeysListBox.CheckBoxSize.Height) / 2;\n                Rectangle cbRect = new Rectangle(rect.Left + esiKeysListBox.Margin.Left, rect.Top + yOffset,\n                                                 EsiKeysListBox.CheckBoxSize.Width, EsiKeysListBox.CheckBoxSize.Height);\n                cbRect.Inflate(2, 2);\n\n                // Did click occured on the checkbox ?\n                if (e.Button == MouseButtons.Middle || !cbRect.Contains(e.Location))\n                    continue;\n\n                ESIKey esiKey = esiKeysListBox.ESIKeys.ElementAt(index);\n                esiKey.Monitored = !esiKey.Monitored;\n                esiKeysListBox.Invalidate();\n            }\n\n            if (!itemClicked)\n                esiKeysListBox.SelectedIndex = -1;\n        }\n\n        /// <summary>\n        /// When the selection changes, we update the controls.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void apiKeysListBox_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            deleteESIKeyMenu.Enabled = esiKeysListBox.SelectedIndex != -1;\n            editESIKeyMenu.Enabled = esiKeysListBox.SelectedIndex != -1;\n        }\n\n        /// <summary>\n        /// On double click, forces the edition.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void apiKeysListBox_MouseDoubleClick(object sender, MouseEventArgs e)\n        {\n            // Search for the double-clicked item\n            int index = 0;\n            foreach (ESIKey esiKey in esiKeysListBox.ESIKeys)\n            {\n                Rectangle rect = esiKeysListBox.GetItemRectangle(index);\n                index++;\n\n                if (!rect.Contains(e.Location))\n                    continue;\n\n                // Open the edition window\n                using (EsiKeyUpdateOrAdditionWindow window = new EsiKeyUpdateOrAdditionWindow(esiKey))\n                {\n                    window.ShowDialog(this);\n                    return;\n                }\n            }\n        }\n\n        /// <summary>\n        /// API key toolbar > Edit.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void editAPIKeyMenu_Click(object sender, EventArgs e)\n        {\n            ESIKey esiKey = esiKeysListBox.ESIKeys.ElementAt(esiKeysListBox.SelectedIndex);\n            using (EsiKeyUpdateOrAdditionWindow window = new EsiKeyUpdateOrAdditionWindow(esiKey))\n            {\n                window.ShowDialog(this);\n            }\n        }\n\n        /// <summary>\n        /// ESI key toolbar > Add.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void addESIKeyMenu_Click(object sender, EventArgs e)\n        {\n            using (EsiKeyUpdateOrAdditionWindow window = new EsiKeyUpdateOrAdditionWindow())\n            {\n                window.ShowDialog(this);\n            }\n        }\n\n        /// <summary>\n        /// Accounts toolbar > Delete\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void deleteESIKeyMenu_Click(object sender, EventArgs e)\n        {\n            if (esiKeysListBox.SelectedIndex == -1)\n                return;\n\n            ESIKey apiKey = esiKeysListBox.ESIKeys.ElementAt(esiKeysListBox.SelectedIndex);\n            using (EsiKeyDeletionWindow window = new EsiKeyDeletionWindow(apiKey))\n            {\n                window.ShowDialog(this);\n            }\n\n            deleteESIKeyMenu.Enabled = esiKeysListBox.SelectedIndex != -1;\n            editESIKeyMenu.Enabled = esiKeysListBox.SelectedIndex != -1;\n        }\n\n        /// <summary>\n        /// Handles the KeyDown event of the esiKeysListBox control.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void esiKeysListBox_KeyDown(object sender, KeyEventArgs e)\n        {\n            if (e.KeyCode == Keys.Delete)\n                deleteESIKeyMenu_Click(sender, e);\n        }\n\n        #endregion\n\n\n        #region Characters management\n\n        /// <summary>\n        /// Updates the characters list.\n        /// </summary>\n        private void UpdateCharactersList()\n        {\n            if (!Visible)\n                return;\n\n            // Begin the update\n            m_refreshingCharactersCounter++;\n\n            // Update the list view item\n            UpdateCharactersListContent();\n\n            // Invalidates the API keys list\n            esiKeysListBox.Invalidate();\n\n            // Make a help message appears when no characters exist\n            charactersMultiPanel.SelectedPage = EveMonClient.Characters.Count == 0 ? noCharactersPage : charactersListPage;\n\n            // End of the update\n            m_refreshingCharactersCounter--;\n        }\n\n        /// <summary>\n        /// Recreate the items in the characters listview\n        /// </summary>\n        private void UpdateCharactersListContent()\n        {\n            int position = charactersListView.GetVerticalScrollBarPosition();\n\n            charactersListView.BeginUpdate();\n            try\n            {\n                // Retrieve current selection and grouping option\n                List<Character> oldSelection = new List<Character>(charactersListView.SelectedItems.Cast<ListViewItem>()\n                                                                       .Select(x => x.Tag).OfType<Character>());\n\n                charactersListView.Groups.Clear();\n                charactersListView.Items.Clear();\n\n                // Grouping (no ESI key, ESI key #1, ESI key #2, character files, character urls)\n                bool isGrouping = groupingMenu.Checked;\n                ListViewGroup noESIKeyGroup = new ListViewGroup(\"No ESI key\");\n                ListViewGroup fileGroup = new ListViewGroup(\"Character files\");\n                ListViewGroup urlGroup = new ListViewGroup(\"Character urls\");\n                Dictionary<ESIKey, ListViewGroup> apiKeyGroups = new Dictionary<ESIKey, ListViewGroup>();\n\n                if (isGrouping)\n                    ArrangeByGroup(fileGroup, apiKeyGroups, noESIKeyGroup, urlGroup);\n\n                // Add items\n                foreach (Character character in EveMonClient.Characters.OrderBy(x => x.Name))\n                {\n                    ListViewItem item = new ListViewItem { Checked = character.Monitored, Tag = character };\n\n                    // Retrieve the texts for the different columns\n                    IEnumerable<ESIKey> esiKeys = character.Identity.ESIKeys.OrderBy(esiKey => esiKey.ID);\n                    string apiKeyIDText = esiKeys.Any()\n                                              ? string.Join(\", \", esiKeys.Select(esiKey => esiKey.ID))\n                                              : string.Empty;\n                    string typeText = \"CCP\";\n                    string uriText = \"-\";\n\n                    UriCharacter uriCharacter = character as UriCharacter;\n                    if (uriCharacter != null)\n                    {\n                        typeText = uriCharacter.Uri.IsFile ? \"File\" : \"Url\";\n                        uriText = uriCharacter.Uri.ToString();\n\n                        if (isGrouping)\n                            item.Group = uriCharacter.Uri.IsFile ? fileGroup : urlGroup;\n                    }\n                        // Grouping CCP characters\n                    else if (isGrouping)\n                    {\n                        if (!esiKeys.Any())\n                            item.Group = noESIKeyGroup;\n                        else\n                            item.Group = apiKeyGroups[esiKeys.First()];\n                    }\n\n                    // Add the item and its subitems\n                    item.SubItems.Add(new ListViewItem.ListViewSubItem(item, typeText));\n                    item.SubItems.Add(new ListViewItem.ListViewSubItem(item, character.CharacterID.ToString(\n                        CultureConstants.DefaultCulture)));\n                    item.SubItems.Add(new ListViewItem.ListViewSubItem(item, character.Name));\n                    item.SubItems.Add(new ListViewItem.ListViewSubItem(item, apiKeyIDText));\n                    item.SubItems.Add(new ListViewItem.ListViewSubItem(item, character.\n                        EffectiveCharacterStatus.ToString()));\n                    item.SubItems.Add(new ListViewItem.ListViewSubItem(item, uriText));\n\n                    charactersListView.Items.Add(item);\n\n                    if (oldSelection.Contains(character))\n                        item.Selected = true;\n                }\n\n                // Auto-resize the columns\n                charactersListView.Columns.Cast<ColumnHeader>().Where(\n                    column => column.Index != charactersListView.Columns.Count - 1).ToList().ForEach(column => column.Width = -2);\n\n                AdjustLastColumn();\n            }\n            finally\n            {\n                charactersListView.EndUpdate();\n                charactersListView.SetVerticalScrollBarPosition(position);\n            }\n\n            // Forces a refresh of the enabled/disabled items\n            UpdateControlsUsability();\n        }\n\n        /// <summary>\n        /// Arranges the by group.\n        /// </summary>\n        /// <param name=\"fileGroup\">The file group.</param>\n        /// <param name=\"esiKeyGroups\">The ESI key groups.</param>\n        /// <param name=\"noESIKeyGroup\">The no ESI key group.</param>\n        /// <param name=\"urlGroup\">The URL group.</param>\n        private void ArrangeByGroup(ListViewGroup fileGroup, Dictionary<ESIKey, ListViewGroup> esiKeyGroups,\n                                    ListViewGroup noESIKeyGroup, ListViewGroup urlGroup)\n        {\n            bool hasNoESIKey = false;\n            bool hasFileChars = false;\n            bool hasUrlChars = false;\n\n            // Scroll through listview items to gather the groups\n            foreach (Character character in EveMonClient.Characters)\n            {\n                UriCharacter uriCharacter = character as UriCharacter;\n\n                // Uri character ?\n                if (uriCharacter != null)\n                {\n                    if (uriCharacter.Uri.IsFile)\n                        hasFileChars = true;\n                    else\n                        hasUrlChars = true;\n                }\n                // CCP character ?\n                else\n                {\n                    if (!character.Identity.ESIKeys.Any())\n                        hasNoESIKey = true;\n                    else\n                    {\n                        foreach (ESIKey apiKey in character.Identity.ESIKeys.Where(\n                            esiKey => !esiKeyGroups.ContainsKey(esiKey)))\n                        {\n                            esiKeyGroups.Add(apiKey, new ListViewGroup($\"Key ID #{apiKey.ID}\"));\n                        }\n                    }\n                }\n            }\n\n            // Add the groups\n            if (hasNoESIKey)\n                charactersListView.Groups.Add(noESIKeyGroup);\n\n            foreach (ListViewGroup group in esiKeyGroups.Values)\n            {\n                charactersListView.Groups.Add(group);\n            }\n\n            if (hasFileChars)\n                charactersListView.Groups.Add(fileGroup);\n\n            if (hasUrlChars)\n                charactersListView.Groups.Add(urlGroup);\n        }\n\n        /// <summary>\n        /// Adjusts the last column width.\n        /// </summary>\n        private void AdjustLastColumn()\n        {\n            ColumnHeader lastColumn = charactersListView.Columns[charactersListView.Columns.Count - 1];\n            int pad = Size.Width - charactersListView.Size.Width;\n            int width = charactersListView.Columns.Cast<ColumnHeader>().Where(column => column.Index != lastColumn.Index).Select(\n                column => column.Width).Sum();\n\n            int lastColumnMaxWidth = charactersListView.Columns[lastColumn.Index].ListView.Items.Cast<ListViewItem>().Select(\n                item => TextRenderer.MeasureText(item.SubItems[lastColumn.Index].Text, Font).Width).Concat(\n                    new[] { TextRenderer.MeasureText(charactersListView.Columns[lastColumn.Index].Text, Font).Width }).\n                                         Concat(new[] { charactersListView.ClientSize.Width - width - pad }).Max() + pad;\n\n            lastColumn.Width = lastColumnMaxWidth;\n        }\n\n        /// <summary>\n        /// Updates the controls usability.\n        /// </summary>\n        private void UpdateControlsUsability()\n        {\n            // \"Edit uri\" enabled when an uri char is selected\n            editUriMenu.Enabled = charactersListView.SelectedItems.Count > 0 &&\n                                  charactersListView.SelectedItems[0].Tag is UriCharacter;\n\n            // Delete char enabled if one character selected\n            deleteCharacterMenu.Enabled = charactersListView.SelectedItems.Count > 0;\n        }\n\n        /// <summary>\n        /// We monitor/unmonitor characters as they are checked.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void charactersListView_ItemChecked(object sender, ItemCheckedEventArgs e)\n        {\n            if (m_refreshingCharactersCounter != 0)\n                return;\n\n            // Add the character with changed monitoring status to the dictionary,\n            // we will deal with them on closing\n            Character character = (Character)e.Item.Tag;\n            m_monitoredCharacters[character] = e.Item.Checked;\n        }\n\n        /// <summary>\n        /// Handle the \"delete\" button.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void charactersListView_KeyDown(object sender, KeyEventArgs e)\n        {\n            if (e.KeyCode == Keys.Delete)\n                deleteCharacterMenu_Click(sender, e);\n        }\n\n        /// <summary>\n        /// On double click, we edit if this is an uri character.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void charactersListView_DoubleClick(object sender, EventArgs e)\n        {\n            editUriButton_Click(sender, e);\n        }\n\n        /// <summary>\n        /// When the index changes, we enable or disable the toolbar buttons.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void charactersListView_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            UpdateControlsUsability();\n        }\n\n        /// <summary>\n        /// Characters toolbar > Import...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void importCharacterMenu_Click(object sender, EventArgs e)\n        {\n            using (CharacterImportationWindow form = new CharacterImportationWindow())\n            {\n                form.ShowDialog(this);\n            }\n        }\n\n        /// <summary>\n        /// Characters toolbar > Delete...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void deleteCharacterMenu_Click(object sender, EventArgs e)\n        {\n            // Retrieve the selected URI character\n            if (charactersListView.SelectedItems.Count == 0)\n                return;\n\n            ListViewItem item = charactersListView.SelectedItems[0];\n            Character character = item.Tag as Character;\n\n            // Opens the character deletion\n            using (CharacterDeletionWindow window = new CharacterDeletionWindow(character))\n            {\n                window.ShowDialog(this);\n            }\n        }\n\n        /// <summary>\n        /// Characters toolbar > Edit Uri...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void editUriButton_Click(object sender, EventArgs e)\n        {\n            // Retrieve the selected URI character\n            if (charactersListView.SelectedItems.Count == 0)\n                return;\n\n            ListViewItem item = charactersListView.SelectedItems[0];\n            UriCharacter uriCharacter = item.Tag as UriCharacter;\n\n            // Returns if the selected item is not an Uri character\n            if (uriCharacter == null)\n                return;\n\n            // Opens the importation form\n            using (CharacterImportationWindow form = new CharacterImportationWindow(uriCharacter))\n            {\n                form.ShowDialog(this);\n            }\n        }\n\n        /// <summary>\n        /// Characters toolbar > Group items\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void groupingMenu_Click(object sender, EventArgs e)\n        {\n            m_refreshingCharactersCounter++;\n            UpdateCharactersListContent();\n            m_refreshingCharactersCounter--;\n        }\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// Close on \"close\" button click.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void closeButton_Click(object sender, EventArgs e)\n        {\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the ColumnWidthChanging event of the charactersListView control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.ColumnWidthChangingEventArgs\"/> instance containing the event data.</param>\n        private void charactersListView_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)\n        {\n            e.Cancel = true;\n            e.NewWidth = charactersListView.Columns[e.ColumnIndex].Width;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/ApiCredentialsManagement/EsiKeysManagementWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"charactersToolStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>33, 22</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"importCharacterMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAITSURBVDhPY8AB2OOAYNWqVVvjosK6uBkYxKHixAFubm6x\n        w4cP3v8PBEd2rf2vLie8AipFNOCqzEu9uWvd/P9F8d7/RbiYjgHFmICYBYhZoWy8QNRYRXqPrSLff2MJ\n        rv/yQtybgWKCUMwHxGxAzAjEWIFoiLvdieuXT/3ftnjS31g3k39BVnL/jZQkNgLlTIBYFog5gJgZiDEB\n        0OjAWZ21IO//v3Jmz59We/u/kQ7K/wuCnN8BpcOAWAuIgeEKNgDTFQIcDPErZ/f837Nz27/N9fV/8iOd\n        /3noS/3PSrL/CQyAXKASCyAGeQV7WPCyMsQvmNb2/8qVK3+2AQ2I8ND/Z6Mk/L/Wx+sX0IBqoBIfIAZ5\n        AxQOoEBFBRxMDFHT24r+b18/69/GJZP/RnsY/nPREgEaYPsLKN0KxIFADDIAZ2yIxwa7nrp9fs//eqAL\n        Ip11/qlr6/8XlY/5zSBvvhoo7w/EokCMPQxAQFVGtKQ1Peh/qr/1P2tV0f+cZj6/GLzq/zNYp54DSlsC\n        MS8Q404L+hoKqQdXTPnv7ev7T8Yl9j9Y886XEBqBVzB41HtBtaACIy3V+Cd3rvzXDStCaEbHMEOwAXZ2\n        dsXaytK99oHBTyVd0j7BDUHYDtGMwwUgv3GysbGpAmkDIDZkcC3dAtbkWbcKyMeZhJEBKIRBcQyKazYG\n        lwo/Bo+6lQzutd4gSQRgYAAAxhfLOmTc9f8AAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"deleteCharacterMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJBSURBVDhPjZJfSJNhFMbP5tzmPjZKXWrZ0tXKdtFiU8xK\n        F6yapBe1hehAV4H0B7IYFkmMj6gJRTdFVFhgf25soFLSQlvFMkJE6KJVRIE3devVbhzbd3pe2U24DR/4\n        wfuec97zvef5XiogXR8UjUZf9wW6bklEVbn42iRJ0obZ2cQiQ59mxnmHpWIsl1qzDEMD/T9nJkY5FOzg\n        SoP6M2JqoAGluXVRmV3bNsVb603sqjbwlnJpCrH1OUxAC1Qgr8zHvW1zP77Oc+z53Wzv4UbFt9fCTmv1\n        S+QawWagByVgtdD62MjNsBifkwvxTMTtzvYc2MoXfZ4lpLuAHcDXlQarb7FOT8EXj25zfDqmTMly5kKP\n        R2l3bORzp9zLMOA8SvYAMUp+L4ylFHxyf5iTyWQmhgbd7Q5lv7WCw51H0mhwFSWdQIwhfBCm/i+9mgIP\n        hkP8ZnJEmXh6Jxvw7lYO2ivRoDWNdAT4QT0o+Deqev2H5n99ifM1zC+bTeyskbjFKqVw4uEgUaKJ6Azq\n        8nsgZKs1D0ZO+/ho807lAxHLJepMDdF7mej7Ava7iEIoK/wWHA11/Ymxe+x2N2Xbao0sq1Wi0fIrorSL\n        aBQlFlDwHZDTbgv++Z3kGwMBPul18GOdJvsXX35LtISTHSgp/hJ1Op01PHTpnd+zb1GWpNRHFWW6ib6N\n        E6XAXB0umSvNK9G9TKvV2rYTXREeOImeIdbSQHR9Gntc4fJKZREJhzVw3YGHfxZrMbP45+VGohNlRM1Y\n        Q0T/AGCztFW8+bqAAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"editUriMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAImSURBVDhPY8AB2OOAYNWqVVvjosK6uBkYxKHixAFubm6x\n        w4cP3v8PBEd2rf2vLie8AipFNOCqzEu9uWvd/P9F8d7/RbiYjgHFmICYBYhZoWy8QNRYRXqPrSLff2MJ\n        rv/yQtybgWKCUMwHxGxAzAjEWIFoiLvdieuXT/3ftnjS31g3k39BVnL/jZQkNgLlTIBYFog5gJgZiDEB\n        0OjAWZ21IO//v3Jmz59We/u/kQ7K/wuCnN8BpcOAWAuIgeEKNgDTFQIcDPErZ/f837Nz27/N9fV/8iOd\n        /3noS/3PSrL/CQyA3BQ/v7h/Jib/b/Z2/wcqxwwLXlaG+AXT2v5fuXLlzzagAREe+v9slIT/1/p4/bKx\n        spiyurHx/7+IoP8gQ4DKQYGKCjiYGKKmtxX9375+1r/6+vp/0R6G/1y0RP53xrv/njRp0v9t27b9n1aQ\n        /393ba0pUDnW2BCPDXY9devc7v9AA/5EOuv8C7BW/L9zlsn/i7tM/jc0NPwvLy93AqrDHgYgoCojWtKR\n        E/k/1d/6n7+dOlzz8gkm/0ODPeKBSniBGHda0NdQSD24Ysp/e2AMrJiOpDnAKhUoDUrWeNMBg5GWavzN\n        y8f/r58H0Ty7w+S/lZVeM1BKBohBAYc/JbKzsyuumGrz/+j2nv+L+0z++7gabgEKWwExDxATTMYgBZwm\n        wGiaWAd0doR7JJCvAsSgZIzf6UgAFMIgp4I0gDAoA2FxOgMDADzw0XYSH3YFAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"esiKeysToolStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>182, 24</value>\n  </metadata>\n  <data name=\"addESIKeyMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKtSURBVDhPYxgIwAHE7BAmYcAoISEhys/PLwjl8+rp6enI\n        yUloAdmcECFUwKgFBOLi4oogDojOycnJ83ZzzARxubi4JHU1NIzl5CSNQXyQGhQA1Ot048aN29N7my6y\n        MjDoykiI2OVmpjb4uto2sDAwWAGViPBzsRpzsTKADBADYiaQPjgwN9SuvnX5zP9ZXZX/OVgYSrhYWY1V\n        pPjqJfmZG5iZGZyUZGVNNJSVLYX5OE0EuFn1gFpEITqhQJCLNdVTXva3sRz7f05WxuZAX8/axMjQNmNN\n        2UZVacFGTTXlWA0NFXsJYT5ToFOM2dkZlKBaGRiYmZmdFi6Y8KG/sf5fRrD1f09DxbdeHi6bU+Ij+6z0\n        lJutdBV6dDSUKlRVFV2EeDktQAawsTGoQrUzMAjzc5W9enz7/8Nrp/+XJXr9zw+3/e9opXctLMh7io6C\n        aKuphnS3jppCrbKCrL8gD4cN2AAGBjWodqBnBLkqnt059//i4c3/Y9z0/qf7mfy3NdW44+1qu0hDXqTb\n        QFm4WdpOcINMqNA5CU++LlZWBn2gNnBsgQEfJ0vOvYt7/5/bu+p/pIvu/yQ3jf9qkkJ3LI11VqhICnTz\n        cTGVSwXyX/X+b/BfIpz/GNB2daA2YYhuCJCpyw5/snxK439/K9X/8sJsr0UE+E7oqsoulrXn2SYdwflJ\n        OlzwLMgA6Uj+o1IRggelogWyoHrBgDUj0v1EQ4b/f1c9kf9CXKxHtdRVZvu42k6SDxO8DdKIjqVi+bdD\n        9YIBc3NV4aHNiyb8Lwkz/y8nwrkLmPK8xUVEvMVc+CZKRfIdko4XfA3TCMJAfipULwQAk66vvrbGJAlh\n        nkmsTExhQCFQHgAmSgaglxlYZBKEtoEMANFAPlbACMSgTMIDxKBch5JUQTaCNCNsZmAAAM/Wv1R/XfPh\n        AAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"deleteESIKeyMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAMPSURBVDhPjZMLSFNhFMeve2933m132nzUVjln1szssVlq\n        WktctcpHMstyxUJmqZkPoheGryyNHizpQUIRlfTAlmYviwoqLQMhlB5WksSSyMpAy/R07hYmWdAffnD4\n        c/7nft/9vo8YKbVaHaBSqSZhKXI7blEURWu1mqljSFLxyxotPz+/oPr6q3W1F050aNTKVWixGZ+maSon\n        N3fH09ZHXdYViUfRkjD+KE3RjF/d0nzX2XL7EoQGq05wudwQtNkSiWhGecnOhp53HZCfnvICPaMr8Kfw\n        cwajXtO5RKeEsXJRTUnJruraCzU35+rDygJ8xKdTY0Ngsj/5ClsN7gQhRDzcJUFo0y0pl8/s2923ITkK\n        IkLHvW1ocPR0PnsCGWlJzvWW+K6q4myIC5X0BfpKz2G/HvFCuEyYoMT8jHuNjk+979/AkbJNsHyuBiym\n        cDAbQiAt0QCNV2rhceNFsCXowTw/qIcUcosw5ocIXAPGSMXbWx/f/tzT1Q4F1njIWbMUSvPWwZrwYDDN\n        DoQDpVvAXr4dkrFeOcv7m5dEeApj0xDaNYCmBFubHtT1dr9sguULwqD60B64at8HQxQF29Q+kGaKAHPU\n        TLgvl0IhTQ3JSIEDYwsQH9cAPpsdd6xi6+uWG2dgWZQWHDXH4cnd67B/ohJ6pVI4pPKFm95yeE55go4W\n        9vM5Hsx/iEXkrgEoUcrC8Gv2mOjByGAFXDx5EL462yDTbITjMjGAvz/0yuUQTXIHBSyiFfs3I9MR5iRc\n        YlnNi88fKc6EhNkToKokGw6XFw4VJMfBHVoCH2kavshkEC0TDZIcj0vYr0OY/bOYMCPWiuT4Sntlcact\n        KdK5dqHug8WSNNDs6w1tnp5gJIXfC2WSH4M4xMbjPsT+0Veax+NNUigUVj6fY1sUo3NYTKqB+2ISdBS3\n        XyoW3pKLROeLOJy3ZwWCdvJvA0bKZJyXX1GY152aqOuPDPR6w2MRG9EW4aHPwVe2CGv3+f9LuJrA8cqx\n        WUpfxV4hn5OFFvMuhvf7v+IhYgRX7KqH7/1vEcRPO3cLlcOCMdEAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"editESIKeyMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJcSURBVDhPY6A2YNQCAnFxcUUoHwZwiaMCoBqnGzdu3J7e\n        23SRlYFBFyqMUxwDmBtqV9+6fOb/rK7K/xwsDKUgW8XExJTQxEugyhmhNAIIcrGmesrL/jaWY/+vp6M5\n        9fbt23eAtl4W5GZthImzsTAUAJVyAjEvEDOB9IEBMzOz08IFEz70N9b/ywi2/h/jZfoZZmuKv/93mLiH\n        ofQLFhamdKAWWSBmA2sGAWF+rrJXj2//f3jt9P+yRK//IQ5a/71MZP+BbO1uqf5/4+zh/wUxbv/zwmz/\n        u5kb7/lnYvL/Zm/3f6h2BgZRQa6KZ3fO/b94ePN/D3OV/+uXzvp/Zt/G/yBb47yM/zdW5P0PstP8Xxzv\n        9X91Y+P/fxFB/0GGQLUzMPBxsuTcu7j3/7m9q/47Gyv9h7lmUlvF//xw2//xwW7/EwJM/k+aNOn/tm3b\n        /k8ryP8/KTHRBaodDGTqssOfLJ/S+N9eX+4/yDUXDm36H+Om9z/dz+R/Upj9/52zTP5f3GXyv6Gh4b+X\n        l1cWUA8oIOGANSPS/URDhv9/MxXB/yDXnNm7+n+ki+7/vAgzuOblE0z+O9qb1wDVqwIxC1gnFDA3VxUe\n        2rxowv8MX8P/9dERP0CuSQo0+b9iOkKzg7nKKaBaLZB6sC5kAEyqvvraGpMkBHmnpEV43O4sjfm/fh5E\n        8+wOk/9W5lpbWJmYIoFKBSA6MAEodYESCX9zVd6RFVNt/h/d3vN/cZ/J/7g4F5BGfiDmAGJEAsIFQK4x\n        AUbTxDqT/06uZmVAIZy24gIw1/AAMchWTD8zMDAAABupFmmInoHqAAAAAElFTkSuQmCC\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <sectionGroup name=\"userSettings\" type=\"System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n      <section name=\"EVEMon.Properties.Settings\" type=\"System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" allowExeDefinition=\"MachineToLocalUser\" requirePermission=\"false\" />\n    </sectionGroup>\n  </configSections>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.1.0\" newVersion=\"4.1.1.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-10.0.0.0\" newVersion=\"10.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Owin\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-3.0.1.0\" newVersion=\"3.0.1.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Core\" publicKeyToken=\"b77a5c561934e089\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.0.0\" newVersion=\"4.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System\" publicKeyToken=\"b77a5c561934e089\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.0.0\" newVersion=\"4.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"mscorlib\" publicKeyToken=\"b77a5c561934e089\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.0.0\" newVersion=\"4.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.36.0.0\" newVersion=\"1.36.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis.Core\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.42.0.0\" newVersion=\"1.42.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <userSettings>\n    <EVEMon.Properties.Settings>\n      <setting name=\"AccountDetailsStoragePath\" serializeAs=\"String\">\n        <value>%appdata%/EVEMon/AccountInfo.xml</value>\n      </setting>\n    </EVEMon.Properties.Settings>\n  </userSettings>\n<startup><supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\" /></startup></configuration>\n"
  },
  {
    "path": "src/EVEMon/BlankCharacter/BlankCharacterControl.Designer.cs",
    "content": "﻿namespace EVEMon.BlankCharacter\n{\n    partial class BlankCharacterControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BlankCharacterControl));\n            this.rbFemale = new System.Windows.Forms.RadioButton();\n            this.rbMale = new System.Windows.Forms.RadioButton();\n            this.tbCharacterName = new System.Windows.Forms.TextBox();\n            this.gbRace = new System.Windows.Forms.GroupBox();\n            this.tlpRaces = new System.Windows.Forms.TableLayoutPanel();\n            this.pictureBox3 = new System.Windows.Forms.PictureBox();\n            this.pictureBox2 = new System.Windows.Forms.PictureBox();\n            this.pictureBox1 = new System.Windows.Forms.PictureBox();\n            this.rbCaldari = new System.Windows.Forms.RadioButton();\n            this.rbAmarr = new System.Windows.Forms.RadioButton();\n            this.rbGallente = new System.Windows.Forms.RadioButton();\n            this.rbMinmatar = new System.Windows.Forms.RadioButton();\n            this.pbAmarr = new System.Windows.Forms.PictureBox();\n            this.gbBloodline = new System.Windows.Forms.GroupBox();\n            this.tlpBloodline = new System.Windows.Forms.TableLayoutPanel();\n            this.rbBloodline3 = new System.Windows.Forms.RadioButton();\n            this.rbBloodline2 = new System.Windows.Forms.RadioButton();\n            this.pbBloodline3 = new System.Windows.Forms.PictureBox();\n            this.pbBloodline1 = new System.Windows.Forms.PictureBox();\n            this.pbBloodline2 = new System.Windows.Forms.PictureBox();\n            this.rbBloodline1 = new System.Windows.Forms.RadioButton();\n            this.gbAncestry = new System.Windows.Forms.GroupBox();\n            this.tlpAncestry = new System.Windows.Forms.TableLayoutPanel();\n            this.lblAncestry1 = new System.Windows.Forms.Label();\n            this.rbAncestry2 = new System.Windows.Forms.RadioButton();\n            this.pbAncestry1 = new System.Windows.Forms.PictureBox();\n            this.rbAncestry1 = new System.Windows.Forms.RadioButton();\n            this.rbAncestry3 = new System.Windows.Forms.RadioButton();\n            this.lblAncestry3 = new System.Windows.Forms.Label();\n            this.lblAncestry2 = new System.Windows.Forms.Label();\n            this.pbAncestry2 = new System.Windows.Forms.PictureBox();\n            this.pbAncestry3 = new System.Windows.Forms.PictureBox();\n            this.ilAncestry = new System.Windows.Forms.ImageList(this.components);\n            this.gbGender = new System.Windows.Forms.GroupBox();\n            this.gbCharacterName = new System.Windows.Forms.GroupBox();\n            this.ilBloodline = new System.Windows.Forms.ImageList(this.components);\n            this.tlpGender = new System.Windows.Forms.TableLayoutPanel();\n            this.pbFemale = new System.Windows.Forms.PictureBox();\n            this.pbMale = new System.Windows.Forms.PictureBox();\n            this.lblFemale = new System.Windows.Forms.Label();\n            this.lblMale = new System.Windows.Forms.Label();\n            this.gbRace.SuspendLayout();\n            this.tlpRaces.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAmarr)).BeginInit();\n            this.gbBloodline.SuspendLayout();\n            this.tlpBloodline.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbBloodline3)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbBloodline1)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbBloodline2)).BeginInit();\n            this.gbAncestry.SuspendLayout();\n            this.tlpAncestry.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAncestry1)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAncestry2)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAncestry3)).BeginInit();\n            this.gbGender.SuspendLayout();\n            this.gbCharacterName.SuspendLayout();\n            this.tlpGender.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbFemale)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbMale)).BeginInit();\n            this.SuspendLayout();\n            // \n            // rbFemale\n            // \n            this.rbFemale.AutoSize = true;\n            this.rbFemale.Checked = true;\n            this.rbFemale.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbFemale.Location = new System.Drawing.Point(3, 3);\n            this.rbFemale.Name = \"rbFemale\";\n            this.rbFemale.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.tlpGender.SetRowSpan(this.rbFemale, 2);\n            this.rbFemale.Size = new System.Drawing.Size(43, 94);\n            this.rbFemale.TabIndex = 0;\n            this.rbFemale.TabStop = true;\n            this.rbFemale.UseVisualStyleBackColor = true;\n            this.rbFemale.Click += new System.EventHandler(this.rbFemale_Click);\n            // \n            // rbMale\n            // \n            this.rbMale.AutoSize = true;\n            this.rbMale.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbMale.Location = new System.Drawing.Point(3, 103);\n            this.rbMale.Name = \"rbMale\";\n            this.rbMale.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.tlpGender.SetRowSpan(this.rbMale, 2);\n            this.rbMale.Size = new System.Drawing.Size(43, 87);\n            this.rbMale.TabIndex = 1;\n            this.rbMale.UseVisualStyleBackColor = true;\n            this.rbMale.Click += new System.EventHandler(this.rbMale_Click);\n            // \n            // tbCharacterName\n            // \n            this.tbCharacterName.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tbCharacterName.Location = new System.Drawing.Point(13, 16);\n            this.tbCharacterName.Name = \"tbCharacterName\";\n            this.tbCharacterName.Size = new System.Drawing.Size(200, 20);\n            this.tbCharacterName.TabIndex = 4;\n            this.tbCharacterName.TextChanged += new System.EventHandler(this.tbCharacterName_TextChanged);\n            // \n            // gbRace\n            // \n            this.gbRace.Controls.Add(this.tlpRaces);\n            this.gbRace.Location = new System.Drawing.Point(13, 13);\n            this.gbRace.Name = \"gbRace\";\n            this.gbRace.Size = new System.Drawing.Size(470, 135);\n            this.gbRace.TabIndex = 5;\n            this.gbRace.TabStop = false;\n            this.gbRace.Text = \"Race\";\n            // \n            // tlpRaces\n            // \n            this.tlpRaces.ColumnCount = 4;\n            this.tlpRaces.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));\n            this.tlpRaces.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));\n            this.tlpRaces.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));\n            this.tlpRaces.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));\n            this.tlpRaces.Controls.Add(this.pictureBox3, 3, 0);\n            this.tlpRaces.Controls.Add(this.pictureBox2, 2, 0);\n            this.tlpRaces.Controls.Add(this.pictureBox1, 1, 0);\n            this.tlpRaces.Controls.Add(this.rbCaldari, 1, 1);\n            this.tlpRaces.Controls.Add(this.rbAmarr, 0, 1);\n            this.tlpRaces.Controls.Add(this.rbGallente, 2, 1);\n            this.tlpRaces.Controls.Add(this.rbMinmatar, 3, 1);\n            this.tlpRaces.Controls.Add(this.pbAmarr, 0, 0);\n            this.tlpRaces.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tlpRaces.Location = new System.Drawing.Point(3, 16);\n            this.tlpRaces.Name = \"tlpRaces\";\n            this.tlpRaces.RowCount = 2;\n            this.tlpRaces.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 71.94244F));\n            this.tlpRaces.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 28.05755F));\n            this.tlpRaces.Size = new System.Drawing.Size(464, 116);\n            this.tlpRaces.TabIndex = 0;\n            // \n            // pictureBox3\n            // \n            this.pictureBox3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pictureBox3.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox3.Image\")));\n            this.pictureBox3.Location = new System.Drawing.Point(351, 3);\n            this.pictureBox3.Name = \"pictureBox3\";\n            this.pictureBox3.Size = new System.Drawing.Size(110, 77);\n            this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox3.TabIndex = 7;\n            this.pictureBox3.TabStop = false;\n            // \n            // pictureBox2\n            // \n            this.pictureBox2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pictureBox2.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox2.Image\")));\n            this.pictureBox2.Location = new System.Drawing.Point(235, 3);\n            this.pictureBox2.Name = \"pictureBox2\";\n            this.pictureBox2.Size = new System.Drawing.Size(110, 77);\n            this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox2.TabIndex = 6;\n            this.pictureBox2.TabStop = false;\n            // \n            // pictureBox1\n            // \n            this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox1.Image\")));\n            this.pictureBox1.Location = new System.Drawing.Point(119, 3);\n            this.pictureBox1.Name = \"pictureBox1\";\n            this.pictureBox1.Size = new System.Drawing.Size(110, 77);\n            this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox1.TabIndex = 5;\n            this.pictureBox1.TabStop = false;\n            // \n            // rbCaldari\n            // \n            this.rbCaldari.AutoSize = true;\n            this.rbCaldari.Location = new System.Drawing.Point(168, 86);\n            this.rbCaldari.Margin = new System.Windows.Forms.Padding(52, 3, 3, 3);\n            this.rbCaldari.Name = \"rbCaldari\";\n            this.rbCaldari.Size = new System.Drawing.Size(14, 13);\n            this.rbCaldari.TabIndex = 1;\n            this.rbCaldari.UseVisualStyleBackColor = true;\n            this.rbCaldari.Click += new System.EventHandler(this.rbCaldari_Click);\n            // \n            // rbAmarr\n            // \n            this.rbAmarr.AutoSize = true;\n            this.rbAmarr.Checked = true;\n            this.rbAmarr.Location = new System.Drawing.Point(52, 86);\n            this.rbAmarr.Margin = new System.Windows.Forms.Padding(52, 3, 3, 3);\n            this.rbAmarr.Name = \"rbAmarr\";\n            this.rbAmarr.RightToLeft = System.Windows.Forms.RightToLeft.No;\n            this.rbAmarr.Size = new System.Drawing.Size(14, 13);\n            this.rbAmarr.TabIndex = 0;\n            this.rbAmarr.TabStop = true;\n            this.rbAmarr.UseVisualStyleBackColor = true;\n            this.rbAmarr.Click += new System.EventHandler(this.rbAmarr_Click);\n            // \n            // rbGallente\n            // \n            this.rbGallente.AutoSize = true;\n            this.rbGallente.Location = new System.Drawing.Point(284, 86);\n            this.rbGallente.Margin = new System.Windows.Forms.Padding(52, 3, 3, 3);\n            this.rbGallente.Name = \"rbGallente\";\n            this.rbGallente.Size = new System.Drawing.Size(14, 13);\n            this.rbGallente.TabIndex = 2;\n            this.rbGallente.UseVisualStyleBackColor = true;\n            this.rbGallente.Click += new System.EventHandler(this.rbGallente_Click);\n            // \n            // rbMinmatar\n            // \n            this.rbMinmatar.AutoSize = true;\n            this.rbMinmatar.Location = new System.Drawing.Point(400, 86);\n            this.rbMinmatar.Margin = new System.Windows.Forms.Padding(52, 3, 3, 3);\n            this.rbMinmatar.Name = \"rbMinmatar\";\n            this.rbMinmatar.Size = new System.Drawing.Size(14, 13);\n            this.rbMinmatar.TabIndex = 3;\n            this.rbMinmatar.UseVisualStyleBackColor = true;\n            this.rbMinmatar.Click += new System.EventHandler(this.rbMinmatar_Click);\n            // \n            // pbAmarr\n            // \n            this.pbAmarr.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbAmarr.Image = ((System.Drawing.Image)(resources.GetObject(\"pbAmarr.Image\")));\n            this.pbAmarr.Location = new System.Drawing.Point(3, 3);\n            this.pbAmarr.Name = \"pbAmarr\";\n            this.pbAmarr.Size = new System.Drawing.Size(110, 77);\n            this.pbAmarr.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbAmarr.TabIndex = 4;\n            this.pbAmarr.TabStop = false;\n            // \n            // gbBloodline\n            // \n            this.gbBloodline.Controls.Add(this.tlpBloodline);\n            this.gbBloodline.Location = new System.Drawing.Point(13, 156);\n            this.gbBloodline.Name = \"gbBloodline\";\n            this.gbBloodline.Size = new System.Drawing.Size(148, 212);\n            this.gbBloodline.TabIndex = 6;\n            this.gbBloodline.TabStop = false;\n            this.gbBloodline.Text = \"Bloodline\";\n            // \n            // tlpBloodline\n            // \n            this.tlpBloodline.ColumnCount = 2;\n            this.tlpBloodline.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F));\n            this.tlpBloodline.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 65F));\n            this.tlpBloodline.Controls.Add(this.rbBloodline3, 0, 2);\n            this.tlpBloodline.Controls.Add(this.rbBloodline2, 0, 1);\n            this.tlpBloodline.Controls.Add(this.pbBloodline3, 1, 2);\n            this.tlpBloodline.Controls.Add(this.pbBloodline1, 1, 0);\n            this.tlpBloodline.Controls.Add(this.pbBloodline2, 1, 1);\n            this.tlpBloodline.Controls.Add(this.rbBloodline1, 0, 0);\n            this.tlpBloodline.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tlpBloodline.Location = new System.Drawing.Point(3, 16);\n            this.tlpBloodline.Name = \"tlpBloodline\";\n            this.tlpBloodline.Padding = new System.Windows.Forms.Padding(0, 0, 0, 6);\n            this.tlpBloodline.RowCount = 3;\n            this.tlpBloodline.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));\n            this.tlpBloodline.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));\n            this.tlpBloodline.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));\n            this.tlpBloodline.Size = new System.Drawing.Size(142, 193);\n            this.tlpBloodline.TabIndex = 0;\n            // \n            // rbBloodline3\n            // \n            this.rbBloodline3.AutoSize = true;\n            this.rbBloodline3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbBloodline3.Location = new System.Drawing.Point(3, 127);\n            this.rbBloodline3.Name = \"rbBloodline3\";\n            this.rbBloodline3.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.rbBloodline3.Size = new System.Drawing.Size(43, 57);\n            this.rbBloodline3.TabIndex = 5;\n            this.rbBloodline3.UseVisualStyleBackColor = true;\n            this.rbBloodline3.Click += new System.EventHandler(this.rbBloodline3_Click);\n            // \n            // rbBloodline2\n            // \n            this.rbBloodline2.AutoSize = true;\n            this.rbBloodline2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbBloodline2.Location = new System.Drawing.Point(3, 65);\n            this.rbBloodline2.Name = \"rbBloodline2\";\n            this.rbBloodline2.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.rbBloodline2.Size = new System.Drawing.Size(43, 56);\n            this.rbBloodline2.TabIndex = 4;\n            this.rbBloodline2.UseVisualStyleBackColor = true;\n            this.rbBloodline2.Click += new System.EventHandler(this.rbBloodline2_Click);\n            // \n            // pbBloodline3\n            // \n            this.pbBloodline3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbBloodline3.Image = ((System.Drawing.Image)(resources.GetObject(\"pbBloodline3.Image\")));\n            this.pbBloodline3.Location = new System.Drawing.Point(49, 124);\n            this.pbBloodline3.Margin = new System.Windows.Forms.Padding(0);\n            this.pbBloodline3.Name = \"pbBloodline3\";\n            this.pbBloodline3.Size = new System.Drawing.Size(93, 63);\n            this.pbBloodline3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbBloodline3.TabIndex = 2;\n            this.pbBloodline3.TabStop = false;\n            // \n            // pbBloodline1\n            // \n            this.pbBloodline1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbBloodline1.Image = ((System.Drawing.Image)(resources.GetObject(\"pbBloodline1.Image\")));\n            this.pbBloodline1.Location = new System.Drawing.Point(49, 0);\n            this.pbBloodline1.Margin = new System.Windows.Forms.Padding(0);\n            this.pbBloodline1.Name = \"pbBloodline1\";\n            this.pbBloodline1.Padding = new System.Windows.Forms.Padding(0, 0, 0, 5);\n            this.pbBloodline1.Size = new System.Drawing.Size(93, 62);\n            this.pbBloodline1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbBloodline1.TabIndex = 0;\n            this.pbBloodline1.TabStop = false;\n            // \n            // pbBloodline2\n            // \n            this.pbBloodline2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbBloodline2.Image = ((System.Drawing.Image)(resources.GetObject(\"pbBloodline2.Image\")));\n            this.pbBloodline2.Location = new System.Drawing.Point(49, 62);\n            this.pbBloodline2.Margin = new System.Windows.Forms.Padding(0);\n            this.pbBloodline2.Name = \"pbBloodline2\";\n            this.pbBloodline2.Padding = new System.Windows.Forms.Padding(0, 0, 0, 5);\n            this.pbBloodline2.Size = new System.Drawing.Size(93, 62);\n            this.pbBloodline2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbBloodline2.TabIndex = 1;\n            this.pbBloodline2.TabStop = false;\n            // \n            // rbBloodline1\n            // \n            this.rbBloodline1.AutoSize = true;\n            this.rbBloodline1.Checked = true;\n            this.rbBloodline1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbBloodline1.Location = new System.Drawing.Point(3, 3);\n            this.rbBloodline1.Name = \"rbBloodline1\";\n            this.rbBloodline1.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.rbBloodline1.Size = new System.Drawing.Size(43, 56);\n            this.rbBloodline1.TabIndex = 3;\n            this.rbBloodline1.TabStop = true;\n            this.rbBloodline1.UseVisualStyleBackColor = true;\n            this.rbBloodline1.Click += new System.EventHandler(this.rbBloodline1_Click);\n            // \n            // gbAncestry\n            // \n            this.gbAncestry.Controls.Add(this.tlpAncestry);\n            this.gbAncestry.Location = new System.Drawing.Point(165, 156);\n            this.gbAncestry.Name = \"gbAncestry\";\n            this.gbAncestry.Size = new System.Drawing.Size(166, 212);\n            this.gbAncestry.TabIndex = 7;\n            this.gbAncestry.TabStop = false;\n            this.gbAncestry.Text = \"Ancestry\";\n            // \n            // tlpAncestry\n            // \n            this.tlpAncestry.ColumnCount = 2;\n            this.tlpAncestry.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F));\n            this.tlpAncestry.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 65F));\n            this.tlpAncestry.Controls.Add(this.lblAncestry1, 1, 1);\n            this.tlpAncestry.Controls.Add(this.rbAncestry2, 0, 2);\n            this.tlpAncestry.Controls.Add(this.pbAncestry1, 1, 0);\n            this.tlpAncestry.Controls.Add(this.rbAncestry1, 0, 0);\n            this.tlpAncestry.Controls.Add(this.rbAncestry3, 0, 4);\n            this.tlpAncestry.Controls.Add(this.lblAncestry3, 1, 5);\n            this.tlpAncestry.Controls.Add(this.lblAncestry2, 1, 3);\n            this.tlpAncestry.Controls.Add(this.pbAncestry2, 1, 2);\n            this.tlpAncestry.Controls.Add(this.pbAncestry3, 1, 4);\n            this.tlpAncestry.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tlpAncestry.Location = new System.Drawing.Point(3, 16);\n            this.tlpAncestry.Name = \"tlpAncestry\";\n            this.tlpAncestry.Padding = new System.Windows.Forms.Padding(0, 0, 0, 6);\n            this.tlpAncestry.RowCount = 6;\n            this.tlpAncestry.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 44F));\n            this.tlpAncestry.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.32972F));\n            this.tlpAncestry.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 44F));\n            this.tlpAncestry.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33514F));\n            this.tlpAncestry.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 44F));\n            this.tlpAncestry.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33514F));\n            this.tlpAncestry.Size = new System.Drawing.Size(160, 193);\n            this.tlpAncestry.TabIndex = 0;\n            // \n            // lblAncestry1\n            // \n            this.lblAncestry1.AutoSize = true;\n            this.lblAncestry1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblAncestry1.ImageIndex = 0;\n            this.lblAncestry1.Location = new System.Drawing.Point(56, 44);\n            this.lblAncestry1.Margin = new System.Windows.Forms.Padding(0);\n            this.lblAncestry1.Name = \"lblAncestry1\";\n            this.lblAncestry1.Size = new System.Drawing.Size(104, 18);\n            this.lblAncestry1.TabIndex = 8;\n            this.lblAncestry1.Text = \"Liberal Holders\";\n            this.lblAncestry1.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // rbAncestry2\n            // \n            this.rbAncestry2.AutoSize = true;\n            this.rbAncestry2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbAncestry2.Location = new System.Drawing.Point(3, 65);\n            this.rbAncestry2.Name = \"rbAncestry2\";\n            this.rbAncestry2.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.tlpAncestry.SetRowSpan(this.rbAncestry2, 2);\n            this.rbAncestry2.Size = new System.Drawing.Size(50, 56);\n            this.rbAncestry2.TabIndex = 5;\n            this.rbAncestry2.UseVisualStyleBackColor = true;\n            this.rbAncestry2.Click += new System.EventHandler(this.rbAncestry2_Click);\n            // \n            // pbAncestry1\n            // \n            this.pbAncestry1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbAncestry1.Location = new System.Drawing.Point(56, 0);\n            this.pbAncestry1.Margin = new System.Windows.Forms.Padding(0);\n            this.pbAncestry1.Name = \"pbAncestry1\";\n            this.pbAncestry1.Size = new System.Drawing.Size(104, 44);\n            this.pbAncestry1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbAncestry1.TabIndex = 2;\n            this.pbAncestry1.TabStop = false;\n            // \n            // rbAncestry1\n            // \n            this.rbAncestry1.AutoSize = true;\n            this.rbAncestry1.Checked = true;\n            this.rbAncestry1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbAncestry1.Location = new System.Drawing.Point(3, 3);\n            this.rbAncestry1.Name = \"rbAncestry1\";\n            this.rbAncestry1.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.tlpAncestry.SetRowSpan(this.rbAncestry1, 2);\n            this.rbAncestry1.Size = new System.Drawing.Size(50, 56);\n            this.rbAncestry1.TabIndex = 4;\n            this.rbAncestry1.TabStop = true;\n            this.rbAncestry1.UseVisualStyleBackColor = true;\n            this.rbAncestry1.Click += new System.EventHandler(this.rbAncestry1_Click);\n            // \n            // rbAncestry3\n            // \n            this.rbAncestry3.AutoSize = true;\n            this.rbAncestry3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbAncestry3.Location = new System.Drawing.Point(3, 127);\n            this.rbAncestry3.Name = \"rbAncestry3\";\n            this.rbAncestry3.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.tlpAncestry.SetRowSpan(this.rbAncestry3, 2);\n            this.rbAncestry3.Size = new System.Drawing.Size(50, 57);\n            this.rbAncestry3.TabIndex = 6;\n            this.rbAncestry3.UseVisualStyleBackColor = true;\n            this.rbAncestry3.Click += new System.EventHandler(this.rbAncestry3_Click);\n            // \n            // lblAncestry3\n            // \n            this.lblAncestry3.AutoSize = true;\n            this.lblAncestry3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblAncestry3.ImageIndex = 2;\n            this.lblAncestry3.Location = new System.Drawing.Point(56, 168);\n            this.lblAncestry3.Margin = new System.Windows.Forms.Padding(0);\n            this.lblAncestry3.Name = \"lblAncestry3\";\n            this.lblAncestry3.Size = new System.Drawing.Size(104, 19);\n            this.lblAncestry3.TabIndex = 9;\n            this.lblAncestry3.Text = \"Religious Reclaimers\";\n            this.lblAncestry3.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // lblAncestry2\n            // \n            this.lblAncestry2.AutoSize = true;\n            this.lblAncestry2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblAncestry2.ImageIndex = 1;\n            this.lblAncestry2.Location = new System.Drawing.Point(56, 106);\n            this.lblAncestry2.Margin = new System.Windows.Forms.Padding(0);\n            this.lblAncestry2.Name = \"lblAncestry2\";\n            this.lblAncestry2.Size = new System.Drawing.Size(104, 18);\n            this.lblAncestry2.TabIndex = 7;\n            this.lblAncestry2.Text = \"Weathy Commoners\";\n            this.lblAncestry2.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // pbAncestry2\n            // \n            this.pbAncestry2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbAncestry2.Location = new System.Drawing.Point(59, 65);\n            this.pbAncestry2.Name = \"pbAncestry2\";\n            this.pbAncestry2.Size = new System.Drawing.Size(98, 38);\n            this.pbAncestry2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbAncestry2.TabIndex = 10;\n            this.pbAncestry2.TabStop = false;\n            // \n            // pbAncestry3\n            // \n            this.pbAncestry3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbAncestry3.Location = new System.Drawing.Point(59, 127);\n            this.pbAncestry3.Name = \"pbAncestry3\";\n            this.pbAncestry3.Size = new System.Drawing.Size(98, 38);\n            this.pbAncestry3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbAncestry3.TabIndex = 11;\n            this.pbAncestry3.TabStop = false;\n            // \n            // ilAncestry\n            // \n            this.ilAncestry.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilAncestry.ImageStream\")));\n            this.ilAncestry.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilAncestry.Images.SetKeyName(0, \"Liberal.png\");\n            this.ilAncestry.Images.SetKeyName(1, \"Wealthy.png\");\n            this.ilAncestry.Images.SetKeyName(2, \"Religious.png\");\n            this.ilAncestry.Images.SetKeyName(3, \"Free.png\");\n            this.ilAncestry.Images.SetKeyName(4, \"Border.png\");\n            this.ilAncestry.Images.SetKeyName(5, \"Navy.png\");\n            this.ilAncestry.Images.SetKeyName(6, \"Cyber.png\");\n            this.ilAncestry.Images.SetKeyName(7, \"Unionists.png\");\n            this.ilAncestry.Images.SetKeyName(8, \"Zealots.png\");\n            this.ilAncestry.Images.SetKeyName(9, \"Merchandisers.png\");\n            this.ilAncestry.Images.SetKeyName(10, \"Scientists.png\");\n            this.ilAncestry.Images.SetKeyName(11, \"Tube.png\");\n            this.ilAncestry.Images.SetKeyName(12, \"Entrepreneurs.png\");\n            this.ilAncestry.Images.SetKeyName(13, \"Mercs.png\");\n            this.ilAncestry.Images.SetKeyName(14, \"Dissenters.png\");\n            this.ilAncestry.Images.SetKeyName(15, \"Inventors.png\");\n            this.ilAncestry.Images.SetKeyName(16, \"Monks.png\");\n            this.ilAncestry.Images.SetKeyName(17, \"Stargazers.png\");\n            this.ilAncestry.Images.SetKeyName(18, \"Activists.png\");\n            this.ilAncestry.Images.SetKeyName(19, \"Miners.png\");\n            this.ilAncestry.Images.SetKeyName(20, \"Immigrants.png\");\n            this.ilAncestry.Images.SetKeyName(21, \"Artists.png\");\n            this.ilAncestry.Images.SetKeyName(22, \"Diplomats.png\");\n            this.ilAncestry.Images.SetKeyName(23, \"Reborn.png\");\n            this.ilAncestry.Images.SetKeyName(24, \"Sang.png\");\n            this.ilAncestry.Images.SetKeyName(25, \"Saan.png\");\n            this.ilAncestry.Images.SetKeyName(26, \"Jing.png\");\n            this.ilAncestry.Images.SetKeyName(27, \"Tinkerers.png\");\n            this.ilAncestry.Images.SetKeyName(28, \"Traders.png\");\n            this.ilAncestry.Images.SetKeyName(29, \"Rebels.png\");\n            this.ilAncestry.Images.SetKeyName(30, \"Workers.png\");\n            this.ilAncestry.Images.SetKeyName(31, \"Tribal.png\");\n            this.ilAncestry.Images.SetKeyName(32, \"Slave.png\");\n            this.ilAncestry.Images.SetKeyName(33, \"Drifters.png\");\n            this.ilAncestry.Images.SetKeyName(34, \"Mystics.png\");\n            this.ilAncestry.Images.SetKeyName(35, \"Retailers.png\");\n            // \n            // gbGender\n            // \n            this.gbGender.Controls.Add(this.tlpGender);\n            this.gbGender.Location = new System.Drawing.Point(337, 156);\n            this.gbGender.Name = \"gbGender\";\n            this.gbGender.Size = new System.Drawing.Size(146, 212);\n            this.gbGender.TabIndex = 8;\n            this.gbGender.TabStop = false;\n            this.gbGender.Text = \"Gender\";\n            // \n            // gbCharacterName\n            // \n            this.gbCharacterName.Controls.Add(this.tbCharacterName);\n            this.gbCharacterName.Location = new System.Drawing.Point(135, 371);\n            this.gbCharacterName.Name = \"gbCharacterName\";\n            this.gbCharacterName.Padding = new System.Windows.Forms.Padding(13, 3, 13, 3);\n            this.gbCharacterName.Size = new System.Drawing.Size(226, 46);\n            this.gbCharacterName.TabIndex = 9;\n            this.gbCharacterName.TabStop = false;\n            this.gbCharacterName.Text = \"Blank Character Name\";\n            // \n            // ilBloodline\n            // \n            this.ilBloodline.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilBloodline.ImageStream\")));\n            this.ilBloodline.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilBloodline.Images.SetKeyName(0, \"amarr.png\");\n            this.ilBloodline.Images.SetKeyName(1, \"ni-kunni.png\");\n            this.ilBloodline.Images.SetKeyName(2, \"khanid.png\");\n            this.ilBloodline.Images.SetKeyName(3, \"deteis.png\");\n            this.ilBloodline.Images.SetKeyName(4, \"civire.png\");\n            this.ilBloodline.Images.SetKeyName(5, \"achura.png\");\n            this.ilBloodline.Images.SetKeyName(6, \"gallente.png\");\n            this.ilBloodline.Images.SetKeyName(7, \"intaki.png\");\n            this.ilBloodline.Images.SetKeyName(8, \"jin-mei.png\");\n            this.ilBloodline.Images.SetKeyName(9, \"sebiestor.png\");\n            this.ilBloodline.Images.SetKeyName(10, \"brutor.png\");\n            this.ilBloodline.Images.SetKeyName(11, \"verokhior.png\");\n            // \n            // tlpGender\n            // \n            this.tlpGender.ColumnCount = 2;\n            this.tlpGender.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F));\n            this.tlpGender.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 65F));\n            this.tlpGender.Controls.Add(this.rbFemale, 0, 0);\n            this.tlpGender.Controls.Add(this.pbFemale, 1, 0);\n            this.tlpGender.Controls.Add(this.rbMale, 0, 2);\n            this.tlpGender.Controls.Add(this.pbMale, 1, 2);\n            this.tlpGender.Controls.Add(this.lblFemale, 1, 1);\n            this.tlpGender.Controls.Add(this.lblMale, 1, 3);\n            this.tlpGender.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tlpGender.Location = new System.Drawing.Point(3, 16);\n            this.tlpGender.Name = \"tlpGender\";\n            this.tlpGender.RowCount = 4;\n            this.tlpGender.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpGender.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tlpGender.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpGender.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tlpGender.Size = new System.Drawing.Size(140, 193);\n            this.tlpGender.TabIndex = 2;\n            // \n            // pbFemale\n            // \n            this.pbFemale.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbFemale.Image = ((System.Drawing.Image)(resources.GetObject(\"pbFemale.Image\")));\n            this.pbFemale.Location = new System.Drawing.Point(52, 3);\n            this.pbFemale.Name = \"pbFemale\";\n            this.pbFemale.Size = new System.Drawing.Size(85, 74);\n            this.pbFemale.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbFemale.TabIndex = 2;\n            this.pbFemale.TabStop = false;\n            // \n            // pbMale\n            // \n            this.pbMale.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbMale.Image = ((System.Drawing.Image)(resources.GetObject(\"pbMale.Image\")));\n            this.pbMale.Location = new System.Drawing.Point(52, 103);\n            this.pbMale.Name = \"pbMale\";\n            this.pbMale.Size = new System.Drawing.Size(85, 66);\n            this.pbMale.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbMale.TabIndex = 3;\n            this.pbMale.TabStop = false;\n            // \n            // lblFemale\n            // \n            this.lblFemale.AutoSize = true;\n            this.lblFemale.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblFemale.Location = new System.Drawing.Point(52, 80);\n            this.lblFemale.Name = \"lblFemale\";\n            this.lblFemale.Size = new System.Drawing.Size(85, 20);\n            this.lblFemale.TabIndex = 4;\n            this.lblFemale.Text = \"Female\";\n            this.lblFemale.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // lblMale\n            // \n            this.lblMale.AutoSize = true;\n            this.lblMale.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblMale.Location = new System.Drawing.Point(52, 172);\n            this.lblMale.Name = \"lblMale\";\n            this.lblMale.Size = new System.Drawing.Size(85, 21);\n            this.lblMale.TabIndex = 5;\n            this.lblMale.Text = \"Male\";\n            this.lblMale.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // BlankCharacterControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.Color.Transparent;\n            this.Controls.Add(this.gbCharacterName);\n            this.Controls.Add(this.gbGender);\n            this.Controls.Add(this.gbAncestry);\n            this.Controls.Add(this.gbBloodline);\n            this.Controls.Add(this.gbRace);\n            this.Name = \"BlankCharacterControl\";\n            this.Size = new System.Drawing.Size(497, 425);\n            this.Load += new System.EventHandler(this.BlankCharacterControl_Load);\n            this.gbRace.ResumeLayout(false);\n            this.tlpRaces.ResumeLayout(false);\n            this.tlpRaces.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAmarr)).EndInit();\n            this.gbBloodline.ResumeLayout(false);\n            this.tlpBloodline.ResumeLayout(false);\n            this.tlpBloodline.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbBloodline3)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbBloodline1)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbBloodline2)).EndInit();\n            this.gbAncestry.ResumeLayout(false);\n            this.tlpAncestry.ResumeLayout(false);\n            this.tlpAncestry.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAncestry1)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAncestry2)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAncestry3)).EndInit();\n            this.gbGender.ResumeLayout(false);\n            this.gbCharacterName.ResumeLayout(false);\n            this.gbCharacterName.PerformLayout();\n            this.tlpGender.ResumeLayout(false);\n            this.tlpGender.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbFemale)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbMale)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.GroupBox gbRace;\n        private System.Windows.Forms.RadioButton rbAmarr;\n        private System.Windows.Forms.GroupBox gbBloodline;\n        private System.Windows.Forms.GroupBox gbAncestry;\n        private System.Windows.Forms.GroupBox gbGender;\n        private System.Windows.Forms.GroupBox gbCharacterName;\n        private System.Windows.Forms.RadioButton rbCaldari;\n        private System.Windows.Forms.ImageList ilBloodline;\n        private System.Windows.Forms.TableLayoutPanel tlpRaces;\n        private System.Windows.Forms.RadioButton rbGallente;\n        private System.Windows.Forms.RadioButton rbMinmatar;\n        private System.Windows.Forms.PictureBox pbAmarr;\n        private System.Windows.Forms.PictureBox pictureBox3;\n        private System.Windows.Forms.PictureBox pictureBox2;\n        private System.Windows.Forms.PictureBox pictureBox1;\n        private System.Windows.Forms.RadioButton rbFemale;\n        private System.Windows.Forms.RadioButton rbMale;\n        private System.Windows.Forms.PictureBox pbBloodline1;\n        private System.Windows.Forms.PictureBox pbBloodline2;\n        private System.Windows.Forms.PictureBox pbBloodline3;\n        private System.Windows.Forms.TableLayoutPanel tlpAncestry;\n        private System.Windows.Forms.TableLayoutPanel tlpBloodline;\n        private System.Windows.Forms.RadioButton rbBloodline3;\n        private System.Windows.Forms.RadioButton rbBloodline2;\n        private System.Windows.Forms.RadioButton rbBloodline1;\n        private System.Windows.Forms.RadioButton rbAncestry1;\n        private System.Windows.Forms.RadioButton rbAncestry2;\n        private System.Windows.Forms.RadioButton rbAncestry3;\n        private System.Windows.Forms.Label lblAncestry2;\n        private System.Windows.Forms.ImageList ilAncestry;\n        private System.Windows.Forms.Label lblAncestry1;\n        private System.Windows.Forms.Label lblAncestry3;\n        private System.Windows.Forms.PictureBox pbAncestry1;\n        private System.Windows.Forms.PictureBox pbAncestry2;\n        private System.Windows.Forms.PictureBox pbAncestry3;\n        private System.Windows.Forms.TextBox tbCharacterName;\n        private System.Windows.Forms.TableLayoutPanel tlpGender;\n        private System.Windows.Forms.PictureBox pbFemale;\n        private System.Windows.Forms.PictureBox pbMale;\n        private System.Windows.Forms.Label lblFemale;\n        private System.Windows.Forms.Label lblMale;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/BlankCharacter/BlankCharacterControl.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.BlankCharacter\n{\n    public partial class BlankCharacterControl : UserControl\n    {\n        /// <summary>\n        /// A list of all of the bloodlines sorted by the order they appear in the picture\n        /// control.\n        /// </summary>\n        private static readonly Bloodline[] BLOODLINES_BY_INDEX =\n        {\n            // Amarr 0-2\n            Bloodline.Amarr, Bloodline.Ni_Kunni, Bloodline.Khanid,\n            // Caldari 3-5\n            Bloodline.Deteis, Bloodline.Civire, Bloodline.Achura,\n            // Gallente 6-8\n            Bloodline.Gallente, Bloodline.Intaki, Bloodline.Jin_Mei,\n            // Minmatar 9-11\n            Bloodline.Sebiestor, Bloodline.Brutor, Bloodline.Vherokior\n        };\n        /// <summary>\n        /// A list of all the ancestries sorted by the bloodline which uses them.\n        /// </summary>\n        private static readonly Ancestry[] ANCESTRIES_BY_INDEX =\n        {\n            // Amarr\n            Ancestry.Liberal_Holders, Ancestry.Wealthy_Commoners, Ancestry.Religious_Reclaimers,\n            // Ni-Kunni\n            Ancestry.Free_Merchants, Ancestry.Border_Runners, Ancestry.Navy_Veterans,\n            // Khanid\n            Ancestry.Cyber_Knights, Ancestry.Unionists, Ancestry.Zealots,\n            // Deteis\n            Ancestry.Merchandisers, Ancestry.Scientists, Ancestry.Tube_Child,\n            // Civire\n            Ancestry.Entrepreneurs, Ancestry.Mercs, Ancestry.Dissenters,\n            // Achura\n            Ancestry.Inventors, Ancestry.Monks, Ancestry.Stargazers,\n            // Gallente\n            Ancestry.Activists, Ancestry.Miners, Ancestry.Immigrants,\n            // Intaki\n            Ancestry.Artists, Ancestry.Diplomats, Ancestry.Reborn,\n            // Jin-Mei\n            Ancestry.Sang_Do_Caste, Ancestry.Saan_Go_Caste, Ancestry.Jing_Ko_Caste,\n            // Sebiestor\n            Ancestry.Tinkerers, Ancestry.Traders, Ancestry.Rebels,\n            // Brutor\n            Ancestry.Workers, Ancestry.Tribal_Traditionalists, Ancestry.Slave_Child,\n            // Vherokior:\n            Ancestry.Drifters, Ancestry.Mystics, Ancestry.Retailers\n        };\n\n        private Font m_amarrFont;\n        private Font m_caldariFont;\n        private Font m_gallenteFont;\n        private Font m_minmatarFont;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BlankCharacterControl\"/> class.\n        /// </summary>\n        public BlankCharacterControl()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Handles the Load event of the BlankCharacterControl.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void BlankCharacterControl_Load(object sender, EventArgs e)\n        {\n            ForeColor = SystemColors.GrayText;\n\n            m_amarrFont = FontFactory.GetFont(\"Niagara Solid\", 10f);\n            m_caldariFont = FontFactory.GetFont(\"Impact\", 8.25f);\n            m_gallenteFont = FontFactory.GetFont(\"Arial Rounded MT Bold\", 8.25f);\n            m_minmatarFont = FontFactory.GetFont(\"Moolboran\", 9f);\n\n            BlankCharacterUIHelper.Race = Race.Amarr;\n\n            UpdateBloodlineControl();\n        }\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Updates the bloodline controls.\n        /// </summary>\n        private void UpdateBloodlineControl()\n        {\n            int index = 0;\n            switch (BlankCharacterUIHelper.Race)\n            {\n                case Race.Amarr:\n                    lblAncestry1.Font = lblAncestry2.Font = lblAncestry3.Font = m_amarrFont;\n                    break;\n                case Race.Caldari:\n                    index = 3;\n                    lblAncestry1.Font = lblAncestry2.Font = lblAncestry3.Font = m_caldariFont;\n                    break;\n                case Race.Gallente:\n                    index = 6;\n                    lblAncestry1.Font = lblAncestry2.Font = lblAncestry3.Font = m_gallenteFont;\n                    break;\n                case Race.Minmatar:\n                    index = 9;\n                    lblAncestry1.Font = lblAncestry2.Font = lblAncestry3.Font = m_minmatarFont;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n\n            // Calculate bloodlines based on image position (they used to match up in code,\n            // but the codes were remapped to match the SDE)\n            Bloodline bloodline1 = BLOODLINES_BY_INDEX[index], bloodline2 =\n                BLOODLINES_BY_INDEX[index + 1], bloodline3 = BLOODLINES_BY_INDEX[index + 2];\n            pbBloodline1.Image = ilBloodline.Images[index];\n            pbBloodline2.Image = ilBloodline.Images[index + 1];\n            pbBloodline3.Image = ilBloodline.Images[index + 2];\n            pbBloodline1.Tag = bloodline1;\n            pbBloodline2.Tag = bloodline2;\n            pbBloodline3.Tag = bloodline3;\n\n            if (rbBloodline1.Checked)\n                BlankCharacterUIHelper.Bloodline = bloodline1;\n            if (rbBloodline2.Checked)\n                BlankCharacterUIHelper.Bloodline = bloodline2;\n            if (rbBloodline3.Checked)\n                BlankCharacterUIHelper.Bloodline = bloodline3;\n\n            UpdateAncestryControl();\n        }\n\n        /// <summary>\n        /// Updates the ancestry controls.\n        /// </summary>\n        private void UpdateAncestryControl()\n        {\n            int index = 0;\n\n            switch (BlankCharacterUIHelper.Bloodline)\n            {\n                case Bloodline.Unknown:\n                case Bloodline.Amarr:\n                    break;\n                case Bloodline.Ni_Kunni:\n                    index = 3;\n                    break;\n                case Bloodline.Khanid:\n                    index = 6;\n                    break;\n                case Bloodline.Deteis:\n                    index = 9;\n                    break;\n                case Bloodline.Civire:\n                    index = 12;\n                    break;\n                case Bloodline.Achura:\n                    index = 15;\n                    break;\n                case Bloodline.Gallente:\n                    index = 18;\n                    break;\n                case Bloodline.Intaki:\n                    index = 21;\n                    break;\n                case Bloodline.Jin_Mei:\n                    index = 24;\n                    break;\n                case Bloodline.Sebiestor:\n                    index = 27;\n                    break;\n                case Bloodline.Brutor:\n                    index = 30;\n                    break;\n                case Bloodline.Vherokior:\n                    index = 33;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n\n            // Calculate bloodlines based on image position (they used to match up in code,\n            // but the codes were remapped to match the SDE)\n            Ancestry ancestry1 = ANCESTRIES_BY_INDEX[index], ancestry2 = ANCESTRIES_BY_INDEX[\n                index + 1], ancestry3 = ANCESTRIES_BY_INDEX[index + 2];\n            pbAncestry1.Image = ilAncestry.Images[index];\n            pbAncestry2.Image = ilAncestry.Images[index + 1];\n            pbAncestry3.Image = ilAncestry.Images[index + 2];\n            lblAncestry1.Text = ancestry1.ToString().ToUpper(CultureConstants.DefaultCulture).\n                UnderscoresToSpaces();\n            lblAncestry2.Text = ancestry2.ToString().ToUpper(CultureConstants.DefaultCulture).\n                UnderscoresToSpaces();\n            lblAncestry3.Text = ancestry3.ToString().ToUpper(CultureConstants.DefaultCulture).\n                UnderscoresToSpaces();\n            lblAncestry1.Tag = ancestry1;\n            lblAncestry2.Tag = ancestry2;\n            lblAncestry3.Tag = ancestry3;\n\n            if (rbAncestry1.Checked)\n                BlankCharacterUIHelper.Ancestry = ancestry1;\n            if (rbAncestry2.Checked)\n                BlankCharacterUIHelper.Ancestry = ancestry2;\n            if (rbAncestry3.Checked)\n                BlankCharacterUIHelper.Ancestry = ancestry3;\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// Handles the Click event of the rbAmarr control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbAmarr_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Race = Race.Amarr;\n            UpdateBloodlineControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbCaldari control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbCaldari_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Race = Race.Caldari;\n            UpdateBloodlineControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbGallente control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbGallente_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Race = Race.Gallente;\n            UpdateBloodlineControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbMinmatar control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbMinmatar_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Race = Race.Minmatar;\n            UpdateBloodlineControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbBloodline1 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbBloodline1_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Bloodline = (Bloodline)pbBloodline1.Tag;\n            UpdateAncestryControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbBloodline2 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbBloodline2_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Bloodline = (Bloodline)pbBloodline2.Tag;\n            UpdateAncestryControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbBloodline3 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbBloodline3_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Bloodline = (Bloodline)pbBloodline3.Tag;\n            UpdateAncestryControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbAncestry1 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbAncestry1_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Ancestry = (Ancestry)lblAncestry1.Tag;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbAncestry2 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbAncestry2_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Ancestry = (Ancestry)lblAncestry2.Tag;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbAncestry3 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbAncestry3_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Ancestry = (Ancestry)lblAncestry3.Tag;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbFemale control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbFemale_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Gender = Gender.Female;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbMale control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbMale_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Gender = Gender.Male;\n        }\n\n        /// <summary>\n        /// Handles the TextChanged event of the tbCharacterName control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tbCharacterName_TextChanged(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.CharacterName = tbCharacterName.Text;\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/BlankCharacter/BlankCharacterControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"pbFemale.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABF+SURBVHhe7VppVFXn1W4SkxhNG02CcxKNEQETBxRQEJxQEUEIKIMQQURFRKbLlVFmRIYLgggo\n        k0iCgiDOQRyj0Zg44lCNQ/rVxtQk/VwrJqv/yu7z3J6T3o/qt9ImDOnyXetZh3u455x3P3vvZ+/3Pfc3\n        v3kynjDwhIEnDDxh4Ocz8NQjxs+/66/gDu3tfloZ7c//Ckz596eoGqka/Uy70Z6Mf/8J3fgKQ+Np93MY\n        zxsMfn4Wg/+bMmXKtKioqNjKqsq64yc+av395zce/OHLu3+7dO3Kg+bDLa3FpaV1IaGrYiwsLad0Y5P/\n        OTVD43tg0O4XMHpjvIjxW4x+GEuWLFm6o6Fh31df32+7fueWfNp6QQ6fPil7jrbIjua9Urd/t9R/uEd2\n        HW6WgyePy8mzZ9oKizfucZrn7N+zZ8/e3ZYMEsDwVj1P43+H0RfjFQw3Nzf37XV1O7/5y1/kxu1bcuLs\n        GWlq+VC2NG6Xktpqya/aLDnlJZK1eaMeuRUlUlhdLqX4X82uBtl37JAkpaXWmY83n9ktSVAJYIjDUz3p\n        8Zcx+mNotdrVV69d/eLe/T9L641rcvDEUSmr3Srp+TmiSU6Q4NWRsiQsRJZGrJLg6EgJT4yVmKw0SSvK\n        l4ySAhBSJAXVZVIFskqrK2/OnuOwvFuRoIa/6v1eGC9hMOSTU5JTv/766x++vP+VXIbxTQf2SX5JkWji\n        Yx/OW+C+09zSInzwa6/Z9erduz+DiMfBrw2xHTPBPMzFc35DTEbKd5mlG/RErNu0QTbUVErF9vcfOjrP\n        1XQbEtoTwLzvg6HRaLT3Yfyf/vyVnL/SKjt275LcDevFa5HvNrNRo5wpikwb9fpHGTR8xFuz3H28qrNJ\n        QvF6Sd+YLzllxVJQsemh3dQp3SMSHhUBLi4urpevXLlD489dviT1u5okLSvznqOT0xoERx9Gyf9DwFMg\n        QwUJ6jHN3j4yNS/77joQkVqYJzzGZ6TcNDYxmdUtIkHVAFaAVzFqt21rvAvjL1y9KnVNO/XG28+eFUZB\n        pDhSJ6gXSgQ8rRjMY3s8g3M9CNspU5boSjfezSotkpSCXMksKRRvv0X1IPK3ynUkrWuGYRVYHBAQeP/b\n        b2D8Zanf3STZ+Xni4DgngRWBxqveh2b0YOHAtTSShvP4LPAc8DzwgoJeOOrh7OoSXVVfK2s3rpekvCxJ\n        0WXLWPNxAe2I63wiDPuAuh31e69+fl32HDoo2QXrZYG3Zy3sfon9AMsjWgR6n/nfg8YDNJigwaz1vwP6\n        AC8DrwJGQD8C3+2vjYvdXlxTJcn52ZKoyxI3b8/9+F9PhTyVTDWqOi8iSAI7vLtf3Ws7/PFHUlS+WUI0\n        4d+NNDVxYsizOWJziCxRjX8Ol3DiNPolxeD+OA4GXgeGAW8CbwEjFAy3tLLy+2Bnw/dZSIH47AyJTIxr\n        e33oG874P1OBJDKK1FTq3GjQRGliL1//vdTuboRIpYqji3MjdQGDLbAe8PyzMPx54EXF0/TuEMXYkTiO\n        AsYA5sB4wLIdLNZmrzu8Gb1EUm4mCZDxlpbr8J0BCokklBFF7ejcSCivqKg7cea0FG2pkGBtpIwePy6c\n        ec5wV0KeXu8N0OM0nJ42Bt5WjLXC0QawBewegak4N8V/8eINDQf2SlqhTiKT18i02TNbcN4EeEO5L9OI\n        OtK5JBw5drR1d0uzZBUXiN+KZTJw8GA7Jc+Z6/Q6vcPcZpjT8NEAjabBNG66Av5NAnhehUrI9IkTJ4Yf\n        QZrloCJo05PFab7bHXzPGmDkMGUYDSoJqi50fDq0Xrv6oLapAaG5TjwD/OSFXr04EYYhQ5IhT0EbCjDM\n        aTgNZX/Pes7jNMXgiThOAJgGNIpEjVU+Wxr1M3L+9OJ5NESbJTojReb7+nyP/80BSKAFQHIHAtQFPpsk\n        dDwBN+/c/ltFbY3EZaaKFwhgE9POeIoaDZmsGO2oTJzG08PMdxpsCtCTFEKmiQpeb4x0Gn3lxnUp2Vop\n        0YgAr8WL2nDeDZgH2Cv34fVMM0adKowdS8LZC+cecFLa1ERZGLiYEUBxYw1nOePk6VF6ea4yWR45YeY9\n        DafnaCy9x8kzXfoo6IvjKzyPMfbGrZuyqWaLRGFB9e5CT0YACfAA3gVmKM8aqtyD1abjo2Dv/n2tpVur\n        MKk14he8XAYMHMiJ0AiKE41niNJL7oALwNCfBFAEOVmWQRrK0CVxnDhBQeNR3ytY29g4XL/1uZS/v1Ui\n        E+LEwWXebZx3AjwBb8AVYESZAUxDwyjAxw4ahUUb6iq3fSCrU5IkEEtc03feXo1HUfDeAaYqE+Mk5wMM\n        fwoXJ0mv07vUCbWWqwpu2B7ru8Xg4OBI6I2Uf7BVQmO0Yjd9GqsAI4n3fQ/wAqgJ1BGSz6pDLeC9Om6s\n        CA6O2b6rUWIhTFzb2zs67MXT2MTQUHp+oQJXHLndRc+/BjBK6HF1koaNzP9ZHNGI6pqaxs8unJcypMAK\n        7COMHjc2V3kGo4oEEEwFag2fT3I7Pg0mWFhM2dvS3JaUnSkrY6IkMHTlw6HDhq3Aw2cD9IofwBB1ANjk\n        UORU4w09/lixsre3n33rzu3vjp/6WHQbN0jAiuVtgwYPYu7T24wqX8BfeR5TjhFGPSHBHa8DWbm5e3OK\n        CyUkNgokaNANOh1ANWDOLwa4cFkA0PucGHP+J6s0V49lZWXVt//whew/1CyJ6DZnz3U8gHsMAiiiDHsS\n        wOcw2qgxjDLqAAkgyR1aCZ6aM3duwJbttaJNTpQgbYRepGxsbWvw4GXAEoBqzR6A3qfgUeB+UssaGhYa\n        8c2338q5SxelrLpKwqI0YmJmxo0REjAWYAQw/AMVIjqfAKx7XtLGxjSmY6m6Au0wSQiL0f7vJBtrkkDP\n        UAsYrhQ+dmtqjcafjx9+fn6Lr1y7ehdb6LL7wH5JycwQByfHHVhZ0rvUEVYZLoqYZiTAB2AV6tQUYHj1\n        GDN2rPO6vJwvolMSZVlEqITGaiUhLeWBw1zHOqQDhYqTZY/Acqfm/iOtZ9iHhoZGtF6+fJe1/9CxI5Jb\n        kC/+SwJuYhXIPoICNxyg0DK6SPJSgLrAUsjeonNEEA/SEwC8ON1+xurM/NwfwuKjZWlkqITHx0juxkIJ\n        00Qcs7C0WIXvqBHw2PIEwZtVuqm0+k/3vpQLrZdkH9YZOdhjCAoNefj26NErcQ9GEMOfrTLLIPOe3qfe\n        uAJMtaFAH6Djy6ABARS2gfazZunWZKT+NTwuWlZowoTHtfm5Ura16oeUjLTmRX6L4qysrOyNjIwGcbWI\n        Dm+AtbW1bVBQUFhFVWXD5WtXvzvfelGajxySSjQ9iempEhi0/CF2gdhfsGegutPD9D4N9gfofYY/Kw+J\n        IUHqmqBj+wCFAJYaNjOc3CjkfsEqTfh9bVKCPhUiE2Jkzdo0ySsukpq6bbIfXj1x+pRe2C5h95jHk5+c\n        lg8Pt8i2xgYpqSyH2qdJcESYuHkuuGk6yiwE96XnWUFY47l+oPjRaNX77AHYXnM9wDacPUCHVwA8Qz/I\n        MpWd9Z0TtBthbJwx38vjfAxa5BhUB21SvETjmAAiUtAzpOtyJDNfJ5nrdfg7W5Ky1kpCeoqERmvEL2ip\n        LPD1Fms724ZBQ4ZQQHlfepWbJwxx9hTsMZj7BP9mOqjeJ1mdEv6GBPCBfDCFTq/O2A4LhjjWunt4XNXG\n        x7ZFIh0YFZo1cWhno/QpEhASJN5YRbrD4Hke7uLgOq/N0mbigaFvDluBXSUqPQ3nooqtNcOenqfB/orx\n        1AD2AlwSD1XI6vgOULVcOapCqK4CmaNUY6pyEBDxxrBhhVaTJjZ4+nifjk9L/j4KJCxHtXDxXCA206fe\n        Gz3efM9bI43XvtrPiA0UDacxvI+6gUIPuwI0mF6n6LHDJCGMCkYe9x4M2+sObYAMOeCDmAZqFKgqzTU/\n        J8zWOAwIRUkMCtNEnsopXC/hWNS4eXvIoCGDE/E/tsmMHII9AzdISCIbG6YByVykGM4jP9Pz1AMSRf2h\n        SKqh32nGq0TwgRRDhh+7vddhrDkwC/CC4i8HVmGTNDwnJ+ezbQ07JD41WTwW+QhqeyG+z3pOIWPP4Kp8\n        ppEkkAb7K0d+5nfZ8JAodROExlOHOr73Vy1ud1SjgDvA3AR9BQYPg8Hj0LnNhB54AAHYKQ8uLik5t+9D\n        dnbp4unnI8j3rfi+PkIA1nq20FR3hnp7wymAVHumBltrep4luEuNV7nQk8AXHzD+RYhYPxj8Jt4MmeNF\n        yXTABfApKy8/c6DloKRC+T39fAX60IhrknEtUyFGIYIk0PPcS2AKMBVo+DiAIc80a7+k7vSw/5dggCHs\n        ZPlegG+E+uJnA0PwswETND4T8NOBqcDc8vLykwcONkvKugzxX75URow03oXr1gHpCgEUTio9214ubyly\n        httnFDs2OurboZ+0sPqXyf7SJ4YPHz4CP4kJ8vf3D8Jx1dJly8KxkxONvn5NZGRkGl6fr8NRt2nz5mM7\n        9+7WNztBqATYRWqaPtO+eYGHxz4fH596H1/fCqAAyPL19U1xc3dLwOt1EqJun1Hp1UanexiPCT3l4eHh\n        8z9//KN8eu6sfPzJKTlz9jM5f/GCtF5uldYrV+QSjmexq3P46BEpLS+TqLgYCcA+4tJVwZKO5qi69n2p\n        b2qUhl07f8QOfN5UUS7u+HEFnsEOj72GWurU/f9f2pf/0f2ednN39z156pQUl23GG+J8yS/aoDe0onqL\n        VL1fg2O1lMIY3YZCiUVXuDRkpXj7+8n893zkvcAACQwJlmWrQhSsxHElvhMsvgGLxcp60m7MiospRgH3\n        +7qk3j+OGb34OcyZs6gGhkasjpLFywJl2coVEhIRLuH4rImJlkhAi82SiJjVsjx0pfgE+IuTu6vMcJwt\n        9k5z/oG5/8AMR4cfgddg8s7YMc0GOkABJAlcf3RZ2TMkQ98DQAPsXN3ctkyysdlmPmHCTrzA3G9lbd0y\n        2c72KH7ectxu6tSPZjnOOen8rutZ/6Bl4rbQW2xnzhCj/v2ODB9pfN3Y1PTKSDPT88Zmpp8AJ4zNTI7h\n        8xGTUWaH0CsU4Rlc7XFLnWsCRoLhiq9LK4DaCrMe88dPZnxzjmrgjmoQgD4gGBUhHDtHGkDrFxhwKSw6\n        Stx8vGTyjGliNKD/SVxXDWwCsoEEQAOofQGrAltfNkYsh6wI3Ho33PruPgRgYiRgKjdGQYI/mqEgIAQI\n        AzSJSUkXs/JyxXPRe2I7fRpepgwgAVsAenktEAdEANxECQbYE/gDfAfADvBRq74uJ4C5qC6GuHpjT88a\n        7gwi5gOewELAPyc357MC7A14QPysp9nJgEGDjuN7JYrxUThyg0N92cEdZS6QuPfHBRF7f26HqR1gp635\n        8czHDsPFEPOSkyMJ3J4mEZw0c5evvWfq8vJOkACu+SdNtSUBLTjP0Kfx3OLmCo/b6Fz+sgni9bwP78f7\n        Gr4K7zZ9ACfCKGBPThK4KcmJcn+A5Yt9O1vYcbo83eH1eMGB3wOKld1k6T9oIH/zswZg70+h48qQQkdj\n        hyrX8z58gar2AoaNEE53/VCjgCRwSar+AIpksHnpA+gjQ6fTNecXFcq7Xh5iaWsj/QcObML5SIA5To/T\n        cH6Xq0peS/A+FFnel/dXm6Auzf32tHMyhkQwPwm+B2Bk6Hd0c3W6A7rCAj0BFpOtSUA9zvNlB9f33Pmh\n        p9W1Pa8leB/VaDXsu5XxjyNDJYQGUCT7JyQk7E9MS5E5rs5iYTOJr9RZArnO5wYI1/dc5Rm+PVKJVY/t\n        n9XtP6skMHyNbG1t42bY2+99e8zow8amJsf7vtw3CecpfBQ6bocxUn7S26Nub7kyQcMq0QfnKIpc17NM\n        Muy5daaWN4pct2lxf0mCmbdqGrBC8EcMZgCbGv6AShW+Lt3X+yUNbn8vwyhQfzpHpafgsa9n3v/XGq+S\n        8eO+IU6wjlMUSYa6wWH4y65urfA/J1JUEtTG6VHl7efc/1dzbfvS1mUe/zsjbgAS4K8BawAAAABJRU5E\n        rkJggg==\n</value>\n  </data>\n  <data name=\"pbMale.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABM6SURBVHhe7Vp5WNVl2p6ayj2XFDW1DJdSc2MTRRAVkR0UNHaOssp2WAVkFxJUFEVERAUVFcmt\n        0nHNJZfEFCttc0YrU9umz8n65vrmD/T57vvMeZvz8UkBOZNeF7/ruq/f4T2/5X3u536W9z384Q9tRxsD\n        bQy0MdDGQBsDbQy0MfCQMNAHR1JycmpcfHyqNi6uVYiN06ZqNJpUa2tr/4fErOZPw8TExPS7//peLn36\n        sdS9Xy/vXDwv77x3Qc7+jHp8Ji7oxs/ge+J0/bs6nLpwTk6dr5Pte3aJi5tbQfPf/JBcOXbsWNMrn1+T\n        1w8fkMqdNbJhxzbdeeOuWtm0+7Wfwb+rdm7Xfbce16yr3SJrt1fL2prNsmbbJskrXiLWUyc/egQMHz7c\n        9MCRw1K8tkyylxZIFpCzrFAWwqD8FUuBIh3y8HnxmpVSsmm9FFetlaXr1khhRakUlK+S/LIVkpSXJZbW\n        Ex89Anr06NFvppdnwRT7aQUTp9jqYANPTrKbUmBrN/VnOLq5FMwO8CuwtLbyXbW58l7RhjWyCITkr14h\n        uauWSXxOuoyztnr0CLhfJD7WxGHv6OC7/8RbDdWv75AVVRVSSO+XFktOSZFos9Nk3MQJjz4BhrY/bnB4\n        zZrl95fPP2s49W6dVO/ZgZBYJoVlJXcXUQErQUBWmlg86gTQeGXzH3E8oT98fX39v/v+rw0f/fmK7D16\n        WHKXFkpafk6DqeW4gCVrV8vCkmWizUgVC6tHXAEkgIY/iaNdu3btcXQIDAzU3P7hbw3Xvrwux985JYtX\n        rpCY+YkNo0zGBjq6u6at3bpJCspWijY9RcwnjGcIPNYEHpK618Q09N6n8U/B8I6dOnXqMmfOnOAffrzT\n        cP3mDTlbf15K1pVLUkZaw/CRLwfhMY/P9vVJ27V/ryyrKJNYHQGWhRxvAoqY30bE/fLTb3siXPZP6euc\n        D893gPFPBwcHh//thx8art+6Kefff0/WVm2Q9JyshpdHjwrB5R3xzg4hoaGZh08el+L15RKzYL6Yjbdc\n        ynE92uP8lB5/NCClddNtKjkZjrfuyf8iACH/VIcOHej5iO9v3274HLKvu3hB1m2skqy8hQ1jTExiQJQR\n        3tkL7+oZFR2dd/zsGR0B0WlJYmY5bgXGn9GjB85dgc5AO+AJPQktn6YykgmKbmp8cFxd0/Kn6wjgI56A\n        /NsHBgWFMuF9eu0vcqLujKzZsF4y83IbTM3NUkHQEFw3GNcPwnuMY7XapceQF4qQCCNTEsXU0qIc40MA\n        fv8C0B8gWU8DVARJaNmhMrPKykxQTxkc/JvJetKkSZMTExPT1ldW1h49fuyDSx99eBtl6+759y7e3ntg\n        /werVpfWRkZHpZqbm09qPANFgJ+f35yvvv2m4f2PLsufjh6RZaUlkpKVcdfU3DwPrxyPOYwDAeNw/Tg8\n        wyJGG7v66OmTsmRNqUQkx4uJpUU1xq2A8YA5MEpPhhHOXQCGRPMP5VVlPOKzHSTaoSMOxGmnXjhCQkLC\n        duzcue/mV7fuffjpJ3Lq3FnZ+9Yh2f7GbqmqRc++ZbNsqNki1bteEyasQyeO3StaUfyms4uzBsmuE2dD\n        Arx9fPxvfHWrgZKvfeN1yVm8SGKTE++ONhlbgNdOBcd2MH4qrp2KW4hpUEDlkZMnpLB0pYQnxIqJhfku\n        jM8A3AAHwFpPwnM4dwMYCs0/lPfpYTqdxnfG0RWHu7u7R03t9t3ffPedfIz6fOLsaal9c4+UV1fJUngk\n        d/kSyVjyqqQtytUhozAPPf5iKVhVLKVV63TXZuZm11pNnDjN08vT/7Mvvmg4WXdWqrZvlaSsBTI3Krxh\n        xKiRuXitLV4/VW+8HQ0HpgPOsdrYzYffPi6LSpZLaHyMjLUw24dxDcBl8Sz9dVSCMcCcwDBo3mHofcpc\n        Gd8NR1x8XMIHly9d+xIZ+r3Ll+TAsbdkDbJ0VsGrEj0/UTSR4eIbrBGfuUHiHxYsmqgICUvSijYzTeKz\n        0yV5YbZkFxVIMcoX7vv60PFjd/ceOShlVeslMilOvOcENgx56cVkGD4S6jPVy94Sc6K8bYApgGNMbOzm\n        g8ePoisskrkxkTLG3OwAxiOAUMAPcAUsDQhovgIMY5/ep+zp+fT09MxbX9366YsbX0r9B+/Ljtd3S9Gq\n        lRKfkvyjywz33WNMTeL79e8/CTHSh9JGvPTu82xf6+GjRmqnuTjtjEjQ3knKydQRwXP2kkVSuGqFbsUX\n        EhslM/28G14YPCgcRvP+AUx4wIvAcBgyEjAFSMS06JiYzSR/4bIlegJMD2I8EggHAvQEWPwmAih/xj5j\n        XqvVxt+4efOnq59/JqfRk2+p3S6Fy5bKK74+NcNHjHDjdbxeVQW8+P91ZQONX5ju7OG+KS0vW0dCLFpY\n        bUaaRKcmiVeQ/93njAdqWOeBrsAzQG8851ngeeBFYDQwgQR4eXltXlayUsJio2V2UAAUYLof42FAiF4B\n        TjgzBFQOaH4SbKwAZ2dnl/qLF69euXZVTpw+JZVbqiUjJ+uWvcP0DERFdxLE9hX2P8mShvsNm4//053h\n        uycmTrJJSMxM+zIpJ0OiUMMj5seLd7Dm6779nrXHhJ8EGK+s4d2BPsBAYBhgBjAMHPBeTf/+/ZONehul\n        9OzVK7VT587RGJ8DaIBXAOaKsQDLIUthywggCawAjPvqLVt2Xrl6VY6fOinlleslZUHaTRvbSTHdu3fv\n        0aVLl6eRIzohUtqzm8NtBOONL+TZsDujYUS78VZWocgbN5Jzs2Qe6ngkVDDd1fk1PKeb/hqWLtbxAQC9\n        T/nTeCZCepdw1IOfZwI+AOPfE2C1YCmkgkgmiW3+oVQQFBQ09zpi/iiML9tQIalZGWI7ZUo6UkI3GN8V\n        6aELowTe7wjvd8J9XShhvIneY/Zld9ZTD37mGL972tHZKWUZqkY8lrPzoIJoEDFi5MuUMT3G+k3pM/4p\n        ZWU8SxyVwmTIUsecwP6CJDD7ewMshxzjvVQQS27LGiFFwLaamr11WIxUbq2W5MwFgt2ZrayG7Nnh+adh\n        fDcUiu7w/jMgoDfuI+P02kCAJWgwwA6NZ4JjNKw/r41JiN+ev3wpCEjQKQGrPCYzPoMdHT3ImKexNJqy\n        pmcnAgwHfs+8wOaIyqAKZgPsBUjOUIBEcv3AUGzZYWNjY4ukd28HmpP0/IXiqwm6Yzx4kCuM7kzDIdee\n        8LwRjB8A4431GftlvIWxxwlyYixF7M4IXRcHmOgnP8zM3FxTXrXhp6TsDAmJi2EZvdd/wACu+O7n9cn6\n        Z7AikFSSSSP5PBJDz1MFLvr3kXCqjmHXcgLisV9fd+FdKcGmZUh0pFhPsd1NqQNdDQxnjz4KxlsA9Ay9\n        pRoWylXFKT/Tg/Qkv+d1lLVlTt7CowXY5QlP0Op6h5FjRrOvp0G8h9Lm9byWeeAlgJmd0lYJkirg80gA\n        VcB3kkCuCRhuzEUtJ6BiXUXtvsMH0eTky6xAfxk67KVkGNsN6KtfmNDw8cAUgBNl8+EOeACUIcExZ4Be\n        aQyOOwUEBq5Zv2WTxKQli194MPb3rE7p71XGM85pJD3K8FCrPZ4ZbgwFqoPv4jvZNY4BSJSqAC0n4ODh\n        Qx9U19ZIQnqquHjNEKM+vZ1gKGN3GMDujP05X0jWvQBmXxrPidALytOcHKHUQc+SDJI102KcRdYb+/fJ\n        fDRHgZFhYmtvdx3j9CbVwhxAyQ8EGM80iDFN8DMJYbKj+qgwgp851hdgNWEFaDkB5y/W3169vkIiErVi\n        7+4iWMAwthnjTDD0Do32BVh+aDwNJ/ucgGGs8x6CnmK8MhdQ0pysey8jozCW2PT8XAmcFyp2Lo7/zXH9\n        NbyHSZOVhOWM5ZUG8cy/SQrzgeoSSdgYgPmB8c8yrPoSfGz+8diHn3x8dylaVU10hNi7uQi8zQfTk/QO\n        DQ/Un6kAGkOp8hrGKSdACfYD6CWCTQmN4YTpVRLBxc7Mc/UXdKtAP+QAO1enexinQphAVSZXS1rVWNEo\n        Jrdu+mfzmfQ6Gya+m12kofzZmTb74MWPn6k7e/tVtLsBEaEyfYabtO/QXkmdWXouQAJIBqXNrM+GhUbT\n        K4xPTo6T4OQJfuYYGxwSQ+NMjYyMvC5ibZELAryxiLKxt6MCqCbDXp6eVMarM1XAUGCi4zspeYJq4btI\n        UOu8jxuf2L1nz+WC5UW6zOzkOUMg1UyM03AuONh2khBbYAygWGcTxEmpbpByZRNCqH06Fb/00uAJEyaE\n        vnuxXrKxovQK8BXLiVZfYpwhwNLJfsCwlKk1hiEJqnVWZKv3K+Nb7n0aULyieHdxWalo5oWJ+yteMmjo\n        kBqMs+cmAYx7lioaT6/T4+y4aKTag2vsMUP5kiBOuE9ERMSit8+clvS8XPHAe0abjj2HceYXdnNUFRWj\n        FKCM0alUDxqq8oJ6f6uMx3N0qzje3DE8IiK/YlMllqqR8IyPjLeZ+D7GtQBVwBJG2bPW0niybmh4U6zr\n        lhlcFAHtgW4bKiv37zt0EFtgmeI0041E79ATzCrC5KnaWc7L8LmN1WBIuPqONrXo4EPIZhczM7PZ23ft\n        uBeVFC9egb4yw3f2/wx4bkCZfnLM4so7NF6VmiblRstVi81VI/DUtGnT3LHB8mP19hoJ10aLnZPDvWd6\n        9VyM53FRw1I6BmACZQ75td3dVhttyBAJoIyYWAblLXr1zALs4szWBMisIH+xnTq1DkYw8dH7bEIo42YZ\n        r3764r4B91fRTncsLy/f9m59vawsWy0+mkBsbZnW43kqwVJlLL2sHs0hoEWebupiEsCkwrgbNt3Boaik\n        vEyXB2b4ektgWIhYWFpW4DtKUy006JlfTDTK8/qfvrjB2hE7yanXb9yQvfv/JCmZ6eKKRDvg+efX4lnc\n        1GCFYa+hFMCa3zgEHojBhg9RiYWSZoYeiebHU5sQX5+IbtDT34fbVhIUFvKd+TiLdHzPcqNKTZOTUcbT\n        8/zRD6vJLsgvUZcuX7517sJ5KUOzNTc8FD9uWJ4EQVwOc1+P21rsLdgvsLQxwf5HCNAlQD0B7L9dR40e\n        VZqRm/39XGx4uiFLv4JQiIrXfm1nPy0TxvHaX5yYLuvh4P4iN1BSU1PTP/zoo5totGQXVprz0xeIi4f7\n        zWf79VuIS+l9EsB1PfsLNlVU46++50HIwVABlDfbUDYk0Ta2tntTMjL+4TMnSFxmeYo34jUtO0vC5kVs\n        NTUzo1Sb7LUVAQ4ODs7I+Nu+/vYbufThZUh/v+QXFoj/HM3fh40YXgqBBOBaKoA5gHmGbS37C1YZ5qUm\n        3/EgjOczFAGUNeXN1pILEk4qY9LkyYfh+X/MQrPi5Okhnn4+/AFDFi8vurMgM2OXn79fnIWFhQ1+M+nD\n        hIcOrzeaHJt58+bFb9y4cfcnn35yh15/G/uK27DIyl2UD+mH/d3EzGwdEqIvRMIfP9ljsALwvVQgO8bW\n        L2hawYyqAmSdy0+WO7a+KcBCMwvzN3yDAr6dFeAnjjM9xHW2l/iHzJXEBalSXLpKtr1WKwffOiLvnKuT\n        C+9dFCyo5PTZd+St48dkz5tvyuaarSRMElLmi7e/7w386LkK22reiP0QcBYOAthheui9b7ih8auJthW2\n        3vcWqoBljeWNZY7lji1vLJAF5LxgbFwxdbp9nRcU4IzM7YB1gtvsf4ZFMH4IiUHfMB/bZ8gbkv3qQiBP\n        srHSS0xLlfCoSEg+COV0ylFjY+MFqAbeSA0h8H4ECAgGAdzS4oKLVabxcrZFLW1rCfm5E8QDdKUQYDLS\n        AMkkAMjApJOHvvTi2ok21nVOHm737JwdZSrg4O6qI8XVa6a4IVe4A25enuICtTi6ud6ztJrw9qAhgwtg\n        +Cx43Qdxr4yn/Nles/sbA7C97gawZf63Z//GZKkwoArYhJgAXJ4yQ8/XK2EBznHAnL59+2aCjA3YyjqK\n        Hyn/jH9YuoP/27trbjX+Dv6+MmL0yMPYS1yNxVQcjHSGp2cBQUAYEIExep5Zn3HPd6n2mv3/rzZZrfX0\n        L92nVMAJMBcwE3Ptzt2fYCARIAEEP0eSCOAVwANgVeCuj9rTU7tG3EMIgrGhwDwmPMY8wIUPN1KU8Vz9\n        seypzP8fkX5jQtSagBNhKHBZyvU5jWOXFgUkAVQEQyMBYJ4gGczkJIpgSWNdZyWJ0IPfc5yEsMwy0aqd\n        n4fCeJKhSiIlyC6MJFCa9BJzAhOjRm8QDY8zAFeMHOPSmUSRFBJAQngP5U5V8DncvWWzwwUP1x9U3e/q\n        eRqvDkMSqASGA3MCEyPVQANoCDM3VUGv0kh6nPmCf9Ng/mbPazwAhgU9zurCPoPJjuQy3/xuMW9odOPP\n        igTWYTZInCi7RE6cy2Gu1rh3R6O4QcL+XcU/kxpj2xbgfiG9rX7U4P18jtpBotdbvYnxSwY8iO8UCZyg\n        2ofjxOk51mq10Ukpj9AbSUP5mV4eCjCR0mhublBJJFIlOrXO/12SXUsIakwEFcH8QGNoFNtnetUQHON3\n        jG9ex+t5X2OPP/TGGxKliGCloPfUfhybFvVzuDrTWMMNUiVz3vtIGX0/pagtKENCaFhTUNe3RHVt17Yx\n        0MbAg2HgfwFn37I1Hks2+gAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"pictureBox3.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABQuSURBVHhe7VsHVFRJ1jYQlNjkDNLknJQcRFILTRZQVKIiwUYEAUUEA6AOqIAoKAIGkOSgpAFF\n        0TViTqNiGHVUTKP/rGnFsV+9/94+sGd2wo7j/Cvsf6hz6rx6r9+rqvvdWLeqR40aKSMIjCAwgsAIAsMH\n        AX5+foExUIbPjP4DMwEi+YWhiEGRhyInJycvIyMjJy0tLYtVTFxMQgDKf2Dooe2SwWBITIBiaGho7Ozs\n        zIoMD4tLTl64bPGSxTkLFizIiJ4TnRgyPTjWzc01wNzC3A7AkPuvB2L06NFjx0EREhISdnae7LF+dU5F\n        645N1y/U7ey/3dz408ue/dTLs93UvWMHqTf3e7mv+777cKP3Rl9FZcWByKiIdF09XXP4fPzQsu4zR4eJ\n        CxsYGBhOnTrVV1FJUdliooXfvswUsiM2ipREzibFkaGkMnYOKZkzi2yNCSNfc2Lob0u+Iq8vHKf6nz+m\n        +j+8p/LyclpAS5ggPQxUnc+cypf/TAKKra2tfWND7TfPf3j61tJyUjAAIs6y0H+YF+hLFrlPIRHWE4m/\n        sQHvOt3ChMQ42FJJLk6kOyOFvr95PXn16LsPTpMdq0AKLPX19Q2VoKAkfXlq/uSIoqKiYmw2O+Bow64H\n        T7pauE+PtnPdXF3WAgCi2soKFUFmhnSAsT6NVy99HRJgYkB7G+jQCMRMSzOyyteTtCUnkPL83LuTLCfF\n        R0ZGJmzbtnWPr6/vLD19PcNhDQJ4sLF2tjZTrh755lFTVip3oasTKQoLJWnhoRcAGA0BAX4/Z0112ltf\n        h3ZkqhELJQXiqafNu8fqa6RHL/V0Jw8rNhJ7B4dNjo4OXlcuX7j14acP1IGuzt5p0wLn6enpGQgKCo77\n        k3z5Mq8rKiqqtpYW3tkYHU4FTzQjrlpMOtjcmFQsTXwrKCjgAEZR2kRF/hESjb85MdV4V/sJqgQBQClo\n        TJhL56enXLWxsZk3f07UIiS+//Fdnk1AEEJCgmNVVFRUEewvQ9UnjgLE8UX4sxs2AscXsVyJB4i3GxCH\n        HE8HrirJya2ArvjEhYW226mpkKl6WjRWBAMlAYGIc7QlLxp3UpZWlvkOwP1LhzvuPj7UTNWnLqSe/m0/\n        1d//ltrT1HQFJIMFEiX6iVP7Mq+pKivMWukzlcy2tCCehnrEWWMCbaIgR5RFhLnecD/Tx/U8zERm7Nix\n        3hoMBoUE26gqE+Q+AuCho0mXzQwmWXMjrhkbG01bksTJf3/pLPdZTQXVvCSFqk9LJA87Wz6+ef2SWrQo\n        pZzJZGry8fEND88A3Bee6+7yAK04ijwSpyctTWlJMKipetpkrr0VKU+e/xbE1hnVQEde5gESHGhiSHvo\n        avGIj3eyJVeK11IWZia5jk6O7JvNjQ9uVpVR+5cmk/xZwaQkOoI6un4l6f/+FtXTc+KBlZWlJ0aTX4a9\n        fzCKqKgwK8jMmASDO0POI2eR8yD+BA0bAlIybzZRkJbmqYE0Q2wLusAts0PoyohQel1IAOnOzSapCfOO\n        TZw0aeaaxWklr/fWUU2JcfQyH0+yMtCPKgoPJfszFtGPdmwlr2+ep0Kmh6xTUFBQHhYAwCRE+MaMydOU\n        lHhnA/ptqaxE0NVF2U4iUXZWJBpq/uwgEjPN7ySogKyUpIRXQWgwqU9Ppk4U5FHfH2kmt86f+ruRoUEe\n        cr9vb8Pz7oKV3LVB/mS+swNZ4e9NCkOD6PrEeaRtSTI5Bt9sWbvyOgRJekMeIIFIC6EKAAj8cPWQEhrf\n        aywvR6FVj3Gw5gU5SMSuuGi6JX/lM3FxMVs5OVlVr8n2DQFOjieSObG3mvc2vIqLm3dUR0fbZ3V6aumz\n        6m2kbkEcL2BaBcSXzQyi6+aG0Xn+bFIaOYuUx84lxypKfoKFVCCo1dDaAViwuC+ODv1WUlLCHcUbqtI4\n        fv4tOtKS7zDISXKdTMKsJpIpBjp3mepqBWDgvMHK26Alh2iRbWZuxgaDFiwlJeWlocE0e9TV+exq0Voe\n        odvCZ/DiggUujmS2lQXBdrStJSkAlTlSnM+Vk5VOhvGG1h3y842N5gCRdV9l9wf4eBeBFIjApFAq/ORF\n        hO9P1lJ7rygjWclkqs+yt7f3iYgITygpKano7GjvbmxsaFuWtWydmZmZHUOCIb04KTH/TVsTaUtNJKVh\n        0+nCYH96sYcLnc324F1RooLMjUAynEnx3DDKQJNZgmMNqR3gGzM60V5DnTgyJ5AN0bOpglVLz4BuTgYX\n        JQT6qSMiLJQAHGa5u7v719fXdLx997afF9yAT8cr1idPH/+YtDCpqK+96fmrqjL6ZGYq3RATTgeaGhGs\n        HFChKOA82hNvQ10yRVebpHtPJXp62tXDAgC0+lM01GlfY32yGgzX9a7WV56eU9MBACFYyMk4ONizOjra\n        Trx/dI960XOE+7q7nepr2MXtra4kr04fIXcP7SfvDrRRl7duog4mxdOVkTMJ6nuGpxsJh+gQCXfV1uBF\n        i/FOdgTHSwT7YKqpPvQA8PPxJVmqKBE7CGjQ3aWwXMil3Vu52cuzT4qLi5vCUlhl2+bCpvfXL3Bv1Fdx\n        uwpWcY+vziZ7UpNIipszKQoJoFvnx9AH05LoErD0B5Li6LWBPjTGFDEONgQXShg5QqxAJmuqUwgEBk7T\n        LUyJlZ7u0AOAKoDcx7je28SIF7Rcaaj8qK2hngVWWsPJydH/ycGWj6fKi7i1qRxqTcg0kgrc60zh0L0b\n        1pCutIX03thIGiPIqrAQujkuik6HUBr1HWMIFHlLZUVioQjhMhDPgsDKRl2NZxi1VBS2DLkKCPDzhWM4\n        izE9TroyKYZsWJJ8T1lZyVNWVlZhVWpi04PGGm5jRgpVDDYCXduaAG+yjO3Bs/IbpwfQuX5eJJvNImun\n        +ZL6OWE8VWJBdIigYjCF6wkMnwdXkDYT1Eikgy2RYohsGHIAwNg5WEDgEwiR4GIQ/9bVGdQ01yldQLy2\n        pJSkXE1O6ndNGalUChCOOh0HIe9ybxYpDvGnMT5AbqO4IwhF8AzFHg2qFaiVkZwshaGyuaICZQ33CIK2\n        pCSFzz2Ndd+Ap4kccL1D5wgwtpeVlPibuozkXVs97b4Ae5vrenq6eWD8ZCUlJRWrkjk/4EImy9eLJ9aJ\n        QPSaID9SGRNJN8dG8FwdgoBSEW5twTN0GD94wmoSJctEXo4oCgt91JGS4A4unAwBAG152e+Aauuho/xf\n        R5aCEFcXgiFLZWVlSyVlJX0wgAwEoDgu8lkZZw6VE+hDsC6HFWMcWPJCsBWZIBEoFQgMz8WBwUMxN1WQ\n        560WUe+ZDHGumpgo105dlZdCw0UWxgGioiJVMAWF4QLAaCUlRRcraytWYGBAhLm5mQ0QLwlLdslIX8+L\n        7dlpPB3nTHGkkPgIIBaNHuYBUQ1mTDTlGTzUdSQaxVxPRpqaICZGKcGiCgFAT4PPLFVVCNvY4AcgPHjI\n        xf9n6AuZMiccqs9Pp3oPtnxIS02uheyQGqaujDXVC79O5tDrw0IIegAUd7QD8U4OPOJR7N10tGhMnqDu\n        I/eRyyjmCAC2Ma+AbVQHloEeGS/IVwljD5uVIA8HUAGTUEfbV9eaqrmVleU3TUxN7DFBCobQNNN/6psK\n        zjyeqKOrxIoJUJSIUEidzYAFk5Mmk+ffkXB0qygFuKrEe3zuZaBL43NZhuhpGM4Z6vDaQsOUmLYGc0V1\n        bubHO5fPvPPx9UmCLS8ZiAYFFaSlCtM8pvBcH6oAEh4EYu9ubMTLCqOlt9fUILylNIj6IBAIAIbZeO+k\n        rUXU5aTQ8IUOuev7PcMDKWsxL1fnpqtdez+Ubio6BhsjZpjGhpS4vImq4sXcoAACq0MKuY/Es4wMeVcE\n        wx7EHwFAS49Eo69HwvE5SoeMmOgVADkMxmYMF8P3q3ngVhgshNRj5szuvne9p5/N9lqI3gB3fOE3TS0F\n        +WuRdjYUxvd+5iaEBa4OifMyNebF9xhOIwBoE6Zoa9AsQ31ipCj/TliAv3vA6A1f4gfRwL08daa6QWhI\n        4O6aLZu+VVZRNhxMYQMIakIC/PUmykoUcha5jxUjPoz8kGg0hBjqGsrKEAUxke/Hjh79FfRtBlVw2HL+\n        lxNDEGAni2lhasIJYrvVwU6Zxs8yN7xcARwE2C0hNP7aBAmxl1iZUoyXiqLCLxnjBO8LjB3TBu+kDhg7\n        qWFn8D6FE8h10H8RUAFDERERm9/w2ZjIUINqC5X1s2o58Bx/H16W/lMI/+U7Ayc+/v8dePgcMEa+GUHg\n        vwyBwGmB4S6uLrkw7d/NvYOOj4dzPew/a7AwZsA6rCGZoD5hXtfBrrsw0d9deBQXF20qWFdwdMBy/1t6\n        8IAYADYOQSst3Vx+9erle7CvwMQDUjW7q/fBx7/c6xvj4eEelZaeuhLWGpJfHCwE4PW7f1A+Pt5rYPK/\n        isIg1R15o/f6/4wfPz4WssCx8znzlwwGLJApkkRiBycNJ+OULl+9+sLCwiIZTobllZVuuh4XF3NEXV09\n        9PuHD96ePnvmRwZDPAjfR8mAb/lgNSmSkLig48Wr1xScF8hSVVV1NjY2nm1qahIN96lYYY9wccbSjJwl\n        GUvyVuWsKly6bOn61NRFOTCXrMioyEXTZ0yPiYiMSAudGRoLGzHuWtpahp8srQhARVXlvcNHDj+CuN4L\n        uPBPVYCQ1/zZ8yfv165d0wMdGgDBinDGDwlQwgE6OtuPwSlAHyCGv6qqoha+ZWZmZR7gcBL2Vm6vOgOc\n        n+Xn57OxsLi4i5PI6a6oKL8iLS3FS3HBzlHo9ds3X1+8fOV1456GZ9d7b3Ary0vvA2DdLA/3ysAA/2pb\n        O5vtphPNv9YzMOowNbPo0DXQ72BqMVtAbVu1tDSXw7hO0BcTqjRUuYF5YRvrp0WViooKgVu2bjnv5u5e\n        XV2z+5yqmqoBru60tbV1Tp8+eZ3t4/tNRsbik9g5SEN04oLE5dAWgV0e/cdPn3BhIpmycrL2WdnZhxGk\n        nNycnSdPHr+voqKcDP3I5+Ss2tHX9/ANZHc4sIQ+MAgAintre0sfSAQSEljXUPdASGh8HKoZZJ1s79y5\n        /RDayEkGRJ3q0jLSxnCWqOjipQv3v715k3J1dS2F3/76jhECUFdXexk6M3ZnedRuLt3U6R/gP7P9m7bL\n        amqqOUZGhhkpKckHcSK29varFiQtwLYGHIkLO3r8+AtIiZc6TXZaCQBuhudSuXl5Hc3N+3BJ6wwSI3Lm\n        7OknSUkLEByz2rradgAgBCXAzc0t/szZnj5QA3uUprbW5jsAmBuqx8ZNm79+/vzpO2hi9DiqvKLy6Isf\n        f+Q2t7Y+sbWxbMnKXnYGHvtA/eubphpMZszRo0f6kHuIqKcXe++Z8+dfQsJzIRJqaWnpf+LkiT4QZwsg\n        dL4322s3guHr5xsfFjZ7B5wE/SZz2dJa0Nu1+H3mssy90VGR+6GtgvmD7u6Dj0DNcuBedBAAIFrk7Llz\n        d0HyTg4a3+rqXWcQAJCMcT3nzr860XPihaCAgC9Ig05o6IxSX/+AS4sWJR85fuL4TQkJxv/dkhlWdTFA\n        4GOYoDmijRuf6WnJF7W0tNKRUyD2fnPmRLULCApYT5o0kRM0LbARAUhIiF8O+4Gcurqa07t31/TABkk8\n        vl+wbl2Hq5vbDiQYATh35Xw/HJ4KRC7v2rVzH6TSI7W1tULKQO3KtpR1gxFUtrOzC6ivrz2LAMAOsvW2\n        im3XVqxccSorK3Pf/oOHnoMtSoATuOF3vrv9cV5c3Cl7e7sC6O/TdByJ+ncFEpwLBySAB8AACHIweVye\n        jmGxPPyCg4NqoC3p7Dw5vq6+thfasmnpaRsgHeazbl1+Z1t7ay9IiC++v3PXjh7osxYBAG4KdR3q6oO+\n        8NjM2PLyrQ0aGhrJhcVFLaEzZ1RduHjhPkjBWSA6ClzmMRERYTZ4jNnglh9evnrlpZOTUz30EQo2QLet\n        ve0QeINW6HfSunUFzXCV+SPaPul3sNq7vm7acxteRhX4VfH29g7hcObvgx+kXFymJIArw2ytTfrixYUw\n        MU/gRtbFi+cegVhPwY9r6xsux8fHdUITj74yGvc03hjsu6qyshECqtVXrl59evjY8f7NZaVoexA45fz8\n        /GYA1H9D4fp2L292Z2x83HHgOp4NGO/F9kq9cbv3H+ASeYbPy8tzERhP9AB/vWzfufM0ujngkPZv9Qa+\n        nwNHWtYjRwNDglZCvLAX2gq5ubm7gEAXsBU23z9+SPn5epfDc8FDhw48Ak9wCt9BACoqth2HNrrNUS2t\n        rYfj42NblmQtuwYbK0WwuYp98Y7CgURtRgDKykoPA9fZzs5O2aByK7FPiFRX2Npab7e2tspHAEDaFLKz\n        sxuw/ZcQAA7K3L1//31DQ/3t3wMgYX5CcWdn+w3gsKq7hwcHCJ6Dk4KzvdPhagjBj15TWzt36lRWDbQn\n        3Lhzi7urpvoW/KbBL8DPqKqqQq/BA6C4ZOPZWbNm7gCJaofDFJHLly/fM0gEBDLLwbVO27Fr+yV4Zi/O\n        ELfxYrMrBgDih3GtwNAmDL5ftnVrz4wZ05Exn+8J3N3dYvHwAuh5E3Lst9AEt+UqISmxDAkaGGxQ9zCR\n        gYZoDOyPRIAxmwbGinWt9xb35OnTP4iLiaF7Gwscx+1t/HaUsLCQ1br1BX1xCXEHgYsGMG7mIEF29naJ\n        YCBD4D8E6N50sF84IYbGkychIBXCkIHCIzo84wfjWcMJukRoiv/WvD/p2akzp//+7v17CgxP9mDHv/Eh\n        EvpHmRseGDBJZU1tzW3Gpqa7FyYvbINnmOpiQMUjNVjwPThPLICESOGe48CzUQDiJIgq/eAeEyuDWSK8\n        /rMNUojE/jyDhOeVPr9oamltsra3RsvKC0Y+v6d/+RLBGkyFDRL+KV3j+F88N4j6g/r5+Xr0KaSNvDOC\n        wAgCIwiMIDA0CPwvpgE/Lvg0qNwAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"pictureBox2.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABLbSURBVHhe7VoHVFVXuh6agHJRbKBYEAQBkSJY6O1y6b13MBRpSgcRLiCCqDTpKlWKRkRQjF3U\n        qIkl+IgaS+LEaEwciUaj857J8+595v/PeLOYeclbjnEN973FWetf57C555z9f/uv3z5/+tP4MY7AOALj\n        CIgQAuLi4hIiNJ33OxWpN4e0tLTMxFHHlHc8RB4snCDqLFQY9ZwGx8w3x5w3hxocWlpa2ga/cyxfvnyF\n        qamJ2WhZAgc+6/0u0Ts8TVFpFr92dz1t7WujPYcHSO+JXlLdUUeae1tp2/5O0nWomxwbHHz98eWLrz8Z\n        HiaXbl4VDN+7Ru8++JrcuX+bPPz+W8Gzly/JX16O0Of/9Yz8/Msr8st//8LK6GvhmPDs7e0VB7gtRIDf\n        Ydrv75aJk+T4/lGB1PeDAJqYu5b6rQqggdHB1C3IgwTHhtKszTk0tSidFm8vpVuay2lRXTEpb6ui/MpC\n        vKZV3TW0vnc7PTJ0jOn7+CAZuj9Mhx/dYD65e4n57OEwg9f3f/yW3HnyNb3++BYdefajAEEIDg7cLBIA\n        yMjK8nneDtTR14XEZSVQ50A36hrkQX0i/ElIXBjN3conaUUZDJ4LqzcKcrbmovIkvTiLZpasozBGtu9r\n        IntO9ZCe0/vp0P1rrKIIAAoCcPPJl+wYyg8vRljrcHN344sEAFITpHIdvZ0JgoAr7xHmxSofnhTBhCet\n        oqhoXkU+yS3Pp/xthXRj/SZS3lpFShpLSWZpNoOWsbW1gtZ92Ej7Pj5A9pzex6AVnL97kcFVv3TvM+b0\n        7XMsGAjAvaffsQB4eXsWigQAchz5fKcAF+rg40SC40IZtyBPsio5igmMDgF3CKTpGzNJEn8tk7B+Desi\n        sVnxQlegOJZcmMqUtVVStIJDnx6mTX2t5KPLRxhU/NmL5+TuyANy+/Edev372/TTe1dYi0AAvEUFAIwB\n        PG9Hau5oSVyD3Kn/qiDW9xEAPMdmxIGiSXQtP4W9RjCS8tbStYWp7HVuJZ9p7msjHSd2UyEA7R91UPT/\n        m4+/ol8+/oY8evGI4jVawPD9G/Tlf74kTs5OOSpwiEQQ5Hk4EAcfZ+od6UsDPggibsEeBK3CO8KXBseH\n        sm6wvoJPw9euYjBIRqXFgiXEMfE5iTSlKI0WN5bS9qNdrBvUdNfT2g8bfvX5WyN36YOnj8lXT7/51QIw\n        Wzg42OdgFh1zAGQnTuRbu9lSa2c7EpoYTj1DfSAeOLJn10B34hHiRdD0g2KC0UWoT7gfQWDQGsITI1lw\n        qrvrWOV39DfTht4dtKm/hV5+cJXNArjqNx7doZfuD7FZYvDaGQZTph3PTjQAkJaRyUPzt3SyJi6QAUBh\n        6uDvRFF5R19XiuCgW0SlxzBx6xLomoJkBoMhKo5WsHpdPIPpsbRpK93e30Q7+rteV3ZU073n9rOBEH3+\n        8u0r9OR/DNL2jzrJvnN9FK0CAZgFx5hbwARp6bxlNsuJhZMlKk+4HvbU0smGmDqaEQtnK2rrbkdjM+Np\n        SHwYXZUSxfiu8qfxOUl0DcSENXnJNK0kkymoLiKYHXD10RIQkKaBVnr21nk2+p8Z+phcvfs5ayF9lwaY\n        T29fISYmxklYUI45AJgGl1ktp6b2ZtQ90EuwwtaYGJgZwN/mNGh1CIPp0TnAFazBmWB8QJBC48MhRUbS\n        1dnxTEFNEd3SVE5QUPltu2tp+6FOghZx8tppBmXvyV4BxgX8X1VHDR04d5RAeRyPpfCY9wMsAGABdh4O\n        FIMhxgIMgGa2li9w9Y2sl9GVXGO60taY2rhyaRo/S2Bqa/HKzMb8JwdfJ0yT7Krj6qPpZ29Zz6RtyKQ5\n        ZXm0bFclLawofrHnzD6mdm8DWE4ixRqi5/jBXwEQCQswsTOjCAAEPurs70Z9o/woz5F3XENjYbW8PKdV\n        UkIiFYrvgCVL9e5sbiyjLu7Ou+fMUfZRU12QYmZr8dXqrDg2/69OiLusq6e7Tn2h2oYZ06duUVSamV7f\n        UHtzz+G9r7F8xmyB7nH87MnXaAHYXI05ABgEbdy5bO2/KiWawWAYtDqUVu6o/ZlnZ8ufNGnSdElJycnY\n        fXCd7Dob9uwgzR2tdxYt0rAEF1YBUbfmWg6c+fw8TUhK6NXR0TGFsTnQLSu4u7uWbd6xFRTfRMs7qthA\n        uWn7FtJzch8VGQAwCEL1x5bB6NueId4kPin+jr6+XqOy8mx3OY6cIuguNlt59ko08bYjnczQV0Nk4NSh\n        21raWhaT5CZN3rm3+afBqx+TL7+8+dzSyjJq6tSpGNwmKCkp6ZiamZYePnX0NSqO2QN7h/6jxwTLlhmJ\n        hgVgM4TlL0Z3BAFzfH7FBrJnoEdgbm5aJCsry0EA4pLjrqEf7xxooXvP9FJXb5crkMVCDZYa+EMGoFgJ\n        9p8/RIIiAwc5HI4icggmpsabt+9pIg09O1jzx0yxbnMuOXj2kMDQyFA0AMBCCP3fxd+dBIPpe4f70bj1\n        CYyji/3lmTNnBIP5T0AAVFQXFG5pKmOLnrK6ipFJkyZ6ysjKTNHW0XaG3oFUf1hH9x3vJUbLjBpAeXm4\n        T2rqtKnzeM72nyTkrGGzQkpBGttQ9Z7cL9DT12MBGPMsgABgyrPz4kGe/4CJyYhlGnY1Pt9UuulKYGBA\n        JSijgACASC1QW1BmwbW4MHmKfIGklORsHEeAZs1WSjWxMjmvq6vTIisrsxSUmgDHJL9Av66UjNTusoay\n        FxsbS1guATvHjr7dr4UAjHkQlJSUyFuyUpe6BrgLsAuMWBPJIAmyfmsBmTt3zjpczVH0C7I3M0CQyhJ/\n        M86CAAdWdQiKJI5LSEhI6hnopaduSKdlbRWQHnOYwroilljpHtjzGhixOJHIApJiYnnLuSuYgOggGpYY\n        AR1eMlv5mVuZnYRUZ6GppWkqJib2NrQVWgl7wO/FlhoutZ0/f76uo4fTEPIGaP6Jb9rnXQc6BdqLtWNF\n        AgC2FIZKELmAmMzVDE4W/d/OjlvZd7R/yMjIMAtWdvobN3gbLg71F/ML9a8vLC7s1tPT8wXCZQQbKh8I\n        tNhp1nTVETU11SiRAEB24qR8LH9h9RlscHByfQf6Hx//9JSgvLn8pYKCQtSiRYuWT548WfktApaYgaGB\n        OdQAM8ECgqraa8jg+bPPa3fWP0rMXUOxrMYGCouiWbOUgiBbcMY8BmAh5BXuQ4PiQlhqq7C2iMGyFqP2\n        CuNlJxQVZy7v6uocmDdvns+06dOUISZwpk+frj3aFBSmKsyeO2/uImTQHZ0dkgJDArcATW5szbMZStuY\n        AeafTpB4xTbbN9KPfTbUCm64tTDmAPDsHfgBMcEUQcgD3q+8pZJsatxM47MT789SUoqorKrY/fDBn/8K\n        lV9MeUX5zpCQ4AIjo6XpYOXSQpdPWBtfkZCY0KSpuchd30Dfvbqt7tXalOQa6PjCfCMDiKWrFbX3wRbb\n        jSDPkL9tA1VQmOIuEgA4Ojrx0T+RDcosyWb7/MrmqhdQ0bWcPj04/M3Th7StveVrNzfXohcvn/8ycGjg\n        zxMnynqgJQgBUFZWNm7e3057+/ZdMzDQd/IJ83vRcbib7NjZeM7JxbHTysWGGvNMWObZ3s8B2WQiJyfn\n        jQC8hVu9Tdx599/Y2nHzg+PDGHtfR6S62HL1yInD3z95+YR+/eweffDse1K5rfLzkZHv/vrk+VPi7OL8\n        IZivtrBAkpCUkMGUZ+fCG+wa6KJ7+3uuh8eEXcN+Alvltp6253EpSc9N7EyJrSeX5RpiM+KplJSky7vP\n        +j3eacfj5WH1h8wPS3UB69t9Yg/tuzjA8vnfPRshDx/dF5Rvr/i+bEf5D7a2tlV9fb1nJkyQUsdpyMjI\n        KB8bPHZDR2dxrImN6SuvCB+aU8IX4POwyUKWKXB1CDW0NKJ/J1ig4EqOouBCTu9RjXd/FM/efoNLAG6G\n        uEMqDGODINb7yO8jlzcCAMQmxV7W0tIsWLxYO+HijUs/NzbWXwPT1XnzVsmYjLiX27ubHkLrHATApCrP\n        V76qtUyL0TXRpUvNDVlyBTMNjumbG7BEK9zr8O6zfo938ux5RVxPO+gEI+ia/GS2WhsAfv/o8Alm7/n9\n        zJMfn/7y4NsHLzw8PYra29vO9x0/8BABgCZpyZtpSJtzLZ5Hx0fdC4sM7VVVVckPDAv6Qs9EjyovnCNA\n        pVHQIrQNFxNjWzMSlhQhGgBg/WrL5W4Aro9Gp8ewOXpDfTHb7SHBeez6KebcrQvMDy+fktJtm2+duXaB\n        3vjuNm1pb//SxdU5AXx/GhQ0Yfaejj8nF6TSzfVbCNeBewFXXmOpBqOmr8bgeamlIUXWCclXdIXA2GDR\n        AAAisZyrm1tFSEI4u8uDHB9sg7HcPubq3gsHmJ7B/bTz+G66/8IBih3frkOd9OKtoZ/Pnjt7T15e3sTJ\n        22UEO0lUDn3cwsGK6KzQoQt1NajKIlUiBAGDoM8qP7bbRJcTCRdgAfBwq4xKjiFRqTE0a9M6mrYhA/t2\n        lrzE/h8FAUkrzmCA1GA3RvOqCmjHwS6Bn7/PIWyhMdghAFhSo7kLVx+BQMExjAPLrY2pJYCEmysiA4BP\n        gG9lRnEWySrNIQgACm6DsVvgkBKRyYnNjmMyYRw3STM3ZlPYGmPL5pLqUjZ7uAd7Y41PTbkWLKOMgiBg\n        wENBAIBYJSgI1KrkaBECwM+3EhsgVBQZG9wCQ8FvAnAM/4ctMlDkNC47gYlfl8jgrlBYUiTjHebH5nb0\n        72XAHrNnEPRzjP5mPAtiaW/LKo7pD7fekX3C54iEBXA4chx7B/v06NQ44OqKfl1h/B4gA6pC3PTAJgk3\n        SqG6EyBniAJmz1LnqBzS6CjmDpYUBZUXrjQWPUIQcKfJLyIAtt3siam1xSuRAABCAAequhlai7XCbCF6\n        RyR+wKQVA6cPH0EAr8+6BDYxSJTg9jkWSvjtAAqyyLiiuLKoKOZ5dAFUHoGxsLdmzxj8UFaA/+saLn3F\n        kZc/AsqHgai8x2z+zo8Sh5peGqhvjqKi4oIlukvCTS3NB5EcxWotfn0SawEeoV7s7hB+OeIZ5sM2Tg5e\n        zhTrelR+tKLCTRY7L3uKIKDPz1dT/Qv0D/0wSz8QrCDfhmB5Z6X+5RuhqpNEIDjynMkzZs6YC9v2Dppa\n        WnuA5/uJ6wHmDUpgK+sRgsHOk21rMZ2heaOSwlXHvzEoomWssDQl81RVvpWUkmqGCXmCzAIR0mj/8hz/\n        LTdAfQ4MmZgENDqSwFUoyE+W15aXl6tRUVV5jCkOVxvBEPq98Ix+LwTDwNiQzFkw5yuosapg0lwQ5BBF\n        W/H/DV3s9EDUAJOCGbNmfqOppy3AXI7Ko7ljacvmeiNtwUylGTfgxyXwPGsQZJP/7yr+G6CgMrMkxMVT\n        pylOv66mrS7QMzWgCzTnUY4C5zNQvBD+vwxEyBP8W6x2LF6CQMwQFxOLmiAl1QsukwF/G4BMHIvJjOU7\n        EQhcbSE1NpZzGX/3OAK/hQCksqlmZmY5FpYW+Sh4rau7JHK0v+rr60fBfr65MGJDtJ+qrq7u9U8RXFxT\n        U9N39BimS0NDwzhjY+MMoeBzgChZhO+BzDFFOCfYL1SHuRjhu/G3+H/hPbDfsHLx4sWBo5/zZo5/vFiK\n        iY1JtbGxqYZCxx7EEiUiMrwXXsrDycH2tnFRUeHZnt7eu8DPa+EYVIVqdXU15+FyvlABMXExqbaOzqF/\n        GIOaYdOm4uMAmJfw2XDWg/2DoNq6mputzdsvwTNV8BnwOaA7zKMSfqsJvzH5ICbqABApuXBti/dUV1cd\n        k+dwooXPAfBwQf74p/Rp6Rl5GhoamRioVFXVHOHrjVD4pD8GtrZX4H5fz76eo7A9tVpdQz0xLDxsB1oG\n        HCr1DfWX4VptNACtbe3D/zAGABw42H89j5+7q7i4uBkFdpB4c+fO9XV3d+tWUlKM6OjcdQUKTG0AwJvH\n        4zUILY/PX98KVHo8/M1upO5o2nm6qqriqPA5vr4+Ce8luKalpeWpqy/E73skZ8+eFbhQfWFpUUnJlYUL\n        1eKtrKxiLl6+8ig7O2tvfgG/7toXnz8Dy7D7PQCamlv+BwB/twAJH+HKAaiLAQB/BADeORV2jDy6d3d9\n        bm1tlcK1s6v9PQBqamqOwXtjRz1HD34rJ1yAdz7DVxjcbTXbhrJzcqpz8/LqU9PTt7e0tlyFDxeiq2qr\n        hqFBSZKWnhCKMn3G9PQtZeWfga/qt3e0PijaWLh7a9mW9orKyiZwizkd3V1PSjdvOoxj26qr2qGL1Gzc\n        2fiFcAzHYc8gCtzKx8bWpgUmPQVEHGgzh5r6xqfm5maNQgCiY2Pr4fOZaKEF8AsKBotLSk7jM1BSUlML\n        3gsAsCKYqxeBmIKsfCN4jd/9oInjGc1QKPjbOSC492c5SnAMfz96TAP+VvmnMXw2lsAYT4T1Ac4B7zUa\n        NYZFE75LWCpP+Y3n/PEYAA8dP8YRGEdgHIFxBP4/I/A3xyw6RoeJl4UAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"pictureBox1.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABHJSURBVHhe7VoHVBXX1o50kS5dLkgRLh0uHelNFEF6UamKASl2OiiKqBixF2Ll2RI19hoLGsVE\n        FJSuoKigIEKkJaJhzuTfe2SyXP+fvLf+9Yzw3uKsddbMnZl75uzv7P3tcuaLL0baCAIjCIwgMILA8ECA\n        n59fAGYyarAPj0l9qlnw8fHxC0IbA00Zmqamppa2trYOdjyXhwa3xEaPHi0qLCIsIiQkJCwgICDIB6h8\n        qjl89nFQYHFxcYlx0Hg8nlVScmLqlu3bDx0+cuyH22XlLZU1Ne01tVVtjY0Pm789cqQkZ+nSDUHBQbP0\n        9HRNtSZocWVkZGQlJCSkAAihUaNGoXb85zRRUdExSkpKyi6uLtPWFq6/cOrcpf59h4+T7XsOUrmrCwdW\n        rt1MbSoqJoeOnaaOn71EbpWVk9rHz0nf219J26vWrt27d5329/ePNDYxNgf8ODgegMA37BFAVZeCZmhk\n        aJW9dOmpjdt2v5ufkkNFzomn4pIXD6TmrCLx81OpJVl5AMRGasO2XQNFxYcHzl0tpW/dqyKPW9rpX/vf\n        kfe/vSedP3f+sq9435ngkOAYfX19Q0logzwxfHFAu7W0tPTJWLasLToubsBvehDx8g+gQyLDyYxZs0h4\n        bCyVuCiTylrxFbVy7Ray+8ChgaOnL5LLN3+iyyrryZMX7aSr7xeCIHzo/aTp6ZOOxKSELADVBExKfPhK\n        /8UX/KY83qKY+ETiPGkyPWmqL+3u5U07e04ieO4d6E98QwOomPgkKiQihkTOmUsnL06j8gs3MqZQUdtI\n        Wn/uYXr3L28ZANq7+v7Qhnnzk1fr6ukaoDkMSxD0DQzS/EOnEyd3T9rG0Yl2cHMlVnaOtJ2zC7FzdqMN\n        THj9ikrK5aKio0+CqWRAT8E+RlQkV238+DMh0yNqT5y/TL3seEPa3vQyq48AML3zDenp7X4fMyt6mYqK\n        CgcJdliBIC0tPc3LP5C2dXQhFjaOtLW9M21ibkPzLO1+15jA7ZeQlLoNJLYEJm0OXQ4EF4MuADYtCGYj\n        Ak1aUUnJ2Haibda8RYuqS0rLKOQBFPx+bSN14045uVF6l3rU2Njj6TlpDrxPBvlmWIAgJCio7uTh/trS\n        1ol2nTKFRgBQeK6+EVFUGtcMUubCRE1BUCmcMLo1YWFhERBiLDR5RSXFcapqqhrgNVQgJuAC8zt6e3ut\n        3bazuKfq4ROCwl+6Xkq27do3cOL8VfLdydMPdXS0bZFvhgMAAnr6BsU29i7M6ts6fVh57GNl5Wpg1SNg\n        okpgt2LoHeAoqqvLNQ0MCoxasmRhQUZmxsZ58+dlBwYGRllaWdrpcHX0OBwVNRWOirqOjo7PnPjEV7sO\n        HCFZKwoGFqYvJwtSl1Jnr9yifX19tkDgJDnkAEDkZopEZ2ZlR7R1DQge9QxNKFV1jXaYXAwILyMmLiau\n        Ds1rqlfI2nXrbhw8eurt5Ru3B9rA1t+972dIrrev+/3Va5cfhEeEJxkbG/MwgEItERcXc/X2DegODo8i\n        QeEzCR7DY+NI0d5/dEuIi5sPuRmAXHvYVUcA9I3NaDUNrbeg9vkAgAKEtCK6urp6WdlZW0pul5H0Zaup\n        +SlL0f9TJy9cIVV1Dwfau7ooFgj0/ZGR4RkQLXPQ54MG8auqqs539JjEeBVbBzd6opM7Sc3OI+ARCgEk\n        xqyGpMHkxhgam3QbmpiTCbqGREVV/bfxmtoULN5ttHmcFIbBqelpW4+fu0JSc/IoDILYAOjUhWuk6lED\n        edLcSnV2d1Pdfb3kTW8fw/Z2dhOT5OTkFLlcrp65uZlTeFT0Y3StLL/Yu7pSQaEzqkEDVIdEeHypiIiw\n        Dwqvb8wjwPQDqupaAxw1jbeDbC+Kz9jZ2YXtLP6Gmp0wn2AAlL5sDUmYn9Jtbmlxj8czPeztNfl4Wlb2\n        48ulpaS28Sn1qKmFelDXSCqqqnsL168/dqesrKqypv7dvMWZhGcxkcZ3IbmaWduS5CUZBN7lOWQAQLKy\n        GtVei6tPcOW1dPQoZSXlikFXh/PiU1NV3Wg9cWK3b0gowZX38Q9oFxIUyAQutIL/jweiM+eZ8dy8fabm\n        b96xs/vHimpy5vtrZFXhZio1ZxkVNSeJnjLNn6BbRfPC9yDHIPBB02PIWBnpDHQsQwKCoqLSUZwMTkpH\n        35hGMMbKyV1AP89OCFZIHldJUIA/R1ZO/qywkBBOWBmuYSwDFCEkLCYmJo7u0MLSYkHR3gNky8791KyE\n        ecQnOJBgFGlmZf+7Mc+KcasIAmobgu0TFER0DYxPw3hDEx5DGl+ha2jKqCS6PVRLsTGjC/5iQrhKONE/\n        c12jgPCEoIu5TvKo/TJ5CTUzNpZ28fCiza0n0qj6CAB2NAEEHMG2c/b4Xd/Q+CaMOTREqD5erQ41ADtO\n        zsHVlYgIC6X+OyoJSd95TJg8p/kQDKzYgAo1DIVHwHH1kW8MTS1oQyOTUvQ2Q2IC4N6acIIoPK6Sp7f/\n        PwUAVR47rPRfhrAIQGBEMPXBtVqDZlkTfSNTZsVB9SnsyDkqauq/aXMNKK4BFz3O0ADA4aiWIjmhmmIk\n        OCNqDoHK1lqYkDC7Ihjko7FjUAOBoCyGv1jpQdv/30EM4KIw2df7NYbTmEPguGxghYKjqX0MBHIBZ7za\n        VXjX2CHRAHkFhZ32rh4EJ4pBypzkedTkKVOvAsExNon1v+DgoJlJyUlZ23dsP3z33p3KiMiIpVAHNFBQ\n        UFAGUP4ACs3G1Iy33tFtMu3o4cEkVJhNsibAMj+yP54zmgCmMFZW9uSQcQCEq1m2js7E1XMqk+v7h02n\n        V61d9xRWV5OtDK1ctfrki1cdEOB8KHK87uzoT09P3QpFE2fM6EA5UElU/AP8C9Ny8ikEwNrOmRjxrH/X\n        M+Ix9o4rj7aPwmPHa6gJRjwLClLJnI817rNqAqisoZvXFGb1EYDouATqZlkF4XJ1Fo4WHS0uJCwkbGJq\n        4rBh647eSsjqXr3pZuJ+7A8f1jcf++7Y9X3FxadOnr3YmbgwlULVx/oB2j1HTb2Fn58vX0SA/6SYhFi1\n        sqrar8gFuPrIAQiAsZlZPwjsj/HGZxX8Ix8/xtTc8vnsuQuoOYmLmCjv+LkL1I6du+4bGOg7oa1jd/dw\n        i19ZsKHr0bOXdEtHF2loekaevWglZy9fJyk5uSRg+nQKEypG9a3tiYbWhB4wo0WDti0O2mSircPtZl0u\n        agRqgZy8Yjk8YzQkwuNLMVGB6kxu4qI0Km/t5oGCjTsGDp84SzU1v6QSEubumKA9QZ/D4YzX0NDQdnVz\n        Tc5ekdd29Mwl6rtzFykMdhZmZFKBUSHEK8CPOLhMok0tbGmlcZyWQeGVWcHU1ccXoQtkki3QAuwIgKCg\n        wHp4RnrIAEAMoFCrHhA68zVEcAP7vz1B7Tt8hLpfW0+97ux8Nzt29nIwAXModIxTVFRUhm0QO6j5Fxmb\n        GjTZObm/dXBzJ7bODtSECdpdEpKS1cAde2FMv49JDRKiWDQLxv+D6rNxh7IKpwWe8x4y9R9EfRRWZXjm\n        vNVFew9Rt+7eJ9du36Oxwtv4rIU0PX/2Jjo6KsXIyNAUCE8ad30wPYamCQHBNOCQmfx8fBGDdozZI4bQ\n        fDgmNlOeaayr52TGE7AagCuPQEA+sXXI3N/HKof+XVZOVnV6eMS9ktvl5G5VPVPCqnv8nMLzjp9/fp+7\n        fFkRmAEXdnkkWN+PuQC6Puy44YHmhMhgjQwKIpbBoSFfO3t4MhmgjYMTza48hsHSUhI/wf/shnr1GRyw\n        qAkVH0muLtcdia6sso40QW2/8XkbwY2OKzfvkIanL0hZ2U8NM2fOSIP8nicrKyuH5TGs+uCeIPAEB7JC\n        rr29ndvilJRduStXt3r5BjFpNgqOpMce5eQVmuG1wdCZdHtYNAxvQcNlrW2sYwo3b++qbXhK1T9pId+e\n        OAPkuIXKWbluYP22PdSZS9cGbpVV9O/eu+/Oxi1bz60uWHNoTUHBsc3btl86cvxk3Y6939DTIZq0sXci\n        bOLDgoDEBwTZBpoy92OOGBYAoCpiaKugqKgCZe25i1KzOrCKix4ha8U6GqtAWMuDnSFqQXoWWZq/hoDH\n        IKvXbyLzUlKoRZkZ1IzoL2H/wI3GBIcNcjANRsGRAKF03DxchWcWAYgLI1sm3jcwNJjqFxRanpOfTyUv\n        zqQwTvAJ8SeY5LhOmcxUjzGExmwPoz4Me9n9BBQaWR+TITwC6fWLi425Pqj2UsNlxf90HkhwCAIUOCTk\n        FeR1FBUV0gxNjRq8/UMo37BAMsXXj9kyY4MeDKEx9EUgEBAWCObc1o4oKSs/AbZfNUh4w8fm/9kqIJsj\n        MSIQcC4Ebs5AWEgwVUpaplTXyHjAzMqGwqAHwcAQGjsC8CHzm0i0tHW6xSUl7w4GOc6Drm5oQt1PqG4o\n        APp4WwAlWpBvVBGAck5EVOSGsKjIZSE+vnPCggJ74N4CeAZje33oWD36jxf8zzBEoTANRnvGPB6LGXiO\n        An+cHn9C/EeGGkFgBIERBD4BAhDtKS/Pyys8cOjQmeycHNiYFNJgh4UvusIWLFyQhX327FnI5sL4WSB7\n        jaPKcUVWhx0hOfZafEJ8qq+f72zIEtXYcWAH2Ze9n5iUmA6eQQzvJSQmLB68nh0ZFZkEhRYshPDBf2XZ\n        5xUU5C3+Ns8Bwijer65tbmn/mfqxvJo0NrfBzm5dO1zXxQkeOX6ise1NH3za0kceN7/sh4mbwj2pW2UP\n        mGsurm574DFRqB/w7sPeH34H9OhpC/X8VSd50dbeB0mgI05+1ZqC8+w4+JmMtLRUAARYQkePn2jB689a\n        O8iztnbqZfvr90rKSn4wnnnloyfMO2xsrAvxHZ9grf/vELBFHd7U0ka97OwhxsaGe278dJfCCULYuxwE\n        lSgtvwe/+8jLzi6o/fUSSQmJGQhASekd5rqbu3sxTg4yYrM7D+oYAMJmht08d+UGM3l3Dw8GoOIDhx7j\n        byyd4VFbe0ImBFYi+/YffI6/163f0Lhh69c9eD7V2/tb0ATHirrHNP52dHLa/7cBoMLhzG6AFBdfpKun\n        l41C4LmlpcVmaRlpy3vVj0hzexd96ep1mFwvgU2TPDAZ2b8CAP9rbW259WLJTQag0LCws/C83PclP/Qg\n        OFd+KO3F6w6ODkUIMAtASnpGadHuXffxnn9Q0HnQHJfPDgB8x5Pi7jnlmo+vby18zpI7bpxyYH1TC3lQ\n        W9+bt3otYwqOjo5FUN9Q/lcAXL1ZygAQEhp2HhIpEwQStWjpipUNeEyaP+86bpiwADQ8a3mHAFXWP+qH\n        hfh6SDQAcv/owQhOE47joJgRgyp75sLFl7FxcT+iQPGJiVegND7+/wMAgBmGQKKdOzi7XsExd+0tbgA+\n        UWUBuHj1evfFklt0Vf2jHuCAZElJKavPrgFGxkbpFVU1r+sbn7w2MjJK9gsMWo9Clz2o6tl/8FANnuPE\n        x4wRNfhXAICq/6EBmlqaySj8k5bW/g0bN5XjSt8ovd0BIOuzAKRlZlXk5uXX4zt8/PyOf1YNwNVBgoNv\n        czLvVn/gAPh8ZVNaZvZFPEfPgCqMEy+9c7cT0mJ7FoCQ0NCTUAJTZ0kQn/ec5LG7sr7hDwBc3Nw2MUzf\n        1kHQUyDhtrR3UmACjiwAS9Izb8OHVpWfnQNAGMvTl0qYLzhPnDnLMDV6BfC96UW79jATKtq9t9HJxbUM\n        yRBdIZjKZBYABO5BTV07lLm9WQKtftjIsDkCZu9gX/zl3MTD+Lu0rLzXysbm8gf31osbrjHFB79pxntD\n        BgD6aA0Nza/SsnN7i/6xh8or+KoX9vfOCgjw20TFzCpLWrCkLSIysgQIMWdu8oLW/IKv2pSVlWJj4xKf\n        4T3sy5aveCozViY8LiH5KXsNj8FhYTVCQoKzAoKCjuHvlNSUGgAqfnZcQlNObl6rpqZGVmR0VBXeCwwO\n        /B6CpVN4bmdvfwz2E6xxPNDCVkMjox1/mxscjAywlI0RGH6YhF0HOl7DlJY32PELEMzn8TeSJH7Fxd7D\n        Iz6L1z++hs9LDXb2OqbKOD7+xqPS4Dm+n30f/g9TaHY8fO6/soYwiP/IYQSBEQRGEBhBYASBT4nA/wDz\n        galotLtVDAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"pbAmarr.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABCfSURBVHhe7VoJWI3b+j/t5rnd3lua5xSNGjRrHlBpIJWi0ohwIg0qRaQSytRJSpGpJBnCOZzj\n        EDokh5JZjoM/7r0Oh2Po+9Z9333b/bueQ2Ef9/7/T+t51tO3v7XWO/zWu973Xe/XV18NtSEEhhAYQmAI\n        gSEEhhAYQmAIgU9DQEBAQBC65Ket/rRVDAaDDSsFPm01n1c52I6JBZIqfCY7EDkJHU21uTBJdKCJf+n4\n        qJEGjg4WxpXARPkvZfQnxE31dQrk5GQDYYjxpXn38Zviad3CZrMy4IXElxZCSEjIauY0vzbgy/rSvLn8\n        REVFHDcuCqakpCSj/kO7IFG0MKhHWkoi9D/CX09NYU161PjHsjIyEwe7A+C8BIWhiUGTlpaWwS7X2yQk\n        JCRxDOcMlt407xEv/b3tDsN86cGu4ds8JzOVq4tmBjyRlZVx+BBRVAqVY0HT1tbWMTAwGDlmjJW1nZ2t\n        ff+O73F8GDQARhrXDSRsmJvWy/SZ036FeSMGmsvvcQl/2+FUVV4AzeGwg/6MOO4kKqKkrKQ2caJfeF5e\n        3orqmurdR44e/amj4/J17J1XOq93dXXdwH7ixPEzNVtrdhcU5BdHREREampp6g8AgkRauBm1bWUCBfw9\n        +a3gB+lB3Gd7jWZSa9MDKDU11dnwu/9uCaiqKNkmRgWXpCeFXNyzNplqLp9BWuqyyKXDmeRx20q65/cd\n        9NsXjfSbl0co+h9ryJvnP1B/vLxLvXl19X/771fpny+2XQueElykqqrq8a6jFRERtsyJsaIrcqZSggxG\n        xBf1A1wALIb1ZEea0u5OdtVwpGVRQHsL7YLlszwepIYY0NHuCnSctzKdFmZIF862o3fme5Pz+zNIx7eZ\n        9Ot7K0nP4xJCPa8i1N9KCYLx9tlhLjDYqadlhH5SQKh7i0jPw0LS8/IM3dXV2h0YGFgEfKRwd3TVOFmF\n        saPImrk2pBcAoS9mBTwLQAUr8uMei4uLawoKCkqY68pdnzueQ8Ic5GheT/BgkQWBamTjfCu6eZ0Paan0\n        Ive+jyVv7mZxFeQq+2wDV+G33RnkTWccubbHm1zZ4Uk6dnqT9ho3cufbGNK1L5hev9jzESg5FsH+Jtvn\n        yfoFDmRlki0BecK/qAUg0uZaEi9QybUL3YipsUExCCEN536sh4nMyygXeRqBQOVTJ6mSpRFa3N6QZ01a\n        ayaQU9WTSVvDDHL5UDTpOpZIbp1IIA/PxJKHP4SRO83BpHWjFTlVrE+acvTJkVJXsjN7NKlINaclxUSW\n        A2sFDWX5OVuzLMmKxDF02jSr58B73BfbfR4jjqzofgQgwVuRbliX/Lu0lJQ9Oj5ZGam4STay9MKJCiTK\n        hUV7m0hTFtqSdxXkhM/JSQrtHc6Rr9DWUCnUN9BfbmhkmDpylEGqjo5mkYoiZ7WUuFCtGkfkpKOh3N2U\n        EG16dYIeOVDiTVbPtaRkJIXLgbcBWJpq3Sq/J5sWWtFfB+nSLhZqN8FZ2n5sCP1kwDCGQxYmLCEqtMDZ\n        UIpCEIpmmtNby0o6IILpw3GQGjaME8aSFjopJMgoAUaYqGCoVAch2RAYOBAWZZhMJkdeXp6NHZ8xPRAR\n        EcFLFQfnomeHs53JkhY8LCosWIjKw05LVRZOunhsvSudH2dKzw82oNUVZRshldDj5RMfk0d8NAhSUlKc\n        xISYUnUNdT14HmaiKf0bOjs0+YZ8f7qubtPPOjo6lmw2exgopgHKKoJA743nHxrrFQ4dGyY5TK7ym1JP\n        3z+dRLbnOpJFIRokyF7pGdAIR0DDQiavBquyRiA+WrHBLpjkaXqw+2wd7eM7IUNWVpbJYkqvmO6uTM/z\n        VSYls43oS01R5McTTbecXZwDVNVU1VSgoUCY8eG1ebB83p0nIS6u17ynqPP20Sj64BpPsnKWBYnxUqJZ\n        MmJHGAICJhqaGqa7iqJ76nZtbYdkatRgkqiPloUpKxm2JG4M1bR2Mmls2HwV0LYA5OXVWFLXpjlz6MWh\n        6mRnrjV94/gs8vDO6d/TM9JLjU2MLTHDw64BDbM8BISX9qKgeJw+IIyQg535nK7Tpc/P1UeTA2u8uWEv\n        I8KEdjRm/0/v8RJ2Hq363cq5jvTtC3voyKjppYqKiny/ngv42+ndneevQX+T5kDuXiynI6aGrB0+fLgK\n        KONsrCr6Ii1Yi2RMUia7ltqS1i1e5Nndavrmzev3CwtXbIJMMKh/2msETU9PbwRaCAiriKCIioqK8YAA\n        s5aztjabda659N6x8gRSl+9KqhZ7kMIkBzor0pwOsFd90esXFGRlJMKiPFSoZYm29NHK2fTV9nNPR40a\n        5Qz+ROSjd/l9C0RFhAJD3bTeoNdd87U93VToQILGmZ9QVlYehWvAWfk4GbNe5EfrcY/CnsVG5Ob+QNLz\n        WzX9+tUD6vWb19RP585erNhcUZuTk7U8PDws2sfXhwuKk9NYLzc313FhoaHhSUmzl++uXf3dlVM1rxsK\n        3emtSzzIqtkW1JLYMXR2pNm/lLcd/lJMWHAdsNVD3pLiIgtdjVgUyrY8wZo+21RMh04JKgcfhM6UP01L\n        hVUe6qTYkzhBjc6bYUiHeRuCx+dMhYDAzcqgMeAs+lrpSj4qnWdBt+/wI79+H8lNdF4/v0Bhlvfq5WXq\n        9YtuCrM6bn96lH5+t5F+ensP/fcbdfS9U5Aq74shjStsSVmKNVkRa0hyZ5hxPf0C6LgBLqOH/9arvAHy\n        7OUtzJQSPRrmptGTClnn5lw/OnlW7E8KCgra/NEeqBjrDDsf6qL2NtFXm4rz1X/OYjEzwLENe4cBA460\n        nZku+0JdsR/15Oysf6WzkOlxc/7ebI/qTiGYCt8+HEYu1I4n53aGkFOVE8g2SGzWzzUkBZDeYgKFYCdN\n        1OKm1NPdlGhlpngXONJk4KnZT3meCCqWI5hPcT5aSdbsqb+Ak+ZaJ1+apYHijQgPTS4AeqrMJjivxn8i\n        BJgBgyEtLaWsq6mRnxbt+ehWSwqhHuQSXo7/9noS+duZeLprbyB9Aazk+AYXUp4ymntssC+ZPoIsCtUl\n        mGKjMlNdVCgTLZmHokJC24CfO3S59ykkJSGyPMhR7W2Ul2bPnFC7+yCjI1+URyKm6spX8AjMnTSSgl2Y\n        B6/eW4zERIQpz+To6una21iarJs+ybHjSEUM3X02mfxxNYc8+DGedNQHkOYSV7JlkQ1dPt+UXhlvQDBz\n        XDxVB5RXoT3NOJSWglgHKL4ZeE2GrvhngPdXEI6gqoeZPIUAJAZZ3hcUZLjyDQB9FfYZJDzRSR+LD04D\n        EQYrkJaRkZFVVlaC4KdupqOjPdnIaNQGF2v9Y5nxzs/O1IYQdKRVaeb0hnmmdHGiMW1nIPNIUoTxLWSP\n        64E+Zo+W0NGRDbroaaiu0IG+wstG6xasGz2QnIMeZ0qLlM/216PGORp0wKIBnQsmPeAgxUXFRMUxvAEY\n        GOlYgMYodXV1d29bjTubUq24O58XqU/8bJUwpmN5XQM6Zn6fdLXVVpY7iACY6rCOAQ1Mp/nT4AIyduIY\n        VcrbZjRWYQddAgcgwDIFIEoyhIGGUG++LyIjI+02y0+DC0BmmB4REhTMAboKnyutjqr8fgRAXEx0WS+Q\n        n0uybz1DnS3dFhvohKY1oAUMgitDjSNeh9dZB5PhCKrZINYMOMVQi3PS2ZiJ1oQlskEfnQEJ4wTYJS8A\n        4A/YUbdBLRhgEliEUXKoKQV0U2DqZ39XALnkfawVe3gZIj9kfJcGgy0n8Y2aMhuvpnz5JMWSZ+YCLWt+\n        CMuSk4rWVGbvA1o2fN/9fgJK6agqYGjCsMSPhkDyA0wBdUX22l7TH7Cc/rmCy4BTwyyLv2fsM6QCedRg\n        Od4NeKn5Z1Ab3NL/GuX7ifvfKNPg0ByaNYTAEAJDCPyfQQCKmPIQdvrqdyg4lN+k4fIjD7n+e8MQjEnC\n        xUgO1v9b1gcZnBC8/7fyFb6D7wtsoMlCurju3aoyvJPBcbhwMXH8Q7z5Cm5xcVEF1Hlj+ucB+vr6jkVF\n        K061t7feAAV13mUoKSmpdP16590N60t+gK/Jfv2TH7gyO5SUrGmCd3K8daCYckJCXM2VzvYHWZlpDTEx\n        kTv31O847+MzPg3mcBMdZ2en+Kam+mvNh/b9HBEeuiV/2eIfa6or94uJif51/yuASLecOfmkuLjwFMjQ\n        /39zGFCDC7v9y01q/PhxG97N7uYvSF7+6/07r0xMTXEMS2l9MTs7O2NT94PuP8TFxfCjZ18TExfTa/+5\n        9S0UXhfCSzWoqEfdudVFKSkp8T6ECiclJzXm5eWehXEzsBDdJYsz2opXFeNV+K/5v6GxYx2ipoRMruvs\n        bHspISHu1F9gCwuL6Tm5mW1nz558AvdfLJlxG4K2NG9p0+767b+MHm22Cl71HQEYY6akzN9Xv2fbU3d3\n        V6z09qXFUG7XaO9s6wGFsQ4IhiXE/OlCa4+ZmWkBb15q5sLGgoLlZ+A394oeHRNZ0bS/8R486veXjW/P\n        mysrjsBZ896ya8tDT0/3sv4CBwT6zxxtZpZ+4FD9M2vrMVkwxjVVsIgFRkaG6Xv21v9iYWmxuj8AHh7u\n        SaamJukeHq4VDQ11XTDWd8d4FwD4lODWcubMU/gkF98fgPz8pVwA0G9sq61t8Zvo2wi/+VcM4aHHYskb\n        Z2Vl7oPqjuXXyXMq3xU4JDQ0ZcQIvSQn17Ebv//heDcIpIrOsmJT2bdAY+yhw/vv97cAdGpbqqsOy8sz\n        J8FHEs+H97tfQS1/Eo8fAnDxSntPVHTkjtjYmMx9jQ1n2RxOOoz31SPQAvbv33tr/HjvtPr6uqbg4ElY\n        PMVaAP8vRHPmzsnPzspoSUyM3RsWNqW588q51/0Fjo+PWwblrnhJSQmzEyeO/gFfZ9Lt7e3i7exssDqj\n        iADY2trgjY17BDgcjkV1ddXl+LiYA9OnhzdUb6t4FBgYUMXbXZ4FmJqZlhqbmZS1tbf+Brvv09+cEYCy\n        8vU35ZjM5I1VGx5Pmxa+Hcbl+GbyPEK4k7t21bagRfeam1bhqvxL/QXOWJS+HhwWRgehqPioww1767q2\n        b9/2HZxdbnUGAbCzs9vIA2Bp3pJyXV0ddHBaSNPKxmJNr+Xg76/6HwGwFmZmdmr7unWlJ2Coz8EhAL1H\n        QAuiS1RH56VXYKkTkR9fQYAzHRQXN2MvEO0LMeZW5rntF1qfoPdFZiWlq+sBgEQEAD6aOJxsbemZMH5c\n        ba+CX313/Mj9sU5Om1A3AFS8ufnARfiLgHKFhbhv0H7p/FsonOIZZwAAatdudfU5QbA2/1OtLZSv74TV\n        MM418cVLFu9ZWVxwHgFEvtFx0aeOHj10DUDngsiX5unp4V++seRyTm5OK3xtseoVlp08f96W3bu392Rn\n        Zx4MD5+asn1rxa85S3KOwZk2hzmCEZHhB8FhRmCyEhI6ZXZ19aanZWUl3UFBAQtycjJrd+2qeezo6DCf\n        B4CXt9fUivK1/6iqLOsOCPCfy51TX00vW7b0NJMphzQZGloa6Vtqyv/u7uaS6evnM72qcsOD2rrtz8DR\n        YlkNC6868bPiO1eXFJ2D/2TlWz6A2Z0FdIzTWHjAHcOOz/gOP0DgtzosbeFvZIzjctB55jq8dxznYojE\n        jnORLi975PHhzUHLwmfsuKNIE3d+ZC8t/ESG673eoYPVZXvo6Cz5exSA4FAbQmAIgSEEhhAYQuD/EQL/\n        BEXWJdoXTfdOAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"pbBloodline3.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABXvSURBVHhe7VsJVFPX1lYGmQUEFJF5hoQxgTAEAiFAGEIJApKigKYMQpW2PMWKWlppBUXFyiAW\n        5EmLVqxU4eGECBWh1FJELFpQULRFpS2+0v4rf8tba//7XIblgL7Gqf3X8q71rUuSc889+9v77H32PocZ\n        M15eLxl4ycBLBl4y8PdkQFFRUUkOr7/n6P7LqJQUFdTMjPSXMelmGYqz5HnYXCpBFujpMvx92NmiyFcy\n        LMxMaPPnz9dTUlRS+tuToaSkpOPFds8X+HN6NdSUd+CA+QgdaQcuKysrp6aqYurOdMz5dE/hUN6mDyp9\n        OBy+gYGBoRpe0vb33NvLysrIebk6Zq54NWjU2mTBML6wAMGYOXOmVJp/cKAKCgpqC/QWCD54Z/VgX1ej\n        5MPtW6oD/HkCQgSS/fewCE0NDct1K5d1xQr8YUL4XBTE8FmxTqxhro42663XE7uuX70E3efPDWVlZeV6\n        enqyNfF6Vu95on7MDecJ1ywNG+UxLYBuoivBTvIRek/U2WMeIs7Q0NCQtWHNysEf+r6B2zcHxvZ8VFwT\n        GBDI/8tIsLGyzEiJ5ALb3gSY1vpj8nKyNc9S8w/yQUig2VgIygo3Swb7upGEq3Ck5sjZqKgoEXGSLzRi\n        0EwNMmL8PcDDzoSCpqZGFw6Y9aw1/2B/KioqavxAXn7jwR0w8PUhuHPzGvyr5kB71KJxEp73+6n+F8yb\n        KyLCM21MwMXWCKyNKNNPf1qH92cHr6amqrNymbCnrW4XXGirg6Fr38En+z5pCgoOEjz36aCro8WIDvCW\n        MGzMgGahB454V5gl3/A8TX86YuwsjJd9/uFauHiiEr5tPgT9vZfHtuS+X+nq6sp6btFBXl5eKSaU12uj\n        qwGO1sYUbM0MiPaTXpT2J8mQk5VVW8Tn9HZWvUuR0N3aCD0Xzo+mpKRkkhD5Z61JqnZmpib5XBc7cEbT\n        d0IwaeYwV0uTzH1LqTp6Ro3NjY1z6t4VQ+fuDGg7mA8X2+vhcE11T2AAT/DMF0sa6uqWkcKwMSbNjBKe\n        kODvyQSM0aUozxOtzIjXJub6pCYrLytLKxCHQfO2NGicIKHnwjdj6SvS8i0sLCyfaVTwcLCs5LnagCvN\n        Eh2fOdAtDMHH1X4MhV8mrUKJdjCmGzLw8sGLh5cDXtIOmEy7MDerwa0pYbB/gxiOb02Hr49+Cqc+rxr0\n        5njzSTIl7dimba+hpmoa4EYbI+HOnW6NYc8GGGj+iEF8gC3NS4iQXK4vb98nldWnGk40tbW1tZ87d66j\n        oKCgyN7e3kGavkhbO2PtmuQQF3j31QAoy4iFum1roK/zLERHRWdraGg8m1WigY5GLsfJcjzm25uDh6MV\n        8DycwNxIr0Na708IEIaFJl3tboa7Pw7Ab6P/BolEAidPnezh+fP40k6H2coK2RFeNpDE94C3Y/mQnxoL\n        jeX5sGbVW00GCxY8G9/k7WAxxHGyAk97UyQB4WABIT4s0JurVYcESM0yw4EubDmyG65caIZhjOGjP92B\n        g58d7PLj+UlNgLKCfBwhINbLmSIhQ8iFwgwxHKisGFmgv8BHWot6qL2CvByL62QCXqh5LwfUPlqBp70Z\n        LAzigo7m7EpUqNQEGOrpClr2boArZ/4JN843wE8/9MOej/Z0EHeggxdZzExexF9MOsp775MDnaOmLPB3\n        oYPQww4WsR0g1o8F6RH+cKp8C1ibm2TNmjXr6fyAhqpiFiHAEzWPlkAR4OtCg7SEGLC1MCk1MjayNDEx\n        MZ0Ozs7OjEmQBQr5m2ZrQ/P1ZovaqjbCt8eL4dpXtXDn2kWKALFYnBoSEiJ4EH5+fjzyvJ2dnYONjQ2N\n        gLxPW1tbx8RAX0gIELjTKESgJYiD2FC04Q0I43kdU1ZWlroWcZ8VWBnNr+W5WIEv0wa4LjbAY9EgkseG\n        NWlLoaJk2+iRfbtHDiOaDn9K4fypzyn0f3OSwmDfVxRu9neP43LbyOC5I6PXj24DgoGT+XCjbS/80N81\n        1tvdOnKtuwVxZuTmxSYKgxcaR662fDby7ekDIz2I1poyCkd2bx6pLnx/KHtl3HCErzOEeTkA35UOwSwH\n        CPdiQEbMK7A0xK8X6wmmTzUNmDZG/QGu1hDAsgF/DIPBbGeI4HqAOCqYQtqSCAoZibEU8leLoeyDVdC4\n        Yx18uXczXNqXD1fqPkJByyh8f6oYhs5UwI2TBXDz1A641lQIg2fL4Pq5j2GgDducLqRw4/P3KVyt2gC9\n        5avgzLYV0Pi+GD5e+xqUvRkLqxaHQhrOdyJ8hK8TBKLw/gwacJ1QSc40JIEJaxYvHJWRkZEqSj1EFo9p\n        DcFudAjCe4CzBfg7mSPTVhDoZgt8D3sQICHh3q4Q7cdA02NB5kJvKFzKh7o10dCatxQuFafB1coMuHVk\n        A9w+lgN3zmyHn7vL4E7XR3C7cxd8fzoXyciBvhPrKfQfy4S+/StgoEgMl/JjoT07GhpXh0N1mgCqkoNh\n        29JQWI0p+FK+O0T6OEKYpwOlHB9nKyCOmuNgSfmqQBd7WCWOIuuUqCe2AGRPj4sdB7PowGdagZ+TKfhh\n        JAhgIBE4LfxdLCEA76EeDhDJJXOPhV7Ya4qA8zuTYeDTTPjh2HvwY8t2GOkqhZHvKuHulSr4+eoBuNVR\n        DNfrs+FSRRqc27kU2rfFwXf/XA6XSxPhYl4MfP1OODStEUL9imDYvzwUSuL9KOHFQR6wCLUe6kEDHlon\n        29kU2HbmwKabYW1i3FETS1gRGwYofOoTE4B1Ppob3Qi8HdEBMmwokI4poD8g8HNzoBDCYUI4zwPNMgDS\n        o0Ngx1uL4CCa7JcVqyh01uZSOH90Aodz4Xh5FpwoSINDm5Kh9G0xbH8jFqrWiSnsyYiHwhWxkJccAxuX\n        LoTM2AhYKeRDVBAHQvFdwRxX6v0eOBYCJ1ycOSOcLHCZjiCr1XBvJiEg64kJmDlzhqaCglyukpL8MX0d\n        9QaWneXZQI5XO9+X08HneSM4Hf4cTwqh3HFE+7pRiAv1pBAVHtgRiYgO86cQK5xAON4RYmEgheULueOI\n        GEdy2DiWTyA+iNtBMPkePhffz8X3490f71xfbwSnw5fDaadbmDVh+GtQVVE+9lRTYII5NXmM9bZW5vyd\n        m7Ph+L4yCs3VFRRaasbRWVcJA63/gkGM67cut8Avg+3wP7e74PeRARgbvQV/3L1E4T+/9sF/fhtA9MLY\n        v7sRPRT+uN1J4ffv20DS3wg/X2iAOyREtp+gcPXMEbh4fD804jsJ9u8ppFCxM59CyYfjOFBWCFbmZkmY\n        pOlhrkDWKE+UqD1kNTpamjSBryusio+EDcvj4YOMREQSbM1MhK1rkqDsndehatNqqN+aAc173odLNflw\n        /YuP4advD8Hd7+rhl/4j8NvNRvj9p6/gj5874X9vn4VfLlXCcOtWCnfP5FMYPpYPQ9VZ0FO+Hjoxy6td\n        l0yhfP1KyF8eC2kijDqIWAGXQgRWpgiCfceRniwGVVXV7Cc2+0c9KCszExcdmiBgmEOEOy49MfzE+7tC\n        Mp8JaaEsWL3QE/Li/aEyORDq18dCR/kKuFS7Dm43b4afviyAn89th9+uVYPkbiP8NlwLkmtV8Mv5PLhT\n        nwa3asTwQ3UChaFqMVwtEcHFjUL44h/BUJ0QDBWLAyEvxhfefMUT4gPdINyHAXxPR+DgAsjd0QbcHKzB\n        1c6SuouCvcm8z3zmBGBEkDNaoD4ajKvCEPS6UWw6RQARflWkN7wr8oWcWC5FwKGMCPiqMBkufpYJN46/\n        C99jmLt98m0YvVxBCf/LzSqKgF8vFsDIF2vh1uFEGNwTA9d3R0HfzmjoejcUTr8RBIdf84PKJYGwPdoP\n        cqJ94I0JAiJ8mRCIBHg626LgFlRhhtQpWPaWEBPkRUJf0jMngHSorzm7J9jFBMI9rOC1haEg9HEfYzMc\n        JQQ+9sYUwpkWFOIDHSkkhrlQSF3oQeG9N4IlhdlRY3cvF8LdrzfBjzVvwqVdYtiX4Q+v+VlLohyMKfjb\n        jsPHahwuE6CZLpDQTPUkxgY6Ev35WhL9uVpjdqaGVJHGzQ5zFD/3URyq4LkQoK2qXEoIeCMmED7euRkS\n        YyI6TA0WpKooKYlmzMQFB8H4woOCnKyMiGRrFBRnUZDF752s9WrutuXA3eb1cOvASmj7IAbiOJbDuIeW\n        rignG0egMAHsR3Rvnw/+rTBLLtfJfLxCxSbJmoM1qVFIXVf4U4TNkpMVRWLG9eFb8dDWUAtb3ttwlkaj\n        MXC9PW3GJScnqzNfW8NnrqY6T1tdjaerpUF2iTWt9TVzrn6aDtcPvgndu5dDfXYsiPju/VhdZs3VnI3t\n        Z/Mw0+TN09LkYbb52Fo/Zquiyb2JBFwdGhoakND3dAnQo9jAsKKDaafko7VJcKG1Acp25ne4slzZjyo9\n        oWWwIrjM6hC2Ux3fw6kuKsCT1A8c9LVUc8/uSIKvS1Lg9KZ4qHozgiJAWVFB4OVgvc+PSa/juNjXhXDc\n        63AjhP+4ijNuvadPEvCP6AAy/3PQXz1dCvw4c6CbGVRX5ayEvvNtUHegst/Ly+uRRQxtdXXRtuSQkU3i\n        YMmWpGDJ/neWkBK6yERXPffLoteA4Oi6cKhczodoX+d+NWWFZQtZtJElXA9JHNdVsipOIFFVViQruUcK\n        NEdNJZ+LS98AFwsIYlkNYVtiZc/vUlFSZFdtRAI626C9sX44NCRU9KgS9FxNzaQy1G7xinBc1obDiW0p\n        1NKUEPBVaTK07RTD56sFUJLgRxEwW0UxPQpzi0WY3JAKT4YoCNTR7zyOAGt9nQZCwKoYb9BQVSJ7k1IX\n        aKRiS0ZmptwrYUE1ly6chRsDF8YWRi7MfNQUwP3CpNK0IChMDoCiZC6c2iomBGQbIQEtuxKgaftiqErj\n        QE44EyK8kQBlxfRFKMxSRxMQY7jNWxSIQilXPooAEppdrQ0kXEesVFsZkTMJgheyQaOlNYdWuiNnZOhG\n        DyyJW1JENiynY5EQsGkJBzbGekP+Eg+o3Rg7RQAR/uT7MbBrqSdkBTlNERBmawKR9AkCoh9PgIK8PJ+N\n        bf2drcncJ2cSnq/2J4UkBxZcmYxlJ+trx4p37ujQnTdv2uorHpxIenuhE6wROsOqcGeoWj1OgMEctdx9\n        b/JhVwoXNr7iCiv9nCHEhdavqqSQ7m8+HwIs5wPXeD6sxMxPTfnRFmCsq7HP09pwTFFejnj+Z1MB/rPz\n        gRQbfbzYWe0tTRJvL+/U6aYBIWA1Cp6OGk4LsoGt4gCKAF11ldwtcWzYtNgT1mFNPw1z+0kCPA3mA9sQ\n        CTB5PAHqs1Ut7U3njagqzmrCPtkvxPQfJAc3HnT8/XkZb6/NrMO9+Yc0QKZApIcNEJDCanygM0UAOqvc\n        eH8mpIS6QSwWNQi8bI37ccGUbqY9G0wRNrpzIcKJDipKCtP6ALqedi5qnpj9XyP8JBkqKspq+gb6jNmz\n        Z0+3I6unKC+TLS87o5KCzIxyylHh+SFc4OTgbjN+Pw4SHWRmzrTEpCsDV5DkcyUuvCpRs3HTOUHSFr83\n        /Es0/2enyUQ7EsOncM+A7/v+HiEf/P6pTplJOdaXzV8y8JKBF8DAk+wnvoBhPfyKnJyc3HNt57qMjYzJ\n        IQgqIdHX17c8ceJEE2aBqXp6euzOzs6eyspKshCZ2oIia4QD+w7UfHH6i/Z58+aR4sSUI8OTGww8x0O8\n        /H0pa0BAQByuJRym8+rZ72UXHDp0qAlzDjbPjxc30DcwtGfPnrNk8cPlcuMaGhraS0tK65ITk3MSliVk\n        Z23IKtqUt6kco9NjM8n/SioKmXll4MrUETiyt7+/en+du6d7NT5Mih6aLc0tXSlJKf0kHt/bYUJCQtGV\n        K9SzqfcKVVVVVd13pU+Cq0nhve29vb2zh38cHtXS1op6kAQGk5G6ceNGUuggB681SbtF0Yu68G9S+NAc\n        ujU0wvXlEkJ8EDTyvbq6etzRE0cHRTEikkw9WX3AzMxM0NzSPIIdxJHEo2R3SaWVrVWpjKwMfzLnrjtc\n        1xS3OK4d29y3DnBxdUlvaWkh5SlS0aEuM1Mzh8TExLra2tp+zCJJ5jaVQxACCGFXrl0Z1dbRFt1Lgp29\n        XVxqamoP0Tjph1hdhDCCCEwVS/CESZenh+d9mSB5Hi2KIflVIjHQN8jAZtKHU0JAS2vLiIqyihCPsFTS\n        bemETd69g9tdvrta9KpoajCTwtJsaFEHPz1IMjSiNerCKVWE+/4ZpqamcR0dHYTYKatBDWb7cnyPVeyt\n        6Om92juKpe0p88VpI0hKSerAkhs1zVrbWjtwKkxVfshnpguTWOV9yRAZZ3Fxce3arLVSn2QZ1xgS0Nbe\n        NlpSWtJhZWmVKycrd5/wpI0Xxyt3ffb6LjqdHmdubi4ggyVYkbaiqGRnCSlQUEKiQHolJSUNWELLxN+j\n        Ll++POTh4VE0aQWEAHc390ok2+fo8aP9tfW1/bJyssScZ5D+CnYU9CIBVK2vtXWKAEpg8tnKyooo56Fs\n        EI/d5BypPUIUIf0uMTo8H3J+h2Dzls0dcvJyD6332Wx29ieffDIcJgir8/XxLXJhuuTg4a/sxKTE6tKP\n        SqcIWLx4cU5UdNSx8LDwamG4sGbblm096CgHJ4UiBFhbWpN/sNDBkyCM9vb2wb1795KppYdTR5CUhBYw\n        UewkGsdTYKS8Rk0B8tnQyJA8+1DliI0J2+G6w09WKdbV1WU1NzeP4Ln8Y9euXRs9cfJEPw6Ode8UIATE\n        xVE+gEEGP6EFTbodPWpn8U7KOZL2W7ZsIQMmjpP4Cj10gpYjwyMjOnN1ssjvIpEoZ/68+dmTQqC/ZeA0\n        +eGd9e800Gn0ZRMEjE8B1Hi4MJxkgeME4GdLK0tiTQ8RUH+8viEyKrJrYnyk+Z+/8BgKH4+xkbkqwsTF\n        Z8OGDWeHh4dHzc3Ml02SkJ2dXRAfH/+QD7C2thbu2LGjHzXMptnRRLY025zJOTw5AhSqFP0CNT/z8/PL\n        kfApAkgbLLTwcKoM19bV9txHAGo8KjJq6p3EAliurId8AE5LdldXF9E+yRql3yM0tzAX3rhxg4QykpGR\n        S8+F4VLw66+/ji1PWV6O0cBw+/bte5OTk4mHvj8KuLiknj59eniWwiw+Ro9qFF74YHjDs5J8Mr3wzE92\n        ya6Sapw6Uz6BvIy019DUEBLre/3113vxK8oCSBS4l4Du7u5efiB/akqQNkT41vbWflQEIYZYp/QXLkCK\n        ikuKBx0cHch/gUyalxp2SkLccH19fe/Jkyd7cVFCYvR9L6moqKgm7Ofm5Xa8t/G9Fvzd58ERzJkzh1ZW\n        XtZ1oPrAIInZSFQXtrnPzxASDAwNlk2GWjc3N3ZeXt7ZdevWEdIdSB+lpaUdpbtLBwsLC+u2Fmzd+2HR\n        h8cSliYc09LSIhb1VPUCPdQci8L9cZTEVOJVySpvEg9uYBAPLpzYMSLCT7cYkcPfaQgSKkk/5D7dRgh5\n        H4kAxIyJIsjfZEykT/Ib6YONICVxMi7yPqKQF1MjfFCzLz//P2Lg/wCxSGNO2h2DdQAAAABJRU5ErkJg\n        gg==\n</value>\n  </data>\n  <data name=\"pbBloodline1.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABXESURBVHhe7VoHVFTH+o+h7tJZ2tKWJm3p0kGKCCi9996rNEFRUAgiqICIUsSGSlQklvhsCNYo\n        aFSMsaAYTWI05kWjUSP1zuU/3z6WsxBMjv8HPt87zjlzWO6dO/N9v/n6zCeffGwfEfiIwEcE3iMCwriJ\n        4SYuLk6Txk1itMH/vLy8fO+RlPe7lKioqJiHh4d3/pL8wvr6mo2bN6/f+uWhHSd2Nte2NjXV7ywpKVqV\n        lBy/wNjY2FxDQ0PzfwIQGo0mERMTlLBlff6Rk/uLX7XtTiEO1vgSTStc0ZbFTHRglRXZXjefPLXZH13a\n        m0LcPb0U/dKzZbj9aF13UdGiCmtra3t13EBg/qukAxgvX7Fo7cl/lD/dWmSPKlPVybIkLbI8UY1syGWS\n        DXn6ZH3eLLSzgIm+KDFERyqtUNd2b/TdFy7kjZ125KMjXmTvfh/y0d0dr2trV+92dXX11dHR0QWVeb9y\n        +46rwS7FRQennt1f8nhLsTMqiFRD+WGqqCBCFS2PVicLwxVQVZoauanQDjUvn4WOr3cm2+s9yMNVdmRH\n        JZO8vnUWeXO7OfnPo44jQzdCRl53R5ADr+vJX3/tfrVy5bIGkAhF3D5IaVBUVFBaX5p0aGe5F8oLpKMc\n        fzrK9JFESyPUyNwgBkrzoqMQBwnClCk8qCrL+1pLSeDhzmIrMt6N3m83S7LfxZaOiuLV0PVtpiODV4NH\n        iPvx5ODLKnLoVRWCPvBmH2o7ceRbd3e3QFCLDwoEJYaCytaKhJvVuTYow1cWLfAUZTGf6a+A/GcLE5pK\n        fH0UKs83WKDKcY/CXUtVSdb9i4p5yMdJ5/qMGTOsqBReJ/zcW0RUoMHdSqrnwm4fcvhFKQIQBt40IwBk\n        oG83+d39b34LCgpIB0P5QYAgS5eRqy/2u7MyxZhM91EgsgJVCQAhZp4ki3EeXq4TmDF/3OU4NUpjppLp\n        yQ32pLejTjeVSpXgfMfDwyMlQOULC/fUufbD9RKyb6Ad9fdtI1l94CALBG9vz0SQhHfU0qkdLiQkJFyV\n        53B3BWYeGE/zUSKinMSJ+WYChLAAVw9eLZ6Li0toslUBgI5ap0kBgPH4O25hYSEpBzuzNcdal7zs6ztD\n        AACDf9QhFgjfXX1mb28XDO51arl6h9niAiw+Xx6nj7ICFFGarzIR7yZP2OnxD3Lz8LThaUz/aioA4Pg6\n        GzSZBHB+JyAgIGhhYR70+bqEh30vtrIAGPitjhz6Yxtqazv8PbY9zHcgeeqGWpsyYwuiNMm8MHWU4a+E\n        guxECVMNvsFPP51xGK+i+HcrsVSgzvlvAYB5sIpQMQieTZWxD1882YAGHlSQ/T1ryMHnR1FEZNgOfn5+\n        gb9bb0rfCwhQaVnBzMfAeISjJBHnIkMEOEgTo/o+xjzWZcrbFgYAbh8Me6sKsBmHIAh+i+AGIOyoin76\n        +7XPyIcn04nHJ6LQ00dXhuXk6MGf4jalTP7VZB6OhqX5kTooI2AmEe9KR+4mfGydHxN7UVER2kwGLQXP\n        MykIAEBXgyHpaa9+baIRZK9tbWViHxMTuISt5yAJZmYmUfsqXNCtwwuGL7cmDz+69BnKzE7vFBQUlHkv\n        AGCguX1mSzxL9GAQYOn9rSnEbB2BPjB4nAT4OM8qpokJFeDxkwKgrali9qgrAfn5WlzDei45GfEUCoV6\n        +tjqHn19PVf2e3jmaK3TcmSDB4IgCsLon+43Efg5eJrpb+Ym+iFhDmJY7GVZFh8AoPLNODHR2qcH6T7F\n        1ORMpAh8N/YeQrrMmWa/nnInU4KNexUUFHQg+YEO2SLnN6W5DvviksL34x0ee47HqWX4K7/aX2qEdpfa\n        kF3bfUhHB4Pj3Nzcb1W5KUPG1kDsKOg89Jh5UsRsI0nY/XHoq6spmRVGayH8fCl7YYjjDXGLjY1JyMvL\n        y69cvbABAp3GzbVPsrKyVqSnp2d5e3sHGBkZzZKUlJRif1eeaXN2VVliL51OV2Y/w4HTDE0FSmNNziyy\n        YZER2rp0Ftq3Ke0Vfq82ZYxONhGIv6c59WWgjdAoAJKEjKzIt3jsuCDHUF97/uoFxkiKLt4gJirMSEmN\n        zLxwsqF76NU+NPSimRx8UcUKaoinheTQb6Xk4Gvs3wevooHBXvTw0d1fy8rLturr65oDo435ps8rP4t+\n        IiUtNS7okZGWsE/3pKG1aapoY74ZebI5bZibm2vBtAKgqqpsCuIPoh/tJEZkBqjALkN4O64xtdTsiyLl\n        UGG2X4+irHjQ/nIr9PRMAhq4nk/2nfMYGe5NI192h5O/tM0ZIW5HjKBHaeRwbyI58GMJOdwTRz66vIDM\n        jjO5LSdFTdm2WB2Fuuv+zMX1qcbEdYLnSD0riVEkS2KVya3FDkhRib57WgGwtjSOAMMHop8TpIziQvQA\n        gOCJi/Lx8QkXRCije+cLkZW1yRo7C82mA9VuxIE1dljn1ZCdodgTPRWBXnU57mtaigLX4LfbbNknuWHK\n        xPYCA5Qbro5EhXj3lKca3G3M0yaNNMR6sdn4k5V3MpU6vTJJmywIV0RlKfrEbEv1ThwTTF9k6Olitwys\n        PyQ56d7SyG+e5u+Y+VmcACjIy2oLCVHVHUzlzlz93I/svbH3lbW1ZZKOrk4p9mJrsLEMx+O1MEhy4P6g\n        YwMHeT4D9/n8/LzF/Px8pVGezDNrkhhkQYQKEhSiHIwM81uMjeWYHYA1FaQoZcujccodykBLwlVIVzst\n        AGqcOk6pRLjNwwC404n4+UIoxU0EecxhPgRG2ItA4FNf6HR3yaKQS/x8PL67Vjqi111x5PPnnUOZWelV\n        2MBZQgID1h4CG/AG0DiJpImL6JVke5zbXmhELotkIGMtwZey0iL1d77eSvgF+JZzegNdTUZOuhfOOnHm\n        me0vh8J9LH4eBXJK+R6bzMfNbtmiECUSACiO00SBLvoPOBGfZ2+UcbzaBt0+tZiQp9OKVOWoNRDvg84P\n        vjmGHnx/89f6hoampKSkdFwf9HJ2dp5niZuVlaV1Vnb8ovqKjGOHqp1QVbomS6zdLYSHZsz4pN7FTOzh\n        8jg91HX52AssBWMSZ29jlpzpK42ApsWhKmSwh/ETTKze9HCPZwUAYCEocKxZYEROBCA3RPVSR401Kk7Q\n        GcLDi3CnqMpSao7WOCLiQcq/rP7zTWj4dTvqe3Vm+MH9oz//cm/37z9cKSfb6txRfaYiqk5VQIuD5ZGZ\n        Bm8fziv24jmkRYX4lwfYihKn9+YQ6hoqn2FvxAVMAj1AS16oGoK/3k66j6cVAGcHq5wEF1Fc3lJDFen6\n        5NJMv185RW51isbPUNOTEOE9j5/TgUiIBAUp3DkpPsrPLm6bx/ICA51BI4OXE8mnJ7zIzhrNEagJflFq\n        jNYkKyN3S0FCUZYfgqhVuLPyAJjDQE3gx5WpxkiLqXqADcDc2frVWX4yKNWbQaT7yhNzzVV+nFYVgCgw\n        1lkE5QUpkBVpTHJPXRSBF7Rki9y6DM2HuM4HngFygIlN2UCDtufnw664MKqLOtbboguNduhAuRnWYSmU\n        4klHy1JNEN71A/hD24khtDD105ysQHUkKS12HEeTLLthbyB6GgIySMUhMTPSFO8dNajTowUqygzzIBsB\n        IhfX/LYsMUSdTT4EZ/CR4qt2vP4zp368+jjPwKZmlq5K1G9n40g5BamzFkzRC1ARrl6oD0wfdjGj3dlW\n        FTaMx/pORr2+rqZrvJssgYGphPdQMPGyFHoJNQjwTDnBmkhSRuwMNsoi08P96Kzzjakv84OlyJ3LjMiu\n        zQ7I1ljxC7wjVHgtKsjjtaPCBULjSQ2Rq6NF1C+nYkk5edkdIoK8rlsWaZPRviYP8XgTF0t617bacJAo\n        98kYAINnqSf6Er/zgPeGelquofbCrJgEQEjxVoRv/xSUTTkYeqpCn6+IFENbFmmg5jwpsmVL5jMcu7MY\n        htB1abJdB4VKiZlsYQCgty2MDYB9VdpMFOplcRN7RAYA0LjKH5jwnuxbpqrYdixtteyky4xJ2x05V4SV\n        lEF3tZEFwzv9GaEghSsk00sIQSZ2ZZsd+epGAWlmYVCGAxpWVQZnZFIKsuKJbwPg3rl4NCoB9nU5usg3\n        eM4tAMBWX+jSprUBk0oATpfF+Xm50vCc2jCvrKyMJuw6MM7+q6Io3ItfyU/5jk82oY+18E9H1pghsPhv\n        bqWRh49vfqitrW3DUaae9JATJODehQUsCRCi8sypzhgPQP3a0LeqAKZjbE4rA5ldsPuQk4D+h7kpExAv\n        vBfmYRG6BCW/tUQffVXDJJ+dDWTV6xfmZX2hra2l+1e1eic7k6ibHVEsCRCgcDsURKqgQH8rlgRYaAtc\n        qi90/isAWPwZ6c0MWODHwMyLEWADgm2pxEyGALhjq/cGANZDgRAH8Z8u1zNHfu9wHoEA5/XrHhQXH1cx\n        c6bazInhLZswAOBGq/+YBGT5SIzZAFCB+qVz3moDWMDLSGkUJRg8T/GQQSD6IAF+9jTY/U1vqzxNGyhU\n        fp75O5eboaGvw0YGe5JY+f3zlw+GY+Nii5hMpg4+9v9TmQsAOFVnNyYBi8OUka+zLksC5hjRLm1cNu+t\n        ANDExeSqF8+9uzRSkwTLD93bgp+gCbPOHwymjdG3TYyNHb+RlnRjV6MtOdDpw8rx2SAkJMYX6evrG3JW\n        dmAeAOBYtR2iy4u1ggqUJaqPAQAS0FQVBHHAn7yAgoK89umWhT8Vx6qhRHdZAvQfRF9HlQJucbKg6/3g\n        gdNWMR97xuVrW03JN6fmjgzdy2ZVeP7ofzRcXV35uampqbUcbpwqAADIykvtBgBWJzLGAHAxF7+4a63H\n        nyQgNiYosetg9vCyKBWU4PqvnYdSvLEabx8W/Ros+qwY5D/W8BmBmp8Do+dmsx35fYvJyODX0eTg7Vhy\n        qP8E6u6+fD8mJiZVXl5OAQh0sDEOPN3oTkhISmwCAJaESCMPByZLBTxny1zcs9odAHDD4QTX3LlznQ7u\n        KO48UOlEZvlKIdB3NvPWOgJwALMDj2XlCv/RBsGPoKCAsovNzG9ainTJp+0BJCQ60EEtXv10AJ376sTV\n        ZcsKViZFeZW1b5iLaBIS28ANlsSqIjsTJVYg5GohcbG52h+lJft2NtQV3tlaaIFyAyRRrLMoET5HgOXz\n        oRapN5MKO78NM/3hXJYAEHAgJKepQmtal2OO7rR6kPdbHcmrm81J8BRXmhzJe4eDyZ7DieTRhhDUWLPg\n        h5KFvidrF1mijdWprzaURDzMDZJHS6J0huNcpFnWHTq4OSi7w867mvATUhJ8zzHjpR/Ezk8mdrgeJyQt\n        LZnkZCr5Y222Fvqy3BjtKdJDjTkqrOswVSlKZEEozvxwNSk/RA7lBsqO7TDsMhg3toEDpoF5Z0M+QluF\n        MsjLz30Rr+n/3t3du+oXLy8Pn4iIsK6IEP86Iy2hp4luNLQqQQF3BgkV3AxvcRYA8fMlWDvL3m0AADpY\n        dwDBzVyUxTi+WAFurhB3pXel5UMYr4x3bJGoMPc5LSXKc0sd4X5vO0nCb7YQETFHALF32BHvsqOJMKGj\n        zNevrsDXJyzG94SXj6sDM5CB+7hC6IfA1DvTMOqqIGOM4ebhquXh4TrCT+E+jU+TL/FTea7g/0/CM/we\n        0lnIJPX+4+7tnbl8hw8wc3xQv2eXxeE3Dq//d2+JvgM2H4f+VyCACxSyEwnF5/MSOBWGetykNzXgYBXX\n        60QpFH5IklhlbXYbPc7i5nyG5xKGseyO/x935IUPYaiwJp5TDDqMw+HIuDmmBUwGg6HS0XHkNqdbwros\n        FBIatLGz68xjb2/XdZP56sLC/FW3b19/HBUddhiXtsZdbPrH4S8vyMnJRnISbGRk6N/S0nSv4+Sh71JS\n        E9qr1pbdaNm74xRmmlV+w4mWXH5+7tGbt75+8llJwZWMzJSO420H789xmLMQbMy0MA+TxsRGL33+4sdh\n        Ol0GIjLORi0rX3Gz97u7A1zcXLacL/DZvvyly+detLcfgoIpuLaxBAbO+2723OpPS0/C3oBn3H3BiOio\n        vc27drzG44Px7uosXJT7bePmulv4f1aCha/hOPTcvT4kKSXZjP9Vw4WWop8ef4/w/0nTAgAmkH/58vz9\n        VetWPcH3csYRDIcVK8tKuvbva/nN3sFuF6cULFyYXRQbF3X+QtepQUyYJydx2dkZK/0DvLuv3/x2CH8z\n        l/NdbFxkw56WXX/gZ6xd9/TyXHX2XNsb9hwaGuqGt3quDOLkqgHe48slCt/evDqso8s8OC1exdFxrntg\n        UMAJJlOr5kp3Vz8nwbg+wFNZtarLytKs/Ur3hd/xu9lAFNZP6oa6mpNGxgatowCMy/crKsuO4guRSy90\n        nR/U1FRf/1cAbGvaeDItPfGfeIwNjJsIgLOzk8dXFzoGsJpMT32wZn31HkUlxTU4xbe+//2NIU6C8aIC\n        AAAuhyW0tR/53czcdBMQGR0dmW5tbbFbU0u9fCIAtrY2zuERoSewKFuur113vmJt1R22eMO3IAFdF8/3\n        z3dxXtPS8vnBpJTkbgxsMTtIAgBABRISYs4lJMQWYltyR0pKch/+dNKDmX9LLfCRtsSXB3f9nLMw41Zy\n        ctz5DXXrnlVUrR4jGHsG4ZradaCflp4+3nvPd555ycfHO2vL1o2dWH9TlFWVskFcQZ/ZhFRWVexbVlz8\n        OCMj+XxCcuK9mz3fDmJJGjsZAgBaWpvf0GjidTX1q5/m5GZf4wSILQGaWhpnTCxntXVf6+wTFBKc9Ezi\n        32KetRux0QtdXJyP45+gp2qKDIWlgD52T37wXlpaSr55+wbW8TQuklhd/Pqrgeqatd0eXu5wc9QkODRo\n        HACysnSF7Ts3A4Bwr0cNM25xrO3IK3MLs11s/eWwAdbSMtIxN27dGGIoMcYuXnGqAJYKmZKVRfdXlhVf\n        xfNNej/5/w0CnMMd/HLvJezuytjE4R2nHW879Jut7ez98AyfCxhtqF8HhxMsgxUTF33i8tWuAWwDyjBI\n        9NDQ4PS7vddBAuCGyCepqYmLAwL9u4B5NmGRkSF79h3YCyCynuExY0YQqkRYXc5evvLVUzyfGbzX1NQ0\n        AlWUoUtvgf/FxUX9Ll89N2jvYN8wZa4Qrqouzs/bfOjIgTde3h5QhmLdxbO2tppXs371/Z27dvdhwqpX\n        rS491rq/tT80PBh0n0KjiXnPm+94D/+2MjDQtyxbVXrqwJf7iLT0lGOhoUF5zbt3Plm8NL8XH6MZwnzg\n        KpcU5Le37ts1lJgc3+rn57OgoXHjg9b9B4c9vTyqYE4MtE5icuL3tfW1983NTWOWFCze1bJ358CKshXf\n        YdvDAkVZVaUSu85+C0uTwikDAc+rj3sc7oEA9OiOgS+Hg8pU3EENwL2B/w0DfkbHaI26QwhM5o2+h3lA\n        jYJG52Qdd402owljYD2YH8ay11XCvyFocsAdPA2sCR2+Zd0lGJ0f6JhaVeAg9OPPjwh8ROB/A4H/AzoY\n        Ba4QkBKiAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"pbBloodline2.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABF3SURBVHhe7VoHUFRX1I703llABJbekaYgoC4dVFgQEBBQpLkIKqFYAekgKtIEBY1RI7FhjbFE\n        MbZEjV2xptiSoGLBaITdd9/852xY//0z0YDZqPmHO3MH9r3bznfqPed99NFAG0BgAIEBBAYQeDcIiEOT\n        7G3y0FRf0/Adjn03p3oHuyDNSOsQaEbQLKDZ29s7uLi4uEIbgR2aG3Z8ZgpNC5oiNJz7Do7472yBh9eA\n        hgQhkWFhYRMqKioWf7ZuXctX+/cfuXjxyLVrV8/9cPXq1R/w95Ytm7dXV1cvi4uLjff29vZBkBAwBE8G\n        2n9KKvDAyEVnZ+dhlZWlS9rPtX7/+PpGquNyLXVh81Tq9Kas7vbWaeRyayav48wCqvNCJa/rh8+4vMd7\n        aOr38/SV9ss/LFpUWRsUFBSK4CGICCau+++wS0SrIpdQh1HcCwtzi+9d3dx5rW0Ob/OicKo2y4vUZY0h\n        9Rm21LIsZ2pVwRjSPM+DbF80luxeGkwd/TSBe2o9h3e3LZ16ebuacJ8eJI8f3Xu2fHnjagTCwcHBEUH9\n        YNUCiUe9RV0+c2z1tQtfZHORcCS6IMGCKkywJ7NjTEjuZDP+75JkKz4QTbOHURsLXcjean9yfGUkObUq\n        kG7fls69fyyb6vmlluK9vEjOnztzY1JcLMfa2toGVeKDAwGJl4MWFxuRcOPQwp7NS6J6kPC8eE9uRqQd\n        NyvKiGRFmpLksUNImIf2C7abzm+VqVbUimw7qmmGJckIM3yaGmz4oinbgRxu8KFv7Ywiv+zn8PuLm2VU\n        9+NNvBfP7/VwpqbMBuEy+OAAwANNCA2I31WTwCtK8eTOjvPoyYy25c4It6Q444zJeLfBL5jqUifkpSWr\n        QdsidNXli+dFM0lL4UhyfUc0sbc0qJeWkmLJSknMtdSTO7SYY0V+2sqmHx2IpR+2pZInRzn0y5tlhHp5\n        jo6KjJwnLS0tJyKtFc0y7DGs+IZZ/mR6xFDuNLYp/29yoD6JdFOmDTRkD0uIic2AnewlJCSUxcTExG0t\n        jOIKE8xJU44D1XkmhxrtZl+joKCgDu+l+WMGDfJwMFH5cnu5O7m5JYTc3BpJzm1I5P20M5x+cKG5W0lR\n        3kU0JxfBKlbmTIdijv/LjImuL1ODmIQDYp7kr0N8hqr/Ji8jWQtbuKKGCLZCaXF1tp2CKtBS4kN1tWcQ\n        Tw+nWhUVFU1h0cY5irJSU+fGmHV90+RPDtR40lvKPUnbigk9KspKcYMGDfowgqXYQNtL04J0SbKfOkEA\n        oj2UiIuxwiMpCYkCIJopOKggEkRLHhTondE8x5Wszx9OOs/NoLxHOS4EL6fzZ93GueJiYsODXBg/L023\n        IcUJJiR+rMU9eO4FXQIk5f2CMGq4TVYam8nneIKXCp/77OFaT3uJ1xNwHf03Wm8mNCcnJ+fpnLji3VW+\n        1PGmYPL8ZhUZ4To8D17/HwkQFk4xsUHmGsry9SoKsnVAdAz8VgNVkoUx7w8A4JZsnI9eR0qgNp/4RF9N\n        MtFNnlaVl1qBnBcmHrmOkZ2Pj49fUlISZ++uZQfOtUSRn3ZPpbrvNdOjPNwKlZWV3ujegHBF4LrKoEEf\n        yQIASPwgEWjw2y/h7+WROpmlRk8apUgj4dht9JXOwoojBGIviAiB606JiYkpx44dPUU9P0Y/OVvEN24d\n        u8No6uEG2seLVQ4qoP0m9wZES0GXAaqR6++XeITNd7hRG4q+wPBN9tQmkhLiOQKDhzqP4StGcKmpnLQH\n        9289fn63iXf/mznU4yOTaN6dDJr3YBG4thO0tydrIQiJLsYSr2MJgArMf48iL3ww8MOKU7xVaRR7lAAE\n        wd1a/TyMeeWekPsYw7PZ7PEdP1/qfPljDY3RXdeJJJr3sID0PCqnuh9V8qjuk7Sfr89SBoPxRgDeXlb/\n        hZkuzg6R6O8F4o9eQFdNph59uGA7NHp4kdn/5Yq2l/ereD/v45D2z4Ponp+KyIu7jdSq+klXUmOcDn1S\n        4nVplKt1GdgAjQ8uwnsddgHeo2cj8Xzuj9UiORMMCPikJGGXNxgamx0cSv2+h3RfmUX/fr2APDwQTV85\n        Puc3HYZKEaztBpZcX0ZamikrI20OxEv3lVdgEKVA3dT6Ol7k46wM1JrQ6KEHQAAWTHZ9BJuMFg529PT0\n        9PPnpxVwuzbydb772gz6ZftM2tRQp0JWRsYA1F09ISEhCbuSkhKjP4cEYyDxXl2gvengTej6kv01+Le7\n        2nmRv8KB7IQBQNdXt3DaCu7jzynenVK+xW/dkPs9Q1PTU1ZWVm5t87wtPR2N9N3TC+lVNQWHYK5qf0AA\n        6QEhEFfpzxyRjXWz1jmKARByvzTZklpTGfc9LG4tDADagJZFoTt5T5aR7vPpNO9+BSkrKTnNZBo44bW5\n        5+FKquNgLL178WiysdSPB3NH9ueAMjLSCkGew+pgjkJ/5olkrKWB2hq84uL9vmiKGbWjMekW6L+VYHF0\n        gQjAkoqZNd1dW3jdNzLp7jPJ9N49W3+0trIaie5xaojdFxvmO5OKyYYkyot5o78AMBiazJmx7u0wz0Qk\n        RPVnET2GXA0CgImN6plO1O1DFS/lZGU8hPN2yOXY8IBE7tNWinqxnbz4Np5+1nmcGzY+NAdSfcb6enoO\n        GorSDarykq1gQKf2VwWG2xlPqsoK/g3mOffn7CIZa2NmkJkZYUgwq9Mwy53cv1hDmxgZxSkrK7/SSYwD\n        rCzNbG+dLu3i/raW4n0/H/J9X5ML50/cCg4aF6evr88EjPAKLCMhLqbR34P5uRosy40fwYV5Xv2d+4/H\n        W5qbes8IMXuV1vrx1FICKau1YPeGCBKXKA1g3ZUSo3yKf94/ke65NZ88vzyfPL7eTB52fNu1fVvD3uLC\n        9KrmxvnrVZSV7ftzKHk5GYW5U5w6I/3t7sM81/7MFclYTFyEu6t3VaZaUyvzvMmJdUnctrYDP1lYmLuh\n        6AtUofcWyMiMcTiFyYxzLROptuZ4bms5i2AecHGiCVmZbksN0VbNxbpJXw83KcQ1J3+KFfFz0LwGc8z7\n        Ok+k42wMVVswqYGZ3X21oYR6foaeEBGxAG68hgiCsEEEn88YO8Lg6Oq5zmRLGYuqTDSjyuNt+Cq0JN2L\n        aKrI4B2iTwAg91flju5IH29CbIwZu2CffquPSICQlZZk5U+2J62LgnlfNyVTHWdLqZMnvr01zNnZB2OA\n        v8jhKynKSua6mKn9MMVH648ECrjRwkRXrpGeVllfAYgJNM2ZM0aNfw/RUJItgXnv3g0ighj2sux1j2BW\n        Z191ILmxI4XCq259Xe0uKHG5/xUIvaHyYF0NxfKcaFMyZ6IRKUq2I/o6asVSUlJ/S4iVJdN6fUlEVzp7\n        MJnEYjyDkHjCe02NgRT4libZ8HP5eNnh/VpLKN4DOj8vtwESII7a2to6wjZBIHom+urR6EUwiqzJdCN6\n        OmqFfycBRkxtowPNE3+dG2NIUgK1iIOJ6klYz0Yk4vy2iyD6xjoKq/cu9SRPj0yheTfm0NwnLRTFe0aX\n        l5U2ubu7jxQuawmMo8FgldDsSCYfgPUl4ygAoOBNANjZmtmf2jT9lzKOPeHfQoH7wrmHtz2/SOaB6DIS\n        AvSvdx4FAC6l0byrH9O8zjV8Sdi8aeNXwcFB4zEpYgANo0MsndlZGCbNDDfmA4Bh8JsACAsNjLi0K42H\n        Vh/D70Q/XaKnoYjG71XkKRJC/skikLq1yYiyuiMA4X5bCulsr+V1PztGYSZo2bL6VQEBAWOHQTM2NjYZ\n        4eIYPyvqDwB2Lh5L/dkIQo1AbWqST+q5PbM7NpSH8FBd8PKFGWdrXblTcNaA96r7fwUWgGCfwja5c/Gz\n        QHJlYzi/kHF5Wxa341Qu1fXjV7xHnZefbd++dV92dtbcKdHB+RhCoxtEAJztTMug5GXFZvuHLV/2cfP1\n        I5Vde6r9COo7JlvQ4id4M8hwI5k7YPiihesM/4RxIp+L6WvWUMbpHQtZ5HBjED8+aF0SwcXg5+innJ5L\n        W+dxrx0t5R1cmcKtTHfkA7B+tj25tDOdd+NYHjm7jk3jBakozojvIpHr2Nn2MrSRlsJpID4eDv0q6yRy\n        AkS0oKqWmmJtjIfmi5oMR4J3hU/zWdTakmBqVWEIF8vkAuJRBbCXpVjwXeL0YB1+fMDPNfT+Heeo9Dtc\n        mlpR7N+bz+8vMKCfUsAtL0MNuX1RLqokc5wWgcoOlMjNCVpyTKSgL58+3oBkhOvzRVxQXUIXN8FFnva0\n        kPtdV1nqBFyUcmB/yw9O5/sCCuoqpK9YcpJiyywHy10NcGJQ7GGqJDlAC3y5Nt+fY3Y52FGejHNQJCNM\n        5LCKfENWUnwLAMiBPew+WH3vCwCCMZC+wk9bdKC7SUuKp0lJiFXISIh9ri4vvVtBSmyrtIRYFTzLgPch\n        0B2gM/Ca3J89/ktj+XXS3tBXBQ6ugv//XST4XyJw4KwDCAwgMIDAfxcBuL6OaKiv3rT20+a9ULezFVAS\n        GOAXv7yxbvvsnMxGP1/vdHyPPXx8yBxwWa9KW+ZmZqzqqkUt+G7m9LSlmhoarnnz59Tg7+jICfPDQtnZ\n        grmjR3ngx1NKurq6tvl58xrx+fgQ9izBfOH9x44dM2VlU8MO3D876+Pqz1vW7XN3c5smCJDgsulQVlq8\n        6pNVTTtZozxSFy9auGbXrh2Hy8tK1qirq3n2OZDCgXZ2tmntF8882bZl42UJCXGzXhCkvL08S50cHerh\n        t15lRdmm9WtXY1IyELpwXV/c2dlxFs6HGuAMSUkJxvKG+t36Q3TLYNxw6FqbN7R8V1ZcgAkNPJgU7gmJ\n        E+uqxQvxpucLH0RO/d/9JYz+vD8Abn329In7OMbExHgSzscOt8ihdbU138H4EebmZnF3bt/uMmQalPTG\n        IH2XyiFDdFlLq5Z8hxt8snLFSVicz2EWa3SchbnZbAxSSooLmuAdVmZe1QQFO1haWsThXPgdOn58SK6m\n        pmYS/G8k4AJyujB/7gl4xhQ+FUjB1zjOw8P9jftjYNVQV71/147WH0+dOPYr1BvZgrWLCgvbcA1PFssH\n        AWBoqk/vd4yBAIwc6VE/zMkhBwnJy527EzZQRwDMzUz5GVwhAF7VBP8MQFxszMbp6Wk74LmFMKGvAyAl\n        OXkbjDNAAP5u/4qyom2KCgqhKKVHvz5wB7g/CvcoLCjYj8D6+voG9AKQ9tYAoH76eHvlIwipnJSNdnY2\n        nL8CYMyYMcHDnJ3mDB1qOw3mSCFQOCciLKQV/waNG1OFoi4A4XUAwEfR60G6VAUAvGl/BADeW0PKfRgC\n        cHD/nu/hy5WhIgUAQ1Q8OHzCUoKE7Pty142/AgA/BcLnxkZGmSh+kZETBCoQOXdWzkac6+RonymsAg11\n        Sy/iWAEoeNUdNcpjCaTTVQQA/Hn/PV9sbxfsv7RqEQLAlyzk/slvj9/du3vXtV4V+GcSYGZmGh4/KW4b\n        Vrd6DygVFzNxBRICVr4IRWpFY+3mHVu33Ib3eHnBhoUN7OJJSYnTcSyk/yaCvqqvam78BnVVb8gQfhrb\n        38836/KFM8+sLC3TBKBA7jAHrHUY2pcxgQHBcbHRW1+3P4yR/Wr/3suwtpMAQPA2fu2XLz4oKylE48qM\n        iAiPQhVgGujP7pcKGBsbmWZnZTYW5M07FjRu7DxYTFDlkUFuGhoa5oJLil+Ql8s3ZDHR0cvg8xYtwUGc\n        HB09crI/bsF36dM4W0FPbeBDBn0fL8/GwgW5R4H4dDi4pqODfcHC8tJv6qqXHEzlTP3EwEAfr7+Wamqq\n        5m/a387WOj8lOamkcEHe4WmpnPVQfrTHvRFIc3Pz2MyM9P22tjZhuEZpcdHxnMyMPVCj8O2XG4T1kCAm\n        dF3o8gLiUNp6xRaf4Tscg1+EviqFoQRAH9z7zgD+8r/86L0Sa/c+x48ecRz+RjFGVYCPIP9wZ33YXwXG\n        4Nqv1u89I87FWiFKroAGHKPZZwCEiB34dwCBAQQGEPh/jcD/AIDGfoxQnAqOAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"ilAncestry.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>126, 17</value>\n  </metadata>\n  <data name=\"ilAncestry.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD2\n        +QAAAk1TRnQBSQFMAgEBJAEAASgBAAEoAQABMAEAATABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo\n        AwABwAMAAeABAQIAAQEBAAEIBgABaAEBFwABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHA\n        AdwBwAEAAfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANC\n        AQADOQEAAYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/\n        ATMDAAFmAwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJm\n        AgABZgGZAgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEz\n        AgABzAFmAgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEA\n        AWYBAAEzAQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/\n        AQABMwFmAgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEA\n        ATMBmQFmAQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEA\n        ATMCzAEAATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEA\n        ATMBAAFmAQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEz\n        AZkBAAFmATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEA\n        AWYBmQFmAQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFm\n        AcwB/wEAAWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEz\n        AZkBAAGZAQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIA\n        AZkBZgEzAQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHM\n        AQACmQH/AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZ\n        Af8BMwEAAZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEA\n        AZkBAAHMAQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFm\n        AgABzAFmATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFm\n        AQABzAKZAQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/\n        AgABzAH/ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEA\n        AZkBAAHMATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEz\n        AQABzAJmAQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEA\n        Af8BmQHMAQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEA\n        Av8BMwEAAcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEA\n        Av8BZgEAASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4\n        AQAB8AH7Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA///AP8A/wD/AP8A\n        /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A\n        /wD/ACYAAf+8AAL/AQAC9AH/ZAAB/wH0Af9QAAT/AvMBvAEcAe8B8QH/YAAC/wHyAe0B8QH/TwAC/wHy\n        AfMC9AHxAZMB7QGSAfAB9AT/WgAB/wHzAfQBBwFEAbwC/1AAAfcB8AEHAfIB9AG8ARwB6wFtAZIC8gHv\n        AfEB/wMAAv9TAAH/AfIBBwHvAQcBbgG8AvEB9AT/SwAB7QHzAf8B8wG8AQcC7AHtAe8B7QH3Ae8B9wEH\n        AfIB8wHyArwB8wL/TQAC/wL0AfAB7wEHAe8BvAHxAfABBwHwAfID8AHyAfQB/xkAAv8BAA//HQAB7QHy\n        A/8B8AFuAesB7wH0AfEBBwH3AewB7QGSAe8DkgHvAfEB8wH/HAAR/x8AAf8B8QEHAe8C7AEHAbwB8AHy\n        AbwBBwLwBAcB8QH/FgAE/wH0Av8N9Ab/GAAB7AHxAf8BAAH/AfABbgHsAe0BvAH3AvMB7wLsAZIB9wPv\n        AgcB8wH/GQAC/wP0BfMG9Ab/HAAB/wHyAQcB7AFLARMB7AIHAusGBwHxAfIB/xQAA/8C9AfzAfIB8AIH\n        AfMB8gHxAvIB8QX0B/8SAAHsAbwB/wEAAf8BBwFuAe0B8AH0AW4B7wHyAfMB8AEHA5IB7wMHAfAB9AT/\n        EwAC/wH0AfMB8QHwAbwBBwHvAZMB7wEHAbwB8AHxAfIC8wX0Af8ZAAP/AQAB/wHzAewBcwFuAUoB7QHs\n        AUsBEwXvAbwC8gH0AQAE/w4AAv8B9AHzAfABBwG8AfEBBwLvAQcB7wHtA+wB7QHvBOsB8ALyAvMF9AP/\n        EQAB7AHwAf8BAAH/Ae8C7AHzAQAB7AHvAfEB8AG8AQcC8AQHAbwB8AH0Av8C9AH/EQAC/wHzAfABBwFz\n        AW4BFAFEAUMBIgFDARUBEgHrAewB7QHvAgcBvAEHAbwB8gH0GQAB8wHwAfMC9AG8AXMBwwGZAW4BkgHs\n        AXQBSgHtAW4BSwJuAe8B8AG8AfMC/wH0AfMB9AH/DQAB/wH0AfMB7wIVAesBkgHsARMB6gEVAeoCFALq\n        AfcB7AHrARIB6gHrAewBBwHvARQBBwHyBPMD9AL/DwABbgG8Af8BAAH0ARwC7AHzAfABbgHxAf8B8wHv\n        AUQBBwW8AfAB8QHyAfMB/wH0AfMB9AH/DwAC/wH0AfABbgkOAwsDEQFEAfcB8gH0Av8ZAAHzAQcB7wHq\n        AewB9wEcAsMBmQHvAQcBcwFEAXMBdAFKAREBFQFuAbwB8AHyAfQB/wH0AfIB8wH/DQAB8wG8Ae8B7AFt\n        AUMBEgFtAesB7AHrAeoB6wGSAusB9wHvAQcC7wHsAe0B6wFtARQBQwHqAQcBvAHvAQcB8QPzAvQD/wwA\n        AW0BvAH/AQAB9AHtAusB7QHrAZIB9AEAAf8B8AETAfcBvAHzAfQC8wHyAvMB8gLzA/QC/w0AAf8B9AHw\n        AW4GDgEQAUsBdAQcAgcBvAHxAvMB9AL/GQAB9AG8AW4DSwFEA24B9wEcAW4BSwFKAXQBSgJEAW4BBwHy\n        AfQC/wH0AvMB9AH/CwAB8QHtARIBFQFtAesBEgGSAuwBbQESAewB9wMHAbwBBwHwAQcC7wIHAe8B9wHr\n        AuwBFAJtAewBvALyAvMB9AL/DAABbgG8AgAB8wHtA+sBbQHsAe8B8AHvAewBFAHvAvEB8gH0BP8B9ALz\n        AvQD/w0AAf8B9AG8AREGDgFLAXQCkwSZAQcCvAHyAfMB9Af/FAAB/wHxARwBGgEHAUsBRAHvAfEB7QOT\n        AUsBbgFEARABQwFEAW4BBwH0A/8B9ALzAfQB/woAAfIB6gESAeoB9wHvAQcBvAHwAgcBvAEHAfcB7wG8\n        AfECvAEHBu8BBwG8Ae8BBwG8AewBFAHrAe8B6wHwAvEB8gHzAfQB/wwAAewB8AIAAfIBHALsAm0BbgES\n        AUMBEQFKARQB8QHyAvAB8QHyAfMB9AEAAv8E9AH/DgAB/wH0AfABFQUOAQ8BSwJ0AZMCdAFzAm4BdAGT\n        AQcB8gH0Bf8B9AP/EwAB8wH2ARsBBwFLAe8B8QFvApQCmQREAUMBRAHvAfEB8wH/AgAB/wPzAfQJAAH/\n        AfEC6gHvAfQB8wHyAvMB8gHxA/ABvAPwAQcBkgHtAuwC7QL3Au8BBwG8AQcBkgLsAesB9wG8AfEC8gHz\n        Af8LAAH/AW0BvAIAAfIBBwEcAewC6wHqARMBQwFEAUoB8QH/AfIBvAHyAfMC8gHxAfMD9AT/DAAD/wH0\n        AfEBkwFEBg4EEQEQBA4BEAESAbwD9ALzAfEB8gHzAvQC/xEAAf8BvAGTAe0B6wGSAXQBdQKaApkBRQJE\n        AUUB7QHvAbwB8QHyBPQB8wL0Af8KAAH0AuwBBwH3AvEBvAEHAbwE8gHxAfIB8AHtAeoBFQJDAeoBbQHr\n        Ae0BkgTvAwcB7wHtAewB9wHxAvMB9AH/CwAB/wHqAbwCAAHyAe8D7AH3ARMBFAFDAUQBbQHvAfIB/wHw\n        AbwB8wL0AfMB8QLyAvMB9AH/DAAC/wLzAfIB8QG8AZMBbgFEAQ8NDgHtAbwB8gHzAfIB8AG8Ae8BbQHs\n        AQcB8wL/DwAB/wIAAfQBvAHxAfIB7wEWAXUBlAGaApkBRQNEAe0BcwHvA/IC8wP0Av8LAAHyAewB6gES\n        Ae0BFAERAUMBbQHsAQcB7APqARUBEQEPBQ4BFQHrAZIF7wEHAfABvAHtAW0B6gHwA/QB/wwAAeoBBwIA\n        AfEBHAGTARwBbgEcARIBFQFDAUoB7wHsAe8B/wHxAfAB9AH/AfQB/wH0A/MC9AL/CwAC/wHyAewB7wEH\n        ArwBBwKTCEsBRAMOAUsBkwG8A/ABvAEHAZMBRAEOARMB8AH0Af8PAAHzAv8BBwFuAewB/wHwAXQDdQHD\n        ARoBbgNEARQBRAGSAfIB8wLwAvQD/w0AAfQB8AEHAm0BBwG8AZIBEwMVAUMFEQIQAg8BDgEVAewB9wEH\n        Ae0C7wG8AQcB7wHtAe8B7AHyBP8MAAHqAbwBAAH/AfEBcwEcAZMBHAHtAeoBQwFEAW4B7AFuAfQB/wLw\n        AfQB8wj0BP8IAAP/AfQB7wFDARUB7AHvAgcDkwF0BHkBdAEiAg4BSgJ0BW4BSgFEAg4BDwG8AfQB/w0A\n        Af8B8QG8Af8B9AGUAUsBRAH0AfABdAF1AZQBGwL2Ab0BdAFLAUUCRAHsAfEB8gHvARwB8wX/DQAB/wH0\n        AfAB7wFtARQB6wG8AfcB7AFDARUCQwERAkMDEQEQAg8BFQHsAesBFAFtAewBvAGSAfcB7AHrAQcB8gP/\n        DQABbgG8AQAB/wHwAW4B6gEcAXQBSgFtAUMBSgFzAW4B8gEAAfQBvAHxAf8B8QHyAv8C9Af/BgAD/wL0\n        AfMBvAEcAUoBbgFzARwCkwN0BHkBSwIOAUQCdAFEAg4BIgUOARAB7AHxAfQB/w0AAfQBHAEHAf8B8wGU\n        AUsBRAH0AfMBkwEaA/YBGgGaAZMBmgFvAkQB7QHzAfEBHAF0AfEG/w4AAf8B8wG8Ae8B8AH0AfIB8AHs\n        AREBQwYVAxECEAHqAewBFQLqAW0B7wHsAm0BvAH0EAABbgG8AgABBwFKAUQBbgF0AW4BSgETAXQBkwEH\n        AgAB8wEHAfEB/wHwAfMCAAHzAf8BAAL/CgAC/wH0AfMB8gHwAbwBkwFvAW4BSwJEAUMDIgMRAUQDDgFE\n        AksCDgFLAW8BbgFKAUQBSwFzAZMB8AH0Av8NAAHxAW4BHAHyAfMBbwFLAW4B/wG8AQcEGgGaAZQCkwFv\n        AUQBSwEcAfMBvAF0AXUBBwH0A/8UAAH/AfQB8wHxAe0CQwETBBIBEwIVAxEBEwHtARIBQwHsAfEB8wEH\n        AfcB8AHzEQABSgG8AgABHAEVAUQBSgFuAXMBSwFtAW4BmQG8AQAB/wHzAbwD8AH0Av8B8AH0DAAC/wHx\n        AQcB7wHtAW4BHAFEFA4BDwFLAW8BdAOTAQcBvAHyAfQC/w0AAbwBGgGTAbwB8wGTAZoBkwHwAW4BSgFu\n        ARwFkwFuAUsBbwF0AQcB8gK8AZoBmQH0FwAB/wLzAfIB7AEVARIB6gHrAuwB6wHqARMBFAEVAhEBEwHv\n        AQcB7wG8AvQB/wH0Af8SAAFKAQcCAAEcAkQBSgFLAW4BSwFuAUoBmQHwAQAB/wHyA7wD8AK8AfQMAAH/\n        AfQBBwESARABDgFEAW4GDgEiAhUBSgNLBEoBQwEPBA4BFQFuAZMBcwHtAQcBvAHzAfQC/w0AAe8BvAGT\n        AbwB9AKTAQcB7QJLAkQBbQFuARwB7QHvAewBbgF0AbwB8gH0AfMBvAGaARoB9A4AAfIBBwG8AfMC9AH/\n        AfQBvAEHAfcB7wHwAewBFAHqAewB9wIHAfcB6wESARQCFQERARMBvAHzAfQE/xQAAUoBvAIAARwERAJK\n        AW4BkgEHAZkC/wHzAfACvAIHAe8BBwHzDgAB/wH0AfEB7wESARwBcwEPAw4BSgF0AXoDmgN0AXMCmgJ6\n        AZkBSgQOAUQBkwEVAg4B6gHvAfEC/w0AAbwBdAGTAQcB9AP/AewCbghEAe0B8wL0AfMB7QJKARwB9A0A\n        AfQBBwHvA/cBEgGSAesCkgLsAQcBbQETAW0B7AEHAvIB7wHsAW0BEgEUARUBQwHqAfAZAAH/AW4BBwL/\n        AbwBSgFDAUQDSwHsAf8B8wGZAQcB/wHzA/ABvAIHAbwB8gH/DQAC/wH0AfMB8gHwAbwBHAFDAg4BbgJ0\n        AXoBeQFKBA4BQwF5AnoBmgFSAg4BAAEOAW4BHAESAesB7QEcAQcB8AH0Af8NAAHzAXQBbgEcAf8CAAH/\n        AW0BRAEjASIBQwMiARABIgERAW0B8QH/AQAB/wEHAksBHAHyDQAB8gHvAfEB8AIHAW0BEgHsAfMB8gHv\n        AfQB8QH3AeoB7AHtAQcB8QH0AbwB7QHrARIBEwEVARQB7AHyGQAB8wFLAW4B8wEAAfEB7AFDAUQBSgFL\n        AW4BvAEAAfMBHAHsAf8B8gK8AfABvAIHAvAB9A0ABP8C9AHzAfAB7wFzAUQBEQFzAXQBmgF0ASIEDgFD\n        AXkBmgKZAUoCDgFDAW4BkwK8AfEB8gHzAfQD/w0AAfMBcwFuARwB/wIAAfQFRAEVAUQBFQFDAiIBEQHw\n        Af8CAAHwAXMBFQEcAfINAAHzAfcB7wL/AfQC7AEHAbwB8wMAAfAB7AHrAe0B7wG8AfABBwHtAesBEgET\n        ARUBEwGSAfQZAAHyAUsCRAHzAfQBHAFEARUCRAFuAfIBAAHzAhwB/wHxBLwBBwG8AQcB8gH/EQAD/wH0\n        AfMCvAHvAesBSgFzAXQBIgMOAUoBdAGaAXQBbgFKAQ4BEQFuAZMBvAHyAfMD9AP/DwAB8AFzAW4BRAHt\n        Af8BAAHyASIBbghEARUBIgHxAgAB/wG8AUQBSgGTAfQNAAH/AfAC7wEHAe8BkgHxAQAB/wMAAf8B8wHv\n        AuwB7QP3AewBbQESAhMB7AHxGQAB/wG8AkoBcwEVAhwBcwFEARUBRAFKAfIBAAHxAW4BvAH/AfABBwO8\n        AQcBvAHxAf8UAAL/AfQB8wHyAfABvAEHAZkBdAFKAw4BIgJ0AXMCHAIHAbwB8AHzAfQG/xAAAQcBdAFL\n        AUQCSgG8Ae8BbgFLAkQBQwIiAUMBFQJEAUMBvAHwAe8B7AJEAUsBBwH/DgAB/wP0AfMB9AH/BgAB/wHy\n        Ae8B7AHrAewB7QHsAW0B6gISAesBBwH0GQAB/wEcAUoB7AGZAXMBRAFuAXQBSwFEARABRAHxAQABkgFK\n        Av8BvAMHAbwBBwG8AfIVAAP/AvQB8gHwAbwBmQFEAksBDwIOAUQBcwGTAQcBvAHwAfEB8wL0A/8UAAHy\n        ARwBbgFzAnQBbgFLAXQBSwJKAUQCDwEiBEQBEgNEAUoBSwFzAfAB/xwAAf8B8gHvAewCbQISARQB6gHt\n        AQcB9AH/GQAB9AEcAUoBBwHwAXQBRAFLAW4BdAFKARABQwG8AfEBSgFtAv8BvAQHA7wB/xUAA/8C9AHy\n        AbwBbgIPAXQBbgEQAg4BDwFzAZkBvAHxA/QC/xYAAf8B8wEHAZkBmgF6AXQBSwF0Am4BSwFEAw8BQwFK\n        AkQBFQFEAksBdAGaAQcB/x4AAf8B9AG8Ae0B7ALrAewBBwHyAf8bAAH0AW4BSgG8Af8BvAFzAW4CSwFz\n        AUQBFQHsAeoBSgGSAv8B8QQHAfAB/wG8AfIB/xQABP8B9AHyAQcBEwEOAUoBkwF0AW4BDwMOAewB8AHz\n        AfQE/xcAAf8B9AHxAbwBGgGZAZoDdAFLAiIBDwELARACRAFzAW4BSwGZAZoBmQG8AfQB/yAAAf8B8wHx\n        A/AB9AH/HAAB8gFuARIBvAH/AfMBcwFuAUoBFQFLAXMCRAIRAZIB8gH/AfMB7wMHAfMB/wHyAfAB/xYA\n        Av8B9AHxAe8BDwEUARwBmQGTAXQBRAMOAW0B8AH0Bf8ZAAH/AfMB8AGZARoBdAGZAZoBdAMiAQsBIgFE\n        AUoBdAEaAXQBmQEHAfIB8AH/RQAB9AEcAXMBvAEAAfMBmQF0AhUBRAGaAZkBbgFDARUB9wEHAfAB8gEH\n        Au8BBwHzAQAB8AHyAf8WAAL/AfQB8QHsAQ4BHAKZAZMBcwELAw4B7QHxAfQD/x4AAfABdAFLAZkBdAFL\n        AiIDCwFEApoBwwF0ARwBSgLtAf9FAAHzAXQBSgHwAQAB/wHyAbwCSgFEAUoBGgEbApkBBwHwAQcCvAEH\n        Au8B8wH/AQcB9BcAAv8B9AHwAW0BHAEHAZMBcwFLARACDgERAXMBvAHzA/8fAAHzAQcB7wGZAXQBbgNL\n        AUQBCwFLAXkBdAGZARwBvAEcAW4BvEYAAfIBBwFuAfADAAHyAUsBSgFEASIB8wH0AfMBBwHwAf8B8AQH\n        Ae8C8QEHAfQXAAL/AfQBvAHvAbwB7wFKASIBDgEPAUMBbgGTAfAB8wH0Av8hAAH/AfQB8wHwAQcBdAJv\n        AW4CRAJKAW4B7QHvAewB6wHsAbwB9EQAAf8B8AGZARoDAAEHAkoBRAFtAfQBAAH/AbwB8QEAAfQBvAMH\n        Ae8BBwHvAfAYAAP/AfMB8gHxARwCDgFLARwBBwG8AfIB8wP/JQAB8gGTBHQBbwNEAUoBRAFKA0QBSgFE\n        AfJEAAH/AeoBBwH/AQAB/wHtARwBSgFEAXQB9AEAAfQBvAHxAQAB9AG8AQcB7wEHAbwCBwHyGQAD/wH0\n        AfMB7wEQAREBkwEHAfAB8wH0A/8lAAH/AfABkwJ0AcMBmQFvAkoBbQZLAW4B8AH/RQAB6gG8AgAB9AHs\n        AkQBcwGZAfQBAAH0AbwB8QEAAf8B9AG8AQcB7wHyAvAB8hsAAv8B9AHwAewBIgHsAfAB8wH0A/8mAAH/\n        AfABdAFLAXQBwwFuAUsCSgFzAfAB8QEHAnMBvAH0Af9GAAFEAe8CAAH/AQcDGgGZAf8BAAH0AvACAAH/\n        AbwBBwHvAfMfAAH/AfQB8wHyAQcBbQHwAfQC/ygAAf8BvAFLAW4BdAHDAZkBbgFEAewB/04AAUoBvAMA\n        AfQBGgHxARoB8AMAAfQB8AH/AQAB9AMHAfMgAAL/AfQB8wHxAfIC/ykAAf8BvANEA0MBSwHzTwABbgG8\n        BAAB/wH0AfMB/wMAAfQB8QIAAfMDBwH0IQAD/wL0Av8pAAH/AfQB7wF0AZkCdAFuAe9PAAHyARwB8wsA\n        Af8B8QIAAf8B8AK8Af8kAAL/LAAB/wG8AXMDmgEcAfMB/00AAf8BBwG8DAAB/wHxAwAB/wHzAfRTAAH/\n        AfQBHAGTARsBBwHyTwAB/wHzAf8MAAH0AfNaAAH/AfQB8wH0AfYB/10AAf8B8gH/vQAC//8A/wD+AAT/\n        uwAD/wH0Av+IAAn/KAAD/wH0ARQD/4cADf8kAAP/Ae8BRAH0A/8VAAH/FQAE/wwAAv9GAAX/AvMB9AHz\n        Cv8hAAL/AfMB7AFLAe8B9AP/FAAB/xAAC/9QAAX/AfQB8wHwAewBvAHxAfIB8wL0Cv8aAAX/AfABEwFz\n        AXQB8wj/FQAc/0kABP8B9AHzAfIB8AH3AUQBSgGSAQcB8AHxAfIB8wL0CP8YAAT/AvQB7wFKARwBcwEH\n        AfIB9Aj/EgAN/wH0BPMB8QHyAfMB9A3/QgAE/wH0AfMB8AEHAe8B7AFKAUwBRAHrAe8BvAHwAfEB8gHz\n        AvQH/xYABP8B9AHyAfABFAFzAnkBBwHwAfIB8wP0Bv8PAA3/AfMB8gHwArwB7AEPAUMB8AHyAfMB9Az/\n        QAAD/wH0AfIB8AHvAZIB6wESARUBSwJSAkoBkgG8AfAB8gHzBfQG/xIAA/8B9AHzAfIB8AG8AQcBSgEa\n        ARwBmQFzAgcC8AHxAfIC8wH0Bv8KAAX/AvQC8wHyBPMB8gG8AfcB7AHrAW0BEQFKAUMBEgEHAfAC8wT0\n        C/87AAP/AfQB8gEHAfcBEgFDAUoBUQVSAVEBSgHsAbwC8gHzBvQF/xEAAv8B9AHyAfEC7wHsAesBbQG8\n        Ae0BbgFtAusB7wO8AvAB8QHzAfQE/woAA/8C9AHzAfEEBwO8AQcB7QESARQBEQEPAUoBHAFKAUMB6wHv\n        AQcB8ATyA/MC9Af/FwAC/yIAAv8B8gEHAewBQwFLBFgEWQF6AZoBGgG8AfEC8gHzAvQD8wL0BP8PAAL/\n        AfQB8gEHAe8B6wJDARABmQK8AeoBmQFEAhABbQHwAfEEvAHxAfMB9AT/CAAD/wHxAe8BBwGSARIBDgET\n        AesC7wHtAhAB7QGZAUoBFQFDARwBRAFDARMB7QHvBPcCBwO8AfIB8wH0Bf8WAAL/AfIXAAH/CQAC/wH0\n        AbwB6wFKAXkCmgIaAXQBWAF6AZoCGgK8AfED8wLxAvQB8wPyAfQE/w0AAv8B9AHzAfAB7AEUAUoBSwJ0\n        AZkB8AHyAfcBHAF5AXQBSwFEARUB7QLxAfACvAHwAfIB9AT/BwAB9AK8Ae0BFQFDARQBEwFKARUBEQEP\n        ARMBFQFDARUBDwEVAXMBSwEPAhEBEAEPARQB6wHsAesB7QHsApIC9wIHAfAB8gHzAfQD/wQABP8OAAH/\n        AfMB8QL/DwAD/wMAAf8JAAH/AfQB8wHtAXMBmQIbAfAC8QFKAZkBGgHwBAcB8AG8AfAB8QLvAfEB9AHz\n        AfIC8AHyAfQD/w0AAv8B8wHwAesBFAFLApkCGgEHAewB8gHrAe8BvAGZAXkBUgFLARUBbQG8AfIB8QHw\n        AbwB8AHyAfMD/wcAAfEB6gFKAW0BEgHsAUQBFQHqAW0BSwFKAUQBEQIVAUMBDgFDAUQBEQMPAUoB7QH3\n        Ae8CHAFzAUoBFAHrAvcC7wG8AfEB8wP/BAAB/wH0BP8CAAP/BwAB/wHyAQcB9AP/CAAG/wHzAfQB/wIA\n        Af8JAAH/AfQBBwHsARoBGwHzAbwB8AHyAfEBUgHzAgcC7wIHAbwCBwQcAfMB9AHyAfACvAHyAfQD/w0A\n        Af8B8gHrARUBeQEaAfMB8gG8AfABmQFuAewBbQG8AvAB7wGZAXQBUgFEARIB8QH0AfMB8QG8AfAB8QH0\n        A/8GAAHzARwBSgEVAUMBFAFzAXQBRAEVAeoBRAJRARABDwFDARAEDgEVAfIC8wEbAhoBmQF5AlgBRAES\n        Ae0C9wEHAfAB8gH0Av8EAALyC/8CAAT/AfABBwP0Av8DAAn/AfIBvAH0Av8BAAH/CAAC/wHxAe8BBwHw\n        AfIBBwG8AvMB8gEHAfEBBwHvAfcB7wG8AfADvAHvAxwBcwLzAfICvAHwAfME/woAA/8B7wFKARoBGwHw\n        AbwC8gHxARwBmQFzARoDBwG8AQcBHAJSAUoB6wHyAfQB8wHxAbwB8AHyAfQD/wQAAf8B8wHsAUoBSwJK\n        AUMBEgFzAXQBSgFEAUoCSwFEAREDDwFDAewB8gHzARsBmQEcBVECSwFEARUB7QLvAfAB8gH0Av8EAAH/\n        AfcB8wH/AfQB/wH0AfID9Aj/AQcB8AHyAfMB8gHzAfQG/wHzAfIC9AH/AfQBkgHxAvQB/wEAAf8IAAH/\n        AfQBvAIHAbwB9wEHAfEB9AH/AfMB8gHxAfABBwH3AQcB8AHxAfIB8QG8AQcB9wNzAQcB9AHyAfACvAHy\n        AfQD/woAAf8B9AHwAUoBHAH0AfAB7wHwAvMB8gG8AZkBGwG8Au8B9wHvAQcB9wFzAlIBSgHsAfMB9AHz\n        AfEBvAHwAfMD/wQAAf8BBwEUAUMBRAFKAXQBSwFEAUMBSgFuAUQBFQNDAREBDwEOAeoBBwHzARoBdAFR\n        AUsESgZEAW0B7wEHAfAB8gH0Av8EAAH/AbwB7wL/AfQB8wHvAfMK9AIHAfIB8QHwAfEB8wP0A/MBkgHw\n        AvMB9AG8Ae8B8gHzAfQB/wEAAv8HAAH/AfQB8AK8AgcB7wHwAfMB/wL0AfMB8AMHAfAD8gHwArwBHAJz\n        AXQB8wH0AfICvAHxAfQD/wkAAv8B8wEVAW4BGwH0Au8B8QHzAfQB8gHxAbwB8gIHAfcBkgHsAu8B9wFL\n        AlIBRAG8AvQB8wHwAbwB8gH0A/8DAAH/Ae8CRAEVAREBQwFzAXkB7AFKARUBDgEQAQ8CDgEPAUMB6gHz\n        ARsBHANKAVEEWAFKARUCEAFDARUBRAHtAbwB8QHyAfQC/wUAAf8B7AHyA/8C7wPzAfAB8QLzAfIC8wLv\n        AfEBvAEHAbwB8QHyAQcC8gHxAQcB9wPyAfEB7wHyAvMB9AX/BwAB9AHyAfEC8AHvArwB8gLzAbwB7ANK\n        AewBBwHwAvEC8AHxAbwCcwFMAZkB8wHxAvAB8QH0A/8IAAL/AfQBBwEVAZoB9AG8AQcBvAHxAfMB9AHz\n        AvECvAHvAfcC7wH3A+8BSwFSAUsBcwHzAfQB8wHxAfAB8gH0A/8EAAHzAQcB7AFKAUQBQwEVARMB6wEU\n        ARABFQFRAUoBEAIPAeoB8AEaAXkBUgFRB1gBUQFLAUoBEQEQAUMB6wHvAbwB8QHzAfQC/wYAAfAB9wP/\n        AfMB7AHyAvMBvAGSAfIC8QHyAfAB7ALvAgcBvAHxAu0C8AG8Ae0BvAHyAvEB7wEHAvIB8wH0Bf8HAAH/\n        AvQC8gHwArwC8QH3AW4BdAJ5AVIBUQFLAfcB8AHxAvIC8wFzAkwBHAHyAfEB8AHxAfIB9AP/CAAC/wHz\n        AesBUQEaAfAB8gHxAQcB7QG8AfMB9AHzAvIB8QHwAgcB9wEUAfcCBwHtAUsBUgFLAfEC9AHyAfAB8gH0\n        A/8EAAH/AfQB8wHvAewB6gFEAkoBRAFKAhwBUQFEAQ8BbQHyApkBGgdYAVEBWAF5AlEBRAERARMBHAEH\n        AfAB8QHzAfQC/wYAAf8B9wG8AQAC/wLvAvQB8QHtAbwB8QLwAZIB6wEHAesB7wEHAfABvAESAQcC8QLv\n        AfEB8gHxAQcB7wHwA/MB9AH/AQAD/wYAA/8D9AHyAfEB8AEHAfcBSwGaARoCGwGZAXkBUgFLAQcB8QHz\n        AvQB/wHvAkwBUgHxA/IB8wL0Av8IAAH/AfQB8AEUAVkBGwHwAfMBBwISAesB8QLzAfQD8QG8AQcBbQER\n        AUMBkgEHAe8BSwFYAVIBBwH0AfMC8gHzAfQD/wUAAv8B9AHzAe8BcwJKAUQBHAEaAUoBFQFDARIB8AHv\n        ArwBeQdYAVEBWAGZAVECSgFEAesB7wHwAfEB8gHzAfQC/wcAAfIB7AHyAgAB/wHsAfIB/wHzAQcB9wHw\n        AfEB7wFtAfcB7wHrAewC8AHtAbwC8gHxAesBvALyAfAB6gHwAfQC8wH0Av8BAAP/BgAH/wHzAfEBvAHs\n        AZkBGwG8Ae8B8AEHARwBeQFSARwB9AT/AfABSwFMAVIBvAHxA/MB9AP/BwAC/wH0Ae8BSgFZARoB8gH0\n        AfEB8AHyAQcB7wHxAQcB6wEVARMB9wEHAewB6gG8AZkB7wG8AQcBbQJSARwC8wLyAfQE/wYAA/8B9AHy\n        AbwBHAFKAXMBHAFEAhEB7wK8AfABmQhYAVEBUgEaAVEDSgFtAQcC8gLzAfQC/wcAAf8B7wFtAfMB/wEA\n        AQcBkgH0Af8B8wHvAbwB8QHsAe8CvAGSAesBvAEHAfcB8gHzAfEB7AH3AfIB8wHxAewB8AHzAf8C9AL/\n        AgAD/wYAAf8B9AX/AfQB8gHwAXMBGgHzAewBEgEUAeoB6wFRAVgBeQH0BP8B8QEVAUwBUgG8AfIB8wL0\n        BP8HAAL/AfQB7AFLAVgBGgHzAfQB/wH0AfMB8gEHAeoBFQFKAksBFQEUARwB7wS8AfEB7AFKAVIBdAHy\n        A/MB9AT/BwAD/wL0AfIB7wEcARIBFQERAe0BGgG8AfIBGgGaAXkDWAJ5AlgBUgFRARsBcwJKAXMBkgHx\n        AvMD9AL/CAAB9AHsAe0B8wEAAfIB6gHsAfQB/wHyAfMB9wEHAfAC9AHxAewB6wHzAfEB9AHzAZIBbQEH\n        AfQB8wH3ARwB8QX/AwAD/wYAAv8B9AX/AfQB8QGZARsBvAFmAosBswESARUCeQH0A/8B9AG8AUMBTAFS\n        AbwB8wH0Bv8HAAL/AfQB7AFLAXoBmQL0BP8B8wFzAVIBegFYAUwBdAG8AQcB8QTyAfEBkgEVAUwBcwHx\n        AfIB8wH0BP8LAAL/AfQB8wHwARwCEwH0AZkB8gEbARoBmgF6AZkCeQKZAnkCUQHzAXMBFQFKAXQBBwHy\n        AfME9AL/CQAB8gHtAewB9AHtAewBFAHsAfQBAAHzAQcB8gH/AgAB/wEHAW0B8gL/Ae0B6gHvAewB8ALs\n        AfAJAAP/BgAB/wLzAfQE/wH0AfMBmQHzAewBkQG1Ae8BtQGRARQBmQG8Af8B8wH0AvMBvAFDAUwBUgG8\n        AfMB9Ab/BwAC/wH0ARIBSwF0AZkB8wX/AfQBBwFKAXkBWAFSAUsB6gHxAfIB8wHyAfEC8wEHARABUgF0\n        AfMB9AX/DQAC/wH0AfMB8QHrAe8B8AHxAhsBGgWZAhoBvAGZAVIBUQHzAW4BFQFKARwB8AHzA/QE/woA\n        AfAC7AGSAfEBvAHrAfcB8wIHAfIBAAHzAfIBAAH0AQcBkgHyAe8B6wG8AfEB7wHtAesBvAH0CQAC/wcA\n        Af8B8QHwAfMC9AL/AfQB8wEHAfMBHAH3AbwB8QEJAbQBbQEaAbwC8wHxAfAB8gEHAUMBUgFYAbwB8wf/\n        BwAC/wH0AesBSwFSAZkB8wH0AfIBBwHxAQcB7AEVAUoBmgEaAXQBRAEOARMB7AH3AuwC9AEHARABUgF0\n        AfQF/w8AAv8B8wHyAe0B8QEcAxsCGgKZAbwD8AG8AZkBdAFYARsBSgEVAUQBcwHxAfQH/woAAf8BvAHs\n        AfEB/wEAAbwB7AGSAQcB8QL/AQcB9wL/AfEB7wHsAe8B8AL/AfEBkgEHAfQB/wkAAf8HAAH/AfQBvAEU\n        ARwC8wL0Af8B8wHwAhsB9wEHAbwBuwHrAZkC8QH0AfMB9wFDAQcB9wEVAVIBeQHyAfMD/wsAAv8B9AHs\n        AUsBTAEcAfMB9AHvARUBEQEcAZkBHAGZARoBBwFLAUUBEAEHARoBTAFKARwC/wHvAUMBdAGZBP8SAAH/\n        AfMB8gGSAfEBGwLzARsCGgK8AfACGwHxArwBdAGZARoBSgEVAUQBHAHzCP8MAAHwAfMDAAHxArwB9AEA\n        AfMB7AEcAbwBAAH/AfAB8QHwAf8CAAH0AfAD/xEAAf8B9AEHAUsBSgHsAfAB8wP0AfIB8QHyARsBBwG1\n        Ae0BBwHyAfAB8wH0AfMBkgFSAUsBSgFRAVgBmQHyAfMC/wwAAv8B9AHvAUsBUgF0AfAB8wHwAZkB8gHw\n        ARwBGwHxARoBSwF0AbwBdAGZAfEBvAGZAbwB/wH0Ae0BRAF0AZkB9AL/EwAB/wHzAfAB7wHwAvMCGwG8\n        AhoB8QTyAfABvAF0ARsBmQFKARUBSgGZAfQI/xEAAf8B8wHwAv8B7wHwAfIB7wHzAQAB8wHyAf8GAAL/\n        EQAB/wH0AQcBUQFMAksB9wHyAvQB8wHyAfEB8AHyAfMB8QHwAfEB8wL0AfMB7AJ5AVIBWAF5AbwB8gH0\n        Af8OAAH/AfQBvAFKAVIBTAG8AfMB9AHyAvQBcwJ0AUwBUQJMASsBUQHwAfQB8wH0Af8B8gFtAUsBmQG8\n        AfQB/xQAAf8B9ALwA/MCGwHwBBsB8gHxARsB8gGZAXkB8wGZAUoBFQFKAZkI/xMAAv8BAAH3AbwB/wEA\n        AfEBBwP/AgAB/xcAAf8B8wG8AVEBWAJMAUsB6gHwAvQC8wPyA/MD9AHyAXMBmgJ6AVkBUgG8AvMB/w4A\n        Af8B9AHxAesCUgF0AfIB8wL/AfMBSwEsASsBRAFSAUMBJQEsASMB7wH0Av8B9AEHARQBWAEaAfEB9AH/\n        FAAB/wH0AfIB8QEbAfMDGwHxAhsE8wIbApkB8wGZAUoBFQFuAbwF/xgAAfQB7AH0A/8BvAHyHAAB/wHz\n        AQcBUgFYA1IBdAEcAfEE9APzAfQD/wH0AfIBHAEaApoBegF5AXMBBwHyAfQB/w0AAv8B8wH3AVEBUgFK\n        AQcB8gH0Af8B8QEVAUwBSwFzAZkBeQJKASQBdAP0AfIB6wFLAZkBvAHzAv8UAAL/AfMB8AHyBRsB8gbz\n        ARsBvAEbAfMBdAFKAUQBcwHxHQAB8gHqAfIB/wEAAfQBBwHxAf8bAAH/AfMBBwFSAVkBWAJSAbwB8AHy\n        AfQK/wH0AfEBHAQaARsBGgG8AfMC/w4AAf8B9AHwAUQBTAFLAUoB8AHzAfQBBwFKBRoBGwF5AVMBUgLz\n        AfIB7QFEAXQBGwHwAfQB/xUAAv8B9AHxAfIGGwbzAfEBGgH0AfABUQJKAQcB8x0AAf8B7wHsAfQBAAGS\n        Ae8B/xwAAf8B9AHvAVIDegFYAXMB8AHzAfQK/wH0AfABHALzAvQB8AHzAfQC/w8AAf8B9AHzAQcBSwFS\n        AUsBbQHwAfIB7wFRAZoEGgL0AXoBeQLyAZIBQwFRAhoB8wH0Af8WAAH/AfQB8wHwAfQEGwfzAfAB9AHz\n        AXkCSgF5AfAB9B8AAe0B8QHyAe0B9B0AAf8B9AG8AZkBvAGZAXoBWAFRAesBBwHzCv8B9ALwAvIB8AHy\n        AfMB9AL/EQAB/wH0AfIBHAJSAUoBbQG8AfcBcwGaBRoB9AHzAZkB8AGSAUoBUgGaARoB8QH0Af8YAAH/\n        AfQB8gHwAfICGwfzAfIB8wH0ARoCSwFzAbwB8gH/HwAB9AH3ARwB8wH/HQAC/wG8AfAB8gHwAZkBegF5\n        AVIBSwHrAQcB8wj/AfME8QHzAvQD/xEAAf8B9AHzAfABdAJSAUoBEwHsAW4BegGaBBoB9AEbARwBbQFK\n        AXQBGgLxAfMB9AH/GAAC/wHzAfIB8AHyARsK8wF0AUsBdAHwAfEB9AH/HwAB/wHxAfAB/x8AA/8C9AHy\n        ARoBmgF6AVkBUgFKAusBHAG8AfAB9AH/AfQB/wLzAvID9AL/FAAB/wH0AfMBvAF6A1gBSgFDAUwBmgIa\n        ARsB9AEbAXkBFAFRAZoBGwH0AfAB8wH0Av8ZAAH/AfQB8wHxAfICGwTzARsC8wEbAZkBWAF5AfAB8QH0\n        Af9EAAX/AfMB8AEaAZoBegF0AhwC7wEHAfQC/wH0Av8B9AT/FwAB/wH0AfMB8QEHAZkBeQJ0AVgBmgIa\n        ARsC8wHwAhsB8wHyAfAB8gH0Av8bAAL/AfMB8QHyAfMBGwbzARoBmQEaAfAB8gH0Av9HAAP/AfQB8wHw\n        ARoBmQIcAQcCvAHzAv8B9AP/GwAC/wH0AfMB8gHwAQcCmQIaARsG9AHxAfAB8QHzAfQC/x0AAv8B9AHy\n        AfEH8wLyAfAB8gP/SwAC/wL0AfMDvAHwAfEB8wH0Av8gAAH/AvQB8wHyAfABvAHwARsB8gHzA/QCvAHx\n        AfIB8wH0Av8fAAL/AvQB8gG8AvEC9AHxAbwB8wH0Av9OAAP/BPQG/yEAAv8B9ALzAvIB8QPwAfED8gHz\n        AvQC/yIAAv8C9ATzAfQD/1EAC/8jAAP/AvQG8wP0A/8lAAr/gwAD/wP0Bf+4AAP//wD/AP8A/wD/AP8A\n        jQAQ/4EAAv8LAAb/GwAB/wHzDPID8wH/WAAE/yMAB/8FAAP/AfQB8wH0Av8bAAH/AfAN7wEHAbwB/yEA\n        Af8B9AH/CgAB/ygABv8iAAH/A/QJ/wL0AfMB7wH3AfQB/xwAAQcG7QfsAe0B7wHzHwAC/wHzAfIB8wL/\n        BAAC/wX0A/8aAAb/AgAK/xcAB/8BAAH/AvMF9AL/AvQD8wHwAewB7QEHAfQC/xcAA/8FSwRKBkQBcwHx\n        Bf8ZAAL/AfQB8gLwAfMC/wIAAv8B8wHyAvEB8gLzAfQD/xgAB/8BAAH/BvQD/xcACP8B8gHtAe8B8QHz\n        AfQE8wLyA/EBkgLvAbwB8wb/EgAB/wHzAfABvAFLAUoCSwREARUCQwREAXMBvAHxAvMB8gL/GAAB/wH0\n        AfMB8gEHAeoB8QHzAf8BAAH/AfQB8gTxAvID8wL/FwAB/wH0A/MC9AP/BfMC9AL/GAAC/wH0Af8C9AH/\n        AQcB7wH3AeoB7AHyAfMC8gHxAvACvAHsAe0BBwHyAvME9AT/DwAB/wHyAbwC7wJLA0QBQwIiAUMEIgFE\n        ARUBcwHwBPEB8wH0Af8VAAL/AvQB8wHyAe0BFAHtAfEB8wH/AfQE8QG8Ae8B9wHvAQcB8QHzAfQB/xcA\n        Af8B8wLwAfEB8gHzAfQB/wH0B/MB9AL/FwAD/wb0AfEB7wLqAe8B8AHyAfACBwHvAewBkgEHAfEC8gTz\n        BPQC/w4AAf8B8wG8AQcB7wFLAUoCRAFDCSIBFQFzAfEB8wTyAfMB9AH/FAAC/wL0AfMBBwFsARMBQwEH\n        AfEB8wHyAvEB8AEHAesB6gISAeoB7AHvAfQB/xcAAfQBvAMHAbwB8AHyAvMF8gPzAfQB/xUABP8B9AHz\n        AvQC8wH0Af8B9AEHAfcB6wFtAe0B7wHrAm0B6gEHAvEC8gfzAvQB/w8AAf8B9AHzAbwBSwEVAUQCQwQi\n        AhADIgEVAXMC9ATzAfQB/xUAA/8B9AHyARECbAEPAewF8QHwAewBEgGuAWwCEgEUAQ4B7wH/FgAB/wHz\n        Ae8BkgL3Ae8BBwG8A/EG8gLzAfQWAAH/AvQB8wHyAvQB8wHyAvMB9AH/AfQBvAHvARQBEQESAesB7wH3\n        AewBkgHxAvIB8wj0Af8PAAH/AQAC/wFEAUMCEAQiBxAB7AL0AvMC9AH/FgAD/wHzAewBQwFtARIBDwET\n        AbwE8QHvAW0B7AH3AewBEgFtAewBbQHqAfAB/xUAAf8B8gHtA+wB7QL3AgcBvAHxB/IB9AH/FQAC/wHy\n        AfEBvAHzAf8B9AHzAfICvAHxAfQB/wHyAbwB6wETAW0B7QLvAZIB7AGSAQcB8AHzBf8B9AL/DgAB/wHz\n        A/8CQwERASIBFQMiBRABQwEiAW0B8gHzAbwB8gL/FwAD/wG8ARQBQwHsAeoBDwFDAe8C8QHyAfABbQHs\n        AbwBBwHsAW0B7QHvAbUBbQHsAfQVAAH/AfIB7AFtAusD7AGSAfcB7wXxA/IB8wH/FgAB/wHyAbwB7wHx\n        AfQB/wH0AfIB8AL3AZIB8wH0AesB7AHvAesBEwHsAbwB8AEHAe8BkgH3Ae8BBwHxAfIB8wT/DgAB8wGS\n        AewBbQFEAkMDRAFKASIBQwJEA0oBRAEQASIBbQHzAewBBxoAAf8B9AESARUBQwGRARQBDwFDAW0C8QHz\n        ARIBkQH3Ae8B7QHsAesB7AHvAbsB6wESAfIVAAH/AfEBbQESAuoE6wHsAfcB8AbxAfIB8wH/FwAB8wEH\n        Ae8B8AP/AfQB8gHxAe8B7AHrAhUB7AHvAbwB9wETARIB7AEHAfMB8gHxAu8B9wHsAe8B/w8AAv8BvAEi\n        AUQCSgJLAkQBSgFRAUQBSgFLAUoBRAVKAUQB7AFKAZID/xcAAf8B6wETAUMBEwHsARQBDgFDARUB9wG8\n        AfcBbAL3Ae0B7AHrAewB6wHsAfcB7QHrAfEC/xMAAf8B8gISAhME6gFtAe0B8AfxAfMB/xcAAfQB7wHs\n        Ae8B8wIAAf8B9AHzAfEBBwHrAewB6gHtAbwD7wLsAfcBkgEHAfEC9AHzAbwB8xAAAfQBGgEcAQ8BRAFL\n        AXQBeQJ0AVIBSwFRAUsGdAJ5AXQBSgFEAUMB7AHzAfIB/xYAAf8BBwFmAkMBEwHrARUBDgERARQBEwEH\n        AesBrgPtAesBbQHrAuwB7QHvAewBvAL/EwAB/wHyAeoBFAFEARIBSgHqAhIBRAHrAfAH8QHzAf8XAAH/\n        AbwB7AHtAfACAAL/AfQB8gHsAeoB7AHtAvcC7wL3AuwCvAPvAQcBvAH0Af8PAAH/AZkBmgEVAUMBSwF5\n        ApoBdAFRAksBSgV5A6ABmgFLAUoBRAF5ARoB8hcAAfMBEgERAQ4BEAHtAQcB7AEOAQ8BEQEVAewB6wGR\n        AuwB7QLrAewB9wLsAe8C9wL/DgAC/wMAAf8B8gHqAkQBEgETAUQBFQFEARQB6wHwB/EB8gH/GAAB8wHs\n        AeoB7wH0AwAB/wG8AewBBwLvAewBBwLtAe8DBwHtAbwB/wH0AQcB7AESAZIB8w8AAgcBeQF0AUQBUQFL\n        AnkBcwFLAUoCRANKAksBdAJ5AXMBSwFDAUoBeQFzAfIB/xYAAe0CEQEQAeoBkgHvAZIBFAEOAQ8BEQET\n        AeoB7QHsAesBkQHtAfcB7QH3Ae8B7QP3Av8NAAHzAuwB8gH0AgAB8gHqAhECQwIVAkQB6wHwAfIG8QHz\n        AfQB8wL/FQAB9AH3ARMB7QG8Af8BAAL/AfQB8wHxAbwBBwHvAe0B9wGSAesB7AGSAbwB8gHzAfQCAAH0\n        AfABvAH/DwAB8AEHAZkBdAFLAXQBSgHvAXMDSwFKBEQBSgFLAnQBbgHsAUsBQwF0AXMB6wG8Af8VAAHw\n        AhUCEQESAeoC6wJDARQBDwEQARQB7QHrAeoB7wH3AQcB9wHtAZIB7QH3Ae8B9wL/DQAB/wHyARwBbgHs\n        Ae8B8wG8ARUCDwIRAUMCFQFEAW4B8AHyBvEB8wHyAvEB9AH/FQABvAEUAW0BBwHzA/8B9AHzAfEBvAMH\n        Ae8D7AHvAfAB9AL/BAAB/xAAAf8BvAEcAUoBSwF0AUsB8gEcAUQCSwFKAkQCSgFLAkoBkgH/AewBdAFD\n        AksBBwH/FQAB/wFDARQBDwJtARIBrgHqAWYBEQEOARQBFQEQAeoB9wHsAesB9AG8AfMB8QLvAfcCBwH3\n        Av8QAAHzAe0BEgJEAw8BEAIiAREBFQFEAesB8AHyCPEB8gHxAfIB/xYAAewBEwK8AfMC9AHzAfIB8QHw\n        AgcBvAHwAQcBkgH3AQcB8wL/FwAB/wHzARwBmQGaAXQBHAHyA0QBSgJEAkoBRAFKAUQBvAHwAUoBeQGZ\n        AUoBHAH/FQAB/wHsARABQwITAQ8BFQERBQ4BEAFtAewBBwHrAe0B8QG8AfAB8QG8AfcC7AH3AewC/xAA\n        AfQB8QG8AeoCbgJEAg8DIgEQAewB7wHrAQcBvAjxAfMB/xYAAQcBFAHsAbwB8wH0AfMC8gHwAwcBvAHw\n        AfECBwHyAfQB/xoAAfMBmQGgAXQBbgFKAUQBSwFuCEsB7QEUAXQBmgHDARwB9BYAAf8BBwHtAeoBEAMP\n        Aw4BEAIOARAB6wHvAfMC7AH3AewCkgHsAe0C7AHvAewC/xAAAbwCbgFtAW4BGgEcAW4BQwEiBA8B7AFt\n        AkQB7QHwB/EB9BcAAfMBbQEUAbwB8gH0AvMB8gHsA+sB7AEHAfIC8wH0Av8bAAEaAXkBdAFLAkQBSwFz\n        BHQBSwF0AXMBSwFtAUoBdAGaAUsB9BkAAfEBFAFDAewCBwL3AewBrgFtAhAB6gHwAf8B9wHsAZIB6wHt\n        AfcB7QEHAuwBvAHsAv8PAAHzAW4BSgFtAnQBSwVEAw8BFAMRAW0BvAHxAvIE8QH0FwAB/wHtAQ4B9wG8\n        AQAC9AG8AesB6gJtAeoBEgHxA/QB/xwAAfMBHAF0AXMCRAFLAXMBdAJ6AnQCSwFKAUQBSwJ0AfAZAAHz\n        AeoBFAHsAfAB9AHzAfABBwL3AZIBbQERAeoBBwK8AewB7QHrAfcBkgHsAe8BbQHtAbwB6wL/DwAB8gNu\n        AXMBHAREARQDRAFDAkQBQwFEAe0D8QHyBPEB8gH0Av8VAAHwAQ8BbQG8AfMB/wH0AW0B7QFtAesCbQHq\n        AfcB9AP/HAAB/wEHAXQBcwJEAUoCSwJ0AksDSgFLAnQBBxoAAfQB7AFtAfcBBwHxAe8BEwFDARIBrgHr\n        Aa4BEgFDAesB9AHwAewB7QHrAfcC7AHtAW0BkgHzAesC/w8AAfIBbgFKAUQB7QH/AW4FRAJDAUoBbgFE\n        AkMB7AfxAfMB8gHxAfIB9AH/FAAB9AETARUBBwG8Af8B8AEPAewB6wHqA20B7QHzAf8fAAH/AXQBcwFK\n        AUQBSgRLAVEBSgEVAUoDSwFzAfQaAAH0ARIB7AH3AuwBBwJtAe0BrgFsAa4BbQERARQB9AHwAZIB7wHs\n        AQcC7AH3AW0BBwH/AewC/w8AAfACbgFEAe0B9AJuAkoDRAFtAW4BdQFLAUMBFQHsB/EBAAH/AfMC8QHz\n        FQAB9wEOAewBuwHyAe0BFQHrAewBFAESAW0BEgHsAfIhAAHyAUsBSgJLAUoERANKAUsBUQFKAQcB/xkA\n        Af8B7wESAfcC7wFtAfcCBwGSAW0BEwHsAesBEwFtAfQB8gHvAfIB9wG8Au0BBwHqAQcB/wHtAv8QAAGT\n        AW4BSwFEAewBdAJuAUsBbgFKAhMBbQREAW4BkgG8AfAD8QHzBAAB9AHzAfEB9AH/EgABvAEOARMBvAHs\n        ARMBvAH3AuwB6gESAW0B9wHwIQAB/wHsAUMCRAFKAXMDRAJLAkoCRAHzGgAB9AHsARIB9wLvAbwB8gGS\n        AewC9wHtAfcB6wESAe8B9AHyAe8B8gH3AQcC7AH3AeoBBwHzAQcB/xEAAfQBBwFLAUQBbgF0AW8BSwJE\n        AUoBEgJKAQ4BDwFEAW4BbQJuARwB8QLyAf8FAAL/AfQB/xIAAbwBDwERAQcBvAHvAfQBEgFDAZIB7wH3\n        Ae8BvAHzIAAB/wG8AZkBmgOgAXQDRAFKAXkBegF0AUsBSgHzGgAB8wHqARIB9wLvAgcB6wIVAvcBkQHr\n        ARMB8AH0AfIB8AHyAe0BvAH3AewBBwHqAQcBvAH0EwABBwFLAUQBmQF0AW8BbgNEAUsCbgFEAUMBSgHx\n        AfABkgFuAUsB7QHyAf8cAAG8ARABQwFtAe8BuwHsAhEB6wP0AfAB/x8AAf8BBwSaAaABmgF5BEoBdAOg\n        AZoBmQG8AfQYAAHzAeoBbAGSAfcC7AG1BPcBkQHsAesBbAG8Af8B8wHyAfQB9wHxAbwB7wHxAfcB8wL/\n        FAACHAHDAXUBdAFLA0QBSgFLAm4BSgFuAfID8QEHARwBcwG8Af8bAAG8ARUBQwFtAeoB7wETARUBbQLz\n        AvAB/yAAAf8BvAEbAfMBGgGZAZoBmQFLAkoBSwFKAXMBmgKZAbwB8wG8AfAYAAH0AewBbAHtAfcB7AFt\n        AZEB8QHzAQcBkQHsAe0B7AFtAfAB/wH0AvMBvAHyAQcCvAHxA/8UAAH0ARwBmQF1AXQCRAFKAkQBbwGU\n        ApkBvAPxAfMBAAH/AfMB8AH0GwABvAERARABEQHqAe8BEQHtAfAB9AG8AfAB/yQAAv8B9AIHAUoBcwF5\n        AXQBSwFuAZMB8QP/GgAB/wHtAWwBrgFsAm0BkQG8AfMB9wJtAZEB7QFtAfAD/wH0AfEB8AH3AfMB9AP/\n        FQAB8AJzAXUBbgFEA0oBRAJ0AXMB8AHzBPEB/x4AAf8B7AEPAg4B9wFtAREB8ALvAfMB/yUAAv8C9AHz\n        AQcCdAF5ARwB8AHzAfQD/xoAAfQB7AFtARIDEwHrAfABBwHtAeoCEwGuAeoBvAT/AfMC8AT/GAAB/wHy\n        AQcBcwFLAkQBbgEHAfIBAAH/AfIE8QH0GAAB9AHxAfMB/wEAAfQB8QEVAhABEQH3AUMBFQHzAZIBvAH/\n        JgAC/wL0AfABHAFzAXQBcwF0AbwB8wL0Av8aAAH0AewBbQHqAusBkgEHAfAB8wG8Ae8B7AHrAa4B6gHv\n        Bf8B9AT/GwAB/wHvA0QB7QH/AgAB9ALxAfIC8QH0GAAB9ALsAfAC9AGSAUMCEQFDAZIBDwEVAfEB7AHw\n        JwAC/wL0AQcBcwF5ApoBeQEHAfMC9AL/GgAB9AHsARQB6wG1B/8B8gEHAfcBbQEHAf8DAAX/HAAB/wEc\n        A0QBSwH/AgAB8wHxA/IB8QH0GAAB9AHtARUB7AHvAZIBEgMRARQB9wEPAREBvAHrAfAnAAL/AvQBvAF6\n        AZoBwwGgAZoBmQHzAvQD/xkAAf8B7wFsAW0B9wH0Bv8B8wEHAe0B6wHxAf8kAAHzAnMCSwFuAbwCAAH0\n        AvEB8gLxAfQZAAHwAewCFQFDBBEB6wHvAREB7QH0AfAB8ScAAv8C9AG8AZkCwwGgAZoBvAHzAfQD/xoA\n        Af8B8gHrAW0B9wHxBv8B8QHvAe0B9wH0Af8kAAHwAXQBkwEaAnQBBwIAAf8B8gHxAfIC8QH0GQAB/wHy\n        Ae0BQwERAkMBFQHqAfIB7AH3AfQB8gHwAf8nAAP/AfQB8wGZAsMBoAGaAfAC9AP/GwAB/wG8AewB9wHw\n        Bv8BvAEHAe0B8QH/JQABBwEcAhoBmQF0AQcDAAH0AfEB8gHxAfIcAAHyAbwD7AHvAfMB7QHsAQcBvAHy\n        AfQoAAP/AvQB8AGZApoBvAHzAfQD/xwAAv8B8gEHAbwB9AX/AbwB7wG8AfQB/yUAAbwBcwFuAZoBdAFu\n        AQcEAAH0AfMB9B4AAfIB8QPyAbwB9wG8AfEB9CsABP8B9AHyAfAB8gHzAfQE/xwAA/8B9AHxBvAB8QHz\n        A/8lAAHzARwBdAGaAnQB8AUAAv8fAAH/BfQC/y4ABP8C9AX/HwAC/wP0A/MC9AP/JgAB/wEHAXQBmgF0\n        Ae0B/1wACv8gAAb/AfQG/ygAAbwBHAEHAf9gAAX/IgAM/ykAAf8B9AH/iwAG//8A/wD/AMAAB/+NAAP/\n        JgAO/4gAAf8B9AHzAfQB/yUAA/8B9AL/AfQI/1QAD/8jAAH/AfQB8gHsAfAB9AH/IwAD/wHzA/IC8QHy\n        AfEC8gH0BP9QAAP/BPQF8wT0A/8hAAH/AfQB8AERAewB8gH0Af8iAAP/AfIBvAH3A20CFAHqAfcBvAHz\n        AfQC/yIAC/8iAAL/AfQB8wHyAvEG8APxAfIB8wL0Av8bAAT/AfQB8gHtAREBcwEHAfIB9AT/HwAC/wHw\n        AewBFAMVARQBQwJKAewB7wHyAv8cABf/GwAB/wH0AfMB8QHwAgcB9wPtApIC9wHvAgcC8AHyAfMB9AP/\n        FwAC/wL0AfIB8QEHARIBRAFzARwBvAHyAfMC9AL/HgAB/wH0AfcB6gEVAUMBFQFEAksBdAF5ApkBvAH0\n        Af8bAAT/AvQG8wLyA/MB9Af/GQAB/wH0AfMB8AEHAfcC7AFtAeoBbQHrAW0C6wLsAe0BkgH3Ae8BBwHw\n        AfEB8wH0Av8VAAL/AfMB8gHwAbwB7wHtARUBSwJzAu8BvAHxAfIB8wH0Av8dAAH0ARwB6gFKAkQBSwFS\n        AXkBmgEaARsCvAHzAf8aAAP/AfQB8wHxAbwB9wFtARQGQwESAewBvAHxAvMB9AX/FgAB/wH0AfMBvAGS\n        Ae0BkQFtAmwBFAVsAm0C6wPtAu8BvAHxAfMC/xIAAv8B9AHyAbwBBwH3AZIB7AFtAUQBUQF0AUsB7AHt\n        AvcBBwHwAfEB8wH0Av8aAAL/AfIB7QFLAXMCSwFSAZoBGgEbAfIBvAHxAfQB/xkAA/8B8wHxAQcB7AHq\n        AUoBSwF0AXkCmQJ5AXQBUQFLAUoB6gGSAQcB8gHzAfQF/xQAAf8B8wHwAu0BkQGuAWwBFQIUAUMBFQJD\n        ARQBbAGuAeoC6wLsAe0BkgHvAQcB8AHzAfQC/xAAAf8B9AHyAQcB9wHsAesBEgEUARUBSgJ0AUsBFAFt\n        AesB7QGSAfcBBwHwAfIB9AL/GgAC/wHyARwBcwJLAVIBmgEbAfEBBwG8AfIB9AH/GAAD/wHzAfABkgES\n        AXMBmQMaArwB8AG8AQcDmQF0AVEBSwFtAe8C8AHyAfQE/xMAAfQBBwGRAfcBkQFsAhQBEQFDAhEBEAER\n        AhUCQwEVARIBbQHrAewC7QGSAe8BBwHwAfMB9AH/EAAB/wHzAQcB9wHrARABEQEVAUsBdAMcAXQBSgFD\n        ARMBFAHsAu0B7wEHAfEB8wH/GwAB/wH0AfMB7AMVAUsBmQLvAbwB8gH0A/8TAAX/AfMB8AFtAeoCGgIb\n        AfAB8gLzAfQB8wHyAfECBwKZAXkBUQFtAe8BvAEHAfEB8wH0A/8SAAG8AfcBuwGuARQBEAFsARMDFAEV\n        AQ8BDgEQAkMBDgEPAUMBbAFtAewB6wPtAe8BBwHwAfMB9AH/DQAC/wH0AfABkgETAUMBSgFzA5kEHAJ0\n        AUoBFQESAewC7QGSAQcB8QHzAv8ZAAL/AfQB7QFDAUQBeQEbAZkBHAHvAQcB8wX/DQAK/wHyAW0BcwEa\n        AfMB8gHwAfMD9AHzAfIC8QHwAbwDBwGZAXkBUQHsAQcB8AEHAfAB8gH0B/8MAAH0AfcBugGRAWwBFQEU\n        AW0C6wGSAewB6gEUAg8CEQEQAREBDwFDAeoBbQLsAu0B9wHvAQcB8QHzAv8LAAL/AfQB8gH3ARIBRAFz\n        ARoBmQFzAUoBFAIVARQBSgFuAhwBcwJKAewC7QGSAQcB8QHzAv8XAAP/AfQBFAFEAUsBdAGZAZoBmQGS\n        Ae8B8QH0Bf8MAAj/AfQB8wH3AewBGwH0AbwB8QHyAfQD8wHxAbwBBwLvAQcC7wIHARwBeQF0AXMCvAEH\n        AfAB8gH0Bv8LAAH0Ae0BkQGuARQCbAHsAe8BvAIHAe0B7AHqARUDEQEPARACEQEUAW0B6wPtAu8BBwHw\n        AfMB9AL/CAAC/wL0AfIBBwESAUoBmgEbARwBQwIRAUMDFQERASIBQwFuARwBcwFLAUQB7ALtAe8BBwHy\n        AfQD/xQABP8B9AHzAUQCQwHrAbwB7wHtAfcBBwHyCf8IAAj/AfQBBwFtARsB9AEHAbwB8AHxA/IB8AG8\n        Ae8B9wTvAvcCBwJ5AXQB7AG8AgcB8AHzAfQF/woAAf8BvAKRAWwBEQJsAewC9AHzAQcC7AFtARMBFQIR\n        AQ4CEQEQAUMBEgFtAewBkgLvAgcB8AHyAfMC/wcAAv8B9AHzAfEBBwESAUsBwwHyAewCEQFDBBUCFAIV\n        AUMBSgJzAUsBbQHtAZIB7wEHAbwB8gHzAfQE/w0ACP8B9AHzAe8BFQFLAZkBHAGSAe0BkgHvAbwB8gL0\n        B/8GAAj/AfMB8QHrAQcB9AG8AgcCvAHwAbwBBwL3AW0BFAHqARQB6wH3BAcBHAF0AXkBdAEcAbwC8AHx\n        AfMB9AT/CgAB8wH3ApEBbAETARQB7AH3AbwB8wG8Ae8B9wLsAW0BEwFDAQ4BFQIRAQ8BQwESAesB7QH3\n        Ae8CBwHwAfEB8gHzAfQB/wcAAf8B9AHzAfIB8AHrAUoBGgH0AewBEQEVARQEFQIUARMBFAEVAREBQwFE\n        AnMBbgHsAu8CBwHwAfIC8wL0Av8MAAf/AfQB8wHxAfcBFAF5ARsBHAKSAewBkgEHAbwB8QHyAfMB9Aj/\n        AwAI/wHyAZIB7AHzAfQCBwG8AQcBvAEHAe8B6wIUAUMBEQFDARMBHAFtAfcB8AG8AvABcwF0AXkBHAG8\n        AfAB8QHyAvME/woAAQcBtAGRAW0CFAETAesBbQHrAQcC9wHvAe0B7AHrARIBQwEOAg8CEAFDARIB6gHs\n        AfcCBwG8AvEB8wH0Av8HAAH/AvQB8wEHARUBHAH0AZkBEQFEAxIDFAQSARUBQwFEARUBSgF0AnMB7wIH\n        AvAC8gHzAvQC/wwABP8D9AHzAfABvAHtAUQBcwGZAewB9wGSAewC7wEHArwB8QHyAvMB9AX/AwAH/wH0\n        AfEBbQGZAfQDBwK8AQcB6wESAUMBEAESAUQBEAEPAUQB7wHtAW4B9wHyAfAB8QEHAXQBeQF0AQcE8gL0\n        A/8JAAH0AbsCkQFsAUMBEAEVAeoBEgHvAfIB9wLvAu0B6wFtARMBDwEOAQ8BQwERAUMCEgFtAe0CvAHx\n        AvIB8wH0Av8IAAL/AfQB7wFKAcMB8QFEAUoC6wJtAeoDEgJtARIBQwEVAeoCRAFKAXMBUQHvAbwC8AHy\n        AvMC9AP/DAAD/wH0AfMB8gLxAQcB9wEUAREBSwJKAvcE7wEHArwB8ALxAfIC9A7/AQcBbQEaAfABBwFt\n        AZICBwH3ARQBSgFEAUMCFQFDARIBSgFDAUoBHAHrAe0B8AHvAesBbgJ5AQcB8gHzAvIB8wH0A/8JAAHy\n        AfcBtAGuARQCFQJDARABvAEHAewB7wH3Ae0B9wHtAesBEgERAQ8CEQEQAUMBFAFtAesBkgHvAfAC8gHz\n        AvQC/woAAf8B7QFRAfQBcwFEAXMC7QLsAW0BEwEUAeoB6wFtARQBEQEVAhICRAFLAXMBHALxAfIB8wH0\n        Bf8OAAP/AfMB8AIHAe8B7AEiAUsBUQFLAUQD7wMHBLwC8ALyAfMB9An/AfQB8QHvAfIB7wF0ARsBHAHs\n        AQ8BFAHrARQB6gEUAewBcwESAREBEAETAW4BcwJKAUQCSgESARMBQwESAXQBeQEcAfMB7wH3AfIB9AT/\n        CQABBwK7AZEBbAESAWwBEwEUARMB9wHsAW0C7wIHAe0B7AFtAUMCEAIPAUMBFQFtAewBkQEHAfEB8gHz\n        AvQC/wkAAf8BvAHtARMBegEbAW4B7AEcAe8B9wHtAewB6wETAUMC6wEUARABEQETARIB6gJEAUoBUQFL\n        Ae8B8QHzAfQB/xMAA/8B8wG8AgcB7wEUAUsBeQGaAZkB6wHvAQcFvAXwA/IB8wH0B/8B9AHzAewBmQHx\n        Ae0BmQEaAW0BEAEOAQ8CSwFKAUMBbQFzAUQBFQFEAXMB7wEcAnMBSwFEAXMB6gEUAREBQwFLAXkBHAH0\n        AesBbgHwAfMB9AP/CQABBwK7AuwCkQH3Ae8B9wHrAeoB7AHzAfQB8gHvAe0B7AHrARUCEAEPARABFQET\n        AusB7AEHAfIC8wH0Av8GAAH/AfQB8gH3AeoBFQFEAVEBmgGZAUoBbgHvAbwB9wLtAewB7QHqAesBEwER\n        ARABQwFtAewB6wHqAkQBSwFRAewBBwHxAfQB/xMAA/8B8AHvA7wBbQFLARwBGgEcAeoBBwHwBfEH8gLz\n        AvQH/wHxAW4BGgHxAe0BmQEaARIBEAEOAQ8BRAF0ARwBbQEUAUoBcwEaAZkCHAOZARwBcwFKARQBQwEV\n        ARQBRAF0AXkB8wHvAXQB7wHzAvQC/wkAArsBtAHqAhUBFAETARQCQwEUAW0CvAP3AewBbQEUAUMBEQEQ\n        AREBQwESAusBkQEHAfMC9AP/BgAB/wEcA24DdAGaARwBSgEcAbwB8gH3Au8B7AHtARMBQwERASIBEAHq\n        AfcC7AFtARIBRAFLAXMBSwETAeoB7QHyAf8SAAP/AbwB6gHrAfEB8AETAUsBmQEaAZkBSgHvAvMB8AHz\n        AvIB8wr0B/8BvAFzAZkB8gHtAZkBBwESARABDgEQAewBSwFzAQcBbgFDAZkDGwGZARwDGgGZARwBbQES\n        AhMBFAFSAZkB8wEHARwBvAHyAfQD/wkAAbwBuwGRAeoCFAFDARECEAEVAhMB6wHvAfIBBwH3AuwBbQEV\n        AhEBQwEUAeoB6wHsAZEBvAL0A/8IAAH/AfABvAEaAZkDeQF0AW0BHAG8AfMB8AO7AfcBEQMiARUC9wHr\n        AewB6wFtAUQBSwJ0AlECSwFRAfMOAAL/AfQD/wHzAewBEgITARABSwF5ARoBmQFtAfMB7wFtAe8E9Aj/\n        AfQI/wHwAXMBmQHzAe0BmQEHARIBEAEPAREBcwFKAUMBHAGZAXMBmQIbAZkBSgFLAZkBGwMaARwBEgHq\n        ARMBbQFRAZkB8wEHARwBGgHyAfQMAAG8AbsBtAFsAkMBEQIQARUBFAEVAeoBFAGSAfQBvAH3Ae0B7AHr\n        ARUCEAERARUBEgLrAfcBvAH0Av8MAAH/AfQBGwGZA3QBEgHtAbwC8wHxAfAB8gFtBBEB7AEJAfcB7AHt\n        AewBbQEVAUsBdAKZAhoB8AHyAf8OAAP/AewBvAH0Af8B7wFKAm4BcwFLAZkBGwGZAUoBBwHsAe8B/wL0\n        AfIB8QH0EP8B8AFzAZkB8gHtApkB6gERARABQwNKAUQBHAHxAhsBvAFKAW4BHAEaAvMCGwEcARQBbQES\n        AeoBbgGZAfMB7wGZARoB8wH0Af8LAAG8AQkBuwFsARQBQwMRAUMBFQEUAeoBFAHsAfQBBwLtAewBbQEV\n        AhEBQwEUAeoC7AG7AbwC/xAAAbwBcwF0AXMBSgHsAQcB8gEHAbwC8wFDASIBEQEQAeoB8QEJAe8B9wLs\n        AeoBFQFzARoCvAHxAfQB/wwAA/8BAAP/AbwBSgHrAQcB7QESApkBdAFLAZkB8AEcAUsCHAGZAfQBBwLs\n        Ae8B9BD/AfIBHAGZAfEDHAFKA0MBSwEcAm4BSgHsAfABGgFuAe8B8gLzBPQB7wEUAewBbQESAXMBmQH0\n        Ae0BBwG8AfMB9AH/CwAB8AG8AbsB6wGRAWwBQwERARQBEQFDARQBFQESAfcB9AEHA+0B6wESAkMBFQES\n        AW0B7AH3AfAB8gH/EQAB/wEcAXQBcwFKAewB7wHwAe0BEwG8AfADIgEUAbwB8wEJAe8C7QHsAkQBHAG8\n        EQAC/wH3AesB9AL/AfIB6wEcAhMCGgF0AksBdAG8ARwBSgF5ApkBbQETAXMBmQH0BP8EAAn/AfMBHAEa\n        AfEB7wJ5AW0BFAFKAUMBcwEaApkBcwFKARQB7QEcAfQBGwEaBPQB8wHtARIB7AFtARUBdAEHAfQBHAEa\n        AfAB9AL/CwAB9AEJAbsBkQHtAWwBFAERAUMBFQEQARUBFAERAQcB9AEHAfcC7QHrARICEQEVAeoB6wGR\n        AbsB8AH/EwABvAFLAXMBSgHqAewBBwG8AesBFAEVASIBEQFKAe8B9AHyAfABBwH3Ae0BbQERAUoBmQHw\n        EgAB/wHxAW4BEgHvAfIB7wFKAZkBGgKZAXQBSgFEAUoBcwIcAUQBSgEcARoBGwG8AZkBHAHyAbwB7AEH\n        AfMC/wQACP8B8QHyAfMB7wF0AXkBcwFDARUBFAFuARoCGwEaAZkBSwGZARsB9AIaBPQB8QHsAW0B7AHq\n        AUoBmQEHAfQB8ALzAfQB/w0AAbwBCQKRAWwBEwEUA0MCDwEVAe8B9AG8Ae8C9wHsARQCEQETAW0CkQG7\n        AfAB/xMAAfMBSwFRAUsBRAFtAe0BvAHwAeoBIgFDAe0B8gP0AfIBBwH3Ae0BFAFDARwBvAH/EQAC/wH0\n        Ae8BbgFEAW0B6wEcARoBmQF0AXMBSwFEARUBcwF5ARwBmQFKARQBbgEcARoCGwGZAW4BEgFzAQcB9AL/\n        CAAH/wHxAXMCeQEVAREBFQEUAe8BBwEaBBsC8wEbAfMC9AHzARsBvAJtAZIBEwF0AZkBvAP/AfQC/w0A\n        AfIB8AK7AZEDFAERARABFAEVARAB6wHyAvABBwHtAW0CQwEUAW0BkQH3AbsBvAHzFQABvAJRAUoBFQHr\n        AfcCvAHrARwE9AHzAfABBwHvAW0BEQFLAZkB8RIAAf8B9AHzAesB6gFRBJkBdAJLAUQCFQEbApkB9AFz\n        ARUBRAFLAXkBmQEaARsBGgGZAUsBBwL0Av8HAAb/AQAB/wFzAnkBSwIUAewB9AHzAbwB7wEaARsCGgEb\n        A/MB8gK8AQcB6wHqAewBSgGZAbwB8wEAAf8B9AH/DwAB9ALwArsCkQFsARUCEAERARABQwFtAe8BBwHy\n        AewBFAEVARIBbQHsAfcBuwG8AfEB9BUAAfQBHAF0AUsCRAFtAe0B7wHwAfMD9AHzAfABvAEcAW4BFQFK\n        AZoBGwH0EQAC/wHzAZIBEQFzApkBcwFLAW0CRAJDAUoCGgEcARoB9AEaAUoBFQFEAUoBbgFzARwBmQEa\n        AXMBEwHvAfMB9AH/BwAG/wEAAf8B8AF0AXkBcwHvAfMF/wHzAfABvATwAfIB8wH0Av8B9AHyAW0BdAEa\n        AfAB/wEAA/8QAALzAfEB8wG7ApEB6gESARQBFQJDARUBEwESAhMCFAFsAZEB9wG7AbwB8gHzFwAB8wJ0\n        AUsBRAFDAUQB6wGSAQcB8AHyAfMB8gEaARwBSgEVAUsBGgEbAfIB/xEAAf8B9AEHARQBSgKZAUsBRAEV\n        AW0BSwJzARwBGgEbAQcBdAEaAvQBGgFLAUQBFQJEAUoBcwEcARoBcwHqAfAB9AH/BwAF/wMAAf8BHAF5\n        AXQBHAH0D/8C9AHzAe8BSwEaARsB8gH/BAAB/w8AAf8B8ALzAbsBkQG7AZEEbAIUARUBFAMTAeoBkQH3\n        AbsB8AHyAfAB/xgAAfACdAFLARUCIgFEAW0DcwFuAUoBRAEVAVEBwwHzAfESAAL/AfQB7QFKAZkBHAES\n        AUMBbQHxBPQB8gHwARsB7wFuAZkB8AG8AvQBGgGZAe0B6wESARUBRAFzAZkBcwESAfMB/xAAAfMBHAF5\n        AXQBkg7/AvQB8wEHARUBmQEbAbwC/xYAAfAB8wHyAQkBtAJsAesBuwFsAeoEbAFtAewDuwHwAfIB8AH/\n        GQAB/wHwAZkBHAFzAUoBFQERAyIBEQEVAUoBSwGZAfQB8QHyEwAC/wHzARUB7wEHAe0B6wGSAvIE8ALx\n        AfABBwFuAZkB8QHwAbwF8gG8Ae8C6wHsAZkBcwH3AfQB/w8AAf8B8gEcAXQBcwHsAfAE9AX/A/QB8wHx\n        AfcB6wEaARsB8AHzAv8WAAH/AfIB8wHxAQkBuwKRAa4GkQL3AbsB8AHxAvIB/xsAAf8B9AG8Ae8BmQFz\n        AW4BSwJKAUsBcwEaARsB8wHwAfMB/xMAAv8B8AHtArwB7wEHAfAB8gLzAvIE8wHvAUsB7wHwAfIC8QHw\n        A/EBvAHwAfEBBwLvAQcB7QHyAf8QAAH/AfABmQF5AXQBbgGSAfEB8gfzAfIB8AHvAesBHAEaAfQB8AHx\n        AfQC/xcAAf8D8QEJArsBtAK7AZEB9wK7AQkBvAHwAfMC8QH/HwAB8wG8A5kDeQEbAfIBvAHzFgAB/wH0\n        AewBvAHxAfIB9wHwAfMJ9AEHAXMB8AHxAfMB9ALzAvIB8QHzAfEB8AHzAfACvAHvAfEB/xIAAfEBBwGZ\n        AXkBUQEVAewBvAHwAfEC8gHxAbwBBwLrARoB8wH0AfAB8QHzAfQB/xoAAfQB8AHzAfEBCQLwAQkE8AHy\n        AvQB8AH0IwAB/wHzAbwCdAGZARsB8xgAAf8B9AHsAfAB8wG8AQcB8gr/AfMBvAHwAfIB9AP/BPQC8wG8\n        AfAC8gG8AfAB/xIAAf8B8QEHApkBeQFzAUoC7AHtARwB7AFuAewBmQEbAfMB8gHwAfIB8wL0Af8bAAH/\n        BPIB8wH0A/MD8gHzAf8mAAH0AXMBdAGZAbwB/xgAAv8B7wHxAfQC8wL/BwAH/wEAB/8B9AHzAfAB8gHz\n        AQcBvAH/EgAC/wHzAfABBwOZARwBcwJ0AZkBGgEbAfMB8gHwAfEB8gHzAfQC/x4AAv8H9AL/KQAB7wF0\n        AZkB8BkAAv8B8AL0Av8NAAH/BgAG/wP0AfMB9AH/EwAC/wH0AfMB8QG8AfAEGwHzAfEB8AG8AfEB8gHz\n        AvQC/1MAAfEBdAEaAfQZAAb/GAAC/wEABf8VAAP/AvQK8wL0Av9VAAH/AXQBGgH/GgAE/xwABf8WAAX/\n        B/QF/1cAAQcB8lsABv9dAAH/AfT/AP8A/wD/AP8AbgAI/7YADf+xAAT/CvQE/yIACv+BAAP/AvQK8wH0\n        A/8iAAb/AfQE/1YACv8gAAL/AfQB8wLyCfEB8gHzAfQC/xoACP8B9AHzAfID8QH0A/9UAA3/HgAC/wH0\n        AfMB8gLwArwBBwS8AvAB8QHyAfMB9AL/FwAF/wL0A/8B8QFLARoBmQF0AUQB7QHzA/8DAAj/FAAF/wkA\n        Av8jAAL/C/QC/x0AAv8B8wHyAfABBwH3Ae0C7AGSAfcC7QH3AQcBvAHxAfIB8wH0Av8WAAP/AfQC8gLx\n        AfMB9AHwAZkBGwGZAXMBSwHsAfAB8w3/FAAB/wPzAfQB/wYAAv8B9AHzAv8gAAL/AfQB8wTyBPEB8gHz\n        Av8dAAH/AfQB8gHwAe8BbQIUA2wD6gESAW0B7AEHAfAC8wL/FgAD/wHzAe8D9wG8AfIB8QGZARsBmQES\n        AUoB6gH3AfMB9A3/EgAB/wHzAe8BkgHvAbwB8wH0BAAB/wH0AfICBwHyAfQB/x8AAv8B9AHxAbwFBwHv\n        AQcBvAHxAfQB/xwAAv8B8wHxAfcBEgFDBGYCEwISARMCFAHqAe8B8QHzAv8WAAH/AfQB7QHrAW4BRAER\n        AesB9wIHAZkBGwGZAksB6gH3AbwB8gHzBP8E9AX/EQAB/wH3AREBFQFtAewB7wG8AfMD/wH0AfEB6gFD\n        AesB7wHzAf8fAAL/AfMBBwH3AZIC7QGSAu0BkgHvAfAB9AL/BQAB/xUAAf8B9AHyAe8BEgIVA0MBDQEV\n        AUMBFQEUARMBFAFmAREBEgHvAfMC/xUAAv8B8wFzARoBmQFzAUoBEwHsAe8B9wEaARsBmQJLAeoB7AH3\n        AQcB8QH0A/8B9AHzAfEB8wH0Bv8PAAHzAeoCSgEUAW0B7AHtAQcB8QLzAfEB7AEQAUQBbQHvAfMB/xkA\n        B/8B9AHyAZIC7AVtAuwBBwHzCf8TAAL/AfQB8AFtAUMCZgEVAUMBFQINAkMCFALqAWYBEQHqAfEB9AH/\n        FAAD/wHzAQcBGwGZARIBSgETAusB7AGZARsBmQJLARMB6wHsAfcBvAHwAfMB9wFtAUoBQwFtAfAB8gH0\n        Bv8OAAH0ARwBcwFLAUQBFQHsAu0B7wEHAbwB7QEVAUQBbgFzAQcB/xkAAf8B9AX/AfQB8gHwAewBbQQS\n        ARMBEgFtAesB7wHyAfQE/wP0Af8TAAL/AfMB7wEVAmYDbAFmAWwBZgESAmwCrgFtAWwCZgHvAfMC/xIA\n        A/8B9AHyAgcB7AETAUoBEwHqAesBbQGZAfMBmQFRAUsBSgFzAW0B7QH3AbwB8QHsARoBmQFzARIB7wHx\n        AfIB8wb/DQAB/wHzARwBcwFLAUQBEgLvAZIB7QHsAhUBSwEcAbwB/xoABPQD8wHyAfABBwHqAhIDEwEU\n        ARMB6gESAZIBvAHyAvMD9ALzAf8SAAL/AfQB8gHsARUBFAETAWwB6gFsAa4BuwEJArsBkQNsAa4BbAFm\n        AesB8gH0Af8SAAL/AvQB8QGZARwBbQEUARMBEgHtAQcBbQGZAfMBmQJzARIBmQFuAuwB9wEHAe8BGwGZ\n        AW0BbgHvAQcB8AHyAfMB9AT/DwAB9AEHAXMBSwFKAZIB8QHvAewBFQERAUsBHAG8AfQbAAPyAvEB8AG8\n        AQcB7wGSAW0BEgEUARUBQwMUARIBEwHrAe8BBwG8A/EB8gHxAfIB/xIAAv8B9AHzAesBFQFmARMBrgES\n        ARMCrgH3AbsBtAGuAmwBbQKuAWYBEgHxAfQB/xIAAv8B9AHzAfEBmQHwAXMBQwEUARUB7AEaAW0BmQHz\n        AZkBeQFzARIBGgFuAW0B7AGSAu8BGwGZAUsBbgHtAgcB8AHyAfMB9AP/EAAB/wEHAXMBbgFEAesB9wHr\n        ARABSgEcAe8B8AHzAfQOAAL/CgAD8AG8AQcB7wH3Ae0B7AHqARMBFAQVAhQBFQEUARIB7AHtAfcB7wEH\n        A7wB8AH/EgAC/wHzAbwBEgJmAWwBiwJsApEBtAG1AbQBbAFmAWwBiwFsAa4BbAFmAfEB9AL/EQAC/wHx\n        AXMCBwG8AfACFQFDAXMBmQFtAZkB8wEaARwBcwHrAbwBbgFtAesB7AH3AZkBGwGZAUsBbgL3AQcBvAHw\n        AfEB8gH0Av8FAAP/CgABvAJzAUoB6wEUAUMB7QEHAfABvALxAfMB9AL/CAAC/wH0Av8JAAHxArwBBwHv\n        AZIB7AHqARMBEQEVARQDFQJDAhUBFAEVARMB6gHrAe0B7wIHArwTAAL/AfMBBwNmA2wBZgFsAq4BkQGL\n        AUMBZgGLAa4BbAGLAWwBZgHxAfQC/xAAA/8BBwEaAQcCvAHwAe0BQwEUApkBbQHvAfMBGgGZAewB6wHv\n        AUoBbQHsAW0B9wHvARsBmQFLAW0B7AHrAe8BBwK8AfEB8wL/BAAC/wHzAv8HAAL/AfMBBwIcAW0BFQES\n        Ae8B9AHzAfEB8AG8AfAB8gHzAv8HAAH/AfMB8gH0Af8JAAH0A+8B9wHtAeoBFAERARABEwFsAW0BZgMQ\n        AREBtAHqAREBEAEVARIB6wHtA+8BBxMAAv8B8wFDA2YBbAGLAmwDZgFDAWYDbAGRAa4CbAFmAewB9AL/\n        EAAC/wH0AQcBGgG8AQcB8QEHAfMBEwEVAe8BmQESARwB8wEaAZkBbgHrAZkBbgHsAW0C7AHvARsBmQFL\n        AW4BcwF5AewBBwK8AfAB8wL/BAAB/wHzAvIB9AH/BgAB9AHzAbwB7wH3AhwBbQHtAf8BAAH/AfQB8wHy\n        A7wB8wH0Af8FAAH/AfMC8gH/CgAB8wLvAfcB7QHqAWwB6gGuA5EBtQFtAWYBEAEVARMBuwGRAq4B6gFt\n        AesB7QGSAu8BBxMAAv8B8gEUAUMCZgOuAZEBtAGuApEBtAEJAq4CkQGLAmwBrgHxAf8RAAL/AfQBBwG8\n        AgcB8wGZAfIBkgEVAe8BmQFEAZkB9AEbAZkBSwETAZkBcwLsAQcC7wHzAZkBcwHsAe8BmQH3AQcCvAHx\n        AfQC/wUAAf8B8wLyAfMB9AX/AfMBvAHvAgcB6gFzARwB7wH/AgAD/wHzAfEC8ALxAvQD/wHzAvIB8wH/\n        CgABvAP3Ae0B6wKuAbUBuwMJAa4BbAEQAq4BGQEJAfcEkQHtAZIB9wHvAQcTAAL/AfcBFAFDAWYB6gGu\n        AZEBrgGRAWwBZgNsAZEBrgGRAbUBuwGuAmwBrgHxAf8RAAP/AQcBGgIHAfMBvAEHAbwB6gHvARoB7QEa\n        AfQB8wEaARwBcwGZAXMC9wGZAu8B8wEaAXQB7AEHAZkB9wHwArwB8gH0Av8GAAL0AfMB8gLzAvQB8wHw\n        AbwB7wEHAfAB6wHqAQcBvAEcAQcB/wQAAf8B9AHzAfEB8AG8AfAB8gPzAvIB9AL/BQAB9ATvBPcB7QHs\n        Aa4BtQK7AwkCkQEQAbQBrgEJARkBCQO7AesB7QGSBPcCBwHyAf8PAAH/AesBFAFDAWYBrgGRArQBkQGu\n        AWYBDQFmA64BtQHcAbsBrgJsAa4B8QH/CwAB/wYAAf8B9AEHARoC7wHzARoBeQHxAfcBmQEaA/QDGwHz\n        ARoBcwHvAfcBmQLvAfMBGgGZARwBvAF5Ae8B8gHxAfAB8wH0Av8HAAH/AfQE8gHxAbwC7wEHAfIB7AHq\n        Ae8C/wEHAZkBBwYAAf8B9AHzAfIFvAHyAfMB9AcAAfQB7wL3Be8B9wHtAesBkQGuAWwBFAFmAWwBZgG7\n        AUMBuwESARMBEgFsAa4BtAGRAewBkgL3Au8E9wHxAf8OAAH/AW0BFAEVARIBrgGRArsCtAG1AbQBuwG0\n        ApEC4QG0Aa4CbAGuAfEB/wsAA/8EAAL/AQcBGgFKAXQB8wEbAZkBvAHvAZkBBwHzAfQB8AEcAXMBmQEa\n        AZkB7QHvAfcBvAGSAe0B8wEaAZkB7AHvARwBBwH0AfMC9AP/CAAC/wH0AfMB8AG8Au8BBwHxAZIBbgEH\n        Af8CAAH/AfABmQEHAf8FAAL/AfQB8gS8AfIB8AH0BwAB/wHwAfcG7wH3Ae0B7AGRAa4BbAEQARUBQwEV\n        Aa4BQwGuARUBEwERAmwBkQHsAZIB9wHvAfcF7wH3AfMPAAH/AfMB7AEUARIBbAKuAZEDtAHwARkCtAGR\n        AbsBtAGuA2wB9wH0DAAD/wQAAv8BvAEaAe8BGwH0AfMCGgG8AZkBHAG8AQcBdAFzAW4BSgFzARwD9wEH\n        AW0BcwHzARsBmQFKAW4BmQEHB/8CAAH/BwAB/wH0AfIB8AIHAfAB7wFzAbwB8wH/AwAB9AEaAZkBvAH/\n        BAAD/wHzAfID8QHwAe8B9AgAAfIG9wGSAe8BkgH3Am0BEwEVAeoDbQEQAhIBbAEVAW0BrgGRAe0C9wHv\n        BfcB7wH3Af8PAAL/AbwBFAISAWwBkQG0Aq4BtAG7ARkBuwGuAZEBuwGRAWwBZgJsAfAB/wwAA/8EAAL/\n        AfMBvAP0ARsBGgEbAfQBGgHtAfIBvAHvAZkBGwEcA+8EBwEbAfQBGwEaAQcBmQF5AQcH/wIAAfABBwcA\n        Af8B9AHzAvIBvAHsARoB8gX/AQAB9AEaAZkBBwMABP8C8wL0AfMB7AHwCQAB9AP3AZIG9wHrAWwBEgKu\n        AmwBrgEVAW0BrgKRAeoBrgHrAewB7wf3Ae8B8hAAAv8BvAEUAWwCZgFsAa4BbAFmAZEBCQEZAZEEbAJm\n        AWwB6gG8AfQMAAP/BAAC/wH0AfAB8gEbAfABdAESAXMBmQEcAesBBwG8AfEBGgEbARoE7wG8AQcD9AEa\n        AZkCGwF0AfAE/wIAAf8CAAH0AewB8gH/BgAD/wHzAewBHAG8Cf8BGgGTAbwB9Ab/AfQC/wG8Ae0B/woA\n        AQcC9wGSBfcBkgHsAeoBkQK7A5EBbAFtAbQBtQEJAfcBrgHsAe0I9wHvAf8QAAL/AbwBEwHqAWwFZgGu\n        AQkBGQGLBGYDbAHqAbwB/wwAA/8EAAL/AfQB8wHxAbwBmQIcAW4B7wLsAesB8wH0ARsBGgGZAe8BvAIH\n        AbwCBwHyARoBdAFLAXMBHAEHAfME/wIAAf8DAAHxAe8B9AgAAfQB7AEcAfAJ/wEAAfQBGgGZAe8B9Ab/\n        AQAB/wHvAfALAAH0CfcBkgHsAxkBuwGRAWYBQwETAbUDCQG1AewBkgj3AfASAAH/AfABEwHqAusDbAKR\n        AQkBGQauAmwB6gG8Af8MAAP/BAAC/wL0AfMCvAGZARsCvAEHAfAB6wHvAvQBGwEcAQcB8gPwAbwCBwEc\n        AZkBvAEcAfAB8wH0A/8DAAH/BAAB7wEHBwAB/wHvAXQB8AH/CwAB9AHvAXQBBwL/BQAB8QEHAf8MAAEH\n        AfcD7wX3Ae0B9wG7ARkBkQESAhUBEwFtAbUCCQKSBPcD7wH3AbwB/xIAAf8B8QETAW0BrgG0AbsBtQK7\n        ARkB/wEZArsDtAGRAYsBbAEUAfEB/xMAAv8C9AHyAfEB8wEaAbwBGgEHAfEBvAHtAeoBvAHyAfABvAHy\n        AfMC8gG8AfACvAHwARoBGwG8AfAB8gH0A/8DAAH/BAAB9AH3AQcB/wQAAf8BBwFuAbwB9AH/AwAC/wIA\n        AfQB/wMAAfQBBwHrAe0B8wH/AwAB8gHvAfINAAHxBe8D9wPvAu0CrgEUARUBrgFsAW0B9wPvBPcE7wEH\n        AfQTAAHyAeoBbQGRAbQBGQLiA/8D4gHcArsBkQFsAWYBbAH0Af8TAAP/AfQB8gHxAvQBGgHvAQcB8gG8\n        AQcBEwH3AbwB8AHxAe8B8gPzAvEB8AH0AfMBGgGZAfAB8wH0Af8FAAH/BAAB/wHxAbwB8AH/AgAB9AHv\n        ARIBHAHzAf8EAAH0ARwB8gK8Af8EAAH0AXMBRAHrAfECAAHzAe0B8gH/DQAB9AEHA+8F9wLvAfcB7AG0\n        AZEDrgG0Ae0BkgHvAQcF9wTvAQcB9A4AAv8DAAH/AewBbQGRAbQBCQLiA/8D4gHcAQkBtAGuAWwBZgHt\n        Af8VAAL/AvQB8AG8AfQB8gEHAfEC8wEHAusB8QHvARQB6gG8A/QB8wHyAfAB8wH0AfABHAHxAfQC/wUA\n        Af8GAAHwAgcC/wHvARABUQG8BwABmQFKAVEB8gYAAfQCSgESAe0BBwHsAfIB9BAAAfIB8AHvBfcB7wMH\n        ARIBbQGRAq4BbQG8AfMB8AG8BvcBBwHwAfEB/w4AAf8D9AH/AQAB/wEHAWwBrgGRAbsC4gX/AeIB4QG7\n        AbQBiwFsAWYBBwEAA/8B9AL/EAAC/wH0AfMB8gG8AfAB8gPzAe8BbQEUAeoB6wEcAQcBkgHyA/QC8wO8\n        AfIC9AL/BQAB/wcAAfEBkgFtAeoBEQFLAQcB9AUAAf8B8wKZAXkBBwH0Af8FAAEHAXMBFAEPAREB9wHz\n        EgAB/wHwBfcB8QL0AfADbQGuAWwBbQHwAfQC/wb3AfQB/w8AAf8B9AHyAbwB8gH0Af8BAAHyAeoBrgGR\n        AboBGQHiBP8B9AHiAeEBuwG0AYsCbAH/AQAB/wH0AfMB8QHzAv8PAAP/AvQE8wHyAbwC7AHtAQcB8AEa\n        AZkBHAEHBfQB8wHyAfMC9AP/DQAB/wHwAUMCEQESAfAB/wUAAfMCBwEbAbwBBwHwAf8FAAH/AZIBEQEV\n        ARQB7AH/EwAB8QT3Ae8B8wEAAf8BvAJtAZEBCQKRAfIC/wEAAe8E9wHvAf8QAAH/AfMBvAIHAfMB/wEA\n        Af8B7wFtAa4BugEZAeIB9AP/AuIB4QG7AbQBiwFsAfIBAAL/AfMBvAIHAfMB/xAAA/8D9AHzAQcBbQEU\n        ARwBvAHxARsB7wF0ApkB7AHwB/QD/xAAAfABEQFtARMBEgHzCAAB/wEaAfMJAAHwARQBEgGZAXMBBxIA\n        Af8B8AT3Ae8B9AEAAf8B8wGuAbsCGQEJAZIB8wP/Ae8E9wG8EAAC/wHwAQcB9AEHAfAB9AIAAf8BvAHt\n        AZEBuwHhBeIBGQK7Aa4B7AG8AgAB/wH0AfABvAHwAbwB8wH/EQAD/wH0AfEB7AHrARwB8gEbAfABBwHv\n        Am0BdAEaARwB7QHxA/QF/xAAAf8B7wFzAZkC7AG8Af8HAAH/AfIB9AgAAf8CkgEHARoBvAH/EgAB/wG8\n        AvcB7wH3Ae8B9AEAAf8B9AGuAbsCGQEJAfcB9AP/Ae8B9wLvAfcBBxAAAv8B8wG8AfABvAHyAf8DAAH/\n        AfQBvAH3AboBCQMZAQkBuwGRAfcB8gH0AwAC/wHzAfABvAHxAfQB/xIAAv8B9ALvAfIC8wG8ARwB6gH3\n        AfABcwOZAXMB7QHzAvQF/xEAAfQB8AG8AvIB8AG8AfIHAAL/BwAB9AH3AQcC9AHxAfQTAAH/AbwB9wTv\n        AfQBAAL/AewBkQEJARkBCQHwAf8CAAH/AfcF7xIAAf8B8gEHAfIB9AH/BgAB/wL0Av8LAAL/AfQB8gH0\n        Af8TAAL/AfQB8wLxAQcBEgHtAfABvAEaAfMB8AEaAZkBGgGZARIBBwL0Av8VAAP/AQAB9AHwAfQB7wH/\n        DQAB8wHsAfEB/xgAAfAC7wMHAfQCAAH/AfMB7wHsAfcBBwH0BAAF7wG8EgAC/wHzAfQB/woAA/8MAAH/\n        AfQB/xQAAv8B9AHzAfEB9AG8AZIB7wHwAfMB8AHxARIBHAGZARoBmQHsAe0B9AP/GgAB/wHyAfEB9wEH\n        AfIB9AcAAf8B8wHyAewB8QH/GQAB8gPvAQcBvAH/BAAB/wLzAv8EAAEHBO8B9BMAA/8JAAP/AfQD/woA\n        Av8VAAL/AfQB8wLyAfQB8gH0AfMBHAHrAbwB7QEcApkBvAEHAfAB9AP/HAAB/wH0AfIBBwG8AfMEAAH/\n        AfIB7wH3Ae8B9AH/GgAB9AEHAu8BBwH0DgAB8QPvAfEgAAH/AfQB8wHyAfMB9AH/IgAB/wH0AvMB8AHz\n        A/QBbQHvARwCGgEbAbwB8QHzAvQC/yEAAf8B8wMAAf8BvAH3AfAB/x8AAfMB8gH0EAAB9AHyAfMB/x8A\n        Af8B9AHyAfABBwG8AfIB9AH/IQAC/wH0AfMB8QT0AQcBGwHwAfEBBwG8AfIB8wL0Av8pAAH/VwAB/wHz\n        AfABBwG8AQcBvAHyAfQB/yAAAv8C9AHzAfAC9AHzAfQB8gHwAfEB9wHrAfMC9AP/gQAB/wHyAQcBvAH0\n        AgcB8AHzAf8gAAL/A/QB8wP0AfAC8wHyAfEBFAHzAvQC/4IAAf8B8wHxAQcBvAEHAbwB8wL/IQAD/wL0\n        AfIB8QHzBPQB8gG8AfQD/4MAAv8B8wHxAbwB8AHzAfQB/yMABP8D9An/hQAC/wH0AfIB8wL/JQAI/40A\n        Bf8pAAL//wD/AP8AkAAI/7MABf8J9Ab/GAAB/wMAAf8WAAP/dAAC/wL0AvMB8gHxB/AB8gLzA/QD/xYA\n        Af8BAAT/EwAF/1gAAv8ZAAH/AfQC8wHxAvABvAHvAewB6gQUAewB9wEHAfAD8gHzAvQB/xUAAv8B9AP/\n        EwAB/wH0AfMC9AH/RAAT/wH0A/8WAAH/AfQB8wHxAbwBBwHvAewBEgFDARUBEQQVAREBQwEUAe0B7wHw\n        A/EB8wH0A/8SAAL/AfQB/wH0A/8PAAL/AfQB8wHyAfEB8wH0Af9DAAH/AfEB8gHzDvQB8QG8AfIB9AH/\n        FQAB/wH0AfMB8AEHAe8B6wEUARIB6wFtAeoGEgHrAW0CEgHrAQcBvALwAfEB8wL0Af8RAAL/AfMB/wP0\n        Av8JAAb/AfQB8wHxArwB8QH0Av8VAAH/DgAD/xsAAfMBcwHvB/IC8QPyAfMB8gHwAesBRAHvAfIC/xQA\n        Af8B8wHwAe8B7QETARIBBwHyAbwB6wHqBRIB7AHvAfcB7QHsARIBFAGSBPAB8QHzAfQC/xAAAf8B8gH/\n        AfQC8wH0Af8FAAT/BPQC8wHyAfADBwHwAfMB9AH/FAAB/wH0Bv8DAAX/AvQB8xsAAf8BmQF5AQcBvAEH\n        A+8EBwS8AfcBRAGZAe8B8gH0Av8SAAL/AfIBBwHtARIB9wHwAbwB7wHwAe8BEgHqBBIB7QGSAbwDBwHs\n        ARMB7AEHBPAB8gH0Av8PAAH0AfAB/wH0A/MB9Af/AfQB8wHyBPEB8AEHAfcC7wEHAbwB8gH0Af8TAAH0\n        AfID8wHyAfMB9AUAAf8B8wHyAfMC8gLxAf8aAAHzAZkBeQHvAfcC7AHtApIB9wQHAe8BbQF0AgcB8QHz\n        AvQC/xAAAf8B9AHxAe0B6gEHAfMCBwHvAgcC6gMSAesC7QHvAbwBBwHvAQcB7AEVAewBBwLwAbwB8AHy\n        AfQB/w8AAfQBvAH0Af8B8wHyAfEB8gbzAfIB8QG8AgcE7wLsAfcB7wEHAbwB8gH0Av8RAAH0BbwBmQG8\n        AfMFAAH/AgcDvAEHAfcB8QH/GQAB/wHwAXoBcwHsAeoBEwIQAhEB6gHvArwBkgFuARoB9wEHAvAB8gHz\n        AfQC/xAAAf8BvAESAQcB9AIHAfcD7QHsAm0CEgHtAuwC7QHsAe8BkgHvAesBEwHtAQcB8AG8AQcBvAHy\n        AfQB/w4AAfQBBwL/AfMB8gfwAbwBBwPvAu0C7wGSAeoB7AH3AQcBvAHxAfIB8wH0Af8QAAH/AfcB7QH3\n        Au8BBwGgAZkB8gUAAfQBkwKZAe8CHALtAfMWAAT/AfEBGgF0AUoBRAVLAUoBRAFKARIBRAF0Ae8BBwPw\n        AbwB8AHyAfMH/woAAfQBEgGSAfMBBwG8Ae0B9wHtAewB7QHsAm0B6gFtAfcB7ALrAe0BbQHrAuwB6wHq\n        ARMB7wG8AfACvAHwAfMB9AH/DQAB9AEHAfQB/wH0AfIB8AK8AwcB7wL3AZIF7QHsARQB6gHsAfcBvAHw\n        AfEB8gHzAfQC/w4AAf8BBwFuAewB7QEcAe0BmQGgAZkB8gUAAfQBkwGaAZkB7QHsAe0B7AHrAZIB9BUA\n        Av8C9AHxAXMBegF5AXQEeQF0AXMESwFzAQcB8QLyAfABvAEHAbwB8AHyAfME9AL/CQABBwETAfABvAIH\n        AewB7wP3AewBEgJtAesB7AGSAuwBkgHsARQBkgHtAesB6gETAewBvALxAvAB8gH0Af8NAAH0AQcB8wL/\n        AfMB8QPwAQcB7wH3Au0C7AHtAuwBbQEUAW0B6gFtAZIB8QLyAfMC9AL/DgAB8AFuAusBbgFzAW4BmQGg\n        AZkB8wUAAf8BkwGaARoBcwFuAXMBbgFtAW4BHAH/FAAB/wH0AfMB8AHsAXkBoAGaARoB9wLvAbwBBwHv\n        AZIBcwFRAksBkgHwA/IB8AQHAfAC8gLzAfQC/wcAAfQBbQH3AbwCBwLtAe8C8AIHARICbQLqAZIC7wEH\n        Ae0BEQGSAgcB6wISAbwC8wHxAfAB8gH0Af8NAAHzAe8B8gEAAf8B9AHzA/EB8AEHAfcB7AQUARUBEQEV\n        AW0BcwESARQBkgHyA/MB9AP/DQAB/wHtAm0B6wFuAeoBbgGZAaABmQH0BgAB7wGaAcMBmQJuAW0CEgFt\n        AfAUAAH/AfQB8QFzAXkBoAEbAfcB7AHtAe8BvAPyAbwBBwH3AXMCSwHvAfED8gHwAQcC7wEHAbwB8QHy\n        AfMB9AL/BwAB8QETAQcB8AHyAbwB6wGSAbwBBwHyAfEBBwETAe0B7AHrAeoB9wLwAu8BEQHsAfEB8wEH\n        AW0BEwGSAfMB9AHyAfEB8gH0Af8NAAH0Ae8B8AH0Av8B8wPyAbwB7QFtBBQCFQEUAesBdAFzAeoBFAHs\n        AfID9AL/DwABvAHqAW0BSgHqAm4BmQHDAZoBmQH0BgABvAGZAsMBcwFuAW0BSgFtARIBkgH/EwAB/wH0\n        Ae8BdAGgAfQBBwHvAXMBHAHvAQcB8QHyAfMBBwEcAQcB7QJLAW4B8APzAfIB8AEHAu8B8AHyAfMB9AP/\n        BwAB7AFtAe8C9AG8AeoC7wH3AbwB7wH3Ae0BuwH3AewBbQHsAe8B8AGSAe0BEQFtAfAB/wH0Ae0BbQHs\n        AfMB9APzAfQB/w0AAfQB7wHsAe0BBwHwAfEB8AEHAfcBbQISAeoBbQESARQBFQEUAW4BeQJzARIBQwES\n        AfIB9AT/DgAB/wHtARIBbgFKARICbgIaAZoB8AH/BgAB/wGTAZkBwwGZAW4BbQFEAW4BbQHrAfITAAH/\n        AfIBSwF6AcMBvAH0AfIBBwGZAgcBvAHxAfIBHAG8AfABBwFzAksBHATzAfEBvAEHAbwB8QHzAfQC/wgA\n        Af8BFAHsAQcBAAH/AewB6wH3AewC7QH3AewBBwHwAbsB7QHrA+wBbQETAREBEgH3Af8BAAHxARIB6wG8\n        AfQC8wH0Af8NAAH/AfQB7wHrARQCFQLqARUBEgHqA20BEgEUARUBFAHqAZkBegFzAesBEgEVAUMB7wH0\n        Av8QAAHwARIBbgFzARQBEgFuAcMCmQEcAfQCAAHzAu8B9AH/AQABvAGTAZkBwwGTAW0BRAFuAZMBEgHv\n        EwAB/wEHAXQBoAHwAv8B9AHzAbwBmQHxAvABHAGZAfABvALwAW4BSwFzAfEC8wHyAfECvAHwAfMB9AL/\n        CQABBwEUAewB8wH/AfIBFAH3Ae8BvAHvAe0B9wHtAfMB9AHwAbsB7wHtAW0BFAISAeoBEgHsAfIB/wHy\n        ARUB6wEHA/QC/w0AAf8B9AEHAfcB7ALrAW0B6wHsAe0B7ALrAW0BFAITAeoBHAJ5AusBEgEUAUMB6wL/\n        EAAB/wHvAW4BmQFuAUQB6gSZAe0C/wG8AewB6wLqAQcBAAHyAZMBGgGTAZkBbgFEAUoBmgFzAW4B9BIA\n        AfQBcwF5ARoB8wEAA/8B8QGZAfAB8gEcAZkDBwG8AfEBBwJLAQcC8gLxAfAB8QHyAfQC/woAAewBFAHs\n        Av8B7QHsAe0BkgG7AbwB8QK8AvQB8wHwAbsBkgHrBG0BEgFtAQcB9AHzARIBbQHvAvQC/w4AAf8B9AEH\n        AfEB8wH3AZEB6wHsAfcBBwGSAewBbQETARIBSgFuAZkBGgHtAXMBbgFtARMCFAHqAfMRAAH0Ae0CmQHq\n        AUQBcwEaARwCkwHyAQAB8QETAeoC7AFtARMC9AEcAZkBHAKZAeoBRAEcAZkBcwHwEgAB8wFuAXkBGgH/\n        BAAB/wHxAQcB8wIHAfEBvAEHAbwB8QHyAXMBSwEcAvIC8QLyAfMB9AL/CgAB7AETAewB/wHzARQB7QHr\n        AewB9wG7AbwE9AHyAfMBvAHvAfcC6wFtAxIB6wHwAfMB7AFtAQcD/w8AAf8B9AEHAfIBAAH3AbsB7AGR\n        AbsBBwHsAW0BEwEUAUoCdAGZAQcB7QHsAesBEwIUAUsB7AHxEQAB9AHtAZoBkwISApMB8QHvAQcBAAH/\n        AZIBFAHqAe8B7AETAREBkgH/AfABkwG8AZMBmgFuAUQBbQGaARwBvAwAAf8B8QEHAbwB8QHzAbwBSwF0\n        ARoFAAH/AfMB9AHxAfIB8wHxArwB8AHyAfMBBwJLAe8BvAEHAu8BBwHzBP8JAAHsARIB7AH/Ae8BbQHs\n        AesB7AHtAe8BBwHyAfQB8gHxAfAB8QHyAbwBBwHvAe0B7ANtAewB8AHzAewBbQEHAv8QAAH/AfQB7wHy\n        AQAB8QG7Ae0B9wHvAfcBbQETARUBSgF0A3MBdAGZAe0B6gETARIBSwF0ARwB8wH/EAAB9AGTARoB6wEU\n        AW4BmQFzAfQBkwHwAf8B8wFtAeoB7QG8AQcB7AEUAW0B9AHyAZkBvAEcApkBSgEUApkBBwsAAf8B8QFt\n        AkoESwF0ARoB/wHzArwBBwG8AfQB7wEcAZkB8wEcBOwB8AHyAksFSgFzAfAE/wkAAewBEgHsAf8B8AKS\n        A+wB9wK8AfIB8QHvAfIB8wLwAbwBuwH3AuwB9wIHAfAB9AHsAW0BBxIAAf8B9AEHAfIC/wGSAbsC9wHt\n        ARIBFQEUAUoBSwFzAW0B7AF5AZkB7wHsAesBcwKZAfEB8wH/EAAB/wEHAW4CFAKZARwB/wGTAQcB/wHy\n        AW0B6gHsAbwB7QLqAesB9AHwAZkBvAEHAXMBmQHqAUMBSgF0AfMMAAHwARwEmQFzAVEBdAEaAQAB8wLw\n        ArwB9AG8AfQBwwH/AQcC7wMHAfMBbgFRBRwBmQHwBP8JAAHtARIBbQH/AgAB8gEHA/cBBwH/AQcBkgHr\n        AbwB8QG8AQAB9AEHAbwC8wHwAfMCAAH0AeoB6wG8EgAB/wH0Ae8B8gL/AbwB9wGRAewBbQEUAREBRAFK\n        ARIB6wHqAewBHAF0AXkCmQGgARoBmQH/AfMB/xAAAf8BvALrARwBmQFuARwB/wGTAQcB9AG8ARMB7QPz\n        AfAB6wESAfQBvAGZAbwBBwGTAXMBkwJuAXMB/wwAAf8D8wL0AQcBSwFzARoFAAL/AfQC8gEAAv8B9AIA\n        Af8B8wFLAXkB8wL/AfQC8wH0DQABBwHqAW0B8wQAAfQB8gHwAfEB/wHyAfEB8wHtAbwB8QIAAfEB8wHy\n        Av8CAAH/AfIBEQHtAfESAAH/AfQBBwHyA/8B6wLsARMBQwERARQBEwESAesBbQGRAe8BUgF5ApoBeQKZ\n        A/8QAAH/ApkBBwGZArwBkwHzAvEB9AHwAesCHAGZARoBCAEcAesB9AHzAbwB8wEHAZMBvAGZARwBvAGT\n        AfQNAAT/AQAB8wJLAZkB/wQAAf8B8QHzAf8BAAHxA/8CAAH/AZIBSwG8Af8FAAH/DQAB/wLqAe8GAAL/\n        AgAB/wH0AfMB8gHzAgAC/wYAAbwBQwH3AfQSAAH/AfQB7wHyAv8B9ALrAeoBFQIRARUBFAESAusBuwEc\n        AXQBeQF6AXkBvAHzAQcD/xAAAf8BBwGZAbwBHAHvAfMBkwEHA/QB8AEHA5kCGgGZAe8C8wH0AfEBkwHv\n        AfIBHAEHAbwBkwH/EgAB9AFzAUsBcwH0BAAB9AG8AfQBAAH0AQcB9AQAAfMBRAF0AfEVAAGSAW0BEgH/\n        FwAB/wHrARIBBwH0EgAB/wH0Ae8B8gL/AfQBbQHqARQBQwERAhUBFAESAW0B7AH3AXkBUgFMAVIBHAG8\n        Af8B8BQAAfEBdAEHARwBdAHxAgcD8wG8ARoDCAMaAbwB8gLzAfABkwHzAe8BkwEHAZMBBxMAAf8BHAJL\n        AZkB/wIAAf8BvAHzAwAC8QH/AgAB/wHrAUsBmQH0FQAB8QFtAeoBBxcAAfIBEgH3AbwB/xIAAf8B9AHv\n        AfIBAAL/AeoBEgEVAhEBFQEUARIB6wHvARoBmQF0AVIBSwF0AhwBAAHzFAAB9AGTAZkB7wGZAQcB8wH0\n        AfMB8gHxAbwBGwH0ARsBGgMbARoBvALyAvMB8QF0AZMBBwGZAfEUAAHzA0sB8AIAAbwB8AH/AwAB/wLx\n        Av8BHAFLAXkB8AH/FQAB9AHsAesB7AH0FQAB/wGSAesBBwHzAf8SAAH/AfQB7wHyA/8CFAEVAUMCFQET\n        AewBCAHDARoBeQFLAlICHAGZAQAB9BQAAf8B7wGTARwBkwEHAvQC8gG8ARsB9gH0ARsE9AH2AfIB8ALy\n        AfMB8gF0ARwCkwH0FQABvANLAfQBAAGgAfMFAAH0AfMBAAEHAUsBeQGZAfQXAAEHAesBEgEHBwAB8gH/\n        BAAB8wH/BgABvAHqAbwB8AH/EwAB/wH0Ae8B8gMAAhQDFQESAesBmQEbAaABmQEcAksBUgEcAbwBmQH/\n        FgAB9AEcAQcB8QHzAfQB8wHyAbwB9AL2A/QF9gHwAfEB8gHzAfQB8QG8AXQB8AH/FQAB/wGZAXMBSwFz\n        AfID/wQAAfQB8QHvAVEBeQEaAfMB/xcAAf8B7AFtARIB8QH/BQABbQHyAwAB8gHsAfQEAAH/AfEBEgEH\n        AfEB/xQAAf8B9AHvAfICAAH0ARUCQwEVARIB7AEcAZkBeQKZARwBUgFLAVIB7wG8AZkB/wIAAv8TAAHz\n        A/QC8wHxAfAB9gH/BvYD/wH0AbwB8QHyA/QB8QH/FwAB/wGZAVECSwEcAe8BvAHwAfIB8QG8AhwBmQGa\n        ARoB9AH/GQAB9AHtAW0BEgG8Af8EAAHrAfMDAAHyAfcB9AQAAfEB6wEHAfIB8xUAAf8B9AHvAfICAAFt\n        AhEBFAFtAe0CHAF5AVIBvAIcAXQBUQFSAQcB8AEcAwAC/xMAAv8C9AHzAfIB8AEbAf8D9gf/AfYBvAHx\n        AfIB8wL0A/8YAAEcAUsCUQF0AVEBdAFRAXMBeQGaAqAB9AG8AfQbAAHxAewB6wETAQcB/wMAAesB9AMA\n        AfIB9wH0AwABvAFtAQcB9AHyAf8VAAH/AfQB7wHyAgACEQEVAW0C7wFLAbwBBwEcAfIB8AG8ARwBcwEc\n        AQcB8AEcAwAC/xMAAv8C9AHzAfIBvAEbAf8D9gj/AbwC8QHzAvQD/xcAAfQB7AGZAbwBmQEcApkCmgMa\n        ARsB8gK8Af8aAAH/AfAB9wHrAeoB7QHyAf8BAAHsAfMDAAHyAfcB9AH/AfMB9wHsAe8B8wHxAf8WAAH/\n        AfQB7wHyAQAB8AERARQB7AHvAZkBHAFLAfIBvAH/AfQB8QHvAxwC8wEcGAAC/wL0AfMB8gG8ARsB/wL2\n        Cf8BGwHwAfEB8wL0A/8WAAH/AfcBSwG8AfQB/wH0AvMC8gHzAvQB/wH0AfABGgHyAf8aAAH/AfQB7wHs\n        AesB6gHtAbwB7AHzAwAB8gGSAQcB9wFtAfcB8gHxAfMB/xcAAf8B9AHvAfEB/wHsARQB7AG8AfQB8wG8\n        Ae8B/wHwAv8B9AG8AZkBHAHvAQAB9AEcGAAC/wL0AfMB8gG8ARsC/wH2Bf8D9gH/AbwB8AHxAfMC9AP/\n        FgABvAFEAaAB/wsAAf8B8wHyAbwB9BwAAf8B8AEHAbsB9wESAesB8wMAAfIB7wHsAfcB9AHzAbwC/xgA\n        Af8B9AH3AfIBvAETAfcB8QH/AgAB9AIAAfIBAAL/AfMB9AEcAbwCAAHzGAAC/wL0AfMB8gLwAvYB9AH2\n        BP8B9gH0AvYBvAHxAfIB8wL0A/8UAAH/AfQBHAFzAbwNAAH/AfABvAHwAf8cAAH/AfQB8gHwAQcBvAH0\n        AwAB8gEHAfAC8gHzAf8aAAH/AfQB7QLqAQcB9AQAAfQCAAH2AQAC/wEAAfQBmQHzAgAB9BgAAv8C9AHz\n        AfIB8QG8ARsC9AX2AfQBGwH0ARsBvAHxAfIB8wL0Av8VAAL/ARwBmQH0DgAB/wHwAfEB/x4AAf8C9AHx\n        AfQDAAH0AfAB8wH0Af8cAAH/AfQB9wHsAfEB/wUAAf8EAAL/AQAB9AEcAf8bAAL/AvQC8wHxArwBGwH0\n        BfYB9AIbAbwB8AHyAfMC9AP/FgAB/wH0AfMB/1oAAfMB7QHyDwAB/wHwAwABvBgAA/8C9AHzAfIB8QHw\n        AbwBGwHDARsB9gP0ARsBvAHwAvIB8wH0A/91AAH0Ae8BvBAAAfYDAAH0GQAD/wL0AfMB8gHxAfABvAIa\n        AxsCvAHxAvIB8wL0A/91AAH/AbwB9C4AA/8D9AHzAvIB8QLwArwB8AHxAvIC8wL0A/+pAAL/BPQD8wPy\n        A/ME9AT/qQAF/wz0Bf+rAAn/AvQI/7EADP+4AAL/AQAC//8A/wD/AOsACv9+AAf/DwAG/xsADP9YAAX/\n        HwAD/wP0A/8NAAf/GgAC/wn0Av9VAAP/BfQF/xkAAv8B9APyAfMB9AT/CgAC/wH0AfMD9AL/GAAC/wH0\n        CvMC/y0ABf8fAAP/AfQB8wHyAfEC8AHxAvIC8wP0Bf8SAAL/AfQB8gG8Ae8B9wEHAfAB8wb/BwAB/wH0\n        AfMB8AHvAfAB8gT/FgAC/wHzAfEF8AK8AfAB8gH0Af8rAAL/BPQB/wIABv8XAAH/AfQB8wHxAQcB7AJt\n        ARIB6gHsAQcCvALxAvIB8wL0Av8RAAH/AfQB8gEHAesC7AHqAe0BvAHzAfQE/wcAAf8B9AG8AfcBkgHs\n        AQcB9AP/FgAB/wH0AfEBBwXvAfcB7wEHAbwB9AH/KgAB/wHzAbwD7wHwAfQC/wH0AvIB8wL0Af8WAAH0\n        AfMB8AHrAUQBSgFEAREBFQERAg4BFQHsAu8CBwG8AfEB8gHzAf8SAAHzAfABbQEHAewBFQEUAeoB9wG8\n        AfIB9AX/BAAC/wHzAewB6wH3AesB7wHyBP8VAAH/AfQBBwGSAe0G7AGSAQcB8wH/IAAG/wQAAf8BBwHr\n        A0oBkgHzAf8B9AEHAewBbQHsAbwB9AH/FQAB/wHzAfcBFQFKAUsBcwEcAZMBHAHsAesBSgEUAhABQwFt\n        AesBkgHvAQcB8QH0Av8OAAL/AfQBBwEcAfMB7AFDARQC6wH3AbwB8gH0Cf8B9AHzArwB8AHvAQcB8AL0\n        BP8TAAH/AfMB9wHsAesBbQLqARIBbQHrAewB7wHzAf8fAAH/AvQB8gEHAfIB9AL/AgAB/wG8BJkBcwH0\n        Af8B8AGZAnMBbgESAfMB/xUAAfMB6wFKAXMBmQEaAfQDGwGZARoBGwG8AZkBcwFKAUQBEQEVAewB7wHw\n        AfMB9AH/DgAC/wHzAQcB6wGSAeoCQwHtAuwB7wEHAfEB9Af/AfQB8wHwAQcBkgG8Ae0BBwHxAfIB8wH0\n        A/8SAAL/AfMB7AFtAeoDEgEUARIBbQHqAfcB8gH0Af8dAAH/AfQB8wHwAe0BEgHsAfEB8wH0Af8BAAH/\n        AbwBmgEbAfQBGgEHAfQBAAEHApkBGgGZAUsB8wH/FQABSgFzAZkC9AEbAxoB9AGZAUQBFQFKAXMBmQEa\n        AZkBdAFLAu0BBwHxAfMB9AH/DQAB/wH0AfIB7wHrAQcB7AESARAB7AHxARIB6wH3AQcB8QH0Bf8B9AHy\n        AfAB9wHvAbwB8AHvAewBBwLxAfIB9AL/DwAD/wH0AfIBvAHrAuoBEgETAhIB6gFtARIB7AHwAfMB9AP/\n        FwAD/wHzAfEBBwHvAZIBFQFDAesB8AH0Af8BAAH/AfMBvAHwAfIB8AHxAv8BBwEcARoBGwEaAe8B/xYA\n        AfECGgIbBRoB9AGZAUoBEQEQAREBRAFKAW4BHAHvAe0B7wG8AfIB9AH/DAAB/wH0AfIBBwHvAewBkgEH\n        Ae0B6gFtAfABHAESAewB9wHvAfAB8wH0A/8B9AHwAe8B8AG8AwcB7wHsAZIB8AHxAfQC/w4AAf8B8QHy\n        AfMB8gG8AesBFAISARMBFAETAhIB6gESARQB7QHwAfIB8wHwAfIB/xYAAf8B9AHzAQcB9wGSAvcBFQEP\n        AUMBkgHxAfQB/wEAAf8C9AHzAvQC8wHxAwcB8AH0GAAB9AHyArwBHAGZBBoBGwHxARwBRAFDAhEBFQFu\n        Au0B7wEHAfEB8wH/CwAB/wH0AfMBvAHtAZIB9wHrAgcBkgHqAe0B9AFtAeoB7AHtAe8B8AHzA/QB8QG8\n        AfcB7wEHAu8BBwLvAewB7wHxAfMC/w0AAf8B8gEHAfIB8AEHAZIBFAEVAhMDFAITAhIBQwESAe8BBwHx\n        AbwB6gHxFQAB/wH0AfIC9wHtAewC7wHtAUMBDwEQAewB8AH0BgAB8wEHAuwBvAH0Af8dAAH0ARoBHANK\n        AW4CHAEbARoBdAJKAVEBBwGSAe0B7wEHAfEB8wH/CwAB/wH0AbwBEgHvAesBFAFtAesB8AEHAewBEgHw\n        AQcBFAFtAuwB7wHwA/IBBwHvAbwBBwHtAe8DBwEcAQcB7AHwAfQC/w0AAvIB8AHyAQcB7QFtAQ8BEgJt\n        AesCQwIUARIBbQIVAesBkgG8AfIB7AFtAfMSAAL/AfQB8AHvAe0B7AHtAfcB7wLtAewBFAEPAUMB9wHy\n        Af8EAAH/AbwBcwFKAUQBSgHvAf8eAAHzAXMBDwEQAQ8BFQFKARUBSgGZARsBmQF0AZkC9wLvAQcB8QHz\n        Af8KAAL/AfMB7ALvAW0B7ALrAe8B8AEcAW0B7AHyAewBbQPsAe8BBwHwAe8BvAHxAbwC8AH3AZIB7wEH\n        AfcBBwHtAfID/wwAAf8B8QLyAfAC7AFtARIB6wHsAfcB7AJDAhQB7QHsAesBbQHqAewB7wHyAQcBbAHs\n        Af8RAAH/AfQB8AH3Au0B9wHsAvcE7QESAQ4BFAHvAfMB/wIAAf8B9AEHAZkBHAF0AXMB7AH/HgAB/wG8\n        AewBbgHqAUsBRAERAUMBHAF0AUQBSgFEAesB7wIHAbwB8QHzAv8JAAL/AfMB6wEcAewBbQG8AQcC6wHw\n        AQcB7QESAe8B8AETAuwB6wHsApIBBwHwAbwBBwG8AvAB7QTvAfcB8wH0A/8LAAHvAfQB8AHzAbwC6wK1\n        AQcBvAH0AbUB6gEUAuwCvAEHAewD9wLxAa4BtAG8EQAB/wHzAfcB7QH3AfABkgETARIB7AHtA+wB7QFt\n        AQ8BEAEHBfQB7wF5ARoBGwGZARwB/yAAAfQB8QEHAfcB6gEVAUMBcwEVAUMBcwEQAUMB7QIHAbwB8AHy\n        AfQB/wkAAv8B8wJtAewB7wHxAfMC7AHvAfABBwLrAfIB7wLtAfcB6wLsAbwBBwHwArwB8QHwARwB6wHv\n        AbwB7AEHAfIB9AP/CgAB9AGRAf8B8AH0AfIC9wG8Ad0D/wEHAW0BEgEHAfcBvAH/AfQBvAK1AfcB9AHz\n        AesBrgHvAf8PAAH/AfQB8gH3Au8BuwHtAhEBFAFtAewC9wLtAeoBEAEUAQcC9ALzAbwBmQEbAfMB8AHz\n        Av8fAAP/AfQBvAIRAXMBRAERAZkBSwFuAQcD8AHxAfIB8wL/CAAC/wHzAe8B7QHwAfMB8QHwAfcB7wHs\n        AQcBvAEcAW0B7wHzAesBkgH3AZIC7AEHAe8CvAHwAQcB9wEHAeoBBwG8Ae8B8AHxAfIB9AL/CgAB8AG0\n        Af8B8QH/AfQB7wEHAe8BkgP3AW0BBwHrAfIB7QHsA/cBtQHdAbwC9AHsARMB9wH0DwAB/wHzAfAB7wEH\n        AfcBBwHwAfcBFAEPARUBEgHsAvcB7QLsAUMBFAHvAbwBHAJzAe0BvAHyAfQBAAL/IQAB8wH0AfIBEAER\n        AW4BcwEVAW0BmQEHAfAB8QTyAfMB9AH/CQAB/wH0AfAB7QHwAfQB8AHsAe8BHAG8Ae0B8AG8Ae0B6wHx\n        Ae8B9wEHAfcB7QHsAe8BkgHvAQcB8AG8Ae8B8QFtAfAC8gHxAfIB8wH0A/8IAAH/Ae8BiwHwAgcB7wHt\n        AQcB7QHrA0MBFAH3AewB/wHtARUBZgESAewB9wEHAfcC7wFtARUBrgHxDgAB/wH0AfIB7wG8AfcBvAHz\n        AgcBvAHsAhABFAFtAe0B9wHtAewB7QEVAREB9wGaAksBSgHsAfMB9AIAAf8dAAL/AfAB7AHqAewBbQEQ\n        AUoBHAEaAZkBGgEHAfAD8gPzAfQC/wkAAf8B9AHzAe8BBwHzAfEB6wEcAewB8QLvAfAB7wHqAewB8gHs\n        AbwBBwHvAfcB7wGSAe0B7wEHAfEBBwHxAfcF9AT/CQAB/wHsAWwBrgSRAu0BbQERAuoBEgHqARMB6wES\n        AW0BEwHrAewB9wHtAWwDEwEUAesBvA4AAf8B8wEHAe8B9wG8AfMB9AHwAwcB7wHqAhEB6gLsAW0C7AET\n        Ae8BGgNLAesB8AHzAfQBAAL/GAAC/wH0AbwB7QFtAkoBSwFKAUQBEQFKARwBmQHyAfMB8AHyAvME9AP/\n        CgAB/wH0AfABbQHxAfQBBwHtARwB7QHxAfcB8wHwAe0BEgLvAewBvAIHAe8B9wLsApIDBwHzAvQH/wgA\n        AfQB6wKuAZECtAG7Ae0B7AFtARQC7AISAhMBbQHqARMBbQHtAfcBkQGuAW0B6gFtARQBbQEHDgAB/wHx\n        Au8B8QHyAfQD8wO8Ae8BkgETAQ8BQwEUARMB6wH3AZIBmQEaA0sBEwHtAbwB8wEAAv8YAAH/AfABbQES\n        AUsCHAGZARoBmQEcAW4CFQFLAfIB8wHyAfMD9AT/DQAB/wHzAQcB9wH0AfICHAHrAfEBBwH3AfIBBwJt\n        AQcB7AEHAfABBwHvAgcB9wHvAfABvAHvAewC8AH0CP8HAAH0Ae8GGQEHAesB6gH3AuwG9wHrAbUB6wH3\n        AgcDtQLvAbwOAAH/AQcB9wHyAfEB9AHzAbsBBwT0AfAB9wEHAesBEQFDARIB7AH3AesBvAH0AXQBSwFK\n        AREBRAFLAewD/xgAAf8BvAHvARoBGwb0ARoBSgFDAXMB9AHzA/QD/xAAAf8B9AHyAewB8QH0AQcBHAGZ\n        Ae8B9AHrAvEB7wESAZIBvAHrAfAB8QG8AgcC7wIHAbwB7AHrAe8B8wj/BQAB/wG8Au8GBwHvAe0BuwHz\n        AvcBEgEVARMCEgH3Ae0B8AG8AbUCuwMHA+8BBwHwAf8LAAH/AQcCvAH0AfMB8gG8AfAB8gHwAfMC9AHx\n        Ae8B9wGSAeoBFQETAeoBbQG8ARoBTAJLAREBRAFLAUMB8gP/GAAB/wHzAfIB8QHyAfEBGwHyARoB7wFL\n        ARUBQwEcAfQB8wH0BP8RAAL/AfMB9wHvAfQB8gEcAQcB7QHyAfMB7QHzAfEB7AHqAQcB7AHvA/EB8AHv\n        AwcB9wK8AfAB8gH0B/8FAAHzAeoBbAFtA2wCrgGRArUBCQH/Au8BFAEPAkMBFAH3Ae0B9AHxAbsBtQGu\n        BmwBEwHtAf8LAAH/AfEB7wHtAQcCvAHxAfMB8AEHAbwB9AHzAfQB8gEHAe0B7wH3AeoBFAETARsBGgFM\n        AksBEQFKAUsBIgHyBP8ZAAL/AQAB9ALzAbwBBwHvARUBQwEcAfQBGwP/EwAC/wH0AfAB7QHzAfQBvAHv\n        AewBvAH0AQcBvAH0AQcCbQEcAewBvAHxAfIB8wLxAbwBBwH3AbwB8gHxAfAB8wf/BQAB8wNtA2wCrgGR\n        AbsCGQHtAbwBBwEVAg4BQwEUAfcB8AHzAfABGQG7AbUB7QJsAxIB6gH3Af8NAAH0AfAB7QHvAfAB9wG8\n        AfIB8AHzAvQBvAHsARIB6gHtAvIB7AEUAe8BwwFMAksBEQFKAUsBEQHwBP8dAAT/AfQB6gFDARwB9AEb\n        Af8WAAH/AfQB8wH3AbwB9AHyAZkC9wH0AfMB7wH0AfMBHAEUAewB6wH3AbwB8QHyAfMB8gHxAfABvAIH\n        AbwB8AHzBP8IAAH0AW0CbAHqAe0B7wQHAvQBvAEHAe8B6gEUAhIBbQHvAfcB8AHzAhkB4QG7AZEBbQNs\n        Ae0BBwH/DgAB/wHyAQcC9wEHAfAB8QH0AfMB8AHsARIB7AHtAZIBvAHsAeoBEgG8ARoBUgFLAUoBQwFK\n        AUsBEQG8AfQD/x0AAv8DAAHrARABHAHzAfIB/xcAAf8B9AHwAewB8wH0AQcB7wHsAfIB9AIHAfQB8QHr\n        ARIB7AESAe8B8AHyAfMB9AHzAfIB8QLwAfEB8gH0A/8JAAH/AewCbAHqAfcBvAbwAbwB9wHtAewB6gHt\n        ARIB6wLvArwB8ALxAvAB7AFsAYsBkQHyAfAB/xAAAfQB8QHvAewB7wG8AfEBvAGSAewB7wG8Ae8B7AFu\n        AeoBEgEUAZkBwwF0AksBIgFKAUsBEQEHA/8aAAH0Af8BAAHzAfcBHAMAAZIBFQGZARsB8wH/FwAB/wH0\n        AfMB7QG8AfQBGwHvAu0B9AHzAe0B8gH0AQcCEgHrAewBvAHyAfQC/wXzAvQD/woAAQcCbAHqAWwBvAUA\n        Af8B9AHwAe0B9wESAewBEwHsAfcB8QH0Av8DAAH/AZIBbAGRAbQB/wHzFAABBwHsAe0BvAHvAe0B9wEH\n        AfABcwFKAesBbQISARwBwwF0AUwBSwERAUoBSwERAbwB9AL/GAAB9AG8AZIB9AHvARUBEQFKAQcC9AHs\n        ARUCGgHzAf8YAAH/AfMBvAHsAfMB9AEHAe8B6gHxAf8B8gGSAvQB7QEUARIBbQEHAfIB9AT/A/QE/wsA\n        AfQCbAESAW0BBwUAAf8B9AHwAewB7QISARMB7AHvAfMB/wUAAfQBkgK0ARkB8AH/FAAB/wHyAQcB7QEH\n        AfAB8gHvAXMBSgJtAeoBEgFuAZkBwwFSAUsBSgERAkoBEQHxAfQC/xcAAfMB7AHtAuwBEAERARUBcwGZ\n        ARwBBwHvAZkCGwHzAf8YAAH/AfQB8wHvAbwB9AHwAe8BHAHvAfQB/wG8AfAB9AG8ARIBFAHrAfcB8gH0\n        Cv8NAAH3AWwBEgHqAfcB/wQAAv8B8gLtAewBEgH3AewBBwH0Af8FAAH0AZEBtAEJAfQB8AH/FgAB9AHw\n        AQcBvAGZAW4BEgHqARIC6gFtARwBvAH0AZkBcwFKAREBRAFKAREB8QH0Av8XAAHsARUBcwFKAUMBEQFE\n        AXMBmQK8AvAB8gHzAfIB8AH/GAAB/wH0AfMBvAHvAfQB8wIHAe0B8wH/AfIB9wH0AfMBkgISAW0B8AHz\n        AfQJ/w0AAfIBbQISAesB/wUAAf8B9AH3Ae0B7wH/AQcB7AHwAfQB/wUAAfMBtAEJAfQB8QH0GQAB9AG8\n        AewB6gFtAuoBEgFKAW0B7AEHApkBGgEcAUQBSgFLASIB8QH0Av8VAAH0AesBQwEcAVEBQwERARUBcwEH\n        AfMC/wb0GgAB/wH0AfIB7QHyAfQB8AHvAZIBvAL0AfAB7wH0AbwBbQESAW0B7AG8AfMB9An/DAAB/wHv\n        ARQBEwESAfIFAAL/Ae8B7QH3AfMBBwHtAfIB/wYAAfABGQHiAfQB8QH/GwAB8wH3AW0B6gFKAXMB7wH3\n        AQcBvAKZARsBmQJKAUsBIgHwA/8UAAHzAewBEAJzAW0CEQFzAZkB9CMAAv8B9AHvAfcB9AHzAQcB7wH3\n        AvQB8wHsAbwB9AEHARIBEwESARQBBwHzCP8NAAH/AfIB6wIUAe0B/wUAAf8B8AHrAfcB8AH3Ae8B9AH/\n        BgABBwHiAf8B8gHzHQAB/wG8Ae0B7AHvAfAC8gHwArwBGgEbAXMBUQFLAREB8gP/EwAB9AHsARECcwEU\n        ARUBEQFuAbwB8wH/JAAB/wH0AfIB7QHxAfQB8AHsAesBBwL0AfABkgHzAfIBbQEUARIBQwESAfEB9Af/\n        DwABvAHqARQBEwHzBgAB/wHxAvcB7wHyAf8GAAHyAuIB/wHyAf8fAAHzAbwB9wHvAbwC8AHyAfQBvAEb\n        ARoBmQF5AUoB8gL/EwAB9AHrARABcwEaAe8BFQERAW0C8ScAAf8B8wG8AewC8wLsARIBBwLzAfcBBwH0\n        AQcBEgNDAe8B9AX/EgABBwFtARMBkgH/BgAF/wYAAfQBvAH/AfMB8AH/HwAC/wH0AfEB7wEHAfEB8wL0\n        AbwCmQEbARoBSwHyAv8TAAHzAXMBHAHwAfMBcwFKAW4BGgHzAf8nAAH/AfQB8wHsAbwB9AHwAe0BEgET\n        AbwB8wHqAW0BvAHvAUoBQwERAUQBBwH0A/8UAAH/AbwBrgETAbwGAAL/CAAB/wHxAf8B9AHxAfQB/x8A\n        BP8C8gH/A/QB8wEHAZkBwwHyAbwB9AL/EwAB/wHxAfAB8wH/AQcBHAG8AfEB/ygAAv8B8wLsAvMBBwEU\n        ARUB7wHzAe8BSwFEAUsBRQFRARQB7AHwAfQB/xgAAbwBtAESAfIPAAHyAvMB8QH/IwAF/wX0AfMB8QHy\n        A/8WAAH/AgAB/wHxAfAB/yoAAf8B9AHsARQBBwH0Ae0BIwFLAe8B9AHxAXQBUgGZAUoBmQEHAbwB8wL/\n        GQAB8wHvAesBvAH/CgAC/wPxAfMB/yUAD/9HAAH/AfQB7wJKAUsBUgF0ARwBvAL0AbwB8AHyArwB8QHz\n        AfQC/xkAAv8B8gHvAbwB9AkAAfMBvAHwAfMB/ykADP9IAAL/AfMB7wF0ApkBvAHwAfQC/wH0A/IB8wL0\n        Av8dAAH/AfQB8wgAAf8B8wH0gQAB/wH0AfMB8gEHAbwB8wH0Af8CAAP/AvQC/68AAf8C9ALzAfQC/wYA\n        Af+xAAj//wD/AP8A/wDAAAH/AgAB/7oACP8/AAb/BQAC/wQAAv8MAAH/VgAL/z0AA/8F9AP/AQAB/wLz\n        Af8BAAL/AvMB/wsAAv8RAAL/FgAC/ycACP8C9AHzAfQD/xwAAf8fAAL/AfQB8gH0Bf8BAAH/AfEB9wG8\n        AvQB8gH0AbwB7wHzAf8EAAP/AwAC/xAAAf8C9AH/CgAB9AoAAf8B8wH/JAAI/wH0AvMB8gHxAfIB9AL/\n        GwAE/x0AAf8B9AHyAfQE/wEAAv8B8QH3AZIB7wEHAe8B9wHvAfcBkgG8Af8DAAL0BP8CAAH/EAAB/wHx\n        Af8JAAH/AfQBvAL/CQAB9AHxAf8iAAX/AvQB8wLyAfED8AHyAfQB/xwAAf8B8gHwAfQB/xsAAv8B8wHx\n        AfQD/wIAAf8B8gHvCZIB9wHzAwAB/wH0AvMB9AL/AgAB/w8AAfMBvAHzAf8IAAH/AfAB9wHxAf8IAAH/\n        AfMBBwH0IQAE/wH0AfMC8gHxAfADvAEHAe8BBwHyAf8dAAHyAe8B8wH/GwAC/wHzAfAC9AH/AwAB/wHw\n        Ae8B9wmSAfAB/wIAA/8B8wHyA/8BAAH/DgAB/wHwAe0BvAcAAf8B9AHxAe8B7AHvAfIB9AH/BgAB/wHv\n        AfcB8yEAAv8C9AHyAfEC8AG8AgcB7wGSAW0CQwFtAfMcAAH/Au8B8QH/GgAB/wH0Af8B9AHwAfEC9AL/\n        AQAB9AG8B+8B9wKSAu8B8gH/AgAB/wL0AfAB8wL/AQAB/w4AAf8BBwHqAfMB/wIAAv8B9AHyAQcB7wH3\n        AesBSgHsAfcB7wG8AfIB9AH/AwAB/wG8AeoB8gH/GAAC/wUAA/8B8wHyAvABvAIHAe8B7AETARQB6wHt\n        AfcB7QHyHAAB9AHtAfcB8AL/GQAB/wP0AfIBvAHxAfQD/wH0AQcC7wHsAe0E7wLsAu8BBwH/AQAC/wH0\n        AfIBvAHzBP8NAAL/AfcBSgG8Af8CAAH/AfEB7wL3Ae0B7AHqAW4B6wLtAvcBBwHzAf8BAAH/AfQBBwEU\n        AfAB/xcACv8B9AHyArwBBwHvAewB6wEUAQ4BFQISAfcB8AHvAfMcAAHyAewBkQG8AfEaAAL/AfMC9AHx\n        AQcBvAH0Av8B8gK8AewBbAHsAQcBkgHrAe8BkQFsAZICBwH0Av8B9AHzArwB8wH0A/8NAAL/AewBSgH3\n        AfMC/wG8AfcBkgL3Ae0B7AFLAW4BSgHsAvcCkgH3AfEC/wHxAZIBRAG8Af8UAAz/AfQB8gG8AQcB7wHs\n        ARICDwERARQCFQESARQB6wHsAfMZAAP/AfEB6wGRAbwB8QH0Av8XAAL/AfMB8QHzAvIBvAHwAvQB8gG8\n        AZEBbAFlAWwBFAFDAQ8BQwNsAgcB8QH/AfQB8wG8AQcB8AHzAvQB/w4AAv8B7AFKAewB8AH0AbwB9wHt\n        AewB7QMcAXMBbgFLAUoBRAFtAuwB7QH3AfEB9AG8AesBSgG8Av8SAAT/AvQC8wLyAfABBwHwAbwCBwHs\n        AeoCFQEUARIBFAEVARIB7AFmAg8BkgH/GQAB/wH0AfMBBwESAZEBBwG8AfIC9AL/FQAC/wH0AfIC8AHx\n        AfIB8AHxAfQB8gHvAWwBZQINBA8BZgJsAe8BvAHxAfQB8QG8AQcB8AHyAvMB9AH/DgAC/wHsAUoBbQHy\n        AfAB9wHsAesBcwMaApkCcwFuA0oB6gHrAe0B7wHyAfABEgFKAbwC/xIAAv8B9AHzAfIC8AK8Ae8CFAHs\n        Au8B7AEUARIB7QEQAUMBFAEQAe8B9wFmAREBFQFDAe8B/xMABv8B9AHyAfAB6gETAZEB7QPxAfIB8wH0\n        B/8OAAP/AvQB8gK8AfMD8gHtAWwCDQUPAWYCDQGRAfECvAEHAfAB8QHwArwB8wL/DgAC/wHvAUoBSwLv\n        AewB6gFuARwDGgGZAe8BBwEcAZkBHAFzA0oB6wHtAQcBHAFKAUsB8QH/EgAC/wH0AfECvAIHAu8B6wHv\n        AQcC9wHsARQBEQHqAfcBDgERA20B7QETAUMB7AGSAfcB9BAAA/8B9ATzAfIB8QEHAeoBEgHtAZEB6gHs\n        AfEB8AHxAvIE8wP0Av8MAAL/A/QC8wLxAfMC8QGuARUCDQMOAgABDQEVAmYB9wK8AfIDvAHxAfMB9AL/\n        DgAC/wHxAUoBcwEcAe0BEgFKAXMBHAEHAe8BvAHyA/MB8gEHARwCcwFuAUoBbQHtAesBSgF5AfMB/xMA\n        AfQB8AG8AQcE7wHsAfcCBwH3AeoBFAFDAQ8B6gHwARUBFAHsAUMBZgETAa4B9wHtAesB6gHwEAAC/wHz\n        AvIC8QLwAQcBbQFsAe8CBwGRAeoB6wEHAfEB8gHxAfACvAHwAfEB8gHzAfQC/wwAAv8B9APzAfIB8wHy\n        AfMBvAFsAw0DDgIAAQ0BQwEVAWYBrgG8AfACvAHxAvMB9AP/DwAB/wH0AhwB7wFtAUQBbgFzA+0B9wXv\n        ARwB7QLsARwBcwFKAewB7wFSARoC9BIAAf8B9AHxAQcG9wLsAe0B7AEOARQBEAESAfEB9AHwAe0BBwHw\n        AbQBZgEOAQ8BZgEOARIB8A8AAf8B9AHzA/IC8QHwAQcBbQFsArwC8AHtAesBbAHrAfEC8wHxA/AC8QHy\n        AfMC9AL/CwAF/wH0A/MB7wFmAg0BFQIOAWwBDwEAAQ0CQwEVAYYBvALwAfMB8QHwAfIC8wH0Af8QAAH0\n        AfMBBwHvAkoBHAGSA+0B7AHtA/cE7QEcAfcBHAJKAbwBBwH/AfQB/xEAAv8B9AHyAQcB9wTsAe0BEgEV\n        AesBEgEOARIB7AHxAfMBvAH3Ae8B7QG8AYsBFAETARUB7AG0Ae8B9A0AAv8B9AHzAfEEvAEHAe8BEgFs\n        AfcBBwHzAfABvAHwAe0CbAHsAfEB8gHxAbwCBwHwAfED8gHzAfQE/wkABf8D9AGuAQ0BQwJmAQABEAGR\n        AesBAAEVAa4BbAEUAWYBkgHxAfMB8QHzBf8RAAH/AfMB9AH3AUQBUQHwAbwB6gHrAewB6wHtAewE7QHs\n        AesBcwHwAbwBcwFKAQcD9AkAAf8HAAL/AvQB8AHqARUCFAITARIB6gHrAewBEgFDAe0CvAH3AhIB9wEH\n        AfABBwHtAQcB7QGSAQcB9AH/DQAB/wH0AfMB8AHrARMEEgHqAZECuwHtAfECbQEHAewB6wGRAWwBbQUS\n        AZIB8gXzA/QC/woABf8B8gFmAQ0BZgFDAQ4BAAEQAZEB6wIAARQCbAFmAa4B8gHzAfQF/xIAAf8B9AHw\n        AewBSgG8AfEBbQJEAkoBcwF0AxwBdAJzAVIBHAHyARwBSwEHAfMB8QH/CQAB/wcAAf8C9AG8AQ4BQwH3\n        AesBEAEUAesB7AH3Ae0CEwHsAe8BbQRDAQcB8gHwAfQB8wHwAe8BBwL/DQAB/wH0AfMB8gHrAWwCuwOR\n        AbsB8gEHAbsBkQFDARQBbAEUAW0B7wEHBJEBuwHvAbsBkQHvBvMD9AH/DQAC/wGuAg0BDgGLAa4BAAEQ\n        AZEB6wQAAUMCZgG8A/8XAAH/AfQCcwH0AbwBSwJEAkoBcwF5BpkBegF5AvIBSwEcAfAB9AoAAv8FAAL/\n        AfQBBwETAUMBbQG8AfAB9wESAQ8CEQEOAUMB7AHrARECDwESAesBEgHxAvQB8gG8AZIBBwH0Av8NAAP/\n        AfMBvAHxAfIB8QEHAZEBuwG8AfEB9AEHApEBuwH3AZEB7AHyAfQBvAKRAfcBvAHxA/IH9AP/DgAB/wFm\n        AQ0BDwEOAowBDgEUAZEBbQEQBAABEQFmAfAC/xgAAv8BHAHtA/MBvAEcAUoBcwIcBJkBGgG8AfED8wFu\n        AQcC/woAAv8FAAL/AfMBEgHsAfcBEgHvAfIC8AH3AeoBDwEOAkMBDwEOARABEgLsAQcB9AHzAfACBwHv\n        AfIB9AL/AgAD/wkAAfQB9wHtAewD7QHrAZEBuwHzAf8B8wHsAZEBuwEHAe8CkQH3AvQBvAGuAZEF7QHs\n        AQcH/w8AAfEBZgENAg4BEAEOAREBbQHrAW0BEwEOBAABZgHtAf8ZAAL/Au8B9AHzAfAB9AHzAW0BFAFK\n        AUQESgHxAf8B9AHwAfIB8wHsAbwC/woAAf8GAAL/AfMB7wIHAe8BbQEHAvIB8wH0AQcB6wEPAg4BDwFD\n        ARQB9wHxAfQB8gH3AQcB7wG8AfIB8wH0Av8BAAX/BwAB9AHrAZECuwKRAbsBkQG7AbwB9AEAAbwB9wEJ\n        AbsB8wH0AewCuwHwAfQB8gHsAZEDuwSRAbwB/xQAAQcBZgENAg4BZgGMBW0BEgETARACAAFmAWwB/xoA\n        Af8B8gEHAv8B8wGZAfIBcwFDARQBQwFEAhUBIwHyAfMBmQHzAv8B9wHyAf8LAAH/BgAB/wH0AfMBBwH3\n        AQcBvAHrAQ8B7wPxAvMB9wFDARMBEgEQAQ8BkgHwAbwB9wHtAewBBwG7AQcB8gL0Av8BAAT/BQAC/wHz\n        AfAB8gTxAfIBvAG7AZEB7wHzAf8B8wK7Ae0B6wFtAbsB8gH/AfIBbQHqAe8F8gPwAfQB/xMAAbwCFAFD\n        ARQBbAFtA5EB9wKuARICEwIUAesB/xoAAf8B9AEHAf8CAAHwAQcBcwEVAkMBSgIiAVEB8wEaAfMB/wEA\n        Af8BBwH0EwAB/wH0AfIBvAIHAe8BEgERAZEB6wESAfcBvAHzAe8BEgHyAfAB9wHqAUMCEwESAhECEwHq\n        AZIB8wH0Av8BAAP/BgAB8wHvAvcG7wH3AZEBuwGRAewC8wH3AQkEuwG8AfIB6wESAZEBuwHvA/cB7wL3\n        Ae8B7QEHAf8SAAG8AWwBFAFDARUBbAGuAZEBtQG7AQcB7wHtAa4BEgETAWYBFAHrAf8bAAH/AfMB/wIA\n        Af8BBwFzAUoBIgFEAUsBIgFEAVEB8wEHAf8CAAHzAfQB/xMAAf8B9AHyAbwB8AEHAewBEgHsAUMBDgFD\n        AfIB8AHzAe8B9wT0AfECEgHqAUMDDgFDAe8B8QH0Av8JAAHyAewBbAGRArsDCQHwAQkB8ALzARkBuwHs\n        AfcBCQK8AfMB8AG7AWwBEgGuAbsBvAK7CZEBvBIAAbwBbAEVAkMBbAGuAZEBCQEZAvQB8AGSAW0BEgFm\n        ARUB6wH/IQAB7wFzAUoBIgFKAXMBRAFLAVEC8RkAAf8B9AHwAbwB8AHzAQcB7QESARUBFAG8AfIBvAHw\n        AfEB8wLxAfIC8QH3AfEB8AHvAfAB8gHwAbwBBwHzAf8LAAK8AfEL8gHxAQkCuwG8AQAC8wH/Ae8BkQG7\n        AbwO8gH/EQABvAGuARIBEwIUARMBkQEJARkD/wG8AewB6gIUAesB/yAAAf8B7wJKAUQBSwFKAXMBdAFz\n        Ae8B8QH/GAAB/wHzAvAD9AH3AW0B7AGSAfQBvAHvAewB7QH3AbwD8AHyAfAB6wHqAfcBvAHsARIB7wHy\n        AfQB/wsAD/8B8wG8AbsB9wHzAgAB8wHsAbsB8AHzD/8RAAHwAZEBbQESAUMBFAHqAZEBtQEJA/8BGQHs\n        AeoCFAHtAf8gAAH/ARwBSgFEAiIBSgFzAXkBHAGSAQcB8wH/FwAB/wHzAbwC8AH0AfIB7wHrAfcB8AG8\n        AfACvAEHArwB7wHsAQcB7wEUAewBBwHyAewBEgHtAbwB8wL/GwAB8wEJAbsB7QH0Af8B6wGRAfIB8yEA\n        AfMBCQGRAa4BEQEVARIB6gG1AhkC/wEZAewB6gEUARMB7yEAAfMB7AEVASIBDgEiA0QBSgHtAZIB7wHz\n        Af8VAAH/AfQB8gHwAbwD8AH3AesBBwHwAbsC8AH0A/MB8QEHAbwB6gHrAQcB7QHyAZIB8QHzAvQB/xwA\n        Af8B8gG8AbQB7QHrAZEBvAH0IgAB/wHwAbwBkQEUAhUBbQHsAvcCGQG7Aa4C6gGuAfEgAAH/AfIB6wFE\n        AUoBRAIiARABIgFEAUoB7AGSAQcB9BQAAf8B9AHzAfECvAHwArwBkgFtBLwBuwHyBPQBCQEHAe0BbQLv\n        AfABvAHzAfQD/x0AAf8B9AEIAbsB9wG8AfQkAAHzAfIBvAHrARMBFQHvAuwB6gHtAQkBtQGuAuoB9wH/\n        IAAB/wHwAkoBSwFKASIBFQIiAUoCcwHtAe8B9BQAAf8B8wHwAfEC8gHxAvABvAHwAbwB8AG8AbsBvAHw\n        AvQC8gK8Ae8B6gHvAfEBvAHzAfQC/yEAAfMBvAHyAfQmAAG8AfMB7wHrARQBGQL3AeoBrgH3AbUBrgLq\n        AfIhAAH/AQcBRAFKAXkBSwEiAQ4BIgEQAUoCdAFzAe8B9BMAAf8B8wHxAvID8wHyAvMB8gHwDLwB6gH3\n        AvAC9AH/IgAB/wHzAfQnAAH0AfAB8wEJAbUB9AK1Aa4BkQK1Aq4B8AL/IAAB/wHtAUQBSwGZAXMCDgEP\n        ARUBSgFLAUoBcwGZAfMTAAH/AfMB8gL0Av8D9AHzAfIEvAbwA/IC7wEHAfIB9AL/TAAB/wHzAbwB8QHd\n        AfQBvAG1Aq4BkQHPAa4BBwP/IAAB/wHtARUCSgEQAQACDgEPASIBDwEQAUoBmQHzEwAC/wH0Bv8B9AHx\n        BbwB8gLzB/QB8wL0Av9MAAL/AfQBBwH0AfEC9AG1Aq4B7wH0AfIBvAH0Av8gAAH/Ae8BIgEOARQBEQFK\n        AXQCDgMAAXMBmQH0EgAJ/wH0AfIB8AG8AfAC8gHzAfQC/wMACP9NAAL/AfIBBwH0Af8B8wHwAfcBjAEH\n        Af8B9AHyAbwB9AL/IQAB7wEiAUMBdAJKAZkBIgFEARABEQFKARwBGgH0EgAB/wEAA/8BAAL/AfQB8gLx\n        AvIC8wL/BQAB/wIAA/8EAAT/RwAB/wH0AfEBBwHzAfQC8AHtAYwBvAL0AfEBvAH0Av8hAAHwASIBRAGZ\n        AUQBcwGZASIBRAFzAXQBSgEcARoB9BcAAf8C9AHzAfIC8wHyAvQB/xAABv9GAAH/AfQB8QEHAvMCBwHt\n        AYwBtQLzAfABvAHzAv8hAAH0AeoBSwGZAQ8BcwGZASIBRAFzARwBIgEUAfIB/xYAAv8B9AHzBfQC/w8A\n        CP9GAAH/AfQB8wEHAbwB8AO1Ac8BtQLwAQcBvAHzAv8hAAH/Ae8CbQEQARwBmQFKAZkBbgFKAZkBvAH/\n        FwAB/wT0Bf8IAAH/BgAB/wIABv9GAAL/AfMBvAIHAe8EtQMHAbwB8wL/IgAB9AG8AesBEgHsAUQBSgFz\n        AesBbQGZAfEB/xcAAf8C9AL/AQAC/xUABf9HAAH/AfQBvAEHAbUB7wS1Ae8CBwHyAfQC/yQAAf8B8wH/\n        AbwB7QHxAf8B8wH0GQAF/2QAAv8B9AHwAbwBtQEHAbUBBwG1AgcB8QH0Av8pAAH/HQAD/2YAA/8B9AHw\n        ArwBtQEHAbwBBwHwAfMD/7IAAv8C9AHxAbwB8QHzAvQC/7UAA/8B9AHzAfQE/7cAB///AP8A/wD/AP8A\n        ngAE/1wACv9TAAP/A/QD/1kAAv8F9AHzAfQC/1IAAf8C9AHyAfEC8AHxAfMB9AH/WAAB/wH0AfMD8gHx\n        AvIB8wH/UgAB/wH0AfEBBwLvAfcB7wG8AfMB/yAABf8D9AT/BQAC/wP0Bf8eAAEcAW4DHAFzAUoBbgHy\n        AfQC/1AAAf8B9AHtAgcB7QHsAfcBBwHyBf8bAAL/AfQB8wHyBfEC8wL/AwAC/wHzAfIC8QLyAfMC9AH/\n        HQACHAHwAuwBHAHsAXQB8QHyAfQB/ycABv8jAAH/AfABvAHvAfABBwHtAZIB7wHxBPMC9AT/FQAB/wH0\n        AfIB8AIHA+8D8AHyAfQB/wMAAf8B9AHwAu8BvATwAfEB8wH0Af8bAAEcAZkBvAFKAUsBHAHsAXQB8AHy\n        AfMB9AH/JAAC/wH0AvIB8QHyAfMB9AH/HwAC/wHzAe8BBwLyAbwBBwL3Ae8EBwLwAfEB8gLzAfQE/w4A\n        Av8B9AHwAe8B7AFtARIB6gRKARwB8gP/AfMB7wETAREDQwERAeoB7QEHArwB8AHxAfMC/xMABv8BHAGa\n        AfABSgFRAe8B7AF0AfAB8QHyAfMB9Ar/FwAD/wH0AfABBwL3Au0BBwG8AfIC9AP/GQAC/wH0AfABBwLw\n        AfQCvAGSAe0DkgXvA7wB8QHyAfMB9AL/DQAB/wHzAfAB7AESAW0BHAEHAxoCmQG8AfQB/wH0AewBEwFE\n        AUoBcwIcAnMBSgEVARMB7AO8AfAB8gH0Af8RAAL/BfQBHAGaAbwBSgFRAe8B7AF0AbwC8QHyAfMK9AL/\n        DQAG/wT0AbwC9wHsAZIBkQHsAZEB7QHvAQcB8QLyAfQB/xgAAv8B9AHzAfEBBwG8A/MBBwLtAe8BkgHt\n        AZIF7wIHAvAB8gHzAfQC/wwAAf8B8QHrAUQBeQEbAfQB8wHxArwBGgHwAfQB/wHxARIBEQFzAZkBGgG8\n        AwcB7wEcAXMBSgEVAW0B8QHwAQcBvAHyAfQB/xAAAf8B9ALzA/IBHAGaAQcBSgFRAe8B7AF0AvAD8Qny\n        AfMB9AH/DAAB/wH0AfMC8gLwAwcB9wHtAewD6wLsAW0B7ALtAQcB8AHxAfAB8wH/FgAC/wH0AfMB8gHx\n        AbwBBwG8AfEBBwHsAZIB7wIHAu8BBwG8A/AC8QLyAvMC9AP/CgAB9AHsAUQBeQIbAfIB9AMAA/8B8AJK\n        ARwBBwG8AgcB8QH0Af8B9AHxAe8BcwFLAUoB7AHyAfABBwG8AfMB/xAAAv8B9AHyA/EBHAGgAe8BSwFR\n        Ae8B7AF0A/AB8QLwCPEB8gL0Af8KAAH/AfQB8wHyBPEB8AEHAZIB7QLsAesC7AGuAewB6gFtAesC7AH3\n        AbwB8AHxAfMB9AH/EwAC/wL0AfMB8QHwAbwBBwH3AbwB9wFtAesB8QPyAfEB8gHzB/QH/woAAQcBFAF0\n        ARoBvAH0BwAB9AHqAUsBmQEHAfEB8wHxAQcB8AHzAf8CAAH0AbwBcwFLAUoB7wHyAbwBBwHwAfQB/xAA\n        Af8B9AHzAfIB8QHwARwBoAHvAUsBcwGZAewBcw3wAfEB8gHzAfQB/wgAAf8B8wHwAbwBkgLtAewB6wH3\n        AZIB7AJtAesCkQHtAZIBkQLtAZEC7AKuAe0B7wIHAfAB8wH0Av8QAAL/AfQB8wHyAfEB8AG8AQcB7wG8\n        AfQB8AHtAfQG/xcAAf8BEQFuARoBvAHyAf8GAAH/AfcBRAGgAQcBvAHyAbwB8wG8AQcB8QH0Af8DAAG8\n        AksBSgG8AfEBBwG8AfMB/xEAAf8B9AHzAvEBHAHDAQcBUQF0AZkB7AFzAvEC8AnxA/IB8wH0Af8HAAHv\n        AewBbgF0AXkCegKgAXoBeQF0AUoBFQERARUB6gHrAZIB7AEHAbwB9wLvAZIB7QH3AQcB8AMHAfAB8gHz\n        AfQB/w4AAf8B9ALzAfIB8QLwAfEBBwHyAvQBvAEHAfIB8QHwAgcB8AL0Af8TAAH/Ae8BRAEcAbwBBwHy\n        Av8FAAH0AesBmQEaAQcB8AHtAeoB8wHwAQcB8QH0Af8EAAHvAksBHAHxAQcBvAHyAf8SAAH/AfQC8wGZ\n        AcMBvAFzAXQBGgHtAW4C8gXxAvIH8wL0Af8FAAH/AfIBHAGZAQcCvAXwAfIB8wMbAcMBmQHsA20C7AGS\n        Ae8B9wHtAfcBBwHzB/IB8wH0Av8LAAL/AfQC8wHyAfEB8AEHAfcB8QP0Ae8B6gFtAewB9wHvAQcB7wEH\n        AfAB9BIAAfMBFQFKAZkB8AG8AfAB8wL/BAAB8QHsARsBvAHwAQcBSgFLAe8B8QG8AfEB9AH/BAAB9AFu\n        AUsBcwG8AQcBvAHyAf8MAAKSBRwBkgH3AhwBGgGZAXQBeQEaARwBSwHtCOwB7QHyCP8FAAH/AfMBBwG8\n        AfAB8wH0A/8B9AHyArwDBwHwAbwB8AEbARoBmQEcAXQBbgHqAW0B7AH3AbUB8gHzAvQD/wX0Af8LAAH/\n        AvQB8QEHAfcBbQESAeoBvAT0AesBQwFtAe0EBwHxAbwB8hEAAQcBEQFzAZkB8wHxAfAB8QHzAf8EAAEH\n        Ae8B9AHwAfQBvAFzAnQB8wLyAfQB/wUAARwCSwHvAQcBvAHzAf8MAAF0ARoEwwb0AcMCmgEaARwBdAGZ\n        Ae8GmQHvAXMB8w8AAfAB8QH/BgACBwG7AgcBuwG1AQcC7wGRAQcB8QIbAcMBmQFLAeoBkQHwAfIB9AH/\n        BAAC/wL0Af8LAAH/AfEBBwH3AuwB6wESAeoBBwT0AZIBFQFtAe0B7wG8AvIB8wHyAbwB8QH0Af8OAAHt\n        AUQBHAG8AfQB8wHyAfEB8gHzBP8B7QG8AfQB8gH/AfQBcwJ0A/QB/wQAAv8BBwFKAUsB7QHwAfEB9AH/\n        DAABmQHzBPEI8gF0AcMBHAFuAfABvAYHAbwB8QHzEAAB8wH0Af8FAAG8AfIBvAHyAfQB8gG8A/QB7wHz\n        AfIB8AEHARsBGgEbAaACcwEcAfEB/wUABP8KAAH/AfEDBwH3Ae0B6wFtARIB9wT0AfcBFAETAewB7wG8\n        AfID9AHzAvAB/w4AAe0BSgFzAfAC/wH0A/IB8wL0Af8B7AG8AvMC/wHsAZkBeQH0CP8B9AEHAUQBcwEc\n        AfIB9AH/DQAB7wEcA0oCSwFRAXMBdAF5ApkBeQGZARsBHAFRAUsHSgFuAfAB8gH/DwAB/wL0Af8EAAG8\n        AfMB8AHzAQAB8gG8AQAC/wEHAfQB/wH0AbwB/wHyAbwBBwIaApkBBwHyEgAB8QPwAgcB9wHtAesBEgHr\n        A/QBBwHsARMBEgHrAfcB7wHxBfQC8AH0DQAB7QFKAXMB8QIAAv8B9ATzAfIBcwGZARsB8AHzAfQB7AGZ\n        AZoB9AIAAf8D9APzAe8BRAFzARwB9AL/DQAC7wVRAXQBeQF6AaABwwH0AqABmQF0AXkBdAJRBUsBcwHw\n        AfIB/xIAAvQDAAG8AfMB8AH/AQAB8wG8AgAB8wEHAf8BAAH0AbwC/wHxAbwCBwEaARsBmgF5AQcB/w4A\n        Af8B8wHwAfQD8wHwAQcB7QFtARIBbQHyAfQB8QHvAQcB7wGSA/cBBwHxBfQC8QH/DAABHAFKAUsBBwQA\n        Av8C9ALzAXMBmQHDAbwB9AHzAesBmQGgAfQCAAH/AvQE8wHtAUQBcwG8Af8PAAHvBBsBGgQbAZoBwwHz\n        AZkC8wUbAxoCvAEaAfEB8AH/EgAC/wH0Af8BAAG8AfABvAHyAfQB8gG8AvMB8QG7AvMB8QEHAfMB8QEH\n        Ae8BBwHxAfMB8AG8AQcBmQG8AfQMAAH/AfQB8AX0AfMBBwGSAesBEgHsAfIB8AHzAfAB8wG8AfIB8AS8\n        AfAB8wT0AbwB8gwAAbwBSgFLAe0B/wQABf8BHAF5AcMBvAH0AfABHAEbARoDAAP/BPQB6wFKARwB8xAA\n        AW4BHAaSAxwBoAHzAZkBBwHvBBwBkgbtAXMB8QH/FAAC/wEAAbwB8ALyAfQB8gG8AvQB8wG7AvMB8QEH\n        AfMB8gEHAfABBwH0AQAB/wHyAbwCBwG8Af8LAAH/AfEB8gb0AbwB7wFtAesBvAHxAf8BvAHvAfMB8QIA\n        Af8B9AHyAfAB8gLxBPQBvAH0CwAB9AFKAksB8gkAAfMBdAGgARoB/wEAAbwBGwG8BgAD/wHzARQBUQGZ\n        AfQQAAF5CpkBoAHzAZkBoAHDAqACGgKZBe8BmQH0GAAB/wL0AfMBAAH/AfADAAG8Af8BAAL0AQAB/wLz\n        AfEB/wQAAbwBBwG8AfMLAAH/AfAH9AHyAfcB7AEHAfIBAAH/AfQB8QHyAf8FAAH/AfQC8wPyAfEB8AH0\n        DAAB7wFKAUsB6wH/CAAB9AEcAaABmQEHAf8B9AEbAf8IAAH/Ae0BRAGZARsB/xoAAQcBmgHzAXkBoAHz\n        ARoBwyQAAfMB8gG8AfQB/wHzAwABvAH/AQAC9AEAAvEBvAHzAwAB/wEAAfABvAHwAfQB/woAAfMB8Ab0\n        AfIBvAEHAbwB8wH/AwAC/woABv8MAAH/AXMBSwFKAe8B/wcAAf8B8AKaARwBBwEAAfQIAAH/Ae8BFQFz\n        ARoB8wH/GgABHAGaAfMBeQGgARsBBwHDJAAB/wHwAbwB8AHzAfAD8gEHAfEB8gG8AfAB8QIHAbwB/wIA\n        Av8B9AHxAfIB8wH/CwAB8QHyBfQB8QHzAfQB8gHzJAAB8wJLAUQB9wH/CAAB8gF6AZoBcwG8CAAB/wEH\n        AREBbgEaAfAcAAIcAfMBdAGaAcMBBwEbJQAB8wK8AfIB8AG8AfIB8wEHAfIB8AEHAfEBBwHvAQcB9AL/\n        BPQC/w0AAfEB8wL0AfMB8gLzAfIB8QHzJQAB/wEHAXMBSwFKAW0BvAHzA/8B9AHzAf8BAAEaApoBcwHv\n        AfIB9AP/AfMB8QHrAUQBcwGZAfEB/xwAAhwB8gFzAXoBwwEHAfQnAAHyAfEC9AH/AQABvAH/AfIC8wEH\n        AfMB/xYAAfAB8wT0AfEB8gH0Av8mAAH/AbwBHAFzAUsBRAESAesC7AFtARIBvAEAAf8BGgKaAXMB6wHs\n        Au0B7AFtAUoBdAGZAhsB/x0AARwBdAHyAVEBeQHDAQcB9CcAAf8B8gK8AfAB8gG7AbwBBwG7AQcB8wH/\n        FwABvAHzAvQB8gHwAf8sAAHzApkBHAFzA0oBSwF0AZkB8wIAAbwBmgLDARoB7wHtAe8BGwHDAhsB8R8A\n        ARwBcwHyAUsBdAEaAQcBGykAAfABCAHwAfMCCQIHAfMZAAHxAfQC8gH0LwAB/wHyBRoCGwHyAfMDAAH0\n        AfEBGgEbA/QB8gHxAfIB9CAAARwBcwHyAUsBcwEaAZkBwysAAf8C9AHzAfQbAALyAfQB/zIAAf8G9AH/\n        BQAB/wf0Af8hAAEcAXMB8gFLAXMBGgHvAcNLAAHxAf9rAAEcAXMB8wGZARoBGwHvAcO4AAGZAXQD8wH0\n        AZkBoLgAAvQD8wP0/wD/AP8A/wD/AP8A/wDLAAFCAU0BPgcAAT4DAAEoAwABwAMAAeABAQIAAQEBAAEB\n        BgABLRYAA///AP8A/wD/AIUAIP8Bfxb/AfkBHwv/Af4BPwn/AcABBwv/AfgBHwn/AcABAAE/Cv8B8AEP\n        Cf8B8AEAARwK/wHgAQABfwj/AfACAAEfCf8CAAEPAv8B+QEAAQED/wHwAgABDwP/AgABfwP/AgABDwL/\n        AcACAAEPAv8B8QIAAQcC/wH8AgABDwP/AgABDwL/BAABPwH/AfEDAAF/Af8B8AIAAQ8C/wH4AYABAAEI\n        AX8B/gQAAR8B/wHxAQQCAAE/Af8B4AIAAQ8C/wH4AwABPwH+BAABBwH/AfEDAAEfAf8BwAIAAQ8C/wH4\n        AwABPwH+BQAB/wHxAQABgAEAAQcB/wHAAgABDwL/AfgDAAEfAfwFAAH/AfMDAAEHAf8BwAMAAX8B/wH4\n        AwABHwH4BQAB/wHzAgABCAEPAf8BwAMAAR8B/wH8AgABDAEfAfAFAAH/AeMDAAEPAf8EAAEHAf8B/AMA\n        AR8B+AUAAf8B4wMAAR8B/gQAAQcB/wH2AwABHwH8BQAB/wHzAwABDwH+BAABBwH/AfADAAE/Af4FAAH/\n        AfIDAAEDAfwEAAEHAf8BwAMAAR8B/wQAAQEB/wHyAQABCAEAAQMB8AQAAQcB/wHAAwABDwH/AcADAAEP\n        Af8B8wEAARgBGQE/AfAEAAEHAf8BwAMAAT8B/wH8AwABHwH/AfMBAAEQAQEB/wHgBAABBwH/AcACAAEB\n        Av8B/AMAAT8B/wHzAQABEAEBAf8B4AQAAQcB/wHAAgABAQH/AfgEAAL/AfMCAAEDAf8B8AQAAQcB/wHA\n        AgABAQH/AfADAAE/Av8B4AIAAQEB/wHwBAABBwH/AcEBgAEAAYEB/wHwAwABPwL/AeEBAAGAAQEB/wHw\n        BAABBwH/AcEBgAEAAcEB/wHwAQEBwAEAAT8C/wHgAQABgAEBAv8EAAEfAf8BwAGAAQEBgQH/AfABCwGA\n        AQABfwL/AcABAAGAAQMC/wHAAwABPwH/AcACAAEBAf8B+AEPAcABAAF/Av8BwAEAAYABBwL/AcACAAED\n        Av8BwAIAAQED/wHgAQABfwL/AcACAAEDAv8B4AIAAQ8C/wHAAgABAwP/AfABAQP/AcACAAEBAv8B4AIA\n        AQ8C/wHgAgABAwP/AfwBAwP/AcACAAEBAv8B+AIAAQ8C/wH4AgABBwj/AcICAAERAv8B+AIAAT8D/wIA\n        AQcI/wHCAgABAwL/AfgCAAF/A/8CAAEPCP8BwwGAAQABAwL/AfgCAAT/AYABAAEDCP8BwwGBARABBwL/\n        AfgBAAEBBP8B8AEAAQEI/wHhAQEBEAEHAv8B/AEAAQME/wHgAQABAQj/AfMBAQEQAQcD/wEAAQcE/wHg\n        AQABAwj/AfMBAQEYAT8D/wGAAR8E/wHgAQMJ/wHzAYMBiAE/A/8BwAE/BP8B4AEHCf8B8wHDAZgBPwP/\n        AeABPwT/AeABDwn/AeMB/wGYAT8D/wH8Bf8B8AEHCf8BxwH/AZwBfwn/AfABHwn/AccB/wGfCv8B+AEf\n        C/8BHxf/AT9e/wH8AT8W/wH4AR8Q/wHgAQ8E/wHwAQ8Q/wHgAQAE/wHwAQcC/wHfAv8BDwH/AT8I/wIA\n        AR8D/wHwAQMC/wHfAf8B4AEDCf8B/AIAAQED/wGAAQABHwL/AwABDwj/AfgDAAP/AgABBwH/Af4EAAE/\n        B/8B8AMAAX8B/wH+AgABAQH/AfwEAAEfB/8B4AMAAR8B/wH4AwABPwHwBAABAQf/AcADAAEPAf8B+AMA\n        AT8B8AUAAv8B/gF/A/8B4AMAAQcB/wHwAwABDwHwBQAC/wH8AX8C/wF/AcADAAEDAf8B4AMAAQcB8AUA\n        AfAB/wH8AR8B/wHHAX8BwAMAAQMB/wHgAwABBwHwBQAB8AExAfwBBwH4AQMBfwHAAwABAQH/AfADAAED\n        AfAFAAHwAQABYAEDAYABAQF/AYAEAAH/AcADAAEBAeAFAAHwBAABAQF/AYAEAAH/AcADAAEBAeAFAAHw\n        BAABAQE/AYAEAAH/AYAEAAHgBQAB+AUAAR8BwAQAAf8FAAHwBQAB/AUAAR8BwAQAAf8FAAHwBQAB/AFA\n        AwABAQEfAYAEAAH/BQAB+AUAAf4BMAMAAQEBHwGABAAB/gUAAfwFAAH+AQgDAAEDAR8BgAQAAf4FAAH+\n        BQAB/wEIAwABBwEfAYAEAAH+BAABAQH/AcAEAAH/AYABIQGAAQEB/wEfAYAEAAH+BAABAwH/AeAEAAH/\n        AcABAgFAAQEB/wE/AYAEAAH+BAABBwH/AfAEAAH/AcECAAEBAf8BfwQAAQ8B/gQAAR8B/wH4BAAB/wHz\n        AYQBIAHBAv8EAAEfAf4EAAE/Af8B+AQAAv8BgAERAfkC/wQAAT8B/wQAAX8B/wH4AwABAQL/AcgBgwF/\n        Av8EAAE/Af8EAAF/Af8B+AMAAQ8C/wHwAQ8D/wQAAR8B/wQAAX8B/wH4AgABAQP/AfABhwP/BAABHwH/\n        AYADAAL/AfgCAAEBA/8B8AGPA/8EAAE/Af8BgAMAAv8B/AIAAQED/wH8AR8D/wQAAX8B/wHAAgABAQL/\n        Af4CAAEBA/8B/AEfA/8EAAF/Af8BwAIAAQEC/wH+AgABAQP/AfwBPwP/AYACAAEBAv8B4AIAAQED/wIA\n        AQMI/wHAAgABBwL/AfACAAEDA/8BgAEAAQMI/wH4AgABfwL/AfACAAEHA/8BwAEAAQcJ/wEAAQMD/wH8\n        AgABDwP/AeABAAEfCf8BgAEDA/8B/gIAAR8D/wH4AQABfwn/AcABBwT/AgABfwP/AfwBABD/AeABAxb/\n        AfwBf9D/AgAQ/wGfAfwBDwL/Af4CAAF/Cv8BhwT/AQEB8AEPAv8B/gIAAX8D/wHHAf4F/wEDBP8CAAEP\n        A/8CAAF/A/8BAQHgAQcC/wH+AQYBAAF/Av8BAQIAAQMC/wH4AgABAwL/Af4BAAHAAQEC/wH+AQIBAAF/\n        Av8EAAE/Af8B8AIAAQEC/wH+AQABgAEBAv8B/AIAAX8C/wGAAwABDwH/AeADAAL/AfgCAAEBAv8B/AIA\n        AT8C/wGAAwABBwH/AeADAAF/Af8B+AIAAQEC/wH8AgABPwH/Af4EAAEHAf8B8AMAAv8B+AIAAQEC/wH4\n        AgABPwL/BAABBwH/AfQCAAEBAv8B+AMAAv8B+AIAAR8C/wQAAQcB/wHgAgABAwL/AfgDAAL/AfgCAAEf\n        Av8BgAMAAQcB/wHgAgABDwL/AfwDAAL/AfgCAAEfAv8BwAMAAT8B/wGAAgABAQL/AfwDAAE/Af8B+AIA\n        AR8C/wHBAYACAAF/Af8BgAIAAQEC/wH4AwABPwH/AfgCAAEfAv8BwQGAAgABPwH/AYACAAEDAv8B+AMA\n        AT8B/wE4AgABHwL/AuACAAE/Af8BgAIAAQEC/wH4AwABPwH+AQwCAAEDAv8B4AFAAQABDAE/Af8BgAIA\n        AQEC/wHwAwABPwH+AwABAQL/AfACAAEPAX8B/wGAAgABAwL/AeADAAE/Af8BwAIAAQEC/wH4AgABHwL/\n        AcACAAEHAv8BwAMAAT8B/wHAAgABAQL/AfgCAAE/Av8B8AIAAQ8C/wHAAwABPwH/AcACAAEDAv8B+AIA\n        AT8C/wH4AgABHwL/AfADAAE/Af8BgAIAAQMC/wH4ASABAAF/Av8B+AIAAT8C/wHgAwABPwH/AYADAAF/\n        Af8B/AIAAX8C/wH4AgABfwL/AeADAAE/Af8BgAMAAT8B/wH8AQABAQP/AfwCAAF/Av8B4AMAAT8B/wGA\n        AgABCAE/Af8B/gEAAQMD/wH+AgABfwL/AcADAAE/Af8BwAIAAQ8BBwH/Af4BAAEDA/8B/gIAA/8BwAMA\n        AX8B/wHAAgABDwGHAf8B/gEAAQMD/wH8AgAD/wHAAwAC/wHgAgABHwL/Af4BAAEDA/8B+AIAAT8C/wHA\n        AwAC/wHwAgABDwL/Af4BAAEHA/8B+AIAAT8C/wHAAwAC/wHwAQABAQEPAv8B/gEAAQ8E/wIAA/8BwAIA\n        AQEC/wHwAgAD/wH8AQABHwT/AgAD/wHAAgABAwL/AfwBAAGAA/8BCAEAAT8E/wIAA/8BwAIAAQcD/wEB\n        AYAD/wIAAX8E/wIAA/8BwAEAAQ4BDwP/AQEBgAP/AgABfwT/AgABfwL/AcABAAEPBP8BAQGAA/8BgAEA\n        AX8E/wIAA/8BwAEAAQ8E/wEBAYAD/wGAAQABfwT/AgAD/wHgAQABHwT/AQEBwQP/AeABAAX/AQABAQP/\n        AeABAAEfBP8BAQHjA/8B8AEDBf8BgAEBA/8B4AEAAR8E/wEBAfMD/wH4AQcF/wHgAQMD/wH4AQABPwT/\n        AQEL/wHgAQcD/wH4AQABPwT/AcML/wH8AR8D/wH4AQABfwT/AccR/wEDd/8B4AE/EP8B/gE/BP8BAAED\n        EP8B/AEfBP8BAAEBCv8B4AEAAT8D/wH4AQ8D/wH+AgABfwn/AYABAAEPA/8B+AEHA/8B/gIAAX8D/wHg\n        AQME/wIAAQMD/wGAAQABfwP/AgABfwL/AfgCAAEPAv8B/gMAAX8C/wIAAT8D/wIAAX8C/wHwAgABBwL/\n        AfwDAAE/Af8B/gIAAQ8D/wGAAQABfwL/AeACAAEBAv8B+AMAAR8B/wH4AgABAwP/AgABfwL/AcADAAF/\n        Af8B+AMAAQcB/wH4AgABAQP/AYABAAF/Av8BgAMAAT8B/wH4AwABBwH/AfgCAAEBA/8BwAEAAR8B/wH8\n        BAABHwH/AfgDAAEDAf8B4AMAAX8C/wHAAQABDwH/AYAFAAH/AfADAAEBAf8BwAMAAT8C/wGAAQABBwH/\n        AYAFAAH/AeAEAAH/BAABDwL/AwABfwGABQAB/wHABAAB/gQAAQEB/wHwAwABPwYAAf8BwAQAAf4FAAH/\n        AfADAAEHBgAB/wHABAAB/gUAAf8B8AMAAQcGAAH/AYAEAAH/BQAB/wHwCgAB/wGABAAB/wHAAwABAQH/\n        AfgKAAH/AYADAAEBAf8EAAE/Af8B+AoAAf8BgAMAAQMB8AQAAT8B/wH4CgAB/wGAAwABAwHwBAABHwH/\n        AfgKAAH/AYADAAEHAfgEAAEPAf8BwAkAAQcB/wGAAwABHwH+BAABDwH/AcAJAAEDAf8BgAMAAT8B/wHA\n        AwABPwH8AUAJAAEDAf8BgAMAAX8B/wHAAgABBwH/AfwDAAEBAeAFAAEDAf8BgAMAAv8B4AIAAQcB/wH+\n        BAABeAUAAQcB/wHAAwAC/wHgAgABBwH/AfwEAAF/AYAEAAEHAf8BwAIAAQEC/wHwAgABDwH/AfwEAAE/\n        AYEDAAEBAR8B/wHAAgABAQL/AfACAAEPAf8B+AQAAT8BgQMAAQEBHwH/AeACAAEDAv8B+AIAAQ8B/wH4\n        BAABPwGDAYACAAEBAe8B/wHgAgABAwL/AfwCAAE/Af8B8AQAAT8B/wHAAgABAQL/AfgCAAEHAv8B/AIA\n        AX8B/wHwBAABHwH/AcACAAEBAv8B+AIAAQ8C/wH+AgABfwH/AfAEAAEfAf8B4AIAAQEC/wH8AgABHwP/\n        AcABAwL/AfAEAAEfAf8B+AIAAQMD/wIAAX8D/wHwAQ8C/wHwBAABHwH/AfgCAAEDA/8BgAEABP8B/AEP\n        Av8B8AEHAfABEAEAAR8B/wH4AgABBwP/AeABAwT/Af4BHwL/AfABHwH/AX4BAAEfAf8B/AIAAQ8J/wH+\n        AR8C/wHwAT8C/wHIAT8B/wH+AgABPwn/Af4BHwL/AfgBfwL/AfgBPwL/AgABfwr/AT8K/wH4AR8L/wE/\n        rP8B4AEfFv8BgAEDFf8B/gIAAX8D/wHgAQcP/wH8AgABfwP/AeABAwr/AfABAwP/AfwCAAE/Av8B8AEA\n        AQMK/wHAAQED/wH4AgABHwL/AcABAAEBAcABPwH/AfwBHwHzBP8BgAEAA/8B+AIAAQ8C/wHAAwABPwH/\n        AfwBDwHABP8CAAP/AfgCAAEPAv8BwAMAAR8B/wH4AQcBgAF/A/8CAAP/AfACAAEPAv8BwAMAAQ8B/wH4\n        AgABfwP/AgABfQL/AfACAAEPAv8BgAMAAQMB/wH4AgABfwL/AcADAAL/AeACAAEPAv8EAAEBAf8B+AIA\n        A/8BgAMAAv8B4AIAAQcB/wH+BQAB/wH4AQABAQP/AYADAAL/AcACAAEHAf8B/gUAAf8B/gEAAQMD/wGA\n        AwAC/wHAAgABBwH/Af4FAAL/AQABAQH/AfkB/wGAAwAC/wHAAgABAwH/Af4FAAH4Af8BwAEAAR8B4AH/\n        AYACAAEBAv8BwAIAAQMB/wH8BQAB8AF/AgABDwHgAf8BgAIAAQEC/wHAAgABAwH/AfwFAAHwAT8BAAEg\n        AQcBwQH/AYACAAEBAv8BwAIAAQcB/wH8BQAB+AIAATABAAEBAf8BgAIAAQEC/wHAAgABBwH/AfwFAAH8\n        AgABHgEAAQEB8AQAAQ8B/wHgAgABBwH/AX4FAAH+AgABHwGAAQcB8AQAAQcB/wHgAgABBwH/AR4FAAH/\n        AQABAwEHAcABBwHwBAABDwH/AeACAAEPAf8BHgUAAd8BwAEDAYMBwAEHAfgEAAEPAf8B4AIAAQ8B/wEe\n        BQABzwHgAQABQwGAAQ8B+AQAAR8B/wHgAgABDwH/AR4EAAEGAcMB8AMAAQ8B/AQAAR8B/wHgAgABDwH/\n        AR4EAAEGAeMB/AEAARABAQEfAfwEAAE/Af8B8AIAAQ8B/wEeBAABDgHzAfgBPwH4Ah8B/gQAAT8B/wHw\n        AgABDwH/Af4EAAEOAvABOQGcAQ4BPwH+BAABPwH/AfgCAAEPAf8B/gQAAT4B8AFgAXgBHgEMAT8B/gQA\n        AT8B/wE4AgABHwL/BAABPgH8AQEB/AE/AQABfwH/AYADAAF/Af4BCAIAASABfwH/AYADAAE+Af4BAQHw\n        AQ8BgAL/AcACAAEBAf8B/AEEAgABIAE/Af8BgAMAAT8B/gEBAfABDwGAAv8B4AEgAQIBAwH/AfwBBAIA\n        AUABPwH/AcADAAL/AQMB/AF/AcAC/wHAASABAAEHAf8B+AEGAgABwAE/Af8B4AIAAQEB/wH+AQEB/AF/\n        AYAC/wHAASABAAEHAf8B+AEHAQABAQHAAT8B/wHwAgABAQL/AQAB/gF/AQEC/wHAASABDAEHAf8B/gEH\n        AeAB/wHgAX8B/wHwAgABDwL/AYgBPwH+AR8C/wHgATABHgEHAf8B/gEPAfwBfwH4Av8B8AIAAQ8C/wH8\n        AQcB8AE/Av8B4AE8AR4BBwL/AR8B8AEfAfkC/wHwAgABDwP/AQMBwAF/Av8B4AF/Af4BDwP/AfABHwP/\n        AfgCAAEfA/8B8wGDA/8B+AL/AQ8D/wHgAQ8D/wH4AgABPwT/Ae8K/wHgAQcD/wH4AgABPw//AeABBwP/\n        AfgCAAF/D/8B4AEHA/8B/AIAEP8B4AEPA/8B/gEAAQEQ/wHwAR8E/wEAEf8B+AE/BP8B53H/AcABPxX/\n        AfgCAAF/Av8BuwL/AfEO/wHgAgABHwL/AaEC/wHBCv8B/gF/Av8BwAIAAQ8C/wGBAv8BwAj/AfACAAEf\n        Av8BgAIAAQEC/wGAAX8B/wEAAX8H/wHwAgABHwL/BAAC/wGAAT8B4AEAAT8B/wH+Af8B/AF/Av8B8AIA\n        AQ8C/wQAAT8B/wHAAT4CAAE/Af8B/AEDAYABfwL/AfACAAEHAf8B/gQAAR8B/wHAAwABPwH/AfgBBwHA\n        AR8C/wH4AgABAQH/Af4EAAEfAf8BwAMAAR8B/wHwAQcBwAEPAv8B+AMAAv8EAAEPAf8BwAMAAR8B/wHg\n        AQcBwAEPAv8BwAMAAQMB/wQAAQcB/wHAAwABDwH/AcABBwHAAQcC/wHAAwABAQH/BAABBwH/AcADAAEP\n        Af8BwAEHAcABAwL/AcAEAAH+BAABBwH/AcQDAAEPAf8BgAEHAeABAwL/AcAEAAH+BAABBwH/AcADAAE/\n        Af8BgAEHAeABAQL/AcAEAAH+BAABBwH/AcADAAE/Af8BAAEHAeABAQL/AcADAAEDAfwBIAIAASABDwH/\n        AYADAAL/AQABDAEQAQEC/wHAAwABBwH8BAABDwH/AYACAAEBAf8B/gIAARABAAL/AcEDAAEPAfwEAAEf\n        Af8BgAIAAQMB/wH+AQABEAIAAv8BwQHgAgABDwH8BAABPwH/AYQCAAEDAf8B/gEAASACAAH/AfABAwHg\n        AgABBwH8BAABfwH/AYQCAAEBAf8B/gQAAf8B4AQAAQcB/AMAAQEC/wGAAgABAQH/Af4EAAH/AfABAgMA\n        AQcB/AEwAQABQAFhAv8BgAIAAQEB/wH+BAAB/wHwAQMB4AGMAQABfwH8ATwBAAFgAcEC/wGAAgABAQH/\n        Af4EAAH/AfgBQQHhAQwBHwF/AfwBPwEwAWcB4QL/AYACAAEBAf8B/gQAAv8BwQHiATwBPwH/Af4BHwL/\n        AcEC/wGAAgABDwL/AwABAQL/AcABxwEYAT8B/wH+AR8C/wHBAv8BhAIAAS8C/wMAAQEC/wHgAccBAAE/\n        Af8B/gEPAv8BgQL/AYACAAEvAv8DAAEBAv8B8AFPAZABfwL/AQ8B5wGfAYMC/wGHAgABHwL/AYACAAEB\n        Av8B8AEHAYABfwL/AQMB5wEeAQcC/wGGAgABGQL/AcACAAEDAv8B+AIAA/8BgQHnAR4BDwL/AYYCAAE5\n        Av8BwAIAAQEC/wH+AQABAQP/AcAB5wEcAQ8C/wGGAgABOQL/AcACAAEBAv8B/AIAA/8BwAEnAQABHwL/\n        AYQCAAE/Av8BwAIAAQEC/wH4AgABfwL/AeABBwEAAT8C/wGAAQABAQE/Av8BwAIAAQEC/wH4AX8B8AF/\n        Av8B+AEHAQABfwL/AYABNgGBAb8C/wHAAgABAQL/AeAB/wH4AT8C/wH8AQcBAQP/AYAB9gGRAb8C/wHA\n        AgABAwL/AeAB/wH8AT8D/wIHA/8BgQH3AZED/wHAAgABAwL/AfAL/wHHAf8B8wG/Av8BwAIAAQcO/wHH\n        Af8B+wG/Av8B4AIAAQcO/wHHBf8B4AIAAQ8U/wH4AgABDxT/AfgCAAEfFP8B/AIAAX8V/wHAAQMW/wH8\n        AZ98/wHgAQcP/wHgAT8B/wGBA/8BwAEDCv8B/AEfA/8BwAEfAf8BAQP/AYABAwr/AeABAAP/AYABBwH+\n        AQAD/wEAAQEF/wHwAX8D/wIAAQMC/wIAAf4BAAE/Av8BAAEBBf8BwAFgAX8C/wIAAQEC/wIAAf4BAAE/\n        Av8BAAEBBf8BgAEAAT8C/wIAAQEC/wGAAQABPAEAAR8C/wEAAQED/wH+AQcBgAEAAT8B/wH+AwABfwH+\n        BAABBwL/AQABAQP/AfwBAQGAAQABPwH/Af4DAAF/Af4EAAEHAf8B/gIAA/8B+AEAAYABQAE/Af8B/gMA\n        AT8B/gQAAQcB/wHwAgABHwL/AcABAAGAAQABfwH/Af4DAAE/AfwEAAEHAf8B4AIAAQ8C/wHAAQABQAEA\n        A/8DAAE/AfgEAAEHAf8BwAIAAQ8C/wGAAQABfgEDA/8B4AIAAT8B+AQAAQcB/wHAAgABBwH/Af4CAAE8\n        AQMD/wHwAgABPwHwBAABBwH/AYACAAEDAf8B/gIAARgBAwP/AfACAAEfAfAEAAEDAf8BgAIAAQMB/wH+\n        AwABAwP/AfwCAAEfAfAEAAEDAf8DAAEBAf8B/AMAAQED/wH8AgABDwHwBAABAwH/AwABAQH/AfwDAAEJ\n        BP8CAAEPAfgEAAEBAf4DAAEBAf8B+AMAAQ0D/wHwAgABDwH4BAABAwH+AwABAQH/AfgDAAEEA/8DAAEP\n        AfwEAAEBAf4DAAEBAf8B+AMAAQQD/wMAAT8B/gUAAf4DAAEBAf8B+AQAA/8CAAEBAf8B/gUAAfgEAAE/\n        AfgEAAF/Av8BgAEAAQMB/wH+BQAB+AQAAT8B+AQAAT8C/wHkAQABDwH/Af4FAAH4BAABPwH+BAABPwL/\n        Af4BAAE/Av8EAAEHAfgEAAE/Af8EAAE/Av8B/gFwAT8C/wGAAwABDwH4BAABPwH/AcADAAF/Av8B5AFw\n        AT8C/wGAAwABDwH8AQ8BgAEBAcABfwH/AfgDAAF/Av8BgAEAAT8C/wHAAwABHwH8AQ8BgAEHAcABfwH/\n        AfgDAAF/Av8CAAE/Av8BwAMAAT8B/gEHAYABBwHAAX8B/wH+AwABfwL/AgABPwL/AcADAAE/Af4BBwHA\n        AQcBwAP/AYACAAF/Af8B/AIAAX8C/wHgAwABHwH+AQcBwAEPAcAD/wHgAgABfwH/AfgBAAT/AeADAAE/\n        Af4BAwHgAQ8BwQP/AfACAAF/Af8B8AEABP8B8AMAAT8B/wGDAfABHwGBA/8B/AIAAv8B4AEDBP8B+AMA\n        Av8BwQH4AT8BAwP/AfgCAAL/AeABAwT/AfgCAAEDAv8BwQH5Af4BAwP/AfgCAAL/AeABBwT/AfgCAAEP\n        Av8B8AH/Af4BDwP/Af4BAAEBAv8B+wEPBP8B/AIAAQ8C/wH4AT8B8AEfBP8BAAEBCP8B/AIAAQ8C/wH4\n        AR8B8AF/BP8BwAEDCP8B/AIAAR8D/wEfAeMP/wH+AQABwAF/Ff8BAAH9Fv8BAJf/AfYX/wHAAT8H/wGB\n        AfMBzwH/AX8J/wH+AQABPwb/Af4BAAEhAQcB/wE/Af8B5wL/AecE/wHwAQABHwL/Af4D/wH+AQABQAED\n        AccBPwH/AcMB/wF/AeME/wHAAQABHwL/AfwBPwL/Af4BAQEAAQMBgQG/Af8BxwH8AR8B8QT/AYABAAE/\n        Av8B/AEfAv8B/AEDAQABAwGAAd8B/wHDAfwBHwHhBP8CAAE/Av8B/gEfAv8B/AEHAQABAQGAAV8B/wGH\n        AfABBwHhBP8CAAE/Av8B/AEfAv8B+AEBAgABwAFfAf8BgwIAAeAD/wE+AgABPwL/AfwBDwL/AfgDAAGA\n        AR8B/wEDAgABQAL/Af4DAAE/Av8B/AEfAv8B+AQAAR8B/wQAAv8B8AMAAT8C/wHgAQMC/wH4BAABPwH/\n        BAABfwH/AeADAAE/Av8B4AEAAv8B+AQAAT8B/wQAAX8B/wHgAwABPwH/AfgCAAEBAf8B+AQAAT8B/wQA\n        Av8BwAMAAT8B/wHAAwABfwH4BAABPwH/BAAC/wHgAwABPwH/AcADAAE/AfwEAAE/Af8BgAMAAv8BwAMA\n        AT8B/wGAAwABDwH+BAABPwH/AcADAAL/AYADAAE/Af4EAAEBAf8EAAF/Af8BwAIAAQEB/wF/BAABPwH+\n        BQAB/wHAAwAC/wHAAgABAQH/AX8EAAF/AfwFAAH/AfgCAAEPAv8B4AIAAQMB/wE+BAABfwH8BQAB/wH8\n        AgABHwL/AeACAAEDAf8BPgQAAWMB/gQAAQEB/wH8AgABPwL/AeACAAEDAf8BfgQAAUEB/AEAASACAAE/\n        Af8B/AIAAT8C/wHwAgABBwH/AX4EAAEhAfAEAAEfAf8B/AIAAT8C/wHwAcABAAGPAf8B/gQAASMB8AQA\n        AQ8B/wH8AgABPwL/AfgBwAEBAY8B/wH+BAABPwHgBAABDwH/AfwCAAE/A/8B4AEDAv8B/gQAAf8B4AEA\n        AQICAAEHAf8B/AIAAT8D/wHAAQEC/wH+BAAB/wHgAQABAQGAAQABBwH/AfwCAAE/A/8BwAEAAv8B/gQA\n        A/8B4AEHA/8B/AIAAX8D/wHAAQABfwH/AfwDAAEBA/8B4AEPA/8B/AIAAX8D/wGAAQABfwH/AfgDAAEB\n        A/8B8AEfA/8B/gIAAX8D/wGAAQABfwH/AfgDAAEHA/8B/AE/BP8CAAT/AYABAAF/Af8B8AMAAQ8D/wH8\n        AX8E/wIAAX8D/wGAAQABfwH/AfADAAEPCf8CAAF/A/8BgAEAAX8B/wHwAwABHwj/Af4CAAF/A/8BgAEA\n        AX8B/wHgAQABAQHAAT8I/wH+AgABfwP/AcABAAF/Af8B6AGAAQcB2AHwCP8B/gIAAX8D/wHAAQABfwL/\n        AQABHwH/AeABfwf/Af4CAAF/A/8BwAEAAX8B/wH+AQABPwH/AYABfwf/Af4CAAF/A/8BwAEAAv8B/gEA\n        AX8BvwFgAX8H/wH+AgABfwP/AeABAAL/Af4BCQL/AfABfwj/AgABfwP/AfgBAwL/Af4BDwz/AgAF/wG/\n        Av8B/gE/DP8CABb/AcABAxb/AeABBxb/AfABH7L/AfAL/wHwAQMK/wGAAT8K/wHgAQMK/wEAAR8K/wHg\n        AQMK/wEAAR8D/wHgAQEB8AEDA/8B8AEACv8BAAEBA/8BwAEAAeABAQP/AfABAAT/Af4BBwT/AgABDwL/\n        AYABAAHgAQABfwL/AfABAAF/A/8B+AEBA/8B/AMAAX8B/gQAAR8B/wH8AwABHwL/AcABAAEPAv8B+AMA\n        AT8B/gQAAQ8B/wH4AwABBwH/AcACAAEPAv8B8AMAAR8B/gQAAQcB/wH4AwABBwH/AYACAAEHAv8B4AMA\n        AQcB/gEBAcACAAEHAf8B+AMAAQMB/wMAAQEC/wHAAwABBwH+AQcB8AEAAcABAwH/AfwDAAEDAfwEAAE/\n        Af8BwAEAAQEC/wH8AQcB4AEAAXABAwH/Af4DAAEBAfwEAAEPAf8BwAIAAT8B/wH4AQMB4AEAAXgBAwL/\n        AwABAQHwBAABAQH/AcACAAEfAf8B+AEBAeABAAF4AQMB/wHAAwABAQHwBQAB/wHgAgABDwH/AfgBAQHg\n        AQABfAEDAf8BwAIAAQEB/wH8AX4CAAEBAeAB/wHgAgABAQH/AfgDAAHwAQMB/wHAAgABAQH/Af4BPgIA\n        AQEB8AH/AcACAAEBAf8B+AQAAQcB/wHAAwAB/wH+AR4BEgIAAv8BwAMAAf8B+AFgAQABBgEAAQcB/wHA\n        AwAC/wHOARMBEAEAAT8B/wQAAX8B+AF4AQABBgEAAR8B/wHAAwAC/wHCAwABHwH+BAABfwH4ATwBAAEO\n        AQABPwH/AcADAAL/AfICAAEIAQ8B/gIAARgBAAE/AfgBPwHgAY8BwAE/Af8BwAIAAQEC/wH+ARMBkgIP\n        Af4BAAEEAR8BAAE/AfwBHwHgAQ8B8AE/Av8B8AEPBP8BAwGSAR0BBwH+AQABBwE/AfABPwH8AQ8B4AFf\n        AeABPwL/AfABDwT/AgABGAEPAf4BAAEfA/8B/gEHAfgBPwHAA/8B8AEPBP8BgAIAAT8B/gEAAT8D/wH+\n        AQABBAIAA/8B8AEPBP8B4AGAAX8B/wH+AQABPwT/AQABBAEAAQED/wHwAQ8E/wHgAQAC/wH+AQMF/wHA\n        AQMBAAEHA/8B8AEPBP8B+AEDAv8B/gEPBf8B4AEDAYABDwP/AfABDwT/Af4BDwL/Af4BHwX/AfgBBwHA\n        AR8D/wHwAQ8I/wH+AX8M/wHwAQ8W/wHwAQ8W/wHwAQ/4/ws=\n</value>\n  </data>\n  <metadata name=\"ilBloodline.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ilBloodline.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC4\n        fQAAAk1TRnQBSQFMAgEBDAEAASgBAAEoAQABOAEAATgBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo\n        AwAB4AMAAeADAAEBAQABCAYAAcQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA\n        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5\n        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA\n        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm\n        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM\n        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA\n        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz\n        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ\n        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM\n        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA\n        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA\n        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ\n        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/\n        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA\n        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm\n        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ\n        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz\n        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA\n        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM\n        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM\n        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM\n        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA\n        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM\n        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ\n        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz\n        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm\n        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw\n        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8A/wD/AP8A\n        /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A\n        /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AOgAC9AP/AQAD/wEAAv8CAAL/BgAC/wIAAf8CAAL/AQAE/wIA\n        A/+3AAG8Au8B8gL/AvQC/wL0Av8C9AL/AgAC/wH0A/8B9AL/AfQC/wT0Av8C9AL/ewAy/wkAAfMC8AEH\n        AfMB8QIHAfAB8gG8AQcC8QIHAfMB/wIAAf8B8AEHAbwB8QG8AQcB8wG8AQcBvAHxAbwDBwG8AfEBvAEH\n        AfAB/3oAAf8B8wG8AfQB/wHxAbwB8gHxAQcB8QHwAQcD8AHxAQcB8wH0AfEB8gHzAfAC8QHwAvMBvAHx\n        Af8B8QG8AfABBwHxAf8B8wHwA/EB9AHxAQcC8wHwAfIB/wkAAf8B8AH0AQcB8wHwAfQB8QHwAfIB8QHy\n        AQcB8QHyAe8B9AH/AgAB/wHwAfQCBwHyAe8BvAHyAfABvAHxAvIBBwG8AQcB8QHyAQcB8QH/egAB/wHx\n        Ae8B8gH/AfEBBwHzAfAB9wHzAQcB7wHyAvEBBwGSAfECvAHxAQcB8QH0AfMB7wEHAbwBBwG8AfABBwLy\n        Ae8B8QHyAe8B8gH0AfEB7wIHAe0B8gK8AfQB/wkAAf8B8AH/AQcB9AHxAf8B8QHyAfQB8QHzAQcC8wHv\n        Af8EAAHxAf8CBwH0Ae8BvAH0AvAD8gEHAfQB/wLzAe8B8nsAAfQB8AEHAbwB9AHyAQcB8QEHAZIB9AEH\n        AfcB8QHzAfQBvAHtAgcB8wHyAe8B9AEAAf8B8AIHAu8BBwHyAf8B8wHvAvEB9wH/AQAB9AHwAQcBvAHs\n        AgcB9AH/CgAB/wHwAf8BBwH0AfEB/wHxAfIB9AHyAfMBBwLzAe8E/wEAAfEB/wIHAfQB7wG8AfQC8ALy\n        AfMBBwH0Af8C8wEHAfIKAAL/AvQX/wL0Av8BAAX/AQAC/wH0Av8BAAP/AQAE/zwAAf8B8gHvAfMBvAHz\n        AfEBvAIHAZIB9AG8AgcB8gH/AfACBwHvAfIB8wHvAfQBAAH/AfEBvAEHArwBBwH/AQAB8wHvAfIB9AGS\n        Af8BAAH0AfECBwHvAQcB7wHyAf8KAAH/AfAB/wEHAfQB8QH/AfEB8gH0AfIB8wEHAvMB7wH0AfEB7wEH\n        Af8B8QH/AgcB9AHvAbwB9ALwAvIB8wHtAe8B8gLzAQcB8goAAf8BvAHvAQcB9wHxAbwB9wPvAfEBkgH3\n        Ae8BBwHzAQcB9wG8AfMB9wLvAfcB8ATvAfMB/wHxAZIB7wHzAv8BBwHvAgcB8gH0AQcB9wHyAf8CBwH0\n        Af88AAH/AfEB8AH/AfEBvAHwAbwB9AHxAZIB9AG8Ae8B8wHyAf8B8AGSAfMCBwHxAfcB8QL/AbwB8QHw\n        Ae8BBwHvAfMB/wHzAe8B8gHwAe0B8wH/AfQBvAHxAbwB7AHzAe8BvAH/CgAB/wHwAf8BBwH0AfEB/wHx\n        AfIB9AHyAfMBBwLzAe8B9AHyAfAB8gH/AfEB/wIHAfQB7wG8Af8C8ALyAfQB7wHxA/MBBwHyCgAB9AHw\n        AfQB/wLvAfMBvAH0Af8B8AH/AQcB8QH0AQcB8QHzAQcC9AEHAfIB/wHyAfEB8AL/AfAB8QH/AQABBwHw\n        Av8BvAEHAv8B8wEHAfMB8QHvAf8B8AG8AfQIABD/AQAF/wIABv8CAAX/AQAJ/wYAAf8B8gHvAfAB/wH0\n        Au8BBwHyAfAB9wHyAQcB9wHwAQcB8gEHAfcB8AEHAfEB9AHxAQcB8gHwAbwB8wHxAe8CvAEHAfMB8gHv\n        AfAB8wHwAbwB8gLwAfQBvAHtAfABBwHyAf8KAAH/AfAB9AEHAfQB8AH/AvEB9AHxAfQB7wHyAfMB7wH/\n        BAAB8QH/AQcB7wH0AQcB7wH/AvAC8gHzAQcB8gPzAQcB8gH/CQAD/wHzAe8BvAH0AQcC8gHzAQABBwHx\n        AfQBvAHyAfMBBwL0AQcB8AHzAfAB/wH0Af8B8gG8AfIB/wEAAQcB8QH/AfQBvAHyAgAB/wLwAfEB7wHy\n        AQcB8gH/CAAB9AHzAvIC8wL0AfMC8gH0Af8B8wHyAfQB/wHzAfIB8QHzAv8BAAH/AfMC8gHzAf8BAAH/\n        AfQD8gH0Af8B9ALyAfMC9AHzAfIB9AH/BQAB/wHzAfIB8wH/AfQC8QHyAfMC8gHzBPIB8wHyAfEB8gHz\n        Af8BAAH/AfMC8gL/AfMB8QHyAf8B8gHzAfIB8QH0Av8C8gHzAf8B9AHyAfEB8gHzAf8LAAH0AbwB9AEH\n        AfMBvAH/AfEBvAHyAfEB9AHvAfQB8wEHAf8DAAH/AbwB/wHwAQcB9AHwAe8B/wPxAvMB7wIHAfEB9AEH\n        AfAB/woAAfQBvAHvAfIB/wH0AQcBvAEHAfIBAAIHAbwBBwH0AfMBBwL0AgcB8AHvAf8B9AG8AQcB8QL/\n        AQABBwHxAf8B8gHvAfMCAAH/A/EB7wHwAbwB8QH/CAAB9AG8AgcB8AEHAbwB8gMHAfMB8QEHAbwB8wHx\n        AQcBvAHwAbwB8QH/AQAB9AHwAgcB8QL/AfIBBwHwAfECBwLyAQcB7wG8AfIB8AEHAfAB9AH/QwAB/wHz\n        AfQB8wH0AfMC9AHzA/QB8wP0Af8DAAH/AfMB9ALzAfQC8wb0A/MC9AHzAfQB/wkAAf8B8AG8AfMD9AEH\n        AvQB8wH/AQcBvAHxAQcB9AHzAQcC9AEHAfIB/wHxAf8CBwP0Av8BBwHwAf8B8wG8AfEC/wH0AQcB8gHx\n        Ae8B/wHwAbwB/wkAAfEB8gHwAfQB8AEHAfQC8QHwAfMBvAHwAvQB8AEHAfQB/wHzAbwB9AEAAf8B9AK8\n        Af8BAAHzArwB9AH/AfMB8AHvAfQB8AEHAfIB8QHwAfEB/3gAAf8B8gG8AfIBBwHxAfIBBwLwAQcB9AIH\n        ArwB9AHxAbwB8gHzAe8BvAHxAQcB9AIHAfICBwG8AfEB7wEHA/ABBwLyAQcB8AH0AfAB7wHyAQcB8AH/\n        CQAC8gG8AfMCvAH0AvEBBwK8AfMB/wH0AfIBBwH/AQAB/wG8AfQCAAH0AbwB8AL/AbwB8QHwAf8BAAH/\n        AfEBBwHyAfACBwHwAQcB/3kAAv8B8gLwAfQB8wLyAfEB8gH/AvEB8gL/AfMC8gH0AfEB8gLxAv8B8QHw\n        AfEB8gHwA/IB8QHyAf8B9AHxAfAB8wL/AfMC8QHzAf8KAALyAe8BvAEHAfMB/wLxAQcB8AEHAfQB/wH0\n        AfIBBwH/AQAB/wG8AfQCAAH0AbwB8AL/AbwC8QH/AQAB/wLxA/ADvAH/tAAC8gEHAbwBBwHyAf8C8QHw\n        AfEBBwHwAf8B9AHyAQcB/wEAAfQBBwHzAv8B9AG8AfAC/wG8AvAB/wEAAf8B8QHwAfIB8QG8AvEBBwHy\n        HQAC/wH0AfID8QHzA/8rAA3/UwAB/wHxAfIBvAHzAbwB8QH/AvEB8AHzAbwB8QH/AfMB8gHvAv8B9AEH\n        AfIBvAHyAfMBvAHwAfQB8QEHAfABBwH0Af8B8QHwAQcB9AHwAQcB8gLxAfIZAAL/AfQB8gEHAewBEgEV\n        AUMBEAERARQBbQHtAbwB8wL/JQAE/wH0AfEBvAHvAZIB7QHsAe0B9wEHAfAB8wH0Av9QAAH0AbwB8AHv\n        AQcB8AHzAfQBvAHwAQcBvAHwAfMB9AG8AfAB7wHyAfQB8QEHAfABBwHvAbwCBwK8AfMB8QK8AfABvAHx\n        AfQB8wG8AgcBvAHwAf8XAAL/AfQB8AHtAeoDEgETARQBFQNDAREBQwESAZIB8QL/IgAC/wH0AfEBBwHs\n        AW0BEwFDAhEBEAIPARABQwHqAe0BvAH0Av9OAAH0BPMB9AH/AfQB8wHyAvMB9AH/AfQB8wHyAfMC9ATz\n        AfID8wLyAv8B8wLyAfMC/wXzAf8XAAH/AfQB8AH3AuwB7QLsAesB6gESAxQCFQFDAREBEAETAe8B8gH/\n        HwAD/wHyAe8B7AFtAuoBEgETAhUCEQMPAQ4BDwFDAesBBwH0Af8pAAP/AQAD/18AAf8B8wEHAfcB7wEH\n        Au8B7QLsAesB6gESARMDFAEVAkMBEQFDAesB8AL/HQAB/wH0AQcB7QPsAesCbQHqAm0B6gESARUBQwEQ\n        AQ8DDgFDAewB8gL/HAAC/wcAAv8B8wHxAf8BAAH0AfEB8wH0Av8GAAL/UwAB/wHzAe8BBwS8AQcB7wL3\n        AewB6wFtAeoBEwMUARUCQwEQAREB6gG8Af8cAAH/AfMB7wHtAfcCkgPtAewBbQESAkQBEgHqAewB6wES\n        AREBDwIOAQ8BbQHwAf8cAAHzAfIB/wQAAf8B9AEHAesBSgHrAfMBAAG8ARQBEgHsAQcB9AH/BAAB/wG8\n        Af9SAAH/AfQB7wEHBPAC8QEHAbwB8AG8Ae8B7QFtAhIDFAEVAkMCEQEUAbwB/xoAAf8B8wL3A+8CBwHs\n        AUQCHgYLAREBbQHsARUBDwMOARQB8AH/GwAB8wHsAfMB/wIAAf8B8AFEAiMBIgFtAfMBAAEHAyIBEAHr\n        AfEB/wMAAfMB7AH/UQAB/wH0AfcBvAHxAvAB8QHyAbwB8QH0A/8BAAH/AQcB6wHqARICFAIVA0MBEQEU\n        AfIB/xgAAf8B9AL3AgcCvAGTAUUB6QEBAR8DAQIeBAsBDwHqARMBEAMOARQB8QH/GgAB/wFKAe0B8QL0\n        ARwBIwFLAUUCIwFtAfMB/wEHBSIBFAEHAvQB8QHrAe8B/1EAAf8CBwHwBPEB8AHzA/8EAAH/AfIB7AHq\n        ARMDFAIVAkMBEQFtAfMB/xYAAv8B7wHsAe8BBwG8AQcBbwJFA+kDHwIBAUQCHgMLAUMBFAEQAw4B6gHz\n        Af8XAAH/AQAB/wEcAUQBEgHrAW0FSwEjAUoB8QH0Ae8EIgJDAUQB6wFtARQB6wHzAgAB/ycABv8hAAH/\n        AfIB9wLwAvEB8AHxAfQC/wcAAf8B8QHrARIBEwMUARUDQwERAfcB/xYAAf8B8AHsAe0B9wIHAW8CRgIg\n        BOkCRgFFAUQBIwIeAwsBEAFDARADDgHsAfQB/xUABP8B8wFzAiMBSgF0AZMBHAFSAksBSgHsAe0BEgIi\n        AUQBbgHsAW4BRAIiAW0BvAH/AQAD/xsAAv8C9AL/AgAD/wHzAfIB8QHyAfMB9AP/HgAB/wHvAQcBvAHw\n        AfEBvAHxAfQC/wkAAf8B7wFtARIBEwMUAhUCQwESAfEB/xQAAf8B8wHsAesB7ALvAW8CRgMgAekCRQFG\n        AUUCRAFDAgsCHgMLAQ4BDwMOAUMBvAH/FQAB/wG8AfMC/wHyAW4BRAFzAbwC8QGZAUwBSwFzAhwBbQIi\n        AW4BvAHyAfAB6wEiAUQB7wH0Av8B8wHxAf8aAAH/AfMBBwH3Ae0B7wHyAf8B9AHxAQcB7QFtAxIBbQHs\n        Ae8B8QH0Av8bAAH/AfIB7wK8A/AB8wL/CwAB8gHsAW0BEgETAxQCFQFDARUBkgH/FAAB/wEHAW0B6wHt\n        Ae8BbgFFAUYBQAMgAekBHgJFAUMCAAEOAQsBAQJEBAsBDgEPAw4B6wH0Af8UAAH/Ae8B7QHyAfQB8wHs\n        AUoBBwHyAvQB8AJLAXMB9wHvAewBIgFEAe0B8gL/AfIBEgFEAe8B9AH/AfEB7AHzAf8WAAL/BPMB8gEH\n        AW4BRAFtAe8B6wESARUBEQEQAhEBIgEQAREBFQESAe0B8AH0Af8aAAH/AQcB9wEHAbwB8AEHAfMC/wwA\n        Af8B9wHrAW0BEgEUAhMBFAIVAUMBbQHzAf8SAAH/AfMB7AHqAesB7wFuAUUB6QIgASUBIAElAUUDRAEO\n        AgsBAAEeAR8BRQERAR4ECwQOARUBvAH/FQAB8wJKAewB6wFEAewB8QH0Av8B8wNLAVEBcwFEASMBSgHv\n        AfMD/wEHASIB6gHsAesBEgEcAf8XAAH0AfcB6wHqAesB7AEHAfMB8QFEAUMBFQFDAREBQwJEAeoB6wHt\n        AZID9wHsAW0B7wHzAf8ZAAH0AfcB7wEHAbwBBwHxAv8NAAH/Ae8B7AHrAW0DEgETARQCFQETAQcB/xIA\n        Af8B8ALqAesB7wFEAekEIAElAUYBbwFEAg4BAAELASQCCwHpAUUBEQIeAwsEDgEPAe0B/xUAAf8BBwFE\n        AiIBRAEcAfMB/wIAAfQBHAFLAZkBBwG8ARwBRAFLAbwB9AH/AgAB8wEVAiIBRAEcAfMB/xcAAv8B9AG8\n        AW4CRAG8AfAFRAFuAe8BBwHxAfMC/wMAAf8B9AG8Ae8B8gH/FwAB/wHxAe0B7wEHAbwB7wH0EAABBwLs\n        AesDbQETAhQCFQH3Af8SAAH/Ae8BFAETAesBEgEeAR8DIAFGAUUBbwFFAUMBDwIOAQsB6QEeAQsCRQEL\n        AQEBHgQLBA4BbQHzAf8UAAL/AQcBSgEiAUQBBwL/AgAB/wGZAUsBdAEHAfABkgFEAW4B8AL/AgAB9AHs\n        ASIBSgHvAfMC/xkAAv8BvAFuAUUB6gFEAUUBRAFFAW4B7wHwAfMB9AHzAfIC8QHyAfQC/wEAAf8B9AHz\n        Af8XAAH/AfAB7AH3Ae8CBwP/DQAB/wHvAe0C7ALrAm0BEgMUAe0B9BIAAfQB7AEVARQBbQIeAQEB6QIg\n        AUYBRAERAUQCRQFEAQ4BAAEfAQEBAAELAREBCwEBAh4ECwEPAg4BFQHwAf8UAAP/AfACSgHwAf8DAAH/\n        AbwCSwJzAksBdAHxAv8CAAH/ARwBFQHtAfMC/xsAAf8B8wHtA0UBSwFMAZMBvAHyAfQB8wG8AewBEgET\n        ARIBbQHtAbwB8wL/GgAB/wG8Ae0D9wHxA/8MAAL/Ae8D7QHsAusB7AHqARMCFAHsAfQSAAHzARMBFQEU\n        ARMBCwEeAQEBHwHpASABRgFFAUQBRQFGAW8BbgEQAQABAQHpAR4CAAEeAgECHgMLAQ8CDgFDAQcB/xUA\n        Av8B9AFtAUoB8QH/BAAB8AFLAXQBvAEaARwBSwEcAfIC/wIAAf8B7wFDAQcC/x0AAfQB7QFEAUUBTAF0\n        AZkB8AHzAfQBvAHrARQBbQHsAe8BBwK8AQcB8AHzAf8aAAH/Ae8B7AHtAfcB7QHzAf8B9AHzAf8LAAH/\n        AfIC7wH3AZID7AHvAesB6gESARMB7AHzEQAB/wHyAREBQwEUARUBCwEeAQEBHwHpAiABRgHpAkYBbwFE\n        AQ4BAAHpAUABIAIBAekCHwEBAR4DCwEOAg8BQwHvAv8WAAH/AW0BEwHwAf8EAAHxAUsBcwEHAfAB7QFL\n        AZkB8wH/AwAB/wHvAUMBBwH/HQAB/wHwARIBRAFFAW8BGgHwAvQB7wESAW0B9wG8AfIB9AT/AvQB/xoA\n        Af8B7wTsAfQB/wHwAe8B8wH/CAAC/wH0AQcB7wEHAe8B9wGSAe0B7AG8AesBbQLqAewB8xEAAf8B8AEQ\n        AREBFAEQAQsBHgEBAh8EIAFGAW8BRAEPAQABCwVGAiABHwIBAR4CCwEOAg8BQwH3AfQB/xYAAf8B7AFE\n        AQcB/wQAAfICSgFuAXMCSwG8AfQB/wMAAfQB7QFEAbwB/x0AAfMBbQFDAUQBRQGTAbwC9AHvAUQBbQHv\n        AfMB9AT/AwAB/xsAAfQB9wHrAuwB6wH0Af8B8QHsAfcB9AgAAv8B8AHvAbwBBwHvBPcB8QHsAesCbQHs\n        AfMRAAH/AbwBDwERARUBDwELAR4CAQEfAukBIAFGAW4BRAEOAQABCwFFAUYBbwFGAUUBRgMgAekBAQEe\n        AgsBDgIQARUBkgH0Af8WAAH/Ae8BIgGSAfQEAAHzAesBSwHvAbwBHAFLAbwB9AH/AwAB9AFtARIB8gH/\n        HAAB/wFtAREBQwFEAW4BBwH0Af8BBwJEAe0B8wP/IgAB/wHvAm0B6wFtAfMBAAHzAe8B7AHtAfQB/wQA\n        Av8B9AG8Ae8CvAIHA+8BvAHyAuwC6wHtAfMRAAH/AbwBDwEQAUMBDwILAR4CAQHpAUUCRgFuAREBDgEL\n        AUYBEQEQAUUBRAELAekCIALpAR8BAQEeAQsBDgEQAREBFAHvAfQB/xYAAf8B8AEiAW0B8gH/AwAB9AHs\n        AW0B8gH0AQcBSwG8Av8CAAH/AfABQwHsAfQB/xwAAfIBEAJDAUQBbgG8Af8B9AFuAkUB7QH0Af8kAAH/\n        Ae8BbQHrAW0B6wHxAv8B8AHvAewBbQG8AfQC/wL0AfEC7wLxAbwDBwG8AQcC8QPsAesB9wH0EQAB/wHw\n        AQ4BDwERAQ8CCwIeAgEBRQFEAUYBbgERARABRQFvAW4BQwEQAQ8BCwFFAUYCIAHpAR8BAQEeAQsBDwIR\n        ARMB7wH0Af8XAAH0AesBQwHvAf8DAAH/Ae0BbQHzAf8BvAFLAbwC/wIAAf8B7AFKAbwB/x4AAQcBFQFD\n        AkQBbQHwAfQB8AF0AUsBbgG8Av8jAAH/AbwBEgJtAeoB7wH/AQAB8wIHAfcBbQHsAe0C7wL3AbwB8wHy\n        AfEB8AEIArwC8AH0AQcD7QHsAe8B9BEAAf8B8gIPARABDwMLAh4CAQELAUQBEwEPAQ4BRQF0AW8BEwFE\n        AkUCRgIgAekBHwEBAR4BCwEQAkMBEgEHAv8XAAH/AQcBRAESAfAB/wIAAf8BHAHqAfMBAAG8AXMB8AL/\n        AQAB/wEHAUQB7QHzAf8eAAH/AfcERAFtAfAB9AG8AZMBSwFuAQcB9AP/AwAD/xoAAf8B8QHqARMBEgHq\n        AewB9AL/AfEB7wEHAbwBBwLvAQcBvAHyAfMC8gHxA/AB8QG8AfIB9AP3Au0BBwH/EgAB8wEVAw8ECwEe\n        AQEBRQFEBA4BEAEUAW0BFAERBEYCIAHpAR8BAQEeAQsBQwEVARQBbQHwAv8YAAH0Ae0BRAHrAfED/wHv\n        AeoB8wEAAbwBcwHxA/8BvAHqAXMBvAL/HgAB/wH0AesCQwJEAesB8AHzAfABkwFuAUoB7QEHAfIB9AL/\n        AfQB8wH0Af8bAAHzAesBFAETARIB6gHwAf8BAAH/AfAB7wK8AfAD8QHwAfEC8gHxAfAB8QHyAfAB8QH0\n        AfIB9wLvAvcB8AH/EgAB9AHrAw8ECwEeAUQBRQFEAQsCHgJEAREBDwEOAREERgIgAekBHwEBAR4BCwIU\n        ARMB7AHyAf8ZAAH/AfIBcwFEAW0BvAH0Af8BBwFtAfMBAAG8ARwB8gH/AfQB7wFLAXQBvAH0Af8gAAH0\n        AewBEQFDA0QBbgEHAfIB8QEHARwBSwHqAesB7AGSAfcB7wHxAfQB/xsAAf8BkgEUAhMB6gHtAfQB/wEA\n        Af8B8QEHArwB8ALxAfAF8QHyAfAB8QH0Af8BBwH3A+8BBwHzAf8SAAH/Ae8BDgIPAQ4ECwEjAUQCCwEf\n        A0UBEAEAAQ8CRQFGARcBRgIgAekBHwEBAR4BEQESARMB6gHvAfQB/xkAAv8B8QFzAUQBEwHtAfAB7wHs\n        AfMBAAG8ARwB8QG8AXMBSwGZAbwB8wL/HwAB/wHzARIBRAESBEQBbgH3AfAC8gEHAe8BkgHtAfcBBwHz\n        Av8BAAP/GAAB/wG8AeoBEwISAW0BBwH/AgAB/wHzArwC8APxAfIC8wLwAfIC/wHyAZIFBwL/EgAB/wHw\n        AUMBDgEPAQ4BAAcLAQEBRQFuARUBDgELAkUDRAMgAekBHwEBAQsBFALqAesBBwH/GwAC/wHzARwBSgEV\n        AhQB6wHzAQABvAFLAeoBSgFzAZkBvAHzAv8dAAP/AfMB7QEUAesBBwH3AUQBQwJEAUUBbgHvAfEC8wP0\n        BP8B9AHwAfIB/xkAAfQB7AEUARMCEgHrAfEB/wIAAv8B8wK8AfAC8QHwAbwB8AHyAfQC/wH0AfcB7wG8\n        AQcCvAHyAf8UAAH0AesCDgEPAQ4GCwEeAkUBEgIPAUYBRAFDARABDgEBAyAB6QEfAQEBRANtAfcB8gH/\n        HAAC/wH0AfABHAFKASIBbQHzAQABvAFKAUsBmQG8AfIB9AL/HgAB8wH3AesBEwFuARwBBwHyAfQBEwNE\n        AUUBSwFMAUsBbgH3AbwB8QLzAfIB8QH3AewB8AH/GwAB8AESARQBEgHqARMB6wHyAf8CAAP/AfQC8wHy\n        AvMB9AL/AQAB9AL3A7wB8AEHAfQB/xQAAf8BBwERAw4BAAQLAx4BRQESAQ4BDwFuAQ4BFQJEBCABHwEB\n        AUQB6gHrAuwBBwL/HgAC/wH0AfIBBwHsAfMBAAG8Ae8B8AHzAfQC/yAAAf8B8wG8AfAB8QLzAfIB7QFE\n        Ae0B9wFuAUsCRQJLAUUCRAEUAhMBEgH3AfMB/xwAAf8B7QEUARMCEgETAW0B8AL/AgAK/wHzAZIB7QS8\n        AQcB8gL/FQAB9AHrAQ8DDgEABAsCHgJEAg4BAAEOAUMBRAHpBCACAQHqAuwB7QHvAfIB/yAAA/8B9AH3\n        AfMBAAG8AQcE/yMAA/8B8wEHAewB7QEHAfAB8wHxAQcBHANvBG4B7QEHAfEC/x4AAfQB6wITARIB6gEU\n        ARIB7wHyA/8EAAP/AfQBvAHsAfcDvAPwAv8XAAHxARUEDgULAR4CRAERAQ8CDgELAQEDIAHpAR8BHgHq\n        AewBkgH3Ae8BvAH0Af8jAAH/Ae8B8wEAArwB/ygAAf8B9AHzAvIB8wP/AfQC8gHxARoD8AHxAfMB9AL/\n        IAAB8wHrARQBEwISARMBFQFtAe8B8AHzBPQB8wHxAQcBkgHsAe8DBwG8AvAB9AH/GAAB/wEHARAEDgYL\n        AkQBQwELAR4BCwEfASAB6QEfAQEBRAFtAe0B9wHvAgcB8wL/IwAB/wHvAfMBAALwAf8qABP/IgAB8gHs\n        AxMDEgETAeoB6wHsA+0D7AH3Ae8DBwK8AfAB8wL/GQAB/wH3AQ8EDgEABAsFHgEBAh8CAQFEAesB9wLv\n        AgcB8gL/JQABvAH0AQAB8AHyAf8yAAj/JQAB/wHzAfcB6gESARMF6gJtAesB7AHtAZIB9wTvArwB8AHz\n        Av8bAAH/Ae8BEAUOBgsFHgFEAeoB7QH3Ae8BBwG8AQcB8gH0Af8mAAHwAfQBAAHwAfRhAAL/AbwB7AHq\n        AhIC6gFtA+sB7APtAfcB7wEHAfABvAHxAfQC/x0AAf8BvAEVBQ8EDgQLAUMBEwHrAewBkgHvAQcB8AG8\n        AfIB9AH/JwAB8wH2AQAB8gH/ZAAB9AHvAesB6gESAuoBbQPrAewB7QGSAe8CvAHwAfMC/yAAAf8B8gHs\n        ARQBEQMPAhACEQFDARQBEwHqAW0B7AHtAe8BBwLwAfIC/ygAAv8BAAL/ZQAC/wG8Ae8BkgTsAZIB9wHv\n        AQcBvAHxAfMB9AL/IgAB/wH0AQcB7AESAUMDEQFDARUBEwESAeoBbQHsAZIB7wK8AfEB8wP/lAAC/wH0\n        AfIB8QLwAvEB8gHzAvQC/yUAAv8B9AHwAe8B7AHrA20C7AHtAZIB7wG8AvAB8gH0Av+YAAv/KAAE/wHz\n        AfIB8QXwAfEB8gLzAfQD/50ABP8uAAf/AvQG/9MAC///AN0AAf8FAAH/AgAE/wMAAf8EAAH/AwAD/wMA\n        Av8CAAP/BAAB/7QAAf8B9AH/AgAF/wH0AvMB9AH/AQAB/wH0Af8BAAP/AQAC/wH0AfMB9Ab/BPQB/wIA\n        Af8B9AH/ggAD/wIAA/8CAAX/AQAD/wEAA/8BAAP/AQAF/xAAAfIB7wHzAf8BAAH0AfAB8QH/AfIBvALv\n        AQcB8gH/AfEBBwH/AQAB/wHwAbwC/wHxAQcC7wHwAv8BvAHyAfQBvAHwAbwBBwH/AgAB8wHvAfSAAAH/\n        AfIBvAEHAfAC/wHzAbwB8AL/AfMBvAEHAbwB9AEAAfIBvAHxAf8B8gG8AfAB9AHwAbwC8wG8AgcB8AH0\n        Af8PAAHzAfEB7wL/AfIBBwHzAfIBBwHwAfMB8gG8AfcB9AIHAfQBAAH0AfMB7wH/AfIBvAHyAfMBvAH3\n        AfMB9AHvAQcB8AEHAfQB8AEHAfIC/wHwAe8B/38AAf8B8AP3Ae0B7wHyAQcB9wHsAv8B7wL3AZIBBwEA\n        AfcBkgHvAfIBBwH3AewBvAH3Ae0BvAEHA/cBkgHwAf8PAAH/AbwB9wHzAf8B8QG8Af8B8AEHAfQC/wHy\n        AQcB9AEHAe8B8wH/AfQB8wHvAf8CvAH0AQAB8QEHAfIB9ALvAQcB8gH/AfQCBwH/AfMB8AHxAf8NAAH/\n        AfMC8gHzAf8B8wH/AQAB/wL0AfIC8QLzAvEB8gH0AfIB8QHyAvQB/wEAAf8B8wH0Av8B9AEAAf8B8wHx\n        AfIB8wH/EgAD/wEAAv8CAAP/AgAD/wEAA/8CAAL/AQAC/wIAAv8BAAL/FQAB8wHvAQcB9wIHAfcDBwHs\n        Av8B7wMHAfcB/wHvAQcB7wHwAgcB6wIHAfcDBwLvAbwB9BEAAfQB8AEHAfIBBwHyAv8BBwH/AgAD/wEH\n        Ae8B9wLvAfMB7wH/AgcB/wEAAfMBvAHyAfQB8AHzAu8C/wHxAQcB8gHxAe8B/w4AAbwBBwK8Ae8B8AH3\n        AQcB8QG8AQcBvAIHAbwB8AG8AQcBvALwAQcDvAHvAfQBAAHxArwB/wHyAbwBAAH/AfABBwK8Af8SAAHz\n        AZIBvAH/Ae0BBwL/AQcB7AHxAQAB/wHyAZIB8gH/AfAB7AHzAQAB/wG8Ae0B8wHtAQcC/wEHAe0B/wH3\n        Ae8B/xQAAfMCBwGSAe8BBwLvAgcB7AH/AfQD7wEHAewB/wIHAe8B8AIHAesCBwH3AwcBkgHyFAABBwH3\n        AQcBvAH0Av8BkgH/AgAB/wH0Af8BBwG8AQcCvAHzAe8B/wIHAf8BAAHzAbwB8gH0AgcBvAHvAfEBAAH0\n        Ae8BkgEHAfIOAAH/AQcC8wEHAfcB9AHwAfcC7wHxAfIBBwIAAfQBBwHzAgABvAHvA7wB9wHzAfABBwHv\n        AbwB/wHxAQcBAAH/AQcB9wHwAfEB/xIAAfEBvAHvAfEBBwHvAf8B8AHvAbwBBwEAAf8B8AH3AfEB/wHv\n        AQcBkgHxAQcB7wHtAbwBBwHvAf8B8AEHAfcB8QEHAe8B/xQAAfMCBwGSAbwC8AHxAgcB7AH/AfIBBwL3\n        AQcB7AH/AgcB7wHwAgcC7AEHAe8B8AIHAZIB7AEHAfQSAAH0AfEB7wHxAf8BAAHwAe8BBwLzAQcB7wH/\n        AgcB9AEAAfQB8wHvAf8CBwH/AQAB8wG8AfIB9AHvAbwC8AHxAQAB/wLxAe8B9A4AAf8BBwLyAQcBvAH/\n        AfQC7wG8AfQB8gEHAgAB9AEHAfMCAAG8AQcDvAH3AQcBvAH0AQcBvAH/AfEBBwH/AfQB8AEHArwB/xIA\n        AfEBvAHvAfEBBwHvAfMBBwK8AQcBAAH/AfAB9wHxAf8B8QG8Ae0C7AEHAe8B8AG8AfcB8QLvAfMB8gEH\n        Ae8B/xQAAfMCBwGSAf8C9AHzAgcB7AH/AfABBwHvAfcBBwHsAfQCBwHvAfACBwHvAQcB7wGSAfEDBwH3\n        Ae8B8xIAAf8C8AH0Af8BAAH/AfEB7wH3Ae8B8AHzAf8CBwH/AQAB/wHyAfAB/wK8Af8BAAHzAQcB8wH0\n        AQcC7wG8Af8CAAH0AbwB8gH/DwABvAEHAbwCBwH/AQABvAHvAfIB/wHyAfECAAH0AfAB9AIAAbwBBwG8\n        AfAB8QEHAbwC/wK8AfABBwH3AbwB8gEHAe8BvAHwAf8SAAHxAbwB7wHxAQcB9wEHAe8BBwG8AQcBAAH/\n        AfAB9wHxAv8BvAHvAfcBBwHvAfIB8QG8AfcB7QHvAfAB/wHyAQcB7wH/FAAB8wEHAbwBkgG8AvcBvAEH\n        AbwB7AH/Ae8BBwLvAQcBkgHxAgcB7wHwAbwBBwHtAe8BBwHtAwcB7wG8AfIB/xIAAf8B9AHzAf8DAAH/\n        AvMB8gH0Af8BAALzAf8BAAH/AfMC/wHzAfQB/wEAAf8B8gL/AfMC8gH/AwAB/wHzAv8PAAH0A/IB9AH/\n        AQAB/wHzAf8BAAH0Af8CAAH/AfQB/wIAAfMC8gHzAfQB8wH/AQAB/wL0BPIB9AHzAvIB8wH/EgAB8QG8\n        Ae8B8QEHAewB9wG8AQcBvAEHAQAB/wHwAfcB8QH/AQABvAHvAe0BBwHvAfQB8QG8AQcBvAH3AfIB/wHy\n        AQcB7wH/FAAB8wEHAbwB7AGSAQcB7wMHAewB/wHvBAcB7wMHAe8B8AG8AQcB6wGSAQcB9wMHAZIB7wHx\n        AfQTAAL/IwAB/0wAAfEBvAHvAfEBvAHvAQcB8wK8AQcB/wHyAQcB9wEHAfIC9AEHAe0B7wHwAf8B8QEH\n        AfcBvAH3Ae8B9AHyAQcB7wH/FAAB9AK8AfcB7wIHAfIBvAEHAewB/wHvBQcB9wMHAfABvAEHAe8B9wIH\n        AfIBvAEHAe8C9wHwAf+EAAHxAbwBBwHxAbwBBwHwAf8B8AG8AgcBkgHvAQcB7QGSAe8B/wEHAbwB7wHz\n        Af8B8QEHAe8B8gG8AZIBvAHyAQcB7wH/FAAB/wH0AbwCBwG8Af8B9AG8AgcB9AIHAfEB8gIHAfECBwHx\n        AfMBvAMHAbwB9AH/AfAEBwHzAf9cAAL/JgAB8wEHAfMB9AK8Af8BAAHxAQcB9AYHAfIB/wHyAbwB8AH/\n        AQAB9AG8AfEB/wHzAQcB8gH0AbwB8QH/WgAH/zIAAf8B8wHtARIBBwH0Af+bAAP/AfQB8gHwAe8B9wLt\n        AfcB7wG8AfMB9AL/KgAC/wHyAe0BFAFDARUBQwHqAQcB8wL/lgAD/wHyAQcB7QESARUBQwEQAQsDDwER\n        ARQB6wHvAfIC/yYAAf8B9AHxAe0BFAFDARQBEwEUARUBQwEVAW0B7wHyAv9iAAX/AQAE/ycAAv8B8gHv\n        AewFRAIeBgsBEAESAfcB8gL/IgAB/wHzAbwB7AETARQEEwYUAeoB7wHyAv9gAAH/AQcC7wHzAf8BBwLv\n        AfMB/yUAAf8B9AG8Ae0BbgZFBEQGCwFDAW0BBwH0Af8eAAL/AfMBBwHsAxIBEwMSAhMEFAETARQBFQHq\n        AZIB8AH0Af8nAAL/AvQC8wH0A/8tAAHzAesB6gHrAfAB8wISAesB8QH/JAAB/wH0Ae8BbgVvAZMBHAHv\n        AQcBvAIHAZIBbgFEASIDCwERARQB9wH0Af8dAAH0Ae8B7APrAW0B6gISAeoCEgITAxQCEwEUARUBFAES\n        AewBvAH/JAAB/wHzAQcB7QHrAW0C6gHrAewBBwHzAf8sAAH0AewBbQHsAbwB8gETAW0B7QHyJAAB/wH0\n        ARwCbwIWAZQCBwHxAfMC9AT/AfQB8QHtARUECwFDAe0B9B0AAewB6wTsAesD6gFtARIB6gITAhQBFQEU\n        ARMBFAITAhIB6gHzIgAB/wHwAe0BBwHsAREEEAERARIB7QL3AbwB/yoAAfQB9wFtAewB8AHyARQB6gGS\n        AfMjAAH/AfQBkgFuAhYBlAEaAbwB8QHzAfQE/wYAAfMBbgMLAQwBEQGSAf8cAAESAe0B9wGSAuwB7QFt\n        AeoBbQLrAe0BEgETARQDFQEUARMBFAETAhIB6gHzIQAB8wHsAe0B9AH/AfcFEAFDARIBBwH/AfEB6gHs\n        AfEB/yQAAf8B8QHwAbwBBwHsAW0B7AHwAfIBFAESAewBBwO8AfMB/x0AAv8B7wJvARYBlAK8AfIB9Az/\n        AQAB/wHvAUQDCwFDAe8B/xsAARIB7ATtAuwB6wPsAe0B6wISARQBFQJDAxUBFAETARIB8x4AAv8B8AHt\n        AQcB/wEAAf8B7wEPBBABFQFtAQcB/wEAAfQB7AESAQcC/yEAAf8BBwLrAuoBbQHrAe0BvAHyARQBEwEU\n        ARUBQwIVAewB9BwAAv8B8AFuAW8BFgGTAbwB8AHzAfQC/wrzAv8BAAH/AQcBRAILAREBFQHxAf8aAAET\n        AuwBkgH3ApgB9wKSAfcC7wEHAewDEwRDARUCEwESAfMeAAH/AbwB9wG8AfQCAAH/Ae8EEAERARUB6wG8\n        Af8CAAH0AZIBEgHvAfQB/yAAAfMB9wLvAfcB7QLsAZIBvAHyARQDEwEUAxMBBwH/GwAB/wHzARwBRgFv\n        ARYBBwHwAfMC/wEAAbwB7ANuAewCbgLrAewB8AH/AgAB/wEHAUQCCwERAewB9AH/GQABFAHrAewBkgKY\n        AQgBBwLvAQgB9wHyAfQBBwHqAuwBEwIRAUMBFAITARIB8x0AAf8BvAEcAbwB9AH/AgAB/wH3BBABEQEV\n        AesBvAH/AgAB/wHzAewBEwEHAf8fAAH/Ae8B7QHvArwBBwH3Ae0B9wG8AfIBEgHqAm0B6gITARQB6wHz\n        Af8aAAH/AbwCRgFvAZMBvAHzAv8CAAH3A28GbgHsAfAB/wMAAfQBkgFEAgsBFAG8Af8ZAAEVAeoB6wHt\n        AQcBmAEIAbwB9wHvAQcB9wH0AQABBwHsAvcBEgIRARUCFAETARIB8x0AAfIB7QEHAfIB/wMAAf8B7wQQ\n        AREBFQHrAbwB/wMAAf8B8AHqARIB8B4AAf8B8QHsAe0BBwHwAbwB8AEHAZIB9wHwAfIBEgHsAe8BvAEH\n        AeoDEwHvAf8ZAAH/AfQB7QJGAW8BBwHzAv8DAAHzBbwFBwHzAf8DAAH/AfMB6gEeAQsBQwHsAfQZAAER\n        ARIBbQHtAZgBCAHxAfABkgHtAfcB7wH/AQABBwH3AesBbQETAhUCFAEVARQBEgHzHAAB/wHsARwBvAH0\n        Af8DAAH/Ae8CEQIQAREBFAHsAbwB/wQAAfQBkgFDAW0B9B0AAfQBkgHrAe0B8QEHAfQB/wHzAvcB8AHy\n        AW0B9wHyAv8B9wITARQBbQHyAf8YAAH/AfABRQJGAZMB8QL/BAAB7wFuBEUD6gJtAbwB/wQAAf8B7wFE\n        AgsB6gHxAf8YAAEVARMBEgHsAQgB8gH0AfACCAH3AfMB/wEAAfQBvAHsAfcBbQHqAe0B6wETARQBEgHq\n        AfMcAAEHAesBvAHxAf8EAAH/Ae8BFQJDAREBQwFKAewBvAH/BAAB/wG8ARMBEQEHHAAB/wHxAeoB6wHv\n        AQcB9AIAAfQB7wH3AfAB8gHrAe8B9AIAAfQBEgMUAfcB/xgAAf8BBwJGAW8B7QH0Af8FAAH3ARYIkwHt\n        AbwB/wUAAfMBRAILARUBBwH/GAABFQESAeoB7AFtAfcB8wHyAfcB8AHvAfEB/wEAAfQB9wIHAe0B7wEH\n        AW0CEwESAeoB8xsAAf8BFAHrAbwB8wUAAf8B7wFKAhQCFQFKARwBvAH/BQAB8wHrARABFAH0GwAB/wHs\n        AesB7AK8Af8CAAH/AbwB7wHxAfIB7AEHAf8DAAEHARIB6gESAW0B8gH/FgAB/wH0AZMB6QFGAW8BBwH/\n        BgAB9AHzB/IB8QHyAfQB/wUAAf8B6wILAUMB9wH/GAABEgHqAXIB7AGSAesBBwHwAe8B8QG8AfIB/wEA\n        AfQBBwHxAbwB7wHxAe0B6gETARICbQHzGwABvAFDAesBBwH/BQAB/wG8AW0ESgHrARwB8AH/BQAB/wHs\n        AhEBvAH/FQAF/wH0AvACvAH0AwAB/wHzAfEC9AHxAfIB/wMAAf8B9wHvAQcBvAH0Bv8RAAH/AfMBbgHp\n        AUYBbwHyAf8GAAH0AfME8gXxAfMB/wYAAe8BHgELAREB7AH0GAABFAHqAewB7QKYAewB8QHwA/8CAAP/\n        AvEBvAHrAewCEgFtAesB8xoAAf8B7AFDAXIBBwH/BQAB/wHyARwCcwFyAesBHAEHAfIB/wUAAf8B7QER\n        AUMB7QH/FQAB8wLvAbwB8AHyAfMB9AHzAfQB/wQAA/8BAAL/BAAB/wT0AfMB8QG8AQcB7wHxAf8RAAH/\n        AfMBRQHpAUUBbgH0BwAB7wFuBkUDbgEHAf8GAAHxAUQBHgERAesB8xgAARQB6gLsAfcBBwHtAfIB9AH/\n        BwAC/wHvAQcB9wFtAeoC6wHzGgAB/wESAREBbQEHAf8GAAH0AbwBCAGZARwBBwG8AfEC/wYAAe0BEQFD\n        AesB/xUAAfACFAETARIBbQHrAewBkgHvAQcB8QH0AgAB/wH0Af8BAAL0Af8BAAH/AfIBvAEHAfcB7QHs\n        AW0B6gETAhIBBwH/EQAB/wHyAUQCRQFuAfQHAAFuAkYBJQdGAe8B/wYAAfMCHgFEAW0B8gH/FwABFQES\n        AusBbQGSAfAB9AoAAf8C8QHsAW0B6gFtAesB8xoAAfMBFAERAUoB7wH/BgAB/wH0AfIB8AG8AfAB8gH0\n        Af8HAAHsAhEB6wHzFQAB8AETARIB6gYSAeoB6wHvAv8B8AHtAfIB9AHtAe8B/wEAAbwBbQISBBQCEwHq\n        AewBBwH/EQAB/wHyAkQBRQHrAf8HAAFuB0cCRgFvAe8B/wYAAfQCHgFEAW0B8gH/FwABQwESAW0D6wHy\n        Af8BAAT/AQAG/wHtAewB6wFtAusB8xoAAfIBFAEQARUBkgH/BwAC/wP0A/8GAAH/AesBEAERAesB8hUA\n        AfABEwESAuoBEgLqAW0B6wHsAfcBkgL/AQcB7QHwAfIB7AH3AfQBAAEHAeoBEgTqAW0B6gHrAW0B7AEH\n        Af8SAAHzAUQBHgFEAW0B/wcAAW4JRwFvAQcB/wYAAfMCHgFEAewB8wH/FwABQwETAW0C6wH3AfIC/wEH\n        AewBBwH/AQAB9AHsAe0B8gH/AfMB9wGSBOwB8xoAAfEBFAEQAREB6wHzCAAF/wgAAfMB6gEQAREB6wHy\n        FQAB8AETAxID6gFtAesB7ALvAv8B8AEHAfAB8QG8AQcB9AEAAQcD7AHrBW0C6wEHAf8SAAHzAUQBHgFE\n        ARIB8wcAAW4JRwFvAQcB/wYAAfIBRAE+AUQB7AHzGAACFALqAesBbQH0Af8B8gH3AQcB6wHxAf8B7QLs\n        AfcB9AH/AQcBbQTsAfMaAAHxARQCEAESAfAB/wYAAf8B8QHsAeoB6wG8Af8HAAHwARQBEAFDAXMB8hUA\n        AfAB6gLrAuwB9wEHAbwD8AHyAv8B8gHxAvMB8QHzAf8BAAHzAfABvAHwAbwB7wGSBewBBwH/EgAB8wHq\n        AR4CRAHxBwABbgJGBkcBFwFvAQcB9AYAAQcDRAGSAfQYAAEUARMC6gHsAfcB9AH/AbwCmALsAfQB7QGY\n        AQcBvAL/ApIE7AHyGgAB8gEUAhABEQHtAfQEAAL/AQcBcwEcAXgBcgESAe0B8wH/BAAB/wGSAhABQwHs\n        AfQVAAHyAe8BBwG8AvAC8QHyAfMB9AL/AQAF/wH0Av8BAAL/AfQB8wHyAvEC8AG8AQcB7wHwAf8SAAH0\n        AewCCwFEAfcB/wYAAW4DRgVHARcBFgEHAfQFAAH/AewDRAHvAf8YAAEUARIB6gISAZIB9AH/AfQC7wEH\n        AfAB/wEHAe8BBwHyAv8BBwHsAe0D7AHyGgAB8wEUAhABEQESAfAB/wMAAf8BvAEcApkBeAFzAesB7AEH\n        Af8DAAH/AfEBEgIRARQB7QH/FQAB/wLzA/QB8AEHAe8BBwH0BAAB/wHzAv8C8wH/AwAB/wG8Au8BvAHz\n        Av8C9AH/EwAB/wHvAgsBIgHqAfQGAAFuBEYERwEXARYBBwH0BQAB9ANFAW0BvAH/GAABFQHqARIBEwES\n        AewBvAHwAfID7wHyAfEC7QHvAfAB8gG8Ae0F7AHyGgAB/wESBBAB6wHzAf8CAAH0AhwBmAGZAZgDcwHv\n        AfQCAAH/AfQB7AMVAW0B7wH/FQAE/wEAAf8B7AMSAQcB/wIAAf8BvAHtAfIB9AHtAQcB/wMAAfIC6wHs\n        Ae0B8wH/FwAB/wHwAUQCCwEVAbwB/wUAAW4FRgNHARcBlAEHAfQEAAH/AQcDRQHtAfMB/xgAAUMBEwES\n        AhMDEgJtA+wC6wLtAuwB6wHsAfcB7QHsAu0B8hsAAZIBEQEQAREBEAFDAe0B9AIAAfMB7AFzAhwBmQF4\n        AXMBHAHvAfMB/wEAAfQBkgETAxQBcwHxGwAB/wHvBG0B8wIAAf8B9wHtAfAB8gHtAQcB8wIAAf8B7AHt\n        AfcBBwG8AfQB/xgAAfQB6wILAUMB6wHzAf8EAAFuBUYCRwFGARcBlAEHAfQDAAH/AfMBbgJGAW8B7wL/\n        GAABQwUTARIBEwESA+oC6wHtAZgB9wGSAe0DmAGSA+wB8RsAAfIBEQQQAUMB7AHzAf8B8wHsAnMBHAKZ\n        ARwBmQEHAfQB/wH0Ae0BEgJKARQBSgHtAfQbAAH/AfMB7AJtAeoB7AH/AQAB9AH3AZIB8AHyAe0BBwHy\n        AgABvAL3AQcBvAHxAv8YAAH/Ae8BEQILAUQB9wH/BAABbgHpB0YBFwGUAQcB9AH/AgAB/wHvAkYBaQGT\n        AfEB/xkAAUMDEwEUARMB6gETARIC6gFtAusC7QGSAfcB7QGYAQgBmAH3A+0B8RsAAf8B6wYRARIBvAHz\n        ARwB6wFzARwDmQEIAbwB9AHwAW0FSgEcAQcB/xwAAf8BvAHqARIB6gETAe8BvAHvAewB9wHwAfIBkgHv\n        AZIBvAEHAe0C7wEHAbwB9AH/GgAB8wFtAgsBEQESAbwB/wMAAW4C6QVGAUcBFwGUAQcB8wH/AQAB/wHw\n        AUUBRgEXAW8B7wH0Af8ZAAERARQBEgMTARQEbQLsAZIB7ALtAZIB7QGYAggB8AKYAfcB8RwAAfMBQwYQ\n        AREBbQHtAesCcwKZARoBvAHvAewBbQFzAesDSgFzAe8B/x4AAfQB7QESAeoBbQITARIB6wGSAfAB8gHs\n        AfcB7ALrAfcBBwG8AfAB8gH/HAABBwFDAgsBEQESAbwC/wEAAeoCRQVGAUcB4wGUAQcB9AL/AfABbgEX\n        AeMBFgHvAfIB/xoAARUBFAISARMBEgETARIBbQHrAuwB7wEHAewBkgL3AZgECAGYAQcB9wHyHQAB7wFD\n        AhECEAERAUMBFQFDARICcwGZAZ8BGgGZARwBmQEcAnMCcgFzAQcB8QH/HgAB/wHwAewBbQXrAe0B8AHy\n        AesB7AGSAfcB7wH3AQcB8gG8AfQB/xwAAf8B7QILAhEBEgEHAfQB/wHqAkUB6QVGARcBlAEHAfMB9AG8\n        AW4BFwHjARYBkwG8Av8aAAEUARMBEgHqAxIBbQHrAm0B7AHwAfEB7AL3AZIBmATCAggB7wHxHQAB9AHs\n        ARUBEQEQARECQwEVARQBSgFtAXMBHAGZAsMBoAKZAhwBcwEcAZkBvAH0IAAB9AHvA+0B7AHrAW0B7QHw\n        AfIB6wHtAQcCvAHwAfIBvAHzAf8eAAH0AewBEQELAhEBFAHtAfEBEgEjAUQBRQHpAkYBJQFGARcBlAHv\n        AbwB7wFuARcBFgGUAQcBvAH0Af8bAAEUARMBEgHqARIC6gHrAewB6wFtAeoBbQHsAesCmAH3AZgGwgHv\n        AfEB/xwAAf8B8wHtARQCEQFDAhUBFAFKAW0BcwEcAZkBGgKgARoEmQEIAbwB8wH/IQAB8wHwA7wB7QHr\n        Ae0B8AHyAesB9wG8AfAD8QHyAv8fAAH0AewCIgELASIBQwESAUMCHgFEAUUB6QIlAkYBbwJuAUYB4wEW\n        AZQBGgG8AfMC/xsAARQBEwESBOoE6wHsAm0B7AH3ApgBCALCARsCCAHxAQcB8QH/HQAB/wHyAZIBSgEU\n        AhUBFAJKAXIBcwEcApkDoAGZAZ8BGgEbAfAB8wL/IQAC/wL0AfMB9wHrAe0B8AHyAW0BkgEHAfAB8wL0\n        Av8hAAH0AZIBQwYLAh4CAQHpBUYBFwHjARYBlAEaAbwB8wL/HAABFQMSAuoB6wTsAe0C7AHtAfcBmAII\n        AsIDCAEbAQcB8QH/HQAC/wHzAQcB7ARKAXICcwIcApkCnwGZAcMB8AHxAfMC/yQAAv8B9AHtAW0B7AHw\n        AfIBbQHtAe8B8AT/IgAC/wEHAUQCEQQLAh4BPgEBAUUDRgHjARYBlAG9AvAB8wL/HQABFAESAuoCEgHr\n        BuwC7QKYAQgBwgIIA8IB8wHvAfIgAAH/AfQB8QEHAhwCcwMcA5kBGgEbAfIBvAHyAfQC/ycAAfMB6wFt\n        AewB8AHyAW0B7AGSAbwB/ygAAfMB7QFEAwsERAJFAUYBbwEWAZQBvQEbAbwB8AHzAv8eAAETAm0C6gES\n        AW0C7APtAewB7QH3AZgECAHCAfMCwgHzAe8B8iIAAf8B9AHyAbwB8AYbAfQB8AG8AfMB9AL/KQAB9AEH\n        ArwC8wEHArwB8gH/KQAB/wHyAfcBbQESA0QB6gJuApMBBwK8AfAB8gH0Av8fAAH3AwcD7wO8AfAB8QHw\n        AfID8wj0AbwB8yQAAf8C9AHzBPEB8gHzAvQC/ysABf8BAAH/AfQD/ysAAf8B9AHxAbwD7wIHArwB8QHy\n        AfMB9AL/KAAC/xD0Av8lAAv/MwAD/y4ABv8E9AT/KwAS/5gACP//AP8A/wD/AIEABP8BAAb/AgAF/wMA\n        Bv8DAA3/tQAB8wHwAfEC/wH0AfEDvAH/AgAB8wHwAQcB8AH/AwAB/wHxArwB8gH/AgAB/wHzAfIB/wHy\n        AfAB9AH/AfEE8AHyAv9FAAH0AfMB9AL/AfQE8wH0BP8B9AHzAvQB8wH/AQAB/wH0AfMB9ALzAfQC/wP0\n        AvMD/wHzAf9FAAHxAbwB8AH/AfQB8AEHAfEBBwHvAf8CAAHyAQcBvAEHAfMB/wIAAfMB8QIHAfAB/wEA\n        Af8B9AG8Ae8B9AHxAfcB8wH/AQcB7wLzAfECBwH/RAAB/wG8Ae8B8QH/AfQBBwHvAgcB7wHzAfQB7wH0\n        AfMBBwHvAbwBBwHvAfMB/wH0AQcB7wHwAQcB7wHwAf8B8QHvArwC7wL0AgcB/wsABf8BAAf/AQAT/wEA\n        Bv8BAAj/CQAB8wHwAfEB8gK8AfMB/wG8Ae8B/wIAAfMB7wHyAfAB8QH/AgAB8AEHAfIBBwHxAf8BAAH0\n        AfABBwHvAf8B8wH3AfQBAAG8AQcB/wEAAf8B8gEHAbwB/0MAAf8B9AEHAfEC/wEHAZIB9AHxAbwB/wG8\n        AgcB9AG8AQcB8wHxAZIB9AH/AfQB7wHwAf8BvAHvAfMB9AHvAfAB9AHzAfAB7wH/AbwB7wHzAf8LAAH/\n        AfEBBwHwAv8B8wG8AfEBBwHvAfAB/wEAAf8B8AIHAfQB8wEHAbwB9AHwAgcBvAHyAfQB8QEHAfAC/wHz\n        AbwB8AIHAfQB/wH0AbwB8QHwAgcB9AH/CQAB9AEHAfcC8AH0Af8BAAEHAfcB9AL/AfMB7wHzAfQBBwHz\n        Af8B9AHyAQcB/wEHAfIB/wH0AfAB7wG8AQcB/wHzAfcB9AEAArwB/wIAAf8BvAGSAfQLABH/AQAE/wEA\n        E/8PAAH/AgcB8wHwAbwB8QH/AfIBvAHzAbwB7wGSAfMCvAH0Af8CBwH0AfEB7wHyAf8BvAHvAfIBvAEH\n        AfMBAAH0AbwB7wHyAfcB8gH/DQAB8wHvAv8B9AIHAfQB8AEHAfQD/wHyAbwB8AH0AQcBvAH0AfICvAH/\n        AfQB8AH0AfMB7wL/AfQCBwH0AfAB8wEAAf8B8AEHA/IB8AH/CgAB8wH0AfMBBwH/AwABBwHvAfcCBwLv\n        AfMB/wEHA/cB7wHzAf8BBwHxAfQB8AEHAf8B8QHvAf8B8wH3AfQBAAK8Af8DAAIHAfMLAAHxBuwB8gH0\n        Ae0F7AHwAf8BAAHyAe0BBwH/AQAB/wEHBewBBwHyAfcBBwHxBuwB8QH/DgAB/wHzAe8B9wHvAfcC/wHz\n        AwcB8wMHAbwB9AEAAfAB7QHvAfcBvAH0AQABvAHvAvcBvAH/AQAB9AG8AewB9wEHAfMB/w0AAfQBBwH/\n        AfQBBwG8AQcB9AHwAe8B9AHyAbwB8wHyAbwB8AEHAbwB8wH/AfEB7wH0AQAB/wHzAfIB9AEHAf8B9AEH\n        AbwBBwH0AbwB9AH/AfABvAEHAfIB8wHyAfAB/woAAfMBvAIHAfMB/wIAAQcB7wHyAvMB8AHvAfMB/wHz\n        AQcC8AEHAv8CBwG8AQcB8wEAAfEBBwH/AfMB9wH0AQABvAEHAf8DAAIHAfQLAAEHAu8CBwLvAQcBvAH3\n        Au8DBwHxAf8BAAHxAu8B/wEAAfQB7wUHAbwB8QHvAQcBvAYHAe8B/w8AAfQBBwK8AQcC/wHzAe8CBwH/\n        AfIC7wEHAfQBAAH0Ae8B8QHvAfAB/wEAAbwBBwLwAfcB8QH/AfQB8AHvAfEB7wEHAf8NAAH0AQcB9AEH\n        AbwB8AG8AfQB8AHvAfQB8wHyAfQB8wG8Ae8BBwHyAf8BAAHxAe8B9AIAAfMB8gH0AQcB9AEHAbwB8AG8\n        AfQBvAHzAfEBvAHxAfAB8gHzAfIB8AH/CgAB8wG8AfEB8AEHAfMB/wEAAbwB7wH/AgAB8wEHAfEBAAH/\n        AbwCBwHzAQAB/wEHAe8BvAHyAf8BAAHwAe8B/wHzAfcB9AEAAbwBBwH/AQAC/wG8AQcB/wsAAQcC7wHz\n        AfQBBwHvAQcBvAL3BAcB8wH/AQAB8QLvAf8BAAH0Ae8B9wHvAwcB8QHyAe8BBwH0AbwDBwLvAQcB/w8A\n        Af8B8QH3Ae8B8gEAAf8B9AH3Ae8B8gL/AQcB9wEHAfQCAAEHAe8BBwHzAgABvAHvAvQB7wEHAf8B9AG8\n        Ae8B/wHxAfcB8w0AAfQCBwG8AfIB9AHwAfQB8AHvAfQDAAHzAbwCBwHzAf8BAAHxAe8B9AIAAfMB8QHz\n        AgcBvAHyAfQB8AH0A7wB8QH/AfEB8gHzAfIB8AH/CgAB8gG8AfAB/wHwAQcB8wH/AbwB9wH0AgAB8QG8\n        AfAC/wHyAgcB/wEAAf8BBwHwAfEC/wEAAbwB7wH0AfMB9wHzAf8BvAEHAfQB/wH0AfEB8AHzAf8LAAEH\n        AfcBBwH/AQABvAH3AQcBvAHvAZID7QGSAfAB/wEAAfEC7wH/AQAB9AHvAfcE7QEHAfEB7wEHAfIE7QH3\n        Ae8B8AH/DwAB/wHzAQcB7wH0AQAB/wHzAe8BBwH0AgAB8gHvAQcB9AH/AQAB8gHvAQcB/wIAAQcB7wHy\n        AfMB7wHwAf8B8wHwAe8B9AG8AQcB9AwAAf8B8wEHAbwB8gH/AfQBBwHzAbwB7wHzAf8BAAH/AfICvAHy\n        AbwB8gH/AfAB7wHzAv8B8gHwAfIBBwG8AfIB/wH0AQcB8wK8AfAC/wHwA/IBvAH/CgAD8AH/AfQCvAHz\n        AfABBwH0AQAB/wHxAvAB/wEAAfQBvAHyAf8BAAH/AfAB8wH/AwABvAEHAfMB8QHvAvMB8AEHAvEC8AHz\n        Af8MAAEHAfcB7wL0AQcB9wEHAbwB9wHvBAcB8gH/AfQBvALvAvQB8wLvBAcB8QHyAe8CBwLvAQcDvAHz\n        Af8QAAH/AfAB8QH/AQAB/wG8AQcB8gH/AgAB/wG8AQcB8QH/AQAB/wG8AfEB/wEAAfQCBwHvAQcBvAH0\n        Af8BvAHwAfcCBwHyAf8MAAH/AfABvAHyAv8B8QEHAfABvAEHAfEB/wEAAf8B8AG8AQcB8wEHAbwB8QG8\n        AQcB8AH/AfMEvAHyAv8B8QEHA7wC/wHzAbwB8AG8AfABBwH0Af8JAAH/AfQE/wH0Af8C9AH/AQAC/wH0\n        Av8BAAH/AfQC/wEABP8DAAL0Af8C9AL/BfQC/w0AAQcB9wHtAvcBkgH3AQcBvAH3AZIE9wG8AQcC9wHv\n        AZIB9wHvAbwC9wGSA/cBvAHxAe8CBwHvAfcBkgL3Ae8BvAH/EAAE/wEAAf8C9AH/AwAC/wH0Av8CAAH0\n        Af8CAAH/BPQD/wT0Av8NAAT/AQAI/wEAEv8BAAb/AQAI/x0AAv8kAAEHBu8B8wHyBu8B8AfvAfAG7wG8\n        AfIB7wHwAfMBBwPvAgcBvAH/xgAB/wX0Af8yAAb/ZgAE/wEACv9iAAL/AfQB8wTyAfMB9AL/XAAD/wMA\n        Af8B9ALzAfQB/wH0A/MB9AH/AfQC8wH0Af8DAAP/WQAB/wHzAfAB7wHsAW0BEgFKARMBEgFtAewB7wHw\n        AfMB/y0AB/8lAAH/AfMB8QH/AwAB8wHsAm0B9wHxAfcD6wHvAQcB6wHqAW0BBwH/AwAB8wHyAv9VAAL/\n        AfIB7wHsAkoBRAYjASIBFQFEAesB7wHyAf8oAAP/AfMB8gG8AQcBvAHxAfMB9AL/IQAB/wHzAQcB8AH/\n        AwAB8QNEAewB7wFuAUoCRAHsAe0CEAFEAe0B/wMAAfMB7AHvAfQB/yIAA/8FAAP/JgAB/wH0AQcBcwVL\n        ASkCSgcjARUBbQHvAfQB/yUAAf8B8wEHAewB6wVKAW0B7AHvAfEB9AH/HgAB/wH0AQcB7wH0Af8DAAHx\n        AUoBRAFKAe0B7wFuAUsBRQFEAewB7QIRAUQB7QH/AwAB/wGSARQB7wH/IQAB/wHxAe8B8wH/AwAB/wHy\n        Ae8B8gH/JAAB/wHzARwBdARSAnQBcwEcAUsCcwJKAUQDIwFEARUB7AHzAf8iAAH/AfMBkgJKAUsCSgFE\n        AkoFRAHsAfAC/xwAAf8BBwG8AQcB/wQAAfEDSwEcAe8CdAFLAUQB7AHtAUMBRAFFAe0B/wQAAfIBQwES\n        AfAB/yAAAfIBEwEVAe0B8wH/AQAB/wHzAW0BQwHsAfIB/yIAAf8B8wFuAVIDegEaArwBmQFzAfABSwFt\n        AfMCcwEcAXMBSgIjAUQBIgFtAfMB/yAAAf8BvAFKAksBUQFzA0sCSgFLAUoBRAMjAUQB9wH0Af8aAAH/\n        AfEBBwHwAbwB/wQAAfEDSwEcAe8CdAJLAewB7QJEAUsB7QH/BAAB/wIVAewB9AH/HgAB9AEUAREBQwEV\n        Ae0B9AEAAfQB6gIRARAB7AHzAf8gAAH/AfMBbgFSAVkBegGgAfAB8QL/AZkBcwHwAUsB6wHzAXMBHAL0\n        AbwBdAFKA0QBbQHzAf8dAAH/AfQB7wFRAVIDdAGTAZkBHAJLAVECmQF0AUsBSgIjAUQB7QHyAf8ZAAH0\n        Ae8CBwHyAf8EAAHxA24BHAHvAnQBTAFLAewB7QJEAeoB9wH/BQAB7AEVAeoBBwH/HAAB/wHzARMBFAHq\n        ARIBFAEVAZIB8gHqARUBEwESAUMBEAHsAfIB/x4AAf8B9AFzAVIBegGaARoB8AHzAf8BAAH/AZkBcwHw\n        AVEB6wHzAW4BHAH0AgAB8wGZAUsBSgFEASIB6wH0HAAB/wH0AZkBdAJ5ApkBGgHwAfEB8AJLAXQBvAH0\n        AfIBGgEcAUsBSgJEAe0B8wH/FwAB/wHxAW4CBwHzAf8EAAHyAXMCbgHvAbwCdAFvAUsB7QHvAm0B6wG8\n        Af8FAAHvAUMBFQGSAfQB/xoAAf8B8gESARMB7QG8AQcB6wEUARUCFAHrAe8BBwHrARUBEQHsAfIB/x0A\n        Af8BHAFSAXoBoAEaAfAB8wH/AgAB/wGZAXMB8AFLAesB8wFuARwB9AMAAfQBmQFLAUQBIwEVAZIB/xsA\n        Af8BBwF0AnoCGgHxAfIC9AHyAUsBSgFzAfAB/wEAAf8B9AEbARwBSwFEAUoB9wH0FwAB/wEHAUoBHAHv\n        AfMB/wQAAfQBvAIHAfEB8AN0AW4BkgHwAwcB8wH/BQABvAFDARUB6wHyAf8ZAAH/AfEBbQETAfcBvAHy\n        AfMBBwFtARQBFQESAe8B8QH0AfAB6wEVAREB7AHyAf8bAAH/AbwBUgF6AZoBGgHwAfQC/wIAAf8BmQFz\n        AfABSwHrAfMBbgEcAfQDAAH/AfQBHAFKAUQBIwEUAfAB/xkAAf8BvAF0AXoBmgHDAfAB8QHzA/8B8wFL\n        AUoBcwHwAf8EAAH0AZkBSwJKAbwB/xYAAfQB7AFKAe0B9wHxBvMD8QHyAbwBkwF6AXQBbwHsBPEH8wEH\n        AREBQwESAbwB/xgAAf8B8QFtARMB9wG8AfMC/wHwAW0CFAESAe0B8gL/AfEB6wJDAewB8gH/GgAB8wFz\n        AVIBegGgAbwB9AL/AwAB/wGZARwB8AFLAewB8wFuARwB9AQAAf8B8wFzAUQCIwHrAfQZAAHzAUsBdAF6\n        AcMB8AHyAfQD/wEAAfMBSwFKAXMB8AH/BAAB/wH0AbwBSwFKAewB9BYAAfMBEgFEAuoF6wbsAXMBmQGa\n        AXUBdAFLAusBbgXrA20BEwEQAREBFAHvAf8XAAH/AfIBbQEUAe0BvAHzAv8B8wHtAeoB7AFtARQBEwHt\n        AfMC/wHyAesBEQFDAewB8gH/GQABBwFRAVIBegEHAfMD/wMAAf8BvAEcAfABcwHsAfMB6wEcAfQDAAP/\n        AbwBSgEjAUQBSgG8GAAB/wHtAUsBdAGaARoB8QH0Av8BAAL/AfABSwFKAUsB8AH/BQAB/wH2AZkCSgHx\n        Af8UAAH/AfIBQwEVA0QCSgJLBHQBeQKZApoBegN0AkwDSwFKAUQBFAEVAUMDEQEUAfcB/xcAAfQC7AHv\n        AbwB8wL/AfQB7AHrAfcBBwG8AW0CFAGSAfMC/wHyAewBbQHqAfcB9BgAAfQBcwFLAVIBegG8Av8B8gH0\n        AwAB/wG8ARwB8AFzAewB8wHrARwB9AMAAfQB8AL/AXMDRAHtAf8XAAHzAUsCdAGZAfEB9AH/AgAB/wHz\n        AewDRAFuAfAB/wcAAfMBbgFEAe8B/xQAAf8B8QERBUQBSgFLAW4CdAOaAxoBmgF6BXQBTANLAUQCFAEV\n        AkMBEQEVAe0B9BcAAfQD8wH0Af8BAAH0AuwB7wEHAfIB9AG8AeoCFQGSAfQBAAH/AfQD8gH/GAAB8gNL\n        ARwB9AH/AfIBBwH/AwAB/wGZARwB8AFzAesB8wFzARwB9AMAAf8B9wG8Af8BvAFKAkQB6wHzFgAB/wHv\n        AksBdAEaAfME/wHxAXMBUQNLAW4B8QH/BwAB/wGZAUoB7AH/EwAC/wHwAeoBbgLsAW4CcwEcAZMCmQQa\n        AsMBGgWaAZMDdAFzAW4BbQHqAhICEwHqAZIB9AL/FAAH/wEAAbwC7AGSAQcB8wH/AfQB7AEUARMB7AHz\n        Af8BAAX/FwAB/wG8AUoBSwFSAfcB/wH0ARwBvAH/AwAB/wGZARwBBwFRAW4BvAFuARwB9AMAAf8BBwHs\n        AvQBSgFEAkoB8AH/FQAB/wFuAUsBUQGZAfAE/wHzAXQCeQJ0AXMBdAHyAf8IAAHzAW4BSgH0EgAB/wHz\n        AfIBBwHsAe0FHAGTAe8CBwm8AgcEmQKTAhwC7QTsAfcB8QHyAfQVAAH0AwcB8QL/AfQBBwH3AewB6wEH\n        AfQB9wEVARIB9wHxA/8B8QIHAfAB/xcAAf8B7wFEAUsBdAHwAQAB9AFzAQcB/wIAAf8B9AGZAXMBbgFS\n        AUsCSgHtAfIB/wIAAf8BBwFtAfIB/wFzAUQCSgEHAf8VAAHzAksBUQGZAfIE/wGZAXoCmgEaAfEC8gH/\n        CQAB/wEcAUoB8xIAAf8B7AESB+oCbQHrAewBcwLsBO0B7AJzAuwBcwRuAusDbQXqARIB6gG8FQAB8wHs\n        ARABEQFtAfAC/wHzAQcB7QHrAW0B7AEUAeoB9wHxAfQC/wEHAUMBEQFtAbwB/xcAAf8BHAFKAUsBcwH0\n        AQAB8wFRAXMB8wL/AfIBHAF0AVIBdAJSAksBSgHsAbwB/wEAAfYB6wFtAfEB/wEHA0oB7wH/FQAB8AJL\n        AVEBmQH0Af8BAAH/AfIBmgGgAZoBGgHyAfQC8AHzAf8JAAHwAW4B8xIAAf8BQwEVBUMCFQEUAUQBSgFu\n        A3QFmQZ0AW8BbgJLAUoBRAEUAhUBQwERAUMBEQFDARMBBxUAAf8B8wHsAkMBbQG8Av8B8wG8AfcB7AFt\n        AesB7wHxAfQC/wHvAUMBFQHsAbwB9AH/FwAB9AEcAUoBSwFuAfQBAAH0AXMBSwHvAf8BvAF0AXkBegKa\n        ApkBeQFRAUsCSgHvAf8BBwFKARwB8wH/AbwDSgHvAf8VAAG8AkoBSwGZAf8BAAL/AbwBoAF6AZkB8AH0\n        AbwBcwFLAe8B/wkAAfQBcwH0EgAB/wMVAkMDFQNEAUsBbgN0BZoBmQF5BXQBbwFMAksBSgJEARUEQwEV\n        AeoB8BYAAf8B8wHsAhUBbQG8Av8B8gHtAesC7AHvAfMC/wHvAUMBFQHsAbwB9AH/GAAB9AEcAkoBbQH/\n        AQAB9AGZAXQB7wEHAXQBegEaAfABvAHxA/IBBwEcAUsBSgFEAe8BSgFuAbwB/wEAAfEDSgHvAf8VAAEH\n        AUoBRAFLAQcB/wEAAv8BmQGgAXoBmQHwAf8BGgF5AVEBHAH0CQAB/wHvAf8TAAESAxUBFAETAhIC6gFt\n        AW4BdAKTC5kBkwR0Am4CSgEUBBUBFAFtAfIXAAH/AfMB7AEUARMB6wHwAfMB9wHtAe8B7QLrAQcB9AHv\n        AhQB7AG8AfQC/xgAAfQBHAIjAeoB/wEAAf8B8gEcAbwBcwF6ARoB8AH0BP8CAAH/AbwBcwFLARUB9wGZ\n        AfIB/wEAAfADSgEHAf8VAAEHAUoBRAFLAe8B/wEAAv8BvAGgAXoBeQG8Af8BvAGaAZkBvAH/CQAC/xQA\n        AewBQwIVARQB6gHtAu8DBwG8AxoC8QEaBJkB8QHwBBoBvAEHApkCHAHsARQCFQEUAUoB6wH0GQAB9AHs\n        ARQBEwFtAesB7AHvAfEBvAH3AesBbQHqARUBFAHtAbwC/xoAAfQBHANKAfMCAAH/AfQB7wF0AZkBvALv\n        AfAB8wL0AfMB8gEHAe8B7QJLAewB8gH/AgABBwFLAkoBBwH/FQABvAJEAUoBHAH0AQAC/wHwAaACegGZ\n        AfIB/wLyAv8IAAL/FQABBwRDARIBkgH0Bf8F9AHzApkCGgEHAfIF8wT0Af8B8QIVAkQBbgGSAf8aAAH0\n        AewBFAESAesB7QHwAfEB8wG8AZIBbQESARMB7AG8A/8aAAH/Ae8BRAJKAbwDAAH/ARwBdAEHARwBdAFR\n        A0sBbgJLAlEB7AEcAUsB7AH/AwABHANLAbwB/xUAAfIBSgEjAUQBbgHyA/8B8gEaAnoBeQGZAbwC8gHz\n        Av8HAAL/FQAB9AEVA0MBFAHsAf8KAAH0Ae8BmQEaAfIBvAH0Cf8BAAHxARUCRAFKAXMBvAH/GwAB8wEU\n        ARIB7QG8AfEC9AHzAQcB7QJtAZIB9AL/GwAB/wEHAkQBSgHsAf8CAAH0AXMB7QHzARwBmQGaBHoBoAKa\n        AZkBBwHyAVEB7QH/AgAB/wFuAksBcwHxFgAB9AFLAiMBSgG8Af8BAAH/AfQBvAGaAXkBegGaAZkBHAGZ\n        AfAC/x8AAesDQwEVAesB/wkAAf8B9AEHARoC8wG8AfQB/wkAAbwCRAFKAW4BHAHyGwAB/wHvARQB6wEH\n        AfEB9AP/AfMBBwHsAW0B6gEHAfQB/xwAAfEBSgJEARMB8wIAAfQBcwH3Af8B9AIbAhoBoAGZAbwB8ALy\n        AfQB/wFzARwB/wEAAf8B8QJLAVEBmQH0FgAB/wHsAkQBSgHtAfQD/wHyAfABGgN6AaABGwHwAv8FAAL/\n        GAAB8AEVA0MBEgHzCQAB/wH0AbwB8ALxAfAB9AH/CQAB9wFEAUoBbgEcAQcB9BoAAf8B9wERARIB7wHx\n        AfQC/wEAAv8B8wEHAewBEgHqAQcB9AH/GwAB9AFzAkQBIwHvAf8BAAH/ARwB7wEAA/8B9AHzAXoBcwHz\n        AvQC/wEAARwBBwH/AQAB/wEcAlEBdAEHAf8XAAG8AUQCIwFKAbwD/wH0AfIBvAEaAZoBeQF6ARoB8AL/\n        BAAE/xcAAfQB6wFDAhEBFQHwCQAC/wH0A/IB8wH/CQAB/wHrAUsBbgF0AQcB8AH/GQAB/wH3AUMBFQH3\n        AfEB9AL/AwAC/wHzAQcB6wHqAW0BBwH0Af8aAAH/Ae8BSgFEASMBSgHyAgAB8AEHAf8DAAH/AfQBeQHs\n        BP8BAAH/AZkB8gL/AfEBcwFSAXQBmQHyAf8XAAH/AUoBRAEjAUQB7AHzA/8B9AHzAfEBvAF0AXkBmgHw\n        Av8EAAX/FgAB/wG8ARQCEQEVAfcB/wkABv8KAAH0AW4CdAGZAQcB8wH/GAAB/wHvAUMBEAESAQcB9AL/\n        BQAC/wH0AZIC6wHtAfEB/xsAAfIBcwFKAUQBIwHsAfQBAAH/AfAB/wQAAfQBdAHrAf8EAAHzAbwC/wH0\n        ARwCdAGZAe8B/xkAAbwERAGSAfQBAAP/AfQB8AF0AVIBmQHxAv8DAAH/AfIB9wEHAfQC/xYAAfQB7AFD\n        AhEB6gH0GQABvAJ0AZkBBwHwAfQB/xgAAf8B8AETAREBQwHrAfIB/wcAAf8B8QFtAesB9wHwAfQB/xsA\n        Af8B7wFKA0QB7wP/BQAB9AF5AesB/wQAA/8B9AEHAXkBegF5ARoB8gH/GgAB7AFKA0QBkgHzBP8B8gFz\n        AVEBeQHwAv8BAAL/AbwDSwG8Av8WAAH/AfIBEgIRAUMBvAH/FwAB/wHtAZMBmQK8AfMB/xoAAf8B8AES\n        AREBQwHsAfIB/wUAAf8B8QLrAe8B8QHzAv8cAAH0AXMCSgFEARQB7wH0Af8FAAH0AXQB6wH/BQAB/wH0\n        AbwBmQKaARoBvAH/GwAB8wFzAUoDRAHsAfAB9AL/AfIBSwFRAXkBvAP/AfMB7wFRAlIBdAG8Af8YAAH/\n        AQcBEwIRAewB9AH/FQAB/wHxARwBmQK8AfIC/xsAAf8B8AESAUMBFQHsAfIB/wMAAf8B8QLrAe8B8AHz\n        Av8eAAHyAUsCSgJEAfcB8wH/BAAB9AF0AesB/wMAAv8B8wEHAZkDoAG8AfQcAAH/AfEBcwFLAkoBRAFt\n        ARwB8AHzAfECSwF5AbwB9AHyAQcBcwFSA3kBmQHzAf8ZAAH/Ae8BFAERARUBBwH/FAAB/wH0Ae8BmQEa\n        AbwB8QH0Af8dAAH/AfAB6gFDARUB7AHyAf8BAAH/AfEBbQESAfcB8AHyAv8fAAH/AfABcwJKAkQB6wEH\n        AfQB/wIAAfQBdAHrAf8CAAH/AfQBvAKZAqABGgG8AfMB/x0AAf8B8gEcAXMBSwRKAuwCSwFRAewBHAFz\n        AVIBeQJ6AZoBGgHxAv8aAAH0Ae8BFAFDAW0B8QH/EgAC/wG8AQcBGgG8AfEB9AH/HwAB/wHwAW0BQwEV\n        AZIB/wEAAfQB6gEUAe0BvAHzAv8hAAH/AfABcwNKAkQB6wHvAfEB9AHzAXQB6wLzAfEB7wEcAXkBmgKg\n        ARoBvAHyAf8eAAL/AfMBvAF0AXMBSwRKBEsBUQFSAXQBeQGaARoB8AHxAfQC/xsAAf8BBwFKARUB7AHz\n        Af8QAAL/AfEB7wHwAbwB8QH0Av8gAAH/AfEB6gFDAewB9AEAAfEBFQHsAbwB8gL/IwAB/wHyARwBSwZK\n        ARIB6gFLA0oBUQFSAXoDoAEaAbwB8wL/HwAC/wH0AbwBmQF0AVEFSwFSAnQBeQGaARoBGwG8AfIB9AL/\n        HQAB/wHxAewBEwHtAfMB/w8AAf8B8QHvArwB8gL/IwAB/wHwAW0B7AH0Af8B8QHrAQcB8gL/JQAB/wH0\n        AQcBcwFLAkoESwFSAXQEUgJ6AaABGwHwAfQC/yIAAv8B8wG8ARoBmgF5A3QBmQGaARoBwwEbAbwB8gHz\n        AfQC/x8AAf8B9AH3ARIB7AHyAf8NAAH/AfABHAG8AfAB9AH/JgAB/wHwAe8B9AH/AfIBBwHzAv8oAAH/\n        AfIBBwFzBksCUgJ0AnkBmQG8AfMB9AH/JQAC/wH0AfMB8QTwAfEC8AHxAfMC9AP/IgAB/wHyAfcB7wHx\n        Af8KAAH/AfQCBwHwAfQC/ygAAf8B9AL/AfQD/ysAAf8B8wHwAZkCHAFzAnQBHAKZARoB8AHzA/8oAAT/\n        B/QD/ycAAf8B8wHxAfQB/wkAAf8C8gP/LAAD/zAAAv8B8wXyAfMB9AP/LAAL/zgAAv9kAAj//wD/AP8A\n        YwABQgFNAT4HAAE+AwABKAMAAeADAAHgAwABAQEAAQEFAAGAARgWAAP//wD/AP8A/wD/AP8AJwAB/wEE\n        AUwB/AHZAQwBfxb/AgABMAIAAT8O/wH4BQABAQH/AgABMAIAAT8O/wHwBQABAQH/AgABMAIAAT8O/wHw\n        BQABAQH/AgABeAIAAX8O/wHwAgABCAEAAQgBAwH/AgABCAIAAX8B4AMAASABggEhB/8B4AIAAQgBBAEI\n        AQMB/wUAAX8B4AUAAQEH/wHgBQABAwH/BQABfwHgAwABEAEAAQcB+AEAAQQCGAEgAQ8BwAUAAQMB/wIA\n        AXgCAAE/AeABAgIAARABMAEHAfgCAAEIARABAAEHAcACAAFAAgABBwH/AgABcAIAAT8B8AECAgABEAEw\n        AQcB+AIAAQgCAAEHCP8CAAFwAgABPwHgBQABBwH8AgABCAEgAQABHw7/AeAFAAEHAfwCAAGMAQEBAAE/\n        Dv8B4AUAAQ8B/AIAAYwBAQEAAT8V/wH8AgABgAEBAQABPwL/Af4BAAE/BP8B+AEAAT8J/wH4BQABPwL/\n        AeABAAEHBP8BwAEAAQcJ/wH4BQABPwL/AYABAAEBBP8BgAEAAQEJ/wH4BQABfwL/AwAD/wH+AwAF/wGI\n        C/8B/gMAAT8C/wH+AwABPwL/AfwB/gEIAR8Bnwn/AfwDAAE/Av8B/AMAAT8C/wH8AXgBCAEPAR8J/wH4\n        AwABHwL/AfgDAAEfAv8B/AEwAQgBBwEfCf8B8AEAARABAAEPAv8B8AMAAQ8C/wH8AwABHwn/AfABAAF4\n        AQABBwL/AeADAAEHAv8B9AMAATcE/wHwAT8D/wHgAQEB/AEAAQcC/wHgAwABAwL/AeADAAEjA/8BgQGA\n        AQcD/wHgAQMB/gEAAQMC/wHAAwABAwL/AeADAAEDA/8CAAEBA/8BwAEHAf8BAAEDAv8BwAMAAQEC/wHg\n        AwABAwL/AfADAAP/AcABDwH/AQABAQL/AYADAAEBAv8B8AMAAQcC/wHwAwABfwL/AcABHwH/AQABAQL/\n        AYADAAEBAv8B8AEGAQABGAEHAv8B8AIAAXABPwL/AYABfwH/AYABAQL/AYAEAAL/AfABBgEAARgBBwL/\n        AfwCAAEEAT8C/wGAAR8B/wEAAQEC/wGABAAC/wHwAQ4BAAEYAQ8C/wH+AgABAQP/AYABHwH+AQABAQL/\n        AYAEAAL/AfgBDwEAARgBHwP/AgABAQP/AYABDwH+AQABAQL/BQABfwH/Af4BDwEAATgBPwL/Af4CAAEB\n        A/8BgAEHAfgBAAEBAv8FAAF/Af8B/gEPAQABOAE/Av8B/gIAATsD/wGAAQcB+AEAAQEC/wUAAX8B/wH+\n        AQ8BAAE4AT8C/wH8AQABAQT/AYABgQHgAQABAQL/BQABfwH/Af4BBwEAATABPwL/AfwBAAEHBP8BgAMA\n        AQEC/wUAAX8C/wEHAQABMAF/Av8B/gEAAQME/wGAAUACAAEBAv8FAAF/Av8BAwEIASABfwL/Af4CAAFx\n        A/8BgAMAAQEC/wGABAABfwL/AYABCAEAAX8C/wH+AgABAQP/AcABIAIAAQEC/wGABAAD/wGAAQgBAAT/\n        AgABAQP/AcABEAIAAQEC/wGABAAD/wGAAQgBAAP/Af4CAAECAT8C/wHAARgCAAEBAv8BgAMAAQED/wHA\n        AQgBAQP/AfADAAE/Av8B4AEMAgABAwL/AcADAAEBA/8B4AEIAQMD/wHwAwABfwL/AfABBgEAARABAwL/\n        AcADAAEBA/8B+AEIAQ8D/wHwAwAD/wHwAQEBgAEAAQMC/wHgAwABAwP/AfwBCAEfA/8B/AIAAQED/wH4\n        AQABPAEAAQcC/wHwAwABAwT/AYgF/wIAAQMD/wH8AwABDwL/AfADAAEDBP8BiAX/AcABAAEHA/8B/gMA\n        AQ8C/wH4AwABBwT/AcgG/wHAAT8D/wH+AwABHwL/AfwDAAEPBP8ByQz/AwABPwL/Af4DAAEfBP8ByQz/\n        AeACAAT/AwABPwT/AckM/wHwAQABAQT/AYACAAE/Ef8B/AEAAQcE/wHAAgAT/wEAAR8E/wHgAQABARP/\n        AfAF/wH8AQABBxr/AQABHzr/Af4B+wEOAfcBHAHHAb8V/wH8AWABBAFEAQABAwEfD/8B+AHGAQgBiAGD\n        Af8B/AEgAQABQAEAAQMBHw//AeABAAEIAQABAQH/AfwCAAFAAgABHw//AcABAAEIAQABAQH/AfwDAAFA\n        AQABHwH/AQABgAEAARABIAF/Af8B4gFjAREBkwEnAv8BwAMAAQMB/wH+AQABYAEAAUABAAE/Af8DAAEQ\n        ASABfwH/AeABAgEBAQABAwL/AcADAAEPAv8BAAFgAQABQAEQAX8B/gEAAQYBMAEAASABfwH/AeABAgIA\n        AQMC/wHAAwABAwL/AQQBAAJAARABfwH+AQABBgEwAgABfwH/AeABAgIAAQMC/wHAAwABAwL/AQQBAAJA\n        ARgBfwH/AQIBBgEwAgABfwH/AeABAgIAAQMC/wHAAwABAwL/AQ4BBAJAATgBfwH/AQIBJgEwARABAAF/\n        Af8B4AECAQgBAAEDAv8BwAMAAQMC/wGfA/8B/Qn/AeADAAEDAv8BwAMAAQEQ/wHgAwABAwL/AcADAAEB\n        C/8B5wT/AeABIAEAASABAwv/AQEG/wGAE/8B4AEAAQ8E/wH8AQABHxL/AYABAAEDBP8B8AEAAQcL/wH+\n        AQgBfwT/AwAE/wHAAQABAQv/Af4BAAE/A/8B/gMAAX8C/wH+AwABfwT/AQABPwT/Af4BAAE/A/8B/AMA\n        AT8C/wH+AwABPwP/AfwBAAEfBP8B/gEAAX8D/wH4AwABPwL/Af4DAAE/A/8B8AEAAQcE/wH+AQABfwP/\n        AfABAAEPAcABHwL/Af4DAAE/A/8B4AEAAQEE/wHgAQABAwP/AeACAAEgAQ8C/wH+AwABPwP/AQIBAAEg\n        AX8D/wHAAQABAwP/AcACAAEQAQcC/wH+AwABPwP/AQYBAAEwAT8D/wHAAQABAQP/AcABBAEAARgBAwL/\n        Af4DAAE/Av8B/gEGAQABMAE/A/8BgAIAA/8BwAEMAQABHAEDAv8B/gEAAQgBAAE/Av8B/gEOAQABOAE/\n        A/8DAAP/AYABHAEAARwBAwL/Af4BAAEIAQABPwL/AfwBDgEAATwBHwP/AwABfwL/AYABPAEAAR4BAQL/\n        Af4BAAEIAQABPwL/AfwBHgEAATwBHwL/Af4BAwEAAcABfwL/AYABfAEAAR8BAQL/Af4BAAEIAQABPwL/\n        AfgBPgEAAT4BDwL/Af4BAwEAAeABPwL/AQAB/AEAAR8BAQL/Af4BAAEIAQABPwL/AfgBPgEAAT4BBwL/\n        AcABBwEAAeABAQL/AQAB/AEAAR8BgQL/Af4BAAEYAQABPwL/AfABPgEAAT4BBwL/AcABBwGJAeABAQL/\n        AQEB/AEAAR8BgQL/Af4BAAF/AQABPwL/AfABPwEAAT8BBwL/AcABAQGIAYABAQL/AQEB/AEAAR8BgAL/\n        Af4BAQH/AYABPwL/AfABPwEAAX8BBwL/AcACAAGAAQEC/wEBAfwBAAEfAYAC/wH+AQEBCAEAAT8C/wHw\n        AT8BgAF+AQcC/wHAAgABgAEBAv8BgQH8AQABHwGAAv8B/gEAAQgBAAE/Av8B8AE/AcEB/gEHAv8BwAIA\n        AYABAQL/AYEB/AEAAR8BgQL/Af4DAAE/Av8B8AEfAYAB/gEHAv8BwAIAAYABAQL/AYEB/AEAAR8BgQL/\n        Af4DAAE/Av8B8AEeAQABPAEHAv8BwAEBAQABgAEBAv8BgAH8AQABHwEBAv8B/gMAAT8C/wHwAQ4BAAE4\n        AQcC/wHAAQcBgAHgAQMC/wGAAfwBAAEfAQEC/wH+AwABPwL/AfABBgEAATABBwL/AcIBAwEAAeABPwL/\n        AYABfAEAAR4BAQL/Af4DAAE/Av8B+AEGAQABEAEPAv8B/gEDAQABwAE/Av8BwAE8AQABHAEBAv8B/gMA\n        AT8C/wH4AwABDwL/Af4BAQEAAcABPwL/AcABPAEAAQwBAwL/Af4DAAE/Av8B+AMAAQ8D/wMAAX8C/wHg\n        ARwBAAEIAQMC/wH+AwABPwL/AfwDAAEfA/8BgAIAA/8B8AEEAgABBwL/Af4DAAE/Av8B/gMAAR8D/wGA\n        AgAD/wHwAwABBwL/Af4DAAE/Av8B/gMAAT8D/wHAAQABAQP/AfgDAAEPAv8B/gMAAR8C/wH+AwABPwP/\n        AeABAAEBA/8B/AMAAQ8C/wH+AwABHwP/AwABPwP/AeABAAEDA/8B/gMAAR8C/wH+AwABHwP/AwABfwP/\n        AfgBAAEHA/8B/gMAAT8C/wH+AwABPwP/AcACAAT/Af4BAAE/BP8BwAIAAX8C/wH+AwABPwP/AfABAAED\n        BP8B/gEAAT8E/wHgAgAD/wH+AwABPwP/AfwBAAEPBP8B/gEIAT8E/wH4AQABAwT/AfwCAAE/A/8B/gEA\n        AT8F/wH4Bf8B/AEAAQ8E/wH+AgABfxL/AYABf47/AfwBIAFgAeABcAEAAX8V/wH8AQABYAHgAWABAAEf\n        CP8CAAEEAgABfwf/AfwBAAJgAUABAAEfB/8B/gUAAX8B8AJAAQABBAEIAQcB/AEAAmABQAEiAQ8H/wH+\n        BQABfwHwAQABQAMAAQcB/AEEAwABIwEPAf4CAAGEAgABfwH/BAABgAH/AfgEAAEQAQ8B/AEcAwABIwGP\n        Af4CAAGEAgABPwH/AgABIAFAAYAB/wH4AgABBAIAAQ8B/AEMAgABEAEjAY8B/gIAAYQCAAE/Af8BgAEA\n        ASABQAEAAf8B+AIAAUYCAAEPAfwBBAFiAQgBEAEiAQ8B/gIAAYQCAAE/Af8BggEAATABwAEAAf8B+AEA\n        AeABRgIAAQ8B/AEAAWABCAEQAQABDwH+ARABAAGEAgABPwH/AYIBDAEQAcABAAH/AfABAAFAAwABDwH8\n        AQABQQEIAXABAAEfAf4FAAE/Af8BwgEMARABgAEAAf8B8AEAAUADAAEHAfwBAAFBAQgBcAEAAT8B/gUA\n        AT8B/wHCARwBGQGAAQEB/wHwAYABQAEAAQgBEAEPA/8BnwP/Af4FAAE/GP8BAQb/AYEM/wH4AUABDwv/\n        AfwBAAE/Cv8B/AFwAQABBwEfCv8B8AEAAQ8F/wGABP8B+AFwAQABBwEPCv8BgAEAAQME/wH8AQABHwP/\n        AfABcAEAAgcD/wH+AT4BPwT/AwAE/wH4AQABBwP/AeABcAEAAgcD/wH8ARwBHwP/Af4DAAF/A/8B4AEA\n        AQED/wHgAfABAAEHAYMD/wH8AQgBDwP/AfwDAAE/A/8BwAIAA/8BwAHwAQABBwGBA/8B+AEIAQcD/wH4\n        AwABHwP/AwABfwL/AcAB8AEAAQcBwQP/AeABAAEDA/8B8AECAQABYAEfAv8B/gMAAT8C/wGAAfABAAEH\n        AcAD/wHAAQABAQP/AfABBgEAAXABDwL/Af4CAAGAAT8C/wGAAfABAAEHAcAD/wGAAgAD/wHgAQYBAAFw\n        AQcC/wH8AgAB8AEfAv8BgAQAA/8DAAF/Av8B4AEOAQABeAEHAv8B/AEAAUAB8AEfAv8BgAQAAv8B/gMA\n        AT8C/wHgAQ4BAAFwAQcC/wH4AQEBAAH4AQ8C/wUAAv8B/gMAAT8C/wHAAQ4BAAFwAQMC/wH4AQYBAAH+\n        AQ8C/wUAAv8B/gEEAQABEAE/Av8BwAEOAQABcAEDAv8B8AIAAf4BDwH/Af4FAAE/Af8B/AEEAQABCAE/\n        Av8BgAEOAQABcAEBAv8B8AIAAf8BDwH/AfwFAAE/Af8B/gMAAT8C/wGBAQwBAAEwAQEC/wHwAQABAQH/\n        AQ8B/wH8BQABPwH/Af4DAAE/Av8BgQIAARABAQL/AfABEAEAAf8BjwH/AfwFAAE/Af8B/gMAAT8C/wGB\n        AwABAQL/AfABIAEAAf8BjwH/AfwFAAE/Av8DAAF/Av8BgQMAAYEC/wHwASABAAH/AY8B/wH+BQABPwL/\n        AYACAAF/Av8BgQEAAQYBAAGBAv8B8AEgAQAB/wGfAf8B/gUAAT8C/wHgAQABAQP/AYEBgAEAAQEBgQL/\n        AfABIAEAAf8BPwH/Af4FAAE/Av8B8AEAAQED/wGBAcABAAEDAYEC/wHwAgABfwE/Af8B/gEBAf8BgAEA\n        AUABPwL/AfgBAAEDA/8BgAHAAQACAwL/AfABEAEAAX8D/wEBAf8BAAF/AcABfwL/AfABAAEDA/8CwAEA\n        AQIBAwL/AfACAAF8A/8BAQH/AQABfwHAAX8C/wHgAQgBAQP/AcABRAEAASIBAwL/AfgCAAF4AX8C/wEB\n        Af8BAAH/AYABfwL/AcABHAEAA/8BwAFjAYABQAEDAv8B+AIAAXgBPwL/AQAB/wGBAf8BgAF/Av8BgAE+\n        AQAD/wHgASMBwwHAAQcC/wH8AQQBAAFwAR8C/wGAA/8BgAF/Av8BgAF/AQAD/wHgAQcBwwHAAQcC/wH+\n        AgABQAEfAv8BgAF/Av8BAAP/AcABPgEAA/8B8AEHAcMB4AEPAv8B/gMAAT8C/wHAAT8B/wH+AQAD/wHg\n        ARwBAQP/AfgBAwHDAYABHwL/Af4DAAE/Av8B4AE/Af8B/AEBA/8B8AEIAQMD/wH4AQABwwEAAR8D/wMA\n        AT8C/wHwAR8B/wH4AQMD/wH4AQgBBwP/AfwDAAE/A/8DAAE/Av8B+AEPAf8B8AEDA/8B/AEIAQ8D/wH+\n        AwABPwP/AYACAAF/Av8B/AEHAf8B8AEPA/8B/gEAAR8E/wMAAX8D/wHgAgAD/wH+AQMB/wHgAT8E/wEA\n        AT8E/wHAAQABAQT/AfABAAEBBP8BgQH/AYABfwT/AYABfwT/AfABAAEDBP8B/AEAAQ8E/wHgAf8BgQX/\n        AeMF/wH8AQABHwT/Af4BAAE/Bv8Bzwz/AQBs/ws=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/BlankCharacter/BlankCharacterWindow.Designer.cs",
    "content": "﻿namespace EVEMon.BlankCharacter\n{\n    partial class BlankCharacterWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.buttonCancel = new System.Windows.Forms.Button();\n            this.buttonOK = new System.Windows.Forms.Button();\n            this.bottomPanel = new System.Windows.Forms.Panel();\n            this.blankCharacterControl = new EVEMon.BlankCharacter.BlankCharacterControl();\n            this.bottomPanel.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // buttonCancel\n            // \n            this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.buttonCancel.Location = new System.Drawing.Point(412, 23);\n            this.buttonCancel.Margin = new System.Windows.Forms.Padding(3, 20, 20, 3);\n            this.buttonCancel.Name = \"buttonCancel\";\n            this.buttonCancel.Size = new System.Drawing.Size(75, 23);\n            this.buttonCancel.TabIndex = 0;\n            this.buttonCancel.Text = \"Cancel\";\n            this.buttonCancel.UseVisualStyleBackColor = true;\n            this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);\n            // \n            // buttonOK\n            // \n            this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.buttonOK.Location = new System.Drawing.Point(331, 23);\n            this.buttonOK.Margin = new System.Windows.Forms.Padding(3, 20, 3, 3);\n            this.buttonOK.Name = \"buttonOK\";\n            this.buttonOK.Size = new System.Drawing.Size(75, 23);\n            this.buttonOK.TabIndex = 1;\n            this.buttonOK.Text = \"Import\";\n            this.buttonOK.UseVisualStyleBackColor = true;\n            this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);\n            // \n            // bottomPanel\n            // \n            this.bottomPanel.BackColor = System.Drawing.SystemColors.ControlLight;\n            this.bottomPanel.Controls.Add(this.buttonCancel);\n            this.bottomPanel.Controls.Add(this.buttonOK);\n            this.bottomPanel.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.bottomPanel.Location = new System.Drawing.Point(0, 425);\n            this.bottomPanel.Name = \"bottomPanel\";\n            this.bottomPanel.Size = new System.Drawing.Size(497, 57);\n            this.bottomPanel.TabIndex = 2;\n            // \n            // blankCharacterControl\n            // \n            this.blankCharacterControl.AutoSize = true;\n            this.blankCharacterControl.BackColor = System.Drawing.Color.Transparent;\n            this.blankCharacterControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.blankCharacterControl.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.blankCharacterControl.Location = new System.Drawing.Point(0, 0);\n            this.blankCharacterControl.Name = \"blankCharacterControl\";\n            this.blankCharacterControl.Padding = new System.Windows.Forms.Padding(13);\n            this.blankCharacterControl.Size = new System.Drawing.Size(497, 425);\n            this.blankCharacterControl.TabIndex = 3;\n            // \n            // BlankCharacterWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.BackColor = System.Drawing.SystemColors.Window;\n            this.ClientSize = new System.Drawing.Size(497, 482);\n            this.Controls.Add(this.blankCharacterControl);\n            this.Controls.Add(this.bottomPanel);\n            this.MaximizeBox = false;\n            this.Name = \"BlankCharacterWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Blank Character Creator\";\n            this.Load += new System.EventHandler(this.BlankCharacterWindow_Load);\n            this.bottomPanel.ResumeLayout(false);\n            this.bottomPanel.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Button buttonCancel;\n        private System.Windows.Forms.Button buttonOK;\n        private System.Windows.Forms.Panel bottomPanel;\n        private BlankCharacterControl blankCharacterControl;\n    }\n}"
  },
  {
    "path": "src/EVEMon/BlankCharacter/BlankCharacterWindow.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.BlankCharacter\n{\n    public partial class BlankCharacterWindow : EVEMonForm\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BlankCharacterWindow\"/> class.\n        /// </summary>\n        public BlankCharacterWindow()\n        {\n            InitializeComponent();\n        }\n\n\n        #endregion\n\n\n        #region Inherited Event Handlers\n\n        /// <summary>\n        /// Handles the Load event of the BlankCharacterWindow control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void BlankCharacterWindow_Load(object sender, EventArgs e)\n        {\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            Disposed += OnDisposed;\n\n            buttonOK.Text = \"Save\";\n            buttonOK.Enabled = false;\n        }\n\n        /// <summary>\n        /// Called when the instance get disposed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            Disposed -= OnDisposed;\n        }\n\n        #endregion\n\n\n        #region Global Event Handlers\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            buttonOK.Enabled = !string.IsNullOrEmpty(BlankCharacterUIHelper.CharacterName);\n            AcceptButton = buttonOK.Enabled ? buttonOK : buttonCancel;\n        }\n\n        #endregion\n\n\n        #region Control Handlers\n\n        /// <summary>\n        /// Handles the Click event of the buttonOK control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private async void buttonOK_Click(object sender, EventArgs e)\n        {\n            // Three choices for one button\n            switch (buttonOK.DialogResult)\n            {\n                    // Save blank character\n                case DialogResult.None:\n                    await BlankCharacterUIHelper.SaveAsync(OnCharacterSaved);\n                    break;\n                    // Add blank character\n                case DialogResult.OK:\n                    await BlankCharacterUIHelper.AddBlankCharacterAsync(OnCharacterImported);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the buttonCancel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void buttonCancel_Click(object sender, EventArgs e)\n        {\n            Close();\n        }\n\n        #endregion\n\n\n        #region Callback Methods\n\n        /// <summary>\n        /// Called when character is saved.\n        /// </summary>\n        private void OnCharacterSaved()\n        {\n            buttonOK.Text = \"Import\";\n            buttonOK.DialogResult = DialogResult.OK;\n\n            // Disabling control editing\n            blankCharacterControl.Enabled = false;\n        }\n\n        /// <summary>\n        /// Called when character is imported.\n        /// </summary>\n        private void OnCharacterImported()\n        {\n            Close();\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/BlankCharacter/BlankCharacterWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/BlankCharacterControl.Designer.cs",
    "content": "﻿namespace EVEMon.BlankCharacter\n{\n    partial class BlankCharacterControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BlankCharacterControl));\n            this.rbFemale = new System.Windows.Forms.RadioButton();\n            this.rbMale = new System.Windows.Forms.RadioButton();\n            this.tbCharacterName = new System.Windows.Forms.TextBox();\n            this.gbRace = new System.Windows.Forms.GroupBox();\n            this.tlpRaces = new System.Windows.Forms.TableLayoutPanel();\n            this.pictureBox3 = new System.Windows.Forms.PictureBox();\n            this.pictureBox2 = new System.Windows.Forms.PictureBox();\n            this.pictureBox1 = new System.Windows.Forms.PictureBox();\n            this.rbCaldari = new System.Windows.Forms.RadioButton();\n            this.rbAmarr = new System.Windows.Forms.RadioButton();\n            this.rbGallente = new System.Windows.Forms.RadioButton();\n            this.rbMinmatar = new System.Windows.Forms.RadioButton();\n            this.pbAmarr = new System.Windows.Forms.PictureBox();\n            this.gbBloodline = new System.Windows.Forms.GroupBox();\n            this.tlpBloodline = new System.Windows.Forms.TableLayoutPanel();\n            this.rbBloodline3 = new System.Windows.Forms.RadioButton();\n            this.rbBloodline2 = new System.Windows.Forms.RadioButton();\n            this.pbBloodline3 = new System.Windows.Forms.PictureBox();\n            this.pbBloodline1 = new System.Windows.Forms.PictureBox();\n            this.pbBloodline2 = new System.Windows.Forms.PictureBox();\n            this.rbBloodline1 = new System.Windows.Forms.RadioButton();\n            this.gbAncestry = new System.Windows.Forms.GroupBox();\n            this.tlpAncestry = new System.Windows.Forms.TableLayoutPanel();\n            this.lblAncestry1 = new System.Windows.Forms.Label();\n            this.rbAncestry2 = new System.Windows.Forms.RadioButton();\n            this.pbAncestry1 = new System.Windows.Forms.PictureBox();\n            this.rbAncestry1 = new System.Windows.Forms.RadioButton();\n            this.rbAncestry3 = new System.Windows.Forms.RadioButton();\n            this.lblAncestry3 = new System.Windows.Forms.Label();\n            this.lblAncestry2 = new System.Windows.Forms.Label();\n            this.pbAncestry2 = new System.Windows.Forms.PictureBox();\n            this.pbAncestry3 = new System.Windows.Forms.PictureBox();\n            this.ilAncestry = new System.Windows.Forms.ImageList(this.components);\n            this.gbGender = new System.Windows.Forms.GroupBox();\n            this.gbCharacterName = new System.Windows.Forms.GroupBox();\n            this.ilBloodline = new System.Windows.Forms.ImageList(this.components);\n            this.tlpGender = new System.Windows.Forms.TableLayoutPanel();\n            this.pbFemale = new System.Windows.Forms.PictureBox();\n            this.pbMale = new System.Windows.Forms.PictureBox();\n            this.lblFemale = new System.Windows.Forms.Label();\n            this.lblMale = new System.Windows.Forms.Label();\n            this.gbRace.SuspendLayout();\n            this.tlpRaces.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAmarr)).BeginInit();\n            this.gbBloodline.SuspendLayout();\n            this.tlpBloodline.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbBloodline3)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbBloodline1)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbBloodline2)).BeginInit();\n            this.gbAncestry.SuspendLayout();\n            this.tlpAncestry.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAncestry1)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAncestry2)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAncestry3)).BeginInit();\n            this.gbGender.SuspendLayout();\n            this.gbCharacterName.SuspendLayout();\n            this.tlpGender.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbFemale)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbMale)).BeginInit();\n            this.SuspendLayout();\n            // \n            // rbFemale\n            // \n            this.rbFemale.AutoSize = true;\n            this.rbFemale.Checked = true;\n            this.rbFemale.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbFemale.Location = new System.Drawing.Point(3, 3);\n            this.rbFemale.Name = \"rbFemale\";\n            this.rbFemale.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.tlpGender.SetRowSpan(this.rbFemale, 2);\n            this.rbFemale.Size = new System.Drawing.Size(43, 94);\n            this.rbFemale.TabIndex = 0;\n            this.rbFemale.TabStop = true;\n            this.rbFemale.UseVisualStyleBackColor = true;\n            this.rbFemale.Click += new System.EventHandler(this.rbFemale_Click);\n            // \n            // rbMale\n            // \n            this.rbMale.AutoSize = true;\n            this.rbMale.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbMale.Location = new System.Drawing.Point(3, 103);\n            this.rbMale.Name = \"rbMale\";\n            this.rbMale.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.tlpGender.SetRowSpan(this.rbMale, 2);\n            this.rbMale.Size = new System.Drawing.Size(43, 87);\n            this.rbMale.TabIndex = 1;\n            this.rbMale.UseVisualStyleBackColor = true;\n            this.rbMale.Click += new System.EventHandler(this.rbMale_Click);\n            // \n            // tbCharacterName\n            // \n            this.tbCharacterName.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tbCharacterName.Location = new System.Drawing.Point(13, 16);\n            this.tbCharacterName.Name = \"tbCharacterName\";\n            this.tbCharacterName.Size = new System.Drawing.Size(200, 20);\n            this.tbCharacterName.TabIndex = 4;\n            this.tbCharacterName.TextChanged += new System.EventHandler(this.tbCharacterName_TextChanged);\n            // \n            // gbRace\n            // \n            this.gbRace.Controls.Add(this.tlpRaces);\n            this.gbRace.Location = new System.Drawing.Point(13, 13);\n            this.gbRace.Name = \"gbRace\";\n            this.gbRace.Size = new System.Drawing.Size(470, 135);\n            this.gbRace.TabIndex = 5;\n            this.gbRace.TabStop = false;\n            this.gbRace.Text = \"Race\";\n            // \n            // tlpRaces\n            // \n            this.tlpRaces.ColumnCount = 4;\n            this.tlpRaces.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));\n            this.tlpRaces.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));\n            this.tlpRaces.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));\n            this.tlpRaces.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));\n            this.tlpRaces.Controls.Add(this.pictureBox3, 3, 0);\n            this.tlpRaces.Controls.Add(this.pictureBox2, 2, 0);\n            this.tlpRaces.Controls.Add(this.pictureBox1, 1, 0);\n            this.tlpRaces.Controls.Add(this.rbCaldari, 1, 1);\n            this.tlpRaces.Controls.Add(this.rbAmarr, 0, 1);\n            this.tlpRaces.Controls.Add(this.rbGallente, 2, 1);\n            this.tlpRaces.Controls.Add(this.rbMinmatar, 3, 1);\n            this.tlpRaces.Controls.Add(this.pbAmarr, 0, 0);\n            this.tlpRaces.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tlpRaces.Location = new System.Drawing.Point(3, 16);\n            this.tlpRaces.Name = \"tlpRaces\";\n            this.tlpRaces.RowCount = 2;\n            this.tlpRaces.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 71.94244F));\n            this.tlpRaces.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 28.05755F));\n            this.tlpRaces.Size = new System.Drawing.Size(464, 116);\n            this.tlpRaces.TabIndex = 0;\n            // \n            // pictureBox3\n            // \n            this.pictureBox3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pictureBox3.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox3.Image\")));\n            this.pictureBox3.Location = new System.Drawing.Point(351, 3);\n            this.pictureBox3.Name = \"pictureBox3\";\n            this.pictureBox3.Size = new System.Drawing.Size(110, 77);\n            this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox3.TabIndex = 7;\n            this.pictureBox3.TabStop = false;\n            // \n            // pictureBox2\n            // \n            this.pictureBox2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pictureBox2.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox2.Image\")));\n            this.pictureBox2.Location = new System.Drawing.Point(235, 3);\n            this.pictureBox2.Name = \"pictureBox2\";\n            this.pictureBox2.Size = new System.Drawing.Size(110, 77);\n            this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox2.TabIndex = 6;\n            this.pictureBox2.TabStop = false;\n            // \n            // pictureBox1\n            // \n            this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox1.Image\")));\n            this.pictureBox1.Location = new System.Drawing.Point(119, 3);\n            this.pictureBox1.Name = \"pictureBox1\";\n            this.pictureBox1.Size = new System.Drawing.Size(110, 77);\n            this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox1.TabIndex = 5;\n            this.pictureBox1.TabStop = false;\n            // \n            // rbCaldari\n            // \n            this.rbCaldari.AutoSize = true;\n            this.rbCaldari.Location = new System.Drawing.Point(168, 86);\n            this.rbCaldari.Margin = new System.Windows.Forms.Padding(52, 3, 3, 3);\n            this.rbCaldari.Name = \"rbCaldari\";\n            this.rbCaldari.Size = new System.Drawing.Size(14, 13);\n            this.rbCaldari.TabIndex = 1;\n            this.rbCaldari.UseVisualStyleBackColor = true;\n            this.rbCaldari.Click += new System.EventHandler(this.rbCaldari_Click);\n            // \n            // rbAmarr\n            // \n            this.rbAmarr.AutoSize = true;\n            this.rbAmarr.Checked = true;\n            this.rbAmarr.Location = new System.Drawing.Point(52, 86);\n            this.rbAmarr.Margin = new System.Windows.Forms.Padding(52, 3, 3, 3);\n            this.rbAmarr.Name = \"rbAmarr\";\n            this.rbAmarr.RightToLeft = System.Windows.Forms.RightToLeft.No;\n            this.rbAmarr.Size = new System.Drawing.Size(14, 13);\n            this.rbAmarr.TabIndex = 0;\n            this.rbAmarr.TabStop = true;\n            this.rbAmarr.UseVisualStyleBackColor = true;\n            this.rbAmarr.Click += new System.EventHandler(this.rbAmarr_Click);\n            // \n            // rbGallente\n            // \n            this.rbGallente.AutoSize = true;\n            this.rbGallente.Location = new System.Drawing.Point(284, 86);\n            this.rbGallente.Margin = new System.Windows.Forms.Padding(52, 3, 3, 3);\n            this.rbGallente.Name = \"rbGallente\";\n            this.rbGallente.Size = new System.Drawing.Size(14, 13);\n            this.rbGallente.TabIndex = 2;\n            this.rbGallente.UseVisualStyleBackColor = true;\n            this.rbGallente.Click += new System.EventHandler(this.rbGallente_Click);\n            // \n            // rbMinmatar\n            // \n            this.rbMinmatar.AutoSize = true;\n            this.rbMinmatar.Location = new System.Drawing.Point(400, 86);\n            this.rbMinmatar.Margin = new System.Windows.Forms.Padding(52, 3, 3, 3);\n            this.rbMinmatar.Name = \"rbMinmatar\";\n            this.rbMinmatar.Size = new System.Drawing.Size(14, 13);\n            this.rbMinmatar.TabIndex = 3;\n            this.rbMinmatar.UseVisualStyleBackColor = true;\n            this.rbMinmatar.Click += new System.EventHandler(this.rbMinmatar_Click);\n            // \n            // pbAmarr\n            // \n            this.pbAmarr.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbAmarr.Image = ((System.Drawing.Image)(resources.GetObject(\"pbAmarr.Image\")));\n            this.pbAmarr.Location = new System.Drawing.Point(3, 3);\n            this.pbAmarr.Name = \"pbAmarr\";\n            this.pbAmarr.Size = new System.Drawing.Size(110, 77);\n            this.pbAmarr.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbAmarr.TabIndex = 4;\n            this.pbAmarr.TabStop = false;\n            // \n            // gbBloodline\n            // \n            this.gbBloodline.Controls.Add(this.tlpBloodline);\n            this.gbBloodline.Location = new System.Drawing.Point(13, 156);\n            this.gbBloodline.Name = \"gbBloodline\";\n            this.gbBloodline.Size = new System.Drawing.Size(148, 212);\n            this.gbBloodline.TabIndex = 6;\n            this.gbBloodline.TabStop = false;\n            this.gbBloodline.Text = \"Bloodline\";\n            // \n            // tlpBloodline\n            // \n            this.tlpBloodline.ColumnCount = 2;\n            this.tlpBloodline.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F));\n            this.tlpBloodline.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 65F));\n            this.tlpBloodline.Controls.Add(this.rbBloodline3, 0, 2);\n            this.tlpBloodline.Controls.Add(this.rbBloodline2, 0, 1);\n            this.tlpBloodline.Controls.Add(this.pbBloodline3, 1, 2);\n            this.tlpBloodline.Controls.Add(this.pbBloodline1, 1, 0);\n            this.tlpBloodline.Controls.Add(this.pbBloodline2, 1, 1);\n            this.tlpBloodline.Controls.Add(this.rbBloodline1, 0, 0);\n            this.tlpBloodline.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tlpBloodline.Location = new System.Drawing.Point(3, 16);\n            this.tlpBloodline.Name = \"tlpBloodline\";\n            this.tlpBloodline.Padding = new System.Windows.Forms.Padding(0, 0, 0, 6);\n            this.tlpBloodline.RowCount = 3;\n            this.tlpBloodline.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));\n            this.tlpBloodline.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));\n            this.tlpBloodline.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));\n            this.tlpBloodline.Size = new System.Drawing.Size(142, 193);\n            this.tlpBloodline.TabIndex = 0;\n            // \n            // rbBloodline3\n            // \n            this.rbBloodline3.AutoSize = true;\n            this.rbBloodline3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbBloodline3.Location = new System.Drawing.Point(3, 127);\n            this.rbBloodline3.Name = \"rbBloodline3\";\n            this.rbBloodline3.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.rbBloodline3.Size = new System.Drawing.Size(43, 57);\n            this.rbBloodline3.TabIndex = 5;\n            this.rbBloodline3.UseVisualStyleBackColor = true;\n            this.rbBloodline3.Click += new System.EventHandler(this.rbBloodline3_Click);\n            // \n            // rbBloodline2\n            // \n            this.rbBloodline2.AutoSize = true;\n            this.rbBloodline2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbBloodline2.Location = new System.Drawing.Point(3, 65);\n            this.rbBloodline2.Name = \"rbBloodline2\";\n            this.rbBloodline2.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.rbBloodline2.Size = new System.Drawing.Size(43, 56);\n            this.rbBloodline2.TabIndex = 4;\n            this.rbBloodline2.UseVisualStyleBackColor = true;\n            this.rbBloodline2.Click += new System.EventHandler(this.rbBloodline2_Click);\n            // \n            // pbBloodline3\n            // \n            this.pbBloodline3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbBloodline3.Image = ((System.Drawing.Image)(resources.GetObject(\"pbBloodline3.Image\")));\n            this.pbBloodline3.Location = new System.Drawing.Point(49, 124);\n            this.pbBloodline3.Margin = new System.Windows.Forms.Padding(0);\n            this.pbBloodline3.Name = \"pbBloodline3\";\n            this.pbBloodline3.Size = new System.Drawing.Size(93, 63);\n            this.pbBloodline3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbBloodline3.TabIndex = 2;\n            this.pbBloodline3.TabStop = false;\n            // \n            // pbBloodline1\n            // \n            this.pbBloodline1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbBloodline1.Image = ((System.Drawing.Image)(resources.GetObject(\"pbBloodline1.Image\")));\n            this.pbBloodline1.Location = new System.Drawing.Point(49, 0);\n            this.pbBloodline1.Margin = new System.Windows.Forms.Padding(0);\n            this.pbBloodline1.Name = \"pbBloodline1\";\n            this.pbBloodline1.Padding = new System.Windows.Forms.Padding(0, 0, 0, 5);\n            this.pbBloodline1.Size = new System.Drawing.Size(93, 62);\n            this.pbBloodline1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbBloodline1.TabIndex = 0;\n            this.pbBloodline1.TabStop = false;\n            // \n            // pbBloodline2\n            // \n            this.pbBloodline2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbBloodline2.Image = ((System.Drawing.Image)(resources.GetObject(\"pbBloodline2.Image\")));\n            this.pbBloodline2.Location = new System.Drawing.Point(49, 62);\n            this.pbBloodline2.Margin = new System.Windows.Forms.Padding(0);\n            this.pbBloodline2.Name = \"pbBloodline2\";\n            this.pbBloodline2.Padding = new System.Windows.Forms.Padding(0, 0, 0, 5);\n            this.pbBloodline2.Size = new System.Drawing.Size(93, 62);\n            this.pbBloodline2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbBloodline2.TabIndex = 1;\n            this.pbBloodline2.TabStop = false;\n            // \n            // rbBloodline1\n            // \n            this.rbBloodline1.AutoSize = true;\n            this.rbBloodline1.Checked = true;\n            this.rbBloodline1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbBloodline1.Location = new System.Drawing.Point(3, 3);\n            this.rbBloodline1.Name = \"rbBloodline1\";\n            this.rbBloodline1.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.rbBloodline1.Size = new System.Drawing.Size(43, 56);\n            this.rbBloodline1.TabIndex = 3;\n            this.rbBloodline1.TabStop = true;\n            this.rbBloodline1.UseVisualStyleBackColor = true;\n            this.rbBloodline1.Click += new System.EventHandler(this.rbBloodline1_Click);\n            // \n            // gbAncestry\n            // \n            this.gbAncestry.Controls.Add(this.tlpAncestry);\n            this.gbAncestry.Location = new System.Drawing.Point(165, 156);\n            this.gbAncestry.Name = \"gbAncestry\";\n            this.gbAncestry.Size = new System.Drawing.Size(166, 212);\n            this.gbAncestry.TabIndex = 7;\n            this.gbAncestry.TabStop = false;\n            this.gbAncestry.Text = \"Ancestry\";\n            // \n            // tlpAncestry\n            // \n            this.tlpAncestry.ColumnCount = 2;\n            this.tlpAncestry.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F));\n            this.tlpAncestry.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 65F));\n            this.tlpAncestry.Controls.Add(this.lblAncestry1, 1, 1);\n            this.tlpAncestry.Controls.Add(this.rbAncestry2, 0, 2);\n            this.tlpAncestry.Controls.Add(this.pbAncestry1, 1, 0);\n            this.tlpAncestry.Controls.Add(this.rbAncestry1, 0, 0);\n            this.tlpAncestry.Controls.Add(this.rbAncestry3, 0, 4);\n            this.tlpAncestry.Controls.Add(this.lblAncestry3, 1, 5);\n            this.tlpAncestry.Controls.Add(this.lblAncestry2, 1, 3);\n            this.tlpAncestry.Controls.Add(this.pbAncestry2, 1, 2);\n            this.tlpAncestry.Controls.Add(this.pbAncestry3, 1, 4);\n            this.tlpAncestry.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tlpAncestry.Location = new System.Drawing.Point(3, 16);\n            this.tlpAncestry.Name = \"tlpAncestry\";\n            this.tlpAncestry.Padding = new System.Windows.Forms.Padding(0, 0, 0, 6);\n            this.tlpAncestry.RowCount = 6;\n            this.tlpAncestry.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 44F));\n            this.tlpAncestry.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.32972F));\n            this.tlpAncestry.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 44F));\n            this.tlpAncestry.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33514F));\n            this.tlpAncestry.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 44F));\n            this.tlpAncestry.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33514F));\n            this.tlpAncestry.Size = new System.Drawing.Size(160, 193);\n            this.tlpAncestry.TabIndex = 0;\n            // \n            // lblAncestry1\n            // \n            this.lblAncestry1.AutoSize = true;\n            this.lblAncestry1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblAncestry1.ImageIndex = 0;\n            this.lblAncestry1.Location = new System.Drawing.Point(56, 44);\n            this.lblAncestry1.Margin = new System.Windows.Forms.Padding(0);\n            this.lblAncestry1.Name = \"lblAncestry1\";\n            this.lblAncestry1.Size = new System.Drawing.Size(104, 18);\n            this.lblAncestry1.TabIndex = 8;\n            this.lblAncestry1.Text = \"Liberal Holders\";\n            this.lblAncestry1.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // rbAncestry2\n            // \n            this.rbAncestry2.AutoSize = true;\n            this.rbAncestry2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbAncestry2.Location = new System.Drawing.Point(3, 65);\n            this.rbAncestry2.Name = \"rbAncestry2\";\n            this.rbAncestry2.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.tlpAncestry.SetRowSpan(this.rbAncestry2, 2);\n            this.rbAncestry2.Size = new System.Drawing.Size(50, 56);\n            this.rbAncestry2.TabIndex = 5;\n            this.rbAncestry2.UseVisualStyleBackColor = true;\n            this.rbAncestry2.Click += new System.EventHandler(this.rbAncestry2_Click);\n            // \n            // pbAncestry1\n            // \n            this.pbAncestry1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbAncestry1.Location = new System.Drawing.Point(56, 0);\n            this.pbAncestry1.Margin = new System.Windows.Forms.Padding(0);\n            this.pbAncestry1.Name = \"pbAncestry1\";\n            this.pbAncestry1.Size = new System.Drawing.Size(104, 44);\n            this.pbAncestry1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbAncestry1.TabIndex = 2;\n            this.pbAncestry1.TabStop = false;\n            // \n            // rbAncestry1\n            // \n            this.rbAncestry1.AutoSize = true;\n            this.rbAncestry1.Checked = true;\n            this.rbAncestry1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbAncestry1.Location = new System.Drawing.Point(3, 3);\n            this.rbAncestry1.Name = \"rbAncestry1\";\n            this.rbAncestry1.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.tlpAncestry.SetRowSpan(this.rbAncestry1, 2);\n            this.rbAncestry1.Size = new System.Drawing.Size(50, 56);\n            this.rbAncestry1.TabIndex = 4;\n            this.rbAncestry1.TabStop = true;\n            this.rbAncestry1.UseVisualStyleBackColor = true;\n            this.rbAncestry1.Click += new System.EventHandler(this.rbAncestry1_Click);\n            // \n            // rbAncestry3\n            // \n            this.rbAncestry3.AutoSize = true;\n            this.rbAncestry3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rbAncestry3.Location = new System.Drawing.Point(3, 127);\n            this.rbAncestry3.Name = \"rbAncestry3\";\n            this.rbAncestry3.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.tlpAncestry.SetRowSpan(this.rbAncestry3, 2);\n            this.rbAncestry3.Size = new System.Drawing.Size(50, 57);\n            this.rbAncestry3.TabIndex = 6;\n            this.rbAncestry3.UseVisualStyleBackColor = true;\n            this.rbAncestry3.Click += new System.EventHandler(this.rbAncestry3_Click);\n            // \n            // lblAncestry3\n            // \n            this.lblAncestry3.AutoSize = true;\n            this.lblAncestry3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblAncestry3.ImageIndex = 2;\n            this.lblAncestry3.Location = new System.Drawing.Point(56, 168);\n            this.lblAncestry3.Margin = new System.Windows.Forms.Padding(0);\n            this.lblAncestry3.Name = \"lblAncestry3\";\n            this.lblAncestry3.Size = new System.Drawing.Size(104, 19);\n            this.lblAncestry3.TabIndex = 9;\n            this.lblAncestry3.Text = \"Religious Reclaimers\";\n            this.lblAncestry3.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // lblAncestry2\n            // \n            this.lblAncestry2.AutoSize = true;\n            this.lblAncestry2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblAncestry2.ImageIndex = 1;\n            this.lblAncestry2.Location = new System.Drawing.Point(56, 106);\n            this.lblAncestry2.Margin = new System.Windows.Forms.Padding(0);\n            this.lblAncestry2.Name = \"lblAncestry2\";\n            this.lblAncestry2.Size = new System.Drawing.Size(104, 18);\n            this.lblAncestry2.TabIndex = 7;\n            this.lblAncestry2.Text = \"Weathy Commoners\";\n            this.lblAncestry2.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // pbAncestry2\n            // \n            this.pbAncestry2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbAncestry2.Location = new System.Drawing.Point(59, 65);\n            this.pbAncestry2.Name = \"pbAncestry2\";\n            this.pbAncestry2.Size = new System.Drawing.Size(98, 38);\n            this.pbAncestry2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbAncestry2.TabIndex = 10;\n            this.pbAncestry2.TabStop = false;\n            // \n            // pbAncestry3\n            // \n            this.pbAncestry3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbAncestry3.Location = new System.Drawing.Point(59, 127);\n            this.pbAncestry3.Name = \"pbAncestry3\";\n            this.pbAncestry3.Size = new System.Drawing.Size(98, 38);\n            this.pbAncestry3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbAncestry3.TabIndex = 11;\n            this.pbAncestry3.TabStop = false;\n            // \n            // ilAncestry\n            // \n            this.ilAncestry.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilAncestry.ImageStream\")));\n            this.ilAncestry.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilAncestry.Images.SetKeyName(0, \"Liberal.png\");\n            this.ilAncestry.Images.SetKeyName(1, \"Wealthy.png\");\n            this.ilAncestry.Images.SetKeyName(2, \"Religious.png\");\n            this.ilAncestry.Images.SetKeyName(3, \"Free.png\");\n            this.ilAncestry.Images.SetKeyName(4, \"Border.png\");\n            this.ilAncestry.Images.SetKeyName(5, \"Navy.png\");\n            this.ilAncestry.Images.SetKeyName(6, \"Cyber.png\");\n            this.ilAncestry.Images.SetKeyName(7, \"Unionists.png\");\n            this.ilAncestry.Images.SetKeyName(8, \"Zealots.png\");\n            this.ilAncestry.Images.SetKeyName(9, \"Merchandisers.png\");\n            this.ilAncestry.Images.SetKeyName(10, \"Scientists.png\");\n            this.ilAncestry.Images.SetKeyName(11, \"Tube.png\");\n            this.ilAncestry.Images.SetKeyName(12, \"Entrepreneurs.png\");\n            this.ilAncestry.Images.SetKeyName(13, \"Mercs.png\");\n            this.ilAncestry.Images.SetKeyName(14, \"Dissenters.png\");\n            this.ilAncestry.Images.SetKeyName(15, \"Inventors.png\");\n            this.ilAncestry.Images.SetKeyName(16, \"Monks.png\");\n            this.ilAncestry.Images.SetKeyName(17, \"Stargazers.png\");\n            this.ilAncestry.Images.SetKeyName(18, \"Activists.png\");\n            this.ilAncestry.Images.SetKeyName(19, \"Miners.png\");\n            this.ilAncestry.Images.SetKeyName(20, \"Immigrants.png\");\n            this.ilAncestry.Images.SetKeyName(21, \"Artists.png\");\n            this.ilAncestry.Images.SetKeyName(22, \"Diplomats.png\");\n            this.ilAncestry.Images.SetKeyName(23, \"Reborn.png\");\n            this.ilAncestry.Images.SetKeyName(24, \"Sang.png\");\n            this.ilAncestry.Images.SetKeyName(25, \"Saan.png\");\n            this.ilAncestry.Images.SetKeyName(26, \"Jing.png\");\n            this.ilAncestry.Images.SetKeyName(27, \"Tinkerers.png\");\n            this.ilAncestry.Images.SetKeyName(28, \"Traders.png\");\n            this.ilAncestry.Images.SetKeyName(29, \"Rebels.png\");\n            this.ilAncestry.Images.SetKeyName(30, \"Workers.png\");\n            this.ilAncestry.Images.SetKeyName(31, \"Tribal.png\");\n            this.ilAncestry.Images.SetKeyName(32, \"Slave.png\");\n            this.ilAncestry.Images.SetKeyName(33, \"Drifters.png\");\n            this.ilAncestry.Images.SetKeyName(34, \"Mystics.png\");\n            this.ilAncestry.Images.SetKeyName(35, \"Retailers.png\");\n            // \n            // gbGender\n            // \n            this.gbGender.Controls.Add(this.tlpGender);\n            this.gbGender.Location = new System.Drawing.Point(337, 156);\n            this.gbGender.Name = \"gbGender\";\n            this.gbGender.Size = new System.Drawing.Size(146, 212);\n            this.gbGender.TabIndex = 8;\n            this.gbGender.TabStop = false;\n            this.gbGender.Text = \"Gender\";\n            // \n            // gbCharacterName\n            // \n            this.gbCharacterName.Controls.Add(this.tbCharacterName);\n            this.gbCharacterName.Location = new System.Drawing.Point(135, 371);\n            this.gbCharacterName.Name = \"gbCharacterName\";\n            this.gbCharacterName.Padding = new System.Windows.Forms.Padding(13, 3, 13, 3);\n            this.gbCharacterName.Size = new System.Drawing.Size(226, 46);\n            this.gbCharacterName.TabIndex = 9;\n            this.gbCharacterName.TabStop = false;\n            this.gbCharacterName.Text = \"Blank Character Name\";\n            // \n            // ilBloodline\n            // \n            this.ilBloodline.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilBloodline.ImageStream\")));\n            this.ilBloodline.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilBloodline.Images.SetKeyName(0, \"amarr.png\");\n            this.ilBloodline.Images.SetKeyName(1, \"ni-kunni.png\");\n            this.ilBloodline.Images.SetKeyName(2, \"khanid.png\");\n            this.ilBloodline.Images.SetKeyName(3, \"deteis.png\");\n            this.ilBloodline.Images.SetKeyName(4, \"civire.png\");\n            this.ilBloodline.Images.SetKeyName(5, \"achura.png\");\n            this.ilBloodline.Images.SetKeyName(6, \"gallente.png\");\n            this.ilBloodline.Images.SetKeyName(7, \"intaki.png\");\n            this.ilBloodline.Images.SetKeyName(8, \"jin-mei.png\");\n            this.ilBloodline.Images.SetKeyName(9, \"sebiestor.png\");\n            this.ilBloodline.Images.SetKeyName(10, \"brutor.png\");\n            this.ilBloodline.Images.SetKeyName(11, \"verokhior.png\");\n            // \n            // tlpGender\n            // \n            this.tlpGender.ColumnCount = 2;\n            this.tlpGender.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F));\n            this.tlpGender.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 65F));\n            this.tlpGender.Controls.Add(this.rbFemale, 0, 0);\n            this.tlpGender.Controls.Add(this.pbFemale, 1, 0);\n            this.tlpGender.Controls.Add(this.rbMale, 0, 2);\n            this.tlpGender.Controls.Add(this.pbMale, 1, 2);\n            this.tlpGender.Controls.Add(this.lblFemale, 1, 1);\n            this.tlpGender.Controls.Add(this.lblMale, 1, 3);\n            this.tlpGender.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tlpGender.Location = new System.Drawing.Point(3, 16);\n            this.tlpGender.Name = \"tlpGender\";\n            this.tlpGender.RowCount = 4;\n            this.tlpGender.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpGender.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tlpGender.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpGender.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tlpGender.Size = new System.Drawing.Size(140, 193);\n            this.tlpGender.TabIndex = 2;\n            // \n            // pbFemale\n            // \n            this.pbFemale.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbFemale.Image = ((System.Drawing.Image)(resources.GetObject(\"pbFemale.Image\")));\n            this.pbFemale.Location = new System.Drawing.Point(52, 3);\n            this.pbFemale.Name = \"pbFemale\";\n            this.pbFemale.Size = new System.Drawing.Size(85, 74);\n            this.pbFemale.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbFemale.TabIndex = 2;\n            this.pbFemale.TabStop = false;\n            // \n            // pbMale\n            // \n            this.pbMale.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbMale.Image = ((System.Drawing.Image)(resources.GetObject(\"pbMale.Image\")));\n            this.pbMale.Location = new System.Drawing.Point(52, 103);\n            this.pbMale.Name = \"pbMale\";\n            this.pbMale.Size = new System.Drawing.Size(85, 66);\n            this.pbMale.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbMale.TabIndex = 3;\n            this.pbMale.TabStop = false;\n            // \n            // lblFemale\n            // \n            this.lblFemale.AutoSize = true;\n            this.lblFemale.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblFemale.Location = new System.Drawing.Point(52, 80);\n            this.lblFemale.Name = \"lblFemale\";\n            this.lblFemale.Size = new System.Drawing.Size(85, 20);\n            this.lblFemale.TabIndex = 4;\n            this.lblFemale.Text = \"Female\";\n            this.lblFemale.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // lblMale\n            // \n            this.lblMale.AutoSize = true;\n            this.lblMale.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblMale.Location = new System.Drawing.Point(52, 172);\n            this.lblMale.Name = \"lblMale\";\n            this.lblMale.Size = new System.Drawing.Size(85, 21);\n            this.lblMale.TabIndex = 5;\n            this.lblMale.Text = \"Male\";\n            this.lblMale.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // BlankCharacterControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.Color.Transparent;\n            this.Controls.Add(this.gbCharacterName);\n            this.Controls.Add(this.gbGender);\n            this.Controls.Add(this.gbAncestry);\n            this.Controls.Add(this.gbBloodline);\n            this.Controls.Add(this.gbRace);\n            this.Name = \"BlankCharacterControl\";\n            this.Size = new System.Drawing.Size(497, 425);\n            this.Load += new System.EventHandler(this.BlankCharacterControl_Load);\n            this.gbRace.ResumeLayout(false);\n            this.tlpRaces.ResumeLayout(false);\n            this.tlpRaces.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAmarr)).EndInit();\n            this.gbBloodline.ResumeLayout(false);\n            this.tlpBloodline.ResumeLayout(false);\n            this.tlpBloodline.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbBloodline3)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbBloodline1)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbBloodline2)).EndInit();\n            this.gbAncestry.ResumeLayout(false);\n            this.tlpAncestry.ResumeLayout(false);\n            this.tlpAncestry.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAncestry1)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAncestry2)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbAncestry3)).EndInit();\n            this.gbGender.ResumeLayout(false);\n            this.gbCharacterName.ResumeLayout(false);\n            this.gbCharacterName.PerformLayout();\n            this.tlpGender.ResumeLayout(false);\n            this.tlpGender.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbFemale)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbMale)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.GroupBox gbRace;\n        private System.Windows.Forms.RadioButton rbAmarr;\n        private System.Windows.Forms.GroupBox gbBloodline;\n        private System.Windows.Forms.GroupBox gbAncestry;\n        private System.Windows.Forms.GroupBox gbGender;\n        private System.Windows.Forms.GroupBox gbCharacterName;\n        private System.Windows.Forms.RadioButton rbCaldari;\n        private System.Windows.Forms.ImageList ilBloodline;\n        private System.Windows.Forms.TableLayoutPanel tlpRaces;\n        private System.Windows.Forms.RadioButton rbGallente;\n        private System.Windows.Forms.RadioButton rbMinmatar;\n        private System.Windows.Forms.PictureBox pbAmarr;\n        private System.Windows.Forms.PictureBox pictureBox3;\n        private System.Windows.Forms.PictureBox pictureBox2;\n        private System.Windows.Forms.PictureBox pictureBox1;\n        private System.Windows.Forms.RadioButton rbFemale;\n        private System.Windows.Forms.RadioButton rbMale;\n        private System.Windows.Forms.PictureBox pbBloodline1;\n        private System.Windows.Forms.PictureBox pbBloodline2;\n        private System.Windows.Forms.PictureBox pbBloodline3;\n        private System.Windows.Forms.TableLayoutPanel tlpAncestry;\n        private System.Windows.Forms.TableLayoutPanel tlpBloodline;\n        private System.Windows.Forms.RadioButton rbBloodline3;\n        private System.Windows.Forms.RadioButton rbBloodline2;\n        private System.Windows.Forms.RadioButton rbBloodline1;\n        private System.Windows.Forms.RadioButton rbAncestry1;\n        private System.Windows.Forms.RadioButton rbAncestry2;\n        private System.Windows.Forms.RadioButton rbAncestry3;\n        private System.Windows.Forms.Label lblAncestry2;\n        private System.Windows.Forms.ImageList ilAncestry;\n        private System.Windows.Forms.Label lblAncestry1;\n        private System.Windows.Forms.Label lblAncestry3;\n        private System.Windows.Forms.PictureBox pbAncestry1;\n        private System.Windows.Forms.PictureBox pbAncestry2;\n        private System.Windows.Forms.PictureBox pbAncestry3;\n        private System.Windows.Forms.TextBox tbCharacterName;\n        private System.Windows.Forms.TableLayoutPanel tlpGender;\n        private System.Windows.Forms.PictureBox pbFemale;\n        private System.Windows.Forms.PictureBox pbMale;\n        private System.Windows.Forms.Label lblFemale;\n        private System.Windows.Forms.Label lblMale;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/BlankCharacterControl.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.BlankCharacter\n{\n    public partial class BlankCharacterControl : UserControl\n    {\n        private Font m_amarrFont;\n        private Font m_caldariFont;\n        private Font m_gallenteFont;\n        private Font m_minmatarFont;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BlankCharacterControl\"/> class.\n        /// </summary>\n        public BlankCharacterControl()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Handles the Load event of the BlankCharacterControl.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void BlankCharacterControl_Load(object sender, EventArgs e)\n        {\n            ForeColor = SystemColors.GrayText;\n\n            m_amarrFont = FontFactory.GetFont(\"Niagara Solid\", 10f);\n            m_caldariFont = FontFactory.GetFont(\"Impact\", 8.25f);\n            m_gallenteFont = FontFactory.GetFont(\"Arial Rounded MT Bold\", 8.25f);\n            m_minmatarFont = FontFactory.GetFont(\"Moolboran\", 9f);\n\n            BlankCharacterUIHelper.Race = Race.Amarr;\n\n            UpdateBloodlineControl();\n        }\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Updates the bloodline controls.\n        /// </summary>\n        private void UpdateBloodlineControl()\n        {\n            int index = 0;\n\n            switch (BlankCharacterUIHelper.Race)\n            {\n                case Race.Amarr:\n                    lblAncestry1.Font = lblAncestry2.Font = lblAncestry3.Font = m_amarrFont;\n                    break;\n                case Race.Caldari:\n                    index = 3;\n                    lblAncestry1.Font = lblAncestry2.Font = lblAncestry3.Font = m_caldariFont;\n                    break;\n                case Race.Gallente:\n                    index = 6;\n                    lblAncestry1.Font = lblAncestry2.Font = lblAncestry3.Font = m_gallenteFont;\n                    break;\n                case Race.Minmatar:\n                    index = 9;\n                    lblAncestry1.Font = lblAncestry2.Font = lblAncestry3.Font = m_minmatarFont;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n\n            pbBloodline1.Image = ilBloodline.Images[index];\n            pbBloodline2.Image = ilBloodline.Images[index + 1];\n            pbBloodline3.Image = ilBloodline.Images[index + 2];\n            pbBloodline1.Tag = (Bloodline)Enum.ToObject(typeof(Bloodline), index);\n            pbBloodline2.Tag = (Bloodline)Enum.ToObject(typeof(Bloodline), index + 1);\n            pbBloodline3.Tag = (Bloodline)Enum.ToObject(typeof(Bloodline), index + 2);\n\n            if (rbBloodline1.Checked)\n                BlankCharacterUIHelper.Bloodline = (Bloodline)pbBloodline1.Tag;\n            if (rbBloodline2.Checked)\n                BlankCharacterUIHelper.Bloodline = (Bloodline)pbBloodline2.Tag;\n            if (rbBloodline3.Checked)\n                BlankCharacterUIHelper.Bloodline = (Bloodline)pbBloodline3.Tag;\n\n            UpdateAncestryControl();\n        }\n\n        /// <summary>\n        /// Updates the ancestry controls.\n        /// </summary>\n        private void UpdateAncestryControl()\n        {\n            int index = 0;\n\n            switch (BlankCharacterUIHelper.Bloodline)\n            {\n                case Bloodline.Amarr:\n                    break;\n                case Bloodline.Ni_Kunni:\n                    index = 3;\n                    break;\n                case Bloodline.Khanid:\n                    index = 6;\n                    break;\n                case Bloodline.Deteis:\n                    index = 9;\n                    break;\n                case Bloodline.Civire:\n                    index = 12;\n                    break;\n                case Bloodline.Achura:\n                    index = 15;\n                    break;\n                case Bloodline.Gallente:\n                    index = 18;\n                    break;\n                case Bloodline.Intaki:\n                    index = 21;\n                    break;\n                case Bloodline.Jin_Mei:\n                    index = 24;\n                    break;\n                case Bloodline.Sebiestor:\n                    index = 27;\n                    break;\n                case Bloodline.Brutor:\n                    index = 30;\n                    break;\n                case Bloodline.Vherokior:\n                    index = 33;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n\n            pbAncestry1.Image = ilAncestry.Images[index];\n            pbAncestry2.Image = ilAncestry.Images[index + 1];\n            pbAncestry3.Image = ilAncestry.Images[index + 2];\n            lblAncestry1.Text =\n                ((Ancestry)Enum.ToObject(typeof(Ancestry), index)).ToString().ToUpper(CultureConstants.DefaultCulture).Replace(\n                    \"_\", \" \");\n            lblAncestry2.Text =\n                ((Ancestry)Enum.ToObject(typeof(Ancestry), index + 1)).ToString().ToUpper(CultureConstants.DefaultCulture).Replace\n                    (\"_\", \" \");\n            lblAncestry3.Text =\n                ((Ancestry)Enum.ToObject(typeof(Ancestry), index + 2)).ToString().ToUpper(CultureConstants.DefaultCulture).Replace\n                    (\"_\", \" \");\n            lblAncestry1.Tag = (Ancestry)Enum.ToObject(typeof(Ancestry), index);\n            lblAncestry2.Tag = (Ancestry)Enum.ToObject(typeof(Ancestry), index + 1);\n            lblAncestry3.Tag = (Ancestry)Enum.ToObject(typeof(Ancestry), index + 2);\n\n            if (rbAncestry1.Checked)\n                BlankCharacterUIHelper.Ancestry = (Ancestry)lblAncestry1.Tag;\n            if (rbAncestry2.Checked)\n                BlankCharacterUIHelper.Ancestry = (Ancestry)lblAncestry2.Tag;\n            if (rbAncestry3.Checked)\n                BlankCharacterUIHelper.Ancestry = (Ancestry)lblAncestry3.Tag;\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// Handles the Click event of the rbAmarr control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbAmarr_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Race = Race.Amarr;\n            UpdateBloodlineControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbCaldari control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbCaldari_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Race = Race.Caldari;\n            UpdateBloodlineControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbGallente control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbGallente_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Race = Race.Gallente;\n            UpdateBloodlineControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbMinmatar control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbMinmatar_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Race = Race.Minmatar;\n            UpdateBloodlineControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbBloodline1 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbBloodline1_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Bloodline = (Bloodline)pbBloodline1.Tag;\n            UpdateAncestryControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbBloodline2 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbBloodline2_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Bloodline = (Bloodline)pbBloodline2.Tag;\n            UpdateAncestryControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbBloodline3 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbBloodline3_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Bloodline = (Bloodline)pbBloodline3.Tag;\n            UpdateAncestryControl();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbAncestry1 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbAncestry1_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Ancestry = (Ancestry)lblAncestry1.Tag;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbAncestry2 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbAncestry2_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Ancestry = (Ancestry)lblAncestry2.Tag;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbAncestry3 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbAncestry3_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Ancestry = (Ancestry)lblAncestry3.Tag;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbFemale control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbFemale_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Gender = Gender.Female;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the rbMale control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbMale_Click(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.Gender = Gender.Male;\n        }\n\n        /// <summary>\n        /// Handles the TextChanged event of the tbCharacterName control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tbCharacterName_TextChanged(object sender, EventArgs e)\n        {\n            BlankCharacterUIHelper.CharacterName = tbCharacterName.Text;\n        }\n\n        #endregion\n\n    }\n}"
  },
  {
    "path": "src/EVEMon/BlankCharacterControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"pbFemale.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABF+SURBVHhe7VppVFXn1W4SkxhNG02CcxKNEQETBxRQEJxQEUEIKIMQQURFRKbLlVFmRIYLgggo\n        k0iCgiDOQRyj0Zg44lCNQ/rVxtQk/VwrJqv/yu7z3J6T3o/qt9ImDOnyXetZh3u455x3P3vvZ+/3Pfc3\n        v3kynjDwhIEnDDxh4Ocz8NQjxs+/66/gDu3tfloZ7c//Ckz596eoGqka/Uy70Z6Mf/8J3fgKQ+Np93MY\n        zxsMfn4Wg/+bMmXKtKioqNjKqsq64yc+av395zce/OHLu3+7dO3Kg+bDLa3FpaV1IaGrYiwsLad0Y5P/\n        OTVD43tg0O4XMHpjvIjxW4x+GEuWLFm6o6Fh31df32+7fueWfNp6QQ6fPil7jrbIjua9Urd/t9R/uEd2\n        HW6WgyePy8mzZ9oKizfucZrn7N+zZ8/e3ZYMEsDwVj1P43+H0RfjFQw3Nzf37XV1O7/5y1/kxu1bcuLs\n        GWlq+VC2NG6Xktpqya/aLDnlJZK1eaMeuRUlUlhdLqX4X82uBtl37JAkpaXWmY83n9ktSVAJYIjDUz3p\n        8Zcx+mNotdrVV69d/eLe/T9L641rcvDEUSmr3Srp+TmiSU6Q4NWRsiQsRJZGrJLg6EgJT4yVmKw0SSvK\n        l4ySAhBSJAXVZVIFskqrK2/OnuOwvFuRoIa/6v1eGC9hMOSTU5JTv/766x++vP+VXIbxTQf2SX5JkWji\n        Yx/OW+C+09zSInzwa6/Z9erduz+DiMfBrw2xHTPBPMzFc35DTEbKd5mlG/RErNu0QTbUVErF9vcfOjrP\n        1XQbEtoTwLzvg6HRaLT3Yfyf/vyVnL/SKjt275LcDevFa5HvNrNRo5wpikwb9fpHGTR8xFuz3H28qrNJ\n        QvF6Sd+YLzllxVJQsemh3dQp3SMSHhUBLi4urpevXLlD489dviT1u5okLSvznqOT0xoERx9Gyf9DwFMg\n        QwUJ6jHN3j4yNS/77joQkVqYJzzGZ6TcNDYxmdUtIkHVAFaAVzFqt21rvAvjL1y9KnVNO/XG28+eFUZB\n        pDhSJ6gXSgQ8rRjMY3s8g3M9CNspU5boSjfezSotkpSCXMksKRRvv0X1IPK3ynUkrWuGYRVYHBAQeP/b\n        b2D8Zanf3STZ+Xni4DgngRWBxqveh2b0YOHAtTSShvP4LPAc8DzwgoJeOOrh7OoSXVVfK2s3rpekvCxJ\n        0WXLWPNxAe2I63wiDPuAuh31e69+fl32HDoo2QXrZYG3Zy3sfon9AMsjWgR6n/nfg8YDNJigwaz1vwP6\n        AC8DrwJGQD8C3+2vjYvdXlxTJcn52ZKoyxI3b8/9+F9PhTyVTDWqOi8iSAI7vLtf3Ws7/PFHUlS+WUI0\n        4d+NNDVxYsizOWJziCxRjX8Ol3DiNPolxeD+OA4GXgeGAW8CbwEjFAy3tLLy+2Bnw/dZSIH47AyJTIxr\n        e33oG874P1OBJDKK1FTq3GjQRGliL1//vdTuboRIpYqji3MjdQGDLbAe8PyzMPx54EXF0/TuEMXYkTiO\n        AsYA5sB4wLIdLNZmrzu8Gb1EUm4mCZDxlpbr8J0BCokklBFF7ejcSCivqKg7cea0FG2pkGBtpIwePy6c\n        ec5wV0KeXu8N0OM0nJ42Bt5WjLXC0QawBewegak4N8V/8eINDQf2SlqhTiKT18i02TNbcN4EeEO5L9OI\n        OtK5JBw5drR1d0uzZBUXiN+KZTJw8GA7Jc+Z6/Q6vcPcZpjT8NEAjabBNG66Av5NAnhehUrI9IkTJ4Yf\n        QZrloCJo05PFab7bHXzPGmDkMGUYDSoJqi50fDq0Xrv6oLapAaG5TjwD/OSFXr04EYYhQ5IhT0EbCjDM\n        aTgNZX/Pes7jNMXgiThOAJgGNIpEjVU+Wxr1M3L+9OJ5NESbJTojReb7+nyP/80BSKAFQHIHAtQFPpsk\n        dDwBN+/c/ltFbY3EZaaKFwhgE9POeIoaDZmsGO2oTJzG08PMdxpsCtCTFEKmiQpeb4x0Gn3lxnUp2Vop\n        0YgAr8WL2nDeDZgH2Cv34fVMM0adKowdS8LZC+cecFLa1ERZGLiYEUBxYw1nOePk6VF6ea4yWR45YeY9\n        DafnaCy9x8kzXfoo6IvjKzyPMfbGrZuyqWaLRGFB9e5CT0YACfAA3gVmKM8aqtyD1abjo2Dv/n2tpVur\n        MKk14he8XAYMHMiJ0AiKE41niNJL7oALwNCfBFAEOVmWQRrK0CVxnDhBQeNR3ytY29g4XL/1uZS/v1Ui\n        E+LEwWXebZx3AjwBb8AVYESZAUxDwyjAxw4ahUUb6iq3fSCrU5IkEEtc03feXo1HUfDeAaYqE+Mk5wMM\n        fwoXJ0mv07vUCbWWqwpu2B7ru8Xg4OBI6I2Uf7BVQmO0Yjd9GqsAI4n3fQ/wAqgJ1BGSz6pDLeC9Om6s\n        CA6O2b6rUWIhTFzb2zs67MXT2MTQUHp+oQJXHLndRc+/BjBK6HF1koaNzP9ZHNGI6pqaxs8unJcypMAK\n        7COMHjc2V3kGo4oEEEwFag2fT3I7Pg0mWFhM2dvS3JaUnSkrY6IkMHTlw6HDhq3Aw2cD9IofwBB1ANjk\n        UORU4w09/lixsre3n33rzu3vjp/6WHQbN0jAiuVtgwYPYu7T24wqX8BfeR5TjhFGPSHBHa8DWbm5e3OK\n        CyUkNgokaNANOh1ANWDOLwa4cFkA0PucGHP+J6s0V49lZWXVt//whew/1CyJ6DZnz3U8gHsMAiiiDHsS\n        wOcw2qgxjDLqAAkgyR1aCZ6aM3duwJbttaJNTpQgbYRepGxsbWvw4GXAEoBqzR6A3qfgUeB+UssaGhYa\n        8c2338q5SxelrLpKwqI0YmJmxo0REjAWYAQw/AMVIjqfAKx7XtLGxjSmY6m6Au0wSQiL0f7vJBtrkkDP\n        UAsYrhQ+dmtqjcafjx9+fn6Lr1y7ehdb6LL7wH5JycwQByfHHVhZ0rvUEVYZLoqYZiTAB2AV6tQUYHj1\n        GDN2rPO6vJwvolMSZVlEqITGaiUhLeWBw1zHOqQDhYqTZY/Acqfm/iOtZ9iHhoZGtF6+fJe1/9CxI5Jb\n        kC/+SwJuYhXIPoICNxyg0DK6SPJSgLrAUsjeonNEEA/SEwC8ON1+xurM/NwfwuKjZWlkqITHx0juxkIJ\n        00Qcs7C0WIXvqBHw2PIEwZtVuqm0+k/3vpQLrZdkH9YZOdhjCAoNefj26NErcQ9GEMOfrTLLIPOe3qfe\n        uAJMtaFAH6Djy6ABARS2gfazZunWZKT+NTwuWlZowoTHtfm5Ura16oeUjLTmRX6L4qysrOyNjIwGcbWI\n        Dm+AtbW1bVBQUFhFVWXD5WtXvzvfelGajxySSjQ9iempEhi0/CF2gdhfsGegutPD9D4N9gfofYY/Kw+J\n        IUHqmqBj+wCFAJYaNjOc3CjkfsEqTfh9bVKCPhUiE2Jkzdo0ySsukpq6bbIfXj1x+pRe2C5h95jHk5+c\n        lg8Pt8i2xgYpqSyH2qdJcESYuHkuuGk6yiwE96XnWUFY47l+oPjRaNX77AHYXnM9wDacPUCHVwA8Qz/I\n        MpWd9Z0TtBthbJwx38vjfAxa5BhUB21SvETjmAAiUtAzpOtyJDNfJ5nrdfg7W5Ky1kpCeoqERmvEL2ip\n        LPD1Fms724ZBQ4ZQQHlfepWbJwxx9hTsMZj7BP9mOqjeJ1mdEv6GBPCBfDCFTq/O2A4LhjjWunt4XNXG\n        x7ZFIh0YFZo1cWhno/QpEhASJN5YRbrD4Hke7uLgOq/N0mbigaFvDluBXSUqPQ3nooqtNcOenqfB/orx\n        1AD2AlwSD1XI6vgOULVcOapCqK4CmaNUY6pyEBDxxrBhhVaTJjZ4+nifjk9L/j4KJCxHtXDxXCA206fe\n        Gz3efM9bI43XvtrPiA0UDacxvI+6gUIPuwI0mF6n6LHDJCGMCkYe9x4M2+sObYAMOeCDmAZqFKgqzTU/\n        J8zWOAwIRUkMCtNEnsopXC/hWNS4eXvIoCGDE/E/tsmMHII9AzdISCIbG6YByVykGM4jP9Pz1AMSRf2h\n        SKqh32nGq0TwgRRDhh+7vddhrDkwC/CC4i8HVmGTNDwnJ+ezbQ07JD41WTwW+QhqeyG+z3pOIWPP4Kp8\n        ppEkkAb7K0d+5nfZ8JAodROExlOHOr73Vy1ud1SjgDvA3AR9BQYPg8Hj0LnNhB54AAHYKQ8uLik5t+9D\n        dnbp4unnI8j3rfi+PkIA1nq20FR3hnp7wymAVHumBltrep4luEuNV7nQk8AXHzD+RYhYPxj8Jt4MmeNF\n        yXTABfApKy8/c6DloKRC+T39fAX60IhrknEtUyFGIYIk0PPcS2AKMBVo+DiAIc80a7+k7vSw/5dggCHs\n        ZPlegG+E+uJnA0PwswETND4T8NOBqcDc8vLykwcONkvKugzxX75URow03oXr1gHpCgEUTio9214ubyly\n        httnFDs2OurboZ+0sPqXyf7SJ4YPHz4CP4kJ8vf3D8Jx1dJly8KxkxONvn5NZGRkGl6fr8NRt2nz5mM7\n        9+7WNztBqATYRWqaPtO+eYGHxz4fH596H1/fCqAAyPL19U1xc3dLwOt1EqJun1Hp1UanexiPCT3l4eHh\n        8z9//KN8eu6sfPzJKTlz9jM5f/GCtF5uldYrV+QSjmexq3P46BEpLS+TqLgYCcA+4tJVwZKO5qi69n2p\n        b2qUhl07f8QOfN5UUS7u+HEFnsEOj72GWurU/f9f2pf/0f2ednN39z156pQUl23GG+J8yS/aoDe0onqL\n        VL1fg2O1lMIY3YZCiUVXuDRkpXj7+8n893zkvcAACQwJlmWrQhSsxHElvhMsvgGLxcp60m7MiospRgH3\n        +7qk3j+OGb34OcyZs6gGhkasjpLFywJl2coVEhIRLuH4rImJlkhAi82SiJjVsjx0pfgE+IuTu6vMcJwt\n        9k5z/oG5/8AMR4cfgddg8s7YMc0GOkABJAlcf3RZ2TMkQ98DQAPsXN3ctkyysdlmPmHCTrzA3G9lbd0y\n        2c72KH7ectxu6tSPZjnOOen8rutZ/6Bl4rbQW2xnzhCj/v2ODB9pfN3Y1PTKSDPT88Zmpp8AJ4zNTI7h\n        8xGTUWaH0CsU4Rlc7XFLnWsCRoLhiq9LK4DaCrMe88dPZnxzjmrgjmoQgD4gGBUhHDtHGkDrFxhwKSw6\n        Stx8vGTyjGliNKD/SVxXDWwCsoEEQAOofQGrAltfNkYsh6wI3Ho33PruPgRgYiRgKjdGQYI/mqEgIAQI\n        AzSJSUkXs/JyxXPRe2I7fRpepgwgAVsAenktEAdEANxECQbYE/gDfAfADvBRq74uJ4C5qC6GuHpjT88a\n        7gwi5gOewELAPyc357MC7A14QPysp9nJgEGDjuN7JYrxUThyg0N92cEdZS6QuPfHBRF7f26HqR1gp635\n        8czHDsPFEPOSkyMJ3J4mEZw0c5evvWfq8vJOkACu+SdNtSUBLTjP0Kfx3OLmCo/b6Fz+sgni9bwP78f7\n        Gr4K7zZ9ACfCKGBPThK4KcmJcn+A5Yt9O1vYcbo83eH1eMGB3wOKld1k6T9oIH/zswZg70+h48qQQkdj\n        hyrX8z58gar2AoaNEE53/VCjgCRwSar+AIpksHnpA+gjQ6fTNecXFcq7Xh5iaWsj/QcObML5SIA5To/T\n        cH6Xq0peS/A+FFnel/dXm6Auzf32tHMyhkQwPwm+B2Bk6Hd0c3W6A7rCAj0BFpOtSUA9zvNlB9f33Pmh\n        p9W1Pa8leB/VaDXsu5XxjyNDJYQGUCT7JyQk7E9MS5E5rs5iYTOJr9RZArnO5wYI1/dc5Rm+PVKJVY/t\n        n9XtP6skMHyNbG1t42bY2+99e8zow8amJsf7vtw3CecpfBQ6bocxUn7S26Nub7kyQcMq0QfnKIpc17NM\n        Muy5daaWN4pct2lxf0mCmbdqGrBC8EcMZgCbGv6AShW+Lt3X+yUNbn8vwyhQfzpHpafgsa9n3v/XGq+S\n        8eO+IU6wjlMUSYa6wWH4y65urfA/J1JUEtTG6VHl7efc/1dzbfvS1mUe/zsjbgAS4K8BawAAAABJRU5E\n        rkJggg==\n</value>\n  </data>\n  <data name=\"pbMale.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABM6SURBVHhe7Vp5WNVl2p6ayj2XFDW1DJdSc2MTRRAVkR0UNHaOssp2WAVkFxJUFEVERAUVFcmt\n        0nHNJZfEFCttc0YrU9umz8n65vrmD/T57vvMeZvz8UkBOZNeF7/ruq/f4T2/5X3u536W9z384Q9tRxsD\n        bQy0MdDGQBsDbQy0MfCQMNAHR1JycmpcfHyqNi6uVYiN06ZqNJpUa2tr/4fErOZPw8TExPS7//peLn36\n        sdS9Xy/vXDwv77x3Qc7+jHp8Ji7oxs/ge+J0/bs6nLpwTk6dr5Pte3aJi5tbQfPf/JBcOXbsWNMrn1+T\n        1w8fkMqdNbJhxzbdeeOuWtm0+7Wfwb+rdm7Xfbce16yr3SJrt1fL2prNsmbbJskrXiLWUyc/egQMHz7c\n        9MCRw1K8tkyylxZIFpCzrFAWwqD8FUuBIh3y8HnxmpVSsmm9FFetlaXr1khhRakUlK+S/LIVkpSXJZbW\n        Ex89Anr06NFvppdnwRT7aQUTp9jqYANPTrKbUmBrN/VnOLq5FMwO8CuwtLbyXbW58l7RhjWyCITkr14h\n        uauWSXxOuoyztnr0CLhfJD7WxGHv6OC7/8RbDdWv75AVVRVSSO+XFktOSZFos9Nk3MQJjz4BhrY/bnB4\n        zZrl95fPP2s49W6dVO/ZgZBYJoVlJXcXUQErQUBWmlg86gTQeGXzH3E8oT98fX39v/v+rw0f/fmK7D16\n        WHKXFkpafk6DqeW4gCVrV8vCkmWizUgVC6tHXAEkgIY/iaNdu3btcXQIDAzU3P7hbw3Xvrwux985JYtX\n        rpCY+YkNo0zGBjq6u6at3bpJCspWijY9RcwnjGcIPNYEHpK618Q09N6n8U/B8I6dOnXqMmfOnOAffrzT\n        cP3mDTlbf15K1pVLUkZaw/CRLwfhMY/P9vVJ27V/ryyrKJNYHQGWhRxvAoqY30bE/fLTb3siXPZP6euc\n        D893gPFPBwcHh//thx8art+6Kefff0/WVm2Q9JyshpdHjwrB5R3xzg4hoaGZh08el+L15RKzYL6Yjbdc\n        ynE92uP8lB5/NCClddNtKjkZjrfuyf8iACH/VIcOHej5iO9v3274HLKvu3hB1m2skqy8hQ1jTExiQJQR\n        3tkL7+oZFR2dd/zsGR0B0WlJYmY5bgXGn9GjB85dgc5AO+AJPQktn6YykgmKbmp8cFxd0/Kn6wjgI56A\n        /NsHBgWFMuF9eu0vcqLujKzZsF4y83IbTM3NUkHQEFw3GNcPwnuMY7XapceQF4qQCCNTEsXU0qIc40MA\n        fv8C0B8gWU8DVARJaNmhMrPKykxQTxkc/JvJetKkSZMTExPT1ldW1h49fuyDSx99eBtl6+759y7e3ntg\n        /werVpfWRkZHpZqbm09qPANFgJ+f35yvvv2m4f2PLsufjh6RZaUlkpKVcdfU3DwPrxyPOYwDAeNw/Tg8\n        wyJGG7v66OmTsmRNqUQkx4uJpUU1xq2A8YA5MEpPhhHOXQCGRPMP5VVlPOKzHSTaoSMOxGmnXjhCQkLC\n        duzcue/mV7fuffjpJ3Lq3FnZ+9Yh2f7GbqmqRc++ZbNsqNki1bteEyasQyeO3StaUfyms4uzBsmuE2dD\n        Arx9fPxvfHWrgZKvfeN1yVm8SGKTE++ONhlbgNdOBcd2MH4qrp2KW4hpUEDlkZMnpLB0pYQnxIqJhfku\n        jM8A3AAHwFpPwnM4dwMYCs0/lPfpYTqdxnfG0RWHu7u7R03t9t3ffPedfIz6fOLsaal9c4+UV1fJUngk\n        d/kSyVjyqqQtytUhozAPPf5iKVhVLKVV63TXZuZm11pNnDjN08vT/7Mvvmg4WXdWqrZvlaSsBTI3Krxh\n        xKiRuXitLV4/VW+8HQ0HpgPOsdrYzYffPi6LSpZLaHyMjLUw24dxDcBl8Sz9dVSCMcCcwDBo3mHofcpc\n        Gd8NR1x8XMIHly9d+xIZ+r3Ll+TAsbdkDbJ0VsGrEj0/UTSR4eIbrBGfuUHiHxYsmqgICUvSijYzTeKz\n        0yV5YbZkFxVIMcoX7vv60PFjd/ceOShlVeslMilOvOcENgx56cVkGD4S6jPVy94Sc6K8bYApgGNMbOzm\n        g8ePoisskrkxkTLG3OwAxiOAUMAPcAUsDQhovgIMY5/ep+zp+fT09MxbX9366YsbX0r9B+/Ljtd3S9Gq\n        lRKfkvyjywz33WNMTeL79e8/CTHSh9JGvPTu82xf6+GjRmqnuTjtjEjQ3knKydQRwXP2kkVSuGqFbsUX\n        EhslM/28G14YPCgcRvP+AUx4wIvAcBgyEjAFSMS06JiYzSR/4bIlegJMD2I8EggHAvQEWPwmAih/xj5j\n        XqvVxt+4efOnq59/JqfRk2+p3S6Fy5bKK74+NcNHjHDjdbxeVQW8+P91ZQONX5ju7OG+KS0vW0dCLFpY\n        bUaaRKcmiVeQ/93njAdqWOeBrsAzQG8851ngeeBFYDQwgQR4eXltXlayUsJio2V2UAAUYLof42FAiF4B\n        TjgzBFQOaH4SbKwAZ2dnl/qLF69euXZVTpw+JZVbqiUjJ+uWvcP0DERFdxLE9hX2P8mShvsNm4//053h\n        uycmTrJJSMxM+zIpJ0OiUMMj5seLd7Dm6779nrXHhJ8EGK+s4d2BPsBAYBhgBjAMHPBeTf/+/ZONehul\n        9OzVK7VT587RGJ8DaIBXAOaKsQDLIUthywggCawAjPvqLVt2Xrl6VY6fOinlleslZUHaTRvbSTHdu3fv\n        0aVLl6eRIzohUtqzm8NtBOONL+TZsDujYUS78VZWocgbN5Jzs2Qe6ngkVDDd1fk1PKeb/hqWLtbxAQC9\n        T/nTeCZCepdw1IOfZwI+AOPfE2C1YCmkgkgmiW3+oVQQFBQ09zpi/iiML9tQIalZGWI7ZUo6UkI3GN8V\n        6aELowTe7wjvd8J9XShhvIneY/Zld9ZTD37mGL972tHZKWUZqkY8lrPzoIJoEDFi5MuUMT3G+k3pM/4p\n        ZWU8SxyVwmTIUsecwP6CJDD7ewMshxzjvVQQS27LGiFFwLaamr11WIxUbq2W5MwFgt2ZrayG7Nnh+adh\n        fDcUiu7w/jMgoDfuI+P02kCAJWgwwA6NZ4JjNKw/r41JiN+ev3wpCEjQKQGrPCYzPoMdHT3ImKexNJqy\n        pmcnAgwHfs+8wOaIyqAKZgPsBUjOUIBEcv3AUGzZYWNjY4ukd28HmpP0/IXiqwm6Yzx4kCuM7kzDIdee\n        8LwRjB8A4431GftlvIWxxwlyYixF7M4IXRcHmOgnP8zM3FxTXrXhp6TsDAmJi2EZvdd/wACu+O7n9cn6\n        Z7AikFSSSSP5PBJDz1MFLvr3kXCqjmHXcgLisV9fd+FdKcGmZUh0pFhPsd1NqQNdDQxnjz4KxlsA9Ay9\n        pRoWylXFKT/Tg/Qkv+d1lLVlTt7CowXY5QlP0Op6h5FjRrOvp0G8h9Lm9byWeeAlgJmd0lYJkirg80gA\n        VcB3kkCuCRhuzEUtJ6BiXUXtvsMH0eTky6xAfxk67KVkGNsN6KtfmNDw8cAUgBNl8+EOeACUIcExZ4Be\n        aQyOOwUEBq5Zv2WTxKQli194MPb3rE7p71XGM85pJD3K8FCrPZ4ZbgwFqoPv4jvZNY4BSJSqAC0n4ODh\n        Qx9U19ZIQnqquHjNEKM+vZ1gKGN3GMDujP05X0jWvQBmXxrPidALytOcHKHUQc+SDJI102KcRdYb+/fJ\n        fDRHgZFhYmtvdx3j9CbVwhxAyQ8EGM80iDFN8DMJYbKj+qgwgp851hdgNWEFaDkB5y/W3169vkIiErVi\n        7+4iWMAwthnjTDD0Do32BVh+aDwNJ/ucgGGs8x6CnmK8MhdQ0pysey8jozCW2PT8XAmcFyp2Lo7/zXH9\n        NbyHSZOVhOWM5ZUG8cy/SQrzgeoSSdgYgPmB8c8yrPoSfGz+8diHn3x8dylaVU10hNi7uQi8zQfTk/QO\n        DQ/Un6kAGkOp8hrGKSdACfYD6CWCTQmN4YTpVRLBxc7Mc/UXdKtAP+QAO1enexinQphAVSZXS1rVWNEo\n        Jrdu+mfzmfQ6Gya+m12kofzZmTb74MWPn6k7e/tVtLsBEaEyfYabtO/QXkmdWXouQAJIBqXNrM+GhUbT\n        K4xPTo6T4OQJfuYYGxwSQ+NMjYyMvC5ibZELAryxiLKxt6MCqCbDXp6eVMarM1XAUGCi4zspeYJq4btI\n        UOu8jxuf2L1nz+WC5UW6zOzkOUMg1UyM03AuONh2khBbYAygWGcTxEmpbpByZRNCqH06Fb/00uAJEyaE\n        vnuxXrKxovQK8BXLiVZfYpwhwNLJfsCwlKk1hiEJqnVWZKv3K+Nb7n0aULyieHdxWalo5oWJ+yteMmjo\n        kBqMs+cmAYx7lioaT6/T4+y4aKTag2vsMUP5kiBOuE9ERMSit8+clvS8XPHAe0abjj2HceYXdnNUFRWj\n        FKCM0alUDxqq8oJ6f6uMx3N0qzje3DE8IiK/YlMllqqR8IyPjLeZ+D7GtQBVwBJG2bPW0niybmh4U6zr\n        lhlcFAHtgW4bKiv37zt0EFtgmeI0041E79ATzCrC5KnaWc7L8LmN1WBIuPqONrXo4EPIZhczM7PZ23ft\n        uBeVFC9egb4yw3f2/wx4bkCZfnLM4so7NF6VmiblRstVi81VI/DUtGnT3LHB8mP19hoJ10aLnZPDvWd6\n        9VyM53FRw1I6BmACZQ75td3dVhttyBAJoIyYWAblLXr1zALs4szWBMisIH+xnTq1DkYw8dH7bEIo42YZ\n        r3764r4B91fRTncsLy/f9m59vawsWy0+mkBsbZnW43kqwVJlLL2sHs0hoEWebupiEsCkwrgbNt3Boaik\n        vEyXB2b4ektgWIhYWFpW4DtKUy006JlfTDTK8/qfvrjB2hE7yanXb9yQvfv/JCmZ6eKKRDvg+efX4lnc\n        1GCFYa+hFMCa3zgEHojBhg9RiYWSZoYeiebHU5sQX5+IbtDT34fbVhIUFvKd+TiLdHzPcqNKTZOTUcbT\n        8/zRD6vJLsgvUZcuX7517sJ5KUOzNTc8FD9uWJ4EQVwOc1+P21rsLdgvsLQxwf5HCNAlQD0B7L9dR40e\n        VZqRm/39XGx4uiFLv4JQiIrXfm1nPy0TxvHaX5yYLuvh4P4iN1BSU1PTP/zoo5totGQXVprz0xeIi4f7\n        zWf79VuIS+l9EsB1PfsLNlVU46++50HIwVABlDfbUDYk0Ta2tntTMjL+4TMnSFxmeYo34jUtO0vC5kVs\n        NTUzo1Sb7LUVAQ4ODs7I+Nu+/vYbufThZUh/v+QXFoj/HM3fh40YXgqBBOBaKoA5gHmGbS37C1YZ5qUm\n        3/EgjOczFAGUNeXN1pILEk4qY9LkyYfh+X/MQrPi5Okhnn4+/AFDFi8vurMgM2OXn79fnIWFhQ1+M+nD\n        hIcOrzeaHJt58+bFb9y4cfcnn35yh15/G/uK27DIyl2UD+mH/d3EzGwdEqIvRMIfP9ljsALwvVQgO8bW\n        L2hawYyqAmSdy0+WO7a+KcBCMwvzN3yDAr6dFeAnjjM9xHW2l/iHzJXEBalSXLpKtr1WKwffOiLvnKuT\n        C+9dFCyo5PTZd+St48dkz5tvyuaarSRMElLmi7e/7w386LkK22reiP0QcBYOAthheui9b7ih8auJthW2\n        3vcWqoBljeWNZY7lji1vLJAF5LxgbFwxdbp9nRcU4IzM7YB1gtvsf4ZFMH4IiUHfMB/bZ8gbkv3qQiBP\n        srHSS0xLlfCoSEg+COV0ylFjY+MFqAbeSA0h8H4ECAgGAdzS4oKLVabxcrZFLW1rCfm5E8QDdKUQYDLS\n        AMkkAMjApJOHvvTi2ok21nVOHm737JwdZSrg4O6qI8XVa6a4IVe4A25enuICtTi6ud6ztJrw9qAhgwtg\n        +Cx43Qdxr4yn/Nles/sbA7C97gawZf63Z//GZKkwoArYhJgAXJ4yQ8/XK2EBznHAnL59+2aCjA3YyjqK\n        Hyn/jH9YuoP/27trbjX+Dv6+MmL0yMPYS1yNxVQcjHSGp2cBQUAYEIExep5Zn3HPd6n2mv3/rzZZrfX0\n        L92nVMAJMBcwE3Ptzt2fYCARIAEEP0eSCOAVwANgVeCuj9rTU7tG3EMIgrGhwDwmPMY8wIUPN1KU8Vz9\n        seypzP8fkX5jQtSagBNhKHBZyvU5jWOXFgUkAVQEQyMBYJ4gGczkJIpgSWNdZyWJ0IPfc5yEsMwy0aqd\n        n4fCeJKhSiIlyC6MJFCa9BJzAhOjRm8QDY8zAFeMHOPSmUSRFBJAQngP5U5V8DncvWWzwwUP1x9U3e/q\n        eRqvDkMSqASGA3MCEyPVQANoCDM3VUGv0kh6nPmCf9Ng/mbPazwAhgU9zurCPoPJjuQy3/xuMW9odOPP\n        igTWYTZInCi7RE6cy2Gu1rh3R6O4QcL+XcU/kxpj2xbgfiG9rX7U4P18jtpBotdbvYnxSwY8iO8UCZyg\n        2ofjxOk51mq10Ukpj9AbSUP5mV4eCjCR0mhublBJJFIlOrXO/12SXUsIakwEFcH8QGNoFNtnetUQHON3\n        jG9ex+t5X2OPP/TGGxKliGCloPfUfhybFvVzuDrTWMMNUiVz3vtIGX0/pagtKENCaFhTUNe3RHVt17Yx\n        0MbAg2HgfwFn37I1Hks2+gAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"pictureBox3.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABQuSURBVHhe7VsHVFRJ1jYQlNjkDNLknJQcRFILTRZQVKIiwUYEAUUEA6AOqIAoKAIGkOSgpAFF\n        0TViTqNiGHVUTKP/rGnFsV+9/94+sGd2wo7j/Cvsf6hz6rx6r9+rqvvdWLeqR40aKSMIjCAwgsAIAsMH\n        AX5+foExUIbPjP4DMwEi+YWhiEGRhyInJycvIyMjJy0tLYtVTFxMQgDKf2Dooe2SwWBITIBiaGho7Ozs\n        zIoMD4tLTl64bPGSxTkLFizIiJ4TnRgyPTjWzc01wNzC3A7AkPuvB2L06NFjx0EREhISdnae7LF+dU5F\n        645N1y/U7ey/3dz408ue/dTLs93UvWMHqTf3e7mv+777cKP3Rl9FZcWByKiIdF09XXP4fPzQsu4zR4eJ\n        CxsYGBhOnTrVV1FJUdliooXfvswUsiM2ipREzibFkaGkMnYOKZkzi2yNCSNfc2Lob0u+Iq8vHKf6nz+m\n        +j+8p/LyclpAS5ggPQxUnc+cypf/TAKKra2tfWND7TfPf3j61tJyUjAAIs6y0H+YF+hLFrlPIRHWE4m/\n        sQHvOt3ChMQ42FJJLk6kOyOFvr95PXn16LsPTpMdq0AKLPX19Q2VoKAkfXlq/uSIoqKiYmw2O+Bow64H\n        T7pauE+PtnPdXF3WAgCi2soKFUFmhnSAsT6NVy99HRJgYkB7G+jQCMRMSzOyyteTtCUnkPL83LuTLCfF\n        R0ZGJmzbtnWPr6/vLD19PcNhDQJ4sLF2tjZTrh755lFTVip3oasTKQoLJWnhoRcAGA0BAX4/Z0112ltf\n        h3ZkqhELJQXiqafNu8fqa6RHL/V0Jw8rNhJ7B4dNjo4OXlcuX7j14acP1IGuzt5p0wLn6enpGQgKCo77\n        k3z5Mq8rKiqqtpYW3tkYHU4FTzQjrlpMOtjcmFQsTXwrKCjgAEZR2kRF/hESjb85MdV4V/sJqgQBQClo\n        TJhL56enXLWxsZk3f07UIiS+//Fdnk1AEEJCgmNVVFRUEewvQ9UnjgLE8UX4sxs2AscXsVyJB4i3GxCH\n        HE8HrirJya2ArvjEhYW226mpkKl6WjRWBAMlAYGIc7QlLxp3UpZWlvkOwP1LhzvuPj7UTNWnLqSe/m0/\n        1d//ltrT1HQFJIMFEiX6iVP7Mq+pKivMWukzlcy2tCCehnrEWWMCbaIgR5RFhLnecD/Tx/U8zERm7Nix\n        3hoMBoUE26gqE+Q+AuCho0mXzQwmWXMjrhkbG01bksTJf3/pLPdZTQXVvCSFqk9LJA87Wz6+ef2SWrQo\n        pZzJZGry8fEND88A3Bee6+7yAK04ijwSpyctTWlJMKipetpkrr0VKU+e/xbE1hnVQEde5gESHGhiSHvo\n        avGIj3eyJVeK11IWZia5jk6O7JvNjQ9uVpVR+5cmk/xZwaQkOoI6un4l6f/+FtXTc+KBlZWlJ0aTX4a9\n        fzCKqKgwK8jMmASDO0POI2eR8yD+BA0bAlIybzZRkJbmqYE0Q2wLusAts0PoyohQel1IAOnOzSapCfOO\n        TZw0aeaaxWklr/fWUU2JcfQyH0+yMtCPKgoPJfszFtGPdmwlr2+ep0Kmh6xTUFBQHhYAwCRE+MaMydOU\n        lHhnA/ptqaxE0NVF2U4iUXZWJBpq/uwgEjPN7ySogKyUpIRXQWgwqU9Ppk4U5FHfH2kmt86f+ruRoUEe\n        cr9vb8Pz7oKV3LVB/mS+swNZ4e9NCkOD6PrEeaRtSTI5Bt9sWbvyOgRJekMeIIFIC6EKAAj8cPWQEhrf\n        aywvR6FVj3Gw5gU5SMSuuGi6JX/lM3FxMVs5OVlVr8n2DQFOjieSObG3mvc2vIqLm3dUR0fbZ3V6aumz\n        6m2kbkEcL2BaBcSXzQyi6+aG0Xn+bFIaOYuUx84lxypKfoKFVCCo1dDaAViwuC+ODv1WUlLCHcUbqtI4\n        fv4tOtKS7zDISXKdTMKsJpIpBjp3mepqBWDgvMHK26Alh2iRbWZuxgaDFiwlJeWlocE0e9TV+exq0Voe\n        odvCZ/DiggUujmS2lQXBdrStJSkAlTlSnM+Vk5VOhvGG1h3y842N5gCRdV9l9wf4eBeBFIjApFAq/ORF\n        hO9P1lJ7rygjWclkqs+yt7f3iYgITygpKano7GjvbmxsaFuWtWydmZmZHUOCIb04KTH/TVsTaUtNJKVh\n        0+nCYH96sYcLnc324F1RooLMjUAynEnx3DDKQJNZgmMNqR3gGzM60V5DnTgyJ5AN0bOpglVLz4BuTgYX\n        JQT6qSMiLJQAHGa5u7v719fXdLx997afF9yAT8cr1idPH/+YtDCpqK+96fmrqjL6ZGYq3RATTgeaGhGs\n        HFChKOA82hNvQ10yRVebpHtPJXp62tXDAgC0+lM01GlfY32yGgzX9a7WV56eU9MBACFYyMk4ONizOjra\n        Trx/dI960XOE+7q7nepr2MXtra4kr04fIXcP7SfvDrRRl7duog4mxdOVkTMJ6nuGpxsJh+gQCXfV1uBF\n        i/FOdgTHSwT7YKqpPvQA8PPxJVmqKBE7CGjQ3aWwXMil3Vu52cuzT4qLi5vCUlhl2+bCpvfXL3Bv1Fdx\n        uwpWcY+vziZ7UpNIipszKQoJoFvnx9AH05LoErD0B5Li6LWBPjTGFDEONgQXShg5QqxAJmuqUwgEBk7T\n        LUyJlZ7u0AOAKoDcx7je28SIF7Rcaaj8qK2hngVWWsPJydH/ycGWj6fKi7i1qRxqTcg0kgrc60zh0L0b\n        1pCutIX03thIGiPIqrAQujkuik6HUBr1HWMIFHlLZUVioQjhMhDPgsDKRl2NZxi1VBS2DLkKCPDzhWM4\n        izE9TroyKYZsWJJ8T1lZyVNWVlZhVWpi04PGGm5jRgpVDDYCXduaAG+yjO3Bs/IbpwfQuX5eJJvNImun\n        +ZL6OWE8VWJBdIigYjCF6wkMnwdXkDYT1Eikgy2RYohsGHIAwNg5WEDgEwiR4GIQ/9bVGdQ01yldQLy2\n        pJSkXE1O6ndNGalUChCOOh0HIe9ybxYpDvGnMT5AbqO4IwhF8AzFHg2qFaiVkZwshaGyuaICZQ33CIK2\n        pCSFzz2Ndd+Ap4kccL1D5wgwtpeVlPibuozkXVs97b4Ae5vrenq6eWD8ZCUlJRWrkjk/4EImy9eLJ9aJ\n        QPSaID9SGRNJN8dG8FwdgoBSEW5twTN0GD94wmoSJctEXo4oCgt91JGS4A4unAwBAG152e+Aauuho/xf\n        R5aCEFcXgiFLZWVlSyVlJX0wgAwEoDgu8lkZZw6VE+hDsC6HFWMcWPJCsBWZIBEoFQgMz8WBwUMxN1WQ\n        560WUe+ZDHGumpgo105dlZdCw0UWxgGioiJVMAWF4QLAaCUlRRcraytWYGBAhLm5mQ0QLwlLdslIX8+L\n        7dlpPB3nTHGkkPgIIBaNHuYBUQ1mTDTlGTzUdSQaxVxPRpqaICZGKcGiCgFAT4PPLFVVCNvY4AcgPHjI\n        xf9n6AuZMiccqs9Pp3oPtnxIS02uheyQGqaujDXVC79O5tDrw0IIegAUd7QD8U4OPOJR7N10tGhMnqDu\n        I/eRyyjmCAC2Ma+AbVQHloEeGS/IVwljD5uVIA8HUAGTUEfbV9eaqrmVleU3TUxN7DFBCobQNNN/6psK\n        zjyeqKOrxIoJUJSIUEidzYAFk5Mmk+ffkXB0qygFuKrEe3zuZaBL43NZhuhpGM4Z6vDaQsOUmLYGc0V1\n        bubHO5fPvPPx9UmCLS8ZiAYFFaSlCtM8pvBcH6oAEh4EYu9ubMTLCqOlt9fUILylNIj6IBAIAIbZeO+k\n        rUXU5aTQ8IUOuev7PcMDKWsxL1fnpqtdez+Ubio6BhsjZpjGhpS4vImq4sXcoAACq0MKuY/Es4wMeVcE\n        wx7EHwFAS49Eo69HwvE5SoeMmOgVADkMxmYMF8P3q3ngVhgshNRj5szuvne9p5/N9lqI3gB3fOE3TS0F\n        +WuRdjYUxvd+5iaEBa4OifMyNebF9xhOIwBoE6Zoa9AsQ31ipCj/TliAv3vA6A1f4gfRwL08daa6QWhI\n        4O6aLZu+VVZRNhxMYQMIakIC/PUmykoUcha5jxUjPoz8kGg0hBjqGsrKEAUxke/Hjh79FfRtBlVw2HL+\n        lxNDEGAni2lhasIJYrvVwU6Zxs8yN7xcARwE2C0hNP7aBAmxl1iZUoyXiqLCLxnjBO8LjB3TBu+kDhg7\n        qWFn8D6FE8h10H8RUAFDERERm9/w2ZjIUINqC5X1s2o58Bx/H16W/lMI/+U7Ayc+/v8dePgcMEa+GUHg\n        vwyBwGmB4S6uLrkw7d/NvYOOj4dzPew/a7AwZsA6rCGZoD5hXtfBrrsw0d9deBQXF20qWFdwdMBy/1t6\n        8IAYADYOQSst3Vx+9erle7CvwMQDUjW7q/fBx7/c6xvj4eEelZaeuhLWGpJfHCwE4PW7f1A+Pt5rYPK/\n        isIg1R15o/f6/4wfPz4WssCx8znzlwwGLJApkkRiBycNJ+OULl+9+sLCwiIZTobllZVuuh4XF3NEXV09\n        9PuHD96ePnvmRwZDPAjfR8mAb/lgNSmSkLig48Wr1xScF8hSVVV1NjY2nm1qahIN96lYYY9wccbSjJwl\n        GUvyVuWsKly6bOn61NRFOTCXrMioyEXTZ0yPiYiMSAudGRoLGzHuWtpahp8srQhARVXlvcNHDj+CuN4L\n        uPBPVYCQ1/zZ8yfv165d0wMdGgDBinDGDwlQwgE6OtuPwSlAHyCGv6qqoha+ZWZmZR7gcBL2Vm6vOgOc\n        n+Xn57OxsLi4i5PI6a6oKL8iLS3FS3HBzlHo9ds3X1+8fOV1456GZ9d7b3Ary0vvA2DdLA/3ysAA/2pb\n        O5vtphPNv9YzMOowNbPo0DXQ72BqMVtAbVu1tDSXw7hO0BcTqjRUuYF5YRvrp0WViooKgVu2bjnv5u5e\n        XV2z+5yqmqoBru60tbV1Tp8+eZ3t4/tNRsbik9g5SEN04oLE5dAWgV0e/cdPn3BhIpmycrL2WdnZhxGk\n        nNycnSdPHr+voqKcDP3I5+Ss2tHX9/ANZHc4sIQ+MAgAintre0sfSAQSEljXUPdASGh8HKoZZJ1s79y5\n        /RDayEkGRJ3q0jLSxnCWqOjipQv3v715k3J1dS2F3/76jhECUFdXexk6M3ZnedRuLt3U6R/gP7P9m7bL\n        amqqOUZGhhkpKckHcSK29varFiQtwLYGHIkLO3r8+AtIiZc6TXZaCQBuhudSuXl5Hc3N+3BJ6wwSI3Lm\n        7OknSUkLEByz2rradgAgBCXAzc0t/szZnj5QA3uUprbW5jsAmBuqx8ZNm79+/vzpO2hi9DiqvKLy6Isf\n        f+Q2t7Y+sbWxbMnKXnYGHvtA/eubphpMZszRo0f6kHuIqKcXe++Z8+dfQsJzIRJqaWnpf+LkiT4QZwsg\n        dL4322s3guHr5xsfFjZ7B5wE/SZz2dJa0Nu1+H3mssy90VGR+6GtgvmD7u6Dj0DNcuBedBAAIFrk7Llz\n        d0HyTg4a3+rqXWcQAJCMcT3nzr860XPihaCAgC9Ig05o6IxSX/+AS4sWJR85fuL4TQkJxv/dkhlWdTFA\n        4GOYoDmijRuf6WnJF7W0tNKRUyD2fnPmRLULCApYT5o0kRM0LbARAUhIiF8O+4Gcurqa07t31/TABkk8\n        vl+wbl2Hq5vbDiQYATh35Xw/HJ4KRC7v2rVzH6TSI7W1tULKQO3KtpR1gxFUtrOzC6ivrz2LAMAOsvW2\n        im3XVqxccSorK3Pf/oOHnoMtSoATuOF3vrv9cV5c3Cl7e7sC6O/TdByJ+ncFEpwLBySAB8AACHIweVye\n        jmGxPPyCg4NqoC3p7Dw5vq6+thfasmnpaRsgHeazbl1+Z1t7ay9IiC++v3PXjh7osxYBAG4KdR3q6oO+\n        8NjM2PLyrQ0aGhrJhcVFLaEzZ1RduHjhPkjBWSA6ClzmMRERYTZ4jNnglh9evnrlpZOTUz30EQo2QLet\n        ve0QeINW6HfSunUFzXCV+SPaPul3sNq7vm7acxteRhX4VfH29g7hcObvgx+kXFymJIArw2ytTfrixYUw\n        MU/gRtbFi+cegVhPwY9r6xsux8fHdUITj74yGvc03hjsu6qyshECqtVXrl59evjY8f7NZaVoexA45fz8\n        /GYA1H9D4fp2L292Z2x83HHgOp4NGO/F9kq9cbv3H+ASeYbPy8tzERhP9AB/vWzfufM0ujngkPZv9Qa+\n        nwNHWtYjRwNDglZCvLAX2gq5ubm7gEAXsBU23z9+SPn5epfDc8FDhw48Ak9wCt9BACoqth2HNrrNUS2t\n        rYfj42NblmQtuwYbK0WwuYp98Y7CgURtRgDKykoPA9fZzs5O2aByK7FPiFRX2Npab7e2tspHAEDaFLKz\n        sxuw/ZcQAA7K3L1//31DQ/3t3wMgYX5CcWdn+w3gsKq7hwcHCJ6Dk4KzvdPhagjBj15TWzt36lRWDbQn\n        3Lhzi7urpvoW/KbBL8DPqKqqQq/BA6C4ZOPZWbNm7gCJaofDFJHLly/fM0gEBDLLwbVO27Fr+yV4Zi/O\n        ELfxYrMrBgDih3GtwNAmDL5ftnVrz4wZ05Exn+8J3N3dYvHwAuh5E3Lst9AEt+UqISmxDAkaGGxQ9zCR\n        gYZoDOyPRIAxmwbGinWt9xb35OnTP4iLiaF7Gwscx+1t/HaUsLCQ1br1BX1xCXEHgYsGMG7mIEF29naJ\n        YCBD4D8E6N50sF84IYbGkychIBXCkIHCIzo84wfjWcMJukRoiv/WvD/p2akzp//+7v17CgxP9mDHv/Eh\n        EvpHmRseGDBJZU1tzW3Gpqa7FyYvbINnmOpiQMUjNVjwPThPLICESOGe48CzUQDiJIgq/eAeEyuDWSK8\n        /rMNUojE/jyDhOeVPr9oamltsra3RsvKC0Y+v6d/+RLBGkyFDRL+KV3j+F88N4j6g/r5+Xr0KaSNvDOC\n        wAgCIwiMIDA0CPwvpgE/Lvg0qNwAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"pictureBox2.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABLbSURBVHhe7VoHVFVXuh6agHJRbKBYEAQBkSJY6O1y6b13MBRpSgcRLiCCqDTpKlWKRkRQjF3U\n        qIkl+IgaS+LEaEwciUaj857J8+595v/PeLOYeclbjnEN973FWetf57C555z9f/uv3z5/+tP4MY7AOALj\n        CIgQAuLi4hIiNJ33OxWpN4e0tLTMxFHHlHc8RB4snCDqLFQY9ZwGx8w3x5w3hxocWlpa2ga/cyxfvnyF\n        qamJ2WhZAgc+6/0u0Ts8TVFpFr92dz1t7WujPYcHSO+JXlLdUUeae1tp2/5O0nWomxwbHHz98eWLrz8Z\n        HiaXbl4VDN+7Ru8++JrcuX+bPPz+W8Gzly/JX16O0Of/9Yz8/Msr8st//8LK6GvhmPDs7e0VB7gtRIDf\n        Ydrv75aJk+T4/lGB1PeDAJqYu5b6rQqggdHB1C3IgwTHhtKszTk0tSidFm8vpVuay2lRXTEpb6ui/MpC\n        vKZV3TW0vnc7PTJ0jOn7+CAZuj9Mhx/dYD65e4n57OEwg9f3f/yW3HnyNb3++BYdefajAEEIDg7cLBIA\n        yMjK8nneDtTR14XEZSVQ50A36hrkQX0i/ElIXBjN3conaUUZDJ4LqzcKcrbmovIkvTiLZpasozBGtu9r\n        IntO9ZCe0/vp0P1rrKIIAAoCcPPJl+wYyg8vRljrcHN344sEAFITpHIdvZ0JgoAr7xHmxSofnhTBhCet\n        oqhoXkU+yS3Pp/xthXRj/SZS3lpFShpLSWZpNoOWsbW1gtZ92Ej7Pj5A9pzex6AVnL97kcFVv3TvM+b0\n        7XMsGAjAvaffsQB4eXsWigQAchz5fKcAF+rg40SC40IZtyBPsio5igmMDgF3CKTpGzNJEn8tk7B+Desi\n        sVnxQlegOJZcmMqUtVVStIJDnx6mTX2t5KPLRxhU/NmL5+TuyANy+/Edev372/TTe1dYi0AAvEUFAIwB\n        PG9Hau5oSVyD3Kn/qiDW9xEAPMdmxIGiSXQtP4W9RjCS8tbStYWp7HVuJZ9p7msjHSd2UyEA7R91UPT/\n        m4+/ol8+/oY8evGI4jVawPD9G/Tlf74kTs5OOSpwiEQQ5Hk4EAcfZ+od6UsDPggibsEeBK3CO8KXBseH\n        sm6wvoJPw9euYjBIRqXFgiXEMfE5iTSlKI0WN5bS9qNdrBvUdNfT2g8bfvX5WyN36YOnj8lXT7/51QIw\n        Wzg42OdgFh1zAGQnTuRbu9lSa2c7EpoYTj1DfSAeOLJn10B34hHiRdD0g2KC0UWoT7gfQWDQGsITI1lw\n        qrvrWOV39DfTht4dtKm/hV5+cJXNArjqNx7doZfuD7FZYvDaGQZTph3PTjQAkJaRyUPzt3SyJi6QAUBh\n        6uDvRFF5R19XiuCgW0SlxzBx6xLomoJkBoMhKo5WsHpdPIPpsbRpK93e30Q7+rteV3ZU073n9rOBEH3+\n        8u0r9OR/DNL2jzrJvnN9FK0CAZgFx5hbwARp6bxlNsuJhZMlKk+4HvbU0smGmDqaEQtnK2rrbkdjM+Np\n        SHwYXZUSxfiu8qfxOUl0DcSENXnJNK0kkymoLiKYHXD10RIQkKaBVnr21nk2+p8Z+phcvfs5ayF9lwaY\n        T29fISYmxklYUI45AJgGl1ktp6b2ZtQ90EuwwtaYGJgZwN/mNGh1CIPp0TnAFazBmWB8QJBC48MhRUbS\n        1dnxTEFNEd3SVE5QUPltu2tp+6FOghZx8tppBmXvyV4BxgX8X1VHDR04d5RAeRyPpfCY9wMsAGABdh4O\n        FIMhxgIMgGa2li9w9Y2sl9GVXGO60taY2rhyaRo/S2Bqa/HKzMb8JwdfJ0yT7Krj6qPpZ29Zz6RtyKQ5\n        ZXm0bFclLawofrHnzD6mdm8DWE4ixRqi5/jBXwEQCQswsTOjCAAEPurs70Z9o/woz5F3XENjYbW8PKdV\n        UkIiFYrvgCVL9e5sbiyjLu7Ou+fMUfZRU12QYmZr8dXqrDg2/69OiLusq6e7Tn2h2oYZ06duUVSamV7f\n        UHtzz+G9r7F8xmyB7nH87MnXaAHYXI05ABgEbdy5bO2/KiWawWAYtDqUVu6o/ZlnZ8ufNGnSdElJycnY\n        fXCd7Dob9uwgzR2tdxYt0rAEF1YBUbfmWg6c+fw8TUhK6NXR0TGFsTnQLSu4u7uWbd6xFRTfRMs7qthA\n        uWn7FtJzch8VGQAwCEL1x5bB6NueId4kPin+jr6+XqOy8mx3OY6cIuguNlt59ko08bYjnczQV0Nk4NSh\n        21raWhaT5CZN3rm3+afBqx+TL7+8+dzSyjJq6tSpGNwmKCkp6ZiamZYePnX0NSqO2QN7h/6jxwTLlhmJ\n        hgVgM4TlL0Z3BAFzfH7FBrJnoEdgbm5aJCsry0EA4pLjrqEf7xxooXvP9FJXb5crkMVCDZYa+EMGoFgJ\n        9p8/RIIiAwc5HI4icggmpsabt+9pIg09O1jzx0yxbnMuOXj2kMDQyFA0AMBCCP3fxd+dBIPpe4f70bj1\n        CYyji/3lmTNnBIP5T0AAVFQXFG5pKmOLnrK6ipFJkyZ6ysjKTNHW0XaG3oFUf1hH9x3vJUbLjBpAeXm4\n        T2rqtKnzeM72nyTkrGGzQkpBGttQ9Z7cL9DT12MBGPMsgABgyrPz4kGe/4CJyYhlGnY1Pt9UuulKYGBA\n        JSijgACASC1QW1BmwbW4MHmKfIGklORsHEeAZs1WSjWxMjmvq6vTIisrsxSUmgDHJL9Av66UjNTusoay\n        FxsbS1guATvHjr7dr4UAjHkQlJSUyFuyUpe6BrgLsAuMWBPJIAmyfmsBmTt3zjpczVH0C7I3M0CQyhJ/\n        M86CAAdWdQiKJI5LSEhI6hnopaduSKdlbRWQHnOYwroilljpHtjzGhixOJHIApJiYnnLuSuYgOggGpYY\n        AR1eMlv5mVuZnYRUZ6GppWkqJib2NrQVWgl7wO/FlhoutZ0/f76uo4fTEPIGaP6Jb9rnXQc6BdqLtWNF\n        AgC2FIZKELmAmMzVDE4W/d/OjlvZd7R/yMjIMAtWdvobN3gbLg71F/ML9a8vLC7s1tPT8wXCZQQbKh8I\n        tNhp1nTVETU11SiRAEB24qR8LH9h9RlscHByfQf6Hx//9JSgvLn8pYKCQtSiRYuWT548WfktApaYgaGB\n        OdQAM8ECgqraa8jg+bPPa3fWP0rMXUOxrMYGCouiWbOUgiBbcMY8BmAh5BXuQ4PiQlhqq7C2iMGyFqP2\n        CuNlJxQVZy7v6uocmDdvns+06dOUISZwpk+frj3aFBSmKsyeO2/uImTQHZ0dkgJDArcATW5szbMZStuY\n        AeafTpB4xTbbN9KPfTbUCm64tTDmAPDsHfgBMcEUQcgD3q+8pZJsatxM47MT789SUoqorKrY/fDBn/8K\n        lV9MeUX5zpCQ4AIjo6XpYOXSQpdPWBtfkZCY0KSpuchd30Dfvbqt7tXalOQa6PjCfCMDiKWrFbX3wRbb\n        jSDPkL9tA1VQmOIuEgA4Ojrx0T+RDcosyWb7/MrmqhdQ0bWcPj04/M3Th7StveVrNzfXohcvn/8ycGjg\n        zxMnynqgJQgBUFZWNm7e3057+/ZdMzDQd/IJ83vRcbib7NjZeM7JxbHTysWGGvNMWObZ3s8B2WQiJyfn\n        jQC8hVu9Tdx599/Y2nHzg+PDGHtfR6S62HL1yInD3z95+YR+/eweffDse1K5rfLzkZHv/vrk+VPi7OL8\n        IZivtrBAkpCUkMGUZ+fCG+wa6KJ7+3uuh8eEXcN+Alvltp6253EpSc9N7EyJrSeX5RpiM+KplJSky7vP\n        +j3eacfj5WH1h8wPS3UB69t9Yg/tuzjA8vnfPRshDx/dF5Rvr/i+bEf5D7a2tlV9fb1nJkyQUsdpyMjI\n        KB8bPHZDR2dxrImN6SuvCB+aU8IX4POwyUKWKXB1CDW0NKJ/J1ig4EqOouBCTu9RjXd/FM/efoNLAG6G\n        uEMqDGODINb7yO8jlzcCAMQmxV7W0tIsWLxYO+HijUs/NzbWXwPT1XnzVsmYjLiX27ubHkLrHATApCrP\n        V76qtUyL0TXRpUvNDVlyBTMNjumbG7BEK9zr8O6zfo938ux5RVxPO+gEI+ia/GS2WhsAfv/o8Alm7/n9\n        zJMfn/7y4NsHLzw8PYra29vO9x0/8BABgCZpyZtpSJtzLZ5Hx0fdC4sM7VVVVckPDAv6Qs9EjyovnCNA\n        pVHQIrQNFxNjWzMSlhQhGgBg/WrL5W4Aro9Gp8ewOXpDfTHb7SHBeez6KebcrQvMDy+fktJtm2+duXaB\n        3vjuNm1pb//SxdU5AXx/GhQ0Yfaejj8nF6TSzfVbCNeBewFXXmOpBqOmr8bgeamlIUXWCclXdIXA2GDR\n        AAAisZyrm1tFSEI4u8uDHB9sg7HcPubq3gsHmJ7B/bTz+G66/8IBih3frkOd9OKtoZ/Pnjt7T15e3sTJ\n        22UEO0lUDn3cwsGK6KzQoQt1NajKIlUiBAGDoM8qP7bbRJcTCRdgAfBwq4xKjiFRqTE0a9M6mrYhA/t2\n        lrzE/h8FAUkrzmCA1GA3RvOqCmjHwS6Bn7/PIWyhMdghAFhSo7kLVx+BQMExjAPLrY2pJYCEmysiA4BP\n        gG9lRnEWySrNIQgACm6DsVvgkBKRyYnNjmMyYRw3STM3ZlPYGmPL5pLqUjZ7uAd7Y41PTbkWLKOMgiBg\n        wENBAIBYJSgI1KrkaBECwM+3EhsgVBQZG9wCQ8FvAnAM/4ctMlDkNC47gYlfl8jgrlBYUiTjHebH5nb0\n        72XAHrNnEPRzjP5mPAtiaW/LKo7pD7fekX3C54iEBXA4chx7B/v06NQ44OqKfl1h/B4gA6pC3PTAJgk3\n        SqG6EyBniAJmz1LnqBzS6CjmDpYUBZUXrjQWPUIQcKfJLyIAtt3siam1xSuRAABCAAequhlai7XCbCF6\n        RyR+wKQVA6cPH0EAr8+6BDYxSJTg9jkWSvjtAAqyyLiiuLKoKOZ5dAFUHoGxsLdmzxj8UFaA/+saLn3F\n        kZc/AsqHgai8x2z+zo8Sh5peGqhvjqKi4oIlukvCTS3NB5EcxWotfn0SawEeoV7s7hB+OeIZ5sM2Tg5e\n        zhTrelR+tKLCTRY7L3uKIKDPz1dT/Qv0D/0wSz8QrCDfhmB5Z6X+5RuhqpNEIDjynMkzZs6YC9v2Dppa\n        WnuA5/uJ6wHmDUpgK+sRgsHOk21rMZ2heaOSwlXHvzEoomWssDQl81RVvpWUkmqGCXmCzAIR0mj/8hz/\n        LTdAfQ4MmZgENDqSwFUoyE+W15aXl6tRUVV5jCkOVxvBEPq98Ix+LwTDwNiQzFkw5yuosapg0lwQ5BBF\n        W/H/DV3s9EDUAJOCGbNmfqOppy3AXI7Ko7ljacvmeiNtwUylGTfgxyXwPGsQZJP/7yr+G6CgMrMkxMVT\n        pylOv66mrS7QMzWgCzTnUY4C5zNQvBD+vwxEyBP8W6x2LF6CQMwQFxOLmiAl1QsukwF/G4BMHIvJjOU7\n        EQhcbSE1NpZzGX/3OAK/hQCksqlmZmY5FpYW+Sh4rau7JHK0v+rr60fBfr65MGJDtJ+qrq7u9U8RXFxT\n        U9N39BimS0NDwzhjY+MMoeBzgChZhO+BzDFFOCfYL1SHuRjhu/G3+H/hPbDfsHLx4sWBo5/zZo5/vFiK\n        iY1JtbGxqYZCxx7EEiUiMrwXXsrDycH2tnFRUeHZnt7eu8DPa+EYVIVqdXU15+FyvlABMXExqbaOzqF/\n        GIOaYdOm4uMAmJfw2XDWg/2DoNq6mputzdsvwTNV8BnwOaA7zKMSfqsJvzH5ICbqABApuXBti/dUV1cd\n        k+dwooXPAfBwQf74p/Rp6Rl5GhoamRioVFXVHOHrjVD4pD8GtrZX4H5fz76eo7A9tVpdQz0xLDxsB1oG\n        HCr1DfWX4VptNACtbe3D/zAGABw42H89j5+7q7i4uBkFdpB4c+fO9XV3d+tWUlKM6OjcdQUKTG0AwJvH\n        4zUILY/PX98KVHo8/M1upO5o2nm6qqriqPA5vr4+Ce8luKalpeWpqy/E73skZ8+eFbhQfWFpUUnJlYUL\n        1eKtrKxiLl6+8ig7O2tvfgG/7toXnz8Dy7D7PQCamlv+BwB/twAJH+HKAaiLAQB/BADeORV2jDy6d3d9\n        bm1tlcK1s6v9PQBqamqOwXtjRz1HD34rJ1yAdz7DVxjcbTXbhrJzcqpz8/LqU9PTt7e0tlyFDxeiq2qr\n        hqFBSZKWnhCKMn3G9PQtZeWfga/qt3e0PijaWLh7a9mW9orKyiZwizkd3V1PSjdvOoxj26qr2qGL1Gzc\n        2fiFcAzHYc8gCtzKx8bWpgUmPQVEHGgzh5r6xqfm5maNQgCiY2Pr4fOZaKEF8AsKBotLSk7jM1BSUlML\n        3gsAsCKYqxeBmIKsfCN4jd/9oInjGc1QKPjbOSC492c5SnAMfz96TAP+VvmnMXw2lsAYT4T1Ac4B7zUa\n        NYZFE75LWCpP+Y3n/PEYAA8dP8YRGEdgHIFxBP4/I/A3xyw6RoeJl4UAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"pictureBox1.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABHJSURBVHhe7VoHVBXX1o50kS5dLkgRLh0uHelNFEF6UamKASl2OiiKqBixF2Ll2RI19hoLGsVE\n        FJSuoKigIEKkJaJhzuTfe2SyXP+fvLf+9Yzw3uKsddbMnZl75uzv7P3tcuaLL0baCAIjCIwgMILA8ECA\n        n59fAGYyarAPj0l9qlnw8fHxC0IbA00Zmqamppa2trYOdjyXhwa3xEaPHi0qLCIsIiQkJCwgICDIB6h8\n        qjl89nFQYHFxcYlx0Hg8nlVScmLqlu3bDx0+cuyH22XlLZU1Ne01tVVtjY0Pm789cqQkZ+nSDUHBQbP0\n        9HRNtSZocWVkZGQlJCSkAAihUaNGoXb85zRRUdExSkpKyi6uLtPWFq6/cOrcpf59h4+T7XsOUrmrCwdW\n        rt1MbSoqJoeOnaaOn71EbpWVk9rHz0nf219J26vWrt27d5329/ePNDYxNgf8ODgegMA37BFAVZeCZmhk\n        aJW9dOmpjdt2v5ufkkNFzomn4pIXD6TmrCLx81OpJVl5AMRGasO2XQNFxYcHzl0tpW/dqyKPW9rpX/vf\n        kfe/vSedP3f+sq9435ngkOAYfX19Q0logzwxfHFAu7W0tPTJWLasLToubsBvehDx8g+gQyLDyYxZs0h4\n        bCyVuCiTylrxFbVy7Ray+8ChgaOnL5LLN3+iyyrryZMX7aSr7xeCIHzo/aTp6ZOOxKSELADVBExKfPhK\n        /8UX/KY83qKY+ETiPGkyPWmqL+3u5U07e04ieO4d6E98QwOomPgkKiQihkTOmUsnL06j8gs3MqZQUdtI\n        Wn/uYXr3L28ZANq7+v7Qhnnzk1fr6ukaoDkMSxD0DQzS/EOnEyd3T9rG0Yl2cHMlVnaOtJ2zC7FzdqMN\n        THj9ikrK5aKio0+CqWRAT8E+RlQkV238+DMh0yNqT5y/TL3seEPa3vQyq48AML3zDenp7X4fMyt6mYqK\n        CgcJdliBIC0tPc3LP5C2dXQhFjaOtLW9M21ibkPzLO1+15jA7ZeQlLoNJLYEJm0OXQ4EF4MuADYtCGYj\n        Ak1aUUnJ2Haibda8RYuqS0rLKOQBFPx+bSN14045uVF6l3rU2Njj6TlpDrxPBvlmWIAgJCio7uTh/trS\n        1ol2nTKFRgBQeK6+EVFUGtcMUubCRE1BUCmcMLo1YWFhERBiLDR5RSXFcapqqhrgNVQgJuAC8zt6e3ut\n        3bazuKfq4ROCwl+6Xkq27do3cOL8VfLdydMPdXS0bZFvhgMAAnr6BsU29i7M6ts6fVh57GNl5Wpg1SNg\n        okpgt2LoHeAoqqvLNQ0MCoxasmRhQUZmxsZ58+dlBwYGRllaWdrpcHX0OBwVNRWOirqOjo7PnPjEV7sO\n        HCFZKwoGFqYvJwtSl1Jnr9yifX19tkDgJDnkAEDkZopEZ2ZlR7R1DQge9QxNKFV1jXaYXAwILyMmLiau\n        Ds1rqlfI2nXrbhw8eurt5Ru3B9rA1t+972dIrrev+/3Va5cfhEeEJxkbG/MwgEItERcXc/X2DegODo8i\n        QeEzCR7DY+NI0d5/dEuIi5sPuRmAXHvYVUcA9I3NaDUNrbeg9vkAgAKEtCK6urp6WdlZW0pul5H0Zaup\n        +SlL0f9TJy9cIVV1Dwfau7ooFgj0/ZGR4RkQLXPQ54MG8auqqs539JjEeBVbBzd6opM7Sc3OI+ARCgEk\n        xqyGpMHkxhgam3QbmpiTCbqGREVV/bfxmtoULN5ttHmcFIbBqelpW4+fu0JSc/IoDILYAOjUhWuk6lED\n        edLcSnV2d1Pdfb3kTW8fw/Z2dhOT5OTkFLlcrp65uZlTeFT0Y3StLL/Yu7pSQaEzqkEDVIdEeHypiIiw\n        Dwqvb8wjwPQDqupaAxw1jbeDbC+Kz9jZ2YXtLP6Gmp0wn2AAlL5sDUmYn9Jtbmlxj8czPeztNfl4Wlb2\n        48ulpaS28Sn1qKmFelDXSCqqqnsL168/dqesrKqypv7dvMWZhGcxkcZ3IbmaWduS5CUZBN7lOWQAQLKy\n        GtVei6tPcOW1dPQoZSXlikFXh/PiU1NV3Wg9cWK3b0gowZX38Q9oFxIUyAQutIL/jweiM+eZ8dy8fabm\n        b96xs/vHimpy5vtrZFXhZio1ZxkVNSeJnjLNn6BbRfPC9yDHIPBB02PIWBnpDHQsQwKCoqLSUZwMTkpH\n        35hGMMbKyV1AP89OCFZIHldJUIA/R1ZO/qywkBBOWBmuYSwDFCEkLCYmJo7u0MLSYkHR3gNky8791KyE\n        ecQnOJBgFGlmZf+7Mc+KcasIAmobgu0TFER0DYxPw3hDEx5DGl+ha2jKqCS6PVRLsTGjC/5iQrhKONE/\n        c12jgPCEoIu5TvKo/TJ5CTUzNpZ28fCiza0n0qj6CAB2NAEEHMG2c/b4Xd/Q+CaMOTREqD5erQ41ADtO\n        zsHVlYgIC6X+OyoJSd95TJg8p/kQDKzYgAo1DIVHwHH1kW8MTS1oQyOTUvQ2Q2IC4N6acIIoPK6Sp7f/\n        PwUAVR47rPRfhrAIQGBEMPXBtVqDZlkTfSNTZsVB9SnsyDkqauq/aXMNKK4BFz3O0ADA4aiWIjmhmmIk\n        OCNqDoHK1lqYkDC7Ihjko7FjUAOBoCyGv1jpQdv/30EM4KIw2df7NYbTmEPguGxghYKjqX0MBHIBZ7za\n        VXjX2CHRAHkFhZ32rh4EJ4pBypzkedTkKVOvAsExNon1v+DgoJlJyUlZ23dsP3z33p3KiMiIpVAHNFBQ\n        UFAGUP4ACs3G1Iy33tFtMu3o4cEkVJhNsibAMj+yP54zmgCmMFZW9uSQcQCEq1m2js7E1XMqk+v7h02n\n        V61d9xRWV5OtDK1ctfrki1cdEOB8KHK87uzoT09P3QpFE2fM6EA5UElU/AP8C9Ny8ikEwNrOmRjxrH/X\n        M+Ix9o4rj7aPwmPHa6gJRjwLClLJnI817rNqAqisoZvXFGb1EYDouATqZlkF4XJ1Fo4WHS0uJCwkbGJq\n        4rBh647eSsjqXr3pZuJ+7A8f1jcf++7Y9X3FxadOnr3YmbgwlULVx/oB2j1HTb2Fn58vX0SA/6SYhFi1\n        sqrar8gFuPrIAQiAsZlZPwjsj/HGZxX8Ix8/xtTc8vnsuQuoOYmLmCjv+LkL1I6du+4bGOg7oa1jd/dw\n        i19ZsKHr0bOXdEtHF2loekaevWglZy9fJyk5uSRg+nQKEypG9a3tiYbWhB4wo0WDti0O2mSircPtZl0u\n        agRqgZy8Yjk8YzQkwuNLMVGB6kxu4qI0Km/t5oGCjTsGDp84SzU1v6QSEubumKA9QZ/D4YzX0NDQdnVz\n        Tc5ekdd29Mwl6rtzFykMdhZmZFKBUSHEK8CPOLhMok0tbGmlcZyWQeGVWcHU1ccXoQtkki3QAuwIgKCg\n        wHp4RnrIAEAMoFCrHhA68zVEcAP7vz1B7Tt8hLpfW0+97ux8Nzt29nIwAXModIxTVFRUhm0QO6j5Fxmb\n        GjTZObm/dXBzJ7bODtSECdpdEpKS1cAde2FMv49JDRKiWDQLxv+D6rNxh7IKpwWe8x4y9R9EfRRWZXjm\n        vNVFew9Rt+7eJ9du36Oxwtv4rIU0PX/2Jjo6KsXIyNAUCE8ad30wPYamCQHBNOCQmfx8fBGDdozZI4bQ\n        fDgmNlOeaayr52TGE7AagCuPQEA+sXXI3N/HKof+XVZOVnV6eMS9ktvl5G5VPVPCqnv8nMLzjp9/fp+7\n        fFkRmAEXdnkkWN+PuQC6Puy44YHmhMhgjQwKIpbBoSFfO3t4MhmgjYMTza48hsHSUhI/wf/shnr1GRyw\n        qAkVH0muLtcdia6sso40QW2/8XkbwY2OKzfvkIanL0hZ2U8NM2fOSIP8nicrKyuH5TGs+uCeIPAEB7JC\n        rr29ndvilJRduStXt3r5BjFpNgqOpMce5eQVmuG1wdCZdHtYNAxvQcNlrW2sYwo3b++qbXhK1T9pId+e\n        OAPkuIXKWbluYP22PdSZS9cGbpVV9O/eu+/Oxi1bz60uWHNoTUHBsc3btl86cvxk3Y6939DTIZq0sXci\n        bOLDgoDEBwTZBpoy92OOGBYAoCpiaKugqKgCZe25i1KzOrCKix4ha8U6GqtAWMuDnSFqQXoWWZq/hoDH\n        IKvXbyLzUlKoRZkZ1IzoL2H/wI3GBIcNcjANRsGRAKF03DxchWcWAYgLI1sm3jcwNJjqFxRanpOfTyUv\n        zqQwTvAJ8SeY5LhOmcxUjzGExmwPoz4Me9n9BBQaWR+TITwC6fWLi425Pqj2UsNlxf90HkhwCAIUOCTk\n        FeR1FBUV0gxNjRq8/UMo37BAMsXXj9kyY4MeDKEx9EUgEBAWCObc1o4oKSs/AbZfNUh4w8fm/9kqIJsj\n        MSIQcC4Ebs5AWEgwVUpaplTXyHjAzMqGwqAHwcAQGjsC8CHzm0i0tHW6xSUl7w4GOc6Drm5oQt1PqG4o\n        APp4WwAlWpBvVBGAck5EVOSGsKjIZSE+vnPCggJ74N4CeAZje33oWD36jxf8zzBEoTANRnvGPB6LGXiO\n        An+cHn9C/EeGGkFgBIERBD4BAhDtKS/Pyys8cOjQmeycHNiYFNJgh4UvusIWLFyQhX327FnI5sL4WSB7\n        jaPKcUVWhx0hOfZafEJ8qq+f72zIEtXYcWAH2Ze9n5iUmA6eQQzvJSQmLB68nh0ZFZkEhRYshPDBf2XZ\n        5xUU5C3+Ns8Bwijer65tbmn/mfqxvJo0NrfBzm5dO1zXxQkeOX6ise1NH3za0kceN7/sh4mbwj2pW2UP\n        mGsurm574DFRqB/w7sPeH34H9OhpC/X8VSd50dbeB0mgI05+1ZqC8+w4+JmMtLRUAARYQkePn2jB689a\n        O8iztnbqZfvr90rKSn4wnnnloyfMO2xsrAvxHZ9grf/vELBFHd7U0ka97OwhxsaGe278dJfCCULYuxwE\n        lSgtvwe/+8jLzi6o/fUSSQmJGQhASekd5rqbu3sxTg4yYrM7D+oYAMJmht08d+UGM3l3Dw8GoOIDhx7j\n        byyd4VFbe0ImBFYi+/YffI6/163f0Lhh69c9eD7V2/tb0ATHirrHNP52dHLa/7cBoMLhzG6AFBdfpKun\n        l41C4LmlpcVmaRlpy3vVj0hzexd96ep1mFwvgU2TPDAZ2b8CAP9rbW259WLJTQag0LCws/C83PclP/Qg\n        OFd+KO3F6w6ODkUIMAtASnpGadHuXffxnn9Q0HnQHJfPDgB8x5Pi7jnlmo+vby18zpI7bpxyYH1TC3lQ\n        W9+bt3otYwqOjo5FUN9Q/lcAXL1ZygAQEhp2HhIpEwQStWjpipUNeEyaP+86bpiwADQ8a3mHAFXWP+qH\n        hfh6SDQAcv/owQhOE47joJgRgyp75sLFl7FxcT+iQPGJiVegND7+/wMAgBmGQKKdOzi7XsExd+0tbgA+\n        UWUBuHj1evfFklt0Vf2jHuCAZElJKavPrgFGxkbpFVU1r+sbn7w2MjJK9gsMWo9Clz2o6tl/8FANnuPE\n        x4wRNfhXAICq/6EBmlqaySj8k5bW/g0bN5XjSt8ovd0BIOuzAKRlZlXk5uXX4zt8/PyOf1YNwNVBgoNv\n        czLvVn/gAPh8ZVNaZvZFPEfPgCqMEy+9c7cT0mJ7FoCQ0NCTUAJTZ0kQn/ec5LG7sr7hDwBc3Nw2MUzf\n        1kHQUyDhtrR3UmACjiwAS9Izb8OHVpWfnQNAGMvTl0qYLzhPnDnLMDV6BfC96UW79jATKtq9t9HJxbUM\n        yRBdIZjKZBYABO5BTV07lLm9WQKtftjIsDkCZu9gX/zl3MTD+Lu0rLzXysbm8gf31osbrjHFB79pxntD\n        BgD6aA0Nza/SsnN7i/6xh8or+KoX9vfOCgjw20TFzCpLWrCkLSIysgQIMWdu8oLW/IKv2pSVlWJj4xKf\n        4T3sy5aveCozViY8LiH5KXsNj8FhYTVCQoKzAoKCjuHvlNSUGgAqfnZcQlNObl6rpqZGVmR0VBXeCwwO\n        /B6CpVN4bmdvfwz2E6xxPNDCVkMjox1/mxscjAywlI0RGH6YhF0HOl7DlJY32PELEMzn8TeSJH7Fxd7D\n        Iz6L1z++hs9LDXb2OqbKOD7+xqPS4Dm+n30f/g9TaHY8fO6/soYwiP/IYQSBEQRGEBhBYASBT4nA/wDz\n        galotLtVDAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"pbAmarr.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABCfSURBVHhe7VoJWI3b+j/t5rnd3lua5xSNGjRrHlBpIJWi0ohwIg0qRaQSytRJSpGpJBnCOZzj\n        EDokh5JZjoM/7r0Oh2Po+9Z9333b/bueQ2Ef9/7/T+t51tO3v7XWO/zWu973Xe/XV18NtSEEhhAYQmAI\n        gSEEhhAYQmAIgU9DQEBAQBC65Ket/rRVDAaDDSsFPm01n1c52I6JBZIqfCY7EDkJHU21uTBJdKCJf+n4\n        qJEGjg4WxpXARPkvZfQnxE31dQrk5GQDYYjxpXn38Zviad3CZrMy4IXElxZCSEjIauY0vzbgy/rSvLn8\n        REVFHDcuCqakpCSj/kO7IFG0MKhHWkoi9D/CX09NYU161PjHsjIyEwe7A+C8BIWhiUGTlpaWwS7X2yQk\n        JCRxDOcMlt407xEv/b3tDsN86cGu4ds8JzOVq4tmBjyRlZVx+BBRVAqVY0HT1tbWMTAwGDlmjJW1nZ2t\n        ff+O73F8GDQARhrXDSRsmJvWy/SZ036FeSMGmsvvcQl/2+FUVV4AzeGwg/6MOO4kKqKkrKQ2caJfeF5e\n        3orqmurdR44e/amj4/J17J1XOq93dXXdwH7ixPEzNVtrdhcU5BdHREREampp6g8AgkRauBm1bWUCBfw9\n        +a3gB+lB3Gd7jWZSa9MDKDU11dnwu/9uCaiqKNkmRgWXpCeFXNyzNplqLp9BWuqyyKXDmeRx20q65/cd\n        9NsXjfSbl0co+h9ryJvnP1B/vLxLvXl19X/771fpny+2XQueElykqqrq8a6jFRERtsyJsaIrcqZSggxG\n        xBf1A1wALIb1ZEea0u5OdtVwpGVRQHsL7YLlszwepIYY0NHuCnSctzKdFmZIF862o3fme5Pz+zNIx7eZ\n        9Ot7K0nP4xJCPa8i1N9KCYLx9tlhLjDYqadlhH5SQKh7i0jPw0LS8/IM3dXV2h0YGFgEfKRwd3TVOFmF\n        saPImrk2pBcAoS9mBTwLQAUr8uMei4uLawoKCkqY68pdnzueQ8Ic5GheT/BgkQWBamTjfCu6eZ0Paan0\n        Ive+jyVv7mZxFeQq+2wDV+G33RnkTWccubbHm1zZ4Uk6dnqT9ho3cufbGNK1L5hev9jzESg5FsH+Jtvn\n        yfoFDmRlki0BecK/qAUg0uZaEi9QybUL3YipsUExCCEN536sh4nMyygXeRqBQOVTJ6mSpRFa3N6QZ01a\n        ayaQU9WTSVvDDHL5UDTpOpZIbp1IIA/PxJKHP4SRO83BpHWjFTlVrE+acvTJkVJXsjN7NKlINaclxUSW\n        A2sFDWX5OVuzLMmKxDF02jSr58B73BfbfR4jjqzofgQgwVuRbliX/Lu0lJQ9Oj5ZGam4STay9MKJCiTK\n        hUV7m0hTFtqSdxXkhM/JSQrtHc6Rr9DWUCnUN9BfbmhkmDpylEGqjo5mkYoiZ7WUuFCtGkfkpKOh3N2U\n        EG16dYIeOVDiTVbPtaRkJIXLgbcBWJpq3Sq/J5sWWtFfB+nSLhZqN8FZ2n5sCP1kwDCGQxYmLCEqtMDZ\n        UIpCEIpmmtNby0o6IILpw3GQGjaME8aSFjopJMgoAUaYqGCoVAch2RAYOBAWZZhMJkdeXp6NHZ8xPRAR\n        EcFLFQfnomeHs53JkhY8LCosWIjKw05LVRZOunhsvSudH2dKzw82oNUVZRshldDj5RMfk0d8NAhSUlKc\n        xISYUnUNdT14HmaiKf0bOjs0+YZ8f7qubtPPOjo6lmw2exgopgHKKoJA743nHxrrFQ4dGyY5TK7ym1JP\n        3z+dRLbnOpJFIRokyF7pGdAIR0DDQiavBquyRiA+WrHBLpjkaXqw+2wd7eM7IUNWVpbJYkqvmO6uTM/z\n        VSYls43oS01R5McTTbecXZwDVNVU1VSgoUCY8eG1ebB83p0nIS6u17ynqPP20Sj64BpPsnKWBYnxUqJZ\n        MmJHGAICJhqaGqa7iqJ76nZtbYdkatRgkqiPloUpKxm2JG4M1bR2Mmls2HwV0LYA5OXVWFLXpjlz6MWh\n        6mRnrjV94/gs8vDO6d/TM9JLjU2MLTHDw64BDbM8BISX9qKgeJw+IIyQg535nK7Tpc/P1UeTA2u8uWEv\n        I8KEdjRm/0/v8RJ2Hq363cq5jvTtC3voyKjppYqKiny/ngv42+ndneevQX+T5kDuXiynI6aGrB0+fLgK\n        KONsrCr6Ii1Yi2RMUia7ltqS1i1e5Nndavrmzev3CwtXbIJMMKh/2msETU9PbwRaCAiriKCIioqK8YAA\n        s5aztjabda659N6x8gRSl+9KqhZ7kMIkBzor0pwOsFd90esXFGRlJMKiPFSoZYm29NHK2fTV9nNPR40a\n        5Qz+ROSjd/l9C0RFhAJD3bTeoNdd87U93VToQILGmZ9QVlYehWvAWfk4GbNe5EfrcY/CnsVG5Ob+QNLz\n        WzX9+tUD6vWb19RP585erNhcUZuTk7U8PDws2sfXhwuKk9NYLzc313FhoaHhSUmzl++uXf3dlVM1rxsK\n        3emtSzzIqtkW1JLYMXR2pNm/lLcd/lJMWHAdsNVD3pLiIgtdjVgUyrY8wZo+21RMh04JKgcfhM6UP01L\n        hVUe6qTYkzhBjc6bYUiHeRuCx+dMhYDAzcqgMeAs+lrpSj4qnWdBt+/wI79+H8lNdF4/v0Bhlvfq5WXq\n        9YtuCrM6bn96lH5+t5F+ensP/fcbdfS9U5Aq74shjStsSVmKNVkRa0hyZ5hxPf0C6LgBLqOH/9arvAHy\n        7OUtzJQSPRrmptGTClnn5lw/OnlW7E8KCgra/NEeqBjrDDsf6qL2NtFXm4rz1X/OYjEzwLENe4cBA460\n        nZku+0JdsR/15Oysf6WzkOlxc/7ebI/qTiGYCt8+HEYu1I4n53aGkFOVE8g2SGzWzzUkBZDeYgKFYCdN\n        1OKm1NPdlGhlpngXONJk4KnZT3meCCqWI5hPcT5aSdbsqb+Ak+ZaJ1+apYHijQgPTS4AeqrMJjivxn8i\n        BJgBgyEtLaWsq6mRnxbt+ehWSwqhHuQSXo7/9noS+duZeLprbyB9Aazk+AYXUp4ymntssC+ZPoIsCtUl\n        mGKjMlNdVCgTLZmHokJC24CfO3S59ykkJSGyPMhR7W2Ul2bPnFC7+yCjI1+URyKm6spX8AjMnTSSgl2Y\n        B6/eW4zERIQpz+To6una21iarJs+ybHjSEUM3X02mfxxNYc8+DGedNQHkOYSV7JlkQ1dPt+UXhlvQDBz\n        XDxVB5RXoT3NOJSWglgHKL4ZeE2GrvhngPdXEI6gqoeZPIUAJAZZ3hcUZLjyDQB9FfYZJDzRSR+LD04D\n        EQYrkJaRkZFVVlaC4KdupqOjPdnIaNQGF2v9Y5nxzs/O1IYQdKRVaeb0hnmmdHGiMW1nIPNIUoTxLWSP\n        64E+Zo+W0NGRDbroaaiu0IG+wstG6xasGz2QnIMeZ0qLlM/216PGORp0wKIBnQsmPeAgxUXFRMUxvAEY\n        GOlYgMYodXV1d29bjTubUq24O58XqU/8bJUwpmN5XQM6Zn6fdLXVVpY7iACY6rCOAQ1Mp/nT4AIyduIY\n        VcrbZjRWYQddAgcgwDIFIEoyhIGGUG++LyIjI+02y0+DC0BmmB4REhTMAboKnyutjqr8fgRAXEx0WS+Q\n        n0uybz1DnS3dFhvohKY1oAUMgitDjSNeh9dZB5PhCKrZINYMOMVQi3PS2ZiJ1oQlskEfnQEJ4wTYJS8A\n        4A/YUbdBLRhgEliEUXKoKQV0U2DqZ39XALnkfawVe3gZIj9kfJcGgy0n8Y2aMhuvpnz5JMWSZ+YCLWt+\n        CMuSk4rWVGbvA1o2fN/9fgJK6agqYGjCsMSPhkDyA0wBdUX22l7TH7Cc/rmCy4BTwyyLv2fsM6QCedRg\n        Od4NeKn5Z1Ab3NL/GuX7ifvfKNPg0ByaNYTAEAJDCPyfQQCKmPIQdvrqdyg4lN+k4fIjD7n+e8MQjEnC\n        xUgO1v9b1gcZnBC8/7fyFb6D7wtsoMlCurju3aoyvJPBcbhwMXH8Q7z5Cm5xcVEF1Hlj+ucB+vr6jkVF\n        K061t7feAAV13mUoKSmpdP16590N60t+gK/Jfv2TH7gyO5SUrGmCd3K8daCYckJCXM2VzvYHWZlpDTEx\n        kTv31O847+MzPg3mcBMdZ2en+Kam+mvNh/b9HBEeuiV/2eIfa6or94uJif51/yuASLecOfmkuLjwFMjQ\n        /39zGFCDC7v9y01q/PhxG97N7uYvSF7+6/07r0xMTXEMS2l9MTs7O2NT94PuP8TFxfCjZ18TExfTa/+5\n        9S0UXhfCSzWoqEfdudVFKSkp8T6ECiclJzXm5eWehXEzsBDdJYsz2opXFeNV+K/5v6GxYx2ipoRMruvs\n        bHspISHu1F9gCwuL6Tm5mW1nz558AvdfLJlxG4K2NG9p0+767b+MHm22Cl71HQEYY6akzN9Xv2fbU3d3\n        V6z09qXFUG7XaO9s6wGFsQ4IhiXE/OlCa4+ZmWkBb15q5sLGgoLlZ+A394oeHRNZ0bS/8R486veXjW/P\n        mysrjsBZ896ya8tDT0/3sv4CBwT6zxxtZpZ+4FD9M2vrMVkwxjVVsIgFRkaG6Xv21v9iYWmxuj8AHh7u\n        SaamJukeHq4VDQ11XTDWd8d4FwD4lODWcubMU/gkF98fgPz8pVwA0G9sq61t8Zvo2wi/+VcM4aHHYskb\n        Z2Vl7oPqjuXXyXMq3xU4JDQ0ZcQIvSQn17Ebv//heDcIpIrOsmJT2bdAY+yhw/vv97cAdGpbqqsOy8sz\n        J8FHEs+H97tfQS1/Eo8fAnDxSntPVHTkjtjYmMx9jQ1n2RxOOoz31SPQAvbv33tr/HjvtPr6uqbg4ElY\n        PMVaAP8vRHPmzsnPzspoSUyM3RsWNqW588q51/0Fjo+PWwblrnhJSQmzEyeO/gFfZ9Lt7e3i7exssDqj\n        iADY2trgjY17BDgcjkV1ddXl+LiYA9OnhzdUb6t4FBgYUMXbXZ4FmJqZlhqbmZS1tbf+Brvv09+cEYCy\n        8vU35ZjM5I1VGx5Pmxa+Hcbl+GbyPEK4k7t21bagRfeam1bhqvxL/QXOWJS+HhwWRgehqPioww1767q2\n        b9/2HZxdbnUGAbCzs9vIA2Bp3pJyXV0ddHBaSNPKxmJNr+Xg76/6HwGwFmZmdmr7unWlJ2Coz8EhAL1H\n        QAuiS1RH56VXYKkTkR9fQYAzHRQXN2MvEO0LMeZW5rntF1qfoPdFZiWlq+sBgEQEAD6aOJxsbemZMH5c\n        ba+CX313/Mj9sU5Om1A3AFS8ufnARfiLgHKFhbhv0H7p/FsonOIZZwAAatdudfU5QbA2/1OtLZSv74TV\n        MM418cVLFu9ZWVxwHgFEvtFx0aeOHj10DUDngsiX5unp4V++seRyTm5OK3xtseoVlp08f96W3bu392Rn\n        Zx4MD5+asn1rxa85S3KOwZk2hzmCEZHhB8FhRmCyEhI6ZXZ19aanZWUl3UFBAQtycjJrd+2qeezo6DCf\n        B4CXt9fUivK1/6iqLOsOCPCfy51TX00vW7b0NJMphzQZGloa6Vtqyv/u7uaS6evnM72qcsOD2rrtz8DR\n        YlkNC6868bPiO1eXFJ2D/2TlWz6A2Z0FdIzTWHjAHcOOz/gOP0DgtzosbeFvZIzjctB55jq8dxznYojE\n        jnORLi975PHhzUHLwmfsuKNIE3d+ZC8t/ESG673eoYPVZXvo6Cz5exSA4FAbQmAIgSEEhhAYQuD/EQL/\n        BEXWJdoXTfdOAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"pbBloodline3.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABXvSURBVHhe7VsJVFPX1lYGmQUEFJF5hoQxgTAEAiFAGEIJApKigKYMQpW2PMWKWlppBUXFyiAW\n        5EmLVqxU4eGECBWh1FJELFpQULRFpS2+0v4rf8tba//7XIblgL7Gqf3X8q71rUuSc889+9v77H32PocZ\n        M15eLxl4ycBLBl4y8PdkQFFRUUkOr7/n6P7LqJQUFdTMjPSXMelmGYqz5HnYXCpBFujpMvx92NmiyFcy\n        LMxMaPPnz9dTUlRS+tuToaSkpOPFds8X+HN6NdSUd+CA+QgdaQcuKysrp6aqYurOdMz5dE/hUN6mDyp9\n        OBy+gYGBoRpe0vb33NvLysrIebk6Zq54NWjU2mTBML6wAMGYOXOmVJp/cKAKCgpqC/QWCD54Z/VgX1ej\n        5MPtW6oD/HkCQgSS/fewCE0NDct1K5d1xQr8YUL4XBTE8FmxTqxhro42663XE7uuX70E3efPDWVlZeV6\n        enqyNfF6Vu95on7MDecJ1ywNG+UxLYBuoivBTvIRek/U2WMeIs7Q0NCQtWHNysEf+r6B2zcHxvZ8VFwT\n        GBDI/8tIsLGyzEiJ5ALb3gSY1vpj8nKyNc9S8w/yQUig2VgIygo3Swb7upGEq3Ck5sjZqKgoEXGSLzRi\n        0EwNMmL8PcDDzoSCpqZGFw6Y9aw1/2B/KioqavxAXn7jwR0w8PUhuHPzGvyr5kB71KJxEp73+6n+F8yb\n        KyLCM21MwMXWCKyNKNNPf1qH92cHr6amqrNymbCnrW4XXGirg6Fr38En+z5pCgoOEjz36aCro8WIDvCW\n        MGzMgGahB454V5gl3/A8TX86YuwsjJd9/uFauHiiEr5tPgT9vZfHtuS+X+nq6sp6btFBXl5eKSaU12uj\n        qwGO1sYUbM0MiPaTXpT2J8mQk5VVW8Tn9HZWvUuR0N3aCD0Xzo+mpKRkkhD5Z61JqnZmpib5XBc7cEbT\n        d0IwaeYwV0uTzH1LqTp6Ro3NjY1z6t4VQ+fuDGg7mA8X2+vhcE11T2AAT/DMF0sa6uqWkcKwMSbNjBKe\n        kODvyQSM0aUozxOtzIjXJub6pCYrLytLKxCHQfO2NGicIKHnwjdj6SvS8i0sLCyfaVTwcLCs5LnagCvN\n        Eh2fOdAtDMHH1X4MhV8mrUKJdjCmGzLw8sGLh5cDXtIOmEy7MDerwa0pYbB/gxiOb02Hr49+Cqc+rxr0\n        5njzSTIl7dimba+hpmoa4EYbI+HOnW6NYc8GGGj+iEF8gC3NS4iQXK4vb98nldWnGk40tbW1tZ87d66j\n        oKCgyN7e3kGavkhbO2PtmuQQF3j31QAoy4iFum1roK/zLERHRWdraGg8m1WigY5GLsfJcjzm25uDh6MV\n        8DycwNxIr0Na708IEIaFJl3tboa7Pw7Ab6P/BolEAidPnezh+fP40k6H2coK2RFeNpDE94C3Y/mQnxoL\n        jeX5sGbVW00GCxY8G9/k7WAxxHGyAk97UyQB4WABIT4s0JurVYcESM0yw4EubDmyG65caIZhjOGjP92B\n        g58d7PLj+UlNgLKCfBwhINbLmSIhQ8iFwgwxHKisGFmgv8BHWot6qL2CvByL62QCXqh5LwfUPlqBp70Z\n        LAzigo7m7EpUqNQEGOrpClr2boArZ/4JN843wE8/9MOej/Z0EHeggxdZzExexF9MOsp775MDnaOmLPB3\n        oYPQww4WsR0g1o8F6RH+cKp8C1ibm2TNmjXr6fyAhqpiFiHAEzWPlkAR4OtCg7SEGLC1MCk1MjayNDEx\n        MZ0Ozs7OjEmQBQr5m2ZrQ/P1ZovaqjbCt8eL4dpXtXDn2kWKALFYnBoSEiJ4EH5+fjzyvJ2dnYONjQ2N\n        gLxPW1tbx8RAX0gIELjTKESgJYiD2FC04Q0I43kdU1ZWlroWcZ8VWBnNr+W5WIEv0wa4LjbAY9EgkseG\n        NWlLoaJk2+iRfbtHDiOaDn9K4fypzyn0f3OSwmDfVxRu9neP43LbyOC5I6PXj24DgoGT+XCjbS/80N81\n        1tvdOnKtuwVxZuTmxSYKgxcaR662fDby7ekDIz2I1poyCkd2bx6pLnx/KHtl3HCErzOEeTkA35UOwSwH\n        CPdiQEbMK7A0xK8X6wmmTzUNmDZG/QGu1hDAsgF/DIPBbGeI4HqAOCqYQtqSCAoZibEU8leLoeyDVdC4\n        Yx18uXczXNqXD1fqPkJByyh8f6oYhs5UwI2TBXDz1A641lQIg2fL4Pq5j2GgDducLqRw4/P3KVyt2gC9\n        5avgzLYV0Pi+GD5e+xqUvRkLqxaHQhrOdyJ8hK8TBKLw/gwacJ1QSc40JIEJaxYvHJWRkZEqSj1EFo9p\n        DcFudAjCe4CzBfg7mSPTVhDoZgt8D3sQICHh3q4Q7cdA02NB5kJvKFzKh7o10dCatxQuFafB1coMuHVk\n        A9w+lgN3zmyHn7vL4E7XR3C7cxd8fzoXyciBvhPrKfQfy4S+/StgoEgMl/JjoT07GhpXh0N1mgCqkoNh\n        29JQWI0p+FK+O0T6OEKYpwOlHB9nKyCOmuNgSfmqQBd7WCWOIuuUqCe2AGRPj4sdB7PowGdagZ+TKfhh\n        JAhgIBE4LfxdLCEA76EeDhDJJXOPhV7Ya4qA8zuTYeDTTPjh2HvwY8t2GOkqhZHvKuHulSr4+eoBuNVR\n        DNfrs+FSRRqc27kU2rfFwXf/XA6XSxPhYl4MfP1OODStEUL9imDYvzwUSuL9KOHFQR6wCLUe6kEDHlon\n        29kU2HbmwKabYW1i3FETS1gRGwYofOoTE4B1Ppob3Qi8HdEBMmwokI4poD8g8HNzoBDCYUI4zwPNMgDS\n        o0Ngx1uL4CCa7JcVqyh01uZSOH90Aodz4Xh5FpwoSINDm5Kh9G0xbH8jFqrWiSnsyYiHwhWxkJccAxuX\n        LoTM2AhYKeRDVBAHQvFdwRxX6v0eOBYCJ1ycOSOcLHCZjiCr1XBvJiEg64kJmDlzhqaCglyukpL8MX0d\n        9QaWneXZQI5XO9+X08HneSM4Hf4cTwqh3HFE+7pRiAv1pBAVHtgRiYgO86cQK5xAON4RYmEgheULueOI\n        GEdy2DiWTyA+iNtBMPkePhffz8X3490f71xfbwSnw5fDaadbmDVh+GtQVVE+9lRTYII5NXmM9bZW5vyd\n        m7Ph+L4yCs3VFRRaasbRWVcJA63/gkGM67cut8Avg+3wP7e74PeRARgbvQV/3L1E4T+/9sF/fhtA9MLY\n        v7sRPRT+uN1J4ffv20DS3wg/X2iAOyREtp+gcPXMEbh4fD804jsJ9u8ppFCxM59CyYfjOFBWCFbmZkmY\n        pOlhrkDWKE+UqD1kNTpamjSBryusio+EDcvj4YOMREQSbM1MhK1rkqDsndehatNqqN+aAc173odLNflw\n        /YuP4advD8Hd7+rhl/4j8NvNRvj9p6/gj5874X9vn4VfLlXCcOtWCnfP5FMYPpYPQ9VZ0FO+Hjoxy6td\n        l0yhfP1KyF8eC2kijDqIWAGXQgRWpgiCfceRniwGVVXV7Cc2+0c9KCszExcdmiBgmEOEOy49MfzE+7tC\n        Mp8JaaEsWL3QE/Li/aEyORDq18dCR/kKuFS7Dm43b4afviyAn89th9+uVYPkbiP8NlwLkmtV8Mv5PLhT\n        nwa3asTwQ3UChaFqMVwtEcHFjUL44h/BUJ0QDBWLAyEvxhfefMUT4gPdINyHAXxPR+DgAsjd0QbcHKzB\n        1c6SuouCvcm8z3zmBGBEkDNaoD4ajKvCEPS6UWw6RQARflWkN7wr8oWcWC5FwKGMCPiqMBkufpYJN46/\n        C99jmLt98m0YvVxBCf/LzSqKgF8vFsDIF2vh1uFEGNwTA9d3R0HfzmjoejcUTr8RBIdf84PKJYGwPdoP\n        cqJ94I0JAiJ8mRCIBHg626LgFlRhhtQpWPaWEBPkRUJf0jMngHSorzm7J9jFBMI9rOC1haEg9HEfYzMc\n        JQQ+9sYUwpkWFOIDHSkkhrlQSF3oQeG9N4IlhdlRY3cvF8LdrzfBjzVvwqVdYtiX4Q+v+VlLohyMKfjb\n        jsPHahwuE6CZLpDQTPUkxgY6Ev35WhL9uVpjdqaGVJHGzQ5zFD/3URyq4LkQoK2qXEoIeCMmED7euRkS\n        YyI6TA0WpKooKYlmzMQFB8H4woOCnKyMiGRrFBRnUZDF752s9WrutuXA3eb1cOvASmj7IAbiOJbDuIeW\n        rignG0egMAHsR3Rvnw/+rTBLLtfJfLxCxSbJmoM1qVFIXVf4U4TNkpMVRWLG9eFb8dDWUAtb3ttwlkaj\n        MXC9PW3GJScnqzNfW8NnrqY6T1tdjaerpUF2iTWt9TVzrn6aDtcPvgndu5dDfXYsiPju/VhdZs3VnI3t\n        Z/Mw0+TN09LkYbb52Fo/Zquiyb2JBFwdGhoakND3dAnQo9jAsKKDaafko7VJcKG1Acp25ne4slzZjyo9\n        oWWwIrjM6hC2Ux3fw6kuKsCT1A8c9LVUc8/uSIKvS1Lg9KZ4qHozgiJAWVFB4OVgvc+PSa/juNjXhXDc\n        63AjhP+4ijNuvadPEvCP6AAy/3PQXz1dCvw4c6CbGVRX5ayEvvNtUHegst/Ly+uRRQxtdXXRtuSQkU3i\n        YMmWpGDJ/neWkBK6yERXPffLoteA4Oi6cKhczodoX+d+NWWFZQtZtJElXA9JHNdVsipOIFFVViQruUcK\n        NEdNJZ+LS98AFwsIYlkNYVtiZc/vUlFSZFdtRAI626C9sX44NCRU9KgS9FxNzaQy1G7xinBc1obDiW0p\n        1NKUEPBVaTK07RTD56sFUJLgRxEwW0UxPQpzi0WY3JAKT4YoCNTR7zyOAGt9nQZCwKoYb9BQVSJ7k1IX\n        aKRiS0ZmptwrYUE1ly6chRsDF8YWRi7MfNQUwP3CpNK0IChMDoCiZC6c2iomBGQbIQEtuxKgaftiqErj\n        QE44EyK8kQBlxfRFKMxSRxMQY7jNWxSIQilXPooAEppdrQ0kXEesVFsZkTMJgheyQaOlNYdWuiNnZOhG\n        DyyJW1JENiynY5EQsGkJBzbGekP+Eg+o3Rg7RQAR/uT7MbBrqSdkBTlNERBmawKR9AkCoh9PgIK8PJ+N\n        bf2drcncJ2cSnq/2J4UkBxZcmYxlJ+trx4p37ujQnTdv2uorHpxIenuhE6wROsOqcGeoWj1OgMEctdx9\n        b/JhVwoXNr7iCiv9nCHEhdavqqSQ7m8+HwIs5wPXeD6sxMxPTfnRFmCsq7HP09pwTFFejnj+Z1MB/rPz\n        gRQbfbzYWe0tTRJvL+/U6aYBIWA1Cp6OGk4LsoGt4gCKAF11ldwtcWzYtNgT1mFNPw1z+0kCPA3mA9sQ\n        CTB5PAHqs1Ut7U3njagqzmrCPtkvxPQfJAc3HnT8/XkZb6/NrMO9+Yc0QKZApIcNEJDCanygM0UAOqvc\n        eH8mpIS6QSwWNQi8bI37ccGUbqY9G0wRNrpzIcKJDipKCtP6ALqedi5qnpj9XyP8JBkqKspq+gb6jNmz\n        Z0+3I6unKC+TLS87o5KCzIxyylHh+SFc4OTgbjN+Pw4SHWRmzrTEpCsDV5DkcyUuvCpRs3HTOUHSFr83\n        /Es0/2enyUQ7EsOncM+A7/v+HiEf/P6pTplJOdaXzV8y8JKBF8DAk+wnvoBhPfyKnJyc3HNt57qMjYzJ\n        IQgqIdHX17c8ceJEE2aBqXp6euzOzs6eyspKshCZ2oIia4QD+w7UfHH6i/Z58+aR4sSUI8OTGww8x0O8\n        /H0pa0BAQByuJRym8+rZ72UXHDp0qAlzDjbPjxc30DcwtGfPnrNk8cPlcuMaGhraS0tK65ITk3MSliVk\n        Z23IKtqUt6kco9NjM8n/SioKmXll4MrUETiyt7+/en+du6d7NT5Mih6aLc0tXSlJKf0kHt/bYUJCQtGV\n        K9SzqfcKVVVVVd13pU+Cq0nhve29vb2zh38cHtXS1op6kAQGk5G6ceNGUuggB681SbtF0Yu68G9S+NAc\n        ujU0wvXlEkJ8EDTyvbq6etzRE0cHRTEikkw9WX3AzMxM0NzSPIIdxJHEo2R3SaWVrVWpjKwMfzLnrjtc\n        1xS3OK4d29y3DnBxdUlvaWkh5SlS0aEuM1Mzh8TExLra2tp+zCJJ5jaVQxACCGFXrl0Z1dbRFt1Lgp29\n        XVxqamoP0Tjph1hdhDCCCEwVS/CESZenh+d9mSB5Hi2KIflVIjHQN8jAZtKHU0JAS2vLiIqyihCPsFTS\n        bemETd69g9tdvrta9KpoajCTwtJsaFEHPz1IMjSiNerCKVWE+/4ZpqamcR0dHYTYKatBDWb7cnyPVeyt\n        6Om92juKpe0p88VpI0hKSerAkhs1zVrbWjtwKkxVfshnpguTWOV9yRAZZ3Fxce3arLVSn2QZ1xgS0Nbe\n        NlpSWtJhZWmVKycrd5/wpI0Xxyt3ffb6LjqdHmdubi4ggyVYkbaiqGRnCSlQUEKiQHolJSUNWELLxN+j\n        Ll++POTh4VE0aQWEAHc390ok2+fo8aP9tfW1/bJyssScZ5D+CnYU9CIBVK2vtXWKAEpg8tnKyooo56Fs\n        EI/d5BypPUIUIf0uMTo8H3J+h2Dzls0dcvJyD6332Wx29ieffDIcJgir8/XxLXJhuuTg4a/sxKTE6tKP\n        SqcIWLx4cU5UdNSx8LDwamG4sGbblm096CgHJ4UiBFhbWpN/sNDBkyCM9vb2wb1795KppYdTR5CUhBYw\n        UewkGsdTYKS8Rk0B8tnQyJA8+1DliI0J2+G6w09WKdbV1WU1NzeP4Ln8Y9euXRs9cfJEPw6Ode8UIATE\n        xVE+gEEGP6EFTbodPWpn8U7KOZL2W7ZsIQMmjpP4Cj10gpYjwyMjOnN1ssjvIpEoZ/68+dmTQqC/ZeA0\n        +eGd9e800Gn0ZRMEjE8B1Hi4MJxkgeME4GdLK0tiTQ8RUH+8viEyKrJrYnyk+Z+/8BgKH4+xkbkqwsTF\n        Z8OGDWeHh4dHzc3Ml02SkJ2dXRAfH/+QD7C2thbu2LGjHzXMptnRRLY025zJOTw5AhSqFP0CNT/z8/PL\n        kfApAkgbLLTwcKoM19bV9txHAGo8KjJq6p3EAliurId8AE5LdldXF9E+yRql3yM0tzAX3rhxg4QykpGR\n        S8+F4VLw66+/ji1PWV6O0cBw+/bte5OTk4mHvj8KuLiknj59eniWwiw+Ro9qFF74YHjDs5J8Mr3wzE92\n        ya6Sapw6Uz6BvIy019DUEBLre/3113vxK8oCSBS4l4Du7u5efiB/akqQNkT41vbWflQEIYZYp/QXLkCK\n        ikuKBx0cHch/gUyalxp2SkLccH19fe/Jkyd7cVFCYvR9L6moqKgm7Ofm5Xa8t/G9Fvzd58ERzJkzh1ZW\n        XtZ1oPrAIInZSFQXtrnPzxASDAwNlk2GWjc3N3ZeXt7ZdevWEdIdSB+lpaUdpbtLBwsLC+u2Fmzd+2HR\n        h8cSliYc09LSIhb1VPUCPdQci8L9cZTEVOJVySpvEg9uYBAPLpzYMSLCT7cYkcPfaQgSKkk/5D7dRgh5\n        H4kAxIyJIsjfZEykT/Ib6YONICVxMi7yPqKQF1MjfFCzLz//P2Lg/wCxSGNO2h2DdQAAAABJRU5ErkJg\n        gg==\n</value>\n  </data>\n  <data name=\"pbBloodline1.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABXESURBVHhe7VoHVFTH+o+h7tJZ2tKWJm3p0kGKCCi9996rNEFRUAgiqICIUsSGSlQklvhsCNYo\n        aFSMsaAYTWI05kWjUSP1zuU/3z6WsxBMjv8HPt87zjlzWO6dO/N9v/n6zCeffGwfEfiIwEcE3iMCwriJ\n        4SYuLk6Txk1itMH/vLy8fO+RlPe7lKioqJiHh4d3/pL8wvr6mo2bN6/f+uWhHSd2Nte2NjXV7ywpKVqV\n        lBy/wNjY2FxDQ0PzfwIQGo0mERMTlLBlff6Rk/uLX7XtTiEO1vgSTStc0ZbFTHRglRXZXjefPLXZH13a\n        m0LcPb0U/dKzZbj9aF13UdGiCmtra3t13EBg/qukAxgvX7Fo7cl/lD/dWmSPKlPVybIkLbI8UY1syGWS\n        DXn6ZH3eLLSzgIm+KDFERyqtUNd2b/TdFy7kjZ125KMjXmTvfh/y0d0dr2trV+92dXX11dHR0QWVeb9y\n        +46rwS7FRQennt1f8nhLsTMqiFRD+WGqqCBCFS2PVicLwxVQVZoauanQDjUvn4WOr3cm2+s9yMNVdmRH\n        JZO8vnUWeXO7OfnPo44jQzdCRl53R5ADr+vJX3/tfrVy5bIGkAhF3D5IaVBUVFBaX5p0aGe5F8oLpKMc\n        fzrK9JFESyPUyNwgBkrzoqMQBwnClCk8qCrL+1pLSeDhzmIrMt6N3m83S7LfxZaOiuLV0PVtpiODV4NH\n        iPvx5ODLKnLoVRWCPvBmH2o7ceRbd3e3QFCLDwoEJYaCytaKhJvVuTYow1cWLfAUZTGf6a+A/GcLE5pK\n        fH0UKs83WKDKcY/CXUtVSdb9i4p5yMdJ5/qMGTOsqBReJ/zcW0RUoMHdSqrnwm4fcvhFKQIQBt40IwBk\n        oG83+d39b34LCgpIB0P5QYAgS5eRqy/2u7MyxZhM91EgsgJVCQAhZp4ki3EeXq4TmDF/3OU4NUpjppLp\n        yQ32pLejTjeVSpXgfMfDwyMlQOULC/fUufbD9RKyb6Ad9fdtI1l94CALBG9vz0SQhHfU0qkdLiQkJFyV\n        53B3BWYeGE/zUSKinMSJ+WYChLAAVw9eLZ6Li0toslUBgI5ap0kBgPH4O25hYSEpBzuzNcdal7zs6ztD\n        AACDf9QhFgjfXX1mb28XDO51arl6h9niAiw+Xx6nj7ICFFGarzIR7yZP2OnxD3Lz8LThaUz/aioA4Pg6\n        GzSZBHB+JyAgIGhhYR70+bqEh30vtrIAGPitjhz6Yxtqazv8PbY9zHcgeeqGWpsyYwuiNMm8MHWU4a+E\n        guxECVMNvsFPP51xGK+i+HcrsVSgzvlvAYB5sIpQMQieTZWxD1882YAGHlSQ/T1ryMHnR1FEZNgOfn5+\n        gb9bb0rfCwhQaVnBzMfAeISjJBHnIkMEOEgTo/o+xjzWZcrbFgYAbh8Me6sKsBmHIAh+i+AGIOyoin76\n        +7XPyIcn04nHJ6LQ00dXhuXk6MGf4jalTP7VZB6OhqX5kTooI2AmEe9KR+4mfGydHxN7UVER2kwGLQXP\n        MykIAEBXgyHpaa9+baIRZK9tbWViHxMTuISt5yAJZmYmUfsqXNCtwwuGL7cmDz+69BnKzE7vFBQUlHkv\n        AGCguX1mSzxL9GAQYOn9rSnEbB2BPjB4nAT4OM8qpokJFeDxkwKgrali9qgrAfn5WlzDei45GfEUCoV6\n        +tjqHn19PVf2e3jmaK3TcmSDB4IgCsLon+43Efg5eJrpb+Ym+iFhDmJY7GVZFh8AoPLNODHR2qcH6T7F\n        1ORMpAh8N/YeQrrMmWa/nnInU4KNexUUFHQg+YEO2SLnN6W5DvviksL34x0ee47HqWX4K7/aX2qEdpfa\n        kF3bfUhHB4Pj3Nzcb1W5KUPG1kDsKOg89Jh5UsRsI0nY/XHoq6spmRVGayH8fCl7YYjjDXGLjY1JyMvL\n        y69cvbABAp3GzbVPsrKyVqSnp2d5e3sHGBkZzZKUlJRif1eeaXN2VVliL51OV2Y/w4HTDE0FSmNNziyy\n        YZER2rp0Ftq3Ke0Vfq82ZYxONhGIv6c59WWgjdAoAJKEjKzIt3jsuCDHUF97/uoFxkiKLt4gJirMSEmN\n        zLxwsqF76NU+NPSimRx8UcUKaoinheTQb6Xk4Gvs3wevooHBXvTw0d1fy8rLturr65oDo435ps8rP4t+\n        IiUtNS7okZGWsE/3pKG1aapoY74ZebI5bZibm2vBtAKgqqpsCuIPoh/tJEZkBqjALkN4O64xtdTsiyLl\n        UGG2X4+irHjQ/nIr9PRMAhq4nk/2nfMYGe5NI192h5O/tM0ZIW5HjKBHaeRwbyI58GMJOdwTRz66vIDM\n        jjO5LSdFTdm2WB2Fuuv+zMX1qcbEdYLnSD0riVEkS2KVya3FDkhRib57WgGwtjSOAMMHop8TpIziQvQA\n        gOCJi/Lx8QkXRCije+cLkZW1yRo7C82mA9VuxIE1dljn1ZCdodgTPRWBXnU57mtaigLX4LfbbNknuWHK\n        xPYCA5Qbro5EhXj3lKca3G3M0yaNNMR6sdn4k5V3MpU6vTJJmywIV0RlKfrEbEv1ThwTTF9k6Olitwys\n        PyQ56d7SyG+e5u+Y+VmcACjIy2oLCVHVHUzlzlz93I/svbH3lbW1ZZKOrk4p9mJrsLEMx+O1MEhy4P6g\n        YwMHeT4D9/n8/LzF/Px8pVGezDNrkhhkQYQKEhSiHIwM81uMjeWYHYA1FaQoZcujccodykBLwlVIVzst\n        AGqcOk6pRLjNwwC404n4+UIoxU0EecxhPgRG2ItA4FNf6HR3yaKQS/x8PL67Vjqi111x5PPnnUOZWelV\n        2MBZQgID1h4CG/AG0DiJpImL6JVke5zbXmhELotkIGMtwZey0iL1d77eSvgF+JZzegNdTUZOuhfOOnHm\n        me0vh8J9LH4eBXJK+R6bzMfNbtmiECUSACiO00SBLvoPOBGfZ2+UcbzaBt0+tZiQp9OKVOWoNRDvg84P\n        vjmGHnx/89f6hoampKSkdFwf9HJ2dp5niZuVlaV1Vnb8ovqKjGOHqp1QVbomS6zdLYSHZsz4pN7FTOzh\n        8jg91HX52AssBWMSZ29jlpzpK42ApsWhKmSwh/ETTKze9HCPZwUAYCEocKxZYEROBCA3RPVSR401Kk7Q\n        GcLDi3CnqMpSao7WOCLiQcq/rP7zTWj4dTvqe3Vm+MH9oz//cm/37z9cKSfb6txRfaYiqk5VQIuD5ZGZ\n        Bm8fziv24jmkRYX4lwfYihKn9+YQ6hoqn2FvxAVMAj1AS16oGoK/3k66j6cVAGcHq5wEF1Fc3lJDFen6\n        5NJMv185RW51isbPUNOTEOE9j5/TgUiIBAUp3DkpPsrPLm6bx/ICA51BI4OXE8mnJ7zIzhrNEagJflFq\n        jNYkKyN3S0FCUZYfgqhVuLPyAJjDQE3gx5WpxkiLqXqADcDc2frVWX4yKNWbQaT7yhNzzVV+nFYVgCgw\n        1lkE5QUpkBVpTHJPXRSBF7Rki9y6DM2HuM4HngFygIlN2UCDtufnw664MKqLOtbboguNduhAuRnWYSmU\n        4klHy1JNEN71A/hD24khtDD105ysQHUkKS12HEeTLLthbyB6GgIySMUhMTPSFO8dNajTowUqygzzIBsB\n        IhfX/LYsMUSdTT4EZ/CR4qt2vP4zp368+jjPwKZmlq5K1G9n40g5BamzFkzRC1ARrl6oD0wfdjGj3dlW\n        FTaMx/pORr2+rqZrvJssgYGphPdQMPGyFHoJNQjwTDnBmkhSRuwMNsoi08P96Kzzjakv84OlyJ3LjMiu\n        zQ7I1ljxC7wjVHgtKsjjtaPCBULjSQ2Rq6NF1C+nYkk5edkdIoK8rlsWaZPRviYP8XgTF0t617bacJAo\n        98kYAINnqSf6Er/zgPeGelquofbCrJgEQEjxVoRv/xSUTTkYeqpCn6+IFENbFmmg5jwpsmVL5jMcu7MY\n        htB1abJdB4VKiZlsYQCgty2MDYB9VdpMFOplcRN7RAYA0LjKH5jwnuxbpqrYdixtteyky4xJ2x05V4SV\n        lEF3tZEFwzv9GaEghSsk00sIQSZ2ZZsd+epGAWlmYVCGAxpWVQZnZFIKsuKJbwPg3rl4NCoB9nU5usg3\n        eM4tAMBWX+jSprUBk0oATpfF+Xm50vCc2jCvrKyMJuw6MM7+q6Io3ItfyU/5jk82oY+18E9H1pghsPhv\n        bqWRh49vfqitrW3DUaae9JATJODehQUsCRCi8sypzhgPQP3a0LeqAKZjbE4rA5ldsPuQk4D+h7kpExAv\n        vBfmYRG6BCW/tUQffVXDJJ+dDWTV6xfmZX2hra2l+1e1eic7k6ibHVEsCRCgcDsURKqgQH8rlgRYaAtc\n        qi90/isAWPwZ6c0MWODHwMyLEWADgm2pxEyGALhjq/cGANZDgRAH8Z8u1zNHfu9wHoEA5/XrHhQXH1cx\n        c6bazInhLZswAOBGq/+YBGT5SIzZAFCB+qVz3moDWMDLSGkUJRg8T/GQQSD6IAF+9jTY/U1vqzxNGyhU\n        fp75O5eboaGvw0YGe5JY+f3zlw+GY+Nii5hMpg4+9v9TmQsAOFVnNyYBi8OUka+zLksC5hjRLm1cNu+t\n        ANDExeSqF8+9uzRSkwTLD93bgp+gCbPOHwymjdG3TYyNHb+RlnRjV6MtOdDpw8rx2SAkJMYX6evrG3JW\n        dmAeAOBYtR2iy4u1ggqUJaqPAQAS0FQVBHHAn7yAgoK89umWhT8Vx6qhRHdZAvQfRF9HlQJucbKg6/3g\n        gdNWMR97xuVrW03JN6fmjgzdy2ZVeP7ofzRcXV35uampqbUcbpwqAADIykvtBgBWJzLGAHAxF7+4a63H\n        nyQgNiYosetg9vCyKBWU4PqvnYdSvLEabx8W/Ros+qwY5D/W8BmBmp8Do+dmsx35fYvJyODX0eTg7Vhy\n        qP8E6u6+fD8mJiZVXl5OAQh0sDEOPN3oTkhISmwCAJaESCMPByZLBTxny1zcs9odAHDD4QTX3LlznQ7u\n        KO48UOlEZvlKIdB3NvPWOgJwALMDj2XlCv/RBsGPoKCAsovNzG9ainTJp+0BJCQ60EEtXv10AJ376sTV\n        ZcsKViZFeZW1b5iLaBIS28ANlsSqIjsTJVYg5GohcbG52h+lJft2NtQV3tlaaIFyAyRRrLMoET5HgOXz\n        oRapN5MKO78NM/3hXJYAEHAgJKepQmtal2OO7rR6kPdbHcmrm81J8BRXmhzJe4eDyZ7DieTRhhDUWLPg\n        h5KFvidrF1mijdWprzaURDzMDZJHS6J0huNcpFnWHTq4OSi7w867mvATUhJ8zzHjpR/Ezk8mdrgeJyQt\n        LZnkZCr5Y222Fvqy3BjtKdJDjTkqrOswVSlKZEEozvxwNSk/RA7lBsqO7TDsMhg3toEDpoF5Z0M+QluF\n        MsjLz30Rr+n/3t3du+oXLy8Pn4iIsK6IEP86Iy2hp4luNLQqQQF3BgkV3AxvcRYA8fMlWDvL3m0AADpY\n        dwDBzVyUxTi+WAFurhB3pXel5UMYr4x3bJGoMPc5LSXKc0sd4X5vO0nCb7YQETFHALF32BHvsqOJMKGj\n        zNevrsDXJyzG94SXj6sDM5CB+7hC6IfA1DvTMOqqIGOM4ebhquXh4TrCT+E+jU+TL/FTea7g/0/CM/we\n        0lnIJPX+4+7tnbl8hw8wc3xQv2eXxeE3Dq//d2+JvgM2H4f+VyCACxSyEwnF5/MSOBWGetykNzXgYBXX\n        60QpFH5IklhlbXYbPc7i5nyG5xKGseyO/x935IUPYaiwJp5TDDqMw+HIuDmmBUwGg6HS0XHkNqdbwros\n        FBIatLGz68xjb2/XdZP56sLC/FW3b19/HBUddhiXtsZdbPrH4S8vyMnJRnISbGRk6N/S0nSv4+Sh71JS\n        E9qr1pbdaNm74xRmmlV+w4mWXH5+7tGbt75+8llJwZWMzJSO420H789xmLMQbMy0MA+TxsRGL33+4sdh\n        Ol0GIjLORi0rX3Gz97u7A1zcXLacL/DZvvyly+detLcfgoIpuLaxBAbO+2723OpPS0/C3oBn3H3BiOio\n        vc27drzG44Px7uosXJT7bePmulv4f1aCha/hOPTcvT4kKSXZjP9Vw4WWop8ef4/w/0nTAgAmkH/58vz9\n        VetWPcH3csYRDIcVK8tKuvbva/nN3sFuF6cULFyYXRQbF3X+QtepQUyYJydx2dkZK/0DvLuv3/x2CH8z\n        l/NdbFxkw56WXX/gZ6xd9/TyXHX2XNsb9hwaGuqGt3quDOLkqgHe48slCt/evDqso8s8OC1exdFxrntg\n        UMAJJlOr5kp3Vz8nwbg+wFNZtarLytKs/Ur3hd/xu9lAFNZP6oa6mpNGxgatowCMy/crKsuO4guRSy90\n        nR/U1FRf/1cAbGvaeDItPfGfeIwNjJsIgLOzk8dXFzoGsJpMT32wZn31HkUlxTU4xbe+//2NIU6C8aIC\n        AAAuhyW0tR/53czcdBMQGR0dmW5tbbFbU0u9fCIAtrY2zuERoSewKFuur113vmJt1R22eMO3IAFdF8/3\n        z3dxXtPS8vnBpJTkbgxsMTtIAgBABRISYs4lJMQWYltyR0pKch/+dNKDmX9LLfCRtsSXB3f9nLMw41Zy\n        ctz5DXXrnlVUrR4jGHsG4ZradaCflp4+3nvPd555ycfHO2vL1o2dWH9TlFWVskFcQZ/ZhFRWVexbVlz8\n        OCMj+XxCcuK9mz3fDmJJGjsZAgBaWpvf0GjidTX1q5/m5GZf4wSILQGaWhpnTCxntXVf6+wTFBKc9Ezi\n        32KetRux0QtdXJyP45+gp2qKDIWlgD52T37wXlpaSr55+wbW8TQuklhd/Pqrgeqatd0eXu5wc9QkODRo\n        HACysnSF7Ts3A4Bwr0cNM25xrO3IK3MLs11s/eWwAdbSMtIxN27dGGIoMcYuXnGqAJYKmZKVRfdXlhVf\n        xfNNej/5/w0CnMMd/HLvJezuytjE4R2nHW879Jut7ez98AyfCxhtqF8HhxMsgxUTF33i8tWuAWwDyjBI\n        9NDQ4PS7vddBAuCGyCepqYmLAwL9u4B5NmGRkSF79h3YCyCynuExY0YQqkRYXc5evvLVUzyfGbzX1NQ0\n        AlWUoUtvgf/FxUX9Ll89N2jvYN8wZa4Qrqouzs/bfOjIgTde3h5QhmLdxbO2tppXs371/Z27dvdhwqpX\n        rS491rq/tT80PBh0n0KjiXnPm+94D/+2MjDQtyxbVXrqwJf7iLT0lGOhoUF5zbt3Plm8NL8XH6MZwnzg\n        KpcU5Le37ts1lJgc3+rn57OgoXHjg9b9B4c9vTyqYE4MtE5icuL3tfW1983NTWOWFCze1bJ358CKshXf\n        YdvDAkVZVaUSu85+C0uTwikDAc+rj3sc7oEA9OiOgS+Hg8pU3EENwL2B/w0DfkbHaI26QwhM5o2+h3lA\n        jYJG52Qdd402owljYD2YH8ay11XCvyFocsAdPA2sCR2+Zd0lGJ0f6JhaVeAg9OPPjwh8ROB/A4H/AzoY\n        Ba4QkBKiAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"pbBloodline2.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAABF3SURBVHhe7VoHUFRX1I703llABJbekaYgoC4dVFgQEBBQpLkIKqFYAekgKtIEBY1RI7FhjbFE\n        MbZEjV2xptiSoGLBaITdd9/852xY//0z0YDZqPmHO3MH9r3bznfqPed99NFAG0BgAIEBBAYQeDcIiEOT\n        7G3y0FRf0/Adjn03p3oHuyDNSOsQaEbQLKDZ29s7uLi4uEIbgR2aG3Z8ZgpNC5oiNJz7Do7472yBh9eA\n        hgQhkWFhYRMqKioWf7ZuXctX+/cfuXjxyLVrV8/9cPXq1R/w95Ytm7dXV1cvi4uLjff29vZBkBAwBE8G\n        2n9KKvDAyEVnZ+dhlZWlS9rPtX7/+PpGquNyLXVh81Tq9Kas7vbWaeRyayav48wCqvNCJa/rh8+4vMd7\n        aOr38/SV9ss/LFpUWRsUFBSK4CGICCau+++wS0SrIpdQh1HcCwtzi+9d3dx5rW0Ob/OicKo2y4vUZY0h\n        9Rm21LIsZ2pVwRjSPM+DbF80luxeGkwd/TSBe2o9h3e3LZ16ebuacJ8eJI8f3Xu2fHnjagTCwcHBEUH9\n        YNUCiUe9RV0+c2z1tQtfZHORcCS6IMGCKkywJ7NjTEjuZDP+75JkKz4QTbOHURsLXcjean9yfGUkObUq\n        kG7fls69fyyb6vmlluK9vEjOnztzY1JcLMfa2toGVeKDAwGJl4MWFxuRcOPQwp7NS6J6kPC8eE9uRqQd\n        NyvKiGRFmpLksUNImIf2C7abzm+VqVbUimw7qmmGJckIM3yaGmz4oinbgRxu8KFv7Ywiv+zn8PuLm2VU\n        9+NNvBfP7/VwpqbMBuEy+OAAwANNCA2I31WTwCtK8eTOjvPoyYy25c4It6Q444zJeLfBL5jqUifkpSWr\n        QdsidNXli+dFM0lL4UhyfUc0sbc0qJeWkmLJSknMtdSTO7SYY0V+2sqmHx2IpR+2pZInRzn0y5tlhHp5\n        jo6KjJwnLS0tJyKtFc0y7DGs+IZZ/mR6xFDuNLYp/29yoD6JdFOmDTRkD0uIic2AnewlJCSUxcTExG0t\n        jOIKE8xJU44D1XkmhxrtZl+joKCgDu+l+WMGDfJwMFH5cnu5O7m5JYTc3BpJzm1I5P20M5x+cKG5W0lR\n        3kU0JxfBKlbmTIdijv/LjImuL1ODmIQDYp7kr0N8hqr/Ji8jWQtbuKKGCLZCaXF1tp2CKtBS4kN1tWcQ\n        Tw+nWhUVFU1h0cY5irJSU+fGmHV90+RPDtR40lvKPUnbigk9KspKcYMGDfowgqXYQNtL04J0SbKfOkEA\n        oj2UiIuxwiMpCYkCIJopOKggEkRLHhTondE8x5Wszx9OOs/NoLxHOS4EL6fzZ93GueJiYsODXBg/L023\n        IcUJJiR+rMU9eO4FXQIk5f2CMGq4TVYam8nneIKXCp/77OFaT3uJ1xNwHf03Wm8mNCcnJ+fpnLji3VW+\n        1PGmYPL8ZhUZ4To8D17/HwkQFk4xsUHmGsry9SoKsnVAdAz8VgNVkoUx7w8A4JZsnI9eR0qgNp/4RF9N\n        MtFNnlaVl1qBnBcmHrmOkZ2Pj49fUlISZ++uZQfOtUSRn3ZPpbrvNdOjPNwKlZWV3ujegHBF4LrKoEEf\n        yQIASPwgEWjw2y/h7+WROpmlRk8apUgj4dht9JXOwoojBGIviAiB606JiYkpx44dPUU9P0Y/OVvEN24d\n        u8No6uEG2seLVQ4qoP0m9wZES0GXAaqR6++XeITNd7hRG4q+wPBN9tQmkhLiOQKDhzqP4StGcKmpnLQH\n        9289fn63iXf/mznU4yOTaN6dDJr3YBG4thO0tydrIQiJLsYSr2MJgArMf48iL3ww8MOKU7xVaRR7lAAE\n        wd1a/TyMeeWekPsYw7PZ7PEdP1/qfPljDY3RXdeJJJr3sID0PCqnuh9V8qjuk7Sfr89SBoPxRgDeXlb/\n        hZkuzg6R6O8F4o9eQFdNph59uGA7NHp4kdn/5Yq2l/ereD/v45D2z4Ponp+KyIu7jdSq+klXUmOcDn1S\n        4nVplKt1GdgAjQ8uwnsddgHeo2cj8Xzuj9UiORMMCPikJGGXNxgamx0cSv2+h3RfmUX/fr2APDwQTV85\n        Puc3HYZKEaztBpZcX0ZamikrI20OxEv3lVdgEKVA3dT6Ol7k46wM1JrQ6KEHQAAWTHZ9BJuMFg529PT0\n        9PPnpxVwuzbydb772gz6ZftM2tRQp0JWRsYA1F09ISEhCbuSkhKjP4cEYyDxXl2gvengTej6kv01+Le7\n        2nmRv8KB7IQBQNdXt3DaCu7jzynenVK+xW/dkPs9Q1PTU1ZWVm5t87wtPR2N9N3TC+lVNQWHYK5qf0AA\n        6QEhEFfpzxyRjXWz1jmKARByvzTZklpTGfc9LG4tDADagJZFoTt5T5aR7vPpNO9+BSkrKTnNZBo44bW5\n        5+FKquNgLL178WiysdSPB3NH9ueAMjLSCkGew+pgjkJ/5olkrKWB2hq84uL9vmiKGbWjMekW6L+VYHF0\n        gQjAkoqZNd1dW3jdNzLp7jPJ9N49W3+0trIaie5xaojdFxvmO5OKyYYkyot5o78AMBiazJmx7u0wz0Qk\n        RPVnET2GXA0CgImN6plO1O1DFS/lZGU8hPN2yOXY8IBE7tNWinqxnbz4Np5+1nmcGzY+NAdSfcb6enoO\n        GorSDarykq1gQKf2VwWG2xlPqsoK/g3mOffn7CIZa2NmkJkZYUgwq9Mwy53cv1hDmxgZxSkrK7/SSYwD\n        rCzNbG+dLu3i/raW4n0/H/J9X5ML50/cCg4aF6evr88EjPAKLCMhLqbR34P5uRosy40fwYV5Xv2d+4/H\n        W5qbes8IMXuV1vrx1FICKau1YPeGCBKXKA1g3ZUSo3yKf94/ke65NZ88vzyfPL7eTB52fNu1fVvD3uLC\n        9KrmxvnrVZSV7ftzKHk5GYW5U5w6I/3t7sM81/7MFclYTFyEu6t3VaZaUyvzvMmJdUnctrYDP1lYmLuh\n        6AtUofcWyMiMcTiFyYxzLROptuZ4bms5i2AecHGiCVmZbksN0VbNxbpJXw83KcQ1J3+KFfFz0LwGc8z7\n        Ok+k42wMVVswqYGZ3X21oYR6foaeEBGxAG68hgiCsEEEn88YO8Lg6Oq5zmRLGYuqTDSjyuNt+Cq0JN2L\n        aKrI4B2iTwAg91flju5IH29CbIwZu2CffquPSICQlZZk5U+2J62LgnlfNyVTHWdLqZMnvr01zNnZB2OA\n        v8jhKynKSua6mKn9MMVH648ECrjRwkRXrpGeVllfAYgJNM2ZM0aNfw/RUJItgXnv3g0ighj2sux1j2BW\n        Z191ILmxI4XCq259Xe0uKHG5/xUIvaHyYF0NxfKcaFMyZ6IRKUq2I/o6asVSUlJ/S4iVJdN6fUlEVzp7\n        MJnEYjyDkHjCe02NgRT4libZ8HP5eNnh/VpLKN4DOj8vtwESII7a2to6wjZBIHom+urR6EUwiqzJdCN6\n        OmqFfycBRkxtowPNE3+dG2NIUgK1iIOJ6klYz0Yk4vy2iyD6xjoKq/cu9SRPj0yheTfm0NwnLRTFe0aX\n        l5U2ubu7jxQuawmMo8FgldDsSCYfgPUl4ygAoOBNANjZmtmf2jT9lzKOPeHfQoH7wrmHtz2/SOaB6DIS\n        AvSvdx4FAC6l0byrH9O8zjV8Sdi8aeNXwcFB4zEpYgANo0MsndlZGCbNDDfmA4Bh8JsACAsNjLi0K42H\n        Vh/D70Q/XaKnoYjG71XkKRJC/skikLq1yYiyuiMA4X5bCulsr+V1PztGYSZo2bL6VQEBAWOHQTM2NjYZ\n        4eIYPyvqDwB2Lh5L/dkIQo1AbWqST+q5PbM7NpSH8FBd8PKFGWdrXblTcNaA96r7fwUWgGCfwja5c/Gz\n        QHJlYzi/kHF5Wxa341Qu1fXjV7xHnZefbd++dV92dtbcKdHB+RhCoxtEAJztTMug5GXFZvuHLV/2cfP1\n        I5Vde6r9COo7JlvQ4id4M8hwI5k7YPiihesM/4RxIp+L6WvWUMbpHQtZ5HBjED8+aF0SwcXg5+innJ5L\n        W+dxrx0t5R1cmcKtTHfkA7B+tj25tDOdd+NYHjm7jk3jBakozojvIpHr2Nn2MrSRlsJpID4eDv0q6yRy\n        AkS0oKqWmmJtjIfmi5oMR4J3hU/zWdTakmBqVWEIF8vkAuJRBbCXpVjwXeL0YB1+fMDPNfT+Heeo9Dtc\n        mlpR7N+bz+8vMKCfUsAtL0MNuX1RLqokc5wWgcoOlMjNCVpyTKSgL58+3oBkhOvzRVxQXUIXN8FFnva0\n        kPtdV1nqBFyUcmB/yw9O5/sCCuoqpK9YcpJiyywHy10NcGJQ7GGqJDlAC3y5Nt+fY3Y52FGejHNQJCNM\n        5LCKfENWUnwLAMiBPew+WH3vCwCCMZC+wk9bdKC7SUuKp0lJiFXISIh9ri4vvVtBSmyrtIRYFTzLgPch\n        0B2gM/Ca3J89/ktj+XXS3tBXBQ6ugv//XST4XyJw4KwDCAwgMIDAfxcBuL6OaKiv3rT20+a9ULezFVAS\n        GOAXv7yxbvvsnMxGP1/vdHyPPXx8yBxwWa9KW+ZmZqzqqkUt+G7m9LSlmhoarnnz59Tg7+jICfPDQtnZ\n        grmjR3ngx1NKurq6tvl58xrx+fgQ9izBfOH9x44dM2VlU8MO3D876+Pqz1vW7XN3c5smCJDgsulQVlq8\n        6pNVTTtZozxSFy9auGbXrh2Hy8tK1qirq3n2OZDCgXZ2tmntF8882bZl42UJCXGzXhCkvL08S50cHerh\n        t15lRdmm9WtXY1IyELpwXV/c2dlxFs6HGuAMSUkJxvKG+t36Q3TLYNxw6FqbN7R8V1ZcgAkNPJgU7gmJ\n        E+uqxQvxpucLH0RO/d/9JYz+vD8Abn329In7OMbExHgSzscOt8ihdbU138H4EebmZnF3bt/uMmQalPTG\n        IH2XyiFDdFlLq5Z8hxt8snLFSVicz2EWa3SchbnZbAxSSooLmuAdVmZe1QQFO1haWsThXPgdOn58SK6m\n        pmYS/G8k4AJyujB/7gl4xhQ+FUjB1zjOw8P9jftjYNVQV71/147WH0+dOPYr1BvZgrWLCgvbcA1PFssH\n        AWBoqk/vd4yBAIwc6VE/zMkhBwnJy527EzZQRwDMzUz5GVwhAF7VBP8MQFxszMbp6Wk74LmFMKGvAyAl\n        OXkbjDNAAP5u/4qyom2KCgqhKKVHvz5wB7g/CvcoLCjYj8D6+voG9AKQ9tYAoH76eHvlIwipnJSNdnY2\n        nL8CYMyYMcHDnJ3mDB1qOw3mSCFQOCciLKQV/waNG1OFoi4A4XUAwEfR60G6VAUAvGl/BADeW0PKfRgC\n        cHD/nu/hy5WhIgUAQ1Q8OHzCUoKE7Pty142/AgA/BcLnxkZGmSh+kZETBCoQOXdWzkac6+RonymsAg11\n        Sy/iWAEoeNUdNcpjCaTTVQQA/Hn/PV9sbxfsv7RqEQLAlyzk/slvj9/du3vXtV4V+GcSYGZmGh4/KW4b\n        Vrd6DygVFzNxBRICVr4IRWpFY+3mHVu33Ib3eHnBhoUN7OJJSYnTcSyk/yaCvqqvam78BnVVb8gQfhrb\n        38836/KFM8+sLC3TBKBA7jAHrHUY2pcxgQHBcbHRW1+3P4yR/Wr/3suwtpMAQPA2fu2XLz4oKylE48qM\n        iAiPQhVgGujP7pcKGBsbmWZnZTYW5M07FjRu7DxYTFDlkUFuGhoa5oJLil+Ql8s3ZDHR0cvg8xYtwUGc\n        HB09crI/bsF36dM4W0FPbeBDBn0fL8/GwgW5R4H4dDi4pqODfcHC8tJv6qqXHEzlTP3EwEAfr7+Wamqq\n        5m/a387WOj8lOamkcEHe4WmpnPVQfrTHvRFIc3Pz2MyM9P22tjZhuEZpcdHxnMyMPVCj8O2XG4T1kCAm\n        dF3o8gLiUNp6xRaf4Tscg1+EviqFoQRAH9z7zgD+8r/86L0Sa/c+x48ecRz+RjFGVYCPIP9wZ33YXwXG\n        4Nqv1u89I87FWiFKroAGHKPZZwCEiB34dwCBAQQGEPh/jcD/AIDGfoxQnAqOAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"ilAncestry.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>126, 17</value>\n  </metadata>\n  <data name=\"ilAncestry.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD2\n        +QAAAk1TRnQBSQFMAgEBJAEAASgBAAEoAQABMAEAATABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo\n        AwABwAMAAeABAQIAAQEBAAEIBgABaAEBFwABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHA\n        AdwBwAEAAfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANC\n        AQADOQEAAYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/\n        ATMDAAFmAwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJm\n        AgABZgGZAgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEz\n        AgABzAFmAgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEA\n        AWYBAAEzAQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/\n        AQABMwFmAgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEA\n        ATMBmQFmAQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEA\n        ATMCzAEAATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEA\n        ATMBAAFmAQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEz\n        AZkBAAFmATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEA\n        AWYBmQFmAQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFm\n        AcwB/wEAAWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEz\n        AZkBAAGZAQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIA\n        AZkBZgEzAQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHM\n        AQACmQH/AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZ\n        Af8BMwEAAZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEA\n        AZkBAAHMAQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFm\n        AgABzAFmATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFm\n        AQABzAKZAQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/\n        AgABzAH/ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEA\n        AZkBAAHMATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEz\n        AQABzAJmAQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEA\n        Af8BmQHMAQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEA\n        Av8BMwEAAcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEA\n        Av8BZgEAASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4\n        AQAB8AH7Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA///AP8A/wD/AP8A\n        /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A\n        /wD/ACYAAf+8AAL/AQAC9AH/ZAAB/wH0Af9QAAT/AvMBvAEcAe8B8QH/YAAC/wHyAe0B8QH/TwAC/wHy\n        AfMC9AHxAZMB7QGSAfAB9AT/WgAB/wHzAfQBBwFEAbwC/1AAAfcB8AEHAfIB9AG8ARwB6wFtAZIC8gHv\n        AfEB/wMAAv9TAAH/AfIBBwHvAQcBbgG8AvEB9AT/SwAB7QHzAf8B8wG8AQcC7AHtAe8B7QH3Ae8B9wEH\n        AfIB8wHyArwB8wL/TQAC/wL0AfAB7wEHAe8BvAHxAfABBwHwAfID8AHyAfQB/xkAAv8BAA//HQAB7QHy\n        A/8B8AFuAesB7wH0AfEBBwH3AewB7QGSAe8DkgHvAfEB8wH/HAAR/x8AAf8B8QEHAe8C7AEHAbwB8AHy\n        AbwBBwLwBAcB8QH/FgAE/wH0Av8N9Ab/GAAB7AHxAf8BAAH/AfABbgHsAe0BvAH3AvMB7wLsAZIB9wPv\n        AgcB8wH/GQAC/wP0BfMG9Ab/HAAB/wHyAQcB7AFLARMB7AIHAusGBwHxAfIB/xQAA/8C9AfzAfIB8AIH\n        AfMB8gHxAvIB8QX0B/8SAAHsAbwB/wEAAf8BBwFuAe0B8AH0AW4B7wHyAfMB8AEHA5IB7wMHAfAB9AT/\n        EwAC/wH0AfMB8QHwAbwBBwHvAZMB7wEHAbwB8AHxAfIC8wX0Af8ZAAP/AQAB/wHzAewBcwFuAUoB7QHs\n        AUsBEwXvAbwC8gH0AQAE/w4AAv8B9AHzAfABBwG8AfEBBwLvAQcB7wHtA+wB7QHvBOsB8ALyAvMF9AP/\n        EQAB7AHwAf8BAAH/Ae8C7AHzAQAB7AHvAfEB8AG8AQcC8AQHAbwB8AH0Av8C9AH/EQAC/wHzAfABBwFz\n        AW4BFAFEAUMBIgFDARUBEgHrAewB7QHvAgcBvAEHAbwB8gH0GQAB8wHwAfMC9AG8AXMBwwGZAW4BkgHs\n        AXQBSgHtAW4BSwJuAe8B8AG8AfMC/wH0AfMB9AH/DQAB/wH0AfMB7wIVAesBkgHsARMB6gEVAeoCFALq\n        AfcB7AHrARIB6gHrAewBBwHvARQBBwHyBPMD9AL/DwABbgG8Af8BAAH0ARwC7AHzAfABbgHxAf8B8wHv\n        AUQBBwW8AfAB8QHyAfMB/wH0AfMB9AH/DwAC/wH0AfABbgkOAwsDEQFEAfcB8gH0Av8ZAAHzAQcB7wHq\n        AewB9wEcAsMBmQHvAQcBcwFEAXMBdAFKAREBFQFuAbwB8AHyAfQB/wH0AfIB8wH/DQAB8wG8Ae8B7AFt\n        AUMBEgFtAesB7AHrAeoB6wGSAusB9wHvAQcC7wHsAe0B6wFtARQBQwHqAQcBvAHvAQcB8QPzAvQD/wwA\n        AW0BvAH/AQAB9AHtAusB7QHrAZIB9AEAAf8B8AETAfcBvAHzAfQC8wHyAvMB8gLzA/QC/w0AAf8B9AHw\n        AW4GDgEQAUsBdAQcAgcBvAHxAvMB9AL/GQAB9AG8AW4DSwFEA24B9wEcAW4BSwFKAXQBSgJEAW4BBwHy\n        AfQC/wH0AvMB9AH/CwAB8QHtARIBFQFtAesBEgGSAuwBbQESAewB9wMHAbwBBwHwAQcC7wIHAe8B9wHr\n        AuwBFAJtAewBvALyAvMB9AL/DAABbgG8AgAB8wHtA+sBbQHsAe8B8AHvAewBFAHvAvEB8gH0BP8B9ALz\n        AvQD/w0AAf8B9AG8AREGDgFLAXQCkwSZAQcCvAHyAfMB9Af/FAAB/wHxARwBGgEHAUsBRAHvAfEB7QOT\n        AUsBbgFEARABQwFEAW4BBwH0A/8B9ALzAfQB/woAAfIB6gESAeoB9wHvAQcBvAHwAgcBvAEHAfcB7wG8\n        AfECvAEHBu8BBwG8Ae8BBwG8AewBFAHrAe8B6wHwAvEB8gHzAfQB/wwAAewB8AIAAfIBHALsAm0BbgES\n        AUMBEQFKARQB8QHyAvAB8QHyAfMB9AEAAv8E9AH/DgAB/wH0AfABFQUOAQ8BSwJ0AZMCdAFzAm4BdAGT\n        AQcB8gH0Bf8B9AP/EwAB8wH2ARsBBwFLAe8B8QFvApQCmQREAUMBRAHvAfEB8wH/AgAB/wPzAfQJAAH/\n        AfEC6gHvAfQB8wHyAvMB8gHxA/ABvAPwAQcBkgHtAuwC7QL3Au8BBwG8AQcBkgLsAesB9wG8AfEC8gHz\n        Af8LAAH/AW0BvAIAAfIBBwEcAewC6wHqARMBQwFEAUoB8QH/AfIBvAHyAfMC8gHxAfMD9AT/DAAD/wH0\n        AfEBkwFEBg4EEQEQBA4BEAESAbwD9ALzAfEB8gHzAvQC/xEAAf8BvAGTAe0B6wGSAXQBdQKaApkBRQJE\n        AUUB7QHvAbwB8QHyBPQB8wL0Af8KAAH0AuwBBwH3AvEBvAEHAbwE8gHxAfIB8AHtAeoBFQJDAeoBbQHr\n        Ae0BkgTvAwcB7wHtAewB9wHxAvMB9AH/CwAB/wHqAbwCAAHyAe8D7AH3ARMBFAFDAUQBbQHvAfIB/wHw\n        AbwB8wL0AfMB8QLyAvMB9AH/DAAC/wLzAfIB8QG8AZMBbgFEAQ8NDgHtAbwB8gHzAfIB8AG8Ae8BbQHs\n        AQcB8wL/DwAB/wIAAfQBvAHxAfIB7wEWAXUBlAGaApkBRQNEAe0BcwHvA/IC8wP0Av8LAAHyAewB6gES\n        Ae0BFAERAUMBbQHsAQcB7APqARUBEQEPBQ4BFQHrAZIF7wEHAfABvAHtAW0B6gHwA/QB/wwAAeoBBwIA\n        AfEBHAGTARwBbgEcARIBFQFDAUoB7wHsAe8B/wHxAfAB9AH/AfQB/wH0A/MC9AL/CwAC/wHyAewB7wEH\n        ArwBBwKTCEsBRAMOAUsBkwG8A/ABvAEHAZMBRAEOARMB8AH0Af8PAAHzAv8BBwFuAewB/wHwAXQDdQHD\n        ARoBbgNEARQBRAGSAfIB8wLwAvQD/w0AAfQB8AEHAm0BBwG8AZIBEwMVAUMFEQIQAg8BDgEVAewB9wEH\n        Ae0C7wG8AQcB7wHtAe8B7AHyBP8MAAHqAbwBAAH/AfEBcwEcAZMBHAHtAeoBQwFEAW4B7AFuAfQB/wLw\n        AfQB8wj0BP8IAAP/AfQB7wFDARUB7AHvAgcDkwF0BHkBdAEiAg4BSgJ0BW4BSgFEAg4BDwG8AfQB/w0A\n        Af8B8QG8Af8B9AGUAUsBRAH0AfABdAF1AZQBGwL2Ab0BdAFLAUUCRAHsAfEB8gHvARwB8wX/DQAB/wH0\n        AfAB7wFtARQB6wG8AfcB7AFDARUCQwERAkMDEQEQAg8BFQHsAesBFAFtAewBvAGSAfcB7AHrAQcB8gP/\n        DQABbgG8AQAB/wHwAW4B6gEcAXQBSgFtAUMBSgFzAW4B8gEAAfQBvAHxAf8B8QHyAv8C9Af/BgAD/wL0\n        AfMBvAEcAUoBbgFzARwCkwN0BHkBSwIOAUQCdAFEAg4BIgUOARAB7AHxAfQB/w0AAfQBHAEHAf8B8wGU\n        AUsBRAH0AfMBkwEaA/YBGgGaAZMBmgFvAkQB7QHzAfEBHAF0AfEG/w4AAf8B8wG8Ae8B8AH0AfIB8AHs\n        AREBQwYVAxECEAHqAewBFQLqAW0B7wHsAm0BvAH0EAABbgG8AgABBwFKAUQBbgF0AW4BSgETAXQBkwEH\n        AgAB8wEHAfEB/wHwAfMCAAHzAf8BAAL/CgAC/wH0AfMB8gHwAbwBkwFvAW4BSwJEAUMDIgMRAUQDDgFE\n        AksCDgFLAW8BbgFKAUQBSwFzAZMB8AH0Av8NAAHxAW4BHAHyAfMBbwFLAW4B/wG8AQcEGgGaAZQCkwFv\n        AUQBSwEcAfMBvAF0AXUBBwH0A/8UAAH/AfQB8wHxAe0CQwETBBIBEwIVAxEBEwHtARIBQwHsAfEB8wEH\n        AfcB8AHzEQABSgG8AgABHAEVAUQBSgFuAXMBSwFtAW4BmQG8AQAB/wHzAbwD8AH0Av8B8AH0DAAC/wHx\n        AQcB7wHtAW4BHAFEFA4BDwFLAW8BdAOTAQcBvAHyAfQC/w0AAbwBGgGTAbwB8wGTAZoBkwHwAW4BSgFu\n        ARwFkwFuAUsBbwF0AQcB8gK8AZoBmQH0FwAB/wLzAfIB7AEVARIB6gHrAuwB6wHqARMBFAEVAhEBEwHv\n        AQcB7wG8AvQB/wH0Af8SAAFKAQcCAAEcAkQBSgFLAW4BSwFuAUoBmQHwAQAB/wHyA7wD8AK8AfQMAAH/\n        AfQBBwESARABDgFEAW4GDgEiAhUBSgNLBEoBQwEPBA4BFQFuAZMBcwHtAQcBvAHzAfQC/w0AAe8BvAGT\n        AbwB9AKTAQcB7QJLAkQBbQFuARwB7QHvAewBbgF0AbwB8gH0AfMBvAGaARoB9A4AAfIBBwG8AfMC9AH/\n        AfQBvAEHAfcB7wHwAewBFAHqAewB9wIHAfcB6wESARQCFQERARMBvAHzAfQE/xQAAUoBvAIAARwERAJK\n        AW4BkgEHAZkC/wHzAfACvAIHAe8BBwHzDgAB/wH0AfEB7wESARwBcwEPAw4BSgF0AXoDmgN0AXMCmgJ6\n        AZkBSgQOAUQBkwEVAg4B6gHvAfEC/w0AAbwBdAGTAQcB9AP/AewCbghEAe0B8wL0AfMB7QJKARwB9A0A\n        AfQBBwHvA/cBEgGSAesCkgLsAQcBbQETAW0B7AEHAvIB7wHsAW0BEgEUARUBQwHqAfAZAAH/AW4BBwL/\n        AbwBSgFDAUQDSwHsAf8B8wGZAQcB/wHzA/ABvAIHAbwB8gH/DQAC/wH0AfMB8gHwAbwBHAFDAg4BbgJ0\n        AXoBeQFKBA4BQwF5AnoBmgFSAg4BAAEOAW4BHAESAesB7QEcAQcB8AH0Af8NAAHzAXQBbgEcAf8CAAH/\n        AW0BRAEjASIBQwMiARABIgERAW0B8QH/AQAB/wEHAksBHAHyDQAB8gHvAfEB8AIHAW0BEgHsAfMB8gHv\n        AfQB8QH3AeoB7AHtAQcB8QH0AbwB7QHrARIBEwEVARQB7AHyGQAB8wFLAW4B8wEAAfEB7AFDAUQBSgFL\n        AW4BvAEAAfMBHAHsAf8B8gK8AfABvAIHAvAB9A0ABP8C9AHzAfAB7wFzAUQBEQFzAXQBmgF0ASIEDgFD\n        AXkBmgKZAUoCDgFDAW4BkwK8AfEB8gHzAfQD/w0AAfMBcwFuARwB/wIAAfQFRAEVAUQBFQFDAiIBEQHw\n        Af8CAAHwAXMBFQEcAfINAAHzAfcB7wL/AfQC7AEHAbwB8wMAAfAB7AHrAe0B7wG8AfABBwHtAesBEgET\n        ARUBEwGSAfQZAAHyAUsCRAHzAfQBHAFEARUCRAFuAfIBAAHzAhwB/wHxBLwBBwG8AQcB8gH/EQAD/wH0\n        AfMCvAHvAesBSgFzAXQBIgMOAUoBdAGaAXQBbgFKAQ4BEQFuAZMBvAHyAfMD9AP/DwAB8AFzAW4BRAHt\n        Af8BAAHyASIBbghEARUBIgHxAgAB/wG8AUQBSgGTAfQNAAH/AfAC7wEHAe8BkgHxAQAB/wMAAf8B8wHv\n        AuwB7QP3AewBbQESAhMB7AHxGQAB/wG8AkoBcwEVAhwBcwFEARUBRAFKAfIBAAHxAW4BvAH/AfABBwO8\n        AQcBvAHxAf8UAAL/AfQB8wHyAfABvAEHAZkBdAFKAw4BIgJ0AXMCHAIHAbwB8AHzAfQG/xAAAQcBdAFL\n        AUQCSgG8Ae8BbgFLAkQBQwIiAUMBFQJEAUMBvAHwAe8B7AJEAUsBBwH/DgAB/wP0AfMB9AH/BgAB/wHy\n        Ae8B7AHrAewB7QHsAW0B6gISAesBBwH0GQAB/wEcAUoB7AGZAXMBRAFuAXQBSwFEARABRAHxAQABkgFK\n        Av8BvAMHAbwBBwG8AfIVAAP/AvQB8gHwAbwBmQFEAksBDwIOAUQBcwGTAQcBvAHwAfEB8wL0A/8UAAHy\n        ARwBbgFzAnQBbgFLAXQBSwJKAUQCDwEiBEQBEgNEAUoBSwFzAfAB/xwAAf8B8gHvAewCbQISARQB6gHt\n        AQcB9AH/GQAB9AEcAUoBBwHwAXQBRAFLAW4BdAFKARABQwG8AfEBSgFtAv8BvAQHA7wB/xUAA/8C9AHy\n        AbwBbgIPAXQBbgEQAg4BDwFzAZkBvAHxA/QC/xYAAf8B8wEHAZkBmgF6AXQBSwF0Am4BSwFEAw8BQwFK\n        AkQBFQFEAksBdAGaAQcB/x4AAf8B9AG8Ae0B7ALrAewBBwHyAf8bAAH0AW4BSgG8Af8BvAFzAW4CSwFz\n        AUQBFQHsAeoBSgGSAv8B8QQHAfAB/wG8AfIB/xQABP8B9AHyAQcBEwEOAUoBkwF0AW4BDwMOAewB8AHz\n        AfQE/xcAAf8B9AHxAbwBGgGZAZoDdAFLAiIBDwELARACRAFzAW4BSwGZAZoBmQG8AfQB/yAAAf8B8wHx\n        A/AB9AH/HAAB8gFuARIBvAH/AfMBcwFuAUoBFQFLAXMCRAIRAZIB8gH/AfMB7wMHAfMB/wHyAfAB/xYA\n        Av8B9AHxAe8BDwEUARwBmQGTAXQBRAMOAW0B8AH0Bf8ZAAH/AfMB8AGZARoBdAGZAZoBdAMiAQsBIgFE\n        AUoBdAEaAXQBmQEHAfIB8AH/RQAB9AEcAXMBvAEAAfMBmQF0AhUBRAGaAZkBbgFDARUB9wEHAfAB8gEH\n        Au8BBwHzAQAB8AHyAf8WAAL/AfQB8QHsAQ4BHAKZAZMBcwELAw4B7QHxAfQD/x4AAfABdAFLAZkBdAFL\n        AiIDCwFEApoBwwF0ARwBSgLtAf9FAAHzAXQBSgHwAQAB/wHyAbwCSgFEAUoBGgEbApkBBwHwAQcCvAEH\n        Au8B8wH/AQcB9BcAAv8B9AHwAW0BHAEHAZMBcwFLARACDgERAXMBvAHzA/8fAAHzAQcB7wGZAXQBbgNL\n        AUQBCwFLAXkBdAGZARwBvAEcAW4BvEYAAfIBBwFuAfADAAHyAUsBSgFEASIB8wH0AfMBBwHwAf8B8AQH\n        Ae8C8QEHAfQXAAL/AfQBvAHvAbwB7wFKASIBDgEPAUMBbgGTAfAB8wH0Av8hAAH/AfQB8wHwAQcBdAJv\n        AW4CRAJKAW4B7QHvAewB6wHsAbwB9EQAAf8B8AGZARoDAAEHAkoBRAFtAfQBAAH/AbwB8QEAAfQBvAMH\n        Ae8BBwHvAfAYAAP/AfMB8gHxARwCDgFLARwBBwG8AfIB8wP/JQAB8gGTBHQBbwNEAUoBRAFKA0QBSgFE\n        AfJEAAH/AeoBBwH/AQAB/wHtARwBSgFEAXQB9AEAAfQBvAHxAQAB9AG8AQcB7wEHAbwCBwHyGQAD/wH0\n        AfMB7wEQAREBkwEHAfAB8wH0A/8lAAH/AfABkwJ0AcMBmQFvAkoBbQZLAW4B8AH/RQAB6gG8AgAB9AHs\n        AkQBcwGZAfQBAAH0AbwB8QEAAf8B9AG8AQcB7wHyAvAB8hsAAv8B9AHwAewBIgHsAfAB8wH0A/8mAAH/\n        AfABdAFLAXQBwwFuAUsCSgFzAfAB8QEHAnMBvAH0Af9GAAFEAe8CAAH/AQcDGgGZAf8BAAH0AvACAAH/\n        AbwBBwHvAfMfAAH/AfQB8wHyAQcBbQHwAfQC/ygAAf8BvAFLAW4BdAHDAZkBbgFEAewB/04AAUoBvAMA\n        AfQBGgHxARoB8AMAAfQB8AH/AQAB9AMHAfMgAAL/AfQB8wHxAfIC/ykAAf8BvANEA0MBSwHzTwABbgG8\n        BAAB/wH0AfMB/wMAAfQB8QIAAfMDBwH0IQAD/wL0Av8pAAH/AfQB7wF0AZkCdAFuAe9PAAHyARwB8wsA\n        Af8B8QIAAf8B8AK8Af8kAAL/LAAB/wG8AXMDmgEcAfMB/00AAf8BBwG8DAAB/wHxAwAB/wHzAfRTAAH/\n        AfQBHAGTARsBBwHyTwAB/wHzAf8MAAH0AfNaAAH/AfQB8wH0AfYB/10AAf8B8gH/vQAC//8A/wD+AAT/\n        uwAD/wH0Av+IAAn/KAAD/wH0ARQD/4cADf8kAAP/Ae8BRAH0A/8VAAH/FQAE/wwAAv9GAAX/AvMB9AHz\n        Cv8hAAL/AfMB7AFLAe8B9AP/FAAB/xAAC/9QAAX/AfQB8wHwAewBvAHxAfIB8wL0Cv8aAAX/AfABEwFz\n        AXQB8wj/FQAc/0kABP8B9AHzAfIB8AH3AUQBSgGSAQcB8AHxAfIB8wL0CP8YAAT/AvQB7wFKARwBcwEH\n        AfIB9Aj/EgAN/wH0BPMB8QHyAfMB9A3/QgAE/wH0AfMB8AEHAe8B7AFKAUwBRAHrAe8BvAHwAfEB8gHz\n        AvQH/xYABP8B9AHyAfABFAFzAnkBBwHwAfIB8wP0Bv8PAA3/AfMB8gHwArwB7AEPAUMB8AHyAfMB9Az/\n        QAAD/wH0AfIB8AHvAZIB6wESARUBSwJSAkoBkgG8AfAB8gHzBfQG/xIAA/8B9AHzAfIB8AG8AQcBSgEa\n        ARwBmQFzAgcC8AHxAfIC8wH0Bv8KAAX/AvQC8wHyBPMB8gG8AfcB7AHrAW0BEQFKAUMBEgEHAfAC8wT0\n        C/87AAP/AfQB8gEHAfcBEgFDAUoBUQVSAVEBSgHsAbwC8gHzBvQF/xEAAv8B9AHyAfEC7wHsAesBbQG8\n        Ae0BbgFtAusB7wO8AvAB8QHzAfQE/woAA/8C9AHzAfEEBwO8AQcB7QESARQBEQEPAUoBHAFKAUMB6wHv\n        AQcB8ATyA/MC9Af/FwAC/yIAAv8B8gEHAewBQwFLBFgEWQF6AZoBGgG8AfEC8gHzAvQD8wL0BP8PAAL/\n        AfQB8gEHAe8B6wJDARABmQK8AeoBmQFEAhABbQHwAfEEvAHxAfMB9AT/CAAD/wHxAe8BBwGSARIBDgET\n        AesC7wHtAhAB7QGZAUoBFQFDARwBRAFDARMB7QHvBPcCBwO8AfIB8wH0Bf8WAAL/AfIXAAH/CQAC/wH0\n        AbwB6wFKAXkCmgIaAXQBWAF6AZoCGgK8AfED8wLxAvQB8wPyAfQE/w0AAv8B9AHzAfAB7AEUAUoBSwJ0\n        AZkB8AHyAfcBHAF5AXQBSwFEARUB7QLxAfACvAHwAfIB9AT/BwAB9AK8Ae0BFQFDARQBEwFKARUBEQEP\n        ARMBFQFDARUBDwEVAXMBSwEPAhEBEAEPARQB6wHsAesB7QHsApIC9wIHAfAB8gHzAfQD/wQABP8OAAH/\n        AfMB8QL/DwAD/wMAAf8JAAH/AfQB8wHtAXMBmQIbAfAC8QFKAZkBGgHwBAcB8AG8AfAB8QLvAfEB9AHz\n        AfIC8AHyAfQD/w0AAv8B8wHwAesBFAFLApkCGgEHAewB8gHrAe8BvAGZAXkBUgFLARUBbQG8AfIB8QHw\n        AbwB8AHyAfMD/wcAAfEB6gFKAW0BEgHsAUQBFQHqAW0BSwFKAUQBEQIVAUMBDgFDAUQBEQMPAUoB7QH3\n        Ae8CHAFzAUoBFAHrAvcC7wG8AfEB8wP/BAAB/wH0BP8CAAP/BwAB/wHyAQcB9AP/CAAG/wHzAfQB/wIA\n        Af8JAAH/AfQBBwHsARoBGwHzAbwB8AHyAfEBUgHzAgcC7wIHAbwCBwQcAfMB9AHyAfACvAHyAfQD/w0A\n        Af8B8gHrARUBeQEaAfMB8gG8AfABmQFuAewBbQG8AvAB7wGZAXQBUgFEARIB8QH0AfMB8QG8AfAB8QH0\n        A/8GAAHzARwBSgEVAUMBFAFzAXQBRAEVAeoBRAJRARABDwFDARAEDgEVAfIC8wEbAhoBmQF5AlgBRAES\n        Ae0C9wEHAfAB8gH0Av8EAALyC/8CAAT/AfABBwP0Av8DAAn/AfIBvAH0Av8BAAH/CAAC/wHxAe8BBwHw\n        AfIBBwG8AvMB8gEHAfEBBwHvAfcB7wG8AfADvAHvAxwBcwLzAfICvAHwAfME/woAA/8B7wFKARoBGwHw\n        AbwC8gHxARwBmQFzARoDBwG8AQcBHAJSAUoB6wHyAfQB8wHxAbwB8AHyAfQD/wQAAf8B8wHsAUoBSwJK\n        AUMBEgFzAXQBSgFEAUoCSwFEAREDDwFDAewB8gHzARsBmQEcBVECSwFEARUB7QLvAfAB8gH0Av8EAAH/\n        AfcB8wH/AfQB/wH0AfID9Aj/AQcB8AHyAfMB8gHzAfQG/wHzAfIC9AH/AfQBkgHxAvQB/wEAAf8IAAH/\n        AfQBvAIHAbwB9wEHAfEB9AH/AfMB8gHxAfABBwH3AQcB8AHxAfIB8QG8AQcB9wNzAQcB9AHyAfACvAHy\n        AfQD/woAAf8B9AHwAUoBHAH0AfAB7wHwAvMB8gG8AZkBGwG8Au8B9wHvAQcB9wFzAlIBSgHsAfMB9AHz\n        AfEBvAHwAfMD/wQAAf8BBwEUAUMBRAFKAXQBSwFEAUMBSgFuAUQBFQNDAREBDwEOAeoBBwHzARoBdAFR\n        AUsESgZEAW0B7wEHAfAB8gH0Av8EAAH/AbwB7wL/AfQB8wHvAfMK9AIHAfIB8QHwAfEB8wP0A/MBkgHw\n        AvMB9AG8Ae8B8gHzAfQB/wEAAv8HAAH/AfQB8AK8AgcB7wHwAfMB/wL0AfMB8AMHAfAD8gHwArwBHAJz\n        AXQB8wH0AfICvAHxAfQD/wkAAv8B8wEVAW4BGwH0Au8B8QHzAfQB8gHxAbwB8gIHAfcBkgHsAu8B9wFL\n        AlIBRAG8AvQB8wHwAbwB8gH0A/8DAAH/Ae8CRAEVAREBQwFzAXkB7AFKARUBDgEQAQ8CDgEPAUMB6gHz\n        ARsBHANKAVEEWAFKARUCEAFDARUBRAHtAbwB8QHyAfQC/wUAAf8B7AHyA/8C7wPzAfAB8QLzAfIC8wLv\n        AfEBvAEHAbwB8QHyAQcC8gHxAQcB9wPyAfEB7wHyAvMB9AX/BwAB9AHyAfEC8AHvArwB8gLzAbwB7ANK\n        AewBBwHwAvEC8AHxAbwCcwFMAZkB8wHxAvAB8QH0A/8IAAL/AfQBBwEVAZoB9AG8AQcBvAHxAfMB9AHz\n        AvECvAHvAfcC7wH3A+8BSwFSAUsBcwHzAfQB8wHxAfAB8gH0A/8EAAHzAQcB7AFKAUQBQwEVARMB6wEU\n        ARABFQFRAUoBEAIPAeoB8AEaAXkBUgFRB1gBUQFLAUoBEQEQAUMB6wHvAbwB8QHzAfQC/wYAAfAB9wP/\n        AfMB7AHyAvMBvAGSAfIC8QHyAfAB7ALvAgcBvAHxAu0C8AG8Ae0BvAHyAvEB7wEHAvIB8wH0Bf8HAAH/\n        AvQC8gHwArwC8QH3AW4BdAJ5AVIBUQFLAfcB8AHxAvIC8wFzAkwBHAHyAfEB8AHxAfIB9AP/CAAC/wHz\n        AesBUQEaAfAB8gHxAQcB7QG8AfMB9AHzAvIB8QHwAgcB9wEUAfcCBwHtAUsBUgFLAfEC9AHyAfAB8gH0\n        A/8EAAH/AfQB8wHvAewB6gFEAkoBRAFKAhwBUQFEAQ8BbQHyApkBGgdYAVEBWAF5AlEBRAERARMBHAEH\n        AfAB8QHzAfQC/wYAAf8B9wG8AQAC/wLvAvQB8QHtAbwB8QLwAZIB6wEHAesB7wEHAfABvAESAQcC8QLv\n        AfEB8gHxAQcB7wHwA/MB9AH/AQAD/wYAA/8D9AHyAfEB8AEHAfcBSwGaARoCGwGZAXkBUgFLAQcB8QHz\n        AvQB/wHvAkwBUgHxA/IB8wL0Av8IAAH/AfQB8AEUAVkBGwHwAfMBBwISAesB8QLzAfQD8QG8AQcBbQER\n        AUMBkgEHAe8BSwFYAVIBBwH0AfMC8gHzAfQD/wUAAv8B9AHzAe8BcwJKAUQBHAEaAUoBFQFDARIB8AHv\n        ArwBeQdYAVEBWAGZAVECSgFEAesB7wHwAfEB8gHzAfQC/wcAAfIB7AHyAgAB/wHsAfIB/wHzAQcB9wHw\n        AfEB7wFtAfcB7wHrAewC8AHtAbwC8gHxAesBvALyAfAB6gHwAfQC8wH0Av8BAAP/BgAH/wHzAfEBvAHs\n        AZkBGwG8Ae8B8AEHARwBeQFSARwB9AT/AfABSwFMAVIBvAHxA/MB9AP/BwAC/wH0Ae8BSgFZARoB8gH0\n        AfEB8AHyAQcB7wHxAQcB6wEVARMB9wEHAewB6gG8AZkB7wG8AQcBbQJSARwC8wLyAfQE/wYAA/8B9AHy\n        AbwBHAFKAXMBHAFEAhEB7wK8AfABmQhYAVEBUgEaAVEDSgFtAQcC8gLzAfQC/wcAAf8B7wFtAfMB/wEA\n        AQcBkgH0Af8B8wHvAbwB8QHsAe8CvAGSAesBvAEHAfcB8gHzAfEB7AH3AfIB8wHxAewB8AHzAf8C9AL/\n        AgAD/wYAAf8B9AX/AfQB8gHwAXMBGgHzAewBEgEUAeoB6wFRAVgBeQH0BP8B8QEVAUwBUgG8AfIB8wL0\n        BP8HAAL/AfQB7AFLAVgBGgHzAfQB/wH0AfMB8gEHAeoBFQFKAksBFQEUARwB7wS8AfEB7AFKAVIBdAHy\n        A/MB9AT/BwAD/wL0AfIB7wEcARIBFQERAe0BGgG8AfIBGgGaAXkDWAJ5AlgBUgFRARsBcwJKAXMBkgHx\n        AvMD9AL/CAAB9AHsAe0B8wEAAfIB6gHsAfQB/wHyAfMB9wEHAfAC9AHxAewB6wHzAfEB9AHzAZIBbQEH\n        AfQB8wH3ARwB8QX/AwAD/wYAAv8B9AX/AfQB8QGZARsBvAFmAosBswESARUCeQH0A/8B9AG8AUMBTAFS\n        AbwB8wH0Bv8HAAL/AfQB7AFLAXoBmQL0BP8B8wFzAVIBegFYAUwBdAG8AQcB8QTyAfEBkgEVAUwBcwHx\n        AfIB8wH0BP8LAAL/AfQB8wHwARwCEwH0AZkB8gEbARoBmgF6AZkCeQKZAnkCUQHzAXMBFQFKAXQBBwHy\n        AfME9AL/CQAB8gHtAewB9AHtAewBFAHsAfQBAAHzAQcB8gH/AgAB/wEHAW0B8gL/Ae0B6gHvAewB8ALs\n        AfAJAAP/BgAB/wLzAfQE/wH0AfMBmQHzAewBkQG1Ae8BtQGRARQBmQG8Af8B8wH0AvMBvAFDAUwBUgG8\n        AfMB9Ab/BwAC/wH0ARIBSwF0AZkB8wX/AfQBBwFKAXkBWAFSAUsB6gHxAfIB8wHyAfEC8wEHARABUgF0\n        AfMB9AX/DQAC/wH0AfMB8QHrAe8B8AHxAhsBGgWZAhoBvAGZAVIBUQHzAW4BFQFKARwB8AHzA/QE/woA\n        AfAC7AGSAfEBvAHrAfcB8wIHAfIBAAHzAfIBAAH0AQcBkgHyAe8B6wG8AfEB7wHtAesBvAH0CQAC/wcA\n        Af8B8QHwAfMC9AL/AfQB8wEHAfMBHAH3AbwB8QEJAbQBbQEaAbwC8wHxAfAB8gEHAUMBUgFYAbwB8wf/\n        BwAC/wH0AesBSwFSAZkB8wH0AfIBBwHxAQcB7AEVAUoBmgEaAXQBRAEOARMB7AH3AuwC9AEHARABUgF0\n        AfQF/w8AAv8B8wHyAe0B8QEcAxsCGgKZAbwD8AG8AZkBdAFYARsBSgEVAUQBcwHxAfQH/woAAf8BvAHs\n        AfEB/wEAAbwB7AGSAQcB8QL/AQcB9wL/AfEB7wHsAe8B8AL/AfEBkgEHAfQB/wkAAf8HAAH/AfQBvAEU\n        ARwC8wL0Af8B8wHwAhsB9wEHAbwBuwHrAZkC8QH0AfMB9wFDAQcB9wEVAVIBeQHyAfMD/wsAAv8B9AHs\n        AUsBTAEcAfMB9AHvARUBEQEcAZkBHAGZARoBBwFLAUUBEAEHARoBTAFKARwC/wHvAUMBdAGZBP8SAAH/\n        AfMB8gGSAfEBGwLzARsCGgK8AfACGwHxArwBdAGZARoBSgEVAUQBHAHzCP8MAAHwAfMDAAHxArwB9AEA\n        AfMB7AEcAbwBAAH/AfAB8QHwAf8CAAH0AfAD/xEAAf8B9AEHAUsBSgHsAfAB8wP0AfIB8QHyARsBBwG1\n        Ae0BBwHyAfAB8wH0AfMBkgFSAUsBSgFRAVgBmQHyAfMC/wwAAv8B9AHvAUsBUgF0AfAB8wHwAZkB8gHw\n        ARwBGwHxARoBSwF0AbwBdAGZAfEBvAGZAbwB/wH0Ae0BRAF0AZkB9AL/EwAB/wHzAfAB7wHwAvMCGwG8\n        AhoB8QTyAfABvAF0ARsBmQFKARUBSgGZAfQI/xEAAf8B8wHwAv8B7wHwAfIB7wHzAQAB8wHyAf8GAAL/\n        EQAB/wH0AQcBUQFMAksB9wHyAvQB8wHyAfEB8AHyAfMB8QHwAfEB8wL0AfMB7AJ5AVIBWAF5AbwB8gH0\n        Af8OAAH/AfQBvAFKAVIBTAG8AfMB9AHyAvQBcwJ0AUwBUQJMASsBUQHwAfQB8wH0Af8B8gFtAUsBmQG8\n        AfQB/xQAAf8B9ALwA/MCGwHwBBsB8gHxARsB8gGZAXkB8wGZAUoBFQFKAZkI/xMAAv8BAAH3AbwB/wEA\n        AfEBBwP/AgAB/xcAAf8B8wG8AVEBWAJMAUsB6gHwAvQC8wPyA/MD9AHyAXMBmgJ6AVkBUgG8AvMB/w4A\n        Af8B9AHxAesCUgF0AfIB8wL/AfMBSwEsASsBRAFSAUMBJQEsASMB7wH0Av8B9AEHARQBWAEaAfEB9AH/\n        FAAB/wH0AfIB8QEbAfMDGwHxAhsE8wIbApkB8wGZAUoBFQFuAbwF/xgAAfQB7AH0A/8BvAHyHAAB/wHz\n        AQcBUgFYA1IBdAEcAfEE9APzAfQD/wH0AfIBHAEaApoBegF5AXMBBwHyAfQB/w0AAv8B8wH3AVEBUgFK\n        AQcB8gH0Af8B8QEVAUwBSwFzAZkBeQJKASQBdAP0AfIB6wFLAZkBvAHzAv8UAAL/AfMB8AHyBRsB8gbz\n        ARsBvAEbAfMBdAFKAUQBcwHxHQAB8gHqAfIB/wEAAfQBBwHxAf8bAAH/AfMBBwFSAVkBWAJSAbwB8AHy\n        AfQK/wH0AfEBHAQaARsBGgG8AfMC/w4AAf8B9AHwAUQBTAFLAUoB8AHzAfQBBwFKBRoBGwF5AVMBUgLz\n        AfIB7QFEAXQBGwHwAfQB/xUAAv8B9AHxAfIGGwbzAfEBGgH0AfABUQJKAQcB8x0AAf8B7wHsAfQBAAGS\n        Ae8B/xwAAf8B9AHvAVIDegFYAXMB8AHzAfQK/wH0AfABHALzAvQB8AHzAfQC/w8AAf8B9AHzAQcBSwFS\n        AUsBbQHwAfIB7wFRAZoEGgL0AXoBeQLyAZIBQwFRAhoB8wH0Af8WAAH/AfQB8wHwAfQEGwfzAfAB9AHz\n        AXkCSgF5AfAB9B8AAe0B8QHyAe0B9B0AAf8B9AG8AZkBvAGZAXoBWAFRAesBBwHzCv8B9ALwAvIB8AHy\n        AfMB9AL/EQAB/wH0AfIBHAJSAUoBbQG8AfcBcwGaBRoB9AHzAZkB8AGSAUoBUgGaARoB8QH0Af8YAAH/\n        AfQB8gHwAfICGwfzAfIB8wH0ARoCSwFzAbwB8gH/HwAB9AH3ARwB8wH/HQAC/wG8AfAB8gHwAZkBegF5\n        AVIBSwHrAQcB8wj/AfME8QHzAvQD/xEAAf8B9AHzAfABdAJSAUoBEwHsAW4BegGaBBoB9AEbARwBbQFK\n        AXQBGgLxAfMB9AH/GAAC/wHzAfIB8AHyARsK8wF0AUsBdAHwAfEB9AH/HwAB/wHxAfAB/x8AA/8C9AHy\n        ARoBmgF6AVkBUgFKAusBHAG8AfAB9AH/AfQB/wLzAvID9AL/FAAB/wH0AfMBvAF6A1gBSgFDAUwBmgIa\n        ARsB9AEbAXkBFAFRAZoBGwH0AfAB8wH0Av8ZAAH/AfQB8wHxAfICGwTzARsC8wEbAZkBWAF5AfAB8QH0\n        Af9EAAX/AfMB8AEaAZoBegF0AhwC7wEHAfQC/wH0Av8B9AT/FwAB/wH0AfMB8QEHAZkBeQJ0AVgBmgIa\n        ARsC8wHwAhsB8wHyAfAB8gH0Av8bAAL/AfMB8QHyAfMBGwbzARoBmQEaAfAB8gH0Av9HAAP/AfQB8wHw\n        ARoBmQIcAQcCvAHzAv8B9AP/GwAC/wH0AfMB8gHwAQcCmQIaARsG9AHxAfAB8QHzAfQC/x0AAv8B9AHy\n        AfEH8wLyAfAB8gP/SwAC/wL0AfMDvAHwAfEB8wH0Av8gAAH/AvQB8wHyAfABvAHwARsB8gHzA/QCvAHx\n        AfIB8wH0Av8fAAL/AvQB8gG8AvEC9AHxAbwB8wH0Av9OAAP/BPQG/yEAAv8B9ALzAvIB8QPwAfED8gHz\n        AvQC/yIAAv8C9ATzAfQD/1EAC/8jAAP/AvQG8wP0A/8lAAr/gwAD/wP0Bf+4AAP//wD/AP8A/wD/AP8A\n        jQAQ/4EAAv8LAAb/GwAB/wHzDPID8wH/WAAE/yMAB/8FAAP/AfQB8wH0Av8bAAH/AfAN7wEHAbwB/yEA\n        Af8B9AH/CgAB/ygABv8iAAH/A/QJ/wL0AfMB7wH3AfQB/xwAAQcG7QfsAe0B7wHzHwAC/wHzAfIB8wL/\n        BAAC/wX0A/8aAAb/AgAK/xcAB/8BAAH/AvMF9AL/AvQD8wHwAewB7QEHAfQC/xcAA/8FSwRKBkQBcwHx\n        Bf8ZAAL/AfQB8gLwAfMC/wIAAv8B8wHyAvEB8gLzAfQD/xgAB/8BAAH/BvQD/xcACP8B8gHtAe8B8QHz\n        AfQE8wLyA/EBkgLvAbwB8wb/EgAB/wHzAfABvAFLAUoCSwREARUCQwREAXMBvAHxAvMB8gL/GAAB/wH0\n        AfMB8gEHAeoB8QHzAf8BAAH/AfQB8gTxAvID8wL/FwAB/wH0A/MC9AP/BfMC9AL/GAAC/wH0Af8C9AH/\n        AQcB7wH3AeoB7AHyAfMC8gHxAvACvAHsAe0BBwHyAvME9AT/DwAB/wHyAbwC7wJLA0QBQwIiAUMEIgFE\n        ARUBcwHwBPEB8wH0Af8VAAL/AvQB8wHyAe0BFAHtAfEB8wH/AfQE8QG8Ae8B9wHvAQcB8QHzAfQB/xcA\n        Af8B8wLwAfEB8gHzAfQB/wH0B/MB9AL/FwAD/wb0AfEB7wLqAe8B8AHyAfACBwHvAewBkgEHAfEC8gTz\n        BPQC/w4AAf8B8wG8AQcB7wFLAUoCRAFDCSIBFQFzAfEB8wTyAfMB9AH/FAAC/wL0AfMBBwFsARMBQwEH\n        AfEB8wHyAvEB8AEHAesB6gISAeoB7AHvAfQB/xcAAfQBvAMHAbwB8AHyAvMF8gPzAfQB/xUABP8B9AHz\n        AvQC8wH0Af8B9AEHAfcB6wFtAe0B7wHrAm0B6gEHAvEC8gfzAvQB/w8AAf8B9AHzAbwBSwEVAUQCQwQi\n        AhADIgEVAXMC9ATzAfQB/xUAA/8B9AHyARECbAEPAewF8QHwAewBEgGuAWwCEgEUAQ4B7wH/FgAB/wHz\n        Ae8BkgL3Ae8BBwG8A/EG8gLzAfQWAAH/AvQB8wHyAvQB8wHyAvMB9AH/AfQBvAHvARQBEQESAesB7wH3\n        AewBkgHxAvIB8wj0Af8PAAH/AQAC/wFEAUMCEAQiBxAB7AL0AvMC9AH/FgAD/wHzAewBQwFtARIBDwET\n        AbwE8QHvAW0B7AH3AewBEgFtAewBbQHqAfAB/xUAAf8B8gHtA+wB7QL3AgcBvAHxB/IB9AH/FQAC/wHy\n        AfEBvAHzAf8B9AHzAfICvAHxAfQB/wHyAbwB6wETAW0B7QLvAZIB7AGSAQcB8AHzBf8B9AL/DgAB/wHz\n        A/8CQwERASIBFQMiBRABQwEiAW0B8gHzAbwB8gL/FwAD/wG8ARQBQwHsAeoBDwFDAe8C8QHyAfABbQHs\n        AbwBBwHsAW0B7QHvAbUBbQHsAfQVAAH/AfIB7AFtAusD7AGSAfcB7wXxA/IB8wH/FgAB/wHyAbwB7wHx\n        AfQB/wH0AfIB8AL3AZIB8wH0AesB7AHvAesBEwHsAbwB8AEHAe8BkgH3Ae8BBwHxAfIB8wT/DgAB8wGS\n        AewBbQFEAkMDRAFKASIBQwJEA0oBRAEQASIBbQHzAewBBxoAAf8B9AESARUBQwGRARQBDwFDAW0C8QHz\n        ARIBkQH3Ae8B7QHsAesB7AHvAbsB6wESAfIVAAH/AfEBbQESAuoE6wHsAfcB8AbxAfIB8wH/FwAB8wEH\n        Ae8B8AP/AfQB8gHxAe8B7AHrAhUB7AHvAbwB9wETARIB7AEHAfMB8gHxAu8B9wHsAe8B/w8AAv8BvAEi\n        AUQCSgJLAkQBSgFRAUQBSgFLAUoBRAVKAUQB7AFKAZID/xcAAf8B6wETAUMBEwHsARQBDgFDARUB9wG8\n        AfcBbAL3Ae0B7AHrAewB6wHsAfcB7QHrAfEC/xMAAf8B8gISAhME6gFtAe0B8AfxAfMB/xcAAfQB7wHs\n        Ae8B8wIAAf8B9AHzAfEBBwHrAewB6gHtAbwD7wLsAfcBkgEHAfEC9AHzAbwB8xAAAfQBGgEcAQ8BRAFL\n        AXQBeQJ0AVIBSwFRAUsGdAJ5AXQBSgFEAUMB7AHzAfIB/xYAAf8BBwFmAkMBEwHrARUBDgERARQBEwEH\n        AesBrgPtAesBbQHrAuwB7QHvAewBvAL/EwAB/wHyAeoBFAFEARIBSgHqAhIBRAHrAfAH8QHzAf8XAAH/\n        AbwB7AHtAfACAAL/AfQB8gHsAeoB7AHtAvcC7wL3AuwCvAPvAQcBvAH0Af8PAAH/AZkBmgEVAUMBSwF5\n        ApoBdAFRAksBSgV5A6ABmgFLAUoBRAF5ARoB8hcAAfMBEgERAQ4BEAHtAQcB7AEOAQ8BEQEVAewB6wGR\n        AuwB7QLrAewB9wLsAe8C9wL/DgAC/wMAAf8B8gHqAkQBEgETAUQBFQFEARQB6wHwB/EB8gH/GAAB8wHs\n        AeoB7wH0AwAB/wG8AewBBwLvAewBBwLtAe8DBwHtAbwB/wH0AQcB7AESAZIB8w8AAgcBeQF0AUQBUQFL\n        AnkBcwFLAUoCRANKAksBdAJ5AXMBSwFDAUoBeQFzAfIB/xYAAe0CEQEQAeoBkgHvAZIBFAEOAQ8BEQET\n        AeoB7QHsAesBkQHtAfcB7QH3Ae8B7QP3Av8NAAHzAuwB8gH0AgAB8gHqAhECQwIVAkQB6wHwAfIG8QHz\n        AfQB8wL/FQAB9AH3ARMB7QG8Af8BAAL/AfQB8wHxAbwBBwHvAe0B9wGSAesB7AGSAbwB8gHzAfQCAAH0\n        AfABvAH/DwAB8AEHAZkBdAFLAXQBSgHvAXMDSwFKBEQBSgFLAnQBbgHsAUsBQwF0AXMB6wG8Af8VAAHw\n        AhUCEQESAeoC6wJDARQBDwEQARQB7QHrAeoB7wH3AQcB9wHtAZIB7QH3Ae8B9wL/DQAB/wHyARwBbgHs\n        Ae8B8wG8ARUCDwIRAUMCFQFEAW4B8AHyBvEB8wHyAvEB9AH/FQABvAEUAW0BBwHzA/8B9AHzAfEBvAMH\n        Ae8D7AHvAfAB9AL/BAAB/xAAAf8BvAEcAUoBSwF0AUsB8gEcAUQCSwFKAkQCSgFLAkoBkgH/AewBdAFD\n        AksBBwH/FQAB/wFDARQBDwJtARIBrgHqAWYBEQEOARQBFQEQAeoB9wHsAesB9AG8AfMB8QLvAfcCBwH3\n        Av8QAAHzAe0BEgJEAw8BEAIiAREBFQFEAesB8AHyCPEB8gHxAfIB/xYAAewBEwK8AfMC9AHzAfIB8QHw\n        AgcBvAHwAQcBkgH3AQcB8wL/FwAB/wHzARwBmQGaAXQBHAHyA0QBSgJEAkoBRAFKAUQBvAHwAUoBeQGZ\n        AUoBHAH/FQAB/wHsARABQwITAQ8BFQERBQ4BEAFtAewBBwHrAe0B8QG8AfAB8QG8AfcC7AH3AewC/xAA\n        AfQB8QG8AeoCbgJEAg8DIgEQAewB7wHrAQcBvAjxAfMB/xYAAQcBFAHsAbwB8wH0AfMC8gHwAwcBvAHw\n        AfECBwHyAfQB/xoAAfMBmQGgAXQBbgFKAUQBSwFuCEsB7QEUAXQBmgHDARwB9BYAAf8BBwHtAeoBEAMP\n        Aw4BEAIOARAB6wHvAfMC7AH3AewCkgHsAe0C7AHvAewC/xAAAbwCbgFtAW4BGgEcAW4BQwEiBA8B7AFt\n        AkQB7QHwB/EB9BcAAfMBbQEUAbwB8gH0AvMB8gHsA+sB7AEHAfIC8wH0Av8bAAEaAXkBdAFLAkQBSwFz\n        BHQBSwF0AXMBSwFtAUoBdAGaAUsB9BkAAfEBFAFDAewCBwL3AewBrgFtAhAB6gHwAf8B9wHsAZIB6wHt\n        AfcB7QEHAuwBvAHsAv8PAAHzAW4BSgFtAnQBSwVEAw8BFAMRAW0BvAHxAvIE8QH0FwAB/wHtAQ4B9wG8\n        AQAC9AG8AesB6gJtAeoBEgHxA/QB/xwAAfMBHAF0AXMCRAFLAXMBdAJ6AnQCSwFKAUQBSwJ0AfAZAAHz\n        AeoBFAHsAfAB9AHzAfABBwL3AZIBbQERAeoBBwK8AewB7QHrAfcBkgHsAe8BbQHtAbwB6wL/DwAB8gNu\n        AXMBHAREARQDRAFDAkQBQwFEAe0D8QHyBPEB8gH0Av8VAAHwAQ8BbQG8AfMB/wH0AW0B7QFtAesCbQHq\n        AfcB9AP/HAAB/wEHAXQBcwJEAUoCSwJ0AksDSgFLAnQBBxoAAfQB7AFtAfcBBwHxAe8BEwFDARIBrgHr\n        Aa4BEgFDAesB9AHwAewB7QHrAfcC7AHtAW0BkgHzAesC/w8AAfIBbgFKAUQB7QH/AW4FRAJDAUoBbgFE\n        AkMB7AfxAfMB8gHxAfIB9AH/FAAB9AETARUBBwG8Af8B8AEPAewB6wHqA20B7QHzAf8fAAH/AXQBcwFK\n        AUQBSgRLAVEBSgEVAUoDSwFzAfQaAAH0ARIB7AH3AuwBBwJtAe0BrgFsAa4BbQERARQB9AHwAZIB7wHs\n        AQcC7AH3AW0BBwH/AewC/w8AAfACbgFEAe0B9AJuAkoDRAFtAW4BdQFLAUMBFQHsB/EBAAH/AfMC8QHz\n        FQAB9wEOAewBuwHyAe0BFQHrAewBFAESAW0BEgHsAfIhAAHyAUsBSgJLAUoERANKAUsBUQFKAQcB/xkA\n        Af8B7wESAfcC7wFtAfcCBwGSAW0BEwHsAesBEwFtAfQB8gHvAfIB9wG8Au0BBwHqAQcB/wHtAv8QAAGT\n        AW4BSwFEAewBdAJuAUsBbgFKAhMBbQREAW4BkgG8AfAD8QHzBAAB9AHzAfEB9AH/EgABvAEOARMBvAHs\n        ARMBvAH3AuwB6gESAW0B9wHwIQAB/wHsAUMCRAFKAXMDRAJLAkoCRAHzGgAB9AHsARIB9wLvAbwB8gGS\n        AewC9wHtAfcB6wESAe8B9AHyAe8B8gH3AQcC7AH3AeoBBwHzAQcB/xEAAfQBBwFLAUQBbgF0AW8BSwJE\n        AUoBEgJKAQ4BDwFEAW4BbQJuARwB8QLyAf8FAAL/AfQB/xIAAbwBDwERAQcBvAHvAfQBEgFDAZIB7wH3\n        Ae8BvAHzIAAB/wG8AZkBmgOgAXQDRAFKAXkBegF0AUsBSgHzGgAB8wHqARIB9wLvAgcB6wIVAvcBkQHr\n        ARMB8AH0AfIB8AHyAe0BvAH3AewBBwHqAQcBvAH0EwABBwFLAUQBmQF0AW8BbgNEAUsCbgFEAUMBSgHx\n        AfABkgFuAUsB7QHyAf8cAAG8ARABQwFtAe8BuwHsAhEB6wP0AfAB/x8AAf8BBwSaAaABmgF5BEoBdAOg\n        AZoBmQG8AfQYAAHzAeoBbAGSAfcC7AG1BPcBkQHsAesBbAG8Af8B8wHyAfQB9wHxAbwB7wHxAfcB8wL/\n        FAACHAHDAXUBdAFLA0QBSgFLAm4BSgFuAfID8QEHARwBcwG8Af8bAAG8ARUBQwFtAeoB7wETARUBbQLz\n        AvAB/yAAAf8BvAEbAfMBGgGZAZoBmQFLAkoBSwFKAXMBmgKZAbwB8wG8AfAYAAH0AewBbAHtAfcB7AFt\n        AZEB8QHzAQcBkQHsAe0B7AFtAfAB/wH0AvMBvAHyAQcCvAHxA/8UAAH0ARwBmQF1AXQCRAFKAkQBbwGU\n        ApkBvAPxAfMBAAH/AfMB8AH0GwABvAERARABEQHqAe8BEQHtAfAB9AG8AfAB/yQAAv8B9AIHAUoBcwF5\n        AXQBSwFuAZMB8QP/GgAB/wHtAWwBrgFsAm0BkQG8AfMB9wJtAZEB7QFtAfAD/wH0AfEB8AH3AfMB9AP/\n        FQAB8AJzAXUBbgFEA0oBRAJ0AXMB8AHzBPEB/x4AAf8B7AEPAg4B9wFtAREB8ALvAfMB/yUAAv8C9AHz\n        AQcCdAF5ARwB8AHzAfQD/xoAAfQB7AFtARIDEwHrAfABBwHtAeoCEwGuAeoBvAT/AfMC8AT/GAAB/wHy\n        AQcBcwFLAkQBbgEHAfIBAAH/AfIE8QH0GAAB9AHxAfMB/wEAAfQB8QEVAhABEQH3AUMBFQHzAZIBvAH/\n        JgAC/wL0AfABHAFzAXQBcwF0AbwB8wL0Av8aAAH0AewBbQHqAusBkgEHAfAB8wG8Ae8B7AHrAa4B6gHv\n        Bf8B9AT/GwAB/wHvA0QB7QH/AgAB9ALxAfIC8QH0GAAB9ALsAfAC9AGSAUMCEQFDAZIBDwEVAfEB7AHw\n        JwAC/wL0AQcBcwF5ApoBeQEHAfMC9AL/GgAB9AHsARQB6wG1B/8B8gEHAfcBbQEHAf8DAAX/HAAB/wEc\n        A0QBSwH/AgAB8wHxA/IB8QH0GAAB9AHtARUB7AHvAZIBEgMRARQB9wEPAREBvAHrAfAnAAL/AvQBvAF6\n        AZoBwwGgAZoBmQHzAvQD/xkAAf8B7wFsAW0B9wH0Bv8B8wEHAe0B6wHxAf8kAAHzAnMCSwFuAbwCAAH0\n        AvEB8gLxAfQZAAHwAewCFQFDBBEB6wHvAREB7QH0AfAB8ScAAv8C9AG8AZkCwwGgAZoBvAHzAfQD/xoA\n        Af8B8gHrAW0B9wHxBv8B8QHvAe0B9wH0Af8kAAHwAXQBkwEaAnQBBwIAAf8B8gHxAfIC8QH0GQAB/wHy\n        Ae0BQwERAkMBFQHqAfIB7AH3AfQB8gHwAf8nAAP/AfQB8wGZAsMBoAGaAfAC9AP/GwAB/wG8AewB9wHw\n        Bv8BvAEHAe0B8QH/JQABBwEcAhoBmQF0AQcDAAH0AfEB8gHxAfIcAAHyAbwD7AHvAfMB7QHsAQcBvAHy\n        AfQoAAP/AvQB8AGZApoBvAHzAfQD/xwAAv8B8gEHAbwB9AX/AbwB7wG8AfQB/yUAAbwBcwFuAZoBdAFu\n        AQcEAAH0AfMB9B4AAfIB8QPyAbwB9wG8AfEB9CsABP8B9AHyAfAB8gHzAfQE/xwAA/8B9AHxBvAB8QHz\n        A/8lAAHzARwBdAGaAnQB8AUAAv8fAAH/BfQC/y4ABP8C9AX/HwAC/wP0A/MC9AP/JgAB/wEHAXQBmgF0\n        Ae0B/1wACv8gAAb/AfQG/ygAAbwBHAEHAf9gAAX/IgAM/ykAAf8B9AH/iwAG//8A/wD/AMAAB/+NAAP/\n        JgAO/4gAAf8B9AHzAfQB/yUAA/8B9AL/AfQI/1QAD/8jAAH/AfQB8gHsAfAB9AH/IwAD/wHzA/IC8QHy\n        AfEC8gH0BP9QAAP/BPQF8wT0A/8hAAH/AfQB8AERAewB8gH0Af8iAAP/AfIBvAH3A20CFAHqAfcBvAHz\n        AfQC/yIAC/8iAAL/AfQB8wHyAvEG8APxAfIB8wL0Av8bAAT/AfQB8gHtAREBcwEHAfIB9AT/HwAC/wHw\n        AewBFAMVARQBQwJKAewB7wHyAv8cABf/GwAB/wH0AfMB8QHwAgcB9wPtApIC9wHvAgcC8AHyAfMB9AP/\n        FwAC/wL0AfIB8QEHARIBRAFzARwBvAHyAfMC9AL/HgAB/wH0AfcB6gEVAUMBFQFEAksBdAF5ApkBvAH0\n        Af8bAAT/AvQG8wLyA/MB9Af/GQAB/wH0AfMB8AEHAfcC7AFtAeoBbQHrAW0C6wLsAe0BkgH3Ae8BBwHw\n        AfEB8wH0Av8VAAL/AfMB8gHwAbwB7wHtARUBSwJzAu8BvAHxAfIB8wH0Av8dAAH0ARwB6gFKAkQBSwFS\n        AXkBmgEaARsCvAHzAf8aAAP/AfQB8wHxAbwB9wFtARQGQwESAewBvAHxAvMB9AX/FgAB/wH0AfMBvAGS\n        Ae0BkQFtAmwBFAVsAm0C6wPtAu8BvAHxAfMC/xIAAv8B9AHyAbwBBwH3AZIB7AFtAUQBUQF0AUsB7AHt\n        AvcBBwHwAfEB8wH0Av8aAAL/AfIB7QFLAXMCSwFSAZoBGgEbAfIBvAHxAfQB/xkAA/8B8wHxAQcB7AHq\n        AUoBSwF0AXkCmQJ5AXQBUQFLAUoB6gGSAQcB8gHzAfQF/xQAAf8B8wHwAu0BkQGuAWwBFQIUAUMBFQJD\n        ARQBbAGuAeoC6wLsAe0BkgHvAQcB8AHzAfQC/xAAAf8B9AHyAQcB9wHsAesBEgEUARUBSgJ0AUsBFAFt\n        AesB7QGSAfcBBwHwAfIB9AL/GgAC/wHyARwBcwJLAVIBmgEbAfEBBwG8AfIB9AH/GAAD/wHzAfABkgES\n        AXMBmQMaArwB8AG8AQcDmQF0AVEBSwFtAe8C8AHyAfQE/xMAAfQBBwGRAfcBkQFsAhQBEQFDAhEBEAER\n        AhUCQwEVARIBbQHrAewC7QGSAe8BBwHwAfMB9AH/EAAB/wHzAQcB9wHrARABEQEVAUsBdAMcAXQBSgFD\n        ARMBFAHsAu0B7wEHAfEB8wH/GwAB/wH0AfMB7AMVAUsBmQLvAbwB8gH0A/8TAAX/AfMB8AFtAeoCGgIb\n        AfAB8gLzAfQB8wHyAfECBwKZAXkBUQFtAe8BvAEHAfEB8wH0A/8SAAG8AfcBuwGuARQBEAFsARMDFAEV\n        AQ8BDgEQAkMBDgEPAUMBbAFtAewB6wPtAe8BBwHwAfMB9AH/DQAC/wH0AfABkgETAUMBSgFzA5kEHAJ0\n        AUoBFQESAewC7QGSAQcB8QHzAv8ZAAL/AfQB7QFDAUQBeQEbAZkBHAHvAQcB8wX/DQAK/wHyAW0BcwEa\n        AfMB8gHwAfMD9AHzAfIC8QHwAbwDBwGZAXkBUQHsAQcB8AEHAfAB8gH0B/8MAAH0AfcBugGRAWwBFQEU\n        AW0C6wGSAewB6gEUAg8CEQEQAREBDwFDAeoBbQLsAu0B9wHvAQcB8QHzAv8LAAL/AfQB8gH3ARIBRAFz\n        ARoBmQFzAUoBFAIVARQBSgFuAhwBcwJKAewC7QGSAQcB8QHzAv8XAAP/AfQBFAFEAUsBdAGZAZoBmQGS\n        Ae8B8QH0Bf8MAAj/AfQB8wH3AewBGwH0AbwB8QHyAfQD8wHxAbwBBwLvAQcC7wIHARwBeQF0AXMCvAEH\n        AfAB8gH0Bv8LAAH0Ae0BkQGuARQCbAHsAe8BvAIHAe0B7AHqARUDEQEPARACEQEUAW0B6wPtAu8BBwHw\n        AfMB9AL/CAAC/wL0AfIBBwESAUoBmgEbARwBQwIRAUMDFQERASIBQwFuARwBcwFLAUQB7ALtAe8BBwHy\n        AfQD/xQABP8B9AHzAUQCQwHrAbwB7wHtAfcBBwHyCf8IAAj/AfQBBwFtARsB9AEHAbwB8AHxA/IB8AG8\n        Ae8B9wTvAvcCBwJ5AXQB7AG8AgcB8AHzAfQF/woAAf8BvAKRAWwBEQJsAewC9AHzAQcC7AFtARMBFQIR\n        AQ4CEQEQAUMBEgFtAewBkgLvAgcB8AHyAfMC/wcAAv8B9AHzAfEBBwESAUsBwwHyAewCEQFDBBUCFAIV\n        AUMBSgJzAUsBbQHtAZIB7wEHAbwB8gHzAfQE/w0ACP8B9AHzAe8BFQFLAZkBHAGSAe0BkgHvAbwB8gL0\n        B/8GAAj/AfMB8QHrAQcB9AG8AgcCvAHwAbwBBwL3AW0BFAHqARQB6wH3BAcBHAF0AXkBdAEcAbwC8AHx\n        AfMB9AT/CgAB8wH3ApEBbAETARQB7AH3AbwB8wG8Ae8B9wLsAW0BEwFDAQ4BFQIRAQ8BQwESAesB7QH3\n        Ae8CBwHwAfEB8gHzAfQB/wcAAf8B9AHzAfIB8AHrAUoBGgH0AewBEQEVARQEFQIUARMBFAEVAREBQwFE\n        AnMBbgHsAu8CBwHwAfIC8wL0Av8MAAf/AfQB8wHxAfcBFAF5ARsBHAKSAewBkgEHAbwB8QHyAfMB9Aj/\n        AwAI/wHyAZIB7AHzAfQCBwG8AQcBvAEHAe8B6wIUAUMBEQFDARMBHAFtAfcB8AG8AvABcwF0AXkBHAG8\n        AfAB8QHyAvME/woAAQcBtAGRAW0CFAETAesBbQHrAQcC9wHvAe0B7AHrARIBQwEOAg8CEAFDARIB6gHs\n        AfcCBwG8AvEB8wH0Av8HAAH/AvQB8wEHARUBHAH0AZkBEQFEAxIDFAQSARUBQwFEARUBSgF0AnMB7wIH\n        AvAC8gHzAvQC/wwABP8D9AHzAfABvAHtAUQBcwGZAewB9wGSAewC7wEHArwB8QHyAvMB9AX/AwAH/wH0\n        AfEBbQGZAfQDBwK8AQcB6wESAUMBEAESAUQBEAEPAUQB7wHtAW4B9wHyAfAB8QEHAXQBeQF0AQcE8gL0\n        A/8JAAH0AbsCkQFsAUMBEAEVAeoBEgHvAfIB9wLvAu0B6wFtARMBDwEOAQ8BQwERAUMCEgFtAe0CvAHx\n        AvIB8wH0Av8IAAL/AfQB7wFKAcMB8QFEAUoC6wJtAeoDEgJtARIBQwEVAeoCRAFKAXMBUQHvAbwC8AHy\n        AvMC9AP/DAAD/wH0AfMB8gLxAQcB9wEUAREBSwJKAvcE7wEHArwB8ALxAfIC9A7/AQcBbQEaAfABBwFt\n        AZICBwH3ARQBSgFEAUMCFQFDARIBSgFDAUoBHAHrAe0B8AHvAesBbgJ5AQcB8gHzAvIB8wH0A/8JAAHy\n        AfcBtAGuARQCFQJDARABvAEHAewB7wH3Ae0B9wHtAesBEgERAQ8CEQEQAUMBFAFtAesBkgHvAfAC8gHz\n        AvQC/woAAf8B7QFRAfQBcwFEAXMC7QLsAW0BEwEUAeoB6wFtARQBEQEVAhICRAFLAXMBHALxAfIB8wH0\n        Bf8OAAP/AfMB8AIHAe8B7AEiAUsBUQFLAUQD7wMHBLwC8ALyAfMB9An/AfQB8QHvAfIB7wF0ARsBHAHs\n        AQ8BFAHrARQB6gEUAewBcwESAREBEAETAW4BcwJKAUQCSgESARMBQwESAXQBeQEcAfMB7wH3AfIB9AT/\n        CQABBwK7AZEBbAESAWwBEwEUARMB9wHsAW0C7wIHAe0B7AFtAUMCEAIPAUMBFQFtAewBkQEHAfEB8gHz\n        AvQC/wkAAf8BvAHtARMBegEbAW4B7AEcAe8B9wHtAewB6wETAUMC6wEUARABEQETARIB6gJEAUoBUQFL\n        Ae8B8QHzAfQB/xMAA/8B8wG8AgcB7wEUAUsBeQGaAZkB6wHvAQcFvAXwA/IB8wH0B/8B9AHzAewBmQHx\n        Ae0BmQEaAW0BEAEOAQ8CSwFKAUMBbQFzAUQBFQFEAXMB7wEcAnMBSwFEAXMB6gEUAREBQwFLAXkBHAH0\n        AesBbgHwAfMB9AP/CQABBwK7AuwCkQH3Ae8B9wHrAeoB7AHzAfQB8gHvAe0B7AHrARUCEAEPARABFQET\n        AusB7AEHAfIC8wH0Av8GAAH/AfQB8gH3AeoBFQFEAVEBmgGZAUoBbgHvAbwB9wLtAewB7QHqAesBEwER\n        ARABQwFtAewB6wHqAkQBSwFRAewBBwHxAfQB/xMAA/8B8AHvA7wBbQFLARwBGgEcAeoBBwHwBfEH8gLz\n        AvQH/wHxAW4BGgHxAe0BmQEaARIBEAEOAQ8BRAF0ARwBbQEUAUoBcwEaAZkCHAOZARwBcwFKARQBQwEV\n        ARQBRAF0AXkB8wHvAXQB7wHzAvQC/wkAArsBtAHqAhUBFAETARQCQwEUAW0CvAP3AewBbQEUAUMBEQEQ\n        AREBQwESAusBkQEHAfMC9AP/BgAB/wEcA24DdAGaARwBSgEcAbwB8gH3Au8B7AHtARMBQwERASIBEAHq\n        AfcC7AFtARIBRAFLAXMBSwETAeoB7QHyAf8SAAP/AbwB6gHrAfEB8AETAUsBmQEaAZkBSgHvAvMB8AHz\n        AvIB8wr0B/8BvAFzAZkB8gHtAZkBBwESARABDgEQAewBSwFzAQcBbgFDAZkDGwGZARwDGgGZARwBbQES\n        AhMBFAFSAZkB8wEHARwBvAHyAfQD/wkAAbwBuwGRAeoCFAFDARECEAEVAhMB6wHvAfIBBwH3AuwBbQEV\n        AhEBQwEUAeoB6wHsAZEBvAL0A/8IAAH/AfABvAEaAZkDeQF0AW0BHAG8AfMB8AO7AfcBEQMiARUC9wHr\n        AewB6wFtAUQBSwJ0AlECSwFRAfMOAAL/AfQD/wHzAewBEgITARABSwF5ARoBmQFtAfMB7wFtAe8E9Aj/\n        AfQI/wHwAXMBmQHzAe0BmQEHARIBEAEPAREBcwFKAUMBHAGZAXMBmQIbAZkBSgFLAZkBGwMaARwBEgHq\n        ARMBbQFRAZkB8wEHARwBGgHyAfQMAAG8AbsBtAFsAkMBEQIQARUBFAEVAeoBFAGSAfQBvAH3Ae0B7AHr\n        ARUCEAERARUBEgLrAfcBvAH0Av8MAAH/AfQBGwGZA3QBEgHtAbwC8wHxAfAB8gFtBBEB7AEJAfcB7AHt\n        AewBbQEVAUsBdAKZAhoB8AHyAf8OAAP/AewBvAH0Af8B7wFKAm4BcwFLAZkBGwGZAUoBBwHsAe8B/wL0\n        AfIB8QH0EP8B8AFzAZkB8gHtApkB6gERARABQwNKAUQBHAHxAhsBvAFKAW4BHAEaAvMCGwEcARQBbQES\n        AeoBbgGZAfMB7wGZARoB8wH0Af8LAAG8AQkBuwFsARQBQwMRAUMBFQEUAeoBFAHsAfQBBwLtAewBbQEV\n        AhEBQwEUAeoC7AG7AbwC/xAAAbwBcwF0AXMBSgHsAQcB8gEHAbwC8wFDASIBEQEQAeoB8QEJAe8B9wLs\n        AeoBFQFzARoCvAHxAfQB/wwAA/8BAAP/AbwBSgHrAQcB7QESApkBdAFLAZkB8AEcAUsCHAGZAfQBBwLs\n        Ae8B9BD/AfIBHAGZAfEDHAFKA0MBSwEcAm4BSgHsAfABGgFuAe8B8gLzBPQB7wEUAewBbQESAXMBmQH0\n        Ae0BBwG8AfMB9AH/CwAB8AG8AbsB6wGRAWwBQwERARQBEQFDARQBFQESAfcB9AEHA+0B6wESAkMBFQES\n        AW0B7AH3AfAB8gH/EQAB/wEcAXQBcwFKAewB7wHwAe0BEwG8AfADIgEUAbwB8wEJAe8C7QHsAkQBHAG8\n        EQAC/wH3AesB9AL/AfIB6wEcAhMCGgF0AksBdAG8ARwBSgF5ApkBbQETAXMBmQH0BP8EAAn/AfMBHAEa\n        AfEB7wJ5AW0BFAFKAUMBcwEaApkBcwFKARQB7QEcAfQBGwEaBPQB8wHtARIB7AFtARUBdAEHAfQBHAEa\n        AfAB9AL/CwAB9AEJAbsBkQHtAWwBFAERAUMBFQEQARUBFAERAQcB9AEHAfcC7QHrARICEQEVAeoB6wGR\n        AbsB8AH/EwABvAFLAXMBSgHqAewBBwG8AesBFAEVASIBEQFKAe8B9AHyAfABBwH3Ae0BbQERAUoBmQHw\n        EgAB/wHxAW4BEgHvAfIB7wFKAZkBGgKZAXQBSgFEAUoBcwIcAUQBSgEcARoBGwG8AZkBHAHyAbwB7AEH\n        AfMC/wQACP8B8QHyAfMB7wF0AXkBcwFDARUBFAFuARoCGwEaAZkBSwGZARsB9AIaBPQB8QHsAW0B7AHq\n        AUoBmQEHAfQB8ALzAfQB/w0AAbwBCQKRAWwBEwEUA0MCDwEVAe8B9AG8Ae8C9wHsARQCEQETAW0CkQG7\n        AfAB/xMAAfMBSwFRAUsBRAFtAe0BvAHwAeoBIgFDAe0B8gP0AfIBBwH3Ae0BFAFDARwBvAH/EQAC/wH0\n        Ae8BbgFEAW0B6wEcARoBmQF0AXMBSwFEARUBcwF5ARwBmQFKARQBbgEcARoCGwGZAW4BEgFzAQcB9AL/\n        CAAH/wHxAXMCeQEVAREBFQEUAe8BBwEaBBsC8wEbAfMC9AHzARsBvAJtAZIBEwF0AZkBvAP/AfQC/w0A\n        AfIB8AK7AZEDFAERARABFAEVARAB6wHyAvABBwHtAW0CQwEUAW0BkQH3AbsBvAHzFQABvAJRAUoBFQHr\n        AfcCvAHrARwE9AHzAfABBwHvAW0BEQFLAZkB8RIAAf8B9AHzAesB6gFRBJkBdAJLAUQCFQEbApkB9AFz\n        ARUBRAFLAXkBmQEaARsBGgGZAUsBBwL0Av8HAAb/AQAB/wFzAnkBSwIUAewB9AHzAbwB7wEaARsCGgEb\n        A/MB8gK8AQcB6wHqAewBSgGZAbwB8wEAAf8B9AH/DwAB9ALwArsCkQFsARUCEAERARABQwFtAe8BBwHy\n        AewBFAEVARIBbQHsAfcBuwG8AfEB9BUAAfQBHAF0AUsCRAFtAe0B7wHwAfMD9AHzAfABvAEcAW4BFQFK\n        AZoBGwH0EQAC/wHzAZIBEQFzApkBcwFLAW0CRAJDAUoCGgEcARoB9AEaAUoBFQFEAUoBbgFzARwBmQEa\n        AXMBEwHvAfMB9AH/BwAG/wEAAf8B8AF0AXkBcwHvAfMF/wHzAfABvATwAfIB8wH0Av8B9AHyAW0BdAEa\n        AfAB/wEAA/8QAALzAfEB8wG7ApEB6gESARQBFQJDARUBEwESAhMCFAFsAZEB9wG7AbwB8gHzFwAB8wJ0\n        AUsBRAFDAUQB6wGSAQcB8AHyAfMB8gEaARwBSgEVAUsBGgEbAfIB/xEAAf8B9AEHARQBSgKZAUsBRAEV\n        AW0BSwJzARwBGgEbAQcBdAEaAvQBGgFLAUQBFQJEAUoBcwEcARoBcwHqAfAB9AH/BwAF/wMAAf8BHAF5\n        AXQBHAH0D/8C9AHzAe8BSwEaARsB8gH/BAAB/w8AAf8B8ALzAbsBkQG7AZEEbAIUARUBFAMTAeoBkQH3\n        AbsB8AHyAfAB/xgAAfACdAFLARUCIgFEAW0DcwFuAUoBRAEVAVEBwwHzAfESAAL/AfQB7QFKAZkBHAES\n        AUMBbQHxBPQB8gHwARsB7wFuAZkB8AG8AvQBGgGZAe0B6wESARUBRAFzAZkBcwESAfMB/xAAAfMBHAF5\n        AXQBkg7/AvQB8wEHARUBmQEbAbwC/xYAAfAB8wHyAQkBtAJsAesBuwFsAeoEbAFtAewDuwHwAfIB8AH/\n        GQAB/wHwAZkBHAFzAUoBFQERAyIBEQEVAUoBSwGZAfQB8QHyEwAC/wHzARUB7wEHAe0B6wGSAvIE8ALx\n        AfABBwFuAZkB8QHwAbwF8gG8Ae8C6wHsAZkBcwH3AfQB/w8AAf8B8gEcAXQBcwHsAfAE9AX/A/QB8wHx\n        AfcB6wEaARsB8AHzAv8WAAH/AfIB8wHxAQkBuwKRAa4GkQL3AbsB8AHxAvIB/xsAAf8B9AG8Ae8BmQFz\n        AW4BSwJKAUsBcwEaARsB8wHwAfMB/xMAAv8B8AHtArwB7wEHAfAB8gLzAvIE8wHvAUsB7wHwAfIC8QHw\n        A/EBvAHwAfEBBwLvAQcB7QHyAf8QAAH/AfABmQF5AXQBbgGSAfEB8gfzAfIB8AHvAesBHAEaAfQB8AHx\n        AfQC/xcAAf8D8QEJArsBtAK7AZEB9wK7AQkBvAHwAfMC8QH/HwAB8wG8A5kDeQEbAfIBvAHzFgAB/wH0\n        AewBvAHxAfIB9wHwAfMJ9AEHAXMB8AHxAfMB9ALzAvIB8QHzAfEB8AHzAfACvAHvAfEB/xIAAfEBBwGZ\n        AXkBUQEVAewBvAHwAfEC8gHxAbwBBwLrARoB8wH0AfAB8QHzAfQB/xoAAfQB8AHzAfEBCQLwAQkE8AHy\n        AvQB8AH0IwAB/wHzAbwCdAGZARsB8xgAAf8B9AHsAfAB8wG8AQcB8gr/AfMBvAHwAfIB9AP/BPQC8wG8\n        AfAC8gG8AfAB/xIAAf8B8QEHApkBeQFzAUoC7AHtARwB7AFuAewBmQEbAfMB8gHwAfIB8wL0Af8bAAH/\n        BPIB8wH0A/MD8gHzAf8mAAH0AXMBdAGZAbwB/xgAAv8B7wHxAfQC8wL/BwAH/wEAB/8B9AHzAfAB8gHz\n        AQcBvAH/EgAC/wHzAfABBwOZARwBcwJ0AZkBGgEbAfMB8gHwAfEB8gHzAfQC/x4AAv8H9AL/KQAB7wF0\n        AZkB8BkAAv8B8AL0Av8NAAH/BgAG/wP0AfMB9AH/EwAC/wH0AfMB8QG8AfAEGwHzAfEB8AG8AfEB8gHz\n        AvQC/1MAAfEBdAEaAfQZAAb/GAAC/wEABf8VAAP/AvQK8wL0Av9VAAH/AXQBGgH/GgAE/xwABf8WAAX/\n        B/QF/1cAAQcB8lsABv9dAAH/AfT/AP8A/wD/AP8AbgAI/7YADf+xAAT/CvQE/yIACv+BAAP/AvQK8wH0\n        A/8iAAb/AfQE/1YACv8gAAL/AfQB8wLyCfEB8gHzAfQC/xoACP8B9AHzAfID8QH0A/9UAA3/HgAC/wH0\n        AfMB8gLwArwBBwS8AvAB8QHyAfMB9AL/FwAF/wL0A/8B8QFLARoBmQF0AUQB7QHzA/8DAAj/FAAF/wkA\n        Av8jAAL/C/QC/x0AAv8B8wHyAfABBwH3Ae0C7AGSAfcC7QH3AQcBvAHxAfIB8wH0Av8WAAP/AfQC8gLx\n        AfMB9AHwAZkBGwGZAXMBSwHsAfAB8w3/FAAB/wPzAfQB/wYAAv8B9AHzAv8gAAL/AfQB8wTyBPEB8gHz\n        Av8dAAH/AfQB8gHwAe8BbQIUA2wD6gESAW0B7AEHAfAC8wL/FgAD/wHzAe8D9wG8AfIB8QGZARsBmQES\n        AUoB6gH3AfMB9A3/EgAB/wHzAe8BkgHvAbwB8wH0BAAB/wH0AfICBwHyAfQB/x8AAv8B9AHxAbwFBwHv\n        AQcBvAHxAfQB/xwAAv8B8wHxAfcBEgFDBGYCEwISARMCFAHqAe8B8QHzAv8WAAH/AfQB7QHrAW4BRAER\n        AesB9wIHAZkBGwGZAksB6gH3AbwB8gHzBP8E9AX/EQAB/wH3AREBFQFtAewB7wG8AfMD/wH0AfEB6gFD\n        AesB7wHzAf8fAAL/AfMBBwH3AZIC7QGSAu0BkgHvAfAB9AL/BQAB/xUAAf8B9AHyAe8BEgIVA0MBDQEV\n        AUMBFQEUARMBFAFmAREBEgHvAfMC/xUAAv8B8wFzARoBmQFzAUoBEwHsAe8B9wEaARsBmQJLAeoB7AH3\n        AQcB8QH0A/8B9AHzAfEB8wH0Bv8PAAHzAeoCSgEUAW0B7AHtAQcB8QLzAfEB7AEQAUQBbQHvAfMB/xkA\n        B/8B9AHyAZIC7AVtAuwBBwHzCf8TAAL/AfQB8AFtAUMCZgEVAUMBFQINAkMCFALqAWYBEQHqAfEB9AH/\n        FAAD/wHzAQcBGwGZARIBSgETAusB7AGZARsBmQJLARMB6wHsAfcBvAHwAfMB9wFtAUoBQwFtAfAB8gH0\n        Bv8OAAH0ARwBcwFLAUQBFQHsAu0B7wEHAbwB7QEVAUQBbgFzAQcB/xkAAf8B9AX/AfQB8gHwAewBbQQS\n        ARMBEgFtAesB7wHyAfQE/wP0Af8TAAL/AfMB7wEVAmYDbAFmAWwBZgESAmwCrgFtAWwCZgHvAfMC/xIA\n        A/8B9AHyAgcB7AETAUoBEwHqAesBbQGZAfMBmQFRAUsBSgFzAW0B7QH3AbwB8QHsARoBmQFzARIB7wHx\n        AfIB8wb/DQAB/wHzARwBcwFLAUQBEgLvAZIB7QHsAhUBSwEcAbwB/xoABPQD8wHyAfABBwHqAhIDEwEU\n        ARMB6gESAZIBvAHyAvMD9ALzAf8SAAL/AfQB8gHsARUBFAETAWwB6gFsAa4BuwEJArsBkQNsAa4BbAFm\n        AesB8gH0Af8SAAL/AvQB8QGZARwBbQEUARMBEgHtAQcBbQGZAfMBmQJzARIBmQFuAuwB9wEHAe8BGwGZ\n        AW0BbgHvAQcB8AHyAfMB9AT/DwAB9AEHAXMBSwFKAZIB8QHvAewBFQERAUsBHAG8AfQbAAPyAvEB8AG8\n        AQcB7wGSAW0BEgEUARUBQwMUARIBEwHrAe8BBwG8A/EB8gHxAfIB/xIAAv8B9AHzAesBFQFmARMBrgES\n        ARMCrgH3AbsBtAGuAmwBbQKuAWYBEgHxAfQB/xIAAv8B9AHzAfEBmQHwAXMBQwEUARUB7AEaAW0BmQHz\n        AZkBeQFzARIBGgFuAW0B7AGSAu8BGwGZAUsBbgHtAgcB8AHyAfMB9AP/EAAB/wEHAXMBbgFEAesB9wHr\n        ARABSgEcAe8B8AHzAfQOAAL/CgAD8AG8AQcB7wH3Ae0B7AHqARMBFAQVAhQBFQEUARIB7AHtAfcB7wEH\n        A7wB8AH/EgAC/wHzAbwBEgJmAWwBiwJsApEBtAG1AbQBbAFmAWwBiwFsAa4BbAFmAfEB9AL/EQAC/wHx\n        AXMCBwG8AfACFQFDAXMBmQFtAZkB8wEaARwBcwHrAbwBbgFtAesB7AH3AZkBGwGZAUsBbgL3AQcBvAHw\n        AfEB8gH0Av8FAAP/CgABvAJzAUoB6wEUAUMB7QEHAfABvALxAfMB9AL/CAAC/wH0Av8JAAHxArwBBwHv\n        AZIB7AHqARMBEQEVARQDFQJDAhUBFAEVARMB6gHrAe0B7wIHArwTAAL/AfMBBwNmA2wBZgFsAq4BkQGL\n        AUMBZgGLAa4BbAGLAWwBZgHxAfQC/xAAA/8BBwEaAQcCvAHwAe0BQwEUApkBbQHvAfMBGgGZAewB6wHv\n        AUoBbQHsAW0B9wHvARsBmQFLAW0B7AHrAe8BBwK8AfEB8wL/BAAC/wHzAv8HAAL/AfMBBwIcAW0BFQES\n        Ae8B9AHzAfEB8AG8AfAB8gHzAv8HAAH/AfMB8gH0Af8JAAH0A+8B9wHtAeoBFAERARABEwFsAW0BZgMQ\n        AREBtAHqAREBEAEVARIB6wHtA+8BBxMAAv8B8wFDA2YBbAGLAmwDZgFDAWYDbAGRAa4CbAFmAewB9AL/\n        EAAC/wH0AQcBGgG8AQcB8QEHAfMBEwEVAe8BmQESARwB8wEaAZkBbgHrAZkBbgHsAW0C7AHvARsBmQFL\n        AW4BcwF5AewBBwK8AfAB8wL/BAAB/wHzAvIB9AH/BgAB9AHzAbwB7wH3AhwBbQHtAf8BAAH/AfQB8wHy\n        A7wB8wH0Af8FAAH/AfMC8gH/CgAB8wLvAfcB7QHqAWwB6gGuA5EBtQFtAWYBEAEVARMBuwGRAq4B6gFt\n        AesB7QGSAu8BBxMAAv8B8gEUAUMCZgOuAZEBtAGuApEBtAEJAq4CkQGLAmwBrgHxAf8RAAL/AfQBBwG8\n        AgcB8wGZAfIBkgEVAe8BmQFEAZkB9AEbAZkBSwETAZkBcwLsAQcC7wHzAZkBcwHsAe8BmQH3AQcCvAHx\n        AfQC/wUAAf8B8wLyAfMB9AX/AfMBvAHvAgcB6gFzARwB7wH/AgAD/wHzAfEC8ALxAvQD/wHzAvIB8wH/\n        CgABvAP3Ae0B6wKuAbUBuwMJAa4BbAEQAq4BGQEJAfcEkQHtAZIB9wHvAQcTAAL/AfcBFAFDAWYB6gGu\n        AZEBrgGRAWwBZgNsAZEBrgGRAbUBuwGuAmwBrgHxAf8RAAP/AQcBGgIHAfMBvAEHAbwB6gHvARoB7QEa\n        AfQB8wEaARwBcwGZAXMC9wGZAu8B8wEaAXQB7AEHAZkB9wHwArwB8gH0Av8GAAL0AfMB8gLzAvQB8wHw\n        AbwB7wEHAfAB6wHqAQcBvAEcAQcB/wQAAf8B9AHzAfEB8AG8AfAB8gPzAvIB9AL/BQAB9ATvBPcB7QHs\n        Aa4BtQK7AwkCkQEQAbQBrgEJARkBCQO7AesB7QGSBPcCBwHyAf8PAAH/AesBFAFDAWYBrgGRArQBkQGu\n        AWYBDQFmA64BtQHcAbsBrgJsAa4B8QH/CwAB/wYAAf8B9AEHARoC7wHzARoBeQHxAfcBmQEaA/QDGwHz\n        ARoBcwHvAfcBmQLvAfMBGgGZARwBvAF5Ae8B8gHxAfAB8wH0Av8HAAH/AfQE8gHxAbwC7wEHAfIB7AHq\n        Ae8C/wEHAZkBBwYAAf8B9AHzAfIFvAHyAfMB9AcAAfQB7wL3Be8B9wHtAesBkQGuAWwBFAFmAWwBZgG7\n        AUMBuwESARMBEgFsAa4BtAGRAewBkgL3Au8E9wHxAf8OAAH/AW0BFAEVARIBrgGRArsCtAG1AbQBuwG0\n        ApEC4QG0Aa4CbAGuAfEB/wsAA/8EAAL/AQcBGgFKAXQB8wEbAZkBvAHvAZkBBwHzAfQB8AEcAXMBmQEa\n        AZkB7QHvAfcBvAGSAe0B8wEaAZkB7AHvARwBBwH0AfMC9AP/CAAC/wH0AfMB8AG8Au8BBwHxAZIBbgEH\n        Af8CAAH/AfABmQEHAf8FAAL/AfQB8gS8AfIB8AH0BwAB/wHwAfcG7wH3Ae0B7AGRAa4BbAEQARUBQwEV\n        Aa4BQwGuARUBEwERAmwBkQHsAZIB9wHvAfcF7wH3AfMPAAH/AfMB7AEUARIBbAKuAZEDtAHwARkCtAGR\n        AbsBtAGuA2wB9wH0DAAD/wQAAv8BvAEaAe8BGwH0AfMCGgG8AZkBHAG8AQcBdAFzAW4BSgFzARwD9wEH\n        AW0BcwHzARsBmQFKAW4BmQEHB/8CAAH/BwAB/wH0AfIB8AIHAfAB7wFzAbwB8wH/AwAB9AEaAZkBvAH/\n        BAAD/wHzAfID8QHwAe8B9AgAAfIG9wGSAe8BkgH3Am0BEwEVAeoDbQEQAhIBbAEVAW0BrgGRAe0C9wHv\n        BfcB7wH3Af8PAAL/AbwBFAISAWwBkQG0Aq4BtAG7ARkBuwGuAZEBuwGRAWwBZgJsAfAB/wwAA/8EAAL/\n        AfMBvAP0ARsBGgEbAfQBGgHtAfIBvAHvAZkBGwEcA+8EBwEbAfQBGwEaAQcBmQF5AQcH/wIAAfABBwcA\n        Af8B9AHzAvIBvAHsARoB8gX/AQAB9AEaAZkBBwMABP8C8wL0AfMB7AHwCQAB9AP3AZIG9wHrAWwBEgKu\n        AmwBrgEVAW0BrgKRAeoBrgHrAewB7wf3Ae8B8hAAAv8BvAEUAWwCZgFsAa4BbAFmAZEBCQEZAZEEbAJm\n        AWwB6gG8AfQMAAP/BAAC/wH0AfAB8gEbAfABdAESAXMBmQEcAesBBwG8AfEBGgEbARoE7wG8AQcD9AEa\n        AZkCGwF0AfAE/wIAAf8CAAH0AewB8gH/BgAD/wHzAewBHAG8Cf8BGgGTAbwB9Ab/AfQC/wG8Ae0B/woA\n        AQcC9wGSBfcBkgHsAeoBkQK7A5EBbAFtAbQBtQEJAfcBrgHsAe0I9wHvAf8QAAL/AbwBEwHqAWwFZgGu\n        AQkBGQGLBGYDbAHqAbwB/wwAA/8EAAL/AfQB8wHxAbwBmQIcAW4B7wLsAesB8wH0ARsBGgGZAe8BvAIH\n        AbwCBwHyARoBdAFLAXMBHAEHAfME/wIAAf8DAAHxAe8B9AgAAfQB7AEcAfAJ/wEAAfQBGgGZAe8B9Ab/\n        AQAB/wHvAfALAAH0CfcBkgHsAxkBuwGRAWYBQwETAbUDCQG1AewBkgj3AfASAAH/AfABEwHqAusDbAKR\n        AQkBGQauAmwB6gG8Af8MAAP/BAAC/wL0AfMCvAGZARsCvAEHAfAB6wHvAvQBGwEcAQcB8gPwAbwCBwEc\n        AZkBvAEcAfAB8wH0A/8DAAH/BAAB7wEHBwAB/wHvAXQB8AH/CwAB9AHvAXQBBwL/BQAB8QEHAf8MAAEH\n        AfcD7wX3Ae0B9wG7ARkBkQESAhUBEwFtAbUCCQKSBPcD7wH3AbwB/xIAAf8B8QETAW0BrgG0AbsBtQK7\n        ARkB/wEZArsDtAGRAYsBbAEUAfEB/xMAAv8C9AHyAfEB8wEaAbwBGgEHAfEBvAHtAeoBvAHyAfABvAHy\n        AfMC8gG8AfACvAHwARoBGwG8AfAB8gH0A/8DAAH/BAAB9AH3AQcB/wQAAf8BBwFuAbwB9AH/AwAC/wIA\n        AfQB/wMAAfQBBwHrAe0B8wH/AwAB8gHvAfINAAHxBe8D9wPvAu0CrgEUARUBrgFsAW0B9wPvBPcE7wEH\n        AfQTAAHyAeoBbQGRAbQBGQLiA/8D4gHcArsBkQFsAWYBbAH0Af8TAAP/AfQB8gHxAvQBGgHvAQcB8gG8\n        AQcBEwH3AbwB8AHxAe8B8gPzAvEB8AH0AfMBGgGZAfAB8wH0Af8FAAH/BAAB/wHxAbwB8AH/AgAB9AHv\n        ARIBHAHzAf8EAAH0ARwB8gK8Af8EAAH0AXMBRAHrAfECAAHzAe0B8gH/DQAB9AEHA+8F9wLvAfcB7AG0\n        AZEDrgG0Ae0BkgHvAQcF9wTvAQcB9A4AAv8DAAH/AewBbQGRAbQBCQLiA/8D4gHcAQkBtAGuAWwBZgHt\n        Af8VAAL/AvQB8AG8AfQB8gEHAfEC8wEHAusB8QHvARQB6gG8A/QB8wHyAfAB8wH0AfABHAHxAfQC/wUA\n        Af8GAAHwAgcC/wHvARABUQG8BwABmQFKAVEB8gYAAfQCSgESAe0BBwHsAfIB9BAAAfIB8AHvBfcB7wMH\n        ARIBbQGRAq4BbQG8AfMB8AG8BvcBBwHwAfEB/w4AAf8D9AH/AQAB/wEHAWwBrgGRAbsC4gX/AeIB4QG7\n        AbQBiwFsAWYBBwEAA/8B9AL/EAAC/wH0AfMB8gG8AfAB8gPzAe8BbQEUAeoB6wEcAQcBkgHyA/QC8wO8\n        AfIC9AL/BQAB/wcAAfEBkgFtAeoBEQFLAQcB9AUAAf8B8wKZAXkBBwH0Af8FAAEHAXMBFAEPAREB9wHz\n        EgAB/wHwBfcB8QL0AfADbQGuAWwBbQHwAfQC/wb3AfQB/w8AAf8B9AHyAbwB8gH0Af8BAAHyAeoBrgGR\n        AboBGQHiBP8B9AHiAeEBuwG0AYsCbAH/AQAB/wH0AfMB8QHzAv8PAAP/AvQE8wHyAbwC7AHtAQcB8AEa\n        AZkBHAEHBfQB8wHyAfMC9AP/DQAB/wHwAUMCEQESAfAB/wUAAfMCBwEbAbwBBwHwAf8FAAH/AZIBEQEV\n        ARQB7AH/EwAB8QT3Ae8B8wEAAf8BvAJtAZEBCQKRAfIC/wEAAe8E9wHvAf8QAAH/AfMBvAIHAfMB/wEA\n        Af8B7wFtAa4BugEZAeIB9AP/AuIB4QG7AbQBiwFsAfIBAAL/AfMBvAIHAfMB/xAAA/8D9AHzAQcBbQEU\n        ARwBvAHxARsB7wF0ApkB7AHwB/QD/xAAAfABEQFtARMBEgHzCAAB/wEaAfMJAAHwARQBEgGZAXMBBxIA\n        Af8B8AT3Ae8B9AEAAf8B8wGuAbsCGQEJAZIB8wP/Ae8E9wG8EAAC/wHwAQcB9AEHAfAB9AIAAf8BvAHt\n        AZEBuwHhBeIBGQK7Aa4B7AG8AgAB/wH0AfABvAHwAbwB8wH/EQAD/wH0AfEB7AHrARwB8gEbAfABBwHv\n        Am0BdAEaARwB7QHxA/QF/xAAAf8B7wFzAZkC7AG8Af8HAAH/AfIB9AgAAf8CkgEHARoBvAH/EgAB/wG8\n        AvcB7wH3Ae8B9AEAAf8B9AGuAbsCGQEJAfcB9AP/Ae8B9wLvAfcBBxAAAv8B8wG8AfABvAHyAf8DAAH/\n        AfQBvAH3AboBCQMZAQkBuwGRAfcB8gH0AwAC/wHzAfABvAHxAfQB/xIAAv8B9ALvAfIC8wG8ARwB6gH3\n        AfABcwOZAXMB7QHzAvQF/xEAAfQB8AG8AvIB8AG8AfIHAAL/BwAB9AH3AQcC9AHxAfQTAAH/AbwB9wTv\n        AfQBAAL/AewBkQEJARkBCQHwAf8CAAH/AfcF7xIAAf8B8gEHAfIB9AH/BgAB/wL0Av8LAAL/AfQB8gH0\n        Af8TAAL/AfQB8wLxAQcBEgHtAfABvAEaAfMB8AEaAZkBGgGZARIBBwL0Av8VAAP/AQAB9AHwAfQB7wH/\n        DQAB8wHsAfEB/xgAAfAC7wMHAfQCAAH/AfMB7wHsAfcBBwH0BAAF7wG8EgAC/wHzAfQB/woAA/8MAAH/\n        AfQB/xQAAv8B9AHzAfEB9AG8AZIB7wHwAfMB8AHxARIBHAGZARoBmQHsAe0B9AP/GgAB/wHyAfEB9wEH\n        AfIB9AcAAf8B8wHyAewB8QH/GQAB8gPvAQcBvAH/BAAB/wLzAv8EAAEHBO8B9BMAA/8JAAP/AfQD/woA\n        Av8VAAL/AfQB8wLyAfQB8gH0AfMBHAHrAbwB7QEcApkBvAEHAfAB9AP/HAAB/wH0AfIBBwG8AfMEAAH/\n        AfIB7wH3Ae8B9AH/GgAB9AEHAu8BBwH0DgAB8QPvAfEgAAH/AfQB8wHyAfMB9AH/IgAB/wH0AvMB8AHz\n        A/QBbQHvARwCGgEbAbwB8QHzAvQC/yEAAf8B8wMAAf8BvAH3AfAB/x8AAfMB8gH0EAAB9AHyAfMB/x8A\n        Af8B9AHyAfABBwG8AfIB9AH/IQAC/wH0AfMB8QT0AQcBGwHwAfEBBwG8AfIB8wL0Av8pAAH/VwAB/wHz\n        AfABBwG8AQcBvAHyAfQB/yAAAv8C9AHzAfAC9AHzAfQB8gHwAfEB9wHrAfMC9AP/gQAB/wHyAQcBvAH0\n        AgcB8AHzAf8gAAL/A/QB8wP0AfAC8wHyAfEBFAHzAvQC/4IAAf8B8wHxAQcBvAEHAbwB8wL/IQAD/wL0\n        AfIB8QHzBPQB8gG8AfQD/4MAAv8B8wHxAbwB8AHzAfQB/yMABP8D9An/hQAC/wH0AfIB8wL/JQAI/40A\n        Bf8pAAL//wD/AP8AkAAI/7MABf8J9Ab/GAAB/wMAAf8WAAP/dAAC/wL0AvMB8gHxB/AB8gLzA/QD/xYA\n        Af8BAAT/EwAF/1gAAv8ZAAH/AfQC8wHxAvABvAHvAewB6gQUAewB9wEHAfAD8gHzAvQB/xUAAv8B9AP/\n        EwAB/wH0AfMC9AH/RAAT/wH0A/8WAAH/AfQB8wHxAbwBBwHvAewBEgFDARUBEQQVAREBQwEUAe0B7wHw\n        A/EB8wH0A/8SAAL/AfQB/wH0A/8PAAL/AfQB8wHyAfEB8wH0Af9DAAH/AfEB8gHzDvQB8QG8AfIB9AH/\n        FQAB/wH0AfMB8AEHAe8B6wEUARIB6wFtAeoGEgHrAW0CEgHrAQcBvALwAfEB8wL0Af8RAAL/AfMB/wP0\n        Av8JAAb/AfQB8wHxArwB8QH0Av8VAAH/DgAD/xsAAfMBcwHvB/IC8QPyAfMB8gHwAesBRAHvAfIC/xQA\n        Af8B8wHwAe8B7QETARIBBwHyAbwB6wHqBRIB7AHvAfcB7QHsARIBFAGSBPAB8QHzAfQC/xAAAf8B8gH/\n        AfQC8wH0Af8FAAT/BPQC8wHyAfADBwHwAfMB9AH/FAAB/wH0Bv8DAAX/AvQB8xsAAf8BmQF5AQcBvAEH\n        A+8EBwS8AfcBRAGZAe8B8gH0Av8SAAL/AfIBBwHtARIB9wHwAbwB7wHwAe8BEgHqBBIB7QGSAbwDBwHs\n        ARMB7AEHBPAB8gH0Av8PAAH0AfAB/wH0A/MB9Af/AfQB8wHyBPEB8AEHAfcC7wEHAbwB8gH0Af8TAAH0\n        AfID8wHyAfMB9AUAAf8B8wHyAfMC8gLxAf8aAAHzAZkBeQHvAfcC7AHtApIB9wQHAe8BbQF0AgcB8QHz\n        AvQC/xAAAf8B9AHxAe0B6gEHAfMCBwHvAgcC6gMSAesC7QHvAbwBBwHvAQcB7AEVAewBBwLwAbwB8AHy\n        AfQB/w8AAfQBvAH0Af8B8wHyAfEB8gbzAfIB8QG8AgcE7wLsAfcB7wEHAbwB8gH0Av8RAAH0BbwBmQG8\n        AfMFAAH/AgcDvAEHAfcB8QH/GQAB/wHwAXoBcwHsAeoBEwIQAhEB6gHvArwBkgFuARoB9wEHAvAB8gHz\n        AfQC/xAAAf8BvAESAQcB9AIHAfcD7QHsAm0CEgHtAuwC7QHsAe8BkgHvAesBEwHtAQcB8AG8AQcBvAHy\n        AfQB/w4AAfQBBwL/AfMB8gfwAbwBBwPvAu0C7wGSAeoB7AH3AQcBvAHxAfIB8wH0Af8QAAH/AfcB7QH3\n        Au8BBwGgAZkB8gUAAfQBkwKZAe8CHALtAfMWAAT/AfEBGgF0AUoBRAVLAUoBRAFKARIBRAF0Ae8BBwPw\n        AbwB8AHyAfMH/woAAfQBEgGSAfMBBwG8Ae0B9wHtAewB7QHsAm0B6gFtAfcB7ALrAe0BbQHrAuwB6wHq\n        ARMB7wG8AfACvAHwAfMB9AH/DQAB9AEHAfQB/wH0AfIB8AK8AwcB7wL3AZIF7QHsARQB6gHsAfcBvAHw\n        AfEB8gHzAfQC/w4AAf8BBwFuAewB7QEcAe0BmQGgAZkB8gUAAfQBkwGaAZkB7QHsAe0B7AHrAZIB9BUA\n        Av8C9AHxAXMBegF5AXQEeQF0AXMESwFzAQcB8QLyAfABvAEHAbwB8AHyAfME9AL/CQABBwETAfABvAIH\n        AewB7wP3AewBEgJtAesB7AGSAuwBkgHsARQBkgHtAesB6gETAewBvALxAvAB8gH0Af8NAAH0AQcB8wL/\n        AfMB8QPwAQcB7wH3Au0C7AHtAuwBbQEUAW0B6gFtAZIB8QLyAfMC9AL/DgAB8AFuAusBbgFzAW4BmQGg\n        AZkB8wUAAf8BkwGaARoBcwFuAXMBbgFtAW4BHAH/FAAB/wH0AfMB8AHsAXkBoAGaARoB9wLvAbwBBwHv\n        AZIBcwFRAksBkgHwA/IB8AQHAfAC8gLzAfQC/wcAAfQBbQH3AbwCBwLtAe8C8AIHARICbQLqAZIC7wEH\n        Ae0BEQGSAgcB6wISAbwC8wHxAfAB8gH0Af8NAAHzAe8B8gEAAf8B9AHzA/EB8AEHAfcB7AQUARUBEQEV\n        AW0BcwESARQBkgHyA/MB9AP/DQAB/wHtAm0B6wFuAeoBbgGZAaABmQH0BgAB7wGaAcMBmQJuAW0CEgFt\n        AfAUAAH/AfQB8QFzAXkBoAEbAfcB7AHtAe8BvAPyAbwBBwH3AXMCSwHvAfED8gHwAQcC7wEHAbwB8QHy\n        AfMB9AL/BwAB8QETAQcB8AHyAbwB6wGSAbwBBwHyAfEBBwETAe0B7AHrAeoB9wLwAu8BEQHsAfEB8wEH\n        AW0BEwGSAfMB9AHyAfEB8gH0Af8NAAH0Ae8B8AH0Av8B8wPyAbwB7QFtBBQCFQEUAesBdAFzAeoBFAHs\n        AfID9AL/DwABvAHqAW0BSgHqAm4BmQHDAZoBmQH0BgABvAGZAsMBcwFuAW0BSgFtARIBkgH/EwAB/wH0\n        Ae8BdAGgAfQBBwHvAXMBHAHvAQcB8QHyAfMBBwEcAQcB7QJLAW4B8APzAfIB8AEHAu8B8AHyAfMB9AP/\n        BwAB7AFtAe8C9AG8AeoC7wH3AbwB7wH3Ae0BuwH3AewBbQHsAe8B8AGSAe0BEQFtAfAB/wH0Ae0BbQHs\n        AfMB9APzAfQB/w0AAfQB7wHsAe0BBwHwAfEB8AEHAfcBbQISAeoBbQESARQBFQEUAW4BeQJzARIBQwES\n        AfIB9AT/DgAB/wHtARIBbgFKARICbgIaAZoB8AH/BgAB/wGTAZkBwwGZAW4BbQFEAW4BbQHrAfITAAH/\n        AfIBSwF6AcMBvAH0AfIBBwGZAgcBvAHxAfIBHAG8AfABBwFzAksBHATzAfEBvAEHAbwB8QHzAfQC/wgA\n        Af8BFAHsAQcBAAH/AewB6wH3AewC7QH3AewBBwHwAbsB7QHrA+wBbQETAREBEgH3Af8BAAHxARIB6wG8\n        AfQC8wH0Af8NAAH/AfQB7wHrARQCFQLqARUBEgHqA20BEgEUARUBFAHqAZkBegFzAesBEgEVAUMB7wH0\n        Av8QAAHwARIBbgFzARQBEgFuAcMCmQEcAfQCAAHzAu8B9AH/AQABvAGTAZkBwwGTAW0BRAFuAZMBEgHv\n        EwAB/wEHAXQBoAHwAv8B9AHzAbwBmQHxAvABHAGZAfABvALwAW4BSwFzAfEC8wHyAfECvAHwAfMB9AL/\n        CQABBwEUAewB8wH/AfIBFAH3Ae8BvAHvAe0B9wHtAfMB9AHwAbsB7wHtAW0BFAISAeoBEgHsAfIB/wHy\n        ARUB6wEHA/QC/w0AAf8B9AEHAfcB7ALrAW0B6wHsAe0B7ALrAW0BFAITAeoBHAJ5AusBEgEUAUMB6wL/\n        EAAB/wHvAW4BmQFuAUQB6gSZAe0C/wG8AewB6wLqAQcBAAHyAZMBGgGTAZkBbgFEAUoBmgFzAW4B9BIA\n        AfQBcwF5ARoB8wEAA/8B8QGZAfAB8gEcAZkDBwG8AfEBBwJLAQcC8gLxAfAB8QHyAfQC/woAAewBFAHs\n        Av8B7QHsAe0BkgG7AbwB8QK8AvQB8wHwAbsBkgHrBG0BEgFtAQcB9AHzARIBbQHvAvQC/w4AAf8B9AEH\n        AfEB8wH3AZEB6wHsAfcBBwGSAewBbQETARIBSgFuAZkBGgHtAXMBbgFtARMCFAHqAfMRAAH0Ae0CmQHq\n        AUQBcwEaARwCkwHyAQAB8QETAeoC7AFtARMC9AEcAZkBHAKZAeoBRAEcAZkBcwHwEgAB8wFuAXkBGgH/\n        BAAB/wHxAQcB8wIHAfEBvAEHAbwB8QHyAXMBSwEcAvIC8QLyAfMB9AL/CgAB7AETAewB/wHzARQB7QHr\n        AewB9wG7AbwE9AHyAfMBvAHvAfcC6wFtAxIB6wHwAfMB7AFtAQcD/w8AAf8B9AEHAfIBAAH3AbsB7AGR\n        AbsBBwHsAW0BEwEUAUoCdAGZAQcB7QHsAesBEwIUAUsB7AHxEQAB9AHtAZoBkwISApMB8QHvAQcBAAH/\n        AZIBFAHqAe8B7AETAREBkgH/AfABkwG8AZMBmgFuAUQBbQGaARwBvAwAAf8B8QEHAbwB8QHzAbwBSwF0\n        ARoFAAH/AfMB9AHxAfIB8wHxArwB8AHyAfMBBwJLAe8BvAEHAu8BBwHzBP8JAAHsARIB7AH/Ae8BbQHs\n        AesB7AHtAe8BBwHyAfQB8gHxAfAB8QHyAbwBBwHvAe0B7ANtAewB8AHzAewBbQEHAv8QAAH/AfQB7wHy\n        AQAB8QG7Ae0B9wHvAfcBbQETARUBSgF0A3MBdAGZAe0B6gETARIBSwF0ARwB8wH/EAAB9AGTARoB6wEU\n        AW4BmQFzAfQBkwHwAf8B8wFtAeoB7QG8AQcB7AEUAW0B9AHyAZkBvAEcApkBSgEUApkBBwsAAf8B8QFt\n        AkoESwF0ARoB/wHzArwBBwG8AfQB7wEcAZkB8wEcBOwB8AHyAksFSgFzAfAE/wkAAewBEgHsAf8B8AKS\n        A+wB9wK8AfIB8QHvAfIB8wLwAbwBuwH3AuwB9wIHAfAB9AHsAW0BBxIAAf8B9AEHAfIC/wGSAbsC9wHt\n        ARIBFQEUAUoBSwFzAW0B7AF5AZkB7wHsAesBcwKZAfEB8wH/EAAB/wEHAW4CFAKZARwB/wGTAQcB/wHy\n        AW0B6gHsAbwB7QLqAesB9AHwAZkBvAEHAXMBmQHqAUMBSgF0AfMMAAHwARwEmQFzAVEBdAEaAQAB8wLw\n        ArwB9AG8AfQBwwH/AQcC7wMHAfMBbgFRBRwBmQHwBP8JAAHtARIBbQH/AgAB8gEHA/cBBwH/AQcBkgHr\n        AbwB8QG8AQAB9AEHAbwC8wHwAfMCAAH0AeoB6wG8EgAB/wH0Ae8B8gL/AbwB9wGRAewBbQEUAREBRAFK\n        ARIB6wHqAewBHAF0AXkCmQGgARoBmQH/AfMB/xAAAf8BvALrARwBmQFuARwB/wGTAQcB9AG8ARMB7QPz\n        AfAB6wESAfQBvAGZAbwBBwGTAXMBkwJuAXMB/wwAAf8D8wL0AQcBSwFzARoFAAL/AfQC8gEAAv8B9AIA\n        Af8B8wFLAXkB8wL/AfQC8wH0DQABBwHqAW0B8wQAAfQB8gHwAfEB/wHyAfEB8wHtAbwB8QIAAfEB8wHy\n        Av8CAAH/AfIBEQHtAfESAAH/AfQBBwHyA/8B6wLsARMBQwERARQBEwESAesBbQGRAe8BUgF5ApoBeQKZ\n        A/8QAAH/ApkBBwGZArwBkwHzAvEB9AHwAesCHAGZARoBCAEcAesB9AHzAbwB8wEHAZMBvAGZARwBvAGT\n        AfQNAAT/AQAB8wJLAZkB/wQAAf8B8QHzAf8BAAHxA/8CAAH/AZIBSwG8Af8FAAH/DQAB/wLqAe8GAAL/\n        AgAB/wH0AfMB8gHzAgAC/wYAAbwBQwH3AfQSAAH/AfQB7wHyAv8B9ALrAeoBFQIRARUBFAESAusBuwEc\n        AXQBeQF6AXkBvAHzAQcD/xAAAf8BBwGZAbwBHAHvAfMBkwEHA/QB8AEHA5kCGgGZAe8C8wH0AfEBkwHv\n        AfIBHAEHAbwBkwH/EgAB9AFzAUsBcwH0BAAB9AG8AfQBAAH0AQcB9AQAAfMBRAF0AfEVAAGSAW0BEgH/\n        FwAB/wHrARIBBwH0EgAB/wH0Ae8B8gL/AfQBbQHqARQBQwERAhUBFAESAW0B7AH3AXkBUgFMAVIBHAG8\n        Af8B8BQAAfEBdAEHARwBdAHxAgcD8wG8ARoDCAMaAbwB8gLzAfABkwHzAe8BkwEHAZMBBxMAAf8BHAJL\n        AZkB/wIAAf8BvAHzAwAC8QH/AgAB/wHrAUsBmQH0FQAB8QFtAeoBBxcAAfIBEgH3AbwB/xIAAf8B9AHv\n        AfIBAAL/AeoBEgEVAhEBFQEUARIB6wHvARoBmQF0AVIBSwF0AhwBAAHzFAAB9AGTAZkB7wGZAQcB8wH0\n        AfMB8gHxAbwBGwH0ARsBGgMbARoBvALyAvMB8QF0AZMBBwGZAfEUAAHzA0sB8AIAAbwB8AH/AwAB/wLx\n        Av8BHAFLAXkB8AH/FQAB9AHsAesB7AH0FQAB/wGSAesBBwHzAf8SAAH/AfQB7wHyA/8CFAEVAUMCFQET\n        AewBCAHDARoBeQFLAlICHAGZAQAB9BQAAf8B7wGTARwBkwEHAvQC8gG8ARsB9gH0ARsE9AH2AfIB8ALy\n        AfMB8gF0ARwCkwH0FQABvANLAfQBAAGgAfMFAAH0AfMBAAEHAUsBeQGZAfQXAAEHAesBEgEHBwAB8gH/\n        BAAB8wH/BgABvAHqAbwB8AH/EwAB/wH0Ae8B8gMAAhQDFQESAesBmQEbAaABmQEcAksBUgEcAbwBmQH/\n        FgAB9AEcAQcB8QHzAfQB8wHyAbwB9AL2A/QF9gHwAfEB8gHzAfQB8QG8AXQB8AH/FQAB/wGZAXMBSwFz\n        AfID/wQAAfQB8QHvAVEBeQEaAfMB/xcAAf8B7AFtARIB8QH/BQABbQHyAwAB8gHsAfQEAAH/AfEBEgEH\n        AfEB/xQAAf8B9AHvAfICAAH0ARUCQwEVARIB7AEcAZkBeQKZARwBUgFLAVIB7wG8AZkB/wIAAv8TAAHz\n        A/QC8wHxAfAB9gH/BvYD/wH0AbwB8QHyA/QB8QH/FwAB/wGZAVECSwEcAe8BvAHwAfIB8QG8AhwBmQGa\n        ARoB9AH/GQAB9AHtAW0BEgG8Af8EAAHrAfMDAAHyAfcB9AQAAfEB6wEHAfIB8xUAAf8B9AHvAfICAAFt\n        AhEBFAFtAe0CHAF5AVIBvAIcAXQBUQFSAQcB8AEcAwAC/xMAAv8C9AHzAfIB8AEbAf8D9gf/AfYBvAHx\n        AfIB8wL0A/8YAAEcAUsCUQF0AVEBdAFRAXMBeQGaAqAB9AG8AfQbAAHxAewB6wETAQcB/wMAAesB9AMA\n        AfIB9wH0AwABvAFtAQcB9AHyAf8VAAH/AfQB7wHyAgACEQEVAW0C7wFLAbwBBwEcAfIB8AG8ARwBcwEc\n        AQcB8AEcAwAC/xMAAv8C9AHzAfIBvAEbAf8D9gj/AbwC8QHzAvQD/xcAAfQB7AGZAbwBmQEcApkCmgMa\n        ARsB8gK8Af8aAAH/AfAB9wHrAeoB7QHyAf8BAAHsAfMDAAHyAfcB9AH/AfMB9wHsAe8B8wHxAf8WAAH/\n        AfQB7wHyAQAB8AERARQB7AHvAZkBHAFLAfIBvAH/AfQB8QHvAxwC8wEcGAAC/wL0AfMB8gG8ARsB/wL2\n        Cf8BGwHwAfEB8wL0A/8WAAH/AfcBSwG8AfQB/wH0AvMC8gHzAvQB/wH0AfABGgHyAf8aAAH/AfQB7wHs\n        AesB6gHtAbwB7AHzAwAB8gGSAQcB9wFtAfcB8gHxAfMB/xcAAf8B9AHvAfEB/wHsARQB7AG8AfQB8wG8\n        Ae8B/wHwAv8B9AG8AZkBHAHvAQAB9AEcGAAC/wL0AfMB8gG8ARsC/wH2Bf8D9gH/AbwB8AHxAfMC9AP/\n        FgABvAFEAaAB/wsAAf8B8wHyAbwB9BwAAf8B8AEHAbsB9wESAesB8wMAAfIB7wHsAfcB9AHzAbwC/xgA\n        Af8B9AH3AfIBvAETAfcB8QH/AgAB9AIAAfIBAAL/AfMB9AEcAbwCAAHzGAAC/wL0AfMB8gLwAvYB9AH2\n        BP8B9gH0AvYBvAHxAfIB8wL0A/8UAAH/AfQBHAFzAbwNAAH/AfABvAHwAf8cAAH/AfQB8gHwAQcBvAH0\n        AwAB8gEHAfAC8gHzAf8aAAH/AfQB7QLqAQcB9AQAAfQCAAH2AQAC/wEAAfQBmQHzAgAB9BgAAv8C9AHz\n        AfIB8QG8ARsC9AX2AfQBGwH0ARsBvAHxAfIB8wL0Av8VAAL/ARwBmQH0DgAB/wHwAfEB/x4AAf8C9AHx\n        AfQDAAH0AfAB8wH0Af8cAAH/AfQB9wHsAfEB/wUAAf8EAAL/AQAB9AEcAf8bAAL/AvQC8wHxArwBGwH0\n        BfYB9AIbAbwB8AHyAfMC9AP/FgAB/wH0AfMB/1oAAfMB7QHyDwAB/wHwAwABvBgAA/8C9AHzAfIB8QHw\n        AbwBGwHDARsB9gP0ARsBvAHwAvIB8wH0A/91AAH0Ae8BvBAAAfYDAAH0GQAD/wL0AfMB8gHxAfABvAIa\n        AxsCvAHxAvIB8wL0A/91AAH/AbwB9C4AA/8D9AHzAvIB8QLwArwB8AHxAvIC8wL0A/+pAAL/BPQD8wPy\n        A/ME9AT/qQAF/wz0Bf+rAAn/AvQI/7EADP+4AAL/AQAC//8A/wD/AOsACv9+AAf/DwAG/xsADP9YAAX/\n        HwAD/wP0A/8NAAf/GgAC/wn0Av9VAAP/BfQF/xkAAv8B9APyAfMB9AT/CgAC/wH0AfMD9AL/GAAC/wH0\n        CvMC/y0ABf8fAAP/AfQB8wHyAfEC8AHxAvIC8wP0Bf8SAAL/AfQB8gG8Ae8B9wEHAfAB8wb/BwAB/wH0\n        AfMB8AHvAfAB8gT/FgAC/wHzAfEF8AK8AfAB8gH0Af8rAAL/BPQB/wIABv8XAAH/AfQB8wHxAQcB7AJt\n        ARIB6gHsAQcCvALxAvIB8wL0Av8RAAH/AfQB8gEHAesC7AHqAe0BvAHzAfQE/wcAAf8B9AG8AfcBkgHs\n        AQcB9AP/FgAB/wH0AfEBBwXvAfcB7wEHAbwB9AH/KgAB/wHzAbwD7wHwAfQC/wH0AvIB8wL0Af8WAAH0\n        AfMB8AHrAUQBSgFEAREBFQERAg4BFQHsAu8CBwG8AfEB8gHzAf8SAAHzAfABbQEHAewBFQEUAeoB9wG8\n        AfIB9AX/BAAC/wHzAewB6wH3AesB7wHyBP8VAAH/AfQBBwGSAe0G7AGSAQcB8wH/IAAG/wQAAf8BBwHr\n        A0oBkgHzAf8B9AEHAewBbQHsAbwB9AH/FQAB/wHzAfcBFQFKAUsBcwEcAZMBHAHsAesBSgEUAhABQwFt\n        AesBkgHvAQcB8QH0Av8OAAL/AfQBBwEcAfMB7AFDARQC6wH3AbwB8gH0Cf8B9AHzArwB8AHvAQcB8AL0\n        BP8TAAH/AfMB9wHsAesBbQLqARIBbQHrAewB7wHzAf8fAAH/AvQB8gEHAfIB9AL/AgAB/wG8BJkBcwH0\n        Af8B8AGZAnMBbgESAfMB/xUAAfMB6wFKAXMBmQEaAfQDGwGZARoBGwG8AZkBcwFKAUQBEQEVAewB7wHw\n        AfMB9AH/DgAC/wHzAQcB6wGSAeoCQwHtAuwB7wEHAfEB9Af/AfQB8wHwAQcBkgG8Ae0BBwHxAfIB8wH0\n        A/8SAAL/AfMB7AFtAeoDEgEUARIBbQHqAfcB8gH0Af8dAAH/AfQB8wHwAe0BEgHsAfEB8wH0Af8BAAH/\n        AbwBmgEbAfQBGgEHAfQBAAEHApkBGgGZAUsB8wH/FQABSgFzAZkC9AEbAxoB9AGZAUQBFQFKAXMBmQEa\n        AZkBdAFLAu0BBwHxAfMB9AH/DQAB/wH0AfIB7wHrAQcB7AESARAB7AHxARIB6wH3AQcB8QH0Bf8B9AHy\n        AfAB9wHvAbwB8AHvAewBBwLxAfIB9AL/DwAD/wH0AfIBvAHrAuoBEgETAhIB6gFtARIB7AHwAfMB9AP/\n        FwAD/wHzAfEBBwHvAZIBFQFDAesB8AH0Af8BAAH/AfMBvAHwAfIB8AHxAv8BBwEcARoBGwEaAe8B/xYA\n        AfECGgIbBRoB9AGZAUoBEQEQAREBRAFKAW4BHAHvAe0B7wG8AfIB9AH/DAAB/wH0AfIBBwHvAewBkgEH\n        Ae0B6gFtAfABHAESAewB9wHvAfAB8wH0A/8B9AHwAe8B8AG8AwcB7wHsAZIB8AHxAfQC/w4AAf8B8QHy\n        AfMB8gG8AesBFAISARMBFAETAhIB6gESARQB7QHwAfIB8wHwAfIB/xYAAf8B9AHzAQcB9wGSAvcBFQEP\n        AUMBkgHxAfQB/wEAAf8C9AHzAvQC8wHxAwcB8AH0GAAB9AHyArwBHAGZBBoBGwHxARwBRAFDAhEBFQFu\n        Au0B7wEHAfEB8wH/CwAB/wH0AfMBvAHtAZIB9wHrAgcBkgHqAe0B9AFtAeoB7AHtAe8B8AHzA/QB8QG8\n        AfcB7wEHAu8BBwLvAewB7wHxAfMC/w0AAf8B8gEHAfIB8AEHAZIBFAEVAhMDFAITAhIBQwESAe8BBwHx\n        AbwB6gHxFQAB/wH0AfIC9wHtAewC7wHtAUMBDwEQAewB8AH0BgAB8wEHAuwBvAH0Af8dAAH0ARoBHANK\n        AW4CHAEbARoBdAJKAVEBBwGSAe0B7wEHAfEB8wH/CwAB/wH0AbwBEgHvAesBFAFtAesB8AEHAewBEgHw\n        AQcBFAFtAuwB7wHwA/IBBwHvAbwBBwHtAe8DBwEcAQcB7AHwAfQC/w0AAvIB8AHyAQcB7QFtAQ8BEgJt\n        AesCQwIUARIBbQIVAesBkgG8AfIB7AFtAfMSAAL/AfQB8AHvAe0B7AHtAfcB7wLtAewBFAEPAUMB9wHy\n        Af8EAAH/AbwBcwFKAUQBSgHvAf8eAAHzAXMBDwEQAQ8BFQFKARUBSgGZARsBmQF0AZkC9wLvAQcB8QHz\n        Af8KAAL/AfMB7ALvAW0B7ALrAe8B8AEcAW0B7AHyAewBbQPsAe8BBwHwAe8BvAHxAbwC8AH3AZIB7wEH\n        AfcBBwHtAfID/wwAAf8B8QLyAfAC7AFtARIB6wHsAfcB7AJDAhQB7QHsAesBbQHqAewB7wHyAQcBbAHs\n        Af8RAAH/AfQB8AH3Au0B9wHsAvcE7QESAQ4BFAHvAfMB/wIAAf8B9AEHAZkBHAF0AXMB7AH/HgAB/wG8\n        AewBbgHqAUsBRAERAUMBHAF0AUQBSgFEAesB7wIHAbwB8QHzAv8JAAL/AfMB6wEcAewBbQG8AQcC6wHw\n        AQcB7QESAe8B8AETAuwB6wHsApIBBwHwAbwBBwG8AvAB7QTvAfcB8wH0A/8LAAHvAfQB8AHzAbwC6wK1\n        AQcBvAH0AbUB6gEUAuwCvAEHAewD9wLxAa4BtAG8EQAB/wHzAfcB7QH3AfABkgETARIB7AHtA+wB7QFt\n        AQ8BEAEHBfQB7wF5ARoBGwGZARwB/yAAAfQB8QEHAfcB6gEVAUMBcwEVAUMBcwEQAUMB7QIHAbwB8AHy\n        AfQB/wkAAv8B8wJtAewB7wHxAfMC7AHvAfABBwLrAfIB7wLtAfcB6wLsAbwBBwHwArwB8QHwARwB6wHv\n        AbwB7AEHAfIB9AP/CgAB9AGRAf8B8AH0AfIC9wG8Ad0D/wEHAW0BEgEHAfcBvAH/AfQBvAK1AfcB9AHz\n        AesBrgHvAf8PAAH/AfQB8gH3Au8BuwHtAhEBFAFtAewC9wLtAeoBEAEUAQcC9ALzAbwBmQEbAfMB8AHz\n        Av8fAAP/AfQBvAIRAXMBRAERAZkBSwFuAQcD8AHxAfIB8wL/CAAC/wHzAe8B7QHwAfMB8QHwAfcB7wHs\n        AQcBvAEcAW0B7wHzAesBkgH3AZIC7AEHAe8CvAHwAQcB9wEHAeoBBwG8Ae8B8AHxAfIB9AL/CgAB8AG0\n        Af8B8QH/AfQB7wEHAe8BkgP3AW0BBwHrAfIB7QHsA/cBtQHdAbwC9AHsARMB9wH0DwAB/wHzAfAB7wEH\n        AfcBBwHwAfcBFAEPARUBEgHsAvcB7QLsAUMBFAHvAbwBHAJzAe0BvAHyAfQBAAL/IQAB8wH0AfIBEAER\n        AW4BcwEVAW0BmQEHAfAB8QTyAfMB9AH/CQAB/wH0AfAB7QHwAfQB8AHsAe8BHAG8Ae0B8AG8Ae0B6wHx\n        Ae8B9wEHAfcB7QHsAe8BkgHvAQcB8AG8Ae8B8QFtAfAC8gHxAfIB8wH0A/8IAAH/Ae8BiwHwAgcB7wHt\n        AQcB7QHrA0MBFAH3AewB/wHtARUBZgESAewB9wEHAfcC7wFtARUBrgHxDgAB/wH0AfIB7wG8AfcBvAHz\n        AgcBvAHsAhABFAFtAe0B9wHtAewB7QEVAREB9wGaAksBSgHsAfMB9AIAAf8dAAL/AfAB7AHqAewBbQEQ\n        AUoBHAEaAZkBGgEHAfAD8gPzAfQC/wkAAf8B9AHzAe8BBwHzAfEB6wEcAewB8QLvAfAB7wHqAewB8gHs\n        AbwBBwHvAfcB7wGSAe0B7wEHAfEBBwHxAfcF9AT/CQAB/wHsAWwBrgSRAu0BbQERAuoBEgHqARMB6wES\n        AW0BEwHrAewB9wHtAWwDEwEUAesBvA4AAf8B8wEHAe8B9wG8AfMB9AHwAwcB7wHqAhEB6gLsAW0C7AET\n        Ae8BGgNLAesB8AHzAfQBAAL/GAAC/wH0AbwB7QFtAkoBSwFKAUQBEQFKARwBmQHyAfMB8AHyAvME9AP/\n        CgAB/wH0AfABbQHxAfQBBwHtARwB7QHxAfcB8wHwAe0BEgLvAewBvAIHAe8B9wLsApIDBwHzAvQH/wgA\n        AfQB6wKuAZECtAG7Ae0B7AFtARQC7AISAhMBbQHqARMBbQHtAfcBkQGuAW0B6gFtARQBbQEHDgAB/wHx\n        Au8B8QHyAfQD8wO8Ae8BkgETAQ8BQwEUARMB6wH3AZIBmQEaA0sBEwHtAbwB8wEAAv8YAAH/AfABbQES\n        AUsCHAGZARoBmQEcAW4CFQFLAfIB8wHyAfMD9AT/DQAB/wHzAQcB9wH0AfICHAHrAfEBBwH3AfIBBwJt\n        AQcB7AEHAfABBwHvAgcB9wHvAfABvAHvAewC8AH0CP8HAAH0Ae8GGQEHAesB6gH3AuwG9wHrAbUB6wH3\n        AgcDtQLvAbwOAAH/AQcB9wHyAfEB9AHzAbsBBwT0AfAB9wEHAesBEQFDARIB7AH3AesBvAH0AXQBSwFK\n        AREBRAFLAewD/xgAAf8BvAHvARoBGwb0ARoBSgFDAXMB9AHzA/QD/xAAAf8B9AHyAewB8QH0AQcBHAGZ\n        Ae8B9AHrAvEB7wESAZIBvAHrAfAB8QG8AgcC7wIHAbwB7AHrAe8B8wj/BQAB/wG8Au8GBwHvAe0BuwHz\n        AvcBEgEVARMCEgH3Ae0B8AG8AbUCuwMHA+8BBwHwAf8LAAH/AQcCvAH0AfMB8gG8AfAB8gHwAfMC9AHx\n        Ae8B9wGSAeoBFQETAeoBbQG8ARoBTAJLAREBRAFLAUMB8gP/GAAB/wHzAfIB8QHyAfEBGwHyARoB7wFL\n        ARUBQwEcAfQB8wH0BP8RAAL/AfMB9wHvAfQB8gEcAQcB7QHyAfMB7QHzAfEB7AHqAQcB7AHvA/EB8AHv\n        AwcB9wK8AfAB8gH0B/8FAAHzAeoBbAFtA2wCrgGRArUBCQH/Au8BFAEPAkMBFAH3Ae0B9AHxAbsBtQGu\n        BmwBEwHtAf8LAAH/AfEB7wHtAQcCvAHxAfMB8AEHAbwB9AHzAfQB8gEHAe0B7wH3AeoBFAETARsBGgFM\n        AksBEQFKAUsBIgHyBP8ZAAL/AQAB9ALzAbwBBwHvARUBQwEcAfQBGwP/EwAC/wH0AfAB7QHzAfQBvAHv\n        AewBvAH0AQcBvAH0AQcCbQEcAewBvAHxAfIB8wLxAbwBBwH3AbwB8gHxAfAB8wf/BQAB8wNtA2wCrgGR\n        AbsCGQHtAbwBBwEVAg4BQwEUAfcB8AHzAfABGQG7AbUB7QJsAxIB6gH3Af8NAAH0AfAB7QHvAfAB9wG8\n        AfIB8AHzAvQBvAHsARIB6gHtAvIB7AEUAe8BwwFMAksBEQFKAUsBEQHwBP8dAAT/AfQB6gFDARwB9AEb\n        Af8WAAH/AfQB8wH3AbwB9AHyAZkC9wH0AfMB7wH0AfMBHAEUAewB6wH3AbwB8QHyAfMB8gHxAfABvAIH\n        AbwB8AHzBP8IAAH0AW0CbAHqAe0B7wQHAvQBvAEHAe8B6gEUAhIBbQHvAfcB8AHzAhkB4QG7AZEBbQNs\n        Ae0BBwH/DgAB/wHyAQcC9wEHAfAB8QH0AfMB8AHsARIB7AHtAZIBvAHsAeoBEgG8ARoBUgFLAUoBQwFK\n        AUsBEQG8AfQD/x0AAv8DAAHrARABHAHzAfIB/xcAAf8B9AHwAewB8wH0AQcB7wHsAfIB9AIHAfQB8QHr\n        ARIB7AESAe8B8AHyAfMB9AHzAfIB8QLwAfEB8gH0A/8JAAH/AewCbAHqAfcBvAbwAbwB9wHtAewB6gHt\n        ARIB6wLvArwB8ALxAvAB7AFsAYsBkQHyAfAB/xAAAfQB8QHvAewB7wG8AfEBvAGSAewB7wG8Ae8B7AFu\n        AeoBEgEUAZkBwwF0AksBIgFKAUsBEQEHA/8aAAH0Af8BAAHzAfcBHAMAAZIBFQGZARsB8wH/FwAB/wH0\n        AfMB7QG8AfQBGwHvAu0B9AHzAe0B8gH0AQcCEgHrAewBvAHyAfQC/wXzAvQD/woAAQcCbAHqAWwBvAUA\n        Af8B9AHwAe0B9wESAewBEwHsAfcB8QH0Av8DAAH/AZIBbAGRAbQB/wHzFAABBwHsAe0BvAHvAe0B9wEH\n        AfABcwFKAesBbQISARwBwwF0AUwBSwERAUoBSwERAbwB9AL/GAAB9AG8AZIB9AHvARUBEQFKAQcC9AHs\n        ARUCGgHzAf8YAAH/AfMBvAHsAfMB9AEHAe8B6gHxAf8B8gGSAvQB7QEUARIBbQEHAfIB9AT/A/QE/wsA\n        AfQCbAESAW0BBwUAAf8B9AHwAewB7QISARMB7AHvAfMB/wUAAfQBkgK0ARkB8AH/FAAB/wHyAQcB7QEH\n        AfAB8gHvAXMBSgJtAeoBEgFuAZkBwwFSAUsBSgERAkoBEQHxAfQC/xcAAfMB7AHtAuwBEAERARUBcwGZ\n        ARwBBwHvAZkCGwHzAf8YAAH/AfQB8wHvAbwB9AHwAe8BHAHvAfQB/wG8AfAB9AG8ARIBFAHrAfcB8gH0\n        Cv8NAAH3AWwBEgHqAfcB/wQAAv8B8gLtAewBEgH3AewBBwH0Af8FAAH0AZEBtAEJAfQB8AH/FgAB9AHw\n        AQcBvAGZAW4BEgHqARIC6gFtARwBvAH0AZkBcwFKAREBRAFKAREB8QH0Av8XAAHsARUBcwFKAUMBEQFE\n        AXMBmQK8AvAB8gHzAfIB8AH/GAAB/wH0AfMBvAHvAfQB8wIHAe0B8wH/AfIB9wH0AfMBkgISAW0B8AHz\n        AfQJ/w0AAfIBbQISAesB/wUAAf8B9AH3Ae0B7wH/AQcB7AHwAfQB/wUAAfMBtAEJAfQB8QH0GQAB9AG8\n        AewB6gFtAuoBEgFKAW0B7AEHApkBGgEcAUQBSgFLASIB8QH0Av8VAAH0AesBQwEcAVEBQwERARUBcwEH\n        AfMC/wb0GgAB/wH0AfIB7QHyAfQB8AHvAZIBvAL0AfAB7wH0AbwBbQESAW0B7AG8AfMB9An/DAAB/wHv\n        ARQBEwESAfIFAAL/Ae8B7QH3AfMBBwHtAfIB/wYAAfABGQHiAfQB8QH/GwAB8wH3AW0B6gFKAXMB7wH3\n        AQcBvAKZARsBmQJKAUsBIgHwA/8UAAHzAewBEAJzAW0CEQFzAZkB9CMAAv8B9AHvAfcB9AHzAQcB7wH3\n        AvQB8wHsAbwB9AEHARIBEwESARQBBwHzCP8NAAH/AfIB6wIUAe0B/wUAAf8B8AHrAfcB8AH3Ae8B9AH/\n        BgABBwHiAf8B8gHzHQAB/wG8Ae0B7AHvAfAC8gHwArwBGgEbAXMBUQFLAREB8gP/EwAB9AHsARECcwEU\n        ARUBEQFuAbwB8wH/JAAB/wH0AfIB7QHxAfQB8AHsAesBBwL0AfABkgHzAfIBbQEUARIBQwESAfEB9Af/\n        DwABvAHqARQBEwHzBgAB/wHxAvcB7wHyAf8GAAHyAuIB/wHyAf8fAAHzAbwB9wHvAbwC8AHyAfQBvAEb\n        ARoBmQF5AUoB8gL/EwAB9AHrARABcwEaAe8BFQERAW0C8ScAAf8B8wG8AewC8wLsARIBBwLzAfcBBwH0\n        AQcBEgNDAe8B9AX/EgABBwFtARMBkgH/BgAF/wYAAfQBvAH/AfMB8AH/HwAC/wH0AfEB7wEHAfEB8wL0\n        AbwCmQEbARoBSwHyAv8TAAHzAXMBHAHwAfMBcwFKAW4BGgHzAf8nAAH/AfQB8wHsAbwB9AHwAe0BEgET\n        AbwB8wHqAW0BvAHvAUoBQwERAUQBBwH0A/8UAAH/AbwBrgETAbwGAAL/CAAB/wHxAf8B9AHxAfQB/x8A\n        BP8C8gH/A/QB8wEHAZkBwwHyAbwB9AL/EwAB/wHxAfAB8wH/AQcBHAG8AfEB/ygAAv8B8wLsAvMBBwEU\n        ARUB7wHzAe8BSwFEAUsBRQFRARQB7AHwAfQB/xgAAbwBtAESAfIPAAHyAvMB8QH/IwAF/wX0AfMB8QHy\n        A/8WAAH/AgAB/wHxAfAB/yoAAf8B9AHsARQBBwH0Ae0BIwFLAe8B9AHxAXQBUgGZAUoBmQEHAbwB8wL/\n        GQAB8wHvAesBvAH/CgAC/wPxAfMB/yUAD/9HAAH/AfQB7wJKAUsBUgF0ARwBvAL0AbwB8AHyArwB8QHz\n        AfQC/xkAAv8B8gHvAbwB9AkAAfMBvAHwAfMB/ykADP9IAAL/AfMB7wF0ApkBvAHwAfQC/wH0A/IB8wL0\n        Av8dAAH/AfQB8wgAAf8B8wH0gQAB/wH0AfMB8gEHAbwB8wH0Af8CAAP/AvQC/68AAf8C9ALzAfQC/wYA\n        Af+xAAj//wD/AP8A/wDAAAH/AgAB/7oACP8/AAb/BQAC/wQAAv8MAAH/VgAL/z0AA/8F9AP/AQAB/wLz\n        Af8BAAL/AvMB/wsAAv8RAAL/FgAC/ycACP8C9AHzAfQD/xwAAf8fAAL/AfQB8gH0Bf8BAAH/AfEB9wG8\n        AvQB8gH0AbwB7wHzAf8EAAP/AwAC/xAAAf8C9AH/CgAB9AoAAf8B8wH/JAAI/wH0AvMB8gHxAfIB9AL/\n        GwAE/x0AAf8B9AHyAfQE/wEAAv8B8QH3AZIB7wEHAe8B9wHvAfcBkgG8Af8DAAL0BP8CAAH/EAAB/wHx\n        Af8JAAH/AfQBvAL/CQAB9AHxAf8iAAX/AvQB8wLyAfED8AHyAfQB/xwAAf8B8gHwAfQB/xsAAv8B8wHx\n        AfQD/wIAAf8B8gHvCZIB9wHzAwAB/wH0AvMB9AL/AgAB/w8AAfMBvAHzAf8IAAH/AfAB9wHxAf8IAAH/\n        AfMBBwH0IQAE/wH0AfMC8gHxAfADvAEHAe8BBwHyAf8dAAHyAe8B8wH/GwAC/wHzAfAC9AH/AwAB/wHw\n        Ae8B9wmSAfAB/wIAA/8B8wHyA/8BAAH/DgAB/wHwAe0BvAcAAf8B9AHxAe8B7AHvAfIB9AH/BgAB/wHv\n        AfcB8yEAAv8C9AHyAfEC8AG8AgcB7wGSAW0CQwFtAfMcAAH/Au8B8QH/GgAB/wH0Af8B9AHwAfEC9AL/\n        AQAB9AG8B+8B9wKSAu8B8gH/AgAB/wL0AfAB8wL/AQAB/w4AAf8BBwHqAfMB/wIAAv8B9AHyAQcB7wH3\n        AesBSgHsAfcB7wG8AfIB9AH/AwAB/wG8AeoB8gH/GAAC/wUAA/8B8wHyAvABvAIHAe8B7AETARQB6wHt\n        AfcB7QHyHAAB9AHtAfcB8AL/GQAB/wP0AfIBvAHxAfQD/wH0AQcC7wHsAe0E7wLsAu8BBwH/AQAC/wH0\n        AfIBvAHzBP8NAAL/AfcBSgG8Af8CAAH/AfEB7wL3Ae0B7AHqAW4B6wLtAvcBBwHzAf8BAAH/AfQBBwEU\n        AfAB/xcACv8B9AHyArwBBwHvAewB6wEUAQ4BFQISAfcB8AHvAfMcAAHyAewBkQG8AfEaAAL/AfMC9AHx\n        AQcBvAH0Av8B8gK8AewBbAHsAQcBkgHrAe8BkQFsAZICBwH0Av8B9AHzArwB8wH0A/8NAAL/AewBSgH3\n        AfMC/wG8AfcBkgL3Ae0B7AFLAW4BSgHsAvcCkgH3AfEC/wHxAZIBRAG8Af8UAAz/AfQB8gG8AQcB7wHs\n        ARICDwERARQCFQESARQB6wHsAfMZAAP/AfEB6wGRAbwB8QH0Av8XAAL/AfMB8QHzAvIBvAHwAvQB8gG8\n        AZEBbAFlAWwBFAFDAQ8BQwNsAgcB8QH/AfQB8wG8AQcB8AHzAvQB/w4AAv8B7AFKAewB8AH0AbwB9wHt\n        AewB7QMcAXMBbgFLAUoBRAFtAuwB7QH3AfEB9AG8AesBSgG8Av8SAAT/AvQC8wLyAfABBwHwAbwCBwHs\n        AeoCFQEUARIBFAEVARIB7AFmAg8BkgH/GQAB/wH0AfMBBwESAZEBBwG8AfIC9AL/FQAC/wH0AfIC8AHx\n        AfIB8AHxAfQB8gHvAWwBZQINBA8BZgJsAe8BvAHxAfQB8QG8AQcB8AHyAvMB9AH/DgAC/wHsAUoBbQHy\n        AfAB9wHsAesBcwMaApkCcwFuA0oB6gHrAe0B7wHyAfABEgFKAbwC/xIAAv8B9AHzAfIC8AK8Ae8CFAHs\n        Au8B7AEUARIB7QEQAUMBFAEQAe8B9wFmAREBFQFDAe8B/xMABv8B9AHyAfAB6gETAZEB7QPxAfIB8wH0\n        B/8OAAP/AvQB8gK8AfMD8gHtAWwCDQUPAWYCDQGRAfECvAEHAfAB8QHwArwB8wL/DgAC/wHvAUoBSwLv\n        AewB6gFuARwDGgGZAe8BBwEcAZkBHAFzA0oB6wHtAQcBHAFKAUsB8QH/EgAC/wH0AfECvAIHAu8B6wHv\n        AQcC9wHsARQBEQHqAfcBDgERA20B7QETAUMB7AGSAfcB9BAAA/8B9ATzAfIB8QEHAeoBEgHtAZEB6gHs\n        AfEB8AHxAvIE8wP0Av8MAAL/A/QC8wLxAfMC8QGuARUCDQMOAgABDQEVAmYB9wK8AfIDvAHxAfMB9AL/\n        DgAC/wHxAUoBcwEcAe0BEgFKAXMBHAEHAe8BvAHyA/MB8gEHARwCcwFuAUoBbQHtAesBSgF5AfMB/xMA\n        AfQB8AG8AQcE7wHsAfcCBwH3AeoBFAFDAQ8B6gHwARUBFAHsAUMBZgETAa4B9wHtAesB6gHwEAAC/wHz\n        AvIC8QLwAQcBbQFsAe8CBwGRAeoB6wEHAfEB8gHxAfACvAHwAfEB8gHzAfQC/wwAAv8B9APzAfIB8wHy\n        AfMBvAFsAw0DDgIAAQ0BQwEVAWYBrgG8AfACvAHxAvMB9AP/DwAB/wH0AhwB7wFtAUQBbgFzA+0B9wXv\n        ARwB7QLsARwBcwFKAewB7wFSARoC9BIAAf8B9AHxAQcG9wLsAe0B7AEOARQBEAESAfEB9AHwAe0BBwHw\n        AbQBZgEOAQ8BZgEOARIB8A8AAf8B9AHzA/IC8QHwAQcBbQFsArwC8AHtAesBbAHrAfEC8wHxA/AC8QHy\n        AfMC9AL/CwAF/wH0A/MB7wFmAg0BFQIOAWwBDwEAAQ0CQwEVAYYBvALwAfMB8QHwAfIC8wH0Af8QAAH0\n        AfMBBwHvAkoBHAGSA+0B7AHtA/cE7QEcAfcBHAJKAbwBBwH/AfQB/xEAAv8B9AHyAQcB9wTsAe0BEgEV\n        AesBEgEOARIB7AHxAfMBvAH3Ae8B7QG8AYsBFAETARUB7AG0Ae8B9A0AAv8B9AHzAfEEvAEHAe8BEgFs\n        AfcBBwHzAfABvAHwAe0CbAHsAfEB8gHxAbwCBwHwAfED8gHzAfQE/wkABf8D9AGuAQ0BQwJmAQABEAGR\n        AesBAAEVAa4BbAEUAWYBkgHxAfMB8QHzBf8RAAH/AfMB9AH3AUQBUQHwAbwB6gHrAewB6wHtAewE7QHs\n        AesBcwHwAbwBcwFKAQcD9AkAAf8HAAL/AvQB8AHqARUCFAITARIB6gHrAewBEgFDAe0CvAH3AhIB9wEH\n        AfABBwHtAQcB7QGSAQcB9AH/DQAB/wH0AfMB8AHrARMEEgHqAZECuwHtAfECbQEHAewB6wGRAWwBbQUS\n        AZIB8gXzA/QC/woABf8B8gFmAQ0BZgFDAQ4BAAEQAZEB6wIAARQCbAFmAa4B8gHzAfQF/xIAAf8B9AHw\n        AewBSgG8AfEBbQJEAkoBcwF0AxwBdAJzAVIBHAHyARwBSwEHAfMB8QH/CQAB/wcAAf8C9AG8AQ4BQwH3\n        AesBEAEUAesB7AH3Ae0CEwHsAe8BbQRDAQcB8gHwAfQB8wHwAe8BBwL/DQAB/wH0AfMB8gHrAWwCuwOR\n        AbsB8gEHAbsBkQFDARQBbAEUAW0B7wEHBJEBuwHvAbsBkQHvBvMD9AH/DQAC/wGuAg0BDgGLAa4BAAEQ\n        AZEB6wQAAUMCZgG8A/8XAAH/AfQCcwH0AbwBSwJEAkoBcwF5BpkBegF5AvIBSwEcAfAB9AoAAv8FAAL/\n        AfQBBwETAUMBbQG8AfAB9wESAQ8CEQEOAUMB7AHrARECDwESAesBEgHxAvQB8gG8AZIBBwH0Av8NAAP/\n        AfMBvAHxAfIB8QEHAZEBuwG8AfEB9AEHApEBuwH3AZEB7AHyAfQBvAKRAfcBvAHxA/IH9AP/DgAB/wFm\n        AQ0BDwEOAowBDgEUAZEBbQEQBAABEQFmAfAC/xgAAv8BHAHtA/MBvAEcAUoBcwIcBJkBGgG8AfED8wFu\n        AQcC/woAAv8FAAL/AfMBEgHsAfcBEgHvAfIC8AH3AeoBDwEOAkMBDwEOARABEgLsAQcB9AHzAfACBwHv\n        AfIB9AL/AgAD/wkAAfQB9wHtAewD7QHrAZEBuwHzAf8B8wHsAZEBuwEHAe8CkQH3AvQBvAGuAZEF7QHs\n        AQcH/w8AAfEBZgENAg4BEAEOAREBbQHrAW0BEwEOBAABZgHtAf8ZAAL/Au8B9AHzAfAB9AHzAW0BFAFK\n        AUQESgHxAf8B9AHwAfIB8wHsAbwC/woAAf8GAAL/AfMB7wIHAe8BbQEHAvIB8wH0AQcB6wEPAg4BDwFD\n        ARQB9wHxAfQB8gH3AQcB7wG8AfIB8wH0Av8BAAX/BwAB9AHrAZECuwKRAbsBkQG7AbwB9AEAAbwB9wEJ\n        AbsB8wH0AewCuwHwAfQB8gHsAZEDuwSRAbwB/xQAAQcBZgENAg4BZgGMBW0BEgETARACAAFmAWwB/xoA\n        Af8B8gEHAv8B8wGZAfIBcwFDARQBQwFEAhUBIwHyAfMBmQHzAv8B9wHyAf8LAAH/BgAB/wH0AfMBBwH3\n        AQcBvAHrAQ8B7wPxAvMB9wFDARMBEgEQAQ8BkgHwAbwB9wHtAewBBwG7AQcB8gL0Av8BAAT/BQAC/wHz\n        AfAB8gTxAfIBvAG7AZEB7wHzAf8B8wK7Ae0B6wFtAbsB8gH/AfIBbQHqAe8F8gPwAfQB/xMAAbwCFAFD\n        ARQBbAFtA5EB9wKuARICEwIUAesB/xoAAf8B9AEHAf8CAAHwAQcBcwEVAkMBSgIiAVEB8wEaAfMB/wEA\n        Af8BBwH0EwAB/wH0AfIBvAIHAe8BEgERAZEB6wESAfcBvAHzAe8BEgHyAfAB9wHqAUMCEwESAhECEwHq\n        AZIB8wH0Av8BAAP/BgAB8wHvAvcG7wH3AZEBuwGRAewC8wH3AQkEuwG8AfIB6wESAZEBuwHvA/cB7wL3\n        Ae8B7QEHAf8SAAG8AWwBFAFDARUBbAGuAZEBtQG7AQcB7wHtAa4BEgETAWYBFAHrAf8bAAH/AfMB/wIA\n        Af8BBwFzAUoBIgFEAUsBIgFEAVEB8wEHAf8CAAHzAfQB/xMAAf8B9AHyAbwB8AEHAewBEgHsAUMBDgFD\n        AfIB8AHzAe8B9wT0AfECEgHqAUMDDgFDAe8B8QH0Av8JAAHyAewBbAGRArsDCQHwAQkB8ALzARkBuwHs\n        AfcBCQK8AfMB8AG7AWwBEgGuAbsBvAK7CZEBvBIAAbwBbAEVAkMBbAGuAZEBCQEZAvQB8AGSAW0BEgFm\n        ARUB6wH/IQAB7wFzAUoBIgFKAXMBRAFLAVEC8RkAAf8B9AHwAbwB8AHzAQcB7QESARUBFAG8AfIBvAHw\n        AfEB8wLxAfIC8QH3AfEB8AHvAfAB8gHwAbwBBwHzAf8LAAK8AfEL8gHxAQkCuwG8AQAC8wH/Ae8BkQG7\n        AbwO8gH/EQABvAGuARIBEwIUARMBkQEJARkD/wG8AewB6gIUAesB/yAAAf8B7wJKAUQBSwFKAXMBdAFz\n        Ae8B8QH/GAAB/wHzAvAD9AH3AW0B7AGSAfQBvAHvAewB7QH3AbwD8AHyAfAB6wHqAfcBvAHsARIB7wHy\n        AfQB/wsAD/8B8wG8AbsB9wHzAgAB8wHsAbsB8AHzD/8RAAHwAZEBbQESAUMBFAHqAZEBtQEJA/8BGQHs\n        AeoCFAHtAf8gAAH/ARwBSgFEAiIBSgFzAXkBHAGSAQcB8wH/FwAB/wHzAbwC8AH0AfIB7wHrAfcB8AG8\n        AfACvAEHArwB7wHsAQcB7wEUAewBBwHyAewBEgHtAbwB8wL/GwAB8wEJAbsB7QH0Af8B6wGRAfIB8yEA\n        AfMBCQGRAa4BEQEVARIB6gG1AhkC/wEZAewB6gEUARMB7yEAAfMB7AEVASIBDgEiA0QBSgHtAZIB7wHz\n        Af8VAAH/AfQB8gHwAbwD8AH3AesBBwHwAbsC8AH0A/MB8QEHAbwB6gHrAQcB7QHyAZIB8QHzAvQB/xwA\n        Af8B8gG8AbQB7QHrAZEBvAH0IgAB/wHwAbwBkQEUAhUBbQHsAvcCGQG7Aa4C6gGuAfEgAAH/AfIB6wFE\n        AUoBRAIiARABIgFEAUoB7AGSAQcB9BQAAf8B9AHzAfECvAHwArwBkgFtBLwBuwHyBPQBCQEHAe0BbQLv\n        AfABvAHzAfQD/x0AAf8B9AEIAbsB9wG8AfQkAAHzAfIBvAHrARMBFQHvAuwB6gHtAQkBtQGuAuoB9wH/\n        IAAB/wHwAkoBSwFKASIBFQIiAUoCcwHtAe8B9BQAAf8B8wHwAfEC8gHxAvABvAHwAbwB8AG8AbsBvAHw\n        AvQC8gK8Ae8B6gHvAfEBvAHzAfQC/yEAAfMBvAHyAfQmAAG8AfMB7wHrARQBGQL3AeoBrgH3AbUBrgLq\n        AfIhAAH/AQcBRAFKAXkBSwEiAQ4BIgEQAUoCdAFzAe8B9BMAAf8B8wHxAvID8wHyAvMB8gHwDLwB6gH3\n        AvAC9AH/IgAB/wHzAfQnAAH0AfAB8wEJAbUB9AK1Aa4BkQK1Aq4B8AL/IAAB/wHtAUQBSwGZAXMCDgEP\n        ARUBSgFLAUoBcwGZAfMTAAH/AfMB8gL0Av8D9AHzAfIEvAbwA/IC7wEHAfIB9AL/TAAB/wHzAbwB8QHd\n        AfQBvAG1Aq4BkQHPAa4BBwP/IAAB/wHtARUCSgEQAQACDgEPASIBDwEQAUoBmQHzEwAC/wH0Bv8B9AHx\n        BbwB8gLzB/QB8wL0Av9MAAL/AfQBBwH0AfEC9AG1Aq4B7wH0AfIBvAH0Av8gAAH/Ae8BIgEOARQBEQFK\n        AXQCDgMAAXMBmQH0EgAJ/wH0AfIB8AG8AfAC8gHzAfQC/wMACP9NAAL/AfIBBwH0Af8B8wHwAfcBjAEH\n        Af8B9AHyAbwB9AL/IQAB7wEiAUMBdAJKAZkBIgFEARABEQFKARwBGgH0EgAB/wEAA/8BAAL/AfQB8gLx\n        AvIC8wL/BQAB/wIAA/8EAAT/RwAB/wH0AfEBBwHzAfQC8AHtAYwBvAL0AfEBvAH0Av8hAAHwASIBRAGZ\n        AUQBcwGZASIBRAFzAXQBSgEcARoB9BcAAf8C9AHzAfIC8wHyAvQB/xAABv9GAAH/AfQB8QEHAvMCBwHt\n        AYwBtQLzAfABvAHzAv8hAAH0AeoBSwGZAQ8BcwGZASIBRAFzARwBIgEUAfIB/xYAAv8B9AHzBfQC/w8A\n        CP9GAAH/AfQB8wEHAbwB8AO1Ac8BtQLwAQcBvAHzAv8hAAH/Ae8CbQEQARwBmQFKAZkBbgFKAZkBvAH/\n        FwAB/wT0Bf8IAAH/BgAB/wIABv9GAAL/AfMBvAIHAe8EtQMHAbwB8wL/IgAB9AG8AesBEgHsAUQBSgFz\n        AesBbQGZAfEB/xcAAf8C9AL/AQAC/xUABf9HAAH/AfQBvAEHAbUB7wS1Ae8CBwHyAfQC/yQAAf8B8wH/\n        AbwB7QHxAf8B8wH0GQAF/2QAAv8B9AHwAbwBtQEHAbUBBwG1AgcB8QH0Av8pAAH/HQAD/2YAA/8B9AHw\n        ArwBtQEHAbwBBwHwAfMD/7IAAv8C9AHxAbwB8QHzAvQC/7UAA/8B9AHzAfQE/7cAB///AP8A/wD/AP8A\n        ngAE/1wACv9TAAP/A/QD/1kAAv8F9AHzAfQC/1IAAf8C9AHyAfEC8AHxAfMB9AH/WAAB/wH0AfMD8gHx\n        AvIB8wH/UgAB/wH0AfEBBwLvAfcB7wG8AfMB/yAABf8D9AT/BQAC/wP0Bf8eAAEcAW4DHAFzAUoBbgHy\n        AfQC/1AAAf8B9AHtAgcB7QHsAfcBBwHyBf8bAAL/AfQB8wHyBfEC8wL/AwAC/wHzAfIC8QLyAfMC9AH/\n        HQACHAHwAuwBHAHsAXQB8QHyAfQB/ycABv8jAAH/AfABvAHvAfABBwHtAZIB7wHxBPMC9AT/FQAB/wH0\n        AfIB8AIHA+8D8AHyAfQB/wMAAf8B9AHwAu8BvATwAfEB8wH0Af8bAAEcAZkBvAFKAUsBHAHsAXQB8AHy\n        AfMB9AH/JAAC/wH0AvIB8QHyAfMB9AH/HwAC/wHzAe8BBwLyAbwBBwL3Ae8EBwLwAfEB8gLzAfQE/w4A\n        Av8B9AHwAe8B7AFtARIB6gRKARwB8gP/AfMB7wETAREDQwERAeoB7QEHArwB8AHxAfMC/xMABv8BHAGa\n        AfABSgFRAe8B7AF0AfAB8QHyAfMB9Ar/FwAD/wH0AfABBwL3Au0BBwG8AfIC9AP/GQAC/wH0AfABBwLw\n        AfQCvAGSAe0DkgXvA7wB8QHyAfMB9AL/DQAB/wHzAfAB7AESAW0BHAEHAxoCmQG8AfQB/wH0AewBEwFE\n        AUoBcwIcAnMBSgEVARMB7AO8AfAB8gH0Af8RAAL/BfQBHAGaAbwBSgFRAe8B7AF0AbwC8QHyAfMK9AL/\n        DQAG/wT0AbwC9wHsAZIBkQHsAZEB7QHvAQcB8QLyAfQB/xgAAv8B9AHzAfEBBwG8A/MBBwLtAe8BkgHt\n        AZIF7wIHAvAB8gHzAfQC/wwAAf8B8QHrAUQBeQEbAfQB8wHxArwBGgHwAfQB/wHxARIBEQFzAZkBGgG8\n        AwcB7wEcAXMBSgEVAW0B8QHwAQcBvAHyAfQB/xAAAf8B9ALzA/IBHAGaAQcBSgFRAe8B7AF0AvAD8Qny\n        AfMB9AH/DAAB/wH0AfMC8gLwAwcB9wHtAewD6wLsAW0B7ALtAQcB8AHxAfAB8wH/FgAC/wH0AfMB8gHx\n        AbwBBwG8AfEBBwHsAZIB7wIHAu8BBwG8A/AC8QLyAvMC9AP/CgAB9AHsAUQBeQIbAfIB9AMAA/8B8AJK\n        ARwBBwG8AgcB8QH0Af8B9AHxAe8BcwFLAUoB7AHyAfABBwG8AfMB/xAAAv8B9AHyA/EBHAGgAe8BSwFR\n        Ae8B7AF0A/AB8QLwCPEB8gL0Af8KAAH/AfQB8wHyBPEB8AEHAZIB7QLsAesC7AGuAewB6gFtAesC7AH3\n        AbwB8AHxAfMB9AH/EwAC/wL0AfMB8QHwAbwBBwH3AbwB9wFtAesB8QPyAfEB8gHzB/QH/woAAQcBFAF0\n        ARoBvAH0BwAB9AHqAUsBmQEHAfEB8wHxAQcB8AHzAf8CAAH0AbwBcwFLAUoB7wHyAbwBBwHwAfQB/xAA\n        Af8B9AHzAfIB8QHwARwBoAHvAUsBcwGZAewBcw3wAfEB8gHzAfQB/wgAAf8B8wHwAbwBkgLtAewB6wH3\n        AZIB7AJtAesCkQHtAZIBkQLtAZEC7AKuAe0B7wIHAfAB8wH0Av8QAAL/AfQB8wHyAfEB8AG8AQcB7wG8\n        AfQB8AHtAfQG/xcAAf8BEQFuARoBvAHyAf8GAAH/AfcBRAGgAQcBvAHyAbwB8wG8AQcB8QH0Af8DAAG8\n        AksBSgG8AfEBBwG8AfMB/xEAAf8B9AHzAvEBHAHDAQcBUQF0AZkB7AFzAvEC8AnxA/IB8wH0Af8HAAHv\n        AewBbgF0AXkCegKgAXoBeQF0AUoBFQERARUB6gHrAZIB7AEHAbwB9wLvAZIB7QH3AQcB8AMHAfAB8gHz\n        AfQB/w4AAf8B9ALzAfIB8QLwAfEBBwHyAvQBvAEHAfIB8QHwAgcB8AL0Af8TAAH/Ae8BRAEcAbwBBwHy\n        Av8FAAH0AesBmQEaAQcB8AHtAeoB8wHwAQcB8QH0Af8EAAHvAksBHAHxAQcBvAHyAf8SAAH/AfQC8wGZ\n        AcMBvAFzAXQBGgHtAW4C8gXxAvIH8wL0Af8FAAH/AfIBHAGZAQcCvAXwAfIB8wMbAcMBmQHsA20C7AGS\n        Ae8B9wHtAfcBBwHzB/IB8wH0Av8LAAL/AfQC8wHyAfEB8AEHAfcB8QP0Ae8B6gFtAewB9wHvAQcB7wEH\n        AfAB9BIAAfMBFQFKAZkB8AG8AfAB8wL/BAAB8QHsARsBvAHwAQcBSgFLAe8B8QG8AfEB9AH/BAAB9AFu\n        AUsBcwG8AQcBvAHyAf8MAAKSBRwBkgH3AhwBGgGZAXQBeQEaARwBSwHtCOwB7QHyCP8FAAH/AfMBBwG8\n        AfAB8wH0A/8B9AHyArwDBwHwAbwB8AEbARoBmQEcAXQBbgHqAW0B7AH3AbUB8gHzAvQD/wX0Af8LAAH/\n        AvQB8QEHAfcBbQESAeoBvAT0AesBQwFtAe0EBwHxAbwB8hEAAQcBEQFzAZkB8wHxAfAB8QHzAf8EAAEH\n        Ae8B9AHwAfQBvAFzAnQB8wLyAfQB/wUAARwCSwHvAQcBvAHzAf8MAAF0ARoEwwb0AcMCmgEaARwBdAGZ\n        Ae8GmQHvAXMB8w8AAfAB8QH/BgACBwG7AgcBuwG1AQcC7wGRAQcB8QIbAcMBmQFLAeoBkQHwAfIB9AH/\n        BAAC/wL0Af8LAAH/AfEBBwH3AuwB6wESAeoBBwT0AZIBFQFtAe0B7wG8AvIB8wHyAbwB8QH0Af8OAAHt\n        AUQBHAG8AfQB8wHyAfEB8gHzBP8B7QG8AfQB8gH/AfQBcwJ0A/QB/wQAAv8BBwFKAUsB7QHwAfEB9AH/\n        DAABmQHzBPEI8gF0AcMBHAFuAfABvAYHAbwB8QHzEAAB8wH0Af8FAAG8AfIBvAHyAfQB8gG8A/QB7wHz\n        AfIB8AEHARsBGgEbAaACcwEcAfEB/wUABP8KAAH/AfEDBwH3Ae0B6wFtARIB9wT0AfcBFAETAewB7wG8\n        AfID9AHzAvAB/w4AAe0BSgFzAfAC/wH0A/IB8wL0Af8B7AG8AvMC/wHsAZkBeQH0CP8B9AEHAUQBcwEc\n        AfIB9AH/DQAB7wEcA0oCSwFRAXMBdAF5ApkBeQGZARsBHAFRAUsHSgFuAfAB8gH/DwAB/wL0Af8EAAG8\n        AfMB8AHzAQAB8gG8AQAC/wEHAfQB/wH0AbwB/wHyAbwBBwIaApkBBwHyEgAB8QPwAgcB9wHtAesBEgHr\n        A/QBBwHsARMBEgHrAfcB7wHxBfQC8AH0DQAB7QFKAXMB8QIAAv8B9ATzAfIBcwGZARsB8AHzAfQB7AGZ\n        AZoB9AIAAf8D9APzAe8BRAFzARwB9AL/DQAC7wVRAXQBeQF6AaABwwH0AqABmQF0AXkBdAJRBUsBcwHw\n        AfIB/xIAAvQDAAG8AfMB8AH/AQAB8wG8AgAB8wEHAf8BAAH0AbwC/wHxAbwCBwEaARsBmgF5AQcB/w4A\n        Af8B8wHwAfQD8wHwAQcB7QFtARIBbQHyAfQB8QHvAQcB7wGSA/cBBwHxBfQC8QH/DAABHAFKAUsBBwQA\n        Av8C9ALzAXMBmQHDAbwB9AHzAesBmQGgAfQCAAH/AvQE8wHtAUQBcwG8Af8PAAHvBBsBGgQbAZoBwwHz\n        AZkC8wUbAxoCvAEaAfEB8AH/EgAC/wH0Af8BAAG8AfABvAHyAfQB8gG8AvMB8QG7AvMB8QEHAfMB8QEH\n        Ae8BBwHxAfMB8AG8AQcBmQG8AfQMAAH/AfQB8AX0AfMBBwGSAesBEgHsAfIB8AHzAfAB8wG8AfIB8AS8\n        AfAB8wT0AbwB8gwAAbwBSgFLAe0B/wQABf8BHAF5AcMBvAH0AfABHAEbARoDAAP/BPQB6wFKARwB8xAA\n        AW4BHAaSAxwBoAHzAZkBBwHvBBwBkgbtAXMB8QH/FAAC/wEAAbwB8ALyAfQB8gG8AvQB8wG7AvMB8QEH\n        AfMB8gEHAfABBwH0AQAB/wHyAbwCBwG8Af8LAAH/AfEB8gb0AbwB7wFtAesBvAHxAf8BvAHvAfMB8QIA\n        Af8B9AHyAfAB8gLxBPQBvAH0CwAB9AFKAksB8gkAAfMBdAGgARoB/wEAAbwBGwG8BgAD/wHzARQBUQGZ\n        AfQQAAF5CpkBoAHzAZkBoAHDAqACGgKZBe8BmQH0GAAB/wL0AfMBAAH/AfADAAG8Af8BAAL0AQAB/wLz\n        AfEB/wQAAbwBBwG8AfMLAAH/AfAH9AHyAfcB7AEHAfIBAAH/AfQB8QHyAf8FAAH/AfQC8wPyAfEB8AH0\n        DAAB7wFKAUsB6wH/CAAB9AEcAaABmQEHAf8B9AEbAf8IAAH/Ae0BRAGZARsB/xoAAQcBmgHzAXkBoAHz\n        ARoBwyQAAfMB8gG8AfQB/wHzAwABvAH/AQAC9AEAAvEBvAHzAwAB/wEAAfABvAHwAfQB/woAAfMB8Ab0\n        AfIBvAEHAbwB8wH/AwAC/woABv8MAAH/AXMBSwFKAe8B/wcAAf8B8AKaARwBBwEAAfQIAAH/Ae8BFQFz\n        ARoB8wH/GgABHAGaAfMBeQGgARsBBwHDJAAB/wHwAbwB8AHzAfAD8gEHAfEB8gG8AfAB8QIHAbwB/wIA\n        Av8B9AHxAfIB8wH/CwAB8QHyBfQB8QHzAfQB8gHzJAAB8wJLAUQB9wH/CAAB8gF6AZoBcwG8CAAB/wEH\n        AREBbgEaAfAcAAIcAfMBdAGaAcMBBwEbJQAB8wK8AfIB8AG8AfIB8wEHAfIB8AEHAfEBBwHvAQcB9AL/\n        BPQC/w0AAfEB8wL0AfMB8gLzAfIB8QHzJQAB/wEHAXMBSwFKAW0BvAHzA/8B9AHzAf8BAAEaApoBcwHv\n        AfIB9AP/AfMB8QHrAUQBcwGZAfEB/xwAAhwB8gFzAXoBwwEHAfQnAAHyAfEC9AH/AQABvAH/AfIC8wEH\n        AfMB/xYAAfAB8wT0AfEB8gH0Av8mAAH/AbwBHAFzAUsBRAESAesC7AFtARIBvAEAAf8BGgKaAXMB6wHs\n        Au0B7AFtAUoBdAGZAhsB/x0AARwBdAHyAVEBeQHDAQcB9CcAAf8B8gK8AfAB8gG7AbwBBwG7AQcB8wH/\n        FwABvAHzAvQB8gHwAf8sAAHzApkBHAFzA0oBSwF0AZkB8wIAAbwBmgLDARoB7wHtAe8BGwHDAhsB8R8A\n        ARwBcwHyAUsBdAEaAQcBGykAAfABCAHwAfMCCQIHAfMZAAHxAfQC8gH0LwAB/wHyBRoCGwHyAfMDAAH0\n        AfEBGgEbA/QB8gHxAfIB9CAAARwBcwHyAUsBcwEaAZkBwysAAf8C9AHzAfQbAALyAfQB/zIAAf8G9AH/\n        BQAB/wf0Af8hAAEcAXMB8gFLAXMBGgHvAcNLAAHxAf9rAAEcAXMB8wGZARoBGwHvAcO4AAGZAXQD8wH0\n        AZkBoLgAAvQD8wP0/wD/AP8A/wD/AP8A/wDLAAFCAU0BPgcAAT4DAAEoAwABwAMAAeABAQIAAQEBAAEB\n        BgABLRYAA///AP8A/wD/AIUAIP8Bfxb/AfkBHwv/Af4BPwn/AcABBwv/AfgBHwn/AcABAAE/Cv8B8AEP\n        Cf8B8AEAARwK/wHgAQABfwj/AfACAAEfCf8CAAEPAv8B+QEAAQED/wHwAgABDwP/AgABfwP/AgABDwL/\n        AcACAAEPAv8B8QIAAQcC/wH8AgABDwP/AgABDwL/BAABPwH/AfEDAAF/Af8B8AIAAQ8C/wH4AYABAAEI\n        AX8B/gQAAR8B/wHxAQQCAAE/Af8B4AIAAQ8C/wH4AwABPwH+BAABBwH/AfEDAAEfAf8BwAIAAQ8C/wH4\n        AwABPwH+BQAB/wHxAQABgAEAAQcB/wHAAgABDwL/AfgDAAEfAfwFAAH/AfMDAAEHAf8BwAMAAX8B/wH4\n        AwABHwH4BQAB/wHzAgABCAEPAf8BwAMAAR8B/wH8AgABDAEfAfAFAAH/AeMDAAEPAf8EAAEHAf8B/AMA\n        AR8B+AUAAf8B4wMAAR8B/gQAAQcB/wH2AwABHwH8BQAB/wHzAwABDwH+BAABBwH/AfADAAE/Af4FAAH/\n        AfIDAAEDAfwEAAEHAf8BwAMAAR8B/wQAAQEB/wHyAQABCAEAAQMB8AQAAQcB/wHAAwABDwH/AcADAAEP\n        Af8B8wEAARgBGQE/AfAEAAEHAf8BwAMAAT8B/wH8AwABHwH/AfMBAAEQAQEB/wHgBAABBwH/AcACAAEB\n        Av8B/AMAAT8B/wHzAQABEAEBAf8B4AQAAQcB/wHAAgABAQH/AfgEAAL/AfMCAAEDAf8B8AQAAQcB/wHA\n        AgABAQH/AfADAAE/Av8B4AIAAQEB/wHwBAABBwH/AcEBgAEAAYEB/wHwAwABPwL/AeEBAAGAAQEB/wHw\n        BAABBwH/AcEBgAEAAcEB/wHwAQEBwAEAAT8C/wHgAQABgAEBAv8EAAEfAf8BwAGAAQEBgQH/AfABCwGA\n        AQABfwL/AcABAAGAAQMC/wHAAwABPwH/AcACAAEBAf8B+AEPAcABAAF/Av8BwAEAAYABBwL/AcACAAED\n        Av8BwAIAAQED/wHgAQABfwL/AcACAAEDAv8B4AIAAQ8C/wHAAgABAwP/AfABAQP/AcACAAEBAv8B4AIA\n        AQ8C/wHgAgABAwP/AfwBAwP/AcACAAEBAv8B+AIAAQ8C/wH4AgABBwj/AcICAAERAv8B+AIAAT8D/wIA\n        AQcI/wHCAgABAwL/AfgCAAF/A/8CAAEPCP8BwwGAAQABAwL/AfgCAAT/AYABAAEDCP8BwwGBARABBwL/\n        AfgBAAEBBP8B8AEAAQEI/wHhAQEBEAEHAv8B/AEAAQME/wHgAQABAQj/AfMBAQEQAQcD/wEAAQcE/wHg\n        AQABAwj/AfMBAQEYAT8D/wGAAR8E/wHgAQMJ/wHzAYMBiAE/A/8BwAE/BP8B4AEHCf8B8wHDAZgBPwP/\n        AeABPwT/AeABDwn/AeMB/wGYAT8D/wH8Bf8B8AEHCf8BxwH/AZwBfwn/AfABHwn/AccB/wGfCv8B+AEf\n        C/8BHxf/AT9e/wH8AT8W/wH4AR8Q/wHgAQ8E/wHwAQ8Q/wHgAQAE/wHwAQcC/wHfAv8BDwH/AT8I/wIA\n        AR8D/wHwAQMC/wHfAf8B4AEDCf8B/AIAAQED/wGAAQABHwL/AwABDwj/AfgDAAP/AgABBwH/Af4EAAE/\n        B/8B8AMAAX8B/wH+AgABAQH/AfwEAAEfB/8B4AMAAR8B/wH4AwABPwHwBAABAQf/AcADAAEPAf8B+AMA\n        AT8B8AUAAv8B/gF/A/8B4AMAAQcB/wHwAwABDwHwBQAC/wH8AX8C/wF/AcADAAEDAf8B4AMAAQcB8AUA\n        AfAB/wH8AR8B/wHHAX8BwAMAAQMB/wHgAwABBwHwBQAB8AExAfwBBwH4AQMBfwHAAwABAQH/AfADAAED\n        AfAFAAHwAQABYAEDAYABAQF/AYAEAAH/AcADAAEBAeAFAAHwBAABAQF/AYAEAAH/AcADAAEBAeAFAAHw\n        BAABAQE/AYAEAAH/AYAEAAHgBQAB+AUAAR8BwAQAAf8FAAHwBQAB/AUAAR8BwAQAAf8FAAHwBQAB/AFA\n        AwABAQEfAYAEAAH/BQAB+AUAAf4BMAMAAQEBHwGABAAB/gUAAfwFAAH+AQgDAAEDAR8BgAQAAf4FAAH+\n        BQAB/wEIAwABBwEfAYAEAAH+BAABAQH/AcAEAAH/AYABIQGAAQEB/wEfAYAEAAH+BAABAwH/AeAEAAH/\n        AcABAgFAAQEB/wE/AYAEAAH+BAABBwH/AfAEAAH/AcECAAEBAf8BfwQAAQ8B/gQAAR8B/wH4BAAB/wHz\n        AYQBIAHBAv8EAAEfAf4EAAE/Af8B+AQAAv8BgAERAfkC/wQAAT8B/wQAAX8B/wH4AwABAQL/AcgBgwF/\n        Av8EAAE/Af8EAAF/Af8B+AMAAQ8C/wHwAQ8D/wQAAR8B/wQAAX8B/wH4AgABAQP/AfABhwP/BAABHwH/\n        AYADAAL/AfgCAAEBA/8B8AGPA/8EAAE/Af8BgAMAAv8B/AIAAQED/wH8AR8D/wQAAX8B/wHAAgABAQL/\n        Af4CAAEBA/8B/AEfA/8EAAF/Af8BwAIAAQEC/wH+AgABAQP/AfwBPwP/AYACAAEBAv8B4AIAAQED/wIA\n        AQMI/wHAAgABBwL/AfACAAEDA/8BgAEAAQMI/wH4AgABfwL/AfACAAEHA/8BwAEAAQcJ/wEAAQMD/wH8\n        AgABDwP/AeABAAEfCf8BgAEDA/8B/gIAAR8D/wH4AQABfwn/AcABBwT/AgABfwP/AfwBABD/AeABAxb/\n        AfwBf9D/AgAQ/wGfAfwBDwL/Af4CAAF/Cv8BhwT/AQEB8AEPAv8B/gIAAX8D/wHHAf4F/wEDBP8CAAEP\n        A/8CAAF/A/8BAQHgAQcC/wH+AQYBAAF/Av8BAQIAAQMC/wH4AgABAwL/Af4BAAHAAQEC/wH+AQIBAAF/\n        Av8EAAE/Af8B8AIAAQEC/wH+AQABgAEBAv8B/AIAAX8C/wGAAwABDwH/AeADAAL/AfgCAAEBAv8B/AIA\n        AT8C/wGAAwABBwH/AeADAAF/Af8B+AIAAQEC/wH8AgABPwH/Af4EAAEHAf8B8AMAAv8B+AIAAQEC/wH4\n        AgABPwL/BAABBwH/AfQCAAEBAv8B+AMAAv8B+AIAAR8C/wQAAQcB/wHgAgABAwL/AfgDAAL/AfgCAAEf\n        Av8BgAMAAQcB/wHgAgABDwL/AfwDAAL/AfgCAAEfAv8BwAMAAT8B/wGAAgABAQL/AfwDAAE/Af8B+AIA\n        AR8C/wHBAYACAAF/Af8BgAIAAQEC/wH4AwABPwH/AfgCAAEfAv8BwQGAAgABPwH/AYACAAEDAv8B+AMA\n        AT8B/wE4AgABHwL/AuACAAE/Af8BgAIAAQEC/wH4AwABPwH+AQwCAAEDAv8B4AFAAQABDAE/Af8BgAIA\n        AQEC/wHwAwABPwH+AwABAQL/AfACAAEPAX8B/wGAAgABAwL/AeADAAE/Af8BwAIAAQEC/wH4AgABHwL/\n        AcACAAEHAv8BwAMAAT8B/wHAAgABAQL/AfgCAAE/Av8B8AIAAQ8C/wHAAwABPwH/AcACAAEDAv8B+AIA\n        AT8C/wH4AgABHwL/AfADAAE/Af8BgAIAAQMC/wH4ASABAAF/Av8B+AIAAT8C/wHgAwABPwH/AYADAAF/\n        Af8B/AIAAX8C/wH4AgABfwL/AeADAAE/Af8BgAMAAT8B/wH8AQABAQP/AfwCAAF/Av8B4AMAAT8B/wGA\n        AgABCAE/Af8B/gEAAQMD/wH+AgABfwL/AcADAAE/Af8BwAIAAQ8BBwH/Af4BAAEDA/8B/gIAA/8BwAMA\n        AX8B/wHAAgABDwGHAf8B/gEAAQMD/wH8AgAD/wHAAwAC/wHgAgABHwL/Af4BAAEDA/8B+AIAAT8C/wHA\n        AwAC/wHwAgABDwL/Af4BAAEHA/8B+AIAAT8C/wHAAwAC/wHwAQABAQEPAv8B/gEAAQ8E/wIAA/8BwAIA\n        AQEC/wHwAgAD/wH8AQABHwT/AgAD/wHAAgABAwL/AfwBAAGAA/8BCAEAAT8E/wIAA/8BwAIAAQcD/wEB\n        AYAD/wIAAX8E/wIAA/8BwAEAAQ4BDwP/AQEBgAP/AgABfwT/AgABfwL/AcABAAEPBP8BAQGAA/8BgAEA\n        AX8E/wIAA/8BwAEAAQ8E/wEBAYAD/wGAAQABfwT/AgAD/wHgAQABHwT/AQEBwQP/AeABAAX/AQABAQP/\n        AeABAAEfBP8BAQHjA/8B8AEDBf8BgAEBA/8B4AEAAR8E/wEBAfMD/wH4AQcF/wHgAQMD/wH4AQABPwT/\n        AQEL/wHgAQcD/wH4AQABPwT/AcML/wH8AR8D/wH4AQABfwT/AccR/wEDd/8B4AE/EP8B/gE/BP8BAAED\n        EP8B/AEfBP8BAAEBCv8B4AEAAT8D/wH4AQ8D/wH+AgABfwn/AYABAAEPA/8B+AEHA/8B/gIAAX8D/wHg\n        AQME/wIAAQMD/wGAAQABfwP/AgABfwL/AfgCAAEPAv8B/gMAAX8C/wIAAT8D/wIAAX8C/wHwAgABBwL/\n        AfwDAAE/Af8B/gIAAQ8D/wGAAQABfwL/AeACAAEBAv8B+AMAAR8B/wH4AgABAwP/AgABfwL/AcADAAF/\n        Af8B+AMAAQcB/wH4AgABAQP/AYABAAF/Av8BgAMAAT8B/wH4AwABBwH/AfgCAAEBA/8BwAEAAR8B/wH8\n        BAABHwH/AfgDAAEDAf8B4AMAAX8C/wHAAQABDwH/AYAFAAH/AfADAAEBAf8BwAMAAT8C/wGAAQABBwH/\n        AYAFAAH/AeAEAAH/BAABDwL/AwABfwGABQAB/wHABAAB/gQAAQEB/wHwAwABPwYAAf8BwAQAAf4FAAH/\n        AfADAAEHBgAB/wHABAAB/gUAAf8B8AMAAQcGAAH/AYAEAAH/BQAB/wHwCgAB/wGABAAB/wHAAwABAQH/\n        AfgKAAH/AYADAAEBAf8EAAE/Af8B+AoAAf8BgAMAAQMB8AQAAT8B/wH4CgAB/wGAAwABAwHwBAABHwH/\n        AfgKAAH/AYADAAEHAfgEAAEPAf8BwAkAAQcB/wGAAwABHwH+BAABDwH/AcAJAAEDAf8BgAMAAT8B/wHA\n        AwABPwH8AUAJAAEDAf8BgAMAAX8B/wHAAgABBwH/AfwDAAEBAeAFAAEDAf8BgAMAAv8B4AIAAQcB/wH+\n        BAABeAUAAQcB/wHAAwAC/wHgAgABBwH/AfwEAAF/AYAEAAEHAf8BwAIAAQEC/wHwAgABDwH/AfwEAAE/\n        AYEDAAEBAR8B/wHAAgABAQL/AfACAAEPAf8B+AQAAT8BgQMAAQEBHwH/AeACAAEDAv8B+AIAAQ8B/wH4\n        BAABPwGDAYACAAEBAe8B/wHgAgABAwL/AfwCAAE/Af8B8AQAAT8B/wHAAgABAQL/AfgCAAEHAv8B/AIA\n        AX8B/wHwBAABHwH/AcACAAEBAv8B+AIAAQ8C/wH+AgABfwH/AfAEAAEfAf8B4AIAAQEC/wH8AgABHwP/\n        AcABAwL/AfAEAAEfAf8B+AIAAQMD/wIAAX8D/wHwAQ8C/wHwBAABHwH/AfgCAAEDA/8BgAEABP8B/AEP\n        Av8B8AEHAfABEAEAAR8B/wH4AgABBwP/AeABAwT/Af4BHwL/AfABHwH/AX4BAAEfAf8B/AIAAQ8J/wH+\n        AR8C/wHwAT8C/wHIAT8B/wH+AgABPwn/Af4BHwL/AfgBfwL/AfgBPwL/AgABfwr/AT8K/wH4AR8L/wE/\n        rP8B4AEfFv8BgAEDFf8B/gIAAX8D/wHgAQcP/wH8AgABfwP/AeABAwr/AfABAwP/AfwCAAE/Av8B8AEA\n        AQMK/wHAAQED/wH4AgABHwL/AcABAAEBAcABPwH/AfwBHwHzBP8BgAEAA/8B+AIAAQ8C/wHAAwABPwH/\n        AfwBDwHABP8CAAP/AfgCAAEPAv8BwAMAAR8B/wH4AQcBgAF/A/8CAAP/AfACAAEPAv8BwAMAAQ8B/wH4\n        AgABfwP/AgABfQL/AfACAAEPAv8BgAMAAQMB/wH4AgABfwL/AcADAAL/AeACAAEPAv8EAAEBAf8B+AIA\n        A/8BgAMAAv8B4AIAAQcB/wH+BQAB/wH4AQABAQP/AYADAAL/AcACAAEHAf8B/gUAAf8B/gEAAQMD/wGA\n        AwAC/wHAAgABBwH/Af4FAAL/AQABAQH/AfkB/wGAAwAC/wHAAgABAwH/Af4FAAH4Af8BwAEAAR8B4AH/\n        AYACAAEBAv8BwAIAAQMB/wH8BQAB8AF/AgABDwHgAf8BgAIAAQEC/wHAAgABAwH/AfwFAAHwAT8BAAEg\n        AQcBwQH/AYACAAEBAv8BwAIAAQcB/wH8BQAB+AIAATABAAEBAf8BgAIAAQEC/wHAAgABBwH/AfwFAAH8\n        AgABHgEAAQEB8AQAAQ8B/wHgAgABBwH/AX4FAAH+AgABHwGAAQcB8AQAAQcB/wHgAgABBwH/AR4FAAH/\n        AQABAwEHAcABBwHwBAABDwH/AeACAAEPAf8BHgUAAd8BwAEDAYMBwAEHAfgEAAEPAf8B4AIAAQ8B/wEe\n        BQABzwHgAQABQwGAAQ8B+AQAAR8B/wHgAgABDwH/AR4EAAEGAcMB8AMAAQ8B/AQAAR8B/wHgAgABDwH/\n        AR4EAAEGAeMB/AEAARABAQEfAfwEAAE/Af8B8AIAAQ8B/wEeBAABDgHzAfgBPwH4Ah8B/gQAAT8B/wHw\n        AgABDwH/Af4EAAEOAvABOQGcAQ4BPwH+BAABPwH/AfgCAAEPAf8B/gQAAT4B8AFgAXgBHgEMAT8B/gQA\n        AT8B/wE4AgABHwL/BAABPgH8AQEB/AE/AQABfwH/AYADAAF/Af4BCAIAASABfwH/AYADAAE+Af4BAQHw\n        AQ8BgAL/AcACAAEBAf8B/AEEAgABIAE/Af8BgAMAAT8B/gEBAfABDwGAAv8B4AEgAQIBAwH/AfwBBAIA\n        AUABPwH/AcADAAL/AQMB/AF/AcAC/wHAASABAAEHAf8B+AEGAgABwAE/Af8B4AIAAQEB/wH+AQEB/AF/\n        AYAC/wHAASABAAEHAf8B+AEHAQABAQHAAT8B/wHwAgABAQL/AQAB/gF/AQEC/wHAASABDAEHAf8B/gEH\n        AeAB/wHgAX8B/wHwAgABDwL/AYgBPwH+AR8C/wHgATABHgEHAf8B/gEPAfwBfwH4Av8B8AIAAQ8C/wH8\n        AQcB8AE/Av8B4AE8AR4BBwL/AR8B8AEfAfkC/wHwAgABDwP/AQMBwAF/Av8B4AF/Af4BDwP/AfABHwP/\n        AfgCAAEfA/8B8wGDA/8B+AL/AQ8D/wHgAQ8D/wH4AgABPwT/Ae8K/wHgAQcD/wH4AgABPw//AeABBwP/\n        AfgCAAF/D/8B4AEHA/8B/AIAEP8B4AEPA/8B/gEAAQEQ/wHwAR8E/wEAEf8B+AE/BP8B53H/AcABPxX/\n        AfgCAAF/Av8BuwL/AfEO/wHgAgABHwL/AaEC/wHBCv8B/gF/Av8BwAIAAQ8C/wGBAv8BwAj/AfACAAEf\n        Av8BgAIAAQEC/wGAAX8B/wEAAX8H/wHwAgABHwL/BAAC/wGAAT8B4AEAAT8B/wH+Af8B/AF/Av8B8AIA\n        AQ8C/wQAAT8B/wHAAT4CAAE/Af8B/AEDAYABfwL/AfACAAEHAf8B/gQAAR8B/wHAAwABPwH/AfgBBwHA\n        AR8C/wH4AgABAQH/Af4EAAEfAf8BwAMAAR8B/wHwAQcBwAEPAv8B+AMAAv8EAAEPAf8BwAMAAR8B/wHg\n        AQcBwAEPAv8BwAMAAQMB/wQAAQcB/wHAAwABDwH/AcABBwHAAQcC/wHAAwABAQH/BAABBwH/AcADAAEP\n        Af8BwAEHAcABAwL/AcAEAAH+BAABBwH/AcQDAAEPAf8BgAEHAeABAwL/AcAEAAH+BAABBwH/AcADAAE/\n        Af8BgAEHAeABAQL/AcAEAAH+BAABBwH/AcADAAE/Af8BAAEHAeABAQL/AcADAAEDAfwBIAIAASABDwH/\n        AYADAAL/AQABDAEQAQEC/wHAAwABBwH8BAABDwH/AYACAAEBAf8B/gIAARABAAL/AcEDAAEPAfwEAAEf\n        Af8BgAIAAQMB/wH+AQABEAIAAv8BwQHgAgABDwH8BAABPwH/AYQCAAEDAf8B/gEAASACAAH/AfABAwHg\n        AgABBwH8BAABfwH/AYQCAAEBAf8B/gQAAf8B4AQAAQcB/AMAAQEC/wGAAgABAQH/Af4EAAH/AfABAgMA\n        AQcB/AEwAQABQAFhAv8BgAIAAQEB/wH+BAAB/wHwAQMB4AGMAQABfwH8ATwBAAFgAcEC/wGAAgABAQH/\n        Af4EAAH/AfgBQQHhAQwBHwF/AfwBPwEwAWcB4QL/AYACAAEBAf8B/gQAAv8BwQHiATwBPwH/Af4BHwL/\n        AcEC/wGAAgABDwL/AwABAQL/AcABxwEYAT8B/wH+AR8C/wHBAv8BhAIAAS8C/wMAAQEC/wHgAccBAAE/\n        Af8B/gEPAv8BgQL/AYACAAEvAv8DAAEBAv8B8AFPAZABfwL/AQ8B5wGfAYMC/wGHAgABHwL/AYACAAEB\n        Av8B8AEHAYABfwL/AQMB5wEeAQcC/wGGAgABGQL/AcACAAEDAv8B+AIAA/8BgQHnAR4BDwL/AYYCAAE5\n        Av8BwAIAAQEC/wH+AQABAQP/AcAB5wEcAQ8C/wGGAgABOQL/AcACAAEBAv8B/AIAA/8BwAEnAQABHwL/\n        AYQCAAE/Av8BwAIAAQEC/wH4AgABfwL/AeABBwEAAT8C/wGAAQABAQE/Av8BwAIAAQEC/wH4AX8B8AF/\n        Av8B+AEHAQABfwL/AYABNgGBAb8C/wHAAgABAQL/AeAB/wH4AT8C/wH8AQcBAQP/AYAB9gGRAb8C/wHA\n        AgABAwL/AeAB/wH8AT8D/wIHA/8BgQH3AZED/wHAAgABAwL/AfAL/wHHAf8B8wG/Av8BwAIAAQcO/wHH\n        Af8B+wG/Av8B4AIAAQcO/wHHBf8B4AIAAQ8U/wH4AgABDxT/AfgCAAEfFP8B/AIAAX8V/wHAAQMW/wH8\n        AZ98/wHgAQcP/wHgAT8B/wGBA/8BwAEDCv8B/AEfA/8BwAEfAf8BAQP/AYABAwr/AeABAAP/AYABBwH+\n        AQAD/wEAAQEF/wHwAX8D/wIAAQMC/wIAAf4BAAE/Av8BAAEBBf8BwAFgAX8C/wIAAQEC/wIAAf4BAAE/\n        Av8BAAEBBf8BgAEAAT8C/wIAAQEC/wGAAQABPAEAAR8C/wEAAQED/wH+AQcBgAEAAT8B/wH+AwABfwH+\n        BAABBwL/AQABAQP/AfwBAQGAAQABPwH/Af4DAAF/Af4EAAEHAf8B/gIAA/8B+AEAAYABQAE/Af8B/gMA\n        AT8B/gQAAQcB/wHwAgABHwL/AcABAAGAAQABfwH/Af4DAAE/AfwEAAEHAf8B4AIAAQ8C/wHAAQABQAEA\n        A/8DAAE/AfgEAAEHAf8BwAIAAQ8C/wGAAQABfgEDA/8B4AIAAT8B+AQAAQcB/wHAAgABBwH/Af4CAAE8\n        AQMD/wHwAgABPwHwBAABBwH/AYACAAEDAf8B/gIAARgBAwP/AfACAAEfAfAEAAEDAf8BgAIAAQMB/wH+\n        AwABAwP/AfwCAAEfAfAEAAEDAf8DAAEBAf8B/AMAAQED/wH8AgABDwHwBAABAwH/AwABAQH/AfwDAAEJ\n        BP8CAAEPAfgEAAEBAf4DAAEBAf8B+AMAAQ0D/wHwAgABDwH4BAABAwH+AwABAQH/AfgDAAEEA/8DAAEP\n        AfwEAAEBAf4DAAEBAf8B+AMAAQQD/wMAAT8B/gUAAf4DAAEBAf8B+AQAA/8CAAEBAf8B/gUAAfgEAAE/\n        AfgEAAF/Av8BgAEAAQMB/wH+BQAB+AQAAT8B+AQAAT8C/wHkAQABDwH/Af4FAAH4BAABPwH+BAABPwL/\n        Af4BAAE/Av8EAAEHAfgEAAE/Af8EAAE/Av8B/gFwAT8C/wGAAwABDwH4BAABPwH/AcADAAF/Av8B5AFw\n        AT8C/wGAAwABDwH8AQ8BgAEBAcABfwH/AfgDAAF/Av8BgAEAAT8C/wHAAwABHwH8AQ8BgAEHAcABfwH/\n        AfgDAAF/Av8CAAE/Av8BwAMAAT8B/gEHAYABBwHAAX8B/wH+AwABfwL/AgABPwL/AcADAAE/Af4BBwHA\n        AQcBwAP/AYACAAF/Af8B/AIAAX8C/wHgAwABHwH+AQcBwAEPAcAD/wHgAgABfwH/AfgBAAT/AeADAAE/\n        Af4BAwHgAQ8BwQP/AfACAAF/Af8B8AEABP8B8AMAAT8B/wGDAfABHwGBA/8B/AIAAv8B4AEDBP8B+AMA\n        Av8BwQH4AT8BAwP/AfgCAAL/AeABAwT/AfgCAAEDAv8BwQH5Af4BAwP/AfgCAAL/AeABBwT/AfgCAAEP\n        Av8B8AH/Af4BDwP/Af4BAAEBAv8B+wEPBP8B/AIAAQ8C/wH4AT8B8AEfBP8BAAEBCP8B/AIAAQ8C/wH4\n        AR8B8AF/BP8BwAEDCP8B/AIAAR8D/wEfAeMP/wH+AQABwAF/Ff8BAAH9Fv8BAJf/AfYX/wHAAT8H/wGB\n        AfMBzwH/AX8J/wH+AQABPwb/Af4BAAEhAQcB/wE/Af8B5wL/AecE/wHwAQABHwL/Af4D/wH+AQABQAED\n        AccBPwH/AcMB/wF/AeME/wHAAQABHwL/AfwBPwL/Af4BAQEAAQMBgQG/Af8BxwH8AR8B8QT/AYABAAE/\n        Av8B/AEfAv8B/AEDAQABAwGAAd8B/wHDAfwBHwHhBP8CAAE/Av8B/gEfAv8B/AEHAQABAQGAAV8B/wGH\n        AfABBwHhBP8CAAE/Av8B/AEfAv8B+AEBAgABwAFfAf8BgwIAAeAD/wE+AgABPwL/AfwBDwL/AfgDAAGA\n        AR8B/wEDAgABQAL/Af4DAAE/Av8B/AEfAv8B+AQAAR8B/wQAAv8B8AMAAT8C/wHgAQMC/wH4BAABPwH/\n        BAABfwH/AeADAAE/Av8B4AEAAv8B+AQAAT8B/wQAAX8B/wHgAwABPwH/AfgCAAEBAf8B+AQAAT8B/wQA\n        Av8BwAMAAT8B/wHAAwABfwH4BAABPwH/BAAC/wHgAwABPwH/AcADAAE/AfwEAAE/Af8BgAMAAv8BwAMA\n        AT8B/wGAAwABDwH+BAABPwH/AcADAAL/AYADAAE/Af4EAAEBAf8EAAF/Af8BwAIAAQEB/wF/BAABPwH+\n        BQAB/wHAAwAC/wHAAgABAQH/AX8EAAF/AfwFAAH/AfgCAAEPAv8B4AIAAQMB/wE+BAABfwH8BQAB/wH8\n        AgABHwL/AeACAAEDAf8BPgQAAWMB/gQAAQEB/wH8AgABPwL/AeACAAEDAf8BfgQAAUEB/AEAASACAAE/\n        Af8B/AIAAT8C/wHwAgABBwH/AX4EAAEhAfAEAAEfAf8B/AIAAT8C/wHwAcABAAGPAf8B/gQAASMB8AQA\n        AQ8B/wH8AgABPwL/AfgBwAEBAY8B/wH+BAABPwHgBAABDwH/AfwCAAE/A/8B4AEDAv8B/gQAAf8B4AEA\n        AQICAAEHAf8B/AIAAT8D/wHAAQEC/wH+BAAB/wHgAQABAQGAAQABBwH/AfwCAAE/A/8BwAEAAv8B/gQA\n        A/8B4AEHA/8B/AIAAX8D/wHAAQABfwH/AfwDAAEBA/8B4AEPA/8B/AIAAX8D/wGAAQABfwH/AfgDAAEB\n        A/8B8AEfA/8B/gIAAX8D/wGAAQABfwH/AfgDAAEHA/8B/AE/BP8CAAT/AYABAAF/Af8B8AMAAQ8D/wH8\n        AX8E/wIAAX8D/wGAAQABfwH/AfADAAEPCf8CAAF/A/8BgAEAAX8B/wHwAwABHwj/Af4CAAF/A/8BgAEA\n        AX8B/wHgAQABAQHAAT8I/wH+AgABfwP/AcABAAF/Af8B6AGAAQcB2AHwCP8B/gIAAX8D/wHAAQABfwL/\n        AQABHwH/AeABfwf/Af4CAAF/A/8BwAEAAX8B/wH+AQABPwH/AYABfwf/Af4CAAF/A/8BwAEAAv8B/gEA\n        AX8BvwFgAX8H/wH+AgABfwP/AeABAAL/Af4BCQL/AfABfwj/AgABfwP/AfgBAwL/Af4BDwz/AgAF/wG/\n        Av8B/gE/DP8CABb/AcABAxb/AeABBxb/AfABH7L/AfAL/wHwAQMK/wGAAT8K/wHgAQMK/wEAAR8K/wHg\n        AQMK/wEAAR8D/wHgAQEB8AEDA/8B8AEACv8BAAEBA/8BwAEAAeABAQP/AfABAAT/Af4BBwT/AgABDwL/\n        AYABAAHgAQABfwL/AfABAAF/A/8B+AEBA/8B/AMAAX8B/gQAAR8B/wH8AwABHwL/AcABAAEPAv8B+AMA\n        AT8B/gQAAQ8B/wH4AwABBwH/AcACAAEPAv8B8AMAAR8B/gQAAQcB/wH4AwABBwH/AYACAAEHAv8B4AMA\n        AQcB/gEBAcACAAEHAf8B+AMAAQMB/wMAAQEC/wHAAwABBwH+AQcB8AEAAcABAwH/AfwDAAEDAfwEAAE/\n        Af8BwAEAAQEC/wH8AQcB4AEAAXABAwH/Af4DAAEBAfwEAAEPAf8BwAIAAT8B/wH4AQMB4AEAAXgBAwL/\n        AwABAQHwBAABAQH/AcACAAEfAf8B+AEBAeABAAF4AQMB/wHAAwABAQHwBQAB/wHgAgABDwH/AfgBAQHg\n        AQABfAEDAf8BwAIAAQEB/wH8AX4CAAEBAeAB/wHgAgABAQH/AfgDAAHwAQMB/wHAAgABAQH/Af4BPgIA\n        AQEB8AH/AcACAAEBAf8B+AQAAQcB/wHAAwAB/wH+AR4BEgIAAv8BwAMAAf8B+AFgAQABBgEAAQcB/wHA\n        AwAC/wHOARMBEAEAAT8B/wQAAX8B+AF4AQABBgEAAR8B/wHAAwAC/wHCAwABHwH+BAABfwH4ATwBAAEO\n        AQABPwH/AcADAAL/AfICAAEIAQ8B/gIAARgBAAE/AfgBPwHgAY8BwAE/Af8BwAIAAQEC/wH+ARMBkgIP\n        Af4BAAEEAR8BAAE/AfwBHwHgAQ8B8AE/Av8B8AEPBP8BAwGSAR0BBwH+AQABBwE/AfABPwH8AQ8B4AFf\n        AeABPwL/AfABDwT/AgABGAEPAf4BAAEfA/8B/gEHAfgBPwHAA/8B8AEPBP8BgAIAAT8B/gEAAT8D/wH+\n        AQABBAIAA/8B8AEPBP8B4AGAAX8B/wH+AQABPwT/AQABBAEAAQED/wHwAQ8E/wHgAQAC/wH+AQMF/wHA\n        AQMBAAEHA/8B8AEPBP8B+AEDAv8B/gEPBf8B4AEDAYABDwP/AfABDwT/Af4BDwL/Af4BHwX/AfgBBwHA\n        AR8D/wHwAQ8I/wH+AX8M/wHwAQ8W/wHwAQ8W/wHwAQ/4/ws=\n</value>\n  </data>\n  <metadata name=\"ilBloodline.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ilBloodline.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC4\n        fQAAAk1TRnQBSQFMAgEBDAEAASgBAAEoAQABOAEAATgBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo\n        AwAB4AMAAeADAAEBAQABCAYAAcQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA\n        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5\n        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA\n        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm\n        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM\n        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA\n        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz\n        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ\n        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM\n        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA\n        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA\n        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ\n        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/\n        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA\n        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm\n        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ\n        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz\n        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA\n        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM\n        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM\n        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM\n        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA\n        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM\n        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ\n        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz\n        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm\n        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw\n        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8A/wD/AP8A\n        /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A\n        /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AOgAC9AP/AQAD/wEAAv8CAAL/BgAC/wIAAf8CAAL/AQAE/wIA\n        A/+3AAG8Au8B8gL/AvQC/wL0Av8C9AL/AgAC/wH0A/8B9AL/AfQC/wT0Av8C9AL/ewAy/wkAAfMC8AEH\n        AfMB8QIHAfAB8gG8AQcC8QIHAfMB/wIAAf8B8AEHAbwB8QG8AQcB8wG8AQcBvAHxAbwDBwG8AfEBvAEH\n        AfAB/3oAAf8B8wG8AfQB/wHxAbwB8gHxAQcB8QHwAQcD8AHxAQcB8wH0AfEB8gHzAfAC8QHwAvMBvAHx\n        Af8B8QG8AfABBwHxAf8B8wHwA/EB9AHxAQcC8wHwAfIB/wkAAf8B8AH0AQcB8wHwAfQB8QHwAfIB8QHy\n        AQcB8QHyAe8B9AH/AgAB/wHwAfQCBwHyAe8BvAHyAfABvAHxAvIBBwG8AQcB8QHyAQcB8QH/egAB/wHx\n        Ae8B8gH/AfEBBwHzAfAB9wHzAQcB7wHyAvEBBwGSAfECvAHxAQcB8QH0AfMB7wEHAbwBBwG8AfABBwLy\n        Ae8B8QHyAe8B8gH0AfEB7wIHAe0B8gK8AfQB/wkAAf8B8AH/AQcB9AHxAf8B8QHyAfQB8QHzAQcC8wHv\n        Af8EAAHxAf8CBwH0Ae8BvAH0AvAD8gEHAfQB/wLzAe8B8nsAAfQB8AEHAbwB9AHyAQcB8QEHAZIB9AEH\n        AfcB8QHzAfQBvAHtAgcB8wHyAe8B9AEAAf8B8AIHAu8BBwHyAf8B8wHvAvEB9wH/AQAB9AHwAQcBvAHs\n        AgcB9AH/CgAB/wHwAf8BBwH0AfEB/wHxAfIB9AHyAfMBBwLzAe8E/wEAAfEB/wIHAfQB7wG8AfQC8ALy\n        AfMBBwH0Af8C8wEHAfIKAAL/AvQX/wL0Av8BAAX/AQAC/wH0Av8BAAP/AQAE/zwAAf8B8gHvAfMBvAHz\n        AfEBvAIHAZIB9AG8AgcB8gH/AfACBwHvAfIB8wHvAfQBAAH/AfEBvAEHArwBBwH/AQAB8wHvAfIB9AGS\n        Af8BAAH0AfECBwHvAQcB7wHyAf8KAAH/AfAB/wEHAfQB8QH/AfEB8gH0AfIB8wEHAvMB7wH0AfEB7wEH\n        Af8B8QH/AgcB9AHvAbwB9ALwAvIB8wHtAe8B8gLzAQcB8goAAf8BvAHvAQcB9wHxAbwB9wPvAfEBkgH3\n        Ae8BBwHzAQcB9wG8AfMB9wLvAfcB8ATvAfMB/wHxAZIB7wHzAv8BBwHvAgcB8gH0AQcB9wHyAf8CBwH0\n        Af88AAH/AfEB8AH/AfEBvAHwAbwB9AHxAZIB9AG8Ae8B8wHyAf8B8AGSAfMCBwHxAfcB8QL/AbwB8QHw\n        Ae8BBwHvAfMB/wHzAe8B8gHwAe0B8wH/AfQBvAHxAbwB7AHzAe8BvAH/CgAB/wHwAf8BBwH0AfEB/wHx\n        AfIB9AHyAfMBBwLzAe8B9AHyAfAB8gH/AfEB/wIHAfQB7wG8Af8C8ALyAfQB7wHxA/MBBwHyCgAB9AHw\n        AfQB/wLvAfMBvAH0Af8B8AH/AQcB8QH0AQcB8QHzAQcC9AEHAfIB/wHyAfEB8AL/AfAB8QH/AQABBwHw\n        Av8BvAEHAv8B8wEHAfMB8QHvAf8B8AG8AfQIABD/AQAF/wIABv8CAAX/AQAJ/wYAAf8B8gHvAfAB/wH0\n        Au8BBwHyAfAB9wHyAQcB9wHwAQcB8gEHAfcB8AEHAfEB9AHxAQcB8gHwAbwB8wHxAe8CvAEHAfMB8gHv\n        AfAB8wHwAbwB8gLwAfQBvAHtAfABBwHyAf8KAAH/AfAB9AEHAfQB8AH/AvEB9AHxAfQB7wHyAfMB7wH/\n        BAAB8QH/AQcB7wH0AQcB7wH/AvAC8gHzAQcB8gPzAQcB8gH/CQAD/wHzAe8BvAH0AQcC8gHzAQABBwHx\n        AfQBvAHyAfMBBwL0AQcB8AHzAfAB/wH0Af8B8gG8AfIB/wEAAQcB8QH/AfQBvAHyAgAB/wLwAfEB7wHy\n        AQcB8gH/CAAB9AHzAvIC8wL0AfMC8gH0Af8B8wHyAfQB/wHzAfIB8QHzAv8BAAH/AfMC8gHzAf8BAAH/\n        AfQD8gH0Af8B9ALyAfMC9AHzAfIB9AH/BQAB/wHzAfIB8wH/AfQC8QHyAfMC8gHzBPIB8wHyAfEB8gHz\n        Af8BAAH/AfMC8gL/AfMB8QHyAf8B8gHzAfIB8QH0Av8C8gHzAf8B9AHyAfEB8gHzAf8LAAH0AbwB9AEH\n        AfMBvAH/AfEBvAHyAfEB9AHvAfQB8wEHAf8DAAH/AbwB/wHwAQcB9AHwAe8B/wPxAvMB7wIHAfEB9AEH\n        AfAB/woAAfQBvAHvAfIB/wH0AQcBvAEHAfIBAAIHAbwBBwH0AfMBBwL0AgcB8AHvAf8B9AG8AQcB8QL/\n        AQABBwHxAf8B8gHvAfMCAAH/A/EB7wHwAbwB8QH/CAAB9AG8AgcB8AEHAbwB8gMHAfMB8QEHAbwB8wHx\n        AQcBvAHwAbwB8QH/AQAB9AHwAgcB8QL/AfIBBwHwAfECBwLyAQcB7wG8AfIB8AEHAfAB9AH/QwAB/wHz\n        AfQB8wH0AfMC9AHzA/QB8wP0Af8DAAH/AfMB9ALzAfQC8wb0A/MC9AHzAfQB/wkAAf8B8AG8AfMD9AEH\n        AvQB8wH/AQcBvAHxAQcB9AHzAQcC9AEHAfIB/wHxAf8CBwP0Av8BBwHwAf8B8wG8AfEC/wH0AQcB8gHx\n        Ae8B/wHwAbwB/wkAAfEB8gHwAfQB8AEHAfQC8QHwAfMBvAHwAvQB8AEHAfQB/wHzAbwB9AEAAf8B9AK8\n        Af8BAAHzArwB9AH/AfMB8AHvAfQB8AEHAfIB8QHwAfEB/3gAAf8B8gG8AfIBBwHxAfIBBwLwAQcB9AIH\n        ArwB9AHxAbwB8gHzAe8BvAHxAQcB9AIHAfICBwG8AfEB7wEHA/ABBwLyAQcB8AH0AfAB7wHyAQcB8AH/\n        CQAC8gG8AfMCvAH0AvEBBwK8AfMB/wH0AfIBBwH/AQAB/wG8AfQCAAH0AbwB8AL/AbwB8QHwAf8BAAH/\n        AfEBBwHyAfACBwHwAQcB/3kAAv8B8gLwAfQB8wLyAfEB8gH/AvEB8gL/AfMC8gH0AfEB8gLxAv8B8QHw\n        AfEB8gHwA/IB8QHyAf8B9AHxAfAB8wL/AfMC8QHzAf8KAALyAe8BvAEHAfMB/wLxAQcB8AEHAfQB/wH0\n        AfIBBwH/AQAB/wG8AfQCAAH0AbwB8AL/AbwC8QH/AQAB/wLxA/ADvAH/tAAC8gEHAbwBBwHyAf8C8QHw\n        AfEBBwHwAf8B9AHyAQcB/wEAAfQBBwHzAv8B9AG8AfAC/wG8AvAB/wEAAf8B8QHwAfIB8QG8AvEBBwHy\n        HQAC/wH0AfID8QHzA/8rAA3/UwAB/wHxAfIBvAHzAbwB8QH/AvEB8AHzAbwB8QH/AfMB8gHvAv8B9AEH\n        AfIBvAHyAfMBvAHwAfQB8QEHAfABBwH0Af8B8QHwAQcB9AHwAQcB8gLxAfIZAAL/AfQB8gEHAewBEgEV\n        AUMBEAERARQBbQHtAbwB8wL/JQAE/wH0AfEBvAHvAZIB7QHsAe0B9wEHAfAB8wH0Av9QAAH0AbwB8AHv\n        AQcB8AHzAfQBvAHwAQcBvAHwAfMB9AG8AfAB7wHyAfQB8QEHAfABBwHvAbwCBwK8AfMB8QK8AfABvAHx\n        AfQB8wG8AgcBvAHwAf8XAAL/AfQB8AHtAeoDEgETARQBFQNDAREBQwESAZIB8QL/IgAC/wH0AfEBBwHs\n        AW0BEwFDAhEBEAIPARABQwHqAe0BvAH0Av9OAAH0BPMB9AH/AfQB8wHyAvMB9AH/AfQB8wHyAfMC9ATz\n        AfID8wLyAv8B8wLyAfMC/wXzAf8XAAH/AfQB8AH3AuwB7QLsAesB6gESAxQCFQFDAREBEAETAe8B8gH/\n        HwAD/wHyAe8B7AFtAuoBEgETAhUCEQMPAQ4BDwFDAesBBwH0Af8pAAP/AQAD/18AAf8B8wEHAfcB7wEH\n        Au8B7QLsAesB6gESARMDFAEVAkMBEQFDAesB8AL/HQAB/wH0AQcB7QPsAesCbQHqAm0B6gESARUBQwEQ\n        AQ8DDgFDAewB8gL/HAAC/wcAAv8B8wHxAf8BAAH0AfEB8wH0Av8GAAL/UwAB/wHzAe8BBwS8AQcB7wL3\n        AewB6wFtAeoBEwMUARUCQwEQAREB6gG8Af8cAAH/AfMB7wHtAfcCkgPtAewBbQESAkQBEgHqAewB6wES\n        AREBDwIOAQ8BbQHwAf8cAAHzAfIB/wQAAf8B9AEHAesBSgHrAfMBAAG8ARQBEgHsAQcB9AH/BAAB/wG8\n        Af9SAAH/AfQB7wEHBPAC8QEHAbwB8AG8Ae8B7QFtAhIDFAEVAkMCEQEUAbwB/xoAAf8B8wL3A+8CBwHs\n        AUQCHgYLAREBbQHsARUBDwMOARQB8AH/GwAB8wHsAfMB/wIAAf8B8AFEAiMBIgFtAfMBAAEHAyIBEAHr\n        AfEB/wMAAfMB7AH/UQAB/wH0AfcBvAHxAvAB8QHyAbwB8QH0A/8BAAH/AQcB6wHqARICFAIVA0MBEQEU\n        AfIB/xgAAf8B9AL3AgcCvAGTAUUB6QEBAR8DAQIeBAsBDwHqARMBEAMOARQB8QH/GgAB/wFKAe0B8QL0\n        ARwBIwFLAUUCIwFtAfMB/wEHBSIBFAEHAvQB8QHrAe8B/1EAAf8CBwHwBPEB8AHzA/8EAAH/AfIB7AHq\n        ARMDFAIVAkMBEQFtAfMB/xYAAv8B7wHsAe8BBwG8AQcBbwJFA+kDHwIBAUQCHgMLAUMBFAEQAw4B6gHz\n        Af8XAAH/AQAB/wEcAUQBEgHrAW0FSwEjAUoB8QH0Ae8EIgJDAUQB6wFtARQB6wHzAgAB/ycABv8hAAH/\n        AfIB9wLwAvEB8AHxAfQC/wcAAf8B8QHrARIBEwMUARUDQwERAfcB/xYAAf8B8AHsAe0B9wIHAW8CRgIg\n        BOkCRgFFAUQBIwIeAwsBEAFDARADDgHsAfQB/xUABP8B8wFzAiMBSgF0AZMBHAFSAksBSgHsAe0BEgIi\n        AUQBbgHsAW4BRAIiAW0BvAH/AQAD/xsAAv8C9AL/AgAD/wHzAfIB8QHyAfMB9AP/HgAB/wHvAQcBvAHw\n        AfEBvAHxAfQC/wkAAf8B7wFtARIBEwMUAhUCQwESAfEB/xQAAf8B8wHsAesB7ALvAW8CRgMgAekCRQFG\n        AUUCRAFDAgsCHgMLAQ4BDwMOAUMBvAH/FQAB/wG8AfMC/wHyAW4BRAFzAbwC8QGZAUwBSwFzAhwBbQIi\n        AW4BvAHyAfAB6wEiAUQB7wH0Av8B8wHxAf8aAAH/AfMBBwH3Ae0B7wHyAf8B9AHxAQcB7QFtAxIBbQHs\n        Ae8B8QH0Av8bAAH/AfIB7wK8A/AB8wL/CwAB8gHsAW0BEgETAxQCFQFDARUBkgH/FAAB/wEHAW0B6wHt\n        Ae8BbgFFAUYBQAMgAekBHgJFAUMCAAEOAQsBAQJEBAsBDgEPAw4B6wH0Af8UAAH/Ae8B7QHyAfQB8wHs\n        AUoBBwHyAvQB8AJLAXMB9wHvAewBIgFEAe0B8gL/AfIBEgFEAe8B9AH/AfEB7AHzAf8WAAL/BPMB8gEH\n        AW4BRAFtAe8B6wESARUBEQEQAhEBIgEQAREBFQESAe0B8AH0Af8aAAH/AQcB9wEHAbwB8AEHAfMC/wwA\n        Af8B9wHrAW0BEgEUAhMBFAIVAUMBbQHzAf8SAAH/AfMB7AHqAesB7wFuAUUB6QIgASUBIAElAUUDRAEO\n        AgsBAAEeAR8BRQERAR4ECwQOARUBvAH/FQAB8wJKAewB6wFEAewB8QH0Av8B8wNLAVEBcwFEASMBSgHv\n        AfMD/wEHASIB6gHsAesBEgEcAf8XAAH0AfcB6wHqAesB7AEHAfMB8QFEAUMBFQFDAREBQwJEAeoB6wHt\n        AZID9wHsAW0B7wHzAf8ZAAH0AfcB7wEHAbwBBwHxAv8NAAH/Ae8B7AHrAW0DEgETARQCFQETAQcB/xIA\n        Af8B8ALqAesB7wFEAekEIAElAUYBbwFEAg4BAAELASQCCwHpAUUBEQIeAwsEDgEPAe0B/xUAAf8BBwFE\n        AiIBRAEcAfMB/wIAAfQBHAFLAZkBBwG8ARwBRAFLAbwB9AH/AgAB8wEVAiIBRAEcAfMB/xcAAv8B9AG8\n        AW4CRAG8AfAFRAFuAe8BBwHxAfMC/wMAAf8B9AG8Ae8B8gH/FwAB/wHxAe0B7wEHAbwB7wH0EAABBwLs\n        AesDbQETAhQCFQH3Af8SAAH/Ae8BFAETAesBEgEeAR8DIAFGAUUBbwFFAUMBDwIOAQsB6QEeAQsCRQEL\n        AQEBHgQLBA4BbQHzAf8UAAL/AQcBSgEiAUQBBwL/AgAB/wGZAUsBdAEHAfABkgFEAW4B8AL/AgAB9AHs\n        ASIBSgHvAfMC/xkAAv8BvAFuAUUB6gFEAUUBRAFFAW4B7wHwAfMB9AHzAfIC8QHyAfQC/wEAAf8B9AHz\n        Af8XAAH/AfAB7AH3Ae8CBwP/DQAB/wHvAe0C7ALrAm0BEgMUAe0B9BIAAfQB7AEVARQBbQIeAQEB6QIg\n        AUYBRAERAUQCRQFEAQ4BAAEfAQEBAAELAREBCwEBAh4ECwEPAg4BFQHwAf8UAAP/AfACSgHwAf8DAAH/\n        AbwCSwJzAksBdAHxAv8CAAH/ARwBFQHtAfMC/xsAAf8B8wHtA0UBSwFMAZMBvAHyAfQB8wG8AewBEgET\n        ARIBbQHtAbwB8wL/GgAB/wG8Ae0D9wHxA/8MAAL/Ae8D7QHsAusB7AHqARMCFAHsAfQSAAHzARMBFQEU\n        ARMBCwEeAQEBHwHpASABRgFFAUQBRQFGAW8BbgEQAQABAQHpAR4CAAEeAgECHgMLAQ8CDgFDAQcB/xUA\n        Av8B9AFtAUoB8QH/BAAB8AFLAXQBvAEaARwBSwEcAfIC/wIAAf8B7wFDAQcC/x0AAfQB7QFEAUUBTAF0\n        AZkB8AHzAfQBvAHrARQBbQHsAe8BBwK8AQcB8AHzAf8aAAH/Ae8B7AHtAfcB7QHzAf8B9AHzAf8LAAH/\n        AfIC7wH3AZID7AHvAesB6gESARMB7AHzEQAB/wHyAREBQwEUARUBCwEeAQEBHwHpAiABRgHpAkYBbwFE\n        AQ4BAAHpAUABIAIBAekCHwEBAR4DCwEOAg8BQwHvAv8WAAH/AW0BEwHwAf8EAAHxAUsBcwEHAfAB7QFL\n        AZkB8wH/AwAB/wHvAUMBBwH/HQAB/wHwARIBRAFFAW8BGgHwAvQB7wESAW0B9wG8AfIB9AT/AvQB/xoA\n        Af8B7wTsAfQB/wHwAe8B8wH/CAAC/wH0AQcB7wEHAe8B9wGSAe0B7AG8AesBbQLqAewB8xEAAf8B8AEQ\n        AREBFAEQAQsBHgEBAh8EIAFGAW8BRAEPAQABCwVGAiABHwIBAR4CCwEOAg8BQwH3AfQB/xYAAf8B7AFE\n        AQcB/wQAAfICSgFuAXMCSwG8AfQB/wMAAfQB7QFEAbwB/x0AAfMBbQFDAUQBRQGTAbwC9AHvAUQBbQHv\n        AfMB9AT/AwAB/xsAAfQB9wHrAuwB6wH0Af8B8QHsAfcB9AgAAv8B8AHvAbwBBwHvBPcB8QHsAesCbQHs\n        AfMRAAH/AbwBDwERARUBDwELAR4CAQEfAukBIAFGAW4BRAEOAQABCwFFAUYBbwFGAUUBRgMgAekBAQEe\n        AgsBDgIQARUBkgH0Af8WAAH/Ae8BIgGSAfQEAAHzAesBSwHvAbwBHAFLAbwB9AH/AwAB9AFtARIB8gH/\n        HAAB/wFtAREBQwFEAW4BBwH0Af8BBwJEAe0B8wP/IgAB/wHvAm0B6wFtAfMBAAHzAe8B7AHtAfQB/wQA\n        Av8B9AG8Ae8CvAIHA+8BvAHyAuwC6wHtAfMRAAH/AbwBDwEQAUMBDwILAR4CAQHpAUUCRgFuAREBDgEL\n        AUYBEQEQAUUBRAELAekCIALpAR8BAQEeAQsBDgEQAREBFAHvAfQB/xYAAf8B8AEiAW0B8gH/AwAB9AHs\n        AW0B8gH0AQcBSwG8Av8CAAH/AfABQwHsAfQB/xwAAfIBEAJDAUQBbgG8Af8B9AFuAkUB7QH0Af8kAAH/\n        Ae8BbQHrAW0B6wHxAv8B8AHvAewBbQG8AfQC/wL0AfEC7wLxAbwDBwG8AQcC8QPsAesB9wH0EQAB/wHw\n        AQ4BDwERAQ8CCwIeAgEBRQFEAUYBbgERARABRQFvAW4BQwEQAQ8BCwFFAUYCIAHpAR8BAQEeAQsBDwIR\n        ARMB7wH0Af8XAAH0AesBQwHvAf8DAAH/Ae0BbQHzAf8BvAFLAbwC/wIAAf8B7AFKAbwB/x4AAQcBFQFD\n        AkQBbQHwAfQB8AF0AUsBbgG8Av8jAAH/AbwBEgJtAeoB7wH/AQAB8wIHAfcBbQHsAe0C7wL3AbwB8wHy\n        AfEB8AEIArwC8AH0AQcD7QHsAe8B9BEAAf8B8gIPARABDwMLAh4CAQELAUQBEwEPAQ4BRQF0AW8BEwFE\n        AkUCRgIgAekBHwEBAR4BCwEQAkMBEgEHAv8XAAH/AQcBRAESAfAB/wIAAf8BHAHqAfMBAAG8AXMB8AL/\n        AQAB/wEHAUQB7QHzAf8eAAH/AfcERAFtAfAB9AG8AZMBSwFuAQcB9AP/AwAD/xoAAf8B8QHqARMBEgHq\n        AewB9AL/AfEB7wEHAbwBBwLvAQcBvAHyAfMC8gHxA/AB8QG8AfIB9AP3Au0BBwH/EgAB8wEVAw8ECwEe\n        AQEBRQFEBA4BEAEUAW0BFAERBEYCIAHpAR8BAQEeAQsBQwEVARQBbQHwAv8YAAH0Ae0BRAHrAfED/wHv\n        AeoB8wEAAbwBcwHxA/8BvAHqAXMBvAL/HgAB/wH0AesCQwJEAesB8AHzAfABkwFuAUoB7QEHAfIB9AL/\n        AfQB8wH0Af8bAAHzAesBFAETARIB6gHwAf8BAAH/AfAB7wK8AfAD8QHwAfEC8gHxAfAB8QHyAfAB8QH0\n        AfIB9wLvAvcB8AH/EgAB9AHrAw8ECwEeAUQBRQFEAQsCHgJEAREBDwEOAREERgIgAekBHwEBAR4BCwIU\n        ARMB7AHyAf8ZAAH/AfIBcwFEAW0BvAH0Af8BBwFtAfMBAAG8ARwB8gH/AfQB7wFLAXQBvAH0Af8gAAH0\n        AewBEQFDA0QBbgEHAfIB8QEHARwBSwHqAesB7AGSAfcB7wHxAfQB/xsAAf8BkgEUAhMB6gHtAfQB/wEA\n        Af8B8QEHArwB8ALxAfAF8QHyAfAB8QH0Af8BBwH3A+8BBwHzAf8SAAH/Ae8BDgIPAQ4ECwEjAUQCCwEf\n        A0UBEAEAAQ8CRQFGARcBRgIgAekBHwEBAR4BEQESARMB6gHvAfQB/xkAAv8B8QFzAUQBEwHtAfAB7wHs\n        AfMBAAG8ARwB8QG8AXMBSwGZAbwB8wL/HwAB/wHzARIBRAESBEQBbgH3AfAC8gEHAe8BkgHtAfcBBwHz\n        Av8BAAP/GAAB/wG8AeoBEwISAW0BBwH/AgAB/wHzArwC8APxAfIC8wLwAfIC/wHyAZIFBwL/EgAB/wHw\n        AUMBDgEPAQ4BAAcLAQEBRQFuARUBDgELAkUDRAMgAekBHwEBAQsBFALqAesBBwH/GwAC/wHzARwBSgEV\n        AhQB6wHzAQABvAFLAeoBSgFzAZkBvAHzAv8dAAP/AfMB7QEUAesBBwH3AUQBQwJEAUUBbgHvAfEC8wP0\n        BP8B9AHwAfIB/xkAAfQB7AEUARMCEgHrAfEB/wIAAv8B8wK8AfAC8QHwAbwB8AHyAfQC/wH0AfcB7wG8\n        AQcCvAHyAf8UAAH0AesCDgEPAQ4GCwEeAkUBEgIPAUYBRAFDARABDgEBAyAB6QEfAQEBRANtAfcB8gH/\n        HAAC/wH0AfABHAFKASIBbQHzAQABvAFKAUsBmQG8AfIB9AL/HgAB8wH3AesBEwFuARwBBwHyAfQBEwNE\n        AUUBSwFMAUsBbgH3AbwB8QLzAfIB8QH3AewB8AH/GwAB8AESARQBEgHqARMB6wHyAf8CAAP/AfQC8wHy\n        AvMB9AL/AQAB9AL3A7wB8AEHAfQB/xQAAf8BBwERAw4BAAQLAx4BRQESAQ4BDwFuAQ4BFQJEBCABHwEB\n        AUQB6gHrAuwBBwL/HgAC/wH0AfIBBwHsAfMBAAG8Ae8B8AHzAfQC/yAAAf8B8wG8AfAB8QLzAfIB7QFE\n        Ae0B9wFuAUsCRQJLAUUCRAEUAhMBEgH3AfMB/xwAAf8B7QEUARMCEgETAW0B8AL/AgAK/wHzAZIB7QS8\n        AQcB8gL/FQAB9AHrAQ8DDgEABAsCHgJEAg4BAAEOAUMBRAHpBCACAQHqAuwB7QHvAfIB/yAAA/8B9AH3\n        AfMBAAG8AQcE/yMAA/8B8wEHAewB7QEHAfAB8wHxAQcBHANvBG4B7QEHAfEC/x4AAfQB6wITARIB6gEU\n        ARIB7wHyA/8EAAP/AfQBvAHsAfcDvAPwAv8XAAHxARUEDgULAR4CRAERAQ8CDgELAQEDIAHpAR8BHgHq\n        AewBkgH3Ae8BvAH0Af8jAAH/Ae8B8wEAArwB/ygAAf8B9AHzAvIB8wP/AfQC8gHxARoD8AHxAfMB9AL/\n        IAAB8wHrARQBEwISARMBFQFtAe8B8AHzBPQB8wHxAQcBkgHsAe8DBwG8AvAB9AH/GAAB/wEHARAEDgYL\n        AkQBQwELAR4BCwEfASAB6QEfAQEBRAFtAe0B9wHvAgcB8wL/IwAB/wHvAfMBAALwAf8qABP/IgAB8gHs\n        AxMDEgETAeoB6wHsA+0D7AH3Ae8DBwK8AfAB8wL/GQAB/wH3AQ8EDgEABAsFHgEBAh8CAQFEAesB9wLv\n        AgcB8gL/JQABvAH0AQAB8AHyAf8yAAj/JQAB/wHzAfcB6gESARMF6gJtAesB7AHtAZIB9wTvArwB8AHz\n        Av8bAAH/Ae8BEAUOBgsFHgFEAeoB7QH3Ae8BBwG8AQcB8gH0Af8mAAHwAfQBAAHwAfRhAAL/AbwB7AHq\n        AhIC6gFtA+sB7APtAfcB7wEHAfABvAHxAfQC/x0AAf8BvAEVBQ8EDgQLAUMBEwHrAewBkgHvAQcB8AG8\n        AfIB9AH/JwAB8wH2AQAB8gH/ZAAB9AHvAesB6gESAuoBbQPrAewB7QGSAe8CvAHwAfMC/yAAAf8B8gHs\n        ARQBEQMPAhACEQFDARQBEwHqAW0B7AHtAe8BBwLwAfIC/ygAAv8BAAL/ZQAC/wG8Ae8BkgTsAZIB9wHv\n        AQcBvAHxAfMB9AL/IgAB/wH0AQcB7AESAUMDEQFDARUBEwESAeoBbQHsAZIB7wK8AfEB8wP/lAAC/wH0\n        AfIB8QLwAvEB8gHzAvQC/yUAAv8B9AHwAe8B7AHrA20C7AHtAZIB7wG8AvAB8gH0Av+YAAv/KAAE/wHz\n        AfIB8QXwAfEB8gLzAfQD/50ABP8uAAf/AvQG/9MAC///AN0AAf8FAAH/AgAE/wMAAf8EAAH/AwAD/wMA\n        Av8CAAP/BAAB/7QAAf8B9AH/AgAF/wH0AvMB9AH/AQAB/wH0Af8BAAP/AQAC/wH0AfMB9Ab/BPQB/wIA\n        Af8B9AH/ggAD/wIAA/8CAAX/AQAD/wEAA/8BAAP/AQAF/xAAAfIB7wHzAf8BAAH0AfAB8QH/AfIBvALv\n        AQcB8gH/AfEBBwH/AQAB/wHwAbwC/wHxAQcC7wHwAv8BvAHyAfQBvAHwAbwBBwH/AgAB8wHvAfSAAAH/\n        AfIBvAEHAfAC/wHzAbwB8AL/AfMBvAEHAbwB9AEAAfIBvAHxAf8B8gG8AfAB9AHwAbwC8wG8AgcB8AH0\n        Af8PAAHzAfEB7wL/AfIBBwHzAfIBBwHwAfMB8gG8AfcB9AIHAfQBAAH0AfMB7wH/AfIBvAHyAfMBvAH3\n        AfMB9AHvAQcB8AEHAfQB8AEHAfIC/wHwAe8B/38AAf8B8AP3Ae0B7wHyAQcB9wHsAv8B7wL3AZIBBwEA\n        AfcBkgHvAfIBBwH3AewBvAH3Ae0BvAEHA/cBkgHwAf8PAAH/AbwB9wHzAf8B8QG8Af8B8AEHAfQC/wHy\n        AQcB9AEHAe8B8wH/AfQB8wHvAf8CvAH0AQAB8QEHAfIB9ALvAQcB8gH/AfQCBwH/AfMB8AHxAf8NAAH/\n        AfMC8gHzAf8B8wH/AQAB/wL0AfIC8QLzAvEB8gH0AfIB8QHyAvQB/wEAAf8B8wH0Av8B9AEAAf8B8wHx\n        AfIB8wH/EgAD/wEAAv8CAAP/AgAD/wEAA/8CAAL/AQAC/wIAAv8BAAL/FQAB8wHvAQcB9wIHAfcDBwHs\n        Av8B7wMHAfcB/wHvAQcB7wHwAgcB6wIHAfcDBwLvAbwB9BEAAfQB8AEHAfIBBwHyAv8BBwH/AgAD/wEH\n        Ae8B9wLvAfMB7wH/AgcB/wEAAfMBvAHyAfQB8AHzAu8C/wHxAQcB8gHxAe8B/w4AAbwBBwK8Ae8B8AH3\n        AQcB8QG8AQcBvAIHAbwB8AG8AQcBvALwAQcDvAHvAfQBAAHxArwB/wHyAbwBAAH/AfABBwK8Af8SAAHz\n        AZIBvAH/Ae0BBwL/AQcB7AHxAQAB/wHyAZIB8gH/AfAB7AHzAQAB/wG8Ae0B8wHtAQcC/wEHAe0B/wH3\n        Ae8B/xQAAfMCBwGSAe8BBwLvAgcB7AH/AfQD7wEHAewB/wIHAe8B8AIHAesCBwH3AwcBkgHyFAABBwH3\n        AQcBvAH0Av8BkgH/AgAB/wH0Af8BBwG8AQcCvAHzAe8B/wIHAf8BAAHzAbwB8gH0AgcBvAHvAfEBAAH0\n        Ae8BkgEHAfIOAAH/AQcC8wEHAfcB9AHwAfcC7wHxAfIBBwIAAfQBBwHzAgABvAHvA7wB9wHzAfABBwHv\n        AbwB/wHxAQcBAAH/AQcB9wHwAfEB/xIAAfEBvAHvAfEBBwHvAf8B8AHvAbwBBwEAAf8B8AH3AfEB/wHv\n        AQcBkgHxAQcB7wHtAbwBBwHvAf8B8AEHAfcB8QEHAe8B/xQAAfMCBwGSAbwC8AHxAgcB7AH/AfIBBwL3\n        AQcB7AH/AgcB7wHwAgcC7AEHAe8B8AIHAZIB7AEHAfQSAAH0AfEB7wHxAf8BAAHwAe8BBwLzAQcB7wH/\n        AgcB9AEAAfQB8wHvAf8CBwH/AQAB8wG8AfIB9AHvAbwC8AHxAQAB/wLxAe8B9A4AAf8BBwLyAQcBvAH/\n        AfQC7wG8AfQB8gEHAgAB9AEHAfMCAAG8AQcDvAH3AQcBvAH0AQcBvAH/AfEBBwH/AfQB8AEHArwB/xIA\n        AfEBvAHvAfEBBwHvAfMBBwK8AQcBAAH/AfAB9wHxAf8B8QG8Ae0C7AEHAe8B8AG8AfcB8QLvAfMB8gEH\n        Ae8B/xQAAfMCBwGSAf8C9AHzAgcB7AH/AfABBwHvAfcBBwHsAfQCBwHvAfACBwHvAQcB7wGSAfEDBwH3\n        Ae8B8xIAAf8C8AH0Af8BAAH/AfEB7wH3Ae8B8AHzAf8CBwH/AQAB/wHyAfAB/wK8Af8BAAHzAQcB8wH0\n        AQcC7wG8Af8CAAH0AbwB8gH/DwABvAEHAbwCBwH/AQABvAHvAfIB/wHyAfECAAH0AfAB9AIAAbwBBwG8\n        AfAB8QEHAbwC/wK8AfABBwH3AbwB8gEHAe8BvAHwAf8SAAHxAbwB7wHxAQcB9wEHAe8BBwG8AQcBAAH/\n        AfAB9wHxAv8BvAHvAfcBBwHvAfIB8QG8AfcB7QHvAfAB/wHyAQcB7wH/FAAB8wEHAbwBkgG8AvcBvAEH\n        AbwB7AH/Ae8BBwLvAQcBkgHxAgcB7wHwAbwBBwHtAe8BBwHtAwcB7wG8AfIB/xIAAf8B9AHzAf8DAAH/\n        AvMB8gH0Af8BAALzAf8BAAH/AfMC/wHzAfQB/wEAAf8B8gL/AfMC8gH/AwAB/wHzAv8PAAH0A/IB9AH/\n        AQAB/wHzAf8BAAH0Af8CAAH/AfQB/wIAAfMC8gHzAfQB8wH/AQAB/wL0BPIB9AHzAvIB8wH/EgAB8QG8\n        Ae8B8QEHAewB9wG8AQcBvAEHAQAB/wHwAfcB8QH/AQABvAHvAe0BBwHvAfQB8QG8AQcBvAH3AfIB/wHy\n        AQcB7wH/FAAB8wEHAbwB7AGSAQcB7wMHAewB/wHvBAcB7wMHAe8B8AG8AQcB6wGSAQcB9wMHAZIB7wHx\n        AfQTAAL/IwAB/0wAAfEBvAHvAfEBvAHvAQcB8wK8AQcB/wHyAQcB9wEHAfIC9AEHAe0B7wHwAf8B8QEH\n        AfcBvAH3Ae8B9AHyAQcB7wH/FAAB9AK8AfcB7wIHAfIBvAEHAewB/wHvBQcB9wMHAfABvAEHAe8B9wIH\n        AfIBvAEHAe8C9wHwAf+EAAHxAbwBBwHxAbwBBwHwAf8B8AG8AgcBkgHvAQcB7QGSAe8B/wEHAbwB7wHz\n        Af8B8QEHAe8B8gG8AZIBvAHyAQcB7wH/FAAB/wH0AbwCBwG8Af8B9AG8AgcB9AIHAfEB8gIHAfECBwHx\n        AfMBvAMHAbwB9AH/AfAEBwHzAf9cAAL/JgAB8wEHAfMB9AK8Af8BAAHxAQcB9AYHAfIB/wHyAbwB8AH/\n        AQAB9AG8AfEB/wHzAQcB8gH0AbwB8QH/WgAH/zIAAf8B8wHtARIBBwH0Af+bAAP/AfQB8gHwAe8B9wLt\n        AfcB7wG8AfMB9AL/KgAC/wHyAe0BFAFDARUBQwHqAQcB8wL/lgAD/wHyAQcB7QESARUBQwEQAQsDDwER\n        ARQB6wHvAfIC/yYAAf8B9AHxAe0BFAFDARQBEwEUARUBQwEVAW0B7wHyAv9iAAX/AQAE/ycAAv8B8gHv\n        AewFRAIeBgsBEAESAfcB8gL/IgAB/wHzAbwB7AETARQEEwYUAeoB7wHyAv9gAAH/AQcC7wHzAf8BBwLv\n        AfMB/yUAAf8B9AG8Ae0BbgZFBEQGCwFDAW0BBwH0Af8eAAL/AfMBBwHsAxIBEwMSAhMEFAETARQBFQHq\n        AZIB8AH0Af8nAAL/AvQC8wH0A/8tAAHzAesB6gHrAfAB8wISAesB8QH/JAAB/wH0Ae8BbgVvAZMBHAHv\n        AQcBvAIHAZIBbgFEASIDCwERARQB9wH0Af8dAAH0Ae8B7APrAW0B6gISAeoCEgITAxQCEwEUARUBFAES\n        AewBvAH/JAAB/wHzAQcB7QHrAW0C6gHrAewBBwHzAf8sAAH0AewBbQHsAbwB8gETAW0B7QHyJAAB/wH0\n        ARwCbwIWAZQCBwHxAfMC9AT/AfQB8QHtARUECwFDAe0B9B0AAewB6wTsAesD6gFtARIB6gITAhQBFQEU\n        ARMBFAITAhIB6gHzIgAB/wHwAe0BBwHsAREEEAERARIB7QL3AbwB/yoAAfQB9wFtAewB8AHyARQB6gGS\n        AfMjAAH/AfQBkgFuAhYBlAEaAbwB8QHzAfQE/wYAAfMBbgMLAQwBEQGSAf8cAAESAe0B9wGSAuwB7QFt\n        AeoBbQLrAe0BEgETARQDFQEUARMBFAETAhIB6gHzIQAB8wHsAe0B9AH/AfcFEAFDARIBBwH/AfEB6gHs\n        AfEB/yQAAf8B8QHwAbwBBwHsAW0B7AHwAfIBFAESAewBBwO8AfMB/x0AAv8B7wJvARYBlAK8AfIB9Az/\n        AQAB/wHvAUQDCwFDAe8B/xsAARIB7ATtAuwB6wPsAe0B6wISARQBFQJDAxUBFAETARIB8x4AAv8B8AHt\n        AQcB/wEAAf8B7wEPBBABFQFtAQcB/wEAAfQB7AESAQcC/yEAAf8BBwLrAuoBbQHrAe0BvAHyARQBEwEU\n        ARUBQwIVAewB9BwAAv8B8AFuAW8BFgGTAbwB8AHzAfQC/wrzAv8BAAH/AQcBRAILAREBFQHxAf8aAAET\n        AuwBkgH3ApgB9wKSAfcC7wEHAewDEwRDARUCEwESAfMeAAH/AbwB9wG8AfQCAAH/Ae8EEAERARUB6wG8\n        Af8CAAH0AZIBEgHvAfQB/yAAAfMB9wLvAfcB7QLsAZIBvAHyARQDEwEUAxMBBwH/GwAB/wHzARwBRgFv\n        ARYBBwHwAfMC/wEAAbwB7ANuAewCbgLrAewB8AH/AgAB/wEHAUQCCwERAewB9AH/GQABFAHrAewBkgKY\n        AQgBBwLvAQgB9wHyAfQBBwHqAuwBEwIRAUMBFAITARIB8x0AAf8BvAEcAbwB9AH/AgAB/wH3BBABEQEV\n        AesBvAH/AgAB/wHzAewBEwEHAf8fAAH/Ae8B7QHvArwBBwH3Ae0B9wG8AfIBEgHqAm0B6gITARQB6wHz\n        Af8aAAH/AbwCRgFvAZMBvAHzAv8CAAH3A28GbgHsAfAB/wMAAfQBkgFEAgsBFAG8Af8ZAAEVAeoB6wHt\n        AQcBmAEIAbwB9wHvAQcB9wH0AQABBwHsAvcBEgIRARUCFAETARIB8x0AAfIB7QEHAfIB/wMAAf8B7wQQ\n        AREBFQHrAbwB/wMAAf8B8AHqARIB8B4AAf8B8QHsAe0BBwHwAbwB8AEHAZIB9wHwAfIBEgHsAe8BvAEH\n        AeoDEwHvAf8ZAAH/AfQB7QJGAW8BBwHzAv8DAAHzBbwFBwHzAf8DAAH/AfMB6gEeAQsBQwHsAfQZAAER\n        ARIBbQHtAZgBCAHxAfABkgHtAfcB7wH/AQABBwH3AesBbQETAhUCFAEVARQBEgHzHAAB/wHsARwBvAH0\n        Af8DAAH/Ae8CEQIQAREBFAHsAbwB/wQAAfQBkgFDAW0B9B0AAfQBkgHrAe0B8QEHAfQB/wHzAvcB8AHy\n        AW0B9wHyAv8B9wITARQBbQHyAf8YAAH/AfABRQJGAZMB8QL/BAAB7wFuBEUD6gJtAbwB/wQAAf8B7wFE\n        AgsB6gHxAf8YAAEVARMBEgHsAQgB8gH0AfACCAH3AfMB/wEAAfQBvAHsAfcBbQHqAe0B6wETARQBEgHq\n        AfMcAAEHAesBvAHxAf8EAAH/Ae8BFQJDAREBQwFKAewBvAH/BAAB/wG8ARMBEQEHHAAB/wHxAeoB6wHv\n        AQcB9AIAAfQB7wH3AfAB8gHrAe8B9AIAAfQBEgMUAfcB/xgAAf8BBwJGAW8B7QH0Af8FAAH3ARYIkwHt\n        AbwB/wUAAfMBRAILARUBBwH/GAABFQESAeoB7AFtAfcB8wHyAfcB8AHvAfEB/wEAAfQB9wIHAe0B7wEH\n        AW0CEwESAeoB8xsAAf8BFAHrAbwB8wUAAf8B7wFKAhQCFQFKARwBvAH/BQAB8wHrARABFAH0GwAB/wHs\n        AesB7AK8Af8CAAH/AbwB7wHxAfIB7AEHAf8DAAEHARIB6gESAW0B8gH/FgAB/wH0AZMB6QFGAW8BBwH/\n        BgAB9AHzB/IB8QHyAfQB/wUAAf8B6wILAUMB9wH/GAABEgHqAXIB7AGSAesBBwHwAe8B8QG8AfIB/wEA\n        AfQBBwHxAbwB7wHxAe0B6gETARICbQHzGwABvAFDAesBBwH/BQAB/wG8AW0ESgHrARwB8AH/BQAB/wHs\n        AhEBvAH/FQAF/wH0AvACvAH0AwAB/wHzAfEC9AHxAfIB/wMAAf8B9wHvAQcBvAH0Bv8RAAH/AfMBbgHp\n        AUYBbwHyAf8GAAH0AfME8gXxAfMB/wYAAe8BHgELAREB7AH0GAABFAHqAewB7QKYAewB8QHwA/8CAAP/\n        AvEBvAHrAewCEgFtAesB8xoAAf8B7AFDAXIBBwH/BQAB/wHyARwCcwFyAesBHAEHAfIB/wUAAf8B7QER\n        AUMB7QH/FQAB8wLvAbwB8AHyAfMB9AHzAfQB/wQAA/8BAAL/BAAB/wT0AfMB8QG8AQcB7wHxAf8RAAH/\n        AfMBRQHpAUUBbgH0BwAB7wFuBkUDbgEHAf8GAAHxAUQBHgERAesB8xgAARQB6gLsAfcBBwHtAfIB9AH/\n        BwAC/wHvAQcB9wFtAeoC6wHzGgAB/wESAREBbQEHAf8GAAH0AbwBCAGZARwBBwG8AfEC/wYAAe0BEQFD\n        AesB/xUAAfACFAETARIBbQHrAewBkgHvAQcB8QH0AgAB/wH0Af8BAAL0Af8BAAH/AfIBvAEHAfcB7QHs\n        AW0B6gETAhIBBwH/EQAB/wHyAUQCRQFuAfQHAAFuAkYBJQdGAe8B/wYAAfMCHgFEAW0B8gH/FwABFQES\n        AusBbQGSAfAB9AoAAf8C8QHsAW0B6gFtAesB8xoAAfMBFAERAUoB7wH/BgAB/wH0AfIB8AG8AfAB8gH0\n        Af8HAAHsAhEB6wHzFQAB8AETARIB6gYSAeoB6wHvAv8B8AHtAfIB9AHtAe8B/wEAAbwBbQISBBQCEwHq\n        AewBBwH/EQAB/wHyAkQBRQHrAf8HAAFuB0cCRgFvAe8B/wYAAfQCHgFEAW0B8gH/FwABQwESAW0D6wHy\n        Af8BAAT/AQAG/wHtAewB6wFtAusB8xoAAfIBFAEQARUBkgH/BwAC/wP0A/8GAAH/AesBEAERAesB8hUA\n        AfABEwESAuoBEgLqAW0B6wHsAfcBkgL/AQcB7QHwAfIB7AH3AfQBAAEHAeoBEgTqAW0B6gHrAW0B7AEH\n        Af8SAAHzAUQBHgFEAW0B/wcAAW4JRwFvAQcB/wYAAfMCHgFEAewB8wH/FwABQwETAW0C6wH3AfIC/wEH\n        AewBBwH/AQAB9AHsAe0B8gH/AfMB9wGSBOwB8xoAAfEBFAEQAREB6wHzCAAF/wgAAfMB6gEQAREB6wHy\n        FQAB8AETAxID6gFtAesB7ALvAv8B8AEHAfAB8QG8AQcB9AEAAQcD7AHrBW0C6wEHAf8SAAHzAUQBHgFE\n        ARIB8wcAAW4JRwFvAQcB/wYAAfIBRAE+AUQB7AHzGAACFALqAesBbQH0Af8B8gH3AQcB6wHxAf8B7QLs\n        AfcB9AH/AQcBbQTsAfMaAAHxARQCEAESAfAB/wYAAf8B8QHsAeoB6wG8Af8HAAHwARQBEAFDAXMB8hUA\n        AfAB6gLrAuwB9wEHAbwD8AHyAv8B8gHxAvMB8QHzAf8BAAHzAfABvAHwAbwB7wGSBewBBwH/EgAB8wHq\n        AR4CRAHxBwABbgJGBkcBFwFvAQcB9AYAAQcDRAGSAfQYAAEUARMC6gHsAfcB9AH/AbwCmALsAfQB7QGY\n        AQcBvAL/ApIE7AHyGgAB8gEUAhABEQHtAfQEAAL/AQcBcwEcAXgBcgESAe0B8wH/BAAB/wGSAhABQwHs\n        AfQVAAHyAe8BBwG8AvAC8QHyAfMB9AL/AQAF/wH0Av8BAAL/AfQB8wHyAvEC8AG8AQcB7wHwAf8SAAH0\n        AewCCwFEAfcB/wYAAW4DRgVHARcBFgEHAfQFAAH/AewDRAHvAf8YAAEUARIB6gISAZIB9AH/AfQC7wEH\n        AfAB/wEHAe8BBwHyAv8BBwHsAe0D7AHyGgAB8wEUAhABEQESAfAB/wMAAf8BvAEcApkBeAFzAesB7AEH\n        Af8DAAH/AfEBEgIRARQB7QH/FQAB/wLzA/QB8AEHAe8BBwH0BAAB/wHzAv8C8wH/AwAB/wG8Au8BvAHz\n        Av8C9AH/EwAB/wHvAgsBIgHqAfQGAAFuBEYERwEXARYBBwH0BQAB9ANFAW0BvAH/GAABFQHqARIBEwES\n        AewBvAHwAfID7wHyAfEC7QHvAfAB8gG8Ae0F7AHyGgAB/wESBBAB6wHzAf8CAAH0AhwBmAGZAZgDcwHv\n        AfQCAAH/AfQB7AMVAW0B7wH/FQAE/wEAAf8B7AMSAQcB/wIAAf8BvAHtAfIB9AHtAQcB/wMAAfIC6wHs\n        Ae0B8wH/FwAB/wHwAUQCCwEVAbwB/wUAAW4FRgNHARcBlAEHAfQEAAH/AQcDRQHtAfMB/xgAAUMBEwES\n        AhMDEgJtA+wC6wLtAuwB6wHsAfcB7QHsAu0B8hsAAZIBEQEQAREBEAFDAe0B9AIAAfMB7AFzAhwBmQF4\n        AXMBHAHvAfMB/wEAAfQBkgETAxQBcwHxGwAB/wHvBG0B8wIAAf8B9wHtAfAB8gHtAQcB8wIAAf8B7AHt\n        AfcBBwG8AfQB/xgAAfQB6wILAUMB6wHzAf8EAAFuBUYCRwFGARcBlAEHAfQDAAH/AfMBbgJGAW8B7wL/\n        GAABQwUTARIBEwESA+oC6wHtAZgB9wGSAe0DmAGSA+wB8RsAAfIBEQQQAUMB7AHzAf8B8wHsAnMBHAKZ\n        ARwBmQEHAfQB/wH0Ae0BEgJKARQBSgHtAfQbAAH/AfMB7AJtAeoB7AH/AQAB9AH3AZIB8AHyAe0BBwHy\n        AgABvAL3AQcBvAHxAv8YAAH/Ae8BEQILAUQB9wH/BAABbgHpB0YBFwGUAQcB9AH/AgAB/wHvAkYBaQGT\n        AfEB/xkAAUMDEwEUARMB6gETARIC6gFtAusC7QGSAfcB7QGYAQgBmAH3A+0B8RsAAf8B6wYRARIBvAHz\n        ARwB6wFzARwDmQEIAbwB9AHwAW0FSgEcAQcB/xwAAf8BvAHqARIB6gETAe8BvAHvAewB9wHwAfIBkgHv\n        AZIBvAEHAe0C7wEHAbwB9AH/GgAB8wFtAgsBEQESAbwB/wMAAW4C6QVGAUcBFwGUAQcB8wH/AQAB/wHw\n        AUUBRgEXAW8B7wH0Af8ZAAERARQBEgMTARQEbQLsAZIB7ALtAZIB7QGYAggB8AKYAfcB8RwAAfMBQwYQ\n        AREBbQHtAesCcwKZARoBvAHvAewBbQFzAesDSgFzAe8B/x4AAfQB7QESAeoBbQITARIB6wGSAfAB8gHs\n        AfcB7ALrAfcBBwG8AfAB8gH/HAABBwFDAgsBEQESAbwC/wEAAeoCRQVGAUcB4wGUAQcB9AL/AfABbgEX\n        AeMBFgHvAfIB/xoAARUBFAISARMBEgETARIBbQHrAuwB7wEHAewBkgL3AZgECAGYAQcB9wHyHQAB7wFD\n        AhECEAERAUMBFQFDARICcwGZAZ8BGgGZARwBmQEcAnMCcgFzAQcB8QH/HgAB/wHwAewBbQXrAe0B8AHy\n        AesB7AGSAfcB7wH3AQcB8gG8AfQB/xwAAf8B7QILAhEBEgEHAfQB/wHqAkUB6QVGARcBlAEHAfMB9AG8\n        AW4BFwHjARYBkwG8Av8aAAEUARMBEgHqAxIBbQHrAm0B7AHwAfEB7AL3AZIBmATCAggB7wHxHQAB9AHs\n        ARUBEQEQARECQwEVARQBSgFtAXMBHAGZAsMBoAKZAhwBcwEcAZkBvAH0IAAB9AHvA+0B7AHrAW0B7QHw\n        AfIB6wHtAQcCvAHwAfIBvAHzAf8eAAH0AewBEQELAhEBFAHtAfEBEgEjAUQBRQHpAkYBJQFGARcBlAHv\n        AbwB7wFuARcBFgGUAQcBvAH0Af8bAAEUARMBEgHqARIC6gHrAewB6wFtAeoBbQHsAesCmAH3AZgGwgHv\n        AfEB/xwAAf8B8wHtARQCEQFDAhUBFAFKAW0BcwEcAZkBGgKgARoEmQEIAbwB8wH/IQAB8wHwA7wB7QHr\n        Ae0B8AHyAesB9wG8AfAD8QHyAv8fAAH0AewCIgELASIBQwESAUMCHgFEAUUB6QIlAkYBbwJuAUYB4wEW\n        AZQBGgG8AfMC/xsAARQBEwESBOoE6wHsAm0B7AH3ApgBCALCARsCCAHxAQcB8QH/HQAB/wHyAZIBSgEU\n        AhUBFAJKAXIBcwEcApkDoAGZAZ8BGgEbAfAB8wL/IQAC/wL0AfMB9wHrAe0B8AHyAW0BkgEHAfAB8wL0\n        Av8hAAH0AZIBQwYLAh4CAQHpBUYBFwHjARYBlAEaAbwB8wL/HAABFQMSAuoB6wTsAe0C7AHtAfcBmAII\n        AsIDCAEbAQcB8QH/HQAC/wHzAQcB7ARKAXICcwIcApkCnwGZAcMB8AHxAfMC/yQAAv8B9AHtAW0B7AHw\n        AfIBbQHtAe8B8AT/IgAC/wEHAUQCEQQLAh4BPgEBAUUDRgHjARYBlAG9AvAB8wL/HQABFAESAuoCEgHr\n        BuwC7QKYAQgBwgIIA8IB8wHvAfIgAAH/AfQB8QEHAhwCcwMcA5kBGgEbAfIBvAHyAfQC/ycAAfMB6wFt\n        AewB8AHyAW0B7AGSAbwB/ygAAfMB7QFEAwsERAJFAUYBbwEWAZQBvQEbAbwB8AHzAv8eAAETAm0C6gES\n        AW0C7APtAewB7QH3AZgECAHCAfMCwgHzAe8B8iIAAf8B9AHyAbwB8AYbAfQB8AG8AfMB9AL/KQAB9AEH\n        ArwC8wEHArwB8gH/KQAB/wHyAfcBbQESA0QB6gJuApMBBwK8AfAB8gH0Av8fAAH3AwcD7wO8AfAB8QHw\n        AfID8wj0AbwB8yQAAf8C9AHzBPEB8gHzAvQC/ysABf8BAAH/AfQD/ysAAf8B9AHxAbwD7wIHArwB8QHy\n        AfMB9AL/KAAC/xD0Av8lAAv/MwAD/y4ABv8E9AT/KwAS/5gACP//AP8A/wD/AIEABP8BAAb/AgAF/wMA\n        Bv8DAA3/tQAB8wHwAfEC/wH0AfEDvAH/AgAB8wHwAQcB8AH/AwAB/wHxArwB8gH/AgAB/wHzAfIB/wHy\n        AfAB9AH/AfEE8AHyAv9FAAH0AfMB9AL/AfQE8wH0BP8B9AHzAvQB8wH/AQAB/wH0AfMB9ALzAfQC/wP0\n        AvMD/wHzAf9FAAHxAbwB8AH/AfQB8AEHAfEBBwHvAf8CAAHyAQcBvAEHAfMB/wIAAfMB8QIHAfAB/wEA\n        Af8B9AG8Ae8B9AHxAfcB8wH/AQcB7wLzAfECBwH/RAAB/wG8Ae8B8QH/AfQBBwHvAgcB7wHzAfQB7wH0\n        AfMBBwHvAbwBBwHvAfMB/wH0AQcB7wHwAQcB7wHwAf8B8QHvArwC7wL0AgcB/wsABf8BAAf/AQAT/wEA\n        Bv8BAAj/CQAB8wHwAfEB8gK8AfMB/wG8Ae8B/wIAAfMB7wHyAfAB8QH/AgAB8AEHAfIBBwHxAf8BAAH0\n        AfABBwHvAf8B8wH3AfQBAAG8AQcB/wEAAf8B8gEHAbwB/0MAAf8B9AEHAfEC/wEHAZIB9AHxAbwB/wG8\n        AgcB9AG8AQcB8wHxAZIB9AH/AfQB7wHwAf8BvAHvAfMB9AHvAfAB9AHzAfAB7wH/AbwB7wHzAf8LAAH/\n        AfEBBwHwAv8B8wG8AfEBBwHvAfAB/wEAAf8B8AIHAfQB8wEHAbwB9AHwAgcBvAHyAfQB8QEHAfAC/wHz\n        AbwB8AIHAfQB/wH0AbwB8QHwAgcB9AH/CQAB9AEHAfcC8AH0Af8BAAEHAfcB9AL/AfMB7wHzAfQBBwHz\n        Af8B9AHyAQcB/wEHAfIB/wH0AfAB7wG8AQcB/wHzAfcB9AEAArwB/wIAAf8BvAGSAfQLABH/AQAE/wEA\n        E/8PAAH/AgcB8wHwAbwB8QH/AfIBvAHzAbwB7wGSAfMCvAH0Af8CBwH0AfEB7wHyAf8BvAHvAfIBvAEH\n        AfMBAAH0AbwB7wHyAfcB8gH/DQAB8wHvAv8B9AIHAfQB8AEHAfQD/wHyAbwB8AH0AQcBvAH0AfICvAH/\n        AfQB8AH0AfMB7wL/AfQCBwH0AfAB8wEAAf8B8AEHA/IB8AH/CgAB8wH0AfMBBwH/AwABBwHvAfcCBwLv\n        AfMB/wEHA/cB7wHzAf8BBwHxAfQB8AEHAf8B8QHvAf8B8wH3AfQBAAK8Af8DAAIHAfMLAAHxBuwB8gH0\n        Ae0F7AHwAf8BAAHyAe0BBwH/AQAB/wEHBewBBwHyAfcBBwHxBuwB8QH/DgAB/wHzAe8B9wHvAfcC/wHz\n        AwcB8wMHAbwB9AEAAfAB7QHvAfcBvAH0AQABvAHvAvcBvAH/AQAB9AG8AewB9wEHAfMB/w0AAfQBBwH/\n        AfQBBwG8AQcB9AHwAe8B9AHyAbwB8wHyAbwB8AEHAbwB8wH/AfEB7wH0AQAB/wHzAfIB9AEHAf8B9AEH\n        AbwBBwH0AbwB9AH/AfABvAEHAfIB8wHyAfAB/woAAfMBvAIHAfMB/wIAAQcB7wHyAvMB8AHvAfMB/wHz\n        AQcC8AEHAv8CBwG8AQcB8wEAAfEBBwH/AfMB9wH0AQABvAEHAf8DAAIHAfQLAAEHAu8CBwLvAQcBvAH3\n        Au8DBwHxAf8BAAHxAu8B/wEAAfQB7wUHAbwB8QHvAQcBvAYHAe8B/w8AAfQBBwK8AQcC/wHzAe8CBwH/\n        AfIC7wEHAfQBAAH0Ae8B8QHvAfAB/wEAAbwBBwLwAfcB8QH/AfQB8AHvAfEB7wEHAf8NAAH0AQcB9AEH\n        AbwB8AG8AfQB8AHvAfQB8wHyAfQB8wG8Ae8BBwHyAf8BAAHxAe8B9AIAAfMB8gH0AQcB9AEHAbwB8AG8\n        AfQBvAHzAfEBvAHxAfAB8gHzAfIB8AH/CgAB8wG8AfEB8AEHAfMB/wEAAbwB7wH/AgAB8wEHAfEBAAH/\n        AbwCBwHzAQAB/wEHAe8BvAHyAf8BAAHwAe8B/wHzAfcB9AEAAbwBBwH/AQAC/wG8AQcB/wsAAQcC7wHz\n        AfQBBwHvAQcBvAL3BAcB8wH/AQAB8QLvAf8BAAH0Ae8B9wHvAwcB8QHyAe8BBwH0AbwDBwLvAQcB/w8A\n        Af8B8QH3Ae8B8gEAAf8B9AH3Ae8B8gL/AQcB9wEHAfQCAAEHAe8BBwHzAgABvAHvAvQB7wEHAf8B9AG8\n        Ae8B/wHxAfcB8w0AAfQCBwG8AfIB9AHwAfQB8AHvAfQDAAHzAbwCBwHzAf8BAAHxAe8B9AIAAfMB8QHz\n        AgcBvAHyAfQB8AH0A7wB8QH/AfEB8gHzAfIB8AH/CgAB8gG8AfAB/wHwAQcB8wH/AbwB9wH0AgAB8QG8\n        AfAC/wHyAgcB/wEAAf8BBwHwAfEC/wEAAbwB7wH0AfMB9wHzAf8BvAEHAfQB/wH0AfEB8AHzAf8LAAEH\n        AfcBBwH/AQABvAH3AQcBvAHvAZID7QGSAfAB/wEAAfEC7wH/AQAB9AHvAfcE7QEHAfEB7wEHAfIE7QH3\n        Ae8B8AH/DwAB/wHzAQcB7wH0AQAB/wHzAe8BBwH0AgAB8gHvAQcB9AH/AQAB8gHvAQcB/wIAAQcB7wHy\n        AfMB7wHwAf8B8wHwAe8B9AG8AQcB9AwAAf8B8wEHAbwB8gH/AfQBBwHzAbwB7wHzAf8BAAH/AfICvAHy\n        AbwB8gH/AfAB7wHzAv8B8gHwAfIBBwG8AfIB/wH0AQcB8wK8AfAC/wHwA/IBvAH/CgAD8AH/AfQCvAHz\n        AfABBwH0AQAB/wHxAvAB/wEAAfQBvAHyAf8BAAH/AfAB8wH/AwABvAEHAfMB8QHvAvMB8AEHAvEC8AHz\n        Af8MAAEHAfcB7wL0AQcB9wEHAbwB9wHvBAcB8gH/AfQBvALvAvQB8wLvBAcB8QHyAe8CBwLvAQcDvAHz\n        Af8QAAH/AfAB8QH/AQAB/wG8AQcB8gH/AgAB/wG8AQcB8QH/AQAB/wG8AfEB/wEAAfQCBwHvAQcBvAH0\n        Af8BvAHwAfcCBwHyAf8MAAH/AfABvAHyAv8B8QEHAfABvAEHAfEB/wEAAf8B8AG8AQcB8wEHAbwB8QG8\n        AQcB8AH/AfMEvAHyAv8B8QEHA7wC/wHzAbwB8AG8AfABBwH0Af8JAAH/AfQE/wH0Af8C9AH/AQAC/wH0\n        Av8BAAH/AfQC/wEABP8DAAL0Af8C9AL/BfQC/w0AAQcB9wHtAvcBkgH3AQcBvAH3AZIE9wG8AQcC9wHv\n        AZIB9wHvAbwC9wGSA/cBvAHxAe8CBwHvAfcBkgL3Ae8BvAH/EAAE/wEAAf8C9AH/AwAC/wH0Av8CAAH0\n        Af8CAAH/BPQD/wT0Av8NAAT/AQAI/wEAEv8BAAb/AQAI/x0AAv8kAAEHBu8B8wHyBu8B8AfvAfAG7wG8\n        AfIB7wHwAfMBBwPvAgcBvAH/xgAB/wX0Af8yAAb/ZgAE/wEACv9iAAL/AfQB8wTyAfMB9AL/XAAD/wMA\n        Af8B9ALzAfQB/wH0A/MB9AH/AfQC8wH0Af8DAAP/WQAB/wHzAfAB7wHsAW0BEgFKARMBEgFtAewB7wHw\n        AfMB/y0AB/8lAAH/AfMB8QH/AwAB8wHsAm0B9wHxAfcD6wHvAQcB6wHqAW0BBwH/AwAB8wHyAv9VAAL/\n        AfIB7wHsAkoBRAYjASIBFQFEAesB7wHyAf8oAAP/AfMB8gG8AQcBvAHxAfMB9AL/IQAB/wHzAQcB8AH/\n        AwAB8QNEAewB7wFuAUoCRAHsAe0CEAFEAe0B/wMAAfMB7AHvAfQB/yIAA/8FAAP/JgAB/wH0AQcBcwVL\n        ASkCSgcjARUBbQHvAfQB/yUAAf8B8wEHAewB6wVKAW0B7AHvAfEB9AH/HgAB/wH0AQcB7wH0Af8DAAHx\n        AUoBRAFKAe0B7wFuAUsBRQFEAewB7QIRAUQB7QH/AwAB/wGSARQB7wH/IQAB/wHxAe8B8wH/AwAB/wHy\n        Ae8B8gH/JAAB/wHzARwBdARSAnQBcwEcAUsCcwJKAUQDIwFEARUB7AHzAf8iAAH/AfMBkgJKAUsCSgFE\n        AkoFRAHsAfAC/xwAAf8BBwG8AQcB/wQAAfEDSwEcAe8CdAFLAUQB7AHtAUMBRAFFAe0B/wQAAfIBQwES\n        AfAB/yAAAfIBEwEVAe0B8wH/AQAB/wHzAW0BQwHsAfIB/yIAAf8B8wFuAVIDegEaArwBmQFzAfABSwFt\n        AfMCcwEcAXMBSgIjAUQBIgFtAfMB/yAAAf8BvAFKAksBUQFzA0sCSgFLAUoBRAMjAUQB9wH0Af8aAAH/\n        AfEBBwHwAbwB/wQAAfEDSwEcAe8CdAJLAewB7QJEAUsB7QH/BAAB/wIVAewB9AH/HgAB9AEUAREBQwEV\n        Ae0B9AEAAfQB6gIRARAB7AHzAf8gAAH/AfMBbgFSAVkBegGgAfAB8QL/AZkBcwHwAUsB6wHzAXMBHAL0\n        AbwBdAFKA0QBbQHzAf8dAAH/AfQB7wFRAVIDdAGTAZkBHAJLAVECmQF0AUsBSgIjAUQB7QHyAf8ZAAH0\n        Ae8CBwHyAf8EAAHxA24BHAHvAnQBTAFLAewB7QJEAeoB9wH/BQAB7AEVAeoBBwH/HAAB/wHzARMBFAHq\n        ARIBFAEVAZIB8gHqARUBEwESAUMBEAHsAfIB/x4AAf8B9AFzAVIBegGaARoB8AHzAf8BAAH/AZkBcwHw\n        AVEB6wHzAW4BHAH0AgAB8wGZAUsBSgFEASIB6wH0HAAB/wH0AZkBdAJ5ApkBGgHwAfEB8AJLAXQBvAH0\n        AfIBGgEcAUsBSgJEAe0B8wH/FwAB/wHxAW4CBwHzAf8EAAHyAXMCbgHvAbwCdAFvAUsB7QHvAm0B6wG8\n        Af8FAAHvAUMBFQGSAfQB/xoAAf8B8gESARMB7QG8AQcB6wEUARUCFAHrAe8BBwHrARUBEQHsAfIB/x0A\n        Af8BHAFSAXoBoAEaAfAB8wH/AgAB/wGZAXMB8AFLAesB8wFuARwB9AMAAfQBmQFLAUQBIwEVAZIB/xsA\n        Af8BBwF0AnoCGgHxAfIC9AHyAUsBSgFzAfAB/wEAAf8B9AEbARwBSwFEAUoB9wH0FwAB/wEHAUoBHAHv\n        AfMB/wQAAfQBvAIHAfEB8AN0AW4BkgHwAwcB8wH/BQABvAFDARUB6wHyAf8ZAAH/AfEBbQETAfcBvAHy\n        AfMBBwFtARQBFQESAe8B8QH0AfAB6wEVAREB7AHyAf8bAAH/AbwBUgF6AZoBGgHwAfQC/wIAAf8BmQFz\n        AfABSwHrAfMBbgEcAfQDAAH/AfQBHAFKAUQBIwEUAfAB/xkAAf8BvAF0AXoBmgHDAfAB8QHzA/8B8wFL\n        AUoBcwHwAf8EAAH0AZkBSwJKAbwB/xYAAfQB7AFKAe0B9wHxBvMD8QHyAbwBkwF6AXQBbwHsBPEH8wEH\n        AREBQwESAbwB/xgAAf8B8QFtARMB9wG8AfMC/wHwAW0CFAESAe0B8gL/AfEB6wJDAewB8gH/GgAB8wFz\n        AVIBegGgAbwB9AL/AwAB/wGZARwB8AFLAewB8wFuARwB9AQAAf8B8wFzAUQCIwHrAfQZAAHzAUsBdAF6\n        AcMB8AHyAfQD/wEAAfMBSwFKAXMB8AH/BAAB/wH0AbwBSwFKAewB9BYAAfMBEgFEAuoF6wbsAXMBmQGa\n        AXUBdAFLAusBbgXrA20BEwEQAREBFAHvAf8XAAH/AfIBbQEUAe0BvAHzAv8B8wHtAeoB7AFtARQBEwHt\n        AfMC/wHyAesBEQFDAewB8gH/GQABBwFRAVIBegEHAfMD/wMAAf8BvAEcAfABcwHsAfMB6wEcAfQDAAP/\n        AbwBSgEjAUQBSgG8GAAB/wHtAUsBdAGaARoB8QH0Av8BAAL/AfABSwFKAUsB8AH/BQAB/wH2AZkCSgHx\n        Af8UAAH/AfIBQwEVA0QCSgJLBHQBeQKZApoBegN0AkwDSwFKAUQBFAEVAUMDEQEUAfcB/xcAAfQC7AHv\n        AbwB8wL/AfQB7AHrAfcBBwG8AW0CFAGSAfMC/wHyAewBbQHqAfcB9BgAAfQBcwFLAVIBegG8Av8B8gH0\n        AwAB/wG8ARwB8AFzAewB8wHrARwB9AMAAfQB8AL/AXMDRAHtAf8XAAHzAUsCdAGZAfEB9AH/AgAB/wHz\n        AewDRAFuAfAB/wcAAfMBbgFEAe8B/xQAAf8B8QERBUQBSgFLAW4CdAOaAxoBmgF6BXQBTANLAUQCFAEV\n        AkMBEQEVAe0B9BcAAfQD8wH0Af8BAAH0AuwB7wEHAfIB9AG8AeoCFQGSAfQBAAH/AfQD8gH/GAAB8gNL\n        ARwB9AH/AfIBBwH/AwAB/wGZARwB8AFzAesB8wFzARwB9AMAAf8B9wG8Af8BvAFKAkQB6wHzFgAB/wHv\n        AksBdAEaAfME/wHxAXMBUQNLAW4B8QH/BwAB/wGZAUoB7AH/EwAC/wHwAeoBbgLsAW4CcwEcAZMCmQQa\n        AsMBGgWaAZMDdAFzAW4BbQHqAhICEwHqAZIB9AL/FAAH/wEAAbwC7AGSAQcB8wH/AfQB7AEUARMB7AHz\n        Af8BAAX/FwAB/wG8AUoBSwFSAfcB/wH0ARwBvAH/AwAB/wGZARwBBwFRAW4BvAFuARwB9AMAAf8BBwHs\n        AvQBSgFEAkoB8AH/FQAB/wFuAUsBUQGZAfAE/wHzAXQCeQJ0AXMBdAHyAf8IAAHzAW4BSgH0EgAB/wHz\n        AfIBBwHsAe0FHAGTAe8CBwm8AgcEmQKTAhwC7QTsAfcB8QHyAfQVAAH0AwcB8QL/AfQBBwH3AewB6wEH\n        AfQB9wEVARIB9wHxA/8B8QIHAfAB/xcAAf8B7wFEAUsBdAHwAQAB9AFzAQcB/wIAAf8B9AGZAXMBbgFS\n        AUsCSgHtAfIB/wIAAf8BBwFtAfIB/wFzAUQCSgEHAf8VAAHzAksBUQGZAfIE/wGZAXoCmgEaAfEC8gH/\n        CQAB/wEcAUoB8xIAAf8B7AESB+oCbQHrAewBcwLsBO0B7AJzAuwBcwRuAusDbQXqARIB6gG8FQAB8wHs\n        ARABEQFtAfAC/wHzAQcB7QHrAW0B7AEUAeoB9wHxAfQC/wEHAUMBEQFtAbwB/xcAAf8BHAFKAUsBcwH0\n        AQAB8wFRAXMB8wL/AfIBHAF0AVIBdAJSAksBSgHsAbwB/wEAAfYB6wFtAfEB/wEHA0oB7wH/FQAB8AJL\n        AVEBmQH0Af8BAAH/AfIBmgGgAZoBGgHyAfQC8AHzAf8JAAHwAW4B8xIAAf8BQwEVBUMCFQEUAUQBSgFu\n        A3QFmQZ0AW8BbgJLAUoBRAEUAhUBQwERAUMBEQFDARMBBxUAAf8B8wHsAkMBbQG8Av8B8wG8AfcB7AFt\n        AesB7wHxAfQC/wHvAUMBFQHsAbwB9AH/FwAB9AEcAUoBSwFuAfQBAAH0AXMBSwHvAf8BvAF0AXkBegKa\n        ApkBeQFRAUsCSgHvAf8BBwFKARwB8wH/AbwDSgHvAf8VAAG8AkoBSwGZAf8BAAL/AbwBoAF6AZkB8AH0\n        AbwBcwFLAe8B/wkAAfQBcwH0EgAB/wMVAkMDFQNEAUsBbgN0BZoBmQF5BXQBbwFMAksBSgJEARUEQwEV\n        AeoB8BYAAf8B8wHsAhUBbQG8Av8B8gHtAesC7AHvAfMC/wHvAUMBFQHsAbwB9AH/GAAB9AEcAkoBbQH/\n        AQAB9AGZAXQB7wEHAXQBegEaAfABvAHxA/IBBwEcAUsBSgFEAe8BSgFuAbwB/wEAAfEDSgHvAf8VAAEH\n        AUoBRAFLAQcB/wEAAv8BmQGgAXoBmQHwAf8BGgF5AVEBHAH0CQAB/wHvAf8TAAESAxUBFAETAhIC6gFt\n        AW4BdAKTC5kBkwR0Am4CSgEUBBUBFAFtAfIXAAH/AfMB7AEUARMB6wHwAfMB9wHtAe8B7QLrAQcB9AHv\n        AhQB7AG8AfQC/xgAAfQBHAIjAeoB/wEAAf8B8gEcAbwBcwF6ARoB8AH0BP8CAAH/AbwBcwFLARUB9wGZ\n        AfIB/wEAAfADSgEHAf8VAAEHAUoBRAFLAe8B/wEAAv8BvAGgAXoBeQG8Af8BvAGaAZkBvAH/CQAC/xQA\n        AewBQwIVARQB6gHtAu8DBwG8AxoC8QEaBJkB8QHwBBoBvAEHApkCHAHsARQCFQEUAUoB6wH0GQAB9AHs\n        ARQBEwFtAesB7AHvAfEBvAH3AesBbQHqARUBFAHtAbwC/xoAAfQBHANKAfMCAAH/AfQB7wF0AZkBvALv\n        AfAB8wL0AfMB8gEHAe8B7QJLAewB8gH/AgABBwFLAkoBBwH/FQABvAJEAUoBHAH0AQAC/wHwAaACegGZ\n        AfIB/wLyAv8IAAL/FQABBwRDARIBkgH0Bf8F9AHzApkCGgEHAfIF8wT0Af8B8QIVAkQBbgGSAf8aAAH0\n        AewBFAESAesB7QHwAfEB8wG8AZIBbQESARMB7AG8A/8aAAH/Ae8BRAJKAbwDAAH/ARwBdAEHARwBdAFR\n        A0sBbgJLAlEB7AEcAUsB7AH/AwABHANLAbwB/xUAAfIBSgEjAUQBbgHyA/8B8gEaAnoBeQGZAbwC8gHz\n        Av8HAAL/FQAB9AEVA0MBFAHsAf8KAAH0Ae8BmQEaAfIBvAH0Cf8BAAHxARUCRAFKAXMBvAH/GwAB8wEU\n        ARIB7QG8AfEC9AHzAQcB7QJtAZIB9AL/GwAB/wEHAkQBSgHsAf8CAAH0AXMB7QHzARwBmQGaBHoBoAKa\n        AZkBBwHyAVEB7QH/AgAB/wFuAksBcwHxFgAB9AFLAiMBSgG8Af8BAAH/AfQBvAGaAXkBegGaAZkBHAGZ\n        AfAC/x8AAesDQwEVAesB/wkAAf8B9AEHARoC8wG8AfQB/wkAAbwCRAFKAW4BHAHyGwAB/wHvARQB6wEH\n        AfEB9AP/AfMBBwHsAW0B6gEHAfQB/xwAAfEBSgJEARMB8wIAAfQBcwH3Af8B9AIbAhoBoAGZAbwB8ALy\n        AfQB/wFzARwB/wEAAf8B8QJLAVEBmQH0FgAB/wHsAkQBSgHtAfQD/wHyAfABGgN6AaABGwHwAv8FAAL/\n        GAAB8AEVA0MBEgHzCQAB/wH0AbwB8ALxAfAB9AH/CQAB9wFEAUoBbgEcAQcB9BoAAf8B9wERARIB7wHx\n        AfQC/wEAAv8B8wEHAewBEgHqAQcB9AH/GwAB9AFzAkQBIwHvAf8BAAH/ARwB7wEAA/8B9AHzAXoBcwHz\n        AvQC/wEAARwBBwH/AQAB/wEcAlEBdAEHAf8XAAG8AUQCIwFKAbwD/wH0AfIBvAEaAZoBeQF6ARoB8AL/\n        BAAE/xcAAfQB6wFDAhEBFQHwCQAC/wH0A/IB8wH/CQAB/wHrAUsBbgF0AQcB8AH/GQAB/wH3AUMBFQH3\n        AfEB9AL/AwAC/wHzAQcB6wHqAW0BBwH0Af8aAAH/Ae8BSgFEASMBSgHyAgAB8AEHAf8DAAH/AfQBeQHs\n        BP8BAAH/AZkB8gL/AfEBcwFSAXQBmQHyAf8XAAH/AUoBRAEjAUQB7AHzA/8B9AHzAfEBvAF0AXkBmgHw\n        Av8EAAX/FgAB/wG8ARQCEQEVAfcB/wkABv8KAAH0AW4CdAGZAQcB8wH/GAAB/wHvAUMBEAESAQcB9AL/\n        BQAC/wH0AZIC6wHtAfEB/xsAAfIBcwFKAUQBIwHsAfQBAAH/AfAB/wQAAfQBdAHrAf8EAAHzAbwC/wH0\n        ARwCdAGZAe8B/xkAAbwERAGSAfQBAAP/AfQB8AF0AVIBmQHxAv8DAAH/AfIB9wEHAfQC/xYAAfQB7AFD\n        AhEB6gH0GQABvAJ0AZkBBwHwAfQB/xgAAf8B8AETAREBQwHrAfIB/wcAAf8B8QFtAesB9wHwAfQB/xsA\n        Af8B7wFKA0QB7wP/BQAB9AF5AesB/wQAA/8B9AEHAXkBegF5ARoB8gH/GgAB7AFKA0QBkgHzBP8B8gFz\n        AVEBeQHwAv8BAAL/AbwDSwG8Av8WAAH/AfIBEgIRAUMBvAH/FwAB/wHtAZMBmQK8AfMB/xoAAf8B8AES\n        AREBQwHsAfIB/wUAAf8B8QLrAe8B8QHzAv8cAAH0AXMCSgFEARQB7wH0Af8FAAH0AXQB6wH/BQAB/wH0\n        AbwBmQKaARoBvAH/GwAB8wFzAUoDRAHsAfAB9AL/AfIBSwFRAXkBvAP/AfMB7wFRAlIBdAG8Af8YAAH/\n        AQcBEwIRAewB9AH/FQAB/wHxARwBmQK8AfIC/xsAAf8B8AESAUMBFQHsAfIB/wMAAf8B8QLrAe8B8AHz\n        Av8eAAHyAUsCSgJEAfcB8wH/BAAB9AF0AesB/wMAAv8B8wEHAZkDoAG8AfQcAAH/AfEBcwFLAkoBRAFt\n        ARwB8AHzAfECSwF5AbwB9AHyAQcBcwFSA3kBmQHzAf8ZAAH/Ae8BFAERARUBBwH/FAAB/wH0Ae8BmQEa\n        AbwB8QH0Af8dAAH/AfAB6gFDARUB7AHyAf8BAAH/AfEBbQESAfcB8AHyAv8fAAH/AfABcwJKAkQB6wEH\n        AfQB/wIAAfQBdAHrAf8CAAH/AfQBvAKZAqABGgG8AfMB/x0AAf8B8gEcAXMBSwRKAuwCSwFRAewBHAFz\n        AVIBeQJ6AZoBGgHxAv8aAAH0Ae8BFAFDAW0B8QH/EgAC/wG8AQcBGgG8AfEB9AH/HwAB/wHwAW0BQwEV\n        AZIB/wEAAfQB6gEUAe0BvAHzAv8hAAH/AfABcwNKAkQB6wHvAfEB9AHzAXQB6wLzAfEB7wEcAXkBmgKg\n        ARoBvAHyAf8eAAL/AfMBvAF0AXMBSwRKBEsBUQFSAXQBeQGaARoB8AHxAfQC/xsAAf8BBwFKARUB7AHz\n        Af8QAAL/AfEB7wHwAbwB8QH0Av8gAAH/AfEB6gFDAewB9AEAAfEBFQHsAbwB8gL/IwAB/wHyARwBSwZK\n        ARIB6gFLA0oBUQFSAXoDoAEaAbwB8wL/HwAC/wH0AbwBmQF0AVEFSwFSAnQBeQGaARoBGwG8AfIB9AL/\n        HQAB/wHxAewBEwHtAfMB/w8AAf8B8QHvArwB8gL/IwAB/wHwAW0B7AH0Af8B8QHrAQcB8gL/JQAB/wH0\n        AQcBcwFLAkoESwFSAXQEUgJ6AaABGwHwAfQC/yIAAv8B8wG8ARoBmgF5A3QBmQGaARoBwwEbAbwB8gHz\n        AfQC/x8AAf8B9AH3ARIB7AHyAf8NAAH/AfABHAG8AfAB9AH/JgAB/wHwAe8B9AH/AfIBBwHzAv8oAAH/\n        AfIBBwFzBksCUgJ0AnkBmQG8AfMB9AH/JQAC/wH0AfMB8QTwAfEC8AHxAfMC9AP/IgAB/wHyAfcB7wHx\n        Af8KAAH/AfQCBwHwAfQC/ygAAf8B9AL/AfQD/ysAAf8B8wHwAZkCHAFzAnQBHAKZARoB8AHzA/8oAAT/\n        B/QD/ycAAf8B8wHxAfQB/wkAAf8C8gP/LAAD/zAAAv8B8wXyAfMB9AP/LAAL/zgAAv9kAAj//wD/AP8A\n        YwABQgFNAT4HAAE+AwABKAMAAeADAAHgAwABAQEAAQEFAAGAARgWAAP//wD/AP8A/wD/AP8AJwAB/wEE\n        AUwB/AHZAQwBfxb/AgABMAIAAT8O/wH4BQABAQH/AgABMAIAAT8O/wHwBQABAQH/AgABMAIAAT8O/wHw\n        BQABAQH/AgABeAIAAX8O/wHwAgABCAEAAQgBAwH/AgABCAIAAX8B4AMAASABggEhB/8B4AIAAQgBBAEI\n        AQMB/wUAAX8B4AUAAQEH/wHgBQABAwH/BQABfwHgAwABEAEAAQcB+AEAAQQCGAEgAQ8BwAUAAQMB/wIA\n        AXgCAAE/AeABAgIAARABMAEHAfgCAAEIARABAAEHAcACAAFAAgABBwH/AgABcAIAAT8B8AECAgABEAEw\n        AQcB+AIAAQgCAAEHCP8CAAFwAgABPwHgBQABBwH8AgABCAEgAQABHw7/AeAFAAEHAfwCAAGMAQEBAAE/\n        Dv8B4AUAAQ8B/AIAAYwBAQEAAT8V/wH8AgABgAEBAQABPwL/Af4BAAE/BP8B+AEAAT8J/wH4BQABPwL/\n        AeABAAEHBP8BwAEAAQcJ/wH4BQABPwL/AYABAAEBBP8BgAEAAQEJ/wH4BQABfwL/AwAD/wH+AwAF/wGI\n        C/8B/gMAAT8C/wH+AwABPwL/AfwB/gEIAR8Bnwn/AfwDAAE/Av8B/AMAAT8C/wH8AXgBCAEPAR8J/wH4\n        AwABHwL/AfgDAAEfAv8B/AEwAQgBBwEfCf8B8AEAARABAAEPAv8B8AMAAQ8C/wH8AwABHwn/AfABAAF4\n        AQABBwL/AeADAAEHAv8B9AMAATcE/wHwAT8D/wHgAQEB/AEAAQcC/wHgAwABAwL/AeADAAEjA/8BgQGA\n        AQcD/wHgAQMB/gEAAQMC/wHAAwABAwL/AeADAAEDA/8CAAEBA/8BwAEHAf8BAAEDAv8BwAMAAQEC/wHg\n        AwABAwL/AfADAAP/AcABDwH/AQABAQL/AYADAAEBAv8B8AMAAQcC/wHwAwABfwL/AcABHwH/AQABAQL/\n        AYADAAEBAv8B8AEGAQABGAEHAv8B8AIAAXABPwL/AYABfwH/AYABAQL/AYAEAAL/AfABBgEAARgBBwL/\n        AfwCAAEEAT8C/wGAAR8B/wEAAQEC/wGABAAC/wHwAQ4BAAEYAQ8C/wH+AgABAQP/AYABHwH+AQABAQL/\n        AYAEAAL/AfgBDwEAARgBHwP/AgABAQP/AYABDwH+AQABAQL/BQABfwH/Af4BDwEAATgBPwL/Af4CAAEB\n        A/8BgAEHAfgBAAEBAv8FAAF/Af8B/gEPAQABOAE/Av8B/gIAATsD/wGAAQcB+AEAAQEC/wUAAX8B/wH+\n        AQ8BAAE4AT8C/wH8AQABAQT/AYABgQHgAQABAQL/BQABfwH/Af4BBwEAATABPwL/AfwBAAEHBP8BgAMA\n        AQEC/wUAAX8C/wEHAQABMAF/Av8B/gEAAQME/wGAAUACAAEBAv8FAAF/Av8BAwEIASABfwL/Af4CAAFx\n        A/8BgAMAAQEC/wGABAABfwL/AYABCAEAAX8C/wH+AgABAQP/AcABIAIAAQEC/wGABAAD/wGAAQgBAAT/\n        AgABAQP/AcABEAIAAQEC/wGABAAD/wGAAQgBAAP/Af4CAAECAT8C/wHAARgCAAEBAv8BgAMAAQED/wHA\n        AQgBAQP/AfADAAE/Av8B4AEMAgABAwL/AcADAAEBA/8B4AEIAQMD/wHwAwABfwL/AfABBgEAARABAwL/\n        AcADAAEBA/8B+AEIAQ8D/wHwAwAD/wHwAQEBgAEAAQMC/wHgAwABAwP/AfwBCAEfA/8B/AIAAQED/wH4\n        AQABPAEAAQcC/wHwAwABAwT/AYgF/wIAAQMD/wH8AwABDwL/AfADAAEDBP8BiAX/AcABAAEHA/8B/gMA\n        AQ8C/wH4AwABBwT/AcgG/wHAAT8D/wH+AwABHwL/AfwDAAEPBP8ByQz/AwABPwL/Af4DAAEfBP8ByQz/\n        AeACAAT/AwABPwT/AckM/wHwAQABAQT/AYACAAE/Ef8B/AEAAQcE/wHAAgAT/wEAAR8E/wHgAQABARP/\n        AfAF/wH8AQABBxr/AQABHzr/Af4B+wEOAfcBHAHHAb8V/wH8AWABBAFEAQABAwEfD/8B+AHGAQgBiAGD\n        Af8B/AEgAQABQAEAAQMBHw//AeABAAEIAQABAQH/AfwCAAFAAgABHw//AcABAAEIAQABAQH/AfwDAAFA\n        AQABHwH/AQABgAEAARABIAF/Af8B4gFjAREBkwEnAv8BwAMAAQMB/wH+AQABYAEAAUABAAE/Af8DAAEQ\n        ASABfwH/AeABAgEBAQABAwL/AcADAAEPAv8BAAFgAQABQAEQAX8B/gEAAQYBMAEAASABfwH/AeABAgIA\n        AQMC/wHAAwABAwL/AQQBAAJAARABfwH+AQABBgEwAgABfwH/AeABAgIAAQMC/wHAAwABAwL/AQQBAAJA\n        ARgBfwH/AQIBBgEwAgABfwH/AeABAgIAAQMC/wHAAwABAwL/AQ4BBAJAATgBfwH/AQIBJgEwARABAAF/\n        Af8B4AECAQgBAAEDAv8BwAMAAQMC/wGfA/8B/Qn/AeADAAEDAv8BwAMAAQEQ/wHgAwABAwL/AcADAAEB\n        C/8B5wT/AeABIAEAASABAwv/AQEG/wGAE/8B4AEAAQ8E/wH8AQABHxL/AYABAAEDBP8B8AEAAQcL/wH+\n        AQgBfwT/AwAE/wHAAQABAQv/Af4BAAE/A/8B/gMAAX8C/wH+AwABfwT/AQABPwT/Af4BAAE/A/8B/AMA\n        AT8C/wH+AwABPwP/AfwBAAEfBP8B/gEAAX8D/wH4AwABPwL/Af4DAAE/A/8B8AEAAQcE/wH+AQABfwP/\n        AfABAAEPAcABHwL/Af4DAAE/A/8B4AEAAQEE/wHgAQABAwP/AeACAAEgAQ8C/wH+AwABPwP/AQIBAAEg\n        AX8D/wHAAQABAwP/AcACAAEQAQcC/wH+AwABPwP/AQYBAAEwAT8D/wHAAQABAQP/AcABBAEAARgBAwL/\n        Af4DAAE/Av8B/gEGAQABMAE/A/8BgAIAA/8BwAEMAQABHAEDAv8B/gEAAQgBAAE/Av8B/gEOAQABOAE/\n        A/8DAAP/AYABHAEAARwBAwL/Af4BAAEIAQABPwL/AfwBDgEAATwBHwP/AwABfwL/AYABPAEAAR4BAQL/\n        Af4BAAEIAQABPwL/AfwBHgEAATwBHwL/Af4BAwEAAcABfwL/AYABfAEAAR8BAQL/Af4BAAEIAQABPwL/\n        AfgBPgEAAT4BDwL/Af4BAwEAAeABPwL/AQAB/AEAAR8BAQL/Af4BAAEIAQABPwL/AfgBPgEAAT4BBwL/\n        AcABBwEAAeABAQL/AQAB/AEAAR8BgQL/Af4BAAEYAQABPwL/AfABPgEAAT4BBwL/AcABBwGJAeABAQL/\n        AQEB/AEAAR8BgQL/Af4BAAF/AQABPwL/AfABPwEAAT8BBwL/AcABAQGIAYABAQL/AQEB/AEAAR8BgAL/\n        Af4BAQH/AYABPwL/AfABPwEAAX8BBwL/AcACAAGAAQEC/wEBAfwBAAEfAYAC/wH+AQEBCAEAAT8C/wHw\n        AT8BgAF+AQcC/wHAAgABgAEBAv8BgQH8AQABHwGAAv8B/gEAAQgBAAE/Av8B8AE/AcEB/gEHAv8BwAIA\n        AYABAQL/AYEB/AEAAR8BgQL/Af4DAAE/Av8B8AEfAYAB/gEHAv8BwAIAAYABAQL/AYEB/AEAAR8BgQL/\n        Af4DAAE/Av8B8AEeAQABPAEHAv8BwAEBAQABgAEBAv8BgAH8AQABHwEBAv8B/gMAAT8C/wHwAQ4BAAE4\n        AQcC/wHAAQcBgAHgAQMC/wGAAfwBAAEfAQEC/wH+AwABPwL/AfABBgEAATABBwL/AcIBAwEAAeABPwL/\n        AYABfAEAAR4BAQL/Af4DAAE/Av8B+AEGAQABEAEPAv8B/gEDAQABwAE/Av8BwAE8AQABHAEBAv8B/gMA\n        AT8C/wH4AwABDwL/Af4BAQEAAcABPwL/AcABPAEAAQwBAwL/Af4DAAE/Av8B+AMAAQ8D/wMAAX8C/wHg\n        ARwBAAEIAQMC/wH+AwABPwL/AfwDAAEfA/8BgAIAA/8B8AEEAgABBwL/Af4DAAE/Av8B/gMAAR8D/wGA\n        AgAD/wHwAwABBwL/Af4DAAE/Av8B/gMAAT8D/wHAAQABAQP/AfgDAAEPAv8B/gMAAR8C/wH+AwABPwP/\n        AeABAAEBA/8B/AMAAQ8C/wH+AwABHwP/AwABPwP/AeABAAEDA/8B/gMAAR8C/wH+AwABHwP/AwABfwP/\n        AfgBAAEHA/8B/gMAAT8C/wH+AwABPwP/AcACAAT/Af4BAAE/BP8BwAIAAX8C/wH+AwABPwP/AfABAAED\n        BP8B/gEAAT8E/wHgAgAD/wH+AwABPwP/AfwBAAEPBP8B/gEIAT8E/wH4AQABAwT/AfwCAAE/A/8B/gEA\n        AT8F/wH4Bf8B/AEAAQ8E/wH+AgABfxL/AYABf47/AfwBIAFgAeABcAEAAX8V/wH8AQABYAHgAWABAAEf\n        CP8CAAEEAgABfwf/AfwBAAJgAUABAAEfB/8B/gUAAX8B8AJAAQABBAEIAQcB/AEAAmABQAEiAQ8H/wH+\n        BQABfwHwAQABQAMAAQcB/AEEAwABIwEPAf4CAAGEAgABfwH/BAABgAH/AfgEAAEQAQ8B/AEcAwABIwGP\n        Af4CAAGEAgABPwH/AgABIAFAAYAB/wH4AgABBAIAAQ8B/AEMAgABEAEjAY8B/gIAAYQCAAE/Af8BgAEA\n        ASABQAEAAf8B+AIAAUYCAAEPAfwBBAFiAQgBEAEiAQ8B/gIAAYQCAAE/Af8BggEAATABwAEAAf8B+AEA\n        AeABRgIAAQ8B/AEAAWABCAEQAQABDwH+ARABAAGEAgABPwH/AYIBDAEQAcABAAH/AfABAAFAAwABDwH8\n        AQABQQEIAXABAAEfAf4FAAE/Af8BwgEMARABgAEAAf8B8AEAAUADAAEHAfwBAAFBAQgBcAEAAT8B/gUA\n        AT8B/wHCARwBGQGAAQEB/wHwAYABQAEAAQgBEAEPA/8BnwP/Af4FAAE/GP8BAQb/AYEM/wH4AUABDwv/\n        AfwBAAE/Cv8B/AFwAQABBwEfCv8B8AEAAQ8F/wGABP8B+AFwAQABBwEPCv8BgAEAAQME/wH8AQABHwP/\n        AfABcAEAAgcD/wH+AT4BPwT/AwAE/wH4AQABBwP/AeABcAEAAgcD/wH8ARwBHwP/Af4DAAF/A/8B4AEA\n        AQED/wHgAfABAAEHAYMD/wH8AQgBDwP/AfwDAAE/A/8BwAIAA/8BwAHwAQABBwGBA/8B+AEIAQcD/wH4\n        AwABHwP/AwABfwL/AcAB8AEAAQcBwQP/AeABAAEDA/8B8AECAQABYAEfAv8B/gMAAT8C/wGAAfABAAEH\n        AcAD/wHAAQABAQP/AfABBgEAAXABDwL/Af4CAAGAAT8C/wGAAfABAAEHAcAD/wGAAgAD/wHgAQYBAAFw\n        AQcC/wH8AgAB8AEfAv8BgAQAA/8DAAF/Av8B4AEOAQABeAEHAv8B/AEAAUAB8AEfAv8BgAQAAv8B/gMA\n        AT8C/wHgAQ4BAAFwAQcC/wH4AQEBAAH4AQ8C/wUAAv8B/gMAAT8C/wHAAQ4BAAFwAQMC/wH4AQYBAAH+\n        AQ8C/wUAAv8B/gEEAQABEAE/Av8BwAEOAQABcAEDAv8B8AIAAf4BDwH/Af4FAAE/Af8B/AEEAQABCAE/\n        Av8BgAEOAQABcAEBAv8B8AIAAf8BDwH/AfwFAAE/Af8B/gMAAT8C/wGBAQwBAAEwAQEC/wHwAQABAQH/\n        AQ8B/wH8BQABPwH/Af4DAAE/Av8BgQIAARABAQL/AfABEAEAAf8BjwH/AfwFAAE/Af8B/gMAAT8C/wGB\n        AwABAQL/AfABIAEAAf8BjwH/AfwFAAE/Av8DAAF/Av8BgQMAAYEC/wHwASABAAH/AY8B/wH+BQABPwL/\n        AYACAAF/Av8BgQEAAQYBAAGBAv8B8AEgAQAB/wGfAf8B/gUAAT8C/wHgAQABAQP/AYEBgAEAAQEBgQL/\n        AfABIAEAAf8BPwH/Af4FAAE/Av8B8AEAAQED/wGBAcABAAEDAYEC/wHwAgABfwE/Af8B/gEBAf8BgAEA\n        AUABPwL/AfgBAAEDA/8BgAHAAQACAwL/AfABEAEAAX8D/wEBAf8BAAF/AcABfwL/AfABAAEDA/8CwAEA\n        AQIBAwL/AfACAAF8A/8BAQH/AQABfwHAAX8C/wHgAQgBAQP/AcABRAEAASIBAwL/AfgCAAF4AX8C/wEB\n        Af8BAAH/AYABfwL/AcABHAEAA/8BwAFjAYABQAEDAv8B+AIAAXgBPwL/AQAB/wGBAf8BgAF/Av8BgAE+\n        AQAD/wHgASMBwwHAAQcC/wH8AQQBAAFwAR8C/wGAA/8BgAF/Av8BgAF/AQAD/wHgAQcBwwHAAQcC/wH+\n        AgABQAEfAv8BgAF/Av8BAAP/AcABPgEAA/8B8AEHAcMB4AEPAv8B/gMAAT8C/wHAAT8B/wH+AQAD/wHg\n        ARwBAQP/AfgBAwHDAYABHwL/Af4DAAE/Av8B4AE/Af8B/AEBA/8B8AEIAQMD/wH4AQABwwEAAR8D/wMA\n        AT8C/wHwAR8B/wH4AQMD/wH4AQgBBwP/AfwDAAE/A/8DAAE/Av8B+AEPAf8B8AEDA/8B/AEIAQ8D/wH+\n        AwABPwP/AYACAAF/Av8B/AEHAf8B8AEPA/8B/gEAAR8E/wMAAX8D/wHgAgAD/wH+AQMB/wHgAT8E/wEA\n        AT8E/wHAAQABAQT/AfABAAEBBP8BgQH/AYABfwT/AYABfwT/AfABAAEDBP8B/AEAAQ8E/wHgAf8BgQX/\n        AeMF/wH8AQABHwT/Af4BAAE/Bv8Bzwz/AQBs/ws=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/BlankCharacterWindow.Designer.cs",
    "content": "﻿namespace EVEMon.BlankCharacter\n{\n    partial class BlankCharacterWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.buttonCancel = new System.Windows.Forms.Button();\n            this.buttonOK = new System.Windows.Forms.Button();\n            this.bottomPanel = new System.Windows.Forms.Panel();\n            this.blankCharacterControl = new EVEMon.BlankCharacter.BlankCharacterControl();\n            this.bottomPanel.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // buttonCancel\n            // \n            this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.buttonCancel.Location = new System.Drawing.Point(412, 23);\n            this.buttonCancel.Margin = new System.Windows.Forms.Padding(3, 20, 20, 3);\n            this.buttonCancel.Name = \"buttonCancel\";\n            this.buttonCancel.Size = new System.Drawing.Size(75, 23);\n            this.buttonCancel.TabIndex = 0;\n            this.buttonCancel.Text = \"Cancel\";\n            this.buttonCancel.UseVisualStyleBackColor = true;\n            this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);\n            // \n            // buttonOK\n            // \n            this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.buttonOK.Location = new System.Drawing.Point(331, 23);\n            this.buttonOK.Margin = new System.Windows.Forms.Padding(3, 20, 3, 3);\n            this.buttonOK.Name = \"buttonOK\";\n            this.buttonOK.Size = new System.Drawing.Size(75, 23);\n            this.buttonOK.TabIndex = 1;\n            this.buttonOK.Text = \"Import\";\n            this.buttonOK.UseVisualStyleBackColor = true;\n            this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);\n            // \n            // bottomPanel\n            // \n            this.bottomPanel.BackColor = System.Drawing.SystemColors.ControlLight;\n            this.bottomPanel.Controls.Add(this.buttonCancel);\n            this.bottomPanel.Controls.Add(this.buttonOK);\n            this.bottomPanel.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.bottomPanel.Location = new System.Drawing.Point(0, 425);\n            this.bottomPanel.Name = \"bottomPanel\";\n            this.bottomPanel.Size = new System.Drawing.Size(497, 57);\n            this.bottomPanel.TabIndex = 2;\n            // \n            // blankCharacterControl\n            // \n            this.blankCharacterControl.AutoSize = true;\n            this.blankCharacterControl.BackColor = System.Drawing.Color.Transparent;\n            this.blankCharacterControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.blankCharacterControl.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.blankCharacterControl.Location = new System.Drawing.Point(0, 0);\n            this.blankCharacterControl.Name = \"blankCharacterControl\";\n            this.blankCharacterControl.Padding = new System.Windows.Forms.Padding(13);\n            this.blankCharacterControl.Size = new System.Drawing.Size(497, 425);\n            this.blankCharacterControl.TabIndex = 3;\n            // \n            // BlankCharacterWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.BackColor = System.Drawing.SystemColors.Window;\n            this.ClientSize = new System.Drawing.Size(497, 482);\n            this.Controls.Add(this.blankCharacterControl);\n            this.Controls.Add(this.bottomPanel);\n            this.MaximizeBox = false;\n            this.Name = \"BlankCharacterWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Blank Character Creator\";\n            this.Load += new System.EventHandler(this.BlankCharacterWindow_Load);\n            this.bottomPanel.ResumeLayout(false);\n            this.bottomPanel.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Button buttonCancel;\n        private System.Windows.Forms.Button buttonOK;\n        private System.Windows.Forms.Panel bottomPanel;\n        private BlankCharacterControl blankCharacterControl;\n    }\n}"
  },
  {
    "path": "src/EVEMon/BlankCharacterWindow.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.BlankCharacter\n{\n    public partial class BlankCharacterWindow : EVEMonForm\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BlankCharacterWindow\"/> class.\n        /// </summary>\n        public BlankCharacterWindow()\n        {\n            InitializeComponent();\n        }\n\n\n        #endregion\n\n\n        #region Inherited Event Handlers\n\n        /// <summary>\n        /// Handles the Load event of the BlankCharacterWindow control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void BlankCharacterWindow_Load(object sender, EventArgs e)\n        {\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            Disposed += OnDisposed;\n\n            buttonOK.Text = \"Save\";\n            buttonOK.Enabled = false;\n        }\n\n        /// <summary>\n        /// Called when the instance get disposed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            Disposed -= OnDisposed;\n        }\n\n        #endregion\n\n\n        #region Global Event Handlers\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            buttonOK.Enabled = !String.IsNullOrEmpty(BlankCharacterUIHelper.CharacterName);\n            AcceptButton = buttonOK.Enabled ? buttonOK : buttonCancel;\n        }\n\n        #endregion\n\n\n        #region Control Handlers\n\n        /// <summary>\n        /// Handles the Click event of the buttonOK control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private async void buttonOK_Click(object sender, EventArgs e)\n        {\n            // Three choices for one button\n            switch (buttonOK.DialogResult)\n            {\n                    // Save blank character\n                case DialogResult.None:\n                    await BlankCharacterUIHelper.SaveAsync(OnCharacterSaved);\n                    break;\n                    // Add blank character\n                case DialogResult.OK:\n                    await BlankCharacterUIHelper.AddBlankCharacterAsync(OnCharacterImported);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the buttonCancel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void buttonCancel_Click(object sender, EventArgs e)\n        {\n            Close();\n        }\n\n        #endregion\n\n\n        #region Callback Methods\n\n        /// <summary>\n        /// Called when character is saved.\n        /// </summary>\n        private void OnCharacterSaved()\n        {\n            buttonOK.Text = \"Import\";\n            buttonOK.DialogResult = DialogResult.OK;\n\n            // Disabling control editing\n            blankCharacterControl.Enabled = false;\n        }\n\n        /// <summary>\n        /// Called when character is imported.\n        /// </summary>\n        private void OnCharacterImported()\n        {\n            Close();\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/BlankCharacterWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/AssetsColumnsSelectWindow.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    public sealed class AssetsColumnsSelectWindow : ColumnSelectWindow\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"AssetsColumnsSelectWindow\"/> class.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        public AssetsColumnsSelectWindow(IEnumerable<AssetColumnSettings> settings)\n            : base(settings)\n        {\n        }\n\n        /// <summary>\n        /// Gets the header.\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <returns></returns>\n        protected override string GetHeader(int key) => ((AssetColumn)key).GetDescription();\n\n        /// <summary>\n        /// Gets all keys.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<int> AllKeys\n            => EnumExtensions.GetValues<AssetColumn>()\n                .Where(x => x != AssetColumn.None).Select(x => (int)x);\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<IColumnSettings> DefaultColumns\n        {\n            get\n            {\n                AssetSettings settings = new AssetSettings();\n                return settings.DefaultColumns;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterAssetsList.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterAssetsList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterAssetsList));\n            this.noAssetsLabel = new System.Windows.Forms.Label();\n            this.lvAssets = new System.Windows.Forms.ListView();\n            this.chItem = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chQuantity = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chVolume = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chGroup = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chCategory = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.ilIcons = new System.Windows.Forms.ImageList(this.components);\n            this.noPricesFoundLabel = new System.Windows.Forms.Label();\n            this.lblTotalCost = new System.Windows.Forms.Label();\n            this.totalCostThrobber = new EVEMon.Common.Controls.Throbber();\n            this.estimatedCostPanel = new System.Windows.Forms.Panel();\n            this.throbber = new EVEMon.Common.Controls.Throbber();\n            this.showInBrowserMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.showInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.contextMenu.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.totalCostThrobber)).BeginInit();\n            this.estimatedCostPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.throbber)).BeginInit();\n            this.SuspendLayout();\n            // \n            // noAssetsLabel\n            // \n            this.noAssetsLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noAssetsLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noAssetsLabel.Location = new System.Drawing.Point(0, 0);\n            this.noAssetsLabel.Name = \"noAssetsLabel\";\n            this.noAssetsLabel.Size = new System.Drawing.Size(472, 401);\n            this.noAssetsLabel.TabIndex = 3;\n            this.noAssetsLabel.Text = \"No assets are available.\";\n            this.noAssetsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lvAssets\n            // \n            this.lvAssets.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lvAssets.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chItem,\n            this.chQuantity,\n            this.chVolume,\n            this.chGroup,\n            this.chCategory});\n            this.lvAssets.ContextMenuStrip = this.contextMenu;\n            this.lvAssets.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvAssets.FullRowSelect = true;\n            this.lvAssets.HideSelection = false;\n            this.lvAssets.Location = new System.Drawing.Point(0, 0);\n            this.lvAssets.Name = \"lvAssets\";\n            this.lvAssets.Size = new System.Drawing.Size(472, 401);\n            this.lvAssets.SmallImageList = this.ilIcons;\n            this.lvAssets.TabIndex = 3;\n            this.lvAssets.UseCompatibleStateImageBehavior = false;\n            this.lvAssets.View = System.Windows.Forms.View.Details;\n            // \n            // chItem\n            // \n            this.chItem.Text = \"Item\";\n            this.chItem.Width = 166;\n            // \n            // chQuantity\n            // \n            this.chQuantity.Text = \"Quantity\";\n            this.chQuantity.Width = 72;\n            // \n            // chVolume\n            // \n            this.chVolume.Text = \"Volume\";\n            this.chVolume.Width = 74;\n            // \n            // chGroup\n            // \n            this.chGroup.Text = \"Group\";\n            this.chGroup.Width = 80;\n            // \n            // chCategory\n            // \n            this.chCategory.Text = \"Category\";\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showInBrowserMenuItem,\n            this.showInBrowserMenuSeparator,\n            this.exportToCSVToolStripMenuItem});\n            this.contextMenu.Name = \"ItemAttributeContextMenu\";\n            this.contextMenu.Size = new System.Drawing.Size(171, 76);\n            this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenu_Opening);\n            // \n            // exportToCSVToolStripMenuItem\n            // \n            this.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n            this.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(170, 22);\n            this.exportToCSVToolStripMenuItem.Text = \"Export to CSV...\";\n            this.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n            // \n            // ilIcons\n            // \n            this.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n            this.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilIcons.Images.SetKeyName(0, \"arrow_up.png\");\n            this.ilIcons.Images.SetKeyName(1, \"arrow_down.png\");\n            this.ilIcons.Images.SetKeyName(2, \"16x16Transparant.png\");\n            // \n            // noPricesFoundLabel\n            // \n            this.noPricesFoundLabel.Anchor = System.Windows.Forms.AnchorStyles.Right;\n            this.noPricesFoundLabel.AutoSize = true;\n            this.noPricesFoundLabel.ForeColor = System.Drawing.Color.DarkRed;\n            this.noPricesFoundLabel.Location = new System.Drawing.Point(258, 9);\n            this.noPricesFoundLabel.Name = \"noPricesFoundLabel\";\n            this.noPricesFoundLabel.RightToLeft = System.Windows.Forms.RightToLeft.No;\n            this.noPricesFoundLabel.Size = new System.Drawing.Size(208, 13);\n            this.noPricesFoundLabel.TabIndex = 1;\n            this.noPricesFoundLabel.Text = \"* Prices for some items could not be found.\";\n            this.noPricesFoundLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // lblTotalCost\n            // \n            this.lblTotalCost.AutoSize = true;\n            this.lblTotalCost.Location = new System.Drawing.Point(3, 9);\n            this.lblTotalCost.Name = \"lblTotalCost\";\n            this.lblTotalCost.Size = new System.Drawing.Size(207, 13);\n            this.lblTotalCost.TabIndex = 0;\n            this.lblTotalCost.Text = \"Estimated Cost of shown items: {0:N2} ISK\";\n            this.lblTotalCost.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // totalCostThrobber\n            // \n            this.totalCostThrobber.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.totalCostThrobber.Location = new System.Drawing.Point(442, 4);\n            this.totalCostThrobber.MaximumSize = new System.Drawing.Size(24, 24);\n            this.totalCostThrobber.MinimumSize = new System.Drawing.Size(24, 24);\n            this.totalCostThrobber.Name = \"totalCostThrobber\";\n            this.totalCostThrobber.Size = new System.Drawing.Size(24, 24);\n            this.totalCostThrobber.State = EVEMon.Common.Enumerations.ThrobberState.Stopped;\n            this.totalCostThrobber.TabIndex = 3;\n            this.totalCostThrobber.TabStop = false;\n            this.totalCostThrobber.Visible = false;\n            // \n            // estimatedCostPanel\n            // \n            this.estimatedCostPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.estimatedCostPanel.Controls.Add(this.lblTotalCost);\n            this.estimatedCostPanel.Controls.Add(this.noPricesFoundLabel);\n            this.estimatedCostPanel.Controls.Add(this.totalCostThrobber);\n            this.estimatedCostPanel.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.estimatedCostPanel.Location = new System.Drawing.Point(0, 401);\n            this.estimatedCostPanel.Name = \"estimatedCostPanel\";\n            this.estimatedCostPanel.Size = new System.Drawing.Size(472, 33);\n            this.estimatedCostPanel.TabIndex = 5;\n            // \n            // throbber\n            // \n            this.throbber.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.throbber.Location = new System.Drawing.Point(229, 205);\n            this.throbber.MaximumSize = new System.Drawing.Size(24, 24);\n            this.throbber.MinimumSize = new System.Drawing.Size(24, 24);\n            this.throbber.Name = \"throbber\";\n            this.throbber.Size = new System.Drawing.Size(24, 24);\n            this.throbber.State = EVEMon.Common.Enumerations.ThrobberState.Stopped;\n            this.throbber.TabIndex = 6;\n            this.throbber.TabStop = false;\n            this.throbber.Visible = false;\n            // \n            // showInBrowserMenuSeparator\n            // \n            this.showInBrowserMenuSeparator.Name = \"showInBrowserMenuSeparator\";\n            this.showInBrowserMenuSeparator.Size = new System.Drawing.Size(167, 6);\n            // \n            // showInBrowserMenuItem\n            // \n            this.showInBrowserMenuItem.Name = \"showInBrowserMenuItem\";\n            this.showInBrowserMenuItem.Size = new System.Drawing.Size(170, 22);\n            this.showInBrowserMenuItem.Text = \"Show In Browser...\";\n            this.showInBrowserMenuItem.Click += new System.EventHandler(this.showInBrowserMenuItem_Click);\n            // \n            // CharacterAssetsList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.lvAssets);\n            this.Controls.Add(this.throbber);\n            this.Controls.Add(this.noAssetsLabel);\n            this.Controls.Add(this.estimatedCostPanel);\n            this.Name = \"CharacterAssetsList\";\n            this.Size = new System.Drawing.Size(472, 434);\n            this.contextMenu.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.totalCostThrobber)).EndInit();\n            this.estimatedCostPanel.ResumeLayout(false);\n            this.estimatedCostPanel.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.throbber)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noAssetsLabel;\n        private System.Windows.Forms.ListView lvAssets;\n        private System.Windows.Forms.ColumnHeader chItem;\n        private System.Windows.Forms.ColumnHeader chQuantity;\n        private System.Windows.Forms.ColumnHeader chVolume;\n        private System.Windows.Forms.ColumnHeader chGroup;\n        private System.Windows.Forms.ColumnHeader chCategory;\n        private System.Windows.Forms.ImageList ilIcons;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n        private System.Windows.Forms.Label lblTotalCost;\n        private System.Windows.Forms.Label noPricesFoundLabel;\n        private Common.Controls.Throbber totalCostThrobber;\n        private System.Windows.Forms.Panel estimatedCostPanel;\n        private Common.Controls.Throbber throbber;\n        private System.Windows.Forms.ToolStripMenuItem showInBrowserMenuItem;\n        private System.Windows.Forms.ToolStripSeparator showInBrowserMenuSeparator;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterAssetsList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.SkillPlanner;\nusing Region = EVEMon.Common.Data.Region;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterAssetsList : UserControl, IListView\n    {\n        #region Fields\n\n        private readonly List<AssetColumnSettings> m_columns = new List<AssetColumnSettings>();\n        private readonly List<Asset> m_list = new List<Asset>();\n\n        private InfiniteDisplayToolTip m_tooltip;\n        private AssetGrouping m_grouping;\n        private AssetColumn m_sortCriteria;\n\n        private string m_textFilter = string.Empty;\n        private string m_totalCostLabelDefaultText;\n\n        private bool m_sortAscending = true;\n        private bool m_columnsChanged;\n        private bool m_isUpdatingColumns;\n        private bool m_init;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public CharacterAssetsList()\n        {\n            InitializeComponent();\n\n            lvAssets.Visible = false;\n            lvAssets.AllowColumnReorder = true;\n            lvAssets.Columns.Clear();\n            estimatedCostPanel.Hide();\n            noPricesFoundLabel.Hide();\n\n            noAssetsLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n\n            ListViewHelper.EnableDoubleBuffer(lvAssets);\n\n            lvAssets.KeyDown += listView_KeyDown;\n            lvAssets.ColumnClick += listView_ColumnClick;\n            lvAssets.ColumnWidthChanged += listView_ColumnWidthChanged;\n            lvAssets.ColumnReordered += listView_ColumnReordered;\n            lvAssets.MouseDown += listView_MouseDown;\n            lvAssets.MouseMove += listView_MouseMove;\n            lvAssets.MouseLeave += listView_MouseLeave;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        /// <summary>\n        /// Gets or sets the text filter.\n        /// </summary>\n        [Browsable(false)]\n        public string TextFilter\n        {\n            get { return m_textFilter; }\n            set\n            {\n                m_textFilter = value;\n                if (m_init)\n                    Task.WhenAll(UpdateColumnsAsync());\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of assets to display.\n        /// </summary>\n        private IEnumerable<Asset> Assets\n        {\n            get { return m_list; }\n            set\n            {\n                m_list.Clear();\n                if (value == null)\n                    return;\n\n                m_list.AddRange(value);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping of a listview.\n        /// </summary>\n        /// <value></value>\n        [Browsable(false)]\n        public Enum Grouping\n        {\n            get { return m_grouping; }\n            set\n            {\n                m_grouping = (AssetGrouping)value;\n                if (m_init)\n                    Task.WhenAll(UpdateColumnsAsync());\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the settings used for columns.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        public IEnumerable<IColumnSettings> Columns\n        {\n            get\n            {\n                // Add the visible columns; matching the display order\n                List<AssetColumnSettings> newColumns = new List<AssetColumnSettings>();\n                foreach (ColumnHeader header in lvAssets.Columns.Cast<ColumnHeader>().OrderBy(x => x.DisplayIndex))\n                {\n                    AssetColumnSettings columnSetting = m_columns.First(x => x.Column == (AssetColumn)header.Tag);\n                    if (columnSetting.Width > -1)\n                        columnSetting.Width = header.Width;\n\n                    newColumns.Add(columnSetting);\n                }\n\n                // Then add the other columns\n                newColumns.AddRange(m_columns.Where(x => !x.Visible));\n\n                return newColumns;\n            }\n            set\n            {\n                m_columns.Clear();\n                if (value != null)\n                    m_columns.AddRange(value.Cast<AssetColumnSettings>());\n\n                if (m_init)\n                    Task.WhenAll(UpdateColumnsAsync());\n            }\n        }\n\n        #endregion\n\n\n        # region Inherited Events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            m_totalCostLabelDefaultText = lblTotalCost.Text;\n\n            m_tooltip = new InfiniteDisplayToolTip(lvAssets);\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.CharacterAssetsUpdated += EveMonClient_CharacterAssetsUpdated;\n            EveMonClient.CharacterInfoUpdated += EveMonClient_CharacterInfoUpdated;\n            EveMonClient.ConquerableStationListUpdated += EveMonClient_ConquerableStationListUpdated;\n            EveMonClient.EveFlagsUpdated += EveMonClient_EveFlagsUpdated;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.ItemPricesUpdated += EveMonClient_ItemPricesUpdated;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            m_tooltip.Dispose();\n\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.CharacterAssetsUpdated -= EveMonClient_CharacterAssetsUpdated;\n            EveMonClient.CharacterInfoUpdated -= EveMonClient_CharacterInfoUpdated;\n            EveMonClient.ConquerableStationListUpdated -= EveMonClient_ConquerableStationListUpdated;\n            EveMonClient.EveFlagsUpdated -= EveMonClient_EveFlagsUpdated;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.ItemPricesUpdated -= EveMonClient_ItemPricesUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override async void OnVisibleChanged(EventArgs e)\n        {\n            if (DesignMode || this.IsDesignModeHosted() || Character == null)\n                return;\n\n            base.OnVisibleChanged(e);\n\n            if (!Visible)\n                return;\n\n            // Prevents the properties to call UpdateColumnsAsync() till we set all properties\n            m_init = false;\n\n            lvAssets.Hide();\n            estimatedCostPanel.Hide();\n            noAssetsLabel.Visible = Character?.Assets.Count == 0;\n            \n            Assets = Character?.Assets;\n            Columns = Settings.UI.MainWindow.Assets.Columns;\n            Grouping = Character?.UISettings.AssetsGroupBy;\n            TextFilter = string.Empty;\n\n            await UpdateColumnsAsync();\n\n            m_init = true;\n\n            UpdateListVisibility();\n        }\n\n        # endregion\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Autoresizes the columns.\n        /// </summary>\n        public void AutoResizeColumns()\n        {\n            m_columns.ForEach(column =>\n            {\n                if (column.Visible)\n                    column.Width = -2;\n            });\n\n            UpdateColumnsAsync().ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Updates the columns.\n        /// </summary>\n        internal async Task UpdateColumnsAsync()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            lvAssets.BeginUpdate();\n            m_isUpdatingColumns = true;\n\n            lvAssets.Hide();\n            noAssetsLabel.Hide();\n\n            lvAssets.Columns.Clear();\n            lvAssets.Groups.Clear();\n            lvAssets.Items.Clear();\n\n            try\n            {\n                throbber.Show();\n                throbber.State = ThrobberState.Rotating;\n                \n                AddColumns();\n\n                // We update the content\n                await UpdateContentAsync();\n\n                throbber.State = ThrobberState.Stopped;\n                throbber.Hide();\n            }\n            finally\n            {\n                lvAssets.EndUpdate();\n                m_isUpdatingColumns = false;\n            }\n        }\n\n        /// <summary>\n        /// Adds the columns.\n        /// </summary>\n        private void AddColumns()\n        {\n            foreach (AssetColumnSettings column in m_columns.Where(x => x.Visible))\n            {\n                ColumnHeader header = lvAssets.Columns.Add(column.Column.GetHeader(), column.Width);\n                header.Tag = column.Column;\n\n                switch (column.Column)\n                {\n                    case AssetColumn.UnitaryPrice:\n                    case AssetColumn.TotalPrice:\n                    case AssetColumn.Quantity:\n                    case AssetColumn.Volume:\n                        header.TextAlign = HorizontalAlignment.Right;\n                        break;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private async Task UpdateContentAsync()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            int scrollBarPosition = lvAssets.GetVerticalScrollBarPosition();\n\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = lvAssets.SelectedItems.Count > 0 ? lvAssets.SelectedItems[0].\n                Tag.GetHashCode() : 0;\n\n            lvAssets.BeginUpdate();\n            try\n            {\n                List<Asset> assets;\n                lock (m_list)\n                {\n                    assets = m_list.Where(x => x.Item != null && x.SolarSystem != null).\n                        Where(x => IsTextMatching(x, m_textFilter)).ToList();\n                }\n\n                UpdateSort();\n\n                await UpdateContentByGroupAsync(assets);\n\n                await UpdateItemsCostAsync(assets);\n\n                // Adjust the size of the columns\n                AdjustColumns();\n\n                UpdateListVisibility();\n\n                // Restore the selected item (if any)\n                if (selectedItem > 0)\n                {\n                    foreach (ListViewItem lvItem in lvAssets.Items.Cast<ListViewItem>().Where(\n                        lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                    {\n                        lvItem.Selected = true;\n                    }\n                }\n            }\n            finally\n            {\n                lvAssets.EndUpdate();\n                lvAssets.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Updates the items cost.\n        /// </summary>\n        /// <param name=\"assets\">The assets.</param>\n        private async Task UpdateItemsCostAsync(IList<Asset> assets)\n        {\n            lblTotalCost.Text = string.Format(CultureConstants.DefaultCulture,\n                m_totalCostLabelDefaultText, await TaskHelper.RunCPUBoundTaskAsync(() =>\n                assets.Sum(asset => asset.Price * asset.Quantity)));\n\n            if (!totalCostThrobber.Visible && !Settings.MarketPricer.Pricer.Queried)\n            {\n                noPricesFoundLabel.Hide();\n                totalCostThrobber.Show();\n                totalCostThrobber.State = ThrobberState.Rotating;\n                return;\n            }\n\n            totalCostThrobber.State = ThrobberState.Stopped;\n            totalCostThrobber.Hide();\n            noPricesFoundLabel.Visible = await TaskHelper.RunCPUBoundTaskAsync(() =>\n                assets.Where(asset => asset.TypeOfBlueprint != BlueprintType.Copy.ToString()).\n                Any(asset => Math.Abs(asset.Price) < double.Epsilon));\n        }\n\n        /// <summary>\n        /// Updates the list visibility.\n        /// </summary>\n        private void UpdateListVisibility()\n        {\n            // Display or hide the \"no assets\" label\n            if (!m_init)\n                return;\n\n            noAssetsLabel.Visible = lvAssets.Items.Count == 0;\n            estimatedCostPanel.Visible = !noAssetsLabel.Visible;\n            lvAssets.Visible = !noAssetsLabel.Visible;\n        }\n\n        /// <summary>\n        /// Updates the content by group.\n        /// </summary>\n        /// <param name=\"assets\">The assets.</param>\n        private async Task UpdateContentByGroupAsync(IEnumerable<Asset> assets)\n        {\n            switch (m_grouping)\n            {\n                case AssetGrouping.None:\n                    await UpdateNoGroupContentAsync(assets);\n                    break;\n                case AssetGrouping.Group:\n                    IOrderedEnumerable<IGrouping<string, Asset>> groups1 =\n                        assets.GroupBy(x => x.Item.GroupName).OrderBy(x => x.Key);\n                    await UpdateContentAsync(groups1);\n                    break;\n                case AssetGrouping.GroupDesc:\n                    IOrderedEnumerable<IGrouping<string, Asset>> groups2 =\n                        assets.GroupBy(x => x.Item.GroupName).OrderByDescending(x => x.Key);\n                    await UpdateContentAsync(groups2);\n                    break;\n                case AssetGrouping.Category:\n                    IOrderedEnumerable<IGrouping<string, Asset>> groups3 =\n                        assets.GroupBy(x => x.Item.CategoryName).OrderBy(x => x.Key);\n                    await UpdateContentAsync(groups3);\n                    break;\n                case AssetGrouping.CategoryDesc:\n                    IOrderedEnumerable<IGrouping<string, Asset>> groups4 =\n                        assets.GroupBy(x => x.Item.CategoryName).OrderByDescending(x => x.Key);\n                    await UpdateContentAsync(groups4);\n                    break;\n                case AssetGrouping.Container:\n                    IOrderedEnumerable<IGrouping<string, Asset>> groups5 =\n                        assets.GroupBy(x => x.Container).OrderBy(x => x.Key);\n                    await UpdateContentAsync(groups5);\n                    break;\n                case AssetGrouping.ContainerDesc:\n                    IOrderedEnumerable<IGrouping<string, Asset>> groups6 =\n                        assets.GroupBy(x => x.Container).OrderByDescending(x => x.Key);\n                    await UpdateContentAsync(groups6);\n                    break;\n                case AssetGrouping.Location:\n                    IOrderedEnumerable<IGrouping<string, Asset>> groups7 =\n                        assets.GroupBy(x => x.Location).OrderBy(x => x.Key);\n                    await UpdateContentAsync(groups7);\n                    break;\n                case AssetGrouping.LocationDesc:\n                    IOrderedEnumerable<IGrouping<string, Asset>> groups8 =\n                        assets.GroupBy(x => x.Location).OrderByDescending(x => x.Key);\n                    await UpdateContentAsync(groups8);\n                    break;\n                case AssetGrouping.Region:\n                    IOrderedEnumerable<IGrouping<Region, Asset>> groups9 =\n                        assets.GroupBy(x => x.SolarSystem.Constellation.Region).OrderBy(x => x.Key);\n                    await UpdateContentAsync(groups9);\n                    break;\n                case AssetGrouping.RegionDesc:\n                    IOrderedEnumerable<IGrouping<Region, Asset>> groups10 =\n                        assets.GroupBy(x => x.SolarSystem.Constellation.Region).OrderByDescending(x => x.Key);\n                    await UpdateContentAsync(groups10);\n                    break;\n                case AssetGrouping.Jumps:\n                    IOrderedEnumerable<IGrouping<int, Asset>> groups11 =\n                        assets.GroupBy(x => x.Jumps).OrderBy(x => x.Key);\n                    await UpdateContentAsync(groups11);\n                    break;\n                case AssetGrouping.JumpsDesc:\n                    IOrderedEnumerable<IGrouping<int, Asset>> groups12 =\n                        assets.GroupBy(x => x.Jumps).OrderByDescending(x => x.Key);\n                    await UpdateContentAsync(groups12);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        /// <param name=\"assets\">The assets.</param>\n        private Task UpdateNoGroupContentAsync(IEnumerable<Asset> assets)\n            => TaskHelper.RunCPUBoundTaskAsync(() =>\n            {\n                return assets.Select(asset => new\n                {\n                    asset,\n                    item = new ListViewItem(asset.Item.Name)\n                    {\n                        UseItemStyleForSubItems = false,\n                        Tag = asset\n                    }\n                }).Select(x => CreateSubItems(x.asset, x.item)).ToArray();\n\n            }).ContinueWith(task =>\n            {\n                lvAssets.Groups.Clear();\n                lvAssets.Items.Clear();\n\n                lvAssets.Items.AddRange(task.Result);\n\n            }, EveMonClient.CurrentSynchronizationContext);\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        /// <typeparam name=\"TKey\"></typeparam>\n        /// <param name=\"groups\"></param>\n        private Task UpdateContentAsync<TKey>(IEnumerable<IGrouping<TKey, Asset>> groups)\n            => TaskHelper.RunCPUBoundTaskAsync(() =>\n            {\n                var listOfGroups = new List<ListViewGroup>();\n                var listOfItems = new List<ListViewItem>();\n\n                // Add the groups\n                foreach (IGrouping<TKey, Asset> group in groups)\n                {\n                    string groupText;\n                    if (@group.Key is int) // Really ugly way but couldn't figured another way\n                        groupText = @group.First().JumpsText;\n                    else\n                        groupText = @group.Key?.ToString() ?? string.Empty;\n\n                    ListViewGroup listGroup = new ListViewGroup(groupText);\n                    listOfGroups.Add(listGroup);\n\n                    ListViewItem[] items = @group.Select(asset => new\n                    {\n                        asset,\n                        item = new ListViewItem(asset.Item.Name, listGroup)\n                        {\n                            UseItemStyleForSubItems = false,\n                            Tag = asset\n                        }\n                    }).Select(x => CreateSubItems(x.asset, x.item)).ToArray();\n                    listOfItems.AddRange(items);\n                }\n\n                return new Tuple<ListViewGroup[], ListViewItem[]>(listOfGroups.ToArray(), listOfItems.ToArray());\n\n            }).ContinueWith(task =>\n            {\n                lvAssets.Items.Clear();\n                lvAssets.Groups.Clear();\n\n                lvAssets.Groups.AddRange(task.Result.Item1);\n                lvAssets.Items.AddRange(task.Result.Item2);\n\n            }, EveMonClient.CurrentSynchronizationContext);\n\n        /// <summary>\n        /// Creates the list view sub items.\n        /// </summary>\n        /// <param name=\"asset\">The asset.</param>\n        /// <param name=\"item\">The item.</param>\n        private ListViewItem CreateSubItems(Asset asset, ListViewItem item)\n        {\n            // Add enough subitems to match the number of columns\n            while (item.SubItems.Count < lvAssets.Columns.Count + 1)\n            {\n                item.SubItems.Add(string.Empty);\n            }\n\n            // Creates the subitems\n            for (int i = 0; i < lvAssets.Columns.Count; i++)\n            {\n                SetColumn(asset, item.SubItems[i], (AssetColumn)lvAssets.Columns[i].Tag);\n            }\n\n            return item;\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvAssets.Columns)\n            {\n                if (m_columns[column.Index].Width == -1)\n                    m_columns[column.Index].Width = -2;\n\n                column.Width = m_columns[column.Index].Width;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column and not set to auto-resize\n                if (column.Index != lvAssets.Columns.Count - 1 || m_columns[column.Index].Width != -2)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvAssets.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvAssets.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        /// <summary>\n        /// Updates the item sorter.\n        /// </summary>\n        private void UpdateSort()\n        {\n            lvAssets.ListViewItemSorter = new ListViewItemComparerByTag<Asset>(\n                new AssetComparer(m_sortCriteria, m_sortAscending));\n\n            UpdateSortVisualFeedback();\n        }\n\n        /// <summary>\n        /// Updates the sort feedback (the arrow on the header).\n        /// </summary>\n        private void UpdateSortVisualFeedback()\n        {\n            foreach (ColumnHeader columnHeader in lvAssets.Columns.Cast<ColumnHeader>())\n            {\n                AssetColumn column = (AssetColumn)columnHeader.Tag;\n                if (m_sortCriteria == column)\n                    columnHeader.ImageIndex = m_sortAscending ? 0 : 1;\n                else\n                    columnHeader.ImageIndex = 2;\n            }\n        }\n\n        /// <summary>\n        /// Updates the listview sub-item.\n        /// </summary>\n        /// <param name=\"asset\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"column\"></param>\n        private static void SetColumn(Asset asset, ListViewItem.ListViewSubItem item, AssetColumn column)\n        {\n            bool numberFormat = Settings.UI.MainWindow.Assets.NumberAbsFormat;\n\n            switch (column)\n            {\n                case AssetColumn.ItemName:\n                    item.Text = asset.Item.Name;\n                    break;\n                case AssetColumn.Quantity:\n                    item.Text = numberFormat\n                        ? FormatHelper.Format(asset.Quantity, AbbreviationFormat.AbbreviationSymbols)\n                        : asset.Quantity.ToNumericString(0);\n                    break;\n                case AssetColumn.UnitaryPrice:\n                    item.Text = numberFormat\n                        ? FormatHelper.Format(asset.Price, AbbreviationFormat.AbbreviationSymbols)\n                        : asset.Price.ToNumericString(2);\n                    break;\n                case AssetColumn.TotalPrice:\n                    item.Text = numberFormat\n                        ? FormatHelper.Format(asset.Cost, AbbreviationFormat.AbbreviationSymbols)\n                        : asset.Cost.ToNumericString(2);\n                    break;\n                case AssetColumn.Volume:\n                    item.Text = numberFormat\n                        ? FormatHelper.Format(asset.TotalVolume, AbbreviationFormat.AbbreviationSymbols)\n                        : asset.TotalVolume.ToNumericString(2);\n                    break;\n                case AssetColumn.BlueprintType:\n                    item.Text = asset.TypeOfBlueprint;\n                    break;\n                case AssetColumn.Group:\n                    item.Text = asset.Item.GroupName;\n                    break;\n                case AssetColumn.Category:\n                    item.Text = asset.Item.CategoryName;\n                    break;\n                case AssetColumn.Container:\n                    item.Text = asset.Container;\n                    break;\n                case AssetColumn.Flag:\n                    item.Text = asset.Flag;\n                    break;\n                case AssetColumn.Location:\n                    item.Text = asset.Location;\n                    item.ForeColor = asset.SolarSystem.SecurityLevelColor;\n                    break;\n                case AssetColumn.Region:\n                    item.Text = asset.SolarSystem.Constellation.Region.Name;\n                    break;\n                case AssetColumn.SolarSystem:\n                    item.Text = asset.SolarSystem.Name;\n                    item.ForeColor = asset.SolarSystem.SecurityLevelColor;\n                    break;\n                case AssetColumn.FullLocation:\n                    item.Text = asset.FullLocation;\n                    break;\n                case AssetColumn.Jumps:\n                    item.Text = asset.JumpsText;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Checks the given text matches the item.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if [is text matching] [the specified x]; otherwise, <c>false</c>.\n        /// </returns>\n        private static bool IsTextMatching(Asset x, string text) => string.IsNullOrEmpty(text) ||\n            ((x.Item?.ID ?? 0) != 0 && (x.Item.Name.Contains(text, true) ||\n            x.Item.GroupName.Contains(text, true) ||\n            x.Item.CategoryName.Contains(text, true) ||\n            x.TypeOfBlueprint.Contains(text, true))) ||\n            x.Container.Contains(text, true) ||\n            x.Flag.Contains(text, true) ||\n            x.Location.Contains(text, true) ||\n            ((x.SolarSystem?.ID ?? 0) != 0 &&\n                (x.SolarSystem.Name.Contains(text, true) ||\n                x.SolarSystem.Constellation.Name.Contains(text, true) ||\n                x.SolarSystem.Constellation.Region.Name.Contains(text, true)));\n\n        /// <summary>\n        /// Gets the tool tip text.\n        /// </summary>\n        /// <param name=\"item\">The item.</param>\n        /// <returns></returns>\n        private string GetToolTipText(ListViewItem item)\n        {\n            if (!item.Selected || lvAssets.SelectedItems.Count < 2)\n                return string.Empty;\n\n            List<ListViewItem> selectedItems = lvAssets.SelectedItems.Cast<ListViewItem>().ToList();\n            if (selectedItems.Any(selectedItem => selectedItem.Text != item.Text))\n                return string.Empty;\n\n            List<Asset> selectedAssets = selectedItems.Select(selectedItem => selectedItem.Tag).OfType<Asset>().ToList();\n            long sumQuantity = selectedAssets.Sum(selectedAsset => selectedAsset.Quantity);\n            double sumVolume = selectedAssets.Sum(selectedAsset => selectedAsset.TotalVolume);\n            int uniqueLocations = selectedAssets.Select(asset => asset.Location).Distinct().Count();\n            int minJumps = selectedAssets.Min(asset => asset.Jumps);\n            int maxJumps = selectedAssets.Max(asset => asset.Jumps);\n            Asset closestAsset = selectedAssets.First(asset => asset.Jumps == minJumps);\n            Asset farthestAsset = selectedAssets.Last(asset => asset.Jumps == maxJumps);\n\n            StringBuilder builder = new StringBuilder();\n            builder.Append($\"{item.Text} ({selectedAssets.First().Volume:N2} m³)\")\n                .AppendLine()\n                .Append($\"Total Quantity: {sumQuantity:N0} in {uniqueLocations:N0} \" +\n                        $\"{(uniqueLocations > 1 ? \"different \" : string.Empty)}location{uniqueLocations.S()}\")\n                .AppendLine()\n                .Append($\"Total Volume: {sumVolume:N2} m³\")\n                .AppendLine()\n                .Append($\"Closest Location: {closestAsset.Location} ({closestAsset.JumpsText})\")\n                .AppendLine();\n\n            if (closestAsset.Location != farthestAsset.Location)\n                builder.Append($\"Farthest Location: {farthestAsset.Location} ({farthestAsset.JumpsText})\");\n\n            return builder.ToString();\n        }\n\n        /// <summary>\n        /// Updates the asset location.\n        /// </summary>\n        private async Task UpdateAssetLocationAsync()\n        {\n            // Invoke it on a worker thread cause it may be time intensive\n            // if character owns many stuff in several locations\n            await TaskHelper.RunCPUBoundTaskAsync(() =>\n            {\n                Character.Assets.UpdateLocation();\n                lock (m_list)\n                {\n                    Assets = Character.Assets;\n                }\n            });\n\n            await UpdateColumnsAsync();\n        }\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Exports item info to CSV format.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(lvAssets);\n        }\n\n        /// <summary>\n        /// On column reorder we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnReordered(object sender, ColumnReorderedEventArgs e)\n        {\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user manually resizes a column, we make sure to update the column preferences.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)\n        {\n            if (m_isUpdatingColumns || m_columns.Count <= e.ColumnIndex)\n                return;\n\n            if (m_columns[e.ColumnIndex].Width == lvAssets.Columns[e.ColumnIndex].Width)\n                return;\n\n            m_columns[e.ColumnIndex].Width = lvAssets.Columns[e.ColumnIndex].Width;\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user clicks a column header, we update the sorting.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            AssetColumn column = (AssetColumn)lvAssets.Columns[e.Column].Tag;\n            if (m_sortCriteria == column)\n                m_sortAscending = !m_sortAscending;\n            else\n            {\n                m_sortCriteria = column;\n                m_sortAscending = true;\n            }\n\n            m_isUpdatingColumns = true;\n\n            // Updates the item sorter\n            UpdateSort();\n\n            m_isUpdatingColumns = false;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lvAssets.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we show the item's tooltip if over an item.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvAssets.Cursor = CustomCursors.ContextMenu;\n\n            ListViewItem item = lvAssets.GetItemAt(e.Location.X, e.Location.Y);\n            if (item == null)\n            {\n                m_tooltip.Hide();\n                return;\n            }\n\n            m_tooltip.Show(GetToolTipText(item), e.Location);\n        }\n\n        /// <summary>\n        /// When the mouse leaves the list, we hide the item's tooltip.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseLeave(object sender, EventArgs e)\n        {\n            m_tooltip.Hide();\n        }\n\n        /// <summary>\n        /// Handles key press.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_KeyDown(object sender, KeyEventArgs e)\n        {\n            switch (e.KeyCode)\n            {\n                case Keys.A:\n                    if (e.Control)\n                        lvAssets.SelectAll();\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the contextMenu control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CancelEventArgs\"/> instance containing the event data.</param>\n        private void contextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            bool visible = lvAssets.SelectedItems.Count > 0 &&\n                  lvAssets.SelectedItems\n                      .Cast<ListViewItem>()\n                      .All(item => item != null &&\n                                   item.Text == ((Asset)lvAssets.SelectedItems[0]?.Tag)?.Item.Name);\n\n            showInBrowserMenuItem.Visible =\n                showInBrowserMenuSeparator.Visible = visible;\n\n            if (!visible)\n                return;\n\n            Asset asset = lvAssets.SelectedItems[0]?.Tag as Asset;\n\n            if (asset?.Item == null)\n                return;\n\n            Blueprint blueprint = StaticBlueprints.GetBlueprintByID(asset.Item.ID);\n            Ship ship = asset.Item as Ship;\n            Skill skill = Character.Skills[asset.Item.ID];\n\n            if (skill == Skill.UnknownSkill)\n                skill = null;\n\n            string text = ship != null ? \"Ship\" : blueprint != null ? \"Blueprint\" : skill != null ? \"Skill\" : \"Item\";\n\n            showInBrowserMenuItem.Text = $\"Show In {text} Browser...\";\n        }\n\n        /// <summary>\n        /// Handles the Click event of the showInBrowserMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void showInBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            Asset asset = lvAssets.SelectedItems[0]?.Tag as Asset;\n\n            if (asset?.Item == null)\n                return;\n\n            Ship ship = asset.Item as Ship;\n            Blueprint blueprint = StaticBlueprints.GetBlueprintByID(asset.Item.ID);\n            Skill skill = Character.Skills[asset.Item.ID];\n\n            if (skill == Skill.UnknownSkill)\n                skill = null;\n\n            PlanWindow planWindow = PlanWindow.ShowPlanWindow(Character);\n\n            if (ship != null)\n                planWindow.ShowShipInBrowser(ship);\n            else if (blueprint != null)\n                planWindow.ShowBlueprintInBrowser(blueprint);\n            else if (skill != null)\n                planWindow.ShowSkillInBrowser(skill);\n            else\n                planWindow.ShowItemInBrowser(asset.Item);\n        }\n\n        # endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// On timer tick, we update the column settings if any changes have been made to them.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Visible || !m_columnsChanged)\n                return;\n\n            Settings.UI.MainWindow.Assets.Columns.Clear();\n            Settings.UI.MainWindow.Assets.Columns.AddRange(Columns.Cast<AssetColumnSettings>());\n\n            // Recreate the columns\n            Columns = Settings.UI.MainWindow.Assets.Columns;\n            m_columnsChanged = false;\n        }\n\n        /// <summary>\n        /// When the assets update, update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void EveMonClient_CharacterAssetsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (Character == null || e.Character != Character)\n                return;\n\n            Assets = Character.Assets;\n            await UpdateContentAsync();\n        }\n\n        /// <summary>\n        /// When the conquerable station list updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private async void EveMonClient_ConquerableStationListUpdated(object sender, EventArgs e)\n        {\n            if (Character == null)\n                return;\n\n            await UpdateAssetLocationAsync();\n        }\n\n        /// <summary>\n        /// When the eve flags updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private async void EveMonClient_EveFlagsUpdated(object sender, EventArgs e)\n        {\n            if (Character == null)\n                return;\n\n            await UpdateContentAsync();\n        }\n\n        /// <summary>\n        /// When the character info updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        /// <remarks>Mainly to update the jumps from charater last known location to assets.</remarks>\n        private async void EveMonClient_CharacterInfoUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (Character == null || e.Character != Character)\n                return;\n\n            await UpdateAssetLocationAsync();\n        }\n\n        /// <summary>\n        /// Handles the SettingsChanged event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private async void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            // No need to do this if control is not visible\n            if (!Visible)\n                return;\n\n            await UpdateContentAsync();\n        }\n\n        /// <summary>\n        /// Occurs when the item prices get updated.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private async void EveMonClient_ItemPricesUpdated(object sender, EventArgs e)\n        {\n            await UpdateContentAsync();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterAssetsList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>103, 17</value>\n  </metadata>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        AAAAAk1TRnQBSQFMAgEBAwEAAfQBBQH0AQUBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABEAMAAQEBAAEQBgABCP8A/wD/AP8A/wD/AP8A/wAaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB\n        AQABAQUAAYAXAAP/AQAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAB8AEPAf4BfwL/AgAB+AEfAfwBPwL/\n        AgAB/AE/AfgBHwL/AgAB/gF/AfABDwL/AgAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAL\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterContactList.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterContactList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.noContactsLabel = new System.Windows.Forms.Label();\n            this.lbContacts = new EVEMon.Common.Controls.NoFlickerListBox();\n            this.SuspendLayout();\n            // \n            // noContactsLabel\n            // \n            this.noContactsLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n            this.noContactsLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noContactsLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noContactsLabel.Location = new System.Drawing.Point(0, 0);\n            this.noContactsLabel.Name = \"noContactsLabel\";\n            this.noContactsLabel.Size = new System.Drawing.Size(328, 372);\n            this.noContactsLabel.TabIndex = 3;\n            this.noContactsLabel.Text = \"Contacts information not available.\";\n            this.noContactsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lbContacts\n            // \n            this.lbContacts.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lbContacts.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbContacts.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;\n            this.lbContacts.FormattingEnabled = true;\n            this.lbContacts.IntegralHeight = false;\n            this.lbContacts.ItemHeight = 15;\n            this.lbContacts.Location = new System.Drawing.Point(0, 0);\n            this.lbContacts.Margin = new System.Windows.Forms.Padding(0);\n            this.lbContacts.Name = \"lbContacts\";\n            this.lbContacts.Size = new System.Drawing.Size(328, 372);\n            this.lbContacts.TabIndex = 4;\n            this.lbContacts.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.lbContacts_DrawItem);\n            this.lbContacts.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.lbContacts_MeasureItem);\n            this.lbContacts.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbContacts_MouseDown);\n            this.lbContacts.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.lbContacts_MouseWheel);\n            // \n            // CharacterContactList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.noContactsLabel);\n            this.Controls.Add(this.lbContacts);\n            this.Name = \"CharacterContactList\";\n            this.Size = new System.Drawing.Size(328, 372);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noContactsLabel;\n        private Common.Controls.NoFlickerListBox lbContacts;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterContactList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Properties;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterContactList : UserControl\n    {\n        #region Fields\n\n        private const TextFormatFlags Format = TextFormatFlags.NoPadding | TextFormatFlags.NoClipping | TextFormatFlags.NoPrefix;\n\n        // Contacts drawing - Region & text padding\n        private const int PadTop = 2;\n        private const int PadLeft = 6;\n        private const int PadRight = 7;\n\n        // Contacts drawing - Contacts\n        private const int ContactDetailHeight = 34;\n\n        // Contacts drawing - Contacts groups\n        private const int ContactGroupHeaderHeight = 21;\n        private const int CollapserPadRight = 4;\n\n        private readonly Font m_contactsFont;\n        private readonly Font m_contactsBoldFont;\n        private readonly List<string> m_collapsedGroups = new List<string>();\n\n        #endregion\n\n\n        #region Constructor\n\n        public CharacterContactList()\n        {\n            InitializeComponent();\n\n            lbContacts.Hide();\n\n            m_contactsFont = FontFactory.GetFont(\"Tahoma\", 8.25F);\n            m_contactsBoldFont = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            noContactsLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        /// <summary>\n        /// Gets or sets the standing status to show contacts for.\n        /// </summary>\n        internal StandingStatus ShowContactsWithStandings { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether to show all contacts.\n        /// </summary>\n        internal bool ShowAllContacts { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether to show contacts in watch list.\n        /// </summary>\n        internal bool ShowContactsInWatchList { get; set; }\n\n        #endregion\n\n\n        #region Inherited events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.CharacterContactsUpdated += EveMonClient_CharacterContactsUpdated;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            Disposed += OnDisposed;\n\n            ShowAllContacts = true;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterContactsUpdated -= EveMonClient_CharacterContactsUpdated;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (Visible)\n                UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Content Management\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        internal void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            // When no character, we just hide the list\n            if (Character == null)\n            {\n                noContactsLabel.Visible = true;\n                lbContacts.Visible = false;\n                return;\n            }\n\n            int scrollBarPosition = lbContacts.TopIndex;\n\n            // Update the standings list\n            lbContacts.BeginUpdate();\n            try\n            {\n                IList<Contact> contacts = Character.Contacts.ToList();\n\n                if (!ShowAllContacts && !ShowContactsInWatchList)\n                    contacts = contacts.Where(contact => Standing.Status(contact.Standing) == ShowContactsWithStandings).ToList();\n\n                if (ShowContactsInWatchList)\n                    contacts = contacts.Where(contact => contact.IsInWatchlist).ToList();\n\n                IEnumerable<IGrouping<ContactGroup, Contact>> groups = contacts.GroupBy(x => x.Group).OrderBy(x => (int)x.Key);\n\n                // Scroll through groups\n                lbContacts.Items.Clear();\n                foreach (IGrouping<ContactGroup, Contact> group in groups)\n                {\n                    string groupHeaderText = $\"{@group.Key.GetDescription()} ({@group.Count()})\";\n                    lbContacts.Items.Add(groupHeaderText);\n\n                    // Add items in the group when it's not collapsed\n                    if (m_collapsedGroups.Contains(groupHeaderText))\n                        continue;\n\n                    foreach (Contact contact in group.OrderBy(contact => contact.Name))\n                    {\n                        contact.ContactImageUpdated += contact_ContactImageUpdated;\n                        lbContacts.Items.Add(contact);\n                    }\n                }\n\n                // Display or hide the \"no contacts\" label.\n                noContactsLabel.Visible = !contacts.Any();\n                lbContacts.Visible = contacts.Any();\n\n                // Invalidate display\n                lbContacts.Invalidate();\n            }\n            finally\n            {\n                lbContacts.EndUpdate();\n                lbContacts.TopIndex = scrollBarPosition;\n            }\n        }\n\n        #endregion\n\n\n        #region Drawing\n\n        /// <summary>\n        /// Handles the DrawItem event of the lbContacts control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void lbContacts_DrawItem(object sender, DrawItemEventArgs e)\n        {\n            if (e.Index < 0 || e.Index >= lbContacts.Items.Count)\n                return;\n\n            object item = lbContacts.Items[e.Index];\n            Contact contact = item as Contact;\n            if (contact != null)\n                DrawItem(contact, e);\n            else\n                DrawItem((string)item, e);\n        }\n\n        /// <summary>\n        /// Handles the MeasureItem event of the lbContacts control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MeasureItemEventArgs\"/> instance containing the event data.</param>\n        private void lbContacts_MeasureItem(object sender, MeasureItemEventArgs e)\n        {\n            if (e.Index < 0)\n                return;\n            e.ItemHeight = GetItemHeight(lbContacts.Items[e.Index]);\n        }\n\n        /// <summary>\n        /// Gets the item's height.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        private int GetItemHeight(object item)\n        {\n            if (item is Contact)\n                return Math.Max(m_contactsFont.Height * 2 + PadTop * 2, ContactDetailHeight);\n\n            return ContactGroupHeaderHeight;\n        }\n\n        /// <summary>\n        /// Draws the list item for the given standing\n        /// </summary>\n        /// <param name=\"contact\"></param>\n        /// <param name=\"e\"></param>\n        private void DrawItem(Contact contact, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n            // Draw background\n            g.FillRectangle(e.Index % 2 == 0 ? Brushes.White : Brushes.LightGray, e.Bounds);\n            // Measure and draw contact name\n            Size contactTextSize = TextRenderer.MeasureText(g, contact.Name,\n                m_contactsBoldFont, Size.Empty, Format);\n            TextRenderer.DrawText(g, contact.Name, m_contactsBoldFont, new Rectangle(\n                e.Bounds.Left + contact.EntityImage.Width + 4, e.Bounds.Top + (contact.Group ==\n                ContactGroup.Agent ? PadTop : (e.Bounds.Height - contactTextSize.Height) / 2),\n                contactTextSize.Width + PadLeft, contactTextSize.Height), Color.Black);\n\n            // Draw text for agents\n            if (contact.Group == ContactGroup.Agent)\n            {\n                Agent agent = StaticGeography.GetAgentByName(contact.Name);\n                if (agent != null)\n                {\n                    Station agentStation = agent.Station;\n                    string agentLocationText = agentStation != null ? agentStation.Name :\n                        agent.Station.Name;\n                    // Determine the agent level and division\n                    string agentLevelText = (agent.AgentType != AgentType.BasicAgent &&\n                        agent.AgentType != AgentType.ResearchAgent) ? agent.AgentType.\n                        GetDescription() : $\"Level {Skill.GetRomanFromInt(agent.Level)}\";\n                    string agentLevelDivisionText = $\"( {agentLevelText} - {agent.Division} )\";\n                    // Calculate text size\n                    Size agentLocationTextSize = TextRenderer.MeasureText(g, agentLocationText,\n                        m_contactsFont, Size.Empty, Format);\n                    Size agentLevelDivisionTextSize = TextRenderer.MeasureText(g,\n                        agentLevelDivisionText, m_contactsFont, Size.Empty, Format);\n                    // Draw agent level and division text\n                    TextRenderer.DrawText(g, agentLevelDivisionText, m_contactsFont,\n                        new Rectangle(e.Bounds.Left + contact.EntityImage.Width + 4 +\n                            contactTextSize.Width + PadRight, e.Bounds.Top + PadTop,\n                            agentLevelDivisionTextSize.Width + PadLeft,\n                            agentLevelDivisionTextSize.Height), Color.Black, Format);\n\n                    // Draw agent location\n                    TextRenderer.DrawText(g, agentLocationText, m_contactsFont, new Rectangle(\n                        e.Bounds.Left + contact.EntityImage.Width + 4, e.Bounds.Top + PadTop +\n                        agentLevelDivisionTextSize.Height, agentLocationTextSize.Width +\n                        PadLeft, agentLocationTextSize.Height), Color.Black);\n                }\n            }\n            else if (Settings.UI.SafeForWork)\n            {\n                string contactStandingStatusText = $\"({Standing.Status(contact.Standing)})\";\n                // Measure and draw standing text\n                Size contactStandingStatusTextSize = TextRenderer.MeasureText(g,\n                    contactStandingStatusText, m_contactsFont, Size.Empty, Format);\n                TextRenderer.DrawText(g, contactStandingStatusText, m_contactsFont,\n                    new Rectangle(e.Bounds.Left + contact.EntityImage.Width + 4 +\n                    contactTextSize.Width + PadRight, e.Bounds.Top + (e.Bounds.Height -\n                    contactStandingStatusTextSize.Height) / 2, contactStandingStatusTextSize.\n                    Width + PadLeft, contactStandingStatusTextSize.Height), Color.Black);\n                // Draw watchlist text\n                if (contact.IsInWatchlist)\n                {\n                    const string ContactInWatchListText = \" - Watching\";\n                    Size contactInWatchListTextSize = TextRenderer.MeasureText(g,\n                        ContactInWatchListText, m_contactsFont, Size.Empty, Format);\n                    TextRenderer.DrawText(g, ContactInWatchListText, m_contactsFont,\n                        new Rectangle(e.Bounds.Left + contact.EntityImage.Width + 4 +\n                            contactTextSize.Width + contactStandingStatusTextSize.Width +\n                            PadRight, e.Bounds.Top + (e.Bounds.Height -\n                            contactStandingStatusTextSize.Height) / 2,\n                            contactInWatchListTextSize.Width + PadLeft,\n                            contactInWatchListTextSize.Height), Color.Black);\n                }\n            }\n            else\n            {\n                // Draw standing image\n                Image standingImage = Standing.GetStandingImage((int)contact.Standing);\n                g.DrawImage(standingImage, new Rectangle(e.Bounds.Left + contact.EntityImage.\n                    Width + 4 + contactTextSize.Width + PadRight * 2, e.Bounds.Top + (e.Bounds.\n                    Height - standingImage.Size.Height) / 2, standingImage.Width,\n                    standingImage.Height));\n                // Draw watchlist image\n                if (contact.IsInWatchlist)\n                    g.DrawImage(Resources.Watch, new Rectangle(e.Bounds.Left + contact.\n                        EntityImage.Width + 4 + contactTextSize.Width + standingImage.Width +\n                        PadRight * 3, e.Bounds.Top + (e.Bounds.Height - Resources.Watch.\n                        Height) / 2, Resources.Watch.Width, Resources.Watch.Height));\n            }\n\n            // Draw images\n            if (!Settings.UI.SafeForWork)\n                g.DrawImage(contact.EntityImage, new Rectangle(e.Bounds.Left + PadLeft / 2,\n                    ContactDetailHeight / 2 - contact.EntityImage.Height / 2 + e.Bounds.Top,\n                    contact.EntityImage.Width, contact.EntityImage.Height));\n        }\n\n        /// <summary>\n        /// Draws the list item for the given group.\n        /// </summary>\n        /// <param name=\"group\"></param>\n        /// <param name=\"e\"></param>\n        private void DrawItem(string group, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Draws the background\n            using (LinearGradientBrush lgb = new LinearGradientBrush(new PointF(0F, 0F), new PointF(0F, 21F),\n                                                                     Color.FromArgb(75, 75, 75), Color.FromArgb(25, 25, 25)))\n            {\n                g.FillRectangle(lgb, e.Bounds);\n            }\n\n            using (Pen p = new Pen(Color.FromArgb(100, 100, 100)))\n            {\n                g.DrawLine(p, e.Bounds.Left, e.Bounds.Top, e.Bounds.Right + 1, e.Bounds.Top);\n            }\n\n            // Setting character spacing\n            NativeMethods.SetTextCharacterSpacing(g, 4);\n\n            // Measure texts\n            Size standingGroupTextSize = TextRenderer.MeasureText(g, group.ToUpper(CultureConstants.DefaultCulture),\n                                                                  m_contactsBoldFont, Size.Empty, Format);\n            Rectangle standingGroupTextRect = new Rectangle(e.Bounds.Left + PadLeft,\n                                                            e.Bounds.Top +\n                                                            (e.Bounds.Height / 2 - standingGroupTextSize.Height / 2),\n                                                            standingGroupTextSize.Width + PadRight,\n                                                            standingGroupTextSize.Height);\n\n            // Draws the text header\n            TextRenderer.DrawText(g, group.ToUpper(CultureConstants.DefaultCulture), m_contactsBoldFont, standingGroupTextRect,\n                                  Color.White, Color.Transparent, Format);\n\n            // Draws the collapsing arrows\n            bool isCollapsed = m_collapsedGroups.Contains(group);\n            Image img = isCollapsed ? Resources.Expand : Resources.Collapse;\n\n            g.DrawImageUnscaled(img, new Rectangle(e.Bounds.Right - img.Width - CollapserPadRight,\n                                                   ContactGroupHeaderHeight / 2 - img.Height / 2 + e.Bounds.Top,\n                                                   img.Width, img.Height));\n        }\n\n        /// <summary>\n        /// Gets the preferred size from the preferred size of the list.\n        /// </summary>\n        /// <param name=\"proposedSize\"></param>\n        /// <returns></returns>\n        public override Size GetPreferredSize(Size proposedSize) => lbContacts.GetPreferredSize(proposedSize);\n\n        #endregion\n\n\n        #region Local events\n\n        /// <summary>\n        /// Handles the ContactImageUpdated event of the contact control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void contact_ContactImageUpdated(object sender, EventArgs e)\n        {\n            // Force to redraw\n            lbContacts.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the MouseWheel event of the lbContacts control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbContacts_MouseWheel(object sender, MouseEventArgs e)\n        {\n            if (e.Delta == 0)\n                return;\n\n            // Update the drawing based upon the mouse wheel scrolling\n            int numberOfItemLinesToMove = e.Delta * SystemInformation.MouseWheelScrollLines / Math.Abs(e.Delta);\n            int lines = numberOfItemLinesToMove;\n            if (lines == 0)\n                return;\n\n            // Compute the number of lines to move\n            int direction = lines / Math.Abs(lines);\n            int[] numberOfPixelsToMove = new int[lines * direction];\n            for (int i = 1; i <= Math.Abs(lines); i++)\n            {\n                object item = null;\n\n                // Going up\n                if (direction == Math.Abs(direction))\n                {\n                    // Retrieve the next top item\n                    if (lbContacts.TopIndex - i >= 0)\n                        item = lbContacts.Items[lbContacts.TopIndex - i];\n                }\n                    // Going down\n                else\n                {\n                    // Compute the height of the items from current the topindex (included)\n                    int height = 0;\n                    for (int j = lbContacts.TopIndex + i - 1; j < lbContacts.Items.Count; j++)\n                    {\n                        height += GetItemHeight(lbContacts.Items[j]);\n                    }\n\n                    // Retrieve the next bottom item\n                    if (height > lbContacts.ClientSize.Height)\n                        item = lbContacts.Items[lbContacts.TopIndex + i - 1];\n                }\n\n                // If found a new item as top or bottom\n                if (item != null)\n                    numberOfPixelsToMove[i - 1] = GetItemHeight(item) * direction;\n                else\n                    lines -= direction;\n            }\n\n            // Scroll \n            if (lines != 0)\n                lbContacts.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the lbContacts control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbContacts_MouseDown(object sender, MouseEventArgs e)\n        {\n            int index = lbContacts.IndexFromPoint(e.Location);\n            if (index < 0 || index >= lbContacts.Items.Count)\n                return;\n\n            Rectangle itemRect;\n\n            // Beware, this last index may actually means a click in the whitespace at the bottom\n            // Let's deal with this special case\n            if (index == lbContacts.Items.Count - 1)\n            {\n                itemRect = lbContacts.GetItemRectangle(index);\n                if (!itemRect.Contains(e.Location))\n                    return;\n            }\n\n            // For a standings group, we have to handle the collapse/expand mechanism\n            object item = lbContacts.Items[index];\n            string contactsGroup = item as string;\n            if (contactsGroup == null)\n                return;\n\n            // Left button : expand/collapse\n            if (e.Button != MouseButtons.Right)\n            {\n                ToggleGroupExpandCollapse(contactsGroup);\n                return;\n            }\n\n            // If right click on the button, still expand/collapse\n            itemRect = lbContacts.GetItemRectangle(lbContacts.Items.IndexOf(item));\n            Rectangle buttonRect = GetButtonRectangle(contactsGroup, itemRect);\n            if (buttonRect.Contains(e.Location))\n                ToggleGroupExpandCollapse(contactsGroup);\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Toggles the expansion or collapsing of a single group\n        /// </summary>\n        /// <param name=\"group\">The group to expand or collapse.</param>\n        private void ToggleGroupExpandCollapse(string group)\n        {\n            if (m_collapsedGroups.Contains(group))\n            {\n                m_collapsedGroups.Remove(group);\n                UpdateContent();\n            }\n            else\n            {\n                m_collapsedGroups.Add(group);\n                UpdateContent();\n            }\n        }\n\n        /// <summary>\n        /// Gets the rectangle for the collapse/expand button.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <param name=\"itemRect\">The item rect.</param>\n        /// <returns></returns>\n        private Rectangle GetButtonRectangle(string group, Rectangle itemRect)\n        {\n            // Checks whether this group is collapsed\n            bool isCollapsed = m_collapsedGroups.Contains(group);\n\n            // Get the image for this state\n            Image btnImage = isCollapsed ? Resources.Expand : Resources.Collapse;\n\n            // Compute the top left point\n            Point btnPoint = new Point(itemRect.Right - btnImage.Width - CollapserPadRight,\n                                       ContactGroupHeaderHeight / 2 - btnImage.Height / 2 + itemRect.Top);\n\n            return new Rectangle(btnPoint, btnImage.Size);\n        }\n\n        #endregion\n\n\n        #region Global events\n\n        /// <summary>\n        /// When the character standings update, we refresh the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterContactsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the settings change we update the content.\n        /// </summary>\n        /// <remarks>In case 'SafeForWork' gets enabled.</remarks>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When ID to namae is updated we update the content.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterContactList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterContractsList.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterContractsList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterContractsList));\n            this.noContractsLabel = new System.Windows.Forms.Label();\n            this.lvContracts = new System.Windows.Forms.ListView();\n            this.chContract = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chStatus = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chIssuer = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chAssignee = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chIssued = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chRemainingTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.showDetailsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showDetailsMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.showInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInBrowserMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.ilIcons = new System.Windows.Forms.ImageList(this.components);\n            this.contextMenu.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // noContractsLabel\n            // \n            this.noContractsLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noContractsLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noContractsLabel.Location = new System.Drawing.Point(0, 0);\n            this.noContractsLabel.Name = \"noContractsLabel\";\n            this.noContractsLabel.Size = new System.Drawing.Size(454, 434);\n            this.noContractsLabel.TabIndex = 2;\n            this.noContractsLabel.Text = \"No contracts are available.\";\n            this.noContractsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lvContracts\n            // \n            this.lvContracts.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lvContracts.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chContract,\n            this.chType,\n            this.chStatus,\n            this.chIssuer,\n            this.chAssignee,\n            this.chIssued,\n            this.chRemainingTime});\n            this.lvContracts.ContextMenuStrip = this.contextMenu;\n            this.lvContracts.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvContracts.FullRowSelect = true;\n            this.lvContracts.HideSelection = false;\n            this.lvContracts.Location = new System.Drawing.Point(0, 0);\n            this.lvContracts.MultiSelect = false;\n            this.lvContracts.Name = \"lvContracts\";\n            this.lvContracts.Size = new System.Drawing.Size(454, 434);\n            this.lvContracts.SmallImageList = this.ilIcons;\n            this.lvContracts.TabIndex = 3;\n            this.lvContracts.UseCompatibleStateImageBehavior = false;\n            this.lvContracts.View = System.Windows.Forms.View.Details;\n            this.lvContracts.DoubleClick += new System.EventHandler(this.lvContracts_DoubleClick);\n            // \n            // chContract\n            // \n            this.chContract.Text = \"Contract\";\n            // \n            // chType\n            // \n            this.chType.Text = \"Type\";\n            // \n            // chStatus\n            // \n            this.chStatus.Text = \"Status\";\n            // \n            // chIssuer\n            // \n            this.chIssuer.Text = \"From\";\n            // \n            // chAssignee\n            // \n            this.chAssignee.Text = \"To\";\n            // \n            // chIssued\n            // \n            this.chIssued.Text = \"Date Issued\";\n            // \n            // chRemainingTime\n            // \n            this.chRemainingTime.Text = \"Time Left\";\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showDetailsToolStripMenuItem,\n            this.showDetailsMenuSeparator,\n            this.showInBrowserMenuItem,\n            this.showInBrowserMenuSeparator,\n            this.exportToCSVToolStripMenuItem});\n            this.contextMenu.Name = \"contextMenu\";\n            this.contextMenu.Size = new System.Drawing.Size(171, 82);\n            this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenu_Opening);\n            // \n            // showDetailsToolStripMenuItem\n            // \n            this.showDetailsToolStripMenuItem.Name = \"showDetailsToolStripMenuItem\";\n            this.showDetailsToolStripMenuItem.Size = new System.Drawing.Size(170, 22);\n            this.showDetailsToolStripMenuItem.Text = \"Show Details...\";\n            this.showDetailsToolStripMenuItem.Click += new System.EventHandler(this.showDetailsToolStripMenuItem_Click);\n            // \n            // showDetailsMenuSeparator\n            // \n            this.showDetailsMenuSeparator.Name = \"showDetailsMenuSeparator\";\n            this.showDetailsMenuSeparator.Size = new System.Drawing.Size(167, 6);\n            // \n            // showInBrowserMenuItem\n            // \n            this.showInBrowserMenuItem.Name = \"showInBrowserMenuItem\";\n            this.showInBrowserMenuItem.Size = new System.Drawing.Size(170, 22);\n            this.showInBrowserMenuItem.Text = \"Show In Browser...\";\n            this.showInBrowserMenuItem.Click += new System.EventHandler(this.showInBrowserMenuItem_Click);\n            // \n            // showInBrowserMenuSeparator\n            // \n            this.showInBrowserMenuSeparator.Name = \"showInBrowserMenuSeparator\";\n            this.showInBrowserMenuSeparator.Size = new System.Drawing.Size(167, 6);\n            // \n            // exportToCSVToolStripMenuItem\n            // \n            this.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n            this.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(170, 22);\n            this.exportToCSVToolStripMenuItem.Text = \"Export To CSV...\";\n            this.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n            // \n            // ilIcons\n            // \n            this.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n            this.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilIcons.Images.SetKeyName(0, \"arrow_up.png\");\n            this.ilIcons.Images.SetKeyName(1, \"arrow_down.png\");\n            this.ilIcons.Images.SetKeyName(2, \"16x16Transparant.png\");\n            // \n            // CharacterContractsList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.lvContracts);\n            this.Controls.Add(this.noContractsLabel);\n            this.Name = \"CharacterContractsList\";\n            this.Size = new System.Drawing.Size(454, 434);\n            this.contextMenu.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noContractsLabel;\n        private System.Windows.Forms.ListView lvContracts;\n        private System.Windows.Forms.ColumnHeader chContract;\n        private System.Windows.Forms.ColumnHeader chType;\n        private System.Windows.Forms.ColumnHeader chIssuer;\n        private System.Windows.Forms.ColumnHeader chAssignee;\n        private System.Windows.Forms.ColumnHeader chIssued;\n        private System.Windows.Forms.ColumnHeader chStatus;\n        private System.Windows.Forms.ColumnHeader chRemainingTime;\n        private System.Windows.Forms.ImageList ilIcons;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem showDetailsToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator showDetailsMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem showInBrowserMenuItem;\n        private System.Windows.Forms.ToolStripSeparator showInBrowserMenuSeparator;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterContractsList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.DetailsWindow;\nusing EVEMon.SkillPlanner;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterContractsList : UserControl, IListView\n    {\n        #region Fields\n\n        private readonly List<ContractColumnSettings> m_columns = new List<ContractColumnSettings>();\n        private readonly List<Contract> m_list = new List<Contract>();\n\n        private InfiniteDisplayToolTip m_tooltip;\n        private ContractGrouping m_grouping;\n        private ContractColumn m_sortCriteria;\n        private IssuedFor m_showIssuedFor;\n\n        private string m_textFilter = string.Empty;\n        private bool m_sortAscending = true;\n\n        private bool m_isUpdatingColumns;\n        private bool m_columnsChanged;\n        private bool m_init;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public CharacterContractsList()\n        {\n            InitializeComponent();\n\n            lvContracts.Hide();\n            lvContracts.AllowColumnReorder = true;\n            lvContracts.Columns.Clear();\n\n            m_showIssuedFor = IssuedFor.All;\n\n            showDetailsToolStripMenuItem.Font = FontFactory.GetFont(\"Segoe UI\", 9F, FontStyle.Bold);\n            noContractsLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n\n            ListViewHelper.EnableDoubleBuffer(lvContracts);\n\n            lvContracts.ColumnClick += lvContracts_ColumnClick;\n            lvContracts.ColumnWidthChanged += lvContracts_ColumnWidthChanged;\n            lvContracts.ColumnReordered += lvContracts_ColumnReordered;\n            lvContracts.MouseDown += listView_MouseDown;\n            lvContracts.MouseMove += listView_MouseMove;\n            lvContracts.MouseLeave += listView_MouseLeave;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"lvContracts\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        internal bool Visibility\n        {\n            get { return lvContracts.Visible; }\n            set { lvContracts.Visible = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets the text filter.\n        /// </summary>\n        [Browsable(false)]\n        public string TextFilter\n        {\n            get { return m_textFilter; }\n            set\n            {\n                m_textFilter = value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of research points to display.\n        /// </summary>\n        internal IEnumerable<Contract> Contracts\n        {\n            get { return m_list; }\n            set\n            {\n                m_list.Clear();\n                if (value == null)\n                    return;\n\n                m_list.AddRange(value);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping mode.\n        /// </summary>\n        [Browsable(false)]\n        public Enum Grouping\n        {\n            get { return m_grouping; }\n            set\n            {\n                m_grouping = (ContractGrouping)value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets which \"Issued for\" contracts to display.\n        /// </summary>\n        internal IssuedFor ShowIssuedFor\n        {\n            get { return m_showIssuedFor; }\n            set\n            {\n                m_showIssuedFor = value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the settings used for columns.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        public IEnumerable<IColumnSettings> Columns\n        {\n            get\n            {\n                // Add the visible columns; matching the display order\n                List<ContractColumnSettings> newColumns = new List<ContractColumnSettings>();\n                foreach (ColumnHeader header in lvContracts.Columns.Cast<ColumnHeader>().OrderBy(x => x.DisplayIndex))\n                {\n                    ContractColumnSettings columnSetting = m_columns.First(x => x.Column == (ContractColumn)header.Tag);\n                    if (columnSetting.Width > -1)\n                        columnSetting.Width = header.Width;\n\n                    newColumns.Add(columnSetting);\n                }\n\n                // Then add the other columns\n                newColumns.AddRange(m_columns.Where(x => !x.Visible));\n\n                return newColumns;\n            }\n            set\n            {\n                m_columns.Clear();\n                if (value != null)\n                    m_columns.AddRange(value.Cast<ContractColumnSettings>());\n\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        #endregion\n\n\n        # region Inherited Events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            m_tooltip = new InfiniteDisplayToolTip(lvContracts);\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.ContractsUpdated += EveMonClient_ContractsUpdated;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            EveMonClient.ConquerableStationListUpdated += EveMonClient_ConquerableStationListUpdated;\n            EveMonClient.CharacterContractItemsDownloaded += EveMonClient_ContractItemsDownloaded;\n            EveMonClient.CorporationContractItemsDownloaded += EveMonClient_ContractItemsDownloaded;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            m_tooltip.Dispose();\n\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.ContractsUpdated -= EveMonClient_ContractsUpdated;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            EveMonClient.ConquerableStationListUpdated -= EveMonClient_ConquerableStationListUpdated;\n            EveMonClient.CharacterContractItemsDownloaded -= EveMonClient_ContractItemsDownloaded;\n            EveMonClient.CorporationContractItemsDownloaded -= EveMonClient_ContractItemsDownloaded;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (DesignMode || this.IsDesignModeHosted() || Character == null || !Visible)\n                return;\n\n            // Prevents the properties to call UpdateColumns() till we set all properties\n            m_init = false;\n\n            lvContracts.Visible = false;\n\n            Contracts = Character?.Contracts;\n            Columns = Settings.UI.MainWindow.Contracts.Columns;\n            Grouping = Character?.UISettings.ContractsGroupBy;\n            TextFilter = string.Empty;\n\n            UpdateColumns();\n\n            m_init = true;\n\n            UpdateListVisibility();\n        }\n\n        # endregion\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Autoresizes the columns.\n        /// </summary>\n        public void AutoResizeColumns()\n        {\n            m_columns.ForEach(column =>\n            {\n                if (column.Visible)\n                    column.Width = -2;\n            });\n\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// Updates the columns.\n        /// </summary>\n        internal void UpdateColumns()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            lvContracts.BeginUpdate();\n            m_isUpdatingColumns = true;\n\n            try\n            {\n                lvContracts.Columns.Clear();\n                lvContracts.Groups.Clear();\n                lvContracts.Items.Clear();\n\n                foreach (ContractColumnSettings column in m_columns.Where(x => x.Visible))\n                {\n                    ColumnHeader header = lvContracts.Columns.Add(column.Column.GetHeader(), column.Width);\n                    header.Tag = column.Column;\n\n                    switch (column.Column)\n                    {\n                        case ContractColumn.Price:\n                        case ContractColumn.Reward:\n                        case ContractColumn.Collateral:\n                        case ContractColumn.Buyout:\n                        case ContractColumn.Volume:\n                        case ContractColumn.Issued:\n                        case ContractColumn.Duration:\n                        case ContractColumn.DaysToComplete:\n                            header.TextAlign = HorizontalAlignment.Right;\n                            break;\n                    }\n                }\n\n                // We update the content\n                UpdateContent();\n            }\n            finally\n            {\n                lvContracts.EndUpdate();\n                m_isUpdatingColumns = false;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            int scrollBarPosition = lvContracts.GetVerticalScrollBarPosition();\n\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = lvContracts.SelectedItems.Count > 0 ? lvContracts.\n                SelectedItems[0].Tag.GetHashCode() : 0;\n\n            lvContracts.BeginUpdate();\n            try\n            {\n                bool filterInactive = Character != null && Settings.UI.MainWindow.Contracts.\n                    HideInactiveContracts, filterIssued = m_showIssuedFor != IssuedFor.All;\n                var contracts = new LinkedList<Contract>();\n                foreach (var con in m_list)\n                    // Filter on valid contracts matching text\n                    if (con.ContractType != ContractType.None && con.StartStation != null &&\n                        con.EndStation != null && IsTextMatching(con, m_textFilter))\n                    {\n                        con.UpdateContractItems();\n                        // Filter on issued type and availability\n                        if ((!filterIssued || con.IssuedFor == m_showIssuedFor) &&\n                            (!filterInactive || con.IsAvailable || con.NeedsAttention))\n                        contracts.AddLast(con);\n                    }\n\n                UpdateSort();\n                UpdateContentByGroup(contracts);\n\n                // Restore the selected item (if any)\n                if (selectedItem > 0)\n                {\n                    foreach (ListViewItem lvItem in lvContracts.Items.Cast<ListViewItem>().Where(\n                        lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                    {\n                        lvItem.Selected = true;\n                    }\n                }\n\n                // Adjust the size of the columns\n                AdjustColumns();\n\n                UpdateListVisibility();\n            }\n            finally\n            {\n                lvContracts.EndUpdate();\n                lvContracts.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Updates the list visibility.\n        /// </summary>\n        private void UpdateListVisibility()\n        {\n            // Display or hide the \"no contracts\" label\n            if (!m_init)\n                return;\n\n            noContractsLabel.Visible = lvContracts.Items.Count == 0;\n            lvContracts.Visible = !noContractsLabel.Visible;\n        }\n\n        /// <summary>\n        /// Updates the content by group.\n        /// </summary>\n        /// <param name=\"contracts\">The contracts.</param>\n        private void UpdateContentByGroup(IEnumerable<Contract> contracts)\n        {\n            switch (m_grouping)\n            {\n                case ContractGrouping.State:\n                    IOrderedEnumerable<IGrouping<ContractState, Contract>> groups0 =\n                        contracts.GroupBy(x => x.State).OrderBy(x => (int)x.Key);\n                    UpdateContent(groups0);\n                    break;\n                case ContractGrouping.StateDesc:\n                    IOrderedEnumerable<IGrouping<ContractState, Contract>> groups1 =\n                        contracts.GroupBy(x => x.State).OrderByDescending(x => (int)x.Key);\n                    UpdateContent(groups1);\n                    break;\n                case ContractGrouping.Issued:\n                    IOrderedEnumerable<IGrouping<DateTime, Contract>> groups4 =\n                        contracts.GroupBy(x => x.Issued.ToLocalTime().Date).OrderBy(x => x.Key);\n                    UpdateContent(groups4);\n                    break;\n                case ContractGrouping.IssuedDesc:\n                    IOrderedEnumerable<IGrouping<DateTime, Contract>> groups5 =\n                        contracts.GroupBy(x => x.Issued.ToLocalTime().Date).OrderByDescending(x => x.Key);\n                    UpdateContent(groups5);\n                    break;\n                case ContractGrouping.ContractType:\n                    IOrderedEnumerable<IGrouping<ContractType, Contract>> groups6 =\n                        contracts.GroupBy(x => x.ContractType).OrderBy(x => x.Key);\n                    UpdateContent(groups6);\n                    break;\n                case ContractGrouping.ContractTypeDesc:\n                    IOrderedEnumerable<IGrouping<ContractType, Contract>> groups7 =\n                        contracts.GroupBy(x => x.ContractType).OrderByDescending(x => x.Key);\n                    UpdateContent(groups7);\n                    break;\n                case ContractGrouping.StartLocation:\n                    IOrderedEnumerable<IGrouping<Station, Contract>> groups8 =\n                        contracts.GroupBy(x => x.StartStation).OrderBy(x => x.Key.Name);\n                    UpdateContent(groups8);\n                    break;\n                case ContractGrouping.StartLocationDesc:\n                    IOrderedEnumerable<IGrouping<Station, Contract>> groups9 =\n                        contracts.GroupBy(x => x.StartStation).OrderByDescending(x => x.Key.Name);\n                    UpdateContent(groups9);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        /// <typeparam name=\"TKey\"></typeparam>\n        /// <param name=\"groups\"></param>\n        private void UpdateContent<TKey>(IEnumerable<IGrouping<TKey, Contract>> groups)\n        {\n            lvContracts.Items.Clear();\n            lvContracts.Groups.Clear();\n\n            // Add the groups\n            foreach (IGrouping<TKey, Contract> group in groups)\n            {\n                string groupText;\n                if (group.Key is ContractState)\n                    groupText = ((ContractState)(object)group.Key).GetHeader();\n                else if (group.Key is ContractType)\n                    groupText = ((ContractType)(object)group.Key).GetDescription();\n                else if (group.Key is DateTime)\n                    groupText = ((DateTime)(object)group.Key).ToShortDateString();\n                else\n                    groupText = group.Key.ToString();\n\n                ListViewGroup listGroup = new ListViewGroup(groupText);\n                lvContracts.Groups.Add(listGroup);\n\n                // Add the items in every group\n                lvContracts.Items.AddRange(\n                    group.Select(contract =>\n                        new\n                        {\n                            contract,\n                            item = new ListViewItem(contract.ContractText, listGroup)\n                            {\n                                UseItemStyleForSubItems = false,\n                                Tag = contract\n                            }\n                        }).Select(x => CreateSubItems(x.contract, x.item)).ToArray());\n            }\n        }\n\n        /// <summary>\n        /// Creates the list view sub items.\n        /// </summary>\n        /// <param name=\"contract\">The contract.</param>\n        /// <param name=\"item\">The item.</param>\n        private ListViewItem CreateSubItems(Contract contract, ListViewItem item)\n        {\n            // Display text as dimmed if the contract is no longer available\n            if (!contract.IsAvailable && !contract.NeedsAttention)\n                item.ForeColor = SystemColors.GrayText;\n\n            // Add enough subitems to match the number of columns\n            while (item.SubItems.Count < lvContracts.Columns.Count + 1)\n            {\n                item.SubItems.Add(string.Empty);\n            }\n\n            // Creates the subitems\n            for (int i = 0; i < lvContracts.Columns.Count; i++)\n            {\n                ContractColumn column = (ContractColumn)lvContracts.Columns[i].Tag;\n                SetColumn(contract, item.SubItems[i], column);\n            }\n\n            // Tooltip\n            var builder = new StringBuilder();\n            builder.Append($\"Issued For: {contract.IssuedFor}\").AppendLine();\n            builder.Append($\"Issued: {contract.Issued.ToLocalTime()}\").AppendLine();\n            builder.Append($\"Duration: {contract.Duration} \");\n            builder.Append($\"Day{(contract.Duration.S())}\").AppendLine();\n\n            if (contract.ContractType == ContractType.Courier)\n            {\n                builder.Append($\"Days To Complete: {contract.DaysToComplete} \");\n                builder.Append($\"Day{(contract.DaysToComplete.S())}\");\n                builder.AppendLine();\n            }\n\n            string prefix = contract.ContractType == ContractType.Courier ? \"Starting \" :\n                string.Empty;\n            string startSS = contract.StartStation.SolarSystem?.FullLocation ??\n                EveMonConstants.UnknownText;\n            builder.Append($\"{prefix}Solar System: {startSS}\").AppendLine();\n            builder.Append($\"{prefix}Station: {contract.StartStation.Name}\").AppendLine();\n\n            if (contract.ContractType == ContractType.Courier)\n            {\n                string endSS = contract.EndStation.SolarSystem?.FullLocation ??\n                    EveMonConstants.UnknownText;\n                builder.Append($\"Ending Solar System: {endSS}\").AppendLine();\n                builder.Append($\"Ending Station: {contract.EndStation.Name}\").AppendLine();\n            }\n\n            item.ToolTipText = builder.ToString();\n\n            return item;\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvContracts.Columns)\n            {\n                if (m_columns[column.Index].Width == -1)\n                    m_columns[column.Index].Width = -2;\n\n                column.Width = m_columns[column.Index].Width;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column and not set to auto-resize\n                if (column.Index != lvContracts.Columns.Count - 1 || m_columns[column.Index].Width != -2)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvContracts.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvContracts.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        /// <summary>\n        /// Updates the item sorter.\n        /// </summary>\n        private void UpdateSort()\n        {\n            lvContracts.ListViewItemSorter = new ListViewItemComparerByTag<Contract>(\n                new ContractComparer(m_sortCriteria, m_sortAscending));\n\n            UpdateSortVisualFeedback();\n        }\n\n        /// <summary>\n        /// Updates the sort feedback (the arrow on the header).\n        /// </summary>\n        private void UpdateSortVisualFeedback()\n        {\n            foreach (ColumnHeader columnHeader in lvContracts.Columns.Cast<ColumnHeader>())\n            {\n                ContractColumn column = (ContractColumn)columnHeader.Tag;\n                if (m_sortCriteria == column)\n                    columnHeader.ImageIndex = m_sortAscending ? 0 : 1;\n                else\n                    columnHeader.ImageIndex = 2;\n            }\n        }\n\n        /// <summary>\n        /// Formats the price according to the settings.\n        /// </summary>\n        /// <param name=\"price\">The price to display.</param>\n        /// <returns>The price as a string.</returns>\n        private static string FormatPrice(decimal price)\n        {\n            return FormatHelper.FormatIf(Settings.UI.MainWindow.Contracts.NumberAbsFormat,\n                2, price, AbbreviationFormat.AbbreviationSymbols);\n        }\n\n        /// <summary>\n        /// Updates the listview sub-item.\n        /// </summary>\n        /// <param name=\"contract\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"column\"></param>\n        private static void SetColumn(Contract contract, ListViewItem.ListViewSubItem item, ContractColumn column)\n        {\n            Station start = contract.StartStation, end = contract.EndStation;\n            switch (column)\n            {\n            case ContractColumn.Status:\n                item.Text = contract.Status.GetDescription();\n                item.ForeColor = contract.Overdue ? Color.Red : Color.Black;\n                break;\n            case ContractColumn.ContractText:\n                item.Text = contract.ContractText;\n                break;\n            case ContractColumn.Title:\n                item.Text = contract.Description;\n                break;\n            case ContractColumn.ContractType:\n                item.Text = contract.ContractType.GetDescription();\n                break;\n            case ContractColumn.Issuer:\n                item.Text = contract.Issuer;\n                break;\n            case ContractColumn.Assignee:\n                item.Text = contract.Assignee;\n                break;\n            case ContractColumn.Acceptor:\n                item.Text = contract.Acceptor;\n                break;\n            case ContractColumn.Availability:\n                item.Text = contract.Availability.GetDescription();\n                break;\n            case ContractColumn.Price:\n                item.Text = FormatPrice(contract.Price);\n                break;\n            case ContractColumn.Buyout:\n                item.Text = FormatPrice(contract.Buyout);\n                break;\n            case ContractColumn.Reward:\n                item.Text = FormatPrice(contract.Reward);\n                break;\n            case ContractColumn.Collateral:\n                item.Text = FormatPrice(contract.Collateral);\n                break;\n            case ContractColumn.Volume:\n                item.Text = FormatPrice(contract.Volume);\n                break;\n            case ContractColumn.StartLocation:\n                item.Text = start.FullLocation;\n                break;\n            case ContractColumn.StartRegion:\n                item.Text = start.SolarSystemChecked.Constellation.Region.Name;\n                break;\n            case ContractColumn.StartSolarSystem:\n                item.Text = start.SolarSystemChecked.Name;\n                item.ForeColor = start.SolarSystemChecked.SecurityLevelColor;\n                break;\n            case ContractColumn.StartStation:\n                item.Text = start.Name;\n                break;\n            case ContractColumn.EndLocation:\n                item.Text = end.FullLocation;\n                break;\n            case ContractColumn.EndRegion:\n                item.Text = end.SolarSystemChecked.Constellation.Region.Name;\n                break;\n            case ContractColumn.EndSolarSystem:\n                item.Text = end.SolarSystemChecked.Name;\n                item.ForeColor = end.SolarSystemChecked.SecurityLevelColor;\n                break;\n            case ContractColumn.EndStation:\n                item.Text = end.Name;\n                break;\n            case ContractColumn.Issued:\n                item.Text = contract.Issued.ToLocalTime().ToShortDateString();\n                break;\n            case ContractColumn.Accepted:\n                item.Text = contract.Accepted == DateTime.MinValue ? string.Empty : contract.\n                    Accepted.ToLocalTime().ToShortDateString();\n                break;\n            case ContractColumn.Completed:\n                item.Text = contract.Completed == DateTime.MinValue ? string.Empty : contract.\n                    Completed.ToLocalTime().ToShortDateString();\n                break;\n            case ContractColumn.Duration:\n                item.Text = $\"{contract.Duration} Day{(contract.Duration.S())}\";\n                break;\n            case ContractColumn.DaysToComplete:\n                item.Text = contract.DaysToComplete == 0 ? string.Empty :\n                    $\"{contract.DaysToComplete} Day{(contract.DaysToComplete.S())}\";\n                break;\n            case ContractColumn.Expiration:\n                ListViewItemFormat format = FormatExpiration(contract);\n                item.Text = format.Text;\n                item.ForeColor = format.TextColor;\n                break;\n            case ContractColumn.IssuedFor:\n                item.Text = contract.IssuedFor.ToString();\n                break;\n            default:\n                throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Checks the given text matches the item.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if [is text matching] [the specified x]; otherwise, <c>false</c>.\n        /// </returns>\n        private static bool IsTextMatching(Contract x, string text)\n            => string.IsNullOrEmpty(text) ||\n               x.Status.GetDescription().ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.ContractText.ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.ContractType.GetDescription().ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.Issuer.ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.Assignee.ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.Acceptor.ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.Description.ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.Availability.GetDescription().ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.StartStation.Name.ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.StartStation.SolarSystemChecked.Name.ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.StartStation.SolarSystemChecked.Constellation.Name.ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.StartStation.SolarSystemChecked.Constellation.Region.Name.ToUpperInvariant().Contains(text, ignoreCase: true);\n\n        /// <summary>\n        /// Gets the text and formatting for the expiration cell\n        /// </summary>\n        /// <param name=\"contract\">Contract to generate a format for</param>\n        /// <returns>ListViewItemFormat object describing the format of the cell</returns>\n        private static ListViewItemFormat FormatExpiration(Contract contract)\n        {\n            // Initialize to sensible defaults\n            ListViewItemFormat format = new ListViewItemFormat\n            {\n                TextColor = Color.Black,\n                Text = contract.Expiration.ToRemainingTimeShortDescription(DateTimeKind.Utc)\n                    .ToUpper(CultureConstants.DefaultCulture)\n            };\n\n            // Contract is expiring soon\n            if (contract.IsAvailable && contract.Expiration < DateTime.UtcNow.AddDays(1))\n                format.TextColor = Color.DarkOrange;\n\n            // We have all the information for formatting an available order\n            if (contract.IsAvailable)\n                return format;\n\n            // Contract isn't available so lets format it as such\n            format.Text = contract.State.ToString();\n\n            if (contract.State == ContractState.Expired)\n                format.TextColor = Color.Red;\n\n            if (contract.State == ContractState.Rejected || contract.State == ContractState.Failed)\n                format.TextColor = Color.DarkRed;\n\n            if (contract.State == ContractState.Finished)\n                format.TextColor = Color.DarkGreen;\n\n            return format;\n        }\n\n        /// <summary>\n        /// Shows the contract details.\n        /// </summary>\n        private void ShowContractDetails()\n        {\n            var items = lvContracts.SelectedItems;\n            if (items.Count > 0)\n            {\n                // Fixes a bug where double clicks as the list was updating would crash\n                var contract = items[0].Tag as Contract;\n                if (contract != null && contract.ContractType == ContractType.Courier ||\n                    contract.ContractItems.Any())\n                    WindowsFactory.ShowByTag<ContractDetailsWindow, Contract>(contract);\n            }\n        }\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Exports item info to CSV format.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(lvContracts);\n        }\n\n        /// <summary>\n        /// On double click shows the contract details window.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void lvContracts_DoubleClick(object sender, EventArgs e)\n        {\n            ShowContractDetails();\n        }\n\n        /// <summary>\n        /// On column reorder we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvContracts_ColumnReordered(object sender, ColumnReorderedEventArgs e)\n        {\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user manually resizes a column, we make sure to update the column preferences.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvContracts_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)\n        {\n            if (m_isUpdatingColumns || m_columns.Count <= e.ColumnIndex)\n                return;\n\n            if (m_columns[e.ColumnIndex].Width == lvContracts.Columns[e.ColumnIndex].Width)\n                return;\n\n            m_columns[e.ColumnIndex].Width = lvContracts.Columns[e.ColumnIndex].Width;\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user clicks a column header, we update the sorting.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvContracts_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            ContractColumn column = (ContractColumn)lvContracts.Columns[e.Column].Tag;\n            if (m_sortCriteria == column)\n                m_sortAscending = !m_sortAscending;\n            else\n            {\n                m_sortCriteria = column;\n                m_sortAscending = true;\n            }\n\n            m_isUpdatingColumns = true;\n\n            // Updates the item sorter\n            UpdateSort();\n\n            m_isUpdatingColumns = false;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lvContracts.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we show the item's tooltip if over an item.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvContracts.Cursor = CustomCursors.ContextMenu;\n\n            ListViewItem item = lvContracts.GetItemAt(e.Location.X, e.Location.Y);\n            if (item == null)\n            {\n                m_tooltip.Hide();\n                return;\n            }\n\n            m_tooltip.Show(item.ToolTipText, e.Location);\n        }\n\n        /// <summary>\n        /// When the mouse leaves the list, we hide the item's tooltip.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseLeave(object sender, EventArgs e)\n        {\n            m_tooltip.Hide();\n        }\n\n        /// <summary>\n        /// Upon selected shows the contract details window.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void showDetailsToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ShowContractDetails();\n        }\n\n        /// <summary>\n        /// Shows the context menu only when a contract is selected.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void contextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            bool visible = lvContracts.SelectedItems.Count != 0;\n\n            showDetailsToolStripMenuItem.Visible =\n                showDetailsMenuSeparator.Visible =\n                    showInBrowserMenuItem.Visible =\n                        showInBrowserMenuSeparator.Visible = visible;\n\n            if (!visible)\n                return;\n\n            Contract contract = lvContracts.SelectedItems[0]?.Tag as Contract;\n\n            if (contract?.ContractItems == null)\n                return;\n\n            visible = contract.ContractItems.Count() == 1;\n\n            showInBrowserMenuItem.Visible =\n                showInBrowserMenuSeparator.Visible = visible;\n\n            if (!visible)\n                return;\n\n            Item contractItem = contract.ContractItems.FirstOrDefault()?.Item;\n\n            if (contractItem == null)\n                return;\n\n            Blueprint blueprint = StaticBlueprints.GetBlueprintByID(contractItem.ID);\n            Ship ship = contractItem as Ship;\n            Skill skill = Character.Skills[contractItem.ID];\n\n            if (skill == Skill.UnknownSkill)\n                skill = null;\n\n            string text = ship != null ? \"Ship\" : blueprint != null ? \"Blueprint\" : skill != null ? \"Skill\" : \"Item\";\n\n            showInBrowserMenuItem.Text = $\"Show In {text} Browser...\";\n        }\n\n        /// <summary>\n        /// Handles the Click event of the showInBrowserMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void showInBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            Contract contract = lvContracts.SelectedItems[0]?.Tag as Contract;\n\n            Item contractItem = contract?.ContractItems?.FirstOrDefault()?.Item;\n\n            if (contractItem == null)\n                return;\n\n            Ship ship = contractItem as Ship;\n            Blueprint blueprint = StaticBlueprints.GetBlueprintByID(contractItem.ID);\n            Skill skill = Character.Skills[contractItem.ID];\n\n            if (skill == Skill.UnknownSkill)\n                skill = null;\n\n            PlanWindow planWindow = PlanWindow.ShowPlanWindow(Character);\n\n            if (ship != null)\n                planWindow.ShowShipInBrowser(ship);\n            else if (blueprint != null)\n                planWindow.ShowBlueprintInBrowser(blueprint);\n            else if (skill != null)\n                planWindow.ShowSkillInBrowser(skill);\n            else\n                planWindow.ShowItemInBrowser(contractItem);\n        }\n\n        # endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// On timer tick, we update the column settings if any changes have been made to them.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Visible || !m_columnsChanged)\n                return;\n\n            Settings.UI.MainWindow.Contracts.Columns.Clear();\n            Settings.UI.MainWindow.Contracts.Columns.AddRange(Columns.Cast<ContractColumnSettings>());\n\n            // Recreate the columns\n            Columns = Settings.UI.MainWindow.Contracts.Columns;\n            m_columnsChanged = false;\n        }\n\n        /// <summary>\n        /// When the contracts change, update the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.ContractsEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_ContractsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (Character == null || e.Character != Character)\n                return;\n\n            Contracts = Character.Contracts;\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// When the character contract items are downloaded, update the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_ContractItemsDownloaded(object sender, CharacterChangedEventArgs e)\n        {\n            if (Character == null || e.Character != Character)\n                return;\n\n            UpdateContent();\n        }\n        \n        /// <summary>\n        /// When the EveIDToName list updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// When Conquerable Station List updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_ConquerableStationListUpdated(object sender, EventArgs e)\n        {\n            if (Character == null)\n                return;\n\n            foreach (Contract contract in m_list)\n            {\n                contract.UpdateStation();\n            }\n\n            UpdateColumns();\n        }\n\n        # endregion\n\n\n        #region Helper Classes\n\n        private class ListViewItemFormat\n        {\n            /// <summary>\n            /// Gets or sets the color of the text.\n            /// </summary>\n            /// <value>The color of the text.</value>\n            public Color TextColor { get; set; }\n\n            /// <summary>\n            /// Gets or sets the text.\n            /// </summary>\n            /// <value>The text.</value>\n            public string Text { get; set; }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterContractsList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>103, 17</value>\n  </metadata>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        AAAAAk1TRnQBSQFMAgEBAwEAAXwBBQF8AQUBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABEAMAAQEBAAEQBgABCP8A/wD/AP8A/wD/AP8A/wAaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB\n        AQABAQUAAYAXAAP/AQAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAB8AEPAf4BfwL/AgAB+AEfAfwBPwL/\n        AgAB/AE/AfgBHwL/AgAB/gF/AfABDwL/AgAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAL\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterEmploymentHistoryList.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterEmploymentHistoryList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.noEmploymentHistoryLabel = new System.Windows.Forms.Label();\n            this.lbEmploymentHistory = new EVEMon.Common.Controls.NoFlickerListBox();\n            this.SuspendLayout();\n            // \n            // noEmploymentHistoryLabel\n            // \n            this.noEmploymentHistoryLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n            this.noEmploymentHistoryLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noEmploymentHistoryLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noEmploymentHistoryLabel.Location = new System.Drawing.Point(0, 0);\n            this.noEmploymentHistoryLabel.Name = \"noEmploymentHistoryLabel\";\n            this.noEmploymentHistoryLabel.Size = new System.Drawing.Size(328, 372);\n            this.noEmploymentHistoryLabel.TabIndex = 3;\n            this.noEmploymentHistoryLabel.Text = \"Employment History information not available.\";\n            this.noEmploymentHistoryLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lbEmploymentHistory\n            // \n            this.lbEmploymentHistory.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lbEmploymentHistory.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbEmploymentHistory.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;\n            this.lbEmploymentHistory.FormattingEnabled = true;\n            this.lbEmploymentHistory.IntegralHeight = false;\n            this.lbEmploymentHistory.ItemHeight = 15;\n            this.lbEmploymentHistory.Location = new System.Drawing.Point(0, 0);\n            this.lbEmploymentHistory.Margin = new System.Windows.Forms.Padding(0);\n            this.lbEmploymentHistory.Name = \"lbEmploymentHistory\";\n            this.lbEmploymentHistory.Size = new System.Drawing.Size(328, 372);\n            this.lbEmploymentHistory.TabIndex = 3;\n            this.lbEmploymentHistory.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.lbEmploymentHistory_DrawItem);\n            this.lbEmploymentHistory.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.lbEmploymentHistory_MeasureItem);\n            this.lbEmploymentHistory.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.lbEmploymentHistory_MouseWheel);\n            // \n            // CharacterEmploymentHistoryList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.noEmploymentHistoryLabel);\n            this.Controls.Add(this.lbEmploymentHistory);\n            this.Name = \"CharacterEmploymentHistoryList\";\n            this.Size = new System.Drawing.Size(328, 372);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noEmploymentHistoryLabel;\n        private Common.Controls.NoFlickerListBox lbEmploymentHistory;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterEmploymentHistoryList.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterEmploymentHistoryList : UserControl\n    {\n        #region Fields\n\n        private const int PadTop = 2;\n        private const int PadLeft = 6;\n        private const TextFormatFlags TextFormat = TextFormatFlags.NoPadding | TextFormatFlags.NoClipping;\n        private const string RecordDateFromText = \"From\";\n        private const string RecordDateToText = \"to\";\n        private const string RecordDateTodayText = \"this day\";\n\n        // Employment History drawing - Employment record\n        private const int EmploymentRecordDetailHeight = 34;\n\n        private readonly Font m_recordFont;\n        private readonly Font m_recordBoldFont;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CharacterEmploymentHistoryList\"/> class.\n        /// </summary>\n        public CharacterEmploymentHistoryList()\n        {\n            InitializeComponent();\n\n            lbEmploymentHistory.Visible = false;\n\n            m_recordFont = FontFactory.GetFont(\"Tahoma\", 8.25F);\n            m_recordBoldFont = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            noEmploymentHistoryLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n\n        /// <summary>\n        /// Gets the item's height.\n        /// </summary>\n        private int GetItemHeight => Math.Max(m_recordFont.Height * 2 + PadTop * 2, EmploymentRecordDetailHeight);\n\n        #endregion\n\n\n        #region Inherited events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.CharacterInfoUpdated += EveMonClient_CharacterInfoUpdated;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterInfoUpdated -= EveMonClient_CharacterInfoUpdated;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (Visible)\n                UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Content Management\n\n        /// <summary>\n        /// Updates all the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            // When no character, we just hide the list\n            if (Character == null)\n            {\n                noEmploymentHistoryLabel.Visible = true;\n                lbEmploymentHistory.Visible = false;\n                return;\n            }\n\n            int scrollBarPosition = lbEmploymentHistory.TopIndex;\n\n            // Update the skills list\n            lbEmploymentHistory.BeginUpdate();\n            try\n            {\n                // Add items in the list\n                lbEmploymentHistory.Items.Clear();\n                foreach (EmploymentRecord employmentRecord in Character.EmploymentHistory)\n                {\n                    employmentRecord.EmploymentRecordImageUpdated += record_EmploymentRecordImageUpdated;\n                    lbEmploymentHistory.Items.Add(employmentRecord);\n                }\n\n                // Display or hide the \"no skills\" label.\n                noEmploymentHistoryLabel.Visible = !Character.EmploymentHistory.Any();\n                lbEmploymentHistory.Visible = Character.EmploymentHistory.Any();\n\n                // Invalidate display\n                lbEmploymentHistory.Invalidate();\n            }\n            finally\n            {\n                lbEmploymentHistory.EndUpdate();\n                lbEmploymentHistory.TopIndex = scrollBarPosition;\n            }\n        }\n\n        #endregion\n\n\n        #region Drawing\n\n        /// <summary>\n        /// Handles the MeasureItem event of the lbEmploymentHistory control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MeasureItemEventArgs\"/> instance containing the event data.</param>\n        private void lbEmploymentHistory_MeasureItem(object sender, MeasureItemEventArgs e)\n        {\n            if (e.Index < 0)\n                return;\n\n            e.ItemHeight = GetItemHeight;\n        }\n\n        /// <summary>\n        /// Draws the list item for the given standing\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void lbEmploymentHistory_DrawItem(object sender, DrawItemEventArgs e)\n        {\n            if (e.Index < 0 || e.Index >= lbEmploymentHistory.Items.Count)\n                return;\n\n            Graphics g = e.Graphics;\n\n            EmploymentRecord record = (EmploymentRecord)lbEmploymentHistory.Items[e.Index];\n            EmploymentRecord previousRecord = e.Index == 0 ? null : (EmploymentRecord)lbEmploymentHistory.Items[e.Index - 1];\n\n            // Draw background\n            g.FillRectangle(e.Index % 2 == 0 ? Brushes.White : Brushes.LightGray, e.Bounds);\n\n            // Measure texts\n            DateTime dt = previousRecord?.StartDate ?? DateTime.UtcNow;\n            string recordPeriodText =\n                $\"( {dt.Subtract(record.StartDate).ToDescriptiveText(DescriptiveTextOptions.SpaceBetween, false)} )\";\n            string recordStartDateText = record.StartDate.ToLocalTime().DateTimeToDotFormattedString();\n            string recordEndDateText = previousRecord == null\n                                           ? RecordDateTodayText\n                                           : previousRecord.StartDate.ToLocalTime().DateTimeToDotFormattedString();\n\n            Size recordCorporationNameTextSize = TextRenderer.MeasureText(g, record.CorporationName, m_recordBoldFont, Size.Empty,\n                                                                          TextFormat);\n            Size recordPeriodTextSize = TextRenderer.MeasureText(g, recordPeriodText, m_recordFont, Size.Empty, TextFormat);\n            Size recordFromTextSize = TextRenderer.MeasureText(g, RecordDateFromText, m_recordFont, Size.Empty, TextFormat);\n            Size recordStartDateTextSize = TextRenderer.MeasureText(g, recordStartDateText, m_recordBoldFont, Size.Empty,\n                                                                    TextFormat);\n            Size recordToTextSize = TextRenderer.MeasureText(g, RecordDateToText, m_recordFont, Size.Empty, TextFormat);\n            Size recordEndDateTextSize = TextRenderer.MeasureText(g, recordEndDateText,\n                                                                  previousRecord == null ? m_recordFont : m_recordBoldFont,\n                                                                  Size.Empty, TextFormat);\n\n            // Draw texts\n            TextRenderer.DrawText(g, record.CorporationName, m_recordBoldFont,\n                                  new Rectangle(\n                                      e.Bounds.Left + PadLeft * 7,\n                                      e.Bounds.Top + PadTop,\n                                      recordCorporationNameTextSize.Width + PadLeft,\n                                      recordCorporationNameTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, RecordDateFromText, m_recordFont,\n                                  new Rectangle(\n                                      e.Bounds.Left + PadLeft * 7,\n                                      e.Bounds.Top + PadTop + recordCorporationNameTextSize.Height,\n                                      recordFromTextSize.Width + PadLeft,\n                                      recordFromTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, recordStartDateText, m_recordBoldFont,\n                                  new Rectangle(\n                                      e.Bounds.Left + PadLeft * 7 + recordFromTextSize.Width + PadLeft,\n                                      e.Bounds.Top + PadTop + recordCorporationNameTextSize.Height,\n                                      recordStartDateTextSize.Width + PadLeft,\n                                      recordStartDateTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, RecordDateToText, m_recordFont,\n                                  new Rectangle(\n                                      e.Bounds.Left + PadLeft * 7 + recordFromTextSize.Width + recordStartDateTextSize.Width +\n                                      PadLeft * 2,\n                                      e.Bounds.Top + PadTop + recordCorporationNameTextSize.Height,\n                                      recordToTextSize.Width + PadLeft,\n                                      recordToTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, recordEndDateText, previousRecord == null ? m_recordFont : m_recordBoldFont,\n                                  new Rectangle(\n                                      e.Bounds.Left + PadLeft * 7 + recordFromTextSize.Width + recordStartDateTextSize.Width +\n                                      recordToTextSize.Width + PadLeft * 3,\n                                      e.Bounds.Top + PadTop + recordCorporationNameTextSize.Height,\n                                      recordEndDateTextSize.Width + PadLeft,\n                                      recordEndDateTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, recordPeriodText, m_recordFont,\n                                  new Rectangle(\n                                      e.Bounds.Left + PadLeft * 7 + recordFromTextSize.Width + recordStartDateTextSize.Width +\n                                      recordToTextSize.Width + recordEndDateTextSize.Width + PadLeft * 4,\n                                      e.Bounds.Top + PadTop + recordCorporationNameTextSize.Height,\n                                      recordPeriodTextSize.Width + PadLeft,\n                                      recordPeriodTextSize.Height), Color.Black);\n\n            // Draw the corporation image\n            if (Settings.UI.SafeForWork)\n                return;\n\n            g.DrawImage(record.CorporationImage,\n                        new Rectangle(e.Bounds.Left + PadLeft / 2,\n                                      EmploymentRecordDetailHeight / 2 - record.CorporationImage.Height / 2 + e.Bounds.Top,\n                                      record.CorporationImage.Width, record.CorporationImage.Height));\n        }\n\n        /// <summary>\n        /// Gets the preferred size from the preferred size of the list.\n        /// </summary>\n        /// <param name=\"proposedSize\"></param>\n        /// <returns></returns>\n        public override Size GetPreferredSize(Size proposedSize) => lbEmploymentHistory.GetPreferredSize(proposedSize);\n\n        #endregion\n\n\n        #region Local events\n\n        /// <summary>\n        /// When the image updates, we redraw the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void record_EmploymentRecordImageUpdated(object sender, EventArgs e)\n        {\n            // Force to redraw\n            lbEmploymentHistory.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the MouseWheel event of the lbEmploymentHistory control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbEmploymentHistory_MouseWheel(object sender, MouseEventArgs e)\n        {\n            if (e.Delta == 0)\n                return;\n\n            // Update the drawing based upon the mouse wheel scrolling\n            int numberOfItemLinesToMove = e.Delta * SystemInformation.MouseWheelScrollLines / Math.Abs(e.Delta);\n            int lines = numberOfItemLinesToMove;\n            if (lines == 0)\n                return;\n\n            // Compute the number of lines to move\n            int direction = lines / Math.Abs(lines);\n            int[] numberOfPixelsToMove = new int[lines * direction];\n            for (int i = 1; i <= Math.Abs(lines); i++)\n            {\n                object item = null;\n\n                // Going up\n                if (direction == Math.Abs(direction))\n                {\n                    // Retrieve the next top item\n                    if (lbEmploymentHistory.TopIndex - i >= 0)\n                        item = lbEmploymentHistory.Items[lbEmploymentHistory.TopIndex - i];\n                }\n                    // Going down\n                else\n                {\n                    // Compute the height of the items from current the topindex (included)\n                    int height = 0;\n                    for (int j = lbEmploymentHistory.TopIndex + i - 1; j < lbEmploymentHistory.Items.Count; j++)\n                    {\n                        height += GetItemHeight;\n                    }\n\n                    // Retrieve the next bottom item\n                    if (height > lbEmploymentHistory.ClientSize.Height)\n                        item = lbEmploymentHistory.Items[lbEmploymentHistory.TopIndex + i - 1];\n                }\n\n                // If found a new item as top or bottom\n                if (item != null)\n                    numberOfPixelsToMove[i - 1] = GetItemHeight * direction;\n                else\n                    lines -= direction;\n            }\n\n            // Scroll \n            if (lines != 0)\n                lbEmploymentHistory.Invalidate();\n        }\n\n        #endregion\n\n\n        #region Global events\n\n        /// <summary>\n        /// When the character standings update, we update the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterInfoUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the settings change, we update the content.\n        /// </summary>\n        /// <remarks>In case 'SafeForWork' gets enabled.</remarks>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the EveIDToName updates, we refresh the content.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            // Force to redraw\n            lbEmploymentHistory.Invalidate();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterEmploymentHistoryList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterEveMailMessagesList.Designer.cs",
    "content": "using EVEMon.Controls;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterEveMailMessagesList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n\t\t\tthis.components = new System.ComponentModel.Container();\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterEveMailMessagesList));\n\t\t\tthis.ilIcons = new System.Windows.Forms.ImageList(this.components);\n\t\t\tthis.noEVEMailMessagesLabel = new System.Windows.Forms.Label();\n\t\t\tthis.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n\t\t\tthis.mailReadLocal = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.splitContainerMailMessages = new System.Windows.Forms.SplitContainer();\n\t\t\tthis.lvMailMessages = new System.Windows.Forms.ListView();\n\t\t\tthis.chSenderName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.chTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.chSentDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.chToCharacterIDs = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.chToCorpOrAlliance = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.chToListID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.eveMailReadingPane = new EVEMon.Controls.ReadingPane();\n\t\t\tthis.timer = new System.Windows.Forms.Timer(this.components);\n\t\t\tthis.contextMenu.SuspendLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.splitContainerMailMessages)).BeginInit();\n\t\t\tthis.splitContainerMailMessages.Panel1.SuspendLayout();\n\t\t\tthis.splitContainerMailMessages.Panel2.SuspendLayout();\n\t\t\tthis.splitContainerMailMessages.SuspendLayout();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// ilIcons\n\t\t\t// \n\t\t\tthis.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n\t\t\tthis.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n\t\t\tthis.ilIcons.Images.SetKeyName(0, \"arrow_up.png\");\n\t\t\tthis.ilIcons.Images.SetKeyName(1, \"arrow_down.png\");\n\t\t\tthis.ilIcons.Images.SetKeyName(2, \"16x16Transparant.png\");\n\t\t\t// \n\t\t\t// noEVEMailMessagesLabel\n\t\t\t// \n\t\t\tthis.noEVEMailMessagesLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.noEVEMailMessagesLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n\t\t\tthis.noEVEMailMessagesLabel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.noEVEMailMessagesLabel.Name = \"noEVEMailMessagesLabel\";\n\t\t\tthis.noEVEMailMessagesLabel.Size = new System.Drawing.Size(454, 434);\n\t\t\tthis.noEVEMailMessagesLabel.TabIndex = 1;\n\t\t\tthis.noEVEMailMessagesLabel.Text = \"No EVE mail messages are available.\";\n\t\t\tthis.noEVEMailMessagesLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n\t\t\t// \n\t\t\t// contextMenu\n\t\t\t// \n\t\t\tthis.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.mailReadLocal,\n            this.toolStripSeparator,\n            this.exportToCSVToolStripMenuItem});\n\t\t\tthis.contextMenu.Name = \"mailListContextMenu\";\n\t\t\tthis.contextMenu.Size = new System.Drawing.Size(157, 76);\n\t\t\tthis.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenu_Opening);\n\t\t\t// \n\t\t\t// mailReadLocal\n\t\t\t// \n\t\t\tthis.mailReadLocal.Name = \"mailReadLocal\";\n\t\t\tthis.mailReadLocal.Size = new System.Drawing.Size(156, 22);\n\t\t\tthis.mailReadLocal.Text = \"Read\";\n\t\t\tthis.mailReadLocal.Click += new System.EventHandler(this.mailReadLocal_Click);\n\t\t\t// \n\t\t\t// toolStripSeparator\n\t\t\t// \n\t\t\tthis.toolStripSeparator.Name = \"toolStripSeparator\";\n\t\t\tthis.toolStripSeparator.Size = new System.Drawing.Size(153, 6);\n\t\t\t// \n\t\t\t// exportToCSVToolStripMenuItem\n\t\t\t// \n\t\t\tthis.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n\t\t\tthis.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(156, 22);\n\t\t\tthis.exportToCSVToolStripMenuItem.Text = \"Export To CSV...\";\n\t\t\tthis.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// splitContainerMailMessages\n\t\t\t// \n\t\t\tthis.splitContainerMailMessages.BackColor = System.Drawing.SystemColors.ControlDark;\n\t\t\tthis.splitContainerMailMessages.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.splitContainerMailMessages.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.splitContainerMailMessages.Name = \"splitContainerMailMessages\";\n\t\t\tthis.splitContainerMailMessages.Orientation = System.Windows.Forms.Orientation.Horizontal;\n\t\t\t// \n\t\t\t// splitContainerMailMessages.Panel1\n\t\t\t// \n\t\t\tthis.splitContainerMailMessages.Panel1.Controls.Add(this.lvMailMessages);\n\t\t\t// \n\t\t\t// splitContainerMailMessages.Panel2\n\t\t\t// \n\t\t\tthis.splitContainerMailMessages.Panel2.Controls.Add(this.eveMailReadingPane);\n\t\t\tthis.splitContainerMailMessages.Size = new System.Drawing.Size(454, 434);\n\t\t\tthis.splitContainerMailMessages.SplitterDistance = 288;\n\t\t\tthis.splitContainerMailMessages.SplitterWidth = 6;\n\t\t\tthis.splitContainerMailMessages.TabIndex = 2;\n\t\t\t// \n\t\t\t// lvMailMessages\n\t\t\t// \n\t\t\tthis.lvMailMessages.BorderStyle = System.Windows.Forms.BorderStyle.None;\n\t\t\tthis.lvMailMessages.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chSenderName,\n            this.chTitle,\n            this.chSentDate,\n            this.chToCharacterIDs,\n            this.chToCorpOrAlliance,\n            this.chToListID});\n\t\t\tthis.lvMailMessages.ContextMenuStrip = this.contextMenu;\n\t\t\tthis.lvMailMessages.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.lvMailMessages.FullRowSelect = true;\n\t\t\tthis.lvMailMessages.HideSelection = false;\n\t\t\tthis.lvMailMessages.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.lvMailMessages.MultiSelect = false;\n\t\t\tthis.lvMailMessages.Name = \"lvMailMessages\";\n\t\t\tthis.lvMailMessages.Size = new System.Drawing.Size(454, 288);\n\t\t\tthis.lvMailMessages.SmallImageList = this.ilIcons;\n\t\t\tthis.lvMailMessages.TabIndex = 0;\n\t\t\tthis.lvMailMessages.UseCompatibleStateImageBehavior = false;\n\t\t\tthis.lvMailMessages.View = System.Windows.Forms.View.Details;\n\t\t\tthis.lvMailMessages.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvMailMessages_ColumnClick);\n\t\t\tthis.lvMailMessages.ColumnReordered += new System.Windows.Forms.ColumnReorderedEventHandler(this.lvMailMessages_ColumnReordered);\n\t\t\tthis.lvMailMessages.ColumnWidthChanged += new System.Windows.Forms.ColumnWidthChangedEventHandler(this.lvMailMessages_ColumnWidthChanged);\n\t\t\tthis.lvMailMessages.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.lvMailMessages_ItemSelectionChanged);\n\t\t\tthis.lvMailMessages.DoubleClick += new System.EventHandler(this.lvMailMessages_DoubleClick);\n\t\t\t// \n\t\t\t// chSenderName\n\t\t\t// \n\t\t\tthis.chSenderName.Text = \"From\";\n\t\t\t// \n\t\t\t// chTitle\n\t\t\t// \n\t\t\tthis.chTitle.Text = \"Subject\";\n\t\t\tthis.chTitle.Width = 121;\n\t\t\t// \n\t\t\t// chSentDate\n\t\t\t// \n\t\t\tthis.chSentDate.Text = \"Received\";\n\t\t\tthis.chSentDate.Width = 90;\n\t\t\t// \n\t\t\t// chToCharacterIDs\n\t\t\t// \n\t\t\tthis.chToCharacterIDs.Text = \"To\";\n\t\t\t// \n\t\t\t// chToCorpOrAlliance\n\t\t\t// \n\t\t\tthis.chToCorpOrAlliance.Text = \"To Corp Or Alliance\";\n\t\t\t// \n\t\t\t// chToListID\n\t\t\t// \n\t\t\tthis.chToListID.Text = \"To Mailing List\";\n\t\t\t// \n\t\t\t// eveMailReadingPane\n\t\t\t// \n\t\t\tthis.eveMailReadingPane.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.eveMailReadingPane.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.eveMailReadingPane.Name = \"eveMailReadingPane\";\n\t\t\tthis.eveMailReadingPane.Size = new System.Drawing.Size(454, 140);\n\t\t\tthis.eveMailReadingPane.TabIndex = 0;\n\t\t\t// \n\t\t\t// timer\n\t\t\t// \n\t\t\tthis.timer.Tick += new System.EventHandler(this.timer_Tick);\n\t\t\t// \n\t\t\t// CharacterEveMailMessagesList\n\t\t\t// \n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n\t\t\tthis.Controls.Add(this.splitContainerMailMessages);\n\t\t\tthis.Controls.Add(this.noEVEMailMessagesLabel);\n\t\t\tthis.Name = \"CharacterEveMailMessagesList\";\n\t\t\tthis.Size = new System.Drawing.Size(454, 434);\n\t\t\tthis.contextMenu.ResumeLayout(false);\n\t\t\tthis.splitContainerMailMessages.Panel1.ResumeLayout(false);\n\t\t\tthis.splitContainerMailMessages.Panel2.ResumeLayout(false);\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.splitContainerMailMessages)).EndInit();\n\t\t\tthis.splitContainerMailMessages.ResumeLayout(false);\n\t\t\tthis.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noEVEMailMessagesLabel;\n        private System.Windows.Forms.ImageList ilIcons;\n        private System.Windows.Forms.ColumnHeader chSenderName;\n        private System.Windows.Forms.ColumnHeader chTitle;\n        private System.Windows.Forms.ColumnHeader chSentDate;\n        private System.Windows.Forms.ColumnHeader chToCorpOrAlliance;\n        private System.Windows.Forms.ColumnHeader chToCharacterIDs;\n        private System.Windows.Forms.ColumnHeader chToListID;\n        private System.Windows.Forms.SplitContainer splitContainerMailMessages;\n        private System.Windows.Forms.ListView lvMailMessages;\n        private System.Windows.Forms.Timer timer;\n        private ReadingPane eveMailReadingPane;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem mailReadLocal;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterEveMailMessagesList.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.Notifications;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.DetailsWindow;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterEveMailMessagesList : UserControl, IListView\n    {\n        #region Fields\n\n        private readonly List<EveMailMessageColumnSettings> m_columns = new List<EveMailMessageColumnSettings>();\n        private readonly List<EveMailMessage> m_list = new List<EveMailMessage>();\n\n        private EVEMailMessagesGrouping m_grouping;\n        private EveMailMessageColumn m_sortCriteria;\n        private ReadingPanePositioning m_panePosition;\n\n        private string m_textFilter = string.Empty;\n        private bool m_sortAscending;\n        private bool m_columnsChanged;\n        private bool m_isUpdatingColumns;\n        private bool m_init;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public CharacterEveMailMessagesList()\n        {\n            InitializeComponent();\n\n            eveMailReadingPane.HidePane();\n            splitContainerMailMessages.Hide();\n            lvMailMessages.Hide();\n            lvMailMessages.AllowColumnReorder = true;\n            lvMailMessages.Columns.Clear();\n            \n            mailReadLocal.Font = FontFactory.GetFont(\"Segoe UI\", 9F, FontStyle.Bold);\n            noEVEMailMessagesLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n\n            ListViewHelper.EnableDoubleBuffer(lvMailMessages);\n\n            lvMailMessages.MouseDown += listView_MouseDown;\n            lvMailMessages.MouseMove += listView_MouseMove;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        /// <summary>\n        /// Gets or sets the text filter.\n        /// </summary>\n        [Browsable(false)]\n        public string TextFilter\n        {\n            get { return m_textFilter; }\n            set\n            {\n                m_textFilter = value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping mode.\n        /// </summary>\n        [Browsable(false)]\n        public Enum Grouping\n        {\n            get { return m_grouping; }\n            set\n            {\n                m_grouping = (EVEMailMessagesGrouping)value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the pane position.\n        /// </summary>\n        internal ReadingPanePositioning PanePosition\n        {\n            get { return m_panePosition; }\n            set\n            {\n                m_panePosition = value;\n                UpdatePanePosition();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of EVE mail messages to display.\n        /// </summary>\n        private IEnumerable<EveMailMessage> EVEMailMessages\n        {\n            get { return m_list; }\n            set\n            {\n                m_list.Clear();\n                if (value == null)\n                    return;\n\n                m_list.AddRange(value);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the settings used for columns.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        public IEnumerable<IColumnSettings> Columns\n        {\n            get\n            {\n                // Add the visible columns; matching the display order\n                List<EveMailMessageColumnSettings> newColumns = new List<EveMailMessageColumnSettings>();\n                foreach (ColumnHeader header in lvMailMessages.Columns.Cast<ColumnHeader>().OrderBy(x => x.DisplayIndex))\n                {\n                    EveMailMessageColumnSettings columnSetting =\n                        m_columns.First(x => x.Column == (EveMailMessageColumn)header.Tag);\n                    if (columnSetting.Width > -1)\n                        columnSetting.Width = header.Width;\n\n                    newColumns.Add(columnSetting);\n                }\n\n                // Then add the other columns\n                newColumns.AddRange(m_columns.Where(x => !x.Visible));\n\n                return newColumns;\n            }\n            set\n            {\n                m_columns.Clear();\n                if (value != null)\n                    m_columns.AddRange(value.Cast<EveMailMessageColumnSettings>());\n\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        #endregion\n\n\n        # region Inherited Events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.CharacterEVEMailMessagesUpdated += EveMonClient_CharacterEVEMailMessagesUpdated;\n            EveMonClient.CharacterEVEMailingListsUpdated += EveMonClient_CharacterEVEMailingListsUpdated;\n            EveMonClient.CharacterEVEMailBodyDownloaded += EveMonClient_CharacterEVEMailBodyDownloaded;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            EveMonClient.NotificationSent += EveMonClient_NotificationSent;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.CharacterEVEMailMessagesUpdated -= EveMonClient_CharacterEVEMailMessagesUpdated;\n            EveMonClient.CharacterEVEMailingListsUpdated -= EveMonClient_CharacterEVEMailingListsUpdated;\n            EveMonClient.CharacterEVEMailBodyDownloaded -= EveMonClient_CharacterEVEMailBodyDownloaded;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            EveMonClient.NotificationSent -= EveMonClient_NotificationSent;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (DesignMode || this.IsDesignModeHosted() || Character == null || !Visible)\n                return;\n\n            // Prevents the properties to call UpdateColumns() till we set all properties\n            m_init = false;\n\n            lvMailMessages.Visible = false;\n            eveMailReadingPane.HidePane();\n\n            EVEMailMessages = Character?.EVEMailMessages;\n            Columns = Settings.UI.MainWindow.EVEMailMessages.Columns;\n            Grouping = Character?.UISettings.EVEMailMessagesGroupBy;\n            TextFilter = string.Empty;\n            PanePosition = Settings.UI.MainWindow.EVEMailMessages.ReadingPanePosition;\n\n            UpdateColumns();\n            m_init = true;\n\n            UpdateListVisibility();\n        }\n\n        # endregion\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Autoresizes the columns.\n        /// </summary>\n        public void AutoResizeColumns()\n        {\n            m_columns.ForEach(column =>\n                                  {\n                                      if (column.Visible)\n                                          column.Width = -2;\n                                  });\n\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// Updates the columns.\n        /// </summary>\n        private void UpdateColumns()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            lvMailMessages.BeginUpdate();\n            m_isUpdatingColumns = true;\n\n            try\n            {\n                lvMailMessages.Columns.Clear();\n                lvMailMessages.Groups.Clear();\n                lvMailMessages.Items.Clear();\n\n                foreach (EveMailMessageColumnSettings column in m_columns.Where(x => x.Visible))\n                {\n                    ColumnHeader header = lvMailMessages.Columns.Add(column.Column.GetHeader(), column.Width);\n                    header.Tag = column.Column;\n                }\n\n                // We update the content\n                UpdateContent();\n            }\n            finally\n            {\n                lvMailMessages.EndUpdate();\n                m_isUpdatingColumns = false;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            int scrollBarPosition = lvMailMessages.GetVerticalScrollBarPosition();\n\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = lvMailMessages.SelectedItems.Count > 0\n                ? lvMailMessages.SelectedItems[0].Tag.GetHashCode()\n                : 0;\n\n            lvMailMessages.BeginUpdate();\n            try\n            {\n                IEnumerable<EveMailMessage> eveMailMessages = m_list\n                    .Where(x => x.SentDate != DateTime.MinValue).Where(x => IsTextMatching(x, m_textFilter));\n\n                UpdateSort();\n\n                UpdateContentByGroup(eveMailMessages);\n\n                // Restore the selected item (if any)\n                if (selectedItem > 0)\n                {\n                    foreach (ListViewItem lvItem in lvMailMessages.Items.Cast<ListViewItem>().Where(\n                        lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                    {\n                        lvItem.Selected = true;\n                    }\n                }\n\n                // Adjust the size of the columns\n                AdjustColumns();\n\n                UpdateListVisibility();\n            }\n            finally\n            {\n                lvMailMessages.EndUpdate();\n                lvMailMessages.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Updates the list visibility.\n        /// </summary>\n        private void UpdateListVisibility()\n        {\n            // Display or hide the \"no EVE mail messages\" label\n            if (!m_init)\n                return;\n\n            noEVEMailMessagesLabel.Visible = lvMailMessages.Items.Count == 0;\n            lvMailMessages.Visible = splitContainerMailMessages.Visible = !noEVEMailMessagesLabel.Visible;\n        }\n\n        /// <summary>\n        /// Updates the content by group.\n        /// </summary>\n        /// <param name=\"eveMailMessages\">The eve mail messages.</param>\n        private void UpdateContentByGroup(IEnumerable<EveMailMessage> eveMailMessages)\n        {\n            switch (m_grouping)\n            {\n                case EVEMailMessagesGrouping.State:\n                    IOrderedEnumerable<IGrouping<EveMailState, EveMailMessage>> groups0 =\n                        eveMailMessages.GroupBy(x => x.State).OrderBy(x => (int)x.Key);\n                    UpdateContent(groups0);\n                    break;\n                case EVEMailMessagesGrouping.StateDesc:\n                    IOrderedEnumerable<IGrouping<EveMailState, EveMailMessage>> groups1 =\n                        eveMailMessages.GroupBy(x => x.State).OrderByDescending(x => (int)x.Key);\n                    UpdateContent(groups1);\n                    break;\n                case EVEMailMessagesGrouping.SentDate:\n                    IOrderedEnumerable<IGrouping<DateTime, EveMailMessage>> groups2 =\n                        eveMailMessages.GroupBy(x => x.SentDate.ToLocalTime().Date).OrderBy(x => x.Key);\n                    UpdateContent(groups2);\n                    break;\n                case EVEMailMessagesGrouping.SentDateDesc:\n                    IOrderedEnumerable<IGrouping<DateTime, EveMailMessage>> groups3 =\n                        eveMailMessages.GroupBy(x => x.SentDate.ToLocalTime().Date).OrderByDescending(x => x.Key);\n                    UpdateContent(groups3);\n                    break;\n                case EVEMailMessagesGrouping.Sender:\n                    IOrderedEnumerable<IGrouping<string, EveMailMessage>> groups4 =\n                        eveMailMessages.GroupBy(x => x.SenderName).OrderBy(x => x.Key);\n                    UpdateContent(groups4);\n                    break;\n                case EVEMailMessagesGrouping.SenderDesc:\n                    IOrderedEnumerable<IGrouping<string, EveMailMessage>> groups5 =\n                        eveMailMessages.GroupBy(x => x.SenderName).OrderByDescending(x => x.Key);\n                    UpdateContent(groups5);\n                    break;\n                case EVEMailMessagesGrouping.Subject:\n                    IOrderedEnumerable<IGrouping<string, EveMailMessage>> groups6 =\n                        eveMailMessages.GroupBy(x => x.Title).OrderBy(x => x.Key);\n                    UpdateContent(groups6);\n                    break;\n                case EVEMailMessagesGrouping.SubjectDesc:\n                    IOrderedEnumerable<IGrouping<string, EveMailMessage>> groups7 =\n                        eveMailMessages.GroupBy(x => x.Title).OrderByDescending(x => x.Key);\n                    UpdateContent(groups7);\n                    break;\n                case EVEMailMessagesGrouping.Recipient:\n                    IOrderedEnumerable<IGrouping<string, EveMailMessage>> groups8 =\n                        eveMailMessages.GroupBy(x => x.ToCharacters.First()).OrderBy(x => x.Key);\n                    UpdateContent(groups8);\n                    break;\n                case EVEMailMessagesGrouping.RecipientDesc:\n                    IOrderedEnumerable<IGrouping<string, EveMailMessage>> groups9 =\n                        eveMailMessages.GroupBy(x => x.ToCharacters.First()).OrderByDescending(x => x.Key);\n                    UpdateContent(groups9);\n                    break;\n                case EVEMailMessagesGrouping.CorpOrAlliance:\n                    IOrderedEnumerable<IGrouping<string, EveMailMessage>> groups10 =\n                        eveMailMessages.GroupBy(x => x.ToCorpOrAlliance).OrderBy(x => x.Key);\n                    UpdateContent(groups10);\n                    break;\n                case EVEMailMessagesGrouping.CorpOrAllianceDesc:\n                    IOrderedEnumerable<IGrouping<string, EveMailMessage>> groups11 =\n                        eveMailMessages.GroupBy(x => x.ToCorpOrAlliance).OrderByDescending(x => x.Key);\n                    UpdateContent(groups11);\n                    break;\n                case EVEMailMessagesGrouping.MailingList:\n                    IOrderedEnumerable<IGrouping<string, EveMailMessage>> groups12 =\n                        eveMailMessages.GroupBy(x => x.ToMailingLists.First()).OrderBy(x => x.Key);\n                    UpdateContent(groups12);\n                    break;\n                case EVEMailMessagesGrouping.MailingListDesc:\n                    IOrderedEnumerable<IGrouping<string, EveMailMessage>> groups13 =\n                        eveMailMessages.GroupBy(x => x.ToMailingLists.First()).OrderByDescending(x => x.Key);\n                    UpdateContent(groups13);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        /// <typeparam name=\"TKey\"></typeparam>\n        /// <param name=\"groups\"></param>\n        private void UpdateContent<TKey>(IEnumerable<IGrouping<TKey, EveMailMessage>> groups)\n        {\n            lvMailMessages.Items.Clear();\n            lvMailMessages.Groups.Clear();\n\n            // Add the groups\n            foreach (IGrouping<TKey, EveMailMessage> group in groups)\n            {\n                string groupText;\n                if (group.Key is EveMailState)\n                    groupText = ((EveMailState)(object)group.Key).GetHeader();\n                else if (group.Key is DateTime)\n                    groupText = ((DateTime)(object)group.Key).ToShortDateString();\n                else\n                    groupText = group.Key.ToString();\n\n                ListViewGroup listGroup = new ListViewGroup(groupText);\n                lvMailMessages.Groups.Add(listGroup);\n\n                // Add the items in every group\n                lvMailMessages.Items.AddRange(group.Select(eveMailMessage => new\n                {\n                    eveMailMessage,\n                    item = new ListViewItem(eveMailMessage.SenderName, listGroup)\n                    {\n                        UseItemStyleForSubItems = false,\n                        Tag = eveMailMessage\n                    }\n                }).Select(x => CreateSubItems(x.eveMailMessage, x.item)).ToArray());\n            }\n        }\n\n        /// <summary>\n        /// Creates the list view sub items.\n        /// </summary>\n        /// <param name=\"eveMailMessage\">The mail message.</param>\n        /// <param name=\"item\">The item.</param>\n        private ListViewItem CreateSubItems(EveMailMessage eveMailMessage, ListViewItem item)\n        {\n            // Add enough subitems to match the number of columns\n            while (item.SubItems.Count < lvMailMessages.Columns.Count + 1)\n            {\n                item.SubItems.Add(string.Empty);\n            }\n\n            // Creates the subitems\n            for (int i = 0; i < lvMailMessages.Columns.Count; i++)\n            {\n                SetColumn(eveMailMessage, item.SubItems[i], (EveMailMessageColumn)lvMailMessages.Columns[i].Tag);\n            }\n\n            return item;\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvMailMessages.Columns)\n            {\n                if (m_columns[column.Index].Width == -1)\n                    m_columns[column.Index].Width = -2;\n\n                column.Width = m_columns[column.Index].Width;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column and not set to auto-resize\n                if (column.Index != lvMailMessages.Columns.Count - 1 || m_columns[column.Index].Width != -2)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvMailMessages.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvMailMessages.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        /// <summary>\n        /// Updates the item sorter.\n        /// </summary>\n        private void UpdateSort()\n        {\n            lvMailMessages.ListViewItemSorter = new ListViewItemComparerByTag<EveMailMessage>(\n                new EveMailMessageComparer(m_sortCriteria, m_sortAscending));\n\n            UpdateSortVisualFeedback();\n        }\n\n        /// <summary>\n        /// Updates the sort feedback (the arrow on the header).\n        /// </summary>\n        private void UpdateSortVisualFeedback()\n        {\n            foreach (ColumnHeader columnHeader in lvMailMessages.Columns.Cast<ColumnHeader>())\n            {\n                EveMailMessageColumn column = (EveMailMessageColumn)columnHeader.Tag;\n                if (m_sortCriteria == column)\n                    columnHeader.ImageIndex = m_sortAscending ? 0 : 1;\n                else\n                    columnHeader.ImageIndex = 2;\n            }\n        }\n\n        /// <summary>\n        /// Updates the listview sub-item.\n        /// </summary>\n        /// <param name=\"eveMailMessage\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"column\"></param>\n        private static void SetColumn(EveMailMessage eveMailMessage, ListViewItem.ListViewSubItem item, EveMailMessageColumn column)\n        {\n            switch (column)\n            {\n                case EveMailMessageColumn.SenderName:\n                    item.Text = eveMailMessage.SenderName;\n                    break;\n                case EveMailMessageColumn.Title:\n                    item.Text = eveMailMessage.Title;\n                    break;\n                case EveMailMessageColumn.SentDate:\n                    DateTime sentDateTime = eveMailMessage.SentDate.ToLocalTime();\n                    item.Text = $\"{sentDateTime:ddd} {sentDateTime:G}\";\n                    break;\n                case EveMailMessageColumn.ToCharacters:\n                    item.Text = string.Join(\", \", eveMailMessage.ToCharacters);\n                    break;\n                case EveMailMessageColumn.ToCorpOrAlliance:\n                    item.Text = eveMailMessage.ToCorpOrAlliance;\n                    break;\n                case EveMailMessageColumn.ToMailingList:\n                    item.Text = string.Join(\", \", eveMailMessage.ToMailingLists);\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Updates the pane position.\n        /// </summary>\n        private void UpdatePanePosition()\n        {\n            switch (PanePosition)\n            {\n                case ReadingPanePositioning.Off:\n                    splitContainerMailMessages.Panel2Collapsed = true;\n                    break;\n                case ReadingPanePositioning.Bottom:\n                    splitContainerMailMessages.Orientation = Orientation.Horizontal;\n                    splitContainerMailMessages.Panel2Collapsed = false;\n                    break;\n                case ReadingPanePositioning.Right:\n                    splitContainerMailMessages.Orientation = Orientation.Vertical;\n                    splitContainerMailMessages.Panel2Collapsed = false;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Tries to open the selected mail in the EVEMon Mail Window.\n        /// </summary>\n        private void ReadMailLocal()\n        {\n            ListViewItem item = lvMailMessages.SelectedItems[0];\n            EveMailMessage message = (EveMailMessage)item.Tag;\n\n            // Show or bring to front if a window with the same EVE mail message already exists\n            WindowsFactory.ShowByTag<EveMessageWindow, EveMailMessage>(message);\n        }\n        \n        /// <summary>\n        /// Checks the given text matches the item.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if [is text matching] [the specified x]; otherwise, <c>false</c>.\n        /// </returns>\n        private static bool IsTextMatching(EveMailMessage x, string text) => string.IsNullOrEmpty(text)\n       || x.SenderName.ToUpperInvariant().Contains(text, ignoreCase: true)\n       || x.Title.ToUpperInvariant().Contains(text, ignoreCase: true)\n       || x.ToCorpOrAlliance.ToUpperInvariant().Contains(text, ignoreCase: true)\n       || x.ToCharacters.Any(y => y.ToUpperInvariant().Contains(text, ignoreCase: true))\n       || x.EVEMailBody.BodyText.ToUpperInvariant().Contains(text, ignoreCase: true);\n\n        /// <summary>\n        /// Called when selection changed.\n        /// </summary>\n        private void OnSelectionChanged()\n        {\n            if (lvMailMessages.SelectedItems.Count == 0)\n            {\n                eveMailReadingPane.HidePane();\n                return;\n            }\n\n            EveMailMessage selectedObject = lvMailMessages.SelectedItems[0].Tag as EveMailMessage;\n            if (selectedObject == null)\n            {\n                eveMailReadingPane.HidePane();\n                return;\n            }\n\n            // If we haven't done it yet, download the mail body\n            if (selectedObject.EVEMailBody.MessageID == 0)\n            {\n                selectedObject.GetMailBody();\n                return;\n            }\n\n            eveMailReadingPane.SelectedObject = selectedObject;\n        }\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Exports item info to CSV format.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(lvMailMessages);\n        }\n\n        /// <summary>\n        /// Shows the context menu only when a message is selected.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void contextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            mailReadLocal.Enabled = lvMailMessages.SelectedItems.Count != 0;\n        }\n\n        /// <summary>\n        /// When the selection update timer ticks, we process the changes caused by a selection change.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void timer_Tick(object sender, EventArgs e)\n        {\n            timer.Stop();\n            OnSelectionChanged();\n        }\n\n        /// <summary>\n        /// When the user selects another item, we do not immediately process the change but rather delay it through a timer.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.ListViewItemSelectionChangedEventArgs\"/> instance containing the event data.</param>\n        private void lvMailMessages_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)\n        {\n            if (timer.Enabled)\n                return;\n\n            timer.Start();\n        }\n\n        /// <summary>\n        /// Opens a window form to display the EVE mail body.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void lvMailMessages_DoubleClick(object sender, EventArgs e)\n        {\n            ReadMailLocal();\n        }\n\n        /// <summary>\n        /// On column reorder we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvMailMessages_ColumnReordered(object sender, ColumnReorderedEventArgs e)\n        {\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user manually resizes a column, we make sure to update the column preferences.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvMailMessages_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)\n        {\n            if (m_isUpdatingColumns || m_columns.Count <= e.ColumnIndex)\n                return;\n\n            if (m_columns[e.ColumnIndex].Width == lvMailMessages.Columns[e.ColumnIndex].Width)\n                return;\n\n            m_columns[e.ColumnIndex].Width = lvMailMessages.Columns[e.ColumnIndex].Width;\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user clicks a column header, we update the sorting.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvMailMessages_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            EveMailMessageColumn column = (EveMailMessageColumn)lvMailMessages.Columns[e.Column].Tag;\n            if (m_sortCriteria == column)\n                m_sortAscending = !m_sortAscending;\n            else\n            {\n                m_sortCriteria = column;\n                m_sortAscending = true;\n            }\n\n            m_isUpdatingColumns = true;\n\n            // Updates the item sorter\n            UpdateSort();\n\n            m_isUpdatingColumns = false;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lvMailMessages.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvMailMessages.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Picking \"Read\" in the context menu.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void mailReadLocal_Click(object sender, EventArgs e)\n        {\n            ReadMailLocal();\n        }\n        \n        # endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// On timer tick, we update the column settings if any changes have been made to them.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Visible || !m_columnsChanged)\n                return;\n\n            Settings.UI.MainWindow.EVEMailMessages.Columns.Clear();\n            Settings.UI.MainWindow.EVEMailMessages.Columns.AddRange(Columns.Cast<EveMailMessageColumnSettings>());\n\n            // Recreate the columns\n            Columns = Settings.UI.MainWindow.EVEMailMessages.Columns;\n            m_columnsChanged = false;\n        }\n\n        /// <summary>\n        /// When the mail messages change update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterEVEMailMessagesUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (Character == null || e.Character != Character)\n                return;\n\n            EVEMailMessages = Character.EVEMailMessages;\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// When the mailing lists change update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterEVEMailingListsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// When the mail message body gets downloaded update the reading pane.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterEVEMailBodyDownloaded(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            OnSelectionChanged();\n        }\n\n        /// <summary>\n        /// When the EveIDToName list updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// Handles the NotificationSent event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.Notifications.NotificationEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_NotificationSent(object sender, NotificationEventArgs e)\n        {\n            if (Character == null)\n                return;\n\n            APIErrorNotificationEventArgs notification = e as APIErrorNotificationEventArgs;\n\n            CCPAPIResult<SerializableAPIMailBodies> notificationResult =\n                notification?.Result as CCPAPIResult<SerializableAPIMailBodies>;\n\n            if (notificationResult == null)\n                return;\n\n            // In case there was an error, hide the pane\n            if (notification.Result.HasError)\n                eveMailReadingPane.HidePane();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterEveMailMessagesList.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        AAAAAk1TRnQBSQFMAgEBAwEAAawBCAGsAQgBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABEAMAAQEBAAEQBgABCP8A/wD/AP8A/wD/AP8A/wAaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB\n        AQABAQUAAYAXAAP/AQAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAB8AEPAf4BfwL/AgAB+AEfAfwBPwL/\n        AgAB/AE/AfgBHwL/AgAB/gF/AfABDwL/AgAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAL\n</value>\n  </data>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>170, 20</value>\n  </metadata>\n  <metadata name=\"timer.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>103, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterEveNotificationsList.Designer.cs",
    "content": "﻿using EVEMon.Controls;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterEveNotificationsList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterEveNotificationsList));\n            this.splitContainerNotifications = new System.Windows.Forms.SplitContainer();\n            this.lvNotifications = new System.Windows.Forms.ListView();\n            this.chSenderName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chSentDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.ilIcons = new System.Windows.Forms.ImageList(this.components);\n            this.eveNotificationReadingPane = new EVEMon.Controls.ReadingPane();\n            this.noEVENotificationsLabel = new System.Windows.Forms.Label();\n            this.timer = new System.Windows.Forms.Timer(this.components);\n            ((System.ComponentModel.ISupportInitialize)(this.splitContainerNotifications)).BeginInit();\n            this.splitContainerNotifications.Panel1.SuspendLayout();\n            this.splitContainerNotifications.Panel2.SuspendLayout();\n            this.splitContainerNotifications.SuspendLayout();\n            this.contextMenu.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // splitContainerNotifications\n            // \n            this.splitContainerNotifications.BackColor = System.Drawing.SystemColors.ControlDark;\n            this.splitContainerNotifications.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.splitContainerNotifications.Location = new System.Drawing.Point(0, 0);\n            this.splitContainerNotifications.Name = \"splitContainerNotifications\";\n            this.splitContainerNotifications.Orientation = System.Windows.Forms.Orientation.Horizontal;\n            // \n            // splitContainerNotifications.Panel1\n            // \n            this.splitContainerNotifications.Panel1.Controls.Add(this.lvNotifications);\n            // \n            // splitContainerNotifications.Panel2\n            // \n            this.splitContainerNotifications.Panel2.Controls.Add(this.eveNotificationReadingPane);\n            this.splitContainerNotifications.Size = new System.Drawing.Size(454, 434);\n            this.splitContainerNotifications.SplitterDistance = 288;\n            this.splitContainerNotifications.SplitterWidth = 6;\n            this.splitContainerNotifications.TabIndex = 3;\n            // \n            // lvNotifications\n            // \n            this.lvNotifications.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lvNotifications.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chSenderName,\n            this.chType,\n            this.chSentDate});\n            this.lvNotifications.ContextMenuStrip = this.contextMenu;\n            this.lvNotifications.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvNotifications.FullRowSelect = true;\n            this.lvNotifications.HideSelection = false;\n            this.lvNotifications.Location = new System.Drawing.Point(0, 0);\n            this.lvNotifications.MultiSelect = false;\n            this.lvNotifications.Name = \"lvNotifications\";\n            this.lvNotifications.Size = new System.Drawing.Size(454, 288);\n            this.lvNotifications.SmallImageList = this.ilIcons;\n            this.lvNotifications.TabIndex = 0;\n            this.lvNotifications.UseCompatibleStateImageBehavior = false;\n            this.lvNotifications.View = System.Windows.Forms.View.Details;\n            this.lvNotifications.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvNotifications_ColumnClick);\n            this.lvNotifications.ColumnReordered += new System.Windows.Forms.ColumnReorderedEventHandler(this.lvNotifications_ColumnReordered);\n            this.lvNotifications.ColumnWidthChanged += new System.Windows.Forms.ColumnWidthChangedEventHandler(this.lvNotifications_ColumnWidthChanged);\n            this.lvNotifications.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.lvNotifications_ItemSelectionChanged);\n            this.lvNotifications.DoubleClick += new System.EventHandler(this.lvNotifications_DoubleClick);\n            // \n            // chSenderName\n            // \n            this.chSenderName.Text = \"From\";\n            // \n            // chType\n            // \n            this.chType.Text = \"Subject\";\n            this.chType.Width = 121;\n            // \n            // chSentDate\n            // \n            this.chSentDate.Text = \"Received\";\n            this.chSentDate.Width = 90;\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.exportToCSVToolStripMenuItem});\n            this.contextMenu.Name = \"ShipPropertiesContextMenu\";\n            this.contextMenu.Size = new System.Drawing.Size(157, 48);\n            // \n            // exportToCSVToolStripMenuItem\n            // \n            this.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n            this.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(156, 22);\n            this.exportToCSVToolStripMenuItem.Text = \"Export To CSV...\";\n            this.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n            // \n            // ilIcons\n            // \n            this.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n            this.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilIcons.Images.SetKeyName(0, \"arrow_up.png\");\n            this.ilIcons.Images.SetKeyName(1, \"arrow_down.png\");\n            this.ilIcons.Images.SetKeyName(2, \"16x16Transparant.png\");\n            // \n            // eveNotificationReadingPane\n            // \n            this.eveNotificationReadingPane.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.eveNotificationReadingPane.Location = new System.Drawing.Point(0, 0);\n            this.eveNotificationReadingPane.Name = \"eveNotificationReadingPane\";\n            this.eveNotificationReadingPane.Size = new System.Drawing.Size(454, 140);\n            this.eveNotificationReadingPane.TabIndex = 0;\n            // \n            // noEVENotificationsLabel\n            // \n            this.noEVENotificationsLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noEVENotificationsLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noEVENotificationsLabel.Location = new System.Drawing.Point(0, 0);\n            this.noEVENotificationsLabel.Name = \"noEVENotificationsLabel\";\n            this.noEVENotificationsLabel.Size = new System.Drawing.Size(454, 434);\n            this.noEVENotificationsLabel.TabIndex = 4;\n            this.noEVENotificationsLabel.Text = \"No EVE notifications are available.\";\n            this.noEVENotificationsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // timer\n            // \n            this.timer.Tick += new System.EventHandler(this.timer_Tick);\n            // \n            // CharacterEveNotificationsList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.splitContainerNotifications);\n            this.Controls.Add(this.noEVENotificationsLabel);\n            this.Name = \"CharacterEveNotificationsList\";\n            this.Size = new System.Drawing.Size(454, 434);\n            this.splitContainerNotifications.Panel1.ResumeLayout(false);\n            this.splitContainerNotifications.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.splitContainerNotifications)).EndInit();\n            this.splitContainerNotifications.ResumeLayout(false);\n            this.contextMenu.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.SplitContainer splitContainerNotifications;\n        private System.Windows.Forms.ListView lvNotifications;\n        private System.Windows.Forms.ColumnHeader chSenderName;\n        private System.Windows.Forms.ColumnHeader chType;\n        private System.Windows.Forms.ColumnHeader chSentDate;\n        private ReadingPane eveNotificationReadingPane;\n        private System.Windows.Forms.Label noEVENotificationsLabel;\n        private System.Windows.Forms.ImageList ilIcons;\n        private System.Windows.Forms.Timer timer;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterEveNotificationsList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.Models.Extended;\nusing EVEMon.Common.Notifications;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.DetailsWindow;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterEveNotificationsList : UserControl, IListView\n    {\n        #region Fields\n\n        private readonly List<EveNotificationColumnSettings> m_columns = new List<EveNotificationColumnSettings>();\n        private readonly List<EveNotification> m_list = new List<EveNotification>();\n\n        private EVENotificationsGrouping m_grouping;\n        private EveNotificationColumn m_sortCriteria;\n        private ReadingPanePositioning m_panePosition;\n\n        private string m_textFilter = string.Empty;\n        private bool m_sortAscending;\n        private bool m_columnsChanged;\n        private bool m_isUpdatingColumns;\n        private bool m_init;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public CharacterEveNotificationsList()\n        {\n            InitializeComponent();\n\n            eveNotificationReadingPane.HidePane();\n            splitContainerNotifications.Hide();\n            lvNotifications.Hide();\n            lvNotifications.AllowColumnReorder = true;\n            lvNotifications.Columns.Clear();\n\n            noEVENotificationsLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n\n            ListViewHelper.EnableDoubleBuffer(lvNotifications);\n\n            lvNotifications.MouseDown += listView_MouseDown;\n            lvNotifications.MouseMove += listView_MouseMove;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        /// <summary>\n        /// Gets or sets the text filter.\n        /// </summary>\n        [Browsable(false)]\n        public string TextFilter\n        {\n            get { return m_textFilter; }\n            set\n            {\n                m_textFilter = value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping mode.\n        /// </summary>\n        [Browsable(false)]\n        public Enum Grouping\n        {\n            get { return m_grouping; }\n            set\n            {\n                m_grouping = (EVENotificationsGrouping)value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the pane position.\n        /// </summary>\n        internal ReadingPanePositioning PanePosition\n        {\n            get { return m_panePosition; }\n            set\n            {\n                m_panePosition = value;\n                UpdatePanePosition();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of EVE mail messages to display.\n        /// </summary>\n        private IEnumerable<EveNotification> EVENotifications\n        {\n            get { return m_list; }\n            set\n            {\n                m_list.Clear();\n                if (value == null)\n                    return;\n\n                m_list.AddRange(value);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the settings used for columns.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        public IEnumerable<IColumnSettings> Columns\n        {\n            get\n            {\n                // Add the visible columns; matching the display order\n                List<EveNotificationColumnSettings> newColumns = new List<EveNotificationColumnSettings>();\n                foreach (ColumnHeader header in lvNotifications.Columns.Cast<ColumnHeader>().OrderBy(x => x.DisplayIndex))\n                {\n                    EveNotificationColumnSettings columnSetting =\n                        m_columns.First(x => x.Column == (EveNotificationColumn)header.Tag);\n                    if (columnSetting.Width > -1)\n                        columnSetting.Width = header.Width;\n\n                    newColumns.Add(columnSetting);\n                }\n\n                // Then add the other columns\n                newColumns.AddRange(m_columns.Where(x => !x.Visible));\n\n                return newColumns;\n            }\n            set\n            {\n                m_columns.Clear();\n                if (value != null)\n                    m_columns.AddRange(value.Cast<EveNotificationColumnSettings>());\n\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        #endregion\n\n\n        # region Inherited Events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.CharacterEVENotificationsUpdated += EveMonClient_CharacterEVENotificationsUpdated;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            EveMonClient.NotificationRefTypesUpdated += EveMonClient_NotificationRefTypesUpdated;\n            EveNotificationTextParser.NotificationTextParserUpdated += EveNotificationTextParser_NotificationTextParserUpdated;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.CharacterEVENotificationsUpdated -= EveMonClient_CharacterEVENotificationsUpdated;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            EveMonClient.NotificationRefTypesUpdated -= EveMonClient_NotificationRefTypesUpdated;\n            EveNotificationTextParser.NotificationTextParserUpdated -= EveNotificationTextParser_NotificationTextParserUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (DesignMode || this.IsDesignModeHosted() || Character == null || !Visible)\n                return;\n\n            // Prevents the properties to call UpdateColumns() till we set all properties\n            m_init = false;\n\n            lvNotifications.Visible = false;\n            eveNotificationReadingPane.HidePane();\n\n            EVENotifications = Character?.EVENotifications;\n            Columns = Settings.UI.MainWindow.EVENotifications.Columns;\n            Grouping = Character?.UISettings.EVENotificationsGroupBy;\n            PanePosition = Settings.UI.MainWindow.EVENotifications.ReadingPanePosition;\n            TextFilter = string.Empty;\n\n            UpdateColumns();\n            m_init = true;\n\n            UpdateListVisibility();\n        }\n\n        # endregion\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Autoresizes the columns.\n        /// </summary>\n        public void AutoResizeColumns()\n        {\n            m_columns.ForEach(column =>\n            {\n                if (column.Visible)\n                    column.Width = -2;\n            });\n\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// Updates the columns.\n        /// </summary>\n        private void UpdateColumns()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            lvNotifications.BeginUpdate();\n            m_isUpdatingColumns = true;\n\n            try\n            {\n                lvNotifications.Columns.Clear();\n                lvNotifications.Groups.Clear();\n                lvNotifications.Items.Clear();\n\n                foreach (EveNotificationColumnSettings column in m_columns.Where(x => x.Visible))\n                {\n                    ColumnHeader header = lvNotifications.Columns.Add(column.Column.GetHeader(), column.Width);\n                    header.Tag = column.Column;\n                }\n\n                // We update the content\n                UpdateContent();\n            }\n            finally\n            {\n                lvNotifications.EndUpdate();\n                m_isUpdatingColumns = false;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            int scrollBarPosition = lvNotifications.GetVerticalScrollBarPosition();\n\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = lvNotifications.SelectedItems.Count > 0 ? lvNotifications.\n                SelectedItems[0].Tag.GetHashCode() : 0;\n\n            lvNotifications.BeginUpdate();\n            splitContainerNotifications.Visible = false;\n            try\n            {\n                IEnumerable<EveNotification> eveNotifications = m_list .Where(x => x.SentDate\n                    != DateTime.MinValue).Where(x => IsTextMatching(x, m_textFilter));\n\n                UpdateSort();\n\n                UpdateContentByGroup(eveNotifications);\n\n                // Restore the selected item (if any)\n                if (selectedItem > 0)\n                {\n                    foreach (ListViewItem lvItem in lvNotifications.Items.Cast<ListViewItem>()\n                        .Where(lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                    {\n                        lvItem.Selected = true;\n                    }\n                }\n\n                // Adjust the size of the columns\n                AdjustColumns();\n\n                UpdateListVisibility();\n            }\n            finally\n            {\n                lvNotifications.EndUpdate();\n                lvNotifications.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Updates the list visibility.\n        /// </summary>\n        private void UpdateListVisibility()\n        {\n            // Display or hide the \"no EVE mail messages\" label\n            if (!m_init)\n                return;\n\n            noEVENotificationsLabel.Visible = lvNotifications.Items.Count == 0;\n            lvNotifications.Visible = splitContainerNotifications.Visible = !noEVENotificationsLabel.Visible;\n        }\n\n        /// <summary>\n        /// Updates the content by group.\n        /// </summary>\n        /// <param name=\"eveNotifications\">The eve notifications.</param>\n        private void UpdateContentByGroup(IEnumerable<EveNotification> eveNotifications)\n        {\n            switch (m_grouping)\n            {\n                case EVENotificationsGrouping.Type:\n                    IOrderedEnumerable<IGrouping<string, EveNotification>> groups0 =\n                        eveNotifications.GroupBy(x => x.TypeName).OrderBy(x => x.Key);\n                    UpdateContent(groups0);\n                    break;\n                case EVENotificationsGrouping.TypeDesc:\n                    IOrderedEnumerable<IGrouping<string, EveNotification>> groups1 =\n                        eveNotifications.GroupBy(x => x.TypeName).OrderByDescending(x => x.Key);\n                    UpdateContent(groups1);\n                    break;\n                case EVENotificationsGrouping.SentDate:\n                    IOrderedEnumerable<IGrouping<DateTime, EveNotification>> groups2 =\n                        eveNotifications.GroupBy(x => x.SentDate.ToLocalTime().Date).OrderBy(x => x.Key);\n                    UpdateContent(groups2);\n                    break;\n                case EVENotificationsGrouping.SentDateDesc:\n                    IOrderedEnumerable<IGrouping<DateTime, EveNotification>> groups3 =\n                        eveNotifications.GroupBy(x => x.SentDate.ToLocalTime().Date).OrderByDescending(x => x.Key);\n                    UpdateContent(groups3);\n                    break;\n                case EVENotificationsGrouping.Sender:\n                    IOrderedEnumerable<IGrouping<string, EveNotification>> groups4 =\n                        eveNotifications.GroupBy(x => x.SenderName).OrderBy(x => x.Key);\n                    UpdateContent(groups4);\n                    break;\n                case EVENotificationsGrouping.SenderDesc:\n                    IOrderedEnumerable<IGrouping<string, EveNotification>> groups5 =\n                        eveNotifications.GroupBy(x => x.SenderName).OrderByDescending(x => x.Key);\n                    UpdateContent(groups5);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        /// <typeparam name=\"TKey\"></typeparam>\n        /// <param name=\"groups\"></param>\n        private void UpdateContent<TKey>(IEnumerable<IGrouping<TKey, EveNotification>> groups)\n        {\n            lvNotifications.Items.Clear();\n            lvNotifications.Groups.Clear();\n\n            // Add the groups\n            foreach (IGrouping<TKey, EveNotification> group in groups)\n            {\n                string groupText;\n                if (group.Key is EveMailState)\n                    groupText = ((EveMailState)(object)group.Key).GetHeader();\n                else if (group.Key is DateTime)\n                    groupText = ((DateTime)(object)group.Key).ToShortDateString();\n                else\n                    groupText = group.Key.ToString();\n\n                ListViewGroup listGroup = new ListViewGroup(groupText);\n                lvNotifications.Groups.Add(listGroup);\n\n                // Add the items in every group\n                lvNotifications.Items.AddRange(\n                    group.Select(eveNotification => new\n                    {\n                        eveNotification,\n                        item = new ListViewItem(eveNotification.SenderName, listGroup)\n                        {\n                            UseItemStyleForSubItems = false,\n                            Tag = eveNotification\n                        }\n                    }).Select(x => CreateSubItems(x.eveNotification, x.item)).ToArray());\n            }\n        }\n\n        /// <summary>\n        /// Creates the list view sub items.\n        /// </summary>\n        /// <param name=\"eveNotification\">The notification.</param>\n        /// <param name=\"item\">The item.</param>\n        private ListViewItem CreateSubItems(EveNotification eveNotification, ListViewItem item)\n        {\n            // Add enough subitems to match the number of columns\n            while (item.SubItems.Count < lvNotifications.Columns.Count + 1)\n            {\n                item.SubItems.Add(string.Empty);\n            }\n\n            // Creates the subitems\n            for (int i = 0; i < lvNotifications.Columns.Count; i++)\n            {\n                SetColumn(eveNotification, item.SubItems[i], (EveNotificationColumn)lvNotifications.Columns[i].Tag);\n            }\n\n            return item;\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvNotifications.Columns)\n            {\n                if (m_columns[column.Index].Width == -1)\n                    m_columns[column.Index].Width = -2;\n\n                column.Width = m_columns[column.Index].Width;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column and not set to auto-resize\n                if (column.Index != lvNotifications.Columns.Count - 1 || m_columns[column.Index].Width != -2)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvNotifications.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvNotifications.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        /// <summary>\n        /// Updates the item sorter.\n        /// </summary>\n        private void UpdateSort()\n        {\n            lvNotifications.ListViewItemSorter = new ListViewItemComparerByTag<EveNotification>(\n                new EveNotificationComparer(m_sortCriteria, m_sortAscending));\n\n            UpdateSortVisualFeedback();\n        }\n\n        /// <summary>\n        /// Updates the sort feedback (the arrow on the header).\n        /// </summary>\n        private void UpdateSortVisualFeedback()\n        {\n            foreach (ColumnHeader columnHeader in lvNotifications.Columns.Cast<ColumnHeader>())\n            {\n                EveNotificationColumn column = (EveNotificationColumn)columnHeader.Tag;\n                if (m_sortCriteria == column)\n                    columnHeader.ImageIndex = m_sortAscending ? 0 : 1;\n                else\n                    columnHeader.ImageIndex = 2;\n            }\n        }\n\n        /// <summary>\n        /// Updates the listview sub-item.\n        /// </summary>\n        /// <param name=\"eveNotification\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"column\"></param>\n        private static void SetColumn(EveNotification eveNotification, ListViewItem.ListViewSubItem item,\n            EveNotificationColumn column)\n        {\n            switch (column)\n            {\n                case EveNotificationColumn.SenderName:\n                    item.Text = eveNotification.SenderName;\n                    break;\n                case EveNotificationColumn.Type:\n                    item.Text = eveNotification.Title;\n                    break;\n                case EveNotificationColumn.SentDate:\n                    DateTime sentDateTime = eveNotification.SentDate.ToLocalTime();\n                    item.Text = $\"{sentDateTime:ddd} {sentDateTime:G}\";\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Updates the pane position.\n        /// </summary>\n        private void UpdatePanePosition()\n        {\n            switch (PanePosition)\n            {\n                case ReadingPanePositioning.Off:\n                    splitContainerNotifications.Panel2Collapsed = true;\n                    break;\n                case ReadingPanePositioning.Bottom:\n                    splitContainerNotifications.Orientation = Orientation.Horizontal;\n                    splitContainerNotifications.Panel2Collapsed = false;\n                    break;\n                case ReadingPanePositioning.Right:\n                    splitContainerNotifications.Orientation = Orientation.Vertical;\n                    splitContainerNotifications.Panel2Collapsed = false;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Checks the given text matches the item.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if [is text matching] [the specified x]; otherwise, <c>false</c>.\n        /// </returns>\n        private static bool IsTextMatching(EveNotification x, string text) => string.IsNullOrEmpty(text)\n       || x.SenderName.ToUpperInvariant().Contains(text, ignoreCase: true)\n       || x.Title.ToUpperInvariant().Contains(text, ignoreCase: true)\n       || x.Text.ToUpperInvariant().Contains(text, ignoreCase: true);\n\n        /// <summary>\n        /// Called when selection changed.\n        /// </summary>\n        private void OnSelectionChanged()\n        {\n            if (lvNotifications.SelectedItems.Count == 0)\n            {\n                eveNotificationReadingPane.HidePane();\n                return;\n            }\n\n            EveNotification selectedObject = lvNotifications.SelectedItems[0].Tag as EveNotification;\n            if (selectedObject == null)\n            {\n                eveNotificationReadingPane.HidePane();\n                return;\n            }\n            \n            eveNotificationReadingPane.SelectedObject = selectedObject;\n        }\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Exports item info to CSV format.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(lvNotifications);\n        }\n\n        /// <summary>\n        /// When the selection update timer ticks, we process the changes caused by a selection change.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void timer_Tick(object sender, EventArgs e)\n        {\n            timer.Stop();\n            OnSelectionChanged();\n        }\n\n        /// <summary>\n        /// When the user selects another item, we do not immediately process the change but rather delay it through a timer.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.ListViewItemSelectionChangedEventArgs\"/> instance containing the event data.</param>\n        private void lvNotifications_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)\n        {\n            if (timer.Enabled)\n                return;\n\n            timer.Start();\n        }\n\n        /// <summary>\n        /// Opens a window form to display the EVE notification.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void lvNotifications_DoubleClick(object sender, EventArgs e)\n        {\n            var items = lvNotifications.SelectedItems;\n            if (items.Count > 0)\n            {\n                var item = items[0];\n                var notification = (EveNotification)item.Tag;\n\n                // Quit if we haven't downloaded the notification text yet\n                if (notification.EVENotificationText != null)\n                    // Show or bring to front if a window with the same EVE notification already exists\n                    WindowsFactory.ShowByTag<EveMessageWindow, EveNotification>(notification);\n            }\n        }\n\n        /// <summary>\n        /// On column reorder we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvNotifications_ColumnReordered(object sender, ColumnReorderedEventArgs e)\n        {\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user manually resizes a column, we make sure to update the column preferences.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvNotifications_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)\n        {\n            if (m_isUpdatingColumns || m_columns.Count <= e.ColumnIndex)\n                return;\n\n            if (m_columns[e.ColumnIndex].Width == lvNotifications.Columns[e.ColumnIndex].Width)\n                return;\n\n            m_columns[e.ColumnIndex].Width = lvNotifications.Columns[e.ColumnIndex].Width;\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user clicks a column header, we update the sorting.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvNotifications_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            var column = (EveNotificationColumn)lvNotifications.Columns[e.Column].Tag;\n            if (m_sortCriteria == column)\n                m_sortAscending = !m_sortAscending;\n            else\n            {\n                m_sortCriteria = column;\n                m_sortAscending = true;\n            }\n\n            m_isUpdatingColumns = true;\n\n            // Updates the item sorter\n            UpdateSort();\n\n            m_isUpdatingColumns = false;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lvNotifications.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvNotifications.Cursor = CustomCursors.ContextMenu;\n        }\n\n        # endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// On timer tick, we update the column settings if any changes have been made to them.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Visible || !m_columnsChanged)\n                return;\n\n            Settings.UI.MainWindow.EVENotifications.Columns.Clear();\n            Settings.UI.MainWindow.EVENotifications.Columns.AddRange(Columns.Cast<EveNotificationColumnSettings>());\n\n            // Recreate the columns\n            Columns = Settings.UI.MainWindow.EVENotifications.Columns;\n            m_columnsChanged = false;\n        }\n\n        /// <summary>\n        /// When the notifications change update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterEVENotificationsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (Character == null || e.Character != Character)\n                return;\n\n            EVENotifications = Character.EVENotifications;\n            UpdateColumns();\n        }\n        \n        /// <summary>\n        /// When the EveIDToName list updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// When the NotificationRefTypes list updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_NotificationRefTypesUpdated(object sender, EventArgs e)\n        {\n            UpdateColumns();\n        }\n        \n        /// <summary>\n        /// When the notification text parser updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveNotificationTextParser_NotificationTextParserUpdated(object sender, EventArgs e)\n        {\n            UpdateColumns();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterEveNotificationsList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>178, 17</value>\n  </metadata>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        AAAAAk1TRnQBSQFMAgEBAwEAAXwBCAF8AQgBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABEAMAAQEBAAEQBgABCP8A/wD/AP8A/wD/AP8A/wAaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB\n        AQABAQUAAYAXAAP/AQAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAB8AEPAf4BfwL/AgAB+AEfAfwBPwL/\n        AgAB/AE/AfgBHwL/AgAB/gF/AfABDwL/AgAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAL\n</value>\n  </data>\n  <metadata name=\"timer.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>98, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterFactionalWarfareStatsList.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterFactionalWarfareStatsList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.Windows.Forms.ListViewGroup listViewGroup1 = new System.Windows.Forms.ListViewGroup(\"Kills\", System.Windows.Forms.HorizontalAlignment.Left);\n            System.Windows.Forms.ListViewGroup listViewGroup2 = new System.Windows.Forms.ListViewGroup(\"Victory Points\", System.Windows.Forms.HorizontalAlignment.Left);\n            System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(\"Yesterday\");\n            System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem(\"Last Week\");\n            System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem(\"Total\");\n            System.Windows.Forms.ListViewItem listViewItem4 = new System.Windows.Forms.ListViewItem(\"Yesterday\");\n            System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem(\"Last Week\");\n            System.Windows.Forms.ListViewItem listViewItem6 = new System.Windows.Forms.ListViewItem(\"Total\");\n            System.Windows.Forms.ListViewGroup listViewGroup3 = new System.Windows.Forms.ListViewGroup(\"General\", System.Windows.Forms.HorizontalAlignment.Left);\n            System.Windows.Forms.ListViewGroup listViewGroup4 = new System.Windows.Forms.ListViewGroup(\"Kills\", System.Windows.Forms.HorizontalAlignment.Left);\n            System.Windows.Forms.ListViewGroup listViewGroup5 = new System.Windows.Forms.ListViewGroup(\"Victory Points\", System.Windows.Forms.HorizontalAlignment.Left);\n            System.Windows.Forms.ListViewItem listViewItem7 = new System.Windows.Forms.ListViewItem(\"Pilots\");\n            System.Windows.Forms.ListViewItem listViewItem8 = new System.Windows.Forms.ListViewItem(\"Systems Controlled\");\n            System.Windows.Forms.ListViewItem listViewItem9 = new System.Windows.Forms.ListViewItem(\"Yesterday\");\n            System.Windows.Forms.ListViewItem listViewItem10 = new System.Windows.Forms.ListViewItem(\"Last Week\");\n            System.Windows.Forms.ListViewItem listViewItem11 = new System.Windows.Forms.ListViewItem(\"Total\");\n            System.Windows.Forms.ListViewItem listViewItem12 = new System.Windows.Forms.ListViewItem(\"Yesterday\");\n            System.Windows.Forms.ListViewItem listViewItem13 = new System.Windows.Forms.ListViewItem(\"Last Week\");\n            System.Windows.Forms.ListViewItem listViewItem14 = new System.Windows.Forms.ListViewItem(\"Total\");\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterFactionalWarfareStatsList));\n            this.noFactionalWarfareLabel = new System.Windows.Forms.Label();\n            this.notEnlistedLabel = new System.Windows.Forms.Label();\n            this.ListPanel = new System.Windows.Forms.Panel();\n            this.ListSplitContainer = new EVEMon.Common.Controls.PersistentSplitContainer();\n            this.lvPersonal = new System.Windows.Forms.ListView();\n            this.chDescription = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chYou = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chAll = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.lvMilitia = new System.Windows.Forms.ListView();\n            this.chMilitia = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chAmarr = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chCaldari = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chGallente = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chMinmatar = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.HeaderTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.FightingPartiesPanel = new System.Windows.Forms.Panel();\n            this.PlusPictureBox = new System.Windows.Forms.PictureBox();\n            this.AgainstPictureBox = new System.Windows.Forms.PictureBox();\n            this.AllyAgainstFactionPictureBox = new System.Windows.Forms.PictureBox();\n            this.PrimeAgainstFactionPictureBox = new System.Windows.Forms.PictureBox();\n            this.EnlistedFactionPictureBox = new System.Windows.Forms.PictureBox();\n            this.FactionPictureBox = new System.Windows.Forms.PictureBox();\n            this.CorporationPictureBox = new System.Windows.Forms.PictureBox();\n            this.RankLabel = new System.Windows.Forms.Label();\n            this.TimeServedLabel = new System.Windows.Forms.Label();\n            this.FactionLabel = new System.Windows.Forms.Label();\n            this.CorporationLabel = new System.Windows.Forms.Label();\n            this.ListPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.ListSplitContainer)).BeginInit();\n            this.ListSplitContainer.Panel1.SuspendLayout();\n            this.ListSplitContainer.Panel2.SuspendLayout();\n            this.ListSplitContainer.SuspendLayout();\n            this.HeaderTableLayoutPanel.SuspendLayout();\n            this.FightingPartiesPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.PlusPictureBox)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.AgainstPictureBox)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.AllyAgainstFactionPictureBox)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.PrimeAgainstFactionPictureBox)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.EnlistedFactionPictureBox)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.FactionPictureBox)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.CorporationPictureBox)).BeginInit();\n            this.SuspendLayout();\n            // \n            // noFactionalWarfareLabel\n            // \n            this.noFactionalWarfareLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n            this.noFactionalWarfareLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noFactionalWarfareLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noFactionalWarfareLabel.Location = new System.Drawing.Point(0, 0);\n            this.noFactionalWarfareLabel.Name = \"noFactionalWarfareLabel\";\n            this.noFactionalWarfareLabel.Size = new System.Drawing.Size(409, 607);\n            this.noFactionalWarfareLabel.TabIndex = 3;\n            this.noFactionalWarfareLabel.Text = \"Factional Warfare information not available.\";\n            this.noFactionalWarfareLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // notEnlistedLabel\n            // \n            this.notEnlistedLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n            this.notEnlistedLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.notEnlistedLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.notEnlistedLabel.Location = new System.Drawing.Point(0, 0);\n            this.notEnlistedLabel.Name = \"notEnlistedLabel\";\n            this.notEnlistedLabel.Size = new System.Drawing.Size(409, 607);\n            this.notEnlistedLabel.TabIndex = 4;\n            this.notEnlistedLabel.Text = \"Character not enlisted in Factional Warfare.\";\n            this.notEnlistedLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // ListPanel\n            // \n            this.ListPanel.Controls.Add(this.ListSplitContainer);\n            this.ListPanel.Controls.Add(this.HeaderTableLayoutPanel);\n            this.ListPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ListPanel.Location = new System.Drawing.Point(0, 0);\n            this.ListPanel.Name = \"ListPanel\";\n            this.ListPanel.Size = new System.Drawing.Size(409, 607);\n            this.ListPanel.TabIndex = 6;\n            // \n            // ListSplitContainer\n            // \n            this.ListSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ListSplitContainer.IsSplitterFixed = true;\n            this.ListSplitContainer.Location = new System.Drawing.Point(0, 70);\n            this.ListSplitContainer.Name = \"ListSplitContainer\";\n            this.ListSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;\n            // \n            // ListSplitContainer.Panel1\n            // \n            this.ListSplitContainer.Panel1.Controls.Add(this.lvPersonal);\n            // \n            // ListSplitContainer.Panel2\n            // \n            this.ListSplitContainer.Panel2.Controls.Add(this.lvMilitia);\n            this.ListSplitContainer.RememberDistanceKey = null;\n            this.ListSplitContainer.Size = new System.Drawing.Size(409, 537);\n            this.ListSplitContainer.SplitterDistance = 232;\n            this.ListSplitContainer.SplitterWidth = 1;\n            this.ListSplitContainer.TabIndex = 9;\n            // \n            // lvPersonal\n            // \n            this.lvPersonal.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lvPersonal.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chDescription,\n            this.chYou,\n            this.chAll});\n            this.lvPersonal.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvPersonal.FullRowSelect = true;\n            listViewGroup1.Header = \"Kills\";\n            listViewGroup1.Name = \"Kills\";\n            listViewGroup2.Header = \"Victory Points\";\n            listViewGroup2.Name = \"Victory Points\";\n            this.lvPersonal.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {\n            listViewGroup1,\n            listViewGroup2});\n            this.lvPersonal.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\n            this.lvPersonal.HideSelection = false;\n            listViewItem1.Group = listViewGroup1;\n            listViewItem2.Group = listViewGroup1;\n            listViewItem3.Group = listViewGroup1;\n            listViewItem4.Group = listViewGroup2;\n            listViewItem5.Group = listViewGroup2;\n            listViewItem6.Group = listViewGroup2;\n            this.lvPersonal.Items.AddRange(new System.Windows.Forms.ListViewItem[] {\n            listViewItem1,\n            listViewItem2,\n            listViewItem3,\n            listViewItem4,\n            listViewItem5,\n            listViewItem6});\n            this.lvPersonal.Location = new System.Drawing.Point(0, 0);\n            this.lvPersonal.MultiSelect = false;\n            this.lvPersonal.Name = \"lvPersonal\";\n            this.lvPersonal.Size = new System.Drawing.Size(409, 232);\n            this.lvPersonal.TabIndex = 6;\n            this.lvPersonal.UseCompatibleStateImageBehavior = false;\n            this.lvPersonal.View = System.Windows.Forms.View.Details;\n            this.lvPersonal.ColumnWidthChanging += new System.Windows.Forms.ColumnWidthChangingEventHandler(this.lvPersonal_ColumnWidthChanging);\n            // \n            // chDescription\n            // \n            this.chDescription.Text = \"Personal\";\n            this.chDescription.Width = 101;\n            // \n            // chYou\n            // \n            this.chYou.Text = \"You\";\n            this.chYou.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n            // \n            // chAll\n            // \n            this.chAll.Text = \"All\";\n            this.chAll.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n            // \n            // lvMilitia\n            // \n            this.lvMilitia.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lvMilitia.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chMilitia,\n            this.chAmarr,\n            this.chCaldari,\n            this.chGallente,\n            this.chMinmatar});\n            this.lvMilitia.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvMilitia.FullRowSelect = true;\n            listViewGroup3.Header = \"General\";\n            listViewGroup3.Name = \"General\";\n            listViewGroup4.Header = \"Kills\";\n            listViewGroup4.Name = \"Kills\";\n            listViewGroup5.Header = \"Victory Points\";\n            listViewGroup5.Name = \"Victory Points\";\n            this.lvMilitia.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {\n            listViewGroup3,\n            listViewGroup4,\n            listViewGroup5});\n            this.lvMilitia.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\n            this.lvMilitia.HideSelection = false;\n            listViewItem7.Group = listViewGroup3;\n            listViewItem8.Group = listViewGroup3;\n            listViewItem9.Group = listViewGroup4;\n            listViewItem10.Group = listViewGroup4;\n            listViewItem11.Group = listViewGroup4;\n            listViewItem12.Group = listViewGroup5;\n            listViewItem13.Group = listViewGroup5;\n            listViewItem14.Group = listViewGroup5;\n            this.lvMilitia.Items.AddRange(new System.Windows.Forms.ListViewItem[] {\n            listViewItem7,\n            listViewItem8,\n            listViewItem9,\n            listViewItem10,\n            listViewItem11,\n            listViewItem12,\n            listViewItem13,\n            listViewItem14});\n            this.lvMilitia.Location = new System.Drawing.Point(0, 0);\n            this.lvMilitia.MultiSelect = false;\n            this.lvMilitia.Name = \"lvMilitia\";\n            this.lvMilitia.Size = new System.Drawing.Size(409, 304);\n            this.lvMilitia.TabIndex = 7;\n            this.lvMilitia.UseCompatibleStateImageBehavior = false;\n            this.lvMilitia.View = System.Windows.Forms.View.Details;\n            this.lvMilitia.ColumnWidthChanging += new System.Windows.Forms.ColumnWidthChangingEventHandler(this.lvMilitia_ColumnWidthChanging);\n            // \n            // chMilitia\n            // \n            this.chMilitia.Text = \"Militia\";\n            this.chMilitia.Width = 101;\n            // \n            // chAmarr\n            // \n            this.chAmarr.Text = \"Amarr\";\n            this.chAmarr.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n            // \n            // chCaldari\n            // \n            this.chCaldari.Text = \"Caldari\";\n            this.chCaldari.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n            // \n            // chGallente\n            // \n            this.chGallente.Text = \"Gallente\";\n            this.chGallente.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n            // \n            // chMinmatar\n            // \n            this.chMinmatar.Text = \"Minmatar\";\n            this.chMinmatar.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n            // \n            // HeaderTableLayoutPanel\n            // \n            this.HeaderTableLayoutPanel.AutoSize = true;\n            this.HeaderTableLayoutPanel.BackColor = System.Drawing.Color.WhiteSmoke;\n            this.HeaderTableLayoutPanel.ColumnCount = 4;\n            this.HeaderTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 64F));\n            this.HeaderTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.HeaderTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.HeaderTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 65F));\n            this.HeaderTableLayoutPanel.Controls.Add(this.FightingPartiesPanel, 1, 0);\n            this.HeaderTableLayoutPanel.Controls.Add(this.FactionPictureBox, 0, 0);\n            this.HeaderTableLayoutPanel.Controls.Add(this.CorporationPictureBox, 3, 0);\n            this.HeaderTableLayoutPanel.Controls.Add(this.RankLabel, 1, 2);\n            this.HeaderTableLayoutPanel.Controls.Add(this.TimeServedLabel, 2, 2);\n            this.HeaderTableLayoutPanel.Controls.Add(this.FactionLabel, 1, 1);\n            this.HeaderTableLayoutPanel.Controls.Add(this.CorporationLabel, 2, 1);\n            this.HeaderTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Top;\n            this.HeaderTableLayoutPanel.Location = new System.Drawing.Point(0, 0);\n            this.HeaderTableLayoutPanel.Name = \"HeaderTableLayoutPanel\";\n            this.HeaderTableLayoutPanel.Padding = new System.Windows.Forms.Padding(0, 3, 0, 3);\n            this.HeaderTableLayoutPanel.RowCount = 3;\n            this.HeaderTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.HeaderTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.HeaderTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.HeaderTableLayoutPanel.Size = new System.Drawing.Size(409, 70);\n            this.HeaderTableLayoutPanel.TabIndex = 8;\n            // \n            // FightingPartiesPanel\n            // \n            this.HeaderTableLayoutPanel.SetColumnSpan(this.FightingPartiesPanel, 2);\n            this.FightingPartiesPanel.Controls.Add(this.PlusPictureBox);\n            this.FightingPartiesPanel.Controls.Add(this.AgainstPictureBox);\n            this.FightingPartiesPanel.Controls.Add(this.AllyAgainstFactionPictureBox);\n            this.FightingPartiesPanel.Controls.Add(this.PrimeAgainstFactionPictureBox);\n            this.FightingPartiesPanel.Controls.Add(this.EnlistedFactionPictureBox);\n            this.FightingPartiesPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.FightingPartiesPanel.Location = new System.Drawing.Point(64, 3);\n            this.FightingPartiesPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.FightingPartiesPanel.Name = \"FightingPartiesPanel\";\n            this.FightingPartiesPanel.Size = new System.Drawing.Size(280, 35);\n            this.FightingPartiesPanel.TabIndex = 7;\n            // \n            // PlusPictureBox\n            // \n            this.PlusPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));\n            this.PlusPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"PlusPictureBox.Image\")));\n            this.PlusPictureBox.Location = new System.Drawing.Point(156, 2);\n            this.PlusPictureBox.Margin = new System.Windows.Forms.Padding(0);\n            this.PlusPictureBox.Name = \"PlusPictureBox\";\n            this.PlusPictureBox.Size = new System.Drawing.Size(32, 32);\n            this.PlusPictureBox.TabIndex = 6;\n            this.PlusPictureBox.TabStop = false;\n            // \n            // AgainstPictureBox\n            // \n            this.AgainstPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));\n            this.AgainstPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"AgainstPictureBox.Image\")));\n            this.AgainstPictureBox.Location = new System.Drawing.Point(92, 2);\n            this.AgainstPictureBox.Margin = new System.Windows.Forms.Padding(0);\n            this.AgainstPictureBox.Name = \"AgainstPictureBox\";\n            this.AgainstPictureBox.Size = new System.Drawing.Size(32, 32);\n            this.AgainstPictureBox.TabIndex = 5;\n            this.AgainstPictureBox.TabStop = false;\n            // \n            // SecondAgainstFactionPictureBox\n            // \n            this.AllyAgainstFactionPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));\n            this.AllyAgainstFactionPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"SecondAgainstFactionPictureBox.Image\")));\n            this.AllyAgainstFactionPictureBox.InitialImage = ((System.Drawing.Image)(resources.GetObject(\"SecondAgainstFactionPictureBox.InitialImage\")));\n            this.AllyAgainstFactionPictureBox.Location = new System.Drawing.Point(188, 2);\n            this.AllyAgainstFactionPictureBox.Margin = new System.Windows.Forms.Padding(0);\n            this.AllyAgainstFactionPictureBox.Name = \"AllyAgainstFactionPictureBox\";\n            this.AllyAgainstFactionPictureBox.Size = new System.Drawing.Size(32, 32);\n            this.AllyAgainstFactionPictureBox.TabIndex = 4;\n            this.AllyAgainstFactionPictureBox.TabStop = false;\n            // \n            // FirstAgainstFactionPictureBox\n            // \n            this.PrimeAgainstFactionPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));\n            this.PrimeAgainstFactionPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"FirstAgainstFactionPictureBox.Image\")));\n            this.PrimeAgainstFactionPictureBox.InitialImage = ((System.Drawing.Image)(resources.GetObject(\"FirstAgainstFactionPictureBox.InitialImage\")));\n            this.PrimeAgainstFactionPictureBox.Location = new System.Drawing.Point(124, 2);\n            this.PrimeAgainstFactionPictureBox.Margin = new System.Windows.Forms.Padding(0);\n            this.PrimeAgainstFactionPictureBox.Name = \"PrimeAgainstFactionPictureBox\";\n            this.PrimeAgainstFactionPictureBox.Size = new System.Drawing.Size(32, 32);\n            this.PrimeAgainstFactionPictureBox.TabIndex = 1;\n            this.PrimeAgainstFactionPictureBox.TabStop = false;\n            // \n            // EnlistedFactionPictureBox\n            // \n            this.EnlistedFactionPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));\n            this.EnlistedFactionPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"EnlistedFactionPictureBox.Image\")));\n            this.EnlistedFactionPictureBox.InitialImage = ((System.Drawing.Image)(resources.GetObject(\"EnlistedFactionPictureBox.InitialImage\")));\n            this.EnlistedFactionPictureBox.Location = new System.Drawing.Point(60, 2);\n            this.EnlistedFactionPictureBox.Margin = new System.Windows.Forms.Padding(0);\n            this.EnlistedFactionPictureBox.Name = \"EnlistedFactionPictureBox\";\n            this.EnlistedFactionPictureBox.Size = new System.Drawing.Size(32, 32);\n            this.EnlistedFactionPictureBox.TabIndex = 0;\n            this.EnlistedFactionPictureBox.TabStop = false;\n            // \n            // FactionPictureBox\n            // \n            this.FactionPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"FactionPictureBox.Image\")));\n            this.FactionPictureBox.InitialImage = ((System.Drawing.Image)(resources.GetObject(\"FactionPictureBox.InitialImage\")));\n            this.FactionPictureBox.Location = new System.Drawing.Point(0, 3);\n            this.FactionPictureBox.Margin = new System.Windows.Forms.Padding(0);\n            this.FactionPictureBox.Name = \"FactionPictureBox\";\n            this.HeaderTableLayoutPanel.SetRowSpan(this.FactionPictureBox, 3);\n            this.FactionPictureBox.Size = new System.Drawing.Size(64, 64);\n            this.FactionPictureBox.TabIndex = 8;\n            this.FactionPictureBox.TabStop = false;\n            // \n            // CorporationPictureBox\n            // \n            this.CorporationPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"CorporationPictureBox.Image\")));\n            this.CorporationPictureBox.InitialImage = ((System.Drawing.Image)(resources.GetObject(\"CorporationPictureBox.InitialImage\")));\n            this.CorporationPictureBox.Location = new System.Drawing.Point(344, 3);\n            this.CorporationPictureBox.Margin = new System.Windows.Forms.Padding(0);\n            this.CorporationPictureBox.Name = \"CorporationPictureBox\";\n            this.HeaderTableLayoutPanel.SetRowSpan(this.CorporationPictureBox, 3);\n            this.CorporationPictureBox.Size = new System.Drawing.Size(64, 64);\n            this.CorporationPictureBox.TabIndex = 9;\n            this.CorporationPictureBox.TabStop = false;\n            // \n            // RankLabel\n            // \n            this.RankLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.RankLabel.AutoSize = true;\n            this.RankLabel.Location = new System.Drawing.Point(165, 54);\n            this.RankLabel.Name = \"RankLabel\";\n            this.RankLabel.Size = new System.Drawing.Size(36, 13);\n            this.RankLabel.TabIndex = 3;\n            this.RankLabel.Text = \"Rank:\";\n            this.RankLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // TimeServedLabel\n            // \n            this.TimeServedLabel.AutoSize = true;\n            this.TimeServedLabel.Location = new System.Drawing.Point(207, 54);\n            this.TimeServedLabel.Name = \"TimeServedLabel\";\n            this.TimeServedLabel.Size = new System.Drawing.Size(68, 13);\n            this.TimeServedLabel.TabIndex = 4;\n            this.TimeServedLabel.Text = \"Time served:\";\n            this.TimeServedLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // FactionLabel\n            // \n            this.FactionLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.FactionLabel.AutoSize = true;\n            this.FactionLabel.Location = new System.Drawing.Point(156, 41);\n            this.FactionLabel.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0);\n            this.FactionLabel.Name = \"FactionLabel\";\n            this.FactionLabel.Size = new System.Drawing.Size(45, 13);\n            this.FactionLabel.TabIndex = 10;\n            this.FactionLabel.Text = \"Faction:\";\n            this.FactionLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // CorporationLabel\n            // \n            this.CorporationLabel.AutoSize = true;\n            this.CorporationLabel.Location = new System.Drawing.Point(207, 41);\n            this.CorporationLabel.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0);\n            this.CorporationLabel.Name = \"CorporationLabel\";\n            this.CorporationLabel.Size = new System.Drawing.Size(64, 13);\n            this.CorporationLabel.TabIndex = 11;\n            this.CorporationLabel.Text = \"Corporation:\";\n            // \n            // CharacterFactionalWarfareStatsList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.ListPanel);\n            this.Controls.Add(this.noFactionalWarfareLabel);\n            this.Controls.Add(this.notEnlistedLabel);\n            this.Name = \"CharacterFactionalWarfareStatsList\";\n            this.Size = new System.Drawing.Size(409, 607);\n            this.ListPanel.ResumeLayout(false);\n            this.ListPanel.PerformLayout();\n            this.ListSplitContainer.Panel1.ResumeLayout(false);\n            this.ListSplitContainer.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.ListSplitContainer)).EndInit();\n            this.ListSplitContainer.ResumeLayout(false);\n            this.HeaderTableLayoutPanel.ResumeLayout(false);\n            this.HeaderTableLayoutPanel.PerformLayout();\n            this.FightingPartiesPanel.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.PlusPictureBox)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.AgainstPictureBox)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.AllyAgainstFactionPictureBox)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.PrimeAgainstFactionPictureBox)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.EnlistedFactionPictureBox)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.FactionPictureBox)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.CorporationPictureBox)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noFactionalWarfareLabel;\n        private System.Windows.Forms.Label notEnlistedLabel;\n        private System.Windows.Forms.Panel ListPanel;\n        private System.Windows.Forms.ListView lvPersonal;\n        private System.Windows.Forms.ColumnHeader chDescription;\n        private System.Windows.Forms.ColumnHeader chYou;\n        private System.Windows.Forms.ColumnHeader chAll;\n        private System.Windows.Forms.ListView lvMilitia;\n        private System.Windows.Forms.ColumnHeader chMilitia;\n        private System.Windows.Forms.ColumnHeader chAmarr;\n        private System.Windows.Forms.ColumnHeader chCaldari;\n        private System.Windows.Forms.ColumnHeader chGallente;\n        private System.Windows.Forms.ColumnHeader chMinmatar;\n        private System.Windows.Forms.TableLayoutPanel HeaderTableLayoutPanel;\n        private System.Windows.Forms.Label RankLabel;\n        private Common.Controls.PersistentSplitContainer ListSplitContainer;\n        private System.Windows.Forms.Label TimeServedLabel;\n        private System.Windows.Forms.Panel FightingPartiesPanel;\n        private System.Windows.Forms.PictureBox AllyAgainstFactionPictureBox;\n        private System.Windows.Forms.PictureBox PrimeAgainstFactionPictureBox;\n        private System.Windows.Forms.PictureBox EnlistedFactionPictureBox;\n        private System.Windows.Forms.PictureBox PlusPictureBox;\n        private System.Windows.Forms.PictureBox AgainstPictureBox;\n        private System.Windows.Forms.PictureBox FactionPictureBox;\n        private System.Windows.Forms.PictureBox CorporationPictureBox;\n        private System.Windows.Forms.Label FactionLabel;\n        private System.Windows.Forms.Label CorporationLabel;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterFactionalWarfareStatsList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Service;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterFactionalWarfareStatsList : UserControl\n    {\n        #region Fields\n\n        private FactionalWarfareStats m_charFacWarStats;\n\n        #endregion\n\n\n        #region Constructor\n\n        public CharacterFactionalWarfareStatsList()\n        {\n            InitializeComponent();\n\n            ListPanel.Visible = false;\n            notEnlistedLabel.Visible = false;\n\n            notEnlistedLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n            noFactionalWarfareLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        #endregion\n\n\n        #region Inherited events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.CharacterFactionalWarfareStatsUpdated += EveMonClient_CharacterFactionalWarfareStatsUpdated;\n            EveMonClient.EveFactionalWarfareStatsUpdated += EveMonClient_EveFactionalWarfareStatsUpdated;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterFactionalWarfareStatsUpdated -= EveMonClient_CharacterFactionalWarfareStatsUpdated;\n            EveMonClient.EveFactionalWarfareStatsUpdated -= EveMonClient_EveFactionalWarfareStatsUpdated;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (Visible)\n                UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Content Management\n\n        /// <summary>\n        /// Updates all the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            // When no character, we just hide the list\n            if (Character == null)\n            {\n                noFactionalWarfareLabel.Visible = true;\n                notEnlistedLabel.Visible = false;\n                ListPanel.Visible = false;\n                return;\n            }\n\n            // When character is not enlisted in factional warfare, we just hide the list\n            // and display the 'Not enlisted' label\n            if (Character.IsFactionalWarfareNotEnlisted)\n            {\n                notEnlistedLabel.Visible = true;\n                noFactionalWarfareLabel.Visible = false;\n                ListPanel.Visible = false;\n                return;\n            }\n\n            m_charFacWarStats = Character.FactionalWarfareStats;\n\n            // Update the header controls\n            UpdateHeader();\n\n            // Update the personal stats list\n            UpdatePersonalStatsList();\n\n            // Update the militia stats list\n            UpdateMilitiaStatsList();\n\n            noFactionalWarfareLabel.Visible = m_charFacWarStats == null;\n            ListPanel.Visible = !noFactionalWarfareLabel.Visible;\n        }\n\n        /// <summary>\n        /// Updates the header.\n        /// </summary>\n        private void UpdateHeader()\n        {\n            if (m_charFacWarStats == null)\n                return;\n\n            List<int> factionsAgainstEnlisted =\n                EveFactionalWarfareStats.GetAgainstFactionIDs(m_charFacWarStats.FactionID).ToList();\n\n            FactionPictureBox.Visible = !Settings.UI.SafeForWork;\n            CorporationPictureBox.Visible = !Settings.UI.SafeForWork;\n            FightingPartiesPanel.Visible = !Settings.UI.SafeForWork || !factionsAgainstEnlisted.Any();\n\n            // Update the images\n            ImageService.GetAllianceImageAsync(FactionPictureBox, m_charFacWarStats.FactionID);\n            ImageService.GetCorporationImageAsync(CorporationPictureBox, Character.CorporationID);\n            ImageService.GetAllianceImageAsync(EnlistedFactionPictureBox, m_charFacWarStats.FactionID);\n\n            if (factionsAgainstEnlisted.Any())\n            {\n                ImageService.GetAllianceImageAsync(PrimeAgainstFactionPictureBox, factionsAgainstEnlisted[0]);\n                ImageService.GetAllianceImageAsync(AllyAgainstFactionPictureBox, factionsAgainstEnlisted[1]);\n            }\n\n            // Update the labels\n            string highestRankText = m_charFacWarStats.HighestRank > m_charFacWarStats.CurrentRank\n                ? $\"({GetMilitiaRank(m_charFacWarStats.HighestRank)})\"\n                : string.Empty;\n\n            TimeSpan timeServed = DateTime.UtcNow.Subtract(m_charFacWarStats.EnlistedDate);\n            string timeServedText = timeServed < TimeSpan.FromDays(1) ? \"Less than one day.\" :\n                $\"{timeServed.Days} day{(timeServed.Days.S())}\";\n\n            FactionLabel.Text = $\"Faction: {m_charFacWarStats.FactionName}\";\n            CorporationLabel.Text = $\"Corporation: {Character.CorporationName}\";\n            RankLabel.Text = $\"Rank: {GetMilitiaRank(m_charFacWarStats.CurrentRank)} {highestRankText}\";\n            TimeServedLabel.Text = $\"Time served: {timeServedText}\";\n        }\n\n        /// <summary>\n        /// Updates the personal stats list.\n        /// </summary>\n        private void UpdatePersonalStatsList()\n        {\n            if (m_charFacWarStats == null)\n                return;\n\n            lvPersonal.BeginUpdate();\n            try\n            {\n                foreach (ListViewItem item in lvPersonal.Items.Cast<ListViewItem>())\n                {\n                    // Add enough subitems to match the number of columns\n                    while (item.SubItems.Count < lvPersonal.Columns.Count)\n                    {\n                        item.SubItems.Add(string.Empty);\n                    }\n\n                    // Create the subitems\n                    CreatePersonalListViewSubItems(item);\n                }\n\n                // Adjust the size of the columns\n                AdjustColumns(lvPersonal);\n            }\n            finally\n            {\n                lvPersonal.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Creates the personal list view sub items.\n        /// </summary>\n        /// <param name=\"item\">The item.</param>\n        private void CreatePersonalListViewSubItems(ListViewItem item)\n        {\n            // Clear the subitems except the item itself\n            for (int i = 1; i < lvPersonal.Columns.Count; i++)\n            {\n                item.SubItems.RemoveAt(1);\n            }\n\n            switch (item.Index)\n            {\n                case 0:\n                    item.SubItems.Add(m_charFacWarStats.KillsYesterday.ToNumericString(0));\n                    item.SubItems.Add(EveFactionalWarfareStats.TotalsKillsYesterday.ToNumericString(0));\n                    break;\n                case 1:\n                    item.SubItems.Add(m_charFacWarStats.KillsLastWeek.ToNumericString(0));\n                    item.SubItems.Add(EveFactionalWarfareStats.TotalsKillsLastWeek.ToNumericString(0));\n                    break;\n                case 2:\n                    item.SubItems.Add(m_charFacWarStats.KillsTotal.ToNumericString(0));\n                    item.SubItems.Add(EveFactionalWarfareStats.TotalsKillsTotal.ToNumericString(0));\n                    break;\n                case 3:\n                    item.SubItems.Add(m_charFacWarStats.VictoryPointsYesterday.ToNumericString(0));\n                    item.SubItems.Add(EveFactionalWarfareStats.TotalsVictoryPointsYesterday.ToNumericString(0));\n                    break;\n                case 4:\n                    item.SubItems.Add(m_charFacWarStats.VictoryPointsLastWeek.ToNumericString(0));\n                    item.SubItems.Add(EveFactionalWarfareStats.TotalsVictoryPointsLastWeek.ToNumericString(0));\n                    break;\n                case 5:\n                    item.SubItems.Add(m_charFacWarStats.VictoryPointsTotal.ToNumericString(0));\n                    item.SubItems.Add(EveFactionalWarfareStats.TotalsVictoryPointsTotal.ToNumericString(0));\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Updates the militia stats list.\n        /// </summary>\n        private void UpdateMilitiaStatsList()\n        {\n            if (m_charFacWarStats == null)\n                return;\n\n            lvMilitia.BeginUpdate();\n            try\n            {\n                foreach (ListViewItem item in lvMilitia.Items.Cast<ListViewItem>())\n                {\n                    // Add enough subitems to match the number of columns\n                    while (item.SubItems.Count < lvMilitia.Columns.Count)\n                    {\n                        item.SubItems.Add(string.Empty);\n                    }\n\n                    // Create the subitems\n                    CreateMilitiaListViewSubItems(item);\n                }\n\n                // Adjust the size of the columns\n                AdjustColumns(lvMilitia);\n            }\n            finally\n            {\n                lvMilitia.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Creates the militia list view sub items.\n        /// </summary>\n        /// <param name=\"item\">The item.</param>\n        private void CreateMilitiaListViewSubItems(ListViewItem item)\n        {\n            // Exit if EVE factional warfare stats have not yet been updated\n            if (!EveFactionalWarfareStats.FactionalWarfareStats.Any())\n                return;\n\n            EveFactionWarfareStats amarrFacWarStats =\n                EveFactionalWarfareStats.GetFactionalWarfareStatsForFaction(DBConstants.AmarrFactionID);\n            EveFactionWarfareStats caldariFacWarStats =\n                EveFactionalWarfareStats.GetFactionalWarfareStatsForFaction(DBConstants.CaldariFactionID);\n            EveFactionWarfareStats gallenteFacWarStats =\n                EveFactionalWarfareStats.GetFactionalWarfareStatsForFaction(DBConstants.GallenteFactionID);\n            EveFactionWarfareStats minmatarFacWarStats =\n                EveFactionalWarfareStats.GetFactionalWarfareStatsForFaction(DBConstants.MinmatarFactionID);\n\n            // Clear the subitems except the item itself\n            for (int i = 1; i < lvMilitia.Columns.Count; i++)\n            {\n                item.SubItems.RemoveAt(1);\n            }\n\n            switch (item.Index)\n            {\n                case 0:\n                    item.SubItems.Add(amarrFacWarStats.Pilots.ToNumericString(0));\n                    item.SubItems.Add(caldariFacWarStats.Pilots.ToNumericString(0));\n                    item.SubItems.Add(gallenteFacWarStats.Pilots.ToNumericString(0));\n                    item.SubItems.Add(minmatarFacWarStats.Pilots.ToNumericString(0));\n                    break;\n                case 1:\n                    item.SubItems.Add(amarrFacWarStats.SystemsControlled.ToNumericString(0));\n                    item.SubItems.Add(caldariFacWarStats.SystemsControlled.ToNumericString(0));\n                    item.SubItems.Add(gallenteFacWarStats.SystemsControlled.ToNumericString(0));\n                    item.SubItems.Add(minmatarFacWarStats.SystemsControlled.ToNumericString(0));\n                    break;\n                case 2:\n                    item.SubItems.Add(amarrFacWarStats.KillsYesterday.ToNumericString(0));\n                    item.SubItems.Add(caldariFacWarStats.KillsYesterday.ToNumericString(0));\n                    item.SubItems.Add(gallenteFacWarStats.KillsYesterday.ToNumericString(0));\n                    item.SubItems.Add(minmatarFacWarStats.KillsYesterday.ToNumericString(0));\n                    break;\n                case 3:\n                    item.SubItems.Add(amarrFacWarStats.KillsLastWeek.ToNumericString(0));\n                    item.SubItems.Add(caldariFacWarStats.KillsLastWeek.ToNumericString(0));\n                    item.SubItems.Add(gallenteFacWarStats.KillsLastWeek.ToNumericString(0));\n                    item.SubItems.Add(minmatarFacWarStats.KillsLastWeek.ToNumericString(0));\n                    break;\n                case 4:\n                    item.SubItems.Add(amarrFacWarStats.KillsTotal.ToNumericString(0));\n                    item.SubItems.Add(caldariFacWarStats.KillsTotal.ToNumericString(0));\n                    item.SubItems.Add(gallenteFacWarStats.KillsTotal.ToNumericString(0));\n                    item.SubItems.Add(minmatarFacWarStats.KillsTotal.ToNumericString(0));\n                    break;\n                case 5:\n                    item.SubItems.Add(amarrFacWarStats.VictoryPointsYesterday.ToNumericString(0));\n                    item.SubItems.Add(caldariFacWarStats.VictoryPointsYesterday.ToNumericString(0));\n                    item.SubItems.Add(gallenteFacWarStats.VictoryPointsYesterday.ToNumericString(0));\n                    item.SubItems.Add(minmatarFacWarStats.VictoryPointsYesterday.ToNumericString(0));\n                    break;\n                case 6:\n                    item.SubItems.Add(amarrFacWarStats.VictoryPointsLastWeek.ToNumericString(0));\n                    item.SubItems.Add(caldariFacWarStats.VictoryPointsLastWeek.ToNumericString(0));\n                    item.SubItems.Add(gallenteFacWarStats.VictoryPointsLastWeek.ToNumericString(0));\n                    item.SubItems.Add(minmatarFacWarStats.VictoryPointsLastWeek.ToNumericString(0));\n                    break;\n                case 7:\n                    item.SubItems.Add(amarrFacWarStats.VictoryPointsTotal.ToNumericString(0));\n                    item.SubItems.Add(caldariFacWarStats.VictoryPointsTotal.ToNumericString(0));\n                    item.SubItems.Add(gallenteFacWarStats.VictoryPointsTotal.ToNumericString(0));\n                    item.SubItems.Add(minmatarFacWarStats.VictoryPointsTotal.ToNumericString(0));\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns(ListView listView)\n        {\n            foreach (ColumnHeader column in listView.Columns)\n            {\n                column.Width = -2;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column\n                if (column.Index != listView.Columns.Count - 1)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (listView.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += listView.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        #endregion\n\n\n        #region Helper methods\n\n        /// <summary>\n        /// Gets the militia rank.\n        /// </summary>\n        /// <param name=\"rank\">The rank.</param>\n        /// <returns></returns>\n        private string GetMilitiaRank(int rank)\n        {\n            switch (Character.FactionalWarfareStats.FactionID)\n            {\n                case DBConstants.AmarrFactionID:\n                    return GetFactionMilitiaRank<AmarrMilitiaRank>(rank).GetDescription();\n                case DBConstants.CaldariFactionID:\n                    return GetFactionMilitiaRank<CaldariMilitiaRank>(rank).GetDescription();\n                case DBConstants.GallenteFactionID:\n                    return GetFactionMilitiaRank<GallenteMilitiaRank>(rank).GetDescription();\n                case DBConstants.MinmatarFactionID:\n                    return GetFactionMilitiaRank<MinmatarMilitiaRank>(rank).GetDescription();\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Gets the faction militia rank.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"rank\">The rank.</param>\n        /// <returns></returns>\n        private static T GetFactionMilitiaRank<T>(int rank)\n        {\n            if (rank < Enum.GetValues(typeof(T)).Length)\n                return (T)Enum.ToObject(typeof(T), rank);\n            return default(T);\n        }\n\n        #endregion\n\n\n        #region Global events\n\n        /// <summary>\n        /// When the character factional warfare stats update, we update the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterFactionalWarfareStatsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the EVE factional warfare stats update, we update the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_EveFactionalWarfareStatsUpdated(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the settings change, we update the content.\n        /// </summary>\n        /// <remarks>In case 'SafeForWork' gets enabled.</remarks>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Local events\n\n        /// <summary>\n        /// Handles the ColumnWidthChanging event of the lvPersonal control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.ColumnWidthChangingEventArgs\"/> instance containing the event data.</param>\n        private void lvPersonal_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)\n        {\n            e.Cancel = true;\n            e.NewWidth = lvPersonal.Columns[e.ColumnIndex].Width;\n        }\n\n        /// <summary>\n        /// Handles the ColumnWidthChanging event of the lvMilitia control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.ColumnWidthChangingEventArgs\"/> instance containing the event data.</param>\n        private void lvMilitia_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)\n        {\n            e.Cancel = true;\n            e.NewWidth = lvMilitia.Columns[e.ColumnIndex].Width;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterFactionalWarfareStatsList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"PlusPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAJ8SURBVFhH7VbPi1JRFJ7njNmMFs6IY1kSlC4aRMT8Lf7W/LFoIbgIQgcrFy0V3IjwRCVoMUZQ\n        C6FVu0CGFrZp59/QP9BfMCu3nb5zmQfNQM3jjTkQfvDx7nv33nO+c+45l7exscY6A+sMaMjAJqAHrgE8\n        1mBC+xZ2uA3sAnvADrBKEdIWYDabd6fT6fFisaDJZPLTarUeIiS99rDU75Q49RaLxToej6lQKFAqlSKj\n        0fgRJizqzVxiJWcAmd9vtVrk9/spHo8TTuQzTN69hFn1W7nwkAFbu92mUChEiURCEeBQb0XlSo6WHV4H\n        lKq/Adjt9nudTkdEn0wm/40Adn4TuA3cAWzAPsBjp9N50O/3KZvNihqAPj6CpWZA4qgfAEfAe+Ad8Bbg\n        Jz59mM/nwnmxWCSv1/s9k8kc4V1WGIvFZJPJ9ATCdCoTfmaZZACazebr2WxGo9GIBoMBDYdDMZZlmcrl\n        sqgB7oRKpUK9Xo84KzzHz263Sy6X6wRWbZpE6HS6zXA4/KZarYpC42iZnHZEK86emc/nhQgmj3O5nHgy\n        cXoE5wHNdwT6+xkKjnD8hOMnXDiCKAOKRqNCDIvgd3TGGaJVCfX6A84ToEHLMfCePfAx2ABf/MaXpVKJ\n        0uk0BYNBQqN8w9yrc2ue4/0peABuaRXAG1kEXzJc5Qrv1+t1ikQiioBjzD06t4b33AJ3QEmrgD/tMzQa\n        DQoEAoqApbfhRYKFAI/Hc3UCarUa+Xy+qxMA5ydut5scDgfhmv50WicXZW5p83r8hNRQ/V/Ar5IkHcIy\n        XzgrA1+vVtAPcp8/BLdX5v3UEYvgvyC+ZLhdl95qqw5o7e//zcBfi/MXCa/XldpQmvEAAAAASUVORK5C\n        YII=\n</value>\n  </data>\n  <data name=\"AgainstPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAY4SURBVFhH7VZ7TJNXFLePry2U0lIo8uhLCxbaSq08WlreUBSxFKEoD7UiPnCTMTXzsaFi3JIN\n        EKeJYgLMGSOKCaIuM8WROGf2x6bbTOYf0yXGZGY6JU4rMgfrd3eO+cjQgVJn4j+7yS/f457zO4977rl3\n        ypRXN1ivjsp/ptdi/LUY9T83r1ODxQy/feBwONyitBlti+aYaoOChCJ/CdAuD4Y8OkruLsmpK0rXHmCz\n        2Vy/eIzqkK7W+nm+Lw+vu5KdlZoLymwAh3lOuP5cGCIYrlLHwoufNf3ctrWKNmnCjjLGUW8sz8Q+qaKn\n        5s5NVHg7t5eR25f3DLvdJe9DYMGgIQTwGKKxBE+iVqtV6n37mtsGrh4ZObprDSlO03rFQn4e4zwfnkEM\n        xuP4hw/TGBslbnVYpo90NbvJwPV2uqWl4SSPR2lBKhQQyJBiVCwBDJ0uXtfXd6Lfe8tDnzywnpRmxI3E\n        Rkk+hnkBQAyIBCgB4YCAcYJ4OiNCoTDYog2/uiBNQ07srSEDN9rp9vbmsxRFGUEyGoD1QUHgghkw+vtP\n        nfP+dpb2HHqXVOQZSGpc+DUWa4qckUXH9QANQIp6E+d/zIxMKrbZTdFeV0YMOb1/FRm42eFra/uwH5xI\n        ATE1GJepVKpYj6fniwd3PXT/ke1kcX4Csc+WP6Q4rCKQiQMkAcyAmYAIAC7F5PuITCpJK0iUe0tsGuLp\n        XANOHKSbmrZ4BAJ+RmRkpK27u+PM/Tse+vzxRlJlTyDzEhUPeRxWGRhJBGQCsgDJABUAlw4L0b/B47Ky\n        5yfLB0txOfbUkBs/7PVte29t3wHIxsD1E76+Qw1PInekKAZBtpoxXADPOQALZguABey/ccZVloBizy1N\n        VTxymJWkrWEh+fFCp+/Wt+2+U/vrSVmmlrisyqEAHrse5OcBSgAOgJWJHI3jNv5Pgy2gWI6i5Oh7h3av\n        I9f6msmxj2qIw6wg5TaFN5DHbgT2hYBKQDETORbriyt+sm7B7qQ2rnSevnh0E925rYzkzpSR5VkK2qxX\n        fsdmsVYDTw3ABcAinQrA/T75ghvrCLRPjrvSvi3JqMVoMH28Glf27t6WpUMtdfm0RSMi1dZwkm6IpLev\n        yhsuzU8+B5ZWglyOKip0RXlp5g7syvCNWw71/XMEHGC77Akjby9J74LzQZGgVdTvrM37vc6VRM9SBPiW\n        WsKHzNNEj2NkfN8Kh5FuXJU7NCtO+SnIFtYuSu1FXTabJQPDCkDIS9WARBTgrCow/XmpZ/NfpVnxj4vT\n        Y+i4CB5dOCvsvjhIcFgo4HXZ9VKvFv4Vp2tokBm+1LPJV1lgGob5t8AoFiFuReyAL7UcXFEgv76iwER/\n        0ugiBoWQmGOCH4gCeQeBcAdgrVBAbbbEBg/gHMqALAkO5OMBtBxQDkgFYPv2fxfAGvKzLboOZ95s4szU\n        k9YNDmLQRPwEZLsAbwJsABX868U5Z5aeoGxGSvxlSH8DzOGWjGLqYGyJTfyOa4+Dorj8THN8a2WRjVZF\n        SUfk4ZKLuebYu+vd2XeY6AvhiQeM4J3qnMs5yTE3osMl34Csr7LISmxJ2gvgxHxGBgvxxUUIBcQJCBAE\n        hIRIQgtzUxoqHNaRGEXYcKRM/Dlk4wM+xdltM6qHoC5+5fO4VYDkJYWJV+DfIMw1gszGiDDxcdQpL7T4\n        wIluLpeDdYBL8HwnRm8y1ZXza786ufPayoo8rzFOPiSTirpBGdOJTSaJR3HeiFdKz3M57GUAq04l7QXj\n        W2FuGSAfYAoVC7fqNFMflRcm/XH2yIZfsq161MfdgEfz+JlAB/h8vvBY56ZT5NEZUltiJSb99K/h9xZQ\n        wksFriW2VDzR8KDBAwZJpwHwtMNjOgyAlw61QavsWGzXETLYQzr21n4PPDnwH7fj+OcBOgBLLzDGq6rq\n        nIbbmYaIeyFiYTsozAXIYHq0mWAq0QjeB/BoxVaL7wKkYCIMDArkO1NjJTdXz1Hf002X4a5BB/Bi8txa\n        oMAJBaTZzeWy1wIhnmYY+bOXyid3XiQbfcL72IHyEVCEC7gc1np4x4Id7QXPiD79iaQYEfZxvM1IxjH+\n        XAJmEnlwvbETIs/oLejFO4FJEabb//7972BeBc9kAv5f5uUy8DcyuqYpJ6rFcQAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"AllyAgainstFactionPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOwAAA\n        DsABataJCQAAA21JREFUWEdjYBgFlIUAo7GxMStlRpCpG2TxhN4JXtmZ2X2SkpJcZBpDvrYQ3xCVvbv3\n        Puvt7v2rq61bDTSJmXzTcOtkBEqx4JBm9PXxXa6upr6FhYXFEpcaLS0tNrIcBgriKROmeGWkZ/TiCWIe\n        qAM50C0BR1HPBJ+szKx+sqIoJISyIAZF0Z5dex5TEkWMgf6BK/EFcXN1sTzQpyK4gt/Px28xgSgiGDs4\n        gxikc8HUhvKelopmPKZw44oigjYTo2BRR8DBjQtbbwkLC/MSo56qanR1dQV3z4z6vW95xR9genGlquHE\n        GFaRnxB6cXPZ/zMbyv5P6O2YC0wL/EB9VCkVMYrXwqz41GXT61Yt6MtaM78zavWyrqBVW6b5XX9wpOP/\n        szMz/5/aMfXzkV2LruzbPPfcjnUzj2xbPfNISox/C1oZgq9MgfgZVGj0dfX5p6emo+d9IS0l4TnZ8R5/\n        FkzI/H8S6PM7hzv+v7o0///bO5v+PzjZ///M1qr/y6Yk/89PcPmrriy+jp2dXREWkvb29iyT+id5FuYX\n        ThAXFwclTOwgKChIFU/xCipqg7k52R8pSIv+z45z/X/tyIz/1/a1/F/UZPM/N0zjv5mmyHteDpYSoDqU\n        uiEgIEB5/579RBXbBPM+0HCpYBets8c2tf3fvrAM7JDzu9v/lyU7fmVjY/MEyoOCGh0QYy5cD968D1K1\n        aUb+vZM7p/4Pc1X6LyrI/b+7JuH/3I6Uf8CgdsGTgAmaS0ziZyjJzzI4uq7jv7uN3n8VGcH3nBzM51Wk\n        +P/PaEv+X1GUOgdHCBBlNlGKJnSXtyRHOv3n4mK/DtTgBIpvDjaWKkMduW+T24of8/LyChNlELmKsuO9\n        LrCysGwA6ldAMgMU77ZhvvbXVFRU3Mg1G0MfqEqNi4sDGcgEkpSXl+cQFuCLBjJxFb0iitJielCDmOLj\n        4x2AbHayHKSnp8e9cN7CKVs2bnkbFhJWBjQEo87HZ3BPV0/mvt37XuXl5E3j4uKSIMcRjMC6fFJ8XPwv\n        fn7+NqABuFpGWM2ura0NLMgv+KWvp78HqICPHAcwKCsrg4LQUphfGERjAziLVx0dHQ2gBkcBAQEfIE39\n        9iIoffT39AeAildRUVFQHqcvADXZ9uzcQ1TxSiuXkVS80soR1CleaeW6UXOJCQEA0sMsxGlB/rQAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n  <data name=\"AllyAgainstFactionPictureBox.InitialImage\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOwAAA\n        DsABataJCQAAA21JREFUWEdjYBgFlIUAo7GxMStlRpCpG2TxhN4JXtmZ2X2SkpJcZBpDvrYQ3xCVvbv3\n        Puvt7v2rq61bDTSJmXzTcOtkBEqx4JBm9PXxXa6upr6FhYXFEpcaLS0tNrIcBgriKROmeGWkZ/TiCWIe\n        qAM50C0BR1HPBJ+szKx+sqIoJISyIAZF0Z5dex5TEkWMgf6BK/EFcXN1sTzQpyK4gt/Px28xgSgiGDs4\n        gxikc8HUhvKelopmPKZw44oigjYTo2BRR8DBjQtbbwkLC/MSo56qanR1dQV3z4z6vW95xR9genGlquHE\n        GFaRnxB6cXPZ/zMbyv5P6O2YC0wL/EB9VCkVMYrXwqz41GXT61Yt6MtaM78zavWyrqBVW6b5XX9wpOP/\n        szMz/5/aMfXzkV2LruzbPPfcjnUzj2xbPfNISox/C1oZgq9MgfgZVGj0dfX5p6emo+d9IS0l4TnZ8R5/\n        FkzI/H8S6PM7hzv+v7o0///bO5v+PzjZ///M1qr/y6Yk/89PcPmrriy+jp2dXREWkvb29iyT+id5FuYX\n        ThAXFwclTOwgKChIFU/xCipqg7k52R8pSIv+z45z/X/tyIz/1/a1/F/UZPM/N0zjv5mmyHteDpYSoDqU\n        uiEgIEB5/579RBXbBPM+0HCpYBets8c2tf3fvrAM7JDzu9v/lyU7fmVjY/MEyoOCGh0QYy5cD968D1K1\n        aUb+vZM7p/4Pc1X6LyrI/b+7JuH/3I6Uf8CgdsGTgAmaS0ziZyjJzzI4uq7jv7uN3n8VGcH3nBzM51Wk\n        +P/PaEv+X1GUOgdHCBBlNlGKJnSXtyRHOv3n4mK/DtTgBIpvDjaWKkMduW+T24of8/LyChNlELmKsuO9\n        LrCysGwA6ldAMgMU77ZhvvbXVFRU3Mg1G0MfqEqNi4sDGcgEkpSXl+cQFuCLBjJxFb0iitJielCDmOLj\n        4x2AbHayHKSnp8e9cN7CKVs2bnkbFhJWBjQEo87HZ3BPV0/mvt37XuXl5E3j4uKSIMcRjMC6fFJ8XPwv\n        fn7+NqABuFpGWM2ura0NLMgv+KWvp78HqICPHAcwKCsrg4LQUphfGERjAziLVx0dHQ2gBkcBAQEfIE39\n        9iIoffT39AeAildRUVFQHqcvADXZ9uzcQ1TxSiuXkVS80soR1CleaeW6UXOJCQEA0sMsxGlB/rQAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n  <data name=\"PrimeAgainstFactionPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOwAAA\n        DsABataJCQAAA21JREFUWEdjYBgFlIUAo7GxMStlRpCpG2TxhN4JXtmZ2X2SkpJcZBpDvrYQ3xCVvbv3\n        Puvt7v2rq61bDTSJmXzTcOtkBEqx4JBm9PXxXa6upr6FhYXFEpcaLS0tNrIcBgriKROmeGWkZ/TiCWIe\n        qAM50C0BR1HPBJ+szKx+sqIoJISyIAZF0Z5dex5TEkWMgf6BK/EFcXN1sTzQpyK4gt/Px28xgSgiGDs4\n        gxikc8HUhvKelopmPKZw44oigjYTo2BRR8DBjQtbbwkLC/MSo56qanR1dQV3z4z6vW95xR9genGlquHE\n        GFaRnxB6cXPZ/zMbyv5P6O2YC0wL/EB9VCkVMYrXwqz41GXT61Yt6MtaM78zavWyrqBVW6b5XX9wpOP/\n        szMz/5/aMfXzkV2LruzbPPfcjnUzj2xbPfNISox/C1oZgq9MgfgZVGj0dfX5p6emo+d9IS0l4TnZ8R5/\n        FkzI/H8S6PM7hzv+v7o0///bO5v+PzjZ///M1qr/y6Yk/89PcPmrriy+jp2dXREWkvb29iyT+id5FuYX\n        ThAXFwclTOwgKChIFU/xCipqg7k52R8pSIv+z45z/X/tyIz/1/a1/F/UZPM/N0zjv5mmyHteDpYSoDqU\n        uiEgIEB5/579RBXbBPM+0HCpYBets8c2tf3fvrAM7JDzu9v/lyU7fmVjY/MEyoOCGh0QYy5cD968D1K1\n        aUb+vZM7p/4Pc1X6LyrI/b+7JuH/3I6Uf8CgdsGTgAmaS0ziZyjJzzI4uq7jv7uN3n8VGcH3nBzM51Wk\n        +P/PaEv+X1GUOgdHCBBlNlGKJnSXtyRHOv3n4mK/DtTgBIpvDjaWKkMduW+T24of8/LyChNlELmKsuO9\n        LrCysGwA6ldAMgMU77ZhvvbXVFRU3Mg1G0MfqEqNi4sDGcgEkpSXl+cQFuCLBjJxFb0iitJielCDmOLj\n        4x2AbHayHKSnp8e9cN7CKVs2bnkbFhJWBjQEo87HZ3BPV0/mvt37XuXl5E3j4uKSIMcRjMC6fFJ8XPwv\n        fn7+NqABuFpGWM2ura0NLMgv+KWvp78HqICPHAcwKCsrg4LQUphfGERjAziLVx0dHQ2gBkcBAQEfIE39\n        9iIoffT39AeAildRUVFQHqcvADXZ9uzcQ1TxSiuXkVS80soR1CleaeW6UXOJCQEA0sMsxGlB/rQAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n  <data name=\"PrimeAgainstFactionPictureBox.InitialImage\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOwAAA\n        DsABataJCQAAA21JREFUWEdjYBgFlIUAo7GxMStlRpCpG2TxhN4JXtmZ2X2SkpJcZBpDvrYQ3xCVvbv3\n        Puvt7v2rq61bDTSJmXzTcOtkBEqx4JBm9PXxXa6upr6FhYXFEpcaLS0tNrIcBgriKROmeGWkZ/TiCWIe\n        qAM50C0BR1HPBJ+szKx+sqIoJISyIAZF0Z5dex5TEkWMgf6BK/EFcXN1sTzQpyK4gt/Px28xgSgiGDs4\n        gxikc8HUhvKelopmPKZw44oigjYTo2BRR8DBjQtbbwkLC/MSo56qanR1dQV3z4z6vW95xR9genGlquHE\n        GFaRnxB6cXPZ/zMbyv5P6O2YC0wL/EB9VCkVMYrXwqz41GXT61Yt6MtaM78zavWyrqBVW6b5XX9wpOP/\n        szMz/5/aMfXzkV2LruzbPPfcjnUzj2xbPfNISox/C1oZgq9MgfgZVGj0dfX5p6emo+d9IS0l4TnZ8R5/\n        FkzI/H8S6PM7hzv+v7o0///bO5v+PzjZ///M1qr/y6Yk/89PcPmrriy+jp2dXREWkvb29iyT+id5FuYX\n        ThAXFwclTOwgKChIFU/xCipqg7k52R8pSIv+z45z/X/tyIz/1/a1/F/UZPM/N0zjv5mmyHteDpYSoDqU\n        uiEgIEB5/579RBXbBPM+0HCpYBets8c2tf3fvrAM7JDzu9v/lyU7fmVjY/MEyoOCGh0QYy5cD968D1K1\n        aUb+vZM7p/4Pc1X6LyrI/b+7JuH/3I6Uf8CgdsGTgAmaS0ziZyjJzzI4uq7jv7uN3n8VGcH3nBzM51Wk\n        +P/PaEv+X1GUOgdHCBBlNlGKJnSXtyRHOv3n4mK/DtTgBIpvDjaWKkMduW+T24of8/LyChNlELmKsuO9\n        LrCysGwA6ldAMgMU77ZhvvbXVFRU3Mg1G0MfqEqNi4sDGcgEkpSXl+cQFuCLBjJxFb0iitJielCDmOLj\n        4x2AbHayHKSnp8e9cN7CKVs2bnkbFhJWBjQEo87HZ3BPV0/mvt37XuXl5E3j4uKSIMcRjMC6fFJ8XPwv\n        fn7+NqABuFpGWM2ura0NLMgv+KWvp78HqICPHAcwKCsrg4LQUphfGERjAziLVx0dHQ2gBkcBAQEfIE39\n        9iIoffT39AeAildRUVFQHqcvADXZ9uzcQ1TxSiuXkVS80soR1CleaeW6UXOJCQEA0sMsxGlB/rQAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n  <data name=\"EnlistedFactionPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOwAAA\n        DsABataJCQAAA21JREFUWEdjYBgFlIUAo7GxMStlRpCpG2TxhN4JXtmZ2X2SkpJcZBpDvrYQ3xCVvbv3\n        Puvt7v2rq61bDTSJmXzTcOtkBEqx4JBm9PXxXa6upr6FhYXFEpcaLS0tNrIcBgriKROmeGWkZ/TiCWIe\n        qAM50C0BR1HPBJ+szKx+sqIoJISyIAZF0Z5dex5TEkWMgf6BK/EFcXN1sTzQpyK4gt/Px28xgSgiGDs4\n        gxikc8HUhvKelopmPKZw44oigjYTo2BRR8DBjQtbbwkLC/MSo56qanR1dQV3z4z6vW95xR9genGlquHE\n        GFaRnxB6cXPZ/zMbyv5P6O2YC0wL/EB9VCkVMYrXwqz41GXT61Yt6MtaM78zavWyrqBVW6b5XX9wpOP/\n        szMz/5/aMfXzkV2LruzbPPfcjnUzj2xbPfNISox/C1oZgq9MgfgZVGj0dfX5p6emo+d9IS0l4TnZ8R5/\n        FkzI/H8S6PM7hzv+v7o0///bO5v+PzjZ///M1qr/y6Yk/89PcPmrriy+jp2dXREWkvb29iyT+id5FuYX\n        ThAXFwclTOwgKChIFU/xCipqg7k52R8pSIv+z45z/X/tyIz/1/a1/F/UZPM/N0zjv5mmyHteDpYSoDqU\n        uiEgIEB5/579RBXbBPM+0HCpYBets8c2tf3fvrAM7JDzu9v/lyU7fmVjY/MEyoOCGh0QYy5cD968D1K1\n        aUb+vZM7p/4Pc1X6LyrI/b+7JuH/3I6Uf8CgdsGTgAmaS0ziZyjJzzI4uq7jv7uN3n8VGcH3nBzM51Wk\n        +P/PaEv+X1GUOgdHCBBlNlGKJnSXtyRHOv3n4mK/DtTgBIpvDjaWKkMduW+T24of8/LyChNlELmKsuO9\n        LrCysGwA6ldAMgMU77ZhvvbXVFRU3Mg1G0MfqEqNi4sDGcgEkpSXl+cQFuCLBjJxFb0iitJielCDmOLj\n        4x2AbHayHKSnp8e9cN7CKVs2bnkbFhJWBjQEo87HZ3BPV0/mvt37XuXl5E3j4uKSIMcRjMC6fFJ8XPwv\n        fn7+NqABuFpGWM2ura0NLMgv+KWvp78HqICPHAcwKCsrg4LQUphfGERjAziLVx0dHQ2gBkcBAQEfIE39\n        9iIoffT39AeAildRUVFQHqcvADXZ9uzcQ1TxSiuXkVS80soR1CleaeW6UXOJCQEA0sMsxGlB/rQAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n  <data name=\"EnlistedFactionPictureBox.InitialImage\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOwAAA\n        DsABataJCQAAA21JREFUWEdjYBgFlIUAo7GxMStlRpCpG2TxhN4JXtmZ2X2SkpJcZBpDvrYQ3xCVvbv3\n        Puvt7v2rq61bDTSJmXzTcOtkBEqx4JBm9PXxXa6upr6FhYXFEpcaLS0tNrIcBgriKROmeGWkZ/TiCWIe\n        qAM50C0BR1HPBJ+szKx+sqIoJISyIAZF0Z5dex5TEkWMgf6BK/EFcXN1sTzQpyK4gt/Px28xgSgiGDs4\n        gxikc8HUhvKelopmPKZw44oigjYTo2BRR8DBjQtbbwkLC/MSo56qanR1dQV3z4z6vW95xR9genGlquHE\n        GFaRnxB6cXPZ/zMbyv5P6O2YC0wL/EB9VCkVMYrXwqz41GXT61Yt6MtaM78zavWyrqBVW6b5XX9wpOP/\n        szMz/5/aMfXzkV2LruzbPPfcjnUzj2xbPfNISox/C1oZgq9MgfgZVGj0dfX5p6emo+d9IS0l4TnZ8R5/\n        FkzI/H8S6PM7hzv+v7o0///bO5v+PzjZ///M1qr/y6Yk/89PcPmrriy+jp2dXREWkvb29iyT+id5FuYX\n        ThAXFwclTOwgKChIFU/xCipqg7k52R8pSIv+z45z/X/tyIz/1/a1/F/UZPM/N0zjv5mmyHteDpYSoDqU\n        uiEgIEB5/579RBXbBPM+0HCpYBets8c2tf3fvrAM7JDzu9v/lyU7fmVjY/MEyoOCGh0QYy5cD968D1K1\n        aUb+vZM7p/4Pc1X6LyrI/b+7JuH/3I6Uf8CgdsGTgAmaS0ziZyjJzzI4uq7jv7uN3n8VGcH3nBzM51Wk\n        +P/PaEv+X1GUOgdHCBBlNlGKJnSXtyRHOv3n4mK/DtTgBIpvDjaWKkMduW+T24of8/LyChNlELmKsuO9\n        LrCysGwA6ldAMgMU77ZhvvbXVFRU3Mg1G0MfqEqNi4sDGcgEkpSXl+cQFuCLBjJxFb0iitJielCDmOLj\n        4x2AbHayHKSnp8e9cN7CKVs2bnkbFhJWBjQEo87HZ3BPV0/mvt37XuXl5E3j4uKSIMcRjMC6fFJ8XPwv\n        fn7+NqABuFpGWM2ura0NLMgv+KWvp78HqICPHAcwKCsrg4LQUphfGERjAziLVx0dHQ2gBkcBAQEfIE39\n        9iIoffT39AeAildRUVFQHqcvADXZ9uzcQ1TxSiuXkVS80soR1CleaeW6UXOJCQEA0sMsxGlB/rQAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n  <data name=\"FactionPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOwAAA\n        DsABataJCQAACQ9JREFUeF7tWntQk1cWT0kQ5B0eApGHIBBgfEEQWZpVdFNfdCogCEEbICioiLpQEQti\n        1IhRUmURkZcUAyIgzUhsUJHwGmUoWjcrLLM6ha61y+ywHXcmnYl/5I+z92ZhduxaJV++EOjkmzl/fd+9\n        53d+937n3HPuoVBMj4kBEwMmBkwMGI0Bmp+fn4vRtBtbceL2xKijeUfvWFhY+Boby6zqx6vO4XDYfYo+\n        6YWSC+qAgID9TCaTgUDYzioQYylL+TSlQHFPofph/Afo6uyCu/K7mtSU1Ge2trYfI0yWxsI1m3pd9mbs\n        bRr5ywicO3sOwlhhGqT8KpJgJLTZBGI0XVUVVaKdyTs1aNVfcZO4anNzc/58XH2al5cXnQCLtPDwcBEy\n        uhSNTXB2dL5Mo9FyCRBAW7VqFY4iRtk1tF27dq3JP5IvQwCIeHEMHDs+DB47Py8dDaElJiZGCY4L7s96\n        FMFefFv0tqi+7j5pybkStZ+P36x6cW0UWcdh9yh6ZGdOn1H7+PjMqn5KWlqaUb04jiL3795XvRh7YbQo\n        Ymwv7pLCS7k6rBw2XhSpqawpRSuhlxd3cnLC/z4hB1ZdWS00ZhShRURE6O3FL5acOMhmszcTIIHGCmEJ\n        qFSqWM8oQiCA/W+I3l68vkL4oFiQK6XT3XEE0PXB4VefKKKrPnK/ZzKdGLckIk1Xe92riIjVseTOPg9m\n        2xLuyeu+lgrjA7XA5+2omjoLzAPkJEE8uf/3rZiAQXk5VF/MVzIYjACSpp4X09CqP4t49VSWC531B0HR\n        ekK1du1aHgFnOC+M/T+QK1eujGo+tQH+1lkAisZcGGgXQta+LAnBvGL+kbBr23qhojoOxh9ehCeyY9DX\n        uAeu1lweYbFY7PlnDQHE5wU5ym9a9yECLsBPoy0gr4gD+e1W1Y74+NwVK1YE4AyP6cTEh6T5UxxhMj0Z\n        27dtikpLio49sHs7t/BQPC8n45OEnPQNCfn7Odz8dHYClj/yWDxFXRyMyrJgQlkLr18q4HFLGii7K6Gj\n        9ZLydnuT7HpDpeSrphqJtKW2qvlaWemXV0oEt66Xie5Jq0TXygtE+9LiOLPtL95bvd3Ni48VFh6e7Lr5\n        BWD5qjr3v1LBR5KOVjlZK9h4LN8pjmsJUH13G378phweSj+HZ0NSGH7QoJUnvY0wgCJEj6wChrqbYaCz\n        EW5KymAPL2bM3p6e8Z6wSbRO8db9TMPV2yM5R96X9+MzfZS7s9VgzIYgKBdmwmhvJfy5UwQ9bUXQUccD\n        RVMmPG5Lh+GOXBjvF8JPf70Or//1BH5ERDzvFcJoZyEMtueB8l4R9MsKYHRADB2NhXA2bwfsiA7TMNzo\n        SpT7Y+PfVUqnxcTEsIqOF+lfbQ4JCWFER0dzcN4tKhapvb2935d3YxK8zKkUsfdie5WPhwOkJUZB6Ske\n        PJIfg4mntfDPkUatTD6th5/Hvoaf/9GvJUD7brQevh8Sw736TCgTxMGBxBBI2hIKgQwbNcWMIsUEv8sv\n        4CiyefNmNqpTyCouVaiDg4NzfX198TGbWLVZj7wfK8TH2xErSwtwoduBF8MJ1n+4AsRFKaBoK4ZJ5Pxe\n        v5Sj36AKRu6fgl5JPDScZMOJPSvhQAIT4tb7QOSyReDuaD2G5hEgwVWnd2aOqbzUoz33e8irNi9cuJCh\n        R/UWg/WlUj+4bLnAXO1gYwlYgpY4QOQqT6gt2Q1jQ3Xw6FaeloCaz8NBvC8IDnODIOkjb2AFOmnsrKgP\n        0Bz4gDTT2yMXdJ5oGh0eJa9OQELej3dDggWVMhKxbDGI8z4BZVcp/Pt7ObRd2ovI8ILxR/Xw96coHF6J\n        g4K9f4A1oUvUFCpFgsbhc4FO9QIS8L7hCEnJ+7ERa8N8+B2VfBgfqtXK4NfnoODTEO2OyOJxYOK5HPqa\n        s0BSnATFh7e8QLkBkVBHFt43SNA379dOJj6WeHmgtRAed1XCy9F2yOKGQvIWf2AssoVFjtYgPJIMvdJi\n        qChKgsayQ5qgoCB8T6DT6k+hJgUvgfPdu4fUifgTD1sLtMb/qXAnbI1wg62/cwdnB6sp3+CmJaBenAlX\n        z/IhNjYW3xQR896ko9dzwuDgALa87jMY7a6BUgEfbXt3CA9yheV+zmBnba6xsaKBu4MlfBThB+1f5kH5\n        6VQ4XXjwmbu7O0tP1XNjeNmFs8KHUhEMIIlc5a8lwMPVTmNtZfEAxfcCCwuzQTdEACZhH3cdtNflgaTq\n        jCYwMHA/wd9gbhg+jeJ00YGxJx1iiIoMAkdHG7CyslChd9jLRyHBCQ86PFHFNgsXqB0QCcKcBJA3iSEx\n        bpPUxsZmpiFwbhk9jSY0cCnr1s1yOJS+FbBxCxbQJtA7IT4j/GJ1bc0oFK6d3YIxbw9HaKgQQHHh/hfo\n        LLJmblo2Q1RfHE8X1JUcBDsbK42ZmZkSDcPe/ddWFXv9lUikocv8oeXKMc3UrTGRaDBDhAb+7GQuV+lA\n        t8ZbHidTOLbPJMd3wbfFMZsiJyMjI5vmdDSYKmO9dYXodLpX0FJPnMTgLY9XVpeVxERxggOWTP8uv1wq\n        UlNeQvsA39KeF51vRRkX91dWFhuMq71EHdn01fkbxKGs1BJfjWcfyG7FDpQQeH0GYQDLly/3zc7O5qM2\n        FxVKQR+4urqucXNzM3izAt5x2gYrlPLiBit8Ne7p6Tm7DVboPs8Xtbgovx36VjP+fBy6u7rhxPETqtWr\n        V+MLDoOuCErRM+7I76gmJyahv7cfWm60aJK5yc8cbB1mtcGK5uHhsflGw41Xbc1tkJ+XD8jwZ0hw6kqk\n        ZUaXDUnPzMiUDPQPgPCUEMLCjNRgxQ5j+zZea3yFHJ1q48aN6mXBy3qmYrsuxhD6trmpuTSdn66xs7PT\n        NlhNhdaZRBdC+t46aN2H69j+S/1xwoKbm/geiz2wQ8JtboZ+tCkvUlKKJMHZ2fmyvb09kQYrvXFqKz5I\n        ppscsCPSdfsTDWVzM+XVkVJa8o5kDinVWx0VG/1zfH6YrjZPV2/9/f2nd5PR8RkcAK42y6Qy8qq3BkdM\n        vgLyq7fkYzTsjGRXbw2LlvzZDVK9JR+mYWf8TYQyw1Jkmt3EgIkBEwMmBkwMGJSB/wBVjC8rQTod4QAA\n        AABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"FactionPictureBox.InitialImage\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOwAAA\n        DsABataJCQAACQ9JREFUeF7tWntQk1cWT0kQ5B0eApGHIBBgfEEQWZpVdFNfdCogCEEbICioiLpQEQti\n        1IhRUmURkZcUAyIgzUhsUJHwGmUoWjcrLLM6ha61y+ywHXcmnYl/5I+z92ZhduxaJV++EOjkmzl/fd+9\n        53d+937n3HPuoVBMj4kBEwMmBkwMGI0Bmp+fn4vRtBtbceL2xKijeUfvWFhY+Boby6zqx6vO4XDYfYo+\n        6YWSC+qAgID9TCaTgUDYzioQYylL+TSlQHFPofph/Afo6uyCu/K7mtSU1Ge2trYfI0yWxsI1m3pd9mbs\n        bRr5ywicO3sOwlhhGqT8KpJgJLTZBGI0XVUVVaKdyTs1aNVfcZO4anNzc/58XH2al5cXnQCLtPDwcBEy\n        uhSNTXB2dL5Mo9FyCRBAW7VqFY4iRtk1tF27dq3JP5IvQwCIeHEMHDs+DB47Py8dDaElJiZGCY4L7s96\n        FMFefFv0tqi+7j5pybkStZ+P36x6cW0UWcdh9yh6ZGdOn1H7+PjMqn5KWlqaUb04jiL3795XvRh7YbQo\n        Ymwv7pLCS7k6rBw2XhSpqawpRSuhlxd3cnLC/z4hB1ZdWS00ZhShRURE6O3FL5acOMhmszcTIIHGCmEJ\n        qFSqWM8oQiCA/W+I3l68vkL4oFiQK6XT3XEE0PXB4VefKKKrPnK/ZzKdGLckIk1Xe92riIjVseTOPg9m\n        2xLuyeu+lgrjA7XA5+2omjoLzAPkJEE8uf/3rZiAQXk5VF/MVzIYjACSpp4X09CqP4t49VSWC531B0HR\n        ekK1du1aHgFnOC+M/T+QK1eujGo+tQH+1lkAisZcGGgXQta+LAnBvGL+kbBr23qhojoOxh9ehCeyY9DX\n        uAeu1lweYbFY7PlnDQHE5wU5ym9a9yECLsBPoy0gr4gD+e1W1Y74+NwVK1YE4AyP6cTEh6T5UxxhMj0Z\n        27dtikpLio49sHs7t/BQPC8n45OEnPQNCfn7Odz8dHYClj/yWDxFXRyMyrJgQlkLr18q4HFLGii7K6Gj\n        9ZLydnuT7HpDpeSrphqJtKW2qvlaWemXV0oEt66Xie5Jq0TXygtE+9LiOLPtL95bvd3Ni48VFh6e7Lr5\n        BWD5qjr3v1LBR5KOVjlZK9h4LN8pjmsJUH13G378phweSj+HZ0NSGH7QoJUnvY0wgCJEj6wChrqbYaCz\n        EW5KymAPL2bM3p6e8Z6wSbRO8db9TMPV2yM5R96X9+MzfZS7s9VgzIYgKBdmwmhvJfy5UwQ9bUXQUccD\n        RVMmPG5Lh+GOXBjvF8JPf70Or//1BH5ERDzvFcJoZyEMtueB8l4R9MsKYHRADB2NhXA2bwfsiA7TMNzo\n        SpT7Y+PfVUqnxcTEsIqOF+lfbQ4JCWFER0dzcN4tKhapvb2935d3YxK8zKkUsfdie5WPhwOkJUZB6Ske\n        PJIfg4mntfDPkUatTD6th5/Hvoaf/9GvJUD7brQevh8Sw736TCgTxMGBxBBI2hIKgQwbNcWMIsUEv8sv\n        4CiyefNmNqpTyCouVaiDg4NzfX198TGbWLVZj7wfK8TH2xErSwtwoduBF8MJ1n+4AsRFKaBoK4ZJ5Pxe\n        v5Sj36AKRu6fgl5JPDScZMOJPSvhQAIT4tb7QOSyReDuaD2G5hEgwVWnd2aOqbzUoz33e8irNi9cuJCh\n        R/UWg/WlUj+4bLnAXO1gYwlYgpY4QOQqT6gt2Q1jQ3Xw6FaeloCaz8NBvC8IDnODIOkjb2AFOmnsrKgP\n        0Bz4gDTT2yMXdJ5oGh0eJa9OQELej3dDggWVMhKxbDGI8z4BZVcp/Pt7ObRd2ovI8ILxR/Xw96coHF6J\n        g4K9f4A1oUvUFCpFgsbhc4FO9QIS8L7hCEnJ+7ERa8N8+B2VfBgfqtXK4NfnoODTEO2OyOJxYOK5HPqa\n        s0BSnATFh7e8QLkBkVBHFt43SNA379dOJj6WeHmgtRAed1XCy9F2yOKGQvIWf2AssoVFjtYgPJIMvdJi\n        qChKgsayQ5qgoCB8T6DT6k+hJgUvgfPdu4fUifgTD1sLtMb/qXAnbI1wg62/cwdnB6sp3+CmJaBenAlX\n        z/IhNjYW3xQR896ko9dzwuDgALa87jMY7a6BUgEfbXt3CA9yheV+zmBnba6xsaKBu4MlfBThB+1f5kH5\n        6VQ4XXjwmbu7O0tP1XNjeNmFs8KHUhEMIIlc5a8lwMPVTmNtZfEAxfcCCwuzQTdEACZhH3cdtNflgaTq\n        jCYwMHA/wd9gbhg+jeJ00YGxJx1iiIoMAkdHG7CyslChd9jLRyHBCQ86PFHFNgsXqB0QCcKcBJA3iSEx\n        bpPUxsZmpiFwbhk9jSY0cCnr1s1yOJS+FbBxCxbQJtA7IT4j/GJ1bc0oFK6d3YIxbw9HaKgQQHHh/hfo\n        LLJmblo2Q1RfHE8X1JUcBDsbK42ZmZkSDcPe/ddWFXv9lUikocv8oeXKMc3UrTGRaDBDhAb+7GQuV+lA\n        t8ZbHidTOLbPJMd3wbfFMZsiJyMjI5vmdDSYKmO9dYXodLpX0FJPnMTgLY9XVpeVxERxggOWTP8uv1wq\n        UlNeQvsA39KeF51vRRkX91dWFhuMq71EHdn01fkbxKGs1BJfjWcfyG7FDpQQeH0GYQDLly/3zc7O5qM2\n        FxVKQR+4urqucXNzM3izAt5x2gYrlPLiBit8Ne7p6Tm7DVboPs8Xtbgovx36VjP+fBy6u7rhxPETqtWr\n        V+MLDoOuCErRM+7I76gmJyahv7cfWm60aJK5yc8cbB1mtcGK5uHhsflGw41Xbc1tkJ+XD8jwZ0hw6kqk\n        ZUaXDUnPzMiUDPQPgPCUEMLCjNRgxQ5j+zZea3yFHJ1q48aN6mXBy3qmYrsuxhD6trmpuTSdn66xs7PT\n        NlhNhdaZRBdC+t46aN2H69j+S/1xwoKbm/geiz2wQ8JtboZ+tCkvUlKKJMHZ2fmyvb09kQYrvXFqKz5I\n        ppscsCPSdfsTDWVzM+XVkVJa8o5kDinVWx0VG/1zfH6YrjZPV2/9/f2nd5PR8RkcAK42y6Qy8qq3BkdM\n        vgLyq7fkYzTsjGRXbw2LlvzZDVK9JR+mYWf8TYQyw1Jkmt3EgIkBEwMmBkwMGJSB/wBVjC8rQTod4QAA\n        AABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"CorporationPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALDwAA\n        Cw8BkvkDpQAADcNJREFUeF7Nmvl7FNUShs9f5SOrC4ugILIKiAurbLIFSQJBISEsYQmKSAiJAhIICfum\n        svivHfutnuqpOXNOdw/33ue5P9TTMz1h+rznq/qqpmn3zz//eBtv3rzxNl6/fu07iVevXnmNly9feo2/\n        //7ba/z111/exp9//unrxosXL7yN58+fexvPnj3zxNOnTyvjydMn3oXAvK8LHIMtA1XoOrAtkBl0EzID\n        fJ5D2qgDzN88efLEP3782D969EjCVcECyd+UqRoq2qm6KUVDyNrKNiABtbAAP3z4sCVaNiAGSQqnUhfQ\n        Omrq35Sl79vAomaoqCobgur7Bw8eeBuubp3WTd8QkvexGu0kfRX0P4UN4XnvUPdtTakctvM6tYpWpW5K\n        0TbI+7ni9+/fl7h3715LuLopHE/fZ6Jup4b0v1AUOAsag7Xw09PTfmpqyhcbEFNT0xdAC4qb1jGkELRK\n        1ViKhudUSXsMVeU9gBqAaty9e9fbcApeVqd1Wkwn6QsUKVwFrKqWpbDANoDLQIGenJwUeI7EnTt3vOvE\n        jLSPKqw6rnVeLnD27Fl/+/ZtPzw87H/77bdK0DLAoaEhPzo66q9everPnDnTqurdqRY1rbIKaWEBDsOl\n        1E0pmmovVtHe3l7//fff+4MHD8pOW6XDFI6lbzOFp2Qz9+7dK8FmhCkcKhqDRAyNidsTfuLWLX+LmLjl\n        iw3QFlNVp1WpOzIyIvBdXV3+wIED/ty5c23OG0JPT98rapQ0VsibN2/67u5ugd+zZ4+8vnHjRpG+7bCT\n        BSjAExMZbBYCmwgXm46qIAtFHzZbDFAsnLQ/fvy4wB89etRfuHBBFkGdTjWc10KWKfrrr7/6kydP+v37\n        98smDAwM+J9//lnSWBSdyOJODsr7MtA//vjDs6FhuNr91ExQp0+f9iyOxZCiYXsBijJgQQo7GbivvJ9s\n        NaRY+nKOa3DNUNXr16/7np4ef+nSJX/s2DH/008/yTWBjQGTPRr8W8K1O3E+MJT1UWpx3759EhcvXoy2\n        GBag6sYMKWVSRa1K6ubBolmsVVghWcP27dv9t99+6yk/C6n/TmF///13T2DMGq6yn95r9NOpfHDgH1Lf\n        akzUOxeIwYaKjo+P+/Pnz0uJHD58WEyyq+uAeMaRI0f84OCgZJWFVVB71DQ+deqUgGuQDayPf6+wITBr\n        sOHC9NUJKVWn7DLGRo0DQI1fu3atrb0oPIslY9i0nTt3JmPHjh2eQE2ObBCpjYp8R5i+gFIa+MzWrVvl\n        +0+cOCGlyWchqL4fGxvzBGumvbpppqSSfmrbzKTpo0DlhtRsMTZ9UYy+/d1337VAs3E//PCDqE1dExgd\n        NUwmsEkoum3btiy2yiZfvny5TVGAFBSTBFwgM7jxcWK8AFVYgMNwdVJX1LydDxE55ERmMjeTrssFgVFV\n        2QQcnOzR9E3VKuqgbNfBLr9l6xa/ZcsWUZgN4rOYsleuXGlRNQZ69eqIDFOsgb/XcCnntWpOZANDMTwk\n        +qnWKGm7a9cuUZF0pt5ZtDUkW59lNUp5sXmbN2/2mzZtkmwAokxRPlfQHFajCd2yAapo2eCA2fzyyy+S\n        Zv39/W1tRtWkDaE66bt79+7C0ELIOjWqdQoM5vbNN99IYL4AWEhVlQ3DB/icssKreM26NSgnAh7CpYYH\n        67pAoyaBOakpaXvhyJfxOenK1MaibLsJU9eaUZWifNePP/7ov/76awl8xKqor2nJX375pWQMR3xKQfVI\n        hmrgYS7WXqzrsnAcNjelbZKSLMiqSs2hOBfGxFiQBR7LTAnIPDCi3IFthKkb1irfieN/9dVXEhgpqqqi\n        HFH9iy++KALfARbQVLiqwYH0Z8dRFkPCcckIC0gPB57PKQOFjZnRaGZGo6Nhncbrs0jfK01QBp8NGzaI\n        wqS4qsl8wfXZgPXr10tQMnQZhWdtGhez12SMs0ODTdlmneZTEzve3Z0PGrbF8OUbN22Ui5GmCq2KylGd\n        d6QCNFDUpq8qyW8NrgUg2WiVBY4s4DO6BoCc4zg8TAxL4BUaLjUw0EtJ3bGxcVGUFONioaq0OxaE66NY\n        LHVtvVpDsikMrK3PstSlFFRlFFZIQIlDhw5FYS14sQHaW9Om1Fqv1n0vZYsGnpqk3aVALxtlU2ZUVqdh\n        CgPJNdesWSu/R0JVY6DhOUqGcPGhIbsDM5KnbpmieAELYRNQrNlq8pqNwVaZErBFnTYUzVM4T9/hRvri\n        S6tWrZaaB6QMWmE54hsMWkNDxBnvWoeGdI2qurafsvssgFrsJIVjimr6FqBBrYaAOPyqVav8ypUrZay+\n        cCFTNNschVXQHHaoCMZzGy7WT8PhQWs1NCWcn1pkUEmlsHXesFZjplQ3fQH8/PPP/YoVK+RO0dmzacgQ\n        umUDUhNSmL4hIIrRjtgASsGmbgq081rN61RS93yWuo30RVWC7Pvss89kBimD5LP8h9cpT1s/lR3pFoQL\n        U7euGbGotWvXigqMn7ZO66jYbkrnctAMslmnuaopOLxn2bJlMoECqKAcBbQRCkuphOGqgFOGhALU4OrV\n        q2UD6kBbM7KGpHVapaL9HOCNGzf6Tz/9VAYgheQYQrK+MPAQQjagZUIS5x2WKDMklGEDCEog1WbOk7qN\n        lLWG1ClsrmZ+70CDaXDJkiWyAQrdCgpkvx84MSBrJGjXNtzbpi4wa9asERfu6+sr0rfKdZPgpxt1qqlr\n        QGOpyzmu/8knn8hvFNTsJwR0oA00BGdSJFynqas1yhEDXL58uQwjHSlamNJpqdOTJ9WU2mu0LXWzdAYU\n        oKVLl/pFixZJGw4B9b2C6pFxnWC0J9o2wPbRmCGpKXGkDWJCmFHMrPSWV2hGsTodHGytU63RVOoy7gL/\n        0UcfSRsOQXkfwjJCh+EE2DhvJ3XKNMYGkAV6jy9XNK9TzsVhB1tMqVmjeQqn1LTnqXs2gCwIQVXdGHDb\n        BpS1mda0ps3kNzEJQKk1NgAj4iZIa62iaBNUFM3MaKBhRlWgMUVVVQCXLF3iFyxYID+L64DiU31Hs+CY\n        BT/hj/Qd8S5Vu2H64qYoEPZU7tBgRJghkFqzYkqiZtx9U6aUqlWgFZRfnsAT3Ce0GwAc5xS0gM2AuZtF\n        8L9WvT29UjquABVVmy0mTF/u9FDznLeQfNnHH3/sFy9eLD+J0+l7TD6Lm1JuSBYypSrXY8OBpwu0KJpB\n        MhZTGmyCgDaiJzvPZ2G41JQEJLDcAdqc3ZFl4CDVuTvL6GlTmCzgomwE5pQGbXXgOsChkkye8+bNkw3A\n        g1RRXvPLlJL84IMPZK160yQGzjoJZxUFunDfLOWBPNR9qGg3Csmm2DaDWmwQn3Nk122rqQPKd1jYUFlA\n        2egPP/xQAIHlOgoHDFMpn2nwQ4kbNgqrR85puKLN9LdOSDaVUR04Yt269f54Y4hQ9+XILMDnKMMmcLFY\n        GgMWgxVTkjrtLVTt6e3xBJDAA/b+++9L1+H7Q2XJgvfee68I5gMLS1locKOXcLGatXUK3Lp162TuxgPY\n        Va3XUFl8YuHChbIJlAP38ENVFVRgbY1mhoQphVAAUOsKT2oDEVOV/5NABOYSro9wCpo6uhA2TF0gVTVV\n        LlTWQuomUKfz58+XOmSxhRklQGN1iqkChKpz586VukZlVTVUlM8Azf/XOX9CRY+8tkEZE66u+yq0rc2+\n        RtrmquYthmAmoCtoLbIRZBEpGYJqKquiLBLlcHoFB54ssHBWUQVtnovDAqzPNXAkQ12qTlOpq5AskpTr\n        7T2cpW7TjBQQlbhhgWlRtxqUBzXMvQT9Tw7+DgMjbfm7OXPmSMyePVsygB87IbyqyXk8h83lXAipoPo8\n        Q3h0Vc5bDA5ZvVKjfAELotZZMDcjuHBMWVRlAahPFqBkGAobHskAW8NF+u7PIVkH1+a7Z86aKZ0Kn+I/\n        ZlOw9jxZSrjcec2E1ACN1STnMBg1JFUVcwTWOm7ovihFTaM8ivEjhk3Rno7STJNkhVUzpaiW2YwZM7wG\n        JcM1FFQhwyPfr+HEeXviU1JKVRaq9clgkj8TmJuPGhDK6+vQgdtrNjesGCzfowChspwnc9iAd999VzKm\n        DFahGeQ0XAoyNTxwnvTkZiRpRz2HoMBggiw4dGJ1305qVe89AmfVxYNmzZola6G0dPKzClvY2GuXArUt\n        JgTki9SU9DWgLI6BhU1hYWwUKU1rDN23Tp1SWmSYGiJGyfcrIPWOD/BeH8qIQfIZoc8o6ZMrHF1eq80J\n        KZW2msapfqpuS6+eOXNmUZfUeR1jiqUum0dqv/POOxK8pmOUqdqE3SHAFjb22qUmpBD0QGNwqEpd1KB9\n        aV3SMcpMyaZrLHUpM90ANlfhd+3a3aJqHVh9yEOfK8QwZQNiE1LKkKpSly+lOzC44PCoqOrGYKtqlHZL\n        KRFkU5WiFlJf63OE+pCHPbq3BWUjYm0GSKD0SEpWQTZVbdapKsriFdq+jqlpH5qMwYbneOjDVSnaafrW\n        gS0zpVDhThWNgQOaimIDUkNDKn3rgtqnQztN37dRtAxWH/PhhipBl3FVg0MdUP4m1WaqFNXnCcvqNJa6\n        nYICGwsXm47qtZnyFlOWus1HYfMnz1IBJJ+VwaqaVtUULJOifsZrwqVgbZ12mrraZuoYURWgwgtg49FZ\n        Td8UaAipsHrkR5OG+38yJKu0Vfa/AQqwPm1qj65M3bCPdlKnqn7d9K2CrFI1pm4M2J5jrP4XOKBLpRhR\n        VmgAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"CorporationPictureBox.InitialImage\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALDwAA\n        Cw8BkvkDpQAADcNJREFUeF7Nmvl7FNUShs9f5SOrC4ugILIKiAurbLIFSQJBISEsYQmKSAiJAhIICfum\n        svivHfutnuqpOXNOdw/33ue5P9TTMz1h+rznq/qqpmn3zz//eBtv3rzxNl6/fu07iVevXnmNly9feo2/\n        //7ba/z111/exp9//unrxosXL7yN58+fexvPnj3zxNOnTyvjydMn3oXAvK8LHIMtA1XoOrAtkBl0EzID\n        fJ5D2qgDzN88efLEP3782D969EjCVcECyd+UqRoq2qm6KUVDyNrKNiABtbAAP3z4sCVaNiAGSQqnUhfQ\n        Omrq35Sl79vAomaoqCobgur7Bw8eeBuubp3WTd8QkvexGu0kfRX0P4UN4XnvUPdtTakctvM6tYpWpW5K\n        0TbI+7ni9+/fl7h3715LuLopHE/fZ6Jup4b0v1AUOAsag7Xw09PTfmpqyhcbEFNT0xdAC4qb1jGkELRK\n        1ViKhudUSXsMVeU9gBqAaty9e9fbcApeVqd1Wkwn6QsUKVwFrKqWpbDANoDLQIGenJwUeI7EnTt3vOvE\n        jLSPKqw6rnVeLnD27Fl/+/ZtPzw87H/77bdK0DLAoaEhPzo66q9everPnDnTqurdqRY1rbIKaWEBDsOl\n        1E0pmmovVtHe3l7//fff+4MHD8pOW6XDFI6lbzOFp2Qz9+7dK8FmhCkcKhqDRAyNidsTfuLWLX+LmLjl\n        iw3QFlNVp1WpOzIyIvBdXV3+wIED/ty5c23OG0JPT98rapQ0VsibN2/67u5ugd+zZ4+8vnHjRpG+7bCT\n        BSjAExMZbBYCmwgXm46qIAtFHzZbDFAsnLQ/fvy4wB89etRfuHBBFkGdTjWc10KWKfrrr7/6kydP+v37\n        98smDAwM+J9//lnSWBSdyOJODsr7MtA//vjDs6FhuNr91ExQp0+f9iyOxZCiYXsBijJgQQo7GbivvJ9s\n        NaRY+nKOa3DNUNXr16/7np4ef+nSJX/s2DH/008/yTWBjQGTPRr8W8K1O3E+MJT1UWpx3759EhcvXoy2\n        GBag6sYMKWVSRa1K6ubBolmsVVghWcP27dv9t99+6yk/C6n/TmF///13T2DMGq6yn95r9NOpfHDgH1Lf\n        akzUOxeIwYaKjo+P+/Pnz0uJHD58WEyyq+uAeMaRI0f84OCgZJWFVVB71DQ+deqUgGuQDayPf6+wITBr\n        sOHC9NUJKVWn7DLGRo0DQI1fu3atrb0oPIslY9i0nTt3JmPHjh2eQE2ObBCpjYp8R5i+gFIa+MzWrVvl\n        +0+cOCGlyWchqL4fGxvzBGumvbpppqSSfmrbzKTpo0DlhtRsMTZ9UYy+/d1337VAs3E//PCDqE1dExgd\n        NUwmsEkoum3btiy2yiZfvny5TVGAFBSTBFwgM7jxcWK8AFVYgMNwdVJX1LydDxE55ERmMjeTrssFgVFV\n        2QQcnOzR9E3VKuqgbNfBLr9l6xa/ZcsWUZgN4rOYsleuXGlRNQZ69eqIDFOsgb/XcCnntWpOZANDMTwk\n        +qnWKGm7a9cuUZF0pt5ZtDUkW59lNUp5sXmbN2/2mzZtkmwAokxRPlfQHFajCd2yAapo2eCA2fzyyy+S\n        Zv39/W1tRtWkDaE66bt79+7C0ELIOjWqdQoM5vbNN99IYL4AWEhVlQ3DB/icssKreM26NSgnAh7CpYYH\n        67pAoyaBOakpaXvhyJfxOenK1MaibLsJU9eaUZWifNePP/7ov/76awl8xKqor2nJX375pWQMR3xKQfVI\n        hmrgYS7WXqzrsnAcNjelbZKSLMiqSs2hOBfGxFiQBR7LTAnIPDCi3IFthKkb1irfieN/9dVXEhgpqqqi\n        HFH9iy++KALfARbQVLiqwYH0Z8dRFkPCcckIC0gPB57PKQOFjZnRaGZGo6Nhncbrs0jfK01QBp8NGzaI\n        wqS4qsl8wfXZgPXr10tQMnQZhWdtGhez12SMs0ODTdlmneZTEzve3Z0PGrbF8OUbN22Ui5GmCq2KylGd\n        d6QCNFDUpq8qyW8NrgUg2WiVBY4s4DO6BoCc4zg8TAxL4BUaLjUw0EtJ3bGxcVGUFONioaq0OxaE66NY\n        LHVtvVpDsikMrK3PstSlFFRlFFZIQIlDhw5FYS14sQHaW9Om1Fqv1n0vZYsGnpqk3aVALxtlU2ZUVqdh\n        CgPJNdesWSu/R0JVY6DhOUqGcPGhIbsDM5KnbpmieAELYRNQrNlq8pqNwVaZErBFnTYUzVM4T9/hRvri\n        S6tWrZaaB6QMWmE54hsMWkNDxBnvWoeGdI2qurafsvssgFrsJIVjimr6FqBBrYaAOPyqVav8ypUrZay+\n        cCFTNNschVXQHHaoCMZzGy7WT8PhQWs1NCWcn1pkUEmlsHXesFZjplQ3fQH8/PPP/YoVK+RO0dmzacgQ\n        umUDUhNSmL4hIIrRjtgASsGmbgq081rN61RS93yWuo30RVWC7Pvss89kBimD5LP8h9cpT1s/lR3pFoQL\n        U7euGbGotWvXigqMn7ZO66jYbkrnctAMslmnuaopOLxn2bJlMoECqKAcBbQRCkuphOGqgFOGhALU4OrV\n        q2UD6kBbM7KGpHVapaL9HOCNGzf6Tz/9VAYgheQYQrK+MPAQQjagZUIS5x2WKDMklGEDCEog1WbOk7qN\n        lLWG1ClsrmZ+70CDaXDJkiWyAQrdCgpkvx84MSBrJGjXNtzbpi4wa9asERfu6+sr0rfKdZPgpxt1qqlr\n        QGOpyzmu/8knn8hvFNTsJwR0oA00BGdSJFynqas1yhEDXL58uQwjHSlamNJpqdOTJ9WU2mu0LXWzdAYU\n        oKVLl/pFixZJGw4B9b2C6pFxnWC0J9o2wPbRmCGpKXGkDWJCmFHMrPSWV2hGsTodHGytU63RVOoy7gL/\n        0UcfSRsOQXkfwjJCh+EE2DhvJ3XKNMYGkAV6jy9XNK9TzsVhB1tMqVmjeQqn1LTnqXs2gCwIQVXdGHDb\n        BpS1mda0ps3kNzEJQKk1NgAj4iZIa62iaBNUFM3MaKBhRlWgMUVVVQCXLF3iFyxYID+L64DiU31Hs+CY\n        BT/hj/Qd8S5Vu2H64qYoEPZU7tBgRJghkFqzYkqiZtx9U6aUqlWgFZRfnsAT3Ce0GwAc5xS0gM2AuZtF\n        8L9WvT29UjquABVVmy0mTF/u9FDznLeQfNnHH3/sFy9eLD+J0+l7TD6Lm1JuSBYypSrXY8OBpwu0KJpB\n        MhZTGmyCgDaiJzvPZ2G41JQEJLDcAdqc3ZFl4CDVuTvL6GlTmCzgomwE5pQGbXXgOsChkkye8+bNkw3A\n        g1RRXvPLlJL84IMPZK160yQGzjoJZxUFunDfLOWBPNR9qGg3Csmm2DaDWmwQn3Nk122rqQPKd1jYUFlA\n        2egPP/xQAIHlOgoHDFMpn2nwQ4kbNgqrR85puKLN9LdOSDaVUR04Yt269f54Y4hQ9+XILMDnKMMmcLFY\n        GgMWgxVTkjrtLVTt6e3xBJDAA/b+++9L1+H7Q2XJgvfee68I5gMLS1locKOXcLGatXUK3Lp162TuxgPY\n        Va3XUFl8YuHChbIJlAP38ENVFVRgbY1mhoQphVAAUOsKT2oDEVOV/5NABOYSro9wCpo6uhA2TF0gVTVV\n        LlTWQuomUKfz58+XOmSxhRklQGN1iqkChKpz586VukZlVTVUlM8Azf/XOX9CRY+8tkEZE66u+yq0rc2+\n        RtrmquYthmAmoCtoLbIRZBEpGYJqKquiLBLlcHoFB54ssHBWUQVtnovDAqzPNXAkQ12qTlOpq5AskpTr\n        7T2cpW7TjBQQlbhhgWlRtxqUBzXMvQT9Tw7+DgMjbfm7OXPmSMyePVsygB87IbyqyXk8h83lXAipoPo8\n        Q3h0Vc5bDA5ZvVKjfAELotZZMDcjuHBMWVRlAahPFqBkGAobHskAW8NF+u7PIVkH1+a7Z86aKZ0Kn+I/\n        ZlOw9jxZSrjcec2E1ACN1STnMBg1JFUVcwTWOm7ovihFTaM8ivEjhk3Rno7STJNkhVUzpaiW2YwZM7wG\n        JcM1FFQhwyPfr+HEeXviU1JKVRaq9clgkj8TmJuPGhDK6+vQgdtrNjesGCzfowChspwnc9iAd999VzKm\n        DFahGeQ0XAoyNTxwnvTkZiRpRz2HoMBggiw4dGJ1305qVe89AmfVxYNmzZola6G0dPKzClvY2GuXArUt\n        JgTki9SU9DWgLI6BhU1hYWwUKU1rDN23Tp1SWmSYGiJGyfcrIPWOD/BeH8qIQfIZoc8o6ZMrHF1eq80J\n        KZW2msapfqpuS6+eOXNmUZfUeR1jiqUum0dqv/POOxK8pmOUqdqE3SHAFjb22qUmpBD0QGNwqEpd1KB9\n        aV3SMcpMyaZrLHUpM90ANlfhd+3a3aJqHVh9yEOfK8QwZQNiE1LKkKpSly+lOzC44PCoqOrGYKtqlHZL\n        KRFkU5WiFlJf63OE+pCHPbq3BWUjYm0GSKD0SEpWQTZVbdapKsriFdq+jqlpH5qMwYbneOjDVSnaafrW\n        gS0zpVDhThWNgQOaimIDUkNDKn3rgtqnQztN37dRtAxWH/PhhipBl3FVg0MdUP4m1WaqFNXnCcvqNJa6\n        nYICGwsXm47qtZnyFlOWus1HYfMnz1IBJJ+VwaqaVtUULJOifsZrwqVgbZ12mrraZuoYURWgwgtg49FZ\n        Td8UaAipsHrkR5OG+38yJKu0Vfa/AQqwPm1qj65M3bCPdlKnqn7d9K2CrFI1pm4M2J5jrP4XOKBLpRhR\n        VmgAAAAASUVORK5CYII=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterIndustryJobsList.Designer.cs",
    "content": "using EVEMon.Common.Controls;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterIndustryJobsList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterIndustryJobsList));\n            this.lvJobs = new System.Windows.Forms.ListView();\n            this.chState = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chTTC = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chInstalledItem = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chOutputItem = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.showInstalledInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInBrowserMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.ilIcons = new System.Windows.Forms.ImageList(this.components);\n            this.noJobsLabel = new System.Windows.Forms.Label();\n            this.industryExpPanelControl = new EVEMon.Common.Controls.ExpandablePanelControl();\n            this.showProducedInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.contextMenu.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // lvJobs\n            // \n            this.lvJobs.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lvJobs.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chState,\n            this.chTTC,\n            this.chInstalledItem,\n            this.chOutputItem});\n            this.lvJobs.ContextMenuStrip = this.contextMenu;\n            this.lvJobs.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvJobs.FullRowSelect = true;\n            this.lvJobs.HideSelection = false;\n            this.lvJobs.Location = new System.Drawing.Point(0, 0);\n            this.lvJobs.MultiSelect = false;\n            this.lvJobs.Name = \"lvJobs\";\n            this.lvJobs.Size = new System.Drawing.Size(454, 334);\n            this.lvJobs.SmallImageList = this.ilIcons;\n            this.lvJobs.TabIndex = 0;\n            this.lvJobs.UseCompatibleStateImageBehavior = false;\n            this.lvJobs.View = System.Windows.Forms.View.Details;\n            // \n            // chState\n            // \n            this.chState.Text = \"State\";\n            // \n            // chTTC\n            // \n            this.chTTC.Text = \"TTC\";\n            // \n            // chInstalledItem\n            // \n            this.chInstalledItem.Text = \"Installed Item\";\n            // \n            // chOutputItem\n            // \n            this.chOutputItem.Text = \"Output Item\";\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showInstalledInBrowserMenuItem,\n            this.showProducedInBrowserMenuItem,\n            this.showInBrowserMenuSeparator,\n            this.exportToCSVToolStripMenuItem});\n            this.contextMenu.Name = \"ShipPropertiesContextMenu\";\n            this.contextMenu.Size = new System.Drawing.Size(218, 98);\n            this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenu_Opening);\n            // \n            // showInstalledInBrowserMenuItem\n            // \n            this.showInstalledInBrowserMenuItem.Name = \"showInstalledInBrowserMenuItem\";\n            this.showInstalledInBrowserMenuItem.Size = new System.Drawing.Size(217, 22);\n            this.showInstalledInBrowserMenuItem.Text = \"Show Input In Blueprint Browser...\";\n            this.showInstalledInBrowserMenuItem.Click += new System.EventHandler(this.showInBrowserMenuItem_Click);\n            // \n            // showProducedInBrowserMenuItem\n            // \n            this.showProducedInBrowserMenuItem.Name = \"showProducedInBrowserMenuItem\";\n            this.showProducedInBrowserMenuItem.Size = new System.Drawing.Size(217, 22);\n            this.showProducedInBrowserMenuItem.Text = \"Show Output In Browser...\";\n            this.showProducedInBrowserMenuItem.Click += new System.EventHandler(this.showInBrowserMenuItem_Click);\n            // \n            // showInBrowserMenuSeparator\n            // \n            this.showInBrowserMenuSeparator.Name = \"showInBrowserMenuSeparator\";\n            this.showInBrowserMenuSeparator.Size = new System.Drawing.Size(214, 6);\n            // \n            // exportToCSVToolStripMenuItem\n            // \n            this.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n            this.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(217, 22);\n            this.exportToCSVToolStripMenuItem.Text = \"Export To CSV...\";\n            this.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n            // \n            // ilIcons\n            // \n            this.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n            this.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilIcons.Images.SetKeyName(0, \"arrow_up.png\");\n            this.ilIcons.Images.SetKeyName(1, \"arrow_down.png\");\n            this.ilIcons.Images.SetKeyName(2, \"16x16Transparant.png\");\n            // \n            // noJobsLabel\n            // \n            this.noJobsLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noJobsLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noJobsLabel.Location = new System.Drawing.Point(0, 0);\n            this.noJobsLabel.Name = \"noJobsLabel\";\n            this.noJobsLabel.Size = new System.Drawing.Size(454, 434);\n            this.noJobsLabel.TabIndex = 2;\n            this.noJobsLabel.Text = \"No industry jobs are available.\";\n            this.noJobsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // industryExpPanelControl\n            // \n            this.industryExpPanelControl.AnimationSpeed = EVEMon.Common.Controls.AnimationSpeed.Medium;\n            this.industryExpPanelControl.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.industryExpPanelControl.EnableContextMenu = false;\n            this.industryExpPanelControl.ExpandDirection = EVEMon.Common.Controls.Direction.Down;\n            this.industryExpPanelControl.ExpandedHeight = 100;\n            this.industryExpPanelControl.ExpandedOnStartup = false;\n            this.industryExpPanelControl.HeaderHeight = 30;\n            this.industryExpPanelControl.HeaderText = \"Header Text\";\n            this.industryExpPanelControl.ImageCollapse = ((System.Drawing.Bitmap)(resources.GetObject(\"industryExpPanelControl.ImageCollapse\")));\n            this.industryExpPanelControl.ImageExpand = ((System.Drawing.Bitmap)(resources.GetObject(\"industryExpPanelControl.ImageExpand\")));\n            this.industryExpPanelControl.Location = new System.Drawing.Point(0, 334);\n            this.industryExpPanelControl.Name = \"industryExpPanelControl\";\n            this.industryExpPanelControl.Size = new System.Drawing.Size(454, 100);\n            this.industryExpPanelControl.TabIndex = 1;\n            // \n            // CharacterIndustryJobsList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.lvJobs);\n            this.Controls.Add(this.industryExpPanelControl);\n            this.Controls.Add(this.noJobsLabel);\n            this.Name = \"CharacterIndustryJobsList\";\n            this.Size = new System.Drawing.Size(454, 434);\n            this.contextMenu.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ListView lvJobs;\n        private System.Windows.Forms.Label noJobsLabel;\n        private System.Windows.Forms.ColumnHeader chState;\n        private System.Windows.Forms.ColumnHeader chTTC;\n        private System.Windows.Forms.ColumnHeader chInstalledItem;\n        private System.Windows.Forms.ColumnHeader chOutputItem;\n        private System.Windows.Forms.ImageList ilIcons;\n        private ExpandablePanelControl industryExpPanelControl;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem showInstalledInBrowserMenuItem;\n        private System.Windows.Forms.ToolStripSeparator showInBrowserMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem showProducedInBrowserMenuItem;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterIndustryJobsList.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.SkillPlanner;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterIndustryJobsList : UserControl, IListView\n    {\n        #region Fields\n\n        private const int PAD = 5;\n\n        private readonly List<IndustryJobColumnSettings> m_columns = new List<IndustryJobColumnSettings>();\n        private readonly List<IndustryJob> m_list = new List<IndustryJob>(32);\n\n        private InfiniteDisplayToolTip m_tooltip;\n        private Timer m_refreshTimer;\n        private IndustryJobGrouping m_grouping;\n        private IndustryJobColumn m_sortCriteria;\n        private IssuedFor m_showIssuedFor;\n\n        private string m_textFilter = string.Empty;\n        private bool m_sortAscending = true;\n\n        private bool m_isUpdatingColumns;\n        private bool m_columnsChanged;\n        private bool m_init;\n\n        private int m_columnTTCIndex;\n\n        // Panel info variables\n        private int m_skillBasedManufacturingJobs, m_skillBasedResearchingJobs,\n            m_skillBasedReactionJobs;\n\n        private int m_remoteManufacturingRange, m_remoteResearchingRange,\n            m_remoteReactionsRange;\n\n        private JobsIssued m_activeManufacturing, m_activeResearch, m_activeReactions;\n\n        #endregion\n\n\n        # region Constructor\n\n        public CharacterIndustryJobsList()\n        {\n            InitializeComponent();\n            InitializeExpandablePanelControls();\n\n            lvJobs.Hide();\n            lvJobs.AllowColumnReorder = true;\n            lvJobs.Columns.Clear();\n            industryExpPanelControl.Hide();\n\n            m_showIssuedFor = IssuedFor.All;\n\n            noJobsLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n            industryExpPanelControl.Font = FontFactory.GetFont(\"Tahoma\", 8.25f);\n\n            ListViewHelper.EnableDoubleBuffer(lvJobs);\n\n            lvJobs.ColumnClick += listView_ColumnClick;\n            lvJobs.ColumnWidthChanged += listView_ColumnWidthChanged;\n            lvJobs.ColumnReordered += listView_ColumnReordered;\n            lvJobs.MouseDown += listView_MouseDown;\n            lvJobs.MouseMove += listView_MouseMove;\n            lvJobs.MouseLeave += listView_MouseLeave;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"lvJobs\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        internal bool Visibility\n        {\n            get { return lvJobs.Visible; }\n            set { lvJobs.Visible = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets the text filter.\n        /// </summary>\n        [Browsable(false)]\n        public string TextFilter\n        {\n            get { return m_textFilter; }\n            set\n            {\n                m_textFilter = value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping mode.\n        /// </summary>\n        [Browsable(false)]\n        public Enum Grouping\n        {\n            get { return m_grouping; }\n            set\n            {\n                m_grouping = (IndustryJobGrouping)value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets which \"Issued for\" jobs to display.\n        /// </summary>\n        internal IssuedFor ShowIssuedFor\n        {\n            get { return m_showIssuedFor; }\n            set\n            {\n                m_showIssuedFor = value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets true when character has active jobs issued for corporation.\n        /// </summary>\n        private bool HasActiveCorporationIssuedJobs\n            => m_list.Any(x => x.State == JobState.Active && x.IssuedFor == IssuedFor.Corporation);\n\n        /// <summary>\n        /// Gets or sets the enumeration of jobs to display.\n        /// </summary>\n        internal IEnumerable<IndustryJob> Jobs\n        {\n            get { return m_list; }\n            set\n            {\n                m_list.Clear();\n                if (value == null)\n                    return;\n\n                m_list.AddRange(value);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the settings used for columns.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        public IEnumerable<IColumnSettings> Columns\n        {\n            get\n            {\n                // Add the visible columns; matching the display order\n                List<IndustryJobColumnSettings> newColumns = new List<IndustryJobColumnSettings>();\n                foreach (ColumnHeader header in lvJobs.Columns.Cast<ColumnHeader>().OrderBy(x => x.DisplayIndex))\n                {\n                    IndustryJobColumnSettings columnSetting = m_columns.First(x => x.Column == (IndustryJobColumn)header.Tag);\n                    if (columnSetting.Width > -1)\n                        columnSetting.Width = header.Width;\n\n                    newColumns.Add(columnSetting);\n                }\n\n                // Then add the other columns\n                newColumns.AddRange(m_columns.Where(x => !x.Visible));\n\n                return newColumns;\n            }\n            set\n            {\n                m_columns.Clear();\n                if (value != null)\n                    m_columns.AddRange(value.Cast<IndustryJobColumnSettings>());\n\n                // Whenever the columns changes, we need to\n                // reset the dipslay index of the TTC column\n                m_columnTTCIndex = -1;\n\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        #endregion\n\n\n        # region Inherited Events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            m_tooltip = new InfiniteDisplayToolTip(lvJobs);\n            m_refreshTimer = new Timer();\n\n            m_refreshTimer.Tick += refresh_TimerTick;\n            m_refreshTimer.Interval = 1000;\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.IndustryJobsUpdated += EveMonClient_IndustryJobsUpdated;\n            EveMonClient.ConquerableStationListUpdated += EveMonClient_ConquerableStationListUpdated;\n            EveMonClient.CharacterIndustryJobsCompleted += EveMonClient_CharacterIndustryJobsCompleted;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            m_tooltip.Dispose();\n            m_refreshTimer.Dispose();\n\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.IndustryJobsUpdated -= EveMonClient_IndustryJobsUpdated;\n            EveMonClient.ConquerableStationListUpdated -= EveMonClient_ConquerableStationListUpdated;\n            EveMonClient.CharacterIndustryJobsCompleted -= EveMonClient_CharacterIndustryJobsCompleted;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (DesignMode || this.IsDesignModeHosted() || Character == null || !Visible)\n                return;\n\n            // Prevents the properties to call UpdateColumns() till we set all properties\n            m_init = false;\n\n            lvJobs.Visible = false;\n            industryExpPanelControl.Visible = false;\n\n            Jobs = Character?.IndustryJobs;\n            Columns = Settings.UI.MainWindow.IndustryJobs.Columns;\n            Grouping = Character?.UISettings.JobsGroupBy;\n            TextFilter = string.Empty;\n\n            UpdateColumns();\n\n            m_init = true;\n\n            UpdateListVisibility();\n        }\n\n        # endregion\n\n\n        #region Updates Main Industry Window\n\n        /// <summary>\n        /// Autoresizes the columns.\n        /// </summary>\n        public void AutoResizeColumns()\n        {\n            m_columns.ForEach(column =>\n            {\n                if (column.Visible)\n                    column.Width = -2;\n            });\n\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// Updates the columns.\n        /// </summary>\n        internal void UpdateColumns()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            lvJobs.BeginUpdate();\n            m_isUpdatingColumns = true;\n\n            try\n            {\n                lvJobs.Columns.Clear();\n                lvJobs.Groups.Clear();\n                lvJobs.Items.Clear();\n\n                foreach (IndustryJobColumnSettings column in m_columns.Where(x => x.Visible))\n                {\n                    ColumnHeader header = lvJobs.Columns.Add(column.Column.GetHeader(), column.Width);\n                    header.Tag = column.Column;\n\n                    switch (column.Column)\n                    {\n                        case IndustryJobColumn.TTC:\n                        case IndustryJobColumn.Cost:\n                        case IndustryJobColumn.Probability:\n                            header.TextAlign = HorizontalAlignment.Right;\n                            break;\n                        case IndustryJobColumn.Runs:\n                            header.TextAlign = HorizontalAlignment.Center;\n                            break;\n                    }\n                }\n\n                // We update the content\n                UpdateContent();\n            }\n            finally\n            {\n                lvJobs.EndUpdate();\n                m_isUpdatingColumns = false;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n            int scrollBarPosition = lvJobs.GetVerticalScrollBarPosition();\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = lvJobs.SelectedItems.Count > 0 ? lvJobs.SelectedItems[0].Tag.\n                GetHashCode() : 0;\n            lvJobs.BeginUpdate();\n            try\n            {\n                bool hideInactive = Character != null && Settings.UI.MainWindow.IndustryJobs.\n                    HideInactiveJobs, hideIssued = m_showIssuedFor != IssuedFor.All;\n                var jobs = new LinkedList<IndustryJob>();\n                // Filter jobs\n                foreach (var job in m_list)\n                {\n                    job.UpdateLocation(Character);\n                    job.UpdateInstallation(Character);\n\n                    if (job.InstalledItem != null && job.OutputItem != null && job.\n                        SolarSystem != null && IsTextMatching(job, m_textFilter))\n                    {\n                        if ((!hideInactive || job.IsActive) && (!hideIssued || job.IssuedFor ==\n                                m_showIssuedFor))\n                            jobs.AddLast(job);\n                    }\n                }\n                UpdateSort();\n                UpdateContentByGroup(jobs);\n                // Restore the selected item (if any)\n                if (selectedItem > 0)\n                    foreach (ListViewItem lvItem in lvJobs.Items.Cast<ListViewItem>().Where(\n                            lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                        lvItem.Selected = true;\n                // Adjust the size of the columns\n                AdjustColumns();\n                // Update the expandable panel info\n                UpdateExpPanelContent();\n                UpdateListVisibility();\n            }\n            finally\n            {\n                lvJobs.EndUpdate();\n                lvJobs.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Updates the list visibility.\n        /// </summary>\n        private void UpdateListVisibility()\n        {\n            // Display or hide the \"no jobs\" label\n            if (!m_init)\n                return;\n\n            noJobsLabel.Visible = lvJobs.Items.Count == 0;\n            industryExpPanelControl.Visible = true;\n            industryExpPanelControl.Header.Visible = true;\n            lvJobs.Visible = !noJobsLabel.Visible;\n            m_refreshTimer.Enabled = lvJobs.Visible;\n        }\n\n        /// <summary>\n        /// Updates the content by group.\n        /// </summary>\n        /// <param name=\"jobs\">The jobs.</param>\n        private void UpdateContentByGroup(IEnumerable<IndustryJob> jobs)\n        {\n            switch (m_grouping)\n            {\n                case IndustryJobGrouping.State:\n                    IOrderedEnumerable<IGrouping<JobState, IndustryJob>> groups0 =\n                        jobs.GroupBy(x => x.State).OrderBy(x => (int)x.Key);\n                    UpdateContent(groups0);\n                    break;\n                case IndustryJobGrouping.StateDesc:\n                    IOrderedEnumerable<IGrouping<JobState, IndustryJob>> groups1 =\n                        jobs.GroupBy(x => x.State).OrderByDescending(x => (int)x.Key);\n                    UpdateContent(groups1);\n                    break;\n                case IndustryJobGrouping.EndDate:\n                    IOrderedEnumerable<IGrouping<DateTime, IndustryJob>> groups2 =\n                        jobs.GroupBy(x => x.EndDate.ToLocalTime().Date).OrderBy(x => x.Key);\n                    UpdateContent(groups2);\n                    break;\n                case IndustryJobGrouping.EndDateDesc:\n                    IOrderedEnumerable<IGrouping<DateTime, IndustryJob>> groups3 =\n                        jobs.GroupBy(x => x.EndDate.ToLocalTime().Date).OrderByDescending(x => x.Key);\n                    UpdateContent(groups3);\n                    break;\n                case IndustryJobGrouping.InstalledItemType:\n                    IOrderedEnumerable<IGrouping<string, IndustryJob>> groups4 =\n                        jobs.GroupBy(x => x.InstalledItem.MarketGroup.CategoryPath).OrderBy(x => x.Key);\n                    UpdateContent(groups4);\n                    break;\n                case IndustryJobGrouping.InstalledItemTypeDesc:\n                    IOrderedEnumerable<IGrouping<string, IndustryJob>> groups5 =\n                        jobs.GroupBy(x => x.InstalledItem.MarketGroup.CategoryPath).OrderByDescending(x => x.Key);\n                    UpdateContent(groups5);\n                    break;\n                case IndustryJobGrouping.OutputItemType:\n                    IOrderedEnumerable<IGrouping<string, IndustryJob>> groups6 =\n                        jobs.GroupBy(x => x.OutputItem.MarketGroup.CategoryPath).OrderBy(x => x.Key);\n                    UpdateContent(groups6);\n                    break;\n                case IndustryJobGrouping.OutputItemTypeDesc:\n                    IOrderedEnumerable<IGrouping<string, IndustryJob>> groups7 =\n                        jobs.GroupBy(x => x.OutputItem.MarketGroup.CategoryPath).OrderByDescending(x => x.Key);\n                    UpdateContent(groups7);\n                    break;\n                case IndustryJobGrouping.Activity:\n                    IOrderedEnumerable<IGrouping<string, IndustryJob>> groups8 =\n                        jobs.GroupBy(x => x.Activity.GetDescription()).OrderBy(x => x.Key);\n                    UpdateContent(groups8);\n                    break;\n                case IndustryJobGrouping.ActivityDesc:\n                    IOrderedEnumerable<IGrouping<string, IndustryJob>> groups9 =\n                        jobs.GroupBy(x => x.Activity.GetDescription()).OrderByDescending(x => x.Key);\n                    UpdateContent(groups9);\n                    break;\n                case IndustryJobGrouping.Location:\n                    IOrderedEnumerable<IGrouping<string, IndustryJob>> groups10 =\n                        jobs.GroupBy(x => x.Installation).OrderBy(x => x.Key);\n                    UpdateContent(groups10);\n                    break;\n                case IndustryJobGrouping.LocationDesc:\n                    IOrderedEnumerable<IGrouping<string, IndustryJob>> groups11 =\n                        jobs.GroupBy(x => x.Installation).OrderByDescending(x => x.Key);\n                    UpdateContent(groups11);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        /// <typeparam name=\"TKey\"></typeparam>\n        /// <param name=\"groups\"></param>\n        private void UpdateContent<TKey>(IEnumerable<IGrouping<TKey, IndustryJob>> groups)\n        {\n            lvJobs.Items.Clear();\n            lvJobs.Groups.Clear();\n\n            // Add the groups\n            foreach (IGrouping<TKey, IndustryJob> group in groups)\n            {\n                string groupText;\n                if (group.Key is JobState)\n                    groupText = ((JobState)(object)group.Key).GetHeader();\n                else if (group.Key is DateTime)\n                    groupText = ((DateTime)(object)group.Key).ToShortDateString();\n                else\n                    groupText = group.Key.ToString();\n\n                ListViewGroup listGroup = new ListViewGroup(groupText);\n                lvJobs.Groups.Add(listGroup);\n\n                // Add the items in every group\n                lvJobs.Items.AddRange(\n                    group.Select(job => new\n                    {\n                        job,\n                        item = new ListViewItem(job.InstalledItem.Name, listGroup)\n                        {\n                            UseItemStyleForSubItems = false,\n                            Tag = job\n                        }\n\n                    }).Select(x => CreateSubItems(x.job, x.item)).ToArray());\n            }\n        }\n\n        /// <summary>\n        /// Creates the list view sub items.\n        /// </summary>\n        /// <param name=\"job\">The job.</param>\n        /// <param name=\"item\">The item.</param>\n        private ListViewItem CreateSubItems(IndustryJob job, ListViewItem item)\n        {\n            // Display text as dimmed if the job is no longer available\n            if (!job.IsActive)\n                item.ForeColor = SystemColors.GrayText;\n\n            // Add enough subitems to match the number of columns\n            while (item.SubItems.Count < lvJobs.Columns.Count + 1)\n            {\n                item.SubItems.Add(string.Empty);\n            }\n\n            // Creates the subitems\n            for (int i = 0; i < lvJobs.Columns.Count; i++)\n            {\n                ColumnHeader header = lvJobs.Columns[i];\n                IndustryJobColumn column = (IndustryJobColumn)header.Tag;\n                SetColumn(job, item.SubItems[i], column);\n            }\n\n            // Tooltip\n            var builder = new StringBuilder();\n            builder.Append($\"Issued For: \").AppendLine(job.IssuedFor.ToString());\n            builder.Append($\"Installed: \").AppendLine(job.InstalledTime.\n                ToAbsoluteDateTimeDescription(DateTimeKind.Local));\n            builder.Append($\"Finishes: \").AppendLine(job.EndDate.\n                ToAbsoluteDateTimeDescription(DateTimeKind.Local));\n            builder.Append($\"Activity: \").AppendLine(job.Activity.GetDescription());\n            builder.Append($\"Solar System: \").AppendLine(job.SolarSystem.FullLocation);\n            builder.Append($\"Installation: \").AppendLine(job.Installation);\n            item.ToolTipText = builder.ToString();\n            return item;\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvJobs.Columns)\n            {\n                if (m_columns[column.Index].Width == -1)\n                    m_columns[column.Index].Width = -2;\n\n                column.Width = m_columns[column.Index].Width;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column and not set to auto-resize\n                if (column.Index != lvJobs.Columns.Count - 1 || m_columns[column.Index].Width != -2)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvJobs.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvJobs.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        /// <summary>\n        /// Updates the item sorter.\n        /// </summary>\n        private void UpdateSort()\n        {\n            lvJobs.ListViewItemSorter = new ListViewItemComparerByTag<IndustryJob>(\n                new IndustryJobComparer(m_sortCriteria, m_sortAscending));\n\n            UpdateSortVisualFeedback();\n        }\n\n        /// <summary>\n        /// Updates the sort feedback (the arrow on the header).\n        /// </summary>\n        private void UpdateSortVisualFeedback()\n        {\n            foreach (ColumnHeader columnHeader in lvJobs.Columns.Cast<ColumnHeader>())\n            {\n                IndustryJobColumn column = (IndustryJobColumn)columnHeader.Tag;\n                if (m_sortCriteria == column)\n                    columnHeader.ImageIndex = m_sortAscending ? 0 : 1;\n                else\n                    columnHeader.ImageIndex = 2;\n            }\n        }\n\n        /// <summary>\n        /// Updates the listview sub-item.\n        /// </summary>\n        /// <param name=\"job\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"column\"></param>\n        private static void SetColumn(IndustryJob job, ListViewItem.ListViewSubItem item, IndustryJobColumn column)\n        {\n            switch (column)\n            {\n                case IndustryJobColumn.State:\n                    item.Text = job.State == JobState.Active ? job.ActiveJobState.\n                        GetDescription() : job.State.ToString();\n                    item.ForeColor = GetStateColor(job);\n                    break;\n                case IndustryJobColumn.TTC:\n                    item.Text = job.TTC;\n                    if (job.State == JobState.Paused)\n                        item.ForeColor = Color.Red;\n                    break;\n                case IndustryJobColumn.InstalledItem:\n                    item.Text = job.InstalledItem.Name;\n                    break;\n                case IndustryJobColumn.InstalledItemType:\n                    item.Text = job.InstalledItem.MarketGroup.CategoryPath;\n                    break;\n                case IndustryJobColumn.OutputItem:\n                    long units = GetUnitCount(job);\n                    // If units goes over max int, limit to max int for pluralization\n                    item.Text = units + \" Unit\" + ((int)Math.Min(units, int.MaxValue)).S() +\n                        \" of \" + job.OutputItem.Name;\n                    break;\n                case IndustryJobColumn.OutputItemType:\n                    item.Text = job.OutputItem.MarketGroup.CategoryPath;\n                    break;\n                case IndustryJobColumn.Activity:\n                    item.Text = job.Activity.GetDescription();\n                    break;\n                case IndustryJobColumn.InstallTime:\n                    item.Text = job.InstalledTime.ToLocalTime().ToString();\n                    break;\n                case IndustryJobColumn.EndTime:\n                    item.Text = job.EndDate.ToLocalTime().ToString();\n                    break;\n                case IndustryJobColumn.OriginalOrCopy:\n                    item.Text = EveMonConstants.UnknownText;\n                    break;\n                case IndustryJobColumn.InstalledME:\n                    item.Text = string.Empty; /*(job.Activity == BlueprintActivity.ResearchingMaterialEfficiency\n                        ? job.InstalledME.ToString(CultureConstants.DefaultCulture)\n                        : String.Empty);*/\n                    break;\n                case IndustryJobColumn.EndME:\n                    item.Text = string.Empty; /*(job.Activity == BlueprintActivity.ResearchingMaterialEfficiency\n                        ? (job.InstalledME + job.Runs).ToString(CultureConstants.DefaultCulture)\n                        : String.Empty);*/\n                    break;\n                case IndustryJobColumn.InstalledPE:\n                    item.Text = string.Empty; /*(job.Activity == BlueprintActivity.ResearchingTimeEfficiency\n                        ? job.InstalledTE.ToString(CultureConstants.DefaultCulture)\n                        : String.Empty);*/\n                    break;\n                case IndustryJobColumn.EndPE:\n                    item.Text = string.Empty; /*(job.Activity == BlueprintActivity.ResearchingTimeEfficiency\n                        ? (job.InstalledTE + job.Runs).ToString(CultureConstants.DefaultCulture)\n                        : String.Empty);*/\n                    break;\n                case IndustryJobColumn.Location:\n                    item.Text = job.FullLocation;\n                    break;\n                case IndustryJobColumn.Region:\n                    item.Text = job.SolarSystem.Constellation.Region.Name;\n                    break;\n                case IndustryJobColumn.SolarSystem:\n                    item.Text = job.SolarSystem.Name;\n                    item.ForeColor = job.SolarSystem.SecurityLevelColor;\n                    break;\n                case IndustryJobColumn.Installation:\n                    item.Text = job.Installation;\n                    break;\n                case IndustryJobColumn.IssuedFor:\n                    item.Text = job.IssuedFor.ToString();\n                    break;\n                case IndustryJobColumn.LastStateChange:\n                    item.Text = job.LastStateChange.ToLocalTime().ToString();\n                    break;\n                case IndustryJobColumn.Cost:\n                    item.Text = job.Cost.ToNumericString(2);\n                    break;\n                case IndustryJobColumn.Probability:\n                    item.Text = Math.Abs(job.Probability) < double.Epsilon ? string.Empty :\n                        job.Probability.ToString(\"P1\");\n                    break;\n                case IndustryJobColumn.Runs:\n                    item.Text = job.Runs.ToString();\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n\n\n        # region Helper Methods\n\n        /// <summary>\n        /// Gets the unit count.\n        /// </summary>\n        /// <param name=\"job\">The job.</param>\n        /// <returns></returns>\n        private static long GetUnitCount(IndustryJob job)\n        {\n            switch (job.Activity)\n            {\n                case BlueprintActivity.Manufacturing:\n                    // Returns the amount produced\n                    return (long)job.Runs * job.OutputItem.PortionSize;\n                case BlueprintActivity.SimpleReactions:\n                    return job.Runs * job.InstalledItem.ReactionOutcome.Quantity;\n                case BlueprintActivity.Reactions:\n                    return job.Runs * job.InstalledItem.ReactionOutcome.Quantity;\n                default:\n                    return 1L;\n            }\n        }\n\n        /// <summary>\n        /// Gets the color of the state.\n        /// </summary>\n        /// <param name=\"job\">The job.</param>\n        /// <returns></returns>\n        private static Color GetStateColor(IndustryJob job)\n        {\n            switch (job.State)\n            {\n                case JobState.Canceled:\n                    return Color.DarkGray;\n                case JobState.Failed:\n                    return Color.DarkRed;\n                case JobState.Paused:\n                    return Color.RoyalBlue;\n                case JobState.Active:\n                    return GetActiveJobStateColor(job.ActiveJobState);\n                default:\n                    return SystemColors.GrayText;\n            }\n        }\n\n        /// <summary>\n        /// Gets the color of the active job state.\n        /// </summary>\n        /// <param name=\"activeJobState\">State of the active job.</param>\n        /// <returns></returns>\n        private static Color GetActiveJobStateColor(ActiveJobState activeJobState)\n        {\n            switch (activeJobState)\n            {\n                case ActiveJobState.Pending:\n                    return Color.Red;\n                case ActiveJobState.InProgress:\n                    return Color.Orange;\n                case ActiveJobState.Ready:\n                    return Color.Green;\n                default:\n                    return SystemColors.GrayText;\n            }\n        }\n\n        /// <summary>\n        /// Checks the given text matches the item.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if [is text matching] [the specified x]; otherwise, <c>false</c>.\n        /// </returns>\n        private static bool IsTextMatching(IndustryJob x, string text) => string.\n            IsNullOrEmpty(text) || x.InstalledItem.Name.Contains(text, ignoreCase: true) ||\n            x.OutputItem.Name.Contains(text, ignoreCase: true) ||\n            (x.Installation?.Contains(text, ignoreCase: true) ?? false) ||\n            (x.SolarSystem?.Name?.Contains(text, ignoreCase: true) ?? false) ||\n            (x.SolarSystem?.Constellation?.Name?.Contains(text, ignoreCase: true) ?? false) ||\n            (x.SolarSystem?.Constellation?.Region?.Name?.Contains(text, ignoreCase: true) ??\n            false);\n\n        /// <summary>\n        /// Updates the time to completion.\n        /// </summary>\n        private void UpdateTimeToCompletion()\n        {\n            const int Pad = 4;\n            int columnTTCIndex = m_columns.IndexOf(m_columns.FirstOrDefault(x => x.Column ==\n                IndustryJobColumn.TTC));\n\n            foreach (ListViewItem listViewItem in lvJobs.Items.Cast<ListViewItem>())\n            {\n                IndustryJob job = (IndustryJob)listViewItem.Tag;\n                if (!job.IsActive || job.ActiveJobState == ActiveJobState.Ready)\n                    continue;\n\n                // Update the time to completion\n                if (columnTTCIndex != -1 && m_columns[columnTTCIndex].Visible)\n                {\n                    if (m_columnTTCIndex == -1)\n                        m_columnTTCIndex = lvJobs.Columns[columnTTCIndex].DisplayIndex;\n\n                    listViewItem.SubItems[m_columnTTCIndex].Text = job.TTC;\n\n                    // Using AutoResizeColumn when TTC is the first column\n                    // results to a nasty visual bug due to ListViewItem.ImageIndex placeholder\n                    if (m_columnTTCIndex == 0)\n                    {\n                        // Calculate column header text width with padding\n                        int columnHeaderWidth = TextRenderer.MeasureText(lvJobs.Columns[\n                            m_columnTTCIndex].Text, Font).Width + Pad * 2;\n\n                        // If there is an image assigned to the header, add its width with padding\n                        if (ilIcons.ImageSize.Width > 0)\n                            columnHeaderWidth += ilIcons.ImageSize.Width + Pad;\n\n                        int columnWidth = Math.Max(lvJobs.Items.Cast<ListViewItem>().Select(\n                            item => TextRenderer.MeasureText(item.SubItems[m_columnTTCIndex].\n                            Text, Font).Width).Max(), columnHeaderWidth) + Pad + 2;\n                        lvJobs.Columns[m_columnTTCIndex].Width = columnWidth;\n                    }\n                    else\n                        lvJobs.AutoResizeColumn(m_columnTTCIndex, ColumnHeaderAutoResizeStyle.\n                            HeaderSize);\n                }\n\n                // Job was pending and its time to start\n                if (job.ActiveJobState == ActiveJobState.Pending && job.StartDate < DateTime.\n                    UtcNow)\n                {\n                    job.ActiveJobState = ActiveJobState.InProgress;\n                    UpdateContent();\n                }\n\n                if (job.TTC.Length != 0)\n                    continue;\n\n                // Job is ready\n                job.ActiveJobState = ActiveJobState.Ready;\n                UpdateContent();\n            }\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// Exports item info to CSV format.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(lvJobs);\n        }\n\n        /// <summary>\n        /// Handles the Tick event of the m_timer control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void refresh_TimerTick(object sender, EventArgs e)\n        {\n            UpdateTimeToCompletion();\n        }\n\n        /// <summary>\n        /// On column reorder we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnReordered(object sender, ColumnReorderedEventArgs e)\n        {\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user manually resizes a column, we make sure to update the column preferences.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)\n        {\n            if (m_isUpdatingColumns || m_columns.Count <= e.ColumnIndex)\n                return;\n\n            // Don't update the columns if the TTC column width changes\n            if (e.ColumnIndex == m_columnTTCIndex)\n                return;\n\n            if (m_columns[e.ColumnIndex].Width == lvJobs.Columns[e.ColumnIndex].Width)\n                return;\n\n            m_columns[e.ColumnIndex].Width = lvJobs.Columns[e.ColumnIndex].Width;\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user clicks a column header, we update the sorting.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            IndustryJobColumn column = (IndustryJobColumn)lvJobs.Columns[e.Column].Tag;\n            if (m_sortCriteria == column)\n                m_sortAscending = !m_sortAscending;\n            else\n            {\n                m_sortCriteria = column;\n                m_sortAscending = true;\n            }\n\n            m_isUpdatingColumns = true;\n\n            // Updates the item sorter\n            UpdateSort();\n\n            m_isUpdatingColumns = false;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lvJobs.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we show the item's tooltip if over an item.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvJobs.Cursor = CustomCursors.ContextMenu;\n\n            ListViewItem item = lvJobs.GetItemAt(e.Location.X, e.Location.Y);\n            if (item == null)\n            {\n                m_tooltip.Hide();\n                return;\n            }\n\n            m_tooltip.Show(item.ToolTipText, e.Location);\n        }\n\n        /// <summary>\n        /// When the mouse leaves the list, we hide the item's tooltip.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseLeave(object sender, EventArgs e)\n        {\n            m_tooltip.Hide();\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the contextMenu control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CancelEventArgs\"/> instance containing the event data.</param>\n        private void contextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            bool visible = lvJobs.SelectedItems.Count != 0;\n\n            showInstalledInBrowserMenuItem.Visible =\n                showProducedInBrowserMenuItem.Visible =\n                    showInBrowserMenuSeparator.Visible = visible;\n\n            if (!visible)\n                return;\n\n            IndustryJob job = lvJobs.SelectedItems[0]?.Tag as IndustryJob;\n\n            if (job?.InstalledItem == null || job.OutputItem == null)\n                return;\n\n            Blueprint blueprint = StaticBlueprints.GetBlueprintByID(job.OutputItem.ID);\n            Ship ship = job.OutputItem as Ship;\n\n            string text = ship != null ? \"Ship\" : blueprint != null ? \"Blueprint\" : \"Item\";\n\n            showProducedInBrowserMenuItem.Text = $\"Show Output In {text} Browser...\";\n        }\n\n        /// <summary>\n        /// Handles the Click event of the showInBrowserMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void showInBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            ToolStripItem menuItem = sender as ToolStripItem;\n\n            if (menuItem == null)\n                return;\n\n            IndustryJob job = lvJobs.SelectedItems[0]?.Tag as IndustryJob;\n\n            if (menuItem == showInstalledInBrowserMenuItem)\n            {\n                if (job?.OutputItem == null)\n                    return;\n\n                // showProducedInBrowserMenuItem was clicked\n                Ship ship = job.OutputItem as Ship;\n                Blueprint blueprint = StaticBlueprints.GetBlueprintByID(job.OutputItem.ID);\n\n                PlanWindow planWindow = PlanWindow.ShowPlanWindow(Character);\n\n                if (ship != null)\n                    planWindow.ShowShipInBrowser(ship);\n                else if (blueprint != null)\n                    planWindow.ShowBlueprintInBrowser(blueprint);\n                else\n                    planWindow.ShowItemInBrowser(job.OutputItem);\n\n                return;\n            }\n\n            if (job?.InstalledItem == null)\n                return;\n\n            // showInstalledInBrowserMenuItem was clicked\n            PlanWindow.ShowPlanWindow(Character).ShowBlueprintInBrowser(job.InstalledItem);\n        }\n\n        # endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Handles the IndustryJobsCompleted event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"IndustryJobsEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterIndustryJobsCompleted(object sender, IndustryJobsEventArgs e)\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the ID to name conversion is updated, update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the industry jobs are updated, update the list and the expandable panel info.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_IndustryJobsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (Character == null || e.Character != Character)\n                return;\n\n            Jobs = Character.IndustryJobs;\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// On timer tick, we update the internal timer and \n        /// and the columns settings if any changes have beem made to them.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Visible)\n            {\n                if (m_refreshTimer.Enabled)\n                    m_refreshTimer.Stop();\n\n                return;\n            }\n\n            // Find how many jobs are active and not ready\n            int activeJobs = lvJobs.Items.Cast<ListViewItem>().Select(\n                item => (IndustryJob)item.Tag).Count(job => job.IsActive && job.ActiveJobState != ActiveJobState.Ready);\n\n            // We use time dilation according to the ammount of active jobs that are not ready,\n            // due to excess CPU usage for computing the 'time to completion' when there are too many jobs\n            m_refreshTimer.Interval = 900 + 100 * activeJobs;\n\n            if (!m_columnsChanged)\n                return;\n\n            Settings.UI.MainWindow.IndustryJobs.Columns.Clear();\n            Settings.UI.MainWindow.IndustryJobs.Columns.AddRange(Columns.Cast<IndustryJobColumnSettings>());\n\n            // Recreate the columns\n            Columns = Settings.UI.MainWindow.IndustryJobs.Columns;\n            m_columnsChanged = false;\n        }\n\n        /// <summary>\n        /// When Conquerable Station List updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_ConquerableStationListUpdated(object sender, EventArgs e)\n        {\n            if (Character == null)\n                return;\n\n            foreach (IndustryJob job in m_list)\n            {\n                job.UpdateInstallation(this.Character);\n            }\n\n            UpdateColumns();\n        }\n\n        #endregion\n\n\n        #region Updates Expandable Panel On Global Events\n\n        /// <summary>\n        /// Updates the content of the expandable panel.\n        /// </summary>\n        private void UpdateExpPanelContent()\n        {\n            if (Character == null)\n            {\n                industryExpPanelControl.Visible = false;\n                return;\n            }\n\n            // Calculate the related info for the panel\n            CalculatePanelInfo();\n\n            // Update the Header text of the panel\n            UpdateHeaderText();\n\n            // Update the info in the panel\n            UpdatePanelInfo();\n\n            // Force to redraw\n            industryExpPanelControl.Refresh();\n        }\n\n        /// <summary>\n        /// Gets a subset of the header panel text.\n        /// </summary>\n        /// <param name=\"header\">The type of job to display.</param>\n        /// <param name=\"totalJobs\">The number of jobs given from skills including the base\n        /// 1 job.</param>\n        /// <param name=\"issued\">The number of active jobs issued.</param>\n        /// <returns>Text describing the number of jobs left.</returns>\n        private string GetHeaderText(string header, int totalJobs, JobsIssued issued)\n        {\n            long remainingJobs = Math.Max(0L, totalJobs - issued.ForCharacter - issued.\n                ForCorporation);\n            return string.Format(\"{0} Jobs Remaining: {1:D} out of {2:D} max\", header,\n                remainingJobs, totalJobs);\n        }\n\n        /// <summary>\n        /// Updates the header text of the panel.\n        /// </summary>\n        private void UpdateHeaderText()\n        {\n            industryExpPanelControl.HeaderText = GetHeaderText(\"Manufacturing\",\n                m_skillBasedManufacturingJobs, m_activeManufacturing) + \"     \" +\n                GetHeaderText(\"Researching\", m_skillBasedResearchingJobs, m_activeResearch) +\n                \"     \" + GetHeaderText(\"Reaction\", m_skillBasedReactionJobs,\n                m_activeReactions);\n        }\n\n        /// <summary>\n        /// Updates the labels text in the panel.\n        /// </summary>\n        private void UpdatePanelInfo()\n        {\n            // Basic label text\n            m_lblActiveManufacturingJobs.Text = \"Active Manufacturing Jobs: \" +\n                m_activeManufacturing.Total;\n            m_lblActiveResearchingJobs.Text = \"Active Researching Jobs: \" +\n                m_activeResearch.Total;\n            m_lblActiveReactionJobs.Text = \"Active Reaction Jobs: \" + m_activeReactions.Total;\n            m_lblRemoteManufacturingRange.Text = \"Remote Manufacturing Range: limited to \" +\n                StaticGeography.GetRange(m_remoteManufacturingRange);\n            m_lblRemoteResearchingRange.Text = $\"Remote Researching Range: limited to \" +\n                StaticGeography.GetRange(m_remoteResearchingRange);\n            m_lblRemoteReactionRange.Text = $\"Remote Reaction Range: limited to \" +\n                StaticGeography.GetRange(m_remoteReactionsRange);\n\n            if (HasActiveCorporationIssuedJobs)\n            {\n                // Supplemental label text\n                m_lblActiveCharManufacturingJobs.Text = $\"Character Issued: {m_activeManufacturing.ForCharacter}\";\n                m_lblActiveCorpManufacturingJobs.Text = $\"Corporation Issued: {m_activeManufacturing.ForCorporation}\";\n                m_lblActiveCharResearchingJobs.Text = $\"Character Issued: {m_activeResearch.ForCharacter}\";\n                m_lblActiveCorpResearchingJobs.Text = $\"Corporation Issued: {m_activeResearch.ForCorporation}\";\n                m_lblActiveCharReactionJobs.Text = $\"Character Issued: {m_activeReactions.ForCharacter}\";\n                m_lblActiveCorpReactionJobs.Text = $\"Corporation Issued: {m_activeReactions.ForCorporation}\";\n            }\n\n            // Update label position\n            UpdatePanelControlPosition();\n        }\n\n        /// <summary>\n        /// Updates the position of controls in the expandable panel.\n        /// </summary>\n        /// <param name=\"height\">The current panel height.</param>\n        /// <param name=\"totalJobs\">The label showing total jobs.</param>\n        /// <param name=\"range\">The label showing job range.</param>\n        /// <param name=\"charJobs\">The label showing character jobs.</param>\n        /// <param name=\"corpJobs\">The label showing corporation jobs.</param>\n        /// <returns>The new panel height.</returns>\n        private int UpdatePanelItemPosition(int height, Label totalJobs, Label range,\n            Label charJobs, Label corpJobs)\n        {\n            totalJobs.Location = new Point(PAD, height);\n            range.Location = new Point(range.Location.X, height);\n            if (HasActiveCorporationIssuedJobs)\n            {\n                charJobs.Location = new Point(PAD * 3, height);\n                charJobs.Visible = true;\n                corpJobs.Location = new Point(PAD * 3, height);\n                corpJobs.Visible = true;\n                height += charJobs.Height + corpJobs.Height + PAD;\n            }\n            else\n            {\n                charJobs.Visible = false;\n                corpJobs.Visible = false;\n            }\n            height += totalJobs.Height;\n            return height;\n        }\n\n        /// <summary>\n        /// Updates expandable panel controls positions.\n        /// </summary>\n        private void UpdatePanelControlPosition()\n        {\n            industryExpPanelControl.SuspendLayout();\n\n            int height = industryExpPanelControl.ExpandDirection == Direction.Up ? PAD :\n                industryExpPanelControl.HeaderHeight;\n\n            height = UpdatePanelItemPosition(height, m_lblActiveManufacturingJobs,\n                m_lblRemoteManufacturingRange, m_lblActiveCharManufacturingJobs,\n                m_lblActiveCorpManufacturingJobs);\n            height = UpdatePanelItemPosition(height, m_lblActiveResearchingJobs,\n                m_lblRemoteResearchingRange, m_lblActiveCharResearchingJobs,\n                m_lblActiveCorpResearchingJobs);\n            height = UpdatePanelItemPosition(height, m_lblActiveReactionJobs,\n                m_lblRemoteReactionRange, m_lblActiveCharReactionJobs,\n                m_lblActiveCorpReactionJobs) + PAD;\n\n            // Update panel's expanded height\n            industryExpPanelControl.ExpandedHeight = height + ((industryExpPanelControl.\n                ExpandDirection == Direction.Up) ? industryExpPanelControl.HeaderHeight : PAD);\n\n            industryExpPanelControl.ResumeLayout(false);\n        }\n\n        /// <summary>\n        /// Calculates the industry jobs related info for the panel.\n        /// </summary>\n        private void CalculatePanelInfo()\n        {\n            m_activeManufacturing = new JobsIssued(m_list, BlueprintActivity.Manufacturing);\n            m_activeResearch = new JobsIssued(m_list, BlueprintActivity.ResearchingTechnology,\n                BlueprintActivity.ResearchingMaterialEfficiency, BlueprintActivity.Copying,\n                BlueprintActivity.Duplicating, BlueprintActivity.Invention, BlueprintActivity.\n                ReverseEngineering, BlueprintActivity.ResearchingTimeEfficiency);\n            m_activeReactions = new JobsIssued(m_list, BlueprintActivity.SimpleReactions,\n                BlueprintActivity.Reactions);\n\n            // Calculate character's max manufacturing jobs\n            m_skillBasedManufacturingJobs = IndustryJob.MaxManufacturingJobsFor(Character);\n            // Calculate character's max researching jobs\n            m_skillBasedResearchingJobs = IndustryJob.MaxResearchJobsFor(Character);\n            // Calculate character's max reaction jobs\n            m_skillBasedReactionJobs = IndustryJob.MaxReactionJobsFor(Character);\n\n            // Calculate character's remote manufacturing range\n            m_remoteManufacturingRange = Character.LastConfirmedSkillLevel(DBConstants.\n                SupplyChainManagementSkillID);\n            // Calculate character's remote researching range\n            m_remoteResearchingRange = Character.LastConfirmedSkillLevel(DBConstants.\n                ScientificNetworkingSkillID);\n            // Calculate character's remote reactions range\n            m_remoteReactionsRange = Character.LastConfirmedSkillLevel(DBConstants.\n                RemoteReactionsSkillID);\n        }\n\n        # endregion\n\n\n        #region Initialize Expandable Panel Controls\n\n        // Basic labels constructor\n        private readonly Label m_lblActiveManufacturingJobs = new Label();\n        private readonly Label m_lblActiveResearchingJobs = new Label();\n        private readonly Label m_lblActiveReactionJobs = new Label();\n        private readonly Label m_lblRemoteManufacturingRange = new Label();\n        private readonly Label m_lblRemoteResearchingRange = new Label();\n        private readonly Label m_lblRemoteReactionRange = new Label();\n\n        // Supplemental labels constructor\n        private readonly Label m_lblActiveCharManufacturingJobs = new Label();\n        private readonly Label m_lblActiveCorpManufacturingJobs = new Label();\n        private readonly Label m_lblActiveCharResearchingJobs = new Label();\n        private readonly Label m_lblActiveCorpResearchingJobs = new Label();\n        private readonly Label m_lblActiveCharReactionJobs = new Label();\n        private readonly Label m_lblActiveCorpReactionJobs = new Label();\n\n        private void InitializeExpandablePanelControls()\n        {\n            industryExpPanelControl.SuspendLayout();\n\n            // Add basic labels to panel\n            industryExpPanelControl.Controls.AddRange(new Control[]\n            {\n                m_lblActiveManufacturingJobs,\n                m_lblActiveResearchingJobs,\n                m_lblActiveReactionJobs,\n                m_lblRemoteManufacturingRange,\n                m_lblRemoteResearchingRange,\n                m_lblRemoteReactionRange\n            });\n\n            // Add supplemental labels to panel\n            industryExpPanelControl.Controls.AddRange(new Control[]\n            {\n                m_lblActiveCharManufacturingJobs,\n                m_lblActiveCorpManufacturingJobs,\n                m_lblActiveCharResearchingJobs,\n                m_lblActiveCorpResearchingJobs,\n                m_lblActiveCharReactionJobs,\n                m_lblActiveCorpReactionJobs\n            });\n\n            // Apply properties\n            foreach (Label label in industryExpPanelControl.Controls.OfType<Label>())\n            {\n                label.ForeColor = SystemColors.ControlText;\n                label.BackColor = Color.Transparent;\n                label.AutoSize = true;\n                label.MouseClick += OnExpandablePanelMouseClick;\n            }\n\n            // Special properties\n            m_lblRemoteManufacturingRange.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            m_lblRemoteResearchingRange.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            m_lblRemoteReactionRange.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            m_lblRemoteManufacturingRange.Location = new Point(170, 0);\n            m_lblRemoteResearchingRange.Location = new Point(170, 0);\n            m_lblRemoteReactionRange.Location = new Point(170, 0);\n\n            industryExpPanelControl.ResumeLayout(false);\n        }\n\n        /// <summary>\n        /// Called when the expandable panel gets mouse clicked.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void OnExpandablePanelMouseClick(object sender, MouseEventArgs e)\n        {\n            industryExpPanelControl.OnMouseClick(sender, e);\n        }\n\n        #endregion\n\n\n        #region Helper Classes\n\n        /// <summary>\n        /// Stores the number of jobs issued for a character and corporation of a given type.\n        /// </summary>\n        private struct JobsIssued\n        {\n            public int ForCharacter { get; }\n\n            public int ForCorporation { get; }\n\n            public int Total\n            {\n                get\n                {\n                    return ForCharacter + ForCorporation;\n                }\n            }\n\n            public JobsIssued(IEnumerable<IndustryJob> jobs, params BlueprintActivity[] activity)\n            {\n                int chr = 0, corp = 0;\n                foreach (var job in jobs)\n                {\n                    if ((job.State == JobState.Active || job.State == JobState.Paused) &&\n                        activity.Contains(job.Activity))\n                    {\n                        // Add to appropriate total\n                        if (job.IssuedFor == IssuedFor.Character)\n                            chr++;\n                        else if (job.IssuedFor == IssuedFor.Corporation)\n                            corp++;\n                    }\n                }\n                ForCharacter = chr;\n                ForCorporation = corp;\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterIndustryJobsList.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>103, 17</value>\n  </metadata>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        AAAAAk1TRnQBSQFMAgEBAwEAAXQBBwF0AQcBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABEAMAAQEBAAEQBgABCP8A/wD/AP8A/wD/AP8A/wAaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB\n        AQABAQUAAYAXAAP/AQAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAB8AEPAf4BfwL/AgAB+AEfAfwBPwL/\n        AgAB/AE/AfgBHwL/AgAB/gF/AfABDwL/AgAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAL\n</value>\n  </data>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"industryExpPanelControl.ImageCollapse\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABGdBTUEAALGPC/xhBQAAAHpJREFUKFOV\n        kcENgCAQBCnOKizFSrQPS/Lnh4eJL4GseOQ8lqCXDCHLDjxwMtOyxh5PNQ+CbffxCqEJzov4RRCKiEXC\n        YZxvdFFn/jhryZb0XqASkLIVQFMCTACVxG63GX1Jl6wAqASkbAVQJPZPTPj9wS9BBkGP3HQuAT/bEzE7\n        m9WyAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"industryExpPanelControl.ImageExpand\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABGdBTUEAALGPC/xhBQAAAHZJREFUKFON\n        kcENgCAQBCnOKizFSrQPS/Lnh4eJL4FccC/nsQQvGR7LDjwuYJZtzyPeah0JjjPmJ6Uucq9iT5jmtclU\n        lMNfigBsHq+bS7bMxEZiJZ/Rn4CXQVfC60ykki0zsZFYyWcqjRYLfi3Y8hEwEoyozRAKykETMSVvxo8A\n        AAAASUVORK5CYII=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterKillLogList.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterKillLogList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterKillLogList));\n            this.noKillLogLabel = new System.Windows.Forms.Label();\n            this.lvKillLog = new System.Windows.Forms.ListView();\n            this.chDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chCorporation = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chAlliance = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chFaction = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.showDetailsMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showDetailsMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.showInShipBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInBrowserMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.copyKillInfoMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.ilIcons = new System.Windows.Forms.ImageList(this.components);\n            this.lbKillLog = new EVEMon.Common.Controls.NoFlickerListBox();\n            this.toolTip = new System.Windows.Forms.ToolTip(this.components);\n            this.contextMenuStrip.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // noKillLogLabel\n            // \n            this.noKillLogLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n            this.noKillLogLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noKillLogLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noKillLogLabel.Location = new System.Drawing.Point(0, 0);\n            this.noKillLogLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.noKillLogLabel.Name = \"noKillLogLabel\";\n            this.noKillLogLabel.Size = new System.Drawing.Size(324, 382);\n            this.noKillLogLabel.TabIndex = 5;\n            this.noKillLogLabel.Text = \"Combat log information not available.\";\n            this.noKillLogLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lvKillLog\n            // \n            this.lvKillLog.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lvKillLog.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chDate,\n            this.chType,\n            this.chName,\n            this.chCorporation,\n            this.chAlliance,\n            this.chFaction});\n            this.lvKillLog.ContextMenuStrip = this.contextMenuStrip;\n            this.lvKillLog.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvKillLog.FullRowSelect = true;\n            this.lvKillLog.HideSelection = false;\n            this.lvKillLog.Location = new System.Drawing.Point(0, 0);\n            this.lvKillLog.MultiSelect = false;\n            this.lvKillLog.Name = \"lvKillLog\";\n            this.lvKillLog.Size = new System.Drawing.Size(324, 382);\n            this.lvKillLog.SmallImageList = this.ilIcons;\n            this.lvKillLog.TabIndex = 7;\n            this.lvKillLog.UseCompatibleStateImageBehavior = false;\n            this.lvKillLog.View = System.Windows.Forms.View.Details;\n            this.lvKillLog.DoubleClick += new System.EventHandler(this.lvKillLog_DoubleClick);\n            this.lvKillLog.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lvKillLog_MouseDown);\n            this.lvKillLog.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lvKillLog_MouseMove);\n            // \n            // chDate\n            // \n            this.chDate.Text = \"Date\";\n            this.chDate.Width = 106;\n            // \n            // chType\n            // \n            this.chType.Text = \"Type\";\n            this.chType.Width = 100;\n            // \n            // chName\n            // \n            this.chName.Text = \"Name\";\n            this.chName.Width = 99;\n            // \n            // chCorporation\n            // \n            this.chCorporation.Text = \"Corporation\";\n            // \n            // chAlliance\n            // \n            this.chAlliance.Text = \"Alliance\";\n            // \n            // chFaction\n            // \n            this.chFaction.Text = \"Faction\";\n            // \n            // contextMenuStrip\n            // \n            this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showDetailsMenuItem,\n            this.showDetailsMenuSeparator,\n            this.showInShipBrowserMenuItem,\n            this.showInBrowserMenuSeparator,\n            this.copyKillInfoMenuItem});\n            this.contextMenuStrip.Name = \"contextMenuStrip\";\n            this.contextMenuStrip.Size = new System.Drawing.Size(215, 82);\n            this.contextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip_Opening);\n            // \n            // showDetailsMenuItem\n            // \n            this.showDetailsMenuItem.Font = new System.Drawing.Font(\"Segoe UI\", 9F, System.Drawing.FontStyle.Bold);\n            this.showDetailsMenuItem.Name = \"showDetailsMenuItem\";\n            this.showDetailsMenuItem.Size = new System.Drawing.Size(214, 22);\n            this.showDetailsMenuItem.Text = \"Show Details...\";\n            this.showDetailsMenuItem.Click += new System.EventHandler(this.showDetailsMenuItem_Click);\n            // \n            // showDetailsMenuSeparator\n            // \n            this.showDetailsMenuSeparator.Name = \"showDetailsMenuSeparator\";\n            this.showDetailsMenuSeparator.Size = new System.Drawing.Size(211, 6);\n            // \n            // showInShipBrowserMenuItem\n            // \n            this.showInShipBrowserMenuItem.Name = \"showInShipBrowserMenuItem\";\n            this.showInShipBrowserMenuItem.Size = new System.Drawing.Size(214, 22);\n            this.showInShipBrowserMenuItem.Text = \"Show In Ship Browser...\";\n            this.showInShipBrowserMenuItem.Click += new System.EventHandler(this.showInShipBrowserMenuItem_Click);\n            // \n            // showInBrowserMenuSeparator\n            // \n            this.showInBrowserMenuSeparator.Name = \"showInBrowserMenuSeparator\";\n            this.showInBrowserMenuSeparator.Size = new System.Drawing.Size(211, 6);\n            // \n            // copyKillInfoMenuItem\n            // \n            this.copyKillInfoMenuItem.Name = \"copyKillInfoMenuItem\";\n            this.copyKillInfoMenuItem.Size = new System.Drawing.Size(214, 22);\n            this.copyKillInfoMenuItem.Text = \"Copy Kill Info to Clipboard\";\n            this.copyKillInfoMenuItem.Click += new System.EventHandler(this.copyKillInfoMenuItem_Click);\n            // \n            // ilIcons\n            // \n            this.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n            this.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilIcons.Images.SetKeyName(0, \"arrow_up.png\");\n            this.ilIcons.Images.SetKeyName(1, \"arrow_down.png\");\n            this.ilIcons.Images.SetKeyName(2, \"16x16Transparant.png\");\n            // \n            // lbKillLog\n            // \n            this.lbKillLog.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lbKillLog.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbKillLog.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;\n            this.lbKillLog.FormattingEnabled = true;\n            this.lbKillLog.IntegralHeight = false;\n            this.lbKillLog.ItemHeight = 15;\n            this.lbKillLog.Location = new System.Drawing.Point(0, 0);\n            this.lbKillLog.Margin = new System.Windows.Forms.Padding(0);\n            this.lbKillLog.Name = \"lbKillLog\";\n            this.lbKillLog.Size = new System.Drawing.Size(324, 382);\n            this.lbKillLog.TabIndex = 6;\n            this.lbKillLog.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.lbKillLog_DrawItem);\n            this.lbKillLog.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.lbKillLog_MeasureItem);\n            this.lbKillLog.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.lbKillLog_MouseDoubleClick);\n            this.lbKillLog.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbKillLog_MouseDown);\n            this.lbKillLog.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lbKillLog_MouseMove);\n            this.lbKillLog.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.lbKillLog_MouseWheel);\n            // \n            // CharacterKillLogList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.noKillLogLabel);\n            this.Controls.Add(this.lbKillLog);\n            this.Controls.Add(this.lvKillLog);\n            this.Name = \"CharacterKillLogList\";\n            this.Size = new System.Drawing.Size(324, 382);\n            this.contextMenuStrip.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noKillLogLabel;\n        private Common.Controls.NoFlickerListBox lbKillLog;\n        private System.Windows.Forms.ListView lvKillLog;\n        private System.Windows.Forms.ColumnHeader chDate;\n        private System.Windows.Forms.ColumnHeader chType;\n        private System.Windows.Forms.ColumnHeader chName;\n        private System.Windows.Forms.ColumnHeader chCorporation;\n        private System.Windows.Forms.ColumnHeader chAlliance;\n        private System.Windows.Forms.ColumnHeader chFaction;\n        private System.Windows.Forms.ImageList ilIcons;\n        private System.Windows.Forms.ContextMenuStrip contextMenuStrip;\n        private System.Windows.Forms.ToolStripMenuItem showDetailsMenuItem;\n        private System.Windows.Forms.ToolStripSeparator showDetailsMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem copyKillInfoMenuItem;\n        private System.Windows.Forms.ToolTip toolTip;\n        private System.Windows.Forms.ToolStripMenuItem showInShipBrowserMenuItem;\n        private System.Windows.Forms.ToolStripSeparator showInBrowserMenuSeparator;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterKillLogList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.Properties;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.DetailsWindow;\nusing EVEMon.SkillPlanner;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    /// <summary>\n    /// Displays a list of kill logs.\n    /// </summary>\n    internal sealed partial class CharacterKillLogList : UserControl, IListView\n    {\n        #region Fields\n\n\n        #region ListBox Fields\n\n        private const TextFormatFlags Format = TextFormatFlags.NoPadding | TextFormatFlags.NoClipping | TextFormatFlags.NoPrefix;\n\n        // KillLog drawing - Region & text padding\n        private const int PadTop = 2;\n        private const int PadLeft = 6;\n        private const int PadRight = 7;\n\n        // KillLog drawing - Kill\n        private const int KillDetailHeight = 34;\n        private const string CopyKillInfoText = \"Copy Kill Information to Clipboard\";\n\n        // KillLog drawing - KillLog groups\n        private const int KillGroupHeaderHeight = 21;\n        private const int CollapserPadRight = 4;\n\n        private readonly Font m_killFont;\n        private readonly Font m_killBoldFont;\n        private readonly List<string> m_collapsedGroups = new List<string>();\n\n        private int m_copyPositionFromRight;\n        private Size m_copyKillInfoTextSize;\n\n        #endregion\n\n\n        #region ListView Fields\n\n        private ColumnHeader m_sortCriteria;\n        private KillLog m_selectedKillLog;\n\n        private string m_textFilter = string.Empty;\n        private bool m_sortAscending;\n\n        #endregion\n\n\n        #endregion\n\n\n        #region Constructor\n\n        public CharacterKillLogList()\n        {\n            InitializeComponent();\n\n            lbKillLog.Hide();\n            lvKillLog.Hide();\n\n            ListViewHelper.EnableDoubleBuffer(lvKillLog);\n\n            m_sortCriteria = lvKillLog.Columns[0];\n\n            m_killFont = FontFactory.GetFont(\"Tahoma\", 6.25F);\n            m_killBoldFont = FontFactory.GetFont(\"Tahoma\", 6.25F, FontStyle.Bold);\n            noKillLogLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n\n            lvKillLog.ColumnClick += lvKillLog_ColumnClick;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        /// <summary>\n        /// Gets or sets the text filter.\n        /// </summary>\n        [Browsable(false)]\n        public string TextFilter\n        {\n            get { return m_textFilter; }\n            set\n            {\n                m_textFilter = value;\n                if (!DesignMode && !this.IsDesignModeHosted())\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping of a listview.\n        /// </summary>\n        /// <value></value>\n        /// <remarks>Not used anywhere; Only to implement IListView</remarks>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public Enum Grouping { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings used for columns.\n        /// </summary>\n        /// <remarks>Not used anywhere; Only to implement IListView</remarks>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n        public IEnumerable<IColumnSettings> Columns { get; set; }\n\n        #endregion\n\n\n        #region Inherited events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.CharacterKillLogUpdated += EveMonClient_CharacterKillLogUpdated;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterKillLogUpdated -= EveMonClient_CharacterKillLogUpdated;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (DesignMode || this.IsDesignModeHosted() || Character == null || !Visible)\n                return;\n\n            lbKillLog.Visible = false;\n            lvKillLog.Visible = false;\n            UpdateKillLogView();\n        }\n\n        #endregion\n\n\n        #region Content Management\n\n        /// <summary>\n        /// Updates the kill log view.\n        /// </summary>\n        internal void UpdateKillLogView()\n        {\n            if (Settings.UI.MainWindow.CombatLog.ShowCondensedLogs)\n                UpdateColumns();\n            else\n                UpdateListContent();\n        }\n\n\n        #region ListBox Update Methods\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        private void UpdateListContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            // When no character, we just hide the list\n            if (Character == null)\n            {\n                noKillLogLabel.Show();\n                lbKillLog.Hide();\n                lvKillLog.Hide();\n                return;\n            }\n\n            int scrollBarPosition = lbKillLog.TopIndex;\n\n            // Update the kills list\n            lbKillLog.BeginUpdate();\n            try\n            {\n                var kills = new List<KillLog>(Character.KillLog);\n                kills.Sort();\n                IEnumerable<IGrouping<KillGroup, KillLog>> groups = kills.GroupBy(x => x.Group).OrderBy(x => (int)x.Key);\n\n                // Scroll through groups\n                lbKillLog.Items.Clear();\n                foreach (IGrouping<KillGroup, KillLog> group in groups)\n                {\n                    string groupHeaderText = $\"{@group.Key} ({@group.Count()})\";\n\n                    lbKillLog.Items.Add(groupHeaderText);\n\n                    // Add items in the group when it's not collapsed\n                    if (m_collapsedGroups.Contains(groupHeaderText))\n                        continue;\n\n                    foreach (KillLog kill in group)\n                    {\n                        kill.KillLogVictimShipImageUpdated += kill_KillLogVictimShipImageUpdated;\n                        kill.UpdateCharacterNames();\n                        lbKillLog.Items.Add(kill);\n                    }\n                }\n\n                // Display or hide the \"no kills\" label.\n                noKillLogLabel.Visible = !kills.Any();\n                lbKillLog.Visible = kills.Any();\n                lvKillLog.Hide();\n\n                // Invalidate display\n                lbKillLog.Invalidate();\n            }\n            finally\n            {\n                lbKillLog.EndUpdate();\n                lbKillLog.TopIndex = scrollBarPosition;\n            }\n        }\n\n        #endregion\n\n\n        #region ListView Update Methods\n\n        /// <summary>\n        /// Autoresizes the columns.\n        /// </summary>\n        public void AutoResizeColumns()\n        {\n            AdjustColumns();\n        }\n\n        /// <summary>\n        /// Updates the columns.\n        /// </summary>\n        private void UpdateColumns()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            // We update the content\n            UpdateListViewContent();\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private void UpdateListViewContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            int scrollBarPosition = lvKillLog.GetVerticalScrollBarPosition();\n\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = lvKillLog.SelectedItems.Count > 0 ?\n                lvKillLog.SelectedItems[0].Tag.GetHashCode() : 0;\n\n            lvKillLog.BeginUpdate();\n            try\n            {\n                IEnumerable<KillLog> killLog = Character.KillLog.Where(x => IsTextMatching(x, m_textFilter));\n\n                UpdateSort();\n\n                lvKillLog.Items.Clear();\n                lvKillLog.Groups.Clear();\n\n                foreach (IGrouping<KillGroup, KillLog> group in killLog.GroupBy(x => x.Group).OrderBy(x => x.Key))\n                {\n                    string groupText = $\"{group.Key} ({group.Count()})\";\n                    ListViewGroup listGroup = new ListViewGroup(groupText);\n                    lvKillLog.Groups.Add(listGroup);\n\n                    // Add the items\n                    lvKillLog.Items.AddRange(group.Select(kill => new\n                    {\n                        kill,\n                        item = new ListViewItem(kill.KillTime.ToLocalTime().ToString(CultureConstants.DefaultCulture), listGroup)\n                        {\n                            UseItemStyleForSubItems = false,\n                            Tag = kill\n                        }\n                    }).Select(x => CreateSubItems(x.kill, x.item)).ToArray());\n                }\n\n                // Restore the selected item (if any)\n                if (selectedItem > 0)\n                {\n                    foreach (ListViewItem lvItem in lvKillLog.Items.Cast<ListViewItem>().Where(\n                        lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                    {\n                        lvItem.Selected = true;\n                    }\n                }\n\n                // Adjust the size of the columns\n                AdjustColumns();\n\n                // Display or hide the \"no research points\" label\n                noKillLogLabel.Visible = lvKillLog.Items.Count == 0;\n                lvKillLog.Visible = !noKillLogLabel.Visible;\n                lbKillLog.Visible = false;\n            }\n            finally\n            {\n                lvKillLog.EndUpdate();\n                lvKillLog.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Creates the list view sub items.\n        /// </summary>\n        /// <param name=\"kill\">The kill report.</param>\n        /// <param name=\"item\">The item.</param>\n        private ListViewItem CreateSubItems(KillLog kill, ListViewItem item)\n        {\n            kill.UpdateCharacterNames();\n\n            // Add enough subitems to match the number of columns\n            while (item.SubItems.Count < lvKillLog.Columns.Count + 1)\n            {\n                item.SubItems.Add(string.Empty);\n            }\n\n            // Creates the subitems\n            for (int i = 0; i < lvKillLog.Columns.Count; i++)\n            {\n                SetColumn(kill, item.SubItems[i], lvKillLog.Columns[i]);\n            }\n\n            return item;\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvKillLog.Columns)\n            {\n                column.Width = -2;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column\n                if (column.Index != lvKillLog.Columns.Count - 1)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvKillLog.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvKillLog.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        /// <summary>\n        /// Updates the item sorter.\n        /// </summary>\n        private void UpdateSort()\n        {\n            lvKillLog.ListViewItemSorter = new ListViewItemComparerByTag<KillLog>(\n                new KillLogComparer(m_sortCriteria, m_sortAscending));\n\n            UpdateSortVisualFeedback();\n        }\n\n        /// <summary>\n        /// Updates the sort feedback (the arrow on the header).\n        /// </summary>\n        private void UpdateSortVisualFeedback()\n        {\n            foreach (ColumnHeader columnHeader in lvKillLog.Columns)\n            {\n                if (m_sortCriteria == columnHeader)\n                    columnHeader.ImageIndex = m_sortAscending ? 0 : 1;\n                else\n                    columnHeader.ImageIndex = 2;\n            }\n        }\n\n        /// <summary>\n        /// Updates the listview sub-item.\n        /// </summary>\n        /// <param name=\"kill\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"column\"></param>\n        private static void SetColumn(KillLog kill, ListViewItem.ListViewSubItem item, ColumnHeader column)\n        {\n            switch (column.Index)\n            {\n                case 0:\n                    item.Text = $\"{kill.KillTime.ToLocalTime()}\";\n                    break;\n                case 1:\n                    item.Text = kill.Victim.ShipTypeName;\n                    break;\n                case 2:\n                    item.Text = kill.Victim.Name;\n                    break;\n                case 3:\n                    item.Text = kill.Victim.CorporationName;\n                    break;\n                case 4:\n                    item.Text = kill.Victim.AllianceName;\n                    break;\n                case 5:\n                    item.Text = kill.Victim.FactionName;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n\n\n        #endregion\n\n\n        #region Drawing\n\n        /// <summary>\n        /// Handles the DrawItem event of the lbKillLog control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void lbKillLog_DrawItem(object sender, DrawItemEventArgs e)\n        {\n            if (e.Index < 0 || e.Index >= lbKillLog.Items.Count)\n                return;\n\n            object item = lbKillLog.Items[e.Index];\n            KillLog kill = item as KillLog;\n            if (kill != null)\n                DrawItem(kill, e);\n            else\n                DrawItem((string)item, e);\n        }\n\n        /// <summary>\n        /// Handles the MeasureItem event of the lbKillLog control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MeasureItemEventArgs\"/> instance containing the event data.</param>\n        private void lbKillLog_MeasureItem(object sender, MeasureItemEventArgs e)\n        {\n            if (e.Index < 0)\n                return;\n\n            e.ItemHeight = GetItemHeight(lbKillLog.Items[e.Index]);\n        }\n\n        /// <summary>\n        /// Gets the item's height.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        private int GetItemHeight(object item)\n        {\n            if (item is KillLog)\n                return Math.Max(m_killFont.Height * 2 + PadTop * 2, KillDetailHeight);\n\n            return KillGroupHeaderHeight;\n        }\n\n        /// <summary>\n        /// Draws the list item for the given kill\n        /// </summary>\n        /// <param name=\"killLog\"></param>\n        /// <param name=\"e\"></param>\n        private void DrawItem(KillLog killLog, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Draw background\n            g.FillRectangle(e.Index % 2 == 0 ? Brushes.White : Brushes.LightGray, e.Bounds);\n\n            // Draw text for a kill\n            if (killLog.Group == KillGroup.Kills)\n                DrawKillText(killLog, e);\n\n            // Draw text for a loss\n            if (killLog.Group == KillGroup.Losses)\n                DrawLossText(killLog, e);\n\n            // If 'Safe for work' draw 'copy' text\n            if (Settings.UI.SafeForWork)\n            {\n                m_copyKillInfoTextSize = TextRenderer.MeasureText(g, CopyKillInfoText, m_killFont, Size.Empty, Format);\n                m_copyPositionFromRight = m_copyKillInfoTextSize.Width + PadRight;\n                TextRenderer.DrawText(g, CopyKillInfoText, m_killFont,\n                    new Rectangle(e.Bounds.Right - m_copyPositionFromRight,\n                        e.Bounds.Top + PadTop,\n                        m_copyKillInfoTextSize.Width + PadLeft,\n                        m_copyKillInfoTextSize.Height), Color.Black);\n\n            }\n\n            // Draw images\n            if (Settings.UI.SafeForWork)\n                return;\n\n            // Draw the kill image\n            g.DrawImage(killLog.VictimShipImage,\n                new Rectangle(e.Bounds.Left + PadLeft / 2,\n                    KillDetailHeight / 2 - killLog.VictimShipImage.Height / 2 + e.Bounds.Top,\n                    killLog.VictimShipImage.Width, killLog.VictimShipImage.Height));\n\n            // Draw the copy image\n            m_copyPositionFromRight = 24;\n            g.DrawImage(Resources.Copy, new Rectangle(e.Bounds.Right - m_copyPositionFromRight,\n                e.Bounds.Top + PadTop,\n                Resources.Copy.Width, Resources.Copy.Height));\n        }\n\n        /// <summary>\n        /// Draws the text for a kill.\n        /// </summary>\n        /// <param name=\"killLog\">The kill log.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void DrawKillText(KillLog killLog, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Texts\n            string victimNameText = killLog.Victim.Name;\n            string killTimeSinceText = killLog.TimeSinceKill\n                .ToDescriptiveText(DescriptiveTextOptions.IncludeCommas |\n                                   DescriptiveTextOptions.SpaceText |\n                                   DescriptiveTextOptions.FullText);\n            string killTimeText = $\"({killTimeSinceText} ago)\";\n            string victimNameCorpAndAllianceName = GetText(killLog.Victim.CorporationName, killLog.Victim.AllianceName);\n            string whatAndWhereInfo = $\"{killLog.Victim.ShipTypeName}, \" +\n                                      $\"{killLog.SolarSystem?.Name}, \" +\n                                      $\"{killLog.SolarSystem?.Constellation?.Region?.Name}, \" +\n                                      $\"{killLog.SolarSystem?.SecurityLevel:N1}\";\n\n            // Measure texts\n            Size victimNameTextSize = TextRenderer.MeasureText(g, victimNameText, m_killBoldFont, Size.Empty, Format);\n            Size killTimeTextSize = TextRenderer.MeasureText(g, killTimeText, m_killFont, Size.Empty, Format);\n            Size victimNameCorpAndAllianceNameSize = TextRenderer.MeasureText(g, victimNameCorpAndAllianceName, m_killFont,\n                Size.Empty, Format);\n            Size whatAndWhereInfoSize = TextRenderer.MeasureText(g, whatAndWhereInfo, m_killFont, Size.Empty, Format);\n\n            // Draw texts\n            TextRenderer.DrawText(g, victimNameText, m_killBoldFont,\n                new Rectangle(e.Bounds.Left + killLog.VictimShipImage.Width + 4 + PadRight,\n                    e.Bounds.Top,\n                    victimNameTextSize.Width + PadLeft,\n                    victimNameTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, killTimeText, m_killFont,\n                new Rectangle(\n                    e.Bounds.Left + killLog.VictimShipImage.Width + 4 + PadRight * 3 + victimNameTextSize.Width,\n                    e.Bounds.Top,\n                    killTimeTextSize.Width + PadLeft,\n                    killTimeTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, victimNameCorpAndAllianceName, m_killFont,\n                new Rectangle(e.Bounds.Left + killLog.VictimShipImage.Width + 4 + PadRight,\n                    e.Bounds.Top + victimNameTextSize.Height,\n                    victimNameCorpAndAllianceNameSize.Width + PadLeft,\n                    victimNameCorpAndAllianceNameSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, whatAndWhereInfo, m_killFont,\n                new Rectangle(e.Bounds.Left + killLog.VictimShipImage.Width + 4 + PadRight,\n                    e.Bounds.Top + victimNameTextSize.Height +\n                    victimNameCorpAndAllianceNameSize.Height,\n                    whatAndWhereInfoSize.Width + PadLeft,\n                    whatAndWhereInfoSize.Height), Color.Black);\n        }\n\n        /// <summary>\n        /// Draws the text for a loss.\n        /// </summary>\n        /// <param name=\"killLog\">The kill log.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void DrawLossText(KillLog killLog, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Texts\n            string killTimeSinceText = killLog.TimeSinceKill\n                .ToDescriptiveText(DescriptiveTextOptions.IncludeCommas |\n                                   DescriptiveTextOptions.SpaceText |\n                                   DescriptiveTextOptions.FullText);\n            string killTimeText = $\"({killTimeSinceText} ago)\";\n            string finalBlowAttackerCorpAndAllianceName = GetText(killLog.FinalBlowAttacker.CorporationName,\n                killLog.FinalBlowAttacker.AllianceName);\n            string finalBlowAttackerShipAndModuleName = GetText(killLog.FinalBlowAttacker.ShipTypeName,\n                killLog.FinalBlowAttacker.WeaponTypeName);\n\n            // Measure texts\n            Size killShipNameTextSize = TextRenderer.MeasureText(g, killLog.Victim.ShipTypeName, m_killBoldFont, Size.Empty,\n                Format);\n            Size killTimeTextSize = TextRenderer.MeasureText(g, killTimeText, m_killFont, Size.Empty, Format);\n            Size finalBlowAttackerCorpAndAllianceNameSize = TextRenderer.MeasureText(g, finalBlowAttackerCorpAndAllianceName,\n                m_killFont, Size.Empty, Format);\n            Size finalBlowAttackerShipAndModuleNameSize = TextRenderer.MeasureText(g, finalBlowAttackerShipAndModuleName,\n                m_killFont, Size.Empty, Format);\n\n            // Draw texts\n            TextRenderer.DrawText(g, killLog.Victim.ShipTypeName, m_killBoldFont,\n                new Rectangle(e.Bounds.Left + killLog.VictimShipImage.Width + 4 + PadRight,\n                    e.Bounds.Top,\n                    killShipNameTextSize.Width + PadLeft,\n                    killShipNameTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, killTimeText, m_killFont,\n                new Rectangle(\n                    e.Bounds.Left + killLog.VictimShipImage.Width + 4 + PadRight * 3 + killShipNameTextSize.Width,\n                    e.Bounds.Top,\n                    killTimeTextSize.Width + PadLeft,\n                    killTimeTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, finalBlowAttackerCorpAndAllianceName, m_killFont,\n                new Rectangle(e.Bounds.Left + killLog.VictimShipImage.Width + 4 + PadRight,\n                    e.Bounds.Top + killShipNameTextSize.Height,\n                    finalBlowAttackerCorpAndAllianceNameSize.Width + PadLeft,\n                    finalBlowAttackerCorpAndAllianceNameSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, finalBlowAttackerShipAndModuleName, m_killFont,\n                new Rectangle(e.Bounds.Left + killLog.VictimShipImage.Width + 4 + PadRight,\n                    e.Bounds.Top + killShipNameTextSize.Height +\n                    finalBlowAttackerCorpAndAllianceNameSize.Height,\n                    finalBlowAttackerShipAndModuleNameSize.Width + PadLeft,\n                    finalBlowAttackerShipAndModuleNameSize.Height), Color.Black);\n        }\n\n        /// <summary>\n        /// Draws the list item for the given group.\n        /// </summary>\n        /// <param name=\"group\"></param>\n        /// <param name=\"e\"></param>\n        private void DrawItem(string group, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Draws the background\n            using (LinearGradientBrush lgb = new LinearGradientBrush(new PointF(0F, 0F), new PointF(0F, 21F),\n                Color.FromArgb(75, 75, 75), Color.FromArgb(25, 25, 25)))\n            {\n                g.FillRectangle(lgb, e.Bounds);\n            }\n\n            using (Pen p = new Pen(Color.FromArgb(100, 100, 100)))\n            {\n                g.DrawLine(p, e.Bounds.Left, e.Bounds.Top, e.Bounds.Right + 1, e.Bounds.Top);\n            }\n\n            // Setting character spacing\n            NativeMethods.SetTextCharacterSpacing(g, 4);\n\n            // Measure texts\n            Size standingGroupTextSize = TextRenderer.MeasureText(g, group.ToUpper(CultureConstants.DefaultCulture),\n                m_killBoldFont, Size.Empty, Format);\n            Rectangle standingGroupTextRect = new Rectangle(e.Bounds.Left + PadLeft,\n                e.Bounds.Top +\n                (e.Bounds.Height / 2 - standingGroupTextSize.Height / 2),\n                standingGroupTextSize.Width + PadRight,\n                standingGroupTextSize.Height);\n\n            // Draws the text header\n            TextRenderer.DrawText(g, group.ToUpper(CultureConstants.DefaultCulture), m_killBoldFont, standingGroupTextRect,\n                Color.White, Color.Transparent, Format);\n\n            // Draws the collapsing arrows\n            bool isCollapsed = m_collapsedGroups.Contains(group);\n            Image img = isCollapsed ? Resources.Expand : Resources.Collapse;\n\n            g.DrawImageUnscaled(img, new Rectangle(e.Bounds.Right - img.Width - CollapserPadRight,\n                KillGroupHeaderHeight / 2 - img.Height / 2 + e.Bounds.Top,\n                img.Width, img.Height));\n        }\n\n        /// <summary>\n        /// Gets the preferred size from the preferred size of the list.\n        /// </summary>\n        /// <param name=\"proposedSize\"></param>\n        /// <returns></returns>\n        public override Size GetPreferredSize(Size proposedSize) => lbKillLog.GetPreferredSize(proposedSize);\n\n        #endregion\n\n\n        #region Local events\n\n        /// <summary>\n        /// Handles the StandingImageUpdated event of the standing control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void kill_KillLogVictimShipImageUpdated(object sender, EventArgs e)\n        {\n            // Force to redraw\n            lbKillLog.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the MouseDoubleClick event of the lbKillLog control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbKillLog_MouseDoubleClick(object sender, MouseEventArgs e)\n        {\n            ShowKillDetails();\n        }\n\n        /// <summary>\n        /// Handles the MouseWheel event of the lbKillLog control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbKillLog_MouseWheel(object sender, MouseEventArgs e)\n        {\n            if (e.Delta == 0)\n                return;\n\n            // Update the drawing based upon the mouse wheel scrolling\n            int numberOfItemLinesToMove = e.Delta * SystemInformation.MouseWheelScrollLines / Math.Abs(e.Delta);\n            int lines = numberOfItemLinesToMove;\n            if (lines == 0)\n                return;\n\n            // Compute the number of lines to move\n            int direction = lines / Math.Abs(lines);\n            int[] numberOfPixelsToMove = new int[lines * direction];\n            for (int i = 1; i <= Math.Abs(lines); i++)\n            {\n                object item = null;\n\n                // Going up\n                if (direction == Math.Abs(direction))\n                {\n                    // Retrieve the next top item\n                    if (lbKillLog.TopIndex - i >= 0)\n                        item = lbKillLog.Items[lbKillLog.TopIndex - i];\n                }\n                // Going down\n                else\n                {\n                    // Compute the height of the items from current the topindex (included)\n                    int height = 0;\n                    for (int j = lbKillLog.TopIndex + i - 1; j < lbKillLog.Items.Count; j++)\n                    {\n                        height += GetItemHeight(lbKillLog.Items[j]);\n                    }\n\n                    // Retrieve the next bottom item\n                    if (height > lbKillLog.ClientSize.Height)\n                        item = lbKillLog.Items[lbKillLog.TopIndex + i - 1];\n                }\n\n                // If found a new item as top or bottom\n                if (item != null)\n                    numberOfPixelsToMove[i - 1] = GetItemHeight(item) * direction;\n                else\n                    lines -= direction;\n            }\n\n            // Scroll \n            if (lines != 0)\n                lbKillLog.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the lbKillLog control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbKillLog_MouseDown(object sender, MouseEventArgs e)\n        {\n            int index = lbKillLog.IndexFromPoint(e.Location);\n            if (index < 0 || index >= lbKillLog.Items.Count)\n                return;\n\n            Rectangle itemRect;\n\n            // Beware, this last index may actually means a click in the whitespace at the bottom\n            // Let's deal with this special case\n            if (index == lbKillLog.Items.Count - 1)\n            {\n                itemRect = lbKillLog.GetItemRectangle(index);\n                if (!itemRect.Contains(e.Location))\n                    return;\n            }\n\n            object item = lbKillLog.Items[index];\n            string killsGroup = item as string;\n\n            if (killsGroup != null)\n            {\n                // Left or Middle button : expand/collapse\n                if (e.Button != MouseButtons.Right)\n                {\n                    ToggleGroupExpandCollapse(killsGroup);\n                    return;\n                }\n\n                // If right click on the button, still expand/collapse\n                itemRect = lbKillLog.GetItemRectangle(lbKillLog.Items.IndexOf(item));\n                Rectangle buttonRect = GetButtonRectangle(killsGroup, itemRect);\n                if (!buttonRect.Contains(e.Location))\n                    return;\n\n                ToggleGroupExpandCollapse(killsGroup);\n                return;\n            }\n\n            // Right click we display a context menu\n            if (e.Button == MouseButtons.Right)\n            {\n                // Display the context menu\n                contextMenuStrip.Show(lbKillLog, e.Location);\n                return;\n            }\n\n            // Did the user clicked on the \"copy kill info\" image ?\n            itemRect = lbKillLog.GetItemRectangle(index);\n            Rectangle copyKillInfoRect = GetCopyKillInfoRect(itemRect);\n            if (copyKillInfoRect.Contains(e.Location))\n                KillLogExporter.CopyKillInfoToClipboard(m_selectedKillLog);\n        }\n\n        /// <summary>\n        /// Handles the MouseMove event of the lbKillLog control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbKillLog_MouseMove(object sender, MouseEventArgs e)\n        {\n            for (int i = 0; i < lbKillLog.Items.Count; i++)\n            {\n                // Skip until we find an item\n                Rectangle rect = lbKillLog.GetItemRectangle(i);\n                if (!rect.Contains(e.Location))\n                    continue;\n\n                // Skip if we are over the \"copy kill info\" image \n                rect = GetCopyKillInfoRect(lbKillLog.GetItemRectangle(i));\n                if (rect.Contains(e.Location))\n                {\n                    lbKillLog.Cursor = Cursors.Default;\n                    DisplayTooltip();\n                    return;\n                }\n\n                toolTip.Active = false;\n\n                object item = lbKillLog.Items[i];\n                m_selectedKillLog = item as KillLog;\n\n                lbKillLog.Cursor = m_selectedKillLog != null ? CustomCursors.ContextMenu : Cursors.Default;\n\n                return;\n            }\n\n            toolTip.Active = false;\n            lbKillLog.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void lvKillLog_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Left)\n                return;\n\n            lvKillLog.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When user moves over the list we display a cursor indicating there is a context menu available.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void lvKillLog_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            m_selectedKillLog = lvKillLog.GetItemAt(e.X, e.Y)?.Tag as KillLog;\n\n            lvKillLog.Cursor = m_selectedKillLog != null ? CustomCursors.ContextMenu : Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the user clicks a column header, we update the sorting.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvKillLog_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            ColumnHeader column = lvKillLog.Columns[e.Column];\n            if (m_sortCriteria == column)\n                m_sortAscending = !m_sortAscending;\n            else\n            {\n                m_sortCriteria = column;\n                m_sortAscending = true;\n            }\n\n            // Updates the item sorter\n            UpdateSort();\n        }\n\n        /// <summary>\n        /// Handles the DoubleClick event of the lvKillLog control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void lvKillLog_DoubleClick(object sender, EventArgs e)\n        {\n            ShowKillDetails();\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the contextMenuStrip control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void contextMenuStrip_Opening(object sender, CancelEventArgs e)\n        {\n            e.Cancel = m_selectedKillLog == null;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the showDetailsMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void showDetailsMenuItem_Click(object sender, EventArgs e)\n        {\n            ShowKillDetails();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the showInShipBrowserMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void showInShipBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            if (m_selectedKillLog == null)\n                return;\n\n            Ship ship = StaticItems.GetItemByID(m_selectedKillLog.Victim.ShipTypeID) as Ship;\n\n            if (ship == null)\n                return;\n\n            PlanWindow.ShowPlanWindow(Character).ShowShipInBrowser(ship);\n        }\n\n        /// <summary>\n        /// Handles the Click event of the copyKillInfoMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void copyKillInfoMenuItem_Click(object sender, EventArgs e)\n        {\n            KillLogExporter.CopyKillInfoToClipboard(m_selectedKillLog);\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Checks the given text matches the item.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if [is text matching] [the specified x]; otherwise, <c>false</c>.\n        /// </returns>\n        private static bool IsTextMatching(KillLog x, string text) => string.IsNullOrEmpty(text) ||\n               x.Victim.ShipTypeName.ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.Victim.Name.ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.Victim.CorporationName.ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.Victim.AllianceName.ToUpperInvariant().Contains(text, ignoreCase: true) ||\n               x.Victim.FactionName.ToUpperInvariant().Contains(text, ignoreCase: true);\n\n        /// <summary>\n        /// Gets the text.\n        /// </summary>\n        /// <param name=\"text1\">The text1.</param>\n        /// <param name=\"text2\">The text2.</param>\n        /// <returns></returns>\n        private static string GetText(string text1, string text2)\n        {\n            StringBuilder sb = new StringBuilder();\n            sb.Append(text1);\n\n            if (!text2.IsEmptyOrUnknown())\n                sb.Append($\" / {text2}\");\n\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Toggles the expansion or collapsing of a single group\n        /// </summary>\n        /// <param name=\"group\">The group to expand or collapse.</param>\n        private void ToggleGroupExpandCollapse(string group)\n        {\n            if (m_collapsedGroups.Contains(group))\n            {\n                m_collapsedGroups.Remove(group);\n                UpdateListContent();\n            }\n            else\n            {\n                m_collapsedGroups.Add(group);\n                UpdateListContent();\n            }\n        }\n\n        /// <summary>\n        /// Gets the rectangle for the collapse/expand button.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <param name=\"itemRect\">The item rect.</param>\n        /// <returns></returns>\n        private Rectangle GetButtonRectangle(string group, Rectangle itemRect)\n        {\n            // Checks whether this group is collapsed\n            bool isCollapsed = m_collapsedGroups.Contains(group);\n\n            // Get the image for this state\n            Image btnImage = isCollapsed ? Resources.Expand : Resources.Collapse;\n\n            // Compute the top left point\n            Point btnPoint = new Point(itemRect.Right - btnImage.Width - CollapserPadRight,\n                KillGroupHeaderHeight / 2 - btnImage.Height / 2 + itemRect.Top);\n\n            return new Rectangle(btnPoint, btnImage.Size);\n        }\n\n        /// <summary>\n        /// Shows the kill details.\n        /// </summary>\n        private void ShowKillDetails()\n        {\n            if (m_selectedKillLog == null)\n                return;\n\n            WindowsFactory.ShowByTag<KillReportWindow, KillLog>(m_selectedKillLog);\n        }\n\n        /// <summary>\n        /// Displays the tooltip.\n        /// </summary>\n        private void DisplayTooltip()\n        {\n            if (toolTip.Active || Settings.UI.SafeForWork)\n                return;\n\n            toolTip.Active = false;\n            toolTip.SetToolTip(lbKillLog, CopyKillInfoText);\n            toolTip.Active = true;\n        }\n\n        /// <summary>\n        /// Gets the rectangle of the \"copy\" icon for the listbox item at the given index.\n        /// </summary>\n        /// <param name=\"rect\"></param>\n        /// <returns></returns>\n        private Rectangle GetCopyKillInfoRect(Rectangle rect)\n        {\n            Bitmap icon = Resources.Copy;\n            Size copyKillInfoSize = Settings.UI.SafeForWork\n                ? m_copyKillInfoTextSize\n                : icon.Size;\n            Rectangle copyKillInfoRect = new Rectangle(rect.Right - m_copyPositionFromRight, rect.Top + PadTop,\n                copyKillInfoSize.Width, copyKillInfoSize.Height);\n            copyKillInfoRect.Inflate(2, 8);\n            return copyKillInfoRect;\n        }\n\n        #endregion\n\n\n        #region Global events\n\n        /// <summary>\n        /// When the character kill log update, we refresh the content.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterKillLogUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            UpdateKillLogView();\n        }\n\n        /// <summary>\n        /// When the ID to name conversion updates, we refresh the content.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            UpdateKillLogView();\n        }\n\n        /// <summary>\n        /// When the settings change we update the content.\n        /// </summary>\n        /// <remarks>In case 'SafeForWork' gets enabled.</remarks>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateKillLogView();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterKillLogList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"contextMenuStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>103, 17</value>\n  </metadata>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        AAAAAk1TRnQBSQFMAgEBAwEAAQQBCAEEAQgBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABEAMAAQEBAAEQBgABCP8A/wD/AP8A/wD/AP8A/wAaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB\n        AQABAQUAAYAXAAP/AQAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAB8AEPAf4BfwL/AgAB+AEfAfwBPwL/\n        AgAB/AE/AfgBHwL/AgAB/gF/AfABDwL/AgAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAL\n</value>\n  </data>\n  <metadata name=\"toolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>252, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterLoyaltyList.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    partial class CharacterLoyaltyList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.noLoyaltyLabel = new System.Windows.Forms.Label();\n            this.lbLoyalty = new EVEMon.Common.Controls.NoFlickerListBox();\n            this.SuspendLayout();\n            // \n            // noLoyaltyLabel\n            // \n            this.noLoyaltyLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n            this.noLoyaltyLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noLoyaltyLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noLoyaltyLabel.Location = new System.Drawing.Point(0, 0);\n            this.noLoyaltyLabel.Name = \"noLoyaltyLabel\";\n            this.noLoyaltyLabel.Size = new System.Drawing.Size(328, 372);\n            this.noLoyaltyLabel.TabIndex = 2;\n            this.noLoyaltyLabel.Text = \"Loyalty point information not available.\";\n            this.noLoyaltyLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lbLoyalty\n            // \n            this.lbLoyalty.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lbLoyalty.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbLoyalty.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;\n            this.lbLoyalty.FormattingEnabled = true;\n            this.lbLoyalty.IntegralHeight = false;\n            this.lbLoyalty.ItemHeight = 15;\n            this.lbLoyalty.Location = new System.Drawing.Point(0, 0);\n            this.lbLoyalty.Margin = new System.Windows.Forms.Padding(0);\n            this.lbLoyalty.Name = \"lbLoyalty\";\n            this.lbLoyalty.Size = new System.Drawing.Size(328, 372);\n            this.lbLoyalty.TabIndex = 4;\n            this.lbLoyalty.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.lbLoyalty_DrawItem);\n            this.lbLoyalty.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.lbLoyalty_MeasureItem);\n            this.lbLoyalty.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbLoyalty_MouseDown);\n            this.lbLoyalty.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.lbLoyalty_MouseWheel);\n            // \n            // CharacterLoyaltyList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.noLoyaltyLabel);\n            this.Controls.Add(this.lbLoyalty);\n            this.Name = \"CharacterLoyaltyList\";\n            this.Size = new System.Drawing.Size(328, 372);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noLoyaltyLabel;\n        private Common.Controls.NoFlickerListBox lbLoyalty;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterLoyaltyList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Properties;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterLoyaltyList : UserControl\n    {\n        #region Fields\n\n        private const TextFormatFlags Format = TextFormatFlags.NoPadding | TextFormatFlags.NoClipping | TextFormatFlags.NoPrefix;\n\n        // Standings drawing - Region & text padding\n        private const int PadTop = 2;\n        private const int PadLeft = 6;\n        private const int PadRight = 7;\n\n        // Loyalty drawing - Loyalty\n        private const int LoyaltyDetailHeight = 34;\n\n        private readonly Font m_loyaltyFont;\n        private readonly Font m_loyaltyBoldFont;\n\n        #endregion\n\n\n        #region Constructor\n\n        public CharacterLoyaltyList()\n        {\n            InitializeComponent();\n\n            lbLoyalty.Visible = false;\n\n            m_loyaltyFont = FontFactory.GetFont(\"Tahoma\", 8.25F);\n            m_loyaltyBoldFont = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            noLoyaltyLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        #endregion\n\n\n        #region Inherited events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.CharacterLoyaltyPointsUpdated += EveMonClient_CharacterLoyaltyUpdated;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterLoyaltyPointsUpdated -= EveMonClient_CharacterLoyaltyUpdated;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (Visible)\n                UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Content Management\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            // When no character, we just hide the list\n            if (Character == null)\n            {\n                noLoyaltyLabel.Visible = true;\n                lbLoyalty.Visible = false;\n                return;\n            }\n\n            int scrollBarPosition = lbLoyalty.TopIndex;\n\n            // Update the standings list\n            lbLoyalty.BeginUpdate();\n            try\n            {\n                var loyaltyList = new List<Loyalty>(Character.LoyaltyPoints);\n                loyaltyList.Sort();\n\n                // Scroll through groups\n                lbLoyalty.Items.Clear();\n\n                foreach (var loyalty in loyaltyList)\n                {\n                    loyalty.LoyaltyCorpImageUpdated += loyalty_CorpImageUpdated;\n                    lbLoyalty.Items.Add(loyalty);\n                }\n\n                // Display or hide the \"no standings\" label.\n                noLoyaltyLabel.Visible = !loyaltyList.Any();\n                lbLoyalty.Visible = loyaltyList.Any();\n\n                // Invalidate display\n                lbLoyalty.Invalidate();\n            }\n            finally\n            {\n                lbLoyalty.EndUpdate();\n                lbLoyalty.TopIndex = scrollBarPosition;\n            }\n        }\n\n        #endregion\n\n\n        #region Drawing\n\n        /// <summary>\n        /// Handles the DrawItem event of the lbLoyalty control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void lbLoyalty_DrawItem(object sender, DrawItemEventArgs e)\n        {\n            if (e.Index < 0 || e.Index >= lbLoyalty.Items.Count)\n                return;\n\n            Loyalty loyalty = lbLoyalty.Items[e.Index] as Loyalty;\n            DrawItem(loyalty, e);\n        }\n\n        /// <summary>\n        /// Handles the MeasureItem event of the lbLoyalty control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MeasureItemEventArgs\"/> instance containing the event data.</param>\n        private void lbLoyalty_MeasureItem(object sender, MeasureItemEventArgs e)\n        {\n            if (e.Index < 0)\n                return;\n            e.ItemHeight = GetItemHeight(lbLoyalty.Items[e.Index]);\n        }\n\n        /// <summary>\n        /// Gets the item's height.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        private int GetItemHeight(object item)\n        {\n            return Math.Max(m_loyaltyFont.Height * 2 + PadTop * 2, LoyaltyDetailHeight);\n        }\n\n        /// <summary>\n        /// Draws the list item for the given loyalty point balance\n        /// </summary>\n        /// <param name=\"loyalty\"></param>\n        /// <param name=\"e\"></param>\n        private void DrawItem(Loyalty loyalty, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Draw background\n            g.FillRectangle(e.Index % 2 == 0 ? Brushes.White : Brushes.LightGray, e.Bounds);\n\n            // Texts - corp on first row, points on last row\n            string corp = loyalty.CorporationName;\n            string loyaltyText = $\"{loyalty.LoyaltyPoints}\";\n            string pointText = loyalty.LoyaltyPoints == 1 ? \"point\" : \"points\";\n\n            // Measure texts\n            Size corpTextSize = TextRenderer.MeasureText(g, corp, m_loyaltyBoldFont, Size.Empty, Format);\n            Size loyaltyTextSize = TextRenderer.MeasureText(g, loyaltyText, m_loyaltyBoldFont, Size.Empty, Format);\n            Size pointTextSize = TextRenderer.MeasureText(g, pointText, m_loyaltyFont, Size.Empty, Format);\n\n            // Draw texts\n            TextRenderer.DrawText(g, corp, m_loyaltyBoldFont, new Rectangle(\n                e.Bounds.Left + PadLeft * 7, e.Bounds.Top + PadTop,\n                corpTextSize.Width + PadLeft,\n                corpTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, loyaltyText, m_loyaltyBoldFont, new Rectangle(\n                e.Bounds.Left + PadLeft * 7, e.Bounds.Top + PadTop + corpTextSize.Height,\n                loyaltyTextSize.Width + PadLeft,\n                loyaltyTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, pointText, m_loyaltyFont, new Rectangle(\n                e.Bounds.Left + PadLeft * 8 + loyaltyTextSize.Width,\n                e.Bounds.Top + PadTop + corpTextSize.Height,\n                pointTextSize.Width + PadLeft, pointTextSize.Height), Color.Black);\n\n            // Draw the corporation image\n            if (Settings.UI.SafeForWork)\n                return;\n\n            g.DrawImage(loyalty.CorporationImage, new Rectangle(e.Bounds.Left + PadLeft / 2,\n                LoyaltyDetailHeight / 2 - loyalty.CorporationImage.Height / 2 + e.Bounds.Top,\n                loyalty.CorporationImage.Width, loyalty.CorporationImage.Height));\n        }\n\n        /// <summary>\n        /// Gets the preferred size from the preferred size of the list.\n        /// </summary>\n        /// <param name=\"proposedSize\"></param>\n        /// <returns></returns>\n        public override Size GetPreferredSize(Size proposedSize) => lbLoyalty.GetPreferredSize(proposedSize);\n\n        #endregion\n\n\n        #region Local events\n\n        /// <summary>\n        /// When the image updates, we redraw the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void loyalty_CorpImageUpdated(object sender, EventArgs e)\n        {\n            // Force to redraw\n            lbLoyalty.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the MouseWheel event of the lbLoyalty control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbLoyalty_MouseWheel(object sender, MouseEventArgs e)\n        {\n            if (e.Delta == 0)\n                return;\n\n            // Update the drawing based upon the mouse wheel scrolling\n            int numberOfItemLinesToMove = e.Delta * SystemInformation.MouseWheelScrollLines / Math.Abs(e.Delta);\n            int lines = numberOfItemLinesToMove;\n            if (lines == 0)\n                return;\n\n            // Compute the number of lines to move\n            int direction = lines / Math.Abs(lines);\n            int[] numberOfPixelsToMove = new int[lines * direction];\n            for (int i = 1; i <= Math.Abs(lines); i++)\n            {\n                object item = null;\n\n                // Going up\n                if (direction == Math.Abs(direction))\n                {\n                    // Retrieve the next top item\n                    if (lbLoyalty.TopIndex - i >= 0)\n                        item = lbLoyalty.Items[lbLoyalty.TopIndex - i];\n                }\n                // Going down\n                else\n                {\n                    // Compute the height of the items from current the topindex (included)\n                    int height = 0;\n                    for (int j = lbLoyalty.TopIndex + i - 1; j < lbLoyalty.Items.Count; j++)\n                    {\n                        height += GetItemHeight(lbLoyalty.Items[j]);\n                    }\n\n                    // Retrieve the next bottom item\n                    if (height > lbLoyalty.ClientSize.Height)\n                        item = lbLoyalty.Items[lbLoyalty.TopIndex + i - 1];\n                }\n\n                // If found a new item as top or bottom\n                if (item != null)\n                    numberOfPixelsToMove[i - 1] = GetItemHeight(item) * direction;\n                else\n                    lines -= direction;\n            }\n\n            // Scroll \n            if (lines != 0)\n                lbLoyalty.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the lbLoyalty control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbLoyalty_MouseDown(object sender, MouseEventArgs e)\n        {\n            int index = lbLoyalty.IndexFromPoint(e.Location);\n            if (index < 0 || index >= lbLoyalty.Items.Count)\n                return;\n\n            Rectangle itemRect;\n\n            // Beware, this last index may actually means a click in the whitespace at the bottom\n            // Let's deal with this special case\n            if (index == lbLoyalty.Items.Count - 1)\n            {\n                itemRect = lbLoyalty.GetItemRectangle(index);\n                if (!itemRect.Contains(e.Location))\n                    return;\n            }\n        }\n\n        #endregion\n\n\n        #region Global events\n\n        /// <summary>\n        /// When the character loyalty point balances update, we refresh the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterLoyaltyUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the settings change we update the content.\n        /// </summary>\n        /// <remarks>In case 'SafeForWork' gets enabled.</remarks>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the EVE ID to name changes we update the content.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterLoyaltyList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMarketOrdersList.Designer.cs",
    "content": "﻿using EVEMon.Common.Controls;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterMarketOrdersList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.Windows.Forms.ListViewGroup listViewGroup1 = new System.Windows.Forms.ListViewGroup(\"Sell Orders\", System.Windows.Forms.HorizontalAlignment.Left);\n            System.Windows.Forms.ListViewGroup listViewGroup2 = new System.Windows.Forms.ListViewGroup(\"Buy Orders\", System.Windows.Forms.HorizontalAlignment.Left);\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterMarketOrdersList));\n            this.lvOrders = new System.Windows.Forms.ListView();\n            this.itemColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.locationColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.unitaryPriceColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.quantityColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.showInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInBrowserMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.ilIcons = new System.Windows.Forms.ImageList(this.components);\n            this.noOrdersLabel = new System.Windows.Forms.Label();\n            this.marketExpPanelControl = new EVEMon.Common.Controls.ExpandablePanelControl();\n            this.contextMenu.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // lvOrders\n            // \n            this.lvOrders.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lvOrders.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.itemColumn,\n            this.locationColumn,\n            this.unitaryPriceColumn,\n            this.quantityColumn});\n            this.lvOrders.ContextMenuStrip = this.contextMenu;\n            this.lvOrders.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvOrders.FullRowSelect = true;\n            listViewGroup1.Header = \"Sell Orders\";\n            listViewGroup1.Name = \"sellGroup\";\n            listViewGroup2.Header = \"Buy Orders\";\n            listViewGroup2.Name = \"buyGroup\";\n            this.lvOrders.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {\n            listViewGroup1,\n            listViewGroup2});\n            this.lvOrders.HideSelection = false;\n            this.lvOrders.Location = new System.Drawing.Point(0, 0);\n            this.lvOrders.MultiSelect = false;\n            this.lvOrders.Name = \"lvOrders\";\n            this.lvOrders.Size = new System.Drawing.Size(454, 334);\n            this.lvOrders.SmallImageList = this.ilIcons;\n            this.lvOrders.TabIndex = 0;\n            this.lvOrders.UseCompatibleStateImageBehavior = false;\n            this.lvOrders.View = System.Windows.Forms.View.Details;\n            // \n            // itemColumn\n            // \n            this.itemColumn.Text = \"Item\";\n            this.itemColumn.Width = 192;\n            // \n            // locationColumn\n            // \n            this.locationColumn.Text = \"System\";\n            this.locationColumn.Width = 80;\n            // \n            // unitaryPriceColumn\n            // \n            this.unitaryPriceColumn.Text = \"Unit Price\";\n            this.unitaryPriceColumn.Width = 92;\n            // \n            // quantityColumn\n            // \n            this.quantityColumn.Text = \"Quantity\";\n            this.quantityColumn.Width = 88;\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showInBrowserMenuItem,\n            this.showInBrowserMenuSeparator,\n            this.exportToCSVToolStripMenuItem});\n            this.contextMenu.Name = \"ShipPropertiesContextMenu\";\n            this.contextMenu.Size = new System.Drawing.Size(171, 76);\n            this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenu_Opening);\n            // \n            // showInBrowserMenuItem\n            // \n            this.showInBrowserMenuItem.Name = \"showInBrowserMenuItem\";\n            this.showInBrowserMenuItem.Size = new System.Drawing.Size(170, 22);\n            this.showInBrowserMenuItem.Text = \"Show In Browser...\";\n            this.showInBrowserMenuItem.Click += new System.EventHandler(this.showInBrowserMenuItem_Click);\n            // \n            // showInBrowserMenuSeparator\n            // \n            this.showInBrowserMenuSeparator.Name = \"showInBrowserMenuSeparator\";\n            this.showInBrowserMenuSeparator.Size = new System.Drawing.Size(167, 6);\n            // \n            // exportToCSVToolStripMenuItem\n            // \n            this.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n            this.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(170, 22);\n            this.exportToCSVToolStripMenuItem.Text = \"Export To CSV ...\";\n            this.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n            // \n            // ilIcons\n            // \n            this.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n            this.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilIcons.Images.SetKeyName(0, \"arrow_up.png\");\n            this.ilIcons.Images.SetKeyName(1, \"arrow_down.png\");\n            this.ilIcons.Images.SetKeyName(2, \"16x16Transparant.png\");\n            // \n            // noOrdersLabel\n            // \n            this.noOrdersLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noOrdersLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noOrdersLabel.Location = new System.Drawing.Point(0, 0);\n            this.noOrdersLabel.Name = \"noOrdersLabel\";\n            this.noOrdersLabel.Size = new System.Drawing.Size(454, 434);\n            this.noOrdersLabel.TabIndex = 1;\n            this.noOrdersLabel.Text = \"No market orders are available.\";\n            this.noOrdersLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // marketExpPanelControl\n            // \n            this.marketExpPanelControl.AnimationSpeed = EVEMon.Common.Controls.AnimationSpeed.Medium;\n            this.marketExpPanelControl.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.marketExpPanelControl.EnableContextMenu = false;\n            this.marketExpPanelControl.ExpandDirection = EVEMon.Common.Controls.Direction.Down;\n            this.marketExpPanelControl.ExpandedHeight = 100;\n            this.marketExpPanelControl.ExpandedOnStartup = false;\n            this.marketExpPanelControl.HeaderHeight = 30;\n            this.marketExpPanelControl.HeaderText = \"Header Text\";\n            this.marketExpPanelControl.ImageCollapse = ((System.Drawing.Bitmap)(resources.GetObject(\"marketExpPanelControl.ImageCollapse\")));\n            this.marketExpPanelControl.ImageExpand = ((System.Drawing.Bitmap)(resources.GetObject(\"marketExpPanelControl.ImageExpand\")));\n            this.marketExpPanelControl.Location = new System.Drawing.Point(0, 334);\n            this.marketExpPanelControl.Name = \"marketExpPanelControl\";\n            this.marketExpPanelControl.Size = new System.Drawing.Size(454, 100);\n            this.marketExpPanelControl.TabIndex = 2;\n            // \n            // CharacterMarketOrdersList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.lvOrders);\n            this.Controls.Add(this.marketExpPanelControl);\n            this.Controls.Add(this.noOrdersLabel);\n            this.Name = \"CharacterMarketOrdersList\";\n            this.Size = new System.Drawing.Size(454, 434);\n            this.contextMenu.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ListView lvOrders;\n        private System.Windows.Forms.Label noOrdersLabel;\n        private System.Windows.Forms.ColumnHeader itemColumn;\n        private System.Windows.Forms.ColumnHeader quantityColumn;\n        private System.Windows.Forms.ColumnHeader locationColumn;\n        private System.Windows.Forms.ColumnHeader unitaryPriceColumn;\n        private System.Windows.Forms.ImageList ilIcons;\n        private ExpandablePanelControl marketExpPanelControl;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem showInBrowserMenuItem;\n        private System.Windows.Forms.ToolStripSeparator showInBrowserMenuSeparator;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMarketOrdersList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.SkillPlanner;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    /// <summary>\n    /// Displays a list of market orders.\n    /// </summary>\n    internal sealed partial class CharacterMarketOrdersList : UserControl, IListView\n    {\n        #region Fields\n\n        private readonly List<MarketOrderColumnSettings> m_columns = new List<MarketOrderColumnSettings>();\n        private readonly List<MarketOrder> m_list = new List<MarketOrder>();\n\n        private InfiniteDisplayToolTip m_tooltip;\n        private MarketOrderGrouping m_grouping;\n        private MarketOrderColumn m_sortCriteria;\n        private IssuedFor m_showIssuedFor;\n\n        private string m_textFilter = string.Empty;\n        private bool m_sortAscending = true;\n\n        private bool m_isUpdatingColumns;\n        private bool m_columnsChanged;\n        private bool m_init;\n\n        // Panel info variables\n        private int m_skillBasedOrders;\n\n        private float m_baseBrokerFee,\n                      m_transactionTax;\n\n        private int m_askRange, m_bidRange, m_modificationRange, m_remoteBidRange;\n\n        private int m_activeOrdersIssuedForCharacter,\n                    m_activeOrdersIssuedForCorporation;\n\n        private int m_activeSellOrdersIssuedForCharacterCount,\n                    m_activeSellOrdersIssuedForCorporationCount;\n\n        private int m_activeBuyOrdersIssuedForCharacterCount,\n                    m_activeBuyOrdersIssuedForCorporationCount;\n\n        private decimal m_sellOrdersIssuedForCharacterTotal,\n                        m_sellOrdersIssuedForCorporationTotal;\n\n        private decimal m_buyOrdersIssuedForCharacterTotal,\n                        m_buyOrdersIssuedForCorporationTotal;\n\n        private decimal m_issuedForCharacterTotalEscrow,\n                        m_issuedForCorporationTotalEscrow;\n\n        private decimal m_issuedForCharacterEscrowAdditionalToCover,\n                        m_issuedForCorporationEscrowAdditionalToCover;\n\n        #endregion\n\n\n        # region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public CharacterMarketOrdersList()\n        {\n            InitializeComponent();\n            InitializeExpandablePanelControls();\n\n            lvOrders.Hide();\n            lvOrders.AllowColumnReorder = true;\n            lvOrders.Columns.Clear();\n\n            m_showIssuedFor = IssuedFor.All;\n\n            noOrdersLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n            marketExpPanelControl.Font = FontFactory.GetFont(\"Tahoma\", 8.25f);\n            marketExpPanelControl.Hide();\n\n            ListViewHelper.EnableDoubleBuffer(lvOrders);\n\n            lvOrders.ColumnClick += listView_ColumnClick;\n            lvOrders.ColumnWidthChanged += listView_ColumnWidthChanged;\n            lvOrders.ColumnReordered += listView_ColumnReordered;\n            lvOrders.MouseDown += listView_MouseDown;\n            lvOrders.MouseMove += listView_MouseMove;\n            lvOrders.MouseLeave += listView_MouseLeave;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"lvOrders\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        internal bool Visibility\n        {\n            get { return lvOrders.Visible; }\n            set { lvOrders.Visible = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets the text filter.\n        /// </summary>\n        [Browsable(false)]\n        public string TextFilter\n        {\n            get { return m_textFilter; }\n            set\n            {\n                m_textFilter = value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping mode.\n        /// </summary>\n        [Browsable(false)]\n        public Enum Grouping\n        {\n            get { return m_grouping; }\n            set\n            {\n                m_grouping = (MarketOrderGrouping)value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets which \"Issued for\" orders to display.\n        /// </summary>\n        internal IssuedFor ShowIssuedFor\n        {\n            get { return m_showIssuedFor; }\n            set\n            {\n                m_showIssuedFor = value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets true when character has active issued order for corporation.\n        /// </summary>\n        private bool HasActiveCorporationIssuedOrders\n            => m_list.Any(x => (x.State == OrderState.Active || x.State == OrderState.Modified)\n                               && x.IssuedFor == IssuedFor.Corporation);\n\n        /// <summary>\n        /// Gets or sets the enumeration of orders to display.\n        /// </summary>\n        internal IEnumerable<MarketOrder> Orders\n        {\n            get { return m_list; }\n            set\n            {\n                m_list.Clear();\n                if (value == null)\n                    return;\n                m_list.AddRange(value);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the settings used for columns.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        public IEnumerable<IColumnSettings> Columns\n        {\n            get\n            {\n                // Add the visible columns; matching the display order\n                List<MarketOrderColumnSettings> newColumns = new List<MarketOrderColumnSettings>();\n                foreach (ColumnHeader header in lvOrders.Columns.Cast<ColumnHeader>().OrderBy(x => x.DisplayIndex))\n                {\n                    MarketOrderColumnSettings columnSetting = m_columns.First(x => x.Column == (MarketOrderColumn)header.Tag);\n                    if (columnSetting.Width > -1)\n                        columnSetting.Width = header.Width;\n                    newColumns.Add(columnSetting);\n                }\n\n                // Then add the other columns\n                newColumns.AddRange(m_columns.Where(x => !x.Visible));\n\n                return newColumns;\n            }\n            set\n            {\n                m_columns.Clear();\n                if (value != null)\n                    m_columns.AddRange(value.Cast<MarketOrderColumnSettings>());\n\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        #endregion\n\n\n        # region Inherited Events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            m_tooltip = new InfiniteDisplayToolTip(lvOrders);\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.MarketOrdersUpdated += EveMonClient_MarketOrdersUpdated;\n            EveMonClient.ConquerableStationListUpdated += EveMonClient_ConquerableStationListUpdated;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            m_tooltip.Dispose();\n\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.MarketOrdersUpdated -= EveMonClient_MarketOrdersUpdated;\n            EveMonClient.ConquerableStationListUpdated -= EveMonClient_ConquerableStationListUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (DesignMode || this.IsDesignModeHosted() || Character == null || !Visible)\n                return;\n\n            // Prevents the properties to call UpdateColumns() till we set all properties\n            m_init = false;\n\n            lvOrders.Visible = false;\n            marketExpPanelControl.Visible = false;\n\n            Orders = Character?.MarketOrders;\n            Columns = Settings.UI.MainWindow.MarketOrders.Columns;\n            Grouping = Character?.UISettings.OrdersGroupBy;\n            TextFilter = string.Empty;\n\n            UpdateColumns();\n\n            m_init = true;\n\n            UpdateListVisibility();\n        }\n\n        # endregion\n\n\n        #region Updates Main Market Window\n\n        /// <summary>\n        /// Autoresizes the columns.\n        /// </summary>\n        public void AutoResizeColumns()\n        {\n            m_columns.ForEach(column =>\n            {\n                if (column.Visible)\n                    column.Width = -2;\n            });\n\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// Updates the columns.\n        /// </summary>\n        internal void UpdateColumns()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            lvOrders.BeginUpdate();\n            m_isUpdatingColumns = true;\n\n            try\n            {\n                lvOrders.Columns.Clear();\n                lvOrders.Groups.Clear();\n                lvOrders.Items.Clear();\n\n                foreach (MarketOrderColumnSettings column in m_columns.Where(x => x.Visible))\n                {\n                    ColumnHeader header = lvOrders.Columns.Add(column.Column.GetHeader(), column.Width);\n                    header.Tag = column.Column;\n\n                    switch (column.Column)\n                    {\n                        case MarketOrderColumn.Issued:\n                        case MarketOrderColumn.LastStateChange:\n                        case MarketOrderColumn.InitialVolume:\n                        case MarketOrderColumn.RemainingVolume:\n                        case MarketOrderColumn.TotalPrice:\n                        case MarketOrderColumn.Escrow:\n                        case MarketOrderColumn.Duration:\n                        case MarketOrderColumn.UnitaryPrice:\n                            header.TextAlign = HorizontalAlignment.Right;\n                            break;\n                        case MarketOrderColumn.Volume:\n                            header.TextAlign = HorizontalAlignment.Center;\n                            break;\n                    }\n                }\n\n                // We update the content\n                UpdateContent();\n            }\n            finally\n            {\n                lvOrders.EndUpdate();\n                m_isUpdatingColumns = false;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            int scrollBarPosition = lvOrders.GetVerticalScrollBarPosition();\n\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = lvOrders.SelectedItems.Count > 0\n                ? lvOrders.SelectedItems[0].Tag.GetHashCode()\n                : 0;\n\n            lvOrders.BeginUpdate();\n            try\n            {\n                IEnumerable<MarketOrder> orders = m_list.Where(x => x.Item != null &&\n                    x.Station != null).Where(x => IsTextMatching(x, m_textFilter));\n\n                if (Character != null && Settings.UI.MainWindow.MarketOrders.HideInactiveOrders)\n                    orders = orders.Where(x => x.IsAvailable);\n\n                if (m_showIssuedFor != IssuedFor.All)\n                    orders = orders.Where(x => x.IssuedFor == m_showIssuedFor);\n\n                UpdateSort();\n\n                UpdateContentByGroup(orders);\n\n                // Restore the selected item (if any)\n                if (selectedItem > 0)\n                {\n                    foreach (ListViewItem lvItem in lvOrders.Items.Cast<ListViewItem>().Where(\n                        lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                    {\n                        lvItem.Selected = true;\n                    }\n                }\n\n                // Adjust the size of the columns\n                AdjustColumns();\n\n                // Update the expandable panel info\n                UpdateExpPanelContent();\n\n                UpdateListVisibility();\n            }\n            finally\n            {\n                lvOrders.EndUpdate();\n                lvOrders.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Updates the list visibility.\n        /// </summary>\n        private void UpdateListVisibility()\n        {\n            // Display or hide the \"no orders\" label\n            if (!m_init)\n                return;\n\n            noOrdersLabel.Visible = lvOrders.Items.Count == 0;\n            marketExpPanelControl.Header.Visible = true;\n            marketExpPanelControl.Visible = true;\n            lvOrders.Visible = !noOrdersLabel.Visible;\n        }\n\n        /// <summary>\n        /// Updates the content by group.\n        /// </summary>\n        /// <param name=\"orders\">The orders.</param>\n        private void UpdateContentByGroup(IEnumerable<MarketOrder> orders)\n        {\n            switch (m_grouping)\n            {\n                case MarketOrderGrouping.State:\n                    IOrderedEnumerable<IGrouping<OrderState, MarketOrder>> groups0 =\n                        orders.GroupBy(x => x.State).OrderBy(x => (int)x.Key);\n                    UpdateContent(groups0);\n                    break;\n                case MarketOrderGrouping.StateDesc:\n                    IOrderedEnumerable<IGrouping<OrderState, MarketOrder>> groups1 =\n                        orders.GroupBy(x => x.State).OrderByDescending(x => (int)x.Key);\n                    UpdateContent(groups1);\n                    break;\n                case MarketOrderGrouping.Issued:\n                    IOrderedEnumerable<IGrouping<DateTime, MarketOrder>> groups2 =\n                        orders.GroupBy(x => x.Issued.ToLocalTime().Date).OrderBy(x => x.Key);\n                    UpdateContent(groups2);\n                    break;\n                case MarketOrderGrouping.IssuedDesc:\n                    IOrderedEnumerable<IGrouping<DateTime, MarketOrder>> groups3 =\n                        orders.GroupBy(x => x.Issued.ToLocalTime().Date).OrderByDescending(x => x.Key);\n                    UpdateContent(groups3);\n                    break;\n                case MarketOrderGrouping.ItemType:\n                    IOrderedEnumerable<IGrouping<MarketGroup, MarketOrder>> groups4 =\n                        orders.GroupBy(x => x.Item.MarketGroup).OrderBy(x => x.Key.Name);\n                    UpdateContent(groups4);\n                    break;\n                case MarketOrderGrouping.ItemTypeDesc:\n                    IOrderedEnumerable<IGrouping<MarketGroup, MarketOrder>> groups5 =\n                        orders.GroupBy(x => x.Item.MarketGroup).OrderByDescending(x => x.Key.Name);\n                    UpdateContent(groups5);\n                    break;\n                case MarketOrderGrouping.Location:\n                    IOrderedEnumerable<IGrouping<Station, MarketOrder>> groups6 =\n                        orders.GroupBy(x => x.Station).OrderBy(x => x.Key.Name);\n                    UpdateContent(groups6);\n                    break;\n                case MarketOrderGrouping.LocationDesc:\n                    IOrderedEnumerable<IGrouping<Station, MarketOrder>> groups7 =\n                        orders.GroupBy(x => x.Station).OrderByDescending(x => x.Key.Name);\n                    UpdateContent(groups7);\n                    break;\n                case MarketOrderGrouping.OrderType:\n                    IOrderedEnumerable<IGrouping<string, MarketOrder>> groups8 =\n                        orders.GroupBy(x => x is BuyOrder ? \"Buying Orders\" : \"Selling Orders\").OrderBy(x => x.Key);\n                    UpdateContent(groups8);\n                    break;\n                case MarketOrderGrouping.OrderTypeDesc:\n                    IOrderedEnumerable<IGrouping<string, MarketOrder>> groups9 =\n                        orders.GroupBy(x => x is BuyOrder ? \"Buying Orders\" : \"Selling Orders\").OrderByDescending(x => x.Key);\n                    UpdateContent(groups9);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        /// <typeparam name=\"TKey\"></typeparam>\n        /// <param name=\"groups\"></param>\n        private void UpdateContent<TKey>(IEnumerable<IGrouping<TKey, MarketOrder>> groups)\n        {\n            lvOrders.Items.Clear();\n            lvOrders.Groups.Clear();\n\n            // Add the groups\n            foreach (IGrouping<TKey, MarketOrder> group in groups)\n            {\n                string groupText;\n                if (group.Key is OrderState)\n                    groupText = ((OrderState)(object)group.Key).GetHeader();\n                else if (group.Key is DateTime)\n                    groupText = ((DateTime)(object)group.Key).ToShortDateString();\n                else\n                    groupText = group.Key.ToString();\n\n                ListViewGroup listGroup = new ListViewGroup(groupText);\n                lvOrders.Groups.Add(listGroup);\n\n                // Add the items in every group\n                lvOrders.Items.AddRange(\n                    group.Select(order => new\n                    {\n                        order,\n                        item = new ListViewItem(order.Item.Name, listGroup)\n                        {\n                            UseItemStyleForSubItems = false,\n                            Tag = order\n                        }\n\n                    }).Select(x => CreateSubItems(x.order, x.item)).ToArray());\n            }\n        }\n\n        /// <summary>\n        /// Creates the list view sub items.\n        /// </summary>\n        /// <param name=\"order\">The order.</param>\n        /// <param name=\"item\">The item.</param>\n        private ListViewItem CreateSubItems(MarketOrder order, ListViewItem item)\n        {\n            // Display text as dimmed if the order is no longer available\n            if (!order.IsAvailable)\n                item.ForeColor = SystemColors.GrayText;\n\n            // Display text highlighted if the order is modified\n            if (order.State == OrderState.Modified)\n                item.ForeColor = SystemColors.HotTrack;\n\n            // Add enough subitems to match the number of columns\n            while (item.SubItems.Count < lvOrders.Columns.Count + 1)\n            {\n                item.SubItems.Add(string.Empty);\n            }\n\n            // Creates the subitems\n            for (int i = 0; i < lvOrders.Columns.Count; i++)\n            {\n                SetColumn(order, item.SubItems[i], (MarketOrderColumn)lvOrders.Columns[i].Tag);\n            }\n\n            // Tooltip\n            StringBuilder builder = new StringBuilder();\n            builder\n                .Append($\"Issued For: {order.IssuedFor}\")\n                .AppendLine()\n                .Append($\"Issued: {order.Issued.ToLocalTime()}\")\n                .AppendLine()\n                .Append($\"Duration: {order.Duration} Day{(order.Duration.S())}\")\n                .AppendLine()\n                .Append($\"Solar System: {order.Station.SolarSystem?.FullLocation ?? EveMonConstants.UnknownText}\")\n                .AppendLine()\n                .Append($\"Station: {order.Station.Name}\")\n                .AppendLine();\n\n            item.ToolTipText = builder.ToString();\n\n            return item;\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvOrders.Columns)\n            {\n                if (m_columns[column.Index].Width == -1)\n                    m_columns[column.Index].Width = -2;\n\n                column.Width = m_columns[column.Index].Width;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column and not set to auto-resize\n                if (column.Index != lvOrders.Columns.Count - 1 || m_columns[column.Index].Width != -2)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvOrders.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvOrders.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        /// <summary>\n        /// Updates the item sorter.\n        /// </summary>\n        private void UpdateSort()\n        {\n            lvOrders.ListViewItemSorter = new ListViewItemComparerByTag<MarketOrder>(\n                new MarketOrderComparer(m_sortCriteria, m_sortAscending));\n\n            UpdateSortVisualFeedback();\n        }\n\n        /// <summary>\n        /// Updates the sort feedback (the arrow on the header).\n        /// </summary>\n        private void UpdateSortVisualFeedback()\n        {\n            foreach (ColumnHeader columnHeader in lvOrders.Columns.Cast<ColumnHeader>())\n            {\n                MarketOrderColumn column = (MarketOrderColumn)columnHeader.Tag;\n                if (m_sortCriteria == column)\n                    columnHeader.ImageIndex = m_sortAscending ? 0 : 1;\n                else\n                    columnHeader.ImageIndex = 2;\n            }\n        }\n\n        /// <summary>\n        /// Formats the price according to the settings.\n        /// </summary>\n        /// <param name=\"price\">The price to display.</param>\n        /// <returns>The price as a string.</returns>\n        private static string FormatPrice(decimal price)\n        {\n            return FormatHelper.FormatIf(Settings.UI.MainWindow.MarketOrders.NumberAbsFormat,\n                2, price, AbbreviationFormat.AbbreviationSymbols);\n        }\n\n        /// <summary>\n        /// Formats the quantity according to the settings.\n        /// </summary>\n        /// <param name=\"price\">The quantity to display.</param>\n        /// <returns>The quantity as a string.</returns>\n        private static string FormatQuantity(long qty)\n        {\n            return FormatHelper.FormatIf(Settings.UI.MainWindow.MarketOrders.NumberAbsFormat,\n                qty, AbbreviationFormat.AbbreviationSymbols);\n        }\n\n        /// <summary>\n        /// Updates the listview sub-item.\n        /// </summary>\n        /// <param name=\"order\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"column\"></param>\n        private static void SetColumn(MarketOrder order, ListViewItem.ListViewSubItem item, MarketOrderColumn column)\n        {\n            BuyOrder buyOrder = order as BuyOrder;\n\n            switch (column)\n            {\n            case MarketOrderColumn.Duration:\n                item.Text = $\"{order.Duration} Day{(order.Duration.S())}\";\n                break;\n            case MarketOrderColumn.Expiration:\n                ListViewItemFormat format = FormatExpiration(order);\n                item.Text = format.Text;\n                item.ForeColor = format.TextColor;\n                break;\n            case MarketOrderColumn.InitialVolume:\n                item.Text = FormatQuantity(order.InitialVolume);\n                break;\n            case MarketOrderColumn.Issued:\n                item.Text = order.Issued.ToLocalTime().ToShortDateString();\n                break;\n            case MarketOrderColumn.IssuedFor:\n                item.Text = order.IssuedFor.ToString();\n                break;\n            case MarketOrderColumn.Item:\n                item.Text = order.Item.ToString();\n                break;\n            case MarketOrderColumn.ItemType:\n                item.Text = order.Item.MarketGroup.Name;\n                break;\n            case MarketOrderColumn.Location:\n                item.Text = order.Station.FullLocation;\n                break;\n            case MarketOrderColumn.MinimumVolume:\n                item.Text = FormatQuantity(order.MinVolume);\n                break;\n            case MarketOrderColumn.Region:\n                item.Text = order.Station.SolarSystemChecked.Constellation.Region.Name;\n                break;\n            case MarketOrderColumn.RemainingVolume:\n                item.Text = FormatQuantity(order.RemainingVolume);\n                break;\n            case MarketOrderColumn.SolarSystem:\n                item.Text = order.Station.SolarSystem?.Name ?? EveMonConstants.UnknownText;\n                item.ForeColor = order.Station.SolarSystemChecked.SecurityLevelColor;\n                break;\n            case MarketOrderColumn.Station:\n                item.Text = order.Station.Name;\n                break;\n            case MarketOrderColumn.TotalPrice:\n                item.Text = FormatPrice(order.TotalPrice);\n                item.ForeColor = buyOrder != null ? Color.DarkRed : Color.DarkGreen;\n                break;\n            case MarketOrderColumn.UnitaryPrice:\n                item.Text = FormatPrice(order.UnitaryPrice);\n                item.ForeColor = buyOrder != null ? Color.DarkRed : Color.DarkGreen;\n                break;\n            case MarketOrderColumn.Volume:\n                string remainingVolumeText = FormatQuantity(order.RemainingVolume);\n                string initialVolumeText = FormatQuantity(order.InitialVolume);\n                item.Text = $\"{remainingVolumeText} / {initialVolumeText}\";\n                break;\n            case MarketOrderColumn.LastStateChange:\n                item.Text = order.LastStateChange.ToLocalTime().ToShortDateString();\n                break;\n            case MarketOrderColumn.OrderRange:\n                if (buyOrder != null)\n                    item.Text = buyOrder.RangeDescription;\n                break;\n            case MarketOrderColumn.Escrow:\n                if (buyOrder != null)\n                {\n                    item.Text = FormatPrice(buyOrder.Escrow);\n                    item.ForeColor = Color.DarkBlue;\n                }\n                break;\n            default:\n                throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Checks the given text matches the item.\n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"text\"></param>\n        /// <returns></returns>\n        private static bool IsTextMatching(MarketOrder x, string text)\n            => string.IsNullOrEmpty(text) ||\n               x.Item.Name.Contains(text, ignoreCase: true) ||\n               x.Item.Description.Contains(text, ignoreCase: true) ||\n               x.Station.Name.Contains(text, ignoreCase: true) ||\n               x.Station.SolarSystemChecked.Name.Contains(text, ignoreCase: true) ||\n               x.Station.SolarSystemChecked.Constellation.Name.Contains(text, ignoreCase: true) ||\n               x.Station.SolarSystemChecked.Constellation.Region.Name.Contains(text, ignoreCase: true);\n\n        /// <summary>\n        /// Gets the text and formatting for the expiration cell\n        /// </summary>\n        /// <param name=\"order\">Order to generate a format for</param>\n        /// <returns>ListViewItemFormat object describing the format of the cell</returns>\n        private static ListViewItemFormat FormatExpiration(MarketOrder order)\n        {\n            // Initialize to sensible defaults\n            ListViewItemFormat format = new ListViewItemFormat\n            {\n                TextColor = Color.Black,\n                Text = order.Expiration.ToRemainingTimeShortDescription(DateTimeKind.Utc)\n                    .ToUpper(CultureConstants.DefaultCulture)\n            };\n\n            // Order is expiring soon\n            if (order.IsAvailable && order.Expiration < DateTime.UtcNow.AddDays(1))\n                format.TextColor = Color.DarkOrange;\n\n            // We have all the information for formatting an available order\n            if (order.IsAvailable)\n                return format;\n\n            // Order isn't available so lets format it as such\n            format.Text = order.State.ToString();\n\n            if (order.State == OrderState.Expired)\n                format.TextColor = Color.Red;\n\n            if (order.State == OrderState.Fulfilled)\n                format.TextColor = Color.DarkGreen;\n\n            return format;\n        }\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Exports item info to CSV format.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(lvOrders);\n        }\n\n        /// <summary>\n        /// On column reorder we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnReordered(object sender, ColumnReorderedEventArgs e)\n        {\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user manually resizes a column, we make sure to update the column preferences.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)\n        {\n            if (m_isUpdatingColumns || m_columns.Count <= e.ColumnIndex)\n                return;\n\n            if (m_columns[e.ColumnIndex].Width == lvOrders.Columns[e.ColumnIndex].Width)\n                return;\n\n            m_columns[e.ColumnIndex].Width = lvOrders.Columns[e.ColumnIndex].Width;\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user clicks a column header, we update the sorting.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            MarketOrderColumn column = (MarketOrderColumn)lvOrders.Columns[e.Column].Tag;\n            if (m_sortCriteria == column)\n                m_sortAscending = !m_sortAscending;\n            else\n            {\n                m_sortCriteria = column;\n                m_sortAscending = true;\n            }\n\n            m_isUpdatingColumns = true;\n\n            // Updates the item sorter\n            UpdateSort();\n\n            m_isUpdatingColumns = false;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lvOrders.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we show the item's tooltip if over an item.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvOrders.Cursor = CustomCursors.ContextMenu;\n\n            ListViewItem item = lvOrders.GetItemAt(e.Location.X, e.Location.Y);\n            if (item == null)\n            {\n                m_tooltip.Hide();\n                return;\n            }\n\n            m_tooltip.Show(item.ToolTipText, e.Location);\n        }\n\n        /// <summary>\n        /// When the mouse leaves the list, we hide the item's tooltip.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseLeave(object sender, EventArgs e)\n        {\n            m_tooltip.Hide();\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the contextMenu control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CancelEventArgs\"/> instance containing the event data.</param>\n        private void contextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            bool visible = lvOrders.SelectedItems.Count != 0;\n\n            showInBrowserMenuItem.Visible =\n                showInBrowserMenuSeparator.Visible = visible;\n\n            if (!visible)\n                return;\n\n            MarketOrder order = lvOrders.SelectedItems[0]?.Tag as MarketOrder;\n\n            if (order?.Item == null)\n                return;\n\n            Blueprint blueprint = StaticBlueprints.GetBlueprintByID(order.Item.ID);\n            Ship ship = order.Item as Ship;\n            Skill skill = Character.Skills[order.Item.ID];\n\n            if (skill == Skill.UnknownSkill)\n                skill = null;\n\n            string text = ship != null ? \"Ship\" : blueprint != null ? \"Blueprint\" : skill != null ? \"Skill\" : \"Item\";\n\n            showInBrowserMenuItem.Text = $\"Show In {text} Browser...\";\n        }\n\n        /// <summary>\n        /// Handles the Click event of the showInBrowserMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void showInBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            MarketOrder order = lvOrders.SelectedItems[0]?.Tag as MarketOrder;\n\n            if (order?.Item == null)\n                return;\n\n            Ship ship = order.Item as Ship;\n            Blueprint blueprint = StaticBlueprints.GetBlueprintByID(order.Item.ID);\n            Skill skill = Character.Skills[order.Item.ID];\n\n            if (skill == Skill.UnknownSkill)\n                skill = null;\n\n            PlanWindow planWindow = PlanWindow.ShowPlanWindow(Character);\n\n            if (ship != null)\n                planWindow.ShowShipInBrowser(ship);\n            else if (blueprint != null)\n                planWindow.ShowBlueprintInBrowser(blueprint);\n            else if (skill != null)\n                planWindow.ShowSkillInBrowser(skill);\n            else\n                planWindow.ShowItemInBrowser(order.Item);\n        }\n\n        # endregion\n\n\n        #region Global Event Handlers\n\n        /// <summary>\n        /// On timer tick, we update the column settings if any changes have been made to them.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Visible || !m_columnsChanged)\n                return;\n\n            Settings.UI.MainWindow.MarketOrders.Columns.Clear();\n            Settings.UI.MainWindow.MarketOrders.Columns.AddRange(Columns.Cast<MarketOrderColumnSettings>());\n\n            // Recreate the columns\n            Columns = Settings.UI.MainWindow.MarketOrders.Columns;\n            m_columnsChanged = false;\n        }\n\n        /// <summary>\n        /// When the market orders are updated,\n        /// update the list and the expandable panel info.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_MarketOrdersUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (Character == null || e.Character != Character)\n                return;\n\n            Orders = Character.MarketOrders;\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// When Conquerable Station List updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_ConquerableStationListUpdated(object sender, EventArgs e)\n        {\n            if (Character == null)\n                return;\n\n            foreach (MarketOrder order in m_list)\n            {\n                order.UpdateStation();\n            }\n\n            UpdateColumns();\n        }\n\n        # endregion\n\n\n        #region Updates Expandable Panel On Global Events\n\n        /// <summary>\n        /// Updates the content of the expandable panel.\n        /// </summary>\n        private void UpdateExpPanelContent()\n        {\n            if (Character == null)\n            {\n                marketExpPanelControl.Visible = false;\n                return;\n            }\n\n            // Calculate the related info for the panel\n            CalculatePanelInfo();\n\n            // Update the Header text of the panel\n            UpdateHeaderText();\n\n            // Update the info in the panel\n            UpdatePanelInfo();\n\n            // Force to redraw\n            marketExpPanelControl.Refresh();\n        }\n\n        /// <summary>\n        /// Updates the header text of the panel.\n        /// </summary>\n        private void UpdateHeaderText()\n        {\n            const int BaseOrders = 5;\n            long maxOrders = BaseOrders + m_skillBasedOrders;\n            int activeOrders = m_activeOrdersIssuedForCharacter + m_activeOrdersIssuedForCorporation;\n            long remainingOrders = maxOrders - activeOrders;\n            decimal activeSellOrdersTotal = m_sellOrdersIssuedForCharacterTotal + m_sellOrdersIssuedForCorporationTotal;\n            decimal activeBuyOrdersTotal = m_buyOrdersIssuedForCharacterTotal + m_buyOrdersIssuedForCorporationTotal;\n\n            string ordersRemainingText = $\"Orders Remaining: {remainingOrders} out of {maxOrders} max\";\n            string activeSellOrdersTotalText = $\"Sell Orders Total: {activeSellOrdersTotal:N} ISK\";\n            string activeBuyOrdersTotalText = $\"Buy Orders Total: {activeBuyOrdersTotal:N} ISK\";\n            marketExpPanelControl.HeaderText =\n                $\"{ordersRemainingText}{string.Empty,5}{activeSellOrdersTotalText}{string.Empty,5}{activeBuyOrdersTotalText}\";\n        }\n\n        /// <summary>\n        /// Updates the labels text in the panel.\n        /// </summary>\n        private void UpdatePanelInfo()\n        {\n            // Update the basic label text\n            m_lblTotalEscrow.Text =\n                $\"Total in Escrow: {m_issuedForCharacterTotalEscrow + m_issuedForCorporationTotalEscrow:N} ISK \" +\n                $\"(additional {m_issuedForCharacterEscrowAdditionalToCover + m_issuedForCorporationEscrowAdditionalToCover:N} ISK to cover)\";\n            m_lblBaseBrokerFee.Text = $\"Base Broker Fee: {m_baseBrokerFee:P2} of order value\";\n            m_lblTransactionTax.Text = $\"Transaction Tax: {m_transactionTax:P2} of sales value\";\n            m_lblActiveSellOrdersCount.Text =\n                $\"Active Sell Orders: {m_activeSellOrdersIssuedForCharacterCount + m_activeSellOrdersIssuedForCorporationCount}\";\n            m_lblActiveBuyOrdersCount.Text =\n                $\"Active Buy Orders: {m_activeBuyOrdersIssuedForCharacterCount + m_activeBuyOrdersIssuedForCorporationCount}\";\n            m_lblAskRange.Text = $\"Ask Range: limited to {StaticGeography.GetRange(m_askRange)}\";\n            m_lblBidRange.Text = $\"Bid Range: limited to {StaticGeography.GetRange(m_bidRange)}\";\n            m_lblModificationRange.Text = $\"Modification Range: limited to {StaticGeography.GetRange(m_modificationRange)}\";\n            m_lblRemoteBidRange.Text = Character.LastConfirmedSkillLevel(DBConstants.MarketingSkillID) > 0 ?\n                $\"Remote Bid Range: limited to {StaticGeography.GetRange(m_remoteBidRange)}\" :\n                string.Empty;\n\n            // Supplemental label text\n            if (HasActiveCorporationIssuedOrders)\n            {\n                m_lblCharTotalEscrow.Text = $\"Character Issued: {m_issuedForCharacterTotalEscrow:N} ISK \" +\n                                            $\"(additional {m_issuedForCharacterEscrowAdditionalToCover:N} ISK to cover)\";\n                m_lblCorpTotalEscrow.Text = $\"Corporation Issued: {m_issuedForCorporationTotalEscrow:N} ISK \" +\n                                            $\"(additional {m_issuedForCorporationEscrowAdditionalToCover:N} ISK to cover)\";\n                m_lblActiveCharSellOrdersCount.Text = $\"Character Issued: {m_activeSellOrdersIssuedForCharacterCount}\";\n                m_lblActiveCorpSellOrdersCount.Text = $\"Corporation Issued: {m_activeSellOrdersIssuedForCorporationCount}\";\n                m_lblActiveCharBuyOrdersCount.Text = $\"Character Issued: {m_activeBuyOrdersIssuedForCharacterCount}\";\n                m_lblActiveCorpBuyOrdersCount.Text = $\"Corporation Issued: {m_activeBuyOrdersIssuedForCorporationCount}\";\n                m_lblActiveCharSellOrdersTotal.Text = $\"Total: {m_sellOrdersIssuedForCharacterTotal:N} ISK\";\n                m_lblActiveCorpSellOrdersTotal.Text = $\"Total: {m_sellOrdersIssuedForCorporationTotal:N} ISK\";\n                m_lblActiveCharBuyOrdersTotal.Text = $\"Total: {m_buyOrdersIssuedForCharacterTotal:N} ISK\";\n                m_lblActiveCorpBuyOrdersTotal.Text = $\"Total: {m_buyOrdersIssuedForCorporationTotal:N} ISK\";\n            }\n\n            // Update label position\n            UpdatePanelControlPosition();\n        }\n\n        /// <summary>\n        /// Updates expandable panel controls positions.\n        /// </summary>\n        private void UpdatePanelControlPosition()\n        {\n            marketExpPanelControl.SuspendLayout();\n\n            const int Pad = 5;\n            int height = marketExpPanelControl.ExpandDirection == Direction.Up ? Pad : marketExpPanelControl.HeaderHeight;\n\n            m_lblTotalEscrow.Location = new Point(5, height);\n            height += m_lblTotalEscrow.Height;\n            if (HasActiveCorporationIssuedOrders)\n            {\n                m_lblCharTotalEscrow.Location = new Point(15, height);\n                m_lblCharTotalEscrow.Visible = true;\n                height += m_lblCharTotalEscrow.Height;\n\n                m_lblCorpTotalEscrow.Location = new Point(15, height);\n                m_lblCorpTotalEscrow.Visible = true;\n                height += m_lblCorpTotalEscrow.Height;\n            }\n            else\n            {\n                m_lblCharTotalEscrow.Visible = false;\n                m_lblCorpTotalEscrow.Visible = false;\n            }\n\n            height += Pad;\n\n            m_lblBaseBrokerFee.Location = new Point(5, height);\n            m_lblAskRange.Location = new Point(m_lblAskRange.Location.X, height);\n            height += m_lblBaseBrokerFee.Height;\n\n            m_lblTransactionTax.Location = new Point(5, height);\n            m_lblBidRange.Location = new Point(m_lblBidRange.Location.X, height);\n            height += m_lblTransactionTax.Height;\n\n            m_lblModificationRange.Location = new Point(m_lblModificationRange.Location.X, height);\n            height += m_lblModificationRange.Height;\n\n            m_lblActiveSellOrdersCount.Location = new Point(5, height);\n            m_lblRemoteBidRange.Location = new Point(m_lblRemoteBidRange.Location.X, height);\n            height += m_lblActiveSellOrdersCount.Height;\n\n            if (HasActiveCorporationIssuedOrders)\n            {\n                m_lblActiveCharSellOrdersCount.Location = new Point(15, height);\n                m_lblActiveCharSellOrdersTotal.Location = new Point(150, height);\n                m_lblActiveCharSellOrdersCount.Visible = true;\n                m_lblActiveCharSellOrdersTotal.Visible = true;\n                height += m_lblCharTotalEscrow.Height;\n\n                m_lblActiveCorpSellOrdersCount.Location = new Point(15, height);\n                m_lblActiveCorpSellOrdersTotal.Location = new Point(150, height);\n                m_lblActiveCorpSellOrdersCount.Visible = true;\n                m_lblActiveCorpSellOrdersTotal.Visible = true;\n                height += m_lblCorpTotalEscrow.Height + Pad;\n            }\n            else\n            {\n                m_lblActiveCharSellOrdersCount.Visible = false;\n                m_lblActiveCharSellOrdersTotal.Visible = false;\n                m_lblActiveCorpSellOrdersCount.Visible = false;\n                m_lblActiveCorpSellOrdersTotal.Visible = false;\n            }\n\n            m_lblActiveBuyOrdersCount.Location = new Point(5, height);\n            height += m_lblActiveBuyOrdersCount.Height;\n\n            if (HasActiveCorporationIssuedOrders)\n            {\n                m_lblActiveCharBuyOrdersCount.Location = new Point(15, height);\n                m_lblActiveCharBuyOrdersTotal.Location = new Point(150, height);\n                m_lblActiveCharBuyOrdersCount.Visible = true;\n                m_lblActiveCharBuyOrdersTotal.Visible = true;\n                height += m_lblCharTotalEscrow.Height;\n\n                m_lblActiveCorpBuyOrdersCount.Location = new Point(15, height);\n                m_lblActiveCorpBuyOrdersTotal.Location = new Point(150, height);\n                m_lblActiveCorpBuyOrdersCount.Visible = true;\n                m_lblActiveCorpBuyOrdersTotal.Visible = true;\n                height += m_lblCorpTotalEscrow.Height;\n            }\n            else\n            {\n                m_lblActiveCharBuyOrdersCount.Visible = false;\n                m_lblActiveCharBuyOrdersTotal.Visible = false;\n                m_lblActiveCorpBuyOrdersCount.Visible = false;\n                m_lblActiveCorpBuyOrdersTotal.Visible = false;\n            }\n\n            height += Pad;\n\n            // Update panel's expanded height\n            marketExpPanelControl.ExpandedHeight = height + (marketExpPanelControl.ExpandDirection == Direction.Up\n                                                                 ? marketExpPanelControl.HeaderHeight\n                                                                 : Pad);\n\n            marketExpPanelControl.ResumeLayout(false);\n        }\n\n        /// <summary>\n        /// Calculates the market orders related info for the panel.\n        /// </summary>\n        private void CalculatePanelInfo()\n        {\n            var charSellOrders = m_list.OfType<SellOrder>().Where(x => (x.State == OrderState.\n                Active || x.State == OrderState.Modified) && x.IssuedFor == IssuedFor.Character);\n            var corpSellOrders = m_list.OfType<SellOrder>().Where(x => (x.State == OrderState.\n                Active || x.State == OrderState.Modified) && x.IssuedFor == IssuedFor.Corporation);\n            var charBuyOrders = m_list.OfType<BuyOrder>().Where(x => (x.State == OrderState.\n                Active || x.State == OrderState.Modified) && x.IssuedFor == IssuedFor.Character);\n            var corpBuyOrders = m_list.OfType<BuyOrder>().Where(x => (x.State == OrderState.\n                Active || x.State == OrderState.Modified) && x.IssuedFor == IssuedFor.Corporation);\n\n            // Calculate character's max orders\n            m_skillBasedOrders = Character.LastConfirmedSkillLevel(DBConstants.TradeSkillID) *\n                4 + Character.LastConfirmedSkillLevel(DBConstants.RetailSkillID) * 8 +\n                Character.LastConfirmedSkillLevel(DBConstants.WholesaleSkillID) * 16 +\n                Character.LastConfirmedSkillLevel(DBConstants.TycoonSkillID) * 32;\n\n            // Calculate character's base broker fee\n            m_baseBrokerFee = EveConstants.BrokerFeeBase - Character.LastConfirmedSkillLevel(\n                DBConstants.BrokerRelationsSkillID) * 0.003f;\n\n            // Calculate character's transaction tax\n            m_transactionTax = EveConstants.TransactionTaxBase * (1.0f - Character.\n                LastConfirmedSkillLevel(DBConstants.AccountingSkillID) * 0.11f);\n\n            // Calculate character's ask range\n            m_askRange = Character.LastConfirmedSkillLevel(DBConstants.MarketingSkillID);\n\n            // Calculate character's bid range\n            m_bidRange = Character.LastConfirmedSkillLevel(DBConstants.ProcurementSkillID);\n\n            // Calculate character's modification range\n            m_modificationRange = Character.LastConfirmedSkillLevel(DBConstants.\n                DaytradingSkillID);\n\n            // Calculate character's remote bid range\n            m_remoteBidRange = Character.LastConfirmedSkillLevel(DBConstants.\n                VisibilitySkillID);\n\n            // Calculate active sell & buy orders total price (character & corporation issued separately)\n            m_sellOrdersIssuedForCharacterTotal = charSellOrders.Sum(x => x.TotalPrice);\n            m_sellOrdersIssuedForCorporationTotal = corpSellOrders.Sum(x => x.TotalPrice);\n            m_buyOrdersIssuedForCharacterTotal = charBuyOrders.Sum(x => x.TotalPrice);\n            m_buyOrdersIssuedForCorporationTotal = corpBuyOrders.Sum(x => x.TotalPrice);\n\n            // Calculate active sell & buy orders count (character & corporation issued separately)\n            m_activeSellOrdersIssuedForCharacterCount = charSellOrders.Count();\n            m_activeSellOrdersIssuedForCorporationCount = corpSellOrders.Count();\n            m_activeBuyOrdersIssuedForCharacterCount = charBuyOrders.Count();\n            m_activeBuyOrdersIssuedForCorporationCount = corpBuyOrders.Count();\n\n            // Calculate active orders (character & corporation issued separately)\n            m_activeOrdersIssuedForCharacter = m_activeSellOrdersIssuedForCharacterCount +\n                                               m_activeBuyOrdersIssuedForCharacterCount;\n            m_activeOrdersIssuedForCorporation = m_activeSellOrdersIssuedForCorporationCount +\n                                                 m_activeBuyOrdersIssuedForCorporationCount;\n\n            // Calculate total escrow (character & corporation issued separately)\n            m_issuedForCharacterTotalEscrow = charBuyOrders.Sum(x => x.Escrow);\n            m_issuedForCorporationTotalEscrow = corpBuyOrders.Sum(x => x.Escrow);\n\n            // Calculate escrow additional to cover (character & corporation issued separately)\n            m_issuedForCharacterEscrowAdditionalToCover = m_buyOrdersIssuedForCharacterTotal - m_issuedForCharacterTotalEscrow;\n            m_issuedForCorporationEscrowAdditionalToCover = m_buyOrdersIssuedForCorporationTotal -\n                                                            m_issuedForCorporationTotalEscrow;\n        }\n\n        # endregion\n\n\n        #region Initialize Expandable Panel Controls\n\n        // Basic labels constructor\n        private readonly Label m_lblTotalEscrow = new Label();\n        private readonly Label m_lblBaseBrokerFee = new Label();\n        private readonly Label m_lblTransactionTax = new Label();\n        private readonly Label m_lblActiveSellOrdersCount = new Label();\n        private readonly Label m_lblActiveBuyOrdersCount = new Label();\n        private readonly Label m_lblAskRange = new Label();\n        private readonly Label m_lblBidRange = new Label();\n        private readonly Label m_lblModificationRange = new Label();\n        private readonly Label m_lblRemoteBidRange = new Label();\n\n        // Supplemental labels constructor\n        private readonly Label m_lblCharTotalEscrow = new Label();\n        private readonly Label m_lblCorpTotalEscrow = new Label();\n\n        private readonly Label m_lblActiveCharSellOrdersTotal = new Label();\n        private readonly Label m_lblActiveCorpSellOrdersTotal = new Label();\n        private readonly Label m_lblActiveCharBuyOrdersTotal = new Label();\n        private readonly Label m_lblActiveCorpBuyOrdersTotal = new Label();\n        private readonly Label m_lblActiveCharSellOrdersCount = new Label();\n        private readonly Label m_lblActiveCorpSellOrdersCount = new Label();\n        private readonly Label m_lblActiveCharBuyOrdersCount = new Label();\n        private readonly Label m_lblActiveCorpBuyOrdersCount = new Label();\n\n        private void InitializeExpandablePanelControls()\n        {\n            marketExpPanelControl.SuspendLayout();\n\n            // Add basic labels to panel\n            marketExpPanelControl.Controls\n                .AddRange(new Control[]\n                {\n                    m_lblTotalEscrow,\n                    m_lblBaseBrokerFee,\n                    m_lblTransactionTax,\n                    m_lblActiveSellOrdersCount,\n                    m_lblActiveBuyOrdersCount,\n                    m_lblAskRange,\n                    m_lblBidRange,\n                    m_lblModificationRange,\n                    m_lblRemoteBidRange\n                });\n\n            // Add supplemental labels to panel\n            marketExpPanelControl.Controls\n                .AddRange(new Control[]\n                {\n                    m_lblCharTotalEscrow,\n                    m_lblCorpTotalEscrow,\n                    m_lblActiveCharSellOrdersTotal,\n                    m_lblActiveCorpSellOrdersTotal,\n                    m_lblActiveCharBuyOrdersTotal,\n                    m_lblActiveCorpBuyOrdersTotal,\n                    m_lblActiveCharSellOrdersCount,\n                    m_lblActiveCorpSellOrdersCount,\n                    m_lblActiveCharBuyOrdersCount,\n                    m_lblActiveCorpBuyOrdersCount\n                });\n\n            // Apply properties\n            foreach (Label label in marketExpPanelControl.Controls.OfType<Label>())\n            {\n                label.ForeColor = SystemColors.ControlText;\n                label.BackColor = Color.Transparent;\n                label.AutoSize = true;\n            }\n\n            // Special properties\n            m_lblAskRange.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            m_lblBidRange.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            m_lblModificationRange.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            m_lblRemoteBidRange.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            m_lblAskRange.Location = new Point(220, 0);\n            m_lblBidRange.Location = new Point(220, 0);\n            m_lblModificationRange.Location = new Point(220, 0);\n            m_lblRemoteBidRange.Location = new Point(220, 0);\n\n            // Subscribe events\n            foreach (Label label in marketExpPanelControl.Controls.OfType<Label>())\n            {\n                label.MouseClick += OnExpandablePanelMouseClick;\n            }\n\n            marketExpPanelControl.ResumeLayout(false);\n        }\n\n        /// <summary>\n        /// Called when the expandable panel gets mouse clicked.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void OnExpandablePanelMouseClick(object sender, MouseEventArgs e)\n        {\n            marketExpPanelControl.OnMouseClick(sender, e);\n        }\n\n        #endregion\n\n\n        #region Helper Classes\n\n        private class ListViewItemFormat\n        {\n            /// <summary>\n            /// Gets or sets the color of the text.\n            /// </summary>\n            /// <value>The color of the text.</value>\n            public Color TextColor { get; set; }\n\n            /// <summary>\n            /// Gets or sets the text.\n            /// </summary>\n            /// <value>The text.</value>\n            public string Text { get; set; }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMarketOrdersList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>103, 17</value>\n  </metadata>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        AAAAAk1TRnQBSQFMAgEBAwEAAUQBBQFEAQUBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABEAMAAQEBAAEQBgABCP8A/wD/AP8A/wD/AP8A/wAaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB\n        AQABAQUAAYAXAAP/AQAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAB8AEPAf4BfwL/AgAB+AEfAfwBPwL/\n        AgAB/AE/AfgBHwL/AgAB/gF/AfABDwL/AgAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAL\n</value>\n  </data>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"marketExpPanelControl.ImageCollapse\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABGdBTUEAALGPC/xhBQAAAHpJREFUKFOV\n        kcENgCAQBCnOKizFSrQPS/Lnh4eJL4GseOQ8lqCXDCHLDjxwMtOyxh5PNQ+CbffxCqEJzov4RRCKiEXC\n        YZxvdFFn/jhryZb0XqASkLIVQFMCTACVxG63GX1Jl6wAqASkbAVQJPZPTPj9wS9BBkGP3HQuAT/bEzE7\n        m9WyAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"marketExpPanelControl.ImageExpand\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABGdBTUEAALGPC/xhBQAAAHZJREFUKFON\n        kcENgCAQBCnOKizFSrQPS/Lnh4eJL4FccC/nsQQvGR7LDjwuYJZtzyPeah0JjjPmJ6Uucq9iT5jmtclU\n        lMNfigBsHq+bS7bMxEZiJZ/Rn4CXQVfC60ykki0zsZFYyWcqjRYLfi3Y8hEwEoyozRAKykETMSVvxo8A\n        AAAASUVORK5CYII=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMedalsList.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterMedalsList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.noMedalsLabel = new System.Windows.Forms.Label();\n            this.lbMedals = new EVEMon.Common.Controls.NoFlickerListBox();\n            this.ttToolTip = new System.Windows.Forms.ToolTip(this.components);\n            this.SuspendLayout();\n            // \n            // noMedalsLabel\n            // \n            this.noMedalsLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n            this.noMedalsLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noMedalsLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noMedalsLabel.Location = new System.Drawing.Point(0, 0);\n            this.noMedalsLabel.Name = \"noMedalsLabel\";\n            this.noMedalsLabel.Size = new System.Drawing.Size(372, 402);\n            this.noMedalsLabel.TabIndex = 2;\n            this.noMedalsLabel.Text = \"Medals information not available.\";\n            this.noMedalsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lbMedals\n            // \n            this.lbMedals.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lbMedals.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbMedals.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;\n            this.lbMedals.FormattingEnabled = true;\n            this.lbMedals.IntegralHeight = false;\n            this.lbMedals.ItemHeight = 15;\n            this.lbMedals.Location = new System.Drawing.Point(0, 0);\n            this.lbMedals.Margin = new System.Windows.Forms.Padding(0);\n            this.lbMedals.Name = \"lbMedals\";\n            this.lbMedals.Size = new System.Drawing.Size(372, 402);\n            this.lbMedals.TabIndex = 4;\n            this.lbMedals.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.lbMedals_DrawItem);\n            this.lbMedals.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.lbMedals_MeasureItem);\n            this.lbMedals.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbMedals_MouseDown);\n            this.lbMedals.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lbMedals_MouseMove);\n            this.lbMedals.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.lbMedals_MouseWheel);\n            // \n            // ttToolTip\n            // \n            this.ttToolTip.AutoPopDelay = 32000;\n            this.ttToolTip.InitialDelay = 500;\n            this.ttToolTip.IsBalloon = true;\n            this.ttToolTip.ReshowDelay = 100;\n            // \n            // CharacterMedalsList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.noMedalsLabel);\n            this.Controls.Add(this.lbMedals);\n            this.Name = \"CharacterMedalsList\";\n            this.Size = new System.Drawing.Size(372, 402);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noMedalsLabel;\n        private Common.Controls.NoFlickerListBox lbMedals;\n        private System.Windows.Forms.ToolTip ttToolTip;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMedalsList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.Properties;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterMedalsList : UserControl\n    {\n        #region Fields\n        \n        private const TextFormatFlags Format = TextFormatFlags.NoPadding | TextFormatFlags.NoClipping | TextFormatFlags.NoPrefix;\n\n        // Medals drawing - Region & text padding\n        private const int PadTop = 2;\n        private const int PadLeft = 6;\n        private const int PadRight = 7;\n\n        // Medals drawing - Medals\n        private const int MedalDetailHeight = 34;\n\n        // Medals drawing - Medals groups\n        private const int MedalGroupHeaderHeight = 21;\n        private const int CollapserPadRight = 4;\n\n        private readonly Font m_medalsFont;\n        private readonly Font m_medalsBoldFont;\n        private readonly List<string> m_collapsedGroups = new List<string>();\n        private readonly Image m_medalImage = Resources.Medal32;\n        \n        private object m_lastTooltipItem;\n\n        #endregion\n\n\n        #region Constructor\n\n        public CharacterMedalsList()\n        {\n            InitializeComponent();\n\n            lbMedals.Visible = false;\n\n            m_medalsFont = FontFactory.GetFont(\"Tahoma\", 8.25F);\n            m_medalsBoldFont = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            noMedalsLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        #endregion\n\n\n        #region Inherited events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.CharacterMedalsUpdated += EveMonClient_CharacterMedalsUpdated;\n            EveMonClient.CorporationMedalsUpdated += EveMonClient_CorporationMedalsUpdated;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterMedalsUpdated -= EveMonClient_CharacterMedalsUpdated;\n            EveMonClient.CorporationMedalsUpdated -= EveMonClient_CorporationMedalsUpdated;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (Visible)\n                UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Content Management\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            // When no character, we just hide the list\n            if (Character == null)\n            {\n                noMedalsLabel.Visible = true;\n                lbMedals.Visible = false;\n                return;\n            }\n\n            int scrollBarPosition = lbMedals.TopIndex;\n\n            // Update the medals list\n            lbMedals.BeginUpdate();\n            try\n            {\n                // Get the medals rewarded and try assign missing title and description from corp medals\n                // Also prevents multi rewarded medals from being iterated\n                IList<Medal> medals = Character.CharacterMedals.Distinct(new MedalComparer())\n                    .Where(medal => medal.TryAssignMissingTitleAndDescription()).ToList();\n\n                IEnumerable<IGrouping<MedalGroup, Medal>> groups = medals.GroupBy(x => x.Group);\n\n                // Scroll through groups\n                lbMedals.Items.Clear();\n                foreach (IGrouping<MedalGroup, Medal> group in groups)\n                {\n                    lbMedals.Items.Add(group.Key.GetDescription());\n\n                    // Add items in the group when it's not collapsed\n                    if (m_collapsedGroups.Contains(group.Key.GetDescription()))\n                        continue;\n\n                    // Prevents multi rewarded medals to be drawn\n                    foreach (Medal medal in group)\n                    {\n                        lbMedals.Items.Add(medal);\n                    }\n                }\n\n                // Display or hide the \"no medals\" label.\n                noMedalsLabel.Visible = !medals.Any();\n                lbMedals.Visible = medals.Any();\n\n                // Invalidate display\n                lbMedals.Invalidate();\n            }\n            finally\n            {\n                lbMedals.EndUpdate();\n                lbMedals.TopIndex = scrollBarPosition;\n            }\n        }\n\n        #endregion\n\n\n        #region Drawing\n\n        /// <summary>\n        /// Handles the DrawItem event of the lbMedals control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void lbMedals_DrawItem(object sender, DrawItemEventArgs e)\n        {\n            if (e.Index < 0 || e.Index >= lbMedals.Items.Count)\n                return;\n\n            object item = lbMedals.Items[e.Index];\n            Medal medal = item as Medal;\n            if (medal != null)\n                DrawItem(medal, e);\n            else\n                DrawItem((string)item, e);\n        }\n\n        /// <summary>\n        /// Handles the MeasureItem event of the lbMedals control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MeasureItemEventArgs\"/> instance containing the event data.</param>\n        private void lbMedals_MeasureItem(object sender, MeasureItemEventArgs e)\n        {\n            if (e.Index < 0)\n                return;\n            e.ItemHeight = GetItemHeight(lbMedals.Items[e.Index]);\n        }\n\n        /// <summary>\n        /// Gets the item's height.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        private int GetItemHeight(object item)\n        {\n            if (item is Medal)\n                return Math.Max(m_medalsFont.Height * 2 + PadTop * 2, MedalDetailHeight);\n\n            return MedalGroupHeaderHeight;\n        }\n\n        /// <summary>\n        /// Draws the list item for the given medal\n        /// </summary>\n        /// <param name=\"medal\"></param>\n        /// <param name=\"e\"></param>\n        private void DrawItem(Medal medal, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Draw background\n            g.FillRectangle(e.Index % 2 == 0 ? Brushes.White : Brushes.LightGray, e.Bounds);\n\n            // Texts\n            string medalTitleText = medal.Title;\n            string medalDescriptionText = medal.Description;\n            string medalStatusText = medal.Status.ToTitleCase();\n            string medalTimesAwardedText = $\"Number of times awarded: {medal.TimesAwarded:N0}\";\n\n            // Measure texts\n            Size medalTitleTextSize = TextRenderer.MeasureText(g, medalTitleText, m_medalsBoldFont, Size.Empty, Format);\n            Size medalDescriptionTextSize = TextRenderer.MeasureText(g, medalDescriptionText, m_medalsFont, Size.Empty, Format);\n            Size medalStatusTextSize = TextRenderer.MeasureText(g, medalStatusText, m_medalsBoldFont, Size.Empty, Format);\n            Size medalTimesAwardedTextSize = TextRenderer.MeasureText(g, medalTimesAwardedText, m_medalsFont, Size.Empty, Format);\n\n            // Draw texts\n            TextRenderer.DrawText(g, medalTitleText, m_medalsBoldFont,\n                                  new Rectangle(e.Bounds.Left + m_medalImage.Width + 4 + PadRight,\n                                                e.Bounds.Top + PadTop,\n                                                medalTitleTextSize.Width + PadLeft,\n                                                medalTitleTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, medalTimesAwardedText, m_medalsFont,\n                                  new Rectangle(e.Bounds.Left + m_medalImage.Width + 4 + PadRight * 3 + medalTitleTextSize.Width,\n                                                e.Bounds.Top + PadTop,\n                                                medalTimesAwardedTextSize.Width + PadLeft,\n                                                medalTimesAwardedTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, medalStatusText, m_medalsBoldFont,\n                                  new Rectangle(e.Bounds.Right - PadRight - medalStatusTextSize.Width,\n                                                e.Bounds.Top + PadTop,\n                                                medalStatusTextSize.Width + PadLeft,\n                                                medalStatusTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, medalDescriptionText, m_medalsFont,\n                                  new Rectangle(e.Bounds.Left + m_medalImage.Width + 4 + PadRight,\n                                                e.Bounds.Top + PadTop + medalTitleTextSize.Height,\n                                                medalDescriptionTextSize.Width + PadLeft,\n                                                medalDescriptionTextSize.Height), Color.Black);\n\n            // Draw images\n            if (Settings.UI.SafeForWork)\n                return;\n\n            // Draw the medal image\n            g.DrawImage(m_medalImage, new Rectangle(e.Bounds.Left + PadLeft / 2,\n                                             MedalDetailHeight / 2 - m_medalImage.Height / 2 + e.Bounds.Top,\n                                             m_medalImage.Width, m_medalImage.Height));\n        }\n\n        /// <summary>\n        /// Draws the list item for the given group.\n        /// </summary>\n        /// <param name=\"group\"></param>\n        /// <param name=\"e\"></param>\n        private void DrawItem(string group, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Draws the background\n            using (LinearGradientBrush lgb = new LinearGradientBrush(new PointF(0F, 0F), new PointF(0F, 21F),\n                                                                     Color.FromArgb(75, 75, 75), Color.FromArgb(25, 25, 25)))\n            {\n                g.FillRectangle(lgb, e.Bounds);\n            }\n\n            using (Pen p = new Pen(Color.FromArgb(100, 100, 100)))\n            {\n                g.DrawLine(p, e.Bounds.Left, e.Bounds.Top, e.Bounds.Right + 1, e.Bounds.Top);\n            }\n\n            // Setting character spacing\n            NativeMethods.SetTextCharacterSpacing(g, 4);\n\n            // Measure texts\n            Size standingGroupTextSize = TextRenderer.MeasureText(g, group.ToUpper(CultureConstants.DefaultCulture),\n                                                                  m_medalsBoldFont, Size.Empty, Format);\n            Rectangle standingGroupTextRect = new Rectangle(e.Bounds.Left + PadLeft,\n                                                            e.Bounds.Top +\n                                                            (e.Bounds.Height / 2 - standingGroupTextSize.Height / 2),\n                                                            standingGroupTextSize.Width + PadRight,\n                                                            standingGroupTextSize.Height);\n\n            // Draws the text header\n            TextRenderer.DrawText(g, group.ToUpper(CultureConstants.DefaultCulture), m_medalsBoldFont, standingGroupTextRect,\n                                  Color.White, Color.Transparent, Format);\n\n            // Draws the collapsing arrows\n            bool isCollapsed = m_collapsedGroups.Contains(group);\n            Image img = isCollapsed ? Resources.Expand : Resources.Collapse;\n\n            g.DrawImageUnscaled(img, new Rectangle(e.Bounds.Right - img.Width - CollapserPadRight,\n                                                   MedalGroupHeaderHeight / 2 - img.Height / 2 + e.Bounds.Top,\n                                                   img.Width, img.Height));\n        }\n\n        /// <summary>\n        /// Gets the preferred size from the preferred size of the list.\n        /// </summary>\n        /// <param name=\"proposedSize\"></param>\n        /// <returns></returns>\n        public override Size GetPreferredSize(Size proposedSize) => lbMedals.GetPreferredSize(proposedSize);\n\n        #endregion\n\n\n        #region Local events\n\n        /// <summary>\n        /// Handles the MouseWheel event of the lbMedals control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbMedals_MouseWheel(object sender, MouseEventArgs e)\n        {\n            if (e.Delta == 0)\n                return;\n\n            // Update the drawing based upon the mouse wheel scrolling\n            int numberOfItemLinesToMove = e.Delta * SystemInformation.MouseWheelScrollLines / Math.Abs(e.Delta);\n            int lines = numberOfItemLinesToMove;\n            if (lines == 0)\n                return;\n\n            // Compute the number of lines to move\n            int direction = lines / Math.Abs(lines);\n            int[] numberOfPixelsToMove = new int[lines * direction];\n            for (int i = 1; i <= Math.Abs(lines); i++)\n            {\n                object item = null;\n\n                // Going up\n                if (direction == Math.Abs(direction))\n                {\n                    // Retrieve the next top item\n                    if (lbMedals.TopIndex - i >= 0)\n                        item = lbMedals.Items[lbMedals.TopIndex - i];\n                }\n                // Going down\n                else\n                {\n                    // Compute the height of the items from current the topindex (included)\n                    int height = 0;\n                    for (int j = lbMedals.TopIndex + i - 1; j < lbMedals.Items.Count; j++)\n                    {\n                        height += GetItemHeight(lbMedals.Items[j]);\n                    }\n\n                    // Retrieve the next bottom item\n                    if (height > lbMedals.ClientSize.Height)\n                        item = lbMedals.Items[lbMedals.TopIndex + i - 1];\n                }\n\n                // If found a new item as top or bottom\n                if (item != null)\n                    numberOfPixelsToMove[i - 1] = GetItemHeight(item) * direction;\n                else\n                    lines -= direction;\n            }\n\n            // Scroll \n            if (lines != 0)\n                lbMedals.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the lbMedals control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbMedals_MouseDown(object sender, MouseEventArgs e)\n        {\n            int index = lbMedals.IndexFromPoint(e.Location);\n            if (index < 0 || index >= lbMedals.Items.Count)\n                return;\n\n            Rectangle itemRect;\n\n            // Beware, this last index may actually means a click in the whitespace at the bottom\n            // Let's deal with this special case\n            if (index == lbMedals.Items.Count - 1)\n            {\n                itemRect = lbMedals.GetItemRectangle(index);\n                if (!itemRect.Contains(e.Location))\n                    return;\n            }\n\n            // For a medals group, we have to handle the collapse/expand mechanism\n            object item = lbMedals.Items[index];\n            string standingsGroup = item as string;\n            if (standingsGroup == null)\n                return;\n\n            // Left button : expand/collapse\n            if (e.Button != MouseButtons.Right)\n            {\n                ToggleGroupExpandCollapse(standingsGroup);\n                return;\n            }\n\n            // If right click on the button, still expand/collapse\n            itemRect = lbMedals.GetItemRectangle(lbMedals.Items.IndexOf(item));\n            Rectangle buttonRect = GetButtonRectangle(standingsGroup, itemRect);\n            if (buttonRect.Contains(e.Location))\n                ToggleGroupExpandCollapse(standingsGroup);\n        }\n\n        /// <summary>\n        /// On mouse move, we show the tooltip.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbMedals_MouseMove(object sender, MouseEventArgs e)\n        {\n            for (int i = 0; i < lbMedals.Items.Count; i++)\n            {\n                // Skip until we found the mouse location\n                Rectangle rect = lbMedals.GetItemRectangle(i);\n                if (!rect.Contains(e.Location))\n                    continue;\n\n                Medal item = lbMedals.Items[i] as Medal;\n\n                // Updates the tooltip\n                if (item == null)\n                    continue;\n\n                DisplayTooltip(item);\n                return;\n            }\n\n            // If we went so far, we're not over anything\n            m_lastTooltipItem = null;\n            ttToolTip.Active = false;\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Displays the tooltip for the given item (medal).\n        /// </summary>\n        /// <param name=\"item\"></param>\n        private void DisplayTooltip(Medal item)\n        {\n            if (ttToolTip.Active && m_lastTooltipItem != null && m_lastTooltipItem == item)\n                return;\n\n            m_lastTooltipItem = item;\n\n            ttToolTip.Active = false;\n            ttToolTip.SetToolTip(lbMedals, GetTooltipText(item));\n            ttToolTip.Active = true;\n        }\n\n        /// <summary>\n        /// Gets the tooltip text.\n        /// </summary>\n        /// <param name=\"item\">The item.</param>\n        /// <returns></returns>\n        private static string GetTooltipText(Medal item)\n        {\n            StringBuilder toolTip = new StringBuilder();\n            toolTip\n                .Append($\"Issuer: {item.Issuer}\")\n                .AppendLine()\n                .Append($\"Issued: {item.Issued.ToLocalTime()}\")\n                .AppendLine();\n\n            if (item.Group == MedalGroup.OtherCorporation)\n            {\n                toolTip\n                    .Append($\"Corporation: {item.CorporationName}\")\n                    .AppendLine();\n            }\n\n            toolTip.Append($\"Reason: {item.Reason.WordWrap(50)}\");\n\n            return toolTip.ToString();\n        }\n\n        /// <summary>\n        /// Toggles the expansion or collapsing of a single group\n        /// </summary>\n        /// <param name=\"group\">The group to expand or collapse.</param>\n        private void ToggleGroupExpandCollapse(string group)\n        {\n            if (m_collapsedGroups.Contains(group))\n            {\n                m_collapsedGroups.Remove(group);\n                UpdateContent();\n            }\n            else\n            {\n                m_collapsedGroups.Add(group);\n                UpdateContent();\n            }\n        }\n\n        /// <summary>\n        /// Gets the rectangle for the collapse/expand button.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <param name=\"itemRect\">The item rect.</param>\n        /// <returns></returns>\n        private Rectangle GetButtonRectangle(string group, Rectangle itemRect)\n        {\n            // Checks whether this group is collapsed\n            bool isCollapsed = m_collapsedGroups.Contains(group);\n\n            // Get the image for this state\n            Image btnImage = isCollapsed ? Resources.Expand : Resources.Collapse;\n\n            // Compute the top left point\n            Point btnPoint = new Point(itemRect.Right - btnImage.Width - CollapserPadRight,\n                                       MedalGroupHeaderHeight / 2 - btnImage.Height / 2 + itemRect.Top);\n\n            return new Rectangle(btnPoint, btnImage.Size);\n        }\n\n        #endregion\n\n\n        #region Global events\n\n        /// <summary>\n        /// When the character medals update, we refresh the content.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterMedalsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the corporation medals update, we refresh the content.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CorporationMedalsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the EveIDToName list updates, we refresh the content.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the settings change we update the content.\n        /// </summary>\n        /// <remarks>In case 'SafeForWork' gets enabled.</remarks>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMedalsList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"ttToolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMonitor.Designer.cs",
    "content": "namespace EVEMon.CharacterMonitoring\n{\n    internal partial class CharacterMonitor\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.Footer = new EVEMon.CharacterMonitoring.CharacterMonitorFooter();\n            this.Body = new EVEMon.CharacterMonitoring.CharacterMonitorBody();\n            this.Header = new EVEMon.CharacterMonitoring.CharacterMonitorHeader();\n            this.SuspendLayout();\n            // \n            // Footer\n            // \n            this.Footer.AutoSize = true;\n            this.Footer.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.Footer.Location = new System.Drawing.Point(0, 591);\n            this.Footer.Name = \"Footer\";\n            this.Footer.Size = new System.Drawing.Size(614, 98);\n            this.Footer.TabIndex = 2;\n            // \n            // Body\n            // \n            this.Body.AutoSize = true;\n            this.Body.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.Body.Location = new System.Drawing.Point(0, 166);\n            this.Body.Name = \"Body\";\n            this.Body.Size = new System.Drawing.Size(614, 425);\n            this.Body.TabIndex = 1;\n            // \n            // Header\n            // \n            this.Header.AutoSize = true;\n            this.Header.Dock = System.Windows.Forms.DockStyle.Top;\n            this.Header.Font = new System.Drawing.Font(\"Tahoma\", 8.25F);\n            this.Header.Location = new System.Drawing.Point(0, 0);\n            this.Header.Name = \"Header\";\n            this.Header.Size = new System.Drawing.Size(614, 166);\n            this.Header.TabIndex = 0;\n            // \n            // CharacterMonitor\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.Color.Transparent;\n            this.Controls.Add(this.Body);\n            this.Controls.Add(this.Footer);\n            this.Controls.Add(this.Header);\n            this.Name = \"CharacterMonitor\";\n            this.Size = new System.Drawing.Size(614, 689);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n        #endregion\n\n        private CharacterMonitorHeader Header;\n        private CharacterMonitorBody Body;\n        private CharacterMonitorFooter Footer;\n    }\n}"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMonitor.cs",
    "content": "using System.Drawing;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Notifications;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    /// <summary>\n    /// Implements the content of each of the character tabs.\n    /// </summary>\n    internal sealed partial class CharacterMonitor : UserControl\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Design-time constructor.\n        /// </summary>\n        private CharacterMonitor()\n        {\n            InitializeComponent();\n            SetStyle(ControlStyles.SupportsTransparentBackColor, true);\n            UpdateStyles();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CharacterMonitor\"/> class.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        public CharacterMonitor(Character character)\n            : this()\n        {\n            Header.SetCharacter(character);\n            Body.SetCharacter(character);\n            Footer.SetCharacter(character);\n        }\n\n        #endregion\n\n\n        /// <summary>\n        /// Clears the notifications.\n        /// </summary>\n        internal void ClearNotifications()\n        {\n            Body.ClearNotifications();\n        }\n\n\n        #region Screenshot Method\n\n        /// <summary>\n        /// Takes a screeenshot of this character's monitor and returns it (used for PNG exportation)\n        /// </summary>\n        /// <returns>Screenshot of a character.</returns>\n        internal Bitmap GetCharacterScreenshot() => Body.GetCharacterScreenshot();\n\n        #endregion\n\n\n        #region Testing Function\n\n        /// <summary>\n        /// Tests character's notification display in the Character Monitor.\n        /// </summary>\n        internal static void TestCharacterNotification(Character character)\n        {\n            NotificationEventArgs notification = new NotificationEventArgs(character, NotificationCategory.TestNofitication)\n                                                     {\n                                                         Priority = NotificationPriority.Warning,\n                                                         Behaviour = NotificationBehaviour.Overwrite,\n                                                         Description = \"Test Character Notification.\"\n                                                     };\n            EveMonClient.Notifications.Notify(notification);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMonitor.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"$this.TrayHeight\" type=\"System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>56</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMonitorBody.Designer.cs",
    "content": "﻿using EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterMonitorBody\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterMonitorBody));\n            this.toolstripPanel = new System.Windows.Forms.Panel();\n            this.toolStripContextual = new System.Windows.Forms.ToolStrip();\n            this.preferencesMenu = new System.Windows.Forms.ToolStripDropDownButton();\n            this.columnSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.autoSizeColumnMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsColumnSettingsSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.hideInactiveMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.numberAbsFormatMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsOptionsSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.showOnlyCharMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showOnlyCorpMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsReadingPaneSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.readingPaneMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.paneRightMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.paneBottomMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.paneOffMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.combatLogSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.combatLogMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsPlanetarySeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.showOnlyExtractorMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.searchTextDel = new System.Windows.Forms.ToolStripButton();\n            this.searchTextBox = new System.Windows.Forms.ToolStripTextBox();\n            this.groupMenu = new System.Windows.Forms.ToolStripDropDownButton();\n            this.walletJournalCharts = new System.Windows.Forms.ToolStripButton();\n            this.allContacts = new System.Windows.Forms.ToolStripButton();\n            this.contactsExcellent = new System.Windows.Forms.ToolStripButton();\n            this.contactsGood = new System.Windows.Forms.ToolStripButton();\n            this.contactsNeutral = new System.Windows.Forms.ToolStripButton();\n            this.contactsBad = new System.Windows.Forms.ToolStripButton();\n            this.contactsTerrible = new System.Windows.Forms.ToolStripButton();\n            this.inWatchList = new System.Windows.Forms.ToolStripButton();\n            this.toolStripFeatures = new System.Windows.Forms.ToolStrip();\n            this.skillsIcon = new System.Windows.Forms.ToolStripButton();\n            this.skillQueueIcon = new System.Windows.Forms.ToolStripButton();\n            this.employmentIcon = new System.Windows.Forms.ToolStripButton();\n            this.standingsIcon = new System.Windows.Forms.ToolStripButton();\n            this.contactsIcon = new System.Windows.Forms.ToolStripButton();\n            this.factionalWarfareStatsIcon = new System.Windows.Forms.ToolStripButton();\n            this.medalsIcon = new System.Windows.Forms.ToolStripButton();\n            this.killLogIcon = new System.Windows.Forms.ToolStripButton();\n            this.assetsIcon = new System.Windows.Forms.ToolStripButton();\n            this.ordersIcon = new System.Windows.Forms.ToolStripButton();\n            this.contractsIcon = new System.Windows.Forms.ToolStripButton();\n            this.walletJournalIcon = new System.Windows.Forms.ToolStripButton();\n            this.walletTransactionsIcon = new System.Windows.Forms.ToolStripButton();\n            this.jobsIcon = new System.Windows.Forms.ToolStripButton();\n            this.loyaltyIcon = new System.Windows.Forms.ToolStripButton();\n            this.planetaryIcon = new System.Windows.Forms.ToolStripButton();\n            this.researchIcon = new System.Windows.Forms.ToolStripButton();\n            this.mailMessagesIcon = new System.Windows.Forms.ToolStripButton();\n            this.eveNotificationsIcon = new System.Windows.Forms.ToolStripButton();\n            this.calendarEventsIcon = new System.Windows.Forms.ToolStripButton();\n            this.featuresMenu = new System.Windows.Forms.ToolStripDropDownButton();\n            this.EnableAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.DisableAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.SelectionToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.tsPagesSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.toggleSkillsIcon = new System.Windows.Forms.ToolStripButton();\n            this.tsToggleSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.searchTextTimer = new System.Windows.Forms.Timer(this.components);\n            this.borderPanel = new EVEMon.Common.Controls.BorderPanel();\n            this.corePanel = new System.Windows.Forms.Panel();\n            this.multiPanel = new EVEMon.Common.Controls.MultiPanel.MultiPanel();\n            this.loyaltyPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.loyaltyList = new EVEMon.CharacterMonitoring.CharacterLoyaltyList();\n            this.standingsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.standingsList = new EVEMon.CharacterMonitoring.CharacterStandingsList();\n            this.skillsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.skillsList = new EVEMon.CharacterMonitoring.CharacterSkillsList();\n            this.ordersPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.ordersList = new EVEMon.CharacterMonitoring.CharacterMarketOrdersList();\n            this.skillQueuePage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.skillQueueList = new EVEMon.CharacterMonitoring.CharacterSkillsQueueList();\n            this.jobsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.jobsList = new EVEMon.CharacterMonitoring.CharacterIndustryJobsList();\n            this.researchPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.researchList = new EVEMon.CharacterMonitoring.CharacterResearchPointsList();\n            this.mailMessagesPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.mailMessagesList = new EVEMon.CharacterMonitoring.CharacterEveMailMessagesList();\n            this.eveNotificationsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.eveNotificationsList = new EVEMon.CharacterMonitoring.CharacterEveNotificationsList();\n            this.employmentPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.employmentList = new EVEMon.CharacterMonitoring.CharacterEmploymentHistoryList();\n            this.contractsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.contractsList = new EVEMon.CharacterMonitoring.CharacterContractsList();\n            this.assetsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.assetsList = new EVEMon.CharacterMonitoring.CharacterAssetsList();\n            this.walletJournalPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.walletJournalList = new EVEMon.CharacterMonitoring.CharacterWalletJournalList();\n            this.walletTransactionsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.walletTransactionsList = new EVEMon.CharacterMonitoring.CharacterWalletTransactionsList();\n            this.factionalWarfareStatsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.factionalWarfareStatsList = new EVEMon.CharacterMonitoring.CharacterFactionalWarfareStatsList();\n            this.contactsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.contactsList = new EVEMon.CharacterMonitoring.CharacterContactList();\n            this.medalsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.medalsList = new EVEMon.CharacterMonitoring.CharacterMedalsList();\n            this.killLogPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.killLogList = new EVEMon.CharacterMonitoring.CharacterKillLogList();\n            this.planetaryPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.planetaryList = new EVEMon.CharacterMonitoring.CharacterPlanetaryList();\n            this.warningLabel = new System.Windows.Forms.Label();\n            this.notificationList = new EVEMon.Controls.NotificationList();\n            this.toolstripPanel.SuspendLayout();\n            this.toolStripContextual.SuspendLayout();\n            this.toolStripFeatures.SuspendLayout();\n            this.borderPanel.SuspendLayout();\n            this.corePanel.SuspendLayout();\n            this.multiPanel.SuspendLayout();\n            this.loyaltyPage.SuspendLayout();\n            this.standingsPage.SuspendLayout();\n            this.skillsPage.SuspendLayout();\n            this.ordersPage.SuspendLayout();\n            this.skillQueuePage.SuspendLayout();\n            this.jobsPage.SuspendLayout();\n            this.researchPage.SuspendLayout();\n            this.mailMessagesPage.SuspendLayout();\n            this.eveNotificationsPage.SuspendLayout();\n            this.employmentPage.SuspendLayout();\n            this.contractsPage.SuspendLayout();\n            this.assetsPage.SuspendLayout();\n            this.walletJournalPage.SuspendLayout();\n            this.walletTransactionsPage.SuspendLayout();\n            this.factionalWarfareStatsPage.SuspendLayout();\n            this.contactsPage.SuspendLayout();\n            this.medalsPage.SuspendLayout();\n            this.killLogPage.SuspendLayout();\n            this.planetaryPage.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // toolstripPanel\n            // \n            this.toolstripPanel.AutoSize = true;\n            this.toolstripPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.toolstripPanel.Controls.Add(this.toolStripContextual);\n            this.toolstripPanel.Controls.Add(this.toolStripFeatures);\n            this.toolstripPanel.Dock = System.Windows.Forms.DockStyle.Top;\n            this.toolstripPanel.Location = new System.Drawing.Point(0, 0);\n            this.toolstripPanel.Name = \"toolstripPanel\";\n            this.toolstripPanel.Size = new System.Drawing.Size(614, 56);\n            this.toolstripPanel.TabIndex = 17;\n            // \n            // toolStripContextual\n            // \n            this.toolStripContextual.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n            this.toolStripContextual.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.preferencesMenu,\n            this.searchTextDel,\n            this.searchTextBox,\n            this.groupMenu,\n            this.walletJournalCharts,\n            this.allContacts,\n            this.contactsExcellent,\n            this.contactsGood,\n            this.contactsNeutral,\n            this.contactsBad,\n            this.contactsTerrible,\n            this.inWatchList});\n            this.toolStripContextual.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow;\n            this.toolStripContextual.Location = new System.Drawing.Point(0, 31);\n            this.toolStripContextual.Name = \"toolStripContextual\";\n            this.toolStripContextual.Size = new System.Drawing.Size(614, 25);\n            this.toolStripContextual.TabIndex = 15;\n            // \n            // preferencesMenu\n            // \n            this.preferencesMenu.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n            this.preferencesMenu.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.preferencesMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.columnSettingsMenuItem,\n            this.autoSizeColumnMenuItem,\n            this.tsColumnSettingsSeparator,\n            this.hideInactiveMenuItem,\n            this.numberAbsFormatMenuItem,\n            this.tsOptionsSeparator,\n            this.showOnlyCharMenuItem,\n            this.showOnlyCorpMenuItem,\n            this.tsReadingPaneSeparator,\n            this.readingPaneMenuItem,\n            this.combatLogSeparator,\n            this.combatLogMenuItem,\n            this.tsPlanetarySeparator,\n            this.showOnlyExtractorMenuItem});\n            this.preferencesMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"preferencesMenu.Image\")));\n            this.preferencesMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.preferencesMenu.Name = \"preferencesMenu\";\n            this.preferencesMenu.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;\n            this.preferencesMenu.RightToLeft = System.Windows.Forms.RightToLeft.No;\n            this.preferencesMenu.Size = new System.Drawing.Size(29, 22);\n            this.preferencesMenu.Text = \"Preferences\";\n            this.preferencesMenu.ToolTipText = \"Preferences\";\n            this.preferencesMenu.DropDownOpening += new System.EventHandler(this.preferencesMenu_DropDownOpening);\n            // \n            // columnSettingsMenuItem\n            // \n            this.columnSettingsMenuItem.Name = \"columnSettingsMenuItem\";\n            this.columnSettingsMenuItem.Size = new System.Drawing.Size(252, 22);\n            this.columnSettingsMenuItem.Text = \"Column Settings\";\n            this.columnSettingsMenuItem.Click += new System.EventHandler(this.columnSettingsMenuItem_Click);\n            // \n            // autoSizeColumnMenuItem\n            // \n            this.autoSizeColumnMenuItem.Name = \"autoSizeColumnMenuItem\";\n            this.autoSizeColumnMenuItem.Size = new System.Drawing.Size(252, 22);\n            this.autoSizeColumnMenuItem.Text = \"Auto-Size Columns\";\n            this.autoSizeColumnMenuItem.Click += new System.EventHandler(this.autoSizeColumnMenuItem_Click);\n            // \n            // tsColumnSettingsSeparator\n            // \n            this.tsColumnSettingsSeparator.Name = \"tsColumnSettingsSeparator\";\n            this.tsColumnSettingsSeparator.Size = new System.Drawing.Size(249, 6);\n            // \n            // hideInactiveMenuItem\n            // \n            this.hideInactiveMenuItem.Name = \"hideInactiveMenuItem\";\n            this.hideInactiveMenuItem.Size = new System.Drawing.Size(252, 22);\n            this.hideInactiveMenuItem.Text = \"Hide Inactive Orders\";\n            this.hideInactiveMenuItem.Click += new System.EventHandler(this.hideInactiveMenuItem_Click);\n            // \n            // numberAbsFormatMenuItem\n            // \n            this.numberAbsFormatMenuItem.Name = \"numberAbsFormatMenuItem\";\n            this.numberAbsFormatMenuItem.Size = new System.Drawing.Size(252, 22);\n            this.numberAbsFormatMenuItem.Text = \"Number Abbreviating Format\";\n            this.numberAbsFormatMenuItem.Click += new System.EventHandler(this.numberAbsFormatMenuItem_Click);\n            // \n            // tsOptionsSeparator\n            // \n            this.tsOptionsSeparator.Name = \"tsOptionsSeparator\";\n            this.tsOptionsSeparator.Size = new System.Drawing.Size(249, 6);\n            // \n            // showOnlyCharMenuItem\n            // \n            this.showOnlyCharMenuItem.CheckOnClick = true;\n            this.showOnlyCharMenuItem.Name = \"showOnlyCharMenuItem\";\n            this.showOnlyCharMenuItem.Size = new System.Drawing.Size(252, 22);\n            this.showOnlyCharMenuItem.Text = \"Show Only Issued for Character\";\n            this.showOnlyCharMenuItem.Click += new System.EventHandler(this.showOnlyCharMenuItem_Click);\n            // \n            // showOnlyCorpMenuItem\n            // \n            this.showOnlyCorpMenuItem.CheckOnClick = true;\n            this.showOnlyCorpMenuItem.Name = \"showOnlyCorpMenuItem\";\n            this.showOnlyCorpMenuItem.Size = new System.Drawing.Size(252, 22);\n            this.showOnlyCorpMenuItem.Text = \"Show Only Issued for Corporation\";\n            this.showOnlyCorpMenuItem.Click += new System.EventHandler(this.showOnlyCorpMenuItem_Click);\n            // \n            // tsReadingPaneSeparator\n            // \n            this.tsReadingPaneSeparator.Name = \"tsReadingPaneSeparator\";\n            this.tsReadingPaneSeparator.Size = new System.Drawing.Size(249, 6);\n            // \n            // readingPaneMenuItem\n            // \n            this.readingPaneMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.paneRightMenuItem,\n            this.paneBottomMenuItem,\n            this.paneOffMenuItem});\n            this.readingPaneMenuItem.Name = \"readingPaneMenuItem\";\n            this.readingPaneMenuItem.Size = new System.Drawing.Size(252, 22);\n            this.readingPaneMenuItem.Text = \"Reading Pane\";\n            this.readingPaneMenuItem.DropDownOpening += new System.EventHandler(this.readingPaneMenuItem_DropDownOpening);\n            // \n            // paneRightMenuItem\n            // \n            this.paneRightMenuItem.CheckOnClick = true;\n            this.paneRightMenuItem.Name = \"paneRightMenuItem\";\n            this.paneRightMenuItem.Size = new System.Drawing.Size(114, 22);\n            this.paneRightMenuItem.Tag = \"Right\";\n            this.paneRightMenuItem.Text = \"Right\";\n            this.paneRightMenuItem.Click += new System.EventHandler(this.paneRightMenuItem_Click);\n            // \n            // paneBottomMenuItem\n            // \n            this.paneBottomMenuItem.CheckOnClick = true;\n            this.paneBottomMenuItem.Name = \"paneBottomMenuItem\";\n            this.paneBottomMenuItem.Size = new System.Drawing.Size(114, 22);\n            this.paneBottomMenuItem.Tag = \"Bottom\";\n            this.paneBottomMenuItem.Text = \"Bottom\";\n            this.paneBottomMenuItem.Click += new System.EventHandler(this.paneBottomMenuItem_Click);\n            // \n            // paneOffMenuItem\n            // \n            this.paneOffMenuItem.CheckOnClick = true;\n            this.paneOffMenuItem.Name = \"paneOffMenuItem\";\n            this.paneOffMenuItem.Size = new System.Drawing.Size(114, 22);\n            this.paneOffMenuItem.Tag = \"Off\";\n            this.paneOffMenuItem.Text = \"Off\";\n            this.paneOffMenuItem.Click += new System.EventHandler(this.paneOffMenuItem_Click);\n            // \n            // combatLogSeparator\n            // \n            this.combatLogSeparator.Name = \"combatLogSeparator\";\n            this.combatLogSeparator.Size = new System.Drawing.Size(249, 6);\n            // \n            // combatLogMenuItem\n            // \n            this.combatLogMenuItem.CheckOnClick = true;\n            this.combatLogMenuItem.Name = \"combatLogMenuItem\";\n            this.combatLogMenuItem.Size = new System.Drawing.Size(252, 22);\n            this.combatLogMenuItem.Text = \"Show Condensed Combat Logs\";\n            this.combatLogMenuItem.Click += new System.EventHandler(this.combatLogMenuItem_Click);\n            // \n            // tsPlanetarySeparator\n            // \n            this.tsPlanetarySeparator.Name = \"tsPlanetarySeparator\";\n            this.tsPlanetarySeparator.Size = new System.Drawing.Size(249, 6);\n            // \n            // showOnlyExtractorMenuItem\n            // \n            this.showOnlyExtractorMenuItem.CheckOnClick = true;\n            this.showOnlyExtractorMenuItem.Name = \"showOnlyExtractorMenuItem\";\n            this.showOnlyExtractorMenuItem.Size = new System.Drawing.Size(252, 22);\n            this.showOnlyExtractorMenuItem.Text = \"Show Only Extractor Control Unit\";\n            this.showOnlyExtractorMenuItem.Click += new System.EventHandler(this.showOnlyExtractorMenuItem_Click);\n            // \n            // searchTextDel\n            // \n            this.searchTextDel.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n            this.searchTextDel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.searchTextDel.Image = ((System.Drawing.Image)(resources.GetObject(\"searchTextDel.Image\")));\n            this.searchTextDel.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;\n            this.searchTextDel.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.searchTextDel.Name = \"searchTextDel\";\n            this.searchTextDel.Size = new System.Drawing.Size(23, 22);\n            this.searchTextDel.Text = \"searchTextDel\";\n            this.searchTextDel.ToolTipText = \"Delete search text\";\n            this.searchTextDel.MouseUp += new System.Windows.Forms.MouseEventHandler(this.searchTextDel_MouseUp);\n            // \n            // searchTextBox\n            // \n            this.searchTextBox.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n            this.searchTextBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;\n            this.searchTextBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList;\n            this.searchTextBox.AutoSize = false;\n            this.searchTextBox.BackColor = System.Drawing.SystemColors.ControlLight;\n            this.searchTextBox.Name = \"searchTextBox\";\n            this.searchTextBox.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;\n            this.searchTextBox.Size = new System.Drawing.Size(120, 21);\n            this.searchTextBox.ToolTipText = \"Search\";\n            this.searchTextBox.TextChanged += new System.EventHandler(this.searchTextBox_TextChanged);\n            // \n            // groupMenu\n            // \n            this.groupMenu.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n            this.groupMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"groupMenu.Image\")));\n            this.groupMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.groupMenu.Name = \"groupMenu\";\n            this.groupMenu.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;\n            this.groupMenu.Size = new System.Drawing.Size(94, 22);\n            this.groupMenu.Text = \"Group By...\";\n            this.groupMenu.DropDownOpening += new System.EventHandler(this.groupMenu_DropDownOpening);\n            this.groupMenu.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.groupMenu_DropDownItemClicked);\n            // \n            // walletJournalCharts\n            // \n            this.walletJournalCharts.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.walletJournalCharts.Image = ((System.Drawing.Image)(resources.GetObject(\"walletJournalCharts.Image\")));\n            this.walletJournalCharts.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.walletJournalCharts.Name = \"walletJournalCharts\";\n            this.walletJournalCharts.Size = new System.Drawing.Size(23, 22);\n            this.walletJournalCharts.Text = \"Wallet Journal Charts\";\n            this.walletJournalCharts.ToolTipText = \"Charts\";\n            this.walletJournalCharts.Click += new System.EventHandler(this.walletJournalCharts_Click);\n            // \n            // allContacts\n            // \n            this.allContacts.Checked = true;\n            this.allContacts.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.allContacts.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.allContacts.Image = ((System.Drawing.Image)(resources.GetObject(\"allContacts.Image\")));\n            this.allContacts.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.allContacts.Name = \"allContacts\";\n            this.allContacts.Size = new System.Drawing.Size(23, 22);\n            this.allContacts.Text = \"All contacts\";\n            this.allContacts.Click += new System.EventHandler(this.contactsToolbarIcon_Click);\n            // \n            // contactsExcellent\n            // \n            this.contactsExcellent.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.contactsExcellent.Image = ((System.Drawing.Image)(resources.GetObject(\"contactsExcellent.Image\")));\n            this.contactsExcellent.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.contactsExcellent.Name = \"contactsExcellent\";\n            this.contactsExcellent.Size = new System.Drawing.Size(23, 22);\n            this.contactsExcellent.Text = \"Excellent standing\";\n            this.contactsExcellent.Click += new System.EventHandler(this.contactsToolbarIcon_Click);\n            // \n            // contactsGood\n            // \n            this.contactsGood.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.contactsGood.Image = ((System.Drawing.Image)(resources.GetObject(\"contactsGood.Image\")));\n            this.contactsGood.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.contactsGood.Name = \"contactsGood\";\n            this.contactsGood.Size = new System.Drawing.Size(23, 22);\n            this.contactsGood.Tag = \"Good\";\n            this.contactsGood.Text = \"Good standing\";\n            this.contactsGood.Click += new System.EventHandler(this.contactsToolbarIcon_Click);\n            // \n            // contactsNeutral\n            // \n            this.contactsNeutral.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.contactsNeutral.Image = ((System.Drawing.Image)(resources.GetObject(\"contactsNeutral.Image\")));\n            this.contactsNeutral.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.contactsNeutral.Name = \"contactsNeutral\";\n            this.contactsNeutral.Size = new System.Drawing.Size(23, 22);\n            this.contactsNeutral.Text = \"Neutral standing\";\n            this.contactsNeutral.Click += new System.EventHandler(this.contactsToolbarIcon_Click);\n            // \n            // contactsBad\n            // \n            this.contactsBad.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.contactsBad.Image = ((System.Drawing.Image)(resources.GetObject(\"contactsBad.Image\")));\n            this.contactsBad.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.contactsBad.Name = \"contactsBad\";\n            this.contactsBad.Size = new System.Drawing.Size(23, 22);\n            this.contactsBad.Text = \"Bad standing\";\n            this.contactsBad.Click += new System.EventHandler(this.contactsToolbarIcon_Click);\n            // \n            // contactsTerrible\n            // \n            this.contactsTerrible.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.contactsTerrible.Image = ((System.Drawing.Image)(resources.GetObject(\"contactsTerrible.Image\")));\n            this.contactsTerrible.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.contactsTerrible.Name = \"contactsTerrible\";\n            this.contactsTerrible.Size = new System.Drawing.Size(23, 22);\n            this.contactsTerrible.Text = \"Terrible standing\";\n            this.contactsTerrible.Click += new System.EventHandler(this.contactsToolbarIcon_Click);\n            // \n            // inWatchList\n            // \n            this.inWatchList.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.inWatchList.Image = ((System.Drawing.Image)(resources.GetObject(\"inWatchList.Image\")));\n            this.inWatchList.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.inWatchList.Name = \"inWatchList\";\n            this.inWatchList.Size = new System.Drawing.Size(23, 22);\n            this.inWatchList.Text = \"Watch List\";\n            this.inWatchList.Click += new System.EventHandler(this.contactsToolbarIcon_Click);\n            // \n            // toolStripFeatures\n            // \n            this.toolStripFeatures.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n            this.toolStripFeatures.ImageScalingSize = new System.Drawing.Size(24, 24);\n            this.toolStripFeatures.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.skillsIcon,\n            this.skillQueueIcon,\n            this.employmentIcon,\n            this.standingsIcon,\n            this.contactsIcon,\n            this.factionalWarfareStatsIcon,\n            this.medalsIcon,\n            this.killLogIcon,\n            this.assetsIcon,\n            this.ordersIcon,\n            this.contractsIcon,\n            this.walletJournalIcon,\n            this.walletTransactionsIcon,\n            this.jobsIcon,\n            this.loyaltyIcon,\n            this.planetaryIcon,\n            this.researchIcon,\n            this.mailMessagesIcon,\n            this.eveNotificationsIcon,\n            this.calendarEventsIcon,\n            this.featuresMenu,\n            this.tsPagesSeparator,\n            this.toggleSkillsIcon,\n            this.tsToggleSeparator});\n            this.toolStripFeatures.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow;\n            this.toolStripFeatures.Location = new System.Drawing.Point(0, 0);\n            this.toolStripFeatures.Name = \"toolStripFeatures\";\n            this.toolStripFeatures.Size = new System.Drawing.Size(614, 31);\n            this.toolStripFeatures.TabIndex = 13;\n            // \n            // skillsIcon\n            // \n            this.skillsIcon.Checked = true;\n            this.skillsIcon.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.skillsIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.skillsIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"skillsIcon.Image\")));\n            this.skillsIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.skillsIcon.Name = \"skillsIcon\";\n            this.skillsIcon.Size = new System.Drawing.Size(28, 28);\n            this.skillsIcon.Tag = \"skillsPage\";\n            this.skillsIcon.Text = \"Skills\";\n            this.skillsIcon.ToolTipText = \"Display skills list\";\n            this.skillsIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // skillQueueIcon\n            // \n            this.skillQueueIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.skillQueueIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"skillQueueIcon.Image\")));\n            this.skillQueueIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.skillQueueIcon.Name = \"skillQueueIcon\";\n            this.skillQueueIcon.Size = new System.Drawing.Size(28, 28);\n            this.skillQueueIcon.Tag = \"skillQueuePage\";\n            this.skillQueueIcon.Text = \"Queue\";\n            this.skillQueueIcon.ToolTipText = \"Display skills in queue\";\n            this.skillQueueIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // employmentIcon\n            // \n            this.employmentIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.employmentIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"employmentIcon.Image\")));\n            this.employmentIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.employmentIcon.Name = \"employmentIcon\";\n            this.employmentIcon.Size = new System.Drawing.Size(28, 28);\n            this.employmentIcon.Tag = \"employmentPage\";\n            this.employmentIcon.Text = \"Employment History\";\n            this.employmentIcon.ToolTipText = \"Display employment history\";\n            this.employmentIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // standingsIcon\n            // \n            this.standingsIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.standingsIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"standingsIcon.Image\")));\n            this.standingsIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.standingsIcon.Name = \"standingsIcon\";\n            this.standingsIcon.Size = new System.Drawing.Size(28, 28);\n            this.standingsIcon.Tag = \"standingsPage\";\n            this.standingsIcon.Text = \"Standings\";\n            this.standingsIcon.ToolTipText = \"Display standings\";\n            this.standingsIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // contactsIcon\n            // \n            this.contactsIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.contactsIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"contactsIcon.Image\")));\n            this.contactsIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.contactsIcon.Name = \"contactsIcon\";\n            this.contactsIcon.Size = new System.Drawing.Size(28, 28);\n            this.contactsIcon.Tag = \"contactsPage\";\n            this.contactsIcon.Text = \"Contacts\";\n            this.contactsIcon.ToolTipText = \"Display contacts\";\n            this.contactsIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // factionalWarfareStatsIcon\n            // \n            this.factionalWarfareStatsIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.factionalWarfareStatsIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"factionalWarfareStatsIcon.Image\")));\n            this.factionalWarfareStatsIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.factionalWarfareStatsIcon.Name = \"factionalWarfareStatsIcon\";\n            this.factionalWarfareStatsIcon.Size = new System.Drawing.Size(28, 28);\n            this.factionalWarfareStatsIcon.Tag = \"factionalWarfareStatsPage\";\n            this.factionalWarfareStatsIcon.Text = \"Factional Warfare\";\n            this.factionalWarfareStatsIcon.ToolTipText = \"Display factional warfare stats\";\n            this.factionalWarfareStatsIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // medalsIcon\n            // \n            this.medalsIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.medalsIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"medalsIcon.Image\")));\n            this.medalsIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.medalsIcon.Name = \"medalsIcon\";\n            this.medalsIcon.Size = new System.Drawing.Size(28, 28);\n            this.medalsIcon.Tag = \"medalsPage\";\n            this.medalsIcon.Text = \"Medals\";\n            this.medalsIcon.ToolTipText = \"Display medals\";\n            this.medalsIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // killLogIcon\n            // \n            this.killLogIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.killLogIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"killLogIcon.Image\")));\n            this.killLogIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.killLogIcon.Name = \"killLogIcon\";\n            this.killLogIcon.Size = new System.Drawing.Size(28, 28);\n            this.killLogIcon.Tag = \"killLogPage\";\n            this.killLogIcon.Text = \"Combat Log\";\n            this.killLogIcon.ToolTipText = \"Display combat log\";\n            this.killLogIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // assetsIcon\n            // \n            this.assetsIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.assetsIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"assetsIcon.Image\")));\n            this.assetsIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.assetsIcon.Name = \"assetsIcon\";\n            this.assetsIcon.Size = new System.Drawing.Size(28, 28);\n            this.assetsIcon.Tag = \"assetsPage\";\n            this.assetsIcon.Text = \"Assets\";\n            this.assetsIcon.ToolTipText = \"Display assets\";\n            this.assetsIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // ordersIcon\n            // \n            this.ordersIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.ordersIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"ordersIcon.Image\")));\n            this.ordersIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.ordersIcon.Name = \"ordersIcon\";\n            this.ordersIcon.Size = new System.Drawing.Size(28, 28);\n            this.ordersIcon.Tag = \"ordersPage\";\n            this.ordersIcon.Text = \"Market\";\n            this.ordersIcon.ToolTipText = \"Display market orders\";\n            this.ordersIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // contractsIcon\n            // \n            this.contractsIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.contractsIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"contractsIcon.Image\")));\n            this.contractsIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.contractsIcon.Name = \"contractsIcon\";\n            this.contractsIcon.Size = new System.Drawing.Size(28, 28);\n            this.contractsIcon.Tag = \"contractsPage\";\n            this.contractsIcon.Text = \"Contracts\";\n            this.contractsIcon.ToolTipText = \"Display contracts\";\n            this.contractsIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // walletJournalIcon\n            // \n            this.walletJournalIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.walletJournalIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"walletJournalIcon.Image\")));\n            this.walletJournalIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.walletJournalIcon.Name = \"walletJournalIcon\";\n            this.walletJournalIcon.Size = new System.Drawing.Size(28, 28);\n            this.walletJournalIcon.Tag = \"walletJournalPage\";\n            this.walletJournalIcon.Text = \"Wallet Journal\";\n            this.walletJournalIcon.ToolTipText = \"Display wallet journal\";\n            this.walletJournalIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // walletTransactionsIcon\n            // \n            this.walletTransactionsIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.walletTransactionsIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"walletTransactionsIcon.Image\")));\n            this.walletTransactionsIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.walletTransactionsIcon.Name = \"walletTransactionsIcon\";\n            this.walletTransactionsIcon.Size = new System.Drawing.Size(28, 28);\n            this.walletTransactionsIcon.Tag = \"walletTransactionsPage\";\n            this.walletTransactionsIcon.Text = \"Wallet Transactions\";\n            this.walletTransactionsIcon.ToolTipText = \"Display wallet transactions\";\n            this.walletTransactionsIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // jobsIcon\n            // \n            this.jobsIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.jobsIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"jobsIcon.Image\")));\n            this.jobsIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.jobsIcon.Name = \"jobsIcon\";\n            this.jobsIcon.Size = new System.Drawing.Size(28, 28);\n            this.jobsIcon.Tag = \"jobsPage\";\n            this.jobsIcon.Text = \"Industry\";\n            this.jobsIcon.ToolTipText = \"Display industry jobs\";\n            this.jobsIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // loyaltyIcon\n            // \n            this.loyaltyIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.loyaltyIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"loyaltyIcon.Image\")));\n            this.loyaltyIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.loyaltyIcon.Name = \"loyaltyIcon\";\n            this.loyaltyIcon.Size = new System.Drawing.Size(28, 28);\n            this.loyaltyIcon.Tag = \"loyaltyPage\";\n            this.loyaltyIcon.Text = \"Loyalty Points\";\n            this.loyaltyIcon.ToolTipText = \"Display loyalty point balances\";\n            this.loyaltyIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // planetaryIcon\n            // \n            this.planetaryIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.planetaryIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"planetaryIcon.Image\")));\n            this.planetaryIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.planetaryIcon.Name = \"planetaryIcon\";\n            this.planetaryIcon.Size = new System.Drawing.Size(28, 28);\n            this.planetaryIcon.Tag = \"planetaryPage\";\n            this.planetaryIcon.Text = \"Planetary Colonies\";\n            this.planetaryIcon.ToolTipText = \"Display planetary colonies\";\n            this.planetaryIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // researchIcon\n            // \n            this.researchIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.researchIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"researchIcon.Image\")));\n            this.researchIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.researchIcon.Name = \"researchIcon\";\n            this.researchIcon.Size = new System.Drawing.Size(28, 28);\n            this.researchIcon.Tag = \"researchPage\";\n            this.researchIcon.Text = \"Research\";\n            this.researchIcon.ToolTipText = \"Display research points\";\n            this.researchIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // mailMessagesIcon\n            // \n            this.mailMessagesIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.mailMessagesIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"mailMessagesIcon.Image\")));\n            this.mailMessagesIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.mailMessagesIcon.Name = \"mailMessagesIcon\";\n            this.mailMessagesIcon.Size = new System.Drawing.Size(28, 28);\n            this.mailMessagesIcon.Tag = \"mailMessagesPage\";\n            this.mailMessagesIcon.Text = \"Mail\";\n            this.mailMessagesIcon.ToolTipText = \"Display EVE mails\";\n            this.mailMessagesIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // eveNotificationsIcon\n            // \n            this.eveNotificationsIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.eveNotificationsIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"eveNotificationsIcon.Image\")));\n            this.eveNotificationsIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.eveNotificationsIcon.Name = \"eveNotificationsIcon\";\n            this.eveNotificationsIcon.Size = new System.Drawing.Size(28, 28);\n            this.eveNotificationsIcon.Tag = \"eveNotificationsPage\";\n            this.eveNotificationsIcon.Text = \"Notification\";\n            this.eveNotificationsIcon.ToolTipText = \"Display EVE notifications\";\n            this.eveNotificationsIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // calendarEventsIcon\n            // \n            this.calendarEventsIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.calendarEventsIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"calendarEventsIcon.Image\")));\n            this.calendarEventsIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.calendarEventsIcon.Name = \"calendarEventsIcon\";\n            this.calendarEventsIcon.Size = new System.Drawing.Size(28, 28);\n            this.calendarEventsIcon.Tag = \"calendarEventsPage\";\n            this.calendarEventsIcon.Text = \"Calendar\";\n            this.calendarEventsIcon.ToolTipText = \"Display calendar events\";\n            this.calendarEventsIcon.Click += new System.EventHandler(this.toolbarIcon_Click);\n            // \n            // featuresMenu\n            // \n            this.featuresMenu.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n            this.featuresMenu.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.featuresMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.EnableAllToolStripMenuItem,\n            this.DisableAllToolStripMenuItem,\n            this.SelectionToolStripSeparator});\n            this.featuresMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"featuresMenu.Image\")));\n            this.featuresMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.featuresMenu.Name = \"featuresMenu\";\n            this.featuresMenu.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;\n            this.featuresMenu.Size = new System.Drawing.Size(37, 28);\n            this.featuresMenu.Text = \"More features\";\n            this.featuresMenu.ToolTipText = \"Advanced features\";\n            this.featuresMenu.DropDownOpening += new System.EventHandler(this.featureMenu_DropDownOpening);\n            this.featuresMenu.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.featuresMenu_DropDownItemClicked);\n            // \n            // EnableAllToolStripMenuItem\n            // \n            this.EnableAllToolStripMenuItem.Name = \"EnableAllToolStripMenuItem\";\n            this.EnableAllToolStripMenuItem.Size = new System.Drawing.Size(129, 22);\n            this.EnableAllToolStripMenuItem.Text = \"Enable All\";\n            this.EnableAllToolStripMenuItem.Click += new System.EventHandler(this.EnableAllToolStripMenuItem_Click);\n            // \n            // DisableAllToolStripMenuItem\n            // \n            this.DisableAllToolStripMenuItem.Name = \"DisableAllToolStripMenuItem\";\n            this.DisableAllToolStripMenuItem.Size = new System.Drawing.Size(129, 22);\n            this.DisableAllToolStripMenuItem.Text = \"Disable All\";\n            this.DisableAllToolStripMenuItem.Click += new System.EventHandler(this.DisableAllToolStripMenuItem_Click);\n            // \n            // SelectionToolStripSeparator\n            // \n            this.SelectionToolStripSeparator.Name = \"SelectionToolStripSeparator\";\n            this.SelectionToolStripSeparator.Size = new System.Drawing.Size(126, 6);\n            // \n            // tsPagesSeparator\n            // \n            this.tsPagesSeparator.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n            this.tsPagesSeparator.Name = \"tsPagesSeparator\";\n            this.tsPagesSeparator.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;\n            this.tsPagesSeparator.Size = new System.Drawing.Size(6, 31);\n            // \n            // toggleSkillsIcon\n            // \n            this.toggleSkillsIcon.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n            this.toggleSkillsIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.toggleSkillsIcon.Image = ((System.Drawing.Image)(resources.GetObject(\"toggleSkillsIcon.Image\")));\n            this.toggleSkillsIcon.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.toggleSkillsIcon.Name = \"toggleSkillsIcon\";\n            this.toggleSkillsIcon.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;\n            this.toggleSkillsIcon.Size = new System.Drawing.Size(28, 28);\n            this.toggleSkillsIcon.Text = \"Toggle All Skills\";\n            this.toggleSkillsIcon.ToolTipText = \"Toggle all skills\";\n            this.toggleSkillsIcon.Click += new System.EventHandler(this.toggleSkillsIcon_Click);\n            // \n            // tsToggleSeparator\n            // \n            this.tsToggleSeparator.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n            this.tsToggleSeparator.Name = \"tsToggleSeparator\";\n            this.tsToggleSeparator.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;\n            this.tsToggleSeparator.Size = new System.Drawing.Size(6, 31);\n            // \n            // searchTextTimer\n            // \n            this.searchTextTimer.Interval = 300;\n            this.searchTextTimer.Tick += new System.EventHandler(this.searchTextTimer_Tick);\n            // \n            // borderPanel\n            // \n            this.borderPanel.AutoSize = true;\n            this.borderPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.borderPanel.BackColor = System.Drawing.SystemColors.Window;\n            this.borderPanel.Controls.Add(this.corePanel);\n            this.borderPanel.Controls.Add(this.notificationList);\n            this.borderPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.borderPanel.Location = new System.Drawing.Point(0, 56);\n            this.borderPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.borderPanel.Name = \"borderPanel\";\n            this.borderPanel.Padding = new System.Windows.Forms.Padding(2, 2, 1, 2);\n            this.borderPanel.Size = new System.Drawing.Size(614, 275);\n            this.borderPanel.TabIndex = 18;\n            // \n            // corePanel\n            // \n            this.corePanel.Controls.Add(this.multiPanel);\n            this.corePanel.Controls.Add(this.warningLabel);\n            this.corePanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.corePanel.Location = new System.Drawing.Point(2, 74);\n            this.corePanel.Margin = new System.Windows.Forms.Padding(0);\n            this.corePanel.Name = \"corePanel\";\n            this.corePanel.Padding = new System.Windows.Forms.Padding(1, 1, 2, 0);\n            this.corePanel.Size = new System.Drawing.Size(611, 199);\n            this.corePanel.TabIndex = 14;\n            // \n            // multiPanel\n            // \n            this.multiPanel.Controls.Add(this.loyaltyPage);\n            this.multiPanel.Controls.Add(this.standingsPage);\n            this.multiPanel.Controls.Add(this.skillsPage);\n            this.multiPanel.Controls.Add(this.ordersPage);\n            this.multiPanel.Controls.Add(this.skillQueuePage);\n            this.multiPanel.Controls.Add(this.jobsPage);\n            this.multiPanel.Controls.Add(this.researchPage);\n            this.multiPanel.Controls.Add(this.mailMessagesPage);\n            this.multiPanel.Controls.Add(this.eveNotificationsPage);\n            this.multiPanel.Controls.Add(this.employmentPage);\n            this.multiPanel.Controls.Add(this.contractsPage);\n            this.multiPanel.Controls.Add(this.assetsPage);\n            this.multiPanel.Controls.Add(this.walletJournalPage);\n            this.multiPanel.Controls.Add(this.walletTransactionsPage);\n            this.multiPanel.Controls.Add(this.factionalWarfareStatsPage);\n            this.multiPanel.Controls.Add(this.contactsPage);\n            this.multiPanel.Controls.Add(this.medalsPage);\n            this.multiPanel.Controls.Add(this.killLogPage);\n            this.multiPanel.Controls.Add(this.planetaryPage);\n            this.multiPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.multiPanel.Location = new System.Drawing.Point(1, 18);\n            this.multiPanel.Name = \"multiPanel\";\n            this.multiPanel.SelectedPage = this.skillsPage;\n            this.multiPanel.Size = new System.Drawing.Size(608, 181);\n            this.multiPanel.TabIndex = 14;\n            // \n            // loyaltyPage\n            // \n            this.loyaltyPage.Controls.Add(this.loyaltyList);\n            this.loyaltyPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.loyaltyPage.Location = new System.Drawing.Point(0, 0);\n            this.loyaltyPage.Name = \"loyaltyPage\";\n            this.loyaltyPage.Size = new System.Drawing.Size(608, 181);\n            this.loyaltyPage.TabIndex = 18;\n            this.loyaltyPage.Tag = \"LoyaltyPoints\";\n            this.loyaltyPage.Text = \"loyaltyPage\";\n            // \n            // loyaltyList\n            // \n            this.loyaltyList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.loyaltyList.Location = new System.Drawing.Point(0, 0);\n            this.loyaltyList.Name = \"loyaltyList\";\n            this.loyaltyList.Size = new System.Drawing.Size(608, 181);\n            this.loyaltyList.TabIndex = 0;\n            // \n            // standingsPage\n            // \n            this.standingsPage.Controls.Add(this.standingsList);\n            this.standingsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.standingsPage.Location = new System.Drawing.Point(0, 0);\n            this.standingsPage.Name = \"standingsPage\";\n            this.standingsPage.Size = new System.Drawing.Size(608, 181);\n            this.standingsPage.TabIndex = 7;\n            this.standingsPage.Tag = \"Standings\";\n            this.standingsPage.Text = \"standingsPage\";\n            // \n            // standingsList\n            // \n            this.standingsList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.standingsList.Location = new System.Drawing.Point(0, 0);\n            this.standingsList.Name = \"standingsList\";\n            this.standingsList.Size = new System.Drawing.Size(608, 181);\n            this.standingsList.TabIndex = 0;\n            // \n            // skillsPage\n            // \n            this.skillsPage.Controls.Add(this.skillsList);\n            this.skillsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.skillsPage.Location = new System.Drawing.Point(0, 0);\n            this.skillsPage.Name = \"skillsPage\";\n            this.skillsPage.Size = new System.Drawing.Size(608, 181);\n            this.skillsPage.TabIndex = 0;\n            this.skillsPage.Tag = \"CharacterSheet\";\n            this.skillsPage.Text = \"skillsPage\";\n            // \n            // skillsList\n            // \n            this.skillsList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.skillsList.Location = new System.Drawing.Point(0, 0);\n            this.skillsList.Margin = new System.Windows.Forms.Padding(0);\n            this.skillsList.Name = \"skillsList\";\n            this.skillsList.Size = new System.Drawing.Size(608, 181);\n            this.skillsList.TabIndex = 12;\n            // \n            // ordersPage\n            // \n            this.ordersPage.Controls.Add(this.ordersList);\n            this.ordersPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ordersPage.Location = new System.Drawing.Point(0, 0);\n            this.ordersPage.Name = \"ordersPage\";\n            this.ordersPage.Size = new System.Drawing.Size(564, 181);\n            this.ordersPage.TabIndex = 2;\n            this.ordersPage.Tag = \"MarketOrders\";\n            this.ordersPage.Text = \"ordersPage\";\n            // \n            // ordersList\n            // \n            this.ordersList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ordersList.Grouping = MarketOrderGrouping.State;\n            this.ordersList.Location = new System.Drawing.Point(0, 0);\n            this.ordersList.Name = \"ordersList\";\n            this.ordersList.Size = new System.Drawing.Size(564, 181);\n            this.ordersList.TabIndex = 13;\n            this.ordersList.TextFilter = \"\";\n            // \n            // skillQueuePage\n            // \n            this.skillQueuePage.Controls.Add(this.skillQueueList);\n            this.skillQueuePage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.skillQueuePage.Location = new System.Drawing.Point(0, 0);\n            this.skillQueuePage.Name = \"skillQueuePage\";\n            this.skillQueuePage.Size = new System.Drawing.Size(568, 86);\n            this.skillQueuePage.TabIndex = 1;\n            this.skillQueuePage.Tag = \"SkillQueue\";\n            this.skillQueuePage.Text = \"skillQueuePage\";\n            // \n            // skillQueueList\n            // \n            this.skillQueueList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.skillQueueList.Location = new System.Drawing.Point(0, 0);\n            this.skillQueueList.Name = \"skillQueueList\";\n            this.skillQueueList.Size = new System.Drawing.Size(568, 86);\n            this.skillQueueList.TabIndex = 0;\n            // \n            // jobsPage\n            // \n            this.jobsPage.Controls.Add(this.jobsList);\n            this.jobsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.jobsPage.Location = new System.Drawing.Point(0, 0);\n            this.jobsPage.Name = \"jobsPage\";\n            this.jobsPage.Size = new System.Drawing.Size(608, 181);\n            this.jobsPage.TabIndex = 3;\n            this.jobsPage.Tag = \"IndustryJobs\";\n            this.jobsPage.Text = \"jobsPage\";\n            // \n            // jobsList\n            // \n            this.jobsList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.jobsList.Grouping = IndustryJobGrouping.State;\n            this.jobsList.Location = new System.Drawing.Point(0, 0);\n            this.jobsList.Name = \"jobsList\";\n            this.jobsList.Size = new System.Drawing.Size(608, 181);\n            this.jobsList.TabIndex = 0;\n            this.jobsList.TextFilter = \"\";\n            // \n            // researchPage\n            // \n            this.researchPage.Controls.Add(this.researchList);\n            this.researchPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.researchPage.Location = new System.Drawing.Point(0, 0);\n            this.researchPage.Name = \"researchPage\";\n            this.researchPage.Size = new System.Drawing.Size(568, 86);\n            this.researchPage.TabIndex = 4;\n            this.researchPage.Tag = \"ResearchPoints\";\n            this.researchPage.Text = \"researchPage\";\n            // \n            // researchList\n            // \n            this.researchList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.researchList.Grouping = null;\n            this.researchList.Location = new System.Drawing.Point(0, 0);\n            this.researchList.Name = \"researchList\";\n            this.researchList.Size = new System.Drawing.Size(568, 86);\n            this.researchList.TabIndex = 0;\n            this.researchList.TextFilter = \"\";\n            // \n            // mailMessagesPage\n            // \n            this.mailMessagesPage.Controls.Add(this.mailMessagesList);\n            this.mailMessagesPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.mailMessagesPage.Location = new System.Drawing.Point(0, 0);\n            this.mailMessagesPage.Name = \"mailMessagesPage\";\n            this.mailMessagesPage.Size = new System.Drawing.Size(608, 181);\n            this.mailMessagesPage.TabIndex = 5;\n            this.mailMessagesPage.Tag = \"MailMessages\";\n            this.mailMessagesPage.Text = \"mailMessagesPage\";\n            // \n            // mailMessagesList\n            // \n            this.mailMessagesList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.mailMessagesList.Grouping = EVEMailMessagesGrouping.State;\n            this.mailMessagesList.Location = new System.Drawing.Point(0, 0);\n            this.mailMessagesList.Name = \"mailMessagesList\";\n            this.mailMessagesList.Size = new System.Drawing.Size(608, 181);\n            this.mailMessagesList.TabIndex = 0;\n            this.mailMessagesList.TextFilter = \"\";\n            // \n            // eveNotificationsPage\n            // \n            this.eveNotificationsPage.Controls.Add(this.eveNotificationsList);\n            this.eveNotificationsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.eveNotificationsPage.Location = new System.Drawing.Point(0, 0);\n            this.eveNotificationsPage.Name = \"eveNotificationsPage\";\n            this.eveNotificationsPage.Size = new System.Drawing.Size(568, 86);\n            this.eveNotificationsPage.TabIndex = 6;\n            this.eveNotificationsPage.Tag = \"Notifications\";\n            this.eveNotificationsPage.Text = \"eveNotificationsPage\";\n            // \n            // eveNotificationsList\n            // \n            this.eveNotificationsList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.eveNotificationsList.Grouping = EVENotificationsGrouping.Type;\n            this.eveNotificationsList.Location = new System.Drawing.Point(0, 0);\n            this.eveNotificationsList.Name = \"eveNotificationsList\";\n            this.eveNotificationsList.Size = new System.Drawing.Size(568, 86);\n            this.eveNotificationsList.TabIndex = 0;\n            this.eveNotificationsList.TextFilter = \"\";\n            // \n            // employmentPage\n            // \n            this.employmentPage.Controls.Add(this.employmentList);\n            this.employmentPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.employmentPage.Location = new System.Drawing.Point(0, 0);\n            this.employmentPage.Name = \"employmentPage\";\n            this.employmentPage.Size = new System.Drawing.Size(568, 156);\n            this.employmentPage.TabIndex = 8;\n            this.employmentPage.Tag = \"EmploymentHistory\";\n            this.employmentPage.Text = \"employmentPage\";\n            // \n            // employmentList\n            // \n            this.employmentList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.employmentList.Location = new System.Drawing.Point(0, 0);\n            this.employmentList.Name = \"employmentList\";\n            this.employmentList.Size = new System.Drawing.Size(568, 156);\n            this.employmentList.TabIndex = 0;\n            // \n            // contractsPage\n            // \n            this.contractsPage.Controls.Add(this.contractsList);\n            this.contractsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.contractsPage.Location = new System.Drawing.Point(0, 0);\n            this.contractsPage.Name = \"contractsPage\";\n            this.contractsPage.Size = new System.Drawing.Size(564, 181);\n            this.contractsPage.TabIndex = 9;\n            this.contractsPage.Tag = \"Contracts\";\n            this.contractsPage.Text = \"contractsPage\";\n            // \n            // contractsList\n            // \n            this.contractsList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.contractsList.Grouping = ContractGrouping.State;\n            this.contractsList.Location = new System.Drawing.Point(0, 0);\n            this.contractsList.Name = \"contractsList\";\n            this.contractsList.Size = new System.Drawing.Size(564, 181);\n            this.contractsList.TabIndex = 0;\n            this.contractsList.TextFilter = \"\";\n            // \n            // assetsPage\n            // \n            this.assetsPage.Controls.Add(this.assetsList);\n            this.assetsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.assetsPage.Location = new System.Drawing.Point(0, 0);\n            this.assetsPage.Name = \"assetsPage\";\n            this.assetsPage.Size = new System.Drawing.Size(568, 308);\n            this.assetsPage.TabIndex = 10;\n            this.assetsPage.Tag = \"AssetList\";\n            this.assetsPage.Text = \"assetsPage\";\n            // \n            // assetsList\n            // \n            this.assetsList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.assetsList.Grouping = AssetGrouping.None;\n            this.assetsList.Location = new System.Drawing.Point(0, 0);\n            this.assetsList.Name = \"assetsList\";\n            this.assetsList.Size = new System.Drawing.Size(568, 308);\n            this.assetsList.TabIndex = 0;\n            this.assetsList.TextFilter = \"\";\n            // \n            // walletJournalPage\n            // \n            this.walletJournalPage.Controls.Add(this.walletJournalList);\n            this.walletJournalPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.walletJournalPage.Location = new System.Drawing.Point(0, 0);\n            this.walletJournalPage.Name = \"walletJournalPage\";\n            this.walletJournalPage.Size = new System.Drawing.Size(568, 86);\n            this.walletJournalPage.TabIndex = 11;\n            this.walletJournalPage.Tag = \"WalletJournal\";\n            this.walletJournalPage.Text = \"walletJournalPage\";\n            // \n            // walletJournalList\n            // \n            this.walletJournalList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.walletJournalList.Grouping = WalletJournalGrouping.None;\n            this.walletJournalList.Location = new System.Drawing.Point(0, 0);\n            this.walletJournalList.Name = \"walletJournalList\";\n            this.walletJournalList.Size = new System.Drawing.Size(568, 86);\n            this.walletJournalList.TabIndex = 0;\n            this.walletJournalList.TextFilter = \"\";\n            // \n            // walletTransactionsPage\n            // \n            this.walletTransactionsPage.Controls.Add(this.walletTransactionsList);\n            this.walletTransactionsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.walletTransactionsPage.Location = new System.Drawing.Point(0, 0);\n            this.walletTransactionsPage.Name = \"walletTransactionsPage\";\n            this.walletTransactionsPage.Size = new System.Drawing.Size(568, 86);\n            this.walletTransactionsPage.TabIndex = 12;\n            this.walletTransactionsPage.Tag = \"WalletTransactions\";\n            this.walletTransactionsPage.Text = \"walletTransactionsPage\";\n            // \n            // walletTransactionsList\n            // \n            this.walletTransactionsList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.walletTransactionsList.Grouping = WalletTransactionGrouping.None;\n            this.walletTransactionsList.Location = new System.Drawing.Point(0, 0);\n            this.walletTransactionsList.Name = \"walletTransactionsList\";\n            this.walletTransactionsList.Size = new System.Drawing.Size(568, 86);\n            this.walletTransactionsList.TabIndex = 0;\n            this.walletTransactionsList.TextFilter = \"\";\n            // \n            // factionalWarfareStatsPage\n            // \n            this.factionalWarfareStatsPage.Controls.Add(this.factionalWarfareStatsList);\n            this.factionalWarfareStatsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.factionalWarfareStatsPage.Location = new System.Drawing.Point(0, 0);\n            this.factionalWarfareStatsPage.Name = \"factionalWarfareStatsPage\";\n            this.factionalWarfareStatsPage.Size = new System.Drawing.Size(568, 156);\n            this.factionalWarfareStatsPage.TabIndex = 13;\n            this.factionalWarfareStatsPage.Tag = \"FactionalWarfareStats\";\n            this.factionalWarfareStatsPage.Text = \"factionalWarfareStatsPage\";\n            // \n            // factionalWarfareStatsList\n            // \n            this.factionalWarfareStatsList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.factionalWarfareStatsList.Location = new System.Drawing.Point(0, 0);\n            this.factionalWarfareStatsList.Name = \"factionalWarfareStatsList\";\n            this.factionalWarfareStatsList.Size = new System.Drawing.Size(568, 156);\n            this.factionalWarfareStatsList.TabIndex = 0;\n            // \n            // contactsPage\n            // \n            this.contactsPage.Controls.Add(this.contactsList);\n            this.contactsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.contactsPage.Location = new System.Drawing.Point(0, 0);\n            this.contactsPage.Name = \"contactsPage\";\n            this.contactsPage.Size = new System.Drawing.Size(564, 181);\n            this.contactsPage.TabIndex = 14;\n            this.contactsPage.Tag = \"ContactList\";\n            this.contactsPage.Text = \"contactsPage\";\n            // \n            // contactsList\n            // \n            this.contactsList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.contactsList.Location = new System.Drawing.Point(0, 0);\n            this.contactsList.Name = \"contactsList\";\n            this.contactsList.Size = new System.Drawing.Size(564, 181);\n            this.contactsList.TabIndex = 0;\n            // \n            // medalsPage\n            // \n            this.medalsPage.Controls.Add(this.medalsList);\n            this.medalsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.medalsPage.Location = new System.Drawing.Point(0, 0);\n            this.medalsPage.Name = \"medalsPage\";\n            this.medalsPage.Size = new System.Drawing.Size(608, 181);\n            this.medalsPage.TabIndex = 15;\n            this.medalsPage.Tag = \"Medals\";\n            this.medalsPage.Text = \"medalsPage\";\n            // \n            // medalsList\n            // \n            this.medalsList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.medalsList.Location = new System.Drawing.Point(0, 0);\n            this.medalsList.Name = \"medalsList\";\n            this.medalsList.Size = new System.Drawing.Size(608, 181);\n            this.medalsList.TabIndex = 0;\n            // \n            // killLogPage\n            // \n            this.killLogPage.Controls.Add(this.killLogList);\n            this.killLogPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.killLogPage.Location = new System.Drawing.Point(0, 0);\n            this.killLogPage.Name = \"killLogPage\";\n            this.killLogPage.Size = new System.Drawing.Size(608, 181);\n            this.killLogPage.TabIndex = 16;\n            this.killLogPage.Tag = \"KillLog\";\n            this.killLogPage.Text = \"killLogPage\";\n            // \n            // killLogList\n            // \n            this.killLogList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.killLogList.Location = new System.Drawing.Point(0, 0);\n            this.killLogList.Name = \"killLogList\";\n            this.killLogList.Size = new System.Drawing.Size(608, 181);\n            this.killLogList.TabIndex = 0;\n            this.killLogList.TextFilter = \"\";\n            // \n            // planetaryPage\n            // \n            this.planetaryPage.Controls.Add(this.planetaryList);\n            this.planetaryPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.planetaryPage.Location = new System.Drawing.Point(0, 0);\n            this.planetaryPage.Name = \"planetaryPage\";\n            this.planetaryPage.Size = new System.Drawing.Size(608, 181);\n            this.planetaryPage.TabIndex = 17;\n            this.planetaryPage.Tag = \"PlanetaryColonies\";\n            this.planetaryPage.Text = \"planetaryPage\";\n            // \n            // planetaryList\n            // \n            this.planetaryList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.planetaryList.Grouping = PlanetaryGrouping.Colony;\n            this.planetaryList.Location = new System.Drawing.Point(0, 0);\n            this.planetaryList.Name = \"planetaryList\";\n            this.planetaryList.Size = new System.Drawing.Size(608, 181);\n            this.planetaryList.TabIndex = 0;\n            this.planetaryList.TextFilter = \"\";\n            // \n            // warningLabel\n            // \n            this.warningLabel.AutoEllipsis = true;\n            this.warningLabel.BackColor = System.Drawing.Color.Black;\n            this.warningLabel.Dock = System.Windows.Forms.DockStyle.Top;\n            this.warningLabel.ForeColor = System.Drawing.Color.White;\n            this.warningLabel.Image = ((System.Drawing.Image)(resources.GetObject(\"warningLabel.Image\")));\n            this.warningLabel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            this.warningLabel.Location = new System.Drawing.Point(1, 1);\n            this.warningLabel.Name = \"warningLabel\";\n            this.warningLabel.Size = new System.Drawing.Size(608, 17);\n            this.warningLabel.TabIndex = 1;\n            this.warningLabel.Text = \"This character has no associated API key, data won\\'t be updated.\";\n            this.warningLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // notificationList\n            // \n            this.notificationList.Dock = System.Windows.Forms.DockStyle.Top;\n            this.notificationList.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.notificationList.Location = new System.Drawing.Point(2, 2);\n            this.notificationList.Margin = new System.Windows.Forms.Padding(0);\n            this.notificationList.Name = \"notificationList\";\n            this.notificationList.Size = new System.Drawing.Size(611, 72);\n            this.notificationList.TabIndex = 13;\n            // \n            // CharacterMonitorBody\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.borderPanel);\n            this.Controls.Add(this.toolstripPanel);\n            this.Name = \"CharacterMonitorBody\";\n            this.Size = new System.Drawing.Size(614, 331);\n            this.toolstripPanel.ResumeLayout(false);\n            this.toolstripPanel.PerformLayout();\n            this.toolStripContextual.ResumeLayout(false);\n            this.toolStripContextual.PerformLayout();\n            this.toolStripFeatures.ResumeLayout(false);\n            this.toolStripFeatures.PerformLayout();\n            this.borderPanel.ResumeLayout(false);\n            this.corePanel.ResumeLayout(false);\n            this.multiPanel.ResumeLayout(false);\n            this.loyaltyPage.ResumeLayout(false);\n            this.standingsPage.ResumeLayout(false);\n            this.skillsPage.ResumeLayout(false);\n            this.ordersPage.ResumeLayout(false);\n            this.skillQueuePage.ResumeLayout(false);\n            this.jobsPage.ResumeLayout(false);\n            this.researchPage.ResumeLayout(false);\n            this.mailMessagesPage.ResumeLayout(false);\n            this.eveNotificationsPage.ResumeLayout(false);\n            this.employmentPage.ResumeLayout(false);\n            this.contractsPage.ResumeLayout(false);\n            this.assetsPage.ResumeLayout(false);\n            this.walletJournalPage.ResumeLayout(false);\n            this.walletTransactionsPage.ResumeLayout(false);\n            this.factionalWarfareStatsPage.ResumeLayout(false);\n            this.contactsPage.ResumeLayout(false);\n            this.medalsPage.ResumeLayout(false);\n            this.killLogPage.ResumeLayout(false);\n            this.planetaryPage.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Panel toolstripPanel;\n        private System.Windows.Forms.ToolStrip toolStripContextual;\n        private System.Windows.Forms.ToolStripDropDownButton preferencesMenu;\n        private System.Windows.Forms.ToolStripMenuItem columnSettingsMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem autoSizeColumnMenuItem;\n        private System.Windows.Forms.ToolStripSeparator tsColumnSettingsSeparator;\n        private System.Windows.Forms.ToolStripMenuItem hideInactiveMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem numberAbsFormatMenuItem;\n        private System.Windows.Forms.ToolStripSeparator tsOptionsSeparator;\n        private System.Windows.Forms.ToolStripMenuItem showOnlyCharMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem showOnlyCorpMenuItem;\n        private System.Windows.Forms.ToolStripSeparator tsReadingPaneSeparator;\n        private System.Windows.Forms.ToolStripMenuItem readingPaneMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem paneRightMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem paneBottomMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem paneOffMenuItem;\n        private System.Windows.Forms.ToolStripTextBox searchTextBox;\n        private System.Windows.Forms.ToolStripDropDownButton groupMenu;\n        private System.Windows.Forms.ToolStripButton walletJournalCharts;\n        private System.Windows.Forms.ToolStrip toolStripFeatures;\n        private System.Windows.Forms.ToolStripButton skillsIcon;\n        private System.Windows.Forms.ToolStripButton skillQueueIcon;\n        private System.Windows.Forms.ToolStripButton employmentIcon;\n        private System.Windows.Forms.ToolStripButton standingsIcon;\n        private System.Windows.Forms.ToolStripButton factionalWarfareStatsIcon;\n        private System.Windows.Forms.ToolStripButton assetsIcon;\n        private System.Windows.Forms.ToolStripButton ordersIcon;\n        private System.Windows.Forms.ToolStripButton contractsIcon;\n        private System.Windows.Forms.ToolStripButton walletJournalIcon;\n        private System.Windows.Forms.ToolStripButton walletTransactionsIcon;\n        private System.Windows.Forms.ToolStripButton jobsIcon;\n        private System.Windows.Forms.ToolStripButton researchIcon;\n        private System.Windows.Forms.ToolStripButton mailMessagesIcon;\n        private System.Windows.Forms.ToolStripButton eveNotificationsIcon;\n        private System.Windows.Forms.ToolStripButton toggleSkillsIcon;\n        private System.Windows.Forms.ToolStripSeparator tsToggleSeparator;\n        private System.Windows.Forms.ToolStripDropDownButton featuresMenu;\n        private System.Windows.Forms.ToolStripMenuItem EnableAllToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem DisableAllToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator SelectionToolStripSeparator;\n        private System.Windows.Forms.ToolStripSeparator tsPagesSeparator;\n        private Common.Controls.BorderPanel borderPanel;\n        private System.Windows.Forms.Panel corePanel;\n        private Common.Controls.MultiPanel.MultiPanel multiPanel;\n        private Common.Controls.MultiPanel.MultiPanelPage standingsPage;\n        private CharacterStandingsList standingsList;\n        private Common.Controls.MultiPanel.MultiPanelPage skillsPage;\n        private CharacterSkillsList skillsList;\n        private Common.Controls.MultiPanel.MultiPanelPage ordersPage;\n        private CharacterMarketOrdersList ordersList;\n        private Common.Controls.MultiPanel.MultiPanelPage skillQueuePage;\n        private CharacterSkillsQueueList skillQueueList;\n        private Common.Controls.MultiPanel.MultiPanelPage jobsPage;\n        private CharacterIndustryJobsList jobsList;\n        private Common.Controls.MultiPanel.MultiPanelPage researchPage;\n        private CharacterResearchPointsList researchList;\n        private Common.Controls.MultiPanel.MultiPanelPage mailMessagesPage;\n        private CharacterEveMailMessagesList mailMessagesList;\n        private Common.Controls.MultiPanel.MultiPanelPage eveNotificationsPage;\n        private CharacterEveNotificationsList eveNotificationsList;\n        private Common.Controls.MultiPanel.MultiPanelPage employmentPage;\n        private CharacterEmploymentHistoryList employmentList;\n        private Common.Controls.MultiPanel.MultiPanelPage contractsPage;\n        private CharacterContractsList contractsList;\n        private Common.Controls.MultiPanel.MultiPanelPage assetsPage;\n        private CharacterAssetsList assetsList;\n        private Common.Controls.MultiPanel.MultiPanelPage walletJournalPage;\n        private CharacterWalletJournalList walletJournalList;\n        private Common.Controls.MultiPanel.MultiPanelPage walletTransactionsPage;\n        private CharacterWalletTransactionsList walletTransactionsList;\n        private Common.Controls.MultiPanel.MultiPanelPage factionalWarfareStatsPage;\n        private CharacterFactionalWarfareStatsList factionalWarfareStatsList;\n        private System.Windows.Forms.Label warningLabel;\n        private Controls.NotificationList notificationList;\n        private System.Windows.Forms.Timer searchTextTimer;\n        private System.Windows.Forms.ToolStripButton contactsIcon;\n        private Common.Controls.MultiPanel.MultiPanelPage contactsPage;\n        private CharacterContactList contactsList;\n        private System.Windows.Forms.ToolStripButton allContacts;\n        private System.Windows.Forms.ToolStripButton contactsExcellent;\n        private System.Windows.Forms.ToolStripButton contactsGood;\n        private System.Windows.Forms.ToolStripButton contactsNeutral;\n        private System.Windows.Forms.ToolStripButton contactsBad;\n        private System.Windows.Forms.ToolStripButton contactsTerrible;\n        private System.Windows.Forms.ToolStripButton inWatchList;\n        private System.Windows.Forms.ToolStripButton medalsIcon;\n        private System.Windows.Forms.ToolStripButton killLogIcon;\n        private System.Windows.Forms.ToolStripButton calendarEventsIcon;\n        private Common.Controls.MultiPanel.MultiPanelPage medalsPage;\n        private CharacterMedalsList medalsList;\n        private Common.Controls.MultiPanel.MultiPanelPage killLogPage;\n        private CharacterKillLogList killLogList;\n        private System.Windows.Forms.ToolStripSeparator combatLogSeparator;\n        private System.Windows.Forms.ToolStripMenuItem combatLogMenuItem;\n        private System.Windows.Forms.ToolStripButton searchTextDel;\n        private System.Windows.Forms.ToolStripButton planetaryIcon;\n        private Common.Controls.MultiPanel.MultiPanelPage planetaryPage;\n        private CharacterPlanetaryList planetaryList;\n        private System.Windows.Forms.ToolStripSeparator tsPlanetarySeparator;\n        private System.Windows.Forms.ToolStripMenuItem showOnlyExtractorMenuItem;\n        private System.Windows.Forms.ToolStripButton loyaltyIcon;\n        private Common.Controls.MultiPanel.MultiPanelPage loyaltyPage;\n        private CharacterLoyaltyList loyaltyList;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMonitorBody.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Controls.MultiPanel;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Notifications;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.DetailsWindow;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterMonitorBody : UserControl\n    {\n        #region Fields\n\n        private readonly List<ToolStripButton> m_advancedFeatures = new List<ToolStripButton>();\n        private ToolStripItem[] m_preferenceMenu;\n        private Character m_character;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CharacterMonitorBody\"/> class.\n        /// </summary>\n        public CharacterMonitorBody()\n        {\n            InitializeComponent();\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Occurs when control loads.\n        /// </summary>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            // Fonts\n            Font = FontFactory.GetFont(\"Tahoma\");\n\n            // We make a copy of the preference menu for later use\n            m_preferenceMenu = new ToolStripItem[preferencesMenu.DropDownItems.Count];\n            preferencesMenu.DropDownItems.CopyTo(m_preferenceMenu, 0);\n\n            multiPanel.SelectionChange += multiPanel_SelectionChange;\n\n            // Subscribe events\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.CharacterAssetsUpdated += EveMonClient_UpdatePageControls;\n            EveMonClient.MarketOrdersUpdated += EveMonClient_UpdatePageControls;\n            EveMonClient.ContractsUpdated += EveMonClient_UpdatePageControls;\n            EveMonClient.CharacterWalletJournalUpdated += EveMonClient_UpdatePageControls;\n            EveMonClient.CharacterWalletTransactionsUpdated += EveMonClient_UpdatePageControls;\n            EveMonClient.IndustryJobsUpdated += EveMonClient_UpdatePageControls;\n            EveMonClient.CharacterPlanetaryColoniesUpdated += EveMonClient_UpdatePageControls;\n            EveMonClient.CharacterResearchPointsUpdated += EveMonClient_UpdatePageControls;\n            EveMonClient.CharacterEVEMailMessagesUpdated += EveMonClient_UpdatePageControls;\n            EveMonClient.CharacterEVENotificationsUpdated += EveMonClient_UpdatePageControls;\n            EveMonClient.NotificationSent += EveMonClient_NotificationSent;\n            EveMonClient.NotificationInvalidated += EveMonClient_NotificationInvalidated;\n            Disposed += OnDisposed;\n\n\n            // Updates the controls\n            UpdateInfrequentControls();\n            UpdateNotifications();\n\n            // Picks the last selected page\n            multiPanel.SelectedPage = null;\n            ToolStripItem item = null;\n\n            // Only for CCP characters\n            if (m_character is CCPCharacter)\n            {\n                item = toolStripFeatures.Items.Cast<ToolStripItem>().FirstOrDefault(\n                    x => m_character.UISettings.SelectedPage == (string)x.Tag);\n\n                // If it's not an advanced feature page make it visible\n                if (item != null && !m_advancedFeatures.Contains(item))\n                    item.Visible = true;\n\n                // If it's an advanced feature page reset to skills page\n                if (item != null && m_advancedFeatures.Contains(item))\n                    item = skillsIcon;\n            }\n\n            toolbarIcon_Click(item ?? skillsIcon, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Occurs when visibility changes.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (DesignMode || this.IsDesignModeHosted() || !Visible)\n                return;\n\n            UpdateFrequentControls();\n            UpdateInfrequentControls();\n            UpdateFeaturesMenu();\n        }\n\n        /// <summary>\n        /// Called when the control is disposed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.ESIKeyInfoUpdated -= EveMonClient_APIKeyInfoUpdated;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.CharacterAssetsUpdated -= EveMonClient_UpdatePageControls;\n            EveMonClient.MarketOrdersUpdated -= EveMonClient_UpdatePageControls;\n            EveMonClient.ContractsUpdated -= EveMonClient_UpdatePageControls;\n            EveMonClient.CharacterWalletJournalUpdated -= EveMonClient_UpdatePageControls;\n            EveMonClient.CharacterWalletTransactionsUpdated -= EveMonClient_UpdatePageControls;\n            EveMonClient.IndustryJobsUpdated -= EveMonClient_UpdatePageControls;\n            EveMonClient.CharacterPlanetaryColoniesUpdated -= EveMonClient_UpdatePageControls;\n            EveMonClient.CharacterResearchPointsUpdated -= EveMonClient_UpdatePageControls;\n            EveMonClient.CharacterEVEMailMessagesUpdated -= EveMonClient_UpdatePageControls;\n            EveMonClient.CharacterEVENotificationsUpdated -= EveMonClient_UpdatePageControls;\n            EveMonClient.NotificationSent -= EveMonClient_NotificationSent;\n            EveMonClient.NotificationInvalidated -= EveMonClient_NotificationInvalidated;\n            Disposed -= OnDisposed;\n        }\n\n        #endregion\n\n\n        #region Update display methods on character change\n\n        /// <summary>\n        /// Updates the controls whos content changes frequently.\n        /// </summary>\n        private void UpdateFrequentControls()\n        {\n            SuspendLayout();\n            try\n            {\n                // Hides or shows the warning about a character with no API key\n                warningLabel.Visible = !m_character.Identity.ESIKeys.Any();\n            }\n            finally\n            {\n                ResumeLayout(false);\n                Refresh();\n            }\n        }\n\n        /// <summary>\n        /// Updates the controls whos content changes infrequently.\n        /// </summary>\n        private void UpdateInfrequentControls()\n        {\n            // No need to do anything when the control is not visible\n            if (!Visible)\n                return;\n\n            SuspendLayout();\n            try\n            {\n                // Reset the text filter\n                if (toolStripContextual.Visible)\n                    searchTextBox.Text = string.Empty;\n\n                // Read the settings\n                if (Settings.UI.SafeForWork)\n                {\n                    // Takes care of the features icons\n                    foreach (ToolStripItem item in toolStripFeatures.Items.Cast<ToolStripItem>().Where(\n                        item => item is ToolStripButton || item is ToolStripDropDownButton))\n                    {\n                        item.DisplayStyle = ToolStripItemDisplayStyle.Text;\n                    }\n\n                    // Takes care of the special second toolstrip icons \n                    foreach (ToolStripItem item in toolStripContextual.Items)\n                    {\n                        item.DisplayStyle = ToolStripItemDisplayStyle.Text;\n                    }\n\n                    return;\n                }\n\n                // Display image and text of the features according to user preference\n                foreach (ToolStripButton item in toolStripFeatures.Items.OfType<ToolStripButton>())\n                {\n                    item.DisplayStyle = ToolStripItemDisplayStyle.Image;\n                }\n\n                foreach (ToolStripButton item in toolStripContextual.Items.OfType<ToolStripButton>())\n                {\n                    item.DisplayStyle = ToolStripItemDisplayStyle.Image;\n                }\n\n                featuresMenu.DisplayStyle = ToolStripItemDisplayStyle.Image;\n\n                preferencesMenu.DisplayStyle = ToolStripItemDisplayStyle.Image;\n                groupMenu.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;\n            }\n            finally\n            {\n                ResumeLayout(false);\n                Refresh();\n            }\n        }\n\n        /// <summary>\n        /// Hides or shows the features menu.\n        /// </summary>\n        private void UpdateFeaturesMenu()\n        {\n            if (EveMonClient.ESIKeys.Any(apiKey => !apiKey.IsProcessed) || !m_character.Identity.ESIKeys.Any())\n                return;\n\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n            if (ccpCharacter == null)\n                return;\n\n            tsPagesSeparator.Visible = featuresMenu.Visible = true;\n            tsToggleSeparator.Visible = toggleSkillsIcon.Visible;\n            m_advancedFeatures.ForEach(SetVisibility);\n            ToggleAdvancedFeaturesMonitoring();\n            Refresh();\n        }\n\n        /// <summary>\n        /// Sets the button visibility.\n        /// </summary>\n        /// <param name=\"button\">The button.</param>\n        private void SetVisibility(ToolStripButton button)\n        {\n            IEnumerable<IQueryMonitor> monitors = GetButtonMonitors(button);\n            bool visible = monitors.Any(monitor => monitor.HasAccess) && IsEnabledFeature(button.Text);\n            button.Visible = visible;\n\n            // Quit if the button should stay visible\n            // (Do not use the buttons' 'Visible' property as condition,\n            // because there is a .NET bug when returning from minimized state) \n            if (visible)\n                return;\n\n            // Buttons' related monitor lost access to data while it was enabled, so...\n            // 1. Remove buttons' related page from settings\n            if (m_character.UISettings.AdvancedFeaturesEnabledPages.Contains(button.Text))\n                m_character.UISettings.AdvancedFeaturesEnabledPages.Remove(button.Text);\n\n            // 2. Uncheck in dropdown menu\n            if (featuresMenu.DropDownItems.Count == 0)\n                return;\n\n            int index = featuresMenu.DropDownItems.IndexOf(SelectionToolStripSeparator) + 1;\n\n            foreach (ToolStripMenuItem item in featuresMenu.DropDownItems.Cast<ToolStripItem>()\n                .Skip(index).Cast<ToolStripMenuItem>().Where(\n                    item => item.Text == button.Text && item.Checked))\n            {\n                item.Checked = !item.Checked;\n\n                // Update the selected page\n                UpdateSelectedPage();\n            }\n        }\n\n        /// <summary>\n        /// Hides or shows the pages controls.\n        /// </summary>\n        private void UpdatePageControls()\n        {\n            // No need to do anything when the control is not visible\n            if (!Visible)\n                return;\n\n            // Enables / Disables the skill page controls\n            toggleSkillsIcon.Enabled = m_character.Skills.Any();\n\n            // Exit if it's a non-CCPCharacter\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n            if (ccpCharacter == null)\n                return;\n\n            // Ensures the visibility of the toolstrip items\n            foreach (ToolStripItem item in toolStripContextual.Items)\n            {\n                item.Visible = true;\n            }\n\n            // Show the wallet journal charts button only when on wallet journal page\n            walletJournalCharts.Visible = multiPanel.SelectedPage == walletJournalPage;\n\n            // Show contacts buttons only when on contacts page\n            allContacts.Visible = contactsExcellent.Visible = multiPanel.SelectedPage == contactsPage;\n            contactsGood.Visible = contactsNeutral.Visible = multiPanel.SelectedPage == contactsPage;\n            contactsBad.Visible = contactsTerrible.Visible = inWatchList.Visible = multiPanel.SelectedPage == contactsPage;\n\n            // Enables / Disables the contacts page related controls\n            if (multiPanel.SelectedPage == contactsPage)\n            {\n                groupMenu.Visible = searchTextBox.Visible = searchTextDel.Visible = preferencesMenu.Visible = false;\n                toolStripContextual.Enabled = true;\n            }\n\n            // Enables / Disables the kill logs page related controls\n            if (multiPanel.SelectedPage == killLogPage)\n            {\n                groupMenu.Visible = false;\n                searchTextBox.Visible = searchTextDel.Visible = Settings.UI.MainWindow.CombatLog.ShowCondensedLogs;\n                toolStripContextual.Enabled = true;\n            }\n\n            // Enables / Disables the assets page related controls\n            if (multiPanel.SelectedPage == assetsPage)\n                toolStripContextual.Enabled = ccpCharacter.Assets.Any();\n\n            // Enables / Disables the market orders page related controls\n            if (multiPanel.SelectedPage == ordersPage)\n                toolStripContextual.Enabled = ccpCharacter.MarketOrders.Any();\n\n            // Enables / Disables the contracts page related controls\n            if (multiPanel.SelectedPage == contractsPage)\n                toolStripContextual.Enabled = ccpCharacter.Contracts.Any();\n\n            // Enables / Disables the wallet journal page related controls\n            if (multiPanel.SelectedPage == walletJournalPage)\n                toolStripContextual.Enabled = ccpCharacter.WalletJournal.Any();\n\n            // Enables / Disables the wallet transactions page related controls\n            if (multiPanel.SelectedPage == walletTransactionsPage)\n                toolStripContextual.Enabled = ccpCharacter.WalletTransactions.Any();\n\n            // Enables / Disables the industry jobs page related controls\n            if (multiPanel.SelectedPage == jobsPage)\n                toolStripContextual.Enabled = ccpCharacter.IndustryJobs.Any();\n\n            // Enables / Disables the planetary colonies page related controls\n            if (multiPanel.SelectedPage == planetaryPage)\n                toolStripContextual.Enabled = ccpCharacter.PlanetaryColonies.Any();\n\n            // Enables / Disables the research points page related controls\n            if (multiPanel.SelectedPage == researchPage)\n            {\n                groupMenu.Visible = false;\n                toolStripContextual.Enabled = ccpCharacter.ResearchPoints.Any();\n            }\n\n            // Enables / Disables the EVE mail messages page related controls\n            if (multiPanel.SelectedPage == mailMessagesPage)\n                toolStripContextual.Enabled = ccpCharacter.EVEMailMessages.Any();\n\n            // Enables / Disables the EVE notifications page related controls\n            if (multiPanel.SelectedPage == eveNotificationsPage)\n                toolStripContextual.Enabled = ccpCharacter.EVENotifications.Any();\n        }\n\n        /// <summary>\n        /// Toggles the advanced features monitoring.\n        /// </summary>\n        private void ToggleAdvancedFeaturesMonitoring()\n        {\n            // Quit if it's a non-CCPCharacter\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n            if (ccpCharacter == null)\n                return;\n\n            foreach (ToolStripButton button in m_advancedFeatures)\n            {\n                List<IQueryMonitor> monitors = GetButtonMonitors(button);\n\n                if (!monitors.Any())\n                    continue;\n\n                foreach (IQueryMonitor monitor in monitors)\n                {\n                    monitor.Enabled = IsEnabledFeature(button.Text);\n                    if (!monitor.QueryOnStartup || !monitor.Enabled || monitor.LastResult != null)\n                        continue;\n\n                    if (monitor.Method is ESIAPICharacterMethods &&\n                        (ESIAPICharacterMethods)monitor.Method == ESIAPICharacterMethods.FactionalWarfareStats &&\n                        ccpCharacter.IsFactionalWarfareNotEnlisted)\n                    {\n                        monitor.Enabled = !ccpCharacter.IsFactionalWarfareNotEnlisted;\n                        continue;\n                    }\n\n                    ccpCharacter.QueryMonitors.Query(monitor.Method);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Updates advanced features pages selection and settings.\n        /// </summary>\n        private void UpdateAdvancedFeaturesPagesSettings()\n        {\n            UpdateSelectedPage();\n\n            int index = featuresMenu.DropDownItems.IndexOf(SelectionToolStripSeparator) + 1;\n\n            List<string> enabledAdvancedFeaturesPages =\n                featuresMenu.DropDownItems.Cast<ToolStripItem>().Skip(index).Cast<ToolStripMenuItem>().Where(\n                    menuItem => menuItem.Checked).Select(menuItem => menuItem.Text).ToList();\n\n            m_character.UISettings.AdvancedFeaturesEnabledPages.Clear();\n            enabledAdvancedFeaturesPages.ForEach(page => m_character.UISettings.AdvancedFeaturesEnabledPages.Add(page));\n        }\n\n        /// <summary>\n        /// Updates the selected page.\n        /// </summary>\n        private void UpdateSelectedPage()\n        {\n            if (m_advancedFeatures.Any(featureIcon =>\n                multiPanel.SelectedPage.Text == (string)featureIcon.Tag && !featureIcon.Visible))\n            {\n                toolbarIcon_Click(skillsIcon, EventArgs.Empty);\n            }\n        }\n\n        /// <summary>\n        /// Update the notifications list.\n        /// </summary>\n        private void UpdateNotifications()\n        {\n            notificationList.Notifications = EveMonClient.Notifications.Where(x => x.Sender == m_character);\n            Refresh();\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Occur on every second.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            UpdateFrequentControls();\n        }\n\n        /// <summary>\n        /// When the API key info updates, update the features menu.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_APIKeyInfoUpdated(object sender, EventArgs e)\n        {\n            UpdateFeaturesMenu();\n        }\n\n        /// <summary>\n        /// Updates the controls on settings change.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateInfrequentControls();\n        }\n\n        /// <summary>\n        /// Updates the page controls on an event.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_UpdatePageControls(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != m_character)\n                return;\n\n            UpdatePageControls();\n        }\n\n        /// <summary>\n        /// Update the notifications list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.Notifications.NotificationInvalidationEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_NotificationInvalidated(object sender, NotificationInvalidationEventArgs e)\n        {\n            UpdateNotifications();\n        }\n\n        /// <summary>\n        /// Update the notifications list.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The e.</param>\n        private void EveMonClient_NotificationSent(object sender, NotificationEventArgs e)\n        {\n            UpdateNotifications();\n        }\n\n        #endregion\n\n\n        #region Local Events\n\n\n        #region Features Toolstrip Controls Event Handlers\n\n        /// <summary>\n        /// When the selected page changes, we may have to update the related controls visibility.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MultiPanelSelectionChangeEventArgs\"/> instance containing the event data.</param>\n        private void multiPanel_SelectionChange(object sender, MultiPanelSelectionChangeEventArgs e)\n        {\n            if (e.NewPage == null)\n                return;\n\n            // Stores the setting\n            m_character.UISettings.SelectedPage = e.NewPage.Text;\n\n            // Update the buttons visibility\n            toggleSkillsIcon.Visible = e.NewPage == skillsPage;\n            tsPagesSeparator.Visible = featuresMenu.Visible;\n            tsToggleSeparator.Visible = toggleSkillsIcon.Visible;\n            toolStripContextual.Visible = m_advancedFeatures.Any(button => (string)button.Tag != standingsPage.Text &&\n                                                                           (string)button.Tag != factionalWarfareStatsPage.Text &&\n                                                                           (string)button.Tag != medalsPage.Text &&\n                                                                           (string)button.Tag != loyaltyPage.Text &&\n                                                                           (string)button.Tag == e.NewPage.Text);\n\n            // Reset the text filter\n            searchTextBox.Text = string.Empty;\n\n            // Update the page controls\n            UpdatePageControls();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the toolbarIcon control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void toolbarIcon_Click(object sender, EventArgs e)\n        {\n            foreach (ToolStripItem item in toolStripFeatures.Items)\n            {\n                // Skip tags without tag, those ones do not represent \"pages switches\"\n                if (item.Tag == null)\n                    continue;\n\n                // Is it the item we clicked ?\n                ToolStripButton button = item as ToolStripButton;\n                if (button != null && item == sender)\n                {\n                    // Page is already selected\n                    if (button.Checked && multiPanel.SelectedPage != null)\n                        continue;\n\n                    // Selects the proper page\n                    multiPanel.SelectedPage =\n                        multiPanel.Controls.Cast<MultiPanelPage>().First(x => x.Name == (string)item.Tag);\n\n                    // Checks it\n                    button.Checked = true;\n                }\n                // Or another one representing another page ?\n                else if (button != null)\n                {\n                    // Unchecks it\n                    button.Checked = false;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Toggles all the skill groups to collapse or open.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void toggleSkillsIcon_Click(object sender, EventArgs e)\n        {\n            skillsList.ToggleAll();\n        }\n\n        /// <summary>\n        /// On menu opening we create the menu items and update their checked state.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void featureMenu_DropDownOpening(object sender, EventArgs e)\n        {\n            // Remove everything after the separator\n            int index = featuresMenu.DropDownItems.IndexOf(SelectionToolStripSeparator) + 1;\n            while (featuresMenu.DropDownItems.Count > index)\n            {\n                featuresMenu.DropDownItems.RemoveAt(index);\n            }\n\n            // Create the menu items\n            List<ToolStripMenuItem> toolStripMenuItems = m_advancedFeatures\n                .Select(button => new { button, monitor = GetButtonMonitors(button) })\n                .Where(item => item.monitor != null\n                               && multiPanel.Controls.OfType<MultiPanelPage>().Any(page => page.Name == (string)item.button.Tag))\n                .Select(item =>\n                {\n                    ToolStripMenuItem tsmi;\n                    ToolStripMenuItem tempToolStripMenuItem = null;\n                    try\n                    {\n                        tempToolStripMenuItem = new ToolStripMenuItem(item.button.Text)\n                        {\n                            Checked = IsEnabledFeature(item.button.Text),\n                            Enabled = item.monitor.Any(monitor => monitor.HasAccess)\n                        };\n\n                        tsmi = tempToolStripMenuItem;\n                        tempToolStripMenuItem = null;\n                    }\n                    finally\n                    {\n                        tempToolStripMenuItem?.Dispose();\n                    }\n                    return tsmi;\n                }).ToList();\n\n            // Add items to dropdown menu\n            featuresMenu.DropDownItems.AddRange(toolStripMenuItems.ToArray<ToolStripItem>());\n\n            // Enable/Disable the \"Enable All / Disable All\" controls\n            EnableAllToolStripMenuItem.Enabled = toolStripMenuItems.Where(item => item.Enabled).Any(item => !item.Checked);\n            DisableAllToolStripMenuItem.Enabled = toolStripMenuItems.Where(item => item.Enabled).Any(item => item.Checked);\n        }\n\n        /// <summary>\n        /// Occurs when the user click an item in the features menu.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void featuresMenu_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)\n        {\n            ToolStripMenuItem item = (ToolStripMenuItem)e.ClickedItem;\n\n            if (item.Equals(EnableAllToolStripMenuItem) || item.Equals(DisableAllToolStripMenuItem))\n                return;\n\n            item.Checked = !item.Checked;\n\n            m_advancedFeatures.ForEach(featureIcon => featureIcon.Visible = item.Text == featureIcon.Text\n                ? item.Checked\n                : featureIcon.Visible);\n\n            UpdateAdvancedFeaturesPagesSettings();\n            ToggleAdvancedFeaturesMonitoring();\n        }\n\n        /// <summary>\n        /// Occurs when the user click the 'Enable All' menu item in features menu.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EnableAllToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            int index = featuresMenu.DropDownItems.IndexOf(SelectionToolStripSeparator) + 1;\n            foreach (ToolStripMenuItem item in featuresMenu.DropDownItems.Cast<ToolStripItem>()\n                .Skip(index).Cast<ToolStripMenuItem>().Where(item => item.Enabled))\n            {\n                item.Checked = true;\n                m_advancedFeatures.First(featureIcon => item.Text == featureIcon.Text).Visible = true;\n            }\n\n            UpdateAdvancedFeaturesPagesSettings();\n            ToggleAdvancedFeaturesMonitoring();\n        }\n\n        /// <summary>\n        /// Occurs when the user click the 'Disable All' menu item in features menu.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void DisableAllToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            int index = featuresMenu.DropDownItems.IndexOf(SelectionToolStripSeparator) + 1;\n            foreach (ToolStripMenuItem item in featuresMenu.DropDownItems.Cast<ToolStripItem>()\n                .Skip(index).Cast<ToolStripMenuItem>().Where(item => item.Enabled))\n            {\n                item.Checked = false;\n                m_advancedFeatures.First(featureIcon => item.Text == featureIcon.Text).Visible = false;\n            }\n\n            UpdateAdvancedFeaturesPagesSettings();\n            ToggleAdvancedFeaturesMonitoring();\n        }\n\n        #endregion\n\n\n        #region Contextual Toolstip Controls Event Handlers\n\n\n        #region WalletJournal Control Event Handlers\n\n        /// <summary>\n        /// Handles the Click event of the walletJournalCharts control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void walletJournalCharts_Click(object sender, EventArgs e)\n        {\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n            if (ccpCharacter == null)\n                return;\n\n            WindowsFactory.ShowByTag<WalletJournalChartWindow, CCPCharacter>(ccpCharacter);\n        }\n\n        #endregion\n\n\n        #region Contacts Control Event Handlers\n\n        /// <summary>\n        /// Handles the Click event of the contactsToolbarIcon control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void contactsToolbarIcon_Click(object sender, EventArgs e)\n        {\n            foreach (ToolStripButton item in toolStripContextual.Items.OfType<ToolStripButton>())\n            {\n                item.Checked = item == sender;\n            }\n\n            contactsList.ShowAllContacts = sender.Equals(allContacts);\n            contactsList.ShowContactsInWatchList = sender.Equals(inWatchList);\n\n            if (sender.Equals(contactsExcellent))\n                contactsList.ShowContactsWithStandings = StandingStatus.Excellent;\n\n            if (sender.Equals(contactsGood))\n                contactsList.ShowContactsWithStandings = StandingStatus.Good;\n\n            if (sender.Equals(contactsNeutral))\n                contactsList.ShowContactsWithStandings = StandingStatus.Neutral;\n\n            if (sender.Equals(contactsBad))\n                contactsList.ShowContactsWithStandings = StandingStatus.Bad;\n\n            if (sender.Equals(contactsTerrible))\n                contactsList.ShowContactsWithStandings = StandingStatus.Terrible;\n\n            contactsList.UpdateContent();\n        }\n\n        #endregion\n\n\n        #region GroupBy Control Event Handlers\n\n        /// <summary>\n        /// On opening we create the menu items for \"Group By...\" in panel.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void groupMenu_DropDownOpening(object sender, EventArgs e)\n        {\n            groupMenu.DropDownItems.Clear();\n\n            if (multiPanel.SelectedPage == assetsPage)\n                CreateGroupMenuList<AssetGrouping, Enum>(assetsList);\n\n            if (multiPanel.SelectedPage == ordersPage)\n                CreateGroupMenuList<MarketOrderGrouping, Enum>(ordersList);\n\n            if (multiPanel.SelectedPage == contractsPage)\n                CreateGroupMenuList<ContractGrouping, Enum>(contractsList);\n\n            if (multiPanel.SelectedPage == walletJournalPage)\n                CreateGroupMenuList<WalletJournalGrouping, Enum>(walletJournalList);\n\n            if (multiPanel.SelectedPage == walletTransactionsPage)\n                CreateGroupMenuList<WalletTransactionGrouping, Enum>(walletTransactionsList);\n\n            if (multiPanel.SelectedPage == jobsPage)\n                CreateGroupMenuList<IndustryJobGrouping, Enum>(jobsList);\n\n            if (multiPanel.SelectedPage == planetaryPage)\n                CreateGroupMenuList<PlanetaryGrouping, Enum>(planetaryList);\n\n            if (multiPanel.SelectedPage == mailMessagesPage)\n                CreateGroupMenuList<EVEMailMessagesGrouping, Enum>(mailMessagesList);\n\n            if (multiPanel.SelectedPage == eveNotificationsPage)\n                CreateGroupMenuList<EVENotificationsGrouping, Enum>(eveNotificationsList);\n        }\n\n        /// <summary>\n        /// Occurs when the user click an item in the \"Group By...\" menu.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.ToolStripItemClickedEventArgs\"/> instance containing the event data.</param>\n        private void groupMenu_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)\n        {\n            ToolStripItem item = e.ClickedItem;\n\n            if (multiPanel.SelectedPage == assetsPage)\n                GroupMenuSetting<AssetGrouping, Enum>(item, assetsList);\n\n            if (multiPanel.SelectedPage == ordersPage)\n                GroupMenuSetting<MarketOrderGrouping, Enum>(item, ordersList);\n\n            if (multiPanel.SelectedPage == contractsPage)\n                GroupMenuSetting<ContractGrouping, Enum>(item, contractsList);\n\n            if (multiPanel.SelectedPage == walletJournalPage)\n                GroupMenuSetting<WalletJournalGrouping, Enum>(item, walletJournalList);\n\n            if (multiPanel.SelectedPage == walletTransactionsPage)\n                GroupMenuSetting<WalletTransactionGrouping, Enum>(item, walletTransactionsList);\n\n            if (multiPanel.SelectedPage == jobsPage)\n                GroupMenuSetting<IndustryJobGrouping, Enum>(item, jobsList);\n\n            if (multiPanel.SelectedPage == planetaryPage)\n                GroupMenuSetting<PlanetaryGrouping, Enum>(item, planetaryList);\n\n            if (multiPanel.SelectedPage == mailMessagesPage)\n                GroupMenuSetting<EVEMailMessagesGrouping, Enum>(item, mailMessagesList);\n\n            if (multiPanel.SelectedPage == eveNotificationsPage)\n                GroupMenuSetting<EVENotificationsGrouping, Enum>(item, eveNotificationsList);\n        }\n\n        #endregion\n\n\n        #region Search Control Event Handlers\n\n        /// <summary>\n        /// Occurs when the search text changes.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void searchTextBox_TextChanged(object sender, EventArgs e)\n        {\n            if (searchTextTimer == null)\n            {\n                UpdateListSearchTextFilter();\n                return;\n            }\n\n            if (searchTextTimer.Enabled)\n                searchTextTimer.Stop();\n\n            searchTextTimer.Start();\n        }\n\n        /// <summary>\n        /// Handles the Tick event of the searchTextTimer control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void searchTextTimer_Tick(object sender, EventArgs e)\n        {\n            searchTextTimer.Stop();\n            UpdateListSearchTextFilter();\n        }\n\n        /// <summary>\n        /// Handles the MouseUp event of the searchTextDel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void searchTextDel_MouseUp(object sender, MouseEventArgs e)\n        {\n            searchTextBox.Clear();\n        }\n\n        #endregion\n\n\n        #region Preferences Controls Event Handlers\n\n        /// <summary>\n        /// On menu opening we update the menu items.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void preferencesMenu_DropDownOpening(object sender, EventArgs e)\n        {\n            bool hideInactive = true;\n            autoSizeColumnMenuItem.Enabled = true;\n\n            if (multiPanel.SelectedPage == killLogPage)\n            {\n                preferencesMenu.DropDownItems.Clear();\n                preferencesMenu.DropDownItems.Add(autoSizeColumnMenuItem);\n                preferencesMenu.DropDownItems.Add(combatLogSeparator);\n                preferencesMenu.DropDownItems.Add(combatLogMenuItem);\n\n                combatLogMenuItem.Checked = Settings.UI.MainWindow.CombatLog.ShowCondensedLogs;\n                autoSizeColumnMenuItem.Enabled = combatLogMenuItem.Checked;\n            }\n\n            if (multiPanel.SelectedPage == assetsPage || multiPanel.SelectedPage == walletJournalPage\n                || multiPanel.SelectedPage == walletTransactionsPage)\n            {\n                bool numberFormat = Settings.UI.MainWindow.Assets.NumberAbsFormat;\n\n                preferencesMenu.DropDownItems.Clear();\n                foreach (ToolStripItem item in m_preferenceMenu.Where(\n                    item => !item.Equals(hideInactiveMenuItem) && !item.Equals(tsOptionsSeparator) &&\n                            !item.Equals(showOnlyCharMenuItem) && !item.Equals(showOnlyCorpMenuItem) &&\n                            !item.Equals(tsReadingPaneSeparator) && !item.Equals(readingPaneMenuItem) &&\n                            !item.Equals(combatLogSeparator) && !item.Equals(combatLogMenuItem) &&\n                            !item.Equals(tsPlanetarySeparator) && !item.Equals(showOnlyExtractorMenuItem)))\n                {\n                    preferencesMenu.DropDownItems.Add(item);\n                }\n\n                numberAbsFormatMenuItem.Text = numberFormat ? \"Full Number Format\" : \"Abbreviating Number Format\";\n            }\n\n            if (multiPanel.SelectedPage == ordersPage)\n            {\n                bool numberFormat = Settings.UI.MainWindow.MarketOrders.NumberAbsFormat;\n                hideInactive = Settings.UI.MainWindow.MarketOrders.HideInactiveOrders;\n\n                preferencesMenu.DropDownItems.Clear();\n                foreach (ToolStripItem item in m_preferenceMenu.Where(\n                    item => !item.Equals(tsReadingPaneSeparator) && !item.Equals(readingPaneMenuItem) &&\n                            !item.Equals(combatLogSeparator) && !item.Equals(combatLogMenuItem) &&\n                            !item.Equals(tsPlanetarySeparator) && !item.Equals(showOnlyExtractorMenuItem)))\n                {\n                    preferencesMenu.DropDownItems.Add(item);\n                }\n\n                numberAbsFormatMenuItem.Text = numberFormat ? \"Full Number Format\" : \"Abbreviating Number Format\";\n                showOnlyCharMenuItem.Checked = ordersList.ShowIssuedFor == IssuedFor.Character;\n                showOnlyCorpMenuItem.Checked = ordersList.ShowIssuedFor == IssuedFor.Corporation;\n            }\n\n            if (multiPanel.SelectedPage == contractsPage)\n            {\n                bool numberFormat = Settings.UI.MainWindow.Contracts.NumberAbsFormat;\n                hideInactive = Settings.UI.MainWindow.Contracts.HideInactiveContracts;\n\n                preferencesMenu.DropDownItems.Clear();\n                foreach (ToolStripItem item in m_preferenceMenu.Where(\n                    item => !item.Equals(tsReadingPaneSeparator) && !item.Equals(readingPaneMenuItem) &&\n                            !item.Equals(combatLogSeparator) && !item.Equals(combatLogMenuItem) &&\n                            !item.Equals(tsPlanetarySeparator) && !item.Equals(showOnlyExtractorMenuItem)))\n                {\n                    preferencesMenu.DropDownItems.Add(item);\n                }\n\n                numberAbsFormatMenuItem.Text = numberFormat ? \"Full Number Format\" : \"Abbreviating Number Format\";\n                showOnlyCharMenuItem.Checked = contractsList.ShowIssuedFor == IssuedFor.Character;\n                showOnlyCorpMenuItem.Checked = contractsList.ShowIssuedFor == IssuedFor.Corporation;\n            }\n\n            if (multiPanel.SelectedPage == jobsPage)\n            {\n                hideInactive = Settings.UI.MainWindow.IndustryJobs.HideInactiveJobs;\n\n                preferencesMenu.DropDownItems.Clear();\n                foreach (ToolStripItem item in m_preferenceMenu.Where(\n                    item => !item.Equals(numberAbsFormatMenuItem) && !item.Equals(tsReadingPaneSeparator) &&\n                            !item.Equals(readingPaneMenuItem) && !item.Equals(combatLogSeparator) &&\n                            !item.Equals(combatLogMenuItem) && !item.Equals(tsPlanetarySeparator) &&\n                            !item.Equals(showOnlyExtractorMenuItem)))\n                {\n                    preferencesMenu.DropDownItems.Add(item);\n                }\n\n                showOnlyCharMenuItem.Checked = jobsList.ShowIssuedFor == IssuedFor.Character;\n                showOnlyCorpMenuItem.Checked = jobsList.ShowIssuedFor == IssuedFor.Corporation;\n            }\n\n            if (multiPanel.SelectedPage == planetaryPage)\n            {\n                preferencesMenu.DropDownItems.Clear();\n                preferencesMenu.DropDownItems.Add(columnSettingsMenuItem);\n                preferencesMenu.DropDownItems.Add(autoSizeColumnMenuItem);\n                preferencesMenu.DropDownItems.Add(tsPlanetarySeparator);\n                preferencesMenu.DropDownItems.Add(showOnlyExtractorMenuItem);\n                showOnlyExtractorMenuItem.Checked = Settings.UI.MainWindow.Planetary.ShowEcuOnly;\n\n                return;\n            }\n\n            if (multiPanel.SelectedPage == researchPage)\n            {\n                preferencesMenu.DropDownItems.Clear();\n                preferencesMenu.DropDownItems.Add(columnSettingsMenuItem);\n                preferencesMenu.DropDownItems.Add(autoSizeColumnMenuItem);\n                return;\n            }\n\n            if (multiPanel.SelectedPage == mailMessagesPage || multiPanel.SelectedPage == eveNotificationsPage)\n            {\n                preferencesMenu.DropDownItems.Clear();\n                preferencesMenu.DropDownItems.Add(columnSettingsMenuItem);\n                preferencesMenu.DropDownItems.Add(autoSizeColumnMenuItem);\n                preferencesMenu.DropDownItems.Add(tsReadingPaneSeparator);\n                preferencesMenu.DropDownItems.Add(readingPaneMenuItem);\n                return;\n            }\n\n            hideInactiveMenuItem.Text = hideInactive ? \"Unhide Inactive\" : \"Hide Inactive\";\n        }\n\n        /// <summary>\n        /// Display the window to select columns.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void columnSettingsMenuItem_Click(object sender, EventArgs e)\n        {\n            if (multiPanel.SelectedPage == assetsPage)\n            {\n                using (AssetsColumnsSelectWindow f =\n                    new AssetsColumnsSelectWindow(assetsList.Columns.Cast<AssetColumnSettings>()))\n                {\n                    DialogResult dr = f.ShowDialog();\n                    if (dr == DialogResult.OK)\n                    {\n                        assetsList.Columns = f.Columns;\n                        Settings.UI.MainWindow.Assets.Columns.Clear();\n                        Settings.UI.MainWindow.Assets.Columns.AddRange(assetsList.Columns.Cast<AssetColumnSettings>());\n                    }\n                }\n            }\n\n            if (multiPanel.SelectedPage == ordersPage)\n            {\n                using (MarketOrdersColumnsSelectWindow f =\n                    new MarketOrdersColumnsSelectWindow(ordersList.Columns.Cast<MarketOrderColumnSettings>()))\n                {\n                    DialogResult dr = f.ShowDialog();\n                    if (dr == DialogResult.OK)\n                    {\n                        ordersList.Columns = f.Columns;\n                        Settings.UI.MainWindow.MarketOrders.Columns.Clear();\n                        Settings.UI.MainWindow.MarketOrders.Columns.AddRange(ordersList.Columns.Cast<MarketOrderColumnSettings>());\n                    }\n                }\n            }\n\n            if (multiPanel.SelectedPage == contractsPage)\n            {\n                using (ContractsColumnsSelectWindow f =\n                    new ContractsColumnsSelectWindow(contractsList.Columns.Cast<ContractColumnSettings>()))\n                {\n                    DialogResult dr = f.ShowDialog();\n                    if (dr == DialogResult.OK)\n                    {\n                        contractsList.Columns = f.Columns;\n                        Settings.UI.MainWindow.Contracts.Columns.Clear();\n                        Settings.UI.MainWindow.Contracts.Columns.AddRange(contractsList.Columns.Cast<ContractColumnSettings>());\n                    }\n                }\n            }\n\n            if (multiPanel.SelectedPage == walletJournalPage)\n            {\n                using (WalletJournalColumnsSelectWindow f =\n                    new WalletJournalColumnsSelectWindow(walletJournalList.Columns.Cast<WalletJournalColumnSettings>()))\n                {\n                    DialogResult dr = f.ShowDialog();\n                    if (dr == DialogResult.OK)\n                    {\n                        walletJournalList.Columns = f.Columns;\n                        Settings.UI.MainWindow.WalletJournal.Columns.Clear();\n                        Settings.UI.MainWindow.WalletJournal.Columns.AddRange(\n                            walletJournalList.Columns.Cast<WalletJournalColumnSettings>());\n                    }\n                }\n            }\n\n            if (multiPanel.SelectedPage == walletTransactionsPage)\n            {\n                using (WalletTransactionsColumnsSelectWindow f = new WalletTransactionsColumnsSelectWindow(\n                    walletTransactionsList.Columns.Cast<WalletTransactionColumnSettings>()))\n                {\n                    DialogResult dr = f.ShowDialog();\n                    if (dr == DialogResult.OK)\n                    {\n                        walletTransactionsList.Columns = f.Columns;\n                        Settings.UI.MainWindow.WalletTransactions.Columns.Clear();\n                        Settings.UI.MainWindow.WalletTransactions.Columns.AddRange(\n                            walletTransactionsList.Columns.Cast<WalletTransactionColumnSettings>());\n                    }\n                }\n            }\n\n            if (multiPanel.SelectedPage == jobsPage)\n            {\n                using (IndustryJobsColumnsSelectWindow f =\n                    new IndustryJobsColumnsSelectWindow(jobsList.Columns.Cast<IndustryJobColumnSettings>()))\n                {\n                    DialogResult dr = f.ShowDialog();\n                    if (dr == DialogResult.OK)\n                    {\n                        jobsList.Columns = f.Columns;\n                        Settings.UI.MainWindow.IndustryJobs.Columns.Clear();\n                        Settings.UI.MainWindow.IndustryJobs.Columns.AddRange(jobsList.Columns.Cast<IndustryJobColumnSettings>());\n                    }\n                }\n            }\n\n            if (multiPanel.SelectedPage == planetaryPage)\n            {\n                using (PlanetaryColumnsSelectWindow f =\n                    new PlanetaryColumnsSelectWindow(planetaryList.Columns.Cast<PlanetaryColumnSettings>()))\n                {\n                    DialogResult dr = f.ShowDialog();\n                    if (dr == DialogResult.OK)\n                    {\n                        planetaryList.Columns = f.Columns;\n                        Settings.UI.MainWindow.Planetary.Columns.Clear();\n                        Settings.UI.MainWindow.Planetary.Columns.AddRange(planetaryList.Columns.Cast<PlanetaryColumnSettings>());\n                    }\n                }\n            }\n\n            if (multiPanel.SelectedPage == researchPage)\n            {\n                using (ResearchColumnsSelectWindow f =\n                    new ResearchColumnsSelectWindow(researchList.Columns.Cast<ResearchColumnSettings>()))\n                {\n                    DialogResult dr = f.ShowDialog();\n                    if (dr == DialogResult.OK)\n                    {\n                        researchList.Columns = f.Columns;\n                        Settings.UI.MainWindow.Research.Columns.Clear();\n                        Settings.UI.MainWindow.Research.Columns.AddRange(researchList.Columns.Cast<ResearchColumnSettings>());\n                    }\n                }\n            }\n\n            if (multiPanel.SelectedPage == mailMessagesPage)\n            {\n                using (EveMailMessagesColumnsSelectWindow f =\n                    new EveMailMessagesColumnsSelectWindow(mailMessagesList.Columns.Cast<EveMailMessageColumnSettings>()))\n                {\n                    DialogResult dr = f.ShowDialog();\n                    if (dr == DialogResult.OK)\n                    {\n                        mailMessagesList.Columns = f.Columns;\n                        Settings.UI.MainWindow.EVEMailMessages.Columns.Clear();\n                        Settings.UI.MainWindow.EVEMailMessages.Columns.AddRange(\n                            mailMessagesList.Columns.Cast<EveMailMessageColumnSettings>());\n                    }\n                }\n            }\n\n            if (multiPanel.SelectedPage == eveNotificationsPage)\n            {\n                using (EveNotificationsColumnsSelectWindow f =\n                    new EveNotificationsColumnsSelectWindow(eveNotificationsList.Columns.Cast<EveNotificationColumnSettings>()))\n                {\n                    DialogResult dr = f.ShowDialog();\n                    if (dr == DialogResult.OK)\n                    {\n                        eveNotificationsList.Columns = f.Columns;\n                        Settings.UI.MainWindow.EVENotifications.Columns.Clear();\n                        Settings.UI.MainWindow.EVENotifications.Columns.AddRange(\n                            eveNotificationsList.Columns.Cast<EveNotificationColumnSettings>());\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Auto-Sizes the columns width of the page list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void autoSizeColumnMenuItem_Click(object sender, EventArgs e)\n        {\n            IListView list = multiPanel.SelectedPage.Controls.OfType<IListView>().FirstOrDefault();\n\n            list?.AutoResizeColumns();\n        }\n\n        /// <summary>\n        /// Hide/Show the inactive entries.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void hideInactiveMenuItem_Click(object sender, EventArgs e)\n        {\n            bool hideInactive = true;\n\n            if (multiPanel.SelectedPage == ordersPage)\n            {\n                hideInactive = Settings.UI.MainWindow.MarketOrders.HideInactiveOrders;\n                Settings.UI.MainWindow.MarketOrders.HideInactiveOrders = !hideInactive;\n                ordersList.UpdateColumns();\n            }\n\n            if (multiPanel.SelectedPage == contractsPage)\n            {\n                hideInactive = Settings.UI.MainWindow.Contracts.HideInactiveContracts;\n                Settings.UI.MainWindow.Contracts.HideInactiveContracts = !hideInactive;\n                contractsList.UpdateColumns();\n            }\n\n            if (multiPanel.SelectedPage == jobsPage)\n            {\n                hideInactive = Settings.UI.MainWindow.IndustryJobs.HideInactiveJobs;\n                Settings.UI.MainWindow.IndustryJobs.HideInactiveJobs = !hideInactive;\n                jobsList.UpdateColumns();\n            }\n            hideInactiveMenuItem.Text = !hideInactive ? \"Unhide Inactive\" : \"Hide Inactive\";\n        }\n\n        /// <summary>\n        /// Switches between Abbreviating/Full number format.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private async void numberAbsFormatMenuItem_Click(object sender, EventArgs e)\n        {\n            if (multiPanel.SelectedPage == assetsPage)\n            {\n                bool numberFormat = Settings.UI.MainWindow.Assets.NumberAbsFormat;\n                numberAbsFormatMenuItem.Text = !numberFormat ? \"Number Full Format\" : \"Number Abbreviating Format\";\n                Settings.UI.MainWindow.Assets.NumberAbsFormat = !numberFormat;\n                await assetsList.UpdateColumnsAsync();\n            }\n\n            if (multiPanel.SelectedPage == ordersPage)\n            {\n                bool numberFormat = Settings.UI.MainWindow.MarketOrders.NumberAbsFormat;\n                numberAbsFormatMenuItem.Text = !numberFormat ? \"Number Full Format\" : \"Number Abbreviating Format\";\n                Settings.UI.MainWindow.MarketOrders.NumberAbsFormat = !numberFormat;\n                ordersList.UpdateColumns();\n            }\n\n            if (multiPanel.SelectedPage == contractsPage)\n            {\n                bool numberFormat = Settings.UI.MainWindow.Contracts.NumberAbsFormat;\n                numberAbsFormatMenuItem.Text = !numberFormat ? \"Number Full Format\" : \"Number Abbreviating Format\";\n                Settings.UI.MainWindow.Contracts.NumberAbsFormat = !numberFormat;\n                contractsList.UpdateColumns();\n            }\n\n            if (multiPanel.SelectedPage == walletJournalPage)\n            {\n                bool numberFormat = Settings.UI.MainWindow.WalletJournal.NumberAbsFormat;\n                numberAbsFormatMenuItem.Text = !numberFormat ? \"Number Full Format\" : \"Number Abbreviating Format\";\n                Settings.UI.MainWindow.WalletJournal.NumberAbsFormat = !numberFormat;\n                walletJournalList.UpdateColumns();\n            }\n\n            if (multiPanel.SelectedPage == walletTransactionsPage)\n            {\n                bool numberFormat = Settings.UI.MainWindow.WalletTransactions.NumberAbsFormat;\n                numberAbsFormatMenuItem.Text = !numberFormat ? \"Number Full Format\" : \"Number Abbreviating Format\";\n                Settings.UI.MainWindow.WalletTransactions.NumberAbsFormat = !numberFormat;\n                walletTransactionsList.UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Displays only the entries issued for character.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void showOnlyCharMenuItem_Click(object sender, EventArgs e)\n        {\n            if (multiPanel.SelectedPage == ordersPage)\n            {\n                ordersList.ShowIssuedFor = showOnlyCharMenuItem.Checked ? IssuedFor.Character : IssuedFor.All;\n                showOnlyCorpMenuItem.Checked = ordersList.ShowIssuedFor == IssuedFor.Corporation;\n            }\n\n            if (multiPanel.SelectedPage == contractsPage)\n            {\n                contractsList.ShowIssuedFor = showOnlyCharMenuItem.Checked ? IssuedFor.Character : IssuedFor.All;\n                showOnlyCorpMenuItem.Checked = contractsList.ShowIssuedFor == IssuedFor.Corporation;\n            }\n\n            if (multiPanel.SelectedPage == jobsPage)\n            {\n                jobsList.ShowIssuedFor = showOnlyCharMenuItem.Checked ? IssuedFor.Character : IssuedFor.All;\n                showOnlyCorpMenuItem.Checked = jobsList.ShowIssuedFor == IssuedFor.Corporation;\n            }\n        }\n\n        /// <summary>\n        /// Displays only the entries issued for corporation.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void showOnlyCorpMenuItem_Click(object sender, EventArgs e)\n        {\n            if (multiPanel.SelectedPage == ordersPage)\n            {\n                ordersList.ShowIssuedFor = showOnlyCorpMenuItem.Checked ? IssuedFor.Corporation : IssuedFor.All;\n                showOnlyCharMenuItem.Checked = ordersList.ShowIssuedFor == IssuedFor.Character;\n            }\n\n            if (multiPanel.SelectedPage == contractsPage)\n            {\n                contractsList.ShowIssuedFor = showOnlyCorpMenuItem.Checked ? IssuedFor.Corporation : IssuedFor.All;\n                showOnlyCharMenuItem.Checked = contractsList.ShowIssuedFor == IssuedFor.Character;\n            }\n\n            if (multiPanel.SelectedPage == jobsPage)\n            {\n                jobsList.ShowIssuedFor = showOnlyCorpMenuItem.Checked ? IssuedFor.Corporation : IssuedFor.All;\n                showOnlyCharMenuItem.Checked = jobsList.ShowIssuedFor == IssuedFor.Character;\n            }\n        }\n\n        /// <summary>\n        /// Handles the DropDownOpening event of the readingPaneMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void readingPaneMenuItem_DropDownOpening(object sender, EventArgs e)\n        {\n            string paneSetting = ReadingPanePositioning.Off.ToString();\n\n            if (multiPanel.SelectedPage == mailMessagesPage)\n                paneSetting = Settings.UI.MainWindow.EVEMailMessages.ReadingPanePosition.ToString();\n\n            if (multiPanel.SelectedPage == eveNotificationsPage)\n                paneSetting = Settings.UI.MainWindow.EVENotifications.ReadingPanePosition.ToString();\n\n            foreach (ToolStripMenuItem menuItem in readingPaneMenuItem.DropDownItems)\n            {\n                menuItem.Checked = (string)menuItem.Tag == paneSetting;\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the paneRightMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void paneRightMenuItem_Click(object sender, EventArgs e)\n        {\n            foreach (ToolStripMenuItem menuItem in readingPaneMenuItem.DropDownItems)\n            {\n                menuItem.Checked = false;\n            }\n\n            paneRightMenuItem.Checked = true;\n\n            if (multiPanel.SelectedPage == mailMessagesPage)\n            {\n                mailMessagesList.PanePosition = ReadingPanePositioning.Right;\n                Settings.UI.MainWindow.EVEMailMessages.ReadingPanePosition = mailMessagesList.PanePosition;\n            }\n\n            if (multiPanel.SelectedPage == eveNotificationsPage)\n            {\n                eveNotificationsList.PanePosition = ReadingPanePositioning.Right;\n                Settings.UI.MainWindow.EVENotifications.ReadingPanePosition = eveNotificationsList.PanePosition;\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the paneBottomMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void paneBottomMenuItem_Click(object sender, EventArgs e)\n        {\n            foreach (ToolStripMenuItem menuItem in readingPaneMenuItem.DropDownItems)\n            {\n                menuItem.Checked = false;\n            }\n\n            paneBottomMenuItem.Checked = true;\n\n            if (multiPanel.SelectedPage == mailMessagesPage)\n            {\n                mailMessagesList.PanePosition = ReadingPanePositioning.Bottom;\n                Settings.UI.MainWindow.EVEMailMessages.ReadingPanePosition = mailMessagesList.PanePosition;\n            }\n\n            if (multiPanel.SelectedPage == eveNotificationsPage)\n            {\n                eveNotificationsList.PanePosition = ReadingPanePositioning.Bottom;\n                Settings.UI.MainWindow.EVENotifications.ReadingPanePosition = eveNotificationsList.PanePosition;\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the paneOffMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void paneOffMenuItem_Click(object sender, EventArgs e)\n        {\n            foreach (ToolStripMenuItem menuItem in readingPaneMenuItem.DropDownItems)\n            {\n                menuItem.Checked = false;\n            }\n\n            paneOffMenuItem.Checked = true;\n\n            if (multiPanel.SelectedPage == mailMessagesPage)\n            {\n                mailMessagesList.PanePosition = ReadingPanePositioning.Off;\n                Settings.UI.MainWindow.EVEMailMessages.ReadingPanePosition = mailMessagesList.PanePosition;\n            }\n\n            if (multiPanel.SelectedPage == eveNotificationsPage)\n            {\n                eveNotificationsList.PanePosition = ReadingPanePositioning.Off;\n                Settings.UI.MainWindow.EVENotifications.ReadingPanePosition = eveNotificationsList.PanePosition;\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the combatLogMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void combatLogMenuItem_Click(object sender, EventArgs e)\n        {\n            Settings.UI.MainWindow.CombatLog.ShowCondensedLogs = combatLogMenuItem.Checked;\n            killLogList.UpdateKillLogView();\n            UpdatePageControls();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the showOnlyExtractorMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void showOnlyExtractorMenuItem_Click(object sender, EventArgs e)\n        {\n            Settings.UI.MainWindow.Planetary.ShowEcuOnly = showOnlyExtractorMenuItem.Checked;\n            planetaryList.UpdateColumns();\n        }\n\n        #endregion\n\n\n        #endregion\n\n\n        #endregion\n\n\n        #region Generic Helper Methods\n\n        /// <summary>\n        /// Creates the group menu list.\n        /// </summary>\n        /// <typeparam name=\"T\">The grouping type.</typeparam>\n        /// <typeparam name=\"T1\">The grouping base type.</typeparam>\n        /// <param name=\"list\">The list.</param>\n        private void CreateGroupMenuList<T, T1>(IListView list)\n            where T : T1\n        {\n            foreach (ToolStripButton menu in EnumExtensions.GetValues<T>().Select(\n                grouping => new { grouping, group = grouping as Enum }).Where(\n                    menu => menu.group != null).Select(\n                        menu =>\n                        {\n                            ToolStripButton tsb;\n                            ToolStripButton tempToolStripButton = null;\n                            try\n                            {\n                                tempToolStripButton = new ToolStripButton(menu.group.GetHeader())\n                                {\n                                    Checked = list.Grouping.CompareTo(menu.@group) == 0,\n                                    Tag = menu.grouping\n                                };\n\n                                tsb = tempToolStripButton;\n                                tempToolStripButton = null;\n                            }\n                            finally\n                            {\n                                tempToolStripButton?.Dispose();\n                            }\n                            return tsb;\n                        }))\n            {\n                groupMenu.DropDownItems.Add(menu);\n            }\n        }\n\n        /// <summary>\n        /// Sets and stores in settings the GroupBy selection.\n        /// </summary>\n        /// <typeparam name=\"T\">The grouping type.</typeparam>\n        /// <typeparam name=\"T1\">The grouping base type.</typeparam>\n        /// <param name=\"item\">The item.</param>\n        /// <param name=\"list\">The list.</param>\n        private void GroupMenuSetting<T, T1>(ToolStripItem item, IListView list)\n            where T : T1\n        {\n            Enum grouping = item.Tag as Enum;\n            if (grouping == null)\n                return;\n\n            list.Grouping = grouping;\n            T obj = default(T);\n\n            if (obj is AssetGrouping)\n                m_character.UISettings.AssetsGroupBy = (AssetGrouping)grouping;\n\n            if (obj is MarketOrderGrouping)\n                m_character.UISettings.OrdersGroupBy = (MarketOrderGrouping)grouping;\n\n            if (obj is ContractGrouping)\n                m_character.UISettings.ContractsGroupBy = (ContractGrouping)grouping;\n\n            if (obj is WalletJournalGrouping)\n                m_character.UISettings.WalletJournalGroupBy = (WalletJournalGrouping)grouping;\n\n            if (obj is WalletTransactionGrouping)\n                m_character.UISettings.WalletTransactionsGroupBy = (WalletTransactionGrouping)grouping;\n\n            if (obj is IndustryJobGrouping)\n                m_character.UISettings.JobsGroupBy = (IndustryJobGrouping)grouping;\n\n            if (obj is PlanetaryGrouping)\n                m_character.UISettings.PlanetaryGroupBy = (PlanetaryGrouping)grouping;\n\n            if (obj is EVEMailMessagesGrouping)\n                m_character.UISettings.EVEMailMessagesGroupBy = (EVEMailMessagesGrouping)grouping;\n\n            if (obj is EVENotificationsGrouping)\n                m_character.UISettings.EVENotificationsGroupBy = (EVENotificationsGrouping)grouping;\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Clears the notifications.\n        /// </summary>\n        internal void ClearNotifications()\n        {\n            notificationList.Notifications = null;\n        }\n\n        /// <summary>\n        /// Updates the list search text filter.\n        /// </summary>\n        private void UpdateListSearchTextFilter()\n        {\n            IListView list = multiPanel.SelectedPage.Controls.OfType<IListView>().FirstOrDefault();\n\n            if (list == null)\n                return;\n\n            list.TextFilter = searchTextBox.Text;\n        }\n\n        /// <summary>\n        /// Sets the character.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <value>The character.</value>\n        public void SetCharacter(Character character)\n        {\n            if (m_character == character)\n                return;\n\n            m_character = character;\n            CompleteControlsInitialization();\n        }\n\n        /// <summary>\n        /// Completes the controls initialization.\n        /// </summary>\n        private void CompleteControlsInitialization()\n        {\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n\n            skillsList.Character = m_character;\n            skillQueueList.Character = ccpCharacter;\n            employmentList.Character = ccpCharacter;\n            standingsList.Character = ccpCharacter;\n            contactsList.Character = ccpCharacter;\n            factionalWarfareStatsList.Character = ccpCharacter;\n            medalsList.Character = ccpCharacter;\n            killLogList.Character = ccpCharacter;\n            assetsList.Character = ccpCharacter;\n            ordersList.Character = ccpCharacter;\n            contractsList.Character = ccpCharacter;\n            walletJournalList.Character = ccpCharacter;\n            walletTransactionsList.Character = ccpCharacter;\n            jobsList.Character = ccpCharacter;\n            planetaryList.Character = ccpCharacter;\n            loyaltyList.Character = ccpCharacter;\n            researchList.Character = ccpCharacter;\n            mailMessagesList.Character = ccpCharacter;\n            eveNotificationsList.Character = ccpCharacter;\n            notificationList.Notifications = null;\n\n            // Create a list of the advanced features\n            m_advancedFeatures.AddRange(new[]\n            {\n                standingsIcon, contactsIcon, factionalWarfareStatsIcon, medalsIcon,\n                killLogIcon, assetsIcon, ordersIcon, contractsIcon, walletJournalIcon,\n                walletTransactionsIcon, jobsIcon, planetaryIcon, loyaltyIcon, researchIcon, mailMessagesIcon,\n                eveNotificationsIcon, calendarEventsIcon\n            });\n\n            // Hide all advanced features related controls\n            m_advancedFeatures.ForEach(x => x.Visible = false);\n            tsPagesSeparator.Visible = featuresMenu.Visible = false;\n            tsToggleSeparator.Visible = toggleSkillsIcon.Visible = false;\n            toolStripContextual.Visible = false;\n            warningLabel.Visible = false;\n\n            if (ccpCharacter == null)\n                skillQueueIcon.Visible = employmentIcon.Visible = false;\n\n            // Subscribe event\n            EveMonClient.ESIKeyInfoUpdated += EveMonClient_APIKeyInfoUpdated;\n        }\n\n        /// <summary>\n        /// Gets true if the page in question is enabled.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <returns></returns>\n        private bool IsEnabledFeature(string text) => m_character.UISettings.AdvancedFeaturesEnabledPages.Any(x => x == text);\n\n        /// <summary>\n        /// Gets the monitors related to the toolstrip button.\n        /// </summary>\n        /// <param name=\"button\">The button.</param>\n        /// <returns></returns>\n        private List<IQueryMonitor> GetButtonMonitors(ToolStripItem button)\n        {\n            MultiPanelPage page = multiPanel.Controls.Cast<MultiPanelPage>().FirstOrDefault(\n                x => x.Name == (string)button.Tag);\n            CCPCharacter ccpCharacter = (CCPCharacter)m_character;\n\n            List<IQueryMonitor> monitors = new List<IQueryMonitor>();\n            if (page?.Tag == null)\n                return monitors;\n\n            string value = page.Tag.ToString();\n            ESIAPICharacterMethods cMethod;\n            if (Enum.TryParse(value, out cMethod))\n            {\n                var monitor = ccpCharacter.QueryMonitors[cMethod];\n                if (monitor != null)\n                    monitors.Add(monitor);\n            }\n\n            ESIAPIGenericMethods gMethod;\n            if (Enum.TryParse(value, out gMethod))\n            {\n                var monitor = ccpCharacter.QueryMonitors[gMethod];\n                if (monitor != null)\n                    monitors.Add(monitor);\n            }\n\n            string corpMethod = \"Corporation\" + value;\n            ESIAPICorporationMethods oMethod;\n            if (Enum.TryParse(corpMethod, out oMethod))\n            {\n                var monitor = ccpCharacter.QueryMonitors[oMethod];\n                if (monitor != null)\n                    monitors.Add(monitor);\n            }\n\n            return monitors;\n        }\n\n        #endregion\n\n\n        # region Screenshot Method\n\n        /// <summary>\n        /// Takes a screeenshot of this character's monitor and returns it (used for PNG exportation)\n        /// </summary>\n        /// <returns>Screenshot of a character.</returns>\n        internal Bitmap GetCharacterScreenshot()\n        {\n            skillsList.Height = skillsList.PreferredSize.Height;\n            skillsList.Dock = DockStyle.None;\n\n            Bitmap bitmap;\n            using (Bitmap tempBitmap = new Bitmap(skillsList.Width, skillsList.Height))\n            {\n                skillsList.DrawToBitmap(tempBitmap, new Rectangle(0, 0, skillsList.Width, skillsList.Height));\n                bitmap = (Bitmap)tempBitmap.Clone();\n            }\n\n            skillsList.Dock = DockStyle.Fill;\n\n            return bitmap;\n        }\n\n        # endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMonitorBody.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"toolStripContextual.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"preferencesMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALaSURBVDhPlZN7SJNRGMZnTUuNhpGNiUIyL+Qsm5d5d27e\n        lvOSzmYihCZqy1sq3iqY5h3rj6yg9L9AMlRMF5qRUllGapmKkiRaKKmY10ClYk/vtyQRxOiB3/fCec/z\n        nvec7xzWLtLbZC+xhxn4HzFG/dxUlZwiR8DnW1A0IgyIfxYzKMzNLmhrqJ8d6unGi+ddn9/19q6KxWKr\n        tLQ0Oy6Xa0xzdi6SlHSG09ra/GN8aBBqtVrLMD48gI2VRYwN9mNy4tO8QCCw4PF4TDdMl1uiFdg11RUr\n        H/v7cK+qEpOjI+hu02B+agpLCwt/C7ar1b/UOTlmZGHOZku3Sos645WnkREXq70Qo8S17HTcKS/FxvIS\n        xgbeYHXxGxamp9DztAVKpdKBLNu3ERHoi9hwOaJkAfASnvgQ5ie5rpAFzOanqKBOT8X69xVdF/NfZ1BX\n        Wzu9afsjoY1VlSJQinCpGL7OJ3Gz+HLvZorl6WCfGhsehqyEc8hTJaK+9i662x8v5atUJptTWCwPR0d+\n        uMQHigA/eDjY43X7I/T1vLxNKeawDrgKHa7IfTww/PYVClIvQvPgPmj8ELGPYLFcBDZlwV7utLojnjU+\n        xNryIvBzDR2appEwf2nGcWt+ob+7ExyP8dGpaYGmvm6ObE7EUV2BqMxMwwCREDZmR7QTo0Nk3sDc9Bfd\n        ns/KguDv5oowibfW3tJSG+rrDVtb63KyRRNeugJyqdRbJnbrUgQH6UwLM1PooDZLLqXglLsI+UnnIRE5\n        w8XOCnnJyUtkqSHSCRnjZ6QXExJyOJC2kaCMQHxkqLa6qACVuVl40tyICorUAYI9RWDr6XXR/BtEBMHV\n        mZkPSZ/NZrtI3FwakqIjUZyVhrLsDFoxDomRIeAc5KxTvonmXSVcCUNi221kbpYRSUgxOdBT9N7c1KRL\n        7OQ0wjUxKTE2NsygcU/ClNj1QTHJ/QTzm8wJHsG0usMjYrF+A+suPTaLPi4xAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"searchTextDel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABRSURBVChTY3B0dIwKDAzcb2BgIMoABSA2SAwkxwBipKWl\n        /Q8PDz8CkgBhEBskBpIDq4YJgGhkNtxUZEUYkiCAVwGyJIhGZoMVEXQkfm86RgEA0A5TMW9aJbIAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n  <data name=\"groupMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI6SURBVDhPYxiUgNVIV9dCWlpaFcpnEBUVldAFigGZbBAR\n        3IDJwcb6kL2lxV89Pe3dUDEGVSWlUnsry7/ujjbXeXh4RKDCmACosMZQV/u/krzcfy119YNQYQYNVdVK\n        Nzub//EhQf+tzc13QIURQEBAQF5BVrbc0tjoizJQs4qCPMiAQ1BpBh0trcqUiND/mTGR/2ODAv6pKCoW\n        cnJyykClGRhcXV3LtNVUwRrVlZXAWE1V9QrQ79ZAbGVrZTU3PSYCqNnvv6ut1X8PB7t/pkZGtVDtDAym\n        pqbxYmJiN7TUVP7raqr/N9HT/a+vofFSRlJyhoKc9DRTA72zYT6e/52sLf/ra2r8lxUVfaSiopgF1c7A\n        oKys7MjHx7fQWFfnv4Ol+X9/N5f/9tamT7U1NHo01dR6jPV0j9mYGP8HuVJBRvq/hKjoXqCFLlDtYMCt\n        oKDQbg1UFOTh9j86wPe/vanpUw0VlR4VJaUeNUXFY6pA70lLiP8XFxX5LyMtvRKoRxCiFQrkZaSPgEI6\n        1NsDaIjrf2MtrSdAzW3KiorN8vJyhySAGkWEBP+LArGwsPB9oBbUNMHGxuZlbWj4ydvJ4b+dmel/eSmp\n        0xwcHLKg0JYUF+8WExb+LyIo+J+fn/87KytrMlQbCuBgYmKKB3rljoG21j9ZScn9UHEGaUnJcqC//woL\n        Cr4GqikGCnFDZDABFxCbs7CwFDMzM7tDhMBAAaixEEg7ATEPWIQAANnACmGCASMQg8RANDUBAwMAtA6R\n        dku/KzkAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"walletJournalCharts.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKfSURBVDhPYxhGQFJO2SgwNrE2PDGxNjoxuS46Obk2PD6x\n        OiA6usI1MDjP1NU9Qd3c3E9cVdMcqJwRogsJmDo4xC/dv//r8StXvu1/9OTniYePfxy+defzxlOnXk7Z\n        vP1q4ZQp2/wLi6fo+vinCHBwyDtzMFjKszMoQLUzMFgpyZTOnz//9/rzL77fePny5y0gPvri5ZfN1669\n        nL7vwJWSWXO3+JdV9Dn5eNXrcbGUGLAyNEswM3iANYsxMIh7aqvNLOqZ/bVk9o5vS86d/77wNBCfu/Jh\n        7cmTDzpWrj1RUF+/yzctrS/EymS9CStDE1CbKBBzMXAyMEiLMzA4qDkHTy5taXneM2vWm4Zlaz9O2n7w\n        fdXyA29apkx9WpcWdy0rwPNcjLvtNis9rX52GbVkoGZIOLAxsKmycwu5ytp6F5TkJV/qLM56Nrk06+30\n        Fcvv1q9cdyUyp/pJfGjA6UB3x/X+euob1GwdK7gNPGawy5kosamYaYHM4ABiIREFVbuwgoIVeSnxp8uS\n        427UtjSdqZgyZUdCTMxJ29zqbeZhEa0aNjZpcs6BLSxSOrXc2o4NDFz8xiADwIBXSkrNPCqi2C0paUpA\n        UdG8hPjIbXFxUes9QgKn64VGdyoHxPXL2djHipo4VjLzS4SwiGtlA7UxQXQDAb+4uKKuo2OUaUBAhnV0\n        dL6Pj+fMaBvDrca+vrlaQHF5C/tCGZ+UxQKappkMDOyKQC28EJ1QwMXFJSFnYOCiamEdqOnsHG5gZ5dn\n        YmbSompnFyRvYuIpraXlJKRhmCMoK2sDVC4N0YUK2HmEhLR4xcXN+cTFzYTExCxAbH4REUMuIOYWE9Pl\n        FhTUYeMR0gSqlYBowQR8QAyKX2EgFoTyBaAYxgfRXEBMDcDAAAAKPdh+M4B3FQAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"allContacts.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAH8SURBVDhPY6Al4K2rqWlWUZSLhvLRASOUxg6EhYWdXj1/\n        /L+pKOE/kKsNxPg1oAMudmZ3LS3lP1aqfCADbIFYGIhZQXLEAAk1NZWvhdnJ/021Ff+L8rM+A4pZADEf\n        WBYHYFRSUjKRkhKzBLLNNdVV/seF+vyXEOb9LyvG/19BQa5ERFDQC6QOrBoL4Lx1/ezbg1tX/ufjZO7R\n        UFX6r6elBrSd87+8pOD/G9cufQXJsTEzhELVYwCOSFfz5/5WKv85WBgqZURFHmmpKv4X4eP4L8zB9iHK\n        y/QzSI6FiSEdqJYHiFnAumDAUFN52ZXju/7nR7n8d9WXei7Iy7kP5Hx+Lpb/ziaG72BynqbyoPBwA2JR\n        IIZ7h7G+IPHd87uX/7cWRv/PC7f/LysucFNOWvy/hBDP/7by9P/IcmwsTJVAPUpAzATWDQSM9dkRn57c\n        OP4/O9Tuf0agxX9eLrYVbGxsM1iYmGrqi5O/IctxsDJOAOqxAmI2sG4Q8HE2O3rl8Nr/qQGW/+1tFP4y\n        MzJOBwrbADE3FrlpQHFQtCLCQYCXI74lJ+i/u7HsfwEuptNAoVwgVgBiRnxyQAwBvLxcPgc2Lvif4Wf8\n        X5yXdQ9QyACIwU7EJ4cMxN1d7Beoy4kuZ2VlSgTyBSDCYIBPDg5AIcoLxCBJLiBGTnE45BgYAGKEsK0F\n        Na8RAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"contactsExcellent.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACbSURBVDhPY2AoOfefYgwm1GaSj0egISDAoNT9n0FlElZ5\n        4g2RzvvPoNiMVZ54QyTi/zPI12CVx2kIPgB2EbLXcLoEFAYgLwBdANYo6PyfQSQI4iKQOEgephanISCb\n        QDYCvQA2BGSAZDrES0S7BAmDDSEnTFCwfB3QC7mUxQ6DykRgGHRBaGzyRBmiNgMJY5EnzhACGG4IRfjc\n        fwAZOzBxcvATlAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"contactsGood.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAChSURBVDhPY2ja//8/pRhsiHE9+XgkGgICesXP/xtWfsYq\n        T7QhqtHb/+vk3sYqT7QhCv7z/2umn8cqj9MQfADkImSv4TQEFAYgL4BcAAJiFgX/pV06wHyQOEgephan\n        ISCbQDaCvAACIAOUQleD+US7BBmDAFlhgoy1Mi/9V4neRlnsGFR+AobBMzCNTZ4oQ4zr/yFhTHkiDcGP\n        4YZQhv//BwAGkzIFWrMyeAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"contactsNeutral.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABaSURBVDhPY7h9+/Z/SjHYkE2bNpGNRw3BxDgNwQdmzpz5\n        f9WqVXC1OA1ZuHDh/4aGhv/5+fkYGCQOkoepxWkIyCaQjRMmTMDARLsEHxiC3iEFD1dDKMO3/wMADcuU\n        +TnSdFEAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"contactsBad.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABSSURBVDhPY/i/hOE/pRhiSCQFeNQQTDwEDMEDbvsw/P8c\n        iqQWlyHPAxn+b3dg+D/fHBODxEHycPW4DAHZBLLxvAcmJtolJOFRQzAx3BCKMMN/AF7VvQXm2Wc4AAAA\n        AElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"contactsTerrible.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABLSURBVDhPY3jIwPCfUgw2ZD8FeNQQTDwEDMEHlgDltyGp\n        xWnIWiDuBOJyLBgkDpKHqcVpCMgmkI2zsWCiXUIKHjUEE8MNoQwz/AcA4X8Mt1Ne/s4AAAAASUVORK5C\n        YII=\n</value>\n  </data>\n  <data name=\"inWatchList.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADXSURBVDhP7ZHNCoJAFIVnJQSJiwgkUMhdSRuDKZVc5EYi\n        HyCCXqHAhVDv0M/St82vhmhK38APLt45594DM4qOZmzbHs5qFjVSyiU9mrLbcV13nCTJKsuyTRHHxd2y\n        HlQZx2We51s8ZtS4hhEEwdxxnBGHQ5oeKiGq70LDY4ZZdjiDEYZhVH9776MQ5/X68huApmzoqZ1XyF/A\n        Lk33vwFoygYtALQreJ7nHqU8Xfv9G0WPhtd0hQ88EMm+70+mNVEUhRQ9Gl7bI2qYpjlgiV9I0aMpu0ND\n        iCcUyD4UhUnA2gAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <metadata name=\"toolStripFeatures.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>174, 17</value>\n  </metadata>\n  <data name=\"skillsIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAZTSURBVFhH7ZZ9UMx5HMcr56Kicx5WT8dNDmc8zhmO4ZrM\n        YTzcMLjyOK44dJKn6RBJlAqHiqJSkraJW3koqUgk297moVXIVgoNsrW1SbvV7vs+n213pr9OdWbun3vP\n        vGqrz+/zeX++38/328/kf/2vf5BpO/4TtTfQHqP4czcrK6t+tgP6THJ2njqNfv5c/5dPINOxY0f9GBcb\n        kiA6dyAlOTHwojAm8GKqKDIjO/Psban4wv2Skjslcvmj5/W1laqaSjFeleRh1dIFWw3P/ytxZxYVpeLq\n        2vIEaJulgPISUJcNtBYAeEZUEbVEM6Ej6GvLW1RWZqq+NDHp3Zam6zK1s7P7XqdV4WWeD1qa5VQ8nepl\n        Aeo8KlVEVBAKQk2wCS3RQjRhnfsyH0OeLsvMwcFhCmVDhSQe8uJrUDc+AN6eJxM5VLMMuiYyoXlCVECr\n        eQPNBzkaaiX0xDu8fv1EaWlpOcCQq0syI/reyxSq8q74QlEejdaWF7TqSdCUC1FXHIvqwhP48PoCmmvS\n        oXtPW6TOha65hAxUEkqsX73icFuqzks/2YRl2P6d1zWaV3hZmIR6pYy24TK0j+OheHgKZfnH8UwSBrkk\n        HGXScDwTH0F1SRzUdRlk4AVUqqeNAoFgsD5jJ2U0YDVlyuTN+akxuBXtCcWbW2hVi6EtPI46aTSaHp1G\n        kzwBLYrL0Glu0HDepCm8RcXFRCFRhh0b3WP1GbsgNtDb2trauSg/s7VaFo9qWQw0TVI0FoWhKicU9WRC\n        V84zcRVooK4/EGpCRycFbESCqqoHzQJBn5FtKTsnnoFexMiMjGvF719koCjaFY1U6P3TKDw454fS9INQ\n        SaOgkycBr0RAdQpQn0qHgExorxuMiHE0xEukz9hJsQFL4lsXF5e4FvVL3ItcAkVRKBppDu5Eb4A0cSfK\n        0oNQe/cYNDQTrU/OAM/JzJsLNCtkpCFNvyL3Cm5q+/fpNVmftW17OyQO7Ek42trarpdKxdqyKzsgE65D\n        Q50IRam7kRHqgYKz21F6JQBV1w/g3e0jqJcch4a2Svcsoc1MJVFzEWci/bINOTtlwJwYRMyXSCRVyrIc\n        ZJ3wRlFuEF7fP4LzexfjWugaiE9vQWHyTjxN8YP8yl68zArRm6nLD4dSHI4GaQRaa6/B3qb/TEPeDokD\n        uxO2xExPT4/MlAg/nNo8BQXxq1B3LxQ3w90h9HPF5YNuyI7wwJ1TXvjrzFbcF25DkcgXJZf98Thlt57K\n        G8EQxe2RGnJ2SEYD/Ymp9jaCw4o3JSi9HYUbMdRt6h4UJGzCyS1zcNpnIVIOrMTNGJqL5G3IjfOC7JIv\n        itP86fsu5Cf9jozI31AlicHEMSPcDLk/uhIc8BnRhxhPE+lVLBMrQ9bOxUG38cijTuXp/jjmNQOH1k2D\n        MGAxzoesQHrEWqSGraaCHsiO9UJO/GakUvHkP1ZD8fQSzp8IfGzI/VEZDfBRHEG4/eL6k+Rhxln4L/gG\n        yftckRu7BRdCliN6tyvi/JfgpO9ihHovRND6OQhYOxtBHgsQuG4RDmxYgsgd7jgT7P3K3Nx8iCH3R8VB\n        fBmxAUfCZZCNTfz7mnLE716KJL8FEAW4IdRzHnxcptEqLESCvyd1HYwnWaehkKWh7vFVVNxJxN3kQxAd\n        9obPMqf7A/v1cKJcfMQ/aoIDONCC4Pt8lqmpqX+mMFF1bPsayHPOovRWIsR/Hkda1H4kBm9D1M41OLpp\n        MQJWzcKuZc7YNH+CetX00Yq53zk+nD7OMW359CFRgwW9Jhrydkgc2IPgkzCV2DTH+YcC9+kTsG/lDDg5\n        jdTOGzOi6eeJw5ROox0qJ41wkA2175fV39pK2LN7t4NmZmYb6ZlFxCSCm+CLjbe1Q1vA4kB+v+OTMI5Y\n        amFhccTR3ubGcLveudaWPVJpVeLp92HEHmILsZKYT/C74XiC91xAWBFc3Lj8HTLBQfwQv15xImfCg/Az\n        4E38Siwk+JLh65aNDiO+IviFhJ/lVTR23uHiLA5kx3wl2xD8X42HaLYB7pL3lH8/lOBbk+P6EsbCfJcY\n        u+60jG55G74g7InhxBhilOHz18RAoh/BJ4aHlq9wPkFdLtxenICTcTfWBM8D7ykvL7386jvlomyy/R5/\n        MnEyTsomuAh3Z1zaTg9VV2Us0J5PKBOTvwFVDMKMX4wVZwAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"skillQueueIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAb3SURBVFhH7ZZ7VFTXFcZhxokOgqKi1GA0gBkDRIOSLhSI\n        EgtSSMijYsQHqIwiSIyIrwiE60RERCKmPjGxUyzQoqXB5wJ5BREWBJ3SSjBKoEFo0QzpLBcaiMJ83fsw\n        uFIaoqRp80++tX5r5p51797fOXeffa7Z/1gywrz370/64cRL+qMsq8xliuML/NsP1hCiv7Ef1qhqwsiV\n        KRujOl4K8AuhS5F8luvTa3w93TT0X24aMx8+fLitSmX/8757eIz4r2Tu7e68JTvNr+dKVT5wvxNf3Gxs\n        /01yzN3D0hu4WqW9n5So2ROxalXkiuDAd0PnPaNPjn2jysrKagw9O5RQOk6y8xaRvo+mO9kvzdwn4c7t\n        NgCdwsCFM1ng5IaWetz/uovGgZqSPEQHuaG+qkCMX75c0dPYWNcqSXHGqSoHf1O4wcnzWYdoSVpvxH2D\n        SMKqyDuM3P1v4d6ddhi775Eh4B+fXcWeN39JyU8Bd/WmO9tQc1yD+uo8eD43ddAGzGc4jI7+XapPj0hu\n        MnD+j1qRHJ28Gr3qaNdj+/KZ0Df/5cF9rOsXtLjVUARJ2mp0cXH0MMV9JMlcnrCima80fjNRSVYyMpPC\n        gZ6vegfoVdzWtyAlYh7+frWcBuj1CHWitfYUupovoPmiFgckyWhtaTmb4nKh9u2MgQtz1CizkdK6oC6R\n        3GSgtuJ8b/KOJnHN4uTbI316k3/DqL7hogB6Hco/WC8MjFAqeVcMJ7goHyMURN8W/g8NkaTI7lvXymkm\n        55CRsATvhHhAd/oI7vzzBvSf63Ap/yje2zQfVXkHKCXPvLc4r1Xno6ksna7b0Fi6H1Xa9cjaJRmtlEp3\n        imtLjDVhRbCJb10JWdKawC85qKGlViSPWzAdrZ+U417nl8hNi0LiIifEhczClaJjMLTWoSIjFgdi/KFN\n        WCSSt9ZkozBlEZnYJwzYWFvOobiOJiYRo4kBDZgte8mjjAuq/UYt0qJ8EekzCVeqiyk4UJ4hIcrXHokh\n        06nCC8XMi4/twoZAe/w+PgC36rJwRuOLrhtFOJO6DKUF7/cMGzbEk8JOI6YSKoINcE18u2ZMHpt4rSpP\n        VPWhDYFY/Jw1TmXsFgZ0uSkPDFwqzPk3Ayd3zMf1ol3CROHBSNTkJAgDFhaPBVBY3gkziSnECGLAGjDz\n        9/WOqjh3FF+1N0ArBSN+iTs2L5wFGJpQV6DFijlP4u1gNySrZ4sCbL50GuFzbLH1NRUZqkTdH9agtehd\n        oKVYGJDL5S9S2HkEnyVsgAty4J3g6DjRLefgFmEgefVcLJ45DtvDA3CbCpANvB3qjXgysI+aDxu4XpaN\n        dxZPg3aTL742FED3QYhI3mdAIZMFU9jXCF/CgeCd8J2ykDaFGXUfVxpPp8chIXSWKMSWz+pxnVrt9jAv\n        5G57Bcfe8kfrp1WoPnkESz3HY+MrTujRl9KLaqJCPI7G8gx8mJHcKZPJwinmUoIN2BFcgN8p84jXfT4p\n        KzxnPJEWDfULPxMGdGVn0VZfIwysC1QJA426YjJRjUNr52K32gPdjSeEgT+f2ov6wnQkxka0mAyEEXMJ\n        LsCB33+fZru5ZpaW5veUZKdBTUXHCXPTt+Hz+koyMBdqL2vkbHsZBcfTcbPhr9As98LKOXbQXz5ITegs\n        DFeL8VHuIUxzeiqLwm0gIgguQkvi4Zpi/8QuNlBzRvvAwOFtanR2tD0wcHZ3MA4mrUVHW7MwwLul/k9b\n        qA2fwKcXjkPaGH5ToVAkUbg4YgnxNMHd8OEabakMej8lHrUffYiY+a6IetEJO1f7ou1vOuyNCxUGKtPV\n        0KxZAENbE1LXvSzGSvavRhs1oLPanT0qB7sCCpVIRBPcjMYRD19+loVC4Zrw5nJhIHzekwh9foIw8XFJ\n        Do7siBLJkpc9i82hfmhtqEU6rY5YldRQVB5dB03MortyuVkqhYoneBty8fGn2yNrROySoK6ai4XYGb0Y\n        CzwmIiZoBi6ez0XGnnjELpwBTYg71gZ5ofTkb7F/axjCZk9A4govHN0ciGcmjSunGDsI3oLcgnnpB977\n        /cQ3KuwfH7tXotMsYVUg/KbawN91dNfpzAPCQPDMxwXLnZ272UDuoR3Y8Cs3qH1UWOg92aCQy39NMVYQ\n        LoTSFHNQ4mbx1AiLIQm2o4bl2VgqzlsMlWe7OjnkBwc8/8Wr7uONzs5jukcqh2Zujg67fVizGq96u8Fn\n        mo1xgo2ykJ7lqp9O8Mn3aO+9n/gh3jKTCW4gvzDhR/CXcSRDN71OqG1HWmbajbEqtLFScPIogr8BRhEc\n        Z9Cz7xM/zCvBvZsPEJ6NNTGe4JbKcHFNJDghG+Rmwycf3zfwiTdI9Z8BB+aKZtgk/7JJhleN3zmP/9/F\n        Rr/3cv8IMjP7F4aSQ6Sj1WZiAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"employmentIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAeCSURBVFhH7ZZ5UNTnGcdFFhZ2l2WBZUGXZTkXlkuCXMsZ\n        RC65ZN0ATQiH0kZaBaa2RBPsLhJ05PRi5QihipahVSmJJto/skY7g6bJaFqmiXYmdcb8oe3U5vBAq/76\n        /Tquo0OxUyfpX3lmPrO7v+N9vs/zPs/z7oLv7RnMASwETkAMnB/+/r+ZI5CqVCofT09PPy8vr8X47QZE\n        vPldG6OX+vj4BMbFxWVlZ2e/VF1ROi6Xy0Nw3QMwK3zmOzOxRCJZFBsbu7y2trZ1fGz/Sese83W1Wr3K\n        2dk5HPc9+Qz41reEUTE6d7Xad8WW1pZDx6YOnfvnP/528+2DVqGhrnK6ojRvSBeweDOe8QHfqgguxP2V\n        Ao2Hh0dBhbFw2mw23/90+j1hempQmBjpFeIjdF+KRKJNeCYMcDvsxfnMW8IX6ZjRyF1dXf0CAwNNBQUF\n        /YWFhe/0dGy6evEPR4VaU56QmZl5D0V52t3dfQxb8VM8TxEK4AoohOuweCnIzlOF8WE37Levv9qn0MnJ\n        KRpFV1tXV9dVX18/UF5ePnX26Og3y7Xaf/lKpderSjKFII3mPLIzJpPJdri4uLyGd+KUSmU6vqdiLS9A\n        QXKuCyiMPv6jCN7w0Gq1z8GMEwPbPomNiRlE0fU1Nzf3NDY2Wuuqq9+uf8l4JSYm+pPg4ODzAWr1n6NC\n        Qy6iJUchoA+fO0NCQnrMrRuPZKYlH0bXZKFQkwMCApLCw8MNUVFRBvp46OsJ4wWZt7f3kvT09FdaNjQe\n        sNls91YW536xZvXqfXA+0NS0brCmpuaX+fn5hxISEo5FRka+B2dTGo3mICIeUHp67g0K0u4vKsx//+pn\n        n91oqHzha4h8LUqvXxu3ZEktMlkOIbnww4ywsB8Z94X7rcp/PnH47OSvb83MzNy9emFaYMFdsE3d/kXj\n        y1+urq2ZqKqq6i8pKRnE3r+ZkpIygoiGEWE/6mB3fKz++OG+Trx7+u6da58Lv9pjET4/Mzbb+bN137xg\n        LPkt6mgdfLBl3R/6e2QUIAH+jo6OeRFhwUfM5qb7HxyxCp0tNYI+VP0Viu9odXX1EAT0oQ668vLyutLS\n        0roiIiK6IKDL19d3B+rgLZXK89T6oqI7Hx9/S9hraRBivb1v495RPz+/XtREFXwEAQpggT4yu4BAUKRe\n        pLROju+6n5EYKbxYlCaU5hr+joinysrKhkwmU5fRaOyAoHYIaI+JiWlHWjuw9z1SqXRUJpWeOPP7sdn6\n        8lwhITpEWJObfdPBwWE31q0BycAPsK2fGN+sSBegATmrCjKnMuJDryGivyC6KyWJibPJCQlTqA3rsmXL\n        tuXk5LSlpqZaoqOjLUirBc63IMpOvV4/XFyQferV9UV3pFLJZWTzQmaS7oaLi/Mw1i0FesCJOecQowDu\n        CSdZskIh78XLu1HBv8PoPaXX6U6i6A6hM3ZgzztQfG0orgfO4dSSlJTUhnrYhoLco1J5v4s2PLlw4cLT\n        GE4Tjg4OO51FotexbhJYBNiGT8wCfmEHiP39/VMQtQFDxQQ24KDZaTAYJlC9+xHtXrRRt06ne2Pp0qVt\n        2BILgTAKacPzW8ViMYUPwfFBAhGtWLcaZIAAYD855zh3hmN/9j/2MyM0NNQI5xXo6wZEbUV0AyUr8iaz\n        srK6QQcjDgsLs2B7LHjP4ubm1o7971T7qkZkMtcDENGPqdiKz5VYOwFoAVuPqX/knMZUiPCyDxaMR3Rp\n        SGkBnFYisrXY543o+d0mU9nEb4b7byLSURYbnG4FW+C4De+2KxSKXmzJ6BvmTX/MSI6bwRTdiegrsTad\n        s+g4Bec4p1EAB4IXpxWdY39XQUgFMlEdoNE0paekDI4O7rn44QfvCIEBfh9DwAjYhQxth/OtcrmsD5nb\n        t7K42Hbl8rlbTT8qveWpUHRDQLlItCAeayvBvCekXQDbgjNbDdinkUhf3k+qVn505tTY7DQm4tkTBwTb\n        sX33ToyZZ4uXGy6jp60otp7IEM27k33dGD7Td+9+9YVweKRbOPfh5C1zc901D7lkI9ZSAQqYEz2NF1kU\n        bEEWCFuElRoMUhDFD5fGhJ8ft24RJq2twoa6EkHi6vhX9PU46Ae7wJtKD4/3f7z2B7f/ZBsXRrZvECL0\n        Qez9TqzB4uPfNq4/r4AHdQCoki1CIb4gDlQX56Qetx0eEkK0i4TXXzEKXgrpGVzvAj8HzWAznA3N2A7e\n        WPtioZAcGy5UlmV9jest4HlAAfNmgGYXQdgRD/79AJ7rZdtbGz71UyovwclppUx2KSU69BKuN4FVoBjU\n        hGgXD7asefmmWOz0EbJ21pAcdN1V7LQd9zj5vMETB898RiF2mDIqT5dJxL34bAPdoEPs5MRPTjVmKBqk\n        S1ycX4XAbfjOzNDxZrFItB6f9oNnztH734yK2behIB3QYTlgXzOtkYC1wuh4fiSCFcAEmBkeuc8BBmGf\n        fP+T8QVmgZ3B84F/vXWAgvwBW4udw8UZIcWwe/gMoSjWEeuJwcy7/0+zB+MZ8JSUPQZ/c6jwPoXSAcVS\n        kP0Zfue1Z3ZuN75sL9DHeXzR+Z4h39tTbMGCfwNraglWumsnWAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"standingsIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAARtSURBVFhH7ZZ7UFRVHMfv3stld9lFWF4uyhu2GlhYtsBl\n        ea2CQCwBK5IGgaiL7JiUr9QUExkf/WFmma9Jpukx5GQSjTZNSqgzTTZkNE1CMxlqM/YitYaEJaj49juI\n        KS0Du+6f8Z35zLlzfud79nfP+Z2zl5vSlKY0gSSEONrei+7ZL1GpVD42m632wIGXX6+qLKujvqBbIafk\n        rp/jzWbzghvXegZA+vLT06gyJ39L/X63wpPKXT8nsZizn7f334S97yZOvvsm8pNCIfJcNYuNMpHc9XPc\n        dF/ZxsbdW7Bvx9NY+ZgJSZFK8DxnpRDbU4YHwRPjyl2/h7enUJh6v7zXEO0NXYgn0jTew9SfSASO4kNI\n        Cf79lqbPqPUnbstZvyfhsBpSX6Xnxr316/pajzWibnE2zLR8eYnqYWOU4jK9RRWN0aUZjVsvfd11tfti\n        +w/279vRcnDTT16i+JCzfiKamEY4rIK2ulg38N3FTgz/NYju86ew6xkr5qdHY9XCDBjiwr6hMVm6mNDD\n        O5bMxdYaM1YUz4I5IRjW8lw7VX++M35CTwQQYxOgQilveKocvdd/RN/1qzjb0og9dTY8mqlBZW481i7N\n        tdOwwqiZQfvLsvTIS4lFmJ8cFlMiwsPD/1R5eTQ74ydSCDUxNgEvKW/duc6KP/p+w6UL7Wg79grqlhXh\n        keRQFKWEo+HJBaBhi4hcUZDskkvF7QWmpJ4AH3kXVVWGK34iimDFeEdKKV+zba0Vg/0/40rXOZw8sh/L\n        5xkwOzYAc3VqPLe6jE2wglhIGAi2jKz1JVz1s6JkhXhH9AY162tKYb9xGV2ffICzzYfwxLwUzNHSBPqZ\n        2FlrYROsJ9iRyoyMDKug9t+3cNE/ixibgEzkKsuK0/t//6UT5z9swqm3XsTifP3IBFnxgSg0ZfxNwzYT\n        NQU5mYc7OlqH9TqtTafVLlEoFFpX/MSDBLsTxkgdE+J/tKfzI5ym/Xvn0HZU5CaMTBAcLB9KfSCwVxSF\n        hnxTcsfu2gJ8/NoWdH/+Hq580QZzdtqr5A+bzE9jniWWErHE2BogCV5S4eE15SZsW1mO1YvMyIybjsgA\n        EVJe8pUgkTTJZJ4HS7KTfk2O8IN2xjQYNYGYHaHEfcGyTvKrJ/PTmA1EKRFOONwDPF0o+pc2PI49qyyo\n        zNHS0gUhTxcIXynfTnGWvdWD59YY4jQX2NHTJcQMpMVq7Gp/eSvFgpzws1NgJNifk8NNKJFKuYjjR+qH\n        2pobUVuaDgsdH2uOBgEK/hzFlxOpxAyGSinb6yVyL9AzOwXsdhNd8LOr3DEBIuTMiX2DbSeOYnN1ISpy\n        4lBvzYFKLjlDsflEJCEn2PKxKlYRt+WK3+HHmVinsrQg6+3jzW8MbVpWDGth8rCtxHhNKkgaKMayZ0sn\n        EOPJXf/IBDI6UvH+/j4Wei5hCIJQRC3btxAWJ8bNnuSuf0QsOwXBPqOYIZRge8YyZ2aHyv2P3PWPiA1i\n        Z/TuDwg28YSZ3yV3/VP634jj/gElXHB/NoSF8wAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"contactsIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAApmSURBVFhHnVcJVFNXGqYVwpI9kJBHgLCJGCxShQIihCVA\n        gAeRUEVAjBQUjCxSFJmKvFZr6XQTp3hUqAa1HbtA1TiLc+accWcGgdYKIlVp5lRp61LAjuU098U58/8p\n        tPYgznT+c75z33bv/91/u/9z+BXyJMAZ4ARwcXZ29ofRF+HoKoiEMeTne9eIyWsRQAzgAnA+Cq7xWHGc\n        HFE4AJyIz3ARoYuLi493YLCW7+lF891l2TyJ9FmPgDnVfLmiRiD3Ksd7sU9AGVfonuQsFCY6CYXhME8K\n        4ANcATzAwzqmyZRCHGdNXrsAuG4i6XxZYLBu6ZryXcqwiG08d7nRlS9cL/ENYNx4gi14jfCcrWoWUorV\n        YoXfahHlo3N0dImB+d4AVO4GmNKBG5wmUwpR7ObG0VkgCETl2Q0NB9vPnLXEF6064hUetYPn6ftWYEza\n        nwQenoe4cmUbIiw564+B8ck7Zi/WbJ0dk9jA4YszHDicYFjHE+AOQAJTJKYJPpx6gf5CKOXBwelJBSu2\n        nrpyZaz7QveD3X8+N5b0XPnRwIj4P9gJSOXHUDlfEXh4oc7Qs6H93cuHL168+1SGfreMoqonreDL4XBU\n        MOLGngAgiWmCytFX+BEq93JycpovlCueDYpL3r56R0v3yZtfWes6j07EFq0bCo7WDETmGK6FxCR+gdch\n        8ekX40qr//nK305+e+j68A/P5Bs/8Qpb+K7Yy7vWVSjJceHzkQhaQgBAEjMK+gfJYDSHcMUeeWK5d+1s\n        dequ195//0aUvqS/sIG57bdYMxBG5w5K5D4X3QPndSPwPmntxisZ1S9cQGvwPahdzjxB2axZszRuArF2\n        ck3cPZKYUeyBB/B1dHSMhaBaExgeub+idtOg2WwmrzbvYGvqamF8i218u+U+rdePBkTEDiIBTXntN08l\n        Z1zzXRjXo62uv8qXUh+4CCRbwPxLwQq5uCYAUxQtPU3wIUY/ml+GwSOSUbqSiorTnZ2d946A8h0tLdac\n        3zTeL6qqGtdXVf2QTtNErVY/WN/YaFtRWT1a0tY2EZKWOzhXre/T1rx81Wfu0ycl/nNaBTKvzSKpvAjq\n        BNYNGeCRWYCC5uF5UNQCkYdHfHpO9t6enr+zra2t9/bte2fUWFn7JSqnl634KlW/8o4qNXVCpVpmQxIM\n        w9g2NTWNKVShFnTLomXLbsiDQ/+KWQI1ZAu4Yz1aFNZHK2BKziiQeYLAysry1qGhoe9PnDhx56NjH315\n        7vz5O9u2vThcXt9gJ5CUXXhbnbf82+jYtPHi5+smTKdMbPvvD5GswpLb6I7g+PS+qOWGfswQVy7/JbSC\n        g5PT07A+EkBLzyiufD4/uH5z/QcDAwO2trZWCxI5erRzeA9YovXAfrK7bQ9bWFJmJ6ABKzS17f8eXWQ6\n        f47dwDATAWERg4ExSb2xeSWXfg0B9AuHy+XKPD09Q/9y/CPL2e7z7Ndfj0xYLBa2o6Nj9PXm5nG8PnPy\n        5IMPDzKErjSS4s3MaDXDkBKGud+0Zy+LgRq9tHB47qLE/qd1eZejlxT0SHyD3pQofGowEybPkhldgNEv\n        CA8P110aGrrff3WIYPFBpeiKFghCtAo+Mx87QLTRFIlTq+/p84rvolvU2VsfIAHtyrXfoAWSS2t7a48f\n        t3iFRzTyxLLShyzwyCDEAEQC3KJVRTtRKaKnt+ffIyMjxDxwmUCgEbP5Q2I+sp/U0ZlEKuVaF0Ylj6Hy\n        9Nz8kbyy2rF9+9vY4rKyMSSw8pXmoaFbt6zzM3RvwmE1lYaoY5oFnsjOzsxJS0qoc3V1VWTpMl8YGblJ\n        rn4xzHZ1nX/Q232aHRy+zr6xdy9LL6JIMkWRJIpPVKoA25Iiw72c0tJ7y43rvlturBpnOjttdS9vv+Mf\n        ldAVnJTZuaBg1QHv+REbhVL50knz4+mIJH6W0NDQRWjWa5d7WXWU6uOCPP0uy/UrsFszufRZH9t1zsSe\n        OXuKZbZUkp3bjNbMGIoslAqsMZSUREWqxmM0WTcQal3uiMlkYrNy9X2y2aEfcvnCJld7JXTWuPB4alCF\n        PQLWm1+WYpm7SIfKGOZ5IuO73fD39/9tI/OC3QKnYUF8VwVFx2w+SjAG+szvkWo6ldCxFDGqo63hERFj\n        SEBfsPIOfhsZGdkh8p3dAPm/EnMfKpsfh8ObOoymZ4BMJktJBbNSlDOhRJyeguU553EnWFz+0XXaxjD1\n        ZC2dQCxfDLBIwGw2ke3GVVatUsG+aFRbNbGR46C0r2X3rok1FesGBVKqEpqWFbhzMHsQqIB+wE0O4/RT\n        EIrOM2+/3vDdwEC3bRPsMgmIlNEpxNzRTtKSlCzTwdhOAZmXjKXWk5B+lisXWJPpddZYrLYupmTEWK62\n        ZsXE3H9uXcUtJJ2Qlmr29J9bIvH2zkGz2wlAXIGqR3dEIp7zG5d6z9osls/Y5pcNrAYIpCuVbDwsjj6m\n        4L75dzvYvk972Et9XWwPKDkM2UDTUQS/Wbcy41+vMbW3W99hCBI4sG9Pr1abbAwJDaVheaz7aHbc+ZTy\n        X/rfU+LSiju71mti68poEg0KTaY21nwIlVCEzgSAZXQ5Oti5icWzYco9h9sZTE1bpl5/a968eSNNrzXZ\n        U/fgwfZPY2OjDbA8dkHo84dNj4R+FqnoRwKf95jYjXQynG5h1uHP+1nz0XZiLFVbaXqxPf/bdm5jM5KV\n        rEqlsmVlptjHoDnBY15BIT1ymeRVLy95I70kexS/RYL6pc92YkqDiodzfnoj4sZ5cgtGdxdMWksnkqIM\n        JXtpoN/2MZRaA61k6cUU2WowwI7rwRIppEgdZTWsyLQTkCm8z3mIeA1criB/lrOzlu/hUYXPk1M17Iba\n        9bbg4KBXQMVjmw8UYcGS1E8OoF8zokguBJ7l+kW2cx/cg3J1pNS6GVxgMBSytJoiKeAiLcQIvhMIuMcw\n        1bDjmSyzCtj1e0p/pS09K5MtKSmZ8PX3r4DnErummYROijhhMGgh8CiSFklBul1gO1qM1qmqRydQRAlK\n        KUpMKLl43F3MtVByUbcLh1Pv4OgYDUssBqQBMNdDIfLNnnIZURUU2IqLV416e3sXwvMZmxCH5wyFx49A\n        0OUnws5A6Xtgjd1NBlYbBYrdOXcToODQGoqkRlDE31NwE6ZsB+QAAgGY31jhsOlEEvGAFCklHQwK9HuA\n        zUp+/rKbUqkYST76FJynCmk8BGm0CvyrWRA0wJTn3DdolGwcpJk7d5YlXZc+UgtuqITUm6MQXoYpSQBc\n        7OGgwlYO/wGQRBp01Kuhr/gSLVdWWWHT0nQ/WMYP3j2yF/CElwkwJoI/U0583HaTqQG/a5Wsl4dzj1wu\n        Y5Te3julIt6bsPAK+E5pnzVd7O08AH/Lkp90dKwSuUvuIomNmzbYEtKzzmC3hR8+SrBQ4CnF31RbdYrZ\n        TBNjvtoqk7h9AM+wmcSFp/5wple0X8oUkQhHDqfax8fnOySxYUONzc/Pd439i8cJWCPAHtkODtjLhwFQ\n        6f8jSEQBVlvj4x8wFBcXe1MVElTz46vHy0/NCeC/7fZ/EYyXUCCyQCwWCx0cHBz+A5srPPYCPW0JAAAA\n        AElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"factionalWarfareStatsIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAd8SURBVFhH7Zd7bJPnFcYhWZItoyEjKyEkkIQkJndf4thx\n        HF/j+z2+O77bseNLgnNtKHTEtEBLC6NNgantKEyhbKzqNqUltLShlVrUSkjbNFXdVO2ijmrS/pmmiWnV\n        1vHsfBZT6QWQp/WPSXuknz7L/r7nPd/7nvec1+vuoPX/Zf6vO0ur1bqnZ2fzswXmC8zPMyzkFxY+YZ6Y\n        pe+nZmYWq6qqNjGkUpnFaDSe9/n9eZfHl3e4XPkRh6MA89nl8eR9Pn/eHwzmg+FwXqFQuG8O+4laW9tl\n        i4tLH3kDUXj8EfjoOhqKIRAeK3xOpCaRzOQwRtdgJIH5+xc/jo+nlkLR+FI4nv5YY7BAY7BBrbdCqTFC\n        OCjFoFQJsWwYUqUGCrWefrfC75/6qKGpSXZz2E9rem7hvNVq/ZtSY4DOaIPR4ixcmQc1egvcoxH6zgFv\n        IIZQLI2ZmfxfM7mpPwUiSfiC8cJvzD3Mvcwzt3ownmby1uhNP6ShSokS4tPJWVFR0Xz2/AvXnzv/An68\n        sooXVy9h9ZXXcPHSGrK5Obh8YYzSQL7gGKKJLO7/1uINnfmhf6Yn52i2EqCZKNwz4hyFxmiBxeGGazSI\n        QCyBSCKN1Nzu62VlZVwaqoaoJsqYcW8VE9EGop7Yfu0Pf4SLlkMyrMeFl1/DyoWXsUJB/eD5H+Hk089i\n        YmoBkzO7ER+fQCCagDcYg95ih1g+jB3t3VBTEDX33nuMvBo/QwPBBMDMwufERLWFaHnzyluYSgUxTFOq\n        1NswqNBCKFHRVQeDzY3p+T2FNxMMKcAXy9E3KEO/RAnugAQWix5Omw41mzcvkReLaGU8b1JHlBNfKGYW\n        vkZsvLR2GW7dAFbOHaQ3jMPk8ENltENndcPsCsAfTcJkd0Ohs0KmM0OqNUOiMuDo0QdwbG8IMukgvllb\n        e5K8OgnmpZi33khUEHcvTr+79iE0Gg2C5gG88/oziI2nYbT7CljdQWgtLii0FppqOwx2L5SUeMtnl3Dq\n        SAYiDgtmyoHa2tqnyYpNVBHFVUQmB2zuUXDZXYiNiPH2G89gLJ2FzRMmcx8isTHYRhzQ04wYbB6cOX0M\n        33tiF2R9LHRzePCGotiypf5ZsuITTADF6TcffIgRb4Cm2AyRkIeIRYCLzx1AbmIcV69cxi/eeR3zURNG\n        tX04tDeNE/ujUAlY4AmE6BdLEU6kULe1YZmsRMQ9BdNi9P5vP4DdE4DW7KSZ8EE+1A+PsosGXgNwA2++\n        tIwje8axtJhBRMeGhN0E/oAYcrWJApAhNDaOLfXbvk9WUoLZXcXpvfd/DYc3CDvt7VwuA4vTAxGvA+/9\n        9C1c+9VVnH0yj+MPTWFfxoWRwWZ0s3sh15rg9TghoAAiyQwaGhqfJysl8fWCaTH6+bu/hNMXQiAUwfLx\n        /UjEAjCaDUhQPuybz+LU4/vx1GMPwK0VQs2pA184iIWZLA7el4BYIkUsNYH67dt/QlZqorJgWozevvoz\n        moEQ3F4/tMNDcDtMCNK65sY8qKgoh9uiQlPdJlRVliPq0kGi0MDnNILd2Qpe/wDi6Uk0Nu54kaxUBLO1\n        i9Pqq5ehNVkJCzyU0cyaRpNpnP7OI5hLUPZL+zDEY2E67oTdqKS1N0Km0lDhMoIrGEAiuwtNTS0XyGqY\n        YPZ+UVp/5tx5GEeccAXCcPpDcFJdP0lF5tC0E2GzCFfWVnDkvhA66ytxcM4Pp9tNg5sxpFSBLxrC+K5p\n        NLe2XSQvJgduW/lup/WHjz0JJSVVMOynIEI4sCeLxTRVu66tGHcqcO7kARycCYLbvBHWoZ347sNZGMwm\n        6nxqyIblSFEAO9pYr5AX034/13juppLphb0QUF/3mKXIRO1wqDiQ9DZCIBIhF3fgpdOP4NShSSj7WRCw\n        d0Lauw0+sxhzaRf6+tjITM2ihcW6RF6DBNOCi1JpIJakoiKGQChA2C6FZrCTDhhyqv8u6nhKSMV8CPhs\n        2nJyDFEC8tgdiNklUEn56OjlIjU5TQHsfJW8hIxfwbUIfUVHrVUgHIBOKQSL1QKtnA+NVkVl1049wAAp\n        k3C0RDKVEXKVHja9BL09HeB0t8GglRfqQEtLIQCmFH9h672TyhPJwI0ThzPo6W5HD4+PLg4Hff38QmLq\n        TDakshmMR7yF45ZIOoweKkTsPiE6e9lQS7hYWz2Bxh0tzBL0EEUHULahasNebve2v/RwebQUInSxueD0\n        C2kwOSWZntY6CIuSloHOAX1CCTUgPhR09Nq970HodGpwetp+X1JSMkNeW4niOuFNMR1MsvEbm5YbGxX/\n        UGqN4PCFaO/lgM0fgKCfi+6uDvTyBOjm9iOZzeHw48fp2Bb88z3V1U/Rsyailih6/W8V83BNaWmps7Ob\n        867Z4YFSZ0RLexeaWR1Ee6FYPfztJ7Cwb/HGzvauNbrfRWwnit77dxJj1lRVXf2YzjxyPRhP0nFbTeeD\n        CTz46FHa/+Zr5eXls3RPG/FV4j+a8ruJMWW62lBnT+8bmdwMTKbU3zdvrjtD3zGnXablfikDf1ZMRtdU\n        VlYmaWn09Pm2J9wvW//+g/G/qnXr/gULoJreVjKB2gAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"medalsIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAbZSURBVFhHvVd7TFNnFL9MXm1v721720tbCi1viigWSqG8\n        yksQeQkOFcEgoDLFIdDJRGUV32RuTCcLMh9TQ9zcNDOb859Ftuiiic65VxaNi+6PJVsWs/3D4pzt2Tk3\n        ZXFLpkzYTvILLTnfd37nfL9zvq/ME9pTCDlCQBgQakQoIgDxvxgFCkFQUNb/eQbiP7eAnNSoioxZEVWi\n        QVxgMBsWGExijcks1sQbZNWZtoRK8vHjP7EAT1PSgxerLdDU0wQLV9VCbX0BZDmt0DqHkYA+dDTBCKrI\n        tBMJ9DiYexTI6YiAqEwbpOTEw4IsNayxMVA2m/GiTwRCRMjIHzFtJp07EVhjZyDPYZAIWHOsUJfFwfJZ\n        DDQmM76QkJD8oKCgmeirQ0yrMEn5rKeMubchm4HC3AiwFjiRQBRU5wmwKYuBlhTGx7PsSiRRgLCgvxIx\n        rQQEIuDO/CuBVfkKcGcw4HYwoOJUfaxMttBfBZV/3bRZuGcuc78tjYG5OUaILi4BW5kTOsoE2JjDwNp0\n        BjQqzW65XN6EBFLQn+bDtBEIioyMLF+TzoxXGJj7RdHG38OT0x/YXE5vhUvv3e9ivO1JzAPbzJgjPM+2\n        TgcBWjjRSgGVBamrTnuefVA7ewYQrOlxEhISVFCRq4LFqUoJV8YGvBGiahMSSMN1Wv8eT2xScILIzyjq\n        X+UCc1jwF2F80Dm1gb1iSTTc0mjZOxq94rZRE/ptbqzizuByl1fklbtCQ0OzcZ0eQTNhSkKkfqZq6FZX\n        WG7lp5i+0XLsCwmx0a9bLJZ3TGHiqXB92Lu5zllj7s76242VM39SKpXrsAsKcY0ZQYNpSgRm8DxPambD\n        BEW7Z0War7U64fL23qrrvc+WXe/pKv1yYGvNjU/HDt+9cvEQmAziSSKAQiwPDg6Ox3UcYkpCJPYKvV5v\n        5WQye3ay6Y7L5fCurHR5n3ZleJcUhMM8l8Xb3FT0u8se/b2K4zZxHLcWCcxDAgm4lkdMWQeBRqMxPiMj\n        Y4mgklUV5doH2htyzns6Kn7xdKT5ks3sKxqlbB1BhdkrsQ3xCIoRMbiWhtGUK0AbKMtKSpqbl9XuOHrk\n        pZsfj9TCCU8uDD+XCds2ZPs6apO+SIzSvcKybJtMJqv0dwG9FUhDU9IAmURArVAkX7p04uevrr4HQx1z\n        YM9KK2xvjIcti2Ngc5MNRvucEBOp3Y2Zl2D5E3ENaYcupCkRYLG0mWmJYtdzdbZr186+Bl9++AacG3kG\n        9nfZoK8xAZ6vi4G2+ZHgXhwHW9vix5eWmC/k24wjKNp8XB+EeDINRJvN8zsbbJ+1L0r8ca49Ymx0h2v8\n        8qk9cLS3CM4fc8Ox/lI4iFnv604D96I4aJ1rgl3tdpjn1N+scUV9vbnCeL/XvewcbkUT8d9VwmzUzTm0\n        s/GuQceV4letXB5SemZPJRzoccJQVzqMDlTC2ZGlMLKtGIa35MPO7kxoKjWBZ32WLzvFfAZvxTqjTre8\n        r734EwLuQd1A1/OkHioBs2OFDUQgN9XUTmpWyoPLh3uL4eW2WXBwYx5sakySSJwYrofje2uhf60dVtfE\n        gMeT4ytIN18witrNZfmOfZePd95rKLddxD2icF96xE6QeKSR6ELM4XxtX7P96uhW148tlUmnX/NU+97c\n        VQrnhmrg6OAiuD62Hk6OrJTw7vEuCe+P4t/9a34bPdY9PtBdP56aaHobZ0KpLDDQ4W/LieN4pBHDEFRy\n        HLZUpl7H1xXYDGOLXbHf7XU74QBWoL+zUMKeF6okbF8/X0L3inxfaoLmM0HFHVKx8l5eqWyh48Dghdia\n        9EagC+qx9wMRoBFqpn6mqWYO1/VG6LWvLswJ/6EDVe+ut0pYi8qvydNCQ1m0hNjIsBuiTnxLUKsHeZbv\n        wbHcTA8UJPDwU42e8Y8kQEdAA0SkcapSqfLkwcHzFYrQBrVS0V/oMH7TVDzTu63NBrs6HTDYkwVLSqJ+\n        jTYJn4uieFYQhCNqnt/GsewzrIx92p99Ku5HlxOJ8bFHQOzIiX50SCRoA6oEZtSCm/frNJoDYdqw0xjw\n        I51Oe94gih/odbozolZ7DF9FL6JfB/pX0BH6h5IJQedP2U9qNE+QoOtUg9Kl4/iTBL79NgpqYRCzfZ0y\n        FgXhsFajGVLz6h2cgmun4IGBgXa/+uncJ35BTSr4wyZ1BIIuFT1mY8XHRhZmtgDn/goUmRtvwF41x22g\n        W1ChUCzFoAXol0T+CApMoqN9Htv//2S0mKpBuqD5bqQAVF4SF2ZbjihFYnlUJfxfNPpoEJMePJMx2uTv\n        ROgXUAQGtPhLbURQualaE1lPuxERAmVGFw0dDxGibOkzEZxkuRnmD/JMB8QTl39gAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"killLogIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAYBSURBVFhH7ZZ7TJNXFMBL+/VrS2mB1lYKfG1JgZYCdpVH\n        Ka8CLSjQ8rDAeDhQkalTx3QPnYHVRZdlqLgZBY0yZ4woJoi6zKCydG7uQTYff/jHdH9syR5ZtsVtDJmD\n        9bs7x5VEiSAwF7NkJ/mlX+8599x7zz333Mt5iBLg/30k8kgGf6Qr/s8IRmlWkaJcmbGdlQvMK+VyucTf\n        NhPBQemIiIjIhvLcteBrL/yn7mimKyZtcHe70+Z77/C6azk5Vjs0cQGe/3eqVVE4abfbVTX4dtsXntY6\n        1qSTHfXrsN/dfiYXdbjS7jAzQ12eSvLtVc9ofX35VmiWAmKABiY6uLNqjUaj3b27rfPL6wfHju5YRcoy\n        maFgscABOhxUAAT5uZ+PeyQgRiVtd2k0Y93bGsjgeQ+7fXvLSZqm9aCTA4EAOsWBEaERpL+/d+DKxT3s\n        yb3riRv6xoRLX0cdEAyoADWgBETA1FGQyWTStGjl9fJMHTmxq5EMvuth9+1rO8fn802gjgAwP/iA0GAw\n        xA4MnPJe+aiT7T+0idQ4Eog1RnkDdJF+W5x4PKADZAD2e7AoQoMyHOaIoYrsaHK640kyeOGAr6Pj1QGK\n        olJBrUUTSLYYWPn5y5/sYQeOeMjignkkf37kbzSPUwJ6A5AMWIBEIAzArZgqj+4VRWhopsMcObQoQ0f6\n        u1bBJDxsW9vGfqFQmK1SqTJ6evafufTxHvbC8c2kLn8eKUpicPBK6JoE2IAcIAXQALh1U4f+fiLgcXKd\n        KZHDbtyONxqJ17vL17pp9VmMxqD3hO/soZY7K3elMsN8PmcpdMGBC4EFQBqA0cIEnvngfgkQ8HgL3Vbm\n        lsuiJp0tVTCJLt9F737fqY5mUmnTk4J09YiI5jaDbRGwCHAB6QCuHAfHpP1HwqVpjqskWXnz0M515MbZ\n        beTYa43EZWFIdQYzJOIHbAabKqAWKANw5ZiAD874GQj/+SbX6WNbN7BdL1USe6KCLMth2JT4yEswwgrQ\n        NwIVACbpXADP+/QTboLwGmocLyWZYnE1GD660Z2zs89TP+JZW8Cm6SRkabqSZCWoWI/TMVqen+IFmyYg\n        T60KXV7ttr2MfQA8cuM1Y0bCrcjXjD3zRFY3fDOJeqZ5ywrHz2srktnHGJGv3igdSZVJbkcrBL7lLhPr\n        abSPzItVv8Xj8YpXPG7pw77QT4F9gVBg5jkQEiQqrbOZ//isd+Of7tS422VZ0awhjGaLjXN+CQ6iDwcK\n        6G5HvGhID21lWTrWmaMa9fZW+JyFqlGJmH4aXGAS4onACjir7aAkIrq5ptDMvrm5giQwYmKJEP0qFtEH\n        QYchXhMopDamRUl/Qh3agC2RBArwAloGVANWAMv3rE6BINdiPFDqmE9KbfGk/VkXMeqUn0P7DmA1kAFo\n        4qPm9qGuNCeeoG12kuEql8tpAR0eyXBgeqXXL3hkEEG2Ja69tiSD1YTLxsKVIZ/aLZof19fl/gA6XH0x\n        gBeM8Ln6vKt5KdFfqRQhg2Drqy1JJ9Zk/Qc8Hsfpt8EJTCv8GCaRRCKRF9lTWmpcmjGVas6oShH8TkBA\n        wCsCPm9nhlE7UlWY+B2fz62DOyGlrmj+NatJOww6rAMvhMmDj2Mfmy3NZ03S94AN5gFuwQMngUp6Wa1z\n        5ft9W240VTuGjAbpiEIm6YF2DCcWmWSK4j6lV8su8LncJRTFSTeqQ/toitsKuiVAAWCWSQNbY3VBt0qL\n        Tb+fO7Lu61xrPPbH04BX86STQIX4WNeGU+TWGbJyUToxx2k/hLYXAXxU4F5iScUbDS8avGDQaRSAtx1e\n        03MAfHBoE/TMgcX5RkKGe8m+XU2XoS0PwOM4aVXECQhNRnXdqtLY720xypshUvF+aFsI4HkeLyYYShwE\n        3wN4tWKpxW9cHTpHm8AgEV1qjZJ+s9SuvRkXJcdTgxPAh8mkEUBB5wzsbwOEeg18422GK5/4qEQnE7lb\n        0D4MkrCc4nLWwzcm7HgtmFLQEa4I6zi+ZkKAmb1o/xb0gxHByKGf8VfQxIneV9AIwz0e8tnKw/Lzv/xb\n        wuH8BR9nnWoaJVnPAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"assetsIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAhoSURBVFhHvZcNTNN3Gsd5R8bb8VJREFAQgUJLW9pCW/r+\n        Rim0lELfpBTkRUAciK/MKaJhBMEhzL0Yo87bzZvz3M4zni6389CY09zuzlwyXbbk1Fxyy3LZZaeR6A3l\n        e8+P08TNMHHZ9iSflLZ/vs/ze57f8/x+DXrMgh++ftvm+vwHt8cdhRDf5XiuZ3/SYB/xkxlzxlYbTiwg\n        nnv4yt6HEo8y8YMHxQTDiKiEhIT4lMzMpSKV3leit7Yt4xZJk7OycpKSklLj4+MTgjicGHqOBRVBsKC+\n        dzCPr/a52NjYpEUZy7kKU9Xm2kDLR16vd8rjqYbH65pyen3X7L6G35udK/cLy7R+rrC0PD07v4DD4SwK\n        CpoNiGkwrXkbezgiKCkplonkFUlNFXX+Q00dHTfUavUDZ40B7W016F7rwZqOOjQ32eH3VWClrwqBRvd9\n        d6P7q4aOjqvuVasnDXbXnlxhaVUch5NNmvPKBnsoKjEtbYmwTOep8TefbGppuVVbY4G7zoSeLi/6NjXh\n        xb4WbH+xFTu2r8bADqK/HVu3tmBDrx+rW53w1JpR5zRjeGwM2/sn7vGlij7SZSV5qkXw5Fqbt+35C4Oj\n        o1M9Pe3wuU3o7anHtq2t5KwdgzvXYHioG2OjvZjYuxmvTvRh3/gW7N2zCSO7e/HSQCeGRnbgV2fOY9ee\n        A7A6alAoVXSR9rwCCJeV2zsDgZ3Tnev78MbPj+HQu+/j4NGjGBkbxs6BLgwPrsX42CYcPjCAo28N4/ix\n        URx7ZxRvHRnEkcMjmLz8R1y6ehOrOtdDJC6C2+OYySuWeUl7XvsgLE8ks/b29X+9Ydsgel4YwLoXdmLL\n        jiEc/fWHuHztJq589gnOX76I0x8cw+mT+/Dh2VfxuzOv4y9XzuP21BQm//Q3aAwmZC1NR27OUohLRA8y\n        8viVpD2vDIQtKxBIHA7/ndWdXRh5ZT/ePH4aB4+fwuu/eA/9I/uwfWgcvzl3Edf/+QWY3b43hTt37+Du\n        9AxeGp1AAa8AhfnZKOQuR96KLHC53PuLM1dUk/a8AgjV2d27GjvW3rVWGKHXKmAwqNHaRXUf3493z5zD\n        pY9v4Oo/vsSJD85h78G3ceK3f8B9CsTd2EyOcyAp5kIi4kIsyqMgslEiF3/NyciWkzZrx6d2QkhJWdm+\n        /v7++28ceRvVda7ZICorDLBVGWAu1yGwqhEDu1/GqclL+Nd/7qBr/TZ8+vktdK1xQ1bCh6pMCKWiCOLi\n        fBTxV0AoFP6bk5oqIO04gg2o79wLIQmLszKK5KrzSqUCdkc1XLWVaGyoRcBfC/9KJ1Z67PARDf46HPrl\n        +2hb14cLf/0EGrUEWpUIek0xBcBDqbQAYmEuJKWSz5MXLVJFRkayWZBMRBFzTsngxCVL0jQ211FeYT6q\n        bSbU+2w0cBpm6SS61zSi+/lmdHU2Y3hiP9q6+3D2wp+h0Yhh0IkpEBFUCj7K5AUoLeHOiCWim0mL0+1h\n        YWGsDPkETcigWIJl44kggqMXLkwxuhtGnXVObNy+C69RKeTyUjTUO7Bu3Rr09naiu6sRXpcNO4ZeRkvP\n        Zpw4PQmNUkTOi6FmJSjjQ60sglrFeyCSij5dmJ7ZHr5gQT3pqwkukU78jGD74hsWHBcXl6iocGzWmayI\n        WhABpUaHKx9fo54WYXxiN147eBi1ThPaWjzYumsIgY6NePOdk7O116gE5LwIKpUQZmMx9LrMaYVWcYOT\n        lrEnLDKyKzQ01EY+WBB8ggXBMvENC2ZngECpD7R2bUBMTDTqvH4sz81H75Z+5ORko0goQE2NGc2BWmx4\n        YRs8jR14hbpBLhNQ2nlQUP31WgEqyqWwlmdOq7Xa60mpqQdCwsI2kL6PKCeUBMtEIvGERXFL5DaV0YJK\n        pwsunx9miwXeVe2Ii4tGTbUR/no76r1V6OhZD5urCTt374VUUghZaeFsEHqdEHZbKaoqpPf0VuPNpJTU\n        92j1A6TdSFgIloUVBCvDExbBhlFCUvKXEwcOI9CymmiDRFZGPV5AtbfC7aqEq86CptZOWBwudG/cOtv/\n        0pI8KGSFMBuKUVutnLFZpPeMNtvN+ETOqZCQkO2k3UBoiTwilWCXmicsjK9QVQmE8i84yQlQqtUo4Asg\n        kfBQ4zATJjhrTJQJEzz1jdCVV8PX1A6hgFquOBfy0gKUm8RwOspmenu9U8byqs+iYmKOBIWErCVtPcHa\n        kXUCuyuwi84TFiZU6toDQ2PTnb1bkJSQSOM0C1VWLaVVD3uVjoaSntDC6fZCpbfC6vSAz8uBSJADBbWf\n        USeCWi190NLiv5XPE14MDQ8fJF2W+kwiiWArn3MyhrL7gEBp2KPRaaA3mVBh0aDS+hCLEhazilDCaq+G\n        TG2CtrwK/MJsCIuyaC/k0iDKpwDUD2jvXKfaHyJJB+kuJeKJR9e1OSdiCLv75Yplq/hCEcrNaug0UpgM\n        chgJg15G70tg0JbAUlUJmcaIkjItCmju87iZlIksNDS4IJOZ7gQHB58ivQpiGcGcz+s8YA+Es3mQzRf6\n        VaaKyUAgMF3tqJjtdYWc0quUUJupoS83UwYM4Imk4OYvQ15uBg0jGds3/yXnZ0mHtRxLOzsHWL2f6vxx\n        Y2mKjImJSU5OSbMKZGUnPM2tt2tdDhj1pbQHjNAadJAqNFieX4DcFZmQlgoglUrv/T/tQQqCDZto4pku\n        pd829s9RQdHRKbGJiaXLuLxxW53r7/UNPhgsZvCKZUhLz4bLY6MhJbz9sN3Y6cchIolnWvVcxkRYRthJ\n        lhwRE5OfkLJ4C19U8tHy3NyvEjgpM3yx+Bp9t5F4NGKfOeXzMSbIMsJ2MnOSQqecIiIqqpb+znj42TP/\n        Dvi+9igYtlLm9EdZ8Y9sQUH/Ax5jggL5F6f6AAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"ordersIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAiYSURBVFhH7VcLNJXpGs6dXLa7tkQuXZRrEtnYtMkhyshl\n        10SR0k03ISmEUKlRkcYml5SITE4XKUlmx6hmJKfkNmZ3mS6zlHOkOWQ/5/v20cxqTq3pnDNz1jprzbPW\n        s/ba+/d/z/u97/O+32fMH/h/hOQopQllCGUJxxLKE8oR0t8lCMUJxQj/a9CFpAjHqqqqKqmoqDCUlJRU\n        1dXVmRMmTNA2MDDQnThxoh7BRG1tbfLTBG0tLS1NBoOhoqampkjfG33/3w6GviCloaGhQAU1NTW1xo8f\n        r0MEJ5mYmJix2WwnSjc3t3muru7uHA7HhX63IbCYbmE+efLkqTQoGpCioqIaXYesRzP3UZCk0TOZTHUq\n        amhoaGRubm7h4ODg6OXu5cnlchdFRkZGb0/dU8yrq3+4ZsfO2oiIqJiVK1euCgwMXOrt7e3j5uLmxmKx\n        7M3MzCzp+ySAcTSDZG1ang+C7lqOpo9GTl+cQeDi5MLx9/fnhq8ND09MSEzifc7Lvdt+v7eurm6k6H43\n        agRPsLWorKu2traho6vrUXp6+oHVYavXBC0JCvL09PSyt7Vn0YzQIEYz8d5y0FqPpekyYBroGhsbT6c7\n        9v3E13fdunXrkxOTdx07ePDcreuNd0rOV7fuv1ArDKy6isbvn8Ln1CWkNrXgwZOXePB9P87W1Avr6xu/\n        SUxM3EUD8Vngs9DOzm62kZGRIS0n0aGe+BeMpSmnpqI1prsm6QyMjYndnnUw6/Cpk6dOXTl3np8cHSUU\n        tNzB3pJKKFvZwy5kFfx3pqND8Ah3ux6j/dtHeN43gCc/DJBgnr+uqKioCg0JXUFLQjdFvUS0aOe8Ayka\n        GXUzFXd2dp5Da5mamLiXf+zkQGfrnW+bm7662Xq7ta2hsuJlvp8fLpWfwYwV6+C+KwOdgmfo6x9Ed68A\n        t5sb8OJlH179+AZCIYBhoLu7+2FUVFQMNSctLdGjLfszaF3og2kEjnaODlw/7qLo6OitR3lHC699UfJD\n        bUoKeqqqhgQCwdOeXsHL5MQk8E+Xgt/cgkvXb+NGWy9aO5/h1vXLCAzgYk9SPHo7vgGEI6IAKIVDQpSU\n        VVQTS1kRSdqaP0Gc9jZtGWtL65nUNGmpadn8en5Xdma2sPpcNaryi3Du0D68HhhAzcUaNFxrQM3JIvyl\n        4QoeEANeb+nC/bav4TaHhbKSMsRExyBuZxzKT+ah7+kD/G1wBJ2P+1F78zsUH697ZWlpzRnVFkGCpp86\n        3sPDY0laWlr/3da7aLnVgrrLdaiqrEJ+Xj4OH9iP6hNH8bjnOxQUFEDQI0Durh24dKwQN/lXEb8+GKSE\n        yDyYiYqyCkRHRmPj+nA0nC/DlcY7+OLyDZRXN2FTVFq/qamp+6i2COI0gCkEHCfOAvIQAf4BSNqZhOys\n        bJSXlePsmbOoqa5BU+OXSAjmoqe9BzV/Lsfw62HsTYjDrbOlKDiSDv8AH9ja2mLDhg2wd7BDaW4ajuQU\n        oOpSI/JOXcaO+PwfSSfkEE06wn+COO17OuFIqzgYGRqNRGyKQMvNFvQ968PI30cwNDiE40XHkbE/Az6+\n        Pti4LAA3L5/BQP8LdHe0IyEuFm1Xa1FZdhTRSVth5zoXWXtiEb89FoXnmpF5ohaFlXUjelPNH0hJSYUQ\n        TQPCn2cBnVC6urr6M2fOtCY+fDjPYx7me83HIu4ihK0MQ+mJUuTx8pCSlALv+d7I5eXC3mYWSj8/jHv3\n        7yG37ir2FRWh/Ss+kg/sQ8bxXKxaEYikQ+U4VFyHtJwqOLt6Ds02N+gRFxdfTySNCN8ZRrI6OjrjSfpN\n        yfj82t7eHmxHNlw4LvBw98C2rduwO3U3IiMi4ezkLMoEfX7xWj2arl/DK2L0I2QG8IoLRI7/7MtmuIds\n        xKerY7A75zy4S5cOu+npDUtJiGUSLSfCd7qAQoJOQGpEIl5qYWEBWxtb2MyyAcuOheXBy5GWkgYyikXf\n        c3NyMddlLjo6OlBRcxEZV/g40CFA6vkLqCSDiNfeBb+UQ/ALXA9yQI3MsZstVJKXOU10vAnVRIq/gNjb\n        WcBx5qQTH2CG5QxYWljC2tpalIWEuAQsC1oGe5Y9Co4WICQ4RGTOgsJjI7Zs6yHviGihf3y8MJvfjLsP\n        e5FVUozkpFgsJbsvSN/8SkNDJYPo6FItkeJ7IE3NSFwcSkYy9PX1QU5EkPkAGpCjg6OoO8ggQVFBEcjZ\n        gPa29mHSPE1S0nJ88re31U1Nmrlx2/+6PHyt0ITzJygp6Q+uW+PznGXDHCLrp1MNkdIHQCOTIYbUIdko\n        IZ54SsSHyXEM5jgmaFBurm4wMzVDzpEc0JOQBHOEDLEwBQWF5ZKSktvEJCSyJBkKxZqGU+4RM78JCfTv\n        CA+a9kZMTOwiWVtDpPIrkJaTk9NR0NPxVmGzElQ5jrxxK5d2agX4v9AhtZy82A/6WzdjwaE9sFqzvEPT\n        xytr3OpQnqKlmRfDxSlC2shgg5icTBKbZVUbG7ul80Z+/nB42ILX2joaW8ja9LT9VdAbi6YsU91BwXTa\n        CnkbqwQFh1kHFNzYhQxXduk4jmOb1uKF903CgtvGTjeOUnRmbVH91CdWycLEVcHU2EGKybSSkJdxkZaT\n        zs2M3zzoyLbpl5GR+Yy0XihZlyFS+AgoyRoa2inaWC9T8nLdIW9rFa4cFJCnvNiHx/jE47BqkG+OWugS\n        nrKvZzzD1ytC0ct1mWowd5PCXKeF8iwb1zGysnpxMeGtDtOmDZLU7yLryRBzG7I5bM9/Lv9xoOmiN1xl\n        Qk1C6l46PKaMftIjle7ol3c8sQ1JsdnxpBuMTSfxGQx5J3J5nbFkid9a3QnMLPL8o++Eb0GNSUlvMDQg\n        SjrHP3iv05s6iaupplw9Xlv1mram6gVtdZXTGhpKVRISYrvJ44/ywW8BulMaNP18+//De69hvzf+Zzv+\n        A/8hxoz5B3NA8zGyhn5YAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"contractsIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAjcSURBVFhH7VZ5UNTnGU5bEVQIaKiIimKMEQJYPNFd1IAg\n        hyDIqYACyo0gct/LfQgIy3IGWMBlWa6V2+VGLlEIRqpGbdVmtLVpmxmTPzrT2Gmevh/ZOGliU/ijM/2j\n        z8wz3/6WH+/77Ht971v/x/8EDh8+7JWfn98fGxtb6+rqms7lcoP37t3rqaen57Bp0ybu2rVrDdasWbNR\n        /vqbsFxDQ0NbWVn5l/LnpYH+WW9qagqTw9cwNtiDYVkH+ruvoqejFZ3SZkhbm4h0trVALBb/VSKRfEF8\n        OTZ2HTenpzD/yRwe3L2Dqqqqq3KTS4dIJLo30deM0VYB2qqy0F2Xi6byNDQTG0tTIRLwICrmoYFOMT1L\n        ytMhrclFTwMfQ22VmOy9go42yTdbtmzZKze5NLi4uPAmRvrQLsyFlbUFPD2cYGtriagQb/h4usD7tDNc\n        newQFuiJgHPuSIwKREF6NCIvBqE4LwW5WTzM3xhAS0tLr9zk0sDSMDE+jsHmEjg62CDEzwMWFmYwNzcl\n        x8fBPWgMf++T8PU6iQ+PmOKMhyvc3FxxISQAl3NTwC/IwvVeCf784hm2b9/OkZtdGurq6u4PtNeDFx0A\n        40MH4eXuiAPGXHLqiiNmpggP8oKDvQ1cne3h4e6CAD9vJCdEIDs9CcOdIgx2ivHk7jRkMtmw3OTS4Ozs\n        nDIk64S0KhM1BfELLMuOQs3leHyUF4fawkRiEuoFKWit+jb/w1erMCUTY260Hfemr+Hh7CBe/uWPoA4y\n        kZtdPCgN+qOjI2Q8m5zHoTw7EiWZ4RBkRtAZgcLUCwufizMiUZmXgCulmWiuLkC3pBJjvY2Y6GvF/FQf\n        nj26jZGRkSm52aWBuuHTzsZK5CUFIyvWH5kx/vT5PJ0BuEQnPz0cJdkxKCcBNfx0tNYWob2hnMIvwnC3\n        BNPDnXg4N4qXX3yOHTt2WMjNLh4nT55MHZJ1QUCOcuIDkRHjh6y4AKRH+yE9yg/Z8UHISQyBIDsONcXp\n        kNQUUgSqMNjRgJnRLsyO9eKTG/34/eN5jI2NzZLJXxB/tmB8MdiwYcOOyYkJ1PN5FIGABWYSUyJ8KAUX\n        F76XVGSivb4Q/a3U/9ca8THl/+60DI8+HsbjOxN4evcGPrt/E7979gc4OHnMKK1erSU3vzg0NjY+7Gmu\n        Rn5yCEqzIoiU80uxqKEibK7MwlVhPnrFJRhuF2JSJsGtISluj/fQHOjHvVtDuDczitmZWdjbuaFvaPQR\n        mfz5t5YXCTc3t7SR/m6I+MnkOIYKLxzFlBJBZiTqi1OoABNRJ8iEtK4YstYaDHU1YZzSNjNGAuam8JGw\n        DZz9h3F7ahCfP38CZzfvULnpxWH9+vWGN6en0ViesZAClncWDX5aOLVjPKov81BfkomGynx0iavQlhSK\n        /vwMdKUlwc3RDWqKaqgIC8KwsBSPb0/it/PzX6mrq2vKzS8OUqn0N11UXEWpYbicEooCXih1AZ0p4ShI\n        pUiUZEFcWYDJFgnOcw8hzPIYjI0soauuDWf9XbhgYwvBuVPozIjDg+nrqKioaJWbfiNYlbI8vaatrW3G\n        cF8XynOikRrpi+y4IGrHEKqDZLRW56GnsZRGbxduNIow0dGBuYERPJ1/gi+fvMBQZSHEaWmo56VBnJ6C\n        kZpKzFKKjh496kq2fwTmcBlxOVFRTiXaAfbfoCtaXJqGtCjf1wOolp+CDuqAHkkt+kr4kKaGQ5gQglqK\n        UnN2PKQ5PPCDvVBE7ChIxpxUhHt93bjVVIMuYdGX72pp7SH77AerEJnPhT5lTpWJasTVxDXEd6gbnrY3\n        VCwUIruKJVQTLTQlW6svQSZpRmtODviBZ1AYQAz2hijhAoRhXqgO9UJ5qCfKQs6iNiYYFRcDURnhh0y6\n        VSNtzF/FRCeU2tjYRC5fvnwb+VmIAFPCFKkTWbFsIG6klwT9PVJcoW5ooPlfTyKuCFJpBGfgQmAQBiqL\n        EWNtjvfe1oCaghqMtN9HsZ87BAGeKD9PAoI8UOzrhiISmOZmhzgHa9D29Y/2jqG7B7jc2JUrV+4kPwtg\n        UVhBZL+cOd9C3KqpqWk/TlvPFWq9arqYynNjISziIS01HbbWVnRle0F8KQvRtsegqaQOFQVVaK9ehzwf\n        d/D9PJFPewPfxxVl508j64wjoo5bISOMh7q6sc/0DH6VumLFitfLC8sJq4NVRA3iu0Rdon5DQ8PzljrB\n        QiuKKAoVJflIigqGr4cj7K1N4XPKCYFWVnAy4kBbRQOblDWwQekdeB/mIv/sKeTRVZ7rYY84e0v4mn0I\n        Hq/xVU5O0xNdXYMCJSWlA+TjNZgIBeLbRDY6PyDupjTUdV9tQioVopAmYW7iebqMopF40QceTsfgTPtB\n        VlAgktxPw2ybHrxNzbF70zaKyFoc2foBgs1NkOp6HPEOFgg4aoqSktGvvfySPlVTU4sjAcbk41/wnQhW\n        iFuJuykN5wb6+1FKTtl1XEt3gag8F6UFGYiNCsMJezsYczgwMzoAYx39b3zMLWCpuecVl2v81T59w7/5\n        mRxEoJkJ/I+YwNPMEi1tD17ZOQc+oA06edmyZQfJx4/ARLCuYAWpQ+QIhcIXbEMe7LuGcVrbamtr/15W\n        Vvbc399/xsTEZHTXrl1jtIyObt68eUBHR0dmZGQ0ZGFhMWtlZXXfYg/nT3FOtOJZmSPKO3QhAgcPHbtP\n        +U8hAVyy/0YwEUpEVg/6HA4n/8SJE22GhoaXNm7c6MOUE/dTCLmqqqqmNGataZk5xqilpWWnq6t7bt++\n        fWlU8dUkRrzTwKDHxNDw2TmXQGRnlHyt896OX1MLJjAbzNm/w/dFvE9kNcH6ltXHWiKbGax1GVndqLKT\n        sIZEadN9wqGo2BAdaai5UcgDDHdyei6G8F6tW6d1h5yH0/v7iD8JJoLNCDakmKOV8mfWMWx+sL//kKyl\n        mfDVq1at0qBeX8dOitZm+k5HWVnVT0NDU6aoqHhWQUFhN333H/FDB4sBE8eEsIJmYtnn76hIggxUVFSs\n        Sdwuev6v4qcEk8i3FP4JLcHsoiHcojoAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"walletJournalIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAj3SURBVFhH5VZ5OJXbGg+bzZZ5KFwphGQ4aBKdrWtIsruR\n        6mYmMpZM4YSPokQlJ0LRzlAi81SmuxPSKUXiqI5uw40GdXUanAZ7v/ddDedxnurk3uc+5497f8/ze75v\n        rfWud61vrff9vd+U/wXwIfmRQh+efyjI4oIyMjJi6urqauSJbdq7kT8AZHEhWVlZheWIgICATZaWllYK\n        CgozsJ9sgox/JP+HzTE+tP8rEBATE5OxsLAwHxr6aXh09PEvt27deN7Tw3l85nTBvcba7LtNyMsdJ+7+\n        wMkbun6lcbj73IlhcXHxBThX+L2L/wy/fpWEhISkqampycBA52hhYeF9b2+va/r6Oi2ioqLldDqtlFBv\n        rlr9EcrpFRXkDCYGBk/4+PiO4Nw5H3x8HeRINdev2rY6NaFudXpSy8JQv1xja0sHHCLHyVBUVFRuqD54\n        d+nSpRx8TxQSErLFflNCOp1uxj60u/c7r5WgoqLylp+f/wH270LKIr+OaSoqM21q2c/DLrWMMzmV3EIO\n        hxu9P4HHTI4DZkxY2cd7nWeoEzV16tQDgoKCutgWRAogaY6ODlH5O31AW1t7XEiQ9hj78pHqyEllC79j\n        gE8YVV7AczmeA+vYGWAVFw2pDTXQ0NsN6dc4r5WVlRXRjqSflICAgAU+pZF0aWlpcRZruW1fGzW+yc2a\n        J0mnj2L/GeRi5KSzhM94tV181cgg7Lh6BsJPlUB2RwtcuHUTeABwsrdrXENHRw/t6MQWSRwLy8nJTTcz\n        M2XeGuwYKToQBnOUlZ/h0ffj2HqkCHLy0HSwDV+emQzMffGwrjYfglurIfPiWbhy5xZQfV3js2fPJsFE\n        TkDYyWmNs4/PhsCoqIjoKz3t/YPni4HTnMsNCVn/0sPDoVNLS9kV7f49jZBfsmiL9aEU8G48Dr71xyG8\n        qRzOPL4Dg08eQWRt6biUlJQEmglg1MvPM9Tcu2KZScuFjtx/9pw9Bsk7bbjLrJa+WbhAc9TQQP26mopC\n        DdpaIieRghhcWgYGxnO8HA8Hna8Bg+hgMIqLhEU7tkFocQF03xwENzb7rSCDoY/WNsh1yLWLFxvmVhdR\n        b3ZSgSTwxjCDujATEnFsKzIcSTLkd6+BsYqKyLKvY4/4c5peZ9zoeutWXwROdYUQcL4OnBqKwL0yH4o6\n        WsGiqYo7hUb7DueEIkPw7ne0VH7/ZNc2D5Jyz0VERAYwKxxxjGQKuSYGOSnyRH4em8NCIpuHb4N3czm4\n        1RyDPe2NcLL/Emw5kg2RnBqIaqqAugeD0PdwCJjHc7k4JZhQXl4+uroyZzCN2ohfrjmGYnMXAy8CxySJ\n        XwK0mbZvX0qqubm5NTZJqn4CPktfz4SM4V7QTYkFk+1R4LI3Beoud8H9Z0+hfeQeeORkQnBRHrQN9AOz\n        qpArr62ZYWjOzCoqOtZ7tasKbG2/fUOjCTxEX9lIZeKTOCYg8fJD28leHR2dQGySevEbJSTCwNBYb59C\n        gm7XnU4oe3EbLrwagSfjr+DJ2Auo7u+BmM4G8K09DivKcsG1tQLiL7PfXurrG38zdgf+VpcJDAbjOfpp\n        QBohiRiRRd6RFK3LbXlP8XSIEn7zof9XCEvMkFfV8HYtC71QCwYxIWCSGAvOmWlQ0X0RHj37GdLamoHV\n        XMmlSnN5ZpgVno2lEHS6GG5caoCcgxTERbgCRfnzMg/Gjx7N2j5UcJi6V4gkz2J24khtRTrEbnUGXOsE\n        Ugs5YQNYVBR0dZeYJUVXG8WG877dGweWadvBM8Ae3L3sITTMD+xC/XlKTObPWuEBD7f+dBbmJkWDXmQQ\n        zF5jBzO+0Ye5OtqgrK0J9Kn0bjpd6KIwXbAei1HFR2K7ButEO65WjVRD/mYDUkpG+mYGXm4Hmem7XjNP\n        ZHLNHFdCaqQH7N7MAndzJVi1QBF2B1pBZXoQVB+Jg9D6Aih8egNODPdDQUcz5NRXwioqliciLVnMJyCQ\n        gV7tkO+K0gQuQZLr+SQTRMQUFTVm/Zm5Rs/NaZ/8StYNKsaFdzwlAJJCVoE/Sx022qhBdux6OHV0L5xD\n        UdLzdQe9baEwj4oAv/xc6Bj4EZwOHxhTZVkdRl8s9EkincTW5/gJSMCIikhL/0lWS81wvvH85GY2Bfuj\n        fSA9xh22uptByhYWFGfFQHtlHrRUFYIhk8m1piieXVkOuFXkg1Fw4PO5G5zrFQ30WORHBf0RwSGqR2oF\n        keDPLjwR5E6IoWi4j0Prsf3REOXjAM6sb2GthS5scrSEVGoDFCRvgRO5e0BCS21A3sioR9vVqc7I3zOb\n        uS00T9PWykNKVVVHzc5mk+WOyGLHnH0dVntiGtTWsbIY8rJeWDHN0P+XhQjBh4qmz6k/ym3M2wtXmvPg\n        4ul8uNpaDKW5e4G9n4LqglTYnRQDItIS7SJy0nvEVVXnSc6apSumpDSbcFFcWJF3djKPyanhUuw0HlV+\n        lKeLWaVNUeNi6rOycRPkZ+aLp0Hz3eCcwSk6AH2cEnjU3wr9LSVws7MchnubYGzoR+A+ewBO7n99LTpN\n        rgqlmNR3IrPkvkXJBiLbT91fgldj/n0izI+PBPvkBIgsKYRttWWw0MvpHE1YmEj3FwuSQGrc5s6KgnTu\n        4bQE3qO/d8HTa40w9qgb4O0QwPgIvBi9D6y1rH/QhISC0H7q+2nvQJecOVPfJmPnYMI1zktmJZtLHUjk\n        xRUXwuNfXsLFp/dB2+EvlxjT5VzQ9rNS/A6uK0xa1tlZg6eHG/ht9ITYiM08Cr8oaQfFqzxZwLt9vRuW\n        LzOvFhYWNkbziWpGwyBWmmVjGazp5zZCjnx1IsVzaS4BR5xvHBE4oueydj85JWL7fsrnITJdRtLfUEcj\n        z8HG7ELEZs+HZAP5Rw5Bw6l6aKot5WppaMSgHfkXmAiyGQZZYIapsYPGGvssDNASfb8NpcuS4zts9u1q\n        JmJHRA/tJpUR5G7FkUo0vOvp8jK+JvP0M33d7NtQ84mYTPz6jyCORUSx8smoqGjJamkZKejPNZk2Z85C\n        sZmKmlPExck/45ePfxIgC5CN/d4XkI2RcbIQCTZRJEm9r837v8SUKf8C6Y7nxUrz018AAAAASUVORK5C\n        YII=\n</value>\n  </data>\n  <data name=\"walletTransactionsIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAkMSURBVFhH3VZ5VI3rGt9p2LVrkyQV2dUupUEq9xC5W7cB\n        KWNyNUiTKVMpyvQJcU4hUxRl0yAZ0kyTbdrHFCU5OWQZljjEyeLi0vC7z0ss52gd7l13nT/Ob63feqfn\n        fd73e95n+Hh/BSgQuxBVOto/Fexw5R49eghNTEzErKWx0vuVPwHscBVtbW290YSwsLB5rq6ubnp6en1p\n        nl2CrX9kl47LCTrG/xcoCoXCHi4uLs6NjbceNjc/fXPnzs2XNTWypyePZzwoK0q5X068Ij9w/4JsX+PP\n        V8seVv944GHXrl2/o72qH1T8b/j0Vd26ddN0dHQcVl9/rjkzM/NRaGjIDRsbq0p1dfVcPl/pMOMAS3HJ\n        Hs7339wCPwyztX2moKCwh/b279DxdTCTmk0dv2xS4triSdu/rxy8aHaawyhXL1pi5hTo6+sblBbsuO/k\n        5CSjfpyKiooHzTsy8vn8EdJdP9QuDRkLkUjU0qVLl19ofj1Rm/h19BKJDN2LpC8jL1e2SmR5bZkyWdvy\n        zWvbJfGrIFkReeTjuw6ys4rR0NDYpqysbE1jZaIiUcnHxysmfd1MWFhYtKooKz2luXSiCfGboqWLT9jM\n        SC43o91/fyqmSJPgtmo5EksLUVpbje03ZG8NDAz0SY6FX3dFRUUXarWIfC0tra6enqM96s5wrfMCRrVr\n        8vnNNH+SOJT4zVGi4DBpQmx+UwPWXDuJqGMHkSKvxMU7t9EO4FBtVWs/K6sBJMdnskSmWLVnz566I0Y4\n        Su40yJuyt0Wiv4HBCzL9dVqbSlQjfjvMvDyiRu+Mh2RTLKYUpSP8VAF2XjqNq/fugKurajU1NWXOxCyg\n        6us72W/mzOC5MTFLll+tOXu94XwOZBVpbRERU18FBnqdMzc3mEZy/12O0Bk+ZOGoXQkILduPWSX7EVWe\n        i5NP76Hh2RNEFx1u7d69ezcSUySv1xlkZ7ZxzMhhlRflab/WnM5C/Dr3tpFuTu8Gf2fWbGdr8rNYpFdI\n        sq7EbwhBci5zW1uH/iE+uxecL4Tt8nDYr4rGkDXLsCgnA9W3GxAglbYoCwQ2JO1OnEL0HjrULq0gm3u3\n        jpvLHO81RVAVRUIcrS0mRhFZhPzhMwjGc0uSJxZLm+bIyt8m3axqCSjJhm9xJsLOF8O3NBvT89KRLT8F\n        l/L8Np6S0lLas4gYQW+/pjJv67P1ywJZyL1UU1Orp6jwoTUWKeyZBMxSrCV2jvmREdEVD+8itCIXAYVZ\n        2HC2DIeuX8bCPSmIlhUipvwoin9pQN3jRkj2p7XRlnBGHR2d5QV5qQ1buBn05WavKdncJ8dbQmuaTC8D\n        yfTatCkh0dnZeRQNWah+AQXXWUFrkx7WwjphJYatjoH/xgQUX6nCoxfPcbbpAQJTdyI8ex/O1F+HJD+z\n        TcfCLMnOWZKcnZ1Ve60qHx4ef3+npKT4mHSlEA2YTqaYgfnLhTOHaq2srObSkNWL32RClhjUjUe7pDqv\n        XISFBVJskOVj3+lSlMlPo+yUDIk5WZgt3Y6pW9bBeecPmHYyF7FXpC2X6+pa372+hxPFOyEQCF6SnlKi\n        PZElI3bIe7KideXMvudkHZYJB3bMf4JqNx0tl1N1XKv0uSekL8YgjdqkR2Ow4dYYrKv2xEqZO6KL3RCe\n        44bEvGWYuDsRC44dwM3LpUjdwWHVkmnguDntO3fENu9NXt2YsZt7kElkbY40rqno6HasXOwHOusA0Zz4\n        2QWoqIjM+0UUvvLA3Tc8nHjFQ/krIbKoTSTGUn9OMw/+9Tz4yIQITLOHsb8XrCLDYDp5AvoOtIGllQUM\n        LMzA1+BX8/kql1T5yiVUjI5+JI0LqU6cpdMKiGLiby7QvW9/s8jjLeNxrlWICjqw4rUucqhNIn7/sjd2\n        N09F6A0hguW6mJnhAO/4pUhtrEF2Yx0y5BVILcnDeG5lu5qWZo6ComISaZ1AfF+UPuNwInueLyJBrY+R\n        UdDhN2NwhL74MH1tbrOQDuUh4VfqNy7C5vL5SKz1g88JIYL22sNk7ChYLV6AQdwSzE5Pg7z+J/ju3vba\n        2NNtt1Bf35N0Mk9nvtUZv4CioaHhuOx/jUd6ixDp9NXZZIEUavc8c0TWFQ4h14VIvBCE4LO6mJXpAGuJ\n        pM2T49q9SzIRcDQd9uFzX1oG+5Xo2w7wZD8qpJMlHJb1WK1gKbjTgz9BLBaPSm4agzUvFHD0SRD2PnHC\n        /sfeKKrfglnXuiHwNlnjdCCmHGM+YAf9fv3u9fmH0zmr4On59nOCUiTLFu0z83AL7G5sbCWe4D7PdU10\n        jk/qJrnbhhWl4imeyQId7RCqmCPoqM4TEV1g5I67/8SJZ9uxsSIUR6q2IqEyEPMvihH1VBczbgqx5dws\n        +BXrInTvYPQy6FOjadx3vraJia2mkZG1sHdvU8YhqyKzQ1Pi2yWywjZOuqWdy93bbr0iAhYc1yo0MUqh\n        S7CfmS+tIRYbjoyX+yA03xJ+13gIvqaBgJs8BDRQv04IbzkPXNkkFFSnYmmWD/RMjWTk1aa0laVZ9t7q\n        7ALRZ489Gk5P47w1Dn+LjcbE+LWIPpiJZUVHMDjE90clVVWWur8sSIbsAlXeiLpuiaifLLHi1iAsvkF9\n        GsfUDsKCC5ZYWDQM83d5ICLZC3q99bbTtk+plsDXNDS0cU9a17D2huyVJE/axm2La1+Vk4mnb17h0vNH\n        sPAad1mg29OfZL9MxeSEI+cfH4RxJTx4FvAwtoiHcUTW98jlwT2HB7d0Hpx28DB1ow1doFcCbdP4sPs9\n        lNS0tHobubuGm80OaGImnxTHtftXHIQPWcRhydymAf7em5mVmOyHLZ+B/uksNhXPeTvjkB2CMgYiOMsW\n        IR0MzrDF9L0DEZBmg2kpNlgtDWgRCFSjadvnDsUSi4Ad0NfRwavf5InJFtN8D9rMDj48Mj5W7r5pfYWe\n        tfVwlvRIrtOIoOdR9jEU991jZCJKN/6MbCwyFmWIjPtQ2yddoCHYTPKstrP3/xxMsZo6Vb4eIpG5trm5\n        vZ6N5bBe/fsPFhrqm/G6dmX/jJ1Wwo9gtZuZyOIrZDJMtjMwS7CLsIOYs6kTmaXYZf84F/wOTFFn/CuB\n        x/sPeMMKVkClPowAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"jobsIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAizSURBVFhH7ZdpVFRHFsfRUbZGURCkWWxZGni90N00S7MI\n        riigBFdcoqJoUA4RQlzQjDSIEAYx8SAK4oIK7qCoKJvYUYQgkU0QFRfERIMiAyiibP2feigJZyYjnZkv\n        82HuOfd09Xtd9f/Vrapbt5X+b//rNuQPvN/++fu/mLa2tj5HKF40TuySYsSzXkAeqX54o5gNFO33oX/g\n        9HPahowcOVKLEoo9BJ7eO8w/8yvTcQ3oNPP2g/kcfxhaO78QWEuOfvytwjZQ+C/EhxEfTlyZuIqSpuao\n        UWxqAnuS91+58/zzOQHSVt6KrXLzBYEQrg6HmfdqGM/0BXd+ILQ5NhDaSVJJP4VtoDgtqqakoTFGfZyp\n        2MjFM4i7JCiTu2rbr2L3lF5qzTZQAdEQbj8DalUYqOWbINy4B2yfILBnfwHu4mBo8x1ha+f0pwGGMRgM\n        XW2KP8XIdVYEe2HQVcuVm19wl0jfW03f10ttioco/jKoiIPgRaVBfLAI/LA0UMGxsN6SDGrFNzBfGAyh\n        3zfQFjnDVqI4wBB1dR09TWPOfD0Ht2hDT98s1mdr6ixWxbSZBkh7qDCpXJCQB2rXOVifrwI3oxyijFrY\n        5T2B4EQ5OAnZEO9KB/VlDNi+obBaSQDErgRgksIAQ5X19DijuTbr9WcszjFaGHKP9Xlos6U09b2ZV1ov\n        T7pHbpVxF1bF7bCufw9RdRtED7pg39QD0U9NEGXWwe7ENVCbE0CtCQPffzu0bQmAk2IAdOiH02utbT89\n        wmBd3HWTyMx6g40ZbczT1V3UAVkvP+cVhMVt4F99DrvH7yCpbIakphWu9e1wuPMa9pWtcK5uhDD+HITh\n        ByBevxP6jjMgdp6U9kHi3xstTu92BsNCMHGs+6LvWRuSbvGO3HxmsreonZVS383/20W5sILMtrEbwtpO\n        SJ6RWVd1QVTxFo617RDlPyIRqIBN2UvwjpIorI8DPygOTIfpcHBRDECZ7HYdDbGzt97sVQdZG1OqzZNK\n        X1gm5HRwrtT0UJGX5bziN+A3AFY1gP0zkCUgnz89/QBQUA/ReQJwqQLU8fI+AKugGDCdCIDrpwH6j5yG\n        iu44E03X6b7MRetOsb6KrzNNkDVbHix5z5PJeqlvL8m5ZZ2wIsLUQ8D2JQGoBcQZMngWlJEINEB0rhKS\n        3DJQO07+DuCoGMAwklxGDx/PFoyZPn+d3orQCyaRJ+sNkqvamEcvdNEAZtJkuXn0fvBrOsCrIDN/Ckiq\n        gKjqR1h58wlEFx9AdLwEkosloLYfBhUUCV7gt2DaKwagrKSrO1aVJ3LQ8V4eOi4oJnf8hgPPdcITOpnp\n        NV38/blyw7BYcHxmwy2vEMKKbrj8/A5RDW+Q1foW8+61QXKtAQ4Xb0GSVQpB3GlQX+8Edx2JgP00OAyy\n        Cenwq6hpGRgyBHaTdOauijD0D7vKnLm01X3NQrBSHnTzdmfJ2dJ4+ayN6xBR9Rihd14ivaMLOW1v4dbS\n        DUknWY7GHhKdFtjUvwR18x6obJKcjsnAdJ0DySDHkAZQU2UyxzHETtP0FvpHmQVGFPqExL6ds3alnJVw\n        vZuTI+v1iD4r//p4BjaczER8xR0kP2nGtBsNsGpoh10H2Rc/d4N60ALbhlZQz5ph8bQF3LIuCFduwQQ3\n        NwUA9PWNGDaSqTTAvLh91Y8bX6Dofh1ck9J6J0gj5V+eKMDe7AJE5l7DiV9bILj5C6ir94koSUZNBKCy\n        g3x/Sp43gjpzG+zwZHBDvwd/aQic3GYOCqBKLnF9VaGNq87cFeGTN22rKKyqQXltLbx85sB1z+Xe6NN5\n        +C4jC7E/liKrrQNWNx6Byq8GdbcV/GddoGregJI9hLCwFlTKFZhFHwJn824wJ3jA1mXiJwF+ywFqFjwb\n        Hc8FG9m+IblSqbSnveMdimTn4Bp7vPfUtVIkZ+cjrqQcGa87IC55CL7sPnh3X0LwqhOCF52gCsmdcKMe\n        7AOXwI5M6osA08kDWuJPX8cfjuHo0ZrKLBY10mnqAubitUnLpLsba+vuY9fBI3LztdIe9y1S+YGcAhy+\n        W4f8tjcQnLkBKi0b1JU74FU1gcq7A35BFfjFj8Elm4+76wz4EYf6EpGW9eAA9DKoK5GToGopchg5ZeZi\n        v50J5e86u1BcU9PDDJB22QZK5SmXC3Cq/DZ+aGoBf+85UN+lEohC8K89AXXsB5in5oObWQL2viyYhiX2\n        HUWDCV4KAXxYBpKMlA1M2AyRw5T9Zy887+nuRvqPlQ3jgsPPO4ZG1x3KzEZ+ZQ1qm1vBkyaCvWEHzGNP\n        g5MiAzs+o8+plDyyARNhHLwd3MBt5DqeDL6di0IA9GWkrsQYq6tn7+R+ofx2V0fHW0SdvXRNa7H/Zvut\n        MUcuXS+CrLQSxRUV71jL17/hBZCKaNNu8GJOw3QrAdq6G5yoQzAOiYExKUa4pDzTFjjD2nHioDVh/zLQ\n        NZ8G181z2aOGhtc1JPweodI4DZepc8T+X4WXPH76XkbS8pnSitpRs3zWanstjGJ6L7vEXh78d3Ny85mS\n        zGdBKiJjcvaNFwWB8t1KABwVBuiPgjKdFS/nX70Vl5CYzzCx5KmzOUIdieuMlIvZTfHHzv4SFJ90is4Z\n        qnzrCfTJGW5sbjXCxnnpWLfZqSx3v1dmS0NhMj8YlkvXfwRwVKgq/i0KuixThyV+qxOX+n2Rrq7PEinp\n        6OiNIWI5sqL7EfGJuZSH9+f0XqFvTzqB0fcIvX9IXwbtauMtvDQ54tTxk+e2jLYQQuzgPGg90G/0Elio\n        MkaETJwy5ehQxsglalpaBuSZxihjY6sde5PLko6kpatpGRr0CZLynCSwEeQ9LaxCnK6i6SjSE6EnxBAI\n        BN5CsXgRaQ9qdCdN4iziusTpQWkgelDGUBWVNWZc3mGvBT6nPorSgv3v6f8NA4X/Y6MH6B+kv027tpKq\n        qhGZsQlp06K0WL8P7PNfiQ+0/sEGgvS3B74b6H/ClJT+AYCcYWhNsprsAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"loyaltyIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAjBSURBVHhe7Zp7UJNXFsBTCE8JhJcQ5CEIxDAoj1SkNKvo\n        UkXZKYLyCGqEoMi7LqwsFhCKUSKmShGQd3lJETEr0cCKEIFBhqJ1s8Iyi1PoWrvMDtthZ9KZ+Ef+OHtv\n        CDNtx6p5yDO/mTO5ud/znnO/c+4530fQokWLFi1LB9HV1dVa0V57RB2MCszKyuo2MDBwUXStDbDVg4KC\n        GAN9A/zLxZel7u7uyVQq1Q5tIs3vsco5dvRYTu+9Xsn3099Db08vdN/tlsUei50kkUh/QJsN5/da3Vgn\n        nkhsHf/7OFwsugh0X7oM9dUh8UBCxDuseqoqqriHYw7LTExM5pjRTKmenh4bda846xMdHR3NFW1lIPr5\n        +XHRoEtQO8LKwqqcSCRmorayCiB6e3vjKLIks4Z45MiR7dmnswWorYoXxzeOHR++eez8HBXtt4UYFRUV\n        WJBXcH/Rowj24qEhoYEDogF+MbdY6ursuqheXB5FdgYxRH0iAaeQI3V2dl7cKBIXF7ekXhxHkZ6/9kie\n        Tz1fsiiy1F7cmsVi1Y2Jx5YuitRU1pQgS6jlxS0tLfGUVemGqyurOUsZRYj+/v5qe/Erl/LTGQxGMGoq\n        qwQi3YdeoKury0NtdaKIWqjtxRvKzw2dz8/gm5tT8LHKgsOvOtdfWqhUS7u/NHJl92/Xzfn7bwtTdK8d\n        9vk5sESNsTA9XAvso5FVqGtxQthy4bPk37VjBYwIy6D6SrbYzs7OXbFpTUCsztw+91SQCT0N6dB7I1+y\n        Y8cOFu6f37zK8fLyCmwr3A3/7MmBvpZMGO7kQEpSSpOKecXK40joLk5fdThMP7wCTwRnYKDlBNTVlI/T\n        6XSGYpfVTXF+hvjr9iSkgMvw48QNEFaEg/DODUnkoUOZW7dudccZHtWSip3iosZ1taBSHewOhu4NjIsO\n        CUs9fpCZ+8khVkbCxxEZ8bsjspODmNnxjAgsf2TRWX314TAhSIEZcS28fNEHj2/EgVhUCcL2q+I7na2C\n        682VTbeuVzfdaqutamv8ouTLa5cKbl8v5d7jV3Eby3K4SXHhQeiSi+ov3li9Pc46FHYu99Rs783PAcut\n        6sx5qWAjiUdWjpELHjyWb/vy5AqQfHsHfvi6DB7yP4XJUT6MDTXL5Ul/CwyjCPFAUAGjojYY7mmBm02l\n        cOJo6JSZmXkCuuTrwqaqdYpXQsTV29MZp9+U92OLBFKsjEcO7KZBGeckTPRXwt96uPCg4yx01bOgr/Uk\n        PO6Ih7GuTJge5MCP/7gOL//7BH5AinjWz4GJnlwY6cwC8b2zMCjIgYlhHnS15EJRViREhtBlFFtzMcr9\n        8eBfZwzigQMH6Hl5eepXm318fOxCQkKCcN5ddL5I6uTk9Ka8GyvBUU+XwHPcYCpxtidDXFQglBSy4JHw\n        DMw8rYX/jLfIZfZpA/w0dRd++vegXAHybRMN8N0oD+41nITSgnBIjfKB6H2+sJliIiW8R+Cjcwci+U2/\n        gK0eHBzMGBANCCquVkg9PDwyXVxc8BJZtUWWGnk/viBe3o4bGxqAtbkpONpZwq4PtwLv7DHo67gAs8j5\n        vXwhRI9BFYzfL4T+pkPQ/BkD8k94QWoEFcJ3OUOA53qgWKybQucpQIKt+drnPpYV+2dRj0hzdQojIyM7\n        NfJ+vN1FV/e9ckN9PSnZxBCw0DaSIcDbAWovHYep0Xp4dDtLroCaT/2Al0SDU0waRH/kBL5US5mpsc4Q\n        OgdeIL3W//wM65TElNaJsQnN1Qk0kPfj2RBhoEMY9/fcALysj0HcWwL/+04IHVcTkTIcYfpRA/zrKQqH\n        18IhJ/H34OezUUrQJTSh4/C6QKkb10Sd4udoJO9HEHe878zuqmTD9GitXEbuXoScoz7yGZHCCoKZZ0IY\n        aEuBpgvRcP5U8HOUG6gS6jR1v79A3bxfDu9MVPlwey487q2EFxOdkML0hZh9bmC3ngTrLdYB53QM9PMv\n        QMXZaGguTZfRaDRsOVWmrUbuV+PUc+NmHrbnyAf/Re5h2O9vC/s/oIAV2VjhG2zlCmjgnYS6IjaEhYXh\n        Z1c1773c8PBwZwjr/wQTohooKWCjwVLAj2YDW1ytwHSdnszEmAgUsiF85O8KnV9mQdm5WCjMTZ+kUCh0\n        xSlWNqWXizgP+VwYRhLg7SZXgL2NqczYWH+IoEPI0dfXGbFFCsBKSGLuhM76LGisOi/bvHlzMjp86aev\n        upzLS5160sWDwAAaWFiYgJGRgQR1Yy+/sLBBiyddnomRvpSMlMDJiABhKw8iw/fwkTd/2xC4PPHdvIl+\n        +2YZfBK/H/Dg9PSIM6ibg+TXCxuSDoHAJJH0ppzsLaC5ogDO5yQ/R2uR7YrtK5PP8+IL6i+lg6mJsUxH\n        R0eMurB3/y2rYoV4IeH7erpB27VsmSKOr9zHoCCTKTYjG+Mpj5MpHNvfJiZb4/gduueD2YCAgFb0f/lG\n        A0Xa+UoLmZubO9I2OeAkBk95bFllLIkVFeThvnHhcfk1Gk15VQLXCIq5xe0o42Kiv6+yLB4wrvaq6sjw\n        8dj6v1AcykoN8avxtNS0dvRXlZcq6oFvYMuWLS5paWnsMfGYZO/evUM2NjbbbW1t8UCVsbLSYKvLP7BC\n        KS/+wAq/GndwcHhdiq55GAyGS1V5lfib0W9k08+mQdQrgvy8fMm2bdvwC453ahGUoid0C7slszOzMNg/\n        CG2tbbIYZswkmURe1A+siPb29sFfNX0119HWAdlZ2YD6JpHg1PVdP5fmCQkJTcODw8Ap5ACdvkQfWDHe\n        Z7g0NzTPkclkyZ49e6SeNM8HqFu9EtRbgqxewo5jy0gkkjzlRV1qpbwqsfPDnQy3TW5Y8zjdZNtvsMcO\n        CVvhXSNPedHvfMprZVVuZmamdsqrCni6YYsveGnsiJSd/qqGsuWZ8ioJMSYyJkgj1duVBl4/LFSbF6q3\n        bm5uC7Np9YOrzYJbgrX9rbDGq7crDU1Xb1ca76R6u9JYFaFMixYtWrRoWbEQCP8H4hUuaBGa/7sAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n  <data name=\"planetaryIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAUgSURBVEhLdVRbb1RlFD2vnc79fmbmnDlzaedWKS0UWnqF\n        3pnOlBYKQxEaAaE2oETREIJC0FYjAgkCEVBMQJFgwoMJiSY8mBgTH/1Hy7W/MzO9qA8r+zvfnLPW3mvv\n        PZrH44bb7YLT5USrsxUOp0OdXbyTe4GcXS77HQWnDXm/tVXggIOQaD/bcDgcsAUIl5sfuGwB+bAh0gQF\n        miJKgCQNbBCxhTYJeOoC9scioEQoJndutyQg73gVXDy7eCdi6+TrhBshd5qQuz2SnV2+fKSyYJZC5PF6\n        4QkE4A0EVfT4A3D7/XDzXn53ilBDQCrYIrIuoGyoe8vsW+XO54MnFIIvHIE/GiV0+CJRePns5b0IOVmR\n        JGMTtmwi/w8BiSzfS0sk23AYfj0Go1BEqrOb2AFLxS5EUhl4IxH1ntjWym+FsGWLSLPJamIkMmtvMAgf\n        s9WzbeicqqBr6gB6ZmvYVa0xHsWuAzVsG5tBoX+Q70VpXVCJhONxRM2kOjfENC+z9UjGdb/Fa7EikS+g\n        u7KAzsk55PrHkBsYR35wAjminefC0BSmz7yHc3ce4t1vf8Tc2l3Mrt5FdfVrdacnTbS0UMDnI6kQM/pY\n        rngdMg3sKM+TfF4RF4anUBiZJvbXMa3EisPTWPnmCWY++hjFiTJGz3+I5Zev8eb1G4jE4rZFfjbKR1v8\n        JA/Q01AshvT2LtpxuE5uExf37kdpXxlFAc8ikhucxPb9C6xwGIlcHisPnmL+09tI5ovNRdQCQRIH/AiG\n        ggjpOiKGibaePnp9DAUS2MQzKI1WiCo6JPK5OFJWlcnzkatfYO23PzB+8ROYJBe77cV0QguFSUzycCTM\n        smKIp9OYPPUOdlZqKvvS3rIi6Rgj+fgs46wSk+fhsx/g+O1HqF5ZRVd5DmHDYA/9kOW14YYmxOFwCJFo\n        BEmWefrzW7j86nf0104zSwow245Roi4g5BPvX8Pivac4dP0mlta+wvGrq4hnsnSAu8IJVD1V8ECL6hFE\n        ST44U8Xpxz+jeu0mtu0dQ++hE7YF9LxjrILdR07h0I0HOPPTKyzdf4L+xSVMn7+I3QeXWO08YtyLMAUC\n        dKPRVxkgTY9FMViu4uSj51h5/AK5rm4U+/agd36RJGdQubyG4w+fY/mHX7Dw2S0MvfU2yhcuoY+ChYEJ\n        CpxApnunmv9wTGcvQ+wpp5EiAi2eiGGCni+/+BWXX/+FC09f4uzDZzj65T2sfP8Mt//8GzMXr2CgdgIj\n        S8v0ekHtQH5wnMtWQefoJIz2HKIcDulhiNsfokiQVgk0w0ygs7cPQwtHMbCwiN65w+ianEF2ezcKPbtw\n        7v53qFxawxucoALHtkjbtnH5eo+cRGloH1KlDsQtCzobHOUUqmHhuIcpJNDMpAGTW2dyuQy+ZMg5nUIy\n        m4WVz6Owuxf53j3c6nn0HD6GnQdrKI2MI0tbTGaeSKUQM03o8jfBXka5qAIREWhJy0TSShIiYiOZspDM\n        pGG1tSHV3q6E0sWSyjZVLMLK5WAwgbhlk8cScej0X2eTdVYhEBGJmpVKIpW2IFEJJeugiMVKrGzGroZ/\n        fBKTmQwMihskj5M8nkiQPFYX0BHjWdA4a+lMCoIUyWyhOigm0RZi5O8mzyb9NpmAwakRS+PMPk57/g9a\n        htlkmGWa0RYh6KuNdUGpToib/ar3LMEKtmLjvZbJikB6UxVC3CRX/RHb7P40iBWJ8W/yrdgkkG5WsEGA\n        vVEi9d7YFWwWEyKxYyt5IpHAPxJwTbbmp3bpAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"researchIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAu8SURBVFhHfRd5VJT19mOWb4YZZgaGGWZhh2EbQBaBEKFB\n        dpB9GUAYBtkVARd8aIKj8hA9uGBiHcwCn702y7Je5ame+rKs7FRW5itPaXWOPi0XUtOnyNx37yxk/7x7\n        uNzf9/u+3733d/dhHgKug7ogOtcCRKF9ybgicuxLxh2Rj0jfimkDgZ4l9qXtPD0T8BxIQPt0hsBJbcAi\n        EiMZooQRCAJok1GrI3he2nmMm5tC4O+fzgiF/iKFQsPT+KYJfAJyxWKxitWFFeGXYsbPT8/z8koWSKXB\n        AqWPjnVzi7DxcHf3Z2Qy4idCtPO3X4SUcl7I9pJlRCINPbByuZ4oT6NJZZRKHcuyIQJf32A+nx9poyJR\n        vCA8KpuRSDx5IRGPMlKpnBcamsoI3f15cnkyHhXzZbI44sFXKmPpPePqqsVHD3qHSJb9kwJ8vJ0vUgVD\n        N/TxMaAyapGfXzzrF1iIt9KxEdH5wuBQE1pDKdLHtLqp1RUijV+829zkDqlvQA6r0YQLQyNMqGQMH8+5\n        +geXkmCJVhuGSsQgb3eHDDkiCSfXOl1jA9KG/EJILnH6kHxPvnPDPwUxJdNLFNpQKZparPKJYhWKUDQz\n        3Y5MTLejs3ar2sHJi3jP3voP8PCQMXK5N65cyGfcyJgFtMeNTchiJYoQYi40ZNWKtP5x0qCwhMCaxo0J\n        dY27YsuNW8KNppGA2KQG2Zy4cmFSqglN7Y3xkMIXu0cjPw4/MHAO3y94Lq55GFP+ZEHb2m6B2UDk8NTq\n        RKQsLzAkCf03l/XyKuErFHGucq8yvLGXKimtOTqncHPNho3v9o6P/7Zm9+6bm8Yev1a0/a8z5t7OW8Ym\n        05W41OQ3PbQ+qxmWjRAq1Sbkx2N9A4p5Us9E4iUQCHS2oLRbBi3qzDY5I+Xpwg204urnZLCRkeUCD488\n        ri48RxKb2C3zC45fsHLtZN+z+2/sPHZs5pUzZx58ef5bOPj2qzCyZxv0rl8FLcvM1kXmcmthkeGad0L8\n        oGtkzHLkJxXGxpt5ofpUvlgcyZOrkhwKkHBCp2sYIWoXjJRe8hAS0ZHBaIl4uXdAQ0aFcXzDxMStfed+\n        gq3HT1pv3rsDN3+/Dh+cOgp7nhqFdRtXQ/uyRmuducxqMBhmyox50/pY/QvIPRL5KfkMPxYppR/VD3IB\n        3ZxcMKsAl3IdKQUIBREFlJCiP9yQsdzyzOiU5clnrG9M3YWvbt8FO8zAufNfwuSze6B/wypo7zQBKgBV\n        tQttShQW5t7XaFTNjvRzCqXAdMJDRcnbO4SnUBsEMs90nqdngjg4pAt3xcqiksGVw+uvWl4+eH/s3CU4\n        cvMufHbjNtyfnkbx03D2u1Owb3IU1g50Q2tHHdQ1lJICUGHMt5ZX5VoLKzMuuUXHtAkDgk1UxHhabQry\n        lSLSJcki9irL9/GJoujFD6vxkeMaGU3+80hrbz5usVislsOvPRj/4TKcuHUX3rlyEy5evwa/3rgExz54\n        E0bHhmDlXzqgub0GFplKbAqUV+dBGSqAlrgXnxhzGGtLPNaHaFuGMIwnIgkmazjqgEzm7hqoqxAKhSm8\n        4OB5ovik9QK5PKt5ZfOFrbuGwKbEgUPW47/9Didu/A6vnf8F/vn5x/DyWwdhZPcwrOjrhMXttVBTXwwV\n        NuE5UFKZDXq9/kF5fcl1UUCQGYMwiq9SRbESSYhDMNUMZ52wAW0SknlUnjJZae+auv9aNq+F3fufhK0T\n        708/+/MvaIU78N7V22A5eMT61HvHZkb2Pw3924ehc20PmDvqoaquBEqNuVBcngkUCwaj4Z5c7m5zKSIV\n        NQo8Z/47KNX0iOg0Wy/QaOZyvTTZXmrFihWr2qyr13XBppENsGNyHDZPHJ+2vHrE+sLFi/cnLly7teO7\n        y9e3fPHzb5bXT0z1WywPVgwPQmvvMjA2VkJxRQ7kFxtsAamdG7cXpSjRFXR7UoCCndzgqANabSimYZDQ\n        15diQCYK1Q9otV4DXT1N0L2yBXof64Z1Q2thcHQLueNB39sf3Vj/+Q9X+0+e/X7tR2evWP717x8tH5//\n        xfL65/dz9k7OtPStgCpzFRSUZUJBaTYEZGY8hzEQxbCSUORPGUamJwUcMeDlFcTzDUoVqNV5aI0QUcqj\n        FnVYSC8J717eDD0r2qBnZRt0r14CvQMroH+oH8y7Rqe79+2f6nr+6NXV7315yXL6p/sTZy/C7tM/Qw8q\n        Wd+zFIqrC2Fhea5VZTBsswUhtWXsIyiRbk4ucVgAAS1APVtLbsB1rrtEYurtW/rgsf7l0PdYl02BjmWN\n        0LKkDtqWmmAJrtu6mqB1eTt0osBNE59Mj339E4ydvgCWJ16ytmLgFi0qh6yC9FsCLjcbeVMtIOFkAXIB\n        CZ9tTBxHN6MNChQvREV+UebpdQMrYRAD8S9rlsFSFLi4tRoaGiug3lwOtZh2tZj7da2LYNmmftg0MTE9\n        evZH2PLZD2B45sWZhaZaCE+IO4a8SLAz9Zy3nm1E2AHk3jRA8CSSR/juyhhX/6AO3HWLq6+fpCCqrCmG\n        ruV2NzS11qJgLDjVC6HSmGfL+fKaAjA21UDXyDCMYK8Y/uo8GF58eyalZQSMfU/8yHNzS0N+ElsfsA89\n        5HuKA4cycrkP/RdotZlIXQRhYU1IXaWJ8wbWWfqObhsdBPPiasjONUBWThpk5MyH1PQESE6Lg6T5sZCC\n        63lZaVDRjRmDCuz8/jJUogv8EzNvxSxYuE8dNHcz8sO8twl3VkBSYtYKIp5KlYSjVwRVRdfI2KVYOKK5\n        Gt8Sz8joDZ2dDd/u2DUIQ8Pr0BWd0LGkAeobKsBYW4xWKIDK+jJY1NYAB948AhNf34S/n5+C+Oouq1+Y\n        /gk2KKTAUN9zlBFLjWxEyrh3StEgyqNOSBaYjQECZ1AQUoQS0kcqlmXCFhZlvrWks/B+S1sNNDZVgmlx\n        JdRi5TPWl0KlqRKMHS2w98NLkHXk2Mz8gUNT4jzLbVFo5nN8pW57s+XQHZw4+pFXVEFVy1aBT2wLrv8E\n        QpyA/JC6kZ/4Hh7URjlYnB5lo2OrcO3Nj09s9Q4O3GhYkPIVldisnFRrdn46ZBfnQEFNhTWnufnOW6fO\n        PGjZvP2bgKKKYcmj3Rc5vskfcVRBX5gsk5eRh1wWFJTZsHzzh7imMkyt2WEBuZw6lJSGBqSsq0ZTitRF\n        qNMtYpXqci6mJcfTcxFfIGjmeCpNnirlTp+4uH/4Bvi+Epae/n54YtKB0PyiQwGJKXtGDrxxoXTVnjMc\n        v3nXGszmydT86pMZla0fzM0u/bRrzdAn2JASkLcOcR4iKWIDkW0esE+tMkFwcB7tCSPjTNyomDKMjQKO\n        LqyJVWnWMmJJPVfr/xTP1/8AVygaw0n4DbFSNe4Wov+bNCphHyck+z9zihtPBpVZbku9Q7dJ/PXv7hjb\n        +01Wqel9RqQ6x5XJKNBp/JuDODuQEFD+U3S6ChhbUVIjynE6oh6u56ISuG7HdRWHx1vHdXEZZ1y447h3\n        GPElFxfu5qL2wV85DKcL37fzw/Ou9Ox89W739v1T3ZaJKTxXgtjHyEO+RzofkZreQ7XgjwJBfnE2DEoZ\n        qmAKHDTDkUYhJqIZixkul9xUiVYz2yiXW1Kw2HImNc3wdFX94mM9QzvvKr1DDnMlyucblo7dSy8xnUo1\n        ZE1WNHS9wwgkQ3iGitMskHDSiKwgcoxRLvSriOfhQb7ScjWaHKzncVjLI1lPr1K+wqsWp8cEvn36jWTc\n        FWkihd+AmzbkCEck63VR6Q4xLi4vS93l25NzSj914XLHPbS6x93kWsqGVsRHbDIc4Ew/UoLAHhx2RWiN\n        2kpokvGjX0xojVDMFLKGEptXmI3i/IgNJZDD59egNYpFSrVZrAn/JCN/4R6pJmA7fkOWIt/nIqYjUhbM\n        AmlClYksQZRqgJNSjxDRzIAKUcVkHT9eqapJHXuknAitQz2E3EY1XxIUlbw3MjnnBK5JOJ2hSzrrzf8F\n        UshpnocpHXS+c66JIeHDewREqeJR2lGNce4/BAzzP9ico+BEKPJnAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"mailMessagesIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAW3SURBVFhH7VZ7TFN3GMVtbup4yJvhwE2IWUyWJZK4OB1/\n        6NYxFBjv8vDBnNNlom6KTAODRbf5YtOhjlJ5lFcppbyhFGjLo6VAWyhYHvIQEXWLxi1mWZbMJWffr7tN\n        2DLmGPjP4klO7u2vv3vP+c733dvacFjE8QmOTxKf4riYIztn6+x76/4Fg/WGVuGnic8Ql84g+8zWH4mR\n        meJMaJmzs7Odo6Ojg5XsM1vnvmeJsP0LJs6qsYo/6+DgsNzDw8PVxcXlOUY3Nzd3Ozs7Z2aEfc/tY/ut\n        KcwL1upZvMuYOBP19fX1WcPBx8fH19PT04uZ4kywllhTYCbmBWbAUr2rq6stq3b16tUv+fv7vx4YGLiF\n        x+MFrF+//jW2tmLFiuft7e2d2D62n7tu3ilYDSxh1a9atcp7w4YNGxMSEnalpKSkHiFEE14leHt7v8hS\n        cHJysmf7uesWLAFmwJHFHRQUtDU9Pf2zzh69vk4uV5w8ffpsdGzstpfXrl3r7u7uxg3kTAMLlwDrfUBA\n        QGBaWlr6Lw9+w/T9n9F3+y6012+jdfymhXmjkw/KNbqpy5WNPV+LxPJPv8oU7U06emLPoaT0vYePpEXu\n        eHfvRh5v65pX/Na5r1z5At2bzdesYAYsQ8h66+Xl5enn57cuLi4ufuzefUz++BO6pu+gxjyOyt5hSA2D\n        kOgHIbayZxAllvMhlBqHIekdgbTvKmSmUVQOjKFqYByyKxOQj9+GRe1vwAywGNlUL2VtWEmuKW2/3lt3\n        0TR2EwPf/4DGq1MoN5pR0d0Hma4XZVojJBoDxBo9xB1/sIRjMVGg1OF4fTsSq9qQ2jaAYvONhxqwPorM\n        xHJKw0M7ectSUbV5AgPf3UNZ/yiKdCaUMmEm1t7zJ+aru3CqVo1EcQMi82sRJKrHe7WdyDddw8dK06wG\n        GP5qYglrh5KqFmlNKOzsQwkZMZOJEopZ1GFAcVu3hSXt3chRapFarsCu/GqEXa5EaA4d82oQW6pCkWkC\n        CZUaHG42PNTATBNsKBc3j0whr8OIQhLKZ0fDEPppHoo5E8JmLdJlCmzLkSEsS4rwbBkiyUAkGYgtUiDX\n        MIoDDd2IKFTgcNM/G7DCasJiRDV6g6o3WfrMeiui6IsMwzDfvIPMtj7sKqhF6CUxwr+VIFJQjqjsCkST\n        gThRA75qN+G42oQYEo8olCPpXxpgsKaxSD02jeKuAUg7jZBqDZZjZosOqXIdFEOT2FfRipicSkSTOF9Y\n        QedVJF6PQ/U6NI/fwnaJCvyCBkSRgeQ5GGBgBmzYDLAEmHAR9fqYpB58QRl2FMkh7h2FZnwaSXVaHKpu\n        x9H6TqQpenBC1YvsnhEI9aNIa+lFXHETIqgdyc3GORmwQDF8HbkaI87WKLFNIMGWb0qwXVQHYecVpDd2\n        Y5+slY5dSK7V4CA9bh9SIrvL1NhR0oydVP2F7hGkKfvAFyuR3PIfDMiHruFAWRN4GSK8ea4IEdRfgaYf\n        p5p7EJ9bjRgauhghtYDiZ73nX65CDK1H59WCT3MQL1GjgB7B1NYBHFH1z92AUGPCpgtSvJFRiFChDGdU\n        BpxRGhBHUx6VVQY+MYr6H8Gmn5mgGYjKrbW8A0JpFkKo93xZBwrMU8jQj83dwHmVHjyBDFvp5hZxYhid\n        B18spekvRYRAStMvRRgZeIeqD8utQZhIjvCSJgRTC0JI/P2GHhxt64d2YvY34aw4r9bjbarkCxLO0g1Y\n        Xi68TDHeIvFgqjyUqg2jKsPF1HNZGw7UdSKlRQ9hjfHXk1l5yt37Dx6P3x6/j35ffLhbzg0ZrUZ8Qv2u\n        NF9DlESJQHqkQoobsVOqwv6aDnyu7Ea2Sn3/5KVs+Z7ExPTQ4OA49grnLp8/qgYnUUW/A8eau3CuTY8C\n        lfreycxLNR+Q2ObNm0NsbW1duK2PBheFgqqPkpK+9N+0KYj9KeWWH+MxHuP/BBub3wF4bp8mCJEE3gAA\n        AABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"eveNotificationsIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAZlSURBVFhH7VVpTJRXFKVW674gIIoVq1AwJqZWjI1LaYIW\n        FQEFBFSkuFU0cYlSrDVSposWF1RELAMijDAMwzDsOiJlH9YZFmFEBQQR1FZjja2tazi9d/pNY5vqtJH+\n        aXuSk+/N971599xz73vPRMArAvsIfJXYV2A/gTzm9/zdML/XYFjQEPg1Yn/iwGfIv/n9PyLk2eAcaJCZ\n        mdlQU1PT4Qbyb34vfGdHeH6vBedsDMEHDx8+fMTo0aMtzM3NxzBHjRplOXToUDMWwt+FeTzf4MJLwZA9\n        2zuIg3NQW1tbm8kCbGxsbK2srMaxKEEEl8TgAot4KbAAffYWFhZDOFs7O7tJjo6O77q4uCxydnZeMHPm\n        zFn8buzYsa8PGzZsJM/j+cL/XtoFg4ABnP3EiROtZ8+ePWf16tVrd+/eHbKD4Et4h2BtbT2BXRg5cuQw\n        ni/8r9ccYAGmbLebm5urSCT6rKJGo8lVqfLC9u8/6Ltihf+UadOmWVpajhIa8lkBvecA137BggUuoaGh\n        ogdPnqLr3k+ov3Eb5VdvoLitW8/4lo4naerKzhMZZ2sOS2SqTw9FSjYEf/JlYFCwaMNHO0K9A9ZsmOPs\n        7Dr5LYcZluPHv0Frc389FyxA34Rc23Hjxlk5ODjM8PPzW9l65x467v6Iqq5byNa1IaPuIhTaC5BrLkBm\n        YM0FJOvHzUipvQh53SUo6i9D2dCCjMZWZDa2Qdl0Baq2G9BH+xOwALaRu3ogl2E8qSa3Hequ38a51m40\n        fvs9zl7uRFqtDunV9VBW1iG1vBZytRYytQaysl+ZLFBKFBdU4ovTpdicWYKQkkZIddeMCjBsRRYxgtwY\n        Xd5xXZ9Rlu4KGm/eQer5FiRVNiCFA3Ow0prfMaGoCvtyirBZdgbeCTlwk5zGupwKJDS0Y3tBw3MFMP4o\n        YgCXo4CylpQ3ILGiHskkREcikslmSZkW0pJqPZNLqxFXUI6QtDysTciC54kMeJzIhMfJLCyX5kOivYxV\n        ylIEnasxKuBZEdyU/fIvdSK+rBaJFCiBn9pmnKd+kAoiYvPLIVLmwT9OCc9oBbxilPCOTYeXOA0+JCKy\n        oBqBKXlYHJ2GrVmlLIDLzHGeC4MIvZDClmuUfYO+zlxbCVmfpL0IXfctRJbUY+2pHHgcl8Hrazm8OahY\n        iaU8PiZDiDwX2xPS4LEvGm4HxNiYmI0hQ4aY07p8gBkVoWdRaxekVY1QVNRCUa7VPyO/qUSIqhJ5zR3Y\n        lF6M5XEZ8KXgyyhzfnofS8b6mBREp2dhTXgkNoQfhl/YYWyMlsDe3n4K3ym0Njv8QugVcg+wAxw4iWq9\n        S34ay8SpCEhSQVbXAnVbF4JzyxFE9u7MVWNXVgmCk3PweaIcx1MS0X1TiwcP2tHWqYHoZBycnGYvtLa2\n        nEBL8636Qhf0yLt4FSfVtTiYXQB/sRyLjibjA0kuYiuaIDpbjU3KYnpW4eMcNbamF+HDxFysiJAgYH8E\n        bt5qx6NHt/D06c/0vIPWzib4+rr629tPmCIc5VzmF0PV3I6tqefgHC7B+0eSsJQ6XKw+j335NVjJXU5N\n        tzyWSkD2+9DYK1IKj7AorN0XToHv6wn0oKfnCR49/gEBAZ7rJ09+c6pwoxoXEKtugNMxBeaFJ8IjVokD\n        hVocKNDCLy4LPtGpWEb0obovpeBMrygZ3PfHwHvvIXR/14mHD9mB+yTgMXStjXB1netlZzd+koWFCd+m\n        xgVEFGrgTJ3tShnqgxM9aewelULdn4KlYgV1vwKeFHwJObGE5x6Vwu1gDAKPRlEZrqCruxp37zZBmp6E\n        6dOnzqKLzIqWNroT9Igo0mAhnWZ7KXB0ZSM847PhHCnDfAruTpl7nMyBZ6IKXrJ8OmxKsIV6YUdOCQ7E\n        xz/ZFiLShIYGNReWyqBrPoN1gX4RY8aMsRay57PGOMKLa7GT6p2ha4ePvAAup85gsfQsVikKsSW7DHvo\n        oIkpLLoXdjxGFbh5s8jD3d2PGmws/XUwX9sLFzltpVu1h+n43swUPuLpm9Et+BsyL3Qgk+6BXflVOFKi\n        wanCojthkcezN1KwuXPnLhYOlj8D29uX9/wiT9e2oNBdPaZmpnvonQ2/5wl/CVGx4sxtwcFfOTo5uQkH\n        yN9HfxObPn36bKHRfOLbROPN18tg2+cR5xB5//+3YGyrGd+K/+NfDhOTXwBBd8jgLcLB3wAAAABJRU5E\n        rkJggg==\n</value>\n  </data>\n  <data name=\"calendarEventsIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAb0SURBVFhH7VZbV5PZGfbKrhGQggmYAyEJOZ9DEpIvgBlR\n        gQgIpIQcICEJ5EhCOAQGhmCEgIrAgDhQdUZrW62uetHR6erq3LS9mDIiBEhQIAgBxAN0Zq3+he5N05ve\n        YO7mwmetd+2sfN963ud93nfv/R35iI/42QNBELnJZms3Wq1tOovFW9vQ4KmpN7qr9frmMo3GWVJTYz9b\n        VWVVVFY25ZddsCBKpVlaUmL6/6CyWII4ZWJodLk6Sqf+vlc0+fTd2bFvdhUjj3cKrzzarrjxZFc9/WRX\n        e/PPb85ff/wahur6N69LRx/vyIK/3USG7sfge4qrj18XjT3ZhSLilB+Ocn2Dwx4c+X3x5F9/PD32p/f5\n        gw93JYF727LA1zHDzadvq0Yf7Pge/W3fdPfpO8/979577/1lr3bq0a6kb2ojLzC1IQvciUmD93dODT/Y\n        SUhAampqGh6PxxWpDY6qdv/Xiolv9wuuPngj6/9qS+yf2hD2TET5ncOrPBgdQyu8juEVbnyF/8Fnws7x\n        qKj7xnpe761NJHA3lpAAIpGY/Ul6Ok5SVtVQZO+YlnV/tcV2XI2yHQMvKTpPiFTnXSBUWZ7hlMaZbLVz\n        Lre+ZZ6ic87RVNZZpt45R9Q3zwtNvgWauWuRYfQtCRxDkYQEYLHYrKSkjEzu6RJdXp39usQ3ucm0D6xS\n        m/zL2TWOOZgUp6ybySzRfE9QNc1ydfbnBHXjM2ql6Qc6WLM19udQCMXQFiJpPSFeU2ApIQHQ/iSggI4U\n        qdlV9aOinltbbM/VKM1+8QUJOECsb57HVzc+w4CEWSDhyQt1M/iD1TiDUZl+yAbJCcANUoN3gWzqWmTa\n        +sMJCUChUJgjyclokrTwV5Qy7cinvbe3+M6BVYqpKyy3fRaG5PQaUDFIeLJc/09pg3MOAwQIGj2hHL11\n        lgAc4Te0zEOnxNbPw1yLfzEhARkZGZnAgUycMF+VVVx9LbfzyxjLNbhGtfYuEzXN87BCWP3/KofJma3+\n        cJ5/eDXv0vAq29e/DF0iGcG8GDsWGIm2IDk5GXXsGAqD5klVmLPVYwL3xCbf0Q8c6AyzwICxADERJCeC\n        6qHtfLN3viA4ulY5ePt97cT9/cKBiSjX1rkIh5HT0LHAtfQm5kBKSsoJsAvw6YI8NVapnhS4xzcF1sAa\n        xeCLUDWuAwFZYAjxZdrvoQCuuWUeAUnPHQh4sA9/i5zdSxSDJ8Ss94QSFnD8+PH0X6Rmkn4pRAy4ktpp\n        Uef4Nts1uE5v8r8k6V0LJJ07hK+2HAwhQWOdzQI9Z7ddWpYGRtdgcDoGXxDB1oRDSDL64i04n5gDR09g\n        6WkSRVNWue6O2Du+Xdr75U6ueyCqcAEROkeID3osh0OntT0/5/WH4VzInD1L+S0XI1STd+FcSyBCAdXL\n        HRcjcs9QBFGWm+P0hwPMADopA8dDy8548BfqfifqmnzDclyJsZyB9RxD23KOoT1CqLXNZ9VYnsPEWeAs\n        +O8KdkCtdRZWD3cA2dy5SLN0LzFtA+HCiorGOP3hOIZGn0zBUaXoU8ousrrxj5Ku6bfS1ms7NFvvK4m1\n        ew2KoGvciyydayFb4wjxQEtooN/0GnAAgRMxp655PtfcvsiwgFOwsS/CsPQtFYHbMk5/ONLBACYTGQrM\n        uep+ptHzrfzzqT1Rx/gbrufytsw9sMkEIrhG30t2A3Cjri0sbvRFWCDY9a2LnPq2Rbq5K5xn9S9z7IEX\n        YvfQCss+GClWqWxx+sORhsEQ0mgCJalMNyJobP8O6fnNj0Lf1B6n9Yu3HPflbZbncgy6wbT54f0QZVh7\n        VpjO/lU4pDCY4NCCwWkbWed5vniV2zkVVarVjjj94cggEMjpDEk1U2WeynN99o/iKw//nd97+ydx9839\n        0sCdPUHb2C7bEdxiOYZifO+VGM8WfMV3X9vkOAfXOY6hdUHbtU1+y+iGqOPG1kF03VovT0QAlkSiodhS\n        jUBvv1vg6Z0pDdz+qSjw63/J+q6/47UHd9itwS2GM7DBcvWtsz2Xokynf5XnHVjlugMrPBCyzuGovHts\n        XTk4HasI3tqsCN5cgV9PcfrDQaBQWFhJoUlqaf0DR+t8yKwx36Oe104TT1ePEc9UDWXJi3ux0jPtJ3ML\n        nJk8xILmIQYUW6xFs0Q1aLZQBQMnQNQEEaImifMr4rQfDjKDwcFJFFZWhSZILVH5iYpSH7bgjAstRMxp\n        PLE2lZNbnULjKlPJrKJkIvVUCiFHnkKkSmGk5TAQNJmWn0lnf0oXiOWQK0774YAfkJTTxRYiojBgpYj2\n        BFdQeZzGK00i04qSybSCT/CkvGPYbGFSBp579ASGcRSFoqagcNQULJaenp3NTMOTOWgilZ8OrvU45Ud8\n        xM8VR478B98q5HYGjWfJAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"featuresMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAjzSURBVFhH7Vd5UNT3FV+FZe/7vu9d9r4PYHdhgV12wWUB\n        QS4DhK0RDQqKFxoOJVMLUVBTTTRCRBrpNFODjonWicYjJmLTeDcm08SOFa0z6dSZZNpp/+r3GbZFJVHz\n        X2b6Zj7z3Z39fd/7fN/7vPf7Lub/9lOyuQhp0yDSaDQGicTlUSgUFvqejvC0Nmd6/VEGmx91MJfBEEpg\n        RZjt90ftWcjOauAAOw0IRiQQmCKewupBi5jMlBrw3xEiIACpRw03vT6b5efnxxuaml7D0Why9JWKgEcA\n        EkQMjUbnyhw+IpEtADIUtlBL4ilNBAJLiH7PQJhpz0wAiyGT2UvaO4eqq6sn8Xi8jEzm6xkcpZ/KErtJ\n        dJGFQhFqeSpnnkDhCJBZ2kwqR6Um89UGtsQcoFIlKuQjncjh8Kf1MltWvtfwEJxIJPK7u3v755VVXMnO\n        iw3pLb4kHk+X4WhcZQaFraFxZDa+yhfV+yqTOm9Fk9pTl1S6Kmuk5pIqgSpQxBWZLBgMh4z8PVNwlCoq\n        k4SkjkHMNw9sGQkGg8fa21eOenx5m3E0HioFkwqngppT2AptdvGSZQye3sgWmB1Sc7TSVNi6TmIuTqht\n        JVUYDIuCfKYIPEmoGOzevcP7+vu3XliztvPQosVL+oaGhk5qM/VvtrWt2O/Kyt1ncxc0SrXOHPKDDHH4\n        nnByMVtmsfPkDi/oAUhYizp6fQsGtml91UmB1OxAflOdAjYridQD6Q53Vkc4HJ0IhUJj8Xh8tKKi4qBI\n        JNq6rL391yKJrLe2tr7bYPNXgfCgA3LL2jpZImtIrA8167NqljsjLes8pT27cmoGd1nDrasFmTlh5BdE\n        +4NlwCKBcdBKxWKJtvQMwvJkMnkwEAiMZPsDwxabc6CxsXmEyxW0zSst6+GL5A0ijaNEpPFuzE0s3547\n        r2WbzJTfx5HZe03Z5X3hxq3Hwsk3TuWUd70sscQaoEOQbxhkMzPxkM2h8aQKDIZGJ5EYJhwOp0gkEttR\n        JvYXRaMjBeHwq6FQ4Va+UNYSKih6iS1UNLMk5oTEmL9Hbo9vDlWt3Zk3f/WQxJDfx5U5Xylu6D/+XM/Z\n        +56S1S/LbfFGyBaKAWKE4Cn8z0BQUE/0kUCic80PiNC4hVg8qd7mcPWIpYoXxQpNq1iR+TOvv3CD0pS1\n        11PS9qnUErolUtivOwsat+WVJockKvsNd2TRgUW/OHcrsfniP93x9SMKR/mLyB8D+QYCqWn4EAGoD4Er\n        1qHAGKRulo7OkVtRj+uIRJq9oCDc5c0KdHmy89Z7g5ENdl/hJqM3/lasqX+ytn3nB2pz3oVYfdd4cu3w\n        OwvXvHVm1a5rX1WsPvRJ8fKD9yyRjlMKe2IjBjrquwEGw+mxMgCBdI5IY4XhQWGKvHS6XAYtCO2GxZIs\n        OCK1iInSrjBHNskN/iGFpWDIEqjprFox8ju9r+rL+jVjl3Xe6qHBX924u2rb6Sv5yd1XTXnNFzKDzSdo\n        HOXz4APFgCzMSgDSQoS+F6p9cbUlMo/AkgihLDRBppNAE5QxhZljKnvRhwK1d5Qj0JwUqqyf6Xzl19v6\n        Jy5542vP9Ow+dysn1jK5eXzq76VLx06Y85vuyM3hI/bYyhtcuastPZ3gQzFA5JAFEOMjBNBMB6EAYHox\n        GEopfOZrslaxJZZqnTN+m6dw9XHFhk/llsJzEp3ztsZV+fHggctfRV/Ye+71iT/eGzly85vqrlM3HNGV\n        E6Zg9aTCWnJUm7Pwr3Jr8WsogxEUh44AOniMAGpBMgdSDm81naeyishmC2DKSU2RHlOwuUfpik0prEUb\n        FdboUaHGN2bOX/JhonXs9uiJqftjRz+/O3L48zu9u87+JdbQfwnt6ZZkBvuU9uJTYk3uF3yVdwBHZERR\n        HHiRkRBS7fhfwz0Yu+iiwVe43DpPeSWUgMrXuuX2xGK9v2G9xBjuVdrCjQJdsE1pL9uSaD1w+renp+7f\n        nJr69/sf3PvXS3u+/Dqa3HE1q7j1rMVfe8aQU/eu1BSdFBkjh1hi89JpDcDpUyV4iAAWbjhsmd6utMVi\n        WfGOjrzKDd2+4rZNQm1wgcqVeO75dWOHOwePf2Lwzu83Fyx7tWPgvd8fmfz6m+Pn/vbtkp+fvFG76jeX\n        7IUtoyJ96Jdic/jPGmfVF2gs72cKjEk6V1WKYkAXpDTwmAjnQAkESqcfhMfkGwziTH+uQJWdqGp9fbx2\n        +d635aaCZdnRpi3Dhy7fGdhz8tK1a/f/0fHK8WvZiba7xpz6m2pX+T5HYXJcZizcbQrWnTf46z8SqHx9\n        NI60EovF2lEMIEBDgI57TAPo7cek4hkMKbzZ2FKHw5izsIErtRdovfUrecqsGoUp0uqLr9pZ3X3iysKu\n        45Mbdrx/Nb54x0XQhtQSOS3S5b0j1HpOyY3BNyXGyHtcmXU7lSWrg2GG/MMUZCKABqDjHstAynBwB2CK\n        LF6Nt67JXdo7ZIms2KbNbugpaT18vmXLH/5UseLARW9Zz7FY0+Ck2lUxylU6hrlK79ssoeUNCk+9myW1\n        jVA5ykE8iVGbQWYl8HhyLvILlxEACBAIQPBZCYDNgZaki81muWVetco5f6PCXrHdndg0YQy98LFcmfWt\n        0hy6o3OWXUdqHxdoA+cF2pwjVLbqIFNoGCNQea1ofC/IINMqkC89icEwohVSn5qETyQAhlJEZdJQLdAg\n        KkdLN0/hOcoUGcZZIuNNiSFwm6t0f4ZOe5bKkQ8zRMaJDCKzMyODXIHDUaNpGcRi5MOEweOlaIX3C6Q/\n        1f+Q/u8tQcrgR2DKxxAIYiyJbiHRBfWITDuNrRwjUnkfceXud1lC4w4SSzKcjiMvxaSnZ6el4cJpaWkh\n        tA8Cw4lFOCpVjVYYQA/GPULq9D9IIGWwCZijGU4QozGuRYH8ABQshNbA3LnYGoQ65DuInoNeh+BsBB4C\n        BCYizBQf2FMTgIdgE2yGlwjc7eDeD6qGazecDm6+JgS4cECqod6wAuD/ARxiZus9dXCwmQ+magdOZwKU\n        DVlKAb7DqeE/QCrtM4P/aEttTmUEnENWAEAEFA5BU4GfEByD+Q9f1hxO8/ScuAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"toggleSkillsIcon.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAQ4SURBVFhHYxgFQw0wAjELFIPYTFAaxgZhmgFmIAZZwMXL\n        yyvMICjID6YZGLiR2FxADHMc1QDIMJDlvEDMJyQtLSMsJaUOogUkJOS5REUlpBUV9UAOgDqCHYh5gJi6\n        DuEWExNXNDCKMnR1rwFhEy+/OhDWsraNB9EgMTVjswBQaDAICfEBtbABMSjEQI4HAYqiiktWx8DVs7j6\n        fv7ixT/Qcfz8+b9BuHrt2i82AQGZPDySIlB96ADmANJCRhDoK5BPU+vr/yQAcfwkoIVQnA3k16/b8KcX\n        6ID61Zt+lcxduEdQSkoWqA2UHqgDQA4wdHQJAlnYfv/t/4abf/+33v/1f+qnD//379//d//R4xC8/+Df\n        ormLN0FDgHoOAAIukK+co2NLo6fNPhwzY8GhtLUrj3YeO/asYsOWwzBctHDJdl0nV088UUA+AIUCyBEq\n        ZmYWMGydntlqHBgYCuNLaWioQS1nheiiDuDjExVV5hQSkuEVkVIDZUEpeXkDGR0de924uCZZKyt/EF9E\n        SkoNJM8vLq4IUg/C0NxAGWCTk/KRc3PLBWF5d/cMGFb29c0xy8hpAdHI4nLu7tkgtTJubiU8tlb+fHx8\n        QlCjSAKgQgRUoLDzaWuG89paegN9IwPGwMKHQUVWGSsWEpKGqWORkTET93TPZuDnF4SaBTKTKABS6CCu\n        prNTRN1wt5yp4wkQVjEx2auhr7+GnZ1dAaIMA6Dok9Qw3qtl43YZpg8opwxWRQRgERKXnmbjU/dL0qfs\n        l3xk/O+Q+O7fnStW/q0H5nkTF9dJUHXoAK5PPj7+t6RPxi+QPpAeAvowgbCwuENE/7xP7jv3/y3fd+XP\n        HlBeP3z4752Xr39YWNlGQ5VhAJg+kJ76Q1f+bCdSHy7AKSwsLCVoapQipKKiBUpMPDw8olA5fIATpA6U\n        G2S9vCpAFRQ3N7cYVI4owAmlQYAT5AAGcXFQvMMSEbI8OoDJsYASH8gBDIgaEgQIlw9skmIB3Jpq4TCs\n        7O5exaerFQnjC6mpFYJTPBbALCnqhqzXLCl9NrJedmVld1zZkoWLi0uCgZVVW9rOskve07MYpIFDQ9mS\n        287KEUwD+TxaWiEKrq41DCL8hkA9oPYBCMD18miopko7O+dh0wvCaqGRbQw8PBpAPTC9cMDOJyK2QMPG\n        87quk98DE1e/B3aBETeklZUbgXK8bGxs+XpOnteVzV1uGDoH3wfJGTg4bgbKgUo6iF7HwGs6tq4PdGF6\n        FZWbgHIcML0gs/Vd/Z+j6YUDFnVzuz32y/b/janf/2cXKPUCcfuEiWdBkvzCog1xM+b/Bsm1zT/+GyS3\n        /uSZ78DEJY6ud+2xk39w6a3feAgsh6QXAYSApZeGgbGribW1r72zsw8Ii0MSHwhwaejouJpYWfm5urqG\n        gOQ0NDSMoXJE63VwcPBH1zsKRsEoGGDAwAAArhOS8opxCmkAAAAASUVORK5CYII=\n</value>\n  </data>\n  <metadata name=\"searchTextTimer.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>318, 17</value>\n  </metadata>\n  <data name=\"warningLabel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQg\n        djMuMzap5+IlAAABYklEQVQ4T+2PzyvDcRjHn69tktmURvTdRS6kHERaapRS0k5zUTSZsMtKmrkolIZG\n        yZXDSrmsHI2Dy1zWpLXZL2kK5cfFUt99x8bbY9uV/AF71atPT8/zfp4+VKbIMJGGNW2bDUcHNmPA0dXi\n        4rq/1P6bMaK+1L7pMx+bA15WgddNfheRPukB99pKY79jIbJ+RQaRuzUDeQsAKzuFfLwVV7v6XGRHzIbd\n        Yja0IcqhNVG+XNHL/nnxbVatGiosmFQKMw9eI86XDFE8dnBYh9y7DlJMAymuhZRgk0Uz1+xNLTLRGqTc\n        avDxTrJpFHY50IGMvxd4qAaeqegLe89GCfIx4d1HSHsId+sEaY+w1U5nvEBJjialE8E6ICiwHPjxgpA9\n        JSTWCAs6OpyupAlnI9lmq2iEQ/VWBY3yW1H4gl0rdPvGK5Mxl+oj7RXwxFfCy5T3DFCEhxSFof/CgWa2\n        oVSW+RdE39jOuVjT+Ph6AAAAAElFTkSuQmCC\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMonitorFooter.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterMonitorFooter\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.skillQueuePanel = new System.Windows.Forms.Panel();\n            this.lblPaused = new System.Windows.Forms.Label();\n            this.skillQueueTimePanel = new System.Windows.Forms.Panel();\n            this.lblQueueCompletionTime = new System.Windows.Forms.Label();\n            this.lblQueueRemaining = new System.Windows.Forms.Label();\n            this.skillQueueControl = new EVEMon.Common.Controls.SkillQueueControl();\n            this.pnlTraining = new System.Windows.Forms.Panel();\n            this.tlpStatus = new System.Windows.Forms.TableLayoutPanel();\n            this.flpStatusLabels = new System.Windows.Forms.FlowLayoutPanel();\n            this.lblCurrentlyTraining = new System.Windows.Forms.Label();\n            this.lblSPPerHour = new System.Windows.Forms.Label();\n            this.lblScheduleWarning = new System.Windows.Forms.Label();\n            this.flpStatusValues = new System.Windows.Forms.FlowLayoutPanel();\n            this.lblTrainingSkill = new System.Windows.Forms.Label();\n            this.lblTrainingRemain = new System.Windows.Forms.Label();\n            this.lblTrainingEst = new System.Windows.Forms.Label();\n            this.btnAddToCalendar = new System.Windows.Forms.Button();\n            this.skillQueuePanel.SuspendLayout();\n            this.skillQueueTimePanel.SuspendLayout();\n            this.pnlTraining.SuspendLayout();\n            this.tlpStatus.SuspendLayout();\n            this.flpStatusLabels.SuspendLayout();\n            this.flpStatusValues.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // skillQueuePanel\n            // \n            this.skillQueuePanel.AutoSize = true;\n            this.skillQueuePanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.skillQueuePanel.Controls.Add(this.lblPaused);\n            this.skillQueuePanel.Controls.Add(this.skillQueueTimePanel);\n            this.skillQueuePanel.Controls.Add(this.skillQueueControl);\n            this.skillQueuePanel.Dock = System.Windows.Forms.DockStyle.Top;\n            this.skillQueuePanel.Location = new System.Drawing.Point(0, 0);\n            this.skillQueuePanel.Name = \"skillQueuePanel\";\n            this.skillQueuePanel.Padding = new System.Windows.Forms.Padding(0, 6, 0, 6);\n            this.skillQueuePanel.Size = new System.Drawing.Size(463, 56);\n            this.skillQueuePanel.TabIndex = 0;\n            // \n            // lblPaused\n            // \n            this.lblPaused.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.lblPaused.Location = new System.Drawing.Point(0, 23);\n            this.lblPaused.Name = \"lblPaused\";\n            this.lblPaused.Size = new System.Drawing.Size(463, 17);\n            this.lblPaused.TabIndex = 0;\n            this.lblPaused.Text = \"Paused\";\n            this.lblPaused.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // skillQueueTimePanel\n            // \n            this.skillQueueTimePanel.Controls.Add(this.lblQueueCompletionTime);\n            this.skillQueueTimePanel.Controls.Add(this.lblQueueRemaining);\n            this.skillQueueTimePanel.Dock = System.Windows.Forms.DockStyle.Top;\n            this.skillQueueTimePanel.Location = new System.Drawing.Point(0, 6);\n            this.skillQueueTimePanel.Name = \"skillQueueTimePanel\";\n            this.skillQueueTimePanel.Size = new System.Drawing.Size(463, 17);\n            this.skillQueueTimePanel.TabIndex = 0;\n            // \n            // lblQueueCompletionTime\n            // \n            this.lblQueueCompletionTime.AutoSize = true;\n            this.lblQueueCompletionTime.Dock = System.Windows.Forms.DockStyle.Right;\n            this.lblQueueCompletionTime.Location = new System.Drawing.Point(343, 0);\n            this.lblQueueCompletionTime.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n            this.lblQueueCompletionTime.Name = \"lblQueueCompletionTime\";\n            this.lblQueueCompletionTime.Size = new System.Drawing.Size(120, 13);\n            this.lblQueueCompletionTime.TabIndex = 1;\n            this.lblQueueCompletionTime.Text = \"Queue Completion Time\";\n            // \n            // lblQueueRemaining\n            // \n            this.lblQueueRemaining.AutoSize = true;\n            this.lblQueueRemaining.Dock = System.Windows.Forms.DockStyle.Left;\n            this.lblQueueRemaining.Location = new System.Drawing.Point(0, 0);\n            this.lblQueueRemaining.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n            this.lblQueueRemaining.Name = \"lblQueueRemaining\";\n            this.lblQueueRemaining.Size = new System.Drawing.Size(118, 13);\n            this.lblQueueRemaining.TabIndex = 0;\n            this.lblQueueRemaining.Text = \"Queue Remaining Time\";\n            // \n            // skillQueueControl\n            // \n            this.skillQueueControl.BackColor = System.Drawing.SystemColors.Control;\n            this.skillQueueControl.BorderColor = System.Drawing.Color.Gray;\n            this.skillQueueControl.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.skillQueueControl.EmptyColor = System.Drawing.Color.DimGray;\n            this.skillQueueControl.LessThanDayFirstColor = System.Drawing.Color.Khaki;\n            this.skillQueueControl.LessThanDaySecondColor = System.Drawing.Color.DarkKhaki;\n            this.skillQueueControl.Location = new System.Drawing.Point(0, 40);\n            this.skillQueueControl.MoreThanDayFirstColor = System.Drawing.Color.LightSteelBlue;\n            this.skillQueueControl.MoreThanDaySecondColor = System.Drawing.Color.LightSlateGray;\n            this.skillQueueControl.Name = \"skillQueueControl\";\n            this.skillQueueControl.Size = new System.Drawing.Size(463, 10);\n            this.skillQueueControl.SkillQueue = null;\n            this.skillQueueControl.TabIndex = 0;\n            // \n            // pnlTraining\n            // \n            this.pnlTraining.AutoSize = true;\n            this.pnlTraining.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.pnlTraining.Controls.Add(this.tlpStatus);\n            this.pnlTraining.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pnlTraining.Location = new System.Drawing.Point(0, 56);\n            this.pnlTraining.Name = \"pnlTraining\";\n            this.pnlTraining.Padding = new System.Windows.Forms.Padding(0, 3, 0, 0);\n            this.pnlTraining.Size = new System.Drawing.Size(463, 44);\n            this.pnlTraining.TabIndex = 1;\n            // \n            // tlpStatus\n            // \n            this.tlpStatus.AutoSize = true;\n            this.tlpStatus.ColumnCount = 3;\n            this.tlpStatus.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tlpStatus.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tlpStatus.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tlpStatus.Controls.Add(this.flpStatusLabels, 0, 0);\n            this.tlpStatus.Controls.Add(this.flpStatusValues, 1, 0);\n            this.tlpStatus.Controls.Add(this.btnAddToCalendar, 2, 0);\n            this.tlpStatus.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tlpStatus.Location = new System.Drawing.Point(0, 3);\n            this.tlpStatus.Margin = new System.Windows.Forms.Padding(0);\n            this.tlpStatus.Name = \"tlpStatus\";\n            this.tlpStatus.RowCount = 1;\n            this.tlpStatus.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpStatus.Size = new System.Drawing.Size(463, 41);\n            this.tlpStatus.TabIndex = 0;\n            // \n            // flpStatusLabels\n            // \n            this.flpStatusLabels.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.flpStatusLabels.AutoSize = true;\n            this.flpStatusLabels.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.flpStatusLabels.Controls.Add(this.lblCurrentlyTraining);\n            this.flpStatusLabels.Controls.Add(this.lblSPPerHour);\n            this.flpStatusLabels.Controls.Add(this.lblScheduleWarning);\n            this.flpStatusLabels.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.flpStatusLabels.Location = new System.Drawing.Point(0, 0);\n            this.flpStatusLabels.Margin = new System.Windows.Forms.Padding(0);\n            this.flpStatusLabels.Name = \"flpStatusLabels\";\n            this.flpStatusLabels.Size = new System.Drawing.Size(96, 41);\n            this.flpStatusLabels.TabIndex = 0;\n            this.flpStatusLabels.WrapContents = false;\n            // \n            // lblCurrentlyTraining\n            // \n            this.lblCurrentlyTraining.AutoSize = true;\n            this.lblCurrentlyTraining.Location = new System.Drawing.Point(0, 0);\n            this.lblCurrentlyTraining.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n            this.lblCurrentlyTraining.Name = \"lblCurrentlyTraining\";\n            this.lblCurrentlyTraining.Size = new System.Drawing.Size(92, 13);\n            this.lblCurrentlyTraining.TabIndex = 2;\n            this.lblCurrentlyTraining.Text = \"Currently Training:\";\n            // \n            // lblSPPerHour\n            // \n            this.lblSPPerHour.AutoSize = true;\n            this.lblSPPerHour.Location = new System.Drawing.Point(0, 13);\n            this.lblSPPerHour.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n            this.lblSPPerHour.Name = \"lblSPPerHour\";\n            this.lblSPPerHour.Size = new System.Drawing.Size(59, 13);\n            this.lblSPPerHour.TabIndex = 0;\n            this.lblSPPerHour.Text = \"X SP/Hour\";\n            // \n            // lblScheduleWarning\n            // \n            this.lblScheduleWarning.AutoSize = true;\n            this.lblScheduleWarning.ForeColor = System.Drawing.Color.Red;\n            this.lblScheduleWarning.Location = new System.Drawing.Point(0, 26);\n            this.lblScheduleWarning.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n            this.lblScheduleWarning.Name = \"lblScheduleWarning\";\n            this.lblScheduleWarning.Size = new System.Drawing.Size(93, 13);\n            this.lblScheduleWarning.TabIndex = 1;\n            this.lblScheduleWarning.Text = \"Schedule Conflict!\";\n            // \n            // flpStatusValues\n            // \n            this.flpStatusValues.AutoSize = true;\n            this.flpStatusValues.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.flpStatusValues.Controls.Add(this.lblTrainingSkill);\n            this.flpStatusValues.Controls.Add(this.lblTrainingRemain);\n            this.flpStatusValues.Controls.Add(this.lblTrainingEst);\n            this.flpStatusValues.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.flpStatusValues.Location = new System.Drawing.Point(96, 0);\n            this.flpStatusValues.Margin = new System.Windows.Forms.Padding(0);\n            this.flpStatusValues.Name = \"flpStatusValues\";\n            this.flpStatusValues.Size = new System.Drawing.Size(145, 39);\n            this.flpStatusValues.TabIndex = 1;\n            // \n            // lblTrainingSkill\n            // \n            this.lblTrainingSkill.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.lblTrainingSkill.AutoSize = true;\n            this.lblTrainingSkill.Location = new System.Drawing.Point(0, 0);\n            this.lblTrainingSkill.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n            this.lblTrainingSkill.Name = \"lblTrainingSkill\";\n            this.lblTrainingSkill.Size = new System.Drawing.Size(67, 13);\n            this.lblTrainingSkill.TabIndex = 0;\n            this.lblTrainingSkill.Text = \"Training Skill\";\n            // \n            // lblTrainingRemain\n            // \n            this.lblTrainingRemain.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.lblTrainingRemain.AutoSize = true;\n            this.lblTrainingRemain.Location = new System.Drawing.Point(0, 13);\n            this.lblTrainingRemain.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n            this.lblTrainingRemain.Name = \"lblTrainingRemain\";\n            this.lblTrainingRemain.Size = new System.Drawing.Size(124, 13);\n            this.lblTrainingRemain.TabIndex = 1;\n            this.lblTrainingRemain.Text = \"Remaining Training Time\";\n            // \n            // lblTrainingEst\n            // \n            this.lblTrainingEst.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.lblTrainingEst.AutoSize = true;\n            this.lblTrainingEst.Location = new System.Drawing.Point(0, 26);\n            this.lblTrainingEst.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n            this.lblTrainingEst.Name = \"lblTrainingEst\";\n            this.lblTrainingEst.Size = new System.Drawing.Size(142, 13);\n            this.lblTrainingEst.TabIndex = 2;\n            this.lblTrainingEst.Text = \"Estimated Training End Time\";\n            // \n            // btnAddToCalendar\n            // \n            this.btnAddToCalendar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnAddToCalendar.Location = new System.Drawing.Point(351, 15);\n            this.btnAddToCalendar.Name = \"btnAddToCalendar\";\n            this.btnAddToCalendar.Size = new System.Drawing.Size(109, 23);\n            this.btnAddToCalendar.TabIndex = 0;\n            this.btnAddToCalendar.Text = \"Update Calendar\";\n            this.btnAddToCalendar.UseVisualStyleBackColor = true;\n            this.btnAddToCalendar.Click += new System.EventHandler(this.btnUpdateCalendar_Click);\n            // \n            // CharacterMonitorFooter\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.pnlTraining);\n            this.Controls.Add(this.skillQueuePanel);\n            this.Name = \"CharacterMonitorFooter\";\n            this.Size = new System.Drawing.Size(463, 100);\n            this.skillQueuePanel.ResumeLayout(false);\n            this.skillQueueTimePanel.ResumeLayout(false);\n            this.skillQueueTimePanel.PerformLayout();\n            this.pnlTraining.ResumeLayout(false);\n            this.pnlTraining.PerformLayout();\n            this.tlpStatus.ResumeLayout(false);\n            this.tlpStatus.PerformLayout();\n            this.flpStatusLabels.ResumeLayout(false);\n            this.flpStatusLabels.PerformLayout();\n            this.flpStatusValues.ResumeLayout(false);\n            this.flpStatusValues.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Panel skillQueuePanel;\n        private System.Windows.Forms.Label lblPaused;\n        private System.Windows.Forms.Panel skillQueueTimePanel;\n        private System.Windows.Forms.Label lblQueueCompletionTime;\n        private System.Windows.Forms.Label lblQueueRemaining;\n        private Common.Controls.SkillQueueControl skillQueueControl;\n        private System.Windows.Forms.Panel pnlTraining;\n        private System.Windows.Forms.TableLayoutPanel tlpStatus;\n        private System.Windows.Forms.FlowLayoutPanel flpStatusLabels;\n        private System.Windows.Forms.Label lblCurrentlyTraining;\n        private System.Windows.Forms.Label lblSPPerHour;\n        private System.Windows.Forms.Label lblScheduleWarning;\n        private System.Windows.Forms.FlowLayoutPanel flpStatusValues;\n        private System.Windows.Forms.Label lblTrainingSkill;\n        private System.Windows.Forms.Label lblTrainingRemain;\n        private System.Windows.Forms.Label lblTrainingEst;\n        private System.Windows.Forms.Button btnAddToCalendar;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMonitorFooter.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.ExternalCalendar;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Scheduling;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterMonitorFooter : UserControl\n    {\n        private Character m_character;\n\n\n        #region Constructor\n\n        public CharacterMonitorFooter()\n        {\n            InitializeComponent();\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Occurs when control loads.\n        /// </summary>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            // Fonts\n            Font = FontFactory.GetFont(\"Tahoma\");\n            lblScheduleWarning.Font = FontFactory.GetFont(\"Tahoma\", FontStyle.Bold);\n\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n\n            if (ccpCharacter != null)\n                skillQueueControl.SkillQueue = ccpCharacter.SkillQueue;\n            else\n            {\n                pnlTraining.Visible = false;\n                skillQueuePanel.Visible = false;\n            }\n\n            // Subscribe events\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.SchedulerChanged += EveMonClient_SchedulerChanged;\n            EveMonClient.CharacterSkillQueueUpdated += EveMonClient_CharacterSkillQueueUpdated;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Occurs when visibility changes.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (DesignMode || this.IsDesignModeHosted() || !Visible)\n                return;\n\n            UpdateFrequentControls();\n            UpdateInfrequentControls();\n        }\n\n        /// <summary>\n        /// Called when the control is disposed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.SchedulerChanged -= EveMonClient_SchedulerChanged;\n            EveMonClient.CharacterSkillQueueUpdated -= EveMonClient_CharacterSkillQueueUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        #endregion\n\n\n        #region Update display on character change\n\n        /// <summary>\n        /// Updates the controls whos content changes frequently.\n        /// </summary>\n        private void UpdateFrequentControls()\n        {\n            SuspendLayout();\n            try\n            {\n                // Update the training controls\n                UpdateTrainingControls();\n            }\n            finally\n            {\n                ResumeLayout(false);\n            }\n        }\n\n        /// <summary>\n        /// Updates the informations for skill training.\n        /// </summary>\n        private void UpdateTrainingControls()\n        {\n            // No need to do anything when the control is not visible\n            if (!Visible)\n                return;\n\n            // Is the character in training ?\n            if (m_character.IsTraining)\n            {\n                UpdateTrainingSkillInfo();\n\n                UpdateSkillQueueInfo();\n\n                skillQueuePanel.Visible = true;\n                pnlTraining.Visible = true;\n                lblPaused.Visible = false;\n                return;\n            }\n\n            // Not in training, check for paused skill queue\n            if (SkillQueueIsPaused())\n                return;\n\n            // Not training, no skill queue\n            skillQueuePanel.Visible = false;\n            pnlTraining.Visible = false;\n            lblPaused.Visible = false;\n        }\n\n        /// <summary>\n        /// Updates the training skill info.\n        /// </summary>\n        private void UpdateTrainingSkillInfo()\n        {\n            QueuedSkill training = m_character.CurrentlyTrainingSkill;\n            DateTime completionTime = training.EndTime.ToLocalTime();\n\n            lblTrainingSkill.Text = training.ToString();\n            lblSPPerHour.Text = training.Skill == null\n                ? \"???\"\n                : $\"{training.SkillPointsPerHour} SP/Hour\";\n            lblTrainingEst.Text = $\"{completionTime:ddd} {completionTime:G}\";\n\n            // Dipslay a warning if anything scheduled is blocking us\n\n            string conflictMessage;\n            bool isAutoBlocking;\n            bool isBlocking = Scheduler.SkillIsBlockedAt(training.EndTime.ToLocalTime(), out conflictMessage, out isAutoBlocking);\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n\n            // Do not show the \"DOWNTIME\" warning if character's skill queue has more than one skills\n            if (ccpCharacter != null && ccpCharacter.SkillQueue.Count > 1 &&\n                isAutoBlocking &&\n                string.Equals(conflictMessage, EveMonConstants.DowntimeText, StringComparison.OrdinalIgnoreCase))\n            {\n                lblScheduleWarning.Visible = false;\n                lblScheduleWarning.Text = string.Empty;\n                return;\n            }\n\n            lblScheduleWarning.Visible = isBlocking;\n            lblScheduleWarning.Text = conflictMessage;\n        }\n\n        /// <summary>\n        /// Updates the skill queue info.\n        /// </summary>\n        private void UpdateSkillQueueInfo()\n        {\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n            if (ccpCharacter == null)\n                return;\n\n            DateTime queueCompletionTime = ccpCharacter.SkillQueue.EndTime.ToLocalTime();\n            lblQueueCompletionTime.Text = $\"{queueCompletionTime:ddd} {queueCompletionTime:G}\";\n\n            // Skill queue time panel\n            skillQueueTimePanel.Visible = ccpCharacter.SkillQueue.Count > 1 || Settings.UI.MainWindow.AlwaysShowSkillQueueTime ||\n                                          (ccpCharacter.SkillQueue.Count == 1 && Settings.UI.MainWindow.AlwaysShowSkillQueueTime);\n\n            // Update the remaining training time label\n            QueuedSkill training = m_character.CurrentlyTrainingSkill;\n            lblTrainingRemain.Text = training.EndTime.ToRemainingTimeDescription(DateTimeKind.Utc);\n\n            // Update the remaining queue time label\n            DateTime queueEndTime = ccpCharacter.SkillQueue.EndTime;\n            lblQueueRemaining.Text = queueEndTime.ToRemainingTimeDescription(DateTimeKind.Utc);\n        }\n\n        /// <summary>\n        /// Updates the skill queue info if queue is paused.\n        /// </summary>\n        /// <returns></returns>\n        private bool SkillQueueIsPaused()\n        {\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n            if (ccpCharacter == null || !ccpCharacter.SkillQueue.IsPaused)\n                return false;\n\n            QueuedSkill training = ccpCharacter.SkillQueue.CurrentlyTraining;\n            lblTrainingSkill.Text = training.ToString();\n            lblSPPerHour.Text = training.Skill == null\n                ? \"???\"\n                : $\"{training.Skill.SkillPointsPerHour} SP/Hour\";\n\n            lblTrainingRemain.Text = \"Paused\";\n            lblTrainingEst.Text = string.Empty;\n            lblScheduleWarning.Visible = false;\n            skillQueueTimePanel.Visible = false;\n            skillQueuePanel.Visible = true;\n            pnlTraining.Visible = true;\n            lblPaused.Visible = true;\n\n            return true;\n        }\n\n        /// <summary>\n        /// Updates the controls whos content changes infrequently.\n        /// </summary>\n        private void UpdateInfrequentControls()\n        {\n            // No need to do anything when the control is not visible\n            if (!Visible)\n                return;\n\n            SuspendLayout();\n            try\n            {\n                // \"Update Calendar\" button\n                btnAddToCalendar.Visible = Settings.Calendar.Enabled;\n            }\n            finally\n            {\n                ResumeLayout(false);\n            }\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Occur on every second.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            UpdateFrequentControls();\n        }\n\n        /// <summary>\n        /// Updates the controls on settings change.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateInfrequentControls();\n        }\n\n        /// <summary>\n        /// When the scheduler changed, we need to check the conflicts.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SchedulerChanged(object sender, EventArgs e)\n        {\n            UpdateTrainingControls();\n        }\n\n        /// <summary>\n        /// Occur when the character skill queue updates.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterSkillQueueUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != m_character)\n                return;\n\n            skillQueueControl.Invalidate();\n        }\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// Occurs when the user click the \"Update Calendar\" button.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private async void btnUpdateCalendar_Click(object sender, EventArgs e)\n        {\n            // Ensure that we are trying to use the external calendar\n            if (!Settings.Calendar.Enabled)\n            {\n                btnAddToCalendar.Visible = false;\n                return;\n            }\n\n            if (m_character is CCPCharacter)\n                await ExternalCalendar.UpdateCalendar(m_character as CCPCharacter);\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Sets the character.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <value>The character.</value>\n        public void SetCharacter(Character character)\n        {\n            m_character = character;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMonitorFooter.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMonitorHeader.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterMonitorHeader\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n\t\t\tthis.components = new System.ComponentModel.Container();\n\t\t\tthis.MainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n\t\t\tthis.AccountStatusTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n\t\t\tthis.AccountStatusLabel = new System.Windows.Forms.Label();\n\t\t\tthis.AccountActivityLabel = new System.Windows.Forms.Label();\n\t\t\tthis.PaidUntilLabel = new System.Windows.Forms.Label();\n\t\t\tthis.ThrobberFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n\t\t\tthis.UpdateThrobber = new EVEMon.Common.Controls.Throbber();\n\t\t\tthis.ThrobberContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n\t\t\tthis.ChangeAPIKeyInfoMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.QueryEverythingMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.ThrobberSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.UpdateLabel = new System.Windows.Forms.Label();\n\t\t\tthis.BioFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n\t\t\tthis.CharacterNameLabel = new System.Windows.Forms.Label();\n\t\t\tthis.BioInfoLabel = new System.Windows.Forms.Label();\n\t\t\tthis.BalanceLabel = new System.Windows.Forms.Label();\n\t\t\tthis.BirthdayLabel = new System.Windows.Forms.Label();\n\t\t\tthis.CorporationNameLabel = new System.Windows.Forms.Label();\n\t\t\tthis.CorporationInfoFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n\t\t\tthis.AllianceNameLabel = new System.Windows.Forms.Label();\n\t\t\tthis.SecurityStatusLabel = new System.Windows.Forms.Label();\n\t\t\tthis.ActiveShipLabel = new System.Windows.Forms.Label();\n\t\t\tthis.ActiveShipFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n\t\t\tthis.LocationInfoLabel = new System.Windows.Forms.Label();\n\t\t\tthis.DockedInfoLabel = new System.Windows.Forms.Label();\n\t\t\tthis.CharacterPortrait = new EVEMon.Common.Controls.CharacterPortrait();\n\t\t\tthis.SkillSummaryPanel = new System.Windows.Forms.Panel();\n\t\t\tthis.CustomLabelLink = new System.Windows.Forms.LinkLabel();\n\t\t\tthis.RemapsCloneJumpSummaryLabel = new System.Windows.Forms.Label();\n\t\t\tthis.tlpAttributes = new System.Windows.Forms.TableLayoutPanel();\n\t\t\tthis.lblMEMAttribute = new System.Windows.Forms.Label();\n\t\t\tthis.lblWILAttribute = new System.Windows.Forms.Label();\n\t\t\tthis.lblCHAAttribute = new System.Windows.Forms.Label();\n\t\t\tthis.lblPERAttribute = new System.Windows.Forms.Label();\n\t\t\tthis.AttributeCharismaLabel = new System.Windows.Forms.Label();\n\t\t\tthis.AttributePerceptionLabel = new System.Windows.Forms.Label();\n\t\t\tthis.AttributeIntelligenceLabel = new System.Windows.Forms.Label();\n\t\t\tthis.AttributeMemoryLabel = new System.Windows.Forms.Label();\n\t\t\tthis.AttributeWillpowerLabel = new System.Windows.Forms.Label();\n\t\t\tthis.lblINTAttribute = new System.Windows.Forms.Label();\n\t\t\tthis.SkillSummaryLabel = new System.Windows.Forms.Label();\n\t\t\tthis.CustomLabelComboBox = new System.Windows.Forms.ComboBox();\n\t\t\tthis.CharacterLabel = new System.Windows.Forms.Label();\n\t\t\tthis.AccountStatusModeComboBox = new System.Windows.Forms.ComboBox();\n\t\t\tthis.ToolTip = new System.Windows.Forms.ToolTip(this.components);\n\t\t\tthis.MainTableLayoutPanel.SuspendLayout();\n\t\t\tthis.AccountStatusTableLayoutPanel.SuspendLayout();\n\t\t\tthis.ThrobberFlowLayoutPanel.SuspendLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.UpdateThrobber)).BeginInit();\n\t\t\tthis.ThrobberContextMenu.SuspendLayout();\n\t\t\tthis.BioFlowLayoutPanel.SuspendLayout();\n\t\t\tthis.SkillSummaryPanel.SuspendLayout();\n\t\t\tthis.tlpAttributes.SuspendLayout();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// MainTableLayoutPanel\n\t\t\t// \n\t\t\tthis.MainTableLayoutPanel.AutoSize = true;\n\t\t\tthis.MainTableLayoutPanel.ColumnCount = 3;\n\t\t\tthis.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n\t\t\tthis.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n\t\t\tthis.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n\t\t\tthis.MainTableLayoutPanel.Controls.Add(this.AccountStatusTableLayoutPanel, 0, 1);\n\t\t\tthis.MainTableLayoutPanel.Controls.Add(this.ThrobberFlowLayoutPanel, 2, 0);\n\t\t\tthis.MainTableLayoutPanel.Controls.Add(this.BioFlowLayoutPanel, 1, 0);\n\t\t\tthis.MainTableLayoutPanel.Controls.Add(this.CharacterPortrait, 0, 0);\n\t\t\tthis.MainTableLayoutPanel.Controls.Add(this.SkillSummaryPanel, 1, 1);\n\t\t\tthis.MainTableLayoutPanel.Controls.Add(this.AccountStatusModeComboBox, 0, 2);\n\t\t\tthis.MainTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.MainTableLayoutPanel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.MainTableLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.MainTableLayoutPanel.Name = \"MainTableLayoutPanel\";\n\t\t\tthis.MainTableLayoutPanel.RowCount = 3;\n\t\t\tthis.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n\t\t\tthis.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n\t\t\tthis.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F));\n\t\t\tthis.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n\t\t\tthis.MainTableLayoutPanel.Size = new System.Drawing.Size(525, 204);\n\t\t\tthis.MainTableLayoutPanel.TabIndex = 0;\n\t\t\t// \n\t\t\t// AccountStatusTableLayoutPanel\n\t\t\t// \n\t\t\tthis.AccountStatusTableLayoutPanel.ColumnCount = 2;\n\t\t\tthis.AccountStatusTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n\t\t\tthis.AccountStatusTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n\t\t\tthis.AccountStatusTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n\t\t\tthis.AccountStatusTableLayoutPanel.Controls.Add(this.AccountStatusLabel, 0, 0);\n\t\t\tthis.AccountStatusTableLayoutPanel.Controls.Add(this.AccountActivityLabel, 1, 0);\n\t\t\tthis.AccountStatusTableLayoutPanel.Controls.Add(this.PaidUntilLabel, 0, 1);\n\t\t\tthis.AccountStatusTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.AccountStatusTableLayoutPanel.Location = new System.Drawing.Point(0, 131);\n\t\t\tthis.AccountStatusTableLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.AccountStatusTableLayoutPanel.Name = \"AccountStatusTableLayoutPanel\";\n\t\t\tthis.AccountStatusTableLayoutPanel.Padding = new System.Windows.Forms.Padding(0, 5, 0, 0);\n\t\t\tthis.AccountStatusTableLayoutPanel.RowCount = 2;\n\t\t\tthis.AccountStatusTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n\t\t\tthis.AccountStatusTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n\t\t\tthis.AccountStatusTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n\t\t\tthis.AccountStatusTableLayoutPanel.Size = new System.Drawing.Size(136, 45);\n\t\t\tthis.AccountStatusTableLayoutPanel.TabIndex = 11;\n\t\t\t// \n\t\t\t// AccountStatusLabel\n\t\t\t// \n\t\t\tthis.AccountStatusLabel.AutoSize = true;\n\t\t\tthis.AccountStatusLabel.Location = new System.Drawing.Point(0, 5);\n\t\t\tthis.AccountStatusLabel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.AccountStatusLabel.Name = \"AccountStatusLabel\";\n\t\t\tthis.AccountStatusLabel.Size = new System.Drawing.Size(83, 13);\n\t\t\tthis.AccountStatusLabel.TabIndex = 0;\n\t\t\tthis.AccountStatusLabel.Text = \"Account Status:\";\n\t\t\t// \n\t\t\t// AccountActivityLabel\n\t\t\t// \n\t\t\tthis.AccountActivityLabel.AutoSize = true;\n\t\t\tthis.AccountActivityLabel.Location = new System.Drawing.Point(83, 5);\n\t\t\tthis.AccountActivityLabel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.AccountActivityLabel.Name = \"AccountActivityLabel\";\n\t\t\tthis.AccountActivityLabel.Size = new System.Drawing.Size(25, 13);\n\t\t\tthis.AccountActivityLabel.TabIndex = 1;\n\t\t\tthis.AccountActivityLabel.Text = \"???\";\n\t\t\t// \n\t\t\t// PaidUntilLabel\n\t\t\t// \n\t\t\tthis.PaidUntilLabel.AutoSize = true;\n\t\t\tthis.AccountStatusTableLayoutPanel.SetColumnSpan(this.PaidUntilLabel, 2);\n\t\t\tthis.PaidUntilLabel.Location = new System.Drawing.Point(0, 18);\n\t\t\tthis.PaidUntilLabel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.PaidUntilLabel.Name = \"PaidUntilLabel\";\n\t\t\tthis.PaidUntilLabel.Size = new System.Drawing.Size(126, 13);\n\t\t\tthis.PaidUntilLabel.TabIndex = 2;\n\t\t\tthis.PaidUntilLabel.Text = \"dd/MM/YYYY HH:mm:ss\";\n\t\t\t// \n\t\t\t// ThrobberFlowLayoutPanel\n\t\t\t// \n\t\t\tthis.ThrobberFlowLayoutPanel.AutoSize = true;\n\t\t\tthis.ThrobberFlowLayoutPanel.Controls.Add(this.UpdateThrobber);\n\t\t\tthis.ThrobberFlowLayoutPanel.Controls.Add(this.UpdateLabel);\n\t\t\tthis.ThrobberFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.ThrobberFlowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n\t\t\tthis.ThrobberFlowLayoutPanel.Location = new System.Drawing.Point(464, 0);\n\t\t\tthis.ThrobberFlowLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.ThrobberFlowLayoutPanel.Name = \"ThrobberFlowLayoutPanel\";\n\t\t\tthis.ThrobberFlowLayoutPanel.Size = new System.Drawing.Size(61, 131);\n\t\t\tthis.ThrobberFlowLayoutPanel.TabIndex = 10;\n\t\t\t// \n\t\t\t// UpdateThrobber\n\t\t\t// \n\t\t\tthis.UpdateThrobber.ContextMenuStrip = this.ThrobberContextMenu;\n\t\t\tthis.UpdateThrobber.Dock = System.Windows.Forms.DockStyle.Right;\n\t\t\tthis.UpdateThrobber.Location = new System.Drawing.Point(34, 3);\n\t\t\tthis.UpdateThrobber.MaximumSize = new System.Drawing.Size(24, 24);\n\t\t\tthis.UpdateThrobber.MinimumSize = new System.Drawing.Size(24, 24);\n\t\t\tthis.UpdateThrobber.Name = \"UpdateThrobber\";\n\t\t\tthis.UpdateThrobber.Size = new System.Drawing.Size(24, 24);\n\t\t\tthis.UpdateThrobber.State = EVEMon.Common.Enumerations.ThrobberState.Stopped;\n\t\t\tthis.UpdateThrobber.TabIndex = 4;\n\t\t\tthis.UpdateThrobber.TabStop = false;\n\t\t\tthis.UpdateThrobber.MouseDown += new System.Windows.Forms.MouseEventHandler(this.UpdateThrobber_MouseDown);\n\t\t\tthis.UpdateThrobber.MouseMove += new System.Windows.Forms.MouseEventHandler(this.UpdateThrobber_MouseMove);\n\t\t\t// \n\t\t\t// ThrobberContextMenu\n\t\t\t// \n\t\t\tthis.ThrobberContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.ChangeAPIKeyInfoMenuItem,\n            this.QueryEverythingMenuItem,\n            this.ThrobberSeparator});\n\t\t\tthis.ThrobberContextMenu.Name = \"cmsThrobberMenu\";\n\t\t\tthis.ThrobberContextMenu.Size = new System.Drawing.Size(234, 54);\n\t\t\tthis.ThrobberContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.ThrobberContextMenu_Opening);\n\t\t\tthis.ThrobberContextMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ThrobberContextMenu_ItemClicked);\n\t\t\t// \n\t\t\t// ChangeAPIKeyInfoMenuItem\n\t\t\t// \n\t\t\tthis.ChangeAPIKeyInfoMenuItem.Name = \"ChangeAPIKeyInfoMenuItem\";\n\t\t\tthis.ChangeAPIKeyInfoMenuItem.Size = new System.Drawing.Size(233, 22);\n\t\t\tthis.ChangeAPIKeyInfoMenuItem.Text = \"Change API Key Information...\";\n\t\t\tthis.ChangeAPIKeyInfoMenuItem.Click += new System.EventHandler(this.ChangeAPIKeyInfoMenuItem_Click);\n\t\t\t// \n\t\t\t// QueryEverythingMenuItem\n\t\t\t// \n\t\t\tthis.QueryEverythingMenuItem.Name = \"QueryEverythingMenuItem\";\n\t\t\tthis.QueryEverythingMenuItem.Size = new System.Drawing.Size(233, 22);\n\t\t\tthis.QueryEverythingMenuItem.Text = \"Update Everything\";\n\t\t\t// \n\t\t\t// ThrobberSeparator\n\t\t\t// \n\t\t\tthis.ThrobberSeparator.Name = \"ThrobberSeparator\";\n\t\t\tthis.ThrobberSeparator.Size = new System.Drawing.Size(230, 6);\n\t\t\t// \n\t\t\t// UpdateLabel\n\t\t\t// \n\t\t\tthis.UpdateLabel.AutoSize = true;\n\t\t\tthis.UpdateLabel.Dock = System.Windows.Forms.DockStyle.Right;\n\t\t\tthis.UpdateLabel.ForeColor = System.Drawing.SystemColors.ControlDarkDark;\n\t\t\tthis.UpdateLabel.Location = new System.Drawing.Point(0, 30);\n\t\t\tthis.UpdateLabel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.UpdateLabel.Name = \"UpdateLabel\";\n\t\t\tthis.UpdateLabel.Size = new System.Drawing.Size(61, 13);\n\t\t\tthis.UpdateLabel.TabIndex = 5;\n\t\t\tthis.UpdateLabel.Text = \"0000:00:00\";\n\t\t\tthis.UpdateLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n\t\t\tthis.UpdateLabel.MouseHover += new System.EventHandler(this.UpdateLabel_MouseHover);\n\t\t\t// \n\t\t\t// BioFlowLayoutPanel\n\t\t\t// \n\t\t\tthis.BioFlowLayoutPanel.AutoSize = true;\n\t\t\tthis.BioFlowLayoutPanel.Controls.Add(this.CharacterNameLabel);\n\t\t\tthis.BioFlowLayoutPanel.Controls.Add(this.BioInfoLabel);\n\t\t\tthis.BioFlowLayoutPanel.Controls.Add(this.BalanceLabel);\n\t\t\tthis.BioFlowLayoutPanel.Controls.Add(this.BirthdayLabel);\n\t\t\tthis.BioFlowLayoutPanel.Controls.Add(this.CorporationNameLabel);\n\t\t\tthis.BioFlowLayoutPanel.Controls.Add(this.CorporationInfoFlowLayoutPanel);\n\t\t\tthis.BioFlowLayoutPanel.Controls.Add(this.AllianceNameLabel);\n\t\t\tthis.BioFlowLayoutPanel.Controls.Add(this.SecurityStatusLabel);\n\t\t\tthis.BioFlowLayoutPanel.Controls.Add(this.ActiveShipLabel);\n\t\t\tthis.BioFlowLayoutPanel.Controls.Add(this.ActiveShipFlowLayoutPanel);\n\t\t\tthis.BioFlowLayoutPanel.Controls.Add(this.LocationInfoLabel);\n\t\t\tthis.BioFlowLayoutPanel.Controls.Add(this.DockedInfoLabel);\n\t\t\tthis.BioFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.BioFlowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n\t\t\tthis.BioFlowLayoutPanel.Location = new System.Drawing.Point(136, 0);\n\t\t\tthis.BioFlowLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.BioFlowLayoutPanel.Name = \"BioFlowLayoutPanel\";\n\t\t\tthis.BioFlowLayoutPanel.Size = new System.Drawing.Size(328, 131);\n\t\t\tthis.BioFlowLayoutPanel.TabIndex = 9;\n\t\t\t// \n\t\t\t// CharacterNameLabel\n\t\t\t// \n\t\t\tthis.CharacterNameLabel.AutoSize = true;\n\t\t\tthis.CharacterNameLabel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.CharacterNameLabel.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n\t\t\tthis.CharacterNameLabel.Name = \"CharacterNameLabel\";\n\t\t\tthis.CharacterNameLabel.Size = new System.Drawing.Size(84, 13);\n\t\t\tthis.CharacterNameLabel.TabIndex = 4;\n\t\t\tthis.CharacterNameLabel.Text = \"Character Name\";\n\t\t\tthis.CharacterNameLabel.UseMnemonic = false;\n\t\t\t// \n\t\t\t// BioInfoLabel\n\t\t\t// \n\t\t\tthis.BioInfoLabel.AutoSize = true;\n\t\t\tthis.BioInfoLabel.Location = new System.Drawing.Point(0, 13);\n\t\t\tthis.BioInfoLabel.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n\t\t\tthis.BioInfoLabel.Name = \"BioInfoLabel\";\n\t\t\tthis.BioInfoLabel.Size = new System.Drawing.Size(43, 13);\n\t\t\tthis.BioInfoLabel.TabIndex = 5;\n\t\t\tthis.BioInfoLabel.Text = \"Bio Info\";\n\t\t\t// \n\t\t\t// BalanceLabel\n\t\t\t// \n\t\t\tthis.BalanceLabel.AutoSize = true;\n\t\t\tthis.BalanceLabel.Location = new System.Drawing.Point(0, 26);\n\t\t\tthis.BalanceLabel.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n\t\t\tthis.BalanceLabel.Name = \"BalanceLabel\";\n\t\t\tthis.BalanceLabel.Size = new System.Drawing.Size(93, 13);\n\t\t\tthis.BalanceLabel.TabIndex = 7;\n\t\t\tthis.BalanceLabel.Text = \"Balance: 0.00 ISK\";\n\t\t\t// \n\t\t\t// BirthdayLabel\n\t\t\t// \n\t\t\tthis.BirthdayLabel.AutoSize = true;\n\t\t\tthis.BirthdayLabel.Location = new System.Drawing.Point(0, 39);\n\t\t\tthis.BirthdayLabel.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n\t\t\tthis.BirthdayLabel.Name = \"BirthdayLabel\";\n\t\t\tthis.BirthdayLabel.Size = new System.Drawing.Size(45, 13);\n\t\t\tthis.BirthdayLabel.TabIndex = 8;\n\t\t\tthis.BirthdayLabel.Text = \"Birthday\";\n\t\t\t// \n\t\t\t// CorporationNameLabel\n\t\t\t// \n\t\t\tthis.CorporationNameLabel.AutoSize = true;\n\t\t\tthis.CorporationNameLabel.Location = new System.Drawing.Point(0, 52);\n\t\t\tthis.CorporationNameLabel.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n\t\t\tthis.CorporationNameLabel.Name = \"CorporationNameLabel\";\n\t\t\tthis.CorporationNameLabel.Size = new System.Drawing.Size(82, 13);\n\t\t\tthis.CorporationNameLabel.TabIndex = 6;\n\t\t\tthis.CorporationNameLabel.Text = \"Corporation Info\";\n\t\t\tthis.CorporationNameLabel.UseMnemonic = false;\n\t\t\t// \n\t\t\t// CorporationInfoFlowLayoutPanel\n\t\t\t// \n\t\t\tthis.CorporationInfoFlowLayoutPanel.AutoSize = true;\n\t\t\tthis.CorporationInfoFlowLayoutPanel.Location = new System.Drawing.Point(0, 65);\n\t\t\tthis.CorporationInfoFlowLayoutPanel.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n\t\t\tthis.CorporationInfoFlowLayoutPanel.Name = \"CorporationInfoFlowLayoutPanel\";\n\t\t\tthis.CorporationInfoFlowLayoutPanel.Size = new System.Drawing.Size(0, 0);\n\t\t\tthis.CorporationInfoFlowLayoutPanel.TabIndex = 13;\n\t\t\t// \n\t\t\t// AllianceNameLabel\n\t\t\t// \n\t\t\tthis.AllianceNameLabel.AutoSize = true;\n\t\t\tthis.AllianceNameLabel.Location = new System.Drawing.Point(0, 65);\n\t\t\tthis.AllianceNameLabel.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n\t\t\tthis.AllianceNameLabel.Name = \"AllianceNameLabel\";\n\t\t\tthis.AllianceNameLabel.Size = new System.Drawing.Size(65, 13);\n\t\t\tthis.AllianceNameLabel.TabIndex = 7;\n\t\t\tthis.AllianceNameLabel.Text = \"Alliance Info\";\n\t\t\tthis.AllianceNameLabel.UseMnemonic = false;\n\t\t\t// \n\t\t\t// SecurityStatusLabel\n\t\t\t// \n\t\t\tthis.SecurityStatusLabel.AutoSize = true;\n\t\t\tthis.SecurityStatusLabel.Location = new System.Drawing.Point(0, 78);\n\t\t\tthis.SecurityStatusLabel.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n\t\t\tthis.SecurityStatusLabel.Name = \"SecurityStatusLabel\";\n\t\t\tthis.SecurityStatusLabel.Size = new System.Drawing.Size(99, 13);\n\t\t\tthis.SecurityStatusLabel.TabIndex = 9;\n\t\t\tthis.SecurityStatusLabel.Text = \"Security Status Info\";\n\t\t\t// \n\t\t\t// ActiveShipLabel\n\t\t\t// \n\t\t\tthis.ActiveShipLabel.AutoSize = true;\n\t\t\tthis.ActiveShipLabel.Location = new System.Drawing.Point(0, 91);\n\t\t\tthis.ActiveShipLabel.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n\t\t\tthis.ActiveShipLabel.Name = \"ActiveShipLabel\";\n\t\t\tthis.ActiveShipLabel.Size = new System.Drawing.Size(82, 13);\n\t\t\tthis.ActiveShipLabel.TabIndex = 10;\n\t\t\tthis.ActiveShipLabel.Text = \"Active Ship Info\";\n\t\t\tthis.ActiveShipLabel.UseMnemonic = false;\n\t\t\t// \n\t\t\t// ActiveShipFlowLayoutPanel\n\t\t\t// \n\t\t\tthis.ActiveShipFlowLayoutPanel.AutoSize = true;\n\t\t\tthis.ActiveShipFlowLayoutPanel.Location = new System.Drawing.Point(0, 104);\n\t\t\tthis.ActiveShipFlowLayoutPanel.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n\t\t\tthis.ActiveShipFlowLayoutPanel.Name = \"ActiveShipFlowLayoutPanel\";\n\t\t\tthis.ActiveShipFlowLayoutPanel.Size = new System.Drawing.Size(0, 0);\n\t\t\tthis.ActiveShipFlowLayoutPanel.TabIndex = 12;\n\t\t\tthis.ActiveShipFlowLayoutPanel.WrapContents = false;\n\t\t\t// \n\t\t\t// LocationInfoLabel\n\t\t\t// \n\t\t\tthis.LocationInfoLabel.AutoSize = true;\n\t\t\tthis.LocationInfoLabel.Location = new System.Drawing.Point(0, 104);\n\t\t\tthis.LocationInfoLabel.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n\t\t\tthis.LocationInfoLabel.Name = \"LocationInfoLabel\";\n\t\t\tthis.LocationInfoLabel.Size = new System.Drawing.Size(69, 13);\n\t\t\tthis.LocationInfoLabel.TabIndex = 12;\n\t\t\tthis.LocationInfoLabel.Text = \"Location Info\";\n\t\t\tthis.LocationInfoLabel.UseMnemonic = false;\n\t\t\t// \n\t\t\t// DockedInfoLabel\n\t\t\t// \n\t\t\tthis.DockedInfoLabel.AutoSize = true;\n\t\t\tthis.DockedInfoLabel.Location = new System.Drawing.Point(0, 117);\n\t\t\tthis.DockedInfoLabel.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n\t\t\tthis.DockedInfoLabel.Name = \"DockedInfoLabel\";\n\t\t\tthis.DockedInfoLabel.Size = new System.Drawing.Size(66, 13);\n\t\t\tthis.DockedInfoLabel.TabIndex = 14;\n\t\t\tthis.DockedInfoLabel.Text = \"Docked Info\";\n\t\t\tthis.DockedInfoLabel.UseMnemonic = false;\n\t\t\t// \n\t\t\t// CharacterPortrait\n\t\t\t// \n\t\t\tthis.CharacterPortrait.AutoSize = true;\n\t\t\tthis.CharacterPortrait.Character = null;\n\t\t\tthis.CharacterPortrait.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.CharacterPortrait.Location = new System.Drawing.Point(3, 3);\n\t\t\tthis.CharacterPortrait.Margin = new System.Windows.Forms.Padding(3, 3, 5, 0);\n\t\t\tthis.CharacterPortrait.MinimumSize = new System.Drawing.Size(128, 128);\n\t\t\tthis.CharacterPortrait.Name = \"CharacterPortrait\";\n\t\t\tthis.CharacterPortrait.Size = new System.Drawing.Size(128, 128);\n\t\t\tthis.CharacterPortrait.TabIndex = 2;\n\t\t\tthis.CharacterPortrait.TabStop = false;\n\t\t\t// \n\t\t\t// SkillSummaryPanel\n\t\t\t// \n\t\t\tthis.SkillSummaryPanel.AutoSize = true;\n\t\t\tthis.MainTableLayoutPanel.SetColumnSpan(this.SkillSummaryPanel, 2);\n\t\t\tthis.SkillSummaryPanel.Controls.Add(this.CustomLabelLink);\n\t\t\tthis.SkillSummaryPanel.Controls.Add(this.RemapsCloneJumpSummaryLabel);\n\t\t\tthis.SkillSummaryPanel.Controls.Add(this.tlpAttributes);\n\t\t\tthis.SkillSummaryPanel.Controls.Add(this.SkillSummaryLabel);\n\t\t\tthis.SkillSummaryPanel.Controls.Add(this.CustomLabelComboBox);\n\t\t\tthis.SkillSummaryPanel.Controls.Add(this.CharacterLabel);\n\t\t\tthis.SkillSummaryPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.SkillSummaryPanel.Location = new System.Drawing.Point(136, 131);\n\t\t\tthis.SkillSummaryPanel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.SkillSummaryPanel.Name = \"SkillSummaryPanel\";\n\t\t\tthis.SkillSummaryPanel.Padding = new System.Windows.Forms.Padding(0, 5, 0, 0);\n\t\t\tthis.MainTableLayoutPanel.SetRowSpan(this.SkillSummaryPanel, 2);\n\t\t\tthis.SkillSummaryPanel.Size = new System.Drawing.Size(389, 95);\n\t\t\tthis.SkillSummaryPanel.TabIndex = 4;\n\t\t\t// \n\t\t\t// CustomLabelLink\n\t\t\t// \n\t\t\tthis.CustomLabelLink.AutoSize = true;\n\t\t\tthis.CustomLabelLink.Location = new System.Drawing.Point(138, 50);\n\t\t\tthis.CustomLabelLink.Name = \"CustomLabelLink\";\n\t\t\tthis.CustomLabelLink.Size = new System.Drawing.Size(0, 13);\n\t\t\tthis.CustomLabelLink.TabIndex = 7;\n\t\t\tthis.ToolTip.SetToolTip(this.CustomLabelLink, \"Character label - click to edit\");\n\t\t\tthis.CustomLabelLink.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.CustomLabelLink_LinkClicked);\n\t\t\t// \n\t\t\t// RemapsCloneJumpSummaryLabel\n\t\t\t// \n\t\t\tthis.RemapsCloneJumpSummaryLabel.AutoSize = true;\n\t\t\tthis.RemapsCloneJumpSummaryLabel.BackColor = System.Drawing.Color.Transparent;\n\t\t\tthis.RemapsCloneJumpSummaryLabel.Dock = System.Windows.Forms.DockStyle.Left;\n\t\t\tthis.RemapsCloneJumpSummaryLabel.Location = new System.Drawing.Point(89, 5);\n\t\t\tthis.RemapsCloneJumpSummaryLabel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.RemapsCloneJumpSummaryLabel.Name = \"RemapsCloneJumpSummaryLabel\";\n\t\t\tthis.RemapsCloneJumpSummaryLabel.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0);\n\t\t\tthis.RemapsCloneJumpSummaryLabel.Size = new System.Drawing.Size(138, 39);\n\t\t\tthis.RemapsCloneJumpSummaryLabel.TabIndex = 6;\n\t\t\tthis.RemapsCloneJumpSummaryLabel.Text = \"Bonus Remaps: 0\\r\\nNext Neural Remap: Now\\r\\nNext Clone Jump: Now\";\n\t\t\t// \n\t\t\t// tlpAttributes\n\t\t\t// \n\t\t\tthis.tlpAttributes.AutoSize = true;\n\t\t\tthis.tlpAttributes.ColumnCount = 2;\n\t\t\tthis.tlpAttributes.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n\t\t\tthis.tlpAttributes.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n\t\t\tthis.tlpAttributes.Controls.Add(this.lblMEMAttribute, 1, 4);\n\t\t\tthis.tlpAttributes.Controls.Add(this.lblWILAttribute, 1, 3);\n\t\t\tthis.tlpAttributes.Controls.Add(this.lblCHAAttribute, 1, 2);\n\t\t\tthis.tlpAttributes.Controls.Add(this.lblPERAttribute, 1, 1);\n\t\t\tthis.tlpAttributes.Controls.Add(this.AttributeCharismaLabel, 0, 2);\n\t\t\tthis.tlpAttributes.Controls.Add(this.AttributePerceptionLabel, 0, 1);\n\t\t\tthis.tlpAttributes.Controls.Add(this.AttributeIntelligenceLabel, 0, 0);\n\t\t\tthis.tlpAttributes.Controls.Add(this.AttributeMemoryLabel, 0, 4);\n\t\t\tthis.tlpAttributes.Controls.Add(this.AttributeWillpowerLabel, 0, 3);\n\t\t\tthis.tlpAttributes.Controls.Add(this.lblINTAttribute, 1, 0);\n\t\t\tthis.tlpAttributes.Dock = System.Windows.Forms.DockStyle.Left;\n\t\t\tthis.tlpAttributes.Location = new System.Drawing.Point(0, 5);\n\t\t\tthis.tlpAttributes.Name = \"tlpAttributes\";\n\t\t\tthis.tlpAttributes.RowCount = 5;\n\t\t\tthis.tlpAttributes.RowStyles.Add(new System.Windows.Forms.RowStyle());\n\t\t\tthis.tlpAttributes.RowStyles.Add(new System.Windows.Forms.RowStyle());\n\t\t\tthis.tlpAttributes.RowStyles.Add(new System.Windows.Forms.RowStyle());\n\t\t\tthis.tlpAttributes.RowStyles.Add(new System.Windows.Forms.RowStyle());\n\t\t\tthis.tlpAttributes.RowStyles.Add(new System.Windows.Forms.RowStyle());\n\t\t\tthis.tlpAttributes.Size = new System.Drawing.Size(89, 90);\n\t\t\tthis.tlpAttributes.TabIndex = 5;\n\t\t\t// \n\t\t\t// lblMEMAttribute\n\t\t\t// \n\t\t\tthis.lblMEMAttribute.AutoSize = true;\n\t\t\tthis.lblMEMAttribute.Location = new System.Drawing.Point(67, 52);\n\t\t\tthis.lblMEMAttribute.Name = \"lblMEMAttribute\";\n\t\t\tthis.lblMEMAttribute.Size = new System.Drawing.Size(19, 13);\n\t\t\tthis.lblMEMAttribute.TabIndex = 9;\n\t\t\tthis.lblMEMAttribute.Text = \"17\";\n\t\t\tthis.lblMEMAttribute.MouseHover += new System.EventHandler(this.AttributeLabel_MouseHover);\n\t\t\t// \n\t\t\t// lblWILAttribute\n\t\t\t// \n\t\t\tthis.lblWILAttribute.AutoSize = true;\n\t\t\tthis.lblWILAttribute.Location = new System.Drawing.Point(67, 39);\n\t\t\tthis.lblWILAttribute.Name = \"lblWILAttribute\";\n\t\t\tthis.lblWILAttribute.Size = new System.Drawing.Size(19, 13);\n\t\t\tthis.lblWILAttribute.TabIndex = 8;\n\t\t\tthis.lblWILAttribute.Text = \"17\";\n\t\t\tthis.lblWILAttribute.MouseHover += new System.EventHandler(this.AttributeLabel_MouseHover);\n\t\t\t// \n\t\t\t// lblCHAAttribute\n\t\t\t// \n\t\t\tthis.lblCHAAttribute.AutoSize = true;\n\t\t\tthis.lblCHAAttribute.Location = new System.Drawing.Point(67, 26);\n\t\t\tthis.lblCHAAttribute.Name = \"lblCHAAttribute\";\n\t\t\tthis.lblCHAAttribute.Size = new System.Drawing.Size(19, 13);\n\t\t\tthis.lblCHAAttribute.TabIndex = 7;\n\t\t\tthis.lblCHAAttribute.Text = \"17\";\n\t\t\tthis.lblCHAAttribute.MouseHover += new System.EventHandler(this.AttributeLabel_MouseHover);\n\t\t\t// \n\t\t\t// lblPERAttribute\n\t\t\t// \n\t\t\tthis.lblPERAttribute.AutoSize = true;\n\t\t\tthis.lblPERAttribute.Location = new System.Drawing.Point(67, 13);\n\t\t\tthis.lblPERAttribute.Name = \"lblPERAttribute\";\n\t\t\tthis.lblPERAttribute.Size = new System.Drawing.Size(19, 13);\n\t\t\tthis.lblPERAttribute.TabIndex = 6;\n\t\t\tthis.lblPERAttribute.Text = \"17\";\n\t\t\tthis.lblPERAttribute.MouseHover += new System.EventHandler(this.AttributeLabel_MouseHover);\n\t\t\t// \n\t\t\t// AttributeCharismaLabel\n\t\t\t// \n\t\t\tthis.AttributeCharismaLabel.AutoSize = true;\n\t\t\tthis.AttributeCharismaLabel.Location = new System.Drawing.Point(0, 26);\n\t\t\tthis.AttributeCharismaLabel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.AttributeCharismaLabel.Name = \"AttributeCharismaLabel\";\n\t\t\tthis.AttributeCharismaLabel.Size = new System.Drawing.Size(53, 13);\n\t\t\tthis.AttributeCharismaLabel.TabIndex = 2;\n\t\t\tthis.AttributeCharismaLabel.Text = \"Charisma:\";\n\t\t\t// \n\t\t\t// AttributePerceptionLabel\n\t\t\t// \n\t\t\tthis.AttributePerceptionLabel.AutoSize = true;\n\t\t\tthis.AttributePerceptionLabel.Location = new System.Drawing.Point(0, 13);\n\t\t\tthis.AttributePerceptionLabel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.AttributePerceptionLabel.Name = \"AttributePerceptionLabel\";\n\t\t\tthis.AttributePerceptionLabel.Size = new System.Drawing.Size(61, 13);\n\t\t\tthis.AttributePerceptionLabel.TabIndex = 1;\n\t\t\tthis.AttributePerceptionLabel.Text = \"Perception:\";\n\t\t\t// \n\t\t\t// AttributeIntelligenceLabel\n\t\t\t// \n\t\t\tthis.AttributeIntelligenceLabel.AutoSize = true;\n\t\t\tthis.AttributeIntelligenceLabel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.AttributeIntelligenceLabel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.AttributeIntelligenceLabel.Name = \"AttributeIntelligenceLabel\";\n\t\t\tthis.AttributeIntelligenceLabel.Size = new System.Drawing.Size(64, 13);\n\t\t\tthis.AttributeIntelligenceLabel.TabIndex = 0;\n\t\t\tthis.AttributeIntelligenceLabel.Text = \"Intelligence:\";\n\t\t\t// \n\t\t\t// AttributeMemoryLabel\n\t\t\t// \n\t\t\tthis.AttributeMemoryLabel.AutoSize = true;\n\t\t\tthis.AttributeMemoryLabel.Location = new System.Drawing.Point(0, 52);\n\t\t\tthis.AttributeMemoryLabel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.AttributeMemoryLabel.Name = \"AttributeMemoryLabel\";\n\t\t\tthis.AttributeMemoryLabel.Size = new System.Drawing.Size(47, 13);\n\t\t\tthis.AttributeMemoryLabel.TabIndex = 4;\n\t\t\tthis.AttributeMemoryLabel.Text = \"Memory:\";\n\t\t\t// \n\t\t\t// AttributeWillpowerLabel\n\t\t\t// \n\t\t\tthis.AttributeWillpowerLabel.AutoSize = true;\n\t\t\tthis.AttributeWillpowerLabel.Location = new System.Drawing.Point(0, 39);\n\t\t\tthis.AttributeWillpowerLabel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.AttributeWillpowerLabel.Name = \"AttributeWillpowerLabel\";\n\t\t\tthis.AttributeWillpowerLabel.Size = new System.Drawing.Size(56, 13);\n\t\t\tthis.AttributeWillpowerLabel.TabIndex = 3;\n\t\t\tthis.AttributeWillpowerLabel.Text = \"Willpower:\";\n\t\t\t// \n\t\t\t// lblINTAttribute\n\t\t\t// \n\t\t\tthis.lblINTAttribute.AutoSize = true;\n\t\t\tthis.lblINTAttribute.Location = new System.Drawing.Point(67, 0);\n\t\t\tthis.lblINTAttribute.Name = \"lblINTAttribute\";\n\t\t\tthis.lblINTAttribute.Size = new System.Drawing.Size(19, 13);\n\t\t\tthis.lblINTAttribute.TabIndex = 5;\n\t\t\tthis.lblINTAttribute.Text = \"17\";\n\t\t\tthis.lblINTAttribute.MouseHover += new System.EventHandler(this.AttributeLabel_MouseHover);\n\t\t\t// \n\t\t\t// SkillSummaryLabel\n\t\t\t// \n\t\t\tthis.SkillSummaryLabel.AutoSize = true;\n\t\t\tthis.SkillSummaryLabel.BackColor = System.Drawing.Color.Transparent;\n\t\t\tthis.SkillSummaryLabel.Dock = System.Windows.Forms.DockStyle.Right;\n\t\t\tthis.SkillSummaryLabel.Location = new System.Drawing.Point(295, 5);\n\t\t\tthis.SkillSummaryLabel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.SkillSummaryLabel.Name = \"SkillSummaryLabel\";\n\t\t\tthis.SkillSummaryLabel.Size = new System.Drawing.Size(94, 52);\n\t\t\tthis.SkillSummaryLabel.TabIndex = 1;\n\t\t\tthis.SkillSummaryLabel.Text = \"Known Skills: 0\\r\\nSkills at Level V: 0\\r\\nTotal SP: 0\\r\\nFree SP: 0\";\n\t\t\tthis.SkillSummaryLabel.TextAlign = System.Drawing.ContentAlignment.TopRight;\n\t\t\tthis.SkillSummaryLabel.MouseHover += new System.EventHandler(this.SkillSummaryLabel_MouseHover);\n\t\t\t// \n\t\t\t// CustomLabelComboBox\n\t\t\t// \n\t\t\tthis.CustomLabelComboBox.Location = new System.Drawing.Point(138, 47);\n\t\t\tthis.CustomLabelComboBox.MaxLength = 256;\n\t\t\tthis.CustomLabelComboBox.Name = \"CustomLabelComboBox\";\n\t\t\tthis.CustomLabelComboBox.Size = new System.Drawing.Size(130, 21);\n\t\t\tthis.CustomLabelComboBox.TabIndex = 3;\n\t\t\tthis.ToolTip.SetToolTip(this.CustomLabelComboBox, \"Character label\");\n\t\t\tthis.CustomLabelComboBox.Visible = false;\n\t\t\tthis.CustomLabelComboBox.SelectedIndexChanged += new System.EventHandler(this.CustomLabelComboBox_TextChanged);\n\t\t\tthis.CustomLabelComboBox.KeyUp += new System.Windows.Forms.KeyEventHandler(this.CustomLabelComboBox_KeyUp);\n\t\t\tthis.CustomLabelComboBox.Validated += new System.EventHandler(this.CustomLabelComboBox_TextChanged);\n\t\t\t// \n\t\t\t// CharacterLabel\n\t\t\t// \n\t\t\tthis.CharacterLabel.AutoSize = true;\n\t\t\tthis.CharacterLabel.Location = new System.Drawing.Point(89, 50);\n\t\t\tthis.CharacterLabel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.CharacterLabel.Name = \"CharacterLabel\";\n\t\t\tthis.CharacterLabel.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0);\n\t\t\tthis.CharacterLabel.Size = new System.Drawing.Size(46, 13);\n\t\t\tthis.CharacterLabel.TabIndex = 3;\n\t\t\tthis.CharacterLabel.Text = \"Label:\";\n\t\t\t// \n\t\t\t// AccountStatusModeComboBox\n\t\t\t// \n\t\t\tthis.AccountStatusModeComboBox.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.AccountStatusModeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.AccountStatusModeComboBox.Items.AddRange(new object[] {\n            \"Auto Detect\",\n            \"Force Alpha\",\n            \"Force Omega\"});\n\t\t\tthis.AccountStatusModeComboBox.Location = new System.Drawing.Point(3, 179);\n\t\t\tthis.AccountStatusModeComboBox.Name = \"AccountStatusModeComboBox\";\n\t\t\tthis.AccountStatusModeComboBox.Size = new System.Drawing.Size(130, 21);\n\t\t\tthis.AccountStatusModeComboBox.TabIndex = 12;\n\t\t\tthis.ToolTip.SetToolTip(this.AccountStatusModeComboBox, \"Manually set this character as Alpha or Omega, or restore to auto detect\");\n\t\t\tthis.AccountStatusModeComboBox.SelectedIndexChanged += new System.EventHandler(this.AccountStatusModeComboBox_SelectedIndexChanged);\n\t\t\t// \n\t\t\t// ToolTip\n\t\t\t// \n\t\t\tthis.ToolTip.AutoPopDelay = 5000000;\n\t\t\tthis.ToolTip.InitialDelay = 500;\n\t\t\tthis.ToolTip.IsBalloon = true;\n\t\t\tthis.ToolTip.ReshowDelay = 100;\n\t\t\t// \n\t\t\t// CharacterMonitorHeader\n\t\t\t// \n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n\t\t\tthis.Controls.Add(this.MainTableLayoutPanel);\n\t\t\tthis.Name = \"CharacterMonitorHeader\";\n\t\t\tthis.Size = new System.Drawing.Size(525, 204);\n\t\t\tthis.Resize += new System.EventHandler(this.CharacterMonitorHeader_Resize);\n\t\t\tthis.MainTableLayoutPanel.ResumeLayout(false);\n\t\t\tthis.MainTableLayoutPanel.PerformLayout();\n\t\t\tthis.AccountStatusTableLayoutPanel.ResumeLayout(false);\n\t\t\tthis.AccountStatusTableLayoutPanel.PerformLayout();\n\t\t\tthis.ThrobberFlowLayoutPanel.ResumeLayout(false);\n\t\t\tthis.ThrobberFlowLayoutPanel.PerformLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.UpdateThrobber)).EndInit();\n\t\t\tthis.ThrobberContextMenu.ResumeLayout(false);\n\t\t\tthis.BioFlowLayoutPanel.ResumeLayout(false);\n\t\t\tthis.BioFlowLayoutPanel.PerformLayout();\n\t\t\tthis.SkillSummaryPanel.ResumeLayout(false);\n\t\t\tthis.SkillSummaryPanel.PerformLayout();\n\t\t\tthis.tlpAttributes.ResumeLayout(false);\n\t\t\tthis.tlpAttributes.PerformLayout();\n\t\t\tthis.ResumeLayout(false);\n\t\t\tthis.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel MainTableLayoutPanel;\n        private EVEMon.Common.Controls.CharacterPortrait CharacterPortrait;\n        private System.Windows.Forms.ContextMenuStrip ThrobberContextMenu;\n        private System.Windows.Forms.ToolStripMenuItem ChangeAPIKeyInfoMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem QueryEverythingMenuItem;\n        private System.Windows.Forms.ToolStripSeparator ThrobberSeparator;\n        private System.Windows.Forms.ToolTip ToolTip;\n        private System.Windows.Forms.FlowLayoutPanel BioFlowLayoutPanel;\n        private System.Windows.Forms.Label CharacterNameLabel;\n        private System.Windows.Forms.Label BioInfoLabel;\n        private System.Windows.Forms.Label BalanceLabel;\n        private System.Windows.Forms.Label BirthdayLabel;\n        private System.Windows.Forms.FlowLayoutPanel CorporationInfoFlowLayoutPanel;\n        private System.Windows.Forms.Label CorporationNameLabel;\n        private System.Windows.Forms.Label SecurityStatusLabel;\n        private System.Windows.Forms.FlowLayoutPanel ActiveShipFlowLayoutPanel;\n        private System.Windows.Forms.Label ActiveShipLabel;\n        private System.Windows.Forms.FlowLayoutPanel ThrobberFlowLayoutPanel;\n        private EVEMon.Common.Controls.Throbber UpdateThrobber;\n        private System.Windows.Forms.Label UpdateLabel;\n        private System.Windows.Forms.Label AllianceNameLabel;\n        private System.Windows.Forms.Label LocationInfoLabel;\n        private System.Windows.Forms.Label DockedInfoLabel;\n        private System.Windows.Forms.Panel SkillSummaryPanel;\n        private System.Windows.Forms.TableLayoutPanel AccountStatusTableLayoutPanel;\n        private System.Windows.Forms.Label AccountStatusLabel;\n        private System.Windows.Forms.Label AccountActivityLabel;\n        private System.Windows.Forms.Label PaidUntilLabel;\n        private System.Windows.Forms.TableLayoutPanel tlpAttributes;\n        private System.Windows.Forms.Label lblMEMAttribute;\n        private System.Windows.Forms.Label lblWILAttribute;\n        private System.Windows.Forms.Label lblCHAAttribute;\n        private System.Windows.Forms.Label lblPERAttribute;\n        private System.Windows.Forms.Label AttributeCharismaLabel;\n        private System.Windows.Forms.Label AttributePerceptionLabel;\n        private System.Windows.Forms.Label AttributeIntelligenceLabel;\n        private System.Windows.Forms.Label AttributeMemoryLabel;\n        private System.Windows.Forms.Label AttributeWillpowerLabel;\n        private System.Windows.Forms.Label lblINTAttribute;\n        private System.Windows.Forms.Label SkillSummaryLabel;\n        private System.Windows.Forms.Label RemapsCloneJumpSummaryLabel;\n        private System.Windows.Forms.ComboBox CustomLabelComboBox;\n        private System.Windows.Forms.Label CharacterLabel;\n        private System.Windows.Forms.LinkLabel CustomLabelLink;\n        private System.Windows.Forms.ComboBox AccountStatusModeComboBox;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMonitorHeader.cs",
    "content": "﻿using EVEMon.ApiCredentialsManagement;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization.Esi;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing static EVEMon.Common.Models.AccountStatus;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    /// <summary>\n    /// Implements the header component of the main character monitor user interface.\n    /// </summary>\n    internal sealed partial class CharacterMonitorHeader : UserControl\n    {\n        #region Fields\n\n        private Character m_character;\n        private long m_spAtLastRedraw;\n        private string m_nextCloneJumpAtLastRedraw;\n        private volatile bool m_updatingLabels;\n        private volatile bool m_updatingStatus;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CharacterMonitorHeader\"/> class.\n        /// </summary>\n        public CharacterMonitorHeader()\n        {\n            InitializeComponent();\n\n            // Fonts\n            Font = FontFactory.GetFont(\"Tahoma\");\n            CharacterNameLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n            m_updatingLabels = m_updatingStatus = false;\n            AccountStatusModeComboBox.SelectedIndex = 0;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Occurs when control loads.\n        /// </summary>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            // Subscribe to events\n            EveMonClient.CharacterUpdated += EveMonClient_CharacterUpdated;\n            EveMonClient.CharacterInfoUpdated += EveMonClient_CharacterInfoUpdated;\n            EveMonClient.MarketOrdersUpdated += EveMonClient_MarketOrdersUpdated;\n            EveMonClient.AccountStatusUpdated += EveMonClient_AccountStatusUpdated;\n            EveMonClient.ConquerableStationListUpdated += EveMonClient_ConquerableStationListUpdated;\n            EveMonClient.CharacterLabelChanged += EveMonClient_CharacterLabelChanged;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Occurs when visibility changes.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (DesignMode || this.IsDesignModeHosted() || !Visible)\n                return;\n\n            UpdateFrequentControls();\n            UpdateInfrequentControls();\n        }\n\n        /// <summary>\n        /// Called when the control is disposed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterUpdated -= EveMonClient_CharacterUpdated;\n            EveMonClient.CharacterInfoUpdated -= EveMonClient_CharacterInfoUpdated;\n            EveMonClient.MarketOrdersUpdated -= EveMonClient_MarketOrdersUpdated;\n            EveMonClient.AccountStatusUpdated -= EveMonClient_AccountStatusUpdated;\n            EveMonClient.ConquerableStationListUpdated -= EveMonClient_ConquerableStationListUpdated;\n            EveMonClient.CharacterLabelChanged -= EveMonClient_CharacterLabelChanged;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            Disposed -= OnDisposed;\n        }\n\n        #endregion\n\n\n        #region Updating Methods\n\n        /// <summary>\n        /// Updates the controls whos content changes frequently.\n        /// </summary>\n        private void UpdateFrequentControls()\n        {\n            if (m_character == null)\n                return;\n\n            SuspendLayout();\n            try\n            {\n                RefreshThrobber();\n\n                // Only update the skill summary when the skill points change\n                // or we have a timer on the next clone jump\n                var totalSkillPoints = GetTotalSkillPoints();\n                var nextCloneJumpAvailable = GetNextCloneJumpTime();\n\n                if (m_spAtLastRedraw != totalSkillPoints || m_nextCloneJumpAtLastRedraw != nextCloneJumpAvailable)\n                {\n                    SkillSummaryLabel.Text = FormatSkillSummary();\n                    RemapsCloneJumpSummaryLabel.Text = FormatRemapCloneJumpSummary();\n                }\n\n                m_spAtLastRedraw = totalSkillPoints;\n                m_nextCloneJumpAtLastRedraw = nextCloneJumpAvailable;\n            }\n            finally\n            {\n                ResumeLayout(false);\n            }\n        }\n\n        /// <summary>\n        /// Gets the total skill points.\n        /// </summary>\n        /// <returns></returns>\n        private long GetTotalSkillPoints()\n        {\n            var totalSkillPoints = m_character.SkillPoints;\n\n            var ccpCharacter = m_character as CCPCharacter;\n            var queuedSkill = ccpCharacter?.SkillQueue.FirstOrDefault();\n            if (ccpCharacter != null && ccpCharacter.IsTraining &&\n                queuedSkill != null && queuedSkill.SkillName == Skill.UnknownSkill.Name)\n            {\n                totalSkillPoints += queuedSkill.CurrentSP - queuedSkill.StartSP;\n            }\n            return totalSkillPoints;\n        }\n\n        /// <summary>\n        /// Gets the next clone jump time.\n        /// </summary>\n        /// <returns></returns>\n        private string GetNextCloneJumpTime()\n        {\n            var nextCloneJumpAvailable = m_character.JumpCloneLastJumpDate.AddHours(24 -\n                m_character.Skills[DBConstants.InfomorphSynchronizingSkillID].Level);\n\n            return nextCloneJumpAvailable > DateTime.UtcNow ? nextCloneJumpAvailable.\n                ToRemainingTimeDigitalDescription(DateTimeKind.Utc) : \"Now\";\n        }\n\n        /// <summary>\n        /// Updates the controls whos content changes infrequently.\n        /// </summary>\n        private void UpdateInfrequentControls()\n        {\n            if (m_character == null)\n                return;\n\n            SuspendLayout();\n            try\n            {\n                // Safe for work implementation\n                MainTableLayoutPanel.ColumnStyles[0].SizeType = Settings.UI.SafeForWork ?\n                    SizeType.Absolute : SizeType.AutoSize;\n                MainTableLayoutPanel.ColumnStyles[0].Width = 0;\n                CharacterPortrait.Visible = !Settings.UI.SafeForWork;\n\n                CharacterPortrait.Character = m_character;\n                CharacterNameLabel.Text = m_character.AdornedName;\n                BioInfoLabel.Text = (m_character.Gender ?? \"Gender\") + \" - \" + (m_character.\n                    Race ?? \"Race\") + \" - \" + (m_character.Bloodline ?? \"Bloodline\") + \" - \" +\n                    (m_character.Ancestry ?? \"Ancestry\");\n                BirthdayLabel.Text = \"Birthday: \" + m_character.Birthday.ToLocalTime();\n                CorporationNameLabel.Text = \"Corporation: \" + (m_character.CorporationName ??\n                    EveMonConstants.UnknownText);\n                AllianceNameLabel.Text = \"Alliance: \" + (m_character.IsInNPCCorporation ?\n                    \"None\" : (m_character.AllianceName ?? EveMonConstants.UnknownText));\n\n                FormatBalance();\n                FormatAttributes();\n                UpdateInfoControls();\n                UpdateCharacterLabel(EveMonClient.Characters.GetKnownLabels());\n                UpdateAccountStatusInfo();\n            }\n            finally\n            {\n                ResumeLayout(false);\n            }\n        }\n\n        /// <summary>\n        /// Updates the info controls.\n        /// </summary>\n        private void UpdateInfoControls()\n        {\n            if (m_character == null)\n                return;\n\n            SuspendLayout();\n            try\n            {\n                SecurityStatusLabel.Text = $\"Security Status: {m_character.SecurityStatus:N2}\";\n                ActiveShipLabel.Text = m_character.GetActiveShipText();\n                LocationInfoLabel.Text = $\"Located in: {m_character.GetLastKnownLocationText()}\";\n                ToolTip.SetToolTip(LocationInfoLabel, \"Home station: \" + m_character.\n                    HomeStation?.FullLocation ?? EveMonConstants.UnknownText);\n\n                string dockedInfoText = m_character.GetLastKnownDockedText();\n                DockedInfoLabel.Text = string.IsNullOrWhiteSpace(dockedInfoText) ? \" \" :\n                    \"Docked at: \" + dockedInfoText;\n            }\n            finally\n            {\n                ResumeLayout(false);\n            }\n        }\n\n        /// <summary>\n        /// Updates the character label.\n        /// </summary>\n        private void UpdateCharacterLabel(IEnumerable<string> allLabels)\n        {\n            m_updatingLabels = true;\n            try\n            {\n                string lbl = m_character.Label;\n                // Update the character labels\n                CustomLabelComboBox.Items.Clear();\n                foreach (string label in allLabels)\n                    CustomLabelComboBox.Items.Add(label);\n                CustomLabelComboBox.Text = lbl;\n                // Provide clickable text if the label is blank\n                if (lbl.IsEmptyOrUnknown())\n                    lbl = \"Edit label\";\n                CustomLabelLink.Text = lbl;\n            }\n            finally\n            {\n                m_updatingLabels = false;\n            }\n        }\n\n        /// <summary>\n        /// Updates the account status info.\n        /// </summary>\n        private void UpdateAccountStatusInfo()\n        {\n            if (m_character == null)\n                return;\n\n            var ccpCharacter = m_character as CCPCharacter;\n            if (ccpCharacter == null)\n            {\n                AccountStatusTableLayoutPanel.Visible = false;\n                return;\n            }\n\n            SuspendLayout();\n            m_updatingStatus = true;\n            try\n            {\n                AccountActivityLabel.Text = m_character.EffectiveCharacterStatus.ToString();\n\n                switch (m_character.EffectiveCharacterStatus)\n                {\n                case Omega:\n                    AccountActivityLabel.ForeColor = Color.DarkGreen;\n                    break;\n                case Alpha:\n                    AccountActivityLabel.ForeColor = SystemColors.ControlText;\n                    break;\n                default:\n                    AccountActivityLabel.ForeColor = Color.Red;\n                    break;\n                }\n\n                int index;\n                switch (m_character.AccountStatusSettings)\n                {\n                case AccountStatusMode.Alpha:\n                    // \"Force Alpha\"\n                    index = 1;\n                    break;\n                case AccountStatusMode.Omega:\n                    // \"Force Omega\"\n                    index = 2;\n                    break;\n                default:\n                    index = 0;\n                    break;\n                }\n                AccountStatusModeComboBox.SelectedIndex = index;\n\n                // When account status is re-implemented, this will need to be shown again\n                PaidUntilLabel.Text = string.Empty;\n            }\n            finally\n            {\n                m_updatingStatus = false;\n                ResumeLayout(false);\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Sets the character.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <value>The character.</value>\n        public void SetCharacter(Character character)\n        {\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Formats the balance.\n        /// </summary>\n        private void FormatBalance()\n        {\n            if (m_character == null)\n                return;\n\n            BalanceLabel.Text = $\"Balance: {m_character.Balance:N} ISK\";\n\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n\n            if (ccpCharacter == null)\n                return;\n\n            IQueryMonitor marketMonitor = ccpCharacter.QueryMonitors[ESIAPICharacterMethods.MarketOrders];\n            if (!Settings.UI.SafeForWork && !ccpCharacter.HasSufficientBalance && marketMonitor != null && marketMonitor.Enabled)\n            {\n                BalanceLabel.ForeColor = Color.Orange;\n                BalanceLabel.Font = FontFactory.GetFont(Font, FontStyle.Bold);\n                return;\n            }\n\n            BalanceLabel.ForeColor = !Settings.UI.SafeForWork && m_character.Balance < 0 ? Color.Red : SystemColors.ControlText;\n            BalanceLabel.Font = FontFactory.GetFont(Font);\n        }\n\n        /// <summary>\n        /// Refreshes the throbber.\n        /// </summary>\n        private void RefreshThrobber()\n        {\n            var ccpCharacter = m_character as CCPCharacter;\n\n            if (ccpCharacter == null)\n                HideThrobber();\n            else if (ccpCharacter.QueryMonitors.Any(monitor => monitor.IsUpdating))\n                SetThrobberUpdating();\n            else if (!NetworkMonitor.IsNetworkAvailable)\n                SetThrobberStrobing(\"Network Unavailable\");\n            else if (EsiErrors.IsErrorCountExceeded)\n                SetThrobberStrobing(\"ESI error count throttled\");\n            else\n            {\n                SetThrobberStopped();\n                UpdateCountdown();\n            }\n        }\n\n        /// <summary>\n        /// Updates the countdown.\n        /// </summary>\n        private void UpdateCountdown()\n        {\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n\n            if (ccpCharacter == null)\n                return;\n\n            IQueryMonitor nextMonitor = ccpCharacter.QueryMonitors.NextMonitorToBeUpdated;\n\n            if (nextMonitor == null)\n            {\n                UpdateLabel.Text = string.Empty;\n                return;\n            }\n\n            TimeSpan timeLeft = nextMonitor.NextUpdate.Subtract(DateTime.UtcNow);\n\n            if (timeLeft <= TimeSpan.Zero)\n            {\n                UpdateLabel.Text = @\"Pending...\";\n                return;\n            }\n\n            if (UpdateThrobber.State == ThrobberState.Rotating)\n                return;\n\n            UpdateLabel.Text = $\"{Math.Floor(timeLeft.TotalHours):#00}:{timeLeft.Minutes:d2}:{timeLeft.Seconds:d2}\";\n        }\n\n        /// <summary>\n        /// Sets the throbber stopped.\n        /// </summary>\n        private void SetThrobberStopped()\n        {\n            UpdateThrobber.State = ThrobberState.Stopped;\n\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n\n            if (ccpCharacter == null)\n                return;\n\n            if (!ccpCharacter.Identity.ESIKeys.Any() || ccpCharacter.QueryMonitors.Any(x => !x.CanForceUpdate))\n            {\n                ToolTip.SetToolTip(UpdateThrobber, string.Empty);\n                return;\n            }\n\n            ToolTip.SetToolTip(UpdateThrobber, \"Click to update now\");\n        }\n\n        /// <summary>\n        /// Sets the throbber strobing.\n        /// </summary>\n        /// <param name=\"status\">The status.</param>\n        private void SetThrobberStrobing(string status)\n        {\n            UpdateLabel.Text = string.Empty;\n            UpdateThrobber.Visible = true;\n            UpdateThrobber.State = ThrobberState.Strobing;\n            ToolTip.SetToolTip(UpdateThrobber, status);\n        }\n\n        /// <summary>\n        /// Sets the throbber updating.\n        /// </summary>\n        private void SetThrobberUpdating()\n        {\n            UpdateLabel.Text = string.Empty;\n            UpdateThrobber.State = ThrobberState.Rotating;\n            UpdateThrobber.Visible = true;\n            ToolTip.SetToolTip(UpdateThrobber, \"Retrieving data from API...\");\n        }\n\n        /// <summary>\n        /// Hides the throbber.\n        /// </summary>\n        private void HideThrobber()\n        {\n            UpdateLabel.Text = string.Empty;\n            UpdateThrobber.Visible = false;\n            UpdateThrobber.State = ThrobberState.Stopped;\n        }\n\n        /// <summary>\n        /// Populates the attribute text for the attribute labels.\n        /// </summary>\n        private void FormatAttributes()\n        {\n            SetAttributeLabel(lblINTAttribute, EveAttribute.Intelligence);\n            SetAttributeLabel(lblPERAttribute, EveAttribute.Perception);\n            SetAttributeLabel(lblCHAAttribute, EveAttribute.Charisma);\n            SetAttributeLabel(lblWILAttribute, EveAttribute.Willpower);\n            SetAttributeLabel(lblMEMAttribute, EveAttribute.Memory);\n        }\n\n        /// <summary>\n        /// Gets the update status.\n        /// </summary>\n        /// <returns>Status text to display in the tool tip.</returns>\n        private string GetUpdateStatus()\n        {\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n\n            if (ccpCharacter == null)\n                return string.Empty;\n\n            StringBuilder output = new StringBuilder();\n\n            // Skip character's corporation monitors if they are bound with the character's personal monitor\n            foreach (IQueryMonitor monitor in ccpCharacter.QueryMonitors.OrderedByUpdateTime.Where(\n                monitor => monitor.Method.HasHeader() && monitor.HasAccess).Where(\n                monitor => (monitor.Method.GetType() != typeof(ESIAPICorporationMethods))))\n            {\n                output.AppendLine(GetStatusForMonitor(monitor));\n            }\n\n            return output.ToString();\n        }\n\n        /// <summary>\n        /// Generates text representing the time to next update.\n        /// </summary>\n        /// <param name=\"monitor\">The monitor.</param>\n        /// <returns>String describing the time until the next update.</returns>\n        private static string GenerateTimeToNextUpdateText(IQueryMonitor monitor)\n        {\n            TimeSpan timeToNextUpdate = monitor.NextUpdate.Subtract(DateTime.UtcNow);\n\n            if (monitor.Status == QueryStatus.Disabled)\n                return \"(Disabled)\";\n\n            if (timeToNextUpdate <= TimeSpan.Zero)\n                return \"(Pending)\";\n\n            if (monitor.NextUpdate == DateTime.MaxValue)\n                return \"(Never)\";\n\n            return timeToNextUpdate.TotalMinutes >= 60\n                ? $\"(~{Math.Floor(timeToNextUpdate.TotalHours)}h)\"\n                : $\"({Math.Floor(timeToNextUpdate.TotalMinutes)}m)\";\n        }\n\n        /// <summary>\n        /// Gets the update status for a monitor.\n        /// </summary>\n        /// <param name=\"monitor\">The monitor.</param>\n        /// <returns>Status text for the monitor.</returns>\n        private static string GetStatusForMonitor(IQueryMonitor monitor)\n        {\n            StringBuilder output = new StringBuilder();\n\n            output.Append($\"{monitor}: \");\n\n            if (monitor.Status == QueryStatus.Pending)\n            {\n                output.Append(GetDetailedStatusForMonitor(monitor));\n                return output.ToString();\n            }\n\n            output.Append(monitor.Status.GetDescription());\n            return output.ToString();\n        }\n\n        /// <summary>\n        /// Gets the detailed status for monitor.\n        /// </summary>\n        /// <param name=\"monitor\">The monitor.</param>\n        /// <returns>Detailed status text for the monitor.</returns>\n        private static string GetDetailedStatusForMonitor(IQueryMonitor monitor)\n        {\n            if (monitor.NextUpdate == DateTime.MaxValue)\n                return \"Never\";\n\n            TimeSpan remainingTime = monitor.NextUpdate.Subtract(DateTime.UtcNow);\n            if (remainingTime.Minutes < 1)\n                return \"Less than a minute\";\n\n            return remainingTime.ToDescriptiveText(\n                DescriptiveTextOptions.FullText |\n                DescriptiveTextOptions.SpaceText |\n                DescriptiveTextOptions.SpaceBetween, false);\n        }\n\n        /// <summary>\n        /// Creates the new monitor toolstrip menu item.\n        /// </summary>\n        /// <param name=\"monitor\">The monitor.</param>\n        /// <returns>New menu item for a monitor.</returns>\n        private static ToolStripMenuItem CreateNewMonitorToolStripMenuItem(IQueryMonitor monitor)\n        {\n            string menuText = $\"Update {monitor} {GenerateTimeToNextUpdateText(monitor)}\";\n\n            ToolStripMenuItem menu;\n            ToolStripMenuItem tempMenu = null;\n            try\n            {\n                tempMenu = new ToolStripMenuItem(menuText)\n                {\n                    Tag = monitor.Method,\n                    Enabled = monitor.Enabled && monitor.HasAccess && monitor.CanForceUpdate\n                };\n\n                menu = tempMenu;\n                tempMenu = null;\n            }\n            finally\n            {\n                tempMenu?.Dispose();\n            }\n            return menu;\n        }\n\n        /// <summary>\n        /// Gets the attribute text for a character.\n        /// </summary>\n        /// <param name=\"label\">The attribute label.</param>\n        /// <param name=\"eveAttribute\">The eve attribute.</param>\n        /// <returns>Formatted string describing the attribute and its value.</returns>\n        private void SetAttributeLabel(Control label, EveAttribute eveAttribute)\n        {\n            label.Text = m_character[eveAttribute].EffectiveValue.ToString(CultureConstants.DefaultCulture);\n\n            label.Tag = eveAttribute;\n        }\n\n        /// <summary>\n        /// Formats the characters skill summary as a multi-line string.\n        /// </summary>\n        /// <returns>Formatted list of information about a characters skills.</returns>\n        private string FormatSkillSummary()\n        {\n            StringBuilder output = new StringBuilder();\n\n            output\n                .Append($\"Known Skills: {m_character.KnownSkillCount}\")\n                .AppendLine()\n                .Append($\"Skills at Level V: {m_character.GetSkillCountAtLevel(5)}\")\n                .AppendLine()\n                .Append($\"Total SP: {GetTotalSkillPoints():N0}\")\n                .AppendLine()\n                .Append($\"Free SP: {m_character.FreeSkillPoints:N0}\");\n\n            return output.ToString();\n        }\n\n        /// <summary>\n        /// Formats the characters remap and clone jump summary as a multi-line string.\n        /// </summary>\n        /// <returns>Formatted list of information about a characters skills.</returns>\n        private string FormatRemapCloneJumpSummary()\n        {\n            StringBuilder output = new StringBuilder();\n\n            string remapAvailableText = m_character.LastReMapTimed.AddYears(1) > DateTime.UtcNow\n                ? m_character.LastReMapTimed.AddYears(1).ToLocalTime().ToString(CultureConstants.DefaultCulture)\n                : \"Now\";\n\n            output\n                .Append($\"Bonus Remaps: {m_character.AvailableReMaps}\")\n                .AppendLine()\n                .Append($\"Next Neural Remap: {remapAvailableText}\")\n                .AppendLine()\n                .Append($\"Next Clone Jump: {GetNextCloneJumpTime()}\");\n\n            return output.ToString();\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Handles the CharacterLabelChanged event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"LabelChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterLabelChanged(object sender, LabelChangedEventArgs e)\n        {\n            UpdateCharacterLabel(e.AllLabels);\n        }\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (Visible)\n                UpdateFrequentControls();\n        }\n\n        /// <summary>\n        /// Handles the SettingsChanged event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            if (Visible)\n                UpdateInfrequentControls();\n        }\n\n        /// <summary>\n        /// Handles the CharacterUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            // No need to do this if control is not visible\n            if (Visible && e.Character == m_character)\n                UpdateInfrequentControls();\n        }\n\n        /// <summary>\n        /// Handles the CharacterInfoUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterInfoUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            // No need to do this if control is not visible\n            if (Visible && e.Character == m_character)\n                UpdateInfoControls();\n        }\n\n        /// <summary>\n        /// Handles the ConquerableStationListUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_ConquerableStationListUpdated(object sender, EventArgs e)\n        {\n            if (Visible)\n                UpdateInfoControls();\n        }\n\n        /// <summary>\n        /// Handles the MarketOrdersChanged event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_MarketOrdersUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            // No need to do this if control is not visible\n            if (Visible && e.Character == m_character)\n                FormatBalance();\n        }\n\n        /// <summary>\n        /// Handles the AccountStatusUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_AccountStatusUpdated(object sender, EventArgs e)\n        {\n            // If account status is added to ESI, investigate this and see if it can be done\n            // only if visible\n            UpdateAccountStatusInfo();\n        }\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// Occurs when the user presses a key in the label box.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void CustomLabelComboBox_KeyUp(object sender, KeyEventArgs e)\n        {\n            if ((e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return) && !m_updatingLabels &&\n                m_character != null)\n            {\n                m_character.Label = CustomLabelComboBox.Text;\n                e.Handled = true;\n            }\n        }\n\n        /// <summary>\n        /// Occurs when the user selects or types in a new character label for this character.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void CustomLabelComboBox_TextChanged(object sender, EventArgs e)\n        {\n            if (!m_updatingLabels && m_character != null)\n                m_character.Label = CustomLabelComboBox.Text;\n        }\n\n        /// <summary>\n        /// Occurs when the user selects a new character status override for this character.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void AccountStatusModeComboBox_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (!m_updatingStatus && m_character != null)\n            {\n                switch (AccountStatusModeComboBox.SelectedIndex)\n                {\n                case 1:\n                    // \"Force Alpha\"\n                    m_character.AccountStatusSettings = AccountStatusMode.Alpha;\n                    break;\n                case 2:\n                    // \"Force Omega\"\n                    m_character.AccountStatusSettings = AccountStatusMode.Omega;\n                    break;\n                case 0:\n                default:\n                    // \"Auto\"\n                    m_character.AccountStatusSettings = AccountStatusMode.Auto;\n                    break;\n                }\n                UpdateAccountStatusInfo();\n            }\n        }\n\n        /// <summary>\n        /// Occurs when the user click the throbber.\n        /// Query the API for or a full update when possible, or show the throbber's context menu.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void UpdateThrobber_MouseDown(object sender, MouseEventArgs e)\n        {\n            UpdateThrobber.Cursor = Cursors.Default;\n\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n\n            // This is not a CCP character, it can't be updated\n            if (ccpCharacter == null)\n               return;\n\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            // There has been an error in the past (Authorization, Server Error, etc.)\n            // or updating now will return the same data because the cache has not expired\n            // or character has no associated API key\n            if (UpdateThrobber.State == ThrobberState.Strobing || !ccpCharacter.Identity.ESIKeys.Any() ||\n                ccpCharacter.QueryMonitors.Any(x => !x.CanForceUpdate))\n            {\n                ThrobberContextMenu.Show(MousePosition);\n                return;\n            }\n\n            // All checks out query everything\n            ccpCharacter.QueryMonitors.QueryEverything();\n        }\n\n        /// <summary>\n        /// Handles the MouseMove event of the UpdateThrobber control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\" /> instance containing the event data.</param>\n        private void UpdateThrobber_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            UpdateThrobber.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Handles the MouseHover event of the UpdateLabel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void UpdateLabel_MouseHover(object sender, EventArgs e)\n        {\n            ToolTip.SetToolTip(UpdateLabel, GetUpdateStatus());\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the ThrobberContextMenu control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void ThrobberContextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            UpdateThrobber.Cursor = Cursors.Default;\n\n            // Remove all the items after the separator including the separator\n            int separatorIndex = ThrobberContextMenu.Items.IndexOf(ThrobberSeparator);\n            while (separatorIndex > -1 && separatorIndex < ThrobberContextMenu.Items.Count)\n            {\n                ThrobberContextMenu.Items.RemoveAt(separatorIndex);\n            }\n\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n\n            // Exit for non-CCP characters or no associated API key\n            if (ccpCharacter == null || !ccpCharacter.Identity.ESIKeys.Any() || !ccpCharacter.QueryMonitors.Any())\n            {\n                QueryEverythingMenuItem.Enabled = false;\n                return;\n            }\n\n            // Enables / Disables the \"query everything\" menu item\n            QueryEverythingMenuItem.Enabled = ccpCharacter.QueryMonitors.All(x => x.HasAccess && x.CanForceUpdate);\n\n            // Add a separator before monitor items if it doesn't exist already\n            if (!ThrobberContextMenu.Items.Contains(ThrobberSeparator))\n                ThrobberContextMenu.Items.Add(ThrobberSeparator);\n\n            // Add monitor items\n            // Skip character's corporation monitors if they are bound with the character's personal monitor\n            foreach (ToolStripMenuItem menuItem in ccpCharacter.QueryMonitors\n                .Where(monitor => monitor.Method.HasHeader() && monitor.HasAccess)\n                .Where(monitor => monitor.Method.GetType() != typeof(ESIAPICorporationMethods))\n                .Select(CreateNewMonitorToolStripMenuItem))\n            {\n                ThrobberContextMenu.Items.Add(menuItem);\n            }\n        }\n\n        /// <summary>\n        /// Handles the ItemClicked event of the ThrobberContextMenu control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.ToolStripItemClickedEventArgs\"/> instance containing the event data.</param>\n        private void ThrobberContextMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)\n        {\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n\n            if (ccpCharacter == null)\n                return;\n\n            if (e.ClickedItem == QueryEverythingMenuItem)\n            {\n                SetThrobberUpdating();\n                ccpCharacter.QueryMonitors.QueryEverything();\n                return;\n            }\n\n            Enum method = e.ClickedItem.Tag as Enum;\n\n            if (method == null)\n                return;\n\n            SetThrobberUpdating();\n\n            foreach (IQueryMonitor monitor in ccpCharacter.QueryMonitors.Where(\n                monitor => monitor.Method.ToString().Contains(method.ToString())))\n            {\n                ccpCharacter.QueryMonitors.Query(monitor.Method);\n            }\n        }\n\n        /// <summary>\n        /// Handles the MouseHover event of the SkillSummaryLabel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void SkillSummaryLabel_MouseHover(object sender, EventArgs e)\n        {\n            StringBuilder sb = new StringBuilder();\n            for (int skillLevel = 0; skillLevel <= 5; skillLevel++)\n            {\n                int count = m_character.GetSkillCountAtLevel(skillLevel);\n\n                if (skillLevel > 0)\n                    sb.AppendLine();\n\n                sb.Append($\"Skills at Level {skillLevel}: {count.ToString(CultureConstants.DefaultCulture).PadLeft(5)}\");\n            }\n\n            ToolTip.SetToolTip((Label)sender, sb.ToString());\n        }\n\n        /// <summary>\n        /// When the user hovers over one of the attribute label, we display a tooltip such as :\n        /// 19.8 (7 base + 7 remap points + 4 implants)\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void AttributeLabel_MouseHover(object sender, EventArgs e)\n        {\n            // Retrieve the attribute from the sender\n            Label attributeLabel = (Label)sender;\n            EveAttribute eveAttribute = (EveAttribute)attributeLabel.Tag;\n\n            // Format the values for the tooltip\n            ICharacterAttribute attribute = m_character[eveAttribute];\n            string toolTip = attribute.ToString(\"%e (%B base + %r remap points + %i implants)\");\n            ToolTip.SetToolTip(attributeLabel, toolTip);\n        }\n\n        /// <summary>\n        /// Handles the Resize event of the CharacterMonitorHeader control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void CharacterMonitorHeader_Resize(object sender, EventArgs e)\n        {\n            Height = MainTableLayoutPanel.Height;\n            MainTableLayoutPanel.Width = Width;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the ChangeAPIKeyInfoMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void ChangeAPIKeyInfoMenuItem_Click(object sender, EventArgs e)\n        {\n            // This menu should be enabled only for CCP characters\n            // Open the ESI keys management dialog since multiple keys can affect one character\n            //WindowsFactory.ShowByTag<EsiKeyUpdateOrAdditionWindow, IEnumerable<ESIKey>>(m_character.Identity.ESIKeys);\n            using (EsiKeysManagementWindow window = new EsiKeysManagementWindow())\n            {\n                window.ShowDialog(this);\n            }\n        }\n\n        /// <summary>\n        /// Occurs when the user edits the character's custom label.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"LinkLabelLinkClickedEventArgs\"/> instance containing the event data.</param>\n        private void CustomLabelLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            CustomLabelLink.Visible = false;\n            CustomLabelComboBox.Visible = true;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterMonitorHeader.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"ToolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>193, 17</value>\n  </metadata>\n  <metadata name=\"ThrobberContextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"ToolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>193, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterPlanetaryList.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterPlanetaryList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n\t\t\tthis.components = new System.ComponentModel.Container();\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterPlanetaryList));\n\t\t\tthis.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n\t\t\tthis.showInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.showCommodityInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.showInstallationInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.showPlanetInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.showInBrowserMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.ilIcons = new System.Windows.Forms.ImageList(this.components);\n\t\t\tthis.noPlanetaryColoniesLabel = new System.Windows.Forms.Label();\n\t\t\tthis.lvPlanetary = new System.Windows.Forms.ListView();\n\t\t\tthis.chState = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.chTTC = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.chInstallation = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.chCommodity = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.chQuantityPerCycle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.chQuantity = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.chVolume = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.contextMenu.SuspendLayout();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// contextMenu\n\t\t\t// \n\t\t\tthis.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showInBrowserMenuItem,\n            this.showInBrowserMenuSeparator,\n            this.exportToCSVToolStripMenuItem});\n\t\t\tthis.contextMenu.Name = \"ShipPropertiesContextMenu\";\n\t\t\tthis.contextMenu.Size = new System.Drawing.Size(189, 54);\n\t\t\tthis.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenu_Opening);\n\t\t\t// \n\t\t\t// showInBrowserMenuItem\n\t\t\t// \n\t\t\tthis.showInBrowserMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showCommodityInBrowserMenuItem,\n            this.showInstallationInBrowserMenuItem,\n            this.showPlanetInBrowserMenuItem});\n\t\t\tthis.showInBrowserMenuItem.Name = \"showInBrowserMenuItem\";\n\t\t\tthis.showInBrowserMenuItem.Size = new System.Drawing.Size(188, 22);\n\t\t\tthis.showInBrowserMenuItem.Text = \"Show In Item Browser\";\n\t\t\t// \n\t\t\t// showCommodityInBrowserMenuItem\n\t\t\t// \n\t\t\tthis.showCommodityInBrowserMenuItem.Name = \"showCommodityInBrowserMenuItem\";\n\t\t\tthis.showCommodityInBrowserMenuItem.Size = new System.Drawing.Size(147, 22);\n\t\t\tthis.showCommodityInBrowserMenuItem.Text = \"Commodity...\";\n\t\t\tthis.showCommodityInBrowserMenuItem.Click += new System.EventHandler(this.showInBrowserMenuItem_Click);\n\t\t\t// \n\t\t\t// showInstallationInBrowserMenuItem\n\t\t\t// \n\t\t\tthis.showInstallationInBrowserMenuItem.Name = \"showInstallationInBrowserMenuItem\";\n\t\t\tthis.showInstallationInBrowserMenuItem.Size = new System.Drawing.Size(147, 22);\n\t\t\tthis.showInstallationInBrowserMenuItem.Text = \"Installation...\";\n\t\t\tthis.showInstallationInBrowserMenuItem.Click += new System.EventHandler(this.showInBrowserMenuItem_Click);\n\t\t\t// \n\t\t\t// showPlanetInBrowserMenuItem\n\t\t\t// \n\t\t\tthis.showPlanetInBrowserMenuItem.Name = \"showPlanetInBrowserMenuItem\";\n\t\t\tthis.showPlanetInBrowserMenuItem.Size = new System.Drawing.Size(147, 22);\n\t\t\tthis.showPlanetInBrowserMenuItem.Text = \"Planet...\";\n\t\t\tthis.showPlanetInBrowserMenuItem.Click += new System.EventHandler(this.showInBrowserMenuItem_Click);\n\t\t\t// \n\t\t\t// showInBrowserMenuSeparator\n\t\t\t// \n\t\t\tthis.showInBrowserMenuSeparator.Name = \"showInBrowserMenuSeparator\";\n\t\t\tthis.showInBrowserMenuSeparator.Size = new System.Drawing.Size(185, 6);\n\t\t\t// \n\t\t\t// exportToCSVToolStripMenuItem\n\t\t\t// \n\t\t\tthis.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n\t\t\tthis.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(188, 22);\n\t\t\tthis.exportToCSVToolStripMenuItem.Text = \"Export To CSV...\";\n\t\t\tthis.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// ilIcons\n\t\t\t// \n\t\t\tthis.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n\t\t\tthis.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n\t\t\tthis.ilIcons.Images.SetKeyName(0, \"arrow_up.png\");\n\t\t\tthis.ilIcons.Images.SetKeyName(1, \"arrow_down.png\");\n\t\t\tthis.ilIcons.Images.SetKeyName(2, \"16x16Transparant.png\");\n\t\t\t// \n\t\t\t// noPlanetaryColoniesLabel\n\t\t\t// \n\t\t\tthis.noPlanetaryColoniesLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.noPlanetaryColoniesLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n\t\t\tthis.noPlanetaryColoniesLabel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.noPlanetaryColoniesLabel.Name = \"noPlanetaryColoniesLabel\";\n\t\t\tthis.noPlanetaryColoniesLabel.Size = new System.Drawing.Size(454, 434);\n\t\t\tthis.noPlanetaryColoniesLabel.TabIndex = 2;\n\t\t\tthis.noPlanetaryColoniesLabel.Text = \"No planetary info is available.\";\n\t\t\tthis.noPlanetaryColoniesLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n\t\t\t// \n\t\t\t// lvPlanetary\n\t\t\t// \n\t\t\tthis.lvPlanetary.BorderStyle = System.Windows.Forms.BorderStyle.None;\n\t\t\tthis.lvPlanetary.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chState,\n            this.chTTC,\n            this.chInstallation,\n            this.chCommodity,\n            this.chQuantityPerCycle,\n            this.chQuantity,\n            this.chVolume});\n\t\t\tthis.lvPlanetary.ContextMenuStrip = this.contextMenu;\n\t\t\tthis.lvPlanetary.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.lvPlanetary.FullRowSelect = true;\n\t\t\tthis.lvPlanetary.HideSelection = false;\n\t\t\tthis.lvPlanetary.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.lvPlanetary.MultiSelect = false;\n\t\t\tthis.lvPlanetary.Name = \"lvPlanetary\";\n\t\t\tthis.lvPlanetary.Size = new System.Drawing.Size(454, 434);\n\t\t\tthis.lvPlanetary.SmallImageList = this.ilIcons;\n\t\t\tthis.lvPlanetary.TabIndex = 3;\n\t\t\tthis.lvPlanetary.UseCompatibleStateImageBehavior = false;\n\t\t\tthis.lvPlanetary.View = System.Windows.Forms.View.Details;\n\t\t\t// \n\t\t\t// chState\n\t\t\t// \n\t\t\tthis.chState.Text = \"State\";\n\t\t\t// \n\t\t\t// chTTC\n\t\t\t// \n\t\t\tthis.chTTC.Text = \"TTC\";\n\t\t\tthis.chTTC.Width = 54;\n\t\t\t// \n\t\t\t// chInstallation\n\t\t\t// \n\t\t\tthis.chInstallation.Text = \"Installation\";\n\t\t\tthis.chInstallation.Width = 62;\n\t\t\t// \n\t\t\t// chCommodity\n\t\t\t// \n\t\t\tthis.chCommodity.Text = \"Commodity\";\n\t\t\tthis.chCommodity.Width = 65;\n\t\t\t// \n\t\t\t// chQuantityPerCycle\n\t\t\t// \n\t\t\tthis.chQuantityPerCycle.Text = \"Quantity / Cycle\";\n\t\t\tthis.chQuantityPerCycle.Width = 92;\n\t\t\t// \n\t\t\t// chQuantity\n\t\t\t// \n\t\t\tthis.chQuantity.Text = \"Quantity\";\n\t\t\t// \n\t\t\t// chVolume\n\t\t\t// \n\t\t\tthis.chVolume.Text = \"Volume\";\n\t\t\t// \n\t\t\t// CharacterPlanetaryList\n\t\t\t// \n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n\t\t\tthis.Controls.Add(this.lvPlanetary);\n\t\t\tthis.Controls.Add(this.noPlanetaryColoniesLabel);\n\t\t\tthis.Name = \"CharacterPlanetaryList\";\n\t\t\tthis.Size = new System.Drawing.Size(454, 434);\n\t\t\tthis.contextMenu.ResumeLayout(false);\n\t\t\tthis.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n        private System.Windows.Forms.ImageList ilIcons;\n        private System.Windows.Forms.Label noPlanetaryColoniesLabel;\n        private System.Windows.Forms.ListView lvPlanetary;\n        private System.Windows.Forms.ColumnHeader chState;\n        private System.Windows.Forms.ColumnHeader chTTC;\n        private System.Windows.Forms.ColumnHeader chInstallation;\n        private System.Windows.Forms.ColumnHeader chCommodity;\n        private System.Windows.Forms.ColumnHeader chQuantityPerCycle;\n        private System.Windows.Forms.ColumnHeader chQuantity;\n        private System.Windows.Forms.ColumnHeader chVolume;\n        private System.Windows.Forms.ToolStripMenuItem showInBrowserMenuItem;\n        private System.Windows.Forms.ToolStripSeparator showInBrowserMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem showInstallationInBrowserMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem showCommodityInBrowserMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem showPlanetInBrowserMenuItem;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterPlanetaryList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.SkillPlanner;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterPlanetaryList : UserControl, IListView\n    {\n        #region Fields\n\n        private readonly List<PlanetaryColumnSettings> m_columns = new List<PlanetaryColumnSettings>();\n        private readonly List<PlanetaryPin> m_list = new List<PlanetaryPin>();\n\n        private Timer m_refreshTimer;\n        private PlanetaryGrouping m_grouping;\n        private PlanetaryColumn m_sortCriteria;\n\n        private string m_textFilter = string.Empty;\n        private bool m_sortAscending = true;\n        private bool m_columnsChanged;\n        private bool m_isUpdatingColumns;\n        private bool m_init;\n\n        private int m_columnTTCDisplayIndex;\n\n        #endregion\n\n\n        #region Constructor\n\n        public CharacterPlanetaryList()\n        {\n            InitializeComponent();\n\n            lvPlanetary.Hide();\n            lvPlanetary.AllowColumnReorder = true;\n            lvPlanetary.Columns.Clear();\n\n            noPlanetaryColoniesLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n\n            ListViewHelper.EnableDoubleBuffer(lvPlanetary);\n\n            lvPlanetary.ColumnClick += listView_ColumnClick;\n            lvPlanetary.ColumnWidthChanged += listView_ColumnWidthChanged;\n            lvPlanetary.ColumnReordered += listView_ColumnReordered;\n            lvPlanetary.MouseDown += listView_MouseDown;\n            lvPlanetary.MouseMove += listView_MouseMove;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"lvPlanetary\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        internal bool Visibility\n        {\n            get { return lvPlanetary.Visible; }\n            set { lvPlanetary.Visible = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets the text filter.\n        /// </summary>\n        [Browsable(false)]\n        public string TextFilter\n        {\n            get { return m_textFilter; }\n            set\n            {\n                m_textFilter = value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of planetary colonies to display.\n        /// </summary>\n        internal IEnumerable<PlanetaryPin> PlanetaryPins\n        {\n            get { return m_list; }\n            set\n            {\n                m_list.Clear();\n                if (value == null)\n                    return;\n\n                m_list.AddRange(value);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping mode.\n        /// </summary>\n        [Browsable(false)]\n        public Enum Grouping\n        {\n            get { return m_grouping; }\n            set\n            {\n                m_grouping = (PlanetaryGrouping)value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the settings used for columns.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        public IEnumerable<IColumnSettings> Columns\n        {\n            get\n            {\n                // Add the visible columns; matching the display order\n                List<PlanetaryColumnSettings> newColumns = new List<PlanetaryColumnSettings>();\n                foreach (ColumnHeader header in lvPlanetary.Columns.Cast<ColumnHeader>().OrderBy(x => x.DisplayIndex))\n                {\n                    PlanetaryColumnSettings columnSetting = m_columns.First(x => x.Column == (PlanetaryColumn)header.Tag);\n                    if (columnSetting.Width > -1)\n                        columnSetting.Width = header.Width;\n\n                    newColumns.Add(columnSetting);\n                }\n\n                // Then add the other columns\n                newColumns.AddRange(m_columns.Where(x => !x.Visible));\n\n                return newColumns;\n            }\n            set\n            {\n                m_columns.Clear();\n                if (value != null)\n                    m_columns.AddRange(value.Cast<PlanetaryColumnSettings>());\n\n                // Whenever the columns changes, we need to\n                // reset the dipslay index of the TTC column\n                m_columnTTCDisplayIndex = -1;\n\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            m_refreshTimer = new Timer();\n\n            m_refreshTimer.Tick += refresh_TimerTick;\n            m_refreshTimer.Interval = 1000;\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.CharacterPlanetaryColoniesUpdated += EveMonClient_CharacterPlanetaryColoniesUpdated;\n            EveMonClient.CharacterPlanetaryLayoutUpdated += EveMonClient_CharacterPlanetaryLayoutUpdated;\n            EveMonClient.CharacterPlaneteryPinsCompleted += EveMonClient_CharacterPlaneteryPinsCompleted;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            m_refreshTimer.Dispose();\n\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.CharacterPlanetaryColoniesUpdated -= EveMonClient_CharacterPlanetaryColoniesUpdated;\n            EveMonClient.CharacterPlanetaryLayoutUpdated -= EveMonClient_CharacterPlanetaryLayoutUpdated;\n            EveMonClient.CharacterPlaneteryPinsCompleted -= EveMonClient_CharacterPlaneteryPinsCompleted;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (DesignMode || this.IsDesignModeHosted() || Character == null || !Visible)\n                return;\n\n            // Prevents the properties to call UpdateColumns() till we set all properties\n            m_init = false;\n\n            lvPlanetary.Visible = false;\n\n            PlanetaryPins = Character?.PlanetaryColonies.SelectMany(x => x.Pins);\n            Columns = Settings.UI.MainWindow.Planetary.Columns;\n            Grouping = Character?.UISettings.PlanetaryGroupBy;\n            TextFilter = string.Empty;\n\n            UpdateColumns();\n\n            m_init = true;\n\n            UpdateListVisibility();\n        }\n\n        #endregion\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Autoresizes the columns.\n        /// </summary>\n        public void AutoResizeColumns()\n        {\n            m_columns.ForEach(column =>\n            {\n                if (column.Visible)\n                    column.Width = -2;\n            });\n\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// Updates the columns.\n        /// </summary>\n        internal void UpdateColumns()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            lvPlanetary.BeginUpdate();\n            m_isUpdatingColumns = true;\n\n            try\n            {\n                lvPlanetary.Columns.Clear();\n                lvPlanetary.Groups.Clear();\n                lvPlanetary.Items.Clear();\n\n                foreach (PlanetaryColumnSettings column in m_columns.Where(x => x.Visible))\n                {\n                    ColumnHeader header = lvPlanetary.Columns.Add(column.Column.GetHeader(), column.Width);\n                    header.Tag = column.Column;\n\n                    switch (column.Column)\n                    {\n                        case PlanetaryColumn.Quantity:\n                        case PlanetaryColumn.Volume:\n                        case PlanetaryColumn.QuantityPerCycle:\n                            header.TextAlign = HorizontalAlignment.Right;\n                            break;\n                        case PlanetaryColumn.CycleTime:\n                            header.TextAlign = HorizontalAlignment.Center;\n                            break;\n                    }\n                }\n\n                // We update the content\n                UpdateContent();\n            }\n            finally\n            {\n                lvPlanetary.EndUpdate();\n                m_isUpdatingColumns = false;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            int scrollBarPosition = lvPlanetary.GetVerticalScrollBarPosition();\n\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = lvPlanetary.SelectedItems.Count > 0\n                ? lvPlanetary.SelectedItems[0].Tag.GetHashCode()\n                : 0;\n\n            lvPlanetary.BeginUpdate();\n            try\n            {\n                string text = m_textFilter.ToUpperInvariant();\n                IEnumerable<PlanetaryPin> pins = m_list.Where(x => IsTextMatching(x, text));\n\n                if (Settings.UI.MainWindow.Planetary.ShowEcuOnly)\n                    pins = pins.Where(pin => DBConstants.EcuTypeIDs.Any(id => id == pin.TypeID));\n\n                UpdateSort();\n\n                UpdateContentByGroup(pins);\n\n                // Restore the selected item (if any)\n                if (selectedItem > 0)\n                {\n                    foreach (ListViewItem lvItem in lvPlanetary.Items.Cast<ListViewItem>().Where(\n                        lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                    {\n                        lvItem.Selected = true;\n                    }\n                }\n\n                // Adjust the size of the columns\n                AdjustColumns();\n\n                UpdateListVisibility();\n            }\n            finally\n            {\n                lvPlanetary.EndUpdate();\n                lvPlanetary.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Updates the content by group.\n        /// </summary>\n        /// <param name=\"pins\">The pins.</param>\n        private void UpdateContentByGroup(IEnumerable<PlanetaryPin> pins)\n        {\n            switch (m_grouping)\n            {\n                case PlanetaryGrouping.None:\n                    UpdateNoGroupContent(pins);\n                    break;\n                case PlanetaryGrouping.SolarSystem:\n                    IOrderedEnumerable<IGrouping<string, PlanetaryPin>> groups0 =\n                        pins.GroupBy(x => x.Colony.SolarSystem.Name).OrderBy(x => x.Key);\n                    UpdateContent(groups0);\n                    break;\n                case PlanetaryGrouping.SolarSystemDesc:\n                    IOrderedEnumerable<IGrouping<string, PlanetaryPin>> groups1 =\n                        pins.GroupBy(x => x.Colony.SolarSystem.Name).OrderByDescending(x => x.Key);\n                    UpdateContent(groups1);\n                    break;\n                case PlanetaryGrouping.PlanetType:\n                    IOrderedEnumerable<IGrouping<string, PlanetaryPin>> groups2 =\n                        pins.GroupBy(x => x.Colony.PlanetTypeName).OrderBy(x => x.Key);\n                    UpdateContent(groups2);\n                    break;\n                case PlanetaryGrouping.PlanetTypeDesc:\n                    IOrderedEnumerable<IGrouping<string, PlanetaryPin>> groups3 =\n                        pins.GroupBy(x => x.Colony.PlanetTypeName).OrderByDescending(x => x.Key);\n                    UpdateContent(groups3);\n                    break;\n                case PlanetaryGrouping.Colony:\n                    IOrderedEnumerable<IGrouping<PlanetaryColony, PlanetaryPin>> groups4 =\n                        pins.GroupBy(x => x.Colony).OrderBy(x => x.Key.PlanetID);\n                    UpdateContent(groups4);\n                    break;\n                case PlanetaryGrouping.ColonyDesc:\n                    IOrderedEnumerable<IGrouping<PlanetaryColony, PlanetaryPin>> groups5 =\n                        pins.GroupBy(x => x.Colony).OrderByDescending(x => x.Key.PlanetID);\n                    UpdateContent(groups5);\n                    break;\n                case PlanetaryGrouping.EndDate:\n                    IOrderedEnumerable<IGrouping<DateTime, PlanetaryPin>> groups6 =\n                        pins.GroupBy(x => x.ExpiryTime.ToLocalTime().Date).OrderBy(x => x.Key);\n                    UpdateContent(groups6);\n                    break;\n                case PlanetaryGrouping.EndDateDesc:\n                    IOrderedEnumerable<IGrouping<DateTime, PlanetaryPin>> groups7 =\n                        pins.GroupBy(x => x.ExpiryTime.ToLocalTime().Date).OrderByDescending(x => x.Key);\n                    UpdateContent(groups7);\n                    break;\n                case PlanetaryGrouping.GroupName:\n                    IOrderedEnumerable<IGrouping<string, PlanetaryPin>> groups8 =\n                        pins.GroupBy(x => x.GroupName).OrderBy(x => x.Key);\n                    UpdateContent(groups8);\n                    break;\n                case PlanetaryGrouping.GroupNameDesc:\n                    IOrderedEnumerable<IGrouping<string, PlanetaryPin>> groups9 =\n                        pins.GroupBy(x => x.GroupName).OrderByDescending(x => x.Key);\n                    UpdateContent(groups9);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private void UpdateNoGroupContent(IEnumerable<PlanetaryPin> pins)\n        {\n            lvPlanetary.Items.Clear();\n            lvPlanetary.Groups.Clear();\n\n            // Add the items\n            lvPlanetary.Items.AddRange(pins.Select(\n                pin => new\n                {\n                    pin,\n                    item = new ListViewItem(pin.TypeName)\n                    {\n                        UseItemStyleForSubItems = false,\n                        Tag = pin\n                    }\n                }).Select(x => CreateSubItems(x.pin, x.item)).ToArray());\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        /// <typeparam name=\"TKey\"></typeparam>\n        /// <param name=\"groups\"></param>\n        private void UpdateContent<TKey>(IEnumerable<IGrouping<TKey, PlanetaryPin>> groups)\n        {\n            lvPlanetary.Items.Clear();\n            lvPlanetary.Groups.Clear();\n\n            // Add the groups\n            foreach (IGrouping<TKey, PlanetaryPin> group in groups)\n            {\n                string groupText;\n                if (group.Key is DateTime)\n                    groupText = ((DateTime)(object)group.Key).ToShortDateString();\n                else\n                {\n                    PlanetaryColony colony = group.Key as PlanetaryColony;\n                    if (colony != null)\n                    {\n                        groupText = $\"{colony.SolarSystem.Name} > {colony.PlanetName} [{colony.PlanetTypeName}] \" +\n                                    $\"(Installations: {colony.NumberOfPins}, \" +\n                                    $\"Level: {colony.UpgradeLevel}, \" +\n                                    $\"Updated: {colony.LastUpdate.ToLocalTime()})\";\n                    }\n                    else\n                        groupText = group.Key.ToString();\n                }\n\n                ListViewGroup listGroup = new ListViewGroup(groupText);\n                lvPlanetary.Groups.Add(listGroup);\n\n                // Add the items in every group\n                lvPlanetary.Items.AddRange(\n                    group.Select(pin => new\n                    {\n                        pin,\n                        item = new ListViewItem(pin.TypeName, listGroup)\n                        {\n                            UseItemStyleForSubItems = false,\n                            Tag = pin\n                        }\n\n                    }).Select(x => CreateSubItems(x.pin, x.item)).ToArray());\n            }\n        }\n\n        /// <summary>\n        /// Creates the list view sub items.\n        /// </summary>\n        /// <param name=\"pin\">The pin.</param>\n        /// <param name=\"item\">The item.</param>\n        /// <returns></returns>\n        private ListViewItem CreateSubItems(PlanetaryPin pin, ListViewItem item)\n        {\n            // Add enough subitems to match the number of columns\n            while (item.SubItems.Count < lvPlanetary.Columns.Count + 1)\n            {\n                item.SubItems.Add(string.Empty);\n            }\n\n            // Creates the subitems\n            for (int i = 0; i < lvPlanetary.Columns.Count; i++)\n            {\n                SetColumn(pin, item.SubItems[i], (PlanetaryColumn)lvPlanetary.Columns[i].Tag);\n            }\n\n            return item;\n        }\n\n        /// <summary>\n        /// Updates the list visibility.\n        /// </summary>\n        private void UpdateListVisibility()\n        {\n            // Display or hide the \"no planetary colonies\" label\n            if (!m_init)\n                return;\n\n            noPlanetaryColoniesLabel.Visible = lvPlanetary.Items.Count == 0;\n            lvPlanetary.Visible = !noPlanetaryColoniesLabel.Visible;\n            m_refreshTimer.Enabled = lvPlanetary.Visible;\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvPlanetary.Columns)\n            {\n                if (m_columns[column.Index].Width == -1)\n                    m_columns[column.Index].Width = -2;\n\n                column.Width = m_columns[column.Index].Width;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column and not set to auto-resize\n                if (column.Index != lvPlanetary.Columns.Count - 1 || m_columns[column.Index].Width != -2)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvPlanetary.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvPlanetary.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        /// <summary>\n        /// Updates the item sorter.\n        /// </summary>\n        private void UpdateSort()\n        {\n            lvPlanetary.ListViewItemSorter = new ListViewItemComparerByTag<PlanetaryPin>(\n                new PlanetaryPinComparer(m_sortCriteria, m_sortAscending));\n\n            UpdateSortVisualFeedback();\n        }\n\n        /// <summary>\n        /// Updates the sort feedback (the arrow on the header).\n        /// </summary>\n        private void UpdateSortVisualFeedback()\n        {\n            foreach (ColumnHeader columnHeader in lvPlanetary.Columns.Cast<ColumnHeader>())\n            {\n                PlanetaryColumn column = (PlanetaryColumn)columnHeader.Tag;\n                if (m_sortCriteria == column)\n                    columnHeader.ImageIndex = m_sortAscending ? 0 : 1;\n                else\n                    columnHeader.ImageIndex = 2;\n            }\n        }\n\n        /// <summary>\n        /// Updates the listview sub-item.\n        /// </summary>\n        /// <param name=\"pin\">The pin.</param>\n        /// <param name=\"item\">The item.</param>\n        /// <param name=\"column\">The column.</param>\n        /// <exception cref=\"System.NotImplementedException\"></exception>\n        private static void SetColumn(PlanetaryPin pin, ListViewItem.ListViewSubItem item, PlanetaryColumn column)\n        {\n            switch (column)\n            {\n                case PlanetaryColumn.State:\n                    item.Text = pin.State != PlanetaryPinState.None ? pin.State.GetDescription() :\n                        string.Empty;\n                    item.ForeColor = GetStateColor(pin);\n                    break;\n                case PlanetaryColumn.TTC:\n                    item.Text = pin.TTC;\n                    break;\n                case PlanetaryColumn.TypeName:\n                    item.Text = pin.TypeName;\n                    break;\n                case PlanetaryColumn.ContentTypeName:\n                    item.Text = pin.ContentTypeName;\n                    break;\n                case PlanetaryColumn.InstallTime:\n                    item.Text = pin.InstallTime == DateTime.MinValue ? string.Empty : $\"{pin.InstallTime.ToLocalTime()}\";\n                    break;\n                case PlanetaryColumn.EndTime:\n                    item.Text = pin.ExpiryTime == DateTime.MinValue ? string.Empty : $\"{pin.ExpiryTime.ToLocalTime()}\";\n                    break;\n                case PlanetaryColumn.PlanetName:\n                    item.Text = pin.Colony.PlanetName;\n                    break;\n                case PlanetaryColumn.PlanetTypeName:\n                    item.Text = pin.Colony.PlanetTypeName;\n                    break;\n                case PlanetaryColumn.SolarSystem:\n                    item.Text = pin.Colony.SolarSystem.Name;\n                    item.ForeColor = pin.Colony.SolarSystem.SecurityLevelColor;\n                    break;\n                case PlanetaryColumn.Location:\n                    item.Text = pin.Colony.FullLocation;\n                    break;\n                case PlanetaryColumn.Region:\n                    item.Text = pin.Colony.SolarSystem.Constellation.Region.Name;\n                    break;\n                case PlanetaryColumn.Quantity:\n                    item.Text = pin.ContentQuantity.ToNumericString(2);\n                    break;\n                case PlanetaryColumn.QuantityPerCycle:\n                    item.Text = pin.QuantityPerCycle.ToNumericString(2);\n                    break;\n                case PlanetaryColumn.CycleTime:\n                    item.Text = $\"{pin.CycleTime}\";\n                    break;\n                case PlanetaryColumn.Volume:\n                    item.Text = pin.ContentVolume.ToNumericString(2);\n                    break;\n                case PlanetaryColumn.LinkedTo:\n                    item.Text = string.Join(\", \", pin.LinkedTo.Select(x=> x.TypeName).Distinct());\n                    break;\n                case PlanetaryColumn.RoutedTo:\n                    item.Text = string.Join(\", \", pin.RoutedTo.Select(x => x.TypeName).Distinct());\n                    break;\n                case PlanetaryColumn.GroupName:\n                    item.Text = pin.GroupName;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Checks the given text matches the item.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if [is text matching] [the specified x]; otherwise, <c>false</c>.\n        /// </returns>\n        private static bool IsTextMatching(PlanetaryPin x, string text) => string.IsNullOrEmpty(text)\n       || x.Colony.PlanetName.ToUpperInvariant().Contains(text)\n       || x.Colony.PlanetTypeName.ToUpperInvariant().Contains(text)\n       || x.Colony.PlanetTypeName.ToUpperInvariant().Contains(text)\n       || x.Colony.SolarSystem.Name.ToUpperInvariant().Contains(text)\n       || x.Colony.SolarSystem.Constellation.Name.ToUpperInvariant().Contains(text)\n       || x.Colony.SolarSystem.Constellation.Region.Name.ToUpperInvariant().Contains(text)\n       || x.TypeName.ToUpperInvariant().Contains(text)\n       || x.ContentTypeName.ToUpperInvariant().Contains(text);\n\n        /// <summary>\n        /// Updates the time to completion.\n        /// </summary>\n        private void UpdateTimeToCompletion()\n        {\n            const int Pad = 4;\n            int columnTTCIndex = m_columns.IndexOf(m_columns.FirstOrDefault(x => x.Column == PlanetaryColumn.TTC));\n\n            foreach (ListViewItem listViewItem in lvPlanetary.Items.Cast<ListViewItem>())\n            {\n                PlanetaryPin pin = (PlanetaryPin)listViewItem.Tag;\n                if (pin.State != PlanetaryPinState.Extracting)\n                    continue;\n\n                // Update the time to completion\n                if (columnTTCIndex != -1 && m_columns[columnTTCIndex].Visible)\n                {\n                    if (m_columnTTCDisplayIndex == -1)\n                        m_columnTTCDisplayIndex = lvPlanetary.Columns[columnTTCIndex].DisplayIndex;\n\n                    listViewItem.SubItems[m_columnTTCDisplayIndex].Text = pin.TTC;\n\n                    // Using AutoResizeColumn when TTC is the first column\n                    // results to a nasty visual bug due to ListViewItem.ImageIndex placeholder\n                    if (m_columnTTCDisplayIndex == 0)\n                    {\n                        // Calculate column header text width with padding\n                        int columnHeaderWidth =\n                            TextRenderer.MeasureText(lvPlanetary.Columns[m_columnTTCDisplayIndex].Text, Font).Width + Pad * 2;\n\n                        // If there is an image assigned to the header, add its width with padding\n                        if (ilIcons.ImageSize.Width > 0)\n                            columnHeaderWidth += ilIcons.ImageSize.Width + Pad;\n\n                        int columnWidth = lvPlanetary.Items.Cast<ListViewItem>().Select(\n                            item => TextRenderer.MeasureText(item.SubItems[m_columnTTCDisplayIndex].Text, Font).Width).Concat(\n                                new[] { columnHeaderWidth }).Max() + Pad + 2;\n                        lvPlanetary.Columns[m_columnTTCDisplayIndex].Width = columnWidth;\n                    }\n                    else\n                        lvPlanetary.AutoResizeColumn(m_columnTTCDisplayIndex, ColumnHeaderAutoResizeStyle.HeaderSize);\n                }\n\n                if (pin.TTC.Length != 0)\n                    continue;\n\n                // Pin is idle\n                pin.State = PlanetaryPinState.Idle;\n                UpdateContent();\n            }\n        }\n\n        /// <summary>\n        /// Gets the color of the state.\n        /// </summary>\n        /// <param name=\"pin\">The pin.</param>\n        /// <returns></returns>\n        private static Color GetStateColor(PlanetaryPin pin)\n        {\n            switch (pin.State)\n            {\n                case PlanetaryPinState.Extracting:\n                    return Color.Green;\n                case PlanetaryPinState.Producing:\n                    return Color.Orange;\n                case PlanetaryPinState.Idle:\n                    return Color.DarkRed;\n                default:\n                    return SystemColors.GrayText;\n            }\n        }\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Exports item info to CSV format.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(lvPlanetary);\n        }\n\n        /// <summary>\n        /// Handles the Tick event of the m_timer control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void refresh_TimerTick(object sender, EventArgs e)\n        {\n            UpdateTimeToCompletion();\n        }\n\n        /// <summary>\n        /// On column reorder we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnReordered(object sender, ColumnReorderedEventArgs e)\n        {\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user manually resizes a column, we make sure to update the column preferences.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)\n        {\n            if (m_isUpdatingColumns || m_columns.Count <= e.ColumnIndex)\n                return;\n\n            if (m_columns[e.ColumnIndex].Width == lvPlanetary.Columns[e.ColumnIndex].Width)\n                return;\n\n            m_columns[e.ColumnIndex].Width = lvPlanetary.Columns[e.ColumnIndex].Width;\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user clicks a column header, we update the sorting.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            var column = (PlanetaryColumn)lvPlanetary.Columns[e.Column].Tag;\n            if (m_sortCriteria == column)\n                m_sortAscending = !m_sortAscending;\n            else\n            {\n                m_sortCriteria = column;\n                m_sortAscending = true;\n            }\n\n            m_isUpdatingColumns = true;\n\n            // Updates the item sorter\n            UpdateSort();\n\n            m_isUpdatingColumns = false;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Left)\n                return;\n\n            lvPlanetary.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvPlanetary.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the contextMenu control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CancelEventArgs\"/> instance containing the event data.</param>\n        private void contextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            bool visible = lvPlanetary.SelectedItems.Count != 0;\n            showInBrowserMenuItem.Visible = showInBrowserMenuSeparator.Visible = visible;\n            if (visible)\n            {\n                var pin = lvPlanetary.SelectedItems[0]?.Tag as PlanetaryPin;\n                showCommodityInBrowserMenuItem.Visible = pin != null && pin.ContentTypeID != 0;\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the showInBrowserMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void showInBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            var menuItem = sender as ToolStripItem;\n            var items = lvPlanetary.SelectedItems;\n\n            if (menuItem != null && items.Count > 0)\n            {\n                var pin = items[0]?.Tag as PlanetaryPin;\n\n                // showInstallationInBrowserMenuItem\n                if (menuItem == showInstallationInBrowserMenuItem)\n                {\n                    if (pin?.TypeID == null)\n                        return;\n\n                    Item installation = StaticItems.GetItemByID(pin.TypeID);\n\n                    if (installation != null)\n                        PlanWindow.ShowPlanWindow(Character).ShowItemInBrowser(installation);\n\n                    return;\n                }\n\n                // showCommodityInBrowserMenuItem\n                if (menuItem == showCommodityInBrowserMenuItem)\n                {\n                    if (pin?.ContentTypeID == null)\n                        return;\n\n                    Item commmodity = StaticItems.GetItemByID(pin.ContentTypeID);\n\n                    if (commmodity != null)\n                        PlanWindow.ShowPlanWindow(Character).ShowItemInBrowser(commmodity);\n\n                    return;\n                }\n\n\n                if (pin?.Colony?.PlanetTypeID == null)\n                    return;\n\n                Item planet = StaticItems.GetItemByID(pin.Colony.PlanetTypeID);\n\n                if (planet != null)\n                    PlanWindow.ShowPlanWindow(Character).ShowItemInBrowser(planet);\n            }\n        }\n\n        # endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// On timer tick, we update the column settings if any changes have been made to them.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Visible)\n            {\n                if (m_refreshTimer.Enabled)\n                    m_refreshTimer.Stop();\n\n                return;\n            }\n\n            // Find how many jobs are active and not ready\n            int activePins = lvPlanetary.Items.Cast<ListViewItem>().Select(\n                item => (PlanetaryPin)item.Tag).Count(pin => pin.State == PlanetaryPinState.Extracting);\n\n            // We use time dilation according to the ammount of active pins that are active,\n            // due to excess CPU usage for computing the 'time to completion' when there are too many pins\n            m_refreshTimer.Interval = 900 + 100 * activePins;\n\n            if (!m_columnsChanged)\n                return;\n\n            Settings.UI.MainWindow.Planetary.Columns.Clear();\n            Settings.UI.MainWindow.Planetary.Columns.AddRange(Columns.Cast<PlanetaryColumnSettings>());\n\n            // Recreate the columns\n            Columns = Settings.UI.MainWindow.Planetary.Columns;\n            m_columnsChanged = false;\n        }\n\n        /// <summary>\n        /// When the planetary colonies change update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterPlanetaryColoniesUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (Character == null || e.Character != Character)\n                return;\n\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// When the planetary pins change update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterPlanetaryLayoutUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (Character == null || e.Character != Character)\n                return;\n\n            PlanetaryPins = Character.PlanetaryColonies.SelectMany(x => x.Pins);\n            UpdateColumns();\n        }\n        \n        /// <summary>\n        /// Handles the PlanetaryPinsCompleted event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"PlanetaryPinsEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterPlaneteryPinsCompleted(object sender, PlanetaryPinsEventArgs e)\n        {\n            UpdateContent();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterPlanetaryList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>8, 13</value>\n  </metadata>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>132, 13</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        AAAAAk1TRnQBSQFMAgEBAwEAAfwBBwH8AQcBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABEAMAAQEBAAEQBgABCP8A/wD/AP8A/wD/AP8A/wAaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB\n        AQABAQUAAYAXAAP/AQAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAB8AEPAf4BfwL/AgAB+AEfAfwBPwL/\n        AgAB/AE/AfgBHwL/AgAB/gF/AfABDwL/AgAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAL\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterResearchPointsList.Designer.cs",
    "content": "namespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterResearchPointsList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterResearchPointsList));\n            this.noResearchPointsLabel = new System.Windows.Forms.Label();\n            this.ilIcons = new System.Windows.Forms.ImageList(this.components);\n            this.chAgentName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chSolarSystem = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chSkill = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chCurrentRP = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chPRPerDay = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.lvResearchPoints = new System.Windows.Forms.ListView();\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.showInSkillBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showObjectInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInSkillBrowserMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.contextMenu.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // noResearchPointsLabel\n            // \n            this.noResearchPointsLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noResearchPointsLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noResearchPointsLabel.Location = new System.Drawing.Point(0, 0);\n            this.noResearchPointsLabel.Name = \"noResearchPointsLabel\";\n            this.noResearchPointsLabel.Size = new System.Drawing.Size(454, 434);\n            this.noResearchPointsLabel.TabIndex = 1;\n            this.noResearchPointsLabel.Text = \"No research points are available.\";\n            this.noResearchPointsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // ilIcons\n            // \n            this.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n            this.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilIcons.Images.SetKeyName(0, \"arrow_up.png\");\n            this.ilIcons.Images.SetKeyName(1, \"arrow_down.png\");\n            this.ilIcons.Images.SetKeyName(2, \"16x16Transparant.png\");\n            // \n            // chAgentName\n            // \n            this.chAgentName.Text = \"Agent\";\n            // \n            // chSolarSystem\n            // \n            this.chSolarSystem.Text = \"System\";\n            // \n            // chSkill\n            // \n            this.chSkill.Text = \"Field\";\n            // \n            // chCurrentRP\n            // \n            this.chCurrentRP.Text = \"Current RP\";\n            // \n            // chPRPerDay\n            // \n            this.chPRPerDay.Text = \"RP/Day\";\n            // \n            // lvResearchPoints\n            // \n            this.lvResearchPoints.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lvResearchPoints.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chAgentName,\n            this.chSolarSystem,\n            this.chSkill,\n            this.chCurrentRP,\n            this.chPRPerDay});\n            this.lvResearchPoints.ContextMenuStrip = this.contextMenu;\n            this.lvResearchPoints.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvResearchPoints.FullRowSelect = true;\n            this.lvResearchPoints.HideSelection = false;\n            this.lvResearchPoints.Location = new System.Drawing.Point(0, 0);\n            this.lvResearchPoints.MultiSelect = false;\n            this.lvResearchPoints.Name = \"lvResearchPoints\";\n            this.lvResearchPoints.Size = new System.Drawing.Size(454, 434);\n            this.lvResearchPoints.SmallImageList = this.ilIcons;\n            this.lvResearchPoints.TabIndex = 0;\n            this.lvResearchPoints.UseCompatibleStateImageBehavior = false;\n            this.lvResearchPoints.View = System.Windows.Forms.View.Details;\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showInSkillBrowserMenuItem,\n            this.showObjectInBrowserMenuItem,\n            this.showInSkillBrowserMenuSeparator,\n            this.exportToCSVToolStripMenuItem});\n            this.contextMenu.Name = \"ShipPropertiesContextMenu\";\n            this.contextMenu.Size = new System.Drawing.Size(261, 98);\n            this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenu_Opening);\n            // \n            // showInSkillBrowserMenuItem\n            // \n            this.showInSkillBrowserMenuItem.Name = \"showInSkillBrowserMenuItem\";\n            this.showInSkillBrowserMenuItem.Size = new System.Drawing.Size(260, 22);\n            this.showInSkillBrowserMenuItem.Text = \"Show Field In Skill Browser...\";\n            this.showInSkillBrowserMenuItem.Click += new System.EventHandler(this.showInBrowserMenuItem_Click);\n            // \n            // showObjectInBrowserMenuItem\n            // \n            this.showObjectInBrowserMenuItem.Name = \"showObjectInBrowserMenuItem\";\n            this.showObjectInBrowserMenuItem.Size = new System.Drawing.Size(260, 22);\n            this.showObjectInBrowserMenuItem.Text = \"Show Researchable In Item Browser...\";\n            this.showObjectInBrowserMenuItem.Click += new System.EventHandler(this.showInBrowserMenuItem_Click);\n            // \n            // showInSkillBrowserMenuSeparator\n            // \n            this.showInSkillBrowserMenuSeparator.Name = \"showInSkillBrowserMenuSeparator\";\n            this.showInSkillBrowserMenuSeparator.Size = new System.Drawing.Size(257, 6);\n            // \n            // exportToCSVToolStripMenuItem\n            // \n            this.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n            this.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(260, 22);\n            this.exportToCSVToolStripMenuItem.Text = \"Export To CSV...\";\n            this.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n            // \n            // CharacterResearchPointsList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.lvResearchPoints);\n            this.Controls.Add(this.noResearchPointsLabel);\n            this.Name = \"CharacterResearchPointsList\";\n            this.Size = new System.Drawing.Size(454, 434);\n            this.contextMenu.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noResearchPointsLabel;\n        private System.Windows.Forms.ImageList ilIcons;\n        private System.Windows.Forms.ColumnHeader chAgentName;\n        private System.Windows.Forms.ColumnHeader chSolarSystem;\n        private System.Windows.Forms.ColumnHeader chSkill;\n        private System.Windows.Forms.ColumnHeader chCurrentRP;\n        private System.Windows.Forms.ColumnHeader chPRPerDay;\n        private System.Windows.Forms.ListView lvResearchPoints;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillBrowserMenuItem;\n        private System.Windows.Forms.ToolStripSeparator showInSkillBrowserMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem showObjectInBrowserMenuItem;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterResearchPointsList.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.SkillPlanner;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterResearchPointsList : UserControl, IListView\n    {\n        #region Fields\n\n        private readonly List<ResearchColumnSettings> m_columns = new List<ResearchColumnSettings>();\n        private readonly List<ResearchPoint> m_list = new List<ResearchPoint>();\n\n        private ResearchColumn m_sortCriteria;\n\n        private string m_textFilter = string.Empty;\n        private bool m_sortAscending = true;\n        private bool m_columnsChanged;\n        private bool m_isUpdatingColumns;\n        private bool m_init;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public CharacterResearchPointsList()\n        {\n            InitializeComponent();\n\n            lvResearchPoints.Hide();\n            lvResearchPoints.AllowColumnReorder = true;\n            lvResearchPoints.Columns.Clear();\n\n            noResearchPointsLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n\n            ListViewHelper.EnableDoubleBuffer(lvResearchPoints);\n\n            lvResearchPoints.ColumnClick += listView_ColumnClick;\n            lvResearchPoints.ColumnWidthChanged += listView_ColumnWidthChanged;\n            lvResearchPoints.ColumnReordered += listView_ColumnReordered;\n            lvResearchPoints.MouseDown += listView_MouseDown;\n            lvResearchPoints.MouseMove += listView_MouseMove;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        /// <summary>\n        /// Gets or sets the text filter.\n        /// </summary>\n        [Browsable(false)]\n        public string TextFilter\n        {\n            get { return m_textFilter; }\n            set\n            {\n                m_textFilter = value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of research points to display.\n        /// </summary>\n        private IEnumerable<ResearchPoint> ResearchPoints\n        {\n            get { return m_list; }\n            set\n            {\n                m_list.Clear();\n                if (value == null)\n                    return;\n\n                m_list.AddRange(value);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping of a listview.\n        /// </summary>\n        /// <value></value>\n        [Browsable(false)]\n        public Enum Grouping { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings used for columns.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        public IEnumerable<IColumnSettings> Columns\n        {\n            get\n            {\n                // Add the visible columns; matching the display order\n                List<ResearchColumnSettings> newColumns = new List<ResearchColumnSettings>();\n                foreach (ColumnHeader header in lvResearchPoints.Columns.Cast<ColumnHeader>().OrderBy(x => x.DisplayIndex))\n                {\n                    ResearchColumnSettings columnSetting = m_columns.First(x => x.Column == (ResearchColumn)header.Tag);\n                    if (columnSetting.Width > -1)\n                        columnSetting.Width = header.Width;\n\n                    newColumns.Add(columnSetting);\n                }\n\n                // Then add the other columns\n                newColumns.AddRange(m_columns.Where(x => !x.Visible));\n\n                return newColumns;\n            }\n            set\n            {\n                m_columns.Clear();\n                if (value != null)\n                    m_columns.AddRange(value.Cast<ResearchColumnSettings>());\n\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        #endregion\n\n\n        # region Inherited Events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.ConquerableStationListUpdated += EveMonClient_ConquerableStationListUpdated;\n            EveMonClient.CharacterResearchPointsUpdated += EveMonClient_CharacterResearchPointsUpdated;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.ConquerableStationListUpdated -= EveMonClient_ConquerableStationListUpdated;\n            EveMonClient.CharacterResearchPointsUpdated -= EveMonClient_CharacterResearchPointsUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (DesignMode || this.IsDesignModeHosted() || Character == null || !Visible)\n                return;\n\n            // Prevents the properties to call UpdateColumns() till we set all properties\n            m_init = false;\n\n            lvResearchPoints.Visible = false;\n\n            ResearchPoints = Character?.ResearchPoints;\n            Columns = Settings.UI.MainWindow.Research.Columns;\n            TextFilter = string.Empty;\n\n            UpdateColumns();\n\n            m_init = true;\n\n            UpdateListVisibility();\n        }\n\n        # endregion\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Autoresizes the columns.\n        /// </summary>\n        public void AutoResizeColumns()\n        {\n            m_columns.ForEach(column =>\n            {\n                if (column.Visible)\n                    column.Width = -2;\n            });\n\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// Updates the columns.\n        /// </summary>\n        private void UpdateColumns()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            lvResearchPoints.BeginUpdate();\n            m_isUpdatingColumns = true;\n\n            try\n            {\n                lvResearchPoints.Columns.Clear();\n                lvResearchPoints.Groups.Clear();\n                lvResearchPoints.Items.Clear();\n\n                foreach (ResearchColumnSettings column in m_columns.Where(x => x.Visible))\n                {\n                    ColumnHeader header = lvResearchPoints.Columns.Add(column.Column.GetHeader(), column.Width);\n                    header.Tag = column.Column;\n\n                    switch (column.Column)\n                    {\n                        case ResearchColumn.CurrentRP:\n                        case ResearchColumn.PointsPerDay:\n                            header.TextAlign = HorizontalAlignment.Right;\n                            break;\n                        case ResearchColumn.Level:\n                            header.TextAlign = HorizontalAlignment.Center;\n                            break;\n                    }\n                }\n\n                // We update the content\n                UpdateContent();\n            }\n            finally\n            {\n                lvResearchPoints.EndUpdate();\n                m_isUpdatingColumns = false;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            int scrollBarPosition = lvResearchPoints.GetVerticalScrollBarPosition();\n\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = lvResearchPoints.SelectedItems.Count > 0 ?\n                lvResearchPoints.SelectedItems[0].Tag.GetHashCode() : 0;\n\n            lvResearchPoints.BeginUpdate();\n            try\n            {\n                IEnumerable<ResearchPoint> researchPoints = m_list.Where(x => !string.\n                    IsNullOrEmpty(x.AgentName) && !string.IsNullOrEmpty(x.Field) &&\n                    x.Station != null).Where(x => IsTextMatching(x, m_textFilter));\n\n                UpdateSort();\n\n                lvResearchPoints.Items.Clear();\n\n                // Add the items\n                lvResearchPoints.Items.AddRange(researchPoints.Select(researchPoint => new\n                {\n                    researchPoint,\n                    item = new ListViewItem(researchPoint.AgentName)\n                    {\n                        UseItemStyleForSubItems = false,\n                        Tag = researchPoint\n                    }\n                }).Select(x => CreateSubItems(x.researchPoint, x.item)).ToArray());\n\n                // Restore the selected item (if any)\n                if (selectedItem > 0)\n                {\n                    foreach (ListViewItem lvItem in lvResearchPoints.Items.Cast<ListViewItem>().Where(\n                        lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                    {\n                        lvItem.Selected = true;\n                    }\n                }\n\n                // Adjust the size of the columns\n                AdjustColumns();\n\n                UpdateListVisibility();\n            }\n            finally\n            {\n                lvResearchPoints.EndUpdate();\n                lvResearchPoints.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Creates the list view sub items.\n        /// </summary>\n        /// <param name=\"researchPoint\">The research point.</param>\n        /// <param name=\"item\">The item.</param>\n        private ListViewItem CreateSubItems(ResearchPoint researchPoint, ListViewItem item)\n        {\n            // Add enough subitems to match the number of columns\n            while (item.SubItems.Count < lvResearchPoints.Columns.Count + 1)\n            {\n                item.SubItems.Add(string.Empty);\n            }\n\n            // Creates the subitems\n            for (int i = 0; i < lvResearchPoints.Columns.Count; i++)\n            {\n                SetColumn(researchPoint, item.SubItems[i], (ResearchColumn)lvResearchPoints.Columns[i].Tag);\n            }\n\n            return item;\n        }\n\n        /// <summary>\n        /// Updates the list visibility.\n        /// </summary>\n        private void UpdateListVisibility()\n        {\n            // Display or hide the \"no research points\" label\n            if (!m_init)\n                return;\n\n            noResearchPointsLabel.Visible = lvResearchPoints.Items.Count == 0;\n            lvResearchPoints.Visible = !noResearchPointsLabel.Visible;\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvResearchPoints.Columns)\n            {\n                if (m_columns[column.Index].Width == -1)\n                    m_columns[column.Index].Width = -2;\n\n                column.Width = m_columns[column.Index].Width;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column and not set to auto-resize\n                if (column.Index != lvResearchPoints.Columns.Count - 1 || m_columns[column.Index].Width != -2)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvResearchPoints.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvResearchPoints.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        /// <summary>\n        /// Updates the item sorter.\n        /// </summary>\n        private void UpdateSort()\n        {\n            lvResearchPoints.ListViewItemSorter = new ListViewItemComparerByTag<ResearchPoint>(\n                new ResearchPointComparer(m_sortCriteria, m_sortAscending));\n\n            UpdateSortVisualFeedback();\n        }\n\n        /// <summary>\n        /// Updates the sort feedback (the arrow on the header).\n        /// </summary>\n        private void UpdateSortVisualFeedback()\n        {\n            foreach (ColumnHeader columnHeader in lvResearchPoints.Columns.Cast<ColumnHeader>())\n            {\n                ResearchColumn column = (ResearchColumn)columnHeader.Tag;\n                if (m_sortCriteria == column)\n                    columnHeader.ImageIndex = m_sortAscending ? 0 : 1;\n                else\n                    columnHeader.ImageIndex = 2;\n            }\n        }\n\n        /// <summary>\n        /// Updates the listview sub-item.\n        /// </summary>\n        /// <param name=\"researchPoint\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"column\"></param>\n        private static void SetColumn(ResearchPoint researchPoint, ListViewItem.ListViewSubItem item, ResearchColumn column)\n        {\n            var station = researchPoint.Station;\n            switch (column)\n            {\n            case ResearchColumn.Agent:\n                item.Text = researchPoint.AgentName;\n                break;\n            case ResearchColumn.Level:\n                item.Text = researchPoint.AgentLevel.ToString(CultureConstants.DefaultCulture);\n                break;\n            case ResearchColumn.Field:\n                item.Text = researchPoint.Field;\n                break;\n            case ResearchColumn.CurrentRP:\n                item.Text = researchPoint.CurrentRP.ToNumericString(2);\n                break;\n            case ResearchColumn.PointsPerDay:\n                item.Text = researchPoint.PointsPerDay.ToNumericString(2);\n                break;\n            case ResearchColumn.StartDate:\n                item.Text = researchPoint.StartDate.ToLocalTime().ToString(\"G\");\n                break;\n            case ResearchColumn.Location:\n                item.Text = station.FullLocation;\n                break;\n            case ResearchColumn.Region:\n                item.Text = station.SolarSystemChecked.Constellation.Region.Name;\n                break;\n            case ResearchColumn.SolarSystem:\n                item.Text = station.SolarSystem?.Name ?? EveMonConstants.UnknownText;\n                item.ForeColor = station.SolarSystemChecked.SecurityLevelColor;\n                break;\n            case ResearchColumn.Station:\n                item.Text = station.Name;\n                break;\n            case ResearchColumn.Quality:\n                break;\n            default:\n                throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Checks the given text matches the item.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if [is text matching] [the specified x]; otherwise, <c>false</c>.\n        /// </returns>\n        private static bool IsTextMatching(ResearchPoint x, string text) => string.IsNullOrEmpty(text)\n            || x.AgentName.ToUpperInvariant().Contains(text, ignoreCase: true)\n            || x.Field.ToUpperInvariant().Contains(text, ignoreCase: true)\n            || x.Station.Name.ToUpperInvariant().Contains(text, ignoreCase: true)\n            || x.Station.SolarSystemChecked.Name.ToUpperInvariant().Contains(text, ignoreCase: true)\n            || x.Station.SolarSystemChecked.Constellation.Name.ToUpperInvariant().Contains(text, ignoreCase: true)\n            || x.Station.SolarSystemChecked.Constellation.Region.Name.ToUpperInvariant().Contains(text, ignoreCase: true);\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Exports item info to CSV format.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(lvResearchPoints);\n        }\n\n        /// <summary>\n        /// On column reorder we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnReordered(object sender, ColumnReorderedEventArgs e)\n        {\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user manually resizes a column, we make sure to update the column preferences.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)\n        {\n            if (m_isUpdatingColumns || m_columns.Count <= e.ColumnIndex)\n                return;\n\n            if (m_columns[e.ColumnIndex].Width == lvResearchPoints.Columns[e.ColumnIndex].Width)\n                return;\n\n            m_columns[e.ColumnIndex].Width = lvResearchPoints.Columns[e.ColumnIndex].Width;\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user clicks a column header, we update the sorting.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            ResearchColumn column = (ResearchColumn)lvResearchPoints.Columns[e.Column].Tag;\n            if (m_sortCriteria == column)\n                m_sortAscending = !m_sortAscending;\n            else\n            {\n                m_sortCriteria = column;\n                m_sortAscending = true;\n            }\n\n            m_isUpdatingColumns = true;\n\n            // Updates the item sorter\n            UpdateSort();\n\n            m_isUpdatingColumns = false;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Left)\n                return;\n\n            lvResearchPoints.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvResearchPoints.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the contextMenu control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CancelEventArgs\"/> instance containing the event data.</param>\n        private void contextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            showInSkillBrowserMenuItem.Visible =\n                showObjectInBrowserMenuItem.Visible =\n                    showInSkillBrowserMenuSeparator.Visible = lvResearchPoints.SelectedItems.Count != 0;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the showInBrowserMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void showInBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            ToolStripItem menuItem = sender as ToolStripItem;\n\n            if (menuItem == null)\n                return;\n\n            ResearchPoint researchPoint = lvResearchPoints.SelectedItems[0]?.Tag as ResearchPoint;\n\n            // showInSkillBrowserMenuItem\n            if (menuItem == showInSkillBrowserMenuItem)\n            {\n                if (researchPoint?.Field == null)\n                    return;\n\n                Skill skill = Character.Skills[researchPoint.Skill.ID];\n\n                if (skill != Skill.UnknownSkill)\n                    PlanWindow.ShowPlanWindow(Character).ShowSkillInBrowser(skill);\n\n                return;\n            }\n\n            if (researchPoint?.ResearchedItem == null)\n                return;\n\n            PlanWindow.ShowPlanWindow(Character).ShowItemInBrowser(researchPoint?.ResearchedItem);\n        }\n\n        # endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// On timer tick, we update the column settings if any changes have been made to them.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Visible || !m_columnsChanged)\n                return;\n\n            Settings.UI.MainWindow.Research.Columns.Clear();\n            Settings.UI.MainWindow.Research.Columns.AddRange(Columns.Cast<ResearchColumnSettings>());\n\n            // Recreate the columns\n            Columns = Settings.UI.MainWindow.Research.Columns;\n            m_columnsChanged = false;\n        }\n\n        /// <summary>\n        /// When the research points change update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterResearchPointsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (Character == null || e.Character != Character)\n                return;\n\n            ResearchPoints = Character.ResearchPoints;\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// When Conquerable Station List updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_ConquerableStationListUpdated(object sender, EventArgs e)\n        {\n            if (Character == null)\n                return;\n\n            foreach (ResearchPoint researchPoint in m_list)\n            {\n                researchPoint.UpdateStation();\n            }\n\n            UpdateColumns();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterResearchPointsList.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        AAAAAk1TRnQBSQFMAgEBAwEAAewBBwHsAQcBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABEAMAAQEBAAEQBgABCP8A/wD/AP8A/wD/AP8A/wAaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB\n        AQABAQUAAYAXAAP/AQAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAB8AEPAf4BfwL/AgAB+AEfAfwBPwL/\n        AgAB/AE/AfgBHwL/AgAB/gF/AfABDwL/AgAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAL\n</value>\n  </data>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>103, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterSkillsList.Designer.cs",
    "content": "﻿using EVEMon.Common.Controls;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterSkillsList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterSkillsList));\n            this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.showInSkillExplorerMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.tsmiAddSkill = new System.Windows.Forms.ToolStripMenuItem();\n            this.ttToolTip = new System.Windows.Forms.ToolTip(this.components);\n            this.noSkillsLabel = new System.Windows.Forms.Label();\n            this.lbSkills = new EVEMon.Common.Controls.NoFlickerListBox();\n            this.showInSkillBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.contextMenuStrip.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // contextMenuStrip\n            // \n            this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showInSkillBrowserMenuItem,\n            this.showInSkillExplorerMenuItem,\n            this.showInMenuSeparator,\n            this.tsmiAddSkill});\n            this.contextMenuStrip.Name = \"contextMenuStrip\";\n            this.contextMenuStrip.Size = new System.Drawing.Size(195, 98);\n            this.contextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip_Opening);\n            // \n            // showInSkillExplorerMenuItem\n            // \n            this.showInSkillExplorerMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"showInSkillExplorerMenuItem.Image\")));\n            this.showInSkillExplorerMenuItem.Name = \"showInSkillExplorerMenuItem\";\n            this.showInSkillExplorerMenuItem.Size = new System.Drawing.Size(194, 22);\n            this.showInSkillExplorerMenuItem.Text = \"Show In Skill &Explorer...\";\n            this.showInSkillExplorerMenuItem.Click += new System.EventHandler(this.showInSkillExplorerMenuItem_Click);\n            // \n            // showInMenuSeparator\n            // \n            this.showInMenuSeparator.Name = \"showInMenuSeparator\";\n            this.showInMenuSeparator.Size = new System.Drawing.Size(191, 6);\n            // \n            // tsmiAddSkill\n            // \n            this.tsmiAddSkill.Name = \"tsmiAddSkill\";\n            this.tsmiAddSkill.Size = new System.Drawing.Size(194, 22);\n            this.tsmiAddSkill.Text = \"Add skill\";\n            // \n            // ttToolTip\n            // \n            this.ttToolTip.AutoPopDelay = 32000;\n            this.ttToolTip.InitialDelay = 500;\n            this.ttToolTip.IsBalloon = true;\n            this.ttToolTip.ReshowDelay = 100;\n            // \n            // noSkillsLabel\n            // \n            this.noSkillsLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n            this.noSkillsLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noSkillsLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noSkillsLabel.Location = new System.Drawing.Point(0, 0);\n            this.noSkillsLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.noSkillsLabel.Name = \"noSkillsLabel\";\n            this.noSkillsLabel.Size = new System.Drawing.Size(287, 320);\n            this.noSkillsLabel.TabIndex = 4;\n            this.noSkillsLabel.Text = \"Skills information not available.\";\n            this.noSkillsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lbSkills\n            // \n            this.lbSkills.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lbSkills.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbSkills.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;\n            this.lbSkills.FormattingEnabled = true;\n            this.lbSkills.IntegralHeight = false;\n            this.lbSkills.ItemHeight = 15;\n            this.lbSkills.Location = new System.Drawing.Point(0, 0);\n            this.lbSkills.Margin = new System.Windows.Forms.Padding(0);\n            this.lbSkills.Name = \"lbSkills\";\n            this.lbSkills.Size = new System.Drawing.Size(287, 320);\n            this.lbSkills.TabIndex = 0;\n            this.lbSkills.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.lbSkills_DrawItem);\n            this.lbSkills.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.lbSkills_MeasureItem);\n            this.lbSkills.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbSkills_MouseDown);\n            this.lbSkills.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lbSkills_MouseMove);\n            this.lbSkills.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.lbSkills_MouseWheel);\n            // \n            // showInSkillBrowserMenuItem\n            // \n            this.showInSkillBrowserMenuItem.Name = \"showInSkillBrowserMenuItem\";\n            this.showInSkillBrowserMenuItem.Size = new System.Drawing.Size(194, 22);\n            this.showInSkillBrowserMenuItem.Text = \"Show In Skill &Browser...\";\n            this.showInSkillBrowserMenuItem.Click += new System.EventHandler(this.showInSkillBrowserMenuItem_Click);\n            // \n            // CharacterSkillsList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.noSkillsLabel);\n            this.Controls.Add(this.lbSkills);\n            this.Name = \"CharacterSkillsList\";\n            this.Size = new System.Drawing.Size(287, 320);\n            this.contextMenuStrip.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n        #endregion\n\n        private NoFlickerListBox lbSkills;\n        private System.Windows.Forms.ToolTip ttToolTip;\n        private System.Windows.Forms.ContextMenuStrip contextMenuStrip;\n        private System.Windows.Forms.Label noSkillsLabel;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillExplorerMenuItem;\n        private System.Windows.Forms.ToolStripSeparator showInMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem tsmiAddSkill;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillBrowserMenuItem;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterSkillsList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Properties;\nusing EVEMon.SkillPlanner;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterSkillsList : UserControl\n    {\n        #region Fields\n\n        private const TextFormatFlags Format = TextFormatFlags.NoPadding | TextFormatFlags.NoClipping;\n        private const byte SkillsSummaryTextWidth = 75;\n        private const byte SkillGroupTotalSPTextWidth = 100;\n\n        // Skills drawing - Region & text padding\n        private const byte PadTop = 2;\n        private const byte PadLeft = 6;\n        private const byte PadRight = 7;\n\n        // Skills drawing - Boxes\n        private const byte BoxWidth = 57;\n        private const byte BoxHeight = 14;\n        private const byte LowerBoxHeight = 8;\n        private const byte BoxHPad = 6;\n        private const byte BoxVPad = 2;\n        private const byte SkillDetailHeight = 31;\n\n        // Skills drawing - Skills groups\n        private const byte SkillHeaderHeight = 21;\n        private const byte CollapserPadRight = 4;\n\n        // Skills drawing - Font & brushes\n        private readonly Font m_skillsFont;\n        private readonly Font m_boldSkillsFont;\n\n        private object m_lastTooltipItem;\n        private BlinkAction m_blinkAction;\n\n        private int m_maxGroupNameWidth;\n        private Skill m_selectedSkill;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        public CharacterSkillsList()\n        {\n            InitializeComponent();\n\n            lbSkills.Visible = false;\n\n            m_skillsFont = FontFactory.GetFont(\"Tahoma\", 8.25F);\n            m_boldSkillsFont = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            noSkillsLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal Character Character { get; set; }\n\n        #endregion\n\n\n        #region Inherited events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.CharacterUpdated += EveMonClient_CharacterUpdated;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterUpdated -= EveMonClient_CharacterUpdated;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (Visible)\n                UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Content Management\n\n        /// <summary>\n        /// Updates all the content.\n        /// </summary>\n        /// <remarks>\n        /// Another high-complexity method for us to look at.\n        /// </remarks>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            // When no character, we just hide the list\n            if (Character == null)\n            {\n                noSkillsLabel.Visible = true;\n                lbSkills.Visible = false;\n                return;\n            }\n\n            int scrollBarPosition = lbSkills.TopIndex;\n\n            // Update the skills list\n            lbSkills.BeginUpdate();\n            try\n            {\n                IList<Skill> skills = GetCharacterSkills().ToList();\n                IOrderedEnumerable<IGrouping<SkillGroup, Skill>> groups =\n                    skills.GroupBy(x => x.Group).OrderBy(x => x.Key.Name);\n\n                m_maxGroupNameWidth = groups.Select(\n                    group => TextRenderer.MeasureText(@group.Key.Name, m_boldSkillsFont, Size.Empty, Format)).Select(\n                        groupNameSize => groupNameSize.Width).Concat(new[] { 0 }).Max();\n\n                // Scroll through groups\n                lbSkills.Items.Clear();\n                foreach (IGrouping<SkillGroup, Skill> group in groups)\n                {\n                    lbSkills.Items.Add(group.Key);\n\n                    // Add items in the group when it's not collapsed\n                    if (Character.UISettings.CollapsedGroups.Contains(group.Key.Name))\n                        continue;\n\n                    foreach (Skill skill in group.OrderBy(x => x.Name))\n                    {\n                        lbSkills.Items.Add(skill);\n                    }\n                }\n\n                // Display or hide the \"no skills\" label.\n                noSkillsLabel.Visible = !skills.Any();\n                lbSkills.Visible = skills.Any();\n\n                // Invalidate display\n                lbSkills.Invalidate();\n            }\n            finally\n            {\n                lbSkills.EndUpdate();\n                lbSkills.TopIndex = scrollBarPosition;\n            }\n        }\n\n        /// <summary>\n        /// Gets a characters skills, filtered by MainWindow settings\n        /// </summary>\n        /// <returns>\n        /// IEnumerable of <see cref=\"Skill\"/> Skill.\n        /// </returns>\n        private IEnumerable<Skill> GetCharacterSkills()\n        {\n            if (Settings.UI.MainWindow.ShowPrereqMetSkills)\n                return Character.Skills.Where(x => x.IsKnown || (x.ArePrerequisitesMet && x.IsPublic));\n\n            if (Settings.UI.MainWindow.ShowNonPublicSkills)\n                return Character.Skills;\n\n            return Settings.UI.MainWindow.ShowAllPublicSkills\n                       ? Character.Skills.Where(x => x.IsKnown || x.IsPublic)\n                       : Character.Skills.Where(x => x.IsKnown);\n        }\n\n        #endregion\n\n\n        #region Drawing\n\n        /// <summary>\n        /// Handles the DrawItem event of the lbSkills control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void lbSkills_DrawItem(object sender, DrawItemEventArgs e)\n        {\n            if (e.Index < 0 || e.Index >= lbSkills.Items.Count)\n                return;\n\n            object item = lbSkills.Items[e.Index];\n            SkillGroup skillGroup = item as SkillGroup;\n            if (skillGroup != null)\n                DrawItem(skillGroup, e);\n            else\n                DrawItem((Skill)item, e);\n        }\n\n        /// <summary>\n        /// Handles the MeasureItem event of the lbSkills control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MeasureItemEventArgs\"/> instance containing the event data.</param>\n        private void lbSkills_MeasureItem(object sender, MeasureItemEventArgs e)\n        {\n            if (e.Index < 0)\n                return;\n            e.ItemHeight = GetItemHeight(lbSkills.Items[e.Index]);\n        }\n\n        /// <summary>\n        /// Gets the item's height.\n        /// </summary>\n        /// <param name=\"item\">The item.</param>\n        /// <returns></returns>\n        private int GetItemHeight(object item)\n        {\n            if (item is SkillGroup)\n                return SkillHeaderHeight;\n\n            return Math.Max(m_skillsFont.Height * 2 + PadTop * 2, SkillDetailHeight);\n        }\n\n        /// <summary>\n        /// Draws the list item for the given skill\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"e\"></param>\n        private void DrawItem(Skill skill, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Draw background\n            DrawBackground(skill, e);\n\n            // Measure texts\n            long skillPointsToNextLevel = skill.StaticData.GetPointsRequiredForLevel(Math.Min(skill.Level + 1, 5));\n\n            string rankText = $\" (Rank {skill.Rank})\";\n            string spText = $\"SP: {skill.SkillPoints:N0}/{skillPointsToNextLevel:N0}\";\n            string levelText = $\"Level {skill.Level}\";\n            string pctText = $\"{Math.Floor(skill.PercentCompleted)}% Done\";\n\n            Size skillNameSize = TextRenderer.MeasureText(g, skill.Name, m_boldSkillsFont, Size.Empty, Format);\n            Size rankTextSize = TextRenderer.MeasureText(g, rankText, m_skillsFont, Size.Empty, Format);\n            Size levelTextSize = TextRenderer.MeasureText(g, levelText, m_skillsFont, Size.Empty, Format);\n            Size spTextSize = TextRenderer.MeasureText(g, spText, m_skillsFont, Size.Empty, Format);\n            Size pctTextSize = TextRenderer.MeasureText(g, pctText, m_skillsFont, Size.Empty, Format);\n\n\n            // Draw texts\n            Color highlightColor = Color.Black;\n            if (!skill.IsKnown)\n                highlightColor = Color.Red;\n\n            if (!skill.IsPublic)\n                highlightColor = Color.DarkRed;\n\n            if (skill.ArePrerequisitesMet && skill.IsPublic && !skill.IsKnown)\n                highlightColor = Color.SlateGray;\n\n            if (Settings.UI.MainWindow.HighlightPartialSkills && skill.IsPartiallyTrained && !skill.IsTraining)\n                highlightColor = Color.Green;\n\n            if (Settings.UI.MainWindow.HighlightQueuedSkills && skill.IsQueued && !skill.IsTraining)\n                highlightColor = Color.RoyalBlue;\n\n            TextRenderer.DrawText(g, skill.Name, m_boldSkillsFont,\n                                  new Rectangle(\n                                      e.Bounds.Left + PadLeft,\n                                      e.Bounds.Top + PadTop,\n                                      skillNameSize.Width + PadLeft,\n                                      skillNameSize.Height), highlightColor);\n\n            TextRenderer.DrawText(g, rankText, m_skillsFont,\n                                  new Rectangle(\n                                      e.Bounds.Left + PadLeft + skillNameSize.Width,\n                                      e.Bounds.Top + PadTop,\n                                      rankTextSize.Width + PadLeft,\n                                      rankTextSize.Height), highlightColor);\n\n            TextRenderer.DrawText(g, spText, m_skillsFont,\n                                  new Rectangle(\n                                      e.Bounds.Left + PadLeft,\n                                      e.Bounds.Top + PadTop + skillNameSize.Height,\n                                      spTextSize.Width + PadLeft,\n                                      spTextSize.Height), highlightColor);\n\n            // Boxes\n            DrawBoxes(skill, e);\n\n            // Draw progression bar\n            DrawProgressionBar(skill, e);\n\n\n            // Draw level and percent texts\n            TextRenderer.DrawText(g, levelText, m_skillsFont,\n                                  new Rectangle(\n                                      e.Bounds.Right - BoxWidth - PadRight - BoxHPad - levelTextSize.Width,\n                                      e.Bounds.Top + PadTop, levelTextSize.Width + PadRight,\n                                      levelTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, pctText, m_skillsFont,\n                                  new Rectangle(\n                                      e.Bounds.Right - BoxWidth - PadRight - BoxHPad - pctTextSize.Width,\n                                      e.Bounds.Top + PadTop + levelTextSize.Height,\n                                      pctTextSize.Width + PadRight, pctTextSize.Height), Color.Black);\n        }\n\n        /// <summary>\n        /// Draws the background.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private static void DrawBackground(Skill skill, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            if (skill.IsTraining)\n            {\n                // In training\n                g.FillRectangle(Brushes.LightSteelBlue, e.Bounds);\n            }\n            else if (e.Index % 2 == 0)\n            {\n                // Not in training - odd\n                g.FillRectangle(Brushes.White, e.Bounds);\n            }\n            else\n            {\n                // Not in training - even\n                g.FillRectangle(Brushes.LightGray, e.Bounds);\n            }\n        }\n\n        /// <summary>\n        /// Draws the progression bar.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private static void DrawProgressionBar(Skill skill, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            g.DrawRectangle(Pens.Black, new Rectangle(e.Bounds.Right - BoxWidth - PadRight,\n                                                      e.Bounds.Top + PadTop + BoxHeight + BoxVPad,\n                                                      BoxWidth, LowerBoxHeight));\n\n            Rectangle pctBarRect = new Rectangle(e.Bounds.Right - BoxWidth - PadRight + 2,\n                                                 e.Bounds.Top + PadTop + BoxHeight + BoxVPad + 2,\n                                                 BoxWidth - 3, LowerBoxHeight - 3);\n\n            g.FillRectangle(Brushes.DarkGray, pctBarRect);\n            int fillWidth = (int)(pctBarRect.Width * skill.FractionCompleted);\n            if (fillWidth <= 0)\n                return;\n\n            Rectangle fillRect = new Rectangle(pctBarRect.X, pctBarRect.Y, fillWidth, pctBarRect.Height);\n            g.FillRectangle(Brushes.Black, fillRect);\n        }\n\n        /// <summary>\n        /// Draws the boxes.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void DrawBoxes(Skill skill, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n            bool isAlpha = skill.Character.EffectiveCharacterStatus.IsAlpha();\n\n            g.DrawRectangle(Pens.Black, new Rectangle(e.Bounds.Right - BoxWidth - PadRight,\n                e.Bounds.Top + PadTop, BoxWidth, BoxHeight));\n\n            const int levelBoxWidth = (BoxWidth - 4 - 3) / 5, levelBoxHeight = BoxHeight - 3;\n            int square = Math.Min(levelBoxWidth, levelBoxHeight);\n            for (int level = 1; level <= 5; level++)\n            {\n                Brush fillBrush = Brushes.DarkGray;\n                int alphaPad = 0, w, h;\n                if (isAlpha && level > skill.StaticData.AlphaLimit)\n                {\n                    // Draw smaller gold square to indicate this level cannot be trained\n                    fillBrush = Brushes.DarkGoldenrod;\n                    alphaPad = 2;\n                }\n                if (level <= skill.Level)\n                {\n                    // Trained\n                    if (alphaPad > 0)\n                        // And inactive\n                        alphaPad = 0;\n                    else\n                        fillBrush = Brushes.Black;\n                }\n\n                // If the box is denoting an untrainable level, make it square\n                if (alphaPad > 0)\n                    w = h = square - 2 * alphaPad;\n                else\n                {\n                    w = levelBoxWidth;\n                    h = levelBoxHeight;\n                }\n\n                // Determine proper spacing to center it in the frame\n                var brect = new Rectangle(e.Bounds.Right - BoxWidth - PadRight + 2 +\n                    (levelBoxWidth + 1) * (level - 1) + (levelBoxWidth - w) / 2,\n                    e.Bounds.Top + PadTop + 2 + (levelBoxHeight - h) / 2, w, h);\n\n                // Color indicator for a queued level or one which is training now\n                var ccpCharacter = Character as CCPCharacter;\n                if (ccpCharacter != null)\n                {\n                    var skillQueue = ccpCharacter.SkillQueue;\n                    // X || (!X && Y) == X || Y\n                    if (skillQueue.Any(qskill => skill == qskill.Skill && level == qskill.\n                        Level && (!skill.IsTraining || level > skill.Level + 1)))\n                    {\n                        fillBrush = Brushes.RoyalBlue;\n                    }\n                }\n\n                // Blink indicator of skill levels which are in training\n                if (skill.IsTraining && level == skill.Level + 1)\n                {\n                    if (m_blinkAction == BlinkAction.Blink)\n                        fillBrush = Brushes.RoyalBlue;\n                    m_blinkAction = (m_blinkAction == BlinkAction.Reset) ? BlinkAction.Blink :\n                        BlinkAction.Stop;\n                }\n\n                g.FillRectangle(fillBrush, brect);\n            }\n        }\n\n        /// <summary>\n        /// Draws the list item for the given skill group.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void DrawItem(SkillGroup group, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Draws the background\n            using (Brush brush = Settings.UI.SafeForWork\n                                     ? new SolidBrush(Color.FromArgb(75, 75, 75))\n                                     : (Brush)new LinearGradientBrush(new PointF(0F, 0F), new PointF(0F, SkillHeaderHeight),\n                                                                      Color.FromArgb(75, 75, 75), Color.FromArgb(25, 25, 25)))\n            {\n                g.FillRectangle(brush, e.Bounds);\n            }\n\n            using (Pen pen = new Pen(Color.FromArgb(100, 100, 100)))\n            {\n                g.DrawLine(pen, e.Bounds.Left, e.Bounds.Top, e.Bounds.Right + 1, e.Bounds.Top);\n            }\n\n            // Measure Texts\n            string skillInTrainingSuffix = string.Empty;\n            string skillsInQueueSuffix = string.Empty;\n            bool hasTrainingSkill = group.Any(x => x.IsTraining);\n            bool hasQueuedSkill = group.Any(x => x.IsQueued && !x.IsTraining);\n            if (hasTrainingSkill)\n                skillInTrainingSuffix = \"( 1 in training )\";\n            if (hasQueuedSkill)\n            {\n                skillsInQueueSuffix = $\"( {group.Count(x => x.IsQueued && !x.IsTraining)} in queue )\";\n            }\n\n            string skillsSummaryText = $\"{group.Count(x => x.IsKnown)} of {group.Count(x => x.IsPublic)} skills\";\n\n            string skillsTotalSPText = $\"{group.TotalSP:N0} Points\";\n\n            Rectangle skillGroupNameTextRect = new Rectangle(e.Bounds.Left + PadLeft,\n                                                             e.Bounds.Top + e.Bounds.Height / 2 - lbSkills.ItemHeight / 2,\n                                                             m_maxGroupNameWidth + PadLeft / 2,\n                                                             lbSkills.ItemHeight);\n\n            int skillsSummaryTextWidth = (int)(SkillsSummaryTextWidth * (g.DpiX / EveMonConstants.DefaultDpi));\n            Rectangle skillsSummaryTextRect = new Rectangle(\n                skillGroupNameTextRect.X + m_maxGroupNameWidth + PadLeft / 2, skillGroupNameTextRect.Y,\n                skillsSummaryTextWidth + PadLeft / 2, lbSkills.ItemHeight);\n\n            int skillGroupTotalSPTextWidth = (int)(SkillGroupTotalSPTextWidth * (g.DpiX / EveMonConstants.DefaultDpi));\n            Rectangle skillsTotalSPTextRect = new Rectangle(\n                skillsSummaryTextRect.X + skillsSummaryTextWidth + PadLeft / 2, skillGroupNameTextRect.Y,\n                skillGroupTotalSPTextWidth + PadLeft / 2, lbSkills.ItemHeight);\n\n            Size skillInTrainingSuffixSize = TextRenderer.MeasureText(g, skillInTrainingSuffix, m_skillsFont, Size.Empty);\n            Rectangle skillInTrainingSuffixRect = new Rectangle(\n                skillsTotalSPTextRect.X + skillGroupTotalSPTextWidth + PadLeft / 2, skillGroupNameTextRect.Y,\n                skillInTrainingSuffixSize.Width, lbSkills.ItemHeight);\n\n            Size skillQueueTextSize = TextRenderer.MeasureText(g, skillsInQueueSuffix, m_skillsFont, Size.Empty);\n            Rectangle skillQueueRect = new Rectangle(\n                skillInTrainingSuffixRect.X + skillInTrainingSuffixSize.Width, skillInTrainingSuffixRect.Y,\n                skillQueueTextSize.Width, lbSkills.ItemHeight);\n\n            // Draw the header\n            TextRenderer.DrawText(g, group.Name, m_boldSkillsFont, skillGroupNameTextRect, Color.White, Format);\n            TextRenderer.DrawText(g, skillsSummaryText, m_skillsFont, skillsSummaryTextRect, Color.White,\n                                  Format | TextFormatFlags.Right);\n            TextRenderer.DrawText(g, skillsTotalSPText, m_skillsFont, skillsTotalSPTextRect, Color.White,\n                                  Format | TextFormatFlags.Right);\n            TextRenderer.DrawText(g, skillInTrainingSuffix, m_skillsFont, skillInTrainingSuffixRect, Color.White,\n                                  Format | TextFormatFlags.Right);\n            TextRenderer.DrawText(g, skillsInQueueSuffix, m_skillsFont, skillQueueRect, Settings.UI.SafeForWork\n                ? Color.White\n                : Color.Yellow,\n                                  Format | TextFormatFlags.Right);\n\n            // Draws the collapsing arrows\n            bool isCollapsed = Character.UISettings.CollapsedGroups.Contains(group.Name);\n            Image image = isCollapsed ? Resources.Expand : Resources.Collapse;\n\n            g.DrawImageUnscaled(image, new Point(e.Bounds.Right - image.Width - CollapserPadRight,\n                                                 SkillHeaderHeight / 2 - image.Height / 2 + e.Bounds.Top));\n        }\n\n        /// <summary>\n        /// Gets the preferred size from the preferred size of the list.\n        /// </summary>\n        /// <param name=\"proposedSize\"></param>\n        /// <returns></returns>\n        public override Size GetPreferredSize(Size proposedSize) => lbSkills.GetPreferredSize(proposedSize);\n\n        #endregion\n\n\n        #region Toggle / expand\n\n        /// <summary>\n        /// Toggles all the skill groups to collapse or open.\n        /// </summary>\n        public void ToggleAll()\n        {\n            // When at least one group collapsed, expand all\n            if (Character.UISettings.CollapsedGroups.Count != 0)\n                Character.UISettings.CollapsedGroups.Clear();\n                // When none collapsed, collapse all\n            else\n            {\n                foreach (SkillGroup group in Character.SkillGroups)\n                {\n                    Character.UISettings.CollapsedGroups.Add(group.Name);\n                }\n            }\n\n            // Update the list\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Toggles the expansion or collapsing of a single group\n        /// </summary>\n        /// <param name=\"group\">The group to expand or collapse.</param>\n        private void ToggleGroupExpandCollapse(SkillGroup group)\n        {\n            if (Character.UISettings.CollapsedGroups.Contains(group.Name))\n                ExpandSkillGroup(group);\n            else\n                CollapseSkillGroup(group);\n        }\n\n        /// <summary>\n        /// Expand a skill group\n        /// </summary>\n        /// <param name=\"group\">Skill group in lbSkills</param>\n        private void ExpandSkillGroup(SkillGroup group)\n        {\n            Character.UISettings.CollapsedGroups.Remove(group.Name);\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Collapse a skill group\n        /// </summary>\n        /// <param name=\"group\">Skill group in lbSkills</param>\n        private void CollapseSkillGroup(SkillGroup group)\n        {\n            Character.UISettings.CollapsedGroups.Add(group.Name);\n            UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Local events\n\n        /// <summary>\n        /// Handles the MouseWheel event of the lbSkills control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbSkills_MouseWheel(object sender, MouseEventArgs e)\n        {\n            if (!lbSkills.VerticalScrollBarVisible())\n                return;\n            if (e.Delta == 0)\n                return;\n\n            // Update the drawing based upon the mouse wheel scrolling\n            int numberOfItemLinesToMove = e.Delta * SystemInformation.MouseWheelScrollLines / Math.Abs(e.Delta);\n            int lines = numberOfItemLinesToMove;\n            if (lines == 0)\n                return;\n\n            // Quit if at the top and requesting an up movement\n            if (lines > 0 && lbSkills.GetVerticalScrollBarPosition() == 0)\n                return;\n\n            // Compute the number of lines to move\n            int direction = lines / Math.Abs(lines);\n            int[] numberOfPixelsToMove = new int[lines * direction];\n            for (int i = 1; i <= Math.Abs(lines); i++)\n            {\n                object item = null;\n\n                // Going up\n                if (direction == Math.Abs(direction))\n                {\n                    // Retrieve the next top item\n                    if (lbSkills.TopIndex - i >= 0)\n                        item = lbSkills.Items[lbSkills.TopIndex - i];\n                }\n                    // Going down\n                else\n                {\n                    // Compute the height of the items from current the topindex (included)\n                    int height = 0;\n                    for (int j = lbSkills.TopIndex + i - 1; j < lbSkills.Items.Count; j++)\n                    {\n                        height += GetItemHeight(lbSkills.Items[j]);\n                    }\n\n                    // Retrieve the next bottom item\n                    if (height > lbSkills.ClientSize.Height)\n                        item = lbSkills.Items[lbSkills.TopIndex + i - 1];\n                }\n\n                // If found a new item as top or bottom\n                if (item != null)\n                    numberOfPixelsToMove[i - 1] = GetItemHeight(item) * direction;\n                else\n                    lines -= direction;\n            }\n\n            // Scroll \n            if (lines != 0)\n                lbSkills.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the lbSkills control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbSkills_MouseDown(object sender, MouseEventArgs e)\n        {\n            // Retrieve the item at the given point and quit if none\n            int index = lbSkills.IndexFromPoint(e.Location);\n            if (index < 0 || index >= lbSkills.Items.Count)\n                return;\n\n            // Beware, this last index may actually means a click in the whitespace at the bottom\n            // Let's deal with this special case\n            if (index == lbSkills.Items.Count - 1)\n            {\n                Rectangle itemRect = lbSkills.GetItemRectangle(index);\n                if (!itemRect.Contains(e.Location))\n                    return;\n            }\n\n            // For a skill group, we have to handle the collapse/expand mechanism and the tooltip\n            object item = lbSkills.Items[index];\n            SkillGroup skillGroup = item as SkillGroup;\n            if (skillGroup != null)\n            {\n                // Left button : expand/collapse\n                if (e.Button != MouseButtons.Right)\n                {\n                    ToggleGroupExpandCollapse(skillGroup);\n                    return;\n                }\n\n                // If right click on the button, still expand/collapse\n                Rectangle itemRect = lbSkills.GetItemRectangle(lbSkills.Items.IndexOf(item));\n                Rectangle buttonRect = GetButtonRectangle(skillGroup, itemRect);\n                if (buttonRect.Contains(e.Location))\n                {\n                    ToggleGroupExpandCollapse(skillGroup);\n                    return;\n                }\n                return;\n            }\n\n            // Right click for skills below lv5 : we display a context menu to plan higher levels\n            Skill skill = (Skill)item;\n            if (e.Button == MouseButtons.Right)\n            {\n                lbSkills.Cursor = Cursors.Default;\n\n                // Set the selected skill\n                m_selectedSkill = skill;\n\n                // Display the context menu\n                contextMenuStrip.Show(lbSkills, e.Location);\n            }\n        }\n\n        /// <summary>\n        /// On mouse move, we show the tooltip.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbSkills_MouseMove(object sender, MouseEventArgs e)\n        {\n            for (int i = 0; i < lbSkills.Items.Count; i++)\n            {\n                // Skip until we found the mouse location\n                Rectangle rect = lbSkills.GetItemRectangle(i);\n                if (!rect.Contains(e.Location))\n                    continue;\n\n                object item = lbSkills.Items[i];\n                lbSkills.Cursor = item is Skill ? CustomCursors.ContextMenu : Cursors.Default;\n\n                // Updates the tooltip\n                DisplayTooltip(item);\n                return;\n            }\n\n            // If we went so far, we're not over anything\n            m_lastTooltipItem = null;\n            ttToolTip.Active = false;\n            lbSkills.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the contextMenuStrip control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void contextMenuStrip_Opening(object sender, CancelEventArgs e)\n        {\n            e.Cancel = !Character.Skills.Any();\n\n            if (e.Cancel)\n                return;\n\n            BuildContextMenu(m_selectedSkill);\n\n            showInSkillExplorerMenuItem.Visible = m_selectedSkill != null;\n                showInMenuSeparator.Visible =\n                    tsmiAddSkill.Visible = m_selectedSkill != null && m_selectedSkill.Level < 5;\n        }\n\n        /// <summary>\n        /// Builds the context menu for the selected skill.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        private void BuildContextMenu(Skill skill)\n        {\n            tsmiAddSkill.DropDownItems.Clear();\n\n            if (skill == null || skill.Level == 5)\n            {\n                tsmiAddSkill.Text = string.Empty;\n                return;\n            }\n            \n            // Reset the menu\n            tsmiAddSkill.Text = $\"Add {skill.Name}\";\n\n            // Build the level options\n            for (long level = skill.Level + 1; level <= 5; level++)\n            {\n                ToolStripMenuItem tempMenuLevel = null;\n                try\n                {\n                    tempMenuLevel = new ToolStripMenuItem($\"Level {Skill.GetRomanFromInt(level)} to\");\n\n                    Character.Plans.AddTo(tempMenuLevel.DropDownItems,\n                        (menuPlanItem, plan) =>\n                        {\n                            menuPlanItem.Click += menuPlanItem_Click;\n                            menuPlanItem.Tag = new KeyValuePair<Plan, SkillLevel>(plan, new SkillLevel(skill, level));\n                        });\n\n                    ToolStripMenuItem menuLevel = tempMenuLevel;\n                    tempMenuLevel = null;\n\n                    tsmiAddSkill.DropDownItems.Add(menuLevel);\n                }\n                finally\n                {\n                    tempMenuLevel?.Dispose();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Displays the tooltip for the given item (skill or skillgroup).\n        /// </summary>\n        /// <param name=\"item\"></param>\n        private void DisplayTooltip(object item)\n        {\n            if (ttToolTip.Active && m_lastTooltipItem != null && m_lastTooltipItem == item)\n                return;\n\n            m_lastTooltipItem = item;\n\n            ttToolTip.Active = false;\n            SkillGroup skillGroup = item as SkillGroup;\n            ttToolTip.SetToolTip(lbSkills, skillGroup != null ? GetTooltip(skillGroup) : GetTooltip((Skill)item));\n            ttToolTip.Active = true;\n        }\n\n        /// <summary>\n        /// Gets the tooltip text for the given skill\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        private static string GetTooltip(Skill skill)\n        {\n            long sp = skill.SkillPoints;\n            long nextLevel = Math.Min(5, skill.Level + 1);\n            long nextLevelSP = skill.StaticData.GetPointsRequiredForLevel(nextLevel);\n            long pointsLeft = skill.GetLeftPointsRequiredToLevel(nextLevel);\n            string remainingTimeText = skill.GetLeftTrainingTimeToLevel(nextLevel)\n                .ToDescriptiveText(DescriptiveTextOptions.IncludeCommas | DescriptiveTextOptions.UppercaseText);\n\n            if (sp < skill.StaticData.GetPointsRequiredForLevel(1))\n            {\n                // Training hasn't got past level 1 yet\n                StringBuilder untrainedToolTip = new StringBuilder();\n                untrainedToolTip\n                    .Append($\"Not yet trained to Level I ({Math.Floor(skill.PercentCompleted)}%)\")\n                    .AppendLine()\n                    .Append($\"Next level I: {pointsLeft:N0} skill points remaining\")\n                    .AppendLine()\n                    .Append($\"Training time remaining: {remainingTimeText}\")\n                    .AppendLine();\n\n                AddSkillBoilerPlate(untrainedToolTip, skill);\n\n                return untrainedToolTip.ToString();\n            }\n\n            // So, it's a left click on a skill, we display the tool tip\n            // Partially trained skill ?\n            if (skill.IsPartiallyTrained)\n            {\n                StringBuilder partiallyTrainedToolTip = new StringBuilder();\n                partiallyTrainedToolTip\n                    .Append($\"Partially Completed ({Math.Floor(skill.PercentCompleted)}%)\")\n                    .AppendLine()\n                    .Append($\"Training to level {Skill.GetRomanFromInt(nextLevel)}: {pointsLeft:N0} skill points remaining\")\n                    .AppendLine()\n                    .Append($\"Training time remaining: {remainingTimeText}\")\n                    .AppendLine();\n\n                AddSkillBoilerPlate(partiallyTrainedToolTip, skill);\n\n                return partiallyTrainedToolTip.ToString();\n            }\n\n            // We've completed all the skill points for the current level\n            if (!skill.IsPartiallyTrained)\n            {\n                if (skill.Level != 5)\n                {\n                    StringBuilder levelCompleteToolTip = new StringBuilder();\n                    levelCompleteToolTip\n                        .Append($\"Completed Level {Skill.GetRomanFromInt(skill.Level)}: {sp:N0}/{nextLevelSP:N0}\")\n                        .AppendLine()\n                        .Append($\"Next level {Skill.GetRomanFromInt(nextLevel)}: {pointsLeft:N0} skill points required\")\n                        .AppendLine()\n                        .Append($\"Training Time: {remainingTimeText}\")\n                        .AppendLine();\n\n                    AddSkillBoilerPlate(levelCompleteToolTip, skill);\n\n                    return levelCompleteToolTip.ToString();\n                }\n\n                // Lv 5 completed\n                StringBuilder lv5ToolTip = new StringBuilder();\n                lv5ToolTip\n                    .Append($\"Level V Complete: {sp:N0}/{nextLevelSP:N0}\")\n                    .AppendLine()\n                    .AppendLine(\"No further training required\");\n\n                AddSkillBoilerPlate(lv5ToolTip, skill);\n\n                return lv5ToolTip.ToString();\n            }\n\n            // Error in calculating SkillPoints\n            StringBuilder calculationErrorToolTip = new StringBuilder();\n            calculationErrorToolTip\n                .AppendLine(\"Partially Trained (Could not cacluate all skill details)\")\n                .Append($\"Next level {nextLevel}: {pointsLeft:N0} skill points remaining\")\n                .AppendLine()\n                .Append($\"Training time remaining: {remainingTimeText}\")\n                .AppendLine();\n\n            AddSkillBoilerPlate(calculationErrorToolTip, skill);\n\n            return calculationErrorToolTip.ToString();\n        }\n\n        /// <summary>\n        /// Adds the skill boiler plate.\n        /// </summary>\n        /// <param name=\"toolTip\">The tool tip.</param>\n        /// <param name=\"skill\">The skill.</param>\n        private static void AddSkillBoilerPlate(StringBuilder toolTip, Skill skill)\n        {\n            toolTip\n                .AppendLine()\n                .AppendLine(skill.Description.WordWrap(100))\n                .Append($\"Primary: {skill.PrimaryAttribute}, \")\n                .Append($\"Secondary: {skill.SecondaryAttribute} \")\n                .Append($\"({skill.SkillPointsPerHour:N0} SP/hour)\");\n        }\n\n        /// <summary>\n        /// Gets the tooltip content for the given skill group\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <returns></returns>\n        private static string GetTooltip(SkillGroup group)\n        {\n            // Maximas are computed on public skills only\n            long totalValidSP = group.Where(x => x.IsPublic).Sum(x => x.SkillPoints);\n            long maxSP = group.Where(x => x.IsPublic).Sum(x => x.StaticData.GetPointsRequiredForLevel(5));\n            int maxKnown = group.Count(x => x.IsPublic);\n\n            // Current achievements are computed on every skill, including non-public\n            long totalSP = group.Sum(x => x.SkillPoints);\n            int known = group.Count(x => x.IsKnown);\n\n            // The group has been completed !\n            if (totalValidSP >= maxSP)\n            {\n                return $\"Skill Group completed: {totalSP:N0}/{maxSP:N0} (100%){Environment.NewLine}\" +\n                       $\"Skills: {known}/{maxKnown} (100%)\";\n            }\n\n            // If the group is not completed yet\n            double percentDonePoints = 1.0 * Math.Min(totalSP, maxSP) / maxSP;\n            double percentDoneSkills = 1.0 * Math.Min(known, maxKnown) / maxKnown;\n\n            return $\"Points Completed: {totalSP:N0} of {maxSP:N0} ({percentDonePoints:P1}){Environment.NewLine}\" +\n                   $\"Skills Known: {known} of {maxKnown} ({percentDoneSkills:P0})\";\n        }\n\n        /// <summary>\n        /// Gets the rectangle for the collapse/expand button.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <param name=\"itemRect\">The item rect.</param>\n        /// <returns></returns>\n        private Rectangle GetButtonRectangle(SkillGroup group, Rectangle itemRect)\n        {\n            // Checks whether this group is collapsed\n            bool isCollapsed = Character.UISettings.CollapsedGroups.Contains(group.Name);\n\n            // Get the image for this state\n            Image btnImage = isCollapsed ? Resources.Expand : Resources.Collapse;\n\n            // Compute the top left point\n            Point btnPoint = new Point(itemRect.Right - btnImage.Width - CollapserPadRight,\n                                       SkillHeaderHeight / 2 - btnImage.Height / 2 + itemRect.Top);\n\n            return new Rectangle(btnPoint, btnImage.Size);\n        }\n\n        /// <summary>\n        /// Handler for a plan item click on the plan's context menu.\n        /// Add a skill to the plan.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private static void menuPlanItem_Click(object sender, EventArgs e)\n        {\n            ToolStripMenuItem planItem = (ToolStripMenuItem)sender;\n            KeyValuePair<Plan, SkillLevel> tag = (KeyValuePair<Plan, SkillLevel>)planItem.Tag;\n\n            IPlanOperation operation = tag.Key.TryPlanTo(tag.Value.Skill, tag.Value.Level);\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = PlanWindow.ShowPlanWindow(plan: operation.Plan);\n            if (planWindow == null)\n                return;\n\n            PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow, operation);\n        }\n\n        /// <summary>\n        /// Shows the selected skill in Skill Browser.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInSkillBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            // Open the skill browser\n            PlanWindow.ShowPlanWindow(Character).ShowSkillInBrowser(m_selectedSkill);\n        }\n\n        /// <summary>\n        /// Shows the selected skill in Skill Explorer.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInSkillExplorerMenuItem_Click(object sender, EventArgs e)\n        {\n            // Open the skill explorer\n            SkillExplorerWindow.ShowSkillExplorerWindow(Character).ShowSkillInExplorer(m_selectedSkill);\n        }\n\n        #endregion\n\n\n        #region Global events\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Character.IsTraining || !Visible)\n                return;\n\n            if (m_blinkAction == BlinkAction.Stop)\n                m_blinkAction = BlinkAction.Reset;\n        }\n\n        /// <summary>\n        /// When the character changed, we refresh the content\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the settings changed, we refresh the content (show all public skills, non-public skills, etc)\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterSkillsList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"contextMenuStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>113, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"showInSkillExplorerMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABh0RVh0U29m\n        dHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAAk9JREFUOE+Vkm1P0mEYxd3c+hi8cmsrDTV1VJoaJlqE\n        TygmjYCEcGACKqAiOIKUJ0WRINNQJJ/LLB9mK0oFKmO6yGbrO/heN7cT0b9NhlL93t27zn12XTsn6X+Q\n        +YUdzUFRMvH8O/yF2mThEpvUsMohSd7ySE1r9WG5X+gmxolhT1Ywb89V74mXuLj3uh5y3130hQwwhbSI\n        mNgJ2fFUjVxLYY0zDizB+xj76oJ3ZxhTu27Mfvfg2Q9vxKQL8oDQRMjjKXPR3KoVKYa2B/Dky0N4dh5h\n        4tsIpndHMbM7BuOmBtJ1gZ6Qx0Lrzc+9Pkg9HNg0wRHqhWKlEZyZanCf16BrTQF9oA3iN1wbIf9NTls6\n        LmqycFlP2a9y0tH8qhG2TSMk8/WoHqVbbz4tP/VLx5tnhQWLdcPRT0fJbE1D5zsltO/bYNjQwBjUoWO1\n        BXRH0SohicKZZar4L1jxMZKlZ9Dua4Xap4RuXY1uvxaqZSlK+wtjDOomKjo4c8x4g1TJaZBlZ3FecW6/\n        1EyFeE6AnoAOfC87YnLFynAWR0+o8dwIR+JN3IMsJTmXos481G90RjcRTHJAtxeB4SqG7KUILcsSsKcq\n        E/cgW0V288bZ6A50wfxBD9unHgx+tsC1ZcPjbTsUy424NV15cg8ymlNTslXpB7IFcfQUy0dDNBVHyArn\n        Vh/kiw2o9ZYd34M/ZLakMSPx7lEf5IFmKQS9/yqa5kUQz95B+VBJbA9OIhJvck57BumSNpuUb6CQqKbc\n        cImtIL4H/0qB4YKqyJx3JMakpJ/GeCksDt4euAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <metadata name=\"ttToolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterSkillsQueueList.Designer.cs",
    "content": "﻿using EVEMon.Common.Controls;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterSkillsQueueList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterSkillsQueueList));\n            this.noSkillsQueueLabel = new System.Windows.Forms.Label();\n            this.ttToolTip = new System.Windows.Forms.ToolTip(this.components);\n            this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.showInSkillExplorerMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.tsmiAddSkill = new System.Windows.Forms.ToolStripMenuItem();\n            this.addSkillSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.tsmiCreatePlanFromSkillQueue = new System.Windows.Forms.ToolStripMenuItem();\n            this.lbSkillsQueue = new EVEMon.Common.Controls.NoFlickerListBox();\n            this.showInSkillBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.contextMenuStrip.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // noSkillsQueueLabel\n            // \n            this.noSkillsQueueLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n            this.noSkillsQueueLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noSkillsQueueLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noSkillsQueueLabel.Location = new System.Drawing.Point(0, 0);\n            this.noSkillsQueueLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.noSkillsQueueLabel.Name = \"noSkillsQueueLabel\";\n            this.noSkillsQueueLabel.Size = new System.Drawing.Size(287, 320);\n            this.noSkillsQueueLabel.TabIndex = 0;\n            this.noSkillsQueueLabel.Text = \"Skills Queue information not available.\";\n            this.noSkillsQueueLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // ttToolTip\n            // \n            this.ttToolTip.AutoPopDelay = 10000;\n            this.ttToolTip.InitialDelay = 500;\n            this.ttToolTip.IsBalloon = true;\n            this.ttToolTip.ReshowDelay = 100;\n            // \n            // contextMenuStrip\n            // \n            this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showInSkillBrowserMenuItem,\n            this.showInSkillExplorerMenuItem,\n            this.showInMenuSeparator,\n            this.tsmiAddSkill,\n            this.addSkillSeparator,\n            this.tsmiCreatePlanFromSkillQueue});\n            this.contextMenuStrip.Name = \"contextMenuStrip\";\n            this.contextMenuStrip.Size = new System.Drawing.Size(235, 126);\n            this.contextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip_Opening);\n            // \n            // showInSkillExplorerMenuItem\n            // \n            this.showInSkillExplorerMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"showInSkillExplorerMenuItem.Image\")));\n            this.showInSkillExplorerMenuItem.Name = \"showInSkillExplorerMenuItem\";\n            this.showInSkillExplorerMenuItem.Size = new System.Drawing.Size(234, 22);\n            this.showInSkillExplorerMenuItem.Text = \"Show In Skill &Explorer...\";\n            this.showInSkillExplorerMenuItem.Click += new System.EventHandler(this.showInSkillExplorerMenuItem_Click);\n            // \n            // showInMenuSeparator\n            // \n            this.showInMenuSeparator.Name = \"showInMenuSeparator\";\n            this.showInMenuSeparator.Size = new System.Drawing.Size(231, 6);\n            // \n            // tsmiAddSkill\n            // \n            this.tsmiAddSkill.Name = \"tsmiAddSkill\";\n            this.tsmiAddSkill.Size = new System.Drawing.Size(234, 22);\n            this.tsmiAddSkill.Text = \"Add skill\";\n            // \n            // addSkillSeparator\n            // \n            this.addSkillSeparator.Name = \"addSkillSeparator\";\n            this.addSkillSeparator.Size = new System.Drawing.Size(231, 6);\n            // \n            // tsmiCreatePlanFromSkillQueue\n            // \n            this.tsmiCreatePlanFromSkillQueue.Image = ((System.Drawing.Image)(resources.GetObject(\"tsmiCreatePlanFromSkillQueue.Image\")));\n            this.tsmiCreatePlanFromSkillQueue.Name = \"tsmiCreatePlanFromSkillQueue\";\n            this.tsmiCreatePlanFromSkillQueue.Size = new System.Drawing.Size(234, 22);\n            this.tsmiCreatePlanFromSkillQueue.Text = \"Create Plan from Skill Queue...\";\n            this.tsmiCreatePlanFromSkillQueue.Click += new System.EventHandler(this.tsmiCreatePlanFromSkillQueue_Click);\n            // \n            // lbSkillsQueue\n            // \n            this.lbSkillsQueue.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lbSkillsQueue.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbSkillsQueue.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;\n            this.lbSkillsQueue.FormattingEnabled = true;\n            this.lbSkillsQueue.IntegralHeight = false;\n            this.lbSkillsQueue.ItemHeight = 15;\n            this.lbSkillsQueue.Location = new System.Drawing.Point(0, 0);\n            this.lbSkillsQueue.Margin = new System.Windows.Forms.Padding(0);\n            this.lbSkillsQueue.Name = \"lbSkillsQueue\";\n            this.lbSkillsQueue.Size = new System.Drawing.Size(287, 320);\n            this.lbSkillsQueue.TabIndex = 0;\n            this.lbSkillsQueue.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.lbSkillsQueue_DrawItem);\n            this.lbSkillsQueue.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.lbSkillsQueue_MeasureItem);\n            this.lbSkillsQueue.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbSkillsQueue_MouseDown);\n            this.lbSkillsQueue.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lbSkillsQueue_MouseMove);\n            this.lbSkillsQueue.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.lbSkillsQueue_MouseWheel);\n            // \n            // showInSkillBrowserMenuItem\n            // \n            this.showInSkillBrowserMenuItem.Name = \"showInSkillBrowserMenuItem\";\n            this.showInSkillBrowserMenuItem.Size = new System.Drawing.Size(234, 22);\n            this.showInSkillBrowserMenuItem.Text = \"Show In Skill Browser...\";\n            this.showInSkillBrowserMenuItem.Click += new System.EventHandler(this.showInSkillBrowserMenuItem_Click);\n            // \n            // CharacterSkillsQueueList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.noSkillsQueueLabel);\n            this.Controls.Add(this.lbSkillsQueue);\n            this.Name = \"CharacterSkillsQueueList\";\n            this.Size = new System.Drawing.Size(287, 320);\n            this.contextMenuStrip.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noSkillsQueueLabel;\n        private System.Windows.Forms.ToolTip ttToolTip;\n        private NoFlickerListBox lbSkillsQueue;\n        private System.Windows.Forms.ContextMenuStrip contextMenuStrip;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillExplorerMenuItem;\n        private System.Windows.Forms.ToolStripSeparator showInMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem tsmiAddSkill;\n        private System.Windows.Forms.ToolStripSeparator addSkillSeparator;\n        private System.Windows.Forms.ToolStripMenuItem tsmiCreatePlanFromSkillQueue;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillBrowserMenuItem;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterSkillsQueueList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.SkillPlanner;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterSkillsQueueList : UserControl\n    {\n        #region Fields\n\n        // Skills drawing - Region & text padding\n        private const int PadTop = 2;\n        private const int PadLeft = 6;\n        private const int PadRight = 7;\n\n        // Skills drawing - Boxes\n        private const int BoxWidth = 57;\n        private const int BoxHeight = 14;\n        private const int LowerBoxHeight = 8;\n        private const int BoxHPad = 6;\n        private const int BoxVPad = 2;\n        private const int MinimumHeight = 39;\n\n        // Skills drawing - Font & brushes\n        private readonly Font m_boldSkillsQueueFont;\n        private readonly Font m_skillsQueueFont;\n\n        private object m_lastTooltipItem;\n        private BlinkAction m_blinkAction;\n        private QueuedSkill m_selectedSkill;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public CharacterSkillsQueueList()\n        {\n            InitializeComponent();\n\n            lbSkillsQueue.Hide();\n\n            m_skillsQueueFont = FontFactory.GetFont(\"Tahoma\", 8.25F);\n            m_boldSkillsQueueFont = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            noSkillsQueueLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        /// <summary>\n        /// Gets the item's height.\n        /// </summary>\n        private int GetItemHeight => Math.Max(m_skillsQueueFont.Height * 2 + PadTop * 2 + LowerBoxHeight, MinimumHeight);\n\n        #endregion\n\n\n        #region Inherited events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.CharacterSkillQueueUpdated += EveMonClient_CharacterSkillQueueUpdated;\n            EveMonClient.QueuedSkillsCompleted += EveMonClient_QueuedSkillsCompleted;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterSkillQueueUpdated -= EveMonClient_CharacterSkillQueueUpdated;\n            EveMonClient.QueuedSkillsCompleted -= EveMonClient_QueuedSkillsCompleted;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (Visible)\n                UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Display update\n\n        /// <summary>\n        /// Updates all the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            // When no character, we just hide the list\n            if (Character == null)\n            {\n                noSkillsQueueLabel.Visible = true;\n                lbSkillsQueue.Visible = false;\n                return;\n            }\n\n            int scrollBarPosition = lbSkillsQueue.TopIndex;\n\n            // Update the skills queue list\n            lbSkillsQueue.BeginUpdate();\n            try\n            {\n                // Add items in the list\n                lbSkillsQueue.Items.Clear();\n                foreach (QueuedSkill skill in Character.SkillQueue)\n                {\n                    lbSkillsQueue.Items.Add(skill);\n                }\n\n                // Display or hide the \"no queue skills\" label.\n                noSkillsQueueLabel.Visible = !Character.SkillQueue.Any();\n                lbSkillsQueue.Visible = !noSkillsQueueLabel.Visible;\n\n                // Invalidate display\n                lbSkillsQueue.Invalidate();\n            }\n            finally\n            {\n                lbSkillsQueue.EndUpdate();\n                lbSkillsQueue.TopIndex = scrollBarPosition;\n            }\n        }\n\n        #endregion\n\n\n        #region Drawing\n\n        /// <summary>\n        /// Handles the DrawItem event of the lbSkillsQueue control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void lbSkillsQueue_DrawItem(object sender, DrawItemEventArgs e)\n        {\n            if (e.Index < 0 || e.Index >= lbSkillsQueue.Items.Count)\n                return;\n\n            QueuedSkill item = lbSkillsQueue.Items[e.Index] as QueuedSkill;\n\n            if (item == null)\n                return;\n\n            DrawItem(item, e);\n        }\n\n        /// <summary>\n        /// Handles the MeasureItem event of the lbSkillsQueue control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MeasureItemEventArgs\"/> instance containing the event data.</param>\n        private void lbSkillsQueue_MeasureItem(object sender, MeasureItemEventArgs e)\n        {\n            if (e.Index < 0)\n                return;\n\n            e.ItemHeight = GetItemHeight;\n        }\n\n        /// <summary>\n        /// Draws the list item for the given skill\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"e\"></param>\n        private void DrawItem(QueuedSkill skill, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Draw background\n            g.FillRectangle(e.Index % 2 == 0 ? Brushes.LightGray : Brushes.White, e.Bounds);\n            \n            // Measure texts\n            const TextFormatFlags Format = TextFormatFlags.NoPadding | TextFormatFlags.NoClipping;\n            bool hasSkill = (skill.Skill != null) && (skill.Skill != Skill.UnknownSkill);\n\n            long skillPoints = (skill.Skill != null) && (skill.Level > skill.Skill.Level + 1) ?\n                skill.CurrentSP : (!hasSkill ? skill.StartSP : skill.Skill.SkillPoints);\n            long skillPointsToNextLevel = !hasSkill ? skill.EndSP :\n                skill.Skill.StaticData.GetPointsRequiredForLevel(Math.Min(skill.Level, 5));\n            long pointsLeft = skillPointsToNextLevel - skillPoints;\n            TimeSpan timeSpanFromPoints = !hasSkill ? skill.EndTime.Subtract(DateTime.UtcNow) :\n                skill.Skill.GetTimeSpanForPoints(pointsLeft);\n            string remainingTimeText = timeSpanFromPoints.ToDescriptiveText(\n                DescriptiveTextOptions.SpaceBetween);\n\n            double fractionCompleted = e.Index == 0 ? skill.FractionCompleted : 0.0;\n\n            string indexText = $\"{e.Index + 1}. \";\n            string rankText = $\" (Rank {(skill.Skill == null ? 0 : skill.Rank)})\";\n            string spPerHourText = $\" SP/Hour: {skill.SkillPointsPerHour}\";\n            string spText = $\"SP: {skillPoints:N0}/{skillPointsToNextLevel:N0}\";\n            string trainingTimeText = $\" Training Time: {remainingTimeText}\";\n            string levelText = $\"Level {skill.Level}\";\n            string percentText = $\"{Math.Floor(fractionCompleted * 100) / 100:P0} Done\";\n\n            Size indexTextSize = TextRenderer.MeasureText(g, indexText, m_boldSkillsQueueFont, Size.Empty, Format);\n            Size skillNameSize = TextRenderer.MeasureText(g, skill.SkillName, m_boldSkillsQueueFont, Size.Empty, Format);\n            Size rankTextSize = TextRenderer.MeasureText(g, rankText, m_skillsQueueFont, Size.Empty, Format);\n            Size levelTextSize = TextRenderer.MeasureText(g, levelText, m_skillsQueueFont, Size.Empty, Format);\n            Size spPerHourTextSize = TextRenderer.MeasureText(g, spPerHourText, m_skillsQueueFont, Size.Empty, Format);\n            Size spTextSize = TextRenderer.MeasureText(g, spText, m_skillsQueueFont, Size.Empty, Format);\n            Size ttTextSize = TextRenderer.MeasureText(g, trainingTimeText, m_skillsQueueFont, Size.Empty, Format);\n            Size pctTextSize = TextRenderer.MeasureText(g, percentText, m_skillsQueueFont, Size.Empty, Format);\n\n            // Draw texts\n            Color highlightColor = Color.Black;\n\n            // First line\n            int left = e.Bounds.Left + PadLeft;\n            int top = e.Bounds.Top + PadTop;\n            TextRenderer.DrawText(g, indexText, m_boldSkillsQueueFont,\n                new Rectangle(left, top, indexTextSize.Width + PadLeft, indexTextSize.Height), highlightColor);\n            left += indexTextSize.Width;\n            TextRenderer.DrawText(g, skill.SkillName, m_boldSkillsQueueFont,\n                new Rectangle(left, top, skillNameSize.Width + PadLeft, skillNameSize.Height), highlightColor);\n            left += skillNameSize.Width;\n            TextRenderer.DrawText(g, rankText, m_skillsQueueFont,\n                new Rectangle(left, top, rankTextSize.Width + PadLeft, rankTextSize.Height), highlightColor);\n\n            // Second line\n            left = e.Bounds.Left + PadLeft + indexTextSize.Width;\n            top += skillNameSize.Height;\n            TextRenderer.DrawText(g, spText, m_skillsQueueFont,\n                new Rectangle(left, top, spTextSize.Width + PadLeft, spTextSize.Height), highlightColor);\n            left += spTextSize.Width + PadLeft;\n            TextRenderer.DrawText(g, spPerHourText, m_skillsQueueFont,\n                new Rectangle(left, top, spPerHourTextSize.Width + PadLeft, spPerHourTextSize.Height), highlightColor);\n            left += spPerHourTextSize.Width + PadLeft;\n            TextRenderer.DrawText(g, trainingTimeText, m_skillsQueueFont,\n                new Rectangle(left, top, ttTextSize.Width + PadLeft, ttTextSize.Height), highlightColor);\n\n            // Boxes\n            DrawBoxes(fractionCompleted, skill, e);\n\n            // Draw progression bar\n            DrawProgressionBar(fractionCompleted, e);\n\n            // Draw level and percent texts\n            TextRenderer.DrawText(g, levelText, m_skillsQueueFont,\n                new Rectangle(e.Bounds.Right - BoxWidth - PadRight - BoxHPad - levelTextSize.Width,\n                    e.Bounds.Top + PadTop, levelTextSize.Width + PadRight, levelTextSize.Height), highlightColor);\n            TextRenderer.DrawText(g, percentText, m_skillsQueueFont,\n                new Rectangle(e.Bounds.Right - BoxWidth - PadRight - BoxHPad - pctTextSize.Width,\n                    e.Bounds.Top + PadTop + levelTextSize.Height, pctTextSize.Width + PadRight, pctTextSize.Height), highlightColor);\n\n            // Draw the queue color bar\n            DrawQueueColorBar(skill, e);\n        }\n\n        /// <summary>\n        /// Draws the progression bar.\n        /// </summary>\n        /// <param name=\"fractionCompleted\">The fraction completed.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private static void DrawProgressionBar(double fractionCompleted, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            g.DrawRectangle(Pens.Black,\n                new Rectangle(e.Bounds.Right - BoxWidth - PadRight,\n                    e.Bounds.Top + PadTop + BoxHeight + BoxVPad, BoxWidth, LowerBoxHeight));\n\n            Rectangle pctBarRect = new Rectangle(e.Bounds.Right - BoxWidth - PadRight + 2,\n                e.Bounds.Top + PadTop + BoxHeight + BoxVPad + 2,\n                BoxWidth - 3, LowerBoxHeight - 3);\n\n            g.FillRectangle(Brushes.DarkGray, pctBarRect);\n            int fillWidth = (int)(pctBarRect.Width * fractionCompleted);\n            if (fillWidth <= 0)\n                return;\n\n            Rectangle fillRect = new Rectangle(pctBarRect.X, pctBarRect.Y, fillWidth, pctBarRect.Height);\n            g.FillRectangle(Brushes.Black, fillRect);\n        }\n\n        /// <summary>\n        /// Draws the boxes.\n        /// </summary>\n        /// <param name=\"fractionCompleted\">The fraction completed.</param>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void DrawBoxes(double fractionCompleted, QueuedSkill skill, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            g.DrawRectangle(Pens.Black,\n                new Rectangle(e.Bounds.Right - BoxWidth - PadRight, e.Bounds.Top + PadTop, BoxWidth,\n                    BoxHeight));\n\n            const int LevelBoxWidth = (BoxWidth - 4 - 3) / 5;\n            for (int level = 1; level <= 5; level++)\n            {\n                Rectangle brect =\n                    new Rectangle(e.Bounds.Right - BoxWidth - PadRight + 2 + LevelBoxWidth * (level - 1) + (level - 1),\n                        e.Bounds.Top + PadTop + 2, LevelBoxWidth, BoxHeight - 3);\n\n                // Box color\n                g.FillRectangle(skill.Skill != null && level < skill.Level ? Brushes.Black : Brushes.DarkGray, brect);\n\n                if (skill.Skill == null)\n                    continue;\n\n                foreach (QueuedSkill qskill in Character.SkillQueue)\n                {\n                    if ((!qskill.IsTraining && skill == qskill && level == qskill.Level)\n                        || (skill == qskill && level <= qskill.Level && level > skill.Skill.Level\n                            && Math.Abs(fractionCompleted) < double.Epsilon))\n                    {\n                        g.FillRectangle(Brushes.RoyalBlue, brect);\n                    }\n\n                    // Blinking indicator of skill level in training\n                    if (!qskill.IsTraining || skill != qskill || level != skill.Level ||\n                        Math.Abs(fractionCompleted) < double.Epsilon)\n                    {\n                        continue;\n                    }\n\n                    if (m_blinkAction == BlinkAction.Blink)\n                        g.FillRectangle(Brushes.RoyalBlue, brect);\n\n                    m_blinkAction = m_blinkAction == BlinkAction.Reset\n                        ? BlinkAction.Blink\n                        : BlinkAction.Stop;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Draws the queue color bar.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void DrawQueueColorBar(QueuedSkill skill, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Draw the background\n            Rectangle qBarRect = new Rectangle(e.Bounds.Left, GetItemHeight - LowerBoxHeight, e.Bounds.Width, LowerBoxHeight);\n            g.FillRectangle(Brushes.DimGray, qBarRect);\n\n            double oneDaySkillQueueWidth = Character.SkillQueue.GetOneDaySkillQueueWidth(qBarRect.Width);\n            IList<RectangleF> skillRects = Character.SkillQueue.GetSkillRects(skill, qBarRect.Width, LowerBoxHeight - 1).ToList();\n            Brush lessThanDayBrush = Settings.UI.SafeForWork ? Brushes.LightGray : Brushes.Khaki;\n            Brush moreThanDayBrush = Settings.UI.SafeForWork ? Brushes.DarkGray : Brushes.CornflowerBlue;\n            RectangleF skillRectFirst = skillRects.First();\n\n            // Skill starts before the 24h marker\n            if (skillRectFirst.X < oneDaySkillQueueWidth)\n            {\n                // Iterate only through rectangles with width\n                foreach (RectangleF skillRect in skillRects.Skip(1).Where(rect => rect.Width > 0))\n                {\n                    Brush brush = oneDaySkillQueueWidth - skillRect.X <= 0 ? moreThanDayBrush : lessThanDayBrush;\n\n                    g.FillRectangle(brush,\n                        new RectangleF(skillRect.X, GetItemHeight - LowerBoxHeight, skillRect.Width, skillRect.Height));\n                }\n                return;\n            }\n\n            g.FillRectangle(moreThanDayBrush,\n                new RectangleF(skillRectFirst.X, GetItemHeight - LowerBoxHeight, skillRectFirst.Width, skillRectFirst.Height));\n        }\n\n        #endregion\n\n\n        #region Local events\n\n        /// <summary>\n        /// Handles the MouseWheel event of the lbSkillsQueue control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbSkillsQueue_MouseWheel(object sender, MouseEventArgs e)\n        {\n            if (!lbSkillsQueue.VerticalScrollBarVisible())\n                return;\n            if (e.Delta == 0)\n                return;\n\n            // Update the drawing based upon the mouse wheel scrolling.\n            int numberOfItemLinesToMove = e.Delta * SystemInformation.MouseWheelScrollLines /\n                Math.Abs(e.Delta);\n            int lines = numberOfItemLinesToMove;\n            if (lines == 0)\n                return;\n\n            // Quit if at the top and requesting an up movement\n            if (lines > 0 && lbSkillsQueue.GetVerticalScrollBarPosition() == 0)\n                return;\n\n            // Compute the number of lines to move\n            int direction = lines / Math.Abs(lines);\n            int[] numberOfPixelsToMove = new int[lines * direction];\n            for (int i = 1; i <= Math.Abs(lines); i++)\n            {\n                object item = null;\n                var queue = lbSkillsQueue.Items;\n\n                // Going up\n                if (direction == Math.Abs(direction))\n                {\n                    // Retrieve the next top item\n                    if (lbSkillsQueue.TopIndex - i >= 0)\n                        item = queue[lbSkillsQueue.TopIndex - i];\n                }\n                    // Going down\n                else\n                {\n                    // Compute the height of the items from current the topindex (included)\n                    int height = 0;\n                    for (int j = lbSkillsQueue.TopIndex + i - 1; j < queue.Count; j++)\n                        height += GetItemHeight;\n\n                    // Retrieve the next bottom item\n                    if (height > lbSkillsQueue.ClientSize.Height)\n                        item = queue[lbSkillsQueue.TopIndex + i - 1];\n                }\n\n                // If found a new item as top or bottom\n                if (item != null)\n                    numberOfPixelsToMove[i - 1] = GetItemHeight * direction;\n                else\n                    lines -= direction;\n            }\n\n            // Scroll \n            if (lines != 0)\n                lbSkillsQueue.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the lbSkills control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbSkillsQueue_MouseDown(object sender, MouseEventArgs e)\n        {\n            // Retrieve the item at the given point and quit if none\n            int index = lbSkillsQueue.IndexFromPoint(e.Location);\n            if (index < 0 || index >= lbSkillsQueue.Items.Count)\n                return;\n\n            QueuedSkill item = lbSkillsQueue.Items[index] as QueuedSkill;\n\n            // Beware, this last index may actually means a click in the whitespace at the bottom\n            // Let's deal with this special case\n            if (index == lbSkillsQueue.Items.Count - 1)\n            {\n                Rectangle itemRect = lbSkillsQueue.GetItemRectangle(index);\n                if (!itemRect.Contains(e.Location))\n                    item = null;\n            }\n\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            // Right click for skills below lv5 : we display a context menu to plan higher levels\n            lbSkillsQueue.Cursor = Cursors.Default;\n\n            // Set the selected item\n            m_selectedSkill = item;\n\n            // Display the context menu\n            contextMenuStrip.Show(lbSkillsQueue, e.Location);\n        }\n\n        /// <summary>\n        /// On mouse move, we hide the tooltip.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbSkillsQueue_MouseMove(object sender, MouseEventArgs e)\n        {\n            lbSkillsQueue.Cursor = CustomCursors.ContextMenu;\n\n            for (int i = 0; i < lbSkillsQueue.Items.Count; i++)\n            {\n                // Skip until we found the mouse location\n                Rectangle rect = lbSkillsQueue.GetItemRectangle(i);\n                if (!rect.Contains(e.Location))\n                    continue;\n\n                QueuedSkill item = lbSkillsQueue.Items[i] as QueuedSkill;\n\n                // Updates the tooltip\n                DisplayTooltip(item);\n                return;\n            }\n\n            // If we went so far, we're not over anything\n            m_lastTooltipItem = null;\n            ttToolTip.Active = false;\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the contextMenuStrip control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void contextMenuStrip_Opening(object sender, CancelEventArgs e)\n        {\n            e.Cancel = !Character.SkillQueue.Any();\n            if (!e.Cancel)\n            {\n                BuildContextMenu(m_selectedSkill);\n                showInSkillBrowserMenuItem.Visible = showInSkillExplorerMenuItem.Visible =\n                    showInMenuSeparator.Visible = tsmiAddSkill.Visible =\n                    addSkillSeparator.Visible = (m_selectedSkill != null);\n            }\n        }\n\n        /// <summary>\n        /// Builds the context menu for the selected queued skill.\n        /// </summary>\n        /// <param name=\"queuedSkill\">The queued skill.</param>\n        private void BuildContextMenu(QueuedSkill queuedSkill)\n        {\n            if (m_selectedSkill == null)\n                return;\n\n            tsmiAddSkill.DropDownItems.Clear();\n\n            // Reset the menu\n            tsmiAddSkill.Text = $\"Add {queuedSkill.Skill.Name}\";\n\n            // Build the level options\n            for (long level = queuedSkill.Level; level <= 5; level++)\n            {\n                ToolStripMenuItem tempMenuLevel = null;\n                try\n                {\n                    tempMenuLevel = new ToolStripMenuItem($\"Level {Skill.GetRomanFromInt(level)} to\");\n\n                    Character.Plans.AddTo(tempMenuLevel.DropDownItems,\n                        (menuPlanItem, plan) =>\n                        {\n                            menuPlanItem.Click += menuPlanItem_Click;\n                            menuPlanItem.Tag = new KeyValuePair<Plan, SkillLevel>(plan,\n                                new SkillLevel(queuedSkill.Skill, level));\n                        });\n\n                    ToolStripMenuItem menuLevel = tempMenuLevel;\n                    tempMenuLevel = null;\n\n                    tsmiAddSkill.DropDownItems.Add(menuLevel);\n                }\n                finally\n                {\n                    tempMenuLevel?.Dispose();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Displays the tooltip for the given skill.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        private void DisplayTooltip(QueuedSkill skill)\n        {\n            if (skill == null)\n                return;\n\n            if (ttToolTip.Active && m_lastTooltipItem != null && m_lastTooltipItem == skill)\n                return;\n\n            m_lastTooltipItem = skill;\n\n            ttToolTip.Active = false;\n            ttToolTip.SetToolTip(lbSkillsQueue, GetTooltip(skill));\n            ttToolTip.Active = true;\n        }\n\n        /// <summary>\n        /// Gets the tooltip text for the given skill\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        private static string GetTooltip(QueuedSkill skill)\n        {\n            if (skill.Skill == null)\n                return string.Empty;\n\n            long sp = skill.Level > skill.Skill.Level + 1 ? skill.CurrentSP : skill.Skill.SkillPoints;\n            int nextLevel = Math.Min(5, skill.Level);\n            double fractionCompleted = skill.FractionCompleted;\n            long nextLevelSP = skill.Skill == Skill.UnknownSkill\n                ? skill.EndSP\n                : skill.Skill.StaticData.GetPointsRequiredForLevel(nextLevel);\n            long pointsLeft = nextLevelSP - sp;\n            TimeSpan timeSpanFromPoints = skill.Skill == Skill.UnknownSkill\n                ? skill.EndTime.Subtract(DateTime.UtcNow)\n                : skill.Skill.GetTimeSpanForPoints(pointsLeft);\n            string remainingTimeText = timeSpanFromPoints.ToDescriptiveText(\n                DescriptiveTextOptions.IncludeCommas | DescriptiveTextOptions.UppercaseText);\n\n            if (sp < skill.Skill.StaticData.GetPointsRequiredForLevel(1))\n            {\n                // Training hasn't got past level 1 yet\n                var untrainedToolTip = new StringBuilder();\n                untrainedToolTip.Append(\"Not yet trained to Level I (\");\n                untrainedToolTip.AppendFormat(\"{0:P0}\", Math.Floor(fractionCompleted * 100.0) *\n                    0.01).AppendLine(\")\");\n                untrainedToolTip.Append(\"Next level I: \").AppendFormat(\"{0:N0}\", pointsLeft);\n                untrainedToolTip.AppendLine(\" skill points remaining\");\n                untrainedToolTip.Append(\"Training time remaining: \");\n                untrainedToolTip.AppendLine(remainingTimeText);\n\n                AddSkillBoilerPlate(untrainedToolTip, skill);\n\n                return untrainedToolTip.ToString();\n            }\n\n            // So, it's a left click on a skill, we display the tool tip\n            // Currently training skill?\n            if (skill.IsTraining && fractionCompleted > 0)\n            {\n                var partiallyTrainedToolTip = new StringBuilder();\n                partiallyTrainedToolTip.Append(\"Partially Completed (\");\n                partiallyTrainedToolTip.AppendFormat(\"{0:P0}\", Math.Floor(fractionCompleted *\n                    100.0) * 0.01).AppendLine(\")\");\n                partiallyTrainedToolTip.Append(\"Training to level \");\n                partiallyTrainedToolTip.Append(Skill.GetRomanFromInt(nextLevel));\n                partiallyTrainedToolTip.Append(\": \").AppendFormat(\"{0:N0}\", pointsLeft);\n                partiallyTrainedToolTip.AppendLine(\" skill points remaining\");\n                partiallyTrainedToolTip.Append(\"Training time remaining: \");\n                partiallyTrainedToolTip.AppendLine(remainingTimeText);\n\n                AddSkillBoilerPlate(partiallyTrainedToolTip, skill);\n\n                return partiallyTrainedToolTip.ToString();\n            }\n\n            // Currently training skill but next queued level?\n            if (skill.IsTraining && Math.Abs(fractionCompleted) < double.Epsilon)\n            {\n                var partiallyTrainedToolTip = new StringBuilder();\n                partiallyTrainedToolTip.Append(\"Previous level not yet completed\");\n                partiallyTrainedToolTip.AppendLine();\n                partiallyTrainedToolTip.Append(\"Queued to level \");\n                partiallyTrainedToolTip.Append(Skill.GetRomanFromInt(nextLevel));\n                partiallyTrainedToolTip.Append(\": \").AppendFormat(\"{0:N0}\", pointsLeft);\n                partiallyTrainedToolTip.AppendLine(\" skill points remaining\");\n                partiallyTrainedToolTip.Append(\"Training time to next level: \");\n                partiallyTrainedToolTip.AppendLine(remainingTimeText);\n\n                AddSkillBoilerPlate(partiallyTrainedToolTip, skill);\n\n                return partiallyTrainedToolTip.ToString();\n            }\n\n            // Partially trained skill and not in training?\n            if (skill.Skill.IsPartiallyTrained && !skill.IsTraining)\n            {\n                StringBuilder partiallyTrainedToolTip = new StringBuilder();\n                partiallyTrainedToolTip.Append(\"Partially Completed (\");\n                partiallyTrainedToolTip.AppendFormat(\"{0:P0}\", Math.Floor(fractionCompleted *\n                    100.0) * 0.01).AppendLine(\")\");\n                partiallyTrainedToolTip.Append(\"Queued to level \");\n                partiallyTrainedToolTip.Append(Skill.GetRomanFromInt(nextLevel));\n                partiallyTrainedToolTip.Append(\": \").AppendFormat(\"{0:N0}\", pointsLeft);\n                partiallyTrainedToolTip.AppendLine(\" skill points remaining\");\n                partiallyTrainedToolTip.Append(\"Training time remaining: \");\n                partiallyTrainedToolTip.AppendLine(remainingTimeText);\n\n                AddSkillBoilerPlate(partiallyTrainedToolTip, skill);\n\n                return partiallyTrainedToolTip.ToString();\n            }\n\n            // We've completed all the skill points for the current level\n            if (!skill.Skill.IsPartiallyTrained && skill.Level <= 5)\n            {\n                var levelCompleteToolTip = new StringBuilder();\n                levelCompleteToolTip.Append(\"Completed Level \");\n                levelCompleteToolTip.Append(Skill.GetRomanFromInt(skill.Level - 1));\n                levelCompleteToolTip.Append(\": \").AppendFormat(\"{0:N0}\", sp);\n                levelCompleteToolTip.Append(\"/\").AppendFormat(\"{0:N0}\", nextLevelSP);\n                levelCompleteToolTip.AppendLine();\n                levelCompleteToolTip.Append(\"Queued level \");\n                levelCompleteToolTip.Append(Skill.GetRomanFromInt(nextLevel));\n                levelCompleteToolTip.Append(\": \").AppendFormat(\"{0:N0}\", pointsLeft);\n                levelCompleteToolTip.AppendLine(\" skill points required\");\n                levelCompleteToolTip.Append(\"Training time to next level: \");\n                levelCompleteToolTip.AppendLine(remainingTimeText);\n\n                AddSkillBoilerPlate(levelCompleteToolTip, skill);\n\n                return levelCompleteToolTip.ToString();\n            }\n\n            // Error in calculating SkillPoints\n            var calcError = new StringBuilder();\n            calcError.AppendLine(\"Partially Trained (Could not calculate all skill details)\");\n            calcError.Append(\"Next level \").AppendFormat(\"{0:N0}\", nextLevel);\n            calcError.Append(\": \").AppendFormat(\"{0:N0}\", pointsLeft);\n            calcError.AppendLine(\" skill points remaining\");\n            calcError.Append(\"Training time remaining: \");\n            calcError.AppendLine(remainingTimeText);\n\n            AddSkillBoilerPlate(calcError, skill);\n\n            return calcError.ToString();\n        }\n\n        /// <summary>\n        /// Adds the skill boiler plate.\n        /// </summary>\n        /// <param name=\"toolTip\">The tool tip.</param>\n        /// <param name=\"skill\">The skill.</param>\n        private static void AddSkillBoilerPlate(StringBuilder toolTip, QueuedSkill skill)\n        {\n            toolTip.AppendLine().AppendLine(skill.Skill.Description.WordWrap(100));\n            toolTip.Append(\"Primary: \").Append(skill.Skill.PrimaryAttribute).Append(\", \");\n            toolTip.Append(\"Secondary: \").Append(skill.Skill.SecondaryAttribute).Append(\" (\");\n            toolTip.AppendFormat(\"{0:F0}\", skill.SkillPointsPerHour).Append(\" SP/Hour)\");\n        }\n\n        /// <summary>\n        /// Handler for a context menu item click on a skill.\n        /// Add the entire skill queue to a plan.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void tsmiCreatePlanFromSkillQueue_Click(object sender, EventArgs e)\n        {\n            if (Character == null)\n                return;\n\n            // Create new plan\n            Plan newPlan = PlanWindow.CreateNewPlan(Character, EveMonConstants.CurrentSkillQueueText);\n\n            if (newPlan == null)\n                return;\n\n            // Add skill queue to new plan and insert it on top of the plans\n            bool planCreated = PlanIOHelper.CreatePlanFromCharacterSkillQueue(newPlan, Character);\n\n            // Show the editor for this plan\n            if (planCreated)\n                PlanWindow.ShowPlanWindow(plan: newPlan);\n        }\n\n        /// <summary>\n        /// Handler for a context menu item click on a skill.\n        /// Add a skill to the plan.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private static void menuPlanItem_Click(object sender, EventArgs e)\n        {\n            ToolStripMenuItem planItem = (ToolStripMenuItem)sender;\n            KeyValuePair<Plan, SkillLevel> tag = (KeyValuePair<Plan, SkillLevel>)planItem.Tag;\n\n            IPlanOperation operation = tag.Key.TryPlanTo(tag.Value.Skill, tag.Value.Level);\n            // If this operation does not change the plan, do nothing\n            if (operation == null || operation.Type == PlanOperations.None)\n                return;\n\n            PlanWindow planWindow = PlanWindow.ShowPlanWindow(plan: operation.Plan);\n            if (planWindow == null)\n                return;\n\n            PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow, operation);\n        }\n\n        /// <summary>\n        /// Shows the selected skill in Skill Browser.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInSkillBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            // Open the skill browser\n            PlanWindow.ShowPlanWindow(Character).ShowSkillInBrowser(m_selectedSkill?.Skill);\n        }\n\n        /// <summary>\n        /// Shows the selected skill in Skill Explorer.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInSkillExplorerMenuItem_Click(object sender, EventArgs e)\n        {\n            // Open the skill explorer\n            SkillExplorerWindow.ShowSkillExplorerWindow(Character).ShowSkillInExplorer(m_selectedSkill?.Skill);\n        }\n\n        #endregion\n\n\n        #region Global events\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Visible || Character == null || !Character.IsTraining)\n                return;\n\n            if (m_blinkAction == BlinkAction.Stop)\n                m_blinkAction = BlinkAction.Reset;\n        }\n\n        /// <summary>\n        /// When the skill queue changed, we refresh the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterSkillQueueUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the queue changed, we refresh the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_QueuedSkillsCompleted(object sender, QueuedSkillsEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the settings changed, we refresh the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterSkillsQueueList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"ttToolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"contextMenuStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>112, 16</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"showInSkillExplorerMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABh0RVh0U29m\n        dHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAAk9JREFUOE+Vkm1P0mEYxd3c+hi8cmsrDTV1VJoaJlqE\n        TygmjYCEcGACKqAiOIKUJ0WRINNQJJ/LLB9mK0oFKmO6yGbrO/heN7cT0b9NhlL93t27zn12XTsn6X+Q\n        +YUdzUFRMvH8O/yF2mThEpvUsMohSd7ySE1r9WG5X+gmxolhT1Ywb89V74mXuLj3uh5y3130hQwwhbSI\n        mNgJ2fFUjVxLYY0zDizB+xj76oJ3ZxhTu27Mfvfg2Q9vxKQL8oDQRMjjKXPR3KoVKYa2B/Dky0N4dh5h\n        4tsIpndHMbM7BuOmBtJ1gZ6Qx0Lrzc+9Pkg9HNg0wRHqhWKlEZyZanCf16BrTQF9oA3iN1wbIf9NTls6\n        LmqycFlP2a9y0tH8qhG2TSMk8/WoHqVbbz4tP/VLx5tnhQWLdcPRT0fJbE1D5zsltO/bYNjQwBjUoWO1\n        BXRH0SohicKZZar4L1jxMZKlZ9Dua4Xap4RuXY1uvxaqZSlK+wtjDOomKjo4c8x4g1TJaZBlZ3FecW6/\n        1EyFeE6AnoAOfC87YnLFynAWR0+o8dwIR+JN3IMsJTmXos481G90RjcRTHJAtxeB4SqG7KUILcsSsKcq\n        E/cgW0V288bZ6A50wfxBD9unHgx+tsC1ZcPjbTsUy424NV15cg8ymlNTslXpB7IFcfQUy0dDNBVHyArn\n        Vh/kiw2o9ZYd34M/ZLakMSPx7lEf5IFmKQS9/yqa5kUQz95B+VBJbA9OIhJvck57BumSNpuUb6CQqKbc\n        cImtIL4H/0qB4YKqyJx3JMakpJ/GeCksDt4euAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"tsmiCreatePlanFromSkillQueue.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        wgAADsIBFShKgAAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAAM/SURB\n        VDhPZZJrSJNRGMdXfehD9K3sZlGLirQLmlpZKGml1YJS7GKWlSSJFqJheZut7GIlcy7T8pq6ubnpZnO+\n        WSo6p07nvc12MS8ZyatFRBR089/xfY2QfvBwzpff/3nOw+H8ZWh4uMlisTT0m8xVxt4+pa6js/xli0H+\n        XN/KVK2+TUY1NV9czV07d0aZje3NG9pksaKpsxeKBj0eaWpxV66ZVcIK7a+MUnmSw7Ll/4eYrDZ68vMX\n        jE58xOuxcejMNrRZh9BosqG8pRNyvZGph2rqZ5ZUmbRq9ZrZIS19/fTg+AR6hsbQbhtCh30Y9f0WlDYa\n        IKHq8PX7D+SWlCBXW4d0hfZHqqTSY0Zl0ba2052DI6SzHVXtvZCRblJdBxPw/sMkphno1uFAwBEcyZRM\n        HRMVe8+oLJJ6Hf2idwAaYx8ToDL0oKKtmznv3OJDmpOGYD93OO/chT0PiqaOi0unA+awNiGzqpamuk0w\n        v32P1+/G2T2YrFBoayAvl0GcEAnf9cvg7bkVXrGCqd3hMYFEW8DaBKGKol/0mGG0j5DFWdE8YEfRMwr5\n        WenM+MB3pEaeROh+Z4SGnYHTXl4k0ZawNkFQpqZlzUZMTzE9urC6AWE30qAqe8Lov79NIiU8ACG+WxAf\n        HYa1O7z4RFvJ2oT7FVpaY+xHTdcriGsaEVOsQkSaCGpJNhPwbWIYp/xdwHPlQnDpBBydtoiI5sbahNty\n        Da0my6O6zcita4VU34Vr2UUoFKcwAZOjr3D6oAsC3FcgJsgbDtz1eUT7F5DwtJKOeCxFeI4UF3PliMhT\n        IDRHhvC4ONCDBtRrS8DbwYXz4vnw3MzF0nUbC4jmzNoE/xtiOiSjEGHZEkQVKBFdrMbZx3IcupKMhvzb\n        uBcVCP9Ni+C4cB427D0Mpz1+yURzYG2Cz3URnaqkoOroQ+PAIAz2UcRKqnE04RZ5wCdUZcYjKdgDfq4r\n        sPP8ZQTy04KI9u8feKWI6HMPSxCVr0R8mRZJ5RQu5CkRcDMDYyNWlIn44J/3QSDPCzyBELGV9ftmVBaX\n        q/fobfEP4JYohHuyCNtTxHAXZMEjOROHrqeDF5sI/+grOEjuQY8UiKtu9eVwOJw/m3kvmJXgWpMAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterStandingsList.Designer.cs",
    "content": "using EVEMon.Common.Controls;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterStandingsList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.noStandingsLabel = new System.Windows.Forms.Label();\n            this.lbStandings = new EVEMon.Common.Controls.NoFlickerListBox();\n            this.SuspendLayout();\n            // \n            // noStandingsLabel\n            // \n            this.noStandingsLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n            this.noStandingsLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noStandingsLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noStandingsLabel.Location = new System.Drawing.Point(0, 0);\n            this.noStandingsLabel.Name = \"noStandingsLabel\";\n            this.noStandingsLabel.Size = new System.Drawing.Size(328, 372);\n            this.noStandingsLabel.TabIndex = 2;\n            this.noStandingsLabel.Text = \"Standings information not available.\";\n            this.noStandingsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lbStandings\n            // \n            this.lbStandings.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lbStandings.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbStandings.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;\n            this.lbStandings.FormattingEnabled = true;\n            this.lbStandings.IntegralHeight = false;\n            this.lbStandings.ItemHeight = 15;\n            this.lbStandings.Location = new System.Drawing.Point(0, 0);\n            this.lbStandings.Margin = new System.Windows.Forms.Padding(0);\n            this.lbStandings.Name = \"lbStandings\";\n            this.lbStandings.Size = new System.Drawing.Size(328, 372);\n            this.lbStandings.TabIndex = 3;\n            this.lbStandings.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.lbStandings_DrawItem);\n            this.lbStandings.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.lbStandings_MeasureItem);\n            this.lbStandings.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbStandings_MouseDown);\n            this.lbStandings.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.lbStandings_MouseWheel);\n            // \n            // CharacterStandingsList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.noStandingsLabel);\n            this.Controls.Add(this.lbStandings);\n            this.Name = \"CharacterStandingsList\";\n            this.Size = new System.Drawing.Size(328, 372);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noStandingsLabel;\n        private NoFlickerListBox lbStandings;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterStandingsList.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Properties;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterStandingsList : UserControl\n    {\n        #region Fields\n\n        private const TextFormatFlags Format = TextFormatFlags.NoPadding | TextFormatFlags.NoClipping | TextFormatFlags.NoPrefix;\n\n        // Standings drawing - Region & text padding\n        private const int PadTop = 2;\n        private const int PadLeft = 6;\n        private const int PadRight = 7;\n\n        // Standings drawing - Standings\n        private const int StandingDetailHeight = 34;\n\n        // Standings drawing - Standings groups\n        private const int StandingGroupHeaderHeight = 21;\n        private const int CollapserPadRight = 4;\n\n        private readonly Font m_standingsFont;\n        private readonly Font m_standingsBoldFont;\n        private readonly List<string> m_collapsedGroups = new List<string>();\n\n        #endregion\n\n\n        #region Constructor\n\n        public CharacterStandingsList()\n        {\n            InitializeComponent();\n\n            lbStandings.Visible = false;\n\n            m_standingsFont = FontFactory.GetFont(\"Tahoma\", 8.25F);\n            m_standingsBoldFont = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            noStandingsLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        #endregion\n\n\n        #region Inherited events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.CharacterStandingsUpdated += EveMonClient_CharacterStandingsUpdated;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterStandingsUpdated -= EveMonClient_CharacterStandingsUpdated;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (Visible)\n                UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Content Management\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            // When no character, we just hide the list\n            if (Character == null)\n            {\n                noStandingsLabel.Visible = true;\n                lbStandings.Visible = false;\n                return;\n            }\n\n            int scrollBarPosition = lbStandings.TopIndex;\n\n            // Update the standings list\n            lbStandings.BeginUpdate();\n            try\n            {\n                IEnumerable<Standing> standings = Character.Standings;\n                IEnumerable<IGrouping<StandingGroup, Standing>> groups = standings.GroupBy(\n                    x => x.Group).Reverse();\n\n                // Scroll through groups\n                lbStandings.Items.Clear();\n                foreach (IGrouping<StandingGroup, Standing> group in groups)\n                {\n                    lbStandings.Items.Add(group.Key.GetDescription());\n\n                    // Add items in the group when it's not collapsed\n                    if (m_collapsedGroups.Contains(group.Key.GetDescription()))\n                        continue;\n\n                    foreach (Standing standing in group.OrderByDescending(x => x.EffectiveStanding))\n                    {\n                        standing.StandingImageUpdated += standing_StandingImageUpdated;\n                        lbStandings.Items.Add(standing);\n                    }\n                }\n\n                // Display or hide the \"no standings\" label.\n                noStandingsLabel.Visible = !standings.Any();\n                lbStandings.Visible = standings.Any();\n\n                // Invalidate display\n                lbStandings.Invalidate();\n            }\n            finally\n            {\n                lbStandings.EndUpdate();\n                lbStandings.TopIndex = scrollBarPosition;\n            }\n        }\n\n        #endregion\n\n\n        #region Drawing\n\n        /// <summary>\n        /// Handles the DrawItem event of the lbStandings control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void lbStandings_DrawItem(object sender, DrawItemEventArgs e)\n        {\n            if (e.Index < 0 || e.Index >= lbStandings.Items.Count)\n                return;\n\n            object item = lbStandings.Items[e.Index];\n            Standing standing = item as Standing;\n            if (standing != null)\n                DrawItem(standing, e);\n            else\n                DrawItem((string)item, e);\n        }\n\n        /// <summary>\n        /// Handles the MeasureItem event of the lbStandings control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MeasureItemEventArgs\"/> instance containing the event data.</param>\n        private void lbStandings_MeasureItem(object sender, MeasureItemEventArgs e)\n        {\n            if (e.Index < 0)\n                return;\n            e.ItemHeight = GetItemHeight(lbStandings.Items[e.Index]);\n        }\n\n        /// <summary>\n        /// Gets the item's height.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        private int GetItemHeight(object item)\n        {\n            if (item is Standing)\n                return Math.Max(m_standingsFont.Height * 2 + PadTop * 2, StandingDetailHeight);\n\n            return StandingGroupHeaderHeight;\n        }\n\n        /// <summary>\n        /// Draws the list item for the given standing\n        /// </summary>\n        /// <param name=\"standing\"></param>\n        /// <param name=\"e\"></param>\n        private void DrawItem(Standing standing, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Draw background\n            g.FillRectangle(e.Index % 2 == 0 ? Brushes.White : Brushes.LightGray, e.Bounds);\n\n            Skill diplomacySkill = Character.Skills[DBConstants.DiplomacySkillID];\n            Skill connectionsSkill = Character.Skills[DBConstants.ConnectionsSkillID];\n            var diplomacySkillLevel = new SkillLevel(diplomacySkill, diplomacySkill.\n                LastConfirmedLvl);\n            var connectionsSkillLevel = new SkillLevel(connectionsSkill, connectionsSkill.\n                LastConfirmedLvl);\n\n            // Texts\n            string standingText = $\"{standing.EntityName}  {standing.EffectiveStanding:N2}\";\n            string standingStatusText = $\"({Standing.Status(standing.EffectiveStanding)})\";\n            string standingsDetailsText = $\"{(standing.StandingValue < 0 ? diplomacySkillLevel : connectionsSkillLevel)} \" +\n                                          $\"raises your effective standing from {standing.StandingValue:N2}\";\n\n            // Measure texts\n            Size standingTextSize = TextRenderer.MeasureText(g, standingText, m_standingsBoldFont, Size.Empty, Format);\n            Size standingStatusTextSize = TextRenderer.MeasureText(g, standingStatusText, m_standingsBoldFont, Size.Empty, Format);\n            Size standingsDetailsTextSize = TextRenderer.MeasureText(g, standingsDetailsText, m_standingsFont, Size.Empty, Format);\n\n            bool standingsDiffer = Math.Abs(standing.EffectiveStanding - standing.StandingValue) > double.Epsilon;\n\n            // Draw texts\n            TextRenderer.DrawText(g, standingText, m_standingsBoldFont,\n                                  new Rectangle(\n                                      e.Bounds.Left + standing.EntityImage.Width + 4,\n                                      e.Bounds.Top + (standingsDiffer\n                                                          ? PadTop\n                                                          : (e.Bounds.Height - standingTextSize.Height) / 2),\n                                      standingTextSize.Width + PadLeft,\n                                      standingTextSize.Height), Color.Black);\n\n            TextRenderer.DrawText(g, standingStatusText, m_standingsBoldFont,\n                                  new Rectangle(\n                                      e.Bounds.Left + standing.EntityImage.Width + 4 + standingTextSize.Width + PadRight,\n                                      e.Bounds.Top + (standingsDiffer\n                                                          ? PadTop\n                                                          : (e.Bounds.Height - standingStatusTextSize.Height) / 2),\n                                      standingStatusTextSize.Width + PadLeft,\n                                      standingStatusTextSize.Height), GetStatusColor(Standing.Status(standing.EffectiveStanding)));\n\n            if (standingsDiffer)\n            {\n                TextRenderer.DrawText(g, standingsDetailsText, m_standingsFont,\n                                      new Rectangle(\n                                          e.Bounds.Left + standing.EntityImage.Width + 4,\n                                          e.Bounds.Top + PadTop + standingTextSize.Height,\n                                          standingsDetailsTextSize.Width + PadLeft,\n                                          standingsDetailsTextSize.Height), Color.Black);\n            }\n\n            // Draw the entity image\n            if (Settings.UI.SafeForWork)\n                return;\n\n            g.DrawImage(standing.EntityImage,\n                        new Rectangle(e.Bounds.Left + PadLeft / 2,\n                                      StandingDetailHeight / 2 - standing.EntityImage.Height / 2 + e.Bounds.Top,\n                                      standing.EntityImage.Width, standing.EntityImage.Height));\n        }\n\n        /// <summary>\n        /// Draws the list item for the given group.\n        /// </summary>\n        /// <param name=\"group\"></param>\n        /// <param name=\"e\"></param>\n        private void DrawItem(string group, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            // Draws the background\n            using (LinearGradientBrush lgb = new LinearGradientBrush(new PointF(0F, 0F), new PointF(0F, 21F),\n                                                                     Color.FromArgb(75, 75, 75), Color.FromArgb(25, 25, 25)))\n            {\n                g.FillRectangle(lgb, e.Bounds);\n            }\n\n            using (Pen p = new Pen(Color.FromArgb(100, 100, 100)))\n            {\n                g.DrawLine(p, e.Bounds.Left, e.Bounds.Top, e.Bounds.Right + 1, e.Bounds.Top);\n            }\n\n            // Setting character spacing\n            NativeMethods.SetTextCharacterSpacing(g, 4);\n\n            // Measure texts\n            Size standingGroupTextSize = TextRenderer.MeasureText(g, group.ToUpper(CultureConstants.DefaultCulture),\n                                                                  m_standingsBoldFont, Size.Empty, Format);\n            Rectangle standingGroupTextRect = new Rectangle(e.Bounds.Left + PadLeft,\n                                                            e.Bounds.Top +\n                                                            (e.Bounds.Height / 2 - standingGroupTextSize.Height / 2),\n                                                            standingGroupTextSize.Width + PadRight,\n                                                            standingGroupTextSize.Height);\n\n            // Draws the text header\n            TextRenderer.DrawText(g, group.ToUpper(CultureConstants.DefaultCulture), m_standingsBoldFont, standingGroupTextRect,\n                                  Color.White, Color.Transparent, Format);\n\n            // Draws the collapsing arrows\n            bool isCollapsed = m_collapsedGroups.Contains(group);\n            Image img = isCollapsed ? Resources.Expand : Resources.Collapse;\n\n            g.DrawImageUnscaled(img, new Rectangle(e.Bounds.Right - img.Width - CollapserPadRight,\n                                                   StandingGroupHeaderHeight / 2 - img.Height / 2 + e.Bounds.Top,\n                                                   img.Width, img.Height));\n        }\n\n        /// <summary>\n        /// Gets the preferred size from the preferred size of the list.\n        /// </summary>\n        /// <param name=\"proposedSize\"></param>\n        /// <returns></returns>\n        public override Size GetPreferredSize(Size proposedSize) => lbStandings.GetPreferredSize(proposedSize);\n\n        #endregion\n\n\n        #region Local events\n\n        /// <summary>\n        /// Handles the StandingImageUpdated event of the standing control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void standing_StandingImageUpdated(object sender, EventArgs e)\n        {\n            // Force to redraw\n            lbStandings.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the MouseWheel event of the lbStandings control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbStandings_MouseWheel(object sender, MouseEventArgs e)\n        {\n            if (e.Delta == 0)\n                return;\n\n            // Update the drawing based upon the mouse wheel scrolling\n            int numberOfItemLinesToMove = e.Delta * SystemInformation.MouseWheelScrollLines / Math.Abs(e.Delta);\n            int lines = numberOfItemLinesToMove;\n            if (lines == 0)\n                return;\n\n            // Compute the number of lines to move\n            int direction = lines / Math.Abs(lines);\n            int[] numberOfPixelsToMove = new int[lines * direction];\n            for (int i = 1; i <= Math.Abs(lines); i++)\n            {\n                object item = null;\n\n                // Going up\n                if (direction == Math.Abs(direction))\n                {\n                    // Retrieve the next top item\n                    if (lbStandings.TopIndex - i >= 0)\n                        item = lbStandings.Items[lbStandings.TopIndex - i];\n                }\n                    // Going down\n                else\n                {\n                    // Compute the height of the items from current the topindex (included)\n                    int height = 0;\n                    for (int j = lbStandings.TopIndex + i - 1; j < lbStandings.Items.Count; j++)\n                    {\n                        height += GetItemHeight(lbStandings.Items[j]);\n                    }\n\n                    // Retrieve the next bottom item\n                    if (height > lbStandings.ClientSize.Height)\n                        item = lbStandings.Items[lbStandings.TopIndex + i - 1];\n                }\n\n                // If found a new item as top or bottom\n                if (item != null)\n                    numberOfPixelsToMove[i - 1] = GetItemHeight(item) * direction;\n                else\n                    lines -= direction;\n            }\n\n            // Scroll \n            if (lines != 0)\n                lbStandings.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the lbStandings control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbStandings_MouseDown(object sender, MouseEventArgs e)\n        {\n            int index = lbStandings.IndexFromPoint(e.Location);\n            if (index < 0 || index >= lbStandings.Items.Count)\n                return;\n\n            Rectangle itemRect;\n\n            // Beware, this last index may actually means a click in the whitespace at the bottom\n            // Let's deal with this special case\n            if (index == lbStandings.Items.Count - 1)\n            {\n                itemRect = lbStandings.GetItemRectangle(index);\n                if (!itemRect.Contains(e.Location))\n                    return;\n            }\n\n            // For a standings group, we have to handle the collapse/expand mechanism\n            object item = lbStandings.Items[index];\n            string standingsGroup = item as string;\n            if (standingsGroup == null)\n                return;\n\n            // Left button : expand/collapse\n            if (e.Button != MouseButtons.Right)\n            {\n                ToggleGroupExpandCollapse(standingsGroup);\n                return;\n            }\n\n            // If right click on the button, still expand/collapse\n            itemRect = lbStandings.GetItemRectangle(lbStandings.Items.IndexOf(item));\n            Rectangle buttonRect = GetButtonRectangle(standingsGroup, itemRect);\n            if (buttonRect.Contains(e.Location))\n                ToggleGroupExpandCollapse(standingsGroup);\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the color of a standing status.\n        /// </summary>\n        /// <param name=\"status\">The standing status.</param>\n        /// <exception cref=\"NotImplementedException\"></exception>\n        /// <returns></returns>\n        private static Color GetStatusColor(StandingStatus status)\n        {\n            if (Settings.UI.SafeForWork)\n                return Color.Black;\n\n            switch (status)\n            {\n                case StandingStatus.Neutral:\n                    return Color.FromArgb(255, 178, 178, 178);\n                case StandingStatus.Terrible:\n                    return Color.FromArgb(255, 191, 0, 0);\n                case StandingStatus.Bad:\n                    return Color.FromArgb(255, 255, 89, 0);\n                case StandingStatus.Good:\n                    return Color.FromArgb(255, 51, 127, 255);\n                case StandingStatus.Excellent:\n                    return Color.FromArgb(255, 0, 38, 153);\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Toggles the expansion or collapsing of a single group\n        /// </summary>\n        /// <param name=\"group\">The group to expand or collapse.</param>\n        private void ToggleGroupExpandCollapse(string group)\n        {\n            if (m_collapsedGroups.Contains(group))\n            {\n                m_collapsedGroups.Remove(group);\n                UpdateContent();\n            }\n            else\n            {\n                m_collapsedGroups.Add(group);\n                UpdateContent();\n            }\n        }\n\n        /// <summary>\n        /// Gets the rectangle for the collapse/expand button.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <param name=\"itemRect\">The item rect.</param>\n        /// <returns></returns>\n        private Rectangle GetButtonRectangle(string group, Rectangle itemRect)\n        {\n            // Checks whether this group is collapsed\n            bool isCollapsed = m_collapsedGroups.Contains(group);\n\n            // Get the image for this state\n            Image btnImage = isCollapsed ? Resources.Expand : Resources.Collapse;\n\n            // Compute the top left point\n            Point btnPoint = new Point(itemRect.Right - btnImage.Width - CollapserPadRight,\n                                       StandingGroupHeaderHeight / 2 - btnImage.Height / 2 + itemRect.Top);\n\n            return new Rectangle(btnPoint, btnImage.Size);\n        }\n\n        #endregion\n\n\n        #region Global events\n\n        /// <summary>\n        /// When the character standings update, we refresh the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterStandingsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the settings change we update the content.\n        /// </summary>\n        /// <remarks>In case 'SafeForWork' gets enabled.</remarks>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the EVE ID to name changes we update the content.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterStandingsList.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterWalletJournalList.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterWalletJournalList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterWalletJournalList));\n            this.noWalletJournalLabel = new System.Windows.Forms.Label();\n            this.lvWalletJournal = new System.Windows.Forms.ListView();\n            this.chDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chAmount = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chBalance = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.ilIcons = new System.Windows.Forms.ImageList(this.components);\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.contextMenu.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // noWalletJournalLabel\n            // \n            this.noWalletJournalLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noWalletJournalLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noWalletJournalLabel.Location = new System.Drawing.Point(0, 0);\n            this.noWalletJournalLabel.Name = \"noWalletJournalLabel\";\n            this.noWalletJournalLabel.Size = new System.Drawing.Size(454, 434);\n            this.noWalletJournalLabel.TabIndex = 3;\n            this.noWalletJournalLabel.Text = \"No wallet journal is available.\";\n            this.noWalletJournalLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lvWalletJournal\n            // \n            this.lvWalletJournal.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lvWalletJournal.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chDate,\n            this.chType,\n            this.chAmount,\n            this.chBalance});\n            this.lvWalletJournal.ContextMenuStrip = this.contextMenu;\n            this.lvWalletJournal.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvWalletJournal.FullRowSelect = true;\n            this.lvWalletJournal.HideSelection = false;\n            this.lvWalletJournal.Location = new System.Drawing.Point(0, 0);\n            this.lvWalletJournal.MultiSelect = false;\n            this.lvWalletJournal.Name = \"lvWalletJournal\";\n            this.lvWalletJournal.Size = new System.Drawing.Size(454, 434);\n            this.lvWalletJournal.SmallImageList = this.ilIcons;\n            this.lvWalletJournal.TabIndex = 4;\n            this.lvWalletJournal.UseCompatibleStateImageBehavior = false;\n            this.lvWalletJournal.View = System.Windows.Forms.View.Details;\n            // \n            // chDate\n            // \n            this.chDate.Text = \"Date\";\n            this.chDate.Width = 106;\n            // \n            // chType\n            // \n            this.chType.Text = \"Type\";\n            this.chType.Width = 100;\n            // \n            // chAmount\n            // \n            this.chAmount.Text = \"Amount\";\n            this.chAmount.Width = 99;\n            // \n            // chBalance\n            // \n            this.chBalance.Text = \"Balance\";\n            this.chBalance.Width = 106;\n            // \n            // ilIcons\n            // \n            this.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n            this.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilIcons.Images.SetKeyName(0, \"arrow_up.png\");\n            this.ilIcons.Images.SetKeyName(1, \"arrow_down.png\");\n            this.ilIcons.Images.SetKeyName(2, \"16x16Transparant.png\");\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.exportToCSVToolStripMenuItem});\n            this.contextMenu.Name = \"ShipPropertiesContextMenu\";\n            this.contextMenu.Size = new System.Drawing.Size(157, 26);\n            // \n            // exportToCSVToolStripMenuItem\n            // \n            this.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n            this.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(156, 22);\n            this.exportToCSVToolStripMenuItem.Text = \"Export To CSV...\";\n            this.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n            // \n            // CharacterWalletJournalList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.lvWalletJournal);\n            this.Controls.Add(this.noWalletJournalLabel);\n            this.Name = \"CharacterWalletJournalList\";\n            this.Size = new System.Drawing.Size(454, 434);\n            this.contextMenu.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noWalletJournalLabel;\n        private System.Windows.Forms.ListView lvWalletJournal;\n        private System.Windows.Forms.ImageList ilIcons;\n        private System.Windows.Forms.ColumnHeader chDate;\n        private System.Windows.Forms.ColumnHeader chType;\n        private System.Windows.Forms.ColumnHeader chAmount;\n        private System.Windows.Forms.ColumnHeader chBalance;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterWalletJournalList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterWalletJournalList : UserControl, IListView\n    {\n        #region Fields\n\n        private readonly List<WalletJournalColumnSettings> m_columns = new List<WalletJournalColumnSettings>();\n        private readonly List<WalletJournal> m_list = new List<WalletJournal>();\n\n        private WalletJournalGrouping m_grouping;\n        private WalletJournalColumn m_sortCriteria;\n\n        private string m_textFilter = string.Empty;\n        private bool m_sortAscending;\n        private bool m_columnsChanged;\n        private bool m_isUpdatingColumns;\n        private bool m_init;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public CharacterWalletJournalList()\n        {\n            InitializeComponent();\n\n            lvWalletJournal.Hide();\n            lvWalletJournal.AllowColumnReorder = true;\n            lvWalletJournal.Columns.Clear();\n\n            noWalletJournalLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n\n            ListViewHelper.EnableDoubleBuffer(lvWalletJournal);\n\n            lvWalletJournal.ColumnClick += listView_ColumnClick;\n            lvWalletJournal.ColumnWidthChanged += listView_ColumnWidthChanged;\n            lvWalletJournal.ColumnReordered += listView_ColumnReordered;\n            lvWalletJournal.MouseDown += listView_MouseDown;\n            lvWalletJournal.MouseMove += listView_MouseMove;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        /// <summary>\n        /// Gets or sets the text filter.\n        /// </summary>\n        [Browsable(false)]\n        public string TextFilter\n        {\n            get { return m_textFilter; }\n            set\n            {\n                m_textFilter = value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of research points to display.\n        /// </summary>\n        private IEnumerable<WalletJournal> WalletJournal\n        {\n            get { return m_list; }\n            set\n            {\n                m_list.Clear();\n                if (value == null)\n                    return;\n\n                m_list.AddRange(value);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping of a listview.\n        /// </summary>\n        /// <value></value>\n        [Browsable(false)]\n        public Enum Grouping\n        {\n            get { return m_grouping; }\n            set\n            {\n                m_grouping = (WalletJournalGrouping)value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the settings used for columns.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        public IEnumerable<IColumnSettings> Columns\n        {\n            get\n            {\n                // Add the visible columns; matching the display order\n                List<WalletJournalColumnSettings> newColumns = new List<WalletJournalColumnSettings>();\n                foreach (ColumnHeader header in lvWalletJournal.Columns.Cast<ColumnHeader>().OrderBy(x => x.DisplayIndex))\n                {\n                    WalletJournalColumnSettings columnSetting =\n                        m_columns.First(x => x.Column == (WalletJournalColumn)header.Tag);\n                    if (columnSetting.Width > -1)\n                        columnSetting.Width = header.Width;\n\n                    newColumns.Add(columnSetting);\n                }\n\n                // Then add the other columns\n                newColumns.AddRange(m_columns.Where(x => !x.Visible));\n\n                return newColumns;\n            }\n            set\n            {\n                m_columns.Clear();\n                if (value != null)\n                    m_columns.AddRange(value.Cast<WalletJournalColumnSettings>());\n\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        #endregion\n\n\n        # region Inherited Events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.RefTypesUpdated += EveMonClient_RefTypesUpdated;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            EveMonClient.CharacterWalletJournalUpdated += EveMonClient_CharacterWalletJournalUpdated;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.RefTypesUpdated -= EveMonClient_RefTypesUpdated;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            EveMonClient.CharacterWalletJournalUpdated -= EveMonClient_CharacterWalletJournalUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (DesignMode || this.IsDesignModeHosted() || Character == null || !Visible)\n                return;\n\n            // Prevents the properties to call UpdateColumns() till we set all properties\n            m_init = false;\n\n            lvWalletJournal.Visible = false;\n\n            WalletJournal = Character?.WalletJournal;\n            Columns = Settings.UI.MainWindow.WalletJournal.Columns;\n            Grouping = Character?.UISettings.WalletJournalGroupBy;\n            TextFilter = string.Empty;\n\n            UpdateColumns();\n\n            m_init = true;\n\n            UpdateListVisibility();\n        }\n\n        # endregion\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Autoresizes the columns.\n        /// </summary>\n        public void AutoResizeColumns()\n        {\n            m_columns.ForEach(column => {\n                if (column.Visible)\n                    column.Width = -2;\n            });\n\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// Updates the columns.\n        /// </summary>\n        internal void UpdateColumns()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            lvWalletJournal.BeginUpdate();\n            m_isUpdatingColumns = true;\n\n            try\n            {\n                lvWalletJournal.Columns.Clear();\n                lvWalletJournal.Groups.Clear();\n                lvWalletJournal.Items.Clear();\n\n                foreach (WalletJournalColumnSettings column in m_columns.Where(x => x.Visible))\n                {\n                    ColumnHeader header = lvWalletJournal.Columns.Add(column.Column.GetHeader(), column.Width);\n                    header.Tag = column.Column;\n\n                    switch (column.Column)\n                    {\n                        case WalletJournalColumn.Amount:\n                        case WalletJournalColumn.Balance:\n                        case WalletJournalColumn.TaxAmount:\n                            header.TextAlign = HorizontalAlignment.Right;\n                            break;\n                    }\n                }\n\n                // We update the content\n                UpdateContent();\n            }\n            finally\n            {\n                lvWalletJournal.EndUpdate();\n                m_isUpdatingColumns = false;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            int scrollBarPosition = lvWalletJournal.GetVerticalScrollBarPosition();\n\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = lvWalletJournal.SelectedItems.Count > 0\n                ? lvWalletJournal.SelectedItems[0].Tag.GetHashCode() : 0;\n\n            lvWalletJournal.BeginUpdate();\n            try\n            {\n                IEnumerable<WalletJournal> walletJournalTransactions = m_list.Where(x => IsTextMatching(x, m_textFilter));\n\n                UpdateSort();\n\n                UpdateContentByGroup(walletJournalTransactions);\n\n                // Restore the selected item (if any)\n                if (selectedItem > 0)\n                {\n                    foreach (ListViewItem lvItem in lvWalletJournal.Items.Cast<ListViewItem>().Where(\n                        lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                    {\n                        lvItem.Selected = true;\n                    }\n                }\n\n                // Adjust the size of the columns\n                AdjustColumns();\n\n                UpdateListVisibility();\n            }\n            finally\n            {\n                lvWalletJournal.EndUpdate();\n                lvWalletJournal.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Updates the list visibility.\n        /// </summary>\n        private void UpdateListVisibility()\n        {\n            // Display or hide the \"no wallet Journal\" label\n            if (!m_init)\n                return;\n\n            noWalletJournalLabel.Visible = lvWalletJournal.Items.Count == 0;\n            lvWalletJournal.Visible = !noWalletJournalLabel.Visible;\n        }\n\n        /// <summary>\n        /// Updates the content by group.\n        /// </summary>\n        /// <param name=\"walletJournalTransactions\">The wallet journal transactions.</param>\n        private void UpdateContentByGroup(IEnumerable<WalletJournal> walletJournalTransactions)\n        {\n            switch (m_grouping)\n            {\n                case WalletJournalGrouping.None:\n                    UpdateNoGroupContent(walletJournalTransactions);\n                    break;\n                case WalletJournalGrouping.Date:\n                    IOrderedEnumerable<IGrouping<DateTime, WalletJournal>> groups1 =\n                        walletJournalTransactions.GroupBy(x => x.Date.ToLocalTime().Date).OrderBy(x => x.Key);\n                    UpdateContent(groups1);\n                    break;\n                case WalletJournalGrouping.DateDesc:\n                    IOrderedEnumerable<IGrouping<DateTime, WalletJournal>> groups2 =\n                        walletJournalTransactions.GroupBy(x => x.Date.ToLocalTime().Date).OrderByDescending(x => x.Key);\n                    UpdateContent(groups2);\n                    break;\n                case WalletJournalGrouping.Type:\n                    IOrderedEnumerable<IGrouping<string, WalletJournal>> groups3 =\n                        walletJournalTransactions.GroupBy(x => x.Type).OrderBy(x => x.Key);\n                    UpdateContent(groups3);\n                    break;\n                case WalletJournalGrouping.TypeDesc:\n                    IOrderedEnumerable<IGrouping<string, WalletJournal>> groups4 =\n                        walletJournalTransactions.GroupBy(x => x.Type).OrderByDescending(x => x.Key);\n                    UpdateContent(groups4);\n                    break;\n                case WalletJournalGrouping.Issuer:\n                    IOrderedEnumerable<IGrouping<string, WalletJournal>> groups5 =\n                        walletJournalTransactions.GroupBy(x => x.Issuer).OrderBy(x => x.Key);\n                    UpdateContent(groups5);\n                    break;\n                case WalletJournalGrouping.IssuerDesc:\n                    IOrderedEnumerable<IGrouping<string, WalletJournal>> groups6 =\n                        walletJournalTransactions.GroupBy(x => x.Issuer).OrderByDescending(x => x.Key);\n                    UpdateContent(groups6);\n                    break;\n                case WalletJournalGrouping.Recipient:\n                    IOrderedEnumerable<IGrouping<string, WalletJournal>> groups7 =\n                        walletJournalTransactions.GroupBy(x => x.Recipient).OrderBy(x => x.Key);\n                    UpdateContent(groups7);\n                    break;\n                case WalletJournalGrouping.RecipientDesc:\n                    IOrderedEnumerable<IGrouping<string, WalletJournal>> groups8 =\n                        walletJournalTransactions.GroupBy(x => x.Recipient).OrderByDescending(x => x.Key);\n                    UpdateContent(groups8);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private void UpdateNoGroupContent(IEnumerable<WalletJournal> walletJournalTransactions)\n        {\n            lvWalletJournal.Items.Clear();\n            lvWalletJournal.Groups.Clear();\n\n            // Add the items\n            lvWalletJournal.Items.AddRange(walletJournalTransactions.Select(walletJournal => new\n            {\n                walletJournal,\n                item = new ListViewItem($\"{walletJournal.Date.ToLocalTime()}\")\n                {\n                    UseItemStyleForSubItems = false,\n                    Tag = walletJournal\n                }\n            }).Select(x => CreateSubItems(x.walletJournal, x.item)).ToArray());\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        /// <typeparam name=\"TKey\"></typeparam>\n        /// <param name=\"groups\"></param>\n        private void UpdateContent<TKey>(IEnumerable<IGrouping<TKey, WalletJournal>> groups)\n        {\n            lvWalletJournal.Items.Clear();\n            lvWalletJournal.Groups.Clear();\n\n            // Add the groups\n            foreach (IGrouping<TKey, WalletJournal> group in groups)\n            {\n                string groupText;\n                if (group.Key is DateTime)\n                    groupText = ((DateTime)(object)group.Key).ToShortDateString();\n                else\n                    groupText = group.Key.ToString();\n\n                ListViewGroup listGroup = new ListViewGroup(groupText);\n                lvWalletJournal.Groups.Add(listGroup);\n\n                // Add the items in every group\n                lvWalletJournal.Items.AddRange(group.Select(walletJournal => new\n                {\n                    walletJournal,\n                    item = new ListViewItem($\"{walletJournal.Date.ToLocalTime()}\", listGroup)\n                    {\n                        UseItemStyleForSubItems = false,\n                        Tag = walletJournal\n                    }\n                }).Select(x => CreateSubItems(x.walletJournal, x.item)).ToArray());\n            }\n        }\n\n        /// <summary>\n        /// Creates the list view sub items.\n        /// </summary>\n        /// <param name=\"walletJournal\">The WalletJournal.</param>\n        /// <param name=\"item\">The item.</param>\n        private ListViewItem CreateSubItems(WalletJournal walletJournal, ListViewItem item)\n        {\n            // Add enough subitems to match the number of columns\n            while (item.SubItems.Count < lvWalletJournal.Columns.Count + 1)\n            {\n                item.SubItems.Add(string.Empty);\n            }\n\n            // Creates the subitems\n            for (int i = 0; i < lvWalletJournal.Columns.Count; i++)\n            {\n                SetColumn(walletJournal, item.SubItems[i], (WalletJournalColumn)lvWalletJournal.Columns[i].Tag);\n            }\n\n            return item;\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvWalletJournal.Columns)\n            {\n                if (m_columns[column.Index].Width == -1)\n                    m_columns[column.Index].Width = -2;\n\n                column.Width = m_columns[column.Index].Width;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column and not set to auto-resize\n                if (column.Index != lvWalletJournal.Columns.Count - 1 || m_columns[column.Index].Width != -2)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvWalletJournal.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvWalletJournal.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        /// <summary>\n        /// Updates the item sorter.\n        /// </summary>\n        private void UpdateSort()\n        {\n            lvWalletJournal.ListViewItemSorter = new ListViewItemComparerByTag<WalletJournal>(\n                new WalletJournalComparer(m_sortCriteria, m_sortAscending));\n\n            UpdateSortVisualFeedback();\n        }\n\n        /// <summary>\n        /// Updates the sort feedback (the arrow on the header).\n        /// </summary>\n        private void UpdateSortVisualFeedback()\n        {\n            foreach (ColumnHeader columnHeader in lvWalletJournal.Columns.Cast<ColumnHeader>())\n            {\n                WalletJournalColumn column = (WalletJournalColumn)columnHeader.Tag;\n                if (m_sortCriteria == column)\n                    columnHeader.ImageIndex = m_sortAscending ? 0 : 1;\n                else\n                    columnHeader.ImageIndex = 2;\n            }\n        }\n\n        /// <summary>\n        /// Updates the listview sub-item.\n        /// </summary>\n        /// <param name=\"walletJournal\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"column\"></param>\n        private static void SetColumn(WalletJournal walletJournal, ListViewItem.ListViewSubItem item,\n                                      WalletJournalColumn column)\n        {\n            bool numberFormat = Settings.UI.MainWindow.WalletJournal.NumberAbsFormat;\n\n            switch (column)\n            {\n                case WalletJournalColumn.Date:\n                    item.Text = $\"{walletJournal.Date.ToLocalTime():G}\";\n                    break;\n                case WalletJournalColumn.Type:\n                    item.Text = walletJournal.Type;\n                    break;\n                case WalletJournalColumn.Amount:\n                    item.Text = numberFormat\n                        ? FormatHelper.Format(walletJournal.Amount, AbbreviationFormat.AbbreviationSymbols)\n                        : walletJournal.Amount.ToNumericString(2);\n                    item.ForeColor = walletJournal.Amount < 0 ? Color.DarkRed : Color.DarkGreen;\n                    break;\n                case WalletJournalColumn.Balance:\n                    item.Text = numberFormat\n                        ? FormatHelper.Format(walletJournal.Balance, AbbreviationFormat.AbbreviationSymbols)\n                        : walletJournal.Balance.ToNumericString(2);\n                    break;\n                case WalletJournalColumn.Reason:\n                    item.Text = walletJournal.Reason;\n                    break;\n                case WalletJournalColumn.Issuer:\n                    item.Text = walletJournal.Issuer;\n                    break;\n                case WalletJournalColumn.Recipient:\n                    item.Text = walletJournal.Recipient;\n                    break;\n                case WalletJournalColumn.TaxReceiver:\n                    item.Text = walletJournal.TaxReceiver;\n                    break;\n                case WalletJournalColumn.TaxAmount:\n                    item.Text = numberFormat\n                        ? FormatHelper.Format(walletJournal.TaxAmount, AbbreviationFormat.AbbreviationSymbols)\n                        : walletJournal.TaxAmount.ToNumericString(2);\n                    break;\n                case WalletJournalColumn.ID:\n                    item.Text = walletJournal.ID.ToString(CultureConstants.DefaultCulture);\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Checks the given text matches the item.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if [is text matching] [the specified x]; otherwise, <c>false</c>.\n        /// </returns>\n        private static bool IsTextMatching(WalletJournal x, string text) => string.IsNullOrEmpty(text)\n       || x.Type.ToUpperInvariant().Contains(text, ignoreCase: true)\n       || x.Reason.ToUpperInvariant().Contains(text, ignoreCase: true)\n       || x.Issuer.ToUpperInvariant().Contains(text, ignoreCase: true)\n       || x.Recipient.ToUpperInvariant().Contains(text, ignoreCase: true)\n       || x.TaxReceiver.ToUpperInvariant().Contains(text, ignoreCase: true);\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Exports item info to CSV format.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(lvWalletJournal);\n        }\n\n        /// <summary>\n        /// On column reorder we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnReordered(object sender, ColumnReorderedEventArgs e)\n        {\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user manually resizes a column, we make sure to update the column preferences.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)\n        {\n            if (m_isUpdatingColumns || m_columns.Count <= e.ColumnIndex)\n                return;\n\n            if (m_columns[e.ColumnIndex].Width == lvWalletJournal.Columns[e.ColumnIndex].Width)\n                return;\n\n            m_columns[e.ColumnIndex].Width = lvWalletJournal.Columns[e.ColumnIndex].Width;\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user clicks a column header, we update the sorting.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            WalletJournalColumn column = (WalletJournalColumn)lvWalletJournal.Columns[e.Column].Tag;\n            if (m_sortCriteria == column)\n                m_sortAscending = !m_sortAscending;\n            else\n            {\n                m_sortCriteria = column;\n                m_sortAscending = true;\n            }\n\n            m_isUpdatingColumns = true;\n\n            // Updates the item sorter\n            UpdateSort();\n\n            m_isUpdatingColumns = false;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lvWalletJournal.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvWalletJournal.Cursor = CustomCursors.ContextMenu;\n        }\n\n        # endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// On timer tick, we update the column settings if any changes have been made to them.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Visible || !m_columnsChanged)\n                return;\n\n            Settings.UI.MainWindow.WalletJournal.Columns.Clear();\n            Settings.UI.MainWindow.WalletJournal.Columns.AddRange(Columns.Cast<WalletJournalColumnSettings>());\n\n            // Recreate the columns\n            Columns = Settings.UI.MainWindow.WalletJournal.Columns;\n            m_columnsChanged = false;\n        }\n\n        /// <summary>\n        /// When the RefTypes list updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_RefTypesUpdated(object sender, EventArgs e)\n        {\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// When the EveIDToName list updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// When the wallet Journal change update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterWalletJournalUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (Character == null || e.Character != Character)\n                return;\n\n            WalletJournal = Character.WalletJournal;\n            UpdateColumns();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterWalletJournalList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>103, 17</value>\n  </metadata>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        AAAAAk1TRnQBSQFMAgEBAwEAAawBBQGsAQUBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABEAMAAQEBAAEQBgABCP8A/wD/AP8A/wD/AP8A/wAaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB\n        AQABAQUAAYAXAAP/AQAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAB8AEPAf4BfwL/AgAB+AEfAfwBPwL/\n        AgAB/AE/AfgBHwL/AgAB/gF/AfABDwL/AgAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAL\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterWalletTransactionsList.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterWalletTransactionsList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterWalletTransactionsList));\n            this.noWalletTransactionsLabel = new System.Windows.Forms.Label();\n            this.lvWalletTransactions = new System.Windows.Forms.ListView();\n            this.chDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chItem = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chPrice = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chQuantity = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.ilIcons = new System.Windows.Forms.ImageList(this.components);\n            this.contextMenu.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // noWalletTransactionsLabel\n            // \n            this.noWalletTransactionsLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noWalletTransactionsLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noWalletTransactionsLabel.Location = new System.Drawing.Point(0, 0);\n            this.noWalletTransactionsLabel.Name = \"noWalletTransactionsLabel\";\n            this.noWalletTransactionsLabel.Size = new System.Drawing.Size(454, 434);\n            this.noWalletTransactionsLabel.TabIndex = 3;\n            this.noWalletTransactionsLabel.Text = \"No wallet transactions are available.\";\n            this.noWalletTransactionsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lvWalletTransactions\n            // \n            this.lvWalletTransactions.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lvWalletTransactions.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chDate,\n            this.chItem,\n            this.chPrice,\n            this.chQuantity});\n            this.lvWalletTransactions.ContextMenuStrip = this.contextMenu;\n            this.lvWalletTransactions.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvWalletTransactions.FullRowSelect = true;\n            this.lvWalletTransactions.HideSelection = false;\n            this.lvWalletTransactions.Location = new System.Drawing.Point(0, 0);\n            this.lvWalletTransactions.MultiSelect = false;\n            this.lvWalletTransactions.Name = \"lvWalletTransactions\";\n            this.lvWalletTransactions.Size = new System.Drawing.Size(454, 434);\n            this.lvWalletTransactions.SmallImageList = this.ilIcons;\n            this.lvWalletTransactions.TabIndex = 4;\n            this.lvWalletTransactions.UseCompatibleStateImageBehavior = false;\n            this.lvWalletTransactions.View = System.Windows.Forms.View.Details;\n            // \n            // chDate\n            // \n            this.chDate.Text = \"Date\";\n            this.chDate.Width = 125;\n            // \n            // chItem\n            // \n            this.chItem.Text = \"Item\";\n            this.chItem.Width = 169;\n            // \n            // chPrice\n            // \n            this.chPrice.Text = \"Price\";\n            this.chPrice.Width = 77;\n            // \n            // chQuantity\n            // \n            this.chQuantity.Text = \"Quantity\";\n            this.chQuantity.Width = 81;\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.exportToCSVToolStripMenuItem});\n            this.contextMenu.Name = \"ShipPropertiesContextMenu\";\n            this.contextMenu.Size = new System.Drawing.Size(157, 26);\n            // \n            // exportToCSVToolStripMenuItem\n            // \n            this.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n            this.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(156, 22);\n            this.exportToCSVToolStripMenuItem.Text = \"Export To CSV...\";\n            this.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n            // \n            // ilIcons\n            // \n            this.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n            this.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilIcons.Images.SetKeyName(0, \"arrow_up.png\");\n            this.ilIcons.Images.SetKeyName(1, \"arrow_down.png\");\n            this.ilIcons.Images.SetKeyName(2, \"16x16Transparant.png\");\n            // \n            // CharacterWalletTransactionsList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.lvWalletTransactions);\n            this.Controls.Add(this.noWalletTransactionsLabel);\n            this.Name = \"CharacterWalletTransactionsList\";\n            this.Size = new System.Drawing.Size(454, 434);\n            this.contextMenu.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noWalletTransactionsLabel;\n        private System.Windows.Forms.ListView lvWalletTransactions;\n        private System.Windows.Forms.ImageList ilIcons;\n        private System.Windows.Forms.ColumnHeader chDate;\n        private System.Windows.Forms.ColumnHeader chItem;\n        private System.Windows.Forms.ColumnHeader chPrice;\n        private System.Windows.Forms.ColumnHeader chQuantity;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterWalletTransactionsList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    internal sealed partial class CharacterWalletTransactionsList : UserControl, IListView\n    {\n        #region Fields\n\n        private readonly List<WalletTransactionColumnSettings> m_columns = new List<WalletTransactionColumnSettings>();\n        private readonly List<WalletTransaction> m_list = new List<WalletTransaction>();\n\n        private WalletTransactionGrouping m_grouping;\n        private WalletTransactionColumn m_sortCriteria;\n\n        private string m_textFilter = string.Empty;\n        private bool m_sortAscending;\n        private bool m_columnsChanged;\n        private bool m_isUpdatingColumns;\n        private bool m_init;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public CharacterWalletTransactionsList()\n        {\n            InitializeComponent();\n\n            lvWalletTransactions.Hide();\n            lvWalletTransactions.AllowColumnReorder = true;\n            lvWalletTransactions.Columns.Clear();\n\n            noWalletTransactionsLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n\n            ListViewHelper.EnableDoubleBuffer(lvWalletTransactions);\n\n            lvWalletTransactions.ColumnClick += listView_ColumnClick;\n            lvWalletTransactions.ColumnWidthChanged += listView_ColumnWidthChanged;\n            lvWalletTransactions.ColumnReordered += listView_ColumnReordered;\n            lvWalletTransactions.MouseDown += listView_MouseDown;\n            lvWalletTransactions.MouseMove += listView_MouseMove;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character associated with this monitor.\n        /// </summary>\n        internal CCPCharacter Character { get; set; }\n\n        /// <summary>\n        /// Gets or sets the text filter.\n        /// </summary>\n        [Browsable(false)]\n        public string TextFilter\n        {\n            get { return m_textFilter; }\n            set\n            {\n                m_textFilter = value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of wallet transactions to display.\n        /// </summary>\n        private IEnumerable<WalletTransaction> WalletTransactions\n        {\n            get { return m_list; }\n            set\n            {\n                m_list.Clear();\n                if (value == null)\n                    return;\n\n                m_list.AddRange(value);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping of a listview.\n        /// </summary>\n        /// <value></value>\n        [Browsable(false)]\n        public Enum Grouping\n        {\n            get { return m_grouping; }\n            set\n            {\n                m_grouping = (WalletTransactionGrouping)value;\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the settings used for columns.\n        /// </summary>\n        [Browsable(false)]\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        public IEnumerable<IColumnSettings> Columns\n        {\n            get\n            {\n                // Add the visible columns; matching the display order\n                List<WalletTransactionColumnSettings> newColumns = new List<WalletTransactionColumnSettings>();\n                foreach (ColumnHeader header in lvWalletTransactions.Columns.Cast<ColumnHeader>().OrderBy(x => x.DisplayIndex))\n                {\n                    WalletTransactionColumnSettings columnSetting =\n                        m_columns.First(x => x.Column == (WalletTransactionColumn)header.Tag);\n                    if (columnSetting.Width > -1)\n                        columnSetting.Width = header.Width;\n\n                    newColumns.Add(columnSetting);\n                }\n\n                // Then add the other columns\n                newColumns.AddRange(m_columns.Where(x => !x.Visible));\n\n                return newColumns;\n            }\n            set\n            {\n                m_columns.Clear();\n                if (value != null)\n                    m_columns.AddRange(value.Cast<WalletTransactionColumnSettings>());\n\n                if (m_init)\n                    UpdateColumns();\n            }\n        }\n\n        #endregion\n\n\n        # region Inherited Events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.ConquerableStationListUpdated += EveMonClient_ConquerableStationListUpdated;\n            EveMonClient.CharacterWalletTransactionsUpdated += EveMonClient_CharacterWalletTransactionsUpdated;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.ConquerableStationListUpdated -= EveMonClient_ConquerableStationListUpdated;\n            EveMonClient.CharacterWalletTransactionsUpdated -= EveMonClient_CharacterWalletTransactionsUpdated;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (DesignMode || this.IsDesignModeHosted() || Character == null || !Visible)\n                return;\n\n            // Prevents the properties to call UpdateColumns() till we set all properties\n            m_init = false;\n\n            lvWalletTransactions.Visible = false;\n\n            WalletTransactions = Character?.WalletTransactions;\n            Columns = Settings.UI.MainWindow.WalletTransactions.Columns;\n            Grouping = Character?.UISettings.WalletTransactionsGroupBy;\n            TextFilter = string.Empty;\n\n            UpdateColumns();\n\n            m_init = true;\n\n            UpdateListVisibility();\n        }\n\n        # endregion\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Autoresizes the columns.\n        /// </summary>\n        public void AutoResizeColumns()\n        {\n            m_columns.ForEach(column =>\n                                  {\n                                      if (column.Visible)\n                                          column.Width = -2;\n                                  });\n\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// Updates the columns.\n        /// </summary>\n        internal void UpdateColumns()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            lvWalletTransactions.BeginUpdate();\n            m_isUpdatingColumns = true;\n\n            try\n            {\n                lvWalletTransactions.Columns.Clear();\n                lvWalletTransactions.Groups.Clear();\n                lvWalletTransactions.Items.Clear();\n\n                foreach (WalletTransactionColumnSettings column in m_columns.Where(x => x.Visible))\n                {\n                    ColumnHeader header = lvWalletTransactions.Columns.Add(column.Column.GetHeader(), column.Width);\n                    header.Tag = column.Column;\n\n                    switch (column.Column)\n                    {\n                        case WalletTransactionColumn.Price:\n                        case WalletTransactionColumn.Quantity:\n                        case WalletTransactionColumn.Credit:\n                            header.TextAlign = HorizontalAlignment.Right;\n                            break;\n                    }\n                }\n\n                // We update the content\n                UpdateContent();\n            }\n            finally\n            {\n                lvWalletTransactions.EndUpdate();\n                m_isUpdatingColumns = false;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Returns if not visible\n            if (!Visible)\n                return;\n\n            int scrollBarPosition = lvWalletTransactions.GetVerticalScrollBarPosition();\n\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = lvWalletTransactions.SelectedItems.Count > 0\n                ? lvWalletTransactions.SelectedItems[0].Tag.GetHashCode()\n                : 0;\n\n            lvWalletTransactions.BeginUpdate();\n            try\n            {\n                IEnumerable<WalletTransaction> walletTransactions = m_list\n                    .Where(x => x.Station != null).Where(x => IsTextMatching(x, m_textFilter));\n\n                UpdateSort();\n\n                UpdateContentByGroup(walletTransactions);\n\n                // Restore the selected item (if any)\n                if (selectedItem > 0)\n                {\n                    foreach (ListViewItem lvItem in lvWalletTransactions.Items.Cast<ListViewItem>().Where(\n                        lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                    {\n                        lvItem.Selected = true;\n                    }\n                }\n\n                // Adjust the size of the columns\n                AdjustColumns();\n\n                UpdateListVisibility();\n            }\n            finally\n            {\n                lvWalletTransactions.EndUpdate();\n                lvWalletTransactions.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Updates the list visibility.\n        /// </summary>\n        private void UpdateListVisibility()\n        {\n            // Display or hide the \"no wallet transactions\" label\n            if (!m_init)\n                return;\n\n            noWalletTransactionsLabel.Visible = lvWalletTransactions.Items.Count == 0;\n            lvWalletTransactions.Visible = !noWalletTransactionsLabel.Visible;\n        }\n\n        /// <summary>\n        /// Updates the content by group.\n        /// </summary>\n        /// <param name=\"walletTransactions\">The wallet transactions.</param>\n        private void UpdateContentByGroup(IEnumerable<WalletTransaction> walletTransactions)\n        {\n            switch (m_grouping)\n            {\n                case WalletTransactionGrouping.None:\n                    UpdateNoGroupContent(walletTransactions);\n                    break;\n                case WalletTransactionGrouping.Date:\n                    IOrderedEnumerable<IGrouping<DateTime, WalletTransaction>> groups1 =\n                        walletTransactions.GroupBy(x => x.Date.ToLocalTime().Date).OrderBy(x => x.Key);\n                    UpdateContent(groups1);\n                    break;\n                case WalletTransactionGrouping.DateDesc:\n                    IOrderedEnumerable<IGrouping<DateTime, WalletTransaction>> groups2 =\n                        walletTransactions.GroupBy(x => x.Date.ToLocalTime().Date).OrderByDescending(x => x.Key);\n                    UpdateContent(groups2);\n                    break;\n                case WalletTransactionGrouping.ItemType:\n                    IOrderedEnumerable<IGrouping<string, WalletTransaction>> groups3 =\n                        walletTransactions.GroupBy(x => x.ItemName).OrderBy(x => x.Key);\n                    UpdateContent(groups3);\n                    break;\n                case WalletTransactionGrouping.ItemTypeDesc:\n                    IOrderedEnumerable<IGrouping<string, WalletTransaction>> groups4 =\n                        walletTransactions.GroupBy(x => x.ItemName).OrderByDescending(x => x.Key);\n                    UpdateContent(groups4);\n                    break;\n                case WalletTransactionGrouping.Client:\n                    IOrderedEnumerable<IGrouping<string, WalletTransaction>> groups5 =\n                        walletTransactions.GroupBy(x => x.ClientName).OrderBy(x => x.Key);\n                    UpdateContent(groups5);\n                    break;\n                case WalletTransactionGrouping.ClientDesc:\n                    IOrderedEnumerable<IGrouping<string, WalletTransaction>> groups6 =\n                        walletTransactions.GroupBy(x => x.ClientName).OrderByDescending(x => x.Key);\n                    UpdateContent(groups6);\n                    break;\n                case WalletTransactionGrouping.Location:\n                    IOrderedEnumerable<IGrouping<Station, WalletTransaction>> groups7 =\n                        walletTransactions.GroupBy(x => x.Station).OrderBy(x => x.Key.Name);\n                    UpdateContent(groups7);\n                    break;\n                case WalletTransactionGrouping.LocationDesc:\n                    IOrderedEnumerable<IGrouping<Station, WalletTransaction>> groups8 =\n                        walletTransactions.GroupBy(x => x.Station).OrderByDescending(x => x.Key.Name);\n                    UpdateContent(groups8);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        private void UpdateNoGroupContent(IEnumerable<WalletTransaction> walletTransactions)\n        {\n            lvWalletTransactions.Items.Clear();\n            lvWalletTransactions.Groups.Clear();\n\n            // Add the items\n            lvWalletTransactions.Items\n                .AddRange(walletTransactions\n                    .Select(walletTransaction => new\n                    {\n                        walletTransaction,\n                        item = new ListViewItem($\"{walletTransaction.Date.ToLocalTime()}\")\n                        {\n                            UseItemStyleForSubItems = false,\n                            Tag = walletTransaction\n                        }\n                    }).Select(x => CreateSubItems(x.walletTransaction, x.item)).ToArray());\n        }\n\n        /// <summary>\n        /// Updates the content of the listview.\n        /// </summary>\n        /// <typeparam name=\"TKey\"></typeparam>\n        /// <param name=\"groups\"></param>\n        private void UpdateContent<TKey>(IEnumerable<IGrouping<TKey, WalletTransaction>> groups)\n        {\n            lvWalletTransactions.Items.Clear();\n            lvWalletTransactions.Groups.Clear();\n\n            // Add the groups\n            foreach (IGrouping<TKey, WalletTransaction> group in groups)\n            {\n                string groupText;\n                if (group.Key is DateTime)\n                    groupText = ((DateTime)(object)group.Key).ToShortDateString();\n                else\n                    groupText = group.Key.ToString();\n                \n                ListViewGroup listGroup = new ListViewGroup(groupText);\n                lvWalletTransactions.Groups.Add(listGroup);\n\n                // Add the items in every group\n                lvWalletTransactions.Items\n                    .AddRange(group\n                        .Select(walletTransaction => new\n                        {\n                            walletTransaction,\n                            item = new ListViewItem($\"{walletTransaction.Date.ToLocalTime()}\", listGroup)\n                            {\n                                UseItemStyleForSubItems = false,\n                                Tag = walletTransaction\n                            }\n                        }).Select(x => CreateSubItems(x.walletTransaction, x.item)).ToArray());\n            }\n        }\n\n        /// <summary>\n        /// Creates the list view sub items.\n        /// </summary>\n        /// <param name=\"walletTransaction\">The WalletTransaction.</param>\n        /// <param name=\"item\">The item.</param>\n        private ListViewItem CreateSubItems(WalletTransaction walletTransaction, ListViewItem item)\n        {\n            // Add enough subitems to match the number of columns\n            while (item.SubItems.Count < lvWalletTransactions.Columns.Count + 1)\n            {\n                item.SubItems.Add(string.Empty);\n            }\n\n            // Creates the subitems\n            for (int i = 0; i < lvWalletTransactions.Columns.Count; i++)\n            {\n                SetColumn(walletTransaction, item.SubItems[i], (WalletTransactionColumn)lvWalletTransactions.Columns[i].Tag);\n            }\n\n            return item;\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvWalletTransactions.Columns)\n            {\n                if (m_columns[column.Index].Width == -1)\n                    m_columns[column.Index].Width = -2;\n\n                column.Width = m_columns[column.Index].Width;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column and not set to auto-resize\n                if (column.Index != lvWalletTransactions.Columns.Count - 1 || m_columns[column.Index].Width != -2)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvWalletTransactions.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvWalletTransactions.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        /// <summary>\n        /// Updates the item sorter.\n        /// </summary>\n        private void UpdateSort()\n        {\n            lvWalletTransactions.ListViewItemSorter = new ListViewItemComparerByTag<WalletTransaction>(\n                new WalletTransactionComparer(m_sortCriteria, m_sortAscending));\n\n            UpdateSortVisualFeedback();\n        }\n\n        /// <summary>\n        /// Updates the sort feedback (the arrow on the header).\n        /// </summary>\n        private void UpdateSortVisualFeedback()\n        {\n            foreach (ColumnHeader columnHeader in lvWalletTransactions.Columns.Cast<ColumnHeader>())\n            {\n                WalletTransactionColumn column = (WalletTransactionColumn)columnHeader.Tag;\n                if (m_sortCriteria == column)\n                    columnHeader.ImageIndex = m_sortAscending ? 0 : 1;\n                else\n                    columnHeader.ImageIndex = 2;\n            }\n        }\n\n        /// <summary>\n        /// Formats the price according to the settings.\n        /// </summary>\n        /// <param name=\"price\">The price to display.</param>\n        /// <returns>The price as a string.</returns>\n        private static string FormatPrice(decimal price)\n        {\n            return FormatHelper.FormatIf(Settings.UI.MainWindow.WalletTransactions.\n                NumberAbsFormat, 2, price, AbbreviationFormat.AbbreviationSymbols);\n        }\n\n        /// <summary>\n        /// Updates the listview sub-item.\n        /// </summary>\n        /// <param name=\"walletTransaction\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"column\"></param>\n        private static void SetColumn(WalletTransaction walletTransaction, ListViewItem.ListViewSubItem item,\n                                      WalletTransactionColumn column)\n        {\n            switch (column)\n            {\n            case WalletTransactionColumn.Date:\n                item.Text = walletTransaction.Date.ToLocalTime().ToString(\"G\");\n                break;\n            case WalletTransactionColumn.ItemName:\n                item.Text = walletTransaction.ItemName;\n                break;\n            case WalletTransactionColumn.Price:\n                item.Text = FormatPrice(walletTransaction.Price);\n                break;\n            case WalletTransactionColumn.Quantity:\n                item.Text = FormatHelper.FormatIf(Settings.UI.MainWindow.WalletTransactions.\n                    NumberAbsFormat, walletTransaction.Quantity, AbbreviationFormat.\n                    AbbreviationSymbols);\n                break;\n            case WalletTransactionColumn.Credit:\n                item.Text = FormatPrice(walletTransaction.Credit);\n                item.ForeColor = walletTransaction.TransactionType == TransactionType.Buy ?\n                    Color.DarkRed : Color.DarkGreen;\n                break;\n            case WalletTransactionColumn.Client:\n                item.Text = walletTransaction.ClientName;\n                break;\n            case WalletTransactionColumn.Location:\n                item.Text = walletTransaction.Station.FullLocation;\n                break;\n            case WalletTransactionColumn.Region:\n                item.Text = walletTransaction.Station.SolarSystemChecked.Constellation.\n                    Region.Name;\n                break;\n            case WalletTransactionColumn.SolarSystem:\n                item.Text = walletTransaction.Station.SolarSystem?.Name ??\n                    EveMonConstants.UnknownText;\n                item.ForeColor = walletTransaction.Station.SolarSystemChecked.\n                    SecurityLevelColor;\n                break;\n            case WalletTransactionColumn.Station:\n                item.Text = walletTransaction.Station.Name;\n                break;\n            case WalletTransactionColumn.TransactionFor:\n                item.Text = walletTransaction.TransactionFor.ToString();\n                break;\n            case WalletTransactionColumn.JournalID:\n                item.Text = walletTransaction.JournalID.ToString(CultureConstants.\n                    DefaultCulture);\n                break;\n            default:\n                throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Checks the given text matches the item.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if [is text matching] [the specified x]; otherwise, <c>false</c>.\n        /// </returns>\n        private static bool IsTextMatching(WalletTransaction x, string text) => string.IsNullOrEmpty(text)\n            || x.ItemName.ToUpperInvariant().Contains(text, ignoreCase: true)\n            || x.ClientName.ToUpperInvariant().Contains(text, ignoreCase: true)\n            || x.Station.Name.ToUpperInvariant().Contains(text, ignoreCase: true)\n            || x.Station.SolarSystemChecked.Name.ToUpperInvariant().Contains(text, ignoreCase: true)\n            || x.Station.SolarSystemChecked.Constellation.Name.ToUpperInvariant().Contains(text, ignoreCase: true)\n            || x.Station.SolarSystemChecked.Constellation.Region.Name.ToUpperInvariant().Contains(text, ignoreCase: true);\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Exports item info to CSV format.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(lvWalletTransactions);\n        }\n\n        /// <summary>\n        /// On column reorder we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnReordered(object sender, ColumnReorderedEventArgs e)\n        {\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user manually resizes a column, we make sure to update the column preferences.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)\n        {\n            if (m_isUpdatingColumns || m_columns.Count <= e.ColumnIndex)\n                return;\n\n            if (m_columns[e.ColumnIndex].Width == lvWalletTransactions.Columns[e.ColumnIndex].Width)\n                return;\n\n            m_columns[e.ColumnIndex].Width = lvWalletTransactions.Columns[e.ColumnIndex].Width;\n            m_columnsChanged = true;\n        }\n\n        /// <summary>\n        /// When the user clicks a column header, we update the sorting.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listView_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            WalletTransactionColumn column = (WalletTransactionColumn)lvWalletTransactions.Columns[e.Column].Tag;\n            if (m_sortCriteria == column)\n                m_sortAscending = !m_sortAscending;\n            else\n            {\n                m_sortCriteria = column;\n                m_sortAscending = true;\n            }\n\n            m_isUpdatingColumns = true;\n\n            // Updates the item sorter\n            UpdateSort();\n\n            m_isUpdatingColumns = false;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lvWalletTransactions.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void listView_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvWalletTransactions.Cursor = CustomCursors.ContextMenu;\n        }\n\n        # endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// On timer tick, we update the column settings if any changes have been made to them.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Visible || !m_columnsChanged)\n                return;\n\n            Settings.UI.MainWindow.WalletTransactions.Columns.Clear();\n            Settings.UI.MainWindow.WalletTransactions.Columns.AddRange(Columns.Cast<WalletTransactionColumnSettings>());\n\n            // Recreate the columns\n            Columns = Settings.UI.MainWindow.WalletTransactions.Columns;\n            m_columnsChanged = false;\n        }\n\n        /// <summary>\n        /// When the wallet transactions change update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterWalletTransactionsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (Character == null || e.Character != Character)\n                return;\n\n            WalletTransactions = Character.WalletTransactions;\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// When Conquerable Station List updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_ConquerableStationListUpdated(object sender, EventArgs e)\n        {\n            foreach (WalletTransaction walletTransaction in m_list)\n            {\n                walletTransaction.UpdateStation();\n            }\n\n            UpdateColumns();\n        }\n\n        /// <summary>\n        /// When EVE ID to name updates, update the list.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            UpdateColumns();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/CharacterWalletTransactionsList.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>103, 17</value>\n  </metadata>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        AAAAAk1TRnQBSQFMAgEBAwEAAaQBBQGkAQUBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABEAMAAQEBAAEQBgABCP8A/wD/AP8A/wD/AP8A/wAaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB\n        AQABAQUAAYAXAAP/AQAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAB8AEPAf4BfwL/AgAB+AEfAfwBPwL/\n        AgAB/AE/AfgBHwL/AgAB/gF/AfABDwL/AgAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAL\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/ContractsColumnsSelectWindow.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    public sealed class ContractsColumnsSelectWindow : ColumnSelectWindow\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ContractsColumnsSelectWindow\"/> class.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        public ContractsColumnsSelectWindow(IEnumerable<ContractColumnSettings> settings)\n            : base(settings)\n        {\n        }\n\n        /// <summary>\n        /// Gets the header.\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <returns></returns>\n        protected override string GetHeader(int key) => ((ContractColumn)key).GetDescription();\n\n        /// <summary>\n        /// Gets all keys.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<int> AllKeys\n            => EnumExtensions.GetValues<ContractColumn>()\n                .Where(x => x != ContractColumn.None).Select(x => (int)x);\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<IColumnSettings> DefaultColumns\n        {\n            get\n            {\n                ContractSettings settings = new ContractSettings();\n                return settings.DefaultColumns;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/EveMailMessagesColumnsSelectWindow.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    public sealed class EveMailMessagesColumnsSelectWindow : ColumnSelectWindow\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveMailMessagesColumnsSelectWindow\"/> class.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        public EveMailMessagesColumnsSelectWindow(IEnumerable<EveMailMessageColumnSettings> settings)\n            : base(settings)\n        {\n        }\n\n        /// <summary>\n        /// Gets the header.\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <returns></returns>\n        protected override string GetHeader(int key) => ((EveMailMessageColumn)key).GetDescription();\n\n        /// <summary>\n        /// Gets all keys.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<int> AllKeys\n            => EnumExtensions.GetValues<EveMailMessageColumn>()\n                .Where(x => x != EveMailMessageColumn.None).Select(x => (int)x);\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<IColumnSettings> DefaultColumns\n        {\n            get\n            {\n                EveMailMessageSettings settings = new EveMailMessageSettings();\n                return settings.DefaultColumns;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/EveNotificationsColumnsSelectWindow.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    public sealed class EveNotificationsColumnsSelectWindow : ColumnSelectWindow\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveNotificationsColumnsSelectWindow\"/> class.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        public EveNotificationsColumnsSelectWindow(IEnumerable<EveNotificationColumnSettings> settings)\n            : base(settings)\n        {\n        }\n\n        /// <summary>\n        /// Gets the header.\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <returns></returns>\n        protected override string GetHeader(int key) => ((EveNotificationColumn)key).GetDescription();\n\n        /// <summary>\n        /// Gets all keys.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<int> AllKeys\n            => EnumExtensions.GetValues<EveNotificationColumn>()\n                .Where(x => x != EveNotificationColumn.None).Select(x => (int)x);\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<IColumnSettings> DefaultColumns\n        {\n            get\n            {\n                EveNotificationSettings settings = new EveNotificationSettings();\n                return settings.DefaultColumns;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/IndustryJobsColumnsSelectWindow.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    public sealed class IndustryJobsColumnsSelectWindow : ColumnSelectWindow\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"IndustryJobsColumnsSelectWindow\"/> class.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        public IndustryJobsColumnsSelectWindow(IEnumerable<IndustryJobColumnSettings> settings)\n            : base(settings)\n        {\n        }\n\n        /// <summary>\n        /// Gets the header.\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <returns></returns>\n        protected override string GetHeader(int key) => ((IndustryJobColumn)key).GetDescription();\n\n        /// <summary>\n        /// Gets all keys.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<int> AllKeys\n            => EnumExtensions.GetValues<IndustryJobColumn>()\n                .Where(x => x != IndustryJobColumn.None).Select(x => (int)x);\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<IColumnSettings> DefaultColumns\n        {\n            get\n            {\n                IndustryJobSettings settings = new IndustryJobSettings();\n                return settings.DefaultColumns;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/MarketOrdersColumnsSelectWindow.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    public sealed class MarketOrdersColumnsSelectWindow : ColumnSelectWindow\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MarketOrdersColumnsSelectWindow\"/> class.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        public MarketOrdersColumnsSelectWindow(IEnumerable<MarketOrderColumnSettings> settings)\n            : base(settings)\n        {\n        }\n\n        /// <summary>\n        /// Gets the header.\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <returns></returns>\n        protected override string GetHeader(int key) => ((MarketOrderColumn)key).GetDescription();\n\n        /// <summary>\n        /// Gets all keys.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<int> AllKeys\n            => EnumExtensions.GetValues<MarketOrderColumn>()\n                .Where(x => x != MarketOrderColumn.None).Select(x => (int)x);\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<IColumnSettings> DefaultColumns\n        {\n            get\n            {\n                MarketOrderSettings settings = new MarketOrderSettings();\n                return settings.DefaultColumns;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/PlanetaryColumnsSelectWindow.Designer.cs",
    "content": "﻿namespace EVEMon.CharacterMonitoring\n{\n    partial class PlanetaryColumnsSelectWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Text = \"PlanetaryColumnsSelectWindow\";\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/PlanetaryColumnsSelectWindow.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    public partial class PlanetaryColumnsSelectWindow : ColumnSelectWindow\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanetaryColumnsSelectWindow\"/> class.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        public PlanetaryColumnsSelectWindow(IEnumerable<PlanetaryColumnSettings> settings)\n            : base(settings)\n        {\n        }\n\n        /// <summary>\n        /// Gets the header.\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <returns></returns>\n        protected override string GetHeader(int key) => ((PlanetaryColumn)key).GetDescription();\n\n        /// <summary>\n        /// Gets all keys.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<int> AllKeys\n            => EnumExtensions.GetValues<PlanetaryColumn>()\n                .Where(x => x != PlanetaryColumn.None).Select(x => (int)x);\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<IColumnSettings> DefaultColumns\n        {\n            get\n            {\n                PlanetarySettings settings = new PlanetarySettings();\n                return settings.DefaultColumns;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/ResearchColumnsSelectWindow.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    public sealed class ResearchColumnsSelectWindow : ColumnSelectWindow\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ResearchColumnsSelectWindow\"/> class.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        public ResearchColumnsSelectWindow(IEnumerable<ResearchColumnSettings> settings)\n            : base(settings)\n        {\n        }\n\n        /// <summary>\n        /// Gets the header.\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <returns></returns>\n        protected override string GetHeader(int key) => ((ResearchColumn)key).GetDescription();\n\n        /// <summary>\n        /// Gets all keys.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<int> AllKeys\n            => EnumExtensions.GetValues<ResearchColumn>()\n                .Where(x => x != ResearchColumn.None).Select(x => (int)x);\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<IColumnSettings> DefaultColumns\n        {\n            get\n            {\n                ResearchSettings settings = new ResearchSettings();\n                return settings.DefaultColumns;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/WalletJournalColumnsSelectWindow.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    public sealed class WalletJournalColumnsSelectWindow : ColumnSelectWindow\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"WalletJournalColumnsSelectWindow\"/> class.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        public WalletJournalColumnsSelectWindow(IEnumerable<WalletJournalColumnSettings> settings)\n            : base(settings)\n        {\n        }\n\n        /// <summary>\n        /// Gets the header.\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <returns></returns>\n        protected override string GetHeader(int key) => ((WalletJournalColumn)key).GetDescription();\n\n        /// <summary>\n        /// Gets all keys.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<int> AllKeys\n            => EnumExtensions.GetValues<WalletJournalColumn>()\n                .Where(x => x != WalletJournalColumn.None).Select(x => (int)x);\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<IColumnSettings> DefaultColumns\n        {\n            get\n            {\n                WalletJournalSettings settings = new WalletJournalSettings();\n                return settings.DefaultColumns;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharacterMonitoring/WalletTransactionsColumnsSelectWindow.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.CharacterMonitoring\n{\n    public sealed class WalletTransactionsColumnsSelectWindow : ColumnSelectWindow\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"WalletTransactionsColumnsSelectWindow\"/> class.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        public WalletTransactionsColumnsSelectWindow(IEnumerable<WalletTransactionColumnSettings> settings)\n            : base(settings)\n        {\n        }\n\n        /// <summary>\n        /// Gets the header.\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <returns></returns>\n        protected override string GetHeader(int key) => ((WalletTransactionColumn)key).GetDescription();\n\n        /// <summary>\n        /// Gets all keys.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<int> AllKeys\n            => EnumExtensions.GetValues<WalletTransactionColumn>()\n                .Where(x => x != WalletTransactionColumn.None).Select(x => (int)x);\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<IColumnSettings> DefaultColumns\n        {\n            get\n            {\n                WalletTransactionSettings settings = new WalletTransactionSettings();\n                return settings.DefaultColumns;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharactersComparison/CharactersComparisonWindow.Designer.cs",
    "content": "﻿namespace EVEMon.CharactersComparison\n{\n    partial class CharactersComparisonWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n\t\t\tthis.components = new System.ComponentModel.Container();\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharactersComparisonWindow));\n\t\t\tthis.persistentSplitContainer = new EVEMon.Common.Controls.PersistentSplitContainer();\n\t\t\tthis.lvCharacterList = new System.Windows.Forms.ListView();\n\t\t\tthis.chCharacters = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.filterPanel = new System.Windows.Forms.Panel();\n\t\t\tthis.cbFilter = new System.Windows.Forms.ComboBox();\n\t\t\tthis.filterLabel = new System.Windows.Forms.Label();\n\t\t\tthis.gbSkills = new System.Windows.Forms.GroupBox();\n\t\t\tthis.lvCharacterInfo = new System.Windows.Forms.ListView();\n\t\t\tthis.chSkill = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.chCharacter = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n\t\t\tthis.characterInfoContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n\t\t\tthis.exportSelectedSkillsAsPlanFromToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.lblHelp = new System.Windows.Forms.Label();\n\t\t\tthis.characterListContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n\t\t\tthis.exportCharacterSkillsAsPlanToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.persistentSplitContainer)).BeginInit();\n\t\t\tthis.persistentSplitContainer.Panel1.SuspendLayout();\n\t\t\tthis.persistentSplitContainer.Panel2.SuspendLayout();\n\t\t\tthis.persistentSplitContainer.SuspendLayout();\n\t\t\tthis.filterPanel.SuspendLayout();\n\t\t\tthis.gbSkills.SuspendLayout();\n\t\t\tthis.characterInfoContextMenu.SuspendLayout();\n\t\t\tthis.characterListContextMenu.SuspendLayout();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// persistentSplitContainer\n\t\t\t// \n\t\t\tthis.persistentSplitContainer.BackColor = System.Drawing.SystemColors.Window;\n\t\t\tthis.persistentSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.persistentSplitContainer.IsSplitterFixed = true;\n\t\t\tthis.persistentSplitContainer.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.persistentSplitContainer.Name = \"persistentSplitContainer\";\n\t\t\t// \n\t\t\t// persistentSplitContainer.Panel1\n\t\t\t// \n\t\t\tthis.persistentSplitContainer.Panel1.Controls.Add(this.lvCharacterList);\n\t\t\tthis.persistentSplitContainer.Panel1.Controls.Add(this.filterPanel);\n\t\t\tthis.persistentSplitContainer.Panel1.Padding = new System.Windows.Forms.Padding(3);\n\t\t\t// \n\t\t\t// persistentSplitContainer.Panel2\n\t\t\t// \n\t\t\tthis.persistentSplitContainer.Panel2.Controls.Add(this.gbSkills);\n\t\t\tthis.persistentSplitContainer.Panel2.Controls.Add(this.lblHelp);\n\t\t\tthis.persistentSplitContainer.Panel2.Padding = new System.Windows.Forms.Padding(3);\n\t\t\tthis.persistentSplitContainer.RememberDistanceKey = null;\n\t\t\tthis.persistentSplitContainer.Size = new System.Drawing.Size(784, 442);\n\t\t\tthis.persistentSplitContainer.SplitterDistance = 200;\n\t\t\tthis.persistentSplitContainer.TabIndex = 0;\n\t\t\tthis.persistentSplitContainer.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.persistentSplitContainer_SplitterMoved);\n\t\t\tthis.persistentSplitContainer.Resize += new System.EventHandler(this.persistentSplitContainer_Resize);\n\t\t\t// \n\t\t\t// lvCharacterList\n\t\t\t// \n\t\t\tthis.lvCharacterList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chCharacters});\n\t\t\tthis.lvCharacterList.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.lvCharacterList.FullRowSelect = true;\n\t\t\tthis.lvCharacterList.HideSelection = false;\n\t\t\tthis.lvCharacterList.Location = new System.Drawing.Point(3, 43);\n\t\t\tthis.lvCharacterList.Name = \"lvCharacterList\";\n\t\t\tthis.lvCharacterList.Size = new System.Drawing.Size(194, 396);\n\t\t\tthis.lvCharacterList.TabIndex = 1;\n\t\t\tthis.lvCharacterList.UseCompatibleStateImageBehavior = false;\n\t\t\tthis.lvCharacterList.View = System.Windows.Forms.View.Details;\n\t\t\tthis.lvCharacterList.SelectedIndexChanged += new System.EventHandler(this.lvCharacterList_SelectedIndexChanged);\n\t\t\tthis.lvCharacterList.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lvCharacterList_MouseDown);\n\t\t\tthis.lvCharacterList.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lvCharacterList_MouseMove);\n\t\t\t// \n\t\t\t// chCharacters\n\t\t\t// \n\t\t\tthis.chCharacters.Text = \"Characters\";\n\t\t\tthis.chCharacters.Width = 190;\n\t\t\t// \n\t\t\t// filterPanel\n\t\t\t// \n\t\t\tthis.filterPanel.Controls.Add(this.cbFilter);\n\t\t\tthis.filterPanel.Controls.Add(this.filterLabel);\n\t\t\tthis.filterPanel.Dock = System.Windows.Forms.DockStyle.Top;\n\t\t\tthis.filterPanel.Location = new System.Drawing.Point(3, 3);\n\t\t\tthis.filterPanel.Name = \"filterPanel\";\n\t\t\tthis.filterPanel.Size = new System.Drawing.Size(194, 40);\n\t\t\tthis.filterPanel.TabIndex = 0;\n\t\t\t// \n\t\t\t// cbFilter\n\t\t\t// \n\t\t\tthis.cbFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.cbFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.cbFilter.FormattingEnabled = true;\n\t\t\tthis.cbFilter.Items.AddRange(new object[] {\n            \"All\",\n            \"Only Monitored\"});\n\t\t\tthis.cbFilter.Location = new System.Drawing.Point(41, 10);\n\t\t\tthis.cbFilter.Name = \"cbFilter\";\n\t\t\tthis.cbFilter.Size = new System.Drawing.Size(153, 21);\n\t\t\tthis.cbFilter.TabIndex = 1;\n\t\t\tthis.cbFilter.SelectedIndexChanged += new System.EventHandler(this.cbFilter_SelectedIndexChanged);\n\t\t\t// \n\t\t\t// filterLabel\n\t\t\t// \n\t\t\tthis.filterLabel.AutoSize = true;\n\t\t\tthis.filterLabel.Location = new System.Drawing.Point(3, 13);\n\t\t\tthis.filterLabel.Name = \"filterLabel\";\n\t\t\tthis.filterLabel.Size = new System.Drawing.Size(32, 13);\n\t\t\tthis.filterLabel.TabIndex = 0;\n\t\t\tthis.filterLabel.Text = \"Filter:\";\n\t\t\t// \n\t\t\t// gbSkills\n\t\t\t// \n\t\t\tthis.gbSkills.Controls.Add(this.lvCharacterInfo);\n\t\t\tthis.gbSkills.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.gbSkills.Location = new System.Drawing.Point(3, 3);\n\t\t\tthis.gbSkills.Name = \"gbSkills\";\n\t\t\tthis.gbSkills.Size = new System.Drawing.Size(574, 436);\n\t\t\tthis.gbSkills.TabIndex = 1;\n\t\t\tthis.gbSkills.TabStop = false;\n\t\t\tthis.gbSkills.Text = \"Skills\";\n\t\t\t// \n\t\t\t// lvCharacterInfo\n\t\t\t// \n\t\t\tthis.lvCharacterInfo.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chSkill,\n            this.chCharacter});\n\t\t\tthis.lvCharacterInfo.ContextMenuStrip = this.characterInfoContextMenu;\n\t\t\tthis.lvCharacterInfo.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.lvCharacterInfo.FullRowSelect = true;\n\t\t\tthis.lvCharacterInfo.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\n\t\t\tthis.lvCharacterInfo.HideSelection = false;\n\t\t\tthis.lvCharacterInfo.Location = new System.Drawing.Point(3, 16);\n\t\t\tthis.lvCharacterInfo.Name = \"lvCharacterInfo\";\n\t\t\tthis.lvCharacterInfo.ShowItemToolTips = true;\n\t\t\tthis.lvCharacterInfo.Size = new System.Drawing.Size(568, 417);\n\t\t\tthis.lvCharacterInfo.TabIndex = 0;\n\t\t\tthis.lvCharacterInfo.UseCompatibleStateImageBehavior = false;\n\t\t\tthis.lvCharacterInfo.View = System.Windows.Forms.View.Details;\n\t\t\tthis.lvCharacterInfo.ColumnWidthChanging += new System.Windows.Forms.ColumnWidthChangingEventHandler(this.lvCharacterInfo_ColumnWidthChanging);\n\t\t\tthis.lvCharacterInfo.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lvCharacterInfo_MouseDown);\n\t\t\tthis.lvCharacterInfo.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lvCharacterInfo_MouseMove);\n\t\t\t// \n\t\t\t// chSkill\n\t\t\t// \n\t\t\tthis.chSkill.Text = \"Skill\";\n\t\t\tthis.chSkill.Width = 166;\n\t\t\t// \n\t\t\t// chCharacter\n\t\t\t// \n\t\t\tthis.chCharacter.Text = \"Character Name\";\n\t\t\tthis.chCharacter.Width = 131;\n\t\t\t// \n\t\t\t// characterInfoContextMenu\n\t\t\t// \n\t\t\tthis.characterInfoContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.exportSelectedSkillsAsPlanFromToolStripMenuItem,\n            this.exportToCSVToolStripMenuItem});\n\t\t\tthis.characterInfoContextMenu.Name = \"characterInfoContextMenu\";\n\t\t\tthis.characterInfoContextMenu.Size = new System.Drawing.Size(262, 48);\n\t\t\tthis.characterInfoContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.characterInfoContextMenu_Opening);\n\t\t\t// \n\t\t\t// exportSelectedSkillsAsPlanFromToolStripMenuItem\n\t\t\t// \n\t\t\tthis.exportSelectedSkillsAsPlanFromToolStripMenuItem.Name = \"exportSelectedSkillsAsPlanFromToolStripMenuItem\";\n\t\t\tthis.exportSelectedSkillsAsPlanFromToolStripMenuItem.Size = new System.Drawing.Size(261, 22);\n\t\t\tthis.exportSelectedSkillsAsPlanFromToolStripMenuItem.Text = \"Export Selected Skills as Plan from...\";\n\t\t\tthis.exportSelectedSkillsAsPlanFromToolStripMenuItem.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.exportSelectedSkillsAsPlanFromToolStripMenuItem_DropDownItemClicked);\n\t\t\t// \n\t\t\t// exportToCSVToolStripMenuItem\n\t\t\t// \n\t\t\tthis.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n\t\t\tthis.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(261, 22);\n\t\t\tthis.exportToCSVToolStripMenuItem.Text = \"Export To CSV...\";\n\t\t\tthis.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// lblHelp\n\t\t\t// \n\t\t\tthis.lblHelp.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblHelp.AutoSize = true;\n\t\t\tthis.lblHelp.Location = new System.Drawing.Point(6, 43);\n\t\t\tthis.lblHelp.Name = \"lblHelp\";\n\t\t\tthis.lblHelp.Size = new System.Drawing.Size(398, 52);\n\t\t\tthis.lblHelp.TabIndex = 2;\n\t\t\tthis.lblHelp.Text = \"Use the list on the left to select characters to compare.\\r\\n\\r\\nTo do this, hold dow\" +\n    \"n the CTRL key and click the characters you wish to compare.\\r\\nYou may compare se\" +\n    \"veral characters at once.\";\n\t\t\t// \n\t\t\t// characterListContextMenu\n\t\t\t// \n\t\t\tthis.characterListContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.exportCharacterSkillsAsPlanToolStripMenuItem});\n\t\t\tthis.characterListContextMenu.Name = \"characterListContextMenu\";\n\t\t\tthis.characterListContextMenu.Size = new System.Drawing.Size(240, 26);\n\t\t\tthis.characterListContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.characterListContextMenu_Opening);\n\t\t\tthis.characterListContextMenu.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.characterListContextMenu_ItemClicked);\n\t\t\t// \n\t\t\t// exportCharacterSkillsAsPlanToolStripMenuItem\n\t\t\t// \n\t\t\tthis.exportCharacterSkillsAsPlanToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"exportCharacterSkillsAsPlanToolStripMenuItem.Image\")));\n\t\t\tthis.exportCharacterSkillsAsPlanToolStripMenuItem.Name = \"exportCharacterSkillsAsPlanToolStripMenuItem\";\n\t\t\tthis.exportCharacterSkillsAsPlanToolStripMenuItem.Size = new System.Drawing.Size(239, 22);\n\t\t\tthis.exportCharacterSkillsAsPlanToolStripMenuItem.Text = \"Export Character Skills as Plan...\";\n\t\t\t// \n\t\t\t// CharactersComparisonWindow\n\t\t\t// \n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n\t\t\tthis.ClientSize = new System.Drawing.Size(784, 442);\n\t\t\tthis.Controls.Add(this.persistentSplitContainer);\n\t\t\tthis.MinimumSize = new System.Drawing.Size(800, 480);\n\t\t\tthis.Name = \"CharactersComparisonWindow\";\n\t\t\tthis.Text = \"Characters Comparison\";\n\t\t\tthis.persistentSplitContainer.Panel1.ResumeLayout(false);\n\t\t\tthis.persistentSplitContainer.Panel2.ResumeLayout(false);\n\t\t\tthis.persistentSplitContainer.Panel2.PerformLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.persistentSplitContainer)).EndInit();\n\t\t\tthis.persistentSplitContainer.ResumeLayout(false);\n\t\t\tthis.filterPanel.ResumeLayout(false);\n\t\t\tthis.filterPanel.PerformLayout();\n\t\t\tthis.gbSkills.ResumeLayout(false);\n\t\t\tthis.characterInfoContextMenu.ResumeLayout(false);\n\t\t\tthis.characterListContextMenu.ResumeLayout(false);\n\t\t\tthis.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private Common.Controls.PersistentSplitContainer persistentSplitContainer;\n        private System.Windows.Forms.Panel filterPanel;\n        private System.Windows.Forms.ComboBox cbFilter;\n        private System.Windows.Forms.Label filterLabel;\n        private System.Windows.Forms.ListView lvCharacterInfo;\n        private System.Windows.Forms.ListView lvCharacterList;\n        private System.Windows.Forms.GroupBox gbSkills;\n        private System.Windows.Forms.ColumnHeader chSkill;\n        private System.Windows.Forms.ColumnHeader chCharacter;\n        private System.Windows.Forms.Label lblHelp;\n        private System.Windows.Forms.ColumnHeader chCharacters;\n        private System.Windows.Forms.ContextMenuStrip characterListContextMenu;\n        private System.Windows.Forms.ToolStripMenuItem exportCharacterSkillsAsPlanToolStripMenuItem;\n        private System.Windows.Forms.ContextMenuStrip characterInfoContextMenu;\n        private System.Windows.Forms.ToolStripMenuItem exportSelectedSkillsAsPlanFromToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n    }\n}"
  },
  {
    "path": "src/EVEMon/CharactersComparison/CharactersComparisonWindow.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.CharactersComparison\n{\n    public partial class CharactersComparisonWindow : EVEMonForm\n    {\n        private readonly List<Character> m_selectedCharacters = new List<Character>();\n        private Timer m_tmrSelect;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CharactersComparisonWindow\"/> class.\n        /// </summary>\n        public CharactersComparisonWindow()\n        {\n            InitializeComponent();\n            RememberPositionKey = \"CharactersComparisonWindow\";\n        }\n\n        #endregion\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Updates the character list.\n        /// </summary>\n        private void UpdateCharacterList()\n        {\n            lvCharacterList.BeginUpdate();\n            try\n            {\n                IEnumerable<Character> characters = cbFilter.SelectedIndex == 0\n                    ? EveMonClient.Characters.OrderBy(x => x.Name)\n                    : EveMonClient.MonitoredCharacters.OrderBy(x => x.Name);\n                lvCharacterList.Items.Clear();\n                lvCharacterList.Items.AddRange(characters.Select(\n                    character => new ListViewItem(character.Name) { Tag = character }).ToArray());\n            }\n            finally\n            {\n                lvCharacterList.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Updates the selected items.\n        /// </summary>\n        /// <param name=\"reset\">if set to <c>true</c> reset the selection.</param>\n        private void UpdateSelectedItems(bool reset = true)\n        {\n            if (reset)\n                m_selectedCharacters.Clear();\n            else\n            {\n                IList<Character> selectedItems = lvCharacterList.SelectedItems.Cast<ListViewItem>()\n                    .Select(x => x.Tag).OfType<Character>().ToList();\n\n                // Add selected character\n                foreach (Character character in selectedItems.Where(character => !m_selectedCharacters.Contains(character)))\n                {\n                    m_selectedCharacters.Add(character);\n                }\n\n                // Remove non selected character\n                List<Character> selectedCharacters = new List<Character>(m_selectedCharacters);\n                foreach (Character character in selectedCharacters.Where(character => !selectedItems.Contains(character)))\n                {\n                    m_selectedCharacters.Remove(character);\n                }\n            }\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            if (!m_selectedCharacters.Any())\n            {\n                // Hide skills groupbox\n                gbSkills.Visible = false;\n\n                // View help message\n                lblHelp.Visible = true;\n\n                return;\n            }\n\n            UpdateCharacterInfo();\n\n            lblHelp.Visible = false;\n            gbSkills.Visible = true;\n        }\n\n        /// <summary>\n        /// Updates the character info.\n        /// </summary>\n        private void UpdateCharacterInfo()\n        {\n            int scrollBarPosition = lvCharacterInfo.GetVerticalScrollBarPosition();\n\n            lvCharacterInfo.BeginUpdate();\n            try\n            {\n                // Refresh columns\n                lvCharacterInfo.Columns.Clear();\n                lvCharacterInfo.Columns.Add(\"Skill\");\n\n                foreach (Character character in m_selectedCharacters)\n                {\n                    lvCharacterInfo.Columns.Add(character.Name, -2, HorizontalAlignment.Right);\n                }\n\n                // Prepare properties list\n                List<ListViewItem> items = AddGroups();\n\n                // Fetch the new items to the list view\n                lvCharacterInfo.Items.Clear();\n                lvCharacterInfo.Items.AddRange(items.ToArray());\n\n                if (lvCharacterInfo.Items.Count > 0)\n                    AdjustColumns();\n            }\n            finally\n            {\n                lvCharacterInfo.EndUpdate();\n                lvCharacterInfo.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Adds the groups.\n        /// </summary>\n        /// <returns></returns>\n        private List<ListViewItem> AddGroups()\n        {\n            lvCharacterInfo.Groups.Clear();\n            var items = new List<ListViewItem>();\n            foreach (StaticSkillGroup skillGroup in StaticSkills.AllGroups)\n            {\n                var group = new ListViewGroup(skillGroup.Name);\n                foreach (StaticSkill skill in skillGroup.Where(skill => skill.IsPublic))\n                {\n                    // Create the list view item\n                    var item = new ListViewItem(group) { ToolTipText = skill.Description, Text = skill.Name };\n                    items.Add(item);\n\n                    string[] labels = m_selectedCharacters\n                        .Select(character => skill.ToCharacter(character).Level.ToString(CultureConstants.DefaultCulture))\n                        .ToArray();\n                    long[] values = m_selectedCharacters.Select(character => skill.ToCharacter(character).Level).ToArray();\n\n                    // Retrieve the data to put in the columns\n                    AddValueForSelectedCharacters(item, labels, values);\n                }\n\n                lvCharacterInfo.Groups.Add(group);\n            }\n\n            // Add additional info \n            AddAdditionalInfo(items);\n\n            return items;\n        }\n\n        /// <summary>\n        /// Adds the additional info.\n        /// </summary>\n        /// <param name=\"items\">The items.</param>\n        private void AddAdditionalInfo(ICollection<ListViewItem> items)\n        {\n            var group = new ListViewGroup(\"Miscellaneous\");\n            var additionalInfo = new List<string[]>\n            {\n                new[] { \"Total SP\", \"The total skillpoints of the character.\" },\n                new[] { \"Known Skills\", \"The number of known skills of the character.\" },\n                new[]\n                {\n                    \"Skill Books Base Cost\",\n                    \"The skill books base cost for the owned or known skills of the character.\"\n                }\n            };\n\n            foreach (string[] text in additionalInfo)\n            {\n                var item = new ListViewItem(group) { Text = text.First(), ToolTipText = text.Last() };\n\n                string[] labels = m_selectedCharacters.Select(\n                    character => GetValue(character, text.First()).ToNumericString(0)).ToArray();\n                long[] values = m_selectedCharacters.Select(character => GetValue(character, text.First())).ToArray();\n\n                AddValueForSelectedCharacters(item, labels, values);\n                items.Add(item);\n            }\n\n            lvCharacterInfo.Groups.Add(group);\n        }\n\n        /// <summary>\n        /// Gets the value.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <returns></returns>\n        private static long GetValue(Character character, string text)\n        {\n            switch (text)\n            {\n                case \"Total SP\":\n                    return character.SkillPoints;\n                case \"Known Skills\":\n                    return character.KnownSkillCount;\n                case \"Skill Books Base Cost\":\n                    return character.Skills.Where(skill => skill.IsKnown || skill.IsOwned).Sum(skill => skill.Cost);\n                default:\n                    return default(long);\n            }\n        }\n\n        /// <summary>\n        /// Adds the value for selected characters.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"item\">The item.</param>\n        /// <param name=\"labels\">The labels.</param>\n        /// <param name=\"values\">The values.</param>\n        private void AddValueForSelectedCharacters<T>(ListViewItem item, IList<string> labels, IList<T> values)\n        {\n            T min = values.Any() ? values.Min() : default(T);\n            T max = values.Any() ? values.Max() : default(T);\n            bool allEqual = !values.Any() || values.All(value => value.Equals(min));\n\n            // Add the value for every selected item\n            for (int index = 0; index < m_selectedCharacters.Count(); index++)\n            {\n                // Create the subitem and choose its forecolor\n                var subItem = new ListViewItem.ListViewSubItem(item, labels[index]);\n                if (!allEqual)\n                {\n                    if (values[index].Equals(max))\n                        subItem.ForeColor = Color.DarkGreen;\n                    else if (values[index].Equals(min))\n                        subItem.ForeColor = Color.DarkRed;\n\n                    item.UseItemStyleForSubItems = false;\n                }\n                else if (m_selectedCharacters.Count() > 1)\n                {\n                    subItem.ForeColor = Color.DarkGray;\n                    item.UseItemStyleForSubItems = false;\n                }\n\n                item.SubItems.Add(subItem);\n            }\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvCharacterInfo.Columns)\n            {\n                column.Width = -2;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column\n                if (column.Index != lvCharacterInfo.Columns.Count - 1)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = lvCharacterInfo.Columns[column.Index].ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Handles the Load event of the CharacterComparisonWindow control.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            m_tmrSelect = new Timer();\n            m_tmrSelect.Tick += tmrSelect_Tick;\n\n            ListViewHelper.EnableDoubleBuffer(lvCharacterList);\n            ListViewHelper.EnableDoubleBuffer(lvCharacterInfo);\n\n            cbFilter.SelectedIndex = 0;\n            chCharacters.Width = lvCharacterList.ClientSize.Width;\n\n            EveMonClient.MonitoredCharacterCollectionChanged += EveMonClient_MonitoredCharacterCollectionChanged;\n            EveMonClient.CharacterCollectionChanged += EveMonClient_CharacterCollectionChanged;\n            Disposed += OnDisposed;\n\n            UpdateCharacterList();\n            UpdateSelectedItems();\n        }\n\n        /// <summary>\n        /// Called when disposed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.MonitoredCharacterCollectionChanged -= EveMonClient_MonitoredCharacterCollectionChanged;\n            EveMonClient.CharacterCollectionChanged -= EveMonClient_CharacterCollectionChanged;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// Handles the MonitoredCharacterCollectionChanged event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_MonitoredCharacterCollectionChanged(object sender, EventArgs e)\n        {\n            if (cbFilter.SelectedIndex != 1)\n                return;\n\n            UpdateCharacterList();\n            UpdateSelectedItems();\n        }\n\n        /// <summary>\n        /// Handles the CharacterCollectionChanged event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterCollectionChanged(object sender, EventArgs e)\n        {\n            UpdateCharacterList();\n            UpdateSelectedItems();\n        }\n\n        /// <summary>\n        /// Handles the SelectedIndexChanged event of the cbFilter control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void cbFilter_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            //Settings.CharacterComparison.Filter = cbFilter.SelectedIndex;\n            UpdateCharacterList();\n            UpdateSelectedItems();\n        }\n\n        /// <summary>\n        /// Handles the SplitterMoved event of the persistentSplitContainer control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.SplitterEventArgs\"/> instance containing the event data.</param>\n        private void persistentSplitContainer_SplitterMoved(object sender, SplitterEventArgs e)\n        {\n            chCharacters.Width = lvCharacterList.ClientSize.Width;\n        }\n\n        /// <summary>\n        /// Handles the Resize event of the persistentSplitContainer control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void persistentSplitContainer_Resize(object sender, EventArgs e)\n        {\n            chCharacters.Width = lvCharacterList.ClientSize.Width;\n        }\n\n        /// <summary>\n        /// Handles the SelectedIndexChanged event of the lvCharacterList control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void lvCharacterList_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (m_tmrSelect.Enabled)\n                return;\n\n            m_tmrSelect.Start();\n        }\n\n        /// <summary>\n        /// When the selection update timer ticks, we process the changes caused by a selection change.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tmrSelect_Tick(object sender, EventArgs e)\n        {\n            m_tmrSelect.Stop();\n\n            if (lvCharacterList.SelectedIndices.Count == 0)\n            {\n                UpdateSelectedItems();\n                return;\n            }\n\n            UpdateSelectedItems(false);\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the lvCharacterList control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lvCharacterList_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lvCharacterList.Cursor = Cursors.Default;\n\n            ListViewItem item = lvCharacterList.GetItemAt(e.X, e.Y);\n            if (item == null)\n                return;\n\n            characterListContextMenu.Items[0].Tag = item.Tag;\n            characterListContextMenu.Show(lvCharacterList, e.X, e.Y);\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lvCharacterList_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvCharacterList.Cursor = lvCharacterList.GetItemAt(e.X, e.Y) != null\n                ? CustomCursors.ContextMenu\n                : Cursors.Default;\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the characterListContextMenu control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void characterListContextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)\n        {\n            Character character = characterListContextMenu.Items[0].Tag as Character;\n\n            if (character == null)\n                return;\n\n            exportCharacterSkillsAsPlanToolStripMenuItem.Text = $\"Export \\\"{character.Name}\\\" Skills as Plan...\";\n        }\n\n        /// <summary>\n        /// Handles the ItemClicked event of the characterListContextMenu control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.ToolStripItemClickedEventArgs\"/> instance containing the event data.</param>\n        private async void characterListContextMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)\n        {\n            Character character = e.ClickedItem.Tag as Character;\n            characterListContextMenu.Close();\n\n            if (character != null)\n                await UIHelper.ExportCharacterSkillsAsPlanAsync(character);\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the lvCharacterInfo control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lvCharacterInfo_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lvCharacterInfo.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lvCharacterInfo_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvCharacterInfo.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the characterInfoContextMenu control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void characterInfoContextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)\n        {\n            var items = lvCharacterInfo.SelectedItems.Cast<ListViewItem>().ToList();\n            bool showExportSelectedSkillsAsPlan = items.Any() && items.All(item => item.Group?.Header != \"Miscellaneous\");\n\n            exportSelectedSkillsAsPlanFromToolStripMenuItem.Visible = showExportSelectedSkillsAsPlan;\n\n            if (!showExportSelectedSkillsAsPlan)\n                return;\n\n            exportSelectedSkillsAsPlanFromToolStripMenuItem.DropDownItems.Clear();\n\n            foreach (Character character in lvCharacterList.SelectedItems.Cast<ListViewItem>()\n                .Select(item => item.Tag).Cast<Character>())\n            {\n                ToolStripMenuItem item = new ToolStripMenuItem(character.Name);\n                exportSelectedSkillsAsPlanFromToolStripMenuItem.DropDownItems.Add(item);\n                item.Tag = character;\n            }\n        }\n\n        /// <summary>\n        /// Handles the DropDownItemClicked event of the exportSelectedSkillsAsPlanFromToolStripMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.ToolStripItemClickedEventArgs\"/> instance containing the event data.</param>\n        private async void exportSelectedSkillsAsPlanFromToolStripMenuItem_DropDownItemClicked(object sender,\n            ToolStripItemClickedEventArgs e)\n        {\n            characterInfoContextMenu.Close();\n\n            Character character = e.ClickedItem.Tag as Character;\n            if (character == null)\n                return;\n\n            IList<Skill> skills = lvCharacterInfo.SelectedItems.Cast<ListViewItem>()\n                .SelectMany(item => character.Skills.Where(skill => skill.Name == item.Text && skill.Level != 0))\n                .ToList();\n\n            if (skills.Any())\n                await UIHelper.ExportCharacterSkillsAsPlanAsync(character, skills);\n        }\n\n        /// <summary>\n        /// Handles the ColumnWidthChanging event of the lvCharacterInfo control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.ColumnWidthChangingEventArgs\"/> instance containing the event data.</param>\n        private void lvCharacterInfo_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)\n        {\n            e.Cancel = true;\n            e.NewWidth = lvCharacterInfo.Columns[e.ColumnIndex].Width;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the exportToCSVToolStripMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(lvCharacterInfo);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/CharactersComparison/CharactersComparisonWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"characterInfoContextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>216, 17</value>\n  </metadata>\n  <metadata name=\"characterListContextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"exportCharacterSkillsAsPlanToolStripMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDQAACw0B7QfALAAAA3xJREFUOE9dk3tMU2cY\n        xs/YGJdkLplDp1OuqXNmZgydJoOlCM3GVhlDRpWSctBYwWVZLRYGgmhMacGBXYVK52jKpRcOvVg5tAXa\n        UguH2kE3RTHsliwmarJl/uWyZZvrs9OzqXFv8uRNvuT5vZe8HxGPxMTEpFqSrJn0eu6e6e68OTntm1y8\n        umSfXYiO+eYj1CQT5jTFXB71hubqM7NzEjjjg0hNSV7DMKEfwQYz7YCkqgK2GQbn6Cl0UvRj0jjc9z8z\n        UW1r1q1/DJLaIpN+O+00ooEUoqhgJ27cvI3gtRXM3fgOM9e+wdh8FBSzyKnP5f1LZ7G3pWdm/Qd5IiFt\n        +6YX/W9mrcK2F1JRWSaEf/EKAtGroMNRDAfmYQ59CcvswkP12Nx/Ks3OHXF72gcl/MjK9QV4Rs5C8vbr\n        2PNGOsSicqgGhtFrpzHkZ2C6FOGMQ8EITtMzeP+sOSbSDvOJRIIoP991PD4+lqN+dMhJVBXmQLG/AoqO\n        LmgtdliDYVyIfA1DIIxGqxv7DQ7s6h6M7e018YlnkwiS+qIbf/x2L0ZbdJBVCVDy6no0Sytx/JQSn1tt\n        7ChLcH+1DFtkCcrxID4yTUBwZiS2T2fhE888TZCD51T4/d6d+55RPfa9k4uC7NVoP1iKOpkcyl492gdt\n        6HT50MWaNVPzqDVcgFBrjdXox/hESgIh7lc14NdfVmIXTb2oLsmDYMvzaBcXQiCqhkjRhmNGCo3mcTRT\n        XqjoS2iy+SDUWXHAOL4rvsS1tRVvLXx/xY9BnRpVgq3YmbEKxa9sxCYhiQzxSZQrDVC6AlCxHZz2Mjjm\n        ZJeot6Pe7OEABG/jWkVH3R5Iy/KRz0sDb91q5JcIkSlqBfHuCeyQ90MfuAzH4jLUnjl84gyg8rwzVm+a\n        KOQAuZuzpaHRPghLS7FBIOFMDzX1E5dz6jQo+9SMj0e9aGQBe40uyB3BIg6Qt4VH3vphGVtFDY9M/xf7\n        nnlIg0Mjbhyx+VFtpKG4GCrmAMnJSVknWhsDRZWSv9N3f/io+gMYm9MP9kCgGsJhixdH2R3UDLvRRM9x\n        gPg9p7A/kvea9Ojd95qVkKj7IB+g8PJhLWfOYM3kgIOtPgHZmA/N47M4YPaixRP+twM2nmT1VK5C9XNe\n        Uxe2tXRje6sGL8l68JxEjc0NWhSoB+LHg939FEQGF8RGtoOJcPE/gxI4ZT68SM4AAAAASUVORK5CYII=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/Controls/KillReportAttacker.Designer.cs",
    "content": "﻿namespace EVEMon.Controls\n{\n    partial class KillReportAttacker\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(KillReportAttacker));\n            this.MainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.DamageDoneLabel = new System.Windows.Forms.Label();\n            this.CharacterPictureBox = new System.Windows.Forms.PictureBox();\n            this.ShipPictureBox = new System.Windows.Forms.PictureBox();\n            this.WeaponPictureBox = new System.Windows.Forms.PictureBox();\n            this.AttackerInfoPanel = new System.Windows.Forms.Panel();\n            this.CharacterNameLabel = new System.Windows.Forms.Label();\n            this.AllianceNameLabel = new System.Windows.Forms.Label();\n            this.CorpNameLabel = new System.Windows.Forms.Label();\n            this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.showInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.MainTableLayoutPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.CharacterPictureBox)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.ShipPictureBox)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.WeaponPictureBox)).BeginInit();\n            this.AttackerInfoPanel.SuspendLayout();\n            this.contextMenuStrip.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // MainTableLayoutPanel\n            // \n            this.MainTableLayoutPanel.AutoSize = true;\n            this.MainTableLayoutPanel.ColumnCount = 3;\n            this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.MainTableLayoutPanel.Controls.Add(this.DamageDoneLabel, 2, 1);\n            this.MainTableLayoutPanel.Controls.Add(this.CharacterPictureBox, 0, 0);\n            this.MainTableLayoutPanel.Controls.Add(this.ShipPictureBox, 1, 0);\n            this.MainTableLayoutPanel.Controls.Add(this.WeaponPictureBox, 1, 1);\n            this.MainTableLayoutPanel.Controls.Add(this.AttackerInfoPanel, 2, 0);\n            this.MainTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.MainTableLayoutPanel.Location = new System.Drawing.Point(0, 0);\n            this.MainTableLayoutPanel.Name = \"MainTableLayoutPanel\";\n            this.MainTableLayoutPanel.RowCount = 2;\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.Size = new System.Drawing.Size(214, 71);\n            this.MainTableLayoutPanel.TabIndex = 0;\n            // \n            // DamageDoneLabel\n            // \n            this.DamageDoneLabel.AutoSize = true;\n            this.DamageDoneLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 7.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.DamageDoneLabel.Location = new System.Drawing.Point(102, 53);\n            this.DamageDoneLabel.Margin = new System.Windows.Forms.Padding(3, 18, 3, 0);\n            this.DamageDoneLabel.Name = \"DamageDoneLabel\";\n            this.DamageDoneLabel.Size = new System.Drawing.Size(72, 13);\n            this.DamageDoneLabel.TabIndex = 0;\n            this.DamageDoneLabel.Text = \"{0:N0} ({1:P1})\";\n            // \n            // CharacterPictureBox\n            // \n            this.CharacterPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"CharacterPictureBox.Image\")));\n            this.CharacterPictureBox.Location = new System.Drawing.Point(3, 3);\n            this.CharacterPictureBox.Margin = new System.Windows.Forms.Padding(3, 3, 0, 3);\n            this.CharacterPictureBox.Name = \"CharacterPictureBox\";\n            this.MainTableLayoutPanel.SetRowSpan(this.CharacterPictureBox, 2);\n            this.CharacterPictureBox.Size = new System.Drawing.Size(64, 64);\n            this.CharacterPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;\n            this.CharacterPictureBox.TabIndex = 0;\n            this.CharacterPictureBox.TabStop = false;\n            // \n            // ShipPictureBox\n            // \n            this.ShipPictureBox.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.ShipPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"ShipPictureBox.Image\")));\n            this.ShipPictureBox.Location = new System.Drawing.Point(67, 3);\n            this.ShipPictureBox.Margin = new System.Windows.Forms.Padding(0);\n            this.ShipPictureBox.Name = \"ShipPictureBox\";\n            this.ShipPictureBox.Size = new System.Drawing.Size(32, 32);\n            this.ShipPictureBox.TabIndex = 1;\n            this.ShipPictureBox.TabStop = false;\n            this.ShipPictureBox.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseDown);\n            this.ShipPictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseMove);\n            // \n            // WeaponPictureBox\n            // \n            this.WeaponPictureBox.Dock = System.Windows.Forms.DockStyle.Top;\n            this.WeaponPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"WeaponPictureBox.Image\")));\n            this.WeaponPictureBox.Location = new System.Drawing.Point(67, 35);\n            this.WeaponPictureBox.Margin = new System.Windows.Forms.Padding(0, 0, 0, 3);\n            this.WeaponPictureBox.Name = \"WeaponPictureBox\";\n            this.WeaponPictureBox.Size = new System.Drawing.Size(32, 32);\n            this.WeaponPictureBox.TabIndex = 2;\n            this.WeaponPictureBox.TabStop = false;\n            this.WeaponPictureBox.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseDown);\n            this.WeaponPictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseMove);\n            // \n            // AttackerInfoPanel\n            // \n            this.AttackerInfoPanel.AutoSize = true;\n            this.AttackerInfoPanel.Controls.Add(this.CharacterNameLabel);\n            this.AttackerInfoPanel.Controls.Add(this.AllianceNameLabel);\n            this.AttackerInfoPanel.Controls.Add(this.CorpNameLabel);\n            this.AttackerInfoPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.AttackerInfoPanel.Location = new System.Drawing.Point(99, 0);\n            this.AttackerInfoPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.AttackerInfoPanel.Name = \"AttackerInfoPanel\";\n            this.AttackerInfoPanel.Size = new System.Drawing.Size(115, 35);\n            this.AttackerInfoPanel.TabIndex = 5;\n            // \n            // CharacterNameLabel\n            // \n            this.CharacterNameLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.CharacterNameLabel.AutoEllipsis = true;\n            this.CharacterNameLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.CharacterNameLabel.Location = new System.Drawing.Point(3, 2);\n            this.CharacterNameLabel.Name = \"CharacterNameLabel\";\n            this.CharacterNameLabel.Size = new System.Drawing.Size(112, 11);\n            this.CharacterNameLabel.TabIndex = 0;\n            this.CharacterNameLabel.Text = \"Character Name\";\n            // \n            // AllianceNameLabel\n            // \n            this.AllianceNameLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.AllianceNameLabel.AutoEllipsis = true;\n            this.AllianceNameLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.AllianceNameLabel.Location = new System.Drawing.Point(3, 24);\n            this.AllianceNameLabel.Name = \"AllianceNameLabel\";\n            this.AllianceNameLabel.Size = new System.Drawing.Size(112, 11);\n            this.AllianceNameLabel.TabIndex = 2;\n            this.AllianceNameLabel.Text = \"Alliance Name\";\n            // \n            // CorpNameLabel\n            // \n            this.CorpNameLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.CorpNameLabel.AutoEllipsis = true;\n            this.CorpNameLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.CorpNameLabel.Location = new System.Drawing.Point(3, 13);\n            this.CorpNameLabel.Name = \"CorpNameLabel\";\n            this.CorpNameLabel.Size = new System.Drawing.Size(112, 11);\n            this.CorpNameLabel.TabIndex = 1;\n            this.CorpNameLabel.Text = \"Corporation Name\";\n            // \n            // contextMenuStrip\n            // \n            this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showInBrowserMenuItem});\n            this.contextMenuStrip.Name = \"contextMenuStrip\";\n            this.contextMenuStrip.Size = new System.Drawing.Size(171, 26);\n            this.contextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip_Opening);\n            // \n            // showInBrowserMenuItem\n            // \n            this.showInBrowserMenuItem.Name = \"showInBrowserMenuItem\";\n            this.showInBrowserMenuItem.Size = new System.Drawing.Size(170, 22);\n            this.showInBrowserMenuItem.Text = \"Show In Browser...\";\n            this.showInBrowserMenuItem.Click += new System.EventHandler(this.showInBrowserMenuItem_Click);\n            // \n            // KillReportAttacker\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.MainTableLayoutPanel);\n            this.Name = \"KillReportAttacker\";\n            this.Size = new System.Drawing.Size(214, 71);\n            this.MainTableLayoutPanel.ResumeLayout(false);\n            this.MainTableLayoutPanel.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.CharacterPictureBox)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.ShipPictureBox)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.WeaponPictureBox)).EndInit();\n            this.AttackerInfoPanel.ResumeLayout(false);\n            this.contextMenuStrip.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel MainTableLayoutPanel;\n        private System.Windows.Forms.PictureBox CharacterPictureBox;\n        private System.Windows.Forms.PictureBox ShipPictureBox;\n        private System.Windows.Forms.PictureBox WeaponPictureBox;\n        private System.Windows.Forms.Label CharacterNameLabel;\n        private System.Windows.Forms.Label CorpNameLabel;\n        private System.Windows.Forms.Label AllianceNameLabel;\n        private System.Windows.Forms.Label DamageDoneLabel;\n        private System.Windows.Forms.Panel AttackerInfoPanel;\n        private System.Windows.Forms.ContextMenuStrip contextMenuStrip;\n        private System.Windows.Forms.ToolStripMenuItem showInBrowserMenuItem;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/KillReportAttacker.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Drawing;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Service;\nusing EVEMon.SkillPlanner;\n\nnamespace EVEMon.Controls\n{\n    public partial class KillReportAttacker : UserControl\n    {\n        private SerializableKillLogAttackersListItem m_attacker;\n        private Item m_selectedItem;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"KillReportAttacker\"/> class.\n        /// </summary>\n        public KillReportAttacker()\n        {\n            InitializeComponent();\n\n            // Set the mouse click event for each control to handle the parent panel scrolling\n            SetControlMouseEvents(Controls);\n        }\n\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the attacker.\n        /// </summary>\n        /// <value>\n        /// The attacker.\n        /// </value>\n        internal SerializableKillLogAttackersListItem Attacker\n        {\n            get { return m_attacker; }\n            set\n            {\n                m_attacker = value;\n                UpdateContent();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the kill log.\n        /// </summary>\n        /// <value>\n        /// The kill log.\n        /// </value>\n        internal KillLog KillLog { private get; set; }\n\n        #endregion\n\n\n        #region Content Management Methods\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            string alliance = m_attacker.AllianceName;\n            CharacterNameLabel.Text = m_attacker.Name.IsEmptyOrUnknown() ? m_attacker.\n                ShipTypeName : m_attacker.Name;\n            CorpNameLabel.Text = m_attacker.CorporationName;\n            AllianceNameLabel.Text = m_attacker.AllianceID == 0 ? string.Empty : (alliance.\n                IsEmptyOrUnknown() ? string.Empty : alliance);\n\n            DamageDoneLabel.Text = string.Format(CultureConstants.DefaultCulture,\n                DamageDoneLabel.Text, m_attacker.DamageDone, m_attacker.DamageDone / (double)\n                KillLog.Victim.DamageTaken);\n\n            Task.WhenAll(GetImageForAsync(CharacterPictureBox),\n                GetImageForAsync(ShipPictureBox), GetImageForAsync(WeaponPictureBox));\n        }\n\n        /// <summary>\n        /// Gets the image for the specified picture box.\n        /// </summary>\n        /// <param name=\"pictureBox\">The picture box.</param>\n        private async Task GetImageForAsync(PictureBox pictureBox)\n        {\n            Image img = await ImageService.GetImageAsync(GetImageUrl(pictureBox));\n            if (img != null || pictureBox.Equals(WeaponPictureBox))\n                pictureBox.Image = img;\n        }\n\n        /// <summary>\n        /// Gets the image URL.\n        /// </summary>\n        /// <param name=\"pictureBox\">The picture box.</param>\n        /// <returns></returns>\n        private Uri GetImageUrl(PictureBox pictureBox)\n        {\n            if (pictureBox == CharacterPictureBox)\n                return ImageHelper.GetPortraitUrl(m_attacker.ID, (int)EveImageSize.x64);\n            else\n                return ImageHelper.GetTypeImageURL(pictureBox.Equals(ShipPictureBox) ?\n                    m_attacker.ShipTypeID : m_attacker.WeaponTypeID);\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Sets the control mouse events.\n        /// </summary>\n        /// <param name=\"controls\">The controls.</param>\n        private void SetControlMouseEvents(IEnumerable controls)\n        {\n            // Give focus to parent panel for mouse wheel scrolling\n            foreach (Control control in controls)\n            {\n                control.MouseClick += control_MouseClick;\n\n                if (control.Controls.Count > 0)\n                    SetControlMouseEvents(control.Controls);\n            }\n        }\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// Handles the MouseEnter event of the control control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void control_MouseClick(object sender, MouseEventArgs e)\n        {\n            Parent.Focus();\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the pictureBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\" /> instance containing the event data.</param>\n        private void pictureBox_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            PictureBox pictureBox = sender as PictureBox;\n\n            if (pictureBox == null)\n                return;\n\n            // Right click reset the cursor\n            pictureBox.Cursor = Cursors.Default;\n\n            int typeId =\n                pictureBox == ShipPictureBox\n                    ? m_attacker.ShipTypeID\n                    : pictureBox == WeaponPictureBox\n                        ? m_attacker.WeaponTypeID\n                        : Item.UnknownItem.ID;\n\n            // Set the selected item\n            m_selectedItem = StaticItems.GetItemByID(typeId);\n\n            // Display the context menu\n            contextMenuStrip.Show(pictureBox, e.Location);\n        }\n\n        /// <summary>\n        /// Handles the MouseMove event of the pictureBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void pictureBox_MouseMove(object sender, MouseEventArgs e)\n        {\n            PictureBox pictureBox = sender as PictureBox;\n            m_selectedItem = null;\n\n            if (pictureBox == null)\n                return;\n\n            if (((pictureBox == ShipPictureBox) && (m_attacker.ShipTypeID == 0)) ||\n                ((pictureBox == WeaponPictureBox) && (m_attacker.WeaponTypeID == 0)))\n            {\n                pictureBox.Cursor = Cursors.Default;\n                return;\n            }\n\n            pictureBox.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the contextMenuStrip control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void contextMenuStrip_Opening(object sender, System.ComponentModel.CancelEventArgs e)\n        {\n            PictureBox pictureBox = contextMenuStrip.SourceControl as PictureBox;\n\n            e.Cancel = pictureBox == null ||\n                       ((pictureBox == ShipPictureBox) && (m_attacker.ShipTypeID == 0)) ||\n                       ((pictureBox == WeaponPictureBox) && (m_attacker.WeaponTypeID == 0));\n\n            if (e.Cancel)\n                return;\n\n            string text = m_selectedItem is Ship ? \"Ship\" : m_selectedItem != null ? \"Item\" : string.Empty;\n\n            if (!string.IsNullOrWhiteSpace(text))\n                showInBrowserMenuItem.Text = $\"Show In {text} Browser...\";\n\n            showInBrowserMenuItem.Visible = !string.IsNullOrWhiteSpace(text);\n        }\n\n        /// <summary>\n        /// Handles the Click event of the showInBrowserMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void showInBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            if (m_selectedItem == null)\n                return;\n\n            PlanWindow planWindow = PlanWindow.ShowPlanWindow(KillLog.Character);\n\n            if (m_selectedItem is Ship)\n                planWindow.ShowShipInBrowser(m_selectedItem);\n            else\n                planWindow.ShowItemInBrowser(m_selectedItem);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/KillReportAttacker.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"CharacterPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYG\n        BwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoK\n        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCACAAIADASIAAhEBAxEB/8QA\n        HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh\n        MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW\n        V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG\n        x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF\n        BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV\n        YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE\n        hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq\n        8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8z0gJPzfkKnitWP8ADgVbgssHhfzq3BYnP3f0oAoxWQJ+7+Oa\n        sx2Jbjb+laMWng8lcfhVqHTsn7mfc0AZSWH+yRU6ae390H8K149MbOP5CpJrO3tYXubmRY441LSSSMFV\n        QO5J6CgDHGnc/cApw05c8r+lcn4t+PGjadI9l4UsBeupwbmbKxZ9h1b9PxrjL/4xfEG+kLLrQgXORHbw\n        IoH44J/WgD2A6amOAfypp04f3a8k034z+P8AT3DSapHcqP8Alnc26kfmoB/Wu78GfHDw7rsyWHiK2Gn3\n        DHCzFswsfc9U/Hj3oA3m049oxUL2HqOntXSHTVdQyAEEZBB61FJpnHyg0Ac09gQc7fzqvJZEjG2ull03\n        1XNVZtOGOn5igDnJLMjOPyNV5LfHBBFdBNYY/gx6YFU57EgfdFAGnb2IOPlxV6208kAhcVdtdPIwQPxr\n        RtdN6fLQBn2+mnH3Kuw6Y2OV6Vp22mcAhcVft9KJxlP05oAyIdKyOE/CvDPj/wDESfV9dl8GaTcFbGxk\n        23JQ/wCumHUH2U8Y9QT6Y+hvFUo8MeE9S8RMn/HlYyzgEdSqEgfiR+tfGk00txK08zlndizsx5JPJNAD\n        aKKKACiiigD1z9nX4jTT3q/D7Xbjekik6ZLIeVIGTFn0xkj0xjuMexS6Wc5CcfSvkrRtUutD1e11mxfb\n        NaXCTRHP8SsCP5V9q2ltBqNjDqNqMxzxLJGf9lgCP50AcrPpQ6Bap3GmY4I/AiuwuNJIPT6Zqjc6Wc/d\n        +lAHH3GnYB+Xr6iqVzYYJBXH1rrbrTCMjb+lZ11pwHGzv0oA1bPTTxlcn6Vq2emHjj6cdat2OmHjj6Vr\n        2Wl5xhetAFC10vOMJ9a0bXSfRentWpaaUTjC8Vp2ekcAFf0oA8t/aPgfTPgb4gux8p+zRp+DzIn/ALNX\n        xnX1L+278Wm8N2J+DMGkwzLqumx3N3ctIQ8OJw0YUDjrEc57EdO/y1QAUUUUAFFFFABX3Z8K7A3nwq8N\n        XbDJl8P2bk9eTAhNfCdfZv7HHxaHxR8GyeDZ9ES1l8MWNnbRukpb7RF5ZQMcjhsxnPb5hQB2NxpHXK1n\n        3WlY5Cda7m60frlOR04rMvNJIJOygDh7zTDg4TgVl3mmnkFfqK7i80oAHC1kX2mHBBXjvQBrWGm5xlf0\n        6Vs2OljI+Wp9N0w8fLW7p+l7sfJj8KAKljpJONqfTitez0gk/crQsdJPBC9K2bLSGyMJ0oA+If8AgpF4\n        Gu9K8caB44SFvs1/pbWbuBwJYpGfn0JWUY/3T6V82V+lf7ZP7PWv/HP4KTeH/CFususadex3+nW7ME89\n        lVkaLccAEq7YzxuC5x1H5v69oereGNcvPDevWL219p91JbXttJjdFLGxV0OOMhgR+FAFSiiigAooooAK\n        +wP+Cafw9vF8KeJPH9zGwivryKytcjr5Sl3YeozKo+qmvlHwh4P8TePvElr4Q8G6LPqOp3rlbWztly8h\n        Cljj6AEn0ANfqB+zb8F9S+DfwK8P/D/WkT7faWrSagIiCBPLI0rrkfe2l9ue+2gBLvR+Thf0rKvdJC5G\n        361315o46bP0rJv9J7lKAPP77Suvy/WsbUNLIyNn/wBeu+1DScE/JWHqOljJyv0oA09M0zoAldBpumdP\n        lpulabwPlro9M0wnGFoAj0/SgMfL+lbdhpA43J+lWtM0sHHyVu6fpXAJXrQBQs9HzjEf4Yr8sf2+/Bcv\n        gb9rTxhp7QlI7y9jv4Wxw4niSViP+Bs4+oNfrvZaOTj5P0r4u/4LGfs42s/hjSP2k9Lu44biwaLR9VtW\n        GPPidneGRSP4lYuDnqrDptwQD896KKKACiiigD6T/wCCVPgmTxV+1RHrPk7k0HQbu8LkcKzhbcD6kTH8\n        jX6TXmjZB+Svn7/gkX+zQ/gL4LXPxy1e8hmvPGyp9ihjBJtrOF5FAJ/vO+5iBwAqc5yB9WXmj4J+WgDz\n        +90gc/L9OKxtQ0nqCnXpXoN/pOB/q6w9R0rsF+lAHnuo6XgE7fqMVz+p6WoByv416FqemYJ+T9K57U9N\n        AyAv4YoAt6Tp+QOPyFdNpemjj5KpaPZcDC11Gk2GSPloAsaXpm7A2fhXQ6dpY4+Tms+51Tw74U0t9b8U\n        a5ZabZRDMt5qF0kMSfV3IA/OvGvit/wVM/ZC+EkUtrpHiyfxdqMYIW08NW/mx7u2bh9sW33RmPtQB9I2\n        OlDI+U/lXxr/AMFt/iLoOg/BDw58I4NThOr6v4gS/ls1kBkW0gilUuy9VBkkQAnrsbGcHHgvxr/4LKft\n        KeP/AD9L+FWn6d4I06TKpJaoLu+K+hmlXYPqkakdjXyn4o8V+KPG+vXHijxn4ivtW1K7ffdX+o3TzTSt\n        6s7kk/nQBn0UUUAFFFFAH60/8EhPjf4G+In7LmmfCFNeth4l8JvcxXmmSSATSWzzvLHOinlkxIEJHRk5\n        xkZ+o77ScA/L1r8AfDfibxH4O1y28TeEtevNL1GzlElpf6fctDNC4/iV0IKn6GvsL4Cf8Fqfjx4Ct4dC\n        +Nvhiy8bWMYC/bw4s79V6cuimOTA9UDHu/egD9ItQ0sZPy/XisDU9LAByvH8q8m+Gf8AwVa/Y0+KaR2+\n        p+M7zwpeyYH2XxNYmJAe/wC+jLxAe7Mv0r2XSPEvgzx5pf8AbfgfxZpms2Tfdu9Kvo7iI/8AAoyR+tAH\n        I6rpxAJK/pXNatp+Nx2/pXoOrWABOB+Fcxq9jycLg0AfN3xX/wCCmPwM+GM0ujeCLO58XajCSpaxkEVm\n        GHYzsDu+qKyn1r55+JH/AAVI/af8aCSz8Kalp3hW0YkBNIsw8xX3lm3EH3QJXzhRQBseMfiD48+ImonV\n        /H3jPVdauucXGq38lw4z2BcnA9hWPRRQAUUUUAFFFFABRRRQAUUUUAFX/DvinxN4Q1JdZ8JeI7/S7xPu\n        XenXjwSr9GQgj86oUUAfQHw0/wCCmf7Wfw98u11HxxD4ms0xm18SWonYjv8AvlKyk/Vz9K+kPg9/wVQ+\n        EHxFnh0P4q6BP4SvpSFF75v2ixZunLgB4sn+8pUd2r876KACiiigAooooAKKKKACiiigAooooAKKKKAC\n        iiigAooooA//2Q==\n</value>\n  </data>\n  <data name=\"ShipPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAA68AAAOvAGVvHJJAAACC0lE\n        QVRIS+2Uz6dCURDH3x8ZERGREq2iZUSkNhHR5raJeESiVUQkolWktIpIiYiINr3PudObl+5Vvafi0Xcx\n        vmfOzHzPz/k4PhlvgZt4C9yEu8BsNvs8w3Q6xdntdjudjngg+/1eh0ASnXAXmEwmhULB4/Gk0+lYLJbP\n        53GGw+FisYiTKZzZbDaVSsXjcYZAEp24dkTUGo/H/X4/GAzO53Ov1wvHyRRb9Pl8CFxZu+C2wOFw8Pv9\n        bIJyDEVguVxCHiMAoTq83W6rQK/XC4VCCCSTSTTYmZ3hgrsE5GS2260IAI6r2WzqHbRaLUlx4i4BXbgQ\n        zocnxPBhR3QhYE8avEIgGo1iwcnlwDUBVrderyFYWakSwd8/2gPxEoFGo8FvouGMRiMOgffHv8UK5MEI\n        5ytIwGq1IgUilkS6i1QAePgodn1bIBAIcJp4LctKJBI0nEgkwpBmUK/XRYAYOAISQC/a7XY4xZKYyWSk\n        AsjlcvyPwWDwI0CaTGuOWgIkRrhO8RuUk8hqarWaXd+SUljiTwK8Nj4kXs1Ra8p/72A4HOrUhQCdg7Zh\n        yrsKIM4S8GrObwVKpRL9w5R3FeDSaJl46cyLxQIPtyf5dn0TI1wDaE2kCJdyXIwpb3P0pEEZAXZHcrlc\n        rlQqLJOEarWqfsg5Pw/AwvGQSFGsgGAuebPZEGMEnoq3wE38d4Hj8QsNNpx18jKNggAAAABJRU5ErkJg\n        gg==\n</value>\n  </data>\n  <data name=\"WeaponPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAA68AAAOvAGVvHJJAAACC0lE\n        QVRIS+2Uz6dCURDH3x8ZERGREq2iZUSkNhHR5raJeESiVUQkolWktIpIiYiINr3PudObl+5Vvafi0Xcx\n        vmfOzHzPz/k4PhlvgZt4C9yEu8BsNvs8w3Q6xdntdjudjngg+/1eh0ASnXAXmEwmhULB4/Gk0+lYLJbP\n        53GGw+FisYiTKZzZbDaVSsXjcYZAEp24dkTUGo/H/X4/GAzO53Ov1wvHyRRb9Pl8CFxZu+C2wOFw8Pv9\n        bIJyDEVguVxCHiMAoTq83W6rQK/XC4VCCCSTSTTYmZ3hgrsE5GS2260IAI6r2WzqHbRaLUlx4i4BXbgQ\n        zocnxPBhR3QhYE8avEIgGo1iwcnlwDUBVrderyFYWakSwd8/2gPxEoFGo8FvouGMRiMOgffHv8UK5MEI\n        5ytIwGq1IgUilkS6i1QAePgodn1bIBAIcJp4LctKJBI0nEgkwpBmUK/XRYAYOAISQC/a7XY4xZKYyWSk\n        AsjlcvyPwWDwI0CaTGuOWgIkRrhO8RuUk8hqarWaXd+SUljiTwK8Nj4kXs1Ra8p/72A4HOrUhQCdg7Zh\n        yrsKIM4S8GrObwVKpRL9w5R3FeDSaJl46cyLxQIPtyf5dn0TI1wDaE2kCJdyXIwpb3P0pEEZAXZHcrlc\n        rlQqLJOEarWqfsg5Pw/AwvGQSFGsgGAuebPZEGMEnoq3wE38d4Hj8QsNNpx18jKNggAAAABJRU5ErkJg\n        gg==\n</value>\n  </data>\n  <metadata name=\"contextMenuStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/Controls/KillReportFittingContent.Designer.cs",
    "content": "﻿namespace EVEMon.Controls\n{\n    partial class KillReportFittingContent\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(KillReportFittingContent));\n            this.MainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.HeaderPanel = new System.Windows.Forms.Panel();\n            this.ToggleColorKeyPictureBox = new System.Windows.Forms.PictureBox();\n            this.SaveFittingButton = new System.Windows.Forms.Button();\n            this.FittingContentLabel = new System.Windows.Forms.Label();\n            this.FooterPanel = new System.Windows.Forms.Panel();\n            this.ItemsCostLabel = new System.Windows.Forms.Label();\n            this.EstimatedTotalLossLabel = new System.Windows.Forms.Label();\n            this.BorderPanel = new EVEMon.Common.Controls.BorderPanel();\n            this.noItemsLabel = new System.Windows.Forms.Label();\n            this.FittingContentListBox = new EVEMon.Common.Controls.NoFlickerListBox();\n            this.ColorKeyPanel = new System.Windows.Forms.Panel();\n            this.ColorKeyGroupBox = new System.Windows.Forms.GroupBox();\n            this.ColorKeyGroupBoxPanel = new System.Windows.Forms.Panel();\n            this.DroppedItemLabel = new System.Windows.Forms.Label();\n            this.DestroyedItemLabel = new System.Windows.Forms.Label();\n            this.toolTip = new System.Windows.Forms.ToolTip(this.components);\n            this.imageList = new System.Windows.Forms.ImageList(this.components);\n            this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.showInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.MainTableLayoutPanel.SuspendLayout();\n            this.HeaderPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.ToggleColorKeyPictureBox)).BeginInit();\n            this.FooterPanel.SuspendLayout();\n            this.BorderPanel.SuspendLayout();\n            this.ColorKeyPanel.SuspendLayout();\n            this.ColorKeyGroupBox.SuspendLayout();\n            this.ColorKeyGroupBoxPanel.SuspendLayout();\n            this.contextMenuStrip.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // MainTableLayoutPanel\n            // \n            this.MainTableLayoutPanel.AutoSize = true;\n            this.MainTableLayoutPanel.ColumnCount = 1;\n            this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.MainTableLayoutPanel.Controls.Add(this.HeaderPanel, 0, 0);\n            this.MainTableLayoutPanel.Controls.Add(this.FooterPanel, 0, 3);\n            this.MainTableLayoutPanel.Controls.Add(this.BorderPanel, 0, 2);\n            this.MainTableLayoutPanel.Controls.Add(this.ColorKeyPanel, 0, 1);\n            this.MainTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.MainTableLayoutPanel.Location = new System.Drawing.Point(0, 0);\n            this.MainTableLayoutPanel.Name = \"MainTableLayoutPanel\";\n            this.MainTableLayoutPanel.RowCount = 4;\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.Size = new System.Drawing.Size(338, 530);\n            this.MainTableLayoutPanel.TabIndex = 0;\n            // \n            // HeaderPanel\n            // \n            this.HeaderPanel.AutoSize = true;\n            this.HeaderPanel.Controls.Add(this.ToggleColorKeyPictureBox);\n            this.HeaderPanel.Controls.Add(this.SaveFittingButton);\n            this.HeaderPanel.Controls.Add(this.FittingContentLabel);\n            this.HeaderPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.HeaderPanel.Location = new System.Drawing.Point(0, 0);\n            this.HeaderPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.HeaderPanel.Name = \"HeaderPanel\";\n            this.HeaderPanel.Size = new System.Drawing.Size(338, 23);\n            this.HeaderPanel.TabIndex = 1;\n            // \n            // ToggleColorKeyPictureBox\n            // \n            this.ToggleColorKeyPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"ToggleColorKeyPictureBox.Image\")));\n            this.ToggleColorKeyPictureBox.Location = new System.Drawing.Point(123, 3);\n            this.ToggleColorKeyPictureBox.Name = \"ToggleColorKeyPictureBox\";\n            this.ToggleColorKeyPictureBox.Size = new System.Drawing.Size(16, 16);\n            this.ToggleColorKeyPictureBox.TabIndex = 2;\n            this.ToggleColorKeyPictureBox.TabStop = false;\n            this.toolTip.SetToolTip(this.ToggleColorKeyPictureBox, \"Toggle Color Key\");\n            this.ToggleColorKeyPictureBox.Click += new System.EventHandler(this.ToggleColorKeyPictureBox_Click);\n            // \n            // SaveFittingButton\n            // \n            this.SaveFittingButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.SaveFittingButton.Location = new System.Drawing.Point(263, 0);\n            this.SaveFittingButton.Margin = new System.Windows.Forms.Padding(0);\n            this.SaveFittingButton.Name = \"SaveFittingButton\";\n            this.SaveFittingButton.Size = new System.Drawing.Size(75, 23);\n            this.SaveFittingButton.TabIndex = 1;\n            this.SaveFittingButton.Text = \"Save Fitting\";\n            this.SaveFittingButton.UseVisualStyleBackColor = true;\n            // \n            // FittingContentLabel\n            // \n            this.FittingContentLabel.AutoSize = true;\n            this.FittingContentLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 9.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.FittingContentLabel.Location = new System.Drawing.Point(0, 3);\n            this.FittingContentLabel.Name = \"FittingContentLabel\";\n            this.FittingContentLabel.Size = new System.Drawing.Size(117, 16);\n            this.FittingContentLabel.TabIndex = 0;\n            this.FittingContentLabel.Text = \"Fitting and Content\";\n            // \n            // FooterPanel\n            // \n            this.FooterPanel.AutoSize = true;\n            this.FooterPanel.Controls.Add(this.ItemsCostLabel);\n            this.FooterPanel.Controls.Add(this.EstimatedTotalLossLabel);\n            this.FooterPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.FooterPanel.Location = new System.Drawing.Point(0, 514);\n            this.FooterPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.FooterPanel.Name = \"FooterPanel\";\n            this.FooterPanel.Size = new System.Drawing.Size(338, 16);\n            this.FooterPanel.TabIndex = 3;\n            // \n            // ItemsCostLabel\n            // \n            this.ItemsCostLabel.AutoSize = true;\n            this.ItemsCostLabel.Dock = System.Windows.Forms.DockStyle.Right;\n            this.ItemsCostLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 9.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.ItemsCostLabel.ForeColor = System.Drawing.Color.Red;\n            this.ItemsCostLabel.Location = new System.Drawing.Point(275, 0);\n            this.ItemsCostLabel.Name = \"ItemsCostLabel\";\n            this.ItemsCostLabel.Size = new System.Drawing.Size(63, 16);\n            this.ItemsCostLabel.TabIndex = 0;\n            this.ItemsCostLabel.Text = \"Unknown\";\n            // \n            // EstimatedTotalLossLabel\n            // \n            this.EstimatedTotalLossLabel.AutoSize = true;\n            this.EstimatedTotalLossLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 9.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.EstimatedTotalLossLabel.Location = new System.Drawing.Point(0, 0);\n            this.EstimatedTotalLossLabel.Name = \"EstimatedTotalLossLabel\";\n            this.EstimatedTotalLossLabel.Size = new System.Drawing.Size(99, 16);\n            this.EstimatedTotalLossLabel.TabIndex = 2;\n            this.EstimatedTotalLossLabel.Text = \"Est. Total Loss:\";\n            // \n            // BorderPanel\n            // \n            this.BorderPanel.AutoSize = true;\n            this.BorderPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.BorderPanel.BackColor = System.Drawing.SystemColors.Window;\n            this.BorderPanel.Controls.Add(this.noItemsLabel);\n            this.BorderPanel.Controls.Add(this.FittingContentListBox);\n            this.BorderPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.BorderPanel.Location = new System.Drawing.Point(0, 63);\n            this.BorderPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.BorderPanel.Name = \"BorderPanel\";\n            this.BorderPanel.Padding = new System.Windows.Forms.Padding(2, 2, 1, 2);\n            this.BorderPanel.Size = new System.Drawing.Size(338, 451);\n            this.BorderPanel.TabIndex = 4;\n            // \n            // noItemsLabel\n            // \n            this.noItemsLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n            this.noItemsLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noItemsLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noItemsLabel.Location = new System.Drawing.Point(2, 2);\n            this.noItemsLabel.Name = \"noItemsLabel\";\n            this.noItemsLabel.Size = new System.Drawing.Size(335, 447);\n            this.noItemsLabel.TabIndex = 5;\n            this.noItemsLabel.Text = \"No Items Found.\";\n            this.noItemsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // FittingContentListBox\n            // \n            this.FittingContentListBox.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.FittingContentListBox.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.FittingContentListBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;\n            this.FittingContentListBox.FormattingEnabled = true;\n            this.FittingContentListBox.Location = new System.Drawing.Point(2, 2);\n            this.FittingContentListBox.Name = \"FittingContentListBox\";\n            this.FittingContentListBox.Size = new System.Drawing.Size(335, 447);\n            this.FittingContentListBox.TabIndex = 4;\n            this.FittingContentListBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.FittingContentListBox_DrawItem);\n            this.FittingContentListBox.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.FittingContentListBox_MeasureItem);\n            this.FittingContentListBox.MouseDown += new System.Windows.Forms.MouseEventHandler(this.FittingContentListBox_MouseDown);\n            this.FittingContentListBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.FittingContentListBox_MouseMove);\n            this.FittingContentListBox.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.FittingContentListBox_MouseWheel);\n            this.FittingContentListBox.Resize += new System.EventHandler(this.FittingContentListBox_Resize);\n            // \n            // ColorKeyPanel\n            // \n            this.ColorKeyPanel.AutoSize = true;\n            this.ColorKeyPanel.Controls.Add(this.ColorKeyGroupBox);\n            this.ColorKeyPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ColorKeyPanel.Location = new System.Drawing.Point(0, 23);\n            this.ColorKeyPanel.Margin = new System.Windows.Forms.Padding(0, 0, 0, 2);\n            this.ColorKeyPanel.Name = \"ColorKeyPanel\";\n            this.ColorKeyPanel.Size = new System.Drawing.Size(338, 38);\n            this.ColorKeyPanel.TabIndex = 5;\n            // \n            // ColorKeyGroupBox\n            // \n            this.ColorKeyGroupBox.AutoSize = true;\n            this.ColorKeyGroupBox.Controls.Add(this.ColorKeyGroupBoxPanel);\n            this.ColorKeyGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ColorKeyGroupBox.Location = new System.Drawing.Point(0, 0);\n            this.ColorKeyGroupBox.Name = \"ColorKeyGroupBox\";\n            this.ColorKeyGroupBox.Size = new System.Drawing.Size(338, 38);\n            this.ColorKeyGroupBox.TabIndex = 2;\n            this.ColorKeyGroupBox.TabStop = false;\n            this.ColorKeyGroupBox.Text = \"Color Keys\";\n            // \n            // ColorKeyGroupBoxPanel\n            // \n            this.ColorKeyGroupBoxPanel.AutoSize = true;\n            this.ColorKeyGroupBoxPanel.Controls.Add(this.DroppedItemLabel);\n            this.ColorKeyGroupBoxPanel.Controls.Add(this.DestroyedItemLabel);\n            this.ColorKeyGroupBoxPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ColorKeyGroupBoxPanel.Location = new System.Drawing.Point(3, 16);\n            this.ColorKeyGroupBoxPanel.Name = \"ColorKeyGroupBoxPanel\";\n            this.ColorKeyGroupBoxPanel.Size = new System.Drawing.Size(332, 19);\n            this.ColorKeyGroupBoxPanel.TabIndex = 2;\n            // \n            // DroppedItemLabel\n            // \n            this.DroppedItemLabel.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.DroppedItemLabel.BackColor = System.Drawing.Color.Green;\n            this.DroppedItemLabel.Location = new System.Drawing.Point(207, 0);\n            this.DroppedItemLabel.Name = \"DroppedItemLabel\";\n            this.DroppedItemLabel.Size = new System.Drawing.Size(71, 19);\n            this.DroppedItemLabel.TabIndex = 0;\n            this.DroppedItemLabel.Text = \"Dropped Item\";\n            this.DroppedItemLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // DestroyedItemLabel\n            // \n            this.DestroyedItemLabel.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.DestroyedItemLabel.BackColor = System.Drawing.Color.LightGray;\n            this.DestroyedItemLabel.Location = new System.Drawing.Point(42, 0);\n            this.DestroyedItemLabel.Name = \"DestroyedItemLabel\";\n            this.DestroyedItemLabel.Size = new System.Drawing.Size(80, 19);\n            this.DestroyedItemLabel.TabIndex = 1;\n            this.DestroyedItemLabel.Text = \"Destroyed Item\";\n            this.DestroyedItemLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // imageList\n            // \n            this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"imageList.ImageStream\")));\n            this.imageList.TransparentColor = System.Drawing.Color.Transparent;\n            this.imageList.Images.SetKeyName(0, \"Hold.png\");\n            this.imageList.Images.SetKeyName(1, \"Cargo.png\");\n            this.imageList.Images.SetKeyName(2, \"HighSlot.png\");\n            this.imageList.Images.SetKeyName(3, \"MediumSlot.png\");\n            this.imageList.Images.SetKeyName(4, \"LowSlot.png\");\n            this.imageList.Images.SetKeyName(5, \"RigSlot.png\");\n            this.imageList.Images.SetKeyName(6, \"SubsystemSlot.png\");\n            this.imageList.Images.SetKeyName(7, \"DroneBay.png\");\n            this.imageList.Images.SetKeyName(8, \"Implant.png\");\n            this.imageList.Images.SetKeyName(9, \"Booster.png\");\n            // \n            // contextMenuStrip\n            // \n            this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showInBrowserMenuItem});\n            this.contextMenuStrip.Name = \"contextMenuStrip\";\n            this.contextMenuStrip.Size = new System.Drawing.Size(171, 26);\n            this.contextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip_Opening);\n            // \n            // showInBrowserMenuItem\n            // \n            this.showInBrowserMenuItem.Name = \"showInBrowserMenuItem\";\n            this.showInBrowserMenuItem.Size = new System.Drawing.Size(170, 22);\n            this.showInBrowserMenuItem.Text = \"Show In Browser...\";\n            this.showInBrowserMenuItem.Click += new System.EventHandler(this.showInBrowserMenuItem_Click);\n            // \n            // KillReportFittingContent\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.MainTableLayoutPanel);\n            this.Name = \"KillReportFittingContent\";\n            this.Size = new System.Drawing.Size(338, 530);\n            this.MainTableLayoutPanel.ResumeLayout(false);\n            this.MainTableLayoutPanel.PerformLayout();\n            this.HeaderPanel.ResumeLayout(false);\n            this.HeaderPanel.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.ToggleColorKeyPictureBox)).EndInit();\n            this.FooterPanel.ResumeLayout(false);\n            this.FooterPanel.PerformLayout();\n            this.BorderPanel.ResumeLayout(false);\n            this.ColorKeyPanel.ResumeLayout(false);\n            this.ColorKeyPanel.PerformLayout();\n            this.ColorKeyGroupBox.ResumeLayout(false);\n            this.ColorKeyGroupBox.PerformLayout();\n            this.ColorKeyGroupBoxPanel.ResumeLayout(false);\n            this.contextMenuStrip.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel MainTableLayoutPanel;\n        private System.Windows.Forms.Panel HeaderPanel;\n        private System.Windows.Forms.Button SaveFittingButton;\n        private System.Windows.Forms.Label FittingContentLabel;\n        private System.Windows.Forms.Panel FooterPanel;\n        private System.Windows.Forms.Label ItemsCostLabel;\n        private System.Windows.Forms.Label EstimatedTotalLossLabel;\n        private Common.Controls.NoFlickerListBox FittingContentListBox;\n        private System.Windows.Forms.Label noItemsLabel;\n        private Common.Controls.BorderPanel BorderPanel;\n        private System.Windows.Forms.Panel ColorKeyPanel;\n        private System.Windows.Forms.PictureBox ToggleColorKeyPictureBox;\n        private System.Windows.Forms.Label DestroyedItemLabel;\n        private System.Windows.Forms.Label DroppedItemLabel;\n        private System.Windows.Forms.ToolTip toolTip;\n        private System.Windows.Forms.GroupBox ColorKeyGroupBox;\n        private System.Windows.Forms.Panel ColorKeyGroupBoxPanel;\n        private System.Windows.Forms.ImageList imageList;\n        private System.Windows.Forms.ContextMenuStrip contextMenuStrip;\n        private System.Windows.Forms.ToolStripMenuItem showInBrowserMenuItem;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/KillReportFittingContent.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\nusing EVEMon.SkillPlanner;\n\nnamespace EVEMon.Controls\n{\n    public partial class KillReportFittingContent : UserControl\n    {\n        #region Fields\n\n        private const TextFormatFlags Format = TextFormatFlags.NoPadding | TextFormatFlags.NoClipping | TextFormatFlags.NoPrefix;\n\n        // KillReportFittingContent drawing - Region & text padding\n        private const byte PadLeft = 6;\n        private const byte PadRight = 7;\n\n        // KillReportFittingContent drawing - Item\n        private const byte FittingDetailHeight = 26;\n        private const byte ItemImageSize = 24;\n\n        private readonly Font m_fittingFont;\n        private readonly Font m_fittingBoldFont;\n\n        private KillLog m_killLog;\n        private Item m_selectedItem;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"KillReportFittingContent\"/> class.\n        /// </summary>\n        public KillReportFittingContent()\n        {\n            InitializeComponent();\n\n            FittingContentListBox.Visible = false;\n            SaveFittingButton.Visible = false;\n            ColorKeyGroupBox.Visible = false;\n\n            m_fittingFont = FontFactory.GetFont(\"Tahoma\", 8.25F);\n            m_fittingBoldFont = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            noItemsLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the kill log.\n        /// </summary>\n        /// <value>\n        /// The kill log.\n        /// </value>\n        internal KillLog KillLog\n        {\n            get { return m_killLog; }\n            set\n            {\n                m_killLog = value;\n\n                if (!DesignMode || this.IsDesignModeHosted())\n                    UpdateContent();\n            }\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load subscribe the events.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.ItemPricesUpdated += EveMonClient_ItemPricesUpdated;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Called when disposed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.ItemPricesUpdated -= EveMonClient_ItemPricesUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        #endregion\n\n\n        #region Content Management\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // Update the standings list\n            FittingContentListBox.BeginUpdate();\n            try\n            {\n                IList<KillLogItem> items = m_killLog.Items.ToList();\n                IEnumerable<IGrouping<KillLogFittingContentGroup, KillLogItem>> groups = items\n                    .GroupBy(item => item.FittingContentGroup).OrderBy(x => x.Key);\n\n                // Scroll through groups\n                FittingContentListBox.Items.Clear();\n                foreach (IGrouping<KillLogFittingContentGroup, KillLogItem> group in groups)\n                {\n                    FittingContentListBox.Items.Add(group.Key);\n\n                    foreach (KillLogItem item in group)\n                    {\n                        // Add the item to the list\n                        AddItem(item);\n\n                        if (!item.Items.Any())\n                            continue;\n\n                        // Add items in a container to the list\n                        foreach (KillLogItem itemInItem in item.Items)\n                        {\n                            AddItem(itemInItem);\n                        }\n                    }\n                }\n\n                // Display or hide the \"no standings\" label.\n                noItemsLabel.Visible = !items.Any();\n                FittingContentListBox.Visible = items.Any();\n\n\n                // Invalidate display\n                FittingContentListBox.Invalidate();\n            }\n            finally\n            {\n                FittingContentListBox.EndUpdate();\n                ItemsCostLabel.Text = GetTotalCost();\n            }\n        }\n\n        /// <summary>\n        /// Adds the item.\n        /// </summary>\n        /// <param name=\"item\">The item.</param>\n        private void AddItem(KillLogItem item)\n        {\n            bool eventHandlerAdded = false;\n\n            // Add if the item was destroyed\n            if (item.QtyDestroyed > 0)\n            {\n                FittingContentListBox.Items.Add(item);\n                item.KillLogItemImageUpdated += item_KillLogItemImageUpdated;\n                eventHandlerAdded = true;\n            }\n\n            // Re-add if the item was also dropped\n            if (item.QtyDropped <= 0)\n                return;\n\n            FittingContentListBox.Items.Add(item);\n            if (!eventHandlerAdded)\n                item.KillLogItemImageUpdated += item_KillLogItemImageUpdated;\n        }\n\n        /// <summary>\n        /// Gets the total cost.\n        /// </summary>\n        /// <returns></returns>\n        private string GetTotalCost()\n        {\n            double shipCost = Settings.MarketPricer.Pricer != null\n                ? Settings.MarketPricer.Pricer.GetPriceByTypeID(m_killLog.Victim.ShipTypeID)\n                : 0;\n            bool unknownCost = m_killLog.Victim.ShipTypeID != DBConstants.CapsuleID && Math.Abs(shipCost) < double.Epsilon;\n            double totalCost = shipCost;\n\n            // Get the items cost\n            double itemsCost;\n            unknownCost |= GetItemsCost(m_killLog.Items, out itemsCost);\n            totalCost += itemsCost;\n\n            return unknownCost ? EveMonConstants.UnknownText : $\" {totalCost:N2} ISK\";\n        }\n\n        /// <summary>\n        /// Gets the items cost.\n        /// </summary>\n        /// <param name=\"items\">The items.</param>\n        /// <param name=\"totalCost\">The total cost.</param>\n        /// <returns></returns>\n        private static bool GetItemsCost(IEnumerable<KillLogItem> items, out double totalCost)\n        {\n            bool unknownCost = false;\n            double itemCost = 0d;\n            foreach (KillLogItem item in items)\n            {\n                double price = item.Price;\n                unknownCost |= Math.Abs(price) < double.Epsilon;\n                itemCost += price * (item.QtyDestroyed + item.QtyDropped);\n\n                if (!item.Items.Any())\n                    continue;\n\n                unknownCost |= GetItemsCost(item.Items, out totalCost);\n                itemCost += totalCost;\n            }\n\n            totalCost = itemCost;\n\n            return unknownCost;\n        }\n\n        #endregion\n\n\n        #region Drawing\n\n        /// <summary>\n        /// Handles the MeasureItem event of the FittingContentListBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MeasureItemEventArgs\"/> instance containing the event data.</param>\n        private void FittingContentListBox_MeasureItem(object sender, MeasureItemEventArgs e)\n        {\n            if (e.Index >= 0)\n                e.ItemHeight = FittingDetailHeight;\n        }\n\n        /// <summary>\n        /// Handles the DrawItem event of the FittingContentListBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        private void FittingContentListBox_DrawItem(object sender, DrawItemEventArgs e)\n        {\n            if (e.Index < 0 || e.Index >= FittingContentListBox.Items.Count)\n                return;\n\n            object listItem = FittingContentListBox.Items[e.Index];\n            KillLogItem item = listItem as KillLogItem;\n            if (item != null)\n            {\n                // If item is the same with previous item then we previously have drawn a destroyed item\n                // and now we need to draw a dropped one\n                if (FittingContentListBox.Items[e.Index - 1] == item)\n                    DrawItem(item, e, true);\n                else\n                {\n                    // Draw a destroyed item or dropped one\n                    if (item.QtyDestroyed > 0)\n                        DrawItem(item, e);\n                    else\n                        DrawItem(item, e, true);\n                }\n            }\n            else\n                DrawItem((KillLogFittingContentGroup)listItem, e);\n        }\n\n        /// <summary>\n        /// Draws the item.\n        /// </summary>\n        /// <param name=\"item\">The item.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DrawItemEventArgs\"/> instance containing the event data.</param>\n        /// <param name=\"itemIsDropped\">if set to <c>true</c> item is dropped.</param>\n        private void DrawItem(KillLogItem item, DrawItemEventArgs e, bool itemIsDropped = false)\n        {\n            Graphics g = e.Graphics;\n\n            // Draw background\n            g.FillRectangle(itemIsDropped ? Brushes.Green : Brushes.LightGray, e.Bounds);\n\n            int itemQty = itemIsDropped ? item.QtyDropped : item.QtyDestroyed;\n            int inContainerPad = item.IsInContainer ? PadLeft * 2 : 0;\n\n            // Texts size measure\n            Size itemTextSize = TextRenderer.MeasureText(g, item.Name, m_fittingFont, Size.Empty, Format);\n            Size itemQtyTextSize = TextRenderer.MeasureText(g, itemQty.ToNumericString(0), m_fittingFont);\n\n            Rectangle itemTextRect = new Rectangle(e.Bounds.Left + inContainerPad + PadLeft * 2 + ItemImageSize,\n                e.Bounds.Top + (e.Bounds.Height - itemTextSize.Height) / 2,\n                itemTextSize.Width + PadRight, itemTextSize.Height);\n            Rectangle itemQtyTextRect = new Rectangle(e.Bounds.Right - itemQtyTextSize.Width - PadRight,\n                e.Bounds.Top + (e.Bounds.Height - itemTextSize.Height) / 2,\n                itemQtyTextSize.Width + PadRight, itemQtyTextSize.Height);\n\n            // Draw texts\n            TextRenderer.DrawText(g, item.Name, m_fittingFont, itemTextRect, Color.Black);\n            TextRenderer.DrawText(g, itemQty.ToNumericString(0), m_fittingFont, itemQtyTextRect, Color.Black);\n\n            // Draw the image\n            if (Settings.UI.SafeForWork)\n                return;\n\n            g.DrawImage(item.ItemImage, new Rectangle(e.Bounds.Left + inContainerPad + PadLeft * 2,\n                e.Bounds.Top + (e.Bounds.Height - ItemImageSize) / 2,\n                ItemImageSize, ItemImageSize));\n        }\n\n        /// <summary>\n        /// Draws the list item for the given group.\n        /// </summary>\n        /// <param name=\"group\"></param>\n        /// <param name=\"e\"></param>\n        private void DrawItem(KillLogFittingContentGroup group, DrawItemEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            using (Brush brush = Settings.UI.SafeForWork\n                ? new SolidBrush(Color.FromArgb(75, 75, 75))\n                : (Brush)new LinearGradientBrush(new PointF(0F, 0F), new PointF(0F, FittingDetailHeight),\n                    Color.FromArgb(75, 75, 75), Color.FromArgb(25, 25, 25)))\n            {\n                g.FillRectangle(brush, e.Bounds);\n            }\n\n            using (Pen pen = new Pen(Color.FromArgb(100, 100, 100)))\n            {\n                g.DrawLine(pen, e.Bounds.Left, e.Bounds.Top, e.Bounds.Right + 1, e.Bounds.Top);\n            }\n\n            Size fittingGroupTextSize = TextRenderer.MeasureText(g, group.GetDescription(), m_fittingBoldFont, Size.Empty, Format);\n            Rectangle fittingGroupTextRect = new Rectangle(e.Bounds.Left + PadLeft / 3 + ItemImageSize,\n                e.Bounds.Top +\n                (e.Bounds.Height - fittingGroupTextSize.Height) / 2,\n                fittingGroupTextSize.Width + PadRight,\n                fittingGroupTextSize.Height);\n\n            TextRenderer.DrawText(g, group.GetDescription(), m_fittingBoldFont, fittingGroupTextRect, Color.White);\n\n            // Draw the group image\n            if (Settings.UI.SafeForWork)\n                return;\n\n            Rectangle fittingGroupImageRect = new Rectangle(e.Bounds.Left + PadLeft / 3,\n                e.Bounds.Top + (e.Bounds.Height - ItemImageSize) / 2,\n                ItemImageSize, ItemImageSize);\n\n            g.DrawImage(GetGroupImage(group), fittingGroupImageRect);\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the group image.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <returns></returns>\n        private Image GetGroupImage(KillLogFittingContentGroup group)\n        {\n            switch (group)\n            {\n                case KillLogFittingContentGroup.Cargo:\n                case KillLogFittingContentGroup.Other:\n                    return imageList.Images[1];\n                case KillLogFittingContentGroup.HighSlot:\n                    return imageList.Images[2];\n                case KillLogFittingContentGroup.MediumSlot:\n                    return imageList.Images[3];\n                case KillLogFittingContentGroup.LowSlot:\n                    return imageList.Images[4];\n                case KillLogFittingContentGroup.RigSlot:\n                    return imageList.Images[5];\n                case KillLogFittingContentGroup.SubsystemSlot:\n                    return imageList.Images[6];\n                case KillLogFittingContentGroup.DroneBay:\n                    return imageList.Images[0];\n                case KillLogFittingContentGroup.Implant:\n                case KillLogFittingContentGroup.Booster:\n                    return imageList.Images[8];\n                default:\n                    return imageList.Images[0];\n            }\n        }\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// Handles the MouseWheel event of the FittingContentListBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void FittingContentListBox_MouseWheel(object sender, MouseEventArgs e)\n        {\n            if (e.Delta == 0)\n                return;\n\n            // Update the drawing based upon the mouse wheel scrolling\n            int numberOfItemLinesToMove = e.Delta * SystemInformation.MouseWheelScrollLines / Math.Abs(e.Delta);\n            int lines = numberOfItemLinesToMove;\n            if (lines == 0)\n                return;\n\n            // Compute the number of lines to move\n            int direction = lines / Math.Abs(lines);\n            int[] numberOfPixelsToMove = new int[lines * direction];\n            for (int i = 1; i <= Math.Abs(lines); i++)\n            {\n                object item = null;\n\n                // Going up\n                if (direction == Math.Abs(direction))\n                {\n                    // Retrieve the next top item\n                    if (FittingContentListBox.TopIndex - i >= 0)\n                        item = FittingContentListBox.Items[FittingContentListBox.TopIndex - i];\n                }\n                    // Going down\n                else\n                {\n                    // Compute the height of the items from current the topindex (included)\n                    int height = 0;\n                    for (int j = FittingContentListBox.TopIndex + i - 1; j < FittingContentListBox.Items.Count; j++)\n                    {\n                        height += FittingDetailHeight;\n                    }\n\n                    // Retrieve the next bottom item\n                    if (height > FittingContentListBox.ClientSize.Height)\n                        item = FittingContentListBox.Items[FittingContentListBox.TopIndex + i - 1];\n                }\n\n                // If found a new item as top or bottom\n                if (item != null)\n                    numberOfPixelsToMove[i - 1] = FittingDetailHeight * direction;\n                else\n                    lines -= direction;\n            }\n\n            // Scroll \n            if (lines != 0)\n                FittingContentListBox.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the FittingContentListBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void FittingContentListBox_MouseDown(object sender, MouseEventArgs e)\n        {\n            // Retrieve the item at the given point and quit if none\n            int index = FittingContentListBox.IndexFromPoint(e.Location);\n            if (index < 0 || index >= FittingContentListBox.Items.Count)\n                return;\n\n            KillLogItem killLogItem = FittingContentListBox.Items[index] as KillLogItem;\n\n            // Beware, this last index may actually means a click in the whitespace at the bottom\n            // Let's deal with this special case\n            if (index == FittingContentListBox.Items.Count - 1)\n            {\n                Rectangle itemRect = FittingContentListBox.GetItemRectangle(index);\n                if (!itemRect.Contains(e.Location))\n                    killLogItem = null;\n            }\n\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            // Right click reset the cursor\n            FittingContentListBox.Cursor = Cursors.Default;\n\n            // Set the selected item\n            m_selectedItem = killLogItem?.Item;\n\n            // Display the context menu\n            contextMenuStrip.Show(FittingContentListBox, e.Location);\n        }\n\n        /// <summary>\n        /// Handles the MouseMove event of the FittingContentListBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void FittingContentListBox_MouseMove(object sender, MouseEventArgs e)\n        {\n            for (int i = 0; i < FittingContentListBox.Items.Count; i++)\n            {\n                // Skip until we found the mouse location\n                Rectangle rect = FittingContentListBox.GetItemRectangle(i);\n                if (!rect.Contains(e.Location))\n                    continue;\n\n                object item = FittingContentListBox.Items[i];\n                FittingContentListBox.Cursor = item is KillLogItem ? CustomCursors.ContextMenu : Cursors.Default;\n\n                return;\n            }\n\n            // If we went so far, we're not over anything\n            FittingContentListBox.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the contextMenuStrip control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\" /> instance containing the event data.</param>\n        private void contextMenuStrip_Opening(object sender, CancelEventArgs e)\n        {\n            e.Cancel = m_selectedItem == null;\n\n            if (e.Cancel || m_selectedItem == null)\n                return;\n\n            Ship ship = m_selectedItem as Ship;\n            Blueprint blueprint = StaticBlueprints.GetBlueprintByID(m_selectedItem.ID);\n            Skill skill = m_killLog.Character.Skills[m_selectedItem.ID];\n            \n            if (skill == Skill.UnknownSkill)\n                skill = null;\n\n            string text = ship != null ? \"Ship\" : blueprint != null ? \"Blueprint\" : skill != null ? \"Skill\" : \"Item\";\n\n            showInBrowserMenuItem.Text = $\"Show In {text} Browser...\";\n\n        }\n\n        /// <summary>\n        /// Handles the Click event of the showInBrowserMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void showInBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            if (m_selectedItem == null)\n                return;\n\n            Ship ship = m_selectedItem as Ship;\n            Blueprint blueprint = StaticBlueprints.GetBlueprintByID(m_selectedItem.ID);\n            Skill skill = m_killLog.Character.Skills[m_selectedItem.ID];\n\n            if (skill == Skill.UnknownSkill)\n                skill = null;\n\n            PlanWindow planWindow = PlanWindow.ShowPlanWindow(m_killLog.Character);\n\n            if (ship != null)\n                planWindow.ShowShipInBrowser(ship);\n            else if (blueprint != null)\n                planWindow.ShowBlueprintInBrowser(blueprint);\n            else if (skill != null)\n                planWindow.ShowSkillInBrowser(skill);\n            else\n                planWindow.ShowItemInBrowser(m_selectedItem);\n\n\n        }\n\n        /// <summary>\n        /// Handles the KillLogItemImageUpdated event of the item control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void item_KillLogItemImageUpdated(object sender, EventArgs e)\n        {\n            // Force to redraw\n            FittingContentListBox.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the Resize event of the FittingContentListBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void FittingContentListBox_Resize(object sender, EventArgs e)\n        {\n            FittingContentListBox.Invalidate();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the ToggleColorKeyPictureBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void ToggleColorKeyPictureBox_Click(object sender, EventArgs e)\n        {\n            ColorKeyGroupBox.Visible = !ColorKeyGroupBox.Visible;\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Handles the SettingsChanged event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            // No need to do this if control is not visible\n            if (!Visible)\n                return;\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Occurs when the item prices get updated.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_ItemPricesUpdated(object sender, EventArgs e)\n        {\n            ItemsCostLabel.Text = GetTotalCost();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/KillReportFittingContent.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"ToggleColorKeyPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQg\n        djMuMzap5+IlAAADF0lEQVQ4T22Sa0hTYRzGX21dsIsfukeFJV0ouoCNzFtkqUPToZY1h0FWOptNE6fT\n        xNkSL12oNKZ2wXmptGzznk7TbaWpHTOdYl7KSAMj9UsfCoye3p1NDeqBPy+Hc36/P+c5h/yTMMbNPr6r\n        0D2957P31Z5px+TOia3S9gabiPZQes/K8tR/EsbYrIp++1CsGkK6ZgTy0mHIS4YgfzQAeXE/Qq53Yn1k\n        y8dd0hd7LMRfobBdXNfotZpRKNSfIC8bgVI7hrHJn9C0jc9KEh4YsSa0adolsS7AQpqzWMzclz3+gOiC\n        QUhUdPIHoOn4ClPej32HJLcbEmUXJHc6EZLWimWnm75dulm00UyHMc5emUaI7/ZCeLsHwiwje55TGlGs\n        G0PsfXqd0Q5h2msIU1sgVLzEztM1sJc0qfPy8uYTjoi5fSqrG7yUNvAUHeBdeQPBjbdIKupHUmEfonLe\n        gZegBy++GbzYRvBitHAKr8bC4MYJKthBVkcx7w6ndMBO1IzdUXpwY/RwjTdA1/ONfYXOwSlwI+rADa+F\n        w9lqbAvWYJ1fKYh/7e8rWSoPskXK/NgZ0wpysglEqIc1HU5wM5JLhlmBoW8SC/hV4HhrQDyeghx6DOJa\n        BMJTw/9yhZRsjGG+2on0IMcbQE68ME9QI2TFg6xA1zsJ4lMB4vUM5DDdfPAhiHMByNFKiDJLLxBbMVO1\n        I5IK/J+DBNSBBNazp6xowCwwTrDbZre7FYM4qWB9XPszJ/eup+krSLdHGkB8q0D8qkH4NewpK+g3C2gX\n        LOxeMrf9QD5sz+kGaYkOJoHtCnHb5DyfchDvuUlU9bGCl0YqmIFdClmYLvkdqChXUMFK9leYF/7GyzqI\n        duBZxs4SfjkqWr+wgvGpH7AX0A5mYPoam6J1dRTex8IzWXq+TWYlaP5FjjzBcr4ajmItHCPq4Sh6Dvsg\n        2oEJpmWuvWB4nZGdH0AFHAs6lw3RBu6iM69GyDGtuXlT66b2aS+cEN1396TaWxTk/hf+O74plU574xoT\n        Nl/UP9ov0yoFqeqz2Tn3TOAqyyOWEPIHBJYDyhb2tHAAAAAASUVORK5CYII=\n</value>\n  </data>\n  <metadata name=\"toolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"imageList.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>107, 17</value>\n  </metadata>\n  <data name=\"imageList.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAB0\n        XwAAAk1TRnQBSQFMAgEBCgEAARgBAAEYAQABIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA\n        AwABYAMAAQEBAAEgBgABwC0AAQEDAAEBAwABAQMIAQsDDAEQAwoBDQMBAQIDAAEBAwABAQMAAQEDAAEB\n        AwABAQMAAQEDAAEBAwABAQMAAQEDAAEBAwABAQMAAQEDAAEBAwABAUgAAwUBBwMRARcDGwEmAx8BLAML\n        AQ8DAgEDAwABAf8ASAABAQMEAQUDCQEMAxABFgMeASsDJwE7AyQBNgMOARMDCgEOAwoBDQMKAQ4DDAEQ\n        Aw0BEQMNARIDDQESAw0BEgMNAREDDAEQAwkBDAMFAQcDBAEFAwMBBAMCAQMDAQECAwABATMABAEBAgME\n        AQYDIwE0AzoBYQNHAYMDSgGNAzEBTQMaASUDCwEPAwIBAwMBAQIDAAEB/wA5AAMCAQMDEgEZAyUBNwMy\n        AVEDNQFWAT8CQAFuA0ABcAMnATsDIwEzAyIBMQMkATUDKwFDAy0BRQMsAUQDKwFCAykBPwMmATkDIgEy\n        AxsBJgMPARQDCQEMAwYBCAMEAQYDAwEEAwABAS8AAQEDBAEGAwoBDQMTARoDRAF7A1MBugJRAVIB3QJX\n        AV8B6ANRAaADOgFhAyEBMAMOARMDCgENAwUBBwMBAQL/ADUAAwYBCAMvAUkDTQGXA1MBxgNHAYMBTQJO\n        AZYBUwJVAbADSAGEA0QBegNDAXcDSAGGA1EBswNRAa8DUAGqA08BogNNAZcDRgGBAz8BbQMzAVMDHgEr\n        AxABFgMJAQwDBQEHAwQBBQMAAQEsAAMEAQUDDgETAx0BKQMtAUYDUQHRAzAB/wM0Af8DVwH/A24B7wNY\n        AbMDPgFrAygBPAMdASkDEQEXAwcBCQMAAQH/ADEAAyABLwE+Aj8BbANMAZMDSAGFA1ABoANTAbwDUwHH\n        A1UBtwFUAlYBvgNTAawDTQGWA0sBkgNEAXoDQQFyA0ABcQM/AW0DOwFkAzUBVgMrAUIDHAEnAw4BEwMG\n        AQgDAgEDAwABASsABAEBAgMjATQDQAFwA1ABpwNSAcgDPQHxAy4B/wM5Af8DUwH/A3MB+gNuAegDYAHN\n        A1QBrwNIAYUDOAFdAyQBNgMQARUDBQEHAwEBAv8AKQADJwE6A0IBdANMAZIDQwF4AVMBVAFTAbABVwJY\n        AdEBVAJWAdIDUQGmAVQCVQHBAlEBUgGpA0gBhQNEAXoDOgFiAzgBXQM6AWEDPAFnAzwBZwM2AVkDKgFA\n        AxYBHgMKAQ0DAwEEAwABASwAAwUBBwMTARoDRQF9A1oBwANWAegDNQH5AzMB/gNEAf8DWwH/A20B/wOO\n        Af8DoAH9A54B9wOHAeoDZAHLA1ABnQM8AWgDJgE5AxEBFwMFAQcDAAEB/wAlAAMeASsDOAFdA0YBgQNE\n        AXwDUAGdA1sBxgFZAVsBWQHQA0sBjwNSAa0DTQGYA0MBdwNAAXADOwFkAzsBZAM+AWsDQgF1A0MBeAM/\n        AW0DNAFUAx8BLAMMARADAgEDMAADEAEWAzQBVANgAcUDcAH1A2AB/wMkAf8DOAH/A1wB/wOBAf8DkAH/\n        A6sB/wPIAf8D4AH/A+YB/wOoAfUDaAHNA00BlgM5AWADHwEsAwoBDgMAAQH/ACUAAwEBAgMaASUDMgFR\n        A0ABcAM0AVUDSgGLA1sBwwNPAa4DUAGuA08BoQNKAY0DQwF3A0QBewNGAYEDSAGFA0gBhQNIAYgDSQGL\n        A0gBhgNAAXEDHQEpAwcBCQMAAQEsAAMgAS8DVQG6A5EB7gOqAf8DcwH/AyIB/wM6Af8DYwH/A4sB/wOb\n        Af8DuQH/A9sB/wP2Bf8D8gH/A4kB5ANVAbUDRAF6AyoBQAMSARgDAQEC/wAlAAMDAQQDEgEZAyEBMAMo\n        ATwDKAE8A0UBfQNUAb0DUAG/A1ABsANPAaADSwGQA0UBfgNNAZYBUAJSAaMBTwJQAZ4DRwGCA0QBegNE\n        AXsDRQF+A0QBeQMqAUADEwEaAwMBBCsAAQEDJAE1A1wB0QOeAfMDrAH+A38B/gM7Af4DTQH/A28B/wOS\n        Af8DngH/A7sB/wPZAf8D6AH+A+gB/QPgAf4DiQHlA1cBuANEAXsDMAFMAxkBIwMEAQb/ACUAAwoBDgMo\n        AT0DPwFtA0YBfwFIAkkBhAFUAlYBrAFYAVsBXAHUAVIBVQFXAdoBVQFYAVkBzgFXAVgBWQHEAVMCVAG8\n        A1ABsQFdAmABygFjAmwB1QFdAmQBzQFSAlMBrQNDAXgDPQFpAz4BawM/AW0DMQFOAx0BKQMIAQsDAAEB\n        JwABAQMdASkDUQGiAY8CjgHlAbwBugG3Af0BpQGiAZsB/gJ/AXcB/gGPAY0BgAH/AZ4BmQGJAf8BqwGj\n        AY8B/wGwAaYBkgH/AcUBvgG0Af8B0AHLAccB/wHPAcsBxgH+Ac4ByAG8AfwBwQG9AbUB/AF4AXYBdQHb\n        A1MBqgNDAXcDNAFVAx8BLAMIAQv/ACUAAxEBFwM9AWgBWgJcAb0BXgJgAd4BWwFgAWEB3gFcAWQBaQHn\n        AU8BXQFoAfABSgFRAVwB8wFLAVgBWQHvAU8BXAFdAe0BRgFSAVgB7AEyATUBNwHpAWsBcgF0AfcBfgGT\n        AZYB/AFwAYUBhgH1AVUBWwFdAeEDRgGAAzcBWgM0AVQDNQFXAzEBTwMjATMDDwEUAwEBAicAAQEDEwEa\n        AzsBZAF4AncB0wHCAb4BuAH8Ac8BygG4Af4ByAHGAaoB/gHPAckBqwH/AcsBvQGXAf8BxQGwAYIB/wHC\n        AakBeQH/AdEBwQGqAf8BzQHDAbgB/wG/AbUBqQH+Ab4BsQGXAf0BpAGbAYkB+wJoAWEBzwNNAZYDQAFx\n        AzcBWwMkATUDDQER/wAlAAMQARYDQAFxAU0BUwFVAdMBBwEMAQ8B/QEUASQBKwH8ASMBPQFKAfwBJwFD\n        AVoB/AETASIBKwH8ARQBIAEqAfwBHAErAT0B/AEbAS0BPgH8AQQCBQH9AVgBZAFoAfwBeQGGAYsB/AFy\n        AYIBhwH8AVMBaAFtAf0DSwGOAzQBVQMrAUIDLQFFAywBRAMkATUDFgEfAwQBBQMAAQEkAAMQARUDMwFS\n        AnEBbgHNAcMBvQGtAfsB5AHdAcEB/wHoAeQBvAH/AeQB2gGvAf8B2AHDAYwB/wHMAasBaAH/AccBoQFg\n        Af8B2AHDAaQB/wHeAdABwgH/AdoBygG4Af8BzgGxAYUB/wGdAZEBawH7AWMBYAFbAcgDSgGLAz0BaQM4\n        AV0DKAE9AxIBGAMAAQH/ACEAAxIBGANCAXMBVAFeAWMB1QEkAUEBXQH8ARUBKQE0Af0BIQE6AUAB/QEw\n        AVIBYgH9ASsBWAFqAfsBFwErATYB/QEZAS0BOQH9AR4BOQFDAf0BFAEmASwB/AFbAWcBbwH7AXgBhwGN\n        AfwBdQGEAYkB/AFWAW0BbwH8AUgCSQGHAywBQwMbASYDHAEoAx8BLAMcASgDFgEeAwkBDAMEAQYDAQEC\n        AwABARwAAxABFQM0AVQBcQJuAc0BvwG3AawB+gHjAd0BvwH/AecB4wG4Af8B4QHWAagB/wHVAbwBggH/\n        AckBoQFeAf8BxQGZAVgB/wHWAb4BoAH/AdMBxQG4Af8ByAG3AagB/wHEAaIBdgH/AZ8BhAFtAfoBYQFe\n        AVsBxANIAYQDOgFhAzcBWgMqAUEDFwEgAwIBAwMAAQH/AB0AAxMBGgNCAXYBUAFdAWEB1wE0AWQBfAH8\n        ASgBQAFNAf0BJQE8AUMB/QErAUUBUwH9ATABXwF4AfwBKAFCAVEB/QEiATkBQQH9ARwBMQE8Af0BEgEi\n        ASsB/QFVAWkBcgH8AXgBhwGOAfwBeAGGAYoB/AFTAWoBbAH9A0cBggMmATgDEQEXAxIBGAMUARsDFAEb\n        AxEBFwMMARADBwEJAwMBBAMBAQIcAAMQARYDNQFWAXECbgHNAb0BtgGsAfoB4wHdAb0B/wHmAeEBtQH/\n        Ad8B0gGiAf8B0wG1AXkB/wHHAZoBWAH/AcMBkgFTAf8BzgG0AZgB/wHGAbgBrAH/AbwBqwGdAf8BvwGa\n        AXEB/wGYAYUBagH5AV8BXQFaAcADRQF9AzYBWQM1AVYDKwFDAxwBJwMEAQYDAQECAwABAf8AGQADFAEb\n        A0MBeAFRAVgBWgHYAT8BbAF5AfwBQAFXAWUB/QE2AUgBUgH9AS4BQgFKAfwBOwFdAWoB/AFAAV8BbgH9\n        ATsBTwFYAf0BJwExATgB/AERARkBHgH9AU4BYwFrAfwBdwGEAYoB/AF5AYQBhwH8AVIBZgFoAf0BRgJH\n        AYADIwE0Aw0BEQMNAREDDQERAw0BEQMNAREDDQERAwgBCwMEAQYDAQECHAADEAEWAzUBVwFxAm4BzQG8\n        AbUBqwH6AeMB3AG8Af8B5QHgAbMB/wHeAc4BngH/AdIBsAF2Af8BxgGVAVYB/wHCAY0BUQH/AcoBrwGV\n        Af8BxQG3AasB/wG/Aa0BngH/AcEBmQFwAf8BmwF+AWUB+AFeAVsBWAG8A0IBdgMyAVADMQFPAysBQwMf\n        AS0DBwEKAwMBBAMAAQH/ABkAAxQBGwNDAXgBWgFhAWIB2AFFAV4BYQH9AUwBYgFlAf0BVgFsAW8B/QFh\n        AXYBdwH8AVwBcAFuAfwBZgF7AXwB/AFfAXcBgAH9AUwBXwFiAf0BJAErASwB/AFLAWEBZwH8AXABfgGA\n        AfwBdAF+AYAB/AFIAV8BYwH8A0gBhgMmATgDDQERAw0BEQMNAREDDQERAw0BEQMNAREDCQEMAwUBBwMC\n        AQMcAAMQARYDNQFWAXECbgHNAbwBtQGqAfoB4QHbAbsB/wHkAd8BsQH/Ad0BzAGcAf8B0gGsAXUB/wHG\n        AZABVgH/AcEBigFRAf8B1wG6AaEB/wHeAc0BwQH/AdkBwwG0Af8BywGdAXQB/wGdAX8BZgH4AV0BWgFY\n        AbkDPwFvAy4BRwMuAUcDKgFBAyIBMQMNAREDBAEFAwABAf8AGQADEgEYA0IBdAFgAmQB1gFNAWIBZgH9\n        AU0BYQFmAf0BUgFlAWkB/QFbAXIBdAH8AWUBggGDAfsBYAF5AYMB/QFdAXUBeQH9AVMBaAFsAfwBMgE+\n        AT8B/AFiAXMBegH8AX0BjAGSAfwBfQGKAY8B/AFPAWcBawH8A0gBhAMjATQDCAELAwcBCQMIAQsDCQEM\n        AwgBCwMHAQkDBgEIAwQBBgMBAQIcAAMQARYDNQFXAXMCcQHOAcEBtwGpAfsB4AHZAboB/wHkAd8BsAH/\n        Ad0BzAGbAf8B0gGrAXQB/wHHAY8BVgH/AcIBiQFSAf8B1gG4AaAB/wHRAcABtgH/AcYBsAGkAf8BwQGV\n        AXAB/wGaAYUBagH5AV0BWwFXAbgDPQFqAykBPwMpAT8DKAE8AyEBMAMQARYDBQEHAwABAf8AGQADDwEU\n        A0ABbwFdAWEBZAHSAVIBZAFpAf0BTAFgAWUB/QFQAWQBaQH9AVkBbwFzAfwBYgF2AXsB/AFbAXIBdgH9\n        AV4BdAF3Af0BXgFxAXUB/AFGAVsBXQH8AXoBiAGOAfwBkwGkAawB/AGOAZ0BoQH8AV0BcAF0AfwDSAGE\n        AyIBMgMEAQYDAwQEAQYDBAEGAwQBBgMDAQQDAwEEAwMBBAMBAQIcAAMQARYDNQFXAnIBcAHPAcEBtwGq\n        AfsB4AHYAbsB/wHkAd8BsQH/Ad4BzAGcAf8B0gGsAXUB/wHHAY8BVwH/AcIBiAFSAf8B1QG2AZ4B/wHN\n        AbsBsQH/Ab8BqgGeAf8BvwGUAXEB/wGgAYEBbAH6AVwBWQFXAbYDOwFkAyUBNwMkATYDIwE0Ax0BKQMQ\n        ARUDBQEHAwABAf8AGQADDAEQAz4BagFeAmIBzgFTAWUBagH9AUsBYAFlAf0BUgFmAWwB/QFaAW8BdAH8\n        AU8BZgFsAfwBXAFwAXMB/AFkAXgBewH8AWcBegF9AfwBYAF1AXoB/AGFAZgBnQH8AacBtwG5AfwBoQGt\n        Aa8B+wFlAXYBgAH7AkgBSQGFAyEBMAMCAQMDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwABARwA\n        AxABFgM1AVYCcgFwAc8BwAG3AaoB+wHgAdgBuwH/AeUB3wGyAf8B3gHMAZ0B/wHSAawBdwH/AccBjwFY\n        Af8BwgGHAVEB/wHUAbUBnQH/AdABvQGzAf8BxQGxAaQB/wHHAaABggH/AZ0BjAFtAfsBXAFaAVcBtAM4\n        AV0DHwEsAx4BKwMcAScDFgEeAwoBDgMDAQQDAAEB/wAZAAMKAQ4DPQFnAVwCXwHMAVIBYwFqAf0BTgFi\n        AWgB/QFUAWoBcAH9AVsBcgF4AfwBSQFmAWwB/AFhAXcBegH8AWsBfQF+AfwBcAF+AYYB/AF1AYMBkAH8\n        AYcBlAGWAfsBqQGzAbQB/AG0AbwBvgH8AXgBgwGKAfwBSAJJAYYDIgExAwEBAjwAAxABFgM1AVYBdAJx\n        AdABwAG6Aa8B/AHhAdkBvAH/AeYB4AGzAf8B3wHNAZ8B/wHTAa0BeAH/AccBkAFZAf8BwgGGAVEB/wHT\n        AbMBmwH/AdoBxQG6Af8B2gHFAboB/wHbAbwBpAH/AawBlQGBAfwBWwFaAVcBsQM0AVQDFgEeAxQBHAMQ\n        ARYDCgEOAwMBBAMAAQH/AB0AAwUBBwM4AV0BWwFdAV8BwwFUAWgBbwH9AVYBbAFwAf0BXAFxAXQB/QFg\n        AXcBegH8AVoBcgF4AfwBYgF4AXsB/AFnAXwBfQH8AWoBfAF/AfwBbAF9AYEB/AGDApYB+wGTAakBpgH8\n        AZYBrAGqAfwBgAGWAZUB+wFIAkkBhQMhATADAQECPAADEAEVAzUBVQJvAW4B0QGvAacBnAH8AcABuQGk\n        Af4BwQG9AZoB/gG6AawBhwH+AbEBkgFuAf4BqQF+AVUB/gGkAXYBUAH+AbwBoAGOAf8BzgHBAbkB/wHc\n        AdQB0AH/AeYB2QHQAf8BsgGoAZ8B/QJZAVgBrQMuAUgDCQEMAwgBCwMGAQgDBAEFAwABAf8AIQADBwEJ\n        AzgBXgFbAl8BwwFaAW8BcwH9AVoBcAFzAf0BXAFyAXUB/QFcAXIBdgH9AVcBbgF0Af0BVgFsAXEB/AFV\n        AWsBbwH9AVkBbwF0Af0BYAF1AXsB/AF2AZUBkAH8AX0BpgGbAfwBfAGhAZYB/AFqAZQBhQH7AUQCRQF7\n        Ax0BKgMCAQM7AAEBAxoBJQNMAY4BfgJ8AeEBqQGoAaQB/QGdAZkBjwH+AYIBgAFzAf4BgwF/AW0B/gGH\n        AXwBZgH+AZMBcwFdAf0BlgF1AV8B/QGrAZwBkwH/AcUBvwG8Af8B3QHbAdoB/wHrAegB5gH/AcEBvQG4\n        Af4DYgG6AzcBWgMEAQYDAwEEAwEBAgMAAQH/ACUAAwwBEAM7AWUBYAJkAcYBcQGAAYEB/AFlAYABhAH9\n        AWABdgGAAf0BWwFxAXcB/QFWAWsBcwH9AUsBYwFrAfwBTQFiAWgB/QFSAWsBbwH9AVkBeQF8AfwBbAGf\n        AZUB/AFtAbABngH8AWIBowGQAfwBUgGFAWYB+wM+AWsDFwEgAwMBBDgAAwEBAgMlATcDYAHUA5wB9AKs\n        AasB/gKGAYQB/gJQAUwB/gFaAVkBVQH+AW4BawFnAf4CfwF5Af4BigGFAX8B/gGoAaUBogH/AcYBxQHE\n        Af8D4QH/A/EB/wLbAdkB/gNyAc0DQgF2AwQBBgMCAQMDAAEB/wApAAMRARcDPwFsAWkBbAFtAckBngGp\n        AasB+gGLAZkBmwH7AXcBhAGLAfwBaAF7AX8B/AFdAXMBhwH9AVsBcAF4AfwBWQF0AXkB/AFcAX4BfwH8\n        AWABnwGaAf0BbQG8AbMB/QFoAcEBuwH9AVYBqAGcAfsBLQFvAVsB+QM1AVYDDwEUAwQBBjsAAQEDKgFA\n        A24B/gPDAf8DxwH/A5UB/wNFAf8DVAH/A3IB/wOSAf8DoAH/A7gB/wPWAf8D8QH/A/4B/wP6Af8DhQHY\n        A0kBhgMHAQkDAwEEAwEBAgMAAQH/ACAAAQEDAgEDAxQBGwNAAW4BaQFqAWwBygGKAZoBnQH8AX4BjQGR\n        AfwBbQF8AX0B/AFeAWUBawH7AVkBagFyAfwBVwFsAXEB/AFeAXwBfQH8AWwBlAGQAfwBfQG5Aa8B/AGG\n        AcUBvQH9AXEBwQG5Af0BWAGtAZkB/AE6AYMBagH6AzoBYQMUARsDBAEGPAADJAE1A10B0wOxAfUDzwH/\n        A6EB/wNRAf8DXgH/A3gB/wOVAf8DogH/A7sB/wPYAf8D8gH/A/4B/wPzAf4DdwHLA0IBdAMIAQsDBAEG\n        AwIBAwMAAQH/ACAABAEBAgMPARQDOAFeAVsCXAG2AWwCewHyAV8BcAFyAfoBSwFbAV4B/AFCAU8BUgH7\n        AT4BSgFOAfwBQAJZAfwBRwF0AWwB/AFYAZEBggH8AXIBuQGmAfwBbgG4AaAB/AFlAbEBmwH8AVwBpwGS\n        AfwBXgGdAYwB+wM5AV8DEgEZAwQBBTsAAQEDFwEgA0cBgAOGAdkDyQH7A7gB/wNuAf8DcwH/A4kB/wOe\n        Af8DqwH/A8QB/wPeAf8D9AH/A/4B/wPJAfQDXwGvAzUBVQMJAQwDBAEGAwIBAwMAAQH/ACUAAwcBCQMn\n        ATsDRwGBAVgCWwHLAUcBTgFPAfABLAE4ATsB/AEkATABMgH7AScBLQEuAfwBMAFDAUAB/AE9AWIBWQH2\n        AU0BeQFqAewBXAGIAXwB5wFTAY0BeQHwAVUBgQF1AecBXgF2AW4B1gFlAXEBbQHJAy8BSgMNARIDAgED\n        OwABAQMJAQwDIAEuA1kBowOVAeIDugH6A5sB/wOcAf8DqAH/A7cB/wPCAf8D1gH/A+gB/wPvAf4D4AH6\n        A3sBzgNHAX8DIgEyAwkBDAMEAQYDAgEDAwABAf8AKAABAQMCAQMDGAEiA0MBeAFKAk8B2gEgASoBKwH8\n        ARUBHgEhAfwBFAEcAR8B/AEuAT8BPgH8AU0BWgFXAeIBUwFaAVgBwAFRAVYBVAGsAVMBagFfAdMBUgFY\n        AVYBrAE8Aj0BZwMjATMDFAEbAwcBCgMAAQE8AAMBAQIDBgEIAy8BSQNWAaIDnwHsA80B/gPUAf4D3QH+\n        A+YB/gPrAf4D8AH+A/MB/gPdAfkDqAHrA0YBfgMmATkDEAEVAwcBCgMEAQUDAQECAwABAf8ALAABAQMP\n        ARQDLwFKAVACUgGjAVQCVgG9A1MBugFTAlQBvQFVAlYBwQFQAVMBUgGoAUgCSQGIA0IBdQFRAVYBVAGn\n        A0gBhAMrAUIDFAEbAwgBCwMCAQNDAAEBAwIBAwMRARcDIgQxAU0DPQFnAz8BbQNAAXADQQFxA0IBcwNE\n        AXcDQwF0Az0BaQMzAVMDIwE0AxUBHQMLAQ8DBQEHAwMBBAMBAQIDAAEB/wAtAAMGAQgDFQEdAzABSwM2\n        AVgDNQFWAzUBVwM3AVsDMQFPAykBPwMmATgDNgFYAywBRAMWAR8DBwEKAwIBAwMAAQFHAAEBAwIBAwME\n        AQYDCQEMAxMBGgMWAR8DGAEhAxgBIgMaASUDHQEpAxwBKAMZASMDEQEXAw8BFAMLAQ8DBwEKAwQBBQMC\n        AQMDAQECAwABAf8ANQADAwQEAQUDBAEFAwQBBQMEAQYDBAEGAwUBBwMIAQsDDQERAwoBDgMEAQZrAAQB\n        BAIBAwMEBAYBCAMHAQoDCAELAwcBCgMGAQgDBAEFAwIBAwMBAQIDAAEB/wDQAAEBAwABAQMABAEEAgQD\n        AQQDAwEEAwMBBAMCAQMDAQECAwABAf8A9AAEAQQCAQMDAAEB6wAEAQECAwYBCAMKAQ0DDAEQAwoBDQME\n        AQUDAQECAwABAecABAEEAgEDAwABAecAAQEDAwEEAwcBCgMYASIDKQE/AzABTAMkATYDEgEZAwcBCQMB\n        AQLrAAEBAwABAQMAAQFXAAEBAwABAQMCAQMDAQECAwABAVsABAEBAgMAAQEYAAMCAQMDCQEMAxYBHwM3\n        AVoDSgGNAVECUgGhAkcBSAGDAysBQgMSARkDAwEE/wBJAAMBAQIDBAEFAwgBCwMEAQYDAQECWAADBAEF\n        AwQBBgMCAQMXAAEBAwQBBgMUARsDLwFJAVYBWAFZAbsBYgFxAXsB7wFlAX4BiwH8AToBVgFlAfwBSQJK\n        AYsDJgE4AwYBCKgAAwEBAgMEAQUDCAELAw0BEQMPARQDDwEUAw0BEQMHAQoDBAEFAwMBBAMGAQgDDAEQ\n        Aw8BFAMPARQDDgETAwkBDAMEAQYDAQECUwABAQMKAQ4DIgEyAzoBYANMAYsDPQFnAycBOgMPARQDAQEC\n        AwABAUsAAQEDIwE0AykBPgMgAS8DDwEUAwQBBgMAAQELAAEBAwcBCgMkATUDTgGZAXQBewF9Ad8BlgGp\n        Aa8B+gGFAZ4BqAH9ATMBTAFhAfwBUQFSAVMBqwM1AVYDEAEWAwQBBQMBAQIDAAEBmAADAgEDAwgBCwMY\n        ASIDMQFOAzsBZQNAAW4DPwFtAz4BagMpAT4DFAEcAxABFgMoAT0DOQFfAz8BbQNAAW4DPwFsAy8BSgMc\n        ASgDCgENAwEBAgMAAQFDAAEBAwQBBgMOARMDLwFKA0kBhANjAbgDhwHaA2gBvgNOAY4DNQFVAxYBHgMH\n        AQoDAQECPwABAQMDAQQDCQEMAygBPQM6AWIDOwFlAyIBMQMSARkDBwEKAwMEBAEGAwUBBwMKAQ4DLAFD\n        AWYBaAFpAcwBpAGuAbEB8gHCAdEB2AH+AaEBsgG8Af0BQAFYAWsB/QFQAVYBVwHQA0gBiAMrAUIDFAEb\n        AwoBDgMEAQYDAAEBkwABAQMHAQoDGwEmAzcBWgNZAaoDbwHGA3wB0AN6Ac8DdwHNA0UBegMmATkDHwEs\n        A0QBegNlAbkDegHPA3wB0AN6Ac4DVQGgAzsBYwMdASoDBwEJAwIBAwMAAQE8AAMBAQIDDwEUAy0BRQNS\n        AZsDfgHUA7YB8QPAAfMDuQHyA4MB2QNZAagDOAFcAxYBHwMEAQY8AAMDAQQDCgEOAxgEIgExAz4BawNK\n        AYsDMwFTAyQBNQMUARwDCgENAwgBCwMOARMDEQEXAyoBQQJiAWQBuwGfAaMBpAHoAcoB0gHWAfoBtQHB\n        AcoB/QFkAYQBlAH9AUUBVQFcAe8BUAFTAVYBwwJJAUoBiwM1AVYDHQEqAw0BEQMDAQSPAAQBAQIDEgEY\n        AzgBXANeAbID/hH/A1MBnwMwAUwDJgE5A1ABnQOpAecM/wO5AfIDYAG1AzsBZAMUARwDBwEKAwEBAjwA\n        AwMBBAMgAS8DUwGlA6oB6QPnAf0DpQHvA2IBzgOeAewD2wH7A7sB8QNdAcUDLAFEAwoBDQMAAQE4AAMK\n        AQ0DGgEkAy0BRQMZASMDNAFUA0kBiQNCAXQDNQFYAyYBOQMVAR0DBwEKAxoBJAMdASoDHwEsAygBPAFh\n        AmIBtwGdAaMBqAHvAcIB0gHZAf4BsQG/AckB/QFZAXIBfgH8ASsBPgFOAfwBLQE6AUMB8AFOAlIBzgM6\n        AWEDGgEkAwYBCDQAAwEBAgMDBAQEBgEIAwQBBgMDAQQDAQECOwABAQMDAQQDCgENAzUBVgNYAaYDnAHk\n        BP8DsQHtA4oB3AN6Ac8DdQHKA0UBegMmATgDHQEpA0IBdQNiAbYDegHOA4QB1wOqAewD0wH3A54B5QNg\n        AbUDPQFpAyABLwMMARADAQECKAADAQECAwUBBwMPARQDGAEhAxQBGwMXASADMwFTA1oBpwNaAacDRQF6\n        Ay4BSANBAXEDVAGeA1kBqAM9AWkDGgElAxAEFQEdAxYBHgMKAQ4DBAEFAwABASgAAxoBJQMxAU8DOAFe\n        AyABLgMgAS8DOgFiA1cBxQNEAXsDNgFZAzUBWAM9AWoDLgFHAycBOgMkATUDHwQtAUYDRQF7AWICZAG7\n        AbMBvgHDAfgBgAGWAZ4B+wFOAWwBewH8ATkBTAFcAfgBLgE6AUUB8QNNAZ4DLgFHAwcBCjMAAQEDBQEH\n        Aw8BFAMYASIDIQEwAxoBJAMQARUDBgEIAwEBAgMAAQEwAAMBAQIDBgEIAxMBGgNQAZQDjgHbA8sB9gOs\n        Ae8DYQG0A0oBiANAAW4DOwFlAygBPQMUARsDDwEUAyYBOAM3AVsDPwFsA0YBfQNWAaEDjgHbA7wB8gOe\n        AeYDYwG5AzYBWAMXASADBAEGJAADAgEDAw4BEwMjATMDPQFpA0IBdQM1AVUDHgErAxcBIAMzAVIDMQFN\n        Ax8BLAMKAQ4DGwEmAy0BRgMyAVADHAEoAxYBHgMsAUMDPwFtA0IBdQMtAUUDGAEiAwkBDAMAAQEDAAEB\n        IAADIwE0AzwBZgM7AWUDKAE9AxoBJQMnAToCTwFOAZcDTQGUA0MBdwM7AWQDRQF+A0MBdwM8AWYDMgFQ\n        AyYBOAMUARwDIwE0AUMCRAF3AXYBfAGAAd0BhgGZAZ8B9QFvAZIBnwH9AUYBZgF2AfwBIgE0AUMB/AFO\n        Ak8BpQMvAUkDBwEJMAADAQECAw8BFAMlATcDOAFdA0MBeAM3AVoDIwE0Aw4BEwMCAQMDAAEBMAADAQEC\n        AwkBDAMaASUDbwHAA94B+gPDAfIDZwHJA0ABcAMkATUDEAEWAwoBDgMGAQgDAwEEAwIBAwMEAQYDCgEN\n        Aw8BFAMaASUDLgFIA1gBpwObAeID5wH8A7oB8wNFAXoDIQEwAwcBCiQAAw0BEgMpAT8DRwF/A28ByANs\n        AcoDTQGOAykBPgMFAQcDCwEPAwgBCwMDAQQEAAMCAQMDBwEJAwgBCwMDAQQDGgElA0QBdwNmAcIDcwHR\n        A08BlQM3AVsDHQEqAwcBCQMCAQMgAAMoAT0DPwFuAzMBUgMtAUUDIAEuAxoBJAMpAT8DTwGhA0wBkgM8\n        AWYDQQFyA04BmgNNAZQDQgF0Ay8BSgMTARoDDQERAyoBQAFWAlcBtAF4AYYBiwHrAYQBoQGpAf0BZwF/\n        AYwB+gFFAVMBYAHxA0gBhQMjATQDBAEGLwABAQMDAQQDHQEqA0MBdwNYAcEDZQHhA1MBqgM6AWIDGAEi\n        AwMBBAMAAQEwAAMBAQIDCgEOAx4BKwOCAcoE/wOeAeIDSQGKAykBPwMQARUDAQECGwABAQMEAQUDCwEP\n        AzsBYwNuAb8I/wNLAYkDJwE6AwoBDiMAAQEDJQE3A1ABlAOYAeYE/wOrAe4DVwGiAy0BRQMDAQQDAAEB\n        HAADJAE1A1EBlgOnAesE/wOiAe0DXAGzAzwBZgMUARwDBgEIAwABARwAAywBRAM+AWwDFAEbAycBOgMr\n        AUIDIwE0AwwBEANPAaIDUQGsA0YBgQNBAXMDTQGVA1EBqQNPAZoDNAFUAxYBHwMIAQsDHAEoA0gBhQFe\n        AWgBbwHdAXUBigGWAfwBgAGQAZUB8QFmAWkBagHOAzEBTwMPARQDAQECLwABAQMDAQQDJAE1A00BjgOD\n        Ad8BwwHEAcMB9wNeAbsDQAFuAxwBKAMEAQYDAQECMAADAQECAwoBDQMbASYDgAHJBP8DmQHeA0MBeAMm\n        ATgDDwEUAwEBAhwAAwEBAgMGAQgDNgFYA2gBuQj/A0kBhQMmATgDCwEPAwABARgAAwEBAgMFAQcDQAFu\n        A28BwwPFAfUDrQHyA1kBqAM2AVkDFAEbAwABASAAAw4BEwMuAUcDTwGTA5wB6gPDAfUDfgHZA1ABmQMo\n        ATwDDgETAwIBAxgAAwQBBQMzAVIDSgGMAzcBWgMfAS0DHwEsAyQBNgMfAS0DSwGSAk8BUwHDAksBUgHL\n        Ak8BUQG6AlIBUwGvA1UBsQNQAaMDPQFqAykBPwMVAR0DDgETAx8BLANAAW8CSwFMAYwCSAFJAYMDNQFV\n        Ax0BKQMKAQ4DAQECLwABAQMDAQQDJgE5A1EBlgOdAekB8wH0AfMB/gNkAcQDQwF4AyIBMQMFAQcDAQEC\n        MAADAQECAwcBCQMUARsDXQGqA4oB2wNmAbkDMgFRAxwBJwMKAQ4DAQECHwABAQMDAQQDLQFGA1QBnAOK\n        AdsDigHbAz0BZwMcASgDCAELAwABARgAAwIBAwMHAQoDSQGFA4MB1wPLAfcDdAHfA0YBfgMkATYDCAEL\n        JAADAwEEAxMBGgM1AVUDZQHHA78B8QOYAegDWQGuAy4BSAMRARcDAwEEEwAEAQECAwcBCgMtAUYDSgGK\n        AVQCUwGvAzABSwMbASYDGAEiAxkBIwNKAY0CRgFXAdMBIwEmAVoB8QEwATYBVwHoAVEBVAFaAdUDVgHB\n        A1ABowNAAXEDNAFUAyEBMAMPARQDCgEOAx8BLQMnATsDJgE4AxkBIwMcAScDEQEXAwQBBS8AAQEDAwEE\n        AyYBOQNRAZYDnQHpAfMB9AHzAf4DZgHGA0YBfwMnAToDBwEJAwIBAzMAAQEDBAEFAwoBDgM/AWwDTAGN\n        A0IBdQMdASkDEAEVAwYBCAMBAQIfAAQBAQIDHQEqAzsBYwNNAY4DTQGOAygBPAMQARYDBQEHHAADAgED\n        AwYBCANHAYADfgHTA78B9ANkAdYDQAFwAyABLgMHAQooAAMGAQgDJgE5A1kBtQOzAe0DlgHmA1YBqgMr\n        AUMDEAEVAwMBBBMAAQEDAgEDAw0BEQMgAS4DPgFqAlkBVwHZA0cBggMvAUoDIgEyAyYBOAJOAU8BpAI8\n        AVkB4wEIARABbwH+AQwBFgFqAf4BPgFEAVgB9AFUAVcBWAHRA08BngM6AWIDNQFXAysBQgMeASsDFgEe\n        AxkBIwMaASUDHAEoAx0BKgMiATIDFgEeAwQBBi8AAQEDAwEEAyYBOQNRAZYDnQHpAfMB9AHzAf4DZQHH\n        A0cBggMpAT4DCQEMAwMBBAMAAQEzAAEBAwIBAwMHAQoDDAEQAw8BFAMPARQDCgEOAwYBCAMBAQIkAAMD\n        AQQDBwEKAw0BEQMQARYDDgETAwoBDgMFAQcDAAEBGwABAQMCAQMDOgFiA2wBvwPIAfcDhQHoA0UBfAMk\n        ATYDCgEOKAADCAELAy0BRQNuAdQDvwH0A4AB2ANNAZIDIgEyAwwBEAMBAQITAAEBAwMBBAMWAR4DEgEZ\n        AyABLwNQAZsDVwHCAVMBVAFTAbMDTgGfA1IBtwE5AToBPwHqARwBJQE5AfwBHgEuAVIB/QEpATgBZwH8\n        AS0BNwFLAfsBSQJNAdkDTAGWAyMBNAMqAUADMgFQAzYBWQMxAU8DOQFfAzwBaAM8AWgDOAFdAyQBNQMQ\n        ARUDAQECLwABAQMDAQQDJgE5A1EBlgOdAekB8wH0AfMB/gNnAcgDSAGHAy0BRgMMARADBAEGAwEBAjAA\n        AwEBAgMEAQUDGgElAycBOwMtAUYDLQFGAyUBNwMWAR8DBwEKIwABAQMKAQ4DGQEjAycBOgMwAUwDLQFF\n        AyQBNQMWAR4DBAEFAwEBAhgAAwEBAgMpAT8DTAGLA2YBvgNZAawDMQFPAxQBHAMEAQYoAAMHAQoDJgE4\n        A1QBpQNmAcADUwGaAzUBVgMQARYDBQEHAwABARAAAwYBCAMWAR8DJAE1Ax0BKQMVAR0DJQE3A00BkQNQ\n        AaQDTQGWA0sBkgNRAaoBWgFcAV8BzAFkAWkBcwHsAUYBVgFpAfwBMgE6AUQB+wEwATMBNgHzAU0CTgG/\n        AygBPAMWAR8DFAEcAxkBIwMaASQDJQE3AzQBVQM4AVwDHAEoAw4BEwMFAQcDAAEBLwABAQMDAQQDJgE5\n        A1EBlgOdAekB8wH0AfMB/gFhAWQBYQHCA0cBgQMrAUMDDQESAwUBBwMBAQIvAAEBAwQBBQMLAQ8DPwFs\n        A1ABlANOAY8DPQFqAzUBVgMjATMDDQESAwABARsABAEBAgMdASoDOwFjA08BkwNVAaEDQgF1AzMBUwMi\n        ATIDBwEJAwIBAwMAAQEXAAEBAxUBHQMtAUYDOgFgAzMBUgMaASQDCgENAwQBBQMCAQMDAAEBAwABARwA\n        AwQBBgMVAR0DMwFSAzsBZAMxAU0DGgElAwQBBgMBAQIDAAEBDwABAQMHAQoDGgEkAzIBUAMsAUMDGgEl\n        AxYBHgM6AWIDRQF+A0UBfwNCAXYDOwFlA0MBeANWAacBWQFfAWIB6QFUAlcB9wE8AT0BOwH8A0wBzwMu\n        AUgDEAEWAwYECAELAwoBDgMSARgDLAFDAzcBWgMdASoDCQEMAwABATMAAQEDAwEEAyYBOANQAZUDnQHp\n        AfMB9AHzAf4BXQFeAV0BtAM/AWwDIgExAwsBDwMEAQYDAQECLwABAQMHAQkDFAEcA2QBsgOcAeYDdwHO\n        A0UBfwM+AWsDLQFFAxUBHQMDAQQDAAEBAwABARAAAwEBAgMDAQQDLgFIA1cBogOcAeYDogHqA1ABmAM8\n        AWcDKgFBAwoBDgMEAQUDAAEBGAADBAEFAwoEDQESAwoBDgMNAREDEAEVAxABFgMLAQ8DBAEFAwABARsA\n        AQEDAwEEAwcBCQMQARUDFwEgAxMBGgMIAQsYAAMIAQsDEAEVAxEBFwM3AVsDNQFWAyYBOQMkATUDKgFB\n        AzIBUAM4AV0DOwFkAygBPAMjATQDNQFXAVQBVgFUAasCZAFjAdYCXQFbAfABVQFUAVIB2QNAAXADKAE8\n        AxoBJAMUARsDEAEVAxcBIAMyAVEDPgFsAyMBNAMKAQ43AAEBAwMBBAMjATMDTwGRA5kB5wHyAfMB8gH+\n        A1MBnAMuAUcDDAEQAwUBBwMDAQQDAQECLAADAQECAwoBDQMcAScDgAHJBP8DnAHgA0cBggNCAXUDNQFW\n        AyABLwMJAQwDBAEFAwEBAgMAAQEDAAEBBwABAQMCAQMDBQEHAzUBVwNpAbgI/wNVAaQDQAFxAy8BSgMP\n        ARQDBAEGAwABARwAAwEBAgMGAQgDEAEVAyABLwMqAUADKwFCAyABLgMLAQ8DAQECGAADAgEDAwgBCwMQ\n        ARYDGgElAyIBMgMcAScDDQESAwABARMAAQEDHAEnAyYBOQQAAywBRAMyAVEDMQFPAzoBYgMmATkDHQEq\n        AyQBNgM4AV4DMQFPAyUBNwMaASUDHwEsA0cBgAFfAl4BzAFjAWIBYAHvAVIBVQFSAcwDTwGpA0YBgAM3\n        AVsDLAFEAz0BagNOAaADTQGcAxABFgMEAQY4AAMBAQIDEwEaAzEBTgNGAX0DTAGLAzIBUAMYASIDBAEG\n        AwIBAwMAAQEDAAEBLAADAQECAwoBDQMcAScDgAHJBP8DnwHjA0oBjQNEAXoDPAFnAzMBUgMkATYDHAEn\n        AxYBHwMUARsDDQESAwYBCAMHAQkDDwEUAx0BKQNFAXsDdwHLCP8DVQGjAz0BagMqAUEDDAEQAwQBBQMA\n        AQEbAAEBAw0BEQMqAUADUwGdA1sBrgNPAZYDPwFuAzEBTgMZASMDCQEMAwMBBAMCAQMDAQECAwABAQMA\n        BAEBAgMaASQDOQFfA00BjwNNAZEDPwFtAy4BRwMYASEDAQECAwABAQwAAwIBAwMiATIDLwFJAwABAQMa\n        ASUDMgFQAzkBXwMfAS0DMgFQAycBOwMUARwDFwEgAxsBJgMcASgDHQEqAyEBMAMvAUoDPQFoA0gBgwFN\n        AU4BTQGWA1MBqQFWAlQBrwNUAa8CUwFSAa8DUAGoA0gBhgMxAU8DBAEGAwEBAjsAAQEDBwEKAxUBHQMg\n        AS4DIwE0AxUBHQMJAQwDAQECAwABATQAAwEBAgMIAQsDGAEiA2wBuwPWAfcDuwHvA2MBvQNNAZEDQwF4\n        Az4BawM5AV8DMwFSAy8BSgMrAUIDIgEyAxYBHgMWAR8DJgE5A0ABbgNfAbMDogHlA+YB/AO0AfEDTgGT\n        AzUBVgMfAS0DBwEKAwIBAwMAAQEbAAEBAw8BFAMzAVMDdgHYA5MB5wNlAcIDSgGMAzsBZQMsAUMDHwEs\n        AxcBIAMUARsDCgEOAwcBCQMIAQsDEAEVAzQBVANWAaEDfAHXA3AB0gNKAYkDMQFPAxgBIgMBAQIDAAEB\n        DAADAgEDAygBPAM4AVwDDQESAxABFQMyAVEDRwGDAz8BbQNEAXoDMQFNAxEBFwMEAQYDCgENAw4BEwMR\n        ARcDEgEZAxYBHgMdASoDJgE5Ay4BSAM4AV4DQAFvA0QBegNFAX8DPgFsAy0BRQMUARxEAAMBAQIDAQEC\n        AwEBAgMBAQIDAQECAwABAT8AAQEDBgEIAxIBGANQAZMDjgHbA9MB9wOvAe8DYwG8A1YBogNTAZoDUgGb\n        A0cBggM/AW8DPAFmAzsBZQM5AV8DPAFlA0gBggNjAb0DnwHnA80B9wOrAesDaAHGA0ABcQMmATgDEAEW\n        AwIBAwMAAQEgAAMKAQ4DLwFKA3YB1QO6AfIDhwHcA1oBsQNKAYsDRAF6AzsBYwMwAU0DKQE/Ax8BLAMg\n        AS4DKAE9AzEBTgNPAZUDgQHUA8AB9QOBAeQDSgGKAy4BSAMUARwDAAEBEAADAQECAyYBOAM8AWYDMQFP\n        AyEBMAM9AWkDUQGzAk4BVQHOAlEBUwGsAzsBYwMUARwHAAQBAQIDAQECAwABAQMCAQMDBwQKAQ4DBwQK\n        AQ4DEQEXAxYBHgMXASADDwEUAwcBCgMBAQKbAAEBAwIBAwMHAQoDLQFFA1YBoAOqAe0U/wNdAbQDRQF/\n        A0MBdwNWBLEB7BD/A60B8ANmAcMDPwFtAycBOwMSARgDBAEFKAADBAEFAyEBMANRAaEDqQHoA9cB+gOa\n        Ae4DYwHXA18B0wNWAbEDSAGGAzsBZQM7AWMDSgGJA1gBtgNeAccDlQHqA9cB+wO6AfEDVwHFA0MBdwMo\n        ATwDDwEUGAADEwEaAzgBXAFmAWMBYgHVAU0CTAGTAlEBTwGvAkABQQHnAR0BIQEwAfwCTwFSAd0DRQF/\n        AxcBIAcABAEBAgMBAQILAAEBAwAEAQECAwABAbcAAQEDAgEDAxQBGwM1AVUDVgGgA6oB7APjAfsM/wNT\n        AZ0DNQFXAzABTANQAZ4DqQHnDP8DlgHhA1gBpgM7AWMDIAEvAxIBGAMHAQkDAQECKAADAQECAxMBGgM4\n        AV4DeAHNA8wB9wPZAfoDwAH1A68B8QNlAb8DRQF8Ay4BSAM9AWgDXAGsA54B6AO6AfED1wH5A8sB9wOC\n        AdcDRwGDAy8BSgMYASIDBwEKGAADBQEHAxoBJQNAAW4DMwFTAzsBZANNAZUCXgFgAdkBVAFVAVIB6ANP\n        AaEDKgFAAwABAQcAAQEDAAEBEwABAb8AAQEDBgEIAxkBIwMzAVIDUQGYA2EBrwNoAbcDZwG2A2UBtAM9\n        AWcDIQEwAx0BKQM9AWgDWAGiA2cBtgNoAbcDZwG2A04BjwM2AVgDGwEmAwoBDgMFAQcDAQECAwABASsA\n        AQEDCAELAx0BKgNOAY8DbQHDA4IB1gOEAdgDegHTA1MBnQM1AVcDGQEjAzEBTwNRAZcDeAHRA4QB2AOC\n        AdYDbQHDA1ABlQMqAUADGAEiAwoBDgMCAQMcAAMHAQoDGwEmAxYBHwMbASYDKgFBA0QBeQJWAVUBswFU\n        AVYBVAGrA0UBfAMsAUQDLAFEAyABLwMPARTUAAMBAQIDBQEHAxEBFwMmATkDMQFNAzUBVQMzAVMDMQFP\n        Ax4BKwMNARIDCwEPAx4BKwMuAUgDMwFTAzUBVQMzAVMDJAE2AxQBGwMFAQcDAQECAwABATQAAwEBAgMH\n        AQkDLAFEAz8BbQNIAYQDSQGHA0cBgQM3AVoDHAEoAwQBBgMcASgDNwFaA0cBgQNJAYcDSAGEA0ABbgMt\n        AUUDCgEOAwQBBgMBAQIwAAMFAQcDFAEbAzgBXANHAYIDSwGLA0IBdANEAXsDPQFqAywBRAMMARADAwEE\n        0wAEAQQCAQMDBAEFAwQBBgMEAQYDAwEEAwEBAgMAAQEDAAQBAQIDAwQEAQYDBAEGAwQBBQMCAQMDAAEB\n        SAADAgEDAwQEBgEIAwYBCAMFAQcDBAEFAwEBAgQAAwEBAgMEBAUBBwMGAQgDBgEIAwQBBgMCAQNIAAMJ\n        AQwDFwEgAygBPAM1AVgDSgGMA00BmQMqAUADDAEQ1wABAQMAAQEDAAQBAQIDAQECAwABAQMAAQELAAEB\n        AwAEAQECAwEBAgMAAQEDAAEBTwAEAQECAwEBAgMBAQIDAQECAwABAQMAAQEHAAEBAwAEAQECAwEBAgMB\n        AQIDAQECAwABAUgAAwIBAwMGAQgDCwEPAxABFgMcAScDKQE+AzgBXAMSARgDAAEB/wDtAAMCAQMDDwEU\n        AysBQgMNARIDAAEB/wDYAAEBAwABAQMAAQEDAAEBDAADBAEGAxEBFwMFAQcDAAEB/wDQAAEBAwAEAQEC\n        AwMBBAMDAQQDAQEC/wD/AP8A/wD/AP8AjQABAQMAAQEPAAEBAwABAQMAAQEDAAEBAwABAf8AzQADAQEC\n        AwQBBQMHAQoDDQESAw0BEQMKAQ0DCAELAwoBDQMKAQ0DCwEPAxABFQMMARADBwEKAwQBBQMAAQFHAAEB\n        AwIBAwMEAQYDCgEOAw0BEgMNAREDCAELAwQBBQMBAQJLAAEBAwABAQMAAQEDAAEBNwABAQMAAQEDAAEB\n        AwABAQMAAQG3AAEBAwIBAwMIAQsDEgEYAyABLgMpAT8DJgE5AyABLgMgAS4DIgEyAyQBNgMnAToDJwE7\n        AyQBNQMcASgDEgEYAwgBCwMEAQUDAQECAwABATcAAQEDBQEHAw0BEgMZASMDJwE7AyoBQQMnATsDIAEu\n        AxQBHAMKAQ0DAgEDRAADAgEDAwQBBgMHAQkDBwEKAwQBBQMCAQMDAAEBJAADAQECAwQBBQMGBAgBCwMF\n        AQcDAwEEAwABAa8AAQEDAgEDAwoBDgMaASUDLgFHA0MBeQNFAX4DQQFyAzwBaANBAXMDPQFpA0EBcwNF\n        AX4DRAF6Az0BaQM0AVQDKAE8AxoBJQMQARUDBwEKAwIBAzQAAwQBBgMTARoDJgE5AzsBZANIAYYDSAGG\n        A0EBcwM4AVwDKgFAAxoBJAMKAQ0DAAEBPwABAQMGAQgDEAEWAxoBJAMdASoDEwEaAwoBDgMEAQYDAQEC\n        AwABARcABAEBAgMGAQgDEAEVAxkBIwMhATADFQEdAwoBDgMDAQSsAAMBAQIDBgEIAxoBJQM2AVkCTQFO\n        AZ8BGAEhATEB9gFMAU4BUAHHAVABUQFSAbUBTgJRAcABOQE/AUYB5gJPAVEBrwFSAVMBVAG5AU0BUgFV\n        AdYCRAFGAdoDTwGmA0gBiANBAXMDNQFYAyUBNwMUARwDBgEINAADDgETAyoBQAFGAkcBggFNAU8BUgHW\n        ATwBSAFRAe4BSgFPAVQB2gNQAbADSQGJA0ABcAMvAUkDGAEhAwMBBAMAAQE3AAQBAQIDDQESAyYBOAM5\n        AV8DPwFvAy8BSgMdASkDDQERAwUBBwMCAQMDAAEBDwABAQMCAQMDBQEHAxIBGAMnBDoBYQNFAX8DMQFO\n        AxoBJQMHAQmrAAEBAwcBCgMaASUDQAFwAVEBUwFUAbEBQwFNAVYB4gEnAT4BTwH9AToBQwFMAekBRQFN\n        AVQB5QFGAVEBXQHsAT0BUAFcAfgBQgFIAU8B4gFJAVABVQHkAUcBUgFcAe8BHgEwAT0B9gE8AUIBRQHf\n        Ak4BUQHAAU0CTgGfA0YBgQM6AWEDJwE6AxABFgMBAQIDAAEBJAADAQECAwQBBQMxAk4CTwGXAVkBXgFk\n        AdIBXgFvAX4B8wFbAWoBdwH5AVABXQFmAfQBTAFSAVYB4QNPAcECTAFNAZUDPAFmAyQBNgMIAQsDAgED\n        AwABATMAAQEDAwEEAx0BKQNDAXUDYQG7A2oBzQNVAakDRQF9AzMBUgMfAS0DEwEaAwkBDAMEAQUDAQEC\n        AwMBBAMKAQ0DFgEeAyYBOQM9AWgDTwGXA2QBwAKOAY8B3gNOAZIDLgFIAw8BFAMBAQIDAAEBoAADBwEK\n        AyABLwJFAUYBfgFRAVQBVwG9AUoBUwFhAeYBNgFLAWMB/AEzAU0BZQH/ATsBRgFQAe0BRAFMAVQB5wFL\n        AVUBYAHrAUQBVwFjAfsBQwFNAVIB4gFOAVYBXQHjAVEBWwFnAfEBEAEnATwB/wEZASQBNgH5ATABOgFB\n        AegBSwFNAU4BzgNPAa8DRQF+AzABTAMYASEDAgEDAwABASQAAwcBCQMZASMDTwGVAWMBaQFuAdcBbQF8\n        AYsB9gF6AYkBmgH+AXkBkQGfAf0BYQF0AYgB/QFGAVIBYAH3ATABOQFBAegBUAJRAbMDRQF/AzEBTgMY\n        ASIDDAEQAwQBBgMAAQEsAAMBAQIDBAEGAycBOgNRAZYBlQGWAZUB5gGzArUB9QOHAeIDZwHEA1EBnwNC\n        AXQDMgFQAyIBMQMSARkDCAELAxIBGQMkATYDOAFeA0wBjQJgAWEBuAN8AdgBqwKsAe8B6ALpAf4DXQGx\n        AzYBWQMQARUDAgEDAwABAaAAAxABFgM2AVgBVQFbAV8B2QFAAVIBZgH0AUQBXAF0Af4BRwFgAXgB/wE9\n        AVgBcQH/AUYBTgFVAeYBSwFRAVUB2AFQAVUBWgHbAUUBWQFjAfgBUAFRAVcB0QFWAVkBYAHXAVQBYQFs\n        Ae4BEAEoAT4B/wEJASABNAH/AQ0BIAEzAf0BJgEwATkB8QFGAUkBSgHXAUoCSwGOAzQBVQMdASkDBAEF\n        AwABASQAAxEBFwM2AVkBagFtAXAB0AGPAZoBoAH7AY8BngGrAf4BiwGbAacB/gGaAagBsAH9AXUBjAGY\n        Af0BQAFVAWUB/AEJARwBKwH8AU4CUQHAA0sBjgM7AWUDLAFEAxwBJwMOARMDBgEIAwMBBAMBAQIDAAEB\n        IAADAQECAwQBBQMkATUDSgGHA4gB1gHbAdwB2wH6A9kB/AGwArEB8wF/AYMBgQHgA18BwQFOAk8BmAM9\n        AWkDKAE9AxYBHgMrBEIBdgNZAa0DfQHcAa0CrwHxAdUB1gHVAfoBzAHNAcwB9QOdAeEDUQGZAzABSwML\n        AQ8DAQECAwABAR8AAQEDAAEBAwABAQMAAQEDAAEBAwABAQMAAQEDAAEBAwABAQMAAQEDAAEBAwABAQMA\n        AQEDAAEBAwABAQMAAQEDAAEBAwABAQMAAQEDAAEBAwABAQMAAQEDAAEBAwABAQMAAQEgAAMWAR8DQAFu\n        AWMBegGIAf4BUAFqAYUB/wFPAWkBhQH/AU8BaQGFAf8BQwFeAXcB/wE9AUcBUAHqAUgBTQFQAdkBTQFT\n        AVcB2QFFAVwBYwH7AU8BUQFVAdQBVAFaAWAB3gFWAWEBdgH4ARMBLQFFAf8BDAEjAToB/wEJAR8BNAH/\n        AREBIQExAfsBLAEwATgB7QNLAZIDNQFYAyABLwMEAQYDAQECJAADHQEqAVICVAGmAYkBjwGRAecBtgG9\n        AcEB/QGvAboBvgH9AaEBrwG3Af4BqAG0AbwB/QF1AYoBlgH9AT0BSgFXAf0BCwEgASsB/AFQAlEBswNJ\n        AYsDQwF4Az4BbAMvAUoDIAEuAxIBGQMKAQ4DBAEGAwEBAiMABAEBAgMIAQsDIwEzA0YBfQOmAewB2wHc\n        AdsB+gHzAfQB8wH+AfMB9AHzAf4B8wH0AfMB/gN6AeQDVAGvA0ABcQMnAToDSAGFA2sByQG+AcABvgH2\n        AfMB9AHzAf4B8wH0AfMB/gHWAdcB1gH4A4QB2ANKAYsDJQE3AwwBEAMDAQQkAAMCBAMBBAMDAQQDAwEE\n        AwMBBAMDAQQDAwEEAwMBBAMDAQQDAwEEAwMBBAMDAQQDAwEEAwMBBAMDAQQDAwEEAwMBBAMDAQQDAwEE\n        AwMBBAMDAQQDAwEEAwMBBAMDAQQDAQECAwABARwAAxYBHwNAAW4BfAGMAZ8B/gFkAYEBmAH/AWMBgQGY\n        Af8BZQGDAZoB/wFbAXgBlAH/AUwBVgFeAeABUQFTAVQBwAFUAVYBVwG9AU0BYQFrAfkBUwFVAVYBwwFa\n        AV4BYQHSAWIBdAGAAfYBJAFBAVwB/wEVAS8BRwH/ARABJwE9Af8BGgEpAToB+gEyATUBOwHrA0gBhgMx\n        AU4DHwEsAwYBCAMCAQMDAAEBHAADCAELAy4BSAGCAoMB3gG2AbkBuwH0Ac0B0AHRAfwBygHOAdAB/AHE\n        AcsBzAH8AbkBwQHGAfwBfAGIAZMB/AE3AUkBXAH8ARwBKwE6AfsBRgFJAU0B2QFOAk8BqQNGAYADPwFu\n        AzoBYQMyAVEDKwFCAyMBMwMZASMDEAEVAwcBCQMAAQEfAAEBAwMBBAMNAREDHQEpAzMBUwNPAZMDcAHH\n        A6wB6wHzAfQB8wH+AbQCtQHyA2IBugNBAXIDJgE5A10BrgGiAaMBogHpAdkB2gHZAfoBvwLAAfQDdAHL\n        A1EBlgM4AV0DHgErAw0BEgMEAQYDAQECHAADAQECAwQBBQMMARADFAEcAx0BKQMjATMDIwEzAyMBMwMj\n        ATMDIwEzAyEBMAMdASkDFgEeAwsBDwMNARIDFAEcAx0BKQMjATMDIwEzAyMBMwMjATMDIwEzAyEBMAMd\n        ASkDFQEdAwoBDQMEAQYDAQECHAADFgEfA0ABbgGSAacBugH+AXsBlwGtAf8BhAGcAa8B/wGHAZkBpgH7\n        AW8BgAGOAfEBUwFZAV0B0wFQAVMBVQHGAVEBVAFYAdEBVwFiAXUB+wFSAVUBWAHPAVcBWAFbAcsBYgFp\n        AXMB3wFfAXsBjgH+AT0BWAFvAf8BIwE7AVMB/wEcASkBPgH6ATIBOQE6AekDQwF3AygBPQMYASEDBAEG\n        AwEBAgMAAQEcAAMOARMDNgFYAbkBvQG8AfQBzALPAfgB1ALVAfkB0wLVAfkB0gHVAdQB+gHHAc0BzwH7\n        AZIBnwGrAfwBUwFoAXgB/AEmATYBSgH8AS0BOAFCAfABSwFOAVEBzAFNAk4BnAM+AWwDPAFnAzkBYAM1\n        AVcDMAFNAyoBQAMgAS8DEwEaAwQBBgMBAQIfAAEBAwIBAwMFAQcDDQERAykBPgM/AW0DVQGcA3YByQN8\n        AdIDUQGZAzIBUAMgAS4DUQGZAXICcwHLA3YBzANYAaQDQQFxAysBQgMUARwDBAEGAwIBAwMAAQEDAAEB\n        GwABAQMDAQQDCAELAyYEOAFdA0IBdgNIAYMDSAGDA0gBgwNIAYMDSAGDA0UBfAM8AWYDLQFGAxoBJAMq\n        AUADOAFdA0IBdgNIAYMDSAGDA0gBgwNIAYMDSAGDA0UBfAM7AWUDLAFEAxUBHQMIAQsDAgEDHAADFgEf\n        A0ABbgGxAcUB1AH+AZ4BsAG+Af0BjgGcAacB9AF9AYQBiQHjAWUBaQFsAc4BUwFVAVcBugFSAVUBWAHP\n        AUwBWAFjAe8BdAGCAZUB/gFPAVYBXQHiAVIBVAFWAcIBWgFbAVwBvQFzAYUBkgHxAWEBcgGCAfEBQwFc\n        AW8B+AEqAUEBTgH5ATYBOAE/AecDPAFmAx0BKQMNARIDAgEDAwABASAAAw0BEQMwAUsDegHLAaoBqwGq\n        AeoByQHKAcgB9gHRAdIBzwH3AdMB1QHSAfgBzwHSAdQB+gGsAbkBwQH7AXsBiAGWAfwBNwFLAWUB/AEg\n        AS0BQQH7ATMBPAFDAesBTQFPAVABxgNJAYkDRgGAAz8BbwM5AV8DNgFZAzQBVAMrAUMDHgErAwoBDQMD\n        AQQnAAQBAQIDBgEIAxUBHQMqBEABcQNKAYgDOgFiAyMBNAMjATQDQgF1A00BkQNIAYMDLAFEAxYBHwMJ\n        AQwDAgEDAwABAScAAQEDBAEGAw0BEgM/AWwDVwGpA2gByQNqAdIDagHSA2oB0gNqAdIDagHSA2EBxwNQ\n        AZ4DPQFpAyYBOQNDAXcDVwGpA2gByQNqAdIDagHSA2oB0gNqAdIDagHSA2EBxwNQAZ0DOwFkAx0BKgML\n        AQ8DAgEDHAADFgEfA0ABbgHYAeYB7QH+AbwBxAHJAfYBcwF1AXgB0QJUAVUBpwNLAY8DSwGOAVgBWgFc\n        AcABcQGEAYwB9QHCAdAB3AH/AWQBawF0AeQBUwFUAVYBswFNAk4BnAFMAVABUwHQAVkBXAFfAckBZQFv\n        AXgB4wFcAWwBhgH5AToBPgFEAeUDNQFXAxIBGAMFAQcsAAMNAREDLQFFA2wBwQG2AbkBtwHxAtEBzwH3\n        AtEBzgH3Ac0B0gHUAfkBugHFAcwB+wGUAacBtQH8AWUBeQGAAfwBKwE8AUsB/AEWASgBMwH8ARwBKgE1\n        AfcBMgE6AUAB6QFJAUwBUAHQAkwBTQGWAzkBYAMzAVMDMwFSAy4BRwMiATIDDwEUAwQBBTAAAwEBAgME\n        AQUDBwEJAxEBFwMfASwDLQFGAzsBZQNAAXADOAFdAyYBOAMJAQwDBAEFAwEBAiwAAwEBAgMHAQkDEwEa\n        A1IBnAOTAeMB8wH0AfMB/gHzAfQB8wH+AfMB9AHzAf4B8wH0AfMB/gHzAfQB8wH+AfMB9AHzAf4DrQHw\n        A18BtgNAAXADKgFAA1UBpQOTAeMB8wH0AfMB/gHzAfQB8wH+AfMB9AHzAf4B8wH0AfMB/gHzAfQB8wH+\n        AfMB9AHzAf4DrQHwA18BtgM+AWsDHgErAwwBEAMDAQQDAAEBGAADEgEZAzEBTwNXAaUBYAJjAb8BWwFf\n        AWABxgFYAVsBXQHDAVYCWAG8AVoBXQFeAcABXQFgAWMByAFYAWABYwHWAU8BVAFbAekBVgFXAVkBwgFW\n        AVgBWgHBAVcBWAFbAcsBUwFWAVgBwwFMAVIBVwHcAVIBVwFeAdkBWAFbAV0ByAFSAVMBVAG2AyoBQQML\n        AQ8DAwEELAADAwEEAw0BEQMwBEsBiQNkAbsCegF5AdIBtgG3AboB8QHOAdIB1wH8AcMBzQHRAfwBsgG9\n        AcQB/QFqAYMBkgH9AT0BTAFZAf0BHgEsAToB+wEbASoBNgH3ASwBNgFBAfABRgFNAU8B1gFPAlABqgNA\n        AXADMgFRAygBPQMeASsDCgEOAwMBBDMABAEBAgMEAQUDHQEpAz4BagNWAagDYgHBA1MBpQNEAXoDLQFF\n        AwwBEAMFAQcDAQECLwABAQMEAQYDDQESA0kBhgNsAcgDkwHjA5MB4wOTAeMDkwHjA5MB4wOTAeMDcwHR\n        A00BjwMuAUgDGgEkA0sBiwNtAckDkwHjA5MB4wOTAeMDkwHjA5MB4wOTAeMDcwHRA00BjwMsAUMDDQES\n        AwYBCAMCAQMDAAEBGAADCgENAxoBJAMsAUQBTgJPAZYBYAFkAWgBywFlAW4BeQHfAVwBXwFlAc4CWwFe\n        AcQBVgFZAVoBwgFQAVQBWQHNATQBQAFLAesBUgFTAVUBtwFTAVUBVgG8AVUBWQFaAdMBVAFZAV4B2gFE\n        AVABXAHvAVIBVgFZAc8BTQJOAZcDPAFmAxsBJgMHAQoDAgEDNAADDQESAyQBNgM3AVsDQgF0AWoCawHA\n        AaQBpgGnAeoB0QHXAdoB+wHCAc0B1wH9AY8BoQGsAf0BVwFrAYEB/QExAUMBVwH8ARgBKwE7AfwBHgEt\n        AT4B/AEpATcBPwH0AUEBRAFIAd0CTwFQAbIDNAFVAyABLwMXASADBQEHAwEBAjcAAQEDAwEEAyMBNANM\n        AYsDeQHZAaUBpwGlAe8DXgHAA0kBiQMxAU4DEAEWAwcBCQMBAQIvAAEBAwMBBAMIAQsDMQFPA0QBeANL\n        AYkDSwGJA0sBiQNLAYkDSwGJA0sBiQNFAXwDMgFRAxkBIwMMARADMgFRA0QBeANLAYkDSwGJA0sBiQNL\n        AYkDSwGJA0sBiQNFAXwDMgFRAxcBIAMEAQUDAgEDAwEBAgMAAQEYAAMBAQIDAQECAwABAQNBAXIBaAFr\n        AW0ByQGBAZABnAHwAVkBYAFpAdQBVAFXAVkBvwFUAVgBWwHEAVUBXgFkAdoBSAFcAWsB9gFUAVgBWwHI\n        AVEBVAFWAb0BUgFWAVgBzwFKAVgBbQH3AU8BXgFnAfQCVQFYAbcDOwFlAxYBHwMLAQ8DBAEGAwEBAjgA\n        AwMBBAMIAQsDEwEaA0IBcwFpAmwBvwGzAbYBugHxAb0BxQHRAf0BkwGjAa4B/QFtAYYBlQH9AVMBaQF5\n        AfwBNQFJAVgB/QEoATgBRgH8ARoBKwE3AfwBGwEqATEB9gE2ATgBPwHnAzQBVQMVAR0DDQESAwEBAgMA\n        AQE3AAEBAwMBBAMmATkDUQGWA50B6QHzAfQB8wH+A2cByQNLAZADNAFVAxQBHAMIAQsDAQECMAADAQEC\n        AwQBBQMSARgDGgEkAx0BKQMdASkDHQEpAx0BKQMdASkDHQEpAxoBJQMRARcDBwEJAwQBBQMSARgDGgEk\n        Ax0BKQMdASkDHQEpAx0BKQMdASkDHQEpAxoBJQMRARcDBgEIAwABATAAAy4BRwFWAlgBpgFyAYIBiwHp\n        AUQBVAFhAd8BTwFZAWEB1QFiAXIBfgHpAZMBrwHDAf8BswHJAdgB/wFfAXYBjQH7AU0BVgFdAeIBTwFT\n        AVkB1wFKAWgBfAH8AVcBXgFjAdsBSAJJAYcDIgExAwYBCAMDAQQDAAEBSAADEwEaA0MBdQF4AXkBfAHV\n        AbIBvQHIAfwBfgGMAZsB/AFwAYkBmAH9AXEBjAGbAf0BbQGJAZgB/QErAT4BTAH8ARMBKAEyAfwBIAEr\n        ATgB9AFBAUIBRwHeAywBRAMJAQwDBAEFPwABAQMDAQQDJgE5A1EBlgOdAekB8wH0AfMB/gNnAckDTgGU\n        AzgBXAMXASADCQEMAwIBA8gAAxYBHwNAAW8BWwFhAWcBxAFaAYQBnwH3AYgBnwGxAfUBrAG9Ac0B+gHJ\n        AdgB5gH/AcsB2gHmAf8BqAG5AcQB/gGDAZcBoAH4AWEBbQF9AfQBLQFGAVkB+wFNAU8BUAGeAzEBTQMO\n        ARMDAgEDAwABAUwAAwUBBwMtAUUDVQGgAbUBwgHIAfsBkgGhAbEB/AGEAZcBpgH9AXYBkQGgAf0BhQGY\n        AaUB/QFDAVQBZgH9ASQBOQFGAf0BPgFGAUwB4AFJAkoBjAMcASgDAwEEAwABAT8AAQEDAwEEAyYBOQNR\n        AZYDnQHpAfMB9AHzAf4DZgHGA00BlAM7AWQDIgEyAw0BEgMDAQTIAAMSARgDPQFoAWEBZAFoAcQBrQHI\n        Ad0B/wHNAeMB8AH/AdkB6QH0Af8B1wHkAfAB/wHRAd4B6QH/AcUB0gHeAf8BsAG/Ac0B/wGNAZ4BrgH/\n        AVgBawF8AfwCTgFPAZgDKwFCAwcBCgMAAQFTAAEBAyYBOQNOAZQBfwGOAZoB/AGWAacBswH8AZQBpQGu\n        Af0BdAGOAZwB/QFfAXMBiAH9AVUBagGAAf0BRwFZAWkB+QFSAVUBWQHIAywBQwMNARIDAAEBQwABAQMD\n        AQQDJgE5A1EBlgOdAekB8wH0AfMB/gNhAcIDSwGQAzsBZAMnATsDEAEWAwQBBQMAAQHEAAMQARYDNgFY\n        AlcBWAGlAZkBmgGdAeABywHTAdcB9gHeAewB9AH/AdAB3wHrAf8ByAHXAeUB/wHGAdQB4gH/AbEBwAHK\n        AfsBkAGaAZ4B7QFoAWwBcQHNA0cBgAMmATgDBgEIVwABAQMhATABRwJIAYMBWQFnAW8B8gGDAY4BlgH5\n        AX8BkAGdAfwBbwF+AYsB/AFYAWwBewH8AW4BhQGLAfcBYgFqAXEB3AJOAU8BlgMLAQ8DAwEERwABAQMD\n        AQQDJgE5A1EBlgOdAekB8wH0AfMB/gNfAbkDRgGBAzQBVQMkATYDEAEVAwQBBgMAAQHIAAMCAQMDGgEl\n        A0gBgwOSAdwB0wHbAeMB/QHFAdUB4wH/AbcBygHdAf8BzQHeAe4B/wGiAasBrwHvAmEBYgG2AyYBOQMK\n        AQ5gAAMFAQcDKQE+AWQBaAFqAc8BRwFVAWQB8QFAAVEBZAH9AWABcgGIAf0BrgG5Ab0B/AGEAYgBiQHj\n        A04BkAMjATRPAAEBAwMBBAMmATkDUQGWA50B6QHzAfQB8wH+A1gBpwM6AWADIAEvAxUBHQMKAQ0DAwEE\n        AwABAcsAAQEDBwEJAxgBIQM2AVkCUQFTAZgBcQFyAXQBzQGQAZQBnAHpAWEBYwFlAbgDRQF6AygBPQMK\n        AQ4DAwEEYAADAQECAwwBEAMkATYDSAGDAVsBXQFeAbwBaAFsAW4BzwFXAlgBqgM8AWYDIQEwAwoBDU8A\n        AQEDAgEDAyABLgNIAYIDcQHOA5MB4wNLAYoDKgFBAw4BEwMIAQsDBAEGAwIBAwMAAQHUAAMRARcDKgFB\n        Az8BbQNMAYwDNgFZAx4BKwMHAQpvAAQBAQIDIwEzAzkBXwNAAW8DLgFIAxYBHgMGAQhTAAQBAQIDFAEb\n        AzEBTQNFAXsDSgGIAzIBUAMYASIDBAEGAwIBAwMBAQIDAAEBAwABAdgAAwYBCAMRARcDHQEpAwoBDgMB\n        AQJ4AAMEAQUDDQESAxEBFwMAAQFfAAEBAwYBCAMRARcDGgElAx0BKQMRARcDBwEKAwEBAv8A/wD/AP8A\n        /wD/AP8A/wD/AP8AugABQgFNAT4HAAE+AwABKAMAAYADAAFgAwABAQEAAQEGAAEGFgAD/wEAAfwCAAEf\n        Af8B+AEPAf8IAAH4AgABAwH/AcABAQH/CAAB+AIAAQMB/wGAAQAB/wgAAfgCAAEDAf8BgAEAAX8IAAH4\n        AgABBwH+AgABHwgAAfgCAAEPAf4CAAEPCAAB+AIAAR8B/gIAAQ8IAAH4AgABDwH+AgABDwgAAfgCAAEP\n        AfwCAAEPCAAB+AIAAQcB/AIAAQ8IAAH4AgABBwH8AgABDwgAAfgCAAEDAf4CAAEHCAAB+AMAAf4CAAED\n        CAAB+AMAAf4CAAEBCAAB+AMAAf4CAAEBCAAB+AMAAf4CAAEBCAAB+AMAAf4CAAEBCAAB+AMAAf4CAAEB\n        CAAB+AMAAf4CAAEBCAAB+AIAAf8B/gIAAQMIAAH4AgAB/wH+AgABBwgAAfgCAAH/AfwCAAEPCAAB+AIA\n        Af8B/AIAAR8IAAH4AgAB/wH8AgABDwgAAeACAAH/Af4CAAEPCAAB4AIAAf8B/AIAAQ8IAAH4AgAB/wH8\n        AgABDwgAAfgCAAH/Af4CAAEPCAAB/AEAAQEB/wH+AgABDwgAAf4BAAEBAv8CAAEPCAAB/wGAAQ8C/wH8\n        AQABHwgABf8B/AEAAX8IAAb/AfgBfwb/AeABDwb/AfgBfwb/AcABDwb/AfwBfwH/AfwBHwL/AY8BwAEP\n        Cf8B/AEfAv8BjwGAAQ8E/wH8AgAC/wHwAQMC/wEBAYABAQT/AfgCAAE/Af8BwAEBAf8B/AMABP8B8AIA\n        AR8B/wHAAQEB/wH8AwAE/wHgAgABHwH/AcABAAH/AfwDAAH/AfgBDwH/AcACAAEPAfwCAAEPAfwDAAH/\n        AfABAwH/AcACAAEPAfgCAAEDAfwDAAH/AfABAwH/AcACAAEPAfgBAAGAAQMB/AMAAf8B4AEDAf8BwAEP\n        AcABDwHwAQMB+AEBAfwDAAH/AeABAwH/AcABDwHgAQcB4AEHAfgBAQH4AwAB/wHgAQMB/wHAAQ8B4AEH\n        AeABDwH4AQEB4AMAAf8B4AEDAf8BwAEPAeABDwHgAQ8B/AEBAeADAAH/AeABAQH/AeABDwH4AQcB4AEP\n        AfwBAQHgAwAB/wHgAQEB/wHgAQ8B8AEDAfABDwH8AQEB4AMAAf8B4AEBAf8BwAEHAeABAQHwAQEB/AEB\n        AcACAAEBAf8B4AEBAf8BwAEBAeABAQH4AQEB+AEPAcACAAEDAf8B4AEBAf8BwAEAAUABAQH8AQEB+AEH\n        AYgCAAEDAf8B8AEBAf8BwAIAAQEB+AIAAQMBgAIAAQMB/wHwAQcB/wHAAgABAQH4AgABAwGAAgABDwH/\n        AfgBHwH/AcACAAEDAfwCAAEHAYABCAEAAQ8E/wHAAgABDwH8AgABDwHAAQgBwwX/AeACAAEPAfwCAAEP\n        AcABBAH3Bf8B8AIAAQ8B/AIAAQ8B4AEABv8B+AIAAT8B/gIAAR8B/gEAAT8F/wH8AQABAQL/AoAC/wHA\n        AT8F/wH+AgMC/wKAAv8BwAEfDv8B/AEfDv8BDgEfDf8B/AEPM/8B+QHBDv8BwAEAAX8B/wHAAR8B/wH4\n        AX8B/AEfBf8CAAEPAf8BgAEPAf8B+AEPAfgBDwT/Af4CAAEPAf8BgAEHAf8B8AEDAeABDwT/Af4CAAEP\n        Af8BgAEDAf8B4AEBAcABDwT/AfwCAAEDAf4BAAEBAf8B4AIAAQME/wH8AgABAwH+AgAB/wHgAgABAwT/\n        AfwCAAEDAf4CAAEfAeACAAEDAfgCAAEDAfwCAAEDAf4CAAEfAeACAAEPAfgCAAEBAfwCAAEBAfwCAAEH\n        AfACAAEPAeACAAEBAfwCAAEBAfwCAAEDAfgCAAEPAcACAAEBAfwCAAEDAfwCAAEDAf4CAAF/AcACAAEB\n        AfwCAAEPAf4CAAEDAf8BwAEBAf8BwAMAAfwCAAEPAf4CAAEDAf8BwAEBAf8BwAMAAfwCAAEPAf8BgAEA\n        AQMB/wHgAQEB/wHAAwAB/AIAAQ8B/wHAAQABAwH/AeABAQH/AeACAAEHAf8BgAEAAR8B/wH4AQABDwH/\n        AeABAQb/AYABAAE/Af8B+AEAAQ8B/wHgAQEG/wGAAQABfwH/AfgBAAEfAf8B4AEABv8BgAEAAv8B+AEA\n        AT8B/wHgAQAG/wHAAQMC/wH8AQAC/wHgAQAG/wHAAQMC/wH8AQAC/wHgAQAG/wH4AQ8C/wH+AQEC/wHg\n        AQAG/wH8AR8D/wGHAv8B8AEPVf8L\n</value>\n  </data>\n  <metadata name=\"contextMenuStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>210, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/Controls/KillReportInvolvedParties.Designer.cs",
    "content": "﻿namespace EVEMon.Controls\n{\n    partial class KillReportInvolvedParties\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.MainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.InvolvedPartiesLabel = new System.Windows.Forms.Label();\n            this.TotalDamageTakenLabel = new System.Windows.Forms.Label();\n            this.FinalBlowLabel = new System.Windows.Forms.Label();\n            this.TopDamageLabel = new System.Windows.Forms.Label();\n            this.InvolvedPartiesPanel = new System.Windows.Forms.Panel();\n            this.FinalBlowAttacker = new EVEMon.Controls.KillReportAttacker();\n            this.TopDamageAttacker = new EVEMon.Controls.KillReportAttacker();\n            this.MainTableLayoutPanel.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // MainTableLayoutPanel\n            // \n            this.MainTableLayoutPanel.AutoSize = true;\n            this.MainTableLayoutPanel.ColumnCount = 1;\n            this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.MainTableLayoutPanel.Controls.Add(this.InvolvedPartiesLabel, 0, 0);\n            this.MainTableLayoutPanel.Controls.Add(this.TotalDamageTakenLabel, 0, 1);\n            this.MainTableLayoutPanel.Controls.Add(this.FinalBlowAttacker, 0, 3);\n            this.MainTableLayoutPanel.Controls.Add(this.TopDamageAttacker, 0, 5);\n            this.MainTableLayoutPanel.Controls.Add(this.FinalBlowLabel, 0, 2);\n            this.MainTableLayoutPanel.Controls.Add(this.TopDamageLabel, 0, 4);\n            this.MainTableLayoutPanel.Controls.Add(this.InvolvedPartiesPanel, 0, 6);\n            this.MainTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.MainTableLayoutPanel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.MainTableLayoutPanel.Location = new System.Drawing.Point(0, 3);\n            this.MainTableLayoutPanel.Name = \"MainTableLayoutPanel\";\n            this.MainTableLayoutPanel.RowCount = 7;\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.MainTableLayoutPanel.Size = new System.Drawing.Size(262, 401);\n            this.MainTableLayoutPanel.TabIndex = 0;\n            // \n            // InvolvedPartiesLabel\n            // \n            this.InvolvedPartiesLabel.AutoSize = true;\n            this.InvolvedPartiesLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 9.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.InvolvedPartiesLabel.Location = new System.Drawing.Point(3, 0);\n            this.InvolvedPartiesLabel.Name = \"InvolvedPartiesLabel\";\n            this.InvolvedPartiesLabel.Size = new System.Drawing.Size(132, 16);\n            this.InvolvedPartiesLabel.TabIndex = 0;\n            this.InvolvedPartiesLabel.Text = \"Involved Parties ({0})\";\n            // \n            // TotalDamageTakenLabel\n            // \n            this.TotalDamageTakenLabel.AutoSize = true;\n            this.TotalDamageTakenLabel.ForeColor = System.Drawing.Color.Red;\n            this.TotalDamageTakenLabel.Location = new System.Drawing.Point(3, 16);\n            this.TotalDamageTakenLabel.Name = \"TotalDamageTakenLabel\";\n            this.TotalDamageTakenLabel.Size = new System.Drawing.Size(125, 13);\n            this.TotalDamageTakenLabel.TabIndex = 1;\n            this.TotalDamageTakenLabel.Text = \"{0:N0} Total Damage Taken\";\n            // \n            // FinalBlowLabel\n            // \n            this.FinalBlowLabel.AutoSize = true;\n            this.FinalBlowLabel.Location = new System.Drawing.Point(3, 29);\n            this.FinalBlowLabel.Name = \"FinalBlowLabel\";\n            this.FinalBlowLabel.Padding = new System.Windows.Forms.Padding(0, 6, 0, 0);\n            this.FinalBlowLabel.Size = new System.Drawing.Size(55, 19);\n            this.FinalBlowLabel.TabIndex = 4;\n            this.FinalBlowLabel.Text = \"Final Blow\";\n            // \n            // TopDamageLabel\n            // \n            this.TopDamageLabel.AutoSize = true;\n            this.TopDamageLabel.Location = new System.Drawing.Point(3, 118);\n            this.TopDamageLabel.Name = \"TopDamageLabel\";\n            this.TopDamageLabel.Padding = new System.Windows.Forms.Padding(0, 6, 0, 0);\n            this.TopDamageLabel.Size = new System.Drawing.Size(67, 19);\n            this.TopDamageLabel.TabIndex = 5;\n            this.TopDamageLabel.Text = \"Top damage\";\n            // \n            // InvolvedPartiesPanel\n            // \n            this.InvolvedPartiesPanel.AutoScroll = true;\n            this.InvolvedPartiesPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.InvolvedPartiesPanel.Location = new System.Drawing.Point(0, 207);\n            this.InvolvedPartiesPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.InvolvedPartiesPanel.Name = \"InvolvedPartiesPanel\";\n            this.InvolvedPartiesPanel.Size = new System.Drawing.Size(262, 194);\n            this.InvolvedPartiesPanel.TabIndex = 6;\n            // \n            // FinalBlowAttacker\n            // \n            this.FinalBlowAttacker.AutoSize = true;\n            this.FinalBlowAttacker.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.FinalBlowAttacker.Location = new System.Drawing.Point(3, 48);\n            this.FinalBlowAttacker.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0);\n            this.FinalBlowAttacker.Name = \"FinalBlowAttacker\";\n            this.FinalBlowAttacker.Size = new System.Drawing.Size(256, 70);\n            this.FinalBlowAttacker.TabIndex = 2;\n            // \n            // TopDamageAttacker\n            // \n            this.TopDamageAttacker.AutoSize = true;\n            this.TopDamageAttacker.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.TopDamageAttacker.Location = new System.Drawing.Point(3, 137);\n            this.TopDamageAttacker.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0);\n            this.TopDamageAttacker.Name = \"TopDamageAttacker\";\n            this.TopDamageAttacker.Size = new System.Drawing.Size(256, 70);\n            this.TopDamageAttacker.TabIndex = 3;\n            // \n            // KillReportInvolvedParties\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.MainTableLayoutPanel);\n            this.Name = \"KillReportInvolvedParties\";\n            this.Padding = new System.Windows.Forms.Padding(0, 3, 0, 0);\n            this.Size = new System.Drawing.Size(262, 404);\n            this.MainTableLayoutPanel.ResumeLayout(false);\n            this.MainTableLayoutPanel.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel MainTableLayoutPanel;\n        private System.Windows.Forms.Label InvolvedPartiesLabel;\n        private System.Windows.Forms.Label TotalDamageTakenLabel;\n        private KillReportAttacker FinalBlowAttacker;\n        private KillReportAttacker TopDamageAttacker;\n        private System.Windows.Forms.Label FinalBlowLabel;\n        private System.Windows.Forms.Label TopDamageLabel;\n        private System.Windows.Forms.Panel InvolvedPartiesPanel;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/KillReportInvolvedParties.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Controls\n{\n    public partial class KillReportInvolvedParties : UserControl\n    {\n        private KillLog m_killLog;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"KillReportInvolvedParties\"/> class.\n        /// </summary>\n        public KillReportInvolvedParties()\n        {\n            InitializeComponent();\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the kill log.\n        /// </summary>\n        /// <value>\n        /// The kill log.\n        /// </value>\n        internal KillLog KillLog\n        {\n            get { return m_killLog; }\n            set\n            {\n                m_killLog = value;\n                UpdateContent();\n            }\n        }\n\n        #endregion\n\n\n        #region Content Management\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            int topDamageDone = m_killLog.Attackers.Max(y => y.DamageDone);\n            SerializableKillLogAttackersListItem finalBlowAttacker = m_killLog.Attackers.Single(x => x.FinalBlow);\n            SerializableKillLogAttackersListItem topDamageAttacker = m_killLog.Attackers.Single(x => x.DamageDone == topDamageDone);\n\n            FinalBlowAttacker.KillLog = m_killLog;\n            FinalBlowAttacker.Attacker = finalBlowAttacker;\n            TopDamageAttacker.KillLog = m_killLog;\n            TopDamageAttacker.Attacker = topDamageAttacker;\n\n            InvolvedPartiesLabel.Text = string.Format(CultureConstants.DefaultCulture, InvolvedPartiesLabel.Text,\n                                                      m_killLog.Attackers.Count());\n            TotalDamageTakenLabel.Text = string.Format(CultureConstants.DefaultCulture, TotalDamageTakenLabel.Text,\n                                                       m_killLog.Victim.DamageTaken);\n\n            // Add the rest of the gang\n            IList<SerializableKillLogAttackersListItem> remainingAttackers = m_killLog.Attackers\n                .Except(new[] { finalBlowAttacker, topDamageAttacker }).ToList();\n\n            if (remainingAttackers.Any())\n                InvolvedPartiesPanel.BorderStyle = BorderStyle.Fixed3D;\n\n            foreach (SerializableKillLogAttackersListItem attacker in remainingAttackers.OrderBy(x => x.DamageDone))\n            {\n                KillReportAttacker attackerControl = new KillReportAttacker();\n                InvolvedPartiesPanel.Controls.Add(attackerControl);\n                attackerControl.Dock = DockStyle.Top;\n                attackerControl.KillLog = m_killLog;\n                attackerControl.Attacker = attacker;\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/KillReportInvolvedParties.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/Controls/KillReportVictim.Designer.cs",
    "content": "﻿namespace EVEMon.Controls\n{\n    partial class KillReportVictim\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(KillReportVictim));\n            this.MainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.CharacterPictureBox = new System.Windows.Forms.PictureBox();\n            this.ShipPictureBox = new System.Windows.Forms.PictureBox();\n            this.VictimInfoTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.CorpPictureBox = new System.Windows.Forms.PictureBox();\n            this.AlliancePictureBox = new System.Windows.Forms.PictureBox();\n            this.KillTimeLabel = new System.Windows.Forms.Label();\n            this.SolarSystemFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n            this.SolarSystemLabel = new System.Windows.Forms.Label();\n            this.SecStatusLabel = new System.Windows.Forms.Label();\n            this.Separator1Label = new System.Windows.Forms.Label();\n            this.ConstelationLabel = new System.Windows.Forms.Label();\n            this.Separator2Label = new System.Windows.Forms.Label();\n            this.RegionLabel = new System.Windows.Forms.Label();\n            this.CorpAllianceFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n            this.CorpNameLabel = new System.Windows.Forms.Label();\n            this.AllianceNameLabel = new System.Windows.Forms.Label();\n            this.ShipNameGroupFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n            this.ShipNameLabel = new System.Windows.Forms.Label();\n            this.ShipGroupLabel = new System.Windows.Forms.Label();\n            this.CharacterNamePanel = new System.Windows.Forms.Panel();\n            this.CopyPictureBox = new System.Windows.Forms.PictureBox();\n            this.CharacterNameLabel = new System.Windows.Forms.Label();\n            this.toolTip = new System.Windows.Forms.ToolTip(this.components);\n            this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.showInShipBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.MainTableLayoutPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.CharacterPictureBox)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.ShipPictureBox)).BeginInit();\n            this.VictimInfoTableLayoutPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.CorpPictureBox)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.AlliancePictureBox)).BeginInit();\n            this.SolarSystemFlowLayoutPanel.SuspendLayout();\n            this.CorpAllianceFlowLayoutPanel.SuspendLayout();\n            this.ShipNameGroupFlowLayoutPanel.SuspendLayout();\n            this.CharacterNamePanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.CopyPictureBox)).BeginInit();\n            this.contextMenuStrip.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // MainTableLayoutPanel\n            // \n            this.MainTableLayoutPanel.AutoSize = true;\n            this.MainTableLayoutPanel.ColumnCount = 3;\n            this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.MainTableLayoutPanel.Controls.Add(this.CharacterPictureBox, 0, 0);\n            this.MainTableLayoutPanel.Controls.Add(this.ShipPictureBox, 1, 0);\n            this.MainTableLayoutPanel.Controls.Add(this.VictimInfoTableLayoutPanel, 2, 0);\n            this.MainTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.MainTableLayoutPanel.Location = new System.Drawing.Point(0, 0);\n            this.MainTableLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.MainTableLayoutPanel.Name = \"MainTableLayoutPanel\";\n            this.MainTableLayoutPanel.RowCount = 1;\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.Size = new System.Drawing.Size(538, 134);\n            this.MainTableLayoutPanel.TabIndex = 1;\n            // \n            // CharacterPictureBox\n            // \n            this.CharacterPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"CharacterPictureBox.Image\")));\n            this.CharacterPictureBox.Location = new System.Drawing.Point(3, 3);\n            this.CharacterPictureBox.Name = \"CharacterPictureBox\";\n            this.CharacterPictureBox.Size = new System.Drawing.Size(128, 128);\n            this.CharacterPictureBox.TabIndex = 0;\n            this.CharacterPictureBox.TabStop = false;\n            // \n            // ShipPictureBox\n            // \n            this.ShipPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"ShipPictureBox.Image\")));\n            this.ShipPictureBox.Location = new System.Drawing.Point(137, 3);\n            this.ShipPictureBox.Name = \"ShipPictureBox\";\n            this.ShipPictureBox.Size = new System.Drawing.Size(128, 128);\n            this.ShipPictureBox.TabIndex = 1;\n            this.ShipPictureBox.TabStop = false;\n            this.ShipPictureBox.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ShipPictureBox_MouseDown);\n            this.ShipPictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ShipPictureBox_MouseMove);\n            // \n            // VictimInfoTableLayoutPanel\n            // \n            this.VictimInfoTableLayoutPanel.ColumnCount = 3;\n            this.VictimInfoTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.VictimInfoTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.VictimInfoTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.VictimInfoTableLayoutPanel.Controls.Add(this.CorpPictureBox, 0, 1);\n            this.VictimInfoTableLayoutPanel.Controls.Add(this.AlliancePictureBox, 1, 1);\n            this.VictimInfoTableLayoutPanel.Controls.Add(this.KillTimeLabel, 0, 3);\n            this.VictimInfoTableLayoutPanel.Controls.Add(this.SolarSystemFlowLayoutPanel, 0, 4);\n            this.VictimInfoTableLayoutPanel.Controls.Add(this.CorpAllianceFlowLayoutPanel, 2, 1);\n            this.VictimInfoTableLayoutPanel.Controls.Add(this.ShipNameGroupFlowLayoutPanel, 0, 2);\n            this.VictimInfoTableLayoutPanel.Controls.Add(this.CharacterNamePanel, 0, 0);\n            this.VictimInfoTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.VictimInfoTableLayoutPanel.Location = new System.Drawing.Point(268, 0);\n            this.VictimInfoTableLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.VictimInfoTableLayoutPanel.Name = \"VictimInfoTableLayoutPanel\";\n            this.VictimInfoTableLayoutPanel.RowCount = 5;\n            this.VictimInfoTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.VictimInfoTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.VictimInfoTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.VictimInfoTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.VictimInfoTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.VictimInfoTableLayoutPanel.Size = new System.Drawing.Size(270, 134);\n            this.VictimInfoTableLayoutPanel.TabIndex = 2;\n            // \n            // CorpPictureBox\n            // \n            this.CorpPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"CorpPictureBox.Image\")));\n            this.CorpPictureBox.Location = new System.Drawing.Point(3, 33);\n            this.CorpPictureBox.Name = \"CorpPictureBox\";\n            this.CorpPictureBox.Size = new System.Drawing.Size(32, 32);\n            this.CorpPictureBox.TabIndex = 1;\n            this.CorpPictureBox.TabStop = false;\n            // \n            // AlliancePictureBox\n            // \n            this.AlliancePictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"AlliancePictureBox.Image\")));\n            this.AlliancePictureBox.Location = new System.Drawing.Point(41, 33);\n            this.AlliancePictureBox.Name = \"AlliancePictureBox\";\n            this.AlliancePictureBox.Size = new System.Drawing.Size(32, 32);\n            this.AlliancePictureBox.TabIndex = 2;\n            this.AlliancePictureBox.TabStop = false;\n            // \n            // KillTimeLabel\n            // \n            this.KillTimeLabel.AutoSize = true;\n            this.VictimInfoTableLayoutPanel.SetColumnSpan(this.KillTimeLabel, 3);\n            this.KillTimeLabel.Location = new System.Drawing.Point(0, 98);\n            this.KillTimeLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.KillTimeLabel.Name = \"KillTimeLabel\";\n            this.KillTimeLabel.Padding = new System.Windows.Forms.Padding(0, 3, 0, 0);\n            this.KillTimeLabel.Size = new System.Drawing.Size(46, 16);\n            this.KillTimeLabel.TabIndex = 5;\n            this.KillTimeLabel.Text = \"Kill Time\";\n            // \n            // SolarSystemFlowLayoutPanel\n            // \n            this.VictimInfoTableLayoutPanel.SetColumnSpan(this.SolarSystemFlowLayoutPanel, 3);\n            this.SolarSystemFlowLayoutPanel.Controls.Add(this.SolarSystemLabel);\n            this.SolarSystemFlowLayoutPanel.Controls.Add(this.SecStatusLabel);\n            this.SolarSystemFlowLayoutPanel.Controls.Add(this.Separator1Label);\n            this.SolarSystemFlowLayoutPanel.Controls.Add(this.ConstelationLabel);\n            this.SolarSystemFlowLayoutPanel.Controls.Add(this.Separator2Label);\n            this.SolarSystemFlowLayoutPanel.Controls.Add(this.RegionLabel);\n            this.SolarSystemFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.SolarSystemFlowLayoutPanel.Location = new System.Drawing.Point(0, 114);\n            this.SolarSystemFlowLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.SolarSystemFlowLayoutPanel.Name = \"SolarSystemFlowLayoutPanel\";\n            this.SolarSystemFlowLayoutPanel.Padding = new System.Windows.Forms.Padding(0, 3, 0, 0);\n            this.SolarSystemFlowLayoutPanel.Size = new System.Drawing.Size(270, 20);\n            this.SolarSystemFlowLayoutPanel.TabIndex = 6;\n            // \n            // SolarSystemLabel\n            // \n            this.SolarSystemLabel.AutoSize = true;\n            this.SolarSystemLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.SolarSystemLabel.Location = new System.Drawing.Point(0, 3);\n            this.SolarSystemLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.SolarSystemLabel.Name = \"SolarSystemLabel\";\n            this.SolarSystemLabel.Size = new System.Drawing.Size(80, 13);\n            this.SolarSystemLabel.TabIndex = 0;\n            this.SolarSystemLabel.Text = \"Solar System\";\n            // \n            // SecStatusLabel\n            // \n            this.SecStatusLabel.AutoSize = true;\n            this.SecStatusLabel.Location = new System.Drawing.Point(80, 3);\n            this.SecStatusLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.SecStatusLabel.Name = \"SecStatusLabel\";\n            this.SecStatusLabel.Size = new System.Drawing.Size(22, 13);\n            this.SecStatusLabel.TabIndex = 1;\n            this.SecStatusLabel.Text = \"0.0\";\n            // \n            // Separator1Label\n            // \n            this.Separator1Label.AutoSize = true;\n            this.Separator1Label.Location = new System.Drawing.Point(102, 3);\n            this.Separator1Label.Margin = new System.Windows.Forms.Padding(0);\n            this.Separator1Label.Name = \"Separator1Label\";\n            this.Separator1Label.Size = new System.Drawing.Size(13, 13);\n            this.Separator1Label.TabIndex = 3;\n            this.Separator1Label.Text = \"<\";\n            // \n            // ConstelationLabel\n            // \n            this.ConstelationLabel.AutoSize = true;\n            this.ConstelationLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.ConstelationLabel.Location = new System.Drawing.Point(115, 3);\n            this.ConstelationLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.ConstelationLabel.Name = \"ConstelationLabel\";\n            this.ConstelationLabel.Size = new System.Drawing.Size(77, 13);\n            this.ConstelationLabel.TabIndex = 2;\n            this.ConstelationLabel.Text = \"Constelation\";\n            // \n            // Separator2Label\n            // \n            this.Separator2Label.AutoSize = true;\n            this.Separator2Label.Location = new System.Drawing.Point(192, 3);\n            this.Separator2Label.Margin = new System.Windows.Forms.Padding(0);\n            this.Separator2Label.Name = \"Separator2Label\";\n            this.Separator2Label.Size = new System.Drawing.Size(13, 13);\n            this.Separator2Label.TabIndex = 4;\n            this.Separator2Label.Text = \"<\";\n            // \n            // RegionLabel\n            // \n            this.RegionLabel.AutoSize = true;\n            this.RegionLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.RegionLabel.Location = new System.Drawing.Point(205, 3);\n            this.RegionLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.RegionLabel.Name = \"RegionLabel\";\n            this.RegionLabel.Size = new System.Drawing.Size(47, 13);\n            this.RegionLabel.TabIndex = 5;\n            this.RegionLabel.Text = \"Region\";\n            // \n            // CorpAllianceFlowLayoutPanel\n            // \n            this.CorpAllianceFlowLayoutPanel.Controls.Add(this.CorpNameLabel);\n            this.CorpAllianceFlowLayoutPanel.Controls.Add(this.AllianceNameLabel);\n            this.CorpAllianceFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.CorpAllianceFlowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.CorpAllianceFlowLayoutPanel.Location = new System.Drawing.Point(76, 30);\n            this.CorpAllianceFlowLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.CorpAllianceFlowLayoutPanel.Name = \"CorpAllianceFlowLayoutPanel\";\n            this.CorpAllianceFlowLayoutPanel.Padding = new System.Windows.Forms.Padding(0, 6, 0, 0);\n            this.CorpAllianceFlowLayoutPanel.Size = new System.Drawing.Size(194, 38);\n            this.CorpAllianceFlowLayoutPanel.TabIndex = 7;\n            // \n            // CorpNameLabel\n            // \n            this.CorpNameLabel.AutoSize = true;\n            this.CorpNameLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.CorpNameLabel.Location = new System.Drawing.Point(3, 6);\n            this.CorpNameLabel.Name = \"CorpNameLabel\";\n            this.CorpNameLabel.Size = new System.Drawing.Size(108, 13);\n            this.CorpNameLabel.TabIndex = 4;\n            this.CorpNameLabel.Text = \"Corporation Name\";\n            // \n            // AllianceNameLabel\n            // \n            this.AllianceNameLabel.AutoSize = true;\n            this.AllianceNameLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.AllianceNameLabel.Location = new System.Drawing.Point(3, 19);\n            this.AllianceNameLabel.Name = \"AllianceNameLabel\";\n            this.AllianceNameLabel.Size = new System.Drawing.Size(88, 13);\n            this.AllianceNameLabel.TabIndex = 5;\n            this.AllianceNameLabel.Text = \"Alliance Name\";\n            // \n            // ShipNameGroupFlowLayoutPanel\n            // \n            this.VictimInfoTableLayoutPanel.SetColumnSpan(this.ShipNameGroupFlowLayoutPanel, 3);\n            this.ShipNameGroupFlowLayoutPanel.Controls.Add(this.ShipNameLabel);\n            this.ShipNameGroupFlowLayoutPanel.Controls.Add(this.ShipGroupLabel);\n            this.ShipNameGroupFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ShipNameGroupFlowLayoutPanel.Location = new System.Drawing.Point(0, 68);\n            this.ShipNameGroupFlowLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.ShipNameGroupFlowLayoutPanel.Name = \"ShipNameGroupFlowLayoutPanel\";\n            this.ShipNameGroupFlowLayoutPanel.Padding = new System.Windows.Forms.Padding(0, 8, 0, 6);\n            this.ShipNameGroupFlowLayoutPanel.Size = new System.Drawing.Size(270, 30);\n            this.ShipNameGroupFlowLayoutPanel.TabIndex = 8;\n            // \n            // ShipNameLabel\n            // \n            this.ShipNameLabel.AutoSize = true;\n            this.ShipNameLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.ShipNameLabel.Location = new System.Drawing.Point(0, 8);\n            this.ShipNameLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.ShipNameLabel.Name = \"ShipNameLabel\";\n            this.ShipNameLabel.Size = new System.Drawing.Size(68, 13);\n            this.ShipNameLabel.TabIndex = 3;\n            this.ShipNameLabel.Text = \"Ship Name\";\n            // \n            // ShipGroupLabel\n            // \n            this.ShipGroupLabel.AutoSize = true;\n            this.ShipGroupLabel.Location = new System.Drawing.Point(71, 8);\n            this.ShipGroupLabel.Name = \"ShipGroupLabel\";\n            this.ShipGroupLabel.Size = new System.Drawing.Size(27, 13);\n            this.ShipGroupLabel.TabIndex = 4;\n            this.ShipGroupLabel.Text = \"({0})\";\n            // \n            // CharacterNamePanel\n            // \n            this.VictimInfoTableLayoutPanel.SetColumnSpan(this.CharacterNamePanel, 3);\n            this.CharacterNamePanel.Controls.Add(this.CopyPictureBox);\n            this.CharacterNamePanel.Controls.Add(this.CharacterNameLabel);\n            this.CharacterNamePanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.CharacterNamePanel.Location = new System.Drawing.Point(0, 0);\n            this.CharacterNamePanel.Margin = new System.Windows.Forms.Padding(0);\n            this.CharacterNamePanel.Name = \"CharacterNamePanel\";\n            this.CharacterNamePanel.Size = new System.Drawing.Size(270, 30);\n            this.CharacterNamePanel.TabIndex = 9;\n            // \n            // CopyPictureBox\n            // \n            this.CopyPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.CopyPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"CopyPictureBox.Image\")));\n            this.CopyPictureBox.Location = new System.Drawing.Point(251, 3);\n            this.CopyPictureBox.Name = \"CopyPictureBox\";\n            this.CopyPictureBox.Size = new System.Drawing.Size(16, 16);\n            this.CopyPictureBox.TabIndex = 1;\n            this.CopyPictureBox.TabStop = false;\n            this.toolTip.SetToolTip(this.CopyPictureBox, \"Copy Kill Information to Clipboard\");\n            this.CopyPictureBox.Click += new System.EventHandler(this.CopyPictureBox_Click);\n            // \n            // CharacterNameLabel\n            // \n            this.CharacterNameLabel.AutoSize = true;\n            this.CharacterNameLabel.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 12.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n            this.CharacterNameLabel.Location = new System.Drawing.Point(-1, 3);\n            this.CharacterNameLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.CharacterNameLabel.Name = \"CharacterNameLabel\";\n            this.CharacterNameLabel.Size = new System.Drawing.Size(146, 20);\n            this.CharacterNameLabel.TabIndex = 0;\n            this.CharacterNameLabel.Text = \"Character Name\";\n            // \n            // contextMenuStrip\n            // \n            this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showInShipBrowserMenuItem});\n            this.contextMenuStrip.Name = \"contextMenuStrip\";\n            this.contextMenuStrip.Size = new System.Drawing.Size(197, 48);\n            // \n            // showInShipBrowserMenuItem\n            // \n            this.showInShipBrowserMenuItem.Name = \"showInShipBrowserMenuItem\";\n            this.showInShipBrowserMenuItem.Size = new System.Drawing.Size(196, 22);\n            this.showInShipBrowserMenuItem.Text = \"Show In Ship Browser...\";\n            this.showInShipBrowserMenuItem.Click += new System.EventHandler(this.showInShipBrowserMenuItem_Click);\n            // \n            // KillReportVictim\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.Controls.Add(this.MainTableLayoutPanel);\n            this.Name = \"KillReportVictim\";\n            this.Padding = new System.Windows.Forms.Padding(0, 0, 0, 6);\n            this.Size = new System.Drawing.Size(538, 140);\n            this.MainTableLayoutPanel.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.CharacterPictureBox)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.ShipPictureBox)).EndInit();\n            this.VictimInfoTableLayoutPanel.ResumeLayout(false);\n            this.VictimInfoTableLayoutPanel.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.CorpPictureBox)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.AlliancePictureBox)).EndInit();\n            this.SolarSystemFlowLayoutPanel.ResumeLayout(false);\n            this.SolarSystemFlowLayoutPanel.PerformLayout();\n            this.CorpAllianceFlowLayoutPanel.ResumeLayout(false);\n            this.CorpAllianceFlowLayoutPanel.PerformLayout();\n            this.ShipNameGroupFlowLayoutPanel.ResumeLayout(false);\n            this.ShipNameGroupFlowLayoutPanel.PerformLayout();\n            this.CharacterNamePanel.ResumeLayout(false);\n            this.CharacterNamePanel.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.CopyPictureBox)).EndInit();\n            this.contextMenuStrip.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel MainTableLayoutPanel;\n        private System.Windows.Forms.PictureBox CharacterPictureBox;\n        private System.Windows.Forms.TableLayoutPanel VictimInfoTableLayoutPanel;\n        private System.Windows.Forms.Label CharacterNameLabel;\n        private System.Windows.Forms.PictureBox CorpPictureBox;\n        private System.Windows.Forms.PictureBox AlliancePictureBox;\n        private System.Windows.Forms.Label ShipNameLabel;\n        private System.Windows.Forms.Label CorpNameLabel;\n        private System.Windows.Forms.Label KillTimeLabel;\n        private System.Windows.Forms.Label SolarSystemLabel;\n        private System.Windows.Forms.Label SecStatusLabel;\n        private System.Windows.Forms.Label ConstelationLabel;\n        private System.Windows.Forms.FlowLayoutPanel CorpAllianceFlowLayoutPanel;\n        private System.Windows.Forms.FlowLayoutPanel ShipNameGroupFlowLayoutPanel;\n        private System.Windows.Forms.Label ShipGroupLabel;\n        private System.Windows.Forms.Label AllianceNameLabel;\n        private System.Windows.Forms.Label Separator1Label;\n        private System.Windows.Forms.Label Separator2Label;\n        private System.Windows.Forms.Label RegionLabel;\n        private System.Windows.Forms.FlowLayoutPanel SolarSystemFlowLayoutPanel;\n        private System.Windows.Forms.PictureBox ShipPictureBox;\n        private System.Windows.Forms.Panel CharacterNamePanel;\n        private System.Windows.Forms.PictureBox CopyPictureBox;\n        private System.Windows.Forms.ToolTip toolTip;\n        private System.Windows.Forms.ContextMenuStrip contextMenuStrip;\n        private System.Windows.Forms.ToolStripMenuItem showInShipBrowserMenuItem;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/KillReportVictim.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Service;\nusing EVEMon.SkillPlanner;\n\nnamespace EVEMon.Controls\n{\n    public partial class KillReportVictim : UserControl\n    {\n        private KillLog m_killLog;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"KillReportVictim\"/> class.\n        /// </summary>\n        public KillReportVictim()\n        {\n            InitializeComponent();\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the kill log.\n        /// </summary>\n        /// <value>\n        /// The kill log.\n        /// </value>\n        internal KillLog KillLog\n        {\n            get { return m_killLog; }\n            set\n            {\n                m_killLog = value;\n                UpdateContent();\n            }\n        }\n\n        #endregion\n\n\n        #region Content Management Methods\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            Task.WhenAll(\n                GetImageForAsync(CharacterPictureBox),\n                GetImageForAsync(ShipPictureBox),\n                GetImageForAsync(CorpPictureBox));\n\n            if (m_killLog.Victim.AllianceID != 0)\n            {\n                Task.WhenAll(GetImageForAsync(AlliancePictureBox));\n                AllianceNameLabel.Text = m_killLog.Victim.AllianceName;\n            }\n            else\n            {\n                CorpAllianceFlowLayoutPanel.Controls.Remove(AllianceNameLabel);\n                CorpAllianceFlowLayoutPanel.Padding = new Padding(0, 12, 0, 0);\n            }\n\n            CharacterNameLabel.Text = m_killLog.Victim.Name;\n            CorpNameLabel.Text = m_killLog.Victim.CorporationName;\n\n            Item ship = StaticItems.GetItemByID(m_killLog.Victim.ShipTypeID);\n            ShipNameLabel.Text = ship.Name;\n            ShipGroupLabel.Text = string.Format(CultureConstants.DefaultCulture, ShipGroupLabel.Text, ship.GroupName);\n\n            KillTimeLabel.Text = m_killLog.KillTime.ToLocalTime().DateTimeToDotFormattedString();\n            SolarSystemLabel.Text = m_killLog.SolarSystem?.Name;\n            SecStatusLabel.Text = m_killLog.SolarSystem?.SecurityLevel.ToNumericString(1);\n            SecStatusLabel.ForeColor = m_killLog.SolarSystem?.SecurityLevelColor ?? SystemColors.ControlText;\n            ConstelationLabel.Text = m_killLog.SolarSystem?.Constellation?.Name;\n            RegionLabel.Text = m_killLog.SolarSystem?.Constellation?.Region?.Name;\n        }\n\n        /// <summary>\n        /// Gets the image for the specified picture box.\n        /// </summary>\n        /// <param name=\"pictureBox\">The picture box.</param>\n        private async Task GetImageForAsync(PictureBox pictureBox)\n        {\n            Image img = await ImageService.GetImageAsync(GetImageUrl(pictureBox)).ConfigureAwait(false);\n            if (img != null)\n                pictureBox.Image = img;\n        }\n\n        /// <summary>\n        /// Gets the image URL.\n        /// </summary>\n        /// <param name=\"pictureBox\">The picture box.</param>\n        /// <returns></returns>\n        private Uri GetImageUrl(PictureBox pictureBox)\n        {\n            if (pictureBox.Equals(CharacterPictureBox))\n                return ImageHelper.GetPortraitUrl(m_killLog.Victim.ID,\n                    (int)EveImageSize.x128);\n\n            if (pictureBox.Equals(ShipPictureBox))\n                return ImageHelper.GetTypeRenderURL(m_killLog.Victim.ShipTypeID,\n                    (int)EveImageSize.x128);\n\n            if (pictureBox.Equals(CorpPictureBox))\n                return ImageHelper.GetCorporationImageURL(m_killLog.Victim.CorporationID);\n\n            // Picture box is for alliance\n            return ImageHelper.GetAllianceImageURL(m_killLog.Victim.AllianceID);\n        }\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// Handles the Click event of the CopyPictureBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void CopyPictureBox_Click(object sender, EventArgs e)\n        {\n            KillLogExporter.CopyKillInfoToClipboard(m_killLog);\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the ShipPictureBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void ShipPictureBox_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            PictureBox pictureBox = sender as PictureBox;\n\n            if (pictureBox == null)\n                return;\n\n            // Right click reset the cursor\n            pictureBox.Cursor = Cursors.Default;\n\n            // Display the context menu\n            contextMenuStrip.Show(pictureBox, e.Location);\n        }\n\n        /// <summary>\n        /// Handles the MouseMove event of the ShipPictureBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void ShipPictureBox_MouseMove(object sender, MouseEventArgs e)\n        {\n            PictureBox pictureBox = sender as PictureBox;\n\n            if (pictureBox == null)\n                return;\n\n            if ((pictureBox == ShipPictureBox) && (m_killLog.Victim.ShipTypeID == 0))\n            {\n                pictureBox.Cursor = Cursors.Default;\n                return;\n            }\n\n            pictureBox.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the showInShipBrowserMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void showInShipBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            Item item = StaticItems.GetItemByID(m_killLog.Victim.ShipTypeID);\n\n            if (item != null)\n                PlanWindow.ShowPlanWindow(m_killLog.Character).ShowShipInBrowser(item);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/KillReportVictim.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"CharacterPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYG\n        BwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoK\n        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCACAAIADASIAAhEBAxEB/8QA\n        HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh\n        MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW\n        V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG\n        x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF\n        BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV\n        YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE\n        hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq\n        8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8z0gJPzfkKnitWP8ADgVbgssHhfzq3BYnP3f0oAoxWQJ+7+Oa\n        sx2Jbjb+laMWng8lcfhVqHTsn7mfc0AZSWH+yRU6ae390H8K149MbOP5CpJrO3tYXubmRY441LSSSMFV\n        QO5J6CgDHGnc/cApw05c8r+lcn4t+PGjadI9l4UsBeupwbmbKxZ9h1b9PxrjL/4xfEG+kLLrQgXORHbw\n        IoH44J/WgD2A6amOAfypp04f3a8k034z+P8AT3DSapHcqP8Alnc26kfmoB/Wu78GfHDw7rsyWHiK2Gn3\n        DHCzFswsfc9U/Hj3oA3m049oxUL2HqOntXSHTVdQyAEEZBB61FJpnHyg0Ac09gQc7fzqvJZEjG2ull03\n        1XNVZtOGOn5igDnJLMjOPyNV5LfHBBFdBNYY/gx6YFU57EgfdFAGnb2IOPlxV6208kAhcVdtdPIwQPxr\n        RtdN6fLQBn2+mnH3Kuw6Y2OV6Vp22mcAhcVft9KJxlP05oAyIdKyOE/CvDPj/wDESfV9dl8GaTcFbGxk\n        23JQ/wCumHUH2U8Y9QT6Y+hvFUo8MeE9S8RMn/HlYyzgEdSqEgfiR+tfGk00txK08zlndizsx5JPJNAD\n        aKKKACiiigD1z9nX4jTT3q/D7Xbjekik6ZLIeVIGTFn0xkj0xjuMexS6Wc5CcfSvkrRtUutD1e11mxfb\n        NaXCTRHP8SsCP5V9q2ltBqNjDqNqMxzxLJGf9lgCP50AcrPpQ6Bap3GmY4I/AiuwuNJIPT6Zqjc6Wc/d\n        +lAHH3GnYB+Xr6iqVzYYJBXH1rrbrTCMjb+lZ11pwHGzv0oA1bPTTxlcn6Vq2emHjj6cdat2OmHjj6Vr\n        2Wl5xhetAFC10vOMJ9a0bXSfRentWpaaUTjC8Vp2ekcAFf0oA8t/aPgfTPgb4gux8p+zRp+DzIn/ALNX\n        xnX1L+278Wm8N2J+DMGkwzLqumx3N3ctIQ8OJw0YUDjrEc57EdO/y1QAUUUUAFFFFABX3Z8K7A3nwq8N\n        XbDJl8P2bk9eTAhNfCdfZv7HHxaHxR8GyeDZ9ES1l8MWNnbRukpb7RF5ZQMcjhsxnPb5hQB2NxpHXK1n\n        3WlY5Cda7m60frlOR04rMvNJIJOygDh7zTDg4TgVl3mmnkFfqK7i80oAHC1kX2mHBBXjvQBrWGm5xlf0\n        6Vs2OljI+Wp9N0w8fLW7p+l7sfJj8KAKljpJONqfTitez0gk/crQsdJPBC9K2bLSGyMJ0oA+If8AgpF4\n        Gu9K8caB44SFvs1/pbWbuBwJYpGfn0JWUY/3T6V82V+lf7ZP7PWv/HP4KTeH/CFususadex3+nW7ME89\n        lVkaLccAEq7YzxuC5x1H5v69oereGNcvPDevWL219p91JbXttJjdFLGxV0OOMhgR+FAFSiiigAooooAK\n        +wP+Cafw9vF8KeJPH9zGwivryKytcjr5Sl3YeozKo+qmvlHwh4P8TePvElr4Q8G6LPqOp3rlbWztly8h\n        Cljj6AEn0ANfqB+zb8F9S+DfwK8P/D/WkT7faWrSagIiCBPLI0rrkfe2l9ue+2gBLvR+Thf0rKvdJC5G\n        361315o46bP0rJv9J7lKAPP77Suvy/WsbUNLIyNn/wBeu+1DScE/JWHqOljJyv0oA09M0zoAldBpumdP\n        lpulabwPlro9M0wnGFoAj0/SgMfL+lbdhpA43J+lWtM0sHHyVu6fpXAJXrQBQs9HzjEf4Yr8sf2+/Bcv\n        gb9rTxhp7QlI7y9jv4Wxw4niSViP+Bs4+oNfrvZaOTj5P0r4u/4LGfs42s/hjSP2k9Lu44biwaLR9VtW\n        GPPidneGRSP4lYuDnqrDptwQD896KKKACiiigD6T/wCCVPgmTxV+1RHrPk7k0HQbu8LkcKzhbcD6kTH8\n        jX6TXmjZB+Svn7/gkX+zQ/gL4LXPxy1e8hmvPGyp9ihjBJtrOF5FAJ/vO+5iBwAqc5yB9WXmj4J+WgDz\n        +90gc/L9OKxtQ0nqCnXpXoN/pOB/q6w9R0rsF+lAHnuo6XgE7fqMVz+p6WoByv416FqemYJ+T9K57U9N\n        AyAv4YoAt6Tp+QOPyFdNpemjj5KpaPZcDC11Gk2GSPloAsaXpm7A2fhXQ6dpY4+Tms+51Tw74U0t9b8U\n        a5ZabZRDMt5qF0kMSfV3IA/OvGvit/wVM/ZC+EkUtrpHiyfxdqMYIW08NW/mx7u2bh9sW33RmPtQB9I2\n        OlDI+U/lXxr/AMFt/iLoOg/BDw58I4NThOr6v4gS/ls1kBkW0gilUuy9VBkkQAnrsbGcHHgvxr/4LKft\n        KeP/AD9L+FWn6d4I06TKpJaoLu+K+hmlXYPqkakdjXyn4o8V+KPG+vXHijxn4ivtW1K7ffdX+o3TzTSt\n        6s7kk/nQBn0UUUAFFFFAH60/8EhPjf4G+In7LmmfCFNeth4l8JvcxXmmSSATSWzzvLHOinlkxIEJHRk5\n        xkZ+o77ScA/L1r8AfDfibxH4O1y28TeEtevNL1GzlElpf6fctDNC4/iV0IKn6GvsL4Cf8Fqfjx4Ct4dC\n        +Nvhiy8bWMYC/bw4s79V6cuimOTA9UDHu/egD9ItQ0sZPy/XisDU9LAByvH8q8m+Gf8AwVa/Y0+KaR2+\n        p+M7zwpeyYH2XxNYmJAe/wC+jLxAe7Mv0r2XSPEvgzx5pf8AbfgfxZpms2Tfdu9Kvo7iI/8AAoyR+tAH\n        I6rpxAJK/pXNatp+Nx2/pXoOrWABOB+Fcxq9jycLg0AfN3xX/wCCmPwM+GM0ujeCLO58XajCSpaxkEVm\n        GHYzsDu+qKyn1r55+JH/AAVI/af8aCSz8Kalp3hW0YkBNIsw8xX3lm3EH3QJXzhRQBseMfiD48+ImonV\n        /H3jPVdauucXGq38lw4z2BcnA9hWPRRQAUUUUAFFFFABRRRQAUUUUAFX/DvinxN4Q1JdZ8JeI7/S7xPu\n        XenXjwSr9GQgj86oUUAfQHw0/wCCmf7Wfw98u11HxxD4ms0xm18SWonYjv8AvlKyk/Vz9K+kPg9/wVQ+\n        EHxFnh0P4q6BP4SvpSFF75v2ixZunLgB4sn+8pUd2r876KACiiigAooooAKKKKACiiigAooooAKKKKAC\n        iiigAooooA//2Q==\n</value>\n  </data>\n  <data name=\"ShipPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAA68AAAOvAGVvHJJAAAYy0lE\n        QVR4Xu3d+ZNdZbXG8fyRQQQEIzjgiJaAUjhWaTEUigOioFgqKKJWORT+IqCUggqCXhRlktEYICEJgZAI\n        cuV+9vke3nvo7suF0N3nejlPlSvrfd41vWvtvc/ZnQ7ueOSRRx5bYUl4+OGHd/jj0ApLguavBrBMrAaw\n        ZEwDePzxx+erFbYdmr8awDKxGsCSsRrAkjENYO/evU+tsCRo/moAy8RqAEvGagBLxnwAT6+wJKwGsGSs\n        BrBkTAPYt2/f4RWWBM1fDWCZeOKJJ3b433y1wrZjNYAlYzWAJWM1gCVjPoBnVlgSpgHs379/vlph26H5\n        0wCOrLAkrAawZKwGsGSsBrBkTAM4cODA0RWWBM1fDWCZWA1gyVgNYMmYBnDw4MF/rLAkrAawZGj+agDL\n        xDSAJ5988tkVlgTN38wBPP30079+KX73u9/dc889zzzzzNziRdx2221zi41QSffee+9/zPDII4/kFR5/\n        /PF4iLn77rvnnjPccsstd9111+HDh9sd+Pvf/z632Ah/+ctf2Kwp7Le//e2dd965ddfoJg9g9+7dOzfC\n        ySeffNVVVy2O4Z3vfOd8byNoPZuPfvSjLc8+++y8wnXXXRcPMV/4whfm6wWceOKJX/nKV9zj2cCi43qc\n        f/75bDYs7Pjjj//MZz5j8MXZRGzyAFxi85I3wnnnnTe3+98GcN9997EZA4CHHnooR3iFAwgf+MAHDh06\n        lNkxDyC8+93vfuKJJwq1WdjCAbzpTW865ZRTTjjhhPl6hl/84hdZjnMyYLYGf/3rX9ksDsANlCO8zABc\n        qtylbhmuuOKKzBYdS7SIiy++mM2awk466aSW4dJLLy3UZmELB9AD2gf97bff7iSRH/vYx7Ic57z66qtj\n        1mNxAOzn7MsOgEvMAw88cMYZZ0TK7pUHud5xPdYX5ub74Ac/GOmxtv6j5bVgPoDnNglrBjBnn3vu29/+\n        dqQDGAlm8ZzZrIdpZRN8GMZff/31c2rnzpjFAcTAr371q0jwTMOsd1yPDQv7wx/+EAmjjE3BNACPyPnq\n        NWPPnj3zMnfuvOOOO+bsc8/ddNNNc3bnzr1792LGOb/73e9msx5rBuATNf5lBsAlBh5++OFIqJhXNYDF\n        wryvRsKNN944ZzcDmj8N4J+bhDUDmLP//Ke7Yc7u3MkGs3jObNZjzQB27drlSYJf7GOWiwOIgfXFrHdc\n        jw0L06lIEGTObga2aQC/+c1v5uzOnY8++ijmGAYA4uC3fwAeFJFwww03zNnNwDYN4Ec/+lGkbyldxcc2\n        gIsuugi//QPwXhIJ7uY5uxnYwgH88Y9/jNy3b59v0JE+JCPHOT3ZfelcxFNPPZXNGMD73ve+FF8N7R7D\n        ACpm0XGe7EV42c5r/QCOHDlywQUXRPYtKH5TsIUD8NVNO84666zFVwGfxlmOc65HzxkYA9Df97znPem+\n        SnoIpEOWr3AAi45rcOaZZ+Y1CqOIds4557z5zW+Oga9+9auZbRa2cADrcfnll8/tXv0AXI/pH//4x7dn\n        AOvx4Q9/eNydm4VpAJsY9GUG4FV2bjTDqx2AN4zjjjuOTn7/+9+Phyy/+MUvtty6AXziE5945plnstlE\n        aP5mDsA3nHm9O3f+7Gc/82z9yEc+0tKzfm40wzjnK/kQ1l/Lc889t+X73//+FMhywwEsFrN+ANmsxyjs\n        sssuU//Xv/71lj6H5habivkAnt8kLJ75T3/6E+baa69teeqpp/o2nRksDmBOrYOnTTb6a2miLReR5RgA\n        lxhYX8ziALJZjzWFPfDAAy3hwQcfzGYTseUDeOyxx+brnTt///vfZwbHMAB1rvnRHmS5dQNYZDxFYzYR\n        Wz4AGD/J+tKXvhQDxzAA8B4QMxC/pQO44oorYnyZjtlETAN4+umn/3OTsObMkd/5zndidu3a5SkUOc55\n        zTXXxKzH4gBibrnllpiB+MUBxICv9pFQMT//+c/n6xcd12N9YYs/R7nvvvsiNwuav+UDWHyNvP322yOP\n        bQDm95a3vCUyxG84gJtvvjkSdu/ejTm2AUg6XgWuvPLKyM3CJg9g8Yk/BuBGe/vb3x7pKRQ5zulrBq81\n        ePbZZ9msHwB4FYoMkZdccknLMQCX//iydNppp6kBuTiAeaYFHDx4kM2GV8bnPve5SE+hObVJ2I4BgO+g\n        kS6lf/zjH5hxzg1x//33sxkD0N9ZmAn33HNPZIgcAzj++OOlWPM3Yp6BmS0OYD0uuOACNhsO4Je//GUk\n        uKHn7GZgmwZw2223zdmdO2+99VbMMQ8A3vve98ZDzBjAepxzzjlHjx7N7JgHoEVGG/+Nb3xjzm4GtmkA\n        rvpxVX7+85/HvJYB/OAHP4iHmA0HcMopp3zzm988cuRINnDMA4BPfvKT8aeffvqc2gxs8gA0Wt/DmrDe\n        KuM9QyzvvvvulhvCSz8bL0Et//a3v81izOGrWzzECP7bBfjewnd84xrYv3//3G0jPPTQQ2xGYS6mvMKe\n        PXvioY+oTcEmD2CFV4vVAJaM1QCWjNUAloxpAIcPH/7XCkuC5m/TAC699FLf4W666aaWdG+VFN9VvCi9\n        9a1vPfHEEz/1qU/5sjF+BD9w4YUX5gXFWQTywIEDn/3sZ08++WRvYZdddpmvnsPyzjvvpN944430733v\n        e3v37qWcccYZU6x//QtjaTcDeMMb3mD3hhtuyGCrsd0DOP/881vSG8CVV15JP+GEE0499VSKr+E//vGP\n        vQH0i4Xvete76FdffXVeUJwzzzwTH5DetpDjHdgwhuWGAwDfXPFrBiDdueee61Kge3lksNXY7gG88Y1v\n        9C3ekt4A9N2B9eX5558/77zzxslHyybnBSy2NfRTz7POOsvXc4/Ut73tba5ibxIvP4Bvfetb+DUDKF0/\n        c7344oun6FuM7R4AXHfddZaUBjAUGO2gL3ZkEesHQMfgW7onLDX65Qfwjne8w2fghgPIpntrqzENwMXy\n        wtZjDMDBLCn6vqjAaAd9dKStgdHW+fqFF8YAWjaAffv2LVqOaHhK+POf/7x+AIyzqc6thuZv6wBcd54P\n        /a7raxnAtddeq7PgaiUxr2oAp59+Onn55Ze/7gZw1VVXkT/5yU/I1zKAAQbHMAA2Prd37drV39ZN7X+d\n        DOCOO+447bTTzj77bPprGcAll1xiC/T32Abw05/+lFIlU/tfJwPQjq997WsUeC0DqK3h2AZw8OBBD0M6\n        TO1//Qxg/JXWcgeA9N5Hh6n9r58B0PtN2/p+0kkn9dsSdJ+K+F//+tf0xY4sYv0A7rvvPsynP/1pui92\n        /VXwoUOHinbzzTfj+/34H/7wh4vNHX/RuGYABbzooovoW43lDOCaa66hN4B+1ceb7YUXXuiZYB5PPvkk\n        /pUPwPD6S38z6DchP/ShD+FvvfVWuhc9r1TekI877rgHHnhgcQBHjx7tH0GOAeC9dffb8Ndff/0s/NZi\n        OQPo3/I1AF9Jxy99uhV0bWb+KgYAd911ly+4sxjTb46KH+9LV3+Xq9E+dTFrHi9mYzkGEFwHX/7yl72m\n        ZbOl2L4BaIquefFreffdd997773psHv37v51/Hz9wgs+JNn7mj9fv4g1cQaef/75+++//6GHHvIUmlMz\n        uJ/6zxa0dLtwf/DBB1vu37/fUq7SgcI8vtrdBmzfAFbYEKsBLBmrASwZqwEsGasBLBmrASwZqwEsGasB\n        LBmrASwZqwEsGasBLBmrASwZqwEsGf//BzD77Zs5+glzertLx7/xADSx/9zCs7P/NqNTwFNPPfX0DIcO\n        HaIfPHiQPHDgwJNPPrlv3z4S3w+fkZnB4cOH+eYoGjw3+68qzDNtJeT9NxuAq/jo0aP1usZRDKDW101K\n        vSYZpO/fv7+R2B2+cOTIEbuUum8rM2TS0laO2Sugf+vZzQTz4l49BPy3GYBz1lMd0YL62LXvgq192orR\n        o9l1/KytpBtlvc6dwjGXZMsMavRwJMWXi2xsjBvS8LLbhECi7qSXuZm4/F8fgL671hSp9eBgTmupCzCW\n        tpwcoxFkDcXXu/oyWs8AQ8fQY0jRsuc7+hjaLaatZHy5lCGIoVoWrQvFeBjbxWfTri3Z7S5zADpba9Sk\n        FHjiiSfUrZtD2hpLB2BD8UD3EGfcBdg5a72zdVrnAsukrdrHWASKmDVutKkgmMEX0FZ1lmLwbPKyzIuC\n        aQkjLF/pgL4o9+7du+UD6BI2bXAzdukpTgcVoRc1y6nGsS1rGWkXOlsGdYTO3dZ00Fk0T/kBZ8OA+IYE\n        dBHiTY4ST8dwmawPHDBaaJmXCCAFKSNFdqHoJNKyhjLuRJlxp5DDl2S5aHCMA9BK53f4gkIngaonH5/h\n        scce27Nnj6VM7TJWRA01DLJLiV7M0WVbYxhDIdf4krmwEZlBx8OPOEh5KSRStZWRmcZRMDAqpyi4sp2I\n        rF/pXIB97kIVcwwSkCQeSaYjLVm21JxXNABnq+4a+veXAhNPKrHSR6856ogISRWT01U9+6i0m6yt5OKS\n        pSCkIkkQhKOwmCTj+otvlyNE2lV2ZtwzppASjZLoGMtRRmSVTLXOnvi1FTQxNCHSVox0zakpjpnVkxQ2\n        DUD3/scBeFyoQGJumvvoo4/qr6BkOog+0gjXeepLB4hxDMuOR++0SfEjmQ0DEehK5NWZnaGrhtIWWUbn\n        sZUBaSuz7BmMLfaVIW86yFhqleC7sXpOutEpycixzLLDlkgZGqIbEoFT1OjyZsOYrBg66ORLBuB53eOF\n        j3C2jah2d4GXoL6L1TEE4kKpp/RkfU8Hu+JTSKVb2rV0cspoqPosySaBpFTxMLAcx4jsYBRMS8owGDFJ\n        WwLSFQaMkcxUYlkxDJSnFYAcBQeNwqcXn4s4LCmlk6UaSFtIMduyJDuda3c+ABFRNb3rXYs1mn+T5MPB\n        kVrKVMUuBHpSQRi3Drl4RXexdEvl4pw+maupS1iiUmA4Vv2ouGPU94FcyIKkLE7FLh1yR8qIpCMpLZVk\n        iayPaiZtIZXd6aqfUv2ZDQOyo5Ed2QGLwFKXyWpgXG2kXQ3fodFA6zFSfZVOcgPHE4XCoL7LJEcXgsq6\n        UmxJAHJXhMpINsgkptLFLGy5Kqj2tcQzaFlVdiu9+OppmWQDYynX2M2y3YIPm+K3FLOtSNCTaigaCcwc\n        yik6WmenxDSkjknJXgSRRQPLSkVOnwGPPPKI+lozIls6LdAxAoHo5GI3k13R6QxGocOmUki5KWLWypJW\n        EMu6UAFZ4pGjPF4Zk5a1LJskjAh0u2NZEBGKQ64xpoAyRnz6UCKhDpBdfJSO73SdNx1vBsCFtCyOjNKV\n        V0zzmO4AC6hElySwoPPkIxwpH8VzQxopy40pnzQYXpYOY4tLJyRH9XK5oJw/RkZS6gqyJDGW3NkUqiU9\n        1C+7BcmFXq4RE3glY9Q2lozzEh8oxbQLHYripMlZM+fPmZbcmZEYS9JuKSjDnU5pi1m9wsiF0eod7gI+\n        6q4L6ihuIcgSFMLThj5uOrKIFURyx4hjC8NFEAqm1tMlwrMEZrYsh8I+1B1K0WpZ7mQtw5N5UTImGeRF\n        xmcPjV8QJGSPF2QWfkKXArMwRo60W2QMx45fxxng6xim/pgBZnESuiQXiDMNwNO/1lcNH3skuwLhs6bI\n        ITFeViSdMioDtTohiNlRMaGKhzulWkvaLp4LOYopBRQhhWTGpiKhyNVJitxy8RR04Etagi32lkWg5EVn\n        hrQkwbLg8WW3G1OQ0foUskowLYFXMwCKFu3whYe/WIsnJ3UQQ9rqerFbyvo76+r0+RzoSLsUcrhzLDJf\n        WSlkRyqasjD0UjC2i8eMZUFIwDsYydEWZRiwl7HIKbZyLFr23OPJkDvJRmoKSY9nkB6fUt7CVk9mGbSs\n        4/XactwHdYCNvk2PILXSyJpIanGfBHgfFHSKUkiwdN9EQs0iOxhdgh5WpawUPIOp9hfrY6DirgjLimMJ\n        eGQGg8mdAmrjYll2wOApSFvVIwJl5BIHSSEzAC4MSIwtUgQYkwNmtpiliFN2YckCjlEtzrLIxdFVva29\n        5fKhuGP37t3+0E3SBjn7sjQ1fSi9H5CQP2ehO4PooBQ55MaMskb6oXNnQPfy0U9DKUkwA2Ttpo+RWNbf\n        6gaJyGpIEVxk4NISMojMBakGCsYWg3Q2FHKMimJZDXRMATMoJgZPgRQGWRZQCpUPjOODXZfvNIBxLTeG\n        ZO3WdzPQcdWPckER9VqmkslqN6kOu2S7SEvpxeE4JZ8dgwHHTjjr9vynck3CPdSRyMBFDUWomApgA+Jz\n        t6SQdDb4qdyFS4ELKYiAeEsY0WJyZ4bPq+MgywK2wthiKQjFsgrTwZZlKdjjO69o0wDqvu4EOiMKN+A/\n        gqYj2aQUy2HsUrTPdyRkpdSLWZ3TZWjLBU4hvd+zHxd+ir7QQSIDgB5iLSkjnYBIoCBTJBVBRpIjnmVe\n        zY9ZMmN8ByQtoTphJBq+yIqhJzGUYMtSBLKAJHBfzDtcUvR5x549e/xRp0g6pVNR5K440pa+u4ks8SCK\n        uNln3JJMycwuKb0qwZZJUDB4dXRaENlgoPqSlnhKo6WIwJfCnU1SOhJPYQ8KtqTU7sx4SW2ZezWkFFkK\n        ZgwwlilFttWSjIGKsYR2RRspMsPQ1U9x8bmYeIHCphex0X2mKLCUjAXSso+BxtOpsiw6Y5bymY3dqrRL\n        sdVTT3qWFWF38VYA7qSy2Cgx+9F3iGdWkI7XqRaVyfTFRGPAvDqLsM2GMpgUZsXhZam8elTk6sFQGABl\n        JGU2bMAS2DBAFmoEB7sO63SMtWuH5ipLv5Rbc+mA9BQyHh8Dmqj7o3S7pGWyTHQRB1mJJFTWYBhQgBI/\n        glR6jSsaSW/GDGquU9FJOiVjSsbDnYvDd+bMKHZbjmFQyMWtClsMVSVgt55SYtqSpa2UtviCXus4xVak\n        4AXR2Pl7AOg+2WXug1frDUApisBTxAXLokOBKIKmAANQFvAaJMksJkU0EWoEBYO3a1mtlCQbEewmO6QD\n        jM8P2W3lNRQ2pC0oFFRJCrPyklBwqDbAjC0RIilsRMCLLMgITikdMzxQGCsVKJgcgS7R9BnQd82e7wbQ\n        aW0zous+n6muFz9pQQ7L9IImx+MbGIvAbJZuuk/pIqd0jBgSqZrJbWFaiqkX9OoZBWSDTOk5NtuZ+l4x\n        vIY9Rc0pMexnvfonpRQptrgzI5GNBxlDl5FZCnLUxoY+IlAWM2JgKOVywOmnof6APFmPEBIsxrVEtpVN\n        YBNvyHjGdEwVw3CkTA6zLJmxL5QgFUpxZoN3I5LMimO0XUezr0sv+eLEBooDI3h6SjUAe8CwyRKZ2VBA\n        tMZDLwUpSPZjF6kkCj6GUiUU0RjTx8Gn3LPsBfGY2eHCd41bsHZgkgXnrkd2lgxyA1sZFJojnWJJWcw9\n        WS+0eJEcyqhsUSkXm56eFMEBDxRnHhEwloIvdgfokZnFpPOtWSNICl82U6bZ0UYuikrAcihFALuzGFOQ\n        3AdTASToZ4pKkMnpM8DDJ4dMczMJFnikuCl4OsVyirRwzwZbKW0phSIxBUb8AmZW0dC8gRnjFNIJ7Xax\n        d2AjIW3VCAVkPyKwzzdlij47NugmY0mzpBSTQQXTKWR9H7kmo4XHPXuRGYCwltWQXmQSOSxtqTADu0jw\n        8J//XxnWpnIwmqWbP+Xj6SzzJEXkQo6sozKyXkS2y5LerggUGAqbxV2H1256fcenYFQyIrfkSxEflAqW\n        grQ7SMilXVtQaoxdlvLWd3K0nk7hS2Y2SL4Yy85IKWBkF/GACCC15pBgOX0G9Mabv+i1FWxHBiGqSXQ6\n        FyFI9uB5zTiXpAgkg0KNako8yzA92dgAcmTBpw+SfYpdBSiDzozj6AIwG8+HRZcRkJ5il286cur6S6/3\n        9S6YsjAoOH1W+1RD7hQkBRjYGonEoUO7wXK6AwyBJ2SqCKDP0k0QHe9gbIrFeRy1pf7qJmkS4pbeYIpJ\n        RmZJ0jEji17TYTS9+iKLk2KLPZ0BmQ5qrlkYBZdOwZYsM4vMhm6Xl93ZiaehsrFFaZdSlvTqoQRkfS+j\n        ZZblmhst9GEE7IzMMNo1DcBa9cNfpuKCLhduLOlk4WrcMAPJtBhsVT2MthY5vbLkLQgg84JBQu5DkY7e\n        ZUEfzRJqKnEGJGYYUNhkQIEiAKWSbDEYuzAFWggFSLtZkhgyEqo8y046+c/AfphJ2hLvRNP/k94Ih+Vm\n        SddTmMWcbq6W4ubpkrEUy6OZwj4vQJa+buJb2qqtFMsKEqoTlhpmRU7NEicll8olU2KKORSWQcyZ4ZwX\n        CixtiUkXljIMSJCdHBFSWDIbXllCESCdJYWcsr7YzHxnyf/7C3o3nFyWHhvTi1jvX+COoMsN6T4h1GfJ\n        lIFlu5b90LSLvScP0HuhY0DPxS6lLD2p+uAZMSmQggHfzdYognhiplMsGZMMRCYfm/1dhbDuLTayQ6WO\n        2qY0LyatSKjCoPhZhv+uSsAs7VKAYslmKBlbpiugXLmQMbYY4MWssH379v0XWWxjwD0TNqYAAAAASUVO\n        RK5CYII=\n</value>\n  </data>\n  <data name=\"CorpPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsMAAALDAE/QCLIAAAE6UlE\n        QVRYR72Wd08cSRBH+5MhkjEgWcaAACGBMdFkk4MJZskm55xzTjYZf7W+fbXUuHdYH7rT6f542l2Y6de/\n        qpreNb9+/bJPT0/C4+PjCx4eHoT7+3t7d3cn3N7eCjc3Ny+4vr4Wfv78Kfz48UO4uroK4/Ly0l5cXFgT\n        SfRvZCryyxCp7Pz8XDg7O/Mw/1Wq10Snp6ceJycnHuafilSGSGV/Evllx8fH9ujoSDg8PBTMH0VOItjd\n        3bU7Ozty89+J1tfX7dramic7PAqJDg4OhP39fY+9vT1rNJFbvkiJRkZGbH19vd3a2gpL5ImCEhZtbm62\n        TU1NsrgrAkJokO3tbcH4Rcr2zrbd2NjwUi8sLNju7m75m5vo4OB3Ijb3/ft3OzAwINchmJ2dtXNzc/Ke\n        /8Pm5qbANQZZKFEojSaanJy0X758sdPT055MU7EpFh0bG7Ojo6N2amrKrq2veRIW53V5edmWlpZKRWiN\n        tgdWV1cFo+Xz92llZcV++/YteNGKV77VtVXb1dVlKyoqbE1NjZQbamtrRdTY2CibURlVa2trk6osLS3J\n        mmyK97C4uGiNli+sTzvapy0vFWnLy8tte3u7pKd8bipkbK64uFiuQQRIQrIFuQbm5+dlDTCIdCgQUfKO\n        jg47Pj7u9Wl4eNh+/vxZBlFLRxpN5KaamJiQa6mGiqgKbWDdmZkZAQ9/N+5AkCYQCNiioiK5GBEX8nlo\n        aCgkWtbyRU40G4Rq5efn287OTrmf4c3OzpbqEIz5YqNg/Imgv7/fS0V/m5qbPNH8nCMLTjhoIk2FAPnH\n        jx9lM4haW1ulknzW4QWjInrlJgJuZBF2rSK3fCpTNBXXI+FexCpzGQ62kw0Zt3z+VKQoKSl5IXNFKosk\n        qa6ulnlARAt5GmBwcNDD+BO5Ik6+qqqqMFFk2YgMqCcaCom4Pycnx5NxQNFe6Ovrs729vdaEpwoXkYBn\n        3pWpyE3lJlIR1NXV2aysLE/W09MjMJSB7oAMvPlT+RAxgIWFhY4oXKYiTdTXGxKprKysTKYfUVcXdAkc\n        cECLDaKw8tGnZwEDlJ6e/lL0nEhF3d3PqYKiQCAkAeQFBQUiAh5t4KBSjJtIU7EwMl4/fPggldDSRRL5\n        UwFH9Nu3b6UNiL5+/SqvHM3AZwIafypOLHbOSYaIKU5JSZGdRxJFSoUgMzNTqoeIALznQGtoaBSHYkID\n        oakC0rfExES5WEVpaWk2IyNDFnZFKnMTtbS02NzcXPvmzRv5wkJSWVlpo6OjJUhDQ4MHT4nRVJqIf/A1\n        zK5VQjnfv38vC/B3T9bcEvoBAkER5SZpXFycBFERG2GYgWuAdcC4acBNxEY0FQtRhdjYWJuammo/ffok\n        X8HAoCGOiYmxycnJ8uiqiI2wAWS8siZUV0O1Nf7y6Xc8ZYyPj5fjlHkANsHi9DcpKUk2Q2kpN8NKQlfE\n        ZzbFtdyHEDjcFOMOhIqAb7OEhARZpL4+lIZj2S2fokIW16rwXnv/7t07kfEZ2IxitE8MBGjpWJRXLRmL\n        REVFSWU0iQsCNkhipAwxAn7E0Ab3PehGjZsIaXiffgt0uHgstXyREtEOWqcyFQH3KmwWjF+kqERFrkRB\n        4k8VSQL8GHGhQmD8okipIon8qV4TKfo4Ak+P+b9ECsPtYvwyv+g1mSvyy1wh54aSl5f3TJ79C4TAUuu+\n        TMRCAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"AlliancePictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAA68AAAOvAGVvHJJAAADZElE\n        QVRYR2MYBRQCRmNjY1Yom74AZPGE3gle2ZnZfZKSklxQYfqBEN8Qlb279z7r7e79q6utWw0UYobIUBcw\n        AjELhIkBGH19fJerq6lvYWFhsYSKoQNGLS0tNiibNAAK4ikTpnhlpGf04gliHiAGOZADzEMC4CjqmeCT\n        lZnVT1YUhYRQFsSgKNqza89jSqKIMdA/cCW+IG6uLpYH+lQEykUHjH4+fosJRBFBgDOIQWDB1IbynpaK\n        ZigXG+AGYpz6KQaLOgIOblzYektYWJgXKkQ/oKurK7h7ZtTvfcsr/gDTiytUmH6gIj8h9OLmsv9nNpT9\n        n9DbMReYFviBwlQpFTGK18Ks+NRl0+tWLejLWjO/M2r1sq6gVVum+V1/cKTj/7MzM/+f2jH185Fdi67s\n        2zz33I51M49sWz3zSEqMfwtQK3IZgq9MgQBQodHX1eefnpqOnveFtJSE52THe/xZMCHz/0mgz+8c7vj/\n        6tL8/2/vbPr/4GT//zNbq/4vm5L8Pz/B5a+6svg6dnZ2RaheBnt7e5ZJ/ZM8C/MLJ4iLi4MSJnYQFBSk\n        iifvg9jB3JzsjxSkRf9nx7n+v3Zkxv9r+1r+L2qy+Z8bpvHfTFPkPS8HSwlQHUrBExAQoLx/z36iyhSC\n        eR8IpIJdtM4e29T2f/vCMrBDzu9u/1+W7PiVjY3NEygPCmp0QIy5cIA374PAphn5907unPo/zFXpv6gg\n        9//umoT/cztS/gGD2gWqBBsgaC5RoCQ/y+Douo7/7jZ6/1VkBN9zcjCfV5Hi/z+jLfl/RVHqHKASbCFA\n        PTChu7wlOdLpPxcX+3Ug1wmIuTjYWKoMdeS+TW4rfszLyysMVkgrkB3vdYGVhWUDkKkAEQEDkK9tw3zt\n        r6moqLhBhKgAQOVBXFwcyEAmEF9eXp5DWIAvGsjEVfSKKEqL6UHZTPHx8Q5Amh3CJRHo6elxL5y3cMqW\n        jVvehoWElQGFSEo8PV09mft273uVl5M3jYuLSwIqTBJgBObbSfFx8b/4+fnbgHz8pRgaqK2tDSzIL/il\n        r6e/B8jlg4iSCJSVlUFBaCnMLwyisQGcxauOjo4GkHIUEBDwAdIkN0YIAlD66O/pDwAVr6KioqA8Tl8A\n        arLt2bmH5q1ifICk4pVWgDrF6ygYOMDAAADSwyzErhCJVgAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"CopyPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDQAACw0B7QfALAAAAB90RVh0U29mdHdhcmUA\n        UGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAAJSSURBVDhPjZLdT5JhGMZfO2NtxUF/gXXQOm1tbc1N\n        V2u1Vi3LryCHOUi+hAwQBvKRCCglhPgC0gDDCEyFafK8UqaiazVPxGmbtZjVQXXA+lhHnVy9Lc7g3by2\n        357n4Nq95/7toSwWoz0ZHFiOWbsYj6qZ0V2vZ9TXTjGatgbGePPCc4daMOXWiPZTXAmPmHO5lz7MkXuY\n        zjiQSFoQixvxMGqAP3gHsyn3j5186mC5Xhm6X0pCsT5orHLIdZ1QGyTQWmRQsafGKkWOGS3tbmX45Xpl\n        XFohGfL2QKxqh1Dcig6pAD1GCUQyAZR6MbJPLaUPi3buAb23LpPxpA2huBV0xAQ62odAzAy3x4SJMTvG\n        B2R/vKrmF5xuDLKrJPLYggdjengCOjg9KgzTWgT9JuzJTZ+6lSQzTiTSLkzMOBGfZsvsPcyutSc3BmUT\n        IUs+PFsaQXZlFCT/n9EhBfbkRiI8Q/LrYcyv+LGwRmPxdQhk1Q+HWYRqbv5BP7Ih7usuZV0iPiXvOEc2\n        iyls7k5i6/MUVjcimFv2YfCuGNXceIO9CLBDI8OK0qy9nU+Zuxtzn76mUfwyg4/f0th+H8fO7hP47ytQ\n        zU0iM4gU8WAycLukb6mroc6fPOrV3jj9TtVaX1C31BWUV04UxGePFXTii7+quZlf9mN+NYCQq7NU/gnU\n        IZYjLLUsh8vUdrQ0rFRzM0XcyK4FMGJr+872uMPlZo59FfMmhJin6ydvH1VTrleGy83G2yi2i0m8WqB/\n        H+DxuAdwuVFeOl5wKJq2+nvl6zwer+Yvp4wHNpwGaj8AAAAASUVORK5CYII=\n</value>\n  </data>\n  <metadata name=\"toolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"contextMenuStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>107, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/Controls/NotificationList.Designer.cs",
    "content": "﻿using EVEMon.Common.Controls;\n\nnamespace EVEMon.Controls\n{\n    partial class NotificationList\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.listBox = new NoFlickerListBox();\n            this.toolTip = new System.Windows.Forms.ToolTip(this.components);\n            this.SuspendLayout();\n            // \n            // listBox\n            // \n            this.listBox.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.listBox.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.listBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;\n            this.listBox.FormattingEnabled = true;\n            this.listBox.IntegralHeight = false;\n            this.listBox.ItemHeight = 24;\n            this.listBox.Location = new System.Drawing.Point(0, 0);\n            this.listBox.Margin = new System.Windows.Forms.Padding(0);\n            this.listBox.MinimumSize = new System.Drawing.Size(318, 24);\n            this.listBox.Name = \"listBox\";\n            this.listBox.SelectionMode = System.Windows.Forms.SelectionMode.None;\n            this.listBox.Size = new System.Drawing.Size(318, 270);\n            this.listBox.TabIndex = 0;\n            // \n            // toolTip\n            // \n            this.toolTip.IsBalloon = true;\n            // \n            // NotificationList\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.listBox);\n            this.Margin = new System.Windows.Forms.Padding(0);\n            this.Name = \"NotificationList\";\n            this.Size = new System.Drawing.Size(318, 270);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private NoFlickerListBox listBox;\n        private System.Windows.Forms.ToolTip toolTip;\n    }\n}"
  },
  {
    "path": "src/EVEMon/Controls/NotificationList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.ApiErrorHandling;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Notifications;\nusing EVEMon.Common.Properties;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.NotificationWindow;\nusing EVEMon.Common.Constants;\n\nnamespace EVEMon.Controls\n{\n    /// <summary>\n    /// Displays a list of notifications.\n    /// </summary>\n    public partial class NotificationList : UserControl\n    {\n        #region Fields\n\n        private readonly Color m_warningColor = Color.LightGoldenrodYellow;\n        private readonly Color m_errorColor = Color.LavenderBlush;\n        private readonly Color m_infoColor = Color.AliceBlue;\n        private readonly List<NotificationEventArgs> m_notifications = new List<NotificationEventArgs>();\n\n        private const int TextLeft = 20;\n        private const int LeftPadding = 2;\n        private const int RightPadding = 2;\n        private const int IconDeletePositionFromRight = 14;\n        private const int IconMagnifierPositionFromRight = 34;\n\n        private int m_hoveredIndex = -1;\n\n        private bool m_pendingUpdate;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public NotificationList()\n        {\n            InitializeComponent();\n\n            listBox.DrawItem += listBox_DrawItem;\n            listBox.MouseMove += listBox_MouseMove;\n            listBox.MouseDown += listBox_MouseDown;\n            listBox.MouseLeave += listBox_MouseLeave;\n        }\n\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load, fils up the list for the design mode.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (!DesignMode && !this.IsDesignModeHosted())\n                return;\n\n            listBox.Font = FontFactory.GetFont(\"Tahoma\", 8.25F);\n\n            Notifications = new List<NotificationEventArgs>\n            {\n                new NotificationEventArgs(null, NotificationCategory.AccountNotInTraining)\n                {\n                    Priority = NotificationPriority.Information,\n                    Description = \"Some information\"\n                },\n                new NotificationEventArgs(null, NotificationCategory.AccountNotInTraining)\n                {\n                    Priority = NotificationPriority.Warning,\n                    Description = \"Some warning\"\n                },\n                new NotificationEventArgs(null, NotificationCategory.AccountNotInTraining)\n                { Priority = NotificationPriority.Error, Description = \"Some error\" }\n            };\n\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we check whether there was an update pending.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (Visible && m_pendingUpdate)\n                UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the displayed notifications.\n        /// </summary>\n        internal IEnumerable<NotificationEventArgs> Notifications\n        {\n            get { return m_notifications; }\n            set\n            {\n                m_notifications.Clear();\n                if (value != null)\n                {\n                    IEnumerable<NotificationEventArgs> notificationsToAdd = value\n                        .Where(x => Settings.Notifications.Categories[x.Category].ShowOnMainWindow);\n\n                    m_notifications.AddRange(notificationsToAdd.OrderBy(x => (int)x.Priority));\n                }\n\n                UpdateContent();\n            }\n        }\n\n        #endregion\n\n\n        #region Content Management\n\n        /// <summary>\n        /// Updates the content of the listbox.\n        /// </summary>\n        private void UpdateContent()\n        {\n            if (!Visible)\n            {\n                m_pendingUpdate = true;\n                return;\n            }\n\n            m_pendingUpdate = false;\n\n            listBox.BeginUpdate();\n            try\n            {\n                listBox.Items.Clear();\n                foreach (NotificationEventArgs notification in m_notifications)\n                {\n                    listBox.Items.Add(notification);\n                }\n            }\n            finally\n            {\n                listBox.EndUpdate();\n            }\n\n            UpdateSize();\n        }\n\n        /// <summary>\n        /// Updates the size of the control.\n        /// </summary>\n        private void UpdateSize()\n        {\n            Height = listBox.Items.Count * listBox.ItemHeight;\n            Width = listBox.Width;\n            CalculateFontSize();\n            Invalidate();\n        }\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// Draws an item.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        /// <exception cref=\"NotImplementedException\"></exception>\n        private void listBox_DrawItem(object sender, DrawItemEventArgs e)\n        {\n            if (e.Index < 0 || e.Index >= listBox.Items.Count)\n                return;\n\n            Graphics g = e.Graphics;\n\n            NotificationEventArgs notification = listBox.Items[e.Index] as NotificationEventArgs;\n            if (notification == null)\n                return;\n\n            // Retrieves the icon and background color\n            Image icon;\n            Color color;\n            switch (notification.Priority)\n            {\n                case NotificationPriority.Error:\n                    icon = Resources.Error16;\n                    color = m_errorColor;\n                    break;\n                case NotificationPriority.Warning:\n                    icon = Resources.Warning16;\n                    color = m_warningColor;\n                    break;\n                case NotificationPriority.Information:\n                    icon = Resources.Information16;\n                    color = m_infoColor;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n\n            // Background\n            using (SolidBrush brush = new SolidBrush(color))\n            {\n                g.FillRectangle(brush, e.Bounds);\n            }\n\n            // Left icon\n            g.DrawImageUnscaled(icon,\n                                new Point(e.Bounds.Left + LeftPadding, e.Bounds.Top + (listBox.ItemHeight - icon.Height) / 2));\n\n            // Delete icon\n            icon = m_hoveredIndex == e.Index ? Resources.CrossBlack : Resources.CrossGray;\n            g.DrawImageUnscaled(icon,\n                                new Point(e.Bounds.Right - IconDeletePositionFromRight,\n                                          e.Bounds.Top + (listBox.ItemHeight - icon.Height) / 2));\n\n            // Magnifier icon\n            if (notification.HasDetails)\n            {\n                icon = Resources.Magnifier;\n                g.DrawImageUnscaled(icon,\n                                    new Point(e.Bounds.Right - IconMagnifierPositionFromRight,\n                                              e.Bounds.Top + (listBox.ItemHeight - icon.Height) / 2));\n            }\n\n            // Text\n            using (SolidBrush foreBrush = new SolidBrush(ForeColor))\n            {\n                string text = notification.ToString();\n                Size size = g.MeasureString(text, Font).ToSize();\n                g.DrawString(text, Font, foreBrush,\n                             new Point(e.Bounds.Left + TextLeft, e.Bounds.Top + (listBox.ItemHeight - size.Height) / 2));\n            }\n\n            // Draw line on top\n            using (SolidBrush lineBrush = new SolidBrush(Color.Gray))\n            {\n                using (Pen pen = new Pen(lineBrush, 1.0f))\n                {\n                    g.DrawLine(pen, new Point(e.Bounds.Left, e.Bounds.Bottom - 1), new Point(e.Bounds.Right, e.Bounds.Bottom - 1));\n                }\n            }\n        }\n\n        /// <summary>\n        /// When the mouse moves, detect the hovered index.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listBox_MouseMove(object sender, MouseEventArgs e)\n        {\n            int oldHoveredIndex = m_hoveredIndex;\n\n            m_hoveredIndex = -1;\n            for (int i = 0; i < listBox.Items.Count; i++)\n            {\n                Rectangle rect = GetDeleteIconRect(listBox.GetItemRectangle(i));\n                if (!rect.Contains(e.Location))\n                    continue;\n\n                // Repaint the listbox if the previous index was different\n                m_hoveredIndex = i;\n                if (oldHoveredIndex == m_hoveredIndex)\n                    return;\n\n                listBox.Invalidate();\n                DisplayTooltip((NotificationEventArgs)listBox.Items[i]);\n                return;\n            }\n\n            toolTip.Active = false;\n        }\n\n        /// <summary>\n        /// When the user clicks, we need to detect whether it was on one of the buttons.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listBox_MouseDown(object sender, MouseEventArgs e)\n        {\n            // First test whether the \"delete\" or the \"magnifier\" icons have been clicked\n            for (int i = 0; i < listBox.Items.Count; i++)\n            {\n                Rectangle rect = listBox.GetItemRectangle(i);\n                if (!rect.Contains(e.Location))\n                    continue;\n\n                NotificationEventArgs notification = listBox.Items[i] as NotificationEventArgs;\n\n                // Did the click on the \"magnifier\" icon ?\n                if (notification != null && notification.HasDetails)\n                {\n                    Rectangle magnifierRect = GetMagnifierIconRect(rect);\n                    if (magnifierRect.Contains(e.Location))\n                    {\n                        ShowDetails(notification);\n                        return;\n                    }\n                }\n\n                // Did the click on the \"delete\" icon or did a wheel/right-click?\n                Rectangle deleteRect = GetDeleteIconRect(rect);\n                if (e.Button == MouseButtons.Middle || e.Button == MouseButtons.Right ||\n                        deleteRect.Contains(e.Location)) {\n                    EveMonClient.Notifications.Invalidate(new NotificationInvalidationEventArgs(notification));\n                    m_notifications.Remove(notification);\n                    UpdateContent();\n                }\n            }\n        }\n\n        /// <summary>\n        /// When the mouse leaves the control, we \"unhover\" the delete icon.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listBox_MouseLeave(object sender, EventArgs e)\n        {\n            if (m_hoveredIndex == -1)\n                return;\n\n            m_hoveredIndex = -1;\n            listBox.Invalidate();\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Calculates the maximum text length of the list with given font.\n        /// </summary>\n        /// <param name=\"font\"></param>\n        /// <returns></returns>\n        private int CalculateMaxTextLength(Font font)\n        {\n            int maxTextLength = 0;\n\n            foreach (Size textSize in listBox.Items.Cast<object>().Select(item => item.ToString()).Select(\n                text => TextRenderer.MeasureText(text, font)).Where(textSize => textSize.Width > maxTextLength))\n            {\n                maxTextLength = textSize.Width;\n            }\n\n            return maxTextLength;\n        }\n\n        /// <summary>\n        /// Calculates the font according to the notifications to display.\n        /// </summary>\n        private void CalculateFontSize()\n        {\n            if (Width == 0)\n                return;\n\n            Font font = Font;\n            float fontSize = font.Size;\n\n            // Check for magnifier icon\n            NotificationEventArgs itemWithDetails = listBox.Items.OfType<NotificationEventArgs>().FirstOrDefault(x => x.HasDetails);\n            int magnifierIconSize = itemWithDetails != null ? IconMagnifierPositionFromRight : 0;\n\n            // Calculates the available text space\n            int availableTextSpace = Width - LeftPadding - TextLeft - magnifierIconSize - IconDeletePositionFromRight -\n                                     RightPadding;\n\n            // If any text length exceeds our bounds we decrease the font size\n            while ((CalculateMaxTextLength(font) > availableTextSpace) && (fontSize > 6.5f))\n            {\n                fontSize -= 0.05f;\n                font = FontFactory.GetFont(\"Tahoma\", fontSize);\n            }\n\n            // If any text length fits better in our bounds we increase the font size\n            while ((CalculateMaxTextLength(font) < availableTextSpace) && (fontSize < 8.25f))\n            {\n                fontSize += 0.05f;\n                font = FontFactory.GetFont(\"Tahoma\", fontSize);\n            }\n\n            Font = font;\n        }\n\n        /// <summary>\n        /// Show the details for the given notification.\n        /// </summary>\n        /// <param name=\"notification\"></param>\n        private static void ShowDetails(NotificationEventArgs notification)\n        {\n            // API error ?\n            APIErrorNotificationEventArgs errorNotification = notification as APIErrorNotificationEventArgs;\n            if (errorNotification != null)\n            {\n                ApiErrorWindow window = WindowsFactory.ShowByTag<ApiErrorWindow, APIErrorNotificationEventArgs>(errorNotification);\n                window.Notification = errorNotification;\n                return;\n            }\n\n            // Skills Completion ?\n            SkillCompletionNotificationEventArgs skillNotifications = notification as SkillCompletionNotificationEventArgs;\n            if (skillNotifications != null)\n            {\n                SkillCompletionWindow window =\n                    WindowsFactory.ShowByTag<SkillCompletionWindow, SkillCompletionNotificationEventArgs>(skillNotifications);\n                window.Notification = skillNotifications;\n                return;\n            }\n\n            // Market orders ?\n            MarketOrdersNotificationEventArgs ordersNotification = notification as MarketOrdersNotificationEventArgs;\n            if (ordersNotification != null)\n            {\n                MarketOrdersWindow window =\n                    WindowsFactory.ShowByTag<MarketOrdersWindow, MarketOrdersNotificationEventArgs>(ordersNotification);\n                window.Orders = ordersNotification.Orders;\n                window.Columns = Settings.UI.MainWindow.MarketOrders.Columns;\n                window.Grouping = MarketOrderGrouping.State;\n                window.ShowIssuedFor = IssuedFor.All;\n                return;\n            }\n\n            // Contracts ?\n            ContractsNotificationEventArgs contractsNotification = notification as ContractsNotificationEventArgs;\n            if (contractsNotification != null)\n            {\n                ContractsWindow window =\n                    WindowsFactory.ShowByTag<ContractsWindow, ContractsNotificationEventArgs>(contractsNotification);\n                window.Contracts = contractsNotification.Contracts;\n                window.Columns = Settings.UI.MainWindow.Contracts.Columns;\n                window.Grouping = ContractGrouping.State;\n                window.ShowIssuedFor = IssuedFor.All;\n                return;\n            }\n\n            // Industry jobs ?\n            IndustryJobsNotificationEventArgs jobsNotification = notification as IndustryJobsNotificationEventArgs;\n            if (jobsNotification != null)\n            {\n                IndustryJobsWindow window =\n                    WindowsFactory.ShowByTag<IndustryJobsWindow, IndustryJobsNotificationEventArgs>(jobsNotification);\n                window.Jobs = jobsNotification.Jobs;\n                window.Columns = Settings.UI.MainWindow.IndustryJobs.Columns;\n                window.Grouping = IndustryJobGrouping.State;\n                window.ShowIssuedFor = IssuedFor.All;\n                return;\n            }\n\n            // Planetary pins ?\n            PlanetaryPinsNotificationEventArgs pinsNotification = notification as PlanetaryPinsNotificationEventArgs;\n            if (pinsNotification != null)\n            {\n                PlanetaryPinsWindow window =\n                    WindowsFactory.ShowByTag<PlanetaryPinsWindow, PlanetaryPinsNotificationEventArgs>(pinsNotification);\n                window.PlanetaryPins = pinsNotification.PlanetaryPins;\n                window.Columns = Settings.UI.MainWindow.Planetary.Columns;\n                window.Grouping = PlanetaryGrouping.Colony;\n                return;\n            }\n        }\n\n        /// <summary>\n        /// Displays the tooltip for the hovered item.\n        /// </summary>\n        private void DisplayTooltip(NotificationEventArgs notification)\n        {\n            // No details ?\n            if (!notification.HasDetails)\n            {\n                SetToolTip(active: false);\n                return;\n            }\n\n            // API error ?\n            APIErrorNotificationEventArgs errorNotification = notification as APIErrorNotificationEventArgs;\n            if (errorNotification != null)\n            {\n                SetToolTip(errorNotification.Result?.ErrorMessage);\n                return;\n            }\n\n            // Skills Completion ?\n            SkillCompletionNotificationEventArgs skillNotifications = notification as SkillCompletionNotificationEventArgs;\n            if (skillNotifications != null)\n            {\n                SetToolTip(SkillCompletionMessage(skillNotifications));\n                return;\n            }\n\n            // Market orders ?\n            MarketOrdersNotificationEventArgs ordersNotification = notification as MarketOrdersNotificationEventArgs;\n            if (ordersNotification != null)\n            {\n                SetToolTip(MarketOrdersEndedMessage(ordersNotification));\n                return;\n            }\n\n            // Contracts ?\n            ContractsNotificationEventArgs contractsNotification = notification as ContractsNotificationEventArgs;\n            if (contractsNotification != null)\n            {\n                SetToolTip(ContractsEndedMessage(contractsNotification));\n                return;\n            }\n\n            // Industry jobs ?\n            IndustryJobsNotificationEventArgs jobsNotification = notification as IndustryJobsNotificationEventArgs;\n            if (jobsNotification != null)\n            {\n                SetToolTip(IndustryJobsCompletedMessage(jobsNotification));\n                return;\n            }\n\n            // Planetary pins ?\n            PlanetaryPinsNotificationEventArgs pinsNotification = notification as PlanetaryPinsNotificationEventArgs;\n            if (pinsNotification != null)\n            {\n                SetToolTip(PlanetaryPinsCompletedMessage(pinsNotification));\n                return;\n            }\n        }\n\n        /// <summary>\n        /// Sets the tool tip.\n        /// </summary>\n        /// <param name=\"message\">The message.</param>\n        /// <param name=\"active\">if set to <c>true</c> [active].</param>\n        private void SetToolTip(string message = null, bool active = true)\n        {\n            toolTip.Active = active;\n\n            if (active)\n                toolTip.SetToolTip(listBox, message ?? string.Empty);\n        }\n\n        /// <summary>\n        /// Gets the rectangle of the \"magnifier\" icon for the listbox item at the given index.\n        /// </summary>\n        /// <param name=\"rect\"></param>\n        /// <returns></returns>\n        private static Rectangle GetMagnifierIconRect(Rectangle rect)\n        {\n            Bitmap icon = Resources.Magnifier;\n            int yOffset = (rect.Height - icon.Height) / 2;\n            Rectangle magnifierIconRect = new Rectangle(rect.Right - IconMagnifierPositionFromRight, rect.Top + yOffset,\n                                                        icon.Width, icon.Height);\n            magnifierIconRect.Inflate(2, 8);\n            return magnifierIconRect;\n        }\n\n        /// <summary>\n        /// Gets the rectangle of the \"delete\" icon for the listbox item at the given index.\n        /// </summary>\n        /// <param name=\"rect\"></param>\n        /// <returns></returns>\n        private static Rectangle GetDeleteIconRect(Rectangle rect)\n        {\n            Bitmap icon = Resources.CrossBlack;\n            int yOffset = (rect.Height - icon.Height) / 2;\n            Rectangle deleteIconRect = new Rectangle(rect.Right - IconDeletePositionFromRight, rect.Top + yOffset, icon.Width,\n                                                     icon.Height);\n            deleteIconRect.Inflate(2, 8);\n            return deleteIconRect;\n        }\n\n\n        #endregion\n\n\n        #region Notification Messages Methods\n\n        /// <summary>\n        /// Builds the skill completion message.\n        /// </summary>\n        /// <param name=\"skillNotifications\">The <see cref=\"EVEMon.Common.Notifications.SkillCompletionNotificationEventArgs\"/> instance containing the event data.</param>\n        /// <returns></returns>\n        private static string SkillCompletionMessage(SkillCompletionNotificationEventArgs skillNotifications)\n        {\n            StringBuilder builder = new StringBuilder();\n            foreach (QueuedSkill skill in skillNotifications.Skills)\n            {\n                builder.Append($\"{skill.SkillName} {Skill.GetRomanFromInt(skill.Level)} completed.\")\n                    .AppendLine();\n            }\n            return builder.ToString();\n        }\n\n        /// <summary>\n        /// Builds the ended markets orders message.\n        /// </summary>\n        /// <param name=\"ordersNotification\">The <see cref=\"EVEMon.Common.Notifications.MarketOrdersNotificationEventArgs\"/> instance containing the event data.</param>\n        /// <returns></returns>\n        private static string MarketOrdersEndedMessage(MarketOrdersNotificationEventArgs ordersNotification)\n        {\n            StringBuilder builder = new StringBuilder();\n            foreach (IGrouping<OrderState, MarketOrder> orderGroup in ordersNotification.Orders.GroupBy(x => x.State))\n            {\n                if (builder.Length != 0)\n                    builder.AppendLine();\n\n                builder.AppendLine(orderGroup.Key.GetHeader());\n\n                foreach (MarketOrder order in orderGroup.Where(order => order.Item != null))\n                {\n                    const AbbreviationFormat Format = AbbreviationFormat.AbbreviationSymbols;\n                    // Expired :    12k/15k invulnerability fields at Pator V - Tech School\n                    // Fulfilled :  15k invulnerability fields at Pator V - Tech School\n                    if (order.State == OrderState.Expired)\n                        builder.Append(FormatHelper.Format(order.RemainingVolume, Format)).\n                            Append(Path.AltDirectorySeparatorChar);\n                    builder.Append(FormatHelper.Format(order.InitialVolume, Format)).\n                        Append(\" \").Append(order.Item.Name).Append(\" at \").\n                        AppendLine(order.Station?.Name ?? EveMonConstants.UnknownText);\n                }\n            }\n            return builder.ToString();\n        }\n\n        /// <summary>\n        /// Builds the ended contracts message.\n        /// </summary>\n        /// <param name=\"contractsNotification\">The <see cref=\"EVEMon.Common.Notifications.ContractsNotificationEventArgs\"/> instance containing the event data.</param>\n        /// <returns></returns>\n        private static string ContractsEndedMessage(ContractsNotificationEventArgs contractsNotification)\n        {\n            StringBuilder builder = new StringBuilder();\n            foreach (IGrouping<ContractState, Contract> contractGroup in contractsNotification.\n                Contracts.GroupBy(x => x.State))\n            {\n                if (builder.Length != 0)\n                    builder.AppendLine();\n\n                builder.AppendLine(contractGroup.Key.GetHeader());\n\n                foreach (Contract contract in contractGroup)\n                    if (!contract.Issuer.IsEmptyOrUnknown())\n                    {\n                        builder.Append(contract.ContractText).Append(\" | \").\n                            Append(contract.ContractType).Append(\" | \").\n                            Append(contract.Status).Append(\" | \");\n                        if (contract.State == ContractState.Finished)\n                            builder.Append(\"Accepted by  \").Append(contract.Acceptor);\n                        builder.Append(\" at \").AppendLine(contract.StartStation?.Name ??\n                            EveMonConstants.UnknownText);\n                    }\n            }\n            return builder.ToString();\n        }\n\n        /// <summary>\n        /// Builds the completed industry jobs message.\n        /// </summary>\n        /// <param name=\"jobsNotification\">The <see cref=\"EVEMon.Common.Notifications.IndustryJobsNotificationEventArgs\"/> instance containing the event data.</param>\n        /// <returns></returns>\n        private static string IndustryJobsCompletedMessage(IndustryJobsNotificationEventArgs jobsNotification)\n        {\n            StringBuilder builder = new StringBuilder();\n            foreach (IndustryJob job in jobsNotification.Jobs)\n                if (job.InstalledItem != null)\n                {\n                    string name = job.SolarSystem?.Name ?? EveMonConstants.UnknownText;\n                    builder.Append(job.InstalledItem.Name).Append(\" at \").Append(\n                        $\"{name} > {job.Installation}\").AppendLine();\n                }\n            return builder.ToString();\n        }\n\n        /// <summary>\n        /// Builds the completed planetary pins message.\n        /// </summary>\n        /// <param name=\"pinsNotification\">The <see cref=\"EVEMon.Common.Notifications.PlanetaryPinsNotificationEventArgs\"/> instance containing the event data.</param>\n        /// <returns></returns>\n        private static string PlanetaryPinsCompletedMessage(PlanetaryPinsNotificationEventArgs pinsNotification)\n        {\n            StringBuilder builder = new StringBuilder();\n            foreach (PlanetaryPin pin in pinsNotification.PlanetaryPins)\n                builder.Append(pin.TypeName).Append(\" at \").Append(\n                    $\"{pin.Colony.SolarSystem.Name} > {pin.Colony.PlanetName}\").AppendLine();\n            return builder.ToString();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/NotificationList.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"toolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/Controls/Overview.Designer.cs",
    "content": "namespace EVEMon.Controls\n{\n    partial class Overview\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.labelNoCharacters = new System.Windows.Forms.Label();\n            this.labelLoading = new System.Windows.Forms.Label();\n            this.overviewLoadingThrobber = new EVEMon.Common.Controls.Throbber();\n            ((System.ComponentModel.ISupportInitialize)(this.overviewLoadingThrobber)).BeginInit();\n            this.SuspendLayout();\n            // \n            // labelNoCharacters\n            // \n            this.labelNoCharacters.BackColor = System.Drawing.Color.Transparent;\n            this.labelNoCharacters.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.labelNoCharacters.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.labelNoCharacters.Location = new System.Drawing.Point(0, 0);\n            this.labelNoCharacters.Name = \"labelNoCharacters\";\n            this.labelNoCharacters.Size = new System.Drawing.Size(361, 507);\n            this.labelNoCharacters.TabIndex = 0;\n            this.labelNoCharacters.Text = \"No character loaded or monitored\\r\\n\\r\\nTo add characters, click the File > Add API k\" +\n    \"ey... menu option\\r\\nTo monitor characters, click the File > Manage API Keys... me\" +\n    \"nu option\";\n            this.labelNoCharacters.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            this.labelNoCharacters.Visible = false;\n            // \n            // labelLoading\n            // \n            this.labelLoading.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.labelLoading.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.labelLoading.Location = new System.Drawing.Point(0, 0);\n            this.labelLoading.Name = \"labelLoading\";\n            this.labelLoading.Size = new System.Drawing.Size(361, 507);\n            this.labelLoading.TabIndex = 1;\n            this.labelLoading.Text = \"Loading...\\r\\n\\r\\nPlease Wait.\";\n            this.labelLoading.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // overviewLoadingThrobber\n            // \n            this.overviewLoadingThrobber.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.overviewLoadingThrobber.Location = new System.Drawing.Point(168, 243);\n            this.overviewLoadingThrobber.MaximumSize = new System.Drawing.Size(24, 24);\n            this.overviewLoadingThrobber.MinimumSize = new System.Drawing.Size(24, 24);\n            this.overviewLoadingThrobber.Name = \"overviewLoadingThrobber\";\n            this.overviewLoadingThrobber.Size = new System.Drawing.Size(24, 24);\n            this.overviewLoadingThrobber.State = EVEMon.Common.Enumerations.ThrobberState.Stopped;\n            this.overviewLoadingThrobber.TabIndex = 2;\n            this.overviewLoadingThrobber.TabStop = false;\n            this.overviewLoadingThrobber.Visible = false;\n            // \n            // Overview\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.Color.Transparent;\n            this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;\n            this.Controls.Add(this.labelLoading);\n            this.Controls.Add(this.labelNoCharacters);\n            this.Controls.Add(this.overviewLoadingThrobber);\n            this.Name = \"Overview\";\n            this.Size = new System.Drawing.Size(361, 507);\n            ((System.ComponentModel.ISupportInitialize)(this.overviewLoadingThrobber)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label labelNoCharacters;\n        private System.Windows.Forms.Label labelLoading;\n        private Common.Controls.Throbber overviewLoadingThrobber;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/Overview.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Controls\n{\n    public partial class Overview : UserControl\n    {\n        public event EventHandler<CharacterChangedEventArgs> CharacterClicked;\n\n        private bool m_grouping;\n        private bool m_safeForWork;\n        private PortraitSizes m_portraitSize;\n        private bool m_showPortrait;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public Overview()\n        {\n            InitializeComponent();\n\n            labelNoCharacters.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n            labelLoading.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n            overviewLoadingThrobber.BringToFront();\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load, update the controls.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            overviewLoadingThrobber.State = ThrobberState.Rotating;\n            overviewLoadingThrobber.Show();\n\n            DoubleBuffered = true;\n\n            EveMonClient.MonitoredCharacterCollectionChanged += EveMonClient_MonitoredCharacterCollectionChanged;\n            EveMonClient.CharacterUpdated += EveMonClient_CharacterUpdated;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// On visibility, we may need to refresh the display.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (!DesignMode && !this.IsDesignModeHosted() && Visible)\n                UpdateContent();\n        }\n\n        /// <summary>\n        /// On disposing, unsubscribe events.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.MonitoredCharacterCollectionChanged -= EveMonClient_MonitoredCharacterCollectionChanged;\n            EveMonClient.CharacterUpdated -= EveMonClient_CharacterUpdated;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// Adjust the layout on size change.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnSizeChanged(EventArgs e)\n        {\n            base.OnSizeChanged(e);\n            PerformCustomLayout();\n        }\n\n        #endregion\n\n\n        #region Content creation and layout\n\n        /// <summary>\n        /// Updates the overview content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // User has disabled the Overview\n            if (!Settings.UI.MainWindow.ShowOverview || EveMonClient.MonitoredCharacters == null)\n                return;\n\n            List<OverviewItem> overviewItems = Controls.OfType<OverviewItem>().ToList();\n            // Updates the visibility of the label for when no characters are loaded\n            if (!EveMonClient.MonitoredCharacters.Any())\n            {\n                if (overviewItems.Count > 0)\n                    CleanUp(overviewItems);\n\n                labelNoCharacters.Show();\n\n                return;\n            }\n\n            // Collect the existing overview items\n            var items = overviewItems.ToDictionary(page => (Character)page.Tag);\n\n            // Create the order we will layout the controls\n            List<Character> characters = new List<Character>();\n\n            if (m_grouping)\n            {\n                characters.AddRange(EveMonClient.MonitoredCharacters.Where(x => x.IsTraining));\n                characters.AddRange(EveMonClient.MonitoredCharacters.Where(x => !x.IsTraining));\n            }\n            else\n                characters.AddRange(EveMonClient.MonitoredCharacters);\n\n            int index = 0;\n            \n            foreach (Character character in characters)\n            {\n                // Retrieve the current overview item, or null if we're past the limits\n                OverviewItem currentOverviewItem = index < overviewItems.Count ? overviewItems[index] : null;\n\n                // Does the overview item match with the character ?\n                if ((Character)currentOverviewItem?.Tag != character)\n                {\n                    // Retrieve the overview item when it was previously created\n                    // Is the overview item later in the collection ?\n                    OverviewItem overviewItem;\n                    if (items.TryGetValue(character, out overviewItem))\n                        overviewItems.Remove(overviewItem); // Remove the overview item from old location\n                    else\n                        overviewItem = GetOverviewItem(character); // Create a new overview item\n\n                    // Inserts the overview item in the proper location\n                    overviewItems.Insert(index, overviewItem);\n                }\n\n                // Remove processed character from the dictionary and move forward\n                if (character != null)\n                    items.Remove(character);\n\n                index++;\n            }\n\n            // Remove the remaining items\n            CleanUp(items.Values);\n            foreach (OverviewItem item in items.Values)\n            {\n                overviewItems.Remove(item);\n            }\n\n            // Add the created items to the Overview\n            Controls.AddRange(overviewItems.ToArray<Control>());\n\n            PerformCustomLayout();\n        }\n\n        /// <summary>\n        /// Updates from settings.\n        /// </summary>\n        private void UpdateFromSettings()\n        {\n            m_safeForWork = Settings.UI.SafeForWork;\n            m_grouping = Settings.UI.MainWindow.PutTrainingSkillsFirstOnOverview;\n            m_portraitSize = Settings.UI.MainWindow.OverviewItemSize;\n            m_showPortrait = Settings.UI.MainWindow.ShowOverviewPortrait;\n\n            // Update the controls\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Cleans up the existing controls.\n        /// </summary>\n        /// <param name=\"items\">The items.</param>\n        private void CleanUp(IEnumerable<OverviewItem> items)\n        {\n            // Dispose every one of the control to prevent event triggering\n            foreach (OverviewItem item in items)\n            {\n                item.Click -= item_Click;\n                item.Dispose();\n            }\n\n            // Clear the controls list\n            Controls.Clear();\n            Controls.Add(labelNoCharacters);\n        }\n\n        /// <summary>\n        /// Gets the overview item.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <returns></returns>\n        private OverviewItem GetOverviewItem(Character character)\n        {\n            OverviewItem overviewItem;\n            OverviewItem tempOverviewItem = null;\n            try\n            {\n                // Creates a new page\n                tempOverviewItem = new OverviewItem(character);\n                tempOverviewItem.Click += item_Click;\n                tempOverviewItem.Clickable = true;\n                tempOverviewItem.Tag = character;\n\n                // Ensure that the control gets created before we add it,\n                // (when Overview is created and then we hide a character,\n                // the control gets created after the custom layout has been performed,\n                // causing the controls to get misplaced)\n                tempOverviewItem.CreateControl();\n\n                overviewItem = tempOverviewItem;\n                tempOverviewItem = null;\n            }\n            finally\n            {\n                tempOverviewItem?.Dispose();\n            }\n\n            return overviewItem;\n        }\n\n        /// <summary>\n        /// Updates the number of rows and columns.\n        /// </summary>\n        /// <remarks>\n        /// Cannot use a tableLayoutPanel in the end : too slow, too buggy.\n        /// </remarks>\n        private void PerformCustomLayout()\n        {\n            int clientWidth = ClientSize.Width, clientHeight = ClientSize.Height;\n            if (!Visible || clientWidth < 1 || clientHeight < 1)\n                return;\n\n            IList<OverviewItem> overviewItems = Controls.OfType<OverviewItem>().ToList();\n\n            // Check there is at least one control\n            int numControls = overviewItems.Count;\n            if (numControls == 0)\n                return;\n\n            const int Pad = 20;\n\n            // Store and reset the scroll bar position\n            int scrollBarPosition = VerticalScroll.Value;\n            VerticalScroll.Value = 0;\n\n            this.SuspendDrawing();\n\n            SuspendLayout();\n\n            try\n            {\n                // Retrieve the item width (should be the same for all controls) and compute the item and row width\n                int itemWidth = overviewItems.Max(item => item.PreferredSize.Width);\n\n                // Computes the number of columns and rows we need\n                int numColumns = Math.Max(1, Math.Min(numControls, clientWidth / itemWidth));\n\n                // Computes the horizontal margin\n                int neededWidth = numColumns * (itemWidth + Pad) - Pad;\n                int marginH = Math.Max(0, (clientWidth - neededWidth) / 2);\n\n                // Measure the total height\n                int rowIndex = 0;\n                int rowHeight = 0;\n                int height = 0;\n                foreach (OverviewItem overviewItem in overviewItems)\n                {\n                    // Add the item to the row\n                    rowHeight = Math.Max(rowHeight, overviewItem.PreferredSize.Height);\n                    rowIndex++;\n\n                    // Skip if row not complete yet\n                    if (rowIndex != numColumns)\n                        continue;\n\n                    height += rowHeight + Pad;\n                    rowHeight = 0;\n                    rowIndex = 0;\n                }\n\n                // Computes the vertical margin\n                height -= Pad;\n                \n                // We put 1/3 at the top, 2/3 at the bottom\n                int marginV = Math.Max(0, (clientHeight - height) / 3); \n\n                // Adjust the controls bounds\n                rowIndex = 0;\n                rowHeight = 0;\n                height = marginV;\n                foreach (OverviewItem overviewItem in overviewItems)\n                {\n                    var size = overviewItem.PreferredSize;\n                    // Set the control bound\n                    overviewItem.SetBounds(marginH + rowIndex * (itemWidth + Pad), height, size.Width,\n                        size.Height);\n                    rowHeight = Math.Max(rowHeight, size.Height);\n                    rowIndex++;\n\n                    // Skip if row not complete yet\n                    if (rowIndex != numColumns)\n                        continue;\n\n                    height += rowHeight + Pad;\n                    rowHeight = 0;\n                    rowIndex = 0;\n                }\n\n                labelNoCharacters.Visible = !EveMonClient.MonitoredCharacters.Any();\n\n                base.AdjustFormScrollbars(true);\n            }\n            finally\n            {\n                ResumeLayout(false);\n\n                this.ResumeDrawing();\n\n                // Restore the scroll bar position\n                VerticalScroll.Value = Math.Min(scrollBarPosition, VerticalScroll.Maximum);\n            }\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether [overview settings changed].\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if [overview settings changed]; otherwise, <c>false</c>.\n        /// </value>\n        private bool OverviewSettingsChanged()\n            => (m_grouping != Settings.UI.MainWindow.PutTrainingSkillsFirstOnOverview) ||\n               (m_portraitSize != Settings.UI.MainWindow.OverviewItemSize) ||\n               (m_showPortrait != Settings.UI.MainWindow.ShowOverviewPortrait) ||\n               (m_safeForWork != Settings.UI.SafeForWork);\n\n        #endregion\n\n\n        #region Globals and locals events\n\n        /// <summary>\n        /// Occur when the monitored characters collection changed. We update the layout.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_MonitoredCharacterCollectionChanged(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When aby character updates, we update the layout.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the settings changed, update if necessary.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            if (labelLoading.Visible)\n            {\n                overviewLoadingThrobber.State = ThrobberState.Stopped;\n                overviewLoadingThrobber.Hide();\n                labelLoading.Hide();\n            }\n\n            // Update only when settings that effect the overview have changed\n            if (!OverviewSettingsChanged())\n                return;\n\n            // Force an update of each overview item before upating the content\n            // This is mandatory in order to determine the overview items positioning\n            Controls.OfType<OverviewItem>().ToList().ForEach(item => item.UpdateOnSettingsChanged());\n            UpdateFromSettings();\n        }\n\n        /// <summary>\n        /// When an item has been clicked, fires the appropriate event to notify the main window.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void item_Click(object sender, EventArgs e)\n        {\n            OverviewItem item = sender as OverviewItem;\n\n            if (item != null)\n                CharacterClicked?.ThreadSafeInvoke(this, new CharacterChangedEventArgs(item.Character));\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/Overview.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/Controls/OverviewItem.Designer.cs",
    "content": "namespace EVEMon.Controls\n{\n    partial class OverviewItem\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.pbCharacterPortrait = new EVEMon.Common.Controls.CharacterPortrait();\n            this.lblTotalSkillPoints = new EVEMon.Controls.OverviewLabel();\n            this.lblExtraInfo = new EVEMon.Controls.OverviewLabel();\n            this.lblSkillQueueTrainingTime = new EVEMon.Controls.OverviewLabel();\n            this.lblCompletionTime = new EVEMon.Controls.OverviewLabel();\n            this.lblCharName = new EVEMon.Controls.OverviewLabel();\n            this.lblSkillInTraining = new EVEMon.Controls.OverviewLabel();\n            this.lblRemainingTime = new EVEMon.Controls.OverviewLabel();\n            this.lblBalance = new EVEMon.Controls.OverviewLabel();\n            this.SuspendLayout();\n            // \n            // pbCharacterPortrait\n            // \n            this.pbCharacterPortrait.Character = null;\n            this.pbCharacterPortrait.Enabled = false;\n            this.pbCharacterPortrait.Location = new System.Drawing.Point(9, 11);\n            this.pbCharacterPortrait.Name = \"pbCharacterPortrait\";\n            this.pbCharacterPortrait.Size = new System.Drawing.Size(92, 92);\n            this.pbCharacterPortrait.TabIndex = 0;\n            this.pbCharacterPortrait.TabStop = false;\n            // \n            // lblTotalSkillPoints\n            // \n            this.lblTotalSkillPoints.AutoEllipsis = true;\n            this.lblTotalSkillPoints.BackColor = System.Drawing.Color.Transparent;\n            this.lblTotalSkillPoints.Enabled = false;\n            this.lblTotalSkillPoints.ForeColor = System.Drawing.Color.DimGray;\n            this.lblTotalSkillPoints.Location = new System.Drawing.Point(107, 45);\n            this.lblTotalSkillPoints.Name = \"lblTotalSkillPoints\";\n            this.lblTotalSkillPoints.Size = new System.Drawing.Size(185, 14);\n            this.lblTotalSkillPoints.TabIndex = 4;\n            this.lblTotalSkillPoints.Text = \"100,000,000 SP\";\n            // \n            // lblLocation\n            // \n            this.lblExtraInfo.AutoEllipsis = true;\n            this.lblExtraInfo.BackColor = System.Drawing.Color.Transparent;\n            this.lblExtraInfo.Enabled = false;\n            this.lblExtraInfo.ForeColor = System.Drawing.Color.DimGray;\n            this.lblExtraInfo.Location = new System.Drawing.Point(9, 101);\n            this.lblExtraInfo.Name = \"lblLocation\";\n            this.lblExtraInfo.Size = new System.Drawing.Size(92, 13);\n            this.lblExtraInfo.TabIndex = 1;\n            this.lblExtraInfo.Text = \"Egghelende\";\n            this.lblExtraInfo.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // lblSkillQueueTrainingTime\n            // \n            this.lblSkillQueueTrainingTime.AutoEllipsis = true;\n            this.lblSkillQueueTrainingTime.BackColor = System.Drawing.Color.Transparent;\n            this.lblSkillQueueTrainingTime.Enabled = false;\n            this.lblSkillQueueTrainingTime.ForeColor = System.Drawing.Color.DimGray;\n            this.lblSkillQueueTrainingTime.Location = new System.Drawing.Point(107, 101);\n            this.lblSkillQueueTrainingTime.Name = \"lblSkillQueueTrainingTime\";\n            this.lblSkillQueueTrainingTime.Size = new System.Drawing.Size(215, 13);\n            this.lblSkillQueueTrainingTime.TabIndex = 8;\n            this.lblSkillQueueTrainingTime.Text = \"Queue ends in 157d 23h 59m\";\n            // \n            // lblCompletionTime\n            // \n            this.lblCompletionTime.AutoEllipsis = true;\n            this.lblCompletionTime.BackColor = System.Drawing.Color.Transparent;\n            this.lblCompletionTime.Enabled = false;\n            this.lblCompletionTime.ForeColor = System.Drawing.Color.DimGray;\n            this.lblCompletionTime.Location = new System.Drawing.Point(107, 88);\n            this.lblCompletionTime.Name = \"lblCompletionTime\";\n            this.lblCompletionTime.Size = new System.Drawing.Size(215, 13);\n            this.lblCompletionTime.TabIndex = 7;\n            this.lblCompletionTime.Text = \"Mon 12/31/2017, 12:32:15 PM\";\n            // \n            // lblCharName\n            // \n            this.lblCharName.AutoEllipsis = true;\n            this.lblCharName.BackColor = System.Drawing.Color.Transparent;\n            this.lblCharName.Enabled = false;\n            this.lblCharName.Location = new System.Drawing.Point(107, 11);\n            this.lblCharName.Name = \"lblCharName\";\n            this.lblCharName.Size = new System.Drawing.Size(186, 14);\n            this.lblCharName.TabIndex = 2;\n            this.lblCharName.Text = \"Character Name\";\n            // \n            // lblSkillInTraining\n            // \n            this.lblSkillInTraining.AutoEllipsis = true;\n            this.lblSkillInTraining.BackColor = System.Drawing.Color.Transparent;\n            this.lblSkillInTraining.Enabled = false;\n            this.lblSkillInTraining.ForeColor = System.Drawing.Color.DimGray;\n            this.lblSkillInTraining.Location = new System.Drawing.Point(107, 75);\n            this.lblSkillInTraining.Name = \"lblSkillInTraining\";\n            this.lblSkillInTraining.Size = new System.Drawing.Size(215, 13);\n            this.lblSkillInTraining.TabIndex = 6;\n            this.lblSkillInTraining.Text = \"Magnetometric Sensor Compensation III\";\n            // \n            // lblRemainingTime\n            // \n            this.lblRemainingTime.AutoEllipsis = true;\n            this.lblRemainingTime.BackColor = System.Drawing.Color.Transparent;\n            this.lblRemainingTime.Enabled = false;\n            this.lblRemainingTime.ForeColor = System.Drawing.Color.DimGray;\n            this.lblRemainingTime.Location = new System.Drawing.Point(107, 61);\n            this.lblRemainingTime.Name = \"lblRemainingTime\";\n            this.lblRemainingTime.Size = new System.Drawing.Size(186, 14);\n            this.lblRemainingTime.TabIndex = 5;\n            this.lblRemainingTime.Text = \"10d 12h 35m 24s\";\n            // \n            // lblBalance\n            // \n            this.lblBalance.AutoEllipsis = true;\n            this.lblBalance.BackColor = System.Drawing.Color.Transparent;\n            this.lblBalance.Enabled = false;\n            this.lblBalance.ForeColor = System.Drawing.Color.DimGray;\n            this.lblBalance.Location = new System.Drawing.Point(107, 29);\n            this.lblBalance.Name = \"lblBalance\";\n            this.lblBalance.Size = new System.Drawing.Size(185, 14);\n            this.lblBalance.TabIndex = 3;\n            this.lblBalance.Text = \"124,534,125,453.02 ISK\";\n            // \n            // OverviewItem\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.lblTotalSkillPoints);\n            this.Controls.Add(this.lblExtraInfo);\n            this.Controls.Add(this.lblSkillQueueTrainingTime);\n            this.Controls.Add(this.lblCompletionTime);\n            this.Controls.Add(this.lblCharName);\n            this.Controls.Add(this.lblSkillInTraining);\n            this.Controls.Add(this.lblRemainingTime);\n            this.Controls.Add(this.lblBalance);\n            this.Controls.Add(this.pbCharacterPortrait);\n            this.ForeColor = System.Drawing.SystemColors.ControlText;\n            this.Name = \"OverviewItem\";\n            this.Size = new System.Drawing.Size(330, 120);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private EVEMon.Common.Controls.CharacterPortrait pbCharacterPortrait;\n        private OverviewLabel lblTotalSkillPoints;\n        private OverviewLabel lblCharName;\n        private OverviewLabel lblSkillInTraining;\n        private OverviewLabel lblRemainingTime;\n        private OverviewLabel lblBalance;\n        private OverviewLabel lblCompletionTime;\n        private OverviewLabel lblSkillQueueTrainingTime;\n        private OverviewLabel lblExtraInfo;\n    }\n}"
  },
  {
    "path": "src/EVEMon/Controls/OverviewItem.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing System.Windows.Forms.VisualStyles;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Scheduling;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Controls\n{\n    /// <summary>\n    /// Represents an item displayed on the overview.\n    /// </summary>\n    public partial class OverviewItem : UserControl\n    {\n        /// <summary>\n        /// Approximately how long to display each component of the revolving industry jobs.\n        /// </summary>\n        private const int INTERVAL = 5;\n\n        #region Fields\n\n        private readonly bool m_isTooltip;\n\n        private Color m_settingsForeColor;\n        private bool m_showConflicts;\n        private bool m_showSkillInTraining;\n        private bool m_showCompletionTime;\n        private bool m_showRemainingTime;\n        private bool m_showWalletBalance;\n\n        // While an enum for the type of info to show would be more scalable, these booleans\n        // exist separately for compatibility with earlier versions of EVEMon 4\n        private bool m_showJobs;\n        private bool m_showLocation;\n\n        private bool m_showSkillpoints;\n        private bool m_showPortrait;\n        private bool m_showSkillQueueTrainingTime;\n        private int m_portraitSize;\n\n        private bool m_hovered;\n        private bool m_pressed;\n        private int m_preferredWidth;\n        private int m_preferredHeight;\n        private int m_minWidth;\n\n        private bool m_hasRemainingTime;\n        private bool m_hasCompletionTime;\n        private bool m_hasSkillInTraining;\n        private bool m_hasSkillQueueTrainingTime;\n\n        private float m_regularFontSize;\n        private float m_mediumFontSize;\n        private float m_bigFontSize;\n\n        #endregion\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Default constructor for designer.\n        /// </summary>\n        private OverviewItem()\n        {\n            m_portraitSize = 96;\n            m_preferredHeight = 1;\n            m_preferredWidth = 1;\n            \n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Constructor used in-code.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"isTooltip\">if set to <c>true</c> if this instance is used as tooltip.</param>\n        internal OverviewItem(Character character, bool isTooltip = false)\n            : this()\n        {\n            m_isTooltip = isTooltip;\n            Character = character;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Completes initialization.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Returns in design mode or when no char\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            DoubleBuffered = true;\n\n            // Font sizes\n            m_regularFontSize = 8.25F;\n            m_mediumFontSize = 9.75F;\n            m_bigFontSize = 11.25F;\n\n            // Initializes fonts\n            lblCharName.Font = FontFactory.GetFont(\"Tahoma\", m_bigFontSize, FontStyle.Bold);\n            lblBalance.Font = FontFactory.GetFont(\"Tahoma\", m_mediumFontSize, FontStyle.Bold);\n            lblRemainingTime.Font = FontFactory.GetFont(\"Tahoma\", m_mediumFontSize);\n            lblSkillInTraining.Font = FontFactory.GetFont(\"Tahoma\", m_regularFontSize);\n            lblCompletionTime.Font = FontFactory.GetFont(\"Tahoma\", m_regularFontSize);\n            lblSkillQueueTrainingTime.Font = FontFactory.GetFont(\"Tahoma\", m_regularFontSize);\n            lblExtraInfo.Font = FontFactory.GetFont(\"Tahoma\", m_regularFontSize);\n\n            // Initializes the portrait\n            pbCharacterPortrait.Hide();\n            pbCharacterPortrait.Character = Character;\n\n            // Initialize the skill queue training time label text\n            lblSkillQueueTrainingTime.Text = string.Empty;\n\n            // Global events\n            EveMonClient.CharacterSkillQueueUpdated += EveMonClient_CharacterSkillQueueUpdated;\n            EveMonClient.QueuedSkillsCompleted += EveMonClient_QueuedSkillsCompleted;\n            EveMonClient.MarketOrdersUpdated += EveMonClient_MarketOrdersUpdated;\n            EveMonClient.CharacterUpdated += EveMonClient_CharacterUpdated;\n            EveMonClient.SchedulerChanged += EveMonClient_SchedulerChanged;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.CharacterLabelChanged += EveMonClient_CharacterLabelChanged;\n            Disposed += OnDisposed;\n\n            UpdateOnSettingsChanged();\n        }\n\n        /// <summary>\n        /// On dispose, unsubscribe events.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterSkillQueueUpdated -= EveMonClient_CharacterSkillQueueUpdated;\n            EveMonClient.QueuedSkillsCompleted -= EveMonClient_QueuedSkillsCompleted;\n            EveMonClient.MarketOrdersUpdated -= EveMonClient_MarketOrdersUpdated;\n            EveMonClient.CharacterUpdated -= EveMonClient_CharacterUpdated;\n            EveMonClient.SchedulerChanged -= EveMonClient_SchedulerChanged;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.CharacterLabelChanged -= EveMonClient_CharacterLabelChanged;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// Occurs when the visibility changed.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (Visible)\n            {\n                UpdateContent();\n                UpdateTrainingTime();\n            }\n        }\n\n        /// <summary>\n        /// Paints a button behind when hovered.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            if (!m_hovered)\n                return;\n\n            ButtonRenderer.DrawButton(e.Graphics, DisplayRectangle, m_pressed ?\n                PushButtonState.Pressed : PushButtonState.Hot);\n        }\n\n        /// <summary>\n        /// When the mouse enters control, we need to display the back button.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnMouseEnter(EventArgs e)\n        {\n            base.OnMouseEnter(e);\n\n            if (!Clickable)\n                return;\n\n            // Show back button\n            m_hovered = true;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// When the mouse leaves the control, we need to hide the button background.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnMouseLeave(EventArgs e)\n        {\n            base.OnMouseLeave(e);\n\n            m_hovered = false;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.MouseEventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseDown(MouseEventArgs e)\n        {\n            base.OnMouseDown(e);\n\n            m_pressed = true;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseUp\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.MouseEventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseUp(MouseEventArgs e)\n        {\n            base.OnMouseUp(e);\n\n            m_pressed = false;\n            Invalidate();\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the character control is bound to.\n        /// </summary>\n        public Character Character { get; }\n\n        /// <summary>\n        /// Gets or sets true whether a button should appear on hover.\n        /// </summary>\n        [Description(\"When true, a background button will appear on hover and the control will fire Click event\")]\n        public bool Clickable { get; set; }\n\n        #endregion\n\n\n        #region Content update\n\n        /// <summary>\n        /// Updates when settings changed.\n        /// </summary>\n        internal void UpdateOnSettingsChanged()\n        {\n            TrayPopupSettings trayPopupSettings = Settings.UI.SystemTrayPopup;\n            MainWindowSettings mainWindowSettings = Settings.UI.MainWindow;\n            PortraitSizes portraitSize = m_isTooltip ? trayPopupSettings.PortraitSize :\n                mainWindowSettings.OverviewItemSize;\n\n            // Misc fields\n            m_portraitSize = portraitSize.GetDefaultValue();\n            m_showConflicts = !m_isTooltip || trayPopupSettings.HighlightConflicts;\n            m_showCompletionTime = !m_isTooltip || trayPopupSettings.ShowCompletionTime;\n            m_showRemainingTime = !m_isTooltip || trayPopupSettings.ShowRemainingTime;\n            m_showSkillInTraining = !m_isTooltip || trayPopupSettings.ShowSkillInTraining;\n            m_showWalletBalance = m_isTooltip ? trayPopupSettings.ShowWallet :\n                mainWindowSettings.ShowOverviewWallet;\n            m_showSkillpoints = !m_isTooltip && mainWindowSettings.\n                ShowOverviewTotalSkillpoints;\n            m_showPortrait = m_isTooltip ? trayPopupSettings.ShowPortrait :\n                mainWindowSettings.ShowOverviewPortrait;\n            m_showSkillQueueTrainingTime = m_isTooltip ? trayPopupSettings.\n                ShowSkillQueueTrainingTime : mainWindowSettings.\n                ShowOverviewSkillQueueTrainingTime;\n            m_showLocation = !m_isTooltip && mainWindowSettings.ShowOverviewLocation;\n            m_showJobs = !m_isTooltip && mainWindowSettings.ShowOverviewJobs;\n\n            // Update colors\n            UpdateContrastColor();\n\n            // Update the controls\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Updates the color of the contrast.\n        /// </summary>\n        private void UpdateContrastColor()\n        {\n            m_settingsForeColor = (m_isTooltip && Settings.UI.SystemTrayPopup.\n                UseIncreasedContrast) || (!m_isTooltip && Settings.UI.MainWindow.\n                UseIncreasedContrastOnOverview) ? Color.Black : Color.DimGray;\n\n            lblBalance.ForeColor = m_settingsForeColor;\n            lblTotalSkillPoints.ForeColor = m_settingsForeColor;\n            lblRemainingTime.ForeColor = m_settingsForeColor;\n            lblSkillInTraining.ForeColor = m_settingsForeColor;\n            lblCompletionTime.ForeColor = m_settingsForeColor;\n        }\n\n        /// <summary>\n        /// Update the controls.\n        /// </summary>\n        private void UpdateContent()\n        {\n            if (!Visible)\n                return;\n\n            // Update character's 'Adorned Name' and 'Portrait' in case they have changed\n            lblCharName.Text = Character.LabelPrefix + Character.AdornedName;\n            pbCharacterPortrait.Character = Character;\n            lblTotalSkillPoints.Text = string.Format(\"{0:N0} SP\", Character.SkillPoints);\n\n            FormatBalance();\n\n            var ccpCharacter = Character as CCPCharacter;\n            QueuedSkill trainingSkill = Character.CurrentlyTrainingSkill;\n            // Character in training ? We have labels to fill\n            if (Character.IsTraining || (ccpCharacter != null && trainingSkill != null &&\n                ccpCharacter.SkillQueue.IsPaused))\n            {\n                // Update the skill in training label\n                lblSkillInTraining.Text = trainingSkill.ToString();\n                DateTime endTime = trainingSkill.EndTime.ToLocalTime();\n\n                // Updates the time remaining label\n                lblRemainingTime.Text = (ccpCharacter != null && ccpCharacter.SkillQueue.\n                    IsPaused) ? \"Paused\" : trainingSkill.RemainingTime.ToDescriptiveText(\n                    DescriptiveTextOptions.IncludeCommas);\n\n                // Update the completion time\n                lblCompletionTime.Text = (ccpCharacter != null && ccpCharacter.SkillQueue.\n                    IsPaused) ? string.Empty : $\"{endTime:ddd} {endTime:G}\";\n\n                // Changes the completion time color on scheduling block\n                string blockingEntry;\n                bool isAutoBlocking;\n                bool isBlocking = Scheduler.SkillIsBlockedAt(endTime, out blockingEntry,\n                    out isAutoBlocking);\n                lblCompletionTime.ForeColor = (m_showConflicts && isBlocking &&\n                    (ccpCharacter == null || ccpCharacter.SkillQueue.Count == 1 ||\n                    !isAutoBlocking)) ? Color.Red : m_settingsForeColor;\n\n                // Update the skill queue training time label\n                UpdateSkillQueueTrainingTime();\n\n                // Show the training labels\n                m_hasSkillInTraining = true;\n                m_hasCompletionTime = true;\n                m_hasRemainingTime = true;\n                m_hasSkillQueueTrainingTime = true;\n            }\n            else\n            {\n                // Hide the training labels\n                m_hasSkillInTraining = false;\n                m_hasCompletionTime = false;\n                m_hasRemainingTime = false;\n                m_hasSkillQueueTrainingTime = false;\n            }\n            UpdateExtraData();\n            // Adjusts all the controls layout\n            PerformCustomLayout(m_isTooltip);\n        }\n\n        /// <summary>\n        /// Updates the extra data shown on screen.\n        /// </summary>\n        private void UpdateExtraData()\n        {\n            string extraText = string.Empty;\n            var ccpCharacter = Character as CCPCharacter;\n            if (m_showLocation)\n            {\n                // Determine the character's system location\n                int locID = Character?.LastKnownLocation?.SolarSystemID ?? 0;\n                if (locID == 0)\n                    extraText = EveMonConstants.UnknownText + \" Location\";\n                else\n                    extraText = StaticGeography.GetSolarSystemName(locID);\n            }\n            else if (m_showJobs && ccpCharacter != null)\n            {\n                int jobs, max, indJobs = 0, resJobs = 0, reaJobs = 0;\n                string desc;\n                // Sum up by type\n                foreach (var job in ccpCharacter.CharacterIndustryJobs)\n                    switch (job.Activity)\n                    {\n                    case BlueprintActivity.Reactions:\n                    case BlueprintActivity.SimpleReactions:\n                        reaJobs++;\n                        break;\n                    case BlueprintActivity.Manufacturing:\n                        indJobs++;\n                        break;\n                    case BlueprintActivity.Copying:\n                    case BlueprintActivity.Duplicating:\n                    case BlueprintActivity.Invention:\n                    case BlueprintActivity.ResearchingMaterialEfficiency:\n                    case BlueprintActivity.ResearchingTechnology:\n                    case BlueprintActivity.ResearchingTimeEfficiency:\n                    case BlueprintActivity.ReverseEngineering:\n                        resJobs++;\n                        break;\n                    default:\n                        break;\n                    }\n                // Determine the character's jobs remaining (character only)\n                switch ((DateTime.UtcNow.Second / INTERVAL) % 3)\n                {\n                case 0:\n                default:\n                    // Industry\n                    max = IndustryJob.MaxManufacturingJobsFor(ccpCharacter);\n                    jobs = indJobs;\n                    desc = \"Indus\";\n                    break;\n                case 1:\n                    // Research\n                    max = IndustryJob.MaxResearchJobsFor(ccpCharacter);\n                    jobs = resJobs;\n                    desc = \"Resea\";\n                    break;\n                case 2:\n                    // Reaction\n                    max = IndustryJob.MaxReactionJobsFor(ccpCharacter);\n                    jobs = reaJobs;\n                    desc = \"React\";\n                    break;\n                }\n                extraText = string.Format(\"{0:D} / {1:D} {2}\", jobs, max, desc);\n            }\n            lblExtraInfo.Text = extraText;\n        }\n\n        /// <summary>\n        /// Formats the balance.\n        /// </summary>\n        private void FormatBalance()\n        {\n            lblBalance.Text = $\"{Character.Balance:N} ISK\";\n\n            CCPCharacter ccpCharacter = Character as CCPCharacter;\n            Color balanceColor = m_settingsForeColor;\n            if (ccpCharacter != null && !Settings.UI.SafeForWork)\n            {\n                IQueryMonitor marketMonitor = ccpCharacter.QueryMonitors[\n                    ESIAPICharacterMethods.MarketOrders];\n                // Orange if orders could fail on margin\n                if (!ccpCharacter.HasSufficientBalance && marketMonitor != null &&\n                        marketMonitor.Enabled)\n                    balanceColor = Color.Orange;\n                else if (ccpCharacter.Balance < 0)\n                    // Red if negative wallet\n                    balanceColor = Color.Red;\n            }\n            lblBalance.ForeColor = balanceColor;\n        }\n\n        /// <summary>\n        /// Updates the controls' visibility.\n        /// </summary>\n        /// <returns></returns>\n        private void UpdateVisibilities()\n        {\n            lblRemainingTime.Visible = m_hasRemainingTime && m_showRemainingTime;\n            lblCompletionTime.Visible = m_hasCompletionTime && m_showCompletionTime;\n            lblSkillInTraining.Visible = m_hasSkillInTraining && m_showSkillInTraining;\n            lblSkillQueueTrainingTime.Visible = m_hasSkillQueueTrainingTime &&\n                m_showSkillQueueTrainingTime;\n            lblBalance.Visible = m_showWalletBalance;\n            lblTotalSkillPoints.Visible = m_showSkillpoints;\n            lblExtraInfo.Visible = m_showLocation || m_showJobs;\n        }\n\n        /// <summary>\n        /// Updates the training time.\n        /// </summary>\n        private void UpdateTrainingTime()\n        {\n            if (Character.IsTraining)\n            {\n                TimeSpan remainingTime = Character.CurrentlyTrainingSkill.RemainingTime;\n                lblRemainingTime.Text = remainingTime.ToDescriptiveText(DescriptiveTextOptions.\n                    IncludeCommas);\n                UpdateSkillQueueTrainingTime();\n            }\n        }\n\n        /// <summary>\n        /// Updates the skill queue training time.\n        /// </summary>\n        /// <returns></returns>\n        private void UpdateSkillQueueTrainingTime()\n        {\n            CCPCharacter ccpCharacter = Character as CCPCharacter;\n            lblSkillQueueTrainingTime.ForeColor = m_settingsForeColor;\n            string text = string.Empty;\n            // Current character isn't a CCP character, so can't have a Queue\n            if (ccpCharacter != null && !ccpCharacter.SkillQueue.IsPaused)\n            {\n                TimeSpan skillQueueEndTime = ccpCharacter.SkillQueue.EndTime.Subtract(\n                    DateTime.UtcNow);\n                TimeSpan timeLeft = SkillQueue.WarningThresholdTimeSpan.Subtract(\n                    skillQueueEndTime);\n\n                // Negative time: Skill queue is populated with more than a day\n                if (timeLeft < TimeSpan.Zero)\n                {\n                    // More than one entry in queue ? Display total queue remaining time\n                    if (ccpCharacter.SkillQueue.Count > 1)\n                    {\n                        text = \"Queue ends in \" + ccpCharacter.SkillQueue.EndTime.\n                            ToRemainingTimeShortDescription(DateTimeKind.Utc);\n                    }\n                }\n                // Skill queue is empty ?\n                else if (timeLeft > SkillQueue.WarningThresholdTimeSpan)\n                {\n                    lblSkillQueueTrainingTime.ForeColor = Color.Red;\n                    text = \"Skill queue is empty\";\n                }\n                else if (timeLeft != TimeSpan.Zero)\n                {\n                    // Less than one minute? Display seconds else display time without seconds\n                    string endTimeText = skillQueueEndTime.ToDescriptiveText(\n                        DescriptiveTextOptions.IncludeCommas, skillQueueEndTime < TimeSpan.\n                        FromMinutes(1));\n                    lblSkillQueueTrainingTime.ForeColor = Color.Red;\n                    text = $\"Queue ends in {endTimeText}\";\n                }\n            }\n            lblSkillQueueTrainingTime.Text = text;\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// When a character label is changed, we update if it is our character.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterLabelChanged(object sender, LabelChangedEventArgs e)\n        {\n            if (e.Character == Character)\n                UpdateContent();\n        }\n\n        /// <summary>\n        /// On every second, we update the remaining time.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (Visible)\n            {\n                UpdateTrainingTime();\n                UpdateExtraData();\n            }\n        }\n\n        /// <summary>\n        /// When the scheduler changed, we may have to display a warning (blocking entry).\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SchedulerChanged(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the settings changed, update if necessary.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateOnSettingsChanged();\n        }\n\n        /// <summary>\n        /// On skill completion.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_QueuedSkillsCompleted(object sender, QueuedSkillsEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            // Character still training ? Jump to next skill\n            if (Character.IsTraining)\n                UpdateContent();\n            else\n            {\n                lblRemainingTime.Text = @\"Completed\";\n                m_hasCompletionTime = false;\n                UpdateVisibilities();\n            }\n        }\n\n        /// <summary>\n        /// On character market orders updated, update the balance format.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_MarketOrdersUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            FormatBalance();\n        }\n\n        /// <summary>\n        /// On character sheet changed, update everything.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// On character skill queue changed, update everything.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterSkillQueueUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != Character)\n                return;\n\n            UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Layout\n\n        /// <summary>\n        /// Adjusts all the controls layout.\n        /// </summary>\n        /// <param name=\"tooltip\"></param>\n        private void PerformCustomLayout(bool tooltip)\n        {\n            int x48 = PortraitSizes.x48.GetDefaultValue(), x64 = PortraitSizes.x64.\n                GetDefaultValue(), x80 = PortraitSizes.x80.GetDefaultValue();\n\n            if (!Visible)\n                return;\n            SuspendLayout();\n            UpdateVisibilities();\n\n            bool showPortrait = m_showPortrait && !Settings.UI.SafeForWork;\n            int portraitSize = m_portraitSize, margin = 10, smallLabelHeight = 13, labelWidth;\n            if (tooltip)\n                margin = portraitSize <= x48 ? 2 : (portraitSize <= x64 ? 4 : (portraitSize <=\n                    x80 ? 6 : margin));\n\n            // Label height\n            int labelHeight = portraitSize <= x48 ? smallLabelHeight : (portraitSize <= x64 ?\n                16 : 18);\n            // Label width\n            if (tooltip)\n                labelWidth = 0;\n            else\n                // Ensure that the graphics is thrown away when used\n                using (var g = Graphics.FromHwnd(Handle))\n                {\n                    labelWidth = (int)(GetMinimumWidth(g) * g.DpiX / EveMonConstants.\n                        DefaultDpi);\n                }\n\n            // Big font size\n            float bigFontSize = portraitSize <= x48 ? m_regularFontSize : (portraitSize <=\n                x64 ? m_mediumFontSize : m_bigFontSize);\n            // Medium font size\n            float mediumFontSize = portraitSize <= x64 ? m_regularFontSize : m_mediumFontSize;\n            // Margin between the two labels groups\n            int verticalMargin = m_showSkillQueueTrainingTime ? 4 : 16;\n            if (portraitSize <= x80)\n                verticalMargin = 0;\n\n            // Adjust portrait\n            pbCharacterPortrait.Location = new Point(margin, margin);\n            pbCharacterPortrait.Size = new Size(portraitSize, portraitSize);\n            pbCharacterPortrait.Visible = showPortrait;\n            // Adjust the top labels\n            int top = margin - 2;\n            int left = showPortrait ? portraitSize + margin * 2 : margin;\n            int rightPad = tooltip ? 10 : 0;\n\n            Size size = GetSizeForLabel(lblCharName, bigFontSize, left, top, rightPad,\n                labelWidth, labelHeight);\n            labelWidth = size.Width;\n            labelHeight = size.Height;\n            top += labelHeight;\n\n            if (lblBalance.Visible)\n            {\n                size = GetSizeForLabel(lblBalance, mediumFontSize, left, top, rightPad,\n                    labelWidth, labelHeight);\n                labelWidth = size.Width;\n                labelHeight = size.Height;\n                top += labelHeight;\n            }\n            if (lblTotalSkillPoints.Visible)\n            {\n                size = GetSizeForLabel(lblTotalSkillPoints, mediumFontSize, left, top,\n                    rightPad, labelWidth, labelHeight);\n                labelWidth = size.Width;\n                labelHeight = size.Height;\n                top += labelHeight;\n            }\n            if (lblRemainingTime.Visible || lblSkillInTraining.Visible || lblCompletionTime.\n                    Visible)\n                top += verticalMargin;\n            if (lblRemainingTime.Visible)\n            {\n                size = GetSizeForLabel(lblRemainingTime, mediumFontSize, left, top, rightPad,\n                    labelWidth, labelHeight);\n                labelWidth = size.Width;\n                labelHeight = size.Height;\n                top += labelHeight;\n            }\n            if (lblSkillInTraining.Visible)\n            {\n                size = GetSizeForLabel(lblSkillInTraining, m_regularFontSize, left, top,\n                    rightPad, labelWidth, smallLabelHeight);\n                labelWidth = size.Width;\n                smallLabelHeight = size.Height;\n                top += smallLabelHeight;\n            }\n            if (lblCompletionTime.Visible)\n            {\n                size = GetSizeForLabel(lblCompletionTime, m_regularFontSize, left, top,\n                    rightPad, labelWidth, smallLabelHeight);\n                labelWidth = size.Width;\n                smallLabelHeight = size.Height;\n                top += smallLabelHeight;\n            }\n            if (lblSkillQueueTrainingTime.Visible)\n            {\n                size = GetSizeForLabel(lblSkillQueueTrainingTime, m_regularFontSize, left, top,\n                    rightPad, labelWidth, smallLabelHeight);\n                labelWidth = size.Width;\n                smallLabelHeight = size.Height;\n                top += smallLabelHeight;\n            }\n            int lh = portraitSize;\n            if (lblExtraInfo.Visible)\n            {\n                // Below portrait if used, else below last text\n                size = GetSizeForLabel(lblExtraInfo, m_regularFontSize, showPortrait ? margin :\n                    left, showPortrait ? (margin + portraitSize) : top, rightPad, labelWidth,\n                    smallLabelHeight);\n                smallLabelHeight = size.Height;\n                // Add to correct side of the view\n                if (showPortrait)\n                {\n                    lh += smallLabelHeight;\n                    // Avoid overlapping text\n                    lblExtraInfo.Width = Math.Min(lblExtraInfo.Width, portraitSize);\n                }\n                else\n                    top += smallLabelHeight;\n            }\n            Width = m_preferredWidth = left + labelWidth + margin;\n            Height = m_preferredHeight = margin + (showPortrait ? Math.Max(top, lh + margin) :\n                top);\n\n            ResumeLayout(false);\n        }\n\n        /// <summary>\n        /// Gets the minimum width.\n        /// </summary>\n        /// <returns></returns>\n        private int GetMinimumWidth(Graphics g)\n        {\n            if (m_minWidth <= 0)\n            {\n                // Determine longest skill name\n                StaticSkill longestSkill = null;\n                int maxLength = 0;\n                foreach (var skill in StaticSkills.AllSkills)\n                {\n                    int len = skill.Name.Length;\n                    if (longestSkill == null || len > maxLength)\n                    {\n                        maxLength = len;\n                        longestSkill = skill;\n                    }\n                }\n                // Use the actual font on the display\n                m_minWidth = (int)Math.Ceiling(g.MeasureString(longestSkill.Name + \" \" + Skill.\n                    GetRomanFromInt(3), lblSkillInTraining.Font).Width);\n            }\n            return m_minWidth;\n        }\n\n        /// <summary>\n        /// Gets the size for the specified label.\n        /// </summary>\n        /// <param name=\"label\">The label.</param>\n        /// <param name=\"fontSize\">Size of the font.</param>\n        /// <param name=\"left\">The left.</param>\n        /// <param name=\"top\">The top.</param>\n        /// <param name=\"rightPad\">The right pad.</param>\n        /// <param name=\"labelWidth\">Width of the label.</param>\n        /// <param name=\"labelHeight\">Height of the label.</param>\n        /// <returns></returns>\n        private static Size GetSizeForLabel(Label label, float fontSize, int left, int top,\n            int rightPad, int labelWidth, int labelHeight)\n        {\n            Font font = FontFactory.GetFont(label.Font.FontFamily, fontSize, label.Font.Style);\n            label.Font = font;\n            label.Location = new Point(left, top);\n            labelWidth = Math.Max(labelWidth, label.PreferredWidth + rightPad);\n            labelHeight = Math.Max(labelHeight, font.Height);\n            label.Size = new Size(labelWidth, labelHeight);\n            return label.Size;\n        }\n\n        /// <summary>\n        /// Gets the preferred size for control. Used by parents to decide which size they will grant to their children.\n        /// </summary>\n        /// <param name=\"proposedSize\"></param>\n        /// <returns></returns>\n        public override Size GetPreferredSize(Size proposedSize) => new Size(m_preferredWidth,\n            m_preferredHeight);\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/OverviewItem.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/Controls/OverviewLabel.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Controls\n{\n    /// <summary>\n    /// A panel that does not display a gray text when disabled\n    /// (and we need to disable them so that the button\n    /// does not always lose focus and its nice \"I'm hovered\" color)\n    /// </summary>\n    public sealed class OverviewLabel : Label\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"OverviewLabel\"/> class.\n        /// </summary>\n        public OverviewLabel()\n        {\n            DoubleBuffered = true;\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the control can respond to user interaction.\n        /// </summary>\n        /// <value></value>\n        /// <returns>true if the control can respond to user interaction; otherwise, false. The default is true.\n        /// </returns>\n        public new bool Enabled\n        {\n            get { return base.Enabled; }\n            set\n            {\n                base.Enabled = value;\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// Triggered when the label should be repainted.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.PaintEventArgs\"/> that contains the event data.</param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            //base.OnPaint(e);\n\n            using (StringFormat format = new StringFormat())\n            {\n                if (AutoEllipsis)\n                    format.Trimming = StringTrimming.EllipsisCharacter;\n\n                using (SolidBrush foreground = new SolidBrush(ForeColor))\n                {\n                    e.Graphics.DrawString(Text, Font, foreground, Padding.Left, Padding.Right, format);\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/Controls/ReadingPane.Designer.cs",
    "content": "namespace EVEMon.Controls\n{\n    partial class ReadingPane\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n\t\t\tthis.previewPanePanel = new System.Windows.Forms.Panel();\n\t\t\tthis.wbMailBody = new System.Windows.Forms.WebBrowser();\n\t\t\tthis.flPanelHeader = new System.Windows.Forms.FlowLayoutPanel();\n\t\t\tthis.lblMessageHeader = new System.Windows.Forms.Label();\n\t\t\tthis.lblSender = new System.Windows.Forms.Label();\n\t\t\tthis.lblSendDate = new System.Windows.Forms.Label();\n\t\t\tthis.lblRecipient = new System.Windows.Forms.Label();\n\t\t\tthis.previewPanePanel.SuspendLayout();\n\t\t\tthis.flPanelHeader.SuspendLayout();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// previewPanePanel\n\t\t\t// \n\t\t\tthis.previewPanePanel.BackColor = System.Drawing.SystemColors.Control;\n\t\t\tthis.previewPanePanel.Controls.Add(this.wbMailBody);\n\t\t\tthis.previewPanePanel.Controls.Add(this.flPanelHeader);\n\t\t\tthis.previewPanePanel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.previewPanePanel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.previewPanePanel.Name = \"previewPanePanel\";\n\t\t\tthis.previewPanePanel.Padding = new System.Windows.Forms.Padding(5);\n\t\t\tthis.previewPanePanel.Size = new System.Drawing.Size(267, 160);\n\t\t\tthis.previewPanePanel.TabIndex = 2;\n\t\t\t// \n\t\t\t// wbMailBody\n\t\t\t// \n\t\t\tthis.wbMailBody.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.wbMailBody.IsWebBrowserContextMenuEnabled = false;\n\t\t\tthis.wbMailBody.Location = new System.Drawing.Point(5, 74);\n\t\t\tthis.wbMailBody.MinimumSize = new System.Drawing.Size(20, 20);\n\t\t\tthis.wbMailBody.Name = \"wbMailBody\";\n\t\t\tthis.wbMailBody.ScriptErrorsSuppressed = true;\n\t\t\tthis.wbMailBody.Size = new System.Drawing.Size(257, 81);\n\t\t\tthis.wbMailBody.TabIndex = 2;\n\t\t\tthis.wbMailBody.WebBrowserShortcutsEnabled = false;\n\t\t\tthis.wbMailBody.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(this.wbMailBody_Navigating);\n\t\t\tthis.wbMailBody.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.wbMailBody_PreviewKeyDown);\n\t\t\t// \n\t\t\t// flPanelHeader\n\t\t\t// \n\t\t\tthis.flPanelHeader.BackColor = System.Drawing.SystemColors.Window;\n\t\t\tthis.flPanelHeader.Controls.Add(this.lblMessageHeader);\n\t\t\tthis.flPanelHeader.Controls.Add(this.lblSender);\n\t\t\tthis.flPanelHeader.Controls.Add(this.lblSendDate);\n\t\t\tthis.flPanelHeader.Controls.Add(this.lblRecipient);\n\t\t\tthis.flPanelHeader.Dock = System.Windows.Forms.DockStyle.Top;\n\t\t\tthis.flPanelHeader.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n\t\t\tthis.flPanelHeader.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.flPanelHeader.MinimumSize = new System.Drawing.Size(0, 65);\n\t\t\tthis.flPanelHeader.Name = \"flPanelHeader\";\n\t\t\tthis.flPanelHeader.Size = new System.Drawing.Size(257, 69);\n\t\t\tthis.flPanelHeader.TabIndex = 1;\n\t\t\tthis.flPanelHeader.Paint += new System.Windows.Forms.PaintEventHandler(this.flPanelHeader_Paint);\n\t\t\t// \n\t\t\t// lblMessageHeader\n\t\t\t// \n\t\t\tthis.lblMessageHeader.AutoSize = true;\n\t\t\tthis.lblMessageHeader.Location = new System.Drawing.Point(3, 0);\n\t\t\tthis.lblMessageHeader.Name = \"lblMessageHeader\";\n\t\t\tthis.lblMessageHeader.Padding = new System.Windows.Forms.Padding(0, 3, 0, 3);\n\t\t\tthis.lblMessageHeader.Size = new System.Drawing.Size(88, 19);\n\t\t\tthis.lblMessageHeader.TabIndex = 4;\n\t\t\tthis.lblMessageHeader.Text = \"Message Header\";\n\t\t\t// \n\t\t\t// lblSender\n\t\t\t// \n\t\t\tthis.lblSender.AutoSize = true;\n\t\t\tthis.lblSender.Location = new System.Drawing.Point(3, 19);\n\t\t\tthis.lblSender.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);\n\t\t\tthis.lblSender.Name = \"lblSender\";\n\t\t\tthis.lblSender.Size = new System.Drawing.Size(33, 13);\n\t\t\tthis.lblSender.TabIndex = 1;\n\t\t\tthis.lblSender.Text = \"From:\";\n\t\t\t// \n\t\t\t// lblSendDate\n\t\t\t// \n\t\t\tthis.lblSendDate.AutoSize = true;\n\t\t\tthis.lblSendDate.Location = new System.Drawing.Point(3, 35);\n\t\t\tthis.lblSendDate.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);\n\t\t\tthis.lblSendDate.Name = \"lblSendDate\";\n\t\t\tthis.lblSendDate.Size = new System.Drawing.Size(32, 13);\n\t\t\tthis.lblSendDate.TabIndex = 2;\n\t\t\tthis.lblSendDate.Text = \"Sent:\";\n\t\t\t// \n\t\t\t// lblRecipient\n\t\t\t// \n\t\t\tthis.lblRecipient.AutoSize = true;\n\t\t\tthis.lblRecipient.Location = new System.Drawing.Point(3, 51);\n\t\t\tthis.lblRecipient.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);\n\t\t\tthis.lblRecipient.Name = \"lblRecipient\";\n\t\t\tthis.lblRecipient.Size = new System.Drawing.Size(23, 13);\n\t\t\tthis.lblRecipient.TabIndex = 3;\n\t\t\tthis.lblRecipient.Text = \"To:\";\n\t\t\t// \n\t\t\t// ReadingPane\n\t\t\t// \n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n\t\t\tthis.Controls.Add(this.previewPanePanel);\n\t\t\tthis.Name = \"ReadingPane\";\n\t\t\tthis.Size = new System.Drawing.Size(267, 160);\n\t\t\tthis.previewPanePanel.ResumeLayout(false);\n\t\t\tthis.flPanelHeader.ResumeLayout(false);\n\t\t\tthis.flPanelHeader.PerformLayout();\n\t\t\tthis.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Panel previewPanePanel;\n        private System.Windows.Forms.Label lblMessageHeader;\n        private System.Windows.Forms.Label lblSender;\n        private System.Windows.Forms.Label lblSendDate;\n        private System.Windows.Forms.Label lblRecipient;\n        private System.Windows.Forms.WebBrowser wbMailBody;\n        private System.Windows.Forms.FlowLayoutPanel flPanelHeader;\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/ReadingPane.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Controls\n{\n    public partial class ReadingPane : UserControl\n    {\n        private IEveMessage m_selectedObject;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ReadingPane\"/> class.\n        /// </summary>\n        public ReadingPane()\n        {\n            InitializeComponent();\n\n            lblMessageHeader.Font = FontFactory.GetDefaultFont(10F, FontStyle.Bold);\n            flPanelHeader.ForeColor = SystemColors.ControlText;\n        }\n\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the selected object.\n        /// </summary>\n        /// <value>The selected object.</value>\n        internal IEveMessage SelectedObject\n        {\n            get { return m_selectedObject; }\n            set\n            {\n                m_selectedObject = value;\n                UpdatePane();\n            }\n        }\n\n        #endregion\n\n\n        #region Main Methods\n\n        /// <summary>\n        /// Hides the reading pane.\n        /// </summary>\n        internal void HidePane()\n        {\n            Visible = false;\n        }\n\n        /// <summary>\n        /// Updates the reading pane.\n        /// </summary>\n        internal void UpdatePane()\n        {\n            // Update the text on the header labels\n            lblMessageHeader.Text = m_selectedObject.Title;\n            lblSender.Text = $\"From: {string.Join(\", \", m_selectedObject.SenderName)}\";\n            lblSendDate.Text = $\"Sent: {m_selectedObject.SentDate.ToLocalTime():ddd} {m_selectedObject.SentDate.ToLocalTime():G}\";\n            lblRecipient.Text = $\"To: {string.Join(\", \", m_selectedObject.Recipient)}\";\n\n            // Parce the mail body text to the web browser\n            // so for the text to be formatted accordingly\n            wbMailBody.DocumentText = TidyUpHTML();\n            \n            // We need to wait for the Document to be loaded\n            do\n            {\n                Application.DoEvents();\n            } while (wbMailBody.IsBusy);\n\n            // Show the controls\n            bool visible = ((m_selectedObject as EveMailMessage)?.EVEMailBody?.MessageID ?? 0L) !=\n                0L || ((m_selectedObject as EveNotification)?.EVENotificationText?.\n                NotificationID ?? 0L) != 0L;\n            Visible = visible;\n\n            // WebBrowser errata sometimes causes a COMException to be thrown if this is set\n            // in the designer before the window is visible\n            if (visible)\n                wbMailBody.AllowWebBrowserDrop = false;\n        }\n\n        /// <summary>\n        /// Prepares the text to be shown as common HTML.\n        /// </summary>\n        /// <returns></returns>\n        private string TidyUpHTML()\n        {\n            var replacements = new Dictionary<string, string>();\n\n            FormatLinks(replacements);\n            FormatHTMLColorToRGB(replacements);\n            FixFontSize(replacements);\n\n            return replacements.Aggregate(m_selectedObject.Text, (formatted, replacement) =>\n                formatted.Replace(replacement.Key, replacement.Value));\n        }\n\n        #endregion\n\n\n        #region Formatting Methods\n\n        /// <summary>\n        /// Formats the links.\n        /// </summary>\n        /// <param name=\"replacements\">The replacements.</param>\n        private void FormatLinks(IDictionary<string, string> replacements)\n        {\n            // Regular expression for all HTML links\n            Regex regexLinks = new Regex(@\"<a\\shref=\"\"(.+?)\"\">(.+?)</a>\", RegexOptions.Compiled | RegexOptions.IgnoreCase);\n\n            // Regular expression for clickable/valid URLs\n            Regex regexWebProtocol = new Regex(@\"(?:f|ht)tps?://\", RegexOptions.Compiled | RegexOptions.IgnoreCase);\n\n            foreach (Match match in regexLinks.Matches(m_selectedObject.Text))\n            {\n                string matchValue = match.Groups[1].Value;\n                string matchText = match.Groups[2].Value.TrimEnd(\"<br>\".ToCharArray());\n                string url = string.Empty;\n                bool igbOnly = false;\n\n                if (regexWebProtocol.IsMatch(matchValue))\n                    url = matchValue;\n                else\n                    igbOnly = true;\n\n                if (!igbOnly)\n                {\n                    replacements[match.ToString()] =\n                        $\"<a href=\\\"{url}\\\" title=\\\"{url}{Environment.NewLine}Click to follow the link\\\">{matchText}</a>\";\n                }\n                else\n                {\n                    replacements[match.ToString()] =\n                        $\"<span style=\\\"text-decoration: underline; cursor: pointer;\\\" title=\\\"{matchValue}{Environment.NewLine}\" +\n                        $\"Link works only in IGB\\\">{matchText}</span>\";\n                }\n            }\n        }\n\n        /// <summary>\n        /// Formats the color to RGB.\n        /// </summary>\n        /// <param name=\"replacements\">The replacements.</param>\n        private void FormatHTMLColorToRGB(IDictionary<string, string> replacements)\n        {\n            Color backColor = flPanelHeader.BackColor;\n\n            // Regular expression for fixing text color\n            Regex regexColor = new Regex(@\"color(?:=\"\"|:\\s*)#[0-9a-f]{2}([0-9a-f]{6})(?:;|\"\")\", RegexOptions.Compiled | RegexOptions.IgnoreCase);\n            foreach (Match match in regexColor.Matches(m_selectedObject.Text))\n            {\n                replacements[match.ToString()] = $\"color=\\\"#{CheckTextColorNotMatchBackColor(backColor, match)}\\\"\";\n            }\n        }\n\n        /// <summary>\n        /// Checks the text color does not match the background color.\n        /// </summary>\n        /// <param name=\"backColor\">The controls' background back.</param>\n        /// <param name=\"match\">The text color.</param>\n        /// <returns>The text color as it was or a black colored text</returns>\n        private static string CheckTextColorNotMatchBackColor(Color backColor, Match match)\n        {\n            string color = match.Groups[1].Value;\n            Color textColor = ColorTranslator.FromHtml($\"#{color}\");\n            bool textColorIsShadeOfWhite = textColor.R == textColor.G && textColor.G == textColor.B;\n            bool backColorIsShadeOfWhite = backColor.R == backColor.G && backColor.G == backColor.B;\n            if (!textColorIsShadeOfWhite || !backColorIsShadeOfWhite)\n                return color;\n\n            const int ContrastDiff = 64;\n            int colorValue = textColor.R <= backColor.R - ContrastDiff ? textColor.R : 0;\n            string colorElement = Convert.ToString(colorValue, 16);\n            colorElement = colorElement.Length == 1 ? $\"0{colorElement}\" : colorElement;\n            return $\"{colorElement}{colorElement}{colorElement}\";\n        }\n\n        /// <summary>\n        /// Fixes the size of the font.\n        /// </summary>\n        /// <param name=\"replacements\">The replacements.</param>\n        private void FixFontSize(IDictionary<string, string> replacements)\n        {\n            Regex regexFontSize = new Regex(@\"size(?:=\"\"|:\\s*)([0-9]+)(?:;|\"\")\", RegexOptions.Compiled | RegexOptions.IgnoreCase);\n            foreach (Match match in regexFontSize.Matches(m_selectedObject.Text))\n            {\n                int newFontSize = Convert.ToByte(match.Groups[1].Value, CultureConstants.InvariantCulture) / 4;\n                replacements[match.ToString()] = $\"size=\\\"{newFontSize}\\\"\";\n            }\n        }\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// Every time the mail header panel gets painted we add a line at the bottom.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void flPanelHeader_Paint(object sender, PaintEventArgs e)\n        {\n            // Calculate the height of the panel\n            flPanelHeader.Height = lblMessageHeader.Height + lblSender.Height + lblSendDate.Height + lblRecipient.Height + 10;\n\n            // Draw a line at the bottom of the panel\n            using (Graphics g = flPanelHeader.CreateGraphics())\n            {\n                using (Pen blackPen = new Pen(Color.Black))\n                {\n                    g.DrawLine(blackPen, 5, flPanelHeader.Height - 1, flPanelHeader.Width - 5, flPanelHeader.Height - 1);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Handles the Navigating event of the wbMailBody control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.WebBrowserNavigatingEventArgs\"/> instance containing the event data.</param>\n        private void wbMailBody_Navigating(object sender, WebBrowserNavigatingEventArgs e)\n        {\n            // We assure that the internal browser will initialize and\n            // any other attempt to navigate to a non valid link will fail\n            if (e.Url.AbsoluteUri == \"about:blank\" && wbMailBody.DocumentText != m_selectedObject.Text)\n                return;\n\n            // If the link complies with HTTP or HTTPS, open the link on the system's default browser\n            if (e.Url.Scheme == Uri.UriSchemeHttp || e.Url.Scheme == Uri.UriSchemeHttps)\n                Util.OpenURL(e.Url);\n\n            // Prevents the browser to navigate past the shown page\n            e.Cancel = true;\n        }\n\n        /// <summary>\n        /// Handles the PreviewKeyDown event of the wbMailBody control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PreviewKeyDownEventArgs\"/> instance containing the event data.</param>\n        private void wbMailBody_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)\n        {\n            // Disables the reload shortcut key\n            wbMailBody.WebBrowserShortcutsEnabled = e.KeyData != Keys.F5;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Controls/ReadingPane.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/DetailsWindow/ContractDetailsWindow.Designer.cs",
    "content": "﻿using EVEMon.Common.Enumerations;\n\nnamespace EVEMon.DetailsWindow\n{\n    sealed partial class ContractDetailsWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ContractDetailsWindow));\n            this.ButtonPanel = new System.Windows.Forms.Panel();\n            this.BidsButton = new System.Windows.Forms.Button();\n            this.DetailsPanel = new EVEMon.Common.Controls.NoFlickerPanel();\n            this.ImageList = new System.Windows.Forms.ImageList(this.components);\n            this.ImageListIcons = new System.Windows.Forms.ImageList(this.components);\n            this.RoutePanel = new System.Windows.Forms.Panel();\n            this.ItemImage = new EVEMon.Common.Controls.EveImage();\n            this.CurrentToStartLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.CurrentToEndLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.StartToEndLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.RoutePanelParent = new System.Windows.Forms.Panel();\n            this.ButtonPanel.SuspendLayout();\n            this.RoutePanelParent.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // ButtonPanel\n            // \n            this.ButtonPanel.BackColor = System.Drawing.Color.Transparent;\n            this.ButtonPanel.Controls.Add(this.BidsButton);\n            this.ButtonPanel.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.ButtonPanel.Location = new System.Drawing.Point(0, 398);\n            this.ButtonPanel.Name = \"ButtonPanel\";\n            this.ButtonPanel.Size = new System.Drawing.Size(464, 29);\n            this.ButtonPanel.TabIndex = 5;\n            this.ButtonPanel.Visible = false;\n            // \n            // BidsButton\n            // \n            this.BidsButton.Location = new System.Drawing.Point(185, 3);\n            this.BidsButton.Name = \"BidsButton\";\n            this.BidsButton.Size = new System.Drawing.Size(95, 23);\n            this.BidsButton.TabIndex = 1;\n            this.BidsButton.Text = \"Show Bids\";\n            this.BidsButton.UseVisualStyleBackColor = true;\n            this.BidsButton.Click += new System.EventHandler(this.BidsButton_Click);\n            // \n            // DetailsPanel\n            // \n            this.DetailsPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.DetailsPanel.Location = new System.Drawing.Point(0, 0);\n            this.DetailsPanel.Name = \"DetailsPanel\";\n            this.DetailsPanel.Size = new System.Drawing.Size(464, 398);\n            this.DetailsPanel.TabIndex = 6;\n            this.DetailsPanel.Click += new System.EventHandler(this.DetailsPanel_Click);\n            this.DetailsPanel.Paint += new System.Windows.Forms.PaintEventHandler(this.DetailsPanel_Paint);\n            // \n            // ImageList\n            // \n            this.ImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ImageList.ImageStream\")));\n            this.ImageList.TransparentColor = System.Drawing.Color.Transparent;\n            this.ImageList.Images.SetKeyName(0, \"itemExchange.png\");\n            this.ImageList.Images.SetKeyName(1, \"courier.png\");\n            this.ImageList.Images.SetKeyName(2, \"auction.png\");\n            // \n            // ImageListIcons\n            // \n            this.ImageListIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ImageListIcons.ImageStream\")));\n            this.ImageListIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ImageListIcons.Images.SetKeyName(0, \"arrow_up.png\");\n            this.ImageListIcons.Images.SetKeyName(1, \"arrow_down.png\");\n            this.ImageListIcons.Images.SetKeyName(2, \"16x16Transparant.png\");\n            // \n            // RoutePanel\n            // \n            this.RoutePanel.Location = new System.Drawing.Point(0, 0);\n            this.RoutePanel.Margin = new System.Windows.Forms.Padding(0);\n            this.RoutePanel.Name = \"RoutePanel\";\n            this.RoutePanel.Size = new System.Drawing.Size(10, 10);\n            this.RoutePanel.TabIndex = 7;\n            this.RoutePanel.Paint += new System.Windows.Forms.PaintEventHandler(this.RoutePanel_Paint);\n            // \n            // ItemImage\n            // \n            this.ItemImage.ImageSize = EVEMon.Common.Enumerations.EveImageSize.x64;\n            this.ItemImage.Location = new System.Drawing.Point(0, 0);\n            this.ItemImage.Name = \"ItemImage\";\n            this.ItemImage.PopUpEnabled = true;\n            this.ItemImage.Size = new System.Drawing.Size(64, 64);\n            this.ItemImage.SizeMode = EVEMon.Common.Enumerations.EveImageSizeMode.Normal;\n            this.ItemImage.TabIndex = 8;\n            this.ItemImage.Visible = false;\n            this.ItemImage.MouseClick += new System.Windows.Forms.MouseEventHandler(this.ItemImage_MouseClick);\n            // \n            // CurrentToStartLinkLabel\n            // \n            this.CurrentToStartLinkLabel.AutoSize = true;\n            this.CurrentToStartLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 10);\n            this.CurrentToStartLinkLabel.Location = new System.Drawing.Point(0, 0);\n            this.CurrentToStartLinkLabel.Name = \"CurrentToStartLinkLabel\";\n            this.CurrentToStartLinkLabel.Size = new System.Drawing.Size(59, 17);\n            this.CurrentToStartLinkLabel.TabIndex = 9;\n            this.CurrentToStartLinkLabel.TabStop = true;\n            this.CurrentToStartLinkLabel.Text = \"show route\";\n            this.CurrentToStartLinkLabel.UseCompatibleTextRendering = true;\n            this.CurrentToStartLinkLabel.Visible = false;\n            this.CurrentToStartLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.CurrentToStartLinkLabel_LinkClicked);\n            // \n            // CurrentToEndLinkLabel\n            // \n            this.CurrentToEndLinkLabel.AutoSize = true;\n            this.CurrentToEndLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 10);\n            this.CurrentToEndLinkLabel.Location = new System.Drawing.Point(0, 0);\n            this.CurrentToEndLinkLabel.Name = \"CurrentToEndLinkLabel\";\n            this.CurrentToEndLinkLabel.Size = new System.Drawing.Size(59, 17);\n            this.CurrentToEndLinkLabel.TabIndex = 10;\n            this.CurrentToEndLinkLabel.TabStop = true;\n            this.CurrentToEndLinkLabel.Text = \"show route\";\n            this.CurrentToEndLinkLabel.UseCompatibleTextRendering = true;\n            this.CurrentToEndLinkLabel.Visible = false;\n            this.CurrentToEndLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.CurrentToEndLinkLabel_LinkClicked);\n            // \n            // StartToEndLinkLabel\n            // \n            this.StartToEndLinkLabel.AutoSize = true;\n            this.StartToEndLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(0, 10);\n            this.StartToEndLinkLabel.Location = new System.Drawing.Point(0, 0);\n            this.StartToEndLinkLabel.Name = \"StartToEndLinkLabel\";\n            this.StartToEndLinkLabel.Size = new System.Drawing.Size(59, 17);\n            this.StartToEndLinkLabel.TabIndex = 11;\n            this.StartToEndLinkLabel.TabStop = true;\n            this.StartToEndLinkLabel.Text = \"show route\";\n            this.StartToEndLinkLabel.UseCompatibleTextRendering = true;\n            this.StartToEndLinkLabel.Visible = false;\n            this.StartToEndLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.StartToEndLinkLabel_LinkClicked);\n            // \n            // RoutePanelParent\n            // \n            this.RoutePanelParent.AutoScroll = true;\n            this.RoutePanelParent.Controls.Add(this.RoutePanel);\n            this.RoutePanelParent.Dock = System.Windows.Forms.DockStyle.Right;\n            this.RoutePanelParent.Location = new System.Drawing.Point(464, 0);\n            this.RoutePanelParent.Name = \"RoutePanelParent\";\n            this.RoutePanelParent.Size = new System.Drawing.Size(0, 427);\n            this.RoutePanelParent.TabIndex = 0;\n            this.RoutePanelParent.Visible = false;\n            // \n            // ContractDetailsWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(464, 427);\n            this.Controls.Add(this.DetailsPanel);\n            this.Controls.Add(this.ButtonPanel);\n            this.Controls.Add(this.CurrentToStartLinkLabel);\n            this.Controls.Add(this.CurrentToEndLinkLabel);\n            this.Controls.Add(this.StartToEndLinkLabel);\n            this.Controls.Add(this.ItemImage);\n            this.Controls.Add(this.RoutePanelParent);\n            this.MaximizeBox = false;\n            this.MaximumSize = new System.Drawing.Size(480, 1280);\n            this.MinimumSize = new System.Drawing.Size(480, 465);\n            this.Name = \"ContractDetailsWindow\";\n            this.Text = \"Contract Details\";\n            this.ButtonPanel.ResumeLayout(false);\n            this.RoutePanelParent.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Panel ButtonPanel;\n        private System.Windows.Forms.Button BidsButton;\n        private Common.Controls.NoFlickerPanel DetailsPanel;\n        private System.Windows.Forms.ImageList ImageList;\n        private System.Windows.Forms.ImageList ImageListIcons;\n        private System.Windows.Forms.Panel RoutePanel;\n        private Common.Controls.EveImage ItemImage;\n        private System.Windows.Forms.LinkLabel CurrentToStartLinkLabel;\n        private System.Windows.Forms.LinkLabel CurrentToEndLinkLabel;\n        private System.Windows.Forms.LinkLabel StartToEndLinkLabel;\n        private System.Windows.Forms.Panel RoutePanelParent;\n    }\n}"
  },
  {
    "path": "src/EVEMon/DetailsWindow/ContractDetailsWindow.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.SkillPlanner;\nusing Region = EVEMon.Common.Data.Region;\n\nnamespace EVEMon.DetailsWindow\n{\n    public sealed partial class ContractDetailsWindow : EVEMonForm\n    {\n        #region Fields\n\n        private readonly Contract m_contract;\n        private readonly Size m_startingSize;\n        private readonly SolarSystem m_characterLastSolarSystem;\n        private readonly IEnumerable<ContractItem> m_contractItems;\n\n        private ContractItemsListView m_lvIncludedItems;\n        private ContractItemsListView m_lvNotIncludedItems;\n        private IEnumerable<SolarSystem> m_characterLastLocationToStartRoute;\n        private IEnumerable<SolarSystem> m_characterLastLocationToEndRoute;\n        private IEnumerable<SolarSystem> m_startToEndRoute;\n        private IEnumerable<SolarSystem> m_oldRoute;\n        private IEnumerable<SolarSystem> m_route;\n        private Font m_boldFont;\n        private Font m_mediumBoldFont;\n        private Font m_bigBoldFont;\n        private bool m_buttonSwitch;\n        private int m_height;\n\n        private const int Pad = 3;\n        private const int FirstIntendPosition = 9;\n        private const int SecondIndentPosition = 110;\n        private const int ListViewHeight = 120;\n\n        #endregion\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Private Constructor.\n        /// </summary>\n        private ContractDetailsWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"contract\">The contract.</param>\n        /// <exception cref=\"System.ArgumentNullException\">contract</exception>\n        public ContractDetailsWindow(Contract contract)\n            : this()\n        {\n            contract.ThrowIfNull(nameof(contract));\n\n            RememberPositionKey = \"ContractDetailsWindow\";\n            m_startingSize = new Size(Width, Height);\n            m_contract = contract;\n            m_contractItems = contract.ContractItems;\n            m_characterLastSolarSystem = m_contract.Character.LastKnownSolarSystem;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load, completes controls initialization.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            RoutePanelParent.Width = 160;\n            RoutePanelParent.BorderStyle = BorderStyle.FixedSingle;\n            Size = m_startingSize;\n\n            ButtonPanel.Visible = m_contract.ContractType == ContractType.Auction &&\n                m_contract.ContractBids.Any();\n\n            m_boldFont = FontFactory.GetDefaultFont(FontStyle.Bold);\n            m_mediumBoldFont = FontFactory.GetDefaultFont(9.25f, FontStyle.Bold);\n            m_bigBoldFont = FontFactory.GetDefaultFont(10.25f, FontStyle.Bold);\n\n            // Initialize a control for the contract's outgoing items\n            if (m_contractItems.Any(x => x.Included) && m_contractItems.Count(x => x.Included) > 1)\n            {\n                m_lvIncludedItems = new ContractItemsListView(m_contract.Character, m_contractItems.Where(x => x.Included))\n                {\n                    SmallImageList = ImageListIcons\n                };\n                Controls.Add(m_lvIncludedItems);\n            }\n\n            // Initialize a control for the contract's incoming items\n            if (m_contractItems.Any(x => !x.Included))\n            {\n                m_lvNotIncludedItems = new ContractItemsListView(m_contract.Character, m_contractItems.Where(x => !x.Included))\n                {\n                    SmallImageList = ImageListIcons\n                };\n                Controls.Add(m_lvNotIncludedItems);\n            }\n\n            // Form has fixed size if it doesn't contain any list\n            if (!Controls.OfType<ContractItemsListView>().Any())\n                FormBorderStyle = FormBorderStyle.FixedDialog;\n\n            // Adjust the control's height to our needs\n            if (!m_contract.IsTrading)\n                return;\n\n            Height += ListViewHeight;\n            MinimumSize = new Size(Width, Height);\n        }\n\n\n        #endregion\n\n\n        #region Private Properties\n\n        /// <summary>\n        /// Gets the availability info.\n        /// </summary>\n        /// <value>The availability info.</value>\n        private string AvailabilityInfo\n        {\n            get\n            {\n                Region startStationRegion = m_contract.StartStation.SolarSystemChecked.\n                    Constellation.Region;\n                Region characterLastKnownRegion = m_characterLastSolarSystem != null ?\n                    m_characterLastSolarSystem.Constellation.Region : null;\n                string destinationRegionText = (characterLastKnownRegion != null) ?\n                    ((characterLastKnownRegion == startStationRegion) ? \"(Current Region)\" :\n                    \"(Other Region)\") : string.Empty;\n                string secondHalfText = m_contract.Availability == ContractAvailability.Private ?\n                    m_contract.Assignee : $\"Region: {startStationRegion.Name}  {destinationRegionText}\";\n                return $\"{m_contract.Availability.GetDescription()} - {secondHalfText}\";\n            }\n        }\n\n        /// <summary>\n        /// Gets the start to end route.\n        /// </summary>\n        /// <value>The start to end route.</value>\n        private IEnumerable<SolarSystem> GetStartToEndRoute => m_startToEndRoute ??\n            (m_startToEndRoute = m_contract.StartStation.SolarSystemChecked.GetFastestPathTo(\n            m_contract.EndStation.SolarSystemChecked, PathSearchCriteria.FewerJumps));\n\n        /// <summary>\n        /// Gets the character last location to start route.\n        /// </summary>\n        /// <value>The character last location to start route.</value>\n        private IEnumerable<SolarSystem> GetCharacterLastLocationToStartRoute =>\n            m_characterLastLocationToStartRoute ?? (m_characterLastLocationToStartRoute =\n            m_characterLastSolarSystem.GetFastestPathTo(m_contract.StartStation.\n            SolarSystemChecked, PathSearchCriteria.FewerJumps));\n\n        /// <summary>\n        /// Gets the character last location to end route.\n        /// </summary>\n        /// <value>The character last location to end route.</value>\n        private IEnumerable<SolarSystem> GetCharacterLastLocationToEndRoute =>\n            m_characterLastLocationToEndRoute ?? (m_characterLastLocationToEndRoute =\n            m_characterLastSolarSystem.GetFastestPathTo(m_contract.EndStation.\n            SolarSystemChecked, PathSearchCriteria.FewerJumps));\n\n        #endregion\n\n\n        #region Details Drawing Methods\n\n        /// <summary>\n        /// Handles the Paint event of the DetailsPanel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void DetailsPanel_Paint(object sender, PaintEventArgs e)\n        {\n            // Draw the header section\n            DrawHeader(e);\n\n            // Draw the generic info section\n            DrawGenericInfo(e);\n\n            // Draw the courier info section\n            if (m_contract.ContractType == ContractType.Courier)\n            {\n                DrawCourierInfo(e);\n                return;\n            }\n\n            // Draw the auction info section\n            DrawAuctionInfo(e);\n\n            // Draw the item exchange info section\n            DrawPriceInfo(e);\n\n            // Draw the contract's items info section\n            DrawItemsInfo(e);\n        }\n\n        /// <summary>\n        /// Draws the items info.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void DrawItemsInfo(PaintEventArgs e)\n        {\n            m_height += Pad;\n\n            string exclamation = m_contract.IssuerID == m_contract.Character.CharacterID ? \"Buyer\" : \"You\";\n\n            if (m_contractItems.Any(x => x.Included))\n            {\n                // Draw the header text\n                DrawColoredText(e, $\"{exclamation} Will Get\", m_mediumBoldFont,\n                    new Point(FirstIntendPosition, m_height), Color.Green);\n\n                if (m_contractItems.Count(x => x.Included) > 1)\n                    DisplayListView(m_lvIncludedItems);\n                else\n                {\n                    ContractItem contractItem = m_contractItems.First();\n\n                    // Display the item's image\n                    m_height += Pad * 2;\n                    int left = DetailsPanel.Left + FirstIntendPosition + Pad * 2;\n                    ItemImage.EveItem = contractItem.Item;\n                    ItemImage.Location = new Point(left, m_height);\n                    ItemImage.BringToFront();\n                    ItemImage.Visible = true;\n\n                    // Draw the item's name and quantity\n                    m_height += Pad * 2;\n                    string itemText = $\"{contractItem.Item.Name} x {contractItem.Quantity:N0}\";\n                    Size itemTextSize = e.Graphics.MeasureString(itemText, m_bigBoldFont).ToSize();\n                    int itemTextHeight = itemTextSize.Width < DetailsPanel.Width - SecondIndentPosition\n                        ? itemTextSize.Height\n                        : itemTextSize.Height * 2;\n                    e.Graphics.DrawString(itemText, m_bigBoldFont, Brushes.Black,\n                        new Rectangle(left + ItemImage.Width + Pad * 2, m_height,\n                            DetailsPanel.Width - SecondIndentPosition, itemTextHeight));\n\n                    m_height += itemTextHeight;\n                    int position = left + ItemImage.Width + Pad * 2 - DetailsPanel.Left - SecondIndentPosition;\n\n                    // Draw the item's category and group\n                    if (!string.IsNullOrEmpty(contractItem.Item.CategoryName) &&\n                        !string.IsNullOrEmpty(contractItem.Item.GroupName))\n                    {\n                        string itemCategoryGroup = $\"{contractItem.Item.CategoryName}  /  {contractItem.Item.GroupName}\";\n                        DrawText(e, string.Empty, itemCategoryGroup, m_mediumBoldFont, true, position);\n                    }\n\n                    // Draw additional type info when item is a blueprint\n                    if (contractItem.RawQuantity < 0 &&\n                        contractItem.Item.MarketGroup.BelongsIn(DBConstants.BlueprintsMarketGroupID))\n                    {\n                        string itemTypeText = $\"BLUEPRINT {(contractItem.RawQuantity == -2 ? \"COPY\" : \"ORIGINAL\")}\";\n                        DrawText(e, string.Empty, itemTypeText, m_boldFont, true, position);\n                    }\n\n                    m_height += ItemImage.Height / 2;\n                }\n            }\n\n            if (m_contractItems.All(x => x.Included))\n                return;\n\n            // Draw the header text\n            DrawColoredText(e, $\"{exclamation} Will Give\", m_mediumBoldFont,\n                new Point(FirstIntendPosition, m_height), Color.Red);\n\n            // Display the item's in a list view\n            DisplayListView(m_lvNotIncludedItems);\n        }\n\n        /// <summary>\n        /// Displays the list view.\n        /// </summary>\n        /// <param name=\"listView\">The list view.</param>\n        private void DisplayListView(Control listView)\n        {\n            m_height += Pad;\n            listView.Location = new Point(FirstIntendPosition, m_height);\n            listView.BringToFront();\n            listView.Visible = true;\n\n            int listViewHeight = m_contract.IsTrading && listView == m_lvIncludedItems\n                ? (DetailsPanel.Height - m_height - Pad * 2) / 2\n                : DetailsPanel.Height - m_height - Pad * 2;\n            listView.Size = new Size(DetailsPanel.Width - FirstIntendPosition * 2, listViewHeight);\n\n            m_height += listView.Height + Pad;\n        }\n\n        /// <summary>\n        /// Draws the price info.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void DrawPriceInfo(PaintEventArgs e)\n        {\n            if (m_contract.ContractType != ContractType.ItemExchange || (m_contract.Price == 0 && m_contract.Reward == 0))\n                return;\n\n            m_height += Pad;\n\n            string labelText = $\"{(m_contract.IssuerID == m_contract.Character.CharacterID ? \"Buyer\" : \"You\")} \" +\n                               $\"Will {(m_contract.Price > 0 ? \"Pay\" : \"Get\")}\";\n\n            if (m_contract.Price > 0)\n            {\n                string priceText = string.Format(CultureConstants.DefaultCulture, GetNumberFormat(m_contract.Price),\n                    m_contract.Price,\n                    m_contract.Price < 10000M\n                        ? string.Empty\n                        : $\" ({FormatHelper.Format(m_contract.Price, AbbreviationFormat.AbbreviationWords, false)})\");\n                DrawText(e, labelText, string.Empty, m_mediumBoldFont, false);\n                DrawColoredText(e, priceText, m_mediumBoldFont, new Point(SecondIndentPosition, m_height), Color.Red);\n            }\n            else\n            {\n                string rewardText = string.Format(CultureConstants.DefaultCulture, GetNumberFormat(m_contract.Reward),\n                    m_contract.Reward,\n                    m_contract.Reward < 10000M\n                        ? string.Empty\n                        : $\" ({FormatHelper.Format(m_contract.Reward, AbbreviationFormat.AbbreviationWords, false)})\");\n                DrawText(e, labelText, string.Empty, m_mediumBoldFont, false);\n                DrawColoredText(e, rewardText, m_mediumBoldFont, new Point(SecondIndentPosition, m_height), Color.Green);\n            }\n\n            // Draw the lower line\n            DrawLine(e);\n        }\n\n        /// <summary>\n        /// Draws the auction info.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void DrawAuctionInfo(PaintEventArgs e)\n        {\n            if (m_contract.ContractType != ContractType.Auction)\n                return;\n\n            m_height += Pad;\n\n            string text = string.Format(CultureConstants.DefaultCulture, GetNumberFormat(m_contract.Price),\n                m_contract.Price, m_contract.Price < 10000M ? string.Empty :\n                $\" ({FormatHelper.Format(m_contract.Price, AbbreviationFormat.AbbreviationWords, false)})\");\n            DrawText(e, \"Starting Bid\", text, Font);\n\n            text = m_contract.Buyout == 0 ? \"(None)\" : string.Format(CultureConstants.DefaultCulture, GetNumberFormat(m_contract.Buyout),\n                m_contract.Buyout, m_contract.Price < 10000M ? string.Empty\n                : $\" ({FormatHelper.Format(m_contract.Buyout, AbbreviationFormat.AbbreviationWords, false)})\");\n            DrawText(e, \"Buyout Price\", text, Font);\n\n            decimal amount = m_contract.ContractBids.Select(bid => bid.Amount).Concat(new[] { 0M }).Max();\n            int numberOfBids = m_contract.ContractBids.Count();\n            text = numberOfBids == 0 ? \"No Bids\" :\n                string.Format(CultureConstants.DefaultCulture, GetNumberFormat(amount), amount, string.Empty) +\n                $\" ({numberOfBids} bid{(numberOfBids.S())} so far)\";\n\n            DrawText(e, \"Current Bid\", text, Font);\n\n            text = m_contract.IsAvailable ? m_contract.Expiration.\n                ToRemainingTimeShortDescription(DateTimeKind.Utc) : m_contract.State.ToString();\n\n            Color color = (m_contract.IsAvailable && m_contract.Expiration < DateTime.UtcNow.AddDays(1)) ?\n                Color.DarkOrange : (m_contract.State == ContractState.Expired ? Color.Red : ForeColor);\n\n            DrawText(e, \"Time Left\", string.Empty, Font, false);\n            DrawColoredText(e, text, Font, new Point(SecondIndentPosition, m_height), color);\n\n            // Draw the lower line\n            DrawLine(e);\n        }\n\n        /// <summary>\n        /// Draws the courier info.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void DrawCourierInfo(PaintEventArgs e)\n        {\n            m_height += Pad;\n\n            if (m_contract.Accepted == DateTime.MinValue)\n            {\n                DrawText(e, \"Complete In\", $\"{m_contract.DaysToComplete} Day{(m_contract.DaysToComplete.S())}\", Font);\n            }\n            else\n            {\n                DateTime timeToComplete = m_contract.Accepted.AddDays(m_contract.DaysToComplete);\n                string timeToCompleteText = timeToComplete.Subtract(DateTime.UtcNow).\n                    ToDescriptiveText(DescriptiveTextOptions.SpaceText |\n                    DescriptiveTextOptions.FullText | DescriptiveTextOptions.SpaceBetween,\n                    includeSeconds: false);\n                string timeToCompleteFormattedDateTimeText = timeToComplete.ToLocalTime().DateTimeToDotFormattedString();\n\n                DrawText(e, \"Time Left\", $\"{timeToCompleteText} ({timeToCompleteFormattedDateTimeText})\", Font);\n            }\n\n            DrawText(e, \"Volume\", $\"{m_contract.Volume:N1} m³\", Font);\n\n            string text = string.Format(CultureConstants.DefaultCulture, GetNumberFormat(m_contract.Reward), m_contract.Reward,\n                m_contract.Reward < 10000M ? string.Empty :\n                $\"({FormatHelper.Format(m_contract.Reward, AbbreviationFormat.AbbreviationWords, false)})\");\n\n            // null SolarSystem is OK here, count will be zero as expected\n            int startToEndSystemJumps = GetStartToEndRoute.Count(system => system !=\n                m_contract.StartStation.SolarSystem);\n            decimal iskPerJump = startToEndSystemJumps > 0 ? (m_contract.Reward /\n                startToEndSystemJumps) : 0;\n            string iskPerJumpText = iskPerJump > 0 ?\n                $\"({string.Format(CultureConstants.DefaultCulture, GetNumberFormat(iskPerJump), iskPerJump, string.Empty)} /  Jump)\" :\n                string.Empty;\n\n            DrawText(e, \"Reward\", string.Empty, Font, false);\n            DrawText(e, string.Empty, iskPerJumpText, Font, false, e.Graphics.MeasureString(text, Font).ToSize().Width);\n            DrawColoredText(e, text, Font, new Point(SecondIndentPosition, m_height), Color.Green);\n\n            text = string.Format(CultureConstants.DefaultCulture, GetNumberFormat(m_contract.Collateral), m_contract.Collateral,\n                m_contract.Collateral < 10000M ? string.Empty :\n                $\" ({FormatHelper.Format(m_contract.Collateral, AbbreviationFormat.AbbreviationWords, false)})\");\n\n            DrawText(e, \"Collateral\", string.Empty, Font, false);\n            DrawColoredText(e, text, Font, new Point(SecondIndentPosition, m_height), Color.Red);\n\n            DrawStationText(e, \"Destination\", m_contract.EndStation);\n        }\n\n        /// <summary>\n        /// Draws the generic contract info.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void DrawGenericInfo(PaintEventArgs e)\n        {\n            m_height += Pad;\n\n            DrawText(e, \"Info by Issuer\", m_contract.Description, Font);\n            DrawText(e, \"Type\", m_contract.ContractType.GetDescription(), Font);\n            DrawText(e, \"Issued by\", m_contract.Issuer, Font);\n            DrawText(e, \"Availability\", AvailabilityInfo, Font);\n            if (m_contract.AcceptorID != 0)\n                DrawText(e, \"Contractor\", m_contract.Acceptor, Font);\n            DrawText(e, \"Status\", m_contract.Status.GetDescription(), Font);\n            DrawStationText(e, \"Location\", m_contract.StartStation);\n            DrawText(e, \"Issued Date\",\n                m_contract.Issued.ToLocalTime().DateTimeToDotFormattedString(), Font);\n\n            DrawExpirationOrCompletionText(e);\n\n            // Draw the lower line\n            DrawLine(e);\n        }\n\n        /// <summary>\n        /// Draws the expiration or completion text.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void DrawExpirationOrCompletionText(PaintEventArgs e)\n        {\n            // Don't display \"expiration date\" for auction contracts\n            if (m_contract.ContractType == ContractType.Auction)\n                return;\n\n            DrawExpirationText(e);\n\n            if (m_contract.ContractType == ContractType.Courier && m_contract.Accepted != DateTime.MinValue)\n            {\n                DrawText(e, \"Complete Before\",\n                    m_contract.Accepted.AddDays(m_contract.DaysToComplete)\n                        .ToLocalTime().DateTimeToDotFormattedString(), Font);\n            }\n\n            if (m_contract.Status != CCPContractStatus.Outstanding && m_contract.Completed != DateTime.MinValue)\n            {\n                DrawText(e, \"Completed Date\",\n                    m_contract.Completed.ToLocalTime().DateTimeToDotFormattedString(), Font);\n            }\n        }\n\n        /// <summary>\n        /// Draws the expiration text.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void DrawExpirationText(PaintEventArgs e)\n        {\n            if (m_contract.Status != CCPContractStatus.Outstanding)\n                return;\n\n            string expirationTimeText = m_contract.Expiration.ToLocalTime().DateTimeToDotFormattedString();\n            string expirationRemainingTimeText = m_contract.IsAvailable\n                ? m_contract.Expiration.ToRemainingTimeShortDescription(DateTimeKind.Utc)\n                : m_contract.State.ToString();\n\n            Size expirationTimeTextSize = e.Graphics.MeasureString(expirationTimeText, Font).ToSize();\n            Size expirationRemainingTimeTextSize = e.Graphics.MeasureString(expirationRemainingTimeText, Font).ToSize();\n            Color color = m_contract.IsAvailable && m_contract.Expiration < DateTime.UtcNow.AddDays(1)\n                ? Color.DarkOrange\n                : m_contract.State == ContractState.Expired\n                    ? Color.Red\n                    : ForeColor;\n\n            int position = expirationTimeTextSize.Width;\n            DrawText(e, \"Expiration Date\", expirationTimeText, Font, false);\n            DrawText(e, string.Empty, \"(\", Font, false, position);\n            position += Pad * 2;\n            Point point = new Point(SecondIndentPosition + position, m_height);\n            DrawColoredText(e, expirationRemainingTimeText, Font, point, color, false);\n            position += expirationRemainingTimeTextSize.Width;\n            DrawText(e, string.Empty, \")\", Font, true, position);\n        }\n\n        /// <summary>\n        /// Draws the station text.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        /// <param name=\"labelText\">The label text.</param>\n        /// <param name=\"station\">The station.</param>\n        private void DrawStationText(PaintEventArgs e, string labelText, Station station)\n        {\n            Graphics g = e.Graphics;\n            SolarSystem system = null;\n            g.SmoothingMode = SmoothingMode.AntiAlias;\n\n            string secLevelText = string.Empty;\n            if (station != null)\n            {\n                // If we fetch from an inaccessible citadel not on hammertime, station can\n                // be null\n                system = station.SolarSystemChecked;\n                secLevelText = system.SecurityLevel.ToString(\"N1\");\n            }\n\n            // Calculate the amount of whitespaces needed after which the station name must be drawn\n            // in order to not overlap the security level text\n            // (I know it looks weird but couldn't thing of another way)\n            int secLevelTextWidth = g.MeasureString(secLevelText, Font).ToSize().Width;\n            int spaceWidth = g.MeasureString(\" \", Font).ToSize().Width;\n            int tempSpaceWidth = 0;\n            int spaceCount = 0;\n\n            do\n            {\n                tempSpaceWidth += spaceWidth;\n                spaceCount++;\n            } while (secLevelTextWidth > tempSpaceWidth);\n\n            StringBuilder sb = new StringBuilder();\n            for (int i = 0; i < spaceCount; i++)\n            {\n                sb.Append(\" \");\n            }\n            sb.Append(station?.Name ?? EveMonConstants.UnknownText);\n            string stationText = sb.ToString();\n\n            //Draw the label text\n            g.DrawString(labelText, Font, Brushes.DimGray, new Point(DetailsPanel.Left + FirstIntendPosition, m_height));\n\n            // Draw the sec level of the solar system, colored accordingly\n            if (secLevelText != null)\n                DrawColoredText(e, secLevelText, Font, new Point(DetailsPanel.Left +\n                    SecondIndentPosition, m_height), system.SecurityLevelColor, false);\n\n            // Draw the station name\n            Size stationTextSize = g.MeasureString(stationText, Font).ToSize();\n            int stationTextHeight = stationTextSize.Width < DetailsPanel.Width - SecondIndentPosition ?\n                stationTextSize.Height : stationTextSize.Height * 2;\n            g.DrawString(stationText, Font, Brushes.Black, new Rectangle(DetailsPanel.Left + SecondIndentPosition, m_height,\n                DetailsPanel.Width - SecondIndentPosition, stationTextHeight));\n            m_height += stationTextHeight + Pad;\n\n            // Draw warning text if station is a conquerable one or citadel\n            if (station == null || StaticGeography.GetStationByID(station.ID) == null)\n                DrawColoredText(e, \"Station may be inaccessible!\", Font, new Point(SecondIndentPosition, m_height), Color.DarkRed);\n\n            if (station != null)\n            {\n                // Draw jumps from\n                DrawJumps(e, station);\n                // Draw the \"route through\" info text\n                DrawRouteThroughText(e, station);\n            }\n        }\n\n        /// <summary>\n        /// Draws the jumps.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        /// <param name=\"station\">The station.</param>\n        private void DrawJumps(PaintEventArgs e, Station station)\n        {\n            Graphics g = e.Graphics;\n\n            int startToEndSystemJumps;\n            string jumpsText;\n            Size jumpsTextSize;\n\n            // Draw the \"jumps from current location to contract's start solar system\" info text\n            if (m_characterLastSolarSystem != null && station == m_contract.StartStation)\n            {\n                // null SolarSystem is OK here\n                startToEndSystemJumps = GetCharacterLastLocationToStartRoute.Count(system =>\n                    system != station.SolarSystem);\n                jumpsText = m_contract.Character.LastKnownStation == station ? \"Current Station\" :\n                    (startToEndSystemJumps == 0 ? \"Current System\" :\n                    $\"{startToEndSystemJumps} jump{(startToEndSystemJumps.S())} away - \");\n\n                jumpsTextSize = g.MeasureString(jumpsText, Font).ToSize();\n                if (startToEndSystemJumps != 0)\n                {\n                    CurrentToStartLinkLabel.Location = new Point(SecondIndentPosition + jumpsTextSize.Width, m_height);\n                    CurrentToStartLinkLabel.BringToFront();\n                    CurrentToStartLinkLabel.Visible = true;\n                }\n\n                DrawText(e, string.Empty, jumpsText, Font);\n            }\n\n            // Draw the \"jumps from current location to contract's end solar system\" info text\n            if (m_characterLastSolarSystem != null && m_contract.StartStation != m_contract.EndStation &&\n                station == m_contract.EndStation)\n            {\n                // null SolarSystem is OK here\n                startToEndSystemJumps = GetCharacterLastLocationToEndRoute.Count(system =>\n                    system != station.SolarSystem);\n                jumpsText = m_contract.Character.LastKnownStation == station ?\n                    \"Current Station\" : (startToEndSystemJumps == 0 ?\n                    \"Destination is within same solar system of start location\" :\n                    $\"{startToEndSystemJumps} jump{(startToEndSystemJumps.S())} from current location - \");\n\n                jumpsTextSize = g.MeasureString(jumpsText, Font).ToSize();\n                if (startToEndSystemJumps != 0)\n                {\n                    CurrentToEndLinkLabel.Location = new Point(SecondIndentPosition + jumpsTextSize.Width, m_height);\n                    CurrentToEndLinkLabel.BringToFront();\n                    CurrentToEndLinkLabel.Visible = true;\n                }\n\n                DrawText(e, string.Empty, jumpsText, Font);\n            }\n\n            // Draw the \"jumps between start and end solar system\" info text\n            if (m_contract.StartStation == m_contract.EndStation || station != m_contract.\n                EndStation || (m_characterLastSolarSystem != null &&\n                m_characterLastSolarSystem == m_contract.StartStation.SolarSystem))\n                return;\n\n            startToEndSystemJumps = GetStartToEndRoute.Count(system =>\n                system != station.SolarSystem);\n            jumpsText = startToEndSystemJumps == 0 ?\n                \"Destination is within same solar system of start location\" :\n                $\"{startToEndSystemJumps} jump{(startToEndSystemJumps.S())} from start location - \";\n\n            jumpsTextSize = g.MeasureString(jumpsText, Font).ToSize();\n            if (startToEndSystemJumps != 0)\n            {\n                StartToEndLinkLabel.Location = new Point(SecondIndentPosition + jumpsTextSize.Width, m_height);\n                StartToEndLinkLabel.BringToFront();\n                StartToEndLinkLabel.Visible = true;\n            }\n\n            DrawText(e, string.Empty, jumpsText, Font);\n        }\n\n        /// <summary>\n        /// Draws the \"route through\" text.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        /// <param name=\"station\">The station.</param>\n        private void DrawRouteThroughText(PaintEventArgs e, Station station)\n        {\n            if (m_characterLastSolarSystem == null)\n                return;\n\n            bool routeThroughNullSec = false;\n            bool routeThroughLowSec = false;\n            bool routeThroughHighSec = false;\n\n            if (station == m_contract.StartStation)\n            {\n                routeThroughNullSec = !m_characterLastSolarSystem.IsNullSec &&\n                                      GetCharacterLastLocationToStartRoute.Any(system => system.IsNullSec);\n                routeThroughLowSec = !m_characterLastSolarSystem.IsLowSec &&\n                                     GetCharacterLastLocationToStartRoute.Any(system => system.IsLowSec);\n                routeThroughHighSec = !m_characterLastSolarSystem.IsHighSec &&\n                                      GetCharacterLastLocationToStartRoute.Any(system => system.IsHighSec);\n            }\n\n            if (m_contract.StartStation != m_contract.EndStation && station == m_contract.EndStation)\n            {\n                routeThroughNullSec = !m_characterLastSolarSystem.IsNullSec &&\n                                      GetStartToEndRoute.Any(system => system.IsNullSec);\n                routeThroughLowSec = !m_characterLastSolarSystem.IsLowSec &&\n                                     GetStartToEndRoute.Any(system => system.IsLowSec);\n                routeThroughHighSec = !m_characterLastSolarSystem.IsHighSec &&\n                                      GetStartToEndRoute.Any(system => system.IsHighSec);\n            }\n\n            // Quit if path is through same sec\n            if (!routeThroughNullSec && !routeThroughLowSec && !routeThroughHighSec)\n                return;\n\n            Graphics g = e.Graphics;\n            g.SmoothingMode = SmoothingMode.AntiAlias;\n\n            const string RouteText = \"Route will take you through: \";\n            Size routeTextSize = g.MeasureString(RouteText, Font).ToSize();\n\n            DrawText(e, string.Empty, RouteText, Font, false);\n            int left = DetailsPanel.Left + SecondIndentPosition + routeTextSize.Width;\n\n            // Route through \"Null Sec\"\n            if (routeThroughNullSec)\n            {\n                const string NullSecText = \"Null Sec\";\n                DrawColoredText(e, NullSecText, Font, new Point(left, m_height), Color.Red, false);\n                left += g.MeasureString(NullSecText, Font).ToSize().Width;\n            }\n\n            // Add comma when route through both \"Null Sec\" and \"Low Sec\"\n            if (routeThroughNullSec && routeThroughLowSec)\n            {\n                const string CommaText = \", \";\n                DrawText(e, string.Empty, CommaText, Font, false, left - Pad - DetailsPanel.Left - SecondIndentPosition);\n                left += g.MeasureString(CommaText, Font).ToSize().Width;\n            }\n\n            // Route through \"LowSec\"\n            if (routeThroughLowSec)\n            {\n                const string LowSecText = \"Low Sec\";\n                DrawColoredText(e, LowSecText, Font, new Point(left, m_height), Color.DarkOrange, false);\n                left += g.MeasureString(LowSecText, Font).ToSize().Width;\n            }\n\n            // Add comma when route through both \"Null Sec\" and \"Low Sec\"\n            if ((routeThroughNullSec || routeThroughLowSec) && routeThroughHighSec)\n            {\n                const string CommaText = \", \";\n                DrawText(e, string.Empty, CommaText, Font, false, left - Pad - DetailsPanel.Left - SecondIndentPosition);\n                left += g.MeasureString(CommaText, Font).ToSize().Width;\n            }\n\n            // Route through \"HighSec\"\n            if (routeThroughHighSec)\n                DrawColoredText(e, \"High Sec\", Font, new Point(left, m_height), Color.Green, false);\n\n            m_height += routeTextSize.Height + Pad;\n        }\n\n        /// <summary>\n        /// Draws a colored text.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"font\">The font.</param>\n        /// <param name=\"point\">The point.</param>\n        /// <param name=\"color\">The color.</param>\n        /// <param name=\"increaseHeight\">if set to <c>true</c> [increase height].</param>\n        private void DrawColoredText(PaintEventArgs e, string text, Font font, PointF point, Color color,\n            bool increaseHeight = true)\n        {\n            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;\n            SizeF textSize = e.Graphics.MeasureString(text, font);\n            DrawColoredText(e, text, font, new RectangleF(point, textSize), color, increaseHeight);\n        }\n\n        /// <summary>\n        /// Draws the colored text.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"font\">The font.</param>\n        /// <param name=\"rectangle\">The rectangle.</param>\n        /// <param name=\"color\">The color.</param>\n        /// <param name=\"increaseHeight\">if set to <c>true</c> [increase height].</param>\n        private void DrawColoredText(PaintEventArgs e, string text, Font font, RectangleF rectangle, Color color,\n            bool increaseHeight = true)\n        {\n            Graphics g = e.Graphics;\n            g.SmoothingMode = SmoothingMode.AntiAlias;\n\n            using (Brush secLevelBrush = new SolidBrush(color))\n            {\n                g.DrawString(text, font, secLevelBrush, rectangle);\n            }\n\n            if (increaseHeight)\n                m_height += g.MeasureString(text, font).ToSize().Height + Pad;\n        }\n\n        /// <summary>\n        /// Draws a text.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        /// <param name=\"labelText\">The label text.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"font\">The font.</param>\n        /// <param name=\"increaseHeight\">if set to <c>true</c> [increase height].</param>\n        /// <param name=\"position\">The position.</param>\n        private void DrawText(PaintEventArgs e, string labelText, string text, Font font, bool increaseHeight = true,\n            int position = 0)\n        {\n            Graphics g = e.Graphics;\n            g.SmoothingMode = SmoothingMode.AntiAlias;\n\n            Size textSize = g.MeasureString(text, font).ToSize();\n\n            // Draw the label text\n            if (!string.IsNullOrEmpty(labelText))\n                g.DrawString(labelText, font, Brushes.DimGray, DetailsPanel.Left + FirstIntendPosition, m_height);\n\n            // Draw the contract's related info text\n            g.DrawString(text, font, Brushes.Black, DetailsPanel.Left + SecondIndentPosition + position, m_height);\n\n            if (increaseHeight)\n                m_height += textSize.Height + Pad;\n        }\n\n        /// <summary>\n        /// Draws the header.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void DrawHeader(PaintEventArgs e)\n        {\n            Image headerImage;\n            Graphics g = e.Graphics;\n            g.SmoothingMode = SmoothingMode.AntiAlias;\n\n            // Select image according to contract type\n            switch (m_contract.ContractType)\n            {\n                case ContractType.Courier:\n                    headerImage = ImageList.Images[1];\n                    break;\n                case ContractType.Auction:\n                    headerImage = ImageList.Images[2];\n                    break;\n                case ContractType.ItemExchange:\n                    headerImage = ImageList.Images[0];\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n\n            // Draw header image\n            g.DrawImage(headerImage, new Rectangle(DetailsPanel.Left, DetailsPanel.Top,\n                headerImage.Width, headerImage.Height));\n\n            // Draw the header text\n            Font headerTextFont = FontFactory.GetDefaultFont(10.25f);\n            string headerText = $\"{m_contract.ContractText} ({m_contract.ContractType.GetDescription()})\";\n            Size textSize = g.MeasureString(headerText, headerTextFont).ToSize();\n            int imageWidth = headerImage.Width + Pad * 2;\n            g.DrawString(headerText, headerTextFont, Brushes.Black,\n                new Rectangle(DetailsPanel.Left + imageWidth,\n                    headerImage.Height / 2 - textSize.Height,\n                    DetailsPanel.Width - imageWidth, textSize.Height * 2));\n\n            m_height = headerImage.Height;\n\n            // Draw the lower line\n            DrawLine(e);\n        }\n\n        /// <summary>\n        /// Draws a line.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void DrawLine(PaintEventArgs e)\n        {\n            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;\n\n            using (Pen pen = new Pen(ForeColor))\n            {\n                e.Graphics.DrawLine(pen, DetailsPanel.Left + FirstIntendPosition, m_height,\n                    DetailsPanel.Right - FirstIntendPosition, m_height);\n            }\n        }\n\n        #endregion\n\n\n        #region Route Drawing Methods\n\n        /// <summary>\n        /// Handles the Paint event of the RoutePanel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void RoutePanel_Paint(object sender, PaintEventArgs e)\n        {\n            if (m_route == null)\n                return;\n\n            Graphics g = e.Graphics;\n            g.SmoothingMode = SmoothingMode.AntiAlias;\n\n            m_height = Pad;\n\n            g.DrawString(\"Start Location:\", Font, Brushes.Black, FirstIntendPosition, m_height);\n            m_height += g.MeasureString(\"Start Location:\", Font).ToSize().Height;\n\n            int width = DrawSolarSystemText(e, m_route.First(), FirstIntendPosition + Pad);\n            m_height += Pad * 2;\n\n            width = m_route.Where(solarSystem => solarSystem != m_route.First() && solarSystem != m_route.Last()).Select(\n                solarSystem => DrawSolarSystemText(e, solarSystem, FirstIntendPosition * 2)).Concat(new[] { width }).Max();\n            m_height += Pad * 2;\n\n            g.DrawString(\"Destination:\", Font, Brushes.Black, FirstIntendPosition, m_height);\n            m_height += g.MeasureString(\"Destination:\", Font).ToSize().Height;\n\n            width = Math.Max(width, DrawSolarSystemText(e, m_route.Last(), FirstIntendPosition + Pad));\n\n            width += Pad;\n            m_height += Pad * 2 + (width > RoutePanelParent.Width ? FirstIntendPosition * 2 + Pad : Pad);\n\n            RoutePanel.Size = new Size(width, m_height);\n        }\n\n        /// <summary>\n        /// Draws the solar system text.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        /// <param name=\"solarSystem\">The solar system.</param>\n        /// <param name=\"left\">The left.</param>\n        /// <returns>The width of the drawn text.</returns>\n        private int DrawSolarSystemText(PaintEventArgs e, SolarSystem solarSystem, int left)\n        {\n            Graphics g = e.Graphics;\n            g.SmoothingMode = SmoothingMode.AntiAlias;\n\n            string secLevelText = solarSystem.SecurityLevel.ToString(\"N1\", CultureConstants.DefaultCulture);\n            int intend = g.MeasureString(secLevelText, Font).ToSize().Width;\n            Size systemTextSize = g.MeasureString(solarSystem.Name, Font).ToSize();\n            DrawColoredText(e, secLevelText, Font, new Point(left, m_height),\n                solarSystem.SecurityLevelColor, false);\n            g.DrawString(solarSystem.Name, Font, Brushes.Black, left + intend, m_height);\n\n            m_height += systemTextSize.Height;\n\n            return left + intend + systemTextSize.Width + Pad;\n        }\n\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// Handles the Click event of the DetailsPanel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void DetailsPanel_Click(object sender, EventArgs e)\n        {\n            HideRoutePanel();\n        }\n\n        /// <summary>\n        /// Handles the MouseClick event of the ItemImage control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void ItemImage_MouseClick(object sender, MouseEventArgs e)\n        {\n            HideRoutePanel();\n        }\n\n        /// <summary>\n        /// Handles the LinkClicked event of the CurrentToStartLinkLabel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.LinkLabelLinkClickedEventArgs\"/> instance containing the event data.</param>\n        private void CurrentToStartLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            m_route = m_characterLastLocationToStartRoute;\n            ShowRoutePanel();\n        }\n\n        /// <summary>\n        /// Handles the LinkClicked event of the CurrentToEndLinkLabel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.LinkLabelLinkClickedEventArgs\"/> instance containing the event data.</param>\n        private void CurrentToEndLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            m_route = m_characterLastLocationToEndRoute;\n            ShowRoutePanel();\n        }\n\n        /// <summary>\n        /// Handles the LinkClicked event of the StartToEndLinkLabel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.LinkLabelLinkClickedEventArgs\"/> instance containing the event data.</param>\n        private void StartToEndLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            m_route = GetStartToEndRoute;\n            ShowRoutePanel();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the BidsButton control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void BidsButton_Click(object sender, EventArgs e)\n        {\n            m_buttonSwitch = !m_buttonSwitch;\n            BidsButton.Text = m_buttonSwitch ? \"Hide Bids\" : \" Show Bids\";\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Shows the route panel.\n        /// </summary>\n        private void ShowRoutePanel()\n        {\n            if (RoutePanelParent.Visible)\n            {\n                if (m_route.SequenceEqual(m_oldRoute))\n                    return;\n\n                m_oldRoute = m_route;\n                RoutePanel.Invalidate();\n\n                return;\n            }\n\n            int width = Width + RoutePanelParent.Width;\n            MaximumSize = new Size(width, MaximumSize.Height);\n            MinimumSize = new Size(width, MinimumSize.Height);\n            RoutePanelParent.Visible = true;\n            m_oldRoute = m_route;\n        }\n\n        /// <summary>\n        /// Hides the route panel.\n        /// </summary>\n        private void HideRoutePanel()\n        {\n            if (!RoutePanelParent.Visible)\n                return;\n\n            RoutePanelParent.Visible = !RoutePanelParent.Visible;\n            int width = Width - RoutePanelParent.Width;\n            MaximumSize = new Size(width, MaximumSize.Height);\n            MinimumSize = new Size(width, MinimumSize.Height);\n        }\n\n\n        #endregion\n\n\n        #region Private Static Methods\n\n        /// <summary>\n        /// Gets the number format of an amount.\n        /// </summary>\n        /// <param name=\"number\">The number.</param>\n        /// <returns></returns>\n        private static string GetNumberFormat(decimal number)\n            => number - (long)number == 0 ? \"{0:N0} ISK {1}\" : \"{0:N2} ISK {1}\";\n\n        #endregion\n\n\n        #region Helper Class \"ContractItemsListView\"\n\n        private sealed class ContractItemsListView : ListView\n        {\n            private readonly IEnumerable<ContractItem> m_list;\n            private readonly Character m_character;\n            private ColumnHeader m_sortCriteria;\n            private bool m_sortAscending = true;\n            private IContainer components;\n            private ToolStripMenuItem m_showInBrowserMenuItem;\n\n\n            #region Constructors\n\n            /// <summary>\n            /// Private Constructor.\n            /// </summary>\n            private ContractItemsListView()\n            {\n                InitializeComponent();\n            }\n\n            /// <summary>\n            /// Construtor.\n            /// </summary>\n            /// <param name=\"character\">The character.</param>\n            /// <param name=\"items\">The items.</param>\n            internal ContractItemsListView(Character character, IEnumerable<ContractItem> items)\n                : this()\n            {\n                m_list = items;\n                m_sortCriteria = Columns[0];\n                m_character = character;\n            }\n\n            #endregion\n\n\n            #region Initializer\n\n            /// <summary>\n            /// Initializes the component.\n            /// </summary>\n            private void InitializeComponent()\n            {\n                components = new Container();\n                ContextMenuStrip contextMenu = new ContextMenuStrip(components);\n                m_showInBrowserMenuItem = new ToolStripMenuItem();\n                contextMenu.SuspendLayout();\n\n                contextMenu.Items.AddRange(new ToolStripItem[]\n                {\n                    m_showInBrowserMenuItem\n                });\n                contextMenu.Name = \"contextMenu\";\n                contextMenu.Size = new Size(171, 48);\n                contextMenu.Opening += contextMenu_Opening;\n\n                m_showInBrowserMenuItem.Name = \"m_showInBrowserMenuItem\";\n                m_showInBrowserMenuItem.Size = new Size(170, 22);\n                m_showInBrowserMenuItem.Text = @\"Show In Browser...\";\n                m_showInBrowserMenuItem.Click += showInBrowserMenuItem_Click;\n\n                contextMenu.ResumeLayout(false);\n                ColumnHeader chName = new ColumnHeader\n                {\n                    Text = @\"Name\",\n                    Width = 120\n                };\n\n                ColumnHeader chQuantity = new ColumnHeader\n                {\n                    Text = @\"Qty\",\n                    Width = 60,\n                    TextAlign = HorizontalAlignment.Right\n                };\n\n                ColumnHeader chType = new ColumnHeader\n                {\n                    Text = @\"Type\",\n                    Width = 60\n                };\n\n                Columns.AddRange(new[] { chName, chQuantity, chType });\n                BorderStyle = BorderStyle.None;\n                Size = new Size(0, 0);\n                View = View.Details;\n                Visible = false;\n                FullRowSelect = true;\n                HideSelection = false;\n                MultiSelect = false;\n                ContextMenuStrip = contextMenu;\n                ColumnClick += ContractItemsListView_ColumnClick;\n            }\n\n            #endregion\n\n\n            #region Inherited Events\n\n            /// <summary>\n            /// Clean up any resources being used.\n            /// </summary>\n            /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n            protected override void Dispose(bool disposing)\n            {\n                if (disposing)\n                    components?.Dispose();\n\n                base.Dispose(disposing);\n            }\n\n            /// <summary>\n            /// When the control gets created, update the content.\n            /// </summary>\n            protected override void OnCreateControl()\n            {\n                base.OnCreateControl();\n\n                UpdateContent();\n                AdjustColumns();\n            }\n\n            /// <summary>\n            /// Raises the <see cref=\"E:System.Windows.Forms.Control.Enter\" /> event.\n            /// </summary>\n            /// <param name=\"e\">An <see cref=\"T:System.EventArgs\" /> that contains the event data.</param>\n            /// <remarks>REmoves the focus cues around the item.</remarks>\n            protected override void OnEnter(EventArgs e)\n            {\n                base.OnEnter(e);\n\n                Message m = Message.Create(Handle, 295, new IntPtr(65537), IntPtr.Zero);\n                WndProc(ref m);\n            }\n\n            /// <summary>\n            /// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseMove\" /> event.\n            /// </summary>\n            /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.MouseEventArgs\" /> that contains the event data.</param>\n            protected override void OnMouseMove(MouseEventArgs e)\n            {\n                base.OnMouseMove(e);\n\n                if (e.Button == MouseButtons.Right)\n                    return;\n\n                ListViewItem item = GetItemAt(e.X, e.Y);\n\n                Cursor = item != null ? CustomCursors.ContextMenu : Cursors.Default;\n            }\n\n            /// <summary>\n            /// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseDown\" /> event.\n            /// </summary>\n            /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.MouseEventArgs\" /> that contains the event data.</param>\n            protected override void OnMouseDown(MouseEventArgs e)\n            {\n                base.OnMouseDown(e);\n\n                if (e.Button != MouseButtons.Right)\n                    return;\n\n                Cursor = Cursors.Default;\n            }\n\n            #endregion\n\n\n            #region Local Event Handlers\n\n            /// <summary>\n            /// Handles the Opening event of the contextMenu control.\n            /// </summary>\n            /// <param name=\"sender\">The source of the event.</param>\n            /// <param name=\"e\">The <see cref=\"CancelEventArgs\"/> instance containing the event data.</param>\n            private void contextMenu_Opening(object sender, CancelEventArgs e)\n            {\n                e.Cancel = SelectedItems.Count == 0;\n\n                if (e.Cancel)\n                    return;\n\n                ContractItem contractItem = SelectedItems[0]?.Tag as ContractItem;\n\n\n                if (contractItem?.Item == null)\n                    return;\n\n                Blueprint blueprint = StaticBlueprints.GetBlueprintByID(contractItem.Item.ID);\n                Ship ship = contractItem.Item as Ship;\n                Skill skill = m_character.Skills[contractItem.Item.ID];\n\n                if (skill == Skill.UnknownSkill)\n                    skill = null;\n\n                string text = ship != null ? \"Ship\" : blueprint != null ? \"Blueprint\" : skill != null ? \"Skill\" : \"Item\";\n\n                m_showInBrowserMenuItem.Text = $\"Show In {text} Browser...\";\n            }\n\n            /// <summary>\n            /// Handles the Click event of the showInBrowserMenuItem control.\n            /// </summary>\n            /// <param name=\"sender\">The source of the event.</param>\n            /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n            private void showInBrowserMenuItem_Click(object sender, EventArgs e)\n            {\n                ContractItem contractItem = SelectedItems[0]?.Tag as ContractItem;\n\n                if (contractItem?.Item == null)\n                    return;\n\n                Ship ship = contractItem.Item as Ship;\n                Blueprint blueprint = StaticBlueprints.GetBlueprintByID(contractItem.Item.ID);\n                Skill skill = m_character.Skills[contractItem.Item.ID];\n\n                if (skill == Skill.UnknownSkill)\n                    skill = null;\n\n                PlanWindow planWindow = PlanWindow.ShowPlanWindow(m_character);\n\n                if (ship != null)\n                    planWindow.ShowShipInBrowser(ship);\n                else if (blueprint != null)\n                    planWindow.ShowBlueprintInBrowser(blueprint);\n                else if (skill != null)\n                    planWindow.ShowSkillInBrowser(skill);\n                else\n                    planWindow.ShowItemInBrowser(contractItem.Item);\n            }\n\n            #endregion\n\n\n            #region Updating Methods\n\n            /// <summary>\n            /// Updates the content.\n            /// </summary>\n            private void UpdateContent()\n            {\n                BeginUpdate();\n                try\n                {\n                    UpdateSort();\n\n                    Items.Clear();\n\n                    foreach (ContractItem contractItem in m_list)\n                    {\n                        ListViewItem lvItem = new ListViewItem(contractItem.Item.Name) { Tag = contractItem };\n\n                        // Add enough subitems to match the number of columns\n                        while (lvItem.SubItems.Count < Columns.Count + 1)\n                        {\n                            lvItem.SubItems.Add(string.Empty);\n                        }\n\n                        // Creates the subitems\n                        for (int i = 0; i < Columns.Count; i++)\n                        {\n                            SetColumn(contractItem, lvItem.SubItems[i], Columns[i]);\n                        }\n                        Items.Add(lvItem);\n                    }\n                }\n                finally\n                {\n                    EndUpdate();\n                }\n            }\n\n            /// <summary>\n            /// Adjusts the columns.\n            /// </summary>\n            private void AdjustColumns()\n            {\n                foreach (ColumnHeader column in Columns)\n                {\n                    column.Width = -2;\n\n                    // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                    // Return if it's not the last column and not set to auto-resize\n                    if (column.Index != Columns.Count - 1)\n                        continue;\n\n                    const int Pad = 4;\n\n                    // Calculate column header text width with padding\n                    int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                    // If there is an image assigned to the header, add its width with padding\n                    if (SmallImageList != null && column.ImageIndex > -1)\n                        columnHeaderWidth += SmallImageList.ImageSize.Width + Pad;\n\n                    // Calculate the width of the header and the items of the column\n                    int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                        item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                            new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                    // Assign the width found\n                    column.Width = columnMaxWidth;\n                }\n            }\n\n            /// <summary>\n            /// Updates the item sorter.\n            /// </summary>\n            private void UpdateSort()\n            {\n                ListViewItemSorter = new ListViewItemComparerByTag<ContractItem>(\n                    new ContractItemComparer(m_sortCriteria, m_sortAscending));\n\n                UpdateSortVisualFeedback();\n            }\n\n            /// <summary>\n            /// Updates the sort feedback (the arrow on the header).\n            /// </summary>\n            private void UpdateSortVisualFeedback()\n            {\n                foreach (ColumnHeader columnHeader in Columns.Cast<ColumnHeader>())\n                {\n                    if (m_sortCriteria == columnHeader)\n                        columnHeader.ImageIndex = m_sortAscending ? 0 : 1;\n                    else\n                        columnHeader.ImageIndex = 2;\n                }\n            }\n\n            /// <summary>\n            /// Updates the listview sub-item.\n            /// </summary>\n            /// <param name=\"contractItem\">The contract item.</param>\n            /// <param name=\"item\">The item.</param>\n            /// <param name=\"column\">The column.</param>\n            /// <exception cref=\"NotImplementedException\"></exception>\n            private static void SetColumn(ContractItem contractItem, ListViewItem.ListViewSubItem item, ColumnHeader column)\n            {\n                switch (column.Index)\n                {\n                    case 0:\n                        item.Text = contractItem.Item.Name;\n                        break;\n                    case 1:\n                        item.Text = contractItem.Quantity.ToString(CultureConstants.DefaultCulture);\n                        break;\n                    case 2:\n                        item.Text = contractItem.Item.GroupName;\n                        break;\n                    default:\n                        throw new NotImplementedException();\n                }\n            }\n\n\n            #region Local Events\n\n            /// <summary>\n            /// When the user clicks a column header, we update the sorting.\n            /// </summary>\n            /// <param name=\"sender\"></param>\n            /// <param name=\"e\"></param>\n            private void ContractItemsListView_ColumnClick(object sender, ColumnClickEventArgs e)\n            {\n                ListView lvItems = (ListView)sender;\n                ColumnHeader column = lvItems.Columns[e.Column];\n                if (m_sortCriteria == column)\n                    m_sortAscending = !m_sortAscending;\n                else\n                {\n                    m_sortCriteria = column;\n                    m_sortAscending = true;\n                }\n\n                UpdateContent();\n            }\n\n            #endregion\n        }\n\n        #endregion\n\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/DetailsWindow/ContractDetailsWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"ImageList.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ImageList.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACa\n        wwAAAk1TRnQBSQFMAgEBAwEAAWgBAQFoAQEBQAEAAUABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgEAAEB\n        AgABQAMAAQEBAAEgBwABAf8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AGAAAQEDAAQBAQIDAQECAwEBAgMB\n        AQIDAQECAwABAQMAAQHfAAEBAwAEAQECAwEBAgMBAQIDAQECAwEBAgMAAQEDAAEB3wABAQMABAEBAgMB\n        AQIDAQECAwEBAgMBAQIDAAEBAwABAf8A3AAEAQECAwQBBQMEBAYBCAMGAQgDBQEHAwQBBgMEAQUDAgED\n        AwEBAgMBAQIDAAEBAwABAcsABAEBAgMEAQUDBAQGAQgDBgEIAwUBBwMEAQYDBAEFAwIBAwMBAQIDAQEC\n        AwABAQMAAQHLAAQBAQIDBAEFAwQEBgEIAwYBCAMFAQcDBAEGAwQBBQMCAQMDAQECAwEBAgMAAQEDAAEB\n        /wDIAAEBAwIBAwMEAQYDBwEKAwsBDwMNAREDDQESAw0BEQMLAQ8DCgENAwcBCgMGAQgDBAEGAwQBBQMC\n        AQMDAQECAwEBAgMAAQEDAAEBAwABAbMAAQEDAgEDAwQBBgMHAQoDCwEPAw0BEQMNARIDDQERAwsBDwMK\n        AQ0DBwEKAwYBCAMEAQYDBAEFAwIBAwMBAQIDAQECAwABAQMAAQEDAAEBswABAQMCAQMDBAEGAwcBCgML\n        AQ8DDQERAw0BEgMNAREDCwEPAwoBDQMHAQoDBgEIAwQBBgMEAQUDAgEDAwEBAgMBAQIDAAEBAwABAQMA\n        AQH/ALAAAQEDAgEDAwUBBwMKAQ0DEAEVAxQBHAMXASADGAEiAxgBIQMWAR4DEwEaAxABFgMOARMDDAEQ\n        AwoBDQMHAQoDBgEIAwUBBwMEAQUDAwEEAwIBAwMBAQIDAAEBAwABAQMAAQGfAAEBAwIBAwMFAQcDCgEN\n        AxABFQMUARwDFwEgAxgBIgMYASEDFgEeAxMBGgMQARYDDgETAwwBEAMKAQ0DBwEKAwYBCAMFAQcDBAEF\n        AwMBBAMCAQMDAQECAwABAQMAAQEDAAEBnwABAQMCAQMDBQEHAwoBDQMQARUDFAEcAxcBIAMYASIDGAEh\n        AxYBHgMTARoDEAEWAw4BEwMMARADCgENAwcBCgMGAQgDBQEHAwQBBQMDAQQDAgEDAwEBAgMAAQEDAAEB\n        AwABAf8AnAABAQMCAQMDBQEHAwoBDgMRARcDGAEhAx0BKgMhATEDIwEzAyIBMgMgAS8DHwEsAxwBJwMZ\n        ASMDFgEfAxQBGwMRARcDDgETAwwBEAMKAQ0DCAELAwcBCQMFAQcDBAEFAwMBBAMCAQMDAQECAwABAQMA\n        AQEDAAEBiwABAQMCAQMDBQEHAwoBDgMRARcDGAEhAx0BKgMhATEDIwEzAyIBMgMgAS8DHwEsAxwBJwMZ\n        ASMDFgEfAxQBGwMRARcDDgETAwwBEAMKAQ0DCAELAwcBCQMFAQcDBAEFAwMBBAMCAQMDAQECAwABAQMA\n        AQEDAAEBiwABAQMCAQMDBQEHAwoBDgMRARcDGAEhAx0BKgMhATEDIwEzAyIBMgMgAS8DHwEsAxwBJwMZ\n        ASMDFgEfAxQBGwMRARcDDgETAwwBEAMKAQ0DCAELAwcBCQMFAQcDBAEFAwMBBAMCAQMDAQECAwABAQMA\n        AQEDAAEB/wCIAAEBAwIBAwMFAQcDCgENAxEBFwMYASIDHwEtAyQBNgFHAkYBgQM8AWYDKgFAAykBPgMn\n        ATsDJgE4AyQBNQMhATEDHwEsAxwBKAMaASQDFwEgAxQBHAMSARgDDwEUAw0BEQMKAQ4DCAELAwcBCQMF\n        AQcDBAEGAwMBBAMCAQMDAQECAwABAQMAAQEDAAEBdwABAQMCAQMDBQEHAwoBDQMRARcDGAEiAx8BLQMk\n        ATYDTAGTA0EBcwMqAUADKQE+AycBOwMmATgDJAE1AyEBMQMfASwDHAEoAxoBJAMXASADFAEcAxIBGAMP\n        ARQDDQERAwoBDgMIAQsDBwEJAwUBBwMEAQYDAwEEAwIBAwMBAQIDAAEBAwABAQMAAQF3AAEBAwIBAwMF\n        AQcDCgENAxEBFwMYASIDHwEtAyQBNgNMAZMDQQFzAyoBQAMpAT4DJwE7AyYBOAMkATUDIQExAx8BLAMc\n        ASgDGgEkAxcBIAMUARwDEgEYAw8BFAMNAREDCgEOAwgBCwMHAQkDBQEHAwQBBgMDAQQDAgEDAwEBAgMA\n        AQEDAAEBAwABAf8AdAABAQMCAQMDBQEHAwoBDQMQARYDFwEgAx8BLAMkATYDOAFeAcoBUAEAAf8BwgFN\n        AQAB/wHHAU8BAAH/AmEBXAHcAVgCVgG5AU4CTQGVA0ABcAMvAUoDKAE8AyYBOQMkATUDIgEyAx8BLQMd\n        ASkDGgElAxcBIAMUARwDEgEYAxABFQMNAREDCgEOAwkBDAMHAQkDBQEHAwQBBgMEAQUDAgEDAwEBAgMA\n        AQEDAAEBAwABAWMAAQEDAgEDAwUBBwMKAQ0DEAEWAxcBIAMfASwDJAE2Az0BaQEAAa4BxgH/AQABswHI\n        Af8BAAG6AcsB/wFYAmEB5gFZAlwByQFQAlIBpANEAXwDMQFOAygBPAMmATkDJAE1AyIBMgMfAS0DHQEp\n        AxoBJQMXASADFAEcAxIBGAMQARUDDQERAwoBDgMJAQwDBwEJAwUBBwMEAQYDBAEFAwIBAwMBAQIDAAEB\n        AwABAQMAAQFjAAEBAwIBAwMFAQcDCgENAxABFgMXASADHwEsAyQBNgM9AWkBCwEyAcYB/wENATYByAH/\n        AQ8BOwHLAf8BWAJhAeYCWQFcAckCUAFSAaQDRAF8AzEBTgMoATwDJgE5AyQBNQMiATIDHwEtAx0BKQMa\n        ASUDFwEgAxQBHAMSARgDEAEVAw0BEQMKAQ4DCQEMAwcBCQMFAQcDBAEGAwQBBQMCAQMDAQECAwABAQMA\n        AQEDAAEB/wBgAAEBAwIBAwMEAQYDCQEMAw8BFAMWAR8DHQEqAyMBNAMoATwDUAGdAcUBTgEAAf8BvwFL\n        AQAB/wHDAU4BAAH/AcoBUQEAAf8BzwGAAQAB/wHSAYEBAAH/AdkBhQEAAf8B2wGFAQAB/wJkAVwB5wJb\n        AVkBxAFRAlABnwNEAXoDNAFUAycBOgMkATYDIwEzAyABLgMdASoDGwEmAxgBIgMVAR0DEgEZAxABFgMN\n        ARIDCwEPAwkBDAMHAQoDBgEIAwQBBgMDAQQDAQECAwABAVsAAQEDAgEDAwQBBgMJAQwDDwEUAxYBHwMd\n        ASoDIwE0AygBPAFTAlUBsAEAAa0BxgH/AQABswHIAf8BAAG5AckB/wEAAcABzQH/AQABxQHOAf8BAAHJ\n        AdEB/wEAAdAB1gH/AQAB1QHbAf8DXQHtAVkCXAHPAVQCVgGrA0gBhQM2AVkDJwE6AyQBNgMjATMDIAEu\n        Ax0BKgMbASYDGAEiAxUBHQMSARkDEAEWAw0BEgMMARADCgENAwcBCgMGAQgDBAEGAwMBBAMBAQIDAAEB\n        WwABAQMCAQMDBAEGAwkBDAMPARQDFgEfAx0BKgMjATQDKAE8AlMBVQGwAQsBMwHGAf8BDQE2AcgB/wEO\n        AToByQH/ARIBPgHNAf8BEwFBAc4B/wEXAUYB0QH/ARsBSwHWAf8BHAFPAdsB/wNdAe0BWQJcAc8CVAFW\n        AasDSAGFAzYBWQMnAToDJAE2AyMBMwMgAS4DHQEqAxsBJgMYASIDFQEdAxIBGQMQARYDDQESAwsBDwMJ\n        AQwDBwEKAwYBCAMEAQYDAwEEAwEBAgMAAQH/AFgABAEBAgMEAQYDCAELAw4BEwMVAR0DHAEnAyEBMQMm\n        ATkDKQE+AmABWgHeAcABSwEAAf8CWwFYAcsDWwHDAlgBVgG8AlkBVwHCAmABXAHUAmUBUgH0AdoBhQEA\n        Af8B3wGIAQAB/wHgAYgBAAH/AeQBiQEAAf8B4wGIAQAB/wHlAYkBAAH/AmcBWQHyAl4BXAHOA1MBqgNI\n        AYQDOAFeAyUBNwMjATQDIAEvAx4BKwMcAScDGAEiAxYBHgMTARoDEAEWAw0BEgMKAQ4DBwEKAwQBBgMC\n        AQMDAAEBUwAEAQECAwQBBgMIAQsDDgETAxUBHQMcAScDIQExAyYBOQMpAT4BVwJfAegBAAGrAcYB/wFa\n        AmAB3gFaAl4B2AFaAl0B0wFZAl0B1wFdAmEB4gE+AWEBYwH4AQAB0gHYAf8BAwHXAd0B/wEFAdsB4AH/\n        AQkB4gHmAf8BDAHjAegB/wEQAeYB7AH/AUICWQH1AVsCYAHWAVUCVgG0AUsCTAGPAzsBZQMlATcDJAE1\n        AyEBMAMfASwDHAEoAxkBIwMWAR8DEwEaAxABFgMNARIDCgEOAwcBCgMEAQYDAgEDAwABAVMABAEBAgME\n        AQYDCAELAw4BEwMVAR0DHAEnAyEBMQMmATkDKQE+AlcBXwHoAQsBMgHGAf8CWgFgAd4BWgJeAdgCWgFd\n        AdMBWQJdAdcCXQFhAeIBRwFcAWMB+AEdAU4B2AH/AR8BgAHdAf8BIwGDAeAB/wEoAYgB5gH/ASoBiwHo\n        Af8BLgGOAewB/wNZAfUBWwJgAdYBVQJWAbQCSwFMAY8DOwFlAyUBNwMjATQDIAEvAx4BKwMcAScDGAEi\n        AxYBHgMTARoDEAEWAw0BEgMKAQ4DBwEKAwQBBgMCAQMDAAEB/wBQAAQBAQIDBAEFAwcBCgMNAREDFAEb\n        AxoBJQMgAS4DJAE1AycBOgM4AV4BxAFNAQAB/wG6AUcBAAH/A2EB5AGYAbEBxgH/AZgBsQHGAf8BmAGx\n        AcYB/wGYAbEBxgH/A2UB5QNdAcoCWQFWAb4CWQFXAb8CXAFaAc0CXAFVAeoB5AGIAQAB/wHjAYcBAAH/\n        AeQBhwEAAf8B3QGHAQAB/wHcAYYBAAH/AdoBhQEAAf8BqAGCAS0B/QJeAVsB2QNVAbIDSgGMAzsBZAMn\n        ATsDIQExAx8BLAMcAScDGAEiAxQBGwMPARQDCQEMAwQBBgMCAQMDAAEBAwABAQMAAQEDAAEBAwABATsA\n        BAEBAgMEAQUDBwEKAw0BEQMUARsDGgElAyABLgMkATUDJwE6Az0BaQEAAaYBxgH/AQABqgHHAf8BXQJh\n        Ae4BTwGPAZ8B/wFRAZEBoQH/AVIBkwGjAf8BhAGYAacB/wNdAe0BXgJhAdoBWwJeAdABWQJcAc8BWwJe\n        AdkBWAJiAe8BEgHmAesB/wEXAegB8AH/ARoB6AHxAf8BIAHpAfYB/wEhAecB9gH/ASgB5gH4Af8BQAKo\n        Af0BWwJhAeEBWAJaAcABTwJQAZsDQAFwAykBPwMiATIDHwEtAxwBKAMYASIDFAEbAw4BEwMIAQsDBAEF\n        AwEBAk8ABAEBAgMEAQUDBwEKAw0BEQMUARsDGgElAyABLgMkATUDJwE6Az0BaQEKATABxgH/AQ0BNQHH\n        Af8DYQHuAU8BjwGfAf8BUQGRAaEB/wFSAZMBowH/AYQBmAGnAf8DXQHtA2EB2gFbAl4B0AFZAlwBzwFb\n        Al4B2QFYAmIB7wEvAY8B6wH/ATQBkwHwAf8BNgGWAfEB/wE8AZgB9gH/ATwBmQH2Af8BQgGaAfkB/wFA\n        AZkBqAH9AWACYQHhAVcCWQG/A1ABmgI/AUABbgMoAT0DIQExAx8BLAMcAScDGAEiAxQBGwMOARMDCAEL\n        AwQBBQMBAQL/AEwABAEBAgMEAQUDBwEJAwwBEAMSBBgBIgMdASoDIgEyAyQBNgMnAToDUAGaAbsBSQEA\n        Af8CYQFaAeQBjQGkAbgB/wFHAYcBlwH/AUcBhgGWAf8BQgGCAZEB/wGEAZoBqwH/AZcBrwHEAf8BlwGv\n        AcQB/wGXAa8BxAH/AZcBsAHFAf8BlwGwAcUB/wNdAfADXAHRAlgBVgHBAlkBVgG+A1sByAJcAVcB3wHd\n        AYcBAAH/AdoBhQEAAf8B2AGDAQAB/wHRAYABAAH/AcwBUgEAAf8ByAFPAQAB/wHAAU0BAAH/AmEBXQHi\n        AVgCVgG8AU4CTQGWAz8BbwMqAUEDFgEfAxABFQMKAQ0DBgEIAwQBBgMEAQUDBAEFAwMBBAMCAQMDAQEC\n        AwEBAgMBAQIDAAEBAwABAQMAAQEDAAEBGwAEAQECAwQBBQMHAQkDDAEQAxIEGAEiAx0BKgMiATIDJAE2\n        AycBOgNUAa4BAAGkAcYB/wFUAmEB7gFGAYQBlAH/ATUBRAFQAf8BNAFEAVAB/wE0AUMBTwH/AUcBhgGU\n        Af8BhgGZAakB/wGKAZ0BrgH/AYsBnwGvAf8BjwGjAbQB/wGUAagBuQH/A2UB9ANeAd0DXgHQAVkCXAHP\n        AVsCYAHWAVwCZAHnASYB5gH1Af8BKwHjAfcB/wEuAd4B9AH/AS8B1wHyAf8BNAHVAfIB/wE3AdEB8wH/\n        AToB0gHxAf8DXAHqAVgCWwHLAVECUgGnA0UBfQMuAUgDFQEdAw0BEQMGAQgDAgEDAwABAUcABAEBAgME\n        AQUDBwEJAwwBEAMSBBgBIgMdASoDIgEyAyQBNgMnAToDVAGuAQkBMAHGAf8BVAFYAWEB7gFGAYQBlAH/\n        ATUBRAFQAf8BNAFEAVAB/wE0AUMBTwH/AUcBhgGUAf8BhgGZAakB/wGKAZ0BrgH/AYsBnwGvAf8BjwGj\n        AbQB/wGUAagBuQH/A2UB9ANeAd0DXgHQA1wBzwFbAmAB1gNkAecBQgGaAfgB/wFFAZwB+wH/AUgBngH7\n        Af8BSwGeAf0B/wFOAaAB/QH/AU8BngH9Af8BUAGeAfcB/wNcAeoDWwHLAVECUgGnA0UBfQMuAUcDFQEd\n        Aw0BEQMGAQgDAgEDAwABAf8ARAAEAQECAwMBBAMGAQgDCgEOAxAEFgEeAxsBJgMfAS0DIgEyAyQBNQMl\n        ATcCYQFcAdwBtAFHAQAB/wJcAVoBzQFLAYsBnAH/AUgBiQGZAf8BkgGqAb4B/wGCAZgBqgH/AUYBhgGW\n        Af8BhwGdAbAB/wGRAakBvQH/AZEBqQG9Af8BkgGqAb4B/wGUAawBwAH/AZUBrQHCAf8BlQGuAcIB/wGW\n        Aa8BwwH/AZcBsAHFAf8BmAGxAcUB/wJfAWQB+wNhAdoDWgHFAlkBVgG+AloBVwHFAl0BWQHXAmoBQQH5\n        AcQBTQEAAf8BwQFNAQAB/wG6AUkBAAH/AbYBRwEAAf8BsAFEAQAB/wGoAUEBAAH/A10B7QFZAlcBwgNO\n        AZQDPAFmAyYBOAMLAQ8DCgEOAwkBDAMIAQsDBwEJAwYBCAMEAQYDBAEFAwMBBAMCAQMDAQECFwAEAQEC\n        AwMBBAMGAQgDCgEOAxAEFgEeAxsBJgMfAS0DIgEyAyQBNQMlATcBWAJhAeYBAAGjAcgB/wFXAlwB3wE1\n        AUUBUQH/ATcBRgGBAf8BUQGRAaEB/wFIAYcBlQH/AT4BTgGIAf8BUgGRAaAB/wGJAZwBrAH/AY0BoQGx\n        Af8BkQGkAbQB/wGUAagBuAH/AZkBrAG8Af8BngGxAcEB/wGfAbIBwgH/AaMBtgHGAf8BpQG5AckB/wFf\n        AWYBbQH8A2UB5QNeAdgDXgHVAVoCXwHbAV4CZQHlAV8BbQGAAfsBOQHSAfEB/wFAAdEB7gH/AUIB0gHu\n        Af8BQwHOAegB/wFEAc0B5QH/AUUBygHgAf8DXwHzAVsCXgHQAVACUgGkA0ABcAMlATdDAAQBAQIDAwEE\n        AwYBCAMKAQ4DEAQWAR4DGwEmAx8BLQMiATIDJAE1AyUBNwJYAWEB5gEKAS8BxwH/AVcCXAHfATUBRQFR\n        Af8BNwFGAYEB/wFRAZEBoQH/AUgBhwGVAf8BPgFOAYgB/wFSAZEBoAH/AYgBmwGrAf8BjAGgAbAB/wGQ\n        AaMBswH/AZMBpwG3Af8BmAGrAbsB/wGdAbABwAH/AZ8BsgHCAf8BpAG3AccB/wGnAbsBywH/AWABaAFu\n        AfwDYQHkA14B1QNcAdEDXQHXA18B4wJfAYMB+wFSAZ8B+AH/AYIBoAHwAf8BgwGfAegB/wGDAZ4B4gH/\n        AYMBnAHbAf8BggGbAdYB/wNfAfMDXgHQAVACUgGkA0ABcAMlATf/AEAABAEBAgMDAQQDBgEIAwoBDQMP\n        ARQDFQEdAxkBIwMdASkDHwEtAyEBMQMjATMDNQFWAcEBTQEAAf8BrQFDAQAB/wNfAeMBQwGDAZIB/wFN\n        AY0BngH/AYkBnwGyAf8BhgGcAa4B/wFBAYABjwH/ATgBSAGDAf8BgwGYAakB/wGHAZ0BsAH/AYgBngGx\n        Af8BiwGhAbQB/wGNAaQBtwH/AY8BpwG7Af8BkQGoAbwB/wGSAaoBvgH/AZQBrAHBAf8BlgGvAcMB/wGX\n        AbABxQH/AZgBsQHGAf8BmAGxAcYB/wGYAbEBxgH/AZkBsgHHAf8DXwHjA10BygJZAVcBvwJYAVYBwQFc\n        AloBzQJcAVUB6gGoAUEBAAH/AZ4BOgEAAf8BkgE1AQAB/wGMATEBAAH/AYYBLQEAAf8BgwErAQAB/wJN\n        ASkB+gFeAlsB0ANPAaUDQgF2Ay4BRwMSARgDCwEPAwgBCwMGAQgDBAEFAwMBBBMABAEBAgMDAQQDBgEI\n        AwoBDQMPBBQBHAMZASMDHQEpAx8BLQMhATEDIgEyAzoBYgEAAZ4BwwH/AQABogHIAf8DXQHtATMBQwFP\n        Af8BQAFRAYsB/wFSAZIBogH/AYIBlQGlAf8BQwFSAYwB/wE+AUwBhgH/AYcBmQGpAf8BjgGhAbEB/wGR\n        AaQBtQH/AZUBqQG5Af8BmAGrAbsB/wGcAbABvgH/AZ8BsgHCAf8BoQG0AcMB/wGgAbIBwAH/AZwBrAG7\n        Af8BlwGmAbMB/wGRAZ8BqwH/AZMBoQGuAf8BmAGnAbQB/wGfAa4BuwH/A2EB7gNgAd4DXQHXA14B2ANc\n        Ad8DZwHyAUYBxwHfAf8BRAHDAdgB/wFFAcAB1QH/AUIBvgHRAf8BQgG8Ac4B/wFCAb0BzwH/AV8BYAFq\n        AfsBWQJdAdcBVAJWAasDQwF4AysBQgMFAQcnAAQBAQIDAwEEAwYBCAMKAQ0DDwQUARwDGQEjAx0BKQMf\n        AS0DIQExAyIBMgM6AWIBCQEtAb0B/wEKAS8BxAH/A10B7QEzAUMBTwH/AUABUQGLAf8BUQGRAaEB/wGC\n        AZQBpAH/AUIBUQGKAf8BPQFLAYUB/wGDAZUBpAH/AYwBngGuAf8BjQGgAbAB/wGRAaQBswH/AZYBqQG4\n        Af8BmgGuAbwB/wGfAbIBwgH/AaMBtQHFAf8BpQG4AccB/wGrAb0BzQH/Aa8BwAHQAf8BsQHCAdEB/wGz\n        AcUB1AH/AbUBxwHWAf8BtwHIAdcB/wNkAewDYQHcA14B1QNdAdcDXAHfA2cB8gGFAZ0B2QH/AYQBmwHT\n        Af8BhAGaAc4B/wGAAZcByAH/AYABlgHEAf8BUQGUAcEB/wJfAWIB+wNdAdcBVAJWAasDQwF4AysBQgMF\n        AQf/ACQABAEEAgEDAwUBBwMKAQ0DDgQTARoDFwEgAxsBJgMdASoDHwEtAyABLgMhATEBTgJNAZYBsgFE\n        AQAB/wFfAV0BWAHjAY4BpQG4Af8BPwFQAYwB/wE/AVABjAH/AUwBjQGeAf8BSAGIAZgB/wE/AVEBjQH/\n        ASwBOgFHAf8BMgFCAVAB/wEsATsBRwH/ASoBOAFEAf8BPQFOAYkB/wE4AUkBhAH/AUEBgAGPAf8BhQGb\n        Aa0B/wGIAZ4BsQH/AYwBowG3Af8BkQGoAbwB/wGTAasBvwH/AZUBrgHCAf8BlwGwAcUB/wGYAbEBxgH/\n        AZgBsQHGAf8BmQGyAccB/wGZAbIBxwH/AZkBsgHHAf8BmQGyAccB/wGYAbEBxgH/A2QB7ANbAcsCVwFV\n        AboBVwJWAbgDWQHHA18B4AFEASABAAH/AUQBHwEAAf8BQgEfAQAB/wFEASEBAAH/AUUBIQEAAf8BSAEk\n        AQAB/wFKASYBAAH/AWECXgHaA1MBrANEAXkDCwEPAwQBBQ8ABAEEAgEDAwUBBwMJAQwDDQQSARkDFgEf\n        AxoBJQMdASkDHwEsAx8BLQMgAS8BUgJTAagBAAGbAb8B/wFZAmQB7AFNAY4BngH/ATgBRwGBAf8BPgFO\n        AYgB/wGAAZMBpAH/AYIBlQGlAf8BUQGRAaAB/wFAAU4BhwH/AUgBhAGRAf8BRgGCAY4B/wFHAYABjAH/\n        AYQBlAGiAf8BgAGPAZwB/wGGAZcBogH/AZgBqgG5Af8BlwGnAbUB/wGMAZwBqQH/AYYBkwGfAf8BhAGS\n        AZ0B/wGFAZIBnAH/AYcBlQGgAf8BjQGaAaYB/wGZAaYBsQH/AaEBsAG8Af8BqgG5AcQB/wGyAcEBzgH/\n        AbQBxAHQAf8BtAHDAdAB/wNlAfQDYQHhA2AB1gNgAdYDYQHaA2QB5wFAAbcBxwH/AUABuAHJAf8BPgG4\n        AcoB/wE7AbcByAH/ATgBtAHFAf8BMwGwAcIB/wEsAa0BvgH/AVoCYAHeAVUCVgGxAUUCRgF/AwUBBxMA\n        BAEEAgEDAwUBBwMJAQwDDQQSARkDFgEfAxoBJQMdASkDHwEsAx8BLQMgAS8CUgFTAagBCQErAbcB/wJZ\n        AWQB7AFLAYwBnAH/ATYBRAFRAf8BPAFMAYUB/wFOAY0BnQH/AVABjwGeAf8BSgGJAZcB/wE6AUcBUgH/\n        AT8BTQGFAf8BPQFLAYIB/wE+AUoBgQH/AUwBiAGTAf8BSQGEAY8B/wGAAZABmwH/AZQBpgG0Af8BnQGu\n        Ab0B/wGhAbQBwgH/AagBuQHIAf8BqwG9AcsB/wGyAcQB0QH/AbIBxAHRAf8BtwHIAdcB/wG6AcoB1wH/\n        AboBywHZAf8BuwHLAdkB/wG+Ac4B2wH/Ab8BzwHcAf8BvwHPAdwB/wNfAfMDXgHdA14BzgNdAcoDXAHR\n        A2EB5AGAAZUBwwH/AVEBkwG/Af8BTAGOAboB/wFJAYsBtwH/AUYBiAG0Af8BQgGDAa4B/wE7AVIBqwH/\n        AVoCYAHeAlUBVgGxAkUBRgF/AwUBB/8ACAABAQMAAQEHAAEBAwIBAwMFAQcDCAELAw0BEQMSARgDFgEe\n        AxoBJAMcAScDHQEqAx8BLAMfAS0DIAEvAl8BWgHbAaMBPAEAAf8BXAJZAc8BggGXAakB/wE+AVABiwH/\n        AS0BOwFJAf8BNgFGAYEB/wE1AUUBUgH/AS0BPAFIAf8BEwEdASYB/wEOARcBHwH/ARgBIwEsAf8BIwEw\n        ATsB/wEdASkBMwH/ARYBIgErAf8BLgE9AUoB/wFHAYcBlwH/AUwBjQGeAf8BUgGUAaUB/wGFAZsBrQH/\n        AYsBoQG0Af8BjwGnAbsB/wGUAawBwAH/AZYBrwHDAf8BlwGwAcUB/wGYAbEBxgH/AZgBsQHGAf8BmAGx\n        AcYB/wGYAbEBxgH/AZcBsAHFAf8BlAGsAcEB/wGNAaQBtwH/AYEBlgGoAf8BRQGFAZQB/wE6AUsBhgH/\n        A18B+wJaAV8B3gNaAc0DWQHEA1oBygNeAdoBXwFGASEB+wFBAR8BAAH/AUcBIwEAAf8BTAEnAQAB/wNH\n        AYMDBwEKAwQBBQ8AAQEDAgEDAwQBBgMHAQoDDAQQARYDFAEcAxgBIQMaASQDHAEnAx0BKQMdASoDHgEr\n        AV4CZQHlAQABnAG/Af8BXAJhAdwBTwGQAaAB/wFDAYEBjwH/ATwBSwGGAf8BUAGQAZ4B/wGDAZcBpwH/\n        AVEBkAGfAf8BNQFBAUwB/wEvATsBRAH/AT0BSwGCAf8BTAGIAZUB/wFFAVIBiQH/AToBRQFOAf8BTAGG\n        AZEB/wGGAZUBogH/AVABiwGXAf8BTQGFAZAB/wFKAYMBjgH/AUoBhAGNAf8BTAGEAY4B/wFSAYsBlAH/\n        AYcBlAGeAf8BkAGbAaYB/wGYAaYBsAH/AaEBrgG6Af8BpAGwAbsB/wGdAaoBswH/AZQBnwGnAf8BggGK\n        AZEB/wE3AToBPQH/AhgBGwH/AgABAwH/ASIBJQEpAf8BVwFaAV0B/ANfAeMDXAHPA1sBxANcAckDYQHa\n        Al8BZAH7ATABrgHAAf8BLAGrAb0B/wEnAagBugH/AUgCSQGIFwABAQMCAQMDBAEGAwcBCgMMBBABFgMU\n        ARwDGAEhAxoBJAMcAScDHQEpAx0BKgMeASsCXgFlAeUBCQErAbYB/wJYAV4B3QFMAYwBmwH/ATwBTAGF\n        Af8BMwFBAU0B/wFCAYABiwH/AUUBhAGQAf8BPQFMAYQB/wElAS8BNwH/AR4BKAEtAf8BKQE1ATsB/wEy\n        AT4BRgH/AS8BOQE+Af8BKQEzATgB/wFAAUsBgAH/AYUBlAGfAf8BjQGdAagB/wGWAaYBsgH/AZ4BrQG7\n        Af8BpwG4AcQB/wGtAbwBygH/AbIBwwHPAf8BtwHIAdUB/wG6AcoB2AH/AbsBzAHYAf8BvQHNAdoB/wG/\n        Ac4B2wH/Ab8BzwHbAf8BwAHPAdsB/wHBAdAB3QH/AcAB0AHdAf8BwQHQAd0B/wHAAc8B3AH/AcABzwHc\n        Af8BYgFwAXkB+wNeAd0DWwHLA1sBwwNdAcoDYQHaA18B+wE9AYABqgH/ATkBTwGnAf8BNgFNAaYB/wJI\n        AUkBiP8ADAABAQMABAEBAgMDBAQBBgMHAQoDDAQQARYDFQEdAxgBIQMbASYDHQEpAx0BKgMfASwDIAEv\n        AzQBVQG3AUQBAAH/AZQBMgEAAf8DXwHjAUQBgwGTAf8BNwFIAYIB/wEkATEBPAH/ASIBLgE4Af8BJwE1\n        AUAB/wEhAS4BOQH/ARkBJAEtAf8BIAEtATcB/wEnATUBQAH/ASkBNwFDAf8BEQEbASQB/wESAR0BJQH/\n        ASwBOgFGAf8BKQE3AUIB/wEpATcBQgH/ASgBNgFCAf8BNgFGAYEB/wFPAZABoQH/AYYBnAGuAf8BjQGk\n        AbcB/wGRAakBvQH/AZQBrAHBAf8BlQGtAcIB/wGVAa4BwgH/AZYBrwHDAf8BlgGvAcMB/wGUAawBwQH/\n        AZEBqAG8Af8BiAGeAbEB/wFNAY4BnwH/AT0BTgGJAf8BMQFAAU0B/wEpATcBQwH/ASYBNAE/Af8BKAE1\n        AUEB/wEqATgBRAH/AS4BPQFKAf8BNAFEAVEB/wFeAWMBZQHlAWgCUQH3AUcBJAEAAf8BWQJWAb4DDQES\n        AwYBCAMEAQULAAEBAwIBAwMEAQUDBwEJAwoBDgMPARQDEgEZAxUBHQMXASADGQEjAxoBJAMaASUDGwEm\n        AzUBWAEAAZYBtgH/AQABmwG/Af8DXwHoAU8BjwGfAf8BTgGOAZ4B/wFCAYABjgH/AUgBhQGTAf8BgwGX\n        AacB/wGAAZIBoQH/AUkBhgGSAf8BUgGQAZ0B/wGMAZ0BrQH/AYgBmwGpAf8BNwFCAUwB/wExATwBQwH/\n        AUIBTwGFAf8BOgFEAU4B/wE1AT8BRwH/ATABOQFAAf8BNAE8AUUB/wFBAUsBgQH/AUMBTQGEAf8BSQGA\n        AYgB/wFOAYYBjwH/AYYBkgGcAf8BiAGSAZsB/wFRAYYBjQH/AUABRQFLAf8BKgEsATAB/wESARMBGAH/\n        AQABAgENAf8CAAEUAf8CAAEZAf8CAAERAf8CAAECAf8BOAE+AUEB/wGKAZYBnwH/AaUBsgG9Af8BtAHE\n        AdAB/wG6AcsB2AH/AbkBygHZAf8DYQHkAWICbQH3AS0BrQG+Af8BWQJbAcMDAwEEEwABAQMCAQMDBAEF\n        AwcBCQMKAQ4DDwEUAxIBGQMVAR0DFwEgAxkBIwMaASQDGgElAxwBKAM2AVkBBwEpAaoB/wEHASkBsAH/\n        A1wB6gFBAVIBiwH/ATsBSwGEAf8BKwE5AUEB/wEsATgBQAH/ATABPgFGAf8BLAE4AT8B/wEhASwBLwH/\n        ASQBLgEzAf8BKwE2ATsB/wEpATUBOQH/ARgBIAEiAf8BGwEkASUB/wEwATsBPwH/ATQBPQFCAf8BOgFE\n        AUkB/wE+AUgBTQH/AU8BiAGQAf8BlgGkAa8B/wGjAbIBvgH/AawBvAHHAf8BswHCAdAB/wG4AcgB1gH/\n        AbsBywHYAf8BvwHOAdwB/wG/Ac8B3AH/AcEB0AHdAf8BwQHQAd0B/wHBAdAB3QH/AcIB0QHdAf8BwQHQ\n        Ad0B/wHBAdAB3QH/Ab8BzwHcAf8BvgHNAdoB/wG8AcwB2QH/AboByQHWAf8BtAHEAdEB/wGxAcIBzwH/\n        Aa0BvQHLAf8DYQHmAWoCbQH3ATgBTgGmAf8BWQJbAcQDBAEG/wAMAAQBBAIBAwMFBAcBCgMMBBABFgMV\n        AR0DFwEgAxwBJwMeASsDIAEuAyEBMQMjATMDJQE3AVECTwGcAZsBNAEAAf8BZAJcAecBOwFMAYgB/wEx\n        AUEBTgH/ASsBOQFFAf8BIwEwATsB/wEWASEBKgH/ARQBHwEoAf8BHQEqATQB/wEdASoBNAH/AR8BKwE1\n        Af8BHwErATUB/wEgASwBNwH/ARcBIgErAf8BGQElAS4B/wEjATABOwH/ASYBNAFAAf8BJQEzAT4B/wEm\n        ATQBPwH/AScBNQFAAf8BKQE4AUQB/wE7AUwBhwH/AYIBlwGpAf8BiQGfAbIB/wGMAaMBtwH/AY4BpQG4\n        Af8BjgGlAbkB/wGPAacBuwH/AY8BpwG7Af8BjgGlAbgB/wGJAaABswH/AYEBlgGoAf8BRQGFAZQB/wE1\n        AUUBUQH/ASkBNwFCAf8BIgEvAToB/wEgASwBNwH/ASIBLgE5Af8BJQEyAT0B/wEpATcBQwH/ATIBQQFO\n        Af8BLAIrAfwBQgEgAQAB/wFfAlcB6AMcAScDCAELAwQBBQMCAQMHAAQBAQIDBAEFAwYBCAMJAQwDDQER\n        AxABFgMTARoDFQEdAxYBHwMXASADGAEhAxgBIgMYASIBUQJSAaEBAAGVAbUB/wFVAlwB6gFPAZABoAH/\n        AVEBkQGiAf8BUgGSAaIB/wFRAZIBowH/AUYBgwGRAf8BSAGFAZMB/wGFAZgBpgH/AYYBmAGoAf8BgQGS\n        AaIB/wFLAYgBlQH/AUIBUAGIAf8BMwE+AUcB/wEvATkBQgH/ATcBQQFLAf8BNQE/AUgB/wExAToBQgH/\n        AS4BNgE+Af8BLAEzAToB/wEqATIBOAH/ATEBOQE/Af8BOwFDAUoB/wE0AToBPgH/ASwBMQE0Af8BIQEm\n        ASoB/wEPARABFgH/AQABBAEQAf8BAAEJASMB/wEAAQMBHwH/AQABAQEZAf8BAAEGASIB/wEAAQUBHwH/\n        AgABFQH/AwAB/wEXAhgB/wFGAVABhAH/AZYBogGsAf8BrQG7AcgB/wG2AcYB1AH/AbgBygHYAf8BQQFn\n        AW4B/AE0AbEBwwH/AVUCXAHqAxMBGhMABAEBAgMEAQUDBgEIAwkBDAMNAREDEAEWAxMBGgMVAR0DFgEf\n        AxcBIAMYASEDGAEiAxoBJQJQAVIBpAEFASUBoQH/AlkBZAHsATsBTAGFAf8BMwFCAUwB/wEsATkBQQH/\n        ASIBLgE0Af8BFgEgASIB/wESARsBHAH/ARcBIQEiAf8BFAEdAR4B/wERARoBGwH/AREBGQEYAf8BDgEW\n        ARUB/wELAREBEAH/AQwBEwERAf8BFAEbARoB/wEbAiMB/wEjASsBLAH/ASoBMwE1Af8BNgE/AUIB/wE/\n        AUkBTgH/AYQBjwGWAf8BngGsAbYB/wGrAboBxQH/AbYBxgHRAf8BvQHMAdkB/wG+Ac4B2gH/AcABzwHc\n        Af8BwQHPAdwB/wHCAdEB3QH/AcIB0QHeAf8BwwHRAd4B/wHBAc8B3AH/AcABzwHcAf8BvQHMAdkB/wG8\n        AcoB1wH/AbUBxAHRAf8BsAG/AcsB/wGqAbgBxQH/AZ8BrgG6Af8BmgGoAbMB/wJAAZgB/QEyAUUBlQH/\n        AVkCZAHsAxwBJwMEAQUDAAEBAwABAf8AAQADAQQCBAMBBAMFAQcDCQEMAw4BEwMSARgDFgEeAxkBIwMd\n        ASoDIQEwAyUBNwMoAT0DKwFCAy4BRwNfAeABTAEiAQAB/wNaAdsBKwE5AUUB/wEiAS8BOgH/AR4BKgE1\n        Af8BHAEnATEB/wEXASABKgH/AQABBQEQAf8BDwEVAR0B/wEaASYBLgH/ARkBJQEuAf8BHgEoATAB/wEX\n        ASEBKQH/ARsBJgEwAf8BHAEnATEB/wEdASkBMwH/AR8BLAE2Af8BIAEsATcB/wElATIBPQH/ASgBNgFC\n        Af8BMAE/AUwB/wE7AUwBhgH/AUcBhwGXAf8BTwGQAaEB/wFSAZQBpQH/AYABlQGmAf8BgQGWAagB/wGC\n        AZcBqQH/AYIBlwGpAf8BgAGVAacB/wFQAZEBogH/AUgBiAGYAf8BPAFMAYgB/wEZASEBKAH/AQABAQEE\n        Af8BBAEKARAB/wEMARQBGgH/ARQBHgElAf8BHgEqATMB/wEpATcBQgH/ATQBKwEOAf8BOwEaAQAB/wJA\n        AS0B/QMyAVADCgEOAwQBBQMCAQMDAQECAwAEAQQCAQMDBAEGAwcBCgMLAQ8DDgETAxABFgMSARkDFAEb\n        AxQBHAMVAR0DFQEdAxYBHgMWAR4BXQJhAeIBAAGVAbUB/wFbAl4B2QFRAZEBogH/AVEBkgGiAf8BUgGR\n        AaEB/wGAAZQBpQH/AVIBkwGiAf8BQwGAAY0B/wE6AUkBggH/AUUBgQGOAf8BOgFIAYAB/wE0AUABSgH/\n        AS4BOgFDAf8BKwE2AT8B/wErATYBPQH/ASoBNQE8Af8BKgEzAToB/wEoATABOAH/ASgBLwE3Af8BJQEr\n        ATAB/wEdASABIgH/ARUBGAEbAf8BDwEUARwB/wEHAQwBGAH/AQEBCQEbAf8BAgETAS0B/wEAARUBMwH/\n        AQABEgEzAf8BAAELASQB/wMAAf8DAAH/AQABBQEfAf8BAAEJASQB/wIAARYB/wMAAf8DAAH/AS8BNQE6\n        Af8BgQGKAZMB/wGfAawBtwH/AbEBwQHNAf8BjgG/Ac8B/wE6AbYByAH/AUACqAH9Ay8BShMABAEEAgED\n        AwQBBgMHAQoDCwEPAw4BEwMQARYDEgEZAxQBGwMUARwDFQEdAxYBHgMYASEDGwEmAloBYQHkAQIBHwGT\n        Af8CXQFhAeIBKwE4AUAB/wEfASsBMAH/ARYBIAEjAf8BEAEZARoB/wEJAREBEAH/AQABBgEEAf8BAAEB\n        AQAB/wEAAQUBBAH/AQACAgH/AQABAQEAAf8DAAH/AQABAQEAAf8BAAEDAQAB/wEBAQcBAwH/AQUBDAEI\n        Af8BDAESAQ8B/wEUARsBGgH/ASACKAH/ATEBOwE9Af8BRAFOAYAB/wGIAZQBnAH/AZ0BqwGzAf8BsAG+\n        AcoB/wG5AckB1QH/Ab8BzgHbAf8BwgHRAd4B/wHDAdIB3gH/AcMB0QHdAf8BwwHSAd4B/wHBAdAB2wH/\n        Ab8BzgHaAf8BvAHKAdYB/wG5AcYB0wH/AbABvgHKAf8BqAG1AcAB/wGbAacBswH/AY0BmQGiAf8BSgGC\n        AYoB/wEiAS0BPwH/AQgBFQEtAf8BQgFOAWkB/gNBAXMDEQEXAwcBCgMAAQEDAAEB/wABAAMCAQMDAgED\n        AwQBBgMHAQoDCwEPAw4BEwMSARkDFgEeAxoBJQMfASwDJAE2AyoBQAMwAUsDNAFVA0MBeAFOASEBAAH/\n        ATIBEgEAAf8DWAHpAR8BLAE3Af8BGgEmAS8B/wEXASMBLAH/ARcBHwEoAf8DAAH/AwAB/wMAAf8BAAED\n        AQoB/wEUARgBIwH/AgABEgH/AgABCwH/AQQBCgEUAf8BGQEkAS0B/wEZASQBLgH/ARkBJQEuAf8BGgEm\n        ATAB/wEcASgBMgH/ASEBLQE4Af8BJgEzAT8B/wEvAT4BSgH/ATcBSAGCAf8BPQFPAYoB/wE+AVABjAH/\n        AUABUQGNAf8BQAFSAY4B/wFCAYEBkAH/AUIBgQGQAf8BQAFSAY4B/wE+AVABjAH/ATkBSgGFAf8BLgE8\n        AUgB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BBQIAAf8BIwELAQAB/wNQAZ4DGwEmAw0BEQME\n        AQYDAQECAwABAQMABAEBAgMEAQUDBgEIAwkEDAEQAw4BEwMQARUDEQEXAxIBGAMSARgDEgEZAxIBGQMT\n        ARoDMAFMAQABjwGsAf8BAAGTAbIB/wFaAmEB5AFQAZABoAH/AVABkQGiAf8BUQGRAaIB/wFOAY4BnwH/\n        AUgBhwGVAf8BPwFPAYgB/wE0AUIBTgH/AS4BOQFEAf8BKAEzAT0B/wElATABOAH/ASQBLgE2Af8BIQEq\n        ATIB/wEfASYBLQH/AR4BJQErAf8BGgEgASUB/wESARYBGgH/AQkBDgEVAf8BBgEPARsB/wEHARYBKgH/\n        AQMBEwErAf8BBAEXATEB/wEGARsBOQH/AQABAwEWAf8BAAEGAR0B/wEDARcBNwH/AQEBFgE1Af8BAAEJ\n        ASIB/wMAAf8CAAEBAf8BAAEGASIB/wEAAQgBJAH/AgABGgH/AwAB/wMAAf8BGQEcAR0B/wFAAUgBTgH/\n        AZABmwGkAf8BlgGzAcAB/wE8AbUBxgH/ATwBtwHIAf8BSAJJAYgXAAQBAQIDBAEFAwYBCAMJBAwBEAMO\n        ARMDEAEVAxEBFwMSARgDEgEYAxIBGQMUARsDGgEkAzcBWwEBARsBiAH/AQABFgFPAf8DWAHvARkBJAEo\n        Af8BDwEYARoB/wEDAgsB/wIAAQIB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA\n        Af8DAAH/AQABAQEAAf8BAwEJAQUB/wEMARMBDwH/ARkBHwEeAf8BLAE0ATUB/wFFAU8BgAH/AY8BmwGh\n        Af8BpQGyAbsB/wG1AcIBzgH/AbwBygHWAf8BwgHQAd0B/wHCAdEB3QH/AcABzgHaAf8BwAHNAdkB/wG8\n        AcsB1gH/AbcBxQHQAf8BsgG+AckB/wGnAbQBvgH/AZsBpwGyAf8BiAGTAZwB/wFEAU0BgQH/ASgBLwE1\n        Af8BCQEQARsB/wIAARQB/wEAAQkBJwH/Ak4BUAHwA0oBjAMeASsDDAEQAwMBBAMBAQL/AAEAAwIEAwEE\n        AwYBCAMJAQwDCwEPAw4BEwMSARgDFAEcAxoBJAMgAS4DJwE7Ay4BRwM1AVcDPAFmA1YBuQExAREBAAH/\n        A1QB7gEdASgBMgH/ARgBIwEtAf8BDQEXAR8B/wEUAR4BJgH/AwAB/wMAAf8CAAENAf8DAAH/AwAB/wIA\n        ARAB/wEAAQcBIAH/AQABBAEZAf8DAAH/AQIBBwEVAf8BAAEFARUB/wMAAf8BBQELARsB/wEaASQBLgH/\n        ARsBJwExAf8BHgEqATUB/wEiAS8BOQH/AScBNQFAAf8BKwE5AUUB/wEsAToBRgH/ASwBOgFGAf8BLgE8\n        AUkB/wEuAT0BSgH/AS8BPgFKAf8BLQE8AUgB/wErAToBRgH/ASkBNwFDAf8BJAEwATwB/wMAAf8DAAH/\n        AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A1UB6gNKAY0DOgFhAygBPAMXASADCwEPAwQBBgMBBAIBAwME\n        AQYDBwQJAQwDCwEPAw0BEQMNARIDDgETAw8BFAMPARQDEAEVAxABFQMQARUBTwJQAZsBAAGLAacB/wFc\n        AmQB5wFQAZEBogH/AU0BjgGdAf8BOwFNAYYB/wFAAVABjAH/ATkBSQGEAf8BMAE+AUkB/wEnATIBPAH/\n        ASMBLgE3Af8BHwEpATEB/wEcASUBLAH/ARkBIAEoAf8BFQEcASIB/wESARcBHQH/AQwBEgEWAf8BBwEP\n        ARsB/wEGARMBJgH/AQcBHAE5Af8BCgEfAUAB/wEJASABQgH/AQkBIgFBAf8BCAEeAT8B/wEKASABQAH/\n        AQEBFAEvAf8DAAH/AgABEQH/AQABFQE1Af8BAAESATEB/wEAAQcBIQH/AwAB/wIAAQIB/wEAAQkBIwH/\n        AQABCwEnAf8BAAEDAR0B/wMAAf8DAAH/AQkCCgH/ASsBMgE3Af8BTAGGAY4B/wFAAZ4BqAH9ATwBsAHA\n        Af8DWQHHAwABARQAAwEEAgEDAwQBBgMHBAkBDAMLAQ8DDQERAw0BEgMOARMDDwEUAw8BFAMRARcDFAQb\n        ASYDUwGqAQABEwFIAf8CUwFgAfEBFgEhASQB/wEKARIBFAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/\n        AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BBwEMAQoB/wEZAR8BHgH/\n        ATEBOQE7Af8BSwGDAYcB/wGaAaUBrQH/AawBuAHDAf8BuwHIAdQB/wHAAc8B2gH/Ab4BzQHZAf8BvAHK\n        AdUB/wG2AcQBzwH/Aa8BuwHGAf8BpwG0Ab4B/wGdAagBsgH/AY4BmAGhAf8BRgFPAYMB/wEwATYBPAH/\n        ARoBHwEkAf8BAwEKARIB/wIAARMB/wEAAQwBKQH/ARQBMAGNAf8BTgFaAV0B8ANdAe0DPgFsAw0BEQMC\n        AQMDAAEB/wABAAMCBAMBBAMGBAgBCwMKAQ4DDQERAxABFQMTARoDGAEiAx8BLAMnATsDLwFKAzgBXQM/\n        AW8BXwJXAegBIwEJAQAB/wNfAeABGQElAS4B/wEXASIBKwH/AREBGwEjAf8BAAEBAQIB/wMAAf8BJwEo\n        AY0B/wGNAZMBwwH/ARIBFQEwAf8CAAEEAf8BCQERASwB/wMAAf8DAAH/AwAB/wIAAQQB/wMAAf8CAAEW\n        Af8CAAEIAf8BCgERARkB/wEXASIBKwH/ARgBIwEtAf8BGwEnATEB/wEeASoBNAH/AR8BLAE2Af8BHwEr\n        ATUB/wEgASwBNwH/AR8BKwE1Af8BIAEsATcB/wEhAS4BOAH/ASABLQE4Af8BHwEsATYB/wEeASoBNQH/\n        AR0BKAEzAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AyEB+wNWAbgDSwGOAzwBaAMuAUcDHwEt\n        AxIBGQMJAQwDAQQCAQMDBAQGAQgDBwEKAwkBDAMKAQ0DCgEOAwsBDwMLAQ8DCwEPAwsBDwMMARADDAEQ\n        AVcCXAHfAQABigGmAf8BWgJdAdMBTAGLAZsB/wFBAVIBjgH/ATABPQFLAf8BKgE4AUMB/wEjAS8BOQH/\n        AR8BKgEyAf8BGgEjASsB/wEWAR4BJAH/AQ8BFwEcAf8BDAETARoB/wENARYBIAH/ARABGwEqAf8BEQEi\n        ATcB/wENASUBQgH/AQ8BJQFGAf8BCwEkAUUB/wELASQBRQH/AQkBIQE/Af8BBgEcATwB/wEHAR0BPAH/\n        AQgBHgE8Af8BBwEeATwB/wEAAQ8BKQH/AwAB/wIAAQ4B/wEAARMBMgH/AQABEAEtAf8BAAEIAR8B/wMA\n        Af8CAAEFAf8BAAEMASkB/wEAAQkBJgH/AQABAwEfAf8CAAEEAf8DAAH/AwAB/wEYARwBIAH/AVEBbAF0\n        Af4BLAGQAZwB/wFgAmQB8QMYASIDAAEBFAADAQQCAQMDBAQGAQgDBwEKAwkBDAMKAQ0DCgEOAwsBDwML\n        AQ8DCwEPAw0BEgMUARsDMAFMAlwBZAHnAQABDAE4Af8DWQHsAREBGwEsAf8BBgEQASYB/wIAAQcB/wMA\n        Af8CAAEBAf8CAAEJAf8CAAELAf8CAAENAf8CAAEGAf8CAAECAf8CAAEBAf8CAAECAf8CAAECAf8CAAED\n        Af8CAAEDAf8CAAEDAf8DAAH/AwAB/wIAAQEB/wIAAQwB/wEDAQoBHwH/ARwBJQExAf8BPgFHAUwB/wGK\n        AZQBmwH/AaUBsgG8Af8BswG/AcgB/wG8AccB0QH/AboBxwHSAf8BsgG/AckB/wGnAbMBvQH/AZsBpgGw\n        Af8BkAGbAaQB/wFPAYYBjQH/ATsBQgFIAf8BKAEuATQB/wEdASMBKAH/AQoBEQEaAf8BAAEEARoB/wEA\n        ARQBNwH/ARsBOgGfAf8CTQFqAfoBRwJqAfkDXwHgA0UBfgMQARYDAwEE/wAFAAMCBAMBBAMFBAcBCQMN\n        ARIDHAEoAxwBJwMcASgDHAEoAx8BLAMnATsDMAFMAzkBYANIAYUBMgERAQAB/wEgAQgBAAH/A1cB6AEb\n        ASYBLwH/AQABAgEHAf8CBQEUAf8DAAH/ASwBLwFRAf8BygHSAfwB/wGYAaABxwH/AgABDwH/AgABCQH/\n        AwAB/wMAAf8CAAEDAf8BCwESAS4B/wEIAQ0BKgH/AQsBEAEnAf8BFgEbAS0B/wMAAf8DAAH/ARMBGAEn\n        Af8BAAEHARIB/wEVAR4BJgH/ARkBJAEtAf8BGgElAS8B/wEZASMBLQH/ARkBJQEuAf8BGQElAS4B/wEY\n        ASMBLQH/ARkBJAEuAf8BGAEjAS0B/wEYASMBLQH/ARgBIwEtAf8BGwElATAB/wMAAf8DAAH/AwAB/wMA\n        Af8DAAH/AwAB/wMAAf8DWgHbA1MBrANIAYYDOgFhAyoBQQMcASgDEQEXAwcBCgMBBAIBAwMEAQUDBAEG\n        AwUBBwMGAQgDBwEJAwcBCQMHAQkDBwEKAwcBCgMHAQoDBwEKAykBPgEAAYgBnwH/AQABhgGfAf8BWAJf\n        AeMBOAFHAYEB/wEbASYBLwH/ARABGAEgAf8BEQEaASEB/wEQARgBHgH/AQsBEgEXAf8BCQERARgB/wEP\n        ARgBJQH/ARcBKQE8Af8BGQEwAUoB/wEYAS4BTwH/ARMBKwFLAf8BEAElAUYB/wELASABQgH/AQoBHwFA\n        Af8BBgEeATwB/wEGARwBOQH/AQQBGgE5Af8BBAEaATkB/wEGARoBOgH/AQUBGwE6Af8BAAEVATMB/wEA\n        AQ4BJgH/AwAB/wIAAQwB/wEAAREBMAH/AQABDgEtAf8BAAEIASEB/wMAAf8DAAH/AQABCQEkAf8BAAEL\n        ASYB/wEAAQgBJAH/AgABBwH/AwAB/wMAAf8BBQEJAQwB/wENAScBLgH/ASMBTwGHAf8DSAGFAxABFgMF\n        AQcDAAEBEAADAQQCAQMDBAEFAwQBBgMFAQcDBgEIAwcBCQMHAQkDBwEJAwcBCgMIAQsDDAEQAxQBHAM6\n        AWEBAAERAUEB/wEAAQoBLgH/AUgCXAH4ARkBJAFEAf8BAAEFASEB/wEAAQIBHQH/AgABEQH/AgABCgH/\n        AgABAwH/AgABAQH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AgABAgH/AgABBwH/AgABCwH/AgABDAH/\n        AgABBgH/AgABAgH/AwAB/wIAAQMB/wEGAQ0BIwH/ASsBMwFFAf8BUAGHAY4B/wGZAaUBrAH/AasBuAHB\n        Af8BtAHAAckB/wGwAbwBxwH/AaUBsQG6Af8BlgGhAaoB/wGHAZEBmQH/AU0BgwGKAf8BPgFGAUwB/wEx\n        ATgBPgH/ASsBMgE4Af8BEwEdASkB/wEAAQgBHwH/AQMBGAE8Af8BHwFEAakB/wFVAV8BeQH7A20B9wNe\n        AdkDSgGKAyMBNAMHAQkDAQEC/wAFAAMFAQcDCgENAw4BEwMQARUDMAFNA0sBjgNRAacDVwHCA1UBugNR\n        AacDOgFhAy4BRwM2AVkDVQGxAS4BEAEAAf8DWQHrASUBMgE9Af8BAAEBAQkB/wENAQwBMQH/AYsBkAHJ\n        Af8BgAGFAbMB/wEdASEBOgH/ATABMwFDAf8CAAEEAf8DAAH/AgABAQH/AwAB/wMAAf8CAAEYAf8BAgEK\n        AScB/wEPARUBLwH/ATABNAFJAf8DAAH/AwAB/wELAREBKgH/AgABAwH/AgABDwH/AQoBDQEhAf8BFwEg\n        ASgB/wEZASQBLgH/ARgBJAEtAf8BGAEjAS0B/wEXASIBKwH/ARkBJAEuAf8BGQEkAS4B/wEYASMBLQH/\n        ARgBIwEtAf8BFwEiASsB/wEaASMBLwH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A0wB8wNZAccDUgGm\n        A0YBgQM4AV0DKQE+AxsBJgMQARUDBwEKAwAEAQQCAQMDAgQDBAQBBQMEAQUDBAEFAwQBBQMEAQUDBAEF\n        AwQEBQEHA04BlAEAAYEBmQH/AVgCYgHpATABPgFKAf8BIgEsATYB/wENARQBGgH/AQUBCgEPAf8BCwEV\n        AR8B/wEUASEBMwH/ARwBLgFBAf8BIgE2AU0B/wEUASkBQgH/AREBKAFBAf8BFAEtAUkB/wEOASUBQwH/\n        AQkBIgE8Af8BBwEfATsB/wEGAR0BOQH/AQYBGgE4Af8BBQEaATcB/wEFARkBNwH/AQQBGQE2Af8BBAEa\n        ATUB/wEEARcBNQH/AQMBFwE2Af8BAgEWATYB/wEAAQ0BJgH/AwAB/wIAAQ8B/wEAAREBMQH/AQABBQEe\n        Af8CAAEKAf8DAAH/AwAB/wIAARQB/wEAAQsBKAH/AQABCQEjAf8CAAEIAf8DAAH/AwAB/wMAAf8BAwEV\n        ARkB/wNfAeADNQFWAxwBKAMLAQ8DAwEEEwAEAQQCAQMDAgQDBAQBBQMEAQUDBAEFAwQBBQMEAQUDBgQI\n        AQsDEgEZA1MBqgEAAREBPAH/AUIBRAFZAfUBKgE3AYgB/wEXASIBRwH/ARQBHgE9Af8BAwEQAS0B/wIA\n        ARMB/wIAAQsB/wIAARgB/wEAAQcBIwH/AQIBDwEqAf8BBwEaATUB/wEGAR0BOgH/AQUBHgE8Af8BAQEZ\n        ATMB/wEAARABJwH/AQABBQEWAf8BAAEBARIB/wIAARIB/wIAARMB/wIAAREB/wIAAREB/wIAAREB/wIA\n        AQwB/wEBAQYBHAH/AR0BJAE6Af8BNwFAAVEB/wGNAZgBnwH/AaMBrgG2Af8BqQG2Ab8B/wGnAbIBvAH/\n        AZYBoQGpAf8BhwGQAZgB/wFOAYQBiwH/AUwBgQGIAf8BRwFPAYMB/wE2AUABRwH/AQ0BFgEmAf8BAAEH\n        ASAB/wEEARsBQAH/ARABLQGPAf8BVgJ/Af4CagFrAfkDWwHLAz8BbQMcAScDBwEJAwIBAwMAAQH/AAUA\n        AwoBDgMWAR4DIQEwAyoBQQM9AWoDTgGUA1QBqwNYAcADWwHQA1QB7gNZAdIDPQFpAzcBWwFgAlsB4QEy\n        ARMBAAH/A1oB0wEhASsBMwH/AQcBCwEfAf8BpAGpAeQB/wG4AcIB+AH/ATwBQwGVAf8DAAH/AwAB/wIA\n        AQkB/wEQARoBNQH/ARABFwE1Af8BAAEBARwB/wIAAQ0B/wMAAf8DAAH/ARsBHwE3Af8CAAEJAf8DAAH/\n        AQYBDwEyAf8BAAEEASIB/wIAARcB/wEYAR0BQgH/AR4BJAE1Af8BHwEpATMB/wEeASoBNQH/AR4BKgE1\n        Af8BHgEqATUB/wEdASkBMwH/AR0BKQEzAf8BHAEoATIB/wEcASgBMgH/ARwBJwExAf8BGwEnATEB/wEa\n        ASIBLgH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BNgEzAS0B/QNaAd4DVwHCA1EBoQNEAXwDNgFZAygBPAMa\n        ASQDDgETAwcBCQcAAQEDAAQBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMDAQQBWAJe\n        Ad0BAAFLAY4B/wJaAV4B2wEmATQBPwH/ARwBLAE8Af8BGAEsAUMB/wEgATcBUAH/ASABNgFQAf8BGAEr\n        AUMB/wEPASEBNwH/AQMBEgEmAf8BAAEMASEB/wEGARcBLgH/ARIBJwFHAf8BEQEpAUkB/wEOASQBQgH/\n        AQsBIAE/Af8BBwEdATwB/wEFARsBOgH/AQYBGgE4Af8BAgEZATUB/wEBARcBNAH/AQEBFwE0Af8BAAEW\n        ATQB/wEAARUBNAH/AQEBFgE0Af8BAAEJASMB/wMAAf8DAAH/AQABBAEbAf8CAAEXAf8DAAH/AwAB/wMA\n        Af8CAAEVAf8BAAEOASkB/wEAAQsBJAH/AgABCwH/AwAB/wMAAf8DAAH/AysB/ANWAbYDQQFyAycBOwMS\n        ARgDBgEIAwABARMAAQEDAAQBAQIDAQECAwEBAgMBAQIDAQECAwEBAgMBAQIDAwEEAwcBCgMTARoCWAFf\n        AeMBCgEdAUUB/wFIAlkB9QEkATYBjgH/ASwBOwGNAf8BHQEnAUcB/wECAQ0BKAH/AQwBGgE3Af8BGwEx\n        AYMB/wEYATcBkgH/ARcBNwGUAf8BFAE1AZAB/wESATABiQH/AQ8BKgGBAf8BCwEmAUwB/wEIASEBRgH/\n        AQYBIAFDAf8BBgEfAUEB/wEFARwBPgH/AQMBFwE1Af8BAAEOAScB/wEAAQMBGQH/AQABBgEaAf8BAAEH\n        ARkB/wEBAQUBGAH/AQsBDgEjAf8BEgEaATAB/wErATQBTAH/AUkBUQGRAf8BlwGhAagB/wGkAa8BtwH/\n        AZoBpQGuAf8BkwGdAaUB/wGMAZUBnQH/AYQBjQGVAf8BUAGFAY0B/wEyATwBRgH/AQABCgEbAf8BAAEH\n        ASMB/wEGARsBQwH/ARQBMgGaAf8BLgGKAekB/wNfAfMDVgG0AzIBUAMQARYDBAEGAwEBAgMAAQH/AAkA\n        AwsBDwMWAR8DIwE0AzIBUQNBAXIDTAGTA1YBswNaAc0DXwHgA1UB6gNMAfMDXgHlA1sB4QESAgAB/wEm\n        AQ0BAAH/A1UB6gMAAf8BAAEBAREB/wEwATUBiAH/ASIBKwFIAf8BGQEjATsB/wESARoBNwH/AgABHgH/\n        AQABAgEkAf8BEwEjAUcB/wEoATEBgQH/AR8BJwFGAf8BCgENASgB/wIAAQIB/wIAAQwB/wIAARIB/wMA\n        Af8BAAEBARsB/wEYAR8BRQH/AQABBAEnAf8BCwEaAUUB/wEpATABUgH/ARQBGwEjAf8BKwE5AUUB/wEq\n        ATgBRAH/ASgBMwE+Af8BEgEbASUB/wEeASYBMAH/AScBNQFAAf8BJwEzAT0B/wEUAR0BJwH/ARgBJAEt\n        Af8BIwEwATsB/wEXASABLAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DWQHyA14B2gNWAb4DUAGdA0MBdwM1\n        AVYDJgE5AxgBIQMNARIDBgEIDwABAQMAAQEDAAEBAwABAQMAAQEDAAEBAwABAQMAAQEDAAEBAyUBNwEA\n        AVIBmAH/AQABQwGFAf8DWQH1ATQBUAGeAf8BHgE2AU8B/wEZASwBQwH/AQ8BHwEzAf8BEAEhATMB/wEM\n        AR0BJAH/AQABAgFQAf8BAQEOAZsB/wIAAZAB/wIAAZYB/wEDARIBlQH/AQsBHwGPAf8BDgEiAYQB/wEJ\n        ASABUgH/AQYBGgFPAf8BAQEWAUkB/wEAARQBQgH/AQEBGAE+Af8BAwEZATkB/wEDARoBMwH/AQIBGgEx\n        Af8BAwEZATIB/wEAAQMBEwH/AwAB/wMAAf8DAAH/AQABAQEWAf8BAAEKASQB/wMAAf8DAAH/AwAB/wEA\n        AQgBIgH/AQABCwEmAf8BAAELAScB/wIAAQoB/wMAAf8DAAH/AwAB/wNOAfADWAHGA0wBkQMzAVMDGwEm\n        AwsBDwMCAQMbAAEBAwABAQMAAQEDAAEBAwABAQMAAQEDAAEBAwIBAwMHAQkDKwFDAQkBHwFSAf8BFgEs\n        AYUB/wErATMBWgH8ATIBRwGoAf8BJQE2AZgB/wEUAScBiAH/ASABPwGhAf8BIwFKAbAB/wEjAUkBrAH/\n        AR0BQAGjAf8BGgE7AZkB/wETATEBiQH/AQ8BKgFSAf8BCAEhAUQB/wEEARsBOwH/AQEBFgE1Af8BAAEV\n        ATEB/wEAARIBLQH/AQABEwEwAf8BAAETAS8B/wEAARYBNAH/AQABFAEzAf8BAAEOASgB/wEBAQsBHAH/\n        AQABAQERAf8BAgEGARYB/wESARkBLAH/ARwBIwE8Af8BSAFQAZYB/wGHAY4BmAH/AZwBpQGsAf8BoAGr\n        AbMB/wGdAacBsAH/AZgBogGrAf8BiwGUAZ0B/wEqATMBPgH/AQABAQEUAf8BAAEGASQB/wEFARwBRgH/\n        ARsBPAGqAf8BQgGtAf4B/wNdAe0DSAGEAyIBMgMHAQkDAwEEAwEBAv8AEQADCAELAxMBGgMhATEDMAFN\n        A0EBcgNLAZADVQGyA1wBzgNYAeMDUwHxA1EB9wNSAfQCPgFAAfgDAAH/AyEB+wIAAQYB/wENARgBNAH/\n        ASEBLAFMAf8BFAEdAToB/wElATABSwH/ATcBRAGUAf8BEwEfAUMB/wEAAQoBLAH/AScBMQGBAf8BNgFA\n        AZEB/wEoATEBggH/ARIBHAE9Af8CAAEUAf8CAAENAf8DAAH/AwAB/wIAARcB/wEUARsBOwH/ASIBKAFJ\n        Af8BGQEkAU0B/wE9AUoBpQH/ASIBJgE8Af8DAAH/ARoBJAEvAf8BIwErATcB/wMAAf8DAAH/AwAB/wEg\n        ASkBNQH/ASABKgEyAf8DAAH/AwAB/wEIAREBGQH/AQQBCgEXAf8DAAH/AwAB/wMAAf8DAAH/AyEB+wNV\n        AeoDWQHXA1UBugNOAZgDQQFzAzMBUwMlATcDFwEgAw0BEQMGAQgwAAFLAkwBjwEAAYEBmQH/AVcCXwHo\n        AVIBnAG8Af8BLwFHAZAB/wEMARwBLAH/ARUBKAE9Af8BEAEiATQB/wERASEBNwH/AQkBGQEgAf8CAAFQ\n        Af8BNgFDAZ8B/wElATUBmwH/AQABDAGmAf8BSQGJAZoB/wEzAUUBngH/ARMBJgGYAf8BAAEIAagB/wEG\n        ARYBqgH/AgABnwH/AQABBAGNAf8BAAEFAY8B/wEAARABTwH/AQABDQFHAf8BAAEIAUoB/wEAAQIBSQH/\n        AgABNQH/AwAB/wMAAf8DAAH/AQABDAEmAf8BAAEPASsB/wIAARAB/wMAAf8CAAEFAf8BAAELASgB/wEA\n        AQwBKAH/AQABDQElAf8CAAEOAf8DAAH/AwAB/wMAAf8DTAHzA1oB2wNUAa4DQAFwAyYBOAMSARgDBQEH\n        NAADAgEDAwQBBQNOAZQBFwEsAYoB/wFJAmIB9gEzAU8BsQH/ASoBQQGlAf8BIAE8AaUB/wEpAVEBvgH/\n        AS4BhwHIAf8BKgGAAb4B/wEmAU0BtAH/AR8BQQGhAf8BFwE3AZEB/wEPASsBUQH/AQYBHQE+Af8BAAER\n        ASsB/wEAAQsBIgH/AQABCQEeAf8BAAEIAR4B/wEAAQkBIAH/AQABCAEeAf8BAAEIAR0B/wEAAQkBIAH/\n        AQABDAElAf8BAAEPASoB/wEAAQwBJwH/AQABAQESAf8BAAEEARAB/wENARMBIwH/ARcBHQEyAf8BQAFH\n        AY0B/wGJAYoBmwH/AZgBnQGkAf8BpwGyAbsB/wGlAbABuQH/AZMBngGnAf8BJAEvAToB/wIAARMB/wEA\n        AQkBKAH/AQgBIwGFAf8BIwFLAcQB/wGNAdsB/gH/A2IB7wM3AVoDDQESAwABAf8AHQADCAELAxABFgMe\n        ASsDLwFKA0ABcQNKAY0DVAGvA1oBzQNYAeMDUwHxA0EB+QMrAfwBCQELARIB/wMAAf8CAAELAf8BJgEy\n        AYQB/wGDAZcBxQH/AYwBoQHRAf8BRAGBAaoB/wE+AU4BnQH/ASYBMgFSAf8BBQEQATQB/wEUAR4BRQH/\n        ATQBPgGPAf8BKAEwAYAB/wEgASgBSwH/ATQBPAGNAf8BPQFDAZEB/wEVARsBOgH/AwAB/wMAAf8CAAEO\n        Af8CAAEOAf8BAAEGASwB/wEyAT4BmwH/AUoBUQGgAf8DAAH/AwAB/wIAAQ8B/wIAARYB/wEMARABLAH/\n        AgABDQH/AgABHgH/AREBFwEtAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DQgH1\n        A1cB6ANYAdEDVQG1A0wBkwNAAXEDMgFRAyMBMwMWAR4DDAEQAwUBBzAAAVoCXwHbAQABgQGYAf8BWgJd\n        AdMBgAGdAcEB/wEuAUYBjgH/ARUBJwE7Af8BEQEkATgB/wEXASkBPwH/ASIBNwFSAf8BCgEaASEB/wIA\n        AYAB/wFEAYIBuQH/AUUBggGvAf8BDwEeAa0B/wFOAYkBnwH/AUgBhAGjAf8BAAENAaAB/wEgAS8BlgH/\n        AUwBjgGbAf8BIQEvAZgB/wE+AVEBiwH/ASEBMQGcAf8BGwEoAZIB/wECAQwBmgH/AQYBEwGhAf8BAAEG\n        AZkB/wEEARIBlwH/AQABAwFMAf8CAAERAf8CAAEGAf8BAAERAS4B/wEAAQsBKQH/AQABAgEcAf8CAAEB\n        Af8CAAEXAf8BAAEHASQB/wEAAQwBKAH/AQABDAEnAf8CAAEQAf8DAAH/AwAB/wMAAf8DPgH4A1wB5wNZ\n        AcMDSQGJAzABTAMZASMDCQEMLwABAQMAAQEDAAEBAwUBBwJYAV4B3QEmAToBlQH/AV0CYgH2AS4BTgGy\n        Af8BJgFKAbcB/wE3AZMB3QH/ATcBlAHeAf8BNAGOAdIB/wEtAYYBxQH/ASgBTgG0Af8BHQFAAZ0B/wES\n        AS8BgwH/AQMBGgE3Af8BAAEHARsB/wIAAQ4B/wIAAQgB/wIAAQoB/wIAAQ4B/wIAAREB/wIAARAB/wEA\n        AQEBFAH/AQABAQETAf8BAAEDARcB/wEAAQUBGgH/AQABCgEhAf8BAAEKASEB/wEAAQUBFwH/AQQBCgEW\n        Af8BDwEVASYB/wEdASMBNwH/AZYBlQGmAf8BkQGPAZIB/wGfAaoBsgH/AZEBnAGlAf8BFwEhAS0B/wIA\n        ARIB/wEAAQgBKAH/ARABKQGNAf8BMQGOAeYB/wGhAfgB/AH/AVwBZwFrAfgDLQFFAwQBBv8AJQADCAEL\n        AxIBGAMeASsDMAFLAz8BbwNKAY0DVAGuA1oBzQNYAeMDUwHxA0EB+QE5AToBPgH9AgABBgH/AwAB/wEP\n        ARcBMwH/AUEBUAGoAf8BjQGiAdIB/wGIAZwBygH/ATsBSQGaAf8BLQE3AYQB/wEZASUBRgH/ARsBJwFO\n        Af8BMwE9AZUB/wFGAVABqgH/AUwBggGxAf8BUAGGAbYB/wFSAYoBuAH/ATwBTAGiAf8BEgEbAU8B/wEW\n        ARwBUQH/ASIBKAGGAf8BCwEMAT4B/wEBAQkBLgH/ARIBHAFDAf8BOgFEAZ4B/wEGAQsBHAH/AwAB/wED\n        ARABLgH/AQABCQEoAf8BGAEgAUQB/wEyATwBlQH/AScBMQGLAf8BMgE7AZQB/wEJAQ0BHwH/AwAB/wMA\n        Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DIQH7A1IB9ANeAeUDXAHOA1YBswNMAZEDPwFuAzEBTgMh\n        ATEDFQEdAwsBDwMFAQcsAAMiATIBAAGDAZkB/wEAAYABlwH/A2EB4gGDAaQBygH/AScBQAGGAf8BHQEw\n        AUQB/wEvAUgBkQH/ATEBTAGaAf8BLwFIAZUB/wERASMBLQH/AQABAgGGAf8BFgEnAbsB/wEhATEBpgH/\n        ARgBJwGaAf8BOAFHAYcB/wE+AU8BmAH/AgABowH/AScBOAGMAf8BLwFAAZcB/wEqATgBkQH/ARsBKgGY\n        Af8BAAEHAaIB/wEwAT4BmAH/ARUBIwGUAf8BNAFDAZQB/wEAAQUBnQH/ATUBSAGRAf8BEwEhAZgB/wIA\n        ATwB/wEAAQYBFQH/AQABDgEsAf8BAAELASgB/wEAAQkBJQH/AQABBwEiAf8BAAEIASQB/wEAAQgBJQH/\n        AQABCwEnAf8BAAEMASkB/wIAARcB/wMAAf8DAAH/AwAB/wMhAfsDWAHvA1kB0gNQAZ8DOgFhAyIBMgMO\n        ARMzAAEBAwIBAwMmATgBDgEoAY0B/wEuAUYBpwH/Al8BZAH7ASwBhQHAAf8BRQGjAfAB/wFFAacB9wH/\n        AUEBoAHsAf8BOgGWAd4B/wEyAYoBzAH/ASgBUAG1Af8BGAE3AZAB/wEFARwBOQH/AQABAwEVAf8CAAEC\n        Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wIAAQMB/wIAAQgB/wIAAQsB/wIAAQ0B/wIAARAB/wEAAQIBFQH/\n        AQABAwEXAf8BAAEGARoB/wEAAQIBDgH/AQUBCgEXAf8BDgEUASMB/wFKAU0BiwH/AYwBhwGNAf8BUAGH\n        AY4B/wEIARIBHgH/AgABEgH/AQABCAEnAf8BDwEqAY0B/wFAAaYB/gH/AbMB8QH7Af8BkwHIAfAB/wND\n        AXcDBAEF/wApAAMJAQwDFQEdAyUBNwMyAVEDQAFwA0sBjwNVAbEDWgHNA1gB4wNTAfECRwFXAfkBJQEm\n        ASsB/gMAAf8DAAH/AgABFQH/ASkBNgGIAf8BSgGGAa0B/wE5AUcBmgH/ASQBMAGDAf8BKgE1AYkB/wEu\n        ATgBkAH/AUcBUgGwAf8BngGrAeEB/wGkAbMB6AH/AZsBqQHjAf8BUgGNAccB/wEmATQBnwH/AR8BMQGd\n        Af8BKQE9AbEB/wGJAZYB4gH/AacBswH3Af8BpAGxAewB/wEnATEBiQH/ARMBGwE8Af8BHQElAUQB/wMA\n        Af8CAAEWAf8BAAELATMB/wEhAS0BgQH/ATgBRAGbAf8BPQFLAacB/wFMAYkBvQH/ATEBOQGUAf8DAAH/\n        AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wICAQQB/gMpAfoDTAHzA1gB4wNYAcsDVAGvA0oBjQM+\n        AWwDLwFKAyEBMAMUARwDCgEOAwQBBiwAA0oBjAEAAYMBmQH/AVgCXwHjA38B/gGAAaIBxwH/ASMBOAFR\n        Af8BIQEzAUoB/wE3AVABngH/ATQBTgGhAf8BKgFFAZMB/wEWASoBQwH/ARkBLAFQAf8BFQEtAZUB/wEL\n        AR4BkwH/AQABCAGWAf8CAAGXAf8BAAEBAaoB/wIAAagB/wEAAQgBmAH/AQABBAGfAf8BAAECAaUB/wEH\n        ARUBkgH/AQEBDgGQAf8BIwEyAZYB/wERASABnAH/ATABOwGZAf8CAAGmAf8BMAE9AaYB/wEgAS0BoAH/\n        AgABhwH/AQABEAEmAf8BAAEQASwB/wEAARABLQH/AQABDgEpAf8BAAENASoB/wEAAQoBJwH/AQABCgEn\n        Af8BAAEKASYB/wEAAQ8BLAH/AQABAgEeAf8DAAH/AwAB/wMAAf8DQAH9A1kB8gNaAdgDVAGrAz8BbgMl\n        ATcDEQEXLwAEAQECAwQBBQJMAU0BkQEVATABkQH/AVgCYgHpATUBkAHNAf8BTgGuAfcB/wGDAboC/wFP\n        AbMC/wFIAasB+QH/AT8BoQHsAf8BNwGRAdQB/wEpAU8BtAH/ARIBLwGCAf8BAAEMASEB/wIAAQoB/wIA\n        AQ4B/wEAAQIBFgH/AgABEgH/AgABDQH/AwAB/wMAAf8DAAH/AwAB/wMAAf8CAAECAf8CAAEGAf8CAAEK\n        Af8CAAEOAf8CAAESAf8CAAEMAf8BAgEHAREB/wEEAQkBFAH/ATMBNwFFAf8BQQFAAUgB/wEAAQcBEwH/\n        AgABEQH/AQABAwEeAf8BEwEyAZcB/wGFAcgB/QH/AX8BgQGhAf4BkgG6AfAB/wNdAcoDAgED/wAtAAMM\n        ARADGAEiAyYBOQMyAVEDPwFuA0wBkgNVAbUDXAHPA18B4wNkAfEDagH5AUwBUQGCAf8BKAEtATIB/wEQ\n        ARMBGQH/AwAB/wIAAQsB/wEkAS8BTQH/AS0BOQGQAf8BOAFEAaAB/wFHAVIBrwH/AYcBlAHGAf8BkgGc\n        AdcB/wGEAY8BzQH/AU4BiwHGAf8BSgGJAccB/wE/AU0BvAH/AYIBjwHZAf8BmgGoAeoB/wGkAbYB8gH/\n        AZwBrAH0Af8BrgG6AfYB/wHJAdQB+gH/AYEBjgG/Af8BKQE0AY4B/wIAAR8B/wMAAf8BCAEQATEB/wEn\n        ATMBkAH/AUEBTwGpAf8BggGSAb4B/wGHAZUByAH/AT4BSgGnAf8BFQEYAUIB/wIAAQoB/wMAAf8DAAH/\n        AwAB/wMAAf8DAAH/AwAB/wMAAf8CMgE/Af0DPgH4A04B8ANfAeADWQHJA1QBqwNKAYsDPQFpAy8BSQMg\n        AS4DFAEbAwoBDgMEAQYsAAFbAl4B2QEAAYIBmQH/AVkCXAHJAYsBoAG3Af8BTAGfAcQB/wEhATcBUQH/\n        ASQBNwFQAf8BNwFRAaAB/wEyAU8BnwH/ASYBPgGJAf8BAwERASEB/wENAR4BMwH/AR4BOgGHAf8BGgE1\n        AYAB/wEMASABPgH/AQMBFQExAf8BEwEsAVAB/wEOAScBSQH/AQQBGQFKAf8BAAEQAVIB/wEAAQkBiAH/\n        AQABAwGNAf8CAAGYAf8BAAECAZEB/wEAAQYBigH/AQABDAGOAf8CAAGdAf8BDwEcAZ0B/wEFAREBqAH/\n        AQABBQGRAf8BAAETASkB/wEAARABLAH/AQABEwEuAf8BAAERASwB/wEAAQ4BKwH/AQABDQEpAf8BAAEN\n        ASkB/wEAARABLAH/AQABEgExAf8BAAEGASIB/wMAAf8DAAH/AwAB/wEUARUBHAH+A0IB9QNfAeADVgG2\n        A0UBfQMrAUMDFgEfMAADAgEDAwUBBwJaAV8B2wEZATMBkwH/AVoCXQHTAUsBpgHmAf8BkwHKAv8BjQHF\n        Av8BhgG+Af4B/wFQAbUB+AH/AUoBqwH1Af8BPwGaAeIB/wEvAYMBvQH/AQ8BKQFPAf8BAAEEAR8B/wEA\n        AREBNgH/AQABFAE4Af8BAAEUATgB/wEAAQ8BLgH/AQABAQEXAf8CAAEOAf8DAAH/AwAB/wMAAf8DAAH/\n        AwAB/wMAAf8DAAH/AgABAwH/AgABCgH/AgABDgH/AwAB/wEcASEBLQH/ARUBGgEmAf8BAAEHARUB/wIA\n        ARQB/wEAAQkBJQH/ARoBOQGlAf8BhQHFAfwB/wJ/AZ8B/gGQAbMB9wH/AlwBaQH4AxwBKP8AMQADDQER\n        AxgBIQMiATIDMAFMA0EBcwNOAZcDVQG1A1wBzwNfAeMDZAHxA00B+gGMAZEBlgH/AZUBmwGgAf8BmAGe\n        AaQB/wFGAUoBUAH/AQABAgEFAf8BBQELAR8B/wFCAU8BqQH/AYMBjgHCAf8BhAGRAcoB/wGIAZcBzQH/\n        AYgBlgHIAf8BhwGTAcwB/wGBAY0BygH/AT4BSQGvAf8BOAFCAZ8B/wGLAZMB0AH/AboBywH+Af8B1AHn\n        AfwB/wG6Ac0B9gH/AbcByQH2Af8BugHIAfgB/wGMAZkB2QH/AScBLgGQAf8DAAH/AgABFAH/ATMBQQGj\n        Af8BQgFSAbYB/wGXAacB2QH/AZ0BqwHaAf8BOAFCAZoB/wEiASYBSgH/AU4BUgGwAf8BHQEgATwB/wMA\n        Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wEIAQ4BGQH+AysB/ANRAfcDXQHtA1oB3gNYAcYDUgGpA0kBiQM8\n        AWYDLgFHAx8BLQMTARoDCgENAwQBBigAAyEBMQEAAYIBlwH/AQABgAGWAf8BWgJeAdUBiAGiAbwB/wFN\n        AaEByAH/AR8BNAFOAf8BJAE6AYYB/wE2AVABogH/ATABSgGbAf8BCgEbATAB/wMAAf8CAAEDAf8BFQEs\n        AUcB/wEdATkBhgH/AQsBIQE6Af8BBgEZAS8B/wEVATEBUQH/ARABKQFHAf8BCgEkAUMB/wEKASMBQQH/\n        AQoBIQE+Af8BCAEgAT0B/wEGAR0BOgH/AQQBGgE7Af8BAQEXAT4B/wEAAREBQgH/AQABBwFKAf8CAAGI\n        Af8CAAGVAf8BAAEGAVAB/wEBARUBLQH/AQABEwEvAf8BAAESAS8B/wEAARMBLwH/AQABEAEsAf8BAAEP\n        ASoB/wEAARIBLQH/AQABFAEwAf8BAAEVATIB/wEAAQwBKQH/AgABBQH/AwAB/wMAAf8DAAH/A0EB+QNY\n        AekDWQHHA0wBkQM0AVQDHAEnMAADAgEDAyUBNwEVATABlAH/AR0BNQGVAf8DXwHgAY8BwAH9Af8BnwHX\n        Av8BmgHSAv8BjwHKAf0B/wGJAcIB/AH/AVEBtgH1Af8BRQGnAesB/wEwAYcBxgH/AQABDgEzAf8BAQEW\n        AUMB/wEDARcBQgH/AQABFQE+Af8BAAEUATkB/wEAARIBNwH/AQABCwErAf8BAAEGARoB/wMAAf8DAAH/\n        AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AgABAgH/AgABCgH/AwAB/wEFAQwBFgH/AgABDQH/AQABAwEb\n        Af8BAAETATYB/wEgAUkBugH/AYUBxwH5Af8BkgG2AeoB/wGVAqgB/QGaAbQB+AH/A08Bl/8ANQADDQES\n        AxYBHgMhBDABTQNCAXYDTgGXA1YBswNZAcwCXQFhAeIDXQHwAT8BRwFPAfwBUAGBAYYB/wGEAYgBjwH/\n        AZIBlwGeAf8BogGnAa0B/wGAAYUBiQH/AQMBBwEUAf8BRgFRAawB/wGJAZgBzwH/AY4BngHXAf8BmAGn\n        AeMB/wGTAaMB3gH/AZoBqAHsAf8BRQFOAbQB/wEfASQBggH/ASsBMgGPAf8BKgExAYsB/wFMAYYBxAH/\n        AaIBuAH6Af8BwQHaAfcB/wHbAfAB+gH/AbwB0AH5Af8BhQGTAd4B/wEoATABmgH/AgABHwH/AQMBCQEs\n        Af8BSQGIAcIB/wGhAbIB6gH/AZUBoAHJAf8BJAErAUsB/wIAARcB/wEhASgBTQH/AYkBkQHCAf8BFgEZ\n        ATIB/wMAAf8DAAH/AwAB/wIAAQMB/wMAAf8DAAH/AQgBDQEZAf4DIQH7A0gB9gNZAewDWgHbA1gBxgNR\n        AacDSAGHAzsBYwMtAUUDHwEsAxIBGQMKAQ0DBAEGKAACSQFKAYkBAAGCAZcB/wFbAmEB4QGBAZYBqAH9\n        AYcBoAG9Af8BTwGjAcwB/wEfATQBTgH/ASQBOwGGAf8BNQFRAaIB/wErAUQBkwH/AQABCgEZAf8DAAH/\n        AwAB/wETASkBQgH/ASEBPgGNAf8BCwEfATgB/wEGARkBMAH/ARIBLgFOAf8BDgEpAUcB/wEOASkBSQH/\n        AQ0BJgFEAf8BCgEjAUEB/wELASMBQgH/AQoBIAFBAf8BBgEcAT0B/wEEARoBPgH/AQUBGgE9Af8BBQEc\n        ATwB/wEGARoBOQH/AQQBGQE1Af8BAwEYATEB/wECARcBNQH/AQMBGAEzAf8BBAEZATQB/wEEARkBNgH/\n        AQQBGAE3Af8BBAEaATgB/wEGAR0BOwH/AQgBHwE+Af8BCgEgAUAB/wEMASEBQQH/AQABCAEiAf8DAAH/\n        AwAB/wMAAf8DQAH9A04B8ANaAdMDUAGjAzwBZgMkATUvAAEBAwMBBANKAY0BFAEuAZAB/wJeAWUB5QGb\n        AqgB/QGkAdkC/wGoAd8C/wGkAd4C/wGbAdUC/wGRAcwB+wH/AYYBvwH3Af8BTwG0Ae8B/wEVATsBnwH/\n        AQUBHgFRAf8BBQEeAU0B/wEEAR0BSgH/AQIBGgFHAf8BAQEXAUIB/wECARUBPQH/AQABDgE0Af8BFAEg\n        AToB/wEAAQcBGAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8CAAEEAf8DAAH/AgABDQH/\n        AQABAgEdAf8BAwEWATwB/wEgAUUBsgH/AUoBoQHjAf8BlAGrAckB/wFfAWABfwH7AZsBtQL/A10B7QMH\n        AQn/ADUAAw0BEQMUARwDHwEtAzABTANAAXEDTAGSA1UBsQFYAlsBywNfAeADYgHvAW8BcwF3Af4BTAFR\n        AYMB/wFFAUkBUgH/AUsBTwGEAf8BigGQAZYB/wGXAZsBoAH/ARABFAEcAf8BSgGDAbUB/wGgAbYB9AH/\n        Aa0BxgH2Af8BtgHOAfcB/wGnAb0B9QH/AaABrQH5Af8BLgE2AZIB/wIAAScB/wEOARIBPAH/ASQBJwFQ\n        Af8BMwE4AZYB/wGPAaIB3QH/AcAB4QH8Af8B5gH4AfsB/wHBAdQB+AH/AZoBqAHwAf8BhQGRAdcB/wFO\n        AYkBxQH/AVABjAHFAf8BnAGrAdgB/wGMAZgBvwH/ASwBNgGAAf8BJgE0AVIB/wEtAToBiQH/AQABCgEp\n        Af8BFgEgAUUB/wEAAQEBEwH/AwAB/wMAAf8DAAH/AgABBQH/AwAB/wELAQoBGwH+AQ8BEQEgAf4CIQEj\n        AfsDQgH1A1kB6wNeAdoDWQHDA1IBpgNIAYQDOgFiAywBRAMdASoDEgEZAwoBDQMEAQYoAAFaAl4B2AEA\n        AYEBlgH/AVkCWwHEAYIBlgGoAf8BTgGZAbgB/wGCAagB1gH/ARwBMwFPAf8BKQFDAZEB/wE5AYYBqAH/\n        ASQBPAGHAf8BAAELARoB/wMAAf8DAAH/AREBKQFCAf8BJAFAAZIB/wEMASABOAH/AQgBGgExAf8BGgE1\n        AYMB/wEUAS4BUAH/AREBKgFKAf8BEgEpAUoB/wEQASkBRwH/AQ8BJgFFAf8BCwEiAUUB/wELASIBQQH/\n        AQoBHwE/Af8BCQEfAT0B/wEJAR4BPAH/AQgBHQE8Af8BCAEdATwB/wELASIBPwH/AREBJwFGAf8BEQEo\n        AUcB/wESAS0BSAH/ARQBLgFNAf8BGgEzAYIB/wEfATgBigH/ASABOAGFAf8BHAE3AYMB/wEYATEBUgH/\n        AR4BOAGGAf8BCAEXATMB/wMAAf8DAAH/AwAB/wMoAf4DUgH0A1oB3gNWAbYDRAF8Ay0BRTAAAwEBAgJb\n        AV4B2QEUAS4BjwH/AVoCXAHNAZwBrwG9Af8BsAHkAf4B/wGyAecC/wGuAeUC/wGoAd8C/wGeAdkC/wGR\n        Ac0B+wH/AVEBswHpAf8BEQEwAZcB/wEMASYBjQH/AQwBJQGJAf8BCQEjAYQB/wEGAR8BUgH/AQQBGgFK\n        Af8BBQEaAUUB/wEAAQ8BNwH/ASoBOwGKAf8BEAEiATkB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA\n        Af8DAAH/AwAB/wIAAQYB/wEAAQMBGwH/AQABEQE1Af8BGAE4AZsB/wFCAY8BwwH/AaEBtAHMAf8BtAHD\n        AdgB/wGbAbcB+gH/AZsBtgL/A0MBeP8AOQADCgENAxIBGQMcASgDLQFFAzwBaANKAYwDUwGtAVoCXQHK\n        A18B4ANZAfIBKwEuATIB/wE3ATsBQgH/AToBPgFGAf8BOgE+AUYB/wFSAYQBiwH/AZ0BowGoAf8BHwEi\n        ASgB/wFGAYIBpgH/AbgB1wL/AcQB4QH4Af8B1wHuAfoB/wHjAfEB/gH/AYMBlwHJAf8BOwFGAZ0B/wKW\n        AaUB/wEuAS0BjQH/ARUBEgFRAf8BGgEfAUoB/wE8AUYBoAH/AdgB5wHzAf8B5AH6Av8BwwHZAfcB/wHB\n        Ac4B9wH/Ac0B1wH5Af8BzgHZAf4B/wGwAbwB8wH/AYABjQGxAf8BRgGCAacB/wE6AUkBmwH/ARkBJAFH\n        Af8BBwENAS4B/wEAAQQBIQH/AQ8BGAFCAf8CAAEKAf8DAAH/AwAB/wMAAf8CAAEMAf8CAAEEAf8DAAH/\n        AR8BIwExAf4CIQEpAfsDTAHzA1UB6gNaAdgDWAHAA1ABowNHAYIDOQFgAysBQwMdASoDEgEYAwkBDAME\n        AQUkAAMgAS8BAAGBAZYB/wEAAYEBlgH/AVkCXAHPAUsBjAGdAf8BiwGsAdMB/wGAAaMB0gH/AR4BNAFQ\n        Af8BLwFLAZwB/wE8AYcBrgH/ARcBLAFIAf8BAAEDAQ8B/wEAAQIBEAH/AQABBQERAf8BGgEyAU8B/wEg\n        AToBiAH/AQkBHAEyAf8BCgEdATQB/wEdATkBiwH/ARcBMgGDAf8BFgExAVAB/wEUAS4BTgH/ARMBLgFO\n        Af8BEQErAUwB/wESAS0BTQH/ARMBLQFNAf8BEwEsAUwB/wEVATABTgH/ARcBMgFSAf8BHAE2AYUB/wEd\n        ATkBhQH/ASUBPgGLAf8BKwFHAZYB/wEsAUcBlgH/ASwBRwGTAf8BLAFIAZQB/wEsAUcBkwH/ASwBRgGW\n        Af8BJgFCAZAB/wEeATkBiAH/AR4BNwGFAf8BHQE4AYYB/wEUASsBSQH/AwAB/wMAAf8DAAH/AwAB/wNB\n        AfkDXgHlA1cBwgNKAYsDMgFQLwABAQMiATIBDgEoAY8B/wETAS0BjQH/A2AB1gGVAagBtQH/Aa4B3wH9\n        Af8BugHtAv8BuAHtAv8BrwHnAf4B/wGnAeEC/wGdAdgB+wH/AUMBmAHPAf8BGAE6AakB/wEWATMBogH/\n        ARMBLwGcAf8BEAEuAZYB/wELASYBjAH/AQgBIAGBAf8BBQEcAUsB/wEAAQ4BNQH/AYUBkwGzAf8BHwEs\n        AUIB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AgABAQH/AgABFwH/AQABAgEhAf8BBwEf\n        AUcB/wEyAUgBmgH/AZ8BrwG/Af8BuwHIAdIB/wFYAWcBcAH6AZ0BuQL/A2EB4v8APQADCAELAxEBFwMa\n        ASQDKAE9AzsBZQNKAYoDVAGuA1kBxwNaAd4DUgH3ATEBNAE4Af8BNwE7AUIB/wE0ATgBQAH/ATgBPQFE\n        Af8BhgGLAZIB/wGoAa0BswH/ATIBNgE7Af8BPwFQAYoB/wHmAfwC/wH7C/8BvwHVAewB/wG0AcsB8wX/\n        AfAB8wL/AaMBrAHoAf8BGQEhAYEB/wEbAR8BTQH/AaIBqQHDAf8BxQHbAf4B/wGPAaQB8QH/AaEBuwH0\n        Af8B3wHwAv8BwQHKAegB/wFCAU0BoQH/AVEBkQG9Af8BLwE8AZAB/wEIARIBLwH/AQwBEAExAf8BEwEY\n        AT0B/wEeASUBSAH/ASIBLgGJAf8CAAEQAf8CAAECAf8DAAH/AwAB/wECAQcBGgH/AQABAgEQAf8BLAEx\n        AUIB/gEoATEBPwH+AysB/ANMAfMDVwHoA1oB2ANWAb4DUAGkA0cBggM5AV8DKgFBAx0BKQMSARgDCQEM\n        AwQBBSQAAkgBSQGIAQABgAGUAf8DXwHgAYMBmQGoAf0BPAFNAYkB/wGUAbwB5gH/AYEBpQHUAf8BIQE5\n        AYQB/wE5AYYBrAH/AT4BigG1Af8BJAE+AY0B/wEUASgBQQH/AR4BNAFRAf8BHgE1AYEB/wEPASQBPAH/\n        AQgBGAEtAf8BCQEbATEB/wEYATIBUgH/ARwBOgGLAf8BHAE5AYgB/wEdATgBiQH/AR4BOgGNAf8BJgFC\n        AZYB/wEpAUYBmAH/AS8BTwGeAf8BMQFQAZ4B/wE0AVABoAH/ATUBgAGjAf8BNQFRAaUB/wEzAVABoAH/\n        ATEBTAGfAf8BMQFMAZsB/wEwAU0BmQH/AS4BTAGYAf8BLQFKAZYB/wEqAUkBlgH/ASoBSAGWAf8BKQFG\n        AZMB/wElAUEBjQH/ASMBOwGKAf8BHgE4AYcB/wEdATgBhQH/ASEBOwGMAf8BAAEGAR4B/wMAAf8DAAH/\n        AwAB/wMhAfsDWQHrA1oBygNOAZkDOQFgMAACSAFJAYgBCgEmAYgB/wJdAWEB4gGVAqgB/QGNAZ0BpwH/\n        AaoB0AH4Af8BwwHyAv8BwgHxAv8BuwHtAv8BswHrAv8BpwHiAv8BPgGSAc4B/wElAUsBvQH/ASEBQgG+\n        Af8BGgFAAbcB/wEYATgBqwH/ARIBMQGbAf8BDAEoAYkB/wEDARkBSQH/ASIBLQFRAf8BqgG3AdQB/wEb\n        ASQBNgH/AwAB/wMAAf8BHQEiAS4B/wIAAQQB/wMAAf8CAAEGAf8DAAH/AwAB/wIAAQkB/wIAAQ8B/wEA\n        AQYBIwH/ASQBNQFSAf8BjQGWAaEB/wGwAbwBxgH/AbQBxQHdAf8BnQG5AfsB/wGcAbkB/QH/ATkCOgFg\n        /wA9AAMHAQkDEAEVAxoBJQMpAT4DOwFlA0oBiwNUAasDVwHFA14B3QE4ATsBPgH8AUQBSQFOAf8BcgF3\n        AX0B/gE+AUIBSgH/AT8BQwFLAf8BjAGRAZgB/wGrAbABtwH/AUkBTQGAAf8BPgFRAYoB/wHZAfkB/gH/\n        AfkB/wH+Af8B/gP/AfwB/wH+Af8B9wP/AawBxQH2Af8BvQHQAfsF/wHpAfMC/wHAAckB9AH/AUgBSwG9\n        Af8BGgEeAUwB/wGrAbUB2gH/Ac8B4gL/AdgB7QL/AbEBuwHMAf8BFQEYAS0B/wErATcBiAH/ATgBQwGZ\n        Af8BGwEjAUYB/wEvAT0BjwH/AT4BSQGfAf8BNgE+AZYB/wFAAUsBogH/ATQBRAGmAf8CAAENAf8CAAEB\n        Af8DAAH/AwAB/wERARkBLAH/AQABBQEWAf8BLAE1AUcB/gE2AT8BUQH+AS4BMgFIAfsCTAFTAfMDXAHn\n        A1sB1gNXAb0DUgGoA0gBhQM4AV0DKgFBAx0BKQMRARcDCQEMAwQBBSQAAVkCXQHXAQABgAGVAf8BVwJZ\n        Ab8BUQGSAaMB/wE8AUsBiQH/AaEBzQHuAf8BTQGdAdAB/wEXAS0BSQH/ASYBPwGKAf8BKQFDAZEB/wEf\n        ATcBgwH/ARwBMwFRAf8BEgEmAT0B/wEOASMBNwH/ARYBLQFHAf8BHwE5AYYB/wEpAUYBmAH/ASgBSAGZ\n        Af8BKgFKAaAB/wEzAVIBpgH/ATgBhAGrAf8BPwGNAbMB/wFFAZMBuQH/AUcBlwG+Af8BRQGTAboB/wFC\n        AY4BtAH/AT4BigGuAf8BPAGIAawB/wE4AYQBpgH/ATYBggGjAf8BNgFSAaEB/wEyAYABoQH/ATEBTwGe\n        Af8BLgFOAZwB/wEtAUsBmQH/AS0BSwGbAf8BLQFKAZgB/wErAUgBlQH/ASgBRQGSAf8BJAE/AZAB/wEk\n        AT4BjgH/ASABOQGIAf8BIQE8AYwB/wEdATMBhAH/AgABAQH/AQsBEQEmAf4DUgH0A1UB6gNaAdsDVwG/\n        A0wBkwM5AWAwAAJZAV0B1wELASUBhwH/AVcCWgHFAZEBpQGzAf8BjQGcAaUB/wGhAb4B3AH/AccB8wL/\n        AckB9AL/AcUB8wL/AbsB7gL/AbAB6AL/AUUBlwHYAf8BLwFRAcsB/wEnAUwBzgH/ASUBSwHRAf8BHwFF\n        AcEB/wEaATkBqQH/AQ8BKwGTAf8BBAEZAUcB/wGYAaUByAH/AZ0BqQHFAf8BAAECAQwB/wMAAf8DAAH/\n        ASQBLQE6Af8BAAEEAREB/wMAAf8DAAH/AwAB/wIAAQEB/wIAAQYB/wIAAQYB/wEfASYBNQH/AYABhQGN\n        Af8BoQGqAbAB/wG3AcMBzQH/AVQBZgFwAfoBmgG3AfoB/wNdAdf/AEEAAwYBCAMQARUDGgElAygBPQM4\n        AV4DSAGEA1IBpgJZAVsBwwNfAeMBRQFIAUkB/wE8AUABRQH/AWoBbwF2Af4BPwFDAUsB/wE5AT0BRQH/\n        AVABgQGJAf8BqQGuAbQB/wGIAYwBkwH/AUIBUQGIAf8B2AH2AfoB/wH0B/8B/gf/AcsB2gH3Af8BiAGc\n        AeUB/wHBAcoB+AH/Ac0B2QH5Af8B6wH2Av8BzQHWAfcB/wEZAR4BRQH/ARMBGAE1Af8BpwGyAb0B/wFO\n        AYABiAH/AgABDQH/AQkBEwE1Af8BHwErAYIB/wEfAScBUAH/AYABkQG+Af8BlQGrAdgB/wGGAZgBxQH/\n        AUwBiAGzAf8BhQGXAcIB/wFIAYoBuwH/AgABDQH/AQABAgEMAf8CAAEIAf8BAgEHARoB/wEmAS0BQwH/\n        ARoBHwE1Af8BOwFGAVkB/gNAAf0BRwFZAWoB+QJSAWUB9AJcAWQB5wJaAV0B0wNWAb4DUgGmA0UBfwM4\n        AV0DKgFAAxwBKAMRARcDCQEMAwQBBSAAAyABLgEAAYIBlwH/AQABUgGUAf8BXAJeAc4BTgGOAZ8B/wFP\n        AZEBngH/AZ4BzgH1Af8BUQGnAd0B/wEuAU0BoAH/ASkBRgGTAf8BLQFIAZgB/wEtAUgBmQH/AS0BSwGa\n        Af8BMwFRAaYB/wE0AYMBrQH/ATkBigGzAf8BQgGTAboB/wFIAZkBwwH/AU0BngHGAf8BgQGnAdAB/wGF\n        AawB1QH/AYMBpwHRAf8BUQGjAc0B/wFQAZ8ByQH/AUwBmwHFAf8BSQGYAcAB/wFFAZUBvQH/AUQBkAG5\n        Af8BQwGPAbUB/wE/AYwBsAH/ATwBiQGtAf8BPAGHAawB/wE2AYQBqAH/ATUBgAGlAf8BNwFQAaIB/wEz\n        AVABoAH/ATIBTwGdAf8BLwFNAZ0B/wEuAUoBmgH/ASsBRwGZAf8BKgFHAZcB/wEnAUUBlwH/ASIBPwGP\n        Af8BGwE1AYcB/wEpAUUBlgH/AgABGAH/Az4B+ANaAc0DUwGtA08BnANIAYUDOwFlAysBQywAAyABLgEI\n        ASUBjAH/AQgBIwGGAf8DXAHRAY4BoQGvAf8BlAGlAa8B/wGkAbcBwwH/AbwB3gH7Af8BzgH2Av8BywH2\n        Av8BxQHzAv8BtwHsAv8BTgGjAd8B/wE7AYcB0wH/AS4BgAHeAf8BJwFPAdUB/wElAUcByQH/AR0BPQGw\n        Af8BGQEvAZYB/wEsATkBkAH/AawBvwHiAf8BNQFDAYUB/wMAAf8DAAH/AQ4BEgEcAf8BIgErATwB/wMA\n        Af8DAAH/AwAB/wMAAf8CAAEGAf8CAAEDAf8BCAEOARsB/wFJAU0BggH/AY0BkwGZAf8BpQGvAbgB/wGz\n        AcUB3wH/AZgBuAH6Af8BnQG7AfwB/wE1AjYBWP8AQQADBgEIAw8BFAMaASQDJgE4AzUBVwNEAXsDUAGj\n        A1sBxgNhAe4BQwFGAUcB/wFnAWsBbwH+AT8BQwFKAf8BQAFFAUwB/wE4ATwBRAH/AUgBTQGBAf8BpgGs\n        AbIB/wGRAZYBnAH/AT4BSgFOAf8B4gLxEf8B9wH5Af0B/wFJAYMBuwH/AYkBlAHfAf8ByAHUAf0B/wHb\n        Ae8B+gH/AeUB9gL/AYcBjwHQAf8BLQE1AZwB/wE0ATcBiwH/AgABEwH/AQ4BGwE9Af8BFgEhAUwB/wEW\n        AR4BSgH/AY4BoQHSAf8BrgHHAfgB/wGnAcAB8AH/AZwBsQHgAf8BlQGnAdEB/wGeAbQB4AH/AVABmAHD\n        Af8CAAENAf8BCQEMARcB/wIAAQ4B/wELARABJwH/ASgBLwFGAf8BKAEsAUIB/wEnAS0BQAH/A0AB/QNc\n        AfgCWQFnAfIDYQHmA10B0wNZAccDUgGpA0QBfAM3AVsDKQE/AxwBJwMRARcDCQEMAwQBBSAAA0gBhQEA\n        AYEBlgH/AVcCXAHfA1wB+AFFAYQBlAH/AYcBmAGiAf8BnQHRAfgB/wGIAbUB8AH/AVEBqwHjAf8BTAGj\n        AdIB/wFOAaIB1AH/AU0BogHRAf8BgQGmAdIB/wGLAbMB3wH/AZIBuQHlAf8BmgHEAe8B/wGcAckB9wH/\n        AZwBxQH0Af8BkAG5AeUB/wGOAbcB4wH/AY0BuAHlAf8BkgG4AecB/wGTAbgB6AH/AaIBxAHvAf8BkgGs\n        AfAB/wGEAaAB8wH/AYcBowHvAf8BUQGfAdQB/wFMAZsBxAH/AUkBlQG9Af8BRQGRAbkB/wFBAY8BtAH/\n        AT8BigGuAf8BOwGGAasB/wE4AYQBqAH/ATMBgAGjAf8BMgFPAaEB/wExAVABoAH/ATEBUAGfAf8BMQFO\n        AZ8B/wEzAVEBoQH/ATABTAGcAf8BLQFJAZwB/wEoAUEBkQH/ASsBSQGbAf8BAAEUATUB/wNCAfUDTwGb\n        AzQBVQMwAUsDKAE9AyABLgMVAR0sAANIAYUBBwEjAYkB/wJXAVwB3wNcAfgBhAGXAaQB/wGPAZ4BpwH/\n        AaEBsgG5Af8BsAHGAdUB/wHIAekB/QH/Ac8B9wL/AcoB9QL/AcAB8AL/AZIBtgHwAf8BQgGPAdQB/wE7\n        AYkB2QH/AS8BggHXAf8BMAFPAcoB/wEzAU0BuAH/ASkBPgGcAf8BkgGnAc4B/wEuAUQBjwH/AgABAgH/\n        AwAB/wMAAf8BTAGAAY0B/wEQARkBKwH/AgABCQH/AgABBQH/AgABAQH/AgABAwH/AgABAwH/AQABCAEW\n        Af8BPwFCAUcB/wGJAY0BkwH/AZwBpwGwAf8BtAHBAcwB/wFTAWYBcAH6AZoBuQH8Af8DXQHS/wBFAAMG\n        AQgDEAEVAx0EKQE/AzgBXQJFAUYBfgNRAaIDWgHFA2oB+QFFAUYBSQH/A0AB/QE/AUQBSwH/AT8BRAFM\n        Af8BRAFJAVAB/wFPAYEBiAH/AaABpgGsAf8BkgGVAZsB/wE9AUoBTwH/AdAC6QH/AfsH/wH9A/8B9gL9\n        Bf8BuQHFAeQB/wE4AUgBuwH/Ab0BzQHvAf8B9QH9Af4B/wHZAeoB+gH/AbMByQH5Af8BvgHMAv8BkQGd\n        Ad0B/wEKAREBRgH/AQYBDgFBAf8BRAFNAbMB/wGTAaIB3gH/AbcB0AH7Af8BwwHeAfoB/wG/AdgB+AH/\n        AakBwQHvAf8BqgG8AegB/wGsAcIB7gH/AUMBigGzAf8CAAECAf8BDAEPAR0B/wIAAQwB/wERARcBKgH/\n        ARoBIAE0Af8BHAEgATIB/wElASoBOwH/AysB/AJHAWYB+QJZAWcB8gJcAWQB5wJaAV4B2ANcAc4DUwGt\n        A0QBfAM3AVoDKQE+AxwBJwMQARYDCAELAwQBBSAAAVsCYAHWAQABgQGWAf8BVgJYAbwBTgGPAaAB/wFB\n        AVIBjgH/AZcBsQG6Af8BqwHpAfwB/wGaAc4C/wGXAckC/wGgAc0C/wGjAc4C/wGlAc8C/wG1AeIC/wGz\n        AeMC/wGuAd0C/wGnAdQC/wGjAdcB/gH/AZ0BywH+Af8BmwHIAfsB/wGXAcMB9gH/AZ4BxwH8Af8BrQHP\n        AfwB/wGXAbEC/wGpAb8C/wG6Ac8C/wGhAbQB/gH/AYsBnAL/AVEBjwL/AY0BoAH+Af8BhQGdAeIB/wFK\n        AZgBxAH/AUEBjQG4Af8BQQGOAbQB/wE+AYsBsQH/AToBiQGuAf8BOQGHAaoB/wE4AYUBqQH/AUMBjAG1\n        Af8BRAGOAbMB/wFAAYoBsAH/AUABjAGxAf8BQQGKAa8B/wFGAY8BtQH/ATwBhAGoAf8BKAFIAZgB/wEU\n        AS8BgQH/AikBTQH6A0cBggMNAREDEAEVAw0BEQMJAQwDBQEHLAACWwFgAdYBBQEhAYQB/wJXAVoBvQGB\n        AZUBpQH/AUwBigGXAf8BjQGdAagB/wGcAa4BtwH/AakBugHAAf8BtQHKAdkB/wHHAegB/QH/AcwB9AL/\n        AcUB8wL/AaUBwwH+Af8BgAGgAeMB/wFHAZIB2QH/AUwBmAHpAf8BhwGmAe8B/wFSAZkBzgH/AYsBnQHJ\n        Af8BTwGSAbgB/wEAARQBMQH/AwAB/wMAAf8BEwEUARgB/wGWAZwBrAH/ARQBIAE1Af8BAAEKARcB/wEA\n        AQIBEgH/AgABDgH/AgABDAH/AgABCwH/ARsBIAE1Af8BjQGMAZAB/wGjAa4BtgH/AbIBvwHJAf8BsgHG\n        Ad8B/wGYAbkB+QH/AZsBvAH9Af8DMAFL/wBFAAMFAQcDDwEUAx0BKQMtAUUDOwFlA0gBhQNTAagDXAHP\n        AVEBTwFJAf8BTAFNAU8B/wJAAYMB/QGAAYUBjAH/AYcBjAGTAf8BjAGRAZkB/wGKAY8BlwH/AYsBkAGZ\n        Af8BgAGIAZAB/wGVAaoBtgH/AdIB8QH4Af8B6AL9Af8B+AH/Af0B/wH7Av4B/wHmAvwB/wHxAf8B/gH/\n        Ae8B8QH9Af8BNgFKAb0B/wG/AdAB5QX/AfkC/gH/AecB/AH9Af8BwQHYAfkB/wGKAZ8B3AH/AUYBhwG/\n        Af8BhAGWAdQB/wGxAcQB9gH/AcIB2gH8Af8BzAHnAfkB/wHOAe0B+gH/AcQB4QH7Af8BqAG/AfMB/wGY\n        AbAB4wH/AY4BpQHWAf8BKwE/AZQB/wIAAQMB/wEPARIBIQH/AgABBAH/AQUBCQEZAf8BDgESASMB/wEL\n        AQ8BHwH/ATwBQQFRAf4DQAH9A00B+gNSAfQDVwHoA1sB1gNZAccDUQGgA0UBfQM3AVoDKgFBAxwBKAMQ\n        ARYDCAELAwQBBRwAAx8BLQEAAYQBmAH/AQABgAGUAf8BWgJcAcwBSwGLAZsB/wFKAYsBmgH/AZkBuQHC\n        Af8BxwP/Ac8D/wHXA/8BxQH5Av8BrQHkAv8BtAHjAv8BrQHiAv8BqAHaAv8BqgHeAv8BogHXAv8BoAHR\n        Av8BmwHQAv8BpQHUAv8BpgHNAv8BogG7Av8BRgGGAv8BsQHGAv8BrAHCAv8BjwGiAv8BSQGHAv8BkAGg\n        Av8BlAGmAv8BlgGlAv8BrQG+Av8BkQGjAv8BggGTAfcB/wFPAZgB2QH/AU4BmQHOAf8BUQGaAcMB/wFL\n        AZkBuwH/AUsBmgG8Af8BgQGhAcUB/wGBAaABwwH/AUwBmAG+Af8BSAGTAbgB/wFAAYoBsAH/AT8BhgGu\n        Af8BNQGBAakB/wEqAUwBogH/AR4BPAGPAf8CAAESAf8DSAGHBwAEAQECAwABAQMAAQEoAAMfAS0BCAEk\n        AY4B/wEFASEBggH/A1wBzAFPAY8BngH/AVEBkQGfAf8BhwGZAaUB/wGUAaUBsAH/AaABsQG6Af8BrQG+\n        AcUB/wGxAcQBzgH/AbcB1AHxAf8BwQHrAv8BpQHMAfUB/wGEAagB6AH/AYUBpQHiAf8BmwG7Av8BtAHV\n        Av8BtwHYAv8BpAG6AeQB/wFMAYUBowH/AQoBEgEfAf8CAAEDAf8CAAEEAf8BQQFPAZQB/wEyAT8BhwH/\n        ARgBIgE9Af8BDwEXASsB/wEIAQ8BIQH/AQQBDAEbAf8BBQEMAR0B/wEAAQEBGgH/AiABLwH/Ag0BFAH/\n        AYIBhwGPAf8BsQG4AcIB/wFTAWcBcQH6AZcBugH8Af8DXAHP/wBJAAMEAQYDCwEPAxoBJQMsAUQDPAFo\n        A0gBiANSAacDYQHiAYUBhAFSAf8BVQFWAVcB/AGRAZgBoQH/AakBrwG3Af8BTwGAAYgB/wEvATMBPAH/\n        AQ8BFAEeAf8BNgFCAZUB/wGdAbMB3gH/AaoBxgH2Af8BsgHRAfcB/wHCAegB9wH/Ad0B+QH6Af8B7QL9\n        Af8B7gH9AfwB/wHhAfwB+wH/AeEB+wH8Af8BvgHUAfYB/wGqAcAB8gH/AcwB4QH5Af8B4QHwAfwB/wHj\n        AfoB+wH/AdgB8wH7Af8B2gHxAfsB/wHJAeUB+wH/AcYB4wH8Af8BxQHiAfkB/wHMAesB+gH/Ac0B7gH9\n        Af8BtwHWAfkB/wGhAbkB7QH/AZABogHXAf8BSAGHAbUB/wFIAYcBsQH/ARIBGQE/Af8DAAH/AQwBDwEc\n        Af8CAAEFAf8BDAERASIB/wEMAREBHgH/AQoBDQEbAf8BMQE2AUQB/gNAAf0CQQFHAfkDWQHyA1cB6ANa\n        AdMDWQHHA1EBogNIAYgDPAFoAy4BRwMcASgDEAEVAwcBCgMEAQUcAANIAYQBAAGDAZcB/wFYAl4B3QNc\n        AfgBhgGbAawB/wGBAZYBpwH/AYYBnQGsAf8ByAHeAeMB/wHgA/8BxQP/AbgB+wL/AbUB8AL/AbUB6QL/\n        Aa0B4wL/AacB2QL/AasB3AL/Aa4B3wL/AaUB1gL/AZ8B0QL/AcoB7wL/AbYBzAL/AY4BoAL/AZIBqAL/\n        AY8BogL/ATcBSAL/AUEBgAL/AUsBiwL/Aa0BwQL/AYwBmwL/ATkBRwL/AYkBmQL/AY8BoAL/AZABoQL/\n        AZ8BrwL/AZgBpwL/AYwBoAL/AYQBnAHnAf8BjAGoAdgB/wE+AYoBtQH/ATABUAGhAf8BOAGFAakB/wE4\n        AYUBrAH/ATEBUgGmAf8BMgFRAaYB/wEyAVEBpwH/AS4BTAGgAf8BKgFJAaEB/wEAAQkBJwH/A00BlTwA\n        A0gBhAEIASQBjgH/AlgBXgHdA1wB+AGIAZ0BrQH/AYUBmgGqAf8BigGeAa4B/wGUAacBtQH/AZ8BsgG9\n        Af8BqgG9AccB/wGvAcIBywH/AbEBwwHLAf8BpgG+AdIB/wGjAcQB9AH/AYgBrAHuAf8BkQGtAegB/wGk\n        AcIB+QH/Ab0B3wL/AccB6AL/AbQByAH2Af8BTwGFAZkB/wEsATIBNQH/ARgBIwEuAf8BJgE8AYYB/wEt\n        AUIBjgH/ARcBJgFGAf8BIAEqAUoB/wEcAScBQQH/ARUBHgEzAf8BDQEWASsB/wETARgBMgH/AgABDAH/\n        AkYBgAH/AwAB/wMAAf8BNAEqAS4B/wGLAY8BrQH/AZcBugH9Af8DLgFH/wBJAAMEAQYDCgEOAxgBIQMq\n        AUADPAFnA0kBiQNSAakDWQH1AosBiAH/AU0BTwFRAfoBlAGbAaQB/wGpAa8BtgH/AU0BUQGHAf8CAAEG\n        Af8BAAEEAQwB/wFRAYcBowH/Aa0BuwHiAf8BrQG/Ae0B/wG7AdMB9AH/AccB5wH+Af8B1QH4Af0B/wHQ\n        AfUB+QH/AdYB9QH6Af8B2gH7AfkB/wHPAfcB+AH/AdMB9AH6Af8BuQHWAfYB/wGtAcsB9AH/AaYBwQHz\n        Af8BngG0AfMB/wGqAb4B8wH/AcAB2QH1Af8BzAHqAfoB/wHTAfIB/QH/AcgB5AH9Af8BuAHSAfkB/wGg\n        AbUB3gH/AYoBmQG7Af8BjgGcAbgB/wGQAaIBtwH/AZEBpQG5Af8BlwGpAboB/wFNAisB/AMAAf8DAAH/\n        A1kB6wNSAfQDQAH9A0AB/QE+AUIBTQH+A0AB/QJRAVIB9wNSAfQDVAHuA1oB2wNZAccDUwGwA0cBgwM+\n        AWsDLgFIAxwBKAMQARUDBwEKAwMBBBwAAVoCXgHVAQABgwGXAf8BVgJXAbgBiAGeAbAB/wGEAZoBrAH/\n        AYABlQGnAf8BgAGUAaYB/wGFAZoBqgH/AcgB5QHpAf8BzgP/AccD/wG5AfMC/wG2AesC/wG1AeoC/wG3\n        AegC/wGtAdsC/wGmAdgC/wGoAdcC/wGdAc4C/wG0Ad8C/wGwAdgC/wGeAb4C/wGyAcsC/wGrAb4C/wGM\n        AZ4C/wFPAY0C/wGJAZoC/wGMAZ4C/wFRAY0C/wGBAZEC/wGXAagC/wGYAaoC/wGXAagC/wFKAYQC/wFB\n        AVAC/wGaAaoC/wGhAbAC/wFDAVEC/wFSAZEB6QH/AZEBqwHKAf8BQQGQAbkB/wE+AYsBtQH/ATkBiAGz\n        Af8BOQGIAbIB/wE0AYUBqwH/ASsBTAGiAf8BKgFNAacB/wESASkBTgH/A1ABnjwAAloBXgHVAQYBIgGI\n        Af8CVgFXAbgBiAGeAbAB/wGFAZsBrQH/AYIBlwGpAf8BhgGaAasB/wGJAZ0BrAH/AZIBpgGzAf8BmwGu\n        AboB/wGiAbUBvwH/AaYBuAHCAf8BogG0Ab8B/wGqAbMBxgH/AZIBpgHLAf8BiwGmAdcB/wGUAa4B2AH/\n        AZcBsgHZAf8BmwG2Ad0B/wGUAaQBxwH/AaMBrgHIAf8BxgHSAeIB/wFNAY0BqQH/ATkBUgGoAf8BEgEn\n        AU4B/wEUASUBRwH/ARQBIwFEAf8BGQEpAUUB/wEcAScBQwH/ARkBIgE2Af8BDQESASsB/wIAAQ0B/wKK\n        AZYB/wMAAf8DAAH/ATIBLwE8Af8BiQGVAbwB/wNbAcb/AE0AAwQBBgMLAQ8DGAEhAykBPwM7AWMDRwGC\n        A1UBsgGIAYEBQgH/AYMBgQFMAf8DXAH4AYEBhwGTAf8BiwGQAZwB/wGKAZEBnQH/ATcBPwFIAf8BPgFJ\n        AYIB/wGPAaMBswH/AY8BogGyAf8BkAGgAa8B/wGkAbcBygH/AaYBuQHNAf8BtQHFAdQB/wHQAeMB8gH/\n        AcwB4wH6Af8BwQHbAf4B/wG3AdMB+wH/Ab8B4AH6Af8BxQHjAfkB/wHKAeQB+AH/Ab0B0wH3Af8BmQGs\n        AfIB/wFRAZQB3gH/AUABiAHQAf8BgAGVAdkB/wGbAbAB4wH/AaUBtgHUAf8BkQGhAbcB/wGSAaUBuQH/\n        AZMBqQG8Af8BmQGyAccB/wGZAbIBxwH/AZkBsgHHAf8BtgGlAYMB/wHXAYUBAAH/AX8BZgExAf4DVQGy\n        A0IBdQNZAesDKwH8AysB/ANNAfoDUQH3AUUBSQFZAfUDXAH4AUYBSwFZAfUDWQHsA1sB1gNWAbgDTQGV\n        Az4BawMwAU0DHQEpAw8BFAMHAQoDAwEEGAADHwEsAQABhgGbAf8BAAGDAZgB/wNaAcUBiAGfAbEB/wGB\n        AZYBpgH/AUkBiQGXAf8BRQGEAZEB/wFJAYkBmAH/AYcBnwGsAf8BzwHpAesB/wHFA/8BugH3Av8BtwHu\n        Av8BtgHlAv8BtQHnAv8BrQHdAv8BpgHWAv8BqAHVAv8BpwHVAv8BpgHRAv8BpwHRAv8BrQHaAv8BtgHf\n        Av8BtwHcAv8BtQHUAv8BvwHVAv8BsgHHAv8BpwG7Av8BkQGgAv8BkgGiAv8BiAGbAv8BTgGLAv8BiQGa\n        Av8BGQEpAv8BlQGoAv8BuwHPAv8BmQGrAv8BsAHFAv8BrAHGAfwB/wGNAa8B2QH/AUUBlAG/Af8BOAGJ\n        AbUB/wE3AYMBsQH/ATQBUgGuAf8BLgFPAaYB/wEnAUkBoQH/ASYBSgGgAf8BHAE9AZQB/wNSAaYDAgED\n        NAADHwEsAQsBKQGYAf8BBgEhAYUB/wNaAcUBiAGfAbEB/wGBAZYBpgH/AUkBiQGXAf8BSAGHAZQB/wFQ\n        AY8BngH/AYcBmgGmAf8BhgGXAaQB/wGIAZcBoQH/AZMBpAGvAf8BlgGoAbQB/wGJAZcBogH/AZIBoAGs\n        Af8BngGpAb4B/wGfAbIBzQH/AZIBqAG/Af8BlAGqAcIB/wHHAdsB+wH/Ae4D/wG8AeMC/wGIAbMB7wH/\n        AS0BUAG4Af8BFAEvAY4B/wEKASABSQH/AQsBHAFAAf8BEQEfAUEB/wEXASIBQAH/ARoBIwE/Af8DAAH/\n        AUUBRAGBAf8BOAE6AUIB/wMAAf8DAAH/AUEBQgGFAf8DfwH+AykBP/8ATQADAwEEAwcBCQMQARUDFgEf\n        AyABLgMwAUsDUgGpAYUBOgEAAf8BYQJbAeEDagH5AYABkwGlAf8BNgFAAUcB/wIXARIB/wIXARIB/wFC\n        AU8BhAH/AU8BjAGYAf8CFQEQAf8BGQEaARYB/wFCAU8BhAH/AUYBgAGKAf8BHQEfARwB/wEwATYBOQH/\n        AT8BRAFLAf8BjwGdAbMB/wGAAYgBpQH/AZcBoAHAAf8BpwG7Ad4B/wGfAbEBzAH/AZkBqgHJAf8BUAGM\n        AawB/wFMAYYBnwH/AYYBlQGwAf8BRQFOAYsB/wFRAY0BnAH/AVIBkAGdAf8BhAGXAaYB/wGXAa8BwwH/\n        AZkBsgHHAf8BmQGyAccB/wGXAbABxQH/AZcBrwHBAf8CbQFRAfcB8QGPAQAB/wJTAVIBqAQAAwoBDQM5\n        AWADRAF8A0UBfgM5AV8DQgF0A0oBigNLAY8DTwGlA1YBuANXAb8DVQG3A1IBpgNIAYYDOgFiAycBOwMS\n        ARkDCQEMAwQBBRgAA0cBggEAAYYBmwH/AV4CYQHaA20B9wGIAZ8BsQH/ATIBPQFDAf8CCgEFAf8CCwEI\n        Af8BLgE5AUAB/wE5AUYBUAH/AS8BOgE3Af8BxAHlAeQB/wHAAf0C/wG7AfEC/wG7AesC/wG1AegC/wG5\n        AegC/wG6AegC/wG6AekC/wG/AewC/wHAAewC/wHDAe4C/wHEAfAC/wHAAesC/wG/AekC/wHBAekC/wHO\n        AfUC/wHOAfAC/wHBAdsC/wHLAeMC/wGyAccC/wGiAbUC/wGhAbUC/wGFAZgC/wE3AUoC/wGOAaMC/wGh\n        AbQB/gH/AZ0BtwH9Af8BhgGsAdkB/wFJAZsByQH/AT0BjQG+Af8BNwGKAbkB/wE0AYYBswH/ATMBhAGy\n        Af8BLgGAAbEB/wEuAVABrgH/ASsBTwGoAf8BJwFLAaQB/wEjAUgBnwH/A1QBrwMFAQc0AANHAYIBCgEl\n        AZAB/wJeAWEB2gNtAfcBiAGfAbEB/wEyAT0BQwH/AgoBBQH/AgwBCQH/ATMBPgFFAf8BPwFMAYMB/wEg\n        AR8BGgH/ASIBJAEhAf8BQAFLAVEB/wFDAU4BggH/ASYBKgEnAf8BNgE9AT4B/wFBAUcBSAH/AZcBogGt\n        Af8BoQGyAcAB/wGwAcYB3AH/AboB0AHvAf8BqwHLAfsB/wGpAd8C/wGbAdUC/wFKAakB/AH/AR8BRAG4\n        Af8BCQElAYkB/wEDARsBQgH/AQEBFQE3Af8BBwEUATAB/wIAAQoB/wMAAf8BkQGQAZsB/wMAAf8DAAH/\n        AwAB/wGhAaQBuQH/A14B1f8AXAABAQgAAwQBBQFdAVsBWQHSAYoBMwEAAf8BVQJTAa0BmQGyAccB/wGG\n        AZoBqQH/AR4BIQEfAf8BIAEiASEB/wEhASUBJAH/ASsBMgEzAf8BIgEmASUB/wEgASMBIQH/ARsBHQEZ\n        Af8BRAFSAYgB/wEoAi0B/wElAioB/wESAREBCwH/ATQBPQFBAf8BkQGoAbsB/wEQAQ8BCAH/AT8BSQFR\n        Af8BPgFHAVAB/wEqAS0BLwH/AhcBEwH/AUcBggGMAf8BDQEKAQMB/wEiASUBJAH/ASgBLgEvAf8BKAIt\n        Af8BHgEhAR4B/wIWARIB/wGJAZ0BrgH/AUwBiAGUAf8BHgEhAR8B/wGPAaYBuAH/AbYBowFRAf8B6wGL\n        AQAB/wF2AVYBKwH8Ax8BLQMAAQEUAAMFBAcBCgMEAQYDCQEMAw4BEwMdASoDKwFDAy8BSgMvAUoDLgFH\n        AykBPgMWAR4DCgEOAwQBBhgAAVwCYAHUAQABhgGbAf8DVQG1AY0BpAG3Af8BSwGKAZcB/wEVARcBFQH/\n        ARYBGAEXAf8BFAEXARYB/wEcASIBIwH/ARQCFwH/ARIBFQETAf8BNgFAAT4B/wHOAfAB8QH/AdQD/wHS\n        A/8B0wP/AdYD/wHcA/8B4AP/Ad4D/wHfA/8B3wP/Ad0D/wHUA/8BxgHvAv8BxAHvAv8BywH5Av8BzAH5\n        Av8B0AH8Av8B0AH7Av8BwwHqAv8BtgHVAv8BnQG7Av8BngG5Av8BUgGUAf4B/wGLAaUB+wH/AYoBrwHn\n        Af8BSwGhAdMB/wFDAZcBygH/ATwBkgHGAf8BOAGNAb4B/wE1AYoBuwH/ATQBiAG5Af8BMwGIAbgB/wEy\n        AYkBtwH/ATEBgwG7Af8BLwGBAbYB/wEqAU8BsgH/AVICZQH0AkYBRwGAOAACXAFgAdQBCAEkAYkB/wNV\n        AbUBjQGkAbcB/wFLAYoBlwH/ARUBFwEVAf8BFgEYARcB/wEUARcBFgH/AR0BIwEkAf8BFwIbAf8BGAEc\n        ARoB/wEWARkBFgH/AToBRQFKAf8BIgInAf8BIgInAf8BGAEZARQB/wE3AT8BQAH/AZABoQGuAf8BPwFD\n        AUAB/wGOAZ4BrQH/AZIBpAG5Af8BkgGrAdAB/wGKAbYB7wH/AYwBxQL/AYcBxQL/AT8BoAL/ARsBQgG9\n        Af8BBgEjAYYB/wEAAQ0BMgH/AgABEQH/AgABEAH/AUABRAGCAf8CIwEnAf8DAAH/AwAB/wIAARAB/wLN\n        Ad8B/wNEAXn/AGUAAx0BKgGiAT4BAAH/AYYBMQEAAf8DVwG4AZgBsQHGAf8BPgFLAVIB/wEdASABHgH/\n        AS4BNQE4Af8BNAE+AUMB/wE3AUEBRgH/AhIBDQH/ASwBMwE1Af8BDgEMAQUB/wGPAaUBuAH/AQsBCAEB\n        Af8BFQEUAQ8B/wIXARMB/wFJAYUBjwH/AToBRQFLAf8BJgIqAf8BRgGAAYoB/wEUARMBDgH/ASABIwEi\n        Af8BHgEgAR4B/wE2AT8BRAH/ASsBMQEyAf8CFgERAf8BSAGEAY4B/wESAREBCwH/ASsBMQEyAf8BLQE0\n        ATYB/wGQAacBuQH/AR4BIQEfAf8BNgE/AUQB/wGZAbEBwwH/AWcBXAE+AfgB7gGLAQAB/wJSAVABowMB\n        AQIDAAEBAwABATQAAwIBAwMIAQsDBAEGAwEBAgMBAQIUAAMfASwBAAGHAZ0B/wEAAYcBnAH/AVcCWgG9\n        AY4BpQG4Af8BNAFAAUYB/wEVARcBFgH/ASMBKAErAf8BJgEuATMB/wEoATABNAH/AggBBAH/ARwBIgEj\n        Af8BBgEEAQAB/wGhAa0BtwH/AvQB8wH/AfMD/wHmA/8B4gP/AegD/wHyA/8B6wP/AeED/wHcA/8B2AP/\n        AcwB/QL/AcYB+QL/AbwB7wL/Aa4B3wL/AaQB1gL/AZ0BzQL/AZABwAH7Af8BjgG9AfQB/wGNAbsB8AH/\n        AZEBuQHzAf8BmwHBAfoB/wGbAcEB9wH/AYgBrgHjAf8BSgGiAdkB/wFEAZ0B1QH/AT8BmAHSAf8BOwGV\n        AcwB/wE5AZEBygH/ATcBjwHJAf8BZQJqAfkDXAHqA10B1wFVAlcBugFMAk0BkQFBAkIBcwMzAVMDDgET\n        NAADHwEsAQ4BLAGfAf8BCAEjAYgB/wNaAb0BjgGlAbgB/wE0AUABRgH/ARUBFwEWAf8BIwEoASsB/wEm\n        AS4BMwH/ASgBMAE0Af8CCQEFAf8BHgEkASUB/wEIAQYBAAH/AUsBigGYAf8BCAEGAQAB/wIPAQsB/wIS\n        AQ8B/wE+AUkBUQH/AToBRAFIAf8BNgI8Af8BgwGQAZYB/wE8AkEB/wFKAYQBkAH/AUkBkAGvAf8BQQGg\n        AeMB/wFKAbEB/gH/AYEBwQL/AUkBrwL/ASABSgHEAf8BBQEdAU0B/wEwAT4BjgH/ASsBNQFRAf8BNgE8\n        AU0B/wMAAf8DAAH/AwAB/wE6AUABTAH/A1wB6gMUARv/AGQAAQEBRgJFAX4BlgE5AQAB/wFgAlsB1gNi\n        AfYBmAGxAcYB/wEmAisB/wEeASEBHwH/AUsBhgGRAf8BSgGFAZAB/wE0ATwBQQH/AREBDwEJAf8BKgEw\n        ATIB/wElAioB/wFBAU4BggH/AhMBDQH/ARIBEQELAf8BLAEyATQB/wGKAZ8BsAH/ARABDgEIAf8BOQFE\n        AUoB/wFBAU0BggH/AhcBEwH/ARoBGwEYAf8BQgFPAYQB/wEjAScBJgH/AS4BNQE4Af8BIwInAf8BMAE3\n        AToB/wEuATUBNwH/AUoBhgGRAf8BjwGlAbcB/wFHAYIBjAH/AR4BIQEfAf8BlAGsAcAB/wG2AaEBTQH/\n        AesBiwEAAf8BdwFWASsB/AMaASUDAAEBAwABAQMAAQFcAAJGAUcBgAEAAYgBnQH/AVoCXgHYA20B9wGO\n        AaUBuQH/AR4CIwH/ARYBGAEXAf8BOwFIAVIB/wE5AUUBTgH/ASUBLAEwAf8BBgEEAQAB/wEcASABIgH/\n        ARcCGwH/AS4BOAE+Af8CiAGGBf8B4QP/AdkD/wHSA/8B0AP/AcwD/wHBAfYC/wG0AegC/wGwAeMC/wGt\n        AeAC/wGkAdgC/wGkAdYC/wGiAdQC/wGfAdMC/wGeAdIC/wGZAcgC/wGUAcMB/gH/AY4BwQH9Af8BiAG8\n        AfgB/wFSAbYB8AH/AUoBrAHqAf8BSQGmAekB/wFLAakB6wH/AU0BrAHoAf8DZAHsA1cBugNMAY8DPQFo\n        Ay4BSAMmATkDHAEnAwoBDkQAAkYBRwGAAQsBKQGWAf8CWgFeAdgDbQH3AY4BpQG5Af8BHgIjAf8BFgEY\n        ARcB/wE7AUgBUgH/ATkBRQFOAf8BJQEsATAB/wEGAQQBAAH/ARwBIAEiAf8BGAIcAf8BMAE6AUAB/wEJ\n        AQoBBgH/AgkBBAH/AR8BJAElAf8BSQGGAZQB/wIRAQ0B/wE2AT8BRAH/AUIBTQFRAf8BKgEsASoB/wEt\n        ATABLgH/AYABhQGOAf8BRAGFAagB/wE3AZAB1QH/AT4BpAH7Af8BgwG7Av8BSQGqAv8BlwG5Av8BTAGK\n        AbUB/wEzATkBUAH/AwAB/wMAAf8DAAH/AgABAwH/AaEBsgHNAf8DOAFdAwEBAv8AZQACXQFZAdIBkQE2\n        AQAB/wFWAlQBqwGZAbIBxwH/AYwBoQGyAf8BIQEkASMB/wEcAR8BHAH/AR4BIQEeAf8BKwExATMB/wEm\n        AisB/wEcAR8BHAH/ARsBHQEaAf8BUgGRAZ4B/wEXARgBEwH/ATYBQAFFAf8BDgEMAQUB/wEvATYBOQH/\n        AREBEAEKAf8BCwEIAQAB/wEwATgBOwH/ASMBJgElAf8BGAEZARUB/wETARIBDQH/AU8BjAGYAf8BIQEk\n        ASIB/wIWAREB/wGTAaoBvQH/ARsBHQEZAf8BGgEbARgB/wEtATQBNgH/AUsBiAGTAf8CGAEUAf8BMQE5\n        ATwB/wGVAaoBuQH/AmoBQQH5AewBjAEAAf8CUQFPAZwHAAEBAwABAWAAAVoCXQHTAQABiAGeAf8DVAGv\n        AZIBqgG+Af8BhAGXAacB/wEbAR0BHAH/ARQBFwEUAf8BFQEXARUB/wEfASQBJgH/ARoCHgH/AREBEwER\n        Af8BEAERAQ8B/wE8AUsBgwH/AQ0BDgEJAf8BJgEuATIB/wGFAZABjQH/AdEC/gH/AckD/wHAAfgC/wG5\n        AfAC/wG1Ae4C/wGtAegC/wGvAekC/wGwAeYC/wGtAeMC/wGmAdsC/wGkAdgC/wGhAdMC/wGeAdAC/wGc\n        AdIC/wGZAdAC/wGUAcsC/wGTAcwC/wGZAdEB+gH/An8BogH+AZQB7AH9Af8DXgHZAzsBYwMwAUsDIAEu\n        Aw0BElwAAloBXQHTAQkBJQGOAf8DVAGvAZIBqgG+Af8BhAGXAacB/wEbAR0BHAH/ARQBFwEUAf8BFQEX\n        ARUB/wEfASQBJgH/ARoCHgH/AREBEwERAf8BEAERAQ8B/wE8AUsBgwH/AQ0BDgEJAf8BJQEtATEB/wEF\n        AQQBAAH/ASEBJgEoAf8BCgEJAQQB/wEFAQQBAAH/ASYBLgExAf8BIAEjASIB/wEaARwBGQH/AhkBFQH/\n        AUwBgQGIAf8BTQFEAUoB/wEyAUQBnQH/ATwBggG/Af8BRQGWAd8B/wGbAcMB/gH/AaAByQL/AS0BRAGm\n        Af8CAAEUAf8DAAH/AwAB/wMAAf8BNgFNAZQB/wNgAd4DBAEFAwABAf8AYQADHQEqAbMBRgEAAf8BiwEz\n        AQAB/wNVAbUBmQGyAccB/wGDAZUBowH/ASsBMQEzAf8BGgEcARgB/wEyAToBPgH/AVABjgGbAf8BLAEy\n        ATQB/wEwATcBOgH/AU8BjQGZAf8BiwGgAbEB/wFHAYIBjAH/AYIBlQGjAf8BgAGRAZ8B/wFSAZABngH/\n        AU8BjAGZAf8BUgGQAZ4B/wGTAasBvwH/AYABkgGfAf8BhgGZAagB/wGWAa4BwgH/AY4BpAG2Af8BTgGM\n        AZgB/wGJAZ0BrgH/AZgBsQHGAf8BTgGLAZcB/wGAAZEBnwH/AYsBoAGxAf8BRAFRAYcB/wE9AUkBUAH/\n        AYIBlQGjAf8BtgGiAUoB/wHlAYoBAAH/AmoBQQH5AxYBHwMAAQEDAAEBYAADHgErAQABiQGfAf8BAAGI\n        AZ4B/wNXAbgBkwGrAb8B/wFPAY0BmgH/ASUBKgEsAf8BFAEVARIB/wEoAS8BMwH/AUEBUAGIAf8BIAEl\n        AScB/wEiASgBKgH/AT0BSgGBAf8BRwGFAZQB/wEzAT4BRwH/AT4BTgGHAf8BPQFLAYMB/wGrAbwBwQH/\n        AcEC/gH/AbcB8QL/AbAB6AL/AagB4gL/AagB5AL/AawB5wL/AaoB5QL/AagB4QL/AaoB4gH9Af8BrQHl\n        AfsB/wG0AesB9QH/AbUB5wHsAf8BtwHfAeQB/wGtAcUByQH/Aa8BtAG4Af8BsgG8AcQB/wGZAdYB4AH/\n        ATkB8wH0Af8BXwKCAfsDHAEoaAADHgErAQ8BLwGkAf8BCQEkAYoB/wNXAbgBkwGrAb8B/wFPAY0BmgH/\n        ASUBKgEsAf8BFAEVARIB/wEoAS8BMwH/AUEBUAGIAf8BIAElAScB/wEiASgBKgH/AT0BSgGBAf8BRwGF\n        AZQB/wEzAT4BRwH/AT4BTgGHAf8BPQFLAYMB/wE8AUoBggH/ATsBSAFSAf8BPgFLAYMB/wFPAY8BngH/\n        AUABTgGFAf8BRgGCAY4B/wGAAZMBowH/AVABjgGcAf8BRAFRAYYB/wFRAYwBmQH/AYsBlgGqAf8BUAGG\n        AaIB/wElATkBlQH/AQABFAFNAf8CAAEnAf8BAAENAUUB/wEGASMBkAH/AgABMQH/ARIBJgFMAf8DfwH+\n        Ay4BRwcAAQH/AGEAAUYCRQF+AakBQQEAAf8BYAJbAdYDXwHzAZkBsgHHAf8BmQGyAccB/wGGAZkBqQH/\n        AYcBmwGrAf8BmQGyAccB/wGWAa8BwwH/AY8BpQG3Af8BkwGrAb4B/wGZAbIBxwH/AZYBrgHCAf8BmQGy\n        AcYB/wGZAbIBxwH/AZkBsgHHAf8BmQGyAccB/wGZAbIBxwH/AZkBsgHHAf8BmQGyAccB/wGZAbIBxwH/\n        AZkBsgHHAf8BmQGyAccB/wGZAbIBxwH/AZkBsgHHAf8BmQGyAccB/wGZAbIBxwH/AZkBsgHHAf8BmQGy\n        AccB/wGZAbIBxwH/AZkBsgHHAf8BmQGyAccB/wGbAbEBwgH/AW0BTQEpAfoB5wGKAQAB/wNOAZlsAAJG\n        AUcBgAEAAYkBnwH/AVkCXQHXA18B8wGUAawBwAH/AZIBqQG9Af8BUQGPAZ4B/wFPAY4BnQH/AYsBoQG0\n        Af8BhQGbAawB/wFQAZABoAH/AVEBkwGjAf8BggGXAakB/wGAAZQBpAH/AYABlQGlAf8BgAGVAaYB/wFR\n        AZMBowH/AYIBlQGmAf8BvAHNAdUB/wGrAekB+AH/AbQB8gH6Af8BvQHyAfYB/wHCAe8B8gH/AcQB6gHt\n        Af8BxwHdAeIB/wHBAc8B1gH/AbEBwgHMAf8BpwG2AcIB/wGfAa8BvQH/AZkBqwG6Af8BmAGrAbsB/wGa\n        Aa0BvQH/AZ8BsgHBAf8BpAG6AckB/wFeAX8BgQH7ATAB8wH2Af8DVAGubAACRgFHAYABDAErAZoB/wJZ\n        AV0B1wNfAfMBlAGsAcAB/wGSAakBvQH/AVEBjwGeAf8BTwGOAZ0B/wGLAaEBtAH/AYUBmwGsAf8BUAGQ\n        AaAB/wFRAZMBowH/AYIBlwGpAf8BgAGUAaQB/wGAAZUBpQH/AYABlQGmAf8BUQGTAaMB/wFRAZIBowH/\n        AVEBkQGiAf8BUQGRAaIB/wFSAZMBpAH/AVIBkwGjAf8BgQGVAaUB/wGDAZcBpwH/AYIBlgGmAf8BhgGZ\n        AakB/wGIAZwBrAH/AY0BngGtAf8BkAGeAa8B/wFBAVABnAH/ARcBLQGMAf8BMgFPAbgB/wFMAaEB6AH/\n        ASMBTQHeAf8BIQFEAcEB/wGFAZ0B2gH/A1kBvwMAAQEDAAEBAwIBA/8AYQACXQFZAdIBlgE5AQAB/wFT\n        AlIBqAGZAbIBxwH/AZkBsgHHAf8BmQGyAccB/wGZAbIBxwH/AZkBsgHHAf8BmQGyAccB/wGZAbIBxwH/\n        AZkBsgHHAf8BmQGyAccB/wGZAbIBxwH/AZkBsgHHAf8BmQGyAccB/wGZAbIBxwH/AZkBsgHHAf8BmQGy\n        AccB/wGZAbIBxwH/AZkBsQHFAf8BlwGiAZ8B/wGYAaMBnwH/AZkBowGfAf8BmgGkAZ8B/wGbAaQBnwH/\n        AZsBpAGfAf8BnAGoAakB/wGZAbIBxwH/AZkBsgHHAf8BmQGyAccB/wGZAbIBxwH/AZkBsgHHAf8BmQGy\n        AccB/wG1AZ8BQwH/Ad4BhwEAAf8CagFBAfkDFAEbbAABWgJdAdMBAAGJAZ8B/wNTAaoBlgGuAcMB/wGU\n        AawBwQH/AZMBqwG/Af8BkAGoAbsB/wGOAaUBuQH/AYwBowG3Af8BigGgAbMB/wGIAZ4BsAH/AYUBmwGt\n        Af8BgwGZAasB/wGDAZgBqgH/AYEBlgGoAf8BgQGWAaYB/wGAAZUBpQH/AVEBkgGjAf8BggGVAaYB/wGh\n        AbABvAH/AZMBswG+Af8BjgGqAbgB/wGAAaABsAH/AUwBmgGrAf8BQwGVAagB/wFGAZgBqwH/AUwBnAGw\n        Af8BiwGfAa8B/wGPAaMBswH/AZIBpQG2Af8BlgGpAboB/wGbAa4BvgH/AaABswHCAf8BUQHIAdYB/wEn\n        AecB8QH/AVkBgQGCAfsDGgEkbAACWgFdAdMBCgEnAZIB/wNTAaoBlgGuAcMB/wGUAawBwQH/AZMBqwG/\n        Af8BkAGoAbsB/wGOAaUBuQH/AYwBowG3Af8BigGgAbMB/wGIAZ4BsAH/AYUBmwGtAf8BgwGZAasB/wGD\n        AZgBqgH/AYEBlgGoAf8BgQGWAaYB/wGAAZUBpQH/AVEBkgGjAf8BUgGTAaQB/wFRAZIBowH/AUIBhgGg\n        Af8BQwGGAaEB/wFEAYcBowH/AUYBiAGlAf8BRwGKAacB/wFKAY0BqwH/AVIBkwGvAf8BjAGfAa4B/wGR\n        AaEBsAH/AYUBlAGuAf8BPAFRAaoB/wEzAU4BsQH/AS8BTQG3Af8BPgGLAc4B/wGEAaYB9QH/AUkBXQF3\n        AfwDGgEkCAADAQEC/wBdAAMdASoBtwFIAQAB/wGOATQBAAH/A04BlQNWAbEDTgGZA1IBpwNVAa0DVQGt\n        AlkBVgG+AVICUAGjAVICUAGjAVoCWAHAAVkCVwHCAVsCWQHEAWECXAHcAWACWwHWA18B4AGLATIBAAH/\n        AY0BNQEAAf8BkAE1AQAB/wGRATYBAAH/AZUBOAEAAf8BlwE6AQAB/wGbATwBAAH/AaEBPwEAAf8BpgFB\n        AQAB/wGrAUMBAAH/AbABRgEAAf8BtgFIAQAB/wG6AUsBAAH/AcMBTwEAAf8BzAFRAQAB/wJlAVIB9AJd\n        AU4B8AHeAYcBAAH/AkwBSwGQbAADHgErAQABigGfAf8BAAGJAZ8B/wNOAZgDVgG0A1ABngFTAlUBrQFV\n        AlYBtANVAbUBWAJbAcYBVQJWAbEDVgGzAVkCXAHMAVkCXAHPAVgCXAHRAV4CZQHlAVsCYQHhAVcCXwHo\n        AQABTQGPAf8BAAFOAZAB/wEAAVABkwH/AQABUgGVAf8BAAGBAZkB/wEAAYYBngH/AQABigGjAf8BAAGP\n        AakB/wEAAZUBswH/AQABngG9Af8BAAGkAcYB/wEFAa0B0AH/AQkBtQHcAf8BDgG/AeMB/wESAckB5wH/\n        AVECbQH3AVICZQH0ASYB5AHwAf8DUQGibAADHgErARIBMgGvAf8BCgEnAY8B/wNOAZgDVgG0A1ABngNV\n        Aa0BVQJWAbQDVQG1AVgCWwHGAlUBVgGxA1YBswJZAVwBzAJZAVwBzwJYAVwB0QJeAWUB5QJbAWEB4QJX\n        AV8B6AEEARwBgQH/AQQBHgGFAf8BBQEhAYgB/wEFASIBjAH/AQgBIwGRAf8BCgEnAZgB/wEOASoBngH/\n        AQ8BLQGmAf8BEAExAa8B/wETATUBvgH/ARcBOwHIAf8BHQFCAdUB/wEhAUcB3gH/ASgBTgHiAf8BLgGA\n        AdsB/wFhAmoB+QNiAfYBQQGVAe4B/wNRAaIDAAEB/wBpAAFGAkUBfgGiAT4BAAH/AV4CWgHVAVwCWQHM\n        AV0BWgFOAfABUgEuAQAB/wFSAS4BAAH/AYEBLgEAAf8BgAEuAQAB/wGBAS4BAAH/AYMBLwEAAf8BgwEv\n        AQAB/wGCAS8BAAH/AYMBLwEAAf8BhgEvAQAB/wGHATEBAAH/AYYBMQEAAf8BiAExAQAB/wGLATIBAAH/\n        AY0BMwEAAf8BkAE2AQAB/wFXAisB/AFcAlkBzAFcAlkBzAFcAlkBzAFcAlkBzAFeAVwBWgHYAakBQgEA\n        Af8BsQFGAQAB/wG1AUcBAAH/AboBSwEAAf8BwwFOAQAB/wHMAVEBAAH/Ac8BgQEAAf8B1gGEAQAB/wJf\n        AUwB8wMSARhsAAJGAUcBgAEAAYkBnwH/AVsCYAHWAVoCXAHNAU4CXQHwAQABiAGeAf8BAAGHAZ0B/wEA\n        AYYBmwH/AQABhAGZAf8BAAGDAZcB/wEAAYEBlQH/AQABgAGUAf8BAAFRAZIB/wEAAU8BkAH/AQABTgGP\n        Af8BAAFOAY4B/wEAAU4BjwH/AQABTQGPAf8BAAFMAY4B/wEAAU0BjwH/AQABUAGSAf8BQAGAAZcB/QFe\n        AmEB2gFbAl4B2QFbAl4B2QFeAmEB2gFYAl8B4wEAAZoBtwH/AQABoQHAAf8BAgGqAcwB/wEGAbIB2AH/\n        AQsBuwHhAf8BEQHEAeYB/wEVAc4B6QH/ARwB1wHtAf8BSQJiAfYDFgEfbAACRgFHAYABDgEtAZ4B/wJb\n        AWAB1gJaAVwBzQJOAV0B8AEIASMBhgH/AQcBIgGGAf8BBwEhAYUB/wEGASABgwH/AQUBIAGCAf8BBQEg\n        AYEB/wEEAR8BgAH/AQMBHgFRAf8BAwEeAVEB/wEEAR0BTwH/AQQBHQFRAf8BBAEcAVEB/wEDAR0BgAH/\n        AQQBHAGCAf8BBAEeAYMB/wEFASABiAH/AkABigH9Al4BYQHaAlsBXgHZAlsBXgHZAl4BYQHaAlgBXwHj\n        ARMBNQG4Af8BFQE5AcIB/wEaAT4BzgH/AR0BRAHbAf8BIgFJAeEB/wEqAVEB5gH/AS0BgwHpAf8BNAGL\n        Ae0B/wNiAfYDFgEf/wBtAAJdAVkB0gGwAUQBAAH/AaUBPwEAAf8BnwE8AQAB/wGYATkBAAH/AY0BNAEA\n        Af8BgQEuAQAB/wFfAloB2wFcAlkBzAFcAlkBzANRAaIDTgGZA04BmQM9AWkDPAFmAzsBYwMjATMDIwEz\n        AxwBJzQAAw0BEgMjATMDIwEzAy0BRXAAAVoCXQHTAQABiQGfAf8BAAGJAZ8B/wEAAYkBngH/AQABiAGe\n        Af8BAAGHAZwB/wEAAYYBnAH/AVgCXgHdAVsCXgHQAVsCXgHQA1MBqgFQAlIBowFQAlIBowNDAXcDQgF0\n        AkEBQgFzAykBPwMpAT8DIQExNAADEQEXAykBPwMqAUABNAI1AVVwAAJaAV0B0wELASgBlAH/AQgBJAGI\n        Af8BCAEkAYcB/wEIASMBhwH/AQcBIwGHAf8BBwEiAYYB/wJYAV4B3QJbAV4B0AJbAV4B0ANTAaoCUAFS\n        AaMCUAFSAaMDQwF3A0IBdANBAXMDKQE/AykBPwMhATEnAAEBAwABAQMAAQEEAAMRARcDKQE/AyoBQAI0\n        ATUBVf8AbQADCwEPA04BmQFGAkUBfgM8AWYDLgFIAyMBMwMLAQ/kAAMMARABTwJQAZsCRgFHAYACPAE9\n        AWgDLwFKAyQBNQMMARDkAAMMARACTwFQAZsCRgFHAYACPAE9AWgDLwFKAyQBNQMMARD/AP8A/wD/AEcA\n        AQH/AP8A/wDvAAMBAQJUAAMCAQP/AP8A/wDqAAEBAwABAQsAAQEDAAEBAwABAf8A/wD/AP8A/wD/AP8A\n        /wD/AP8A/wD/AP8AXQABQgFNAT4HAAE+AwABKAQAAQECAAFAAwABAQEAAQEGAAEIFgAD/wEAGP8IABj/\n        CAAY/wgAAv8BAAF/Bv8BAAF/Bv8BAAF/BP8IAAH/Af4BAAEHBf8B/gEAAQcF/wH+AQABBwT/CAAB/wH8\n        AgABPwT/AfwCAAE/BP8B/AIAAT8D/wgAAf8B+AIAAQME/wH4AgABAwT/AfgCAAEDA/8IAAH/AfADAAE/\n        A/8B8AMAAT8D/wHwAwABPwL/CAAB/wHgAwABAwP/AeADAAEDA/8B4AMAAQMC/wgAAf8BwAQAAT8C/wHA\n        BAABPwL/AcAEAAE/Af8IAAH/AYAEAAEfAv8BgAQAAR8C/wGABAABHwH/CAAB/wUAAQ8C/wUAAQ8C/wUA\n        AQ8B/wgAAf4GAAF/Af4FAAEPAf8B/gUAAQ8B/wgAAfwHAAH8BQABBwH/AfwFAAEHAf8IAAH4BwAB+AUA\n        AQcB/wH4BQABBwH/CAAB8AcAAfAGAAEfAfAGAAEfCAAB4AcAAeAGAAEBAeAGAAEBCAABIAcAAeAGAAED\n        AeAGAAEDEAABwAYAAQMBwAYAAQMQAAGABgABBwGAHgABDx8AAR8fAAEfHwABHwcAAQEXAAEPBwABARcA\n        AQ8HAAEBEAABgAYAAQcBgAYAAQMQAAHgBgABBwHgBgABDxAAAf8B8AUAAQcB/wHABQABfxAAAf8B8AUA\n        AQcB/wUAAQEB/xAAAf8B4AUAAQcB/wGABAABAwH/EAAB/wHgBQABBwH/BQABBwH/EAAB/wHgBQABBwH/\n        AYAEAAEPAf8QAAH/AcAFAAEHAf8BgAQAAR8B/xAAAf8BwAUAAQcB/wUAAR8B/xAAAf8BwAUAAQcB/wGA\n        BAABPwH/EAAB/wGABQABBwH/BQABfwH/EAAB/wGABQABBwH/AYAEAAF/Af8QAAH/AYAFAAEHAf8BgAQA\n        Av8QAAH/BgABBwH/BQAC/xAAAf8GAAEHAf8EAAEBAv8QAAH/BgABBwH/BAABAQL/EAAB/gYAAYcB/gQA\n        AQMC/xAAAf4GAAH/Af4EAAEDAv8QAAH+BgAB/wH+BAABBwL/EAAB/AYAAX8B/AQAAQcC/w0AAQgCAAH8\n        BgABfwH8BAABDwL/CAAB2AQAAQcBwAEAAfwGAAH/AfwEAAEPAv8IAAH4BAABAwH/AeAB+AYAAf8B+AQA\n        AQ8C/wgAAfAEAAEDAv8B+AUAAQ8B/wH4BAABDwL/CAAB+AQAAScC/wH4BAABAwL/AfgEAAEPAv8IAAHw\n        BAABDwL/AfAEAAE/Av8B8AQAAS8C/wgAAfAEAAF/Av8B8AQAAX8C/wHwBAABDwL/CAAB8AQAAX8C/wHw\n        BAABfwL/AfAEAAFvAv8IAAHgBAAD/wHgBAAD/wHgBAABfwL/CAAB4AQAA/8B4AQAA/8B4AQAA/8IAAHg\n        AQABAwH/AeED/wHgAQABAwH/AeED/wHgAQABAwH+ASED/wgAAcABfwb/AcABfwb/AcABfwb/CAAT/wG/\n        BP8IABL/AfsC/wHvAv8IABT/AfkBjwL/CAAY/wgAGP8IABj/CAAL\n</value>\n  </data>\n  <metadata name=\"ImageListIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>120, 17</value>\n  </metadata>\n  <data name=\"ImageListIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        AAAAAk1TRnQBSQFMAgEBAwEAAQwBBgEMAQYBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABEAMAAQEBAAEQBgABCP8A/wD/AP8A/wD/AP8A/wAaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB\n        AQABAQUAAYAXAAP/AQAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAB8AEPAf4BfwL/AgAB+AEfAfwBPwL/\n        AgAB/AE/AfgBHwL/AgAB/gF/AfABDwL/AgAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAL\n</value>\n  </data>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>252, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/DetailsWindow/EveMessageWindow.Designer.cs",
    "content": "using EVEMon.CharacterMonitoring;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Controls;\n\nnamespace EVEMon.DetailsWindow\n{\n    partial class EveMessageWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.throbber = new EVEMon.Common.Controls.Throbber();\n            this.readingPane = new ReadingPane();\n            ((System.ComponentModel.ISupportInitialize)(this.throbber)).BeginInit();\n            this.SuspendLayout();\n            // \n            // throbber\n            // \n            this.throbber.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.throbber.Location = new System.Drawing.Point(195, 104);\n            this.throbber.MaximumSize = new System.Drawing.Size(24, 24);\n            this.throbber.MinimumSize = new System.Drawing.Size(24, 24);\n            this.throbber.Name = \"throbber\";\n            this.throbber.Size = new System.Drawing.Size(24, 24);\n            this.throbber.State = ThrobberState.Stopped;\n            this.throbber.TabIndex = 1;\n            this.throbber.TabStop = false;\n            // \n            // readingPane\n            // \n            this.readingPane.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.readingPane.Location = new System.Drawing.Point(0, 0);\n            this.readingPane.MinimumSize = new System.Drawing.Size(250, 150);\n            this.readingPane.Name = \"readingPane\";\n            this.readingPane.Size = new System.Drawing.Size(414, 232);\n            this.readingPane.TabIndex = 0;\n            // \n            // EveMessageWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(414, 232);\n            this.Controls.Add(this.readingPane);\n            this.Controls.Add(this.throbber);\n            this.MinimumSize = new System.Drawing.Size(400, 250);\n            this.Name = \"EveMessageWindow\";\n            this.Text = \"EVE Mail Message\";\n            ((System.ComponentModel.ISupportInitialize)(this.throbber)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private ReadingPane readingPane;\n        private Common.Controls.Throbber throbber;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/DetailsWindow/EveMessageWindow.cs",
    "content": "using System;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Notifications;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.DetailsWindow\n{\n    public sealed partial class EveMessageWindow : EVEMonForm\n    {\n        private readonly Timer m_timer = new Timer();\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveMessageWindow\"/> class.\n        /// </summary>\n        private EveMessageWindow()\n        {\n            InitializeComponent();\n\n            RememberPositionKey = \"EVEMessageWindow\";\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveMessageWindow\"/> class.\n        /// Constructor used in WindowsFactory.\n        /// </summary>\n        /// <param name=\"message\">The message.</param>\n        /// <exception cref=\"System.ArgumentNullException\">message</exception>\n        public EveMessageWindow(IEveMessage message)\n            : this()\n        {\n            message.ThrowIfNull(nameof(message));\n\n            EveMonClient.CharacterEVEMailBodyDownloaded += EveMonClient_CharacterEVEMailBodyDownloaded;\n            EveMonClient.NotificationSent += EveMonClient_NotificationSent;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            Disposed += OnDisposed;\n\n            Tag = message;\n            Text = $\"{message.Title} - EVE Message\";\n            readingPane.SelectedObject = message;\n        }\n\n        /// <summary>\n        /// On load.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            var notification = Tag as EveNotification;\n            if (notification != null)\n            {\n                // Notification text is available now\n                throbber.State = ThrobberState.Stopped;\n                throbber.Visible = false;\n                readingPane.SelectedObject = notification;\n            }\n            else\n            {\n                throbber.State = ThrobberState.Rotating;\n\n                // Configure the timer to close the form on queries timeout\n                m_timer.Start();\n                m_timer.Interval = (int)TimeSpan.FromSeconds(Settings.Updates.HttpTimeout).TotalMilliseconds;\n\n                m_timer.Tick += timer_Tick;\n            }\n        }\n\n        /// <summary>\n        /// Called when [disposed].\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterEVEMailBodyDownloaded -= EveMonClient_CharacterEVEMailBodyDownloaded;\n            EveMonClient.NotificationSent -= EveMonClient_NotificationSent;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// Handles the Tick event of the timer control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void timer_Tick(object sender, EventArgs e)\n        {\n            m_timer.Stop();\n\n            // Close the form when there is nothing to show after query timeout\n            if (!readingPane.Visible)\n                Close();\n        }\n\n        /// <summary>\n        /// Handles the CharacterEVEMailBodyDownloaded event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterEVEMailBodyDownloaded(object sender, CharacterChangedEventArgs e)\n        {\n            throbber.State = ThrobberState.Stopped;\n            throbber.Visible = false;\n            readingPane.SelectedObject = (EveMailMessage)Tag;\n        }\n        \n        /// <summary>\n        /// Handles the NotificationSent event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.Notifications.NotificationEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_NotificationSent(object sender, NotificationEventArgs e)\n        {\n            APIErrorNotificationEventArgs notification = e as APIErrorNotificationEventArgs;\n            if (notification != null)\n            {\n                var eveMailBodiesResult = notification.Result as CCPAPIResult<\n                    SerializableAPIMailBodies>;\n                if (eveMailBodiesResult != null && notification.Result.HasError)\n                    // In case there was an error, close the window\n                    Close();\n            }\n        }\n\n        /// <summary>\n        /// Handles the EveIDToNameUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            if (Visible)\n                readingPane.UpdatePane();\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/DetailsWindow/EveMessageWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/DetailsWindow/KillReportWindow.Designer.cs",
    "content": "﻿namespace EVEMon.DetailsWindow\n{\n    partial class KillReportWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.killReportFittingContent = new EVEMon.Controls.KillReportFittingContent();\n            this.killReportInvolvedParties = new EVEMon.Controls.KillReportInvolvedParties();\n            this.killReportVictim = new EVEMon.Controls.KillReportVictim();\n            this.SuspendLayout();\n            // \n            // killReportFittingContent\n            // \n            this.killReportFittingContent.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.killReportFittingContent.Location = new System.Drawing.Point(262, 142);\n            this.killReportFittingContent.Name = \"killReportFittingContent\";\n            this.killReportFittingContent.Size = new System.Drawing.Size(322, 440);\n            this.killReportFittingContent.TabIndex = 2;\n            // \n            // killReportInvolvedParties\n            // \n            this.killReportInvolvedParties.Dock = System.Windows.Forms.DockStyle.Left;\n            this.killReportInvolvedParties.Location = new System.Drawing.Point(0, 142);\n            this.killReportInvolvedParties.Name = \"killReportInvolvedParties\";\n            this.killReportInvolvedParties.Padding = new System.Windows.Forms.Padding(0, 3, 0, 0);\n            this.killReportInvolvedParties.Size = new System.Drawing.Size(262, 440);\n            this.killReportInvolvedParties.TabIndex = 1;\n            // \n            // killReportVictim\n            // \n            this.killReportVictim.AutoSize = true;\n            this.killReportVictim.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.killReportVictim.Dock = System.Windows.Forms.DockStyle.Top;\n            this.killReportVictim.Location = new System.Drawing.Point(0, 0);\n            this.killReportVictim.Name = \"killReportVictim\";\n            this.killReportVictim.Padding = new System.Windows.Forms.Padding(0, 0, 0, 6);\n            this.killReportVictim.Size = new System.Drawing.Size(584, 142);\n            this.killReportVictim.TabIndex = 0;\n            // \n            // KillReportWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(584, 582);\n            this.Controls.Add(this.killReportFittingContent);\n            this.Controls.Add(this.killReportInvolvedParties);\n            this.Controls.Add(this.killReportVictim);\n            this.MaximizeBox = false;\n            this.MinimumSize = new System.Drawing.Size(600, 620);\n            this.Name = \"KillReportWindow\";\n            this.Text = \"Kill Report\";\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private Controls.KillReportVictim killReportVictim;\n        private Controls.KillReportInvolvedParties killReportInvolvedParties;\n        private Controls.KillReportFittingContent killReportFittingContent;\n\n    }\n}"
  },
  {
    "path": "src/EVEMon/DetailsWindow/KillReportWindow.cs",
    "content": "﻿using System.Windows.Forms;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.DetailsWindow\n{\n    public partial class KillReportWindow : EVEMonForm\n    {\n        /// <summary>\n        /// Prevents a default instance of the <see cref=\"KillReportWindow\"/> class from being created.\n        /// </summary>\n        private KillReportWindow()\n        {\n            InitializeComponent();\n            SetStyle(ControlStyles.SupportsTransparentBackColor, true);\n            UpdateStyles();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"KillReportWindow\"/> class.\n        /// Constructor used in WindowsFactory\n        /// </summary>\n        /// <param name=\"killLog\">The kill log.</param>\n        public KillReportWindow(KillLog killLog)\n            : this()\n        {\n            RememberPositionKey = \"KillReportWindow\";\n\n            killReportVictim.KillLog = killLog;\n            killReportInvolvedParties.KillLog = killLog;\n            killReportFittingContent.KillLog = killLog;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/DetailsWindow/KillReportWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/DetailsWindow/WalletJournalChartWindow.Designer.cs",
    "content": "﻿namespace EVEMon.DetailsWindow\n{\n    partial class WalletJournalChartWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();\n            System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();\n            System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();\n            System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea3 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();\n            System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();\n            System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series();\n            this.tabControl = new System.Windows.Forms.TabControl();\n            this.BalanceTabPage = new System.Windows.Forms.TabPage();\n            this.BalanceChart = new System.Windows.Forms.DataVisualization.Charting.Chart();\n            this.AmountTabPage = new System.Windows.Forms.TabPage();\n            this.AmountChart = new System.Windows.Forms.DataVisualization.Charting.Chart();\n            this.tabControl.SuspendLayout();\n            this.BalanceTabPage.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.BalanceChart)).BeginInit();\n            this.AmountTabPage.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.AmountChart)).BeginInit();\n            this.SuspendLayout();\n            // \n            // tabControl\n            // \n            this.tabControl.Controls.Add(this.BalanceTabPage);\n            this.tabControl.Controls.Add(this.AmountTabPage);\n            this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tabControl.Location = new System.Drawing.Point(0, 0);\n            this.tabControl.Name = \"tabControl\";\n            this.tabControl.SelectedIndex = 0;\n            this.tabControl.Size = new System.Drawing.Size(624, 442);\n            this.tabControl.TabIndex = 0;\n            // \n            // BalanceTabPage\n            // \n            this.BalanceTabPage.Controls.Add(this.BalanceChart);\n            this.BalanceTabPage.Location = new System.Drawing.Point(4, 22);\n            this.BalanceTabPage.Name = \"BalanceTabPage\";\n            this.BalanceTabPage.Size = new System.Drawing.Size(616, 416);\n            this.BalanceTabPage.TabIndex = 0;\n            this.BalanceTabPage.Text = \"Balance\";\n            this.BalanceTabPage.UseVisualStyleBackColor = true;\n            // \n            // BalanceChart\n            // \n            chartArea1.Name = \"ChartArea1\";\n            this.BalanceChart.ChartAreas.Add(chartArea1);\n            this.BalanceChart.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.BalanceChart.Location = new System.Drawing.Point(0, 0);\n            this.BalanceChart.Name = \"BalanceChart\";\n            series1.ChartArea = \"ChartArea1\";\n            series1.Name = \"Series\";\n            this.BalanceChart.Series.Add(series1);\n            this.BalanceChart.Size = new System.Drawing.Size(616, 416);\n            this.BalanceChart.TabIndex = 0;\n            this.BalanceChart.Text = \"chart1\";\n            // \n            // AmountTabPage\n            // \n            this.AmountTabPage.Controls.Add(this.AmountChart);\n            this.AmountTabPage.Location = new System.Drawing.Point(4, 22);\n            this.AmountTabPage.Name = \"AmountTabPage\";\n            this.AmountTabPage.Size = new System.Drawing.Size(616, 416);\n            this.AmountTabPage.TabIndex = 1;\n            this.AmountTabPage.Text = \"Amount\";\n            this.AmountTabPage.UseVisualStyleBackColor = true;\n            // \n            // AmountChart\n            // \n            chartArea2.Name = \"ChartArea1\";\n            chartArea3.Name = \"ChartArea2\";\n            this.AmountChart.ChartAreas.Add(chartArea2);\n            this.AmountChart.ChartAreas.Add(chartArea3);\n            this.AmountChart.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.AmountChart.Location = new System.Drawing.Point(0, 0);\n            this.AmountChart.Name = \"AmountChart\";\n            series2.ChartArea = \"ChartArea1\";\n            series2.Name = \"Series1\";\n            series3.ChartArea = \"ChartArea2\";\n            series3.Name = \"Series2\";\n            this.AmountChart.Series.Add(series2);\n            this.AmountChart.Series.Add(series3);\n            this.AmountChart.Size = new System.Drawing.Size(616, 416);\n            this.AmountChart.TabIndex = 0;\n            this.AmountChart.Text = \"chart1\";\n            // \n            // WalletJournalChartWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(624, 442);\n            this.Controls.Add(this.tabControl);\n            this.Name = \"WalletJournalChartWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Wallet Journal Charts\";\n            this.tabControl.ResumeLayout(false);\n            this.BalanceTabPage.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.BalanceChart)).EndInit();\n            this.AmountTabPage.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.AmountChart)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TabControl tabControl;\n        private System.Windows.Forms.TabPage BalanceTabPage;\n        private System.Windows.Forms.TabPage AmountTabPage;\n        private System.Windows.Forms.DataVisualization.Charting.Chart AmountChart;\n        private System.Windows.Forms.DataVisualization.Charting.Chart BalanceChart;\n    }\n}"
  },
  {
    "path": "src/EVEMon/DetailsWindow/WalletJournalChartWindow.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms.DataVisualization.Charting;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.DetailsWindow\n{\n    public partial class WalletJournalChartWindow : EVEMonForm\n    {\n        private readonly CCPCharacter m_ccpCharacter;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Prevents a default instance of the <see cref=\"WalletJournalChartWindow\"/> class from being created.\n        /// </summary>\n        private WalletJournalChartWindow()\n        {\n            InitializeComponent();\n            InitializeBalanceChart();\n            InitializeAmountChart();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"WalletJournalChartWindow\"/> class.\n        /// </summary>\n        /// <param name=\"ccpCharacter\">The CCP character.</param>\n        public WalletJournalChartWindow(CCPCharacter ccpCharacter)\n            : this()\n        {\n            m_ccpCharacter = ccpCharacter;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load, restores the window rectangle from the settings.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            MinimumSize = Size;\n\n            EveMonClient.CharacterWalletJournalUpdated += EveMonClient_CharacterWalletJournalUpdated;\n            Disposed += OnDisposed;\n\n            UpdateBalanceChart();\n            UpdateAmountChart();\n        }\n\n        /// <summary>\n        /// Called when disposed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterWalletJournalUpdated -= EveMonClient_CharacterWalletJournalUpdated;\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Updates the charts when charcter wallet journal updates.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterWalletJournalUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (m_ccpCharacter != e.Character)\n                return;\n\n            UpdateBalanceChart();\n            UpdateAmountChart();\n        }\n\n        #endregion\n\n\n        #region Charts Initialization\n\n        /// <summary>\n        /// Initializes the balance chart.\n        /// </summary>\n        private void InitializeBalanceChart()\n        {\n            // Configure the chart area\n            BalanceChart.ChartAreas[0].BorderColor = Color.Black;\n            BalanceChart.ChartAreas[0].BorderDashStyle = ChartDashStyle.Solid;\n\n            // Configure X axis\n            BalanceChart.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.Silver;\n            BalanceChart.ChartAreas[0].AxisX.LabelAutoFitMaxFontSize = 8;\n            BalanceChart.ChartAreas[0].AxisX.Interval = 1;\n\n            // Configure Y axis\n            BalanceChart.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.Silver;\n            BalanceChart.ChartAreas[0].AxisY.LabelStyle.Format = \"N0\";\n            BalanceChart.ChartAreas[0].AxisY.LabelAutoFitMaxFontSize = 8;\n            //BalanceChart.ChartAreas[0].AxisY.Interval = 1;\n\n            // Configure series\n            BalanceChart.Series[0].ChartType = SeriesChartType.Area;\n            BalanceChart.Series[0].XValueType = ChartValueType.DateTime;\n            BalanceChart.Series[0].YValueType = ChartValueType.Auto;\n            BalanceChart.Series[0].Color = Color.LightSkyBlue;\n            BalanceChart.Series[0].BorderColor = Color.Blue;\n            BalanceChart.Series[0].MarkerSize = 3;\n            BalanceChart.Series[0].MarkerColor = Color.Black;\n            BalanceChart.Series[0].MarkerStyle = MarkerStyle.Diamond;\n        }\n\n        /// <summary>\n        /// Initializes the amount chart.\n        /// </summary>\n        private void InitializeAmountChart()\n        {\n            foreach (ChartArea chartArea in AmountChart.ChartAreas)\n            {\n                // Configure the chart area\n                chartArea.BorderColor = Color.Black;\n                chartArea.BorderDashStyle = ChartDashStyle.Solid;\n\n                // Configure X axis\n                chartArea.AxisX.IsMarksNextToAxis = false;\n                chartArea.AxisX.MajorGrid.LineColor = Color.Silver;\n                chartArea.AxisX.LabelAutoFitMaxFontSize = 8;\n                chartArea.AxisX.Interval = 1;\n\n                // Configure Y axis\n                chartArea.AxisY.MajorGrid.LineColor = Color.Silver;\n                chartArea.AxisY.LabelStyle.Format = \"N0\";\n                chartArea.AxisY.LabelAutoFitMaxFontSize = 8;\n                chartArea.AxisY.Crossing = 0D;\n            }\n\n            // Disable the X axis labels and tick marks for the second chart\n            AmountChart.ChartAreas[1].AxisX.MajorGrid.Enabled = false;\n            AmountChart.ChartAreas[1].AxisX.MajorTickMark.Enabled = false;\n            AmountChart.ChartAreas[1].AxisX.LabelStyle.Enabled = false;\n\n            foreach (Series series in AmountChart.Series)\n            {\n                // Configure series\n                series.CustomProperties = \"PixelPointWidth=5\";\n                series.ChartType = SeriesChartType.Column;\n                series.XValueType = ChartValueType.DateTime;\n                series.YValueType = ChartValueType.Auto;\n            }\n        }\n\n        #endregion\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Updates the balance chart.\n        /// </summary>\n        private void UpdateBalanceChart()\n        {\n            BalanceChart.Series[0].Points.Clear();\n\n            // Set the data points\n            foreach (WalletJournal journal in m_ccpCharacter.WalletJournal.OrderByDescending(journal => journal.Date))\n            {\n                using (DataPoint dataPoint = new DataPoint())\n                {\n                    dataPoint.SetValueXY(journal.Date.ToLocalTime(), journal.Balance);\n                    dataPoint.ToolTip = $\"{journal.Date.ToLocalTime():G}{Environment.NewLine}{journal.Balance:N2} ISK\";\n\n                    BalanceChart.Series[0].Points.Add(dataPoint.Clone());\n                }\n            }\n        }\n\n        /// <summary>\n        /// Updates the amount chart.\n        /// </summary>\n        private void UpdateAmountChart()\n        {\n            AmountChart.Series[0].Points.Clear();\n            AmountChart.Series[1].Points.Clear();\n\n            // Set the data points for the first chart\n            foreach (WalletJournal journal in m_ccpCharacter.WalletJournal.OrderByDescending(journal => journal.Date))\n            {\n                using (DataPoint dataPoint = new DataPoint())\n                {\n                    dataPoint.SetValueXY(journal.Date.ToLocalTime(), journal.Amount);\n                    dataPoint.Color = journal.Amount < 0 ? Color.DarkRed : Color.DarkGreen;\n                    dataPoint.ToolTip = $\"{journal.Date.ToLocalTime():G}{Environment.NewLine}{journal.Amount:N2} ISK\";\n\n                    // Add the data point to series\n                    AmountChart.Series[0].Points.Add(dataPoint.Clone());\n                }\n            }\n\n            // Set the data points for the second chart\n            using (DataPoint positiveSumDataPoint = new DataPoint())\n            {\n                decimal positiveSum =\n                    m_ccpCharacter.WalletJournal.Where(journal => journal.Amount > 0).Sum(journal => journal.Amount);\n                positiveSumDataPoint.SetValueXY(0, positiveSum);\n                positiveSumDataPoint.Color = Color.DarkGreen;\n                positiveSumDataPoint.ToolTip = $\"Inflow{Environment.NewLine}{positiveSum:N2} ISK\";\n                // Add the data point to series\n                AmountChart.Series[1].Points.Add(positiveSumDataPoint.Clone());\n            }\n\n            using (DataPoint negativeSumDataPoint = new DataPoint())\n            {\n                decimal negativeSum =\n                    m_ccpCharacter.WalletJournal.Where(journal => journal.Amount < 0).Sum(journal => journal.Amount);\n                negativeSumDataPoint.SetValueXY(0, negativeSum);\n                negativeSumDataPoint.Color = Color.DarkRed;\n                negativeSumDataPoint.ToolTip = $\"Outflow{Environment.NewLine}{negativeSum:N2} ISK\";\n\n                // Add the data point to series\n                AmountChart.Series[1].Points.Add(negativeSumDataPoint.Clone());\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/DetailsWindow/WalletJournalChartWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/EVEMon.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{A2E5EFE0-614A-4567-95E5-92A4D94169AC}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>EVEMon</RootNamespace>\n    <AssemblyName>EVEMon</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup>\n    <Win32Resource>EVEMon.res</Win32Resource>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\n    <DebugType>full</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <DefineConstants>DEBUG</DefineConstants>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>none</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>false</Prefer32Bit>\n    <DefineConstants>\n    </DefineConstants>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <DefineConstants>SNAPSHOT</DefineConstants>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup />\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Windows.Forms.DataVisualization\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\..\\SharedAssemblyInfo.cs\">\n      <Link>Properties\\SharedAssemblyInfo.cs</Link>\n    </Compile>\n    <Compile Include=\"About\\AboutWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"About\\AboutWindow.Designer.cs\">\n      <DependentUpon>AboutWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"ApiCredentialsManagement\\EsiKeyDeletionWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"ApiCredentialsManagement\\EsiKeyDeletionWindow.Designer.cs\">\n      <DependentUpon>EsiKeyDeletionWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"ApiCredentialsManagement\\EsiKeysListBox.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"ApiCredentialsManagement\\EsiKeysManagementWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"ApiCredentialsManagement\\EsiKeysManagementWindow.Designer.cs\">\n      <DependentUpon>EsiKeysManagementWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"ApiCredentialsManagement\\CharacterDeletionWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"ApiCredentialsManagement\\CharacterDeletionWindow.Designer.cs\">\n      <DependentUpon>CharacterDeletionWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"ApiCredentialsManagement\\CharacterImportationWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"ApiCredentialsManagement\\CharacterImportationWindow.Designer.cs\">\n      <DependentUpon>CharacterImportationWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"ApiErrorHandling\\ApiErrorWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"ApiErrorHandling\\ApiErrorWindow.Designer.cs\">\n      <DependentUpon>ApiErrorWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"ApiErrorHandling\\HttpTimeoutTroubleshooter.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"ApiErrorHandling\\HttpTimeoutTroubleshooter.Designer.cs\">\n      <DependentUpon>HttpTimeoutTroubleshooter.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"ApiCredentialsManagement\\EsiKeyUpdateOrAdditionWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"ApiCredentialsManagement\\EsiKeyUpdateOrAdditionWindow.Designer.cs\">\n      <DependentUpon>EsiKeyUpdateOrAdditionWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"BlankCharacter\\BlankCharacterControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"BlankCharacter\\BlankCharacterControl.Designer.cs\">\n      <DependentUpon>BlankCharacterControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"BlankCharacter\\BlankCharacterWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"BlankCharacter\\BlankCharacterWindow.Designer.cs\">\n      <DependentUpon>BlankCharacterWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\AssetsColumnsSelectWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterAssetsList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterAssetsList.Designer.cs\">\n      <DependentUpon>CharacterAssetsList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterContactList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterContactList.Designer.cs\">\n      <DependentUpon>CharacterContactList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterFactionalWarfareStatsList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterFactionalWarfareStatsList.Designer.cs\">\n      <DependentUpon>CharacterFactionalWarfareStatsList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterKillLogList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterKillLogList.Designer.cs\">\n      <DependentUpon>CharacterKillLogList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterLoyaltyList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterLoyaltyList.Designer.cs\">\n      <DependentUpon>CharacterLoyaltyList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterMedalsList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterMedalsList.Designer.cs\">\n      <DependentUpon>CharacterMedalsList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterMonitorBody.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterMonitorBody.Designer.cs\">\n      <DependentUpon>CharacterMonitorBody.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterMonitorFooter.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterMonitorFooter.Designer.cs\">\n      <DependentUpon>CharacterMonitorFooter.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterPlanetaryList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterPlanetaryList.Designer.cs\">\n      <DependentUpon>CharacterPlanetaryList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterWalletJournalList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterWalletJournalList.Designer.cs\">\n      <DependentUpon>CharacterWalletJournalList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterWalletTransactionsList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterWalletTransactionsList.Designer.cs\">\n      <DependentUpon>CharacterWalletTransactionsList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\PlanetaryColumnsSelectWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\PlanetaryColumnsSelectWindow.Designer.cs\">\n      <DependentUpon>PlanetaryColumnsSelectWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"DetailsWindow\\WalletJournalChartWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"DetailsWindow\\WalletJournalChartWindow.Designer.cs\">\n      <DependentUpon>WalletJournalChartWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\WalletJournalColumnsSelectWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\WalletTransactionsColumnsSelectWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"CharactersComparison\\CharactersComparisonWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"CharactersComparison\\CharactersComparisonWindow.Designer.cs\">\n      <DependentUpon>CharactersComparisonWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterContractsList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterContractsList.Designer.cs\">\n      <DependentUpon>CharacterContractsList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterEmploymentHistoryList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterEmploymentHistoryList.Designer.cs\">\n      <DependentUpon>CharacterEmploymentHistoryList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterMonitor.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterMonitor.Designer.cs\">\n      <DependentUpon>CharacterMonitor.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterMonitorHeader.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterMonitorHeader.Designer.cs\">\n      <DependentUpon>CharacterMonitorHeader.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\KillReportAttacker.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\KillReportAttacker.Designer.cs\">\n      <DependentUpon>KillReportAttacker.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\KillReportFittingContent.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\KillReportFittingContent.Designer.cs\">\n      <DependentUpon>KillReportFittingContent.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\KillReportVictim.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\KillReportVictim.Designer.cs\">\n      <DependentUpon>KillReportVictim.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\KillReportInvolvedParties.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\KillReportInvolvedParties.Designer.cs\">\n      <DependentUpon>KillReportInvolvedParties.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"DetailsWindow\\ContractDetailsWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"DetailsWindow\\ContractDetailsWindow.Designer.cs\">\n      <DependentUpon>ContractDetailsWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\ContractsColumnsSelectWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\ContractsWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\ContractsWindow.Designer.cs\">\n      <DependentUpon>ContractsWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\EveMailMessagesColumnsSelectWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"GlobalSuppressions.cs\" />\n    <Compile Include=\"CharacterMonitoring\\CharacterStandingsList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterStandingsList.Designer.cs\">\n      <DependentUpon>CharacterStandingsList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"DetailsWindow\\KillReportWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"DetailsWindow\\KillReportWindow.Designer.cs\">\n      <DependentUpon>KillReportWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\OwnedSkillBooksWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\OwnedSkillBooksWindow.Designer.cs\">\n      <DependentUpon>OwnedSkillBooksWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\PlanetaryPinsWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\PlanetaryPinsWindow.Designer.cs\">\n      <DependentUpon>PlanetaryPinsWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\ReadingPane.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\ReadingPane.Designer.cs\">\n      <DependentUpon>ReadingPane.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"DetailsWindow\\EveMessageWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"DetailsWindow\\EveMessageWindow.Designer.cs\">\n      <DependentUpon>EveMessageWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\EveNotificationsColumnsSelectWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\IndustryJobsColumnsSelectWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\IndustryJobsWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\IndustryJobsWindow.Designer.cs\">\n      <DependentUpon>IndustryJobsWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterEveNotificationsList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterEveNotificationsList.Designer.cs\">\n      <DependentUpon>CharacterEveNotificationsList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterIndustryJobsList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterIndustryJobsList.Designer.cs\">\n      <DependentUpon>CharacterIndustryJobsList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterEveMailMessagesList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterEveMailMessagesList.Designer.cs\">\n      <DependentUpon>CharacterEveMailMessagesList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterResearchPointsList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterResearchPointsList.Designer.cs\">\n      <DependentUpon>CharacterResearchPointsList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\ResearchColumnsSelectWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n      <DependentUpon>Settings.settings</DependentUpon>\n    </Compile>\n    <Compile Include=\"SettingsUI\\CloudStorageServiceControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SettingsUI\\CloudStorageServiceControl.Designer.cs\">\n      <DependentUpon>CloudStorageServiceControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SettingsUI\\EmailNotificationsControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SettingsUI\\EmailNotificationsControl.Designer.cs\">\n      <DependentUpon>EmailNotificationsControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SettingsUI\\ExternalCalendarControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SettingsUI\\ExternalCalendarControl.Designer.cs\">\n      <DependentUpon>ExternalCalendarControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SettingsUI\\PortableEveClientsControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SettingsUI\\PortableEveClientsControl.Designer.cs\">\n      <DependentUpon>PortableEveClientsControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SettingsUI\\SettingsFileStorageControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SettingsUI\\SettingsFileStorageControl.Designer.cs\">\n      <DependentUpon>SettingsFileStorageControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SettingsUI\\TrayBaseWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SettingsUI\\TrayBaseWindow.Designer.cs\">\n      <DependentUpon>TrayBaseWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SettingsUI\\UpdateSettingsControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SettingsUI\\UpdateSettingsControl.Designer.cs\">\n      <DependentUpon>UpdateSettingsControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\SkillCompletionWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\SkillCompletionWindow.Designer.cs\">\n      <DependentUpon>SkillCompletionWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"ImplantControls\\ImplantTooltip.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"ImplantControls\\ImplantTooltip.Designer.cs\">\n      <DependentUpon>ImplantTooltip.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterMarketOrdersList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterMarketOrdersList.Designer.cs\">\n      <DependentUpon>CharacterMarketOrdersList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterSkillsList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterSkillsList.Designer.cs\">\n      <DependentUpon>CharacterSkillsList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\MarketOrdersColumnsSelectWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\MarketOrdersWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\MarketOrdersWindow.Designer.cs\">\n      <DependentUpon>MarketOrdersWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\NotificationList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\NotificationList.Designer.cs\">\n      <DependentUpon>NotificationList.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\Overview.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\Overview.Designer.cs\">\n      <DependentUpon>Overview.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\OverviewItem.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\OverviewItem.Designer.cs\">\n      <DependentUpon>OverviewItem.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\OverviewLabel.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\CertificateBrowserControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\CertificateBrowserControl.Designer.cs\">\n      <DependentUpon>CertificateBrowserControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\CertificateSelectControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\CertificateSelectControl.Designer.cs\">\n      <DependentUpon>CertificateSelectControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\CertificateTreeDisplayControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\CertificateTreeDisplayControl.Designer.cs\">\n      <DependentUpon>CertificateTreeDisplayControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\MasteryTreeDisplayControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\MasteryTreeDisplayControl.Designer.cs\">\n      <DependentUpon>MasteryTreeDisplayControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Updater\\DataUpdateDownloadForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Updater\\DataUpdateDownloadForm.Designer.cs\">\n      <DependentUpon>DataUpdateDownloadForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Updater\\DataUpdateNotifyForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Updater\\DataUpdateNotifyForm.Designer.cs\">\n      <DependentUpon>DataUpdateNotifyForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"ImplantControls\\ImplantSetsWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"ImplantControls\\ImplantSetsWindow.Designer.cs\">\n      <DependentUpon>ImplantSetsWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"MainWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"MainWindow.Designer.cs\">\n      <DependentUpon>MainWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <EmbeddedResource Include=\"ApiCredentialsManagement\\EsiKeyDeletionWindow.resx\">\n      <DependentUpon>EsiKeyDeletionWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"ApiCredentialsManagement\\EsiKeysManagementWindow.resx\">\n      <DependentUpon>EsiKeysManagementWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"ApiCredentialsManagement\\EsiKeyUpdateOrAdditionWindow.resx\">\n      <DependentUpon>EsiKeyUpdateOrAdditionWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"ApiCredentialsManagement\\CharacterDeletionWindow.resx\">\n      <DependentUpon>CharacterDeletionWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"ApiCredentialsManagement\\CharacterImportationWindow.resx\">\n      <DependentUpon>CharacterImportationWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"BlankCharacter\\BlankCharacterControl.resx\">\n      <DependentUpon>BlankCharacterControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"BlankCharacter\\BlankCharacterWindow.resx\">\n      <DependentUpon>BlankCharacterWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterAssetsList.resx\">\n      <DependentUpon>CharacterAssetsList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterContactList.resx\">\n      <DependentUpon>CharacterContactList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterFactionalWarfareStatsList.resx\">\n      <DependentUpon>CharacterFactionalWarfareStatsList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterKillLogList.resx\">\n      <DependentUpon>CharacterKillLogList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterLoyaltyList.resx\">\n      <DependentUpon>CharacterLoyaltyList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterMedalsList.resx\">\n      <DependentUpon>CharacterMedalsList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterMonitorBody.resx\">\n      <DependentUpon>CharacterMonitorBody.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterMonitorFooter.resx\">\n      <DependentUpon>CharacterMonitorFooter.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterPlanetaryList.resx\">\n      <DependentUpon>CharacterPlanetaryList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterWalletJournalList.resx\">\n      <DependentUpon>CharacterWalletJournalList.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterWalletTransactionsList.resx\">\n      <DependentUpon>CharacterWalletTransactionsList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"DetailsWindow\\WalletJournalChartWindow.resx\">\n      <DependentUpon>WalletJournalChartWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharactersComparison\\CharactersComparisonWindow.resx\">\n      <DependentUpon>CharactersComparisonWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterContractsList.resx\">\n      <DependentUpon>CharacterContractsList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterEmploymentHistoryList.resx\">\n      <DependentUpon>CharacterEmploymentHistoryList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterMonitor.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>CharacterMonitor.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\KillReportAttacker.resx\">\n      <DependentUpon>KillReportAttacker.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\KillReportFittingContent.resx\">\n      <DependentUpon>KillReportFittingContent.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\KillReportInvolvedParties.resx\">\n      <DependentUpon>KillReportInvolvedParties.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\KillReportVictim.resx\">\n      <DependentUpon>KillReportVictim.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"DetailsWindow\\ContractDetailsWindow.resx\">\n      <DependentUpon>ContractDetailsWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"NotificationWindow\\ContractsWindow.resx\">\n      <DependentUpon>ContractsWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"DetailsWindow\\KillReportWindow.resx\">\n      <DependentUpon>KillReportWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"NotificationWindow\\OwnedSkillBooksWindow.resx\">\n      <DependentUpon>OwnedSkillBooksWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"NotificationWindow\\PlanetaryPinsWindow.resx\">\n      <DependentUpon>PlanetaryPinsWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterStandingsList.resx\">\n      <DependentUpon>CharacterStandingsList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\ReadingPane.resx\">\n      <DependentUpon>ReadingPane.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"DetailsWindow\\EveMessageWindow.resx\">\n      <DependentUpon>EveMessageWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"MainWindow.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>MainWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterEveMailMessagesList.resx\">\n      <DependentUpon>CharacterEveMailMessagesList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterEveNotificationsList.resx\">\n      <DependentUpon>CharacterEveNotificationsList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterResearchPointsList.resx\">\n      <DependentUpon>CharacterResearchPointsList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SettingsUI\\CloudStorageServiceControl.resx\">\n      <DependentUpon>CloudStorageServiceControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SettingsUI\\EmailNotificationsControl.resx\">\n      <DependentUpon>EmailNotificationsControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SettingsUI\\ExternalCalendarControl.resx\">\n      <DependentUpon>ExternalCalendarControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SettingsUI\\PortableEveClientsControl.resx\">\n      <DependentUpon>PortableEveClientsControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SettingsUI\\SettingsFileStorageControl.resx\">\n      <DependentUpon>SettingsFileStorageControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SettingsUI\\TrayBaseWindow.resx\">\n      <DependentUpon>TrayBaseWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SettingsUI\\UpdateSettingsControl.resx\">\n      <DependentUpon>UpdateSettingsControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\CertificateBrowserControl.resx\">\n      <DependentUpon>CertificateBrowserControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\CertificateSelectControl.resx\">\n      <DependentUpon>CertificateSelectControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\CertificateTreeDisplayControl.resx\">\n      <DependentUpon>CertificateTreeDisplayControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\MasteryTreeDisplayControl.resx\">\n      <DependentUpon>MasteryTreeDisplayControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Updater\\DataUpdateDownloadForm.resx\">\n      <DependentUpon>DataUpdateDownloadForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Updater\\UpdateNotifyForm.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>UpdateNotifyForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <Compile Include=\"SettingsUI\\NotificationsControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SettingsUI\\NotificationsControl.Designer.cs\">\n      <DependentUpon>NotificationsControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SettingsUI\\ProxyAuthenticationWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SettingsUI\\ProxyAuthenticationWindow.Designer.cs\">\n      <DependentUpon>ProxyAuthenticationWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SettingsUI\\SettingsForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SettingsUI\\SettingsForm.Designer.cs\">\n      <DependentUpon>SettingsForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SettingsUI\\TrayPopupConfigForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SettingsUI\\TrayPopupConfigForm.Designer.cs\">\n      <DependentUpon>TrayPopupConfigForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SettingsUI\\TrayTooltipConfigForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SettingsUI\\TrayTooltipConfigForm.Designer.cs\">\n      <DependentUpon>TrayTooltipConfigForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\AttributeButtonControl.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\AttributeBarControl.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\AttributesOptimizerControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\AttributesOptimizerControl.Designer.cs\">\n      <DependentUpon>AttributesOptimizerControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\AttributesOptimizerWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\AttributesOptimizerWindow.Designer.cs\">\n      <DependentUpon>AttributesOptimizerWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\AttributesOptimizerOptionsWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\AttributesOptimizerOptionsWindow.Designer.cs\">\n      <DependentUpon>AttributesOptimizerOptionsWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\BlueprintBrowserControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\BlueprintBrowserControl.Designer.cs\">\n      <DependentUpon>BlueprintBrowserControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\BlueprintSelectControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\BlueprintSelectControl.Designer.cs\">\n      <DependentUpon>BlueprintSelectControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ObsoleteEntriesWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ObsoleteEntriesWindow.Designer.cs\">\n      <DependentUpon>ObsoleteEntriesWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\OverridenTreeView.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanColumnSelectWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanPrioritiesEditorWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanPrioritiesEditorWindow.Designer.cs\">\n      <DependentUpon>PlanPrioritiesEditorWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\LoadoutImportationWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\LoadoutImportationWindow.Designer.cs\">\n      <DependentUpon>LoadoutImportationWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\EveObjectBrowserControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\EveObjectBrowserControl.Designer.cs\">\n      <DependentUpon>EveObjectBrowserControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ItemSelectControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ItemSelectControl.Designer.cs\">\n      <DependentUpon>ItemSelectControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanToOperationWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanToOperationWindow.Designer.cs\">\n      <DependentUpon>PlanToOperationWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ShipLoadoutSelectWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ShipLoadoutSelectWindow.Designer.cs\">\n      <DependentUpon>ShipLoadoutSelectWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\RequiredSkillsControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\RequiredSkillsControl.Designer.cs\">\n      <DependentUpon>RequiredSkillsControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanImportationFromCharacterWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanImportationFromCharacterWindow.Designer.cs\">\n      <DependentUpon>PlanImportationFromCharacterWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\EveObjectSelectControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\EveObjectSelectControl.Designer.cs\">\n      <DependentUpon>EveObjectSelectControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ShipSelectControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ShipSelectControl.Designer.cs\">\n      <DependentUpon>ShipSelectControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\SkillBrowserControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\SkillBrowserControl.Designer.cs\">\n      <DependentUpon>SkillBrowserControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanNotesEditorWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanNotesEditorWindow.Designer.cs\">\n      <DependentUpon>PlanNotesEditorWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ImplantCalculatorWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ImplantCalculatorWindow.Designer.cs\">\n      <DependentUpon>ImplantCalculatorWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ItemBrowserControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ItemBrowserControl.Designer.cs\">\n      <DependentUpon>ItemBrowserControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanWindow.Designer.cs\">\n      <DependentUpon>PlanWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\NewPlanWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\NewPlanWindow.Designer.cs\">\n      <DependentUpon>NewPlanWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanEditorControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanEditorControl.Designer.cs\">\n      <DependentUpon>PlanEditorControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanManagementWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\PlanManagementWindow.Designer.cs\">\n      <DependentUpon>PlanManagementWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ShipBrowserControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\ShipBrowserControl.Designer.cs\">\n      <DependentUpon>ShipBrowserControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\SkillExplorerWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\SkillExplorerWindow.Designer.cs\">\n      <DependentUpon>SkillExplorerWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\SkillSelectControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\SkillSelectControl.Designer.cs\">\n      <DependentUpon>SkillSelectControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\SkillTreeDisplayControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"SkillPlanner\\SkillTreeDisplayControl.Designer.cs\">\n      <DependentUpon>SkillTreeDisplayControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\TimeCheckNotification.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"NotificationWindow\\TimeCheckNotification.Designer.cs\">\n      <DependentUpon>TimeCheckNotification.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"SettingsUI\\TrayPopupWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SettingsUI\\TrayTooltipWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"ExceptionHandling\\UnhandledExceptionWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"ExceptionHandling\\UnhandledExceptionWindow.Designer.cs\">\n      <DependentUpon>UnhandledExceptionWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Updater\\UpdateDownloadForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Updater\\UpdateDownloadForm.Designer.cs\">\n      <DependentUpon>UpdateDownloadForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Updater\\UpdateNotifyForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Updater\\UpdateNotifyForm.Designer.cs\">\n      <DependentUpon>UpdateNotifyForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterSkillsQueueList.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"CharacterMonitoring\\CharacterSkillsQueueList.Designer.cs\">\n      <DependentUpon>CharacterSkillsQueueList.cs</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"About\\AboutWindow.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>AboutWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterSkillsList.resx\">\n      <DependentUpon>CharacterSkillsList.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\Overview.resx\">\n      <DependentUpon>Overview.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\OverviewItem.resx\">\n      <DependentUpon>OverviewItem.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Updater\\DataUpdateNotifyForm.resx\">\n      <DependentUpon>DataUpdateNotifyForm.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"ImplantControls\\ImplantSetsWindow.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>ImplantSetsWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\AttributesOptimizerControl.resx\">\n      <DependentUpon>AttributesOptimizerControl.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\AttributesOptimizerWindow.resx\">\n      <DependentUpon>AttributesOptimizerWindow.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\AttributesOptimizerOptionsWindow.resx\">\n      <DependentUpon>AttributesOptimizerOptionsWindow.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\PlanPrioritiesEditorWindow.resx\">\n      <DependentUpon>PlanPrioritiesEditorWindow.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\PlanImportationFromCharacterWindow.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>PlanImportationFromCharacterWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\LoadoutImportationWindow.resx\">\n      <DependentUpon>LoadoutImportationWindow.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\EveObjectBrowserControl.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>EveObjectBrowserControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\EveObjectSelectControl.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>EveObjectSelectControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\ItemSelectControl.resx\">\n      <DependentUpon>ItemSelectControl.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\ShipLoadoutSelectWindow.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>ShipLoadoutSelectWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\RequiredSkillsControl.resx\">\n      <DependentUpon>RequiredSkillsControl.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\SkillBrowserControl.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>SkillBrowserControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\PlanNotesEditorWindow.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>PlanNotesEditorWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\ImplantCalculatorWindow.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>ImplantCalculatorWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\ItemBrowserControl.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>ItemBrowserControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\PlanWindow.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>PlanWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\NewPlanWindow.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>NewPlanWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\PlanEditorControl.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>PlanEditorControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\PlanManagementWindow.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>PlanManagementWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\ShipBrowserControl.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>ShipBrowserControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\SkillExplorerWindow.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>SkillExplorerWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\SkillSelectControl.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>SkillSelectControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\SkillTreeDisplayControl.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>SkillTreeDisplayControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"NotificationWindow\\TimeCheckNotification.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>TimeCheckNotification.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"ExceptionHandling\\UnhandledExceptionWindow.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>UnhandledExceptionWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Updater\\UpdateDownloadForm.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>UpdateDownloadForm.cs</DependentUpon>\n    </EmbeddedResource>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\">\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"app.manifest\" />\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <None Include=\"SkillPlanner\\BrowserClasses.cd\" />\n    <EmbeddedResource Include=\"ApiErrorHandling\\ApiErrorWindow.resx\">\n      <DependentUpon>ApiErrorWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"ApiErrorHandling\\HttpTimeoutTroubleshooter.resx\">\n      <DependentUpon>HttpTimeoutTroubleshooter.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterMonitorHeader.resx\">\n      <DependentUpon>CharacterMonitorHeader.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"NotificationWindow\\IndustryJobsWindow.resx\">\n      <DependentUpon>IndustryJobsWindow.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterIndustryJobsList.resx\">\n      <DependentUpon>CharacterIndustryJobsList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"NotificationWindow\\SkillCompletionWindow.resx\">\n      <DependentUpon>SkillCompletionWindow.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"ImplantControls\\ImplantTooltip.resx\">\n      <DependentUpon>ImplantTooltip.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterMarketOrdersList.resx\">\n      <DependentUpon>CharacterMarketOrdersList.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"CharacterMonitoring\\CharacterSkillsQueueList.resx\">\n      <DependentUpon>CharacterSkillsQueueList.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"NotificationWindow\\MarketOrdersWindow.resx\">\n      <DependentUpon>MarketOrdersWindow.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\NotificationList.resx\">\n      <DependentUpon>NotificationList.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SettingsUI\\NotificationsControl.resx\">\n      <DependentUpon>NotificationsControl.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SettingsUI\\ProxyAuthenticationWindow.resx\">\n      <DependentUpon>ProxyAuthenticationWindow.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SettingsUI\\SettingsForm.resx\">\n      <DependentUpon>SettingsForm.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SettingsUI\\TrayPopupConfigForm.resx\">\n      <DependentUpon>TrayPopupConfigForm.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SettingsUI\\TrayTooltipConfigForm.resx\">\n      <DependentUpon>TrayTooltipConfigForm.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\BlueprintBrowserControl.resx\">\n      <DependentUpon>BlueprintBrowserControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\BlueprintSelectControl.resx\">\n      <DependentUpon>BlueprintSelectControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\ObsoleteEntriesWindow.resx\">\n      <DependentUpon>ObsoleteEntriesWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\PlanToOperationWindow.resx\">\n      <DependentUpon>PlanToOperationWindow.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"SkillPlanner\\ShipSelectControl.resx\">\n      <DependentUpon>ShipSelectControl.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\EVEMon.Common\\EVEMon.Common.csproj\">\n      <Project>{C0665275-3E0B-4117-81B0-751206ED03CD}</Project>\n      <Name>EVEMon.Common</Name>\n      <Private>True</Private>\n      <Properties>SkipValidatePackageReferences=true</Properties>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\EVEMon.LogitechG15\\EVEMon.LogitechG15.csproj\">\n      <Project>{3067bdfb-c02d-4caf-96aa-4d8f9f986180}</Project>\n      <Name>EVEMon.LogitechG15</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\EVEMon.Watchdog\\EVEMon.Watchdog.csproj\">\n      <Project>{8C4A87A0-780E-4765-ADD0-146091FE26F4}</Project>\n      <Name>EVEMon.Watchdog</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\EVEMon.WindowsApi\\EVEMon.WindowsApi.csproj\">\n      <Project>{D942D976-6185-4ECD-A83B-60260100D12E}</Project>\n      <Name>EVEMon.WindowsApi</Name>\n      <Private>True</Private>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\EVEMon.PieChart\\EVEMon.PieChart.csproj\">\n      <Project>{696E929A-6A4A-4C6D-A8B2-C4F25F781940}</Project>\n      <Name>EVEMon.PieChart</Name>\n      <Private>True</Private>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n  <PropertyGroup>\n    <PreBuildEvent>cd $(SolutionDir)tools\\ResFileCreator\\$(OutDir)\nEVEMonResFileCreator.exe</PreBuildEvent>\n  </PropertyGroup>\n  <PropertyGroup>\n    <PostBuildEvent>del \"$(ProjectDir)\"EVEMon.res\nif exist \"$(TargetDir)\"EVEMon.exe.config del \"$(TargetDir)\"EVEMon.exe.config\nif exist \"$(TargetDir)\"stdole.dll del \"$(TargetDir)\"stdole.dll</PostBuildEvent>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "src/EVEMon/ExceptionHandling/UnhandledExceptionWindow.Designer.cs",
    "content": "namespace EVEMon.ExceptionHandling\n{\n    partial class UnhandledExceptionWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UnhandledExceptionWindow));\n            this.MainPanel = new System.Windows.Forms.Panel();\n            this.TechnicalDetailsPanel = new System.Windows.Forms.Panel();\n            this.TechnicalDetailsTextBox = new System.Windows.Forms.TextBox();\n            this.BugPictureBox = new System.Windows.Forms.PictureBox();\n            this.DescriptionLabel = new System.Windows.Forms.Label();\n            this.WhatCanYouDoTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.ReportLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.LatestBinariesLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.LatestBinariesPictureBox = new System.Windows.Forms.PictureBox();\n            this.ReportPictureBox = new System.Windows.Forms.PictureBox();\n            this.WhatCanYouDoLabel = new System.Windows.Forms.Label();\n            this.CopyDetailsLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.TitleLabel = new System.Windows.Forms.Label();\n            this.TechnicalDetailsLabel = new System.Windows.Forms.Label();\n            this.DataDirectoryButton = new System.Windows.Forms.Button();\n            this.CloseButton = new System.Windows.Forms.Button();\n            this.MainPanel.SuspendLayout();\n            this.TechnicalDetailsPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.BugPictureBox)).BeginInit();\n            this.WhatCanYouDoTableLayoutPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.LatestBinariesPictureBox)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.ReportPictureBox)).BeginInit();\n            this.SuspendLayout();\n            // \n            // MainPanel\n            // \n            this.MainPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.MainPanel.BackColor = System.Drawing.Color.White;\n            this.MainPanel.Controls.Add(this.TechnicalDetailsPanel);\n            this.MainPanel.Controls.Add(this.BugPictureBox);\n            this.MainPanel.Controls.Add(this.DescriptionLabel);\n            this.MainPanel.Controls.Add(this.WhatCanYouDoTableLayoutPanel);\n            this.MainPanel.Controls.Add(this.WhatCanYouDoLabel);\n            this.MainPanel.Controls.Add(this.CopyDetailsLinkLabel);\n            this.MainPanel.Controls.Add(this.TitleLabel);\n            this.MainPanel.Controls.Add(this.TechnicalDetailsLabel);\n            this.MainPanel.ForeColor = System.Drawing.Color.Black;\n            this.MainPanel.Location = new System.Drawing.Point(0, 0);\n            this.MainPanel.Name = \"MainPanel\";\n            this.MainPanel.Size = new System.Drawing.Size(583, 465);\n            this.MainPanel.TabIndex = 0;\n            // \n            // TechnicalDetailsPanel\n            // \n            this.TechnicalDetailsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.TechnicalDetailsPanel.AutoSize = true;\n            this.TechnicalDetailsPanel.Controls.Add(this.TechnicalDetailsTextBox);\n            this.TechnicalDetailsPanel.Location = new System.Drawing.Point(12, 104);\n            this.TechnicalDetailsPanel.Name = \"TechnicalDetailsPanel\";\n            this.TechnicalDetailsPanel.Size = new System.Drawing.Size(559, 238);\n            this.TechnicalDetailsPanel.TabIndex = 13;\n            // \n            // TechnicalDetailsTextBox\n            // \n            this.TechnicalDetailsTextBox.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.TechnicalDetailsTextBox.Location = new System.Drawing.Point(0, 0);\n            this.TechnicalDetailsTextBox.Multiline = true;\n            this.TechnicalDetailsTextBox.Name = \"TechnicalDetailsTextBox\";\n            this.TechnicalDetailsTextBox.ReadOnly = true;\n            this.TechnicalDetailsTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n            this.TechnicalDetailsTextBox.Size = new System.Drawing.Size(559, 238);\n            this.TechnicalDetailsTextBox.TabIndex = 1;\n            // \n            // BugPictureBox\n            // \n            this.BugPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.BugPictureBox.Location = new System.Drawing.Point(487, 13);\n            this.BugPictureBox.Name = \"BugPictureBox\";\n            this.BugPictureBox.Size = new System.Drawing.Size(81, 65);\n            this.BugPictureBox.TabIndex = 2;\n            this.BugPictureBox.TabStop = false;\n            // \n            // DescriptionLabel\n            // \n            this.DescriptionLabel.AutoSize = true;\n            this.DescriptionLabel.Location = new System.Drawing.Point(13, 35);\n            this.DescriptionLabel.Name = \"DescriptionLabel\";\n            this.DescriptionLabel.Size = new System.Drawing.Size(409, 26);\n            this.DescriptionLabel.TabIndex = 12;\n            this.DescriptionLabel.Text = \"I think Little Fluffy is dead, Jimmy. \\r\\nEVEMon will be shut down. Restart and try\" +\n    \" again to test whether the problem repeats.\";\n            // \n            // WhatCanYouDoTableLayoutPanel\n            // \n            this.WhatCanYouDoTableLayoutPanel.AutoSize = true;\n            this.WhatCanYouDoTableLayoutPanel.ColumnCount = 2;\n            this.WhatCanYouDoTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 30F));\n            this.WhatCanYouDoTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.WhatCanYouDoTableLayoutPanel.Controls.Add(this.ReportLinkLabel, 1, 2);\n            this.WhatCanYouDoTableLayoutPanel.Controls.Add(this.LatestBinariesLinkLabel, 1, 1);\n            this.WhatCanYouDoTableLayoutPanel.Controls.Add(this.LatestBinariesPictureBox, 0, 1);\n            this.WhatCanYouDoTableLayoutPanel.Controls.Add(this.ReportPictureBox, 0, 2);\n            this.WhatCanYouDoTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.WhatCanYouDoTableLayoutPanel.Location = new System.Drawing.Point(0, 377);\n            this.WhatCanYouDoTableLayoutPanel.Name = \"WhatCanYouDoTableLayoutPanel\";\n            this.WhatCanYouDoTableLayoutPanel.Padding = new System.Windows.Forms.Padding(16, 0, 16, 16);\n            this.WhatCanYouDoTableLayoutPanel.RowCount = 3;\n            this.WhatCanYouDoTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.WhatCanYouDoTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.WhatCanYouDoTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.WhatCanYouDoTableLayoutPanel.Size = new System.Drawing.Size(583, 88);\n            this.WhatCanYouDoTableLayoutPanel.TabIndex = 11;\n            // \n            // ReportLinkLabel\n            // \n            this.ReportLinkLabel.AutoSize = true;\n            this.ReportLinkLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ReportLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(31, 6);\n            this.ReportLinkLabel.Location = new System.Drawing.Point(49, 42);\n            this.ReportLinkLabel.Name = \"ReportLinkLabel\";\n            this.ReportLinkLabel.Size = new System.Drawing.Size(515, 30);\n            this.ReportLinkLabel.TabIndex = 8;\n            this.ReportLinkLabel.TabStop = true;\n            this.ReportLinkLabel.Text = \"If none of that worked, please report the problem\\r\\n\";\n            this.ReportLinkLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            this.ReportLinkLabel.UseCompatibleTextRendering = true;\n            this.ReportLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llblReport_LinkClicked);\n            // \n            // LatestBinariesLinkLabel\n            // \n            this.LatestBinariesLinkLabel.AutoSize = true;\n            this.LatestBinariesLinkLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.LatestBinariesLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(8, 24);\n            this.LatestBinariesLinkLabel.Location = new System.Drawing.Point(49, 0);\n            this.LatestBinariesLinkLabel.Name = \"LatestBinariesLinkLabel\";\n            this.LatestBinariesLinkLabel.Size = new System.Drawing.Size(515, 42);\n            this.LatestBinariesLinkLabel.TabIndex = 11;\n            this.LatestBinariesLinkLabel.TabStop = true;\n            this.LatestBinariesLinkLabel.Text = resources.GetString(\"LatestBinariesLinkLabel.Text\");\n            this.LatestBinariesLinkLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            this.LatestBinariesLinkLabel.UseCompatibleTextRendering = true;\n            this.LatestBinariesLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llblLatestBinaries_LinkClicked);\n            // \n            // LatestBinariesPictureBox\n            // \n            this.LatestBinariesPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.LatestBinariesPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"LatestBinariesPictureBox.Image\")));\n            this.LatestBinariesPictureBox.Location = new System.Drawing.Point(16, 0);\n            this.LatestBinariesPictureBox.Margin = new System.Windows.Forms.Padding(0);\n            this.LatestBinariesPictureBox.Name = \"LatestBinariesPictureBox\";\n            this.LatestBinariesPictureBox.Size = new System.Drawing.Size(30, 42);\n            this.LatestBinariesPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.LatestBinariesPictureBox.TabIndex = 13;\n            this.LatestBinariesPictureBox.TabStop = false;\n            // \n            // ReportPictureBox\n            // \n            this.ReportPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ReportPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"ReportPictureBox.Image\")));\n            this.ReportPictureBox.Location = new System.Drawing.Point(16, 42);\n            this.ReportPictureBox.Margin = new System.Windows.Forms.Padding(0);\n            this.ReportPictureBox.Name = \"ReportPictureBox\";\n            this.ReportPictureBox.Size = new System.Drawing.Size(30, 30);\n            this.ReportPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.ReportPictureBox.TabIndex = 14;\n            this.ReportPictureBox.TabStop = false;\n            // \n            // WhatCanYouDoLabel\n            // \n            this.WhatCanYouDoLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.WhatCanYouDoLabel.AutoSize = true;\n            this.WhatCanYouDoLabel.Location = new System.Drawing.Point(16, 356);\n            this.WhatCanYouDoLabel.Name = \"WhatCanYouDoLabel\";\n            this.WhatCanYouDoLabel.Size = new System.Drawing.Size(98, 13);\n            this.WhatCanYouDoLabel.TabIndex = 9;\n            this.WhatCanYouDoLabel.Text = \"What can you do ?\";\n            // \n            // CopyDetailsLinkLabel\n            // \n            this.CopyDetailsLinkLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.CopyDetailsLinkLabel.AutoSize = true;\n            this.CopyDetailsLinkLabel.Location = new System.Drawing.Point(505, 88);\n            this.CopyDetailsLinkLabel.Name = \"CopyDetailsLinkLabel\";\n            this.CopyDetailsLinkLabel.Size = new System.Drawing.Size(64, 13);\n            this.CopyDetailsLinkLabel.TabIndex = 6;\n            this.CopyDetailsLinkLabel.TabStop = true;\n            this.CopyDetailsLinkLabel.Text = \"Copy details\";\n            this.CopyDetailsLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.CopyDetailsLinkLabel_LinkClicked);\n            // \n            // TitleLabel\n            // \n            this.TitleLabel.AutoSize = true;\n            this.TitleLabel.Location = new System.Drawing.Point(13, 13);\n            this.TitleLabel.Name = \"TitleLabel\";\n            this.TitleLabel.Size = new System.Drawing.Size(233, 13);\n            this.TitleLabel.TabIndex = 0;\n            this.TitleLabel.Text = \"EVEMon has encountered an unexpected error.\";\n            // \n            // TechnicalDetailsLabel\n            // \n            this.TechnicalDetailsLabel.AutoSize = true;\n            this.TechnicalDetailsLabel.Location = new System.Drawing.Point(12, 88);\n            this.TechnicalDetailsLabel.Name = \"TechnicalDetailsLabel\";\n            this.TechnicalDetailsLabel.Size = new System.Drawing.Size(145, 13);\n            this.TechnicalDetailsLabel.TabIndex = 2;\n            this.TechnicalDetailsLabel.Text = \"Technical details of this error:\";\n            // \n            // DataDirectoryButton\n            // \n            this.DataDirectoryButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.DataDirectoryButton.AutoSize = true;\n            this.DataDirectoryButton.Location = new System.Drawing.Point(16, 471);\n            this.DataDirectoryButton.Name = \"DataDirectoryButton\";\n            this.DataDirectoryButton.Size = new System.Drawing.Size(106, 23);\n            this.DataDirectoryButton.TabIndex = 4;\n            this.DataDirectoryButton.Text = \"Data Directory\";\n            this.DataDirectoryButton.UseVisualStyleBackColor = true;\n            this.DataDirectoryButton.Click += new System.EventHandler(this.DataDirectoryButton_Click);\n            // \n            // CloseButton\n            // \n            this.CloseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.CloseButton.AutoSize = true;\n            this.CloseButton.Location = new System.Drawing.Point(465, 471);\n            this.CloseButton.Name = \"CloseButton\";\n            this.CloseButton.Size = new System.Drawing.Size(106, 23);\n            this.CloseButton.TabIndex = 5;\n            this.CloseButton.Text = \"Close EVEMon\";\n            this.CloseButton.UseVisualStyleBackColor = true;\n            this.CloseButton.Click += new System.EventHandler(this.CloseButton_Click);\n            // \n            // UnhandledExceptionWindow\n            // \n            this.AcceptButton = this.CloseButton;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(583, 506);\n            this.ControlBox = false;\n            this.Controls.Add(this.CloseButton);\n            this.Controls.Add(this.DataDirectoryButton);\n            this.Controls.Add(this.MainPanel);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"UnhandledExceptionWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"EVEMon Error\";\n            this.Load += new System.EventHandler(this.UnhandledExceptionWindow_Load);\n            this.MainPanel.ResumeLayout(false);\n            this.MainPanel.PerformLayout();\n            this.TechnicalDetailsPanel.ResumeLayout(false);\n            this.TechnicalDetailsPanel.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.BugPictureBox)).EndInit();\n            this.WhatCanYouDoTableLayoutPanel.ResumeLayout(false);\n            this.WhatCanYouDoTableLayoutPanel.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.LatestBinariesPictureBox)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.ReportPictureBox)).EndInit();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Panel MainPanel;\n        private System.Windows.Forms.Label TitleLabel;\n        private System.Windows.Forms.TextBox TechnicalDetailsTextBox;\n        private System.Windows.Forms.Label TechnicalDetailsLabel;\n        private System.Windows.Forms.Button DataDirectoryButton;\n        private System.Windows.Forms.Button CloseButton;\n        private System.Windows.Forms.PictureBox BugPictureBox;\n        private System.Windows.Forms.LinkLabel CopyDetailsLinkLabel;\n        private System.Windows.Forms.Label WhatCanYouDoLabel;\n        private System.Windows.Forms.TableLayoutPanel WhatCanYouDoTableLayoutPanel;\n        private System.Windows.Forms.Label DescriptionLabel;\n        private System.Windows.Forms.LinkLabel ReportLinkLabel;\n        private System.Windows.Forms.LinkLabel LatestBinariesLinkLabel;\n        private System.Windows.Forms.PictureBox LatestBinariesPictureBox;\n        private System.Windows.Forms.PictureBox ReportPictureBox;\n        private System.Windows.Forms.Panel TechnicalDetailsPanel;\n    }\n}"
  },
  {
    "path": "src/EVEMon/ExceptionHandling/UnhandledExceptionWindow.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Properties;\n\nnamespace EVEMon.ExceptionHandling\n{\n    /// <summary>\n    /// Form to handle the display of the error report for easy bug reporting.\n    /// </summary>\n    public partial class UnhandledExceptionWindow : EVEMonForm\n    {\n        private readonly Exception m_exception;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"UnhandledExceptionWindow\"/> class.\n        /// </summary>\n        private UnhandledExceptionWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"UnhandledExceptionWindow\"/> class.\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        public UnhandledExceptionWindow(Exception exception)\n            : this()\n        {\n            m_exception = exception;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Loads resources, generates the report\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void UnhandledExceptionWindow_Load(object sender, EventArgs e)\n        {\n            WhatCanYouDoLabel.Font = FontFactory.GetFont(\"Tahoma\", 10F);\n\n            SetBugImage();\n\n            BuildExceptionMessage();\n        }\n\n        #endregion\n\n\n        #region Content Management\n\n        /// <summary>\n        /// Builds the exception message.\n        /// </summary>\n        private void BuildExceptionMessage()\n        {\n            EveMonClient.StopTraceLogging();\n            try\n            {\n                StringBuilder exceptionReport = new StringBuilder();\n                exceptionReport.Append(\"EVEMon Version: \").AppendLine(EveMonClient.\n                    FileVersionInfo.FileVersion);\n                exceptionReport.Append(\".NET Runtime Version: \").AppendLine(Environment.\n                    Version.ToString());\n                exceptionReport.Append(\"Operating System: \").AppendLine(Environment.OSVersion.\n                    VersionString.ToString());\n                exceptionReport.Append(\"Executable Path: \").AppendLine(Environment.CommandLine);\n                exceptionReport.AppendLine(GetRecursiveStackTrace(m_exception)).AppendLine();\n                exceptionReport.AppendLine(GetDatafileReport()).AppendLine();\n                exceptionReport.AppendLine(\"Diagnostic Log:\").AppendLine(GetTraceLog().Trim());\n                TechnicalDetailsTextBox.Text = exceptionReport.ToString();\n            }\n            catch (InvalidOperationException ex)\n            {\n                ExceptionHandler.LogException(ex, true);\n                TechnicalDetailsTextBox.Text = Properties.Resources.ErrorBuildingError;\n            }\n        }\n\n        /// <summary>\n        /// Gets the trace log.\n        /// </summary>\n        /// <returns></returns>\n        private static string GetTraceLog()\n        {\n            string trace;\n            FileStream traceStream = null;\n            try\n            {\n                traceStream = Util.GetFileStream(EveMonClient.TraceFileNameFullPath,\n                    FileMode.Open, FileAccess.Read);\n                using (StreamReader traceReader = new StreamReader(traceStream))\n                {\n                    traceStream = null;\n                    trace = traceReader.ReadToEnd();\n                }\n            }\n            catch (IOException ex)\n            {\n                ExceptionHandler.LogException(ex, true);\n                trace = Properties.Resources.ErrorNoTraceFile;\n            }\n            catch (UnauthorizedAccessException ex)\n            {\n                ExceptionHandler.LogException(ex, true);\n                trace = Properties.Resources.ErrorNoTraceFile;\n            }\n            finally\n            {\n                traceStream?.Dispose();\n            }\n            return trace;\n        }\n\n        /// <summary>\n        /// Sets the bug image.\n        /// </summary>\n        private void SetBugImage()\n        {\n            try\n            {\n                Bitmap bug = Resources.Bug;\n\n                int oHeight = bug.Height;\n                int oWidth = bug.Width;\n                if (bug.Height <= BugPictureBox.ClientSize.Height)\n                    return;\n\n                double scale = (double)BugPictureBox.ClientSize.Height / bug.Height;\n                oHeight = (int)(oHeight * scale);\n                oWidth = (int)(oWidth * scale);\n                BugPictureBox.Image = new Bitmap(bug, new Size(oWidth, oHeight));\n                BugPictureBox.ClientSize = new Size(oWidth, oHeight);\n            }\n            catch (Exception ex)\n            {\n                ExceptionHandler.LogRethrowException(ex);\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Gets the datafile report.\n        /// </summary>\n        /// <value>The datafile report.</value>\n        private static string GetDatafileReport()\n        {\n            StringBuilder datafileReport = new StringBuilder();\n\n            try\n            {\n                datafileReport.AppendLine(\"Datafile report:\");\n\n                foreach (string datafile in Datafile.GetFilesFrom(EveMonClient.EVEMonDataDir,\n                    Datafile.DatafilesExtension))\n                {\n                    FileInfo info = new FileInfo(datafile);\n                    Datafile file = new Datafile(Path.GetFileName(datafile));\n\n                    datafileReport.AppendLine($\"  {info.Name} ({info.Length / 1024}KiB - {file.MD5Sum})\");\n                }\n            }\n            catch (UnauthorizedAccessException ex)\n            {\n                ExceptionHandler.LogException(ex, true);\n                datafileReport.AppendLine(Properties.Resources.ErrorNoDataFile);\n            }\n\n            return datafileReport.ToString();\n        }\n\n        /// <summary>\n        /// Gets the recursive stack trace.\n        /// </summary>\n        /// <value>The recursive stack trace.</value>\n        internal static string GetRecursiveStackTrace(Exception exception)\n        {\n            StringBuilder stackTraceBuilder = new StringBuilder();\n            Exception ex = exception;\n\n            stackTraceBuilder.Append(ex).AppendLine();\n\n            while (ex.InnerException != null)\n            {\n                ex = ex.InnerException;\n\n                stackTraceBuilder.AppendLine().Append(ex).AppendLine();\n            }\n\n            // Remove project local path from message\n            return stackTraceBuilder.ToString().RemoveProjectLocalPath();\n        }\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// Handles the Click event of the CloseButton control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void CloseButton_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the LinkClicked event of the CopyDetailsLinkLabel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"LinkLabelLinkClickedEventArgs\"/> instance containing the event data.</param>\n        private void CopyDetailsLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            try\n            {\n                Clipboard.SetText(TechnicalDetailsTextBox.Text, TextDataFormat.Text);\n                MessageBox.Show(Properties.Resources.MessageCopiedDetails, \"Copy\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Information);\n            }\n            catch (ExternalException ex)\n            {\n                // Occurs when another process is using the clipboard\n                ExceptionHandler.LogException(ex, true);\n                MessageBox.Show(Properties.Resources.ErrorClipboardFailure, \"Error copying\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the DataDirectoryButton control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void DataDirectoryButton_Click(object sender, EventArgs e)\n        {\n            Util.OpenURL(new Uri(EveMonClient.EVEMonDataDir));\n        }\n\n        /// <summary>\n        /// Handles the LinkClicked event of the llblReport control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"LinkLabelLinkClickedEventArgs\"/> instance containing the event data.</param>\n        private void llblReport_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            Util.OpenURL(new Uri(NetworkConstants.BitBucketIssuesBase));\n        }\n\n        /// <summary>\n        /// Handles the LinkClicked event of the llblLatestBinaries control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"LinkLabelLinkClickedEventArgs\"/> instance containing the event data.</param>\n        private void llblLatestBinaries_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            Util.OpenURL(new Uri(NetworkConstants.GitHubDownloadsBase));\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/ExceptionHandling/UnhandledExceptionWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"LatestBinariesLinkLabel.Text\" xml:space=\"preserve\">\n    <value>Use the latest snapshot binaries (beta) as the problem may have been already solved or \ngo to EVEMon's data directory (by clicking on the related button below) and delete, your settings file \n(after you have made a backup), cache folder and data files (*.gzip),  to see if the problem persists.</value>\n  </data>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"LatestBinariesPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL\n        DwAACw8BkvkDpQAAAAd0SU1FB9kMERAMI8ZEp7IAAAMVSURBVDhPjZMJSJRBGIZndU1dtzwqpSgoPEpT\n        1tV1vXXXvNJ0U0szRSwrtV3XsPCgwuzQpCK6wLKDgsioMFnJTok2jVQqNStJrNAuTDcLUqz+t++3LSEM\n        euH5v2G+eWe+mX+G/S0TExNjiwl4TEkU/3T+r3izWaFWHUvR2tXZcS4TCETm5uZTaIHJJ3Own2lssSll\n        RZtLrl6sed/RrEfTncZXT1paPocqFE4atdpNLBZbUVGTT7I2I936rq52rKejHfr6Oq6/5xnX0/kIo8ND\n        6G5vw5veFwOeEslcGxsbkYBktDGWnr6KeclkwlOHDgw/b2vFsb2VePm0C/qrOgz09cEwOIiRLwaOG/vB\n        NZw/8720pHC2UCjkz2ZCh8vLbq9OXob8zDQuJzUZOzZpcbRiN0Y/GdD96D4+D33EYH8fmm/UITV1pWSq\n        WPxrG2Ir0XhMiFQgTRWL5dERCJJ6PlYtVu6j9vtidS5KtRqqYBhXTldxA2/foeZkdf+46bekLs57kyLD\n        oAoLhULmiYM7t7UYUyxA4qFJU8WjICsDRbnrUFNdBX1DvaFIm2c7PmCFn5wFe3s5qpQhSIpYjACJO5oa\n        rqC1WX+E0nx5Yj+pZEtsSAA6H9xDiWYDdOfPgvrtCHOCMZ9FC8tjgvxpdS/cunQBXz8NAd++4qautksV\n        EZbv4eK0PdzfG16ujritq0P9hXMfyOZNzGN2NtYsKyfXMkIuhctse673aQeZR/Gh/zVOVFZwK6OjEO7n\n        i3hlMOc+fz4XpwjGwgXOFWROIYIIxpaGK4NjQgMak2Ki0Puimxt814frVOaujWos8ZejeP0aKOUy+Lg5\n        oViTayDLcUJLRPN+XoKUuPgZkbSNrOQErE6M4w6VlaCysADXai9hD0WqADGBcghNTRtp/H4igXAYN/Mf\n        kaWFmZlQ6BPmJ7+4PiUROwvyUL4pH0XZmViXuBT206xHKH+Zhm4lfAlLYuI2Gl+dyEpkIaWYHRXo/3CO\n        /fTGULmsy8HWdhfdl3zqDyT4R/PPN8WLz1gQ/G+aQ8wi+FKtiL9cjP0E5b9G/dnJ/fYAAAAASUVORK5C\n        YII=\n</value>\n  </data>\n  <data name=\"ReportPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFISURBVDhPpZG9SgNBFIVTCYKVD2AhPoPgM/gCPoCl\n        jbWkFgtLCwtBBAvtBJFgpZVaCAlJFJM1UbNu/jSJ/4o7czx31iwbMxEXL3ww98w9Z2ZnEwD+hVWMQ7iY\n        WUyNkk3yQfAL+2TCFrCzdVjAp6/YDq7dk7KEFMkQ2yCAzQjxldbovGrUHzW8Bw23rXHd0ijdaRQbCg6R\n        Wlg/kpDJaMDY3MqB2azR6HU0KjRf3WtcfpvPawp5LwhY2j6VgGku+wNuab7hqcbc1CjUA3OO5ow7OCD8\n        BLl+mac6TYULms+qClma0zRnXN8EJDeOJWAqDBAomEeUkGjJbdIVZYKlIo84zLYnoPsbfSJDWEvlxWOq\n        /fRueupZ0v8bbXDQqbZeusY3kvw509NE4fDy6l5OjM9k3jYjWEUaxkmJzNr2o1jFOFjFOFjFv4PEF/eL\n        DyJn8xIVAAAAAElFTkSuQmCC\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage \n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given \n// a specific target and scoped to a namespace, type, member, etc.\n//\n// To add a suppression to this file, right-click the message in the \n// Error List, point to \"Suppress Message(s)\", and click \n// \"In Project Suppression File\".\n// You do not need to add suppressions to this file manually.\n\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1704:IdentifiersShouldBeSpelledCorrectly\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1702:CompoundWordsShouldBeCasedCorrectly\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1707:IdentifiersShouldNotContainUnderscores\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1703:ResourceStringsShouldBeSpelledCorrectly\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA2210:AssembliesShouldHaveValidStrongNames\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1014:MarkAssembliesWithClsCompliant\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.MainWindow\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon,System.Windows.Forms.MessageBoxDefaultButton)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#clearCacheToolStripMenuItem_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.MainWindow.#clearCacheToolStripMenuItem_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#copySkillsToClipboardBBFormatToolStripMenuItem_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.MainWindow.#copySkillsToClipboardBBFormatToolStripMenuItem_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#EveMonClient_ServerStatusUpdated(System.Object,EVEMon.Common.CustomEventArgs.EveServerEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Title(System.String)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.NotifyIcon.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_ToolTipText(System.String)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Menubar\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Skillbooks\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Uploader\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"UserVoice\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"bak\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"emp\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"tsddbSettings\", Scope = \"member\", Target = \"EVEMon.MainWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Reliability\", \"CA2000:Dispose objects before losing scope\", Scope = \"member\", Target = \"EVEMon.MainWindow.#LayoutTabPages()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#OnLoad(System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon,System.Windows.Forms.MessageBoxDefaultButton)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#resetSettingsToolStripMenuItem_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Reseting\", Scope = \"member\", Target = \"EVEMon.MainWindow.#resetSettingsToolStripMenuItem_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.MainWindow.#resetSettingsToolStripMenuItem_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#testTimeoutOneSecToolStripMenuItem_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.MainWindow.#testTimeoutOneSecToolStripMenuItem_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#UpdateStatusLabel()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_ToolTipText(System.String)\", Scope = \"member\", Target = \"EVEMon.MainWindow.#UpdateStatusLabel()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Program.#HandleUnhandledException(System.Exception)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Program.#HandleUnhandledException(System.Exception)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Program.#HandleUnhandledException(System.Exception)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.About.AboutWindow.#AboutWindow_Load(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.About.AboutWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Anari\", Scope = \"member\", Target = \"EVEMon.About.AboutWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEDev\", Scope = \"member\", Target = \"EVEMon.About.AboutWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.About.AboutWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Goonfleet\", Scope = \"member\", Target = \"EVEMon.About.AboutWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Liron\", Scope = \"member\", Target = \"EVEMon.About.AboutWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"MultiPanel\", Scope = \"member\", Target = \"EVEMon.About.AboutWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"devs\", Scope = \"member\", Target = \"EVEMon.About.AboutWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"evemon\", Scope = \"member\", Target = \"EVEMon.About.AboutWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"snippits\", Scope = \"member\", Target = \"EVEMon.About.AboutWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyDeletionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyDeletionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeysListBox.#DrawTexts(System.Drawing.Graphics,EVEMon.Common.APIKey,System.Int32,System.Int32,System.Drawing.Brush,System.Drawing.Image)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeysManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeysManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeysManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"apiKeysListPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeysManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"charactersListPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeysManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"noAPIKeysPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeysManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"noCharactersPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeysManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeysManagementWindow.#UpdateCharactersListContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.#ctor(System.Windows.Forms.ListViewItem,System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeysManagementWindow.#UpdateCharactersListContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#ButtonNext_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"activeinstalllinks\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"apiKeyExistsErrorPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"apiKeyExpiredErrorPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"authenticationErrorPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"cachedWarningPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"charactersListPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"credentialsPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"eveonline\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"generalErrorPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"loginDeniedErrorPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"resultPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"waitingPage\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#MultiPanel_SelectionChange(System.Object,EVEMon.Common.Controls.MultiPanel.MultiPanelSelectionChangeEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#OnUpdated(System.Object,EVEMon.Common.CustomEventArgs.APIKeyCreationEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.CharacterDeletionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.CharacterDeletionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.CharacterImportationWindow.#fileButton_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Title(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.CharacterImportationWindow.#fileButton_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.CharacterImportationWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Mobility\", \"CA1601:DoNotUseTimersThatPreventPowerStateChanges\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.CharacterImportationWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"AccountStatus\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"AssetList\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"CharacterInfo\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"CharacterSheet\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"ContactList\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"FacWarStats\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"IndustryJobs\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"MailBodies\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"MailMessages\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"MailingLists\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"MarketOrders\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"NotificationTexts\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"SkillInTraining\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"SkillQueue\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"WalletJournal\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"WalletTransactions\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"createpredefined\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"eveonline\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiErrorHandling.ApiErrorWindow.#CopyToClipboardLinkLabel_LinkClicked(System.Object,System.Windows.Forms.LinkLabelLinkClickedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.ApiErrorHandling.ApiErrorWindow.#CopyToClipboardLinkLabel_LinkClicked(System.Object,System.Windows.Forms.LinkLabelLinkClickedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiErrorHandling.ApiErrorWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.ApiErrorHandling.HttpTimeoutTroubleshooter+TimeoutOption.#ctor(System.Int32,System.String)\", Scope = \"member\", Target = \"EVEMon.ApiErrorHandling.HttpTimeoutTroubleshooter.#.ctor()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiErrorHandling.HttpTimeoutTroubleshooter.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.ApiErrorHandling.HttpTimeoutTroubleshooter.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\", Scope = \"member\", Target = \"EVEMon.ApiErrorHandling.HttpTimeoutTroubleshooter+TimeoutOption.#Label\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiTester.ApiTesterWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Security\", \"CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands\", Scope = \"member\", Target = \"EVEMon.ApiTester.ApiTesterWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiTester.ApiTesterWindow.#LoadDocument(System.Uri)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1062:Validate arguments of public methods\", MessageId = \"0\", Scope = \"member\", Target = \"EVEMon.ApiTester.ApiTesterWindow.#OnClosing(System.ComponentModel.CancelEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiTester.ApiTesterWindow.#UpdateExternalInfoControlsEnabling()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ApiTester.ApiTesterWindow.#UpdateIDOrNameLabelVisibility()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Starbase\", Scope = \"member\", Target = \"EVEMon.ApiTester.ApiTesterWindow.#UpdateIDOrNameLabelVisibility()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.BlankCharacter.BlankCharacterControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Reclaimers\", Scope = \"member\", Target = \"EVEMon.BlankCharacter.BlankCharacterControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Weathy\", Scope = \"member\", Target = \"EVEMon.BlankCharacter.BlankCharacterControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.BlankCharacter.BlankCharacterControl.#UpdateAncestryControl()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.BlankCharacter.BlankCharacterWindow.#BlankCharacterWindow_Load(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.BlankCharacter.BlankCharacterWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.BlankCharacter.BlankCharacterWindow.#OnCharacterSaved()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.CharacterMonitoring.CharacterAssetsList\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterAssetsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterAssetsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterAssetsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterAssetsList.#IsTextMatching(EVEMon.Common.Asset,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterAssetsList.#UpdateContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterAssetsList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Asset>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContactList.#DrawItem(EVEMon.Common.Contact,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContactList.#DrawItem(EVEMon.Common.Contact,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContactList.#DrawItem(EVEMon.Common.Contact,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContactList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.CharacterMonitoring.CharacterContractsList\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContractsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContractsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContractsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContractsList.#IsTextMatching(EVEMon.Common.Contract,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContractsList.#SetColumn(EVEMon.Common.Contract,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.ContractColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContractsList.#SetColumn(EVEMon.Common.Contract,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.ContractColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContractsList.#UpdateContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContractsList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Contract>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEmploymentHistoryList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEmploymentHistoryList.#lbEmploymentHistory_DrawItem(System.Object,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEmploymentHistoryList.#lbEmploymentHistory_DrawItem(System.Object,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.CharacterMonitoring.CharacterEveMailMessagesList\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveMailMessagesList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveMailMessagesList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveMailMessagesList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveMailMessagesList.#IsTextMatching(EVEMon.Common.EveMailMessage,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveMailMessagesList.#SetColumn(EVEMon.Common.EveMailMessage,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.EveMailMessageColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveMailMessagesList.#UpdateContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveMailMessagesList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.EveMailMessage>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.CharacterMonitoring.CharacterEveNotificationsList\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveNotificationsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveNotificationsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveNotificationsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveNotificationsList.#IsTextMatching(EVEMon.Common.EveNotification,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveNotificationsList.#SetColumn(EVEMon.Common.EveNotification,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.EveNotificationColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveNotificationsList.#UpdateContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveNotificationsList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.EveNotification>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterFactionalWarfareStatsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterFactionalWarfareStatsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterFactionalWarfareStatsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Amarr\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterFactionalWarfareStatsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Caldari\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterFactionalWarfareStatsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Gallente\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterFactionalWarfareStatsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Minmatar\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterFactionalWarfareStatsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterFactionalWarfareStatsList.#UpdateHeader()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.CharacterMonitoring.CharacterIndustryJobsList\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterIndustryJobsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterIndustryJobsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterIndustryJobsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterIndustryJobsList.#IsTextMatching(EVEMon.Common.IndustryJob,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterIndustryJobsList.#SetColumn(EVEMon.Common.IndustryJob,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.IndustryJobColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterIndustryJobsList.#SetColumn(EVEMon.Common.IndustryJob,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.IndustryJobColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterIndustryJobsList.#UpdateContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterIndustryJobsList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.IndustryJob>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterIndustryJobsList.#UpdatePanelInfo()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#DisplayTooltip()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#DrawItem(EVEMon.Common.KillLog,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#DrawItem(EVEMon.Common.KillLog,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#DrawKillText(EVEMon.Common.KillLog,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#DrawKillText(EVEMon.Common.KillLog,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#DrawLossText(EVEMon.Common.KillLog,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#DrawLossText(EVEMon.Common.KillLog,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#IsTextMatching(EVEMon.Common.KillLog,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#UpdateListViewContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList.#CalculatePanelInfo()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList.#IsTextMatching(EVEMon.Common.MarketOrder,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList.#SetColumn(EVEMon.Common.MarketOrder,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.MarketOrderColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList.#SetColumn(EVEMon.Common.MarketOrder,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.MarketOrderColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList.#UpdateContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.MarketOrder>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList.#UpdatePanelInfo()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMedalsList.#DrawItem(EVEMon.Common.Medal,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMedalsList.#DrawItem(EVEMon.Common.Medal,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMedalsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#columnSettingsMenuItem_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#hideInactiveMenuItem_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_ToolTipText(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Mobility\", \"CA1601:DoNotUseTimersThatPreventPowerStateChanges\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"assetsPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"contactsPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"contractsPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"employmentPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"eveNotificationsPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"factionalWarfareStatsPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"jobsPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"killLogPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"mailMessagesPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"medalsPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"ordersPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"researchPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"skillQueuePage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"skillsPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"standingsPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"walletJournalPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"walletTransactionsPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#numberAbsFormatMenuItem_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#preferencesMenu_DropDownOpening(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#preferencesMenu_DropDownOpening(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorFooter.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorFooter.#SkillQueueIsPaused()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorFooter.#UpdateSkillQueueInfo()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorFooter.#UpdateTrainingSkillInfo()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#ActiveShipLabel_MouseHover(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#CorporationNameLabel_MouseHover(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripMenuItem.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#CreateNewMonitorToolStripMenuItem(EVEMon.Common.IQueryMonitor)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#FormatBalance()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"ss\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#SetThrobberStopped()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#SetThrobberUpdating()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#UpdateAccountStatusInfo()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#UpdateCountdown()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#UpdateInfoControls()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#UpdateInfrequentControls()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterResearchPointsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterResearchPointsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterResearchPointsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterResearchPointsList.#IsTextMatching(EVEMon.Common.ResearchPoint,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterResearchPointsList.#UpdateContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripMenuItem.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsList.#BuildContextMenu(EVEMon.Common.Skill)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripMenuItem.#ctor(System.String,System.Drawing.Image)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsList.#BuildContextMenu(EVEMon.Common.Skill)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsList.#DrawItem(EVEMon.Common.Skill,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsList.#DrawItem(EVEMon.Common.Skill,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsList.#DrawItem(EVEMon.Common.SkillGroup,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsList.#DrawItem(EVEMon.Common.SkillGroup,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripMenuItem.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsQueueList.#BuildContextMenu(EVEMon.Common.Skill)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripMenuItem.#ctor(System.String,System.Drawing.Image)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsQueueList.#BuildContextMenu(EVEMon.Common.Skill)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsQueueList.#DrawItem(EVEMon.Common.QueuedSkill,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsQueueList.#DrawItem(EVEMon.Common.QueuedSkill,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsQueueList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterStandingsList.#DrawItem(EVEMon.Common.Standing,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterStandingsList.#DrawItem(EVEMon.Common.Standing,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterStandingsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletJournalList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletJournalList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletJournalList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletJournalList.#IsTextMatching(EVEMon.Common.WalletJournal,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletJournalList.#UpdateContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletJournalList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.WalletJournal>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletTransactionsList\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletTransactionsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletTransactionsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletTransactionsList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletTransactionsList.#IsTextMatching(EVEMon.Common.WalletTransaction,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletTransactionsList.#UpdateContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletTransactionsList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.WalletTransaction>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharactersComparison.CharactersComparisonWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharactersComparison.CharactersComparisonWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharactersComparison.CharactersComparisonWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListView+ColumnHeaderCollection.Add(System.String)\", Scope = \"member\", Target = \"EVEMon.CharactersComparison.CharactersComparisonWindow.#UpdateCharacterInfo()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.KillReportAttacker.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.KillReportFittingContent.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.KillReportFittingContent.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.KillReportInvolvedParties.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.KillReportVictim.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.KillReportVictim.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Constelation\", Scope = \"member\", Target = \"EVEMon.Controls.KillReportVictim.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.Controls.NotificationList\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.Overview.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.OverviewItem.#EveMonClient_QueuedSkillsCompleted(System.Object,EVEMon.Common.CustomEventArgs.QueuedSkillsEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.OverviewItem.#FormatBalance()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.OverviewItem.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.Controls.OverviewItem.#PerformCustomLayout(System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.OverviewItem.#UpdateContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.OverviewItem.#UpdateSkillQueueTrainingTime()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.ReadingPane.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Security\", \"CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands\", Scope = \"member\", Target = \"EVEMon.Controls.ReadingPane.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Controls.ReadingPane.#UpdatePane()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Security\", \"CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands\", Scope = \"member\", Target = \"EVEMon.Controls.ReadingPane.#UpdatePane()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#BidsButton_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.DetailsWindow.ContractDetailsWindow.DrawText(System.Windows.Forms.PaintEventArgs,System.String,System.String,System.Drawing.Font,System.Boolean,System.Int32)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawAuctionInfo(System.Windows.Forms.PaintEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.DetailsWindow.ContractDetailsWindow.DrawText(System.Windows.Forms.PaintEventArgs,System.String,System.String,System.Drawing.Font,System.Boolean,System.Int32)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawCourierInfo(System.Windows.Forms.PaintEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.DetailsWindow.ContractDetailsWindow.DrawText(System.Windows.Forms.PaintEventArgs,System.String,System.String,System.Drawing.Font,System.Boolean,System.Int32)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawExpirationText(System.Windows.Forms.PaintEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawHeader(System.Windows.Forms.PaintEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.DetailsWindow.ContractDetailsWindow.DrawColoredText(System.Windows.Forms.PaintEventArgs,System.String,System.Drawing.Font,System.Drawing.PointF,System.Drawing.Color,System.Boolean)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawItemsInfo(System.Windows.Forms.PaintEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.DetailsWindow.ContractDetailsWindow.DrawText(System.Windows.Forms.PaintEventArgs,System.String,System.String,System.Drawing.Font,System.Boolean,System.Int32)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawItemsInfo(System.Windows.Forms.PaintEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawItemsInfo(System.Windows.Forms.PaintEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawJumps(System.Windows.Forms.PaintEventArgs,EVEMon.Common.Data.Station)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.DetailsWindow.ContractDetailsWindow.DrawText(System.Windows.Forms.PaintEventArgs,System.String,System.String,System.Drawing.Font,System.Boolean,System.Int32)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawJumps(System.Windows.Forms.PaintEventArgs,EVEMon.Common.Data.Station)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawJumps(System.Windows.Forms.PaintEventArgs,EVEMon.Common.Data.Station)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawRouteThroughText(System.Windows.Forms.PaintEventArgs,EVEMon.Common.Data.Station)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.DetailsWindow.ContractDetailsWindow.DrawColoredText(System.Windows.Forms.PaintEventArgs,System.String,System.Drawing.Font,System.Drawing.PointF,System.Drawing.Color,System.Boolean)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawRouteThroughText(System.Windows.Forms.PaintEventArgs,EVEMon.Common.Data.Station)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.DetailsWindow.ContractDetailsWindow.DrawText(System.Windows.Forms.PaintEventArgs,System.String,System.String,System.Drawing.Font,System.Boolean,System.Int32)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawRouteThroughText(System.Windows.Forms.PaintEventArgs,EVEMon.Common.Data.Station)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawRouteThroughText(System.Windows.Forms.PaintEventArgs,EVEMon.Common.Data.Station)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.DetailsWindow.ContractDetailsWindow.DrawColoredText(System.Windows.Forms.PaintEventArgs,System.String,System.Drawing.Font,System.Drawing.PointF,System.Drawing.Color,System.Boolean)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawStationText(System.Windows.Forms.PaintEventArgs,System.String,EVEMon.Common.Data.Station)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawStationText(System.Windows.Forms.PaintEventArgs,System.String,EVEMon.Common.Data.Station)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"inaccesible\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#DrawStationText(System.Windows.Forms.PaintEventArgs,System.String,EVEMon.Common.Data.Station)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow.#RoutePanel_Paint(System.Object,System.Windows.Forms.PaintEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow+ContractItemsListView.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.EveMessageWindow.#.ctor(EVEMon.Common.IEveMessage)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.EveMessageWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.KillReportWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Reliability\", \"CA2000:Dispose objects before losing scope\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.WalletJournalChartWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.WalletJournalChartWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ExceptionHandling.UnhandledExceptionWindow.#BuildExceptionMessage()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String)\", Scope = \"member\", Target = \"EVEMon.ExceptionHandling.UnhandledExceptionWindow.#CopyDetailsLinkLabel_LinkClicked(System.Object,System.Windows.Forms.LinkLabelLinkClickedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.ExceptionHandling.UnhandledExceptionWindow.#CopyDetailsLinkLabel_LinkClicked(System.Object,System.Windows.Forms.LinkLabelLinkClickedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.ExceptionHandling.UnhandledExceptionWindow.#CopyDetailsLinkLabel_LinkClicked(System.Object,System.Windows.Forms.LinkLabelLinkClickedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ExceptionHandling.UnhandledExceptionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.ExceptionHandling.UnhandledExceptionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ImplantControls.ImplantSetsWindow.#ImpGroups_Load(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ImplantControls.ImplantSetsWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.DataGridViewColumn.set_HeaderText(System.String)\", Scope = \"member\", Target = \"EVEMon.ImplantControls.ImplantSetsWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.ImplantControls.ImplantTooltip.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"FakeTooltip\", Scope = \"member\", Target = \"EVEMon.ImplantControls.ImplantTooltip.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.ContractsWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.IndustryJobsWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.MarketOrdersWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.OwnedSkillBooksWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.OwnedSkillBooksWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.OwnedSkillBooksWindow.#SetColumn(EVEMon.Common.Skill,System.Windows.Forms.ListViewItem+ListViewSubItem,System.Windows.Forms.ColumnHeader)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.SkillCompletionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.TimeCheckNotification.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.TimeCheckNotification.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"ServerTime\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.TimeCheckNotification.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Synchronisation\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.TimeCheckNotification.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"SystemTime\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.TimeCheckNotification.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"TimeZone\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.TimeCheckNotification.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Schedule.DateSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Schedule.EditScheduleEntryWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Schedule.EditScheduleEntryWindow.#SetRecurringDateFrom(System.DateTime)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Schedule.EditScheduleEntryWindow.#SetRecurringDateTo(System.DateTime)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Point,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.Schedule.ScheduleCalendar.#OnPaint(System.Windows.Forms.PaintEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Point,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.Schedule.ScheduleCalendar.#PaintMonthEntriesForDay(System.Drawing.Graphics,System.DateTime,System.Drawing.Rectangle)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.Schedule.ScheduleCalendar.#PaintMonthEntriesForDay(System.Drawing.Graphics,System.DateTime,System.Drawing.Rectangle)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Schedule.ScheduleEditorWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Schedule.ScheduleEditorWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Schedule.ScheduleEditorWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Schedule.ScheduleEditorWindow.#ShowCalendarContextMenu(System.DateTime,System.Drawing.Point)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.APISettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.DataGridViewColumn.set_HeaderText(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.APISettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.EmailNotificationsControl.#btnTestEmail_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.SettingsUI.EmailNotificationsControl.#btnTestEmail_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.EmailNotificationsControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.LocalhostSettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon,System.Windows.Forms.MessageBoxDefaultButton)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.MarketUnifiedUploaderControl.#DeleteButton_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.SettingsUI.MarketUnifiedUploaderControl.#DeleteButton_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.MarketUnifiedUploaderControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Localhosts\", Scope = \"member\", Target = \"EVEMon.SettingsUI.MarketUnifiedUploaderControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"uploader\", Scope = \"member\", Target = \"EVEMon.SettingsUI.MarketUnifiedUploaderControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.MarketUnifiedUploaderControl.#ShowInfoLabel()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"uploader\", Scope = \"member\", Target = \"EVEMon.SettingsUI.MarketUnifiedUploaderControl.#ShowInfoLabel()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.MarketUnifiedUploaderControl.#UpdateEndPointsList()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.MarketUnifiedUploaderControl.#Uploader_StatusChanged(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.NotificationsControl.#AddCheckBox(System.Int32,EVEMon.Common.Notifications.NotificationCategory)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.NotificationsControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.PortableEveClientsControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.ProxyAuthenticationWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsFileStorageControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsFileStorageControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.SettingsUI.SettingsForm\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon,System.Windows.Forms.MessageBoxDefaultButton)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#btnDeleteAPIServer_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#btnDeleteAPIServer_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#igbPortTextBox_TextChanged(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.#ctor(System.String,System.Int32,System.Int32)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.#ctor(System.String,System.Int32,System.Int32,System.Windows.Forms.TreeNode[])\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.#ctor(System.String,System.Windows.Forms.TreeNode[])\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Behaviour\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon's\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Prereq-Met\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Uploader\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"battleClinicServicePage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"behaviour\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"emailNotificationsPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"externalCalendarPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"generalPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"iconsPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"igbServerPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"mainWindowPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"marketUnifiedUploaderPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"messagesPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"networkPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"notificationsPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"portableEveClientsPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"schedulerUIPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"skillPlannerPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"skillbooks\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"trayIconPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"updatesPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.SettingsUI.SettingsForm.ShowErrorMessage(System.String,System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#IsValidPort(System.String,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#ShowErrorMessage(System.String,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.#ctor(System.String,System.Int32,System.Int32)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#skillIconSetComboBox_SelectedIndexChanged(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Pre-Reqs\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#skillIconSetComboBox_SelectedIndexChanged(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.SettingsUI.SettingsForm.ShowErrorMessage(System.String,System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#tbCalendarPath_Validating(System.Object,System.ComponentModel.CancelEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.SettingsUI.SettingsForm.ShowErrorMessage(System.String,System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#tbReminder_Validating(System.Object,System.ComponentModel.CancelEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Security\", \"CA2104:DoNotDeclareReadOnlyMutableReferenceTypes\", Scope = \"member\", Target = \"EVEMon.SettingsUI.TrayBaseWindow.#MainFlowLayoutPanel\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SettingsUI.TrayBaseWindow.#MainFlowLayoutPanel\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Security\", \"CA2104:DoNotDeclareReadOnlyMutableReferenceTypes\", Scope = \"member\", Target = \"EVEMon.SettingsUI.TrayBaseWindow.#ToolTipLabel\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SettingsUI.TrayBaseWindow.#ToolTipLabel\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SettingsUI.TrayBaseWindow.#UpdatePending\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.TrayPopupConfigForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.TrayPopupConfigForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.TrayPopupConfigForm.#UpdateDisplayOrders()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.TrayPopupWindow.#UpdateEveTimeLabel()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.TrayPopupWindow.#UpdateUploaderStatusLabel()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Uploader\", Scope = \"member\", Target = \"EVEMon.SettingsUI.TrayPopupWindow.#UpdateUploaderStatusLabel()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.TrayTooltipConfigForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"tr\", Scope = \"member\", Target = \"EVEMon.SettingsUI.TrayTooltipConfigForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.UpdateSettingsControl.#AddIcon(System.Enum,System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.UpdateSettingsControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.SettingsUI.UpdateSettingsControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Mobility\", \"CA1601:DoNotUseTimersThatPreventPowerStateChanges\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributeBarControl.#.ctor()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Remappable\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"labelDescription\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationControl.#UpdateAttributeControls(EVEMon.Common.RemappingResult,EVEMon.Common.EveAttribute,System.Windows.Forms.Control,EVEMon.SkillPlanner.AttributeBarControl,EVEMon.SkillPlanner.AttributeBarControl)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationControl.#UpdateControls(EVEMon.Common.Character,EVEMon.Common.BasePlan,EVEMon.Common.RemappingResult,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Form.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationForm.#.ctor(EVEMon.Common.Character,EVEMon.Common.Plan,EVEMon.Common.RemappingPoint)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem.#ctor(System.String,System.Windows.Forms.ListViewGroup)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationForm.#AddSummaryForRemapping(EVEMon.Common.RemappingResult,System.TimeSpan&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem.#ctor(System.String,System.Windows.Forms.ListViewGroup)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationForm.#UpdateSummaryInformation(System.Collections.Generic.IEnumerable`1<EVEMon.Common.RemappingResult>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationSettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.BlueprintBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.BlueprintBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.BlueprintBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.BlueprintBrowserControl.#OnLoad(System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.BlueprintBrowserControl.#UpdateAttributes()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListView+ColumnHeaderCollection.Add(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.BlueprintBrowserControl.#UpdateRequiredMaterialsList()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.BlueprintSelectControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectBrowserControl.#AddFittingSlotProperty(System.Collections.Generic.ICollection`1<System.Windows.Forms.ListViewItem>,System.Windows.Forms.ListViewGroup)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EveObject\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListView+ColumnHeaderCollection.Add(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectBrowserControl.#UpdatePropertiesList()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#CanUse(EVEMon.Common.Data.Item)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#cbUsabilityFilter\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#contextMenu_Opening(System.Object,System.ComponentModel.CancelEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#lblFilter\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#lbNoMatches\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#lbSearchList\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#lbSearchTextHint\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#lowerPanel\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#pbSearchImage\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#tbSearchText\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#tvItems\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#upperPanel\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ImplantCalculator.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ImplantCalculator.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ImplantCalculator.#UpdateAttributeLabels(EVEMon.Common.EveAttribute,System.Int32,System.Windows.Forms.Control,System.Windows.Forms.Control)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ImplantCalculator.#UpdateContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ImplantCalculator.#UpdateTimes()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ItemBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ItemBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ItemBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ItemSelectControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#DeserializeDnaFormat()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#DeserializeDnaFormat()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#DeserializeDnaFormat()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#DeserializeEftFormat()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#DeserializeEftFormat()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#DeserializeXMLFormat()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#DeserializeXMLFormat()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"formated\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#OnActivated(System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"formated\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#OnActivated(System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#OnActivated(System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.LoadoutImportationForm.#UpdatePlanStatus()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.NewPlanWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ObsoleteEntriesForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ObsoleteEntriesForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItemCollection.Add(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ObsoleteEntriesForm.#UpdateListView()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.SkillPlanner.PlanEditorControl\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#cmsContextMenu_Opening(System.Object,System.ComponentModel.CancelEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"unowned\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#cmsContextMenu_Opening(System.Object,System.ComponentModel.CancelEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#FormatEntry(EVEMon.Common.PlanEntry,System.Windows.Forms.ListViewItem)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#FormatRemappingPoint(System.Windows.Forms.ListViewItem)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Title(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_ToolTipText(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Prereq\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"emp\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"planToolStrip\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"tsPreferences\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.Common.Controls.MessageBoxCustom.Show(System.Windows.Forms.IWin32Window,System.String,System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#ShowPriorityDialogBox(System.Collections.Generic.IEnumerable`1<EVEMon.Common.PlanEntry>,EVEMon.SkillPlanner.PlanPrioritiesEditorForm)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListView+ColumnHeaderCollection.Add(System.String,System.Int32)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#UpdateListColumns()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Atts\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#UpdateListColumns()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanHelper.#UpdatesRegularPlanToMenu(System.Windows.Forms.ToolStripItem,EVEMon.Common.Plan,EVEMon.Common.Skill,System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_AccessibleName(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanImportationFromCharacterForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanImportationFromCharacterForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#contextMenu_Opening(System.Object,System.ComponentModel.CancelEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Title(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"emp\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"menuBar\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"toolStrip\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#lbPlanList_SelectedIndexChanged(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon,System.Windows.Forms.MessageBoxDefaultButton)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#miDelete_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#miDelete_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#miImportPlanFromCharacter_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#miRenameEdit_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#miRestorePlans_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Title(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#miRestorePlans_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#miRestorePlans_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"epb\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#miRestorePlans_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItemCollection.Add(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanManagementWindow.#UpdateContent(System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanNotesEditorWindow.#.ctor(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanNotesEditorWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanPrioritiesEditorForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Priorty\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanPrioritiesEditorForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanToOperationForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"PlanToOperationForm\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanToOperationForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"additionPage\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanToOperationForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"dependenciesSuppressionPage\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanToOperationForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"exisiting\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanToOperationForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"uselessPrereqsSuppressionPage\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanToOperationForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanToOperationForm.#OnLoad(System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanToOperationForm.#rootMultiPanel_SelectionChange(System.Object,EVEMon.Common.Controls.MultiPanel.MultiPanelSelectionChangeEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#CheckInvalidEntries()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#CheckInvalidEntries()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Title(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_ToolTipText(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"emp\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#Plan\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#Plan\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#tsbCopyForum_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#tsbCopyForum_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon,System.Windows.Forms.MessageBoxDefaultButton)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#tsbDeletePlan_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#tsbDeletePlan_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#UpdateCostStatusLabel(System.Boolean,System.Int64,System.Int64)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_ToolTipText(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#UpdateCostStatusLabel(System.Boolean,System.Int64,System.Int64)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#UpdateSkillStatusLabel(System.Boolean,System.Int32,System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#UpdateTimeStatusLabel(System.Boolean,System.Int32,System.TimeSpan)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.RequiredSkillsControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.RequiredSkillsControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.RequiredSkillsControl.#UpdateDisplay()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"loadouts\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"AuthorName\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"LoadoutName\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Loadouts\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"ShipName\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"SubmitDate\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#lblForum_LinkClicked(System.Object,System.Windows.Forms.LinkLabelLinkClickedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#lblForum_LinkClicked(System.Object,System.Windows.Forms.LinkLabelLinkClickedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#lblForum_LinkClicked(System.Object,System.Windows.Forms.LinkLabelLinkClickedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#lblForum_LinkClicked(System.Object,System.Windows.Forms.LinkLabelLinkClickedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#Plan\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#Plan\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#QueryLoadoutsFeed()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Loadout\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#QueryLoadoutsFeed()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"loadouts\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#QueryLoadoutsFeed()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipLoadoutSelectWindow.#UpdatePlanningControls()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipSelectControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Amarr\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipSelectControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Caldari\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipSelectControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Gallente\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipSelectControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Minmatar\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ShipSelectControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_ToolTipText(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"toolStrip\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillBrowserControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillBrowserControl.#UpdateContent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillBrowserControl.#UpdatePlannedLevel()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#.ctor()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#AddNode(System.Int32,EVEMon.Common.SkillLevel,System.Collections.Generic.IEnumerable`1<EVEMon.Common.Skill>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#CreateMarketGroupsNode(EVEMon.Common.Data.BlueprintMarketGroup,System.Collections.Generic.IEnumerable`1<EVEMon.Common.Data.Item>,System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#GroupByAlphabet(System.Int32,System.Windows.Forms.TreeNode,System.Collections.Generic.IEnumerable`1<EVEMon.Common.Data.Item>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Preqresites\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#tsShowItemPrereqs_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#tsShowItemPrereqs_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#tsShowSkillPrereqs_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#tsShowSkillPrereqs_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#tvEntity_NodeMouseClick(System.Object,System.Windows.Forms.TreeNodeMouseClickEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#UpdateItemsTree()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#UpdateItemsTree()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#UpdatePlanName()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#UpdateSkillsTree()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#UpdateTreesHeaders()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.SkillPlanner.SkillSelectControl\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillSelectControl.#AddNodes(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Skill>,System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillSelectControl.#cmSkills_Opening(System.Object,System.ComponentModel.CancelEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillSelectControl.#GetFilter()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillSelectControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillSelectControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillSelectControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.SkillPlanner.SkillTreeDisplayControl.MeasureAndDrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Point,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillTreeDisplayControl.#DrawCell(System.Drawing.Graphics,EVEMon.SkillPlanner.SkillTreeDisplayControl+Cell,System.Drawing.Font,System.Int32,System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons)\", Scope = \"member\", Target = \"EVEMon.Updater.DataUpdateNotifyForm.#btnUpdate_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Updater.DataUpdateNotifyForm.#btnUpdate_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Updater.DataUpdateNotifyForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Updater.DataUpdateNotifyForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Updater.UpdateDownloadForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Updater.UpdateDownloadForm.#ProgressChanged(EVEMon.Common.Net.DownloadProgressChangedArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon,System.Windows.Forms.MessageBoxDefaultButton)\", Scope = \"member\", Target = \"EVEMon.Updater.UpdateNotifyForm.#btnIgnore_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Updater.UpdateNotifyForm.#btnIgnore_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons)\", Scope = \"member\", Target = \"EVEMon.Updater.UpdateNotifyForm.#btnUpdate_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Updater.UpdateNotifyForm.#btnUpdate_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.Windows.Forms.IWin32Window,System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Updater.UpdateNotifyForm.#ExecutePatcher(System.String,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Updater.UpdateNotifyForm.#ExecutePatcher(System.String,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Updater.UpdateNotifyForm.#ExecutePatcher(System.String,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Updater.UpdateNotifyForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Updater.UpdateNotifyForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"api-key\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"api\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeyUpdateOrAdditionWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"KillLog\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.EVEMonFeaturesWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"searchTextDel\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"planetaryPage\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorBody.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"dd\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"PlanetaryColumnsSelectWindow\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.PlanetaryColumnsSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Est\", Scope = \"member\", Target = \"EVEMon.Controls.KillReportFittingContent.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Qty\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.ContractDetailsWindow+ContractItemsListView.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"marketPriceProvidersPage\", Scope = \"member\", Target = \"EVEMon.SettingsUI.SettingsForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Calc\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#UpdateListColumns()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"dependant\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#ShowPriorityDialogBox(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.PlanEntry>,EVEMon.SkillPlanner.PlanPrioritiesEditorForm)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Calc\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.PlanetaryColumnsSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.About.AboutWindow.#GetVersionText()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.ApiCredentialsManagement.ApiKeysListBox.#DrawTexts(System.Drawing.Graphics,EVEMon.Common.Models.APIKey,System.Int32,System.Int32,System.Drawing.Brush,System.Drawing.Image)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterAssetsList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.Asset>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContactList.#DrawItem(EVEMon.Common.Models.Contact,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContactList.#DrawItem(EVEMon.Common.Models.Contact,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContactList.#DrawItem(EVEMon.Common.Models.Contact,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContractsList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.Contract>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContractsList.#SetColumn(EVEMon.Common.Models.Contract,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.ContractColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.EveObjectSelectControl.#pbSerachTextDel\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterContractsList.#SetColumn(EVEMon.Common.Models.Contract,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.ContractColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveMailMessagesList.#SetColumn(EVEMon.Common.Models.EveMailMessage,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.EveMailMessageColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveNotificationsList.#SetColumn(EVEMon.Common.Models.EveNotification,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.EveNotificationColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterIndustryJobsList.#SetColumn(EVEMon.Common.Models.IndustryJob,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.IndustryJobColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#DrawItem(EVEMon.Common.Models.KillLog,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#DrawItem(EVEMon.Common.Models.KillLog,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#DrawKillText(EVEMon.Common.Models.KillLog,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#DrawKillText(EVEMon.Common.Models.KillLog,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#DrawLossText(EVEMon.Common.Models.KillLog,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterKillLogList.#DrawLossText(EVEMon.Common.Models.KillLog,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList.#SetColumn(EVEMon.Common.Models.MarketOrder,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.MarketOrderColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMedalsList.#DrawItem(EVEMon.Common.Models.Medal,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMedalsList.#DrawItem(EVEMon.Common.Models.Medal,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripMenuItem.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMonitorHeader.#CreateNewMonitorToolStripMenuItem(EVEMon.Common.Interfaces.IQueryMonitor)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterPlanetaryList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterPlanetaryList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ColumnHeader.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterPlanetaryList.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsList.#DrawItem(EVEMon.Common.Models.Skill,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsList.#DrawItem(EVEMon.Common.Models.Skill,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsList.#DrawItem(EVEMon.Common.Models.SkillGroup,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsList.#DrawItem(EVEMon.Common.Models.SkillGroup,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripMenuItem.#ctor(System.String,System.Drawing.Image)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsList.#BuildContextMenu(EVEMon.Common.Models.Skill)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripMenuItem.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsList.#BuildContextMenu(EVEMon.Common.Models.Skill)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsQueueList.#DrawItem(EVEMon.Common.Models.QueuedSkill,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsQueueList.#DrawItem(EVEMon.Common.Models.QueuedSkill,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripMenuItem.#ctor(System.String,System.Drawing.Image)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsQueueList.#BuildContextMenu(EVEMon.Common.Models.Skill)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripMenuItem.#ctor(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsQueueList.#BuildContextMenu(EVEMon.Common.Models.Skill)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsQueueList.#tempCreatePlanMenuItem_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Size,System.Windows.Forms.TextFormatFlags)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterStandingsList.#DrawItem(EVEMon.Common.Models.Standing,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.DrawText(System.Drawing.IDeviceContext,System.String,System.Drawing.Font,System.Drawing.Rectangle,System.Drawing.Color)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterStandingsList.#DrawItem(EVEMon.Common.Models.Standing,System.Windows.Forms.DrawItemEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.PlanetaryColumnsSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.DetailsWindow.EveMessageWindow.#.ctor(EVEMon.Common.Interfaces.IEveMessage)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.OwnedSkillBooksWindow.#SetColumn(EVEMon.Common.Models.Skill,System.Windows.Forms.ListViewItem+ListViewSubItem,System.Windows.Forms.ColumnHeader)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.NotificationWindow.PlanetaryPinsWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationControl.#UpdateControls(EVEMon.Common.Models.Character,EVEMon.Common.Models.BasePlan,EVEMon.Common.Models.RemappingResult,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationControl.#UpdateAttributeControls(EVEMon.Common.Models.RemappingResult,EVEMon.Common.Enumerations.EveAttribute,System.Windows.Forms.Control,EVEMon.SkillPlanner.AttributeBarControl,EVEMon.SkillPlanner.AttributeBarControl)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Form.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationForm.#.ctor(EVEMon.Common.Models.Character,EVEMon.Common.Models.Plan,EVEMon.Common.Models.RemappingPoint)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem.#ctor(System.String,System.Windows.Forms.ListViewGroup)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationForm.#UpdateSummaryInformation(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.RemappingResult>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem.#ctor(System.String,System.Windows.Forms.ListViewGroup)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.AttributesOptimizationForm.#AddSummaryForRemapping(EVEMon.Common.Models.RemappingResult,System.TimeSpan&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListView+ColumnHeaderCollection.Add(System.String,System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.BlueprintBrowserControl.#UpdateRequiredMaterialsList()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.ImplantCalculator.#UpdateAttributeLabels(EVEMon.Common.Enumerations.EveAttribute,System.Int32,System.Windows.Forms.Control,System.Windows.Forms.Control)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListViewItem+ListViewSubItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#FormatEntry(EVEMon.Common.Models.PlanEntry,System.Windows.Forms.ListViewItem)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ListView+ColumnHeaderCollection.Add(System.String,System.String,System.Int32)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#UpdateListColumns()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.Common.Controls.MessageBoxCustom.Show(System.Windows.Forms.IWin32Window,System.String,System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanEditorControl.#ShowPriorityDialogBox(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.PlanEntry>,EVEMon.SkillPlanner.PlanPrioritiesEditorForm)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.PlanHelper.#UpdatesRegularPlanToMenu(System.Windows.Forms.ToolStripItem,EVEMon.Common.Models.Plan,EVEMon.Common.Models.Skill,System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillExplorerWindow.#AddNode(System.Int32,EVEMon.Common.Models.SkillLevel,System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.Skill>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TreeNode.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.SkillSelectControl.#AddNodes(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.Skill>,System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveMailMessagesList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.EveMailMessage>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterEveNotificationsList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.EveNotification>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterIndustryJobsList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.IndustryJob>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterIndustryJobsList.#SetColumn(EVEMon.Common.Models.IndustryJob,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.IndustryJobColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.MarketOrder>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterMarketOrdersList.#SetColumn(EVEMon.Common.Models.MarketOrder,System.Windows.Forms.ListViewItem+ListViewSubItem,EVEMon.Common.SettingsObjects.MarketOrderColumn)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterPlanetaryList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.PlanetaryPin>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletJournalList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.WalletJournal>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletTransactionsList.#UpdateContentByGroup(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.WalletTransaction>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.BlueprintBrowserControl.#RefreshTabs()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.BlueprintBrowserControl.#GetTimeEfficiencyModifier(EVEMon.Common.Enumerations.BlueprintActivity)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.SkillPlanner.BlueprintBrowserControl.#nudME_ValueChanged(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.CharacterMonitoring.CharacterPlanetaryList\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.CharacterMonitoring.CharacterWalletJournalList\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.CharacterMonitoring.CharacterSkillsQueueList.#tempCreatePlanMenuItem_Click(System.Object,System.EventArgs)\")]\n\n"
  },
  {
    "path": "src/EVEMon/ImplantControls/ImplantSetsWindow.Designer.cs",
    "content": "using EVEMon.Common.Controls;\n\nnamespace EVEMon.ImplantControls\n{\n    sealed partial class ImplantSetsWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.headerLabel = new System.Windows.Forms.Label();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnOK = new System.Windows.Forms.Button();\n            this.cbSlot10 = new EVEMon.Common.Controls.DropDownMouseMoveComboBox();\n            this.cbSlot9 = new EVEMon.Common.Controls.DropDownMouseMoveComboBox();\n            this.cbSlot8 = new EVEMon.Common.Controls.DropDownMouseMoveComboBox();\n            this.cbSlot7 = new EVEMon.Common.Controls.DropDownMouseMoveComboBox();\n            this.cbSlot6 = new EVEMon.Common.Controls.DropDownMouseMoveComboBox();\n            this.cbSlot5 = new EVEMon.Common.Controls.DropDownMouseMoveComboBox();\n            this.cbSlot4 = new EVEMon.Common.Controls.DropDownMouseMoveComboBox();\n            this.cbSlot3 = new EVEMon.Common.Controls.DropDownMouseMoveComboBox();\n            this.cbSlot2 = new EVEMon.Common.Controls.DropDownMouseMoveComboBox();\n            this.cbSlot1 = new EVEMon.Common.Controls.DropDownMouseMoveComboBox();\n            this.label8 = new System.Windows.Forms.Label();\n            this.label7 = new System.Windows.Forms.Label();\n            this.label6 = new System.Windows.Forms.Label();\n            this.label5 = new System.Windows.Forms.Label();\n            this.label4 = new System.Windows.Forms.Label();\n            this.label3 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.label1 = new System.Windows.Forms.Label();\n            this.lblImplant2 = new System.Windows.Forms.Label();\n            this.lblImplant1 = new System.Windows.Forms.Label();\n            this.setsGrid = new EVEMon.Common.Controls.IntuitiveDataGridView();\n            this.NameColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();\n            this.ImplantSetsLabel = new System.Windows.Forms.Label();\n            this.ImplantsLabel = new System.Windows.Forms.Label();\n            this.deleteRowInfo = new System.Windows.Forms.Label();\n            ((System.ComponentModel.ISupportInitialize)(this.setsGrid)).BeginInit();\n            this.SuspendLayout();\n            // \n            // headerLabel\n            // \n            this.headerLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.headerLabel.AutoSize = true;\n            this.headerLabel.Location = new System.Drawing.Point(14, 198);\n            this.headerLabel.Name = \"headerLabel\";\n            this.headerLabel.Size = new System.Drawing.Size(377, 13);\n            this.headerLabel.TabIndex = 1;\n            this.headerLabel.Text = \"{0} has the skill for {1} Jump Clones (plus 1 for the implants in your active bod\" +\n    \"y)\";\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(459, 533);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 1;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // btnOK\n            // \n            this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOK.Location = new System.Drawing.Point(378, 533);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(75, 23);\n            this.btnOK.TabIndex = 0;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);\n            // \n            // cbSlot10\n            // \n            this.cbSlot10.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSlot10.Cursor = System.Windows.Forms.Cursors.Default;\n            this.cbSlot10.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;\n            this.cbSlot10.DropDownHeight = 1;\n            this.cbSlot10.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSlot10.FormattingEnabled = true;\n            this.cbSlot10.IntegralHeight = false;\n            this.cbSlot10.Location = new System.Drawing.Point(69, 501);\n            this.cbSlot10.Name = \"cbSlot10\";\n            this.cbSlot10.Size = new System.Drawing.Size(464, 21);\n            this.cbSlot10.TabIndex = 29;\n            this.cbSlot10.ToolTip = null;\n            this.cbSlot10.DropDownClosed += new System.EventHandler(this.cbSlotN_DropDownClosed);\n            // \n            // cbSlot9\n            // \n            this.cbSlot9.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSlot9.Cursor = System.Windows.Forms.Cursors.Default;\n            this.cbSlot9.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;\n            this.cbSlot9.DropDownHeight = 1;\n            this.cbSlot9.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSlot9.FormattingEnabled = true;\n            this.cbSlot9.IntegralHeight = false;\n            this.cbSlot9.Location = new System.Drawing.Point(69, 474);\n            this.cbSlot9.Name = \"cbSlot9\";\n            this.cbSlot9.Size = new System.Drawing.Size(464, 21);\n            this.cbSlot9.TabIndex = 28;\n            this.cbSlot9.ToolTip = null;\n            this.cbSlot9.DropDownClosed += new System.EventHandler(this.cbSlotN_DropDownClosed);\n            // \n            // cbSlot8\n            // \n            this.cbSlot8.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSlot8.Cursor = System.Windows.Forms.Cursors.Default;\n            this.cbSlot8.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;\n            this.cbSlot8.DropDownHeight = 1;\n            this.cbSlot8.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSlot8.FormattingEnabled = true;\n            this.cbSlot8.IntegralHeight = false;\n            this.cbSlot8.Location = new System.Drawing.Point(70, 447);\n            this.cbSlot8.Name = \"cbSlot8\";\n            this.cbSlot8.Size = new System.Drawing.Size(464, 21);\n            this.cbSlot8.TabIndex = 27;\n            this.cbSlot8.ToolTip = null;\n            this.cbSlot8.DropDownClosed += new System.EventHandler(this.cbSlotN_DropDownClosed);\n            // \n            // cbSlot7\n            // \n            this.cbSlot7.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSlot7.Cursor = System.Windows.Forms.Cursors.Default;\n            this.cbSlot7.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;\n            this.cbSlot7.DropDownHeight = 1;\n            this.cbSlot7.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSlot7.FormattingEnabled = true;\n            this.cbSlot7.IntegralHeight = false;\n            this.cbSlot7.Location = new System.Drawing.Point(69, 420);\n            this.cbSlot7.Name = \"cbSlot7\";\n            this.cbSlot7.Size = new System.Drawing.Size(464, 21);\n            this.cbSlot7.TabIndex = 26;\n            this.cbSlot7.ToolTip = null;\n            this.cbSlot7.DropDownClosed += new System.EventHandler(this.cbSlotN_DropDownClosed);\n            // \n            // cbSlot6\n            // \n            this.cbSlot6.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSlot6.Cursor = System.Windows.Forms.Cursors.Default;\n            this.cbSlot6.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;\n            this.cbSlot6.DropDownHeight = 1;\n            this.cbSlot6.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSlot6.FormattingEnabled = true;\n            this.cbSlot6.IntegralHeight = false;\n            this.cbSlot6.Location = new System.Drawing.Point(70, 393);\n            this.cbSlot6.Name = \"cbSlot6\";\n            this.cbSlot6.Size = new System.Drawing.Size(464, 21);\n            this.cbSlot6.TabIndex = 25;\n            this.cbSlot6.ToolTip = null;\n            this.cbSlot6.DropDownClosed += new System.EventHandler(this.cbSlotN_DropDownClosed);\n            // \n            // cbSlot5\n            // \n            this.cbSlot5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSlot5.Cursor = System.Windows.Forms.Cursors.Default;\n            this.cbSlot5.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;\n            this.cbSlot5.DropDownHeight = 1;\n            this.cbSlot5.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSlot5.FormattingEnabled = true;\n            this.cbSlot5.IntegralHeight = false;\n            this.cbSlot5.Location = new System.Drawing.Point(70, 366);\n            this.cbSlot5.Name = \"cbSlot5\";\n            this.cbSlot5.Size = new System.Drawing.Size(464, 21);\n            this.cbSlot5.TabIndex = 24;\n            this.cbSlot5.ToolTip = null;\n            this.cbSlot5.DropDownClosed += new System.EventHandler(this.cbSlotN_DropDownClosed);\n            // \n            // cbSlot4\n            // \n            this.cbSlot4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSlot4.Cursor = System.Windows.Forms.Cursors.Default;\n            this.cbSlot4.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;\n            this.cbSlot4.DropDownHeight = 1;\n            this.cbSlot4.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSlot4.FormattingEnabled = true;\n            this.cbSlot4.IntegralHeight = false;\n            this.cbSlot4.Location = new System.Drawing.Point(70, 339);\n            this.cbSlot4.Name = \"cbSlot4\";\n            this.cbSlot4.Size = new System.Drawing.Size(464, 21);\n            this.cbSlot4.TabIndex = 23;\n            this.cbSlot4.ToolTip = null;\n            this.cbSlot4.DropDownClosed += new System.EventHandler(this.cbSlotN_DropDownClosed);\n            // \n            // cbSlot3\n            // \n            this.cbSlot3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSlot3.Cursor = System.Windows.Forms.Cursors.Default;\n            this.cbSlot3.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;\n            this.cbSlot3.DropDownHeight = 1;\n            this.cbSlot3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSlot3.FormattingEnabled = true;\n            this.cbSlot3.IntegralHeight = false;\n            this.cbSlot3.Location = new System.Drawing.Point(70, 312);\n            this.cbSlot3.Name = \"cbSlot3\";\n            this.cbSlot3.Size = new System.Drawing.Size(464, 21);\n            this.cbSlot3.TabIndex = 22;\n            this.cbSlot3.ToolTip = null;\n            this.cbSlot3.DropDownClosed += new System.EventHandler(this.cbSlotN_DropDownClosed);\n            // \n            // cbSlot2\n            // \n            this.cbSlot2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSlot2.Cursor = System.Windows.Forms.Cursors.Default;\n            this.cbSlot2.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;\n            this.cbSlot2.DropDownHeight = 1;\n            this.cbSlot2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSlot2.FormattingEnabled = true;\n            this.cbSlot2.IntegralHeight = false;\n            this.cbSlot2.Location = new System.Drawing.Point(70, 285);\n            this.cbSlot2.Name = \"cbSlot2\";\n            this.cbSlot2.Size = new System.Drawing.Size(464, 21);\n            this.cbSlot2.TabIndex = 21;\n            this.cbSlot2.ToolTip = null;\n            this.cbSlot2.DropDownClosed += new System.EventHandler(this.cbSlotN_DropDownClosed);\n            // \n            // cbSlot1\n            // \n            this.cbSlot1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSlot1.Cursor = System.Windows.Forms.Cursors.Default;\n            this.cbSlot1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;\n            this.cbSlot1.DropDownHeight = 1;\n            this.cbSlot1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSlot1.FormattingEnabled = true;\n            this.cbSlot1.IntegralHeight = false;\n            this.cbSlot1.Location = new System.Drawing.Point(70, 258);\n            this.cbSlot1.Name = \"cbSlot1\";\n            this.cbSlot1.Size = new System.Drawing.Size(464, 21);\n            this.cbSlot1.TabIndex = 20;\n            this.cbSlot1.ToolTip = null;\n            this.cbSlot1.DropDownClosed += new System.EventHandler(this.cbSlotN_DropDownClosed);\n            // \n            // label8\n            // \n            this.label8.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.label8.AutoSize = true;\n            this.label8.Location = new System.Drawing.Point(14, 504);\n            this.label8.Name = \"label8\";\n            this.label8.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0);\n            this.label8.Size = new System.Drawing.Size(43, 13);\n            this.label8.TabIndex = 19;\n            this.label8.Text = \"Slot 10\";\n            // \n            // label7\n            // \n            this.label7.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.label7.AutoSize = true;\n            this.label7.Location = new System.Drawing.Point(14, 477);\n            this.label7.Name = \"label7\";\n            this.label7.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0);\n            this.label7.Size = new System.Drawing.Size(37, 13);\n            this.label7.TabIndex = 18;\n            this.label7.Text = \"Slot 9\";\n            // \n            // label6\n            // \n            this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.label6.AutoSize = true;\n            this.label6.Location = new System.Drawing.Point(14, 450);\n            this.label6.Name = \"label6\";\n            this.label6.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0);\n            this.label6.Size = new System.Drawing.Size(37, 13);\n            this.label6.TabIndex = 17;\n            this.label6.Text = \"Slot 8\";\n            // \n            // label5\n            // \n            this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.label5.AutoSize = true;\n            this.label5.Location = new System.Drawing.Point(14, 423);\n            this.label5.Name = \"label5\";\n            this.label5.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0);\n            this.label5.Size = new System.Drawing.Size(37, 13);\n            this.label5.TabIndex = 16;\n            this.label5.Text = \"Slot 7\";\n            // \n            // label4\n            // \n            this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(14, 396);\n            this.label4.Name = \"label4\";\n            this.label4.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0);\n            this.label4.Size = new System.Drawing.Size(37, 13);\n            this.label4.TabIndex = 15;\n            this.label4.Text = \"Slot 6\";\n            // \n            // label3\n            // \n            this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(14, 369);\n            this.label3.Name = \"label3\";\n            this.label3.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0);\n            this.label3.Size = new System.Drawing.Size(37, 13);\n            this.label3.TabIndex = 14;\n            this.label3.Text = \"Slot 5\";\n            // \n            // label2\n            // \n            this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(14, 342);\n            this.label2.Name = \"label2\";\n            this.label2.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0);\n            this.label2.Size = new System.Drawing.Size(37, 13);\n            this.label2.TabIndex = 13;\n            this.label2.Text = \"Slot 4\";\n            // \n            // label1\n            // \n            this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(14, 315);\n            this.label1.Name = \"label1\";\n            this.label1.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0);\n            this.label1.Size = new System.Drawing.Size(37, 13);\n            this.label1.TabIndex = 12;\n            this.label1.Text = \"Slot 3\";\n            // \n            // lblImplant2\n            // \n            this.lblImplant2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblImplant2.AutoSize = true;\n            this.lblImplant2.Location = new System.Drawing.Point(14, 288);\n            this.lblImplant2.Name = \"lblImplant2\";\n            this.lblImplant2.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0);\n            this.lblImplant2.Size = new System.Drawing.Size(37, 13);\n            this.lblImplant2.TabIndex = 11;\n            this.lblImplant2.Text = \"Slot 2\";\n            // \n            // lblImplant1\n            // \n            this.lblImplant1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblImplant1.AutoSize = true;\n            this.lblImplant1.Location = new System.Drawing.Point(14, 262);\n            this.lblImplant1.Name = \"lblImplant1\";\n            this.lblImplant1.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0);\n            this.lblImplant1.Size = new System.Drawing.Size(37, 13);\n            this.lblImplant1.TabIndex = 10;\n            this.lblImplant1.Text = \"Slot 1\";\n            // \n            // setsGrid\n            // \n            this.setsGrid.AllowUserToResizeColumns = false;\n            this.setsGrid.AllowUserToResizeRows = false;\n            this.setsGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.setsGrid.BackgroundColor = System.Drawing.SystemColors.ControlLight;\n            this.setsGrid.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.setsGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;\n            this.setsGrid.ColumnHeadersVisible = false;\n            this.setsGrid.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {\n            this.NameColumn});\n            this.setsGrid.Location = new System.Drawing.Point(15, 35);\n            this.setsGrid.MultiSelect = false;\n            this.setsGrid.Name = \"setsGrid\";\n            this.setsGrid.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None;\n            this.setsGrid.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;\n            this.setsGrid.ShowEditingIcon = false;\n            this.setsGrid.Size = new System.Drawing.Size(519, 131);\n            this.setsGrid.TabIndex = 8;\n            // \n            // NameColumn\n            // \n            this.NameColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;\n            this.NameColumn.HeaderText = \"Name\";\n            this.NameColumn.Name = \"NameColumn\";\n            // \n            // ImplantSetsLabel\n            // \n            this.ImplantSetsLabel.AutoSize = true;\n            this.ImplantSetsLabel.ForeColor = System.Drawing.SystemColors.Highlight;\n            this.ImplantSetsLabel.Location = new System.Drawing.Point(13, 13);\n            this.ImplantSetsLabel.Name = \"ImplantSetsLabel\";\n            this.ImplantSetsLabel.Size = new System.Drawing.Size(68, 13);\n            this.ImplantSetsLabel.TabIndex = 9;\n            this.ImplantSetsLabel.Text = \"Implants sets\";\n            // \n            // ImplantsLabel\n            // \n            this.ImplantsLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.ImplantsLabel.AutoSize = true;\n            this.ImplantsLabel.ForeColor = System.Drawing.SystemColors.Highlight;\n            this.ImplantsLabel.Location = new System.Drawing.Point(13, 227);\n            this.ImplantsLabel.Name = \"ImplantsLabel\";\n            this.ImplantsLabel.Size = new System.Drawing.Size(46, 13);\n            this.ImplantsLabel.TabIndex = 10;\n            this.ImplantsLabel.Text = \"Implants\";\n            // \n            // deleteRowInfo\n            // \n            this.deleteRowInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.deleteRowInfo.AutoSize = true;\n            this.deleteRowInfo.ForeColor = System.Drawing.SystemColors.Highlight;\n            this.deleteRowInfo.Location = new System.Drawing.Point(14, 169);\n            this.deleteRowInfo.Name = \"deleteRowInfo\";\n            this.deleteRowInfo.Size = new System.Drawing.Size(361, 13);\n            this.deleteRowInfo.TabIndex = 30;\n            this.deleteRowInfo.Text = \"* to delete a custom set select it and press the \\\"Del\\\" key on your keyboard.\";\n            // \n            // ImplantSetsWindow\n            // \n            this.AcceptButton = this.btnOK;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.SystemColors.ControlLightLight;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(546, 568);\n            this.Controls.Add(this.deleteRowInfo);\n            this.Controls.Add(this.btnOK);\n            this.Controls.Add(this.btnCancel);\n            this.Controls.Add(this.cbSlot10);\n            this.Controls.Add(this.ImplantsLabel);\n            this.Controls.Add(this.cbSlot9);\n            this.Controls.Add(this.ImplantSetsLabel);\n            this.Controls.Add(this.cbSlot8);\n            this.Controls.Add(this.setsGrid);\n            this.Controls.Add(this.cbSlot7);\n            this.Controls.Add(this.cbSlot6);\n            this.Controls.Add(this.cbSlot5);\n            this.Controls.Add(this.headerLabel);\n            this.Controls.Add(this.cbSlot4);\n            this.Controls.Add(this.lblImplant1);\n            this.Controls.Add(this.cbSlot3);\n            this.Controls.Add(this.lblImplant2);\n            this.Controls.Add(this.cbSlot2);\n            this.Controls.Add(this.label1);\n            this.Controls.Add(this.cbSlot1);\n            this.Controls.Add(this.label2);\n            this.Controls.Add(this.label8);\n            this.Controls.Add(this.label3);\n            this.Controls.Add(this.label7);\n            this.Controls.Add(this.label4);\n            this.Controls.Add(this.label6);\n            this.Controls.Add(this.label5);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.Name = \"ImplantSetsWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\n            this.Tag = \"Jump Clone\";\n            this.Text = \"Jump Clones\";\n            this.Load += new System.EventHandler(this.ImpGroups_Load);\n            ((System.ComponentModel.ISupportInitialize)(this.setsGrid)).EndInit();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n        #endregion\n\n        private System.Windows.Forms.Label headerLabel;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.Label lblImplant1;\n        private System.Windows.Forms.Label lblImplant2;\n        private System.Windows.Forms.Label label8;\n        private System.Windows.Forms.Label label7;\n        private System.Windows.Forms.Label label6;\n        private System.Windows.Forms.Label label5;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Label label1;\n        private DropDownMouseMoveComboBox cbSlot10;\n        private DropDownMouseMoveComboBox cbSlot9;\n        private DropDownMouseMoveComboBox cbSlot8;\n        private DropDownMouseMoveComboBox cbSlot7;\n        private DropDownMouseMoveComboBox cbSlot6;\n        private DropDownMouseMoveComboBox cbSlot5;\n        private DropDownMouseMoveComboBox cbSlot4;\n        private DropDownMouseMoveComboBox cbSlot3;\n        private DropDownMouseMoveComboBox cbSlot2;\n        private DropDownMouseMoveComboBox cbSlot1;\n        private IntuitiveDataGridView setsGrid;\n        private System.Windows.Forms.DataGridViewTextBoxColumn NameColumn;\n        private System.Windows.Forms.Label ImplantSetsLabel;\n        private System.Windows.Forms.Label ImplantsLabel;\n        private System.Windows.Forms.Label deleteRowInfo;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/ImplantControls/ImplantSetsWindow.cs",
    "content": "using EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Settings;\nusing System;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace EVEMon.ImplantControls\n{\n    /// <summary>\n    /// This is the implant groups UI\n    /// </summary>\n    public sealed partial class ImplantSetsWindow : EVEMonForm\n    {\n        private const string PhantomSetName = \"<New set>\";\n\n        private readonly long m_maxJumpClones;\n        private readonly Character m_character;\n        private readonly SerializableImplantSetCollection m_sets;\n\n        /// <summary>\n        /// Labels are substituted to comboboxes for read-only sets. It's because comboboxes cannot be readonly, only disabled. \n        /// But, then, they don't fire mouse events.\n        /// </summary>\n        private readonly Label[] m_labels = new Label[10];\n\n        /// <summary>\n        /// Default constructor for designer\n        /// </summary>\n        private ImplantSetsWindow()\n        {\n            InitializeComponent();\n            ImplantSetsLabel.Font = FontFactory.GetFont(\"Tahoma\", 12F);\n            ImplantsLabel.Font = FontFactory.GetFont(\"Tahoma\", 12F);\n            RememberPositionKey = \"ImplantSetsWindow\";\n        }\n\n        /// <summary>\n        /// Constructor used in code.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">character</exception>\n        public ImplantSetsWindow(Character character)\n            : this()\n        {\n            character.ThrowIfNull(nameof(character));\n\n            m_character = character;\n            m_sets = character.ImplantSets.Export();\n            m_maxJumpClones = character.Skills[DBConstants.InfomorphPsychologySkillID].Level +\n                              character.Skills[DBConstants.AdvancedInfomorphPsychologySkillID].Level;\n        }\n\n        /// <summary>\n        /// On load, fill up the controls.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void ImpGroups_Load(object sender, EventArgs e)\n        {\n            // Header\n            headerLabel.Text = string.Format(Properties.Resources.MessageJumpCloneSkills,\n                m_character, m_maxJumpClones);\n\n            // Populate implants combo boxes\n            foreach (Control control in Controls)\n            {\n                AddComboBoxAndLabel(control);\n            }\n\n            // Adds the labels\n            for (int i = 0; i < 10; i++)\n            {\n                Controls.Add(m_labels[i]);\n            }\n\n            // Sets the grid rows\n            setsGrid.Rows.Clear();\n            AddRow(m_sets.ActiveClone);\n            foreach (SerializableSettingsImplantSet set in m_sets.JumpClones)\n            {\n                AddRow(set);\n            }\n            foreach (SerializableSettingsImplantSet set in m_sets.CustomSets)\n            {\n                AddRow(set);\n            }\n\n            for (var i = 0; i <= m_sets.JumpClones.Count; i++)\n            {\n                setsGrid.Rows[i].ReadOnly = true;\n                setsGrid.Rows[i].Cells[0].Style.ForeColor = SystemColors.GrayText;\n            }\n\n            setsGrid.Rows[0].Selected = true;\n\n            // Update the texts\n            UpdateSlots();\n\n            // Subscribe events\n            setsGrid.AllowUserToDeleteRows = false;\n            setsGrid.CellValidating += setsGrid_CellValidating;\n            setsGrid.RowsRemoved += setsGrid_RowsRemoved;\n            setsGrid.SelectionChanged += setsGrid_SelectionChanged;\n            setsGrid.CellBeginEdit += setsGrid_CellBeginEdit;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            setsGrid.CellValidating -= setsGrid_CellValidating;\n            setsGrid.RowsRemoved -= setsGrid_RowsRemoved;\n            setsGrid.SelectionChanged -= setsGrid_SelectionChanged;\n            setsGrid.CellBeginEdit -= setsGrid_CellBeginEdit;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// On close, closes the tooltip.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnClosed(EventArgs e)\n        {\n            base.OnClosed(e);\n\n            m_fakeToolTip.Close();\n            m_fakeToolTip = null;\n        }\n\n        /// <summary>\n        /// Adds the combo box and label.\n        /// </summary>\n        /// <param name=\"control\">The control.</param>\n        private void AddComboBoxAndLabel(IDisposable control)\n        {\n            DropDownMouseMoveComboBox combo = control as DropDownMouseMoveComboBox;\n            if (combo == null)\n                return;\n\n            int slotIndex;\n            if (!combo.Name.Replace(\"cbSlot\", string.Empty).TryParseInv(out slotIndex) ||\n                    slotIndex < 1)\n                return;\n            ImplantSlots slot = (ImplantSlots)(slotIndex - 1);\n\n            combo.Tag = slot;\n            combo.MouseMove += combo_MouseMove;\n            combo.DropDownClosed += combo_DropDownClosed;\n            combo.DropDownMouseMove += combo_DropDownMouseMove;\n            foreach (Implant implant in StaticItems.GetImplants(slot))\n            {\n                combo.Items.Add(implant);\n            }\n\n            Label tempLabel = null;\n            try\n            {\n                tempLabel = new Label();\n                tempLabel.MouseMove += label_MouseMove;\n                tempLabel.AutoSize = false;\n                tempLabel.Anchor = combo.Anchor;\n                tempLabel.Bounds = combo.Bounds;\n                tempLabel.TextAlign = ContentAlignment.MiddleLeft;\n\n                Label label = tempLabel;\n                tempLabel = null;\n\n                m_labels[(int)slot] = label;\n            }\n            finally\n            {\n                tempLabel?.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Adds the row for the given set.\n        /// </summary>\n        /// <param name=\"set\"></param>\n        private void AddRow(SerializableSettingsImplantSet set)\n        {\n            DataGridViewRow tempRow = null;\n            try\n            {\n                tempRow = new DataGridViewRow();\n                tempRow.CreateCells(setsGrid, set.Name);\n                tempRow.Tag = set;\n\n                DataGridViewRow row = tempRow;\n                tempRow = null;\n\n                setsGrid.Rows.Add(row);\n            }\n            finally\n            {\n                tempRow?.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Update the comboboxes' selections.\n        /// </summary>\n        private void UpdateSlots()\n        {\n            SerializableSettingsImplantSet set = GetSelectedSet();\n\n            // No set selected or row name empty?\n            if (set == null || string.IsNullOrEmpty(set.Name))\n            {\n                foreach (DropDownMouseMoveComboBox combo in Controls.OfType<DropDownMouseMoveComboBox>())\n                {\n                    // Disable the combo with the <None> implant\n                    combo.SelectedIndex = 0;\n                    combo.Visible = true;\n                    combo.Enabled = false;\n\n                    // Hide the label used for read-only sets\n                    ImplantSlots slot = (ImplantSlots)combo.Tag;\n                    Label label = m_labels[(int)slot];\n                    label.Visible = false;\n                }\n                return;\n            }\n\n            // Scroll through comboboxes\n            bool isReadOnly = set == m_sets.ActiveClone || m_sets.JumpClones.Any(x => x == set);\n            foreach (DropDownMouseMoveComboBox combo in Controls.OfType<DropDownMouseMoveComboBox>())\n            {\n                // Enable the combo with the <None> implant\n                combo.SelectedIndex = 0;\n                combo.Visible = !isReadOnly;\n                combo.Enabled = true;\n\n                ImplantSlots slot = (ImplantSlots)combo.Tag;\n                Implant selectedImplant = GetImplant(set, slot);\n\n                // Scroll through every implant and check whether it is the selected one.\n                int index = 0;\n                foreach (Implant implant in combo.Items)\n                {\n                    if (implant == selectedImplant)\n                    {\n                        combo.SelectedIndex = index;\n                        break;\n                    }\n                    index++;\n                }\n\n                // Set \"none\" when the implant was not found.\n                if (index == combo.Items.Count)\n                    combo.SelectedIndex = 0;\n\n                // Updates the label displayed for read-only sets.\n                Label label = m_labels[(int)slot];\n                label.Visible = isReadOnly;\n                label.Text = selectedImplant.Name;\n                label.Tag = selectedImplant;\n            }\n        }\n\n\n        #region Helper getters and setters\n\n        /// <summary>\n        /// Gets the selected implant slot\n        /// </summary>\n        private SerializableSettingsImplantSet GetSelectedSet() => setsGrid.SelectedRows.Count == 0 ? null : (SerializableSettingsImplantSet)setsGrid.SelectedRows[0].Tag;\n\n        /// <summary>\n        /// Gets the implant name for the given slot and the provided set.\n        /// </summary>\n        /// <param name=\"set\"></param>\n        /// <param name=\"slot\"></param>\n        /// <returns></returns>\n        private static Implant GetImplant(SerializableSettingsImplantSet set, ImplantSlots slot)\n        {\n            // Invoke the property getter with the matching name through reflection\n            object implantName = typeof(SerializableSettingsImplantSet).GetProperty(slot.ToString()).GetValue(set, null);\n\n            return StaticItems.GetImplants(slot)[(string)implantName];\n        }\n\n        /// <summary>\n        /// Sets the implant name for the given slot and the provided set.\n        /// </summary>\n        /// <param name=\"set\"></param>\n        /// <param name=\"slot\"></param>\n        /// <param name=\"implant\"></param>\n        /// <returns></returns>\n        private static void SetImplant(SerializableSettingsImplantSet set, ImplantSlots slot, Implant implant)\n        {\n            // Set may be null when the user is editing the phantom line\n            if (set == null)\n                return;\n\n            // Invoke the property setter with the matching name through reflection\n            typeof(SerializableSettingsImplantSet).GetProperty(slot.ToString()).SetValue(set, implant.Name, null);\n        }\n\n        #endregion\n\n\n        #region Reaction to controls events\n\n        /// <summary>\n        /// Ensures we display &lt;New set&gt; when we begin a new row.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void setsGrid_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)\n        {\n            // If cell is empty, replaces the content by <New set>\n            DataGridViewRow row = setsGrid.Rows[e.RowIndex];\n            object formattedValue = row.Cells[0].FormattedValue;\n            if (formattedValue != null && row.Tag == null && string.IsNullOrEmpty(formattedValue.ToString()))\n                row.Cells[0].Value = PhantomSetName;\n        }\n\n        /// <summary>\n        /// When the selection changes, we update the controls.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void setsGrid_SelectionChanged(object sender, EventArgs e)\n        {\n            // Enable/disable the top buttons\n            if (setsGrid.SelectedRows.Count > 0)\n                setsGrid.AllowUserToDeleteRows = setsGrid.SelectedRows[0].Index >= m_sets.JumpClones.Count + 1;\n\n            UpdateSlots();\n        }\n\n        /// <summary>\n        /// When a cell value changes, we replace the new name.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void setsGrid_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)\n        {\n            DataGridViewRow row = setsGrid.Rows[e.RowIndex];\n            string text = e.FormattedValue?.ToString() ?? string.Empty;\n\n            // If the user forgets the edition and there is no bound set\n            // or the given name exceeds 255 characters\n            // or the name is empty,\n            // we replace <New set> by an empty value\n            if ((row.Tag == null && text == PhantomSetName) ||\n                text.Length > EveMonConstants.ImplantSetNameMaxLength ||\n                string.IsNullOrWhiteSpace(text))\n            {\n                row.Cells[0].Value = string.Empty;\n                return;\n            }\n\n            // Updates the set's name\n            EnsureRowSetInitialized(row);\n            if (row.Tag == null)\n                return;\n\n            SerializableSettingsImplantSet set = (SerializableSettingsImplantSet)row.Tag;\n            if (e.FormattedValue != null)\n                set.Name = e.FormattedValue.ToString();\n        }\n\n        /// <summary>\n        /// When a row is removed, remove the matching set.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void setsGrid_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)\n        {\n            int index = e.RowIndex - 1 - m_sets.JumpClones.Count;\n            if (index >= 0)\n                m_sets.CustomSets.RemoveAt(index);\n        }\n\n        /// <summary>\n        /// When the selection changes, we change the implant\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbSlotN_DropDownClosed(object sender, EventArgs e)\n        {\n            if (setsGrid.SelectedRows.Count != 0)\n                EnsureRowSetInitialized(setsGrid.SelectedRows[0]);\n\n            DropDownMouseMoveComboBox combo = (DropDownMouseMoveComboBox)sender;\n            ImplantSlots slot = (ImplantSlots)combo.Tag;\n            SetImplant(GetSelectedSet(), slot, (Implant)combo.SelectedItem);\n        }\n\n        /// <summary>\n        /// On cancel, nothing special.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            Close();\n        }\n\n        /// <summary>\n        /// On OK, let's fetch the serialization object to the real implant sets.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnOK_Click(object sender, EventArgs e)\n        {\n            SerializableSettingsImplantSet set = GetSelectedSet();\n            if (set != null && !string.IsNullOrWhiteSpace(set.Name))\n                m_character.ImplantSets.Import(m_sets);\n\n            Close();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"row\"></param>\n        private void EnsureRowSetInitialized(DataGridViewRow row)\n        {\n            if (row.Tag != null)\n                return;\n            object formattedValue = row.Cells[0].FormattedValue;\n            if (formattedValue != null)\n                row.Tag = new SerializableSettingsImplantSet { Name = formattedValue.ToString() };\n            m_sets.CustomSets.Add((SerializableSettingsImplantSet)row.Tag);\n        }\n\n        #endregion\n\n\n        #region Tooltips management\n\n        private ImplantTooltip m_fakeToolTip = new ImplantTooltip();\n\n        /// <summary>\n        /// When the combo box's dropdown is closed, we hide the implant.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void combo_DropDownClosed(object sender, EventArgs e)\n        {\n            m_fakeToolTip.Hide();\n        }\n\n        /// <summary>\n        /// When the mouse moves over the implants labels (used for read-only sets), we display a tooltip.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void label_MouseMove(object sender, MouseEventArgs e)\n        {\n            Label label = (Label)sender;\n            Implant implant = label.Tag as Implant;\n            if (implant == null)\n                return;\n\n            Point point = e.Location;\n            point.Y += 10;\n\n            m_fakeToolTip.Location = label.PointToScreen(point);\n            m_fakeToolTip.Implant = implant;\n            m_fakeToolTip.ShowInactiveTopmost();\n        }\n\n        /// <summary>\n        /// When the mouse moves over the implants combos (used for writable sets), we display a tooltip on the right of the combo.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void combo_MouseMove(object sender, MouseEventArgs e)\n        {\n            DropDownMouseMoveComboBox combo = (DropDownMouseMoveComboBox)sender;\n            Implant implant = combo.SelectedItem as Implant;\n            if (implant == null)\n                return;\n\n            if (m_fakeToolTip.Visible && m_fakeToolTip.Implant == implant)\n                return;\n\n            Point point = new Point { X = combo.Width + 5, Y = 1 };\n\n            m_fakeToolTip.Location = combo.PointToScreen(point);\n            m_fakeToolTip.Implant = implant;\n            m_fakeToolTip.ShowInactiveTopmost();\n        }\n\n        /// <summary>\n        /// When the mouse moves over one of the items of the combobox dropdown, we display a tooltip on the right of the dropdown.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"DropDownMouseMoveEventArgs\"/> instance containing the event data.</param>\n        private void combo_DropDownMouseMove(object sender, DropDownMouseMoveEventArgs e)\n        {\n            Implant implant = e.Item as Implant;\n            if (implant == null)\n                return;\n\n            Control control = (Control)sender;\n            Point point = new Point(control.ClientRectangle.Right + 20, control.ClientRectangle.Top);\n\n            m_fakeToolTip.Location = control.PointToScreen(point);\n            m_fakeToolTip.Implant = implant;\n            m_fakeToolTip.ShowInactiveTopmost();\n        }\n\n        /// <summary>\n        /// When the mouse moves over this window, then it left the comboboxes and labels, so we hide the tooltip.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnMouseMove(MouseEventArgs e)\n        {\n            base.OnMouseMove(e);\n\n            m_fakeToolTip.Hide();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/ImplantControls/ImplantSetsWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"NameColumn.UserAddedColumn\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/ImplantControls/ImplantTooltip.Designer.cs",
    "content": "﻿namespace EVEMon.ImplantControls\n{\n    partial class ImplantTooltip\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.SuspendLayout();\n            // \n            // ImplantTooltip\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.SystemColors.Info;\n            this.ClientSize = new System.Drawing.Size(353, 228);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;\n            this.MinimumSize = new System.Drawing.Size(200, 0);\n            this.Name = \"ImplantTooltip\";\n            this.Text = \"FakeTooltip\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n\n    }\n}"
  },
  {
    "path": "src/EVEMon/ImplantControls/ImplantTooltip.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Factories;\n\nnamespace EVEMon.ImplantControls\n{\n    /// <summary>\n    /// A tooltip used to display the details of an implant.\n    /// </summary>\n    public partial class ImplantTooltip : Form\n    {\n        private const TextFormatFlags TooltipFlags =\n            TextFormatFlags.WordBreak | TextFormatFlags.Left | TextFormatFlags.EndEllipsis;\n\n        private Implant m_implant;\n        private readonly Font m_toolTipFont = FontFactory.GetFont(\"Tahoma\", 8.25f);\n        private readonly Font m_titleFont = FontFactory.GetFont(\"Tahoma\", 9.75f, FontStyle.Bold);\n        private const int ToolTipMargin = 5;\n        private const int InnerMargin = 10;\n        private const int MaxWidth = 250;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public ImplantTooltip()\n        {\n            InitializeComponent();\n            ShowInTaskbar = false;\n            TopMost = true;\n        }\n\n        /// <summary>\n        /// Gets or sets the represented implant.\n        /// </summary>\n        public Implant Implant\n        {\n            get { return m_implant; }\n            set\n            {\n                if (m_implant == value)\n                    return;\n                m_implant = value;\n                OnImplantChanged();\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// When an implant changes, we computes the required size.\n        /// </summary>\n        private void OnImplantChanged()\n        {\n            Size proposedSize = new Size(MaxWidth, 1000);\n            Size titleSize = TextRenderer.MeasureText(m_implant.Name, m_titleFont, proposedSize);\n\n            proposedSize = new Size(Math.Max(titleSize.Width, MaxWidth) + ToolTipMargin * 2, 1000);\n            Size size = TextRenderer.MeasureText(m_implant.Description, m_toolTipFont, proposedSize, TooltipFlags);\n            size.Height += titleSize.Height + InnerMargin + ToolTipMargin * 2;\n            size.Width = Math.Max(size.Width, proposedSize.Width);\n\n            Size = size;\n        }\n\n        /// <summary>\n        /// Performs the painting.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            // Background\n            using (SolidBrush brush = new SolidBrush(BackColor))\n            {\n                e.Graphics.FillRectangle(brush, DisplayRectangle);\n            }\n\n            // Border\n            using (Pen pen = new Pen(SystemBrushes.WindowFrame))\n            {\n                Rectangle borderRect = new Rectangle(0, 0, DisplayRectangle.Width - 1, DisplayRectangle.Height - 1);\n                e.Graphics.DrawRectangle(pen, borderRect);\n            }\n\n            // Title\n            Size titleSize = new Size(Width - ToolTipMargin * 2, 1000);\n            titleSize = TextRenderer.MeasureText(m_implant.Name, m_titleFont, titleSize);\n            TextRenderer.DrawText(e.Graphics, m_implant.Name, m_titleFont,\n                                  new Point(ToolTipMargin, ToolTipMargin), SystemColors.ControlText, TooltipFlags);\n\n            // Content\n            int top = ToolTipMargin + titleSize.Height + InnerMargin;\n            Rectangle rect = new Rectangle(ToolTipMargin, top, Width - 2 * ToolTipMargin, Height - (top + ToolTipMargin));\n            TextRenderer.DrawText(e.Graphics, m_implant.Description, m_toolTipFont, rect, SystemColors.ControlText, TooltipFlags);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/ImplantControls/ImplantTooltip.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/MainWindow.Designer.cs",
    "content": "﻿\nnamespace EVEMon\n{\n    partial class MainWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n\t\t\tthis.components = new System.ComponentModel.Container();\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainWindow));\n\t\t\tthis.trayIconContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);\n\t\t\tthis.planToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.plansStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.testTrayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.trayTestNotificationTSMI = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.trayTestCharacterNotificationTSMI = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.testsToolStripSeperator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.restoreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.statusStrip = new System.Windows.Forms.StatusStrip();\n\t\t\tthis.lblTraining = new System.Windows.Forms.ToolStripStatusLabel();\n\t\t\tthis.lblStatus = new System.Windows.Forms.ToolStripStatusLabel();\n\t\t\tthis.lblServerStatus = new System.Windows.Forms.ToolStripStatusLabel();\n\t\t\tthis.toolStripStatusSpacerLabel = new System.Windows.Forms.ToolStripStatusLabel();\n\t\t\tthis.lblCSSProviderStatus = new System.Windows.Forms.ToolStripStatusLabel();\n\t\t\tthis.tsDatafilesLoadingProgressBar = new System.Windows.Forms.ToolStripProgressBar();\n\t\t\tthis.saveFileDialog = new System.Windows.Forms.SaveFileDialog();\n\t\t\tthis.openFileDialog = new System.Windows.Forms.OpenFileDialog();\n\t\t\tthis.mainMenuBar = new System.Windows.Forms.MenuStrip();\n\t\t\tthis.toolbarContext = new System.Windows.Forms.ContextMenuStrip(this.components);\n\t\t\tthis.menubarToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.toolbarToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.addAPIKeyMenu = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.manageAPIKeysMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.fileManagerHideToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.deleteCharacterMenu = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.exportCharacterMenu = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.hideCharacterMenu = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.fileExportSaveToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.loadSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.saveSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.resetSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.fileRestoreResetToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.clearCacheToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.fileResetExitToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.copySkillsToClipboardBBFormatToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.plansToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.tsmiNewPlan = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.tsmiCreatePlanFromSkillQueue = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.tsmiImportPlanFromFile = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.tsmiManagePlans = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.plansSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.charactersComparisonMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.blankCreatorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.dataBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.skillBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.certificateBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.shipBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.itemBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.blueprintBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.skillsPieChartMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.firstSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.implantsMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.showOwnedSkillbooksMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.secondSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.forumsMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.issuesFeaturesMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.readTheDocsManualToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.helpAboutKnownProblemsToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.aboutMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.testsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.exceptionWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.exceptionWindowRecursiveExceptionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.testNotificationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.testCharacterNotificationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.testTimeoutOneSecToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.restartToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.mainToolBar = new System.Windows.Forms.ToolStrip();\n\t\t\tthis.addAPIKeyTbMenu = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.apiKeysManagementTbMenu = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.apiKeysSettingsToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.manageCharacterTbMenu = new System.Windows.Forms.ToolStripDropDownButton();\n\t\t\tthis.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.manageCharacterToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.tsdbSettings = new System.Windows.Forms.ToolStripDropDownButton();\n\t\t\tthis.tsLoadSettings = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.tsSaveSettings = new System.Windows.Forms.ToolStripMenuItem();\n\t\t\tthis.settingsToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.clearCacheToolStripButton = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.resetSettingsToolStripButton = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.cacheResetToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.exitToolStripButton = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.exitToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.tsbManagePlans = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.plansTbMenu = new System.Windows.Forms.ToolStripDropDownButton();\n\t\t\tthis.plansToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.characterComparisonToolStripButton = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.tsbMineralSheet = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.skillsPieChartTbMenu = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.tsbSchedule = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.tsbImplantGroups = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.tsbShowOwned = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.toolsToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n\t\t\tthis.tsbOptions = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.tsbAbout = new System.Windows.Forms.ToolStripButton();\n\t\t\tthis.niAlertIcon = new System.Windows.Forms.NotifyIcon(this.components);\n\t\t\tthis.ofdOpenDialog = new System.Windows.Forms.OpenFileDialog();\n\t\t\tthis.tcCharacterTabs = new EVEMon.Common.Controls.DraggableTabControl();\n\t\t\tthis.tpOverview = new System.Windows.Forms.TabPage();\n\t\t\tthis.overview = new EVEMon.Controls.Overview();\n\t\t\tthis.trayIcon = new EVEMon.Common.Controls.TrayIcon(this.components);\n\t\t\tthis.tabLoadingLabel = new System.Windows.Forms.Label();\n\t\t\tthis.noCharactersLabel = new System.Windows.Forms.Label();\n\t\t\tthis.mainLoadingThrobber = new EVEMon.Common.Controls.Throbber();\n\t\t\tthis.notificationList = new EVEMon.Controls.NotificationList();\n\t\t\tthis.trayIconContextMenuStrip.SuspendLayout();\n\t\t\tthis.statusStrip.SuspendLayout();\n\t\t\tthis.mainMenuBar.SuspendLayout();\n\t\t\tthis.toolbarContext.SuspendLayout();\n\t\t\tthis.mainToolBar.SuspendLayout();\n\t\t\tthis.tcCharacterTabs.SuspendLayout();\n\t\t\tthis.tpOverview.SuspendLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.mainLoadingThrobber)).BeginInit();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// trayIconContextMenuStrip\n\t\t\t// \n\t\t\tthis.trayIconContextMenuStrip.ImageScalingSize = new System.Drawing.Size(24, 24);\n\t\t\tthis.trayIconContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.planToolStripMenuItem,\n            this.plansStripSeparator,\n            this.testTrayToolStripMenuItem,\n            this.testsToolStripSeperator,\n            this.restoreToolStripMenuItem,\n            this.closeToolStripMenuItem});\n\t\t\tthis.trayIconContextMenuStrip.Name = \"trayIconContextMenuStrip\";\n\t\t\tthis.trayIconContextMenuStrip.Size = new System.Drawing.Size(114, 104);\n\t\t\tthis.trayIconContextMenuStrip.Closed += new System.Windows.Forms.ToolStripDropDownClosedEventHandler(this.trayIconToolStrip_Closed);\n\t\t\tthis.trayIconContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.trayIconToolStrip_Opening);\n\t\t\t// \n\t\t\t// planToolStripMenuItem\n\t\t\t// \n\t\t\tthis.planToolStripMenuItem.Name = \"planToolStripMenuItem\";\n\t\t\tthis.planToolStripMenuItem.Size = new System.Drawing.Size(113, 22);\n\t\t\tthis.planToolStripMenuItem.Text = \"Plans\";\n\t\t\t// \n\t\t\t// plansStripSeparator\n\t\t\t// \n\t\t\tthis.plansStripSeparator.Name = \"plansStripSeparator\";\n\t\t\tthis.plansStripSeparator.Size = new System.Drawing.Size(110, 6);\n\t\t\t// \n\t\t\t// testTrayToolStripMenuItem\n\t\t\t// \n\t\t\tthis.testTrayToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.trayTestNotificationTSMI,\n            this.trayTestCharacterNotificationTSMI});\n\t\t\tthis.testTrayToolStripMenuItem.Name = \"testTrayToolStripMenuItem\";\n\t\t\tthis.testTrayToolStripMenuItem.Size = new System.Drawing.Size(113, 22);\n\t\t\tthis.testTrayToolStripMenuItem.Text = \"Test\";\n\t\t\tthis.testTrayToolStripMenuItem.Visible = false;\n\t\t\t// \n\t\t\t// trayTestNotificationTSMI\n\t\t\t// \n\t\t\tthis.trayTestNotificationTSMI.Name = \"trayTestNotificationTSMI\";\n\t\t\tthis.trayTestNotificationTSMI.Size = new System.Drawing.Size(191, 22);\n\t\t\tthis.trayTestNotificationTSMI.Text = \"Notification\";\n\t\t\tthis.trayTestNotificationTSMI.Click += new System.EventHandler(this.testNotificationToolstripMenuItem_Click);\n\t\t\t// \n\t\t\t// trayTestCharacterNotificationTSMI\n\t\t\t// \n\t\t\tthis.trayTestCharacterNotificationTSMI.Name = \"trayTestCharacterNotificationTSMI\";\n\t\t\tthis.trayTestCharacterNotificationTSMI.Size = new System.Drawing.Size(191, 22);\n\t\t\tthis.trayTestCharacterNotificationTSMI.Text = \"Character Notification\";\n\t\t\tthis.trayTestCharacterNotificationTSMI.Click += new System.EventHandler(this.testCharacterNotificationToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// testsToolStripSeperator\n\t\t\t// \n\t\t\tthis.testsToolStripSeperator.Name = \"testsToolStripSeperator\";\n\t\t\tthis.testsToolStripSeperator.Size = new System.Drawing.Size(110, 6);\n\t\t\tthis.testsToolStripSeperator.Visible = false;\n\t\t\t// \n\t\t\t// restoreToolStripMenuItem\n\t\t\t// \n\t\t\tthis.restoreToolStripMenuItem.Name = \"restoreToolStripMenuItem\";\n\t\t\tthis.restoreToolStripMenuItem.Size = new System.Drawing.Size(113, 22);\n\t\t\tthis.restoreToolStripMenuItem.Text = \"Restore\";\n\t\t\tthis.restoreToolStripMenuItem.Click += new System.EventHandler(this.restoreToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// closeToolStripMenuItem\n\t\t\t// \n\t\t\tthis.closeToolStripMenuItem.Name = \"closeToolStripMenuItem\";\n\t\t\tthis.closeToolStripMenuItem.Size = new System.Drawing.Size(113, 22);\n\t\t\tthis.closeToolStripMenuItem.Text = \"Close\";\n\t\t\tthis.closeToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// statusStrip\n\t\t\t// \n\t\t\tthis.statusStrip.ImageScalingSize = new System.Drawing.Size(24, 24);\n\t\t\tthis.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.lblTraining,\n            this.lblStatus,\n            this.lblServerStatus,\n            this.toolStripStatusSpacerLabel,\n            this.lblCSSProviderStatus,\n            this.tsDatafilesLoadingProgressBar});\n\t\t\tthis.statusStrip.Location = new System.Drawing.Point(0, 624);\n\t\t\tthis.statusStrip.Name = \"statusStrip\";\n\t\t\tthis.statusStrip.ShowItemToolTips = true;\n\t\t\tthis.statusStrip.Size = new System.Drawing.Size(600, 22);\n\t\t\tthis.statusStrip.TabIndex = 1;\n\t\t\t// \n\t\t\t// lblTraining\n\t\t\t// \n\t\t\tthis.lblTraining.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.lblTraining.Name = \"lblTraining\";\n\t\t\tthis.lblTraining.Size = new System.Drawing.Size(0, 17);\n\t\t\tthis.lblTraining.Text = \"toolStripStatusLabel1\";\n\t\t\t// \n\t\t\t// lblStatus\n\t\t\t// \n\t\t\tthis.lblStatus.Name = \"lblStatus\";\n\t\t\tthis.lblStatus.Size = new System.Drawing.Size(59, 17);\n\t\t\tthis.lblStatus.Text = \"EVE Time:\";\n\t\t\t// \n\t\t\t// lblServerStatus\n\t\t\t// \n\t\t\tthis.lblServerStatus.Name = \"lblServerStatus\";\n\t\t\tthis.lblServerStatus.Size = new System.Drawing.Size(137, 17);\n\t\t\tthis.lblServerStatus.Text = \"|  Server Status Unknown\";\n\t\t\t// \n\t\t\t// toolStripStatusSpacerLabel\n\t\t\t// \n\t\t\tthis.toolStripStatusSpacerLabel.Name = \"toolStripStatusSpacerLabel\";\n\t\t\tthis.toolStripStatusSpacerLabel.Size = new System.Drawing.Size(287, 17);\n\t\t\tthis.toolStripStatusSpacerLabel.Spring = true;\n\t\t\t// \n\t\t\t// lblCSSProviderStatus\n\t\t\t// \n\t\t\tthis.lblCSSProviderStatus.Name = \"lblCSSProviderStatus\";\n\t\t\tthis.lblCSSProviderStatus.Size = new System.Drawing.Size(143, 17);\n\t\t\tthis.lblCSSProviderStatus.Text = \"Uploading to CSSProvider\";\n\t\t\tthis.lblCSSProviderStatus.Visible = false;\n\t\t\t// \n\t\t\t// tsDatafilesLoadingProgressBar\n\t\t\t// \n\t\t\tthis.tsDatafilesLoadingProgressBar.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n\t\t\tthis.tsDatafilesLoadingProgressBar.Name = \"tsDatafilesLoadingProgressBar\";\n\t\t\tthis.tsDatafilesLoadingProgressBar.Size = new System.Drawing.Size(100, 16);\n\t\t\tthis.tsDatafilesLoadingProgressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;\n\t\t\tthis.tsDatafilesLoadingProgressBar.ToolTipText = \"Loading data files\";\n\t\t\t// \n\t\t\t// saveFileDialog\n\t\t\t// \n\t\t\tthis.saveFileDialog.DefaultExt = \"bak\";\n\t\t\tthis.saveFileDialog.FileName = \"settings.xml.bak\";\n\t\t\tthis.saveFileDialog.Filter = \"EVEMon Settings Backup Files (*.bak)|*.bak\";\n\t\t\tthis.saveFileDialog.RestoreDirectory = true;\n\t\t\tthis.saveFileDialog.Title = \"Backup EVEMon settings file\";\n\t\t\t// \n\t\t\t// openFileDialog\n\t\t\t// \n\t\t\tthis.openFileDialog.DefaultExt = \"bak\";\n\t\t\tthis.openFileDialog.FileName = \"settings.xml.bak\";\n\t\t\tthis.openFileDialog.Filter = \"EVEMon Settings Backup Files (*.bak)|*.bak\";\n\t\t\tthis.openFileDialog.RestoreDirectory = true;\n\t\t\tthis.openFileDialog.ShowHelp = true;\n\t\t\tthis.openFileDialog.Title = \"Restore EVEMon settings file\";\n\t\t\t// \n\t\t\t// mainMenuBar\n\t\t\t// \n\t\t\tthis.mainMenuBar.BackColor = System.Drawing.SystemColors.Control;\n\t\t\tthis.mainMenuBar.ContextMenuStrip = this.toolbarContext;\n\t\t\tthis.mainMenuBar.ImageScalingSize = new System.Drawing.Size(24, 24);\n\t\t\tthis.mainMenuBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.fileToolStripMenuItem,\n            this.editToolStripMenuItem,\n            this.plansToolStripMenuItem,\n            this.toolsToolStripMenuItem,\n            this.helpToolStripMenuItem,\n            this.testsToolStripMenuItem});\n\t\t\tthis.mainMenuBar.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.mainMenuBar.Name = \"mainMenuBar\";\n\t\t\tthis.mainMenuBar.Size = new System.Drawing.Size(600, 24);\n\t\t\tthis.mainMenuBar.TabIndex = 3;\n\t\t\tthis.mainMenuBar.Text = \"menuStrip1\";\n\t\t\tthis.mainMenuBar.MouseDown += new System.Windows.Forms.MouseEventHandler(this.mainMenuBar_MouseDown);\n\t\t\tthis.mainMenuBar.MouseMove += new System.Windows.Forms.MouseEventHandler(this.mainMenuBar_MouseMove);\n\t\t\t// \n\t\t\t// toolbarContext\n\t\t\t// \n\t\t\tthis.toolbarContext.ImageScalingSize = new System.Drawing.Size(24, 24);\n\t\t\tthis.toolbarContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.menubarToolStripMenuItem,\n            this.toolbarToolStripMenuItem});\n\t\t\tthis.toolbarContext.Name = \"toolbarContext\";\n\t\t\tthis.toolbarContext.Size = new System.Drawing.Size(123, 48);\n\t\t\tthis.toolbarContext.Opening += new System.ComponentModel.CancelEventHandler(this.toolbarContext_Opening);\n\t\t\t// \n\t\t\t// menubarToolStripMenuItem\n\t\t\t// \n\t\t\tthis.menubarToolStripMenuItem.Name = \"menubarToolStripMenuItem\";\n\t\t\tthis.menubarToolStripMenuItem.Size = new System.Drawing.Size(122, 22);\n\t\t\tthis.menubarToolStripMenuItem.Text = \"&Menubar\";\n\t\t\tthis.menubarToolStripMenuItem.Click += new System.EventHandler(this.menubarToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// toolbarToolStripMenuItem\n\t\t\t// \n\t\t\tthis.toolbarToolStripMenuItem.Name = \"toolbarToolStripMenuItem\";\n\t\t\tthis.toolbarToolStripMenuItem.Size = new System.Drawing.Size(122, 22);\n\t\t\tthis.toolbarToolStripMenuItem.Text = \"&Toolbar\";\n\t\t\tthis.toolbarToolStripMenuItem.Click += new System.EventHandler(this.toolbarToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// fileToolStripMenuItem\n\t\t\t// \n\t\t\tthis.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.addAPIKeyMenu,\n            this.manageAPIKeysMenuItem,\n            this.fileManagerHideToolStripSeparator,\n            this.deleteCharacterMenu,\n            this.exportCharacterMenu,\n            this.hideCharacterMenu,\n            this.fileExportSaveToolStripSeparator,\n            this.loadSettingsToolStripMenuItem,\n            this.saveSettingsToolStripMenuItem,\n            this.resetSettingsToolStripMenuItem,\n            this.fileRestoreResetToolStripSeparator,\n            this.clearCacheToolStripMenuItem,\n            this.fileResetExitToolStripSeparator,\n            this.exitToolStripMenuItem});\n\t\t\tthis.fileToolStripMenuItem.Name = \"fileToolStripMenuItem\";\n\t\t\tthis.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);\n\t\t\tthis.fileToolStripMenuItem.Text = \"&File\";\n\t\t\t// \n\t\t\t// addAPIKeyMenu\n\t\t\t// \n\t\t\tthis.addAPIKeyMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"addAPIKeyMenu.Image\")));\n\t\t\tthis.addAPIKeyMenu.Name = \"addAPIKeyMenu\";\n\t\t\tthis.addAPIKeyMenu.Size = new System.Drawing.Size(185, 22);\n\t\t\tthis.addAPIKeyMenu.Text = \"&Add Character...\";\n\t\t\tthis.addAPIKeyMenu.Click += new System.EventHandler(this.addAPIKeyMenu_Click);\n\t\t\t// \n\t\t\t// manageAPIKeysMenuItem\n\t\t\t// \n\t\t\tthis.manageAPIKeysMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"manageAPIKeysMenuItem.Image\")));\n\t\t\tthis.manageAPIKeysMenuItem.Name = \"manageAPIKeysMenuItem\";\n\t\t\tthis.manageAPIKeysMenuItem.Size = new System.Drawing.Size(185, 22);\n\t\t\tthis.manageAPIKeysMenuItem.Text = \"&Manage Characters...\";\n\t\t\tthis.manageAPIKeysMenuItem.Click += new System.EventHandler(this.manageAPIKeysMenuItem_Click);\n\t\t\t// \n\t\t\t// fileManagerHideToolStripSeparator\n\t\t\t// \n\t\t\tthis.fileManagerHideToolStripSeparator.Name = \"fileManagerHideToolStripSeparator\";\n\t\t\tthis.fileManagerHideToolStripSeparator.Size = new System.Drawing.Size(182, 6);\n\t\t\t// \n\t\t\t// deleteCharacterMenu\n\t\t\t// \n\t\t\tthis.deleteCharacterMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"deleteCharacterMenu.Image\")));\n\t\t\tthis.deleteCharacterMenu.Name = \"deleteCharacterMenu\";\n\t\t\tthis.deleteCharacterMenu.Size = new System.Drawing.Size(185, 22);\n\t\t\tthis.deleteCharacterMenu.Text = \"&Delete Character...\";\n\t\t\tthis.deleteCharacterMenu.Click += new System.EventHandler(this.deleteCharacterMenu_Click);\n\t\t\t// \n\t\t\t// exportCharacterMenu\n\t\t\t// \n\t\t\tthis.exportCharacterMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"exportCharacterMenu.Image\")));\n\t\t\tthis.exportCharacterMenu.Name = \"exportCharacterMenu\";\n\t\t\tthis.exportCharacterMenu.Size = new System.Drawing.Size(185, 22);\n\t\t\tthis.exportCharacterMenu.Text = \"&Export Character...\";\n\t\t\tthis.exportCharacterMenu.Click += new System.EventHandler(this.saveCharacterInfosMenuItem_Click);\n\t\t\t// \n\t\t\t// hideCharacterMenu\n\t\t\t// \n\t\t\tthis.hideCharacterMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"hideCharacterMenu.Image\")));\n\t\t\tthis.hideCharacterMenu.Name = \"hideCharacterMenu\";\n\t\t\tthis.hideCharacterMenu.Size = new System.Drawing.Size(185, 22);\n\t\t\tthis.hideCharacterMenu.Text = \"&Hide Character\";\n\t\t\tthis.hideCharacterMenu.Click += new System.EventHandler(this.hideCharacterMenu_Click);\n\t\t\t// \n\t\t\t// fileExportSaveToolStripSeparator\n\t\t\t// \n\t\t\tthis.fileExportSaveToolStripSeparator.Name = \"fileExportSaveToolStripSeparator\";\n\t\t\tthis.fileExportSaveToolStripSeparator.Size = new System.Drawing.Size(182, 6);\n\t\t\t// \n\t\t\t// loadSettingsToolStripMenuItem\n\t\t\t// \n\t\t\tthis.loadSettingsToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"loadSettingsToolStripMenuItem.Image\")));\n\t\t\tthis.loadSettingsToolStripMenuItem.Name = \"loadSettingsToolStripMenuItem\";\n\t\t\tthis.loadSettingsToolStripMenuItem.Size = new System.Drawing.Size(185, 22);\n\t\t\tthis.loadSettingsToolStripMenuItem.Text = \"R&estore Settings...\";\n\t\t\tthis.loadSettingsToolStripMenuItem.Click += new System.EventHandler(this.loadSettingsToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// saveSettingsToolStripMenuItem\n\t\t\t// \n\t\t\tthis.saveSettingsToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"saveSettingsToolStripMenuItem.Image\")));\n\t\t\tthis.saveSettingsToolStripMenuItem.Name = \"saveSettingsToolStripMenuItem\";\n\t\t\tthis.saveSettingsToolStripMenuItem.Size = new System.Drawing.Size(185, 22);\n\t\t\tthis.saveSettingsToolStripMenuItem.Text = \"Sa&ve Settings...\";\n\t\t\tthis.saveSettingsToolStripMenuItem.Click += new System.EventHandler(this.saveSettingsToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// resetSettingsToolStripMenuItem\n\t\t\t// \n\t\t\tthis.resetSettingsToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"resetSettingsToolStripMenuItem.Image\")));\n\t\t\tthis.resetSettingsToolStripMenuItem.Name = \"resetSettingsToolStripMenuItem\";\n\t\t\tthis.resetSettingsToolStripMenuItem.Size = new System.Drawing.Size(185, 22);\n\t\t\tthis.resetSettingsToolStripMenuItem.Text = \"&Reset Settings\";\n\t\t\tthis.resetSettingsToolStripMenuItem.Click += new System.EventHandler(this.resetSettingsToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// fileRestoreResetToolStripSeparator\n\t\t\t// \n\t\t\tthis.fileRestoreResetToolStripSeparator.Name = \"fileRestoreResetToolStripSeparator\";\n\t\t\tthis.fileRestoreResetToolStripSeparator.Size = new System.Drawing.Size(182, 6);\n\t\t\t// \n\t\t\t// clearCacheToolStripMenuItem\n\t\t\t// \n\t\t\tthis.clearCacheToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"clearCacheToolStripMenuItem.Image\")));\n\t\t\tthis.clearCacheToolStripMenuItem.Name = \"clearCacheToolStripMenuItem\";\n\t\t\tthis.clearCacheToolStripMenuItem.Size = new System.Drawing.Size(185, 22);\n\t\t\tthis.clearCacheToolStripMenuItem.Text = \"&Clear Cache\";\n\t\t\tthis.clearCacheToolStripMenuItem.Click += new System.EventHandler(this.clearCacheToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// fileResetExitToolStripSeparator\n\t\t\t// \n\t\t\tthis.fileResetExitToolStripSeparator.Name = \"fileResetExitToolStripSeparator\";\n\t\t\tthis.fileResetExitToolStripSeparator.Size = new System.Drawing.Size(182, 6);\n\t\t\t// \n\t\t\t// exitToolStripMenuItem\n\t\t\t// \n\t\t\tthis.exitToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"exitToolStripMenuItem.Image\")));\n\t\t\tthis.exitToolStripMenuItem.Name = \"exitToolStripMenuItem\";\n\t\t\tthis.exitToolStripMenuItem.Size = new System.Drawing.Size(185, 22);\n\t\t\tthis.exitToolStripMenuItem.Text = \"E&xit\";\n\t\t\tthis.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// editToolStripMenuItem\n\t\t\t// \n\t\t\tthis.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.copySkillsToClipboardBBFormatToolStripMenuItem});\n\t\t\tthis.editToolStripMenuItem.Name = \"editToolStripMenuItem\";\n\t\t\tthis.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20);\n\t\t\tthis.editToolStripMenuItem.Text = \"&Edit\";\n\t\t\tthis.editToolStripMenuItem.DropDownOpening += new System.EventHandler(this.editToolStripMenuItem_DropDownOpening);\n\t\t\t// \n\t\t\t// copySkillsToClipboardBBFormatToolStripMenuItem\n\t\t\t// \n\t\t\tthis.copySkillsToClipboardBBFormatToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"copySkillsToClipboardBBFormatToolStripMenuItem.Image\")));\n\t\t\tthis.copySkillsToClipboardBBFormatToolStripMenuItem.Name = \"copySkillsToClipboardBBFormatToolStripMenuItem\";\n\t\t\tthis.copySkillsToClipboardBBFormatToolStripMenuItem.Size = new System.Drawing.Size(266, 22);\n\t\t\tthis.copySkillsToClipboardBBFormatToolStripMenuItem.Text = \"&Copy Skills to Clipboard (BB Format)\";\n\t\t\tthis.copySkillsToClipboardBBFormatToolStripMenuItem.Click += new System.EventHandler(this.copySkillsToClipboardBBFormatToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// plansToolStripMenuItem\n\t\t\t// \n\t\t\tthis.plansToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tsmiNewPlan,\n            this.tsmiCreatePlanFromSkillQueue,\n            this.tsmiImportPlanFromFile,\n            this.tsmiManagePlans,\n            this.plansSeparator});\n\t\t\tthis.plansToolStripMenuItem.Name = \"plansToolStripMenuItem\";\n\t\t\tthis.plansToolStripMenuItem.Size = new System.Drawing.Size(47, 20);\n\t\t\tthis.plansToolStripMenuItem.Text = \"&Plans\";\n\t\t\tthis.plansToolStripMenuItem.DropDownOpening += new System.EventHandler(this.plansToolStripMenuItem_DropDownOpening);\n\t\t\t// \n\t\t\t// tsmiNewPlan\n\t\t\t// \n\t\t\tthis.tsmiNewPlan.Image = ((System.Drawing.Image)(resources.GetObject(\"tsmiNewPlan.Image\")));\n\t\t\tthis.tsmiNewPlan.Name = \"tsmiNewPlan\";\n\t\t\tthis.tsmiNewPlan.Size = new System.Drawing.Size(234, 22);\n\t\t\tthis.tsmiNewPlan.Text = \"&New Plan…\";\n\t\t\tthis.tsmiNewPlan.Click += new System.EventHandler(this.tsmiNewPlan_Click);\n\t\t\t// \n\t\t\t// tsmiCreatePlanFromSkillQueue\n\t\t\t// \n\t\t\tthis.tsmiCreatePlanFromSkillQueue.Image = ((System.Drawing.Image)(resources.GetObject(\"tsmiCreatePlanFromSkillQueue.Image\")));\n\t\t\tthis.tsmiCreatePlanFromSkillQueue.Name = \"tsmiCreatePlanFromSkillQueue\";\n\t\t\tthis.tsmiCreatePlanFromSkillQueue.Size = new System.Drawing.Size(234, 22);\n\t\t\tthis.tsmiCreatePlanFromSkillQueue.Text = \"Create Plan from Skill Queue...\";\n\t\t\tthis.tsmiCreatePlanFromSkillQueue.Click += new System.EventHandler(this.tsmiCreatePlanFromSkillQueue_Click);\n\t\t\t// \n\t\t\t// tsmiImportPlanFromFile\n\t\t\t// \n\t\t\tthis.tsmiImportPlanFromFile.Image = ((System.Drawing.Image)(resources.GetObject(\"tsmiImportPlanFromFile.Image\")));\n\t\t\tthis.tsmiImportPlanFromFile.Name = \"tsmiImportPlanFromFile\";\n\t\t\tthis.tsmiImportPlanFromFile.Size = new System.Drawing.Size(234, 22);\n\t\t\tthis.tsmiImportPlanFromFile.Text = \"&Import Plan from File...\";\n\t\t\tthis.tsmiImportPlanFromFile.Click += new System.EventHandler(this.tsmiImportPlanFromFile_Click);\n\t\t\t// \n\t\t\t// tsmiManagePlans\n\t\t\t// \n\t\t\tthis.tsmiManagePlans.Image = ((System.Drawing.Image)(resources.GetObject(\"tsmiManagePlans.Image\")));\n\t\t\tthis.tsmiManagePlans.Name = \"tsmiManagePlans\";\n\t\t\tthis.tsmiManagePlans.Size = new System.Drawing.Size(234, 22);\n\t\t\tthis.tsmiManagePlans.Text = \"&Manage Plans...\";\n\t\t\tthis.tsmiManagePlans.Click += new System.EventHandler(this.manageToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// plansSeparator\n\t\t\t// \n\t\t\tthis.plansSeparator.Name = \"plansSeparator\";\n\t\t\tthis.plansSeparator.Size = new System.Drawing.Size(231, 6);\n\t\t\t// \n\t\t\t// toolsToolStripMenuItem\n\t\t\t// \n\t\t\tthis.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.charactersComparisonMenuItem,\n            this.blankCreatorToolStripMenuItem,\n            this.dataBrowserMenuItem,\n            this.skillsPieChartMenuItem,\n            this.firstSeparator,\n            this.implantsMenuItem,\n            this.showOwnedSkillbooksMenuItem,\n            this.secondSeparator,\n            this.optionsToolStripMenuItem});\n\t\t\tthis.toolsToolStripMenuItem.Name = \"toolsToolStripMenuItem\";\n\t\t\tthis.toolsToolStripMenuItem.Size = new System.Drawing.Size(47, 20);\n\t\t\tthis.toolsToolStripMenuItem.Text = \"&Tools\";\n\t\t\t// \n\t\t\t// charactersComparisonMenuItem\n\t\t\t// \n\t\t\tthis.charactersComparisonMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"charactersComparisonMenuItem.Image\")));\n\t\t\tthis.charactersComparisonMenuItem.Name = \"charactersComparisonMenuItem\";\n\t\t\tthis.charactersComparisonMenuItem.Size = new System.Drawing.Size(208, 22);\n\t\t\tthis.charactersComparisonMenuItem.Text = \"&Characters Comparison...\";\n\t\t\tthis.charactersComparisonMenuItem.Click += new System.EventHandler(this.charactersComparisonToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// blankCreatorToolStripMenuItem\n\t\t\t// \n\t\t\tthis.blankCreatorToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"blankCreatorToolStripMenuItem.Image\")));\n\t\t\tthis.blankCreatorToolStripMenuItem.Name = \"blankCreatorToolStripMenuItem\";\n\t\t\tthis.blankCreatorToolStripMenuItem.Size = new System.Drawing.Size(208, 22);\n\t\t\tthis.blankCreatorToolStripMenuItem.Text = \"&Blank Character Creator...\";\n\t\t\tthis.blankCreatorToolStripMenuItem.Click += new System.EventHandler(this.blankCreatorToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// dataBrowserMenuItem\n\t\t\t// \n\t\t\tthis.dataBrowserMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.skillBrowserMenuItem,\n            this.certificateBrowserMenuItem,\n            this.shipBrowserMenuItem,\n            this.itemBrowserMenuItem,\n            this.blueprintBrowserMenuItem});\n\t\t\tthis.dataBrowserMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"dataBrowserMenuItem.Image\")));\n\t\t\tthis.dataBrowserMenuItem.Name = \"dataBrowserMenuItem\";\n\t\t\tthis.dataBrowserMenuItem.Size = new System.Drawing.Size(208, 22);\n\t\t\tthis.dataBrowserMenuItem.Text = \"&Data Browser\";\n\t\t\t// \n\t\t\t// skillBrowserMenuItem\n\t\t\t// \n\t\t\tthis.skillBrowserMenuItem.Name = \"skillBrowserMenuItem\";\n\t\t\tthis.skillBrowserMenuItem.Size = new System.Drawing.Size(182, 22);\n\t\t\tthis.skillBrowserMenuItem.Text = \"&Skill Browser...\";\n\t\t\tthis.skillBrowserMenuItem.Click += new System.EventHandler(this.skillBrowserMenuItem_Click);\n\t\t\t// \n\t\t\t// certificateBrowserMenuItem\n\t\t\t// \n\t\t\tthis.certificateBrowserMenuItem.Name = \"certificateBrowserMenuItem\";\n\t\t\tthis.certificateBrowserMenuItem.Size = new System.Drawing.Size(182, 22);\n\t\t\tthis.certificateBrowserMenuItem.Text = \"&Certificate Browser...\";\n\t\t\tthis.certificateBrowserMenuItem.Click += new System.EventHandler(this.certificateBrowserMenuItem_Click);\n\t\t\t// \n\t\t\t// shipBrowserMenuItem\n\t\t\t// \n\t\t\tthis.shipBrowserMenuItem.Name = \"shipBrowserMenuItem\";\n\t\t\tthis.shipBrowserMenuItem.Size = new System.Drawing.Size(182, 22);\n\t\t\tthis.shipBrowserMenuItem.Text = \"S&hip Browser...\";\n\t\t\tthis.shipBrowserMenuItem.Click += new System.EventHandler(this.shipBrowserMenuItem_Click);\n\t\t\t// \n\t\t\t// itemBrowserMenuItem\n\t\t\t// \n\t\t\tthis.itemBrowserMenuItem.Name = \"itemBrowserMenuItem\";\n\t\t\tthis.itemBrowserMenuItem.Size = new System.Drawing.Size(182, 22);\n\t\t\tthis.itemBrowserMenuItem.Text = \"&Item Browser...\";\n\t\t\tthis.itemBrowserMenuItem.Click += new System.EventHandler(this.itemBrowserMenuItem_Click);\n\t\t\t// \n\t\t\t// blueprintBrowserMenuItem\n\t\t\t// \n\t\t\tthis.blueprintBrowserMenuItem.Name = \"blueprintBrowserMenuItem\";\n\t\t\tthis.blueprintBrowserMenuItem.Size = new System.Drawing.Size(182, 22);\n\t\t\tthis.blueprintBrowserMenuItem.Text = \"&Blueprint Browser...\";\n\t\t\tthis.blueprintBrowserMenuItem.Click += new System.EventHandler(this.blueprintBrowserMenuItem_Click);\n\t\t\t// \n\t\t\t// skillsPieChartMenuItem\n\t\t\t// \n\t\t\tthis.skillsPieChartMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"skillsPieChartMenuItem.Image\")));\n\t\t\tthis.skillsPieChartMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.skillsPieChartMenuItem.Name = \"skillsPieChartMenuItem\";\n\t\t\tthis.skillsPieChartMenuItem.Size = new System.Drawing.Size(208, 22);\n\t\t\tthis.skillsPieChartMenuItem.Text = \"Skills &Pie Chart...\";\n\t\t\tthis.skillsPieChartMenuItem.Click += new System.EventHandler(this.tsSkillsPieChartTool_Click);\n\t\t\t// \n\t\t\t// firstSeparator\n\t\t\t// \n\t\t\tthis.firstSeparator.Name = \"firstSeparator\";\n\t\t\tthis.firstSeparator.Size = new System.Drawing.Size(205, 6);\n\t\t\t// \n\t\t\t// implantsMenuItem\n\t\t\t// \n\t\t\tthis.implantsMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"implantsMenuItem.Image\")));\n\t\t\tthis.implantsMenuItem.Name = \"implantsMenuItem\";\n\t\t\tthis.implantsMenuItem.Size = new System.Drawing.Size(208, 22);\n\t\t\tthis.implantsMenuItem.Text = \"&Implant Groups...\";\n\t\t\tthis.implantsMenuItem.Click += new System.EventHandler(this.manualImplantGroupsToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// showOwnedSkillbooksMenuItem\n\t\t\t// \n\t\t\tthis.showOwnedSkillbooksMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"showOwnedSkillbooksMenuItem.Image\")));\n\t\t\tthis.showOwnedSkillbooksMenuItem.Name = \"showOwnedSkillbooksMenuItem\";\n\t\t\tthis.showOwnedSkillbooksMenuItem.Size = new System.Drawing.Size(208, 22);\n\t\t\tthis.showOwnedSkillbooksMenuItem.Text = \"O&wned Skillbooks...\";\n\t\t\tthis.showOwnedSkillbooksMenuItem.Click += new System.EventHandler(this.tsShowOwnedSkillbooks_Click);\n\t\t\t// \n\t\t\t// secondSeparator\n\t\t\t// \n\t\t\tthis.secondSeparator.Name = \"secondSeparator\";\n\t\t\tthis.secondSeparator.Size = new System.Drawing.Size(205, 6);\n\t\t\t// \n\t\t\t// optionsToolStripMenuItem\n\t\t\t// \n\t\t\tthis.optionsToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"optionsToolStripMenuItem.Image\")));\n\t\t\tthis.optionsToolStripMenuItem.Name = \"optionsToolStripMenuItem\";\n\t\t\tthis.optionsToolStripMenuItem.Size = new System.Drawing.Size(208, 22);\n\t\t\tthis.optionsToolStripMenuItem.Text = \"&Options...\";\n\t\t\tthis.optionsToolStripMenuItem.Click += new System.EventHandler(this.optionsMenuItem_Click);\n\t\t\t// \n\t\t\t// helpToolStripMenuItem\n\t\t\t// \n\t\t\tthis.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.forumsMenuItem,\n            this.issuesFeaturesMenuItem,\n            this.readTheDocsManualToolStripMenuItem,\n            this.helpAboutKnownProblemsToolStripSeparator,\n            this.aboutMenuItem});\n\t\t\tthis.helpToolStripMenuItem.Name = \"helpToolStripMenuItem\";\n\t\t\tthis.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20);\n\t\t\tthis.helpToolStripMenuItem.Text = \"&Help\";\n\t\t\t// \n\t\t\t// forumsMenuItem\n\t\t\t// \n\t\t\tthis.forumsMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"forumsMenuItem.Image\")));\n\t\t\tthis.forumsMenuItem.Name = \"forumsMenuItem\";\n\t\t\tthis.forumsMenuItem.Size = new System.Drawing.Size(224, 22);\n\t\t\tthis.forumsMenuItem.Text = \"&Forums\";\n\t\t\tthis.forumsMenuItem.Click += new System.EventHandler(this.forumsMenuItem_Click);\n\t\t\t// \n\t\t\t// issuesFeaturesMenuItem\n\t\t\t// \n\t\t\tthis.issuesFeaturesMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"issuesFeaturesMenuItem.Image\")));\n\t\t\tthis.issuesFeaturesMenuItem.Name = \"issuesFeaturesMenuItem\";\n\t\t\tthis.issuesFeaturesMenuItem.Size = new System.Drawing.Size(224, 22);\n\t\t\tthis.issuesFeaturesMenuItem.Text = \"I&ssues and Features (GitHub)\";\n\t\t\tthis.issuesFeaturesMenuItem.Click += new System.EventHandler(this.issuesFeaturesMenuItem_Click);\n\t\t\t// \n\t\t\t// readTheDocsManualToolStripMenuItem\n\t\t\t// \n\t\t\tthis.readTheDocsManualToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"readTheDocsManualToolStripMenuItem.Image\")));\n\t\t\tthis.readTheDocsManualToolStripMenuItem.Name = \"readTheDocsManualToolStripMenuItem\";\n\t\t\tthis.readTheDocsManualToolStripMenuItem.Size = new System.Drawing.Size(224, 22);\n\t\t\tthis.readTheDocsManualToolStripMenuItem.Text = \"Read The Docs (Manual)\";\n\t\t\tthis.readTheDocsManualToolStripMenuItem.Click += new System.EventHandler(this.readTheDocsManualMenuItem_Click);\n\t\t\t// \n\t\t\t// helpAboutKnownProblemsToolStripSeparator\n\t\t\t// \n\t\t\tthis.helpAboutKnownProblemsToolStripSeparator.Name = \"helpAboutKnownProblemsToolStripSeparator\";\n\t\t\tthis.helpAboutKnownProblemsToolStripSeparator.Size = new System.Drawing.Size(221, 6);\n\t\t\t// \n\t\t\t// aboutMenuItem\n\t\t\t// \n\t\t\tthis.aboutMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"aboutMenuItem.Image\")));\n\t\t\tthis.aboutMenuItem.Name = \"aboutMenuItem\";\n\t\t\tthis.aboutMenuItem.Size = new System.Drawing.Size(224, 22);\n\t\t\tthis.aboutMenuItem.Text = \"&About...\";\n\t\t\tthis.aboutMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// testsToolStripMenuItem\n\t\t\t// \n\t\t\tthis.testsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.exceptionWindowToolStripMenuItem,\n            this.exceptionWindowRecursiveExceptionToolStripMenuItem,\n            this.testNotificationToolStripMenuItem,\n            this.testCharacterNotificationToolStripMenuItem,\n            this.testTimeoutOneSecToolStripMenuItem,\n            this.restartToolStripMenuItem});\n\t\t\tthis.testsToolStripMenuItem.Name = \"testsToolStripMenuItem\";\n\t\t\tthis.testsToolStripMenuItem.Size = new System.Drawing.Size(40, 20);\n\t\t\tthis.testsToolStripMenuItem.Text = \"Te&st\";\n\t\t\tthis.testsToolStripMenuItem.Visible = false;\n\t\t\tthis.testsToolStripMenuItem.DropDownOpening += new System.EventHandler(this.testToolStripMenuItem_DropDownOpening);\n\t\t\t// \n\t\t\t// exceptionWindowToolStripMenuItem\n\t\t\t// \n\t\t\tthis.exceptionWindowToolStripMenuItem.Name = \"exceptionWindowToolStripMenuItem\";\n\t\t\tthis.exceptionWindowToolStripMenuItem.Size = new System.Drawing.Size(287, 22);\n\t\t\tthis.exceptionWindowToolStripMenuItem.Text = \"Exception Window\";\n\t\t\tthis.exceptionWindowToolStripMenuItem.Click += new System.EventHandler(this.ExceptionWindowToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// exceptionWindowRecursiveExceptionToolStripMenuItem\n\t\t\t// \n\t\t\tthis.exceptionWindowRecursiveExceptionToolStripMenuItem.Name = \"exceptionWindowRecursiveExceptionToolStripMenuItem\";\n\t\t\tthis.exceptionWindowRecursiveExceptionToolStripMenuItem.Size = new System.Drawing.Size(287, 22);\n\t\t\tthis.exceptionWindowRecursiveExceptionToolStripMenuItem.Text = \"Exception Window (Recursive Exception)\";\n\t\t\tthis.exceptionWindowRecursiveExceptionToolStripMenuItem.Click += new System.EventHandler(this.exceptionWindowRecursiveExceptionToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// testNotificationToolStripMenuItem\n\t\t\t// \n\t\t\tthis.testNotificationToolStripMenuItem.Name = \"testNotificationToolStripMenuItem\";\n\t\t\tthis.testNotificationToolStripMenuItem.Size = new System.Drawing.Size(287, 22);\n\t\t\tthis.testNotificationToolStripMenuItem.Text = \"Notification\";\n\t\t\tthis.testNotificationToolStripMenuItem.Click += new System.EventHandler(this.testNotificationToolstripMenuItem_Click);\n\t\t\t// \n\t\t\t// testCharacterNotificationToolStripMenuItem\n\t\t\t// \n\t\t\tthis.testCharacterNotificationToolStripMenuItem.Name = \"testCharacterNotificationToolStripMenuItem\";\n\t\t\tthis.testCharacterNotificationToolStripMenuItem.Size = new System.Drawing.Size(287, 22);\n\t\t\tthis.testCharacterNotificationToolStripMenuItem.Text = \"Character Notification\";\n\t\t\tthis.testCharacterNotificationToolStripMenuItem.Click += new System.EventHandler(this.testCharacterNotificationToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// testTimeoutOneSecToolStripMenuItem\n\t\t\t// \n\t\t\tthis.testTimeoutOneSecToolStripMenuItem.Name = \"testTimeoutOneSecToolStripMenuItem\";\n\t\t\tthis.testTimeoutOneSecToolStripMenuItem.Size = new System.Drawing.Size(287, 22);\n\t\t\tthis.testTimeoutOneSecToolStripMenuItem.Text = \"Set Timeout to 1 Second\";\n\t\t\tthis.testTimeoutOneSecToolStripMenuItem.Click += new System.EventHandler(this.testTimeoutOneSecToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// restartToolStripMenuItem\n\t\t\t// \n\t\t\tthis.restartToolStripMenuItem.Name = \"restartToolStripMenuItem\";\n\t\t\tthis.restartToolStripMenuItem.Size = new System.Drawing.Size(287, 22);\n\t\t\tthis.restartToolStripMenuItem.Text = \"Restart\";\n\t\t\tthis.restartToolStripMenuItem.Click += new System.EventHandler(this.restartToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// mainToolBar\n\t\t\t// \n\t\t\tthis.mainToolBar.ContextMenuStrip = this.toolbarContext;\n\t\t\tthis.mainToolBar.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n\t\t\tthis.mainToolBar.ImageScalingSize = new System.Drawing.Size(24, 24);\n\t\t\tthis.mainToolBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.addAPIKeyTbMenu,\n            this.apiKeysManagementTbMenu,\n            this.apiKeysSettingsToolStripSeparator,\n            this.manageCharacterTbMenu,\n            this.manageCharacterToolStripSeparator,\n            this.tsdbSettings,\n            this.settingsToolStripSeparator,\n            this.clearCacheToolStripButton,\n            this.resetSettingsToolStripButton,\n            this.cacheResetToolStripSeparator,\n            this.exitToolStripButton,\n            this.exitToolStripSeparator,\n            this.tsbManagePlans,\n            this.plansTbMenu,\n            this.plansToolStripSeparator,\n            this.characterComparisonToolStripButton,\n            this.tsbMineralSheet,\n            this.skillsPieChartTbMenu,\n            this.tsbSchedule,\n            this.tsbImplantGroups,\n            this.tsbShowOwned,\n            this.toolsToolStripSeparator,\n            this.tsbOptions,\n            this.tsbAbout});\n\t\t\tthis.mainToolBar.Location = new System.Drawing.Point(0, 24);\n\t\t\tthis.mainToolBar.Name = \"mainToolBar\";\n\t\t\tthis.mainToolBar.Size = new System.Drawing.Size(600, 25);\n\t\t\tthis.mainToolBar.TabIndex = 5;\n\t\t\tthis.mainToolBar.Text = \"toolStrip1\";\n\t\t\tthis.mainToolBar.MouseDown += new System.Windows.Forms.MouseEventHandler(this.mainToolBar_MouseDown);\n\t\t\tthis.mainToolBar.MouseMove += new System.Windows.Forms.MouseEventHandler(this.mainToolBar_MouseMove);\n\t\t\t// \n\t\t\t// addAPIKeyTbMenu\n\t\t\t// \n\t\t\tthis.addAPIKeyTbMenu.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.addAPIKeyTbMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"addAPIKeyTbMenu.Image\")));\n\t\t\tthis.addAPIKeyTbMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.addAPIKeyTbMenu.Name = \"addAPIKeyTbMenu\";\n\t\t\tthis.addAPIKeyTbMenu.Size = new System.Drawing.Size(23, 22);\n\t\t\tthis.addAPIKeyTbMenu.ToolTipText = \"Add API key\";\n\t\t\tthis.addAPIKeyTbMenu.Click += new System.EventHandler(this.addAPIKeyMenu_Click);\n\t\t\t// \n\t\t\t// apiKeysManagementTbMenu\n\t\t\t// \n\t\t\tthis.apiKeysManagementTbMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"apiKeysManagementTbMenu.Image\")));\n\t\t\tthis.apiKeysManagementTbMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.apiKeysManagementTbMenu.Name = \"apiKeysManagementTbMenu\";\n\t\t\tthis.apiKeysManagementTbMenu.Size = new System.Drawing.Size(23, 22);\n\t\t\tthis.apiKeysManagementTbMenu.ToolTipText = \"Manage accounts\";\n\t\t\tthis.apiKeysManagementTbMenu.Click += new System.EventHandler(this.manageAPIKeysMenuItem_Click);\n\t\t\t// \n\t\t\t// apiKeysSettingsToolStripSeparator\n\t\t\t// \n\t\t\tthis.apiKeysSettingsToolStripSeparator.Name = \"apiKeysSettingsToolStripSeparator\";\n\t\t\tthis.apiKeysSettingsToolStripSeparator.Size = new System.Drawing.Size(6, 25);\n\t\t\t// \n\t\t\t// manageCharacterTbMenu\n\t\t\t// \n\t\t\tthis.manageCharacterTbMenu.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.manageCharacterTbMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.toolStripMenuItem1,\n            this.toolStripMenuItem2,\n            this.toolStripMenuItem3});\n\t\t\tthis.manageCharacterTbMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"manageCharacterTbMenu.Image\")));\n\t\t\tthis.manageCharacterTbMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.manageCharacterTbMenu.Name = \"manageCharacterTbMenu\";\n\t\t\tthis.manageCharacterTbMenu.Size = new System.Drawing.Size(29, 22);\n\t\t\tthis.manageCharacterTbMenu.Text = \"Manage Character\";\n\t\t\tthis.manageCharacterTbMenu.ToolTipText = \"Manage Character\";\n\t\t\t// \n\t\t\t// toolStripMenuItem1\n\t\t\t// \n\t\t\tthis.toolStripMenuItem1.Image = ((System.Drawing.Image)(resources.GetObject(\"toolStripMenuItem1.Image\")));\n\t\t\tthis.toolStripMenuItem1.Name = \"toolStripMenuItem1\";\n\t\t\tthis.toolStripMenuItem1.Size = new System.Drawing.Size(170, 22);\n\t\t\tthis.toolStripMenuItem1.Text = \"&Delete Character...\";\n\t\t\tthis.toolStripMenuItem1.Click += new System.EventHandler(this.deleteCharacterMenu_Click);\n\t\t\t// \n\t\t\t// toolStripMenuItem2\n\t\t\t// \n\t\t\tthis.toolStripMenuItem2.Image = ((System.Drawing.Image)(resources.GetObject(\"toolStripMenuItem2.Image\")));\n\t\t\tthis.toolStripMenuItem2.Name = \"toolStripMenuItem2\";\n\t\t\tthis.toolStripMenuItem2.Size = new System.Drawing.Size(170, 22);\n\t\t\tthis.toolStripMenuItem2.Text = \"&Export Character...\";\n\t\t\tthis.toolStripMenuItem2.Click += new System.EventHandler(this.saveCharacterInfosMenuItem_Click);\n\t\t\t// \n\t\t\t// toolStripMenuItem3\n\t\t\t// \n\t\t\tthis.toolStripMenuItem3.Image = ((System.Drawing.Image)(resources.GetObject(\"toolStripMenuItem3.Image\")));\n\t\t\tthis.toolStripMenuItem3.Name = \"toolStripMenuItem3\";\n\t\t\tthis.toolStripMenuItem3.Size = new System.Drawing.Size(170, 22);\n\t\t\tthis.toolStripMenuItem3.Text = \"&Hide Character\";\n\t\t\tthis.toolStripMenuItem3.Click += new System.EventHandler(this.hideCharacterMenu_Click);\n\t\t\t// \n\t\t\t// manageCharacterToolStripSeparator\n\t\t\t// \n\t\t\tthis.manageCharacterToolStripSeparator.Name = \"manageCharacterToolStripSeparator\";\n\t\t\tthis.manageCharacterToolStripSeparator.Size = new System.Drawing.Size(6, 25);\n\t\t\t// \n\t\t\t// tsdbSettings\n\t\t\t// \n\t\t\tthis.tsdbSettings.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.tsdbSettings.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tsLoadSettings,\n            this.tsSaveSettings});\n\t\t\tthis.tsdbSettings.Image = ((System.Drawing.Image)(resources.GetObject(\"tsdbSettings.Image\")));\n\t\t\tthis.tsdbSettings.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.tsdbSettings.Name = \"tsdbSettings\";\n\t\t\tthis.tsdbSettings.Size = new System.Drawing.Size(29, 22);\n\t\t\tthis.tsdbSettings.Text = \"tsddbSettings\";\n\t\t\tthis.tsdbSettings.ToolTipText = \"Save/Restore Settings\";\n\t\t\t// \n\t\t\t// tsLoadSettings\n\t\t\t// \n\t\t\tthis.tsLoadSettings.Image = ((System.Drawing.Image)(resources.GetObject(\"tsLoadSettings.Image\")));\n\t\t\tthis.tsLoadSettings.Name = \"tsLoadSettings\";\n\t\t\tthis.tsLoadSettings.Size = new System.Drawing.Size(167, 22);\n\t\t\tthis.tsLoadSettings.Text = \"Restore Settings...\";\n\t\t\tthis.tsLoadSettings.Click += new System.EventHandler(this.loadSettingsToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// tsSaveSettings\n\t\t\t// \n\t\t\tthis.tsSaveSettings.Image = ((System.Drawing.Image)(resources.GetObject(\"tsSaveSettings.Image\")));\n\t\t\tthis.tsSaveSettings.Name = \"tsSaveSettings\";\n\t\t\tthis.tsSaveSettings.Size = new System.Drawing.Size(167, 22);\n\t\t\tthis.tsSaveSettings.Text = \"Save Settings...\";\n\t\t\tthis.tsSaveSettings.Click += new System.EventHandler(this.saveSettingsToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// settingsToolStripSeparator\n\t\t\t// \n\t\t\tthis.settingsToolStripSeparator.Name = \"settingsToolStripSeparator\";\n\t\t\tthis.settingsToolStripSeparator.Size = new System.Drawing.Size(6, 25);\n\t\t\t// \n\t\t\t// clearCacheToolStripButton\n\t\t\t// \n\t\t\tthis.clearCacheToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.clearCacheToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject(\"clearCacheToolStripButton.Image\")));\n\t\t\tthis.clearCacheToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.clearCacheToolStripButton.Name = \"clearCacheToolStripButton\";\n\t\t\tthis.clearCacheToolStripButton.Size = new System.Drawing.Size(23, 22);\n\t\t\tthis.clearCacheToolStripButton.Text = \"Clear Cache\";\n\t\t\tthis.clearCacheToolStripButton.Click += new System.EventHandler(this.clearCacheToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// resetSettingsToolStripButton\n\t\t\t// \n\t\t\tthis.resetSettingsToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.resetSettingsToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject(\"resetSettingsToolStripButton.Image\")));\n\t\t\tthis.resetSettingsToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.resetSettingsToolStripButton.Name = \"resetSettingsToolStripButton\";\n\t\t\tthis.resetSettingsToolStripButton.Size = new System.Drawing.Size(23, 22);\n\t\t\tthis.resetSettingsToolStripButton.Text = \"Reset Settings\";\n\t\t\tthis.resetSettingsToolStripButton.Click += new System.EventHandler(this.resetSettingsToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// cacheResetToolStripSeparator\n\t\t\t// \n\t\t\tthis.cacheResetToolStripSeparator.Name = \"cacheResetToolStripSeparator\";\n\t\t\tthis.cacheResetToolStripSeparator.Size = new System.Drawing.Size(6, 25);\n\t\t\t// \n\t\t\t// exitToolStripButton\n\t\t\t// \n\t\t\tthis.exitToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.exitToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject(\"exitToolStripButton.Image\")));\n\t\t\tthis.exitToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.exitToolStripButton.Name = \"exitToolStripButton\";\n\t\t\tthis.exitToolStripButton.Size = new System.Drawing.Size(23, 22);\n\t\t\tthis.exitToolStripButton.Text = \"Exit\";\n\t\t\tthis.exitToolStripButton.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// exitToolStripSeparator\n\t\t\t// \n\t\t\tthis.exitToolStripSeparator.Name = \"exitToolStripSeparator\";\n\t\t\tthis.exitToolStripSeparator.Size = new System.Drawing.Size(6, 25);\n\t\t\t// \n\t\t\t// tsbManagePlans\n\t\t\t// \n\t\t\tthis.tsbManagePlans.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.tsbManagePlans.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbManagePlans.Image\")));\n\t\t\tthis.tsbManagePlans.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.tsbManagePlans.Name = \"tsbManagePlans\";\n\t\t\tthis.tsbManagePlans.Size = new System.Drawing.Size(23, 22);\n\t\t\tthis.tsbManagePlans.Text = \"Manage Plans\";\n\t\t\tthis.tsbManagePlans.Click += new System.EventHandler(this.manageToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// plansTbMenu\n\t\t\t// \n\t\t\tthis.plansTbMenu.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;\n\t\t\tthis.plansTbMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"plansTbMenu.Image\")));\n\t\t\tthis.plansTbMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.plansTbMenu.Name = \"plansTbMenu\";\n\t\t\tthis.plansTbMenu.Size = new System.Drawing.Size(57, 22);\n\t\t\tthis.plansTbMenu.Text = \"Plans...\";\n\t\t\tthis.plansTbMenu.DropDownOpening += new System.EventHandler(this.tsdbPlans_DropDownOpening);\n\t\t\t// \n\t\t\t// plansToolStripSeparator\n\t\t\t// \n\t\t\tthis.plansToolStripSeparator.Name = \"plansToolStripSeparator\";\n\t\t\tthis.plansToolStripSeparator.Size = new System.Drawing.Size(6, 25);\n\t\t\t// \n\t\t\t// characterComparisonToolStripButton\n\t\t\t// \n\t\t\tthis.characterComparisonToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.characterComparisonToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject(\"characterComparisonToolStripButton.Image\")));\n\t\t\tthis.characterComparisonToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.characterComparisonToolStripButton.Name = \"characterComparisonToolStripButton\";\n\t\t\tthis.characterComparisonToolStripButton.Size = new System.Drawing.Size(23, 22);\n\t\t\tthis.characterComparisonToolStripButton.Text = \"Character Comparison...\";\n\t\t\tthis.characterComparisonToolStripButton.Click += new System.EventHandler(this.charactersComparisonToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// tsbMineralSheet\n\t\t\t// \n\t\t\tthis.tsbMineralSheet.Name = \"tsbMineralSheet\";\n\t\t\tthis.tsbMineralSheet.Size = new System.Drawing.Size(23, 22);\n\t\t\t// \n\t\t\t// skillsPieChartTbMenu\n\t\t\t// \n\t\t\tthis.skillsPieChartTbMenu.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.skillsPieChartTbMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"skillsPieChartTbMenu.Image\")));\n\t\t\tthis.skillsPieChartTbMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.skillsPieChartTbMenu.Name = \"skillsPieChartTbMenu\";\n\t\t\tthis.skillsPieChartTbMenu.Size = new System.Drawing.Size(23, 22);\n\t\t\tthis.skillsPieChartTbMenu.Text = \"Skill Group Pie Chart...\";\n\t\t\tthis.skillsPieChartTbMenu.Click += new System.EventHandler(this.tsSkillsPieChartTool_Click);\n\t\t\t// \n\t\t\t// tsbSchedule\n\t\t\t// \n\t\t\tthis.tsbSchedule.Name = \"tsbSchedule\";\n\t\t\tthis.tsbSchedule.Size = new System.Drawing.Size(23, 22);\n\t\t\t// \n\t\t\t// tsbImplantGroups\n\t\t\t// \n\t\t\tthis.tsbImplantGroups.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.tsbImplantGroups.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbImplantGroups.Image\")));\n\t\t\tthis.tsbImplantGroups.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.tsbImplantGroups.Name = \"tsbImplantGroups\";\n\t\t\tthis.tsbImplantGroups.Size = new System.Drawing.Size(23, 22);\n\t\t\tthis.tsbImplantGroups.Text = \"Implant AllGroups...\";\n\t\t\tthis.tsbImplantGroups.Click += new System.EventHandler(this.manualImplantGroupsToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// tsbShowOwned\n\t\t\t// \n\t\t\tthis.tsbShowOwned.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.tsbShowOwned.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbShowOwned.Image\")));\n\t\t\tthis.tsbShowOwned.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.tsbShowOwned.Name = \"tsbShowOwned\";\n\t\t\tthis.tsbShowOwned.Size = new System.Drawing.Size(23, 22);\n\t\t\tthis.tsbShowOwned.Text = \"Show Owned Skillbooks...\";\n\t\t\tthis.tsbShowOwned.Click += new System.EventHandler(this.tsShowOwnedSkillbooks_Click);\n\t\t\t// \n\t\t\t// toolsToolStripSeparator\n\t\t\t// \n\t\t\tthis.toolsToolStripSeparator.Name = \"toolsToolStripSeparator\";\n\t\t\tthis.toolsToolStripSeparator.Size = new System.Drawing.Size(6, 25);\n\t\t\t// \n\t\t\t// tsbOptions\n\t\t\t// \n\t\t\tthis.tsbOptions.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.tsbOptions.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbOptions.Image\")));\n\t\t\tthis.tsbOptions.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.tsbOptions.Name = \"tsbOptions\";\n\t\t\tthis.tsbOptions.Size = new System.Drawing.Size(23, 22);\n\t\t\tthis.tsbOptions.Text = \"Options...\";\n\t\t\tthis.tsbOptions.Click += new System.EventHandler(this.optionsMenuItem_Click);\n\t\t\t// \n\t\t\t// tsbAbout\n\t\t\t// \n\t\t\tthis.tsbAbout.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n\t\t\tthis.tsbAbout.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbAbout.Image\")));\n\t\t\tthis.tsbAbout.ImageTransparentColor = System.Drawing.Color.Magenta;\n\t\t\tthis.tsbAbout.Name = \"tsbAbout\";\n\t\t\tthis.tsbAbout.Size = new System.Drawing.Size(23, 22);\n\t\t\tthis.tsbAbout.Text = \"About...\";\n\t\t\tthis.tsbAbout.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);\n\t\t\t// \n\t\t\t// niAlertIcon\n\t\t\t// \n\t\t\tthis.niAlertIcon.Icon = ((System.Drawing.Icon)(resources.GetObject(\"niAlertIcon.Icon\")));\n\t\t\tthis.niAlertIcon.Text = \"EVEMon notifications\";\n\t\t\tthis.niAlertIcon.BalloonTipClicked += new System.EventHandler(this.niAlertIcon_BalloonTipClicked);\n\t\t\tthis.niAlertIcon.Click += new System.EventHandler(this.niAlertIcon_Click);\n\t\t\tthis.niAlertIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(this.niAlertIcon_MouseClick);\n\t\t\t// \n\t\t\t// ofdOpenDialog\n\t\t\t// \n\t\t\tthis.ofdOpenDialog.Filter = \"Plan Files (*.emp)|*.emp|Plan Files (*.xml)|*.xml|All Files (*.*)|*.*\";\n\t\t\tthis.ofdOpenDialog.Title = \"Open Plan File\";\n\t\t\t// \n\t\t\t// tcCharacterTabs\n\t\t\t// \n\t\t\tthis.tcCharacterTabs.AllowDrop = true;\n\t\t\tthis.tcCharacterTabs.Controls.Add(this.tpOverview);\n\t\t\tthis.tcCharacterTabs.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.tcCharacterTabs.Location = new System.Drawing.Point(0, 49);\n\t\t\tthis.tcCharacterTabs.Multiline = true;\n\t\t\tthis.tcCharacterTabs.Name = \"tcCharacterTabs\";\n\t\t\tthis.tcCharacterTabs.Padding = new System.Drawing.Point(0, 0);\n\t\t\tthis.tcCharacterTabs.SelectedIndex = 0;\n\t\t\tthis.tcCharacterTabs.ShowToolTips = true;\n\t\t\tthis.tcCharacterTabs.Size = new System.Drawing.Size(600, 503);\n\t\t\tthis.tcCharacterTabs.SizeMode = System.Windows.Forms.TabSizeMode.FillToRight;\n\t\t\tthis.tcCharacterTabs.TabIndex = 0;\n\t\t\tthis.tcCharacterTabs.SelectedIndexChanged += new System.EventHandler(this.tcCharacterTabs_SelectedIndexChanged);\n\t\t\tthis.tcCharacterTabs.DragDrop += new System.Windows.Forms.DragEventHandler(this.tcCharacterTabs_DragDrop);\n\t\t\t// \n\t\t\t// tpOverview\n\t\t\t// \n\t\t\tthis.tpOverview.Controls.Add(this.overview);\n\t\t\tthis.tpOverview.Location = new System.Drawing.Point(4, 22);\n\t\t\tthis.tpOverview.Name = \"tpOverview\";\n\t\t\tthis.tpOverview.Size = new System.Drawing.Size(592, 477);\n\t\t\tthis.tpOverview.TabIndex = 0;\n\t\t\tthis.tpOverview.Text = \"Overview\";\n\t\t\tthis.tpOverview.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// overview\n\t\t\t// \n\t\t\tthis.overview.AutoScroll = true;\n\t\t\tthis.overview.BackColor = System.Drawing.Color.Transparent;\n\t\t\tthis.overview.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;\n\t\t\tthis.overview.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.overview.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.overview.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n\t\t\tthis.overview.Name = \"overview\";\n\t\t\tthis.overview.Size = new System.Drawing.Size(592, 477);\n\t\t\tthis.overview.TabIndex = 0;\n\t\t\tthis.overview.CharacterClicked += new System.EventHandler<EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs>(this.overview_CharacterClicked);\n\t\t\t// \n\t\t\t// trayIcon\n\t\t\t// \n\t\t\tthis.trayIcon.ContextMenuStrip = this.trayIconContextMenuStrip;\n\t\t\tthis.trayIcon.Icon = ((System.Drawing.Icon)(resources.GetObject(\"trayIcon.Icon\")));\n\t\t\tthis.trayIcon.MouseHoverTime = 300;\n\t\t\tthis.trayIcon.Text = \"\";\n\t\t\tthis.trayIcon.Click += new System.EventHandler(this.trayIcon_Click);\n\t\t\tthis.trayIcon.MouseHover += new System.EventHandler(this.trayIcon_MouseHover);\n\t\t\tthis.trayIcon.MouseLeave += new System.EventHandler(this.trayIcon_MouseLeave);\n\t\t\t// \n\t\t\t// tabLoadingLabel\n\t\t\t// \n\t\t\tthis.tabLoadingLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n\t\t\tthis.tabLoadingLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.tabLoadingLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n\t\t\tthis.tabLoadingLabel.Location = new System.Drawing.Point(0, 49);\n\t\t\tthis.tabLoadingLabel.Name = \"tabLoadingLabel\";\n\t\t\tthis.tabLoadingLabel.Size = new System.Drawing.Size(600, 503);\n\t\t\tthis.tabLoadingLabel.TabIndex = 7;\n\t\t\tthis.tabLoadingLabel.Text = \"Loading...\\r\\n\\r\\nPlease Wait.\";\n\t\t\tthis.tabLoadingLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n\t\t\t// \n\t\t\t// noCharactersLabel\n\t\t\t// \n\t\t\tthis.noCharactersLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n\t\t\tthis.noCharactersLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.noCharactersLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n\t\t\tthis.noCharactersLabel.Location = new System.Drawing.Point(0, 49);\n\t\t\tthis.noCharactersLabel.Name = \"noCharactersLabel\";\n\t\t\tthis.noCharactersLabel.Size = new System.Drawing.Size(600, 503);\n\t\t\tthis.noCharactersLabel.TabIndex = 8;\n\t\t\tthis.noCharactersLabel.Text = \"No character loaded or monitored\\r\\n\\r\\nTo add characters, click the File > Add API k\" +\n    \"ey... menu option\\r\\nTo monitor characters, click the File > Manage API Keys... me\" +\n    \"nu option\";\n\t\t\tthis.noCharactersLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n\t\t\t// \n\t\t\t// mainLoadingThrobber\n\t\t\t// \n\t\t\tthis.mainLoadingThrobber.Anchor = System.Windows.Forms.AnchorStyles.None;\n\t\t\tthis.mainLoadingThrobber.Location = new System.Drawing.Point(285, 314);\n\t\t\tthis.mainLoadingThrobber.MaximumSize = new System.Drawing.Size(24, 24);\n\t\t\tthis.mainLoadingThrobber.MinimumSize = new System.Drawing.Size(24, 24);\n\t\t\tthis.mainLoadingThrobber.Name = \"mainLoadingThrobber\";\n\t\t\tthis.mainLoadingThrobber.Size = new System.Drawing.Size(24, 24);\n\t\t\tthis.mainLoadingThrobber.State = EVEMon.Common.Enumerations.ThrobberState.Rotating;\n\t\t\tthis.mainLoadingThrobber.TabIndex = 1;\n\t\t\tthis.mainLoadingThrobber.TabStop = false;\n\t\t\t// \n\t\t\t// notificationList\n\t\t\t// \n\t\t\tthis.notificationList.Dock = System.Windows.Forms.DockStyle.Bottom;\n\t\t\tthis.notificationList.Font = new System.Drawing.Font(\"Microsoft Sans Serif\", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(161)));\n\t\t\tthis.notificationList.Location = new System.Drawing.Point(0, 552);\n\t\t\tthis.notificationList.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.notificationList.Name = \"notificationList\";\n\t\t\tthis.notificationList.Size = new System.Drawing.Size(600, 72);\n\t\t\tthis.notificationList.TabIndex = 6;\n\t\t\t// \n\t\t\t// MainWindow\n\t\t\t// \n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n\t\t\tthis.ClientSize = new System.Drawing.Size(600, 646);\n\t\t\tthis.Controls.Add(this.tcCharacterTabs);\n\t\t\tthis.Controls.Add(this.mainLoadingThrobber);\n\t\t\tthis.Controls.Add(this.tabLoadingLabel);\n\t\t\tthis.Controls.Add(this.noCharactersLabel);\n\t\t\tthis.Controls.Add(this.notificationList);\n\t\t\tthis.Controls.Add(this.statusStrip);\n\t\t\tthis.Controls.Add(this.mainToolBar);\n\t\t\tthis.Controls.Add(this.mainMenuBar);\n\t\t\tthis.MainMenuStrip = this.mainMenuBar;\n\t\t\tthis.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);\n\t\t\tthis.MinimumSize = new System.Drawing.Size(614, 344);\n\t\t\tthis.Name = \"MainWindow\";\n\t\t\tthis.trayIconContextMenuStrip.ResumeLayout(false);\n\t\t\tthis.statusStrip.ResumeLayout(false);\n\t\t\tthis.statusStrip.PerformLayout();\n\t\t\tthis.mainMenuBar.ResumeLayout(false);\n\t\t\tthis.mainMenuBar.PerformLayout();\n\t\t\tthis.toolbarContext.ResumeLayout(false);\n\t\t\tthis.mainToolBar.ResumeLayout(false);\n\t\t\tthis.mainToolBar.PerformLayout();\n\t\t\tthis.tcCharacterTabs.ResumeLayout(false);\n\t\t\tthis.tpOverview.ResumeLayout(false);\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.mainLoadingThrobber)).EndInit();\n\t\t\tthis.ResumeLayout(false);\n\t\t\tthis.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.StatusStrip statusStrip;\n        private System.Windows.Forms.ToolStripStatusLabel lblStatus;\n        private System.Windows.Forms.ContextMenuStrip trayIconContextMenuStrip;\n        private System.Windows.Forms.ToolStripMenuItem restoreToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem closeToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem planToolStripMenuItem;\n        private EVEMon.Common.Controls.DraggableTabControl tcCharacterTabs;\n        private System.Windows.Forms.SaveFileDialog saveFileDialog;\n        private System.Windows.Forms.OpenFileDialog openFileDialog;\n        private System.Windows.Forms.ToolStripStatusLabel lblServerStatus;\n        private System.Windows.Forms.MenuStrip mainMenuBar;\n        private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem manageAPIKeysMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem saveSettingsToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem loadSettingsToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator fileRestoreResetToolStripSeparator;\n        private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem aboutMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem resetSettingsToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator fileResetExitToolStripSeparator;\n        private System.Windows.Forms.ToolStripMenuItem exportCharacterMenu;\n        private System.Windows.Forms.ToolStripSeparator fileExportSaveToolStripSeparator;\n        private System.Windows.Forms.ToolStripMenuItem plansToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem tsmiManagePlans;\n        private System.Windows.Forms.ToolStripMenuItem tsmiNewPlan;\n        private System.Windows.Forms.ToolStripStatusLabel lblTraining;\n        private System.Windows.Forms.ContextMenuStrip toolbarContext;\n        private System.Windows.Forms.ToolStripMenuItem menubarToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem toolbarToolStripMenuItem;\n        private System.Windows.Forms.ToolStrip mainToolBar;\n        private System.Windows.Forms.ToolStripButton apiKeysManagementTbMenu;\n        private System.Windows.Forms.ToolStripSeparator apiKeysSettingsToolStripSeparator;\n        private System.Windows.Forms.ToolStripDropDownButton tsdbSettings;\n        private System.Windows.Forms.ToolStripMenuItem tsSaveSettings;\n        private System.Windows.Forms.ToolStripMenuItem tsLoadSettings;\n        private System.Windows.Forms.ToolStripSeparator settingsToolStripSeparator;\n        private System.Windows.Forms.ToolStripButton tsbMineralSheet;\n        private System.Windows.Forms.ToolStripButton skillsPieChartTbMenu;\n        private System.Windows.Forms.ToolStripButton tsbSchedule;\n        private System.Windows.Forms.ToolStripButton tsbOptions;\n        private System.Windows.Forms.ToolStripButton tsbAbout;\n        private System.Windows.Forms.ToolStripButton tsbManagePlans;\n        private System.Windows.Forms.ToolStripDropDownButton plansTbMenu;\n        private System.Windows.Forms.ToolStripSeparator plansToolStripSeparator;\n        private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem copySkillsToClipboardBBFormatToolStripMenuItem;\n        private EVEMon.Common.Controls.TrayIcon trayIcon;\n        private System.Windows.Forms.ToolStripSeparator helpAboutKnownProblemsToolStripSeparator;\n        private System.Windows.Forms.ToolStripMenuItem forumsMenuItem;\n        private EVEMon.Controls.NotificationList notificationList;\n        private System.Windows.Forms.NotifyIcon niAlertIcon;\n        private System.Windows.Forms.ToolStripMenuItem addAPIKeyMenu;\n        private System.Windows.Forms.ToolStripMenuItem deleteCharacterMenu;\n        private System.Windows.Forms.ToolStripSeparator fileManagerHideToolStripSeparator;\n        private System.Windows.Forms.ToolStripMenuItem hideCharacterMenu;\n        private System.Windows.Forms.ToolStripButton addAPIKeyTbMenu;\n        private System.Windows.Forms.ToolStripMenuItem tsmiImportPlanFromFile;\n        private System.Windows.Forms.OpenFileDialog ofdOpenDialog;\n        private System.Windows.Forms.ToolStripMenuItem testsToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem exceptionWindowToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem exceptionWindowRecursiveExceptionToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator plansStripSeparator;\n        private System.Windows.Forms.ToolStripMenuItem issuesFeaturesMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem testTrayToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator testsToolStripSeperator;\n        private System.Windows.Forms.ToolStripMenuItem testNotificationToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem trayTestNotificationTSMI;\n        private System.Windows.Forms.ToolStripMenuItem testCharacterNotificationToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem trayTestCharacterNotificationTSMI;\n        private System.Windows.Forms.ToolStripMenuItem testTimeoutOneSecToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem clearCacheToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator plansSeparator;\n        private System.Windows.Forms.ToolStripButton characterComparisonToolStripButton;\n        private System.Windows.Forms.ToolStripSeparator manageCharacterToolStripSeparator;\n        private System.Windows.Forms.ToolStripSeparator cacheResetToolStripSeparator;\n        private System.Windows.Forms.ToolStripButton exitToolStripButton;\n        private System.Windows.Forms.ToolStripSeparator exitToolStripSeparator;\n        private System.Windows.Forms.ToolStripSeparator toolsToolStripSeparator;\n        private System.Windows.Forms.ToolStripDropDownButton manageCharacterTbMenu;\n        private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;\n        private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2;\n        private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3;\n        private System.Windows.Forms.ToolStripButton clearCacheToolStripButton;\n        private System.Windows.Forms.ToolStripButton resetSettingsToolStripButton;\n        private System.Windows.Forms.ToolStripButton tsbImplantGroups;\n        private System.Windows.Forms.ToolStripButton tsbShowOwned;\n        private System.Windows.Forms.Label tabLoadingLabel;\n        private System.Windows.Forms.Label noCharactersLabel;\n        private System.Windows.Forms.TabPage tpOverview;\n        private Controls.Overview overview;\n        private System.Windows.Forms.ToolStripStatusLabel toolStripStatusSpacerLabel;\n        private System.Windows.Forms.ToolStripStatusLabel lblCSSProviderStatus;\n        private Common.Controls.Throbber mainLoadingThrobber;\n        private System.Windows.Forms.ToolStripMenuItem restartToolStripMenuItem;\n        private System.Windows.Forms.ToolStripProgressBar tsDatafilesLoadingProgressBar;\n        private System.Windows.Forms.ToolStripMenuItem tsmiCreatePlanFromSkillQueue;\n        private System.Windows.Forms.ToolStripMenuItem readTheDocsManualToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem charactersComparisonMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem dataBrowserMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem skillBrowserMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem certificateBrowserMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem shipBrowserMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem itemBrowserMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem blueprintBrowserMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem skillsPieChartMenuItem;\n        private System.Windows.Forms.ToolStripSeparator firstSeparator;\n        private System.Windows.Forms.ToolStripMenuItem implantsMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem showOwnedSkillbooksMenuItem;\n        private System.Windows.Forms.ToolStripSeparator secondSeparator;\n        private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem blankCreatorToolStripMenuItem;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/MainWindow.cs",
    "content": "using EVEMon.About;\nusing EVEMon.ApiCredentialsManagement;\nusing EVEMon.BlankCharacter;\nusing EVEMon.CharacterMonitoring;\nusing EVEMon.CharactersComparison;\nusing EVEMon.Common;\nusing EVEMon.Common.CloudStorageServices;\nusing EVEMon.Common.Collections.Global;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Notifications;\nusing EVEMon.Common.Properties;\nusing EVEMon.Common.Scheduling;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.DetailsWindow;\nusing EVEMon.ImplantControls;\nusing EVEMon.LogitechG15;\nusing EVEMon.NotificationWindow;\nusing EVEMon.PieChart;\nusing EVEMon.SettingsUI;\nusing EVEMon.SkillPlanner;\nusing EVEMon.Updater;\nusing EVEMon.Watchdog;\nusing EVEMon.WindowsApi;\nusing Microsoft.Win32;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Media;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\n\nnamespace EVEMon\n{\n    public sealed partial class MainWindow : EVEMonForm\n    {\n        #region Fields\n\n        private readonly List<NotificationEventArgs> m_popupNotifications = new List<NotificationEventArgs>();\n        private readonly bool m_startMinimized;\n\n        private Form m_trayPopup;\n        private DateTime m_nextPopupUpdate = DateTime.UtcNow;\n        private ToolStripItem[] m_characterEnabledMenuItems;\n        private ToolStripItem[] m_settingsEnabledMenuItems;\n\n        private string m_apiProviderName;\n        private bool m_isMouseClicked;\n        private bool m_isUpdating;\n        private bool m_isUpdatingData;\n        private bool m_isShowingUpdateWindow;\n        private bool m_isShowingDataUpdateWindow;\n        private bool m_isUpdatingTabOrder;\n        private bool m_isUpdateEventsSubscribed;\n        private bool m_initialized;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public MainWindow()\n        {\n            InitializeComponent();\n\n            RememberPositionKey = \"MainWindow\";\n            notificationList.Notifications = null;\n\n            tabLoadingLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n            noCharactersLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n\n            noCharactersLabel.Hide();\n\n            trayIcon.Text = EveMonClient.FileVersionInfo.ProductName;\n\n            lblStatus.Text = $\"EVE Time: {DateTime.UtcNow:HH:mm}\";\n            lblServerStatus.Text = $\"|  {EveMonClient.EVEServer?.StatusText ?? EveMonConstants.UnknownText}\";\n\n            tsDatafilesLoadingProgressBar.Step =\n                (int)Math.Ceiling((double)tsDatafilesLoadingProgressBar.Maximum / EveMonClient.Datafiles.Count);\n\n            foreach (ToolStripItem item in mainMenuBar.Items)\n            {\n                item.MouseDown += mainMenuBar_MouseDown;\n                item.MouseMove += mainMenuBar_MouseMove;\n            }\n\n            foreach (ToolStripItem item in mainToolBar.Items)\n            {\n                item.MouseDown += mainToolBar_MouseDown;\n                item.MouseMove += mainToolBar_MouseMove;\n            }\n\n            if (EveMonClient.IsDebugBuild)\n                DisplayTestMenu();\n\n            m_startMinimized = Environment.GetCommandLineArgs().Contains(\"-startMinimized\");\n        }\n\n        /// <summary>\n        /// Forces cleanup, we will jump from 50MB to less than 10MB.\n        /// </summary>\n        private static void TriggerAutoShrink()\n        {\n            // Quit if the client has been shut down\n            if (EveMonClient.Closed)\n                return;\n\n            AutoShrink.Dirty(TimeSpan.FromSeconds(5).Seconds);\n        }\n\n        #endregion\n\n\n        #region Loading, closing, resizing, etc\n\n        /// <summary>\n        /// Once the window is loaded, we complete initialization.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode)\n                return;\n\n            m_apiProviderName = EveMonClient.APIProviders?.CurrentProvider?.Name;\n\n            // Collext the menu buttons that get enabled by a character\n            m_characterEnabledMenuItems = new ToolStripItem[]\n            {\n                hideCharacterMenu, deleteCharacterMenu, exportCharacterMenu,\n                skillsPieChartMenuItem, implantsMenuItem, showOwnedSkillbooksMenuItem,\n                manageCharacterTbMenu,plansTbMenu, tsbManagePlans,\n                skillsPieChartTbMenu, tsbImplantGroups, tsbShowOwned\n            };\n\n            m_settingsEnabledMenuItems = new ToolStripItem[]\n            {\n                loadSettingsToolStripMenuItem, resetSettingsToolStripMenuItem,\n                saveSettingsToolStripMenuItem, exitToolStripMenuItem,\n                dataBrowserMenuItem, blankCreatorToolStripMenuItem,\n                optionsToolStripMenuItem,\n\n                resetSettingsToolStripButton, exitToolStripButton, tsbOptions,\n                closeToolStripMenuItem\n            };\n\n            // Start minimized ?\n            if (m_startMinimized)\n            {\n                WindowState = FormWindowState.Minimized;\n                ShowInTaskbar = Settings.UI.MainWindowCloseBehaviour == CloseBehaviour.MinimizeToTaskbar\n                                || Settings.UI.SystemTrayIcon == SystemTrayBehaviour.Disabled;\n                Visible = ShowInTaskbar;\n            }\n\n            // Start the one-second timer \n            EveMonClient.Run(Thread.CurrentThread);\n\n            // Check with NIST that the local clock is synchronized\n            TimeCheck.ScheduleCheck(TimeSpan.FromSeconds(1));\n\n            // Notify Gooogle Analytics about start up\n            GAnalyticsTracker.TrackStart(GetType());\n\n            // Prepare control's visibility\n            menubarToolStripMenuItem.Checked = mainMenuBar.Visible = Settings.UI.MainWindow.ShowMenuBar;\n            toolbarToolStripMenuItem.Checked = mainToolBar.Visible = !Settings.UI.MainWindow.ShowMenuBar;\n\n            // Prepare settings controls\n            UpdateSettingsControlsVisibility(enabled: false);\n\n            // Show the tab control according to Overview settings\n            tcCharacterTabs.Visible = Settings.UI.MainWindow.ShowOverview;\n\n            // Updates the controls visibility according to settings\n            UpdateControlsVisibility();\n\n            // Subscribe events\n            TimeCheck.TimeCheckCompleted += TimeCheck_TimeCheckCompleted;\n            GlobalDatafileCollection.LoadingProgress += GlobalDatafileCollection_LoadingProgress;\n            EveMonClient.NotificationSent += EveMonClient_NotificationSent;\n            EveMonClient.NotificationInvalidated += EveMonClient_NotificationInvalidated;\n            EveMonClient.MonitoredCharacterCollectionChanged += EveMonClient_MonitoredCharacterCollectionChanged;\n            EveMonClient.ServerStatusUpdated += EveMonClient_ServerStatusUpdated;\n            EveMonClient.QueuedSkillsCompleted += EveMonClient_QueuedSkillsCompleted;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.CharacterLabelChanged += EveMonClient_CharacterLabelChanged;\n            SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged;\n\n            EveMonClient.Trace(\"Main window - loaded\", printMethod: false);\n        }\n\n        /// <summary>\n        /// Occurs when the window is shown.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override async void OnShown(EventArgs e)\n        {\n            base.OnShown(e);\n\n            if (!m_initialized)\n                await InitializeData();\n\n            // Welcome message\n            TipWindow.ShowTip(this, \"startup\", \"Getting Started\", Properties.Resources.\n                MessageGettingStarted);\n        }\n\n        /// <summary>\n        /// Initializes the data.\n        /// </summary>\n        /// <returns></returns>\n        private async Task InitializeData()\n        {\n            // Load static data\n            await GlobalDatafileCollection.LoadAsync();\n\n            // Load cache data\n            await TaskHelper.RunIOBoundTaskAsync(() => {\n                EveIDToName.InitializeFromFile();\n                EveIDToStation.InitializeFromFile();\n            });\n\n            // Load characters related settings\n            await Settings.ImportDataAsync();\n\n            // Initialize G15\n            if (OSFeatureCheck.IsWindowsNT)\n                G15Handler.Initialize();\n\n            m_initialized = true;\n\n            // Force cleanup\n            TriggerAutoShrink();\n        }\n\n        /// <summary>\n        /// Occurs whenever the display settings change, which could include an orientation\n        /// change. For some reason, even though this might effectively resize the window, no\n        /// resize event is sent by Windows Forms.\n        /// </summary>\n        private void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e)\n        {\n            if (!m_initialized)\n                return;\n\n            if (Visible)\n                tcCharacterTabs.PerformLayout();\n        }\n\n        /// <summary>\n        /// Occurs whenever the window is resized.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnResize(EventArgs e)\n        {\n            base.OnResize(e);\n\n            if (!m_initialized)\n                return;\n\n            UpdateStatusLabel();\n            UpdateWindowTitle();\n            UpdateNotifications();\n\n            // Updates tray icon visibility\n            if (WindowState != FormWindowState.Minimized &&\n                Settings.UI.MainWindowCloseBehaviour != CloseBehaviour.MinimizeToTaskbar)\n            {\n                return;\n            }\n\n            trayIcon.Visible = Settings.UI.SystemTrayIcon == SystemTrayBehaviour.AlwaysVisible ||\n                               (Settings.UI.SystemTrayIcon == SystemTrayBehaviour.ShowWhenMinimized &&\n                                WindowState == FormWindowState.Minimized);\n\n            Visible = Settings.UI.MainWindowCloseBehaviour == CloseBehaviour.MinimizeToTaskbar ||\n                Settings.UI.SystemTrayIcon == SystemTrayBehaviour.Disabled;\n        }\n\n        /// <summary>\n        /// Occurs when the form is going to be closed. \n        /// We may decide to cancel the closing and rather minimize to tray bar.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            // Is there a reason that we should really close the window\n            if (!Visible || m_isUpdating || m_isUpdatingData || e.CloseReason == CloseReason.ApplicationExitCall ||\n                e.CloseReason == CloseReason.TaskManagerClosing || e.CloseReason == CloseReason.WindowsShutDown)\n            {\n                GAnalyticsTracker.TrackEnd(GetType());\n                return;\n            }\n\n            // Should we actually exit ?\n            if (Settings.UI.MainWindowCloseBehaviour == CloseBehaviour.Exit)\n            {\n                // Prevents the closing if we are restoring the settings at that time \n                // or we are still initializing\n                // or user has set to upload to cloud storage service provider and it fails\n                e.Cancel = Settings.IsRestoring || !m_initialized || !TryUploadToCloudStorageProviderAsync().Result;\n\n                return;\n            }\n\n            // If the user has right clicked the task bar item while\n            // this window is minimized, and chosen close then the\n            // following will evaluate to false and EVEMon will close\n            if (WindowState == FormWindowState.Minimized)\n                return;\n\n            // Cancel the close operation and minimize the window\n            // Display of the tray icon and window will be handled by \n            // MainWindow_Resize\n            e.Cancel = true;\n            WindowState = FormWindowState.Minimized;\n        }\n\n        /// <summary>\n        /// When closing, ensures we're leaving with a proper state.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosed(FormClosedEventArgs e)\n        {\n            base.OnFormClosed(e);\n\n            // Hide the system tray icons\n            niAlertIcon.Visible = false;\n            trayIcon.Visible = false;\n\n            // Unsubscribe events\n            SystemEvents.DisplaySettingsChanged -= SystemEvents_DisplaySettingsChanged;\n            TimeCheck.TimeCheckCompleted -= TimeCheck_TimeCheckCompleted;\n            GlobalDatafileCollection.LoadingProgress -= GlobalDatafileCollection_LoadingProgress;\n            EveMonClient.NotificationSent -= EveMonClient_NotificationSent;\n            EveMonClient.NotificationInvalidated -= EveMonClient_NotificationInvalidated;\n            EveMonClient.MonitoredCharacterCollectionChanged -= EveMonClient_MonitoredCharacterCollectionChanged;\n            EveMonClient.ServerStatusUpdated -= EveMonClient_ServerStatusUpdated;\n            EveMonClient.QueuedSkillsCompleted -= EveMonClient_QueuedSkillsCompleted;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n        }\n\n        /// <summary>\n        /// On minimizing, we force garbage collection.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnDeactivate(EventArgs e)\n        {\n            base. OnDeactivate(e);\n\n            // Only cleanup if we're deactivating to the minimized state (e.g. systray)\n            if (WindowState == FormWindowState.Minimized)\n                TriggerAutoShrink();\n        }\n\n        /// <summary>\n        /// Callback for time synchronization.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"TimeCheckSyncEventArgs\"/> instance containing the event data.</param>\n        private void TimeCheck_TimeCheckCompleted(object sender, TimeCheckSyncEventArgs e)\n        {\n            if (!Settings.Updates.CheckTimeOnStartup || e.IsSynchronised ||\n                (e.ServerTimeToLocalTime == DateTime.MinValue.ToLocalTime()))\n            {\n                return;\n            }\n\n            using (TimeCheckNotification timeDialog = new TimeCheckNotification(e.ServerTimeToLocalTime, e.LocalTime))\n            {\n                timeDialog.ShowDialog(this);\n            }\n        }\n\n        #endregion\n\n\n        #region Tabs management\n\n        /// <summary>\n        /// Occurs when a character's label is changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterLabelChanged(object sender, LabelChangedEventArgs e)\n        {\n            if (!m_isUpdatingTabOrder)\n                UpdateTabs();\n        }\n\n        /// <summary>\n        /// Occurs when the monitored characters collection is changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_MonitoredCharacterCollectionChanged(object sender, EventArgs e)\n        {\n            if (m_isUpdatingTabOrder)\n                return;\n\n            mainLoadingThrobber.State = ThrobberState.Stopped;\n            mainLoadingThrobber.Hide();\n            tabLoadingLabel.Hide();\n\n            UpdateSettingsControlsVisibility(enabled: true);\n\n            UpdateTabs();\n        }\n\n        /// <summary>\n        /// Updates the tab pages.\n        /// </summary>\n        private void UpdateTabs()\n        {\n            // Layouts the tab pages\n            LayoutTabPages();\n\n            // Updates the controls related to tab selection\n            UpdateControlsOnTabSelectionChange();\n        }\n\n        /// <summary>\n        /// Layouts the tab pages.\n        /// </summary>\n        private void LayoutTabPages()\n        {\n            this.LockWindowUpdate(true);\n\n            try\n            {\n                TabPage selectedTab = tcCharacterTabs.SelectedTab;\n\n                // Collect the existing pages\n                Dictionary<Character, TabPage> pages = tcCharacterTabs.TabPages.Cast<TabPage>().Where(\n                    page => page.Tag is Character).ToDictionary(page => (Character)page.Tag);\n\n                // Rebuild the pages\n                int index = 0;\n                foreach (Character character in EveMonClient.MonitoredCharacters)\n                {\n                    // Retrieve the current page, or null if we're past the limits\n                    TabPage currentPage = index < tcCharacterTabs.TabCount ? tcCharacterTabs.TabPages[index] : null;\n\n                    // Is it the overview ? We'll deal with it later\n                    if (currentPage == tpOverview)\n                        currentPage = ++index < tcCharacterTabs.TabCount ? tcCharacterTabs.TabPages[index] : null;\n\n                    // Does the page match with the character ?\n                    if ((Character)currentPage?.Tag == character)\n                        // Update the text in case label changed\n                        currentPage.Text = character.LabelPrefix + character.Name;\n                    else\n                    {\n                        // Retrieve the page when it was previously created\n                        // Is the page later in the collection ?\n                        TabPage page;\n                        if (pages.TryGetValue(character, out page))\n                            tcCharacterTabs.TabPages.Remove(page); // Remove the page from old location\n                        else\n                            page = CreateTabPage(character); // Create a new page\n\n                        // Inserts the page in the proper location\n                        tcCharacterTabs.TabPages.Insert(index, page);\n                    }\n\n                    // Remove processed character from the dictionary and move forward\n                    if (character != null)\n                        pages.Remove(character);\n\n                    index++;\n                }\n\n                // Ensures the overview has been added when necessary\n                AddOverviewTab();\n\n                // Dispose the removed tabs\n                foreach (TabPage page in pages.Values)\n                {\n                    page.Dispose();\n                }\n\n                // Reselect\n                if (selectedTab != null && tcCharacterTabs.TabPages.Contains(selectedTab))\n                    tcCharacterTabs.SelectedTab = selectedTab;\n                else if (tcCharacterTabs.TabCount > 0)\n                    tcCharacterTabs.SelectedTab = tcCharacterTabs.TabPages[0];\n            }\n            finally\n            {\n                tcCharacterTabs.Visible = tcCharacterTabs.Controls.Count > 0;\n                this.LockWindowUpdate(false);\n            }\n        }\n\n        /// <summary>\n        /// Adds the overview tab.\n        /// </summary>\n        private void AddOverviewTab()\n        {\n            if (tpOverview == null)\n                return;\n\n            if (Settings.UI.MainWindow.ShowOverview)\n            {\n                // Trim the overview page index\n                int overviewIndex = Math.Max(0, Math.Min(tcCharacterTabs.TabCount - 1,\n                    Settings.UI.MainWindow.OverviewIndex));\n\n                // Inserts it if it doesn't exist\n                if (!tcCharacterTabs.TabPages.Contains(tpOverview))\n                    tcCharacterTabs.TabPages.Insert(overviewIndex, tpOverview);\n\n                // If it exist insert it at the correct position\n                if (tcCharacterTabs.TabPages.IndexOf(tpOverview) != overviewIndex)\n                {\n                    tcCharacterTabs.TabPages.Remove(tpOverview);\n                    tcCharacterTabs.TabPages.Insert(overviewIndex, tpOverview);\n                }\n\n                // Select the Overview tab if it's the only tab\n                if (tcCharacterTabs.TabCount == 1)\n                    tcCharacterTabs.SelectedTab = tpOverview;\n\n                return;\n            }\n\n            // Or remove it when it should not be here anymore\n            if (tcCharacterTabs.TabPages.Contains(tpOverview))\n                tcCharacterTabs.TabPages.Remove(tpOverview);\n        }\n\n        /// <summary>\n        /// Creates the tab page for the given character.\n        /// </summary>\n        /// <param name=\"character\">The character</param>\n        /// <returns>A tab page.</returns>\n        private static TabPage CreateTabPage(Character character)\n        {\n            // Create the tab\n            TabPage page;\n            TabPage tempPage = null;\n            try\n            {\n                tempPage = new TabPage(character.LabelPrefix + character.Name);\n                tempPage.UseVisualStyleBackColor = true;\n                tempPage.Padding = new Padding(5);\n                tempPage.Tag = character;\n\n                // Create the character monitor\n                CreateCharacterMonitor(character, tempPage);\n\n                page = tempPage;\n                tempPage = null;\n            }\n            finally\n            {\n                tempPage?.Dispose();\n            }\n\n            return page;\n        }\n\n        /// <summary>\n        /// Creates the character monitor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"tabPage\">The tab page.</param>\n        private static void CreateCharacterMonitor(Character character, Control tabPage)\n        {\n            CharacterMonitor tempMonitor = null;\n            try\n            {\n                tempMonitor = new CharacterMonitor(character);\n                tempMonitor.Parent = tabPage;\n                tempMonitor.Dock = DockStyle.Fill;\n\n                CharacterMonitor monitor = tempMonitor;\n                tempMonitor = null;\n                tabPage.Controls.Add(monitor);\n            }\n            finally\n            {\n                tempMonitor?.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// When tabs are moved by the user (through drag'n drop), we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tcCharacterTabs_DragDrop(object sender, DragEventArgs e)\n        {\n            Settings.UI.MainWindow.OverviewIndex = tcCharacterTabs.TabPages.IndexOf(tpOverview);\n\n            IEnumerable<Character> order = tcCharacterTabs.TabPages.Cast<TabPage>().Where(\n                page => page.Tag is Character).Select(page => page.Tag as Character);\n\n            m_isUpdatingTabOrder = true;\n            EveMonClient.MonitoredCharacters.Update(order);\n            m_isUpdatingTabOrder = false;\n        }\n\n        /// <summary>\n        /// Occurs whenever the user changes the tabs selection.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tcCharacterTabs_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            UpdateControlsOnTabSelectionChange();\n        }\n\n        /// <summary>\n        /// Enables / disables the menu buttons (remove chars, plans, etc).\n        /// </summary>\n        private void UpdateControlsOnTabSelectionChange()\n        {\n            // Enable or disable the menu buttons\n            foreach (ToolStripItem item in m_characterEnabledMenuItems)\n            {\n                item.Enabled = GetCurrentCharacter() != null;\n            }\n        }\n\n        /// <summary>\n        /// When a character is clicked on the overview, select the appropriate tab.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void overview_CharacterClicked(object sender, CharacterChangedEventArgs e)\n        {\n            foreach (TabPage tab in tcCharacterTabs.TabPages.Cast<TabPage>().Select(\n                tab => new { tab, character = tab.Tag as Character }).Where(\n                    tab => tab.character == e.Character).Select(character => character.tab))\n            {\n                tcCharacterTabs.SelectedTab = tab;\n                return;\n            }\n        }\n\n        /// <summary>\n        /// Gets the currently selected character; or null when the tabs selection does not match.\n        /// </summary>\n        /// <returns></returns>\n        private Character GetCurrentCharacter() => tcCharacterTabs.SelectedTab?.Tag as Character;\n\n        /// <summary>\n        /// Gets the currently selected monitor; or null when the tabs selection does not match.\n        /// </summary>\n        /// <returns></returns>\n        private CharacterMonitor GetCurrentMonitor()\n        {\n            if (tcCharacterTabs.SelectedTab == null || tcCharacterTabs.SelectedTab.Controls.Count == 0)\n                return null;\n\n            return tcCharacterTabs.SelectedTab.Controls[0] as CharacterMonitor;\n        }\n\n        /// <summary>\n        /// Handles the LoadingProgress event of the GlobalDatafileCollection control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\" /> instance containing the event data.</param>\n        private void GlobalDatafileCollection_LoadingProgress(object sender, EventArgs e)\n        {\n            tsDatafilesLoadingProgressBar.PerformStep();\n        }\n\n        #endregion\n\n\n        #region Notifications, server status change, skill completion sound\n\n        /// <summary>\n        /// Occurs when the server status is updated.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_ServerStatusUpdated(object sender, EveServerEventArgs e)\n        {\n            lblServerStatus.Text = $\"|  {e.Server.StatusText}\";\n        }\n\n        /// <summary>\n        /// Update the notifications list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_NotificationInvalidated(object sender, NotificationInvalidationEventArgs e)\n        {\n            UpdateNotifications();\n        }\n\n        /// <summary>\n        /// Update the notifications list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_NotificationSent(object sender, NotificationEventArgs e)\n        {\n            // Updates the notifications list of the main window\n            UpdateNotifications();\n\n            // Takes care of the tooltip\n            NotificationCategorySettings catSettings = Settings.Notifications.Categories[e.Category];\n            ToolTipNotificationBehaviour behaviour = catSettings.ToolTipBehaviour;\n            if (behaviour == ToolTipNotificationBehaviour.Never)\n                return;\n\n            // Add and reorder by API key and character\n            m_popupNotifications.Add(e);\n\n            // Group by API key\n            IEnumerable<IGrouping<long, NotificationEventArgs>> groups = m_popupNotifications\n                .GroupBy(\n                    notification =>\n                    {\n                        // It's an API server related notification\n                        if (notification.Sender == null)\n                            return 0;\n\n                        // It's an API key related notification\n                        if (notification.SenderAPIKey != null)\n                            return notification.SenderAPIKey.ID;\n\n                        // It's a corporation related notification\n                        if (notification.SenderCorporation != null)\n                            return notification.SenderCorporation.ID;\n\n                        // It's a character related notification\n                        return notification.SenderCharacter is UriCharacter\n                            ? 1\n                            : notification.SenderCharacter.CharacterID;\n                    });\n\n            // Add every group, order by character's name, accounts being on top\n            List<NotificationEventArgs> newList = new List<NotificationEventArgs>();\n            foreach (IGrouping<long, NotificationEventArgs> group in groups)\n            {\n                newList.AddRange(group.OrderBy(x => x.SenderCharacter?.Name ?? string.Empty));\n            }\n\n            m_popupNotifications.Clear();\n            m_popupNotifications.AddRange(newList);\n\n            // If the info must be presented once only, schedule a deletion\n            if (behaviour == ToolTipNotificationBehaviour.Once)\n            {\n                NotificationEventArgs.ScheduleAction(TimeSpan.FromMinutes(1),\n                    () =>\n                    {\n                        if (!m_popupNotifications.Contains(e))\n                            return;\n\n                        m_popupNotifications.Remove(e);\n\n                        if (m_popupNotifications.Count == 0)\n                            niAlertIcon.Visible = false;\n                    });\n            }\n\n            // Now check whether we must \n            DisplayTooltipNotifications();\n        }\n\n        /// <summary>\n        /// Update the notifications list.\n        /// </summary>\n        private void UpdateNotifications()\n        {\n            if (WindowState == FormWindowState.Minimized)\n                return;\n\n            notificationList.Notifications = EveMonClient.Notifications.Where(x => x.Sender == null || x.SenderAPIKey != null);\n        }\n\n        /// <summary>\n        /// Displays the tooltip.\n        /// </summary>\n        private void DisplayTooltipNotifications()\n        {\n            // Ensures the active entries do not prohibit EVEMon to fire tooltips\n            if (Scheduler.SilentMode)\n            {\n                niAlertIcon.Visible = false;\n                return;\n            }\n\n            int maxlevel = 0,\n                textlenght = 0,\n                count = 0;\n            object lastSender = m_popupNotifications[0].Sender;\n            StringBuilder builder = new StringBuilder();\n\n            // We build the tooltip notification text\n            foreach (NotificationEventArgs notification in m_popupNotifications)\n            {\n                // Tooltip notification text space is limited \n                // so we apply restrains in how many notifications will be shown\n                if (textlenght <= 100)\n                {\n                    bool senderIsCharacter = (notification.Sender != null) &&\n                                             (notification.Sender == notification.SenderCharacter);\n\n                    bool senderIsCorporation = (notification.Sender != null) &&\n                                               (notification.Sender == notification.SenderCorporation);\n\n                    string tooltipText = notification.ToString();\n                    maxlevel = Math.Max(maxlevel, (int)notification.Priority);\n                    int level = (int)notification.Priority;\n\n                    if (notification.Sender != lastSender)\n                        builder.AppendLine();\n\n                    lastSender = notification.Sender;\n\n#if false\n                    if (senderIsCharacter || senderIsCorporation)\n                    {\n                        switch (level)\n                        {\n                            case 0:\n                                tooltipText = tooltipText.Replace(\".\",\n                                    $\" for {(senderIsCharacter ? notification.SenderCharacter.Name : notification.SenderCorporation.Name)}.\");\n                                break;\n                            case 1:\n                                tooltipText = tooltipText.Replace(\"This character\", senderIsCharacter\n                                    ? notification.SenderCharacter.Name\n                                    : notification.SenderCorporation.Name);\n\n                                break;\n                            case 2:\n                                tooltipText = tooltipText.Replace(\".\",\n                                    $\" of {(senderIsCharacter ? notification.SenderCharacter.Name : notification.SenderCorporation.Name)}.\");\n                                break;\n                        }\n                    }\n#endif\n\n                    builder.AppendLine(tooltipText);\n                }\n                // When the text gets too long we add an informative text once\n                else if (count == 0)\n                {\n                    builder.AppendLine(\"\\r\\nMore notifications are available.\\nCheck character monitor for more information.\");\n                    count++;\n                }\n\n                textlenght = builder.Length;\n            }\n            niAlertIcon.BalloonTipText = builder.ToString();\n\n            // Icon \n            // (In Win7 icon is displayed only when there is a BalloonTipTitle present,\n            // which makes this part of the code useless)\n            switch (maxlevel)\n            {\n                case 0:\n                    niAlertIcon.BalloonTipIcon = ToolTipIcon.Info;\n                    break;\n                case 1:\n                    niAlertIcon.BalloonTipIcon = ToolTipIcon.Warning;\n                    break;\n                case 2:\n                    niAlertIcon.BalloonTipIcon = ToolTipIcon.Error;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n\n            // Display tooltip notification\n            niAlertIcon.Visible = true;\n            niAlertIcon.ShowBalloonTip(10000);\n\n            // Next auto update\n            m_nextPopupUpdate = DateTime.UtcNow.AddMinutes(1);\n        }\n\n        /// <summary>\n        /// When the alerts ballon is clicked, we clear everything.\n        /// </summary>\n        private void OnAlertBalloonClicked()\n        {\n            niAlertIcon.Visible = false;\n            m_popupNotifications.Clear();\n        }\n\n        /// <summary>\n        /// Checks whether a sound must be played on skill training.\n        /// </summary>\n        /// <returns></returns>\n        private static void TryPlaySkillCompletionSound()\n        {\n            // Returns if the user disabled the option\n            if (!Settings.Notifications.PlaySoundOnSkillCompletion)\n                return;\n\n            // Checks the schedule \n            if (Scheduler.SilentMode)\n                return;\n\n            // Play the sound\n            using (SoundPlayer sp = new SoundPlayer(Resources.SkillTrained))\n            {\n                sp.Play();\n            }\n        }\n\n        /// <summary>\n        /// Occurs when the alerts ballon icon is clicked.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void niAlertIcon_BalloonTipClicked(object sender, EventArgs e)\n        {\n            OnAlertBalloonClicked();\n        }\n\n        /// <summary>\n        /// Occurs when the alerts icon is clicked.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void niAlertIcon_Click(object sender, EventArgs e)\n        {\n            OnAlertBalloonClicked();\n        }\n\n        /// <summary>\n        /// Occurs when the alerts icon is clicked.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void niAlertIcon_MouseClick(object sender, MouseEventArgs e)\n        {\n            OnAlertBalloonClicked();\n        }\n\n        /// <summary>\n        /// Occurs when skills have been completed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private static void EveMonClient_QueuedSkillsCompleted(object sender, QueuedSkillsEventArgs e)\n        {\n            // Play a sound\n            TryPlaySkillCompletionSound();\n        }\n\n        #endregion\n\n\n        #region Per-second updates\n\n        /// <summary>\n        /// Occurs every second.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            UpdateStatusLabel();\n            UpdateWindowTitle();\n\n            // Checks whether the tooltip must be displayed\n            if (m_popupNotifications.Count != 0 && DateTime.UtcNow > m_nextPopupUpdate)\n                DisplayTooltipNotifications();\n\n            charactersComparisonMenuItem.Enabled =\n                characterComparisonToolStripButton.Enabled =\n                    EveMonClient.Characters != null && EveMonClient.Characters.Any();\n        }\n\n        /// <summary>\n        /// Updates the status bar.\n        /// </summary>\n        private void UpdateStatusLabel()\n        {\n            if (tsDatafilesLoadingProgressBar.Visible &&\n                tsDatafilesLoadingProgressBar.Value == tsDatafilesLoadingProgressBar.Maximum)\n            {\n                tsDatafilesLoadingProgressBar.Visible = false;\n            }\n\n            if (WindowState == FormWindowState.Minimized)\n                return;\n\n            DateTime serverTime = EveMonClient.EVEServer?.ServerDateTime ?? DateTime.UtcNow;\n            lblStatus.Text = $\"EVE Time: {serverTime:HH:mm}\";\n            lblStatus.ToolTipText = $\"YC{serverTime.Year - 1898} ({serverTime.Date.ToShortDateString()})\";\n        }\n\n        /// <summary>\n        /// Updates the window's title.\n        /// </summary>\n        private void UpdateWindowTitle()\n        {\n            if (WindowState == FormWindowState.Minimized)\n                return;\n\n            // If character's trainings must be displayed in title\n            if (!Settings.UI.MainWindow.ShowCharacterInfoInTitleBar)\n            {\n                Text = EveMonClient.FileVersionInfo.ProductName;\n                return;\n            }\n\n            StringBuilder builder;\n\n            // Retrieve the selected character\n            CCPCharacter selectedChar = GetCurrentCharacter() as CCPCharacter;\n\n            int trimTimeSpanComponents = 0;\n\n            do\n            {\n                builder = new StringBuilder();\n\n                // Scroll through the ordered list of chars in training\n                SortedList<TimeSpan, CCPCharacter> orderedTrainingTimes = GetOrderedCharactersTrainingTime();\n                foreach (TimeSpan ts in orderedTrainingTimes.Keys)\n                {\n                    CCPCharacter character = orderedTrainingTimes[ts];\n\n                    TimeSpan trimmedTime = ts;\n\n                    // First pass we remove the seconds from the TimeSpan,\n                    // if training time is over one minute\n                    if (trimTimeSpanComponents >= 1 && ts.Hours >= 0 && ts.Minutes > 0)\n                        trimmedTime = trimmedTime.Add(TimeSpan.FromSeconds(0 - ts.Seconds));\n\n                    // Second pass we remove the minutes from the TimeSpan,\n                    // if training time is over one hour\n                    if (trimTimeSpanComponents >= 2 && ts.Hours > 0)\n                        trimmedTime = trimmedTime.Add(TimeSpan.FromMinutes(0 - ts.Minutes));\n\n                    switch (Settings.UI.MainWindow.TitleFormat)\n                    {\n                        // (Default) Single Char - finishing skill next\n                        case MainWindowTitleFormat.Default:\n                        case MainWindowTitleFormat.NextCharToFinish:\n                            if (builder.Length == 0)\n                                builder.Append(AppendCharacterTrainingTime(character, trimmedTime));\n                            break;\n\n                        // Single Char - selected char\n                        case MainWindowTitleFormat.SelectedChar:\n                            if (selectedChar == character)\n                                builder.Append(AppendCharacterTrainingTime(character, trimmedTime));\n                            break;\n\n                        // Multi Char - finishing skill next first\n                        case MainWindowTitleFormat.AllCharacters:\n                            if (builder.Length > 0)\n                                builder.Append(\" | \");\n                            builder.Append(AppendCharacterTrainingTime(character, trimmedTime));\n                            break;\n\n                        // Multi Char - selected char first\n                        case MainWindowTitleFormat.AllCharactersButSelectedOneAhead:\n                            // Selected char ? Insert at the beginning\n                            if (selectedChar == character)\n                            {\n                                // Precreate the string for this char\n                                StringBuilder subBuilder = new StringBuilder();\n                                subBuilder.Append(AppendCharacterTrainingTime(character, trimmedTime));\n                                if (builder.Length > 0)\n                                    subBuilder.Append(\" | \");\n\n                                // Insert it at the beginning\n                                builder.Insert(0, subBuilder.ToString());\n                            }\n                            // Non-selected char ? Same as \"3\"\n                            else\n                            {\n                                if (builder.Length > 0)\n                                    builder.Append(\" | \");\n                                builder.Append(AppendCharacterTrainingTime(character, trimmedTime));\n                            }\n                            break;\n                    }\n                }\n\n                // If we go through the loop again we will remove another component of the TimeSpan\n                trimTimeSpanComponents++;\n            } // Each pass we remove one component of the time span up until the hours\n            while (builder.Length > MaxTitleLength && trimTimeSpanComponents < 3);\n\n            // Adds EVEMon at the end if there is space in the title bar\n            string appSuffix = $\" - {EveMonClient.FileVersionInfo.ProductName}\";\n            if (builder.Length + appSuffix.Length <= MaxTitleLength)\n                builder.Append(appSuffix);\n\n            // Set the window title\n            Text = builder.ToString();\n        }\n\n        /// <summary>\n        /// Produces a sorted list of characters in training, ordered from the shortest to the longest training time.\n        /// </summary>\n        /// <remarks>Pulled this code out of cm_ShortInfoChanged, as I needed to use the returned List in multiple places</remarks>\n        /// <returns></returns>\n        private SortedList<TimeSpan, CCPCharacter> GetOrderedCharactersTrainingTime()\n        {\n            SortedList<TimeSpan, CCPCharacter> sortedList = new SortedList<TimeSpan, CCPCharacter>();\n            foreach (TabPage tp in tcCharacterTabs.TabPages)\n            {\n                // Is it a character bound to CCP ?\n                if (!(tp.Tag is CCPCharacter))\n                    continue;\n\n                // Is it in training ?\n                CCPCharacter character = tp.Tag as CCPCharacter;\n                if (!character.IsTraining)\n                    continue;\n\n                TimeSpan ts = character.CurrentlyTrainingSkill.RemainingTime;\n\n                // While the timespan is not unique, we add 1ms\n                while (sortedList.ContainsKey(ts))\n                {\n                    ts += TimeSpan.FromTicks(1);\n                }\n\n                // Add it to the sorted list\n                sortedList.Add(ts, character);\n            }\n            return sortedList;\n        }\n\n        /// <summary>\n        /// Appends the given training time for the specified character to the provided <see cref=\"StringBuilder\"/>. *\n        /// Format is : \"1d, 5h, 32m John Doe (Eidetic Memory)\"\n        /// Used to update the window's title.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"time\">The time.</param>\n        /// <returns></returns>\n        private static string AppendCharacterTrainingTime(Character character, TimeSpan time)\n        {\n            StringBuilder builder = new StringBuilder();\n\n            builder.Append($\"{time.ToDescriptiveText(DescriptiveTextOptions.None)} {character.Name}\");\n\n            if (Settings.UI.MainWindow.ShowSkillNameInWindowTitle)\n                builder.Append($\" ({character.CurrentlyTrainingSkill.SkillName})\");\n\n            return builder.ToString();\n        }\n\n        #endregion\n\n\n        #region Updates manager\n\n        /// <summary>\n        /// Occurs when a program update is available. Display the information form to the user.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void OnUpdateAvailable(object sender, UpdateAvailableEventArgs e)\n        {\n            // Notify the user and prompt him\n            if (m_isShowingUpdateWindow)\n                return;\n\n            m_isShowingUpdateWindow = true;\n\n            // New release of the same major version available\n            if (!string.IsNullOrWhiteSpace(e.UpdateMessage))\n            {\n                using (UpdateNotifyForm form = new UpdateNotifyForm(e))\n                {\n                    if (form.ShowDialog() == DialogResult.OK)\n                    {\n                        m_isUpdating = true;\n\n                        // Save the settings to make sure we don't lose anything\n                        await Settings.SaveImmediateAsync();\n                        Close();\n                    }\n                }\n            }\n            // new major version release\n            else\n            {\n                string message = $\"A new version ({e.NewestVersion}) is available at \" +\n                    $\"{NetworkConstants.EVEMonMainPage}.{Environment.NewLine}\" +\n                    $\"{Environment.NewLine}Your current version is: {e.CurrentVersion}.\";\n                    \n                MessageBoxCustom.Show(this, message, @\"EVEMon Update Available\", \"Ignore this upgrade\",\n                    icon: MessageBoxIcon.Information);\n\n                if (MessageBoxCustom.CheckBoxChecked)\n                    Settings.Updates.MostRecentDeniedMajorUpgrade = e.NewestVersion.ToString();\n            }\n\n            m_isShowingUpdateWindow = false;\n            m_isUpdating = false;\n        }\n\n        /// <summary>\n        /// Occurs when new datafiles versions are available. Display the information form to the user.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void OnDataUpdateAvailable(object sender, DataUpdateAvailableEventArgs e)\n        {\n            if (m_isShowingDataUpdateWindow)\n                return;\n\n            m_isShowingDataUpdateWindow = true;\n            using (DataUpdateNotifyForm form = new DataUpdateNotifyForm(e))\n            {\n                if (form.ShowDialog() == DialogResult.OK)\n                    await RestartApplicationAsync();\n            }\n\n            m_isShowingDataUpdateWindow = false;\n            m_isUpdatingData = false;\n        }\n\n        /// <summary>\n        /// Triggers a restart of EVEMon.\n        /// </summary>\n        private async Task RestartApplicationAsync()\n        {\n            // Save the settings to make sure we don't lose anything\n            await Settings.SaveImmediateAsync();\n\n            // Try to save settings to cloud storage service provider\n            bool canExit = await TryUploadToCloudStorageProviderAsync();\n            if (!canExit)\n                return;\n\n            // Set the updating data flag so EVEMon exits cleanly\n            m_isUpdatingData = true;\n\n            // Find the expected path for 'EVEMon.Watchdog.exe'\n            string executable = typeof(WatchdogWindow).Assembly.Location;\n\n            // If the 'Watchdog' exist start the process\n            if (File.Exists(executable))\n            {\n                try\n                {\n                    ProcessStartInfo startInfo = new ProcessStartInfo\n                    {\n                        FileName = executable,\n                        Arguments = string.Join(\" \", Environment.GetCommandLineArgs()),\n                        UseShellExecute = false\n                    };\n\n                    Process.Start(startInfo);\n                }\n                catch (InvalidOperationException e)\n                {\n                    ExceptionHandler.LogException(e, true);\n                }\n            }\n\n            Application.Exit();\n        }\n\n        #endregion\n\n\n        #region Menus and toolbar\n\n        /// <summary>\n        /// File > Add API key...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void addAPIKeyMenu_Click(object sender, EventArgs e)\n        {\n            using (EsiKeyUpdateOrAdditionWindow window = new EsiKeyUpdateOrAdditionWindow())\n            {\n                window.ShowDialog(this);\n            }\n        }\n\n        /// <summary>\n        /// File > Manage API keys...\n        /// Open the api keys management window.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void manageAPIKeysMenuItem_Click(object sender, EventArgs e)\n        {\n            using (EsiKeysManagementWindow window = new EsiKeysManagementWindow())\n            {\n                window.ShowDialog(this);\n            }\n        }\n\n        /// <summary>\n        /// File > Hide Character...\n        /// Unmonitor this character.\n        /// It will still be in the settings unless the users removes the API key\n        /// and confirm the deletion of characters.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void hideCharacterMenu_Click(object sender, EventArgs e)\n        {\n            Character character = GetCurrentCharacter();\n            if (character == null)\n                return;\n\n            // Close any open associated windows\n            CloseOpenWindowsOf(character);\n\n            character.Monitored = false;\n        }\n\n        /// <summary>\n        /// File > Delete Character...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void deleteCharacterMenu_Click(object sender, EventArgs e)\n        {\n            Character character = GetCurrentCharacter();\n            if (character == null)\n                return;\n\n            using (CharacterDeletionWindow window = new CharacterDeletionWindow(character))\n            {\n                window.ShowDialog(this);\n            }\n\n            // Close any open associated windows\n            CloseOpenWindowsOf(character);\n        }\n\n        /// <summary>\n        /// File > Export Character...\n        /// Exports the character's infos.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void saveCharacterInfosMenuItem_Click(object sender, EventArgs e)\n        {\n            Character character = GetCurrentCharacter();\n            if (character == null)\n                return;\n\n            UIHelper.CharacterMonitorScreenshot = GetCurrentMonitor().GetCharacterScreenshot();\n            await UIHelper.ExportCharacterAsync(character);\n        }\n\n        /// <summary>\n        /// File > Save settings...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void saveSettingsToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            // Prompts the user for a location\n            saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);\n            DialogResult result = saveFileDialog.ShowDialog();\n\n            // Copy settings if OK\n            if (result == DialogResult.OK)\n                await Settings.CopySettingsAsync(saveFileDialog.FileName);\n        }\n\n        /// <summary>\n        /// File > Restore settings...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void loadSettingsToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            // Prompts the user for a location\n            openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);\n\n            // Load settings if OK\n            if (openFileDialog.ShowDialog() != DialogResult.OK)\n                return;\n\n            // Clear any notifications\n            ClearNotifications();\n\n            // Close any open character associated windows\n            WindowsFactory.CloseAllTagged();\n\n            // Hide the TabControl\n            noCharactersLabel.Hide();\n            tcCharacterTabs.Hide();\n            mainLoadingThrobber.State = ThrobberState.Rotating;\n            mainLoadingThrobber.Show();\n            tabLoadingLabel.Show();\n\n            UpdateSettingsControlsVisibility(enabled: false);\n\n            // Open the specified settings\n            await Settings.RestoreAsync(openFileDialog.FileName);\n\n            // Remove the tip window if it exist and is confirmed in settings\n            if (Settings.UI.ConfirmedTips.Contains(\"startup\") && Controls.OfType<TipWindow>().Any())\n                Controls.Remove(Controls.OfType<TipWindow>().First());\n        }\n\n        /// <summary>\n        /// File > Clear Cache.\n        /// Called when the user clickes the \"clear cache\" toolbar's button.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void clearCacheToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            // Manually delete the Settings file for any non-recoverable errors\n            DialogResult dr = MessageBox.Show(Properties.Resources.PromptClearCache,\n                @\"Confirm Cache Clearing\", MessageBoxButtons.YesNo, MessageBoxIcon.Question,\n                MessageBoxDefaultButton.Button2);\n\n            if (dr == DialogResult.Yes)\n                EveMonClient.ClearCache();\n        }\n\n        /// <summary>\n        /// File > Reset settings.\n        /// Called when the user clickes the \"reset settings\" toolbar's button.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void resetSettingsToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            // Manually delete the Settings file for any non-recoverable errors\n            DialogResult dr = MessageBox.Show(Properties.Resources.PromptResetSettings,\n                @\"Confirm Settings Reset\", MessageBoxButtons.YesNo, MessageBoxIcon.Question,\n                MessageBoxDefaultButton.Button2);\n\n            if (dr != DialogResult.Yes)\n                return;\n\n            // Close any open character associated windows\n            WindowsFactory.CloseAllTagged();\n\n            // Clear any notifications\n            ClearNotifications();\n\n            // Hide the TabControl\n            tcCharacterTabs.Hide();\n\n            // Reset the settings\n            await Settings.ResetAsync();\n\n            // Show the TabControl\n            tcCharacterTabs.Show();\n\n            // Trigger the tip window\n            OnShown(e);\n        }\n\n        /// <summary>\n        /// File > Exit.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void exitToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            // Try to save settings to cloud storage service provider\n            bool canExit = await TryUploadToCloudStorageProviderAsync();\n\n            if (canExit)\n                Application.Exit();\n        }\n\n        /// <summary>\n        /// Edit's drop down menu opening.\n        /// Enabled/disable the items.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void editToolStripMenuItem_DropDownOpening(object sender, EventArgs e)\n        {\n            Character character = GetCurrentCharacter();\n            copySkillsToClipboardBBFormatToolStripMenuItem.Enabled = character != null;\n        }\n\n        /// <summary>\n        /// Edit > Copy skills to clipboard (BBCode format).\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void copySkillsToClipboardBBFormatToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            Character character = GetCurrentCharacter();\n            if (character == null)\n                return;\n\n            try\n            {\n                // Try to copy\n                Clipboard.Clear();\n                Clipboard.SetText(CharacterExporter.ExportAsBBCode(character));\n            }\n            catch (ExternalException ex)\n            {\n                // Occurs when another process is using the clipboard\n                ExceptionHandler.LogException(ex, true);\n                MessageBox.Show(Properties.Resources.ErrorClipboardFailure, \"Error copying\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n        }\n\n        /// <summary>\n        /// Plan's menu drop down.\n        /// Enable/disable menu items and rebuild items for plans.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void plansToolStripMenuItem_DropDownOpening(object sender, EventArgs e)\n        {\n            Character character = GetCurrentCharacter();\n\n            // Enable or disable items\n            tsmiNewPlan.Enabled = tsmiImportPlanFromFile.Enabled =\n                tsmiManagePlans.Enabled = plansSeparator.Visible = (character != null);\n\n            CCPCharacter ccpCharacter = character as CCPCharacter;\n            tsmiCreatePlanFromSkillQueue.Enabled = ccpCharacter != null && ccpCharacter.SkillQueue.Any();\n\n            // Remove everything after the separator\n            int index = plansToolStripMenuItem.DropDownItems.IndexOf(plansSeparator) + 1;\n            while (plansToolStripMenuItem.DropDownItems.Count > index)\n            {\n                plansToolStripMenuItem.DropDownItems.RemoveAt(index);\n            }\n\n            // Add new entries\n            character?.Plans.AddTo(plansToolStripMenuItem.DropDownItems, InitializePlanItem);\n        }\n\n        /// <summary>\n        /// Plans > New Plan...\n        /// Displays the \"New Plan\" window.\n        /// </summary>\n        /// <param name=\"sender\">menu item clicked</param>\n        /// <param name=\"e\"></param>\n        private void tsmiNewPlan_Click(object sender, EventArgs e)\n        {\n            Character character = GetCurrentCharacter();\n            if (character == null)\n                return;\n\n            // Ask the user for a new name\n            Plan newPlan;\n            using (NewPlanWindow npw = new NewPlanWindow())\n            {\n                DialogResult dr = npw.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n\n                // Create a new plan\n                newPlan = new Plan(character)\n                {\n                    Name = npw.PlanName,\n                    Description = npw.PlanDescription\n                };\n            }\n\n            // Add plan and save\n            character.Plans.Add(newPlan);\n\n            // Show the editor for this plan\n            PlanWindow.ShowPlanWindow(plan: newPlan);\n        }\n\n        /// <summary>\n        /// File > Create Plan from Skill Queue...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmiCreatePlanFromSkillQueue_Click(object sender, EventArgs e)\n        {\n            Character character = GetCurrentCharacter();\n\n            if (character == null)\n                return;\n\n            // Create new plan\n            Plan newPlan = PlanWindow.CreateNewPlan(character, EveMonConstants.CurrentSkillQueueText);\n\n            if (newPlan == null)\n                return;\n\n            // Add skill queue to new plan and insert it on top of the plans\n            bool planCreated = PlanIOHelper.CreatePlanFromCharacterSkillQueue(newPlan, character);\n\n            // Show the editor for this plan\n            if (planCreated)\n                PlanWindow.ShowPlanWindow(plan: newPlan);\n        }\n\n        /// <summary>\n        /// File > Import Plan from file...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmiImportPlanFromFile_Click(object sender, EventArgs e)\n        {\n            Character character = GetCurrentCharacter();\n\n            // Prompt the user to select a file\n            DialogResult dr = ofdOpenDialog.ShowDialog();\n            if (dr == DialogResult.Cancel)\n                return;\n\n            // Load from file and returns if an error occurred (user has already been warned)\n            SerializablePlan serial = PlanIOHelper.ImportFromXML(ofdOpenDialog.FileName);\n            if (serial == null)\n                return;\n\n            // Imports the plan\n            Plan loadedPlan = new Plan(character);\n            loadedPlan.Import(serial);\n\n            // Prompt the user for the plan name\n            using (NewPlanWindow npw = new NewPlanWindow())\n            {\n                npw.PlanName = Path.GetFileNameWithoutExtension(ofdOpenDialog.FileName);\n                DialogResult xdr = npw.ShowDialog();\n                if (xdr == DialogResult.Cancel)\n                    return;\n\n                loadedPlan.Name = npw.PlanName;\n                loadedPlan.Description = npw.PlanDescription;\n                character.Plans.Add(loadedPlan);\n            }\n        }\n\n        /// <summary>\n        /// Plans > Manage...\n        /// Displays the \"Manage Plans\" window.\n        /// </summary>\n        /// <param name=\"sender\">menu item clicked</param>\n        /// <param name=\"e\"></param>\n        private void manageToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            Character character = GetCurrentCharacter();\n\n            if (character == null)\n                return;\n\n            WindowsFactory.ShowByTag<PlanManagementWindow, Character>(character);\n        }\n\n        /// <summary>\n        /// Initializes tool strip menu item for the plan.\n        /// </summary>\n        /// <param name=\"planItem\"></param>\n        /// <param name=\"plan\"></param>\n        private void InitializePlanItem(ToolStripItem planItem, Plan plan)\n        {\n            if (WindowsFactory.GetByTag<PlanWindow, Character>((Character)plan.Character)?.Plan == plan)\n                planItem.Font = FontFactory.GetFont(planItem.Font, FontStyle.Italic | FontStyle.Bold);\n\n            planItem.Tag = plan;\n            planItem.Click += planItem_Click;\n        }\n\n        /// <summary>\n        /// Plans > Name of the plan.\n        /// Open the plan.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void planItem_Click(object sender, EventArgs e)\n        {\n            // Retrieve the plan\n            Plan plan = ((ToolStripMenuItem)sender)?.Tag as Plan;\n\n            // Show or bring to front if a window with the same plan as tag already exists\n            PlanWindow.ShowPlanWindow(GetCurrentCharacter(), plan);\n        }\n        \n        /// <summary>\n        /// Tools > Characters Comparison.\n        /// Open the Characters Comparison window.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void charactersComparisonToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            WindowsFactory.ShowUnique<CharactersComparisonWindow>();\n        }\n\n        /// <summary>\n        /// Tools > Blank Character Creator...\n        /// Open the blank character creation window.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void blankCreatorToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            using (BlankCharacterWindow form = new BlankCharacterWindow())\n            {\n                form.ShowDialog(this);\n            }\n        }\n\n        /// <summary>\n        /// Tools > EVE Data Browser > Skill Browser.\n        /// Open the plan window in skill browser.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void skillBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            PlanWindow.ShowPlanWindow().ShowSkillBrowser();\n        }\n\n        /// <summary>\n        /// Tools > EVE Data Browser > Certificate Browser.\n        /// Open the plan window in certificate browser.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void certificateBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            PlanWindow.ShowPlanWindow().ShowCertificateBrowser();\n        }\n\n        /// <summary>\n        /// Tools > EVE Data Browser > Ship Browser.\n        /// Open the plan window in ship browser.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void shipBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            PlanWindow.ShowPlanWindow().ShowShipBrowser();\n        }\n\n        /// <summary>\n        /// Tools > EVE Data Browser > Item Browser.\n        /// Open the plan window in item browser.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void itemBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            PlanWindow.ShowPlanWindow().ShowItemBrowser();\n        }\n\n        /// <summary>\n        /// Tools > EVE Data Browser > Blueprint Browser.\n        /// Open the plan window in blueprint browser.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void blueprintBrowserMenuItem_Click(object sender, EventArgs e)\n        {\n            PlanWindow.ShowPlanWindow().ShowBlueprintBrowser();\n        }\n\n        /// <summary>\n        /// Tools > Skills pie chart.\n        /// Displays the skills pie chart\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsSkillsPieChartTool_Click(object sender, EventArgs e)\n        {\n            // Return if no selected tab (cannot infere which character the chart should represent)\n            Character character = GetCurrentCharacter();\n            if (character == null)\n                return;\n\n            // Create the window\n            WindowsFactory.ShowByTag<SkillsPieChart, Character>(character);\n        }\n\n        /// <summary>\n        /// Tools > Manual implants group.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void manualImplantGroupsToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            Character character = GetCurrentCharacter();\n            if (character == null)\n                return;\n\n            WindowsFactory.ShowByTag<ImplantSetsWindow, Character>(character);\n        }\n\n        /// <summary>\n        /// Tools > Show owned skillbooks.\n        /// Displays a message box with the owned skills.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsShowOwnedSkillbooks_Click(object sender, EventArgs e)\n        {\n            Character character = GetCurrentCharacter();\n            if (character == null)\n                return;\n\n            WindowsFactory.ShowByTag<OwnedSkillBooksWindow, Character>(character);\n        }\n\n        /// <summary>\n        /// Tools > Options.\n        /// Open the settings form.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void optionsMenuItem_Click(object sender, EventArgs e)\n        {\n            using (SettingsForm form = new SettingsForm())\n            {\n                form.ShowDialog(this);\n            }\n        }\n\n        /// <summary>\n        /// Help > UserVoice\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void issuesFeaturesMenuItem_Click(object sender, EventArgs e)\n        {\n            Util.OpenURL(new Uri(NetworkConstants.EVEMonUserVoice));\n        }\n\n        /// <summary>\n        /// Help > Forums.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void forumsMenuItem_Click(object sender, EventArgs e)\n        {\n            Util.OpenURL(new Uri(NetworkConstants.EVEMonForums));\n        }\n\n        /// <summary>\n        /// Help > Follow us on Twitter.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void twitterMenuItem_Click(object sender, EventArgs e)\n        {\n            Util.OpenURL(new Uri(NetworkConstants.EVEMonTwitter));\n        }\n\n        /// <summary>\n        /// Help > Manual.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void readTheDocsManualMenuItem_Click(object sender, EventArgs e)\n        {\n            Util.OpenURL(new Uri(NetworkConstants.EVEMonManual));\n        }\n\n        /// <summary>\n        /// Help > About.\n        /// Open the \"about\" form.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            WindowsFactory.ShowUnique<AboutWindow>();\n        }\n\n        /// <summary>\n        /// Menu bar's context menu > Menubar.\n        /// Hide/show the menu bar.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void menubarToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            mainMenuBar.Visible = !mainMenuBar.Visible;\n            mainToolBar.Visible = !mainMenuBar.Visible;\n            Settings.UI.MainWindow.ShowMenuBar = mainMenuBar.Visible;\n            Settings.Save();\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void mainMenuBar_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            mainMenuBar.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void mainMenuBar_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            mainMenuBar.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Menu bar's context menu > Toolbar.\n        /// Hide/show the tool bar.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void toolbarToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            mainToolBar.Visible = !mainToolBar.Visible;\n            mainMenuBar.Visible = !mainToolBar.Visible;\n            Settings.UI.MainWindow.ShowMenuBar = mainMenuBar.Visible;\n            Settings.Save();\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void mainToolBar_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            mainToolBar.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void mainToolBar_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            mainToolBar.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Toolbar > Plans icon's dropdown opening.\n        /// Rebuild the menu items for plans.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsdbPlans_DropDownOpening(object sender, EventArgs e)\n        {\n            // Clear the menu items and rebuild them\n            plansTbMenu.DropDownItems.Clear();\n\n            GetCurrentCharacter()?.Plans.AddTo(plansTbMenu.DropDownItems, InitializePlanItem);\n        }\n\n        /// <summary>\n        /// Toolbar > Context menu's dropdown opening.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void toolbarContext_Opening(object sender, CancelEventArgs e)\n        {\n            menubarToolStripMenuItem.Enabled = toolbarToolStripMenuItem.Checked = mainToolBar.Visible;\n            toolbarToolStripMenuItem.Enabled = menubarToolStripMenuItem.Checked = mainMenuBar.Visible;\n        }\n\n        /// <summary>\n        /// Closes any open windows of the specified character.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        private static void CloseOpenWindowsOf(Character character)\n        {\n            // Close any open Skill Planner window\n            foreach (Plan plan in character.Plans)\n            {\n                WindowsFactory.GetAndCloseByTag<PlanWindow, Plan>(plan);\n            }\n\n            // Close any open Skill Pie Chart window\n            WindowsFactory.GetAndCloseByTag<SkillsPieChart, Character>(character);\n\n            // Close any open Implant AllGroups window\n            WindowsFactory.GetAndCloseByTag<ImplantSetsWindow, Character>(character);\n\n            // Close any open Show Owned Skillbooks window\n            WindowsFactory.GetAndCloseByTag<OwnedSkillBooksWindow, Character>(character);\n\n            // Now CCP character related windows\n            CCPCharacter ccpCharacter = character as CCPCharacter;\n\n            if (ccpCharacter == null)\n                return;\n\n            // Close any open Wallet Journal Chart window\n            WindowsFactory.GetAndCloseByTag<WalletJournalChartWindow, CCPCharacter>(ccpCharacter);\n\n            // Close any open EVE Mail window\n            foreach (EveMailMessage mailMessage in ccpCharacter.EVEMailMessages)\n            {\n                WindowsFactory.GetAndCloseByTag<EveMessageWindow, EveMailMessage>(mailMessage);\n            }\n\n            // Close any open EVE Notification window\n            foreach (EveNotification eveNotification in ccpCharacter.EVENotifications)\n            {\n                WindowsFactory.GetAndCloseByTag<EveMessageWindow, EveNotification>(eveNotification);\n            }\n\n            // Close any open Contract Details window\n            foreach (Contract contract in ccpCharacter.Contracts)\n            {\n                WindowsFactory.GetAndCloseByTag<ContractDetailsWindow, Contract>(contract);\n            }\n\n            // Close any open Kill Report window\n            foreach (KillLog killLog in ccpCharacter.KillLog)\n            {\n                WindowsFactory.GetAndCloseByTag<KillReportWindow, KillLog>(killLog);\n            }\n        }\n\n        /// <summary>\n        /// Clears the notifications.\n        /// </summary>\n        private void ClearNotifications()\n        {\n            // Clear the global notification collection\n            EveMonClient.Notifications.Clear();\n\n            // Clear all main window notifications\n            notificationList.Notifications = null;\n\n            // Clear all tray icon notifications\n            m_popupNotifications.Clear();\n\n            // Clear all character monitor notifications\n            foreach (CharacterMonitor monitor in tcCharacterTabs.TabPages.Cast<TabPage>()\n                .Select(tabPage => tabPage.Controls[0] as CharacterMonitor))\n            {\n                monitor?.ClearNotifications();\n            }\n        }\n\n        #endregion\n\n\n        #region Tray icon\n\n        /// <summary>\n        /// Remove the popup if its showing.\n        /// </summary>\n        private void HidePopup()\n        {\n            if (m_trayPopup == null)\n                return;\n\n            try\n            {\n                m_trayPopup.Close();\n            }\n            catch (InvalidOperationException ex)\n            {\n                ExceptionHandler.LogException(ex, true);\n            }\n            finally\n            {\n                m_trayPopup.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Occurs when the user click the tray icon.\n        /// If it's not a right click button, we restore or minimize the window.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void trayIcon_Click(object sender, EventArgs e)\n        {\n            // Returns for right-button click\n            MouseEventArgs mouseClick = e as MouseEventArgs;\n            if (mouseClick != null && mouseClick.Button == MouseButtons.Right)\n                return;\n\n            // Set the mouse clicked flag\n            m_isMouseClicked = true;\n\n            // Update the tray icon's visibility\n            HidePopup();\n\n            // Restore the main window\n            RestoreMainWindow();\n        }\n\n        /// <summary>\n        /// Occurs when the mouse hovers over the tray icon.\n        /// Make the popup visible.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void trayIcon_MouseHover(object sender, EventArgs e)\n        {\n            // When clicking on the tray icon we need to prevent the popup showing due to pending hovering event\n            if (m_isMouseClicked)\n            {\n                m_isMouseClicked = false;\n                return;\n            }\n\n            // Only display the pop up window if the context menu isn't showing and main window is not restoring\n            if (trayIconContextMenuStrip.Visible)\n                return;\n\n            // Stop if the popup is disabled\n            if (Settings.UI.SystemTrayPopup.Style == TrayPopupStyles.Disabled)\n                return;\n\n            // Create the popup\n            if (Settings.UI.SystemTrayPopup.Style == TrayPopupStyles.PopupForm)\n                m_trayPopup = new TrayPopupWindow();\n            else\n                m_trayPopup = new TrayTooltipWindow();\n\n            // Show the tooltip\n            m_trayPopup.Show();\n\n            // Ensure that the tooltip will be shown on top of all other windows\n            m_trayPopup.BringToFront();\n        }\n\n        /// <summary>\n        /// Occurs when the mouse leaves the tray icon.\n        /// Hide the popup.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void trayIcon_MouseLeave(object sender, EventArgs e)\n        {\n            HidePopup();\n            TriggerAutoShrink();\n        }\n\n        /// <summary>\n        /// Tray icon's context menu drop down opening.\n        /// Update the menu items for characters plans.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void trayIconToolStrip_Opening(object sender, CancelEventArgs e)\n        {\n            HidePopup();\n\n            // Create the Plans sub-menu\n            List<Character> characters = new List<Character>(EveMonClient.MonitoredCharacters);\n            characters.Sort((x, y) => string.Compare(x.Name, y.Name, StringComparison.CurrentCulture));\n            foreach (Character character in characters)\n            {\n                ToolStripMenuItem characterItem = new ToolStripMenuItem(character.Name);\n                planToolStripMenuItem.DropDownItems.Add(characterItem);\n\n                character.Plans.AddTo(characterItem.DropDownItems, InitializePlanItem);\n            }\n        }\n\n        /// <summary>\n        /// Tray icon's context menu > Restore.\n        /// Restore the window to its normal size.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void restoreToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            RestoreMainWindow();\n        }\n\n        /// <summary>\n        /// Tray icon's context menu > Close.\n        /// Quit the application.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void closeToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            // Try to save settings to cloud storage service provider\n            bool canExit = await TryUploadToCloudStorageProviderAsync();\n\n            if (canExit)\n                Application.Exit();\n        }\n\n        /// <summary>\n        /// Clear the menu items for characters plans. Rebuild on opening anyway.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void trayIconToolStrip_Closed(object sender, ToolStripDropDownClosedEventArgs e)\n        {\n            // Clear the existing items\n            planToolStripMenuItem.DropDownItems.Clear();\n        }\n\n        /// <summary>\n        /// Restores the main window.\n        /// </summary>\n        private void RestoreMainWindow()\n        {\n            if (WindowState == FormWindowState.Minimized)\n            {\n                Visible = true;\n                WindowState = FormWindowState.Normal;\n                ShowInTaskbar = Visible;\n                trayIcon.Visible = Settings.UI.SystemTrayIcon == SystemTrayBehaviour.AlwaysVisible;\n            }\n\n            Activate();\n        }\n\n        #endregion\n\n\n        #region Reaction to settings change\n\n        /// <summary>\n        /// Occurs when the settings form has been validated.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateControlsVisibility();\n        }\n\n        /// <summary>\n        /// Updates the controls visibility according to settings\n        /// </summary>\n        private void UpdateControlsVisibility()\n        {\n            // Quit if the client has been shut down\n            if (EveMonClient.Closed)\n                return;\n\n            // Displays or not the 'no characters added' label\n            noCharactersLabel.Visible = !EveMonClient.MonitoredCharacters.Any();\n            \n            // Tray icon's visibility\n            trayIcon.Visible = Settings.UI.SystemTrayIcon == SystemTrayBehaviour.AlwaysVisible\n                               || (Settings.UI.SystemTrayIcon == SystemTrayBehaviour.ShowWhenMinimized &&\n                                   WindowState == FormWindowState.Minimized);\n\n            // Update manager configuration\n            UpdateManager.Enabled = Settings.Updates.CheckEVEMonVersion;\n\n            if (UpdateManager.Enabled && !m_isUpdateEventsSubscribed)\n            {\n                EveMonClient.UpdateAvailable += OnUpdateAvailable;\n                EveMonClient.DataUpdateAvailable += OnDataUpdateAvailable;\n                m_isUpdateEventsSubscribed = true;\n            }\n\n            if (!UpdateManager.Enabled && m_isUpdateEventsSubscribed)\n            {\n                EveMonClient.UpdateAvailable -= OnUpdateAvailable;\n                EveMonClient.DataUpdateAvailable -= OnDataUpdateAvailable;\n                m_isUpdateEventsSubscribed = false;\n            }\n\n            // Rebuild tabs (the overview may have been removed)\n            if (!Settings.IsRestoring && tcCharacterTabs.TabPages.Contains(tpOverview) != Settings.UI.MainWindow.ShowOverview)\n            {\n                UpdateTabs();\n            }\n\n            // Whenever we switch API provider we update\n            // the server status and every monitored CCP character\n            if (m_apiProviderName == EveMonClient.APIProviders.CurrentProvider.Name)\n                return;\n\n            // Clear any notifications\n            ClearNotifications();\n\n            m_apiProviderName = EveMonClient.APIProviders.CurrentProvider.Name;\n            EveMonClient.EVEServer.ForceUpdate();\n\n            foreach (ESIKey apiKey in EveMonClient.ESIKeys)\n            {\n                apiKey.ForceUpdate();\n            }\n\n            foreach (CCPCharacter character in EveMonClient.MonitoredCharacters.OfType<CCPCharacter>())\n            {\n                character.QueryMonitors.QueryEverything();\n            }\n        }\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Updates the settings controls visibility.\n        /// </summary>\n        /// <param name=\"enabled\">if set to <c>true</c> [enabled].</param>\n        private void UpdateSettingsControlsVisibility(bool enabled)\n        {\n            // Enable or disable the menu buttons\n            foreach (ToolStripItem item in m_settingsEnabledMenuItems)\n            {\n                item.Enabled = enabled;\n            }\n            \n            UpdateControlsOnTabSelectionChange();\n        }\n\n        /// <summary>\n        /// Asynchronously tries to upload to cloud storage provider.\n        /// </summary>\n        /// <returns></returns>\n        private async Task<bool> TryUploadToCloudStorageProviderAsync()\n        {\n            // Return a success if settings have not been set to upload\n            if (Settings.CloudStorageServiceProvider.Provider == null)\n                return true;\n\n            if (CloudStorageServiceSettings.Default.UploadAlways &&\n                Settings.CloudStorageServiceProvider.Provider.HasCredentialsStored)\n            {\n                lblCSSProviderStatus.Text = $\"Uploading to {Settings.CloudStorageServiceProvider.Provider.Name}\";\n                lblCSSProviderStatus.Visible = true;\n            }\n\n            bool success = await Settings.CloudStorageServiceProvider.Provider.UploadSettingsFileOnExitAsync()\n                .ConfigureAwait(false);\n\n            lblCSSProviderStatus.Visible = false;\n\n            return success;\n        }\n\n        #endregion\n\n\n        #region Testing Functions\n\n        /// <summary>\n        /// Displays the test menu.\n        /// </summary>\n        private void DisplayTestMenu()\n        {\n            testsToolStripMenuItem.Visible = true;\n            testTrayToolStripMenuItem.Visible = true;\n            testsToolStripSeperator.Visible = true;\n            testCharacterNotificationToolStripMenuItem.Visible = true;\n        }\n\n        /// <summary>\n        /// Enables the character notification if the current character is valid.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void testToolStripMenuItem_DropDownOpening(object sender, EventArgs e)\n        {\n            testCharacterNotificationToolStripMenuItem.Enabled = GetCurrentCharacter() != null;\n        }\n\n        /// <summary>\n        /// Thrown an exception just to test the exception handler is working.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void ExceptionWindowToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            throw new InvalidOperationException(\"Test Exception\");\n        }\n\n        /// <summary>\n        /// Thrown an exception with an inner exception just to test the exception handler is working.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exceptionWindowRecursiveExceptionToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            throw new InvalidOperationException(\"Test Exception\", new InvalidOperationException(\"Inner Exception\"));\n        }\n\n        /// <summary>\n        /// Tests notification display in the MainWindow.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void testNotificationToolstripMenuItem_Click(object sender, EventArgs e)\n        {\n            NotificationEventArgs notification = new NotificationEventArgs(null, NotificationCategory.TestNofitication)\n            {\n                Priority = NotificationPriority.Information,\n                Behaviour = NotificationBehaviour.Overwrite,\n                Description = \"Test Notification\"\n            };\n            EveMonClient.Notifications.Notify(notification);\n        }\n\n        /// <summary>\n        /// Tests character's notification display in the Character Monitor.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void testCharacterNotificationToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            CharacterMonitor.TestCharacterNotification(GetCurrentCharacter());\n        }\n\n        /// <summary>\n        /// Resets the HTTP timeout to 1 second.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void testTimeoutOneSecToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            MessageBox.Show($\"Timeout was: {Settings.Updates.HttpTimeout}, now 1\");\n            Settings.Updates.HttpTimeout = 1;\n        }\n\n        /// <summary>\n        /// Restarts the application.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private async void restartToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            await RestartApplicationAsync();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/MainWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"trayIconContextMenuStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>544, 18</value>\n  </metadata>\n  <metadata name=\"statusStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>443, 17</value>\n  </metadata>\n  <metadata name=\"saveFileDialog.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>98, 15</value>\n  </metadata>\n  <metadata name=\"openFileDialog.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>314, 16</value>\n  </metadata>\n  <metadata name=\"mainMenuBar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>812, 16</value>\n  </metadata>\n  <metadata name=\"toolbarContext.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>937, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"addAPIKeyMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        vAAADrwBlbxySQAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAAK8SURB\n        VDhPY6A74AACVlZWdigXP2AEAlEg4OHhFgTxgXp5dYBATkZKi5GBgROsCBmANGgBgYS4mCKID9SrmAcE\n        Pu6OmUyMDOLcXJySOlqaxvIyEsYgPlgTMtDS0nS6DQTTe5susjAx6spIitnlZqU1+LraNrAwMVgxMzGK\n        8HOxGXOxMRozMjKIAbUwQXRCgbmRTvWty2f+z+qq/M/BwljCycZsrCLFVy/Fz9LAwszopCgva6Khpmwp\n        KshjwsfNpgfyIVQrBAhys6Z6Gsv+NpZj/8/Jytgc5OtZmxgV2maiKduoJiPYqKGmEquloWYvLsxvKibI\n        Y8zGwqwE1crAwMLM5LRywfQPZ/Zt/JcRbP3f00zxrZeHy+aU+Kg+K32VZitdhR5dDeUKNRVFFyE+TgtR\n        AS5jNlZmVah2BgZhfq6yV49v/3947fT/skSv//nhtv+drAyvRQR5T9FRFGs11ZDu1lFXqFVRlPUX5OW0\n        EeHjMAZaqgbVDgxxAe6KZ3fO/b94ePP/GDe9/+l+Jv/tTLXueLvaLdKUF+02VBZplnYQ3CATLnROwpO/\n        i42FUR8YleDYAgM+Ltacexf3/j+3d9X/SBfd/0luGv/VZEXvWBrrrFCREuwW4GIulwoWuOr93+C/VITA\n        MWAsqQO1CUN0AwHQNJm67PAny6c0/ve3Uv2vIML2WlSI74SemuxiOXvebdIxgp+kw4XOggyQjhQ8KhUl\n        eFAqWjALqh0MWDMi3U80ZPj/d9UT+S/Ew3pUS11lto+r7SSFMOHbII3oWDpecDtULxgwN1cVHtq8aML/\n        kjDz/3Ii3Lu4uDi9JcREvMVd+SZKRQkcAmp4DdMIwjIJQqlQvRAATMK+BjqakySF+SaxsjCFAYVAeYAV\n        iNmAmAWoYRvIABAN5GMFwKAAZxIeIOYAYpSkCrIRpBlhMwMDAKVNwSEuFv2cAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"manageAPIKeysMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAk5JREFUOE9j\n        oCpgBAItIJAQF1OECoEBLnEMoKWl6XQbCKb3Nl1kYWLUhQrjFMcA5kY61bcun/k/q6vyPwcrYynUViUU\n        cRbGEqhyRiiNAILcrKmexrK/jeXY/xvoak4FWnpnem/zZSFu1kaYODsLQwFQKScQ8wIxE0gfGLAwMzmt\n        XDD9w5l9G/9lBFv/j/G1/QyzNSU6+DtM3NNM8QULC3M6UIssELOBNYOAMD9X2avHt/8/vHb6f1mi1/8Q\n        B63/Xiay/0C2drdU/7957sj/ghi3/3lhtv9lxPjXALVoAjE3WDMIiApwVzy7c+7/xcOb/3uYq/xfv3TW\n        f6Ct/0G2xnkZ/2+syPsfZKf5P9XH+L+cOP8OoBZXIBYDawYBPi7WnHsX9/4/t3fVf2djpf/IrskPt/0f\n        H+z239tS7X+cs9p/cUHuA0AtgUAsDtYMAsAglanLDn+yfErjf3t9uf8w18S46f1P9zP57+tg/N9KS/q/\n        nDDbW2YmxiVALe5ADApIOGDNiHQ/0ZDh/99MRfA/zDWRLrr/k9w0/ptpyf3Xl+f7L8DFcgqoNhaIVYGY\n        BaQRBpibqwoPbV404X+Gr+H/xtyIHyDX+Fup/teS5f/lZGP6P8RO47+MMNc+oFotkHqwLmQATDS+Bjqa\n        kySEeadkRXncBrnGVU/kv4Qg13V5GaldooI8i1hZmCKBSgUgOjABKHWBEgl/c1XBEZBrSsLM/8uJcO8C\n        ihmBxIGYA4gRCQgXgLlGUphvEtDWMKAQTltxAZhreICYA5ghMf3MwMAAAB3D7BYOWxo0AAAAAElFTkSu\n        QmCC\n</value>\n  </data>\n  <data name=\"deleteCharacterMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAm1JREFUOE99k21IU1EY\n        x59td++48GWuVY42mek+NHErKzSDwi3tQ2qJTvKukVQfTBkmhQzpZVIRQdGLVGAvEOttEJaRrWI1QkQo\n        KJMo8Ev1KfziKDa2+/ScbR+q3frDD+455//8zz3PPRcQ8Q+Y5HK50svz3ffu3nnEd7WfUsg5Q2ZBTGIB\n        GrWqNBaLztMYY5P3scpUHMosiOn3YkZOmsN9PR8nw2Po55uxRCN7TXNSgiPkueesRAMkUr2zYnmk3qxD\n        x1INmou04zRbmENHKJiLEA3Q73A3TM29m8aJm+fSuxqdQusGEzrKjQ9ozUmUESpCRuQH0Pu1XD4ZoEfE\n        2ZlIKtjfne7cVI79nqYFsrcTNkJLsABJXsASJfC3r5zGxI9FYfzWhVRf52bBbV+Gg76WBCeBXipaR7Cj\n        ZHvxd0CBAvhrF0fw5+K31ERoNNXhtgt1lmIM+JqSFDBERdsIdgzWBy4vQC0Fz6URP8a/zwnh62fTHle1\n        sMVWgoGO+iQVBIk2wkyIvwHJ4G1rnP70JoJHen3pYb0Oa4xabKgojVPF6ABAdC3APvKJ94DJWmYYCO5t\n        xe21VcIL6vMZmTRlBHh+FODDDI1XA/jJlr0LYgHVlZaeaOg87tm6Jr1xRQE+lEqEtwCJVwBJ+o5jtLWJ\n        bP+8B1Bjs/JfPr/H4wc8uNtlx6tKLv2VrE8BFlYCNJPl/zdRpVJahocOPtvpqps/UaiNv5RAqgtg9jFA\n        PAwwRdvbM0YmkQCWrqY/0roK4BDrgQPgBk2urwQ49oTG9B0HmTEjkQAm1mFOSTvRxd9PxezMdA2giMZe\n        DUBtxgUAvwDk+nfvALQ6oQAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"exportCharacterMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAjRJREFUOE9j+P//PwoG\n        AVZWVvaE+Pi4NatXbY2PDutiY2URB0tgA9gM4OLkEDty5OB9IP//kV1r/2vKCa8AS2ADyJpBGAq4KvNT\n        b+5aN/9/Ubz3fxEu5mNAMSYgZgFiVigbArAawMgkaqImvcdWke+/sQTXf0Uh7s1AUUEo5gNiNpAqIMZq\n        gGiIh/2J65dP/d+2eNLfWDeTf0FWcv+NlSU3AuVMgFgWiDmAmBmIMQ0Aui9wVmctkPn//9Uze/60FsT9\n        jXRQ/l8Q5fUOqDwMiLWAmBuIQQYwYhjAz84Qv3J2z/+f3z7/27xs6p/8SOd/HvpS/8uSAn+yMDLkAjVZ\n        ADHIK5CwQDeAl40hfsG0tv/fPz/7s23FjD8RHvr/bJSE/9cmef0CGlAN1OQDxCBvgMKBBcMATiaGqOlt\n        Rf+/vLn+b+OSyX+jPQz/uWiJ/K+NsP0F1NAKxIFQA7C7AAjEE4LdTt0+v+f/gqltfyKddf6Zy/P9t1cT\n        +8KgYL6awSHvMINdViRQHfYwAAFVWfGS1vSg/6n+1v+sVUX/y/BxfAQKz2OwyTjH4FX/n8GjZg2QzwRW\n        j80AAw2l1IMrpvz39vX9J+MS+x+sCYZ3voSxVwCxF1YDjLRU45/cufJfN6wIoQkdwwzBZgAHB7tifXXp\n        XqfAiKeS7mmfoIoRhsE043ABKJ1zAnOkKpA2AGJDIFYBYkEGz7pVSJoZwBiLASAACmFQxgHFNQiDoowF\n        aIA3VLMXxIB6BgD9s5edGjob9gAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"hideCharacterMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAgBJREFUOE99kz9oWlEU\n        xtXGP6WJUIgJQgMW2iVQsFAwZhJBBBHkLR26vMnRIpgpnSO1o+AqEkGyhoAYMJtE7aCbQ6AI4iJCMbUo\n        Pt+7J99Rgwle8sEPr/fe83nOuUcTET2DZbFYdguFwvfBYHDdbDZ/2Wy2/cWBTDIDq9X6yTCMLr6Truvk\n        9XovFgcyPQ1mVtprNBp/5vM5tdttcjqdt9izgC1gXa2XkhmYzWZXKBSqBgIB/nXyeDxX2H67wglsfA1I\n        DVylUqkhhKDZbGYUi0WRSqUoGAxe4uwLOAAO8ApsGqCByng8xpIIfdD7/b6RTqep1Wr9xfWv4BC8AWxg\n        3jBwOBzqdDrFkgQy0Ov1ulBVlTqdzgzmCQQdAS5l2YunwYzdblcnkwmWpGuapudyOYF+sIEGgx8IigIu\n        g/uwtWGAJ/w2Go0IPeAMjHw+LxRF4RI0BJwBZWUgzwDar1arv1E/IRM9m80Kv99P0Wj0P85+ghhwAXkP\n        WHi6k263S+VyWYTDYXK73ffYzoMk8IMdsJwFmUEkEomjfqpUKkYymSSY/MP2KQgAHusX58AUi8VUnoNe\n        r0e1Wo0SiQQbxME7wNP48iTiKd8Ph8Mb9OIuk8nc+Xy+c2wfg22wDmZJDPjCa/wDP+LTCz6DD4Dffp36\n        oyQGLO4wp8oBDD/Z89QXMpkeAJ0ileNBVxQIAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"loadSettingsToolStripMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAfdJREFUOE9j+P//P0UY\n        qyAMYwF8QPwQiPXBPBDAphGGkQAnEAsDsRMQ/wNikGQHECMMAAF+Xi4GIy15Tn11WdPSRPeKGB8LX6Cw\n        OSMj41mQUiz4IIoBemoyPjuWdJ27fGzbj1vnD/1fM6XsHRMTE8xGbLgD2QCuGbUxu8/sXf1/17Le/2un\n        lv/3sdf7z83J/j/Q2fD/nMa4/z0lof/FhPj+A136Dag+EKQJbgDQJum5TfH3J1ZE/F/ckQY2ZMu85v/H\n        ty/+/+D6mf+3Lx4Bshf9B3rrf2OW3weg1nh0A6TC3E1uzW6I+//66b3/z+5f+//o1oX/dy8f/3/j7P7/\n        l49v/39g3fT/2xa2/S+Kc30P1BqJboCkma7iDZBTQZqun977/+a5A2D6yokd/y8c2vj/7L41/0FejPY2\n        vwHUagbSBzcAGNISCtIiV0EGgDRdOrr1PzAwwTRMM8g7J3cu++9lq7sHaIAUhgHAALoyqz4WrAmk4ez+\n        tRAMYgPxiR1L/gNj6a+mkmQ50AAWFAOAQAYYurdAgXj+4Ib/p/eshNsKDMwPkyoiTkR5mfeoyIn5A9Xy\n        gjSgGyDIwsJ8tC7D5/+RzXP/LGxLvpYX7bzIXE8pBWiwHlAelBpRALoBIKAjJSaQJS0u6Ahki0OEcAMU\n        A8jFWAWJx/8ZAKtpCVAVWEA+AAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"saveSettingsToolStripMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAdVJREFUOE9j+P//P0UY\n        qyApGKsgCCMBfSB+CMR8YB4SAKtD1sDPy8VgpCXPqa8ua1qa6F4hLMCzBqQOiP9pKkm2BLkYVQPZ3CC1\n        IIBhgJ6ajM+OJV3nLh/b9sPOWA0kiIE5OdgeCvJxJwLZGAZwzaiN2X1m7+r/u5b1/g91M0HRiIwZGRn/\n        AWk7FAOYmJik5zbF359YEfF/cUca2JCNs+r+q8qL/5cUFfi/sC35/4aZNf8zwx3+s7OxggzYjm6AVJi7\n        ya3ZDXH/Xz+99//Z/Wv/H9268P/66b3/k4Ns/p/YseT/+YMb/p/es/J/jI/FJ6ABdegGSJrpKt6Y0xj3\n        /+7l42CNN88dANO7V/T/P7h+xv+z+9b8B3kx2tv8BtAAMxQDgP6SUJAWuQoyAKTp0tGt/4GBCaYvHNoI\n        1nx8++L/J3cu++9lq7sHaIAUhgFiQnxXZtXHgjWBNJzdvxaCQWwgBnkDGEt/gVFaDjSABcUAIJABpoNb\n        oECE+RVm65Z5zR8mVUSciPIy71GRE/MHquUFaUA3QJCFhfloXYbP/yOb5/4Bhvq1vGjnReZ6SilAg/WA\n        8pwgRcgA3QAQ0JESE8iSFhd0BLLFIUK4AYoB5GKsgsTj/wwARGYaXejhOfMAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"resetSettingsToolStripMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAA9pJREFUOE9l\n        k3tMk1cYxs/UyeTioLQFuZsx2IaQbX9s2UCsxgw3HGwqWbesStMNQgRURri0KJUFx+RiAaewAQPHxW3A\n        ZBlBkKJT5ywigSgUCqUUevn6tfQG/Whr+d59Kv6x7Ul+OTnJ+z7vc3LOQc8kS49Bmqp0JM/egxbLeG7Y\n        xQIG3nQ6FP+xJAyr5/upy9PdZ7NYz62X/1+PDZSCxE3qb7kBugbBgaVO0Vljz8U24+91l5e6a6rxZuER\n        VTkvTFn88ebZzLfWuyhNcoKeID/+tpu6jM3SN+U3mrpFcvPVpmWLuN1hEXc4zP3NK6ae8yp9S1GnpjI1\n        WZHH8pJygp8azB6NQLK08E3KwjgWVpN6Y6ldaLOI20hiUgL2+SmwK6eBmL4P1lvdpLG70qFv4Y+qvv6Q\n        PZMesWWMzURo9OBWNJMRHqgqZjXhdek269Al0qGaIe1qGRDSu0BM/AX2BSk4MCW1l5DW65fs2vKDA/Ls\n        qJhxNn0Desihu8kzww9pzyTMmbpLSfvCJLk6fReMHULQ1/BAL+KCsfUUrM6Ng2vFTK7c6yF1ohSTImfH\n        sYkjfh5o4ottTEVOZKWuYv/yyvBvYF+cAGN7IehK9oLu1C7AineD/jwXVu78CsTDQTD3VoCu/APnQn50\n        uzQtKARJ0/y3z3/18s+4KMlBTN2kIg+BvioZsKI3ARO8QUGtJXGAVySCvpYNeHUKYKXxawsFUUNTGUFR\n        aIxHe2kum9ml4W934tX7qNiJ1NRo0OaFgjaHScF4AiYIB8uAiEoxQJnsW5s/4f/ngy99Y5CESwuQZTPq\n        NfxAwvBDCliHvgPr9QtgqE+ijhAIOgEDdEVMKlUsEJODFP2AV737SH6CcWWEGo76P/P2HDvqm6EWhmot\n        fSfJR0YVODSTYLqcSjVFgaEiEpYu7ITlGyJw6qZJq7iUxL6JsE0cZ5QOcnxoqPY9jw39qbRXZ4vD+sy9\n        OU77nJh0GqhrnLsNtpFmsEkaYFUmBqd+miRGG0lDw06XQhgwfivDl9WU7LURsSM3o58+eXHLndxgzmL9\n        bqnxlyTn8k0+ZdALTo0EnNp74FBeo4zKSFPrLtdiRahyJI9Z2HXYh3Yy3v3paxTt90Sth+m+t/MDM+Tl\n        wX/jja9YzV3xLmtf8pr16oE185U9rqWWHcT8ueAHw3w/QSePFnL2fa9/f6ysWHdU96n31p5MepzktH/J\n        VHVgr6IueFjxfciIrDbo2v0z2879cYyR0MjxoRcn/Kf5mT6KdkO5ez021n7uTWvL9H2tK5fxDkVsRxY9\n        up5L8ytI8Hz+0OsvrFc/FkL/ABYzMuCxj1wkAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"clearCacheToolStripMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAgVJREFUOE+lkkuLGkEU\n        hSeEJJDdMIs8hmSVXxJmEZ/4yIBvBCFGRBRRgmEwbhQkILhQxIU7iYjiRhcBxZ0QcCP4D4J/wG6dNt1V\n        lXM7o7SGZJEUfN3Vt+453j72mRDiv9AvJpPplAvwAXwBHZAF5+Co728GlWQyqQyHQ3U8Hqv5fF6h2knP\n        Hw0SHo9n2+l0BMQ4/rX8fv8GZ3HwaN+L8m8G5xaLRWq1WmwwGIh4PK52u12VDBaLBcvlcjTJGtyj/lMD\n        Kl5arVapXq+zfr8vsJdjsdgtGdDKZrNkQFPoGpQOBiRe22w2KRwOb5xOpwxo5LXX693WarUfs9mMud1u\n        GbWP4Ak4MngdiUS2y+WS4VkkEon9qNL+jleTM5mMgrMdnj+DI4NrBLdhTNeLXq+nkQjsTaRgMKhMJhMx\n        Go2Ew+GgSd4YDb7iUCMx7iwUCtEE78FD4KdgaYJKpaJngzBV1HtGg++yLHNN00ShUFADgYDi8/m2qN+4\n        XK7NdDrVUqnUrlwua/g2RLVaZTj7ZjT4VCwWd/P5XDSbTQGBaLfb3G63y6vViqPnaEWj0Vto3mF7MHhu\n        NpslBKSVSiWOv5Hj1xiNjb3KORcImBONRoPGp2zuGw2It0CCEQVEUHiUg5ROp3f0TdzVSHwFdK3RgHgM\n        XoIX4PKu9gzcgFfgKXgA9P6Dwb8jzn4CY6YvboKwi50AAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"exitToolStripMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        vAAADrwBlbxySQAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAAJQSURB\n        VDhP3ZFLSFRhFMe/eXml8e1cGHvoFCpToM5MM45OM5MzZlYgTWhEzK7HIsSEIFpE+WmRlGAtpFzMJokp\n        Cql0DJTp5Q0mIiV7oESZ0sPoQURhlua/c+9tEbRx0ao//Bbf4fzP+c457D9QdXVV1oeRZo7R7Zwf2Mkp\n        xNuP1XNMhfnnhy3caDRyURT59JMGjrEtfOKco1x1/qGLLaVR3PDgba8TS0xJENMNeHXbAzwP4vjeFaAU\n        HA4vBQY9mO5xTvU3mXNUpypTcpLWnjhd8hL3fIifsUGn1WC9OxPz4wHgWQBVZVlKbKBtFXDdg3dR/4B1\n        sUH3288KiEaLWeiaijnn8CiIo3uWK12P1FuAyXV4c2sNxAwDxCw9Xp93AtdceNxRd1Bxk/SEjTgUWmsa\n        /D4cxPxYABXODKVrPGIDRoOId9iUopXFqfjRU4bZ7qLZkaY0r1xAllzEfqK5vOfnyEZ8lHyw5AjITtFh\n        so928cCH9oY8pUBjjRmIufG+M3eutqYioLhlXe4Ou77d3zSDOx6E/JlK8pXWQmDIh0SkCEl6Ddz5Rsxc\n        LcPcpZXY5dXFKCdXMUc6W9O+DG1+igEPTtar8zeGqFPCj0/9paD9IH2RDi8iDoAu1bXDME4524gU2c8m\n        pA1R9Lpxt60QAnUqzkvGTIxmj7sQ8qq/ubCPFtq7GsMt2V9TBbafYvIpNcxqLRB3+4SzW+3spsnIJApK\n        9mVMqnUxqbJQfQtaejuYVGdnUr6JnaKYldASiuQFyrMUEyULwEIYiL+kWSD/Uoz9AmLTCVw3086MAAAA\n        AElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"copySkillsToClipboardBBFormatToolStripMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAB90RVh0U29mdHdhcmUA\n        UGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAAJSSURBVDhPjZLdT5JhGMZfO2NtxUF/gXXQOm1tbc1N\n        V2u1Vi3LryCHOUi+hAwQBvKRCCglhPgC0gDDCEyFafK8UqaiazVPxGmbtZjVQXXA+lhHnVy9Lc7g3by2\n        357n4Nq95/7toSwWoz0ZHFiOWbsYj6qZ0V2vZ9TXTjGatgbGePPCc4daMOXWiPZTXAmPmHO5lz7MkXuY\n        zjiQSFoQixvxMGqAP3gHsyn3j5186mC5Xhm6X0pCsT5orHLIdZ1QGyTQWmRQsafGKkWOGS3tbmX45Xpl\n        XFohGfL2QKxqh1Dcig6pAD1GCUQyAZR6MbJPLaUPi3buAb23LpPxpA2huBV0xAQ62odAzAy3x4SJMTvG\n        B2R/vKrmF5xuDLKrJPLYggdjengCOjg9KgzTWgT9JuzJTZ+6lSQzTiTSLkzMOBGfZsvsPcyutSc3BmUT\n        IUs+PFsaQXZlFCT/n9EhBfbkRiI8Q/LrYcyv+LGwRmPxdQhk1Q+HWYRqbv5BP7Ih7usuZV0iPiXvOEc2\n        iyls7k5i6/MUVjcimFv2YfCuGNXceIO9CLBDI8OK0qy9nU+Zuxtzn76mUfwyg4/f0th+H8fO7hP47ytQ\n        zU0iM4gU8WAycLukb6mroc6fPOrV3jj9TtVaX1C31BWUV04UxGePFXTii7+quZlf9mN+NYCQq7NU/gnU\n        IZYjLLUsh8vUdrQ0rFRzM0XcyK4FMGJr+872uMPlZo59FfMmhJin6ydvH1VTrleGy83G2yi2i0m8WqB/\n        H+DxuAdwuVFeOl5wKJq2+nvl6zwer+Yvp4wHNpwGaj8AAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"tsmiNewPlan.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvAAADrwBlbxySQAAAu5JREFUOE9lkltI02EY\n        xjUQgjTqIg9dhNVtBKFWRFRmUOBFXWlE5IlsgoQUKZZlisxjzrktFU952NHNqTs5D3Obc7qDbtNN5zxn\n        ZH+ji+iuwqdv/1D72/fy8H03z+993pcvBACt1bU1k9/vN8x6ff0Ot0dutjtlwxNT0kGLlZbeMinRmcZZ\n        sWfOHgr59+wCAisrlNe/CJPTjR6DBe9VelRIVQxxFJrfdd3SosiYk/uQXYB3MUB9/f4DG9vfsLC5BbMv\n        gMnFVRi9AcgmnJBaHLT4fbpfApG86FTs6b+QXcCEZ5Za3tqGa3UTtsAq7EtrGJ31Q2S2/6d3PZqfZcLe\n        iwyAxmqjnMvrpPMS+m1uSEi3g8aOsSlUqQy4Vy/cSeF2XmcAhKNmasg9D5XDQwOUUy4oJmfou9/uRpth\n        Ei/EGmS0KpBY82EnldfNBNT36yndjBe+j5+x8GmL3oNlfomMsg69xw+5fQ5lA2PI7VbjVm3Xzn2BiAng\n        KHXUkMsHBzEYvYsYJ+YRsoNajQnVaiOqNWZw9BNIb1UimSveedQoYwJKxH2UZNyBYIpgdI7agDcyLZl5\n        DAUSLQplg2CrjMjvGUayQIzM9oFEBqBaoaFUjllop+fA0xrxrFOJUsUQioJGEr2cmO925uFYdTTO12WC\n        JdQyAWypiuojy9PN+NA8YoXIMg2O1gSx1YUmgw0KhxfHa2Jwm9SRikiwutU3GICXHb1UTpMI2Y0isJql\n        yGnpQVqjBKy2XlzhZ+FoVRQtGlAZibDyw19C2aFP9wB3SnnUw7p2ZDUIkdsmR15nH9KbpEjhCxFecYI2\n        HiwCWN8D3HzLpcrkOijtHhjnlzG1tIHnQjVS+SLE1WUggnTdTRBeGYWwigMJrhVzqQx+F3Jb5SgkH6ZI\n        psPjFjkeNEiQ1qJAdpeaAKJpQAQBFWqtSeS9v4MLBVVUXGEN4l9xkPCai0vFPCSUCHC5tBFXy1uCnwfn\n        SJLg/PH8J8hXW5NC2aEhfwBb+54EkVCpdAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"tsmiCreatePlanFromSkillQueue.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        vwAADr8BOAVTJAAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAAM/SURB\n        VDhPZZJrSJNRGMdXfehD9K3sZlGLirQLmlpZKGml1YJS7GKWlSSJFqJheZut7GIlcy7T8pq6ubnpZnO+\n        WSo6p07nvc12MS8ZyatFRBR089/xfY2QfvBwzpff/3nOw+H8ZWh4uMlisTT0m8xVxt4+pa6js/xli0H+\n        XN/KVK2+TUY1NV9czV07d0aZje3NG9pksaKpsxeKBj0eaWpxV66ZVcIK7a+MUnmSw7Ll/4eYrDZ68vMX\n        jE58xOuxcejMNrRZh9BosqG8pRNyvZGph2rqZ5ZUmbRq9ZrZIS19/fTg+AR6hsbQbhtCh30Y9f0WlDYa\n        IKHq8PX7D+SWlCBXW4d0hfZHqqTSY0Zl0ba2052DI6SzHVXtvZCRblJdBxPw/sMkphno1uFAwBEcyZRM\n        HRMVe8+oLJJ6Hf2idwAaYx8ToDL0oKKtmznv3OJDmpOGYD93OO/chT0PiqaOi0unA+awNiGzqpamuk0w\n        v32P1+/G2T2YrFBoayAvl0GcEAnf9cvg7bkVXrGCqd3hMYFEW8DaBKGKol/0mGG0j5DFWdE8YEfRMwr5\n        WenM+MB3pEaeROh+Z4SGnYHTXl4k0ZawNkFQpqZlzUZMTzE9urC6AWE30qAqe8Lov79NIiU8ACG+WxAf\n        HYa1O7z4RFvJ2oT7FVpaY+xHTdcriGsaEVOsQkSaCGpJNhPwbWIYp/xdwHPlQnDpBBydtoiI5sbahNty\n        Da0my6O6zcita4VU34Vr2UUoFKcwAZOjr3D6oAsC3FcgJsgbDtz1eUT7F5DwtJKOeCxFeI4UF3PliMhT\n        IDRHhvC4ONCDBtRrS8DbwYXz4vnw3MzF0nUbC4jmzNoE/xtiOiSjEGHZEkQVKBFdrMbZx3IcupKMhvzb\n        uBcVCP9Ni+C4cB427D0Mpz1+yURzYG2Cz3URnaqkoOroQ+PAIAz2UcRKqnE04RZ5wCdUZcYjKdgDfq4r\n        sPP8ZQTy04KI9u8feKWI6HMPSxCVr0R8mRZJ5RQu5CkRcDMDYyNWlIn44J/3QSDPCzyBELGV9ftmVBaX\n        q/fobfEP4JYohHuyCNtTxHAXZMEjOROHrqeDF5sI/+grOEjuQY8UiKtu9eVwOJw/m3kvmJXgWpMAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n  <data name=\"tsmiImportPlanFromFile.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvAAADrwBlbxySQAAAttJREFUOE9lkttLk3EY\n        x4d/gJdFXYgmdBMIkVpXldlF6E0EaUhUKpqSVAhqM8sUsXDqnHO60mkedvTdQXdyHuY2d3Kbuumm2zxn\n        JK/RRXRXsW/vXkV57QdfHnjg+3me58uPBYDW1va2NRwOm5eDoTGvP0DYPD7FlMMtn7A7aZnsLpnROleW\n        fCE1gXX04r5jQHRzkwyGI7D6/Bg129GtNeGDXMsQV6n/2zEirztz7jwNYQCCkSj5/ecv7B78wNrePmyh\n        KFyRLViCUSgcPsjtXlpdGuMfgYSoS0pOSWAAHIFlcmP/AEtbe5iPbsGzvo2Z5TAkNs9/ahvV/24SqzIZ\n        AL1znvRt7FCT1zE274eMmnbaODjrRovWjLud4lgeb+gGAyCesZGT/lVovQEaoHYvQelapOuYx49+swtV\n        Uj0KRUpktX6O5fNHmIDOMRNpXAwi9OUb1r7u0znYV9epU3ZgCoRBeFbQND6LihEdbrcPxx4IJEwAV20k\n        J5dC8FIGSzCCOco8TWXQrreCo7OAo7eBa3LgiUiNXJ409kioYAIapBpSNudFfIv46lydGW8VBurmWdTI\n        DGArJtCstaB6dAq5AimKBsazGACOUk9qvcswLKyAb7CgckiNRuUk6ijj4y4Cac8FKOrRoFZFhSgkUCY2\n        MAHNci2pocIzLobQO+2ExL4ArsEKqXMJ6ZVCsHLqkfaiGzWqGdz/pIqVjehuMgC1gyqy/KMEpUIJynrl\n        KO8bRXZDH1Kfcmkzy0Qe1iMl5r2fpWrOMeBOI5982DGA4h4xKvoJvBzSIKWk7cR8Wocg2THg1jse2UQY\n        ofYEYFndgHt9F/c4YiQVt55AjqbHlZh/aoPr9TyysGsYFSICbOrD1CmMKOkjUNAjQ3Lp4RkXn/HxatyG\n        IrERbIMzm+qdZHC5poW8wm5F+msuMt7wcLWej4wGAa41CnGpqgtnCznIbBAhT6RBwYAe1bo4oJ71D7qM\n        vjXrw+JbAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"tsmiManagePlans.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        vAAADrwBlbxySQAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAALvSURB\n        VDhPZZJJT1NRGIaJP8JEFwb1FxhFXRgVdGGCCzcComEykpIQQREQRBFCwABSylikUBlu55Hb20sZSicK\n        tAwttFDKJGIkF+PCuFPT19PBxZU3+XJWz/MNOUn/sru3Zw+FQtbVQNDo9fk1Ds+ianJ2XjnucsfK4ppT\n        sHanIPnc+RMJhJ/wzg4XCG3CvuiD2upCD23BOyXNK6GW+dM+qqw5eer0cUlgM8x9+/ET+0ffsXFwCEcw\n        jLnNXdgCYahmF6F0eWPVZWB/d8s0NWeSz/Ils/5VbvvwCCu7B1gI78KztYfp1RBkDs+xeq9mfjVQussJ\n        NB7GvcAtbn8inbdgXPBBQbr9Dw7NzKOZtuJeBxXJEA3fSKDxUNMObsK3Dtrrjwn08yvQzi3HXqPHh0Hr\n        HMrlDPIHtEht/RjJ7BzlCzqMFo5dDiD4+Ss2vhzG7uBa3yKrfILFH4LGs4aGsRkUj5pwu20kktUt4wuE\n        epabWAnCSwBbYBNOAk+RG7QxdrSYbGhhHBBaZpE3oEe6SB7JEav4gjq5gVM4vYhOER1daLLijcpMdp5B\n        pcKMKtU4GmkbKtSTSO+Wo0A6lppA42nRMhztXYV5aQ2dZhueD+tRr51ATRQkozcRuJl1oVpHjijWQECZ\n        +YJGJc0ZyPHY5SD6p9yQuZYgNNshd6+gz7oArTeAJrMTlbpp3P+giwhGTTcTaDzVQzquqE+GQrEMgn4l\n        iiRq5IoVEAzqUEiqhGLwVMGinAgypQY8086kJdB47tR3co/apXjcS6F4UIPSYQPy+pTI6KKQ1aNAjoSI\n        RhiUqqfwUErjhdF+K4HGk/ZWxDVoWOg9ftjWtzG/tY8yyoTMLhke9CqRN6hHkYxFGblBzjCDCtrJF1yv\n        FXH5XSMoHtCginyYGhWLJxINsnsVyJVoSXcTSlSTeDnmQAHFosrs5gsuVDZzF6tacemVECmvRbhS24mU\n        um5crRfjWpMk+nlwl0ySMWBAtpRMYIoKkpL+Ai7ITNdrNpjxAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"charactersComparisonMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAwhJREFUOE+N\n        kmlIk3Ecx5/teVyPbktn7tBybmoebXPqKueVT+qW85xWpJlbsyzJ7FAJOuxOIsI0qZDSDizpIEsllIJC\n        lG5LiSiCelPUmyh70Z3f/s7nhShBH/i9+B3f7/+k/gcBwWCKTayuqztZuKZsh7ePjy/fmopSqZjZ1Ng0\n        YLPZHHyJEkskPnvOnR7+8vM3tp04PrpyS/UxoVBI8+2prF61+oLcz7ecTynGw0O8amvN1cLKCmS5nKNF\n        GyoaiIGQb0/FEGVwkl0zfEqJpomkzRcvv+vqu410xwrYSp33/2ngxYp87ZncOqmYlfMlSh2iTX365jXu\n        DD+BeXEeUoqX/RL8y2BT2aKW7yMvkMcF3yWpYKymnBWwsOvhAzT3diLIbIKluOgnQzOcWCwOGetT3hJ2\n        Tm9H41BJXkyr2aA4bI1TQ+vPPk+OCyt05JuPBgWruZ0tzSM1xxsg04VBn5T0mRyxkhjo3QZhGoVjoKcJ\n        loQgXGnd+uNwrRM6tejPreuH/ty70YhYnbI1IjHxvC5zEViFHIyIfUxkZ+VyeZrbIDoysNZqDkaAjMLN\n        7lNoq1+H+AgZ7EkaqGd4YKaKbUstyN5nKXNBbTKCnibqJ7JSEgJKo1GH3+yox5unnShI0cKZq8fBqjxY\n        5isx8n4QBzbmIs2oApeTdsZUYP84KybmpVQm07pXHkMXGcoN9rfhVvsuZJGzuxbHY1u5BWuWGPHpwyNs\n        X2uFPVWHVGtyLevlqaIZxpOXjhMZEbKgr/MgrjVXI1mnxPKceKREKVGcEYm3r3pQsTQOdosOgQHyE2R8\n        pYAWRo8reWiaZja5uKH9lZnQB0mwu6oAmXMDkJWgRf+lOjhyo2CO1YxOl0p6yPheEulu4UTyMxL22ZNC\n        EehHI99i+JqdqBgNV0uHXTmxmK0QwltCfyNjz0i0MyKR0i2ayIqllu215Rw4oz9UKr8jErHX2CUJuluq\n        sUAvQ2ig91ey0xLy9n7jikmwLOtpTUtYP2+u0THxj9vS4zbnZJh69PqIbL40CYr6C18KBbVPt17wAAAA\n        AElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"blankCreatorToolStripMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1\n        MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAADsQAAA7EAZUrDhsAAARmSURBVEhL7ZVlTxxRFIbvj8CL\n        hWBfKCFQpLQUWtyluLvbLu7u7g5BAiSE39iHOZPJBobd9gPfehLYnZnzPu855965q8LDwyMiIr5oERkZ\n        GRUVFR0dHRMT81WL2NjYb1p8Nwt5RI4ko0ILAQ40sIQSui1XoOjj4uJ+aBEfH5+QkPBLi8TERP5zyU2C\n        p6QR4idm4iQ2ig9BG1yD+FMLiMnJydyklM9aIOF+SkqKmBFciqWtk9goqZpbPDO4KJOSkuCmpaXxH6i3\n        t/cnm/D19WW2PE1NTcWJHPJRvXLCRskoBE0t5CFAhjgjI4P/gYGBHh4enp6eXjbBJTcxzsrKIi09PV3M\n        xAkONJme4oMLKVnQCDIzM1Hm5eVRpru7u059E3jQen5+fk5OTnZ2NiqcpCfDRhlVS8lwSc3NzS0oKEDm\n        5+f3qnbbYFbBwcG/tcCGgsRGWodJ3YqmpGrQEEkCXVhYWFZWRhIIHWYWePv4+CAhuaioCBVaLuFINxAU\n        H1zgLGjyiouLEVRXV9McQ9Bh7wQe4GpqasrLy1GVlJRAoCGjG2UMBH8ek1RRUVFVVdXY2IiBnQWQoEWG\n        09TUhAc1oRUb6QaywooLqbqyspKkurq6hoaG1tZW9oBDA1qkg/b2djzq6+vRQoADDSatKOilpaU0SNWC\n        bm5u7ujo4KbOsBuMKCAgAHpnZyc1oYVQW1sLDSatKEAY0iD+5JEE3WKxcN/hAhAY8NKhQtLV1UUrLS0t\n        0o1MTAkdWx60tbWR1Nvb29/fT0X+/v72dxHBDHlXhoeHBwYGrFZrT08PQjjQYEJWtMN6SuHd3d0kkTo0\n        NDQ5OckJ6OLiopPeCScnJ7bJ3Nzc6OgoKiqjFTi0AhOy4g9DbDHv6+sbHBwkdXx8HA3dcE7YaYIZhoaG\n        Uv78/PzU1BQqtBDgSCt4KP6MsZA6NjZG6uzsLJrt7W1ecldXV533JuiPCe/t7S0tLS0sLKBCC0FagYmH\n        4o9vjAU6JUxPT1M7gtXV1f39fZba2dlZ570JNzc3BkLa+vo6+ajQQoAjqwJZSe0jIyMTExMzMzMUsrKy\n        sra2trW1dXh4SCoHtelxxOiCgoJAHx0d7e7uks/35eVlWocjHpCVTIZrg76xsbGzs0NdKK+urjizTKfE\n        fNjst7e3p6enlEI+I0ULAY7Rh2JefONa6Jubm9APDg6Oj4/Pz88fHh44sEz3EqNj/Z6fny8vL8kkHxVa\n        Ww/WQ7HurAx9Se00Sx5FXV9fPz09nZychISEmL5xLAA/hdDxuLu7u7i4IJlWDA/ZWorRs/rMjglCJ+nm\n        5obGSWIHswvtvM94YM+Wp/zHx8f7+3v8xAMaaw5Z0QjfGB8T5xlOCDhHOQAYgsPDjgTSeF1YKoSg4Jyd\n        nTEGPBiUopfFxUVeYM5xXl24TJxVNd057wU7ChVObLmwsDB+u9j9YFnRl9NUpkwGLTs8fOwHZdGToPg1\n        ffk94Bu3/qnevwyKZhJKv/qw+G/gMD7YwMvrDwZFEmHYLpdoAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"dataBrowserMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAq9JREFUOE9j\n        GDyAiYmJmZ2Di49XQFhKUERCWVhcRl3X1CbcLThqsUtg1EJnv7CFUvIqxkB5aWYWVjaoNgRgA+qWVtKy\n        1bVyTze08803cvArcglNXuoak/jfKzn9v3lw9H+fqPRecye/XKAhMlBtCMDGzsmtpG3qa+4WVmvhEdEA\n        wp6xOWtLp/b9z+ju/u9VUPG/umvSsdya5q0iErKaUG0IAHQBt6K2iY+lR3hdWc+0fcW9s44V9E6/FdvS\n        9j+5q/9/SGnt/wVrt9wqbmjHbYAS0AALoAtyWifuzemadjy3Z/q53P5Zt+vnLH04d+2mt4vXbr1Z3tyz\n        VRjdAElJSamClqk7c7sXXSqasOL+hO2n3nVuPfmxY/2hj+0LV11rm7f8wpJNO+5OWbTyfEpB1WIRCRkN\n        qFYIcHRwdAxee+B/+IZj/3sOXf+/78mH/9Un7/8v3nvp/8wNe591zV9+rnvBinOVnZN32HiElAiLSakw\n        AgFUO8SAsEWH/seuPv6/cu2Z/3PO3v/fcvr+/7oDl//P3bL/2ZRlay9MXLLqfAXQAAfv8HJhcSwGhEze\n        9z9+3on/W0/d+X/t1ef/TSfv/q8/ePn//K0Hn01euvZC/6JV56p7pu+0BrpAUFRCCaoVAuzs7J18mzb+\n        j+478H/5/uv/zz35+L/52I3/VXsv/F+w/dCz/sWrz3XPX362smPidgvXwCIBYXEFqFYIsLKydnYvmv0/\n        qHrJ/2Xbj/3fe/ra/+rFe/6nT1z5v336okvZFU1LUotqF0SmFU01tPFI5RMUkYVqhQBlZRX9lPppP5Lq\n        Z/xLKO/9F1va+S++cvK/yMKOP+4BUY0yShpmUgqqJhJyKkYikrJawETHA9UKAcB8wMTBwSHMysrKxczM\n        zAbELCAMEkcGjIwgjBR4lAMGBgBHwSFHBQ00agAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"skillsPieChartMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALCSURBVDhPtZPfS1NxGMYt3dkv9bCZkqJizuY2c2y2+Wu6\n        s6ls083pJKbbaCczU8hQkqSL9EzBoDQyFwmVRBhGF94oCZbEboIuurNIuugPELqTqGzn7X1XhBJe9sCH\n        M3be533P8z3vSfsfSkckiPQP2ft+MwjdP1QShmF0nZ3+md5o+CUf7ko4Qp3DdA343IsqVbYHaxQINTpC\n        hv2S6HQnQ/fjs7scxyWN9maxstEhapxcrNJqEm11lqTP5/thMhruYC2L0BP9VQZO1s/PCbt2NJc4eShw\n        DIHyVBcoa5wxRYVGzK+qEOsddjFoMPzMVasvoycLoagpMU6n7TZNLmiMQtvNBIQX3kGuewJYbyiW7a4B\n        mVkrGlxOoAFtHvt79JQiMjJTFpm/tWnT5GoXWfsoGEY2wHL9DSh7VkDZPRzL7HZAeqAOikMekYb0RoPf\n        0VODKKnBUUTR1mRP6NwByGqZBJn/EUjOvgbm0jYYuwcfZFx0AzsRAa3Qn2rA8/weepoQipFqILfVVj07\n        7ekQc1wTwARX4ETHvQ9XzObZh+Wy9f5m7bK2z/WVm+OS1EAYH91hWWUz+ugwUxEU2UplMMpH97Ttsxtk\n        jJfJ1pGtxzopxIuZnbW+hufUSD/Y+jkaPvM2T61uQR/tSErSBqtVq3GPXIiXyZ+QEa+wpJfAplkKW94i\n        +Bi1wOpYz6sG3n5jaOAcvUpS6gxItF2qu2Xy2lum/OSoIVecqVTDkkUFgrtQTAxwIAgD4urThaSt2jJv\n        q66q/W07uJUKQ7nG31J6fI1yjvnqxWlfHQi9reLiFJdcXV5M9p2PfCouLBjH2iLkwCKR6DAz9VpNh4pl\n        J3sC3m3hauTbzCS/Nz117YvZWPFCIpFEsMaIUPYM5B/Rn3IkH7EiXoRMXUgjUoJQbvoWDhXlosejwhwk\n        DzmG0FTavH2T09J+ATOr4JoITyPYAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"implantsMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAABd0RVh0U29mdHdhcmUA\n        UGFpbnQuTkVUIHYzLjW9RaPJAAADuUlEQVQ4T22Se0yTVxjGv0svX29WPpKVMNq6OiYBVrFcZmuBTYOQ\n        IGszJpNWgSiXbAMnDFAoN5EOQZDbuEiAMVARmzQajJszilFnEDfMIuOPDTHTBXfJZNmyhW20z86HW7I/\n        9iYn55yc8/zyvBfq/4JlGdoSE7PlSE1N65t5eZezHI4rezIzR+Pj4lLJM/3013/CbrcbnQ7H8VeTUxLD\n        Qp9XpnBc1wWPB22trUhNSUFLUxO85F5RWoruI67rRdn2Tf9IKSo8PJyOiIgoJMcXba+8fG/yg8HHZ6KM\n        /ncMBvR1daG8pBj1dXWYv38fQ51t8NRXYm7mxtchGl67ClCpVJxWq92mVqsjwzSa2s6XYv2DsdHo53lk\n        RUdhpHo/+tyH0FN5AMMFe/HDg68A/wre3rW9hmEYOcmXldI0vdZgMMSW8HxGjlKJJE6GushQLFwdxrd3\n        zsLbWYspbwfR/Qj4/oQQ7irHhFgkDhVMiAiAtZgtVpfT0fy6xQKrSITrjfuxeK4Djz7qxV8LH8N/+ySW\n        r7TjzvG3UJZpgyvDOsFJuc2UXC4Xm83mnKiNG1uiTaZfjZGRK9slEowU7sKoKxst+Wn47nwbHp6qxWx/\n        KcbKd6I1JRz5u23DMk5mpQICAgJZhtFrNBqTmGH3ORWKx9WqNTiWsQ2nynZizLUb33ia8MecF76fbmLy\n        aB5u9Zehr7f3oohljRQphJikIVun10czLKuPV6sL3Kaw5bO1WXDbTGjP3IJHYw347bPT8C/dhu/hJTy5\n        exFTtybnpSJxrABghToEBwfrSC1kMhm3Zrw+Z+n0uzaUWHU44UzEbE8xvj/XjKXLnZg7UQJ3WhQsLzx7\n        QSGX7/gXQJNWCgCOLKbBkeD1uDL9PW+YkPYcjxuHHZgdqsBMdxEOp29Ge0Gab8O6kDYCSKIEgQDQ6XR6\n        chZayrjSzQNfjtTiZvM+HIrXojcrAXd7D2Cqrwzdha8hOzluMZDnD0olktU20mQWaL1eH0LEMqlUwnQU\n        pE7//vm4/5dPB3GyYCuuNu7FFyPVvmtDNYvnB6rmK3Ltl5QKRa5IJOJXATExMSoyzjwByIMC1YHXPmxY\n        WFl+4PM/mcG9gYPwlKejak/ytEqhqlTIFMVKhbKI2E8m6UuohIQEqdFoNBCxmCE1EIjP8Gu16TuSjo6P\n        vj8990nfzxPv5WLrpg0jKqXSSWyvJxMYRFwriYamgoKCWLIzDM0oyC4SAIRMMpGGicWSJF6tzs9OTTwT\n        vl7fKOO4aMGx8OdpUNTffnZ901wfEN8AAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"showOwnedSkillbooksMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAABd0RVh0U29mdHdhcmUA\n        UGFpbnQuTkVUIHYzLjW9RaPJAAADo0lEQVQ4T12TDUzTRxjG/0Ants4FcQw3smRRcTLRiWGVIaAwwAGi\n        QElhwrClVYikpYBOoC3Il9AKSw1FKCtfykfRbpRiC4pMgViVsEwIGwM3hxth0REZgS3Mrn121GZZfJIn\n        l9zd73nv7s1RL8t3i2tQ9D7PsAtZEWFSfkjALs+3X7Mv/SeH/8k+9UJu62mbPhdGL6olsVDlsdBcwkX1\n        6UPLMmHE4+rcowO1BSnyyrxESVw40y/iow98Xt/oyrCjL7TX0y3zopiDqtxUVIpiIYjZhvCdr+Kgtxv4\n        EVtQV5CEnhoB+hskGLwiR3xUUIgdpSgazWnNmZTgybr8JCg+S0Q9qV7K9UHCh+7Yt5WB8jR/1IiP4lpD\n        GfpazmPYcAn7mbtC7ThFBex+J/ietsJys7kU3SoxZGeSUXIyAGw/F2QneKNSEIQuVQn622ox9GUzbhuu\n        Lm1yd/e1wQ5ONIfik5GtE0YlStJiIJOkQSHloUstRnzITlI5EapSDowdStzpasa3t7qgaVSavbZtTrQF\n        uKxb637niny+SZYDdlQgQr3fQtyBPWAROJcbjFN8FqQZh1FXJcH1VgV+enADZ0/xf3d2do60BfCiA0/c\n        /6oG3+gbMW3SY7S/A72aWpzLF0AsOgY++2Pw4gLBPcSEMOZ9mIxqCFPZk6SLbGodg+GsrS8f+22sD9rq\n        AowYmohVuN+jJmMtxr9uxcxoL2a/G8SDwV7cHdBj3GREekp8P6mdSh0JDYhslefhRosMtzuqMf/DMJ5O\n        DGPsugbTwzrMjOjw8K4OT6dMWJmbhHXxCe4NdONYQmwbCUinrjbJ2ixLP8L87DH+XvgZ5j8eYZacZuZm\n        A2ZHNTAvTAB/TgPmOeAvYvMyRm7p4b/Xt9LR0TGDKk4N1R5k7gCHHWUuyM3E5S8UVhPZMDs1ZF1ZeIjn\n        S78C1gUAzwDLIqyW5xgydq68t317OXnEZKqIG94WH8YEKzYaPB4PIlEWMoUZOMH5xHo8OcYiL8y2tDdW\n        /TM+Sq429wvm5x5hsFf7xMPDQ8pgMPyo3V6bN/LiDqSXiZL7irM4M+clgkVZYQ7OFUkgryiDSqWCRtOJ\n        bp0Oxh4dDLoOtKsvfL9hgyuPTqe/YWsjEZ34TeJ3GfS1gfv9fDjchCOFsvyMa4qi7Kn6qrPL7Q1KS59e\n        i86Wi6iQ5hhWq9NotFds9Eta/aJOxGuI1xOvBnv579lxOOt40mllsUj7KSsym8AuFEVR/wK6JfSa4PYH\n        MwAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"optionsToolStripMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL\n        DAAACwwBP0AiyAAAAAd0SU1FB9kMERAMI8ZEp7IAAAMVSURBVDhPjZMJSJRBGIZndU1dtzwqpSgoPEpT\n        1tV1vXXXvNJ0U0szRSwrtV3XsPCgwuzQpCK6wLKDgsioMFnJTok2jVQqNStJrNAuTDcLUqz+t++3LSEM\n        euH5v2G+eWe+mX+G/S0TExNjiwl4TEkU/3T+r3izWaFWHUvR2tXZcS4TCETm5uZTaIHJJ3Own2lssSll\n        RZtLrl6sed/RrEfTncZXT1paPocqFE4atdpNLBZbUVGTT7I2I936rq52rKejHfr6Oq6/5xnX0/kIo8ND\n        6G5vw5veFwOeEslcGxsbkYBktDGWnr6KeclkwlOHDgw/b2vFsb2VePm0C/qrOgz09cEwOIiRLwaOG/vB\n        NZw/8720pHC2UCjkz2ZCh8vLbq9OXob8zDQuJzUZOzZpcbRiN0Y/GdD96D4+D33EYH8fmm/UITV1pWSq\n        WPxrG2Ir0XhMiFQgTRWL5dERCJJ6PlYtVu6j9vtidS5KtRqqYBhXTldxA2/foeZkdf+46bekLs57kyLD\n        oAoLhULmiYM7t7UYUyxA4qFJU8WjICsDRbnrUFNdBX1DvaFIm2c7PmCFn5wFe3s5qpQhSIpYjACJO5oa\n        rqC1WX+E0nx5Yj+pZEtsSAA6H9xDiWYDdOfPgvrtCHOCMZ9FC8tjgvxpdS/cunQBXz8NAd++4qautksV\n        EZbv4eK0PdzfG16ujritq0P9hXMfyOZNzGN2NtYsKyfXMkIuhctse673aQeZR/Gh/zVOVFZwK6OjEO7n\n        i3hlMOc+fz4XpwjGwgXOFWROIYIIxpaGK4NjQgMak2Ki0Puimxt814frVOaujWos8ZejeP0aKOUy+Lg5\n        oViTayDLcUJLRPN+XoKUuPgZkbSNrOQErE6M4w6VlaCysADXai9hD0WqADGBcghNTRtp/H4igXAYN/Mf\n        kaWFmZlQ6BPmJ7+4PiUROwvyUL4pH0XZmViXuBT206xHKH+Zhm4lfAlLYuI2Gl+dyEpkIaWYHRXo/3CO\n        /fTGULmsy8HWdhfdl3zqDyT4R/PPN8WLz1gQ/G+aQ8wi+FKtiL9cjP0E5b9G/dnJ/fYAAAAASUVORK5C\n        YII=\n</value>\n  </data>\n  <data name=\"forumsMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL\n        DAAACwwBP0AiyAAAAAd0SU1FB9kMERANMSzm57sAAAIBSURBVDhPY8AFAgMDoSzyAcuh/Xu6yjIiI6B8\n        FMDDysAIZWIHYZ5Wdr9//fzfWBD3H8hVhoiSAGwMVUxsNEX+WyhxgQzQBGJhIGYGyREDuDRVFf9XleT9\n        N9dV/ichxPMNKGYIxDxgWVygoqxYNyrI20iUi0FTXVX5f0Zc0H8BHvb/cuL8/+0dHNK9XeycoUqxg5fP\n        n/w/tW/Tf1FOhiYNVaX/Ohoq/0X4OP6LCXD8//Tx/c9T+zf/F2ZjCIIqRwA2ZkiAhjobfPA0lv4vxMGQ\n        pCQn+VZbXeW/ENAF/FzM78NgcpwM0UyMYK+wgDXBQFyA44YnN878zwl3/B9qp/qFj4dzq7gg9z8eDub/\n        XraGr5/dPAuT+wpU7gDEImCNMNBWmvr39eOb/1sLY/4XRjn9lxUXuC4vI/FfVIDrf3tZyn9kOR42hjKg\n        FgUgRqSF5pLU/28enP+XHmj5PyfE5j83G8NCXl6emSwsLEWtZel/keW4WBh6gVqsgRgRrYXxfhcenN/5\n        P8Xf4n+0vSIo7qcBsRVIrgBTbioQmwMxE0geDOy0JcIa033+uxhI/RfkYjwFFMoHYlk2VtxyQIwAAdaq\n        HucObPqf5W/0T1mU9SBQSBeIwSGNTw4Z8DVW5K0MdTFeI8DFkgDkI6c6fHIQwMbGBgpRTiDmBWJ2kBgM\n        4JZjYAAAuAa/AxwU//gAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"issuesFeaturesMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAmxJREFUOE+FUl1IU2EY\n        PhFBXRRtzmXTJkLY+ofugigvgu4q79JdBF1GdNVFV0VgWaH7d7h5l7SkBToxcN0E2Rr9WSSmplA0XbqW\n        pq7znb/ve3vPt3O2YKteeDiH93u+532/930EEnIWEWxA1BvYVc5zNAok4LATrzVIvDVtJFQ+L5P+JeCv\n        qyfR/W/VN0FQkpcY8dmumSJl0t8E9HzAEdOmB8EM+fEFIB7Lif8L4Fe8s/msMnpRY2IeQCVcgP2YAdLT\n        OKxzqwsEEB6rC6sE5IRbYoVvwNbn+WUz5KFzBZxJU1kg4BAwYRG7trai2ID8qHVNmx3BchTYrxyw3Adg\n        S++B5ad5J9q7KJDu7W7j8s4WHEq/HDuZUVM3gS6OG3UwqApseQ60yQdAfLUcypPLQOfTgEXv6hM+LPUd\n        zNKFl5xcEYwBXZoA+uUp4ApB7NwISsIN7OdnIL17HgpSb/MwzaQMdvXQ29YHJ91vATXVAYwsA5NWQOo7\n        lBSkyN5Rtp41qH+E3o20CqApCBnY6lcuYgYTv6PAgSQ+YUe7PNSuapMxoAtpoNnXnKDNDIIU3bco9R//\n        pI7dwC6mimtUCvyc5T8Czu0eDhFt6qk5iu+7hfPowQ2kWW4C2MockIhrlnRb7KRr2xkpvHtMG48AMwTU\n        Z9fRTNa2ogD3AK5R94CvtoNmngOgceT4aQU7PMY35a/bQry2TlxvXhk5L6JXwnhvkyGAzuOWRYFwU5yt\n        ZYpVXnn1XV8peUX3v9fmwMrNpluLAiZBFwk5feqL26BNxUEeOCUSv/1I6bwKKpPBBhcaJIJeT+D/Vcxt\n        qOCU4BR+A/VxmPHJ2zD3AAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"readTheDocsManualToolStripMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAb\n        rQAAG60BIeRSlQAAAAd0SU1FB94KHAAvNmk5io0AAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAu\n        OWwzfk4AAAF8SURBVDhPlZK9L0NhGMWvwWK0kdhsUiFNaEnc73tJblpfRWeLECEhKYtEWjUaDGKzKSJ0\n        kRiQ2EQMZn9BJ4Mdvzd5mjf3Jg09ycl5vs657W2NBDqiKOpKp9Od0v8frutW4Cf8gd/w3XGca7gHV+Aa\n        s114Ytv2hNg0WFxxtOR5Xo76zrKsUWqX4zH6SXZTqkY36BfFpsHwkWUD/YBfmE30EN4wvxVeMC/CBbFp\n        sKxxnEe34Cv0YYnjkHmKpw+gWWVuFfDEwT08gm++7w/xNcapV9mV0Qq6SVARLYhNg4NLZVZBsKGejNaZ\n        HVPvUJeoD6hbBjxD9Qs0ORwEQTfswzCCMWOaZr8yw3mxaSQDMLgcnlHX0eZLrKlPwGxObBoMYwEcD8oq\n        BuYF3sOstBrtBMAZaTWSATAlqxgkYFpajXYC2OWl1WAYC+B7BrKKQQWwy0mrwaLMG95GlwlYR0/RB3hO\n        XUX3ofprv3AXiu1vcNyLKUuITZ0Jw7BHVsAwfgFGdsUoafQwaAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"aboutMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL\n        DAAACwwBP0AiyAAAAAd0SU1FB9kMERAXCi3A9EQAAAH7SURBVDhPY0AHa9as59+7f1fglXNHFx3es/Xo\n        kR3rjtw8u2bR5HT7IGMFcT6oMuxg/4ED7p8+f7n24u6V/4fnVP1fNznnf2Oc9f/WFMf/XZnu/4NsNc9I\n        CnIJQZVjgtu3b23+cHXX/1eHp/1/cWHlx01tAatslAVXKUkKvLXSU/gf46L131JHdiZUOSaQYWDgOTo3\n        d9+emUnFUCE40FMWv+FrofQ/IczrAVQIJ+AAYkZGRgZOIC0IxLxArD2nu+pZrIfR/4xgp0tAPisQswMx\n        VsAExPxArKysrGK2Z8/u+XfP7fvfVhj5P9lJ439daVo+UE4diKWBGGQQBmAEYl5tLU2je3dvXjuwZcX/\n        VF+z/5aqQrfC7LRLgXIGQAV2QFoHiLmAGDvoLE2qfHD1zP+6cNP/1spibRwcLJJAYSUgdgJibyDWBWKQ\n        d7GDsmTf+ftXTnzrri51HchVBWJnIA4E4mAgtgViMSAGeRcnAIWDJQMTky+QTgHiOCB2AWItIAalBWYg\n        xg1Onzy49tb54//dzDWvArmJQGwJxAJAzALEBAHPqtm9/w+um/M/O8DqPxc7sydQDOQiUAATB6z15GZZ\n        qEv+D7PSuAnUFQkUEoXIEAGYGBlBgaMBxIVA3A7EIP+DAo0kAPKvCRCDQlweiInyOzoAaQJhHH5nYAAA\n        +d6UlY5W6VUAAAAASUVORK5CYII=\n</value>\n  </data>\n  <metadata name=\"mainToolBar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>679, 16</value>\n  </metadata>\n  <data name=\"addAPIKeyTbMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKtSURBVDhPYxgIwAHE7BAmYcAoISEhys/PLwjl8+rp6enI\n        yUloAdmcECFUwKgFBOLi4oogDojOycnJ83ZzzARxubi4JHU1NIzl5CSNQXyQGhQA1Ot048aN29N7my6y\n        MjDoykiI2OVmpjb4uto2sDAwWAGViPBzsRpzsTKADBADYiaQPjgwN9SuvnX5zP9ZXZX/OVgYSrhYWY1V\n        pPjqJfmZG5iZGZyUZGVNNJSVLYX5OE0EuFn1gFpEITqhQJCLNdVTXva3sRz7f05WxuZAX8/axMjQNmNN\n        2UZVacFGTTXlWA0NFXsJYT5ToFOM2dkZlKBaGRiYmZmdFi6Y8KG+vv5fRrD1f09DxbdeHi6bU+Ij+6z0\n        lJutdBV6dDSUKlRVFV2EeDktQAawsTGoQrUzMAjzc5W9enz7/8Nrp/+XJXr9zw+3/e9opXctLMh7io6C\n        aKuphnS3jppCrbKCrL8gD4cN2AAGBjWodqBnBLkqnt059//i4c3/Y9z0/qf7mfy3NdW44+1qu0hDXqTb\n        QFm4WdpOcINMqNA5CU++LlZWBn2gNnBsgQEfJ0vOvYt7/5/bu+p/pIvu/yQ3jf9qkkJ3LI11VqhICnTz\n        cTGVSwXyX/X+b/BfIpz/GNB2daA2YYhuCJCpyw5/snxK439/K9X/8sJsr0UE+E7oqsoulrXn2SYdwflJ\n        OlzwLMgA6Uj+o1IRggelogWyoHrBgDUj0v1EQ4b/f1c9kf9CXKxHtdRVZvu42k6SDxO8DdKIjqVi+bdD\n        9YIBc3NV4aHNiyb8Lwkz/y8nwrkLmPK8xUVEvMVc+CZKRfIdko4XfA3TCMJAfipULwQAk66vvrbGJAlh\n        nkmsTExhQCFQHgAmSgaglxlYZBKEtoEMANFAPlbACMSgTMIDxKBch5JUQTaCNCNsZmAAAKfov0IU/RJT\n        AAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"apiKeysManagementTbMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJKSURBVDhPY6A2YNQCAnFxcUUoHwZwiaMCoBqnGzdu3J7e\n        23SRlYFBFyqMUxwDmBtqV9+6fOb/rK7K/xwsDKUgW8XExJTQxEugyhmhNAIIcrGmesrL/jaWY/+vp6M5\n        9fbt23eAtl4W5GZthImzsTAUAJVyAjEvEDOB9IEBMzOz08IFEz7U19f/ywi2/h/jZfoZZmuKv/93mLiH\n        ofQLFhamdKAWWSBmA2sGAWF+rrJXj2//f3jt9P+yRK//IQ5a/71MZP+BbO1uqf5/89yR/wUxbv/zwmz/\n        y4jxrgFq0QRibrBmEBAV5Kp4dufc/4uHN//3MFf5v37prP9n9m38D7I1zsv4f2NF3v8gO83/qT7G/+XE\n        +XcAtbgCsRhYMwjwcbLk3Lu49/+5vav+Oxsr/Ud2TX647f/4YLf/3pZq/+Oc1f6LCXIdAGoJBGJxsGYo\n        kKnLDn+yfErjf3t9uf8w18S46f1P9zP57+tg/N9KS/q/nDDbW2ZGxiVA9e5ADApIOGDNiHQ/0ZDh/99M\n        RfA/zDWRLrr/k9w0/ptpyf3Xl+f7L8DFdAqoNhaIVYGYBaQRBpibqwoPbV404X+Gr+H/+uiIHyDX+Fup\n        /peU5P/lZGP6P8RO47+MIOc+oFotkHqwLmQATKq++toakyQEeaekRXjcBrnGVU/kvxg/53V5aaldIoI8\n        i1iZmCKBSgUgOjABKHWBEgl/c1XeEZBrSsLM/8uJcO4CihmBxIGYA4gRCQgXgLtGmGcS0NYwoBBOW3EB\n        mGt4gBhkK6afGRgYADFF6bdCoKk7AAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"toolStripMenuItem1.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAm1JREFUOE99k21IU1EY\n        x59td++48GWuVY42mek+NHErKzSDwi3tQ2qJTvKukVQfTBkmhQzpZVIRQdGLVGAvEOttEJaRrWI1QkQo\n        KJMo8Ev1KfziKDa2+/ScbR+q3frDD+455//8zz3PPRcQ8Q+Y5HK50svz3ffu3nnEd7WfUsg5Q2ZBTGIB\n        GrWqNBaLztMYY5P3scpUHMosiOn3YkZOmsN9PR8nw2Po55uxRCN7TXNSgiPkueesRAMkUr2zYnmk3qxD\n        x1INmou04zRbmENHKJiLEA3Q73A3TM29m8aJm+fSuxqdQusGEzrKjQ9ozUmUESpCRuQH0Pu1XD4ZoEfE\n        2ZlIKtjfne7cVI79nqYFsrcTNkJLsABJXsASJfC3r5zGxI9FYfzWhVRf52bBbV+Gg76WBCeBXipaR7Cj\n        ZHvxd0CBAvhrF0fw5+K31ERoNNXhtgt1lmIM+JqSFDBERdsIdgzWBy4vQC0Fz6URP8a/zwnh62fTHle1\n        sMVWgoGO+iQVBIk2wkyIvwHJ4G1rnP70JoJHen3pYb0Oa4xabKgojVPF6ABAdC3APvKJ94DJWmYYCO5t\n        xe21VcIL6vMZmTRlBHh+FODDDI1XA/jJlr0LYgHVlZaeaOg87tm6Jr1xRQE+lEqEtwCJVwBJ+o5jtLWJ\n        bP+8B1Bjs/JfPr/H4wc8uNtlx6tKLv2VrE8BFlYCNJPl/zdRpVJahocOPtvpqps/UaiNv5RAqgtg9jFA\n        PAwwRdvbM0YmkQCWrqY/0roK4BDrgQPgBk2urwQ49oTG9B0HmTEjkQAm1mFOSTvRxd9PxezMdA2giMZe\n        DUBtxgUAvwDk+nfvALQ6oQAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"toolStripMenuItem2.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAjRJREFUOE9j+P//PwoG\n        AVZWVvaE+Pi4NatXbY2PDutiY2URB0tgA9gM4OLkEDty5OB9IP//kV1r/2vKCa8AS2ADyJpBGAq4KvNT\n        b+5aN/9/Ubz3fxEu5mNAMSYgZgFiVigbArAawMgkaqImvcdWke+/sQTXf0Uh7s1AUUEo5gNiNpAqIMZq\n        gGiIh/2J65dP/d+2eNLfWDeTf0FWcv+NlSU3AuVMgFgWiDmAmBmIMQ0Aui9wVmctkPn//9Uze/60FsT9\n        jXRQ/l8Q5fUOqDwMiLWAmBuIQQYwYhjAz84Qv3J2z/+f3z7/27xs6p/8SOd/HvpS/8uSAn+yMDLkAjVZ\n        ADHIK5CwQDeAl40hfsG0tv/fPz/7s23FjD8RHvr/bJSE/9cmef0CGlAN1OQDxCBvgMKBBcMATiaGqOlt\n        Rf+/vLn+b+OSyX+jPQz/uWiJ/K+NsP0F1NAKxIFQA7C7AAjEE4LdTt0+v+f/gqltfyKddf6Zy/P9t1cT\n        +8KgYL6awSHvMINdViRQHfYwAAFVWfGS1vSg/6n+1v+sVUX/y/BxfAQKz2OwyTjH4FX/n8GjZg2QzwRW\n        j80AAw2l1IMrpvz39vX9J+MS+x+sCYZ3voSxVwCxF1YDjLRU45/cufJfN6wIoQkdwwzBZgAHB7tifXXp\n        XqfAiKeS7mmfoIoRhsE043ABKJ1zAnOkKpA2AGJDIFYBYkEGz7pVSJoZwBiLASAACmFQxgHFNQiDoowF\n        aIA3VLMXxIB6BgD9s5edGjob9gAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"toolStripMenuItem3.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAgBJREFUOE99kz9oWlEU\n        xtXGP6WJUIgJQgMW2iVQsFAwZhJBBBHkLR26vMnRIpgpnSO1o+AqEkGyhoAYMJtE7aCbQ6AI4iJCMbUo\n        Pt+7J99Rgwle8sEPr/fe83nOuUcTET2DZbFYdguFwvfBYHDdbDZ/2Wy2/cWBTDIDq9X6yTCMLr6Truvk\n        9XovFgcyPQ1mVtprNBp/5vM5tdttcjqdt9izgC1gXa2XkhmYzWZXKBSqBgIB/nXyeDxX2H67wglsfA1I\n        DVylUqkhhKDZbGYUi0WRSqUoGAxe4uwLOAAO8ApsGqCByng8xpIIfdD7/b6RTqep1Wr9xfWv4BC8AWxg\n        3jBwOBzqdDrFkgQy0Ov1ulBVlTqdzgzmCQQdAS5l2YunwYzdblcnkwmWpGuapudyOYF+sIEGgx8IigIu\n        g/uwtWGAJ/w2Go0IPeAMjHw+LxRF4RI0BJwBZWUgzwDar1arv1E/IRM9m80Kv99P0Wj0P85+ghhwAXkP\n        WHi6k263S+VyWYTDYXK73ffYzoMk8IMdsJwFmUEkEomjfqpUKkYymSSY/MP2KQgAHusX58AUi8VUnoNe\n        r0e1Wo0SiQQbxME7wNP48iTiKd8Ph8Mb9OIuk8nc+Xy+c2wfg22wDmZJDPjCa/wDP+LTCz6DD4Dffp36\n        oyQGLO4wp8oBDD/Z89QXMpkeAJ0ileNBVxQIAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"manageCharacterTbMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIYSURBVDhPY6AVYLK2ttZva2tpjQgLzOXm5haDihMNWOfN\n        m73tPxDcvnr2v4uF5j6gGBtEikhQVZpz6tGdK//nT2z4ryPD9RkopAyRYWABYiYIEw9QEOOd6mUg9d9K\n        kf+/lhjfTaCQEBBzADEPlMZtiKqsZOOsmR0f6+vL/vmbqv93lRT/pSsntAIoZQLECkDMDcQgl2AFekWR\n        EV///vn1/8qVK3/q60v+hNor/C+PdvvPzclWAJIHYkEgxm4AMwOD68S6vP/19fX/ju2q/9Nhb//Xy0Dy\n        X016yH85ccF+oBJLIBYHYlCgYnqDnYHBpbu+4P/+/fv/HtpW/ycryvmfuRzPv+pE7//yEgKzgUp8gVgT\n        iEHhgOkKoAFuzcUJYAP271j2NyfW7Z+5Au+/pgTX//Ii/IuBSqKAWB+IuYAYa0CqxAc63/747ML/LfX1\n        f+yBXrBV5f+X5aTxX4iXczlQPhaIQS4AeYERiDGBooxY8eyO0v9dQM3B9jr/1IW5/vJxMF1hZmScDJQO\n        A2I5IMYZCwyignzu00pi/2d4Gv931BT6b64o+J+VkXEGUCoeiEFRyQfEwPDGAWTFhFxvnz/yv74i9V+8\n        i8b/WCfV/0DVE4FSFkAM0ozb+SDAw8amtXXD8jezOsr/50fY/E/wNvwCFAalAZjTcWsGApAku46OZpi6\n        qkKNlAhfDT8PTzJQTBeIQSkQyekMDABGBaNuF+TXgQAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"tsLoadSettings.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAfdJREFUOE9j+P//P0UY\n        qyAMYwF8QPwQiPXBPBDAphGGkQAnEAsDsRMQ/wNikGQHECMMAAF+Xi4GIy15Tn11WdPSRPeKGB8LX6Cw\n        OSMj41mQUiz4IIoBemoyPjuWdJ27fGzbj1vnD/1fM6XsHRMTE8xGbLgD2QCuGbUxu8/sXf1/17Le/2un\n        lv/3sdf7z83J/j/Q2fD/nMa4/z0lof/FhPj+A136Dag+EKQJbgDQJum5TfH3J1ZE/F/ckQY2ZMu85v/H\n        ty/+/+D6mf+3Lx4Bshf9B3rrf2OW3weg1nh0A6TC3E1uzW6I+//66b3/z+5f+//o1oX/dy8f/3/j7P7/\n        l49v/39g3fT/2xa2/S+Kc30P1BqJboCkma7iDZBTQZqun977/+a5A2D6yokd/y8c2vj/7L41/0FejPY2\n        vwHUagbSBzcAGNISCtIiV0EGgDRdOrr1PzAwwTRMM8g7J3cu++9lq7sHaIAUhgHAALoyqz4WrAmk4ez+\n        tRAMYgPxiR1L/gNj6a+mkmQ50AAWFAOAQAYYurdAgXj+4Ib/p/eshNsKDMwPkyoiTkR5mfeoyIn5A9Xy\n        gjSgGyDIwsJ8tC7D5/+RzXP/LGxLvpYX7bzIXE8pBWiwHlAelBpRALoBIKAjJSaQJS0u6Ahki0OEcAMU\n        A8jFWAWJx/8ZAKtpCVAVWEA+AAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"tsSaveSettings.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAdVJREFUOE9j+P//P0UY\n        qyApGKsgCCMBfSB+CMR8YB4SAKtD1sDPy8VgpCXPqa8ua1qa6F4hLMCzBqQOiP9pKkm2BLkYVQPZ3CC1\n        IIBhgJ6ajM+OJV3nLh/b9sPOWA0kiIE5OdgeCvJxJwLZGAZwzaiN2X1m7+r/u5b1/g91M0HRiIwZGRn/\n        AWk7FAOYmJik5zbF359YEfF/cUca2JCNs+r+q8qL/5cUFfi/sC35/4aZNf8zwx3+s7OxggzYjm6AVJi7\n        ya3ZDXH/Xz+99//Z/Wv/H9268P/66b3/k4Ns/p/YseT/+YMb/p/es/J/jI/FJ6ABdegGSJrpKt6Y0xj3\n        /+7l42CNN88dANO7V/T/P7h+xv+z+9b8B3kx2tv8BtAAMxQDgP6SUJAWuQoyAKTp0tGt/4GBCaYvHNoI\n        1nx8++L/J3cu++9lq7sHaIAUhgFiQnxXZtXHgjWBNJzdvxaCQWwgBnkDGEt/gVFaDjSABcUAIJABpoNb\n        oECE+RVm65Z5zR8mVUSciPIy71GRE/MHquUFaUA3QJCFhfloXYbP/yOb5/4Bhvq1vGjnReZ6SilAg/WA\n        8pwgRcgA3QAQ0JESE8iSFhd0BLLFIUK4AYoB5GKsgsTj/wwARGYaXejhOfMAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"tsdbSettings.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKuSURBVDhPY6A6MDaW5PJ20jeL9TQ1gQqBAJOXpaZ8sJOR\n        rZmZCh9UDBXEuOpxh7qaGpQkumVumde0bsOMmkXx/vYCpUkuUtHeZiETK8J71k2v2OHnYGQO1YIA+ury\n        Cit687ZdPLXn46Nb5//fu3ry/9WTu/5vX9R2+uD6GQ/O7F39f+uC1v9Lu7P+58c4L04Nto030VaWhWpn\n        YIj3t8q9ffHI/3MH1v0/uXPZ/6Nb5gM1d/zfNLv+/6qJRf9XTij4v2Ve8/8jm+f+v3x8+/9rp3b/j/Uz\n        L1JRUWFnsLdnYJlWE73h+PZF/5f15Pxf1J4Ktmnn0u7/Fw5t/H//2qn/Lx7d+v/49sX/t84f+n/lxA6w\n        IclBtgc0FCTsGbS0tNhq033WTq+JBtsGcsmb5w/+f3z74v/rZ/f/P717Beylm+cOgm0GaQYZHOdneU9d\n        USIYbEBSsO3q0kR3sIIXD2/+f3jz3H9QWIBokAvuXDr6/8bZ/eBwuXxs2/9Tu5b/93fQPaWlJGkDNiDM\n        1XhlSrDt/wuHN/2/e/k4UMMxOA1yEUgzzPZLR7f+P7Rh1n9HU4012iqiysB4Z2B1s9JeFuZuAvYfSPHN\n        cwfATgbR10/vhdgMdfr5gxv+717e999MV6lHV05OEGyAvbHqkgAnQ7ABIAzSAMMgPshWkOaz+9b8v3hk\n        8//1/Q3fddRlokERwCAvL89hZai81NdBH6wI5A0QBikE+RdkM4gGad63eMqPlRMKr8T6WdTpKYmLgdMA\n        yABTHaU1rpZaYEVn968FGwDSdGz+/N9bZtc/mVgZuTEjzKHezkjZUV9VRhrkarBmKGDSVZVusjZU+b93\n        1aT/u5ZN/jS/NekwMMX1eNrqBWspy6iga8AAoMDQU5OOdbXQSjfSkDPW0JAShkrRGjAwAABVdrIgKZ/U\n        /gAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"clearCacheToolStripButton.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAH2SURBVDhPtVJNa1pBFH1SkkB3pYs0De2q/8B/UMVvRaWC\n        HwsXQowGcaMES1E3LiQguBFxocu6UNzooqC4Dvgv8g+SpzH1PSfnjBOIBJJNe+Ay792558y5d0b7L7DZ\n        bB9dLtel2+3+7XQ6+4ii1+v9oLbfBoiNfD6/7vV6G0a5XF4zp7ZfB07ORaPRVb/fF9PpVDwhFostIXKB\n        /SNV+hK06fF47rrdrjkajUQymZQOKDCfz81SqbS22+23KLXsGPuwQOCUAq1WyxwOh8Ln8+mZTOZeWgCK\n        xSJbuVD1e7BQmWRaDYVCOmLJHP5XlUrlLx0wD4Gffr//WPF2QPJ7KpVasYgnJRIJaRX5u6cV7vRCobDO\n        ZrMP+L9S1B0wmAgGtzRNyReDwcB4TmZQdDabiclkIoLBoA63LkWXDv5g0yAZq8li5M4jkcghxBNsjQ4a\n        jYacDYeL/EDRpcAN+twahiGq1eqGAvF4fIUH9CscDi/RmkHrqDHG47FoNpsmONeKLluo1Gq1h8ViITqd\n        Dq9MUDAQCOhcZV/PkE6n78E5U3RNQ6+faTOXyxkkMOr1uknbuNLNdruVgox2u73hbNDeO0XfAYo/OCwI\n        8aoYHN45V9rnm+A3yWjNrmj7QNF7xFeHw/GFj4o5FJ9wFsh9g/gnq9V6IIv/DTTtEfK0Ue9Zm0pJAAAA\n        AElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"resetSettingsToolStripButton.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAANjSURBVDhPdVN7SFNRHL49pdeo2b1Lc2pkr5lC9VdZzSAo\n        MgrKkVFiZWlaZlotnNZdhkkybdOyZGnZw9JyPaVScz2stDSsptORm1P3uG5O83HdlvbrbK0osA8+Lhy+\n        7/t955x7sNGgksS56SVJuP7yaR/DFdLXKE1i6cioyYBhY1yS0QEkd7z27B5PSpqyxXxHnGF+cPGm5UHu\n        7W6ZWEIVCiMM6RG+CpI30SX/F6q49W4d6duCTfn8fLNM3Nr7uKCfen7e5mBvae5Ajyy701SYcleXtWuz\n        8tiKaS7bL8jRZM3xoGBjdsSL7pvCQZIkf9BNtWBtawartgXolnpwrFGyTJupQPCxM3VTWHuC1ySXHcNa\n        oufN7iCDC7pE0U6zg1adCmhlDdCNb8DargSbUesMMcuvWfUZW8tbDy0OBBIbi6r7ubXG+YV2nFmn/m0e\n        aqkByy0hmLIjwSTeDZYbJ2FI/ckZ4KBBzOtRJ/rHN+xkTcEa9rMI9eEFmZqMDf0D7++BtaMRLEVJQKWu\n        BeokF4zkGjCd3w0Db+8AraiE3jIR6MgN9jb+4iJFlIc31ryXNUeTOK+YEnNtdPMrVLkKTFmbwZiyFIzJ\n        SxDRN3UldIlCwJQTBl0SHsjTVo9ojy+qaoxl+2Nf9jHmqg8RpTqBh71Lsh7VDkFTA8DA9wFDIoGIO2lM\n        9oNv5WLUohzkEu5IWwLx8nPk9ECseo+7p+ognqcXMGizlAd9VRegT54L5rxNaAuzgUrGgUohUKsgoJsq\n        EZ+BJsvne2vCzPsf0HBMzsOnNsS6x3QKPQ0keeLHd0sn2PRN0HN7FzL5g1m0ALpzV0H/C/GfQzSmzx9U\n        xONpTyMZTIxEV1Eezlz09YTvE93DRPtvkVVdDYN1V2Gw9jIMqZ7/MStIzrBGOOvT62j34BIeNs75HxSH\n        ek16c8Q7vP3CGqWuZCMKEaCAMrDra8Fu+AA2bYUzwGHWitjaOj6eVOyY/jcKw6e5V/M9Y75msN9p8xf2\n        KUo5w/In3BH5U+6I4j5nuFvKoTWZ7C+1AiK5JGqG96gPS7KDyXgYi6+sOcVKVUo8yjQX2e/Vl7zrVDle\n        FfVprHOP4vF1edunzkTS/79KHtpXZiiDeT2OyZEdJZbfPYoH3ThABEgjCVbUMmyCS+YChv0EtOQJM6RG\n        7t8AAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"exitToolStripButton.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJHSURBVDhP3ZFfaFJxFMevXv+Umm7+qYmVFs3cYE6bprub\n        s6stcBEYK2T0sIeeYpSQCQ0xLzSKGFQPQS/CKGINeqimDRqu1Qw2iqJoUERtjNafh+opaJXt27nXoIde\n        9tBTX/g8nMP5nvM758f8B9Lr9cZMqlvIpbuF3p6YEA6HhYO9u4Vc/34hk0oIPM8LndGokE0nqGavwHld\n        rb+tf7QvYhvGHQ4fCj7YzCpYDEos3uOA1xGcObIZVIITB9YDUxwWrzS9N5vN1qqzKjPhHeqvf4MHIZQu\n        esDKZdgVqMXyHA+84tEZNEq58cFGYILD2KnWcfKwkptUTyT1Wvby7PXGCp5FMHBokzT1ZJ8DWNiJd3fb\n        YKlRwmJU4O1VHzDmx7GeQEZykxSEh8g2OzVT3x5HsPyCxw5fjTS1lPcAzyMoXfBITaPuNfg+GsT8kP1H\n        W4uzXWwgSmzijXfZR38+jeFTOQSHVQ2TjsXCLbrFkxDOHrZLDZJ76oBiALO5DRWTwcBLblEm02r/x5mu\n        JdznEO+olYpvnHYCj0KYzjdBpZAhsEWLpZtBVK41wGeXFalmo2Q2Ghn9wxH+JcY5nOur7p+M06TpDny+\n        vR2OOjUMGhbz+W0A/VQ2xs5RTYLQiX5mINUwjEIAM4NOqGmS274KX4u0e8mPeHv1NSNH6aCFFkwe136R\n        y5k05cSvlIl+y9Z17CWPlZnUqJgyxWWbnil77EzZtbYay2UU26ro1Mx5yrkIOSFJPKC4i5toXgEOQkn8\n        JfE5K+FfimF+AWCo9PZZRjF/AAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"tsbManagePlans.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALVSURBVDhPZZLJTxNhGIeJ/5FR1IMRUQ4mePCgIKhsRqQJ\n        EQJBrKJVAmLA0BLKFroIZdrpvkzboSzdaIG2QGlpS6FlEyMZjAfjTY0/vy4egF/yZi7f87xLpuB/0nt7\n        nmQy6YxG4+ZQOKLzBFc0s/5l9bTPny2H10+zHl8DeXouR5xKYmeHiyW34FlZh9bpwzDjwAc1c6IEetsf\n        4RTdQZ6flcQSCe7bj584OP6OzcMjeOPbWNrahTu2DY1/BWpfKFtiufy3WKk7K3FFolz66Bjh3UMEtncR\n        TO1hPpqE0hs8UwKt5VcXZbiUR3NhFgPcSnqfdE7BHFgHTbqdBidcy+hlnLgjEPy9OzBRlEdzoeZd3Mx6\n        AkwokhUYl8PQL61lv+bgOmTOJbSpbKiV6lGcFVAnBSIzw7FrMcQ/f8Xml6PsHXyJFFllH45IErrgBros\n        LjROWVFCBBVDpwRCI8PNhOMIEcAd28ICgefIDfptHvRZ3eizeSF0+FEjNaKUCB6NqU8K3qlMHL0QQmaK\n        zOhCqxNvNHayswvttB18zTTeM248186idEiFuk+m4jyaSzfNcEwoCvvqBgbtbrRMGtGpn0FHBiSj9xC4\n        l/XhpYEccVQH3pT1rMBEjseuxTE+twilbxVCuweqxTDGnAHoQzH02BfQbpjHPbLCUwVzPY/mwpcYON6Y\n        EvWjSjSMq8GTaFE9SqNBZkA9qSbKhmc0izYiKJeb0Kyfv5FHc7nVKeIeiuR4PEKhUaZD86QJNWNqlIkp\n        3B+mUSUhIoUNzdo5PJAzaLF4b+bRXIreirguHQtjMAJ3Io3l1AFaKSvKxUpUjKhRIzOCp2TRSm5QNWlD\n        22nBNb6IqxUr0CjVgU9+mA4NiycSHSpHaFRL9KS7FU2aWbyweFFHseDb/ScF59u7uQv8j7j4SojC1wO4\n        LBhE4bshXOkcxdUeCUr6FbhNJimTmlApz0yQERQU/AMaX0nxkanL5gAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"plansTbMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG\n        YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9\n        0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw\n        bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc\n        VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9\n        c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32\n        Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo\n        mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+\n        kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D\n        TgDQASA1MVpwzwAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"characterComparisonToolStripButton.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAL/SURBVDhPjZNrSJNhFMdfN/O2tbWpm7e2ecvL632hczOd\n        063pNrfSSDI3Z2WiSaURpIlRGRJimt3sYgmWdMHKIhSFQpTuphJRBPWlqC9R9sHK0n/PLlTUPvSDw8P5\n        n/M/L+/Deaj/xI2WShV1zc2niis27uZwOHyn/i98Pj+4s61zPC8vz+yUKC6Xu6Sp5+z057kfqG9qWrDs\n        rD1KZKaj6oLy8vILAl9epTO1wdqwq7a/uKYaOqtlobimqp1oDEfJBfHx8RZyuDsyO4tPXLz89sbobeSa\n        1yOvzHKfaK4HcDgU35ivrGKz2f5OiRKFhakmX7/CneknkBUaIS5Z+53Irgds27jyzNeZ5zAqw+6S1M2m\n        CYODs288fICuoQGIZVKo9fo5JpOpJJcZbqtTbLZH7FB/x1SpMalbFu/fqkkTITTQ61lGWmSx2ZR6WBwu\n        Vu482TWz41g7ePQyxCoUn4ithsVixdkHREr8zeODnVDLxbhypOpba6MFtMhjfuT6wfl7tzqQQgu6o+Xy\n        83T+SngJ/MHw8HxMbD0CgSDHPiApOqRRIwtDEI/C8M3T6G2rQno0D6YMCUS+ixAk9OxVrdLtU2+yQiRN\n        JAM8xoitnIQbJZFIooavtuH15ABWZ4XCUhCHlloj1KlCzLybQPPWAuQkBiBLn30u2WD4EJKc/ILsRaj9\n        yzboqHDlxFgvRvqaoCP/bi1MR32lGhVFifj4/hEaNmtgUtHIVq9o9PHxCSAWb4fTSUxMZOboQAuuddVh\n        BS3EOkM6shKEKNHG4M3LQVSvSYNJTSMk0O84aS+jFlFJDudv3LdZs6b21+QjTszGntrVyF8eBJ08FGOX\n        DsBckABZimSB7MUg6d1LItfu+pNVWvk+U0YElvoxoVHHzuoVgoUI0eJpqyEFkQIGuGzmF9L2lEQfxWIJ\n        7aY/KSnKbWisVEKZGAih0PcQ19PTdkluN8/UITOOh4ilnFkGg1FKND+7wQXeGpViS6o0wfYCf62oNid1\n        u0ErHaTpaL1T+guK+gkEPgRIf8safAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"skillsPieChartTbMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALCSURBVDhPtZPfS1NxGMYt3dkv9bCZkqJizuY2c2y2+Wu6\n        s6ls083pJKbbaCczU8hQkqSL9EzBoDQyFwmVRBhGF94oCZbEboIuurNIuugPELqTqGzn7X1XhBJe9sCH\n        M3be533P8z3vSfsfSkckiPQP2ft+MwjdP1QShmF0nZ3+md5o+CUf7ko4Qp3DdA343IsqVbYHaxQINTpC\n        hv2S6HQnQ/fjs7scxyWN9maxstEhapxcrNJqEm11lqTP5/thMhruYC2L0BP9VQZO1s/PCbt2NJc4eShw\n        DIHyVBcoa5wxRYVGzK+qEOsddjFoMPzMVasvoycLoagpMU6n7TZNLmiMQtvNBIQX3kGuewJYbyiW7a4B\n        mVkrGlxOoAFtHvt79JQiMjJTFpm/tWnT5GoXWfsoGEY2wHL9DSh7VkDZPRzL7HZAeqAOikMekYb0RoPf\n        0VODKKnBUUTR1mRP6NwByGqZBJn/EUjOvgbm0jYYuwcfZFx0AzsRAa3Qn2rA8/weepoQipFqILfVVj07\n        7ekQc1wTwARX4ETHvQ9XzObZh+Wy9f5m7bK2z/WVm+OS1EAYH91hWWUz+ugwUxEU2UplMMpH97Ttsxtk\n        jJfJ1pGtxzopxIuZnbW+hufUSD/Y+jkaPvM2T61uQR/tSErSBqtVq3GPXIiXyZ+QEa+wpJfAplkKW94i\n        +Bi1wOpYz6sG3n5jaOAcvUpS6gxItF2qu2Xy2lum/OSoIVecqVTDkkUFgrtQTAxwIAgD4urThaSt2jJv\n        q66q/W07uJUKQ7nG31J6fI1yjvnqxWlfHQi9reLiFJdcXV5M9p2PfCouLBjH2iLkwCKR6DAz9VpNh4pl\n        J3sC3m3hauTbzCS/Nz117YvZWPFCIpFEsMaIUPYM5B/Rn3IkH7EiXoRMXUgjUoJQbvoWDhXlosejwhwk\n        DzmG0FTavH2T09J+ATOr4JoITyPYAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"tsbImplantGroups.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOMSURBVDhPdVNtTJNXFH5b+v221RcTM0AqYJyMyMfaQFmB\n        dcNU3yiFRIbagkCE0WQDBwxQ2smLHQxhIF+TYoME6webTRodxo04bMKcQVzwh4wfG7JMF9xHJsuWJW6z\n        fXYvauKfneTJyck957nnnOde5n9MlGkwZLlbWnocFRVXS+32qRKb7UxORsYuevYk5TmzWq0pxTbb8Tye\n        NyclJal5hWLwst+P3p4e7OJ5dHd2IkDi5oYGfPS+a7pmf/7LT0tXTUSKqolPzn/9tTuTXu8DIS0l/E5C\n        AoYHB9FUXwd3aysW797F6EAv/G4nFuamv4uO5mKflDOMQqfTbeM4bmvi+vWCYEwPn0o3wBsZiVJDGnxH\n        DmK4/TCGnLUYcxzAL99/C4Qf4+2921tIrYoSyAnWxsfHp9dy3J5ytRoWhRKtWzdj6doYfrx1AYEBATOB\n        flL3KxD6B9TanPsmZDLZZkogIYjIMmZlu+z2rjdMJmRLJJjuOIjli/24/5kH/y59jvDNs3g01Ydbx99C\n        o60AziLThFKpzKQEUqPRWJ6amtpt0Ov/JPt4vF0mg696H864ytBdZcVPl3px75yAeW8DxpuK0MMnoaqk\n        YEyhUGQzGo1mHSHZGBUVpZeKxRV2ln1wRKPFh3u24VxjEcZdJfjB34m/FwII/XYdwWNv4oa3ER6P54pU\n        Kk1Z7YBASRZpoEQ5Wq1D0Cc+uiCUor1Ajz5bFu6Pt+Gvr88jvHIToXuTeHj7CmZuBBclEkk6JYggkJAO\n        dJSIQDvuLl85/24B6rN1OFlsxvxQHX6+2IWVqwNYOFmPdmsaTC9GXVapVHnPCERPCRQEYrctJyC4bOGh\n        vXpY4yPx5VE75kebMXeiBkcLM9FnNoe2xG3oZVnWQgnElCAuLm4j8VRSsbPwlZFvfAKud1XgcE4sPKWv\n        4ranFjPDjThRvRtluRnL6zju0DMZ6dsWxcTEbCCejiDud+ycFQQh/MdXp3DWkYtrHQcQ9JlDX4y2LF8a\n        eW+xuTJ/Uq1SVZLcSAJGZDKZNEQ+GqiiiSpTo21LwWAwFH44hzsjh+BvKoRzv2VWrVI7WSVbR1qvIfPv\n        IPkyhud5eXJycgIJqBp0B0w0x8XuzrMc++T0wOz8p32/T3xQidzULT4tyxbL5fJNJOUFAjXB6s+kS6R7\n        YAnoq6QmJ/MlRkTILdyaNVVlO80fv7RJ10FupVI/950Z5j/fo3kH9HlFwQAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"tsbShowOwned.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOMSURBVDhPXZN9TNNHGMd/sqzjZVsImxP4Z4nWgQohLFhZ\n        BSuuTEDB8pKKwqClDTgJpYK4YluqvEhbIamhvNQUgVnWOjspBQqKDIGsTsIyIWxM3BwqYdERGYEtaNd+\n        d2VNZvwmn1xyd5/nucvlqFezc6v/nuTd9HhNSWK8NJ8dw6DT3/YsvZwNL/F/NvpSgUpR8rJelgpdeTra\n        q/hoKDu4qjqe8LBBcnSoWZ6jPl+eKUtlM6ITPo6KDAoK8vWo/2UX/d3iJikP9ZI81IlTUcT5AJ+Ev4n9\n        YRshTNyCloos9DQWYbBVhpGv1MhIjN3nUddDK8uOm2k5nQXNqUxcJN2r+ZE4/NEm7Kb7oraAiUbpUfS2\n        1mCg4zzG+r4AKyqc7XEpihnxftywWem82V6Nbp0Uqs+zUXU8Btxof5QcDkNd0R506aow2NmM0a/bcav3\n        6kpgYGCUR6c2VH6WZJi2aVFVwIFKVgCNXIAuvRQZ+8JJ50zoqnmwGbX4tqsdPwx3oe2S1hG6dXPmuu3n\n        57dp1KhebFOVgnsgFuywYKTt/RDpRJbw43BSmA55YQpa6mW4btDg17s3cOZk7h80Gi1pvYAwOSb/zrVG\n        fG+9hFm7FRODRvSbmnHudBGk4lwIuQkQpMWCf5ABEScCdpseojzuDFG5bv8Nc0vt5O+TAzA3VGC8r42g\n        w50ePRmbMfWNAXMT/Zj/cQR3R/pxe8iKKbsNBTkZg8TNow6xmUkGdTludKhwy9iAxZ/H8HR6DJPXTZgd\n        s2Bu3IL7ty14es+OtYUZuJaf4LuhbuRwOZ2kwDHqapuq07nyCxzPHuL50m9w/PkA8+Q0czdbMT9hgmNp\n        GvhrFnAsAH8THKsYH7aCyYiq8/LyKqQqeWzzfsYO5HIPOCokxVAoFC472eAe15bu48XKY8C1BOAZ4FyG\n        y/kCo5cvr20LCan19vbOps7w4zsz4hlIT02GQCCAWHwCxaJC5POOuFgsllNNIMX+mZogV1t4hMWFBxju\n        MT0JDg6W+/j4RFM7Q0PfyeOwjtWIswYUxTlzylPCZZWiFOfOyqBW1kCn08FkuoJuiwW2Hgv6LEYY9Bd+\n        CggIEJDnf8/9Cu74EIIIIeRYsaxdETweN0WhkhT2as6K7jXVK1a/bNU6B6xmXOloglJe2rfenaJed8uv\n        xv1FXyPQCG8R3IW3MSO3p5wQZpVpK8XmT9MSS8icP0VR1L/Oz/FKVzzkdQAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"tsbOptions.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALaSURBVDhPlZN7SJNRGMZnTUuNhpGNiUIyL+Qsm5d5d27e\n        lvOSzmYihCZqy1sq3iqY5h3rj6yg9L9AMlRMF5qRUllGapmKkiRaKKmY10ClYk/vtyQRxOiB3/fCec/z\n        nvec7xzWLtLbZC+xhxn4HzFG/dxUlZwiR8DnW1A0IgyIfxYzKMzNLmhrqJ8d6unGi+ddn9/19q6KxWKr\n        tLQ0Oy6Xa0xzdi6SlHSG09ra/GN8aBBqtVrLMD48gI2VRYwN9mNy4tO8QCCw4PF4TDdMl1uiFdg11RUr\n        H/v7cK+qEpOjI+hu02B+agpLCwt/C7ar1b/UOTlmZGHOZku3Sos645WnkREXq70Qo8S17HTcKS/FxvIS\n        xgbeYHXxGxamp9DztAVKpdKBLNu3ERHoi9hwOaJkAfASnvgQ5ie5rpAFzOanqKBOT8X69xVdF/NfZ1BX\n        Wzu9afsjoY1VlSJQinCpGL7OJ3Gz+HLvZorl6WCfGhsehqyEc8hTJaK+9i662x8v5atUJptTWCwPR0d+\n        uMQHigA/eDjY43X7I/T1vLxNKeawDrgKHa7IfTww/PYVClIvQvPgPmj8ELGPYLFcBDZlwV7utLojnjU+\n        xNryIvBzDR2appEwf2nGcWt+ob+7ExyP8dGpaYGmvm6ObE7EUV2BqMxMwwCREDZmR7QTo0Nk3sDc9Bfd\n        ns/KguDv5oowibfW3tJSG+rrDVtb63KyRRNeugJyqdRbJnbrUgQH6UwLM1PooDZLLqXglLsI+UnnIRE5\n        w8XOCnnJyUtkqSHSCRnjZ6QXExJyOJC2kaCMQHxkqLa6qACVuVl40tyICorUAYI9RWDr6XXR/BtEBMHV\n        mZkPSZ/NZrtI3FwakqIjUZyVhrLsDFoxDomRIeAc5KxTvonmXSVcCUNi221kbpYRSUgxOdBT9N7c1KRL\n        7OQ0wjUxKTE2NsygcU/ClNj1QTHJ/QTzm8wJHsG0usMjYrF+A+suPTaLPi4xAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"tsbAbout.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAH0SURBVDhPY0AHq1at4t9zYGfglXNHFh3etfXoke3rjtw8\n        s3rRpDS7IDMVIT6oMuxg37597u8/f7n24u6V/4fnVP1fNznnf2Oc9f/WFMf/XZnu/4NsNc/I8PEJQZVj\n        gtu3b2z+cHXX/1eHp/1/fGHlx02t/qtslARWKYkKvLXSU/gf46L130JbZiZUOSYQZWDgOTo3e9+eGYnF\n        UCE40FMWu+FrofQ/Lsz1AVQIJ+AAYkYg5gRiQSDmBWLtOZ2lz2I9jP5nBDleAvJZgZgdiLECJiDmB2Jl\n        RUVVs927d8+/e27f/7bCyP/JThr/60pT84Fy6kAsDcQggzAAyHZeDQ0Nozt3rl07sGXF/1Rfs/+WqoK3\n        Qmy1S4FyBkBsB8Q6QMwFxNhBR1ly5YOrZ/7XhZv+t1QSa+PiYpAECisBsRMQewOxLhCDvIsdlCV7z9+/\n        aOJbd3Wp60CuKhA7A3EgEAcDsS0QiwExyLs4ASgcLBmYmX2BdAoQxwGxCxBrATEoLTADMW5w+sTBtbfO\n        H//vaq5+FchNBGJLIBYAYhYgJgh4Vs3u/X9w3Zz/2QFW/7nYmD2BYiAXgQKYOGCtJzvLQl3yf7Clyk0g\n        NxKIgemMeAAKHA0gLgTidiAG+R8UaCQBkH9NgBgU4vJATJTf0QFIEwjj8DsDAwCvl5QdoFRIWQAAAABJ\n        RU5ErkJggg==\n</value>\n  </data>\n  <metadata name=\"niAlertIcon.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>216, 16</value>\n  </metadata>\n  <data name=\"niAlertIcon.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAAIAAA\n        ACwAAAAwAAAAMAAAACwAAAAgAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGwAA\n        AEcAAABwAAAAiAAAAI8AAACPAAAAiAAAAHAAAABHAAAAGwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        ABOCKTaFeCIo3HsfI/9vGhz/cBoc/4cjI/92IR7qWh0jyAAAAI4AAABNAAAAEwAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAozNDarNvdP/ChYz/13CP/9VTuP/FGLv/uSmd/4YOQP9+Hhv/Wh0jzAAAAHwAAAAmAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAP7s7ny8uro/7B5Z/+QKwn/jScl/4MRXv+zXIP/pR9B/0kGDv+FIyr7AAAAkAAA\n        ADQAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAB9qXmv+Sb2n/rWta/7hFLf+yOlb/pRaN/7RmeP+LHB//XhAL/4Uj\n        I/8AAACUAAAAOgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsTWdF/uTg/7efnP9sNCn/aCgz/2UcMf97D1L/kDZZ/4gZ\n        MP9MCA7/bxoc/0gXH6kAAAA8AAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALE6TRfbmJz/zrq2//Gulv/mXz3/4mSa/9U/\n        xP/joLT/qSE2/10ODv+AISP/GggLnQAAAD8AAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0kRbOv7V1///xef//6Tb//+l\n        2v//ptr//6ba//+m2v/3nNH/umqN/4cuN/9GFx6vAAAASQAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0Ok5E/5K+//+o\n        2P//qdf//6rW//+r1f//q9X//6vV//+r1f//q9X//4+2/0IWHbgAAABhAAAAGQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNdP\n        aJf/q9X//63T//+u0v//r9H//7DQ//+x0P//sdD//7DQ//+w0f//r9H/lTdI2wAAAIIAAAAwAAAABAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAEAAAAV83SS6v+w0P//ss///7PN//+1zP//tcv//7bL//+2y///tsv//7XM//+0zf/ncIn3AAAAoAAA\n        AFYAAAAVAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAACbs9UoL/p8L//7XM//+3yv//uMn//7rI//+7x///u8b//7vG//+7xv//usf//7nI//+r\n        vv91JjPQAAAAgwAAADcAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAdJGCA48HyU7f+3yv//usj//7zG//+9xP//v8P//8DC///Awv//wML//8DC//+/\n        w///vsT//7zF/+d6i/cXCAqtAAAAbQAAACoAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAFAAAAJc5bb8b/s8P//7zG//++xP//wMH//8LA///Ev///xsD//8fA///H\n        wP//xsD//8W////Dv///wcH//7i9/7FQX+UAAAChAAAAZgAAACUAAAAFAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABfUXnLA/7PC//+9xf//wML//8O////GwP//y8T//9DK///U\n        zf//1c///9XQ///Uzv//0sv//83G///Iwf//xL///7q8/7FJWeUAAACcAAAAVwAAABcAAAABAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHyExhjv+mt///vcT//9DR///Iw///y8P//9LM///Z\n        0///3dj//+Db///h3f//4t3//+Hc///e2v//2tX//9XP///Ox///xsD//62w/4UrOtYAAACGAAAANwAA\n        AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG4kMCX5h5r1/7zF///X2f///////+Tg///W\n        0P//3dn//+Pf///n5P//6uf//+vo///s6f//6+j//+jl///l4f//4Nv//9nU///Ryv//x8D/84iT+xgI\n        CqoAAABcAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3khhkv+1wf//v8P///Dv////\n        ////5+T//9/b///m4///6+j//+/t///x7///8/H///Px///y8P//8O7//+3q///o5f//4t7//9rV///Q\n        yv//uLX/lTFB2gAAAHoAAAAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1dovY/73E///C\n        wP//7ev///j3///g3P//5uP//+3q///x7///9fP///f2///49///+Pf///f2///29P//8/H//+/s///p\n        5v//4d3//9jT///Mxv/aZXPzAAAAiwAAAC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+H\n        mv//v8P//8S////c1///3Nf//+Tg///r6f//8e////b0///5+P//+/r///z7///8+///+/v///n5///3\n        9v//8/H//+7r///n4///3tn//9PN//+OmP8AAACPAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAA/4ia///Awf//0Mv////////w7v//5+T//+/s///18///+fj///v7///9/f///v7///7+///9\n        /f///Pz///r5///29f//8e///+vo///i3v//19L//5Cb/wAAAI8AAAAwAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAD/iJr//8HB///Uz/////////Hv///q5///8e////b1///6+v///fz///7+////\n        //////////7+///9/f//+/v///j3///z8v//7er//+Th///a1P//kpz/AAAAiwAAAC4AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+Imf//wsH//9XQ////////8/L//+vo///y8P//9/b///v6///9\n        /f////7///////////////////7+///8+///+fj///Ty///u6///5eH//9vW//+Kl/8AAAB5AAAAJQAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+nKG0//Bwf//y8X////////6+f//6uf///Hv///3\n        9f//+vr///38///+/v/////////////+/v///f3///v7///49///8/L//+3q///l4f//2tX/3mJ07gAA\n        AFkAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3UGtz/7O3///GwP//9vX////////t\n        6v//7+3///Xz///5+P///Pv///39///+/v///v7///79///8/P//+vn///f1///y8P//6+j//+Le///I\n        xv+YMkK7AAAANQAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPRPahH9fo/x/8S////f\n        2/////////j3///s6f//8vD///b1///5+f//+/r///z8///8/P///Pv///r5///49///9PL//+/s///o\n        5P//3tr/9YOR+SoOEmIAAAAXAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPhR\n        bHP/p6v//8nC///u6/////////Hv///t6///8vD///X0///49///+fj///n4///49///9vX///Py///v\n        7f//6uf//+Le//+wtv+pN0mpAAAAJQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAPtcdaL/r7D//9DJ///v7f////////Hv///s6f//8O7///Lw///z8v//9PL///Px///x\n        7///7uv//+nm///j3///w8T/0E5jxAAAACgAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPpddpL/o6b//87I///j3///+vr///Tz///q5///6+j//+3q///t\n        6v//7On//+rm///m4v//4d3//7G3/89QY7AAAAAfAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPZQa0L9fIvh/7e2///Uzv//4Nz//+rn///h\n        3f//49///+Pg///i3v//4Nv//8PF//V1h+mpN0pgAAAAEAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3UGxS9nSEpfuQ\n        muP/nKX//7a5//+3uv//n6j/+ZKe5elwga7MQllkAAAADwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAA/+AH///AA///wAP//8AD//+AAf//gAH//4AB//+AAf//gAH//4AB//8A\n        AP/+AAB//gAAf/wAAD/4AAAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AA\n        AA/wAAAP+AAAH/wAAD/+AAB//wAA///AA/8=\n</value>\n  </data>\n  <metadata name=\"ofdOpenDialog.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>1064, 18</value>\n  </metadata>\n  <metadata name=\"trayIcon.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>14, 14</value>\n  </metadata>\n  <data name=\"trayIcon.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAUAgIAAAAEAIAAoCAEAVgAAAEBAAAABACAAKEIAAH4IAQAwMAAAAQAgAKglAACmSgEAICAAAAEA\n        IACoEAAATnABABAQAAABACAAaAQAAPaAAQAoAAAAgAAAAAABAAABACAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        ABEAAABaAAAAnAAAAMsAAADtAAAA8QAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADxAAAA2wAAAK4AAAB1AAAAKQAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAACGAAAA5QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAArwAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAABtAAAA7AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAKcAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAYAAAAuAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOgAAABKAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAM8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPkAAABaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAACwAAADaAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEB\n        Af8AAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAH/AAAB/wAAAP8AAAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAH/AAAB/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        APsAAABuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbAAAA1gAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/EwMA/z8MAP9iEwD/cRUA/3EVAP9yFgD/cxYA/3QWAP9zFgD/dRYA/3kX\n        AP95FwD/ehcA/4IbA/+IIQn/fxcA/4AZAP99GAD/ghkA/4UZAP+HGgD/ihoA/4oaAP+MGgD/jhsA/48b\n        AP+PGwD/kRwA/5AcAP+THAD/lx0A/5cdAP+WHAD/lxwA/5kdAP+bHQD/nB0A/5sdAP+cHgH/mR8D/3oY\n        AP93FwD/dxcA/3YXAP95FwD/excA/3oXAP94FwD/iBsB/5skCf+aJAn/mR4D/5YbAP+XHAD/lRwA/5Yd\n        AP+YHQD/lxwA/5gcAP+XHAD/lx0A/5ceAf+YHgL/mB4D/5geA/+XHwP/lx8D/5YgBP+WIAT/liEG/5Yi\n        B/+WIgf/liMJ/5YjCP+WIwn/lSMJ/5UkCf+VJQv/lSgO/5UsE/+VLRb/lC4W/5QvF/+UKA//lCcN/5Qq\n        Ef+UKRD/kyUL/5MlC/+TJw//kyYM/5MtFf+TMRv/kzUf/5I1H/+SMx3/kioR/5MqEv+NKRL/Zx4N/zEO\n        Bv8CAQD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABaAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAK8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EAMA/1MQAP+IGgD/mR4A/5se\n        AP+aHgD/mh4A/5seAP+cHgD/nB4A/54eAP+iHgD/piAA/6cgAP+qIAD/riIB/68kA/+uIQD/tCIA/7Mi\n        AP+1IgD/uSMA/7wkAP+9JAD/viUA/8IlAP/CJQD/xSYA/8snAP/HJgD/yCYA/80nAP/PKAD/0CgA/9Eo\n        AP/RKAD/1ikA/9spAP/cKQD/2ykA/+MsAf+6JQL/mx0A/6EeAP+iHwD/nh4A/6MfAP+kHwD/oh8A/6Uf\n        AP+nIAD/vSUC/98xCP/iMwv/2isD/80nAP/OKAD/0SgA/9EoAP/TKAD/1igA/9IoAP/QKAD/zygA/9Yp\n        Af/XKQH/1ykB/9wqAf/bKwP/2y0E/9stBP/bLgb/2i8G/9ovCP/aMAn/2jAJ/9owCv/aMgv/2TcR/9k7\n        F//ZPhr/2UAd/9g9Gf/YOBP/2DQO/9gwCv/XMQr/1zEK/9cyDP/XMQz/1zEL/9c2D//WPhv/1j4a/9U8\n        GP/VTCv/1Ukp/9VMK//VPRn/1DkW/9U7GP/YPBj/zDgW/5kqEP83EAb/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAOwAAAAuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/yEGAP92FgD/jRsA/4kaAP+GGgD/hxoA/4caAP+HGgD/ihsA/4wbAP+LGwD/jBsA/44b\n        AP+QGwD/lB0A/5kdAP+bHQD/mx0A/5weAP+dHgD/nx4A/6EfAP+jHwD/pSAA/6cgAP+sIQD/rSEA/60h\n        AP+uIgD/sSIA/7EiAP+0IgD/uCMA/7gjAP+6IwD/uyQA/70kAP/BJQD/xCYA/8ElAP/IJgD/vCQA/4ca\n        AP+KGgD/jRsA/4oaAP+KGgD/iRoA/40bAP+NGwD/kRwA/5IcAP+RGwD/ox8A/80sB//bMAj/zCcA/7ci\n        AP+8JAD/wSUA/8kmAP/GJgD/wiUA/74kAP/AJQD/xyYA/8YmAP/HJgD/0icA/9MoAP/TKQL/0ykC/9Mp\n        Av/SKgP/0SoC/9EqA//RLQf/0TIO/9E2Ev/RORX/0TkV/9E1Ef/QMAv/0CsG/9AqA//QKgT/zysF/88s\n        Bv/OKwb/ziwH/84tCP/OLAf/zjIN/85CIf/OORb/zjQR/81EJP/NRSX/zUkq/80+HP/MNhP/zDgV/8w4\n        Fv/NOBb/1TsY/887F/9nHQv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAL0AAAABAAAAAAAA\n        AAAAAAAAAAAAGQAAAN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8kBwD/cxYA/34ZAP96GAD/ehcA/3wY\n        AP99GAD/fRgA/34YAP9/GQD/gxkA/4MZAP+FGgD/hRoA/4YZAP+KGwD/jRsA/48cAP+PHAD/lBwA/5Qc\n        AP+WHAD/mR0A/5kdAP+ZHQD/nh4A/6IfAP+hHwD/ox8A/6MfAP+kHwD/piAA/6shAP+sIQD/qyEA/68i\n        AP+wIgD/sSIA/7YjAP+6JAD/uSMA/7wjAP+EGQD/eBcA/3sYAP98GAD/fRgA/30YAP+CGQD/ihsA/4IZ\n        AP+JGgD/ihsA/4obAP+HGgD/kRsA/8MoBP/dLgX/zCYA/60hAP+yIgD/uSQA/7UjAP+yIgD/ryEA/7Qi\n        AP+4IwD/uiMA/8AlAP/EJgD/zScA/9MpAf/SKAH/0CcA/9AnAP/RKQL/0i0I/9IzDv/TNxL/0zQP/9Ew\n        Cv/NKgT/zCcB/84mAP/QJwD/0CgB/9ApAv/QKgT/0CoE/9ArBP/PKwT/zysF/84rBf/ONBD/zkMi/846\n        F//OMg3/zkEh/85EJP/OSCn/zT0c/802Ev/NNhT/zTcU/8w3FP/MNxT/zzcU/9U5FP94IAv/BAEA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF0AAAAAAAAAAAAAAAAAAAB3AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/GwUA/2wVAP9zFgD/bxYA/3EWAP9vFgD/chYA/3QWAP90FgD/dxcA/3kXAP95FwD/excA/34Y\n        AP9+GAD/fhgA/4MZAP+HGgD/hhoA/4gaAP+MGwD/ixsA/4wcAP+OHAD/jxwA/5McAP+YHQD/mR0A/5kd\n        AP+cHQD/mx0A/5wdAP+gHgD/oB4A/6EeAP+jHwD/pyAA/6kgAP+rIQD/rSEA/60iAP+0IwD/jRsA/2wV\n        AP9wFgD/bxYA/3EWAP90FgD/cRYA/30YAP96GAD/dxcA/3sYAP+AGAD/gBgA/4QaAP+CGQD/hhkA/7gl\n        A//ZLQb/pCAA/5weAP+dHgD/oB8A/6IfAP+iHwD/pB8A/6YgAP+pIAD/riEA/7AiAP+1IwD/uSMA/7wj\n        AP/AJQD/0SwG/9QxC//VMw7/1DIM/84rBf/IJwH/xiUA/8QkAP/IJgD/zScA/88nAP/RJwD/0CcA/9Ao\n        Af/RKAL/0CgC/9ApAv/QKQL/0CkC/880EP/PQB//zjsY/84vCf/ONhP/zkIh/85DI//ONRL/zjEN/84y\n        Df/NMw//zTMP/800D//NMxD/zjQR/9o4Ev9zHgr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAywAA\n        AAQAAAAAAAAABwAAANIAAAD/AAAA/wAAAP8AAAD/AAAA/wYBAP9aEQD/bhUA/2oUAP9rFAD/axQA/2oU\n        AP9sFQD/bhUA/2wVAP9uFgD/cBYA/3AWAP9zFgD/dRYA/3UWAP93FgD/ehcA/3wYAP99GAD/fxgA/4MZ\n        AP+CGQD/ghgA/4YaAP+HGgD/ixsA/48bAP+OGwD/kBwA/5McAP+RHAD/kx0A/5cdAP+YHQD/mh0A/50e\n        AP+fHgD/nh4A/6IfAP+mHwD/qiAA/5gdAP9lEwD/ZhMA/2oUAP9sFQD/bhYA/2kUAP9vFQD/dBcA/28V\n        AP9wFgD/cRYA/3UWAP94FwD/eRcA/3kXAP94FwD/ehcA/6YgAf+UHQD/jBsA/44bAP+THAD/lh0A/5oe\n        AP+dHgD/nx8A/6EfAP+lHwD/pSAA/6cgAP+oIAD/sCEA/7okAP/WMAn/0S8I/8MoBP+3IwD/sCEA/7Ih\n        AP+4IwD/uiMA/78kAP++JAD/wSUA/8gmAP/DJQD/xCUA/8YlAP/JJgD/yiYA/8kmAP/OJwD/0DUR/9A9\n        Gv/QORX/zzcU/884FP/OPh3/zkAg/84wDP/OLwv/zjEM/84wDP/OMAz/zjEM/80xDf/NMQ3/zzIN/9Q0\n        D/9AEAT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAARwAAAAAAAAA/AAAA/gAAAP8AAAD/AAAA/wAA\n        AP8AAAD/MAkA/2kUAP9jEwD/ZxMA/2YTAP9nEwD/ZxMA/2cUAP9pFAD/aRQA/2sUAP9qFAD/ahUA/2sV\n        AP9sFQD/bRUA/28VAP9wFQD/chUA/3YWAP94FwD/eBcA/3oYAP98GAD/fhgA/38YAP+EGQD/hhoA/4ca\n        AP+KGwD/jBsA/4sbAP+NGwD/kRwA/5McAP+UHQD/lh0A/5YdAP+XHQD/mx0A/58eAP+aHQD/ZhMA/3AV\n        AP9sFAD/ZBIA/2YTAP9rFAD/YhMA/28WAP9pFAD/axUA/2oVAP9sFQD/bhYA/28WAP9zFwD/dxcA/3cX\n        AP92FgD/cxYA/3kXAP94FwD/excA/4IYAP+FGQD/hBkA/4gaAP+LGwD/ixsA/4wbAP+OGwD/jhsA/5Qc\n        AP+ZHQD/pB8A/7QiAP+gHgD/mh0A/58eAP+lIAD/qCAA/6ogAP+pIQD/ryEA/7IhAP+7JAD/wCUA/7Ui\n        AP+8JAD/viQA/78kAP/CJQD/wSQA/8YlAP/RNRH/0T0a/9A2Ev/QPBr/0DgV/9A9Gv/PPRr/zy8K/84u\n        Cv/OLwv/zi8L/84vC//OLwv/zjAM/84wC//OMAz/1jIN/6koCv8FAQD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACUAAAAAgAAAH8AAAD/AAAA/wAAAP8AAAD/AAAA/wUBAP9VEQD/YxQA/2ATAP9iEwD/YxMA/2MT\n        AP9jEwD/ZBMA/2UTAP9mEwD/ZhMA/2cTAP9oFAD/aBQA/2oVAP9qFQD/ahUA/2wVAP9sFQD/bxUA/3QX\n        AP92FwD/dhYA/3cXAP94FwD/eBcA/3sXAP9/GAD/gBkA/4MZAP+EGQD/hBkA/4gaAP+MGwD/jBsA/48c\n        AP+RHAD/kRwA/5MdAP+YHQD/mx0A/3AVAP9dEQD/bxUA/2ITAP9eEgD/XhIA/1wRAP9nFAD/aBQA/2MS\n        AP9mEwD/ZRMA/2YTAP9pFAD/axQA/24VAP9wFgD/chYA/28WAP9uFgD/cRYA/3EWAP92FwD/ehcA/3kX\n        AP97FwD/ehcA/3wXAP97FwD/fRgA/4MZAP+DGgD/hhoA/4caAP+JGgD/iRsA/5EcAP+ZHQD/mh0A/5we\n        AP+cHQD/nR0A/6MfAP+nIAD/qiEA/7UiAP+wIgD/qiAA/7UjAP+3IwD/tiMA/7cjAP+6JAD/wSUA/9E1\n        EP/ROxj/0TQQ/9E7GP/RORb/0DwZ/9A7GP/QLgn/0C4I/88tCP/PLgj/zi4I/84uCf/OLgn/zi8L/84v\n        C//PMAz/1TMM/0UQBP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANQAAAAtAAAArQAAAP8AAAD/AAAA/wAA\n        AP8AAAD/HAUA/2ATAP9fEgD/XxIA/2ATAP9hEwD/YRMA/2ETAP9hEwD/YhMA/2QTAP9lEwD/ZRMA/2UT\n        AP9mEwD/ZhMA/2cUAP9pFAD/ahUA/2oVAP9qFQD/bxYA/3EWAP9zFgD/dBYA/3QWAP92FgD/dxcA/3kY\n        AP98GAD/fxgA/4AYAP+CGAD/gxkA/4caAP+HGgD/jBsA/44bAP+OGwD/khwA/5oeAP9/GQD/VBAA/1kS\n        AP9aEgD/VhEA/1gSAP9ZEgD/XBIA/2QTAP9cEgD/XRIA/2ESAP9fEgD/YRIA/2MSAP9jEgD/ZBMA/2cU\n        AP9pFAD/bhYA/20VAP9qFQD/bRYA/28WAP9wFgD/cBYA/3MWAP92FgD/eBcA/3sXAP98FwD/fxgA/4EZ\n        AP9/GAD/gRkA/4caAP+LGwD/jBsA/40bAP+PGwD/kxwA/5YdAP+YHQD/mh0A/50dAP+iHwD/qSEA/6Ug\n        AP+jIAD/sSIA/6whAP+xIgD/tyQB/68hAP/BJQD/0zUQ/9E2Ef/RMg3/0TkW/9E6F//ROxn/0TgV/9Es\n        B//QLAf/0CwH/9AsB//QLAf/zy0I/88sB//OLAj/zi4I/84uCf/aMgv/hB4G/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA9QAAAFQAAADPAAAA/wAAAP8AAAD/AAAA/wAAAP8vCQD/YRMA/1wSAP9cEgD/XRIA/14S\n        AP9eEgD/YBMA/18TAP9gEwD/YRMA/2ITAP9jEwD/YxMA/2QTAP9lEwD/ZRMA/2YTAP9mEwD/aBQA/2gU\n        AP9sFQD/bhYA/3IWAP9yFgD/cRYA/3QWAP92FgD/dxcA/3oYAP96GAD/exgA/38YAP+AGAD/gxkA/4MZ\n        AP+GGgD/hxoA/4caAP+PGwD/hxoA/1UQAP9SEAD/UxAA/1EQAP9TEAD/UhAA/1QRAP9eEgD/WBEA/1MR\n        AP9WEgD/WBIA/1gSAP9eEgD/XxIA/18SAP9hEgD/YxIA/2YUAP9pFAD/ZhMA/2cTAP9rFQD/ahUA/2oV\n        AP9sFQD/bhYA/28WAP9wFgD/cxcA/3YXAP95FwD/ehcA/3kXAP+CGQD/gBkA/34YAP9+GAD/ghkA/4ca\n        AP+MGwD/jxsA/5EcAP+SHAD/lhwA/5sdAP+jHwD/nh4A/6AeAP+hHwD/oyAA/6ghAf/CKAT/rSAA/8Em\n        Av/VNRD/0jUQ/9IzDv/RNhL/0TgU/9E4FP/RMw7/0SsE/9EsBf/RLAX/0SwF/9AsBv/QLAb/0CsG/9At\n        B//PLQj/zy0I/9QuCP+yJwf/CAIA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAegAAAOUAAAD/AAAA/wAA\n        AP8AAAD/AAAA/zoMAP9fEwD/WhIA/1oSAP9bEgD/WxIA/10SAP9eEgD/XhIA/14SAP9gEwD/YBMA/2AT\n        AP9hEwD/YhMA/2UTAP9lEwD/ZRMA/2UTAP9nFAD/aBQA/2oUAP9pFAD/bBUA/2sVAP9sFQD/cxYA/3MW\n        AP90FgD/dxcA/3gXAP95GAD/fBgA/3sYAP9+GAD/gBgA/4MZAP+EGQD/iRoA/4UaAP9hEgD/Sw4A/0wO\n        AP9ODwD/TQ8A/04PAP9NDwD/UxAA/1gRAP9PDwD/UQ8A/1MQAP9UEQD/VBEA/1sSAP9cEgD/XRIA/18S\n        AP9gEgD/ZRMA/2ITAP9gEgD/ZRMA/2YTAP9kEwD/YxMA/2YTAP9oFAD/bBUA/28WAP9uFgD/bxYA/3IW\n        AP9xFgD/dRYA/38YAP94FwD/eRcA/3sXAP98GAD/gRkA/4MaAP+HGgD/iRsA/4obAP+LGwD/lx0A/50e\n        AP+VHQD/lx0A/5sdAP+fHgD/oR8A/6IfAP+iHwD/vyYC/9YzDf/TNQ//0zQP/9M1D//SNhH/0jYR/9Ew\n        C//RKgP/0SsE/9ErBP/RKwT/0SsE/9EsBP/RLAX/0CwH/9AsCP/QLAf/0y0H/8cqBv8WBQH/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACUAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/PwwA/1sSAP9ZEgD/WhIA/1oS\n        AP9aEgD/WxIA/1wSAP9cEgD/XhIA/14SAP9eEgD/XhIA/2ATAP9gEwD/YRMA/2ETAP9iEwD/ZRMA/2UT\n        AP9nFAD/aBQA/2kUAP9pFAD/aBQA/2oVAP9rFQD/bhUA/3IWAP91FgD/dxcA/2kUAP9eEwD/axQA/34Y\n        AP+AGAD/hBkA/30YAP9oFAD/VBAA/0sOAP9LDgD/Sg4A/0oOAP9LDgD/Sw4A/00PAP9WEQD/Tg8A/0oO\n        AP9NDwD/UA8A/08PAP9READ/VxEA/1cRAP9XEgD/XBIA/14SAP9gEgD/WhIA/1wSAP9gEgD/XhIA/2AS\n        AP9gEgD/YRIA/2ISAP9kEwD/ZxQA/2kUAP9qFAD/bRUA/2sVAP90FgD/excA/3MWAP92FwD/eRcA/3oX\n        AP99FwD/fBgA/34YAP+CGQD/gRgA/4YaAP+SHAD/khwA/4wbAP+QHAD/lBwA/5ccAP+bHQD/nB0A/5wd\n        AP/BKAT/1i4H/9QzDf/TMw7/0zIM/9MyDP/TMg3/0zAL/9IqA//SKgP/0SwG/9EtCP/RKgP/0SsE/9Er\n        BP/RLQf/0S0H/9EtCP/TLgj/yiwI/yQIAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAKEAAADwAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8+DAD/WxIA/1cRAP9ZEgD/WhIA/1oSAP9aEgD/WhIA/1oSAP9bEgD/XhIA/14S\n        AP9eEgD/XhIA/2ATAP9hEwD/YRMA/2ETAP9hEwD/ZRMA/2UTAP9mEwD/aBQA/2kUAP9pFAD/aRQA/2kU\n        AP9sFQD/chYA/2wVAP9hEwD/XhMA/2UTAP9/GAD/gRkA/3sXAP9mFAD/Tw8A/0gNAP9LDgD/SA4A/0kO\n        AP9JDgD/SQ4A/0kOAP9IDgD/UhAA/1EQAP9LDgD/Sg4A/0wOAP9MDgD/TQ8A/00PAP9TEAD/UhAA/1UR\n        AP9aEgD/XRIA/1gRAP9UEQD/WxIA/1wSAP9iEwD/YhMA/2UTAP9lEwD/ZBMA/2QTAP9lEwD/YxMA/2MT\n        AP9mEwD/ZxQA/3UXAP91FwD/bhYA/28WAP9yFgD/dBYA/3MWAP92FgD/excA/30YAP97FwD/gBgA/4ka\n        AP+IGgD/hxoA/4wbAP+NGwD/kBwA/5EcAP+UHAD/lxwA/8YpBf/KKAL/wicD/9cwCv/TLwr/0y8J/9Mw\n        Cv/TMQz/0y0H/9MrBP/UMQv/0i4I/9IrBP/RKwT/0SsE/9EsBf/RLAb/0S0G/9QuB//LKwb/JAcB/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/z4MAP9bEgD/VxEA/1cR\n        AP9ZEgD/WxIA/1sSAP9aEgD/WhIA/1oSAP9eEgD/XhIA/14SAP9eEgD/YRMA/2ETAP9hEwD/YRMA/2ET\n        AP9mEwD/ZhMA/2UTAP9nFAD/aRQA/2kUAP9qFAD/aRQA/28VAP9qFAD/Qw4A/1oRAP9uFQD/cxYA/5oe\n        AP+IGgD/XhIA/0cOAP9LDgD/Sw4A/0MOAP9NDwD/Rw4A/0YOAP9HDgD/Rg4A/0wPAP9SEAD/Rw4A/0cO\n        AP9JDgD/TQ4A/00OAP9NDwD/Tg8A/1EQAP9READ/VREA/1YRAP9XEQD/ZBQA/1kRAP9bEgD/WxIA/10S\n        AP9hEgD/YhMA/2MTAP9kEwD/ZRMA/2gUAP9nFAD/YxMA/2MTAP9lEwD/dBYA/20VAP9pFQD/axUA/20W\n        AP9wFgD/bxYA/3AWAP93FgD/eRcA/3kXAP+AGQD/hxoA/4MZAP+CGQD/hhoA/40bAf+HGgD/iBoA/40b\n        AP+XHAD/0SsE/78lAf+fHgD/xygD/9gwCf/ULwn/0y8K/9MwC//UMQv/1DYR/8EoBf/NKgX/0C4I/9Qt\n        B//SKgT/0ioE/9ErBP/RLAX/1C0G/8srBf8kBwH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/PgwA/1sSAP9XEQD/VxEA/1kSAP9bEgD/WxIA/1sSAP9bEgD/XBMA/14T\n        AP9fEwD/XxMA/14SAP9gEgD/YhMA/2ITAP9hEwD/YRMA/2YTAP9mEwD/ZhMA/2cUAP9pFAD/aRQA/2oU\n        AP9sFQD/axQA/0gOAP9IDgD/cxYA/4QZAP+XHQD/nB4A/2wVAP9KDwD/TQ8A/0kPAP9CDgD/QQ0A/0YO\n        AP9BDgD/Qg4A/0IOAP9GDgD/Tw8A/0oPAP9GDgD/SA4A/0oOAP9LDgD/Sw4A/0sOAP9NDgD/TQ4A/0wO\n        AP9TEAD/VBEA/10SAP94FwD/VhEA/1gSAP9XEgD/VhEA/1gSAP9ZEgD/WxIA/1wSAP9hEgD/YRIA/2ES\n        AP9iEwD/YRIA/2cUAP9wFgD/aRQA/2YUAP9oFAD/bBUA/24WAP9yFgD/cxYA/3MWAP91FwD/dxcA/38Y\n        AP+EGgD/fhgA/38YAP+AGAD/lB4D/4kbAf+EGQD/hxoA/5UcAP/UKgP/uCMB/5gdAP+aHQD/uyYD/9gv\n        CP/WLgf/1S4H/88rBP/NKwX/sSIA/8ooAv/BJQH/xCkF/9IsBv/TKwT/0ywF/9IsBf/VLQX/yysF/yMH\n        Af8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8/DAD/XBIA/1cR\n        AP9XEQD/WxIA/1sSAP9bEgD/WxIA/1sSAP9dEwD/XxMA/18TAP9fEwD/XxMA/2ETAP9iEwD/YhMA/2MT\n        AP9lEwD/ZhMA/2YTAP9mEwD/ZhMA/2oUAP9qFAD/ahQA/20VAP9VEQD/SQ4A/28WAP+DGQD/lx0A/48c\n        AP96GAD/SQ8A/0oPAP9LDwD/RA4A/z8NAP9BDgD/Qg4A/0YOAP9ADQD/QA0A/0kOAP9JDgD/RQ4A/0MO\n        AP9DDgD/SQ4A/0gOAP9HDgD/Rg4A/0oOAP9MDgD/TQ8A/1QQAP9MDgD/chYA/2YUAP9TEAD/VhEA/1YR\n        AP9YEQD/WBIA/1kSAP9cEgD/XBIA/18SAP9iEgD/YRIA/2ASAP9eEgD/aBQA/2sUAP9lEwD/ZhMA/2QT\n        AP9lFAD/bBUA/20VAP9yFgD/cRYA/28WAP9xFgD/fRcA/34YAP95FwD/fBcA/34YAP9+GAD/gxkA/40b\n        AP+DGQD/lh0A/80oAf+lHwD/lh0A/5cdAP+RHAD/qSEB/9ArBP/WLAT/zScB/6MeAP+dHgD/uyQB/7oj\n        AP+1IwH/zy0H/9QrBP/TLAX/0y0G/9YtB//NLAf/IwgB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAA\n        APAAAAD/AAAA/wAAAP8AAAD/AAAA/z8MAP9cEgD/WBEA/1gRAP9bEgD/WxIA/1sSAP9bEgD/WxIA/10T\n        AP9fEwD/XxMA/18TAP9fEwD/YRQA/2MUAP9iEwD/YxMA/2QTAP9kEwD/ZhMA/2YTAP9mEwD/aRQA/2oU\n        AP9sFAD/WxIA/0UNAP9FDgD/dhcA/5QdAP9jEwD/QQ0A/0oPAP9GDgD/RQ4A/0INAP8+DQD/QQ0A/0AN\n        AP9ADQD/QQ0A/z8NAP9EDgD/Sw8A/0ANAP89DAD/Qg4A/0UOAP9IDgD/SQ4A/0gOAP9JDgD/SQ4A/0sO\n        AP9QDwD/TQ8A/1APAP9yFgD/UQ8A/1UQAP9XEQD/VhEA/1cRAP9WEQD/VxIA/1cSAP9XEgD/WRIA/1wS\n        AP9eEgD/WxIA/1wSAP9qFAD/ZxQA/2ISAP9jEgD/YhIA/2QTAP9oFAD/aRQA/2wVAP9vFQD/bhUA/28W\n        AP94FwD/eRcA/3IXAP95FwD/ehcA/3cWAP+MGwH/mh8C/3QVAP+bHgH/xygD/5YcAP+VHAD/lx0A/5Uc\n        AP+OGwD/pSAA/9EoAf/RKQL/uCMA/5UcAP+oIAD/tyMA/64jAv/QLwn/1CsD/9MsBf/TLAX/1i4H/80t\n        CP8kCAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/PwwA/1wS\n        AP9YEQD/WBEA/1sSAP9bEgD/WxIA/1sSAP9bEgD/XBIA/1sSAP9cEgD/XxMA/18TAP9hFAD/YxQA/2MU\n        AP9jFAD/YhQA/2MTAP9mEwD/ZxMA/2YTAP9oFAD/axQA/2oUAP9JDgD/Qg0A/0QNAP+AGQD/WxEA/zsL\n        AP8/DQD/RQ4A/0INAP89DAD/PAwA/zwMAP8/DAD/PQwA/z0MAP88DAD/Pw0A/0gOAP9GDgD/Qg4A/0EN\n        AP9ADQD/QQ0A/0EOAP9DDgD/RA4A/0QOAP9HDgD/Sw4A/04PAP9GDgD/ZRQA/2MTAP9MDgD/VBAA/1MQ\n        AP9UEQD/VhEA/1gRAP9XEQD/VhEA/1YRAP9XEQD/WRIA/1wSAP9XEQD/XhIA/2cTAP9jEgD/XRIA/14S\n        AP9iEgD/ZBMA/2QTAP9kEwD/ZhQA/2oUAP9rFAD/bxYA/3YXAP90FgD/bxYA/3QXAP95FwD/eBYA/3wY\n        AP97FwD/dRYA/6QgAf/JKQT/jhsA/48bAP+QGwD/khwA/4obAP+YHQD/ySYA/88nAf+zIgD/kBwA/5oe\n        AP/AJQH/qSEC/9IwCv/VLAT/1CwF/9QtBv/WLwj/zS0I/yQIAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8/DAD/XBIA/1gRAP9YEQD/XBIA/1wSAP9cEgD/WxIA/1sS\n        AP9bEgD/WxIA/10SAP9fEwD/XxMA/2EUAP9jFAD/YxQA/2MUAP9jFAD/ZhQA/2cUAP9nEwD/ZxMA/2oU\n        AP9sFAD/WxEA/0ENAP88DAD/YBIA/1UQAP86CwD/RA4A/0QOAP9BDQD/OwwA/zwMAP87DAD/PAwA/zoL\n        AP88DAD/PAwA/zwMAP89DAD/PwwA/z8NAP9CDgD/RA4A/0MOAP9CDgD/Qw4A/0gPAP9JDwD/Rw4A/0kO\n        AP9ODgD/Sg4A/0sPAP9rFQD/TA4A/0wOAP9MDwD/XBIA/1UQAP9SEAD/UxAA/1URAP9VEQD/VREA/1YR\n        AP9XEQD/VxEA/1cRAP9iEwD/ZhMA/14SAP9YEQD/XhIA/18SAP9gEgD/YBMA/2ISAP9mEwD/ZhMA/2UT\n        AP9tFQD/cxcA/28VAP9tFQD/dBcA/4IZAP9yFgD/dxcA/3MWAP9vFQD/rSEA/8soAf+JGgD/jBsA/44b\n        AP+NGwD/hhoA/5YdAP/GJgD/2SkA/7EiAP+CGQD/jRsA/8cpBP/WLwj/1SwF/9UtBf/VLQX/1S0H/9cv\n        CP/OLQj/JAgB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/z8M\n        AP9cEgD/WBEA/1gRAP9cEgD/XBIA/1wSAP9cEgD/XBIA/1wSAP9bEgD/YBMA/2ATAP9gEwD/YRQA/2MU\n        AP9jFAD/YxQA/2MUAP9nFAD/ZxQA/2cUAP9nFAD/axQA/2oUAP9GDgD/Pw0A/0INAP9hEwD/Qg0A/z8N\n        AP8/DAD/PgwA/zkLAP85CwD/NwsA/zoMAP87DAD/OQsA/zoLAP88DAD/PQwA/zsMAP87DAD/PAwA/z8M\n        AP9ADQD/Qg4A/0ANAP8/DQD/VhEA/0kPAP9EDgD/Rg4A/0oOAP9EDgD/XxMA/2ATAP9FDQD/TA4A/0wO\n        AP9QDwD/Tg8A/08PAP9PDwD/UxAA/1MQAP9TEAD/VBAA/1URAP9XEQD/VxEA/2UTAP9hEwD/WhIA/1gS\n        AP9aEgD/XBIA/14SAP9gEgD/YBIA/2MTAP9jEwD/ZRMA/24VAP9yFgD/bBUA/2wVAP9vFQD/bRUA/28W\n        AP91FwD/cRYA/28VAP+3JQL/2CoC/4kZAP+DGgD/ihsA/4obAP+EGgD/mh0A/8AlAP/KJwH/vSYC/4oa\n        AP+OGwD/uSUC/9sxCv/WLQX/1i0G/9YuB//VLgj/2C8I/88tCP8kCAH/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/QAwA/10SAP9ZEQD/WBEA/1wSAP9cEgD/XBIA/1wS\n        AP9cEgD/XBIA/1wSAP9gEwD/YBMA/2ATAP9iFAD/ZBQA/2QUAP9jFAD/YxQA/2QUAP9oFAD/ZxQA/2cU\n        AP9uFQD/XRIA/z4NAP86DAD/XxIA/2ITAP84CwD/PgwA/zgKAP83CgD/OQsA/zUKAP84CgD/OQsA/zkL\n        AP85CwD/OAsA/zoLAP87DAD/OgsA/0ENAP8/DQD/Pw0A/0ENAP9BDQD/QA0A/0gOAP9XEQD/QQ0A/0QO\n        AP9EDgD/Rg4A/0cOAP9vFQD/Sg8A/0YOAP9LDwD/TA4A/0sOAP9LDgD/TA4A/00OAP9ODwD/Tg8A/1AP\n        AP9RDwD/URAA/1IQAP9WEQD/XBIA/1gRAP9WEQD/WREA/1kSAP9aEgD/XRIA/2ASAP9iEwD/ZBMA/2MS\n        AP9jEgD/ZxMA/2sVAP9oFAD/aBQA/2oUAP9rFQD/bBUA/3AWAP9uFgD/bhQA/7sjAv/gLQP/lx0A/3EV\n        AP97GAD/gRkA/34YAP+cHQD/lRwA/4oaAP+hHwD/mh4A/5IcAP+aHQD/1S0G/9ctBv/WLQX/1i4H/9Yv\n        CP/ZMAn/0C4J/yQIAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAA\n        AP9ADAD/XRIA/1kRAP9ZEQD/XBIA/1wSAP9cEgD/XBIA/1wSAP9cEgD/XBIA/2ATAP9gEwD/YBMA/2IU\n        AP9kFAD/ZhQA/2UUAP9kFAD/aBQA/2gUAP9oFAD/aBQA/28VAP9dEQD/PwwA/z8MAP9+GQD/eRcA/0oO\n        AP83CwD/OQsA/zoLAP82CgD/MwoA/0QNAP9ADAD/OgsA/zwMAP85CwD/PQwA/z8NAP89DAD/PAwA/zwM\n        AP8+DQD/Pw0A/0ENAP8/DQD/YRMA/0sPAP9BDgD/RA4A/0YMAP8+BwD/YQoA/2IIAP85AAD/QwMA/0QG\n        AP9HCwD/Sw4A/0wPAP9MDgD/TA4A/0wOAP9MDgD/Tg8A/08PAP9QDwD/VBAA/1QQAP9UEAD/VBAA/1QQ\n        AP9WEQD/VhEA/1YRAP9ZEgD/XBMA/1wTAP9gEwD/XBMA/18SAP9jEgD/YxMA/2UTAP9lEwD/ZRMA/2YT\n        AP9nFAD/aBQA/2oSAP9wFQT/yDEN/+IrAf+uIQD/bBUA/3MWAP92FwD/cxYA/5IcAP+GGgD/excA/4Ua\n        AP+THAD/kxwA/4YaAP+8JQH/3DIK/9YtBv/WLwj/1i8I/9kwCf/QLgn/JAgB/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0AMAP9dEgD/WREA/1kRAP9cEgD/XBIA/1wS\n        AP9cEgD/XBIA/1wSAP9eEwD/YRMA/2ETAP9iFAD/YxQA/2QUAP9lFAD/ZxQA/2gVAP9jDQD/XgUA/18G\n        AP9fBgD/ZQgA/2MTAP83CwD/WREA/3oXAP9uFAD/RAMA/zcAAP88AAD/LgAA/yQAAP8vBQD/NgsA/zUK\n        AP82CgD/NwsA/zEFAP8sAAD/LwAA/y4AAP8yAgD/OwsA/zwMAP89DAD/OwwA/0sPAP+KGwD/Tw8A/zwI\n        AP86AgD/QgwB/10sH/+iVkT/j2Ra/4doX/+AWlD/az4z/1IaDP9GBgD/RAYA/0sOAP9NDwD/TA8A/0wO\n        AP9NDgD/Tw8A/08QAP9PDAD/SQEA/0gBAP9JAQD/TAMA/1cQAP9ZEgD/WBEA/1oRAP9cEgD/XhMA/2AT\n        AP9kFAD/ZhQA/2MTAP9iEgD/YxIA/2MSAP9lEwD/ZRMA/2cTAP9kDwD/ZAwA/7KEef/lemH/2R8A/7wk\n        AP9vFQD/ahUA/3AWAP9uFgD/iBoA/5IcAP97FwD/gRkA/4gaAP+THAD/iBoA/5IbAP/SMQz/2jEK/9cv\n        CP/XLwj/2TAI/9AuCP8kCAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAA\n        AP8AAAD/QQwA/10SAP9ZEQD/WREA/10SAP9dEgD/XBIA/1wSAP9cEgD/XBIA/18TAP9hEwD/YRMA/2QU\n        AP9kFAD/ZBQA/2QUAP9nFAD/ZQ0A/4hFNf+tfnP/qHds/6l5bv+ncmX/bBsH/1QPAP9uFQD/cRQA/2YX\n        Bf+LaGD/lHZv/5NzbP+Kc23/inNt/0spIf8uBQD/MwoA/zQKAP8uAwD/Xz42/5J5dP+Ncmz/kndx/3dV\n        Tf88CwD/PAsA/z0MAP88DAD/WhIA/5MbAP9RBgD/RxkP/4tqYv/JvLj/8Orp///9/P//////////////\n        ///39fT/5NfU/7SVjv9sPTH/RgcA/0cJAP9ODwD/TQ8A/00PAP9MDgD/SgoA/2AoG/+ZdGz/mnVt/5x3\n        bv+XbmX/WRYH/1QPAP9WEQD/VxEA/1gRAP9eEwD/ZxQA/14TAP9hEwD/YBMA/2ATAP9eEwD/YRMA/2ET\n        AP9kEwD/Yg0A/2MPAv+4koj//////92Dbv/NGwD/xSYA/3gXAP9nEwD/bRUA/2oUAP99GAD/jRsA/3wY\n        AP+AGAD/gRgA/40bAP+PHAD/ghgA/7ImBf/bMwz/2C4H/9guB//bMAj/0S4I/yQIAf8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9BDAD/XhIA/1oRAP9aEQD/XRIA/10S\n        AP9dEgD/XRIA/1wSAP9cEgD/XxMA/2ETAP9hEwD/ZRQA/2UUAP9kFAD/ZhQA/2oUAP9eAwD/tIqA////\n        //////////////bx8P91Iw//bxIA/3IWAP9nEQD/VhsN/+/p6P//////////////////////c1hR/ygA\n        AP80CgD/NAoA/yQAAP+ZhID/////////////////yby6/zkKAP84CQD/NwsA/0oPAP9cDgD/jBUA/5de\n        Uf/a09H///////////////////////////////////////////////////////f09P+ymJL/WSMX/0EE\n        AP9NDwD/TA8A/0wPAP9HBQD/fE5D//////////////////Xx8P9fHxD/UQwA/1QQAP9WEQD/VxEA/1gR\n        AP9YEgD/XBIA/10SAP9iEwD/ZhQA/10SAP9lFAD/YBMA/18KAP+DHwz/0q2j////////////135p/7YW\n        AP/QJwD/iRoA/18SAP9pFAD/ZBMA/3AVAP+SHAD/excA/3QXAP95FwD/hxoA/5McAP+KGwD/kR0C/9Uy\n        DP/ZLwf/2C8I/9swCP/SLgj/JQgB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAA\n        AP8AAAD/AAAA/0EMAP9eEgD/WhEA/1oRAP9dEgD/XRIA/10SAP9dEgD/XRIA/2ATAP9iEwD/YRMA/2MU\n        AP9lFAD/ZRQA/2UUAP9lFAD/aBQA/18EAP+yhnz/////////////////9vHw/3UjD/9sEQD/dBcA/18P\n        AP9KFwv/6uTi//////////////////////90Vk7/LwAA/zsMAP89DAD/MAAA/56GgP//////////////\n        ///Iurb/PAsA/zsKAP8/DAD/Ww4A/1EPA//AlIn///39////////////////////////////////////\n        ///////////////////////////////////g1dP/bjow/0cEAP9RDwD/UQ8A/0kFAP97TED///7+////\n        ////////8+7t/2AgEP9QDAD/UQ8A/1URAP9XEQD/WBEA/1gRAP9ZEQD/WBEA/1gRAP9YEgD/WhIA/1gR\n        AP9TBwD/by0e/9fDvv/////////////////Xfmn/rhUA/8cmAP+oIAD/ZxMA/20VAP9rFAD/bhUA/4ca\n        AP90FwD/cBcA/6AfAP+xIgD/ihoA/5UcAP+SHQH/1S4I/9ovCP/YLwj/2zAI/9IuCP8lCAH/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/QQwA/14SAP9aEQD/WhEA/14S\n        AP9eEgD/XhIA/10SAP9dEgD/XxMA/2ITAP9iEwD/YxQA/2UUAP9lFAD/ZRQA/2UUAP9nFAD/XQQA/7KG\n        fP/////////////////28fD/diMP/2sRAP9zFgD/ZBAA/00YC//q4+L//////////////////////3FV\n        Tv8oAAD/MwoA/zcKAP8kAAD/mYSA/////////////////8e6tv86CgD/OwoA/1cPAP9ZDgD/sJiS////\n        ///////////////////79/b/5ca//9GXiv+pfXP/nXpx/6CBev/Rq6P/8ePg////////////////////\n        ///p4+H/cDsv/00GAP9PEAD/TAYA/4lOQP///v7////////////07+7/ZSUV/0sLAP9ODwD/UQ8A/1MQ\n        AP9VEAD/VRAA/1UQAP9TEAD/UxAA/1YRAP9WEAD/TgQA/3k/Mf/n3dn//////////////////////9h+\n        af+0FgD/uyMA/8cmAP+QHAD/dhgA/3sYAP9yFgD/hRoA/4AZAP9xFgD/ryEA/9osA/+cHwL/jxsA/6gh\n        Av/bMAn/2i8I/9ovCP/cLwj/0y0H/yUIAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAA\n        AP8AAAD/AAAA/wAAAP9BDAD/XhIA/1oRAP9aEQD/XhIA/14SAP9eEgD/XhIA/14SAP9eEgD/YhMA/2IT\n        AP9iEwD/ZRQA/2UUAP9lFAD/ZRQA/2UUAP9dBAD/soZ8//////////////////bx8P92Iw//axEA/3IW\n        AP9qEQD/UhkL/+nk4v//////////////////////dFVO/y0AAP80CwD/PAwA/yIAAP+VhID/////////\n        ////////xLm2/zIIAP86CQD/XQoA/5d4cv//////////////////////yr+8/55QPv+hIAL/ZQoA/zIA\n        AP9DAAD/UAQA/4ASAP98Kxj/xIp8//3y8P/////////////////k08//XSMX/0gJAP9IBgD/gUxA///+\n        /v////////////Tv7v9kJRX/UwwA/1gRAP9XEQD/VxEA/1gRAP9YEQD/VxEA/1kRAP9aEgD/WA8A/08F\n        AP+GVUn/7+jn////////////////////////////1X5p/7cWAP+1IgD/xiYA/7skAP92FwD/dBcA/3UX\n        AP+EGQD/kBsA/3wYAP+3IgD/2ywE/8IqBv+FGQD/wSgF/+AwCP/aLwf/2i4G/90wB//TLQf/JQgB/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0ENAP9fEwD/WhEA/1oR\n        AP9eEgD/XhIA/14SAP9eEgD/XhIA/14SAP9iEwD/YhMA/2ITAP9jFAD/ZhQA/2YUAP9mFAD/ZRQA/1wE\n        AP+yhnz/////////////////9vHw/3YjD/9rEQD/cRYA/3ATAP9RGQv/5uPi////////////////////\n        //9yVU7/LAAA/zwMAP9ADAD/LQAA/56FgP/////////////////Hurb/OAkA/0QEAP9tOi//8e3t////\n        /////////////7Wbk/9UFAn/iRAA/44YAP89CwD/Pg0A/0cOAP94FwD/kRsA/4ETAP+REQD/w1pB//jo\n        5P////////////////+xlY//RgcA/0EDAP98TUL////+////////////8+/u/2AkFf9PCwD/UA8A/1EP\n        AP9VEQD/VhEA/1YQAP9YEQD/XRIA/1sOAP9XCAD/oHNm//n19P//////////////////////////////\n        ///OfWn/sBUA/6wgAP+9JAD/0SgA/5YdAP9pFAD/exgA/4AZAP+EGgD/qiEA/8kmAP/SKgP/3y8H/9Ir\n        Bf/aLgb/2y8H/9syC//bOBL/3i8G/9QuB/8lCAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/QQ0A/18TAP9bEgD/WxIA/14SAP9eEgD/XhIA/14SAP9eEgD/XhIA/2IT\n        AP9iEwD/YhMA/2ITAP9mFAD/ZhQA/2YUAP9mFAD/XAQA/7KGfP/////////////////28fD/diMP/2sR\n        AP90FgD/aBEA/0AVC//m4+L//////////////////////3BVTv8pAAD/PAwA/zkLAP8yAAD/noWA////\n        /////////////9O8tv9FCwD/RwcA/7Sjnv/////////////////WraP/RQsC/2kPAP+bHgD/cRYA/zEJ\n        AP9CDQD/XhIA/4waAP+ZHQD/tSQB/5YbAP+qEwD/xFtE//bz8v////////////Tx7/9qOi//QgAA/4JQ\n        Rf/////////////////07+7/YSMV/0gKAP9EDgD/Rw4A/0gOAP9JDgD/SQ4A/0wPAP9JCQD/SwsB/7GN\n        hf///////////////////////////////////////////9J9af+pFAD/tSIA/7wkAP/GJgD/sSIA/3MW\n        AP9tFQD/chYA/28WAP+qIQH/1ioB/9YqA//dLwf/3i8H/90uBv/bLwf/2zAI/9sxCv/eMAf/1S4H/yUI\n        Af8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9BDQD/XxMA/1sS\n        AP9bEgD/XhIA/14SAP9eEgD/XhIA/14SAP9eEgD/YxMA/2MTAP9iEwD/YhMA/2YUAP9mFAD/ZhQA/2YU\n        AP9cBAD/soZ8//////////////////bx8P93Iw//bBEA/3MWAP9KCwD/NxML/+fj4v//////////////\n        ////////dlZO/zYBAP86CwD/OAsA/y0AAP+ZhID/////////////////0ry2/1QJAP9dLiT/7+zr////\n        ////////8uHc/3ssHf9BBgD/ihsA/6MfAP9xFgD/NAoA/zsMAP94FwD/jRsA/5geAP+dHgD/mh0A/64h\n        AP+REQD/qoiB/////////////////6uOh/85AAD/dU5E//////////////////Tx8P9hJxj/TgoA/00P\n        AP9MDwD/Tg8A/00PAP9NDwD/RgYA/1EWDP+6opz/////////////////////////////////////////\n        ////////y3xp/6oVAP+3IwD/tSMA/7YjAP+zIgD/mx4A/2QUAP9rFAD/ahQA/7YjAP/VKAD/1ysD/94u\n        Bv/dLgb/3S0F/9wuBv/cLwf/3C8H/94wB//VLgf/JQgB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAA\n        APAAAAD/AAAA/wAAAP8AAAD/AAAA/0ENAP9fEwD/WxIA/1sSAP9dEgD/XhIA/14SAP9eEgD/XhIA/14S\n        AP9jEwD/YxMA/2MTAP9jEwD/ZRQA/2cUAP9mFAD/ZhQA/1wEAP+xhnz/////////////////9vHw/3gk\n        D/9wEgD/YBIA/ywFAP85FQv/5+Pi//////////////////////90Vk7/MQEA/zsMAP8+DAD/KgAA/5uF\n        gP/////////////////Kurb/VgUA/59wZP////////////////+vhHv/QAIA/2oVAP+XHQD/pR8A/2AT\n        AP9FDQD/UxAA/4oaAP95FwD/jxsA/6IfAP+jHwD/nB4A/2kOAP+ZMx//7ubj////////////2tDN/z8M\n        AP93S0H/////////////////9vLx/2EqHP9GCQD/TQ8A/1gRAP9aEQD/VxEA/1IGAP9qJxr/0b65////\n        ////////////////////////+PX0/+DU0P////////////////+tdmn/kxAA/6cgAP+uIgD/rCEA/7Yj\n        AP+zIgD/hhoA/2cUAP+EGgD/xyYA/8kmAP/WKwP/3y8G/94uBf/dLQX/3S4G/90uBv/dLwf/3y8H/9Yt\n        Bv8lCAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/QQ0A/18T\n        AP9bEgD/WxIA/1sSAP9eEwD/XxMA/18TAP9eEgD/XhIA/2MTAP9jEwD/YxMA/2MTAP9lFAD/ZxQA/2cU\n        AP9nFAD/XAQA/7CGfP/////////////////28fD/dyMP/24RAP89DAD/LQYA/zwVC//n4+L/////////\n        /////////////3ZWTv88AgD/PgwA/z4NAP8vAAD/lYSA/////////////////8a4tf9GBwD/xKKa////\n        ////////+fj3/2A8Nv9ABAD/iRoA/5weAP+SHAD/Qw0A/zkLAP9tFQD/nB4A/6ogAP+THAD/bhUA/4ca\n        AP9wFgD/fBcA/6obAP/Rsar////////////z8PD/Wi0i/3lIPf/////////////////18fH/Wigb/0kK\n        AP9XEQD/UhAA/0cOAP8+AQD/aTUq/+HU0f////////////////////////////j08/+NYlj/lGtj////\n        /////////////5Zyaf9uCQD/nB0A/5kdAP+tIQD/siMA/6ohAP+nIAD/bhUA/5kdAP/AJQD/uSMA/9Qr\n        Av/gLgX/3i4F/94uBf/eLgX/3i4F/90uBv/gLwf/1i0G/yUIAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9CDQD/YBMA/1wSAP9bEgD/WxIA/10TAP9fEwD/XxMA/18T\n        AP9fEwD/ZBQA/2MTAP9jEwD/YxMA/2UUAP9nFAD/ZxQA/2cUAP9dBAD/sYZ8//////////////////bx\n        8P95Iw//XQ4A/zQLAP9LDAD/TBkL/+fj4v//////////////////////dVVO/zkBAP88DAD/OwwA/yQA\n        AP+YhID/////////////////w7e0/zkKAP/Pv7v////////////v6un/RBwT/04LAP+QHAD/qCEA/28V\n        AP80CgD/PQwA/4EZAP+zJQT/sCMB/2ASAP83CwD/Tg8A/1sSAP9aEQD/ig4A/9mUhP//////////////\n        //9vSD7/dkU5//////////////////Xx8f9nKhv/TgoA/0UOAP89CwD/NwAA/3VKQP/t5uT/////////\n        ///////////////////v5OH/iU5B/0sAAP+ecWj/////////////////mHJp/0wCAP+UHAD/oh8A/5ge\n        AP+mIAD/oB4A/6ggAP+XHQD/sSIA/6sgAP+1IwD/2CsC/+AuBP/eLQT/3i4F/94uBf/eLwb/3i8G/+Ew\n        Bv/YLgb/JggB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0IN\n        AP9gEwD/XBIA/1wSAP9cEgD/XRMA/18TAP9fEwD/XxMA/18TAP9kFAD/ZBQA/2QUAP9kFAD/ZBQA/2cU\n        AP9nFAD/ZxQA/10EAP+yhnz/////////////////+PHw/28hD/8xBgD/LgkA/y8GAP9AFgv/6OPi////\n        //////////////////9wVU7/LwAA/zsMAP86CwD/HwAA/5iEgP/////////////////CtrP/Ng4D/9XM\n        yf///////////+nm5v9HFw3/PgkA/4MZAP+hHwD/Tw8A/zMKAP9dEgD/riEA/7EiAP+aHgD/Rg4A/0cO\n        AP9VEQD/Qw0A/0gOAP+LDAD/y4l7/////////////////3ZTSv9xQzj/////////////////9vLx/2Yq\n        G/86BwD/NwgA/zYDAP+KaWD/9fLy////////////////////////////28rG/3w0JP9cBwD/RAAA/5hy\n        af////////////////+bcmn/QAAA/20VAP+fHwD/lB0A/6EfAP+ZHgD/sSIA/7cjAP+xIgD/sSIA/7oj\n        AP/cLAP/4S4F/98tBP/fLQT/3y4F/94vBv/eLwb/4S8F/9gtBf8mCAH/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/Qg0A/2ATAP9cEgD/XBIA/1wSAP9cEgD/YBMA/2AT\n        AP9gEwD/XxMA/2MUAP9kFAD/ZBQA/2QUAP9kFAD/ZxQA/2cUAP9nFAD/XQQA/7OGfP//////////////\n        ///48fD/SxsP/yUEAP8sCQD/JQUA/zgUC//o4+L//////////////////////3JVTv8tAAD/NQsA/y8J\n        AP8kAAD/moWA/////////////////8O3tP81DAL/0MfE////////////7Ojm/3UhDf9BCQD/dBYA/3EV\n        AP9JDgD/Sg8A/4QaAP+aHgD/nR4A/2ITAP8+DAD/Sw8A/0kOAP85CwD/bBUA/4IMAP/Cinz/////////\n        ////////dU5F/3BEOf/////////////////18/L/Xy0g/z0CAP8+CAD/noV+////////////////////\n        /////////////72nov9WGg//VggA/2MTAP9lCQD/qndr/////////////////5dyaf9BAQD/UA8A/4AZ\n        AP+XHQD/oB4A/5IdAP+vIgD/siMA/7QiAP/AJAD/vyQA/9wrAv/hLgX/4C0E/+AuBf/gLQT/3y4F/98u\n        Bf/hLgT/2CwE/yYIAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAA\n        AP9DDQD/YRMA/1wSAP9cEgD/XBIA/1wSAP9gEwD/YBMA/2ATAP9gEwD/YhQA/2QUAP9kFAD/ZBQA/2QU\n        AP9nFAD/ZxQA/2cUAP9dBAD/s4Z8//////////////////Pw8P87GA//KAUA/y0JAP8sBgD/NBQL/+fj\n        4v//////////////////////cFVO/ygAAP8pCQD/KQkA/x0AAP+XhID/////////////////yLi0/zUH\n        AP+8r6v////////////58u//kTcj/zYGAP9bEgD/Tw8A/y8JAP9bEgD/nx8A/3sYAP+eHwD/Rg0A/zkL\n        AP9DDQD/OwsA/z4MAP+KGgD/gRAA/8Sflv////////////75+f9wPDD/dko///////////////////Xz\n        8v9PIx7/PwwE/7OemP////////////////////////////38/P+ghn//PwcA/zwGAP9TEAD/WREA/4UR\n        AP/RgnD/////////////////l3Jp/0cBAP9MDgD/WREA/4YZAP+fHgD/khwA/6YgAP+0IwD/tiMA/8Ak\n        AP/BJAD/2SoC/+EtBP/gLgX/4C4F/+AtBP/gLQT/4C0E/+MuBP/ZLAT/JggB/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0MNAP9hEwD/XRIA/10SAP9cEgD/XBIA/2AT\n        AP9gEwD/YBMA/2ATAP9hEwD/ZBQA/2QUAP9kFAD/ZBQA/2UVAP9oFQD/aBUA/14FAP+zhnz/////////\n        ////////8/Dw/zoYD/8pBQD/LQkA/zYHAP83FAv/5+Pi//////////////////////9nU07/HQAA/ycI\n        AP8nCAD/GAAA/5OEgP/////////////////Eubb/KAAA/5iEf/////////////////+QYFT/KAAA/zgL\n        AP83CwD/NQsA/4AZAP/HJgD/hxoA/4AZAP8+DAD/PQwA/zsLAP82CgD/VxEA/4IWAP9NEwb/1cvI////\n        ////////6eLg/0waDf92TUP/////////////////8e3t/2lAN//Csq7/////////////////////////\n        ///y7+7/imRb/z4DAP9CCgD/Rw4A/0wOAP9WEQD/SwIA/5pxaf////////////////+Zcmn/YAcA/4Qc\n        A/9SEAD/eRgA/5EcAP+QHAD/oB8A/7YjAP+3IwD/vSQA/7ckAf/dLAP/4i0D/+EtBP/hLQT/4C0E/+At\n        BP/gLQT/4y4E/9osBP8mCAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAA\n        AP8AAAD/Qw0A/2ETAP9dEgD/XRIA/10SAP9eEwD/XxMA/2ATAP9gEwD/YBMA/2MUAP9lFAD/ZBQA/2QU\n        AP9kFAD/ZBQA/2cVAP9oFQD/XgUA/7KGfP/////////////////x8PD/LA8P/xkAAP8dAQD/JgQA/zQU\n        C//n4+L//////////////////////2dTTv8YAAD/GQMA/xMAAP8EAAD/i4CA/////////////////8W5\n        tv8jAAD/YkdB//7+/f///////////761sf8uBwD/MAcA/zIKAP9HDgD/jRsA/7EiAP+YHgH/VBAA/zoM\n        AP87CwD/OgsA/zsMAP+DGQD/XAcA/3dTS//+/v7////////////Isqz/NwAA/3JPR///////////////\n        ///49/b/5uDe////////////////////////////5t/d/2xDOf87AQD/QwwA/0UOAP9EDgD/RQ4A/0MN\n        AP84AAD/kHFp/////////////////5hyaf9XBAD/YxMB/1MQAP9iEwD/dhYA/4waAP+aHQD/rSEA/7cj\n        AP+zIgD/ryEB/94sA//jLQL/4i0D/+ItA//hLQP/4S0C/+EtBP/jLgX/2iwE/yYIAf8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9DDQD/YRMA/10SAP9dEgD/XRIA/2AT\n        AP9fEwD/YBMA/2ATAP9gEwD/ZRQA/2UUAP9lFAD/ZRQA/2UUAP9kFAD/ZhUA/2gVAP9eBQD/sYZ8////\n        //////////////n49/+ei4j/l4SA/5F9eP8uDAT/MREJ/+fj4v//////////////////////ZVNO/xAA\n        AP9aRUD/l4yJ/4p7d//JwsD/////////////////xbm2/yoEAP8yDgb/08rI/////////////////3ti\n        XP8pAAD/MgoA/1YRAP+FGQD/jRsB/4scAv8wCgD/NwsA/zYLAP84CwD/Sw4A/5oXAP+MJRH/38zI////\n        /////////////7NoVv9SAAD/bE9I/////////////////////////////////////////////////8zB\n        vv9QKCD/MAAA/zsLAP88DAD/PAwA/zwMAP88DAD/PQwA/zEAAP+NcGn/////////////////kXFp/zkA\n        AP9EDQD/Rg4A/0ENAP9cEgD/gxoA/50eAP+eHgD/tyMA/7gjAP+2IwD/3ywC/+QsAf/jLQP/4i0D/+Iu\n        BP/iLgT/4i4E/+QuBP/bLAT/JggB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAA\n        AP8AAAD/AAAA/0MNAP9hEwD/XRIA/10SAP9dEgD/YBMA/18TAP9hEwD/YRMA/2ETAP9lFAD/ZRQA/2UU\n        AP9lFAD/ZRQA/2UUAP9nFQD/aRUA/14FAP+xhnz/////////////////////////////////8vDw/y4T\n        DP8qDgf/5uPi//////////////////////9lU07/CAAA/5KDgP//////////////////////////////\n        ///Fubb/LQcA/yIAAP+CZ2D/////////////////7erp/2RGP/8zAAD/bxIA/2ETAP9tFQD/ghkA/zYL\n        AP82CwD/NwwA/zAKAP9mCwD/lx8H/9msof/////////////////jy8X/kCIJ/4sOAP+EVEn//f//////\n        //////////////////////////////////+xoZz/PRMN/y8BAP81CgD/NQoA/zYKAP84CwD/OgsA/zoL\n        AP83CgD/LQAA/5pyaf////////////////+ScWn/NwAA/0ANAP9ADQD/QA0A/0INAP9oFAD/khwA/50e\n        AP+mIAD/uiMA/6whAf/eLQT/5CwB/+MtAv/jLQP/4y0C/+MtAv/iLgP/5S8E/9ssA/8mCAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/RA0A/2ITAP9eEgD/XRIA/10S\n        AP9gEwD/XxMA/2ETAP9iEwD/ZBQA/2YUAP9mFAD/ZRQA/2UUAP9lFAD/ZRQA/2cVAP9pFQD/XwUA/7KG\n        fP/////////////////////////////////y8PD/MhQM/zEQB//n4+L//////////////////////2VT\n        Tv8IAAD/kYOA/////////////////////////////////8W5tv8tCAD/IgIA/3MYBP/xv7P/////////\n        ////////7Ovr/5ZqXv90FQH/cAsA/4gUAP+QGAD/RQoA/0MIAP85AgD/KwAA/2cvIv/WuLH/////////\n        ////////+/j3/6ZYRv+AEAD/iBEA/4tVSf/8///////////////////////////////7+vr/ln95/zMH\n        Af8xBQD/NgsA/zUKAP81CgD/NQoA/zcKAP86CwD/OwsA/zUKAP8xAAD/q3Vp/////////////////51z\n        af8/AAD/ZhQA/0sPAP9HDgD/QQ0A/2kUAP9+GAD/mx4A/6whAP+xIgD/rCMC/+AwB//lKwD/4yoA/+Ms\n        Af/jLAH/4ywB/+MtAv/mLwT/3CwC/yYIAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAA\n        AP8AAAD/AAAA/wAAAP9EDQD/YhMA/14SAP9eEgD/XhIA/2ATAP9fEwD/YRMA/2ETAP9jFAD/ZRQA/2cU\n        AP9nFAD/ZhQA/2YUAP9lFAD/ZhUA/2kVAP9fBQD/soZ8//////////////////////////////////Lw\n        8P80FAz/Lw8H/+fj4v//////////////////////ZlNO/w4AAP+WhID/////////////////////////\n        ////////w7m2/yYHAP85CQD/lxYA/4A0I//a2tr///////////////////38/9i+uP+kaVv/q0Eo/5os\n        Ef9jHw7/Yykb/35KPv+ejIj/6+bm///////////////////////Fh3j/iBMA/5AaAP+CEAD/gFRJ//7/\n        ////////////////////////7+zr/3ZYUf8sAAD/MwgA/zYLAP81CwD/NQsA/zUKAP82CgD/NQoA/zgK\n        AP82CgD/NAoA/zkAAP+xd2n/////////////////j3Bp/zUAAP9IDwD/Qg0A/z8NAP9BDQD/Sw8A/1wS\n        AP+RHAD/sSIA/68hAP+yJAL/4y8F/+IqAP/iKwD/4yoA/+QsAf/jLAL/4y0D/+YuA//dKwH/JgcA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0QNAP9iEwD/XhIA/14S\n        AP9eEgD/YBMA/2ETAP9iEwD/YRMA/2ETAP9jFAD/ZRQA/2UUAP9nFAD/ZhQA/2YUAP9mFAD/ahUA/18F\n        AP+xhnz/////////////////////////////////8/Dw/zUUDP8sDgf/6ePi////////////////////\n        //9oU07/DAAA/5OEgP/////////////////////////////////Eubb/KggA/10QAP9UEAD/IQAA/1U1\n        Lv/i3Nr////////////////////////////79/b/9+/t//Xu7f/08fH//vz8////////////////////\n        ////////xI+B/4kVAP+GFwD/jhwA/2kLAP90VU3//////////////////////93W1P9cOTH/KgAA/zUK\n        AP82CwD/NgsA/zYLAP82CwD/NgsA/zcLAP83CwD/OAsA/zkLAP82CgD/OAAA/6d1af//////////////\n        //+RcWn/OQAA/0cOAP9IDgD/Rw4A/0gOAP9GDgD/SQ4A/4EZAP+wIgD/qCAA/7kkAf/iLwX/4isA/98r\n        AP/gKgD/4ysA/+UsAf/kKgD/5isA/9opAP8mBwD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/RA0A/2ITAP9eEgD/XhIA/14SAP9gEwD/YRMA/2ETAP9iEwD/YxMA/2ET\n        AP9sFQD/fBgA/2QUAP9mFAD/ZhQA/2YUAP9qFQD/YAUA/7WKgP//////////////////////////////\n        ///08PD/NRQL/yoPCf/r6Oj//////////////////////2tXUf8MAAD/k4SA////////////////////\n        /////////////8a8uv88CwD/Vg8A/yYIAP8wCQD/JQAA/0gnIP+/tLH/////////////////////////\n        ////////////////////////////////////////6+fl/6BuYf92EAD/hxcA/4UbAP+KGwD/WggA/3BU\n        Tf/////////////////EuLT/RyAY/ywAAP82CwD/NgsA/zYLAP82CwD/NgsA/zULAP82CwD/NgsA/zYL\n        AP82CwD/OQsA/zgLAP8tAAD/l3Zu/////////////////450bv8uAAD/OgsA/zwMAP8+DAD/Qg0A/0MN\n        AP9CDQD/VRAA/5gdAP+fHgD/vCUC/+EvBf/gKwD/3SoA/90qAP/eKgD/4SsA/+UrAP/oKwD/3CkA/ycH\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9EDQD/YhMA/14S\n        AP9eEgD/XhIA/2ATAP9hEwD/YRMA/2ITAP9iEwD/ZBMA/2YUAP9tFQD/ZhQA/2YUAP9mFAD/ZhQA/2oV\n        AP9oDwD/e0Ay/4Rxbf9+a2b/fGpm/3xqZv98a2b/gm1o/4NnYP8oDAX/JgoD/3JgW/9/bWj/fWtm/35s\n        Z/9+bGf/Qicg/x0AAP9SOjP/hHJt/4BrZv9/a2b/gGxn/5lyaP+HcGr/aVBJ/zoLAP9EDAD/JwgA/ysJ\n        AP8sCQD/JAEA/y4KBf97YVr/08fF//z6+f//////////////////////////////////////6+bl/6uX\n        kf9ULCP/TAUA/3UVAP+CGgD/fhkA/4AZAP9JBQD/cFVP////////////qpiT/zcNB/8vAwD/NgsA/zYL\n        AP82CwD/NgsA/zYLAP81CwD/NgsA/zULAP85DAD/NwsA/zYLAP83CwD/NgsA/zIEAP9/PzD/yId4/8ON\n        gf/PoJX/fUg7/zUDAP86CwD/OAsA/zoLAP87DAD/PAwA/z0MAP9ADQD/axUA/5kdAP+5JQL/4C8F/9wp\n        AP/cKQD/3SoA/9sqAP/dKgD/4SsA/+QsAP/dKgD/JwcA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAA\n        APAAAAD/AAAA/wAAAP8AAAD/AAAA/0QNAP9jEwD/XxIA/14SAP9eEgD/YBMA/2ETAP9hEwD/YhMA/2IT\n        AP9iEwD/ZBMA/2UUAP9mFAD/ZhQA/2YUAP9mFAD/aBUA/24WAP9SCwD/HQAA/xwAAP8bAAD/GQAA/xQA\n        AP8mAAD/LQAA/yMIAP8lCAD/HAAA/xoAAP8aAAD/GgAA/xoAAP8jBAD/KQkA/yAEAP8aAAD/HwAA/xwA\n        AP8uBAD/Wg0A/xsAAP8jAQD/MQkA/zAJAP8wCQD/MgoA/zMKAP8yCgD/NAcA/ywAAP88EAj/n1VD/86e\n        kv/jzcf/9+bi//vu6//r29f/ybSv/591av9NJx3/QQYA/zYEAP8/DAD/ZRQA/3cXAP+BGQD/ehcA/zcC\n        AP9wU0z/8e7u/5mDfP8wAwD/MQYA/zULAP81CwD/NQsA/zULAP81CwD/NAoA/zULAP82CwD/MgoA/0QO\n        AP87DAD/NwsA/zgLAP83CwD/OAsA/3ERAP+NEAD/eA4A/3APAP9vEgD/UhAA/zsMAP8+DAD/PgwA/0AN\n        AP9ADQD/RA0A/0INAP9KDgD/fhgA/7QjAf/gLQT/2SkA/9kpAP/ZKQD/3SoA/90qAP/gKwD/5CwA/9oq\n        AP8nBwD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/RA0A/2MT\n        AP9fEgD/XxIA/18SAP9hEwD/YRMA/18SAP9iEwD/YhMA/2ITAP9lFAD/ZxQA/2cUAP9nFAD/ZhQA/2YU\n        AP9mFAD/axUA/18TAP8pCAD/KwkA/ywJAP8sCQD/KQgA/0QOAP8rCQD/JAcA/ycIAP8lBwD/JggA/yYI\n        AP8nCAD/JwgA/ycIAP8nCAD/JwgA/ykJAP8qCQD/JwgA/zwMAP80CQD/KQkA/ygIAP85CwD/VBEA/yoJ\n        AP8tCQD/LwkA/zAKAP8xCgD/NAoA/y4GAP9lDQD/hxcA/3wSAP/RbVb/6qOS/5cbAP9MDwL/WgsA/zYG\n        AP81CQD/OQsA/zgLAP9SEAD/bRUA/4YaAP94FwD/NQoA/zoPBf9AFwz/NQgB/zUJAP82CwD/MwoA/zUK\n        AP82CwD/NQsA/zULAP81CwD/NAoA/zQLAP8zCgD/PwwA/zgMAP83CwD/OAsA/zYLAP86DAD/ehcA/5cd\n        AP+KGgD/cxUA/3MVAP9mFAD/Rw4A/zwMAP8/DAD/PQwA/z4MAP9ADQD/QQ0A/z4MAP9WEQD/oyAB/+At\n        A//aKQD/2ykA/9wqAP/aKQD/2ykA/94qAP/hKwD/2ioA/yYHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9ADAD/YBIA/18SAP9fEgD/XxIA/2ASAP9fEgD/XxIA/2IT\n        AP9iEwD/YhMA/2ITAP9nFAD/ZxQA/2cUAP9nFAD/ZxQA/2YUAP9pFQD/axUA/00PAP8oCAD/KwgA/yoJ\n        AP86CwD/RQ0A/yIHAP8kBwD/JggA/yUHAP8lCAD/JQgA/ycIAP8nCAD/JwgA/ycIAP8nCAD/KAgA/ygI\n        AP8nCAD/QA0A/zMKAP8pCQD/JggA/z0MAP9NDwD/IwcA/yYIAP8sCQD/LAkA/ysJAP8rCQD/LwkA/z8M\n        AP93EwD/mR0D//PJv//58O3/uzsl/1sJAP9QDwD/Rg4A/zQKAP83CwD/OAsA/z8MAP9fEgD/gBkA/1gR\n        AP8zCgD/NQkA/zQHAP82CgD/NwsA/zUKAP8yCgD/NwsA/zULAP81CwD/NQsA/zULAP82CwD/NgsA/zYL\n        AP81CwD/NgsA/zYLAP82CwD/NQoA/0wOAP+UHQD/lx0A/5MdAP+BGQD/chYA/3QXAP9nFAD/PQwA/zoL\n        AP87CwD/OwsA/z0MAP9ADQD/QQ0A/z8NAP+BGQH/4C0D/9opAP/dKQD/3ioA/94qAP/eKgD/3SoA/+Er\n        AP/bKgD/JgcA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0EN\n        Af9hEwH/XxIA/18SAP9fEgD/XxIA/18SAP9fEgD/YRMA/2MTAP9jEwD/YhMA/2QUAP9nFAD/ZxQA/2cU\n        AP9nFQD/Yw8A/2MHAP9lCAD/ZwgA/0sDAP8kAAD/HwAA/0MCAP8nAQD/FQAA/xkAAP8YAAD/GQAA/xoA\n        AP8YAAD/GAAA/xkAAP8ZAAD/GQAA/xkAAP8aAAD/GwAA/xkAAP8uAQD/OAYA/ygJAP8qCQD/MQoA/y8J\n        AP8rCQD/KwkA/y0JAP8uCQD/LwkA/y8JAP8yCgD/MAkA/1cFAP/YeWP/+v////T9///xsKL/kBQA/0cN\n        AP9TEAD/NAoA/zcLAP84CwD/NgsA/0sPAP9tFQD/Qg0A/zQLAP81CwD/NwsA/zAHAP8nAAD/JQAA/ycA\n        AP8qAAD/KAAA/ykAAP8qAAD/KgAA/yoAAP8qAAD/KgAA/ykAAP8pAAD/KQAA/ykAAP8nAAD/ZQgA/5cS\n        AP+XEgD/jhAA/4IOAP9yCwD/dgwA/3UOAP9SDwD/NAsA/zgLAP83CwD/OgsA/z4MAP9DDQD/PQwA/2ET\n        AP/cKwH/2ioA/9wpAP/bKQD/2ykA/9gpAP/bKgD/4isA/9kpAP8lBwD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/Qw0B/2EUAf9gEwH/YBMB/2ATAf9fEgD/YRMA/2AS\n        AP9hEgD/YxMA/2MTAP9jEwD/ZBQA/2UUAP9oFAD/ZxQA/2EOAP+SPCf/xX1s/795aP/AeWj/w3po/6Rx\n        Zf+XZlr/q2pa/5NhVf+SYVX/kmFV/5JhVf+SYVb/kWFW/5BhVv+RYVb/kmFW/5JhVf+SYVX/kmFV/5Jh\n        Vf+SYVX/kGBU/55qXf+QQC3/LQQA/yoJAP8zCgD/SA4A/y4JAP8vCQD/LwkA/zAJAP8yCgD/NQoA/zUK\n        AP8rBAD/Yh0O//nd1v/1+vv/9PX1//r5+P/RW0L/TwUA/1sSAP82CwD/NwsA/zYLAP9GDgD/PwwA/1YR\n        AP81CgD/MgoA/zQLAP8tBgD/YiUX/5hiVf+RYlb/k2FV/5RhVf+UYVX/k2FV/5NhVf+TYVX/k2FV/5Ng\n        VP+TYFT/kmBU/5JgVP+SYFT/k2BU/5NhVf++bVr/yG9a/8hwW//Eb1r/wG9b/7lsWf+0bVz/r2BM/2IW\n        BP86CgD/PAwA/zoLAP8/DAD/QQ0A/0INAP8/DAD/ZBMA/9opAP/ZKgD/2yoA/9wqAP/eKQD/2ikA/9sp\n        AP/eKgD/1SgA/yUHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAA\n        AP9DDQH/XxMB/2ATAf9gEwH/YBMB/2ATAf9hEwH/YRMB/18SAP9iEwD/YxMA/2MTAP9kEwD/YxMA/2gU\n        AP9oFAD/XQYA/7RzY///////////////////////////////////////////////////////////////\n        /////////////////////////////////v////7////+/////v////7//////+qUgP85AAD/JwgA/0UO\n        AP9bEgD/JQgA/yoJAP8pCAD/KwkA/ywJAP8tCAD/KQkA/yoAAP/EhHb//v////X09P/08/P/9fz+//nJ\n        vv92GAP/VA4A/z8MAP83CwD/NAoA/1cRAP9ADAD/Sw8A/zIKAP8xCQD/NQoA/yYAAP+YXE3///77//75\n        +f/9+Pb//fj2//349v/9+Pb//fj2//z39v/89/b//Pf1//z29f/79vX/+/b1//v29P/69fT/+vX0//T1\n        9f/y9fX/8vX1//P19f/09fX/9PT0//b5+v/v3Nf/ax0L/zkIAP88DAD/NAsA/zULAP83CwD/OwwA/z4M\n        AP9qFAD/2CkA/9gqAP/ZKgD/2yoA/90qAP/cKgD/2yoA/94pAP/VKAD/JQcA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0INAf9hEwH/YBMB/2ATAf9gEwH/YBMB/2AT\n        Af9gEwH/YBMB/2IUAf9kFAH/YxMA/2MTAP9kEwD/aBQA/2gUAP9eBwD/s29e///////9/////f39//z9\n        /f/8/f3//P39//z9/f/7/P3/+/z9//v8/P/6/Pz/+vv8//r7/P/6+/z/+vv7//r7+//6+/v/+vv7//n6\n        +//5+vr/+Pr6//j6+v/+////2Y59/zgAAP8nCAD/NwsA/zIKAP8pCAD/KgkA/ykIAP8rCQD/KwkA/ycI\n        AP8/BgD/eDIn//zq5f/2+fr/9fT0//X09P/19fX//v///7x1ZP9PAwD/Rg4A/zEJAP82CgD/VBEA/z4N\n        AP9BDQD/MgoA/zAJAP8zCgD/JAAA/5FZTP//+Pb/8fT1//Hy8v/x8vL/8PLy//Dx8f/w8fH/8PHx//Dx\n        8f/w8fH/8PHx//Dx8f/v8PH/7/Dw/+/w8P/v8PD/7u/v/+7v7//t7u//7e7v/+3u7v/t7u7/7/Lz/+vW\n        0f9vHgr/NQgA/zoMAP87DAD/PAwA/0AMAP9BDQD/PAwA/24VAP/XKQD/2ioA/9gqAP/YKgD/2SoA/9kq\n        AP/ZKgD/2ysA/9IpAP8lBwD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAA\n        AP8AAAD/QgwB/2ATAf9gEwH/YBMB/2ATAf9gEwH/YhQB/2EUAf9gEwH/YxQB/2QUAf9kFAH/ZRQB/2YU\n        Af9nFAD/aBQA/14HAP+zb17///////3+/v/9/f3//f39//7/////////////////////////////////\n        ///////////////////////////////////////////////////////////////////KjoD/LwAA/ykI\n        AP8xCgD/PgwA/y4JAP8sCQD/LQkA/y4JAP8wCQD/KwcA/z0BAP/drKL//f////X09P/19vb/9fb2//X1\n        9f/3+/3/9tvV/3IeDf9JCwD/OAsA/z0MAP9NDwD/PAwA/zYLAP8yCgD/NAoA/zIKAP8gAAD/kVhK///3\n        9f/y9PT/8vLy//Lz9P/4/v7/+f////n////4////+P////j////3////+P////f////3////8v3///H8\n        ///w/P7/8Pv9//D7/v/w+/7/8Pr9//D6/f/y////6+Lh/3MfDP9QDQD/QA0A/0INAP9DDQD/Qg0A/0MN\n        AP87CwD/kBwA/9gpAP/UKAD/1ioA/9gqAP/YKgD/2ioA/9kqAP/dKwD/0ikA/yUHAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9DDAD/YRIA/18SAP9gEwH/YBMB/2AT\n        Af9iFAH/YRMB/2ITAf9kFAH/ZBQB/2QUAf9kFAH/ZxUB/2kVAf9pFQH/XgcA/7NwYP///////f////7/\n        /////fz/+qya/8+Le/+3iX7/uop+/7mJfv+6iX7/u4l+/7qJfv+7iX7/u4l+/76Kff++in3/u4l9/7uJ\n        ff+8iX3/u4l9/7yJff+8iX3/xpGG/5FOPv8pAgD/JwgA/0UNAP9jEwD/JggA/ygIAP8pCAD/KgkA/ysJ\n        AP8gAAD/iUtA///8+v/3+Pj/9vT0//j6+v/7+vn/9fb2//X09P/9////zot9/0MAAP87DAD/PQwA/z0M\n        AP89DAD/MgoA/zQKAP8zCgD/LgkA/ykAAP+hXEz///v6//T4+P/1+Pn/8uro/8eNf/++hXf/wIZ5/8KH\n        ef/Bh3j/wYd4/8KHeP/Bhnj/w4d4/8SGd//ekYD/65WB/+qXg//rm4j/65mG/+mUgf/ploP/55F9/+qT\n        f//Xg2//SRMG/0cMAP9ADQD/QQwA/0YOAP9CDQD/Qw0A/5EcAP/RJwD/0CcA/88nAP/QJwD/0SgA/9Qp\n        AP/XKgD/2yoA/90rAP/UKQD/JQcA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAA\n        AP8AAAD/AAAA/0MNAP9jEwD/XxIA/18SAP9fEgD/XxIA/18SAf9fEgH/YhQB/2MUAf9oFQH/bxcC/2QU\n        Af9mFQH/aBUB/2kVAf9eCAD/tHBf/////////Pn///f0//3l3/9vGQ7/IQAA/x8AAP8hAAD/IQAA/yEA\n        AP8iAAD/IwAA/yQAAP8lAAD/JwAA/ycAAP8jAAD/JAAA/yYAAP8lAAD/JgAA/yYAAP8rAAD/KQQA/ywJ\n        AP8qCAD/PAwA/zoLAP8pCAD/KQgA/ygIAP8pCQD/IwUA/0MMAv/wy8P//P////f29v/6////6baq/8+W\n        if/9////9vX1//f6+//+7Of/dDIo/ywCAP82CwD/NgsA/zQKAP8vCQD/MAkA/y8JAP8tCQD/IQAA/5FX\n        Sf//7ef/9ejl//js6f/pzcf/QAsK/y4AAP80AAD/NQAA/zIAAP80AAD/NQAA/zYAAP83AAD/PgAA/4cO\n        AP+LDwD/qRYA/6QWAP+fFAD/lRIA/5gTAP+BDQD/fwwA/38NAP8+DAD/OQwA/z4NAP9KDwD/OgsA/00P\n        AP+tIQD/2yoA/84nAP/MJwD/zicA/80nAP/MJwD/zycA/9cpAP/dKgD/3SsA/9QpAP8lBwD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/Qw0A/2MTAP9fEgD/XxIA/18S\n        AP9fEgD/XxIA/18SAP9hEwD/YxQB/28XAv+DHgb/YhMA/2UUAf9kFAH/aBUB/2QSAP+NKRH/t0sx/7RH\n        Lv9/KRX/ThoO/yIGAf8ZBAD/GwQA/xoEAP8aBAD/HAUA/xsFAP8cBQD/HgUA/yQGAP8jBgD/IgYA/yAG\n        AP8hBgD/IwYA/yMGAP8jBgD/IwYA/yYHAP8nCAD/LQkA/zIKAP80CgD/MgoA/zUKAP81CgD/NAoA/zIK\n        AP8mAAD/rGhY///////4+fn/+Pn5///7+f+ERTz/UA4D//jh2v/5/f7/9vb2//7////Vrab/NgIA/y8I\n        AP8yCgD/MAkA/zAJAP8uCQD/LgkA/y4JAP8rCAD/RREF/2ggDv9lHw7/ZB8O/10cDf8tCQH/KgcA/y0I\n        AP8sCAD/LAgA/y4IAP8uCQD/MgkA/y4IAP9TDwD/ihkA/4saAP+kHgD/khsA/4cYAP+PGgD/kBoA/3gW\n        AP+GGQD/eRYA/0UOAP9FDgD/UhAA/14TAf9WEQD/uCQA/9sqAP/QKAD/yycA/80nAP/PJwD/zScA/88o\n        AP/QJwD/2CkA/98qAP/eKwD/1CkA/yUHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAA\n        AP8AAAD/AAAA/wAAAP9ADAD/YRIA/14SAP9eEgD/XxIA/18SAP9fEgD/XxIA/2ETAP9jEwD/ZBMA/2ES\n        AP9mFAH/ZBQB/2QUAf9kFAH/aBUB/2cSAf9oDwD/YgoA/zUAAP8oAAD/LgAA/zAAAP8wAAD/LgAA/ywA\n        AP8uAAD/LgAA/y0AAP8xAAD/OQIA/zUAAP81AAD/NQAA/zUAAP81AAD/NQEA/zUBAP83AgD/OQEA/zIF\n        AP8vCQD/NAoA/zYKAP82CgD/NwsA/zcLAP84CwD/MQUA/24iE//+4tr/+/7///j39///////1aee/0MB\n        AP8tAAD/vHdm///////39/f/9/n5///7+f+FRTv/JAAA/zIJAP8xCQD/MQkA/zAJAP8tCQD/LQkA/y0K\n        AP8sBQD/MAAA/y8AAP8xAAD/MgAA/zoDAP87AwD/OwMA/0AEAP9ABAD/QAQA/0AEAP9CBAD/QgUA/3ES\n        AP+AFAD/mBkA/50aAP+dGgD/mBoA/5kZAP+RGQD/iRYA/6McAP+DFgD/PgwA/0ANAP86DAD/bBUA/8gm\n        AP/XKQD/0SgA/88oAP/NKAD/zSgA/84nAP/PJwD/0igA/9IoAP/UKAD/1ykA/9wrAP/VKQD/JQcA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0EMAP9fEgD/WxIA/10S\n        AP9eEgD/XxIA/18SAP9fEgD/YBIA/2ESAP9iEwD/ZBMA/2QTAP9jEwD/YxMA/2MTAf9ZCQD/rlxJ///R\n        x//1u6//8qWT//KjkP/yo5D/8qOQ//KjkP/yopD/8aKQ//GjkP/xo5H/8KKQ//GjkP/xpZP/8aOR//Cj\n        kf/wo5D/8KOQ//Cjkf/wo5L/8KOS//Ckkv/5rpz/rVxJ/ywAAP80CgD/NwoA/zgLAP83CgD/OAsA/zQK\n        AP8yAAD/yY1////////6+fn/+/3+///w7P93NCn/NAMA/zIHAP99GgX//9DE//n////49/f//P////DI\n        v/9IDQH/KAUA/y4JAP8tCQD/LgkA/ywJAP8tCQD/IQEA/347K//ypJL/6qOS/+mikf/popH/6aKR/+ii\n        kf/oopD/6KGQ/+ihkP/noZH/6KGR/+ehkf/oo5L/6q6g/+msnv/srqD/66+h/+yvof/tsKH/7K+h/+uv\n        of/rrqD/8LKk/96ilP9FFQn/OAkA/4AZAP/NJwD/0CcA/8smAP/OKAD/zygA/9AoAP/SKAD/0igA/9Io\n        AP/QJwD/zycA/9AnAP/RJwD/2SgA/9MoAP8kBwD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/Qw0A/2ASAP9YEQD/XhIA/14SAP9eEgD/XhIA/14SAP9fEgD/YRMA/2MT\n        AP9jEwD/YxMA/2MTAP9jEwD/YxMA/1gFAP+xcmP/////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///EjID/LwAA/zMJAP82CgD/NwoA/zgLAP85CwD/LAEA/3s6MP//9fH/+/39//r6+v//////yIFy/zcA\n        AP88DAD/NQsA/1MFAP/aZEv//v////j5+f/49/j//////6ZqXP8iAAD/LwkA/ywJAP8sCQD/LwkA/zEJ\n        AP8eAAD/lF1Q///////5////+f////j////4////+P////j////4////9/////f////3////9/////b/\n        ///2/v//9f3///T9///0/P7/9Pz+//T8/v/0/P7/8/z+//P8/f/2////5t/e/1gaC/+XGgD/zCYA/8gm\n        AP/NJwD/yyYA/8smAP/QKAD/0SgA/9EoAP/UKQD/0ykA/9IoAP/SKAD/0ygA/9YrA//dMgr/zSYA/yQH\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9CDQD/YhMA/1wS\n        AP9dEgD/XhIA/14SAP9eEgD/XhIA/2ATAP9iEwD/YhMA/2MTAP9jEwD/YxMA/2MTAP9jEwD/WAYA/7Bu\n        Xv///////v////7/////////////////////////////////////////////////////////////////\n        //////////////7////+/////v////3////9/v///////8KMf/8uAAD/MQkA/zcKAP84CwD/OgsA/zQJ\n        AP9AAAD/3K6m///////6+fn//P////nb1P9hGgr/MgYA/z0MAP83CwD/UQ8A/50WAP/1taf//P////j3\n        9//6/v//+t/Y/2MdEP8jAwD/LAkA/y4JAP8xCQD/LAkA/xgAAP+RWEr///z7//b4+v/29/f/9ff3//X3\n        9//19vf/9fb2//X29//19vb/9fb2//X29v/09fb/9PX1//T19f/09fX/8/T0//P09P/z9PT/8vP0//Lz\n        8//y8vP/8vPy//T4+P/q2dX/rioK/8UjAP/FJQD/xSUA/8gmAP/KJgD/yiYA/84nAP/QKAD/0SgA/9Up\n        AP/VKQD/0SgA/9YpAP/XKgD/1CoB/9csA//PKAD/JAcA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAA\n        APAAAAD/AAAA/wAAAP8AAAD/AAAA/0MNAP9gEgD/XRIA/1wSAP9eEgD/XhIA/14SAP9eEgD/XhIA/2ET\n        AP9iEwD/YhMA/2ITAP9iEwD/YxMA/2MTAP9YBQD/sXNj////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////zI6A/zIAAP81CgD/OgsA/zoLAP86CwD/LwAA/51SQv////7//P3+//z8/f//////rGBP/zMA\n        AP88DAD/PQwA/zYKAP9RDwD/ihMA/5Y7K//68Oz/+/7+//n4+P//////xIh6/ycAAP8tCQD/LwkA/zEK\n        AP8pCAD/GQAA/5VcTv/////////+///+/P///vz///78///9/P///fz///38///9/P///Pv///z7//78\n        /P/8/f3//P39//v8/f/5/P3/+fz9//n8/P/4/Pz/+Pv8//j7+//5+vr/9/7///Ho5v/DMQ3/vSEA/8Yl\n        AP/GJQD/xCUA/8YkAP/KJgD/yiYA/88nAP/QKAD/0ykA/9YpAP/TKQD/1ikA/9YpAP/RKAD/0igA/84o\n        AP8lBwD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/QQ0A/2AS\n        AP9dEgD/XRIA/14SAP9eEgD/XhIA/18SAP9eEgD/XxMA/2ITAP9iEwD/YhMA/2ITAP9iEwD/YhMA/1wN\n        AP+QPCj/r3Fj/5ljVv+UYVX/kmBU/49gVf+PYFX/j2FV/49hVf+QYVX/kWFW/5NiVv+UYlb/lmNX/51l\n        Wf+YZFf/nWVY/55lV/+cZVj/nWRX/51kV/+dZFf/mWJW/59qXf9+PC3/MQQA/zUKAP86CwD/OgsA/zQH\n        AP9QEQP/9M/G///////9/Pz///////HEuv9PCQD/PAoA/0INAP9BDQD/OQsA/00PAP+HGgD/RQEA/8CB\n        c///////+vr6//v8/f//8u3/dDQq/ywBAP84CwD/LQkA/yYIAP8fBAD/XCUX/5lkWP+RYVX/kWFV/5Jh\n        Vf+SYVX/kWBV/5NhVf+XYlb/mGJW/5ZhVf+YYVX/sGlY/8RxXf/CcFz/xnBc/9N1Xv/UdV7/znNe/9J1\n        X//TdV7/z3Nd/8dwW//aeGH/4nZc/8ApBf/CJAD/xCUA/8QlAP/IKQT/zjEN/8MkAP/GJQD/yiYA/8wm\n        AP/QJwD/0SgA/9EoAP/QKAD/0CgA/9IoAP/WKQD/zygA/yUHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9CDQD/YRMA/10SAP9dEgD/XRIA/10SAP9eEgD/XxIA/2ES\n        AP9nFAD/YRMA/2ITAP9iEwD/YhMA/2ITAP9iEwD/ZBQA/1sKAP8nAAD/FgAA/wkAAP8FAAD/DAAA/xAA\n        AP8PAAD/DwAA/xAAAP8PAAD/FQAA/xcAAP8cAAD/KAAA/yAAAP8pAAD/JwAA/yUAAP8kAAD/KwAA/ywA\n        AP8mAAD/MgAA/zgFAf8zCwH/NwsB/zoLAP83CgD/MwAA/7Z3aP///////fz8//7//////vv/j0Y7/zMA\n        AP8/DAD/Qg0A/0ENAP87CwD/SA4A/40bAP9PCwD/VhgL//jg2v/9////+vn5///////bqqD/QQAA/zIJ\n        AP8pCAD/KAgA/yoJAP8cBAD/DQAA/w8AAP8LAAD/DAAA/xkAAP8aAAD/IQAA/ygAAP8pAAD/KQAA/ywA\n        AP9pCgD/fA0A/3sNAP+MEAD/mhIA/5sTAP+ZEgD/khEA/5sTAP+QEQD/nBMA/8QbAP++GgD/wCUA/8Al\n        AP+/JQD/wyUA/8gnAf/JKQT/xCUA/8UlAP/IJQD/yiYA/8wnAP/NJwD/zCYA/84nAP/OJwD/0CgA/9Qp\n        AP/NJwD/JQcA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0EN\n        AP9hEwD/XRIA/10SAP9dEgD/WxIA/10SAP9eEgD/ZRQA/3QWAP9dEgD/YhMA/2ITAP9iEwD/YhMA/2IT\n        AP9cDQD/jjom/6Z9c/+aeXH/lHlx/49xav8uCwf/FgAA/xsCAP8eAgD/GQIA/xkCAP8eAwD/IQMA/yQE\n        AP8tBQD/KAQA/zIHAP8/CQD/MQYA/ywFAP8uBgD/MAYA/zYHAP86CAD/OQoB/zMLAf82CwH/OwwB/y8F\n        AP9nHA///uji///////9/f3//////9WjmP8/AAD/OgsA/z4MAP87CwD/PwwA/zwLAP9BDAD/kRwA/2QT\n        AP8rAAD/rWhY///////6+/z/+vv8///+/P+VT0H/IgAA/ywJAP8sCQD/JQQA/2EtIf+beHD/lHdw/5V5\n        cv+MZ1//LQkE/yUCAP8sBQD/MQYA/zMGAP8xBgD/LgUA/14PAP+LFwD/hhYA/4sXAP+PFwD/kBgA/5ka\n        AP+BFQD/iRYA/4EVAP+qHAD/wCAA/7kfAP+9JAD/vyUA/74lAP/CJgD/xiYA/8gmAP/JJgD/ySYA/8sm\n        AP/LJgD/yyYA/8smAP/PJwD/0SgA/9IoAP/SKAD/0SgA/8smAP8lBwD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/QQ0A/2ETAP9dEgD/XRIA/10SAP9dEgD/XRIA/14S\n        AP9eEgD/WxIA/10SAP9fEwD/YhMA/2ITAP9iEwD/YhMA/1cHAP+xYU7///////////////////Tx/3sw\n        Hv8sEQr/NhYO/zsXDv86Fw7/NhYO/zsXDv8+GA7/QBgO/1UcD/9OGw//UxsO/1EbD/9THA//UxwP/0ob\n        D/9JGw//SRsQ/0scEf9DEwj/MQkA/zYLAf84CwD/NgAA/8+Wiv////////7/////////6+X/cCkd/y0C\n        AP89DAD/PgwA/zoLAP9CDQD/PAwA/0AMAP+SHAD/YxMA/zYIAP9mEAH/9si///7////7+vr///////HO\n        x/9EDQP/JwUA/ywJAP8eAAD/ll9Q//////////////////bn4/9bJhn/RxYK/1UcDv9aHQ7/Wh0O/18d\n        Dv9gHg7/ZR8O/7QvEP/INBH/wjEP/8g0Ef/INRP/yTQR/8EyEP/FMxL/xDcW/9E8Gf/aRSP/2EIf/8An\n        Av+8JAD/vSQA/78lAP/EJgD/xiYA/8gnAP/KJwD/xyYA/8gmAP/LJgD/yyYA/8smAP/PJwD/0ygA/9Eo\n        AP/TKAD/zScA/yUHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAA\n        AP9DDQD/YRMA/10SAP9dEgD/XRIA/10SAP9dEgD/XRIA/14SAP9eEgD/XRIA/18TAP9hEwD/YRMA/2IT\n        AP9iEwD/VggA/6hXQ////Pr/+vz8//r7+//7+vn/+O3r//Dq6f/x6un/8uvp//Pr6v/y6+r/8uvq//Ps\n        6v/z7Or/9+3r//bt6//27ev/9u3r//ft6//47uz/9u3s//Xt7P/27uz///39/7+Ed/80AAD/MwsB/yoA\n        AP+APjT///36/////////////////76Acv8yAAD/OwwB/z4MAP9KDgD/PgwA/0ENAP87CwD/PgwA/40b\n        AP9hEgD/MgoA/zMBAP+NSTz///z6//z+/v/8/Pz//////6hpWv8fAAD/KAgA/xkAAP+QWEv////9//r8\n        /P/6+vr/+vj4//Tq6P/y6ef/8+no//Pq5//z6uj/9Onm//To5v/z6Ob/++rn///r6P/+6+f//uvn//3r\n        5//96ub//erm//3q5v/96+j/++zp//ry8f/22tT/wi8M/7whAP++JAD/vyUA/8ElAP/BJQD/wiUA/8Qm\n        AP/IJgD/yicA/8snAP/LJwD/yyYA/84nAP/SKAD/0igA/9QoAP/KJgD/IwcA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0INAP9gEwD/XBIA/1wSAP9dEgD/XRIA/10S\n        AP9dEgD/XRIA/10SAP9dEgD/XxMA/2ETAP9hEwD/YRMA/2ITAP9RBwD/nFRD///7+P/6+/v/+vn5//r6\n        +v/8/v///v////7////+////////////////////////////////////////////////////////////\n        ////////////////////////woyA/zUAAP80CQD/PQQA/924sf////////7+///////20sr/URUI/zEH\n        AP86DAH/OwwB/zwMAf8/DAH/OwsA/zkLAP9CDAD/iRoA/2ASAP8wCQD/NAkA/zgAAP/RoZb///////z7\n        +//+/////+Pc/2IcDv8dAgD/GAAA/5BYS/////3/+vz8//r6+v/6+vv//P7///3+///8/v7//P3+//z9\n        /v/7/f7/+/39//v9/f/4/P3/+Pz9//j8/f/4/Pz/+Pv8//j7/P/3+/z/9/v7//f6+//3+fr/9/7///Lk\n        4f++Lgz/uyEA/8AlAP/AJQD/wCUA/8AlAP+/JQD/viUA/8IlAP/IJgD/yScA/8snAP/MJwD/zigA/9Eo\n        AP/SKAD/0ygA/8kmAP8jBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAA\n        AP8AAAD/Qg0A/2ATAP9cEgD/WhIA/1sSAP9cEgD/XRIA/10SAP9dEgD/XRIA/10SAP9dEgD/XxMA/2ET\n        AP9hEwD/YxMA/0gFAP+WVEX///////3////9/v7//f////7////+/////v////7////+/////v//////\n        ///////////////////////////////////////////////////////////////////UkID/OgAA/yoA\n        AP+jXU7//////////////////////6BXSP8qAAD/OgwB/zsMAf87DAH/Pw0B/z0MAf85DAH/Qg0B/0MN\n        Af95FwD/ZhMA/zYKAP86CwD/MQMA/3UvI///7uj/////////////////xpWJ/yUAAP8TAAD/k1tN////\n        //////////////7////+/////v////7////+/////f////3////9/////P////z+///8/v7/+/7+//r9\n        /v/6/f7/+v3+//r9/f/5/P3/+Pz9//j7/P/5////9Obj/7wuDf+5IAD/vSQA/78lAP/AJQD/wCUA/8Al\n        AP/AJQD/xCYA/8MmAP/EJgD/xyYA/8cnAP/IJgD/yycA/80nAP/SKAD/yicA/yMHAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9CDQD/XxMA/1wSAP9ZEQD/WREA/1wS\n        AP9cEgD/XBIA/1wSAP9dEgD/XRIA/10SAP9dEgD/XxMA/2ETAP9kFAD/PAQA/4tJO//44Nv/69/d/+ve\n        2//s3tv/7N7b/+zf2//s39v/7d/c/+3f3P/t39z/7d/c/+3h3v/t4d7/7uLf/+/h3v/w4t//8OPg//Hj\n        3//x49//8OLf//Di3//x4+D/9vHw/9KFc/85AAD/Sw4A/+i5rv/17ev/8uTg//ft6v/XqqD/QwYA/zQJ\n        AP83CwH/NQsB/zgLAf83CwH/OgwB/zYLAf8/DQH/QQ0B/3sYAf9mFAH/NQoB/z0MAP85CwD/NQAA/7h2\n        Z//67ev/8eTh//Hm4//64dv/aTIl/wsAAP+LUUP//efh/+/j4P/v4d7/7uHe/+7h3v/u4d7/7uHe/+7h\n        3v/u4d7/7uHe/+7h3v/u4d7/7uHd/+7g3f/v4t//9OXh//Pk4f/y49//8uPf//Tk4P/05eH/9OXi//Xp\n        5v/w08z/vC0M/7kgAP+9JAD/vSQA/70kAP+/JQD/wCUA/8ElAP/DJgD/xCYA/8QmAP/DJgD/wiYA/8gm\n        AP/OJwD/0SgA/9MoAP/MJwD/JAcA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAA\n        AP8AAAD/AAAA/0ANAP9cEgD/WhIA/1kRAP9aEgD/XBIA/1wSAP9cEgD/XBIA/1wSAP9cEgD/XBIA/10S\n        AP9eEwD/YRMA/2ETAP86CwD/MAwC/zASC/8sEQv/LBEK/ysRC/8sEQv/LxIL/ywRC/8sEQv/LBEL/ywR\n        C/8sEQv/MBIL/zASC/87FQv/OxQL/zwUC/9EFgv/RhYL/0kXC/9FFgv/QxUL/z8UC/9BFQz/OA8G/yoH\n        AP83DAL/PBkQ/0EVC/9DFgv/RBcM/zsLBv8sBgD/MwoA/zQKAf85CwH/OQsB/zoMAf85CwH/OAsB/z8N\n        Af89DQH/bRUB/2wWAf9iFAH/RA4B/0INAf85CgD/QQwC/0cXC/9EFwz/PBQL/zgXDv8vEAj/IQUA/y4L\n        A/82Ewv/NRML/zUTC/81Ewv/NRML/zoUC/86FAv/PxUL/0YXC/9CFgv/RRYL/0UXC/9GFwv/QxYL/0sY\n        DP+VJwz/qCsM/6YqDP+nKgz/riwM/78vDf+6Lg3/uy4N/70tDP+5JAH/uyMA/70kAP+9JAD/vSQA/70k\n        AP+/JQD/wyYA/8QmAP/FJgD/xCYA/8QmAP/FJgD/yiYA/80nAP/QKAD/1ykA/9AoAP8kBwD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/PgwA/1sSAP9WEQD/WRIA/1sS\n        AP9cEgD/XBIA/1wSAP9cEgD/XBIA/1wSAP9cEgD/XBIA/14TAP9hEwD/WxIA/zAKAP8oCAD/HAMA/xsC\n        AP8cAgD/GQIA/xsCAP8qBQD/HAIA/xoCAP8aAgD/GwIA/xsCAP8fAwD/HwMA/yoFAP8tBQD/KwUA/y0F\n        AP8tBQD/MQYA/zMGAP8xBgD/LQUA/zEGAP8wCAD/KAgA/ycIAP8nBQD/LQUA/ysFAP8uBQD/MQgA/zQK\n        AP83CgD/MwkA/zYKAP85CwD/OgsB/zsMAf81CwH/OwwB/zkMAf9lFAH/axUB/0QOAf8+DQH/PQwB/zwM\n        Af86CgH/NwgA/zoIAP8tBgD/IwQA/yIGAP8kBwD/JAYA/yQEAP8kBAD/JAQA/yQEAP8kBAD/JwUA/ywF\n        AP8qBQD/MQYA/zMGAP82BwD/NQcA/zYHAP81BwD/LwYA/10PAP+cGwD/oxwA/6cdAP+2HwD/uCAA/7Mf\n        AP+1HwD/tiAA/7gjAP+8JAD/vCQA/7sjAP++JAD/viQA/7skAP+9JAD/wiUA/8QmAP/FJgD/yCYA/8km\n        AP/NJwD/zScA/8wnAP/XKQD/0igA/yUHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8/DAD/XBIA/1YSAf9bFQT/WxIA/1sSAP9bEgD/WxIA/1wSAP9cEgD/XBIA/1wS\n        AP9cEgD/XBIA/2ATAP9QEAD/LAkA/ycIAP8eBgD/HAYA/x4GAP8fBgD/HwYA/x4GAP8fBgD/HwYA/x8G\n        AP8fBgD/HwYA/yMHAP8jBwD/LAkA/zAJAP8pCAD/JQcA/yQHAP8lBwD/KAgA/ysIAP8oCAD/JwgA/yoJ\n        AP8sCQD/KwgA/ykIAP8tCQD/KwkA/ysJAP8vCQD/MAkA/zQJAP8xCQD/LgkA/zEJAP8vCQD/NAoA/y4J\n        AP8wCQH/LQoB/2ATAf9wFgH/OAsB/0ANAf86DAH/OQwB/zgMAf86DAH/Qw4B/zMKAf8oCQH/IwgB/yIH\n        AP8jBwD/KAgA/ygIAP8oCAD/KQgA/ygIAP8oCAD/LwkA/y0JAP8vCQD/NgoA/zgLAP84CgD/OgsA/zsL\n        AP83CwD/NwoA/4AYAP+hHwD/qiEA/7gjAP+0IgD/sSIA/7MiAP+2IwD/uiQA/7okAP+5IwD/uiMA/7sj\n        AP++JAD/vCMA/7wjAP+/JQD/wiUA/8YmAP/IJgD/yiYA/84oAf/PKwT/zScA/9MoAP/LJwD/JAcA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/z4MAP9bEgD/WBQD/2Ab\n        C/9bEQD/WxIA/1sSAP9bEgD/WxIA/1sSAP9bEgD/XBIA/1wSAP9cEgD/XhIA/04PAP8sCQD/JQcA/x0G\n        AP8aBQD/GgUA/xsFAP8cBQD/HwYA/x4GAP8eBgD/HwYA/x8GAP8fBgD/IwcA/yMHAP8qCAD/LQkA/ykI\n        AP8jBwD/IwcA/yQHAP8kBwD/JAcA/yUHAP8jBwD/IwcA/yoIAP8sCQD/KQgA/ygIAP8qCAD/JwcA/y0J\n        AP8sCQD/KwgA/ywJAP8uCQD/KwkA/y8JAP8wCQD/LQkA/y8JAP8rCAD/YxMA/20VAf8xCgH/OQsB/zUL\n        Af85DAH/OgwB/z4NAf9ADQH/MgsB/ygJAf8kCAH/JAgB/yUIAf8oCAH/KAgA/ygIAP8nCAD/KAgA/ycI\n        AP8tCQD/LgkA/y4JAP81CQD/NwoA/zkLAP82CgD/OgsA/zcKAP8yCQD/SQ4A/5EbAP+7JAD/vCQA/7Ei\n        AP+yIgD/siIA/7UiAP+5JAD/uiQA/7okAP+6JAD/uyQA/74kAP+/JAD/wCQA/8IlAP/FJgD/xyYA/8Ym\n        AP/IJgD/0SoE/9IxDP/PJgD/0SgA/8gmAP8jBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/PgwA/1oRAP9aFwb/ZycW/1oQAP9bEgD/WxIA/1sSAP9bEgD/WxIA/1sS\n        AP9bEgD/WxIA/1sSAP9dEgD/UhAA/ywJAP8gBwD/HQYA/xkFAP8ZBQD/GgUA/xsFAP8aBQD/GgUA/xwG\n        AP8fBgD/HQYA/x4GAP8gBwD/IQcA/ycIAP8rCQD/KQgA/yIHAP8gBwD/IgcA/yMHAP8iBwD/IwcA/yIH\n        AP8iBwD/JQgA/ygIAP8nCAD/IgcA/ycIAP8pCAD/JgcA/ycIAP8oCAD/KQgA/ysIAP8qCAD/KwgA/yoJ\n        AP8pCQD/LgkA/ywIAP9dEgD/UA8A/yUHAP8pCAD/KwkB/ywKAf8tCgH/LwoB/zAKAf8tCgH/KQkB/yII\n        Af8jCAH/JAgB/yUIAf8nCAH/KgkB/y4JAf8nCAD/JwgA/yoIAP8wCQD/LgkA/zUKAP81CgD/NgoA/zYK\n        AP86CwD/OAoA/zcKAP81CgD/dRcA/6wgAP+yIQD/siIA/7IiAP+yIgD/tyMA/7kkAP+7JAD/uyQA/7sk\n        AP++JQD/vyUA/8EmAP/DJgD/wiUA/8UlAP/GJgD/xyYA/8olAP/MLQj/0TsY/88lAP/UKAD/ySYA/yMG\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8+DAD/WREA/1oX\n        Bv91Nyr/XBIB/1kRAP9YEgD/WxIA/1sSAP9bEgD/WxIA/1sSAP9bEgD/WxIA/1wSAP9WEQD/JwgA/x0G\n        AP8bBQD/GQUA/xkFAP8ZBQD/GQUA/xkFAP8aBQD/GwUA/xsFAP8bBQD/GwUA/x8GAP8fBgD/JQgA/ywJ\n        AP8nCAD/HwYA/x8GAP8fBgD/IAYA/x8GAP8hBgD/IgcA/ycIAP8gBgD/IAYA/yEHAP8fBgD/IAYA/yEH\n        AP8hBwD/IAYA/yEHAP8hBwD/IgcA/yQHAP8kBwD/JAcA/yYIAP8mBwD/IwcA/0AMAP8tCQD/IwcA/yQH\n        AP8lBwD/JQcA/yYIAP8nCAH/JggB/ysJAf8pCQH/IwgB/yMIAf8kCAH/JAgB/yQIAf8oCQH/Qg4B/ykJ\n        Af8mCAH/KAkB/y4JAP8tCQD/LwkA/zEJAP8xCQD/NAoA/zkKAP88CwD/NgoA/zcKAP9qFQD/siIA/68h\n        AP+vIQD/sSEA/7MiAP+2IwD/uCMA/7kkAP+7JAD/uyQA/7skAP+8JAD/vyUA/8MmAP/DJgD/xCYA/8Qm\n        AP/IJgD/yiMA/806Gf/RQSD/yiMA/8wnAP/CJQD/IgYA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAA\n        APAAAAD/AAAA/wAAAP8AAAD/AAAA/z0LAP9YEAD/WRUF/4BJPf9jHg//WQ8A/1oRAP9ZEgD/WxIA/1sS\n        AP9bEgD/WxIA/1sSAP9bEgD/XBIA/1kRAP8oCAD/HAYA/xkFAP8ZBQD/GQUA/xkFAP8ZBQD/GQUA/xkF\n        AP8aBQD/GwUA/xsFAP8bBQD/HQYA/x4GAP8iBwD/LQkA/ycIAP8eBgD/HwYA/x8GAP8fBgD/HwYA/yAG\n        AP8iBwD/KAgA/yIHAP8qCAD/JAgA/yEGAP8gBgD/IgcA/yEGAP8fBgD/IQYA/x8GAP8hBgD/IQcA/yIH\n        AP8gBgD/JAcA/yMGAP8iBgD/KwgA/yMHAP8iBwD/JAcA/yMHAP8jBwD/IwcA/yMHAP8mCAD/KggA/ykJ\n        Af8jCAH/JAgB/yQIAf8kCAH/JAgB/yUIAf8mCQH/JwkB/ygJAf8pCQH/KwoB/y8KAf8rCQH/LwkA/zEJ\n        AP81CgD/NQoA/zgKAP83CgD/MAkA/3IWAP+2IgD/sCEA/68hAP+uIQD/sCEA/7EhAP+2IwD/uCMA/7ok\n        AP+8JAD/uyQA/74kAP/CJQD/wyYA/8MmAP/DJgD/xSYA/8gnAP/JJQD/0lAy/9FFJP/GIgD/yicA/8Ul\n        AP8iBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/PQwA/1gQ\n        AP9YFAT/g1BF/3c8Lv9WDgD/WBEA/1kRAP9YEgD/WxIA/1sSAP9bEgD/WxIA/1sSAP9cEgD/WhIA/ywJ\n        AP8cBQD/GgUA/xkFAP8ZBQD/GQUA/xkFAP8ZBQD/GQUA/xoFAP8bBQD/GgUA/xoFAP8cBQD/HgYA/yEH\n        AP8qCQD/JQcA/x4GAP8fBgD/HwYA/x8GAP8fBgD/HgYA/yMHAP8oCAD/IQYA/ycIAP8hBwD/IAYA/x8G\n        AP8fBgD/HwYA/yEGAP8gBgD/HwYA/yEHAP8hBwD/IgcA/x8GAP8pCAD/LAkA/yQHAP8pCQD/JAcA/yIH\n        AP8jBwD/IwcA/yMHAP8jBwD/IwcA/yQHAP8rCAD/JwgA/yEHAP8fBgD/JAgB/yQIAf8kCAH/IwgB/yYI\n        Af8nCQH/KQkB/ygJAf8pCQH/LwoB/ysKAf8wCgH/MQoB/zUKAf81CgD/NgoA/zUKAP9MDwD/nR4A/7Ei\n        AP+wIQD/sCEA/68hAP+yIgD/syIA/7MiAP+1IgD/uCMA/7skAP+8JAD/viUA/8AlAP/BJQD/wSUA/8Al\n        AP/AJQD/wyMA/8o1Ev/YZ0v/zkUk/8cjAP/JJwD/wiUA/yIGAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP89DAD/WA8A/1gUBP+DUUb/ilhN/2UjFP9VDQD/WhEA/1oR\n        AP9aEQD/WhEA/1sSAP9bEgD/WxIA/1sSAP9eEwD/NwsA/xkFAP8aBQD/FwUA/xgFAP8ZBQD/GQUA/xgE\n        AP8XBAD/GgUA/xoFAP8ZBQD/GAUA/xsGAP8eBgD/IQcA/yoJAP8iBwD/GwUA/xsFAP8dBgD/HAYA/xwF\n        AP8eBgD/HwYA/x8GAP8fBgD/HwYA/x8GAP8eBgD/HwYA/x8GAP8fBgD/HwYA/x8GAP8fBgD/IAcA/yAH\n        AP8gBgD/IAYA/ykIAP8pCAD/KggA/ysJAP8gBgD/IAYA/yEHAP8gBgD/HwYA/yIHAP8fBgD/KwgA/zEJ\n        AP8lCAD/IQcA/x8GAP8iBwD/JAcA/yUHAP8kBwH/IwgB/yQIAf8lCAH/JwkB/yYJAf8rCQH/LQoB/y4K\n        Af8wCgH/NAsB/zYLAf80CgH/NAoB/30YAP+xIgD/qiEA/60hAP+wIQD/syIA/7QiAP+0IgD/tCIA/7Mi\n        AP+zIgD/uCMA/7gjAP+/JQD/wCUA/8ElAP+/JQD/vyUA/8EkAP/CJgL/0Fc6/9ZsU//NRiX/xyMA/8oo\n        AP/CJgD/IgYA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/zwL\n        AP9WDwD/WBUF/4ZVSv+NXlP/hlBE/10XCP9YDgD/WREA/1oRAP9aEQD/WhEA/1oRAP9aEQD/WhIA/14T\n        AP9NDwD/HAYA/xkFAP8XBAD/GQUA/xkFAP8ZBQD/FwUA/xYEAP8YBQD/GAUA/xgFAP8WBAD/GgUA/x4G\n        AP8gBwD/KgkA/yIHAP8dBgD/HQYA/xsFAP8cBQD/GwUA/xwFAP8cBgD/HQYA/xwGAP8eBgD/HQUA/xwF\n        AP8fBgD/HwYA/x8GAP8fBgD/HwYA/x8GAP8gBwD/IAcA/x8GAP8fBgD/HwYA/x4GAP8lBwD/IwcA/x8G\n        AP8fBgD/IAYA/yAHAP8hBwD/IwcA/x8GAP8+DAD/OQsA/yIHAP8gBgD/HwYA/yEHAP8jBwD/JAcA/yIH\n        AP8iBwD/IwcA/yQHAf8kCAH/JAgB/ykJAf8vCgH/LQoB/zEKAf8yCgH/NgsB/zMLAf85CwH/ihsB/60h\n        Af+pIAD/rCEA/64hAP+zIgD/tSIA/7QiAP+0IgD/tCIA/7QiAP+0IgD/tyMA/70kAP++JAD/wCUA/8El\n        AP/BJAD/vyIA/8pIKv/Ua1P/1W1V/8pGKP+/IQD/xicA/8AlAP8iBgD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/OgsA/1QPAP9XFQX/iVlP/41fVf+SY1j/fkg7/1YP\n        Av9WDgD/VhAA/1oRAP9aEQD/WhEA/1oRAP9aEQD/WhEA/1wRAP8vCQD/GAQA/xgFAP8ZBQD/GQUA/xkF\n        AP8YBQD/FQQA/xgFAP8YBQD/FwQA/xYEAP8ZBQD/HQYA/x8GAP8nCAD/KwkA/ycIAP8tCQD/KwkA/ykJ\n        AP8nCAD/JQgA/yMHAP8kBwD/IwcA/yIHAP8hBwD/HwYA/yEGAP8fBgD/HwYA/x0GAP8dBgD/HgYA/x4G\n        AP8dBgD/HgYA/x4GAP8dBgD/HwYA/yEHAP8eBgD/HwYA/x8GAP8fBgD/IQcA/yMHAP8iBwD/IwcA/1cR\n        AP8/DAD/IAYA/yAGAP8fBgD/IgcA/yMHAP8lBwD/IwcA/yIHAP8jBwD/IwcA/yMHAP8iBwD/KQkB/zAK\n        Af8uCgH/LwoB/y8KAf83CwH/NgsB/zYLAf+SHAH/sSUE/7srCv+sIQD/ryIB/7EhAf+yIQD/tSIA/7Ui\n        AP+1IgD/tCIA/7YjAP+5IwD/uSMA/7kjAP+5IwD/uyMA/74fAP/IQSH/1W9W/9VtVf/WcVr/ykkq/74g\n        AP/EJgD/vyUA/yEGAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAA\n        AP86CwD/Ug4A/1UUBf+LXlT/kGRb/5FjWf+UZlz/ekQ4/1gRA/9SDAD/VxAA/1oRAP9aEQD/WhEA/1oR\n        AP9aEQD/XRIA/00PAP8bBgD/GAUA/xYEAP8YBQD/FwUA/xYEAP8VBAD/FwUA/xkFAP8YBQD/FgQA/xgF\n        AP8cBgD/HgYA/ycIAP8oCAD/JAgA/ykIAP8oCAD/JwgA/ykJAP8pCQD/KQgA/yoIAP8pCQD/KwkA/ywJ\n        AP8qCAD/KggA/ysJAP8rCQD/KwgA/yoIAP8rCAD/KQgA/ygIAP8nCAD/JQgA/yIHAP8jBwD/IQYA/yAG\n        AP8gBgD/IAYA/x8GAP8eBgD/HgYA/xsFAP8vCQD/bBUA/0AMAP8fBgD/IQYA/x8GAP8iBwD/IwcA/yIH\n        AP8hBwD/IgcA/yMHAP8jBwD/IQcA/yIHAP8mCAD/LwkA/ywJAP8uCQH/MAoB/zcLAf80CwH/TxAB/6Af\n        Af+nIQL/riQE/6wiAf+tIgH/sCIB/7IiAf+yIgH/siIB/7UiAP+1IgD/tSIA/7kjAP+5IwD/uSMA/7gh\n        AP+4HgD/xT4e/9VvVv/Xclv/13BZ/9h1X//LSy3/wiEA/8YnAP+9JQD/IQYA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/zoLAP9SDgD/VBQG/41hV/+TaV//kmdd/5Rn\n        Xf+ZbGL/iFRI/2MhEf9WDAD/VQ0A/1kQAP9aEQD/WhEA/1oRAP9aEQD/XxIA/zYLAP8VBAD/FgQA/xUE\n        AP8XBAD/FQQA/xcEAP8XBQD/GAUA/xkFAP8WBAD/FgUA/xwGAP8cBgD/JggA/ycIAP8nCAD/JAgA/yMH\n        AP8jBwD/JQgA/yUIAP8mCAD/JAcA/yEHAP8jBwD/JAcA/yYIAP8mCAD/JQgA/ycIAP8oCAD/KQgA/ygI\n        AP8pCAD/KQgA/y4JAP8uCQD/MAkA/zAJAP8sCQD/LQkA/y8JAP8sCQD/LAkA/y0JAP8pCAD/JgcA/0gO\n        AP95FwD/QAwA/x8GAP8fBgD/HwYA/yAGAP8gBgD/IAYA/x8GAP8fBgD/IwcA/yMHAP8hBwD/IQYA/yUH\n        AP8tCQD/KwkA/ywJAP8yCgD/NQoA/zYKAf+PHAH/qSEB/6UgAf+nIQH/qyIB/60iAf+tIgH/riIB/7Ei\n        Af+wIgH/siIB/7QiAf+2IgD/tSEA/7QgAP+zHQD/tSYF/8VOM//VdV//1XZf/9V0Xf/WdF3/13pk/8tN\n        L/+/HwD/xiYA/70kAP8hBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAA\n        AP8AAAD/OgsA/1IOAP9UFQb/kGVc/5ZtZP+Va2L/lmti/5drYv+bcGb/lmle/4BJPP9kIxT/WREA/1cO\n        AP9VCgD/VQoA/1YLAP9aDAD/UgsA/x0BAP8RAAD/EQAA/xEAAP8QAAD/EAAA/xAAAP8QAAD/EQAA/xAA\n        AP8SAAD/FgAA/xQAAP8gAgD/IgIA/yACAP8dAQD/GwEA/xoBAP8aAQD/GgEA/x0BAP8eAgD/HwIA/yMC\n        AP8hAgD/IAIA/yQCAP8dAQD/IwIA/yMDAP8hAgD/IgMA/yQDAP8iAgD/IwMA/yQDAP8jAgD/JgMA/yYD\n        AP8mAwD/KAMA/ycDAP8pBAD/LAQA/ygDAP8qBAD/SwoA/3sTAP86BgD/GQAA/xkAAP8ZAAD/GwEA/xsB\n        AP8dAQD/GgAA/xwAAP8dAQD/HgEA/xwBAP8bAAD/HwEA/ykDAP8nAwD/KgMA/zIEAP8sAwD/Yg4A/6gb\n        AP+jGgD/pRsA/6YcAP+mHAD/qx0A/6sdAP+rHQD/qx0A/64dAP+wHAD/sRwA/7IeAP+1IgD/uCsK/8JI\n        LP/Qa1T/1ntm/9R4Y//Ud2L/1nhi/9Z4Yv/Yfmn/zU8x/8AfAP/CJQD/uyQA/yEGAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP86CwD/Ug4A/1QVBv+TaWD/mXFo/5hv\n        Zv+Yb2b/mG9m/5lwZv+bcWj/nXRr/5lvZf+NXVL/g01A/3tBNP96PzH/dDYo/3Q2KP93Nyj/XjIo/zor\n        KP88LCj/OSso/zkrKP85Kyj/OSso/zkrKP85Kyj/OSso/zorKP8/LCj/PSwo/0YuKP9GLyj/Ri4o/0Uu\n        KP9ELij/Qy4o/0ItKP9CLSj/RS4o/0UvKP9GLyj/TC8o/1gxKP9CLSj/Qi4o/0QuKP9ELij/RC4o/0Mu\n        KP9KLyj/Si8o/0UuKP9ILyj/TC8o/0kvKP9JLyj/Sy8o/0svKP9LLyj/TC8o/0wvKP9OLyj/TS8o/0ov\n        KP9pNSj/lT0o/10yKP9BLSj/Qi0o/0EtKP9DLSj/Qy0o/0QuKP9CLSj/Qi0o/0MtKP9CLSj/Qy4o/0Qu\n        KP9HLij/UDAo/04wKP9PMCj/Ui8o/2EyKP+pQSj/r0Io/7NDKP+zQij/tEIo/7VDKP+2Qyn/uEQp/7lE\n        Kf+5RCn/vEMo/8BJLv/BTjT/w1Q7/8ljS//OdF//039r/9V9av/We2b/1ntm/9Z7Zv/Xe2b/2Htm/9mB\n        bf/KUDP/ux4A/8AlAP+8JAD/IQYA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAA\n        AP8AAAD/AAAA/zoLAP9SDgD/VBUG/5ZtZf+cdm3/m3Rr/5t0a/+bdGv/m3Rr/510a/+cdGv/nXVs/6B3\n        bv+ieXH/o3ty/6J6cf+hd2//oXdv/6J3b/+jeG//hHJv/3lwb/97cG//e3Bv/3twb/96cG//enBv/3pw\n        b/96cG//e3Bv/31wb/99cW//hXNv/4x0b/+Bcm//g3Jv/4Fyb/+Bcm//gXJv/4Fyb/+Bcm//f3Jv/4Jy\n        b/+Fcm//k3Vv/4Rzb/9/cm//gHJv/39yb/99cW//fXFv/3xxb/9+cm//fHFv/39yb/+Gc2//hHJv/4Ry\n        b/+Gc2//g3Jv/4Nyb/+Ccm//gnJv/4Ryb/+Ic2//h3Nv/5t3b/+1fG//knVv/4Byb/+AcW//fnFv/4By\n        b/+Acm//gHJv/4Bxb/+AcW//f3Fv/39xb/+Ccm//gHJv/4hzb/+Ic2//hnNv/4lzb/+Jc2//t3xv/8l/\n        b//Hf2//yYBv/8iAb//KgG//y4Bv/8yAbv/MgG7/zIBu/82Bbv/PgG7/0oNw/9OEcv/UhHL/0oJv/9J/\n        bf/Tf2v/035r/9R+a//Wf2v/1n9r/9h/a//Zf2v/24Zz/8tSNv+7HgD/wiUA/70kAP8hBgD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/OQsA/1IOAP9VFgf/mHJp/556\n        cv+deHD/nnhw/554cP+eeHD/oHlw/6B5cP+eeHD/n3hw/594cP+heHD/oXlw/6F5cP+heXD/oXlw/6N5\n        cP+ad3D/hHNw/4FzcP+Bc3D/gHJw/35ycP99cnD/fHJw/3txcP96cXD/fHJw/3lycP+RdnD/l3dw/4Bz\n        cP+GdHD/kHZw/4Z0cP+Ec3D/hXRw/4p1cP+IdHD/g3Nw/4Z0cP+Td3D/oHlw/6N5cP+ienD/onpw/6F5\n        cP+feXD/mXhw/5R3cP+OdnD/iXVw/4d0cP+FdHD/hHRw/4d1cP+EdHD/hHRw/4NzcP+Ec3D/hnRw/4h1\n        cP+GdXD/mnhw/7R8cP+SdnD/gXNw/4JzcP+Bc3D/gXNw/4FzcP+Bc3D/gXNw/4FzcP+Bc3D/gXNw/4Fz\n        cP+FdHD/iXVw/4Z0cP+GdHD/hnRw/6V6cP/KgXD/x4Bw/8iAcP/HgHD/x4Bw/8mAcP/JgHD/yoFw/8uB\n        cP/LgXD/0YJx/9mFcv/QgnD/0IJw/9GCcP/QgnD/0YJw/9SCcP/UgnD/1YNw/9WDcP/Vg3D/1oNw/9aD\n        cP/ainj/y1Q5/74eAP/HJgD/vSQA/yEGAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAA\n        AP8AAAD/AAAA/wAAAP85CwD/UQ4A/1UWB/+cdm3/pn92/6B8dP+hfHT/oXx0/6F8dP+jfXT/o310/6N9\n        dP+jfXT/o3x0/6R9dP+kfXT/pH10/6V9dP+lfXT/pX10/6Z9dP+lfXT/pH10/6V9dP+jfXT/oXx0/558\n        dP+be3T/lnp0/5R6dP+SeXT/jnl0/6N9dP+ffHT/i3h0/4p4dP+MeHT/iXh0/4h4dP+HeHT/i3h0/4t4\n        dP+FeHT/hnh0/5d7dP+wf3T/sX90/7F/dP+xf3T/sn90/7KAdP+zgHT/soB0/7OAdP+tf3T/jHh0/4l4\n        dP+KeHT/i3h0/4p4dP+JeHT/inh0/4l4dP+KeHT/i3h0/4l4dP+efHT/sYB0/5J6dP+Fd3T/hXd0/4V3\n        dP+Fd3T/hXd0/4V3dP+Fd3T/hXd0/4V3dP+Fd3T/hnd0/4x4dP+LeHT/inh0/4p4dP+VenT/woN0/8eD\n        dP/Ig3T/yYR0/8qEdP/KhHT/yoR0/8mEdP/JhHT/y4V0/8uFdP/PhXT/0oZ0/9GGdP/QhXT/0YV0/9KG\n        dP/ShnT/04Z0/9SGdP/Wh3T/14d0/9eHdP/Xh3T/14d0/9mOfP/KVjv/vh4A/8YmAf+/JQH/IgYA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/zkLAP9RDgD/UxYH/6N6\n        cv+0hnz/oYB5/6KAef+kgXn/pIF5/6SBef+mgXn/p4F5/6WBef+lgXn/p4F5/6eBef+ngXn/p4F5/6eB\n        ef+ngXn/p4F5/6iBef+qgnn/qoJ5/6qCef+qgnn/q4J5/62Def+vg3n/r4N5/6+Def+ug3n/rYJ5/6yC\n        ef+sgnn/q4J5/6uCef+pgnn/poF5/6SBef+fgHn/nn95/5x/ef+Zf3n/qIF5/7ODef+xg3n/sYN5/7GD\n        ef+xg3n/sYN5/7GDef+yg3n/tYR5/7GDef+NfHn/i315/5d+ef+Zf3n/jn15/5B9ef+NfHn/k355/5N+\n        ef+RfXn/kH15/6GAef+3hXn/nH95/4h8ef+Je3n/iHt5/4d7ef+He3n/iXx5/4l8ef+JfHn/iXx5/4h8\n        ef+NfXn/j315/419ef+MfHn/lH55/7qFef/KiHn/yIh5/8iIef/IiHn/yYh5/8qIef/KiHn/y4h5/8uI\n        ef/MiHn/y4h5/8yIef/PiXn/0Il5/9KKef/Rinn/04p5/9OKef/Tinn/04p5/9SKef/Xi3n/14t5/9iL\n        ef/Yi3n/3JOB/8tYPf+5HQD/wSYB/70lAf8iBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/OQsA/1EOAP9TFgj/oH12/6eHgP+mhX7/pYV+/6aFfv+nhX7/p4V+/6mF\n        fv+qhX7/qIZ+/6iGfv+qhX7/qoV+/6qFfv+qhX7/qoV+/6qFfv+qhX7/qoV+/6uGfv+shn7/rIZ+/6yG\n        fv+shn7/rIZ+/66Gfv+vhn7/r4Z+/6+Gfv+vhn7/r4Z+/6+Hfv+wh37/soh+/7KIfv+yiH7/s4h+/7SI\n        fv+0iH7/s4h+/7OIfv+ziH7/s4d+/7SHfv+0h37/tId+/7SHfv+0h37/tId+/7SHfv+0iH7/tId+/5+E\n        fv+ag37/mIJ+/5SCfv+Wgn7/k4F+/5GBfv+Xgn7/l4N+/5GBfv+QgX7/oIR+/8CKfv+jhH7/i39+/42A\n        fv+MgX7/jIB+/4yAfv+NgX7/jYB+/42Afv+MgH7/jYF+/5SBfv+SgX7/j4F+/5mDfv+9iX7/yIt+/8eM\n        fv/JjH7/yox+/8qMfv/KjH7/yox+/8qMfv/LjH7/zIx+/86Nfv/QjX7/zYx+/86Mfv/PjX7/0I1+/9OO\n        fv/Ujn7/1Y5+/9WOfv/Ujn7/1o5+/9SOfv/Wjn7/2Y5+/9uPfv/fl4f/zVpA/70dAP/DJgH/uiQB/yAG\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP85CwD/UQ4A/1QW\n        CP+jgnr/qouE/6mJgv+qiYL/qImC/6mJgv+rioL/rYqC/6yKgv+sioL/rYqC/66Kgv+tioL/rYqC/62K\n        gv+tioL/rYqC/62Kgv+tioL/rYqC/6+Kgv+vioL/r4qC/6+Kgv+vioL/sYuC/7KLgv+yi4L/souC/7KL\n        gv+yi4L/souC/7OLgv+0i4L/tIuC/7SLgv+0i4L/tIuC/7SLgv+0i4L/tIuC/7SLgv+1i4L/t4uC/7eL\n        gv+3i4L/t4uC/7eLgv+3i4L/t4uC/7aLgv+3i4L/uYyC/7mMgv+3jIL/toyC/7aMgv+zi4L/souC/62K\n        gv+oiYL/qomC/6iJgv+yi4L/wY6C/6iJgv+ShIL/koWC/5GFgv+QhYL/j4SC/46Egv+PhIL/kISC/5GF\n        gv+ThYL/loWC/5GFgv+gh4L/xo+C/8mQgv/Fj4L/xo+C/8mPgv/LkIL/y5CC/8uQgv/MkIL/zJCC/8yQ\n        gv/MkIL/0ZGD/9iUhP/OkIL/z5CC/8+Qgv/RkYL/1JGC/9SRgv/UkYL/1ZKC/9aSgv/VkoL/1pKC/9eS\n        gv/YkoL/2pKC/9+bi//KW0L/uh0A/8EmAf+7JAH/IQYA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAA\n        APAAAAD/AAAA/wAAAP8AAAD/AAAA/zgLAP9QDQD/VRcI/6WFfv+tj4j/q42G/62Nhv+sjYb/rI2G/66O\n        hv+vjob/r46G/6+Ohv+xjob/sY6G/7COhv+wjob/sI6G/7COhv+wjob/sI6G/7COhv+wjob/sY6G/7KO\n        hv+yjob/so6G/7KOhv+yj4b/so+G/7OPhv+0j4b/tI+G/7SPhv+0j4b/tI+G/7eQhv+3kIb/to+G/7aP\n        hv+3j4b/t4+G/7ePhv+2j4b/to+G/7ePhv+4j4b/uY+G/7mPhv+5j4b/uY+G/7mPhv+5j4b/uY+G/7mP\n        hv+6kIb/u5CG/7yQhv+8kIb/vJCG/7yQhv++kYb/vpGG/72Rhv++kYb/wJKG/7+Rhv/AkYb/wJKG/7yQ\n        hv+4kIb/tY+G/7KPhv+wjob/rI6G/6aNhv+ji4b/oYuG/5+Lhv+ciob/p42G/8SShv/UlYb/y5OG/8iT\n        hv/Jk4b/ypOG/8uThv/MlIb/zJOG/82Thv/OlIb/zZSG/82Uhv/OlIb/zpSG/9GUhv/QlIb/0ZWG/9OV\n        hv/UlYb/1ZWG/9SVhv/VlYb/15aG/9iWhv/Ylob/2paG/9qWhv/alob/3p6P/8tdQ/+4GwD/vCQA/7Yj\n        AP8hBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/OAsA/04N\n        AP9TFwj/qImD/7CTjf+vkYv/sJKL/7CSi/+wkov/sJKL/7CSi/+ykov/s5KL/7OSi/+ykov/s5KL/7OS\n        i/+zkov/spKL/7GSi/+zk4v/s5OL/7OSi/+zk4v/tJOL/7WTi/+1k4v/tZOL/7WTi/+0k4v/tpOL/7eT\n        i/+3k4v/t5OL/7eTi/+3k4v/uJSL/7iUi/+5lIv/uZSL/7mUi/+5lIv/upSL/7qUi/+6lIv/upSL/7mU\n        i/+7lIv/vJSL/7yUi/+8lIv/vJSL/7yUi/+8lIv/vJSL/7yUi/++lIv/vpSL/76Ui/++lIv/vpSL/76U\n        i/++lIv/v5SL/72Vi/+9lYv/v5WL/8CVi//Elov/xJaL/8WWi//Hlov/yJaL/8iWi//Ilov/x5aL/8WW\n        i//Glov/yJaL/8iXi//Kl4v/yJeL/8WWi//Jlov/y5eL/8yXi//Ml4v/zJeL/82Xi//Nl4v/zpeL/8+Y\n        i//QmIv/0JiL/9CYi//QmIv/0JiL/9GYi//TmYv/1JmL/9WZi//VmYv/1pmL/9aZi//Wmov/2JqL/9ia\n        i//amov/25qL/9yai//go5X/zF9G/7QaAP+7IwD/uSQB/yEHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP84CwD/TQ0A/1MXCf+rjof/s5iT/7GWkP+ylpD/s5aQ/7OW\n        kP+zlpD/s5aQ/7SXkP+1l5D/tZeQ/7WXkP+1l5D/tZeQ/7WXkP+5mJD/wpuR/7WXkP+2l5D/tpeQ/7aX\n        kP+2l5D/t5eQ/7iXkP+4l5D/t5eQ/7iYkP+6mJD/upiQ/7qYkP+6mJD/upiQ/7qYkP+6mJD/upiQ/7uY\n        kP+7mJD/u5iQ/7yYkP+8mJD/vJiQ/7yYkP+8mJD/vJiQ/7yYkP++mJD/vpiQ/76YkP++mJD/vpiQ/76Y\n        kP++mJD/vpiQ/7+ZkP/AmZD/wJmQ/8CZkP/AmZD/wJmQ/8CZkP/DmZD/wpmQ/8GZkP/CmZD/wpmQ/8SZ\n        kP/FmZD/xJmQ/8aakP/GmpD/xpqQ/8eakP/HmpD/x5qQ/8ebkP/ImpD/ypuQ/8qbkP/Jm5D/ypuQ/8qb\n        kP/Km5D/zJuQ/8ybkP/Nm5D/zpuQ/8+ckP/PnJD/z5yQ/8+ckP/RnJD/0pyQ/9KckP/RnJD/0ZyQ/9Kc\n        kP/UnZD/1Z2Q/9WdkP/XnZD/2J2Q/9idkP/YnZD/2p6Q/9qekP/anpD/256Q/+Gnmv/KYEj/sxoA/7oj\n        AP/CKAT/JAcB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/zUK\n        AP9MDQD/UxcJ/6+TjP+3nZj/tZuV/7ablf+2mpX/tpqV/7aalf+2mpX/t5uV/7mblf+5m5X/t5uV/7mb\n        lf+5m5X/uZuV/7qblf+9nJX/uZuV/7mblf+5m5X/uZuV/7qclf+6nJX/upyV/7yclf+8nJX/u5yV/7yc\n        lf+9nJX/vZyV/72clf+9nJX/vZyV/72clf+9nJX/vZyV/76clf+/nZX/vp2V/76dlf++nZX/v52V/7+d\n        lf+/nZX/v52V/8Gdlf/BnZX/wZ2V/8Gdlf/BnZX/wZ2V/8Gdlf/BnZX/wZ2V/8Gdlf/CnZX/w52V/8Od\n        lf/DnZX/wp2V/8Odlf/EnZX/xZ2V/8Wdlf/FnZX/xZ2V/8edlf/InpX/yJ6V/8ielf/HnpX/yJ6V/8me\n        lf/JnpX/yZ6V/8melf/JnpX/yp+V/8yflf/NoJX/zaCV/82flf/Nn5X/zZ+V/82flf/On5X/z6CV/9Gg\n        lf/RoJX/0aCV/9Oglf/SoJX/06CV/9Oglf/UoJX/1KCV/9Oglf/ToJX/1KGV/9ihlf/ZopX/2aGV/9qi\n        lf/bopX/26KV/92ilf/dopX/4auf/8hiS/+yGQD/uSMA/7MiAP8fBgD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/NwsA/1ANAP9VGAn/spaQ/7qinP+4n5n/uZ+Z/7qf\n        mf+6n5n/up+Z/7qfmf+5n5n/up+Z/7yfmf+7n5n/vJ+Z/7yfmf+8n5n/vJ+Z/7yfmf+8n5n/vJ+Z/7yf\n        mf+8n5n/vaCZ/72gmf+9oJn/vqCZ/76gmf++oJn/v6CZ/8Cgmf/AoJn/wKCZ/8Cgmf/AoJn/wKCZ/8Cg\n        mf/AoJn/wKCZ/8Ghmf/CoZn/wqGZ/8Khmf/CoZn/wqGZ/8Khmf/CoZn/w6GZ/8Ohmf/EoZn/xKGZ/8Sh\n        mf/EoZn/xKGZ/8Shmf/EoZn/xKGZ/8Shmf/FoZn/xqGZ/8ahmf/GoZn/xaGZ/8Whmf/GoZn/yKGZ/8ih\n        mf/IoZn/x6GZ/8ihmf/Kopn/yqKZ/8qimf/Kopn/yqKZ/8uimf/Lopn/zKKZ/8yimf/Mopn/zqOZ/86j\n        mf/Po5n/z6OZ/8+jmf/Po5n/0KOZ/8+jmf/Qo5n/0qSZ/9Okmf/TpJn/06SZ/9Kkmf/TpJn/1aSZ/9Wk\n        mf/VpJn/1qSZ/9akmf/WpZn/16WZ/9ilmf/apZn/26aZ/9ummf/cppn/3qaZ/96mmf/isKT/yGRN/68Y\n        AP+2IwD/sCEA/x4GAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAA\n        AP83CwD/Tg0A/1QYCf+0mZT/vaah/7ujnv+7o57/u6Oe/72knv+9pJ7/vaSe/72knv+9pJ7/vaSe/76k\n        nv++pJ7/vqSe/76knv++pJ7/vqSe/76knv++pJ7/vqSe/76knv+/pJ7/wKSe/8Cknv/ApJ7/wKSe/8Ck\n        nv/BpJ7/wqWe/8Klnv/CpZ7/wqWe/8Klnv/CpZ7/wqWe/8Klnv/CpZ7/w6We/8Slnv/EpZ7/xKWe/8Sl\n        nv/EpZ7/xKWe/8Slnv/EpZ7/xKWe/8Wlnv/GpZ7/xqWe/8alnv/GpZ7/xqWe/8alnv/GpZ7/xqWe/8el\n        nv/HpZ7/yKWe/8ilnv/IpZ7/yKWe/8ilnv/JpZ7/yaae/8mmnv/Kpp7/yaWe/8umnv/Mpp7/zKae/82n\n        nv/Np57/zKae/8ymnv/Np57/zqee/9Cnnv/Qp57/z6ee/8+nnv/Qp57/0Kee/9Cnnv/RqJ7/0qie/9Ko\n        nv/TqJ7/06ie/9Wonv/VqJ7/1aie/9aonv/XqJ7/16ie/9eonv/XqJ7/16ie/9ipnv/YqZ7/2Kme/9yq\n        nv/cqp7/466h/9+rn//fqp7/4Kqe/+OzqP/GYkv/rhkA/7UiAP+uIQD/HgYA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/zcLAP9PDgD/UBMF/6uOh//BrKf/vqei/76n\n        ov++p6L/v6ei/7+nov++p6L/wKei/8Cnov/Ap6L/v6ei/8Goov/CqKL/waei/8Cnov/CqKL/wqii/8Ko\n        ov/CqKL/wqii/8Ooov/DqKL/w6ii/8Ooov/DqKL/xKii/8Ooov/EqaL/xami/8Wpov/FqaL/xami/8Wp\n        ov/FqaL/xami/8Wpov/FqaL/xqmi/8epov/HqaL/x6mi/8epov/HqaL/x6mi/8epov/HqaL/x6mi/8ip\n        ov/JqaL/yami/8mpov/JqaL/yami/8mpov/JqaL/yami/8ipov/JqaL/y6mi/8upov/LqaL/y6mi/8up\n        ov/KqaL/yqmi/8qoof/VsKf/0Kyk/82qov/NqqL/zqqi/86qov/PqqL/z6qi/9Cqov/QqqL/0Kqi/9Gr\n        ov/Sq6L/0qui/9Krov/Sq6L/0qui/9Orov/Uq6L/1Kyi/9Ssov/UrKL/1Kyi/9Wsov/XrKL/2Kyi/9is\n        ov/ZrKL/2ayi/9isov/YrKL/2ayi/9msov/araL/3a2i/92tov/grqP/366i/+Cuov/grqP/4rKn/8BU\n        O/+sGgD/tCMA/64hAP8eBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAA\n        AP8AAAD/NQoA/00OAP9MDQD/nn11/8e0r//BrKf/wayn/8Gsp//BrKf/wqyn/8Ksp//CrKf/wqyn/8Ks\n        p//CrKf/w6yn/8Ssp//DrKf/w6yn/8Ssp//ErKf/xKyn/8Wsp//Fraf/xq2n/8atp//Graf/xq2n/8at\n        p//Graf/xq2n/8atp//Hraf/x62n/8itp//Iraf/yK2n/8itp//Iraf/yK2n/8itp//Iraf/ya2n/8mt\n        p//Jraf/ya2n/8mtp//Jraf/ya2n/8mtp//Jraf/yq2n/8utp//Lraf/y62n/8utp//Lraf/y62n/8ut\n        p//Lraf/y62n/8utp//Lraf/zK2n/82up//Orqf/zq6n/82up//Nrqf/za2n/9CwqP/Pr6f/z66n/9Cu\n        p//Qrqf/z66n/9Gup//Sr6f/0a+n/9Gvp//Rr6f/0q+n/9Ovp//Ur6f/1K+n/9Svp//Ur6f/1a+n/9Wv\n        p//Wr6f/1q+n/9Wvp//Vr6f/2LCn/9iwp//YsKf/2rCn/9qwp//asKf/27Cn/9uwp//asKf/2rCn/9ux\n        p//dsaf/37Gn/9+yp//gsqf/4LKn/+K0qf/gsaX/tj8j/6wcAP+yIgD/rSEA/x4GAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP80CgD/TQ8A/0YGAP+HXlX/y7q2/8Sw\n        rP/EsKz/xLCs/8SwrP/EsKz/xbCs/8axrP/Gsaz/xrGs/8axrP/Hsaz/xrGs/9C0rf/Ksqz/x7Gs/8ew\n        rP/IsKz/yLCs/8ixrP/Jsaz/ybGs/8mxrP/Jsaz/ybGs/8mxrP/Jsaz/ybGs/8mxrP/Jsaz/ybGs/8qy\n        rP/Lsqz/y7Ks/8uyrP/Lsqz/y7Ks/8uyrP/Lsqz/zLKs/8yyrP/Msqz/zLGs/8yxrP/Msaz/zLGs/8yx\n        rP/Msaz/zLGs/8yxrP/Nsaz/zrGs/86xrP/Osaz/zrGs/86xrP/Osaz/zrGs/86xrP/Osaz/zrKs/8+y\n        rP/Qsqz/0LKs/9CyrP/Qsqz/z7Ks/9CyrP/Rsqz/07Os/9OzrP/Tsqz/07Ks/9SzrP/Us6z/1LOs/9Sz\n        rP/Ts6z/07Os/9SzrP/Ws6z/17Os/9ezrP/Ws6z/1rOs/9azrP/Xs6z/2LOs/9izrP/atKz/27Ss/9q0\n        rP/atKz/2rSs/9q0rP/ctKz/3bSs/920rP/dtaz/3bWs/9+1rP/gtqz/4bas/+C2rP/gtqz/47qx/9qi\n        lP+pJgb/qh8A/64hAP+oIAD/HgYA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAA\n        AP8AAAD/AAAA/zUKAP9NDwD/SAkA/2gzJ//Hs6//ybay/8i0sP/ItLD/yLSw/8i0sP/HtLD/yLWw/8m1\n        sP/JtbD/ybWw/8q1sP/LtbD/zbaw/8y1sP/KtbD/y7Ww/8u1sP/LtbD/y7Ww/8u1sP/LtbD/y7Ww/8y1\n        sP/MtbD/zLWw/8y1sP/MtbD/zLWw/8y1sP/MtbD/zLaw/862sP/OtrD/zraw/862sP/OtrD/zraw/862\n        sP/OtrD/zraw/8+2sP/PtrD/z7aw/8+2sP/PtrD/z7aw/8+2sP/PtrD/z7aw/8+2sP/QtrD/0baw/9G2\n        sP/RtrD/0baw/9G2sP/RtrD/0baw/9G2sP/RtrD/0Law/9G2sP/StrD/0raw/9O2sP/TtrD/07aw/9O2\n        sP/Ut7D/1rew/9a3sP/Wt7D/1rew/9a3sP/Wt7D/1rew/9e3sP/Xt7D/1rew/9i3sP/Zt7D/2bew/9m3\n        sP/Zt7D/2Lew/9m4sP/auLD/2riw/9q4sP/cuLD/3Liw/924sP/duLD/3biw/9y4sP/euLD/3riw/965\n        sP/gubD/4Lmw/+K5sP/iurD/47qw/+O6sP/nw7v/yHto/6MaAP+oIQD/riEA/6QgAP8eBgD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACgAAAA7gAAAP8AAAD/AAAA/wAAAP8AAAD/MAkA/0wPAP9IDQD/TA4A/6yQ\n        iv/Rwb7/y7m1/8u5tf/LubX/y7m1/8u5tf/LubX/zLm1/8y5tf/MubX/zbm1/825tf/NubX/zbm1/865\n        tf/OubX/zrm1/865tf/NubX/zbm1/825tf/NubX/zrq1/8+6tf/PurX/z7q1/8+6tf/PurX/z7q1/8+6\n        tf/PurX/0Lq1/9C6tf/QurX/0Lq1/9C6tf/QurX/0Lq1/9C6tf/QurX/0Lq1/9K6tf/SurX/0bq1/9G6\n        tf/RurX/0bq1/9G6tf/RurX/0bq1/9K6tf/TurX/07q1/9O6tf/TurX/07q1/9O6tf/TurX/07q1/9S6\n        tf/TurX/1Lu1/9S7tf/Uu7X/1Lu1/9a7tf/Wu7X/1bu1/9a7tf/Xu7X/17u1/9i7tf/Yu7X/17u1/9i7\n        tf/Yu7X/2bu1/9m7tf/Zu7X/2ry1/9q8tf/avLX/2ry1/9q8tf/avLX/27y1/9y8tf/cvLX/27y1/9y8\n        tf/evLX/3ry1/968tf/fvLX/3ry1/968tf/gvbX/4L21/+G9tf/hvbX/4r21/+O9tf/kvbX/5b+3/+S+\n        tf+xQin/pRoA/6ghAP+rIgD/oB8A/xIDAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ4AAADVAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8jBwD/TA8A/0gOAP9FBgD/c0Q5/9LDv//Pvrv/zr25/869uf/Ovbn/zr25/869\n        uf/Ovbn/z725/8+9uf/Qvbn/z725/9C9uf/Rvbn/0L25/9G9uf/Rvbn/0b25/9G9uf/Rvbn/0b25/9G9\n        uf/Rvbn/0r65/9K+uf/Svrn/0r65/9K+uf/Svrn/0r65/9K+uf/Svrn/0r65/9O+uf/Tvrn/0765/9O+\n        uf/Tvrn/0765/9O+uf/Tvrn/0765/9S+uf/Vvrn/1b65/9W+uf/Vvrn/1b65/9W+uf/Vvrn/1L65/9S+\n        uf/Wvrn/1r65/9a+uf/Wvrn/1r65/9a+uf/Wvrn/1r65/9a+uf/Wvrn/1765/9e+uf/Xvrn/1765/9e+\n        uf/Yv7n/2b+5/9m/uf/Yv7n/2b+5/9m/uf/Zv7n/2r+5/9q/uf/av7n/2r+5/9u/uf/bv7n/3MC5/93A\n        uf/dwLn/3cC5/93Auf/dwLn/3sC5/97Auf/ewLn/3sC5/97Auf/fwLn/4MC5/+DAuf/gwLn/4cC5/+LA\n        uf/iwLn/4sG5/+LBuf/kwbn/5cG5/+TBuf/py8T/zYh5/58ZAP+mHwD/qCEA/60iAP+LGwD/BAEA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAgQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/xMDAP9JDgD/SA4A/0gN\n        AP9ICQD/poeB/9rMyv/Rwb7/0cG+/9HBvv/Rwb7/0cG+/9HBvv/Swb7/0sK+/9PCvv/Swr7/0sK+/9TC\n        vv/Uwr7/08K+/9PCvv/Twr7/08K+/9PCvv/Twr7/08K+/9TCvv/Uwr7/1MK+/9TCvv/Uwr7/1MK+/9TC\n        vv/Uwr7/1MK+/9TCvv/Uwr7/1cK+/9bCvv/Wwr7/1sK+/9bCvv/Wwr7/1sK+/9bCvv/Wwr7/18O+/9fD\n        vv/Xw77/18O+/9fDvv/Xw77/18O+/9fDvv/Xw77/18O+/9jDvv/Yw77/2MO+/9jDvv/Yw77/2MO+/9jD\n        vv/Yw77/2MO+/9jDvv/Zw77/2sO+/9rDvv/Zw77/2sO+/9rDvv/bw77/28O+/9vDvv/bw77/3MO+/9zD\n        vv/cw77/3MO+/93Dvv/dxL7/3cS+/93Evv/dxL7/3sS+/9/Evv/fxL7/38S+/9/Evv/fxL7/4MS+/+DE\n        vv/gxL7/4cS+/+LEvv/ixL7/4cS+/+HEvv/jxL7/48S+/+PFvv/jxb7/5MW+/+XFvv/mxb7/6MrE/+K7\n        s/+oNR7/mxgA/6MgAP+nIAD/sSIA/2QTAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPYAAABYAAAAhwAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AgAA/zwMAP9LDwD/SA4A/0QJAP9WHhX/wKun/9vOy//UxsP/1MbD/9TG\n        w//UxsP/1cbD/9XFw//VxsP/1sbD/9XGw//VxsP/1sbD/9fGw//XxsP/1sbD/9bGw//WxsP/1sbD/9bG\n        w//XxsP/18bD/9fGw//XxsP/18bD/9fGw//YxsP/2MbD/9jGw//Yx8P/2MfD/9jHw//Yx8P/2cfD/9nH\n        w//Zx8P/2cfD/9nHw//Zx8P/2cfD/9nHw//Zx8P/2cfD/9rHw//ax8P/2sfD/9rHw//ax8P/2sfD/9rH\n        w//ax8P/28fD/9vHw//bx8P/28fD/9vHw//bx8P/28fD/9vHw//bx8P/28fD/9vHw//bx8P/3MfD/9zH\n        w//cx8P/3MfD/9zHw//cx8P/3cfD/97Iw//fyMP/38jD/9/Hw//fx8P/38fD/9/Iw//gyMP/4MjD/+DI\n        w//gyMP/4MjD/+HIw//hyMP/4cjD/+HIw//iyMP/4cjD/+HIw//jyMP/5MjD/+TIw//kycP/5MnD/+TI\n        w//kycP/5cnD/+XJw//lycP/5snD/+jMxv/qzsj/t1lE/5kVAP+dHgD/nx4A/6QfAP+qIQD/LwkA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA2wAAADIAAABHAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HgUA/0sP\n        AP9HDgD/Rw4A/0AEAP9mNSr/0sK//93S0P/Yysf/2MrH/9jKx//Zysf/2crH/9nKx//Zysf/2crH/9rK\n        x//aysf/2srH/9rKx//aysf/2srH/9rKx//aysf/2srH/9rKx//aysf/2srH/9rKx//aysf/28rH/9vK\n        x//bysf/28rH/9vLx//by8f/28vH/9vLx//by8f/3MvH/9zLx//cy8f/3MvH/9zLx//cy8f/3MvH/9zL\n        x//cy8f/3MvH/93Lx//dy8f/3cvH/93Lx//dy8f/3svH/97Lx//ey8f/3svH/97Lx//ey8f/3svH/97L\n        x//ey8f/3svH/97Lx//ey8f/3svH/97Lx//ey8f/3svH/97Lx//ey8f/38vH/9/Lx//fy8f/4MzH/+HM\n        x//izMf/4szH/+LMx//izMf/4szH/+LMx//izMf/4szH/+LMx//jzMf/48zH/+PMx//kzMf/5MzH/+TM\n        x//kzMf/5MzH/+XMx//lzMf/5czH/+bNx//nzcf/5szH/+fNx//nzcf/583H/+fNx//oz8r/7tjU/8J4\n        Z/+YFQD/nR0A/50eAP+eHgD/qyEA/4AZAP8BAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACaAAAABgAA\n        AAwAAADbAAAA/wAAAP8AAAD/AAAA/wAAAP8BAAD/NgoA/0sOAP9HDgD/SA4A/0UFAP90Qzr/0MC9/+Ta\n        2f/c0M7/287M/9vOzP/bzsz/287M/9zPzP/czsz/3c7M/93PzP/cz8z/3c/M/93PzP/dz8z/3M/M/9zP\n        zP/cz8z/3M/M/9zPzP/cz8z/3M/M/9zPzP/ez8z/3s/M/97PzP/dz8z/3c/M/93PzP/dz8z/3c/M/93P\n        zP/dz8z/3s/M/97PzP/ez8z/3s/M/97PzP/ez8z/3s/M/9/PzP/fz8z/38/M/9/PzP/fz8z/38/M/9/P\n        zP/fz8z/38/M/9/PzP/gz8z/4M/M/+DPzP/gz8z/4M/M/+DPzP/hz8z/4c/M/+HPzP/gz8z/4M/M/+HQ\n        zP/h0Mz/4dDM/+HQzP/h0Mz/4tDM/+LQzP/i0Mz/49DM/+PQzP/j0Mz/5NDM/+TQzP/j0Mz/49DM/+PQ\n        zP/k0Mz/5NDM/+TQzP/k0Mz/5NDM/+XQzP/l0Mz/5dDM/+bQzP/m0cz/5tHM/+bRzP/m0cz/59HM/+nR\n        zP/p0cz/6dHM/+nRzP/p0cz/7dfT/+3Y1P/EgG//lxsC/5caAP+bHgD/mx4A/6MfAP+fHgD/JQcA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAFEAAAAAAAAAAAAAAIMAAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8KAgD/PwsA/0kNAP9HDQD/SA0A/0QDAP9gKh//tZuW/+LY1v/m3dz/4dbV/+DU0v/g09H/4dTR/+DT\n        0f/f0tH/4NPR/+DT0f/g09H/4NPR/+DT0f/g09H/4NPR/+DT0f/g09H/4NPR/+DT0f/g09H/4NPR/+DT\n        0f/g09H/4dPR/+HT0f/h09H/4dPR/+HT0f/h09H/4dPR/+HU0f/h1NH/4dTR/+HU0f/h1NH/4tTR/+LU\n        0f/i1NH/4tTR/+LU0f/i09H/4tPR/+LT0f/i09H/4tPR/+LT0f/i09H/4tPR/+LT0f/j09H/49PR/+PT\n        0f/j09H/49PR/+PT0f/j09H/49PR/+TT0f/k09H/5NTR/+TU0f/k1NH/5NTR/+TU0f/k1NH/5dTR/+XU\n        0f/l1NH/5dTR/+XU0f/l1NH/5tTR/+bU0f/m1NH/5tTR/+bU0f/n1dH/59XR/+fU0f/n1dH/6NXR/+jV\n        0f/o1NH/6NTR/+jV0f/p1dH/6dXR/+nV0f/q1dH/69bR/+vW0v/r19P/79zZ//Df3P/gwLn/sFxH/5IV\n        AP+WGgD/mR4A/5seAP+bHQD/oR8A/0AMAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADSAAAACAAA\n        AAAAAAAAAAAAIQAAAOcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TAwD/Rw0A/0oOAP9HDQD/Sw4A/0YH\n        AP9JCgL/dEU5/7KYk//ZzMn/4tjW/+ff3f/p4N7/7OXk/+zl5P/s5eT/7eXk/+3l5P/t5eT/7eXk/+3l\n        5P/t5eT/7eXk/+3l5P/t5eT/7eXk/+3l5P/t5eT/7eXk/+3m5P/t5uT/7eXk/+3l5P/t5eT/7eXk/+3l\n        5P/t5eT/7ubk/+7m5P/u5uT/7ubk/+7m5P/u5uT/7ubk/+7m5P/u5uT/7ubk/+7m5P/v5uT/7+bk/+/m\n        5P/v5uT/7+bk/+/m5P/v5uT/7+bk/+/m5P/v5uT/7+bk/+/m5P/v5uT/7+bk/+/m5P/v5uT/8Obk//Dm\n        5P/w5uT/7+bk/+/m5P/v5uT/7+bk/+/m5P/v5uT/8Obk//Dm5P/w5uT/8Obk//Dm5P/x5uT/8ebk//Hm\n        5P/x5uT/8ebk//Hn5P/x5+T/8ebk//Lm5P/y5uT/8ubk//Ln5P/y5+T/8ufk//Ln5P/y5+T/8ufk//Hk\n        4f/w4N3/7t3Z/+rV0P/bta3/t21d/5UmDf+KEgD/kxsA/5YdAP+ZHQD/nR4A/6YgAP9cEQD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGcAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8UAwD/QQwA/0wOAP9NDgD/TA4A/0oMAP9DBQD/RwkA/1wjFf90RDn/h11T/4xi\n        WP+adGv/nHVs/511bP+ddWz/nHVs/511bP+bdWz/m3Vs/511bP+cdWz/nHVs/5x1bP+ddWz/nXVs/511\n        bP+ddWz/nXVs/551bP+fdWz/n3Zs/592bP+fdmz/n3Zs/592bP+fdmz/oXZs/6J2bP+idmz/onZs/6J2\n        bP+idmz/onZs/6J2bP+idmz/onZs/6J2bP+kd2z/pXds/6N3bP+ld2z/pXds/6V3bP+leGz/pXhs/6V4\n        bP+leGz/p3hs/6h4bP+oeGz/qHhs/6h4bP+oeGz/qHhs/6h4bP+qeGz/qnhs/6p4bP+qeGz/qnhs/6p4\n        bP+qeGz/q3hs/6x4bP+teWz/r3ls/7B5bP+xeWz/sXls/7B5bP+xeWz/sXls/7B5bP+xeWz/s3ps/7N5\n        bP+zeWz/s3ps/7Z6bP+2emz/tnts/7l7bP+7fG7/tHFg/65mU/+oWUb/mzki/40dBP+IEQD/jhgA/44b\n        AP+RHAD/mB0A/54fAP+ZHgD/URAA/wIAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADEAAAABQAA\n        AAAAAAAAAAAAAAAAAAAAAAADAAAAuwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HAQD/KQgA/0UN\n        AP9NDwD/UA8A/08PAP9ODQD/SwoA/0kGAP9KBAD/SgQA/0gCAP9LAgD/TQIA/00CAP9LAgD/SwIA/04C\n        AP9KAgD/TAIA/04DAP9OAwD/TgMA/04DAP9OAwD/TgMA/08DAP9PAwD/TwMA/08DAP9RAwD/UwQA/1ME\n        AP9TBAD/UwQA/1MEAP9UBAD/VQQA/1gFAP9YBQD/WAUA/1kFAP9ZBQD/WQUA/1kFAP9ZBQD/WQUA/1kF\n        AP9bBQD/XQYA/10GAP9dBgD/XQYA/10GAP9eBgD/YgcA/2IHAP9jBwD/YwcA/2MHAP9jBwD/ZAcA/2QH\n        AP9kBwD/ZAcA/2QHAP9mCAD/aAgA/2gIAP9oCAD/aAgA/2gIAP9rCQD/agkA/24JAP9uCQD/bwkA/3AK\n        AP9zCgD/dQoA/3QKAP90CgD/dQsA/3cLAP94CwD/eAsA/3gLAP95CwD/ewwA/34NAP9/DQD/gg0A/4QO\n        AP+EDwD/hxAA/4oSAP+QFwD/jxkA/5EcAP+THAD/lR0A/5cdAP+SHAD/bBUA/yUHAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA8gAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAA2wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BwEA/xoFAP8oBwD/LQgA/zEJAP82CgD/NgoA/zcL\n        AP85CwD/OQsA/zkLAP85CwD/OQsA/zsLAP87CwD/PAwA/zsMAP85CwD/PAwA/zwMAP88DAD/PAwA/zwM\n        AP88DAD/PQwA/z0MAP89DAD/PQsA/z0LAP89DAD/PwwA/0AMAP9ADAD/QAwA/0AMAP9ADAD/Qg0A/0MN\n        AP9DDQD/Qw0A/0MNAP9DDQD/RA0A/0QNAP9EDQD/RA0A/0MNAP9GDQD/Rw0A/0cNAP9HDQD/Rg0A/0YN\n        AP9KDgD/Sg4A/0oOAP9KDgD/Sg4A/0oOAP9KDgD/Sg4A/0oOAP9LDgD/Sw4A/0wPAP9NDwD/Tg8A/04P\n        AP9ODwD/Tg8A/1APAP9READ/URAA/1EQAP9QEAD/URAA/1MQAP9VEQD/VRAA/1UQAP9WEAD/VhAA/1YQ\n        AP9XEQD/WBEA/1gRAP9ZEQD/WxIA/1sSAP9cEgD/XRIA/14TAP9hEwD/YhMA/2MTAP9kEwD/XhIA/1YQ\n        AP9RDwD/PgwA/xkFAP8BAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABkAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAAAA4QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAsAAAA1gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+gAAAGsAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbAAAAuQAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAOoAAABNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAHAAAAcAAAAOgAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAACkAAAAIQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAA\n        AHsAAADaAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AO4AAACkAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAABCAAAAgAAAAK0AAADKAAAA0wAA\n        AN4AAADxAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwBQEA7wQBANgAAADRAAAAuQAAAJMAAABcAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////////////////////////////////////////\n        ////////////////////////////////////4AAAAAAAAAAAAAAAAA///4AAAAAAAAAAAAAAAAAD//4A\n        AAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAB/+AAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAA\n        AB/gAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAA\n        AAAAAAADgAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA\n        AAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAP8AAAAAAA\n        AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAA//+A\n        AAAAAAAAAAAAAAAAA///4AAAAAAAAAAAAAAAAA//KAAAAEAAAACAAAAAAQAgAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAkAAABgAAAAuwAAAOYAAADuAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO4AAADdAAAApAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAADgAAADTAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAqAAA\n        ABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE0AAADzAAAA/wAAAP8AAAD/AQAA/wQBAP8EAQD/BAEA/wQB\n        AP8EAQD/BAEA/wQBAP8EAQD/BAEA/wUBAP8FAQD/BQEA/wQBAP8EAQD/BQEA/wQBAP8EAQD/BAEA/wYB\n        AP8EAQD/BAEA/wQBAP8FAQD/BgIB/wQAAP8FAQD/BQEA/wQBAP8FAQD/BQEA/wQBAP8EAQD/BAEA/wQB\n        Af8EAQH/BAEA/wQBAP8EAQD/BAEB/wQCAv8EAgL/AwIB/wMBAf8DAQH/BAEB/wMCAf8DAQH/AgEB/wAA\n        AP8AAAD/AAAA/wAAAP8AAADOAAAAHAAAAAAAAAAAAAAAAAAAADkAAAD2AAAA/wAAAP8FAQD/PAwA/3AW\n        AP+AGAD/gBgA/4EZAP+FGQD/ihoA/5EeA/+QHAD/khwA/5cdAP+bHQD/nh4A/6IfAP+jHwD/qCAA/6og\n        AP+sIQD/sSEA/7UjAf+THQH/ghgA/4QZAP+GGgD/ixsA/6klBv+1JgT/px8A/6ogAP+uIQD/qyEA/6wh\n        Af+vIgL/sCMC/68kBP+vJQb/riYH/64nCP+uKgz/rjAT/60yFv+sLhH/rCoL/6wqDP+sKQv/qy4Q/6s0\n        GP+qPCP/qjYc/6svEv+LJxD/Nw8G/wAAAP8AAAD/AAAA/wAAAMkAAAALAAAAAAAAAAYAAADLAAAA/wAA\n        AP8JAgD/XRIA/4oaAP+JGgD/iBoA/4sbAP+OGwD/kBwA/5cdAP+bHQD/nh4A/6IfAP+lHwD/qyAA/68h\n        AP+xIgD/tSIA/7kjAP+8JAD/wSUA/8kmAP+3IwD/hxoA/4gaAP+LGgD/jxsA/5EcAP+aHQD/xSkF/9Uq\n        Av+/JAD/xSYA/78lAP/DJQD/ySYA/9QoAP/aKgH/2CoC/9otBf/bNA3/2TYQ/9YyDP/XLQX/2CsD/9cs\n        Bf/WLQb/1S0G/9U8GP/UOhb/1EUk/9REI//TOBT/2DsW/9Q6Fv9qHQr/AAAA/wAAAP8AAAD/AAAAhwAA\n        AAAAAABXAAAA/wAAAP8BAAD/UA8A/3UWAP9tFQD/bxUA/3EWAP90FgD/dxcA/3kXAP9/GQD/gxkA/4Ya\n        AP+IGgD/jRsA/5McAP+WHQD/lx0A/5seAP+fHgD/ox8A/6kgAP+nIAD/dBYA/2sVAP9uFQD/dBYA/3UW\n        AP94FwD/exgA/34YAP+qIgL/nB4A/5YdAP+dHgD/oR8A/6cgAP+sIQD/syIA/8kpA//PLgn/wikF/74k\n        AP/BIwD/yCUA/8smAP/LJwH/zScB/84oAf/PORb/zzcU/848Gv/OOxn/zjAM/80yDv/PMw7/2zcQ/2AY\n        B/8AAAD/AAAA/wAAAOsAAAAaAAAAqQAAAP8AAAD/IwcA/2gUAP9lEwD/ZRMA/2YTAP9oFAD/aRQA/2oV\n        AP9sFQD/bxUA/3QWAP94FwD/eRcA/30YAP+DGQD/hxoA/4kaAP+OHAD/khwA/5UdAP+dHgD/dhYA/2UT\n        AP9hEgD/ZRQA/2kUAP9nFAD/aRQA/24VAP9yFgD/cBUA/3UWAP97GAD/gBgA/4MZAP+FGQD/iRoA/44b\n        AP+cHgD/nB4A/50eAP+iHwD/qSAA/7MiAP+1IwD/uCMA/7sjAP/CJQD/0TcT/9A5Fv/QPBr/zzUS/88t\n        CP/OLgn/zi8K/9MwC//FLgz/FwYB/wAAAP8AAAD/AAAAXwAAANcAAAD/AAAA/0ENAP9iEwD/XxIA/2AT\n        AP9hEwD/YxMA/2QTAP9mEwD/ZxMA/2gUAP9rFAD/cBYA/3IWAP91FgD/eRgA/34YAP+CGQD/hRoA/4ob\n        AP+THAD/fBgA/1MQAP9VEAD/VhEA/10SAP9ZEQD/XBIA/2ASAP9iEgD/ZxMA/2oUAP9qFQD/bBUA/28V\n        AP9zFgD/dxcA/3sYAP9+GAD/ghkA/4YaAP+NGwD/kxwA/5gdAP+iHwD/ox8A/6cgAP+xIwH/uyQB/9M1\n        D//SNhL/0ToW/9ExDP/QKwT/0CwG/88sB//PLQj/2zEJ/1MSA/8AAAD/AAAA/wAAAJIAAADsAAAA/wEA\n        AP9JDgD/XBMA/1sSAP9dEgD/XRIA/14SAP9fEwD/YhMA/2MTAP9lEwD/aBQA/2oUAP9qFQD/bxUA/3cX\n        AP9yFgD/cBYA/4AYAP+BGQD/cRYA/1APAP9KDgD/Sw4A/1IQAP9READ/Tw8A/1IQAP9YEQD/XBIA/2AS\n        AP9eEgD/YhMA/2ISAP9kEwD/aRQA/2sVAP9vFgD/eBcA/3cXAP96FwD/fxgA/4QZAP+HGgD/lB0A/5Mc\n        AP+YHQD/nR4A/7EjAf/XMgv/1DQO/9I0D//SLQf/0isE/9IrBf/RKwT/0C0H/90vCP9yGAT/AAAA/wAA\n        AP8AAACsAAAA7QAAAP8CAAD/SQ4A/1sSAP9aEgD/WhIA/1oSAP9eEgD/XhIA/2ETAP9hEwD/YxMA/2UT\n        AP9oFAD/aRQA/20VAP9iEwD/XxIA/38YAP97GAD/VBAA/0cNAP9IDgD/Rw4A/0oOAP9PDwD/SQ4A/0wO\n        AP9NDgD/URAA/1YRAP9cEgD/WRIA/10SAP9iEgD/YxMA/2UTAP9kEwD/ZhMA/3EWAP9tFQD/cRYA/3MW\n        AP95FwD/fhgA/4caAP+HGgD/jRsA/4saAP+yIwL/wSYC/88tB//XMAr/1DAK/9AuCf/QLAb/0isF/9Es\n        Bf/dLwb/dhkD/wAAAP8AAAD/AAAArgAAAO0AAAD/AgAA/0kOAP9aEgD/WhIA/1sSAP9cEgD/XxMA/18T\n        AP9hEwD/YhMA/2UTAP9mEwD/aBMA/2sUAP9jEwD/UxAA/4QZAP+LGwD/VhEA/0UOAP9BDQD/Qw4A/0EN\n        AP9JDgD/Rg4A/0cOAP9KDgD/Sg4A/00OAP9SEAD/ZxQA/1gRAP9XEQD/WRIA/1wSAP9gEgD/YRIA/2QT\n        AP9qFAD/ZRMA/2sVAP9wFgD/chYA/3oXAP9/GAD/fhgA/4cbAf+FGgD/sSIB/6cgAP+fHwH/ySoF/9Ms\n        Bf+0IwL/uyQB/8cpBP/ULAX/3y8G/3YZA/8AAAD/AAAA/wAAAK4AAADtAAAA/wIAAP9JDgD/WxIA/1sS\n        AP9bEgD/XBIA/10TAP9fEwD/YhQA/2MUAP9kEwD/ZhMA/2gTAP9rFAD/SQ4A/2ETAP9oFAD/RQ4A/0IN\n        AP8/DQD/Pg0A/z4NAP9DDQD/RQ4A/0ANAP9EDgD/RQ4A/0cOAP9MDgD/VhEA/10SAP9TEAD/VhEA/1cR\n        AP9XEQD/WhIA/1sSAP9iEwD/YxIA/2ESAP9kEwD/aBQA/2wVAP9zFgD/dBYA/3cXAP9/GAD/gBgA/6wi\n        Av+ZHQD/jxsA/5kdAP/OKAH/oh8A/6cgAP/CKQX/1i0F/+AwB/92GgX/AAAA/wAAAP8AAACuAAAA7QAA\n        AP8CAAD/SQ4A/1sSAP9cEgD/XBIA/1sSAP9dEgD/XxMA/2IUAP9jFAD/ZBQA/2cUAP9rFAD/XBIA/0EN\n        AP9SEAD/PQwA/z0MAP86CwD/OgsA/zoLAP88DAD/PQwA/0ANAP9CDQD/Qg0A/0oPAP9GDgD/SA4A/1oR\n        AP9NDgD/UA8A/1EQAP9SEAD/VBAA/1URAP9YEQD/YxMA/1sSAP9cEgD/YBIA/2MSAP9lEwD/bxUA/24V\n        AP9zFgD/cxYA/3MVAP+5IwH/jxwA/4gaAP+QHAD/xyYA/58eAP+kIQL/2C4H/9UtBv/iMQj/dxoF/wAA\n        AP8AAAD/AAAArgAAAO0AAAD/AgAA/0oOAP9cEgD/XBIA/1wSAP9cEgD/XhIA/2ATAP9jFAD/ZRUA/2MR\n        AP9hCQD/ZgwA/0oOAP9WEQD/Vw0A/y8AAP8vAAD/NwkA/zwMAP83CQD/MwEA/zYEAP8+DAD/Pw0A/0sP\n        AP9KDQD/OQIA/0kDAP9RBwD/PgIA/0EBAP9JCgD/TQ4A/04PAP9READ/UAoA/08GAP9TDAD/WRIA/1wS\n        AP9gEwD/YRIA/2YTAP9nEwD/ZxQA/2cSAP9uEAL/ziwG/48bAP9yFgD/iRoA/48bAP+THAD/lBwA/84s\n        Bv/YLwf/4zIJ/3gaBf8AAAD/AAAA/wAAAK4AAADtAAAA/wIAAP9KDgD/XBIA/1wSAP9cEgD/XBIA/18T\n        AP9iFAD/ZBQA/2USAP9xIQ//jEw8/4tGNf9aFQT/aBAA/3ArG/9uRz3/YkE4/zsUCv8yBgD/QRgP/2pG\n        Pf9gOTD/PA0B/zoLAP9oDQD/UQ8F/3ZUSv+7mpL/yLKu/7einf+PaF//VBsQ/0MDAP9MDgD/SwwA/2gw\n        I/99TED/aCsd/1QNAP9YEgD/XxMA/2ITAP9iEwD/YhMA/2EOAP9hCgD/tIuA/+JaOv+ZFgD/YxMA/3gX\n        AP+FGQD/fxgA/4cZAP+nIwT/2zEK/+QxCP94GgX/AAAA/wAAAP8AAACuAAAA7QAAAP8CAAD/Sw4A/10S\n        AP9dEgD/XRIA/10SAP9hEwD/ZBQA/2QUAP9gCQD/kFBB///////17+7/eiYS/10BAP+fgXn///////39\n        /P9YNS3/JwAA/2tKQv//////4NjW/z8RBP89AQD/gTYn/97JxP///////////////////////////+ni\n        4P99UUj/RQIA/0YDAP+6oZv//////6qIgP9IAAD/VRAA/1kRAP9aEgD/XRMA/1cKAP9gEwb/yqWb////\n        ///OVjr/qhgA/2YUAP9vFQD/fhgA/4EZAP+VHAD/kh0B/9QvCf/mMgj/eRoE/wAAAP8AAAD/AAAArgAA\n        AO0AAAD/AgAA/0sOAP9dEgD/XhIA/14SAP9eEgD/YhMA/2QUAP9lFAD/XgkA/45PQP//////9e/u/3km\n        Ev9eAQD/n4B4///////9/Pz/WDUt/ycAAP9oSUL//////93X1f87CQD/aCoe/+ni4P//////2sC6/61l\n        U/9yRDn/klZI/8+nnf///////Pz7/4JSSv8/AAD/vqGa//////+sioH/SQEA/1UQAP9XEQD/WBIA/1AG\n        AP9gHhL/0b24////////////x1Q4/70cAP+QHAD/chYA/4AZAP+dHgD/wSYD/6MhAv/bLwj/5zII/3oa\n        BP8AAAD/AAAA/wAAAK4AAADtAAAA/wIAAP9MDwD/XhMA/14SAP9eEgD/XhIA/2ITAP9jEwD/ZhQA/14J\n        AP+NT0D///////Xv7v95JhL/YAIA/5t/eP///////Pz8/1g1Lf8rAAD/bkpC///////g19T/QwoA/8Cr\n        p///////s5aP/3cQAP9ZBQD/PAMA/4IOAP+UDgD/zHNd///////k3Nr/TA4B/7iemP//////qomB/0MA\n        AP9NDwD/UA8A/0gCAP9vMSb/49bS/////////////////8NTOP+5GwD/tCIA/3AWAP94FwD/uSQA/9wt\n        Bf/YLQb/3DAI/+g0Cv96GgT/AAAA/wAAAP8AAACuAAAA7QAAAP8CAAD/TA8A/14TAP9eEgD/XhIA/14S\n        AP9jEwD/YhMA/2UUAP9fCQD/jU9A///////17+7/fSYS/0MAAP+OfHj///////z8/P9dNi3/KwAA/2xK\n        Qv//////39HN/3Q7LP/7/f3/5dfU/10TCf+TFwD/UxAA/18SAP+UHAD/pR4A/44NAP/MqKD//////35X\n        Tf+vlpD//////6qLhP9DAQD/UQ8A/0YAAP94Rzz/7Obl///////6+fj/9/X0//////+yUDj/rBkA/7cj\n        AP+MGwD/bxUA/8MlAP/cLQT/3y4G/90uBv/pMQf/exoE/wAAAP8AAAD/AAAArgAAAO0AAAD/AgAA/0wP\n        AP9eEwD/XBIA/18TAP9eEwD/YxMA/2MTAP9mFAD/YAkA/41PQP//////9+/u/3MlEv8uAAD/ln54////\n        ///8/Pz/YDct/y4AAP9pSkL//////9TKx/+PamH//////52Lif9iBQD/khwA/z8MAP+SHAH/khwA/2AT\n        AP9lCAD/tmBQ//////+okIr/sZaP//////+rjIX/QAAA/zwAAP+IX1b/+fX0///////8+fj/lmhd/8iy\n        rf//////hEc4/5MUAP+oIAD/pR8A/5cdAP+5IwD/2iwE/98uBf/eLgb/6jEG/3waA/8AAAD/AAAA/wAA\n        AK4AAADtAAAA/wIAAP9NDwD/XxMA/10SAP9fEwD/XxMA/2MUAP9kFAD/ZhQA/2AJAP+OT0D///////fv\n        7v9NHRL/HQAA/5R+eP///////Pz8/1o2Lf8lAAD/ZklC///////SyMb/jXVw//////+ff3r/XAQA/2gU\n        AP9UEQD/pyAA/2MTAP8+DAD/SwUA/6pSQP//////tZ+a/7GXkf//////qImF/y0AAP+Yfnf////+////\n        ///s6Ob/hE5C/1UAAP/Rt7L//////3FDOP9sDAD/mx4A/6UgAP+1IwD/uyMA/9wsA//gLgX/3y4F/+wx\n        Bf98GgP/AAAA/wAAAP8AAACuAAAA7QAAAP8CAAD/Tg8A/18TAP9cEgD/YBMA/2ATAP9jFAD/ZBQA/2UU\n        AP9gCgD/jk9A///////w7u7/MBES/xgAAP+Rfnj///////38/P9RNC3/DwAA/1lBQv//////1MvJ/3dc\n        Vf//////wJ6X/zgAAP87DAD/ixsA/4wbAP9DDQD/OAsA/1oEAP+iaF3//////6CEff+wl5H//////6iS\n        jP+kjIb////////////c0M3/XCwk/z4AAP9fCwD/2bu0//////9/Rjn/WQkA/4gaAP+eHgD/tyMA/74k\n        AP/dLAP/4i0E/+AtBP/tMAX/fRkC/wAAAP8AAAD/AAAArgAAAO0AAAD/AgAA/04PAP9gEwD/XhIA/2AT\n        AP9gEwD/ZBQA/2QUAP9kFAD/YAoA/45QQP//////9fPy/3JaVP83Fg7/i3h0///////8/Pz/RjAq/z0l\n        H/+Jenb//////9jRz/9EJB3/7+3t//Du7f9CIR7/OAEA/5YdAP9rFQH/MAoA/0EHAP96EgL/0sTB////\n        //9/RTj/rZiU///////29PT//v39//////+/sKz/RRUO/zgCAP9ADQD/NwIA/8S2sv//////eEU4/0gG\n        AP9cEgD/kRsA/68hAP+4IwD/3isC/+MtA//iLQP/7jAE/34ZAv8AAAD/AAAA/wAAAK4AAADtAAAA/wIA\n        AP9ODwD/YBMA/18SAP9gEwD/YhMA/2UUAP9lFAD/ZRQA/2EKAP+OUED/////////////////hXRw/39s\n        aP///////Pz8/0EqJP+/t7T////////////c1tT/KQEA/7aMgv//////y8PB/2wpGv92CQD/WwYA/ykA\n        AP9PEwf/1aOX///////ewLn/gQwA/8Gknf////////////////+gi4b/MQUB/y8EAP83CwD/OAoA/zMB\n        AP/Ot7L//////3FDOP9ABAD/QA0A/3YXAP+lHwD/tSQB/94sA//kLAH/4y0C//AwBP9/GQL/AAAA/wAA\n        AP8AAACuAAAA7QAAAP8CAAD/Tw8A/2ETAP9fEgD/YBMA/2ITAP9mFAD/aBQA/2YUAP9hCgD/kFFC////\n        /////////////4h0b/+Cb2r///////z8/P9FKyX/wLe0////////////29fW/0MOAv9fEgT/v7az////\n        ///07ev/06Wb/7qHe/+wlI7/4drZ///////u3tr/mjYh/3YGAP+8pqD///////f19f9/ZF3/KwAA/zMI\n        AP81CwD/NgoA/zYKAP84AgD/1Lq0//////9tRDr/PwQA/0MNAP9PDwD/mR0A/7ckAf/gLAL/4ioA/+Qs\n        Af/yLgH/fxgA/wAAAP8AAAD/AAAArgAAAO0AAAD/AgAA/08PAP9hEwD/XxIA/2ETAP9iEwD/ZxQA/2wV\n        AP9lFAD/ZA0A/4A9LP+/t7X/urKw/8W9uv9rU03/YU1I/8a+u/+5sK3/PCAZ/5CAfP/Curf/ybq2/6iX\n        kv9DEAP/JgIA/y8MCP+ah4L/9fHw//////////////////v7+/+5qaT/eCob/4IQAP9jCgD/ua2p//Lw\n        7/9iQTn/KQAA/zUKAP82CwD/NgsA/zgLAP82CwD/NAQA/7KJf//p0Mr/YjYs/zQDAP8+DAD/PAwA/2UT\n        AP+xIwH/4CwC/90qAP/eKgD/8C0A/38XAP8AAAD/AAAA/wAAAK4AAADtAAAA/wIAAP9PDwD/YRMA/18S\n        AP9hEwD/YhMA/2MTAP9mFAD/ZhQA/2kVAP9eEAD/IQAA/x0AAP8nAAD/KAQA/yAEAP8cAAD/HQAA/yUH\n        AP8gAgD/HwAA/zYEAP8mAgD/OgsA/zAKAP8tBgD/JQAA/2ImGP+1a1n/67is/654a/9iMyf/MAIA/0cJ\n        AP+AGQD/Vw0A/3JYUf9XMi3/KQAA/zUKAP80CgD/NAoA/zUKAP87DAD/NQsA/zkLAP9/EwD/fxMA/2MS\n        AP8+DAD/PQwA/z8MAP8/DAD/jBsB/98rAf/bKQD/3CoA/+0tAP9+GAD/AAAA/wAAAP8AAACuAAAA7QAA\n        AP8BAAD/TQ8A/2ITAP9fEgD/XxIA/2ITAP9iEwD/ZhQA/2cUAP9mEgD/aQwA/0sGAP8pAAD/NgIA/x4A\n        AP8fAAD/HgAA/yAAAP8gAAD/IAAA/yIAAP8yAwD/KQgA/zkLAP8rCAD/LQkA/y0JAP8tAAD/iSgc//rb\n        0v+fQTT/QAAA/zUKAP84DAD/YxMA/0YOAP8sAwD/KwAA/y0AAP8vAQD/LwEA/zABAP8wAQD/LwEA/ywA\n        AP9HBgD/lhQA/4kRAP92DQD/Wg0A/zcLAP87CwD/OwsA/14TAP/ZKgH/3ikA/9spAP/qLAD/fRgA/wAA\n        AP8AAAD/AAAArgAAAO0AAAD/AgAA/04PAf9jFAH/YBMB/2ATAP9hEwD/YxMA/2QTAP9iDQD/hTck/+C5\n        sP/eubD/zbGq/8utpf/EqqT/xKqk/8Sqpf/EqqT/xKqk/8Oqo//HsKv/uoZ6/zUGAP89DAD/LgkA/ywJ\n        AP8vCQD/KwAA/8Gclf//////6b+2/2AOAP82CQD/PgwA/0gOAP81CgD/LwMA/5tvZf/Graj/wKaf/8Cm\n        n//ApZ//wKWf/7+knv+9o57/yqif/9usof/Xq6H/2bOq/5dZSv81AgD/OAsA/zkLAP9XEAD/1CkA/90q\n        AP/cKgD/6CsA/3sXAP8AAAD/AAAA/wAAAK4AAADtAAAA/wIAAP9NDwH/YxQB/2ATAf9gEwH/YRMB/2MT\n        Af9kEwD/YQoA/49HNv///////////////////////////////////////////////////////////+XF\n        vf82AwD/NwoA/ywJAP8rCQD/IgAA/3ZAN//99/X/+f7+//////+fYVb/NQAA/0MOAP8/DQD/MgkA/yoA\n        AP/IqqP///////3///////////////////////////////v////3////+P////////+whHj/OgAA/z0M\n        AP82CgD/ZBMA/9YpAP/YKgD/2SoA/+YtAP95FwD/AAAA/wAAAP8AAACuAAAA7QAAAP8CAAD/Tg8A/2IT\n        AP9gEwH/YBMB/2MUAf9pFQL/ZhQB/2IMAP+QRDL///n1//fn4/+VXlD/aUU8/25JQP9vSUD/cUlA/3JJ\n        P/9wST//cUk//3VMQv9oOi//LAcA/0ENAP8tCQD/JgcA/y8FAP/Wvbf//////+vSzP/6/f7/69XQ/04U\n        C/81BwD/NQoA/y8JAP8qAAD/vpiP//z39f+zkYn/cj8z/3pJPf96ST3/eUg8/5pPPv/EW0L/xFxE/71Z\n        Qf+5WUL/eS8d/zwJAP88DAD/ZBMA/78kAP/RJwD/zycA/9UpAP/pLQD/ehcA/wAAAP8AAAD/AAAArgAA\n        AO0AAAD/AQAA/00PAP9iEwD/XxIA/18SAP9iEwD/bBYC/2UUAf9jEwD/dh4J/5w8Jf9gHg//KQEB/yMA\n        AP8kAAD/JAAA/ysAAP8sAAD/KwAA/ywAAP8sAAD/LQIA/zAJAP80CgD/NQoA/ykAAP+PX1b//////+7f\n        2/9jIRb/38nD//////+jfHX/JQAA/zAJAP8uCQD/KwgA/04WCP9iIBD/Rw4G/zEAAP81AAD/NgAA/zgA\n        AP9uDAD/mhUA/5cVAP+PEwD/jBIA/14PAP86DAD/fBgA/80nAP/UKAD/zScA/84nAP/TKAD/5ywA/3sX\n        AP8AAAD/AAAA/wAAAK4AAADtAAAA/wEAAP9MDwD/XxIA/14SAP9eEgD/YBMA/2ITAP9jEwD/XQsA/4c+\n        LP/y19D/6svE/+/Oxv/wzsb/8M7G/+/Ox//vz8f/787G/+/Nxv/uzcb/9dfP/8ydk/81BAD/NgoA/zIG\n        AP9KFA3/7trU//////+da2L/JQAA/6daS///////+O3p/1YmHv8lAgD/LQkA/ycAAP+vg3j/6c3H/+TH\n        v//nycH/58jB/+bIwP/myMH/6czG/+vNxv/szcb/683G//XY0v+WaV3/fA4A/88nAP/QJwD/0CgA/9Ip\n        AP/SKAD/0SgA/+ItAv95FwD/AAAA/wAAAP8AAACuAAAA7QAAAP8BAAD/TQ8A/2ATAP9eEgD/XhIA/2AS\n        AP9iEwD/YhMA/1wJAP+LRjX/////////////////////////////////////////////////////////\n        ///ew73/NwMA/zYKAP8uAAD/rYF4///////jyML/RQsC/zIHAP9uDQD/4rOp///////Cnpb/JwAA/y4I\n        AP8iAAD/yKmi/////////////////////////v7//f////v+/v/5/f7/+P3+//j8/f/6////04p4/8MY\n        AP/HJgD/ySYA/80nAP/SKAD/1SkA/9UpAP/gLAH/dxcA/wAAAP8AAAD/AAAArgAAAO0AAAD/AQAA/00P\n        AP9gEwD/XRIA/14SAP9jEwD/YhMA/2ITAP9gEQD/bR0K/2s2Kf9VLyb/UzIr/1QzK/9VMyv/WTQs/2E2\n        Lf9lNy3/Zzgt/2Y3LP9oOS7/Yi4h/zcJAP8wAgD/YSsi//zy7///////g0xC/zUAAP87DAD/XgsA/3o0\n        KP/79fP///78/3Q/N/8lAAD/JgYA/00iF/9aMif/WDIp/1w1K/9iNSv/ZTYr/5VBLf+mRS7/tUgu/7JI\n        Lv+uRy7/wEww/8o6GP/AIgD/xicC/8coA//HJQD/zScA/88nAP/QKAD/3ioA/3cXAP8AAAD/AAAA/wAA\n        AK4AAADtAAAA/wEAAP9NDwD/YBMA/1wSAP9dEgD/ZBMA/2ATAP9iEwD/XQ0A/34wHf/Hr6r/uKSg/0Ac\n        FP8mCwX/Kg4I/y0PCP85EQj/QRMI/0UUCP8+Ewn/PxQJ/0ESB/80CgD/MwAA/8ijnP//////zami/zgA\n        AP89CwD/OQsA/2gUAP9NAgD/uo6G///////av7j/MAUA/yQAAP+Xc2v/yr67/3pZUv81CQD/RhQI/0YU\n        CP+AHwj/qicI/60oCf+pJwj/pCcK/8MxD//FLAj/vSQA/8ImAP/IJgD/ySYA/8omAP/MJgD/0SgA/90q\n        AP92FgD/AAAA/wAAAP8AAACuAAAA7QAAAP8CAAD/TQ8A/2ATAP9dEgD/XRIA/10SAP9eEgD/YRMA/1oL\n        AP+EPCr///37///////18O//8u7t//Pv7v/z7+7/9vDv//fx7//38e//9/Hw//z7+//VubP/LwAA/3lL\n        Qf///////vTy/2MtJv8zAwD/QQ0A/zgLAP9lEwD/SwoA/08ZEf/y4t3//////41iWf8VAAD/x6qj////\n        ///69vb/8+zr//Tu7P/07ev/9+3r///v6//87uv//O3q//zu6//9/Pv/2oZy/7oYAP/AJQD/wSUA/8Mm\n        AP/JJwD/yycA/88oAP/eKgD/dBYA/wAAAP8AAAD/AAAArgAAAO0AAAD/AgAA/00PAP9eEgD/WxIA/1wS\n        AP9cEgD/XRIA/18TAP9bDAD/cDMk/+3f3P/q5eT/7efm/+7o5//v6ef/7+no//Dq6f/x6un/8uvq//Pr\n        6v/39fX/17Wt/0MCAP/Rsar////+/6qAd/8tAAD/OQwB/zoMAf85CwH/YBMB/1URAP8sAAD/lmVd//35\n        9//hyML/MQcA/7WUjf/18O//7efl/+/p6P/w6ef/7+nn/+3o5//t6Of/9Oro//Hp5//z6uf/9/b1/9WC\n        b/+4FwD/viUA/8AlAP/CJgD/xCYA/8UmAP/KJwD/3CoA/3UWAP8AAAD/AAAA/wAAAK4AAADtAAAA/wEA\n        AP9JDgD/WxIA/1sSAP9cEgD/XBIA/1wSAP9eEgD/XRIA/zUMAv8vFA7/LRQO/zIVDv8wFA7/LhQO/y8V\n        Dv84Fg7/PxgP/0IYD/9FGQ//QhgP/z4UCv8wCwL/QRsS/0IZD/80CQT/MwkA/zgLAf85CwH/NgsB/1QR\n        Af9gEwH/PgwB/zwJA/9JGQ7/PxwU/ykMBf8xEQj/OBgP/zcXD/87GA//QRgP/0YZD/9HGg//RxoP/48o\n        D/+uLg//uTAQ/7wyEf+7Kgj/uyMA/70kAP+9JAD/wSUA/8QmAP/GJgD/zCcA/94rAP94FwD/AAAA/wAA\n        AP8AAACuAAAA7QAAAP8BAAD/SA4A/10VBP9bEgD/WxIA/1sSAP9bEgD/XhIA/1YRAP8pCAD/FwEA/xgB\n        AP8bAgD/GwIA/xsCAP8cAgD/JAQA/ygFAP8gAwD/IgMA/yMEAP8jBAD/KggA/yYEAP8mBAD/LQgA/zAJ\n        AP8vCQD/MAkA/ywIAP9NDwH/VBEB/zULAf84CwH/OggA/yoFAP8iBwH/IwUA/yQEAP8jBAD/JwQA/ysF\n        AP8zBgD/NQcA/zAGAP9MCwD/pB0A/7cfAP+wHgD/tyEA/7okAP+7IwD/viQA/78kAP/EJgD/ySYA/88q\n        BP/cKgH/dRYA/wAAAP8AAAD/AAAArgAAAO0AAAD/AQAA/0cNAP9lIRH/XBQE/1oSAP9bEgD/WxIA/1wS\n        AP9WEQD/JggA/xkFAP8ZBQD/GgUA/xsFAP8dBgD/HgYA/yQHAP8qCAD/IAYA/yAGAP8hBwD/IwcA/yUH\n        AP8jBwD/JAcA/yQHAP8kBwD/JggA/ycIAP8lCAD/OwsA/zUKAP8mCAD/KgkB/ywJAf8qCQH/IwgB/yQI\n        Af8pCQH/LgkB/ygIAP8uCQD/MgkA/zUKAP84CwD/MwkA/4wbAP+2IgD/siIA/7cjAP+7JAD/uyQA/78l\n        AP/DJgD/xSYA/8klAP/PNRP/2SoB/3IVAP8AAAD/AAAA/wAAAK4AAADtAAAA/wEAAP9ECgD/cDEj/2Yj\n        Ff9WDgD/WhIA/1sSAP9cEgD/WRIA/yUIAP8YBQD/GQUA/xkFAP8aBQD/GgUA/xsFAP8hBwD/KAgA/x4G\n        AP8eBgD/HwYA/yQHAP8kBwD/IgYA/x8GAP8fBgD/HwYA/yAGAP8hBgD/JggA/yYIAP8jBwD/IwcA/yIH\n        AP8kBwD/KAgA/yIHAf8kCAH/JQgB/ygJAf8oCQH/LAkB/y4JAf8zCQD/NQoA/z0LAP+ZHQD/syIA/7Ah\n        AP+zIgD/uCMA/7skAP/AJQD/wiYA/8IkAP/JLQn/0Uws/9MoAP9wFQD/AAAA/wAAAP8AAACuAAAA7QAA\n        AP8BAAD/QwgA/3M4Kv+BTED/WBAC/1gPAP9aEQD/WxIA/10TAP8wCQD/FQQA/xkFAP8YBQD/GAQA/xkF\n        AP8ZBQD/IAcA/yUIAP8eBgD/HgYA/x0GAP8fBgD/HgYA/x0GAP8eBgD/HgYA/x4GAP8fBgD/HwYA/yMH\n        AP8mBwD/IAYA/yAGAP8gBgD/KwgA/y0JAP8fBgD/IgcA/yQHAP8jBwH/JQgB/ygJAf8uCgH/MgoB/y8J\n        Af9eEgH/sCIB/64hAP+0IgD/tCIA/7QiAP+3IwD/viUA/8AkAP+/IAD/zU8x/9FaPf/QJgD/bxUA/wAA\n        AP8AAAD/AAAArgAAAO0AAAD/AQAA/0AHAP9yOCv/lWph/3lAM/9UDQD/VgwA/1kQAP9dEQD/Sw4A/xgF\n        AP8XBQD/FwQA/xYEAP8YBQD/FwQA/x4GAP8nCAD/KAgA/ygIAP8mCAD/JQcA/yUHAP8kBwD/JQcA/yQH\n        AP8kBwD/IwcA/yMHAP8hBgD/IQYA/yAGAP8gBgD/HQUA/0UNAP81CgD/HQYA/yEHAP8iBwD/IgcA/yIH\n        AP8lBwD/LgkA/y8KAf8vCQH/bxYB/7QlBP+uIgH/sSIA/7MiAP+0IgD/tyIA/7ggAP+4HgD/yEUl/9d0\n        Xf/QXED/zSUA/20VAP8AAAD/AAAA/wAAAK4AAADtAAAA/wEAAP8/BwD/dDwv/5hvZv+YbWT/hVFF/2Yk\n        FP9ZEQD/Vw0A/1sOAP8vBQD/DgAA/xEAAP8RAAD/EgAA/xIAAP8XAQD/IQMA/yEDAP8dAgD/HgMA/yAD\n        AP8iAwD/IwMA/yIDAP8kBAD/JQQA/yUEAP8nBAD/KAQA/ygEAP8oBAD/KAQA/yUDAP9dDgD/MwYA/xgA\n        AP8cAgD/HAIA/x0CAP8eAgD/HwIA/ygEAP8qBAD/QgkA/50aAP+nHQD/qR4A/6weAP+uHgD/sh4A/7Uh\n        AP+5Lw7/yFY7/9V3Yv/Xe2X/0WFG/8wkAP9sFAD/AAAA/wAAAP8AAACuAAAA7QAAAP8BAAD/PgYA/3ZB\n        NP+ed3D/mnJp/552bf+bcmn/kWJX/4tYTf+KVEj/glNI/1pLSP9USkj/VEpI/1VKSP9VSkj/WUtI/2RN\n        SP9hTUj/X01I/15MSP9fTUj/ZU5I/2lOSP9fTUj/YExI/2BMSP9fTEj/Yk1I/2RNSP9lTkj/ZE1I/2VN\n        SP9nTkj/j1VI/29PSP9bTEj/X0xI/19MSP9eTEj/XkxI/2JNSP9nTkj/aE5I/59YSP/AXkj/vV5I/79e\n        SP/BX0j/xGBI/8hjTP/La1X/0Xpm/9aBbv/WfWn/2YFu/9FmTv/JIwD/bBQA/wAAAP8AAAD/AAAArgAA\n        AO0AAAD/AQAA/z0GAP97RTn/pYF5/596cv+genL/oXtz/6N9df+mf3b/poB3/6iAd/+ffnf/l313/5V8\n        d/+SfHf/jnt3/417d/+cfnf/j3t3/498d/+Le3f/jXt3/4l6d/+if3f/rYF3/6uAd/+pgHf/pYB3/5V9\n        d/+Ke3f/jHt3/4p6d/+Le3f/jXt3/6iAd/+SfHf/hnl3/4d6d/+Henf/h3p3/4h6d/+Ne3f/iXp3/6aA\n        d//Nh3f/yoZ3/8qGd//Lhnf/zId3/9OJeP/SiHb/0od1/9OFc//VhHL/14Vy/9iKd//RbFX/zCQA/24V\n        AP8AAAD/AAAA/wAAAK4AAADtAAAA/wEAAP88BQD/fko+/62Lg/+kgnv/poN7/6iDe/+ng3v/qIN7/6mD\n        e/+pg3v/qoR7/62Fe/+thXv/rYV7/6+Fe/+uhXv/roV7/6yEe/+shHv/qoR7/6iEe/+lg3v/sIV7/7WF\n        e/+0hXv/tIV7/7iGe/+mg3v/lYB7/5aAe/+Sf3v/lH97/5B/e/+thXv/loB7/4Z9e/+Ifnv/iX57/4l+\n        e/+Nfnv/jX97/5+Ce//FiXv/yop7/8qKe//Kinv/y4p7/82Ke//Oi3v/0It7/9OMe//UjHv/1Ix7/9aM\n        e//akoH/03Jc/8kkAP9sFQD/AAAA/wAAAP8AAACuAAAA7QAAAP8BAAD/PAQA/39OQv+wk43/q4uE/6yL\n        hP+ujIT/royE/66MhP+ujIT/royE/6+MhP+vjIT/sIyE/7CMhP+yjYT/s42E/7ONhP+zjYT/to6E/7aO\n        hP+3joT/t46E/7aNhP+4jYT/uI2E/7iNhP+4jYT/uY6E/7mOhP+3joT/to2E/7ONhP+yjYT/vI6E/6+M\n        hP+kioT/ooqE/56JhP+biIT/moiE/6mLhP/KkYT/yZGE/8qRhP/MkoT/zJKE/8yShP/Rk4T/0JKE/9GS\n        hP/Uk4T/1ZSE/9aUhP/XlIT/25mK/9N3Yv/GIgD/ahQA/wAAAP8AAAD/AAAArgAAAO0AAAD/AQAA/zoE\n        AP+BUkf/tp2W/7GUjf+ylI3/s5SN/7SVjf+0lY3/tJWN/7eWjf+1lY3/tJWN/7WVjf+2lY3/tpWN/7iV\n        jf+4lY3/uJWN/7mWjf+6lo3/upaN/7uWjf+7lo3/u5aN/72Wjf+9lo3/vZaN/72Wjf+/l43/wJeN/8CX\n        jf/Bl43/wpeN/8KXjf/FmI3/yJiN/8iYjf/HmI3/xZiN/8aYjf/KmY3/ypmN/8uZjf/MmY3/zZmN/8+a\n        jf/Qmo3/0ZqN/9Gajf/Tm43/1ZuN/9ebjf/YnI3/2pyN/92ilP/TfWn/wiEA/20VAf8AAAD/AAAA/wAA\n        AK4AAADtAAAA/wEAAP85AwD/hVdM/76mof+4nZf/uJ2X/7idl/+6nZf/up2X/7qdl/+8nZf/up2X/7qd\n        l/+7npf/vJ6X/72el/++npf/vp6X/76el/++npf/vp6X/8Cfl//An5f/wJ+X/8Cfl//Cn5f/wp+X/8Kf\n        l//Cn5f/w5+X/8Sfl//En5f/xJ+X/8Wfl//Gn5f/x5+X/8igl//JoJf/yqCX/8qgl//LoJf/zKGX/82h\n        l//OoZf/zqGX/8+hl//Sopf/0qKX/9Oil//Uopf/1KKX/9Wil//Yo5f/2qSX/9ykl//fqp7/04Nx/74g\n        AP9nEwD/AAAA/wAAAP8AAACuAAAA7QAAAP8BAAD/OQMA/4VXTP/Erqr/vaWg/76moP++pqD/vqWg/7+l\n        oP/ApqD/v6ag/8CmoP/ApqD/waag/8KmoP/CpqD/wqag/8SnoP/Ep6D/w6eg/8OnoP/Ep6D/xqeg/8an\n        oP/Gp6D/xaeg/8enoP/Hp6D/x6eg/8enoP/Hp6D/yKeg/8mnoP/Jp6D/yqeg/8qnoP/OqaH/zaig/82o\n        oP/NqKD/zqig/9CpoP/RqaD/0amg/9GpoP/TqqD/1Kqg/9SqoP/XqqD/2Kqg/9iqoP/YqqD/2aug/92r\n        oP/graH/4rOo/9GDcf+6HgD/ZBMA/wAAAP8AAAD/AAAArgAAAO0AAAD/AQAA/zkEAP91QjX/yLax/8Ou\n        qf/Drqn/xK6p/8Suqf/Erqn/x6+p/8euqf/Grqn/xq6p/8evqf/Hr6n/x6+p/8evqf/Ir6n/ya+p/8mv\n        qf/Jr6n/ya+p/8qvqf/Lr6n/y6+p/8uvqf/Lr6n/y6+p/82vqf/Nr6n/za+p/82vqf/Nr6n/zrCp/86w\n        qf/OsKn/0LGq/9Gwqf/SsKn/0rCp/9Oxqf/Tsan/1LGp/9Wxqf/Vsan/1rGp/9axqf/Ysan/2rKp/9qy\n        qf/asqn/27Kp/9yyqf/fs6n/4LSp/+W+tP/Hbln/tBoA/2MTAP8AAAD/AAAA/wAAAK4AAADtAAAA/wEA\n        AP86CQD/VxwO/8Cqpv/Mu7f/ybey/8m3sv/Kt7L/y7ey/823sv/Mt7L/zLey/8y3sv/Mt7L/zLey/823\n        sv/Ot7L/zrey/864sv/PuLL/z7iy/8+4sv/PuLL/z7iy/9C4sv/QuLL/0Liy/9C4sv/RuLL/0riy/9K4\n        sv/SuLL/0riy/9K4sv/TuLL/07iy/9S4sv/VubL/1rmy/9e5sv/XubL/17my/9e5sv/ZubL/2bqy/9m6\n        sv/aurL/27qy/926sv/durL/3bqy/966sv/gu7L/4buy/+O8s//kv7f/s0Io/7EdAP9cEgD/AAAA/wAA\n        AP8AAACuAAAA2gAAAP8AAAD/MQkA/0YFAP+NZV3/2c3K/9C/vP/Qv7z/0L+8/9G/vP/Rv7z/0r+8/9K/\n        vP/Sv7z/0r+8/9LAvP/TwLz/08C8/9PAvP/TwLz/08C8/9TAvP/UwLz/1MC8/9TAvP/VwLz/1sC8/9bA\n        vP/WwLz/1sC8/9fAvP/XwLz/18C8/9fAvP/XwLz/18G8/9jBvP/Ywbz/2cG8/9rBvP/awbz/28G8/9zB\n        vP/cwbz/3MK8/97CvP/ewrz/3sK8/9/CvP/fwrz/4cK8/+HCvP/iwrz/48O8/+TDvP/qz8n/zo1//6AZ\n        AP+xIgD/QAwA/wAAAP8AAAD/AAAAlQAAAK0AAAD/AAAA/xgFAP9KDAD/SQ4D/7GWkf/h19X/18nG/9fI\n        xf/YyMX/2MjF/9jIxf/YyMX/2MjF/9jIxf/YyMX/2MjF/9nIxf/ZyMX/2cjF/9nJxf/ZycX/2snF/9rJ\n        xf/aycX/2snF/9vJxf/bycX/28nF/9vJxf/cycX/3MnF/9zJxf/cycX/3MnF/9zJxf/dycX/3cnF/93J\n        xf/eycX/38rF/+DKxf/gysX/4MrF/+DKxf/hysX/4srF/+LKxf/jysX/48rF/+TKxf/ly8X/5cvF/+bL\n        xf/s19L/3ras/6IrE/+hGgD/mh4A/xADAP8AAAD/AAAA/wAAAGIAAABcAAAA/wAAAP8AAAD/MAkA/0gJ\n        AP9SGA//rpKL/+LY1//n3tz/5dvZ/+Xa2P/l2tj/5drY/+Xb2P/l2tj/5drY/+Xa2P/l2tj/5tvY/+bb\n        2P/m29j/5tvY/+bb2P/m29j/5tvY/+fb2P/n29j/59vY/+fb2P/n29j/59vY/+jb2P/o29j/6NvY/+jb\n        2P/o29j/6NvY/+jb2P/o29j/6dvY/+nb2P/q29j/6tvY/+rb2P/q29j/69zY/+vb2P/s3Nj/7NzY/+zc\n        2P/s3Nj/7t3Z//Df3P/v3tr/16yi/6I2IP+ZFgD/piAA/0EMAP8AAAD/AAAA/wAAAO4AAAAdAAAACQAA\n        AM8AAAD/AAAA/wUBAP82CgD/SwoA/0sJAP91Qjb/pYJ6/7ialP/ApZ//waWf/8Gln//BpZ//waWf/8Gl\n        n//BpZ//wqWf/8Kln//DpZ//w6Wf/8Oln//Epp//xaaf/8Wmn//Fpp//xaaf/8Wmn//Hpp//x6af/8en\n        n//Hp5//yKef/8mnn//Kp5//yqef/8qnn//Lp5//y6ef/8unn//Lp5//zaif/86on//QqJ//0Kif/9Co\n        n//RqJ//0qif/9Opn//UqZ//1qmg/9Kil//LkIL/sVpF/5UdBf+aGAD/nx8A/1IPAP8AAAD/AAAA/wAA\n        AP8AAACMAAAAAAAAAAAAAAA+AAAA+AAAAP8AAAD/AgEA/x0GAP81CQD/NgIA/zYBAP87BAD/PgYA/z8G\n        AP8/BgD/QAYA/0AGAP9BBgD/QQYA/0EGAP9CBgD/QwcA/0QHAP9FBwD/RQcA/0gIAP9JCAD/SQgA/0oI\n        AP9KCAD/SwgA/00JAP9NCQD/TgkA/1EJAP9SCgD/UgoA/1IKAP9SCgD/VAoA/1YLAP9WCwD/VwsA/1oM\n        AP9bDAD/XQwA/18MAP9fDAD/YQ0A/2MNAP9kDQD/Zw4A/2oPAP9rDgD/bgwA/24MAP9uEwD/XhIA/yYH\n        AP8AAAD/AAAA/wAAAP8AAADNAAAADgAAAAAAAAAAAAAAAAAAAFIAAAD2AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEA\n        AP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEA\n        AP8CAAD/AgAA/wIAAP8CAAD/AQAA/wEAAP8CAAD/AgAA/wIAAP8CAAD/AgAA/wIAAP8CAAD/AgAA/wIA\n        AP8BAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADTAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAA\n        ANMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACpAAAAFAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAIAAAAWQAAAK8AAADYAAAA5QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QEAAO0BAADjAAAA0AAAAJkAAAA6AAAAAAAA\n        AAAAAAAAAAAAAAAAAAD/////////////////////8AAAAAAAAB/gAAAAAAAAB8AAAAAAAAADgAAAAAAA\n        AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAGAAAAAAAAAAcAAAAAAAAAD4AAAAAAAAAfwAAAAAAAAHygAAAAwAAAAYAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAXgAA\n        AJMAAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAA\n        AJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAA\n        AJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACQAAAAVgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        ACUAAAC4AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAKkAAAAXAAAAAAAA\n        AAAAAAAAAAAALgAAAOMAAAD/AAAA/xkFAP8lBwD/JQcA/yYHAP8oCAD/KggB/ykIAP8sCAD/LQkA/y4J\n        AP8vCQD/MAkA/zEJAP8zCgD/MgoB/ycIAP8mBwD/JwcA/zELAv8yCgH/LwkA/zEJAP8wCQD/MQoB/zEK\n        Af8wCgH/MAsD/zALAv8wCwP/Lw4H/y8PB/8vDAT/LwwE/y8MBP8vDwj/LxEK/y8OBv8cCAP/AAAA/wAA\n        AP8AAADVAAAAHgAAAAAAAAARAAAA1QAAAP8IAgD/VBAA/4oaAP+PHAD/khwA/5YdAP+eHwD/oyAA/6cg\n        AP+tIQD/syIA/7cjAP+8JAD/wSUA/8YmAP/RKAD/siIB/48bAP+UHQD/lx0A/6giAv/PKwT/zCcB/8km\n        AP/GJgD/yicA/9MpAf/YKwP/1iwF/9gxC//WNhD/1TUQ/9UxC//ULgj/0y4I/9I2Ef/RPx3/0Ugo/9E8\n        Gf/JNxX/dSAM/wUCAf8AAAD/AAAAwQAAAAcAAABqAAAA/wMAAP9NDwD/eBcA/3EVAP9zFgD/dxcA/3oY\n        AP9/GQD/hRoA/4kbAP+PHAD/lR0A/5cdAP+dHgD/oh8A/6ohAP+iHwD/cRYA/24VAP91FwD/eBcA/3oX\n        AP+LGwH/pCAB/5gdAP+fHgD/piAA/64iAP+5IwD/zCsF/8UrBv+/JgP/xCQA/8smAP/MJwH/zScB/9A0\n        EP/QOhf/zz8e/880EP/QMw7/3TcR/38gCf8AAAD/AAAA/wAAAE0AAAC+AAAA/xsFAP9nFAD/YxMA/2QT\n        AP9mFAD/aBQA/2oUAP9sFQD/chYA/3cXAP97GAD/gRkA/4YaAP+MGwD/khwA/5UcAP9qFAD/XhIA/2ET\n        AP9kEwD/ZBMA/2kUAP9tFQD/bhUA/3QWAP95GAD/fRgA/4MZAP+JGgD/lB0A/5cdAP+dHgD/pyAA/68h\n        AP+zIgD/uiMA/80xDf/SORb/0DoX/9AuCf/PLQj/0C8K/9IwC/8rCgL/AAAA/wAAALEAAADnAAAA/zMK\n        AP9gEwD/XRIA/14SAP9gEwD/YhMA/2QTAP9mEwD/ahUA/24VAP9yFgD/eBcA/3UWAP+CGQD/hhoA/2oV\n        AP9LDgD/Tw8A/1URAP9SEAD/WBEA/10SAP9iEwD/ZBMA/2YTAP9oFAD/bRYA/3IWAP95FwD/excA/4IZ\n        AP+KGwD/kxwA/5odAP+eHgD/qiAA/84vC//VNhH/0TQP/9IrBP/RLAX/0CwG/94wCP9nFwT/AAAA/wAA\n        ANwAAADuAAAA/zYKAP9dEgD/WhIA/1sSAP9eEgD/XxIA/2ETAP9jEwD/ZxMA/2kUAP9sFQD/YhMA/3YX\n        AP93FwD/UhAA/0cOAP9HDgD/TQ8A/0wOAP9LDgD/Tw8A/1URAP9cEgD/WhIA/18SAP9iEgD/ZBMA/2cU\n        AP9wFgD/bxYA/3QWAP95FwD/gxkA/4gaAP+NGwD/lx0A/8EnA//OLQj/1zEL/9EuCP/RLAX/0isF/94v\n        Bv9wGAP/AAAA/wAAAOIAAADtAAAA/zYKAP9dEgD/WxIA/1wSAP9fEwD/YBMA/2ITAP9lEwD/ZhMA/2wU\n        AP9ZEQD/ahUA/3oYAP9QEAD/QA0A/0EOAP9EDgD/Rw4A/0UOAP9IDgD/Sg4A/1MQAP9jEwD/VhEA/1gS\n        AP9bEgD/XxIA/2ITAP9oFAD/ZhMA/20VAP9xFgD/ehcA/3wYAP+GGwH/khwA/6cgAP+cHgH/yCkE/7ol\n        Av+0IwH/yyoF/+EvBv9wGAT/AAAA/wAAAOEAAADtAAAA/zYKAP9eEgD/XBIA/1sSAP9dEgD/YBMA/2MU\n        AP9kFAD/aBMA/2UTAP9IDgD/VBEA/z8NAP87DAD/PAwA/zwMAP9ADQD/Qg0A/0IOAP9HDgD/Rw0A/1IP\n        AP9TDwD/UQ8A/1QQAP9WEQD/VxEA/2ATAP9fEgD/YBIA/2QTAP9qFAD/cRYA/3MWAP91FgD/kRsA/50f\n        Af+GGgD/ryEA/7IiAP+mIQL/1C0G/+IwB/9wGQX/AAAA/wAAAOEAAADtAAAA/zcKAP9fEgD/XBIA/1wS\n        AP9eEgD/YRMA/2UVAP9iDwD/YgcA/1UNAP9XEgD/QwQA/ysAAP82CAD/OgwA/zEAAP80AgD/PQ0A/0gO\n        AP9DBgD/QAUA/1gPAP9FCgD/QwIA/0oKAP9QEAD/UQ4A/04DAP9SCgD/WxMA/18TAP9jEwD/ZxQA/2gU\n        AP9gDAD/oCQG/6oiAv90FgD/jxsA/5QcAP+gIAH/1i4H/+QyCf9xGQX/AAAA/wAAAOEAAADtAAAA/zgK\n        AP9fEgD/XRIA/1wSAP9gEwD/YxQA/2EMAP+KRzf/wqCX/303Jv9hCQD/nHVs/6uZlf9GIRj/MwgA/52H\n        gv+McGn/NAUA/1QFAP+ATEL/ybq2/+fd2//c1NH/rZKM/1MZDv9DAwD/XSUX/7ablf+HVkv/UAgA/1oS\n        AP9gEwD/YRMA/1gEAP+KTD3/4qOU/7MeAf9lEwD/fhgA/34YAP+FGgD/uSkH/+kzCf9yGQT/AAAA/wAA\n        AOEAAADtAAAA/zgKAP9gEgD/XRIA/14SAP9iEwD/ZRQA/10GAP+lcmb//////5hWRv9WAAD/1crH////\n        //9YNS3/MgYA//Lw7//Nw8H/MwAA/6B1bP//////9OLe/8Snof/PubX//////9/W0/9bIBf/ajAi////\n        //+wkYr/RwAA/1cRAP9XEAD/TwIA/4dRRv/28O7/8Ma8/7caAP9+GAD/dxcA/4obAP+nIAH/tycF/+sz\n        Cf9zGQT/AAAA/wAAAOEAAADtAAAA/zgLAP9gEwD/XhIA/14SAP9iEwD/ZBQA/10HAP+gbWD//////5ZS\n        Qv9XAAD/yr+8//////9YMyr/OAgA/+jj4v/Dsa3/ZjYr//////+5l4//eRQF/0AAAP96CwD/sEAp//vu\n        6//GtbH/ZC0g//////+qioP/RAAA/08NAP9KAwD/m25m//7+/v//////57qw/7kbAP+nIAD/bhYA/6Yg\n        AP/aLAT/1y4H/+k1C/90GQT/AAAA/wAAAOEAAADtAAAA/zgLAP9hEwD/XhIA/14SAP9iEwD/ZBMA/14H\n        AP+gbWD//////5dSQv87AAD/xr68//////9cNCr/OAgA/+bj4v/Frqj/up6X/+jl5f9vFAD/dBEA/1kR\n        AP+YHQD/iQsA/7JkUv/9////iWVd//////+qjIX/QQAA/0kIAP+rjYb///////Hs6v/q4+H/2b22/50W\n        AP+0IgD/gBkA/6whAP/fLQT/3y4G/+oxB/91GQP/AAAA/wAAAOEAAADtAAAA/zkLAP9hEwD/XRMA/2AT\n        AP9jFAD/ZBMA/18HAP+hbWD//////4BOQv8iAAD/yr+8//////9aNCr/MwcA/+bj4v+9r6v/xrm2/87E\n        wv9nCwD/WxEA/40cAP95FwD/QgYA/5U6JP//////pImD///+/v+hg3z/OggF/72rpf//////5drW/3cz\n        Kf/RurX/zsG+/2sMAP+gHwD/pyAA/7UjAP/cLAT/4C4F/+wxBv92GAP/AAAA/wAAAOEAAADtAAAA/zoL\n        AP9hEwD/XhIA/2ATAP9jFAD/ZBQA/14HAP+hbWD//////1s+N/8UAAD/yb+9//////9MMCn/GgAA/+Xh\n        4P+8rqr/uKyp/+TW0/84AwD/WRAA/4sbAP9DDQD/PwIA/4xFNP//////l3ly//z6+v+3pJ//yLm1////\n        ///It7P/ThsT/04AAP/exb//0cG+/1cJAP+GGQD/qiEA/74kAP/dLAP/4S0E/+4wBP92GAL/AAAA/wAA\n        AOEAAADtAAAA/zoLAP9iEwD/XxIA/2ETAP9kFAD/ZRQA/14IAP+hbWD//////7quq/9YREL/v7Wz////\n        //9POzb/j4F///Tz8v+1qKT/dVtV//////9pUEn/WgAA/3IOAP8mAAD/YQkA/9e8tv/v39v/gUEy//b2\n        9////////////6WRjP83BwH/NwQA/zUCAP/Owb3/0cG+/0EEAP9XEQD/mR4A/7gkAP/fLAL/4y0D/+8w\n        BP93GAL/AAAA/wAAAOEAAADtAAAA/zoLAP9jEwD/XxIA/2ETAP9mFAD/ZhQA/14HAP+lcWT/////////\n        //+XhoL/v7Wz//////9eSUP//fz8//////+9tLL/RQUA/9bBvP/7+vn/tIN6/5RHN/93UUz/zriy////\n        //+wX03/hjIe//3////+/v7/kHhz/y0AAP8xBgD/NgoA/zYBAP/eysX/08jG/0AEAP9BDQD/ehcA/7ck\n        Af/gLAP/5CwA//IvAv94GAH/AAAA/wAAAOEAAADtAAAA/zoLAP9jEwD/YBMA/2ETAP9qFQD/ahUA/2EL\n        AP+MVEb/xL68/8e+vP9xW1b/kIF9/8W8uv9ONS7/tKmm/8rAvf+ZhH//MAEA/zQRDP+rm5j//Pv5////\n        ////////5eDe/5JbUP98BwD/fEEz/+rp6P9wUUv/KQAA/zQJAP83CwD/NwsA/zQEAP+9mI//uJmS/zUE\n        AP87CwD/SA4A/6AgAf/gLAL/3ioA//AtAP94FwD/AAAA/wAAAOEAAADtAAAA/zoLAP9kEwD/YBIA/2ET\n        AP9kFAD/ZxQA/2gTAP9QAgD/GgAA/x0AAP8aAAD/EwAA/xIAAP8YAAD/FAAA/yMAAP8rBAD/NAsA/yoF\n        AP8mAAD/cCUX/92aiv+fV0b/QA4E/zgCAP9xFAD/Ux4R/0ckG/8fAAD/KgAA/ykAAP8rAAD/LQAA/zIA\n        AP9/CQD/dQgA/0sHAP87DAD/OQwA/2oVAf/cKwH/3SkA/+wtAP93FwD/AAAA/wAAAOEAAADtAAAA/zkL\n        Af9lFAH/YBIA/2ESAP9jEwD/ZBEA/3QjD/+0d2n/oXht/5hxZ/+ObWX/jW1l/41tZf+NbWX/j3Bo/4tf\n        VP82DAH/MwoA/ysJAP8nAwD/VBkM//bj3/+7gHH/OQAA/zcLAP9IDwD/LQMA/1wrHv+UbmT/kGxi/5Bs\n        Y/+QbGP/jWti/5huY//Cd2X/vHlp/5hXR/84CAD/NwsA/1AQAP/TKQD/3yoA/+ksAP91FgD/AAAA/wAA\n        AOEAAADtAAAA/zoLAf9lFAH/YRMB/2ETAf9jFAH/YQ0A/4M4Jv/////////////7+f//+/j///r4///6\n        +P//+ff////8/+3Uzf88DwT/MggA/ygIAP8nAAD/tpOL///////57er/bCwf/zQEAP88DAD/JAAA/51z\n        af///////vf1//vv7v/78O7/+vDt//zx7//38e////r5/9CwqP89BQD/NQoA/1wSAP/SKAD/2ioA/+ct\n        AP9zFgD/AAAA/wAAAOEAAADtAAAA/zoLAP9kEwD/YBIB/2ITAf9oFQH/YxAA/30tGv/Zu7T/mGtg/zQJ\n        BP81DgT/OQ4E/zwPBP87DwT/PQ8E/zwPA/8xCgD/NgsA/yEAAP9eNCv//Pn4/9/Buv/6+Pf/vJyV/y8A\n        AP8zCQD/JgMA/3hNQ//GtK//ZTUq/0MKBP9HEQT/VhQE/50kB/+sKQn/nyQH/3sbBP85CwD/WxIA/7wk\n        AP/QJwD/0CgA/+gsAP90FgD/AAAA/wAAAOEAAADtAAAA/zkLAP9iEwD/XxIA/2ASAP9lFAD/YRAB/3Qk\n        Ef+xeGr/kGxk/41uZ/+Nbmb/jm5m/5FuZv+Qbmb/kW9n/4RfVf82DAL/MwcA/zUEAP/Rta7//PTy/1Yb\n        Ef+/k4j//////2U5L/8lAAD/KAUA/14wJf+YbmP/kGxj/5FtZP+QbGP/nXBl/794Z//CeGf/wXxs/5VY\n        Sf9mEQD/xiYA/9YpAP/PKAD/0SgA/+MsAf9zFgD/AAAA/wAAAOEAAADtAAAA/zkLAP9iEwD/XhIA/18S\n        AP9iEwD/XQwA/3w0I//48e////38/////////////////////////////////+za1f8+EAT/KwAA/4JR\n        RP//////pXpv/yoAAP95Jxb/9urm/9XCvf8uBAD/HgAA/5BoXv/++fj/+/f2//z49//9+Pf//Pj3//j3\n        9//49/f/+////+K5sP/AHQD/zCcB/8wnAP/SKQD/1CkA/+EsAf9wFgH/AAAA/wAAAOEAAADtAAAA/zkL\n        AP9iEwD/XhIA/2ATAP9iEwD/YREA/2sdCv97U0r/VDMr/y8SDP8zEwz/OxYM/0UYDf9HGA3/RhgN/0gX\n        C/80CQH/Qw4E/+rc2f/q2tb/SRAJ/zgIAP9SAgD/o3Nn//////+KX1T/GgAA/00mHf9xUkr/SSMZ/0EU\n        DP9TGgz/jycN/6YrDv+mKw7/qiwP/8YwDP/BJQD/xicB/8gmAP/MJgD/zycA/94qAP9wFQD/AAAA/wAA\n        AOEAAADtAAAA/zkLAP9iEwD/XRIA/14SAP9fEwD/XQ0A/3ovHf/59vX/28nF/5eHiP+cjIj/oI2I/6iP\n        if+pj4n/p5GL/5l7dP8vAQD/poF4//////+DVUv/MQAA/zsMAP9bEAD/TAwC/+XSzv/u5OL/MxEN/4xn\n        Xv/+/v7/u6ah/6eJh/+tjob/1ZaH/+SZh//gmIf/5J+P/95+Z/+8IAD/wiUA/8UmAP/JJgD/zScA/94q\n        AP9vFQD/AAAA/wAAAOEAAADtAAAA/zkLAP9gEwD/XBIA/1wSAP9eEgD/XQ4A/2opGf/e0s//6+bl//Hr\n        6f/x6+r/8uzr//Pt7P/17uz/+PHv/9zGwv9bJBj/4dTQ/8iup/80AwD/OQsA/zgLAf9cEgH/PAMA/3RF\n        Of/u5uT/g2BX/3xUSv/q5OL/7ujn//Hs6v/x6+r/6+np//Ls6v/07On/9/Ty/+S0qP+6HAD/vyQA/8El\n        AP/FJgD/yCYA/9wqAP9vFQD/AAAA/wAAAOEAAADtAAAA/zYLAP9dEwD/WxIA/1wSAP9cEgD/YBMA/zoM\n        Af8lDAb/KA0G/ygNBv8mDAb/Kw4G/zYQBv83EAf/OREH/zUOBf8yDgX/OBUM/zQIAP8zCAD/NgsA/zMK\n        Af9VEQH/ThAB/zgIAP9CEwf/MREJ/ykKAv8wDwf/MA8G/zcQB/8/EQf/PBEH/2UaB/+wKAf/uisI/7ko\n        Bv+7IwD/vSQA/78lAP/FJgD/yiYA/90qAP9xFgD/AAAA/wAAAOEAAADtAAAA/zUKAP9gFwX/WxIA/1sS\n        AP9bEgD/XRIA/zIKAP8XAgD/GAIA/xkDAP8bAwD/HwQA/ycGAP8fBAD/IAQA/yEFAP8mBwD/IwUA/yYG\n        AP8pCAD/KgkA/ygIAP9EDQD/OAwA/y8JAf8xCAD/JQcA/yIHAP8nBgD/JwYA/ysGAP8yBwD/NQcA/zYI\n        AP+VGgD/tSAA/7UhAP+7JAD/vSUA/8ElAP/FJQD/yykC/9wuBf9tFAD/AAAA/wAAAOEAAADtAAAA/zMI\n        AP9sKRn/XhgH/1gQAP9bEgD/XhMA/zIKAP8WBQD/GQUA/xkFAP8bBQD/HQYA/ycIAP8fBgD/HgYA/yEH\n        AP8jBwD/IAYA/x8GAP8fBgD/IAYA/yUHAP8nCAD/IgcA/yIHAP8lCAD/JggA/yIIAf8mCAH/KAkB/yoJ\n        Af8uCgH/MwoA/zwLAP+YHQD/tCIA/7MiAP+4IwD/vSQA/8ImAP/CIgD/zT0b/9g1D/9qEwD/AAAA/wAA\n        AOEAAADtAAAA/zAFAP93Oiz/eUEz/1QLAP9YDwD/XhIA/0UNAP8VBAD/GQUA/xcFAP8YBQD/GwUA/yUI\n        AP8iBwD/IAcA/x8GAP8fBgD/HwYA/yAGAP8gBgD/HwYA/yIHAP8iBwD/HwYA/x8GAP8wCgD/JwgA/yEH\n        AP8jBwD/IwcA/yYIAf8vCgH/LwoB/04QAf+tIgH/sSIA/7QiAP+0IgD/uiMA/7wfAP/DLwz/0mNJ/9M1\n        D/9oEgD/AAAA/wAAAOEAAADtAAAA/y4EAP92PC//mW9l/3lBNP9dFwn/VwsA/1YLAP8iAgD/DgAA/xAA\n        AP8RAAD/EgAA/x8BAP8iAgD/IAEA/yABAP8gAgD/IAIA/yECAP8jAgD/JAIA/yQCAP8jAQD/IgEA/yAB\n        AP9JCQD/IgIA/xkAAP8bAAD/HAEA/x4BAP8nAwD/KQMA/3IRAP+sHQD/rB0A/68cAP+yHAD/tSAA/743\n        Gf/SaVH/13Ve/9E0D/9mEQD/AAAA/wAAAOEAAADtAAAA/y0DAP95QTX/nnhw/552bf+WamD/hlJH/4VL\n        P/91ST7/TUE+/0xBPv9MQT7/TUE+/1hDPv9ZRD7/VUM+/1ZDPv9eRD7/X0U+/1pEPv9aRD7/WUQ+/11E\n        Pv9eRT7/XUQ+/2BFPv+ASz7/W0Q+/1RCPv9WQz7/VkM+/1lDPv9cRD7/dEg+/7dVPv+7Vj7/vVY//8BX\n        Pv/EWUH/ymhS/9R+av/XgGz/13tm/881Ef9mEQD/AAAA/wAAAOEAAADtAAAA/ysCAP+ARzr/p4R8/6J8\n        dP+kf3b/poJ6/6iDev+qg3r/oYF6/52Aev+bgHr/mYB6/6CBev+egXr/moB6/5V/ev+Vf3r/roR6/7KE\n        ev+vhHr/p4J6/5B+ev+Pfnr/jH16/49+ev+lgnr/jX56/4h9ev+JfXr/iX16/41+ev+Rfnr/wYd6/82J\n        ev/LiXr/zIl6/9CKev/Ti3r/04l4/9SHdf/XiHX/14Vy/9A4FP9nEQD/AAAA/wAAAOEAAADtAAAA/ysB\n        AP+BTEH/rpCJ/6mIgf+riYH/rImB/6yJgf+siYH/romB/7CKgf+xioH/s4qB/7OKgf+0ioH/tIqB/7OK\n        gf+zioH/toqB/7eKgf+3ioH/t4uB/66Jgf+siYH/qIiB/6WHgf+yioH/m4aB/5WFgf+UhIH/k4SB/5mF\n        gf+7jIH/y46B/8uPgf/Lj4H/zo+B/9CQgf/Rj4H/1JGB/9WRgf/XkoL/2pB//845Fv9lEAD/AAAA/wAA\n        AOEAAADtAAAA/yoBAP+DUkf/t5yW/7GUjf+zlI3/tJSN/7SUjf+1lI3/tJSN/7WVjf+2lY3/t5WN/7iV\n        jf+4lY3/uZaN/7qWjf+7lo3/u5aN/7yWjf+9lo3/vZaN/8CWjf/Blo3/wZaN/8KXjf/Dl43/xJeN/8SX\n        jf/Cl43/wpeN/8aYjf/MmY3/y5mN/82Zjf/PmY3/0JqN/9Gajf/Tmo3/1puN/9ibjf/anI//25qL/8o5\n        F/9kEAD/AAAA/wAAAOEAAADtAAAA/ygAAP+IWU7/wKmk/7qgmv+6oJr/u6Ca/7ygmv+8oJr/vKCa/7yg\n        mv++oJr/v6Ca/8Chmv/AoZr/wKGa/8Ghmv/CoZr/wqGa/8Ohmv/EoZr/xKGa/8Shmv/FoZr/xqGa/8ai\n        mv/Hopr/yaKa/8uimv/Mo5r/zKOa/86jmv/OpJr/z6Sa/9Ckmv/SpJr/06Sa/9Wlmv/VpZr/16Wa/9qm\n        mv/fqJz/3qWX/8Y6Gv9fDgD/AAAA/wAAAOEAAADtAAAA/ygAAP+GVkv/yLWx/8Grpv/Cq6b/wqum/8Sr\n        pv/Eq6b/xKum/8Wspv/FrKb/xaym/8aspv/HrKb/x6ym/8ispv/Jrab/ya2m/8mtpv/Jrab/y62m/8ut\n        pv/Lrab/y62m/8ytpv/Mrab/zq6n/9Cupv/Qrqb/0a6m/9Gupv/Trqb/1K6m/9Wvpv/Wr6b/16+m/9mv\n        pv/ar6b/2rCm/92wpv/itKn/36yg/78zEf9dDgD/AAAA/wAAAOEAAADtAAAA/ycCAP9tNij/zLq2/8q4\n        tP/Jt7L/yrey/8y3sv/Mt7L/zLey/8y3sv/Nt7L/zbey/863sv/OuLL/z7iy/8+4sv/PuLL/0Liy/9C4\n        sv/QuLL/0Liy/9G4sv/SuLL/0riy/9K4sv/TuLL/1Liy/9S4sv/WubL/17my/9e5sv/YubL/2rmy/9q5\n        sv/aurL/3Lqy/926sv/eurL/37qy/+G7sv/mxb3/0Ix8/7EeAf9ZEQD/AAAA/wAAAOEAAADTAAAA/xoF\n        AP9ICAD/ooN7/9zQzv/Swb7/08K+/9TCvv/Uwr7/1MK+/9TCvv/Uwr7/1cK+/9XCvv/Vwr7/1cK+/9bC\n        vv/Wwr7/1sK+/9fDvv/Yw77/2MO+/9jDvv/Zw77/2cO+/9nDvv/Zw77/2sO+/9rDvv/bw77/3MO+/93E\n        vv/dxL7/3sS+/9/Evv/fxL7/4MS+/+LEvv/ixL7/48W+/+bKxP/nx8D/r0Mr/6kaAP8yCgD/AAAA/wAA\n        AMcAAACKAAAA/wUBAP86CAD/VBgO/7eemf/k29n/49jX/+LW1P/i1tT/4tbU/+LW1P/i1tT/4tbU/+PW\n        1P/j1tT/49bU/+PW1P/j1tT/49bU/+TX1P/k19T/5NbU/+XW1P/l1tT/5dbU/+XW1P/l1tT/5tfU/+bX\n        1P/n19T/59fU/+jX1P/o19T/6NfU/+nX1P/q19T/6tjU/+vX0//s2dX/7t3Z/+nQy/+2X0z/ohcA/30Y\n        AP8DAQD/AAAA/wAAAHIAAAAsAAAA9wAAAP8PAwD/PAYA/1IRBv+EVUv/tpaQ/8aqpP/IrKb/x6yl/8is\n        pf/IrKX/yKyl/8ispf/JrKX/yayl/8qspf/LrKX/zKyl/8yspf/MrKX/za2l/82tpf/OraX/z62l/9Ct\n        pf/QraX/0K6l/9Gupf/SrqX/0q6l/9Supf/WrqX/1q6l/9evpf/Yr6X/2q+l/9ywpv/ZqZ7/yIR0/6c8\n        JP+aFgD/ghkA/xUEAP8AAAD/AAAA6wAAABcAAAAAAAAAZgAAAP8AAAD/BQEA/x4EAP8kAAD/JgAA/ysD\n        AP8sBAD/LQQA/y0EAP8tBAD/LgQA/y4EAP8vBAD/MAUA/zEFAP8yBQD/MwUA/zMFAP80BQD/NQYA/zYG\n        AP83BgD/OQYA/zkGAP85BgD/OgcA/zwHAP88BwD/PggA/z8IAP9BCAD/QwgA/0QJAP9FCQD/RwkA/0oK\n        AP9LCQD/TAUA/00JAP84CwD/BgEA/wAAAP8AAAD6AAAATQAAAAAAAAAAAAAAAAAAAGIAAADxAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOYAAABMAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAhAAAAgAAAAM8AAADnAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAA\n        AO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAA\n        AO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gEAAOYAAADKAAAAdQAAABoAAAAAAAAAAAAA\n        AAD///////8AH+AAAAAABwAfwAAAAAADAB+AAAAAAAEAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAA\n        AAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAA\n        AB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAA\n        AAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAA\n        AB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAA\n        AAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAA\n        AB+AAAAAAAEAH8AAAAAAAwAf4AAAAAAHAB8oAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAI4AAADjAAAA7wAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADvAAAA3AAAAHkAAAAGAAAAAAAAAA8AAADFAwAA/y4JAP9FDQD/Rg0A/0sPAf9ODwD/URAA/1UQ\n        AP9YEQD/WxEA/2ATAP9LDwD/RQ0A/1IRAv9fEwL/XREA/1wSAP9eEwH/XhQC/10VBf9dGQn/XBkK/1sX\n        B/9aFwj/Wh4Q/1sdDv8zDwb/AAAA/wAAAKgAAAACAAAAiQAAAP9GDgD/gRkA/4YaAP+MGwD/lR0A/5we\n        AP+lIAD/rSEA/7MiAP/AJQD/sCIA/4QaAP+IGgD/kh0B/7ckAv+5JAD/uSQA/8QmAP/UKgL/2TAI/9Qv\n        CP/ZLQX/2isD/9o0Dv/aQh//2z4a/9Y3Ev9lGgj/AAAA/wAAAGQAAADYGgUA/2YUAP9jEwD/ZRQA/2gU\n        AP9tFQD/dBcA/3wYAP+DGQD/jhwA/44bAP9hEwD/XBIA/2ETAP9lFAD/bBUA/3IWAP95FwD/gBkA/40b\n        AP+WHQD/nx4A/6whAP+0IQD/yS4J/9M7F//QMAv/1C4I/84vCv8fBwL/AAAAvAAAAO0nCAD/XxMA/1sS\n        AP9eEgD/YRMA/2UTAP9qFAD/bBUA/3cXAP91FwD/VBEA/0gOAP9OEAD/ThAA/1cRAP9dEgD/YBMA/2UT\n        AP9qFQD/chYA/3YXAP+BGQD/jRsA/5QdAP+9KAX/1TIM/9MuCP/RKwX/2i4H/z0NAv8AAADgAAAA7ScH\n        AP9eEgD/XBIA/14TAP9iEwD/ZRMA/2cUAP9bEgD/ahUA/0gPAP89DAD/RA4A/0QOAP9HDgD/UA4A/1sR\n        AP9XEQD/WxIA/2ETAP9lEwD/aRQA/3MWAP97GAD/hRkB/6IfAf+rIgH/wCYD/70nA//dLwb/PQ0C/wAA\n        AOEAAADtJwcA/18SAP9cEgD/XxMA/2QVAP9jDAD/WwwA/04OAP8yAAD/NwsA/zQEAP85BwD/QwsA/z8C\n        AP9SEAL/SgoB/0cFAP9READ/UgcA/1cOAP9gEwD/aBQA/2kSAP91EQL/oyID/4UZAP+cHgD/tSUD/+Iy\n        CP89DgP/AAAA4QAAAO0nBwD/YBIA/10SAP9hEwD/YQ0A/6d0aP+WXE7/dS8e/62bl/8+Fgz/hWtk/3BQ\n        Sf9SDwP/tJaP/93PzP/QxsP/hV9X/0YEAP+mhX3/czsu/1YMAP9aDQD/XA4D/7uLf/++RSn/bhAA/34Y\n        AP+ZHwL/3jEJ/z8OAv8AAADhAAAA7SgIAP9hEwD/XxIA/2MTAP9eCAD/z7Wv/7uNgv+BQzP/+fz9/0gf\n        FP+5qaX/noB6/7minf/Vs6r/fD0u/61dSv/539n/hl5V/9jKx/+HWU7/RAAA/1gTCf/KtK7//////8dF\n        Jv+GFAD/kBwA/8gpBP/hMQn/Pw4C/wAAAOEAAADtKAgA/2ITAP9fEwD/YxMA/18IAP/PtK7/tYyC/2w+\n        Mv/7+/z/Sx8U/7Oinv/KtbD/zsC8/3EUB/9kCgD/gAcA/6lbTf/Nvrr/28/M/3pMSP9SFgz/3dDM/+3k\n        4v/l3tz/qkIp/54ZAP+kIAD/4i4F/+cxB/9ADgL/AAAA4QAAAO0oCAD/YhMA/2ATAP9jFAD/XwgA/9O1\n        rv+VgoL/Vjcy//79/P87GRT/qZyc/8vCvv/ItbP/SwQA/34XAP9HBAD/gj83/9fHw//Zzcv/n4N8/+Xe\n        3P/Pwb3/ZiMW/9jGxP99Pi//lhcA/7wkAP/eLQT/6TAF/0ANAv8AAADhAAAA7SkIAP9jEwD/YRMA/2UU\n        AP9fCQD/y6yk/97c3P+Cbmn/7uzs/3JhXP/t6+v/m4WA/9HEwf+JY1j/agkA/0MNAv/Usqr/v5KI/9XC\n        vf//////q5mU/zUFAP89CgP/287K/2o7L/9mDgD/tiMA/+EtA//sLwT/QQ0B/wAAAOEAAADtKQgA/2QT\n        AP9iEwD/ZxQA/2ILAP+rh37/39/f/4V0cP+/t7X/g3Ju/+nm5f97WVP/XjUu/+DV0//hx8H/29PR/8uu\n        p/+DHwv/08TA/4t0bv8oAAD/LgQA/zwOBP/Jrab/XDEn/z0HAP+ZHgH/4iwB/+wtAf9CDQD/AAAA4QAA\n        AO0pCAD/ZBMA/2ETAP9lEwD/axUA/1UTA/81DgT/LwwD/y0MBP8tDAP/Nw4E/zYMAf8lAQD/PA0F/9Gb\n        jf+SXE7/OgIA/1wRAv9NJx7/MQQA/zkNAv86DgP/RRAC/4sgB/9hFgP/NAoA/14TAP/aKgH/6CwA/0EM\n        AP8AAADhAAAA7SkIAf9lFAH/YRMB/2AOAP9+MR7/7NfR/97Lxv/UxMD/08O//9jJxv/DpZ//PQ8D/yYD\n        AP8+FQ//8eXi/7eMhP82AAD/MgEA/21IQ//g1dH/0b66/8++uv/Vv7r/6MnC/7yRhv80BQD/Tw8A/9Qp\n        AP/lLAD/PwwA/wAAAOEAAADtKQgA/2QTAP9iEwH/ZBAA/30tGf/EmY//c05F/2ZEO/9sRj3/bUg//2Q8\n        M/83DAH/JQAA/6mOiv/dyMP/59fT/10yLP8hAAD/ZDwy/6iFff9vQzj/ckY7/6hTPv+9WkL/ij8t/04O\n        AP+tIQD/0ygA/+ArAP8/DAD/AAAA4QAAAO0oCAD/YhMA/18SAP9fDgD/eS0b/9i5sf/dx8P/38jC/9/I\n        w//kzsj/yqmi/zQFAP9fMiz/8ePe/1cgGf+8i4L/x7Ov/x4AAP9nQDb/2L+4/9jCvf/Zwr3/48a//+nO\n        yP/Il4v/sRwA/9UoAP/TKQD/3CsB/z4MAP8AAADhAAAA7SkIAP9iEwD/YBMA/18QAP9zJRP/pIZ//2ZN\n        R/9gRT//bklB/3NMQ/9pPzX/NwYA/9C7tv+rioX/MQAA/2ccDv/s3Nf/cE1H/1EtJf+ZgHn/aEQ8/4pN\n        P/++WED/vFtD/8xPMf/GJQD/yCYA/84nAP/aKgD/PQwA/wAAAOEAAADtKAgA/2ETAP9dEgD/Ww0A/3Mt\n        HP/p393/29TS/9bOzP/b0c7/4tjW/8Kqo/98UEb/4c/L/0YWD/88CQD/TQQA/45oYf/Js67/eVZO//Hs\n        6//Zzsv/3c/M/+zSy//w2tb/4qWW/7weAP/CJQD/yCcA/9cpAP89DAD/AAAA4QAAAO0nCAD/XxMB/1wS\n        AP9fEgD/RRAC/ysVEP8yGhX/MxsV/z0dFf9AHhb/PBkQ/zsXDf85FA3/LwcA/zULAf9REAH/PQoD/0Qd\n        FP8uEQn/ORoS/0EeFf9FHhX/XyMV/7M1Fv+9MRD/uyMA/78lAP/GJgD/1ykB/z0MAP8AAADhAAAA7ScJ\n        Af9oIRD/WRAA/18TAP88DAD/EgEA/xYBAP8YAQD/IQMA/xsCAP8eAwD/IQUA/x4DAP8jBwD/JggA/y4K\n        AP8lBwD/JQUA/yIGAf8kBAD/JwUA/y0FAP84BwD/nRoA/7YgAP+7JAD/wSQA/8cpBv/VNA//OgoA/wAA\n        AOEAAADtIwYA/39GOf9lIxT/VwoA/0cJAP8TAAD/EgAA/xMAAP8dAgD/HgIA/x4CAP8dAQD/HAEA/xwB\n        AP8eAgD/HAIA/x0BAP8tBAD/HAEA/x4CAP8hAgD/JgMA/00LAP+tHgD/sh0A/7QdAP+7HwD/zE0v/9NF\n        Iv84BwD/AAAA4QAAAO0gAwD/i1hN/5dsYv97QzX/dDQl/0ssJf80JyX/NSgl/0AqJf9DKyX/QSsl/0cs\n        Jf9HLCX/Riwl/0crJf9HKyX/Ti0l/2EwJf8+KiX/QCol/0EqJf9ILCX/jjkl/7lCJf+5QSX/v0Up/8pe\n        Rf/YgGv/0Ucn/zcGAP8AAADhAAAA7SADAP+SY1j/qIZ+/6iFfP+phHv/qIN7/6GCe/+fgnv/ooJ7/6CC\n        e/+bgXv/o4J7/7CEe/+uhHv/moF7/5F/e/+WgHv/n4J7/4h9e/+IfXv/in57/6mEe//Oinv/zIp7/8+L\n        e//TjHz/1o17/9mOff/RTS7/NwUA/wAAAOEAAADtHwIA/5pwZv+zlo//sZCJ/7KRif+zkYn/tZGJ/7eS\n        if+4kon/uZKJ/7qSif+6kon/u5KJ/7ySif+8kon/u5KJ/7qSif+8k4n/tJGJ/7CQif+2kon/y5aJ/82W\n        if/Olon/0ZeJ/9SXif/XmIn/3J6Q/9BSNf81BAD/AAAA4QAAAO0eAQD/o310/8Coo/+8oZz/vaKc/76i\n        nP++opz/v6Kc/8GinP/Bopz/wqOc/8OjnP/Do5z/xaOc/8ajnP/Ho5z/yKSc/8qknP/OpZz/z6Wc/9Cl\n        nP/QpZz/0aWc/9OmnP/Vppz/16ec/9qonP/isKX/y1Y7/zICAP8AAADhAAAA7RoAAP+Yb2X/0L+8/8ey\n        rv/Js67/ybOu/8qzrv/Ks67/y7Ou/8y0rv/MtK7/zbSu/860rv/OtK7/z7Su/9C0rv/QtK7/0bSu/9O1\n        rv/Vta7/1bWu/9e1rv/Ytq7/2bau/9y2rv/dtq7/4Lmw/+S8s/++QiT/MAQA/wAAAOEAAADZDwAA/18o\n        HP/Murb/3tLQ/9rLyP/ay8j/2svI/9vLyP/by8j/28vI/9zLyP/cy8j/3czI/97MyP/ezMj/38vI/97L\n        yP/fzMj/4MzI/+HMyP/izMj/48zI/+TNyP/lzcj/5s3I/+jPyf/u2NT/0It7/58aAP8YBAD/AAAAvgAA\n        AIwAAAD/JgAA/2w2K/+4mpP/zbWv/8+1r//Ota//z7Wv/8+1r//Qta//0bav/9K2r//Stq//07av/9S2\n        r//Ut6//1rev/9a3r//Xt6//2Lev/9q3r//cuK//3Liv/964r//gubD/4LWr/8iAb/+gIwn/SgwA/wAA\n        AP8AAABnAAAAEQAAAMcCAAD/EAAA/xwCAP8lCgP/JwsE/ygLBP8oCwT/KAsE/ykMBP8qDAT/LAwE/ywM\n        BP8tDAT/LgwE/y8NBP8wDQT/MA0E/zINBP8zDQT/NA4E/zYOBP83DgT/OA8E/zsPBP88CwL/OAIA/yIF\n        AP8AAQD/AAAAqwAAAAMAAAAAAAAAEQAAAIwAAADcAAAA7AAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO4AAADsAAAA1gAAAHcAAAAHAAAAAP////+AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABKAAAABAAAAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAA4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAAgAAAD/PQwA/2YUAP9uFQD/ehcA/4gaAP9yFgD/ZxQB/4IZAf+JGgD/lR8E/5ch\n        Bv+aJAj/ni4V/14YCP8AAAD/AAAA/2MTAP9pFAD/cRUA/4EYAP9+GAD/WhEA/14QAP9tFAD/ehcA/4sb\n        AP+dHQD/vCcD/+A1Df/SLQf/AAAA/wAAAP9cEgD/YRMA/2QSAP9SEAD/PAwA/zsGAP9WHhD/VhgJ/1IL\n        AP9gEwH/Zw4A/4wbAP+jIAH/xCkF/wAAAP8AAAD/XhEA/2kbB/9SEAD/UhAA/1IQAP87BgD/UhAA/50d\n        AP+dHQD/UhAA/50dAP9SEAD/hhIA/8AoBf8AAAD/AAAA/18RAP9sHQn//////////////////////1IQ\n        AP//////UhAA//////9SEAD//////6YXAP/dLQX/AAAA/wAAAP9hEgD/ZxQA/825tP9SEAD/UhAA/50d\n        AP8tDgb//////zsGAP//////phcA//////98EwD/4SwC/wAAAP8AAAD/YBAA/3IhDv//////////////\n        ////////ciEO//////9SEAD//////6YXAP//////UREB/9EnAP8AAAD/AAAA/14PAP94Khj/zbm0/3Ih\n        Dv9SEAD/LQ4G/1IQAP//////ciEO//////+mFwD//////6MhAv/TKAD/AAAA/wAAAP9cDgD/biUT////\n        //////////////////9SEAD//////825tP//////zbm0///////KKQP/yiUA/wAAAP8AAAD/XxMB/0sL\n        AP8jEAv/LxUP/zIUDP9yIQ7/JgEA/zEFAP8tDgb/MRQM/0kaD/+tKgv/wCEA/8cpA/8AAAD/AAAA/39G\n        Ov9pLB7/MRoW/y4aFf81HBb/OB0X/zgeGP86Hhj/PB4W/y0bFv9bIxb/tDMW/8RDJf/LUTX/AAAA/wAA\n        AP+eeG//sY+H/6uJgv+piYL/qomC/7GKgv+vioL/qYmC/6aIgv+fh4L/wo2C/9CQgv/YmYr/z3Fb/wAA\n        AP8AAAD/sJCJ/825tP/Jsaz/y7Ks/82yrP/Osqz/0LKs/9KzrP/Vs6z/2LSs/9m0rP/atKz/5MC4/9B+\n        a/8AAAD/AAAA/2tGPv/Jsaz/y7Ww/8u0r//MtK//zrWv/8+1r//Qta//0bWv/9S2r//Xtq//2rmy/9ur\n        of+LNyT/AAAA/wAAADcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAACsAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA\n        rEEAAKxBAACsQQAArEEAAKxB\n</value>\n  </data>\n  <metadata name=\"$this.TrayHeight\" type=\"System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>92</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/NotificationWindow/ContractsWindow.Designer.cs",
    "content": "﻿using EVEMon.CharacterMonitoring;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.NotificationWindow\n{\n    partial class ContractsWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.contractsList = new CharacterContractsList();\n            this.SuspendLayout();\n            // \n            // contractsList\n            // \n            this.contractsList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.contractsList.Grouping = ContractGrouping.State;\n            this.contractsList.Location = new System.Drawing.Point(0, 0);\n            this.contractsList.Name = \"contractsList\";\n            this.contractsList.Size = new System.Drawing.Size(292, 266);\n            this.contractsList.TabIndex = 0;\n            // \n            // ContractsWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(292, 266);\n            this.Controls.Add(this.contractsList);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"ContractsWindow\";\n            this.Text = \"Notification Details\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private CharacterContractsList contractsList;\n    }\n}"
  },
  {
    "path": "src/EVEMon/NotificationWindow/ContractsWindow.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.NotificationWindow\n{\n    public partial class ContractsWindow : EVEMonForm\n    {\n        private readonly bool m_init;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ContractsWindow\"/> class.\n        /// </summary>\n        public ContractsWindow()\n        {\n            InitializeComponent();\n            RememberPositionKey = \"ContractsWindow\";\n            m_init = true;\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping mode.\n        /// </summary>\n        internal Enum Grouping\n        {\n            get { return contractsList.Grouping; }\n            set\n            {\n                contractsList.Grouping = value;\n\n                if (!m_init)\n                    return;\n\n                contractsList.UpdateColumns();\n                contractsList.Visibility = contractsList.Contracts.Any();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the showIssuedFor mode.\n        /// </summary>\n        internal IssuedFor ShowIssuedFor\n        {\n            get { return contractsList.ShowIssuedFor; }\n            set\n            {\n                contractsList.ShowIssuedFor = value;\n\n                if (!m_init)\n                    return;\n\n                contractsList.UpdateColumns();\n                contractsList.Visible = contractsList.Contracts.Any();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of contracts to display.\n        /// </summary>\n        internal IEnumerable<Contract> Contracts\n        {\n            get { return contractsList.Contracts; }\n            set { contractsList.Contracts = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of displayed columns.\n        /// </summary>\n        internal IEnumerable<IColumnSettings> Columns\n        {\n            get { return contractsList.Columns; }\n            set\n            {\n                contractsList.Columns = value;\n\n                if (!m_init)\n                    return;\n\n                contractsList.UpdateColumns();\n                contractsList.Visibility = contractsList.Contracts.Any();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/NotificationWindow/ContractsWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/NotificationWindow/IndustryJobsWindow.Designer.cs",
    "content": "using EVEMon.CharacterMonitoring;\n\nnamespace EVEMon.NotificationWindow\n{\n    partial class IndustryJobsWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.jobsList = new CharacterIndustryJobsList();\n            this.SuspendLayout();\n            // \n            // jobsList\n            // \n            this.jobsList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.jobsList.Location = new System.Drawing.Point(0, 0);\n            this.jobsList.Name = \"jobsList\";\n            this.jobsList.Size = new System.Drawing.Size(292, 266);\n            this.jobsList.TabIndex = 0;\n            // \n            // IndustryJobsWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(292, 266);\n            this.Controls.Add(this.jobsList);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"IndustryJobsWindow\";\n            this.Text = \"Notification Details\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private CharacterIndustryJobsList jobsList;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/NotificationWindow/IndustryJobsWindow.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.NotificationWindow\n{\n    public partial class IndustryJobsWindow : EVEMonForm\n    {\n        private readonly bool m_init;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"IndustryJobsWindow\"/> class.\n        /// </summary>\n        public IndustryJobsWindow()\n        {\n            InitializeComponent();\n            RememberPositionKey = \"IndustryJobsWindow\";\n            m_init = true;\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping mode.\n        /// </summary>\n        internal Enum Grouping\n        {\n            get { return jobsList.Grouping; }\n            set\n            {\n                jobsList.Grouping = value;\n\n                if (!m_init)\n                    return;\n\n                jobsList.UpdateColumns();\n                jobsList.Visibility = jobsList.Jobs.Any();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the showIssuedFor mode.\n        /// </summary>\n        internal IssuedFor ShowIssuedFor\n        {\n            get { return jobsList.ShowIssuedFor; }\n            set\n            {\n                jobsList.ShowIssuedFor = value;\n\n                if (!m_init)\n                    return;\n\n                jobsList.UpdateColumns();\n                jobsList.Visible = jobsList.Jobs.Any();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of jobs to display.\n        /// </summary>\n        internal IEnumerable<IndustryJob> Jobs\n        {\n            get { return jobsList.Jobs; }\n            set { jobsList.Jobs = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of displayed columns.\n        /// </summary>\n        internal IEnumerable<IColumnSettings> Columns\n        {\n            get { return jobsList.Columns; }\n            set\n            {\n                jobsList.Columns = value;\n\n                if (!m_init)\n                    return;\n\n                jobsList.UpdateColumns();\n                jobsList.Visibility = jobsList.Jobs.Any();\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/NotificationWindow/IndustryJobsWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>\n"
  },
  {
    "path": "src/EVEMon/NotificationWindow/MarketOrdersWindow.Designer.cs",
    "content": "﻿using EVEMon.CharacterMonitoring;\n\nnamespace EVEMon.NotificationWindow\n{\n    partial class MarketOrdersWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.ordersList = new CharacterMarketOrdersList();\n            this.SuspendLayout();\n            // \n            // ordersList\n            // \n            this.ordersList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ordersList.Location = new System.Drawing.Point(0, 0);\n            this.ordersList.Name = \"ordersList\";\n            this.ordersList.Size = new System.Drawing.Size(292, 266);\n            this.ordersList.TabIndex = 0;\n            // \n            // MarketOrdersWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(292, 266);\n            this.Controls.Add(this.ordersList);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"MarketOrdersWindow\";\n            this.Text = \"Notification Details\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private CharacterMarketOrdersList ordersList;\n    }\n}"
  },
  {
    "path": "src/EVEMon/NotificationWindow/MarketOrdersWindow.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.NotificationWindow\n{\n    public partial class MarketOrdersWindow : EVEMonForm\n    {\n        private readonly bool m_init;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MarketOrdersWindow\"/> class.\n        /// </summary>\n        public MarketOrdersWindow()\n        {\n            InitializeComponent();\n            RememberPositionKey = \"MarketOrdersWindow\";\n            m_init = true;\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping mode.\n        /// </summary>\n        internal Enum Grouping\n        {\n            get { return ordersList.Grouping; }\n            set\n            {\n                ordersList.Grouping = value;\n\n                if (!m_init)\n                    return;\n\n                ordersList.UpdateColumns();\n                ordersList.Visibility = ordersList.Orders.Any();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the ShowIssuedFor mode.\n        /// </summary>\n        internal IssuedFor ShowIssuedFor\n        {\n            get { return ordersList.ShowIssuedFor; }\n            set\n            {\n                ordersList.ShowIssuedFor = value;\n\n                if (!m_init)\n                    return;\n\n                ordersList.UpdateColumns();\n                ordersList.Visible = ordersList.Orders.Any();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of orders to display.\n        /// </summary>\n        internal IEnumerable<MarketOrder> Orders\n        {\n            get { return ordersList.Orders; }\n            set { ordersList.Orders = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of displayed columns.\n        /// </summary>\n        internal IEnumerable<IColumnSettings> Columns\n        {\n            get { return ordersList.Columns; }\n            set\n            {\n                ordersList.Columns = value;\n\n                if (!m_init)\n                    return;\n\n                ordersList.UpdateColumns();\n                ordersList.Visibility = ordersList.Orders.Any();\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/NotificationWindow/MarketOrdersWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/NotificationWindow/OwnedSkillBooksWindow.Designer.cs",
    "content": "﻿namespace EVEMon.NotificationWindow\n{\n    partial class OwnedSkillBooksWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.Windows.Forms.ListViewGroup listViewGroup1 = new System.Windows.Forms.ListViewGroup(\"Not Known\", System.Windows.Forms.HorizontalAlignment.Left);\n            System.Windows.Forms.ListViewGroup listViewGroup2 = new System.Windows.Forms.ListViewGroup(\"Already Known\", System.Windows.Forms.HorizontalAlignment.Left);\n            this.noOwnedSkillbooksLabel = new System.Windows.Forms.Label();\n            this.lvOwnedSkillBooks = new System.Windows.Forms.ListView();\n            this.chSkill = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chPrereq = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.SuspendLayout();\n            // \n            // noOwnedSkillbooksLabel\n            // \n            this.noOwnedSkillbooksLabel.BackColor = System.Drawing.Color.WhiteSmoke;\n            this.noOwnedSkillbooksLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.noOwnedSkillbooksLabel.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.noOwnedSkillbooksLabel.Location = new System.Drawing.Point(0, 0);\n            this.noOwnedSkillbooksLabel.Margin = new System.Windows.Forms.Padding(0);\n            this.noOwnedSkillbooksLabel.Name = \"noOwnedSkillbooksLabel\";\n            this.noOwnedSkillbooksLabel.Size = new System.Drawing.Size(394, 352);\n            this.noOwnedSkillbooksLabel.TabIndex = 5;\n            this.noOwnedSkillbooksLabel.Text = \"No Skill books owned.\";\n            this.noOwnedSkillbooksLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lvOwnedSkillBooks\n            // \n            this.lvOwnedSkillBooks.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.lvOwnedSkillBooks.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chSkill,\n            this.chPrereq});\n            this.lvOwnedSkillBooks.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvOwnedSkillBooks.FullRowSelect = true;\n            listViewGroup1.Header = \"Not Known\";\n            listViewGroup1.Name = \"listViewGroupNotKnown\";\n            listViewGroup2.Header = \"Already Known\";\n            listViewGroup2.Name = \"listViewGroupKnown\";\n            this.lvOwnedSkillBooks.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {\n            listViewGroup1,\n            listViewGroup2});\n            this.lvOwnedSkillBooks.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\n            this.lvOwnedSkillBooks.HideSelection = false;\n            this.lvOwnedSkillBooks.Location = new System.Drawing.Point(0, 0);\n            this.lvOwnedSkillBooks.MultiSelect = false;\n            this.lvOwnedSkillBooks.Name = \"lvOwnedSkillBooks\";\n            this.lvOwnedSkillBooks.Size = new System.Drawing.Size(394, 352);\n            this.lvOwnedSkillBooks.TabIndex = 6;\n            this.lvOwnedSkillBooks.UseCompatibleStateImageBehavior = false;\n            this.lvOwnedSkillBooks.View = System.Windows.Forms.View.Details;\n            this.lvOwnedSkillBooks.ColumnWidthChanging += new System.Windows.Forms.ColumnWidthChangingEventHandler(this.lvOwnedSkillBooks_ColumnWidthChanging);\n            // \n            // chSkill\n            // \n            this.chSkill.Text = \"Skill Book Name\";\n            this.chSkill.Width = 114;\n            // \n            // chPrereq\n            // \n            this.chPrereq.Text = \"Prerequisites Met\";\n            this.chPrereq.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\n            this.chPrereq.Width = 106;\n            // \n            // OwnedSkillBooksWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(394, 352);\n            this.Controls.Add(this.lvOwnedSkillBooks);\n            this.Controls.Add(this.noOwnedSkillbooksLabel);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.Name = \"OwnedSkillBooksWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Skill books owned by {0}\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label noOwnedSkillbooksLabel;\n        private System.Windows.Forms.ListView lvOwnedSkillBooks;\n        private System.Windows.Forms.ColumnHeader chSkill;\n        private System.Windows.Forms.ColumnHeader chPrereq;\n    }\n}"
  },
  {
    "path": "src/EVEMon/NotificationWindow/OwnedSkillBooksWindow.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.NotificationWindow\n{\n    public partial class OwnedSkillBooksWindow : EVEMonForm\n    {\n        private readonly Character m_character;\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Prevents a default instance of the <see cref=\"OwnedSkillBooksWindow\"/> class from being created.\n        /// </summary>\n        private OwnedSkillBooksWindow()\n        {\n            InitializeComponent();\n\n            RememberPositionKey = \"OwnedSkillBooksWindow\";\n\n            lvOwnedSkillBooks.Visible = false;\n            noOwnedSkillbooksLabel.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n\n            ListViewHelper.EnableDoubleBuffer(lvOwnedSkillBooks);\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"OwnedSkillBooksWindow\"/> class.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        public OwnedSkillBooksWindow(Character character)\n            : this()\n        {\n            m_character = character;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load, restores the window rectangle from the settings.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.CharacterAssetsUpdated += EveMonClient_CharacterAssetsUpdated;\n            Disposed += OnDisposed;\n\n            Text = string.Format(CultureConstants.DefaultCulture, Text, m_character.Name);\n\n            UpdateList();\n        }\n\n        /// <summary>\n        /// Called when [disposed].\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.CharacterAssetsUpdated -= EveMonClient_CharacterAssetsUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        #endregion\n\n\n        #region Content Management\n\n        /// <summary>\n        /// Updates the list.\n        /// </summary>\n        internal void UpdateList()\n        {\n            int scrollBarPosition = lvOwnedSkillBooks.GetVerticalScrollBarPosition();\n\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = lvOwnedSkillBooks.SelectedItems.Count > 0\n                ? lvOwnedSkillBooks.SelectedItems[0].Tag.GetHashCode()\n                : 0;\n\n            lvOwnedSkillBooks.BeginUpdate();\n            try\n            {\n                IEnumerable<Skill> skills = m_character.Skills\n                                                       .Where(skill => skill.IsOwned || skill.HasBookInAssets)\n                                                       .OrderBy(x => x.Name);\n\n                lvOwnedSkillBooks.Items.Clear();\n\n                foreach (IGrouping<bool, Skill> group in skills.GroupBy(x => !x.IsKnown))\n                {\n                    ListViewGroup listGroup = group.Key\n                                                  ? lvOwnedSkillBooks.Groups[0]\n                                                  : lvOwnedSkillBooks.Groups[1];\n\n                    // Add the items\n                    lvOwnedSkillBooks.Items.AddRange(\n                        group.Select(skill => new\n                                                  {\n                                                      skill,\n                                                      item = new ListViewItem(skill.Name, listGroup)\n                                                                 {\n                                                                     UseItemStyleForSubItems = false,\n                                                                     Tag = skill\n                                                                 }\n                                                  }).Select(x => CreateSubItems(x.skill, x.item)).ToArray());\n                }\n\n                // Restore the selected item (if any)\n                if (selectedItem > 0)\n                {\n                    foreach (ListViewItem lvItem in lvOwnedSkillBooks.Items.Cast<ListViewItem>().Where(\n                        lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                    {\n                        lvItem.Selected = true;\n                    }\n                }\n\n                // Adjust the size of the columns\n                AdjustColumns();\n\n                // Display or hide the \"no research points\" label\n                noOwnedSkillbooksLabel.Visible = lvOwnedSkillBooks.Items.Count == 0;\n                lvOwnedSkillBooks.Visible = !noOwnedSkillbooksLabel.Visible;\n            }\n            finally\n            {\n                lvOwnedSkillBooks.EndUpdate();\n                lvOwnedSkillBooks.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n\n\n        }\n\n        /// <summary>\n        /// Creates the list view sub items.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"item\">The item.</param>\n        private ListViewItem CreateSubItems(Skill skill, ListViewItem item)\n        {\n            // Add enough subitems to match the number of columns\n            while (item.SubItems.Count < lvOwnedSkillBooks.Columns.Count + 1)\n            {\n                item.SubItems.Add(string.Empty);\n            }\n\n            // Creates the subitems\n            for (int i = 0; i < lvOwnedSkillBooks.Columns.Count; i++)\n            {\n                SetColumn(skill, item.SubItems[i], lvOwnedSkillBooks.Columns[i]);\n            }\n\n            return item;\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvOwnedSkillBooks.Columns)\n            {\n                column.Width = -2;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column\n                if (column.Index != lvOwnedSkillBooks.Columns.Count - 1)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvOwnedSkillBooks.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvOwnedSkillBooks.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        /// <summary>\n        /// Updates the listview sub-item.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"column\"></param>\n        private static void SetColumn(Skill skill, ListViewItem.ListViewSubItem item, ColumnHeader column)\n        {\n            switch (column.Index)\n            {\n                case 0:\n                    item.Text = skill.Name;\n                    break;\n                case 1:\n                    item.Text = skill.ArePrerequisitesMet ? \"Yes\" : \"No\";\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Handles the CharacterAssetsUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterAssetsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != m_character)\n                return;\n\n            UpdateList();\n        }\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// Handles the ColumnWidthChanging event of the lvOwnedSkillBooks control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"ColumnWidthChangingEventArgs\" /> instance containing the event data.</param>\n        private void lvOwnedSkillBooks_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)\n        {\n            e.Cancel = true;\n            e.NewWidth = lvOwnedSkillBooks.Columns[e.ColumnIndex].Width;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/NotificationWindow/OwnedSkillBooksWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/NotificationWindow/PlanetaryPinsWindow.Designer.cs",
    "content": "﻿using EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.NotificationWindow\n{\n    partial class PlanetaryPinsWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.planetaryList = new EVEMon.CharacterMonitoring.CharacterPlanetaryList();\n            this.SuspendLayout();\n            // \n            // planetaryList\n            // \n            this.planetaryList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.planetaryList.Grouping = PlanetaryGrouping.None;\n            this.planetaryList.Location = new System.Drawing.Point(0, 0);\n            this.planetaryList.Name = \"planetaryList\";\n            this.planetaryList.Size = new System.Drawing.Size(292, 266);\n            this.planetaryList.TabIndex = 0;\n            this.planetaryList.TextFilter = \"\";\n            // \n            // PlanetaryPinsWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(292, 266);\n            this.Controls.Add(this.planetaryList);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"PlanetaryPinsWindow\";\n            this.Text = \"Notification Details\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private CharacterMonitoring.CharacterPlanetaryList planetaryList;\n    }\n}"
  },
  {
    "path": "src/EVEMon/NotificationWindow/PlanetaryPinsWindow.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.NotificationWindow\n{\n    public partial class PlanetaryPinsWindow : EVEMonForm\n    {\n        private readonly bool m_init;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanetaryPinsWindow\"/> class.\n        /// </summary>\n        public PlanetaryPinsWindow()\n        {\n            InitializeComponent();\n            RememberPositionKey = \"PlanetaryPinsWindow\";\n            m_init = true;\n        }\n\n        /// <summary>\n        /// Gets or sets the grouping mode.\n        /// </summary>\n        internal Enum Grouping\n        {\n            get { return planetaryList.Grouping; }\n            set\n            {\n                planetaryList.Grouping = value;\n\n                if (!m_init)\n                    return;\n\n                planetaryList.UpdateColumns();\n                planetaryList.Visibility = planetaryList.PlanetaryPins.Any();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of jobs to display.\n        /// </summary>\n        internal IEnumerable<PlanetaryPin> PlanetaryPins\n        {\n            get { return planetaryList.PlanetaryPins; }\n            set { planetaryList.PlanetaryPins = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets the enumeration of displayed columns.\n        /// </summary>\n        internal IEnumerable<IColumnSettings> Columns\n        {\n            get { return planetaryList.Columns; }\n            set\n            {\n                planetaryList.Columns = value;\n\n                if (!m_init)\n                    return;\n\n                planetaryList.UpdateColumns();\n                planetaryList.Visibility = planetaryList.PlanetaryPins.Any();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/NotificationWindow/PlanetaryPinsWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/NotificationWindow/SkillCompletionWindow.Designer.cs",
    "content": "namespace EVEMon.NotificationWindow\n{\n    partial class SkillCompletionWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.detailsTextBox = new System.Windows.Forms.TextBox();\n            this.SuspendLayout();\n            // \n            // detailsTextBox\n            // \n            this.detailsTextBox.BackColor = System.Drawing.SystemColors.Window;\n            this.detailsTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.detailsTextBox.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.detailsTextBox.Location = new System.Drawing.Point(0, 0);\n            this.detailsTextBox.Multiline = true;\n            this.detailsTextBox.Name = \"detailsTextBox\";\n            this.detailsTextBox.ReadOnly = true;\n            this.detailsTextBox.Size = new System.Drawing.Size(266, 108);\n            this.detailsTextBox.TabIndex = 2;\n            // \n            // SkillCompletionWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.SystemColors.Window;\n            this.ClientSize = new System.Drawing.Size(266, 108);\n            this.Controls.Add(this.detailsTextBox);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"SkillCompletionWindow\";\n            this.Text = \"Skill Completion Details\";\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TextBox detailsTextBox;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/NotificationWindow/SkillCompletionWindow.cs",
    "content": "using System.Drawing;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Notifications;\n\nnamespace EVEMon.NotificationWindow\n{\n    public partial class SkillCompletionWindow : EVEMonForm\n    {\n        private SkillCompletionNotificationEventArgs m_notification;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        public SkillCompletionWindow()\n        {\n            InitializeComponent();\n            RememberPositionKey = \"SkillCompletionWindow\";\n        }\n\n        /// <summary>\n        /// Gets or sets the list of completed skills.\n        /// </summary> \n        internal SkillCompletionNotificationEventArgs Notification\n        {\n            get { return m_notification; }\n            set\n            {\n                m_notification = value;\n                StringBuilder text = new StringBuilder();\n                foreach (QueuedSkill skill in m_notification.Skills)\n                {\n                    text.AppendLine(skill.ToString());\n                }\n\n                Size textSize = TextRenderer.MeasureText(text.ToString(), Font);\n                MinimumSize = new Size(280, textSize.Height + 30);\n\n                detailsTextBox.Text = text.ToString();\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/NotificationWindow/SkillCompletionWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/NotificationWindow/TimeCheckNotification.Designer.cs",
    "content": "namespace EVEMon.NotificationWindow\n{\n    partial class TimeCheckNotification\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TimeCheckNotification));\n            this.uxButtonPanel = new System.Windows.Forms.Panel();\n            this.uxCloseButton = new System.Windows.Forms.Button();\n            this.uxTitlePanel = new System.Windows.Forms.Panel();\n            this.uxWarningIconPictureBox = new System.Windows.Forms.PictureBox();\n            this.uxTitleLabel = new System.Windows.Forms.Label();\n            this.uxContentPanel = new System.Windows.Forms.Panel();\n            this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.uxTimeZoneLabel = new System.Windows.Forms.Label();\n            this.uxExpectedTimeLabel = new System.Windows.Forms.Label();\n            this.uxActualTimeLabel = new System.Windows.Forms.Label();\n            this.uxTimeZoneField = new System.Windows.Forms.Label();\n            this.uxExpectedTimeField = new System.Windows.Forms.Label();\n            this.uxActualTimeField = new System.Windows.Forms.Label();\n            this.uxMessageLabel1 = new System.Windows.Forms.Label();\n            this.uxCheckTimeOnStartUpCheckBox = new System.Windows.Forms.CheckBox();\n            this.uxMessageLabel = new System.Windows.Forms.Label();\n            this.uxButtonPanel.SuspendLayout();\n            this.uxTitlePanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.uxWarningIconPictureBox)).BeginInit();\n            this.uxContentPanel.SuspendLayout();\n            this.tableLayoutPanel.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // uxButtonPanel\n            // \n            this.uxButtonPanel.Controls.Add(this.uxCloseButton);\n            this.uxButtonPanel.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.uxButtonPanel.Location = new System.Drawing.Point(0, 245);\n            this.uxButtonPanel.Name = \"uxButtonPanel\";\n            this.uxButtonPanel.Size = new System.Drawing.Size(384, 47);\n            this.uxButtonPanel.TabIndex = 0;\n            // \n            // uxCloseButton\n            // \n            this.uxCloseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.uxCloseButton.Location = new System.Drawing.Point(297, 12);\n            this.uxCloseButton.Name = \"uxCloseButton\";\n            this.uxCloseButton.Size = new System.Drawing.Size(75, 23);\n            this.uxCloseButton.TabIndex = 0;\n            this.uxCloseButton.Text = \"Close\";\n            this.uxCloseButton.UseVisualStyleBackColor = true;\n            this.uxCloseButton.Click += new System.EventHandler(this.uxCloseButton_Click);\n            // \n            // uxTitlePanel\n            // \n            this.uxTitlePanel.BackColor = System.Drawing.SystemColors.Window;\n            this.uxTitlePanel.Controls.Add(this.uxWarningIconPictureBox);\n            this.uxTitlePanel.Controls.Add(this.uxTitleLabel);\n            this.uxTitlePanel.Dock = System.Windows.Forms.DockStyle.Top;\n            this.uxTitlePanel.Location = new System.Drawing.Point(0, 0);\n            this.uxTitlePanel.Name = \"uxTitlePanel\";\n            this.uxTitlePanel.Size = new System.Drawing.Size(384, 54);\n            this.uxTitlePanel.TabIndex = 2;\n            // \n            // uxWarningIconPictureBox\n            // \n            this.uxWarningIconPictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"uxWarningIconPictureBox.Image\")));\n            this.uxWarningIconPictureBox.Location = new System.Drawing.Point(12, 12);\n            this.uxWarningIconPictureBox.Name = \"uxWarningIconPictureBox\";\n            this.uxWarningIconPictureBox.Size = new System.Drawing.Size(32, 32);\n            this.uxWarningIconPictureBox.TabIndex = 2;\n            this.uxWarningIconPictureBox.TabStop = false;\n            // \n            // uxTitleLabel\n            // \n            this.uxTitleLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.uxTitleLabel.Location = new System.Drawing.Point(50, 12);\n            this.uxTitleLabel.Name = \"uxTitleLabel\";\n            this.uxTitleLabel.Size = new System.Drawing.Size(322, 32);\n            this.uxTitleLabel.TabIndex = 1;\n            this.uxTitleLabel.Text = \"Your system\\'s clock settings may be wrong.\";\n            this.uxTitleLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // uxContentPanel\n            // \n            this.uxContentPanel.BackColor = System.Drawing.SystemColors.Window;\n            this.uxContentPanel.Controls.Add(this.tableLayoutPanel);\n            this.uxContentPanel.Controls.Add(this.uxMessageLabel1);\n            this.uxContentPanel.Controls.Add(this.uxCheckTimeOnStartUpCheckBox);\n            this.uxContentPanel.Controls.Add(this.uxMessageLabel);\n            this.uxContentPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.uxContentPanel.Location = new System.Drawing.Point(0, 54);\n            this.uxContentPanel.Name = \"uxContentPanel\";\n            this.uxContentPanel.Size = new System.Drawing.Size(384, 191);\n            this.uxContentPanel.TabIndex = 3;\n            // \n            // tableLayoutPanel\n            // \n            this.tableLayoutPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tableLayoutPanel.AutoSize = true;\n            this.tableLayoutPanel.ColumnCount = 2;\n            this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 97F));\n            this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel.Controls.Add(this.uxTimeZoneLabel, 0, 0);\n            this.tableLayoutPanel.Controls.Add(this.uxExpectedTimeLabel, 0, 1);\n            this.tableLayoutPanel.Controls.Add(this.uxActualTimeLabel, 0, 2);\n            this.tableLayoutPanel.Controls.Add(this.uxTimeZoneField, 1, 0);\n            this.tableLayoutPanel.Controls.Add(this.uxExpectedTimeField, 1, 1);\n            this.tableLayoutPanel.Controls.Add(this.uxActualTimeField, 1, 2);\n            this.tableLayoutPanel.Location = new System.Drawing.Point(30, 60);\n            this.tableLayoutPanel.Name = \"tableLayoutPanel\";\n            this.tableLayoutPanel.RowCount = 3;\n            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel.Size = new System.Drawing.Size(325, 58);\n            this.tableLayoutPanel.TabIndex = 6;\n            // \n            // uxTimeZoneLabel\n            // \n            this.uxTimeZoneLabel.AutoSize = true;\n            this.uxTimeZoneLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.uxTimeZoneLabel.Location = new System.Drawing.Point(3, 0);\n            this.uxTimeZoneLabel.Name = \"uxTimeZoneLabel\";\n            this.uxTimeZoneLabel.Size = new System.Drawing.Size(91, 19);\n            this.uxTimeZoneLabel.TabIndex = 3;\n            this.uxTimeZoneLabel.Text = \"Your Time Zone:\";\n            this.uxTimeZoneLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // uxExpectedTimeLabel\n            // \n            this.uxExpectedTimeLabel.AutoSize = true;\n            this.uxExpectedTimeLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.uxExpectedTimeLabel.Location = new System.Drawing.Point(3, 19);\n            this.uxExpectedTimeLabel.Name = \"uxExpectedTimeLabel\";\n            this.uxExpectedTimeLabel.Size = new System.Drawing.Size(91, 19);\n            this.uxExpectedTimeLabel.TabIndex = 4;\n            this.uxExpectedTimeLabel.Text = \"Expected Time:\";\n            this.uxExpectedTimeLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // uxActualTimeLabel\n            // \n            this.uxActualTimeLabel.AutoSize = true;\n            this.uxActualTimeLabel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.uxActualTimeLabel.Location = new System.Drawing.Point(3, 38);\n            this.uxActualTimeLabel.Name = \"uxActualTimeLabel\";\n            this.uxActualTimeLabel.Size = new System.Drawing.Size(91, 20);\n            this.uxActualTimeLabel.TabIndex = 5;\n            this.uxActualTimeLabel.Text = \"Your Actual Time:\";\n            this.uxActualTimeLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // uxTimeZoneField\n            // \n            this.uxTimeZoneField.AutoSize = true;\n            this.uxTimeZoneField.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.uxTimeZoneField.Location = new System.Drawing.Point(100, 0);\n            this.uxTimeZoneField.Name = \"uxTimeZoneField\";\n            this.uxTimeZoneField.Size = new System.Drawing.Size(222, 19);\n            this.uxTimeZoneField.TabIndex = 6;\n            this.uxTimeZoneField.Text = \"TimeZone\";\n            this.uxTimeZoneField.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // uxExpectedTimeField\n            // \n            this.uxExpectedTimeField.AutoSize = true;\n            this.uxExpectedTimeField.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.uxExpectedTimeField.Location = new System.Drawing.Point(100, 19);\n            this.uxExpectedTimeField.Name = \"uxExpectedTimeField\";\n            this.uxExpectedTimeField.Size = new System.Drawing.Size(222, 19);\n            this.uxExpectedTimeField.TabIndex = 7;\n            this.uxExpectedTimeField.Text = \"ServerTime\";\n            this.uxExpectedTimeField.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // uxActualTimeField\n            // \n            this.uxActualTimeField.AutoSize = true;\n            this.uxActualTimeField.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.uxActualTimeField.Location = new System.Drawing.Point(100, 38);\n            this.uxActualTimeField.Name = \"uxActualTimeField\";\n            this.uxActualTimeField.Size = new System.Drawing.Size(222, 20);\n            this.uxActualTimeField.TabIndex = 8;\n            this.uxActualTimeField.Text = \"SystemTime\";\n            this.uxActualTimeField.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // uxMessageLabel1\n            // \n            this.uxMessageLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.uxMessageLabel1.Location = new System.Drawing.Point(9, 3);\n            this.uxMessageLabel1.Name = \"uxMessageLabel1\";\n            this.uxMessageLabel1.Size = new System.Drawing.Size(363, 54);\n            this.uxMessageLabel1.TabIndex = 2;\n            this.uxMessageLabel1.Text = resources.GetString(\"uxMessageLabel1.Text\");\n            // \n            // uxCheckTimeOnStartUpCheckBox\n            // \n            this.uxCheckTimeOnStartUpCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.uxCheckTimeOnStartUpCheckBox.AutoSize = true;\n            this.uxCheckTimeOnStartUpCheckBox.Location = new System.Drawing.Point(12, 165);\n            this.uxCheckTimeOnStartUpCheckBox.Name = \"uxCheckTimeOnStartUpCheckBox\";\n            this.uxCheckTimeOnStartUpCheckBox.Size = new System.Drawing.Size(246, 17);\n            this.uxCheckTimeOnStartUpCheckBox.TabIndex = 1;\n            this.uxCheckTimeOnStartUpCheckBox.Text = \"Check my system\\'s clock when EVEMon starts\";\n            this.uxCheckTimeOnStartUpCheckBox.UseVisualStyleBackColor = true;\n            // \n            // uxMessageLabel\n            // \n            this.uxMessageLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.uxMessageLabel.Location = new System.Drawing.Point(9, 120);\n            this.uxMessageLabel.Name = \"uxMessageLabel\";\n            this.uxMessageLabel.Size = new System.Drawing.Size(360, 44);\n            this.uxMessageLabel.TabIndex = 0;\n            this.uxMessageLabel.Text = \"Please check your system\\'s time settings. If your clock is wrong, EVEMon may disp\" +\n    \"lay unexpected Skill Point values for some skills. Skill completion notification\" +\n    \"s may also be shown incorrectly.\";\n            // \n            // TimeCheckNotification\n            // \n            this.AcceptButton = this.uxCloseButton;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.ClientSize = new System.Drawing.Size(384, 292);\n            this.Controls.Add(this.uxContentPanel);\n            this.Controls.Add(this.uxTitlePanel);\n            this.Controls.Add(this.uxButtonPanel);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"TimeCheckNotification\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Time Synchronisation Problem\";\n            this.uxButtonPanel.ResumeLayout(false);\n            this.uxTitlePanel.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.uxWarningIconPictureBox)).EndInit();\n            this.uxContentPanel.ResumeLayout(false);\n            this.uxContentPanel.PerformLayout();\n            this.tableLayoutPanel.ResumeLayout(false);\n            this.tableLayoutPanel.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Panel uxButtonPanel;\n        private System.Windows.Forms.Button uxCloseButton;\n        private System.Windows.Forms.Panel uxTitlePanel;\n        private System.Windows.Forms.Label uxTitleLabel;\n        private System.Windows.Forms.PictureBox uxWarningIconPictureBox;\n        private System.Windows.Forms.Panel uxContentPanel;\n        private System.Windows.Forms.Label uxMessageLabel;\n        private System.Windows.Forms.CheckBox uxCheckTimeOnStartUpCheckBox;\n        private System.Windows.Forms.Label uxActualTimeLabel;\n        private System.Windows.Forms.Label uxExpectedTimeLabel;\n        private System.Windows.Forms.Label uxTimeZoneLabel;\n        private System.Windows.Forms.Label uxMessageLabel1;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;\n        private System.Windows.Forms.Label uxTimeZoneField;\n        private System.Windows.Forms.Label uxExpectedTimeField;\n        private System.Windows.Forms.Label uxActualTimeField;\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/NotificationWindow/TimeCheckNotification.cs",
    "content": "using System;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Factories;\n\nnamespace EVEMon.NotificationWindow\n{\n    /// <summary>\n    /// Notification dialog to inform user of a possible clock error\n    /// </summary>\n    public partial class TimeCheckNotification : EVEMonForm\n    {\n        private readonly DateTime m_serverTime;\n        private readonly DateTime m_localTime;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TimeCheckNotification\"/> class.\n        /// </summary>\n        private TimeCheckNotification()\n        {\n            InitializeComponent();\n            uxTitleLabel.Font = FontFactory.GetFont(\"Tahoma\", 12F);\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TimeCheckNotification\"/> class.\n        /// </summary>\n        /// <param name=\"serverTime\">The server time.</param>\n        /// <param name=\"localTime\">The local time.</param>\n        public TimeCheckNotification(DateTime serverTime, DateTime localTime)\n            : this()\n        {\n            m_serverTime = serverTime;\n            m_localTime = localTime;\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Form.Shown\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnShown(EventArgs e)\n        {\n            base.OnShown(e);\n\n            uxTimeZoneField.Text = TimeZone.CurrentTimeZone.StandardName;\n            uxExpectedTimeField.Text = $\"{m_serverTime}\";\n            uxActualTimeField.Text = $\"{m_localTime}\";\n            uxCheckTimeOnStartUpCheckBox.Checked = Settings.Updates.CheckTimeOnStartup;\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Form.Closing\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.ComponentModel.CancelEventArgs\"/> that contains the event data.</param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            Settings.Updates.CheckTimeOnStartup = uxCheckTimeOnStartUpCheckBox.Checked;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the uxCloseButton control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void uxCloseButton_Click(object sender, EventArgs e)\n        {\n            Close();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/NotificationWindow/TimeCheckNotification.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"uxWarningIconPictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAFzUkdCAK7O\n        HOkAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAADjAAAA4wEP5t+nAAAAGXRFWHRTb2Z0d2FyZQB3d3cu\n        aW5rc2NhcGUub3Jnm+48GgAAB5hJREFUWEe9l3tQVPcVx388RUTeKFpjmhrfD9Kad2bMmESxYya2aUen\n        daYzNPUPp52EZGLbpDEt1kgQIWDiAw01CRiRh7A8FY0UdkmBJAgxIAvugizPfe+9u8s+2P32/C64wTYP\n        oGnuzJm77My938/3e865d2EA2GxKqGYPWqpZm6aI7ReqmN9s7sGvma34XKHGf9hz7SnYrsRCns2e+74B\n        XnLIlwFD72L8+k6MljBlfDQLnQ3EjBOg6EPJ/Yjnxm8BSyO8mmzYLi9AfSbb+30BvOyQ3wsMnwFMVwFD\n        JcbbdmC0mPXMJoUZJUDu5wnV/lpPF7XcVEfi1YDuAry9KbDVxkGeyf4w0xRmBlDF/uRoWEG9zyXxiyRe\n        CoyeozRy4b62DdrzTLX6LhY2E4hpA9CqhQlVAXpP1+8A4yUSl5F4AYm/BwyegEf5ImyXYqHIYC/8fwAq\n        2SsOxUoSOw3oy0F2AbOCAD4ANFnArUNwtWyGroD1PryKzZ8uxLQSECrZfHJv9Nwg9/oKEi8i8XrSoGOs\n        l8TTgN6/YfyLJNiqY9B4hL30XQO85lCsot6fJPFiYOQsXPZRtLe3w+12UwrvAqpXgJ5kOJsehe5Dduv+\n        5Sx8OhDfmgC5jxAqA0zeGzT5NPEYPSut3549e+g5yrBy5UpYdW0kTqaVe6WVtFZG4eN0tu+7Aahgrzvk\n        a4CBtycnnvbfbcSmTZskAF719dSO/nSgix5OHb+Cs3Ej9GeZZvN6FvFtEN+YgFDBIsXKQLOX77008SRu\n        vCK1PjEx0Qcgl8sBawfQuRv44lmMtzwOsTwSTYfZn/83gHKW4lSsJffZJP4+bUCO5J4fO3bs8AG0trZO\n        DKT6NeDz7UDbE3A0rIE+jw1u+wmL+iaIr01AKGdRYkWgIPV+hFZt6BQ8upoJITp27drlA+ju7p74Umwn\n        8aeA1sfg/ngDxLIINKexv8wOQMYOOhXrqLcZJE67TzPgtI34AJKSknwAg4ODvu+9yt8Dn95PtRFjdcuh\n        f58NPfMAi/k6iK9MQJCxaLEiSPR20t7TKxcD78A5LMPY2JhPKDk52QdgsVh837uNzZI4L7diPayl8/FJ\n        Gnt9pgCHnHSxp3UbvMoXKIVMmHS9sNls8Hg8klhKSooPYHx83AfgcDjg7ngOLvk6GEuWwFq7BIYzbHTn\n        oyz2qyD+KwFyHyuWB1k917ZSHxPgIhBz26vQarUQRXHiwUNHdna2BBASEvJl/F4v7HY7DOrLNDZxGHov\n        BoaSeIjFYfg0lR2YHkAZS5PctzwiRehoSEB/TxNGRkZgNpvBHXpJKC8vTwKIjeXGJg6XyyVB6nQ6DJZv\n        x9A/ojGYGwmxJh6GXKb99WNswX9C3JGAUMbiRFmQTXLfuEGKUdv8PFQqFfigGQwGWK1WKQWNRoOAgADs\n        28cfeJBaw2eEQ3LYW+0yEo+C5lQEvaBiIBTNxWep7CBB36F5J0ApS3cqNsDT/IgUvaM+AcrP69HT0yMJ\n        8jbwgeNCHIKD8ci5uNPplNxzyKGhIajVavQVJUKTE45bJ8IgVMbAeJrpkx5nC6em4AMQStlCcm+/7d7Z\n        wN0no6OjA11dXejr68Pw8LAkwIU4yPHjx5Gfny+1hQ8od88hOSyH7moqRP+J+eg7Ng8j+eEQCuag9Q2W\n        OjWFqQCZTvkGjDc9LEXvaLgPyutyCYAXdzswMCAJmEwm5OTk+LagublZEtfr9ZL73t5eCZpfpy5IRN/b\n        oVAfDYG5PBzGHGbY+yRbdDsFCYDcx4uy4DFP6xYpemf9WmibXvSJ8xsplUopBS7AhywrK0sC8PPzAwfg\n        4rz3/f39uHnzpu/aG/8qRO/RuVC9NYe2IhTCh0G4dpAdvp3CBMAFluVSJGC8+SHw6B3/XIOBT9LvAOjs\n        7JRuzAU4BG/H7t27sX//fikVLs4T4u457O3kOtpboM4KgSozGD1HAmEqDeEpmJ7fyhZzbS6+WCwLdkju\n        5RPux66uhu2jddDX74S2jurqLzF6heryL6Cls5afa+nvS89ipObnGK76Ga3dM9CUbUd/yU+hPr8VqoIt\n        UJ19EqpT90rubx4JQvfhAGhOB8GSH4C2AyyDp8CEEnbUJb8P7qYHyf1aOOrWwP7RKvpnYwWsF5dDrF4G\n        S8U9MMvuJvqlMBQvgb5wMXTnFtFvk4UYyYuj36UxGKSdHzgdKU29NHjvzJOiV2eReAa5Tw9E95v+6Er1\n        g7GYkjjBzMlb2RJmKQ5o8bRtJ4CH4Gp8AE7FRlq/H8NelwD71fUEshZi7WoINStgqVoOc+UymGQ/hJHD\n        XCCYIoI5Hw/tuQUEFEvTHk1v7kgMngnHQG4YOZ6L/pwQWsVg2oZAGkh/gvaH5QOGk79hTzNTISu11y7F\n        2JVlsF/+Eey198B+6W7YLy6FveYu2Kt/AHvVYtiqFsFWGQ9bxQLYZHFUMbCWRdPLJgriBXralUTQIzcc\n        YlEYxMJ5EM+HQiwIgXBuDlUwDV8gBIrekk/ieX4wn2Rjrz7NNrOGNBZ0/Rj7Y2s2O96aRfUWVeZkZdD5\n        yJRKp8+HJyuNzm9OViqdD02pN+jzQaq/T9YBOqd8WZ/9lR17eRvbQhMQ/m+Xc4Q7dCv0TAAAAABJRU5E\n        rkJggg==\n</value>\n  </data>\n  <data name=\"uxMessageLabel1.Text\" xml:space=\"preserve\">\n    <value>EVEMon checked your system's time compared to NIST and found that they do not agree on what your current time is. This may be because your Time Zone is not set correctly, or your clock is set to the wrong time. </value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/Program.cs",
    "content": "using System;\nusing System.Diagnostics;\nusing System.Reflection;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.CloudStorageServices;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Threading;\nusing EVEMon.ExceptionHandling;\nusing EVEMon.WindowsApi;\n\nnamespace EVEMon\n{\n    internal static class Program\n    {\n        /// <summary>\n        /// The main window of the application.\n        /// </summary>\n        private static Form s_mainWindow;\n\n        private static bool s_exitRequested;\n        private static bool s_errorWindowIsShown;\n\n        /// <summary>\n        /// The main entry point for the application.\n        /// </summary>\n        [STAThread]\n        private static void Main()\n        {\n            StartupAsync().Wait();\n        }\n\n        /// <summary>\n        /// Starts up the application asynchronously.\n        /// </summary>\n        /// <returns></returns>\n        private static async Task StartupAsync()\n        {\n            // Quits if another instance already exists\n            if (!IsInstanceUnique)\n                return;\n\n            // Check if we are in DEBUG mode \n            EveMonClient.CheckIsDebug();\n\n            // Check if we are in SNAPSHOT mode \n            EveMonClient.CheckIsSnapshot();\n\n            // Subscribe application's events (especially the unhandled exceptions management for the crash box)\n            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;\n            AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;\n            Application.ThreadException += Application_ThreadException;\n            Application.ApplicationExit += ApplicationExitCallback;\n            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);\n\n            // Find our files\n            EveMonClient.InitializeFileSystemPaths();\n\n            // Creates a trace file\n            EveMonClient.StartTraceLogging();\n            EveMonClient.Trace(\"Starting up\", false);\n\n            // Make our windows nice\n            MakeWindowsJuicy();\n\n            // Ensures the installation file downloaded through the autoupdate is correctly deleted\n            UpdateManager.DeleteInstallationFiles();\n\n            // Upgrades the Cloud Storage Service Provider settings\n            CloudStorageServiceProvider.UpgradeSettings();\n\n            // Initialization\n            EveMonClient.Initialize();\n            Settings.Initialize();\n\n            // Did something requested an exit before we entered Run() ?\n            if (s_exitRequested)\n                return;\n\n            try\n            {\n                // Fires the main window\n                EveMonClient.Trace(\"Main loop - start\", printMethod: false);\n                s_mainWindow = new MainWindow();\n                Application.Run(s_mainWindow);\n                EveMonClient.Trace(\"Main loop - done\", printMethod: false);\n\n                // Save before we quit\n                await Task.WhenAll(Settings.SaveImmediateAsync(), EveIDToName.SaveImmediateAsync());\n            }\n            finally\n            {\n                // Stop the one-second timer right now\n                EveMonClient.Shutdown();\n                EveMonClient.Trace(\"Closed\", printMethod: false);\n                EveMonClient.StopTraceLogging();\n            }\n        }\n\n\n        #region Properties\n\n                /// <summary>\n                /// Ensures that only one instance of EVEMon is run at once.\n                /// </summary>\n            private static\n            bool IsInstanceUnique\n        {\n            get\n            {\n                InstanceManager im = InstanceManager.Instance;\n                if (im.CreatedNew)\n                    return true;\n\n                im.Signal();\n                return false;\n            }\n        }\n\n        #endregion\n\n\n        #region Helpers\n\n        /// <summary>\n        /// Makes the windows nice.\n        /// </summary>\n        private static void MakeWindowsJuicy()\n        {\n            try\n            {\n                Application.EnableVisualStyles();\n                Application.SetCompatibleTextRenderingDefault(false);\n\n                string appId = \"EVEMon\";\n\n                if (EveMonClient.IsDebugBuild)\n                    appId = $\"{appId}-DEBUG\";\n\n                Windows7.SetProcessAppId(appId);\n            }\n            catch (InvalidOperationException ex)\n            {\n                // On some systems, a crash may occur here because of some skinning programs or others\n                ExceptionHandler.LogException(ex, false);\n            }\n        }\n\n        #endregion\n\n\n        #region Callbacks\n\n        /// <summary>\n        /// If <see cref=\"Application.Exit()\"/> is called before the <see cref=\"Application.Run()\"/> method, then it won't occur. \n        /// So, here, we set up a boolean to prevent that.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private static void ApplicationExitCallback(object sender, EventArgs e)\n        {\n            s_exitRequested = true;\n        }\n\n        /// <summary>\n        /// Occurs when an exception reach the entry point of the\n        /// application. We then display our custom crash box.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)\n        {\n            HandleUnhandledException(e.ExceptionObject as Exception);\n        }\n\n        /// <summary>\n        /// Occurs when the application tries to resolve an assembly dependency.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"ResolveEventArgs\"/> instance containing the event data.</param>\n        /// <returns></returns>\n        private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs e) => HandleAssemblyResolve(e);\n\n        /// <summary>\n        /// Handles exceptions in WinForms threads, such exceptions\n        /// would never reach the entry point of the application, \n        /// generally causing a CTD or trigger WER.\n        /// We display our custom crash box.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)\n        {\n            HandleUnhandledException(e.Exception);\n        }\n\n        /// <summary>\n        /// Handles an exception through the Unhandled Exception window.\n        /// </summary>\n        /// <param name=\"ex\">Exception to display</param>\n        private static void HandleUnhandledException(Exception ex)\n        {\n            if (Debugger.IsAttached)\n                return;\n\n            if (s_errorWindowIsShown)\n                return;\n\n            s_errorWindowIsShown = true;\n\n            try\n            {\n                // Some exceptions may be thrown on a worker thread so we need to invoke them to the UI thread,\n                // if we are already on the UI thread nothing changes\n                if (s_mainWindow!= null && s_mainWindow.InvokeRequired)\n                {\n                    Dispatcher.Invoke(() => HandleUnhandledException(ex));\n                    return;\n                }\n\n                using (UnhandledExceptionWindow form = new UnhandledExceptionWindow(ex))\n                {\n                    if (s_mainWindow != null && !s_mainWindow.IsDisposed)\n                        form.ShowDialog(s_mainWindow);\n                    else\n                        form.ShowDialog();\n                }\n\n                // Notify Gooogle Analytics about ending via the Unhandled Exception window\n                GAnalyticsTracker.TrackEnd(typeof(Program));\n            }\n            catch (Exception e)\n            {\n                StringBuilder messageBuilder = new StringBuilder();\n                messageBuilder.AppendLine(string.Format(Properties.Resources.ErrorUnhandled,\n                    e.Message));\n                if (ex.GetBaseException().Message != e.Message)\n                    messageBuilder.AppendLine(string.Format(Properties.Resources.\n                        ErrorUnhandledBase, ex.GetBaseException().Message));\n                messageBuilder.AppendLine(Properties.Resources.ErrorUnhandledEnd);\n                if (EveMonClient.IsDebugBuild)\n                    messageBuilder.AppendLine().AppendLine(UnhandledExceptionWindow.\n                        GetRecursiveStackTrace(ex));\n                MessageBox.Show(messageBuilder.ToString(), @\"EVEMon Error\", MessageBoxButtons.\n                    OK, MessageBoxIcon.Error);\n            }\n\n            Environment.Exit(1);\n        }\n\n        /// <summary>\n        /// Handles the assembly resolve.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"ResolveEventArgs\"/> instance containing the event data.</param>\n        /// <returns>The resolved assembly</returns>\n        /// <remarks>\n        /// Because we are not distributing the config file along with the application,\n        /// we need to resolve the assembly dependencies internally.\n        /// First we determine which assembly was requested and then we load the distributed one and return it.\n        /// </remarks>\n        private static Assembly HandleAssemblyResolve(ResolveEventArgs e)\n        {\n            try\n            {\n                AssemblyName requestedAssembly = new AssemblyName(e.Name);\n                AssemblyName assembly = AssemblyName.GetAssemblyName($\"{requestedAssembly.Name}.dll\");\n                if (requestedAssembly.Version < assembly.Version)\n                    return Assembly.Load(assembly);\n            }\n            catch (Exception)\n            {\n                return null;\n            }\n            return Assembly.Load(e.Name);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// Note: Shared assembly information is specified in SharedAssemblyInfo.cs\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"EVEMon\")]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"dd0d5f0c-6de4-46d5-889e-0386ee699b13\")]\n"
  },
  {
    "path": "src/EVEMon/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The reminder interval must be a strictly positive integer..\n        /// </summary>\n        internal static string ErrorBadReminder {\n            get {\n                return ResourceManager.GetString(\"ErrorBadReminder\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error retrieving error data. Wow, things are really messed up!.\n        /// </summary>\n        internal static string ErrorBuildingError {\n            get {\n                return ResourceManager.GetString(\"ErrorBuildingError\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Could not complete the operation as the clipboard is being used by another process. Wait a few moments and try again..\n        /// </summary>\n        internal static string ErrorClipboardFailure {\n            get {\n                return ResourceManager.GetString(\"ErrorClipboardFailure\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Contents of the clipboard is not a valid list of skills or contains invalid skill levels..\n        /// </summary>\n        internal static string ErrorClipboardImport {\n            get {\n                return ResourceManager.GetString(\"ErrorClipboardImport\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to File failed to download correctly, do you wish to try again?.\n        /// </summary>\n        internal static string ErrorDownloadFailure {\n            get {\n                return ResourceManager.GetString(\"ErrorDownloadFailure\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Warning: The data this ESI key provides is not sufficient for basic EVEMon features..\n        /// </summary>\n        internal static string ErrorFewScopes {\n            get {\n                return ResourceManager.GetString(\"ErrorFewScopes\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The installer file could not be found. EVEMon will continue without updating..\n        /// </summary>\n        internal static string ErrorInstallerNotFound {\n            get {\n                return ResourceManager.GetString(\"ErrorInstallerNotFound\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A calendar at that path could not be found..\n        /// </summary>\n        internal static string ErrorNoCalendar {\n            get {\n                return ResourceManager.GetString(\"ErrorNoCalendar\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unable to create datafile report.\n        /// </summary>\n        internal static string ErrorNoDataFile {\n            get {\n                return ResourceManager.GetString(\"ErrorNoDataFile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Warning: This ESI key does not authorize any scopes and thus will not provide any data..\n        /// </summary>\n        internal static string ErrorNoScopes {\n            get {\n                return ResourceManager.GetString(\"ErrorNoScopes\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to ESI token could not be obtained..\n        /// </summary>\n        internal static string ErrorNoToken {\n            get {\n                return ResourceManager.GetString(\"ErrorNoToken\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unable to load trace file for inclusion in report.\n        /// </summary>\n        internal static string ErrorNoTraceFile {\n            get {\n                return ResourceManager.GetString(\"ErrorNoTraceFile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Please set the ESI Client ID and Client Secret in Settings &gt; Network before adding ESI keys..\n        /// </summary>\n        internal static string ErrorSetClientID {\n            get {\n                return ResourceManager.GetString(\"ErrorSetClientID\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Failed to start SSO server. Check your firewall settings (using port {0:D}) and ensure that only one instance of EVEMon is active while adding ESI keys..\n        /// </summary>\n        internal static string ErrorSSOStartup {\n            get {\n                return ResourceManager.GetString(\"ErrorSSOStartup\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unable to establish a trusted connection to the CCP API servers.\n        ///\n        ///This may be due to an active man-in-the-middle attack or outdated local SSL certificates.\n        ///\n        ///Ensure that the system is up to date with all security patches and try again..\n        /// </summary>\n        internal static string ErrorTrustFailure {\n            get {\n                return ResourceManager.GetString(\"ErrorTrustFailure\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to An error occurred and EVEMon was unable to handle the error message gracefully.\n        ///\n        ///The exception encountered was &apos;{0}&apos;..\n        /// </summary>\n        internal static string ErrorUnhandled {\n            get {\n                return ResourceManager.GetString(\"ErrorUnhandled\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to \n        ///The original exception encountered was &apos;{0}&apos;..\n        /// </summary>\n        internal static string ErrorUnhandledBase {\n            get {\n                return ResourceManager.GetString(\"ErrorUnhandledBase\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to \n        ///Please report this on the EVEMon forums..\n        /// </summary>\n        internal static string ErrorUnhandledEnd {\n            get {\n                return ResourceManager.GetString(\"ErrorUnhandledEnd\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Use the tree on the left to select a blueprint to view..\n        /// </summary>\n        internal static string MessageBlueprintSelect {\n            get {\n                return ResourceManager.GetString(\"MessageBlueprintSelect\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Pasted skills and all dependencies have already been trained or planned..\n        /// </summary>\n        internal static string MessageClipboardPlanned {\n            get {\n                return ResourceManager.GetString(\"MessageClipboardPlanned\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Pasted skills and all dependencies have already been trained..\n        /// </summary>\n        internal static string MessageClipboardTrained {\n            get {\n                return ResourceManager.GetString(\"MessageClipboardTrained\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The error details have been copied to the clipboard..\n        /// </summary>\n        internal static string MessageCopiedDetails {\n            get {\n                return ResourceManager.GetString(\"MessageCopiedDetails\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The selected entries have been copied to the clipboard..\n        /// </summary>\n        internal static string MessageCopiedPlan {\n            get {\n                return ResourceManager.GetString(\"MessageCopiedPlan\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to To begin using EVEMon, select the File &gt;Add Character... menu option, enter your ESI API information and choose the character to monitor..\n        /// </summary>\n        internal static string MessageGettingStarted {\n            get {\n                return ResourceManager.GetString(\"MessageGettingStarted\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to {0} has the skill for {1:D} Jump Clones (plus 1 for the implants in your active body).\n        /// </summary>\n        internal static string MessageJumpCloneSkills {\n            get {\n                return ResourceManager.GetString(\"MessageJumpCloneSkills\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This would result in a priority conflict, either pre-requisites with a lower priority or dependant skills with a higher priority.\n        ///\n        ///Select Yes if you wish to do this and adjust the other skills\n        ///or No if you do not wish to change the priority..\n        /// </summary>\n        internal static string MessagePriorityConflict {\n            get {\n                return ResourceManager.GetString(\"MessagePriorityConflict\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Are you sure you want to clear the cache?.\n        /// </summary>\n        internal static string PromptClearCache {\n            get {\n                return ResourceManager.GetString(\"PromptClearCache\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Are you sure you want to delete this plan?.\n        /// </summary>\n        internal static string PromptDeletePlan {\n            get {\n                return ResourceManager.GetString(\"PromptDeletePlan\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Are you sure you want to ignore this update? You will not be prompted again until a newer version is released..\n        /// </summary>\n        internal static string PromptIgnoreUpdate {\n            get {\n                return ResourceManager.GetString(\"PromptIgnoreUpdate\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Are you sure you want to reset settings?\n        ///Everything will be lost, including the plans..\n        /// </summary>\n        internal static string PromptResetSettings {\n            get {\n                return ResourceManager.GetString(\"PromptResetSettings\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ErrorBadReminder\" xml:space=\"preserve\">\n    <value>The reminder interval must be a strictly positive integer.</value>\n  </data>\n  <data name=\"ErrorBuildingError\" xml:space=\"preserve\">\n    <value>Error retrieving error data. Wow, things are really messed up!</value>\n  </data>\n  <data name=\"ErrorClipboardFailure\" xml:space=\"preserve\">\n    <value>Could not complete the operation as the clipboard is being used by another process. Wait a few moments and try again.</value>\n  </data>\n  <data name=\"ErrorDownloadFailure\" xml:space=\"preserve\">\n    <value>File failed to download correctly, do you wish to try again?</value>\n  </data>\n  <data name=\"ErrorFewScopes\" xml:space=\"preserve\">\n    <value>Warning: The data this ESI key provides is not sufficient for basic EVEMon features.</value>\n  </data>\n  <data name=\"ErrorInstallerNotFound\" xml:space=\"preserve\">\n    <value>The installer file could not be found. EVEMon will continue without updating.</value>\n  </data>\n  <data name=\"ErrorNoCalendar\" xml:space=\"preserve\">\n    <value>A calendar at that path could not be found.</value>\n  </data>\n  <data name=\"ErrorNoDataFile\" xml:space=\"preserve\">\n    <value>Unable to create datafile report</value>\n  </data>\n  <data name=\"ErrorNoScopes\" xml:space=\"preserve\">\n    <value>Warning: This ESI key does not authorize any scopes and thus will not provide any data.</value>\n  </data>\n  <data name=\"ErrorNoToken\" xml:space=\"preserve\">\n    <value>ESI token could not be obtained.</value>\n  </data>\n  <data name=\"ErrorNoTraceFile\" xml:space=\"preserve\">\n    <value>Unable to load trace file for inclusion in report</value>\n  </data>\n  <data name=\"ErrorSetClientID\" xml:space=\"preserve\">\n    <value>Please set the ESI Client ID and Client Secret in Settings &gt; Network before adding ESI keys.</value>\n  </data>\n  <data name=\"ErrorSSOStartup\" xml:space=\"preserve\">\n    <value>Failed to start SSO server. Check your firewall settings (using port {0:D}) and ensure that only one instance of EVEMon is active while adding ESI keys.</value>\n  </data>\n  <data name=\"ErrorTrustFailure\" xml:space=\"preserve\">\n    <value>Unable to establish a trusted connection to the CCP API servers.\n\nThis may be due to an active man-in-the-middle attack or outdated local SSL certificates.\n\nEnsure that the system is up to date with all security patches and try again.</value>\n  </data>\n  <data name=\"ErrorUnhandled\" xml:space=\"preserve\">\n    <value>An error occurred and EVEMon was unable to handle the error message gracefully.\n\nThe exception encountered was '{0}'.</value>\n  </data>\n  <data name=\"ErrorUnhandledBase\" xml:space=\"preserve\">\n    <value>\nThe original exception encountered was '{0}'.</value>\n  </data>\n  <data name=\"ErrorUnhandledEnd\" xml:space=\"preserve\">\n    <value>\nPlease report this on the EVEMon forums.</value>\n  </data>\n  <data name=\"MessageBlueprintSelect\" xml:space=\"preserve\">\n    <value>Use the tree on the left to select a blueprint to view.</value>\n  </data>\n  <data name=\"MessageCopiedDetails\" xml:space=\"preserve\">\n    <value>The error details have been copied to the clipboard.</value>\n  </data>\n  <data name=\"MessageCopiedPlan\" xml:space=\"preserve\">\n    <value>The selected entries have been copied to the clipboard.</value>\n  </data>\n  <data name=\"MessageJumpCloneSkills\" xml:space=\"preserve\">\n    <value>{0} has the skill for {1:D} Jump Clones (plus 1 for the implants in your active body)</value>\n  </data>\n  <data name=\"MessagePriorityConflict\" xml:space=\"preserve\">\n    <value>This would result in a priority conflict, either pre-requisites with a lower priority or dependant skills with a higher priority.\n\nSelect Yes if you wish to do this and adjust the other skills\nor No if you do not wish to change the priority.</value>\n  </data>\n  <data name=\"PromptClearCache\" xml:space=\"preserve\">\n    <value>Are you sure you want to clear the cache?</value>\n  </data>\n  <data name=\"PromptDeletePlan\" xml:space=\"preserve\">\n    <value>Are you sure you want to delete this plan?</value>\n  </data>\n  <data name=\"PromptIgnoreUpdate\" xml:space=\"preserve\">\n    <value>Are you sure you want to ignore this update? You will not be prompted again until a newer version is released.</value>\n  </data>\n  <data name=\"PromptResetSettings\" xml:space=\"preserve\">\n    <value>Are you sure you want to reset settings?\nEverything will be lost, including the plans.</value>\n  </data>\n  <data name=\"MessageGettingStarted\" xml:space=\"preserve\">\n    <value>To begin using EVEMon, select the File &gt;Add Character... menu option, enter your ESI API information and choose the character to monitor.</value>\n  </data>\n  <data name=\"ErrorClipboardImport\" xml:space=\"preserve\">\n    <value>Contents of the clipboard is not a valid list of skills or contains invalid skill levels.</value>\n  </data>\n  <data name=\"MessageClipboardPlanned\" xml:space=\"preserve\">\n    <value>Pasted skills and all dependencies have already been trained or planned.</value>\n  </data>\n  <data name=\"MessageClipboardTrained\" xml:space=\"preserve\">\n    <value>Pasted skills and all dependencies have already been trained.</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"14.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"%appdata%/EVEMon/AccountInfo.xml\")]\n        public string AccountDetailsStoragePath {\n            get {\n                return ((string)(this[\"AccountDetailsStoragePath\"]));\n            }\n            set {\n                this[\"AccountDetailsStoragePath\"] = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\" GeneratedClassNamespace=\"EVEMon.Properties\" GeneratedClassName=\"Settings\">\n  <Profiles />\n  <Settings>\n    <Setting Name=\"AccountDetailsStoragePath\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">%appdata%/EVEMon/AccountInfo.xml</Value>\n    </Setting>\n  </Settings>\n</SettingsFile>"
  },
  {
    "path": "src/EVEMon/Schedule/CalendarControl.Designer.cs",
    "content": "namespace EVEMon.Schedule\n{\n    partial class CalendarControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.SuspendLayout();\n            // \n            // CalendarControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.DoubleBuffered = true;\n            this.Name = \"CalendarControl\";\n            this.Size = new System.Drawing.Size(321, 227);\n            this.Load += new System.EventHandler(this.CalendarControl_Load);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Schedule/CalendarControl.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\n\nnamespace EVEMon.Schedule\n{\n    public enum CalendarType\n    {\n        Month\n    }\n\n    public partial class CalendarControl : UserControl\n    {\n\n        public event EventHandler<DaySelectedEventArgs> DayClicked;\n        public event EventHandler<DaySelectedEventArgs> DayDoubleClicked;\n\n        private const double CellAspectRatio = 7.0d / 10.0d;\n        private const int MaxRows = 6;\n        private const int HeaderHeight = 20;\n        private const int DayHeaderHeight = 20;\n\n        private Point m_calTopLeft = new Point(0, 0);\n        private Size m_cellSize = new Size(5, 5);\n        private DayOfWeek m_firstDayOfWeek;\n        private CalendarType m_calendarType = CalendarType.Month;\n        private DateTime m_date;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CalendarControl\"/> class.\n        /// </summary>\n        protected CalendarControl()\n        {\n            InitializeComponent();\n\n            SetStyle(ControlStyles.AllPaintingInWmPaint, true);\n            SetStyle(ControlStyles.Opaque, true);\n            SetStyle(ControlStyles.ResizeRedraw, true);\n\n            m_date = DateTime.Now;\n        }\n\n        /// <summary>\n        /// Gets or sets the type of the calendar.\n        /// </summary>\n        /// <value>The type of the calendar.</value>\n        public CalendarType CalendarType\n        {\n            get { return m_calendarType; }\n            set\n            {\n                if (m_calendarType == value)\n                    return;\n\n                m_calendarType = value;\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the date.\n        /// </summary>\n        /// <value>The date.</value>\n        public DateTime Date\n        {\n            get { return m_date; }\n            set\n            {\n                if (m_date == value)\n                    return;\n\n                m_date = value;\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// Handles the Load event of the CalendarControl control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void CalendarControl_Load(object sender, EventArgs e)\n        {\n            m_firstDayOfWeek = CultureConstants.DefaultCulture.DateTimeFormat.FirstDayOfWeek;\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.Paint\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.PaintEventArgs\"/> that contains the event data.</param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            using (Brush b = new LinearGradientBrush(ClientRectangle, Color.LightBlue, Color.DarkBlue, 90.0F))\n            {\n                e.Graphics.FillRectangle(b, e.ClipRectangle);\n            }\n\n            switch (m_calendarType)\n            {\n                case CalendarType.Month:\n                    PaintMonthCalendar(e);\n                    HighlightToday(e);\n                    HighlightDay(e);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Calculates the cell metrics.\n        /// </summary>\n        private void CalculateCellMetrics()\n        {\n            double maxCellWidth = Math.Floor(Convert.ToDouble(ClientSize.Width) / 8.0f);\n            double maxCellHeight =\n                Math.Floor(Convert.ToDouble(ClientSize.Height - HeaderHeight - DayHeaderHeight) /\n                           Convert.ToDouble(MaxRows + 1));\n\n            double heightWithMaxWidth = Math.Floor(maxCellWidth * CellAspectRatio);\n\n            int effectiveHeight = Convert.ToInt32(heightWithMaxWidth);\n            int effectiveWidth = Convert.ToInt32(maxCellWidth);\n            if (heightWithMaxWidth > maxCellHeight)\n            {\n                double widthWithMaxHeight = Math.Floor(maxCellHeight / CellAspectRatio);\n                effectiveHeight = Convert.ToInt32(maxCellHeight);\n                effectiveWidth = Convert.ToInt32(widthWithMaxHeight);\n            }\n\n            int calWidth = effectiveWidth * 7;\n            int calHeight = effectiveHeight * MaxRows;\n\n            m_calTopLeft = new Point(ClientSize.Width / 2 - calWidth / 2,\n                                     ClientSize.Height / 2 - (calHeight + HeaderHeight + DayHeaderHeight) / 2);\n            m_cellSize = new Size(effectiveWidth, effectiveHeight);\n        }\n\n        /// <summary>\n        /// Paints the month calendar.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"PaintEventArgs\"/> instance containing the event data.</param>\n        private void PaintMonthCalendar(PaintEventArgs e)\n        {\n            Graphics graphics = e.Graphics;\n\n            CalculateCellMetrics();\n\n            DateTime mdt = new DateTime(m_date.Year, m_date.Month, 1);\n            string ymDesc = mdt.ToString(\"y\", CultureConstants.DefaultCulture);\n\n            DayOfWeek firstDayDow = mdt.DayOfWeek;\n            DayOfWeek cDow = m_firstDayOfWeek;\n            using (Font boldf = FontFactory.GetDefaultFont(FontStyle.Bold))\n            {\n                Rectangle headerRect = new Rectangle(m_calTopLeft.X, m_calTopLeft.Y,\n                                                     m_cellSize.Width * 7, HeaderHeight);\n                using (Brush hb = new SolidBrush(Color.FromArgb(47, 77, 132)))\n                {\n                    graphics.FillRectangle(hb, headerRect);\n                }\n                graphics.DrawRectangle(Pens.Black, headerRect);\n                TextRenderer.DrawText(graphics, ymDesc, boldf,\n                                      new Rectangle(headerRect.Left + 1, headerRect.Top + 1, headerRect.Width - 2,\n                                                    headerRect.Height - 2),\n                                      Color.White, Color.Transparent,\n                                      TextFormatFlags.EndEllipsis | TextFormatFlags.HorizontalCenter |\n                                      TextFormatFlags.VerticalCenter);\n\n                using (Brush db = new SolidBrush(Color.FromArgb(106, 149, 228)))\n                {\n                    for (int x = 0; x < 7; x++)\n                    {\n                        Rectangle cellRect = new Rectangle(m_calTopLeft.X + m_cellSize.Width * x,\n                                                           m_calTopLeft.Y + HeaderHeight, m_cellSize.Width,\n                                                           DayHeaderHeight);\n                        graphics.FillRectangle(db, cellRect);\n                        graphics.DrawRectangle(Pens.Black, cellRect);\n\n                        string dayName = CultureConstants.DefaultCulture.DateTimeFormat.DayNames[(int)cDow];\n                        TextRenderer.DrawText(graphics, dayName, boldf,\n                                              new Rectangle(cellRect.Left + 1, cellRect.Top + 1, cellRect.Width - 2,\n                                                            cellRect.Height - 2),\n                                              Color.Black, Color.Transparent,\n                                              TextFormatFlags.EndEllipsis | TextFormatFlags.HorizontalCenter |\n                                              TextFormatFlags.VerticalCenter);\n\n                        cDow = (DayOfWeek)(((int)cDow + 1) % 7);\n                    }\n                }\n            }\n\n            bool daysRunning = false;\n            using (Brush validDayBrush = new LinearGradientBrush(\n                new Rectangle(m_calTopLeft.X, m_calTopLeft.Y + HeaderHeight + DayHeaderHeight,\n                              m_cellSize.Width * 7, m_cellSize.Height * MaxRows),\n                Color.FromArgb(244, 244, 244), Color.FromArgb(203, 220, 228), LinearGradientMode.Vertical))\n            {\n                for (int y = 0; y < MaxRows; y++)\n                {\n                    cDow = m_firstDayOfWeek;\n                    using (Brush invalidDayBrush = new LinearGradientBrush(\n                        new Rectangle(m_calTopLeft.X,\n                                      m_calTopLeft.Y + HeaderHeight + DayHeaderHeight + y * m_cellSize.Height,\n                                      m_cellSize.Width * 7, m_cellSize.Height),\n                        Color.FromArgb(169, 169, 169), Color.FromArgb(140, 140, 140), LinearGradientMode.Vertical))\n                    {\n                        for (int x = 0; x < 7; x++)\n                        {\n                            bool isValidDay = false;\n                            int dayNum = 0;\n                            if (!daysRunning && cDow == firstDayDow)\n                                daysRunning = true;\n\n                            if (daysRunning)\n                            {\n                                if (mdt.Month == m_date.Month)\n                                {\n                                    isValidDay = true;\n                                    dayNum = mdt.Day;\n                                    mdt = mdt + TimeSpan.FromDays(1);\n                                }\n                            }\n\n                            Rectangle cellRect = new Rectangle(m_calTopLeft.X + m_cellSize.Width * x,\n                                                               m_calTopLeft.Y + HeaderHeight + DayHeaderHeight +\n                                                               m_cellSize.Height * y, m_cellSize.Width,\n                                                               m_cellSize.Height);\n                            graphics.FillRectangle(isValidDay ? validDayBrush : invalidDayBrush, cellRect);\n                            graphics.DrawRectangle(Pens.Black, cellRect);\n\n                            if (isValidDay)\n                            {\n                                TextRenderer.DrawText(graphics, dayNum.ToString(CultureConstants.DefaultCulture), Font,\n                                                      new Point(cellRect.Left + 2, cellRect.Top + 2), Color.Black,\n                                                      Color.Transparent,\n                                                      TextFormatFlags.NoPadding | TextFormatFlags.NoClipping);\n\n                                DateTime datetime = new DateTime(m_date.Year, m_date.Month, dayNum);\n                                PaintMonthEntriesForDay(graphics, datetime, cellRect);\n                            }\n\n                            cDow = (DayOfWeek)(((int)cDow + 1) % 7);\n                        }\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Determines whether the date at the specified point is a valid date.\n        /// </summary>\n        /// <param name=\"point\">The point.</param>\n        /// <returns></returns>\n        public bool IsValidDate(Point point) => Date.Month == GetDateFromPoint(point).Month;\n\n        /// <summary>\n        /// Paints the month entries for day.\n        /// </summary>\n        /// <param name=\"graphics\">The graphics.</param>\n        /// <param name=\"datetime\">The datetime.</param>\n        /// <param name=\"cellRect\">The cell rect.</param>\n        protected virtual void PaintMonthEntriesForDay(Graphics graphics, DateTime datetime, Rectangle cellRect)\n        {\n            // No Implementation\n        }\n\n        /// <summary>\n        /// Highlights the day.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void HighlightDay(PaintEventArgs e)\n        {\n            Graphics g = e.Graphics;\n\n            CalculateCellMetrics();\n            DateTime mdt = new DateTime(m_date.Year, m_date.Month, 1);\n\n            int boxNumber = m_date.Day + ((int)mdt.DayOfWeek + (7 - (int)m_firstDayOfWeek)) % 7 - 1;\n            int x = boxNumber % 7;\n            int y = (int)Math.Floor(boxNumber / 7.0);\n            Rectangle cellRect = new Rectangle(m_calTopLeft.X + m_cellSize.Width * x,\n                                               m_calTopLeft.Y + HeaderHeight + DayHeaderHeight +\n                                               m_cellSize.Height * y, m_cellSize.Width, m_cellSize.Height);\n            g.DrawRectangle(Pens.DeepSkyBlue, cellRect);\n        }\n\n        /// <summary>\n        /// Highlights the today.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.PaintEventArgs\"/> instance containing the event data.</param>\n        private void HighlightToday(PaintEventArgs e)\n        {\n            DateTime today = DateTime.Now;\n            DateTime mdt = new DateTime(m_date.Year, m_date.Month, 1);\n            if (today.Month != mdt.Month || today.Year != mdt.Year)\n                return;\n\n            Graphics g = e.Graphics;\n\n            CalculateCellMetrics();\n\n            int boxNumber = today.Day + ((int)mdt.DayOfWeek + (7 - (int)m_firstDayOfWeek)) % 7 - 1;\n            int x = boxNumber % 7;\n            int y = (int)Math.Floor(boxNumber / 7.0);\n            Rectangle cellRect = new Rectangle(m_calTopLeft.X + m_cellSize.Width * x,\n                                               m_calTopLeft.Y + HeaderHeight + DayHeaderHeight +\n                                               m_cellSize.Height * y, m_cellSize.Width, m_cellSize.Height);\n            g.DrawRectangle(Pens.Violet, cellRect);\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.Click\"/> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnClick(EventArgs e)\n        {\n            base.OnClick(e);\n\n            MouseEventArgs mouse = (MouseEventArgs)e;\n            Point point = mouse.Location;\n\n            DateTime newDate = GetDateFromPoint(point);\n            bool isSameMonth = newDate.Month == m_date.Month;\n            if (newDate == new DateTime(0))\n                return;\n\n            m_date = newDate;\n            Invalidate();\n\n            // Only send out the events if we clicked once\n            if (mouse.Clicks == 1)\n                DayClicked?.ThreadSafeInvoke(null, new DaySelectedEventArgs(m_date, isSameMonth, mouse, point));\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.DoubleClick\"/> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnDoubleClick(EventArgs e)\n        {\n            base.OnDoubleClick(e);\n\n            MouseEventArgs mouse = (MouseEventArgs)e;\n            Point point = mouse.Location;\n            DateTime newDate = GetDateFromPoint(point);\n            bool isSameMonth = newDate.Month == m_date.Month;\n            if (newDate == new DateTime(0))\n                return;\n\n            // Only send out the events if we double clicked\n            if (mouse.Clicks == 2)\n                DayDoubleClicked?.ThreadSafeInvoke(null, new DaySelectedEventArgs(m_date, isSameMonth, mouse, point));\n        }\n\n        // \n        /// <summary>\n        /// Gets the date under a specific point (used for hover tips etc).\n        /// </summary>\n        /// <param name=\"p\">The p.</param>\n        /// <returns></returns>\n        private DateTime GetDateFromPoint(Point p)\n        {\n            // Make sure the member values are set up\n            CalculateCellMetrics();\n\n            // Make sure we clicked on the scheduler\n            if (p.X < m_calTopLeft.X || p.Y < m_calTopLeft.Y ||\n                (p.X > m_calTopLeft.X + m_cellSize.Width * 7) ||\n                (p.Y > m_calTopLeft.Y + m_cellSize.Height * MaxRows + HeaderHeight + DayHeaderHeight))\n            {\n                return new DateTime(0);\n            }\n\n            // We need an int value for the first day of the month\n            DayOfWeek nFirstDayOfMonth = new DateTime(m_date.Year, m_date.Month, 1).DayOfWeek;\n            int nStartDay = nFirstDayOfMonth - m_firstDayOfWeek;\n\n            // Calculate the x/y position over the grid, and hence the day/week number the user is clicking on\n            int day = (p.X -= m_calTopLeft.X) / m_cellSize.Width;\n            int week = (p.Y -= m_calTopLeft.Y + HeaderHeight + DayHeaderHeight) / m_cellSize.Height;\n\n            if (nStartDay < 0)\n                week -= 1;\n\n            day -= nStartDay;\n\n            day += week * 7 + 1;\n\n            DateTime dt = m_date;\n            int month = m_date.Month;\n            int year = m_date.Year;\n            if (day > DateTime.DaysInMonth(dt.Year, dt.Month))\n            {\n                if (dt.Month + 1 > 12)\n                {\n                    year++;\n                    month = 1;\n                }\n                else\n                    month++;\n                day -= DateTime.DaysInMonth(dt.Year, dt.Month);\n            }\n            else if (day <= 0)\n            {\n                if (dt.Month - 1 <= 0)\n                {\n                    year--;\n                    month = 12;\n                }\n                else\n                    month--;\n                day += DateTime.DaysInMonth(year, month);\n            }\n            dt = new DateTime(year, month, day);\n\n            return dt;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/Schedule/CalendarControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/Schedule/DateSelectWindow.Designer.cs",
    "content": "namespace EVEMon.Schedule\n{\n    partial class DateSelectWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.monthCalendar1 = new System.Windows.Forms.MonthCalendar();\n            this.btnOk = new System.Windows.Forms.Button();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.SuspendLayout();\n            // \n            // monthCalendar1\n            // \n            this.monthCalendar1.CalendarDimensions = new System.Drawing.Size(2, 1);\n            this.monthCalendar1.Location = new System.Drawing.Point(12, 9);\n            this.monthCalendar1.MaxSelectionCount = 1;\n            this.monthCalendar1.Name = \"monthCalendar1\";\n            this.monthCalendar1.TabIndex = 0;\n            this.monthCalendar1.DateSelected += new System.Windows.Forms.DateRangeEventHandler(this.monthCalendar1_DateSelected);\n            this.monthCalendar1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.monthCalendar1_MouseDown);\n            // \n            // btnOk\n            // \n            this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOk.Location = new System.Drawing.Point(287, 178);\n            this.btnOk.Name = \"btnOk\";\n            this.btnOk.Size = new System.Drawing.Size(75, 23);\n            this.btnOk.TabIndex = 1;\n            this.btnOk.Text = \"OK\";\n            this.btnOk.UseVisualStyleBackColor = true;\n            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(368, 178);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 2;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // DateSelectWindow\n            // \n            this.AcceptButton = this.btnOk;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(455, 213);\n            this.Controls.Add(this.btnCancel);\n            this.Controls.Add(this.btnOk);\n            this.Controls.Add(this.monthCalendar1);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"DateSelectWindow\";\n            this.ShowInTaskbar = false;\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\n            this.Text = \"Select Date\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.MonthCalendar monthCalendar1;\n        private System.Windows.Forms.Button btnOk;\n        private System.Windows.Forms.Button btnCancel;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Schedule/DateSelectWindow.cs",
    "content": "using System;\nusing System.Windows.Forms;\nusing EVEMon.Common.Controls;\n\nnamespace EVEMon.Schedule\n{\n    public partial class DateSelectWindow : EVEMonForm\n    {\n        private int m_numClicks;\n        private DateTime m_firstClick = DateTime.MinValue;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"DateSelectWindow\"/> class.\n        /// </summary>\n        public DateSelectWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Gets or sets the selected date.\n        /// </summary>\n        /// <value>The selected date.</value>\n        public DateTime SelectedDate\n        {\n            get { return monthCalendar1.SelectionStart; }\n            set\n            {\n                monthCalendar1.SelectionStart = value;\n                monthCalendar1.SelectionEnd = value;\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnCancel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Cancel;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnOk control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnOk_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the DateSelected event of the monthCalendar1 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DateRangeEventArgs\"/> instance containing the event data.</param>\n        private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e)\n        {\n            if (m_numClicks >= 2)\n                btnOk_Click(this, new EventArgs());\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the monthCalendar1 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void monthCalendar1_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Left)\n                return;\n\n            if (DateTime.Now - TimeSpan.FromMilliseconds(500) > m_firstClick)\n            {\n                m_numClicks = 0;\n                m_firstClick = DateTime.Now;\n            }\n            m_numClicks++;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/Schedule/DateSelectWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/Schedule/EditScheduleEntryWindow.Designer.cs",
    "content": "namespace EVEMon.Schedule\n{\n    partial class EditScheduleEntryWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.groupBox1 = new System.Windows.Forms.GroupBox();\n            this.pnlRecurring = new System.Windows.Forms.Panel();\n            this.pnlRecurWeekly = new System.Windows.Forms.Panel();\n            this.label13 = new System.Windows.Forms.Label();\n            this.label14 = new System.Windows.Forms.Label();\n            this.nudWeeklyFrequency = new System.Windows.Forms.NumericUpDown();\n            this.btnRecurringNoStartDate = new System.Windows.Forms.Button();\n            this.btnRecurringNoEndDate = new System.Windows.Forms.Button();\n            this.tbRecurringTimeTo = new System.Windows.Forms.TextBox();\n            this.label9 = new System.Windows.Forms.Label();\n            this.label10 = new System.Windows.Forms.Label();\n            this.tbRecurringTimeFrom = new System.Windows.Forms.TextBox();\n            this.pnlRecurMonthly = new System.Windows.Forms.Panel();\n            this.label8 = new System.Windows.Forms.Label();\n            this.cbRecurOnOverflow = new System.Windows.Forms.ComboBox();\n            this.label7 = new System.Windows.Forms.Label();\n            this.nudRecurDayOfMonth = new System.Windows.Forms.NumericUpDown();\n            this.label6 = new System.Windows.Forms.Label();\n            this.cbRecurringFrequency = new System.Windows.Forms.ComboBox();\n            this.btnRecurringEndDateChoose = new System.Windows.Forms.Button();\n            this.label5 = new System.Windows.Forms.Label();\n            this.tbRecurringEndDate = new System.Windows.Forms.TextBox();\n            this.btnRecurringStartDateChoose = new System.Windows.Forms.Button();\n            this.label4 = new System.Windows.Forms.Label();\n            this.tbRecurringStartDate = new System.Windows.Forms.TextBox();\n            this.rbRecurring = new System.Windows.Forms.RadioButton();\n            this.pnlOneTime = new System.Windows.Forms.Panel();\n            this.label12 = new System.Windows.Forms.Label();\n            this.tbOneTimeEndDate = new System.Windows.Forms.TextBox();\n            this.btnOneTimeEndDateChoose = new System.Windows.Forms.Button();\n            this.label1 = new System.Windows.Forms.Label();\n            this.tbOneTimeEndTime = new System.Windows.Forms.TextBox();\n            this.tbOneTimeStartDate = new System.Windows.Forms.TextBox();\n            this.label3 = new System.Windows.Forms.Label();\n            this.btnOneTimeStartDateChoose = new System.Windows.Forms.Button();\n            this.label2 = new System.Windows.Forms.Label();\n            this.tbOneTimeStartTime = new System.Windows.Forms.TextBox();\n            this.rbOneTime = new System.Windows.Forms.RadioButton();\n            this.groupBox2 = new System.Windows.Forms.GroupBox();\n            this.cbUseEVETime = new System.Windows.Forms.CheckBox();\n            this.cbSilent = new System.Windows.Forms.CheckBox();\n            this.cbBlocking = new System.Windows.Forms.CheckBox();\n            this.tbTitle = new System.Windows.Forms.TextBox();\n            this.label11 = new System.Windows.Forms.Label();\n            this.btnOk = new System.Windows.Forms.Button();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.buttonDebug = new System.Windows.Forms.Button();\n            this.groupBox1.SuspendLayout();\n            this.pnlRecurring.SuspendLayout();\n            this.pnlRecurWeekly.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.nudWeeklyFrequency)).BeginInit();\n            this.pnlRecurMonthly.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.nudRecurDayOfMonth)).BeginInit();\n            this.pnlOneTime.SuspendLayout();\n            this.groupBox2.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // groupBox1\n            // \n            this.groupBox1.Controls.Add(this.pnlRecurring);\n            this.groupBox1.Controls.Add(this.rbRecurring);\n            this.groupBox1.Controls.Add(this.pnlOneTime);\n            this.groupBox1.Controls.Add(this.rbOneTime);\n            this.groupBox1.Location = new System.Drawing.Point(12, 135);\n            this.groupBox1.Name = \"groupBox1\";\n            this.groupBox1.Size = new System.Drawing.Size(377, 370);\n            this.groupBox1.TabIndex = 2;\n            this.groupBox1.TabStop = false;\n            this.groupBox1.Text = \"Date/Time Setting\";\n            // \n            // pnlRecurring\n            // \n            this.pnlRecurring.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.pnlRecurring.Controls.Add(this.pnlRecurWeekly);\n            this.pnlRecurring.Controls.Add(this.btnRecurringNoStartDate);\n            this.pnlRecurring.Controls.Add(this.btnRecurringNoEndDate);\n            this.pnlRecurring.Controls.Add(this.tbRecurringTimeTo);\n            this.pnlRecurring.Controls.Add(this.label9);\n            this.pnlRecurring.Controls.Add(this.label10);\n            this.pnlRecurring.Controls.Add(this.tbRecurringTimeFrom);\n            this.pnlRecurring.Controls.Add(this.pnlRecurMonthly);\n            this.pnlRecurring.Controls.Add(this.label6);\n            this.pnlRecurring.Controls.Add(this.cbRecurringFrequency);\n            this.pnlRecurring.Controls.Add(this.btnRecurringEndDateChoose);\n            this.pnlRecurring.Controls.Add(this.label5);\n            this.pnlRecurring.Controls.Add(this.tbRecurringEndDate);\n            this.pnlRecurring.Controls.Add(this.btnRecurringStartDateChoose);\n            this.pnlRecurring.Controls.Add(this.label4);\n            this.pnlRecurring.Controls.Add(this.tbRecurringStartDate);\n            this.pnlRecurring.Enabled = false;\n            this.pnlRecurring.Location = new System.Drawing.Point(37, 192);\n            this.pnlRecurring.Name = \"pnlRecurring\";\n            this.pnlRecurring.Size = new System.Drawing.Size(334, 168);\n            this.pnlRecurring.TabIndex = 10;\n            // \n            // pnlRecurWeekly\n            // \n            this.pnlRecurWeekly.Controls.Add(this.label13);\n            this.pnlRecurWeekly.Controls.Add(this.label14);\n            this.pnlRecurWeekly.Controls.Add(this.nudWeeklyFrequency);\n            this.pnlRecurWeekly.Location = new System.Drawing.Point(180, 51);\n            this.pnlRecurWeekly.Margin = new System.Windows.Forms.Padding(0);\n            this.pnlRecurWeekly.Name = \"pnlRecurWeekly\";\n            this.pnlRecurWeekly.Size = new System.Drawing.Size(139, 27);\n            this.pnlRecurWeekly.TabIndex = 21;\n            // \n            // label13\n            // \n            this.label13.AutoSize = true;\n            this.label13.Location = new System.Drawing.Point(3, 5);\n            this.label13.Name = \"label13\";\n            this.label13.Size = new System.Drawing.Size(36, 13);\n            this.label13.TabIndex = 18;\n            this.label13.Text = \"every:\";\n            // \n            // label14\n            // \n            this.label14.AutoSize = true;\n            this.label14.Location = new System.Drawing.Point(89, 6);\n            this.label14.Name = \"label14\";\n            this.label14.Size = new System.Drawing.Size(38, 13);\n            this.label14.TabIndex = 20;\n            this.label14.Text = \"weeks\";\n            // \n            // nudWeeklyFrequency\n            // \n            this.nudWeeklyFrequency.Location = new System.Drawing.Point(48, 3);\n            this.nudWeeklyFrequency.Maximum = new decimal(new int[] {\n            52,\n            0,\n            0,\n            0});\n            this.nudWeeklyFrequency.Minimum = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudWeeklyFrequency.Name = \"nudWeeklyFrequency\";\n            this.nudWeeklyFrequency.Size = new System.Drawing.Size(35, 20);\n            this.nudWeeklyFrequency.TabIndex = 19;\n            this.nudWeeklyFrequency.Value = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            // \n            // btnRecurringNoStartDate\n            // \n            this.btnRecurringNoStartDate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnRecurringNoStartDate.Location = new System.Drawing.Point(286, 0);\n            this.btnRecurringNoStartDate.Name = \"btnRecurringNoStartDate\";\n            this.btnRecurringNoStartDate.Size = new System.Drawing.Size(48, 23);\n            this.btnRecurringNoStartDate.TabIndex = 2;\n            this.btnRecurringNoStartDate.Text = \"None\";\n            this.btnRecurringNoStartDate.UseVisualStyleBackColor = true;\n            this.btnRecurringNoStartDate.Click += new System.EventHandler(this.btnRecurringNoStartDate_Click);\n            // \n            // btnRecurringNoEndDate\n            // \n            this.btnRecurringNoEndDate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnRecurringNoEndDate.Location = new System.Drawing.Point(286, 27);\n            this.btnRecurringNoEndDate.Name = \"btnRecurringNoEndDate\";\n            this.btnRecurringNoEndDate.Size = new System.Drawing.Size(48, 23);\n            this.btnRecurringNoEndDate.TabIndex = 5;\n            this.btnRecurringNoEndDate.Text = \"None\";\n            this.btnRecurringNoEndDate.UseVisualStyleBackColor = true;\n            this.btnRecurringNoEndDate.Click += new System.EventHandler(this.btnRecurringNoEndDate_Click);\n            // \n            // tbRecurringTimeTo\n            // \n            this.tbRecurringTimeTo.Location = new System.Drawing.Point(162, 144);\n            this.tbRecurringTimeTo.Name = \"tbRecurringTimeTo\";\n            this.tbRecurringTimeTo.Size = new System.Drawing.Size(64, 20);\n            this.tbRecurringTimeTo.TabIndex = 8;\n            this.tbRecurringTimeTo.TextChanged += new System.EventHandler(this.tbRecurringTimeTo_TextChanged);\n            // \n            // label9\n            // \n            this.label9.AutoSize = true;\n            this.label9.Location = new System.Drawing.Point(133, 147);\n            this.label9.Name = \"label9\";\n            this.label9.Size = new System.Drawing.Size(23, 13);\n            this.label9.TabIndex = 17;\n            this.label9.Text = \"To:\";\n            // \n            // label10\n            // \n            this.label10.AutoSize = true;\n            this.label10.Location = new System.Drawing.Point(-3, 147);\n            this.label10.Name = \"label10\";\n            this.label10.Size = new System.Drawing.Size(59, 13);\n            this.label10.TabIndex = 16;\n            this.label10.Text = \"Time From:\";\n            // \n            // tbRecurringTimeFrom\n            // \n            this.tbRecurringTimeFrom.Location = new System.Drawing.Point(63, 144);\n            this.tbRecurringTimeFrom.Name = \"tbRecurringTimeFrom\";\n            this.tbRecurringTimeFrom.Size = new System.Drawing.Size(64, 20);\n            this.tbRecurringTimeFrom.TabIndex = 7;\n            this.tbRecurringTimeFrom.TextChanged += new System.EventHandler(this.tbRecurringTimeFrom_TextChanged);\n            // \n            // pnlRecurMonthly\n            // \n            this.pnlRecurMonthly.AutoSize = true;\n            this.pnlRecurMonthly.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.pnlRecurMonthly.Controls.Add(this.label8);\n            this.pnlRecurMonthly.Controls.Add(this.cbRecurOnOverflow);\n            this.pnlRecurMonthly.Controls.Add(this.label7);\n            this.pnlRecurMonthly.Controls.Add(this.nudRecurDayOfMonth);\n            this.pnlRecurMonthly.Enabled = false;\n            this.pnlRecurMonthly.Location = new System.Drawing.Point(64, 81);\n            this.pnlRecurMonthly.Name = \"pnlRecurMonthly\";\n            this.pnlRecurMonthly.Size = new System.Drawing.Size(188, 51);\n            this.pnlRecurMonthly.TabIndex = 14;\n            // \n            // label8\n            // \n            this.label8.AutoSize = true;\n            this.label8.Location = new System.Drawing.Point(-3, 30);\n            this.label8.Name = \"label8\";\n            this.label8.Size = new System.Drawing.Size(67, 13);\n            this.label8.TabIndex = 3;\n            this.label8.Text = \"On overflow:\";\n            // \n            // cbRecurOnOverflow\n            // \n            this.cbRecurOnOverflow.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbRecurOnOverflow.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbRecurOnOverflow.FormattingEnabled = true;\n            this.cbRecurOnOverflow.Items.AddRange(new object[] {\n            \"Skip\",\n            \"Overlap Forward\",\n            \"Clip Backward\"});\n            this.cbRecurOnOverflow.Location = new System.Drawing.Point(79, 27);\n            this.cbRecurOnOverflow.Name = \"cbRecurOnOverflow\";\n            this.cbRecurOnOverflow.Size = new System.Drawing.Size(109, 21);\n            this.cbRecurOnOverflow.TabIndex = 1;\n            // \n            // label7\n            // \n            this.label7.AutoSize = true;\n            this.label7.Location = new System.Drawing.Point(-3, 2);\n            this.label7.Name = \"label7\";\n            this.label7.Size = new System.Drawing.Size(74, 13);\n            this.label7.TabIndex = 1;\n            this.label7.Text = \"Day of Month:\";\n            // \n            // nudRecurDayOfMonth\n            // \n            this.nudRecurDayOfMonth.Location = new System.Drawing.Point(79, 0);\n            this.nudRecurDayOfMonth.Maximum = new decimal(new int[] {\n            31,\n            0,\n            0,\n            0});\n            this.nudRecurDayOfMonth.Minimum = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudRecurDayOfMonth.Name = \"nudRecurDayOfMonth\";\n            this.nudRecurDayOfMonth.Size = new System.Drawing.Size(49, 20);\n            this.nudRecurDayOfMonth.TabIndex = 0;\n            this.nudRecurDayOfMonth.Value = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            // \n            // label6\n            // \n            this.label6.AutoSize = true;\n            this.label6.Location = new System.Drawing.Point(-3, 57);\n            this.label6.Name = \"label6\";\n            this.label6.Size = new System.Drawing.Size(60, 13);\n            this.label6.TabIndex = 13;\n            this.label6.Text = \"Frequency:\";\n            // \n            // cbRecurringFrequency\n            // \n            this.cbRecurringFrequency.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbRecurringFrequency.FormattingEnabled = true;\n            this.cbRecurringFrequency.Items.AddRange(new object[] {\n            \"Every Day\",\n            \"Weekdays\",\n            \"Weekends\",\n            \"Every Monday\",\n            \"Every Tuesday\",\n            \"Every Wednesday\",\n            \"Every Thursday\",\n            \"Every Friday\",\n            \"Every Saturday\",\n            \"Every Sunday\",\n            \"Monthly\"});\n            this.cbRecurringFrequency.Location = new System.Drawing.Point(63, 54);\n            this.cbRecurringFrequency.Name = \"cbRecurringFrequency\";\n            this.cbRecurringFrequency.Size = new System.Drawing.Size(114, 21);\n            this.cbRecurringFrequency.TabIndex = 6;\n            this.cbRecurringFrequency.SelectedIndexChanged += new System.EventHandler(this.cbRecurringFrequency_SelectedIndexChanged);\n            // \n            // btnRecurringEndDateChoose\n            // \n            this.btnRecurringEndDateChoose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnRecurringEndDateChoose.Location = new System.Drawing.Point(252, 27);\n            this.btnRecurringEndDateChoose.Name = \"btnRecurringEndDateChoose\";\n            this.btnRecurringEndDateChoose.Size = new System.Drawing.Size(28, 23);\n            this.btnRecurringEndDateChoose.TabIndex = 4;\n            this.btnRecurringEndDateChoose.Text = \"...\";\n            this.btnRecurringEndDateChoose.UseVisualStyleBackColor = true;\n            this.btnRecurringEndDateChoose.Click += new System.EventHandler(this.btnRecurringEndDateChoose_Click);\n            // \n            // label5\n            // \n            this.label5.AutoSize = true;\n            this.label5.Location = new System.Drawing.Point(-3, 30);\n            this.label5.Name = \"label5\";\n            this.label5.Size = new System.Drawing.Size(55, 13);\n            this.label5.TabIndex = 10;\n            this.label5.Text = \"End Date:\";\n            // \n            // tbRecurringEndDate\n            // \n            this.tbRecurringEndDate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbRecurringEndDate.Location = new System.Drawing.Point(63, 27);\n            this.tbRecurringEndDate.Name = \"tbRecurringEndDate\";\n            this.tbRecurringEndDate.ReadOnly = true;\n            this.tbRecurringEndDate.Size = new System.Drawing.Size(183, 20);\n            this.tbRecurringEndDate.TabIndex = 3;\n            // \n            // btnRecurringStartDateChoose\n            // \n            this.btnRecurringStartDateChoose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnRecurringStartDateChoose.Location = new System.Drawing.Point(252, 0);\n            this.btnRecurringStartDateChoose.Name = \"btnRecurringStartDateChoose\";\n            this.btnRecurringStartDateChoose.Size = new System.Drawing.Size(28, 23);\n            this.btnRecurringStartDateChoose.TabIndex = 1;\n            this.btnRecurringStartDateChoose.Text = \"...\";\n            this.btnRecurringStartDateChoose.UseVisualStyleBackColor = true;\n            this.btnRecurringStartDateChoose.Click += new System.EventHandler(this.btnRecurringStartDateChoose_Click);\n            // \n            // label4\n            // \n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(-3, 3);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(58, 13);\n            this.label4.TabIndex = 3;\n            this.label4.Text = \"Start Date:\";\n            // \n            // tbRecurringStartDate\n            // \n            this.tbRecurringStartDate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbRecurringStartDate.Location = new System.Drawing.Point(63, 0);\n            this.tbRecurringStartDate.Name = \"tbRecurringStartDate\";\n            this.tbRecurringStartDate.ReadOnly = true;\n            this.tbRecurringStartDate.Size = new System.Drawing.Size(183, 20);\n            this.tbRecurringStartDate.TabIndex = 0;\n            // \n            // rbRecurring\n            // \n            this.rbRecurring.AutoSize = true;\n            this.rbRecurring.Location = new System.Drawing.Point(17, 169);\n            this.rbRecurring.Name = \"rbRecurring\";\n            this.rbRecurring.Size = new System.Drawing.Size(97, 17);\n            this.rbRecurring.TabIndex = 1;\n            this.rbRecurring.TabStop = true;\n            this.rbRecurring.Text = \"Recurring entry\";\n            this.rbRecurring.UseVisualStyleBackColor = true;\n            this.rbRecurring.CheckedChanged += new System.EventHandler(this.rbRecurring_CheckedChanged);\n            // \n            // pnlOneTime\n            // \n            this.pnlOneTime.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.pnlOneTime.Controls.Add(this.label12);\n            this.pnlOneTime.Controls.Add(this.tbOneTimeEndDate);\n            this.pnlOneTime.Controls.Add(this.btnOneTimeEndDateChoose);\n            this.pnlOneTime.Controls.Add(this.label1);\n            this.pnlOneTime.Controls.Add(this.tbOneTimeEndTime);\n            this.pnlOneTime.Controls.Add(this.tbOneTimeStartDate);\n            this.pnlOneTime.Controls.Add(this.label3);\n            this.pnlOneTime.Controls.Add(this.btnOneTimeStartDateChoose);\n            this.pnlOneTime.Controls.Add(this.label2);\n            this.pnlOneTime.Controls.Add(this.tbOneTimeStartTime);\n            this.pnlOneTime.Location = new System.Drawing.Point(37, 53);\n            this.pnlOneTime.Name = \"pnlOneTime\";\n            this.pnlOneTime.Size = new System.Drawing.Size(334, 105);\n            this.pnlOneTime.TabIndex = 8;\n            // \n            // label12\n            // \n            this.label12.AutoSize = true;\n            this.label12.Location = new System.Drawing.Point(-2, 57);\n            this.label12.Name = \"label12\";\n            this.label12.Size = new System.Drawing.Size(55, 13);\n            this.label12.TabIndex = 9;\n            this.label12.Text = \"End Date:\";\n            // \n            // tbOneTimeEndDate\n            // \n            this.tbOneTimeEndDate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbOneTimeEndDate.Location = new System.Drawing.Point(64, 54);\n            this.tbOneTimeEndDate.Name = \"tbOneTimeEndDate\";\n            this.tbOneTimeEndDate.ReadOnly = true;\n            this.tbOneTimeEndDate.Size = new System.Drawing.Size(189, 20);\n            this.tbOneTimeEndDate.TabIndex = 3;\n            // \n            // btnOneTimeEndDateChoose\n            // \n            this.btnOneTimeEndDateChoose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOneTimeEndDateChoose.Location = new System.Drawing.Point(259, 54);\n            this.btnOneTimeEndDateChoose.Name = \"btnOneTimeEndDateChoose\";\n            this.btnOneTimeEndDateChoose.Size = new System.Drawing.Size(75, 23);\n            this.btnOneTimeEndDateChoose.TabIndex = 4;\n            this.btnOneTimeEndDateChoose.Text = \"Choose...\";\n            this.btnOneTimeEndDateChoose.UseVisualStyleBackColor = true;\n            this.btnOneTimeEndDateChoose.Click += new System.EventHandler(this.btnOneTimeEndDateChoose_Click);\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(-3, 3);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(58, 13);\n            this.label1.TabIndex = 2;\n            this.label1.Text = \"Start Date:\";\n            // \n            // tbOneTimeEndTime\n            // \n            this.tbOneTimeEndTime.Location = new System.Drawing.Point(63, 81);\n            this.tbOneTimeEndTime.Name = \"tbOneTimeEndTime\";\n            this.tbOneTimeEndTime.Size = new System.Drawing.Size(64, 20);\n            this.tbOneTimeEndTime.TabIndex = 5;\n            this.tbOneTimeEndTime.TextChanged += new System.EventHandler(this.tbOneTimeEndTime_TextChanged);\n            // \n            // tbOneTimeStartDate\n            // \n            this.tbOneTimeStartDate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbOneTimeStartDate.Location = new System.Drawing.Point(63, 0);\n            this.tbOneTimeStartDate.Name = \"tbOneTimeStartDate\";\n            this.tbOneTimeStartDate.ReadOnly = true;\n            this.tbOneTimeStartDate.Size = new System.Drawing.Size(190, 20);\n            this.tbOneTimeStartDate.TabIndex = 0;\n            // \n            // label3\n            // \n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(-2, 84);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(55, 13);\n            this.label3.TabIndex = 6;\n            this.label3.Text = \"End Time:\";\n            // \n            // btnOneTimeStartDateChoose\n            // \n            this.btnOneTimeStartDateChoose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOneTimeStartDateChoose.Location = new System.Drawing.Point(259, 0);\n            this.btnOneTimeStartDateChoose.Name = \"btnOneTimeStartDateChoose\";\n            this.btnOneTimeStartDateChoose.Size = new System.Drawing.Size(75, 23);\n            this.btnOneTimeStartDateChoose.TabIndex = 1;\n            this.btnOneTimeStartDateChoose.Text = \"Choose...\";\n            this.btnOneTimeStartDateChoose.UseVisualStyleBackColor = true;\n            this.btnOneTimeStartDateChoose.Click += new System.EventHandler(this.btnOneTimeStartDateChoose_Click);\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(-3, 30);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(58, 13);\n            this.label2.TabIndex = 5;\n            this.label2.Text = \"Start Time:\";\n            // \n            // tbOneTimeStartTime\n            // \n            this.tbOneTimeStartTime.Location = new System.Drawing.Point(63, 27);\n            this.tbOneTimeStartTime.Name = \"tbOneTimeStartTime\";\n            this.tbOneTimeStartTime.Size = new System.Drawing.Size(64, 20);\n            this.tbOneTimeStartTime.TabIndex = 2;\n            this.tbOneTimeStartTime.TextChanged += new System.EventHandler(this.tbOneTimeStartTime_TextChanged);\n            // \n            // rbOneTime\n            // \n            this.rbOneTime.AutoSize = true;\n            this.rbOneTime.Checked = true;\n            this.rbOneTime.Location = new System.Drawing.Point(17, 30);\n            this.rbOneTime.Name = \"rbOneTime\";\n            this.rbOneTime.Size = new System.Drawing.Size(93, 17);\n            this.rbOneTime.TabIndex = 0;\n            this.rbOneTime.TabStop = true;\n            this.rbOneTime.Text = \"One time entry\";\n            this.rbOneTime.UseVisualStyleBackColor = true;\n            this.rbOneTime.CheckedChanged += new System.EventHandler(this.rbOneTime_CheckedChanged);\n            // \n            // groupBox2\n            // \n            this.groupBox2.Controls.Add(this.cbUseEVETime);\n            this.groupBox2.Controls.Add(this.cbSilent);\n            this.groupBox2.Controls.Add(this.cbBlocking);\n            this.groupBox2.Location = new System.Drawing.Point(12, 36);\n            this.groupBox2.Name = \"groupBox2\";\n            this.groupBox2.Size = new System.Drawing.Size(377, 93);\n            this.groupBox2.TabIndex = 1;\n            this.groupBox2.TabStop = false;\n            this.groupBox2.Text = \"Schedule Type\";\n            // \n            // cbUseEVETime\n            // \n            this.cbUseEVETime.AutoSize = true;\n            this.cbUseEVETime.Location = new System.Drawing.Point(17, 66);\n            this.cbUseEVETime.Name = \"cbUseEVETime\";\n            this.cbUseEVETime.Size = new System.Drawing.Size(176, 17);\n            this.cbUseEVETime.TabIndex = 2;\n            this.cbUseEVETime.Text = \"Entry defined in EVE/UTC Time\";\n            this.cbUseEVETime.UseVisualStyleBackColor = true;\n            // \n            // cbSilent\n            // \n            this.cbSilent.AutoSize = true;\n            this.cbSilent.Location = new System.Drawing.Point(17, 43);\n            this.cbSilent.Name = \"cbSilent\";\n            this.cbSilent.Size = new System.Drawing.Size(290, 17);\n            this.cbSilent.TabIndex = 1;\n            this.cbSilent.Text = \"Silent mode during this entry (no tray tooltips nor sounds)\";\n            this.cbSilent.UseVisualStyleBackColor = true;\n            // \n            // cbBlocking\n            // \n            this.cbBlocking.AutoSize = true;\n            this.cbBlocking.Location = new System.Drawing.Point(17, 20);\n            this.cbBlocking.Name = \"cbBlocking\";\n            this.cbBlocking.Size = new System.Drawing.Size(274, 17);\n            this.cbBlocking.TabIndex = 0;\n            this.cbBlocking.Text = \"Unavailable to start new skill training during this entry\";\n            this.cbBlocking.UseVisualStyleBackColor = true;\n            // \n            // tbTitle\n            // \n            this.tbTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbTitle.Location = new System.Drawing.Point(48, 9);\n            this.tbTitle.Name = \"tbTitle\";\n            this.tbTitle.Size = new System.Drawing.Size(341, 20);\n            this.tbTitle.TabIndex = 0;\n            this.tbTitle.TextChanged += new System.EventHandler(this.tbTitle_TextChanged);\n            // \n            // label11\n            // \n            this.label11.AutoSize = true;\n            this.label11.Location = new System.Drawing.Point(12, 12);\n            this.label11.Name = \"label11\";\n            this.label11.Size = new System.Drawing.Size(30, 13);\n            this.label11.TabIndex = 1;\n            this.label11.Text = \"Title:\";\n            // \n            // btnOk\n            // \n            this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOk.Enabled = false;\n            this.btnOk.Location = new System.Drawing.Point(233, 515);\n            this.btnOk.Name = \"btnOk\";\n            this.btnOk.Size = new System.Drawing.Size(75, 23);\n            this.btnOk.TabIndex = 3;\n            this.btnOk.Text = \"OK\";\n            this.btnOk.UseVisualStyleBackColor = true;\n            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(314, 515);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 4;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // buttonDebug\n            // \n            this.buttonDebug.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.buttonDebug.Location = new System.Drawing.Point(12, 514);\n            this.buttonDebug.Name = \"buttonDebug\";\n            this.buttonDebug.Size = new System.Drawing.Size(114, 23);\n            this.buttonDebug.TabIndex = 5;\n            this.buttonDebug.Text = \"debug: roundtrip\";\n            this.buttonDebug.UseVisualStyleBackColor = true;\n            this.buttonDebug.Click += new System.EventHandler(this.buttonDebug_Click);\n            // \n            // EditScheduleEntryWindow\n            // \n            this.AcceptButton = this.btnOk;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(401, 550);\n            this.Controls.Add(this.buttonDebug);\n            this.Controls.Add(this.btnCancel);\n            this.Controls.Add(this.btnOk);\n            this.Controls.Add(this.groupBox2);\n            this.Controls.Add(this.groupBox1);\n            this.Controls.Add(this.label11);\n            this.Controls.Add(this.tbTitle);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"EditScheduleEntryWindow\";\n            this.ShowInTaskbar = false;\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Schedule Entry\";\n            this.groupBox1.ResumeLayout(false);\n            this.groupBox1.PerformLayout();\n            this.pnlRecurring.ResumeLayout(false);\n            this.pnlRecurring.PerformLayout();\n            this.pnlRecurWeekly.ResumeLayout(false);\n            this.pnlRecurWeekly.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.nudWeeklyFrequency)).EndInit();\n            this.pnlRecurMonthly.ResumeLayout(false);\n            this.pnlRecurMonthly.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.nudRecurDayOfMonth)).EndInit();\n            this.pnlOneTime.ResumeLayout(false);\n            this.pnlOneTime.PerformLayout();\n            this.groupBox2.ResumeLayout(false);\n            this.groupBox2.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.GroupBox groupBox1;\n        private System.Windows.Forms.RadioButton rbOneTime;\n        private System.Windows.Forms.Panel pnlOneTime;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.TextBox tbOneTimeEndTime;\n        private System.Windows.Forms.TextBox tbOneTimeStartDate;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.Button btnOneTimeStartDateChoose;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.TextBox tbOneTimeStartTime;\n        private System.Windows.Forms.RadioButton rbRecurring;\n        private System.Windows.Forms.Panel pnlRecurring;\n        private System.Windows.Forms.Panel pnlRecurMonthly;\n        private System.Windows.Forms.NumericUpDown nudRecurDayOfMonth;\n        private System.Windows.Forms.Label label6;\n        private System.Windows.Forms.ComboBox cbRecurringFrequency;\n        private System.Windows.Forms.Button btnRecurringEndDateChoose;\n        private System.Windows.Forms.Label label5;\n        private System.Windows.Forms.TextBox tbRecurringEndDate;\n        private System.Windows.Forms.Button btnRecurringStartDateChoose;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.TextBox tbRecurringStartDate;\n        private System.Windows.Forms.Button btnRecurringNoEndDate;\n        private System.Windows.Forms.TextBox tbRecurringTimeTo;\n        private System.Windows.Forms.Label label9;\n        private System.Windows.Forms.Label label10;\n        private System.Windows.Forms.TextBox tbRecurringTimeFrom;\n        private System.Windows.Forms.Label label8;\n        private System.Windows.Forms.ComboBox cbRecurOnOverflow;\n        private System.Windows.Forms.Label label7;\n        private System.Windows.Forms.Button btnRecurringNoStartDate;\n        private System.Windows.Forms.GroupBox groupBox2;\n        private System.Windows.Forms.CheckBox cbSilent;\n        private System.Windows.Forms.CheckBox cbBlocking;\n        private System.Windows.Forms.TextBox tbTitle;\n        private System.Windows.Forms.Label label11;\n        private System.Windows.Forms.Button btnOk;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Label label12;\n        private System.Windows.Forms.TextBox tbOneTimeEndDate;\n        private System.Windows.Forms.Button btnOneTimeEndDateChoose;\n        private System.Windows.Forms.Button buttonDebug;\n        private System.Windows.Forms.CheckBox cbUseEVETime;\n        private System.Windows.Forms.Label label14;\n        private System.Windows.Forms.NumericUpDown nudWeeklyFrequency;\n        private System.Windows.Forms.Label label13;\n        private System.Windows.Forms.Panel pnlRecurWeekly;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Schedule/EditScheduleEntryWindow.cs",
    "content": "using System;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Scheduling;\n\nnamespace EVEMon.Schedule\n{\n    public partial class EditScheduleEntryWindow : EVEMonForm\n    {\n        private ScheduleEntry m_scheduleEntry;\n\n        private DateTime m_recurringDateFrom;\n        private DateTime m_recurringDateTo;\n        private DateTime m_oneTimeStartDate;\n        private DateTime m_oneTimeEndDate;\n        private int m_oneTimeStartTime;\n        private int m_oneTimeEndTime;\n        private int m_recurringStartTime;\n        private int m_recurringEndTime;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EditScheduleEntryWindow\"/> class.\n        /// </summary>\n        public EditScheduleEntryWindow()\n        {\n            InitializeComponent();\n\n            tbTitle.MaxLength = ScheduleEntry.TitleMaxLength;\n\n            if (!EveMonClient.IsDebugBuild)\n                buttonDebug.Visible = false;\n\n            InitialEntry();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EditScheduleEntryWindow\"/> class.\n        /// </summary>\n        /// <param name=\"defaultTime\">The default time.</param>\n        public EditScheduleEntryWindow(DateTime defaultTime)\n            : this()\n        {\n            DateTime start = defaultTime;\n            DateTime end = defaultTime.AddDays(1).AddMinutes(-1);\n\n            SetOneTimeStartDate(start);\n            SetOneTimeEndDate(end);\n\n            SetRecurringDateFrom(start);\n            SetRecurringDateTo(end);\n        }\n\n        /// <summary>\n        /// Gets or sets the schedule entry.\n        /// </summary>\n        /// <value>The schedule entry.</value>\n        public ScheduleEntry ScheduleEntry\n        {\n            get { return m_scheduleEntry; }\n            set\n            {\n                m_scheduleEntry = value;\n                UpdateFromEntry();\n            }\n        }\n\n        /// <summary>\n        /// Initials the entry.\n        /// </summary>\n        private void InitialEntry()\n        {\n            tbTitle.Text = String.Empty;\n            SetTypeFlags(ScheduleEntryOptions.None);\n            rbOneTime.Checked = true;\n            rbRecurring.Checked = false;\n            SetOneTimeStartDate(DateTime.Today);\n            tbOneTimeStartTime.Text = DateTime.Today.ToShortTimeString();\n            DateTime dtto = DateTime.Today.AddDays(1).AddMinutes(-1);\n            SetOneTimeEndDate(dtto);\n            tbOneTimeEndTime.Text = dtto.ToShortTimeString();\n            SetRecurringDateFrom(DateTime.MinValue);\n            SetRecurringDateTo(DateTime.MaxValue);\n            cbRecurringFrequency.SelectedIndex = 0;\n            nudWeeklyFrequency.Value = 1;\n            nudRecurDayOfMonth.Value = 1;\n            cbRecurOnOverflow.SelectedIndex = 0;\n            tbRecurringTimeFrom.Text = DateTime.Today.ToShortTimeString();\n            tbRecurringTimeTo.Text = dtto.ToShortTimeString();\n        }\n\n        /// <summary>\n        /// Updates from entry.\n        /// </summary>\n        private void UpdateFromEntry()\n        {\n            if (m_scheduleEntry == null)\n                return;\n\n            tbTitle.Text = m_scheduleEntry.Title;\n            SetTypeFlags(m_scheduleEntry.Options);\n\n            SimpleScheduleEntry sse = m_scheduleEntry as SimpleScheduleEntry;\n            RecurringScheduleEntry rse = m_scheduleEntry as RecurringScheduleEntry;\n\n            if (sse != null)\n            {\n                rbOneTime.Checked = true;\n                rbRecurring.Checked = false;\n                SetOneTimeStartDate(sse.StartDate);\n                tbOneTimeStartTime.Text = sse.StartDate.ToShortTimeString();\n                SetOneTimeEndDate(sse.EndDate);\n                tbOneTimeEndTime.Text = sse.EndDate.ToShortTimeString();\n            }\n            else if (rse != null)\n            {\n                rbOneTime.Checked = false;\n                rbRecurring.Checked = true;\n                SetRecurringDateFrom(rse.StartDate);\n                SetRecurringDateTo(rse.EndDate);\n                SetRecurringFrequencyDropdown(rse.Frequency, rse.DayOfWeek, rse.WeeksPeriod);\n                nudRecurDayOfMonth.Value = rse.DayOfMonth;\n                SetRecurringOverflowDropdown(rse.OverflowResolution);\n                DateTime tstart = DateTime.Today.AddSeconds(rse.StartTimeInSeconds);\n                DateTime tend = DateTime.Today.AddSeconds(rse.EndTimeInSeconds);\n                tbRecurringTimeFrom.Text = tstart.ToShortTimeString();\n                tbRecurringTimeTo.Text = tend.ToShortTimeString();\n            }\n\n            ValidateData();\n        }\n\n        /// <summary>\n        /// Sets the recurring overflow dropdown.\n        /// </summary>\n        /// <param name=\"monthlyOverflowResolution\">The monthly overflow resolution.</param>\n        private void SetRecurringOverflowDropdown(MonthlyOverflowResolution monthlyOverflowResolution)\n        {\n            switch (monthlyOverflowResolution)\n            {\n                case MonthlyOverflowResolution.Drop:\n                    cbRecurOnOverflow.SelectedIndex = 0;\n                    break;\n                case MonthlyOverflowResolution.OverlapForward:\n                    cbRecurOnOverflow.SelectedIndex = 1;\n                    break;\n                case MonthlyOverflowResolution.ClipBack:\n                    cbRecurOnOverflow.SelectedIndex = 2;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Gets the recurring overflow dropdown.\n        /// </summary>\n        /// <returns></returns>\n        private MonthlyOverflowResolution GetRecurringOverflowDropdown()\n        {\n            switch (cbRecurOnOverflow.SelectedIndex)\n            {\n                case 0:\n                    return MonthlyOverflowResolution.Drop;\n                case 1:\n                    return MonthlyOverflowResolution.OverlapForward;\n                case 2:\n                    return MonthlyOverflowResolution.ClipBack;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Sets the recurring frequency dropdown.\n        /// </summary>\n        /// <param name=\"recurFrequency\">The recur frequency.</param>\n        /// <param name=\"recurDow\">The recur dow.</param>\n        /// <param name=\"nWeekly\">The n weekly.</param>\n        private void SetRecurringFrequencyDropdown(RecurringFrequency recurFrequency, DayOfWeek recurDow, int nWeekly)\n        {\n            switch (recurFrequency)\n            {\n                case RecurringFrequency.Daily:\n                    cbRecurringFrequency.SelectedIndex = 0;\n                    break;\n                case RecurringFrequency.Weekdays:\n                    cbRecurringFrequency.SelectedIndex = 1;\n                    break;\n                case RecurringFrequency.Weekends:\n                    cbRecurringFrequency.SelectedIndex = 2;\n                    break;\n                case RecurringFrequency.Weekly:\n                    switch (recurDow)\n                    {\n                        case DayOfWeek.Monday:\n                            cbRecurringFrequency.SelectedIndex = 3;\n                            break;\n                        case DayOfWeek.Tuesday:\n                            cbRecurringFrequency.SelectedIndex = 4;\n                            break;\n                        case DayOfWeek.Wednesday:\n                            cbRecurringFrequency.SelectedIndex = 5;\n                            break;\n                        case DayOfWeek.Thursday:\n                            cbRecurringFrequency.SelectedIndex = 6;\n                            break;\n                        case DayOfWeek.Friday:\n                            cbRecurringFrequency.SelectedIndex = 7;\n                            break;\n                        case DayOfWeek.Saturday:\n                            cbRecurringFrequency.SelectedIndex = 8;\n                            break;\n                        case DayOfWeek.Sunday:\n                            cbRecurringFrequency.SelectedIndex = 9;\n                            break;\n                        default:\n                            throw new NotImplementedException();\n                    }\n                    nudWeeklyFrequency.Value = nWeekly;\n                    break;\n                case RecurringFrequency.Monthly:\n                    cbRecurringFrequency.SelectedIndex = 10;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Gets the recurring frequency dropdown.\n        /// </summary>\n        /// <returns></returns>\n        /// <exception cref=\"System.NotImplementedException\"></exception>\n        private RecurringFrequency GetRecurringFrequencyDropdown()\n        {\n            switch (cbRecurringFrequency.SelectedIndex)\n            {\n                case 0:\n                    return RecurringFrequency.Daily;\n                case 1:\n                    return RecurringFrequency.Weekdays;\n                case 2:\n                    return RecurringFrequency.Weekends;\n                case 3:\n                case 4:\n                case 5:\n                case 6:\n                case 7:\n                case 8:\n                case 9:\n                    return RecurringFrequency.Weekly;\n                case 10:\n                    return RecurringFrequency.Monthly;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Gets the recurring frequency dropdown.\n        /// </summary>\n        /// <returns></returns>\n        private DayOfWeek GetRecurringFrequencyDayOfWeek()\n        {\n            switch (cbRecurringFrequency.SelectedIndex)\n            {\n                case 4:\n                    return DayOfWeek.Tuesday;\n                case 5:\n                    return DayOfWeek.Wednesday;\n                case 6:\n                    return DayOfWeek.Thursday;\n                case 7:\n                    return DayOfWeek.Friday;\n                case 8:\n                    return DayOfWeek.Saturday;\n                case 9:\n                    return DayOfWeek.Sunday;\n                default:\n                    return DayOfWeek.Monday;\n            }\n        }\n\n        /// <summary>\n        /// Sets the type flags.\n        /// </summary>\n        /// <param name=\"scheduleEntryOptions\">The schedule entry options.</param>\n        private void SetTypeFlags(ScheduleEntryOptions scheduleEntryOptions)\n        {\n            cbBlocking.Checked = (scheduleEntryOptions & ScheduleEntryOptions.Blocking) != 0;\n            cbSilent.Checked = (scheduleEntryOptions & ScheduleEntryOptions.Quiet) != 0;\n            cbUseEVETime.Checked = (scheduleEntryOptions & ScheduleEntryOptions.EVETime) != 0;\n        }\n\n        /// <summary>\n        /// Gets the type flags.\n        /// </summary>\n        /// <returns></returns>\n        private ScheduleEntryOptions GetTypeFlags()\n        {\n            ScheduleEntryOptions result = ScheduleEntryOptions.None;\n            if (cbBlocking.Checked)\n                result |= ScheduleEntryOptions.Blocking;\n\n            if (cbSilent.Checked)\n                result |= ScheduleEntryOptions.Quiet;\n\n            if (cbUseEVETime.Checked)\n                result |= ScheduleEntryOptions.EVETime;\n\n            return result;\n        }\n\n        /// <summary>\n        /// Sets the recurring date to.\n        /// </summary>\n        /// <param name=\"dateTime\">The date time.</param>\n        private void SetRecurringDateTo(DateTime dateTime)\n        {\n            if (dateTime == DateTime.MinValue || dateTime == DateTime.MaxValue)\n            {\n                tbRecurringEndDate.Text = \"(Forever)\";\n                m_recurringDateTo = DateTime.MaxValue;\n                return;\n            }\n\n            tbRecurringEndDate.Text = dateTime.ToLongDateString();\n            m_recurringDateTo = dateTime.Date;\n        }\n\n        /// <summary>\n        /// Sets the recurring date from.\n        /// </summary>\n        /// <param name=\"dateTime\">The date time.</param>\n        private void SetRecurringDateFrom(DateTime dateTime)\n        {\n            if (dateTime == DateTime.MinValue || dateTime == DateTime.MaxValue)\n            {\n                tbRecurringStartDate.Text = \"(Forever)\";\n                m_recurringDateFrom = DateTime.MinValue;\n                return;\n            }\n\n            tbRecurringStartDate.Text = dateTime.ToLongDateString();\n            m_recurringDateFrom = dateTime.Date;\n        }\n\n        /// <summary>\n        /// Sets the one time start date.\n        /// </summary>\n        /// <param name=\"dateTime\">The date time.</param>\n        private void SetOneTimeStartDate(DateTime dateTime)\n        {\n            tbOneTimeStartDate.Text = dateTime.ToLongDateString();\n            m_oneTimeStartDate = dateTime.Date;\n        }\n\n        /// <summary>\n        /// Sets the one time end date.\n        /// </summary>\n        /// <param name=\"dateTime\">The date time.</param>\n        private void SetOneTimeEndDate(DateTime dateTime)\n        {\n            tbOneTimeEndDate.Text = dateTime.ToLongDateString();\n            m_oneTimeEndDate = dateTime.Date;\n        }\n\n        /// <summary>\n        /// Handles the CheckedChanged event of the rbOneTime control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbOneTime_CheckedChanged(object sender, EventArgs e)\n        {\n            pnlOneTime.Enabled = rbOneTime.Checked;\n\n            ValidateData();\n        }\n\n        /// <summary>\n        /// Handles the CheckedChanged event of the rbRecurring control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbRecurring_CheckedChanged(object sender, EventArgs e)\n        {\n            pnlRecurring.Enabled = rbRecurring.Checked;\n\n            ValidateData();\n        }\n\n        /// <summary>\n        /// Handles the SelectedIndexChanged event of the cbRecurringFrequency control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void cbRecurringFrequency_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            pnlRecurMonthly.Enabled = cbRecurringFrequency.SelectedIndex == 10;\n            pnlRecurWeekly.Enabled = cbRecurringFrequency.SelectedIndex >= 3 && cbRecurringFrequency.SelectedIndex <= 9;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnRecurringNoStartDate control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnRecurringNoStartDate_Click(object sender, EventArgs e)\n        {\n            SetRecurringDateFrom(DateTime.MinValue);\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnRecurringNoEndDate control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnRecurringNoEndDate_Click(object sender, EventArgs e)\n        {\n            SetRecurringDateTo(DateTime.MaxValue);\n        }\n\n        /// <summary>\n        /// Validates the data.\n        /// </summary>\n        private void ValidateData()\n        {\n            bool valid = true;\n            if (String.IsNullOrEmpty(tbTitle.Text) || String.IsNullOrEmpty(tbTitle.Text.Trim()))\n                valid = false;\n            else\n            {\n                if (rbOneTime.Checked)\n                {\n                    int startSec;\n                    int endSec;\n                    if (!Scheduler.TryParseTime(tbOneTimeStartTime.Text, out startSec) ||\n                        !Scheduler.TryParseTime(tbOneTimeEndTime.Text, out endSec))\n                        valid = false;\n                    else\n                    {\n                        DateTime startDate = m_oneTimeStartDate.AddSeconds(startSec);\n                        DateTime endDate = m_oneTimeEndDate.AddSeconds(endSec);\n                        if (startDate >= endDate)\n                            valid = false;\n                        else\n                        {\n                            m_oneTimeStartTime = startSec;\n                            m_oneTimeEndTime = endSec;\n                        }\n                    }\n                }\n                else if (rbRecurring.Checked)\n                {\n                    if (m_recurringDateFrom > m_recurringDateTo)\n                        valid = false;\n                    else\n                    {\n                        int startSec;\n                        int endSec;\n                        if (!Scheduler.TryParseTime(tbRecurringTimeFrom.Text, out startSec) ||\n                            !Scheduler.TryParseTime(tbRecurringTimeTo.Text, out endSec))\n                            valid = false;\n                        else\n                        {\n                            if (startSec >= endSec)\n                                endSec += RecurringScheduleEntry.SecondsPerDay;\n\n                            m_recurringStartTime = startSec;\n                            m_recurringEndTime = endSec;\n                        }\n                    }\n                }\n                else\n                    valid = false;\n            }\n\n            btnOk.Enabled = valid;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnCancel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Cancel;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnOk control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnOk_Click(object sender, EventArgs e)\n        {\n            m_scheduleEntry = GenerateScheduleEntry();\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        /// <summary>\n        /// Generates the schedule entry.\n        /// </summary>\n        /// <returns></returns>\n        private ScheduleEntry GenerateScheduleEntry()\n        {\n            ScheduleEntry result = null;\n            if (rbOneTime.Checked)\n            {\n                SimpleScheduleEntry sse = new SimpleScheduleEntry\n                                              {\n                                                  StartDate = new DateTime(\n                                                      m_oneTimeStartDate.AddSeconds(m_oneTimeStartTime).Ticks,\n                                                      DateTimeKind.Unspecified),\n                                                  EndDate = new DateTime(\n                                                      m_oneTimeEndDate.AddSeconds(m_oneTimeEndTime).Ticks,\n                                                      DateTimeKind.Unspecified)\n                                              };\n\n                result = sse;\n            }\n            else if (rbRecurring.Checked)\n            {\n                RecurringScheduleEntry rse = new RecurringScheduleEntry\n                                                 {\n                                                     StartDate = m_recurringDateFrom,\n                                                     EndDate = m_recurringDateTo,\n                                                     StartTimeInSeconds = m_recurringStartTime,\n                                                     EndTimeInSeconds = m_recurringEndTime,\n                                                     DayOfMonth = Convert.ToInt32(nudRecurDayOfMonth.Value),\n                                                     OverflowResolution = GetRecurringOverflowDropdown(),\n                                                     Frequency = GetRecurringFrequencyDropdown(),\n                                                     DayOfWeek = GetRecurringFrequencyDayOfWeek()\n                                                 };\n\n                if (rse.Frequency == RecurringFrequency.Weekly)\n                    rse.WeeksPeriod = Convert.ToInt32(nudWeeklyFrequency.Value);\n\n                result = rse;\n            }\n\n            if (result == null)\n                return null;\n\n            result.Title = tbTitle.Text;\n            result.Options = GetTypeFlags();\n\n            return result;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the button1 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void buttonDebug_Click(object sender, EventArgs e)\n        {\n            if (!btnOk.Enabled)\n                return;\n\n            ScheduleEntry ise = GenerateScheduleEntry();\n            ScheduleEntry = ise;\n        }\n\n        /// <summary>\n        /// Handles the TextChanged event of the tbTitle control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tbTitle_TextChanged(object sender, EventArgs e)\n        {\n            ValidateData();\n        }\n\n        /// <summary>\n        /// Handles the TextChanged event of the tbOneTimeStartTime control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tbOneTimeStartTime_TextChanged(object sender, EventArgs e)\n        {\n            ValidateData();\n        }\n\n        /// <summary>\n        /// Handles the TextChanged event of the tbOneTimeEndTime control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tbOneTimeEndTime_TextChanged(object sender, EventArgs e)\n        {\n            ValidateData();\n        }\n\n        /// <summary>\n        /// Handles the TextChanged event of the tbRecurringTimeFrom control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tbRecurringTimeFrom_TextChanged(object sender, EventArgs e)\n        {\n            ValidateData();\n        }\n\n        /// <summary>\n        /// Handles the TextChanged event of the tbRecurringTimeTo control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tbRecurringTimeTo_TextChanged(object sender, EventArgs e)\n        {\n            ValidateData();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnOneTimeStartDateChoose control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnOneTimeStartDateChoose_Click(object sender, EventArgs e)\n        {\n            m_oneTimeStartDate = GetDate(m_oneTimeStartDate);\n            SetOneTimeStartDate(m_oneTimeStartDate);\n            ValidateData();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnOneTimeEndDateChoose control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnOneTimeEndDateChoose_Click(object sender, EventArgs e)\n        {\n            m_oneTimeEndDate = GetDate(m_oneTimeEndDate);\n            SetOneTimeEndDate(m_oneTimeEndDate);\n            ValidateData();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnRecurringStartDateChoose control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnRecurringStartDateChoose_Click(object sender, EventArgs e)\n        {\n            m_recurringDateFrom = GetDate(m_recurringDateFrom);\n            SetRecurringDateFrom(m_recurringDateFrom);\n            ValidateData();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnRecurringEndDateChoose control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnRecurringEndDateChoose_Click(object sender, EventArgs e)\n        {\n            m_recurringDateTo = GetDate(m_recurringDateTo);\n            SetRecurringDateTo(m_recurringDateTo);\n            ValidateData();\n        }\n\n        /// <summary>\n        /// Gets the date.\n        /// </summary>\n        /// <param name=\"res\">The res.</param>\n        /// <returns></returns>\n        private static DateTime GetDate(DateTime res)\n        {\n            using (DateSelectWindow f = new DateSelectWindow())\n            {\n                if (res == DateTime.MinValue || res == DateTime.MaxValue)\n                    f.SelectedDate = DateTime.Today;\n                else\n                    f.SelectedDate = res;\n\n                DialogResult dr = f.ShowDialog();\n\n                return dr == DialogResult.Cancel ? res : f.SelectedDate;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/Schedule/EditScheduleEntryWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/Schedule/ScheduleCalendar.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Scheduling;\n\nnamespace EVEMon.Schedule\n{\n    public class ScheduleCalendar : CalendarControl\n    {\n        private readonly Collection<ScheduleEntry> m_entries = new Collection<ScheduleEntry>();\n\n        private const int LegendX = 5;\n        private const int LegendY = 5;\n        private const int LegendWidth = 200;\n        private const int LegendHeight = 40;\n        private const int LegendPadding = 5;\n        private const int LegendBox = 10;\n        private const int LegendSpacingX = 110;\n        private const int LegendSpacingY = 18;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ScheduleCalendar\"/> class.\n        /// </summary>\n        public ScheduleCalendar()\n        {\n            RecurringColor2 = Color.LightGreen;\n            RecurringColor = Color.Green;\n            SingleColor2 = Color.LightBlue;\n            SingleColor = Color.Blue;\n            BlockingColor = Color.Red;\n            TextColor = Color.White;\n            EntryFont = FontFactory.GetDefaultFont(7.0f);\n        }\n\n        /// <summary>\n        /// Gets or sets the entry font.\n        /// </summary>\n        /// <value>The entry font.</value>\n        public Font EntryFont { get; set; }\n\n        /// <summary>\n        /// Gets or sets the color of the text.\n        /// </summary>\n        /// <value>The color of the text.</value>\n        public Color TextColor { get; set; }\n\n        /// <summary>\n        /// Gets or sets the color of the blocking.\n        /// </summary>\n        /// <value>The color of the blocking.</value>\n        public Color BlockingColor { get; set; }\n\n        /// <summary>\n        /// Gets or sets the color of the single.\n        /// </summary>\n        /// <value>The color of the single.</value>\n        public Color SingleColor { get; set; }\n\n        /// <summary>\n        /// Gets or sets the single color2.\n        /// </summary>\n        /// <value>The single color2.</value>\n        public Color SingleColor2 { get; set; }\n\n        /// <summary>\n        /// Gets or sets the color of the recurring.\n        /// </summary>\n        /// <value>The color of the recurring.</value>\n        public Color RecurringColor { get; set; }\n\n        /// <summary>\n        /// Gets or sets the recurring color2.\n        /// </summary>\n        /// <value>The recurring color2.</value>\n        public Color RecurringColor2 { get; set; }\n\n        /// <summary>\n        /// Gets the entries.\n        /// </summary>\n        /// <value>The entries.</value>\n        public Collection<ScheduleEntry> Entries => m_entries;\n\n        protected override void Dispose(bool disposing)\n        {\n            base.Dispose(disposing);\n\n            EntryFont.Dispose();\n            EntryFont = null;\n        }\n\n        /// <summary>\n        /// Paints the month entries for day.\n        /// </summary>\n        /// <param name=\"graphics\">The graphics.</param>\n        /// <param name=\"datetime\">The datetime.</param>\n        /// <param name=\"cellRect\">The cell rect.</param>\n        /// <exception cref=\"System.ArgumentNullException\">graphics</exception>\n        protected override void PaintMonthEntriesForDay(Graphics graphics, DateTime datetime, Rectangle cellRect)\n        {\n            graphics.ThrowIfNull(nameof(graphics));\n\n            List<ScheduleEntry> todays = m_entries.Where(entry => entry.IsToday(datetime)).ToList();\n\n            // Sort Todays Entries Alphabetically\n            todays.Sort(new ScheduleEntryTitleComparer());\n\n            Rectangle rect = cellRect;\n            rect.X++;\n            rect.Y += 14;\n            rect.Width -= 1;\n            rect.Height = 11;\n\n\n            List<ScheduleEntry>.Enumerator e = todays.GetEnumerator();\n            if (!e.MoveNext())\n                return;\n\n            while (e.Current != null)\n            {\n                ScheduleEntry entry = e.Current;\n\n                if (entry is SimpleScheduleEntry)\n                {\n                    // Setup a nice Brush\n                    Brush fillBrush = (entry.Options & ScheduleEntryOptions.Blocking) != 0\n                                          ? new LinearGradientBrush(new Point(rect.X, rect.Y),\n                                                                    new Point(rect.X + rect.Width, rect.Y + rect.Height),\n                                                                    BlockingColor, SingleColor2)\n                                          : new LinearGradientBrush(new Point(rect.X, rect.Y),\n                                                                    new Point(rect.X + rect.Width, rect.Y + rect.Height),\n                                                                    SingleColor, SingleColor2);\n\n                    using (fillBrush)\n                    {\n                        // Check if the text fits\n                        Size textsize = TextRenderer.MeasureText(entry.Title, EntryFont);\n                        if (textsize.Width <= rect.Width)\n                        {\n                            graphics.FillRectangle(fillBrush, rect);\n                            TextRenderer.DrawText(graphics, entry.Title, EntryFont, new Point(rect.X + 1, rect.Y), TextColor);\n                        }\n                        else\n                        {\n                            // Make sure the text fits\n                            string shorttext = entry.Title + \"..\";\n                            for (int i = entry.Title.Length - 1; i > 4; i--)\n                            {\n                                shorttext = entry.Title.Substring(0, i) + \"..\";\n                                textsize = TextRenderer.MeasureText(shorttext, EntryFont);\n                                if (textsize.Width <= rect.Width)\n                                    break;\n                            }\n                            graphics.FillRectangle(fillBrush, rect);\n                            TextRenderer.DrawText(graphics, shorttext, EntryFont, new Point(rect.X + 1, rect.Y), TextColor);\n                        }\n                    }\n                }\n                else if (entry is RecurringScheduleEntry)\n                {\n                    // Setup a nice Brush\n                    Brush fillBrush = (entry.Options & ScheduleEntryOptions.Blocking) != 0\n                                          ? new LinearGradientBrush(new Point(rect.X, rect.Y),\n                                                                    new Point(rect.X + rect.Width, rect.Y + rect.Height),\n                                                                    BlockingColor, RecurringColor2)\n                                          : new LinearGradientBrush(new Point(rect.X, rect.Y),\n                                                                    new Point(rect.X + rect.Width, rect.Y + rect.Height),\n                                                                    RecurringColor, RecurringColor2);\n\n                    using (fillBrush)\n                    {\n                        Size textsize = TextRenderer.MeasureText(entry.Title, EntryFont);\n                        if (textsize.Width <= rect.Width)\n                        {\n                            graphics.FillRectangle(fillBrush, rect);\n                            TextRenderer.DrawText(graphics, entry.Title, EntryFont, new Point(rect.X + 1, rect.Y), TextColor);\n                        }\n                        else\n                        {\n                            // Make sure the text fits\n                            string shorttext = entry.Title + \"..\";\n                            for (int i = entry.Title.Length - 1; i > 4; i--)\n                            {\n                                shorttext = entry.Title.Substring(0, i) + \"..\";\n                                textsize = TextRenderer.MeasureText(shorttext, EntryFont);\n                                if (textsize.Width <= rect.Width)\n                                    break;\n                            }\n                            graphics.FillRectangle(fillBrush, rect);\n                            TextRenderer.DrawText(graphics, shorttext, EntryFont, new Point(rect.X + 1, rect.Y), TextColor);\n                        }\n                    }\n                }\n\n                rect.Y += rect.Height + 1;\n\n                // Check if we have room for one more entry?\n                if (rect.Y + rect.Height > cellRect.Y + cellRect.Height)\n                {\n                    // No, are there more entries?\n                    if (e.MoveNext())\n                    {\n                        // Yes, Draw something to let the user know\n                        int toomuch = rect.Y + rect.Height - (cellRect.Y + cellRect.Height);\n                        rect.Height -= toomuch;\n\n                        // Make sure LinearGradientBrush doesn't get into any troubles (Out Of Memory Because both points are at the same position)\n                        if (rect.Height == 0)\n                            rect.Height = 1;\n\n\n                        using (\n                            Brush brush = new LinearGradientBrush(new Point(rect.X, rect.Y),\n                                                                  new Point(rect.X, rect.Y + rect.Height), Color.Gray,\n                                                                  Color.LightGray))\n                        {\n                            graphics.FillRectangle(brush, rect);\n                        }\n                    }\n                    break;\n                }\n\n                // Yes, we have more room\n                e.MoveNext();\n            }\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.Paint\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.PaintEventArgs\"/> that contains the event data. </param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            // Paint the Calendar\n            base.OnPaint(e);\n\n            // Paint some kind of Legend\n            Graphics g = e.Graphics;\n\n            Rectangle r = new Rectangle { X = LegendX, Y = LegendY, Height = LegendHeight, Width = LegendWidth };\n            g.FillRectangle(Brushes.White, r);\n            g.DrawRectangle(Pens.Black, r);\n\n            r.X = LegendX + LegendPadding;\n            r.Y = LegendY + LegendPadding;\n            r.Width = LegendBox * 2;\n            r.Height = LegendBox;\n            using (\n                Brush b = new LinearGradientBrush(new Point(r.X, r.Y), new Point(r.X + r.Width, r.Y), SingleColor, SingleColor2))\n            {\n                g.FillRectangle(b, r);\n                g.DrawRectangle(Pens.Black, r);\n                TextRenderer.DrawText(g, \"Single Entry\", Font, new Point(r.X + r.Width + 2, r.Y), Color.Black);\n            }\n\n            r.Y += LegendSpacingY;\n            using (\n                Brush b = new LinearGradientBrush(new Point(r.X, r.Y), new Point(r.X + r.Width, r.Y), RecurringColor,\n                                                  RecurringColor2))\n            {\n                g.FillRectangle(b, r);\n                g.DrawRectangle(Pens.Black, r);\n                TextRenderer.DrawText(g, \"Recurring Entry\", Font, new Point(r.X + r.Width + 2, r.Y), Color.Black);\n            }\n\n            r.Y = LegendY + LegendPadding;\n            r.X += LegendSpacingX;\n            using (Brush b = new SolidBrush(BlockingColor))\n            {\n                g.FillRectangle(b, r);\n                g.DrawRectangle(Pens.Black, r);\n                TextRenderer.DrawText(g, \"Blocked\", Font, new Point(r.X + r.Width + 2, r.Y), Color.Black);\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/Schedule/ScheduleEditorWindow.Designer.cs",
    "content": "using EVEMon.Common.CustomEventArgs;\n\nnamespace EVEMon.Schedule\n{\n    partial class ScheduleEditorWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ScheduleEditorWindow));\n            this.toolStrip1 = new System.Windows.Forms.ToolStrip();\n            this.tsbAddEntry = new System.Windows.Forms.ToolStripButton();\n            this.tsbDeleteEntry = new System.Windows.Forms.ToolStripButton();\n            this.tsbClearExpired = new System.Windows.Forms.ToolStripButton();\n            this.splitContainer1 = new System.Windows.Forms.SplitContainer();\n            this.splitContainer2 = new System.Windows.Forms.SplitContainer();\n            this.lbEntries = new System.Windows.Forms.ListBox();\n            this.label1 = new System.Windows.Forms.Label();\n            this.lblEntryDescription = new System.Windows.Forms.Label();\n            this.panel1 = new System.Windows.Forms.Panel();\n            this.nudMonth = new System.Windows.Forms.DomainUpDown();\n            this.nudDay = new System.Windows.Forms.NumericUpDown();\n            this.nudYear = new System.Windows.Forms.NumericUpDown();\n            this.label2 = new System.Windows.Forms.Label();\n            this.cbViewType = new System.Windows.Forms.ComboBox();\n            this.ssStatusBar = new System.Windows.Forms.StatusStrip();\n            this.tsslStatusBarText = new System.Windows.Forms.ToolStripStatusLabel();\n            this.calContext = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.newScheduleEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeperator = new System.Windows.Forms.ToolStripSeparator();\n            this.toolTip = new System.Windows.Forms.ToolTip(this.components);\n            this.calControl = new EVEMon.Schedule.ScheduleCalendar();\n            this.toolStrip1.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();\n            this.splitContainer1.Panel1.SuspendLayout();\n            this.splitContainer1.Panel2.SuspendLayout();\n            this.splitContainer1.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();\n            this.splitContainer2.Panel1.SuspendLayout();\n            this.splitContainer2.Panel2.SuspendLayout();\n            this.splitContainer2.SuspendLayout();\n            this.panel1.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.nudDay)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.nudYear)).BeginInit();\n            this.ssStatusBar.SuspendLayout();\n            this.calContext.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // toolStrip1\n            // \n            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tsbAddEntry,\n            this.tsbDeleteEntry,\n            this.tsbClearExpired});\n            this.toolStrip1.Location = new System.Drawing.Point(0, 0);\n            this.toolStrip1.Name = \"toolStrip1\";\n            this.toolStrip1.Size = new System.Drawing.Size(712, 25);\n            this.toolStrip1.TabIndex = 1;\n            this.toolStrip1.Text = \"toolStrip1\";\n            // \n            // tsbAddEntry\n            // \n            this.tsbAddEntry.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbAddEntry.Image\")));\n            this.tsbAddEntry.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbAddEntry.Name = \"tsbAddEntry\";\n            this.tsbAddEntry.Size = new System.Drawing.Size(139, 22);\n            this.tsbAddEntry.Text = \"Add Schedule Entry...\";\n            this.tsbAddEntry.Click += new System.EventHandler(this.addEntryMenuItem_Click);\n            // \n            // tsbDeleteEntry\n            // \n            this.tsbDeleteEntry.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbDeleteEntry.Image\")));\n            this.tsbDeleteEntry.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbDeleteEntry.Name = \"tsbDeleteEntry\";\n            this.tsbDeleteEntry.Size = new System.Drawing.Size(90, 22);\n            this.tsbDeleteEntry.Text = \"Delete Entry\";\n            this.tsbDeleteEntry.Click += new System.EventHandler(this.tsbDeleteEntry_Click);\n            // \n            // tsbClearExpired\n            // \n            this.tsbClearExpired.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbClearExpired.Image\")));\n            this.tsbClearExpired.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbClearExpired.Name = \"tsbClearExpired\";\n            this.tsbClearExpired.Size = new System.Drawing.Size(133, 22);\n            this.tsbClearExpired.Text = \"Clear Expired Entries\";\n            this.tsbClearExpired.Click += new System.EventHandler(this.tsbClearExpired_Click);\n            // \n            // splitContainer1\n            // \n            this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;\n            this.splitContainer1.Location = new System.Drawing.Point(0, 25);\n            this.splitContainer1.Name = \"splitContainer1\";\n            // \n            // splitContainer1.Panel1\n            // \n            this.splitContainer1.Panel1.Controls.Add(this.splitContainer2);\n            this.splitContainer1.Panel1.Padding = new System.Windows.Forms.Padding(2);\n            // \n            // splitContainer1.Panel2\n            // \n            this.splitContainer1.Panel2.Controls.Add(this.calControl);\n            this.splitContainer1.Panel2.Controls.Add(this.panel1);\n            this.splitContainer1.Size = new System.Drawing.Size(712, 448);\n            this.splitContainer1.SplitterDistance = 175;\n            this.splitContainer1.TabIndex = 2;\n            // \n            // splitContainer2\n            // \n            this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\n            this.splitContainer2.Location = new System.Drawing.Point(2, 2);\n            this.splitContainer2.Name = \"splitContainer2\";\n            this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;\n            // \n            // splitContainer2.Panel1\n            // \n            this.splitContainer2.Panel1.Controls.Add(this.lbEntries);\n            this.splitContainer2.Panel1.Controls.Add(this.label1);\n            this.splitContainer2.Panel1MinSize = 200;\n            // \n            // splitContainer2.Panel2\n            // \n            this.splitContainer2.Panel2.Controls.Add(this.lblEntryDescription);\n            this.splitContainer2.Panel2MinSize = 100;\n            this.splitContainer2.Size = new System.Drawing.Size(171, 444);\n            this.splitContainer2.SplitterDistance = 233;\n            this.splitContainer2.TabIndex = 3;\n            // \n            // lbEntries\n            // \n            this.lbEntries.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbEntries.FormattingEnabled = true;\n            this.lbEntries.IntegralHeight = false;\n            this.lbEntries.Location = new System.Drawing.Point(0, 0);\n            this.lbEntries.Name = \"lbEntries\";\n            this.lbEntries.Size = new System.Drawing.Size(171, 233);\n            this.lbEntries.TabIndex = 1;\n            this.lbEntries.SelectedIndexChanged += new System.EventHandler(this.lbEntries_SelectedIndexChanged);\n            this.lbEntries.DoubleClick += new System.EventHandler(this.lbEntries_DoubleClick);\n            this.lbEntries.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lbEntries_KeyDown);\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(3, 4);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(90, 13);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"Schedule Entries:\";\n            // \n            // lblEntryDescription\n            // \n            this.lblEntryDescription.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblEntryDescription.Location = new System.Drawing.Point(0, 0);\n            this.lblEntryDescription.Name = \"lblEntryDescription\";\n            this.lblEntryDescription.Size = new System.Drawing.Size(171, 207);\n            this.lblEntryDescription.TabIndex = 2;\n            // \n            // panel1\n            // \n            this.panel1.Controls.Add(this.nudMonth);\n            this.panel1.Controls.Add(this.nudDay);\n            this.panel1.Controls.Add(this.nudYear);\n            this.panel1.Controls.Add(this.label2);\n            this.panel1.Controls.Add(this.cbViewType);\n            this.panel1.Dock = System.Windows.Forms.DockStyle.Top;\n            this.panel1.Location = new System.Drawing.Point(0, 0);\n            this.panel1.Name = \"panel1\";\n            this.panel1.Size = new System.Drawing.Size(533, 27);\n            this.panel1.TabIndex = 1;\n            // \n            // nudMonth\n            // \n            this.nudMonth.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.nudMonth.Location = new System.Drawing.Point(382, 3);\n            this.nudMonth.Name = \"nudMonth\";\n            this.nudMonth.Size = new System.Drawing.Size(93, 20);\n            this.nudMonth.TabIndex = 5;\n            this.nudMonth.Wrap = true;\n            this.nudMonth.SelectedItemChanged += new System.EventHandler(this.nudMonth_ValueChanged);\n            // \n            // nudDay\n            // \n            this.nudDay.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.nudDay.Location = new System.Drawing.Point(338, 3);\n            this.nudDay.Maximum = new decimal(new int[] {\n            32,\n            0,\n            0,\n            0});\n            this.nudDay.Name = \"nudDay\";\n            this.nudDay.Size = new System.Drawing.Size(38, 20);\n            this.nudDay.TabIndex = 4;\n            this.nudDay.Value = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudDay.ValueChanged += new System.EventHandler(this.nudDay_ValueChanged);\n            // \n            // nudYear\n            // \n            this.nudYear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.nudYear.Location = new System.Drawing.Point(481, 3);\n            this.nudYear.Maximum = new decimal(new int[] {\n            2100,\n            0,\n            0,\n            0});\n            this.nudYear.Minimum = new decimal(new int[] {\n            2006,\n            0,\n            0,\n            0});\n            this.nudYear.Name = \"nudYear\";\n            this.nudYear.Size = new System.Drawing.Size(49, 20);\n            this.nudYear.TabIndex = 2;\n            this.nudYear.Value = new decimal(new int[] {\n            2006,\n            0,\n            0,\n            0});\n            this.nudYear.ValueChanged += new System.EventHandler(this.nudYear_ValueChanged);\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(3, 6);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(60, 13);\n            this.label2.TabIndex = 1;\n            this.label2.Text = \"View Type:\";\n            this.label2.Visible = false;\n            // \n            // cbViewType\n            // \n            this.cbViewType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbViewType.FormattingEnabled = true;\n            this.cbViewType.Items.AddRange(new object[] {\n            \"Month\",\n            \"Week\",\n            \"Day\"});\n            this.cbViewType.Location = new System.Drawing.Point(69, 3);\n            this.cbViewType.Name = \"cbViewType\";\n            this.cbViewType.Size = new System.Drawing.Size(121, 21);\n            this.cbViewType.TabIndex = 0;\n            this.cbViewType.Visible = false;\n            // \n            // ssStatusBar\n            // \n            this.ssStatusBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tsslStatusBarText});\n            this.ssStatusBar.Location = new System.Drawing.Point(0, 473);\n            this.ssStatusBar.Name = \"ssStatusBar\";\n            this.ssStatusBar.Size = new System.Drawing.Size(712, 22);\n            this.ssStatusBar.TabIndex = 3;\n            this.ssStatusBar.Text = \"statusStrip1\";\n            // \n            // tsslStatusBarText\n            // \n            this.tsslStatusBarText.Name = \"tsslStatusBarText\";\n            this.tsslStatusBarText.Size = new System.Drawing.Size(42, 17);\n            this.tsslStatusBarText.Text = \"Ready.\";\n            // \n            // calContext\n            // \n            this.calContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.newScheduleEntryToolStripMenuItem,\n            this.toolStripSeperator});\n            this.calContext.Name = \"calContext\";\n            this.calContext.Size = new System.Drawing.Size(189, 32);\n            // \n            // newScheduleEntryToolStripMenuItem\n            // \n            this.newScheduleEntryToolStripMenuItem.Name = \"newScheduleEntryToolStripMenuItem\";\n            this.newScheduleEntryToolStripMenuItem.Size = new System.Drawing.Size(188, 22);\n            this.newScheduleEntryToolStripMenuItem.Text = \"New Schedule Entry...\";\n            this.newScheduleEntryToolStripMenuItem.Click += new System.EventHandler(this.newEntryMenuItem_Click);\n            // \n            // toolStripSeperator\n            // \n            this.toolStripSeperator.Name = \"toolStripSeperator\";\n            this.toolStripSeperator.Size = new System.Drawing.Size(185, 6);\n            // \n            // toolTip\n            // \n            this.toolTip.AutoPopDelay = 10000;\n            this.toolTip.InitialDelay = 500;\n            this.toolTip.IsBalloon = true;\n            this.toolTip.ReshowDelay = 100;\n            this.toolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;\n            // \n            // calControl\n            // \n            this.calControl.BlockingColor = System.Drawing.Color.Red;\n            this.calControl.CalendarType = EVEMon.Schedule.CalendarType.Month;\n            this.calControl.Date = new System.DateTime(2006, 8, 5, 18, 11, 38, 453);\n            this.calControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.calControl.EntryFont = new System.Drawing.Font(\"Microsoft Sans Serif\", 7F);\n            this.calControl.Location = new System.Drawing.Point(0, 27);\n            this.calControl.Name = \"calControl\";\n            this.calControl.RecurringColor = System.Drawing.Color.Green;\n            this.calControl.RecurringColor2 = System.Drawing.Color.LightGreen;\n            this.calControl.SingleColor = System.Drawing.Color.Blue;\n            this.calControl.SingleColor2 = System.Drawing.Color.LightBlue;\n            this.calControl.Size = new System.Drawing.Size(533, 421);\n            this.calControl.TabIndex = 0;\n            this.calControl.TextColor = System.Drawing.Color.White;\n            this.calControl.DayClicked += new System.EventHandler<EVEMon.Common.CustomEventArgs.DaySelectedEventArgs>(this.calControl_DayClicked);\n            this.calControl.DayDoubleClicked += new System.EventHandler<EVEMon.Common.CustomEventArgs.DaySelectedEventArgs>(this.calControl_DayDoubleClicked);\n            this.calControl.MouseDown += new System.Windows.Forms.MouseEventHandler(this.calControl_MouseDown);\n            this.calControl.MouseEnter += new System.EventHandler(this.calControl_MouseEnter);\n            this.calControl.MouseLeave += new System.EventHandler(this.calControl_MouseLeave);\n            this.calControl.MouseMove += new System.Windows.Forms.MouseEventHandler(this.calControl_MouseMove);\n            // \n            // ScheduleEditorWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.ClientSize = new System.Drawing.Size(712, 495);\n            this.Controls.Add(this.splitContainer1);\n            this.Controls.Add(this.ssStatusBar);\n            this.Controls.Add(this.toolStrip1);\n            this.MinimumSize = new System.Drawing.Size(720, 522);\n            this.Name = \"ScheduleEditorWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"My Schedule - EVEMon\";\n            this.Load += new System.EventHandler(this.ScheduleEditorWindow_Load);\n            this.toolStrip1.ResumeLayout(false);\n            this.toolStrip1.PerformLayout();\n            this.splitContainer1.Panel1.ResumeLayout(false);\n            this.splitContainer1.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();\n            this.splitContainer1.ResumeLayout(false);\n            this.splitContainer2.Panel1.ResumeLayout(false);\n            this.splitContainer2.Panel1.PerformLayout();\n            this.splitContainer2.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();\n            this.splitContainer2.ResumeLayout(false);\n            this.panel1.ResumeLayout(false);\n            this.panel1.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.nudDay)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.nudYear)).EndInit();\n            this.ssStatusBar.ResumeLayout(false);\n            this.ssStatusBar.PerformLayout();\n            this.calContext.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private ScheduleCalendar calControl;\n        private System.Windows.Forms.ToolStrip toolStrip1;\n        private System.Windows.Forms.ToolStripButton tsbAddEntry;\n        private System.Windows.Forms.SplitContainer splitContainer1;\n        private System.Windows.Forms.ListBox lbEntries;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.ToolStripButton tsbDeleteEntry;\n        private System.Windows.Forms.Panel panel1;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.ComboBox cbViewType;\n        private System.Windows.Forms.NumericUpDown nudDay;\n        private System.Windows.Forms.DomainUpDown nudMonth;\n        private System.Windows.Forms.NumericUpDown nudYear;\n        private System.Windows.Forms.Label lblEntryDescription;\n        private System.Windows.Forms.StatusStrip ssStatusBar;\n        private System.Windows.Forms.ToolStripStatusLabel tsslStatusBarText;\n        private System.Windows.Forms.SplitContainer splitContainer2;\n        private System.Windows.Forms.ToolStripButton tsbClearExpired;\n        private System.Windows.Forms.ContextMenuStrip calContext;\n        private System.Windows.Forms.ToolStripMenuItem newScheduleEntryToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeperator;\n        private System.Windows.Forms.ToolTip toolTip;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Schedule/ScheduleEditorWindow.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Scheduling;\n\nnamespace EVEMon.Schedule\n{\n    public partial class ScheduleEditorWindow : EVEMonForm\n    {\n        private const int OneDaysSeconds = 86400;\n        private const int DaysOfWeek = 7;\n\n        private DateTime m_currentDate = DateTime.Now;\n        private List<ScheduleEntry> m_lbEntriesData;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        public ScheduleEditorWindow()\n        {\n            InitializeComponent();\n\n            newScheduleEntryToolStripMenuItem.Font = FontFactory.GetFont(\"Segoe UI\", 9F, FontStyle.Bold);\n            calControl.EntryFont = FontFactory.GetFont(\"Microsoft Sans Serif\", 7F);\n\n            // Load Calendar Colors\n            calControl.BlockingColor = (Color)Settings.UI.Scheduler.BlockingColor;\n            calControl.RecurringColor = (Color)Settings.UI.Scheduler.RecurringEventGradientStart;\n            calControl.RecurringColor2 = (Color)Settings.UI.Scheduler.RecurringEventGradientEnd;\n            calControl.SingleColor = (Color)Settings.UI.Scheduler.SimpleEventGradientStart;\n            calControl.SingleColor2 = (Color)Settings.UI.Scheduler.SimpleEventGradientEnd;\n            calControl.TextColor = (Color)Settings.UI.Scheduler.TextColor;\n        }\n\n        /// <summary>\n        /// On load, initialize the days and months names, and set the calendar to the current date.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void ScheduleEditorWindow_Load(object sender, EventArgs e)\n        {\n            UpdateEntries();\n\n            // Months names\n            nudMonth.Items.Clear();\n            string[] monthNames = CultureConstants.DefaultCulture.DateTimeFormat.MonthNames;\n\n            // Add Months to control\n            nudMonth.Items.Add(monthNames[0]);\n            for (int i = 1; i <= CultureConstants.DefaultCulture.Calendar.GetMonthsInYear(m_currentDate.Year); i++)\n            {\n                nudMonth.Items.Add(\n                    monthNames[CultureConstants.DefaultCulture.Calendar.GetMonthsInYear(m_currentDate.Year) - i]);\n            }\n\n            // Set controls to current date\n            nudMonth.Items.Add(monthNames[CultureConstants.DefaultCulture.Calendar.GetMonthsInYear(m_currentDate.Year) - 1]);\n            nudYear.Value = m_currentDate.Year;\n            nudMonth.SelectedIndex = nudMonth.Items.Count - 1 - m_currentDate.Month;\n            nudDay.Maximum = CultureConstants.DefaultCulture.Calendar.GetDaysInMonth(m_currentDate.Year, m_currentDate.Month) + 1;\n            nudDay.Value = m_currentDate.Day;\n            calControl.Date = m_currentDate;\n\n            // Subscribe to global events\n            EveMonClient.SchedulerChanged += EveMonClient_SchedulerChanged;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on closing.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            EveMonClient.SchedulerChanged -= EveMonClient_SchedulerChanged;\n        }\n\n\n        #region Content creation & update\n\n        /// <summary>\n        /// Anytime the scheduler changed, we update the entries.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SchedulerChanged(object sender, EventArgs e)\n        {\n            UpdateEntries();\n        }\n\n        /// <summary>\n        /// Update both the calendar control and the left listbox\n        /// </summary>\n        private void UpdateEntries()\n        {\n            UpdateListBoxEntries();\n            UpdateCalendarEntries();\n        }\n\n        /// <summary>\n        /// Update the calendar control.\n        /// </summary>\n        private void UpdateCalendarEntries()\n        {\n            calControl.Entries.Clear();\n            foreach (ScheduleEntry temp in Scheduler.Entries)\n            {\n                calControl.Entries.Add(temp);\n            }\n            calControl.Invalidate();\n        }\n\n        /// <summary>\n        /// Update the left listbox containing the scheduled entries list.\n        /// </summary>\n        private void UpdateListBoxEntries()\n        {\n            m_lbEntriesData = new List<ScheduleEntry>(Scheduler.Entries);\n            m_lbEntriesData.Sort(new ScheduleEntryTitleComparer());\n\n            lbEntries.Items.Clear();\n            m_lbEntriesData.ForEach(x => lbEntries.Items.Add(x));\n\n            lbEntries.SelectedIndex = m_lbEntriesData.Any() ? 0 : -1;\n        }\n\n        /// <summary>\n        /// Update the entry's description\n        /// </summary>\n        private void UpdateEntryDescription()\n        {\n            ScheduleEntry temp = m_lbEntriesData[lbEntries.SelectedIndex];\n            StringBuilder sb = new StringBuilder();\n\n            sb.AppendLine($\"Title: {temp.Title}\");\n\n            // Simple entry ?\n            SimpleScheduleEntry simpleEntry = temp as SimpleScheduleEntry;\n            if (simpleEntry != null)\n            {\n                sb\n                    .AppendLine(\"One Off Entry\")\n                    .AppendLine($\" Start: {simpleEntry.StartDate}\")\n                    .AppendLine($\" End: {simpleEntry.EndDate}\")\n                    .AppendLine($\" Expired: {simpleEntry.Expired}\")\n                    .AppendLine()\n                    .AppendLine(\"Options\")\n                    .AppendLine($\" Blocking: {(simpleEntry.Options & ScheduleEntryOptions.Blocking) != ScheduleEntryOptions.None}\")\n                    .AppendLine($\" Silent: {(simpleEntry.Options & ScheduleEntryOptions.Quiet) != ScheduleEntryOptions.None}\")\n                    .AppendLine(\n                        $\" Uses Eve Time: {(simpleEntry.Options & ScheduleEntryOptions.EVETime) != ScheduleEntryOptions.None}\");\n            }\n            // Or recurring entry ?\n            else\n            {\n                RecurringScheduleEntry recurringEntry = (RecurringScheduleEntry)temp;\n\n                sb\n                    .AppendLine(\"Recurring Entry\")\n                    .AppendLine($\" Start: {recurringEntry.StartDate.ToShortDateString()}\")\n                    .AppendLine($\" End: {recurringEntry.EndDate.ToShortDateString()}\")\n                    .AppendLine($\" Frequency: {recurringEntry.Frequency}\");\n\n                switch (recurringEntry.Frequency)\n                {\n                    case RecurringFrequency.Monthly:\n                    {\n                        sb\n                            .AppendLine($\"  Day of Month: {recurringEntry.DayOfMonth}\")\n                            .AppendLine($\"  On Overflow: {recurringEntry.OverflowResolution}\");\n                    }\n                        break;\n                    case RecurringFrequency.Weekly:\n                    {\n                        DateTime nowish = DateTime.Now.Date;\n                        DateTime initial =\n                            recurringEntry.StartDate.AddDays((recurringEntry.DayOfWeek - recurringEntry.StartDate.DayOfWeek +\n                                                              DaysOfWeek) % DaysOfWeek);\n                        Double datediff = (DaysOfWeek * recurringEntry.WeeksPeriod -\n                                           nowish.Subtract(initial).Days % (DaysOfWeek * recurringEntry.WeeksPeriod)) %\n                                          (DaysOfWeek * recurringEntry.WeeksPeriod);\n\n                        DateTime noWishDateTime =\n                            nowish.AddDays(datediff).Add(TimeSpan.FromSeconds(recurringEntry.StartTimeInSeconds));\n\n                        if (noWishDateTime < DateTime.Now)\n                        {\n                            datediff = datediff + DaysOfWeek * recurringEntry.WeeksPeriod;\n                            noWishDateTime =\n                                nowish.AddDays(datediff).Add(TimeSpan.FromSeconds(recurringEntry.StartTimeInSeconds));\n                        }\n\n                        sb\n                            .AppendLine($\"  Day of Week: {recurringEntry.DayOfWeek}\")\n                            .AppendLine($\"  Every: {recurringEntry.WeeksPeriod}\" +\n                                        $\" week{(recurringEntry.WeeksPeriod == 1 ? String.Empty : \"s\")}\")\n                            .AppendLine($\"  Next: {noWishDateTime.ToShortDateString()}\");\n                    }\n                        break;\n                }\n\n                if (recurringEntry.EndTimeInSeconds > OneDaysSeconds)\n                    recurringEntry.EndTimeInSeconds -= OneDaysSeconds;\n\n                sb\n                    .AppendLine($\" Start Time: {TimeSpan.FromSeconds(recurringEntry.StartTimeInSeconds)}\")\n                    .AppendLine($\" End Time: {TimeSpan.FromSeconds(recurringEntry.EndTimeInSeconds)}\")\n                    .AppendLine($\" Expired: {recurringEntry.Expired}\")\n                    .AppendLine()\n                    .AppendLine(\"Options\")\n                    .AppendLine(\n                        $\" Blocking: {(recurringEntry.Options & ScheduleEntryOptions.Blocking) != ScheduleEntryOptions.None}\")\n                    .AppendLine($\" Silent: {(recurringEntry.Options & ScheduleEntryOptions.Quiet) != ScheduleEntryOptions.None}\")\n                    .AppendLine(\n                        $\" Uses Eve Time: {(recurringEntry.Options & ScheduleEntryOptions.EVETime) != ScheduleEntryOptions.None}\");\n            }\n\n            // Update the description\n            lblEntryDescription.Text = sb.ToString();\n        }\n\n        /// <summary>\n        /// Removes the selected entry.\n        /// </summary>\n        private void RemoveSelectedEntry()\n        {\n            int entryIndex = lbEntries.SelectedIndex;\n            ScheduleEntry entry = m_lbEntriesData[entryIndex];\n            Scheduler.Remove(entry);\n\n            // When no entries left, clear the description label\n            if (!m_lbEntriesData.Any())\n                lbEntries_SelectedIndexChanged(null, EventArgs.Empty);\n        }\n\n        #endregion\n\n\n        #region Calendar control events\n\n        /// <summary>\n        /// Anytime the mouse leaves the calendar control, hide the tooltip.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void calControl_MouseLeave(object sender, EventArgs e)\n        {\n            toolTip.Active = false;\n        }\n\n        /// <summary>\n        /// Anytime the mouse enters the calendar control, display the tooltip.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void calControl_MouseEnter(object sender, EventArgs e)\n        {\n            toolTip.Active = false;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void calControl_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            calControl.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the calendar, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void calControl_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            calControl.Cursor = calControl.IsValidDate(e.Location)\n                ? CustomCursors.ContextMenu\n                : Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the user double-clicks a day on the calendar control, we allow him to add a new entry.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"DaySelectedEventArgs\"/> instance containing the event data.</param>\n        private void calControl_DayDoubleClicked(object sender, DaySelectedEventArgs e)\n        {\n            AddScheduleEntry(e.DateTime);\n        }\n\n        /// <summary>\n        /// When the user clicks the calendar controls (main control)\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"DaySelectedEventArgs\"/> instance containing the event data.</param>\n        private void calControl_DayClicked(object sender, DaySelectedEventArgs e)\n        {\n            UpdateDateTimeControls(e.DateTime);\n\n            if (!e.DateTimeIsSameMonthAsPrevious)\n                return;\n\n            switch (e.Mouse.Button)\n            {\n                case MouseButtons.Left:\n                    ShowCalendarTooltip(e.DateTime);\n                    break;\n                case MouseButtons.Right:\n                    ShowCalendarContextMenu(e.DateTime, e.Location);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Updates the date time controls.\n        /// </summary>\n        /// <param name=\"dateTime\">The date time.</param>\n        private void UpdateDateTimeControls(DateTime dateTime)\n        {\n            nudDay.Value = dateTime.Day;\n            nudMonth.SelectedIndex = nudMonth.Items.Count - 1 - dateTime.Month;\n            nudYear.Value = dateTime.Year;\n        }\n\n        /// <summary>\n        /// Show the context menu for the given day\n        /// </summary>\n        /// <param name=\"datetime\"></param>\n        /// <param name=\"location\"></param>\n        private void ShowCalendarContextMenu(DateTime datetime, Point location)\n        {\n            // Remove old submenus\n            while (calContext.Items.Count > 2)\n            {\n                calContext.Items.RemoveAt(2);\n            }\n\n            // Set date Tag to new entry\n            calContext.Items[0].Tag = datetime;\n\n            // Add \"Edit\" menus for every schedule on this day\n            foreach (ScheduleEntry entry in Scheduler.Entries.Where(x => x.IsToday(datetime)))\n            {\n                ToolStripItem tempItem = null;\n                try\n                {\n                    tempItem = new ToolStripMenuItem();\n                    tempItem.Click += editMenuItem_Click;\n                    tempItem.Text = $\"Edit \\\"{entry.Title}\\\"...\";\n                    tempItem.Tag = entry;\n\n                    ToolStripItem item = tempItem;\n                    tempItem = null;\n\n                    calContext.Items.Add(item);\n                }\n                finally\n                {\n                    tempItem?.Dispose();\n                }\n            }\n\n            // Show the toolstrip seperator if there are any entries\n            toolStripSeperator.Visible = calContext.Items.Count > 2;\n\n            // Display the menu\n            calContext.Show(calControl, location);\n        }\n\n        /// <summary>\n        /// Shows a tooltip enumerating all of entries for this day\n        /// </summary>\n        /// <param name=\"datetime\"></param>\n        private void ShowCalendarTooltip(DateTime datetime)\n        {\n            // How can you only localize the date?\n            StringBuilder content = new StringBuilder();\n\n            foreach (ScheduleEntry entry in Scheduler.Entries.Where(x => x.IsToday(datetime)).OrderBy(x => x.Title))\n            {\n                DateTime from = datetime;\n                DateTime to = datetime;\n\n                // Simple entry ?\n                SimpleScheduleEntry simpleEntry = entry as SimpleScheduleEntry;\n                if (simpleEntry != null)\n                {\n                    from = simpleEntry.StartDate;\n                    to = simpleEntry.EndDate;\n                }\n                    // Or recurring entry ?\n                else\n                {\n                    RecurringScheduleEntry recurring = (RecurringScheduleEntry)entry;\n\n                    // Does this always have one entry?\n                    IEnumerable<ScheduleDateTimeRange> ranges =\n                        recurring.GetRangesInPeriod(new DateTime(datetime.Year, datetime.Month, datetime.Day, 0, 0, 0),\n                                                    new DateTime(datetime.Year, datetime.Month, datetime.Day, 23, 59, 59));\n                    IEnumerator<ScheduleDateTimeRange> enumranges = ranges.GetEnumerator();\n                    while (enumranges.MoveNext())\n                    {\n                        ScheduleDateTimeRange r = enumranges.Current;\n                        from = r.From;\n                        to = r.To;\n                    }\n                }\n\n                // If the \"from\" date is before the selected date\n                if (!(from.Year == datetime.Year && from.Month == datetime.Month && from.Day == datetime.Day))\n                {\n                    // Set date to midnight today\n                    from = new DateTime(datetime.Year, datetime.Month, datetime.Day, 0, 0, 0);\n                }\n\n                // If the \"to\" date is after the selected date\n                if (!(to.Year == datetime.Year && to.Month == datetime.Month && to.Day == datetime.Day))\n                {\n                    // Set date to last second before tomorrows midnight\n                    to = new DateTime(datetime.Year, datetime.Month, datetime.Day, 23, 59, 59);\n                }\n\n                // Append the tooltip content\n                content.Append(entry.Title);\n\n                if ((entry.Options & ScheduleEntryOptions.EVETime) != ScheduleEntryOptions.None)\n                {\n                    // In case local time conversion extends beyond the entry date,\n                    // we display also the ending date\n                    string toLocalTime = to.Day == to.ToLocalTime().Day\n                        ? to.ToLocalTime().ToString(\"HH:mm\", CultureConstants.DefaultCulture)\n                        : to.ToLocalTime().ToString(CultureConstants.DefaultCulture);\n\n                    content\n                        .Append($\" [ EVE Time: {from:HH:mm} - {to:HH:mm} ] \")\n                        .Append($\" [ Local Time: {from.ToLocalTime():HH:mm} - {toLocalTime} ] \");\n                }\n                else\n                    content.Append($\" [ {from:HH:mm} - {to:HH:mm} ] \");\n\n                content.AppendLine();\n            }\n\n            toolTip.ToolTipTitle = $\"Entries for {datetime:d}\";\n            toolTip.SetToolTip(calControl, content.ToString());\n            toolTip.Active = true;\n        }\n\n        /// <summary>\n        /// Context menu > Edit \"entry name\"\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private static void editMenuItem_Click(object sender, EventArgs e)\n        {\n            ToolStripMenuItem menu = (ToolStripMenuItem)sender;\n            ScheduleEntry entry = (ScheduleEntry)menu.Tag;\n\n            // Allow the user to edit the entry\n            using (EditScheduleEntryWindow f = new EditScheduleEntryWindow())\n            {\n                f.ScheduleEntry = entry;\n                DialogResult dr = f.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n\n                Scheduler.Remove(entry);\n                Scheduler.Add(f.ScheduleEntry);\n            }\n        }\n\n        /// <summary>\n        /// Context menu > New schedule entry\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void newEntryMenuItem_Click(object sender, EventArgs e)\n        {\n            ToolStripMenuItem menu = (ToolStripMenuItem)sender;\n            DateTime datetime = (DateTime)menu.Tag;\n            AddScheduleEntry(datetime);\n        }\n\n        /// <summary>\n        /// Adds the schedule entry.\n        /// </summary>\n        /// <param name=\"datetime\">The datetime.</param>\n        private static void AddScheduleEntry(DateTime datetime)\n        {\n            // Allow the user to define the new entry\n            using (EditScheduleEntryWindow f = new EditScheduleEntryWindow(datetime))\n            {\n                DialogResult dr = f.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n\n                // Add an entry\n                Scheduler.Add(f.ScheduleEntry);\n            }\n        }\n\n        #endregion\n\n\n        #region Controls' handlers\n\n        /// <summary>\n        /// Toolbar > Delete entry.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbDeleteEntry_Click(object sender, EventArgs e)\n        {\n            if (lbEntries.SelectedIndex != -1)\n                RemoveSelectedEntry();\n        }\n\n        /// <summary>\n        /// Toolbar > Clear expired\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbClearExpired_Click(object sender, EventArgs e)\n        {\n            Scheduler.ClearExpired();\n\n            // When no entries left, clear the description label\n            if (!m_lbEntriesData.Any())\n                lbEntries_SelectedIndexChanged(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// When the user selects another entry on the left listbox, we update the labels below.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbEntries_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (lbEntries.SelectedIndex == -1)\n            {\n                lblEntryDescription.Text = String.Empty;\n                return;\n            }\n\n            UpdateEntryDescription();\n        }\n\n        /// <summary>\n        /// When the user double-clicks an entry on the left list box, we open the edition box for this entry.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbEntries_DoubleClick(object sender, EventArgs e)\n        {\n            if (lbEntries.SelectedIndex == -1)\n                return;\n\n            int entryIndex = lbEntries.SelectedIndex;\n            ScheduleEntry entry = m_lbEntriesData[entryIndex];\n            using (EditScheduleEntryWindow f = new EditScheduleEntryWindow())\n            {\n                f.ScheduleEntry = entry;\n                DialogResult dr = f.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n\n                Scheduler.Remove(entry);\n                Scheduler.Add(f.ScheduleEntry);\n            }\n\n            lbEntries.SelectedIndex = entryIndex;\n        }\n\n        /// <summary>\n        /// Toolbar > Add entry\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void addEntryMenuItem_Click(object sender, EventArgs e)\n        {\n            using (EditScheduleEntryWindow f = new EditScheduleEntryWindow())\n            {\n                DialogResult dr = f.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n\n                Scheduler.Add(f.ScheduleEntry);\n            }\n        }\n\n        /// <summary>\n        /// Occur whenever the user changes the numeric box for the year\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void nudYear_ValueChanged(object sender, EventArgs e)\n        {\n            int oldyearnum = m_currentDate.Year;\n            m_currentDate = m_currentDate.AddYears((int)nudYear.Value - m_currentDate.Year);\n            if (m_currentDate.Month == 2 &&\n                (CultureConstants.DefaultCulture.Calendar.IsLeapYear(m_currentDate.Year) ||\n                 CultureConstants.DefaultCulture.Calendar.IsLeapYear(oldyearnum)))\n            {\n                nudDay.Maximum =\n                    CultureConstants.DefaultCulture.Calendar.GetDaysInMonth(m_currentDate.Year, m_currentDate.Month) + 1;\n\n                if (CultureConstants.DefaultCulture.Calendar.IsLeapYear(oldyearnum) && nudDay.Value > nudDay.Maximum)\n                    nudDay.Value = nudDay.Maximum;\n            }\n            calControl.Date = m_currentDate;\n        }\n\n        /// <summary>\n        /// Occur whenever the user changes the numeric box for the day\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void nudDay_ValueChanged(object sender, EventArgs e)\n        {\n            bool donex = false;\n            bool doney = false;\n            if (nudDay.Value == 0)\n            {\n                if (nudMonth.SelectedIndex == nudMonth.Items.Count - 2 && nudYear.Value == nudYear.Minimum)\n                    nudDay.Value = 1;\n\n                m_currentDate = m_currentDate.AddDays((int)nudDay.Value - m_currentDate.Day);\n                nudDay.Maximum =\n                    CultureConstants.DefaultCulture.Calendar.GetDaysInMonth(m_currentDate.Year, m_currentDate.Month) + 1;\n\n                if (nudDay.Value == 0)\n                {\n                    nudDay.Value =\n                        CultureConstants.DefaultCulture.Calendar.GetDaysInMonth(m_currentDate.Year, m_currentDate.Month);\n                }\n\n                donex = true;\n            }\n\n            if (!donex && nudDay.Value == nudDay.Maximum)\n            {\n                if (nudMonth.SelectedIndex == 1 && nudYear.Value == nudYear.Maximum)\n                {\n                    nudDay.Value =\n                        CultureConstants.DefaultCulture.Calendar.GetDaysInMonth(m_currentDate.Year, m_currentDate.Month);\n\n                    doney = true;\n                }\n\n                if (!doney)\n                {\n                    m_currentDate = m_currentDate.AddDays((int)nudDay.Value - m_currentDate.Day);\n                    nudDay.Value = 1;\n                    nudDay.Maximum =\n                        CultureConstants.DefaultCulture.Calendar.GetDaysInMonth(m_currentDate.Year, m_currentDate.Month) + 1;\n                }\n                donex = true;\n            }\n\n            if (!donex)\n                m_currentDate = m_currentDate.AddDays((int)nudDay.Value - m_currentDate.Day);\n\n            calControl.Date = m_currentDate;\n            nudYear.Value = m_currentDate.Year;\n            nudMonth.SelectedIndex = CultureConstants.DefaultCulture.Calendar.GetMonthsInYear(m_currentDate.Year) -\n                                     m_currentDate.Month + 1;\n        }\n\n        /// <summary>\n        /// Occur whenever the user changes the numeric box for the month\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void nudMonth_ValueChanged(object sender, EventArgs e)\n        {\n            if (nudMonth.SelectedIndex == nudMonth.Items.Count - 1 && nudYear.Value == nudYear.Minimum)\n                nudMonth.SelectedIndex = nudMonth.Items.Count - 2;\n\n            if (nudMonth.SelectedIndex == 0 && nudYear.Value == nudYear.Maximum)\n                nudMonth.SelectedIndex = 1;\n\n            m_currentDate =\n                m_currentDate.AddMonths(nudMonth.Items.Count - 1 - nudMonth.SelectedIndex - m_currentDate.Month);\n\n            nudMonth.SelectedIndex = (nudMonth.SelectedIndex + (nudMonth.Items.Count - 3)) % (nudMonth.Items.Count - 2) + 1;\n\n            if (nudDay.Value > CultureConstants.DefaultCulture.Calendar.GetDaysInMonth(m_currentDate.Year, m_currentDate.Month))\n                nudDay.Value = CultureConstants.DefaultCulture.Calendar.GetDaysInMonth(m_currentDate.Year, m_currentDate.Month);\n\n            nudDay.Maximum = CultureConstants.DefaultCulture.Calendar.GetDaysInMonth(m_currentDate.Year, m_currentDate.Month) + 1;\n            calControl.Date = m_currentDate;\n            nudYear.Value = m_currentDate.Year;\n        }\n\n        /// <summary>\n        /// Handles the KeyDown event of the lbEntries control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.KeyEventArgs\"/> instance containing the event data.</param>\n        private void lbEntries_KeyDown(object sender, KeyEventArgs e)\n        {\n            switch (e.KeyCode)\n            {\n                case Keys.Delete:\n                    RemoveSelectedEntry();\n                    break;\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/Schedule/ScheduleEditorWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"toolStrip1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"tsbAddEntry.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALsSURBVDhPXZFJTBNhGIbh4snEu0cj0ehBQT0YE48mBiSB\n        RqBQWQpYiRgR7BK2UlqVMrQUKFNK99JpCzNAS9kKuFBDbKAhBBQBgUQTEy+dE1ETD6/TaSHWN3nzzT+T\n        55lvMhmJ7OztONdj0d+rYQu7amthV3RVLNOQz/YIcti2vCy2PT+LVRZeYbsrrrPko7wjSlm+wYPH2Yx4\n        mLlgL3yMBmPjL+Cn1XBT7bA7m2GxKzBsU4A0y2A0SUHon2LJqztMoclsuprpea8SzGIf/CEd/NM6UAEC\n        nsluuJguWH0aDFMaDI2oYB7pQHRlcj+FJhPrraWn7VK0dDWgrKYYhaUFuFuYi/yifIhqSiCsus/fv8ed\n        ewbliIb16YKgPI+meiVoI5pQUy+CUFyEwrICCEQFeCIVo/65GOUSIYTVRUnBlDJdoBPm0Ib2Yri5te2+\n        Tjj8ati8nbBz0znKre9RweRoh4X7BJNLian+unSBRnCZ1rcVwzmuhWFIDmKgCV19z6DtbwRhbOLPpKMV\n        g/ZWmN0dsCor0gXdwhv0QKcIDuYVD1g8HZxIhs7uevQNK2Awy6EnpRiwNnNbaThBZbqgV3yLJl9Wwjej\n        g82ngj+o5adjVA1vQAsnB1ETXWBm9Nyf0cKlfnCQQpMhH9+hLT0ShN4NYm452fllEvMRE9+5CIlZ7tlV\n        +XmcqszERcmZXyk0GbtcQLvJBky/JzE2TWB8To/AogHBJQM/E50I63n4NDL4mUKTcbYWMz6rFG9iNsxG\n        jJjnRIsfhvB2zcI3W5HFQ/8K+JZnRniBS1nK0C4Fop8pxHYprH/xYuPAj9iOB8HXhhPw/ybu84IQUc2E\n        J1TY+MbgI9ft7+PY/RHA0qoZC1ES11ounLz1GOR7vMG6vZFZCWmwvkdha9+L7UM/dr768emA4urhrr1Y\n        27KmCXjwOAvEQ0dQJf7pVoviiTJcaUVJ3C3LixvrbseNoptxtzQ3fqn27J8EnC07d5QkMzL+ApOQGX8z\n        rZigAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"tsbDeleteEntry.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAANaSURBVDhPVZFraFN3GMaPiPjB6vDywa2gbKMMERHr5gRh\n        fhgT6rqwttiaGi+NnVWMWO3ShNo2TRNnkpOcpDY9bZrm5GJOLp4TTWx6s/XWUQxdCMVZV50t6Bzsw3pg\n        WzfGPvjs70n9kAceXt4/PD+elz/1RnPP5gK5bObf6TGvNO27JE056iSxUSHZq0qltvISqV1RIhkqd0q2\n        4x9L7OnyJd5wbEYOvtWjybA4knIiKppxPXEZMcGEEN8OLtACL6dHv08P1tMMd68WNHMeExHHwnI0r0fB\n        FmE0YoA43oXYoAOxtAN8kkb4pg1B0YKBqBn9vBl914zwXOtAZurm8+VoXlnnN0Ka0+KSpRFH6mtQWVuB\n        ssovoahWQFV/GMq6Q/L7V2S39+iQGWMKASlducA7G9BGN6Feo4JSXY3KIxWoUlXgnFYNzbdqHGtQQnmy\n        Og+4ZSgEOJSlgqu9BiFSm4t2wh8zwRfpBEdmIE7qh43o9bfDS07oDRpw6+qZQoC5arvAtNUgkLDC1acD\n        3d0ES9cFWK9eBO1uknfW34oerhWeUAcGDMcLATblJ0J3pwp+8Yoc8IY7CKgZnTYNuvr1cHl0YFgtugda\n        SCszAZwoBDjV+wT2uxOIDjngixoRS1nl6Y+bEElaESAh/oYF4hBDfsaKoOno/HI0L/bsAcFrb8Dg/R6M\n        PMh79AGL0cle2f3dF8AdLQMvXoY4zMCpOfjSvmqVvZSidssATlclhNhGpL9ncT1NIzHCIDnuQmrCJU+L\n        thZ/rVuH+Bd74GbOgS8p/vv3tWvxKUUpZECgtUaMDmhxN+vD8KQbowQ0/rAP937wyo4kr6ClbC9ebdqA\n        Xz7Ygtn177xWrFjhJNGNMiBoqBWFoB6Zn3hkn/LI/RzBzHwM2bkwUndIiwknnIwGua3vAcXFGNq88b8t\n        FEUuWNYgfVIcu2HEzEsRj4mf/JrA09+SmJj24HaGRSJtxfD+XVggDdiPtmJ+w/rX8dWro5so6l0ZkOMu\n        ilODZuSe8fjxeQRPFmKYexHD7DxPHEaUbsCLNWtgUx9EPGGC4fPdf74qKsKBlSu/lgG36VP+lFH9T8ik\n        WnxjkVjQH14MNZcvus98ttis2PHH6X0fLomWOulxgl26kwjPvk9RmiKK2vY/VAkoCEJp+bUAAAAASUVO\n        RK5CYII=\n</value>\n  </data>\n  <data name=\"tsbClearExpired.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJuSURBVDhPZVNLS2pRFO5vOVFQR4omQk5qIIIg4sQk6EkQ\n        KSGKD0gUTa9RUZ0DptgL0UQRFQdeLVNBr+FQOGcUlztbd6/lAw4t+Nhn773Wt7/97XXWMGaz2a/pdPqv\n        2WyKT09P4sXFhXhwcCCur6+LcrlcVCgUokqlEo1Go2iz2b5PT09/U+EyOp0On8/n4fr6Gm5ubuDq6gri\n        8Ticn59DOByGYDAIPp8PvF4vHB0dwePj459F6Tyen5+5u7s7eHl5gYeHBwLP83B/fw+3t7eQTqchlUpB\n        IpEg4na7PVqUzoOdzGHC/v4+6HQ6UCqVIJPJgEkHvV4PGo2G1tl1SMXb25uUgMnicOP4+BhMJhNotVpQ\n        q9UEs9lMMBgMtI55uVxOSsA2OYfDQbJRyVIyjpeXlyQ9EonQGIvF0BspATuJs9vtgD6gWW63G05OToC5\n        Td8INBSBHjClPxVsb2/TC2AynoREu7u7EAgEwO/3w9nZGb0IKvpBwO7NYXI2myXpy6tgMr4EjqgO93HO\n        1I0XpfOwWCwcSi4Wi1AqlVZgbq+AewhmILAmkxI4nU4OpWJiJpOhJNaR1Bc4IrDRcP319RWsVquUYG9v\n        j0eXG43G6uRKpQL1ep1QLpepmHUgrW9sbEgJDg8PeXT3/f0dPj4+oNfrQb/fp/lSBY5IhGD/g7SVQ6EQ\n        842H0WhEGI/H8PX1BbVajU5stVokvVAokMJkMiklYL3Pozw8/fPzEwaDAQyHQ/pGNThHElTU7XahWq1O\n        FqXziEajKWbiX9YDAsLj8QjsVQSXyyVsbW0Jm5ubws7OjsCeU2CqvieTyeJ3Xlv7Dx1fP7N7rtKyAAAA\n        AElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"ssStatusBar.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>116, 17</value>\n  </metadata>\n  <metadata name=\"calContext.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>225, 17</value>\n  </metadata>\n  <metadata name=\"toolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>334, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/SettingsUI/CloudStorageServiceControl.Designer.cs",
    "content": "﻿namespace EVEMon.SettingsUI\n{\n    partial class CloudStorageServiceControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.btnRequestApply = new System.Windows.Forms.Button();\n            this.lblAuthCode = new System.Windows.Forms.Label();\n            this.txtBoxAuthCode = new System.Windows.Forms.TextBox();\n            this.apiResponseLabel = new System.Windows.Forms.Label();\n            this.btnReset = new System.Windows.Forms.Button();\n            this.createAccountLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.throbber = new EVEMon.Common.Controls.Throbber();\n            ((System.ComponentModel.ISupportInitialize)(this.throbber)).BeginInit();\n            this.SuspendLayout();\n            // \n            // btnRequestApply\n            // \n            this.btnRequestApply.Anchor = System.Windows.Forms.AnchorStyles.Bottom;\n            this.btnRequestApply.Location = new System.Drawing.Point(126, 67);\n            this.btnRequestApply.Name = \"btnRequestApply\";\n            this.btnRequestApply.Size = new System.Drawing.Size(145, 23);\n            this.btnRequestApply.TabIndex = 0;\n            this.btnRequestApply.Text = \"Request Authentication\";\n            this.btnRequestApply.UseVisualStyleBackColor = true;\n            this.btnRequestApply.Click += new System.EventHandler(this.btnRequestApply_Click);\n            // \n            // lblAuthCode\n            // \n            this.lblAuthCode.AutoSize = true;\n            this.lblAuthCode.Location = new System.Drawing.Point(15, 40);\n            this.lblAuthCode.Name = \"lblAuthCode\";\n            this.lblAuthCode.Size = new System.Drawing.Size(60, 13);\n            this.lblAuthCode.TabIndex = 1;\n            this.lblAuthCode.Text = \"Auth Code:\";\n            // \n            // txtBoxAuthCode\n            // \n            this.txtBoxAuthCode.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.txtBoxAuthCode.Location = new System.Drawing.Point(80, 37);\n            this.txtBoxAuthCode.Name = \"txtBoxAuthCode\";\n            this.txtBoxAuthCode.Size = new System.Drawing.Size(300, 20);\n            this.txtBoxAuthCode.TabIndex = 2;\n            this.txtBoxAuthCode.UseSystemPasswordChar = true;\n            // \n            // apiResponseLabel\n            // \n            this.apiResponseLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.apiResponseLabel.Location = new System.Drawing.Point(0, 7);\n            this.apiResponseLabel.Name = \"apiResponseLabel\";\n            this.apiResponseLabel.Size = new System.Drawing.Size(397, 24);\n            this.apiResponseLabel.TabIndex = 3;\n            this.apiResponseLabel.Text = \"API Response\";\n            this.apiResponseLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // btnReset\n            // \n            this.btnReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnReset.Location = new System.Drawing.Point(304, 67);\n            this.btnReset.Name = \"btnReset\";\n            this.btnReset.Size = new System.Drawing.Size(75, 23);\n            this.btnReset.TabIndex = 4;\n            this.btnReset.Text = \"Reset\";\n            this.btnReset.UseVisualStyleBackColor = true;\n            this.btnReset.Click += new System.EventHandler(this.btnReset_Click);\n            // \n            // createAccountLinkLabel\n            // \n            this.createAccountLinkLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.createAccountLinkLabel.AutoSize = true;\n            this.createAccountLinkLabel.Location = new System.Drawing.Point(15, 72);\n            this.createAccountLinkLabel.Name = \"createAccountLinkLabel\";\n            this.createAccountLinkLabel.Size = new System.Drawing.Size(45, 13);\n            this.createAccountLinkLabel.TabIndex = 11;\n            this.createAccountLinkLabel.TabStop = true;\n            this.createAccountLinkLabel.Tag = \"\";\n            this.createAccountLinkLabel.Text = \"Sign Up\";\n            this.createAccountLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.getAnAccountLinkLabel_LinkClicked);\n            // \n            // throbber\n            // \n            this.throbber.Anchor = System.Windows.Forms.AnchorStyles.Top;\n            this.throbber.Location = new System.Drawing.Point(185, 7);\n            this.throbber.MaximumSize = new System.Drawing.Size(24, 24);\n            this.throbber.MinimumSize = new System.Drawing.Size(24, 24);\n            this.throbber.Name = \"throbber\";\n            this.throbber.Size = new System.Drawing.Size(24, 24);\n            this.throbber.State = EVEMon.Common.Enumerations.ThrobberState.Stopped;\n            this.throbber.TabIndex = 10;\n            this.throbber.TabStop = false;\n            // \n            // CloudStorageServiceControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.createAccountLinkLabel);\n            this.Controls.Add(this.btnReset);\n            this.Controls.Add(this.apiResponseLabel);\n            this.Controls.Add(this.txtBoxAuthCode);\n            this.Controls.Add(this.lblAuthCode);\n            this.Controls.Add(this.btnRequestApply);\n            this.Controls.Add(this.throbber);\n            this.Name = \"CloudStorageServiceControl\";\n            this.Size = new System.Drawing.Size(400, 100);\n            this.Load += new System.EventHandler(this.CloudStorageServiceControl_Load);\n            ((System.ComponentModel.ISupportInitialize)(this.throbber)).EndInit();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Button btnRequestApply;\n        private System.Windows.Forms.Label lblAuthCode;\n        private System.Windows.Forms.TextBox txtBoxAuthCode;\n        private System.Windows.Forms.Label apiResponseLabel;\n        private System.Windows.Forms.Button btnReset;\n        private Common.Controls.Throbber throbber;\n        private System.Windows.Forms.LinkLabel createAccountLinkLabel;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/CloudStorageServiceControl.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.CloudStorageServices;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Factories;\n\nnamespace EVEMon.SettingsUI\n{\n    public partial class CloudStorageServiceControl : UserControl\n    {\n        private bool m_authCodeRequested;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CloudStorageServiceControl\"/> class.\n        /// </summary>\n        public CloudStorageServiceControl()\n        {\n            InitializeComponent();\n            apiResponseLabel.Font = FontFactory.GetFont(\"Tahoma\", FontStyle.Bold);\n            apiResponseLabel.ResetText();\n\n            throbber.Visible = false;\n            throbber.BringToFront();\n\n            btnRequestApply.Enabled = false;\n            lblAuthCode.Enabled = false;\n            txtBoxAuthCode.Enabled = false;\n            btnReset.Enabled = false;\n        }\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the provider.\n        /// </summary>\n        /// <value>\n        /// The provider.\n        /// </value>\n        [Browsable(false)]\n        private static CloudStorageServiceProvider Provider => Settings.CloudStorageServiceProvider.Provider;\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// Occurs when the control loads.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private async void CloudStorageServiceControl_Load(object sender, EventArgs e)\n        {\n            Font = FontFactory.GetFont(\"Tahoma\");\n            Disposed += OnDisposed;\n\n            CloudStorageServiceProvider.CredentialsChecked += CloudStorageServiceProvider_CheckCredentials;\n            CloudStorageServiceProvider.SettingsReset += CloudStorageServiceProvider_SettingsReset;\n\n            await CheckAPIAuthIsValidAsync(true);\n        }\n\n        /// <summary>\n        /// Occurs when the control gets disposed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            CloudStorageServiceProvider.CredentialsChecked -= CloudStorageServiceProvider_CheckCredentials;\n            CloudStorageServiceProvider.SettingsReset -= CloudStorageServiceProvider_SettingsReset;\n\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnReset control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private async void btnReset_Click(object sender, EventArgs e)\n        {\n            ResetTextAndColor();\n\n            txtBoxAuthCode.ResetText();\n\n            throbber.State = ThrobberState.Rotating;\n            throbber.Visible = true;\n\n            Task resetSettingsAsync = Provider?.ResetSettingsAsync();\n            if (resetSettingsAsync != null)\n                await resetSettingsAsync;\n        }\n\n        /// <summary>\n        /// Request or Applies the authentication code.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private async void btnRequestApply_Click(object sender, EventArgs e)\n        {\n            ResetTextAndColor();\n\n            if (Provider == null)\n                return;\n\n            if (!m_authCodeRequested && !Provider.HasCredentialsStored)\n            {\n                await Provider.RequestAuthCodeAsync();\n\n                if (Provider.AuthSteps == AuthenticationSteps.One)\n                {\n                    btnRequestApply.Enabled = false;\n                    return;\n                }\n\n                btnRequestApply.Text = @\"Apply Auth Code\";\n                lblAuthCode.Enabled = txtBoxAuthCode.Enabled = btnRequestApply.Enabled =\n                    !Provider.HasCredentialsStored;\n\n                m_authCodeRequested = true;\n\n                return;\n            }\n\n            if (string.IsNullOrWhiteSpace(txtBoxAuthCode.Text))\n                return;\n\n            throbber.State = ThrobberState.Rotating;\n            throbber.Visible = true;\n\n            await Provider.CheckAuthCodeAsync(txtBoxAuthCode.Text);\n        }\n\n        /// <summary>\n        /// Occures when clicking on the getAnAccountLinkLabel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"LinkLabelLinkClickedEventArgs\"/> instance containing the event data.</param>\n        private void getAnAccountLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            if (Provider?.RefferalLink != null)\n                Util.OpenURL(Provider?.RefferalLink);\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Occurs when provider's API credentials get checked, informing the user.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CloudStorageServiceProviderEventArgs\"/> instance containing the event data.</param>\n        private void CloudStorageServiceProvider_CheckCredentials(object sender, CloudStorageServiceProviderEventArgs e)\n        {\n            throbber.State = ThrobberState.Stopped;\n            throbber.Visible = false;\n\n            apiResponseLabel.ForeColor = e.HasError ? Color.Red : Color.Green;\n            apiResponseLabel.Text = e.HasError\n                ? e.ErrorMessage\n                : CloudStorageServiceProvider.IsAuthenticated\n                    ? @\"Authenticated\"\n                    : string.Empty;\n\n            if (!e.HasError && (Provider.AuthSteps != AuthenticationSteps.One) && m_authCodeRequested &&\n                CloudStorageServiceProvider.IsAuthenticated)\n            {\n                m_authCodeRequested = false;\n            }\n\n            UpdateControlsVisibility();\n        }\n\n        /// <summary>\n        /// Occurs when provider's API credentials get reset.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CloudStorageServiceProviderEventArgs\"/> instance containing the event data.</param>\n        private void CloudStorageServiceProvider_SettingsReset(object sender, CloudStorageServiceProviderEventArgs e)\n        {\n            throbber.State = ThrobberState.Stopped;\n            throbber.Visible = false;\n\n            UpdateControlsVisibility();\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Checks the API authentication is valid.\n        /// </summary>\n        /// <param name=\"forceRecheck\">if set to <c>true</c> forces an authentication recheck.</param>\n        internal async Task CheckAPIAuthIsValidAsync(bool forceRecheck = false)\n        {\n            m_authCodeRequested = false;\n\n            UpdateControlsVisibility();\n\n            if (Provider == null || (!forceRecheck && !Provider.HasCredentialsStored))\n                return;\n\n            if (!forceRecheck && CloudStorageServiceProvider.IsAuthenticated)\n            {\n                apiResponseLabel.ForeColor = Color.Green;\n                apiResponseLabel.Text = @\"Authenticated\";\n                return;\n            }\n\n            ResetTextAndColor();\n            txtBoxAuthCode.ResetText();\n\n            throbber.State = ThrobberState.Rotating;\n            throbber.Visible = true;\n\n            if (forceRecheck)\n                Provider.CancelPendingQueries();\n\n            await Provider?.CheckAPIAuthIsValidAsync();\n        }\n\n        /// <summary>\n        /// Resets the color of the text and.\n        /// </summary>\n        private void ResetTextAndColor()\n        {\n            apiResponseLabel.ResetForeColor();\n            apiResponseLabel.ResetText();\n        }\n\n        /// <summary>\n        /// Updates the controls visibility.\n        /// </summary>\n        private void UpdateControlsVisibility()\n        {\n            createAccountLinkLabel.Visible = Provider?.RefferalLink != null;\n\n            if (Provider == null || m_authCodeRequested)\n                return;\n\n            btnRequestApply.Text = @\"Request Authentication\";\n            if (!Provider.HasCredentialsStored)\n            {\n                btnRequestApply.Enabled = !Provider.HasCredentialsStored;\n                lblAuthCode.Enabled = txtBoxAuthCode.Enabled = btnReset.Enabled =\n                    Provider.HasCredentialsStored;\n            }\n            else\n            {\n                lblAuthCode.Enabled = txtBoxAuthCode.Enabled = btnRequestApply.Enabled =\n                    !Provider.HasCredentialsStored;\n                btnReset.Enabled = Provider.HasCredentialsStored;\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/CloudStorageServiceControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SettingsUI/EmailNotificationsControl.Designer.cs",
    "content": "﻿namespace EVEMon.SettingsUI\n{\n    partial class EmailNotificationsControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.cbEmailUseShortFormat = new System.Windows.Forms.CheckBox();\n            this.tlpEmailSettings = new System.Windows.Forms.TableLayoutPanel();\n            this.lblEmailProvider = new System.Windows.Forms.Label();\n            this.lblFromAddress = new System.Windows.Forms.Label();\n            this.lblToAddress = new System.Windows.Forms.Label();\n            this.cbbEMailServerProvider = new System.Windows.Forms.ComboBox();\n            this.tbFromAddress = new System.Windows.Forms.TextBox();\n            this.tbToAddress = new System.Windows.Forms.TextBox();\n            this.tlpEmailAuthTable = new System.Windows.Forms.TableLayoutPanel();\n            this.lblEmailPassword = new System.Windows.Forms.Label();\n            this.lblEmailUsername = new System.Windows.Forms.Label();\n            this.tbEmailUsername = new System.Windows.Forms.TextBox();\n            this.tbEmailPassword = new System.Windows.Forms.TextBox();\n            this.tlpEmailServerSettings = new System.Windows.Forms.TableLayoutPanel();\n            this.lblEmailServerAddress = new System.Windows.Forms.Label();\n            this.tbEmailServerAddress = new System.Windows.Forms.TextBox();\n            this.lblPortNumber = new System.Windows.Forms.Label();\n            this.tbEmailPort = new System.Windows.Forms.TextBox();\n            this.cbEmailServerRequireSsl = new System.Windows.Forms.CheckBox();\n            this.cbEmailAuthRequired = new System.Windows.Forms.CheckBox();\n            this.lblToAddressInfo = new System.Windows.Forms.Label();\n            this.btnTestEmail = new System.Windows.Forms.Button();\n            this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);\n            this.btnReset = new System.Windows.Forms.Button();\n            this.tlpEmailSettings.SuspendLayout();\n            this.tlpEmailAuthTable.SuspendLayout();\n            this.tlpEmailServerSettings.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();\n            this.SuspendLayout();\n            // \n            // cbEmailUseShortFormat\n            // \n            this.cbEmailUseShortFormat.AutoSize = true;\n            this.cbEmailUseShortFormat.Location = new System.Drawing.Point(12, 3);\n            this.cbEmailUseShortFormat.Name = \"cbEmailUseShortFormat\";\n            this.cbEmailUseShortFormat.Size = new System.Drawing.Size(179, 17);\n            this.cbEmailUseShortFormat.TabIndex = 0;\n            this.cbEmailUseShortFormat.Text = \"Use Short Format (SMS-Friendly)\";\n            this.cbEmailUseShortFormat.UseVisualStyleBackColor = true;\n            // \n            // tlpEmailSettings\n            // \n            this.tlpEmailSettings.AutoSize = true;\n            this.tlpEmailSettings.ColumnCount = 2;\n            this.tlpEmailSettings.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 88F));\n            this.tlpEmailSettings.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tlpEmailSettings.Controls.Add(this.lblEmailProvider, 0, 0);\n            this.tlpEmailSettings.Controls.Add(this.lblFromAddress, 0, 3);\n            this.tlpEmailSettings.Controls.Add(this.lblToAddress, 0, 4);\n            this.tlpEmailSettings.Controls.Add(this.cbbEMailServerProvider, 1, 0);\n            this.tlpEmailSettings.Controls.Add(this.tbFromAddress, 1, 3);\n            this.tlpEmailSettings.Controls.Add(this.tbToAddress, 1, 4);\n            this.tlpEmailSettings.Controls.Add(this.tlpEmailAuthTable, 1, 2);\n            this.tlpEmailSettings.Controls.Add(this.tlpEmailServerSettings, 0, 1);\n            this.tlpEmailSettings.Controls.Add(this.lblToAddressInfo, 0, 5);\n            this.tlpEmailSettings.Location = new System.Drawing.Point(26, 26);\n            this.tlpEmailSettings.Name = \"tlpEmailSettings\";\n            this.tlpEmailSettings.RowCount = 6;\n            this.tlpEmailSettings.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpEmailSettings.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpEmailSettings.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpEmailSettings.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpEmailSettings.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpEmailSettings.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpEmailSettings.Size = new System.Drawing.Size(304, 274);\n            this.tlpEmailSettings.TabIndex = 1;\n            // \n            // lblEmailProvider\n            // \n            this.lblEmailProvider.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblEmailProvider.AutoSize = true;\n            this.lblEmailProvider.Location = new System.Drawing.Point(8, 0);\n            this.lblEmailProvider.Name = \"lblEmailProvider\";\n            this.lblEmailProvider.Size = new System.Drawing.Size(77, 27);\n            this.lblEmailProvider.TabIndex = 0;\n            this.lblEmailProvider.Text = \"Email Provider:\";\n            this.lblEmailProvider.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // lblFromAddress\n            // \n            this.lblFromAddress.AutoSize = true;\n            this.lblFromAddress.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblFromAddress.Location = new System.Drawing.Point(3, 182);\n            this.lblFromAddress.Name = \"lblFromAddress\";\n            this.lblFromAddress.Size = new System.Drawing.Size(82, 26);\n            this.lblFromAddress.TabIndex = 1;\n            this.lblFromAddress.Text = \"From address:\";\n            this.lblFromAddress.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // lblToAddress\n            // \n            this.lblToAddress.AutoSize = true;\n            this.lblToAddress.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblToAddress.Location = new System.Drawing.Point(3, 208);\n            this.lblToAddress.Name = \"lblToAddress\";\n            this.lblToAddress.Size = new System.Drawing.Size(82, 53);\n            this.lblToAddress.TabIndex = 2;\n            this.lblToAddress.Text = \"To address:\";\n            this.lblToAddress.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // cbbEMailServerProvider\n            // \n            this.cbbEMailServerProvider.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbbEMailServerProvider.Location = new System.Drawing.Point(91, 3);\n            this.cbbEMailServerProvider.Name = \"cbbEMailServerProvider\";\n            this.cbbEMailServerProvider.Size = new System.Drawing.Size(122, 21);\n            this.cbbEMailServerProvider.TabIndex = 0;\n            this.cbbEMailServerProvider.SelectedIndexChanged += new System.EventHandler(this.cbbEMailServerProvider_SelectedIndexChanged);\n            // \n            // tbFromAddress\n            // \n            this.tbFromAddress.Location = new System.Drawing.Point(91, 185);\n            this.tbFromAddress.Name = \"tbFromAddress\";\n            this.tbFromAddress.Size = new System.Drawing.Size(181, 20);\n            this.tbFromAddress.TabIndex = 3;\n            this.tbFromAddress.Validating += new System.ComponentModel.CancelEventHandler(this.tbFromAddress_Validating);\n            this.tbFromAddress.Validated += new System.EventHandler(this.tbFromAddress_Validated);\n            // \n            // tbToAddress\n            // \n            this.tbToAddress.Location = new System.Drawing.Point(91, 211);\n            this.tbToAddress.Multiline = true;\n            this.tbToAddress.Name = \"tbToAddress\";\n            this.tbToAddress.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n            this.tbToAddress.Size = new System.Drawing.Size(181, 47);\n            this.tbToAddress.TabIndex = 4;\n            this.tbToAddress.Validating += new System.ComponentModel.CancelEventHandler(this.tbToAddress_Validating);\n            this.tbToAddress.Validated += new System.EventHandler(this.tbToAddress_Validated);\n            // \n            // tlpEmailAuthTable\n            // \n            this.tlpEmailAuthTable.AutoSize = true;\n            this.tlpEmailAuthTable.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.tlpEmailAuthTable.ColumnCount = 2;\n            this.tlpEmailAuthTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tlpEmailAuthTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tlpEmailAuthTable.Controls.Add(this.lblEmailPassword, 0, 1);\n            this.tlpEmailAuthTable.Controls.Add(this.lblEmailUsername, 0, 0);\n            this.tlpEmailAuthTable.Controls.Add(this.tbEmailUsername, 1, 0);\n            this.tlpEmailAuthTable.Controls.Add(this.tbEmailPassword, 1, 1);\n            this.tlpEmailAuthTable.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tlpEmailAuthTable.Location = new System.Drawing.Point(88, 125);\n            this.tlpEmailAuthTable.Margin = new System.Windows.Forms.Padding(0, 0, 0, 5);\n            this.tlpEmailAuthTable.Name = \"tlpEmailAuthTable\";\n            this.tlpEmailAuthTable.RowCount = 2;\n            this.tlpEmailAuthTable.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpEmailAuthTable.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpEmailAuthTable.Size = new System.Drawing.Size(216, 52);\n            this.tlpEmailAuthTable.TabIndex = 2;\n            // \n            // lblEmailPassword\n            // \n            this.lblEmailPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblEmailPassword.AutoSize = true;\n            this.lblEmailPassword.Location = new System.Drawing.Point(5, 26);\n            this.lblEmailPassword.Name = \"lblEmailPassword\";\n            this.lblEmailPassword.Size = new System.Drawing.Size(56, 26);\n            this.lblEmailPassword.TabIndex = 8;\n            this.lblEmailPassword.Text = \"Password:\";\n            this.lblEmailPassword.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // lblEmailUsername\n            // \n            this.lblEmailUsername.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblEmailUsername.AutoSize = true;\n            this.lblEmailUsername.Location = new System.Drawing.Point(3, 0);\n            this.lblEmailUsername.Name = \"lblEmailUsername\";\n            this.lblEmailUsername.Size = new System.Drawing.Size(58, 26);\n            this.lblEmailUsername.TabIndex = 7;\n            this.lblEmailUsername.Text = \"Username:\";\n            this.lblEmailUsername.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // tbEmailUsername\n            // \n            this.tbEmailUsername.Location = new System.Drawing.Point(67, 3);\n            this.tbEmailUsername.Name = \"tbEmailUsername\";\n            this.tbEmailUsername.Size = new System.Drawing.Size(114, 20);\n            this.tbEmailUsername.TabIndex = 0;\n            this.tbEmailUsername.Validating += new System.ComponentModel.CancelEventHandler(this.tbEmailUsername_Validating);\n            this.tbEmailUsername.Validated += new System.EventHandler(this.tbEmailUsername_Validated);\n            // \n            // tbEmailPassword\n            // \n            this.tbEmailPassword.Location = new System.Drawing.Point(67, 29);\n            this.tbEmailPassword.Name = \"tbEmailPassword\";\n            this.tbEmailPassword.PasswordChar = '*';\n            this.tbEmailPassword.Size = new System.Drawing.Size(114, 20);\n            this.tbEmailPassword.TabIndex = 1;\n            this.tbEmailPassword.Validating += new System.ComponentModel.CancelEventHandler(this.tbEmailPassword_Validating);\n            this.tbEmailPassword.Validated += new System.EventHandler(this.tbEmailPassword_Validated);\n            // \n            // tlpEmailServerSettings\n            // \n            this.tlpEmailServerSettings.AutoSize = true;\n            this.tlpEmailServerSettings.ColumnCount = 2;\n            this.tlpEmailSettings.SetColumnSpan(this.tlpEmailServerSettings, 2);\n            this.tlpEmailServerSettings.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tlpEmailServerSettings.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tlpEmailServerSettings.Controls.Add(this.lblEmailServerAddress, 0, 0);\n            this.tlpEmailServerSettings.Controls.Add(this.tbEmailServerAddress, 1, 0);\n            this.tlpEmailServerSettings.Controls.Add(this.lblPortNumber, 0, 1);\n            this.tlpEmailServerSettings.Controls.Add(this.tbEmailPort, 1, 1);\n            this.tlpEmailServerSettings.Controls.Add(this.cbEmailServerRequireSsl, 1, 2);\n            this.tlpEmailServerSettings.Controls.Add(this.cbEmailAuthRequired, 1, 3);\n            this.tlpEmailServerSettings.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tlpEmailServerSettings.Location = new System.Drawing.Point(0, 27);\n            this.tlpEmailServerSettings.Margin = new System.Windows.Forms.Padding(0);\n            this.tlpEmailServerSettings.Name = \"tlpEmailServerSettings\";\n            this.tlpEmailServerSettings.RowCount = 4;\n            this.tlpEmailServerSettings.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpEmailServerSettings.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpEmailServerSettings.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpEmailServerSettings.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpEmailServerSettings.Size = new System.Drawing.Size(304, 98);\n            this.tlpEmailServerSettings.TabIndex = 1;\n            // \n            // lblEmailServerAddress\n            // \n            this.lblEmailServerAddress.AutoSize = true;\n            this.lblEmailServerAddress.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblEmailServerAddress.Location = new System.Drawing.Point(3, 0);\n            this.lblEmailServerAddress.Name = \"lblEmailServerAddress\";\n            this.lblEmailServerAddress.Size = new System.Drawing.Size(82, 26);\n            this.lblEmailServerAddress.TabIndex = 11;\n            this.lblEmailServerAddress.Text = \"Server Address:\";\n            this.lblEmailServerAddress.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // tbEmailServerAddress\n            // \n            this.tbEmailServerAddress.Location = new System.Drawing.Point(91, 3);\n            this.tbEmailServerAddress.Name = \"tbEmailServerAddress\";\n            this.tbEmailServerAddress.Size = new System.Drawing.Size(122, 20);\n            this.tbEmailServerAddress.TabIndex = 0;\n            this.tbEmailServerAddress.Validating += new System.ComponentModel.CancelEventHandler(this.tbEmailServerAddress_Validating);\n            this.tbEmailServerAddress.Validated += new System.EventHandler(this.tbEmailServerAddress_Validated);\n            // \n            // lblPortNumber\n            // \n            this.lblPortNumber.AutoSize = true;\n            this.lblPortNumber.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblPortNumber.Location = new System.Drawing.Point(3, 26);\n            this.lblPortNumber.Name = \"lblPortNumber\";\n            this.lblPortNumber.Size = new System.Drawing.Size(82, 26);\n            this.lblPortNumber.TabIndex = 10;\n            this.lblPortNumber.Text = \"Port Number:\";\n            this.lblPortNumber.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // tbEmailPort\n            // \n            this.tbEmailPort.Location = new System.Drawing.Point(91, 29);\n            this.tbEmailPort.MaxLength = 5;\n            this.tbEmailPort.Name = \"tbEmailPort\";\n            this.tbEmailPort.Size = new System.Drawing.Size(40, 20);\n            this.tbEmailPort.TabIndex = 1;\n            this.tbEmailPort.Text = \"25\";\n            this.tbEmailPort.Validating += new System.ComponentModel.CancelEventHandler(this.tbEmailPort_Validating);\n            // \n            // cbEmailServerRequireSsl\n            // \n            this.cbEmailServerRequireSsl.AutoSize = true;\n            this.cbEmailServerRequireSsl.Location = new System.Drawing.Point(91, 55);\n            this.cbEmailServerRequireSsl.Name = \"cbEmailServerRequireSsl\";\n            this.cbEmailServerRequireSsl.Size = new System.Drawing.Size(117, 17);\n            this.cbEmailServerRequireSsl.TabIndex = 2;\n            this.cbEmailServerRequireSsl.Text = \"Connect using SSL\";\n            this.cbEmailServerRequireSsl.UseVisualStyleBackColor = true;\n            // \n            // cbEmailAuthRequired\n            // \n            this.cbEmailAuthRequired.AutoSize = true;\n            this.cbEmailAuthRequired.Location = new System.Drawing.Point(91, 78);\n            this.cbEmailAuthRequired.Name = \"cbEmailAuthRequired\";\n            this.cbEmailAuthRequired.Size = new System.Drawing.Size(122, 17);\n            this.cbEmailAuthRequired.TabIndex = 3;\n            this.cbEmailAuthRequired.Text = \"Server requires login\";\n            this.cbEmailAuthRequired.UseVisualStyleBackColor = true;\n            this.cbEmailAuthRequired.CheckedChanged += new System.EventHandler(this.cbEmailAuthRequired_CheckedChanged);\n            // \n            // lblToAddressInfo\n            // \n            this.lblToAddressInfo.AutoSize = true;\n            this.tlpEmailSettings.SetColumnSpan(this.lblToAddressInfo, 2);\n            this.lblToAddressInfo.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblToAddressInfo.Location = new System.Drawing.Point(3, 261);\n            this.lblToAddressInfo.Name = \"lblToAddressInfo\";\n            this.lblToAddressInfo.Size = new System.Drawing.Size(298, 13);\n            this.lblToAddressInfo.TabIndex = 14;\n            this.lblToAddressInfo.Text = \"* Use \\' ; \\' (semicolon) or \\' , \\' (comma) between email addresses\";\n            this.lblToAddressInfo.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // btnTestEmail\n            // \n            this.btnTestEmail.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnTestEmail.Location = new System.Drawing.Point(240, 312);\n            this.btnTestEmail.Name = \"btnTestEmail\";\n            this.btnTestEmail.Size = new System.Drawing.Size(110, 23);\n            this.btnTestEmail.TabIndex = 2;\n            this.btnTestEmail.Text = \"Send Test Email\";\n            this.btnTestEmail.UseVisualStyleBackColor = true;\n            this.btnTestEmail.Click += new System.EventHandler(this.btnTestEmail_Click);\n            // \n            // errorProvider\n            // \n            this.errorProvider.ContainerControl = this;\n            // \n            // btnReset\n            // \n            this.btnReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.btnReset.Location = new System.Drawing.Point(12, 312);\n            this.btnReset.Name = \"btnReset\";\n            this.btnReset.Size = new System.Drawing.Size(75, 23);\n            this.btnReset.TabIndex = 3;\n            this.btnReset.Text = \"Reset\";\n            this.btnReset.UseVisualStyleBackColor = true;\n            this.btnReset.Click += new System.EventHandler(this.btnReset_Click);\n            // \n            // EmailNotificationsControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.btnReset);\n            this.Controls.Add(this.tlpEmailSettings);\n            this.Controls.Add(this.cbEmailUseShortFormat);\n            this.Controls.Add(this.btnTestEmail);\n            this.Name = \"EmailNotificationsControl\";\n            this.Size = new System.Drawing.Size(362, 338);\n            this.tlpEmailSettings.ResumeLayout(false);\n            this.tlpEmailSettings.PerformLayout();\n            this.tlpEmailAuthTable.ResumeLayout(false);\n            this.tlpEmailAuthTable.PerformLayout();\n            this.tlpEmailServerSettings.ResumeLayout(false);\n            this.tlpEmailServerSettings.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.CheckBox cbEmailUseShortFormat;\n        private System.Windows.Forms.TableLayoutPanel tlpEmailSettings;\n        private System.Windows.Forms.Label lblEmailProvider;\n        private System.Windows.Forms.Label lblFromAddress;\n        private System.Windows.Forms.Label lblToAddress;\n        private System.Windows.Forms.ComboBox cbbEMailServerProvider;\n        private System.Windows.Forms.TextBox tbFromAddress;\n        private System.Windows.Forms.TextBox tbToAddress;\n        private System.Windows.Forms.TableLayoutPanel tlpEmailAuthTable;\n        private System.Windows.Forms.Label lblEmailPassword;\n        private System.Windows.Forms.Label lblEmailUsername;\n        private System.Windows.Forms.TextBox tbEmailUsername;\n        private System.Windows.Forms.TextBox tbEmailPassword;\n        private System.Windows.Forms.Button btnTestEmail;\n        private System.Windows.Forms.TableLayoutPanel tlpEmailServerSettings;\n        private System.Windows.Forms.Label lblEmailServerAddress;\n        private System.Windows.Forms.TextBox tbEmailServerAddress;\n        private System.Windows.Forms.Label lblPortNumber;\n        private System.Windows.Forms.TextBox tbEmailPort;\n        private System.Windows.Forms.CheckBox cbEmailServerRequireSsl;\n        private System.Windows.Forms.CheckBox cbEmailAuthRequired;\n        private System.Windows.Forms.Label lblToAddressInfo;\n        private System.Windows.Forms.ErrorProvider errorProvider;\n        private System.Windows.Forms.Button btnReset;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/EmailNotificationsControl.cs",
    "content": "﻿using EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.EmailProvider;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.SettingsObjects;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace EVEMon.SettingsUI\n{\n    public partial class EmailNotificationsControl : UserControl\n    {\n        private NotificationSettings m_settings;\n        private IEmailProvider m_defaultProvider;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EmailNotificationsControl\"/> class.\n        /// </summary>\n        public EmailNotificationsControl()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Gets or sets the settings.\n        /// </summary>\n        /// <value>The settings.</value>\n        [Browsable(false)]\n        public NotificationSettings Settings\n        {\n            get { return m_settings; }\n            set\n            {\n                if (value == null || m_settings == value)\n                    return;\n\n                m_settings = value;\n\n                InitializeControls();\n            }\n        }\n\n        /// <summary>\n        /// Initializes the controls.\n        /// </summary>\n        private void InitializeControls()\n        {\n            EmailProviders.Initialize();\n\n            // Place default provider at the end\n            List<IEmailProvider> providers = EmailProviders.Providers.ToList();\n            m_defaultProvider = EmailProviders.Providers.First(provider => provider is DefaultProvider);\n            int index = providers.IndexOf(m_defaultProvider);\n            providers.RemoveAt(index);\n            providers.Insert(providers.Count, m_defaultProvider);\n\n            cbbEMailServerProvider.Items.AddRange(providers.Select(provider => provider.Name).ToArray<object>());\n            tlpEmailAuthTable.Enabled = false;\n\n            IEmailProvider emailProvider;\n            // Backwards compatibility condition\n            if (string.IsNullOrEmpty(m_settings.EmailSmtpServerProvider) && EmailProviders.Providers.Any(\n                provider => provider.ServerAddress == m_settings.EmailSmtpServerAddress))\n            {\n                emailProvider = EmailProviders.Providers.First(\n                    provider => provider.ServerAddress == m_settings.EmailSmtpServerAddress);\n                cbbEMailServerProvider.SelectedIndex = cbbEMailServerProvider.Items.IndexOf(emailProvider.Name);\n            }\n                // Backwards compatibility condition\n            else if (string.IsNullOrEmpty(m_settings.EmailSmtpServerProvider))\n                cbbEMailServerProvider.SelectedIndex = cbbEMailServerProvider.Items.IndexOf(m_defaultProvider.Name);\n                // Regular condition\n            else\n            {\n                emailProvider = EmailProviders.GetByKey(m_settings.EmailSmtpServerProvider);\n                cbbEMailServerProvider.SelectedIndex = cbbEMailServerProvider.Items.IndexOf(emailProvider.Name);\n            }\n        }\n\n        /// <summary>\n        /// Populates the settings from controls.\n        /// </summary>\n        /// <returns></returns>\n        internal void PopulateSettingsFromControls()\n        {\n            m_settings.UseEmailShortFormat = cbEmailUseShortFormat.Checked;\n            m_settings.EmailSmtpServerProvider = (string)cbbEMailServerProvider.SelectedItem;\n            m_settings.EmailSmtpServerAddress = tbEmailServerAddress.Text.Trim();\n\n            // Try and get a usable number out of the text box\n            int emailPortNumber;\n            m_settings.EmailPortNumber = (tbEmailPort.Text.Trim().TryParseInv(out\n                emailPortNumber) && emailPortNumber > 0) ? emailPortNumber : 25;\n\n            m_settings.EmailServerRequiresSsl = cbEmailServerRequireSsl.Checked;\n            m_settings.EmailAuthenticationRequired = cbEmailAuthRequired.Checked;\n            m_settings.EmailAuthenticationUserName = tbEmailUsername.Text.Trim();\n            m_settings.EmailAuthenticationPassword = Util.Encrypt(tbEmailPassword.Text.Trim(), tbEmailUsername.Text.Trim());\n            m_settings.EmailToAddress = tbToAddress.Text.Trim();\n            m_settings.EmailFromAddress = tbFromAddress.Text.Trim();\n        }\n\n        /// <summary>\n        /// Sets the controls.\n        /// </summary>\n        private void SetControls()\n        {\n            IEmailProvider provider = EmailProviders.GetByKey((string)cbbEMailServerProvider.SelectedItem);\n\n            if (provider != null && provider != m_defaultProvider)\n            {\n                tbEmailServerAddress.Text = provider.ServerAddress;\n                tbEmailPort.Text = provider.ServerPort.ToString(CultureConstants.DefaultCulture);\n                cbEmailServerRequireSsl.Checked = provider.RequiresSsl;\n                cbEmailAuthRequired.Checked = provider.RequiresAuthentication;\n                tlpEmailServerSettings.Enabled = false;\n            }\n            else\n            {\n                tlpEmailServerSettings.Enabled = true;\n                tbEmailServerAddress.Text = m_settings.EmailSmtpServerAddress;\n                tbEmailPort.Text = m_settings.EmailPortNumber.ToString(CultureConstants.DefaultCulture);\n                cbEmailServerRequireSsl.Checked = m_settings.EmailServerRequiresSsl;\n                cbEmailAuthRequired.Checked = m_settings.EmailAuthenticationRequired;\n            }\n\n            tbEmailUsername.Text = m_settings.EmailAuthenticationUserName;\n            tbEmailPassword.Text = Util.Decrypt(m_settings.EmailAuthenticationPassword, m_settings.EmailAuthenticationUserName);\n            tbFromAddress.Text = m_settings.EmailFromAddress;\n            tbToAddress.Text = m_settings.EmailToAddress;\n        }\n\n        /// <summary>\n        /// Resets the controls.\n        /// </summary>\n        private void ResetControls()\n        {\n            cbEmailUseShortFormat.Checked = false;\n            cbbEMailServerProvider.SelectedIndex = cbbEMailServerProvider.Items.IndexOf(m_defaultProvider.Name);\n            tbEmailServerAddress.Text = m_defaultProvider.ServerAddress;\n            tbEmailPort.Text = m_defaultProvider.ServerAddress;\n            cbEmailServerRequireSsl.Checked = m_defaultProvider.RequiresSsl;\n            cbEmailAuthRequired.Checked = m_defaultProvider.RequiresAuthentication;\n            tbEmailUsername.ResetText();\n            tbEmailPassword.ResetText();\n            tbToAddress.ResetText();\n            tbFromAddress.ResetText();\n        }\n\n        /// <summary>\n        /// Handles the SelectedIndexChanged event of the cbbEMailServerProvider control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void cbbEMailServerProvider_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            SetControls();\n        }\n\n        /// <summary>\n        /// Handles the CheckedChanged event of the cbEmailAuthRequired control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void cbEmailAuthRequired_CheckedChanged(object sender, EventArgs e)\n        {\n            tlpEmailAuthTable.Enabled = cbEmailAuthRequired.Checked;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnReset control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnReset_Click(object sender, EventArgs e)\n        {\n            ResetControls();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnTestEmail control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnTestEmail_Click(object sender, EventArgs e)\n        {\n            if (!ValidateChildren())\n                return;\n\n            PopulateSettingsFromControls();\n            Emailer.SendTestMail(m_settings);\n        }\n\n        /// <summary>\n        /// Handles the Validating event of the tbEmailServerAddress control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void tbEmailServerAddress_Validating(object sender, CancelEventArgs e)\n        {\n            e.Cancel = string.IsNullOrWhiteSpace(tbEmailServerAddress.Text.Trim());\n\n            if (e.Cancel)\n                errorProvider.SetError(tbEmailServerAddress, \"Server Address can not be blank\");\n        }\n\n        /// <summary>\n        /// Handles the Validating event of the tbEmailPort control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void tbEmailPort_Validating(object sender, CancelEventArgs e)\n        {\n            int ignore;\n            e.Cancel = !SettingsForm.IsValidPort(tbEmailPort.Text, \"Email Server port\", out ignore);\n        }\n\n        private void tbEmailUsername_Validating(object sender, CancelEventArgs e)\n        {\n            e.Cancel = cbEmailAuthRequired.Checked && string.IsNullOrWhiteSpace(tbEmailUsername.Text.Trim());\n\n            if (e.Cancel)\n                errorProvider.SetError(tbEmailUsername, \"Username can not be blank\");\n        }\n\n        /// <summary>\n        /// Handles the Validating event of the tbEmailPassword control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void tbEmailPassword_Validating(object sender, CancelEventArgs e)\n        {\n            e.Cancel = cbEmailAuthRequired.Checked && string.IsNullOrWhiteSpace(tbEmailPassword.Text.Trim());\n\n            if (e.Cancel)\n                errorProvider.SetError(tbEmailPassword, \"Password can not be blank\");\n        }\n\n        /// <summary>\n        /// Handles the Validating event of the tbFromAddress control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void tbFromAddress_Validating(object sender, CancelEventArgs e)\n        {\n            e.Cancel = !string.IsNullOrEmpty(tbFromAddress.Text.Trim()) && !tbFromAddress.Text.Trim().IsValidEmail();\n\n            if (!e.Cancel)\n                return;\n\n            string text = $\"{tbFromAddress.Text.Trim()} is not of a valid email format\";\n\n            errorProvider.SetError(tbFromAddress, text);\n        }\n\n        /// <summary>\n        /// Handles the Validating event of the tbToAddress control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void tbToAddress_Validating(object sender, CancelEventArgs e)\n        {\n            IEnumerable<string> toAddresses = tbToAddress.Text.Trim().Split(\n                new[] { ';', ',' }, StringSplitOptions.RemoveEmptyEntries);\n\n            IEnumerable<string> invalidToAddresses = toAddresses.Where(address => !address.IsValidEmail());\n\n            e.Cancel = string.IsNullOrEmpty(tbToAddress.Text.Trim()) || !toAddresses.Any() || invalidToAddresses.Any();\n\n            // Receivers are not of valid email format\n            if (!e.Cancel)\n                return;\n\n            string text = !invalidToAddresses.Any()\n                ? \"\\'To address\\' can not be blank\"\n                : $\"{string.Join(\", \", invalidToAddresses)} {(invalidToAddresses.Count() == 1 ? \"is\" : \"are\")}\" +\n                  @\" not of a valid email format\";\n\n            errorProvider.SetError(tbToAddress, text);\n        }\n\n        /// <summary>\n        /// Handles the Validated event of the tbEmailServerAddress control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tbEmailServerAddress_Validated(object sender, EventArgs e)\n        {\n            errorProvider.SetError(tbEmailServerAddress, string.Empty);\n        }\n\n        /// <summary>\n        /// Handles the Validated event of the tbEmailUsername control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tbEmailUsername_Validated(object sender, EventArgs e)\n        {\n            errorProvider.SetError(tbEmailUsername, string.Empty);\n        }\n\n        /// <summary>\n        /// Handles the Validated event of the tbEmailPassword control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tbEmailPassword_Validated(object sender, EventArgs e)\n        {\n            errorProvider.SetError(tbEmailPassword, string.Empty);\n        }\n\n        /// <summary>\n        /// Handles the Validated event of the tbFromAddress control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tbFromAddress_Validated(object sender, EventArgs e)\n        {\n            errorProvider.SetError(tbFromAddress, string.Empty);\n        }\n\n        /// <summary>\n        /// Handles the Validated event of the tbToAddress control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tbToAddress_Validated(object sender, EventArgs e)\n        {\n            errorProvider.SetError(tbToAddress, string.Empty);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/EmailNotificationsControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"errorProvider.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/SettingsUI/ExternalCalendarControl.Designer.cs",
    "content": "﻿namespace EVEMon.SettingsUI\n{\n    partial class ExternalCalendarControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ExternalCalendarControl));\n            this.externalCalendarPanel = new System.Windows.Forms.Panel();\n            this.gbReminder = new System.Windows.Forms.GroupBox();\n            this.lblMinutes = new System.Windows.Forms.Label();\n            this.cbSetReminder = new System.Windows.Forms.CheckBox();\n            this.lblLateReminder = new System.Windows.Forms.Label();\n            this.dtpLateReminder = new System.Windows.Forms.DateTimePicker();\n            this.lblEarlyReminder = new System.Windows.Forms.Label();\n            this.tbReminder = new System.Windows.Forms.TextBox();\n            this.cbUseAlterateReminder = new System.Windows.Forms.CheckBox();\n            this.dtpEarlyReminder = new System.Windows.Forms.DateTimePicker();\n            this.cbLastQueuedSkillOnly = new System.Windows.Forms.CheckBox();\n            this.rbMSOutlook = new System.Windows.Forms.RadioButton();\n            this.rbGoogle = new System.Windows.Forms.RadioButton();\n            this.gbGoogle = new System.Windows.Forms.GroupBox();\n            this.calendarIDLinkLabel = new System.Windows.Forms.LinkLabel();\n            this.apiResponseLabel = new System.Windows.Forms.Label();\n            this.btnRevokeAuth = new System.Windows.Forms.Button();\n            this.btnRequestAuth = new System.Windows.Forms.Button();\n            this.cbGoogleReminder = new System.Windows.Forms.ComboBox();\n            this.lblReminder = new System.Windows.Forms.Label();\n            this.lblCalendarId = new System.Windows.Forms.Label();\n            this.tbGoogleCalendarName = new System.Windows.Forms.TextBox();\n            this.gbMSOutlook = new System.Windows.Forms.GroupBox();\n            this.calendarPathExampleLabel = new System.Windows.Forms.Label();\n            this.rbCustomCalendar = new System.Windows.Forms.RadioButton();\n            this.rbDefaultCalendar = new System.Windows.Forms.RadioButton();\n            this.tbOutlookCalendarPath = new System.Windows.Forms.TextBox();\n            this.calendarPathLabel = new System.Windows.Forms.Label();\n            this.throbber = new EVEMon.Common.Controls.Throbber();\n            this.externalCalendarPanel.SuspendLayout();\n            this.gbReminder.SuspendLayout();\n            this.gbGoogle.SuspendLayout();\n            this.gbMSOutlook.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.throbber)).BeginInit();\n            this.SuspendLayout();\n            // \n            // externalCalendarPanel\n            // \n            this.externalCalendarPanel.Controls.Add(this.gbReminder);\n            this.externalCalendarPanel.Controls.Add(this.cbLastQueuedSkillOnly);\n            this.externalCalendarPanel.Controls.Add(this.rbMSOutlook);\n            this.externalCalendarPanel.Controls.Add(this.rbGoogle);\n            this.externalCalendarPanel.Controls.Add(this.gbGoogle);\n            this.externalCalendarPanel.Controls.Add(this.gbMSOutlook);\n            this.externalCalendarPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.externalCalendarPanel.Location = new System.Drawing.Point(0, 0);\n            this.externalCalendarPanel.Name = \"externalCalendarPanel\";\n            this.externalCalendarPanel.Padding = new System.Windows.Forms.Padding(3);\n            this.externalCalendarPanel.Size = new System.Drawing.Size(439, 297);\n            this.externalCalendarPanel.TabIndex = 13;\n            // \n            // gbReminder\n            // \n            this.gbReminder.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.gbReminder.Controls.Add(this.lblMinutes);\n            this.gbReminder.Controls.Add(this.cbSetReminder);\n            this.gbReminder.Controls.Add(this.lblLateReminder);\n            this.gbReminder.Controls.Add(this.dtpLateReminder);\n            this.gbReminder.Controls.Add(this.lblEarlyReminder);\n            this.gbReminder.Controls.Add(this.tbReminder);\n            this.gbReminder.Controls.Add(this.cbUseAlterateReminder);\n            this.gbReminder.Controls.Add(this.dtpEarlyReminder);\n            this.gbReminder.Location = new System.Drawing.Point(6, 169);\n            this.gbReminder.Name = \"gbReminder\";\n            this.gbReminder.Size = new System.Drawing.Size(426, 96);\n            this.gbReminder.TabIndex = 13;\n            this.gbReminder.TabStop = false;\n            this.gbReminder.Text = \"Reminder Setting\";\n            // \n            // lblMinutes\n            // \n            this.lblMinutes.AutoSize = true;\n            this.lblMinutes.Location = new System.Drawing.Point(144, 21);\n            this.lblMinutes.Name = \"lblMinutes\";\n            this.lblMinutes.Size = new System.Drawing.Size(43, 13);\n            this.lblMinutes.TabIndex = 11;\n            this.lblMinutes.Text = \"minutes\";\n            // \n            // cbSetReminder\n            // \n            this.cbSetReminder.AutoSize = true;\n            this.cbSetReminder.Location = new System.Drawing.Point(8, 20);\n            this.cbSetReminder.Name = \"cbSetReminder\";\n            this.cbSetReminder.Size = new System.Drawing.Size(88, 17);\n            this.cbSetReminder.TabIndex = 6;\n            this.cbSetReminder.Text = \"Use reminder\";\n            this.cbSetReminder.UseVisualStyleBackColor = true;\n            this.cbSetReminder.Click += new System.EventHandler(this.OnMustEnableOrDisable);\n            // \n            // lblLateReminder\n            // \n            this.lblLateReminder.AutoSize = true;\n            this.lblLateReminder.Location = new System.Drawing.Point(192, 70);\n            this.lblLateReminder.Name = \"lblLateReminder\";\n            this.lblLateReminder.Size = new System.Drawing.Size(79, 13);\n            this.lblLateReminder.TabIndex = 6;\n            this.lblLateReminder.Text = \"Late Reminder:\";\n            // \n            // dtpLateReminder\n            // \n            this.dtpLateReminder.Format = System.Windows.Forms.DateTimePickerFormat.Time;\n            this.dtpLateReminder.Location = new System.Drawing.Point(278, 66);\n            this.dtpLateReminder.Name = \"dtpLateReminder\";\n            this.dtpLateReminder.ShowUpDown = true;\n            this.dtpLateReminder.Size = new System.Drawing.Size(72, 20);\n            this.dtpLateReminder.TabIndex = 10;\n            this.dtpLateReminder.Value = new System.DateTime(2007, 9, 21, 0, 0, 0, 0);\n            // \n            // lblEarlyReminder\n            // \n            this.lblEarlyReminder.AutoSize = true;\n            this.lblEarlyReminder.Location = new System.Drawing.Point(27, 70);\n            this.lblEarlyReminder.Name = \"lblEarlyReminder\";\n            this.lblEarlyReminder.Size = new System.Drawing.Size(81, 13);\n            this.lblEarlyReminder.TabIndex = 4;\n            this.lblEarlyReminder.Text = \"Early Reminder:\";\n            // \n            // tbReminder\n            // \n            this.tbReminder.Location = new System.Drawing.Point(102, 18);\n            this.tbReminder.Name = \"tbReminder\";\n            this.tbReminder.Size = new System.Drawing.Size(35, 20);\n            this.tbReminder.TabIndex = 7;\n            this.tbReminder.Text = \"10\";\n            this.tbReminder.Validating += new System.ComponentModel.CancelEventHandler(this.tbReminder_Validating);\n            // \n            // cbUseAlterateReminder\n            // \n            this.cbUseAlterateReminder.AutoSize = true;\n            this.cbUseAlterateReminder.Location = new System.Drawing.Point(8, 45);\n            this.cbUseAlterateReminder.Name = \"cbUseAlterateReminder\";\n            this.cbUseAlterateReminder.Size = new System.Drawing.Size(132, 17);\n            this.cbUseAlterateReminder.TabIndex = 8;\n            this.cbUseAlterateReminder.Text = \"Use alternate reminder\";\n            this.cbUseAlterateReminder.UseVisualStyleBackColor = true;\n            this.cbUseAlterateReminder.Click += new System.EventHandler(this.OnMustEnableOrDisable);\n            // \n            // dtpEarlyReminder\n            // \n            this.dtpEarlyReminder.Format = System.Windows.Forms.DateTimePickerFormat.Time;\n            this.dtpEarlyReminder.Location = new System.Drawing.Point(116, 66);\n            this.dtpEarlyReminder.Name = \"dtpEarlyReminder\";\n            this.dtpEarlyReminder.ShowUpDown = true;\n            this.dtpEarlyReminder.Size = new System.Drawing.Size(70, 20);\n            this.dtpEarlyReminder.TabIndex = 9;\n            this.dtpEarlyReminder.Value = new System.DateTime(2007, 9, 21, 0, 0, 0, 0);\n            // \n            // cbLastQueuedSkillOnly\n            // \n            this.cbLastQueuedSkillOnly.AutoSize = true;\n            this.cbLastQueuedSkillOnly.Location = new System.Drawing.Point(14, 271);\n            this.cbLastQueuedSkillOnly.Name = \"cbLastQueuedSkillOnly\";\n            this.cbLastQueuedSkillOnly.Size = new System.Drawing.Size(133, 17);\n            this.cbLastQueuedSkillOnly.TabIndex = 12;\n            this.cbLastQueuedSkillOnly.Text = \"Last Queued Skill Only\";\n            this.cbLastQueuedSkillOnly.UseVisualStyleBackColor = true;\n            // \n            // rbMSOutlook\n            // \n            this.rbMSOutlook.AutoSize = true;\n            this.rbMSOutlook.CausesValidation = false;\n            this.rbMSOutlook.Location = new System.Drawing.Point(6, 8);\n            this.rbMSOutlook.Name = \"rbMSOutlook\";\n            this.rbMSOutlook.Size = new System.Drawing.Size(81, 17);\n            this.rbMSOutlook.TabIndex = 1;\n            this.rbMSOutlook.Text = \"MS Outlook\";\n            this.rbMSOutlook.UseVisualStyleBackColor = true;\n            this.rbMSOutlook.CheckedChanged += new System.EventHandler(this.OnMustEnableOrDisable);\n            // \n            // rbGoogle\n            // \n            this.rbGoogle.AutoSize = true;\n            this.rbGoogle.CausesValidation = false;\n            this.rbGoogle.Location = new System.Drawing.Point(93, 8);\n            this.rbGoogle.Name = \"rbGoogle\";\n            this.rbGoogle.Size = new System.Drawing.Size(59, 17);\n            this.rbGoogle.TabIndex = 2;\n            this.rbGoogle.Text = \"Google\";\n            this.rbGoogle.UseVisualStyleBackColor = true;\n            this.rbGoogle.CheckedChanged += new System.EventHandler(this.rbGoogle_CheckedChanged);\n            // \n            // gbGoogle\n            // \n            this.gbGoogle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.gbGoogle.Controls.Add(this.calendarIDLinkLabel);\n            this.gbGoogle.Controls.Add(this.apiResponseLabel);\n            this.gbGoogle.Controls.Add(this.btnRevokeAuth);\n            this.gbGoogle.Controls.Add(this.btnRequestAuth);\n            this.gbGoogle.Controls.Add(this.cbGoogleReminder);\n            this.gbGoogle.Controls.Add(this.lblReminder);\n            this.gbGoogle.Controls.Add(this.lblCalendarId);\n            this.gbGoogle.Controls.Add(this.tbGoogleCalendarName);\n            this.gbGoogle.Controls.Add(this.throbber);\n            this.gbGoogle.Location = new System.Drawing.Point(5, 31);\n            this.gbGoogle.Name = \"gbGoogle\";\n            this.gbGoogle.Size = new System.Drawing.Size(427, 137);\n            this.gbGoogle.TabIndex = 3;\n            this.gbGoogle.TabStop = false;\n            this.gbGoogle.Text = \"Google Information\";\n            // \n            // calendarIDLinkLabel\n            // \n            this.calendarIDLinkLabel.AutoSize = true;\n            this.calendarIDLinkLabel.LinkArea = new System.Windows.Forms.LinkArea(54, 25);\n            this.calendarIDLinkLabel.Location = new System.Drawing.Point(7, 118);\n            this.calendarIDLinkLabel.Name = \"calendarIDLinkLabel\";\n            this.calendarIDLinkLabel.Size = new System.Drawing.Size(406, 17);\n            this.calendarIDLinkLabel.TabIndex = 12;\n            this.calendarIDLinkLabel.TabStop = true;\n            this.calendarIDLinkLabel.Text = \"Tip: Leave Calendar ID blank to use default calendar. How to find a Calendar ID.\";\n            this.calendarIDLinkLabel.UseCompatibleTextRendering = true;\n            this.calendarIDLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.calendarIDLinkLabel_LinkClicked);\n            // \n            // apiResponseLabel\n            // \n            this.apiResponseLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.apiResponseLabel.Location = new System.Drawing.Point(6, 16);\n            this.apiResponseLabel.Name = \"apiResponseLabel\";\n            this.apiResponseLabel.Size = new System.Drawing.Size(415, 24);\n            this.apiResponseLabel.TabIndex = 11;\n            this.apiResponseLabel.Text = \"APIResponse\";\n            this.apiResponseLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // btnRevokeAuth\n            // \n            this.btnRevokeAuth.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnRevokeAuth.Location = new System.Drawing.Point(347, 43);\n            this.btnRevokeAuth.Name = \"btnRevokeAuth\";\n            this.btnRevokeAuth.Size = new System.Drawing.Size(75, 23);\n            this.btnRevokeAuth.TabIndex = 9;\n            this.btnRevokeAuth.Text = \"Reset\";\n            this.btnRevokeAuth.UseVisualStyleBackColor = true;\n            this.btnRevokeAuth.Click += new System.EventHandler(this.btnRevokeAuth_Click);\n            // \n            // btnRequestAuth\n            // \n            this.btnRequestAuth.Anchor = System.Windows.Forms.AnchorStyles.Top;\n            this.btnRequestAuth.Location = new System.Drawing.Point(140, 43);\n            this.btnRequestAuth.Name = \"btnRequestAuth\";\n            this.btnRequestAuth.Size = new System.Drawing.Size(147, 23);\n            this.btnRequestAuth.TabIndex = 8;\n            this.btnRequestAuth.Text = \"Request Authentication\";\n            this.btnRequestAuth.UseVisualStyleBackColor = true;\n            this.btnRequestAuth.Click += new System.EventHandler(this.btnRequestAuth_Click);\n            // \n            // cbGoogleReminder\n            // \n            this.cbGoogleReminder.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbGoogleReminder.FormattingEnabled = true;\n            this.cbGoogleReminder.Location = new System.Drawing.Point(78, 93);\n            this.cbGoogleReminder.Name = \"cbGoogleReminder\";\n            this.cbGoogleReminder.Size = new System.Drawing.Size(92, 21);\n            this.cbGoogleReminder.TabIndex = 7;\n            // \n            // lblReminder\n            // \n            this.lblReminder.AutoSize = true;\n            this.lblReminder.Location = new System.Drawing.Point(6, 96);\n            this.lblReminder.Name = \"lblReminder\";\n            this.lblReminder.Size = new System.Drawing.Size(55, 13);\n            this.lblReminder.TabIndex = 6;\n            this.lblReminder.Text = \"Reminder:\";\n            // \n            // lblCalendarId\n            // \n            this.lblCalendarId.AutoSize = true;\n            this.lblCalendarId.Location = new System.Drawing.Point(6, 73);\n            this.lblCalendarId.Name = \"lblCalendarId\";\n            this.lblCalendarId.Size = new System.Drawing.Size(66, 13);\n            this.lblCalendarId.TabIndex = 5;\n            this.lblCalendarId.Text = \"Calendar ID:\";\n            // \n            // tbGoogleCalendarName\n            // \n            this.tbGoogleCalendarName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbGoogleCalendarName.Location = new System.Drawing.Point(78, 69);\n            this.tbGoogleCalendarName.Name = \"tbGoogleCalendarName\";\n            this.tbGoogleCalendarName.Size = new System.Drawing.Size(343, 20);\n            this.tbGoogleCalendarName.TabIndex = 5;\n            this.tbGoogleCalendarName.Text = \"primary\";\n            // \n            // gbMSOutlook\n            // \n            this.gbMSOutlook.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.gbMSOutlook.Controls.Add(this.calendarPathExampleLabel);\n            this.gbMSOutlook.Controls.Add(this.rbCustomCalendar);\n            this.gbMSOutlook.Controls.Add(this.rbDefaultCalendar);\n            this.gbMSOutlook.Controls.Add(this.tbOutlookCalendarPath);\n            this.gbMSOutlook.Controls.Add(this.calendarPathLabel);\n            this.gbMSOutlook.Location = new System.Drawing.Point(5, 31);\n            this.gbMSOutlook.Name = \"gbMSOutlook\";\n            this.gbMSOutlook.Size = new System.Drawing.Size(427, 137);\n            this.gbMSOutlook.TabIndex = 14;\n            this.gbMSOutlook.TabStop = false;\n            this.gbMSOutlook.Text = \"MS Outlook Information\";\n            // \n            // calendarPathExampleLabel\n            // \n            this.calendarPathExampleLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.calendarPathExampleLabel.AutoSize = true;\n            this.calendarPathExampleLabel.Location = new System.Drawing.Point(6, 74);\n            this.calendarPathExampleLabel.Name = \"calendarPathExampleLabel\";\n            this.calendarPathExampleLabel.Size = new System.Drawing.Size(411, 52);\n            this.calendarPathExampleLabel.TabIndex = 4;\n            this.calendarPathExampleLabel.Text = resources.GetString(\"calendarPathExampleLabel.Text\");\n            // \n            // rbCustomCalendar\n            // \n            this.rbCustomCalendar.AutoSize = true;\n            this.rbCustomCalendar.Location = new System.Drawing.Point(141, 20);\n            this.rbCustomCalendar.Name = \"rbCustomCalendar\";\n            this.rbCustomCalendar.Size = new System.Drawing.Size(127, 17);\n            this.rbCustomCalendar.TabIndex = 3;\n            this.rbCustomCalendar.TabStop = true;\n            this.rbCustomCalendar.Text = \"Use Custom Calendar\";\n            this.rbCustomCalendar.UseVisualStyleBackColor = true;\n            this.rbCustomCalendar.Click += new System.EventHandler(this.OnMustEnableOrDisable);\n            // \n            // rbDefaultCalendar\n            // \n            this.rbDefaultCalendar.AutoSize = true;\n            this.rbDefaultCalendar.CausesValidation = false;\n            this.rbDefaultCalendar.Location = new System.Drawing.Point(9, 20);\n            this.rbDefaultCalendar.Name = \"rbDefaultCalendar\";\n            this.rbDefaultCalendar.Size = new System.Drawing.Size(126, 17);\n            this.rbDefaultCalendar.TabIndex = 2;\n            this.rbDefaultCalendar.TabStop = true;\n            this.rbDefaultCalendar.Text = \"Use Default Calendar\";\n            this.rbDefaultCalendar.UseVisualStyleBackColor = true;\n            this.rbDefaultCalendar.Click += new System.EventHandler(this.OnMustEnableOrDisable);\n            // \n            // tbOutlookCalendarPath\n            // \n            this.tbOutlookCalendarPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbOutlookCalendarPath.Location = new System.Drawing.Point(95, 46);\n            this.tbOutlookCalendarPath.Name = \"tbOutlookCalendarPath\";\n            this.tbOutlookCalendarPath.Size = new System.Drawing.Size(326, 20);\n            this.tbOutlookCalendarPath.TabIndex = 1;\n            this.tbOutlookCalendarPath.Validating += new System.ComponentModel.CancelEventHandler(this.tbCalendarPath_Validating);\n            // \n            // calendarPathLabel\n            // \n            this.calendarPathLabel.AutoSize = true;\n            this.calendarPathLabel.Location = new System.Drawing.Point(6, 49);\n            this.calendarPathLabel.Name = \"calendarPathLabel\";\n            this.calendarPathLabel.Size = new System.Drawing.Size(77, 13);\n            this.calendarPathLabel.TabIndex = 0;\n            this.calendarPathLabel.Text = \"Calendar Path:\";\n            // \n            // throbber\n            // \n            this.throbber.Location = new System.Drawing.Point(201, 16);\n            this.throbber.MaximumSize = new System.Drawing.Size(24, 24);\n            this.throbber.MinimumSize = new System.Drawing.Size(24, 24);\n            this.throbber.Name = \"throbber\";\n            this.throbber.Size = new System.Drawing.Size(24, 24);\n            this.throbber.State = EVEMon.Common.Enumerations.ThrobberState.Stopped;\n            this.throbber.TabIndex = 13;\n            this.throbber.TabStop = false;\n            // \n            // ExternalCalendarControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.externalCalendarPanel);\n            this.Enabled = false;\n            this.Name = \"ExternalCalendarControl\";\n            this.Size = new System.Drawing.Size(439, 297);\n            this.EnabledChanged += new System.EventHandler(this.ExternalCalendarControl_EnabledChanged);\n            this.externalCalendarPanel.ResumeLayout(false);\n            this.externalCalendarPanel.PerformLayout();\n            this.gbReminder.ResumeLayout(false);\n            this.gbReminder.PerformLayout();\n            this.gbGoogle.ResumeLayout(false);\n            this.gbGoogle.PerformLayout();\n            this.gbMSOutlook.ResumeLayout(false);\n            this.gbMSOutlook.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.throbber)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n        private System.Windows.Forms.GroupBox gbReminder;\n        private System.Windows.Forms.Label lblMinutes;\n        private System.Windows.Forms.CheckBox cbSetReminder;\n        private System.Windows.Forms.Label lblLateReminder;\n        private System.Windows.Forms.DateTimePicker dtpLateReminder;\n        private System.Windows.Forms.Label lblEarlyReminder;\n        private System.Windows.Forms.TextBox tbReminder;\n        private System.Windows.Forms.CheckBox cbUseAlterateReminder;\n        private System.Windows.Forms.DateTimePicker dtpEarlyReminder;\n        private System.Windows.Forms.CheckBox cbLastQueuedSkillOnly;\n        private System.Windows.Forms.RadioButton rbMSOutlook;\n        private System.Windows.Forms.RadioButton rbGoogle;\n        private System.Windows.Forms.GroupBox gbGoogle;\n        private System.Windows.Forms.ComboBox cbGoogleReminder;\n        private System.Windows.Forms.Label lblReminder;\n        private System.Windows.Forms.Label lblCalendarId;\n        private System.Windows.Forms.TextBox tbGoogleCalendarName;\n        private System.Windows.Forms.GroupBox gbMSOutlook;\n        private System.Windows.Forms.Label calendarPathExampleLabel;\n        private System.Windows.Forms.RadioButton rbCustomCalendar;\n        private System.Windows.Forms.RadioButton rbDefaultCalendar;\n        private System.Windows.Forms.TextBox tbOutlookCalendarPath;\n        private System.Windows.Forms.Label calendarPathLabel;\n        private System.Windows.Forms.Panel externalCalendarPanel;\n        private System.Windows.Forms.Button btnRevokeAuth;\n        private System.Windows.Forms.Button btnRequestAuth;\n        private System.Windows.Forms.Label apiResponseLabel;\n        private System.Windows.Forms.LinkLabel calendarIDLinkLabel;\n        private Common.Controls.Throbber throbber;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/ExternalCalendarControl.cs",
    "content": "﻿using EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.ExternalCalendar;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.Serialization.Settings;\nusing System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\n\nnamespace EVEMon.SettingsUI\n{\n    public partial class ExternalCalendarControl : UserControl\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ExternalCalendarControl\"/> class.\n        /// </summary>\n        public ExternalCalendarControl()\n        {\n            InitializeComponent();\n\n            apiResponseLabel.Font = FontFactory.GetFont(\"Tahoma\", FontStyle.Bold);\n            apiResponseLabel.ResetText();\n\n            throbber.Visible = false;\n            throbber.BringToFront();\n\n            btnRevokeAuth.Enabled = false;\n            tbGoogleCalendarName.Enabled = false;\n            cbGoogleReminder.Enabled = false;\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.UserControl.Load\" /> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\" /> that contains the event data.</param>\n        protected override async void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            await RequestGoogleCalendarAuthentication(true);\n        }\n\n        /// <summary>\n        /// Sets the external calendar.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        internal void SetExternalCalendar(SerializableSettings settings)\n        {\n            // Google calendar reminder method\n            cbGoogleReminder.Items.Clear();\n            cbGoogleReminder.Items.AddRange(GoogleCalendarEvent.ReminderMethods.ToArray());\n\n            rbMSOutlook.Checked = settings.Calendar.Provider == CalendarProvider.Outlook &&\n                                  ExternalCalendar.OutlookInstalled;\n            rbGoogle.Checked = !rbMSOutlook.Checked;\n\n            rbDefaultCalendar.Checked = settings.Calendar.UseOutlookDefaultCalendar;\n            rbCustomCalendar.Checked = !rbDefaultCalendar.Checked;\n            tbOutlookCalendarPath.Text = settings.Calendar.OutlookCustomCalendarPath;\n\n            tbGoogleCalendarName.Text = settings.Calendar.GoogleCalendarName;\n            cbGoogleReminder.SelectedIndex = (int)settings.Calendar.GoogleEventReminder;\n            cbSetReminder.Checked = settings.Calendar.UseReminding;\n            tbReminder.Text = settings.Calendar.RemindingInterval.ToString(CultureConstants.\n                DefaultCulture);\n            cbUseAlterateReminder.Checked = settings.Calendar.UseAlternateReminding;\n            dtpEarlyReminder.Value = settings.Calendar.EarlyReminding;\n            dtpLateReminder.Value = settings.Calendar.LateReminding;\n            cbLastQueuedSkillOnly.Checked = settings.Calendar.LastQueuedSkillOnly;\n            \n            UpdateControlsVisibility();\n        }\n\n        /// <summary>\n        /// Applies the external calendar settings.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        internal void ApplyExternalCalendarSettings(SerializableSettings settings)\n        {\n            settings.Calendar.Provider = rbMSOutlook.Checked ? CalendarProvider.Outlook :\n                CalendarProvider.Google;\n\n            settings.Calendar.UseOutlookDefaultCalendar = rbDefaultCalendar.Checked;\n            settings.Calendar.OutlookCustomCalendarPath = tbOutlookCalendarPath.Text.Trim();\n\n            settings.Calendar.GoogleEventReminder = cbGoogleReminder.SelectedIndex != -1\n                ? (GoogleCalendarReminder)cbGoogleReminder.SelectedIndex\n                : GoogleCalendarReminder.Email;\n            settings.Calendar.GoogleCalendarName = tbGoogleCalendarName.Text;\n\n            settings.Calendar.UseReminding = cbSetReminder.Checked;\n            int interval;\n            if (int.TryParse(tbReminder.Text, out interval) && interval > 0)\n                settings.Calendar.RemindingInterval = interval;\n            settings.Calendar.UseAlternateReminding = cbUseAlterateReminder.Checked;\n            settings.Calendar.EarlyReminding = dtpEarlyReminder.Value;\n            settings.Calendar.LateReminding = dtpLateReminder.Value;\n            settings.Calendar.LastQueuedSkillOnly = cbLastQueuedSkillOnly.Checked;\n        }\n\n\n        #region Helper Methods\n        \n        /// <summary>\n        /// Updates the controls visibility.\n        /// </summary>\n        private void UpdateControlsVisibility()\n        {\n            rbMSOutlook.Enabled = Enabled && ExternalCalendar.OutlookInstalled;\n            gbMSOutlook.Visible = rbMSOutlook.Checked;\n            gbGoogle.Visible = rbGoogle.Checked;\n            calendarPathLabel.Enabled = tbOutlookCalendarPath.Enabled = rbCustomCalendar.Checked;\n            calendarPathExampleLabel.Visible = rbCustomCalendar.Checked;\n            cbSetReminder.Enabled = lblMinutes.Enabled = !cbUseAlterateReminder.Checked;\n            tbReminder.Enabled = cbSetReminder.Checked;\n            cbUseAlterateReminder.Enabled = lblEarlyReminder.Enabled = lblLateReminder.Enabled = !cbSetReminder.Checked;\n            dtpEarlyReminder.Enabled = cbUseAlterateReminder.Checked;\n            dtpLateReminder.Enabled = cbUseAlterateReminder.Checked;\n\n            if (rbCustomCalendar.Checked)\n                tbOutlookCalendarPath.Focus();\n        }\n\n        /// <summary>\n        /// Requests the Google calendar authentication.\n        /// </summary>\n        /// <param name=\"checkAuth\">if set to <c>true</c> [check authentication].</param>\n        private async Task RequestGoogleCalendarAuthentication(bool checkAuth = false)\n        {\n            if (!Enabled || !rbGoogle.Checked)\n                return;\n\n            apiResponseLabel.ResetText();\n            apiResponseLabel.ResetForeColor();\n\n            if (checkAuth && !GoogleCalendarEvent.HasCredentialsStored())\n                return;\n\n            throbber.State = ThrobberState.Rotating;\n            throbber.Visible = true;\n\n            SerializableAPIResult<SerializableAPICredentials> result = await GoogleCalendarEvent.RequestAuth(checkAuth);\n\n            throbber.State = ThrobberState.Stopped;\n            throbber.Visible = false;\n\n            btnRequestAuth.Enabled = result.HasError;\n            btnRevokeAuth.Enabled = tbGoogleCalendarName.Enabled = cbGoogleReminder.Enabled = !result.HasError;\n\n            apiResponseLabel.ForeColor = result.HasError ? Color.Red : Color.Green;\n            apiResponseLabel.Text = result.HasError ? result.Error.ErrorCode ?? result.Error.ErrorMessage : @\"Authenticated\";\n        }\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// This handler occurs when the radio buttons check changes.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnMustEnableOrDisable(object sender, EventArgs e)\n        {\n            UpdateControlsVisibility();\n        }\n\n        /// <summary>\n        /// Handles the EnabledChanged event of the ExternalCalendarControl control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private async void ExternalCalendarControl_EnabledChanged(object sender, EventArgs e)\n        {\n            if (Enabled)\n            {\n                UpdateControlsVisibility();\n                await RequestGoogleCalendarAuthentication(true);\n            }\n        }\n\n        /// <summary>\n        /// Outlook custom calendar path validation.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void tbCalendarPath_Validating(object sender, CancelEventArgs e)\n        {\n            var badChars = Path.GetInvalidPathChars();\n            e.Cancel = Enabled && rbMSOutlook.Checked && rbCustomCalendar.Checked &&\n                (tbOutlookCalendarPath.Text.Any(x => badChars.Contains(x)) ||\n                string.IsNullOrWhiteSpace(tbOutlookCalendarPath.Text) ||\n                !ExternalCalendar.OutlookCalendarExist(rbDefaultCalendar.Checked,\n                tbOutlookCalendarPath.Text));\n            if (e.Cancel)\n                MessageBox.Show(Properties.Resources.ErrorNoCalendar, @\"MS Outlook\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Error);\n        }\n\n        /// <summary>\n        /// Reminder value validation.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void tbReminder_Validating(object sender, CancelEventArgs e)\n        {\n            int value;\n            e.Cancel = !int.TryParse(tbReminder.Text, out value) && value > 0;\n            if (e.Cancel)\n                MessageBox.Show(Properties.Resources.ErrorBadReminder, @\"Reminder Interval\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Error);\n        }\n\n        /// <summary>\n        /// Occurs when clicking on Google radio button control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private async void rbGoogle_CheckedChanged(object sender, EventArgs e)\n        {\n            UpdateControlsVisibility();\n            await RequestGoogleCalendarAuthentication(true);\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnRequestAuth control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private async void btnRequestAuth_Click(object sender, EventArgs e)\n        {\n            await RequestGoogleCalendarAuthentication();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnRevokeAuth control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private async void btnRevokeAuth_Click(object sender, EventArgs e)\n        {\n            apiResponseLabel.ResetText();\n            apiResponseLabel.ResetForeColor();\n\n            throbber.State = ThrobberState.Rotating;\n            throbber.Visible = true;\n\n            var result = await GoogleCalendarEvent.RevokeAuth();\n\n            throbber.State = ThrobberState.Stopped;\n            throbber.Visible = false;\n\n            bool error = result.HasError;\n            btnRequestAuth.Enabled = !error;\n            btnRevokeAuth.Enabled = tbGoogleCalendarName.Enabled = cbGoogleReminder.Enabled =\n                error;\n            if (error)\n            {\n                apiResponseLabel.ForeColor = Color.Red;\n                apiResponseLabel.Text = result.Error.ErrorMessage;\n            }\n        }\n\n        /// <summary>\n        /// Occurs when clicking on the calendarIDLinkLabel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"LinkLabelLinkClickedEventArgs\"/> instance containing the event data.</param>\n        private void calendarIDLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            Util.OpenURL(new Uri(NetworkConstants.GoogleCalendarSetup));\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/ExternalCalendarControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"calendarPathExampleLabel.Text\" xml:space=\"preserve\">\n    <value>Tip: To find the path of the calendar, open Outlook, switch to 'Calendar' view (Ctrl+2), \nin 'My Calendars' right click on the calendar in question and select 'Properties'. \nCombine the 'Location:' path with the calendar name, separated by a left backslash.\ne.g. {\\\\Location}\\{Calendar name}</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SettingsUI/NotificationsControl.Designer.cs",
    "content": "﻿namespace EVEMon.SettingsUI\n{\n    partial class NotificationsControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.labelBehaviour = new System.Windows.Forms.Label();\n            this.labelNotification = new System.Windows.Forms.Label();\n            this.labelMainWindow = new System.Windows.Forms.Label();\n            this.SuspendLayout();\n            // \n            // labelBehaviour\n            // \n            this.labelBehaviour.Location = new System.Drawing.Point(154, 0);\n            this.labelBehaviour.Name = \"labelBehaviour\";\n            this.labelBehaviour.Size = new System.Drawing.Size(131, 18);\n            this.labelBehaviour.TabIndex = 2;\n            this.labelBehaviour.Text = \"System Tray Tooltip\";\n            this.labelBehaviour.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n            // \n            // labelNotification\n            // \n            this.labelNotification.Location = new System.Drawing.Point(0, 0);\n            this.labelNotification.Name = \"labelNotification\";\n            this.labelNotification.Size = new System.Drawing.Size(136, 18);\n            this.labelNotification.TabIndex = 3;\n            this.labelNotification.Text = \"Notification\";\n            this.labelNotification.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n            // \n            // labelMainWindow\n            // \n            this.labelMainWindow.Location = new System.Drawing.Point(307, 0);\n            this.labelMainWindow.Name = \"labelMainWindow\";\n            this.labelMainWindow.Size = new System.Drawing.Size(89, 18);\n            this.labelMainWindow.TabIndex = 4;\n            this.labelMainWindow.Text = \"Main Window\";\n            this.labelMainWindow.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n            // \n            // NotificationsControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoScroll = true;\n            this.Controls.Add(this.labelBehaviour);\n            this.Controls.Add(this.labelMainWindow);\n            this.Controls.Add(this.labelNotification);\n            this.Name = \"NotificationsControl\";\n            this.Size = new System.Drawing.Size(416, 404);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label labelBehaviour;\n        private System.Windows.Forms.Label labelNotification;\n        private System.Windows.Forms.Label labelMainWindow;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/NotificationsControl.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Notifications;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.SettingsUI\n{\n    public partial class NotificationsControl : UserControl\n    {\n        // Would have love to use tableLayoutPanel, unfortunately, they are just a piece of trash.\n        private const int RowHeight = 28;\n\n        private readonly List<ComboBox> m_combos = new List<ComboBox>();\n        private readonly List<CheckBox> m_checkboxes = new List<CheckBox>();\n        private NotificationSettings m_settings;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        public NotificationsControl()\n        {\n            InitializeComponent();\n            labelBehaviour.Font = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            labelNotification.Font = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            labelMainWindow.Font = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n\n            PopulateControl();\n        }\n\n        /// <summary>\n        /// Gets or sets the settings to edit (should be a copy of the actual settings).\n        /// </summary>\n        [Browsable(false)]\n        public NotificationSettings Settings\n        {\n            get { return m_settings; }\n            set\n            {\n                if (value == null)\n                    return;\n\n                m_settings = value;\n\n                foreach (ComboBox combo in m_combos)\n                {\n                    NotificationCategory cat = (NotificationCategory)combo.Tag;\n                    int index = (int)m_settings.Categories[cat].ToolTipBehaviour;\n                    combo.SelectedIndex = index;\n                }\n\n                foreach (CheckBox checkbox in m_checkboxes)\n                {\n                    NotificationCategory cat = (NotificationCategory)checkbox.Tag;\n                    checkbox.Checked = m_settings.Categories[cat].ShowOnMainWindow;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets the categories.\n        /// </summary>\n        /// <returns></returns>\n        private static IEnumerable<NotificationCategory> Categories\n            => Enum.GetValues(typeof(NotificationCategory)).Cast<NotificationCategory>()\n                .Where(x => EveMonClient.IsDebugBuild || x != NotificationCategory.TestNofitication)\n                .Where(x => x.HasHeader());\n\n        /// <summary>\n        /// When the selected index changes, we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void combo_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            ComboBox combo = (ComboBox)sender;\n            NotificationCategory cat = (NotificationCategory)combo.Tag;\n            m_settings.Categories[cat].ToolTipBehaviour = (ToolTipNotificationBehaviour)combo.SelectedIndex;\n        }\n\n        /// <summary>\n        /// When the selected checkbox check state changes, we update the settings.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void checkbox_CheckedChanged(object sender, EventArgs e)\n        {\n            CheckBox checkbox = (CheckBox)sender;\n            NotificationCategory cat = (NotificationCategory)checkbox.Tag;\n            m_settings.Categories[cat].ShowOnMainWindow = checkbox.Checked;\n        }\n\n        /// <summary>\n        /// Populates the control.\n        /// </summary>\n        private void PopulateControl()\n        {\n            int height = RowHeight;\n\n            // Add the controls for every member of the enumeration\n            foreach (NotificationCategory cat in Categories)\n            {\n                // Add the label\n                AddLabel(height, cat);\n\n                // Add the \"system tray tooltip\" combo box\n                AddComboBox(height, cat);\n\n                // Add the \"main window\" checkbox\n                AddCheckBox(height, cat);\n\n                // Updates the row ordinate\n                height += RowHeight;\n            }\n\n            Height = height;\n        }\n\n        /// <summary>\n        /// Adds the check box.\n        /// </summary>\n        /// <param name=\"height\">The height.</param>\n        /// <param name=\"cat\">The cat.</param>\n        private void AddCheckBox(int height, NotificationCategory cat)\n        {\n            CheckBox tempCheckbox = null;\n            try\n            {\n                tempCheckbox = new CheckBox();\n                tempCheckbox.CheckedChanged += checkbox_CheckedChanged;\n                tempCheckbox.Tag = cat;\n                tempCheckbox.Text = \"Show\";\n                tempCheckbox.Margin = new Padding(3);\n                tempCheckbox.Height = RowHeight - 4;\n                tempCheckbox.Width = labelMainWindow.Width;\n                tempCheckbox.Location = new Point(labelMainWindow.Location.X + 15, height + 2);\n\n                CheckBox checkbox = tempCheckbox;\n                tempCheckbox = null;\n\n                Controls.Add(checkbox);\n                m_checkboxes.Add(checkbox);\n            }\n            finally\n            {\n                tempCheckbox?.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Adds the combo box.\n        /// </summary>\n        /// <param name=\"height\">The height.</param>\n        /// <param name=\"cat\">The cat.</param>\n        private void AddComboBox(int height, NotificationCategory cat)\n        {\n            ComboBox tempCombo = null;\n            try\n            {\n                tempCombo = new ComboBox();\n                tempCombo.Items.AddRange(new object[] { \"Never\", \"Once\", \"Repeat until clicked\" });\n                tempCombo.Tag = cat;\n                tempCombo.SelectedIndex = 0;\n                tempCombo.Margin = new Padding(3);\n                tempCombo.Height = RowHeight - 4;\n                tempCombo.Width = labelBehaviour.Width;\n                tempCombo.DropDownStyle = ComboBoxStyle.DropDownList;\n                tempCombo.Location = new Point(labelBehaviour.Location.X, height + 2);\n                tempCombo.SelectedIndexChanged += combo_SelectedIndexChanged;\n\n                ComboBox combo = tempCombo;\n                tempCombo = null;\n\n                Controls.Add(combo);\n                m_combos.Add(combo);\n            }\n            finally\n            {\n                tempCombo?.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Adds the label.\n        /// </summary>\n        /// <param name=\"height\">The height.</param>\n        /// <param name=\"cat\">The cat.</param>\n        private void AddLabel(int height, NotificationCategory cat)\n        {\n            Label tempLabel = null;\n            try\n            {\n                tempLabel = new Label();\n                tempLabel.AutoSize = false;\n                tempLabel.Text = cat.GetHeader();\n                tempLabel.TextAlign = ContentAlignment.MiddleLeft;\n                tempLabel.Location = new Point(labelNotification.Location.X, height);\n                tempLabel.Width = labelBehaviour.Location.X - 3;\n                tempLabel.Height = RowHeight;\n\n                Label label = tempLabel;\n                tempLabel = null;\n\n                Controls.Add(label);\n            }\n            finally\n            {\n                tempLabel?.Dispose();\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/SettingsUI/NotificationsControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SettingsUI/PortableEveClientsControl.Designer.cs",
    "content": "﻿namespace EVEMon.SettingsUI\n{\n    partial class PortableEveClientsControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PortableEveClientsControl));\n            this.EveInstallationPathTextBox = new System.Windows.Forms.TextBox();\n            this.BrowseButton = new System.Windows.Forms.Button();\n            this.DeletePictureBox = new System.Windows.Forms.PictureBox();\n            ((System.ComponentModel.ISupportInitialize)(this.DeletePictureBox)).BeginInit();\n            this.SuspendLayout();\n            // \n            // EveInstallationPathTextBox\n            // \n            this.EveInstallationPathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.EveInstallationPathTextBox.Location = new System.Drawing.Point(33, 5);\n            this.EveInstallationPathTextBox.Name = \"EveInstallationPathTextBox\";\n            this.EveInstallationPathTextBox.ReadOnly = true;\n            this.EveInstallationPathTextBox.Size = new System.Drawing.Size(292, 20);\n            this.EveInstallationPathTextBox.TabIndex = 0;\n            // \n            // BrowseButton\n            // \n            this.BrowseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.BrowseButton.Location = new System.Drawing.Point(331, 3);\n            this.BrowseButton.Name = \"BrowseButton\";\n            this.BrowseButton.Size = new System.Drawing.Size(75, 23);\n            this.BrowseButton.TabIndex = 1;\n            this.BrowseButton.Text = \"Browse\";\n            this.BrowseButton.UseVisualStyleBackColor = true;\n            this.BrowseButton.Click += new System.EventHandler(this.BrowseButton_Click);\n            // \n            // DeletePictureBox\n            // \n            this.DeletePictureBox.Image = ((System.Drawing.Image)(resources.GetObject(\"DeletePictureBox.Image\")));\n            this.DeletePictureBox.Location = new System.Drawing.Point(11, 6);\n            this.DeletePictureBox.Name = \"DeletePictureBox\";\n            this.DeletePictureBox.Size = new System.Drawing.Size(16, 16);\n            this.DeletePictureBox.TabIndex = 2;\n            this.DeletePictureBox.TabStop = false;\n            this.DeletePictureBox.Click += new System.EventHandler(this.DeletePictureBox_Click);\n            // \n            // PortableEveClientsControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.EveInstallationPathTextBox);\n            this.Controls.Add(this.DeletePictureBox);\n            this.Controls.Add(this.BrowseButton);\n            this.Name = \"PortableEveClientsControl\";\n            this.Size = new System.Drawing.Size(417, 29);\n            ((System.ComponentModel.ISupportInitialize)(this.DeletePictureBox)).EndInit();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TextBox EveInstallationPathTextBox;\n        private System.Windows.Forms.Button BrowseButton;\n        private System.Windows.Forms.PictureBox DeletePictureBox;\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/PortableEveClientsControl.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.SettingsUI\n{\n    public partial class PortableEveClientsControl : UserControl\n    {\n        private const int RowHeight = 29;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PortableEveClientsControl\"/> class.\n        /// </summary>\n        public PortableEveClientsControl()\n        {\n            InitializeComponent();\n            LayoutControls();\n        }\n\n        #endregion\n\n\n        #region Controls Layout\n\n        /// <summary>\n        /// Layouts the controls.\n        /// </summary>\n        private void LayoutControls()\n        {\n            SuspendLayout();\n            try\n            {\n                Controls.Clear();\n\n                int height = 0;\n\n                // Add the controls for every member of the enumeration\n                foreach (SerializablePortableEveInstallation installation in Settings.PortableEveInstallations.EVEClients)\n                {\n                    // Add the \"Delete\" icon\n                    AddIcon(height);\n\n                    // Add the installation path text box\n                    AddTextBox(installation, height);\n\n                    // Add the \"Browse\" button\n                    AddButton(height);\n\n                    // Updates the row ordinate\n                    height += RowHeight;\n                }\n\n                // Add the initial controls at the last row\n                AddInitControls(height);\n\n                height += RowHeight;\n\n                Height = height;\n            }\n            finally\n            {\n                ResumeLayout(false);\n                PerformLayout();\n            }\n        }\n\n        /// <summary>\n        /// Adds the initial controls.\n        /// </summary>\n        /// <param name=\"height\">The height.</param>\n        private void AddInitControls(int height)\n        {\n            Controls.Add(DeletePictureBox);\n            Controls.Add(EveInstallationPathTextBox);\n            Controls.Add(BrowseButton);\n\n            DeletePictureBox.Enabled = false;\n            DeletePictureBox.Location = new Point(DeletePictureBox.Location.X,\n                                                  height + (RowHeight - DeletePictureBox.Size.Height) / 2);\n            EveInstallationPathTextBox.Text = string.Empty;\n            int offset = (int)Math.Ceiling((double)(RowHeight - EveInstallationPathTextBox.Size.Height) / 2);\n            EveInstallationPathTextBox.Location = new Point(EveInstallationPathTextBox.Location.X, height + offset);\n            BrowseButton.Location = new Point(BrowseButton.Location.X, height + (RowHeight - BrowseButton.Size.Height) / 2);\n        }\n\n        /// <summary>\n        /// Adds the button.\n        /// </summary>\n        /// <param name=\"height\">The height.</param>\n        private void AddButton(int height)\n        {\n            Button tempButton = null;\n            try\n            {\n                tempButton = new Button();\n                tempButton.Location = new Point(BrowseButton.Location.X, height + (RowHeight - BrowseButton.Size.Height) / 2);\n                tempButton.Text = BrowseButton.Text;\n                tempButton.Anchor = BrowseButton.Anchor;\n                tempButton.UseVisualStyleBackColor = BrowseButton.UseVisualStyleBackColor;\n                tempButton.Size = BrowseButton.Size;\n                tempButton.Click += BrowseButton_Click;\n\n                Button button = tempButton;\n                tempButton = null;\n\n                Controls.Add(button);\n            }\n            finally\n            {\n                tempButton?.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Adds the text box.\n        /// </summary>\n        /// <param name=\"installation\">The installation.</param>\n        /// <param name=\"height\">The height.</param>\n        private void AddTextBox(SerializablePortableEveInstallation installation, int height)\n        {\n            TextBox tempTextBox = null;\n            try\n            {\n                tempTextBox = new TextBox();\n                int offset = (int)Math.Ceiling((double)(RowHeight - EveInstallationPathTextBox.Size.Height) / 2);\n                tempTextBox.Location = new Point(EveInstallationPathTextBox.Location.X, height + offset);\n                tempTextBox.Text = installation.Path;\n                tempTextBox.Anchor = EveInstallationPathTextBox.Anchor;\n                tempTextBox.ReadOnly = EveInstallationPathTextBox.ReadOnly;\n                tempTextBox.Size = EveInstallationPathTextBox.Size;\n\n                TextBox textbox = tempTextBox;\n                tempTextBox = null;\n\n                Controls.Add(textbox);\n            }\n            finally\n            {\n                tempTextBox?.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Adds the icon.\n        /// </summary>\n        /// <param name=\"height\">The height.</param>\n        private void AddIcon(int height)\n        {\n            PictureBox tempPicture = null;\n            try\n            {\n                tempPicture = new PictureBox();\n                tempPicture.Location = new Point(DeletePictureBox.Location.X,\n                                                 height + (RowHeight - DeletePictureBox.Size.Height) / 2);\n                tempPicture.Image = DeletePictureBox.Image;\n                tempPicture.Size = DeletePictureBox.Size;\n                tempPicture.Click += DeletePictureBox_Click;\n\n                PictureBox picture = tempPicture;\n                tempPicture = null;\n\n                Controls.Add(picture);\n            }\n            finally\n            {\n                tempPicture?.Dispose();\n            }\n        }\n\n        #endregion\n\n\n        #region Exporatation to Settings\n\n        /// <summary>\n        /// Exports to settings.\n        /// </summary>\n        private void ExportToSettings()\n        {\n            Settings.PortableEveInstallations.EVEClients.Clear();\n            Settings.PortableEveInstallations.EVEClients.AddRange(\n                Controls.OfType<TextBox>().Where(textBox => !string.IsNullOrEmpty(textBox.Text)).Select(\n                    textBox => new SerializablePortableEveInstallation\n                                   {\n                                       Path = textBox.Text\n                                   }));\n        }\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Handles the Click event of the BrowseButton control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void BrowseButton_Click(object sender, EventArgs e)\n        {\n            using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog())\n            {\n                if (folderBrowserDialog.ShowDialog() != DialogResult.OK)\n                    return;\n\n                // Quit iff the selected path already exist in another control \n                if (\n                    Settings.PortableEveInstallations.EVEClients.Any(\n                        eveClient => eveClient.Path == folderBrowserDialog.SelectedPath))\n                    return;\n\n                TextBox textbox = Controls.OfType<TextBox>().ElementAt(Controls.OfType<Button>().IndexOf((Button)sender));\n                textbox.Text = folderBrowserDialog.SelectedPath;\n\n                ExportToSettings();\n                LayoutControls();\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the DeletePictureBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void DeletePictureBox_Click(object sender, EventArgs e)\n        {\n            PictureBox icon = (PictureBox)sender;\n            int index = Controls.OfType<PictureBox>().IndexOf(icon);\n\n            // Remove and dispose the controls\n            TextBox textbox = Controls.OfType<TextBox>().ElementAt(index);\n            Button button = Controls.OfType<Button>().ElementAt(index);\n            Controls.Remove(icon);\n            Controls.Remove(textbox);\n            Controls.Remove(button);\n            icon.Dispose();\n            textbox.Dispose();\n            button.Click -= BrowseButton_Click;\n            button.Dispose();\n\n            ExportToSettings();\n            LayoutControls();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/PortableEveClientsControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"DeletePictureBox.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m\n        dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAI0SURBVDhPlZPtT1JhGMZdW9tZf0NFuZrLk9Ncb6aA\n        R0WIadqmvAvCIVETEDiDocSqD7X1l/R3aVbGm5Ec4PAcrm4w0LNjH/zwbM92nut33/d13WcAwMBVTmNd\n        vHHxvVYsZQyQMvz/gI1AiK971+I1h9vUe3MO6Igze2ins1DjSR2k4Q/yjWAYzc1t/Hm98rW6uPSgAzkD\n        /BMj/wFtOmpCQmtrpw+pr63zVB2taBzI5dG5n1jt8fKM5doZIJXm2glJbe+9Az5/gZrNdQBoBkW+7gvw\n        VB3KTgyg7/VAECfzL1lZmLt+3gFB1FiCY29jTJUywMdPYKk0GqEwqDqU7SiQ3e/eKxYbiWc5vQcEaUW2\n        uKa4wVrRXSD/HtjPkzAHZLKo+/yozFlZeXqmL9Z00CNSu5zsWVORpXG8fsDlBaQ0KrPzasksaMSXAmS3\n        rxMVQGnA4QZWnMBukua2oTAxpUtHsweyy8vLHh+UcARISiRMATEahwysrzpRNprxc2xcA+kDak4PL7u9\n        UMQNgGKUXR6QWaw4ZVJPF5eByCZqr5ZRePwUR0PDfUgXQJvFU3UooTdUNQGZWiezWHHSxBWeTXDH409Y\n        1WIFQiJObXYcj4zi8M5gF9IF0GYJNYcLSlCEvOoCmcWKL4x9w36MjHHfhx+y32YBsn0Bv0Yf4eCWQdCY\n        SJslVBeWUDJNq2SWzu2j+0Pct8F77KJYl0LJaBYKzyd14l7Eh4a73MHN293Kly7SVX7r3tu/crukx3Z3\n        qzUAAAAASUVORK5CYII=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SettingsUI/ProxyAuthenticationWindow.Designer.cs",
    "content": "namespace EVEMon.SettingsUI\n{\n    partial class ProxyAuthenticationWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.verticalFlowPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.groupBox1 = new System.Windows.Forms.GroupBox();\n            this.verticalFlowPanel2 = new System.Windows.Forms.FlowLayoutPanel();\n            this.rbNoAuth = new System.Windows.Forms.RadioButton();\n            this.rbSystemDefault = new System.Windows.Forms.RadioButton();\n            this.rbSuppliedAuth = new System.Windows.Forms.RadioButton();\n            this.tlpSpecifiedAuth = new System.Windows.Forms.TableLayoutPanel();\n            this.label1 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.tbUsername = new System.Windows.Forms.TextBox();\n            this.tbPassword = new System.Windows.Forms.TextBox();\n            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnOk = new System.Windows.Forms.Button();\n            this.verticalFlowPanel1.SuspendLayout();\n            this.groupBox1.SuspendLayout();\n            this.verticalFlowPanel2.SuspendLayout();\n            this.tlpSpecifiedAuth.SuspendLayout();\n            this.flowLayoutPanel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // verticalFlowPanel1\n            // \n            this.verticalFlowPanel1.AutoSize = true;\n            this.verticalFlowPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.verticalFlowPanel1.Controls.Add(this.groupBox1);\n            this.verticalFlowPanel1.Controls.Add(this.flowLayoutPanel1);\n            this.verticalFlowPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.verticalFlowPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.verticalFlowPanel1.Location = new System.Drawing.Point(0, 0);\n            this.verticalFlowPanel1.Name = \"verticalFlowPanel1\";\n            this.verticalFlowPanel1.Padding = new System.Windows.Forms.Padding(12);\n            this.verticalFlowPanel1.Size = new System.Drawing.Size(299, 216);\n            this.verticalFlowPanel1.TabIndex = 0;\n            // \n            // groupBox1\n            // \n            this.groupBox1.AutoSize = true;\n            this.groupBox1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.groupBox1.Controls.Add(this.verticalFlowPanel2);\n            this.groupBox1.Location = new System.Drawing.Point(15, 15);\n            this.groupBox1.Name = \"groupBox1\";\n            this.groupBox1.Size = new System.Drawing.Size(267, 149);\n            this.groupBox1.TabIndex = 0;\n            this.groupBox1.TabStop = false;\n            this.groupBox1.Text = \"Authentication Settings\";\n            // \n            // verticalFlowPanel2\n            // \n            this.verticalFlowPanel2.AutoSize = true;\n            this.verticalFlowPanel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.verticalFlowPanel2.Controls.Add(this.rbNoAuth);\n            this.verticalFlowPanel2.Controls.Add(this.rbSystemDefault);\n            this.verticalFlowPanel2.Controls.Add(this.rbSuppliedAuth);\n            this.verticalFlowPanel2.Controls.Add(this.tlpSpecifiedAuth);\n            this.verticalFlowPanel2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.verticalFlowPanel2.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.verticalFlowPanel2.Location = new System.Drawing.Point(3, 17);\n            this.verticalFlowPanel2.Name = \"verticalFlowPanel2\";\n            this.verticalFlowPanel2.Padding = new System.Windows.Forms.Padding(10, 0, 10, 0);\n            this.verticalFlowPanel2.Size = new System.Drawing.Size(261, 129);\n            this.verticalFlowPanel2.TabIndex = 0;\n            // \n            // rbNoAuth\n            // \n            this.rbNoAuth.AutoSize = true;\n            this.rbNoAuth.Checked = true;\n            this.rbNoAuth.Location = new System.Drawing.Point(13, 3);\n            this.rbNoAuth.Name = \"rbNoAuth\";\n            this.rbNoAuth.Size = new System.Drawing.Size(111, 17);\n            this.rbNoAuth.TabIndex = 0;\n            this.rbNoAuth.TabStop = true;\n            this.rbNoAuth.Text = \"No Authentication\";\n            this.rbNoAuth.UseVisualStyleBackColor = true;\n            // \n            // rbSystemDefault\n            // \n            this.rbSystemDefault.AutoSize = true;\n            this.rbSystemDefault.Location = new System.Drawing.Point(13, 26);\n            this.rbSystemDefault.Name = \"rbSystemDefault\";\n            this.rbSystemDefault.Size = new System.Drawing.Size(235, 17);\n            this.rbSystemDefault.TabIndex = 1;\n            this.rbSystemDefault.Text = \"System Default Authentication (e.g., NTLM)\";\n            this.rbSystemDefault.UseVisualStyleBackColor = true;\n            // \n            // rbSuppliedAuth\n            // \n            this.rbSuppliedAuth.AutoSize = true;\n            this.rbSuppliedAuth.Location = new System.Drawing.Point(13, 49);\n            this.rbSuppliedAuth.Name = \"rbSuppliedAuth\";\n            this.rbSuppliedAuth.Size = new System.Drawing.Size(147, 17);\n            this.rbSuppliedAuth.TabIndex = 2;\n            this.rbSuppliedAuth.Text = \"Use Supplied Credentials:\";\n            this.rbSuppliedAuth.UseVisualStyleBackColor = true;\n            this.rbSuppliedAuth.CheckedChanged += new System.EventHandler(this.rbSuppliedAuth_CheckedChanged);\n            // \n            // tlpSpecifiedAuth\n            // \n            this.tlpSpecifiedAuth.AutoSize = true;\n            this.tlpSpecifiedAuth.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.tlpSpecifiedAuth.ColumnCount = 2;\n            this.tlpSpecifiedAuth.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tlpSpecifiedAuth.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tlpSpecifiedAuth.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tlpSpecifiedAuth.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tlpSpecifiedAuth.Controls.Add(this.label1, 0, 0);\n            this.tlpSpecifiedAuth.Controls.Add(this.label2, 0, 1);\n            this.tlpSpecifiedAuth.Controls.Add(this.tbUsername, 1, 0);\n            this.tlpSpecifiedAuth.Controls.Add(this.tbPassword, 1, 1);\n            this.tlpSpecifiedAuth.Location = new System.Drawing.Point(13, 72);\n            this.tlpSpecifiedAuth.Name = \"tlpSpecifiedAuth\";\n            this.tlpSpecifiedAuth.Padding = new System.Windows.Forms.Padding(20, 0, 0, 0);\n            this.tlpSpecifiedAuth.RowCount = 2;\n            this.tlpSpecifiedAuth.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpSpecifiedAuth.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpSpecifiedAuth.Size = new System.Drawing.Size(209, 54);\n            this.tlpSpecifiedAuth.TabIndex = 3;\n            // \n            // label1\n            // \n            this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(23, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(59, 27);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"Username:\";\n            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // label2\n            // \n            this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(25, 27);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(57, 27);\n            this.label2.TabIndex = 1;\n            this.label2.Text = \"Password:\";\n            this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // tbUsername\n            // \n            this.tbUsername.Location = new System.Drawing.Point(88, 3);\n            this.tbUsername.Name = \"tbUsername\";\n            this.tbUsername.Size = new System.Drawing.Size(118, 21);\n            this.tbUsername.TabIndex = 2;\n            // \n            // tbPassword\n            // \n            this.tbPassword.Location = new System.Drawing.Point(88, 30);\n            this.tbPassword.Name = \"tbPassword\";\n            this.tbPassword.Size = new System.Drawing.Size(118, 21);\n            this.tbPassword.TabIndex = 3;\n            this.tbPassword.UseSystemPasswordChar = true;\n            // \n            // flowLayoutPanel1\n            // \n            this.flowLayoutPanel1.AutoSize = true;\n            this.flowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.flowLayoutPanel1.Controls.Add(this.btnCancel);\n            this.flowLayoutPanel1.Controls.Add(this.btnOk);\n            this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flowLayoutPanel1.Location = new System.Drawing.Point(12, 176);\n            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0, 9, 0, 0);\n            this.flowLayoutPanel1.Name = \"flowLayoutPanel1\";\n            this.flowLayoutPanel1.Size = new System.Drawing.Size(159, 26);\n            this.flowLayoutPanel1.TabIndex = 1;\n            this.flowLayoutPanel1.WrapContents = false;\n            // \n            // btnCancel\n            // \n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(81, 3);\n            this.btnCancel.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 1;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // btnOk\n            // \n            this.btnOk.Location = new System.Drawing.Point(3, 3);\n            this.btnOk.Margin = new System.Windows.Forms.Padding(3, 3, 0, 0);\n            this.btnOk.Name = \"btnOk\";\n            this.btnOk.Size = new System.Drawing.Size(75, 23);\n            this.btnOk.TabIndex = 2;\n            this.btnOk.Text = \"OK\";\n            this.btnOk.UseVisualStyleBackColor = true;\n            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);\n            // \n            // ProxyAuthenticationWindow\n            // \n            this.AcceptButton = this.btnCancel;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoSize = true;\n            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(299, 216);\n            this.Controls.Add(this.verticalFlowPanel1);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"ProxyAuthenticationWindow\";\n            this.ShowInTaskbar = false;\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Proxy Authentication\";\n            this.verticalFlowPanel1.ResumeLayout(false);\n            this.verticalFlowPanel1.PerformLayout();\n            this.groupBox1.ResumeLayout(false);\n            this.groupBox1.PerformLayout();\n            this.verticalFlowPanel2.ResumeLayout(false);\n            this.verticalFlowPanel2.PerformLayout();\n            this.tlpSpecifiedAuth.ResumeLayout(false);\n            this.tlpSpecifiedAuth.PerformLayout();\n            this.flowLayoutPanel1.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.FlowLayoutPanel verticalFlowPanel1;\n        private System.Windows.Forms.GroupBox groupBox1;\n        private System.Windows.Forms.FlowLayoutPanel verticalFlowPanel2;\n        private System.Windows.Forms.TableLayoutPanel tlpSpecifiedAuth;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.TextBox tbUsername;\n        private System.Windows.Forms.TextBox tbPassword;\n        private System.Windows.Forms.RadioButton rbSuppliedAuth;\n        private System.Windows.Forms.RadioButton rbSystemDefault;\n        private System.Windows.Forms.RadioButton rbNoAuth;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnOk;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/ProxyAuthenticationWindow.cs",
    "content": "using System;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.SettingsUI\n{\n    public partial class ProxyAuthenticationWindow : EVEMonForm\n    {\n        private readonly ProxySettings m_proxySetting;\n\n        private ProxyAuthenticationWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"settings\"></param>\n        public ProxyAuthenticationWindow(ProxySettings settings)\n            : this()\n        {\n            m_proxySetting = settings;\n            UpdateFields();\n        }\n\n        /// <summary>\n        /// Updates the fields.\n        /// </summary>\n        private void UpdateFields()\n        {\n            if (m_proxySetting == null)\n                return;\n\n            switch (m_proxySetting.Authentication)\n            {\n                case ProxyAuthentication.None:\n                    rbNoAuth.Checked = true;\n                    break;\n                case ProxyAuthentication.SystemDefault:\n                    rbSystemDefault.Checked = true;\n                    break;\n                case ProxyAuthentication.Specified:\n                    rbSuppliedAuth.Checked = true;\n                    break;\n            }\n\n            tlpSpecifiedAuth.Enabled = false;\n            tbUsername.Text = m_proxySetting.Username;\n            tbPassword.Text = Util.Decrypt(m_proxySetting.Password, m_proxySetting.Username);\n        }\n\n        /// <summary>\n        /// Handles the CheckedChanged event of the rbSuppliedAuth control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void rbSuppliedAuth_CheckedChanged(object sender, EventArgs e)\n        {\n            tlpSpecifiedAuth.Enabled = rbSuppliedAuth.Checked;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnCancel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Cancel;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnOk control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnOk_Click(object sender, EventArgs e)\n        {\n            if (rbNoAuth.Checked)\n                m_proxySetting.Authentication = ProxyAuthentication.None;\n            else if (rbSystemDefault.Checked)\n                m_proxySetting.Authentication = ProxyAuthentication.SystemDefault;\n            else if (rbSuppliedAuth.Checked)\n                m_proxySetting.Authentication = ProxyAuthentication.Specified;\n\n            m_proxySetting.Username = tbUsername.Text.Trim();\n            m_proxySetting.Password = Util.Encrypt(tbPassword.Text.Trim(), tbUsername.Text.Trim());\n\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/SettingsUI/ProxyAuthenticationWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SettingsUI/SettingsFileStorageControl.Designer.cs",
    "content": "﻿using EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.SettingsUI\n{\n    partial class SettingsFileStorageControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.alwaysDownloadCheckBox = new System.Windows.Forms.CheckBox();\n            this.alwaysUploadCheckBox = new System.Windows.Forms.CheckBox();\n            this.downloadSettingsFileButton = new System.Windows.Forms.Button();\n            this.uploadSettingsFileButton = new System.Windows.Forms.Button();\n            this.apiResponseLabel = new System.Windows.Forms.Label();\n            this.useImmediatelyCheckBox = new System.Windows.Forms.CheckBox();\n            this.throbber = new EVEMon.Common.Controls.Throbber();\n            ((System.ComponentModel.ISupportInitialize)(this.throbber)).BeginInit();\n            this.SuspendLayout();\n            // \n            // alwaysDownloadCheckBox\n            // \n            this.alwaysDownloadCheckBox.AutoSize = true;\n            this.alwaysDownloadCheckBox.Location = new System.Drawing.Point(166, 69);\n            this.alwaysDownloadCheckBox.Name = \"alwaysDownloadCheckBox\";\n            this.alwaysDownloadCheckBox.Size = new System.Drawing.Size(213, 17);\n            this.alwaysDownloadCheckBox.TabIndex = 7;\n            this.alwaysDownloadCheckBox.Text = \"Always download when EVEMon starts.\";\n            this.alwaysDownloadCheckBox.UseVisualStyleBackColor = true;\n            this.alwaysDownloadCheckBox.CheckedChanged += new System.EventHandler(this.alwaysDownloadCheckBox_CheckedChanged);\n            // \n            // alwaysUploadCheckBox\n            // \n            this.alwaysUploadCheckBox.AutoSize = true;\n            this.alwaysUploadCheckBox.Location = new System.Drawing.Point(166, 7);\n            this.alwaysUploadCheckBox.Name = \"alwaysUploadCheckBox\";\n            this.alwaysUploadCheckBox.Size = new System.Drawing.Size(208, 17);\n            this.alwaysUploadCheckBox.TabIndex = 6;\n            this.alwaysUploadCheckBox.Text = \"Always upload before EVEMon closes.\";\n            this.alwaysUploadCheckBox.UseVisualStyleBackColor = true;\n            this.alwaysUploadCheckBox.CheckedChanged += new System.EventHandler(this.alwaysUploadCheckBox_CheckedChanged);\n            // \n            // downloadSettingsFileButton\n            // \n            this.downloadSettingsFileButton.Location = new System.Drawing.Point(25, 65);\n            this.downloadSettingsFileButton.Name = \"downloadSettingsFileButton\";\n            this.downloadSettingsFileButton.Size = new System.Drawing.Size(122, 23);\n            this.downloadSettingsFileButton.TabIndex = 5;\n            this.downloadSettingsFileButton.Text = \"Download settings file\";\n            this.downloadSettingsFileButton.UseVisualStyleBackColor = true;\n            this.downloadSettingsFileButton.Click += new System.EventHandler(this.downloadSettingsFileButton_Click);\n            // \n            // uploadSettingsFileButton\n            // \n            this.uploadSettingsFileButton.Location = new System.Drawing.Point(25, 3);\n            this.uploadSettingsFileButton.Name = \"uploadSettingsFileButton\";\n            this.uploadSettingsFileButton.Size = new System.Drawing.Size(122, 23);\n            this.uploadSettingsFileButton.TabIndex = 4;\n            this.uploadSettingsFileButton.Text = \"Upload settings file\";\n            this.uploadSettingsFileButton.UseVisualStyleBackColor = true;\n            this.uploadSettingsFileButton.Click += new System.EventHandler(this.uploadSettingsFileButton_Click);\n            // \n            // apiResponseLabel\n            // \n            this.apiResponseLabel.Location = new System.Drawing.Point(0, 30);\n            this.apiResponseLabel.Name = \"apiResponseLabel\";\n            this.apiResponseLabel.Size = new System.Drawing.Size(405, 31);\n            this.apiResponseLabel.TabIndex = 8;\n            this.apiResponseLabel.Text = \"API Response\";\n            this.apiResponseLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // useImmediatelyCheckBox\n            // \n            this.useImmediatelyCheckBox.AutoSize = true;\n            this.useImmediatelyCheckBox.Location = new System.Drawing.Point(185, 89);\n            this.useImmediatelyCheckBox.Name = \"useImmediatelyCheckBox\";\n            this.useImmediatelyCheckBox.Size = new System.Drawing.Size(155, 17);\n            this.useImmediatelyCheckBox.TabIndex = 10;\n            this.useImmediatelyCheckBox.Text = \"Use immediately on startup.\";\n            this.useImmediatelyCheckBox.UseVisualStyleBackColor = true;\n            this.useImmediatelyCheckBox.CheckedChanged += new System.EventHandler(this.useImmediatelyCheckBox_CheckedChanged);\n            // \n            // throbber\n            // \n            this.throbber.Anchor = System.Windows.Forms.AnchorStyles.Top;\n            this.throbber.Location = new System.Drawing.Point(190, 33);\n            this.throbber.MaximumSize = new System.Drawing.Size(24, 24);\n            this.throbber.MinimumSize = new System.Drawing.Size(24, 24);\n            this.throbber.Name = \"throbber\";\n            this.throbber.Size = new System.Drawing.Size(24, 24);\n            this.throbber.State = EVEMon.Common.Enumerations.ThrobberState.Stopped;\n            this.throbber.TabIndex = 9;\n            this.throbber.TabStop = false;\n            // \n            // SettingsFileStorageControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.useImmediatelyCheckBox);\n            this.Controls.Add(this.apiResponseLabel);\n            this.Controls.Add(this.throbber);\n            this.Controls.Add(this.alwaysDownloadCheckBox);\n            this.Controls.Add(this.alwaysUploadCheckBox);\n            this.Controls.Add(this.downloadSettingsFileButton);\n            this.Controls.Add(this.uploadSettingsFileButton);\n            this.Name = \"SettingsFileStorageControl\";\n            this.Size = new System.Drawing.Size(405, 109);\n            this.Load += new System.EventHandler(this.SettingsFileStorageControl_Load);\n            ((System.ComponentModel.ISupportInitialize)(this.throbber)).EndInit();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.CheckBox alwaysDownloadCheckBox;\n        private System.Windows.Forms.CheckBox alwaysUploadCheckBox;\n        private System.Windows.Forms.Button downloadSettingsFileButton;\n        private System.Windows.Forms.Button uploadSettingsFileButton;\n        private System.Windows.Forms.Label apiResponseLabel;\n        private Throbber throbber;\n        private System.Windows.Forms.CheckBox useImmediatelyCheckBox;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/SettingsFileStorageControl.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.CloudStorageServices;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Factories;\n\nnamespace EVEMon.SettingsUI\n{\n    public partial class SettingsFileStorageControl : UserControl\n    {\n        private static bool s_queryPending;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SettingsFileStorageControl\"/> class.\n        /// </summary>\n        public SettingsFileStorageControl()\n        {\n            InitializeComponent();\n            apiResponseLabel.Font = FontFactory.GetFont(\"Tahoma\", FontStyle.Bold);\n            apiResponseLabel.Text = string.Empty;\n            throbber.Visible = false;\n            throbber.BringToFront();\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the provider.\n        /// </summary>\n        /// <value>\n        /// The provider.\n        /// </value>\n        [Browsable(false)]\n        private static CloudStorageServiceProvider Provider => Settings.CloudStorageServiceProvider.Provider;\n\n        #endregion\n\n\n        #region Local Events\n\n        /// <summary>\n        /// Occurs when the control loads.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void SettingsFileStorageControl_Load(object sender, EventArgs e)\n        {\n            Font = FontFactory.GetFont(\"Tahoma\");\n\n            CloudStorageServiceProvider.CredentialsChecked += CloudStorageServiceProvider_CredentialsChecked;\n            CloudStorageServiceProvider.SettingsReset += CloudStorageServiceProvider_SettingsReset;\n            CloudStorageServiceProvider.FileUploaded += CloudStorageServiceProvider_FileUploaded;\n            CloudStorageServiceProvider.FileDownloaded += CloudStorageServiceProvider_FileDownloaded;\n\n            Disposed += OnDisposed;\n\n            alwaysUploadCheckBox.Checked = CloudStorageServiceSettings.Default.UploadAlways;\n            alwaysDownloadCheckBox.Checked = CloudStorageServiceSettings.Default.DownloadAlways;\n            useImmediatelyCheckBox.Checked = CloudStorageServiceSettings.Default.UseImmediately;\n            useImmediatelyCheckBox.Enabled = alwaysDownloadCheckBox.Checked;\n            Enabled = false;\n        }\n\n        /// <summary>\n        /// Occurs when the control gets disposed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            CloudStorageServiceProvider.CredentialsChecked -= CloudStorageServiceProvider_CredentialsChecked;\n            CloudStorageServiceProvider.SettingsReset -= CloudStorageServiceProvider_SettingsReset;\n            CloudStorageServiceProvider.FileUploaded -= CloudStorageServiceProvider_FileUploaded;\n            CloudStorageServiceProvider.FileDownloaded -= CloudStorageServiceProvider_FileDownloaded;\n\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the control becomes visible again, we update the content.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (!Visible)\n                return;\n\n            ResetTextAndColor();\n\n            Enabled = Provider != null && Provider.HasCredentialsStored && CloudStorageServiceProvider.IsAuthenticated;\n        }\n\n        /// <summary>\n        /// Occurs when the checkbox state changes.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void alwaysUploadCheckBox_CheckedChanged(object sender, EventArgs e)\n        {\n            CloudStorageServiceSettings.Default.UploadAlways = alwaysUploadCheckBox.Checked;\n            CloudStorageServiceSettings.Default.Save();\n        }\n\n        /// <summary>\n        /// Occurs when the checkbox state changes.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void alwaysDownloadCheckBox_CheckedChanged(object sender, EventArgs e)\n        {\n            useImmediatelyCheckBox.Enabled = alwaysDownloadCheckBox.Checked;\n            CloudStorageServiceSettings.Default.DownloadAlways = alwaysDownloadCheckBox.Checked;\n            CloudStorageServiceSettings.Default.Save();\n        }\n\n        /// <summary>\n        /// Occurs when the checkbox state changes.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void useImmediatelyCheckBox_CheckedChanged(object sender, EventArgs e)\n        {\n            CloudStorageServiceSettings.Default.UseImmediately = useImmediatelyCheckBox.Checked;\n            CloudStorageServiceSettings.Default.Save();\n        }\n\n        /// <summary>\n        /// Occurs when clicking the \"Upload settings file\" button.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private async void uploadSettingsFileButton_Click(object sender, EventArgs e)\n        {\n            ResetTextAndColor();\n\n            if (s_queryPending)\n                return;\n\n            s_queryPending = true;\n            throbber.State = ThrobberState.Rotating;\n            throbber.Visible = true;\n\n            await Settings.SaveImmediateAsync();\n\n            Task uploadSettingsFileAsync = Provider?.UploadSettingsFileAsync();\n            if (uploadSettingsFileAsync != null)\n                await uploadSettingsFileAsync;\n        }\n\n        /// <summary>\n        /// Occurs when clicking the \"Download settings file\" button.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private async void downloadSettingsFileButton_Click(object sender, EventArgs e)\n        {\n            ResetTextAndColor();\n\n            if (s_queryPending)\n                return;\n\n            s_queryPending = true;\n            throbber.State = ThrobberState.Rotating;\n            throbber.Visible = true;\n\n            Task downloadSettingsFileAsync = Provider?.DownloadSettingsFileAsync();\n            if (downloadSettingsFileAsync != null)\n                await downloadSettingsFileAsync;\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Occurs when the cloud storage service provider credentials get authenticated.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void CloudStorageServiceProvider_CredentialsChecked(object sender, CloudStorageServiceProviderEventArgs e)\n        {\n            ResetTextAndColor();\n\n            Enabled = Provider != null && Provider.HasCredentialsStored && CloudStorageServiceProvider.IsAuthenticated;\n        }\n\n        /// <summary>\n        /// Occurs when the cloud storage service provider credentials get authenticated.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void CloudStorageServiceProvider_SettingsReset(object sender, CloudStorageServiceProviderEventArgs e)\n        {\n            ResetTextAndColor();\n\n            Enabled = Provider != null && Provider.HasCredentialsStored;\n        }\n\n        /// <summary>\n        /// Occurs when the file has been uploaded to the cloud storage service provider.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CloudStorageServiceProviderEventArgs\"/> instance containing the event data.</param>\n        private void CloudStorageServiceProvider_FileUploaded(object sender, CloudStorageServiceProviderEventArgs e)\n        {\n            s_queryPending = false;\n\n            throbber.State = ThrobberState.Stopped;\n            throbber.Visible = false;\n\n            apiResponseLabel.ForeColor = e.HasError ? Color.Red : Color.Green;\n            apiResponseLabel.Text = e.HasError ? e.ErrorMessage : @\"File uploaded successfully\";\n        }\n\n        /// <summary>\n        /// Occurs when the file has been dwloaded from the cloud storage service provider.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CloudStorageServiceProviderEventArgs\"/> instance containing the event data.</param>\n        private void CloudStorageServiceProvider_FileDownloaded(object sender, CloudStorageServiceProviderEventArgs e)\n        {\n            s_queryPending = false;\n\n            throbber.State = ThrobberState.Stopped;\n            throbber.Visible = false;\n\n            if (!e.HasError)\n                return;\n\n            apiResponseLabel.ForeColor = Color.Red;\n            apiResponseLabel.Text = e.ErrorMessage;\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n        \n        /// <summary>\n        /// Resets the color of the text and.\n        /// </summary>\n        private void ResetTextAndColor()\n        {\n            apiResponseLabel.ResetForeColor();\n            apiResponseLabel.ResetText();\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/SettingsUI/SettingsFileStorageControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SettingsUI/SettingsForm.Designer.cs",
    "content": "using System;\nusing EVEMon.Common.Controls.MultiPanel;\n\nnamespace EVEMon.SettingsUI\n{\n    partial class SettingsForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n\t\t\tthis.components = new System.ComponentModel.Container();\n\t\t\tSystem.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SettingsForm));\n\t\t\tSystem.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode(\"Updates\", 11, 11);\n\t\t\tSystem.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode(\"Network\", 7, 7);\n\t\t\tSystem.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode(\"Logitech Keyboards\", 4, 4);\n\t\t\tSystem.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode(\"Portable EVE Clients\", 15, 15);\n\t\t\tSystem.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode(\"Market Price Providers\", 16, 16);\n\t\t\tSystem.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode(\"General\", 10, 10, new System.Windows.Forms.TreeNode[] {\n            treeNode1,\n            treeNode2,\n            treeNode3,\n            treeNode4,\n            treeNode5});\n\t\t\tSystem.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode(\"Main Window\", 6, 6);\n\t\t\tSystem.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode(\"Icons\", 13, 13);\n\t\t\tSystem.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode(\"Messages\", 14, 14);\n\t\t\tSystem.Windows.Forms.TreeNode treeNode10 = new System.Windows.Forms.TreeNode(\"Skill Planner\", 8, 8, new System.Windows.Forms.TreeNode[] {\n            treeNode8,\n            treeNode9});\n\t\t\tSystem.Windows.Forms.TreeNode treeNode11 = new System.Windows.Forms.TreeNode(\"System Tray Icon\", 2, 2);\n\t\t\tSystem.Windows.Forms.TreeNode treeNode12 = new System.Windows.Forms.TreeNode(\"External Calendar\", 5, 5);\n\t\t\tSystem.Windows.Forms.TreeNode treeNode13 = new System.Windows.Forms.TreeNode(\"Scheduler\", 1, 1, new System.Windows.Forms.TreeNode[] {\n            treeNode12});\n\t\t\tSystem.Windows.Forms.TreeNode treeNode14 = new System.Windows.Forms.TreeNode(\"Skill Completion Mails\", 12, 12);\n\t\t\tSystem.Windows.Forms.TreeNode treeNode15 = new System.Windows.Forms.TreeNode(\"Notifications\", 9, 9, new System.Windows.Forms.TreeNode[] {\n            treeNode14});\n\t\t\tSystem.Windows.Forms.TreeNode treeNode16 = new System.Windows.Forms.TreeNode(\"Cloud Storage Service\", 17, 17);\n\t\t\tthis.systemTrayIconGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.rbSystemTrayOptionsNever = new System.Windows.Forms.RadioButton();\n\t\t\tthis.rbSystemTrayOptionsAlways = new System.Windows.Forms.RadioButton();\n\t\t\tthis.rbSystemTrayOptionsMinimized = new System.Windows.Forms.RadioButton();\n\t\t\tthis.bottomPanel = new System.Windows.Forms.Panel();\n\t\t\tthis.applyButton = new System.Windows.Forms.Button();\n\t\t\tthis.okButton = new System.Windows.Forms.Button();\n\t\t\tthis.cancelButton = new System.Windows.Forms.Button();\n\t\t\tthis.lblMainWindowPage = new System.Windows.Forms.Label();\n\t\t\tthis.lblSize = new System.Windows.Forms.Label();\n\t\t\tthis.CharacterMonitorGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.nudSkillQueueWarningThresholdDays = new System.Windows.Forms.NumericUpDown();\n\t\t\tthis.lblSkillQueueWarningThresholdDays = new System.Windows.Forms.Label();\n\t\t\tthis.lblSkillQueuWarningThreshold = new System.Windows.Forms.Label();\n\t\t\tthis.cbColorQueuedSkills = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbShowPrereqMetSkills = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbColorPartialSkills = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbAlwaysShowSkillQueueTime = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbShowNonPublicSkills = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbShowAllPublicSkills = new System.Windows.Forms.CheckBox();\n\t\t\tthis.WindowTitleGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.cbWindowsTitleList = new System.Windows.Forms.ComboBox();\n\t\t\tthis.cbSkillInTitle = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbTitleToTime = new System.Windows.Forms.CheckBox();\n\t\t\tthis.lblGeneralPage = new System.Windows.Forms.Label();\n\t\t\tthis.lblEnvironment = new System.Windows.Forms.Label();\n\t\t\tthis.lblSkillPlannerPage = new System.Windows.Forms.Label();\n\t\t\tthis.lblNetworkPageProxy = new System.Windows.Forms.Label();\n\t\t\tthis.lblProxyHostIPAddress = new System.Windows.Forms.Label();\n\t\t\tthis.lblProxyPort = new System.Windows.Forms.Label();\n\t\t\tthis.lblHTTP = new System.Windows.Forms.Label();\n\t\t\tthis.lblEmailNotificationPage = new System.Windows.Forms.Label();\n\t\t\tthis.lblNotificationsPage = new System.Windows.Forms.Label();\n\t\t\tthis.lblTrayIconPage = new System.Windows.Forms.Label();\n\t\t\tthis.lblSchedulerUIPage = new System.Windows.Forms.Label();\n\t\t\tthis.lblText = new System.Windows.Forms.Label();\n\t\t\tthis.lblBlockingEvents = new System.Windows.Forms.Label();\n\t\t\tthis.lblRecurringEvents = new System.Windows.Forms.Label();\n\t\t\tthis.lblSimpleEvents = new System.Windows.Forms.Label();\n\t\t\tthis.lblExternalCalendarPage = new System.Windows.Forms.Label();\n\t\t\tthis.lblG15Page = new System.Windows.Forms.Label();\n\t\t\tthis.lblCycleTrainingSeconds = new System.Windows.Forms.Label();\n\t\t\tthis.lblG15CycleCharSeconds = new System.Windows.Forms.Label();\n\t\t\tthis.lblIconsPage = new System.Windows.Forms.Label();\n\t\t\tthis.gbSkillBrowserIconSet = new System.Windows.Forms.GroupBox();\n\t\t\tthis.iconsSetTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n\t\t\tthis.cbSkillIconSet = new System.Windows.Forms.ComboBox();\n\t\t\tthis.tvlist = new System.Windows.Forms.TreeView();\n\t\t\tthis.lblObsoletePlanEntries = new System.Windows.Forms.Label();\n\t\t\tthis.ttToolTipCodes = new System.Windows.Forms.ToolTip(this.components);\n\t\t\tthis.cbUseIncreasedContrastOnOverview = new System.Windows.Forms.CheckBox();\n\t\t\tthis.overviewGroupCharactersInTrainingCheckBox = new System.Windows.Forms.CheckBox();\n\t\t\tthis.overviewShowSkillQueueTrainingTimeCheckBox = new System.Windows.Forms.CheckBox();\n\t\t\tthis.overviewShowWalletCheckBox = new System.Windows.Forms.CheckBox();\n\t\t\tthis.overviewShowPortraitCheckBox = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbShowOverViewTab = new System.Windows.Forms.CheckBox();\n\t\t\tthis.colorDialog = new System.Windows.Forms.ColorDialog();\n\t\t\tthis.treeView = new System.Windows.Forms.TreeView();\n\t\t\tthis.imageList = new System.Windows.Forms.ImageList(this.components);\n\t\t\tthis.leftPanel = new System.Windows.Forms.Panel();\n\t\t\tthis.multiPanel = new EVEMon.Common.Controls.MultiPanel.MultiPanel();\n\t\t\tthis.generalPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.btnEVEMonDataDir = new System.Windows.Forms.Button();\n\t\t\tthis.cbWorksafeMode = new System.Windows.Forms.CheckBox();\n\t\t\tthis.compatibilityCombo = new System.Windows.Forms.ComboBox();\n\t\t\tthis.runAtStartupComboBox = new System.Windows.Forms.CheckBox();\n\t\t\tthis.mainWindowPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.OverviewGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.overviewPanel = new System.Windows.Forms.Panel();\n\t\t\tthis.cbShowSkillpointsOnOverview = new System.Windows.Forms.CheckBox();\n\t\t\tthis.overviewPortraitSizeComboBox = new System.Windows.Forms.ComboBox();\n\t\t\tthis.skillPlannerPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.cbAdvanceEntryAdd = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbSummaryOnMultiSelectOnly = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbHighlightQueuedSiklls = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbHighlightPartialSkills = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbHighlightConflicts = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbHighlightPrerequisites = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbHighlightPlannedSkills = new System.Windows.Forms.CheckBox();\n\t\t\tthis.networkPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.esiSettingsGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.lblClientSecret = new System.Windows.Forms.Label();\n\t\t\tthis.lblClientID = new System.Windows.Forms.Label();\n\t\t\tthis.esiSettingsLabel = new System.Windows.Forms.LinkLabel();\n\t\t\tthis.clientSecretTextBox = new System.Windows.Forms.TextBox();\n\t\t\tthis.clientIDTextBox = new System.Windows.Forms.TextBox();\n\t\t\tthis.ProxyServerGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.customProxyCheckBox = new System.Windows.Forms.CheckBox();\n\t\t\tthis.customProxyPanel = new System.Windows.Forms.Panel();\n\t\t\tthis.proxyPortTextBox = new System.Windows.Forms.TextBox();\n\t\t\tthis.proxyAuthenticationButton = new System.Windows.Forms.Button();\n\t\t\tthis.proxyHttpHostTextBox = new System.Windows.Forms.TextBox();\n\t\t\tthis.emailNotificationsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.mailNotificationCheckBox = new System.Windows.Forms.CheckBox();\n\t\t\tthis.emailNotificationsControl = new EVEMon.SettingsUI.EmailNotificationsControl();\n\t\t\tthis.notificationsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.cbPlaySoundOnSkillComplete = new System.Windows.Forms.CheckBox();\n\t\t\tthis.notificationsControl = new EVEMon.SettingsUI.NotificationsControl();\n\t\t\tthis.trayIconPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.mainWindowBehaviourGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.rbMinToTaskBar = new System.Windows.Forms.RadioButton();\n\t\t\tthis.rbMinToTray = new System.Windows.Forms.RadioButton();\n\t\t\tthis.rbExitEVEMon = new System.Windows.Forms.RadioButton();\n\t\t\tthis.trayIconPopupGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.trayPopupDisabledRadio = new System.Windows.Forms.RadioButton();\n\t\t\tthis.trayPopupButton = new System.Windows.Forms.Button();\n\t\t\tthis.trayPopupRadio = new System.Windows.Forms.RadioButton();\n\t\t\tthis.trayTooltipRadio = new System.Windows.Forms.RadioButton();\n\t\t\tthis.trayTooltipButton = new System.Windows.Forms.Button();\n\t\t\tthis.updatesPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.updateSettingsControl = new EVEMon.SettingsUI.UpdateSettingsControl();\n\t\t\tthis.lblUpdatesPage = new System.Windows.Forms.Label();\n\t\t\tthis.cbCheckTime = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbCheckForUpdates = new System.Windows.Forms.CheckBox();\n\t\t\tthis.schedulerUIPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.panelColorText = new System.Windows.Forms.Panel();\n\t\t\tthis.panelColorRecurring2 = new System.Windows.Forms.Panel();\n\t\t\tthis.panelColorRecurring1 = new System.Windows.Forms.Panel();\n\t\t\tthis.panelColorSingle2 = new System.Windows.Forms.Panel();\n\t\t\tthis.panelColorSingle1 = new System.Windows.Forms.Panel();\n\t\t\tthis.panelColorBlocking = new System.Windows.Forms.Panel();\n\t\t\tthis.externalCalendarPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.externalCalendarControl = new EVEMon.SettingsUI.ExternalCalendarControl();\n\t\t\tthis.externalCalendarCheckbox = new System.Windows.Forms.CheckBox();\n\t\t\tthis.g15Page = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.g15CheckBox = new System.Windows.Forms.CheckBox();\n\t\t\tthis.g15Panel = new System.Windows.Forms.Panel();\n\t\t\tthis.cbG15ShowEVETime = new System.Windows.Forms.CheckBox();\n\t\t\tthis.cbG15ShowTime = new System.Windows.Forms.CheckBox();\n\t\t\tthis.panelCycleQueueInfo = new System.Windows.Forms.Panel();\n\t\t\tthis.cbG15CycleTimes = new System.Windows.Forms.CheckBox();\n\t\t\tthis.ACycleTimesInterval = new System.Windows.Forms.NumericUpDown();\n\t\t\tthis.panelCycleCharInfo = new System.Windows.Forms.Panel();\n\t\t\tthis.cbG15ACycle = new System.Windows.Forms.CheckBox();\n\t\t\tthis.ACycleInterval = new System.Windows.Forms.NumericUpDown();\n\t\t\tthis.iconsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.messagesPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.gbMessageBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.lblPrioritesConflict = new System.Windows.Forms.Label();\n\t\t\tthis.btnPrioritiesReset = new System.Windows.Forms.Button();\n\t\t\tthis.ObsoleteEntryRemovalGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.RemoveAllLabel = new System.Windows.Forms.Label();\n\t\t\tthis.AlwaysAskLabel = new System.Windows.Forms.Label();\n\t\t\tthis.RemoveConfirmedLabel = new System.Windows.Forms.Label();\n\t\t\tthis.alwaysAskRadioButton = new System.Windows.Forms.RadioButton();\n\t\t\tthis.removeAllRadioButton = new System.Windows.Forms.RadioButton();\n\t\t\tthis.removeConfirmedRadioButton = new System.Windows.Forms.RadioButton();\n\t\t\tthis.portableEveClientsPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.lblPECIDescription = new System.Windows.Forms.Label();\n\t\t\tthis.PECIGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.portableEveClientsControl = new EVEMon.SettingsUI.PortableEveClientsControl();\n\t\t\tthis.marketPriceProvidersPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.gbMarketPriceProviders = new System.Windows.Forms.GroupBox();\n\t\t\tthis.cbProvidersList = new System.Windows.Forms.ComboBox();\n\t\t\tthis.SelectedProviderLabel = new System.Windows.Forms.Label();\n\t\t\tthis.marketPriceProviderPageLabel = new System.Windows.Forms.Label();\n\t\t\tthis.cloudStorageServicePage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n\t\t\tthis.providerAuthenticationGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.cloudStorageServiceControl = new EVEMon.SettingsUI.CloudStorageServiceControl();\n\t\t\tthis.cloudStorageGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.cloudStorageProviderLogoPictureBox = new System.Windows.Forms.PictureBox();\n\t\t\tthis.cloudStorageProvidersComboBox = new System.Windows.Forms.ComboBox();\n\t\t\tthis.lblSelectedProvider = new System.Windows.Forms.Label();\n\t\t\tthis.linkLabel1 = new System.Windows.Forms.LinkLabel();\n\t\t\tthis.settingsFileStorageGroupBox = new System.Windows.Forms.GroupBox();\n\t\t\tthis.settingsFileStorageControl = new EVEMon.SettingsUI.SettingsFileStorageControl();\n\t\t\tthis.extraInfoComboBox = new System.Windows.Forms.ComboBox();\n\t\t\tthis.systemTrayIconGroupBox.SuspendLayout();\n\t\t\tthis.bottomPanel.SuspendLayout();\n\t\t\tthis.CharacterMonitorGroupBox.SuspendLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.nudSkillQueueWarningThresholdDays)).BeginInit();\n\t\t\tthis.WindowTitleGroupBox.SuspendLayout();\n\t\t\tthis.gbSkillBrowserIconSet.SuspendLayout();\n\t\t\tthis.iconsSetTableLayoutPanel.SuspendLayout();\n\t\t\tthis.leftPanel.SuspendLayout();\n\t\t\tthis.multiPanel.SuspendLayout();\n\t\t\tthis.generalPage.SuspendLayout();\n\t\t\tthis.mainWindowPage.SuspendLayout();\n\t\t\tthis.OverviewGroupBox.SuspendLayout();\n\t\t\tthis.overviewPanel.SuspendLayout();\n\t\t\tthis.skillPlannerPage.SuspendLayout();\n\t\t\tthis.networkPage.SuspendLayout();\n\t\t\tthis.esiSettingsGroupBox.SuspendLayout();\n\t\t\tthis.ProxyServerGroupBox.SuspendLayout();\n\t\t\tthis.customProxyPanel.SuspendLayout();\n\t\t\tthis.emailNotificationsPage.SuspendLayout();\n\t\t\tthis.notificationsPage.SuspendLayout();\n\t\t\tthis.trayIconPage.SuspendLayout();\n\t\t\tthis.mainWindowBehaviourGroupBox.SuspendLayout();\n\t\t\tthis.trayIconPopupGroupBox.SuspendLayout();\n\t\t\tthis.updatesPage.SuspendLayout();\n\t\t\tthis.schedulerUIPage.SuspendLayout();\n\t\t\tthis.externalCalendarPage.SuspendLayout();\n\t\t\tthis.g15Page.SuspendLayout();\n\t\t\tthis.g15Panel.SuspendLayout();\n\t\t\tthis.panelCycleQueueInfo.SuspendLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.ACycleTimesInterval)).BeginInit();\n\t\t\tthis.panelCycleCharInfo.SuspendLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.ACycleInterval)).BeginInit();\n\t\t\tthis.iconsPage.SuspendLayout();\n\t\t\tthis.messagesPage.SuspendLayout();\n\t\t\tthis.gbMessageBox.SuspendLayout();\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.SuspendLayout();\n\t\t\tthis.portableEveClientsPage.SuspendLayout();\n\t\t\tthis.PECIGroupBox.SuspendLayout();\n\t\t\tthis.marketPriceProvidersPage.SuspendLayout();\n\t\t\tthis.gbMarketPriceProviders.SuspendLayout();\n\t\t\tthis.cloudStorageServicePage.SuspendLayout();\n\t\t\tthis.providerAuthenticationGroupBox.SuspendLayout();\n\t\t\tthis.cloudStorageGroupBox.SuspendLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.cloudStorageProviderLogoPictureBox)).BeginInit();\n\t\t\tthis.settingsFileStorageGroupBox.SuspendLayout();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// systemTrayIconGroupBox\n\t\t\t// \n\t\t\tthis.systemTrayIconGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.systemTrayIconGroupBox.Controls.Add(this.rbSystemTrayOptionsNever);\n\t\t\tthis.systemTrayIconGroupBox.Controls.Add(this.rbSystemTrayOptionsAlways);\n\t\t\tthis.systemTrayIconGroupBox.Controls.Add(this.rbSystemTrayOptionsMinimized);\n\t\t\tthis.systemTrayIconGroupBox.Location = new System.Drawing.Point(9, 68);\n\t\t\tthis.systemTrayIconGroupBox.Name = \"systemTrayIconGroupBox\";\n\t\t\tthis.systemTrayIconGroupBox.Size = new System.Drawing.Size(419, 100);\n\t\t\tthis.systemTrayIconGroupBox.TabIndex = 9;\n\t\t\tthis.systemTrayIconGroupBox.TabStop = false;\n\t\t\tthis.systemTrayIconGroupBox.Text = \"Show System Tray Icon\";\n\t\t\t// \n\t\t\t// rbSystemTrayOptionsNever\n\t\t\t// \n\t\t\tthis.rbSystemTrayOptionsNever.AutoSize = true;\n\t\t\tthis.rbSystemTrayOptionsNever.Location = new System.Drawing.Point(6, 20);\n\t\t\tthis.rbSystemTrayOptionsNever.Name = \"rbSystemTrayOptionsNever\";\n\t\t\tthis.rbSystemTrayOptionsNever.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0);\n\t\t\tthis.rbSystemTrayOptionsNever.Size = new System.Drawing.Size(57, 17);\n\t\t\tthis.rbSystemTrayOptionsNever.TabIndex = 1;\n\t\t\tthis.rbSystemTrayOptionsNever.TabStop = true;\n\t\t\tthis.rbSystemTrayOptionsNever.Tag = \"\";\n\t\t\tthis.rbSystemTrayOptionsNever.Text = \"Never\";\n\t\t\tthis.rbSystemTrayOptionsNever.UseVisualStyleBackColor = true;\n\t\t\tthis.rbSystemTrayOptionsNever.CheckedChanged += new System.EventHandler(this.OnMustEnableOrDisable);\n\t\t\t// \n\t\t\t// rbSystemTrayOptionsAlways\n\t\t\t// \n\t\t\tthis.rbSystemTrayOptionsAlways.AutoSize = true;\n\t\t\tthis.rbSystemTrayOptionsAlways.Location = new System.Drawing.Point(6, 66);\n\t\t\tthis.rbSystemTrayOptionsAlways.Name = \"rbSystemTrayOptionsAlways\";\n\t\t\tthis.rbSystemTrayOptionsAlways.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0);\n\t\t\tthis.rbSystemTrayOptionsAlways.Size = new System.Drawing.Size(61, 17);\n\t\t\tthis.rbSystemTrayOptionsAlways.TabIndex = 3;\n\t\t\tthis.rbSystemTrayOptionsAlways.TabStop = true;\n\t\t\tthis.rbSystemTrayOptionsAlways.Tag = \"\";\n\t\t\tthis.rbSystemTrayOptionsAlways.Text = \"Always\";\n\t\t\tthis.rbSystemTrayOptionsAlways.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// rbSystemTrayOptionsMinimized\n\t\t\t// \n\t\t\tthis.rbSystemTrayOptionsMinimized.AutoSize = true;\n\t\t\tthis.rbSystemTrayOptionsMinimized.Location = new System.Drawing.Point(6, 43);\n\t\t\tthis.rbSystemTrayOptionsMinimized.Name = \"rbSystemTrayOptionsMinimized\";\n\t\t\tthis.rbSystemTrayOptionsMinimized.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0);\n\t\t\tthis.rbSystemTrayOptionsMinimized.Size = new System.Drawing.Size(106, 17);\n\t\t\tthis.rbSystemTrayOptionsMinimized.TabIndex = 2;\n\t\t\tthis.rbSystemTrayOptionsMinimized.TabStop = true;\n\t\t\tthis.rbSystemTrayOptionsMinimized.Tag = \"\";\n\t\t\tthis.rbSystemTrayOptionsMinimized.Text = \"When Minimized\";\n\t\t\tthis.rbSystemTrayOptionsMinimized.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// bottomPanel\n\t\t\t// \n\t\t\tthis.bottomPanel.BackColor = System.Drawing.SystemColors.ControlLight;\n\t\t\tthis.bottomPanel.Controls.Add(this.applyButton);\n\t\t\tthis.bottomPanel.Controls.Add(this.okButton);\n\t\t\tthis.bottomPanel.Controls.Add(this.cancelButton);\n\t\t\tthis.bottomPanel.Dock = System.Windows.Forms.DockStyle.Bottom;\n\t\t\tthis.bottomPanel.Location = new System.Drawing.Point(0, 436);\n\t\t\tthis.bottomPanel.Name = \"bottomPanel\";\n\t\t\tthis.bottomPanel.Size = new System.Drawing.Size(644, 46);\n\t\t\tthis.bottomPanel.TabIndex = 8;\n\t\t\t// \n\t\t\t// applyButton\n\t\t\t// \n\t\t\tthis.applyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.applyButton.Location = new System.Drawing.Point(557, 11);\n\t\t\tthis.applyButton.Name = \"applyButton\";\n\t\t\tthis.applyButton.Size = new System.Drawing.Size(75, 23);\n\t\t\tthis.applyButton.TabIndex = 4;\n\t\t\tthis.applyButton.Text = \"&Apply\";\n\t\t\tthis.applyButton.UseVisualStyleBackColor = true;\n\t\t\tthis.applyButton.Click += new System.EventHandler(this.applyButton_Click);\n\t\t\t// \n\t\t\t// okButton\n\t\t\t// \n\t\t\tthis.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.okButton.Location = new System.Drawing.Point(395, 11);\n\t\t\tthis.okButton.Name = \"okButton\";\n\t\t\tthis.okButton.Size = new System.Drawing.Size(75, 23);\n\t\t\tthis.okButton.TabIndex = 3;\n\t\t\tthis.okButton.Text = \"&OK\";\n\t\t\tthis.okButton.UseVisualStyleBackColor = true;\n\t\t\tthis.okButton.Click += new System.EventHandler(this.btnOk_Click);\n\t\t\t// \n\t\t\t// cancelButton\n\t\t\t// \n\t\t\tthis.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n\t\t\tthis.cancelButton.Location = new System.Drawing.Point(476, 11);\n\t\t\tthis.cancelButton.Name = \"cancelButton\";\n\t\t\tthis.cancelButton.Size = new System.Drawing.Size(75, 23);\n\t\t\tthis.cancelButton.TabIndex = 2;\n\t\t\tthis.cancelButton.Text = \"&Cancel\";\n\t\t\tthis.cancelButton.UseVisualStyleBackColor = true;\n\t\t\tthis.cancelButton.Click += new System.EventHandler(this.btnCancel_Click);\n\t\t\t// \n\t\t\t// lblMainWindowPage\n\t\t\t// \n\t\t\tthis.lblMainWindowPage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblMainWindowPage.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblMainWindowPage.Location = new System.Drawing.Point(4, 12);\n\t\t\tthis.lblMainWindowPage.Name = \"lblMainWindowPage\";\n\t\t\tthis.lblMainWindowPage.Size = new System.Drawing.Size(424, 44);\n\t\t\tthis.lblMainWindowPage.TabIndex = 19;\n\t\t\tthis.lblMainWindowPage.Text = resources.GetString(\"lblMainWindowPage.Text\");\n\t\t\t// \n\t\t\t// lblSize\n\t\t\t// \n\t\t\tthis.lblSize.AutoSize = true;\n\t\t\tthis.lblSize.Location = new System.Drawing.Point(20, 52);\n\t\t\tthis.lblSize.Name = \"lblSize\";\n\t\t\tthis.lblSize.Size = new System.Drawing.Size(27, 13);\n\t\t\tthis.lblSize.TabIndex = 31;\n\t\t\tthis.lblSize.Text = \"Size\";\n\t\t\t// \n\t\t\t// CharacterMonitorGroupBox\n\t\t\t// \n\t\t\tthis.CharacterMonitorGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.CharacterMonitorGroupBox.Controls.Add(this.nudSkillQueueWarningThresholdDays);\n\t\t\tthis.CharacterMonitorGroupBox.Controls.Add(this.lblSkillQueueWarningThresholdDays);\n\t\t\tthis.CharacterMonitorGroupBox.Controls.Add(this.lblSkillQueuWarningThreshold);\n\t\t\tthis.CharacterMonitorGroupBox.Controls.Add(this.cbColorQueuedSkills);\n\t\t\tthis.CharacterMonitorGroupBox.Controls.Add(this.cbShowPrereqMetSkills);\n\t\t\tthis.CharacterMonitorGroupBox.Controls.Add(this.cbColorPartialSkills);\n\t\t\tthis.CharacterMonitorGroupBox.Controls.Add(this.cbAlwaysShowSkillQueueTime);\n\t\t\tthis.CharacterMonitorGroupBox.Controls.Add(this.cbShowNonPublicSkills);\n\t\t\tthis.CharacterMonitorGroupBox.Controls.Add(this.cbShowAllPublicSkills);\n\t\t\tthis.CharacterMonitorGroupBox.Location = new System.Drawing.Point(3, 161);\n\t\t\tthis.CharacterMonitorGroupBox.Name = \"CharacterMonitorGroupBox\";\n\t\t\tthis.CharacterMonitorGroupBox.Size = new System.Drawing.Size(426, 126);\n\t\t\tthis.CharacterMonitorGroupBox.TabIndex = 7;\n\t\t\tthis.CharacterMonitorGroupBox.TabStop = false;\n\t\t\tthis.CharacterMonitorGroupBox.Text = \"Character Monitor\";\n\t\t\t// \n\t\t\t// nudSkillQueueWarningThresholdDays\n\t\t\t// \n\t\t\tthis.nudSkillQueueWarningThresholdDays.Location = new System.Drawing.Point(65, 101);\n\t\t\tthis.nudSkillQueueWarningThresholdDays.Maximum = new decimal(new int[] {\n            30,\n            0,\n            0,\n            0});\n\t\t\tthis.nudSkillQueueWarningThresholdDays.Name = \"nudSkillQueueWarningThresholdDays\";\n\t\t\tthis.nudSkillQueueWarningThresholdDays.Size = new System.Drawing.Size(33, 20);\n\t\t\tthis.nudSkillQueueWarningThresholdDays.TabIndex = 16;\n\t\t\tthis.nudSkillQueueWarningThresholdDays.Value = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n\t\t\t// \n\t\t\t// lblSkillQueueWarningThresholdDays\n\t\t\t// \n\t\t\tthis.lblSkillQueueWarningThresholdDays.AutoSize = true;\n\t\t\tthis.lblSkillQueueWarningThresholdDays.Location = new System.Drawing.Point(22, 103);\n\t\t\tthis.lblSkillQueueWarningThresholdDays.Name = \"lblSkillQueueWarningThresholdDays\";\n\t\t\tthis.lblSkillQueueWarningThresholdDays.Size = new System.Drawing.Size(37, 13);\n\t\t\tthis.lblSkillQueueWarningThresholdDays.TabIndex = 15;\n\t\t\tthis.lblSkillQueueWarningThresholdDays.Text = \"Days :\";\n\t\t\t// \n\t\t\t// lblSkillQueuWarningThreshold\n\t\t\t// \n\t\t\tthis.lblSkillQueuWarningThreshold.AutoSize = true;\n\t\t\tthis.lblSkillQueuWarningThreshold.Location = new System.Drawing.Point(9, 84);\n\t\t\tthis.lblSkillQueuWarningThreshold.Name = \"lblSkillQueuWarningThreshold\";\n\t\t\tthis.lblSkillQueuWarningThreshold.Size = new System.Drawing.Size(154, 13);\n\t\t\tthis.lblSkillQueuWarningThreshold.TabIndex = 14;\n\t\t\tthis.lblSkillQueuWarningThreshold.Text = \"Skill Queue Warning Threshold\";\n\t\t\t// \n\t\t\t// cbColorQueuedSkills\n\t\t\t// \n\t\t\tthis.cbColorQueuedSkills.AutoSize = true;\n\t\t\tthis.cbColorQueuedSkills.Location = new System.Drawing.Point(188, 38);\n\t\t\tthis.cbColorQueuedSkills.Name = \"cbColorQueuedSkills\";\n\t\t\tthis.cbColorQueuedSkills.Size = new System.Drawing.Size(135, 17);\n\t\t\tthis.cbColorQueuedSkills.TabIndex = 13;\n\t\t\tthis.cbColorQueuedSkills.Text = \"Highlight Queued Skills\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.cbColorQueuedSkills, \"When enabled, highlights all\\r\\nqueued skills in character\\'s skill list\");\n\t\t\tthis.cbColorQueuedSkills.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbShowPrereqMetSkills\n\t\t\t// \n\t\t\tthis.cbShowPrereqMetSkills.AutoSize = true;\n\t\t\tthis.cbShowPrereqMetSkills.Location = new System.Drawing.Point(15, 57);\n\t\t\tthis.cbShowPrereqMetSkills.Name = \"cbShowPrereqMetSkills\";\n\t\t\tthis.cbShowPrereqMetSkills.Size = new System.Drawing.Size(158, 17);\n\t\t\tthis.cbShowPrereqMetSkills.TabIndex = 12;\n\t\t\tthis.cbShowPrereqMetSkills.Text = \"Show Also Prereq-Met Skills\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.cbShowPrereqMetSkills, \"When enabled, shows all prerequisites\\r\\nmet skills in character\\'s skill list\");\n\t\t\tthis.cbShowPrereqMetSkills.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbColorPartialSkills\n\t\t\t// \n\t\t\tthis.cbColorPartialSkills.AutoSize = true;\n\t\t\tthis.cbColorPartialSkills.Location = new System.Drawing.Point(188, 20);\n\t\t\tthis.cbColorPartialSkills.Name = \"cbColorPartialSkills\";\n\t\t\tthis.cbColorPartialSkills.Size = new System.Drawing.Size(172, 17);\n\t\t\tthis.cbColorPartialSkills.TabIndex = 11;\n\t\t\tthis.cbColorPartialSkills.Text = \"Highlight Partially Trained Skills\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.cbColorPartialSkills, \"When enabled, highlights all partially\\r\\ntrained skills in character\\'s skill list\");\n\t\t\tthis.cbColorPartialSkills.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbAlwaysShowSkillQueueTime\n\t\t\t// \n\t\t\tthis.cbAlwaysShowSkillQueueTime.AutoSize = true;\n\t\t\tthis.cbAlwaysShowSkillQueueTime.Location = new System.Drawing.Point(188, 57);\n\t\t\tthis.cbAlwaysShowSkillQueueTime.Name = \"cbAlwaysShowSkillQueueTime\";\n\t\t\tthis.cbAlwaysShowSkillQueueTime.Size = new System.Drawing.Size(213, 17);\n\t\t\tthis.cbAlwaysShowSkillQueueTime.TabIndex = 2;\n\t\t\tthis.cbAlwaysShowSkillQueueTime.Text = \"Always show time above the skill queue\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.cbAlwaysShowSkillQueueTime, \"When enabled, always displays the total\\r\\nqueue time above the skill queue bar\");\n\t\t\tthis.cbAlwaysShowSkillQueueTime.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbShowNonPublicSkills\n\t\t\t// \n\t\t\tthis.cbShowNonPublicSkills.AutoSize = true;\n\t\t\tthis.cbShowNonPublicSkills.Enabled = false;\n\t\t\tthis.cbShowNonPublicSkills.Location = new System.Drawing.Point(15, 38);\n\t\t\tthis.cbShowNonPublicSkills.Name = \"cbShowNonPublicSkills\";\n\t\t\tthis.cbShowNonPublicSkills.Size = new System.Drawing.Size(158, 17);\n\t\t\tthis.cbShowNonPublicSkills.TabIndex = 1;\n\t\t\tthis.cbShowNonPublicSkills.Text = \"Show Also Non-Public Skills\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.cbShowNonPublicSkills, \"When enabled, shows all non-public skills in character\\'s skill list\");\n\t\t\tthis.cbShowNonPublicSkills.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbShowAllPublicSkills\n\t\t\t// \n\t\t\tthis.cbShowAllPublicSkills.AutoSize = true;\n\t\t\tthis.cbShowAllPublicSkills.Location = new System.Drawing.Point(15, 20);\n\t\t\tthis.cbShowAllPublicSkills.Name = \"cbShowAllPublicSkills\";\n\t\t\tthis.cbShowAllPublicSkills.Size = new System.Drawing.Size(149, 17);\n\t\t\tthis.cbShowAllPublicSkills.TabIndex = 0;\n\t\t\tthis.cbShowAllPublicSkills.Text = \"Show Also All Public Skills\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.cbShowAllPublicSkills, \"When enabled, shows all public skills in character\\'s skill list\");\n\t\t\tthis.cbShowAllPublicSkills.UseVisualStyleBackColor = true;\n\t\t\tthis.cbShowAllPublicSkills.CheckedChanged += new System.EventHandler(this.OnMustEnableOrDisable);\n\t\t\t// \n\t\t\t// WindowTitleGroupBox\n\t\t\t// \n\t\t\tthis.WindowTitleGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.WindowTitleGroupBox.Controls.Add(this.cbWindowsTitleList);\n\t\t\tthis.WindowTitleGroupBox.Controls.Add(this.cbSkillInTitle);\n\t\t\tthis.WindowTitleGroupBox.Controls.Add(this.cbTitleToTime);\n\t\t\tthis.WindowTitleGroupBox.Location = new System.Drawing.Point(3, 59);\n\t\t\tthis.WindowTitleGroupBox.Name = \"WindowTitleGroupBox\";\n\t\t\tthis.WindowTitleGroupBox.Size = new System.Drawing.Size(426, 96);\n\t\t\tthis.WindowTitleGroupBox.TabIndex = 14;\n\t\t\tthis.WindowTitleGroupBox.TabStop = false;\n\t\t\tthis.WindowTitleGroupBox.Text = \"Window Title\";\n\t\t\t// \n\t\t\t// cbWindowsTitleList\n\t\t\t// \n\t\t\tthis.cbWindowsTitleList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.cbWindowsTitleList.FormattingEnabled = true;\n\t\t\tthis.cbWindowsTitleList.Items.AddRange(new object[] {\n            \"Single character - finishing skill next\",\n            \"Single character - selected character\",\n            \"Multi character - finishing skill next first\",\n            \"Multi character - selected character first \"});\n\t\t\tthis.cbWindowsTitleList.Location = new System.Drawing.Point(15, 66);\n\t\t\tthis.cbWindowsTitleList.Name = \"cbWindowsTitleList\";\n\t\t\tthis.cbWindowsTitleList.Size = new System.Drawing.Size(224, 21);\n\t\t\tthis.cbWindowsTitleList.TabIndex = 1;\n\t\t\t// \n\t\t\t// cbSkillInTitle\n\t\t\t// \n\t\t\tthis.cbSkillInTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left)));\n\t\t\tthis.cbSkillInTitle.AutoSize = true;\n\t\t\tthis.cbSkillInTitle.Location = new System.Drawing.Point(15, 43);\n\t\t\tthis.cbSkillInTitle.Name = \"cbSkillInTitle\";\n\t\t\tthis.cbSkillInTitle.Size = new System.Drawing.Size(121, 17);\n\t\t\tthis.cbSkillInTitle.TabIndex = 7;\n\t\t\tthis.cbSkillInTitle.Text = \"Show skill in training\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.cbSkillInTitle, \"When enabled, shows the character\\'s skill\\r\\nin training according to choice below\");\n\t\t\tthis.cbSkillInTitle.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbTitleToTime\n\t\t\t// \n\t\t\tthis.cbTitleToTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left)));\n\t\t\tthis.cbTitleToTime.AutoSize = true;\n\t\t\tthis.cbTitleToTime.Location = new System.Drawing.Point(15, 20);\n\t\t\tthis.cbTitleToTime.Margin = new System.Windows.Forms.Padding(12, 3, 3, 3);\n\t\t\tthis.cbTitleToTime.Name = \"cbTitleToTime\";\n\t\t\tthis.cbTitleToTime.Size = new System.Drawing.Size(190, 17);\n\t\t\tthis.cbTitleToTime.TabIndex = 6;\n\t\t\tthis.cbTitleToTime.Text = \"Show character info in window title\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.cbTitleToTime, \"When enabled, shows the character\\'s info in window title\");\n\t\t\tthis.cbTitleToTime.UseVisualStyleBackColor = true;\n\t\t\tthis.cbTitleToTime.CheckedChanged += new System.EventHandler(this.OnMustEnableOrDisable);\n\t\t\t// \n\t\t\t// lblGeneralPage\n\t\t\t// \n\t\t\tthis.lblGeneralPage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblGeneralPage.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblGeneralPage.Location = new System.Drawing.Point(4, 23);\n\t\t\tthis.lblGeneralPage.Name = \"lblGeneralPage\";\n\t\t\tthis.lblGeneralPage.Size = new System.Drawing.Size(424, 42);\n\t\t\tthis.lblGeneralPage.TabIndex = 20;\n\t\t\tthis.lblGeneralPage.Text = resources.GetString(\"lblGeneralPage.Text\");\n\t\t\t// \n\t\t\t// lblEnvironment\n\t\t\t// \n\t\t\tthis.lblEnvironment.AutoSize = true;\n\t\t\tthis.lblEnvironment.Location = new System.Drawing.Point(3, 181);\n\t\t\tthis.lblEnvironment.Name = \"lblEnvironment\";\n\t\t\tthis.lblEnvironment.Size = new System.Drawing.Size(210, 13);\n\t\t\tthis.lblEnvironment.TabIndex = 1;\n\t\t\tthis.lblEnvironment.Text = \"Environment (requires restart to take effect)\";\n\t\t\t// \n\t\t\t// lblSkillPlannerPage\n\t\t\t// \n\t\t\tthis.lblSkillPlannerPage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblSkillPlannerPage.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblSkillPlannerPage.Location = new System.Drawing.Point(4, 20);\n\t\t\tthis.lblSkillPlannerPage.Name = \"lblSkillPlannerPage\";\n\t\t\tthis.lblSkillPlannerPage.Size = new System.Drawing.Size(424, 28);\n\t\t\tthis.lblSkillPlannerPage.TabIndex = 19;\n\t\t\tthis.lblSkillPlannerPage.Text = \"You can select whether to highlight any entry in the Skill Planner according to i\" +\n    \"ts status and more.\";\n\t\t\t// \n\t\t\t// lblNetworkPageProxy\n\t\t\t// \n\t\t\tthis.lblNetworkPageProxy.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblNetworkPageProxy.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblNetworkPageProxy.Location = new System.Drawing.Point(9, 17);\n\t\t\tthis.lblNetworkPageProxy.Name = \"lblNetworkPageProxy\";\n\t\t\tthis.lblNetworkPageProxy.Size = new System.Drawing.Size(399, 32);\n\t\t\tthis.lblNetworkPageProxy.TabIndex = 8;\n\t\t\tthis.lblNetworkPageProxy.Text = \"By default, EVEMon will use the same Proxy settings as Internet Explorer (can be \" +\n    \"configured through the Control Panel).\";\n\t\t\t// \n\t\t\t// lblProxyHostIPAddress\n\t\t\t// \n\t\t\tthis.lblProxyHostIPAddress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblProxyHostIPAddress.Location = new System.Drawing.Point(50, 8);\n\t\t\tthis.lblProxyHostIPAddress.Name = \"lblProxyHostIPAddress\";\n\t\t\tthis.lblProxyHostIPAddress.Size = new System.Drawing.Size(182, 13);\n\t\t\tthis.lblProxyHostIPAddress.TabIndex = 3;\n\t\t\tthis.lblProxyHostIPAddress.Text = \"Host/IP Address\";\n\t\t\tthis.lblProxyHostIPAddress.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n\t\t\t// \n\t\t\t// lblProxyPort\n\t\t\t// \n\t\t\tthis.lblProxyPort.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblProxyPort.Location = new System.Drawing.Point(221, 8);\n\t\t\tthis.lblProxyPort.Name = \"lblProxyPort\";\n\t\t\tthis.lblProxyPort.Size = new System.Drawing.Size(56, 13);\n\t\t\tthis.lblProxyPort.TabIndex = 4;\n\t\t\tthis.lblProxyPort.Text = \"Port\";\n\t\t\tthis.lblProxyPort.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n\t\t\t// \n\t\t\t// lblHTTP\n\t\t\t// \n\t\t\tthis.lblHTTP.AutoSize = true;\n\t\t\tthis.lblHTTP.Location = new System.Drawing.Point(8, 27);\n\t\t\tthis.lblHTTP.Name = \"lblHTTP\";\n\t\t\tthis.lblHTTP.Size = new System.Drawing.Size(39, 13);\n\t\t\tthis.lblHTTP.TabIndex = 0;\n\t\t\tthis.lblHTTP.Text = \"HTTP:\";\n\t\t\tthis.lblHTTP.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n\t\t\t// \n\t\t\t// lblEmailNotificationPage\n\t\t\t// \n\t\t\tthis.lblEmailNotificationPage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblEmailNotificationPage.AutoSize = true;\n\t\t\tthis.lblEmailNotificationPage.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblEmailNotificationPage.Location = new System.Drawing.Point(4, 20);\n\t\t\tthis.lblEmailNotificationPage.Name = \"lblEmailNotificationPage\";\n\t\t\tthis.lblEmailNotificationPage.Size = new System.Drawing.Size(366, 13);\n\t\t\tthis.lblEmailNotificationPage.TabIndex = 19;\n\t\t\tthis.lblEmailNotificationPage.Text = \"EVEMon can send you an email whenever a skill level completes its training.\";\n\t\t\t// \n\t\t\t// lblNotificationsPage\n\t\t\t// \n\t\t\tthis.lblNotificationsPage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblNotificationsPage.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblNotificationsPage.Location = new System.Drawing.Point(4, 14);\n\t\t\tthis.lblNotificationsPage.Name = \"lblNotificationsPage\";\n\t\t\tthis.lblNotificationsPage.Size = new System.Drawing.Size(424, 43);\n\t\t\tthis.lblNotificationsPage.TabIndex = 19;\n\t\t\tthis.lblNotificationsPage.Text = \"You can choose what notifications will be shown in your system\\'s tray notificatio\" +\n    \"n area or in EVEMon\\'s main window and when. You can also toggle the sound notifi\" +\n    \"cation upon skill completion on or off.\";\n\t\t\t// \n\t\t\t// lblTrayIconPage\n\t\t\t// \n\t\t\tthis.lblTrayIconPage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblTrayIconPage.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblTrayIconPage.Location = new System.Drawing.Point(4, 20);\n\t\t\tthis.lblTrayIconPage.Name = \"lblTrayIconPage\";\n\t\t\tthis.lblTrayIconPage.Size = new System.Drawing.Size(424, 31);\n\t\t\tthis.lblTrayIconPage.TabIndex = 18;\n\t\t\tthis.lblTrayIconPage.Text = \"Here you can set the visible status of EVEMon\\'s Tray Icon, configure the style of\" +\n    \" the Tray Icon\\'s popup info and EVEMon\\'s behaviour upon pressing the Close butto\" +\n    \"n.\\r\\n\";\n\t\t\t// \n\t\t\t// lblSchedulerUIPage\n\t\t\t// \n\t\t\tthis.lblSchedulerUIPage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblSchedulerUIPage.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblSchedulerUIPage.Location = new System.Drawing.Point(6, 34);\n\t\t\tthis.lblSchedulerUIPage.Name = \"lblSchedulerUIPage\";\n\t\t\tthis.lblSchedulerUIPage.Size = new System.Drawing.Size(422, 45);\n\t\t\tthis.lblSchedulerUIPage.TabIndex = 6;\n\t\t\tthis.lblSchedulerUIPage.Text = \"Select the colors used in the scheduler. Using the scheduler, EVEMon can warn you\" +\n    \" about skill that will complete at times you will be away from your computer.\";\n\t\t\t// \n\t\t\t// lblText\n\t\t\t// \n\t\t\tthis.lblText.AutoSize = true;\n\t\t\tthis.lblText.Location = new System.Drawing.Point(6, 109);\n\t\t\tthis.lblText.Name = \"lblText\";\n\t\t\tthis.lblText.Size = new System.Drawing.Size(31, 13);\n\t\t\tthis.lblText.TabIndex = 5;\n\t\t\tthis.lblText.Text = \"Text:\";\n\t\t\t// \n\t\t\t// lblBlockingEvents\n\t\t\t// \n\t\t\tthis.lblBlockingEvents.AutoSize = true;\n\t\t\tthis.lblBlockingEvents.Location = new System.Drawing.Point(6, 132);\n\t\t\tthis.lblBlockingEvents.Name = \"lblBlockingEvents\";\n\t\t\tthis.lblBlockingEvents.Size = new System.Drawing.Size(87, 13);\n\t\t\tthis.lblBlockingEvents.TabIndex = 0;\n\t\t\tthis.lblBlockingEvents.Text = \"Blocking Events:\";\n\t\t\t// \n\t\t\t// lblRecurringEvents\n\t\t\t// \n\t\t\tthis.lblRecurringEvents.AutoSize = true;\n\t\t\tthis.lblRecurringEvents.Location = new System.Drawing.Point(6, 180);\n\t\t\tthis.lblRecurringEvents.Name = \"lblRecurringEvents\";\n\t\t\tthis.lblRecurringEvents.Size = new System.Drawing.Size(92, 13);\n\t\t\tthis.lblRecurringEvents.TabIndex = 1;\n\t\t\tthis.lblRecurringEvents.Text = \"Recurring Events:\";\n\t\t\t// \n\t\t\t// lblSimpleEvents\n\t\t\t// \n\t\t\tthis.lblSimpleEvents.AutoSize = true;\n\t\t\tthis.lblSimpleEvents.Location = new System.Drawing.Point(6, 157);\n\t\t\tthis.lblSimpleEvents.Name = \"lblSimpleEvents\";\n\t\t\tthis.lblSimpleEvents.Size = new System.Drawing.Size(77, 13);\n\t\t\tthis.lblSimpleEvents.TabIndex = 2;\n\t\t\tthis.lblSimpleEvents.Text = \"Simple Events:\";\n\t\t\t// \n\t\t\t// lblExternalCalendarPage\n\t\t\t// \n\t\t\tthis.lblExternalCalendarPage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblExternalCalendarPage.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblExternalCalendarPage.Location = new System.Drawing.Point(2, 17);\n\t\t\tthis.lblExternalCalendarPage.Name = \"lblExternalCalendarPage\";\n\t\t\tthis.lblExternalCalendarPage.Size = new System.Drawing.Size(429, 72);\n\t\t\tthis.lblExternalCalendarPage.TabIndex = 11;\n\t\t\tthis.lblExternalCalendarPage.Text = resources.GetString(\"lblExternalCalendarPage.Text\");\n\t\t\t// \n\t\t\t// lblG15Page\n\t\t\t// \n\t\t\tthis.lblG15Page.AutoSize = true;\n\t\t\tthis.lblG15Page.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblG15Page.Location = new System.Drawing.Point(3, 40);\n\t\t\tthis.lblG15Page.Name = \"lblG15Page\";\n\t\t\tthis.lblG15Page.Size = new System.Drawing.Size(347, 13);\n\t\t\tthis.lblG15Page.TabIndex = 5;\n\t\t\tthis.lblG15Page.Text = \"EVEMon supports the LCD display of the Logitech G15/G510 keyboard.\";\n\t\t\t// \n\t\t\t// lblCycleTrainingSeconds\n\t\t\t// \n\t\t\tthis.lblCycleTrainingSeconds.AutoSize = true;\n\t\t\tthis.lblCycleTrainingSeconds.Location = new System.Drawing.Point(265, 6);\n\t\t\tthis.lblCycleTrainingSeconds.Margin = new System.Windows.Forms.Padding(3, 6, 3, 0);\n\t\t\tthis.lblCycleTrainingSeconds.Name = \"lblCycleTrainingSeconds\";\n\t\t\tthis.lblCycleTrainingSeconds.Size = new System.Drawing.Size(47, 13);\n\t\t\tthis.lblCycleTrainingSeconds.TabIndex = 9;\n\t\t\tthis.lblCycleTrainingSeconds.Text = \"seconds\";\n\t\t\t// \n\t\t\t// lblG15CycleCharSeconds\n\t\t\t// \n\t\t\tthis.lblG15CycleCharSeconds.AutoSize = true;\n\t\t\tthis.lblG15CycleCharSeconds.Location = new System.Drawing.Point(186, 6);\n\t\t\tthis.lblG15CycleCharSeconds.Margin = new System.Windows.Forms.Padding(3, 6, 3, 0);\n\t\t\tthis.lblG15CycleCharSeconds.Name = \"lblG15CycleCharSeconds\";\n\t\t\tthis.lblG15CycleCharSeconds.Size = new System.Drawing.Size(47, 13);\n\t\t\tthis.lblG15CycleCharSeconds.TabIndex = 6;\n\t\t\tthis.lblG15CycleCharSeconds.Text = \"seconds\";\n\t\t\t// \n\t\t\t// lblIconsPage\n\t\t\t// \n\t\t\tthis.lblIconsPage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblIconsPage.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblIconsPage.Location = new System.Drawing.Point(4, 20);\n\t\t\tthis.lblIconsPage.Name = \"lblIconsPage\";\n\t\t\tthis.lblIconsPage.Size = new System.Drawing.Size(424, 32);\n\t\t\tthis.lblIconsPage.TabIndex = 15;\n\t\t\tthis.lblIconsPage.Text = \"You can customize the icons used in the skill planner; if you have a good idea fo\" +\n    \"r a set of icons instructions to create your own can be found on wiki.\";\n\t\t\t// \n\t\t\t// gbSkillBrowserIconSet\n\t\t\t// \n\t\t\tthis.gbSkillBrowserIconSet.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.gbSkillBrowserIconSet.Controls.Add(this.iconsSetTableLayoutPanel);\n\t\t\tthis.gbSkillBrowserIconSet.Location = new System.Drawing.Point(7, 55);\n\t\t\tthis.gbSkillBrowserIconSet.Name = \"gbSkillBrowserIconSet\";\n\t\t\tthis.gbSkillBrowserIconSet.Size = new System.Drawing.Size(225, 204);\n\t\t\tthis.gbSkillBrowserIconSet.TabIndex = 14;\n\t\t\tthis.gbSkillBrowserIconSet.TabStop = false;\n\t\t\tthis.gbSkillBrowserIconSet.Text = \"Skill Browser Icon Set\";\n\t\t\t// \n\t\t\t// iconsSetTableLayoutPanel\n\t\t\t// \n\t\t\tthis.iconsSetTableLayoutPanel.AutoSize = true;\n\t\t\tthis.iconsSetTableLayoutPanel.ColumnCount = 1;\n\t\t\tthis.iconsSetTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n\t\t\tthis.iconsSetTableLayoutPanel.Controls.Add(this.cbSkillIconSet, 0, 0);\n\t\t\tthis.iconsSetTableLayoutPanel.Controls.Add(this.tvlist, 0, 1);\n\t\t\tthis.iconsSetTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.iconsSetTableLayoutPanel.Location = new System.Drawing.Point(3, 16);\n\t\t\tthis.iconsSetTableLayoutPanel.Name = \"iconsSetTableLayoutPanel\";\n\t\t\tthis.iconsSetTableLayoutPanel.RowCount = 2;\n\t\t\tthis.iconsSetTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n\t\t\tthis.iconsSetTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n\t\t\tthis.iconsSetTableLayoutPanel.Size = new System.Drawing.Size(219, 185);\n\t\t\tthis.iconsSetTableLayoutPanel.TabIndex = 15;\n\t\t\t// \n\t\t\t// cbSkillIconSet\n\t\t\t// \n\t\t\tthis.cbSkillIconSet.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.cbSkillIconSet.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.cbSkillIconSet.FormattingEnabled = true;\n\t\t\tthis.cbSkillIconSet.Location = new System.Drawing.Point(3, 3);\n\t\t\tthis.cbSkillIconSet.Name = \"cbSkillIconSet\";\n\t\t\tthis.cbSkillIconSet.Size = new System.Drawing.Size(213, 21);\n\t\t\tthis.cbSkillIconSet.TabIndex = 3;\n\t\t\tthis.cbSkillIconSet.SelectedIndexChanged += new System.EventHandler(this.skillIconSetComboBox_SelectedIndexChanged);\n\t\t\t// \n\t\t\t// tvlist\n\t\t\t// \n\t\t\tthis.tvlist.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.tvlist.Location = new System.Drawing.Point(3, 30);\n\t\t\tthis.tvlist.Name = \"tvlist\";\n\t\t\tthis.tvlist.Size = new System.Drawing.Size(213, 152);\n\t\t\tthis.tvlist.TabIndex = 9;\n\t\t\t// \n\t\t\t// lblObsoletePlanEntries\n\t\t\t// \n\t\t\tthis.lblObsoletePlanEntries.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblObsoletePlanEntries.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblObsoletePlanEntries.Location = new System.Drawing.Point(5, 30);\n\t\t\tthis.lblObsoletePlanEntries.Name = \"lblObsoletePlanEntries\";\n\t\t\tthis.lblObsoletePlanEntries.Size = new System.Drawing.Size(424, 28);\n\t\t\tthis.lblObsoletePlanEntries.TabIndex = 24;\n\t\t\tthis.lblObsoletePlanEntries.Text = \"You can configure how EVEMon handles skills that appear to be completed and reset\" +\n    \" the appearing messages behavior.\";\n\t\t\t// \n\t\t\t// cbUseIncreasedContrastOnOverview\n\t\t\t// \n\t\t\tthis.cbUseIncreasedContrastOnOverview.AutoSize = true;\n\t\t\tthis.cbUseIncreasedContrastOnOverview.Location = new System.Drawing.Point(161, 37);\n\t\t\tthis.cbUseIncreasedContrastOnOverview.Name = \"cbUseIncreasedContrastOnOverview\";\n\t\t\tthis.cbUseIncreasedContrastOnOverview.Size = new System.Drawing.Size(137, 17);\n\t\t\tthis.cbUseIncreasedContrastOnOverview.TabIndex = 34;\n\t\t\tthis.cbUseIncreasedContrastOnOverview.Text = \"Use Increased Contrast\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.cbUseIncreasedContrastOnOverview, \"When enabled, increases the contrast of the shown info\");\n\t\t\tthis.cbUseIncreasedContrastOnOverview.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// overviewGroupCharactersInTrainingCheckBox\n\t\t\t// \n\t\t\tthis.overviewGroupCharactersInTrainingCheckBox.AutoSize = true;\n\t\t\tthis.overviewGroupCharactersInTrainingCheckBox.Location = new System.Drawing.Point(161, 55);\n\t\t\tthis.overviewGroupCharactersInTrainingCheckBox.Name = \"overviewGroupCharactersInTrainingCheckBox\";\n\t\t\tthis.overviewGroupCharactersInTrainingCheckBox.Size = new System.Drawing.Size(162, 17);\n\t\t\tthis.overviewGroupCharactersInTrainingCheckBox.TabIndex = 33;\n\t\t\tthis.overviewGroupCharactersInTrainingCheckBox.Text = \"Group Characters In Training\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.overviewGroupCharactersInTrainingCheckBox, \"When enabled, groups the character\\'s\\r\\nthat are currently in training\");\n\t\t\tthis.overviewGroupCharactersInTrainingCheckBox.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// overviewShowSkillQueueTrainingTimeCheckBox\n\t\t\t// \n\t\t\tthis.overviewShowSkillQueueTrainingTimeCheckBox.AutoSize = true;\n\t\t\tthis.overviewShowSkillQueueTrainingTimeCheckBox.Location = new System.Drawing.Point(161, 3);\n\t\t\tthis.overviewShowSkillQueueTrainingTimeCheckBox.Name = \"overviewShowSkillQueueTrainingTimeCheckBox\";\n\t\t\tthis.overviewShowSkillQueueTrainingTimeCheckBox.Size = new System.Drawing.Size(177, 17);\n\t\t\tthis.overviewShowSkillQueueTrainingTimeCheckBox.TabIndex = 32;\n\t\t\tthis.overviewShowSkillQueueTrainingTimeCheckBox.Text = \"Show Skill Queue Training Time\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.overviewShowSkillQueueTrainingTimeCheckBox, \"When enabled, shows the character\\'s\\r\\nskill queue training time\");\n\t\t\tthis.overviewShowSkillQueueTrainingTimeCheckBox.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// overviewShowWalletCheckBox\n\t\t\t// \n\t\t\tthis.overviewShowWalletCheckBox.AutoSize = true;\n\t\t\tthis.overviewShowWalletCheckBox.Location = new System.Drawing.Point(3, 3);\n\t\t\tthis.overviewShowWalletCheckBox.Name = \"overviewShowWalletCheckBox\";\n\t\t\tthis.overviewShowWalletCheckBox.Size = new System.Drawing.Size(128, 17);\n\t\t\tthis.overviewShowWalletCheckBox.TabIndex = 30;\n\t\t\tthis.overviewShowWalletCheckBox.Text = \"Show Wallet Balance\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.overviewShowWalletCheckBox, \"When enabled, shows the character\\'s wallet balance\");\n\t\t\tthis.overviewShowWalletCheckBox.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// overviewShowPortraitCheckBox\n\t\t\t// \n\t\t\tthis.overviewShowPortraitCheckBox.AutoSize = true;\n\t\t\tthis.overviewShowPortraitCheckBox.Location = new System.Drawing.Point(3, 20);\n\t\t\tthis.overviewShowPortraitCheckBox.Name = \"overviewShowPortraitCheckBox\";\n\t\t\tthis.overviewShowPortraitCheckBox.Size = new System.Drawing.Size(138, 17);\n\t\t\tthis.overviewShowPortraitCheckBox.TabIndex = 26;\n\t\t\tthis.overviewShowPortraitCheckBox.Text = \"Show Character Portrait\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.overviewShowPortraitCheckBox, \"When enabled, shows the character\\'s portrait\\r\\nas a thumbnail alongside the charac\" +\n        \"ter\\'s name\");\n\t\t\tthis.overviewShowPortraitCheckBox.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbShowOverViewTab\n\t\t\t// \n\t\t\tthis.cbShowOverViewTab.AutoSize = true;\n\t\t\tthis.cbShowOverViewTab.Location = new System.Drawing.Point(14, 17);\n\t\t\tthis.cbShowOverViewTab.Name = \"cbShowOverViewTab\";\n\t\t\tthis.cbShowOverViewTab.Size = new System.Drawing.Size(129, 17);\n\t\t\tthis.cbShowOverViewTab.TabIndex = 0;\n\t\t\tthis.cbShowOverViewTab.Text = \"Show \\\"Overview\\\" tab\";\n\t\t\tthis.ttToolTipCodes.SetToolTip(this.cbShowOverViewTab, \"When enabled, shows the Overview tab\");\n\t\t\tthis.cbShowOverViewTab.UseVisualStyleBackColor = true;\n\t\t\tthis.cbShowOverViewTab.CheckedChanged += new System.EventHandler(this.OnMustEnableOrDisable);\n\t\t\t// \n\t\t\t// treeView\n\t\t\t// \n\t\t\tthis.treeView.BackColor = System.Drawing.SystemColors.ControlLightLight;\n\t\t\tthis.treeView.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n\t\t\tthis.treeView.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.treeView.FullRowSelect = true;\n\t\t\tthis.treeView.HideSelection = false;\n\t\t\tthis.treeView.ImageIndex = 0;\n\t\t\tthis.treeView.ImageList = this.imageList;\n\t\t\tthis.treeView.ItemHeight = 20;\n\t\t\tthis.treeView.Location = new System.Drawing.Point(6, 6);\n\t\t\tthis.treeView.Name = \"treeView\";\n\t\t\ttreeNode1.ImageIndex = 11;\n\t\t\ttreeNode1.Name = \"UpdatesNode\";\n\t\t\ttreeNode1.SelectedImageIndex = 11;\n\t\t\ttreeNode1.Tag = \"updatesPage\";\n\t\t\ttreeNode1.Text = \"Updates\";\n\t\t\ttreeNode2.ImageIndex = 7;\n\t\t\ttreeNode2.Name = \"networkNode\";\n\t\t\ttreeNode2.SelectedImageIndex = 7;\n\t\t\ttreeNode2.Tag = \"networkPage\";\n\t\t\ttreeNode2.Text = \"Network\";\n\t\t\ttreeNode3.ImageIndex = 4;\n\t\t\ttreeNode3.Name = \"g15Node\";\n\t\t\ttreeNode3.SelectedImageIndex = 4;\n\t\t\ttreeNode3.Tag = \"g15Page\";\n\t\t\ttreeNode3.Text = \"Logitech Keyboards\";\n\t\t\ttreeNode4.ImageIndex = 15;\n\t\t\ttreeNode4.Name = \"PortableEveClientsNode\";\n\t\t\ttreeNode4.SelectedImageIndex = 15;\n\t\t\ttreeNode4.Tag = \"portableEveClientsPage\";\n\t\t\ttreeNode4.Text = \"Portable EVE Clients\";\n\t\t\ttreeNode5.ImageIndex = 16;\n\t\t\ttreeNode5.Name = \"MarketPriceProvidersNode\";\n\t\t\ttreeNode5.SelectedImageIndex = 16;\n\t\t\ttreeNode5.Tag = \"marketPriceProvidersPage\";\n\t\t\ttreeNode5.Text = \"Market Price Providers\";\n\t\t\ttreeNode6.ImageIndex = 10;\n\t\t\ttreeNode6.Name = \"generalNode\";\n\t\t\ttreeNode6.SelectedImageIndex = 10;\n\t\t\ttreeNode6.Tag = \"generalPage\";\n\t\t\ttreeNode6.Text = \"General\";\n\t\t\ttreeNode7.ImageIndex = 6;\n\t\t\ttreeNode7.Name = \"Node3\";\n\t\t\ttreeNode7.SelectedImageIndex = 6;\n\t\t\ttreeNode7.Tag = \"mainWindowPage\";\n\t\t\ttreeNode7.Text = \"Main Window\";\n\t\t\ttreeNode8.ImageIndex = 13;\n\t\t\ttreeNode8.Name = \"IconsNode\";\n\t\t\ttreeNode8.SelectedImageIndex = 13;\n\t\t\ttreeNode8.Tag = \"iconsPage\";\n\t\t\ttreeNode8.Text = \"Icons\";\n\t\t\ttreeNode9.ImageIndex = 14;\n\t\t\ttreeNode9.Name = \"MassagesNode\";\n\t\t\ttreeNode9.SelectedImageIndex = 14;\n\t\t\ttreeNode9.Tag = \"messagesPage\";\n\t\t\ttreeNode9.Text = \"Messages\";\n\t\t\ttreeNode10.ImageIndex = 8;\n\t\t\ttreeNode10.Name = \"Node4\";\n\t\t\ttreeNode10.SelectedImageIndex = 8;\n\t\t\ttreeNode10.Tag = \"skillPlannerPage\";\n\t\t\ttreeNode10.Text = \"Skill Planner\";\n\t\t\ttreeNode11.ImageIndex = 2;\n\t\t\ttreeNode11.Name = \"trayIconNode\";\n\t\t\ttreeNode11.SelectedImageIndex = 2;\n\t\t\ttreeNode11.Tag = \"trayIconPage\";\n\t\t\ttreeNode11.Text = \"System Tray Icon\";\n\t\t\ttreeNode12.ImageIndex = 5;\n\t\t\ttreeNode12.Name = \"Node11\";\n\t\t\ttreeNode12.SelectedImageIndex = 5;\n\t\t\ttreeNode12.Tag = \"externalCalendarPage\";\n\t\t\ttreeNode12.Text = \"External Calendar\";\n\t\t\ttreeNode13.ImageIndex = 1;\n\t\t\ttreeNode13.Name = \"Node10\";\n\t\t\ttreeNode13.SelectedImageIndex = 1;\n\t\t\ttreeNode13.Tag = \"schedulerUIPage\";\n\t\t\ttreeNode13.Text = \"Scheduler\";\n\t\t\ttreeNode14.ImageIndex = 12;\n\t\t\ttreeNode14.Name = \"Node7\";\n\t\t\ttreeNode14.SelectedImageIndex = 12;\n\t\t\ttreeNode14.Tag = \"emailNotificationsPage\";\n\t\t\ttreeNode14.Text = \"Skill Completion Mails\";\n\t\t\ttreeNode15.ImageIndex = 9;\n\t\t\ttreeNode15.Name = \"Node2\";\n\t\t\ttreeNode15.SelectedImageIndex = 9;\n\t\t\ttreeNode15.Tag = \"notificationsPage\";\n\t\t\ttreeNode15.Text = \"Notifications\";\n\t\t\ttreeNode16.ImageIndex = 17;\n\t\t\ttreeNode16.Name = \"CloudStorageServiceNode\";\n\t\t\ttreeNode16.SelectedImageIndex = 17;\n\t\t\ttreeNode16.Tag = \"cloudStorageServicePage\";\n\t\t\ttreeNode16.Text = \"Cloud Storage Service\";\n\t\t\tthis.treeView.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {\n            treeNode6,\n            treeNode7,\n            treeNode10,\n            treeNode11,\n            treeNode13,\n            treeNode15,\n            treeNode16});\n\t\t\tthis.treeView.SelectedImageIndex = 0;\n\t\t\tthis.treeView.ShowLines = false;\n\t\t\tthis.treeView.ShowPlusMinus = false;\n\t\t\tthis.treeView.ShowRootLines = false;\n\t\t\tthis.treeView.Size = new System.Drawing.Size(187, 424);\n\t\t\tthis.treeView.TabIndex = 6;\n\t\t\tthis.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);\n\t\t\t// \n\t\t\t// imageList\n\t\t\t// \n\t\t\tthis.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"imageList.ImageStream\")));\n\t\t\tthis.imageList.TransparentColor = System.Drawing.Color.Empty;\n\t\t\tthis.imageList.Images.SetKeyName(0, \"Transparent\");\n\t\t\tthis.imageList.Images.SetKeyName(1, \"Calendar\");\n\t\t\tthis.imageList.Images.SetKeyName(2, \"EVEMon\");\n\t\t\tthis.imageList.Images.SetKeyName(3, \"IGB\");\n\t\t\tthis.imageList.Images.SetKeyName(4, \"LogitechKeyboard\");\n\t\t\tthis.imageList.Images.SetKeyName(5, \"gcalendar\");\n\t\t\tthis.imageList.Images.SetKeyName(6, \"MainWindow\");\n\t\t\tthis.imageList.Images.SetKeyName(7, \"Network\");\n\t\t\tthis.imageList.Images.SetKeyName(8, \"Plan\");\n\t\t\tthis.imageList.Images.SetKeyName(9, \"Problem\");\n\t\t\tthis.imageList.Images.SetKeyName(10, \"Settings\");\n\t\t\tthis.imageList.Images.SetKeyName(11, \"Update\");\n\t\t\tthis.imageList.Images.SetKeyName(12, \"Email\");\n\t\t\tthis.imageList.Images.SetKeyName(13, \"book\");\n\t\t\tthis.imageList.Images.SetKeyName(14, \"messagebox\");\n\t\t\tthis.imageList.Images.SetKeyName(15, \"EveClient\");\n\t\t\tthis.imageList.Images.SetKeyName(16, \"Wallet\");\n\t\t\tthis.imageList.Images.SetKeyName(17, \"CloudStorage\");\n\t\t\t// \n\t\t\t// leftPanel\n\t\t\t// \n\t\t\tthis.leftPanel.BackColor = System.Drawing.SystemColors.ControlLightLight;\n\t\t\tthis.leftPanel.Controls.Add(this.treeView);\n\t\t\tthis.leftPanel.Dock = System.Windows.Forms.DockStyle.Left;\n\t\t\tthis.leftPanel.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.leftPanel.Name = \"leftPanel\";\n\t\t\tthis.leftPanel.Padding = new System.Windows.Forms.Padding(6);\n\t\t\tthis.leftPanel.Size = new System.Drawing.Size(199, 436);\n\t\t\tthis.leftPanel.TabIndex = 9;\n\t\t\t// \n\t\t\t// multiPanel\n\t\t\t// \n\t\t\tthis.multiPanel.CausesValidation = false;\n\t\t\tthis.multiPanel.Controls.Add(this.generalPage);\n\t\t\tthis.multiPanel.Controls.Add(this.mainWindowPage);\n\t\t\tthis.multiPanel.Controls.Add(this.skillPlannerPage);\n\t\t\tthis.multiPanel.Controls.Add(this.networkPage);\n\t\t\tthis.multiPanel.Controls.Add(this.emailNotificationsPage);\n\t\t\tthis.multiPanel.Controls.Add(this.notificationsPage);\n\t\t\tthis.multiPanel.Controls.Add(this.trayIconPage);\n\t\t\tthis.multiPanel.Controls.Add(this.updatesPage);\n\t\t\tthis.multiPanel.Controls.Add(this.schedulerUIPage);\n\t\t\tthis.multiPanel.Controls.Add(this.externalCalendarPage);\n\t\t\tthis.multiPanel.Controls.Add(this.g15Page);\n\t\t\tthis.multiPanel.Controls.Add(this.iconsPage);\n\t\t\tthis.multiPanel.Controls.Add(this.messagesPage);\n\t\t\tthis.multiPanel.Controls.Add(this.portableEveClientsPage);\n\t\t\tthis.multiPanel.Controls.Add(this.marketPriceProvidersPage);\n\t\t\tthis.multiPanel.Controls.Add(this.cloudStorageServicePage);\n\t\t\tthis.multiPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.multiPanel.Location = new System.Drawing.Point(199, 0);\n\t\t\tthis.multiPanel.Name = \"multiPanel\";\n\t\t\tthis.multiPanel.Padding = new System.Windows.Forms.Padding(5);\n\t\t\tthis.multiPanel.SelectedPage = this.mainWindowPage;\n\t\t\tthis.multiPanel.Size = new System.Drawing.Size(445, 436);\n\t\t\tthis.multiPanel.TabIndex = 7;\n\t\t\t// \n\t\t\t// generalPage\n\t\t\t// \n\t\t\tthis.generalPage.Controls.Add(this.btnEVEMonDataDir);\n\t\t\tthis.generalPage.Controls.Add(this.lblGeneralPage);\n\t\t\tthis.generalPage.Controls.Add(this.cbWorksafeMode);\n\t\t\tthis.generalPage.Controls.Add(this.compatibilityCombo);\n\t\t\tthis.generalPage.Controls.Add(this.lblEnvironment);\n\t\t\tthis.generalPage.Controls.Add(this.runAtStartupComboBox);\n\t\t\tthis.generalPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.generalPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.generalPage.Name = \"generalPage\";\n\t\t\tthis.generalPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.generalPage.TabIndex = 0;\n\t\t\tthis.generalPage.Text = \"generalPage\";\n\t\t\t// \n\t\t\t// btnEVEMonDataDir\n\t\t\t// \n\t\t\tthis.btnEVEMonDataDir.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.btnEVEMonDataDir.AutoSize = true;\n\t\t\tthis.btnEVEMonDataDir.Location = new System.Drawing.Point(296, 392);\n\t\t\tthis.btnEVEMonDataDir.Name = \"btnEVEMonDataDir\";\n\t\t\tthis.btnEVEMonDataDir.Size = new System.Drawing.Size(132, 23);\n\t\t\tthis.btnEVEMonDataDir.TabIndex = 21;\n\t\t\tthis.btnEVEMonDataDir.Text = \"EVEMon Data Directory\";\n\t\t\tthis.btnEVEMonDataDir.UseVisualStyleBackColor = true;\n\t\t\tthis.btnEVEMonDataDir.Click += new System.EventHandler(this.btnEVEMonDataDir_Click);\n\t\t\t// \n\t\t\t// cbWorksafeMode\n\t\t\t// \n\t\t\tthis.cbWorksafeMode.AutoSize = true;\n\t\t\tthis.cbWorksafeMode.Location = new System.Drawing.Point(3, 131);\n\t\t\tthis.cbWorksafeMode.Name = \"cbWorksafeMode\";\n\t\t\tthis.cbWorksafeMode.Size = new System.Drawing.Size(264, 17);\n\t\t\tthis.cbWorksafeMode.TabIndex = 6;\n\t\t\tthis.cbWorksafeMode.Text = \"Run in \\\"safe for work\\\" mode (no portraits or colors)\";\n\t\t\tthis.cbWorksafeMode.UseVisualStyleBackColor = true;\n\t\t\tthis.cbWorksafeMode.CheckedChanged += new System.EventHandler(this.OnMustEnableOrDisable);\n\t\t\t// \n\t\t\t// compatibilityCombo\n\t\t\t// \n\t\t\tthis.compatibilityCombo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.compatibilityCombo.FormattingEnabled = true;\n\t\t\tthis.compatibilityCombo.Items.AddRange(new object[] {\n            \"Windows\",\n            \"Wine\"});\n\t\t\tthis.compatibilityCombo.Location = new System.Drawing.Point(231, 178);\n\t\t\tthis.compatibilityCombo.Name = \"compatibilityCombo\";\n\t\t\tthis.compatibilityCombo.Size = new System.Drawing.Size(121, 21);\n\t\t\tthis.compatibilityCombo.TabIndex = 7;\n\t\t\t// \n\t\t\t// runAtStartupComboBox\n\t\t\t// \n\t\t\tthis.runAtStartupComboBox.AutoSize = true;\n\t\t\tthis.runAtStartupComboBox.Location = new System.Drawing.Point(3, 88);\n\t\t\tthis.runAtStartupComboBox.Name = \"runAtStartupComboBox\";\n\t\t\tthis.runAtStartupComboBox.Size = new System.Drawing.Size(140, 17);\n\t\t\tthis.runAtStartupComboBox.TabIndex = 5;\n\t\t\tthis.runAtStartupComboBox.Text = \"Run EVEMon at Startup\";\n\t\t\tthis.runAtStartupComboBox.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// mainWindowPage\n\t\t\t// \n\t\t\tthis.mainWindowPage.Controls.Add(this.lblMainWindowPage);\n\t\t\tthis.mainWindowPage.Controls.Add(this.OverviewGroupBox);\n\t\t\tthis.mainWindowPage.Controls.Add(this.CharacterMonitorGroupBox);\n\t\t\tthis.mainWindowPage.Controls.Add(this.WindowTitleGroupBox);\n\t\t\tthis.mainWindowPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.mainWindowPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.mainWindowPage.Name = \"mainWindowPage\";\n\t\t\tthis.mainWindowPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.mainWindowPage.TabIndex = 1;\n\t\t\tthis.mainWindowPage.Text = \"mainWindowPage\";\n\t\t\t// \n\t\t\t// OverviewGroupBox\n\t\t\t// \n\t\t\tthis.OverviewGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.OverviewGroupBox.Controls.Add(this.overviewPanel);\n\t\t\tthis.OverviewGroupBox.Controls.Add(this.cbShowOverViewTab);\n\t\t\tthis.OverviewGroupBox.Location = new System.Drawing.Point(1, 293);\n\t\t\tthis.OverviewGroupBox.Name = \"OverviewGroupBox\";\n\t\t\tthis.OverviewGroupBox.Size = new System.Drawing.Size(428, 127);\n\t\t\tthis.OverviewGroupBox.TabIndex = 15;\n\t\t\tthis.OverviewGroupBox.TabStop = false;\n\t\t\tthis.OverviewGroupBox.Text = \"Overview\";\n\t\t\t// \n\t\t\t// overviewPanel\n\t\t\t// \n\t\t\tthis.overviewPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.overviewPanel.Controls.Add(this.extraInfoComboBox);\n\t\t\tthis.overviewPanel.Controls.Add(this.cbShowSkillpointsOnOverview);\n\t\t\tthis.overviewPanel.Controls.Add(this.cbUseIncreasedContrastOnOverview);\n\t\t\tthis.overviewPanel.Controls.Add(this.overviewGroupCharactersInTrainingCheckBox);\n\t\t\tthis.overviewPanel.Controls.Add(this.overviewShowSkillQueueTrainingTimeCheckBox);\n\t\t\tthis.overviewPanel.Controls.Add(this.overviewShowWalletCheckBox);\n\t\t\tthis.overviewPanel.Controls.Add(this.lblSize);\n\t\t\tthis.overviewPanel.Controls.Add(this.overviewShowPortraitCheckBox);\n\t\t\tthis.overviewPanel.Controls.Add(this.overviewPortraitSizeComboBox);\n\t\t\tthis.overviewPanel.Location = new System.Drawing.Point(29, 36);\n\t\t\tthis.overviewPanel.Name = \"overviewPanel\";\n\t\t\tthis.overviewPanel.Size = new System.Drawing.Size(393, 85);\n\t\t\tthis.overviewPanel.TabIndex = 32;\n\t\t\t// \n\t\t\t// cbShowSkillpointsOnOverview\n\t\t\t// \n\t\t\tthis.cbShowSkillpointsOnOverview.AutoSize = true;\n\t\t\tthis.cbShowSkillpointsOnOverview.Location = new System.Drawing.Point(161, 20);\n\t\t\tthis.cbShowSkillpointsOnOverview.Name = \"cbShowSkillpointsOnOverview\";\n\t\t\tthis.cbShowSkillpointsOnOverview.Size = new System.Drawing.Size(107, 17);\n\t\t\tthis.cbShowSkillpointsOnOverview.TabIndex = 35;\n\t\t\tthis.cbShowSkillpointsOnOverview.Text = \"Show Skill Points\";\n\t\t\tthis.cbShowSkillpointsOnOverview.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// overviewPortraitSizeComboBox\n\t\t\t// \n\t\t\tthis.overviewPortraitSizeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.overviewPortraitSizeComboBox.FormattingEnabled = true;\n\t\t\tthis.overviewPortraitSizeComboBox.Location = new System.Drawing.Point(52, 49);\n\t\t\tthis.overviewPortraitSizeComboBox.Name = \"overviewPortraitSizeComboBox\";\n\t\t\tthis.overviewPortraitSizeComboBox.Size = new System.Drawing.Size(79, 21);\n\t\t\tthis.overviewPortraitSizeComboBox.TabIndex = 28;\n\t\t\t// \n\t\t\t// skillPlannerPage\n\t\t\t// \n\t\t\tthis.skillPlannerPage.Controls.Add(this.cbAdvanceEntryAdd);\n\t\t\tthis.skillPlannerPage.Controls.Add(this.cbSummaryOnMultiSelectOnly);\n\t\t\tthis.skillPlannerPage.Controls.Add(this.lblSkillPlannerPage);\n\t\t\tthis.skillPlannerPage.Controls.Add(this.cbHighlightQueuedSiklls);\n\t\t\tthis.skillPlannerPage.Controls.Add(this.cbHighlightPartialSkills);\n\t\t\tthis.skillPlannerPage.Controls.Add(this.cbHighlightConflicts);\n\t\t\tthis.skillPlannerPage.Controls.Add(this.cbHighlightPrerequisites);\n\t\t\tthis.skillPlannerPage.Controls.Add(this.cbHighlightPlannedSkills);\n\t\t\tthis.skillPlannerPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.skillPlannerPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.skillPlannerPage.Name = \"skillPlannerPage\";\n\t\t\tthis.skillPlannerPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.skillPlannerPage.TabIndex = 3;\n\t\t\tthis.skillPlannerPage.Text = \"skillPlannerPage\";\n\t\t\tthis.skillPlannerPage.Visible = false;\n\t\t\t// \n\t\t\t// cbAdvanceEntryAdd\n\t\t\t// \n\t\t\tthis.cbAdvanceEntryAdd.AutoSize = true;\n\t\t\tthis.cbAdvanceEntryAdd.Location = new System.Drawing.Point(14, 198);\n\t\t\tthis.cbAdvanceEntryAdd.Name = \"cbAdvanceEntryAdd\";\n\t\t\tthis.cbAdvanceEntryAdd.Size = new System.Drawing.Size(211, 17);\n\t\t\tthis.cbAdvanceEntryAdd.TabIndex = 21;\n\t\t\tthis.cbAdvanceEntryAdd.Text = \"Set Priority When Adding Skills To Plan\";\n\t\t\tthis.cbAdvanceEntryAdd.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbSummaryOnMultiSelectOnly\n\t\t\t// \n\t\t\tthis.cbSummaryOnMultiSelectOnly.AutoSize = true;\n\t\t\tthis.cbSummaryOnMultiSelectOnly.Location = new System.Drawing.Point(14, 175);\n\t\t\tthis.cbSummaryOnMultiSelectOnly.Name = \"cbSummaryOnMultiSelectOnly\";\n\t\t\tthis.cbSummaryOnMultiSelectOnly.Size = new System.Drawing.Size(232, 17);\n\t\t\tthis.cbSummaryOnMultiSelectOnly.TabIndex = 20;\n\t\t\tthis.cbSummaryOnMultiSelectOnly.Text = \"Show Plan Summary Only On \\\"Multi-Select\\\"\";\n\t\t\tthis.cbSummaryOnMultiSelectOnly.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbHighlightQueuedSiklls\n\t\t\t// \n\t\t\tthis.cbHighlightQueuedSiklls.AutoSize = true;\n\t\t\tthis.cbHighlightQueuedSiklls.Location = new System.Drawing.Point(14, 152);\n\t\t\tthis.cbHighlightQueuedSiklls.Name = \"cbHighlightQueuedSiklls\";\n\t\t\tthis.cbHighlightQueuedSiklls.Size = new System.Drawing.Size(135, 17);\n\t\t\tthis.cbHighlightQueuedSiklls.TabIndex = 14;\n\t\t\tthis.cbHighlightQueuedSiklls.Text = \"Highlight Queued Skills\";\n\t\t\tthis.cbHighlightQueuedSiklls.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbHighlightPartialSkills\n\t\t\t// \n\t\t\tthis.cbHighlightPartialSkills.AutoSize = true;\n\t\t\tthis.cbHighlightPartialSkills.Location = new System.Drawing.Point(14, 129);\n\t\t\tthis.cbHighlightPartialSkills.Name = \"cbHighlightPartialSkills\";\n\t\t\tthis.cbHighlightPartialSkills.Size = new System.Drawing.Size(172, 17);\n\t\t\tthis.cbHighlightPartialSkills.TabIndex = 10;\n\t\t\tthis.cbHighlightPartialSkills.Text = \"Highlight Partially Trained Skills\";\n\t\t\tthis.cbHighlightPartialSkills.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbHighlightConflicts\n\t\t\t// \n\t\t\tthis.cbHighlightConflicts.AutoSize = true;\n\t\t\tthis.cbHighlightConflicts.Location = new System.Drawing.Point(14, 83);\n\t\t\tthis.cbHighlightConflicts.Name = \"cbHighlightConflicts\";\n\t\t\tthis.cbHighlightConflicts.Size = new System.Drawing.Size(158, 17);\n\t\t\tthis.cbHighlightConflicts.TabIndex = 9;\n\t\t\tthis.cbHighlightConflicts.Text = \"Highlight Schedule Conflicts\";\n\t\t\tthis.cbHighlightConflicts.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbHighlightPrerequisites\n\t\t\t// \n\t\t\tthis.cbHighlightPrerequisites.AutoSize = true;\n\t\t\tthis.cbHighlightPrerequisites.Location = new System.Drawing.Point(14, 106);\n\t\t\tthis.cbHighlightPrerequisites.Name = \"cbHighlightPrerequisites\";\n\t\t\tthis.cbHighlightPrerequisites.Size = new System.Drawing.Size(130, 17);\n\t\t\tthis.cbHighlightPrerequisites.TabIndex = 8;\n\t\t\tthis.cbHighlightPrerequisites.Text = \"Highlight Prerequisites\";\n\t\t\tthis.cbHighlightPrerequisites.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbHighlightPlannedSkills\n\t\t\t// \n\t\t\tthis.cbHighlightPlannedSkills.AutoSize = true;\n\t\t\tthis.cbHighlightPlannedSkills.Location = new System.Drawing.Point(14, 60);\n\t\t\tthis.cbHighlightPlannedSkills.Name = \"cbHighlightPlannedSkills\";\n\t\t\tthis.cbHighlightPlannedSkills.Size = new System.Drawing.Size(136, 17);\n\t\t\tthis.cbHighlightPlannedSkills.TabIndex = 0;\n\t\t\tthis.cbHighlightPlannedSkills.Text = \"Highlight Planned Skills\";\n\t\t\tthis.cbHighlightPlannedSkills.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// networkPage\n\t\t\t// \n\t\t\tthis.networkPage.Controls.Add(this.esiSettingsGroupBox);\n\t\t\tthis.networkPage.Controls.Add(this.ProxyServerGroupBox);\n\t\t\tthis.networkPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.networkPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.networkPage.Name = \"networkPage\";\n\t\t\tthis.networkPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.networkPage.TabIndex = 4;\n\t\t\tthis.networkPage.Text = \"networkPage\";\n\t\t\tthis.networkPage.Visible = false;\n\t\t\t// \n\t\t\t// esiSettingsGroupBox\n\t\t\t// \n\t\t\tthis.esiSettingsGroupBox.Controls.Add(this.lblClientSecret);\n\t\t\tthis.esiSettingsGroupBox.Controls.Add(this.lblClientID);\n\t\t\tthis.esiSettingsGroupBox.Controls.Add(this.esiSettingsLabel);\n\t\t\tthis.esiSettingsGroupBox.Controls.Add(this.clientSecretTextBox);\n\t\t\tthis.esiSettingsGroupBox.Controls.Add(this.clientIDTextBox);\n\t\t\tthis.esiSettingsGroupBox.Location = new System.Drawing.Point(3, 194);\n\t\t\tthis.esiSettingsGroupBox.Name = \"esiSettingsGroupBox\";\n\t\t\tthis.esiSettingsGroupBox.Size = new System.Drawing.Size(409, 88);\n\t\t\tthis.esiSettingsGroupBox.TabIndex = 1;\n\t\t\tthis.esiSettingsGroupBox.TabStop = false;\n\t\t\tthis.esiSettingsGroupBox.Text = \"ESI Client Settings\";\n\t\t\t// \n\t\t\t// lblClientSecret\n\t\t\t// \n\t\t\tthis.lblClientSecret.AutoSize = true;\n\t\t\tthis.lblClientSecret.Location = new System.Drawing.Point(9, 62);\n\t\t\tthis.lblClientSecret.Name = \"lblClientSecret\";\n\t\t\tthis.lblClientSecret.Size = new System.Drawing.Size(67, 13);\n\t\t\tthis.lblClientSecret.TabIndex = 2;\n\t\t\tthis.lblClientSecret.Text = \"Client Secret\";\n\t\t\t// \n\t\t\t// lblClientID\n\t\t\t// \n\t\t\tthis.lblClientID.AutoSize = true;\n\t\t\tthis.lblClientID.Location = new System.Drawing.Point(29, 39);\n\t\t\tthis.lblClientID.Name = \"lblClientID\";\n\t\t\tthis.lblClientID.Size = new System.Drawing.Size(47, 13);\n\t\t\tthis.lblClientID.TabIndex = 2;\n\t\t\tthis.lblClientID.Text = \"Client ID\";\n\t\t\t// \n\t\t\t// esiSettingsLabel\n\t\t\t// \n\t\t\tthis.esiSettingsLabel.AutoSize = true;\n\t\t\tthis.esiSettingsLabel.LinkArea = new System.Windows.Forms.LinkArea(31, 40);\n\t\t\tthis.esiSettingsLabel.Location = new System.Drawing.Point(9, 16);\n\t\t\tthis.esiSettingsLabel.Name = \"esiSettingsLabel\";\n\t\t\tthis.esiSettingsLabel.Size = new System.Drawing.Size(364, 17);\n\t\t\tthis.esiSettingsLabel.TabIndex = 1;\n\t\t\tthis.esiSettingsLabel.TabStop = true;\n\t\t\tthis.esiSettingsLabel.Text = \"Create ESI client application: https://peterhaneve.github.io/evemon-esi\\r\\n\";\n\t\t\tthis.esiSettingsLabel.UseCompatibleTextRendering = true;\n\t\t\tthis.esiSettingsLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.esiSettingsLabel_LinkClicked);\n\t\t\t// \n\t\t\t// clientSecretTextBox\n\t\t\t// \n\t\t\tthis.clientSecretTextBox.Location = new System.Drawing.Point(82, 59);\n\t\t\tthis.clientSecretTextBox.Name = \"clientSecretTextBox\";\n\t\t\tthis.clientSecretTextBox.Size = new System.Drawing.Size(315, 20);\n\t\t\tthis.clientSecretTextBox.TabIndex = 7;\n\t\t\tthis.clientSecretTextBox.UseSystemPasswordChar = true;\n\t\t\t// \n\t\t\t// clientIDTextBox\n\t\t\t// \n\t\t\tthis.clientIDTextBox.Location = new System.Drawing.Point(82, 36);\n\t\t\tthis.clientIDTextBox.Name = \"clientIDTextBox\";\n\t\t\tthis.clientIDTextBox.Size = new System.Drawing.Size(315, 20);\n\t\t\tthis.clientIDTextBox.TabIndex = 6;\n\t\t\t// \n\t\t\t// ProxyServerGroupBox\n\t\t\t// \n\t\t\tthis.ProxyServerGroupBox.Controls.Add(this.customProxyCheckBox);\n\t\t\tthis.ProxyServerGroupBox.Controls.Add(this.lblNetworkPageProxy);\n\t\t\tthis.ProxyServerGroupBox.Controls.Add(this.customProxyPanel);\n\t\t\tthis.ProxyServerGroupBox.Location = new System.Drawing.Point(3, 31);\n\t\t\tthis.ProxyServerGroupBox.Name = \"ProxyServerGroupBox\";\n\t\t\tthis.ProxyServerGroupBox.Size = new System.Drawing.Size(409, 157);\n\t\t\tthis.ProxyServerGroupBox.TabIndex = 0;\n\t\t\tthis.ProxyServerGroupBox.TabStop = false;\n\t\t\tthis.ProxyServerGroupBox.Text = \"Proxy Server Settings\";\n\t\t\t// \n\t\t\t// customProxyCheckBox\n\t\t\t// \n\t\t\tthis.customProxyCheckBox.AutoSize = true;\n\t\t\tthis.customProxyCheckBox.Location = new System.Drawing.Point(9, 74);\n\t\t\tthis.customProxyCheckBox.Name = \"customProxyCheckBox\";\n\t\t\tthis.customProxyCheckBox.Size = new System.Drawing.Size(119, 17);\n\t\t\tthis.customProxyCheckBox.TabIndex = 9;\n\t\t\tthis.customProxyCheckBox.Text = \"Use a custom proxy\";\n\t\t\tthis.customProxyCheckBox.UseVisualStyleBackColor = true;\n\t\t\tthis.customProxyCheckBox.CheckedChanged += new System.EventHandler(this.OnMustEnableOrDisable);\n\t\t\t// \n\t\t\t// customProxyPanel\n\t\t\t// \n\t\t\tthis.customProxyPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.customProxyPanel.Controls.Add(this.proxyPortTextBox);\n\t\t\tthis.customProxyPanel.Controls.Add(this.lblProxyHostIPAddress);\n\t\t\tthis.customProxyPanel.Controls.Add(this.proxyAuthenticationButton);\n\t\t\tthis.customProxyPanel.Controls.Add(this.lblProxyPort);\n\t\t\tthis.customProxyPanel.Controls.Add(this.lblHTTP);\n\t\t\tthis.customProxyPanel.Controls.Add(this.proxyHttpHostTextBox);\n\t\t\tthis.customProxyPanel.Location = new System.Drawing.Point(17, 97);\n\t\t\tthis.customProxyPanel.Name = \"customProxyPanel\";\n\t\t\tthis.customProxyPanel.Size = new System.Drawing.Size(386, 54);\n\t\t\tthis.customProxyPanel.TabIndex = 6;\n\t\t\t// \n\t\t\t// proxyPortTextBox\n\t\t\t// \n\t\t\tthis.proxyPortTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.proxyPortTextBox.Location = new System.Drawing.Point(239, 24);\n\t\t\tthis.proxyPortTextBox.MaxLength = 5;\n\t\t\tthis.proxyPortTextBox.Name = \"proxyPortTextBox\";\n\t\t\tthis.proxyPortTextBox.Size = new System.Drawing.Size(38, 20);\n\t\t\tthis.proxyPortTextBox.TabIndex = 2;\n\t\t\tthis.proxyPortTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.proxyPortTextBox_Validating);\n\t\t\t// \n\t\t\t// proxyAuthenticationButton\n\t\t\t// \n\t\t\tthis.proxyAuthenticationButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.proxyAuthenticationButton.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n\t\t\tthis.proxyAuthenticationButton.Location = new System.Drawing.Point(283, 22);\n\t\t\tthis.proxyAuthenticationButton.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0);\n\t\t\tthis.proxyAuthenticationButton.Name = \"proxyAuthenticationButton\";\n\t\t\tthis.proxyAuthenticationButton.Size = new System.Drawing.Size(97, 23);\n\t\t\tthis.proxyAuthenticationButton.TabIndex = 5;\n\t\t\tthis.proxyAuthenticationButton.Text = \"Authentication...\";\n\t\t\tthis.proxyAuthenticationButton.UseVisualStyleBackColor = true;\n\t\t\tthis.proxyAuthenticationButton.Click += new System.EventHandler(this.proxyAuthenticationButton_Click);\n\t\t\t// \n\t\t\t// proxyHttpHostTextBox\n\t\t\t// \n\t\t\tthis.proxyHttpHostTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.proxyHttpHostTextBox.Location = new System.Drawing.Point(50, 24);\n\t\t\tthis.proxyHttpHostTextBox.Name = \"proxyHttpHostTextBox\";\n\t\t\tthis.proxyHttpHostTextBox.Size = new System.Drawing.Size(182, 20);\n\t\t\tthis.proxyHttpHostTextBox.TabIndex = 1;\n\t\t\t// \n\t\t\t// emailNotificationsPage\n\t\t\t// \n\t\t\tthis.emailNotificationsPage.Controls.Add(this.lblEmailNotificationPage);\n\t\t\tthis.emailNotificationsPage.Controls.Add(this.mailNotificationCheckBox);\n\t\t\tthis.emailNotificationsPage.Controls.Add(this.emailNotificationsControl);\n\t\t\tthis.emailNotificationsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.emailNotificationsPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.emailNotificationsPage.Name = \"emailNotificationsPage\";\n\t\t\tthis.emailNotificationsPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.emailNotificationsPage.TabIndex = 6;\n\t\t\tthis.emailNotificationsPage.Text = \"emailNotificationsPage\";\n\t\t\tthis.emailNotificationsPage.Visible = false;\n\t\t\t// \n\t\t\t// mailNotificationCheckBox\n\t\t\t// \n\t\t\tthis.mailNotificationCheckBox.AutoSize = true;\n\t\t\tthis.mailNotificationCheckBox.Location = new System.Drawing.Point(7, 51);\n\t\t\tthis.mailNotificationCheckBox.Name = \"mailNotificationCheckBox\";\n\t\t\tthis.mailNotificationCheckBox.Size = new System.Drawing.Size(215, 17);\n\t\t\tthis.mailNotificationCheckBox.TabIndex = 0;\n\t\t\tthis.mailNotificationCheckBox.Text = \"Send email when skill training completes\";\n\t\t\tthis.mailNotificationCheckBox.UseVisualStyleBackColor = true;\n\t\t\tthis.mailNotificationCheckBox.CheckedChanged += new System.EventHandler(this.OnMustEnableOrDisable);\n\t\t\t// \n\t\t\t// emailNotificationsControl\n\t\t\t// \n\t\t\tthis.emailNotificationsControl.Location = new System.Drawing.Point(7, 74);\n\t\t\tthis.emailNotificationsControl.Name = \"emailNotificationsControl\";\n\t\t\tthis.emailNotificationsControl.Settings = null;\n\t\t\tthis.emailNotificationsControl.Size = new System.Drawing.Size(355, 337);\n\t\t\tthis.emailNotificationsControl.TabIndex = 20;\n\t\t\t// \n\t\t\t// notificationsPage\n\t\t\t// \n\t\t\tthis.notificationsPage.Controls.Add(this.lblNotificationsPage);\n\t\t\tthis.notificationsPage.Controls.Add(this.cbPlaySoundOnSkillComplete);\n\t\t\tthis.notificationsPage.Controls.Add(this.notificationsControl);\n\t\t\tthis.notificationsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.notificationsPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.notificationsPage.Name = \"notificationsPage\";\n\t\t\tthis.notificationsPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.notificationsPage.TabIndex = 7;\n\t\t\tthis.notificationsPage.Text = \"notificationsPage\";\n\t\t\tthis.notificationsPage.Visible = false;\n\t\t\t// \n\t\t\t// cbPlaySoundOnSkillComplete\n\t\t\t// \n\t\t\tthis.cbPlaySoundOnSkillComplete.AutoSize = true;\n\t\t\tthis.cbPlaySoundOnSkillComplete.Location = new System.Drawing.Point(3, 401);\n\t\t\tthis.cbPlaySoundOnSkillComplete.Name = \"cbPlaySoundOnSkillComplete\";\n\t\t\tthis.cbPlaySoundOnSkillComplete.Size = new System.Drawing.Size(215, 17);\n\t\t\tthis.cbPlaySoundOnSkillComplete.TabIndex = 3;\n\t\t\tthis.cbPlaySoundOnSkillComplete.Text = \"Play sound when skill training completes\";\n\t\t\tthis.cbPlaySoundOnSkillComplete.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// notificationsControl\n\t\t\t// \n\t\t\tthis.notificationsControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.notificationsControl.AutoScroll = true;\n\t\t\tthis.notificationsControl.BackColor = System.Drawing.SystemColors.Window;\n\t\t\tthis.notificationsControl.Location = new System.Drawing.Point(3, 56);\n\t\t\tthis.notificationsControl.Name = \"notificationsControl\";\n\t\t\tthis.notificationsControl.Settings = null;\n\t\t\tthis.notificationsControl.Size = new System.Drawing.Size(429, 337);\n\t\t\tthis.notificationsControl.TabIndex = 4;\n\t\t\t// \n\t\t\t// trayIconPage\n\t\t\t// \n\t\t\tthis.trayIconPage.Controls.Add(this.lblTrayIconPage);\n\t\t\tthis.trayIconPage.Controls.Add(this.mainWindowBehaviourGroupBox);\n\t\t\tthis.trayIconPage.Controls.Add(this.trayIconPopupGroupBox);\n\t\t\tthis.trayIconPage.Controls.Add(this.systemTrayIconGroupBox);\n\t\t\tthis.trayIconPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.trayIconPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.trayIconPage.Name = \"trayIconPage\";\n\t\t\tthis.trayIconPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.trayIconPage.TabIndex = 8;\n\t\t\tthis.trayIconPage.Text = \"trayIconPage\";\n\t\t\tthis.trayIconPage.Visible = false;\n\t\t\t// \n\t\t\t// mainWindowBehaviourGroupBox\n\t\t\t// \n\t\t\tthis.mainWindowBehaviourGroupBox.Controls.Add(this.rbMinToTaskBar);\n\t\t\tthis.mainWindowBehaviourGroupBox.Controls.Add(this.rbMinToTray);\n\t\t\tthis.mainWindowBehaviourGroupBox.Controls.Add(this.rbExitEVEMon);\n\t\t\tthis.mainWindowBehaviourGroupBox.Location = new System.Drawing.Point(9, 307);\n\t\t\tthis.mainWindowBehaviourGroupBox.Name = \"mainWindowBehaviourGroupBox\";\n\t\t\tthis.mainWindowBehaviourGroupBox.Size = new System.Drawing.Size(419, 91);\n\t\t\tthis.mainWindowBehaviourGroupBox.TabIndex = 17;\n\t\t\tthis.mainWindowBehaviourGroupBox.TabStop = false;\n\t\t\tthis.mainWindowBehaviourGroupBox.Text = \"Main Window Close Behaviour\";\n\t\t\t// \n\t\t\t// rbMinToTaskBar\n\t\t\t// \n\t\t\tthis.rbMinToTaskBar.AutoSize = true;\n\t\t\tthis.rbMinToTaskBar.Location = new System.Drawing.Point(12, 66);\n\t\t\tthis.rbMinToTaskBar.Name = \"rbMinToTaskBar\";\n\t\t\tthis.rbMinToTaskBar.Size = new System.Drawing.Size(133, 17);\n\t\t\tthis.rbMinToTaskBar.TabIndex = 2;\n\t\t\tthis.rbMinToTaskBar.TabStop = true;\n\t\t\tthis.rbMinToTaskBar.Text = \"Minimize to the taskbar\";\n\t\t\tthis.rbMinToTaskBar.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// rbMinToTray\n\t\t\t// \n\t\t\tthis.rbMinToTray.AutoSize = true;\n\t\t\tthis.rbMinToTray.Location = new System.Drawing.Point(12, 43);\n\t\t\tthis.rbMinToTray.Name = \"rbMinToTray\";\n\t\t\tthis.rbMinToTray.Size = new System.Drawing.Size(150, 17);\n\t\t\tthis.rbMinToTray.TabIndex = 1;\n\t\t\tthis.rbMinToTray.TabStop = true;\n\t\t\tthis.rbMinToTray.Text = \"Minimize to the system tray\";\n\t\t\tthis.rbMinToTray.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// rbExitEVEMon\n\t\t\t// \n\t\t\tthis.rbExitEVEMon.AutoSize = true;\n\t\t\tthis.rbExitEVEMon.Location = new System.Drawing.Point(12, 20);\n\t\t\tthis.rbExitEVEMon.Name = \"rbExitEVEMon\";\n\t\t\tthis.rbExitEVEMon.Size = new System.Drawing.Size(87, 17);\n\t\t\tthis.rbExitEVEMon.TabIndex = 0;\n\t\t\tthis.rbExitEVEMon.TabStop = true;\n\t\t\tthis.rbExitEVEMon.Text = \"Exit EVEMon\";\n\t\t\tthis.rbExitEVEMon.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// trayIconPopupGroupBox\n\t\t\t// \n\t\t\tthis.trayIconPopupGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.trayIconPopupGroupBox.Controls.Add(this.trayPopupDisabledRadio);\n\t\t\tthis.trayIconPopupGroupBox.Controls.Add(this.trayPopupButton);\n\t\t\tthis.trayIconPopupGroupBox.Controls.Add(this.trayPopupRadio);\n\t\t\tthis.trayIconPopupGroupBox.Controls.Add(this.trayTooltipRadio);\n\t\t\tthis.trayIconPopupGroupBox.Controls.Add(this.trayTooltipButton);\n\t\t\tthis.trayIconPopupGroupBox.Location = new System.Drawing.Point(9, 184);\n\t\t\tthis.trayIconPopupGroupBox.Name = \"trayIconPopupGroupBox\";\n\t\t\tthis.trayIconPopupGroupBox.Size = new System.Drawing.Size(419, 104);\n\t\t\tthis.trayIconPopupGroupBox.TabIndex = 10;\n\t\t\tthis.trayIconPopupGroupBox.TabStop = false;\n\t\t\tthis.trayIconPopupGroupBox.Text = \"Icon Popup Style\";\n\t\t\t// \n\t\t\t// trayPopupDisabledRadio\n\t\t\t// \n\t\t\tthis.trayPopupDisabledRadio.AutoSize = true;\n\t\t\tthis.trayPopupDisabledRadio.Location = new System.Drawing.Point(6, 78);\n\t\t\tthis.trayPopupDisabledRadio.Name = \"trayPopupDisabledRadio\";\n\t\t\tthis.trayPopupDisabledRadio.Size = new System.Drawing.Size(66, 17);\n\t\t\tthis.trayPopupDisabledRadio.TabIndex = 5;\n\t\t\tthis.trayPopupDisabledRadio.TabStop = true;\n\t\t\tthis.trayPopupDisabledRadio.Text = \"Disabled\";\n\t\t\tthis.trayPopupDisabledRadio.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// trayPopupButton\n\t\t\t// \n\t\t\tthis.trayPopupButton.Location = new System.Drawing.Point(69, 46);\n\t\t\tthis.trayPopupButton.Name = \"trayPopupButton\";\n\t\t\tthis.trayPopupButton.Size = new System.Drawing.Size(75, 23);\n\t\t\tthis.trayPopupButton.TabIndex = 4;\n\t\t\tthis.trayPopupButton.Text = \"Configure\";\n\t\t\tthis.trayPopupButton.UseVisualStyleBackColor = true;\n\t\t\tthis.trayPopupButton.Click += new System.EventHandler(this.trayPopupButton_Click);\n\t\t\t// \n\t\t\t// trayPopupRadio\n\t\t\t// \n\t\t\tthis.trayPopupRadio.AutoSize = true;\n\t\t\tthis.trayPopupRadio.Location = new System.Drawing.Point(6, 49);\n\t\t\tthis.trayPopupRadio.Name = \"trayPopupRadio\";\n\t\t\tthis.trayPopupRadio.Size = new System.Drawing.Size(56, 17);\n\t\t\tthis.trayPopupRadio.TabIndex = 3;\n\t\t\tthis.trayPopupRadio.TabStop = true;\n\t\t\tthis.trayPopupRadio.Text = \"Popup\";\n\t\t\tthis.trayPopupRadio.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// trayTooltipRadio\n\t\t\t// \n\t\t\tthis.trayTooltipRadio.AutoSize = true;\n\t\t\tthis.trayTooltipRadio.Location = new System.Drawing.Point(6, 20);\n\t\t\tthis.trayTooltipRadio.Name = \"trayTooltipRadio\";\n\t\t\tthis.trayTooltipRadio.Size = new System.Drawing.Size(57, 17);\n\t\t\tthis.trayTooltipRadio.TabIndex = 0;\n\t\t\tthis.trayTooltipRadio.TabStop = true;\n\t\t\tthis.trayTooltipRadio.Text = \"Tooltip\";\n\t\t\tthis.trayTooltipRadio.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// trayTooltipButton\n\t\t\t// \n\t\t\tthis.trayTooltipButton.Location = new System.Drawing.Point(69, 17);\n\t\t\tthis.trayTooltipButton.Name = \"trayTooltipButton\";\n\t\t\tthis.trayTooltipButton.Size = new System.Drawing.Size(75, 23);\n\t\t\tthis.trayTooltipButton.TabIndex = 2;\n\t\t\tthis.trayTooltipButton.Text = \"Configure\";\n\t\t\tthis.trayTooltipButton.UseVisualStyleBackColor = true;\n\t\t\tthis.trayTooltipButton.Click += new System.EventHandler(this.trayTooltipButton_Click);\n\t\t\t// \n\t\t\t// updatesPage\n\t\t\t// \n\t\t\tthis.updatesPage.Controls.Add(this.updateSettingsControl);\n\t\t\tthis.updatesPage.Controls.Add(this.lblUpdatesPage);\n\t\t\tthis.updatesPage.Controls.Add(this.cbCheckTime);\n\t\t\tthis.updatesPage.Controls.Add(this.cbCheckForUpdates);\n\t\t\tthis.updatesPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.updatesPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.updatesPage.Name = \"updatesPage\";\n\t\t\tthis.updatesPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.updatesPage.TabIndex = 9;\n\t\t\tthis.updatesPage.Text = \"updatesPage\";\n\t\t\tthis.updatesPage.Visible = false;\n\t\t\t// \n\t\t\t// updateSettingsControl\n\t\t\t// \n\t\t\tthis.updateSettingsControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.updateSettingsControl.AutoScroll = true;\n\t\t\tthis.updateSettingsControl.Location = new System.Drawing.Point(11, 85);\n\t\t\tthis.updateSettingsControl.Name = \"updateSettingsControl\";\n\t\t\tthis.updateSettingsControl.Settings = null;\n\t\t\tthis.updateSettingsControl.Size = new System.Drawing.Size(413, 340);\n\t\t\tthis.updateSettingsControl.TabIndex = 10;\n\t\t\t// \n\t\t\t// lblUpdatesPage\n\t\t\t// \n\t\t\tthis.lblUpdatesPage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblUpdatesPage.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblUpdatesPage.Location = new System.Drawing.Point(3, 2);\n\t\t\tthis.lblUpdatesPage.Name = \"lblUpdatesPage\";\n\t\t\tthis.lblUpdatesPage.Size = new System.Drawing.Size(429, 34);\n\t\t\tthis.lblUpdatesPage.TabIndex = 9;\n\t\t\tthis.lblUpdatesPage.Text = \"The following settings help reducing the network load, especially for high-latenc\" +\n    \"y connections and clients with many characters.\";\n\t\t\t// \n\t\t\t// cbCheckTime\n\t\t\t// \n\t\t\tthis.cbCheckTime.AutoSize = true;\n\t\t\tthis.cbCheckTime.Location = new System.Drawing.Point(15, 39);\n\t\t\tthis.cbCheckTime.Name = \"cbCheckTime\";\n\t\t\tthis.cbCheckTime.Size = new System.Drawing.Size(146, 17);\n\t\t\tthis.cbCheckTime.TabIndex = 0;\n\t\t\tthis.cbCheckTime.Text = \"Check system clock sync\";\n\t\t\tthis.cbCheckTime.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbCheckForUpdates\n\t\t\t// \n\t\t\tthis.cbCheckForUpdates.AutoSize = true;\n\t\t\tthis.cbCheckForUpdates.Location = new System.Drawing.Point(15, 62);\n\t\t\tthis.cbCheckForUpdates.Name = \"cbCheckForUpdates\";\n\t\t\tthis.cbCheckForUpdates.Size = new System.Drawing.Size(158, 17);\n\t\t\tthis.cbCheckForUpdates.TabIndex = 0;\n\t\t\tthis.cbCheckForUpdates.Text = \"Check for EVEMon updates\";\n\t\t\tthis.cbCheckForUpdates.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// schedulerUIPage\n\t\t\t// \n\t\t\tthis.schedulerUIPage.Controls.Add(this.lblSchedulerUIPage);\n\t\t\tthis.schedulerUIPage.Controls.Add(this.panelColorText);\n\t\t\tthis.schedulerUIPage.Controls.Add(this.lblText);\n\t\t\tthis.schedulerUIPage.Controls.Add(this.panelColorRecurring2);\n\t\t\tthis.schedulerUIPage.Controls.Add(this.lblBlockingEvents);\n\t\t\tthis.schedulerUIPage.Controls.Add(this.panelColorRecurring1);\n\t\t\tthis.schedulerUIPage.Controls.Add(this.lblRecurringEvents);\n\t\t\tthis.schedulerUIPage.Controls.Add(this.panelColorSingle2);\n\t\t\tthis.schedulerUIPage.Controls.Add(this.lblSimpleEvents);\n\t\t\tthis.schedulerUIPage.Controls.Add(this.panelColorSingle1);\n\t\t\tthis.schedulerUIPage.Controls.Add(this.panelColorBlocking);\n\t\t\tthis.schedulerUIPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.schedulerUIPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.schedulerUIPage.Name = \"schedulerUIPage\";\n\t\t\tthis.schedulerUIPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.schedulerUIPage.TabIndex = 10;\n\t\t\tthis.schedulerUIPage.Text = \"schedulerUIPage\";\n\t\t\tthis.schedulerUIPage.Visible = false;\n\t\t\t// \n\t\t\t// panelColorText\n\t\t\t// \n\t\t\tthis.panelColorText.BackColor = System.Drawing.Color.White;\n\t\t\tthis.panelColorText.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n\t\t\tthis.panelColorText.Cursor = System.Windows.Forms.Cursors.Hand;\n\t\t\tthis.panelColorText.Location = new System.Drawing.Point(107, 105);\n\t\t\tthis.panelColorText.Name = \"panelColorText\";\n\t\t\tthis.panelColorText.Size = new System.Drawing.Size(43, 17);\n\t\t\tthis.panelColorText.TabIndex = 4;\n\t\t\tthis.panelColorText.Click += new System.EventHandler(this.colorPanel_Click);\n\t\t\t// \n\t\t\t// panelColorRecurring2\n\t\t\t// \n\t\t\tthis.panelColorRecurring2.BackColor = System.Drawing.Color.LightGreen;\n\t\t\tthis.panelColorRecurring2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n\t\t\tthis.panelColorRecurring2.Cursor = System.Windows.Forms.Cursors.Hand;\n\t\t\tthis.panelColorRecurring2.Location = new System.Drawing.Point(156, 176);\n\t\t\tthis.panelColorRecurring2.Name = \"panelColorRecurring2\";\n\t\t\tthis.panelColorRecurring2.Size = new System.Drawing.Size(43, 17);\n\t\t\tthis.panelColorRecurring2.TabIndex = 4;\n\t\t\tthis.panelColorRecurring2.Click += new System.EventHandler(this.colorPanel_Click);\n\t\t\t// \n\t\t\t// panelColorRecurring1\n\t\t\t// \n\t\t\tthis.panelColorRecurring1.BackColor = System.Drawing.Color.Green;\n\t\t\tthis.panelColorRecurring1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n\t\t\tthis.panelColorRecurring1.Cursor = System.Windows.Forms.Cursors.Hand;\n\t\t\tthis.panelColorRecurring1.Location = new System.Drawing.Point(107, 176);\n\t\t\tthis.panelColorRecurring1.Name = \"panelColorRecurring1\";\n\t\t\tthis.panelColorRecurring1.Size = new System.Drawing.Size(43, 17);\n\t\t\tthis.panelColorRecurring1.TabIndex = 4;\n\t\t\tthis.panelColorRecurring1.Click += new System.EventHandler(this.colorPanel_Click);\n\t\t\t// \n\t\t\t// panelColorSingle2\n\t\t\t// \n\t\t\tthis.panelColorSingle2.BackColor = System.Drawing.Color.LightBlue;\n\t\t\tthis.panelColorSingle2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n\t\t\tthis.panelColorSingle2.Cursor = System.Windows.Forms.Cursors.Hand;\n\t\t\tthis.panelColorSingle2.Location = new System.Drawing.Point(156, 153);\n\t\t\tthis.panelColorSingle2.Name = \"panelColorSingle2\";\n\t\t\tthis.panelColorSingle2.Size = new System.Drawing.Size(43, 17);\n\t\t\tthis.panelColorSingle2.TabIndex = 4;\n\t\t\tthis.panelColorSingle2.Click += new System.EventHandler(this.colorPanel_Click);\n\t\t\t// \n\t\t\t// panelColorSingle1\n\t\t\t// \n\t\t\tthis.panelColorSingle1.BackColor = System.Drawing.Color.Blue;\n\t\t\tthis.panelColorSingle1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n\t\t\tthis.panelColorSingle1.Cursor = System.Windows.Forms.Cursors.Hand;\n\t\t\tthis.panelColorSingle1.Location = new System.Drawing.Point(107, 153);\n\t\t\tthis.panelColorSingle1.Name = \"panelColorSingle1\";\n\t\t\tthis.panelColorSingle1.Size = new System.Drawing.Size(43, 17);\n\t\t\tthis.panelColorSingle1.TabIndex = 4;\n\t\t\tthis.panelColorSingle1.Click += new System.EventHandler(this.colorPanel_Click);\n\t\t\t// \n\t\t\t// panelColorBlocking\n\t\t\t// \n\t\t\tthis.panelColorBlocking.BackColor = System.Drawing.Color.Red;\n\t\t\tthis.panelColorBlocking.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n\t\t\tthis.panelColorBlocking.Cursor = System.Windows.Forms.Cursors.Hand;\n\t\t\tthis.panelColorBlocking.Location = new System.Drawing.Point(107, 128);\n\t\t\tthis.panelColorBlocking.Name = \"panelColorBlocking\";\n\t\t\tthis.panelColorBlocking.Size = new System.Drawing.Size(43, 17);\n\t\t\tthis.panelColorBlocking.TabIndex = 3;\n\t\t\tthis.panelColorBlocking.Click += new System.EventHandler(this.colorPanel_Click);\n\t\t\t// \n\t\t\t// externalCalendarPage\n\t\t\t// \n\t\t\tthis.externalCalendarPage.Controls.Add(this.externalCalendarControl);\n\t\t\tthis.externalCalendarPage.Controls.Add(this.lblExternalCalendarPage);\n\t\t\tthis.externalCalendarPage.Controls.Add(this.externalCalendarCheckbox);\n\t\t\tthis.externalCalendarPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.externalCalendarPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.externalCalendarPage.Name = \"externalCalendarPage\";\n\t\t\tthis.externalCalendarPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.externalCalendarPage.TabIndex = 11;\n\t\t\tthis.externalCalendarPage.Text = \"externalCalendarPage\";\n\t\t\tthis.externalCalendarPage.Visible = false;\n\t\t\t// \n\t\t\t// externalCalendarControl\n\t\t\t// \n\t\t\tthis.externalCalendarControl.Dock = System.Windows.Forms.DockStyle.Bottom;\n\t\t\tthis.externalCalendarControl.Enabled = false;\n\t\t\tthis.externalCalendarControl.Location = new System.Drawing.Point(0, 123);\n\t\t\tthis.externalCalendarControl.Name = \"externalCalendarControl\";\n\t\t\tthis.externalCalendarControl.Size = new System.Drawing.Size(435, 303);\n\t\t\tthis.externalCalendarControl.TabIndex = 12;\n\t\t\t// \n\t\t\t// externalCalendarCheckbox\n\t\t\t// \n\t\t\tthis.externalCalendarCheckbox.AutoSize = true;\n\t\t\tthis.externalCalendarCheckbox.CausesValidation = false;\n\t\t\tthis.externalCalendarCheckbox.Location = new System.Drawing.Point(6, 98);\n\t\t\tthis.externalCalendarCheckbox.Name = \"externalCalendarCheckbox\";\n\t\t\tthis.externalCalendarCheckbox.Size = new System.Drawing.Size(131, 17);\n\t\t\tthis.externalCalendarCheckbox.TabIndex = 0;\n\t\t\tthis.externalCalendarCheckbox.Text = \"Use External Calendar\";\n\t\t\tthis.externalCalendarCheckbox.UseVisualStyleBackColor = true;\n\t\t\tthis.externalCalendarCheckbox.Click += new System.EventHandler(this.OnMustEnableOrDisable);\n\t\t\t// \n\t\t\t// g15Page\n\t\t\t// \n\t\t\tthis.g15Page.Controls.Add(this.g15CheckBox);\n\t\t\tthis.g15Page.Controls.Add(this.lblG15Page);\n\t\t\tthis.g15Page.Controls.Add(this.g15Panel);\n\t\t\tthis.g15Page.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.g15Page.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.g15Page.Name = \"g15Page\";\n\t\t\tthis.g15Page.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.g15Page.TabIndex = 13;\n\t\t\tthis.g15Page.Text = \"g15Page\";\n\t\t\tthis.g15Page.Visible = false;\n\t\t\t// \n\t\t\t// g15CheckBox\n\t\t\t// \n\t\t\tthis.g15CheckBox.AutoSize = true;\n\t\t\tthis.g15CheckBox.Location = new System.Drawing.Point(6, 102);\n\t\t\tthis.g15CheckBox.Name = \"g15CheckBox\";\n\t\t\tthis.g15CheckBox.Size = new System.Drawing.Size(136, 17);\n\t\t\tthis.g15CheckBox.TabIndex = 0;\n\t\t\tthis.g15CheckBox.Text = \"Use G15/G510 Display\";\n\t\t\tthis.g15CheckBox.UseVisualStyleBackColor = true;\n\t\t\tthis.g15CheckBox.CheckedChanged += new System.EventHandler(this.OnMustEnableOrDisable);\n\t\t\t// \n\t\t\t// g15Panel\n\t\t\t// \n\t\t\tthis.g15Panel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n\t\t\tthis.g15Panel.Controls.Add(this.cbG15ShowEVETime);\n\t\t\tthis.g15Panel.Controls.Add(this.cbG15ShowTime);\n\t\t\tthis.g15Panel.Controls.Add(this.panelCycleQueueInfo);\n\t\t\tthis.g15Panel.Controls.Add(this.panelCycleCharInfo);\n\t\t\tthis.g15Panel.Location = new System.Drawing.Point(6, 125);\n\t\t\tthis.g15Panel.Margin = new System.Windows.Forms.Padding(0);\n\t\t\tthis.g15Panel.Name = \"g15Panel\";\n\t\t\tthis.g15Panel.Size = new System.Drawing.Size(399, 112);\n\t\t\tthis.g15Panel.TabIndex = 7;\n\t\t\t// \n\t\t\t// cbG15ShowEVETime\n\t\t\t// \n\t\t\tthis.cbG15ShowEVETime.AutoSize = true;\n\t\t\tthis.cbG15ShowEVETime.Location = new System.Drawing.Point(10, 59);\n\t\t\tthis.cbG15ShowEVETime.Name = \"cbG15ShowEVETime\";\n\t\t\tthis.cbG15ShowEVETime.Size = new System.Drawing.Size(103, 17);\n\t\t\tthis.cbG15ShowEVETime.TabIndex = 9;\n\t\t\tthis.cbG15ShowEVETime.Text = \"Show EVE Time\";\n\t\t\tthis.cbG15ShowEVETime.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// cbG15ShowTime\n\t\t\t// \n\t\t\tthis.cbG15ShowTime.AutoSize = true;\n\t\t\tthis.cbG15ShowTime.Location = new System.Drawing.Point(114, 59);\n\t\t\tthis.cbG15ShowTime.Name = \"cbG15ShowTime\";\n\t\t\tthis.cbG15ShowTime.Size = new System.Drawing.Size(116, 17);\n\t\t\tthis.cbG15ShowTime.TabIndex = 8;\n\t\t\tthis.cbG15ShowTime.Text = \"Show System Time\";\n\t\t\tthis.cbG15ShowTime.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// panelCycleQueueInfo\n\t\t\t// \n\t\t\tthis.panelCycleQueueInfo.AutoSize = true;\n\t\t\tthis.panelCycleQueueInfo.Controls.Add(this.cbG15CycleTimes);\n\t\t\tthis.panelCycleQueueInfo.Controls.Add(this.ACycleTimesInterval);\n\t\t\tthis.panelCycleQueueInfo.Controls.Add(this.lblCycleTrainingSeconds);\n\t\t\tthis.panelCycleQueueInfo.Location = new System.Drawing.Point(7, 29);\n\t\t\tthis.panelCycleQueueInfo.Name = \"panelCycleQueueInfo\";\n\t\t\tthis.panelCycleQueueInfo.Size = new System.Drawing.Size(315, 28);\n\t\t\tthis.panelCycleQueueInfo.TabIndex = 7;\n\t\t\t// \n\t\t\t// cbG15CycleTimes\n\t\t\t// \n\t\t\tthis.cbG15CycleTimes.AutoSize = true;\n\t\t\tthis.cbG15CycleTimes.Location = new System.Drawing.Point(3, 5);\n\t\t\tthis.cbG15CycleTimes.Margin = new System.Windows.Forms.Padding(3, 5, 0, 3);\n\t\t\tthis.cbG15CycleTimes.Name = \"cbG15CycleTimes\";\n\t\t\tthis.cbG15CycleTimes.Size = new System.Drawing.Size(212, 17);\n\t\t\tthis.cbG15CycleTimes.TabIndex = 7;\n\t\t\tthis.cbG15CycleTimes.Text = \"Cycle Characters Skill Queue info every\";\n\t\t\tthis.cbG15CycleTimes.UseVisualStyleBackColor = true;\n\t\t\tthis.cbG15CycleTimes.CheckedChanged += new System.EventHandler(this.OnMustEnableOrDisable);\n\t\t\t// \n\t\t\t// ACycleTimesInterval\n\t\t\t// \n\t\t\tthis.ACycleTimesInterval.AutoSize = true;\n\t\t\tthis.ACycleTimesInterval.Location = new System.Drawing.Point(221, 4);\n\t\t\tthis.ACycleTimesInterval.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);\n\t\t\tthis.ACycleTimesInterval.Maximum = new decimal(new int[] {\n            120,\n            0,\n            0,\n            0});\n\t\t\tthis.ACycleTimesInterval.Minimum = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n\t\t\tthis.ACycleTimesInterval.Name = \"ACycleTimesInterval\";\n\t\t\tthis.ACycleTimesInterval.Size = new System.Drawing.Size(45, 20);\n\t\t\tthis.ACycleTimesInterval.TabIndex = 8;\n\t\t\tthis.ACycleTimesInterval.Value = new decimal(new int[] {\n            10,\n            0,\n            0,\n            0});\n\t\t\t// \n\t\t\t// panelCycleCharInfo\n\t\t\t// \n\t\t\tthis.panelCycleCharInfo.AutoSize = true;\n\t\t\tthis.panelCycleCharInfo.Controls.Add(this.cbG15ACycle);\n\t\t\tthis.panelCycleCharInfo.Controls.Add(this.ACycleInterval);\n\t\t\tthis.panelCycleCharInfo.Controls.Add(this.lblG15CycleCharSeconds);\n\t\t\tthis.panelCycleCharInfo.Location = new System.Drawing.Point(7, 3);\n\t\t\tthis.panelCycleCharInfo.Name = \"panelCycleCharInfo\";\n\t\t\tthis.panelCycleCharInfo.Size = new System.Drawing.Size(236, 28);\n\t\t\tthis.panelCycleCharInfo.TabIndex = 6;\n\t\t\t// \n\t\t\t// cbG15ACycle\n\t\t\t// \n\t\t\tthis.cbG15ACycle.AutoSize = true;\n\t\t\tthis.cbG15ACycle.Location = new System.Drawing.Point(3, 5);\n\t\t\tthis.cbG15ACycle.Margin = new System.Windows.Forms.Padding(3, 5, 0, 3);\n\t\t\tthis.cbG15ACycle.Name = \"cbG15ACycle\";\n\t\t\tthis.cbG15ACycle.Size = new System.Drawing.Size(135, 17);\n\t\t\tthis.cbG15ACycle.TabIndex = 4;\n\t\t\tthis.cbG15ACycle.Text = \"Cycle Characters every\";\n\t\t\tthis.cbG15ACycle.UseVisualStyleBackColor = true;\n\t\t\tthis.cbG15ACycle.CheckedChanged += new System.EventHandler(this.OnMustEnableOrDisable);\n\t\t\t// \n\t\t\t// ACycleInterval\n\t\t\t// \n\t\t\tthis.ACycleInterval.AutoSize = true;\n\t\t\tthis.ACycleInterval.Location = new System.Drawing.Point(142, 4);\n\t\t\tthis.ACycleInterval.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);\n\t\t\tthis.ACycleInterval.Maximum = new decimal(new int[] {\n            120,\n            0,\n            0,\n            0});\n\t\t\tthis.ACycleInterval.Minimum = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n\t\t\tthis.ACycleInterval.Name = \"ACycleInterval\";\n\t\t\tthis.ACycleInterval.Size = new System.Drawing.Size(45, 20);\n\t\t\tthis.ACycleInterval.TabIndex = 5;\n\t\t\tthis.ACycleInterval.Value = new decimal(new int[] {\n            20,\n            0,\n            0,\n            0});\n\t\t\tthis.ACycleInterval.ValueChanged += new System.EventHandler(this.ACycleInterval_ValueChanged);\n\t\t\t// \n\t\t\t// iconsPage\n\t\t\t// \n\t\t\tthis.iconsPage.Controls.Add(this.lblIconsPage);\n\t\t\tthis.iconsPage.Controls.Add(this.gbSkillBrowserIconSet);\n\t\t\tthis.iconsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.iconsPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.iconsPage.Name = \"iconsPage\";\n\t\t\tthis.iconsPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.iconsPage.TabIndex = 16;\n\t\t\tthis.iconsPage.Text = \"iconsPage\";\n\t\t\t// \n\t\t\t// messagesPage\n\t\t\t// \n\t\t\tthis.messagesPage.Controls.Add(this.gbMessageBox);\n\t\t\tthis.messagesPage.Controls.Add(this.lblObsoletePlanEntries);\n\t\t\tthis.messagesPage.Controls.Add(this.ObsoleteEntryRemovalGroupBox);\n\t\t\tthis.messagesPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.messagesPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.messagesPage.Name = \"messagesPage\";\n\t\t\tthis.messagesPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.messagesPage.TabIndex = 17;\n\t\t\tthis.messagesPage.Text = \"messagesPage\";\n\t\t\t// \n\t\t\t// gbMessageBox\n\t\t\t// \n\t\t\tthis.gbMessageBox.Controls.Add(this.lblPrioritesConflict);\n\t\t\tthis.gbMessageBox.Controls.Add(this.btnPrioritiesReset);\n\t\t\tthis.gbMessageBox.Location = new System.Drawing.Point(5, 314);\n\t\t\tthis.gbMessageBox.Name = \"gbMessageBox\";\n\t\t\tthis.gbMessageBox.Size = new System.Drawing.Size(424, 58);\n\t\t\tthis.gbMessageBox.TabIndex = 25;\n\t\t\tthis.gbMessageBox.TabStop = false;\n\t\t\tthis.gbMessageBox.Text = \"Pop-up Messages\";\n\t\t\t// \n\t\t\t// lblPrioritesConflict\n\t\t\t// \n\t\t\tthis.lblPrioritesConflict.AutoSize = true;\n\t\t\tthis.lblPrioritesConflict.Location = new System.Drawing.Point(20, 25);\n\t\t\tthis.lblPrioritesConflict.Name = \"lblPrioritesConflict\";\n\t\t\tthis.lblPrioritesConflict.Size = new System.Drawing.Size(84, 13);\n\t\t\tthis.lblPrioritesConflict.TabIndex = 1;\n\t\t\tthis.lblPrioritesConflict.Text = \"Priorities Conflict\";\n\t\t\t// \n\t\t\t// btnPrioritiesReset\n\t\t\t// \n\t\t\tthis.btnPrioritiesReset.Location = new System.Drawing.Point(332, 20);\n\t\t\tthis.btnPrioritiesReset.Name = \"btnPrioritiesReset\";\n\t\t\tthis.btnPrioritiesReset.Size = new System.Drawing.Size(75, 23);\n\t\t\tthis.btnPrioritiesReset.TabIndex = 0;\n\t\t\tthis.btnPrioritiesReset.Text = \"Reset\";\n\t\t\tthis.btnPrioritiesReset.UseVisualStyleBackColor = true;\n\t\t\tthis.btnPrioritiesReset.Click += new System.EventHandler(this.btnPrioritiesReset_Click);\n\t\t\t// \n\t\t\t// ObsoleteEntryRemovalGroupBox\n\t\t\t// \n\t\t\tthis.ObsoleteEntryRemovalGroupBox.Controls.Add(this.RemoveAllLabel);\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.Controls.Add(this.AlwaysAskLabel);\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.Controls.Add(this.RemoveConfirmedLabel);\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.Controls.Add(this.alwaysAskRadioButton);\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.Controls.Add(this.removeAllRadioButton);\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.Controls.Add(this.removeConfirmedRadioButton);\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.Location = new System.Drawing.Point(5, 120);\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.Name = \"ObsoleteEntryRemovalGroupBox\";\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.Size = new System.Drawing.Size(425, 187);\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.TabIndex = 23;\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.TabStop = false;\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.Text = \"Obsolete Plan Entry Removal\";\n\t\t\t// \n\t\t\t// RemoveAllLabel\n\t\t\t// \n\t\t\tthis.RemoveAllLabel.Location = new System.Drawing.Point(24, 144);\n\t\t\tthis.RemoveAllLabel.Name = \"RemoveAllLabel\";\n\t\t\tthis.RemoveAllLabel.Size = new System.Drawing.Size(394, 27);\n\t\t\tthis.RemoveAllLabel.TabIndex = 5;\n\t\t\tthis.RemoveAllLabel.Text = \"If EVEMon believes a skill level has been completed, whether it has been confirme\" +\n    \"d by the API or not it will be removed when the plan is opened.\";\n\t\t\t// \n\t\t\t// AlwaysAskLabel\n\t\t\t// \n\t\t\tthis.AlwaysAskLabel.Location = new System.Drawing.Point(24, 91);\n\t\t\tthis.AlwaysAskLabel.Name = \"AlwaysAskLabel\";\n\t\t\tthis.AlwaysAskLabel.Size = new System.Drawing.Size(394, 27);\n\t\t\tthis.AlwaysAskLabel.TabIndex = 4;\n\t\t\tthis.AlwaysAskLabel.Text = \"Always display the \\\"Obsolete Entries\\\" link at the bottom of the skill planner bef\" +\n    \"ore removing entries.\";\n\t\t\t// \n\t\t\t// RemoveConfirmedLabel\n\t\t\t// \n\t\t\tthis.RemoveConfirmedLabel.Location = new System.Drawing.Point(24, 39);\n\t\t\tthis.RemoveConfirmedLabel.Name = \"RemoveConfirmedLabel\";\n\t\t\tthis.RemoveConfirmedLabel.Size = new System.Drawing.Size(394, 27);\n\t\t\tthis.RemoveConfirmedLabel.TabIndex = 3;\n\t\t\tthis.RemoveConfirmedLabel.Text = \"Once the API has confirmed a skill level has completed it is removed the next tim\" +\n    \"e a plan is opened. This is the default behaviour.\";\n\t\t\t// \n\t\t\t// alwaysAskRadioButton\n\t\t\t// \n\t\t\tthis.alwaysAskRadioButton.AutoSize = true;\n\t\t\tthis.alwaysAskRadioButton.Location = new System.Drawing.Point(7, 73);\n\t\t\tthis.alwaysAskRadioButton.Name = \"alwaysAskRadioButton\";\n\t\t\tthis.alwaysAskRadioButton.Size = new System.Drawing.Size(78, 17);\n\t\t\tthis.alwaysAskRadioButton.TabIndex = 2;\n\t\t\tthis.alwaysAskRadioButton.TabStop = true;\n\t\t\tthis.alwaysAskRadioButton.Text = \"Always ask\";\n\t\t\tthis.alwaysAskRadioButton.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// removeAllRadioButton\n\t\t\t// \n\t\t\tthis.removeAllRadioButton.AutoSize = true;\n\t\t\tthis.removeAllRadioButton.Location = new System.Drawing.Point(7, 126);\n\t\t\tthis.removeAllRadioButton.Name = \"removeAllRadioButton\";\n\t\t\tthis.removeAllRadioButton.Size = new System.Drawing.Size(206, 17);\n\t\t\tthis.removeAllRadioButton.TabIndex = 1;\n\t\t\tthis.removeAllRadioButton.TabStop = true;\n\t\t\tthis.removeAllRadioButton.Text = \"Remove entry once training completes\";\n\t\t\tthis.removeAllRadioButton.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// removeConfirmedRadioButton\n\t\t\t// \n\t\t\tthis.removeConfirmedRadioButton.AutoSize = true;\n\t\t\tthis.removeConfirmedRadioButton.Location = new System.Drawing.Point(7, 21);\n\t\t\tthis.removeConfirmedRadioButton.Name = \"removeConfirmedRadioButton\";\n\t\t\tthis.removeConfirmedRadioButton.Size = new System.Drawing.Size(221, 17);\n\t\t\tthis.removeConfirmedRadioButton.TabIndex = 0;\n\t\t\tthis.removeConfirmedRadioButton.TabStop = true;\n\t\t\tthis.removeConfirmedRadioButton.Text = \"Remove confirmed entry (Recommended)\";\n\t\t\tthis.removeConfirmedRadioButton.UseVisualStyleBackColor = true;\n\t\t\t// \n\t\t\t// portableEveClientsPage\n\t\t\t// \n\t\t\tthis.portableEveClientsPage.Controls.Add(this.lblPECIDescription);\n\t\t\tthis.portableEveClientsPage.Controls.Add(this.PECIGroupBox);\n\t\t\tthis.portableEveClientsPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.portableEveClientsPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.portableEveClientsPage.Name = \"portableEveClientsPage\";\n\t\t\tthis.portableEveClientsPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.portableEveClientsPage.TabIndex = 20;\n\t\t\tthis.portableEveClientsPage.Text = \"portableEveClientsPage\";\n\t\t\t// \n\t\t\t// lblPECIDescription\n\t\t\t// \n\t\t\tthis.lblPECIDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.lblPECIDescription.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.lblPECIDescription.Location = new System.Drawing.Point(4, 15);\n\t\t\tthis.lblPECIDescription.Name = \"lblPECIDescription\";\n\t\t\tthis.lblPECIDescription.Size = new System.Drawing.Size(424, 95);\n\t\t\tthis.lblPECIDescription.TabIndex = 21;\n\t\t\tthis.lblPECIDescription.Text = resources.GetString(\"lblPECIDescription.Text\");\n\t\t\t// \n\t\t\t// PECIGroupBox\n\t\t\t// \n\t\t\tthis.PECIGroupBox.Controls.Add(this.portableEveClientsControl);\n\t\t\tthis.PECIGroupBox.Location = new System.Drawing.Point(7, 129);\n\t\t\tthis.PECIGroupBox.Name = \"PECIGroupBox\";\n\t\t\tthis.PECIGroupBox.Size = new System.Drawing.Size(421, 283);\n\t\t\tthis.PECIGroupBox.TabIndex = 0;\n\t\t\tthis.PECIGroupBox.TabStop = false;\n\t\t\tthis.PECIGroupBox.Text = \"Portable EVE Client Installations\";\n\t\t\t// \n\t\t\t// portableEveClientsControl\n\t\t\t// \n\t\t\tthis.portableEveClientsControl.AutoScroll = true;\n\t\t\tthis.portableEveClientsControl.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.portableEveClientsControl.Location = new System.Drawing.Point(3, 16);\n\t\t\tthis.portableEveClientsControl.Name = \"portableEveClientsControl\";\n\t\t\tthis.portableEveClientsControl.Size = new System.Drawing.Size(415, 264);\n\t\t\tthis.portableEveClientsControl.TabIndex = 0;\n\t\t\t// \n\t\t\t// marketPriceProvidersPage\n\t\t\t// \n\t\t\tthis.marketPriceProvidersPage.Controls.Add(this.gbMarketPriceProviders);\n\t\t\tthis.marketPriceProvidersPage.Controls.Add(this.marketPriceProviderPageLabel);\n\t\t\tthis.marketPriceProvidersPage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.marketPriceProvidersPage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.marketPriceProvidersPage.Name = \"marketPriceProvidersPage\";\n\t\t\tthis.marketPriceProvidersPage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.marketPriceProvidersPage.TabIndex = 21;\n\t\t\tthis.marketPriceProvidersPage.Text = \"marketPriceProvidersPage\";\n\t\t\t// \n\t\t\t// gbMarketPriceProviders\n\t\t\t// \n\t\t\tthis.gbMarketPriceProviders.Controls.Add(this.cbProvidersList);\n\t\t\tthis.gbMarketPriceProviders.Controls.Add(this.SelectedProviderLabel);\n\t\t\tthis.gbMarketPriceProviders.Location = new System.Drawing.Point(3, 68);\n\t\t\tthis.gbMarketPriceProviders.Name = \"gbMarketPriceProviders\";\n\t\t\tthis.gbMarketPriceProviders.Size = new System.Drawing.Size(214, 67);\n\t\t\tthis.gbMarketPriceProviders.TabIndex = 22;\n\t\t\tthis.gbMarketPriceProviders.TabStop = false;\n\t\t\tthis.gbMarketPriceProviders.Text = \"Market Price Provider\";\n\t\t\t// \n\t\t\t// cbProvidersList\n\t\t\t// \n\t\t\tthis.cbProvidersList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.cbProvidersList.FormattingEnabled = true;\n\t\t\tthis.cbProvidersList.Location = new System.Drawing.Point(61, 28);\n\t\t\tthis.cbProvidersList.Name = \"cbProvidersList\";\n\t\t\tthis.cbProvidersList.Size = new System.Drawing.Size(147, 21);\n\t\t\tthis.cbProvidersList.TabIndex = 1;\n\t\t\t// \n\t\t\t// SelectedProviderLabel\n\t\t\t// \n\t\t\tthis.SelectedProviderLabel.AutoSize = true;\n\t\t\tthis.SelectedProviderLabel.Location = new System.Drawing.Point(6, 31);\n\t\t\tthis.SelectedProviderLabel.Name = \"SelectedProviderLabel\";\n\t\t\tthis.SelectedProviderLabel.Size = new System.Drawing.Size(49, 13);\n\t\t\tthis.SelectedProviderLabel.TabIndex = 0;\n\t\t\tthis.SelectedProviderLabel.Text = \"Provider:\";\n\t\t\t// \n\t\t\t// marketPriceProviderPageLabel\n\t\t\t// \n\t\t\tthis.marketPriceProviderPageLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.marketPriceProviderPageLabel.AutoSize = true;\n\t\t\tthis.marketPriceProviderPageLabel.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.marketPriceProviderPageLabel.Location = new System.Drawing.Point(3, 38);\n\t\t\tthis.marketPriceProviderPageLabel.Name = \"marketPriceProviderPageLabel\";\n\t\t\tthis.marketPriceProviderPageLabel.Size = new System.Drawing.Size(294, 13);\n\t\t\tthis.marketPriceProviderPageLabel.TabIndex = 21;\n\t\t\tthis.marketPriceProviderPageLabel.Text = \"Request prices for all EVE items from a market price provider.\";\n\t\t\t// \n\t\t\t// cloudStorageServicePage\n\t\t\t// \n\t\t\tthis.cloudStorageServicePage.Controls.Add(this.providerAuthenticationGroupBox);\n\t\t\tthis.cloudStorageServicePage.Controls.Add(this.cloudStorageGroupBox);\n\t\t\tthis.cloudStorageServicePage.Controls.Add(this.linkLabel1);\n\t\t\tthis.cloudStorageServicePage.Controls.Add(this.settingsFileStorageGroupBox);\n\t\t\tthis.cloudStorageServicePage.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.cloudStorageServicePage.Location = new System.Drawing.Point(5, 5);\n\t\t\tthis.cloudStorageServicePage.Name = \"cloudStorageServicePage\";\n\t\t\tthis.cloudStorageServicePage.Size = new System.Drawing.Size(435, 426);\n\t\t\tthis.cloudStorageServicePage.TabIndex = 22;\n\t\t\tthis.cloudStorageServicePage.Text = \"cloudStorageServicePage\";\n\t\t\t// \n\t\t\t// providerAuthenticationGroupBox\n\t\t\t// \n\t\t\tthis.providerAuthenticationGroupBox.Controls.Add(this.cloudStorageServiceControl);\n\t\t\tthis.providerAuthenticationGroupBox.Location = new System.Drawing.Point(6, 288);\n\t\t\tthis.providerAuthenticationGroupBox.Name = \"providerAuthenticationGroupBox\";\n\t\t\tthis.providerAuthenticationGroupBox.Size = new System.Drawing.Size(421, 128);\n\t\t\tthis.providerAuthenticationGroupBox.TabIndex = 24;\n\t\t\tthis.providerAuthenticationGroupBox.TabStop = false;\n\t\t\tthis.providerAuthenticationGroupBox.Text = \"Cloud Storage Provider Authentication\";\n\t\t\t// \n\t\t\t// cloudStorageServiceControl\n\t\t\t// \n\t\t\tthis.cloudStorageServiceControl.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.cloudStorageServiceControl.Font = new System.Drawing.Font(\"Tahoma\", 8.25F);\n\t\t\tthis.cloudStorageServiceControl.Location = new System.Drawing.Point(3, 16);\n\t\t\tthis.cloudStorageServiceControl.Name = \"cloudStorageServiceControl\";\n\t\t\tthis.cloudStorageServiceControl.Size = new System.Drawing.Size(415, 109);\n\t\t\tthis.cloudStorageServiceControl.TabIndex = 0;\n\t\t\t// \n\t\t\t// cloudStorageGroupBox\n\t\t\t// \n\t\t\tthis.cloudStorageGroupBox.Controls.Add(this.cloudStorageProviderLogoPictureBox);\n\t\t\tthis.cloudStorageGroupBox.Controls.Add(this.cloudStorageProvidersComboBox);\n\t\t\tthis.cloudStorageGroupBox.Controls.Add(this.lblSelectedProvider);\n\t\t\tthis.cloudStorageGroupBox.Location = new System.Drawing.Point(6, 81);\n\t\t\tthis.cloudStorageGroupBox.Name = \"cloudStorageGroupBox\";\n\t\t\tthis.cloudStorageGroupBox.Size = new System.Drawing.Size(232, 67);\n\t\t\tthis.cloudStorageGroupBox.TabIndex = 23;\n\t\t\tthis.cloudStorageGroupBox.TabStop = false;\n\t\t\tthis.cloudStorageGroupBox.Text = \"Cloud Storage Provider\";\n\t\t\t// \n\t\t\t// cloudStorageProviderLogoPictureBox\n\t\t\t// \n\t\t\tthis.cloudStorageProviderLogoPictureBox.Location = new System.Drawing.Point(176, 11);\n\t\t\tthis.cloudStorageProviderLogoPictureBox.Name = \"cloudStorageProviderLogoPictureBox\";\n\t\t\tthis.cloudStorageProviderLogoPictureBox.Size = new System.Drawing.Size(50, 50);\n\t\t\tthis.cloudStorageProviderLogoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;\n\t\t\tthis.cloudStorageProviderLogoPictureBox.TabIndex = 2;\n\t\t\tthis.cloudStorageProviderLogoPictureBox.TabStop = false;\n\t\t\t// \n\t\t\t// cloudStorageProvidersComboBox\n\t\t\t// \n\t\t\tthis.cloudStorageProvidersComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.cloudStorageProvidersComboBox.FormattingEnabled = true;\n\t\t\tthis.cloudStorageProvidersComboBox.Location = new System.Drawing.Point(61, 28);\n\t\t\tthis.cloudStorageProvidersComboBox.Name = \"cloudStorageProvidersComboBox\";\n\t\t\tthis.cloudStorageProvidersComboBox.Size = new System.Drawing.Size(107, 21);\n\t\t\tthis.cloudStorageProvidersComboBox.TabIndex = 1;\n\t\t\tthis.cloudStorageProvidersComboBox.SelectedIndexChanged += new System.EventHandler(this.cloudStorageProvidersComboBox_SelectedIndexChanged);\n\t\t\t// \n\t\t\t// lblSelectedProvider\n\t\t\t// \n\t\t\tthis.lblSelectedProvider.AutoSize = true;\n\t\t\tthis.lblSelectedProvider.Location = new System.Drawing.Point(6, 31);\n\t\t\tthis.lblSelectedProvider.Name = \"lblSelectedProvider\";\n\t\t\tthis.lblSelectedProvider.Size = new System.Drawing.Size(49, 13);\n\t\t\tthis.lblSelectedProvider.TabIndex = 0;\n\t\t\tthis.lblSelectedProvider.Text = \"Provider:\";\n\t\t\t// \n\t\t\t// linkLabel1\n\t\t\t// \n\t\t\tthis.linkLabel1.ForeColor = System.Drawing.SystemColors.MenuHighlight;\n\t\t\tthis.linkLabel1.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\n\t\t\tthis.linkLabel1.Location = new System.Drawing.Point(8, 25);\n\t\t\tthis.linkLabel1.Name = \"linkLabel1\";\n\t\t\tthis.linkLabel1.Size = new System.Drawing.Size(419, 41);\n\t\t\tthis.linkLabel1.TabIndex = 5;\n\t\t\tthis.linkLabel1.Text = resources.GetString(\"linkLabel1.Text\");\n\t\t\t// \n\t\t\t// settingsFileStorageGroupBox\n\t\t\t// \n\t\t\tthis.settingsFileStorageGroupBox.Controls.Add(this.settingsFileStorageControl);\n\t\t\tthis.settingsFileStorageGroupBox.Location = new System.Drawing.Point(6, 154);\n\t\t\tthis.settingsFileStorageGroupBox.Name = \"settingsFileStorageGroupBox\";\n\t\t\tthis.settingsFileStorageGroupBox.Size = new System.Drawing.Size(422, 127);\n\t\t\tthis.settingsFileStorageGroupBox.TabIndex = 4;\n\t\t\tthis.settingsFileStorageGroupBox.TabStop = false;\n\t\t\tthis.settingsFileStorageGroupBox.Text = \"Settings File Storage\";\n\t\t\t// \n\t\t\t// settingsFileStorageControl\n\t\t\t// \n\t\t\tthis.settingsFileStorageControl.Dock = System.Windows.Forms.DockStyle.Fill;\n\t\t\tthis.settingsFileStorageControl.Font = new System.Drawing.Font(\"Tahoma\", 8.25F);\n\t\t\tthis.settingsFileStorageControl.Location = new System.Drawing.Point(3, 16);\n\t\t\tthis.settingsFileStorageControl.Name = \"settingsFileStorageControl\";\n\t\t\tthis.settingsFileStorageControl.Size = new System.Drawing.Size(416, 108);\n\t\t\tthis.settingsFileStorageControl.TabIndex = 0;\n\t\t\t// \n\t\t\t// extraInfoComboBox\n\t\t\t// \n\t\t\tthis.extraInfoComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.extraInfoComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.extraInfoComboBox.Items.AddRange(new object[] {\n            \"No Extra Info\",\n            \"Show Location\",\n            \"Show Jobs\"});\n\t\t\tthis.extraInfoComboBox.Location = new System.Drawing.Point(274, 18);\n\t\t\tthis.extraInfoComboBox.Name = \"extraInfoComboBox\";\n\t\t\tthis.extraInfoComboBox.Size = new System.Drawing.Size(116, 21);\n\t\t\tthis.extraInfoComboBox.TabIndex = 36;\n\t\t\t// \n\t\t\t// SettingsForm\n\t\t\t// \n\t\t\tthis.AcceptButton = this.okButton;\n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n\t\t\tthis.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n\t\t\tthis.BackColor = System.Drawing.SystemColors.Window;\n\t\t\tthis.CancelButton = this.cancelButton;\n\t\t\tthis.ClientSize = new System.Drawing.Size(644, 482);\n\t\t\tthis.Controls.Add(this.multiPanel);\n\t\t\tthis.Controls.Add(this.leftPanel);\n\t\t\tthis.Controls.Add(this.bottomPanel);\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n\t\t\tthis.MaximizeBox = false;\n\t\t\tthis.MinimizeBox = false;\n\t\t\tthis.MinimumSize = new System.Drawing.Size(400, 400);\n\t\t\tthis.Name = \"SettingsForm\";\n\t\t\tthis.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n\t\t\tthis.Text = \"EVEMon Settings\";\n\t\t\tthis.Load += new System.EventHandler(this.SettingsForm_Load);\n\t\t\tthis.systemTrayIconGroupBox.ResumeLayout(false);\n\t\t\tthis.systemTrayIconGroupBox.PerformLayout();\n\t\t\tthis.bottomPanel.ResumeLayout(false);\n\t\t\tthis.CharacterMonitorGroupBox.ResumeLayout(false);\n\t\t\tthis.CharacterMonitorGroupBox.PerformLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.nudSkillQueueWarningThresholdDays)).EndInit();\n\t\t\tthis.WindowTitleGroupBox.ResumeLayout(false);\n\t\t\tthis.WindowTitleGroupBox.PerformLayout();\n\t\t\tthis.gbSkillBrowserIconSet.ResumeLayout(false);\n\t\t\tthis.gbSkillBrowserIconSet.PerformLayout();\n\t\t\tthis.iconsSetTableLayoutPanel.ResumeLayout(false);\n\t\t\tthis.leftPanel.ResumeLayout(false);\n\t\t\tthis.multiPanel.ResumeLayout(false);\n\t\t\tthis.generalPage.ResumeLayout(false);\n\t\t\tthis.generalPage.PerformLayout();\n\t\t\tthis.mainWindowPage.ResumeLayout(false);\n\t\t\tthis.OverviewGroupBox.ResumeLayout(false);\n\t\t\tthis.OverviewGroupBox.PerformLayout();\n\t\t\tthis.overviewPanel.ResumeLayout(false);\n\t\t\tthis.overviewPanel.PerformLayout();\n\t\t\tthis.skillPlannerPage.ResumeLayout(false);\n\t\t\tthis.skillPlannerPage.PerformLayout();\n\t\t\tthis.networkPage.ResumeLayout(false);\n\t\t\tthis.esiSettingsGroupBox.ResumeLayout(false);\n\t\t\tthis.esiSettingsGroupBox.PerformLayout();\n\t\t\tthis.ProxyServerGroupBox.ResumeLayout(false);\n\t\t\tthis.ProxyServerGroupBox.PerformLayout();\n\t\t\tthis.customProxyPanel.ResumeLayout(false);\n\t\t\tthis.customProxyPanel.PerformLayout();\n\t\t\tthis.emailNotificationsPage.ResumeLayout(false);\n\t\t\tthis.emailNotificationsPage.PerformLayout();\n\t\t\tthis.notificationsPage.ResumeLayout(false);\n\t\t\tthis.notificationsPage.PerformLayout();\n\t\t\tthis.trayIconPage.ResumeLayout(false);\n\t\t\tthis.mainWindowBehaviourGroupBox.ResumeLayout(false);\n\t\t\tthis.mainWindowBehaviourGroupBox.PerformLayout();\n\t\t\tthis.trayIconPopupGroupBox.ResumeLayout(false);\n\t\t\tthis.trayIconPopupGroupBox.PerformLayout();\n\t\t\tthis.updatesPage.ResumeLayout(false);\n\t\t\tthis.updatesPage.PerformLayout();\n\t\t\tthis.schedulerUIPage.ResumeLayout(false);\n\t\t\tthis.schedulerUIPage.PerformLayout();\n\t\t\tthis.externalCalendarPage.ResumeLayout(false);\n\t\t\tthis.externalCalendarPage.PerformLayout();\n\t\t\tthis.g15Page.ResumeLayout(false);\n\t\t\tthis.g15Page.PerformLayout();\n\t\t\tthis.g15Panel.ResumeLayout(false);\n\t\t\tthis.g15Panel.PerformLayout();\n\t\t\tthis.panelCycleQueueInfo.ResumeLayout(false);\n\t\t\tthis.panelCycleQueueInfo.PerformLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.ACycleTimesInterval)).EndInit();\n\t\t\tthis.panelCycleCharInfo.ResumeLayout(false);\n\t\t\tthis.panelCycleCharInfo.PerformLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.ACycleInterval)).EndInit();\n\t\t\tthis.iconsPage.ResumeLayout(false);\n\t\t\tthis.messagesPage.ResumeLayout(false);\n\t\t\tthis.gbMessageBox.ResumeLayout(false);\n\t\t\tthis.gbMessageBox.PerformLayout();\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.ResumeLayout(false);\n\t\t\tthis.ObsoleteEntryRemovalGroupBox.PerformLayout();\n\t\t\tthis.portableEveClientsPage.ResumeLayout(false);\n\t\t\tthis.PECIGroupBox.ResumeLayout(false);\n\t\t\tthis.marketPriceProvidersPage.ResumeLayout(false);\n\t\t\tthis.marketPriceProvidersPage.PerformLayout();\n\t\t\tthis.gbMarketPriceProviders.ResumeLayout(false);\n\t\t\tthis.gbMarketPriceProviders.PerformLayout();\n\t\t\tthis.cloudStorageServicePage.ResumeLayout(false);\n\t\t\tthis.providerAuthenticationGroupBox.ResumeLayout(false);\n\t\t\tthis.cloudStorageGroupBox.ResumeLayout(false);\n\t\t\tthis.cloudStorageGroupBox.PerformLayout();\n\t\t\t((System.ComponentModel.ISupportInitialize)(this.cloudStorageProviderLogoPictureBox)).EndInit();\n\t\t\tthis.settingsFileStorageGroupBox.ResumeLayout(false);\n\t\t\tthis.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n\n        private System.Windows.Forms.Button cancelButton;\n        private System.Windows.Forms.CheckBox cbPlaySoundOnSkillComplete;\n        private System.Windows.Forms.GroupBox ProxyServerGroupBox;\n        private System.Windows.Forms.TextBox proxyPortTextBox;\n        private System.Windows.Forms.TextBox proxyHttpHostTextBox;\n        private System.Windows.Forms.Button proxyAuthenticationButton;\n        private System.Windows.Forms.CheckBox cbCheckForUpdates;\n        private System.Windows.Forms.CheckBox cbWorksafeMode;\n        private System.Windows.Forms.CheckBox cbHighlightPlannedSkills;\n        private System.Windows.Forms.CheckBox cbHighlightPrerequisites;\n        private System.Windows.Forms.CheckBox runAtStartupComboBox;\n        private System.Windows.Forms.CheckBox cbTitleToTime;\n        private System.Windows.Forms.ComboBox cbWindowsTitleList;\n        private System.Windows.Forms.CheckBox g15CheckBox;\n        private System.Windows.Forms.RadioButton rbSystemTrayOptionsNever;\n        private System.Windows.Forms.RadioButton rbSystemTrayOptionsMinimized;\n        private System.Windows.Forms.RadioButton rbSystemTrayOptionsAlways;\n        private System.Windows.Forms.ToolTip ttToolTipCodes;\n        private System.Windows.Forms.Button okButton;\n        private System.Windows.Forms.CheckBox cbSkillInTitle;\n        private System.Windows.Forms.CheckBox cbHighlightConflicts;\n        private System.Windows.Forms.CheckBox cbHighlightPartialSkills;\n        private System.Windows.Forms.ColorDialog colorDialog;\n        private System.Windows.Forms.Panel panelColorBlocking;\n        private System.Windows.Forms.Panel panelColorRecurring2;\n        private System.Windows.Forms.Panel panelColorRecurring1;\n        private System.Windows.Forms.Panel panelColorSingle2;\n        private System.Windows.Forms.Panel panelColorSingle1;\n        private System.Windows.Forms.Panel panelColorText;\n        private System.Windows.Forms.Button trayTooltipButton;\n        private System.Windows.Forms.CheckBox externalCalendarCheckbox;\n        private System.Windows.Forms.CheckBox cbShowAllPublicSkills;\n        private System.Windows.Forms.CheckBox cbShowNonPublicSkills;\n        private System.Windows.Forms.CheckBox cbCheckTime;\n        private System.Windows.Forms.CheckBox cbShowOverViewTab;\n        private System.Windows.Forms.ComboBox compatibilityCombo;\n        private EVEMon.SettingsUI.NotificationsControl notificationsControl;\n        private System.Windows.Forms.TreeView treeView;\n        private MultiPanel multiPanel;\n        private MultiPanelPage generalPage;\n        private MultiPanelPage mainWindowPage;\n        private MultiPanelPage skillPlannerPage;\n        private MultiPanelPage networkPage;\n        private MultiPanelPage emailNotificationsPage;\n        private MultiPanelPage notificationsPage;\n        private MultiPanelPage trayIconPage;\n        private MultiPanelPage updatesPage;\n        private MultiPanelPage schedulerUIPage;\n        private MultiPanelPage externalCalendarPage;\n        private System.Windows.Forms.Panel customProxyPanel;\n        private System.Windows.Forms.Panel leftPanel;\n        private MultiPanelPage g15Page;\n        private System.Windows.Forms.CheckBox customProxyCheckBox;\n        private System.Windows.Forms.GroupBox trayIconPopupGroupBox;\n        private System.Windows.Forms.Button trayPopupButton;\n        private System.Windows.Forms.RadioButton trayPopupRadio;\n        private System.Windows.Forms.RadioButton trayTooltipRadio;\n        private System.Windows.Forms.Label lblUpdatesPage;\n        private System.Windows.Forms.Button applyButton;\n        private System.Windows.Forms.GroupBox OverviewGroupBox;\n        private System.Windows.Forms.ComboBox overviewPortraitSizeComboBox;\n        private System.Windows.Forms.CheckBox overviewShowPortraitCheckBox;\n        private System.Windows.Forms.CheckBox overviewShowWalletCheckBox;\n        private System.Windows.Forms.Panel overviewPanel;\n        private UpdateSettingsControl updateSettingsControl;\n        private System.Windows.Forms.GroupBox mainWindowBehaviourGroupBox;\n        private System.Windows.Forms.RadioButton rbMinToTaskBar;\n        private System.Windows.Forms.RadioButton rbMinToTray;\n        private System.Windows.Forms.RadioButton rbExitEVEMon;\n        private System.Windows.Forms.CheckBox cbAlwaysShowSkillQueueTime;\n        private System.Windows.Forms.CheckBox cbColorPartialSkills;\n        private System.Windows.Forms.CheckBox cbShowPrereqMetSkills;\n        private System.Windows.Forms.CheckBox cbColorQueuedSkills;\n        private System.Windows.Forms.CheckBox cbHighlightQueuedSiklls;\n        private System.Windows.Forms.CheckBox overviewShowSkillQueueTrainingTimeCheckBox;\n        private System.Windows.Forms.Panel panelCycleCharInfo;\n        private System.Windows.Forms.CheckBox cbG15ACycle;\n        private System.Windows.Forms.NumericUpDown ACycleInterval;\n        private System.Windows.Forms.Panel g15Panel;\n        private System.Windows.Forms.CheckBox cbG15ShowTime;\n        private System.Windows.Forms.Panel panelCycleQueueInfo;\n        private System.Windows.Forms.CheckBox cbG15CycleTimes;\n        private System.Windows.Forms.NumericUpDown ACycleTimesInterval;\n        private System.Windows.Forms.CheckBox cbSummaryOnMultiSelectOnly;\n        private System.Windows.Forms.ImageList imageList;\n        private System.Windows.Forms.RadioButton trayPopupDisabledRadio;\n        private System.Windows.Forms.CheckBox overviewGroupCharactersInTrainingCheckBox;\n        private System.Windows.Forms.CheckBox cbAdvanceEntryAdd;\n        private System.Windows.Forms.CheckBox cbG15ShowEVETime;\n        private System.Windows.Forms.CheckBox cbUseIncreasedContrastOnOverview;\n        private MultiPanelPage iconsPage;\n        private System.Windows.Forms.TableLayoutPanel iconsSetTableLayoutPanel;\n        private System.Windows.Forms.ComboBox cbSkillIconSet;\n        private System.Windows.Forms.TreeView tvlist;\n        private MultiPanelPage messagesPage;\n        private System.Windows.Forms.GroupBox ObsoleteEntryRemovalGroupBox;\n        private System.Windows.Forms.Label RemoveAllLabel;\n        private System.Windows.Forms.Label AlwaysAskLabel;\n        private System.Windows.Forms.Label RemoveConfirmedLabel;\n        private System.Windows.Forms.RadioButton alwaysAskRadioButton;\n        private System.Windows.Forms.RadioButton removeAllRadioButton;\n        private System.Windows.Forms.RadioButton removeConfirmedRadioButton;\n        private System.Windows.Forms.GroupBox gbMessageBox;\n        private System.Windows.Forms.Label lblPrioritesConflict;\n        private System.Windows.Forms.Button btnPrioritiesReset;\n        private System.Windows.Forms.Panel bottomPanel;\n        private System.Windows.Forms.Label lblMainWindowPage;\n        private System.Windows.Forms.Label lblSize;\n        private System.Windows.Forms.GroupBox CharacterMonitorGroupBox;\n        private System.Windows.Forms.GroupBox WindowTitleGroupBox;\n        private System.Windows.Forms.Label lblGeneralPage;\n        private System.Windows.Forms.Label lblEnvironment;\n        private System.Windows.Forms.Label lblSkillPlannerPage;\n        private System.Windows.Forms.Label lblNetworkPageProxy;\n        private System.Windows.Forms.Label lblProxyHostIPAddress;\n        private System.Windows.Forms.Label lblProxyPort;\n        private System.Windows.Forms.Label lblHTTP;\n        private System.Windows.Forms.Label lblEmailNotificationPage;\n        private System.Windows.Forms.Label lblNotificationsPage;\n        private System.Windows.Forms.Label lblTrayIconPage;\n        private System.Windows.Forms.Label lblSchedulerUIPage;\n        private System.Windows.Forms.Label lblText;\n        private System.Windows.Forms.Label lblBlockingEvents;\n        private System.Windows.Forms.Label lblRecurringEvents;\n        private System.Windows.Forms.Label lblSimpleEvents;\n        private System.Windows.Forms.Label lblExternalCalendarPage;\n        private System.Windows.Forms.Label lblG15Page;\n        private System.Windows.Forms.Label lblCycleTrainingSeconds;\n        private System.Windows.Forms.Label lblG15CycleCharSeconds;\n        private System.Windows.Forms.Label lblIconsPage;\n        private System.Windows.Forms.GroupBox gbSkillBrowserIconSet;\n        private System.Windows.Forms.Label lblObsoletePlanEntries;\n        private System.Windows.Forms.GroupBox systemTrayIconGroupBox;\n        private System.Windows.Forms.Button btnEVEMonDataDir;\n        private EmailNotificationsControl emailNotificationsControl;\n        private System.Windows.Forms.CheckBox mailNotificationCheckBox;\n        private MultiPanelPage portableEveClientsPage;\n        private System.Windows.Forms.Label lblPECIDescription;\n        private System.Windows.Forms.GroupBox PECIGroupBox;\n        private PortableEveClientsControl portableEveClientsControl;\n        private MultiPanelPage marketPriceProvidersPage;\n        private System.Windows.Forms.Label marketPriceProviderPageLabel;\n        private System.Windows.Forms.GroupBox gbMarketPriceProviders;\n        private System.Windows.Forms.ComboBox cbProvidersList;\n        private System.Windows.Forms.Label SelectedProviderLabel;\n        private MultiPanelPage cloudStorageServicePage;\n        private System.Windows.Forms.LinkLabel linkLabel1;\n        private System.Windows.Forms.GroupBox settingsFileStorageGroupBox;\n        private SettingsFileStorageControl settingsFileStorageControl;\n        private System.Windows.Forms.GroupBox cloudStorageGroupBox;\n        private System.Windows.Forms.ComboBox cloudStorageProvidersComboBox;\n        private System.Windows.Forms.Label lblSelectedProvider;\n        private System.Windows.Forms.GroupBox providerAuthenticationGroupBox;\n        private CloudStorageServiceControl cloudStorageServiceControl;\n        private System.Windows.Forms.PictureBox cloudStorageProviderLogoPictureBox;\n        private ExternalCalendarControl externalCalendarControl;\n        private System.Windows.Forms.NumericUpDown nudSkillQueueWarningThresholdDays;\n        private System.Windows.Forms.Label lblSkillQueueWarningThresholdDays;\n        private System.Windows.Forms.Label lblSkillQueuWarningThreshold;\n        private System.Windows.Forms.CheckBox cbShowSkillpointsOnOverview;\n        private System.Windows.Forms.GroupBox esiSettingsGroupBox;\n        private System.Windows.Forms.TextBox clientIDTextBox;\n        private System.Windows.Forms.LinkLabel esiSettingsLabel;\n        private System.Windows.Forms.Label lblClientSecret;\n        private System.Windows.Forms.Label lblClientID;\n        private System.Windows.Forms.TextBox clientSecretTextBox;\n        private System.Windows.Forms.ComboBox extraInfoComboBox;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/SettingsForm.cs",
    "content": "using EVEMon.Common;\nusing EVEMon.Common.CloudStorageServices;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Controls.MultiPanel;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.MarketPricer;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.Resources.Skill_Select;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.SettingsObjects;\nusing Microsoft.Win32;\nusing System;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Configuration;\nusing System.Drawing;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Resources;\nusing System.Security;\nusing System.Windows.Forms;\n\nnamespace EVEMon.SettingsUI\n{\n    public partial class SettingsForm : EVEMonForm\n    {\n        private const string StartupRegistryKey = @\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\";\n\n        private readonly SerializableSettings m_settings;\n        private SerializableSettings m_oldSettings;\n        private bool m_isLoading;\n        private TreeNode m_preSelect;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public SettingsForm()\n        {\n            InitializeComponent();\n\n            treeView.Font = FontFactory.GetFont(\"Tahoma\", 9.75F);\n            alwaysAskRadioButton.Font = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            removeAllRadioButton.Font = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            removeConfirmedRadioButton.Font = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            settingsFileStorageControl.Font = FontFactory.GetFont(\"Tahoma\", 8.25F);\n            extraInfoComboBox.SelectedIndex = 0;\n\n            m_settings = Settings.Export();\n            m_oldSettings = Settings.Export();\n            m_preSelect = null;\n        }\n\n        /// <summary>\n        /// Constructor to jump to a specific page on load.\n        /// </summary>\n        /// <param name=\"parentIndex\">The index of the section to select.</param>\n        /// <param name=\"childIndex\">The index of the page in that section to select.</param>\n        public SettingsForm(int parentIndex, int childIndex) : this()\n        {\n            var allNodes = treeView.Nodes;\n            if (parentIndex < allNodes.Count && parentIndex >= 0)\n            {\n                // Ensure all indexes are in bounds\n                var parent = allNodes[parentIndex];\n                var nodes = parent.Nodes;\n                if (nodes == null || nodes.Count < 1)\n                    m_preSelect = parent;\n                else if (childIndex >= 0 && childIndex < nodes.Count)\n                    m_preSelect = nodes[childIndex];\n            }\n        }\n\n        #endregion\n\n\n        /// <summary>\n        /// Gets a value indicating whether the settings have changed.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if the settings have changed; otherwise, <c>false</c>.\n        /// </value>\n        private bool SettingsChanged\n        {\n            get\n            {\n                var comparer = new SerializableSettingsComparer();\n                return !comparer.Equals(m_settings, m_oldSettings);\n            }\n        }\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Occurs on form load, we update the controls values with the settings we retrieved.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void SettingsForm_Load(object sender, EventArgs e)\n        {\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            // Initialize members\n            m_isLoading = true;\n\n            // Platform is Unix ?\n            if (Environment.OSVersion.Platform == PlatformID.Unix)\n            {\n                runAtStartupComboBox.Enabled = false;\n                treeView.Nodes[\"trayIconNode\"].Remove();\n            }\n\n            // Run with Mono ?\n            if (Type.GetType(\"Mono.Runtime\") != null)\n                treeView.Nodes[\"generalNode\"].Nodes[\"g15Node\"].Remove();\n\n            // Fill the overview portraits sizes\n            overviewPortraitSizeComboBox.Items.AddRange(Enum.GetValues(typeof(PortraitSizes)).\n                Cast<PortraitSizes>().Select(portraitSize =>\n                {\n                    string size = FormattableString.Invariant($\"{portraitSize.GetDefaultValue()}\");\n                    return $\"{size} by {size}\";\n                }).ToArray<object>());\n\n            // Expands the left panel and selects the correct page and node\n            treeView.ExpandAll();\n            var node = m_preSelect ?? treeView.Nodes.Cast<TreeNode>().First();\n            if (node != null)\n            {\n                string tag = node.Tag?.ToString() ?? string.Empty;\n                treeView.SelectedNode = node;\n                multiPanel.SelectedPage = multiPanel.Controls.Cast<MultiPanelPage>().\n                    FirstOrDefault(page => page.Name == tag);\n            }\n\n            // Misc settings\n            cbWorksafeMode.Checked = m_settings.UI.SafeForWork;\n            compatibilityCombo.SelectedIndex = (int)m_settings.Compatibility;\n\n            // Skills icon sets\n            cbSkillIconSet.Items.Clear();\n            for (int i = 1; i < IconSettings.Default.Properties.Count; i++)\n            {\n                SettingsProperty iconSettingsProperty = IconSettings.Default.Properties[\"Group\" + i];\n                if (iconSettingsProperty != null)\n                    cbSkillIconSet.Items.Add(iconSettingsProperty.DefaultValue.ToString().Replace(\"_\", \" \"));\n            }\n\n            // Tray icon settings\n            SetTrayIconSettings();\n\n            // G15\n            SetG15Settings();\n\n            // Skills display on the main window\n            var mws = m_settings.UI.MainWindow;\n            cbShowAllPublicSkills.Checked = mws.ShowAllPublicSkills;\n            cbShowNonPublicSkills.Checked = mws.ShowNonPublicSkills;\n\n            // Main window\n            SetMainWindowSettings();\n\n            // Main Window - Overview\n            SetOverviewSettings();\n\n            // Notifications\n            notificationsControl.Settings = m_settings.Notifications;\n            cbPlaySoundOnSkillComplete.Checked = m_settings.Notifications.PlaySoundOnSkillCompletion;\n\n            // Email Notifications\n            emailNotificationsControl.Settings = m_settings.Notifications;\n            mailNotificationCheckBox.Checked = m_settings.Notifications.SendMailAlert;\n\n            // Proxy settings\n            customProxyCheckBox.Checked = m_settings.Proxy.Enabled;\n            proxyPortTextBox.Text = m_settings.Proxy.Port.ToString(CultureConstants.DefaultCulture);\n            proxyHttpHostTextBox.Text = m_settings.Proxy.Host;\n            proxyAuthenticationButton.Tag = m_settings.Proxy;\n\n            // Client ID / Secret\n            clientIDTextBox.Text = m_settings.SSOClientID;\n            clientSecretTextBox.Text = m_settings.SSOClientSecret;\n\n            // Updates\n            cbCheckTime.Checked = m_settings.Updates.CheckTimeOnStartup;\n            cbCheckForUpdates.Checked = m_settings.Updates.CheckEVEMonVersion;\n            updateSettingsControl.Settings = m_settings.Updates;\n\n            // Skill Planner\n            SetSkillPlannerSettings();\n\n            // Obsolete plan entry removal behaviour\n            var pws = m_settings.UI.PlanWindow;\n            alwaysAskRadioButton.Checked = (pws.ObsoleteEntryRemovalBehaviour ==\n                ObsoleteEntryRemovalBehaviour.AlwaysAsk);\n            removeAllRadioButton.Checked = (pws.ObsoleteEntryRemovalBehaviour ==\n                ObsoleteEntryRemovalBehaviour.RemoveAll);\n            removeConfirmedRadioButton.Checked = (pws.ObsoleteEntryRemovalBehaviour ==\n                ObsoleteEntryRemovalBehaviour.RemoveConfirmed);\n\n            // Skill Browser Icon Set\n            cbSkillIconSet.SelectedIndex = (m_settings.UI.SkillBrowser.IconsGroupIndex <=\n                cbSkillIconSet.Items.Count && m_settings.UI.SkillBrowser.IconsGroupIndex > 0) ?\n                (m_settings.UI.SkillBrowser.IconsGroupIndex - 1) : 0;\n\n            // System tray popup/tooltip\n            trayPopupRadio.Checked = m_settings.UI.SystemTrayPopup.Style == TrayPopupStyles.PopupForm;\n            trayTooltipRadio.Checked = m_settings.UI.SystemTrayPopup.Style == TrayPopupStyles.WindowsTooltip;\n            trayPopupDisabledRadio.Checked = m_settings.UI.SystemTrayPopup.Style == TrayPopupStyles.Disabled;\n\n            // Calendar\n            SetCalendarSettings();\n\n            // External calendar\n            SetExternalCalendarSettings();\n\n            // Run at system startup\n            SetStartUpSettings();\n\n            // Market Price providers\n            InitilizeMarketPriceProviderDropDown();\n\n            // Cloud Storage Service provider\n            InitializeCloudStorageServiceProviderDropDown();\n\n            m_isLoading = false;\n\n            // Enables / disables controls\n            UpdateDisables();\n        }\n\n        /// <summary>\n        /// Occurs when the user click \"Cancel\".\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            Close();\n        }\n\n        /// <summary>\n        /// Occurs when the user click \"OK\".\n        /// We set up the new settings if they have changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void btnOk_Click(object sender, EventArgs e)\n        {\n            // Return settings\n            ApplyToSettings();\n\n            if (SettingsChanged)\n                await Settings.ImportAsync(m_settings, true);\n\n            Close();\n        }\n\n        /// <summary>\n        /// Occurs when the user click \"Apply\".\n        /// We set up the new settings if they have changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void applyButton_Click(object sender, EventArgs e)\n        {\n            ApplyToSettings();\n\n            if (!SettingsChanged)\n                return;\n\n            // Import the new settings\n            await Settings.ImportAsync(m_settings, true);\n\n            // Refresh the old settings\n            m_oldSettings = Settings.Export();\n        }\n\n        #endregion\n\n\n        #region Core methods\n\n        /// <summary>\n        /// Sets the tray icon settings.\n        /// </summary>\n        private void SetTrayIconSettings()\n        {\n            rbSystemTrayOptionsNever.Checked = m_settings.UI.SystemTrayIcon == SystemTrayBehaviour.Disabled;\n            rbSystemTrayOptionsAlways.Checked = m_settings.UI.SystemTrayIcon == SystemTrayBehaviour.AlwaysVisible;\n            rbSystemTrayOptionsMinimized.Checked = m_settings.UI.SystemTrayIcon == SystemTrayBehaviour.ShowWhenMinimized;\n\n            switch (m_settings.UI.MainWindowCloseBehaviour)\n            {\n                case CloseBehaviour.MinimizeToTaskbar:\n                    rbMinToTaskBar.Checked = true;\n                    break;\n                case CloseBehaviour.MinimizeToTray:\n                    rbMinToTray.Checked = true;\n                    break;\n                default:\n                    rbExitEVEMon.Checked = true;\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Sets the G15 settings.\n        /// </summary>\n        private void SetG15Settings()\n        {\n            g15CheckBox.Checked = m_settings.G15.Enabled;\n            cbG15ACycle.Checked = m_settings.G15.UseCharactersCycle;\n            ACycleInterval.Value = m_settings.G15.CharactersCycleInterval;\n            cbG15CycleTimes.Checked = m_settings.G15.UseTimeFormatsCycle;\n            ACycleTimesInterval.Value = Math.Min(m_settings.G15.TimeFormatsCycleInterval,\n                ACycleTimesInterval.Maximum);\n            cbG15ShowTime.Checked = m_settings.G15.ShowSystemTime;\n            cbG15ShowEVETime.Checked = m_settings.G15.ShowEVETime;\n        }\n\n        /// <summary>\n        /// Sets the main window settings.\n        /// </summary>\n        private void SetMainWindowSettings()\n        {\n            var mws = m_settings.UI.MainWindow;\n            cbTitleToTime.Checked = mws.ShowCharacterInfoInTitleBar;\n            cbWindowsTitleList.SelectedIndex = (int)mws.TitleFormat - 1;\n            cbSkillInTitle.Checked = mws.ShowSkillNameInWindowTitle;\n            cbShowPrereqMetSkills.Checked = mws.ShowPrereqMetSkills;\n            cbColorPartialSkills.Checked = mws.HighlightPartialSkills;\n            cbColorQueuedSkills.Checked = mws.HighlightQueuedSkills;\n            cbAlwaysShowSkillQueueTime.Checked = mws.AlwaysShowSkillQueueTime;\n            nudSkillQueueWarningThresholdDays.Value = mws.SkillQueueWarningThresholdDays;\n        }\n\n        /// <summary>\n        /// Sets the overview settings.\n        /// </summary>\n        private void SetOverviewSettings()\n        {\n            var mws = m_settings.UI.MainWindow;\n            int extraIndex = 0;\n            cbShowOverViewTab.Checked = mws.ShowOverview;\n            cbUseIncreasedContrastOnOverview.Checked = mws.UseIncreasedContrastOnOverview;\n            overviewShowWalletCheckBox.Checked = mws.ShowOverviewWallet;\n            cbShowSkillpointsOnOverview.Checked = mws.ShowOverviewTotalSkillpoints;\n            overviewShowPortraitCheckBox.Checked = mws.ShowOverviewPortrait;\n            overviewPortraitSizeComboBox.SelectedIndex = (int)mws.OverviewItemSize;\n            overviewShowSkillQueueTrainingTimeCheckBox.Checked = mws.ShowOverviewSkillQueueTrainingTime;\n            overviewGroupCharactersInTrainingCheckBox.Checked = mws.PutTrainingSkillsFirstOnOverview;\n            // None, Show Location, Show Jobs\n            if (mws.ShowOverviewLocation)\n                extraIndex = 1;\n            else if (mws.ShowOverviewJobs)\n                extraIndex = 2;\n            extraInfoComboBox.SelectedIndex = extraIndex;\n        }\n\n        /// <summary>\n        /// Sets the skill planner settings.\n        /// </summary>\n        private void SetSkillPlannerSettings()\n        {\n            var pws = m_settings.UI.PlanWindow;\n            cbHighlightPlannedSkills.Checked = pws.HighlightPlannedSkills;\n            cbHighlightPrerequisites.Checked = pws.HighlightPrerequisites;\n            cbHighlightConflicts.Checked = pws.HighlightConflicts;\n            cbHighlightPartialSkills.Checked = pws.HighlightPartialSkills;\n            cbHighlightQueuedSiklls.Checked = pws.HighlightQueuedSkills;\n            cbSummaryOnMultiSelectOnly.Checked = pws.OnlyShowSelectionSummaryOnMultiSelect;\n            cbAdvanceEntryAdd.Checked = pws.UseAdvanceEntryAddition;\n        }\n\n        /// <summary>\n        /// Sets the calendar settings.\n        /// </summary>\n        private void SetCalendarSettings()\n        {\n            panelColorBlocking.BackColor = (Color)m_settings.UI.Scheduler.BlockingColor;\n            panelColorRecurring1.BackColor = (Color)m_settings.UI.Scheduler.RecurringEventGradientStart;\n            panelColorRecurring2.BackColor = (Color)m_settings.UI.Scheduler.RecurringEventGradientEnd;\n            panelColorSingle1.BackColor = (Color)m_settings.UI.Scheduler.SimpleEventGradientStart;\n            panelColorSingle2.BackColor = (Color)m_settings.UI.Scheduler.SimpleEventGradientEnd;\n            panelColorText.BackColor = (Color)m_settings.UI.Scheduler.TextColor;\n        }\n\n        /// <summary>\n        /// Sets the external calendar settings.\n        /// </summary>\n        private void SetExternalCalendarSettings()\n        {\n            externalCalendarCheckbox.Checked = m_settings.Calendar.Enabled;\n\n            externalCalendarControl.SetExternalCalendar(m_settings);\n        }\n\n        /// <summary>\n        /// Sets the start up settings.\n        /// </summary>\n        private void SetStartUpSettings()\n        {\n            RegistryKey rk = null;\n            try\n            {\n                rk = Registry.CurrentUser.OpenSubKey(StartupRegistryKey, true);\n            }\n            catch (SecurityException ex)\n            {\n                ExceptionHandler.LogException(ex, true);\n            }\n            catch (UnauthorizedAccessException ex)\n            {\n                ExceptionHandler.LogException(ex, true);\n            }\n\n            if (rk == null)\n            {\n                // No writing rights\n                runAtStartupComboBox.Checked = false;\n                runAtStartupComboBox.Enabled = false;\n            }\n            else\n            {\n                // Run at startup ?\n                runAtStartupComboBox.Checked = rk.GetValue(\"EVEMon\") != null;\n            }\n        }\n\n        /// <summary>\n        /// Fetches the controls' values to <see cref=\"m_settings\"/>.\n        /// </summary>\n        private void ApplyToSettings()\n        {\n            var mws = m_settings.UI.MainWindow;\n            var pws = m_settings.UI.PlanWindow;\n            int extraIndex = extraInfoComboBox.SelectedIndex;\n\n            // General - Compatibility\n            m_settings.Compatibility = (CompatibilityMode)Math.Max(0, compatibilityCombo.SelectedIndex);\n            m_settings.UI.SafeForWork = cbWorksafeMode.Checked;\n\n            // Skill Planner\n            pws.HighlightPrerequisites = cbHighlightPrerequisites.Checked;\n            pws.HighlightPlannedSkills = cbHighlightPlannedSkills.Checked;\n            pws.HighlightConflicts = cbHighlightConflicts.Checked;\n            pws.HighlightPartialSkills = cbHighlightPartialSkills.Checked;\n            pws.HighlightQueuedSkills = cbHighlightQueuedSiklls.Checked;\n            pws.OnlyShowSelectionSummaryOnMultiSelect = cbSummaryOnMultiSelectOnly.Checked;\n            pws.UseAdvanceEntryAddition = cbAdvanceEntryAdd.Checked;\n\n            if (alwaysAskRadioButton.Checked)\n                pws.ObsoleteEntryRemovalBehaviour = ObsoleteEntryRemovalBehaviour.AlwaysAsk;\n            else if (removeAllRadioButton.Checked)\n                pws.ObsoleteEntryRemovalBehaviour = ObsoleteEntryRemovalBehaviour.RemoveAll;\n            else\n                pws.ObsoleteEntryRemovalBehaviour = ObsoleteEntryRemovalBehaviour.RemoveConfirmed;\n\n            // Skill Browser icon sets\n            m_settings.UI.SkillBrowser.IconsGroupIndex = cbSkillIconSet.SelectedIndex + 1;\n\n            // Main window skills filter\n            mws.ShowAllPublicSkills = cbShowAllPublicSkills.Checked;\n            mws.ShowNonPublicSkills = cbShowNonPublicSkills.Checked;\n            mws.ShowPrereqMetSkills = cbShowPrereqMetSkills.Checked;\n\n            // System tray icon behaviour\n            if (rbSystemTrayOptionsNever.Checked)\n                m_settings.UI.SystemTrayIcon = SystemTrayBehaviour.Disabled;\n            else if (rbSystemTrayOptionsMinimized.Checked)\n                m_settings.UI.SystemTrayIcon = SystemTrayBehaviour.ShowWhenMinimized;\n            else if (rbSystemTrayOptionsAlways.Checked)\n                m_settings.UI.SystemTrayIcon = SystemTrayBehaviour.AlwaysVisible;\n\n            // Main window close behaviour\n            if (rbMinToTaskBar.Checked)\n                m_settings.UI.MainWindowCloseBehaviour = CloseBehaviour.MinimizeToTaskbar;\n            else if (rbMinToTray.Checked)\n                m_settings.UI.MainWindowCloseBehaviour = CloseBehaviour.MinimizeToTray;\n            else\n                m_settings.UI.MainWindowCloseBehaviour = CloseBehaviour.Exit;\n\n            // Market Price Provider\n            m_settings.MarketPricer.ProviderName = cbProvidersList.SelectedItem?.ToString() ?? string.Empty;\n\n            // Cloud Storage Service Provider\n            m_settings.CloudStorageServiceProvider.ProviderName =\n                cloudStorageProvidersComboBox.SelectedItem?.ToString() ?? string.Empty;\n\n            // Main window\n            mws.ShowCharacterInfoInTitleBar = cbTitleToTime.Checked;\n            mws.TitleFormat = (MainWindowTitleFormat)cbWindowsTitleList.SelectedIndex + 1;\n            mws.ShowSkillNameInWindowTitle = cbSkillInTitle.Checked;\n            mws.HighlightPartialSkills = cbColorPartialSkills.Checked;\n            mws.HighlightQueuedSkills = cbColorQueuedSkills.Checked;\n            mws.AlwaysShowSkillQueueTime = cbAlwaysShowSkillQueueTime.Checked;\n            mws.SkillQueueWarningThresholdDays = (int)nudSkillQueueWarningThresholdDays.Value;\n\n            // G15\n            m_settings.G15.Enabled = g15CheckBox.Checked;\n            m_settings.G15.UseCharactersCycle = cbG15ACycle.Checked;\n            m_settings.G15.CharactersCycleInterval = (int)ACycleInterval.Value;\n            m_settings.G15.UseTimeFormatsCycle = cbG15CycleTimes.Checked;\n            m_settings.G15.TimeFormatsCycleInterval = (int)ACycleTimesInterval.Value;\n            m_settings.G15.ShowSystemTime = cbG15ShowTime.Checked;\n            m_settings.G15.ShowEVETime = cbG15ShowEVETime.Checked;\n\n            // Notifications\n            m_settings.Notifications.PlaySoundOnSkillCompletion = cbPlaySoundOnSkillComplete.Checked;\n            m_settings.Notifications.SendMailAlert = mailNotificationCheckBox.Checked;\n\n            // Email notifications\n            // If enabled, validate email notification settings\n            if (mailNotificationCheckBox.Checked && emailNotificationsControl.ValidateChildren())\n                emailNotificationsControl.PopulateSettingsFromControls();\n\n            // Main window - Overview\n            mws.ShowOverview = cbShowOverViewTab.Checked;\n            mws.UseIncreasedContrastOnOverview = cbUseIncreasedContrastOnOverview.Checked;\n            mws.ShowOverviewWallet = overviewShowWalletCheckBox.Checked;\n            mws.ShowOverviewTotalSkillpoints = cbShowSkillpointsOnOverview.Checked;\n            mws.ShowOverviewPortrait = overviewShowPortraitCheckBox.Checked;\n            mws.ShowOverviewLocation = extraIndex == 1;\n            mws.ShowOverviewJobs = extraIndex == 2;\n            mws.PutTrainingSkillsFirstOnOverview = overviewGroupCharactersInTrainingCheckBox.Checked;\n            mws.ShowOverviewSkillQueueTrainingTime = overviewShowSkillQueueTrainingTimeCheckBox.Checked;\n            mws.OverviewItemSize = (PortraitSizes)overviewPortraitSizeComboBox.SelectedIndex;\n\n            // Tray icon window style\n            if (trayPopupRadio.Checked)\n                m_settings.UI.SystemTrayPopup.Style = TrayPopupStyles.PopupForm;\n            else if (trayTooltipRadio.Checked)\n                m_settings.UI.SystemTrayPopup.Style = TrayPopupStyles.WindowsTooltip;\n            else\n                m_settings.UI.SystemTrayPopup.Style = TrayPopupStyles.Disabled;\n\n            // Proxy\n            m_settings.Proxy.Enabled = customProxyCheckBox.Checked;\n            int proxyPort;\n            if (IsValidPort(proxyPortTextBox.Text, \"Proxy port\", out proxyPort))\n                m_settings.Proxy.Port = proxyPort;\n            m_settings.Proxy.Host = proxyHttpHostTextBox.Text;\n\n            // Client ID / Secret\n            m_settings.SSOClientID = (clientIDTextBox.Text ?? string.Empty).Trim();\n            m_settings.SSOClientSecret = (clientSecretTextBox.Text ?? string.Empty).Trim();\n\n            // Updates\n            m_settings.Updates.CheckEVEMonVersion = cbCheckForUpdates.Checked;\n            m_settings.Updates.CheckTimeOnStartup = cbCheckTime.Checked;\n\n            // Scheduler colors\n            m_settings.UI.Scheduler.BlockingColor = (SerializableColor)panelColorBlocking.BackColor;\n            m_settings.UI.Scheduler.RecurringEventGradientStart = (SerializableColor)panelColorRecurring1.BackColor;\n            m_settings.UI.Scheduler.RecurringEventGradientEnd = (SerializableColor)panelColorRecurring2.BackColor;\n            m_settings.UI.Scheduler.SimpleEventGradientStart = (SerializableColor)panelColorSingle1.BackColor;\n            m_settings.UI.Scheduler.SimpleEventGradientEnd = (SerializableColor)panelColorSingle2.BackColor;\n            m_settings.UI.Scheduler.TextColor = (SerializableColor)panelColorText.BackColor;\n\n            // External calendar settings\n            m_settings.Calendar.Enabled = externalCalendarCheckbox.Checked;\n            externalCalendarControl.ApplyExternalCalendarSettings(m_settings);\n            \n            // Run at startup\n            if (!runAtStartupComboBox.Enabled)\n                return;\n\n            RegistryKey rk = Registry.CurrentUser.OpenSubKey(StartupRegistryKey, true);\n            if (rk == null)\n                return;\n\n            if (runAtStartupComboBox.Checked)\n            {\n                rk.SetValue(\"EVEMon\", $\"\\\"{Application.ExecutablePath}\\\" {\"-startMinimized\"}\");\n            }\n            else\n                rk.DeleteValue(\"EVEMon\", false);\n        }\n        \n        /// <summary>\n        /// Populates the combobox for the market price providers.\n        /// </summary>\n        private void InitilizeMarketPriceProviderDropDown()\n        {\n            cbProvidersList.Items.Clear();\n\n            // Instead of crashing if this throws, make it blank\n            try\n            {\n                cbProvidersList.Items.AddRange(ItemPricer.Providers.Select(pricer => pricer.\n                    Name).Cast<object>().ToArray());\n            }\n            catch (System.Reflection.ReflectionTypeLoadException e)\n            {\n                // Dump the loader exceptions for more debug information\n                EveMonClient.Trace(\"Error loading market price providers:\");\n                foreach (var exception in e.LoaderExceptions)\n                    if (exception != null)\n                        EveMonClient.Trace(exception.ToString(), false);\n            }\n\n            var selectedItem = cbProvidersList.Items.Cast<string>()\n                .FirstOrDefault(item => item == m_settings.MarketPricer.ProviderName);\n\n            if (selectedItem != null)\n                cbProvidersList.SelectedIndex = cbProvidersList.Items.IndexOf(selectedItem);\n\n            if (cbProvidersList.SelectedIndex == -1 && cbProvidersList.Items.Count > 0)\n                cbProvidersList.SelectedIndex = 0;\n        }\n\n        /// <summary>\n        /// Populates the combobox for the cloud storage service providers.\n        /// </summary>\n        private void InitializeCloudStorageServiceProviderDropDown()\n        {\n            cloudStorageProvidersComboBox.Items.Clear();\n\n            cloudStorageProvidersComboBox.Items.AddRange(CloudStorageServiceProvider.Providers\n                .Select(provider => provider.Name)\n                .Cast<object>()\n                .ToArray());\n\n            var selectedItem = cloudStorageProvidersComboBox.Items.Cast<string>()\n                .FirstOrDefault(item => item == m_settings.CloudStorageServiceProvider.ProviderName);\n\n            if (selectedItem != null)\n                cloudStorageProvidersComboBox.SelectedIndex = cloudStorageProvidersComboBox.Items.IndexOf(selectedItem);\n\n            if (cloudStorageProvidersComboBox.SelectedIndex == -1 && cloudStorageProvidersComboBox.Items.Count > 0)\n                cloudStorageProvidersComboBox.SelectedIndex = 0;\n\n            cloudStorageProviderLogoPictureBox.Image = m_settings.CloudStorageServiceProvider.Provider?.Logo;\n        }\n\n        #endregion\n\n\n        #region Validation\n\n        /// <summary>\n        /// Proxy port validation.\n        /// Ensures the text represents a correct port number.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void proxyPortTextBox_Validating(object sender, CancelEventArgs e)\n        {\n            string text = ((TextBox)sender).Text;\n            int ignore;\n            e.Cancel = !IsValidPort(text, \"Proxy port\", out ignore);\n        }\n\n        /// <summary>\n        /// Checks a port is valid and displays a message box when it is not.\n        /// </summary>\n        /// <param name=\"str\"></param>\n        /// <param name=\"portName\"></param>\n        /// <param name=\"port\"></param>\n        /// <returns></returns>\n        internal static bool IsValidPort(string str, string portName, out int port)\n        {\n            if (!str.TryParseInv(out port))\n                return false;\n\n            if ((port >= IPEndPoint.MinPort) && (port <= IPEndPoint.MaxPort))\n                return true;\n\n            ShowErrorMessage(\"Invalid port\", portName + \" value must be between \" +\n                IPEndPoint.MinPort + \" and \" + IPEndPoint.MaxPort + \".\");\n\n            return false;\n        }\n\n        /// <summary>\n        /// Displays an error message.\n        /// </summary>\n        /// <param name=\"caption\"></param>\n        /// <param name=\"message\"></param>\n        private static void ShowErrorMessage(string caption, string message)\n        {\n            MessageBox.Show(message, caption, MessageBoxButtons.OK, MessageBoxIcon.Error);\n        }\n\n        #endregion\n\n\n        #region Updates\n\n        /// <summary>\n        /// This handler occurs because some controls' values changed and requires to enable/disable other controls.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnMustEnableOrDisable(object sender, EventArgs e)\n        {\n            if (m_isLoading)\n                return;\n\n            UpdateDisables();\n        }\n\n        /// <summary>\n        /// Enable or disable controls in reaction to other controls states. \n        /// </summary>\n        private void UpdateDisables()\n        {\n            var mws = m_settings.UI.MainWindow;\n            g15Panel.Enabled = g15CheckBox.Checked;\n            ACycleInterval.Enabled = cbG15ACycle.Checked;\n            ACycleTimesInterval.Enabled = cbG15CycleTimes.Checked;\n            trayIconPopupGroupBox.Enabled = !rbSystemTrayOptionsNever.Checked;\n            emailNotificationsControl.Enabled = mailNotificationCheckBox.Checked;\n            customProxyPanel.Enabled = customProxyCheckBox.Checked;\n            overviewPanel.Enabled = cbShowOverViewTab.Checked;\n\n            cbWindowsTitleList.Enabled = cbTitleToTime.Checked;\n            cbSkillInTitle.Enabled = cbTitleToTime.Checked;\n\n            // Portable Eve Clients settings\n            portableEveClientsControl.Enabled = !EveMonClient.EveAppDataFoldersExistInDefaultLocation;\n\n            // Minimize to tray/task bar\n            rbMinToTray.Enabled = !rbSystemTrayOptionsNever.Checked;\n            if (rbSystemTrayOptionsNever.Checked && rbMinToTray.Checked)\n                rbMinToTaskBar.Checked = true;\n\n            // Calendar\n            externalCalendarControl.Enabled = externalCalendarCheckbox.Checked;\n\n            // Main window filters (show non-public skills and such)\n            if (cbShowAllPublicSkills.Checked)\n            {\n                cbShowNonPublicSkills.Enabled = true;\n                cbShowNonPublicSkills.Checked = mws.ShowNonPublicSkills;\n                cbShowPrereqMetSkills.Enabled = false;\n                cbShowPrereqMetSkills.Checked = false;\n            }\n            else\n            {\n                cbShowNonPublicSkills.Enabled = false;\n                cbShowNonPublicSkills.Checked = false;\n                cbShowPrereqMetSkills.Enabled = true;\n                cbShowPrereqMetSkills.Checked = mws.ShowPrereqMetSkills;\n            }\n\n            // Cloud Storage Service Provider Authentiation\n            providerAuthenticationGroupBox.Visible = CloudStorageServiceProvider.Providers.Any();\n        }\n\n        #endregion\n\n\n        #region Buttons handlers\n\n        /// <summary>\n        /// Network > Proxy > Authentication button.\n        /// Shows the proxy authentication configuration form.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void proxyAuthenticationButton_Click(object sender, EventArgs e)\n        {\n            ProxySettings proxySettings = m_settings.Proxy;\n            using (ProxyAuthenticationWindow window = new ProxyAuthenticationWindow(proxySettings))\n            {\n                DialogResult result = window.ShowDialog();\n                if (result == DialogResult.OK)\n                    m_settings.Proxy = proxySettings;\n            }\n        }\n\n        /// <summary>\n        /// Tray icon tooltip > Configure.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void trayTooltipButton_Click(object sender, EventArgs e)\n        {\n            TrayTooltipSettings tooltipSettings = m_settings.UI.SystemTrayTooltip;\n            using (TrayTooltipConfigForm f = new TrayTooltipConfigForm(tooltipSettings))\n            {\n                // Set current tooltip string\n                f.ShowDialog();\n                if (f.DialogResult != DialogResult.OK)\n                    return;\n\n                // Save changes in local copy\n                m_settings.UI.SystemTrayTooltip = tooltipSettings;\n                trayTooltipRadio.Checked = true;\n            }\n        }\n\n        /// <summary>\n        /// Tray icon popup > Configure.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void trayPopupButton_Click(object sender, EventArgs e)\n        {\n            TrayPopupSettings popupSettings = m_settings.UI.SystemTrayPopup;\n            using (TrayPopupConfigForm f = new TrayPopupConfigForm(popupSettings))\n            {\n                // Edit a copy of the current settings\n                f.ShowDialog();\n                if (f.DialogResult != DialogResult.OK)\n                    return;\n\n                m_settings.UI.SystemTrayPopup = popupSettings;\n                trayPopupRadio.Checked = true;\n            }\n        }\n        \n        /// <summary>\n        /// Reset the priorities conflict custom message box.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnPrioritiesReset_Click(object sender, EventArgs e)\n        {\n            Settings.UI.PlanWindow.PrioritiesMsgBox.ShowDialogBox = true;\n            Settings.UI.PlanWindow.PrioritiesMsgBox.DialogResult = DialogResult.None;\n        }\n\n        /// <summary>\n        /// Opens the EVEMon data directory.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnEVEMonDataDir_Click(object sender, EventArgs e)\n        {\n            Util.OpenURL(new Uri(EveMonClient.EVEMonDataDir));\n        }\n\n        #endregion\n\n\n        #region Other handlers\n\n        /// <summary>\n        /// Gets the custom icon set.\n        /// </summary>\n        /// <param name=\"index\">The index.</param>\n        /// <returns></returns>\n        private static ImageList GetCustomIconSet(int index)\n        {\n            string groupname = string.Empty;\n\n            if (index > 0 && index < IconSettings.Default.Properties.Count)\n            {\n                SettingsProperty iconSettingsProperty =\n                    IconSettings.Default.Properties[\"Group\" + index];\n                if (iconSettingsProperty != null)\n                    groupname = iconSettingsProperty.DefaultValue.ToString();\n            }\n\n            string groupDirectory = $\"{AppDomain.CurrentDomain.BaseDirectory}Resources\\\\Skill_Select\\\\Group\";\n            string defaultResourcesPath = $\"{groupDirectory}0\\\\Default.resources\";\n            string groupResourcesPath = $\"{groupDirectory}{index}\\\\{groupname}.resources\";\n\n            if (!File.Exists(defaultResourcesPath) ||\n                (!string.IsNullOrEmpty(groupname) && !File.Exists(groupResourcesPath)))\n            {\n                groupname = string.Empty;\n            }\n\n            return string.IsNullOrEmpty(groupname) ? null : GetCustomIconSet(defaultResourcesPath, groupResourcesPath);\n        }\n\n        /// <summary>\n        /// Gets the icon set for the given index, using the given list for missing icons.\n        /// </summary>\n        /// <param name=\"defaultResourcesPath\">The default resources path.</param>\n        /// <param name=\"groupResourcesPath\">The group resources path.</param>\n        /// <returns></returns>\n        private static ImageList GetCustomIconSet(string defaultResourcesPath, string groupResourcesPath)\n        {\n            ImageList customIconSet;\n            ImageList tempImageList = null;\n            try\n            {\n                tempImageList = new ImageList();\n                IDictionaryEnumerator basicx;\n                IResourceReader defaultGroupReader = null;\n                tempImageList.ColorDepth = ColorDepth.Depth32Bit;\n                try\n                {\n                    defaultGroupReader = new ResourceReader(defaultResourcesPath);\n\n                    basicx = defaultGroupReader.GetEnumerator();\n\n                    while (basicx.MoveNext())\n                    {\n                        tempImageList.Images.Add(basicx.Key.ToString(), (Icon)basicx.Value);\n                    }\n                }\n                finally\n                {\n                    defaultGroupReader?.Close();\n                }\n\n                IResourceReader groupReader = null;\n                try\n                {\n                    groupReader = new ResourceReader(groupResourcesPath);\n\n                    basicx = groupReader.GetEnumerator();\n\n                    while (basicx.MoveNext())\n                    {\n                        if (tempImageList.Images.ContainsKey(basicx.Key.ToString()))\n                            tempImageList.Images.RemoveByKey(basicx.Key.ToString());\n\n                        tempImageList.Images.Add(basicx.Key.ToString(), (Icon)basicx.Value);\n                    }\n                }\n                finally\n                {\n                    groupReader?.Close();\n                }\n\n                customIconSet = tempImageList;\n                tempImageList = null;\n            }\n            finally\n            {\n                tempImageList?.Dispose();\n            }\n\n            return customIconSet;\n        }\n\n        /// <summary>\n        /// Skill Planner > Skill browser icon set > Icons set combo.\n        /// Updates the sample below the combo box.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void skillIconSetComboBox_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            tvlist.Nodes.Clear();\n            tvlist.ImageList = GetCustomIconSet(cbSkillIconSet.SelectedIndex + 1);\n\n            if (tvlist.ImageList == null)\n                return;\n\n            TreeNode gtn = new TreeNode(\"Book\", tvlist.ImageList.Images.IndexOfKey(\"book\"),\n                tvlist.ImageList.Images.IndexOfKey(\"book\"));\n            gtn.Nodes.Add(new TreeNode(\"Pre-Reqs NOT met (Rank)\", tvlist.ImageList.Images.IndexOfKey(\"PrereqsNOTMet\"),\n                tvlist.ImageList.Images.IndexOfKey(\"PrereqsNOTMet\")));\n            gtn.Nodes.Add(new TreeNode(\"Pre-Reqs met (Rank)\", tvlist.ImageList.Images.IndexOfKey(\"PrereqsMet\"),\n                tvlist.ImageList.Images.IndexOfKey(\"PrereqsMet\")));\n            for (int i = 0; i < 6; i++)\n            {\n                gtn.Nodes.Add(new TreeNode(\"Level \" + i + \" (Rank)\", tvlist.ImageList.Images.IndexOfKey(\"lvl\" + i),\n                    tvlist.ImageList.Images.IndexOfKey(\"lvl\" + i)));\n            }\n            gtn.Expand();\n            tvlist.Nodes.Add(gtn);\n        }\n\n        /// <summary>\n        /// Calendar > Scheduler entry colors > color controls.\n        /// When clicked, displays a color picker.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void colorPanel_Click(object sender, EventArgs e)\n        {\n            Panel color = (Panel)sender;\n            colorDialog.Color = color.BackColor;\n            if (colorDialog.ShowDialog() == DialogResult.OK)\n                color.BackColor = colorDialog.Color;\n        }\n\n        /// <summary>\n        /// Selects the proper page.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void treeView_AfterSelect(object sender, TreeViewEventArgs e)\n        {\n            multiPanel.SelectedPage = multiPanel.Controls.Cast<MultiPanelPage>().FirstOrDefault(\n                page => page.Name == (string)e.Node.Tag);\n        }\n\n        /// <summary>\n        /// Sets the character info max cycle time.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void ACycleInterval_ValueChanged(object sender, EventArgs e)\n        {\n            if (ACycleInterval.Value == 1)\n            {\n                cbG15CycleTimes.Checked = false;\n                panelCycleQueueInfo.Enabled = false;\n                return;\n            }\n\n            ACycleTimesInterval.Maximum = Math.Max(ACycleInterval.Value / 2, 1);\n            panelCycleQueueInfo.Enabled = true;\n        }\n\n        /// <summary>\n        /// Cloud Storage Service > Provider selection.\n        /// Checks the provider authorization.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void cloudStorageProvidersComboBox_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (m_isLoading)\n                return;\n\n            m_settings.CloudStorageServiceProvider.ProviderName = cloudStorageProvidersComboBox.SelectedItem?.ToString();\n            cloudStorageProviderLogoPictureBox.Image = m_settings.CloudStorageServiceProvider.Provider?.Logo;\n            await cloudStorageServiceControl.CheckAPIAuthIsValidAsync(forceRecheck: true);\n        }\n\n        /// <summary>\n        /// General > Network > ESI Settings.\n        /// Opens the application registration page on link click.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void esiSettingsLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)\n        {\n            Util.OpenURL(new Uri(NetworkConstants.CCPApplicationRegistration));\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/SettingsForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"lblMainWindowPage.Text\" xml:space=\"preserve\">\n    <value>You can configure if any info will be shown in the window title and in what order. Choose what skills will be shown in your characters monitors skill list and their highlighted status. Display or not  the overview tab and select the info to be shown.\n</value>\n  </data>\n  <metadata name=\"ttToolTipCodes.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>150, 24</value>\n  </metadata>\n  <data name=\"lblGeneralPage.Text\" xml:space=\"preserve\">\n    <value>Select whether EVEMon will start every time you startup your system. You can choose to disable EVEMon's graphics and select the enviroment it will run in. You can also open EVEMon's Data folder by clicking the related button.</value>\n  </data>\n  <data name=\"lblExternalCalendarPage.Text\" xml:space=\"preserve\">\n    <value>EVEMon can export your current training queue to Microsoft Outlook or Google. This allows you to sync your calendar with your Smart phone, Blackberry etc. so you can take your reminders with you. Early and Late reminders allow you to set the times you will not be available or near EVE to update your queue and the reminder will be set to trigger at these times instead of standard reminder interval.\n</value>\n  </data>\n  <metadata name=\"colorDialog.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>289, 24</value>\n  </metadata>\n  <metadata name=\"imageList.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>35, 24</value>\n  </metadata>\n  <data name=\"imageList.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABG\n        SQAAAk1TRnQBSQFMAgEBEgEAAVQBDAFUAQwBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABUAMAAQEBAAEgBgABUEEAAQEDAwEEAwABAQsAAQEXAAEBAwABAQMAAQEDAAEBBwABAQcAAQGwAAME\n        AQUDFwEgAyIBMgMWAR4DAAEBHwABAQMAAQEPAAEBmAADAQECAx4BKwI9ATwBZwM/AW0DNgFZAwoBDQQA\n        AwgBCwNEAXoCYAFcAdQDYQHiA1kBvgMWAR8EAAMYASEDLwFJAy4BSAMlATcDGQEjAwwBEAMAAQEPAAEB\n        AxABFQMWAR4DEAEVAwEBAowAAwkBDAJSAVEBoQGwAcMBPAH/AcYB0gGVAf8BswG5AYgB/wI6ATkBYAQA\n        Aw4BEwNhAe4BlgGkASAB/wGbAaABQwH/A2EB7gM4AV0EAANKAYwBqAGLAUkB/wGVAUABEgH/AZMBPQEN\n        Af8BmAFFARcB/wGgAVABJwH/AmoBWgH5AmQBYAHnA10B0gNaAcADYgHvAdYB0QHLAf8DYQHiAdkB0gHM\n        Af8DYgHvA0UBfIMAAQEDAgEDAwsBDwNOAZgBpAG0ASQB/wGjAa8BOQH/AVgBXAErAfwDWQHHAk0BTAGR\n        A0IBdgM7AWQDVAGmA1QBrANDAXgDFAEbBAADVAGuAZsBQQEQAf8BlAE8AQsB/wGYAT8BDAH/AZsBQQEN\n        Af8BnAFCAQ4B/wGdAUMBDgH/AZwBQgEOAf8BmwFBAQ0B/wGWAVcBPgH/A6gB/QHWAcsBvwH/AXQBcQFr\n        AfkBxQG5AawB/wGqAaMBnAH/A10B14AAAwUBBwMeASsDSgGMAVoBXAFaAc0CYQFdAeICUQFQAZ8CWAFW\n        AbsBjQGbARYB/wGXAaIBIAH/A2oB+QNFAX4DCAELEAABcAFjAVwB+AGYAT8BDQH/AZkBQAENAf8BnQFD\n        AQ4B/wGgAUUBDwH/AaMBRwEQAf8BpAFHARAB/wGjAUcBEAH/AaEBRQEPAf8BtAGUAU0B/wG3AaIBjAH/\n        AdABxAG1Af8DYQHhAdIBxgG4Af8BtAGfAYkB/wNWAbaAAAMIAQsDNwFaAn8BRgH+AZEBngEcAf8BxAHL\n        AZ4B/wNgAd4CXgFbAdkBpQG2AS0B/wGKAZYBQwH/ATEBOgEsAf8DXAHOA08BpQNOAZcDUQGhAz8BbgMD\n        AQQBhQFtAV8B+wGdAUMBDwH/AZ0BQwEOAf8BogFGARAB/wGmAUkBEQH/AakBSgESAf8BqgFLARIB/wGp\n        AUsBEgH/AacBSQERAf8BpgGPAVIB/wGBAX8BdgH7AdUByAG6Af8BhAGCAXwB+wHCAbUBpwH/AaYBmwGP\n        Af8DXQHKhAADKAE8AZ8BsgEpAf8BwgHRAZAB/wH0AfYB6wH/AdMB2gGxAf8BrAG6ATgB/wKoAUAB/QFx\n        AXQBcgH8AXsCfwH+A1UBtQMoAT0DJwE6A0oBjANJAYkDBwEJA1oBvQGrAU0BGAH/AaEBRgEPAf8BpwFJ\n        AREB/wGsAUwBEwH/Aa8BTwEUAf8BsQFQARUB/wGwAU8BFAH/AawBTAETAf8BtwGTAUkB/wG6AagBlgH/\n        AdgB0AHGAf8DYQHcAdoB0gHJAf8BuQGpAZgB/wNbAcOEAAMdASkDYQHuAakBtQE5Af8BwwHKAaAB/wG5\n        AcMBhQH/AcMBywGbAf8DXAHPA0UBfQNeAdgDTgHwAzgBXQQAAyYBOAMsAUQDAQECAycBOgJqAWMB+QGk\n        AUgBEQH/AaoBSwESAf8BsAFPARQB/wG1AVMBFgH/AbcBVAEXAf8BtQFTARYB/wGwAU8BFQH/Aa0BmgGH\n        Af8BdgFzAW4B/AHUAcYBtwH/AXQBcgFvAfoBwwG1AaQB/wGmAZkBigH/A18B4IgAAxYBHwNEAXkBoQG0\n        ASkB/wGFAZEBDgH/AbABtgGGAf8DVQG1Ay8BSQNFAX0BgwGiAa8B/wNdAeIDPgFrAzMBUgMCAQMIAAMm\n        ATkDVQGtAb0BiQEzAf8BtwFVARkB/wG4AVUBFwH/Ab0BWAEZAf8BuQFWARgB/wGzAVEBFQH/AbgBlAFK\n        Af8BvAGsAZwB/wHbAdQBzAH/A2EB3AHdAdYB0AH/AbwBrQGeAf8DXgHQjAADIQEwAZsBqgEtAf8BpwG2\n        ATkB/wHcAeIBwgH/A1IBqQQAAzIBUANOAZgDZwHyAUwBTQFPAfMDPQFqAwABAQwAAxkBIwHjAa0BgAH/\n        AbsBWAEcAf8BtwFUARcB/wG6AVYBGAH/AbgBVQEXAf8BsgFQARUB/wGtAZ0BjgH/A6gB/QHhAuAB/wNl\n        AfQDWQH1Ab0BvAG6Af8DYAHrjAADIQEwAdcB5AGgAf8BnQGmATQB/wHIAcsBrgH/A1IBqQQAAxIBGAQA\n        A0oBigEBARMBHgH/A0oBihAAAwIBAwNgAd4B0wGQAS0B/wGyAVEBFQH/AbUBUwEXAf8BtQFTARgB/wGu\n        AU4BFAH/AbkBmQFUAf8BzwHKAcYB/wHhAt8B/wGjAqIB/gN0AfgDqAH9A1EBoowAAwUBBwM9AWkDUgGn\n        A1ABnQMmATkDKgFAA1MBqAMtAUYDMQFPA18B4wNUAe4DNwFaAwIBAwwAAx0BKQNSAaEDUAGeA1sBywGx\n        AVEBGwH/AaoBSwESAf8BpQFIAREB/wGgAUYBEQH/A1sBwwMjATQDHgErAwoBDQMAAQGcAAMEAQUDPQFn\n        A2IB9gNhAeIDYAHWA1wB0QNhAeIDLQFGAwEBAhgAAxQBGwNXAboBfwF6AVIB/gFhAlwB+ANQAZsDDQER\n        rwABAQMMARADIAEuAwsBDwMEAQYDBAEFAwYBCAMAAQEkAAMGAQgDAwEEvAADAQECGwABARsAAQEbAAEB\n        AwABAYAAAxABFQMRARcDCAELAwIBA0QAAwcBCQM3AVsDWQG/A0gBhgMWAR8YAANKAYoDVwG3A1UBsgNU\n        Aa8DVAGvA1QBrgNUAa8DVgGrAzIBUAMMBBABFQMQARUDDwEUAw0BEgMHAQoDAQECAwkBDANVAbEDPgH4\n        AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wM+AfgDVQGxAwkBDAMzAVIDQAFu\n        AzMBUwMoATwDGQEjAxABFQMDAQQ4AAMjATMDYQHuAwAB/wFBAVIBYgH+A04BlgMJAQwUAANiAfYBlAIA\n        Af8BlAIAAf8BjwIAAf8BiAIAAf8BjgIAAf8BigIAAf8BgAIAAf8DXAHMAjYBNQFYAzcBWwM3AVsDNwFa\n        AzIBUQMfASwDBAEGA1MBrQNSAfQDAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/\n        AwAB/wMAAf8DUgH0A1QBrwNWAbQBxQG3AYAB/wHFAbgBAAH/AakBlwEAAf8BqAGYAQAB/wJtAWwB9wNc\n        Ac8DVAGvA0IBdQMxAU8DFwEgAwYBCCQAAy4BRwGTAaEBrgH/AwAB/wMAAf8DXwH7A1EBnAMbASYQAANd\n        Ae0BogIAAf8BpwIAAf8B1AHCAbAB/wL+Av8B1gHBAZUB/wHDAawBAAH/AbsBpwEAAf8DZAHnA1cBugNX\n        AboDWAG8A1UBrQNEAXoDKgFAAwYBCANRAfcDAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA\n        Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wNRAfcDVQGwAZ4BjAEAAf8BvwG0AYIB/wGuAZ8BAAH/AY4CAAH/\n        AZICAAH/AZ0BhwEAAf8BoAGLAQAB/wGqAZgBAAH/AasBmQEAAf8CZwFZAfIDXAHfA1IBqQNKAYsDMQFN\n        AxoBJBQAA1UBsgGYAakBuQH/AwAB/wEAAYABqgH/AgABjQH/AkABgQH9A0UBfBAAA10B7QG3AYEBAAH/\n        AbwBhwEAAf8B1QG8AaIF/wHcAcUBggH/AdcBxgEAAf8B0wG/AQAB/wNhAe4DXgHQA10B0gNgAdQDWAG8\n        AkYBRQF/ASwCKwFDAwYBCAMAAf8DAAH/AwAB/wHVAc8BygH/AdABygHFAf8BygHFAcAB/wHCAbwBuAH/\n        AbkBtAGwAf8BtAGvAasB/wGwAasBpwH/Aa4BqgGmAf8BrQGpAaUB/wGtAagBpAH/AwAB/wMAAf8DAAH/\n        A1UBsAGTAgAB/wGUAgAB/wG+AbIBggH/AasBmwEAAf8BjwIAAf8BkQIAAf8BkwIAAf8BlgGBAQAB/wGY\n        AYMBAAH/AaABiQEAAf8BoQGMAQAB/wGsAZcBAAH/AawBlgEAAf8BxwG4AQAB/wNWAbQUAANfAdsBqQG7\n        AcsB/wMAAf8BAAGnAdAB/wGQAasBwwH/AQABgAGFAf8DSAGFEAADXQHtAcEBkAEAAf8BxAGUAQAB/wHZ\n        AcMBrAX/Ad8BywGKAf8B2QHHAQAB/wHSAb0BAAH/A10B7QNcAcwDXAHPA1wB0QNYAbsCRwFGAYADLQFF\n        AwcBCQMAAf8DAAH/AwAB/wHbAdUB0AH/AdcB0QHMAf8B0QHMAccB/wHKAcUBwAH/AcMBvQG5Af8BvAG3\n        AbIB/wG3AbIBrgH/AbMBrgGqAf8BsAGsAagB/wGuAaoBpgH/AwAB/wMAAf8DAAH/A1UBsAGhAZEBAAH/\n        AYUCAAH/AZcBhgEAAf8BwQG2AYsB/wGqAZoBAAH/AZECAAH/AZQCAAH/AZcBgQEAAf8BlwGDAQAB/wGb\n        AYYBAAH/AZwBhwEAAf8BoAGJAQAB/wG8Aa0BAAH/AcUBtgEAAf8DVgGxFAADVAGvAakBuwHLAf8DAAH/\n        AZYBzAHhAf8BsAHQAegB/wGMAZsBqQH/A0gBhRAAA10B7QHDAaABAAH/AckBqAEAAf8B2QHCAaAB/wHp\n        AdoBwAH/AeYB0gGTAf8B2gHGAQAB/wHTAb4BAAH/A10B7QNcAc8DXAHPA1wB0QNYAbwDRwGCAy4BSAMH\n        AQkDAAH/AwAB/wMAAf8B5AHeAdoB/wHeAdkB1QH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA\n        Af8DAAH/AwAB/wMAAf8DVQGwAcEBuAGYAf8BpQGaAQAB/wGNAgAB/wGbAYgBAAH/Ab4BsAGCAf8BswGk\n        AQAB/wG1AaYBAAH/AbEBoQEAAf8BrwGgAQAB/wGvAZ8BAAH/AaYBkwEAAf8BtwGlAQAB/wHFAbYBgAH/\n        AagBkQEAAf8DVQGwFAADXgHVAZwBsgHGAf8CAAGQAf8BtQHeAe8B/wGuAdIB5wH/AZgBrgHCAf8DSAGF\n        EAADXQHtAcIBqAEAAf8BxwGsAQAB/wHMAa4BAAH/AeEB1AG7Af8B4wHPAYgB/wHeAcsBiAH/AdIBuwEA\n        Af8DXQHtA1wBzQNcAc8DXQHSA1cBugNIAYMDLwFJAwgBCwMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA\n        Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DVQGwAcABtwGVAf8BvgG3AZ4B/wGy\n        AaoBiAH/AZoBigEAAf8BrQGcAQAB/wHVAcsBsQH/Aa8BnwEAAf8BpgGWAQAB/wGrAZoBAAH/AbEBoAEA\n        Af8ByQG+AY8B/wHGAboBiQH/AaMBjwEAAf8BogGMAQAB/wNVAbAQAAM1AVYDZQH0AZEBrgHGAf8CAAGN\n        Af8BlQHGAeIB/wGlAc4B7wH/AbEBywHhAf8DSAGFEAADWQH1AcABrQEAAf8BwwGoAQAB/wHTAbsBgAH/\n        AfYB7QHZAf8B4gHMAQAB/wHaAcQBAAH/AcwBsQEAAf8DYQHuA10BygNcAcwDXAHPA1cBuANEAXsDLQFF\n        AwcBCgMAAf8DAAH/AwAB/wH0AfIB8QH/AfAB7QHqAf8B6gHmAeMB/wHlAeAB3AH/AeEB3AHXAf8B3wHZ\n        AdQB/wHaAdQB0AH/AdYB0AHLAf8B0AHKAcUB/wHJAcMBvwH/AwAB/wMAAf8DAAH/A1UBsAHAAbcBlQH/\n        AbsBtAGZAf8BvQG2AZkB/wHFAb0BmgH/AdQBywGxAf8BsAGiAQAB/wGOAgAB/wGRAgAB/wGWAYEBAAH/\n        AZcBgQEAAf8BrgGcAQAB/wHGAboBigH/AaMBjwEAAf8BoQGLAQAB/wNVAbAQAANIAYUBzwHeAegB/wGC\n        AaABuwH/AgABjwH/AYoBvgHdAf8BhQGzAdcB/wGnAcUB3wH/A0gBhRAAA1YBswNcAeoDXQHwA18B8wNt\n        AfcDTQH6A00B+gNqAfkDYAHeA1kBxwNeAdgDYAHeA14BzgNSAakDOgFiAwQBBgMAAf8DAAH/AwAB/wH5\n        AfgB9wH/AfYB9AHzAf8B8gHvAe0B/wHtAeoB5wH/AekB5QHhAf8B5QHgAdsB/wHgAdsB1gH/Ad4B2AHT\n        Af8B2QHUAdAB/wHVAc8BywH/AwAB/wMAAf8DAAH/A1UBsAHAAbcBmAH/Ab0BtAGYAf8BxQG9AZkB/wHb\n        AdIBvAH/AcoBwwGlAf8BtgGuAY4B/wGpAZ0BAAH/AZcBhwEAAf8BlAIAAf8BlwGDAQAB/wGYAYMBAAH/\n        AbQBpAEAAf8BwgGxAQAB/wGiAYwBAAH/A1UBsBAAA0gBhQHYAeMB7QH/AQABlQGyAf8BAAGBAaQB/wGH\n        AbQB2AH/AYcBtwHcAf8BiAGsAc0B/wNIAYUUAAMcASgDOwFlA0gBgwNVAbIDXAHNA10BygNdAcoDWwHI\n        A1wByQNhAeEDXwHoA18B2wNbAcQDQAFwAwIBAwMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/\n        AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DVQGwAcQBuwGZAf8BxwG+AZwB/wHcAdMBvAH/\n        AckBwQGhAf8BvAGzAZUB/wG7AbQBnAH/Ab4BtwGeAf8BtgGvAZEB/wGsAZ8BAAH/AZ4BjgEAAf8BmAGF\n        AQAB/wGbAYYBAAH/Ab0BrgEAAf8BugGoAQAB/wNVAbAQAANIAYUBwQHVAeUB/wHMAdsB6AH/AZwBtwHM\n        Af8BwAHaAeoB/wGNAboB3QH/AZEBtQHWAf8DSAGFFAADEwEaAzcBWwJFAUQBfANWAbEDXAHNA1sBxgNg\n        Ad4CYgFfAfYCYgFgAfYDTQH6A00B+gNhAdwDWQG/A0ABbgMCAQMDAAH/AwAB/wMAAf8C/QH8Af8B/QL8\n        Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wNVAbABzwHGAaYB/wHc\n        AdcBvQH/Ac4BxwGoAf8BvQG1AZgB/wG9AbQBnQH/AbsBswGZAf8BugGzAZgB/wG7AbQBmQH/Ab0BtgGd\n        Af8BuAGxAZUB/wGxAacBAAH/AakBmQEAAf8BqgGYAQAB/wHFAbUBAAH/A1YBtBAAAy0BRQNdAfAB4wHv\n        AfUB/wH6AfwB/QH/Ac4B4AHuAf8BugHcAfQB/wGPAbAB0AH/A0gBhRQAAxYBHgM4AV0CRgFFAX4DUwGo\n        A1gBvANWAbYDYQHaAwAB/wKWAQAB/wGBAgAB/wJ/AWAB/gNdAdcDWQG/A0ABbwMDAQQDAAH/AwAB/wMA\n        Af8C/QH8Af8C/QH8Af8B/QL8Af8C/AH7Af8B+wL6Af8B+QH4AfcB/wH2AfQB8wH/AfIB8AHuAf8B7gHr\n        AegB/wHrAecB4wH/AwAB/wMAAf8DAAH/A1UBsgHqAeUB0wH/Ad0B1wG8Af8BzgHGAaUB/wHNAcQBpwH/\n        AcQBugGZAf8ByAG/AZ0B/wHQAcYBpgH/AdABxwGlAf8ByAG/AZ4B/wHHAb8BnwH/AcUBvQGfAf8DXwH7\n        A2cB8gNfAegDUQGfFAADMAFLA2AB6wHnAfAB9gH/AfYB+gH9Af8BvQHZAfAB/wGZAb0B1gH/A0gBhRMA\n        AQEDFgEfAToCOQFgAkcBRgGBA0cBggJHAUYBgANEAXkCVwFVAboBjQGUAQAB/wGZAZ4BAAH/AwAB/wNN\n        AfoDXAHJA1kBxwNCAXMDAwEEAwAB/wMAAf8DAAH/AfwB+wH6Af8B/QL8Af8C/QH8Af8B/QL8Af8B/QL8\n        Af8B/AL7Af8B+wH6AfkB/wH5AfcB9gH/AfYB9AHyAf8B8gHvAe0B/wMAAf8DAAH/AwAB/wNEAXoDVAGv\n        AzIBUQMvAUkDKwFCAzYBWAMkATUDGAEhAxQBGwMoATwDKAE8AxkBIwMSARkDDAEQAwUBBwMEAQUYAAMs\n        AUMDagH5AdgB4wHtAf8B8AH1AfkB/wGmAcYB2AH/A0gBhRMAAQEDFQEdATUCNAFVA0IBdgNEAXoCRQFE\n        AXwDQgF1AVgCVgG5AwAB/wMAAf8DAAH/AWIBYAFIAfYDUQGfA0wBkAMyAVADBAEGAW0CUQH3AQYCAAH/\n        AQYCAAH/AQYCAAH/AQYCAAH/AQYCAAH/AQYCAAH/AQYCAAH/AQUCAAH/AQUCAAH/AQUCAAH/AQUCAAH/\n        AQUCAAH/AQUCAAH/AQUCAAH/AW0CUQH3AxQEGwEmAxQBGwMMARADBAEGAwQBBUQAAy4BSANfAegB8QH1\n        AfcB/wNcAeoDOgFiEwABAQMKAQ4DHAEnAygBPAMtAUUDMAFLAywBRAFSAlABpAMAAf8DAAH/AwAB/wFZ\n        AlQB7gE1AjQBVQMmATgDFAEcAwMBBAFVAlMBrQFfAU8BTAHzAQsCAAH/AQsCAAH/AQsCAAH/AQsCAAH/\n        AQsCAAH/AQsCAAH/AQsCAAH/AQsCAAH/AQsCAAH/AQsCAAH/AQsCAAH/AQsCAAH/AV8BTwFMAfMBVQJT\n        Aa1gAAMpAT4DOAFcAyoBQQMCAQMXAAEBAwIBAwMEBAYECAELAwcBCgMaASUDKgFAAygBPQMoAT0DJQE3\n        AwoBDgMFAQcDAgEDAwABAQMJAQwDUwGqAlkBQgH1AQ4CAAH/AQ4CAAH/AQ4CAAH/AQ4CAAH/AQ4CAAH/\n        AQ4CAAH/AQ4CAAH/AQ4CAAH/AQ4CAAH/AQ4CAAH/AlkBQgH1A1MBqgMJAQwIAAJiAVgB6QGMAgAB/wGP\n        AgAB/wGRAgAB/wGTAgAB/wGVAYEBAAH/AZgBggEAAf8BnAGHAQAB/wGjAY4BAAH/AakBlwEAAf8BsAGd\n        AQAB/wG1AZ8BAAH/AywBQyAAAwMBBAMyAVEDMgFQAwUBBwcAAQEDAAEBGAADAQECAwYBCAMNARIDFAEc\n        AxIBGQMRARcDCAELAwEBAlgAAmIBWAHpAaMBlAEAAf8BrAGdAQAB/wG1AacBAAH/AbcBqgEAAf8BrAGc\n        AQAB/wGoAZcBAAH/Aa0BnAEAAf8BtAGjAQAB/wG7AaoBAAH/AcIBsgEAAf8BtwGlAQAB/wMsAUMXAAQB\n        AQIEAANKAYsDAAH/AwAB/wNFAX0HAAEBAwABARAAAwIBAwMHAQoDIQExAzwBZwNcAc4DVgG+A1oB1QNI\n        AYQDPwFvAycBOwMQARUDAQECUAACYgFYAekBtwGsAYQB/wHRAcoBrwH/AdwB1gHAAf8B4QHbAcgB/wG0\n        AaUBAAH/AaYBlAEAAf8BqQGXAQAB/wGvAZ4BAAH/AbcBpgEAAf8BvgGuAQAB/wG1AaIBAAH/AywBQw8A\n        AQEDAgEDAwYBCAMEAQUDKAE9AwAB/wMAAf8DAAH/A1oB0wMGAQgHAAEBCwABAQQAAwQBBQMkATUDVAGr\n        AwAB/wIAAYMB/wIAAYYB/wMAAf8DAAH/A1EB9wNTAa0DRAF8AyUBNwMHAQkDAAEBGAADEAEWAzIBUANV\n        AbUDUAGdAzABTQMEAQUDBAEFAwQBBQMCAQMMAAJiAVgB6QGfAZABAAH/AaUBlwEAAf8BrAGeAQAB/wGw\n        AaIBAAH/AakBmQEAAf8BpQGUAQAB/wGoAZYBAAH/Aa4BnAEAAf8BtQGjAQAB/wG8AasBAAH/AbMBnwEA\n        Af8DLAFDCwABAQMEAQUDCgENAxEBFwMOARMDSwGQAwAB/wN/Af4DAAH/A1kBzwMNAREDAgEDAwIBAwMA\n        AQELAAEBAw8BFAMAAf8DAAH/AU0BUgFhAf4BAAGBAZIB/wIAAYkB/wGsAa8BuAH/AgABiAH/AwAB/wMA\n        Af8DVgG+A0oBjQMyAVEDEQEXGAADSwGQAV0CXwHzAWUBdgF/Af4DXwHgA1UBugMgAS8YAANiAekBpgGZ\n        AQAB/wGmAZgBAAH/AakBmwEAAf8BqwGcAQAB/wGoAZgBAAH/Aa4BngEAAf8BrgGeAQAB/wG1AaUBAAH/\n        AbcBqAEAAf8BvQGuAQAB/wGwAZ8BAAH/AysBQgcAAQEDBAEFAwsBDwMVAR0DHwEsAx8BLQNWAbkDAAH/\n        AQABjQGHAf8BAAGFAQAB/wNWAbYDEgEZAxABFQMHAQoDAgEDAwABAQQAAygBPQNWAb4DAAH/A38B/gHj\n        AecB7QH/AaIBpwG5Af8CAAGEAf8DAAH/AwAB/wMAAf8DAAH/A2IB7wNQAZoDPwFuAy4BSBQAA0gBhQNd\n        Ae0DAAH/AwAB/wMAAf8DXwHgA00BlQMEAQUUAANiAekB0AHJAbAB/wHVAc4BtwH/AcYBvAGbAf8BzQHE\n        AaYB/wHBAbYBjwH/Ac8BxgGnAf8ByQG+AZkB/wHUAcsBrQH/AcMBtgGHAf8BvQGuAQAB/wJ/AVUB/gMq\n        AUAEAAMDAQQDCQEMAxQBGwMhATADKgFAA0MBeANfAfMBAAGIAYMB/wEAAZgBlgH/AQACuAH/A04BmAMj\n        ATMDGwEmAw8BFAMGAQgDAQECBAADBwEJAwAB/wEWARoBJgH+AdIB1gHeAf8B+AH7Av8B4QHkAekB/wN/\n        Af4DAAH/AwAB/wE9AUEBTgH+AiEBLAH+AwAB/wNIAYcDNQFXAygBPBAAAzwBaANaAd4BAAGNAa0B/wMA\n        Af8DAAH/AwAB/wMAAf8DXwHgAzMBUxQAA2IB6QHSAcsBswH/AdMBzQG2Af8BwAG2AZMB/wGvAaIBAAH/\n        AboBrQGCAf8BuAGqAQAB/wG/AbIBhgH/AcABswGHAf8BxAG3AYoB/wG+Aa4BAAH/AawBmAEAAf8DKgFB\n        BAADBQEHAxABFQMdASkDKgFAA0IBdgNkAfEBuQHmAeMB/wGUAdMB0gH/AaEB3QHcAf8ByQLzAf8DYAHU\n        AzMBUgMlATcDFgEeAwoBDQMDAQQEAANIAYYDAAH/AwAB/wGpAawBvAH/Ae4B8AH2Af8B9gH7Av8DXgHV\n        A0ABbwNGAYADAAH/AwAB/wGxAbMBvQH/A2IB6QMjATMDFwEgDAADIQEwA1cBvwN/Af4BAAGdAcAB/wMA\n        Af8DAAH/AwAB/wMAAf8DAAH/A1kBzwMhATADAAEBDAADYgHpAcsBwwGoAf8B1AHOAbcB/wHOAccBrQH/\n        Ab4BtAGPAf8BtgGqAQAB/wG/AbMBigH/AbYBqAEAAf8BuAGqAQAB/wHAAbMBhgH/AbsBqwEAAf8BpwGV\n        AQAB/wMqAUEEAAMHAQoDFAEcAyQBNgMzAVIDXAHMAeYD/wG5AucB/wHhAvcB/wHkAvYF/wN/Af4DRQF/\n        AysBQgMcAScDDQESAwQBBgQAAxkBIwMAAf8DAAH/AwAB/wGwAbcBxQH/A04BlAMHAQoDCQEMA0QBewMA\n        Af8BxAHJAdMB/wMAAf8BogGnAbMB/wMNARIDBQEHCAADIwE0A1kBwwOoAf0B2QH+Av8BkwG3AdsB/wIA\n        AYwB/wMAAf8DAAH/AwAB/wMAAf8DXwHgA0oBjQMQARYMAANiAekB1QHPAboB/wHgAdsBywH/AdkB1AHA\n        Af8B2wHWAcMB/wHYAdIBvAH/AcEBtQGOAf8BwAG0AYsB/wHCAbUBiwH/AcUBuQGPAf8BrwGdAQAB/wJ/\n        AUsB/gMpAT8EAAMJAQwDFwEgAygEPQFqA2EB7gHSAvQB/wHeAvQF/wH3AvwF/wH6A/8DUgGpAy4BSAMg\n        AS8DEAEWAwYBCAQAA0oBiwMAAf8DAAH/AwAB/wNdAcoIAAM+AWwDAAH/AwAB/wMAAf8BmAGbAagB/wNi\n        Ae8DDQERDAADRAF5A10B8AH1A/8D/QH/AbgB3AH+Af8BAAGEAaUB/wMAAf8DAAH/AwAB/wMAAf8DTwGX\n        AwwBEAMEAQYMAANiAekB1AHOAbcB/wHmAeIB1QH/AecB5AHXAf8B5wHjAdcB/wHbAdYBxAH/AeAB2wHK\n        Af8B2AHRAbkB/wHTAcoBrAH/Ab8BsgGEAf8BtAGkAQAB/wJ/AUQB/gMpAT8EAAMKAQ4DGAEiAykBPwM+\n        AWsDXQHtAdMC9gH/Ad0C8wH/Af4D/wHzAvsB/wHYAu8B/wHgAv4B/wNUAa4DMAFLAyEBMAMQARYDBQEH\n        CwAB/wMAAf8DAAH/A1sB0ANKAYwDVwHoAwAB/wMAAf8B8QHzAfcB/wN/Af4B5wHmAesB/wNhAeQYAANB\n        AXIDZAHsAdUB+gL/AQABlgG0Af8DAAH/AwAB/wMAAf8DWQHSGAADYgHpAdYB0AG6Af8B0QHLAbMB/wHQ\n        AckBsQH/Ac8ByAGvAf8BzgHHAa0B/wHPAcgBrwH/AdABygGxAf8BxwG+AZ4B/wG1AacBAAH/Aa0BnQEA\n        Af8CfwFBAf4DKQE/BAADCgENAxcBIAMoAT0DNwFbA10BygHFAvYB/wG9AukB/wHdAvAB/wHTAu0B/wG+\n        AuoB/wMrAfwDSAGHAy4BSAMeASsDDwEUAwQBBggAA1oBvQMAAf8BWwFgAW8B/gMAAf8CAAGCAf8BhQGH\n        AZUB/wHvAfAB+AH/AccBzwHZAf8B7AHuAfIB/wHjAeQB7QH/AbEBugHGAf8DIAEvAwEBAhQAA0IBdgNh\n        Ae4B+AP/AQABoQG+Af8DAAH/AwAB/wMAAf8DWgHNGAADYgHpAeAB3AHMAf8B2wHVAcIB/wHQAckBsQH/\n        AcsBxAGoAf8BygHCAaYB/wHKAcIBpgH/AcoBwgGmAf8BygHCAaYB/wHIAb8BoQH/Ab4BswGKAf8CfwFQ\n        Af4DKQE/BAADBwEKAxMBGgMjATMDMgFQA0UBfQNkAecBmwLpAf8BrwLvAf8BtwLvAf8BngLbAf8DVgGz\n        AzgBXQMpAT8DGQEjAwwBEAMDAQQIAAMDAQQDZAHxAcsBzAHYAf8BiQGLAZkB/wHVAdYB3wH/AbMBtgHD\n        Af8C4wHrAf8C7QHvAf8DfwH+A38B/gMrAfwDEwEaAwIBAwcAAQEDAAEBCAADQgF1A10B7QT/AQABmAG9\n        Af8DAAH/AwAB/wMAAf8DWAHRGAADYgHpAeoB5wHcAf8B4wHeAc8B/wHeAdoByQH/Ad8B2wHKAf8B2AHS\n        Ab0B/wHKAcIBpgH/AcoBwgGmAf8BygHCAaYB/wHKAcIBpgH/AcoBwgGmAf8DTQH6AyQBNgQAAwQBBgMN\n        ARIDGgElAykBPwM1AVcDRAF5A1UBtQFbAl4B0AFYAlsBxgNOAZQDOQFgAy8BSQMgAS8DEgEZAwcBCgMB\n        AQIMAAMLAQ8DTQH6AdEB0gHcAf8DfwH+A38B/gHPAdMB3AH/Ae4B8QH4Af8BzAHRAdkB/wNgAesDFQEd\n        AwcBCgMAAQEUAAM/AW4DYgHpBP8BgQGjAcMB/wMAAf8DAAH/AgABgQH/A1cBvxgAA2IB6QHzAfEB6wH/\n        Ae0B6gHhAf8B5wHjAdcB/wHaAdUBwgH/Ad4B2QHHAf8B2gHUAcAB/wHMAcUBqgH/AcsBxAGpAf8BywHE\n        AakB/wNfAfsDRQF8AwEBAgQAAwIBAwMIAQsDEgEYAx0BKgMpAT8DMgFRAzcBWwM6AWIDOAFeAzQBVAMt\n        AUYDIgEyAxYBHgMLAQ8DBAEFFAADBAEGA0QBeQNfAegBwwHGAdIB/wNfAeADZwHyAxoBJAMdASoDCAEL\n        AwEBAhgAAzwBZwNbAcgDfwH+A38B/gMAAf8DAAH/A14B2BwAA2IB6QHZAdgB1AH/AdABzAHBAf8BxAG+\n        AasB/wG5AbMBlgH/AbMBqQGIAf8BswGpAYgB/wGzAakBiAH/AbMBqQGIAf8DKwH8A0UBfAMBAQIMAAME\n        AQUDCQEMAxEBFwMbASYDIgEyAygBPAMqAUEDKQE/AyUBNwMdASoDFAEcAwsBDwMEAQYDAAEBGwABAQME\n        AQUDMAFLAwsBDwMVAR0DBwEKAwQBBgMBAQIcAAMQARYDJwE7Ay8BSQMzAVMDNgFZAzgBXQMqAUEcAANY\n        AcEDWQG+A1YBsQNUAawDUwGqA1IBqQNSAakDUgGpA1MBqAM9AWgDAQECEwABAQMDAQQDBwEKAw0BEQMS\n        ARkDFgEfAxgBIgMYASEDFAEcAw8BFAMJAQwDBAEGAwABASMAAQEDAAEBAwIBAwMBAQKYAAKbAZwB/wKb\n        AZwB/wKbAZwB/wKbAZwB/wKbAZwB/wKbAZwB/wKbAZwB/wKbAZwB/wKbAZwB/wKbAZwB/wKbAZwB/wKb\n        AZwB/wKbAZwB/wKbAZwB/wKbAZwB/wKbAZwB/0QAAwIBAwQAAwQBBQMGAQgDAQECAwcECgENAwUBBwMI\n        AQsDBwEKAwQBBQMEAQYDAgEDBAADAQECQAACmwGcOf8CmwGcAf8DUQGiAwAB/wMAAf8DAAH/AwAB/wMA\n        Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DUQGiAwEBAgMHAQkDFgEeAzABSwM7\n        AWUDLQFGAxwBJwMaASUDFAEcAxoBJQMZASMDKAE8AxYBHwMHAQoDBgEIAwQBBUAAApsBnAH/ApsBnAH/\n        ApsBnAH/ApsBnAH/ApsBnAH/ApsBnAH/ApsBnAH/ApsBnAH/ApsBnAH/ApsBnAH/ApsBnAH/ApsBnAH/\n        ApsBnAH/ApsBnAH/ApsBnAH/ApsBnAH/A1QBrgMAAf8BrwGdAY4B/wGOAgAB/wGAAgAB/wGTAgAB/wGk\n        AgAB/wGxAYMBAAH/AbABggEAAf8BnwIAAf8BjwIAAf8BkwIAAf8BlgIAAf8BkQIAAf8DAAH/A1QBrgMC\n        AQMDDAEQAzwBZwNbAcgDTgGXA0YBgQNFAX4DOAFcAy0BRgMvAUkDRQF9AysB/AM/AW0DDwEUAwYBCAME\n        AQUIAAMDAQQDDAEQAw4BEwMJAQwDBAEFAwABASAAApsBnDn/ApsBnAH/A1QBrgGFAgAB/wHZAcoBvAH/\n        AcYBsAGZAf8BvgGeAYQB/wHKAaoBjAH/AdoBtQGTAf8B6gHCAZgB/wHoAcEBmQH/Ad4BuQGTAf8B0AGq\n        AYkB/wHNAbEBlQH/Ad0BzQG1Af8B3QHLAbYB/wMAAf8DVAGuAxIBGQNRAaIDTQH6AzQB/ANiAe8DSAGG\n        A0oBjQNLAY8DPAFmAz0BaQNQAZsDXwH7A0EBcwMQARYDBAEFAwIBAwQAAyABLgNWAbsDQgH1AyEB+wNC\n        AfUDXQHiA1kBwwNOAZkDPQFpAyEBMQMGAQgQAAKbAZwB/wP6Af8D8AH/AboBpwGlAf8BugGnAaUB/wG6\n        AacBpQH/AboBpwGlAf8BugGnAaUB/wG6AacBpQH/AboBpwGlAf8BugGnAaUB/wG6AacBpQH/AboBpwGl\n        Af8B2QLXAf8B1gLVAf8CmwGcAf8DVAGuAZECAAH/AecB1QHCAf8BzgGxAZMB/wHRAaoBiQH/Ad8BtQGQ\n        Af8B9AHKAZwB/wH+AdwBqwH/Af0B2QGpAf8B8gHIAZwB/wHkAboBkQH/AdcBtgGWAf8B4QHKAa4B/wHZ\n        AcMBqwH/AwAB/wNUAa4DHQEqA1wBzANNAfoDXwH7A18B+wNTAfEDVwG9A1YBswNTAaoCWAFWAbwDKwH8\n        AysB/ANNAfoDNwFaAwoBDgMCAQMDDQERA1sB1gMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/\n        AwAB/wNVAeoDUAGkAy8BSgMEAQYEAAKbAZwB/wL7AfwB/wPyAf8BugGnAaUB/wH4AeEB1QH/AfgB4QHV\n        Af8BugGnAaUB/wHsAesB7AH/AukB6AH/AboBpwGlAf8B4wLiAf8B3wHeAd8B/wG6AacBpQH/A9kB/wHX\n        AdYB1wH/ApsBnAH/A1QBrgGjAgAB/wHvAdwBxgH/AdYBsgGOAf8B5gG9AZMB/wH0AcsBoAH/AfwB4QGy\n        Av8B8AHBAf8B/gHrAbwB/wH6AdkBqQH/AfIBygGgAf8B5AHBAaAB/wHpAdMBuAH/AeAByQGyAf8DAAH/\n        A1QBrgMHAQkDGAEhA0gBhwFTAVgBVwHxAysB/AMrAfwDWAHpA1YBtgNUAasBVgJVAbQDXgHZA1wB+ANK\n        AYsDJgE4AxABFgMCAQMDOwFjAwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA\n        Af8DAAH/AwAB/wNXAd8DRQF+ApsBnAH/AfwC/QH/A/MB/wG6AacBpQH/AfgB4QHVAf8B+AHhAdUB/wG6\n        AacBpQH/A+0B/wPqAf8BugGnAaUB/wHkAuMB/wLhAeAB/wG6AacBpQH/AdsC2gH/AdkC1wH/ApsBnAH/\n        A1QBrgGxAYQBAAH/AfkB7wHdAf8B6gHLAakB/wHxAcYBmAH/AfwB3QGwAv8B7wHAAv8B/AHOAv8B9QHG\n        Af8B/gHiAbIB/wH4AdMBpAH/AewBzQGqAf8B7AHXAboB/wHfAc0BuAH/AwAB/wNUAa4DBAEFAxQBHAMa\n        ASQBPQI8AWgDWgHVA1sB2QNcAecDVQGyA1EBoANWAbkDVwG/A00BlgNAAXEDKwFDAw0BEQMDAQQDUgGp\n        AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DUAOb\n        AZwB/wH9Af4B/QH/AvUB9AH/AboBpwGlAf8BugGnAaUB/wG6AacBpQH/AgABiwH/AgABiwH/AgABiwH/\n        AgABiwH/AboBpwGlAf8BugGnAaUB/wG6AacBpQH/A9wB/wHaAtkB/wKbAZwB/wNUAa4BtAIAAf8B9wHq\n        AdQB/wHyAdQBsQH/AfcB0AGeAf8B/gHpAbgC/wH5AckD/wHaAv8B/AHRAv8B8AHAAf8B/AHgAa0B/wHv\n        Ac4BqQH/AewB1AG1Af8B2wHJAbIB/wMAAf8DVAGuAwcBCQMcASgDKQE+A1wBzANfAfsDXwH7A18B+wNZ\n        AfUDVwHoA0EB+QMrAfwCWwFYAcsBRQJEAXwDNQFYAyABLgMDAQQDRAF5A2EB7gMAAf8DAAH/AwAB/wMA\n        Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A1sB3gM1AVYDAQECApsBnAH/Af0B/gH9Af8D9QH/\n        AboBpwGlAf8C8gHzAf8C8gHzAf8CAAGLAf8BtgHGAdMB/wG2AcYB0wH/AgABiwH/AecC5gH/A+MB/wG6\n        AacBpQH/Ad0B3AHdAf8B2wLaAf8CmwGcAf8DVAGuAbQBgwEAAf8B8QHbAbwB/wH0AdEBpAH/Af0B3AGt\n        Av8B8QHBAv8B/QHTA/8B5QL/Af4B3QL/AfsBzwH/Af4B5wG2Af8B8gHUAbIB/wHtAdoBwAH/AeABzwG8\n        Af8DAAH/A1QBrgMIAQsDIAEvAzgBXgIzATIB/AI0ATMB/ANfAfsDKwH8A18B+wFgAWIBYQH2AVkBWAFX\n        Ab8CWAFWAbsDTgGUA0QBegM0AVQDHgErAwQBBgQAAwIBAwMfASwDOAFdA0gBgwNQAZ0DUgGpA1YBqwNS\n        AaMDTAGTA0cBgAM/AWwDMQFOAwMBBAgAApsBnAH/A/cB/wHvAvAB/wG6AacBpQH/A+wB/wPsAf8CAAGL\n        Af8BtgHGAdMB/wG2AcYB0wH/AgABiwH/A+IB/wLfAd4B/wG6AacBpQH/AdkC2AH/AtYB1QH/ApsBnAH/\n        A1QBrgG3AYsBAAH/AfoB7QHVAf8B+gHgAbkC/wHxAcEC/wH9AdQD/wHdA/8B8QP/AfAD/wHhAf8B/gHv\n        AboB/wHyAdYBsQH/AfAB3QHAAf8B4wHTAb0B/wGBAgAB/wNUAa4DCQEMAx4BKwM+AWsDbQH3A18B+wNf\n        AfsDKwH8AysB/AMrAfwDKwH8A1kByQFAAj8BbgM0AVQDIQEwAwoBDQMFAQdAAAKbAZwB/wPcAf8C1wHW\n        Af8BugGnAaUB/wG6AacBpQH/AboBpwGlAf8CAAGLAf8CAAGLAf8CAAGLAf8CAAGLAf8BugGnAaUB/wG6\n        AacBpQH/AboBpwGlAf8BwwLCAf8CwAG/Af8CmwGcAf8DVAGuAcEBlwEAAf8B/QHtAdQB/wH9AeYBuQL/\n        Af4B3QP/AekD/wH2B/8B/gP/AfMC/wH8AdYB/wH5AecBxAH/AfUB4gHGAf8B6gHaAcIB/wGAAgAB/wNU\n        Aa4DCQEMAxQBGwNCAXUDUgGjA1wB+ANNAfoDXwH7AysB/AMrAfwBVgFfAVoB+wMrAfwDUQGgAzEBTwMh\n        ATADDQERAwQBBkAAApsBnAH/A74B/wG+Ab0BvgH/A70B/wO7Af8CugG5Af8DtwH/AbUCtgH/A7MB/wOx\n        Af8CrwGuAf8CrQGsAf8DqgH/A6gB/wOlAf8CmwGcAf8DVAGuAwAB/wGCAgAB/wGAAgAB/wGUAgAB/wGk\n        AYMBAAH/AaUCAAH/AacBgAEAAf8BowIAAf8BpAIAAf8BoAIAAf8DAAH/AwAB/wMAAf8DAAH/A1QBrgMI\n        AQsDEAEVAx0BKQMoAT0CQAE/AW8DXgHOA18B+wMrAfwDXwH7AysB/AMrAfwDXAH4Az8BbgMXASADBwEK\n        AwQBBUMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/\n        AwAB/wMAAf8DVAGuAwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/\n        AwAB/wMAAf8DVAGuAwEBAgMUARsDBQEHAx8BLQMqAUEDIwEzAzcBWgJAAT8BbwI9ATwBZwNYAeYDKwH8\n        AysB/AFYAmIB7wMpAT4DBAEFAwQBBUMAAf8DWQH1AQABhAGgAf8BAAGAAZsB/wIAAZYB/wIAAZEB/wIA\n        AYwB/wIAAYkB/wIAAYgB/wIAAYYB/wIAAYIB/wIAAYEB/wMAAf8DAAH/AwAB/wMAAf8DVAGuAY4BoAGl\n        Af8BlAGcAagB/wMAAf8DAAH/AwAB/wMAAf8BmAIAAf8BoAIAAf8BlAIAAf8DAAH/AwAB/wMAAf8DAAH/\n        AwAB/wNUAa4DAQECAwsBDwMUARsDEAEWAxcBIAMjATMDMAFMAjEBMAFNAyYBOQM7AWUDTQH6A18B4ANR\n        AaEDJAE2AwYBCAMEAQVDAAH/A1kB9QEAAYgBowH/AQABiAGjAf8BAAGIAaMB/wEAAYgBowH/AQABiAGj\n        Af8BAAGJAaQB/wEAAYkBpAH/AQABiAGjAf8BAAGDAZ8B/wIAAZoB/wIAAZMB/wIAAYsB/wIAAYMB/wNZ\n        AfUDUQGiAysB/ANUAe4DVAHuA1QB7gNUAe4DVAHuA1QB7gNUAe4DVAHuA1QB7gNUAe4DVAHuA1QB7gMr\n        AfwDUQGiBAADAwEEAwcBCgMSARkDFgEeAwwBEAMSARgDFAEbAxMBGgMRARcDJgE4AwoBDQMGAQgDBgEI\n        AwQBBgMEAQVAAAFGAkcBgAMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/\n        AwAB/wMAAf8DAAH/AUYCRwGATAADAQECAwYBCAMNARIDDAEQAwQBBgMCBAMBBAMCAQMEAAMBAQIDAQEC\n        BAADAQECRAADWwHEA5EB/wORAf8DkQH/A5EB/wORAf8DkQH/A5EB/wORAf8DkQH/A5EB/wORAf8DkQH/\n        A18B4AQAAwoBDgMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA\n        Af8DAAH/AwYBCBMAAQEDAgEDAwQBBgMFAQcDBAEGAwQBBgMEAQYDBAEGAwEBAgMAAQFMAAOVAf8DvwH/\n        A8MB/wPDAf8DwwH/A8MB/wPDAf8DwwH/A8MB/wPDAf8DxAH/A8UB/wPCAf8DlQH/BwAB/wMAAf8DAAH/\n        AwAB/wMAAf8BiAIAAf8DAAH/AwAB/wGCAgAB/wGJAgAB/wGVAgAB/wGXAgAB/wGaAgAB/wGeAgAB/wMA\n        Af8DAAH/CwABAQMDAQQDJgE5AzUBVgM7AWMDPAFoAz8BbQM/AW8DPwFtAzsBZQM1AVgDMQFOAzABSwMH\n        AQpEAAO8Af8DZAHxA6gB/QP8Af8D/AH/A/wB/wP5Af8D9gH/A+wB/wPYAf8D4AX/A/cB/wPHAf8HAAH/\n        AwAB/wMAAf8DAAH/AYECAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BiwIAAf8BnQIAAf8BvAIAAf8B4AIA\n        Af8B0gIAAf8DAAH/BwABAQMDAQQDDgETA2AB6wGpAbYBtQH/AZsBqQGnAf8BjwKaAf8BjAKZAf8BiwKY\n        Af8BjgGfAaIB/wGKAZwBogH/AYYBlQGbAf8BlgGhAaUB/wNgAdQDDAEQRAADyQH/A6gB/QP7Af8D+wH/\n        A/sB/wP7Af8D+AH/A/MB/wPrAf8D2wH/A/0B/wPiBf8DzAH/BwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/\n        AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AYwCAAH/AaMCAAH/AcQCAAH/AwAB/wMBAQIDAQECAw0BEQMl\n        ATcDXQHKAckB1QHWAf8BtgLEAf8BoAKtAf8BmAGpAaoB/wGHAaEBogH/AZkBswG0Af8BoQHAAcMB/wGZ\n        AbQBtwH/A38B/gNVAbEDBAEGQwABAQPJAf8D/AH/A/sB/wP7Af8D+wH/A64B/wP5Af8DvgH/A+AB/wPd\n        Af8D/AH/A/0B/wPgAf8DywH/BwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BnQIAAf8BnQIA\n        Af8DAAH/AZ0CAAH/AwAB/wGGAgAB/wHAAgAB/wMAAf8DAgQDAQQDHwEtA0oBiwFgAVsBWgHeA38B/gGJ\n        AZgBlwH/ARIBhwGGAf8BAQETARYB/wEAAQYBCgH/AQABBwEJAf8BBQKGAf8BCQKKAf8DVQGyAyQBNUcA\n        AQEDyQH/A/wB/wP7Af8D+wH/A/sB/wOuAf8D+gH/A+gB/wO6Af8D4AH/A98B/wPdAf8D2wH/A8cB/wMA\n        AQEDAAH/AwAB/wMAEf8DAAX/AwAF/wMABf8BpgIAAf8B3QIAAf8DAAH/AwIBAwMHAQoDOAFcAmEBWgHk\n        AmoBQQH5AysB/AGnAagBQAH9AysB/ANfAfsDXwHzA1oB2ANdAeIDVAGrAxcBIAMBAQJHAAEBA8kB/wP8\n        Af8D+wH/A/wB/wP8Af8DrgH/A/oB/wP4Af8DvAH/A+UB/wP2Af8D8wH/A+8B/wPIAf8DAAEBAwAB/wMA\n        Af8DAAH/Ac0BuQG0Af8DAAH/AwAB/wGdAgAB/wMABf8DAAX/AaYCAAX/AwAB/wHhAgAB/wMAAf8DBAEG\n        Ax4BKwJZAVcBvwJdAU4B8AJqAUEB+QFHAkEB+QJcAT4B+AFYAlMB8QNkAfEDZAHsA10B4gNVAbQDRwGC\n        AxABFUsAAQEDyQH/A/wB/wP8Af8D/AH/A8sB/wOvAf8D+wH/A/kB/wPoAf8DwgH/A/sB/wP6Af8D+AH/\n        A8gB/wMAAQEDAAH/AwAB/wMAEf8DAAX/AwAF/wGmAgAF/wMAAf8B0QIAAf8DAAH/AwQBBQNCAXMDXQHT\n        A2AB6wJlAVIB9AJkAVMB8QJiAVgB7wJgAVoB3gJhAVoB5ANcAdEDWwHDAz8BbQMhATEDDwEUSwABAQPJ\n        Af8D/AH/A/wB/wP8Af8D9QH/A8sB/wPuAf8DygH/A8cB/wO4Bf8D/gH/A/wB/wPJAf8DAAEBAwAB/wMA\n        Af8DAAH/Ac0BuQG0Af8DAAH/AwAB/wMAAf8DAAX/AwAF/wGmAgAF/wGjAgAB/wHTAgAB/wMAAf8DAwEE\n        A1IBpANhAeEDXAHfA14B3QJZAVcBwgJXAVUBtwNOAZkCUgFRAacDSgGMA1IBqQMeASsDBwEJTwABAQPJ\n        Af8D/AH/A/wB/wP8Af8D/AH/A/wB/wP8Af8D/AH/A/sB/wP3Af8D9wX/A/wB/wPJAf8DAAEBAwAB/wMA\n        Af8DABH/AwAF/wHNAbkBtAX/Ac0BuQG0Bf8BygIAAf8BygIAAf8DAAH/AwMBBANZAb8DZAHnA18B6ANh\n        AeYDWwHLA1gBwQNMAZICSgFJAYkDKAE8AzoBYQMGAQhQAAMBAQICAAGJAf8BAAGHAaIB/wEAAZUBrQH/\n        AQABkAGpAf8BAAGNAacB/wEAAYgBowH/AQABhgGhAf8BAAGCAZ0B/wEAAYABmwH/AgABlwH/AgABlQH/\n        AgABkwH/AgABlgH/AgABiQH/AwEBAgMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA\n        Af8DAAH/AwAB/wGtAgAB/wHAAgAB/wHHAgAB/wMAAf8DAQECA1UBrQNlAfQDWQH1A10B8ANcAdEDVgGx\n        AkABPwFuA0ABcQM3AVsDLAFDAwABAVAAAwEBAgIAAYkB/wEAAYEBnAH/AgABjgH/AwAB/wIAAYgB/wEA\n        AYEBnAH/AQABgQGcAf8CAAGYAf8CAAGRAf8DAAH/AwAB/wMAAf8CAAGQAf8CAAGJAf8DAQECAwAB/wMA\n        Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AbQCAAH/AcQCAAH/AcsCAAH/\n        AwAB/wMCAQMDPAFmA1wB+AI0ATMB/ANfAfsDZQH0A2EB4gNSAakDRAF5AjUBNAFVAx0BKlQAAwEBAgIA\n        AYkB/wIAAY4B/wGSAaoBvQH/AdkB4QHoAf8BkAGpAbwB/wIAAY0B/wIAAZcB/wIAAZUB/wIAAYQB/wGQ\n        AakBvAH/AdkB4QHoAf8BkAGpAbwB/wIAAYYB/wIAAYkB/wMBAQIDAAH/AZ4CAAH/AbEBjwGHAf8BqwGJ\n        AYIB/wGpAYkBggH/AaoBiQGCAf8BsQGKAYIB/wGvAYoBggH/AakBiQGCAf8BpgGIAYIB/wGfAYcBggH/\n        AcIBjQGCAf8B0AGQAYIB/wHYAZkBigH/Ac8CAAH/AwAB/wMCAQMDFwEgA1gBwQOoAf0DfwH+ATQCMwH8\n        A10B8ANbAcMDRwGAAzIBUFgAAwEBAgIAAYkB/wIAAYcB/wHBAc4B2QH/Ad0B5AHqAf8BwAHOAdkB/wIA\n        AYMB/wIAAZUB/wIAAZUB/wIAAYIB/wHBAc4B2QH/Ad0B5AHqAf8BwQHOAdkB/wIAAYEB/wIAAYkB/wMB\n        AQIDAAH/AbABkAGJAf8BzQG5AbQB/wHJAbEBrAH/AcsBsgGsAf8BzQGyAawB/wHOAbIBrAH/AdABsgGs\n        Af8B0gGzAawB/wHVAbMBrAH/AdgBtAGsAf8B2QG0AawB/wHaAbQBrAH/AeQBwAG4Af8B0AIAAf8DAAH/\n        AwABAQMKAQ4DKgFBA1QBrgNZAfUDfwH+A2oB+QNcAc0DNgFZAwcBCl4AAYkB/wMAAf8BsQHCAdAB/wHg\n        AecB7AH/Aa4BwAHOAf8DAAH/AgABiQH/AgABiQH/AwAB/wG1AcUB0gH/AeAB5wHsAf8BsgHDAdAB/wMA\n        Af8CAAGJAf8HAAH/AwAB/wHJAbEBrAH/AcsBtQGwAf8BywG0Aa8B/wHMAbQBrwH/Ac4BtQGvAf8BzwG1\n        Aa8B/wHQAbUBrwH/AdEBtQGvAf8B1AG2Aa8B/wHXAbYBrwH/AdoBuQGyAf8B2wGrAaEB/wGLAgAB/wMA\n        Af8HAAEBAwsBDwMbBCYBOQMsAUQDIwEzAwoBDQMAAQFkAAMBAQIDQgF2A2UB9ANEAXwDBgEIAwEBAgMB\n        AQIDBgEIAz0BagNfAfMDQgF2AwEBAggAAyUBNwMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/\n        AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/Ax4BKwsAAQEDAgEDAwQBBQMDAQQDAAEBJAABQgFNAT4HAAE+\n        AwABKAMAAUADAAFQAwABAQEAAQEFAAGAAQIWAAP/AQAB/wHjAXwBKwQAAf8BwQH8Ae8EAAHAAYEBAQHB\n        BAABwAGBBwABAQcAAQ8OAAGABwABgAEIBgABwAEBAYAFAAHgAYEBwAUAAeABowHABQAB4AEAAeAFAAH+\n        AQAB/AEPBAAB/gEBAf8BPwQAAf8BvwF+AfwEAAEPAf8B+AE/BAABAQH/AfgBHwUAAQ8B+AEPBgAB+AEP\n        BgAB+AEPBgAB+AEPBgAB+AEPBgAB8AEPBgAB8AEPBgAB8AEPAYAFAAHwAQ8BgAUAAfABDwGABQAB+AEP\n        BgAB/AEPBAABAwH/Af4BDwQAA/8BDwGAAwABwAEBAf4BEwHwAQ8C/wHAAQEB8gETAcABAwL/AcABAQHA\n        AQsBQAEAAfwBAQHAAQEBgAEBAYABAAH8AQ8BwAEBAgABgAEAAfgBBwHAAQECAAGAAQAB8AEHAcABAQIA\n        AYABAAHgAQEBwAEBAgABgAEAAcABAQHAAQECAAGDAQEBwAEBAcABAQIAAcABAwHwAQ8BwAEBAgABwAEB\n        AfABDwHAAQECAAHAAQEBMAEPAcABAQIAAeABAQHwAQ8BwAEBAQABAQHwAQMB8AEfAcABAwGAAQEB+AEH\n        AfABHwHAAQcBgAEDAfwBPwT/AgAC/wGgAQIC/wYAAv8GAAHAAf8GAAGAAQ8HAAEBHgABgAEDBgAC/wYA\n        Av8GAAL/BgAC/wYAAv8EAAGAAQAC/wIAAv8B4AESAv8BgAEBAgAB8AEDAv8BgAEBAgABwAEAAv8BgAEB\n        AgABgAEAAv8BgAEBBAAC/wEAAQEDAAEBAv8FAAEBAv8FAAEDAv8FAAEDAv8FAAEHAv8FAAEPAv8FAAEP\n        Av8FAAEfAv8FAAE/Av8FAAE/Av8BgAEBAgABgAF/Av8BwAEDAgABwQH/Cw==\n</value>\n  </data>\n  <data name=\"lblPECIDescription.Text\" xml:space=\"preserve\">\n    <value>You can setup the paths of your EVE clients, if they are running in portable mode (/LUA:OFF). By providing the path EVEMon can access the cache folder and scan for character portraits and market data.\n\nHint: If the control below is disabled although you are running EVE clients in portable mode, it means that EVEMon has detected one or more 'tranquility' folders in the default location (%LOCALAPPDATA%\\CCP\\EVE). Delete those manually and restart EVEMon.</value>\n  </data>\n  <data name=\"linkLabel1.Text\" xml:space=\"preserve\">\n    <value>EVEMon offers the ability of storing your settings file online at a cloud storage provider and use it between different computers. In order to be able to use those services, you need to have an account with the selected provider.</value>\n  </data>\n  <metadata name=\"$this.TrayHeight\" type=\"System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>70</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/SettingsUI/TrayBaseWindow.Designer.cs",
    "content": "﻿namespace EVEMon.SettingsUI\n{\n    partial class TrayBaseWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.SuspendLayout();\n            // \n            // TrayBaseWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.ClientSize = new System.Drawing.Size(284, 262);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;\n            this.Name = \"TrayBaseWindow\";\n            this.ShowInTaskbar = false;\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/SettingsUI/TrayBaseWindow.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Windows.Forms;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Factories;\n\nnamespace EVEMon.SettingsUI\n{\n    public partial class TrayBaseWindow : Form\n    {\n        protected readonly FlowLayoutPanel MainFlowLayoutPanel = new FlowLayoutPanel();\n        protected readonly Label ToolTipLabel = new Label();\n        protected bool UpdatePending;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TrayBaseWindow\"/> class.\n        /// </summary>\n        protected TrayBaseWindow()\n        {\n            InitializeComponent();\n\n            SuspendLayout();\n\n            if (this is TrayPopupWindow)\n                InitializeTrayPopWindowControls();\n\n            if (this is TrayTooltipWindow)\n                InitializeTrayTooltipWindowControls();\n\n            ResumeLayout(false);\n            PerformLayout();\n        }\n\n        /// <summary>\n        /// Initializes the tray pop window controls.\n        /// </summary>\n        private void InitializeTrayPopWindowControls()\n        {\n            MainFlowLayoutPanel.AutoSize = true;\n            MainFlowLayoutPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            MainFlowLayoutPanel.FlowDirection = FlowDirection.TopDown;\n            MainFlowLayoutPanel.Location = new Point(4, 4);\n            MainFlowLayoutPanel.Margin = new Padding(4);\n            MainFlowLayoutPanel.BackColor = SystemColors.ControlLightLight;\n            Controls.Add(MainFlowLayoutPanel);\n        }\n\n        /// <summary>\n        /// Initializes the tray tooltip window controls.\n        /// </summary>\n        private void InitializeTrayTooltipWindowControls()\n        {\n            ToolTipLabel.AutoSize = true;\n            ToolTipLabel.BackColor = SystemColors.ControlLightLight;\n            ToolTipLabel.Location = new Point(4, 4);\n            ToolTipLabel.Margin = new Padding(4);\n            Controls.Add(ToolTipLabel);\n        }\n\n        #endregion\n\n        \n        #region Inherited Events\n\n        /// <summary>\n        /// On load, update controls.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode)\n                return;\n\n            // Look'n feel\n            Font = FontFactory.GetFont(SystemFonts.MessageBoxFont.Name, SystemFonts.MessageBoxFont.SizeInPoints);\n            \n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Sets this window as topmost without activating it.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnShown(EventArgs e)\n        {\n            base.OnShown(e);\n\n            // Show the given form on topmost without activating it\n            this.ShowInactiveTopmost(NativeMethods.SWP_NOMOVE | NativeMethods.SWP_NOSIZE);\n        }\n\n        /// <summary>\n        /// On visible, checks whether an update is pending.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (Visible && UpdatePending)\n                UpdateContent();\n        }\n\n        /// <summary>\n        /// Draws the rounded rectangle border and background.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            // Create graphics object to work with\n            Graphics g = e.Graphics;\n            g.SmoothingMode = SmoothingMode.HighQuality;\n\n            // Define the size of the rectangle used for each of the 4 corner arcs.\n            const int Radius = 4;\n            Size cornerSize = new Size(Radius * 2, Radius * 2);\n\n            // Draw the background and border line\n            DrawBackground(g, cornerSize);\n            DrawBorder(g, cornerSize);\n        }\n\n        /// <summary>\n        /// Draws the rounded background.\n        /// </summary>\n        /// <param name=\"g\">The g.</param>\n        /// <param name=\"cornerSize\">Size of the corner.</param>\n        private void DrawBackground(Graphics g, Size cornerSize)\n        {\n            // Construct a GraphicsPath for the form\n            using (GraphicsPath path = new GraphicsPath())\n            {\n                path.StartFigure();\n\n                // Top left\n                path.AddArc(new Rectangle(0, 0, cornerSize.Width, cornerSize.Height), 180, 90);\n\n                // Top Right\n                path.AddArc(new Rectangle(ClientRectangle.Width - cornerSize.Width, 0, cornerSize.Width, cornerSize.Height),\n                            270, 90);\n\n                // Bottom right\n                path.AddArc(new Rectangle(ClientRectangle.Width - cornerSize.Width,\n                                          ClientRectangle.Height - cornerSize.Height, cornerSize.Width, cornerSize.Height),\n                            0, 90);\n\n                // Bottom Left\n                path.AddArc(new Rectangle(0, ClientRectangle.Height - cornerSize.Height,\n                                          cornerSize.Width, cornerSize.Height), 90, 90);\n                path.CloseFigure();\n\n                Region = new Region(path);\n\n                // Fill the background\n                using (Brush fillBrush = new SolidBrush(SystemColors.ControlLightLight))\n                {\n                    g.FillPath(fillBrush, path);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Draws the rounded rectangle border.\n        /// </summary>\n        /// <param name=\"g\"></param>\n        /// <param name=\"cornerSize\"></param>\n        private void DrawBorder(Graphics g, Size cornerSize)\n        {\n            // Construct a GraphicsPath for the border line\n            using (GraphicsPath path = new GraphicsPath())\n            {\n                path.StartFigure();\n\n                // Top left\n                path.AddArc(new Rectangle(0, 0, cornerSize.Width, cornerSize.Height), 180, 90);\n\n                // Top Right\n                path.AddArc(new Rectangle(ClientRectangle.Width - cornerSize.Width - 1, 0, cornerSize.Width, cornerSize.Height),\n                            270, 90);\n\n                // Bottom right\n                path.AddArc(new Rectangle(ClientRectangle.Width - cornerSize.Width - 1,\n                                          ClientRectangle.Height - cornerSize.Height, cornerSize.Width,\n                                          cornerSize.Height),\n                            0, 90);\n\n                // Bottom Left\n                path.AddArc(new Rectangle(0, ClientRectangle.Height - cornerSize.Height,\n                                          cornerSize.Width, cornerSize.Height), 90, 90);\n                path.CloseFigure();\n\n                // Draw the border\n                g.DrawPath(SystemPens.WindowFrame, path);\n            }\n        }\n\n        #endregion\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        protected virtual void UpdateContent(){}\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/TrayBaseWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SettingsUI/TrayPopUpConfigForm.Designer.cs",
    "content": "namespace EVEMon.SettingsUI\n{\n    partial class TrayPopupConfigForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TrayPopupConfigForm));\n            this.panel1 = new System.Windows.Forms.Panel();\n            this.btnUseDefaults = new System.Windows.Forms.Button();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnOK = new System.Windows.Forms.Button();\n            this.tabControl1 = new System.Windows.Forms.TabControl();\n            this.tpGeneral = new System.Windows.Forms.TabPage();\n            this.flowLayoutPanel3 = new System.Windows.Forms.FlowLayoutPanel();\n            this.groupBox1 = new System.Windows.Forms.GroupBox();\n            this.cbIndentGroupedAccounts = new System.Windows.Forms.CheckBox();\n            this.cbGroupBy = new System.Windows.Forms.ComboBox();\n            this.label1 = new System.Windows.Forms.Label();\n            this.cbHideNotTraining = new System.Windows.Forms.CheckBox();\n            this.groupBox4 = new System.Windows.Forms.GroupBox();\n            this.cbDisplayOrder2 = new System.Windows.Forms.ComboBox();\n            this.lblDisplayOrder1 = new System.Windows.Forms.Label();\n            this.lblDisplayOrder2 = new System.Windows.Forms.Label();\n            this.cbDisplayOrder1 = new System.Windows.Forms.ComboBox();\n            this.groupBox2 = new System.Windows.Forms.GroupBox();\n            this.cbShowSkillQueueTrainingTime = new System.Windows.Forms.CheckBox();\n            this.cbHighLightConflicts = new System.Windows.Forms.CheckBox();\n            this.cbShowSkill = new System.Windows.Forms.CheckBox();\n            this.cbShowCompletionTime = new System.Windows.Forms.CheckBox();\n            this.cbShowTimeToCompletion = new System.Windows.Forms.CheckBox();\n            this.cbPortraitSize = new System.Windows.Forms.ComboBox();\n            this.cbShowWallet = new System.Windows.Forms.CheckBox();\n            this.label3 = new System.Windows.Forms.Label();\n            this.cbShowPortrait = new System.Windows.Forms.CheckBox();\n            this.groupBox3 = new System.Windows.Forms.GroupBox();\n            this.cbUseIncreasedContrast = new System.Windows.Forms.CheckBox();\n            this.cbShowEveTime = new System.Windows.Forms.CheckBox();\n            this.cbShowWarning = new System.Windows.Forms.CheckBox();\n            this.cbShowServerStatus = new System.Windows.Forms.CheckBox();\n            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.ttHelp = new System.Windows.Forms.ToolTip(this.components);\n            this.panel1.SuspendLayout();\n            this.tabControl1.SuspendLayout();\n            this.tpGeneral.SuspendLayout();\n            this.flowLayoutPanel3.SuspendLayout();\n            this.groupBox1.SuspendLayout();\n            this.groupBox4.SuspendLayout();\n            this.groupBox2.SuspendLayout();\n            this.groupBox3.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // panel1\n            // \n            this.panel1.Controls.Add(this.btnUseDefaults);\n            this.panel1.Controls.Add(this.btnCancel);\n            this.panel1.Controls.Add(this.btnOK);\n            this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.panel1.Location = new System.Drawing.Point(0, 420);\n            this.panel1.Name = \"panel1\";\n            this.panel1.Size = new System.Drawing.Size(382, 45);\n            this.panel1.TabIndex = 0;\n            // \n            // btnUseDefaults\n            // \n            this.btnUseDefaults.Location = new System.Drawing.Point(12, 10);\n            this.btnUseDefaults.Name = \"btnUseDefaults\";\n            this.btnUseDefaults.Size = new System.Drawing.Size(81, 23);\n            this.btnUseDefaults.TabIndex = 2;\n            this.btnUseDefaults.Text = \"Use Defaults\";\n            this.btnUseDefaults.UseVisualStyleBackColor = true;\n            this.btnUseDefaults.Click += new System.EventHandler(this.btnUseDefaults_Click);\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.Location = new System.Drawing.Point(295, 10);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 1;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // btnOK\n            // \n            this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOK.Location = new System.Drawing.Point(214, 10);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(75, 23);\n            this.btnOK.TabIndex = 0;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);\n            // \n            // tabControl1\n            // \n            this.tabControl1.Controls.Add(this.tpGeneral);\n            this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tabControl1.Location = new System.Drawing.Point(0, 0);\n            this.tabControl1.Name = \"tabControl1\";\n            this.tabControl1.SelectedIndex = 0;\n            this.tabControl1.Size = new System.Drawing.Size(382, 420);\n            this.tabControl1.TabIndex = 1;\n            // \n            // tpGeneral\n            // \n            this.tpGeneral.Controls.Add(this.flowLayoutPanel3);\n            this.tpGeneral.Controls.Add(this.flowLayoutPanel1);\n            this.tpGeneral.Location = new System.Drawing.Point(4, 22);\n            this.tpGeneral.Name = \"tpGeneral\";\n            this.tpGeneral.Padding = new System.Windows.Forms.Padding(3);\n            this.tpGeneral.Size = new System.Drawing.Size(374, 394);\n            this.tpGeneral.TabIndex = 0;\n            this.tpGeneral.Text = \"General\";\n            this.tpGeneral.UseVisualStyleBackColor = true;\n            // \n            // flowLayoutPanel3\n            // \n            this.flowLayoutPanel3.Controls.Add(this.groupBox1);\n            this.flowLayoutPanel3.Controls.Add(this.groupBox4);\n            this.flowLayoutPanel3.Controls.Add(this.groupBox2);\n            this.flowLayoutPanel3.Controls.Add(this.groupBox3);\n            this.flowLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flowLayoutPanel3.Location = new System.Drawing.Point(3, 3);\n            this.flowLayoutPanel3.Name = \"flowLayoutPanel3\";\n            this.flowLayoutPanel3.Size = new System.Drawing.Size(368, 388);\n            this.flowLayoutPanel3.TabIndex = 18;\n            // \n            // groupBox1\n            // \n            this.groupBox1.Controls.Add(this.cbIndentGroupedAccounts);\n            this.groupBox1.Controls.Add(this.cbGroupBy);\n            this.groupBox1.Controls.Add(this.label1);\n            this.groupBox1.Controls.Add(this.cbHideNotTraining);\n            this.groupBox1.Location = new System.Drawing.Point(3, 3);\n            this.groupBox1.Name = \"groupBox1\";\n            this.groupBox1.Size = new System.Drawing.Size(362, 96);\n            this.groupBox1.TabIndex = 0;\n            this.groupBox1.TabStop = false;\n            this.groupBox1.Text = \"Layout\";\n            // \n            // cbIndentGroupedAccounts\n            // \n            this.cbIndentGroupedAccounts.AutoSize = true;\n            this.cbIndentGroupedAccounts.Location = new System.Drawing.Point(132, 72);\n            this.cbIndentGroupedAccounts.Name = \"cbIndentGroupedAccounts\";\n            this.cbIndentGroupedAccounts.Size = new System.Drawing.Size(148, 17);\n            this.cbIndentGroupedAccounts.TabIndex = 19;\n            this.cbIndentGroupedAccounts.Text = \"Indent Grouped Accounts\";\n            this.ttHelp.SetToolTip(this.cbIndentGroupedAccounts, \"When enabled, characters will be indented\\r\\nunder the first character in each acco\" +\n                    \"unt group\");\n            this.cbIndentGroupedAccounts.UseVisualStyleBackColor = true;\n            // \n            // cbGroupBy\n            // \n            this.cbGroupBy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbGroupBy.FormattingEnabled = true;\n            this.cbGroupBy.Location = new System.Drawing.Point(132, 45);\n            this.cbGroupBy.Name = \"cbGroupBy\";\n            this.cbGroupBy.Size = new System.Drawing.Size(221, 21);\n            this.cbGroupBy.TabIndex = 18;\n            this.ttHelp.SetToolTip(this.cbGroupBy, resources.GetString(\"cbGroupBy.ToolTip\"));\n            this.cbGroupBy.SelectedIndexChanged += new System.EventHandler(this.cbGroupBy_SelectedIndexChanged);\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(15, 48);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(111, 13);\n            this.label1.TabIndex = 17;\n            this.label1.Text = \"Group Characters by:\";\n            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // cbHideNotTraining\n            // \n            this.cbHideNotTraining.AutoSize = true;\n            this.cbHideNotTraining.Location = new System.Drawing.Point(6, 20);\n            this.cbHideNotTraining.Name = \"cbHideNotTraining\";\n            this.cbHideNotTraining.Size = new System.Drawing.Size(157, 17);\n            this.cbHideNotTraining.TabIndex = 12;\n            this.cbHideNotTraining.Text = \"Hide Characters not training\";\n            this.ttHelp.SetToolTip(this.cbHideNotTraining, \"When enabled, only characters currently\\r\\ntraining a skill will be displayed\");\n            this.cbHideNotTraining.UseVisualStyleBackColor = true;\n            this.cbHideNotTraining.CheckedChanged += new System.EventHandler(this.cbHideNotTraining_CheckedChanged);\n            // \n            // groupBox4\n            // \n            this.groupBox4.Controls.Add(this.cbDisplayOrder2);\n            this.groupBox4.Controls.Add(this.lblDisplayOrder1);\n            this.groupBox4.Controls.Add(this.lblDisplayOrder2);\n            this.groupBox4.Controls.Add(this.cbDisplayOrder1);\n            this.groupBox4.Location = new System.Drawing.Point(3, 105);\n            this.groupBox4.Name = \"groupBox4\";\n            this.groupBox4.Size = new System.Drawing.Size(362, 79);\n            this.groupBox4.TabIndex = 17;\n            this.groupBox4.TabStop = false;\n            this.groupBox4.Text = \"Display Order\";\n            // \n            // cbDisplayOrder2\n            // \n            this.cbDisplayOrder2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbDisplayOrder2.FormattingEnabled = true;\n            this.cbDisplayOrder2.Location = new System.Drawing.Point(132, 48);\n            this.cbDisplayOrder2.Name = \"cbDisplayOrder2\";\n            this.cbDisplayOrder2.Size = new System.Drawing.Size(221, 21);\n            this.cbDisplayOrder2.TabIndex = 22;\n            this.ttHelp.SetToolTip(this.cbDisplayOrder2, \"Controls the display order of characters, dependent on grouping.\");\n            // \n            // lblDisplayOrder1\n            // \n            this.lblDisplayOrder1.AutoSize = true;\n            this.lblDisplayOrder1.Location = new System.Drawing.Point(12, 23);\n            this.lblDisplayOrder1.Name = \"lblDisplayOrder1\";\n            this.lblDisplayOrder1.Size = new System.Drawing.Size(114, 13);\n            this.lblDisplayOrder1.TabIndex = 19;\n            this.lblDisplayOrder1.Text = \"Characters in training:\";\n            this.lblDisplayOrder1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // lblDisplayOrder2\n            // \n            this.lblDisplayOrder2.AutoSize = true;\n            this.lblDisplayOrder2.Location = new System.Drawing.Point(4, 51);\n            this.lblDisplayOrder2.Name = \"lblDisplayOrder2\";\n            this.lblDisplayOrder2.Size = new System.Drawing.Size(122, 13);\n            this.lblDisplayOrder2.TabIndex = 21;\n            this.lblDisplayOrder2.Text = \"Characters not training:\";\n            this.lblDisplayOrder2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // cbDisplayOrder1\n            // \n            this.cbDisplayOrder1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbDisplayOrder1.FormattingEnabled = true;\n            this.cbDisplayOrder1.Items.AddRange(new object[] {\n            \"Alphabetical, ascending\",\n            \"Alphabetical, descending\",\n            \"Training time remaining, ascending\",\n            \"Training time remaining, descending\"});\n            this.cbDisplayOrder1.Location = new System.Drawing.Point(132, 20);\n            this.cbDisplayOrder1.Name = \"cbDisplayOrder1\";\n            this.cbDisplayOrder1.Size = new System.Drawing.Size(221, 21);\n            this.cbDisplayOrder1.TabIndex = 20;\n            this.ttHelp.SetToolTip(this.cbDisplayOrder1, \"Controls the display order of characters, dependent on grouping.\");\n            // \n            // groupBox2\n            // \n            this.groupBox2.Controls.Add(this.cbShowSkillQueueTrainingTime);\n            this.groupBox2.Controls.Add(this.cbHighLightConflicts);\n            this.groupBox2.Controls.Add(this.cbShowSkill);\n            this.groupBox2.Controls.Add(this.cbShowCompletionTime);\n            this.groupBox2.Controls.Add(this.cbShowTimeToCompletion);\n            this.groupBox2.Controls.Add(this.cbPortraitSize);\n            this.groupBox2.Controls.Add(this.cbShowWallet);\n            this.groupBox2.Controls.Add(this.label3);\n            this.groupBox2.Controls.Add(this.cbShowPortrait);\n            this.groupBox2.Location = new System.Drawing.Point(3, 190);\n            this.groupBox2.Name = \"groupBox2\";\n            this.groupBox2.Size = new System.Drawing.Size(362, 121);\n            this.groupBox2.TabIndex = 15;\n            this.groupBox2.TabStop = false;\n            this.groupBox2.Text = \"Character Details\";\n            // \n            // cbShowSkillQueueTrainingTime\n            // \n            this.cbShowSkillQueueTrainingTime.AutoSize = true;\n            this.cbShowSkillQueueTrainingTime.Location = new System.Drawing.Point(9, 88);\n            this.cbShowSkillQueueTrainingTime.Name = \"cbShowSkillQueueTrainingTime\";\n            this.cbShowSkillQueueTrainingTime.Size = new System.Drawing.Size(173, 17);\n            this.cbShowSkillQueueTrainingTime.TabIndex = 35;\n            this.cbShowSkillQueueTrainingTime.Text = \"Show Skill Queue Training Time\";\n            this.ttHelp.SetToolTip(this.cbShowSkillQueueTrainingTime, \"When enabled, shows the character\\'s\\r\\nskill queue training time\");\n            this.cbShowSkillQueueTrainingTime.UseVisualStyleBackColor = true;\n            // \n            // cbHighLightConflicts\n            // \n            this.cbHighLightConflicts.AutoSize = true;\n            this.cbHighLightConflicts.Location = new System.Drawing.Point(204, 20);\n            this.cbHighLightConflicts.Name = \"cbHighLightConflicts\";\n            this.cbHighLightConflicts.Size = new System.Drawing.Size(157, 17);\n            this.cbHighLightConflicts.TabIndex = 34;\n            this.cbHighLightConflicts.Text = \"Highlight Schedule Conflicts\";\n            this.ttHelp.SetToolTip(this.cbHighLightConflicts, \"When enabled, skills with a completion time\\r\\nconflicting with a blocked scheduler\" +\n                    \" entry\\r\\nwill be highlighted in red.\");\n            this.cbHighLightConflicts.UseVisualStyleBackColor = true;\n            // \n            // cbShowSkill\n            // \n            this.cbShowSkill.AutoSize = true;\n            this.cbShowSkill.Location = new System.Drawing.Point(9, 20);\n            this.cbShowSkill.Name = \"cbShowSkill\";\n            this.cbShowSkill.Size = new System.Drawing.Size(124, 17);\n            this.cbShowSkill.TabIndex = 31;\n            this.cbShowSkill.Text = \"Show Skill in Training\";\n            this.ttHelp.SetToolTip(this.cbShowSkill, \"When enabled, shows the currently\\r\\ntraining skill name and level\");\n            this.cbShowSkill.UseVisualStyleBackColor = true;\n            // \n            // cbShowCompletionTime\n            // \n            this.cbShowCompletionTime.AutoSize = true;\n            this.cbShowCompletionTime.Location = new System.Drawing.Point(9, 66);\n            this.cbShowCompletionTime.Name = \"cbShowCompletionTime\";\n            this.cbShowCompletionTime.Size = new System.Drawing.Size(133, 17);\n            this.cbShowCompletionTime.TabIndex = 33;\n            this.cbShowCompletionTime.Text = \"Show Completion Time\";\n            this.ttHelp.SetToolTip(this.cbShowCompletionTime, \"When enabled, shows the estimated completion\\r\\ndate and time of the  currently tra\" +\n                    \"ining skill\");\n            this.cbShowCompletionTime.UseVisualStyleBackColor = true;\n            // \n            // cbShowTimeToCompletion\n            // \n            this.cbShowTimeToCompletion.AutoSize = true;\n            this.cbShowTimeToCompletion.Location = new System.Drawing.Point(9, 43);\n            this.cbShowTimeToCompletion.Name = \"cbShowTimeToCompletion\";\n            this.cbShowTimeToCompletion.Size = new System.Drawing.Size(146, 17);\n            this.cbShowTimeToCompletion.TabIndex = 32;\n            this.cbShowTimeToCompletion.Text = \"Show Time to Completion\";\n            this.ttHelp.SetToolTip(this.cbShowTimeToCompletion, \"When enabled, shows the time remaining\\r\\n until training is completed\");\n            this.cbShowTimeToCompletion.UseVisualStyleBackColor = true;\n            // \n            // cbPortraitSize\n            // \n            this.cbPortraitSize.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbPortraitSize.FormattingEnabled = true;\n            this.cbPortraitSize.Location = new System.Drawing.Point(255, 89);\n            this.cbPortraitSize.Name = \"cbPortraitSize\";\n            this.cbPortraitSize.Size = new System.Drawing.Size(69, 21);\n            this.cbPortraitSize.TabIndex = 28;\n            this.ttHelp.SetToolTip(this.cbPortraitSize, \"Selects the image size, in pixels, to be used\\r\\nfor the character portrait\");\n            // \n            // cbShowWallet\n            // \n            this.cbShowWallet.AutoSize = true;\n            this.cbShowWallet.Location = new System.Drawing.Point(204, 43);\n            this.cbShowWallet.Name = \"cbShowWallet\";\n            this.cbShowWallet.Size = new System.Drawing.Size(125, 17);\n            this.cbShowWallet.TabIndex = 30;\n            this.cbShowWallet.Text = \"Show Wallet Balance\";\n            this.ttHelp.SetToolTip(this.cbShowWallet, \"When enabled, shows the character\\'s wallet balance\");\n            this.cbShowWallet.UseVisualStyleBackColor = true;\n            // \n            // label3\n            // \n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(219, 92);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(30, 13);\n            this.label3.TabIndex = 27;\n            this.label3.Text = \"Size:\";\n            // \n            // cbShowPortrait\n            // \n            this.cbShowPortrait.AutoSize = true;\n            this.cbShowPortrait.Location = new System.Drawing.Point(204, 66);\n            this.cbShowPortrait.Name = \"cbShowPortrait\";\n            this.cbShowPortrait.Size = new System.Drawing.Size(142, 17);\n            this.cbShowPortrait.TabIndex = 26;\n            this.cbShowPortrait.Text = \"Show Character Portrait\";\n            this.ttHelp.SetToolTip(this.cbShowPortrait, \"When enabled, shows the character\\'s portrait\\r\\nas a thumbnail alongside the charac\" +\n                    \"ter\\'s name\");\n            this.cbShowPortrait.UseVisualStyleBackColor = true;\n            this.cbShowPortrait.CheckedChanged += new System.EventHandler(this.cbShowPortrait_CheckedChanged);\n            // \n            // groupBox3\n            // \n            this.groupBox3.Controls.Add(this.cbUseIncreasedContrast);\n            this.groupBox3.Controls.Add(this.cbShowEveTime);\n            this.groupBox3.Controls.Add(this.cbShowWarning);\n            this.groupBox3.Controls.Add(this.cbShowServerStatus);\n            this.groupBox3.Location = new System.Drawing.Point(3, 317);\n            this.groupBox3.Name = \"groupBox3\";\n            this.groupBox3.Size = new System.Drawing.Size(362, 64);\n            this.groupBox3.TabIndex = 16;\n            this.groupBox3.TabStop = false;\n            this.groupBox3.Text = \"Miscellaneous\";\n            // \n            // cbUseIncreasedContrast\n            // \n            this.cbUseIncreasedContrast.AutoSize = true;\n            this.cbUseIncreasedContrast.Location = new System.Drawing.Point(204, 43);\n            this.cbUseIncreasedContrast.Name = \"cbUseIncreasedContrast\";\n            this.cbUseIncreasedContrast.Size = new System.Drawing.Size(137, 17);\n            this.cbUseIncreasedContrast.TabIndex = 21;\n            this.cbUseIncreasedContrast.Text = \"Use Increased Contrast\";\n            this.ttHelp.SetToolTip(this.cbUseIncreasedContrast, \"When enabled, increases the contrast of the shown info\");\n            this.cbUseIncreasedContrast.UseVisualStyleBackColor = true;\n            // \n            // cbShowEveTime\n            // \n            this.cbShowEveTime.AutoSize = true;\n            this.cbShowEveTime.Location = new System.Drawing.Point(6, 43);\n            this.cbShowEveTime.Name = \"cbShowEveTime\";\n            this.cbShowEveTime.Size = new System.Drawing.Size(103, 17);\n            this.cbShowEveTime.TabIndex = 20;\n            this.cbShowEveTime.Text = \"Show EVE Time\";\n            this.ttHelp.SetToolTip(this.cbShowEveTime, \"When enabled, displays the current EVE time\");\n            this.cbShowEveTime.UseVisualStyleBackColor = true;\n            // \n            // cbShowWarning\n            // \n            this.cbShowWarning.AutoSize = true;\n            this.cbShowWarning.Location = new System.Drawing.Point(6, 20);\n            this.cbShowWarning.Name = \"cbShowWarning\";\n            this.cbShowWarning.Size = new System.Drawing.Size(193, 17);\n            this.cbShowWarning.TabIndex = 19;\n            this.cbShowWarning.Text = \"Show non-training account warning\";\n            this.ttHelp.SetToolTip(this.cbShowWarning, \"When enabled, shows a warning message when\\r\\nno characters on an account are train\" +\n                    \"ing a skill,\\r\\nif the provided API key is of 'Account' type.\");\n            this.cbShowWarning.UseVisualStyleBackColor = true;\n            // \n            // cbShowServerStatus\n            // \n            this.cbShowServerStatus.AutoSize = true;\n            this.cbShowServerStatus.Location = new System.Drawing.Point(204, 20);\n            this.cbShowServerStatus.Name = \"cbShowServerStatus\";\n            this.cbShowServerStatus.Size = new System.Drawing.Size(120, 17);\n            this.cbShowServerStatus.TabIndex = 14;\n            this.cbShowServerStatus.Text = \"Show Server Status\";\n            this.ttHelp.SetToolTip(this.cbShowServerStatus, \"When enabled, displays the current\\r\\nTranquility server status\");\n            this.cbShowServerStatus.UseVisualStyleBackColor = true;\n            // \n            // flowLayoutPanel1\n            // \n            this.flowLayoutPanel1.AutoSize = true;\n            this.flowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.flowLayoutPanel1.Location = new System.Drawing.Point(5, 95);\n            this.flowLayoutPanel1.Name = \"flowLayoutPanel1\";\n            this.flowLayoutPanel1.Size = new System.Drawing.Size(0, 0);\n            this.flowLayoutPanel1.TabIndex = 17;\n            // \n            // TrayPopupConfigForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.ClientSize = new System.Drawing.Size(382, 465);\n            this.Controls.Add(this.tabControl1);\n            this.Controls.Add(this.panel1);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"TrayPopupConfigForm\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\n            this.Text = \"Tray Icon Popup Configuration\";\n            this.panel1.ResumeLayout(false);\n            this.tabControl1.ResumeLayout(false);\n            this.tpGeneral.ResumeLayout(false);\n            this.tpGeneral.PerformLayout();\n            this.flowLayoutPanel3.ResumeLayout(false);\n            this.groupBox1.ResumeLayout(false);\n            this.groupBox1.PerformLayout();\n            this.groupBox4.ResumeLayout(false);\n            this.groupBox4.PerformLayout();\n            this.groupBox2.ResumeLayout(false);\n            this.groupBox2.PerformLayout();\n            this.groupBox3.ResumeLayout(false);\n            this.groupBox3.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Panel panel1;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.TabControl tabControl1;\n        private System.Windows.Forms.TabPage tpGeneral;\n        private System.Windows.Forms.CheckBox cbShowServerStatus;\n        private System.Windows.Forms.ToolTip ttHelp;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\n        private System.Windows.Forms.CheckBox cbHideNotTraining;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel3;\n        private System.Windows.Forms.GroupBox groupBox1;\n        private System.Windows.Forms.GroupBox groupBox2;\n        private System.Windows.Forms.GroupBox groupBox3;\n        private System.Windows.Forms.CheckBox cbShowWallet;\n        private System.Windows.Forms.CheckBox cbShowSkill;\n        private System.Windows.Forms.CheckBox cbShowCompletionTime;\n        private System.Windows.Forms.CheckBox cbShowTimeToCompletion;\n        private System.Windows.Forms.ComboBox cbPortraitSize;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.CheckBox cbShowPortrait;\n        private System.Windows.Forms.ComboBox cbGroupBy;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.ComboBox cbDisplayOrder2;\n        private System.Windows.Forms.Label lblDisplayOrder2;\n        private System.Windows.Forms.ComboBox cbDisplayOrder1;\n        private System.Windows.Forms.Label lblDisplayOrder1;\n        private System.Windows.Forms.GroupBox groupBox4;\n        private System.Windows.Forms.CheckBox cbShowWarning;\n        private System.Windows.Forms.Button btnUseDefaults;\n        private System.Windows.Forms.CheckBox cbHighLightConflicts;\n        private System.Windows.Forms.CheckBox cbShowEveTime;\n\t\tprivate System.Windows.Forms.CheckBox cbShowSkillQueueTrainingTime;\n\t\tprivate System.Windows.Forms.CheckBox cbIndentGroupedAccounts;\n        private System.Windows.Forms.CheckBox cbUseIncreasedContrast;\n\n    }\n}"
  },
  {
    "path": "src/EVEMon/SettingsUI/TrayPopUpConfigForm.cs",
    "content": "using System;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.SettingsUI\n{\n    /// <summary>\n    /// Configuration editor for the tray icon popup window\n    /// </summary>\n    public partial class TrayPopupConfigForm : EVEMonForm\n    {\n        private readonly object[] m_characterGrouping = {\n                                                            \"None\", \"Training / Not Training\", \"Not Training / Training\",\n                                                            \"Account\"\n                                                        };\n\n        private readonly string[] m_sortOrder = {\n                                                    \"Training completion, earliest at bottom\",\n                                                    \"Training completion, earliest at top\",\n                                                    \"Alphabetical, first at top\",\n                                                    \"Alphabetical, first at bottom\"\n                                                };\n\n        private readonly TrayPopupSettings m_settings;\n        private readonly object[] m_portraitSize;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TrayPopupConfigForm\"/> class.\n        /// </summary>\n        private TrayPopupConfigForm()\n        {\n            InitializeComponent();\n            m_portraitSize = Enum.GetValues(typeof(PortraitSizes))\n                .Cast<PortraitSizes>()\n                .Select(\n                    portraitSize =>\n                    {\n                        string size = FormattableString.Invariant($\"{portraitSize.GetDefaultValue()}\");\n                        return $\"{size} by {size}\";\n                    })\n                .ToArray<object>();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TrayPopupConfigForm\"/> class.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        public TrayPopupConfigForm(TrayPopupSettings settings)\n            : this()\n        {\n            m_settings = settings;\n            cbGroupBy.Items.AddRange(m_characterGrouping);\n        }\n\n        /// <summary>\n        /// On load, restores the window rectangle from the settings.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (m_settings != null)\n                DisplayConfig(m_settings);\n        }\n\n        /// <summary>\n        /// Displays the config.\n        /// </summary>\n        /// <param name=\"config\">The config.</param>\n        private void DisplayConfig(TrayPopupSettings config)\n        {\n            cbHideNotTraining.Checked = !config.ShowCharNotTraining;\n            cbGroupBy.SelectedIndex = (int)config.GroupBy;\n            UpdateDisplayOrders();\n            if (cbHideNotTraining.Checked)\n                cbDisplayOrder1.SelectedItem = m_sortOrder[(int)config.PrimarySortOrder];\n            else\n            {\n                switch (config.GroupBy)\n                {\n                    case TrayPopupGrouping.None:\n                        cbDisplayOrder1.SelectedItem = m_sortOrder[(int)config.PrimarySortOrder];\n                        break;\n                    case TrayPopupGrouping.Account:\n                        cbDisplayOrder1.SelectedItem = m_sortOrder[(int)config.PrimarySortOrder];\n                        break;\n                    default:\n                        cbDisplayOrder1.SelectedItem = m_sortOrder[(int)config.PrimarySortOrder];\n                        cbDisplayOrder2.SelectedItem = m_sortOrder[(int)config.SecondarySortOrder];\n                        break;\n                }\n            }\n            cbShowSkill.Checked = config.ShowSkillInTraining;\n            cbShowTimeToCompletion.Checked = config.ShowRemainingTime;\n            cbShowCompletionTime.Checked = config.ShowCompletionTime;\n            cbShowSkillQueueTrainingTime.Checked = config.ShowSkillQueueTrainingTime;\n            cbHighLightConflicts.Checked = config.HighlightConflicts;\n            cbShowWallet.Checked = config.ShowWallet;\n            cbShowPortrait.Checked = config.ShowPortrait;\n            cbPortraitSize.Items.AddRange(m_portraitSize);\n            cbPortraitSize.SelectedIndex = (int)config.PortraitSize;\n            cbShowWarning.Checked = config.ShowWarning;\n            cbShowServerStatus.Checked = config.ShowServerStatus;\n            cbShowEveTime.Checked = config.ShowEveTime;\n            cbIndentGroupedAccounts.Checked = config.IndentGroupedAccounts;\n            cbUseIncreasedContrast.Checked = config.UseIncreasedContrast;\n            UpdateEnables();\n        }\n\n        /// <summary>\n        /// Applies to config.\n        /// </summary>\n        private void ApplyToConfig()\n        {\n            m_settings.ShowCharNotTraining = !cbHideNotTraining.Checked;\n            m_settings.GroupBy = (TrayPopupGrouping)cbGroupBy.SelectedIndex;\n            m_settings.PrimarySortOrder = GetSortOrder(cbDisplayOrder1.SelectedItem as string);\n            m_settings.SecondarySortOrder = GetSortOrder(cbDisplayOrder2.SelectedItem as string);\n            m_settings.ShowSkillInTraining = cbShowSkill.Checked;\n            m_settings.ShowRemainingTime = cbShowTimeToCompletion.Checked;\n            m_settings.ShowCompletionTime = cbShowCompletionTime.Checked;\n            m_settings.ShowSkillQueueTrainingTime = cbShowSkillQueueTrainingTime.Checked;\n            m_settings.HighlightConflicts = cbHighLightConflicts.Checked;\n            m_settings.ShowWallet = cbShowWallet.Checked;\n            m_settings.ShowPortrait = cbShowPortrait.Checked;\n            m_settings.PortraitSize = (PortraitSizes)cbPortraitSize.SelectedIndex;\n            m_settings.ShowWarning = cbShowWarning.Checked;\n            m_settings.ShowServerStatus = cbShowServerStatus.Checked;\n            m_settings.ShowEveTime = cbShowEveTime.Checked;\n            m_settings.IndentGroupedAccounts = cbIndentGroupedAccounts.Checked;\n            m_settings.UseIncreasedContrast = cbUseIncreasedContrast.Checked;\n        }\n\n        /// <summary>\n        /// Gets the sort order.\n        /// </summary>\n        /// <param name=\"selectedSortOrder\">The selected sort order.</param>\n        /// <returns></returns>\n        private TrayPopupSort GetSortOrder(string selectedSortOrder)\n        {\n            TrayPopupSort sortOrder = TrayPopupSort.TrainingCompletionTimeDESC;\n            for (int i = 0; i < m_sortOrder.Length; i++)\n            {\n                if (selectedSortOrder == m_sortOrder[i])\n                    sortOrder = (TrayPopupSort)i;\n            }\n            return sortOrder;\n        }\n\n        /// <summary>\n        /// Enables / Disable control accordingly to dependencies.\n        /// </summary>\n        private void UpdateEnables()\n        {\n            cbGroupBy.Enabled = !cbHideNotTraining.Checked;\n            cbIndentGroupedAccounts.Enabled = (TrayPopupGrouping)cbGroupBy.SelectedIndex == TrayPopupGrouping.Account;\n            cbPortraitSize.Enabled = cbShowPortrait.Checked;\n        }\n\n        /// <summary>\n        /// Updates the display orders.\n        /// </summary>\n        private void UpdateDisplayOrders()\n        {\n            if (cbHideNotTraining.Checked)\n            {\n                lblDisplayOrder1.Text = \"Characters in training:\";\n                cbDisplayOrder1.Items.Clear();\n                cbDisplayOrder1.Items.Add(m_sortOrder[(int)TrayPopupSort.TrainingCompletionTimeDESC]);\n                cbDisplayOrder1.Items.Add(m_sortOrder[(int)TrayPopupSort.TrainingCompletionTimeASC]);\n                cbDisplayOrder1.Items.Add(m_sortOrder[(int)TrayPopupSort.NameASC]);\n                cbDisplayOrder1.Items.Add(m_sortOrder[(int)TrayPopupSort.NameDESC]);\n                cbDisplayOrder1.SelectedItem = m_sortOrder[(int)TrayPopupSort.TrainingCompletionTimeDESC];\n                lblDisplayOrder2.Visible = false;\n                cbDisplayOrder2.Visible = false;\n            }\n            else\n            {\n                TrayPopupGrouping groupBy = (TrayPopupGrouping)cbGroupBy.SelectedIndex;\n                switch (groupBy)\n                {\n                    case TrayPopupGrouping.None:\n                        lblDisplayOrder1.Text = \"All characters:\";\n                        cbDisplayOrder1.Items.Clear();\n                        cbDisplayOrder1.Items.Add(m_sortOrder[(int)TrayPopupSort.NameASC]);\n                        cbDisplayOrder1.Items.Add(m_sortOrder[(int)TrayPopupSort.NameDESC]);\n                        cbDisplayOrder1.SelectedItem = m_sortOrder[(int)TrayPopupSort.NameASC];\n                        lblDisplayOrder2.Visible = false;\n                        cbDisplayOrder2.Visible = false;\n                        break;\n                    case TrayPopupGrouping.Account:\n                        lblDisplayOrder1.Text = \"Accounts:\";\n                        cbDisplayOrder1.Items.Clear();\n                        cbDisplayOrder1.Items.Add(m_sortOrder[(int)TrayPopupSort.TrainingCompletionTimeDESC]);\n                        cbDisplayOrder1.Items.Add(m_sortOrder[(int)TrayPopupSort.TrainingCompletionTimeASC]);\n                        cbDisplayOrder1.SelectedItem = m_sortOrder[(int)TrayPopupSort.TrainingCompletionTimeDESC];\n                        lblDisplayOrder2.Visible = false;\n                        cbDisplayOrder2.Visible = false;\n                        break;\n                    default:\n                        lblDisplayOrder1.Text = \"Characters in training:\";\n                        cbDisplayOrder1.Items.Clear();\n                        cbDisplayOrder1.Items.Add(m_sortOrder[(int)TrayPopupSort.TrainingCompletionTimeDESC]);\n                        cbDisplayOrder1.Items.Add(m_sortOrder[(int)TrayPopupSort.TrainingCompletionTimeASC]);\n                        cbDisplayOrder1.Items.Add(m_sortOrder[(int)TrayPopupSort.NameASC]);\n                        cbDisplayOrder1.Items.Add(m_sortOrder[(int)TrayPopupSort.NameDESC]);\n                        cbDisplayOrder1.SelectedItem = m_sortOrder[(int)TrayPopupSort.TrainingCompletionTimeDESC];\n                        lblDisplayOrder2.Text = \"Characters not training:\";\n                        cbDisplayOrder2.Items.Clear();\n                        cbDisplayOrder2.Items.Add(m_sortOrder[(int)TrayPopupSort.NameASC]);\n                        cbDisplayOrder2.Items.Add(m_sortOrder[(int)TrayPopupSort.NameDESC]);\n                        cbDisplayOrder2.SelectedItem = m_sortOrder[(int)TrayPopupSort.NameASC];\n                        lblDisplayOrder2.Visible = true;\n                        cbDisplayOrder2.Visible = true;\n                        break;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnCancel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Cancel;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnOK control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnOK_Click(object sender, EventArgs e)\n        {\n            ApplyToConfig();\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the CheckedChanged event of the cbHideNotTraining control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void cbHideNotTraining_CheckedChanged(object sender, EventArgs e)\n        {\n            UpdateEnables();\n            UpdateDisplayOrders();\n        }\n\n        /// <summary>\n        /// Handles the SelectedIndexChanged event of the cbGroupBy control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void cbGroupBy_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            UpdateEnables();\n            UpdateDisplayOrders();\n        }\n\n        /// <summary>\n        /// Handles the CheckedChanged event of the cbShowPortrait control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void cbShowPortrait_CheckedChanged(object sender, EventArgs e)\n        {\n            UpdateEnables();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnUseDefaults control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnUseDefaults_Click(object sender, EventArgs e)\n        {\n            DisplayConfig(new TrayPopupSettings());\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/SettingsUI/TrayPopUpConfigForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"ttHelp.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"cbGroupBy.ToolTip\" xml:space=\"preserve\">\n    <value>Controls how characters a grouped  in the popup:\nNone - characters are not grouped\nTraining / Not Training - characters in training are shown above characters not training\nNot Training / Training - characters in training are shown below characters not training\nAccount - characters on the same API key are shown together</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SettingsUI/TrayPopUpWindow.cs",
    "content": "using EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace EVEMon.SettingsUI\n{\n    /// <summary>\n    /// Popup form displayed when the user hovers over the tray icon.\n    /// </summary>\n    /// <remarks>\n    /// Display contents are governed by Settings.TrayPopupConfig<br/>\n    /// Popup location is determined using mouse location, screen and screen bounds (see SetPosition()).<br/>\n    /// </remarks>\n    public class TrayPopupWindow : TrayBaseWindow\n    {\n        private readonly Label m_eveTimeLabel = new Label();\n        private readonly Label m_serverStatusLabel = new Label();\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Adds the character panes to the form, gets the TQ status message and sets the popup position.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode)\n                return;\n\n            // Client events\n            EveMonClient.QueuedSkillsCompleted += EveMonClient_QueuedSkillsCompleted;\n            EveMonClient.ServerStatusUpdated += EveMonClient_ServerStatusUpdated;\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n        }\n\n        /// <summary>\n        /// Unregister events.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            EveMonClient.QueuedSkillsCompleted -= EveMonClient_QueuedSkillsCompleted;\n            EveMonClient.ServerStatusUpdated -= EveMonClient_ServerStatusUpdated;\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n        }\n\n        #endregion\n\n\n        #region Content management : add the controls to the panel, update them, etc\n\n        /// <summary>\n        /// Recreates the controls for character and warning.\n        /// </summary>\n        protected override void UpdateContent()\n        {\n            if (!Visible)\n            {\n                UpdatePending = true;\n                return;\n            }\n            UpdatePending = false;\n\n            // Controls layout\n            PerformCustomLayout();\n\n            // Supplemental controls layout\n            PerformSupplementalControlsLayout();\n\n            // Updates the tooltip width\n            CompleteLayout();\n        }\n\n        /// <summary>\n        /// Gets the characters list, sorted, grouped and filter according to the user settings.\n        /// </summary>\n        /// <returns></returns>\n        public static IEnumerable<Character> GetCharacters\n        {\n            get\n            {\n                List<Character> characters = EveMonClient.MonitoredCharacters.ToList();\n\n                // Filter characters not in training ?\n                if (!Settings.UI.SystemTrayPopup.ShowCharNotTraining)\n                    characters = characters.Where(x => x.IsTraining).ToList();\n\n                // Sort\n                List<Character> charactersList = characters.ToList();\n                charactersList.StableSort(new CharacterComparer(Settings.UI.SystemTrayPopup.SecondarySortOrder));\n                charactersList.StableSort(new CharacterComparer(Settings.UI.SystemTrayPopup.PrimarySortOrder));\n\n                // Grouping\n                List<Character> newCharacters = new List<Character>();\n                switch (Settings.UI.SystemTrayPopup.GroupBy)\n                {\n                    case TrayPopupGrouping.None:\n                        return charactersList;\n                    case TrayPopupGrouping.Account:\n                        newCharacters.AddRange(charactersList.Where(x => x.Identity.ESIKeys.Any()));\n                        return newCharacters.GroupBy(AccountAPIKeyOrDefault).SelectMany(y => y);\n                    case TrayPopupGrouping.TrainingAtTop:\n                        newCharacters.AddRange(charactersList.Where(x => x.IsTraining));\n                        newCharacters.AddRange(charactersList.Where(x => !x.IsTraining));\n                        return newCharacters;\n                    case TrayPopupGrouping.TrainingAtBottom:\n                        newCharacters.AddRange(charactersList.Where(x => !x.IsTraining));\n                        newCharacters.AddRange(charactersList.Where(x => x.IsTraining));\n                        return newCharacters;\n                    default:\n                        return characters;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Returns the API key for characters in the same account or the default one.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <returns>The API key for characters in the same account; otherwise the default API key of the character</returns>\n        private static ESIKey AccountAPIKeyOrDefault(Character character) => character.Identity.ESIKeys\n            .First(apiKey => EveMonClient.MonitoredCharacters\n                .Any(monitoredCharacter => monitoredCharacter.Identity.ESIKeys.Contains(apiKey)));\n\n        /// <summary>\n        /// Performs the custom layout.\n        /// </summary>\n        private void PerformCustomLayout()\n        {\n            // Remove controls and dispose them\n            IEnumerable<Control> oldControls = MainFlowLayoutPanel.Controls.Cast<Control>().ToList();\n            MainFlowLayoutPanel.Controls.Clear();\n            foreach (Control ctl in oldControls)\n            {\n                ctl.Dispose();\n            }\n\n            IEnumerable<Character> characters = GetCharacters;\n\n            // Add controls for characters\n            if (Settings.UI.SystemTrayPopup.GroupBy == TrayPopupGrouping.Account &&\n                Settings.UI.SystemTrayPopup.IndentGroupedAccounts)\n            {\n                List<ESIKey> prevAPIKeys = new List<ESIKey>();\n                foreach (Character character in characters)\n                {\n                    OverviewItem charPanel = GetOverviewItem(character);\n                    List<ESIKey> apiKeys = character.Identity.ESIKeys.ToList();\n\n                    if (!apiKeys.Exists(apiKey => prevAPIKeys.Contains(apiKey)))\n                    {\n                        MainFlowLayoutPanel.Controls.Add(charPanel);\n                        prevAPIKeys = apiKeys;\n                    }\n                    else\n                    {\n                        FlowLayoutPanel tempAccountGroupPanel = null;\n                        try\n                        {\n                            tempAccountGroupPanel = new FlowLayoutPanel();\n                            tempAccountGroupPanel.Controls.Add(charPanel);\n                            tempAccountGroupPanel.AutoSize = true;\n                            tempAccountGroupPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n                            tempAccountGroupPanel.FlowDirection = FlowDirection.TopDown;\n                            tempAccountGroupPanel.Padding = new Padding(10, 0, 0, 0);\n\n                            tempAccountGroupPanel.CreateControl();\n\n                            FlowLayoutPanel accountGroupPanel = tempAccountGroupPanel;\n                            tempAccountGroupPanel = null;\n\n                            MainFlowLayoutPanel.Controls.Add(accountGroupPanel);\n                        }\n                        finally\n                        {\n                            tempAccountGroupPanel?.Dispose();\n                        }\n\n                        prevAPIKeys = apiKeys;\n                    }\n                }\n            }\n            else\n                MainFlowLayoutPanel.Controls.AddRange(characters.Select(GetOverviewItem).ToArray<Control>());\n        }\n\n        /// <summary>\n        /// Gets the overview item.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <returns></returns>\n        private static OverviewItem GetOverviewItem(Character character)\n        {\n            OverviewItem overviewItem;\n            OverviewItem tempOverviewItem = null;\n            try\n            {\n                // Creates a new page\n                tempOverviewItem = new OverviewItem(character, true);\n                tempOverviewItem.Tag = character;\n\n                tempOverviewItem.CreateControl();\n\n                overviewItem = tempOverviewItem;\n                tempOverviewItem = null;\n            }\n            finally\n            {\n                tempOverviewItem?.Dispose();\n            }\n\n            return overviewItem;\n        }\n\n        /// <summary>\n        /// Performs the supplemental controls layout.\n        /// </summary>\n        private void PerformSupplementalControlsLayout()\n        {\n            // Skip if the user do not want to be warned about accounts not in training\n            // No longer possible to determine since ESI keys are for only one character\n#if false\n            string warningMessage;\n            if (Settings.UI.SystemTrayPopup.ShowWarning && ESIKey.HasCharactersNotTraining(out warningMessage))\n            {\n                FlowLayoutPanel warningPanel = CreateAccountsNotTrainingPanel(warningMessage);\n                if (!MainFlowLayoutPanel.IsDisposed)\n                    MainFlowLayoutPanel.Controls.Add(warningPanel);\n            }\n#endif\n\n            // Server Status\n            if (Settings.UI.SystemTrayPopup.ShowServerStatus)\n            {\n                m_serverStatusLabel.AutoSize = true;\n                if (!MainFlowLayoutPanel.IsDisposed)\n                {\n                    MainFlowLayoutPanel.Controls.Add(m_serverStatusLabel);\n                    UpdateServerStatusLabel();\n                }\n            }\n\n            // EVE Time\n            if (Settings.UI.SystemTrayPopup.ShowEveTime)\n            {\n                m_eveTimeLabel.AutoSize = true;\n                if (!MainFlowLayoutPanel.IsDisposed)\n                {\n                    MainFlowLayoutPanel.Controls.Add(m_eveTimeLabel);\n                    UpdateEveTimeLabel();\n                }\n            }\n        }\n\n#if false\n        /// <summary>\n        /// Creates a panel contains the warning message for accounts not in training.\n        /// </summary>\n        /// <param name=\"warningMessage\"></param>\n        /// <returns></returns>\n        private static FlowLayoutPanel CreateAccountsNotTrainingPanel(string warningMessage)\n        {\n            // Create a flowlayout to hold the content\n            FlowLayoutPanel warningPanel;\n            FlowLayoutPanel tempWarningPanel = null;\n            try\n            {\n                tempWarningPanel = new FlowLayoutPanel\n                {\n                    AutoSize = true,\n                    AutoSizeMode = AutoSizeMode.GrowAndShrink,\n                    Margin = new Padding(0, 0, 0, 2)\n                };\n\n                // Add a picture on the left with a warning icon\n                if (!Settings.UI.SafeForWork)\n                {\n                    int portraitSize = int.Parse(Settings.UI.SystemTrayPopup.PortraitSize.ToString().Substring(1),\n                        CultureConstants.InvariantCulture);\n\n                    PictureBox tempPictureBoxWarning = null;\n                    try\n                    {\n                        tempPictureBoxWarning = new PictureBox();\n                        tempPictureBoxWarning.Image = SystemIcons.Warning.ToBitmap();\n                        tempPictureBoxWarning.SizeMode = PictureBoxSizeMode.StretchImage;\n                        tempPictureBoxWarning.Size = new Size(portraitSize, portraitSize);\n                        tempPictureBoxWarning.Margin = new Padding(2);\n\n                        PictureBox pbWarning = tempPictureBoxWarning;\n                        tempPictureBoxWarning = null;\n\n                        tempWarningPanel.Controls.Add(pbWarning);\n                    }\n                    finally\n                    {\n                        tempPictureBoxWarning?.Dispose();\n                    }\n                }\n\n                // Adds a label to hold the message\n                Label tempLabelMessage = null;\n                try\n                {\n                    tempLabelMessage = new Label\n                    {\n                        AutoSize = true,\n                        Text = warningMessage\n                    };\n\n                    Label lblMessage = tempLabelMessage;\n                    tempLabelMessage = null;\n\n                    tempWarningPanel.Controls.Add(lblMessage);\n                }\n                finally\n                {\n                    tempLabelMessage?.Dispose();\n                }\n\n                tempWarningPanel.CreateControl();\n\n                warningPanel = tempWarningPanel;\n                tempWarningPanel = null;\n            }\n            finally\n            {\n                tempWarningPanel?.Dispose();\n            }\n\n            return warningPanel;\n        }\n#endif\n\n        /// <summary>\n        /// Completes the layout after new controls have been added.\n        /// </summary>\n        private void CompleteLayout()\n        {\n            // Quit if the panel was disposed\n            if (MainFlowLayoutPanel.IsDisposed)\n                return;\n\n            // Fix the panel widths to the largest\n            // We let the framework determine the appropriate widths, then fix them so that\n            // updates to training time remaining don't cause the form to resize\n            int pnlWidth = MainFlowLayoutPanel.Controls.Cast<Control>().Select(control => control.Width).Concat(new[] { 0 }).Max();\n\n            foreach (FlowLayoutPanel flowPanel in MainFlowLayoutPanel.Controls.OfType<FlowLayoutPanel>())\n            {\n                flowPanel.AutoSize = false;\n                flowPanel.Width = pnlWidth;\n            }\n\n            // Position Popup\n            TrayIcon.SetToolTipLocation(this);\n        }\n\n        /// <summary>\n        /// Updates the EVE time label.\n        /// </summary>\n        private void UpdateEveTimeLabel()\n        {\n            if (!Visible || m_eveTimeLabel == null)\n                return;\n\n            if (Settings.UI.SystemTrayPopup.ShowEveTime)\n                m_eveTimeLabel.Text = $\"EVE Time: {EveMonClient.EVEServer.ServerDateTime:HH:mm}\";\n        }\n\n        /// <summary>\n        /// Updates the server status label.\n        /// </summary>\n        private void UpdateServerStatusLabel()\n        {\n            if (!Visible || m_serverStatusLabel == null)\n                return;\n\n            if (Settings.UI.SystemTrayPopup.ShowServerStatus)\n                m_serverStatusLabel.Text = EveMonClient.EVEServer.StatusText;\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Updates the TQ status message.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_ServerStatusUpdated(object sender, EveServerEventArgs e)\n        {\n            UpdateServerStatusLabel();\n        }\n\n        /// <summary>\n        /// Once per second, we update the eve time.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            UpdateEveTimeLabel();\n        }\n\n        /// <summary>\n        /// Occur when characters completed skills. We refresh the controls.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_QueuedSkillsCompleted(object sender, QueuedSkillsEventArgs e)\n        {\n            UpdateContent();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/TrayTooltipConfigForm.Designer.cs",
    "content": "namespace EVEMon.SettingsUI\n{\n    partial class TrayTooltipConfigForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.gboxTooltipOptions = new System.Windows.Forms.GroupBox();\n            this.flowLayoutPanel3 = new System.Windows.Forms.FlowLayoutPanel();\n            this.cbTooltipDisplay = new System.Windows.Forms.ComboBox();\n            this.tbTooltipString = new System.Windows.Forms.TextBox();\n            this.tbTooltipTestDisplay = new System.Windows.Forms.TextBox();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnOK = new System.Windows.Forms.Button();\n            this.gbHelp = new System.Windows.Forms.GroupBox();\n            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\n            this.label2 = new System.Windows.Forms.Label();\n            this.label3 = new System.Windows.Forms.Label();\n            this.label4 = new System.Windows.Forms.Label();\n            this.label5 = new System.Windows.Forms.Label();\n            this.label12 = new System.Windows.Forms.Label();\n            this.label13 = new System.Windows.Forms.Label();\n            this.label19 = new System.Windows.Forms.Label();\n            this.label11 = new System.Windows.Forms.Label();\n            this.label15 = new System.Windows.Forms.Label();\n            this.label7 = new System.Windows.Forms.Label();\n            this.label18 = new System.Windows.Forms.Label();\n            this.label10 = new System.Windows.Forms.Label();\n            this.label6 = new System.Windows.Forms.Label();\n            this.label14 = new System.Windows.Forms.Label();\n            this.label16 = new System.Windows.Forms.Label();\n            this.label8 = new System.Windows.Forms.Label();\n            this.label17 = new System.Windows.Forms.Label();\n            this.label9 = new System.Windows.Forms.Label();\n            this.label1 = new System.Windows.Forms.Label();\n            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\n            this.gbDispOrder = new System.Windows.Forms.GroupBox();\n            this.cbTooltipOrder = new System.Windows.Forms.CheckBox();\n            this.flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel();\n            this.gboxTooltipOptions.SuspendLayout();\n            this.flowLayoutPanel3.SuspendLayout();\n            this.gbHelp.SuspendLayout();\n            this.tableLayoutPanel1.SuspendLayout();\n            this.flowLayoutPanel1.SuspendLayout();\n            this.gbDispOrder.SuspendLayout();\n            this.flowLayoutPanel2.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // gboxTooltipOptions\n            // \n            this.gboxTooltipOptions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.gboxTooltipOptions.AutoSize = true;\n            this.gboxTooltipOptions.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.gboxTooltipOptions.Controls.Add(this.flowLayoutPanel3);\n            this.gboxTooltipOptions.Location = new System.Drawing.Point(3, 3);\n            this.gboxTooltipOptions.Name = \"gboxTooltipOptions\";\n            this.gboxTooltipOptions.Padding = new System.Windows.Forms.Padding(3, 3, 3, 0);\n            this.gboxTooltipOptions.Size = new System.Drawing.Size(361, 112);\n            this.gboxTooltipOptions.TabIndex = 9;\n            this.gboxTooltipOptions.TabStop = false;\n            this.gboxTooltipOptions.Text = \"Tray Icon Tooltip\";\n            // \n            // flowLayoutPanel3\n            // \n            this.flowLayoutPanel3.AutoSize = true;\n            this.flowLayoutPanel3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.flowLayoutPanel3.Controls.Add(this.cbTooltipDisplay);\n            this.flowLayoutPanel3.Controls.Add(this.tbTooltipString);\n            this.flowLayoutPanel3.Controls.Add(this.tbTooltipTestDisplay);\n            this.flowLayoutPanel3.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.flowLayoutPanel3.Location = new System.Drawing.Point(6, 20);\n            this.flowLayoutPanel3.Margin = new System.Windows.Forms.Padding(0);\n            this.flowLayoutPanel3.Name = \"flowLayoutPanel3\";\n            this.flowLayoutPanel3.Size = new System.Drawing.Size(352, 79);\n            this.flowLayoutPanel3.TabIndex = 9;\n            // \n            // cbTooltipDisplay\n            // \n            this.cbTooltipDisplay.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbTooltipDisplay.FormattingEnabled = true;\n            this.cbTooltipDisplay.Location = new System.Drawing.Point(3, 3);\n            this.cbTooltipDisplay.Name = \"cbTooltipDisplay\";\n            this.cbTooltipDisplay.Size = new System.Drawing.Size(346, 21);\n            this.cbTooltipDisplay.TabIndex = 8;\n            this.cbTooltipDisplay.SelectionChangeCommitted += new System.EventHandler(this.cbTooltipDisplay_SelectionChangeCommitted);\n            // \n            // tbTooltipString\n            // \n            this.tbTooltipString.Location = new System.Drawing.Point(3, 30);\n            this.tbTooltipString.Name = \"tbTooltipString\";\n            this.tbTooltipString.ReadOnly = true;\n            this.tbTooltipString.Size = new System.Drawing.Size(346, 20);\n            this.tbTooltipString.TabIndex = 6;\n            this.tbTooltipString.TextChanged += new System.EventHandler(this.tbTooltipString_TextChanged);\n            // \n            // tbTooltipTestDisplay\n            // \n            this.tbTooltipTestDisplay.BackColor = System.Drawing.SystemColors.Info;\n            this.tbTooltipTestDisplay.Cursor = System.Windows.Forms.Cursors.Arrow;\n            this.tbTooltipTestDisplay.Location = new System.Drawing.Point(3, 56);\n            this.tbTooltipTestDisplay.Name = \"tbTooltipTestDisplay\";\n            this.tbTooltipTestDisplay.ReadOnly = true;\n            this.tbTooltipTestDisplay.Size = new System.Drawing.Size(346, 20);\n            this.tbTooltipTestDisplay.TabIndex = 8;\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.Location = new System.Drawing.Point(84, 3);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 11;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // btnOK\n            // \n            this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOK.Location = new System.Drawing.Point(3, 3);\n            this.btnOK.Name = \"btnOK\";\n            this.btnOK.Size = new System.Drawing.Size(75, 23);\n            this.btnOK.TabIndex = 12;\n            this.btnOK.Text = \"OK\";\n            this.btnOK.UseVisualStyleBackColor = true;\n            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);\n            // \n            // gbHelp\n            // \n            this.gbHelp.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.gbHelp.Controls.Add(this.tableLayoutPanel1);\n            this.gbHelp.Controls.Add(this.label1);\n            this.gbHelp.Location = new System.Drawing.Point(3, 167);\n            this.gbHelp.Name = \"gbHelp\";\n            this.gbHelp.Size = new System.Drawing.Size(361, 186);\n            this.gbHelp.TabIndex = 13;\n            this.gbHelp.TabStop = false;\n            this.gbHelp.Text = \"Formatting Help\";\n            // \n            // tableLayoutPanel1\n            // \n            this.tableLayoutPanel1.AutoSize = true;\n            this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.tableLayoutPanel1.ColumnCount = 2;\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tableLayoutPanel1.Controls.Add(this.label2, 0, 0);\n            this.tableLayoutPanel1.Controls.Add(this.label3, 1, 0);\n            this.tableLayoutPanel1.Controls.Add(this.label4, 0, 1);\n            this.tableLayoutPanel1.Controls.Add(this.label5, 0, 2);\n            this.tableLayoutPanel1.Controls.Add(this.label12, 1, 1);\n            this.tableLayoutPanel1.Controls.Add(this.label13, 1, 2);\n            this.tableLayoutPanel1.Controls.Add(this.label19, 1, 3);\n            this.tableLayoutPanel1.Controls.Add(this.label11, 0, 3);\n            this.tableLayoutPanel1.Controls.Add(this.label15, 1, 4);\n            this.tableLayoutPanel1.Controls.Add(this.label7, 0, 4);\n            this.tableLayoutPanel1.Controls.Add(this.label18, 1, 5);\n            this.tableLayoutPanel1.Controls.Add(this.label10, 0, 5);\n            this.tableLayoutPanel1.Controls.Add(this.label6, 0, 6);\n            this.tableLayoutPanel1.Controls.Add(this.label14, 1, 6);\n            this.tableLayoutPanel1.Controls.Add(this.label16, 1, 7);\n            this.tableLayoutPanel1.Controls.Add(this.label8, 0, 7);\n            this.tableLayoutPanel1.Controls.Add(this.label17, 1, 8);\n            this.tableLayoutPanel1.Controls.Add(this.label9, 0, 8);\n            this.tableLayoutPanel1.Location = new System.Drawing.Point(9, 59);\n            this.tableLayoutPanel1.Name = \"tableLayoutPanel1\";\n            this.tableLayoutPanel1.RowCount = 9;\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.Size = new System.Drawing.Size(202, 117);\n            this.tableLayoutPanel1.TabIndex = 3;\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(3, 0);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(21, 13);\n            this.label2.TabIndex = 1;\n            this.label2.Text = \"%n\";\n            // \n            // label3\n            // \n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(33, 0);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(84, 13);\n            this.label3.TabIndex = 2;\n            this.label3.Text = \"Character Name\";\n            // \n            // label4\n            // \n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(3, 13);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(20, 13);\n            this.label4.TabIndex = 3;\n            this.label4.Text = \"%s\";\n            // \n            // label5\n            // \n            this.label5.AutoSize = true;\n            this.label5.Location = new System.Drawing.Point(3, 26);\n            this.label5.Name = \"label5\";\n            this.label5.Size = new System.Drawing.Size(21, 13);\n            this.label5.TabIndex = 4;\n            this.label5.Text = \"%tr\";\n            // \n            // label12\n            // \n            this.label12.AutoSize = true;\n            this.label12.Location = new System.Drawing.Point(33, 13);\n            this.label12.Name = \"label12\";\n            this.label12.Size = new System.Drawing.Size(74, 13);\n            this.label12.TabIndex = 11;\n            this.label12.Text = \"Skill in training\";\n            // \n            // label13\n            // \n            this.label13.AutoSize = true;\n            this.label13.Location = new System.Drawing.Point(33, 26);\n            this.label13.Name = \"label13\";\n            this.label13.Size = new System.Drawing.Size(158, 13);\n            this.label13.TabIndex = 12;\n            this.label13.Text = \"Target skill level (Roman format)\";\n            // \n            // label19\n            // \n            this.label19.AutoSize = true;\n            this.label19.Location = new System.Drawing.Point(33, 39);\n            this.label19.Name = \"label19\";\n            this.label19.Size = new System.Drawing.Size(163, 13);\n            this.label19.TabIndex = 20;\n            this.label19.Text = \"Target skill level (Numeric format)\";\n            // \n            // label11\n            // \n            this.label11.AutoSize = true;\n            this.label11.Location = new System.Drawing.Point(3, 39);\n            this.label11.Name = \"label11\";\n            this.label11.Size = new System.Drawing.Size(20, 13);\n            this.label11.TabIndex = 10;\n            this.label11.Text = \"%ti\";\n            // \n            // label15\n            // \n            this.label15.AutoSize = true;\n            this.label15.Location = new System.Drawing.Point(33, 52);\n            this.label15.Name = \"label15\";\n            this.label15.Size = new System.Drawing.Size(161, 13);\n            this.label15.TabIndex = 14;\n            this.label15.Text = \"Current skill level (Roman format)\";\n            // \n            // label7\n            // \n            this.label7.AutoSize = true;\n            this.label7.Location = new System.Drawing.Point(3, 52);\n            this.label7.Name = \"label7\";\n            this.label7.Size = new System.Drawing.Size(24, 13);\n            this.label7.TabIndex = 6;\n            this.label7.Text = \"%cr\";\n            // \n            // label18\n            // \n            this.label18.AutoSize = true;\n            this.label18.Location = new System.Drawing.Point(33, 65);\n            this.label18.Name = \"label18\";\n            this.label18.Size = new System.Drawing.Size(166, 13);\n            this.label18.TabIndex = 17;\n            this.label18.Text = \"Current skill level (Numeric format)\";\n            // \n            // label10\n            // \n            this.label10.AutoSize = true;\n            this.label10.Location = new System.Drawing.Point(3, 65);\n            this.label10.Name = \"label10\";\n            this.label10.Size = new System.Drawing.Size(23, 13);\n            this.label10.TabIndex = 9;\n            this.label10.Text = \"%ci\";\n            // \n            // label6\n            // \n            this.label6.AutoSize = true;\n            this.label6.Location = new System.Drawing.Point(3, 78);\n            this.label6.Name = \"label6\";\n            this.label6.Size = new System.Drawing.Size(18, 13);\n            this.label6.TabIndex = 5;\n            this.label6.Text = \"%r\";\n            // \n            // label14\n            // \n            this.label14.AutoSize = true;\n            this.label14.Location = new System.Drawing.Point(33, 78);\n            this.label14.Name = \"label14\";\n            this.label14.Size = new System.Drawing.Size(115, 13);\n            this.label14.TabIndex = 13;\n            this.label14.Text = \"Training time remaining\";\n            // \n            // label16\n            // \n            this.label16.AutoSize = true;\n            this.label16.Location = new System.Drawing.Point(33, 91);\n            this.label16.Name = \"label16\";\n            this.label16.Size = new System.Drawing.Size(161, 13);\n            this.label16.TabIndex = 15;\n            this.label16.Text = \"Estimated completion date / time\";\n            // \n            // label8\n            // \n            this.label8.AutoSize = true;\n            this.label8.Location = new System.Drawing.Point(3, 91);\n            this.label8.Name = \"label8\";\n            this.label8.Size = new System.Drawing.Size(21, 13);\n            this.label8.TabIndex = 7;\n            this.label8.Text = \"%d\";\n            // \n            // label17\n            // \n            this.label17.AutoSize = true;\n            this.label17.Location = new System.Drawing.Point(33, 104);\n            this.label17.Name = \"label17\";\n            this.label17.Size = new System.Drawing.Size(78, 13);\n            this.label17.TabIndex = 16;\n            this.label17.Text = \"Wallet balance\";\n            // \n            // label9\n            // \n            this.label9.AutoSize = true;\n            this.label9.Location = new System.Drawing.Point(3, 104);\n            this.label9.Name = \"label9\";\n            this.label9.Size = new System.Drawing.Size(21, 13);\n            this.label9.TabIndex = 8;\n            this.label9.Text = \"%b\";\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(6, 17);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(342, 39);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"Tooltips are constructed using a text string containing characters and\\r\\nmnemonic \" +\n    \"codes. The codes are replaced by real values are according\\r\\nto the table below.\";\n            // \n            // flowLayoutPanel1\n            // \n            this.flowLayoutPanel1.AutoSize = true;\n            this.flowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.flowLayoutPanel1.Controls.Add(this.gboxTooltipOptions);\n            this.flowLayoutPanel1.Controls.Add(this.gbDispOrder);\n            this.flowLayoutPanel1.Controls.Add(this.gbHelp);\n            this.flowLayoutPanel1.Controls.Add(this.flowLayoutPanel2);\n            this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\n            this.flowLayoutPanel1.Location = new System.Drawing.Point(9, 9);\n            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);\n            this.flowLayoutPanel1.Name = \"flowLayoutPanel1\";\n            this.flowLayoutPanel1.Size = new System.Drawing.Size(367, 391);\n            this.flowLayoutPanel1.TabIndex = 14;\n            this.flowLayoutPanel1.WrapContents = false;\n            // \n            // gbDispOrder\n            // \n            this.gbDispOrder.Controls.Add(this.cbTooltipOrder);\n            this.gbDispOrder.Location = new System.Drawing.Point(3, 121);\n            this.gbDispOrder.Name = \"gbDispOrder\";\n            this.gbDispOrder.Size = new System.Drawing.Size(361, 40);\n            this.gbDispOrder.TabIndex = 15;\n            this.gbDispOrder.TabStop = false;\n            this.gbDispOrder.Text = \"Display Order\";\n            // \n            // cbTooltipOrder\n            // \n            this.cbTooltipOrder.AutoSize = true;\n            this.cbTooltipOrder.Location = new System.Drawing.Point(6, 17);\n            this.cbTooltipOrder.Name = \"cbTooltipOrder\";\n            this.cbTooltipOrder.Size = new System.Drawing.Size(112, 17);\n            this.cbTooltipOrder.TabIndex = 0;\n            this.cbTooltipOrder.Text = \"Same as in Popup\";\n            this.cbTooltipOrder.UseVisualStyleBackColor = true;\n            this.cbTooltipOrder.CheckedChanged += new System.EventHandler(this.cbTooltipOrder_CheckedChanged);\n            // \n            // flowLayoutPanel2\n            // \n            this.flowLayoutPanel2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.flowLayoutPanel2.AutoSize = true;\n            this.flowLayoutPanel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.flowLayoutPanel2.Controls.Add(this.btnCancel);\n            this.flowLayoutPanel2.Controls.Add(this.btnOK);\n            this.flowLayoutPanel2.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.flowLayoutPanel2.Location = new System.Drawing.Point(202, 359);\n            this.flowLayoutPanel2.Name = \"flowLayoutPanel2\";\n            this.flowLayoutPanel2.Size = new System.Drawing.Size(162, 29);\n            this.flowLayoutPanel2.TabIndex = 14;\n            // \n            // TrayTooltipConfigForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.ClientSize = new System.Drawing.Size(388, 409);\n            this.Controls.Add(this.flowLayoutPanel1);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"TrayTooltipConfigForm\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\n            this.Text = \"Tray Icon Tooltip Configuration\";\n            this.gboxTooltipOptions.ResumeLayout(false);\n            this.gboxTooltipOptions.PerformLayout();\n            this.flowLayoutPanel3.ResumeLayout(false);\n            this.flowLayoutPanel3.PerformLayout();\n            this.gbHelp.ResumeLayout(false);\n            this.gbHelp.PerformLayout();\n            this.tableLayoutPanel1.ResumeLayout(false);\n            this.tableLayoutPanel1.PerformLayout();\n            this.flowLayoutPanel1.ResumeLayout(false);\n            this.flowLayoutPanel1.PerformLayout();\n            this.gbDispOrder.ResumeLayout(false);\n            this.gbDispOrder.PerformLayout();\n            this.flowLayoutPanel2.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.GroupBox gboxTooltipOptions;\n        private System.Windows.Forms.TextBox tbTooltipTestDisplay;\n        private System.Windows.Forms.TextBox tbTooltipString;\n        private System.Windows.Forms.ComboBox cbTooltipDisplay;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnOK;\n        private System.Windows.Forms.GroupBox gbHelp;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.Label label5;\n        private System.Windows.Forms.Label label6;\n        private System.Windows.Forms.Label label7;\n        private System.Windows.Forms.Label label8;\n        private System.Windows.Forms.Label label9;\n        private System.Windows.Forms.Label label10;\n        private System.Windows.Forms.Label label11;\n        private System.Windows.Forms.Label label12;\n        private System.Windows.Forms.Label label13;\n        private System.Windows.Forms.Label label14;\n        private System.Windows.Forms.Label label15;\n        private System.Windows.Forms.Label label16;\n        private System.Windows.Forms.Label label17;\n        private System.Windows.Forms.Label label18;\n        private System.Windows.Forms.Label label19;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2;\n        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel3;\n        private System.Windows.Forms.GroupBox gbDispOrder;\n        private System.Windows.Forms.CheckBox cbTooltipOrder;\n    }\n}"
  },
  {
    "path": "src/EVEMon/SettingsUI/TrayTooltipConfigForm.cs",
    "content": "using System;\nusing System.Text.RegularExpressions;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.SettingsUI\n{\n    /// <summary>\n    /// Configuration editor form for the ToolTip style tray icon popup\n    /// </summary>\n    public partial class TrayTooltipConfigForm : EVEMonForm\n    {\n        private readonly TrayTooltipSettings m_settings;\n\n        // Array containing the example tooltip formats that are populated into the dropdown box.\n        private readonly string[] m_tooltipCodes = {\n                                                       \"%n - %s %tr - %r\",\n                                                       \"%n - %s [%cr->%tr]: %r\",\n                                                       \"%n : %s - %d : %b ISK\",\n                                                       \"%s %ci to %ti, %r left\"\n                                                   };\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TrayTooltipConfigForm\"/> class.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        public TrayTooltipConfigForm(TrayTooltipSettings settings)\n        {\n            InitializeComponent();\n            m_settings = settings;\n        }\n\n        /// <summary>\n        /// On load, restores the window rectangle from the settings.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            foreach (string tooltip in m_tooltipCodes)\n            {\n                cbTooltipDisplay.Items.Add(FormatExampleTooltipText(tooltip));\n            }\n            cbTooltipDisplay.Items.Add(\" -- Custom -- \");\n\n            tbTooltipString.Text = m_settings.Format;\n            tbTooltipString_TextChanged(null, null);\n            cbTooltipOrder.Checked = m_settings.DisplayOrder;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnOK control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnOK_Click(object sender, EventArgs e)\n        {\n            m_settings.Format = tbTooltipString.Text;\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnCancel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Cancel;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the TextChanged event of the tbTooltipString control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tbTooltipString_TextChanged(object sender, EventArgs e)\n        {\n            tbTooltipTestDisplay.Text = FormatExampleTooltipText(tbTooltipString.Text);\n\n            if (cbTooltipDisplay.SelectedIndex != -1)\n                return;\n\n            int index = m_tooltipCodes.Length;\n\n            for (int i = 0; i < m_tooltipCodes.Length; i++)\n            {\n                if (m_tooltipCodes[i].Equals(tbTooltipString.Text))\n                    index = i;\n            }\n\n            cbTooltipDisplay.SelectedIndex = index;\n            DisplayCustomControls(index == m_tooltipCodes.Length);\n        }\n\n        // Formats the argument format string with hardcoded exampe values. Works basically the\n        // same as TrayTooltipWindow.FormatTooltipText(...), with the exception of the exampe values.\n        private static string FormatExampleTooltipText(string fmt) => Regex.Replace(fmt, \"%([nbsdr]|[ct][ir])\", TransformTooltipText, RegexOptions.Compiled);\n\n        /// <summary>\n        /// Transforms the tooltip text.\n        /// </summary>\n        /// <param name=\"m\">The regex match.</param>\n        /// <returns></returns>\n        private static string TransformTooltipText(Match m)\n        {\n            string value = string.Empty;\n            char capture = m.Groups[1].Value[0];\n\n            switch (capture)\n            {\n                case 'n':\n                    value = \"John Doe\";\n                    break;\n                case 'b':\n                    value = \"183,415,254.05\";\n                    break;\n                case 's':\n                    value = \"Gunnery\";\n                    break;\n                case 'd':\n                    value = \"9/15/2006 6:36 PM\";\n                    break;\n                case 'r':\n                    value = \"2h, 53m, 28s\";\n                    break;\n                default:\n                    int level = -1;\n                    switch (capture)\n                    {\n                        case 'c':\n                            level = 3;\n                            break;\n                        case 't':\n                            level = 4;\n                            break;\n                    }\n\n                    if (m.Groups[1].Value.Length > 1 && level >= 0)\n                    {\n                        capture = m.Groups[1].Value[1];\n\n                        switch (capture)\n                        {\n                            case 'i':\n                                value = level.ToString(CultureConstants.DefaultCulture);\n                                break;\n                            case 'r':\n                                value = Skill.GetRomanFromInt(level);\n                                break;\n                        }\n                    }\n                    break;\n            }\n\n            return value;\n        }\n\n        /// <summary>\n        /// Handles the SelectionChangeCommitted event of the cbTooltipDisplay control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void cbTooltipDisplay_SelectionChangeCommitted(object sender, EventArgs e)\n        {\n            int index = cbTooltipDisplay.SelectedIndex;\n\n            if (index == m_tooltipCodes.Length)\n            {\n                tbTooltipString.Text = m_settings.Format;\n                DisplayCustomControls(true);\n                return;\n            }\n\n            tbTooltipString.Text = m_tooltipCodes[index];\n            DisplayCustomControls(false);\n        }\n\n        /// <summary>\n        /// Toggles the visibility of the tooltip example display and code label, as well as the readonly status of the tooltip string itself.\n        /// </summary>\n        /// <param name=\"custom\">Show tbTooltipTestDisplay?</param>\n        private void DisplayCustomControls(bool custom)\n        {\n            SuspendLayout();\n            tbTooltipString.ReadOnly = !custom;\n            ResumeLayout(false);\n        }\n\n        /// <summary>\n        /// Sets the same display order as the one in popup\n        /// </summary>\n        private void cbTooltipOrder_CheckedChanged(object sender, EventArgs e)\n        {\n            m_settings.DisplayOrder = cbTooltipOrder.Checked;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/SettingsUI/TrayTooltipConfigForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SettingsUI/TrayTooltipWindow.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SettingsUI\n{\n    /// <summary>\n    /// Displays a Windows-style tooltip.\n    /// </summary>\n    public sealed class TrayTooltipWindow : TrayBaseWindow\n    {\n        private readonly List<Character> m_characters = new List<Character>();\n        private string m_tooltipFormat;\n\n\n        #region Inherited Events\n\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode)\n                return;\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n        }\n\n        /// <summary>\n        /// On close, stops the timer.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnClosed(EventArgs e)\n        {\n            base.OnClosed(e);\n\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n        }\n\n        #endregion\n\n\n        #region Content creation and refresh\n\n        /// <summary>\n        /// Updates the tooltip's content.\n        /// </summary>\n        protected override void UpdateContent()\n        {\n            if (!Visible)\n            {\n                UpdatePending = true;\n                return;\n            }\n            UpdatePending = false;\n\n            UpdateCharactersList();\n\n            // Replaces the fragments like \"%10546464r\" (the number being the character ID) by the remaining time\n            string tooltip = m_tooltipFormat ?? string.Empty;\n            foreach (Character character in m_characters)\n            {\n                if (character.IsTraining)\n                {\n                    QueuedSkill trainingSkill = character.CurrentlyTrainingSkill;\n                    TimeSpan remainingTime = trainingSkill.EndTime.Subtract(DateTime.UtcNow);\n\n                    tooltip = Regex.Replace(tooltip,\n                        $\"%{character.CharacterID}r\",\n                        remainingTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas),\n                        RegexOptions.Compiled);\n                }\n\n                CCPCharacter ccpCharacter = character as CCPCharacter;\n                if (ccpCharacter != null && ccpCharacter.SkillQueue.IsPaused)\n                {\n                    tooltip = Regex.Replace(tooltip,\n                        $\"%{character.CharacterID}r\",\n                        \"(Paused)\", RegexOptions.Compiled);\n                }\n            }\n\n            // Updates the tooltip and its location\n            ToolTipLabel.Text = tooltip;\n            TrayIcon.SetToolTipLocation(this);\n        }\n\n        /// <summary>\n        /// Updates the tooltip format we use as a base for update on every second, along with the characters list.\n        /// </summary>\n        private void UpdateCharactersList()\n        {\n            // Update characters list and selects display order\n            m_characters.Clear();\n            m_characters.AddRange(Settings.UI.SystemTrayTooltip.DisplayOrder\n                                      ? TrayPopupWindow.GetCharacters\n                                      : EveMonClient.MonitoredCharacters.Where(x => x.IsTraining));\n\n            // Assembles the tooltip format\n            StringBuilder sb = new StringBuilder();\n            if (string.IsNullOrEmpty(Settings.UI.SystemTrayTooltip.Format))\n            {\n                // Bad tooltip format\n                sb.Append(\"You can configure this tooltip in the options/general panel\");\n            }\n            else if (m_characters.Count == 0)\n            {\n                // No character in training\n                sb.Append(\"No Characters in training!\");\n            }\n            else\n            {\n                // Assemble tooltip base format with character informations\n                foreach (Character character in m_characters)\n                {\n                    if (sb.Length != 0)\n                        sb.Append(\"\\n\");\n\n                    sb.Append(FormatTooltipText(Settings.UI.SystemTrayTooltip.Format, character));\n                }\n            }\n            m_tooltipFormat = sb.ToString();\n        }\n\n        /// <summary>\n        /// Formats the tooltip text.\n        /// </summary>\n        /// <param name=\"toolTipFormat\">The tool tip format.</param>\n        /// <param name=\"character\">The character.</param>\n        /// <returns></returns>\n        private static string FormatTooltipText(string toolTipFormat, Character character)\n        {\n            StringBuilder sb = new StringBuilder();\n\n            string tooltipText = Regex.Replace(toolTipFormat, \"%([nbsdr]|[ct][ir])\",\n                                               m => TransformTooltipText(character, m), RegexOptions.Compiled);\n\n            sb.Append(tooltipText);\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Transforms the tooltip text.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"m\">The regex match.</param>\n        /// <returns></returns>\n        private static string TransformTooltipText(Character character, Match m)\n        {\n            // First group\n            switch (m.Groups[1].Value[0])\n            {\n                case 'n':\n                    return character.Name;\n                case 'b':\n                    return character.Balance.ToNumericString(2);\n            }\n\n            CCPCharacter ccpCharacter = character as CCPCharacter;\n            if (ccpCharacter == null || (!ccpCharacter.IsTraining && !ccpCharacter.SkillQueue.IsPaused))\n                return string.Empty;\n\n            int level;\n            switch (m.Groups[1].Value[0])\n            {\n                case 'r':\n                    return $\"%{character.CharacterID}r\";\n                case 's':\n                    return character.CurrentlyTrainingSkill.SkillName;\n                case 'd':\n                    return $\"{character.CurrentlyTrainingSkill.EndTime:g}\";\n                case 'c':\n                    level = character.CurrentlyTrainingSkill.Level - 1;\n                    break;\n                case 't':\n                    level = character.CurrentlyTrainingSkill.Level;\n                    break;\n                default:\n                    return string.Empty;\n            }\n\n            // Second group\n            if (level < 0 || m.Groups[1].Value.Length <= 1)\n                return string.Empty;\n\n            switch (m.Groups[1].Value[1])\n            {\n                case 'i':\n                    return level.ToString(CultureConstants.DefaultCulture);\n                case 'r':\n                    return Skill.GetRomanFromInt(level);\n                default:\n                    return string.Empty;\n            }\n        }\n\n        #endregion\n\n\n        #region Global events\n\n        /// <summary>\n        /// Every second, when characters are in training, we update the tooltip.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/UpdateSettingsControl.Designer.cs",
    "content": "﻿namespace EVEMon.SettingsUI\n{\n    partial class UpdateSettingsControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.labelPeriod = new System.Windows.Forms.Label();\n            this.labelMethod = new System.Windows.Forms.Label();\n            this.toolTip = new System.Windows.Forms.ToolTip(this.components);\n            this.SuspendLayout();\n            // \n            // labelPeriod\n            // \n            this.labelPeriod.Location = new System.Drawing.Point(169, 0);\n            this.labelPeriod.Name = \"labelPeriod\";\n            this.labelPeriod.Size = new System.Drawing.Size(173, 18);\n            this.labelPeriod.TabIndex = 2;\n            this.labelPeriod.Text = \"Automatic Updates Intervals\";\n            this.labelPeriod.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n            this.toolTip.SetToolTip(this.labelPeriod, \"The frequency at which those data will be queried.\");\n            // \n            // labelMethod\n            // \n            this.labelMethod.Location = new System.Drawing.Point(20, 0);\n            this.labelMethod.Name = \"labelMethod\";\n            this.labelMethod.Size = new System.Drawing.Size(143, 18);\n            this.labelMethod.TabIndex = 3;\n            this.labelMethod.Text = \"CCP Query\";\n            this.labelMethod.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n            this.toolTip.SetToolTip(this.labelMethod, \"The name of the query to CCP.\");\n            // \n            // UpdateSettingsControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.labelPeriod);\n            this.Controls.Add(this.labelMethod);\n            this.Name = \"UpdateSettingsControl\";\n            this.Size = new System.Drawing.Size(345, 404);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label labelPeriod;\n        private System.Windows.Forms.Label labelMethod;\n        private System.Windows.Forms.ToolTip toolTip;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/UpdateSettingsControl.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models.Extended;\nusing EVEMon.Common.Properties;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.SettingsUI\n{\n    public partial class UpdateSettingsControl : UserControl\n    {\n        // Would have love to use tableLayoutPanel, unfortunately, they are just a piece of trash.\n        private const int RowHeight = 28;\n\n        private readonly List<ComboBox> m_combos = new List<ComboBox>();\n\n        private UpdateSettings m_settings;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"UpdateSettingsControl\"/> class.\n        /// </summary>\n        public UpdateSettingsControl()\n        {\n            InitializeComponent();\n            labelPeriod.Font = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            labelMethod.Font = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n\n            PopulateControl();\n        }\n\n        /// <summary>\n        /// Gets or sets the settings to edit (should be a copy of the actual settings).\n        /// </summary>\n        [Browsable(false)]\n        public UpdateSettings Settings\n        {\n            get { return m_settings; }\n            set\n            {\n                if (value == null)\n                    return;\n\n                m_settings = value;\n\n                foreach (ComboBox combo in m_combos)\n                {\n                    Enum method = (Enum)combo.Tag;\n                    List<UpdatePeriod> periods = GetUpdatePeriods(method);\n                    combo.SelectedIndex = Math.Max(0, periods.IndexOf(m_settings.Periods[method.ToString()]));\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets the methods.\n        /// </summary>\n        /// <returns></returns>\n        private static IEnumerable<Enum> Methods\n        {\n            get\n            {\n                List<Enum> apiMethods = ESIMethods.Methods.Where(x => x.HasHeader()).ToList();\n\n                // Group the methods by usage\n                List<Enum> methods = apiMethods.Where(method => method is ESIAPIGenericMethods).ToList();\n\n                methods.AddRange(apiMethods.OfType<ESIAPICharacterMethods>().Where(\n                    method => (long)method == ((long)method & (long)CCPAPIMethodsEnum.BasicCharacterFeatures)).Cast<Enum>());\n\n                methods.AddRange(apiMethods.OfType<ESIAPICharacterMethods>().Where(\n                    method => (long)method == ((long)method & (long)CCPAPIMethodsEnum.AdvancedCharacterFeatures)).Cast<Enum>().\n                                     OrderBy(method => method.GetHeader()));\n                \n                return methods;\n            }\n        }\n\n        /// <summary>\n        /// When the selected index changes, we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void combo_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            ComboBox combo = (ComboBox)sender;\n            Enum method = (Enum)combo.Tag;\n            List<UpdatePeriod> periods = GetUpdatePeriods(method);\n\n            if (combo.SelectedIndex < 0 || combo.SelectedIndex >= periods.Count)\n                return;\n\n            if (method.Equals(ESIAPICharacterMethods.Medals))\n                m_settings.Periods[ESIAPICorporationMethods.CorporationMedals.ToString()] = periods[combo.SelectedIndex];\n      \n            if (method.Equals(ESIAPICharacterMethods.MarketOrders))\n                m_settings.Periods[ESIAPICorporationMethods.CorporationMarketOrders.ToString()] = periods[combo.SelectedIndex];\n\n            if (method.Equals(ESIAPICharacterMethods.Contracts))\n                m_settings.Periods[ESIAPICorporationMethods.CorporationContracts.ToString()] = periods[combo.SelectedIndex];\n\n            if (method.Equals(ESIAPICharacterMethods.IndustryJobs))\n                m_settings.Periods[ESIAPICorporationMethods.CorporationIndustryJobs.ToString()] = periods[combo.SelectedIndex];\n\n            m_settings.Periods[method.ToString()] = periods[combo.SelectedIndex];\n        }\n\n        /// <summary>\n        /// Populates the control.\n        /// </summary>\n        private void PopulateControl()\n        {\n            int height = RowHeight;\n\n            // Add the controls for every member of the enumeration\n            foreach (Enum method in Methods)\n            {\n                // Add the icon\n                AddIcon(method, height);\n\n                // Add the label\n                AddLabel(method, height);\n\n                // Add the \"system tray tooltip\" combo box\n                AddComboBox(method, height);\n\n                // Updates the row ordinate\n                height += RowHeight;\n            }\n\n            Height = height;\n        }\n\n        /// <summary>\n        /// Adds the combo box.\n        /// </summary>\n        /// <param name=\"method\">The method.</param>\n        /// <param name=\"height\">The height.</param>\n        private void AddComboBox(Enum method, int height)\n        {\n            ComboBox tempCombo = null;\n            try\n            {\n                tempCombo = new ComboBox();\n                foreach (UpdatePeriod period in GetUpdatePeriods(method))\n                {\n                    string header = period.GetHeader();\n                    if (period == UpdatePeriod.Never && method.HasForcedOnStartup())\n                        header = \"On Startup\";\n\n                    tempCombo.Items.Add(header);\n                }\n                tempCombo.Tag = method;\n                tempCombo.SelectedIndex = 0;\n                tempCombo.Margin = new Padding(3);\n                tempCombo.Height = RowHeight - 4;\n                tempCombo.Width = labelPeriod.Width;\n                tempCombo.DropDownStyle = ComboBoxStyle.DropDownList;\n                tempCombo.Location = new Point(labelPeriod.Location.X, height + 2);\n                tempCombo.SelectedIndexChanged += combo_SelectedIndexChanged;\n\n                ComboBox combo = tempCombo;\n                tempCombo = null;\n\n                Controls.Add(combo);\n                m_combos.Add(combo);\n            }\n            finally\n            {\n                tempCombo?.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Adds the label.\n        /// </summary>\n        /// <param name=\"method\">The method.</param>\n        /// <param name=\"height\">The height.</param>\n        private void AddLabel(Enum method, int height)\n        {\n            Label tempLabel = null;\n            try\n            {\n                tempLabel = new Label();\n                toolTip.SetToolTip(tempLabel, method.GetDescription());\n                tempLabel.AutoSize = false;\n                tempLabel.Text = method.GetHeader();\n                tempLabel.TextAlign = ContentAlignment.MiddleLeft;\n                tempLabel.Location = new Point(labelMethod.Location.X, height);\n                tempLabel.Width = labelMethod.Width;\n                tempLabel.Height = RowHeight;\n\n                Label label = tempLabel;\n                tempLabel = null;\n\n                Controls.Add(label);\n            }\n            finally\n            {\n                tempLabel?.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Adds the icon.\n        /// </summary>\n        /// <param name=\"method\">The method.</param>\n        /// <param name=\"height\">The height.</param>\n        private void AddIcon(Enum method, int height)\n        {\n            Bitmap icon = Resources.KeyGrey16;\n            string iconToolTip = \"This is a basic feature query.\";\n            if (method is ESIAPICharacterMethods)\n            {\n                ESIAPICharacterMethods apiMethod = (ESIAPICharacterMethods)method;\n                if ((long)apiMethod == ((long)apiMethod & (long)CCPAPIMethodsEnum.AdvancedCharacterFeatures))\n                {\n                    icon = Resources.KeyGold16;\n                    iconToolTip = \"This is an advanced feature query.\";\n                }\n            }\n            \n            PictureBox tempPicture = null;\n            try\n            {\n                tempPicture = new PictureBox();\n                toolTip.SetToolTip(tempPicture, iconToolTip);\n                tempPicture.Location = new Point(0, height + (RowHeight - icon.Size.Height) / 2);\n                tempPicture.Image = icon;\n                tempPicture.Size = icon.Size;\n\n                PictureBox picture = tempPicture;\n                tempPicture = null;\n\n                Controls.Add(picture);\n            }\n            finally\n            {\n                tempPicture?.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Gets the available update periods for the given method.\n        /// </summary>\n        /// <param name=\"method\"></param>\n        /// <returns></returns>\n        private static List<UpdatePeriod> GetUpdatePeriods(Enum method)\n        {\n            List<UpdatePeriod> periods = new List<UpdatePeriod> { UpdatePeriod.Never };\n\n            int min = (int)method.GetUpdatePeriod().Minimum;\n            int max = (int)method.GetUpdatePeriod().Maximum;\n\n            periods.AddRange(Enum.GetValues(typeof(UpdatePeriod)).Cast<UpdatePeriod>().Where(\n                period => period != UpdatePeriod.Never).Select(period => new { period, index = (int)period }).Where(\n                    period => period.index >= min && period.index <= max).Select(period => period.period));\n\n            return periods;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SettingsUI/UpdateSettingsControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"toolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/AttributeBarControl.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// This control shows the value of an attribute in form of cells.\n    /// Also it allows to change value by clicking on a cell.\n    /// </summary>\n    public class AttributeBarControl : Control\n    {\n        private Pen m_borderPen = Pens.Black;\n        private Pen m_outerBorderPen = Pens.LightGray;\n        private SolidBrush m_inactiveBrush = new SolidBrush(Color.DimGray);\n        private SolidBrush m_basePointBrush = new SolidBrush(Color.LightGray);\n        private SolidBrush m_spentPointBrush = new SolidBrush(Color.LimeGreen);\n        \n        private MouseEventArgs m_mouseEvent;\n\n        private int m_points = 5;\n        private int m_baseValue;\n        private long m_value;\n        private int m_tileWidth = 6;\n        private int m_tileHeight = 20;\n        private long m_highlightedItem = -1;\n\n        private readonly Timer m_timer = new Timer();\n\n        /// <summary>\n        /// Initializes a new instance of <see cref=\"AttributeBarControl\"/>.\n        /// </summary>\n        public AttributeBarControl()\n        {\n            SetStyle(ControlStyles.AllPaintingInWmPaint |\n                     ControlStyles.Opaque |\n                     ControlStyles.UserPaint, true);\n            UpdateStyles();\n\n            m_timer.Interval = 500;\n            m_timer.Tick += m_timer_Tick;\n        }\n\n        /// <summary>\n        /// Gets or sets the delta value.\n        /// </summary>\n        /// <value>The delta value.</value>\n        internal long DeltaValue { get; set; }\n\n        /// <summary>\n        /// Gets or sets the highlighed value.\n        /// </summary>\n        /// <value>The highlighed value.</value>\n        internal long HighlightedValue { private get; set; }\n\n        /// <summary>\n        /// Gets or sets the color of the border between cells.\n        /// </summary>\n        [Category(\"Appearance\")]\n        [DefaultValue(typeof(Color), \"Black\")]\n        public Color BorderColor\n        {\n            get { return m_borderPen.Color; }\n            set\n            {\n                m_borderPen = new Pen(value);\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the outer border color.\n        /// </summary>\n        [Category(\"Appearance\")]\n        [DefaultValue(typeof(Color), \"LightGray\")]\n        public Color OuterBorderColor\n        {\n            get { return m_outerBorderPen.Color; }\n            set\n            {\n                m_outerBorderPen = new Pen(value);\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the color of an inactive cell.\n        /// </summary>\n        [Category(\"Appearance\")]\n        [DefaultValue(typeof(Color), \"DimGray\")]\n        public Color InactiveColor\n        {\n            get { return m_inactiveBrush.Color; }\n            set\n            {\n                m_inactiveBrush = new SolidBrush(value);\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the color of a cell for base point.\n        /// </summary>\n        [Category(\"Appearance\")]\n        [DefaultValue(typeof(Color), \"LightGray\")]\n        public Color BasePointColor\n        {\n            get { return m_basePointBrush.Color; }\n            set\n            {\n                m_basePointBrush = new SolidBrush(value);\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the color of a cell for spent point.\n        /// </summary>\n        [Category(\"Appearance\")]\n        [DefaultValue(typeof(Color), \"LimeGreen\")]\n        public Color SpentPointColor\n        {\n            get { return m_spentPointBrush.Color; }\n            set\n            {\n                m_spentPointBrush = new SolidBrush(value);\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the maximum number of points (cells).\n        /// </summary>\n        [Category(\"Behavior\")]\n        [DefaultValue(5)]\n        public int MaxPoints\n        {\n            get { return m_points; }\n            set\n            {\n                if (m_points == value)\n                    return;\n\n                m_points = value;\n                int width = m_tileWidth * m_points + 3;\n                Size = new Size(width, Height);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the base value for the attribute.\n        /// </summary>\n        [Category(\"Behavior\")]\n        [DefaultValue(0)]\n        public int BaseValue\n        {\n            get { return m_baseValue; }\n            set\n            {\n                if (m_baseValue == value)\n                    return;\n\n                m_baseValue = value;\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the value of the attribute.\n        /// </summary>\n        [Category(\"Behavior\")]\n        [DefaultValue(0)]\n        public long Value\n        {\n            get { return m_value; }\n            set\n            {\n                if (m_value == value)\n                    return;\n\n                m_value = value;\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// Occurs when value changing.\n        /// </summary>\n        [Category(\"Behavior\")]\n        public event EventHandler<AttributeValueChangingEventArgs> ValueChanging;\n\n        /// <summary>\n        /// Occurs when value changed.\n        /// </summary>\n        [Category(\"Behavior\")]\n        public event EventHandler<AttributeValueChangedEventArgs> ValueChanged;\n\n        /// <summary>\n        /// Occurs when highlighting.\n        /// </summary>\n        [Category(\"Behavior\")]\n        public event EventHandler<AttributeHighlightingEventArgs> Highlighting;\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.Resize\"/> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnResize(EventArgs e)\n        {\n            base.OnResize(e);\n\n            m_tileHeight = Height - 4;\n\n            // Calculate tile width\n            m_tileWidth = (Width - 3) / m_points;\n\n            // Calculate width of control from width of tiles\n            int width = m_tileWidth * m_points + 3;\n            if (Width != width)\n                Size = new Size(width, Height);\n        }\n\n        /// <summary>\n        /// Returns the index of a tile at specified point.\n        /// </summary>\n        /// <param name=\"location\">Location to check</param>\n        /// <returns>Tile index</returns>\n        private int GetValueAt(Point location)\n        {\n            if (location.Y == 0 || location.Y == Height - 1)\n                return -1;\n\n            if (location.X == 0 || location.X == Width - 1)\n                return -1;\n\n            // Return not more than the number of cells\n            return Math.Min((location.X - 1) / m_tileWidth + 1, m_points);\n        }\n\n        /// <summary>\n        /// Changes highlighted tile and causes invalidation of it's region.\n        /// </summary>\n        /// <param name=\"newHighlight\">Index of the new highlighted tile. Can be -1 if no one is highlighted.</param>\n        private void ChangeHighlight(long newHighlight)\n        {\n            long previousHighlighted = m_highlightedItem;\n            m_highlightedItem = newHighlight;\n\n            if (previousHighlighted < 0 && m_highlightedItem < 0)\n                return;\n\n            // Invalidate changed areas\n            if (m_highlightedItem >= 0)\n                Invalidate(new Rectangle(Convert.ToInt32(m_highlightedItem * m_tileWidth + 1), 2, m_tileWidth, m_tileHeight));\n\n            if (previousHighlighted >= 0)\n                Invalidate(new Rectangle(Convert.ToInt32(previousHighlighted * m_tileWidth + 1), 2, m_tileWidth, m_tileHeight));\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseMove\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.MouseEventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseMove(MouseEventArgs e)\n        {\n            base.OnMouseMove(e);\n\n            if (!Enabled)\n                return;\n\n            // Change cursor if required\n            int value = GetValueAt(e.Location);\n            Cursor = value == -1 ? Cursors.Arrow : Cursors.Hand;\n\n            HighlightedValue = value;\n            if (HighlightedValue >= 0 && HighlightedValue < m_baseValue)\n                HighlightedValue = m_baseValue;\n\n            Highlighting?.ThreadSafeInvoke(this, new AttributeHighlightingEventArgs(HighlightedValue));\n\n            // To zero-based value\n            HighlightedValue--;\n\n            if (m_highlightedItem == HighlightedValue)\n                return;\n\n            ChangeHighlight(HighlightedValue);\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseLeave\"/> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseLeave(EventArgs e)\n        {\n            base.OnMouseLeave(e);\n\n            ChangeHighlight(-1);\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseClick\"/> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.Windows.Forms.MouseEventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseClick(MouseEventArgs e)\n        {\n            base.OnMouseClick(e);\n\n            // Store the single mouse click event\n            m_mouseEvent = e;\n            m_timer.Start();\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseDoubleClick\"/> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.Windows.Forms.MouseEventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseDoubleClick(MouseEventArgs e)\n        {\n            base.OnMouseDoubleClick(e);\n\n            // Store the double mouse click event\n            m_mouseEvent = e;\n            m_timer.Start();\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.Paint\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.PaintEventArgs\"/> that contains the event data.</param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            using (Graphics g = e.Graphics)\n            {\n                // Draw the borders\n                g.DrawRectangle(m_outerBorderPen, 0, 0, Width - 1, Height - 1);\n                g.DrawRectangle(m_borderPen, 1, 1, Width - 3, Height - 3);\n\n                // Draw the tiles\n                for (int iTile = 0; iTile < m_points; iTile++)\n                {\n                    DrawTile(g, iTile);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Handles the Tick event of the m_timer control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void m_timer_Tick(object sender, EventArgs e)\n        {\n            m_timer.Stop();\n\n            if (!Enabled)\n                return;\n\n            // Actions according to mouse clicks\n            switch (m_mouseEvent.Clicks)\n            {\n                case 1:\n                    {\n                        base.OnMouseClick(m_mouseEvent);\n\n                        int newValue = GetValueAt(m_mouseEvent.Location);\n\n                        if (newValue == -1)\n                            return;\n\n                        if (newValue < m_baseValue)\n                            newValue = m_baseValue;\n\n                        DeltaValue = newValue - m_value;\n\n                        if (DeltaValue == 0)\n                            return;\n\n                        // Fires the value changing event\n                        ValueChanging?.ThreadSafeInvoke(this, new AttributeValueChangingEventArgs(DeltaValue));\n\n                        if (DeltaValue == 0)\n                            return;\n\n                        Value += DeltaValue;\n                    }\n                    break;\n                case 2:\n                    {\n                        base.OnMouseDoubleClick(m_mouseEvent);\n\n                        Value = m_baseValue;\n                    }\n                    break;\n            }\n\n            // Fires the value changed event\n            ValueChanged?.ThreadSafeInvoke(this, new AttributeValueChangedEventArgs());\n        }\n\n        /// <summary>\n        /// Draws a tile.\n        /// </summary>\n        /// <param name=\"g\">A <see cref=\"System.Drawing.Graphics\"/> object for drawing</param>\n        /// <param name=\"iTile\">Index of the tile</param>\n        private void DrawTile(Graphics g, int iTile)\n        {\n            // Select brush\n            SolidBrush brush;\n            if (iTile >= m_value)\n                brush = m_inactiveBrush;\n            else if (iTile >= m_baseValue - 1)\n                brush = m_spentPointBrush;\n            else\n                brush = m_basePointBrush;\n\n            if (iTile == m_highlightedItem)\n            {\n                // Highlight cell color\n                const int Shift = 50;\n                brush = ShiftBrushColor(brush.Color, Shift);\n            }\n\n            int x = 1 + iTile * m_tileWidth;\n\n            // Draw the tile\n            g.FillRectangle(brush, x, 2, m_tileWidth, m_tileHeight);\n\n            if (iTile == m_highlightedItem)\n                brush.Dispose();\n\n            // Draw the tile's border\n            g.DrawLine(m_borderPen, x, 2, x, Height - 2);\n        }\n\n        /// <summary>\n        /// Makes a color lighter or darker.\n        /// </summary>\n        /// <param name=\"brushColor\">Color of the brush.</param>\n        /// <param name=\"shift\">Color shift</param>\n        /// <returns></returns>\n        private static SolidBrush ShiftBrushColor(Color brushColor, int shift)\n        {\n            Color color = Color.FromArgb(Math.Min(brushColor.R + shift, 255),\n                                         Math.Min(brushColor.G + shift, 255),\n                                         Math.Min(brushColor.B + shift, 255));\n            return new SolidBrush(color);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/AttributeButtonControl.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Windows.Forms;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Represents a button for changing the value of an attribute.\n    /// It is not changes value of <see cref=\"AttributeBarControl\"/> itself. \n    /// Instead this button provides associated <see cref=\"AttributeBarControl\"/> and change amount for parent control.\n    /// Parent will perform changes itself, based on unassignet attribute pool and parameters of a button.\n    /// </summary>\n    public class AttributeButtonControl : Control\n    {\n        private readonly Pen m_borderPenInactive = Pens.Gray;\n        private readonly Brush m_backgroundBrush = Brushes.LightGray;\n        private readonly Brush m_backgroundBrushHighlighted = Brushes.WhiteSmoke;\n        private readonly Brush m_backgroundBrushPressed = Brushes.DarkGray;\n\n        private Pen m_borderPen = Pens.Black;\n\n        private GraphicsPath m_borderPath;\n\n        private bool m_hover;\n        private bool m_pressed;\n\n        /// <summary>\n        /// Initializes new instance of <see cref=\"AttributeButtonControl\"/>.\n        /// </summary>\n        public AttributeButtonControl()\n        {\n            SetStyle(ControlStyles.UserPaint |\n                     ControlStyles.AllPaintingInWmPaint |\n                     ControlStyles.SupportsTransparentBackColor, true);\n            SetStyle(ControlStyles.StandardDoubleClick, false);\n            UpdateStyles();\n\n            m_borderPath = CreateBorderPath();\n        }\n\n        /// <summary>\n        /// Gets ot sets the change of the atribute value.\n        /// </summary>\n        [Category(\"Behavior\"), DefaultValue(0)]\n        public int ValueChange { get; set; }\n\n        /// <summary>\n        /// Gets or sets <see cref=\"AttributeBarControl\"/> associated with this button.\n        /// </summary>\n        [Category(\"Behavior\"), DefaultValue(null)]\n        public AttributeBarControl AttributeBar { get; set; }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.ForeColorChanged\"/> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnForeColorChanged(EventArgs e)\n        {\n            base.OnForeColorChanged(e);\n\n            m_borderPen = new Pen(ForeColor);\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseEnter\"/> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseEnter(EventArgs e)\n        {\n            base.OnMouseEnter(e);\n\n            m_hover = true;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseLeave\"/> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseLeave(EventArgs e)\n        {\n            base.OnMouseLeave(e);\n\n            m_hover = false;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseDown\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.MouseEventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseDown(MouseEventArgs e)\n        {\n            base.OnMouseDown(e);\n\n            if (e.Button == MouseButtons.Left)\n                m_pressed = true;\n\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.MouseUp\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.MouseEventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseUp(MouseEventArgs e)\n        {\n            base.OnMouseUp(e);\n\n            if (e.Button == MouseButtons.Left)\n                m_pressed = false;\n\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.Resize\"/> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnResize(EventArgs e)\n        {\n            base.OnResize(e);\n\n            m_borderPath?.Dispose();\n\n            m_borderPath = CreateBorderPath();\n        }\n\n        /// <summary>\n        /// Creates a path in form of rounded rectangle. This path is used as shape of the button.\n        /// </summary>\n        /// <returns>Created path</returns>\n        private GraphicsPath CreateBorderPath()\n        {\n            using (GraphicsPath borderPath = new GraphicsPath())\n            {\n                const int Radius = 3;\n                const int HorizontalPad = 1;\n                const int VerticalPad = 1;\n                int width = Width - VerticalPad * 2;\n                int height = Height - HorizontalPad * 2;\n                borderPath.AddLine(HorizontalPad + Radius, VerticalPad, HorizontalPad + width - Radius * 2, VerticalPad);\n                borderPath.AddArc(HorizontalPad + width - Radius * 2, VerticalPad, Radius * 2, Radius * 2, 270, 90);\n                borderPath.AddLine(HorizontalPad + width, VerticalPad + Radius, HorizontalPad + width,\n                                   VerticalPad + height - Radius * 2);\n                borderPath.AddArc(HorizontalPad + width - Radius * 2, VerticalPad + height - Radius * 2, Radius * 2,\n                                  Radius * 2, 0,\n                                  90);\n                borderPath.AddLine(HorizontalPad + width - Radius * 2, VerticalPad + height, HorizontalPad + Radius,\n                                   VerticalPad + height);\n                borderPath.AddArc(HorizontalPad, VerticalPad + height - Radius * 2, Radius * 2, Radius * 2, 90, 90);\n                borderPath.AddLine(HorizontalPad, VerticalPad + height - Radius * 2, HorizontalPad, VerticalPad + Radius);\n                borderPath.AddArc(HorizontalPad, VerticalPad, Radius * 2, Radius * 2, 180, 90);\n                borderPath.CloseFigure();\n\n                return (GraphicsPath)borderPath.Clone();\n            }\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.Paint\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.PaintEventArgs\"/> that contains the event data.</param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            using (Graphics g = e.Graphics)\n            {\n                g.SmoothingMode = SmoothingMode.HighQuality;\n\n                Pen pen = Enabled ? m_borderPen : m_borderPenInactive;\n                Brush brush;\n                if (m_pressed)\n                    brush = m_backgroundBrushPressed;\n                else if (m_hover)\n                    brush = m_backgroundBrushHighlighted;\n                else\n                    brush = m_backgroundBrush;\n\n                e.Graphics.FillPath(brush, m_borderPath);\n                e.Graphics.DrawPath(pen, m_borderPath);\n\n                e.Graphics.DrawLine(pen, 4, Height / 2, Width - 4, Height / 2);\n\n                if (ValueChange >= 0)\n                    e.Graphics.DrawLine(pen, Width / 2, 4, Width / 2, Height - 4);\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/AttributesOptimizerControl.Designer.cs",
    "content": "using System;\nusing EVEMon.Common.CustomEventArgs;\n\nnamespace EVEMon.SkillPlanner\n{\n    partial class AttributesOptimizerControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AttributesOptimizerControl));\n            this.lblImplants = new System.Windows.Forms.Label();\n            this.pictureBox5 = new System.Windows.Forms.PictureBox();\n            this.pictureBox4 = new System.Windows.Forms.PictureBox();\n            this.pictureBox3 = new System.Windows.Forms.PictureBox();\n            this.pictureBox2 = new System.Windows.Forms.PictureBox();\n            this.pictureBox1 = new System.Windows.Forms.PictureBox();\n            this.pictureBox6 = new System.Windows.Forms.PictureBox();\n            this.pictureBox7 = new System.Windows.Forms.PictureBox();\n            this.pictureBox8 = new System.Windows.Forms.PictureBox();\n            this.pictureBox9 = new System.Windows.Forms.PictureBox();\n            this.pictureBox10 = new System.Windows.Forms.PictureBox();\n            this.lblMemory = new System.Windows.Forms.Label();\n            this.lblWillpower = new System.Windows.Forms.Label();\n            this.lblCharisma = new System.Windows.Forms.Label();\n            this.lblPerception = new System.Windows.Forms.Label();\n            this.lblIntelligence = new System.Windows.Forms.Label();\n            this.lblBase = new System.Windows.Forms.Label();\n            this.lbMEM = new System.Windows.Forms.Label();\n            this.lbWIL = new System.Windows.Forms.Label();\n            this.lbCHA = new System.Windows.Forms.Label();\n            this.lbPER = new System.Windows.Forms.Label();\n            this.lbINT = new System.Windows.Forms.Label();\n            this.tblayoutComparePanel = new System.Windows.Forms.TableLayoutPanel();\n            this.lbGain = new System.Windows.Forms.Label();\n            this.lbOptimizedTimeInfo = new System.Windows.Forms.Label();\n            this.lbCurrentTime = new System.Windows.Forms.Label();\n            this.lbOptimizedTime = new System.Windows.Forms.Label();\n            this.lbCurrentTimeInfo = new System.Windows.Forms.Label();\n            this.lbWarning = new System.Windows.Forms.Label();\n            this.buttonCurrent = new System.Windows.Forms.Button();\n            this.lblUnassignedAttributePoints = new System.Windows.Forms.Label();\n            this.buttonOptimize = new System.Windows.Forms.Button();\n            this.lblNotice = new System.Windows.Forms.Label();\n            this.labelDescription = new System.Windows.Forms.Label();\n            this.abMEMInc = new EVEMon.SkillPlanner.AttributeButtonControl();\n            this.pbMEMRemappable = new EVEMon.SkillPlanner.AttributeBarControl();\n            this.abWILInc = new EVEMon.SkillPlanner.AttributeButtonControl();\n            this.pbWILRemappable = new EVEMon.SkillPlanner.AttributeBarControl();\n            this.abCHAInc = new EVEMon.SkillPlanner.AttributeButtonControl();\n            this.pbCHARemappable = new EVEMon.SkillPlanner.AttributeBarControl();\n            this.abPERInc = new EVEMon.SkillPlanner.AttributeButtonControl();\n            this.pbPERRemappable = new EVEMon.SkillPlanner.AttributeBarControl();\n            this.abINTInc = new EVEMon.SkillPlanner.AttributeButtonControl();\n            this.pbINTRemappable = new EVEMon.SkillPlanner.AttributeBarControl();\n            this.abMEMDec = new EVEMon.SkillPlanner.AttributeButtonControl();\n            this.abWILDec = new EVEMon.SkillPlanner.AttributeButtonControl();\n            this.abCHADec = new EVEMon.SkillPlanner.AttributeButtonControl();\n            this.abPERDec = new EVEMon.SkillPlanner.AttributeButtonControl();\n            this.abINTDec = new EVEMon.SkillPlanner.AttributeButtonControl();\n            this.pbINTImplants = new EVEMon.SkillPlanner.AttributeBarControl();\n            this.pbPERImplants = new EVEMon.SkillPlanner.AttributeBarControl();\n            this.pbCHAImplants = new EVEMon.SkillPlanner.AttributeBarControl();\n            this.pbWILImplants = new EVEMon.SkillPlanner.AttributeBarControl();\n            this.pbMEMImplants = new EVEMon.SkillPlanner.AttributeBarControl();\n            this.pbUnassigned = new EVEMon.SkillPlanner.AttributeBarControl();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox8)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox9)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox10)).BeginInit();\n            this.tblayoutComparePanel.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // lblImplants\n            // \n            this.lblImplants.Location = new System.Drawing.Point(332, 41);\n            this.lblImplants.Name = \"lblImplants\";\n            this.lblImplants.Size = new System.Drawing.Size(65, 16);\n            this.lblImplants.TabIndex = 60;\n            this.lblImplants.Text = \"Implants\";\n            this.lblImplants.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // pictureBox5\n            // \n            this.pictureBox5.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox5.Image\")));\n            this.pictureBox5.Location = new System.Drawing.Point(9, 211);\n            this.pictureBox5.Name = \"pictureBox5\";\n            this.pictureBox5.Size = new System.Drawing.Size(32, 28);\n            this.pictureBox5.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox5.TabIndex = 58;\n            this.pictureBox5.TabStop = false;\n            // \n            // pictureBox4\n            // \n            this.pictureBox4.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox4.Image\")));\n            this.pictureBox4.Location = new System.Drawing.Point(9, 173);\n            this.pictureBox4.Name = \"pictureBox4\";\n            this.pictureBox4.Size = new System.Drawing.Size(32, 28);\n            this.pictureBox4.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox4.TabIndex = 57;\n            this.pictureBox4.TabStop = false;\n            // \n            // pictureBox3\n            // \n            this.pictureBox3.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox3.Image\")));\n            this.pictureBox3.Location = new System.Drawing.Point(9, 135);\n            this.pictureBox3.Name = \"pictureBox3\";\n            this.pictureBox3.Size = new System.Drawing.Size(32, 28);\n            this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox3.TabIndex = 56;\n            this.pictureBox3.TabStop = false;\n            // \n            // pictureBox2\n            // \n            this.pictureBox2.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox2.Image\")));\n            this.pictureBox2.Location = new System.Drawing.Point(9, 59);\n            this.pictureBox2.Name = \"pictureBox2\";\n            this.pictureBox2.Size = new System.Drawing.Size(32, 28);\n            this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox2.TabIndex = 55;\n            this.pictureBox2.TabStop = false;\n            // \n            // pictureBox1\n            // \n            this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox1.Image\")));\n            this.pictureBox1.Location = new System.Drawing.Point(9, 97);\n            this.pictureBox1.Name = \"pictureBox1\";\n            this.pictureBox1.Size = new System.Drawing.Size(32, 28);\n            this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox1.TabIndex = 54;\n            this.pictureBox1.TabStop = false;\n            // \n            // pictureBox6\n            // \n            this.pictureBox6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.pictureBox6.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox6.Image\")));\n            this.pictureBox6.Location = new System.Drawing.Point(394, 59);\n            this.pictureBox6.Name = \"pictureBox6\";\n            this.pictureBox6.Size = new System.Drawing.Size(32, 28);\n            this.pictureBox6.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox6.TabIndex = 114;\n            this.pictureBox6.TabStop = false;\n            // \n            // pictureBox7\n            // \n            this.pictureBox7.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.pictureBox7.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox7.Image\")));\n            this.pictureBox7.Location = new System.Drawing.Point(394, 97);\n            this.pictureBox7.Name = \"pictureBox7\";\n            this.pictureBox7.Size = new System.Drawing.Size(32, 28);\n            this.pictureBox7.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox7.TabIndex = 115;\n            this.pictureBox7.TabStop = false;\n            // \n            // pictureBox8\n            // \n            this.pictureBox8.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.pictureBox8.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox8.Image\")));\n            this.pictureBox8.Location = new System.Drawing.Point(394, 135);\n            this.pictureBox8.Name = \"pictureBox8\";\n            this.pictureBox8.Size = new System.Drawing.Size(32, 28);\n            this.pictureBox8.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox8.TabIndex = 116;\n            this.pictureBox8.TabStop = false;\n            // \n            // pictureBox9\n            // \n            this.pictureBox9.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.pictureBox9.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox9.Image\")));\n            this.pictureBox9.Location = new System.Drawing.Point(394, 173);\n            this.pictureBox9.Name = \"pictureBox9\";\n            this.pictureBox9.Size = new System.Drawing.Size(32, 28);\n            this.pictureBox9.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox9.TabIndex = 117;\n            this.pictureBox9.TabStop = false;\n            // \n            // pictureBox10\n            // \n            this.pictureBox10.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.pictureBox10.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox10.Image\")));\n            this.pictureBox10.Location = new System.Drawing.Point(394, 211);\n            this.pictureBox10.Name = \"pictureBox10\";\n            this.pictureBox10.Size = new System.Drawing.Size(32, 28);\n            this.pictureBox10.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pictureBox10.TabIndex = 118;\n            this.pictureBox10.TabStop = false;\n            // \n            // lblMemory\n            // \n            this.lblMemory.AutoSize = true;\n            this.lblMemory.Location = new System.Drawing.Point(47, 211);\n            this.lblMemory.Name = \"lblMemory\";\n            this.lblMemory.Size = new System.Drawing.Size(44, 13);\n            this.lblMemory.TabIndex = 47;\n            this.lblMemory.Text = \"Memory\";\n            // \n            // lblWillpower\n            // \n            this.lblWillpower.AutoSize = true;\n            this.lblWillpower.Location = new System.Drawing.Point(47, 173);\n            this.lblWillpower.Name = \"lblWillpower\";\n            this.lblWillpower.Size = new System.Drawing.Size(53, 13);\n            this.lblWillpower.TabIndex = 45;\n            this.lblWillpower.Text = \"Willpower\";\n            // \n            // lblCharisma\n            // \n            this.lblCharisma.AutoSize = true;\n            this.lblCharisma.Location = new System.Drawing.Point(47, 135);\n            this.lblCharisma.Name = \"lblCharisma\";\n            this.lblCharisma.Size = new System.Drawing.Size(50, 13);\n            this.lblCharisma.TabIndex = 43;\n            this.lblCharisma.Text = \"Charisma\";\n            // \n            // lblPerception\n            // \n            this.lblPerception.AutoSize = true;\n            this.lblPerception.Location = new System.Drawing.Point(47, 97);\n            this.lblPerception.Name = \"lblPerception\";\n            this.lblPerception.Size = new System.Drawing.Size(58, 13);\n            this.lblPerception.TabIndex = 41;\n            this.lblPerception.Text = \"Perception\";\n            // \n            // lblIntelligence\n            // \n            this.lblIntelligence.AutoSize = true;\n            this.lblIntelligence.Location = new System.Drawing.Point(47, 59);\n            this.lblIntelligence.Name = \"lblIntelligence\";\n            this.lblIntelligence.Size = new System.Drawing.Size(61, 13);\n            this.lblIntelligence.TabIndex = 39;\n            this.lblIntelligence.Text = \"Intelligence\";\n            // \n            // lblBase\n            // \n            this.lblBase.Location = new System.Drawing.Point(201, 41);\n            this.lblBase.Name = \"lblBase\";\n            this.lblBase.Size = new System.Drawing.Size(108, 16);\n            this.lblBase.TabIndex = 59;\n            this.lblBase.Text = \"Remappable\";\n            this.lblBase.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lbMEM\n            // \n            this.lbMEM.AutoSize = true;\n            this.lbMEM.Location = new System.Drawing.Point(47, 226);\n            this.lbMEM.Name = \"lbMEM\";\n            this.lbMEM.Size = new System.Drawing.Size(57, 13);\n            this.lbMEM.TabIndex = 48;\n            this.lbMEM.Text = \"Points : 20\";\n            // \n            // lbWIL\n            // \n            this.lbWIL.AutoSize = true;\n            this.lbWIL.Location = new System.Drawing.Point(47, 188);\n            this.lbWIL.Name = \"lbWIL\";\n            this.lbWIL.Size = new System.Drawing.Size(57, 13);\n            this.lbWIL.TabIndex = 46;\n            this.lbWIL.Text = \"Points : 20\";\n            // \n            // lbCHA\n            // \n            this.lbCHA.AutoSize = true;\n            this.lbCHA.Location = new System.Drawing.Point(49, 150);\n            this.lbCHA.Name = \"lbCHA\";\n            this.lbCHA.Size = new System.Drawing.Size(57, 13);\n            this.lbCHA.TabIndex = 44;\n            this.lbCHA.Text = \"Points : 20\";\n            // \n            // lbPER\n            // \n            this.lbPER.AutoSize = true;\n            this.lbPER.Location = new System.Drawing.Point(47, 113);\n            this.lbPER.Name = \"lbPER\";\n            this.lbPER.Size = new System.Drawing.Size(57, 13);\n            this.lbPER.TabIndex = 42;\n            this.lbPER.Text = \"Points : 20\";\n            // \n            // lbINT\n            // \n            this.lbINT.AutoSize = true;\n            this.lbINT.Location = new System.Drawing.Point(47, 73);\n            this.lbINT.Name = \"lbINT\";\n            this.lbINT.Size = new System.Drawing.Size(113, 13);\n            this.lbINT.TabIndex = 40;\n            this.lbINT.Text = \"20 (new : 18 ; old : 17)\";\n            // \n            // tblayoutComparePanel\n            // \n            this.tblayoutComparePanel.AutoSize = true;\n            this.tblayoutComparePanel.ColumnCount = 2;\n            this.tblayoutComparePanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tblayoutComparePanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tblayoutComparePanel.Controls.Add(this.lbGain, 0, 2);\n            this.tblayoutComparePanel.Controls.Add(this.lbOptimizedTimeInfo, 0, 1);\n            this.tblayoutComparePanel.Controls.Add(this.lbCurrentTime, 1, 0);\n            this.tblayoutComparePanel.Controls.Add(this.lbOptimizedTime, 1, 1);\n            this.tblayoutComparePanel.Controls.Add(this.lbCurrentTimeInfo, 0, 0);\n            this.tblayoutComparePanel.Location = new System.Drawing.Point(9, 332);\n            this.tblayoutComparePanel.Name = \"tblayoutComparePanel\";\n            this.tblayoutComparePanel.RowCount = 3;\n            this.tblayoutComparePanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tblayoutComparePanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tblayoutComparePanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tblayoutComparePanel.Size = new System.Drawing.Size(285, 75);\n            this.tblayoutComparePanel.TabIndex = 73;\n            // \n            // lbGain\n            // \n            this.lbGain.AutoSize = true;\n            this.tblayoutComparePanel.SetColumnSpan(this.lbGain, 2);\n            this.lbGain.Location = new System.Drawing.Point(6, 56);\n            this.lbGain.Margin = new System.Windows.Forms.Padding(6);\n            this.lbGain.Name = \"lbGain\";\n            this.lbGain.Size = new System.Drawing.Size(156, 13);\n            this.lbGain.TabIndex = 17;\n            this.lbGain.Text = \"Your skills are already optimized\";\n            // \n            // lbOptimizedTimeInfo\n            // \n            this.lbOptimizedTimeInfo.AutoSize = true;\n            this.lbOptimizedTimeInfo.Location = new System.Drawing.Point(6, 31);\n            this.lbOptimizedTimeInfo.Margin = new System.Windows.Forms.Padding(6);\n            this.lbOptimizedTimeInfo.Name = \"lbOptimizedTimeInfo\";\n            this.lbOptimizedTimeInfo.Size = new System.Drawing.Size(110, 13);\n            this.lbOptimizedTimeInfo.TabIndex = 16;\n            this.lbOptimizedTimeInfo.Text = \"With these attributes :\";\n            // \n            // lbCurrentTime\n            // \n            this.lbCurrentTime.AutoSize = true;\n            this.lbCurrentTime.Location = new System.Drawing.Point(128, 6);\n            this.lbCurrentTime.Margin = new System.Windows.Forms.Padding(6);\n            this.lbCurrentTime.Name = \"lbCurrentTime\";\n            this.lbCurrentTime.Size = new System.Drawing.Size(50, 13);\n            this.lbCurrentTime.TabIndex = 19;\n            this.lbCurrentTime.Text = \"0h 0m 0s\";\n            // \n            // lbOptimizedTime\n            // \n            this.lbOptimizedTime.AutoSize = true;\n            this.lbOptimizedTime.Location = new System.Drawing.Point(128, 31);\n            this.lbOptimizedTime.Margin = new System.Windows.Forms.Padding(6);\n            this.lbOptimizedTime.Name = \"lbOptimizedTime\";\n            this.lbOptimizedTime.Size = new System.Drawing.Size(13, 13);\n            this.lbOptimizedTime.TabIndex = 20;\n            this.lbOptimizedTime.Text = \"?\";\n            // \n            // lbCurrentTimeInfo\n            // \n            this.lbCurrentTimeInfo.AutoSize = true;\n            this.lbCurrentTimeInfo.Location = new System.Drawing.Point(6, 6);\n            this.lbCurrentTimeInfo.Margin = new System.Windows.Forms.Padding(6);\n            this.lbCurrentTimeInfo.Name = \"lbCurrentTimeInfo\";\n            this.lbCurrentTimeInfo.Size = new System.Drawing.Size(69, 13);\n            this.lbCurrentTimeInfo.TabIndex = 15;\n            this.lbCurrentTimeInfo.Text = \"Current time :\";\n            // \n            // lbWarning\n            // \n            this.lbWarning.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lbWarning.AutoSize = true;\n            this.lbWarning.ForeColor = System.Drawing.Color.DarkRed;\n            this.lbWarning.Location = new System.Drawing.Point(256, 292);\n            this.lbWarning.Margin = new System.Windows.Forms.Padding(4);\n            this.lbWarning.MaximumSize = new System.Drawing.Size(160, 2000);\n            this.lbWarning.Name = \"lbWarning\";\n            this.lbWarning.Size = new System.Drawing.Size(159, 26);\n            this.lbWarning.TabIndex = 74;\n            this.lbWarning.Text = \"Training will be complete before   the end of 12 month period.\";\n            this.lbWarning.Visible = false;\n            // \n            // buttonCurrent\n            // \n            this.buttonCurrent.Location = new System.Drawing.Point(132, 292);\n            this.buttonCurrent.Name = \"buttonCurrent\";\n            this.buttonCurrent.Size = new System.Drawing.Size(117, 23);\n            this.buttonCurrent.TabIndex = 75;\n            this.buttonCurrent.Text = \"Reset to current\";\n            this.buttonCurrent.UseVisualStyleBackColor = true;\n            this.buttonCurrent.Click += new System.EventHandler(this.buttonCurrent_Click);\n            // \n            // lblUnassignedAttributePoints\n            // \n            this.lblUnassignedAttributePoints.AutoSize = true;\n            this.lblUnassignedAttributePoints.Location = new System.Drawing.Point(15, 263);\n            this.lblUnassignedAttributePoints.Name = \"lblUnassignedAttributePoints\";\n            this.lblUnassignedAttributePoints.Size = new System.Drawing.Size(140, 13);\n            this.lblUnassignedAttributePoints.TabIndex = 77;\n            this.lblUnassignedAttributePoints.Text = \"Unassigned Attribute Points:\";\n            // \n            // buttonOptimize\n            // \n            this.buttonOptimize.Location = new System.Drawing.Point(9, 292);\n            this.buttonOptimize.Name = \"buttonOptimize\";\n            this.buttonOptimize.Size = new System.Drawing.Size(117, 23);\n            this.buttonOptimize.TabIndex = 79;\n            this.buttonOptimize.Text = \"Optimized\";\n            this.buttonOptimize.UseVisualStyleBackColor = true;\n            this.buttonOptimize.Click += new System.EventHandler(this.buttonOptimize_Click);\n            // \n            // lblNotice\n            // \n            this.lblNotice.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblNotice.AutoSize = true;\n            this.lblNotice.ForeColor = System.Drawing.Color.Red;\n            this.lblNotice.Location = new System.Drawing.Point(8, 26);\n            this.lblNotice.Margin = new System.Windows.Forms.Padding(4);\n            this.lblNotice.MaximumSize = new System.Drawing.Size(411, 2000);\n            this.lblNotice.Name = \"lblNotice\";\n            this.lblNotice.Size = new System.Drawing.Size(294, 13);\n            this.lblNotice.TabIndex = 112;\n            this.lblNotice.Text = \"Notice! This is not the active \\\"Implant Set\\\" of your character.\";\n            this.lblNotice.Visible = false;\n            // \n            // labelDescription\n            // \n            this.labelDescription.AutoSize = true;\n            this.labelDescription.Dock = System.Windows.Forms.DockStyle.Top;\n            this.labelDescription.Location = new System.Drawing.Point(0, 0);\n            this.labelDescription.Margin = new System.Windows.Forms.Padding(3, 0, 10, 0);\n            this.labelDescription.Name = \"labelDescription\";\n            this.labelDescription.Padding = new System.Windows.Forms.Padding(8);\n            this.labelDescription.Size = new System.Drawing.Size(98, 29);\n            this.labelDescription.TabIndex = 113;\n            this.labelDescription.Text = \"labelDescription\";\n            // \n            // abMEMInc\n            // \n            this.abMEMInc.AttributeBar = this.pbMEMRemappable;\n            this.abMEMInc.BackColor = System.Drawing.Color.Transparent;\n            this.abMEMInc.Location = new System.Drawing.Point(312, 218);\n            this.abMEMInc.Name = \"abMEMInc\";\n            this.abMEMInc.Size = new System.Drawing.Size(16, 16);\n            this.abMEMInc.TabIndex = 111;\n            this.abMEMInc.ValueChange = 1;\n            this.abMEMInc.Click += new System.EventHandler(this.attributeButton_Click);\n            // \n            // pbMEMRemappable\n            // \n            this.pbMEMRemappable.Location = new System.Drawing.Point(202, 217);\n            this.pbMEMRemappable.MaxPoints = 10;\n            this.pbMEMRemappable.Name = \"pbMEMRemappable\";\n            this.pbMEMRemappable.Size = new System.Drawing.Size(103, 18);\n            this.pbMEMRemappable.TabIndex = 82;\n            this.pbMEMRemappable.TabStop = false;\n            this.pbMEMRemappable.Value = ((long)(0));\n            this.pbMEMRemappable.ValueChanging += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangingEventArgs>(this.pbRemappable_ValueChanging);\n            this.pbMEMRemappable.ValueChanged += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangedEventArgs>(this.pb_ValueChanged);\n            this.pbMEMRemappable.Highlighting += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeHighlightingEventArgs>(this.pbRemappable_Highlighting);\n            // \n            // abWILInc\n            // \n            this.abWILInc.AttributeBar = this.pbWILRemappable;\n            this.abWILInc.BackColor = System.Drawing.Color.Transparent;\n            this.abWILInc.Location = new System.Drawing.Point(312, 180);\n            this.abWILInc.Name = \"abWILInc\";\n            this.abWILInc.Size = new System.Drawing.Size(16, 16);\n            this.abWILInc.TabIndex = 110;\n            this.abWILInc.ValueChange = 1;\n            this.abWILInc.Click += new System.EventHandler(this.attributeButton_Click);\n            // \n            // pbWILRemappable\n            // \n            this.pbWILRemappable.Location = new System.Drawing.Point(202, 179);\n            this.pbWILRemappable.MaxPoints = 10;\n            this.pbWILRemappable.Name = \"pbWILRemappable\";\n            this.pbWILRemappable.Size = new System.Drawing.Size(103, 18);\n            this.pbWILRemappable.TabIndex = 89;\n            this.pbWILRemappable.TabStop = false;\n            this.pbWILRemappable.Value = ((long)(0));\n            this.pbWILRemappable.ValueChanging += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangingEventArgs>(this.pbRemappable_ValueChanging);\n            this.pbWILRemappable.ValueChanged += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangedEventArgs>(this.pb_ValueChanged);\n            this.pbWILRemappable.Highlighting += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeHighlightingEventArgs>(this.pbRemappable_Highlighting);\n            // \n            // abCHAInc\n            // \n            this.abCHAInc.AttributeBar = this.pbCHARemappable;\n            this.abCHAInc.BackColor = System.Drawing.Color.Transparent;\n            this.abCHAInc.Location = new System.Drawing.Point(312, 142);\n            this.abCHAInc.Name = \"abCHAInc\";\n            this.abCHAInc.Size = new System.Drawing.Size(16, 16);\n            this.abCHAInc.TabIndex = 109;\n            this.abCHAInc.ValueChange = 1;\n            this.abCHAInc.Click += new System.EventHandler(this.attributeButton_Click);\n            // \n            // pbCHARemappable\n            // \n            this.pbCHARemappable.Location = new System.Drawing.Point(202, 141);\n            this.pbCHARemappable.MaxPoints = 10;\n            this.pbCHARemappable.Name = \"pbCHARemappable\";\n            this.pbCHARemappable.Size = new System.Drawing.Size(103, 18);\n            this.pbCHARemappable.TabIndex = 90;\n            this.pbCHARemappable.TabStop = false;\n            this.pbCHARemappable.Value = ((long)(0));\n            this.pbCHARemappable.ValueChanging += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangingEventArgs>(this.pbRemappable_ValueChanging);\n            this.pbCHARemappable.ValueChanged += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangedEventArgs>(this.pb_ValueChanged);\n            this.pbCHARemappable.Highlighting += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeHighlightingEventArgs>(this.pbRemappable_Highlighting);\n            // \n            // abPERInc\n            // \n            this.abPERInc.AttributeBar = this.pbPERRemappable;\n            this.abPERInc.BackColor = System.Drawing.Color.Transparent;\n            this.abPERInc.Location = new System.Drawing.Point(312, 105);\n            this.abPERInc.Name = \"abPERInc\";\n            this.abPERInc.Size = new System.Drawing.Size(16, 16);\n            this.abPERInc.TabIndex = 108;\n            this.abPERInc.ValueChange = 1;\n            this.abPERInc.Click += new System.EventHandler(this.attributeButton_Click);\n            // \n            // pbPERRemappable\n            // \n            this.pbPERRemappable.Location = new System.Drawing.Point(202, 104);\n            this.pbPERRemappable.MaxPoints = 10;\n            this.pbPERRemappable.Name = \"pbPERRemappable\";\n            this.pbPERRemappable.Size = new System.Drawing.Size(103, 18);\n            this.pbPERRemappable.TabIndex = 91;\n            this.pbPERRemappable.TabStop = false;\n            this.pbPERRemappable.Value = ((long)(0));\n            this.pbPERRemappable.ValueChanging += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangingEventArgs>(this.pbRemappable_ValueChanging);\n            this.pbPERRemappable.ValueChanged += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangedEventArgs>(this.pb_ValueChanged);\n            this.pbPERRemappable.Highlighting += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeHighlightingEventArgs>(this.pbRemappable_Highlighting);\n            // \n            // abINTInc\n            // \n            this.abINTInc.AttributeBar = this.pbINTRemappable;\n            this.abINTInc.BackColor = System.Drawing.Color.Transparent;\n            this.abINTInc.Location = new System.Drawing.Point(312, 65);\n            this.abINTInc.Name = \"abINTInc\";\n            this.abINTInc.Size = new System.Drawing.Size(16, 16);\n            this.abINTInc.TabIndex = 107;\n            this.abINTInc.ValueChange = 1;\n            this.abINTInc.Click += new System.EventHandler(this.attributeButton_Click);\n            // \n            // pbINTRemappable\n            // \n            this.pbINTRemappable.Location = new System.Drawing.Point(202, 64);\n            this.pbINTRemappable.MaxPoints = 10;\n            this.pbINTRemappable.Name = \"pbINTRemappable\";\n            this.pbINTRemappable.Size = new System.Drawing.Size(103, 18);\n            this.pbINTRemappable.TabIndex = 81;\n            this.pbINTRemappable.TabStop = false;\n            this.pbINTRemappable.Value = ((long)(0));\n            this.pbINTRemappable.ValueChanging += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangingEventArgs>(this.pbRemappable_ValueChanging);\n            this.pbINTRemappable.ValueChanged += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangedEventArgs>(this.pb_ValueChanged);\n            this.pbINTRemappable.Highlighting += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeHighlightingEventArgs>(this.pbRemappable_Highlighting);\n            // \n            // abMEMDec\n            // \n            this.abMEMDec.AttributeBar = this.pbMEMRemappable;\n            this.abMEMDec.BackColor = System.Drawing.Color.Transparent;\n            this.abMEMDec.Location = new System.Drawing.Point(176, 218);\n            this.abMEMDec.Name = \"abMEMDec\";\n            this.abMEMDec.Size = new System.Drawing.Size(16, 16);\n            this.abMEMDec.TabIndex = 106;\n            this.abMEMDec.ValueChange = -1;\n            this.abMEMDec.Click += new System.EventHandler(this.attributeButton_Click);\n            // \n            // abWILDec\n            // \n            this.abWILDec.AttributeBar = this.pbWILRemappable;\n            this.abWILDec.BackColor = System.Drawing.Color.Transparent;\n            this.abWILDec.Location = new System.Drawing.Point(176, 180);\n            this.abWILDec.Name = \"abWILDec\";\n            this.abWILDec.Size = new System.Drawing.Size(16, 16);\n            this.abWILDec.TabIndex = 105;\n            this.abWILDec.ValueChange = -1;\n            this.abWILDec.Click += new System.EventHandler(this.attributeButton_Click);\n            // \n            // abCHADec\n            // \n            this.abCHADec.AttributeBar = this.pbCHARemappable;\n            this.abCHADec.BackColor = System.Drawing.Color.Transparent;\n            this.abCHADec.Location = new System.Drawing.Point(176, 142);\n            this.abCHADec.Name = \"abCHADec\";\n            this.abCHADec.Size = new System.Drawing.Size(16, 16);\n            this.abCHADec.TabIndex = 104;\n            this.abCHADec.ValueChange = -1;\n            this.abCHADec.Click += new System.EventHandler(this.attributeButton_Click);\n            // \n            // abPERDec\n            // \n            this.abPERDec.AttributeBar = this.pbPERRemappable;\n            this.abPERDec.BackColor = System.Drawing.Color.Transparent;\n            this.abPERDec.Location = new System.Drawing.Point(176, 105);\n            this.abPERDec.Name = \"abPERDec\";\n            this.abPERDec.Size = new System.Drawing.Size(16, 16);\n            this.abPERDec.TabIndex = 103;\n            this.abPERDec.ValueChange = -1;\n            this.abPERDec.Click += new System.EventHandler(this.attributeButton_Click);\n            // \n            // abINTDec\n            // \n            this.abINTDec.AttributeBar = this.pbINTRemappable;\n            this.abINTDec.BackColor = System.Drawing.Color.Transparent;\n            this.abINTDec.Location = new System.Drawing.Point(176, 65);\n            this.abINTDec.Name = \"abINTDec\";\n            this.abINTDec.Size = new System.Drawing.Size(16, 16);\n            this.abINTDec.TabIndex = 102;\n            this.abINTDec.ValueChange = -1;\n            this.abINTDec.Click += new System.EventHandler(this.attributeButton_Click);\n            // \n            // pbINTImplants\n            // \n            this.pbINTImplants.Enabled = false;\n            this.pbINTImplants.Location = new System.Drawing.Point(344, 64);\n            this.pbINTImplants.Name = \"pbINTImplants\";\n            this.pbINTImplants.Size = new System.Drawing.Size(38, 18);\n            this.pbINTImplants.SpentPointColor = System.Drawing.Color.LightGray;\n            this.pbINTImplants.TabIndex = 100;\n            this.pbINTImplants.TabStop = false;\n            this.pbINTImplants.Value = ((long)(0));\n            this.pbINTImplants.ValueChanged += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangedEventArgs>(this.pb_ValueChanged);\n            // \n            // pbPERImplants\n            // \n            this.pbPERImplants.Enabled = false;\n            this.pbPERImplants.Location = new System.Drawing.Point(344, 104);\n            this.pbPERImplants.Name = \"pbPERImplants\";\n            this.pbPERImplants.Size = new System.Drawing.Size(38, 18);\n            this.pbPERImplants.SpentPointColor = System.Drawing.Color.LightGray;\n            this.pbPERImplants.TabIndex = 99;\n            this.pbPERImplants.TabStop = false;\n            this.pbPERImplants.Value = ((long)(0));\n            this.pbPERImplants.ValueChanged += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangedEventArgs>(this.pb_ValueChanged);\n            // \n            // pbCHAImplants\n            // \n            this.pbCHAImplants.Enabled = false;\n            this.pbCHAImplants.Location = new System.Drawing.Point(344, 141);\n            this.pbCHAImplants.Name = \"pbCHAImplants\";\n            this.pbCHAImplants.Size = new System.Drawing.Size(38, 18);\n            this.pbCHAImplants.SpentPointColor = System.Drawing.Color.LightGray;\n            this.pbCHAImplants.TabIndex = 98;\n            this.pbCHAImplants.TabStop = false;\n            this.pbCHAImplants.Value = ((long)(0));\n            this.pbCHAImplants.ValueChanged += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangedEventArgs>(this.pb_ValueChanged);\n            // \n            // pbWILImplants\n            // \n            this.pbWILImplants.Enabled = false;\n            this.pbWILImplants.Location = new System.Drawing.Point(344, 179);\n            this.pbWILImplants.Name = \"pbWILImplants\";\n            this.pbWILImplants.Size = new System.Drawing.Size(38, 18);\n            this.pbWILImplants.SpentPointColor = System.Drawing.Color.LightGray;\n            this.pbWILImplants.TabIndex = 97;\n            this.pbWILImplants.TabStop = false;\n            this.pbWILImplants.Value = ((long)(0));\n            this.pbWILImplants.ValueChanged += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangedEventArgs>(this.pb_ValueChanged);\n            // \n            // pbMEMImplants\n            // \n            this.pbMEMImplants.Enabled = false;\n            this.pbMEMImplants.Location = new System.Drawing.Point(344, 217);\n            this.pbMEMImplants.Name = \"pbMEMImplants\";\n            this.pbMEMImplants.Size = new System.Drawing.Size(38, 18);\n            this.pbMEMImplants.SpentPointColor = System.Drawing.Color.LightGray;\n            this.pbMEMImplants.TabIndex = 96;\n            this.pbMEMImplants.TabStop = false;\n            this.pbMEMImplants.Value = ((long)(0));\n            this.pbMEMImplants.ValueChanged += new System.EventHandler<EVEMon.Common.CustomEventArgs.AttributeValueChangedEventArgs>(this.pb_ValueChanged);\n            // \n            // pbUnassigned\n            // \n            this.pbUnassigned.Enabled = false;\n            this.pbUnassigned.Location = new System.Drawing.Point(202, 260);\n            this.pbUnassigned.MaxPoints = 14;\n            this.pbUnassigned.Name = \"pbUnassigned\";\n            this.pbUnassigned.Size = new System.Drawing.Size(143, 18);\n            this.pbUnassigned.TabIndex = 80;\n            this.pbUnassigned.TabStop = false;\n            this.pbUnassigned.Value = ((long)(0));\n            // \n            // AttributesOptimizerControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.Color.Transparent;\n            this.Controls.Add(this.pictureBox10);\n            this.Controls.Add(this.pictureBox9);\n            this.Controls.Add(this.pictureBox8);\n            this.Controls.Add(this.pictureBox7);\n            this.Controls.Add(this.pictureBox6);\n            this.Controls.Add(this.lblNotice);\n            this.Controls.Add(this.labelDescription);\n            this.Controls.Add(this.abMEMInc);\n            this.Controls.Add(this.abWILInc);\n            this.Controls.Add(this.abCHAInc);\n            this.Controls.Add(this.abPERInc);\n            this.Controls.Add(this.abINTInc);\n            this.Controls.Add(this.abMEMDec);\n            this.Controls.Add(this.abWILDec);\n            this.Controls.Add(this.abCHADec);\n            this.Controls.Add(this.abPERDec);\n            this.Controls.Add(this.abINTDec);\n            this.Controls.Add(this.pbINTImplants);\n            this.Controls.Add(this.pbPERImplants);\n            this.Controls.Add(this.pbCHAImplants);\n            this.Controls.Add(this.pbWILImplants);\n            this.Controls.Add(this.pbMEMImplants);\n            this.Controls.Add(this.pbPERRemappable);\n            this.Controls.Add(this.pbCHARemappable);\n            this.Controls.Add(this.pbWILRemappable);\n            this.Controls.Add(this.pbMEMRemappable);\n            this.Controls.Add(this.pbINTRemappable);\n            this.Controls.Add(this.pbUnassigned);\n            this.Controls.Add(this.buttonOptimize);\n            this.Controls.Add(this.lblUnassignedAttributePoints);\n            this.Controls.Add(this.buttonCurrent);\n            this.Controls.Add(this.tblayoutComparePanel);\n            this.Controls.Add(this.lbWarning);\n            this.Controls.Add(this.lblImplants);\n            this.Controls.Add(this.lblBase);\n            this.Controls.Add(this.pictureBox5);\n            this.Controls.Add(this.pictureBox4);\n            this.Controls.Add(this.pictureBox3);\n            this.Controls.Add(this.pictureBox2);\n            this.Controls.Add(this.pictureBox1);\n            this.Controls.Add(this.lbMEM);\n            this.Controls.Add(this.lblMemory);\n            this.Controls.Add(this.lbWIL);\n            this.Controls.Add(this.lblWillpower);\n            this.Controls.Add(this.lbCHA);\n            this.Controls.Add(this.lblCharisma);\n            this.Controls.Add(this.lbPER);\n            this.Controls.Add(this.lblPerception);\n            this.Controls.Add(this.lbINT);\n            this.Controls.Add(this.lblIntelligence);\n            this.Name = \"AttributesOptimizerControl\";\n            this.Size = new System.Drawing.Size(435, 417);\n            this.Click += new System.EventHandler(this.attributeButton_Click);\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox7)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox8)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox9)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox10)).EndInit();\n            this.tblayoutComparePanel.ResumeLayout(false);\n            this.tblayoutComparePanel.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label lblBase;\n        private System.Windows.Forms.Label lbMEM;\n        private System.Windows.Forms.Label lbWIL;\n        private System.Windows.Forms.Label lbCHA;\n        private System.Windows.Forms.Label lbPER;\n        private System.Windows.Forms.Label lbINT;\n        private System.Windows.Forms.TableLayoutPanel tblayoutComparePanel;\n        private System.Windows.Forms.Label lbGain;\n        private System.Windows.Forms.Label lbOptimizedTimeInfo;\n        private System.Windows.Forms.Label lbCurrentTime;\n        private System.Windows.Forms.Label lbOptimizedTime;\n        private System.Windows.Forms.Label lbCurrentTimeInfo;\n        private System.Windows.Forms.Label lbWarning;\n        private System.Windows.Forms.Label lblMemory;\n        private System.Windows.Forms.Label lblWillpower;\n        private System.Windows.Forms.Label lblCharisma;\n        private System.Windows.Forms.Label lblPerception;\n        private System.Windows.Forms.Label lblIntelligence;\n        private System.Windows.Forms.Button buttonCurrent;\n        private System.Windows.Forms.Label lblUnassignedAttributePoints;\n        private System.Windows.Forms.Button buttonOptimize;\n        private AttributeBarControl pbUnassigned;\n        private AttributeBarControl pbINTRemappable;\n        private AttributeBarControl pbMEMRemappable;\n        private AttributeBarControl pbWILRemappable;\n        private AttributeBarControl pbCHARemappable;\n        private AttributeBarControl pbPERRemappable;\n        private AttributeBarControl pbMEMImplants;\n        private AttributeBarControl pbWILImplants;\n        private AttributeBarControl pbCHAImplants;\n        private AttributeBarControl pbPERImplants;\n        private AttributeBarControl pbINTImplants;\n        private AttributeButtonControl abINTDec;\n        private AttributeButtonControl abPERDec;\n        private AttributeButtonControl abCHADec;\n        private AttributeButtonControl abWILDec;\n        private AttributeButtonControl abMEMDec;\n        private AttributeButtonControl abMEMInc;\n        private AttributeButtonControl abWILInc;\n        private AttributeButtonControl abCHAInc;\n        private AttributeButtonControl abPERInc;\n        private AttributeButtonControl abINTInc;\n        private System.Windows.Forms.Label lblNotice;\n        private System.Windows.Forms.Label labelDescription;\n        private System.Windows.Forms.Label lblImplants;\n        private System.Windows.Forms.PictureBox pictureBox5;\n        private System.Windows.Forms.PictureBox pictureBox4;\n        private System.Windows.Forms.PictureBox pictureBox3;\n        private System.Windows.Forms.PictureBox pictureBox2;\n        private System.Windows.Forms.PictureBox pictureBox1;\n        private System.Windows.Forms.PictureBox pictureBox6;\n        private System.Windows.Forms.PictureBox pictureBox7;\n        private System.Windows.Forms.PictureBox pictureBox8;\n        private System.Windows.Forms.PictureBox pictureBox9;\n        private System.Windows.Forms.PictureBox pictureBox10;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/AttributesOptimizerControl.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Control that shows attribute remapping and allows to adjust it.\n    /// </summary>\n    public partial class AttributesOptimizerControl : UserControl\n    {\n        private readonly Character m_character;\n        private readonly BasePlan m_plan;\n        private readonly RemappingResult m_remapping;\n        private readonly string m_description;\n\n        /// <summary>\n        /// Occurs when attributes changes. \n        /// </summary>\n        [Category(\"Behavior\")]\n        public event EventHandler<AttributeChangedEventArgs> AttributeChanged;\n\n        /// <summary>\n        /// Initializes a new instance of <see cref=\"AttributesOptimizerControl\"/>.\n        /// </summary>\n        /// <param name=\"character\">Character information</param>\n        /// <param name=\"plan\">Skill plan</param>\n        /// <param name=\"remapping\">Optimized remapping</param>\n        /// <param name=\"description\"></param>\n        public AttributesOptimizerControl(Character character, BasePlan plan,\n                                             RemappingResult remapping, string description)\n        {\n            InitializeComponent();\n            lbMEM.Font = FontFactory.GetFont(\"Tahoma\");\n            lbWIL.Font = FontFactory.GetFont(\"Tahoma\");\n            lbCHA.Font = FontFactory.GetFont(\"Tahoma\");\n            lbPER.Font = FontFactory.GetFont(\"Tahoma\");\n            lbINT.Font = FontFactory.GetFont(\"Tahoma\");\n\n            m_character = character;\n            m_plan = plan;\n            m_remapping = remapping;\n            m_description = description;\n\n            UpdateControls(m_character, m_plan, m_remapping, m_description);\n        }\n\n        /// <summary>\n        /// On load, use the <see cref=\"FontFactory\"/> to retrieve fonts.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            lblUnassignedAttributePoints.Font = FontFactory.GetFont(\"Tahoma\", 8.25F);\n            lbWarning.Font = FontFactory.GetFont(\"Microsoft Sans Serif\", 8.25F);\n            lblMemory.Font = FontFactory.GetFont(\"Microsoft Sans Serif\", 8.25F);\n            lblWillpower.Font = FontFactory.GetFont(\"Microsoft Sans Serif\", 8.25F);\n            lblCharisma.Font = FontFactory.GetFont(\"Microsoft Sans Serif\", 8.25F);\n            lblPerception.Font = FontFactory.GetFont(\"Microsoft Sans Serif\", 8.25F);\n            lblIntelligence.Font = FontFactory.GetFont(\"Microsoft Sans Serif\", 8.25F);\n        }\n\n        /// <summary>\n        /// Updates bars and labels with given attributes from remapping.\n        /// </summary>\n        /// <param name=\"character\">Character information</param>\n        /// <param name=\"plan\">Skill plan</param>\n        /// <param name=\"remapping\">Remapping with attributes and training time</param>\n        /// <param name=\"description\"></param>\n        private void UpdateControls(Character character, BasePlan plan, RemappingResult remapping,\n                                    string description)\n        {\n            UpdateAttributeControls(remapping, EveAttribute.Perception, lbPER, pbPERRemappable, pbPERImplants);\n            UpdateAttributeControls(remapping, EveAttribute.Willpower, lbWIL, pbWILRemappable, pbWILImplants);\n            UpdateAttributeControls(remapping, EveAttribute.Memory, lbMEM, pbMEMRemappable, pbMEMImplants);\n            UpdateAttributeControls(remapping, EveAttribute.Intelligence, lbINT, pbINTRemappable, pbINTImplants);\n            UpdateAttributeControls(remapping, EveAttribute.Charisma, lbCHA, pbCHARemappable, pbCHAImplants);\n\n            // Update the description label\n            labelDescription.Text = description;\n\n            // Update the current time control\n            lbCurrentTime.Text = remapping.BaseDuration.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n\n            // Update the optimized time control\n            lbOptimizedTime.Text = remapping.BestDuration.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n\n            // Update the time benefit control\n            string bestDurationTimeText = remapping.BaseDuration.Subtract(remapping.BestDuration)\n                .ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n            string worseDurationTimeText = remapping.BestDuration.Subtract(remapping.BaseDuration)\n                .ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n\n            lbGain.ForeColor = remapping.BestDuration < remapping.BaseDuration\n                ? Color.DarkGreen\n                : remapping.BaseDuration < remapping.BestDuration\n                    ? Color.DarkRed\n                    : Color.Black;\n            lbGain.Text = remapping.BestDuration < remapping.BaseDuration\n                ? $\"{bestDurationTimeText} better than current\"\n                : remapping.BaseDuration < remapping.BestDuration\n                    ? $\"{worseDurationTimeText} slower than current\"\n                    : \"Same as current\";\n\n            // A plan may not have a years worth of skills in it,\n            // only fair to warn the user\n            lbWarning.Visible = remapping.BestDuration < TimeSpan.FromDays(365);\n\n            // Spare points\n            long sparePoints = EveConstants.SpareAttributePointsOnRemap;\n            for (int i = 0; i < 5; i++)\n            {\n                sparePoints -= remapping.BestScratchpad[(EveAttribute)i].Base - EveConstants.CharacterBaseAttributePoints;\n            }\n            pbUnassigned.Value = sparePoints;\n\n            // If the implant set isn't the active one we notify the user\n            lblNotice.Visible = plan.ChosenImplantSet != character.ImplantSets.Current;\n        }\n\n        /// <summary>\n        /// Updates bars and labels for specified attribute.\n        /// </summary>\n        /// <param name=\"remapping\">Attribute remapping</param>\n        /// <param name=\"attrib\">Attribute that will be used to update controls</param>\n        /// <param name=\"label\">Label control</param>\n        /// <param name=\"pbRemappable\">Attribute bar for remappable value</param>\n        /// <param name=\"pbImplants\">Attribute bar for implants</param>\n        private static void UpdateAttributeControls(RemappingResult remapping,\n                                             EveAttribute attrib,\n                                             Control label,\n                                             AttributeBarControl pbRemappable,\n                                             AttributeBarControl pbImplants)\n        {\n            // Compute base and effective attributes\n            long effectiveAttribute = remapping.BestScratchpad[attrib].EffectiveValue;\n            long oldBaseAttribute = remapping.BaseScratchpad[attrib].Base;\n            long remappableAttribute = remapping.BestScratchpad[attrib].Base;\n            long implantsBonus = remapping.BestScratchpad[attrib].ImplantBonus;\n\n            // Update the label\n            label.Text = $\"{effectiveAttribute} (new : {remappableAttribute} ; old : {oldBaseAttribute})\";\n\n            // Update the bars\n            pbRemappable.Value = remappableAttribute - EveConstants.CharacterBaseAttributePoints;\n            pbImplants.Value = implantsBonus;\n        }\n\n        /// <summary>\n        /// Calculates new remapping from values of controls.\n        /// </summary>\n        private void Recalculate()\n        {\n            CharacterScratchpad scratchpad = m_remapping.BaseScratchpad.Clone();\n            scratchpad.Memory.Base = pbMEMRemappable.Value + EveConstants.CharacterBaseAttributePoints;\n            scratchpad.Charisma.Base = pbCHARemappable.Value + EveConstants.CharacterBaseAttributePoints;\n            scratchpad.Willpower.Base = pbWILRemappable.Value + EveConstants.CharacterBaseAttributePoints;\n            scratchpad.Perception.Base = pbPERRemappable.Value + EveConstants.CharacterBaseAttributePoints;\n            scratchpad.Intelligence.Base = pbINTRemappable.Value + EveConstants.CharacterBaseAttributePoints;\n\n            // Get remapping for provided attributes\n            RemappingResult manualRemapping = new RemappingResult(m_remapping,\n                                                                  scratchpad);\n            manualRemapping.Update();\n            UpdateControls(m_character, m_plan, manualRemapping, m_description);\n\n            // Notify the changes\n            AttributeChanged?.ThreadSafeInvoke(this, new AttributeChangedEventArgs(manualRemapping));\n        }\n\n\n        #region Events\n\n        /// <summary>\n        /// Change of any attribute must be adjusted if there is no enough free points in the pool.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"AttributeValueChangingEventArgs\"/> instance containing the event data.</param>\n        private void pbRemappable_ValueChanging(object sender, AttributeValueChangingEventArgs e)\n        {\n            AttributeBarControl control = (AttributeBarControl)sender;\n\n            // Adjust delta if there is no enough free points\n            if (pbUnassigned.Value < e.Value)\n                control.DeltaValue = pbUnassigned.Value;\n\n            // Add/remove points from pool\n            pbUnassigned.Value -= control.DeltaValue;\n        }\n\n        /// <summary>\n        /// Recalculate the time after change of an attribute.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"AttributeValueChangedEventArgs\"/> instance containing the event data.</param>\n        private void pb_ValueChanged(object sender, AttributeValueChangedEventArgs e)\n        {\n            Recalculate();\n        }\n\n        /// <summary>\n        /// Correct highlight if selected cell is inaccessable.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"AttributeHighlightingEventArgs\"/> instance containing the event data.</param>\n        private void pbRemappable_Highlighting(object sender, AttributeHighlightingEventArgs e)\n        {\n            AttributeBarControl control = (AttributeBarControl)sender;\n            \n            // Adjust possible highlight using free points in pool\n            if (e.Value - control.Value > pbUnassigned.Value)\n                control.HighlightedValue = control.Value + pbUnassigned.Value;\n        }\n\n        /// <summary>\n        /// Reset to original optimized remapping.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void buttonOptimize_Click(object sender, EventArgs e)\n        {\n            // Updates the remapping point with the optimized remapping\n            m_remapping.Update();\n\n            // Set all labels and bars to calculated optimized remap\n            UpdateControls(m_character, m_plan, m_remapping, m_description);\n\n            // Fires the event\n            AttributeChanged?.ThreadSafeInvoke(this, new AttributeChangedEventArgs(m_remapping));\n        }\n\n        /// <summary>\n        /// Reset to remapping with current attributes.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void buttonCurrent_Click(object sender, EventArgs e)\n        {\n            // Make unoptimized remap\n            RemappingResult zeroRemapping = new RemappingResult(m_remapping, m_remapping.BaseScratchpad.Clone());\n            zeroRemapping.Update();\n\n            // Update the controls\n            UpdateControls(m_character, m_plan, zeroRemapping, m_description);\n\n            // Fires the event\n            AttributeChanged?.ThreadSafeInvoke(this, new AttributeChangedEventArgs(zeroRemapping));\n        }\n\n        /// <summary>\n        /// One of +/- buttons was pressed.\n        /// Check is it possible to change requested attribute and do it if we can.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void attributeButton_Click(object sender, EventArgs e)\n        {\n            AttributeButtonControl button = sender as AttributeButtonControl;\n            if (button?.AttributeBar == null)\n                return;\n\n            // Adjust delta\n            long deltaValue = button.ValueChange;\n            if (pbUnassigned.Value < deltaValue)\n                deltaValue = pbUnassigned.Value;\n\n            if (deltaValue < 0 && button.AttributeBar.Value <= button.AttributeBar.BaseValue)\n                return;\n\n            if (button.AttributeBar.Value + deltaValue < button.AttributeBar.BaseValue)\n                deltaValue = Math.Max(button.AttributeBar.Value - button.AttributeBar.BaseValue, deltaValue);\n\n            if (button.AttributeBar.Value + deltaValue > button.AttributeBar.MaxPoints)\n                deltaValue = button.AttributeBar.MaxPoints - button.AttributeBar.Value;\n\n            if (deltaValue == 0)\n                return;\n\n            button.AttributeBar.Value += deltaValue;\n            pbUnassigned.Value -= deltaValue;\n            Recalculate();\n        }\n\n        /// <summary>\n        /// Updates the controls with the values from the current remapping point.\n        /// </summary>\n        /// <param name=\"point\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">point</exception>\n        public void UpdateValuesFrom(RemappingPoint point)\n        {\n            point.ThrowIfNull(nameof(point));\n\n            // Creates a scratchpad with the base values from the provided point.\n            CharacterScratchpad scratchpad = new CharacterScratchpad(m_character.After(m_plan.ChosenImplantSet));\n            for (int i = 0; i < 5; i++)\n            {\n                scratchpad[(EveAttribute)i].Base = point[(EveAttribute)i];\n            }\n\n            RemappingResult remapping = new RemappingResult(m_remapping, scratchpad);\n            remapping.Update();\n\n            // Update the controls\n            UpdateControls(m_character, m_plan, remapping, m_description);\n\n            // Fires the event\n            AttributeChanged?.ThreadSafeInvoke(this, new AttributeChangedEventArgs(remapping));\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/AttributesOptimizerControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"pictureBox5.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAYAAABWk2cPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAFwElEQVRIS+2We1CUZRTGseliO6NSjYip\n        gxdglItMukSMgOJwURYGMVFREShIAS8IViMsuYoIrJXt7oCKiMZwmcyAAJEpxALBERASGg1khB1FbjIh\n        KDHq+Ov9dvwvMC81/dPz37ffu+9zznPOec5n9D/+c4yMjHDv3hAjI8MMDw/R3dPOzVutdHV1iOd7PD72\n        z0Ai6NBfJy3tIDU1pdy/30OKWkl0zIfsVm1n9Rof+vp6DcR37w6KoEaePwDpgrq6StKPqnFxscLJeT5X\n        W37mbEU+fiuX8ZVGhctiZ748uJ8HD/qoOPc99XXn6e+/zeDgoAju/rOTnyo4hucyW+wWmnHgi1gePhzg\n        8uWzbAjy53x1McdPpHK6JIfai8XodCpCgr1EcHIOH1EzMNAtsu8R2Q8/PXHNhVK8fBYQEbmGKCFjbNx2\n        Hj16SHJSPGEfBdLRWYtqXxR52SlYWszB0dGGhD0fkbgvnIyMeNQHdlFdfQa9vl1IfvfvifX6NuT203F1\n        s6Pq/HcUlRwj7rMITn6rwXWpPfuSdvBpXBCbNi3DTZzZuMGT69d/Fhnncbk+DwnRMZEiEHMu1VfS2dkp\n        GvAJjTYw8DtBwauwW2AmSLQkq3cStsmP4pKj+K5wwX25A6lHdiF3mM4iZ0usbc3I/XY3p8u1aHQx9Pc1\n        C4IBcT6L0DBvEhK2UV9/gZ6enrEbrKX1Nya98RoB6z1EHT8VUq5Ao1WyP2UbltYmvGM/G093R2wtzVlg\n        MR+rqVYsd1jKe/MWoktJIC83DW3afirOFpH7zVG8fO049d1xrl69yp07d0YnvXXrFoHBq3F2mUfIh77s\n        SYhEdyQeT2877OVzmWVswbsmbgQtjMHfPJrAuSp8p+5CMeVjQh2URK2MpTgnn9w8DfGqCHbvCUWXmkRF\n        xVmDzKNmK0VTUlKExbypGBu/xJw5Jsy1NmWh2QJcTFfhOz0Kf7M41s9OwHfGxyimR+NhGoG7aTgOsvUs\n        fSOczU5KklTRHNBGicAVbA5fy4/lP9LS0sLQ0NBfSaVOa21tJTFRhYOzBVMsxjHZWIbtq164mYSzZHIw\n        Tm8GMH+CNzYTvbCQLcHsVUcsX3dDbrwKuSwAR9lGtq6OJD0znpBQBVa2M8j6+hiNjY3cvn37r6RS+t3d\n        3cIU6sjMyCB5bxI71sRiJ1uO2UtO2ExYxuzXXJgyzlaQLWKG+G3muMXMHb8Uy/EuLDIOwHnSOqxMbNm5\n        cyPrgjx4R27Ficxj1NbW0tvbO3pdpWz1ej0XL16koKCAg8qjRCxRIX/blUlGFkwwmsVbRjaYGNlhN8ED\n        h8meOJi6orB+n/X2m9nhF8diuTMy2cvYzDcnPl5Jdna26OJ6YRh9o5NKkLSXCt/Y+Auni8rQ7c5EGfA5\n        W3yU+NlvYOYr1riaKwjx2ERsSByaWDEycTq2bYwkURlLdVUxn+z6QGQbjVarpaioiCtXrginGhibVIJk\n        YVINWlpa+amikuNp2SRu0bEnWMu+mL0o3N3w9/Hhbv8gvfpuRoYe0NlxXRhFA5ebqsTYKVCr1eTk5IhF\n        UU3nzZtPZ4uSaUsd3d7ezoWaC5zKzSfjcCaH1ceFS21h2szX+aEs3+BCzVfKBdk5mpobcHN3IiwslPT0\n        dMrLy2m7dm3sOR0L0taQ5G5ubqayspLCwkJys04wbbYMSysT1gV6C4uUs2VrEGvX+uDvvxKNRkN+fr5Y\n        Er/QJxrouVaeJE1/fz83btygqamJM2dOsz1qHYEhCt6eNhG/Fd4oRT2Tk5NJTU3l5MmTQtYabj6trE+C\n        dIHUhb/+2kxtXTVVVedISU401O/QoUOGGpaWlhrGrqOjw7BbH//1xfDHH8OGeZbGoLCwgKysLPLy8igr\n        KzOQXRM1lN6P6kAvAulCaZ4bGhoMMl66dIm2tjbDRpHevdBny1iQOluSTiLp6uoySC4Zy3N9pjwrJJJ/\n        Jav/8fwwMvoTPuRWF+9N6rcAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"pictureBox4.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAYAAABWk2cPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAFqElEQVRIS+2WeUxUVxjFHwgYjRXQMu7F\n        IhIdCqaCC1UGSwAVSEVRiQsyFlnEuKFkoqBoHR2oAg5k3AqiUkNwqRqJNVCLRC1BU6FCJCoyGBUQNKIg\n        ErT+et+oSVOxRdsm/aMnucnLy3333HPO93150v/4T6CtrZX29jbaO9pobm6gsqSKn05d4XJhEcafz9JY\n        c5WnrS282v7+aG9/Sn39HQoKvudM0UmeP2+hsOA7tJviyMxLZ8nS2RgifTBEzeToVg0VPx7jUdO99ye+\n        fr2S48cPsGHjMoJnTeGXK+d49NjI4ph56PXpRKgXERvox8GVYaSEz2BX7EJydGu4kLuThtqbwpX2dyM3\n        GiuIjJqG72Q3UrfHI+PZsybC1MFsSdJSVl7KMW0UZzQz0YcHoJnuRfBYF5b6qzictoHzeQbqbxu7Tnzr\n        9jXmzFcRMteH2LhwZs6eypO2avbl6FDY9eN0QT4lh7TkLxxF7LgBRLkPZKnnMD6370ugg4L540aiT4im\n        KNdAU2PjXxM3NtYxL9SPkUoF32TqOHR0O3Pm+qKJD8XNZTizgqazJ3kZ6/wdCB5qgWsPicSxA9g4cRCB\n        AyxJ8HEmauIwPBQ90GrCKSu5yMOHD+noeNY5sXyj7Xodg4f0IjVtjXiOZ0awF19vXUHMkmAc7IeQYdDh\n        LS40uruEX39zYpTWzBhohf9AC9QjbVjgbMfsEdZM6CXhYd+bvAPHqampobW1tXPShoZ63NyVuI9xYPce\n        LaHqADZpl5KWvhaVlzNOTkPwGO+GtSQxTCxfG4mQQZa42lqi6mtOoLiEl62ETx8Jb4UZE91HkLU3ldKS\n        SzQKmzs6Ot4klm0IWziLsR7DhcX+rE2IYNfuRMLCA1G6DMZKqBPbUA6yxdPVgdlT/EiO05CTqmOmahRK\n        oW6usg/edt3wG+1IqiEZw45EsvdnU11d3bla+WVBwSkcR/THpo8Z9vbWOA5XMEysT90+Fi44MtxJQcSS\n        6WzYrBEO6NGnpbAsehFLxIqNiSLQ25No9SwyduhYn7iYL4I+48jRfZSVlXH//v03Sdva2rh58yar45Yx\n        ZtwIk7ruPSXMLSQmebsSMM1D2OyCj58bK1fNI3FjBEHTPZi3YApp2xPEd1FMVLmjTVpNZpYWrTYGJ+WH\n        IqK1nDt3jrq6ujctll80NDRw6dIl9u7NZMuWr4iLW46vrwpLK4lxE5xQL5yK1yQXFqinisz9CQicgL9Y\n        DsKNCSqlIFXygbUZQTM8Sd+xho9EG2UY9BQVFXHnzp3O26elpYXa2lpKSko4ceIE+/fvx2DIIDLyS6ys\n        umFhKWFmLtGzlxl2iu7YO/TBxtYcpbMCL29n5oZORjXJld42Fij6WbM2XkNWVtbblb7G48ePTbe6evWq\n        ibywsJDc3FzWr08genGkUG2JQtETH9/RREVPQ5++jgM5KcRp1IIkjOvVxWzaHINmzSpSUlI4cuQI5eXl\n        PHjwoHPC15DzbW5uNtkt99nly5c5ffo0OTk55HybibffKDw8nTAaq3jxot00Jp8/b+WKPJ8f1YrsP0Gn\n        20x2djbFxcXcunWLJ0+e/Dnp7yFvlvvsxo0bXLhw4aXyvExs7cxJSo4XpL+KQ8soLc3nbl2NUBjDnDkh\n        ZGRkkJ+fT1VVlUnAq+O6DjkL2fa7d++ayv9s8Q+MGj0U276SmM0+orjcCF0QyPIVajHFgky2ypHIRSm7\n        9dYsuwLZdvmQixdLSUpax6LIIJHteEJCgkWlrxIVv5n09HQOHjxostVoNL59BL4LZLtfVniRUHJeqNrK\n        tm3b2LlzpynzkydPmgpQ7vn3svVtkCuxsrLSlG9eXh6HDx8W06xAOHCRa9eumdpDjuNv2fpHyDbX19dT\n        UVFhyk1uCVnZvXv3TGTv/NfQVchZNTU1mTKW5+o/kl1XINv3r6n6H+8HSfoN/Zo1LZbsTc0AAAAASUVO\n        RK5CYII=\n</value>\n  </data>\n  <data name=\"pictureBox3.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAYAAABWk2cPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAF0UlEQVRIS+2WeUxUVxjFR41rXVAjoGIR\n        UaOjYlSUEnFY4gZYiQ5CKIsSBRfKKmIQRZRFYNQRCLggYFAkbSoiWDWV4gLYWOsyajCKQg0oChgQx4EQ\n        9df7JrUxcanSNukfnuRm3pvMe+d+5zvnuyP7jP8FdDotujYtHe1tPNM28/hxDY8eVdHYWE97ezt//uzf\n        QWtrM5cuXSRzfxrPnv0uiO6yZWsEB3KT8V/pSmradl68eEFra4tYrXR0dHR+A/X19zlz5jjJ2yNRKCyJ\n        igrm5cs2vjuyly1x69iVGoWHh7P4TiuWTlRexf37t3jypFFs7tmnE2u1rSQlh+K8YDqeXo7crf6FV6/a\n        2ZeZROTGICrvlHGs6CA63S0e1P3KodwoHBwm4Og0k6tXTtPS0kBTU+PHy97e0UZ6RjRePvOI37YWv5Xf\n        kJeXQvX9CsbJzVi12pO871NIUgXg77eYrl274Os7n+jopeQdimOHKpQ9e7dx8eJp0e8G2traPkzc0dFO\n        SWkxI0cNFBKGcPXaKTZvCRREStw9ZjPK3BBffxdRvT12tuMYaTqQnKwYIWsZpSUZ1Nz9GQkzbSxZF+7J\n        9etXBXHjh/us0Vxm6jRz3D3ncOr0QWEUJUHBHqhTIhlhaiDuXQgMccPIqAfWVuNISgymojxfVOnPmdJs\n        6mo0PGl5RIJQKGytF4nJ67lz5w5Pnz59P2nCtmgMxQs3Ra8iNj4UXz8XsrLj8V7qiIkgVdhaMP2rsdIL\n        kMtN2Bjlg9mowSjsJws5j5CTqxYuVwmFLrB2vS8+S+24cKGcurq698t8KC8H+aQRLPjahpBQb3bsCicm\n        bg0zrMZgZNxXTzZ8xACWuNmzOSaAouKD5B7M4VBeOvOcZpCWkYzmehn7s5JZE7BEfMaiUm0VMl+nubn5\n        bVJJ97q6Wr4N9KdPPxnGw/pgPmYIZuaDkE8wwdpGLno6BJtZ44XRNnG08IAg3IdKHcMKf6VwrrXo9Tw2\n        bPRDnRqOamc4rm4KtopMnz9/ngcPHrzbzQ0NDZSVnWeuo4JJk00ZZtKPLwZ0RT5xKItcFdjPnoKtg4X+\n        el2kF27uNoLMQsi8nD0ZMdjaTsLB3oL4uNVkZ2/B1l6Os/NsTpw4wb1793j+/PnbpNJEqaqq4viPx1Gr\n        VayPDMN1yUJ69eolHD1YxGiOILFi3lxrAtZ4olzkJLLsjKXVdOQWk3FycWHSlKkiWnIyUhMZPc6QhUsc\n        KCws5Pbt22i12ndLLFm8srKSkpIS8vPzyczMFBJJBjOgW/cu9O3Zm2GGxhgYDsLYbDimE40ZO92AWQtM\n        cXQfi52LMRb2xphbmOIwy5ntm1P/In3vpJJc1tTUpJfjypUrnD17lmPHjpGYtI3QkAgUdrMYOkaGjVMP\n        XHwMWLy8P56r+uHq25v5ym4sDzJgWVBvnPxHEi8GSHpaOqdOnqK6uvrd8r6GVLG0K6nq2tpabt68qSc/\n        nJ+HOsebZcEDcXbvjm/gAEI2GREcOZSAcCO8/foRumEITotlLIuwIk7ty4EDOVRUVPDw4cOPH4tS5ZLd\n        a2pqxGlzifwCNbEp01DM7YKFpYxVQYasCRvGXKfu+Kzoj9KzB3LLnoRtncOOtHVC2gJ9u1paWj6O8E1I\n        Jqivr+fib2fJ/iEIz0BzBpvIMB0tw2y8GBbTumE9uzdzlF8SEe9MojpIDJY9nDt3Tq+WTqf7dFIJ0oO1\n        ddUU/ZRKTNoivNfa4aCUo1hoTESiLREJDsQke4hehrF7TxrFxcXcuHFDHHdPOkf4GlKsKm9dI78wlpLy\n        XNHjFWxWKYlVeRGfHMhOdSJZWfspKiri8uXL+qHwQQN9DKQeSzKfKz/B4SO7Sc1IYOeuRDECd5GTk82R\n        ggJKS0vRaK7pZ26nDvR3QapWilR5ebm+oqNHj3Ly5En9vUaj0ZtOcv4/rvBNSJF67WjJmVKkpEkmSSll\n        XDLdB8/QzuJ1lqUoSEu6/tt/CZ/x30Mm+wOm1ms8bRhywAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"pictureBox2.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAYAAABWk2cPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAGX0lEQVRIS+2Ve0xVVxaH7WQincZnSVGG\n        Gl6WCg4a5CUDXIVieV1SkF4NBQRTQKCFAiMaEETigwuiIEaFCwKDIkHUARXmxiqIiERQHA3hIe8I4gMz\n        gILEtnxzzolNxmo7wzj9Y5L5JTvn5py797d/a62914z/65c0Ofkd4xOT0hB/v3z939XY0wl6+h9z43Yv\n        TX/r4eKVFo6fvkpZRQM19a203h3kxeSLt4c/Fxbpu/eY2oYOjgmApL2nCNmsQhG8H8+NaTgqEnFdn4RP\n        cCrpOedovdPD+LNn/zn40fCY4KCNPVkVBEQcwt4jFmMrP1Z5xhMQdQif8AzcA9IwXR2G3jJPigor6bzV\n        Rd/dXkZG/y6EfHJ68JHRcSov3SZ0Sx727puxdAoVXG3DO0hJdHIRcSknCE3IIyyxEJk8gqTkAr4f+54q\n        9VHyizO5e7eNJ0+GeTYd1y0dA0Qk/BmLTyOxdY/CSRGLYtNu0vIusDdPTWhcJrF7CnH3iSHn4DEqT55B\n        lbGXpO3B2NmZEhbhS0/3bYYeCK5HRnjx4t/Itaq4mj+6RrNsVShO/kq8AhLx9oshNrWMuNTT+IVsxztg\n        J4H+X3E8R4nM3hqPzxwoKlJSfCKVq7XHKC3JouxMEW2tNwTXT3453P0Dj/kiPE3Iny8rPQRYeBbBURlC\n        XjMJij+B55ep2Mvj8JSHEfmlFzLZUqKj/ITFzzM02ETjtRNMTf3A1A9TwjdLqioLaG9vZXh4+Ocdq6tv\n        YePkj+7yddh6JeLjtxUPz0hcAjORrd/DYqGYDJesxdHWBl3dd7EwNyI3J5HzlSoiItbR2XZRgE7S03uH\n        hMQQYrcGolaX09nZydjY2JuhRaWX+HiFGzqm3tjKYzGTbcTcOQbrT6PR1DJnxm8XsnC+Htqa88QFWLRo\n        Ln8w1WaR7lwiBcfXGs5RUqri0OHdQkHdwXudHXvTt3DxoprBwUGeP3/+Ovh4aTUrZAoWfLQGYxt/TJ2i\n        WCqLwMLMGa1ZcyTQ3PdmssbJCm+FI2HhX7AvI5kL6vPk5irx8LLnRvNVzpTnUlKSTVCInBzVDjIylLS1\n        tTE6OvoqVIx5bd1t1nh+zTwtU+b83gpNY1d09N0xXKDPSmt9zK30MFmqQ9LOYMFRNnlHsyksymW3MgE7\n        ++U4O1sTFx9EivIb9mfECM9oFOsdOHxkP9evX+fhw4evQ9vauonarmKxiTNztcyYpWvLTA0jDDX1cXWx\n        Ru5lxyoHU5xdLfH1d2FDgCv2MmPsVpmgTI2hIH8Py5Z/yFeRClR5yVJejUy02LdPSXV1Nffu9b8e4r7+\n        QQpL1ASG70fm9jVLbAJwkQfzsb4BBvrv4+C0QjgetlhZf8TWbYHECcNPAG8IcMPRyQJzy8XY2BpjZmFA\n        wEY5FWcPYGg0n9DQEKGg1ML57WZ8fPxV6MjIKNcab5F6oJhN0Zn4bNrF5tjdxG9NRFv7A+ZpagghNkBX\n        bz4LdeagpT0boyUL0TOYj4Hh+3iulbFWsRptndlChIRC052H5UoTCgsLJGh3dxcTExOvQkXrAwODVF+u\n        F3JVRtbhXHJyVKhUKg4fyuKztW5ovDtTnMSs2e9gITh2c1/Basel+Pg64Co3J/IbBXW1ZWzbFoSe/gfE\n        xcVK82tqal6G9ydQUeJ56u/vp7m5mdraWikX4gRxpydPnqSg4ChBwd6scTHDxs5E+PYXHj3q4unTJ3R0\n        NFFQmEp/XzPqC4VE/2kT6enplJaWcvPmTeF/j958SYgvRfCDBw8keF9fn/Ts6uqSJlZVVXHqVDFp6XHC\n        2dUQzmA5oqamvpOeoqrU5zAy1pdc5uXlSRvv6en5101ADLWYdDEH4hAniDvt6Ojg8uXLHDmyS6jcJdgK\n        41L1aTIPbBci8LkQ3iDc5J8QFhbKwYMHOXv2LC0tLdId/HLp6UmMgtg5RNc1NZf4XPEJ2h9qoLXgHX73\n        3m/YsMGX4JCN7EjeIQHLyspoampiaGho+j32pxLB4g1TUXGcU2W57NyVQHzcFlJSUoTbJ4P8/HzJYWNj\n        o1A896bXW39OomMx5w0N9Xz77V/Jzj4iORNh5eXlXLlyRQrp/fv3hQJ7+vbAHyUu1tvbS319PZWVldKo\n        q6uTYAMDA1Ia3njBv41+zK9Y3e3t7VL7EjvJrwL7Z4lgMV9i9xCd/6qw/0HNmPEP75bsd88+dSIAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n  <data name=\"pictureBox1.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAYAAABWk2cPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAFrklEQVRIS+2WeUxUZxTFoUbbklaNpENU\n        CLhAEBeqVnHBAVqwiBpAFFdAOrKoVWQ1UiJVggJmECFUIaiERQIIbkAMW4sKpiqK0ojsJVEUhCAyoKHq\n        r9970X/UarX+0aQ9yWQm8+57595zz73f0/of/woMDj5mYEDD4OAA/f293LnTyJ32Blpa69Bo+nge9mHQ\n        0XGbwqITHDuWSkvLFe7evUVwiA9BwV6Ehvmi8l7F/fv36B/oo7f3AY8fP37/BHp67lNZWUbwdhXjJ4zE\n        YbGSPk0DqWlqVq9xJD3jAAu/tSElJZGnTx/xS8Vpzhbn09fby8OHD4Uig+9GrtH0ErHHjxlfjWbqtLHk\n        5SWICtopKs4gImIHT550UVp2ips3K+nsrOXIYTWbNrlgZ2tJYuJeurvvieo7RDsG/h6xRvOQ3RHeTDHX\n        w9vHGftFFuyK8BfVDLDVz5uCgmNIyMr+iabGEqGAHZ6qFRyICyQxIZTDKeGoxe+LVUVcv1BHX99b+j0w\n        0E/msWSMJoxAtcGZ0tI0oqID2B6qYn/8diHnXLJzE1DHBrBr13q2bVtBdmYMjx610txUQlP9KTmhoICt\n        LJ67gOysXH6urpDlfk7xKqqrLwpCXdZ5LOLU6WS2+K3FP8CN02cSmW1hjJe3C4mHwjAx0cXMREFYmA9X\n        fs0R8kaIHkfK5BKKj5TgvswXh1AX/NOCaWhuEA7XvJ54f1wUOjpaoi8/4rbeCU8vRzIy9wny1RibKpgz\n        1xSl1VQ+FjEiHEtLEyYYj8LUTJ+c3FguXykgLS6FzIx8vBP9Gb3GEMfw5eSXn6Sjo+P1zi4uLmSWhQnL\n        XW3xUC0lOiaAGHUgcyxNMRqvKxN9odDB3cNe9HcdB+IjOJqaTF5uJiqR4OYN7pQVV+IW48uEjZMw9DVC\n        GWjNnrQYGhoaXt/ftrbfCdsZgq5iKHqjdTCepMf4iUJKUcksIa+p2RimzxwnyELJzztM/okMDiWpCQj0\n        xMFhDiuXOqHy38w0v9mM8RiLkbsRRquN2BoXQHV1tXD0/VdJu7q6OHeuAnsHJRNN9GTZtLW1MTAcietq\n        G6xszLGxMxeOnsWOUE82eC3Bzn46Xr6OJBwIw9vDnZmLLZniNwNDNyMMXA3RtR7F+vDvxHPPiS1259X5\n        lZrd3NxMbm42MTF7hEN3EhLiz7Bhw9AXxGvW2gryr1FaT2PLtpU4LlOy1GkBSpGM8UQFNpZWGNubM8Jl\n        FIae41G46qFvZYjv7s1iEkppa2sTZnv0arXd3d1i6G/KQVlZWWLjpLBvXxTjxukzdNgQhgzV4pNPtfl8\n        +BBG6w9nrMFnjFJ8xMzZBthZz2GRqwuTVbMZvliBnp0+S4Jc2Jmw682k0p+S9k1NTVy9elWWpaCggKSk\n        Q0RHR2Fh8aV0k3CyCYuWWBAYtI4jR6NISolky9aVhO/YxokzJ9kSHoxT6Ep89m4iPjmeiooKbt++/de7\n        WbogDbRELgXeunWLCxcukJ+fT3x8nHj4KhYozYS81jx79kR8/pDns6urjYa6i1yqOs/CefMJDA0hNjaW\n        7JxsuYDOzs7XE74MKYFescQl8hs3blBWVsbZs0UEB3uib6BDZVWJTPrbzXIhXw119dexsp6Hva2tUCaa\n        9PR0Wa3W1ta3r8SXIS1vqd+S0c6fP89BMSq6Cm3MJitwclYKuc1wXmaF+/oVbPrem6ioKFJTUykvL6ex\n        sZEHDx68+8nzApLsLS0totoCfhDn6TKX+Sy0/4agkB34bPQhMjJStCCejIwMmbC+vp6enp73J3wBKeu6\n        ujpxvJVwPC9H9E2NWq3m4MGDMplkvKqqKtmMH4RQguRwaZdeu3aNwsJCcnJyyDt+nJKSYi5fviRX197e\n        /n6H+ZvQ398vXl3uyhXX1NRQW1sryy4lI5H9o9eWN0EylyS1ZDDpW0rk+aX/8Z+CltafwM1nF9CNLR0A\n        AAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"pictureBox6.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAACFBJREFUWEfV\n        lgdUVGcWx00Cw4AC0gekiBSlCESxoEh1BAEFpc5AGAJMpKlYQLAGC4ioLCpZEhRFpQRURLEhkBVEQF1k\n        Q7AAbkTUjYYSGy7vuy/uu+/wPIkbWN3snj37P+eeb+bNe+/+bvnuN6P+LyXD48lx9hGjocv/PaEjWb6C\n        goyCoiJnsmOUx6L98tp/HIiNEl88WklJbqyGprzGON3R44yMlQwtLJWMJlspm9hMwVVxvJm5gsBgPF9N\n        W1tWUUUFYX8XCD7MOUaniobmFqqWM2dpzXT30HXxDzLwCpeiGS6Kih2/UBqFn/XcQiSCWZ4LVCfPmo2Q\n        DIgqggy98t3FOcdIxuiZTlSf4uSi7xYcahK4fJV4+/6SNQfKrhRV13Xf+O4mud91j3R0P6QqW27e3/R1\n        db3zmsw/WkiSNyKMmpW9g7ymrt57QbxxztQWnQvsPLyM/eLi04oqrtddroXjZ87RxeXlrFVeuAjfXKqj\n        axuv0S3NraT91gPS0/OYNP+1u88v/UipqWhlotZ0oTtfXWfcO0NwzkePm2CkOW2um610fUpVw9X+guIT\n        dPHJUsaO01UXz9HVl5vo69daoOteJ+nr/YF6+PgRdev7B1T15ftwrrUfbtz7EbaVnm9ACA1bV6GciqYm\n        Bjfk5rfFNRw2m9rkWfZY17zT1V2HDhbA0aNH6bLSAvhT1Vlovt4IZfXt9NWOR9Dc/ZSgPeh7PljXNQAn\n        br+i878bfI1rVXsfvbn4XCNmUGmCpRX205Cr3xa7zZibMHpMfcCWnKL83INwKCcPDuflw9nTpXC1sY7+\n        pqGZvtvZDn19vaT32Quq/W/9g7g+e/6MtD7s/zsCoFV2vmCBsC+07OZ78saqa2CQQ+7+WVzjYcdjp6cV\n        VrRlZeyC3H05LMCZipPQeKUO7nd1kJ4fH7LOBl4NUC9evqA6Hz8dRIec07QLd19X3uoh+D2poKoe34fb\n        9F8C8JRU1ZSMrKz13EMkJ0pOwM7UNEAIBKisKIPWlka4fasN7t77nmDk3T0/DWL6Wx4+pzDltR1P6Lya\n        Wz83/LkFYr6sZTNxpKHzqdHi6KVj9CdOGrEZOQBmuHyMAAfzCyBh3eckc/M6yNu7B8rLi6HpyiX625ar\n        0H7nNvT2PiYYfdudDups8yO6oukJXXCmgT5f1wTRy7LoxMLrr0tuPP257d5PEJB26JiysZXNiH3A7QAO\n        YPfWff3xy1dC+tqlbCYKS4ppLENVVQ1dU1cPh/YfhtTNWyExaR00XKmHitpr9LrPU2Fl8npyrqIcHnW1\n        km/rT8HZsmNw9MKVbpwLWOJhy4AASIhjVU8oCl69Jbtj5bKlsDr6U5KSGA8Z2zPg64Ij7I5IPXyG3pqe\n        CfmFxfTHU2cQv8BQmOslBok0jmxMSYWi4yfpytomKD59lt6QvBZu/OUOpS8UhcipCgTDloHdBQyEgrah\n        obb9Am+PZaknEeCzYDEVKwkmyQmr3/REBmM7sw9AelENnb+/HKbPtCMb0nPp0IBVdH5RKV1UeozetecL\n        YjfbmYh9Q+B8RTUYe0dGy2vq6aOPIZe/FjcF5VS1tNRtHJws/ZYkRgYH94X7LSRoCLIkLIIsWxJDYiLD\n        yeVLtaSr7xXJLayip89xJrvzj9NJ6xjA3ZmQtCaJXDxVDJ9JJMTZbhq1JjEJpnoGxuMZMSwAipsFOIZ1\n        nHz9p0k35i5a4ErNc3Ek3u7OxGeBO5WWug2iIyNJWso2aO+6T61N3gHGRsbEzMiMuLk6kbjoKJKzL4t0\n        3jgPh7PTIDw8BlL/sH9A28FnsYKWvgECDDsVuSxgs2DX4iHkJpbWzJ3jQFzs7ImppTVTigQQ+fuSzF1Z\n        sGNnFkhiN9Gz7d0hfukyYm0xicrN+5JtytamSpAGxwJG/9XurSQsITmdK8GI84CDwFJg5+Jx6xMe244Q\n        tpPNqcBFPiRr+3aQiEKIr5cXFSSJAWlEOKxYlcjaga/2w/HCQji0Nw02rIoiDZUlsGNtLFws2TOA/xdG\n        zAAn9lzAUjDDQ8fBe7FzRHKRv89CytHWltjbWFAL58+jvD3ciaGJKcHr2BtooUFBJC5mKcHO37pKCjnb\n        VsPpgmyI/DS4W9/aPgTnDAIMuRleLABzI/4ZwYPJXhyXIRWL2B7AfhA621HWpoaU2aRJZJ6jkEQEh7IA\n        CIP3RIm8SVyoP0EIBDh1uqgNg8GgRpyGnDgAnrKaOp5kM7xFK8IlkidhQeKX6CQsQET5eboRM0sbglnx\n        EgrfOPf0dGUNIbI2LYf4cBFxDo07gMG8U/o54c1ofDWBtrfv4sTgIPFNNIlY/GRJeMRA5CciYqijTmmp\n        j6UMDXSpKRZmbHkwQ2i4e1ZKJWRLQhxYzfNNxGP+naLnhKQIoKKlo7vQ03Ovi4NTntBF+IXvIt8LCBLx\n        SehLiwnaLxRHyw+iqSqPGUQYUwMBhSD+Hs5sCdLXrwAd65mzRxzDwwkheHJy/MnmlgETdI09zU0sApwd\n        HDZ4uLlle7k5Vk81n9BmIFD9QUVRoe9tEGMmK95z7Ul8VFifks54Iwxm6LXvL56sLF9WljmqlJV1TUxM\n        5thYWwXOsJ2WYjbRNN/UQKfcTF/Qpm85dZeOlZ1Y19pOpDvVccn42fPTTVx9srVMrIV4yL1X+t+WjIyM\n        HAMwmjG+vIKCkorKWH2BhmCGhob6PC1NdamhvkEcb4yyCuuISTXWG/c8+y+I6fz3ar639SEjBkCWWT5C\n        EEYKzMpnTJ75rMbj8TT5fL4Su3MY4w41zvD7v+0cxTwrM/TxV0IgZvkAjckMj734v9LvinAkfcCISbUM\n        rhglZoMRW45fGvPzh0OPvKdGjfoHkWkSLvfHmHYAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"pictureBox7.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAABrZJREFUWEft\n        ln1Uk2Ufx2VvIDAR2QYbbLCdbbwMGDJiOgfi5M3VeBjy2s5QGBEvqRkpJaQYnQ7WTh0N42iRqRkHelD0\n        eXjQJxVJJRFCexkdQ1PMllmnmamrVufbfd9nWJ1T2Yiev57vOb9z7r1c1+9z/a7v77ruGf/XVOTlzZj5\n        W+H++e8TmYTOZ4uYUVwlIylUS0UCX02PJj6LA+U0nr/gbwOhBfgEkolDF8cVWFrq2geG3jpru/yR/eIn\n        F786eOCfZ42Pm1/nZ8WX0IUBEi8/Fts9bBrEoDFoc3y5LFWotuiFur3P2fa6HA4Hrn5+EZfOvIWzh/dj\n        qGc3jux6Gf/dsd2VU2XcyYyYI5+eSkwmVwvTKtoa++ACjh/txXsjA/jyg+P47O1ejB/eh3ff2IneFzeh\n        fWMdrGtrYK7K7yLHkePdM3kusoxeQb5cZmywSlC9sOnr27dAxr97OjExPoqbVz+k4vr5EVwePITRrh3o\n        fHY9rA9XYtPKCpdwsaJkyhCUq4k9pxHG8rs3qmTtobazjm8cGLt0DsfeOQKny4Hvv/8aLtc3uH3rKq5f\n        GMGnQ73of3UrtjasRL25ALnlhn4mMX5KfiANRxOwRfS4YNUsc+KqgQmb8/K1Kzj94SjGr4xRAJMin286\n        JtwArRTAuuXF2FC+zOkTE6wiO8M97Z/TZOlJN3trwtMT1hXusp+/gsGLY3j36gQ6ju6Hw/kzwA+um/j2\n        1hU4xocx2r0D7U+uReMDy1FnzEOwLqrccwD36hnSIIVPutSos1b1bRjqwL6RY7C7nDhhO42Gl6z4iKgG\n        qR9/cOK723YKYOxQ168Awoxz6ymAP+0D4o8UgChAwkoUaH0L42vMbetPPXDwBTx/YA8OnDuNQefHmFeu\n        R5+tl0jvgNNpx83rl2A/cwTnT/wL2xtXY0VRDkyLdAgvuKeFnMujlrwDkBSW5l+qqn9y30u2Z4a6UfLY\n        Crx6sg8PtjYgq86E7tFuCoBMPj7Qgz3PbUDzijJsXlMDU3YaBSA3adrpsiCFRwCkAcnj1jtZmD5r1QLr\n        fdWmCVVmKiyvNSCxTIe4RzKh2V+LZ17biM++GITt6F6sNOcjSzMPuYsWIlWViAgeD5oIMTJMWcfJ09Oj\n        TqA6gNg3Yv8LhI36nRnLlsJQa6YATNseQergY0jaXIzQfygxcKaLSs7390GsTIpYqZQCCAkIQKoiGjlF\n        WQhKlZWSc7qnv7smAbxTIgy8+vT21s5dMNdWw3TqWVjOt0Hfuxqatvuhe1iPPX2tKFqiw7z4WFTkG2Ey\n        6GEgqlBTko/irHRUGnPgrxIapwRAnP1p7Irkpv+cOekiIaKXaqF5vBDiajUF0fpGC04SPqgsNKA0Nwsd\n        LY14s60F3Zub8UR1GfIWp1EQMxUhaZ5vAXGEMmO4Kp/8uJqmjrYbq7Y8BZ+QQDzYYsG5G8cwPNGD1vZm\n        jA33wkRUgIyOlgYMdW5De/MalBnSkbkoGTpNgpMl5Sg9NiEZjPDZcpZGlK0ryukvfrSKAni6ez1sX76J\n        gyPbsWlrI4ZPdMOSmw39gmRsW7cKu5vrUV9WiLw0NdIXJCIpRnaKzvPz7B3hzj1ADGRGcpSz74upTF5j\n        HBHFR2JRxRL097+CnoNbYSnMRaIiEqqoSBRm6mBdbUFtkQG5qWrqO4VSaveODdFSF5JHmjyMiCDbkTWX\n        rxWY1S2aEh3I2NK5EW8f3w378BGMEVfx+z27sG/L02ioKKa2QquMRTTRgrxUmZX0kkernxR1HxAAZFB3\n        wvzw9LzSvIniR5ehqaEaKyqLkD1vLlKU0Ugh2o2MJEUMNMo4RMvEkItF15hyjopchHtKz3VnK9wQvAxF\n        ZdnyEpfFlIOHCIA6Ux7WV5hQlaOHlgDQEweRMlJOAQSoxXV/+YXklyJBWGKOXJeTPVJtXupqXGmBxahH\n        QcZC5OtSiNAiS52A5DiiElKZncYlSu9J691NZDXoc/y48iXzrQuT46+RENY1tfj4aDcOb9tEtF0mYcgo\n        yCTir2SJ8j7arL9Q+t8Tzd+brc3OKFdEivsSoiUXDClqVy1x692bOt8ZJRHdCA3lT0jlEafEsZKmaV39\n        LxUuk6rEEcI6uUTYFS0KsynCwy6EhXBsfF7QCb4g+HVROP8pjoBjmJLz7yY6nc7wZ/tzg+YEKsVhglJJ\n        GL9JIRNvlgj51nBBcD0nlFPKDmRrWX7eIjqDPv0Ak2IyGWx/P19R0OwApYDHTeNzg7Tks6/fTBGDyQj0\n        8vKaHuf/kWg0GoNBrJLFZLLJIJ9ptP9B4unXjBk/AT/eQI/wgM5VAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"pictureBox8.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAB51JREFUWEe1\n        Vws0lHkbL2bG3WCMezFoEhWK3PkaMm4lokjCyokKu237Fa3LsSqVWruLalu20k2ISp2ojWnTxmlFURvL\n        qqWmbKP2U9/p/T/O+eZ5d949zp7ti077O+c5M/O+7/M8v+f6f2fKu0BZWUkZhcNmcRhR3PpngY401JQ1\n        3yRqKiw1fAbJKVTeH9A4OtHWYHG5miwdE76K2V8F72mqs7TwufdGAg2hczTM1+UYWJmpC+fZaLsFevCX\n        Ry4y/gAFv+M1G4HGHCSCBJmMKMy8G5iU6+tw+NONVQUL7LhescGm648UxZ9rbWnoejTQLns6dPdlT/cP\n        Ty4eTb3xUbzjDnd7HV98FnUYEu+UDVRCAxgNRu3vygv7KkdcIRt+ODr6cpR6MfKIkvbdJA87T0NXSx25\n        Vl8OjZWlcCAv4sdlfkbx1tPUZzKZmHSTjneO0Sx01gsp3RF77NV/X1EjzwaJ7NFtIu29RgY6Gsjj7hNw\n        q+kE1JbvgW93Z9JSsSd9JNjLIAJ1sS/Q1qSygApMzbG2BZ/YFmPksuEB6jdpD/Xs8V2C8vyxhPxHWg2D\n        3VcIkqjatw12Z6RAVloC+XJraBvqoo1JZwEVkDk2Fdb82sXNN39//pSg86fSfmr46QNKKh0kjadLoLdt\n        LwzdayK9rXVw7lgJfJmdBv9OjiWfbYx5GR1gshabEoOZcEMy44aKLrO5Pru22O17OXKTyKQ9dOqRxPPf\n        7pOKfbmkPN8PvqvaAJdrdsBQ11nSXFP6J4Hk6FCSm2J/2F6o5YzBTJgAEz3Wb+m/DOLqykQNdO2HbpHf\n        n7bA82cdpKujnqTHLCIDLRkgvbcXHv9UCbKBavilvRJO7c+E/I+TYM0yX1K0VXxjoZPeYkM9jjHaVbh4\n        M5ixw+bD9K+PEmTeb4/vf/FCRvXfaSJ9t8+D7Ekn6f+ll3y6aQP0dRyFwa6j8GTgJt0Ht5vL4Vz5Jsj/\n        aBVBAp9nhj8MFxkkmBurWU6KADbO3Bla8zfFWX3W07Wxv+fOddJysQzamo9D7TcF0NJYBTck9dBQswdG\n        BhsJOj9Zmk9HnpsWBzlJAcRf5EO2p4ulqSsFWXOstZ2wD946CegcRVF/7+xkm8J7ndl9khNZcH6/H3z/\n        beiY5PiHcOtyxljDyXyQDTbB8INLIKnNg6unV49dPhQydjzfH87vcYf1K+zIxnifV7mpM/bOn6XtgWV9\n        6ySMJ+DhoLNo58a5Jffv7ur7audWkhgyk6REWpJ9uxPJjlQXkhYxl7SczYMb1VlQlukMEV5C6pMUX5IW\n        50GCPKdRIlcTsioshBRmzTzgbMf1YfaBwtXf468Z2L7Z5WBP5wXSfqMZCjfHkStHEmBkeIg86j4Ax7Kd\n        ob78Q6j6Oh0OF84ba6uJA+yVoY5iyF67AMTu9lR02GKSu86t2dNBVzwhAuNHEJdI7gaPMsmlC+TRr33Q\n        /X0FNJ3MgqrilbD/06Vw7lDU2NW6QijflgCSCtexukIR1BfHQ3VRHBR8HE+W+fuQyKVLqIRQu9YJExg/\n        BdiEG2OF25slV2kCP12vhge3G+n1i0vncHEBtF+qgKLMRGgoEsGpnSvgSn0ZwW2Ijejn5U1Wh/mS1QGC\n        1vmzdHx4XLb+hAkgWxsLjTnBnvzor0sPwY9t1wnu+jstZ2gCt69W0Quns+UsKchYDzvWudATgM6/yEmH\n        +PAAInLzJAvdnKmUEPNW+RS4Mu8JCld/D+YQQsEyyI9Wv+Q1sQOfFxTSDir3FwCeepIzJZAUE06E5kaU\n        Hlfz9WyhOYX7f0tKPEmJCiRiD2fiZmdFOdlYUrHBgmo9riq9iN46BQimDzALtpaa9jFi071JUYseJkRG\n        UDnpa+gUX71wnLRLasl3p0qg5uB2+gREgh8sDyShAQuJo7Xx69kCIyrGZ9qtQFd+kr6uqulbox8PhoSp\n        gep0Rxtt9+VBdtuCg32pTYkR5NgXOVDzzS7YlbWOJEQGkbWxQSQi0JtEid0oXD6eDnaUwMyQcrITPIsV\n        G23F6LmabN6Eoh8PVMAsWJioWeFELAkW/4oHTOrqpSTc31s+5w5Uamw4SVweRlxsLSihwOw1pnyB0OQ1\n        EggTmVfaC7nuutp/HMcKs5MDKjIvJYtFVlswvYkRgQRPu5jFYrrOmGqXObYUNh1Gj7/thBat8ilysp6m\n        MQttTDp6BsxU6GixdG2tdOeJ3OZLVy4JoQlg02EpKkvzAEuDHY/RY2MGeZnlYRNPqPP/H5ipQENIQuTl\n        fsrWwujnULHfaEbySprAwd0ZsGKJLx05OnewNpXNnqHvxyyeCb8HvAlMFlAcHR2iZ1pOP2NhxGu3NOH1\n        WpvwpOaGujJjfZ1RQz0tqcCY1y00NzljzNecwehM6l3wTWCmwsLCYq4hX3+VsRE/T5/HPWKgr1PL09U+\n        zcgf1/WiOWxl+vn34pyBCoelIoeaHNO1tbVcdXW44XIycXyeXgJXWytYU0PDW11dbRaHwzGUO2a/V+cI\n        +b9R+b9Qjrr8U1Uu6hw2m8dms3VU5A5ZLBZXfk1z6tSpLLmw8VOh9n6hpKSkLDeuhKKspMRBkV+jHSqE\n        vqd4/J8DOpFHrYaE5EAC7+h0ypT/AQaejvOLJ32kAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"pictureBox9.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAB7VJREFUWEfl\n        V2tQk1caVi6SkHAvYKJSQQEFhEW5GbEqIoauVFSoovWKIpqWrEu7KKBiAZuMIHhbCBdbRYiiIaKmQlla\n        VBopUqBecBGlq7Wha2fk4tZvZ53ZZ8+bhZnOTt2NtvtjZ5+ZZ75J5jvv+7yX857zjfqfhIXZKAt68ixG\n        84kjv/+rICd85syZb+YsFpiJ/5X0v4OVmQO9M7zkl4PQcrQNOfCwNfcIcLIIiBxvFTlCqZuVlJ5zxWPm\n        BjhZBtA7JIjWDC9/eVDUFBUZlYjGhK/05q/JCBZmFUeNLa/dGHqxPlnymXZd2Pnjcb5VhfPGHpH5CeRv\n        evIT6F1aQ6J/Vnnsh50vcectIceaVX7neytyDU8ua55xHTpw+pPAjUYjB69qhr5UrO88tXxKze4Qmxxa\n        Qxl5aRE2LIXkfOkkXnxxlGt5p2rH/b6rOvR2NKO3uw3f3W01cuBWPQY7tOB6msH1dYO7VgvDsfcefxTt\n        WpXoY500w9lyxguLoM6mOlJ9D0e6qPrqSjmDXgdib2sTem9fg+Hrdgy012KwXYsfqraBu90IruMsuHMK\n        cJ+r0a/J5SoXu1VvmMLfQIG8UE+Q4mksfWkzhBnt+5MftX+qw/WG8+hiz66WBnS1XcLgnWY8/cu3IDxj\n        pejrbgfH9eNOTSH6WUn6m6vwTdWeIYXENo96gmwOm//3oG1E0Uex6GsSplzsri5Al7YYrTot2utq0aWv\n        R1enHkO9LeCe9RsF/P3pIK5fqDTyYZMaXScV6L9QgP76Iug2SxqoecmmSWUgAb6OFr5Uv7bsFfeuqVVo\n        qSyCvqYS+rpz6NSdRuuZY+hruYi/DTxg7jmcUylx99YNFB0qgCInAxXlh/HVx1WgnrlZknZvrY9N0nih\n        uRvP3IQZQduOGofSf/ejzKGrFUfQVF4A/YkifH7mOPRVKiMfXq7Fn79sRHdbE/TnKtFzkwTsNwogluzP\n        Qs+nGjyqVw2lzrDPmOvpEmOSAErViICOsx9ydUdLUHdUhStlB408V1oMreowy0YdHnRcww/f/wl/HfgW\n        hp52tkMuo79HD12pEu+lbEHvJxr0flyGoylLnkV5OifZseCG3TwfJCDU1TI0NVCQ1nqi4PH54gPQHlSi\n        WpkF3UEF1IUfQHOkEPUaLVobGvCwswXf91xHHxNwhzUoOSder600CuhU5+H99TEXp7Ky0lwZdvN8UAlo\n        gMj8BfLP8rffrzmUjz2b10H5diKKdshRuTcH9WWH0VijMVJ96ACKc7NRtnkRDqxbCPWKINSuDkPlLjlu\n        aspQHB+ILKnPFcoq2R5283zQS9SEa9n+vbA1skW9by+UKclIjokyijip3IumCtYDX7Tgu7Y26I59iNiI\n        OVjg54W9CfOxb6EPVk0TYdeKRSh9NwmpsyeTgOaYiVYxlN1hN88HTUAS8AYbpXmRr6qSlsQib5sMZdlZ\n        2PPOO1Dl5uKr86eBPgNjH548vGtknSIFVfI4lKwKw7ZFr0GbmYSGnBQciAtC4eKpNfFsopokYGQORLAT\n        7ndBdhm7ktZzb0VHo0KZi9T1iTi0OwtX1MfZRGyBjj1rjpUwAT14+uALXDqSAe2GEBQul0AlWw5DVR4a\n        t0iQNs9dQX1l0jCiYTGyE5LYLDi1RWqIiwhHnlyGxNcjkLwsFtkpMpxltSc2VBThzO+VyElPRWl+Do7m\n        pGGPbB3OsIalOWC4rcfb4e4ZlFWTeoAw0gd0ou18I6R615uRWDlfgohp7lg6W2JkxuplUGWmoUyRgfz0\n        FJQx5yTik/J8tNeUYWfyJiZCiW9O5SA5WJRG9ky+rIwcRuFshsv8beX7pN6d0T5ukLiLEBsehuVzZmLF\n        7CDsiF+AD5LXonKnHCdyt6M4U46eP1TjjxcqkL55LRaE/ApXEoOGpJOdEsjeCwugMqz0Fq6pjHKpTpnn\n        B8lEEYL9pyNGEoqY4AAsDPTDytejsDtxldH5jTOlMFy/hCcDX7PjuR3a4gI056zunufusITsvdCRTLvB\n        y97Ci5oxa7aLYt+mt7DAxwPe48QI9feHJDCQcTqks8KwblEE9qfLcel0KYqzM5C3XY6lc2dB4uuNrSHi\n        lkAWiElD6McY2Q20OGGKcE35uzJu9WshcHdxgpujHSa7jUeAt9ewiFBsWvZrpCetNgogyuJjjSJk/sI0\n        EbNDWR02bTqoGSewUyxsnHV4UW6uYePimMdBU704eyGPsxUK4GhnA3exC0JYpAuZiD2/2QhdSR7UBe9D\n        zgaRLC6aWzrJOl5kbf5i6R8BZYFS5yOyC9i+ZevF5Qvmdy4Kl9zyELveYwIeCQXWRjGv2Ak497EiYyYo\n        /arsHdDkZyLvt4mGhRN4UpO330+BlLvY8sXzZ86Szw4KVswJnq7yn+xRI3ZybBA5OrQ4CfhtIntBp6/Y\n        rjvW265Z4jn+fqz/q5w00G1o5kT7HDeWwZeK/sew5o2xcXZ08hI5O4dOmjAuxtNt/AZXJwf5K/a2cld7\n        61SRoyBrzgReEjUsu37NDRPxpN6O/7yMmrz1/hMsLCz4fB7fWcDnix3s7LzshQJfAd/KS2Bl6SHkWXqM\n        FY5xc+abG7+aKOV0Cf3Zkf8UzMzMmBb2lWZuzjc3N2PfhSMc/cs7+z/AqFH/AOYIB6CN24w0AAAAAElF\n        TkSuQmCC\n</value>\n  </data>\n  <data name=\"pictureBox10.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAACI9JREFUWEe1\n        VwtUjekaRu0UOmi6MByjC+0aoUQXO10kJEntdNnb7oJ0k0qpGF1QGuVS7hNJTTVNBl0WQ0mSS4XMmm6n\n        cFCNJG0czVn+7/07Z7+//Vt7rCLOOu9a7/q//X/f977P97yX79/DPkdGjBghN5BKp/8/gg7kRshxJKrw\n        KcW1w4cPHyHd+r+J1DFjWF6Oo8SRVxgzauQYDWWlsZMHUiWFUaq4RrqH88XM4AnQABpCg2h87CgVzUkq\n        U82mqk2z4X4922n+dLsoVk11bEJmTJ7rhnMTxk02YsGwQKRmhy7SjQpo5Ctlda6Ohv5SdOJs7psttNhw\n        Ntoz9dFW932PY93Sn+ATf69dGHUZ5yz1lsXOmmIqRCC4H5lDW1LTnxZEzDpHI+bTbMPRMDo6GJz7svDI\n        Raos7w5UlzWTlqY28vBBKzT/9oDcKKknubsvkB1uhzpEvI1FPN0lkZrq3IXInBQE55O5IaX+vXM0ErI0\n        vuZoTCF15extqC6th0tZN2nU8sI6uFL6G9y+XQtNjb9D+5N/kp6eZ+SPzuek5HiVGPc5zBEcnj7RwFEW\n        hNTVwILOcSFuMNG2CUYjxUcuw9XieriYUU2jXjpTCVXldfD7vSZ49LCFdHV1kJcvuynU592Pqe6uh1Tv\n        iy7qcXMniRXsb7IzcNmNIcS8QPuDJqbs6TGZ3Of75/+w7QxVfrYKso5mvgNwrgxu3bgGLc2N0NrYTR4/\n        66We9vRKnIvJ63+9ZrS39wVBIC96Oqinj7pJhGNSLYYRGWUrZMBQsCWHSOdqWQVgYl3IvEH/mHqaZgFU\n        lF+DmmvN5B/NrYyjP//9J4Xa3vPyLTtGRUDIxKtXvdS183fFmENsKAZlASeQ/gnj/25k8+2KhJSAE+3F\n        6Vfp7PRchoELxVfgevldhvo/Ou+/ByAW95DnL19TT54+Y971PO8kb/reMGHAMbKyxXVvkwV36ZaPsoAv\n        cRJrfaWZ74mD0fkdmbtz6Jy9BXTesZ8Akw4Zqc9r7W8ofUw33Gsjty43glhyWgSCTtEhAnrxQgIGAXS1\n        Mmwc35UvXjHX6wcMLZsLgwKYoqpt6bEg8Ex6SE5HxsGjkLw9DvIPnabPH6umf0kqp9sKO/6DIMrTa/tL\n        D1+nG+raoO5WLWlobGSqoaT4DLleVwd4cnFnPQOk5modYGkaTjX3lamIv/YGWQCuPL+85DUZ7Yf3HYCo\n        0A2wb/tWpvyK9lyhK4/d7s+NLO3PjT8P+DvMZxuZOZsHQk8vqCgvh+jIZLruTg10djwgrY21UHGhBGpq\n        bgI2KmxmKmPUprNhkLp+J/gCkU0cN8UYcwCTMCU5BXYmJEJ2Wh59r/B+f1eluP9mQSOduOYIiOyD6ECn\n        bfQqu0Ba02AemJotpwWiYEjPL6L3px+G+23NpLKyEk5kHIOcU6cgakVKM3ZJDDFWGvr7SxjeVYG8IrZe\n        LBtf28iymJAdfUFeApIQFUXuFz3tby971o8hOBVTAhmR+XR28mkmLOGRcWBlYUPiU7Po4KB4+pdzxfTF\n        qioI9/Mm0RGxcPzIUUjxyezAgyHDA+YBW4ajFcdoYOPApAlyinniJ/CkfPmOJH77LlJ0qLQ/Y3suRATE\n        kIiwTeTSnpv9qf6ZJDTsO1jpLoT9ucV0aFA45OTkQXJSEvkp4wD4+fqSpLgEiBXu7cBy/GhTYsOALBh+\n        Y+7tarIux4/vK17j40PWCERE4MKnUjcfgKTYLeAjWk3SIjIhK/ln2nzefKKhOo4ymTWPBAavJ35eXqTh\n        TjXU/XoSSvKPQEnuIdiz+fgrTES8NQcFwLKAMcJcwLtAYL3+gsCV3+ewaBFxsHaFKPfvITZ6K4i8hORU\n        xklISvweLMzswcnZlaxdLSJLliwkNbU3oaqygm6rOQedrTegJGe/5B4phm38tBZjTQu/QQGgSCaY2xAX\n        4W22aIZzYsiy75odly6mbM1tIdAlDpLiEyDAS0S8PIREyHcjyEboxnAI27SZSdqC3Bw4l5cFlwoOQ0fL\n        NXI8dRtk74+FtMj09k8CwMTASTYUczQt1q63iakI9Pbvs7OxJDZmPGJpbEwCRALgGelR83gWxHuVBxUS\n        tAHwiWCiNkdDwuZQSIkJgIKjyZCRlkg8bbx7MQT4rfBRACgsCMnnl7pkgwA3RqyL6RM6O1JL7KwZRUZm\n        aE6gMP6uy/kk0M+fAbBs2UIK120QOZGwtUJyMmUL3KkuJdjYVhr7ZAzpZkRhAXAnznZcbihMj4vaJfZ2\n        9+zDRET1ceVTthYLyEx9PYJPFwcHytXJkQGA6rZiIYkO8CZpcRshYDWfIIvYB2TL8FMAOAhAU41r7Wy7\n        ascafnCjwN2zycvTs9vbw1McGhgA1qYzKcz+yerj3+pxucTEQJ+yNptLYaiQJWRi99ZQCBX4MzcituJB\n        O+GHguhwEQKwsrT093DzuGu/eNmPLitdLiIQPx+vZw68WW8QgPJopbeoDJgJX1HGXC0GCIZh56Z1kBiw\n        6z39g94FAwkuGqOkrKGjpcMzmjVnva6mnrPpPNNQ+8WLDy23tz9rM3/W3Znak56gU3TOKvvb3PBbInJ1\n        JKHu4fewpLG02Tb8UfpZkSYjR15eXlFxpOLY8X9T0dbR0rLU19NdYmRg6KvH1d0x/Zuvi2brTG400J36\n        1N7EqdzFatV5B57LWRxbz7C7tXiOfdkCrn0M+4GKzod0elmRAODIy8kpcjgcJQUFhVHKysrqqiqquupq\n        ajwNNVWhtrbWzrnTeCFYMfqTjFw+1Kmq062wpFnqh3R6WUEATE7IyUkwcEYiCMk7JQlD8pKxioQZ/fGj\n        VXVGKypPxAxHxdOyY0WO0nj25BL9gj8qcnLy0uF7wfAwIUJQ8u9OJqvsaWUUO+znOx+KIBBp1TBOZBXf\n        fzblsiKhnEkYfCITbDg+VGbxF8mwYf8FXNyO9VVdS+0AAAAASUVORK5CYII=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/AttributesOptimizerOptionsWindow.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class AttributesOptimizerOptionsWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AttributesOptimizerOptionsWindow));\n            this.buttonWholePlan = new System.Windows.Forms.Button();\n            this.buttonRemappingPoints = new System.Windows.Forms.Button();\n            this.buttonCharacter = new System.Windows.Forms.Button();\n            this.SuspendLayout();\n            // \n            // buttonWholePlan\n            // \n            this.buttonWholePlan.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.buttonWholePlan.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.buttonWholePlan.Image = ((System.Drawing.Image)(resources.GetObject(\"buttonWholePlan.Image\")));\n            this.buttonWholePlan.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            this.buttonWholePlan.Location = new System.Drawing.Point(12, 67);\n            this.buttonWholePlan.Name = \"buttonWholePlan\";\n            this.buttonWholePlan.Size = new System.Drawing.Size(472, 48);\n            this.buttonWholePlan.TabIndex = 1;\n            this.buttonWholePlan.Text = \"Attributes that would be best for the first year of this plan.\";\n            this.buttonWholePlan.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\n            this.buttonWholePlan.UseVisualStyleBackColor = true;\n            this.buttonWholePlan.Click += new System.EventHandler(this.buttonWholePlan_Click);\n            // \n            // buttonRemappingPoints\n            // \n            this.buttonRemappingPoints.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.buttonRemappingPoints.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.buttonRemappingPoints.Image = ((System.Drawing.Image)(resources.GetObject(\"buttonRemappingPoints.Image\")));\n            this.buttonRemappingPoints.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            this.buttonRemappingPoints.Location = new System.Drawing.Point(12, 13);\n            this.buttonRemappingPoints.Name = \"buttonRemappingPoints\";\n            this.buttonRemappingPoints.Size = new System.Drawing.Size(472, 48);\n            this.buttonRemappingPoints.TabIndex = 0;\n            this.buttonRemappingPoints.Text = \"Use the remapping points I set up.\";\n            this.buttonRemappingPoints.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\n            this.buttonRemappingPoints.UseVisualStyleBackColor = true;\n            this.buttonRemappingPoints.Click += new System.EventHandler(this.buttonRemappingPoints_Click);\n            // \n            // buttonCharacter\n            // \n            this.buttonCharacter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.buttonCharacter.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.buttonCharacter.Image = ((System.Drawing.Image)(resources.GetObject(\"buttonCharacter.Image\")));\n            this.buttonCharacter.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            this.buttonCharacter.Location = new System.Drawing.Point(12, 121);\n            this.buttonCharacter.Name = \"buttonCharacter\";\n            this.buttonCharacter.Size = new System.Drawing.Size(472, 48);\n            this.buttonCharacter.TabIndex = 2;\n            this.buttonCharacter.Text = \"Attributes that would have been best for what I have trained so far.\";\n            this.buttonCharacter.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\n            this.buttonCharacter.UseVisualStyleBackColor = true;\n            this.buttonCharacter.Click += new System.EventHandler(this.buttonCharacter_Click);\n            // \n            // AttributesOptimizerOptionsWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(497, 182);\n            this.Controls.Add(this.buttonRemappingPoints);\n            this.Controls.Add(this.buttonWholePlan);\n            this.Controls.Add(this.buttonCharacter);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"AttributesOptimizerOptionsWindow\";\n            this.ShowInTaskbar = false;\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Attributes Optimizer Options\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Button buttonCharacter;\n        private System.Windows.Forms.Button buttonWholePlan;\n        private System.Windows.Forms.Button buttonRemappingPoints;\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/AttributesOptimizerOptionsWindow.cs",
    "content": "using System;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\n\nnamespace EVEMon.SkillPlanner\n{\n    public partial class AttributesOptimizerOptionsWindow : EVEMonForm\n    {\n        private readonly PlanEditorControl m_planEditorControl;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"AttributesOptimizerOptionsWindow\"/> class.\n        /// Default constructor for designer.\n        /// </summary>\n        private AttributesOptimizerOptionsWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"AttributesOptimizerOptionsWindow\"/> class.\n        /// Constructor used in WindowsFactory.\n        /// </summary>\n        /// <param name=\"planEditorControl\">The plan editor control.</param>\n        /// <exception cref=\"System.ArgumentNullException\">planEditorControl</exception>\n        public AttributesOptimizerOptionsWindow(PlanEditorControl planEditorControl)\n            : this()\n        {\n            planEditorControl.ThrowIfNull(nameof(planEditorControl));\n\n            buttonWholePlan.Font = FontFactory.GetFont(\"Microsoft Sans Serif\", 10F);\n            buttonCharacter.Font = FontFactory.GetFont(\"Microsoft Sans Serif\", 10F);\n            buttonRemappingPoints.Font = FontFactory.GetFont(\"Microsoft Sans Serif\", 10F);\n\n            m_planEditorControl = planEditorControl;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the buttonRemappingPoints control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void buttonRemappingPoints_Click(object sender, EventArgs e)\n        {\n            WindowsFactory.ShowByTag<AttributesOptimizerWindow, PlanEditorControl>(m_planEditorControl.ParentForm,\n                m_planEditorControl, AttributeOptimizationStrategy.RemappingPoints);\n\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the buttonWholePlan control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void buttonWholePlan_Click(object sender, EventArgs e)\n        {\n            WindowsFactory.ShowByTag<AttributesOptimizerWindow, PlanEditorControl>(m_planEditorControl.ParentForm,\n                m_planEditorControl, AttributeOptimizationStrategy.OneYearPlan);\n\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the buttonCharacter control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void buttonCharacter_Click(object sender, EventArgs e)\n        {\n            WindowsFactory.ShowByTag<AttributesOptimizerWindow, PlanEditorControl>(m_planEditorControl.ParentForm,\n                m_planEditorControl, AttributeOptimizationStrategy.Character);\n\n            Close();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/AttributesOptimizerOptionsWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"buttonWholePlan.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAD\n        dQAAA3UB0GyjoQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAS4SURBVFhHxdV5\n        UJRlHAdwME1FZIEhZLkxMGGsJJOwHMMEE0kFjaQyFBRCyqEaY7xwdDS1HB0MD2C5pTQYMq8QQYEFOVyX\n        G0QhW+SSXQ6V+9pvv3cRFHwQ/Gd7Zj68y/c9nu/7vO/sqgD4XzFDZWKGysQMlYkZKhMzVCZmOB5TbVPU\n        yHTWvpfBDMdDY+G1cFf/QrnB0vQMKvIR65jxYIZjoQlVbd1zW8PP1SA4vhruAcUwdhTmUL6UdfyLMMOx\n        0ESW62lSrsCg0IRqbNpbitdXZIhpvxPrPBZmOJZp9hkeu0LvIfxS/YCLdQg/X6sgoDKbD5RhtktmIRVZ\n        xa0W6xqDhj5oeZQs0Fpf7KfpXrRFc13ht5pfFvhqflHgw3PL/5q3Ns+L95l4k8antzw11og8eKtFSSFX\n        pIi83vRUigwRiQ2IuPyA1COMivkFVuCtr0Rlanbpa9Q+TGMWUfzR8avUcQuu7QhLf4iw9BaEpbVAkNqM\n        0OvkWpNCcApJbkTw1QHRWY8Qnf34ecIWRCbLEHmVCiZJEZHUgHd8CjD9k+wSdafsteqOWROeK2Cwo2rr\n        SSFdMKeVfVFuMs6Np07nd44ur0NxfFRqE7ZG1YBWErzP88FzywOt5G2eq3j1sAIrBdLUGFEbYm4OakVM\n        7nDRHK4gOS1uR2xZ75i8E9vBD7gPbZ9yaHvfhsE35Vh1WALHg/egtaHER1FAb98D1XnHpA8/FjTCIVQG\n        +xASzJFiyUkp7E9JsSxECq+zTTh8/ZGiYGxpD36rlI8qvFyOZYn9MDnTB/M/+uB8sRv7kx/jsLAVa6Ib\n        Yb5TAp0tFb8oCvB/llmZBjbD7s8u2P3VA7tz3QPb82TEdjFtt+f04vd/gTOS50X8A3jnAm//DaxMB/YX\n        A0F3gA05wKJkwCy6A3p76/Cav4Rz9EmBGhvbhE74FmFcvMnZmuEENPnGPMCFJtpzGzhFRTbnAw43AKsU\n        YBZNPsjiihyGO2ph4FVxSVHAIKLB2SiuA6ZijMt3d+Q4cR/YWQG40x2uo0K77gKhlH1fBiy/RSuQBVhm\n        DmcR1wnTPfUw8ilv03O9LJxi7jhfUYDntlvb+EJXl4lIDlM6+Sk5uGzITdpPZmf1w6EE2EaPIbQW2F4J\n        ONP/8+mO36RVeJaVsBczj7fAZFtVt/7GzPLp87x3q6iovEd0ySRFARqT1RY4r5txKC1D70j2Tb2juWJ+\n        oCiPf0xcwA/KL9I/Xliif6Ko1EBwt3JhNhBSD+yrAtbSXX9QDljTkj9rbrEcs+LaYXpI1mf4Q3Gt9ooj\n        4TTHYmJMppFJZOhLaXBMJTqEa8aZMZJuwAUPS6Eci2jyd0eid8AqrQczBY/lRnslzbqe8YkTtQxd6Lw3\n        iAaZTIZ9AQ0VGPowMFRH8QqtwE9WYjlsZRhiXdYPi4QumP4qa+P7Z4qmzlnuS8fOJdpkCnfes5OxMMOR\n        aEzU/THe25qW3KaOXqrUfpjFtHUbHiqr0HDyP0D73yd8osYdS5jXYWGGI9GYoLHE08ZYUF9tGCSR6PhE\n        xVJmT8yIOnmVvPBXbzTMkIUG957MIeaER0Z9ri+DGbI8GdzyjvlcXwYzVCZmqEzMUJmYoTIxQ+WByn+C\n        8QqlJwniFgAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"buttonRemappingPoints.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAD\n        dQAAA3UB0GyjoQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAS4SURBVFhHxdV5\n        UJRlHAdwME1FZIEhZLkxMGGsJJOwHMMEE0kFjaQyFBRCyqEaY7xwdDS1HB0MD2C5pTQYMq8QQYEFOVyX\n        G0QhW+SSXQ6V+9pvv3cRFHwQ/Gd7Zj68y/c9nu/7vO/sqgD4XzFDZWKGysQMlYkZKhMzVCZmOB5TbVPU\n        yHTWvpfBDMdDY+G1cFf/QrnB0vQMKvIR65jxYIZjoQlVbd1zW8PP1SA4vhruAcUwdhTmUL6UdfyLMMOx\n        0ESW62lSrsCg0IRqbNpbitdXZIhpvxPrPBZmOJZp9hkeu0LvIfxS/YCLdQg/X6sgoDKbD5RhtktmIRVZ\n        xa0W6xqDhj5oeZQs0Fpf7KfpXrRFc13ht5pfFvhqflHgw3PL/5q3Ns+L95l4k8antzw11og8eKtFSSFX\n        pIi83vRUigwRiQ2IuPyA1COMivkFVuCtr0Rlanbpa9Q+TGMWUfzR8avUcQuu7QhLf4iw9BaEpbVAkNqM\n        0OvkWpNCcApJbkTw1QHRWY8Qnf34ecIWRCbLEHmVCiZJEZHUgHd8CjD9k+wSdafsteqOWROeK2Cwo2rr\n        SSFdMKeVfVFuMs6Np07nd44ur0NxfFRqE7ZG1YBWErzP88FzywOt5G2eq3j1sAIrBdLUGFEbYm4OakVM\n        7nDRHK4gOS1uR2xZ75i8E9vBD7gPbZ9yaHvfhsE35Vh1WALHg/egtaHER1FAb98D1XnHpA8/FjTCIVQG\n        +xASzJFiyUkp7E9JsSxECq+zTTh8/ZGiYGxpD36rlI8qvFyOZYn9MDnTB/M/+uB8sRv7kx/jsLAVa6Ib\n        Yb5TAp0tFb8oCvB/llmZBjbD7s8u2P3VA7tz3QPb82TEdjFtt+f04vd/gTOS50X8A3jnAm//DaxMB/YX\n        A0F3gA05wKJkwCy6A3p76/Cav4Rz9EmBGhvbhE74FmFcvMnZmuEENPnGPMCFJtpzGzhFRTbnAw43AKsU\n        YBZNPsjiihyGO2ph4FVxSVHAIKLB2SiuA6ZijMt3d+Q4cR/YWQG40x2uo0K77gKhlH1fBiy/RSuQBVhm\n        DmcR1wnTPfUw8ilv03O9LJxi7jhfUYDntlvb+EJXl4lIDlM6+Sk5uGzITdpPZmf1w6EE2EaPIbQW2F4J\n        ONP/8+mO36RVeJaVsBczj7fAZFtVt/7GzPLp87x3q6iovEd0ySRFARqT1RY4r5txKC1D70j2Tb2juWJ+\n        oCiPf0xcwA/KL9I/Xliif6Ko1EBwt3JhNhBSD+yrAtbSXX9QDljTkj9rbrEcs+LaYXpI1mf4Q3Gt9ooj\n        4TTHYmJMppFJZOhLaXBMJTqEa8aZMZJuwAUPS6Eci2jyd0eid8AqrQczBY/lRnslzbqe8YkTtQxd6Lw3\n        iAaZTIZ9AQ0VGPowMFRH8QqtwE9WYjlsZRhiXdYPi4QumP4qa+P7Z4qmzlnuS8fOJdpkCnfes5OxMMOR\n        aEzU/THe25qW3KaOXqrUfpjFtHUbHiqr0HDyP0D73yd8osYdS5jXYWGGI9GYoLHE08ZYUF9tGCSR6PhE\n        xVJmT8yIOnmVvPBXbzTMkIUG957MIeaER0Z9ri+DGbI8GdzyjvlcXwYzVCZmqEzMUJmYoTIxQ+WByn+C\n        8QqlJwniFgAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"buttonCharacter.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAD\n        dQAAA3UB0GyjoQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAS4SURBVFhHxdV5\n        UJRlHAdwME1FZIEhZLkxMGGsJJOwHMMEE0kFjaQyFBRCyqEaY7xwdDS1HB0MD2C5pTQYMq8QQYEFOVyX\n        G0QhW+SSXQ6V+9pvv3cRFHwQ/Gd7Zj68y/c9nu/7vO/sqgD4XzFDZWKGysQMlYkZKhMzVCZmOB5TbVPU\n        yHTWvpfBDMdDY+G1cFf/QrnB0vQMKvIR65jxYIZjoQlVbd1zW8PP1SA4vhruAcUwdhTmUL6UdfyLMMOx\n        0ESW62lSrsCg0IRqbNpbitdXZIhpvxPrPBZmOJZp9hkeu0LvIfxS/YCLdQg/X6sgoDKbD5RhtktmIRVZ\n        xa0W6xqDhj5oeZQs0Fpf7KfpXrRFc13ht5pfFvhqflHgw3PL/5q3Ns+L95l4k8antzw11og8eKtFSSFX\n        pIi83vRUigwRiQ2IuPyA1COMivkFVuCtr0Rlanbpa9Q+TGMWUfzR8avUcQuu7QhLf4iw9BaEpbVAkNqM\n        0OvkWpNCcApJbkTw1QHRWY8Qnf34ecIWRCbLEHmVCiZJEZHUgHd8CjD9k+wSdafsteqOWROeK2Cwo2rr\n        SSFdMKeVfVFuMs6Np07nd44ur0NxfFRqE7ZG1YBWErzP88FzywOt5G2eq3j1sAIrBdLUGFEbYm4OakVM\n        7nDRHK4gOS1uR2xZ75i8E9vBD7gPbZ9yaHvfhsE35Vh1WALHg/egtaHER1FAb98D1XnHpA8/FjTCIVQG\n        +xASzJFiyUkp7E9JsSxECq+zTTh8/ZGiYGxpD36rlI8qvFyOZYn9MDnTB/M/+uB8sRv7kx/jsLAVa6Ib\n        Yb5TAp0tFb8oCvB/llmZBjbD7s8u2P3VA7tz3QPb82TEdjFtt+f04vd/gTOS50X8A3jnAm//DaxMB/YX\n        A0F3gA05wKJkwCy6A3p76/Cav4Rz9EmBGhvbhE74FmFcvMnZmuEENPnGPMCFJtpzGzhFRTbnAw43AKsU\n        YBZNPsjiihyGO2ph4FVxSVHAIKLB2SiuA6ZijMt3d+Q4cR/YWQG40x2uo0K77gKhlH1fBiy/RSuQBVhm\n        DmcR1wnTPfUw8ilv03O9LJxi7jhfUYDntlvb+EJXl4lIDlM6+Sk5uGzITdpPZmf1w6EE2EaPIbQW2F4J\n        ONP/8+mO36RVeJaVsBczj7fAZFtVt/7GzPLp87x3q6iovEd0ySRFARqT1RY4r5txKC1D70j2Tb2juWJ+\n        oCiPf0xcwA/KL9I/Xliif6Ko1EBwt3JhNhBSD+yrAtbSXX9QDljTkj9rbrEcs+LaYXpI1mf4Q3Gt9ooj\n        4TTHYmJMppFJZOhLaXBMJTqEa8aZMZJuwAUPS6Eci2jyd0eid8AqrQczBY/lRnslzbqe8YkTtQxd6Lw3\n        iAaZTIZ9AQ0VGPowMFRH8QqtwE9WYjlsZRhiXdYPi4QumP4qa+P7Z4qmzlnuS8fOJdpkCnfes5OxMMOR\n        aEzU/THe25qW3KaOXqrUfpjFtHUbHiqr0HDyP0D73yd8osYdS5jXYWGGI9GYoLHE08ZYUF9tGCSR6PhE\n        xVJmT8yIOnmVvPBXbzTMkIUG957MIeaER0Z9ri+DGbI8GdzyjvlcXwYzVCZmqEzMUJmYoTIxQ+WByn+C\n        8QqlJwniFgAAAABJRU5ErkJggg==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/AttributesOptimizerWindow.Designer.cs",
    "content": "using EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.SkillPlanner\n{\n    partial class AttributesOptimizerWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.tabControl = new System.Windows.Forms.TabControl();\n            this.tabSummary = new System.Windows.Forms.TabPage();\n            this.lvPoints = new System.Windows.Forms.ListView();\n            this.columnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.panelWait = new System.Windows.Forms.Panel();\n            this.throbber = new EVEMon.Common.Controls.Throbber();\n            this.lbWait = new System.Windows.Forms.Label();\n            this.panelNoResult = new System.Windows.Forms.Panel();\n            this.label2 = new System.Windows.Forms.Label();\n            this.tabControl.SuspendLayout();\n            this.tabSummary.SuspendLayout();\n            this.panelWait.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.throbber)).BeginInit();\n            this.panelNoResult.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tabControl\n            // \n            this.tabControl.Controls.Add(this.tabSummary);\n            this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tabControl.HotTrack = true;\n            this.tabControl.Location = new System.Drawing.Point(0, 0);\n            this.tabControl.Name = \"tabControl\";\n            this.tabControl.SelectedIndex = 0;\n            this.tabControl.Size = new System.Drawing.Size(439, 433);\n            this.tabControl.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;\n            this.tabControl.TabIndex = 27;\n            this.tabControl.Visible = false;\n            // \n            // tabSummary\n            // \n            this.tabSummary.Controls.Add(this.lvPoints);\n            this.tabSummary.Location = new System.Drawing.Point(4, 22);\n            this.tabSummary.Name = \"tabSummary\";\n            this.tabSummary.Padding = new System.Windows.Forms.Padding(3);\n            this.tabSummary.Size = new System.Drawing.Size(431, 407);\n            this.tabSummary.TabIndex = 1;\n            this.tabSummary.Text = \"Summary\";\n            this.tabSummary.UseVisualStyleBackColor = true;\n            // \n            // lvPoints\n            // \n            this.lvPoints.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.columnHeader});\n            this.lvPoints.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvPoints.LabelWrap = false;\n            this.lvPoints.Location = new System.Drawing.Point(3, 3);\n            this.lvPoints.Name = \"lvPoints\";\n            this.lvPoints.Size = new System.Drawing.Size(425, 401);\n            this.lvPoints.TabIndex = 0;\n            this.lvPoints.UseCompatibleStateImageBehavior = false;\n            this.lvPoints.View = System.Windows.Forms.View.Details;\n            // \n            // columnHeader\n            // \n            this.columnHeader.Text = \"\";\n            this.columnHeader.Width = 474;\n            // \n            // panelWait\n            // \n            this.panelWait.Controls.Add(this.throbber);\n            this.panelWait.Controls.Add(this.lbWait);\n            this.panelWait.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.panelWait.Location = new System.Drawing.Point(0, 0);\n            this.panelWait.Name = \"panelWait\";\n            this.panelWait.Size = new System.Drawing.Size(439, 433);\n            this.panelWait.TabIndex = 28;\n            // \n            // throbber\n            // \n            this.throbber.Location = new System.Drawing.Point(138, 169);\n            this.throbber.MaximumSize = new System.Drawing.Size(24, 24);\n            this.throbber.MinimumSize = new System.Drawing.Size(24, 24);\n            this.throbber.Name = \"throbber\";\n            this.throbber.Size = new System.Drawing.Size(24, 24);\n            this.throbber.State = EVEMon.Common.Enumerations.ThrobberState.Stopped;\n            this.throbber.TabIndex = 24;\n            this.throbber.TabStop = false;\n            // \n            // lbWait\n            // \n            this.lbWait.AutoSize = true;\n            this.lbWait.Location = new System.Drawing.Point(178, 175);\n            this.lbWait.Name = \"lbWait\";\n            this.lbWait.Size = new System.Drawing.Size(110, 13);\n            this.lbWait.TabIndex = 25;\n            this.lbWait.Text = \"Optimizing attributes...\";\n            // \n            // panelNoResult\n            // \n            this.panelNoResult.Controls.Add(this.label2);\n            this.panelNoResult.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.panelNoResult.Location = new System.Drawing.Point(0, 0);\n            this.panelNoResult.Name = \"panelNoResult\";\n            this.panelNoResult.Size = new System.Drawing.Size(439, 433);\n            this.panelNoResult.TabIndex = 29;\n            this.panelNoResult.Visible = false;\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(32, 162);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(362, 26);\n            this.label2.TabIndex = 0;\n            this.label2.Text = \"You have not defined any remapping point.\\r\\nUse the \\\"toggle remapping\\\" button on t\" +\n    \"he left sidebar of your plan\\'s window\";\n            this.label2.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // AttributesOptimizerWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.ClientSize = new System.Drawing.Size(439, 433);\n            this.Controls.Add(this.panelNoResult);\n            this.Controls.Add(this.panelWait);\n            this.Controls.Add(this.tabControl);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"AttributesOptimizerWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Attributes Optimizer\";\n            this.tabControl.ResumeLayout(false);\n            this.tabSummary.ResumeLayout(false);\n            this.panelWait.ResumeLayout(false);\n            this.panelWait.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.throbber)).EndInit();\n            this.panelNoResult.ResumeLayout(false);\n            this.panelNoResult.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TabControl tabControl;\n        private System.Windows.Forms.TabPage tabSummary;\n        private System.Windows.Forms.ListView lvPoints;\n        private System.Windows.Forms.ColumnHeader columnHeader;\n        private System.Windows.Forms.Panel panelWait;\n        private Throbber throbber;\n        private System.Windows.Forms.Label lbWait;\n        private System.Windows.Forms.Panel panelNoResult;\n        private System.Windows.Forms.Label label2;\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/AttributesOptimizerWindow.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Threading;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Allows to wiew and change attribute remappings.\n    /// </summary>\n    public partial class AttributesOptimizerWindow : EVEMonForm, IPlanOrderPluggable\n    {\n\n        #region Fields\n\n        private readonly Dictionary<AttributesOptimizerControl, RemappingResult>\n            m_remappingDictionary = new Dictionary<AttributesOptimizerControl, RemappingResult>();\n\n        private readonly PlanEditorControl m_planEditor;\n        private readonly BaseCharacter m_baseCharacter;\n        private readonly Character m_character;\n        private readonly AttributeOptimizationStrategy m_strategy;\n        private readonly BasePlan m_plan;\n\n        private string m_description;\n\n        private CharacterScratchpad m_statisticsScratchpad;\n        private bool m_areRemappingPointsActive;\n\n        // Variables for manual edition of a plan\n        private RemappingPoint m_manuallyEditedRemappingPoint;\n        private RemappingResult m_remapping;\n\n        #endregion\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Prevents a default instance of the <see cref=\"AttributesOptimizerWindow\"/> class from being created.\n        /// Default constructor for designer.\n        /// </summary>\n        private AttributesOptimizerWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"AttributesOptimizerWindow\"/> class.\n        /// Constructor used in WindowsFactory.\n        /// </summary>\n        /// <param name=\"planEditorControl\">The plan editor control.</param>\n        /// <param name=\"strategy\">Optimization strategy</param>\n        /// <exception cref=\"System.ArgumentNullException\">planEditorControl</exception>\n        public AttributesOptimizerWindow(PlanEditorControl planEditorControl, AttributeOptimizationStrategy strategy)\n            : this()\n        {\n            planEditorControl.ThrowIfNull(nameof(planEditorControl));\n\n            m_planEditor = planEditorControl;\n            m_plan = planEditorControl.Plan;\n            m_character = (Character)m_plan.Character;\n            m_baseCharacter = m_character.After(m_plan.ChosenImplantSet);\n            m_strategy = strategy;\n\n            // Update title and description\n            UpdateTitle();\n        }\n\n        /// <summary>\n        /// Constructor for use in code when the user wants to manually edit a remapping point.\n        /// </summary>\n        /// <param name=\"planEditorControl\">The plan editor control.</param>\n        /// <param name=\"point\">The point.</param>\n        public AttributesOptimizerWindow(PlanEditorControl planEditorControl, RemappingPoint point)\n            : this(planEditorControl, AttributeOptimizationStrategy.ManualRemappingPointEdition)\n        {\n            m_manuallyEditedRemappingPoint = point;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load, restores the window rectangle from the settings.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override async void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            lvPoints.Font = FontFactory.GetFont(\"Arial\", 9F);\n            throbber.State = ThrobberState.Rotating;\n\n            EveMonClient.PlanNameChanged += EveMonClient_PlanNameChanged;\n\n            await TaskHelper.RunCPUBoundTaskAsync(() => Run());\n        }\n        \n        /// <summary>\n        /// On closing, we unsubscribe the global events to help the GC.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            EveMonClient.PlanNameChanged -= EveMonClient_PlanNameChanged;\n        }\n\n        #endregion\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Updates the title.\n        /// </summary>\n        private void UpdateTitle()\n        {\n            Text = @\"Attributes Optimizer\";\n\n            switch (m_strategy)\n            {\n                case AttributeOptimizationStrategy.RemappingPoints:\n                    m_description = $\"Based on {m_plan.Name}; using the remapping points you defined.\";\n                    Text += $\" ({m_plan.Name}, remapping points)\";\n                    break;\n                case AttributeOptimizationStrategy.OneYearPlan:\n                    m_description = $\"Based on {m_plan.Name}; best attributes for the first year.\";\n                    Text += $\" ({m_plan.Name}, first year)\";\n                    break;\n                case AttributeOptimizationStrategy.Character:\n                    m_description = $\"Based on {m_character.Name}\" +\n                                    $\"{(m_character.Name.EndsWith(\"s\", StringComparison.CurrentCulture) ? \"'\" : \"'s\")} skills\";\n                    Text += $\" ({m_character.Name})\";\n                    break;\n                case AttributeOptimizationStrategy.ManualRemappingPointEdition:\n                    m_description = \"Manual editing of a remapping point\";\n                    Text += $\" ({m_plan.Name}, remapping point edit)\";\n                    break;\n            }\n\n            IEnumerable<Label> labelDescriptions = tabControl.TabPages.Cast<TabPage>()\n                .Where(tabPage => tabPage != tabSummary)\n                .SelectMany(tabPage => tabPage.Controls.OfType<AttributesOptimizerControl>())\n                .Concat(Controls.OfType<AttributesOptimizerControl>())\n                .Select(optimizerControl => optimizerControl.Controls.OfType<Label>()\n                    .FirstOrDefault(label => label.Name == \"labelDescription\"))\n                .Where(labelDescription => labelDescription != null);\n\n            // Update the description in controls\n            foreach (Label labelDescription in labelDescriptions)\n            {\n                labelDescription.Text = m_description;\n            }\n        }\n\n        /// <summary>\n        /// Starts optimization.\n        /// </summary>\n        /// <param name=\"update\">if set to <c>true</c> [update].</param>\n        /// <exception cref=\"System.NotImplementedException\"></exception>\n        private void Run(bool update = false)\n        {\n            // Compute best scratchpad\n            RemappingResult remapping = null;\n            ICollection<RemappingResult> remappingList = null;\n\n            switch (m_strategy)\n            {\n                case AttributeOptimizationStrategy.ManualRemappingPointEdition:\n                    m_areRemappingPointsActive = true;\n                    if (update)\n                    {\n                        remapping = m_remapping;\n                        m_manuallyEditedRemappingPoint = remapping.Point.Clone();\n                    }\n                    else\n                    {\n                        remapping = AttributesOptimizer.GetResultsFromRemappingPoints(m_plan).Single(\n                            x => x.Point == m_manuallyEditedRemappingPoint);\n                        m_manuallyEditedRemappingPoint = m_manuallyEditedRemappingPoint.Clone();\n                        m_remapping = remapping;\n                    }\n                    remapping.Optimize(TimeSpan.MaxValue);\n                    break;\n                case AttributeOptimizationStrategy.Character:\n                    m_areRemappingPointsActive = false;\n                    remapping = AttributesOptimizer.OptimizeFromCharacter(m_character, m_plan);\n                    break;\n                case AttributeOptimizationStrategy.OneYearPlan:\n                    m_areRemappingPointsActive = false;\n                    remapping = AttributesOptimizer.OptimizeFromFirstYearOfPlan(m_plan);\n                    break;\n                case AttributeOptimizationStrategy.RemappingPoints:\n                    m_areRemappingPointsActive = true;\n                    remappingList = AttributesOptimizer.OptimizeFromPlanAndRemappingPoints(m_plan);\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n\n            // Update the controls for every attribute\n            Dispatcher.Invoke(() => UpdateForm(remapping, remappingList));\n        }\n\n        /// <summary>\n        /// Updates controls on the form.\n        /// </summary>\n        /// <param name=\"remapping\">An <see cref=\"RemappingResult\"/> object</param>\n        /// <param name=\"remappingList\">List of remappings</param>\n        private void UpdateForm(RemappingResult remapping, ICollection<RemappingResult> remappingList)\n        {\n            // Update the attributes\n            if (remapping != null)\n            {\n                m_statisticsScratchpad = remapping.BestScratchpad.Clone();\n                UpdateForRemapping(remapping);\n            }\n            else\n                UpdateForRemappingList(remappingList);\n\n            // Update the plan order's column\n            if ((remapping != null) || (remappingList.Count != 0))\n                m_planEditor.ShowWithPluggable(this);\n\n            // Hide the throbber and the waiting message\n            panelWait.Hide();\n        }\n\n        /// <summary>\n        /// Updates the UI once the computation has been done (for whole plan or character from birth)\n        /// </summary>\n        /// <param name=\"remapping\"></param>\n        private void UpdateForRemapping(RemappingResult remapping)\n        {          \n            // Create control\n            AttributesOptimizerControl ctrl = CreateAttributesOptimizationControl(remapping);\n            Controls.Add(ctrl);\n\n            IList<AttributesOptimizerControl> optControls = Controls.OfType<AttributesOptimizerControl>().ToList();\n\n            if (optControls.Count == 1)\n                return;\n\n            Controls.RemoveAt(Controls.IndexOf(optControls.First()));\n        }\n\n        /// <summary>\n        /// Updates the UI once the computations with remapping points strategy have been done.\n        /// </summary>\n        /// <param name=\"remappingList\">The remapping list.</param>\n        private void UpdateForRemappingList(ICollection<RemappingResult> remappingList)\n        {\n            // Display \"no result\" or \"summary\"\n            if (remappingList.Count == 0)\n            {\n                panelNoResult.Show();\n                return;\n            }\n\n            tabControl.Controls.Clear();\n\n            // Adds a tab page for the summary\n            tabControl.Controls.Add(tabSummary);\n\n            // Updates the summary informations\n            UpdateSummaryInformation(remappingList);\n\n            // Adds a tab page for every remapping\n            int index = 1;\n            foreach (RemappingResult remap in remappingList)\n            {\n                AddTabPage(remap, \"#\" + index++);\n            }\n\n            tabControl.Show();\n            tabSummary.Focus();\n        }\n\n        /// <summary>\n        /// Updates information in summary page.\n        /// </summary>\n        /// <param name=\"remappingList\">List of remappings</param>\n        private void UpdateSummaryInformation(ICollection<RemappingResult> remappingList)\n        {\n            TimeSpan baseDuration = m_plan.GetTotalTime(m_character.After(m_plan.ChosenImplantSet), false);\n            lvPoints.Items.Clear();\n\n            // Add global informations\n            ListViewGroup globalGroup = new ListViewGroup(\"Global informations\");\n            lvPoints.Groups.Add(globalGroup);\n\n            TimeSpan savedTime = remappingList.Aggregate(TimeSpan.Zero,\n                                                         (current, remap) =>\n                                                         current.Add(remap.BaseDuration.Subtract(remap.BestDuration)));\n\n            lvPoints.Items.Add(new ListViewItem(\n                $\"Current time : {baseDuration.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas)}\", globalGroup));\n\n            if (savedTime != TimeSpan.Zero)\n            {\n                lvPoints.Items.Add(\n                    new ListViewItem(\n                        $\"Optimized time : {baseDuration.Subtract(savedTime).ToDescriptiveText(DescriptiveTextOptions.IncludeCommas)}\",\n                        globalGroup));\n\n                if (savedTime < TimeSpan.Zero)\n                {\n                    ListViewItem savedTimeItem = lvPoints.Items.Add(\n                        new ListViewItem(\n                            $\"{(-savedTime).ToDescriptiveText(DescriptiveTextOptions.IncludeCommas)} slower than current.\",\n                                         globalGroup));\n                    savedTimeItem.ForeColor = Color.DarkRed;\n                }\n                else\n                {\n                    ListViewItem savedTimeItem = lvPoints.Items.Add(\n                        new ListViewItem(\n                            $\"{savedTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas)} better than current.\",\n                                         globalGroup));\n                    savedTimeItem.ForeColor = Color.DarkGreen;\n                }\n            }\n            else\n                lvPoints.Items.Add(new ListViewItem(\"Your attributes are already optimal.\", globalGroup));\n\n            // Notify plan updated\n            ListViewItem lvi = new ListViewItem(\"Your plan has been updated.\", globalGroup)\n                                   { Font = FontFactory.GetFont(lvPoints.Font, FontStyle.Bold) };\n            lvPoints.Items.Add(lvi);\n\n            // Add pages and summary informations\n            TimeSpan lastRemap = TimeSpan.Zero;\n            foreach (RemappingResult remap in remappingList)\n            {\n                AddSummaryForRemapping(remap, ref lastRemap);\n            }\n\n            columnHeader.Width = lvPoints.ClientSize.Width;\n        }\n\n        /// <summary>\n        /// Adds summary information for given remapping.\n        /// </summary>\n        /// <param name=\"remap\">Remapping object</param>\n        /// <param name=\"lastRemap\">Time of previous remapping</param>\n        private void AddSummaryForRemapping(RemappingResult remap, ref TimeSpan lastRemap)\n        {\n            // Create the group\n            string text = $\"{remap} at {remap.StartTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas)}\";\n            ListViewGroup group = new ListViewGroup(text);\n            lvPoints.Groups.Add(group);\n\n            // Check there are at least one year between each remap\n            TimeSpan timeSinceLastRemap = remap.StartTime.Subtract(lastRemap);\n            if (timeSinceLastRemap < TimeSpan.FromDays(365) && remap.StartTime != TimeSpan.Zero)\n            {\n                ListViewItem item = lvPoints.Items.Add(\n                    new ListViewItem(\n                        $\"The previous remap point was only {timeSinceLastRemap.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas)} ago.\",\n                        group));\n                item.ForeColor = Color.DarkRed;\n            }\n\n            lastRemap = remap.StartTime;\n\n            // Add five items, one for each attribute\n            AddItemForAttribute(remap, group, EveAttribute.Intelligence);\n            AddItemForAttribute(remap, group, EveAttribute.Perception);\n            AddItemForAttribute(remap, group, EveAttribute.Charisma);\n            AddItemForAttribute(remap, group, EveAttribute.Willpower);\n            AddItemForAttribute(remap, group, EveAttribute.Memory);\n        }\n\n        /// <summary>\n        /// Adds the list item for the given attribute.\n        /// </summary>\n        /// <param name=\"remap\"></param>\n        /// <param name=\"group\"></param>\n        /// <param name=\"attrib\"></param>\n        private void AddItemForAttribute(RemappingResult remap, ListViewGroup group,\n                                         EveAttribute attrib)\n        {\n            // Add the list view item for this attribute\n            string itemText = RemappingPoint.GetStringForAttribute(attrib, remap.BaseScratchpad, remap.BestScratchpad);\n            lvPoints.Items.Add(new ListViewItem(itemText, group));\n        }\n\n        /// <summary>\n        /// Adds the tab page for the given remapping\n        /// </summary>\n        /// <param name=\"remapping\">The remapping.</param>\n        /// <param name=\"tabName\">Name of the tab.</param>\n        private void AddTabPage(RemappingResult remapping, string tabName)\n        {\n            AttributesOptimizerControl ctl = CreateAttributesOptimizationControl(remapping);\n\n            if (ctl == null)\n                return;\n\n            m_remappingDictionary[ctl] = remapping;\n\n            TabPage tempPage = null;\n            try\n            {\n                tempPage = new TabPage(tabName);\n                tempPage.Controls.Add(ctl);\n\n                TabPage page = tempPage;\n                tempPage = null;\n\n                tabControl.TabPages.Add(page);\n            }\n            finally\n            {\n                tempPage?.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Creates a <see cref=\"AttributesOptimizerControl\"/> for a given remapping.\n        /// </summary>\n        /// <param name=\"remapping\">The remapping object to represents.</param>\n        /// <returns>The created control.</returns>\n        private AttributesOptimizerControl CreateAttributesOptimizationControl(RemappingResult remapping)\n        {\n            AttributesOptimizerControl control;\n            AttributesOptimizerControl ctl = null;\n            try\n            {\n                ctl = new AttributesOptimizerControl(m_character, m_plan, remapping, m_description);\n                ctl.AttributeChanged += AttributesOptimizationControl_AttributeChanged;\n\n                // For a manually edited point, we initialize the control with the attributes from the current remapping point\n                if (m_strategy == AttributeOptimizationStrategy.ManualRemappingPointEdition &&\n                    m_manuallyEditedRemappingPoint.Status == RemappingPointStatus.UpToDate)\n                    ctl.UpdateValuesFrom(m_manuallyEditedRemappingPoint);\n\n                control = ctl;\n                ctl = null;\n            }\n            finally\n            {\n                ctl?.Dispose();\n            }\n\n            return control;\n        }\n\n        #endregion\n\n\n        #region Loacal Events\n\n        /// <summary>\n        /// Recalculating plan and summary page after change of a <see cref=\"AttributesOptimizerControl\"/>.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"AttributeChangedEventArgs\"/> instance containing the event data.</param>\n        private void AttributesOptimizationControl_AttributeChanged(object sender, AttributeChangedEventArgs e)\n        {\n            AttributesOptimizerControl control = (AttributesOptimizerControl)sender;\n\n            if (m_strategy == AttributeOptimizationStrategy.RemappingPoints)\n            {\n                m_remappingDictionary[control] = e.Remapping;\n                UpdateSummaryInformation(m_remappingDictionary.Values);\n            }\n\n            m_statisticsScratchpad = e.Remapping.BestScratchpad.Clone();\n            m_remapping = e.Remapping;\n\n            // Update the plan order's column\n            m_planEditor.ShowWithPluggable(this);\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Occurs when a plan name changed.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"PlanChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_PlanNameChanged(object sender, PlanChangedEventArgs e)\n        {\n            if (m_plan != e.Plan)\n                return;\n\n            UpdateTitle();\n        }\n\n        #endregion\n\n\n        #region IPlanOrderPluggable Members\n\n        /// <summary>\n        /// Updates the statistics for the plan editor.\n        /// </summary>\n        /// <param name=\"plan\"></param>\n        /// <param name=\"areRemappingPointsActive\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">plan</exception>\n        public void UpdateStatistics(BasePlan plan, out bool areRemappingPointsActive)\n        {\n            plan.ThrowIfNull(nameof(plan));\n\n            areRemappingPointsActive = m_areRemappingPointsActive;\n\n            if (m_areRemappingPointsActive)\n                plan.UpdateStatistics(new CharacterScratchpad(m_baseCharacter.After(plan.ChosenImplantSet)), true, true);\n            else\n                plan.UpdateStatistics(m_statisticsScratchpad.Clone(), false, true);\n\n            plan.UpdateOldTrainingTimes(new CharacterScratchpad(m_baseCharacter.After(plan.ChosenImplantSet)), false,\n                                        true);\n        }\n\n        /// <summary>\n        /// Updates the times when \"choose implant set\" changes.\n        /// </summary>\n        public Task UpdateOnImplantSetChange()\n        {\n            panelWait.Show();\n\n            return TaskHelper.RunCPUBoundTaskAsync(() => Run(update: true));\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/AttributesOptimizerWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/BlueprintBrowserControl.Designer.cs",
    "content": "using EVEMon.Common.Enumerations;\n\nnamespace EVEMon.SkillPlanner\n{\n    partial class BlueprintBrowserControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.gbRequiredSkills = new System.Windows.Forms.GroupBox();\n            this.requiredSkillsControl = new EVEMon.SkillPlanner.RequiredSkillsControl();\n            this.tabControl = new System.Windows.Forms.TabControl();\n            this.tpManufacturing = new System.Windows.Forms.TabPage();\n            this.gbManufBoM = new System.Windows.Forms.GroupBox();\n            this.lvManufacturing = new System.Windows.Forms.ListView();\n            this.chManufItem = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chManufQuantityBase = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chManufQuantityYou = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.BlueprintAttributeContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.showInMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.lblNoItemManufacturing = new System.Windows.Forms.Label();\n            this.tpResearchME = new System.Windows.Forms.TabPage();\n            this.gbResearchMEBoM = new System.Windows.Forms.GroupBox();\n            this.lvResearchME = new System.Windows.Forms.ListView();\n            this.lblNoItemME = new System.Windows.Forms.Label();\n            this.tpResearchTE = new System.Windows.Forms.TabPage();\n            this.gbResearchTEBoM = new System.Windows.Forms.GroupBox();\n            this.lvResearchTE = new System.Windows.Forms.ListView();\n            this.lblNoItemTE = new System.Windows.Forms.Label();\n            this.tpCopying = new System.Windows.Forms.TabPage();\n            this.gbCopyBoM = new System.Windows.Forms.GroupBox();\n            this.lvCopying = new System.Windows.Forms.ListView();\n            this.lblNoItemCopy = new System.Windows.Forms.Label();\n            this.tpInvention = new System.Windows.Forms.TabPage();\n            this.gbInvBoM = new System.Windows.Forms.GroupBox();\n            this.lvInvention = new System.Windows.Forms.ListView();\n            this.lblNoItemInvention = new System.Windows.Forms.Label();\n            this.tpReactions = new System.Windows.Forms.TabPage();\n            this.tlpModifiers = new System.Windows.Forms.TableLayoutPanel();\n            this.flpUpper = new System.Windows.Forms.FlowLayoutPanel();\n            this.lblMaterialEfficiency = new System.Windows.Forms.Label();\n            this.nudME = new System.Windows.Forms.NumericUpDown();\n            this.lblTimeEfficiency = new System.Windows.Forms.Label();\n            this.nudTE = new System.Windows.Forms.NumericUpDown();\n            this.flpLower = new System.Windows.Forms.FlowLayoutPanel();\n            this.cbFacility = new System.Windows.Forms.ComboBox();\n            this.cbImplantSet = new System.Windows.Forms.ComboBox();\n            this.blueprintSelectControl = new EVEMon.SkillPlanner.BlueprintSelectControl();\n            this.lblProduce = new System.Windows.Forms.Label();\n            this.lblProductionLimit = new System.Windows.Forms.Label();\n            this.lblProductionTime = new System.Windows.Forms.Label();\n            this.lblItem = new System.Windows.Forms.Label();\n            this.lblRunsPerCopy = new System.Windows.Forms.Label();\n            this.lblProductionBaseTime = new System.Windows.Forms.Label();\n            this.lblProductionCharTime = new System.Windows.Forms.Label();\n            this.lblResearchMECharTime = new System.Windows.Forms.Label();\n            this.lblResearchMEBaseTime = new System.Windows.Forms.Label();\n            this.lblResearchME = new System.Windows.Forms.Label();\n            this.lblResearchCopyCharTime = new System.Windows.Forms.Label();\n            this.lblResearchCopyBaseTime = new System.Windows.Forms.Label();\n            this.lblResearchCopy = new System.Windows.Forms.Label();\n            this.lblResearchTECharTime = new System.Windows.Forms.Label();\n            this.lblResearchTEBaseTime = new System.Windows.Forms.Label();\n            this.lblResearchTE = new System.Windows.Forms.Label();\n            this.lblInvention = new System.Windows.Forms.Label();\n            this.gbGeneralInfo = new System.Windows.Forms.GroupBox();\n            this.lblSuccessProbability = new System.Windows.Forms.Label();\n            this.lblProbability = new System.Windows.Forms.Label();\n            this.InventBlueprintListBox = new System.Windows.Forms.ListBox();\n            this.gbResearching = new System.Windows.Forms.GroupBox();\n            this.gbManufacturing = new System.Windows.Forms.GroupBox();\n            this.pnlAttributes = new System.Windows.Forms.Panel();\n            this.gbReactions = new System.Windows.Forms.GroupBox();\n            this.lblReactionCharTime = new System.Windows.Forms.Label();\n            this.lblReactionTime = new System.Windows.Forms.Label();\n            this.lblReactionBaseTime = new System.Windows.Forms.Label();\n            this.gbInvention = new System.Windows.Forms.GroupBox();\n            this.lblInventionCharTime = new System.Windows.Forms.Label();\n            this.lblInventionTime = new System.Windows.Forms.Label();\n            this.lblInventionBaseTime = new System.Windows.Forms.Label();\n            this.gbReactionsBoM = new System.Windows.Forms.GroupBox();\n            this.lvReactions = new System.Windows.Forms.ListView();\n            this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            ((System.ComponentModel.ISupportInitialize)(this.scObjectBrowser)).BeginInit();\n            this.scObjectBrowser.Panel1.SuspendLayout();\n            this.scObjectBrowser.Panel2.SuspendLayout();\n            this.scObjectBrowser.SuspendLayout();\n            this.pnlDetails.SuspendLayout();\n            this.pnlBrowserHeader.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.scDetailsRight)).BeginInit();\n            this.scDetailsRight.Panel1.SuspendLayout();\n            this.scDetailsRight.Panel2.SuspendLayout();\n            this.scDetailsRight.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.scDetails)).BeginInit();\n            this.scDetails.Panel1.SuspendLayout();\n            this.scDetails.Panel2.SuspendLayout();\n            this.scDetails.SuspendLayout();\n            this.gbDescription.SuspendLayout();\n            this.gbRequiredSkills.SuspendLayout();\n            this.tabControl.SuspendLayout();\n            this.tpManufacturing.SuspendLayout();\n            this.gbManufBoM.SuspendLayout();\n            this.BlueprintAttributeContextMenu.SuspendLayout();\n            this.tpResearchME.SuspendLayout();\n            this.gbResearchMEBoM.SuspendLayout();\n            this.tpResearchTE.SuspendLayout();\n            this.gbResearchTEBoM.SuspendLayout();\n            this.tpCopying.SuspendLayout();\n            this.gbCopyBoM.SuspendLayout();\n            this.tpInvention.SuspendLayout();\n            this.gbInvBoM.SuspendLayout();\n            this.tpReactions.SuspendLayout();\n            this.tlpModifiers.SuspendLayout();\n            this.flpUpper.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.nudME)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.nudTE)).BeginInit();\n            this.flpLower.SuspendLayout();\n            this.gbGeneralInfo.SuspendLayout();\n            this.gbResearching.SuspendLayout();\n            this.gbManufacturing.SuspendLayout();\n            this.pnlAttributes.SuspendLayout();\n            this.gbReactions.SuspendLayout();\n            this.gbInvention.SuspendLayout();\n            this.gbReactionsBoM.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // scObjectBrowser\n            // \n            // \n            // scObjectBrowser.Panel1\n            // \n            this.scObjectBrowser.Panel1.Controls.Add(this.blueprintSelectControl);\n            this.scObjectBrowser.Size = new System.Drawing.Size(1034, 700);\n            // \n            // pnlDetails\n            // \n            this.pnlDetails.Size = new System.Drawing.Size(866, 630);\n            this.pnlDetails.TabIndex = 1;\n            // \n            // pnlBrowserHeader\n            // \n            this.pnlBrowserHeader.Size = new System.Drawing.Size(866, 70);\n            // \n            // scDetailsRight\n            // \n            // \n            // scDetailsRight.Panel2\n            // \n            this.scDetailsRight.Panel2.Controls.Add(this.gbRequiredSkills);\n            this.scDetailsRight.Size = new System.Drawing.Size(240, 630);\n            this.scDetailsRight.SplitterDistance = 522;\n            // \n            // scDetails\n            // \n            // \n            // scDetails.Panel1\n            // \n            this.scDetails.Panel1.Controls.Add(this.tabControl);\n            this.scDetails.Panel1.Controls.Add(this.tlpModifiers);\n            this.scDetails.Size = new System.Drawing.Size(866, 630);\n            this.scDetails.SplitterDistance = 622;\n            // \n            // gbDescription\n            // \n            this.gbDescription.Controls.Add(this.pnlAttributes);\n            this.gbDescription.Size = new System.Drawing.Size(240, 522);\n            this.gbDescription.Controls.SetChildIndex(this.tbDescription, 0);\n            this.gbDescription.Controls.SetChildIndex(this.pnlAttributes, 0);\n            // \n            // tbDescription\n            // \n            this.tbDescription.BackColor = System.Drawing.SystemColors.Control;\n            this.tbDescription.Size = new System.Drawing.Size(234, 503);\n            // \n            // gbRequiredSkills\n            // \n            this.gbRequiredSkills.Controls.Add(this.requiredSkillsControl);\n            this.gbRequiredSkills.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbRequiredSkills.Location = new System.Drawing.Point(0, 0);\n            this.gbRequiredSkills.Name = \"gbRequiredSkills\";\n            this.gbRequiredSkills.Size = new System.Drawing.Size(240, 104);\n            this.gbRequiredSkills.TabIndex = 0;\n            this.gbRequiredSkills.TabStop = false;\n            this.gbRequiredSkills.Text = \"Required Skills\";\n            // \n            // requiredSkillsControl\n            // \n            this.requiredSkillsControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.requiredSkillsControl.Location = new System.Drawing.Point(3, 16);\n            this.requiredSkillsControl.MinimumSize = new System.Drawing.Size(187, 0);\n            this.requiredSkillsControl.Name = \"requiredSkillsControl\";\n            this.requiredSkillsControl.Size = new System.Drawing.Size(234, 85);\n            this.requiredSkillsControl.TabIndex = 0;\n            // \n            // tabControl\n            // \n            this.tabControl.Controls.Add(this.tpManufacturing);\n            this.tabControl.Controls.Add(this.tpResearchME);\n            this.tabControl.Controls.Add(this.tpResearchTE);\n            this.tabControl.Controls.Add(this.tpCopying);\n            this.tabControl.Controls.Add(this.tpInvention);\n            this.tabControl.Controls.Add(this.tpReactions);\n            this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tabControl.HotTrack = true;\n            this.tabControl.Location = new System.Drawing.Point(0, 65);\n            this.tabControl.Name = \"tabControl\";\n            this.tabControl.SelectedIndex = 0;\n            this.tabControl.Size = new System.Drawing.Size(622, 565);\n            this.tabControl.TabIndex = 1;\n            this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged);\n            // \n            // tpManufacturing\n            // \n            this.tpManufacturing.Controls.Add(this.gbManufBoM);\n            this.tpManufacturing.Location = new System.Drawing.Point(4, 22);\n            this.tpManufacturing.Name = \"tpManufacturing\";\n            this.tpManufacturing.Padding = new System.Windows.Forms.Padding(3);\n            this.tpManufacturing.Size = new System.Drawing.Size(614, 539);\n            this.tpManufacturing.TabIndex = 0;\n            this.tpManufacturing.Text = \"Manufacturing\";\n            this.tpManufacturing.UseVisualStyleBackColor = true;\n            // \n            // gbManufBoM\n            // \n            this.gbManufBoM.Controls.Add(this.lvManufacturing);\n            this.gbManufBoM.Controls.Add(this.lblNoItemManufacturing);\n            this.gbManufBoM.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbManufBoM.Location = new System.Drawing.Point(3, 3);\n            this.gbManufBoM.Name = \"gbManufBoM\";\n            this.gbManufBoM.Size = new System.Drawing.Size(608, 533);\n            this.gbManufBoM.TabIndex = 1;\n            this.gbManufBoM.TabStop = false;\n            this.gbManufBoM.Text = \"Bill of Materials\";\n            // \n            // lvManufacturing\n            // \n            this.lvManufacturing.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chManufItem,\n            this.chManufQuantityBase,\n            this.chManufQuantityYou});\n            this.lvManufacturing.ContextMenuStrip = this.BlueprintAttributeContextMenu;\n            this.lvManufacturing.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvManufacturing.FullRowSelect = true;\n            this.lvManufacturing.HideSelection = false;\n            this.lvManufacturing.Location = new System.Drawing.Point(3, 16);\n            this.lvManufacturing.MultiSelect = false;\n            this.lvManufacturing.Name = \"lvManufacturing\";\n            this.lvManufacturing.Size = new System.Drawing.Size(602, 514);\n            this.lvManufacturing.TabIndex = 0;\n            this.lvManufacturing.UseCompatibleStateImageBehavior = false;\n            this.lvManufacturing.View = System.Windows.Forms.View.Details;\n            this.lvManufacturing.DoubleClick += new System.EventHandler(this.propertiesList_DoubleClick);\n            // \n            // chManufItem\n            // \n            this.chManufItem.Text = \"Item\";\n            this.chManufItem.Width = 120;\n            // \n            // chManufQuantityBase\n            // \n            this.chManufQuantityBase.Text = \"Quantity (Base)\";\n            this.chManufQuantityBase.Width = 86;\n            // \n            // chManufQuantityYou\n            // \n            this.chManufQuantityYou.Text = \"Quantity (You)\";\n            this.chManufQuantityYou.Width = 82;\n            // \n            // BlueprintAttributeContextMenu\n            // \n            this.BlueprintAttributeContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showInMenuItem,\n            this.showInMenuSeparator,\n            this.exportToCSVToolStripMenuItem});\n            this.BlueprintAttributeContextMenu.Name = \"ShipPropertiesContextMenu\";\n            this.BlueprintAttributeContextMenu.Size = new System.Drawing.Size(189, 54);\n            this.BlueprintAttributeContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.BlueprintAttributeContextMenu_Opening);\n            // \n            // showInMenuItem\n            // \n            this.showInMenuItem.Name = \"showInMenuItem\";\n            this.showInMenuItem.Size = new System.Drawing.Size(188, 22);\n            this.showInMenuItem.Text = \"Show In Item Browser\";\n            this.showInMenuItem.Click += new System.EventHandler(this.propertiesList_DoubleClick);\n            // \n            // showInMenuSeparator\n            // \n            this.showInMenuSeparator.Name = \"showInMenuSeparator\";\n            this.showInMenuSeparator.Size = new System.Drawing.Size(185, 6);\n            // \n            // exportToCSVToolStripMenuItem\n            // \n            this.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n            this.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(188, 22);\n            this.exportToCSVToolStripMenuItem.Text = \"Export To CSV...\";\n            this.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n            // \n            // lblNoItemManufacturing\n            // \n            this.lblNoItemManufacturing.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblNoItemManufacturing.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.lblNoItemManufacturing.Location = new System.Drawing.Point(3, 16);\n            this.lblNoItemManufacturing.Name = \"lblNoItemManufacturing\";\n            this.lblNoItemManufacturing.Size = new System.Drawing.Size(602, 514);\n            this.lblNoItemManufacturing.TabIndex = 4;\n            this.lblNoItemManufacturing.Text = \"No item required.\";\n            this.lblNoItemManufacturing.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // tpResearchME\n            // \n            this.tpResearchME.Controls.Add(this.gbResearchMEBoM);\n            this.tpResearchME.Location = new System.Drawing.Point(4, 22);\n            this.tpResearchME.Name = \"tpResearchME\";\n            this.tpResearchME.Padding = new System.Windows.Forms.Padding(3);\n            this.tpResearchME.Size = new System.Drawing.Size(230, 199);\n            this.tpResearchME.TabIndex = 1;\n            this.tpResearchME.Text = \"Researching Material Efficiency\";\n            this.tpResearchME.UseVisualStyleBackColor = true;\n            // \n            // gbResearchMEBoM\n            // \n            this.gbResearchMEBoM.Controls.Add(this.lvResearchME);\n            this.gbResearchMEBoM.Controls.Add(this.lblNoItemME);\n            this.gbResearchMEBoM.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbResearchMEBoM.Location = new System.Drawing.Point(3, 3);\n            this.gbResearchMEBoM.Name = \"gbResearchMEBoM\";\n            this.gbResearchMEBoM.Size = new System.Drawing.Size(224, 193);\n            this.gbResearchMEBoM.TabIndex = 1;\n            this.gbResearchMEBoM.TabStop = false;\n            this.gbResearchMEBoM.Text = \"Bill of Materials\";\n            // \n            // lvResearchME\n            // \n            this.lvResearchME.ContextMenuStrip = this.BlueprintAttributeContextMenu;\n            this.lvResearchME.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvResearchME.Location = new System.Drawing.Point(3, 16);\n            this.lvResearchME.MultiSelect = false;\n            this.lvResearchME.Name = \"lvResearchME\";\n            this.lvResearchME.Size = new System.Drawing.Size(218, 174);\n            this.lvResearchME.TabIndex = 1;\n            this.lvResearchME.UseCompatibleStateImageBehavior = false;\n            this.lvResearchME.View = System.Windows.Forms.View.Details;\n            this.lvResearchME.DoubleClick += new System.EventHandler(this.propertiesList_DoubleClick);\n            // \n            // lblNoItemME\n            // \n            this.lblNoItemME.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblNoItemME.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.lblNoItemME.Location = new System.Drawing.Point(3, 16);\n            this.lblNoItemME.Name = \"lblNoItemME\";\n            this.lblNoItemME.Size = new System.Drawing.Size(218, 174);\n            this.lblNoItemME.TabIndex = 2;\n            this.lblNoItemME.Text = \"No item required.\";\n            this.lblNoItemME.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // tpResearchTE\n            // \n            this.tpResearchTE.Controls.Add(this.gbResearchTEBoM);\n            this.tpResearchTE.Location = new System.Drawing.Point(4, 22);\n            this.tpResearchTE.Name = \"tpResearchTE\";\n            this.tpResearchTE.Padding = new System.Windows.Forms.Padding(3);\n            this.tpResearchTE.Size = new System.Drawing.Size(230, 199);\n            this.tpResearchTE.TabIndex = 4;\n            this.tpResearchTE.Text = \"Researching Time Efficiency\";\n            this.tpResearchTE.UseVisualStyleBackColor = true;\n            // \n            // gbResearchTEBoM\n            // \n            this.gbResearchTEBoM.Controls.Add(this.lvResearchTE);\n            this.gbResearchTEBoM.Controls.Add(this.lblNoItemTE);\n            this.gbResearchTEBoM.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbResearchTEBoM.Location = new System.Drawing.Point(3, 3);\n            this.gbResearchTEBoM.Name = \"gbResearchTEBoM\";\n            this.gbResearchTEBoM.Size = new System.Drawing.Size(224, 193);\n            this.gbResearchTEBoM.TabIndex = 1;\n            this.gbResearchTEBoM.TabStop = false;\n            this.gbResearchTEBoM.Text = \"Bill of Materials\";\n            // \n            // lvResearchTE\n            // \n            this.lvResearchTE.ContextMenuStrip = this.BlueprintAttributeContextMenu;\n            this.lvResearchTE.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvResearchTE.Location = new System.Drawing.Point(3, 16);\n            this.lvResearchTE.MultiSelect = false;\n            this.lvResearchTE.Name = \"lvResearchTE\";\n            this.lvResearchTE.Size = new System.Drawing.Size(218, 174);\n            this.lvResearchTE.TabIndex = 1;\n            this.lvResearchTE.UseCompatibleStateImageBehavior = false;\n            this.lvResearchTE.View = System.Windows.Forms.View.Details;\n            this.lvResearchTE.DoubleClick += new System.EventHandler(this.propertiesList_DoubleClick);\n            // \n            // lblNoItemTE\n            // \n            this.lblNoItemTE.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblNoItemTE.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.lblNoItemTE.Location = new System.Drawing.Point(3, 16);\n            this.lblNoItemTE.Name = \"lblNoItemTE\";\n            this.lblNoItemTE.Size = new System.Drawing.Size(218, 174);\n            this.lblNoItemTE.TabIndex = 2;\n            this.lblNoItemTE.Text = \"No item required.\";\n            this.lblNoItemTE.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // tpCopying\n            // \n            this.tpCopying.Controls.Add(this.gbCopyBoM);\n            this.tpCopying.Location = new System.Drawing.Point(4, 22);\n            this.tpCopying.Name = \"tpCopying\";\n            this.tpCopying.Padding = new System.Windows.Forms.Padding(3);\n            this.tpCopying.Size = new System.Drawing.Size(230, 199);\n            this.tpCopying.TabIndex = 3;\n            this.tpCopying.Text = \"Copying\";\n            this.tpCopying.UseVisualStyleBackColor = true;\n            // \n            // gbCopyBoM\n            // \n            this.gbCopyBoM.Controls.Add(this.lvCopying);\n            this.gbCopyBoM.Controls.Add(this.lblNoItemCopy);\n            this.gbCopyBoM.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbCopyBoM.Location = new System.Drawing.Point(3, 3);\n            this.gbCopyBoM.Name = \"gbCopyBoM\";\n            this.gbCopyBoM.Size = new System.Drawing.Size(224, 193);\n            this.gbCopyBoM.TabIndex = 1;\n            this.gbCopyBoM.TabStop = false;\n            this.gbCopyBoM.Text = \"Bill of Materials\";\n            // \n            // lvCopying\n            // \n            this.lvCopying.ContextMenuStrip = this.BlueprintAttributeContextMenu;\n            this.lvCopying.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvCopying.Location = new System.Drawing.Point(3, 16);\n            this.lvCopying.MultiSelect = false;\n            this.lvCopying.Name = \"lvCopying\";\n            this.lvCopying.Size = new System.Drawing.Size(218, 174);\n            this.lvCopying.TabIndex = 1;\n            this.lvCopying.UseCompatibleStateImageBehavior = false;\n            this.lvCopying.View = System.Windows.Forms.View.Details;\n            this.lvCopying.DoubleClick += new System.EventHandler(this.propertiesList_DoubleClick);\n            // \n            // lblNoItemCopy\n            // \n            this.lblNoItemCopy.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblNoItemCopy.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.lblNoItemCopy.Location = new System.Drawing.Point(3, 16);\n            this.lblNoItemCopy.Name = \"lblNoItemCopy\";\n            this.lblNoItemCopy.Size = new System.Drawing.Size(218, 174);\n            this.lblNoItemCopy.TabIndex = 3;\n            this.lblNoItemCopy.Text = \"No item required.\";\n            this.lblNoItemCopy.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // tpInvention\n            // \n            this.tpInvention.Controls.Add(this.gbInvBoM);\n            this.tpInvention.Location = new System.Drawing.Point(4, 22);\n            this.tpInvention.Name = \"tpInvention\";\n            this.tpInvention.Padding = new System.Windows.Forms.Padding(3);\n            this.tpInvention.Size = new System.Drawing.Size(230, 199);\n            this.tpInvention.TabIndex = 2;\n            this.tpInvention.Text = \"Invention\";\n            this.tpInvention.UseVisualStyleBackColor = true;\n            // \n            // gbInvBoM\n            // \n            this.gbInvBoM.Controls.Add(this.lvInvention);\n            this.gbInvBoM.Controls.Add(this.lblNoItemInvention);\n            this.gbInvBoM.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbInvBoM.Location = new System.Drawing.Point(3, 3);\n            this.gbInvBoM.Name = \"gbInvBoM\";\n            this.gbInvBoM.Size = new System.Drawing.Size(224, 193);\n            this.gbInvBoM.TabIndex = 0;\n            this.gbInvBoM.TabStop = false;\n            this.gbInvBoM.Text = \"Bill of Materials\";\n            // \n            // lvInvention\n            // \n            this.lvInvention.ContextMenuStrip = this.BlueprintAttributeContextMenu;\n            this.lvInvention.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvInvention.Location = new System.Drawing.Point(3, 16);\n            this.lvInvention.MultiSelect = false;\n            this.lvInvention.Name = \"lvInvention\";\n            this.lvInvention.Size = new System.Drawing.Size(218, 174);\n            this.lvInvention.TabIndex = 2;\n            this.lvInvention.UseCompatibleStateImageBehavior = false;\n            this.lvInvention.View = System.Windows.Forms.View.Details;\n            this.lvInvention.DoubleClick += new System.EventHandler(this.propertiesList_DoubleClick);\n            // \n            // lblNoItemInvention\n            // \n            this.lblNoItemInvention.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lblNoItemInvention.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.lblNoItemInvention.Location = new System.Drawing.Point(3, 16);\n            this.lblNoItemInvention.Name = \"lblNoItemInvention\";\n            this.lblNoItemInvention.Size = new System.Drawing.Size(218, 174);\n            this.lblNoItemInvention.TabIndex = 5;\n            this.lblNoItemInvention.Text = \"No item required.\";\n            this.lblNoItemInvention.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // tpReactions\n            // \n            this.tpReactions.Controls.Add(this.gbReactionsBoM);\n            this.tpReactions.Location = new System.Drawing.Point(4, 22);\n            this.tpReactions.Name = \"tpReactions\";\n            this.tpReactions.Size = new System.Drawing.Size(614, 539);\n            this.tpReactions.TabIndex = 5;\n            this.tpReactions.Text = \"Reactions\";\n            this.tpReactions.UseVisualStyleBackColor = true;\n            // \n            // tlpModifiers\n            // \n            this.tlpModifiers.AutoSize = true;\n            this.tlpModifiers.ColumnCount = 1;\n            this.tlpModifiers.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tlpModifiers.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tlpModifiers.Controls.Add(this.flpUpper, 0, 0);\n            this.tlpModifiers.Controls.Add(this.flpLower, 0, 1);\n            this.tlpModifiers.Dock = System.Windows.Forms.DockStyle.Top;\n            this.tlpModifiers.Location = new System.Drawing.Point(0, 0);\n            this.tlpModifiers.Name = \"tlpModifiers\";\n            this.tlpModifiers.RowCount = 2;\n            this.tlpModifiers.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpModifiers.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpModifiers.Size = new System.Drawing.Size(622, 65);\n            this.tlpModifiers.TabIndex = 1;\n            // \n            // flpUpper\n            // \n            this.flpUpper.AutoSize = true;\n            this.flpUpper.Controls.Add(this.lblMaterialEfficiency);\n            this.flpUpper.Controls.Add(this.nudME);\n            this.flpUpper.Controls.Add(this.lblTimeEfficiency);\n            this.flpUpper.Controls.Add(this.nudTE);\n            this.flpUpper.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpUpper.Location = new System.Drawing.Point(3, 3);\n            this.flpUpper.Name = \"flpUpper\";\n            this.flpUpper.Size = new System.Drawing.Size(616, 26);\n            this.flpUpper.TabIndex = 0;\n            // \n            // lblMaterialEfficiency\n            // \n            this.lblMaterialEfficiency.Location = new System.Drawing.Point(3, 0);\n            this.lblMaterialEfficiency.Name = \"lblMaterialEfficiency\";\n            this.lblMaterialEfficiency.Size = new System.Drawing.Size(116, 23);\n            this.lblMaterialEfficiency.TabIndex = 1;\n            this.lblMaterialEfficiency.Text = \"Material Efficiency (%) :\";\n            this.lblMaterialEfficiency.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // nudME\n            // \n            this.nudME.Location = new System.Drawing.Point(125, 3);\n            this.nudME.Maximum = new decimal(new int[] {\n            10,\n            0,\n            0,\n            0});\n            this.nudME.Name = \"nudME\";\n            this.nudME.ReadOnly = true;\n            this.nudME.Size = new System.Drawing.Size(45, 20);\n            this.nudME.TabIndex = 9;\n            this.nudME.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n            this.nudME.ValueChanged += new System.EventHandler(this.nudME_ValueChanged);\n            // \n            // lblTimeEfficiency\n            // \n            this.lblTimeEfficiency.Location = new System.Drawing.Point(176, 0);\n            this.lblTimeEfficiency.Name = \"lblTimeEfficiency\";\n            this.lblTimeEfficiency.Size = new System.Drawing.Size(103, 23);\n            this.lblTimeEfficiency.TabIndex = 2;\n            this.lblTimeEfficiency.Text = \"Time Efficiency (%) :\";\n            this.lblTimeEfficiency.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // nudTE\n            // \n            this.nudTE.Increment = new decimal(new int[] {\n            2,\n            0,\n            0,\n            0});\n            this.nudTE.Location = new System.Drawing.Point(285, 3);\n            this.nudTE.Maximum = new decimal(new int[] {\n            20,\n            0,\n            0,\n            0});\n            this.nudTE.Name = \"nudTE\";\n            this.nudTE.ReadOnly = true;\n            this.nudTE.Size = new System.Drawing.Size(45, 20);\n            this.nudTE.TabIndex = 11;\n            this.nudTE.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n            this.nudTE.ValueChanged += new System.EventHandler(this.nudTE_ValueChanged);\n            // \n            // flpLower\n            // \n            this.flpLower.AutoSize = true;\n            this.flpLower.Controls.Add(this.cbFacility);\n            this.flpLower.Controls.Add(this.cbImplantSet);\n            this.flpLower.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpLower.Location = new System.Drawing.Point(3, 35);\n            this.flpLower.Name = \"flpLower\";\n            this.flpLower.Size = new System.Drawing.Size(616, 27);\n            this.flpLower.TabIndex = 6;\n            // \n            // cbFacility\n            // \n            this.cbFacility.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbFacility.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbFacility.FormattingEnabled = true;\n            this.cbFacility.Location = new System.Drawing.Point(3, 3);\n            this.cbFacility.Name = \"cbFacility\";\n            this.cbFacility.Size = new System.Drawing.Size(225, 21);\n            this.cbFacility.TabIndex = 2;\n            this.cbFacility.SelectedIndexChanged += new System.EventHandler(this.cbFacility_SelectedIndexChanged);\n            // \n            // cbImplantSet\n            // \n            this.cbImplantSet.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbImplantSet.DisplayMember = \"Name\";\n            this.cbImplantSet.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbImplantSet.FormattingEnabled = true;\n            this.cbImplantSet.Location = new System.Drawing.Point(234, 3);\n            this.cbImplantSet.Name = \"cbImplantSet\";\n            this.cbImplantSet.Size = new System.Drawing.Size(195, 21);\n            this.cbImplantSet.TabIndex = 2;\n            this.cbImplantSet.SelectedIndexChanged += new System.EventHandler(this.cbImplantSet_SelectedIndexChanged);\n            // \n            // blueprintSelectControl\n            // \n            this.blueprintSelectControl.AutoSize = true;\n            this.blueprintSelectControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.blueprintSelectControl.Location = new System.Drawing.Point(0, 0);\n            this.blueprintSelectControl.Margin = new System.Windows.Forms.Padding(0);\n            this.blueprintSelectControl.Name = \"blueprintSelectControl\";\n            this.blueprintSelectControl.Size = new System.Drawing.Size(163, 700);\n            this.blueprintSelectControl.TabIndex = 0;\n            // \n            // lblProduce\n            // \n            this.lblProduce.AutoSize = true;\n            this.lblProduce.BackColor = System.Drawing.SystemColors.Control;\n            this.lblProduce.Location = new System.Drawing.Point(6, 15);\n            this.lblProduce.Name = \"lblProduce\";\n            this.lblProduce.Size = new System.Drawing.Size(55, 13);\n            this.lblProduce.TabIndex = 1;\n            this.lblProduce.Text = \"Produces:\";\n            // \n            // lblProductionLimit\n            // \n            this.lblProductionLimit.AutoSize = true;\n            this.lblProductionLimit.BackColor = System.Drawing.SystemColors.Control;\n            this.lblProductionLimit.Location = new System.Drawing.Point(6, 110);\n            this.lblProductionLimit.Name = \"lblProductionLimit\";\n            this.lblProductionLimit.Size = new System.Drawing.Size(104, 13);\n            this.lblProductionLimit.TabIndex = 3;\n            this.lblProductionLimit.Text = \"Max Runs Per Copy:\";\n            // \n            // lblProductionTime\n            // \n            this.lblProductionTime.AutoSize = true;\n            this.lblProductionTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblProductionTime.Location = new System.Drawing.Point(6, 16);\n            this.lblProductionTime.Name = \"lblProductionTime\";\n            this.lblProductionTime.Size = new System.Drawing.Size(104, 13);\n            this.lblProductionTime.TabIndex = 4;\n            this.lblProductionTime.Text = \"Manufacturing Time:\";\n            // \n            // lblItem\n            // \n            this.lblItem.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblItem.AutoEllipsis = true;\n            this.lblItem.BackColor = System.Drawing.SystemColors.Control;\n            this.lblItem.Cursor = System.Windows.Forms.Cursors.Hand;\n            this.lblItem.ForeColor = System.Drawing.Color.Blue;\n            this.lblItem.Location = new System.Drawing.Point(7, 30);\n            this.lblItem.Name = \"lblItem\";\n            this.lblItem.Size = new System.Drawing.Size(210, 13);\n            this.lblItem.TabIndex = 8;\n            this.lblItem.Text = \"Item\";\n            this.lblItem.Click += new System.EventHandler(this.lblItem_Click);\n            // \n            // lblRunsPerCopy\n            // \n            this.lblRunsPerCopy.AutoSize = true;\n            this.lblRunsPerCopy.BackColor = System.Drawing.SystemColors.Control;\n            this.lblRunsPerCopy.Location = new System.Drawing.Point(110, 110);\n            this.lblRunsPerCopy.Name = \"lblRunsPerCopy\";\n            this.lblRunsPerCopy.Size = new System.Drawing.Size(78, 13);\n            this.lblRunsPerCopy.TabIndex = 12;\n            this.lblRunsPerCopy.Text = \"Runs Per Copy\";\n            // \n            // lblProductionBaseTime\n            // \n            this.lblProductionBaseTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblProductionBaseTime.AutoEllipsis = true;\n            this.lblProductionBaseTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblProductionBaseTime.Location = new System.Drawing.Point(16, 29);\n            this.lblProductionBaseTime.Name = \"lblProductionBaseTime\";\n            this.lblProductionBaseTime.Size = new System.Drawing.Size(200, 13);\n            this.lblProductionBaseTime.TabIndex = 13;\n            this.lblProductionBaseTime.Text = \"Base Time\";\n            // \n            // lblProductionCharTime\n            // \n            this.lblProductionCharTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblProductionCharTime.AutoEllipsis = true;\n            this.lblProductionCharTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblProductionCharTime.Location = new System.Drawing.Point(16, 42);\n            this.lblProductionCharTime.Name = \"lblProductionCharTime\";\n            this.lblProductionCharTime.Size = new System.Drawing.Size(200, 13);\n            this.lblProductionCharTime.TabIndex = 14;\n            this.lblProductionCharTime.Text = \"You\";\n            // \n            // lblResearchMECharTime\n            // \n            this.lblResearchMECharTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblResearchMECharTime.AutoEllipsis = true;\n            this.lblResearchMECharTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblResearchMECharTime.Location = new System.Drawing.Point(16, 42);\n            this.lblResearchMECharTime.Name = \"lblResearchMECharTime\";\n            this.lblResearchMECharTime.Size = new System.Drawing.Size(200, 13);\n            this.lblResearchMECharTime.TabIndex = 17;\n            this.lblResearchMECharTime.Text = \"You\";\n            // \n            // lblResearchMEBaseTime\n            // \n            this.lblResearchMEBaseTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblResearchMEBaseTime.AutoEllipsis = true;\n            this.lblResearchMEBaseTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblResearchMEBaseTime.Location = new System.Drawing.Point(16, 29);\n            this.lblResearchMEBaseTime.Name = \"lblResearchMEBaseTime\";\n            this.lblResearchMEBaseTime.Size = new System.Drawing.Size(200, 13);\n            this.lblResearchMEBaseTime.TabIndex = 16;\n            this.lblResearchMEBaseTime.Text = \"Base Time\";\n            // \n            // lblResearchME\n            // \n            this.lblResearchME.AutoSize = true;\n            this.lblResearchME.BackColor = System.Drawing.SystemColors.Control;\n            this.lblResearchME.Location = new System.Drawing.Point(6, 16);\n            this.lblResearchME.Name = \"lblResearchME\";\n            this.lblResearchME.Size = new System.Drawing.Size(122, 13);\n            this.lblResearchME.TabIndex = 15;\n            this.lblResearchME.Text = \"Research Material Time:\";\n            // \n            // lblResearchCopyCharTime\n            // \n            this.lblResearchCopyCharTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblResearchCopyCharTime.AutoEllipsis = true;\n            this.lblResearchCopyCharTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblResearchCopyCharTime.Location = new System.Drawing.Point(16, 88);\n            this.lblResearchCopyCharTime.Name = \"lblResearchCopyCharTime\";\n            this.lblResearchCopyCharTime.Size = new System.Drawing.Size(200, 13);\n            this.lblResearchCopyCharTime.TabIndex = 20;\n            this.lblResearchCopyCharTime.Text = \"You\";\n            // \n            // lblResearchCopyBaseTime\n            // \n            this.lblResearchCopyBaseTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblResearchCopyBaseTime.AutoEllipsis = true;\n            this.lblResearchCopyBaseTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblResearchCopyBaseTime.Location = new System.Drawing.Point(16, 75);\n            this.lblResearchCopyBaseTime.Name = \"lblResearchCopyBaseTime\";\n            this.lblResearchCopyBaseTime.Size = new System.Drawing.Size(200, 13);\n            this.lblResearchCopyBaseTime.TabIndex = 19;\n            this.lblResearchCopyBaseTime.Text = \"Base Time\";\n            // \n            // lblResearchCopy\n            // \n            this.lblResearchCopy.AutoSize = true;\n            this.lblResearchCopy.BackColor = System.Drawing.SystemColors.Control;\n            this.lblResearchCopy.Location = new System.Drawing.Point(6, 62);\n            this.lblResearchCopy.Name = \"lblResearchCopy\";\n            this.lblResearchCopy.Size = new System.Drawing.Size(216, 13);\n            this.lblResearchCopy.TabIndex = 18;\n            this.lblResearchCopy.Text = \"Research Copy Time (Single Run Per Copy):\";\n            // \n            // lblResearchTECharTime\n            // \n            this.lblResearchTECharTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblResearchTECharTime.AutoEllipsis = true;\n            this.lblResearchTECharTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblResearchTECharTime.Location = new System.Drawing.Point(16, 134);\n            this.lblResearchTECharTime.Name = \"lblResearchTECharTime\";\n            this.lblResearchTECharTime.Size = new System.Drawing.Size(200, 13);\n            this.lblResearchTECharTime.TabIndex = 23;\n            this.lblResearchTECharTime.Text = \"You\";\n            // \n            // lblResearchTEBaseTime\n            // \n            this.lblResearchTEBaseTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblResearchTEBaseTime.AutoEllipsis = true;\n            this.lblResearchTEBaseTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblResearchTEBaseTime.Location = new System.Drawing.Point(16, 121);\n            this.lblResearchTEBaseTime.Name = \"lblResearchTEBaseTime\";\n            this.lblResearchTEBaseTime.Size = new System.Drawing.Size(200, 13);\n            this.lblResearchTEBaseTime.TabIndex = 22;\n            this.lblResearchTEBaseTime.Text = \"Base Time\";\n            // \n            // lblResearchTE\n            // \n            this.lblResearchTE.AutoSize = true;\n            this.lblResearchTE.BackColor = System.Drawing.SystemColors.Control;\n            this.lblResearchTE.Location = new System.Drawing.Point(6, 108);\n            this.lblResearchTE.Name = \"lblResearchTE\";\n            this.lblResearchTE.Size = new System.Drawing.Size(140, 13);\n            this.lblResearchTE.TabIndex = 21;\n            this.lblResearchTE.Text = \"Research Productivity Time:\";\n            // \n            // lblInvention\n            // \n            this.lblInvention.AutoSize = true;\n            this.lblInvention.BackColor = System.Drawing.SystemColors.Control;\n            this.lblInvention.Location = new System.Drawing.Point(6, 46);\n            this.lblInvention.Name = \"lblInvention\";\n            this.lblInvention.Size = new System.Drawing.Size(45, 13);\n            this.lblInvention.TabIndex = 24;\n            this.lblInvention.Text = \"Invents:\";\n            // \n            // gbGeneralInfo\n            // \n            this.gbGeneralInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.gbGeneralInfo.BackColor = System.Drawing.SystemColors.Control;\n            this.gbGeneralInfo.Controls.Add(this.lblSuccessProbability);\n            this.gbGeneralInfo.Controls.Add(this.lblProbability);\n            this.gbGeneralInfo.Controls.Add(this.InventBlueprintListBox);\n            this.gbGeneralInfo.Controls.Add(this.lblProduce);\n            this.gbGeneralInfo.Controls.Add(this.lblProductionLimit);\n            this.gbGeneralInfo.Controls.Add(this.lblInvention);\n            this.gbGeneralInfo.Controls.Add(this.lblItem);\n            this.gbGeneralInfo.Controls.Add(this.lblRunsPerCopy);\n            this.gbGeneralInfo.Location = new System.Drawing.Point(3, 5);\n            this.gbGeneralInfo.Name = \"gbGeneralInfo\";\n            this.gbGeneralInfo.Size = new System.Drawing.Size(224, 130);\n            this.gbGeneralInfo.TabIndex = 26;\n            this.gbGeneralInfo.TabStop = false;\n            this.gbGeneralInfo.Text = \"GENERAL INFORMATION\";\n            // \n            // lblSuccessProbability\n            // \n            this.lblSuccessProbability.AutoSize = true;\n            this.lblSuccessProbability.BackColor = System.Drawing.SystemColors.Control;\n            this.lblSuccessProbability.Location = new System.Drawing.Point(6, 94);\n            this.lblSuccessProbability.Name = \"lblSuccessProbability\";\n            this.lblSuccessProbability.Size = new System.Drawing.Size(102, 13);\n            this.lblSuccessProbability.TabIndex = 25;\n            this.lblSuccessProbability.Text = \"Success Probability:\";\n            // \n            // lblProbability\n            // \n            this.lblProbability.AutoSize = true;\n            this.lblProbability.BackColor = System.Drawing.SystemColors.Control;\n            this.lblProbability.Location = new System.Drawing.Point(110, 94);\n            this.lblProbability.Name = \"lblProbability\";\n            this.lblProbability.Size = new System.Drawing.Size(66, 13);\n            this.lblProbability.TabIndex = 26;\n            this.lblProbability.Text = \"Probability %\";\n            // \n            // InventBlueprintListBox\n            // \n            this.InventBlueprintListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.InventBlueprintListBox.BackColor = System.Drawing.SystemColors.Control;\n            this.InventBlueprintListBox.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.InventBlueprintListBox.Cursor = System.Windows.Forms.Cursors.Default;\n            this.InventBlueprintListBox.ForeColor = System.Drawing.Color.Blue;\n            this.InventBlueprintListBox.Location = new System.Drawing.Point(9, 61);\n            this.InventBlueprintListBox.Name = \"InventBlueprintListBox\";\n            this.InventBlueprintListBox.Size = new System.Drawing.Size(209, 26);\n            this.InventBlueprintListBox.Sorted = true;\n            this.InventBlueprintListBox.TabIndex = 1;\n            this.InventBlueprintListBox.TabStop = false;\n            this.InventBlueprintListBox.SelectedIndexChanged += new System.EventHandler(this.InventBlueprintListBox_SelectedIndexChanged);\n            this.InventBlueprintListBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.InventBlueprintListBox_MouseMove);\n            // \n            // gbResearching\n            // \n            this.gbResearching.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.gbResearching.BackColor = System.Drawing.SystemColors.Control;\n            this.gbResearching.Controls.Add(this.lblResearchME);\n            this.gbResearching.Controls.Add(this.lblResearchTECharTime);\n            this.gbResearching.Controls.Add(this.lblResearchMEBaseTime);\n            this.gbResearching.Controls.Add(this.lblResearchTEBaseTime);\n            this.gbResearching.Controls.Add(this.lblResearchMECharTime);\n            this.gbResearching.Controls.Add(this.lblResearchTE);\n            this.gbResearching.Controls.Add(this.lblResearchCopy);\n            this.gbResearching.Controls.Add(this.lblResearchCopyCharTime);\n            this.gbResearching.Controls.Add(this.lblResearchCopyBaseTime);\n            this.gbResearching.Location = new System.Drawing.Point(3, 202);\n            this.gbResearching.Name = \"gbResearching\";\n            this.gbResearching.Size = new System.Drawing.Size(224, 155);\n            this.gbResearching.TabIndex = 1;\n            this.gbResearching.TabStop = false;\n            this.gbResearching.Text = \"RESEARCHING\";\n            // \n            // gbManufacturing\n            // \n            this.gbManufacturing.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.gbManufacturing.BackColor = System.Drawing.SystemColors.Control;\n            this.gbManufacturing.Controls.Add(this.lblProductionCharTime);\n            this.gbManufacturing.Controls.Add(this.lblProductionTime);\n            this.gbManufacturing.Controls.Add(this.lblProductionBaseTime);\n            this.gbManufacturing.Location = new System.Drawing.Point(3, 137);\n            this.gbManufacturing.Name = \"gbManufacturing\";\n            this.gbManufacturing.Size = new System.Drawing.Size(224, 60);\n            this.gbManufacturing.TabIndex = 27;\n            this.gbManufacturing.TabStop = false;\n            this.gbManufacturing.Text = \"MANUFACTURING\";\n            // \n            // pnlAttributes\n            // \n            this.pnlAttributes.BackColor = System.Drawing.SystemColors.Control;\n            this.pnlAttributes.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\n            this.pnlAttributes.Controls.Add(this.gbReactions);\n            this.pnlAttributes.Controls.Add(this.gbInvention);\n            this.pnlAttributes.Controls.Add(this.gbResearching);\n            this.pnlAttributes.Controls.Add(this.gbGeneralInfo);\n            this.pnlAttributes.Controls.Add(this.gbManufacturing);\n            this.pnlAttributes.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pnlAttributes.Location = new System.Drawing.Point(3, 16);\n            this.pnlAttributes.Name = \"pnlAttributes\";\n            this.pnlAttributes.Padding = new System.Windows.Forms.Padding(0, 5, 0, 0);\n            this.pnlAttributes.Size = new System.Drawing.Size(234, 503);\n            this.pnlAttributes.TabIndex = 1;\n            // \n            // gbReactions\n            // \n            this.gbReactions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.gbReactions.BackColor = System.Drawing.SystemColors.Control;\n            this.gbReactions.Controls.Add(this.lblReactionCharTime);\n            this.gbReactions.Controls.Add(this.lblReactionTime);\n            this.gbReactions.Controls.Add(this.lblReactionBaseTime);\n            this.gbReactions.Location = new System.Drawing.Point(3, 432);\n            this.gbReactions.Name = \"gbReactions\";\n            this.gbReactions.Size = new System.Drawing.Size(224, 64);\n            this.gbReactions.TabIndex = 29;\n            this.gbReactions.TabStop = false;\n            this.gbReactions.Text = \"REACTIONS\";\n            // \n            // lblReactionCharTime\n            // \n            this.lblReactionCharTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblReactionCharTime.AutoEllipsis = true;\n            this.lblReactionCharTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblReactionCharTime.Location = new System.Drawing.Point(16, 42);\n            this.lblReactionCharTime.Name = \"lblReactionCharTime\";\n            this.lblReactionCharTime.Size = new System.Drawing.Size(200, 13);\n            this.lblReactionCharTime.TabIndex = 24;\n            this.lblReactionCharTime.Text = \"You\";\n            // \n            // lblReactionTime\n            // \n            this.lblReactionTime.AutoSize = true;\n            this.lblReactionTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblReactionTime.Location = new System.Drawing.Point(6, 16);\n            this.lblReactionTime.Name = \"lblReactionTime\";\n            this.lblReactionTime.Size = new System.Drawing.Size(79, 13);\n            this.lblReactionTime.TabIndex = 15;\n            this.lblReactionTime.Text = \"Reaction Time:\";\n            // \n            // lblReactionBaseTime\n            // \n            this.lblReactionBaseTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblReactionBaseTime.AutoEllipsis = true;\n            this.lblReactionBaseTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblReactionBaseTime.Location = new System.Drawing.Point(16, 29);\n            this.lblReactionBaseTime.Name = \"lblReactionBaseTime\";\n            this.lblReactionBaseTime.Size = new System.Drawing.Size(200, 13);\n            this.lblReactionBaseTime.TabIndex = 16;\n            this.lblReactionBaseTime.Text = \"Base Time\";\n            // \n            // gbInvention\n            // \n            this.gbInvention.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.gbInvention.BackColor = System.Drawing.SystemColors.Control;\n            this.gbInvention.Controls.Add(this.lblInventionCharTime);\n            this.gbInvention.Controls.Add(this.lblInventionTime);\n            this.gbInvention.Controls.Add(this.lblInventionBaseTime);\n            this.gbInvention.Location = new System.Drawing.Point(3, 362);\n            this.gbInvention.Name = \"gbInvention\";\n            this.gbInvention.Size = new System.Drawing.Size(224, 64);\n            this.gbInvention.TabIndex = 28;\n            this.gbInvention.TabStop = false;\n            this.gbInvention.Text = \"INVENTION\";\n            // \n            // lblInventionCharTime\n            // \n            this.lblInventionCharTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblInventionCharTime.AutoEllipsis = true;\n            this.lblInventionCharTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblInventionCharTime.Location = new System.Drawing.Point(16, 42);\n            this.lblInventionCharTime.Name = \"lblInventionCharTime\";\n            this.lblInventionCharTime.Size = new System.Drawing.Size(200, 13);\n            this.lblInventionCharTime.TabIndex = 24;\n            this.lblInventionCharTime.Text = \"You\";\n            // \n            // lblInventionTime\n            // \n            this.lblInventionTime.AutoSize = true;\n            this.lblInventionTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblInventionTime.Location = new System.Drawing.Point(6, 16);\n            this.lblInventionTime.Name = \"lblInventionTime\";\n            this.lblInventionTime.Size = new System.Drawing.Size(80, 13);\n            this.lblInventionTime.TabIndex = 15;\n            this.lblInventionTime.Text = \"Invention Time:\";\n            // \n            // lblInventionBaseTime\n            // \n            this.lblInventionBaseTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblInventionBaseTime.AutoEllipsis = true;\n            this.lblInventionBaseTime.BackColor = System.Drawing.SystemColors.Control;\n            this.lblInventionBaseTime.Location = new System.Drawing.Point(16, 29);\n            this.lblInventionBaseTime.Name = \"lblInventionBaseTime\";\n            this.lblInventionBaseTime.Size = new System.Drawing.Size(200, 13);\n            this.lblInventionBaseTime.TabIndex = 16;\n            this.lblInventionBaseTime.Text = \"Base Time\";\n            // \n            // gbReactionsBoM\n            // \n            this.gbReactionsBoM.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.gbReactionsBoM.Controls.Add(this.lvReactions);\n            this.gbReactionsBoM.Location = new System.Drawing.Point(3, 3);\n            this.gbReactionsBoM.Name = \"gbReactionsBoM\";\n            this.gbReactionsBoM.Size = new System.Drawing.Size(608, 533);\n            this.gbReactionsBoM.TabIndex = 0;\n            this.gbReactionsBoM.TabStop = false;\n            this.gbReactionsBoM.Text = \"Reaction Materials\";\n            // \n            // lvReactions\n            // \n            this.lvReactions.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.columnHeader1,\n            this.columnHeader2,\n            this.columnHeader3});\n            this.lvReactions.ContextMenuStrip = this.BlueprintAttributeContextMenu;\n            this.lvReactions.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvReactions.FullRowSelect = true;\n            this.lvReactions.HideSelection = false;\n            this.lvReactions.Location = new System.Drawing.Point(3, 16);\n            this.lvReactions.MultiSelect = false;\n            this.lvReactions.Name = \"lvReactions\";\n            this.lvReactions.Size = new System.Drawing.Size(602, 514);\n            this.lvReactions.TabIndex = 1;\n            this.lvReactions.UseCompatibleStateImageBehavior = false;\n            this.lvReactions.View = System.Windows.Forms.View.Details;\n            // \n            // columnHeader1\n            // \n            this.columnHeader1.Text = \"Item\";\n            this.columnHeader1.Width = 120;\n            // \n            // columnHeader2\n            // \n            this.columnHeader2.Text = \"Quantity (Base)\";\n            this.columnHeader2.Width = 86;\n            // \n            // columnHeader3\n            // \n            this.columnHeader3.Text = \"Quantity (You)\";\n            this.columnHeader3.Width = 82;\n            // \n            // BlueprintBrowserControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.DoubleBuffered = true;\n            this.Name = \"BlueprintBrowserControl\";\n            this.Size = new System.Drawing.Size(1034, 700);\n            this.Controls.SetChildIndex(this.scObjectBrowser, 0);\n            this.scObjectBrowser.Panel1.ResumeLayout(false);\n            this.scObjectBrowser.Panel1.PerformLayout();\n            this.scObjectBrowser.Panel2.ResumeLayout(false);\n            this.scObjectBrowser.Panel2.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.scObjectBrowser)).EndInit();\n            this.scObjectBrowser.ResumeLayout(false);\n            this.pnlDetails.ResumeLayout(false);\n            this.pnlBrowserHeader.ResumeLayout(false);\n            this.pnlBrowserHeader.PerformLayout();\n            this.scDetailsRight.Panel1.ResumeLayout(false);\n            this.scDetailsRight.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.scDetailsRight)).EndInit();\n            this.scDetailsRight.ResumeLayout(false);\n            this.scDetails.Panel1.ResumeLayout(false);\n            this.scDetails.Panel1.PerformLayout();\n            this.scDetails.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.scDetails)).EndInit();\n            this.scDetails.ResumeLayout(false);\n            this.gbDescription.ResumeLayout(false);\n            this.gbRequiredSkills.ResumeLayout(false);\n            this.tabControl.ResumeLayout(false);\n            this.tpManufacturing.ResumeLayout(false);\n            this.gbManufBoM.ResumeLayout(false);\n            this.BlueprintAttributeContextMenu.ResumeLayout(false);\n            this.tpResearchME.ResumeLayout(false);\n            this.gbResearchMEBoM.ResumeLayout(false);\n            this.tpResearchTE.ResumeLayout(false);\n            this.gbResearchTEBoM.ResumeLayout(false);\n            this.tpCopying.ResumeLayout(false);\n            this.gbCopyBoM.ResumeLayout(false);\n            this.tpInvention.ResumeLayout(false);\n            this.gbInvBoM.ResumeLayout(false);\n            this.tpReactions.ResumeLayout(false);\n            this.tlpModifiers.ResumeLayout(false);\n            this.tlpModifiers.PerformLayout();\n            this.flpUpper.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.nudME)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.nudTE)).EndInit();\n            this.flpLower.ResumeLayout(false);\n            this.gbGeneralInfo.ResumeLayout(false);\n            this.gbGeneralInfo.PerformLayout();\n            this.gbResearching.ResumeLayout(false);\n            this.gbResearching.PerformLayout();\n            this.gbManufacturing.ResumeLayout(false);\n            this.gbManufacturing.PerformLayout();\n            this.pnlAttributes.ResumeLayout(false);\n            this.gbReactions.ResumeLayout(false);\n            this.gbReactions.PerformLayout();\n            this.gbInvention.ResumeLayout(false);\n            this.gbInvention.PerformLayout();\n            this.gbReactionsBoM.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.GroupBox gbRequiredSkills;\n        private RequiredSkillsControl requiredSkillsControl;\n        private System.Windows.Forms.TabControl tabControl;\n        private System.Windows.Forms.TabPage tpManufacturing;\n        private System.Windows.Forms.ListView lvManufacturing;\n        private System.Windows.Forms.TabPage tpInvention;\n        private System.Windows.Forms.GroupBox gbManufBoM;\n        private System.Windows.Forms.ColumnHeader chManufItem;\n        private BlueprintSelectControl blueprintSelectControl;\n        private System.Windows.Forms.GroupBox gbInvBoM;\n        private System.Windows.Forms.ListView lvInvention;\n        private System.Windows.Forms.Label lblProduce;\n        private System.Windows.Forms.Label lblProductionTime;\n        private System.Windows.Forms.Label lblProductionLimit;\n        private System.Windows.Forms.Label lblRunsPerCopy;\n        private System.Windows.Forms.NumericUpDown nudTE;\n        private System.Windows.Forms.NumericUpDown nudME;\n        private System.Windows.Forms.Label lblItem;\n        private System.Windows.Forms.Label lblProductionCharTime;\n        private System.Windows.Forms.Label lblProductionBaseTime;\n        private System.Windows.Forms.Label lblResearchMECharTime;\n        private System.Windows.Forms.Label lblResearchMEBaseTime;\n        private System.Windows.Forms.Label lblResearchME;\n        private System.Windows.Forms.Label lblResearchTECharTime;\n        private System.Windows.Forms.Label lblResearchTEBaseTime;\n        private System.Windows.Forms.Label lblResearchTE;\n        private System.Windows.Forms.Label lblResearchCopyCharTime;\n        private System.Windows.Forms.Label lblResearchCopyBaseTime;\n        private System.Windows.Forms.Label lblResearchCopy;\n        private System.Windows.Forms.Label lblInvention;\n        private System.Windows.Forms.TabPage tpCopying;\n        private System.Windows.Forms.TabPage tpResearchTE;\n        private System.Windows.Forms.GroupBox gbResearchTEBoM;\n        private System.Windows.Forms.ListView lvResearchTE;\n        private System.Windows.Forms.GroupBox gbCopyBoM;\n        private System.Windows.Forms.ListView lvCopying;\n        private System.Windows.Forms.TabPage tpResearchME;\n        private System.Windows.Forms.GroupBox gbResearchMEBoM;\n        private System.Windows.Forms.ListView lvResearchME;\n        private System.Windows.Forms.GroupBox gbGeneralInfo;\n        private System.Windows.Forms.GroupBox gbManufacturing;\n        private System.Windows.Forms.GroupBox gbResearching;\n        private System.Windows.Forms.Panel pnlAttributes;\n        private System.Windows.Forms.ComboBox cbFacility;\n        private System.Windows.Forms.ComboBox cbImplantSet;\n        private System.Windows.Forms.ListBox InventBlueprintListBox;\n        private System.Windows.Forms.Label lblMaterialEfficiency;\n        private System.Windows.Forms.Label lblTimeEfficiency;\n        private System.Windows.Forms.TableLayoutPanel tlpModifiers;\n        private System.Windows.Forms.FlowLayoutPanel flpUpper;\n        private System.Windows.Forms.FlowLayoutPanel flpLower;\n        private System.Windows.Forms.GroupBox gbInvention;\n        private System.Windows.Forms.Label lblInventionTime;\n        private System.Windows.Forms.Label lblInventionBaseTime;\n        private System.Windows.Forms.Label lblNoItemTE;\n        private System.Windows.Forms.Label lblNoItemME;\n        private System.Windows.Forms.ContextMenuStrip BlueprintAttributeContextMenu;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n        private System.Windows.Forms.ColumnHeader chManufQuantityBase;\n        private System.Windows.Forms.ColumnHeader chManufQuantityYou;\n        private System.Windows.Forms.Label lblInventionCharTime;\n        private System.Windows.Forms.Label lblNoItemCopy;\n        private System.Windows.Forms.Label lblSuccessProbability;\n        private System.Windows.Forms.Label lblProbability;\n        private System.Windows.Forms.Label lblNoItemManufacturing;\n        private System.Windows.Forms.Label lblNoItemInvention;\n        private System.Windows.Forms.ToolStripMenuItem showInMenuItem;\n        private System.Windows.Forms.ToolStripSeparator showInMenuSeparator;\n        private System.Windows.Forms.TabPage tpReactions;\n        private System.Windows.Forms.GroupBox gbReactions;\n        private System.Windows.Forms.Label lblReactionCharTime;\n        private System.Windows.Forms.Label lblReactionTime;\n        private System.Windows.Forms.Label lblReactionBaseTime;\n        private System.Windows.Forms.GroupBox gbReactionsBoM;\n        private System.Windows.Forms.ListView lvReactions;\n        private System.Windows.Forms.ColumnHeader columnHeader1;\n        private System.Windows.Forms.ColumnHeader columnHeader2;\n        private System.Windows.Forms.ColumnHeader columnHeader3;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/BlueprintBrowserControl.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.SkillPlanner\n{\n    internal partial class BlueprintBrowserControl : EveObjectBrowserControl\n    {\n        private double m_materialFacilityMultiplier;\n        private bool m_hasManufacturing;\n        private bool m_hasCopying;\n        private bool m_hasResearchingMaterialEfficiency;\n        private bool m_hasResearchingTimeEfficiency;\n        private bool m_hasInvention;\n        private bool m_hasReactions;\n\n        private Blueprint m_blueprint;\n        private BlueprintActivity m_activity;\n        private readonly Point m_gbManufOriginalLocation;\n        private readonly Point m_gbResearchingOriginalLocation;\n        private readonly Point m_gbInventionOriginalLocation;\n        private readonly Point m_gbReactionsOriginalLocation;\n\n        #region Constructors\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public BlueprintBrowserControl()\n        {\n            InitializeComponent();\n\n            scObjectBrowser.RememberDistanceKey = \"BlueprintBrowser_Left\";\n            SelectControl = blueprintSelectControl;\n            PropertiesList = lvManufacturing;\n\n            PropertiesList.MouseDown += PropertiesList_MouseDown;\n            PropertiesList.MouseMove += PropertiesList_MouseMove;\n\n            m_gbManufOriginalLocation = gbManufacturing.Location;\n            m_gbResearchingOriginalLocation = gbResearching.Location;\n            m_gbInventionOriginalLocation = gbInvention.Location;\n            m_gbReactionsOriginalLocation = gbReactions.Location;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Occurs when the control is loaded.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            // Call the base method\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            lblNoItemManufacturing.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n            lblNoItemCopy.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n            lblNoItemME.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n            lblNoItemTE.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n            lblNoItemInvention.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n\n            lblHelp.Text = Properties.Resources.MessageBlueprintSelect;\n            gbDescription.Text = @\"Attributes\";\n            pnlAttributes.AutoScroll = true;\n\n            // Update ImplantSet Modifier\n            UpdateImplantSetModifier();\n        }\n\n        /// <summary>\n        /// Updates the controls when the selection is changed.\n        /// </summary>\n        protected override void OnSelectionChanged()\n        {\n            // Call the base method\n            base.OnSelectionChanged();\n\n            if (SelectedObject == null)\n                return;\n\n            m_blueprint = SelectedObject as Blueprint;\n\n            // Update Tabs\n            UpdateTabs();\n\n            // Get the acitvity\n            m_activity = GetActivity();\n\n            // Update Required Skills\n            requiredSkillsControl.Object = SelectedObject;\n            requiredSkillsControl.Activity = m_activity;\n\n            // Update Facility Modifier\n            UpdateFacilityModifier();\n        }\n\n        /// <summary>\n        /// Updates whenever the selected plan changed.\n        /// </summary>\n        protected override void OnSelectedPlanChanged()\n        {\n            base.OnSelectedPlanChanged();\n\n            if (Plan == null)\n            {\n                gbRequiredSkills.Hide();\n                return;\n            }\n\n            requiredSkillsControl.Plan = Plan;\n\n            // We recalculate the right panels minimum size\n            int reqSkillControlMinWidth = requiredSkillsControl.MinimumSize.Width;\n            int reqSkillPanelMinWidth = scDetails.Panel2MinSize;\n            scDetails.Panel2MinSize = reqSkillPanelMinWidth > reqSkillControlMinWidth ?\n                reqSkillPanelMinWidth : reqSkillControlMinWidth;\n        }\n\n        /// <summary>\n        /// Updates the implant modifier list when the settings changed.\n        /// </summary>\n        protected override void OnSettingsChanged()\n        {\n            base.OnSettingsChanged();\n            UpdateImplantSetModifier();\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Replaces the user set search string with another.\n        /// </summary>\n        /// <param name=\"text\">The text to replace it with.</param>\n        internal void SetSearchText(string text)\n        {\n            blueprintSelectControl.SearchText = text;\n        }\n\n        /// <summary>\n        /// Create the necessary tabs.\n        /// </summary>\n        private void UpdateTabs()\n        {\n            // Hide the tab control if the selected tab is not the first\n            // (avoids tab creation be visible to user)\n            if (tabControl.SelectedIndex != 0)\n                tabControl.Hide();\n\n            tabControl.SuspendLayout();\n            try\n            {\n                RefreshTabs();\n            }\n            finally\n            {\n                tabControl.ResumeLayout(true);\n                tabControl.Show();\n            }\n        }\n\n        /// <summary>\n        /// Refreshes the tabs.\n        /// </summary>\n        private void RefreshTabs()\n        {\n            // Determine the blueprints' activities  \n            SetActivities();\n\n            // Store the visible selector control for later use\n            Control visibleSelector;\n            if (blueprintSelectControl.tvItems.Visible)\n                visibleSelector = blueprintSelectControl.tvItems;\n            else\n                visibleSelector = blueprintSelectControl.lbSearchList;\n\n            // Store the selected tab index for later use\n            int storedTabIndex = tabControl.SelectedIndex;\n\n            tabControl.TabPages.Clear();\n\n            // Add the appropriate tabs\n            if (m_hasManufacturing)\n                tabControl.TabPages.Add(tpManufacturing);\n\n            if (m_hasResearchingMaterialEfficiency)\n                tabControl.TabPages.Add(tpResearchME);\n\n            if (m_hasResearchingTimeEfficiency)\n                tabControl.TabPages.Add(tpResearchTE);\n\n            if (m_hasCopying)\n                tabControl.TabPages.Add(tpCopying);\n\n            if (m_hasInvention)\n                tabControl.TabPages.Add(tpInvention);\n\n            if (m_hasReactions)\n                tabControl.TabPages.Add(tpReactions);\n\n            // Restore the index of the previous selected tab,\n            // if the index doesn't exist it smartly selects\n            // the first one by its own\n            tabControl.SelectedIndex = storedTabIndex;\n\n            // Return focus to selector\n            visibleSelector.Focus();\n        }\n\n        /// <summary>\n        /// Sets the activities.\n        /// </summary>\n        private void SetActivities()\n        {\n            bool manufacturing = false, copying = false, me = false, te = false, invention =\n                false, reactions = false;\n            // Search prerequisites for activities\n            foreach (var prereq in m_blueprint.Prerequisites)\n                switch (prereq.Activity)\n                {\n                    case BlueprintActivity.Manufacturing:\n                        manufacturing = true;\n                        break;\n                    case BlueprintActivity.Copying:\n                        copying = true;\n                        break;\n                    case BlueprintActivity.ResearchingMaterialEfficiency:\n                        me = true;\n                        break;\n                    case BlueprintActivity.ResearchingTimeEfficiency:\n                        te = true;\n                        break;\n                    case BlueprintActivity.Invention:\n                        invention = true;\n                        break;\n                    case BlueprintActivity.SimpleReactions:\n                        reactions = true;\n                        break;\n                    case BlueprintActivity.Reactions:\n                        reactions = true;\n                        break;\n                    default:\n                        break;\n                }\n            // Search materials for activities\n            foreach (var prereq in m_blueprint.MaterialRequirements)\n                switch (prereq.Activity)\n                {\n                    case BlueprintActivity.Manufacturing:\n                        manufacturing = true;\n                        break;\n                    case BlueprintActivity.Copying:\n                        copying = true;\n                        break;\n                    case BlueprintActivity.ResearchingMaterialEfficiency:\n                        me = true;\n                        break;\n                    case BlueprintActivity.ResearchingTimeEfficiency:\n                        te = true;\n                        break;\n                    case BlueprintActivity.Invention:\n                        invention = true;\n                        break;\n                    case BlueprintActivity.SimpleReactions:\n                        reactions = true;\n                        break;\n                    case BlueprintActivity.Reactions:\n                        reactions = true;\n                        break;\n                    default:\n                        break;\n                }\n\n            m_hasManufacturing = manufacturing && m_blueprint.ProductionTime > 0d;\n            m_hasCopying = copying && m_blueprint.ResearchCopyTime > 0d;\n            m_hasResearchingMaterialEfficiency = me && m_blueprint.ResearchMaterialTime > 0d;\n            m_hasResearchingTimeEfficiency = te && m_blueprint.ResearchProductivityTime > 0d;\n            m_hasInvention = invention && m_blueprint.ResearchInventionTime > 0d;\n            m_hasReactions = reactions && m_blueprint.ReactionTime > 0d;\n        }\n\n        /// <summary>\n        /// Update the attributes info.\n        /// </summary>\n        private void UpdateAttributes()\n        {\n            // Produce item\n            lblItem.ForeColor = Color.Blue;\n            if ((m_blueprint.ProducesItem?.ID ?? 0) != 0)\n            {\n                var item = m_blueprint.ProducesItem;\n                lblItem.Text = item.Name;\n                lblItem.Tag = item;\n            }\n            else if (m_blueprint.ReactionOutcome?.Item != null)\n            {\n                var item = m_blueprint.ReactionOutcome.Item;\n                lblItem.Text = item.Name;\n                lblItem.Tag = item;\n            }\n\n            // Invented blueprints\n            InventBlueprintListBox.Items.Clear();\n            foreach (KeyValuePair<Blueprint, decimal> item in m_blueprint.InventBlueprints)\n            {\n                InventBlueprintListBox.Items.Add(item.Key);\n            }\n\n            // Success probability\n            lblSuccessProbability.Visible = lblProbability.Visible = m_blueprint.InventBlueprints.Any();\n            if (lblProbability.Visible)\n            {\n                decimal baseProbability = m_blueprint.InventBlueprints.Max(x => x.Value);\n                lblProbability.Text = $\"{baseProbability:P1} (You: {baseProbability * GetProbabilityModifier():P1})\";\n            }\n\n            // Runs per copy\n            lblRunsPerCopy.Text = m_blueprint.RunsPerCopy.ToString(CultureConstants.DefaultCulture);\n\n            // Manufacturing base time\n            double activityTime = (int)(m_blueprint.ProductionTime * GetTimeEfficiencyModifier(\n                BlueprintActivity.Manufacturing)) * GetFacilityManufacturingAndMaterialMultiplier();\n            lblProductionBaseTime.Text = BaseActivityTime(activityTime);\n\n            // Reaction base time\n            double reactionTime = (int)(m_blueprint.ReactionTime * GetTimeEfficiencyModifier(\n                BlueprintActivity.Reactions)) * GetFacilityManufacturingAndMaterialMultiplier();\n            lblReactionBaseTime.Text = BaseActivityTime(reactionTime);\n\n            // Manufacturing character time\n            activityTime *= GetImplantMultiplier(DBConstants.ManufacturingModifyingImplantIDs);\n            lblProductionCharTime.Text = CharacterActivityTime(activityTime, DBConstants.\n                IndustrySkillID, DBConstants.AdvancedIndustrySkillID);\n\n            // Reactions character time\n            reactionTime *= GetImplantMultiplier(DBConstants.ManufacturingModifyingImplantIDs);\n            lblReactionCharTime.Text = CharacterActivityTime(activityTime, DBConstants.\n                ReactionsSkillID);\n\n            // Researching material efficiency base time\n            activityTime = (int)(m_blueprint.ResearchMaterialTime * GetTimeEfficiencyModifier(\n                BlueprintActivity.ResearchingMaterialEfficiency)) * GetFacilityResearchTimeMultiplier(\n                BlueprintActivity.ResearchingMaterialEfficiency);\n            lblResearchMEBaseTime.Text = BaseActivityTime(activityTime);\n\n            // Researching material efficiency character time\n            activityTime *= GetImplantMultiplier(DBConstants.ResearchMaterialEfficiencyTimeModifyingImplantIDs);\n            lblResearchMECharTime.Text = CharacterActivityTime(activityTime, DBConstants.\n                MetallurgySkillID, DBConstants.AdvancedIndustrySkillID);\n\n            // Researching copy base time\n            activityTime = (int)(m_blueprint.ResearchCopyTime * GetTimeEfficiencyModifier(\n                BlueprintActivity.Copying)) * GetFacilityResearchTimeMultiplier(BlueprintActivity.Copying);\n            lblResearchCopyBaseTime.Text = BaseActivityTime(activityTime);\n\n            // Researching copy character time\n            activityTime *= GetImplantMultiplier(DBConstants.ResearchCopyTimeModifyingImplantIDs);\n            lblResearchCopyCharTime.Text = CharacterActivityTime(activityTime, DBConstants.\n                ScienceSkillID, DBConstants.AdvancedIndustrySkillID);\n\n            // Researching time efficiency base time\n            activityTime = (int)(m_blueprint.ResearchProductivityTime *\n                                 GetTimeEfficiencyModifier(BlueprintActivity.ResearchingTimeEfficiency)) *\n                           GetFacilityResearchTimeMultiplier(BlueprintActivity.ResearchingTimeEfficiency);\n            lblResearchTEBaseTime.Text = BaseActivityTime(activityTime);\n\n            // Researching time efficiency character time\n            activityTime *= GetImplantMultiplier(DBConstants.ResearchTimeEfficiencyTimeModifyingImplantIDs);\n            lblResearchTECharTime.Text = CharacterActivityTime(activityTime, DBConstants.\n                ResearchSkillID, DBConstants.AdvancedIndustrySkillID);\n\n            if (m_hasReactions)\n            {\n                gbReactions.Visible = true;\n                gbManufacturing.Visible = gbResearching.Visible = gbInvention.Visible = false;\n                gbReactions.Location = m_gbManufOriginalLocation;\n            }\n            else\n            {\n                gbReactions.Visible = false;\n                gbManufacturing.Visible = m_hasManufacturing;\n                gbResearching.Location = gbManufacturing.Visible ? m_gbResearchingOriginalLocation :\n                    m_gbManufOriginalLocation;\n                gbResearching.Visible = m_hasCopying || m_hasResearchingMaterialEfficiency || m_hasResearchingTimeEfficiency;\n                gbInvention.Location = gbResearching.Visible ? m_gbInventionOriginalLocation : gbResearching.Location;\n                gbInvention.Visible = !gbResearching.Visible || m_hasInvention;\n                gbReactions.Location = m_gbReactionsOriginalLocation;\n            }\n\n            if (!gbInvention.Visible)\n                return;\n\n            // Invention time base time\n            activityTime = m_blueprint.ResearchInventionTime * GetFacilityResearchTimeMultiplier(\n                BlueprintActivity.Invention);\n            lblInventionBaseTime.Text = BaseActivityTime(activityTime);\n\n            // Invention character time\n            activityTime *= 1d;\n            lblInventionCharTime.Text = CharacterActivityTime(activityTime, 0, DBConstants.\n                AdvancedIndustrySkillID);\n        }\n\n        /// <summary>\n        /// Update the required materials list.\n        /// </summary>\n        private void UpdateRequiredMaterialsList()\n        {\n            int scrollBarPosition = PropertiesList.GetVerticalScrollBarPosition();\n\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = (PropertiesList.SelectedItems.Count > 0) ? PropertiesList.\n                SelectedItems[0].Tag.GetHashCode() : 0;\n\n            PropertiesList.BeginUpdate();\n            try\n            {\n                // Clear everything\n                PropertiesList.Items.Clear();\n                PropertiesList.Groups.Clear();\n                PropertiesList.Columns.Clear();\n\n                // Create the columns\n                PropertiesList.Columns.Add(\"item\", \"Item\");\n                PropertiesList.Columns.Add(\"qBase\", \"Quantity (Base)\");\n\n                if (Character != null)\n                    PropertiesList.Columns.Add(\"quant\", \"Quantity (You)\");\n\n                IEnumerable<ListViewItem> items = AddGroups();\n\n                // Add the items\n                PropertiesList.Items.AddRange(items.OrderBy(x => x.Text).ToArray());\n\n                // Show/Hide the \"no item required\" label and autoresize the columns \n                PropertiesList.Visible = PropertiesList.Items.Count > 0;\n\n                if (PropertiesList.Items.Count > 0)\n                    AdjustColumns();\n\n                if (selectedItem <= 0)\n                    return;\n\n                // Restore the selected item (if any)\n                foreach (ListViewItem lvItem in PropertiesList.Items.Cast<ListViewItem>().Where(\n                    lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                {\n                    lvItem.Selected = true;\n                }\n            }\n            finally\n            {\n                PropertiesList.EndUpdate();\n                PropertiesList.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Adds the groups.\n        /// </summary>\n        /// <returns></returns>\n        private IEnumerable<ListViewItem> AddGroups()\n        {\n            var items = new List<ListViewItem>();\n            double materiaEffModifier = 1d - (double)nudME.Value / 100;\n\n            foreach (var marketGroup in StaticItems.AllGroups)\n            {\n                // Create the groups\n                var group = new ListViewGroup(marketGroup.CategoryPath);\n                bool hasItem = false;\n                foreach (var material in m_blueprint.MaterialRequirements)\n                    if (material.Activity == m_activity && marketGroup.Items.Any(y => y.ID == material.ID))\n                    {\n                        hasItem = true;\n\n                        // Create the item\n                        var item = new ListViewItem(group)\n                        {\n                            Tag = StaticItems.GetItemByID(material.ID),\n                            Text = material.Name\n                        };\n\n                        // Add the item to the list\n                        items.Add(item);\n\n                        // Calculate the base material quantity\n                        long baseMaterialQuantity = material.Quantity;\n                        // Calculate the actual material quantity\n                        long actualMaterialQuantity = (long)Math.Ceiling(material.Quantity *\n                            materiaEffModifier * m_materialFacilityMultiplier);\n\n                        // Add the base quantity for every item\n                        var subItemBase = new ListViewItem.ListViewSubItem(item,\n                            baseMaterialQuantity.ToString(\"N0\"));\n                        item.SubItems.Add(subItemBase);\n                        // Add the quantity needed according to the character's skills for every item\n                        var subItem = new ListViewItem.ListViewSubItem(item,\n                            actualMaterialQuantity.ToString(\"N0\"));\n                        item.SubItems.Add(subItem);\n                    }\n\n                // Add the group that has an item\n                if (hasItem)\n                    PropertiesList.Groups.Add(group);\n            }\n\n            return items;\n        }\n\n        /// <summary>\n        /// Update the facility modifier list. \n        /// </summary>\n        private void UpdateFacilityModifier()\n        {\n            cbFacility.Items.Clear();\n\n            cbFacility.Items.Add(\"NPC Station\");\n\n            Item producedItem = m_blueprint.ProducesItem;\n\n            // This should not happen but be prepared if something changes in CCP DB\n            if (producedItem == null)\n            {\n                cbFacility.SelectedIndex = 0;\n                return;\n            }\n\n#if false\n            switch (m_activity)\n            {\n                case BlueprintActivity.Manufacturing:\n                    if (producedItem.MarketGroup.BelongsIn(DBConstants.DronesMarketGroupID)\n                        && !producedItem.MarketGroup.BelongsIn(DBConstants.SmallToLargeShipsMarketGroupIDs))\n                    {\n                        cbFacility.Items.Add(\"Drone Assembly Array\");\n                    }\n\n                    if (producedItem.MarketGroup.BelongsIn(DBConstants.AmmosAndChargesMarketGroupID) ||\n                        producedItem.MarketGroup.BelongsIn(DBConstants.FuelBlocksMarketGroupID))\n                    {\n                        cbFacility.Items.Add(\"Ammunition Assembly Array\");\n                    }\n\n                    if (producedItem.MarketGroup.BelongsIn(DBConstants.ShipEquipmentsMarketGroupID) ||\n                        producedItem.MarketGroup.BelongsIn(DBConstants.ShipModificationsMarketGroupID))\n                    {\n                        cbFacility.Items.Add(\"Equipment Assembly Array\");\n                        cbFacility.Items.Add(\"Rapid Equipment Assembly Array\");\n                    }\n\n                    if (producedItem.MarketGroup.BelongsIn(DBConstants.ComponentsMarketGroupID))\n                        cbFacility.Items.Add(\"Component Assembly Array\");\n\n                    if (producedItem.MarketGroup.BelongsIn(DBConstants.StrategicComponentsMarketGroupIDs))\n                        cbFacility.Items.Add(\"Subsystem Assembly Array\");\n\n                    if (producedItem.MarketGroup.BelongsIn(DBConstants.SmallToLargeShipsMarketGroupIDs))\n                        cbFacility.Items.Add(\"(Ship Size) Ship Assembly Array\");\n\n                    if (producedItem.MarketGroup.BelongsIn(DBConstants.CapitalShipsMarketGroupIDs))\n                        cbFacility.Items.Add(\"Capital Assembly Array\");\n\n                    if (producedItem.MarketGroup.BelongsIn(DBConstants.AdvancedSmallToLargeShipsMarketGroupIDs))\n                        cbFacility.Items.Add(\"Advanced (Ship Size) Ship Assembly Array\");\n\n                    if (producedItem.MarketGroup.BelongsIn(DBConstants.SupercapitalShipsMarketGroupIDs))\n                        cbFacility.Items.Add(\"Supercapital Assembly Array\");\n\n                    if (producedItem.MarketGroup.BelongsIn(DBConstants.StandardCapitalShipComponentsMarketGroupID) ||\n                        producedItem.MarketGroup.BelongsIn(DBConstants.AdvancedCapitalComponentsMarketGroupID))\n                    {\n                        cbFacility.Items.Add(\"Thukker Component Assembly Array\");\n                    }\n\n                    if (producedItem.MarketGroup.BelongsIn(DBConstants.BoostersMarketGroupID))\n                        cbFacility.Items.Add(\"Drug Laboratory\");\n\n                    break;\n                case BlueprintActivity.Copying:\n                case BlueprintActivity.Invention:\n                    cbFacility.Items.AddRange(new object[]\n                    {\n                        \"Design Laboratory\"\n                    });\n                    break;\n                case BlueprintActivity.ReverseEngineering:\n                    cbFacility.Items.AddRange(new object[]\n                    {\n                        \"Experimental Laboratory\"\n                    });\n                    break;\n                case BlueprintActivity.ResearchingMaterialEfficiency:\n                case BlueprintActivity.ResearchingTimeEfficiency:\n                    cbFacility.Items.AddRange(new object[]\n                    {\n                        \"Research Laboratory\",\n                        \"Hyasyoda Research Laboratory\"\n                    });\n                    break;\n            }\n#endif\n            cbFacility.Items.AddRange(new object[]\n            {\n                \"Citadel\",\n                \"Raitaru\",\n                \"Azbel\",\n                \"Sotiyo\"\n            });\n\n            BlueprintBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.BlueprintBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.BlueprintCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.BlueprintDataBrowser;\n\n            // Update the selected index\n            if (m_activity == BlueprintActivity.Manufacturing)\n            {\n                cbFacility.SelectedIndex = (settings.ProductionFacilityIndex < cbFacility.\n                    Items.Count) ? settings.ProductionFacilityIndex : 0;\n                return;\n            }\n\n            cbFacility.SelectedIndex = (settings.ResearchFacilityIndex < cbFacility.Items.\n                Count) ? settings.ResearchFacilityIndex : 0;\n        }\n\n        /// <summary>\n        /// Update the implant set modifier list. \n        /// </summary>\n        private void UpdateImplantSetModifier()\n        {\n            cbImplantSet.Visible = Character != null;\n\n            if (Character == null)\n                return;\n\n            cbImplantSet.Items.Clear();\n            foreach (ImplantSet set in Character.ImplantSets)\n            {\n                cbImplantSet.Items.Add(set);\n            }\n\n            int comboBoxArrowWidth = 16 * (int)Math.Truncate(Graphics.FromHwnd(Handle).DpiX / EveMonConstants.DefaultDpi);\n            int maxWidth = Math.Min(Character.ImplantSets.Max(set =>\n                TextRenderer.MeasureText(set.Name, cbImplantSet.Font).Width) + comboBoxArrowWidth,\n                (int)(cbImplantSet.Font.Size * EveMonConstants.ImplantSetNameMaxLength));\n\n            cbImplantSet.Size = new Size(Math.Max(maxWidth, cbImplantSet.Size.Width), cbImplantSet.Size.Height);\n\n            BlueprintBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.BlueprintBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.BlueprintCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.BlueprintDataBrowser;\n\n            // Update the selected index\n            cbImplantSet.SelectedIndex = settings.ImplantSetIndex < cbImplantSet.Items.Count ?\n                settings.ImplantSetIndex : 0;\n        }\n\n        /// <summary>\n        /// Calculate the base activity time.\n        /// </summary>\n        /// <param name=\"activityTime\"></param>\n        /// <returns></returns>\n        private static string BaseActivityTime(double activityTime)\n        {\n            if (double.IsNaN(activityTime))\n                return TimeSpanToText(TimeSpan.FromSeconds(0d), false);\n\n            TimeSpan time = TimeSpan.FromSeconds(Math.Ceiling(activityTime));\n            return TimeSpanToText(time, time.Seconds != 0);\n        }\n\n        /// <summary>\n        /// Calculate the character's activity time.\n        /// </summary>\n        /// <param name=\"activityTime\">The activity time.</param>\n        /// <param name=\"skillID\">The skill ID.</param>\n        /// <param name=\"advSkillID\">The advanced skill ID.</param>\n        /// <returns></returns>\n        private string CharacterActivityTime(double activityTime, int skillID, int advSkillID = 0)\n        {\n            if (Character == null)\n                return string.Empty;\n\n            long advancedSkillLevel = 0L;\n            const double AdvancedIndustrySkillBonusFactor = 0.03d;\n            double skillBonusModifier = 0d;\n\n            if (skillID != 0)\n            {\n                double skillBonusFactor;\n                switch (skillID)\n                {\n                    case DBConstants.IndustrySkillID:\n                    case DBConstants.ReactionsSkillID:\n                        skillBonusFactor = 0.04d;\n                        break;\n                    default:\n                        skillBonusFactor = 0.05d;\n                        break;\n                }\n\n                skillBonusModifier = skillBonusFactor * Character.LastConfirmedSkillLevel(\n                    skillID);\n            }\n            if (advSkillID != 0)\n                advancedSkillLevel = Character.LastConfirmedSkillLevel(advSkillID);\n\n            double activityTimeModifier = (1.0d - skillBonusModifier) *\n                (1.0d - AdvancedIndustrySkillBonusFactor * advancedSkillLevel);\n\n            var time = TimeSpan.FromSeconds(Math.Ceiling(activityTime * activityTimeModifier));\n            return $\"{TimeSpanToText(time, time.Seconds != 0)} (You)\";\n        }\n\n        /// <summary>\n        /// Transpose the timespan to text.\n        /// </summary>\n        /// <param name=\"time\"></param>\n        /// <param name=\"includeSeconds\"></param>\n        /// <returns></returns>\n        private static string TimeSpanToText(TimeSpan time, bool includeSeconds)\n            => time.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas, includeSeconds);\n\n        /// <summary>\n        /// Gets the probability modifier.\n        /// </summary>\n        /// <returns></returns>\n        private decimal GetProbabilityModifier()\n        {\n            if (Character == null)\n                return 1M;\n\n            const decimal BonusFactor = 0.05M;\n            decimal skillLevel = m_blueprint.Prerequisites.Where(x => (x.Activity ==\n                BlueprintActivity.Invention || x.Activity == BlueprintActivity.\n                ReverseEngineering) && x.Skill != null).Max(x => Character.\n                LastConfirmedSkillLevel(x.Skill.ID));\n\n            return 1M + BonusFactor * skillLevel;\n        }\n\n        /// <summary>\n        /// Gets the time efficiency modifier.\n        /// </summary>\n        /// <param name=\"activity\">The activity.</param>\n        /// <returns></returns>\n        private double GetTimeEfficiencyModifier(BlueprintActivity activity)\n        {\n            switch (activity)\n            {\n                case BlueprintActivity.Manufacturing:\n                    return 1d - (double)nudTE.Value / 100;\n                case BlueprintActivity.ResearchingMaterialEfficiency:\n                    switch ((int)nudME.Value)\n                    {\n                        case 0:\n                            return 1d;\n                        case 1:\n                            return (250 - 105) / 105d;\n                        case 2:\n                            return (595d - 250d) / 105d;\n                        case 3:\n                            return (1414 - 595) / 105d;\n                        case 4:\n                            return (3360 - 1414) / 105d;\n                        case 5:\n                            return (8000 - 3360) / 105d;\n                        case 6:\n                            return (19000 - 8000) / 105d;\n                        case 7:\n                            return (45255 - 19000) / 105d;\n                        case 8:\n                            return (107700 - 45255) / 105d;\n                        case 9:\n                        case 10:\n                            return (256000 - 107700) / 105d;\n                    }\n                    break;\n            }\n\n            if (activity != BlueprintActivity.ResearchingTimeEfficiency)\n                return 1d;\n\n            switch ((int)nudTE.Value)\n            {\n                case 0:\n                    return 1d;\n                case 2:\n                    return (250 - 105) / 105d;\n                case 4:\n                    return (595d - 250d) / 105d;\n                case 6:\n                    return (1414 - 595) / 105d;\n                case 8:\n                    return (3360 - 1414) / 105d;\n                case 10:\n                    return (8000 - 3360) / 105d;\n                case 12:\n                    return (19000 - 8000) / 105d;\n                case 14:\n                    return (45255 - 19000) / 105d;\n                case 16:\n                    return (107700 - 45255) / 105d;\n                case 18:\n                case 20:\n                    return (256000 - 107700) / 105d;\n            }\n\n            return 1d;\n        }\n\n        /// <summary>\n        /// Gets the activity from the selected tab.\n        /// </summary>\n        /// <returns></returns>\n        private BlueprintActivity GetActivity()\n        {\n            // Unsubscribe mouse handlers for the old properties list\n            PropertiesList.MouseDown -= PropertiesList_MouseDown;\n            PropertiesList.MouseMove -= PropertiesList_MouseMove;\n\n            BlueprintActivity activity = BlueprintActivity.None;\n\n            if (tabControl.SelectedTab == null)\n                return activity;\n\n            switch (tabControl.SelectedTab.Text)\n            {\n                case \"Manufacturing\":\n                    PropertiesList = lvManufacturing;\n                    activity = BlueprintActivity.Manufacturing;\n                    break;\n                case \"Copying\":\n                    PropertiesList = lvCopying;\n                    activity = BlueprintActivity.Copying;\n                    break;\n                case \"Researching Material Efficiency\":\n                    PropertiesList = lvResearchME;\n                    activity = BlueprintActivity.ResearchingMaterialEfficiency;\n                    break;\n                case \"Researching Time Efficiency\":\n                    PropertiesList = lvResearchTE;\n                    activity = BlueprintActivity.ResearchingTimeEfficiency;\n                    break;\n                case \"Invention\":\n                    PropertiesList = lvInvention;\n                    activity = BlueprintActivity.Invention;\n                    break;\n                case \"Reactions\":\n                    PropertiesList = lvReactions;\n                    activity = BlueprintActivity.Reactions;\n                    break;\n                case \"Simple Reactions\":\n                    PropertiesList = lvReactions;\n                    activity = BlueprintActivity.SimpleReactions;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n\n            // Re-subscribe mouse handlers for the new properties list\n            PropertiesList.MouseDown += PropertiesList_MouseDown;\n            PropertiesList.MouseMove += PropertiesList_MouseMove;\n\n            return activity;\n        }\n\n        /// <summary>\n        /// Show the item in its appropriate browser.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        private void ShowInBrowser(Item item)\n        {\n            PlanWindow planWindow = ParentForm as PlanWindow;\n\n            if (item is Ship)\n                planWindow?.ShowShipInBrowser(item);\n            else\n                planWindow?.ShowItemInBrowser(item);\n        }\n\n        /// <summary>\n        /// Gets the manufacturing time and material multiplier of a facility.\n        /// </summary>\n        /// <returns></returns>\n        private double GetFacilityManufacturingAndMaterialMultiplier()\n        {\n            string text = cbFacility.Text;\n            m_materialFacilityMultiplier = 1.0d;\n\n            if (m_activity != BlueprintActivity.Manufacturing)\n                return 1.0d;\n\n            if (text.StartsWith(\"Rapid\", StringComparison.Ordinal))\n            {\n                m_materialFacilityMultiplier = 1.05d;\n                return 0.65d;\n            }\n\n            if (text.StartsWith(\"Thukker Component\", StringComparison.Ordinal))\n            {\n                m_materialFacilityMultiplier = 0.85d;\n                return 0.75d;\n            }\n\n            if (text.StartsWith(\"Subsystem\", StringComparison.Ordinal) ||\n                text.StartsWith(\"Supercapital\", StringComparison.Ordinal) ||\n                text.StartsWith(\"Drug\", StringComparison.Ordinal) ||\n                text.StartsWith(\"NPC\", StringComparison.Ordinal))\n            {\n                return 1.0d;\n            }\n\n            m_materialFacilityMultiplier = 0.98d;\n            return 0.75d;\n        }\n\n        /// <summary>\n        /// Gets the research time multiplier of a facility by their activity.\n        /// </summary>\n        /// <param name=\"activity\"></param>\n        /// <returns></returns>\n        private double GetFacilityResearchTimeMultiplier(BlueprintActivity activity)\n        {\n            string text = cbFacility.Text;\n\n            if (text.StartsWith(\"Design\", StringComparison.Ordinal))\n            {\n                switch (activity)\n                {\n                    case BlueprintActivity.Invention:\n                        return 0.5d;\n                    case BlueprintActivity.Copying:\n                        return 0.6d;\n                    default:\n                        return 1;\n                }\n            }\n\n            if (!text.Contains(\"Research Laboratory\"))\n                return 1.0d;\n\n            switch (activity)\n            {\n                case BlueprintActivity.ResearchingMaterialEfficiency:\n                case BlueprintActivity.ResearchingTimeEfficiency:\n                    return text.StartsWith(\"Hyasyoda\", StringComparison.Ordinal) ? 0.65d : 0.70d;\n            }\n\n            return 1.0d;\n        }\n\n        /// <summary>\n        /// Gets the multiplier of an implant.\n        /// </summary>\n        /// <returns></returns>\n        private double GetImplantMultiplier(ICollection<int> implantIDs)\n        {\n            ImplantSet implantSet = (ImplantSet)cbImplantSet.Tag;\n\n            Implant implant = implantSet?.FirstOrDefault(x => implantIDs.Contains(x.ID));\n\n            if (implant == null)\n                return 1.0d;\n\n            double bonus = implant.Properties\n                .FirstOrDefault(x => DBConstants.IndustryModifyingPropertyIDs.IndexOf(x.Property.ID) != -1)\n                .Int64Value;\n            double multiplier = 1.0d + bonus / 100;\n\n            return multiplier;\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// Occurs when a tab is selected.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        /// <remarks>Updates the required skills control according to the seleted tab</remarks>\n        private void tabControl_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (tabControl.SelectedIndex == -1)\n                return;\n\n            m_activity = GetActivity();\n            requiredSkillsControl.Activity = m_activity;\n            UpdateFacilityModifier();\n        }\n\n        /// <summary>\n        /// Occurs when the value of the control changes.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void nudME_ValueChanged(object sender, EventArgs e)\n        {\n            NumericUpDown control = sender as NumericUpDown;\n\n            if (control == null)\n                return;\n\n            UpdateAttributes();\n            UpdateRequiredMaterialsList();\n        }\n\n        /// <summary>\n        /// Occurs when the value of the control changes.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void nudTE_ValueChanged(object sender, EventArgs e)\n        {\n            NumericUpDown control = sender as NumericUpDown;\n\n            if (control == null)\n                return;\n\n            UpdateAttributes();\n        }\n\n        /// <summary>\n        /// Occurs on facility selection change.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbFacility_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            BlueprintBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.BlueprintBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.BlueprintCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.BlueprintDataBrowser;\n\n            if (m_activity == BlueprintActivity.Manufacturing)\n                settings.ProductionFacilityIndex = cbFacility.SelectedIndex;\n            else\n                settings.ResearchFacilityIndex = cbFacility.SelectedIndex;\n\n            UpdateAttributes();\n            UpdateRequiredMaterialsList();\n        }\n\n        /// <summary>\n        /// Occurs on implant set selection change.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbImplantSet_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            BlueprintBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.BlueprintBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.BlueprintCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.BlueprintDataBrowser;\n\n            settings.ImplantSetIndex = cbImplantSet.SelectedIndex;\n            cbImplantSet.Tag = cbImplantSet.SelectedItem;\n\n            if (m_blueprint == null)\n                return;\n\n            UpdateAttributes();\n            UpdateRequiredMaterialsList();\n        }\n\n        /// <summary>\n        /// Occurs when clicking on the control.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lblItem_Click(object sender, EventArgs e)\n        {\n            Item item = (Item)lblItem.Tag;\n\n            if (item == null)\n                return;\n\n            ShowInBrowser(item);\n\n            lblItem.ForeColor = Color.Purple;\n        }\n\n        /// <summary>\n        /// Occurs when clicking on a list box item.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void InventBlueprintListBox_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            Blueprint blueprint = (Blueprint)InventBlueprintListBox.SelectedItem;\n\n            if (blueprint == null)\n                return;\n\n            SelectedObject = blueprint;\n            InventBlueprintListBox.ClearSelected();\n        }\n\n        /// <summary>\n        /// Occurs when double clicking on a list view item.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void propertiesList_DoubleClick(object sender, EventArgs e)\n        {\n            Item item = (Item)PropertiesList.FocusedItem?.Tag;\n\n            if (item == null)\n                return;\n\n            ShowInBrowser(item);\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the BlueprintAttributeContextMenu control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void BlueprintAttributeContextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            Item item = (Item)PropertiesList.FocusedItem?.Tag;\n\n            showInMenuItem.Visible = showInMenuSeparator.Visible = item != null;\n            showInMenuItem.Text = item is Ship ? \"Show In Ship Browser\" : \"Show In Item Browser\";\n        }\n\n        /// <summary>\n        /// Exports activity info to CSV format.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(PropertiesList);\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void PropertiesList_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            PropertiesList.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void PropertiesList_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            PropertiesList.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Handles the MouseMove event of the InventBlueprintListBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void InventBlueprintListBox_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            InventBlueprintListBox.Cursor = InventBlueprintListBox.Items.Count > 0\n                ? Cursors.Hand\n                : Cursors.Default;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/BlueprintBrowserControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"BlueprintAttributeContextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/BlueprintSelectControl.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class BlueprintSelectControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.cbTech1 = new System.Windows.Forms.CheckBox();\n            this.cbTech2 = new System.Windows.Forms.CheckBox();\n            this.tlpGrouping = new System.Windows.Forms.TableLayoutPanel();\n            this.cbOfficer = new System.Windows.Forms.CheckBox();\n            this.cbStoryline = new System.Windows.Forms.CheckBox();\n            this.cbFaction = new System.Windows.Forms.CheckBox();\n            this.cbTech3 = new System.Windows.Forms.CheckBox();\n            this.lblActivity = new System.Windows.Forms.Label();\n            this.cbActivityFilter = new System.Windows.Forms.ComboBox();\n            this.upperPanel.SuspendLayout();\n            this.lowerPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchImage)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSerachTextDel)).BeginInit();\n            this.tlpGrouping.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tbSearchText\n            // \n            this.tbSearchText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbSearchText.Location = new System.Drawing.Point(45, 148);\n            this.tbSearchText.Size = new System.Drawing.Size(179, 20);\n            this.tbSearchText.TabIndex = 3;\n            // \n            // lbNoMatches\n            // \n            this.lbNoMatches.Size = new System.Drawing.Size(224, 240);\n            this.lbNoMatches.TabIndex = 10;\n            this.lbNoMatches.Text = \"No blueprints match your search.\";\n            // \n            // upperPanel\n            // \n            this.upperPanel.Controls.Add(this.cbActivityFilter);\n            this.upperPanel.Controls.Add(this.tlpGrouping);\n            this.upperPanel.Controls.Add(this.lblActivity);\n            this.upperPanel.Size = new System.Drawing.Size(224, 178);\n            this.upperPanel.TabIndex = 0;\n            this.upperPanel.Controls.SetChildIndex(this.lblActivity, 0);\n            this.upperPanel.Controls.SetChildIndex(this.tbSearchText, 0);\n            this.upperPanel.Controls.SetChildIndex(this.lblFilter, 0);\n            this.upperPanel.Controls.SetChildIndex(this.lbSearchTextHint, 0);\n            this.upperPanel.Controls.SetChildIndex(this.tlpGrouping, 0);\n            this.upperPanel.Controls.SetChildIndex(this.cbActivityFilter, 0);\n            this.upperPanel.Controls.SetChildIndex(this.pbSearchImage, 0);\n            this.upperPanel.Controls.SetChildIndex(this.cbUsabilityFilter, 0);\n            this.upperPanel.Controls.SetChildIndex(this.pbSerachTextDel, 0);\n            // \n            // lowerPanel\n            // \n            this.lowerPanel.Location = new System.Drawing.Point(0, 178);\n            this.lowerPanel.Size = new System.Drawing.Size(224, 240);\n            // \n            // lbSearchTextHint\n            // \n            this.lbSearchTextHint.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.lbSearchTextHint.Location = new System.Drawing.Point(49, 151);\n            this.lbSearchTextHint.TabIndex = 8;\n            // \n            // pbSearchImage\n            // \n            this.pbSearchImage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.pbSearchImage.Location = new System.Drawing.Point(9, 151);\n            // \n            // lblFilter\n            // \n            this.lblFilter.TabIndex = 0;\n            // \n            // cbUsabilityFilter\n            // \n            this.cbUsabilityFilter.Size = new System.Drawing.Size(179, 21);\n            this.cbUsabilityFilter.TabIndex = 1;\n            this.cbUsabilityFilter.SelectedIndexChanged += new System.EventHandler(this.cbUsabilityFilter_SelectedIndexChanged);\n            // \n            // lbSearchList\n            // \n            this.lbSearchList.Size = new System.Drawing.Size(224, 240);\n            this.lbSearchList.TabIndex = 9;\n            // \n            // tvItems\n            // \n            this.tvItems.LineColor = System.Drawing.Color.Black;\n            this.tvItems.SelectionMode = EVEMon.Common.Controls.TreeViewSelectionMode.SingleSelect;\n            this.tvItems.Size = new System.Drawing.Size(224, 240);\n            this.tvItems.TabIndex = 4;\n            // \n            // pbSerachTextDel\n            // \n            this.pbSerachTextDel.Location = new System.Drawing.Point(205, 150);\n            // \n            // cbTech1\n            // \n            this.cbTech1.AutoSize = true;\n            this.cbTech1.Checked = true;\n            this.cbTech1.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.cbTech1.Location = new System.Drawing.Point(3, 3);\n            this.cbTech1.Name = \"cbTech1\";\n            this.cbTech1.Size = new System.Drawing.Size(57, 17);\n            this.cbTech1.TabIndex = 0;\n            this.cbTech1.Text = \"Tech I\";\n            this.cbTech1.UseVisualStyleBackColor = true;\n            this.cbTech1.CheckedChanged += new System.EventHandler(this.cbMetagroup_CheckedChanged);\n            // \n            // cbTech2\n            // \n            this.cbTech2.AutoSize = true;\n            this.cbTech2.Checked = true;\n            this.cbTech2.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.cbTech2.Location = new System.Drawing.Point(3, 26);\n            this.cbTech2.Name = \"cbTech2\";\n            this.cbTech2.Size = new System.Drawing.Size(60, 17);\n            this.cbTech2.TabIndex = 1;\n            this.cbTech2.Text = \"Tech II\";\n            this.cbTech2.UseVisualStyleBackColor = true;\n            this.cbTech2.CheckedChanged += new System.EventHandler(this.cbMetagroup_CheckedChanged);\n            // \n            // tlpGrouping\n            // \n            this.tlpGrouping.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tlpGrouping.ColumnCount = 2;\n            this.tlpGrouping.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tlpGrouping.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tlpGrouping.Controls.Add(this.cbOfficer, 0, 2);\n            this.tlpGrouping.Controls.Add(this.cbStoryline, 1, 1);\n            this.tlpGrouping.Controls.Add(this.cbFaction, 1, 0);\n            this.tlpGrouping.Controls.Add(this.cbTech1, 0, 0);\n            this.tlpGrouping.Controls.Add(this.cbTech2, 0, 1);\n            this.tlpGrouping.Controls.Add(this.cbTech3, 0, 2);\n            this.tlpGrouping.Location = new System.Drawing.Point(9, 63);\n            this.tlpGrouping.Name = \"tlpGrouping\";\n            this.tlpGrouping.RowCount = 3;\n            this.tlpGrouping.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpGrouping.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpGrouping.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tlpGrouping.Size = new System.Drawing.Size(212, 70);\n            this.tlpGrouping.TabIndex = 2;\n            // \n            // cbOfficer\n            // \n            this.cbOfficer.AutoSize = true;\n            this.cbOfficer.Checked = true;\n            this.cbOfficer.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.cbOfficer.Location = new System.Drawing.Point(109, 49);\n            this.cbOfficer.Name = \"cbOfficer\";\n            this.cbOfficer.Size = new System.Drawing.Size(57, 17);\n            this.cbOfficer.TabIndex = 5;\n            this.cbOfficer.Text = \"Officer\";\n            this.cbOfficer.UseVisualStyleBackColor = true;\n            // \n            // cbStoryline\n            // \n            this.cbStoryline.AutoSize = true;\n            this.cbStoryline.Checked = true;\n            this.cbStoryline.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.cbStoryline.Location = new System.Drawing.Point(109, 26);\n            this.cbStoryline.Name = \"cbStoryline\";\n            this.cbStoryline.Size = new System.Drawing.Size(66, 17);\n            this.cbStoryline.TabIndex = 4;\n            this.cbStoryline.Text = \"Storyline\";\n            this.cbStoryline.UseVisualStyleBackColor = true;\n            this.cbStoryline.CheckedChanged += new System.EventHandler(this.cbMetagroup_CheckedChanged);\n            // \n            // cbFaction\n            // \n            this.cbFaction.AutoSize = true;\n            this.cbFaction.Checked = true;\n            this.cbFaction.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.cbFaction.Location = new System.Drawing.Point(109, 3);\n            this.cbFaction.Name = \"cbFaction\";\n            this.cbFaction.Size = new System.Drawing.Size(61, 17);\n            this.cbFaction.TabIndex = 3;\n            this.cbFaction.Text = \"Faction\";\n            this.cbFaction.UseVisualStyleBackColor = true;\n            this.cbFaction.CheckedChanged += new System.EventHandler(this.cbMetagroup_CheckedChanged);\n            // \n            // cbTech3\n            // \n            this.cbTech3.AutoSize = true;\n            this.cbTech3.Checked = true;\n            this.cbTech3.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.cbTech3.Location = new System.Drawing.Point(3, 49);\n            this.cbTech3.Name = \"cbTech3\";\n            this.cbTech3.Size = new System.Drawing.Size(63, 17);\n            this.cbTech3.TabIndex = 2;\n            this.cbTech3.Text = \"Tech III\";\n            this.cbTech3.UseVisualStyleBackColor = true;\n            this.cbTech3.CheckedChanged += new System.EventHandler(this.cbMetagroup_CheckedChanged);\n            // \n            // lblActivity\n            // \n            this.lblActivity.AutoSize = true;\n            this.lblActivity.Location = new System.Drawing.Point(16, 31);\n            this.lblActivity.Name = \"lblActivity\";\n            this.lblActivity.Size = new System.Drawing.Size(22, 13);\n            this.lblActivity.TabIndex = 21;\n            this.lblActivity.Text = \"for:\";\n            // \n            // cbActivityFilter\n            // \n            this.cbActivityFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbActivityFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbActivityFilter.FormattingEnabled = true;\n            this.cbActivityFilter.Items.AddRange(new object[] {\n            \"Any Activity\",\n            \"All Activities\",\n            \"Manufacturing\",\n            \"Copying\",\n            \"Researching Material Efficiency \",\n            \"Researching Time Efficiency\",\n            \"Invention\"});\n            this.cbActivityFilter.Location = new System.Drawing.Point(45, 28);\n            this.cbActivityFilter.Name = \"cbActivityFilter\";\n            this.cbActivityFilter.Size = new System.Drawing.Size(179, 21);\n            this.cbActivityFilter.TabIndex = 22;\n            this.cbActivityFilter.SelectedIndexChanged += new System.EventHandler(this.cbActivity_SelectedIndexChanged);\n            // \n            // BlueprintSelectControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.DoubleBuffered = true;\n            this.Name = \"BlueprintSelectControl\";\n            this.Size = new System.Drawing.Size(224, 418);\n            this.upperPanel.ResumeLayout(false);\n            this.upperPanel.PerformLayout();\n            this.lowerPanel.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchImage)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSerachTextDel)).EndInit();\n            this.tlpGrouping.ResumeLayout(false);\n            this.tlpGrouping.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.CheckBox cbTech1;\n        private System.Windows.Forms.CheckBox cbTech2;\n        private System.Windows.Forms.CheckBox cbStoryline;\n        private System.Windows.Forms.CheckBox cbFaction;\n        private System.Windows.Forms.CheckBox cbTech3;\n        private System.Windows.Forms.TableLayoutPanel tlpGrouping;\n        private System.Windows.Forms.ComboBox cbActivityFilter;\n        private System.Windows.Forms.Label lblActivity;\n        private System.Windows.Forms.CheckBox cbOfficer;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/BlueprintSelectControl.cs",
    "content": "using System;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.SkillPlanner\n{\n    public partial class BlueprintSelectControl : EveObjectSelectControl\n    {\n        private Func<Item, bool> m_metaGroupPredicate = x => true;\n\n        private bool m_init;\n\n\n        #region Initialization\n\n        public BlueprintSelectControl()\n        {\n            InitializeComponent();\n            UsabilityPredicate = SelectAll;\n        }\n\n        /// <summary>\n        /// On load, we read the settings.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            // Call the base method\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            // Initialize the filters controls\n            InitializeFiltersControls();\n\n            // Update the control's content\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Initializes the filters controls.\n        /// </summary>\n        protected override void InitializeFiltersControls()\n        {\n            m_init = false;\n\n            InitializeFilterControl();\n\n            InitiliazeSelectedIndexes();\n\n            m_init = true;\n        }\n\n        /// <summary>\n        /// Initializes the filter control.\n        /// </summary>\n        private void InitializeFilterControl()\n        {\n            // Initialize the usability filter combo box\n            cbUsabilityFilter.Items.Clear();\n            cbUsabilityFilter.Items.Add(\"All Blueprints\");\n\n            // On Data browser exit here\n            if (Character == null)\n                return;\n\n            cbUsabilityFilter.Items.Add(\"Blueprints I can use\");\n            cbUsabilityFilter.Items.Add(\"Blueprints I cannot use\");\n        }\n\n        /// <summary>\n        /// Initiliazes the selected indexes.\n        /// </summary>\n        /// <exception cref=\"System.NotImplementedException\"></exception>\n        private void InitiliazeSelectedIndexes()\n        {\n            // Read the settings\n            if (Settings.UI.UseStoredSearchFilters)\n            {\n                BlueprintBrowserSettings settings;\n\n                // Skill Planner\n                if (Plan != null)\n                    settings = Settings.UI.BlueprintBrowser;\n                // Character associated Data Browser\n                else if (Character != null)\n                    settings = Settings.UI.BlueprintCharacterDataBrowser;\n                // Data Browser\n                else\n                    settings = Settings.UI.BlueprintDataBrowser;\n\n                cbUsabilityFilter.SelectedIndex = (int)settings.UsabilityFilter;\n                cbActivityFilter.SelectedIndex = (int)settings.ActivityFilter;\n\n                cbTech1.Checked = (settings.MetagroupFilter & ItemMetaGroup.T1) != ItemMetaGroup.None;\n                cbTech2.Checked = (settings.MetagroupFilter & ItemMetaGroup.T2) != ItemMetaGroup.None;\n                cbTech3.Checked = (settings.MetagroupFilter & ItemMetaGroup.T3) != ItemMetaGroup.None;\n                cbFaction.Checked = (settings.MetagroupFilter & ItemMetaGroup.Faction) != ItemMetaGroup.None;\n                cbStoryline.Checked = (settings.MetagroupFilter & ItemMetaGroup.Storyline) != ItemMetaGroup.None;\n                cbOfficer.Checked = (settings.MetagroupFilter & ItemMetaGroup.Officer) != ItemMetaGroup.None;\n\n                m_metaGroupPredicate = x => (x.MetaGroup & settings.MetagroupFilter) != ItemMetaGroup.None;\n\n                tbSearchText.Text = settings.TextSearch;\n                lbSearchTextHint.Visible = string.IsNullOrEmpty(tbSearchText.Text);\n\n                return;\n            }\n\n            cbUsabilityFilter.SelectedIndex = 0;\n            cbActivityFilter.SelectedIndex = 0;\n            cbTech1.Checked = true;\n            cbTech2.Checked = true;\n            cbTech3.Checked = true;\n            cbFaction.Checked = true;\n            cbStoryline.Checked = true;\n            cbOfficer.Checked = true;\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// When the combo for filter changes, we update the settings and the control content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbUsabilityFilter_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            OnSelectedIndexChanged();\n        }\n\n        /// <summary>\n        /// When the combo for activity filter changes, we update the settings and the control content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbActivity_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            ActivityFilter = (ObjectActivityFilter)cbActivityFilter.SelectedIndex;\n\n            switch (ActivityFilter)\n            {\n                case ObjectActivityFilter.Manufacturing:\n                    Activity = BlueprintActivity.Manufacturing;\n                    break;\n\n                case ObjectActivityFilter.Copying:\n                    Activity = BlueprintActivity.Copying;\n                    break;\n\n                case ObjectActivityFilter.ResearchingMaterialEfficiency:\n                    Activity = BlueprintActivity.ResearchingMaterialEfficiency;\n                    break;\n\n                case ObjectActivityFilter.ResearchingTimeEfficiency:\n                    Activity = BlueprintActivity.ResearchingTimeEfficiency;\n                    break;\n\n                case ObjectActivityFilter.Invention:\n                    Activity = BlueprintActivity.Invention;\n                    break;\n\n                default:\n                    Activity = BlueprintActivity.None;\n                    break;\n            }\n\n            OnSelectedIndexChanged();\n\n            BlueprintBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.BlueprintBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.BlueprintCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.BlueprintDataBrowser;\n\n            // Update settings\n            settings.ActivityFilter = ActivityFilter;\n        }\n\n        /// <summary>\n        /// When one of the metagroups combo is checked/unchecked, we update the settings and the control content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbMetagroup_CheckedChanged(object sender, EventArgs e)\n        {\n            // Update the control's content\n            if (!m_init)\n                return;\n\n            // Retrieve the metagroup\n            ItemMetaGroup metagroup = ItemMetaGroup.None;\n            if (cbTech1.Checked)\n                metagroup |= ItemMetaGroup.T1;\n            if (cbTech2.Checked)\n                metagroup |= ItemMetaGroup.T2;\n            if (cbTech3.Checked)\n                metagroup |= ItemMetaGroup.T3;\n            if (cbFaction.Checked)\n                metagroup |= ItemMetaGroup.Faction;\n            if (cbStoryline.Checked)\n                metagroup |= ItemMetaGroup.Storyline;\n            if (cbOfficer.Checked)\n                metagroup |= ItemMetaGroup.Officer;\n\n            // Update the predicate\n            m_metaGroupPredicate = x => (x.MetaGroup & metagroup) != ItemMetaGroup.None;\n\n            // Update content\n            UpdateContent();\n\n            BlueprintBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.BlueprintBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.BlueprintCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.BlueprintDataBrowser;\n\n            // Update the settings\n            settings.MetagroupFilter |= metagroup;\n        }\n\n        /// <summary>\n        /// When the search text changed, we store the next settings\n        /// and update the list view and the list/tree visibilities.\n        /// </summary>\n        protected override void OnSearchTextChanged()\n        {\n            base.OnSearchTextChanged();\n\n            BlueprintBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.BlueprintBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.BlueprintCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.BlueprintDataBrowser;\n\n            settings.TextSearch = tbSearchText.Text;\n        }\n\n        /// <summary>\n        /// Called when the selected index changed.\n        /// </summary>\n        private void OnSelectedIndexChanged()\n        {\n            // Update the filter delegate\n            switch ((ObjectUsabilityFilter)cbUsabilityFilter.SelectedIndex)\n            {\n                case ObjectUsabilityFilter.All:\n                    UsabilityPredicate = SelectAll;\n                    break;\n\n                case ObjectUsabilityFilter.Usable:\n                    UsabilityPredicate = CanUse;\n                    break;\n\n                case ObjectUsabilityFilter.Unusable:\n                    UsabilityPredicate = CannotUse;\n                    break;\n\n                default:\n                    throw new NotImplementedException();\n            }\n\n            // Enable/Disable the activity filter\n            cbActivityFilter.Enabled = (ObjectUsabilityFilter)cbUsabilityFilter.SelectedIndex != ObjectUsabilityFilter.All;\n\n            // Update the control's content\n            if (!m_init)\n                return;\n\n            // Update content\n            UpdateContent();\n\n            BlueprintBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.BlueprintBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.BlueprintCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.BlueprintDataBrowser;\n\n            // Update settings\n            settings.UsabilityFilter = (ObjectUsabilityFilter)cbUsabilityFilter.SelectedIndex;\n        }\n\n        #endregion\n\n\n        #region Content creation\n\n        /// <summary>\n        /// Builds the tree view.\n        /// </summary>\n        protected override void BuildTreeView()\n        {\n            // Store the selected node (if any) to restore it after the update\n            int selectedItemHash = tvItems.SelectedNode?.Tag?.GetHashCode() ?? 0;\n\n            int numberOfItems = 0;\n            tvItems.BeginUpdate();\n            try\n            {\n                tvItems.Nodes.Clear();\n\n                // Create the nodes\n                foreach (BlueprintMarketGroup group in StaticBlueprints.BlueprintMarketGroups)\n                {\n                    TreeNode node = new TreeNode\n                    {\n                        Text = group.Name,\n                        Tag = group\n                    };\n\n                    int result = BuildSubtree(group, node.Nodes);\n\n                    if (result == 0)\n                        continue;\n\n                    numberOfItems += result;\n                    tvItems.Nodes.Add(node);\n                }\n\n                TreeNode selectedNode = null;\n\n                // Restore the selected node (if any)\n                if (selectedItemHash > 0)\n                {\n                    foreach (TreeNode node in tvItems.GetAllNodes()\n                        .Where(node => node.Tag.GetHashCode() == selectedItemHash))\n                    {\n                        tvItems.SelectNodeWithTag(node.Tag);\n                        selectedNode = node;\n                    }\n                }\n\n                if (selectedNode != null)\n                    return;\n\n                // Reset if the node doesn't exist anymore\n                tvItems.SelectNodeWithTag(null);\n                SelectedObject = null;\n            }\n            finally\n            {\n                tvItems.EndUpdate();\n                AllExpanded = false;\n\n                // If the filtered set is small enough to fit all nodes on screen, call expandAll()\n                if (numberOfItems < tvItems.DisplayRectangle.Height / tvItems.ItemHeight)\n                {\n                    tvItems.ExpandAll();\n                    AllExpanded = true;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Create the tree nodes for the given category and add them to the given nodes collection\n        /// </summary>\n        /// <param name=\"group\"></param>\n        /// <param name=\"nodeCollection\"></param>\n        /// <returns></returns>\n        private int BuildSubtree(BlueprintMarketGroup group, TreeNodeCollection nodeCollection)\n        {\n            // Total blueprints count in this category and its subcategories\n            int result = 0;\n\n            // Add all subcategories\n            foreach (BlueprintMarketGroup childGroup in group.SubGroups)\n            {\n                TreeNode node = new TreeNode\n                {\n                    Text = childGroup.Name,\n                    Tag = childGroup\n                };\n\n                // Add this subcategory's blueprints count\n                result += BuildSubtree(childGroup, node.Nodes);\n\n                // Only add if this subcategory has children\n                if (node.GetNodeCount(true) > 0)\n                    nodeCollection.Add(node);\n            }\n\n            // Add all blueprints\n            foreach (TreeNode node in group.Blueprints.Where(\n                x => UsabilityPredicate(x) && m_metaGroupPredicate(x)).Select(\n                    childItem => new TreeNode { Text = childItem.Name, Tag = childItem }))\n            {\n                nodeCollection.Add(node);\n                result++;\n            }\n            return result;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/BlueprintSelectControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/BrowserClasses.cd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ClassDiagram MajorVersion=\"1\" MinorVersion=\"1\">\n  <Class Name=\"EVEMon.SkillPlanner.ItemBrowserControl\">\n    <Position X=\"7\" Y=\"5.25\" Width=\"2\" />\n    <TypeIdentifier>\n      <HashCode>AAKAABCAACEAAAAAAACAgAACAwAAAAAgAAAgAAQCAQA=</HashCode>\n      <FileName>SkillPlanner\\ItemBrowserControl.cs</FileName>\n    </TypeIdentifier>\n  </Class>\n  <Class Name=\"EVEMon.SkillPlanner.ShipBrowserControl\">\n    <Position X=\"9.75\" Y=\"1.25\" Width=\"2\" />\n    <TypeIdentifier>\n      <HashCode>AAIAQACAACFAgIAAAACAgAASAyAAAAAAAAAggAACAQE=</HashCode>\n      <FileName>SkillPlanner\\ShipBrowserControl.cs</FileName>\n    </TypeIdentifier>\n  </Class>\n  <Class Name=\"EVEMon.SkillPlanner.EveObjectBrowserControl\">\n    <Position X=\"4.5\" Y=\"1\" Width=\"2\" />\n    <TypeIdentifier>\n      <HashCode>AQEBhMAAACkBAQAIAACAAAAKEAAGIAkBAAAAgAQCAgA=</HashCode>\n      <FileName>SkillPlanner\\EveObjectBrowserControl.cs</FileName>\n    </TypeIdentifier>\n  </Class>\n  <Class Name=\"EVEMon.SkillPlanner.BlueprintBrowserControl\">\n    <Position X=\"1.25\" Y=\"2.25\" Width=\"1.75\" />\n    <TypeIdentifier>\n      <HashCode>hDJRAAaKym1RRjUhhBWIgoECQAIB4A+4zPUipMYiAgA=</HashCode>\n      <FileName>SkillPlanner\\BlueprintBrowserControl.cs</FileName>\n    </TypeIdentifier>\n  </Class>\n  <Font Name=\"Segoe UI\" Size=\"9\" />\n</ClassDiagram>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/CertificateBrowserControl.Designer.cs",
    "content": "using EVEMon.Common.Controls;\n\nnamespace EVEMon.SkillPlanner\n{\n    partial class CertificateBrowserControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CertificateBrowserControl));\n            this.leftSplitContainer = new EVEMon.Common.Controls.PersistentSplitContainer();\n            this.certSelectControl = new EVEMon.SkillPlanner.CertificateSelectControl();\n            this.panelRight = new System.Windows.Forms.Panel();\n            this.rightSplitContainer = new EVEMon.Common.Controls.PersistentSplitContainer();\n            this.certDisplayControl = new EVEMon.SkillPlanner.CertificateTreeDisplayControl();\n            this.panelHeader = new System.Windows.Forms.Panel();\n            this.lblLevel5Time = new System.Windows.Forms.Label();\n            this.tspControl = new System.Windows.Forms.ToolStrip();\n            this.tslbTextForEligibility = new System.Windows.Forms.ToolStripLabel();\n            this.tslbEligible = new System.Windows.Forms.ToolStripLabel();\n            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\n            this.planToLevel = new System.Windows.Forms.ToolStripDropDownButton();\n            this.tsPlanToLevelOne = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsPlanToLevelTwo = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsPlanToLevelThree = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsPlanToLevelFour = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsPlanToLevelFive = new System.Windows.Forms.ToolStripMenuItem();\n            this.pictureBox1 = new System.Windows.Forms.PictureBox();\n            this.lblCategory = new System.Windows.Forms.Label();\n            this.textboxDescription = new System.Windows.Forms.TextBox();\n            this.lblLevel4Time = new System.Windows.Forms.Label();\n            this.lblLevel3Time = new System.Windows.Forms.Label();\n            this.lblLevel2Time = new System.Windows.Forms.Label();\n            this.lblLevel1Time = new System.Windows.Forms.Label();\n            this.lblName = new System.Windows.Forms.Label();\n            this.lblHelp = new System.Windows.Forms.Label();\n            ((System.ComponentModel.ISupportInitialize)(this.leftSplitContainer)).BeginInit();\n            this.leftSplitContainer.Panel1.SuspendLayout();\n            this.leftSplitContainer.Panel2.SuspendLayout();\n            this.leftSplitContainer.SuspendLayout();\n            this.panelRight.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.rightSplitContainer)).BeginInit();\n            this.rightSplitContainer.Panel1.SuspendLayout();\n            this.rightSplitContainer.SuspendLayout();\n            this.panelHeader.SuspendLayout();\n            this.tspControl.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();\n            this.SuspendLayout();\n            // \n            // leftSplitContainer\n            // \n            this.leftSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.leftSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;\n            this.leftSplitContainer.Location = new System.Drawing.Point(0, 0);\n            this.leftSplitContainer.Name = \"leftSplitContainer\";\n            // \n            // leftSplitContainer.Panel1\n            // \n            this.leftSplitContainer.Panel1.Controls.Add(this.certSelectControl);\n            this.leftSplitContainer.Panel1MinSize = 45;\n            // \n            // leftSplitContainer.Panel2\n            // \n            this.leftSplitContainer.Panel2.Controls.Add(this.panelRight);\n            this.leftSplitContainer.Panel2.Controls.Add(this.lblHelp);\n            this.leftSplitContainer.RememberDistanceKey = null;\n            this.leftSplitContainer.Size = new System.Drawing.Size(824, 550);\n            this.leftSplitContainer.SplitterDistance = 232;\n            this.leftSplitContainer.TabIndex = 3;\n            // \n            // certSelectControl\n            // \n            this.certSelectControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.certSelectControl.Location = new System.Drawing.Point(0, 0);\n            this.certSelectControl.Margin = new System.Windows.Forms.Padding(2);\n            this.certSelectControl.Name = \"certSelectControl\";\n            this.certSelectControl.Size = new System.Drawing.Size(232, 550);\n            this.certSelectControl.TabIndex = 0;\n            // \n            // panelRight\n            // \n            this.panelRight.Controls.Add(this.rightSplitContainer);\n            this.panelRight.Controls.Add(this.panelHeader);\n            this.panelRight.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.panelRight.Location = new System.Drawing.Point(0, 0);\n            this.panelRight.Name = \"panelRight\";\n            this.panelRight.Size = new System.Drawing.Size(588, 550);\n            this.panelRight.TabIndex = 3;\n            this.panelRight.Visible = false;\n            // \n            // rightSplitContainer\n            // \n            this.rightSplitContainer.BackColor = System.Drawing.SystemColors.Control;\n            this.rightSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rightSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\n            this.rightSplitContainer.Location = new System.Drawing.Point(0, 133);\n            this.rightSplitContainer.Name = \"rightSplitContainer\";\n            // \n            // rightSplitContainer.Panel1\n            // \n            this.rightSplitContainer.Panel1.Controls.Add(this.certDisplayControl);\n            // \n            // rightSplitContainer.Panel2\n            // \n            this.rightSplitContainer.Panel2.AutoScroll = true;\n            this.rightSplitContainer.Panel2.BackColor = System.Drawing.SystemColors.Window;\n            this.rightSplitContainer.RememberDistanceKey = null;\n            this.rightSplitContainer.Size = new System.Drawing.Size(588, 417);\n            this.rightSplitContainer.SplitterDistance = 420;\n            this.rightSplitContainer.TabIndex = 3;\n            // \n            // certDisplayControl\n            // \n            this.certDisplayControl.BackColor = System.Drawing.SystemColors.Window;\n            this.certDisplayControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.certDisplayControl.Location = new System.Drawing.Point(0, 0);\n            this.certDisplayControl.Name = \"certDisplayControl\";\n            this.certDisplayControl.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10);\n            this.certDisplayControl.Size = new System.Drawing.Size(420, 417);\n            this.certDisplayControl.TabIndex = 2;\n            // \n            // panelHeader\n            // \n            this.panelHeader.Controls.Add(this.lblLevel5Time);\n            this.panelHeader.Controls.Add(this.tspControl);\n            this.panelHeader.Controls.Add(this.pictureBox1);\n            this.panelHeader.Controls.Add(this.lblCategory);\n            this.panelHeader.Controls.Add(this.textboxDescription);\n            this.panelHeader.Controls.Add(this.lblLevel4Time);\n            this.panelHeader.Controls.Add(this.lblLevel3Time);\n            this.panelHeader.Controls.Add(this.lblLevel2Time);\n            this.panelHeader.Controls.Add(this.lblLevel1Time);\n            this.panelHeader.Controls.Add(this.lblName);\n            this.panelHeader.Dock = System.Windows.Forms.DockStyle.Top;\n            this.panelHeader.Location = new System.Drawing.Point(0, 0);\n            this.panelHeader.Name = \"panelHeader\";\n            this.panelHeader.Size = new System.Drawing.Size(588, 133);\n            this.panelHeader.TabIndex = 1;\n            // \n            // lblLevel5Time\n            // \n            this.lblLevel5Time.AutoSize = true;\n            this.lblLevel5Time.Location = new System.Drawing.Point(3, 84);\n            this.lblLevel5Time.Name = \"lblLevel5Time\";\n            this.lblLevel5Time.Size = new System.Drawing.Size(131, 13);\n            this.lblLevel5Time.TabIndex = 29;\n            this.lblLevel5Time.Text = \"Level V : 11d, 6h, 33m, 3s\";\n            // \n            // tspControl\n            // \n            this.tspControl.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.tspControl.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n            this.tspControl.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tslbTextForEligibility,\n            this.tslbEligible,\n            this.toolStripSeparator1,\n            this.planToLevel});\n            this.tspControl.Location = new System.Drawing.Point(0, 108);\n            this.tspControl.Name = \"tspControl\";\n            this.tspControl.Size = new System.Drawing.Size(588, 25);\n            this.tspControl.TabIndex = 28;\n            // \n            // tslbTextForEligibility\n            // \n            this.tslbTextForEligibility.Name = \"tslbTextForEligibility\";\n            this.tslbTextForEligibility.Size = new System.Drawing.Size(202, 22);\n            this.tslbTextForEligibility.Text = \"After this plan you will be eligible to :\";\n            // \n            // tslbEligible\n            // \n            this.tslbEligible.Name = \"tslbEligible\";\n            this.tslbEligible.Size = new System.Drawing.Size(34, 22);\n            this.tslbEligible.Text = \"none\";\n            // \n            // toolStripSeparator1\n            // \n            this.toolStripSeparator1.Name = \"toolStripSeparator1\";\n            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);\n            // \n            // planToLevel\n            // \n            this.planToLevel.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tsPlanToLevelOne,\n            this.tsPlanToLevelTwo,\n            this.tsPlanToLevelThree,\n            this.tsPlanToLevelFour,\n            this.tsPlanToLevelFive});\n            this.planToLevel.Image = ((System.Drawing.Image)(resources.GetObject(\"planToLevel.Image\")));\n            this.planToLevel.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.planToLevel.Name = \"planToLevel\";\n            this.planToLevel.Size = new System.Drawing.Size(84, 22);\n            this.planToLevel.Text = \"Plan To...\";\n            this.planToLevel.ToolTipText = \"Plan To...\";\n            // \n            // tsPlanToLevelOne\n            // \n            this.tsPlanToLevelOne.Name = \"tsPlanToLevelOne\";\n            this.tsPlanToLevelOne.Size = new System.Drawing.Size(152, 22);\n            this.tsPlanToLevelOne.Text = \"&Level I\";\n            this.tsPlanToLevelOne.Click += new System.EventHandler(this.tsPlanToLevel_Click);\n            // \n            // tsPlanToLevelTwo\n            // \n            this.tsPlanToLevelTwo.Name = \"tsPlanToLevelTwo\";\n            this.tsPlanToLevelTwo.Size = new System.Drawing.Size(152, 22);\n            this.tsPlanToLevelTwo.Text = \"&Level II\";\n            this.tsPlanToLevelTwo.Click += new System.EventHandler(this.tsPlanToLevel_Click);\n            // \n            // tsPlanToLevelThree\n            // \n            this.tsPlanToLevelThree.Name = \"tsPlanToLevelThree\";\n            this.tsPlanToLevelThree.Size = new System.Drawing.Size(152, 22);\n            this.tsPlanToLevelThree.Text = \"&Level III\";\n            this.tsPlanToLevelThree.Click += new System.EventHandler(this.tsPlanToLevel_Click);\n            // \n            // tsPlanToLevelFour\n            // \n            this.tsPlanToLevelFour.Name = \"tsPlanToLevelFour\";\n            this.tsPlanToLevelFour.Size = new System.Drawing.Size(152, 22);\n            this.tsPlanToLevelFour.Text = \"&Level IV\";\n            this.tsPlanToLevelFour.Click += new System.EventHandler(this.tsPlanToLevel_Click);\n            // \n            // tsPlanToLevelFive\n            // \n            this.tsPlanToLevelFive.Name = \"tsPlanToLevelFive\";\n            this.tsPlanToLevelFive.Size = new System.Drawing.Size(152, 22);\n            this.tsPlanToLevelFive.Text = \"&Level V\";\n            this.tsPlanToLevelFive.Click += new System.EventHandler(this.tsPlanToLevel_Click);\n            // \n            // pictureBox1\n            // \n            this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject(\"pictureBox1.Image\")));\n            this.pictureBox1.Location = new System.Drawing.Point(306, 4);\n            this.pictureBox1.Name = \"pictureBox1\";\n            this.pictureBox1.Size = new System.Drawing.Size(64, 64);\n            this.pictureBox1.TabIndex = 27;\n            this.pictureBox1.TabStop = false;\n            // \n            // lblCategory\n            // \n            this.lblCategory.AutoSize = true;\n            this.lblCategory.Location = new System.Drawing.Point(3, 3);\n            this.lblCategory.Name = \"lblCategory\";\n            this.lblCategory.Size = new System.Drawing.Size(71, 13);\n            this.lblCategory.TabIndex = 26;\n            this.lblCategory.Text = \"Skill Category\";\n            // \n            // textboxDescription\n            // \n            this.textboxDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.textboxDescription.BackColor = System.Drawing.SystemColors.Window;\n            this.textboxDescription.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.textboxDescription.Location = new System.Drawing.Point(376, 3);\n            this.textboxDescription.Multiline = true;\n            this.textboxDescription.Name = \"textboxDescription\";\n            this.textboxDescription.ReadOnly = true;\n            this.textboxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n            this.textboxDescription.Size = new System.Drawing.Size(209, 102);\n            this.textboxDescription.TabIndex = 25;\n            // \n            // lblLevel4Time\n            // \n            this.lblLevel4Time.AutoSize = true;\n            this.lblLevel4Time.Location = new System.Drawing.Point(3, 71);\n            this.lblLevel4Time.Name = \"lblLevel4Time\";\n            this.lblLevel4Time.Size = new System.Drawing.Size(140, 13);\n            this.lblLevel4Time.TabIndex = 23;\n            this.lblLevel4Time.Text = \"Level IV : 5d, 12h, 15m, 24s\";\n            // \n            // lblLevel3Time\n            // \n            this.lblLevel3Time.AutoSize = true;\n            this.lblLevel3Time.Location = new System.Drawing.Point(3, 58);\n            this.lblLevel3Time.Name = \"lblLevel3Time\";\n            this.lblLevel3Time.Size = new System.Drawing.Size(139, 13);\n            this.lblLevel3Time.TabIndex = 22;\n            this.lblLevel3Time.Text = \"Level III : 1d, 23h, 49m, 36s\";\n            // \n            // lblLevel2Time\n            // \n            this.lblLevel2Time.AutoSize = true;\n            this.lblLevel2Time.Location = new System.Drawing.Point(3, 45);\n            this.lblLevel2Time.Name = \"lblLevel2Time\";\n            this.lblLevel2Time.Size = new System.Drawing.Size(112, 13);\n            this.lblLevel2Time.TabIndex = 21;\n            this.lblLevel2Time.Text = \"Level II : 8h, 27m, 17s\";\n            // \n            // lblLevel1Time\n            // \n            this.lblLevel1Time.AutoSize = true;\n            this.lblLevel1Time.Location = new System.Drawing.Point(3, 32);\n            this.lblLevel1Time.Name = \"lblLevel1Time\";\n            this.lblLevel1Time.Size = new System.Drawing.Size(109, 13);\n            this.lblLevel1Time.TabIndex = 20;\n            this.lblLevel1Time.Text = \"Level I : 1h, 48m, 55s\";\n            // \n            // lblName\n            // \n            this.lblName.AutoSize = true;\n            this.lblName.Location = new System.Drawing.Point(3, 16);\n            this.lblName.Name = \"lblName\";\n            this.lblName.Size = new System.Drawing.Size(57, 13);\n            this.lblName.TabIndex = 19;\n            this.lblName.Text = \"Skill Name\";\n            // \n            // lblHelp\n            // \n            this.lblHelp.AutoSize = true;\n            this.lblHelp.Location = new System.Drawing.Point(0, 0);\n            this.lblHelp.Name = \"lblHelp\";\n            this.lblHelp.Size = new System.Drawing.Size(247, 13);\n            this.lblHelp.TabIndex = 29;\n            this.lblHelp.Text = \"Use the tree on the left to select certificate to view.\";\n            // \n            // CertificateBrowserControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.leftSplitContainer);\n            this.Name = \"CertificateBrowserControl\";\n            this.Size = new System.Drawing.Size(824, 550);\n            this.leftSplitContainer.Panel1.ResumeLayout(false);\n            this.leftSplitContainer.Panel2.ResumeLayout(false);\n            this.leftSplitContainer.Panel2.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.leftSplitContainer)).EndInit();\n            this.leftSplitContainer.ResumeLayout(false);\n            this.panelRight.ResumeLayout(false);\n            this.rightSplitContainer.Panel1.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.rightSplitContainer)).EndInit();\n            this.rightSplitContainer.ResumeLayout(false);\n            this.panelHeader.ResumeLayout(false);\n            this.panelHeader.PerformLayout();\n            this.tspControl.ResumeLayout(false);\n            this.tspControl.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private CertificateSelectControl certSelectControl;\n        private System.Windows.Forms.Panel panelHeader;\n        private CertificateTreeDisplayControl certDisplayControl;\n        private System.Windows.Forms.Label lblCategory;\n        private System.Windows.Forms.TextBox textboxDescription;\n        private System.Windows.Forms.Label lblLevel4Time;\n        private System.Windows.Forms.Label lblLevel3Time;\n        private System.Windows.Forms.Label lblLevel2Time;\n        private System.Windows.Forms.Label lblLevel1Time;\n        private System.Windows.Forms.Label lblName;\n        private System.Windows.Forms.PictureBox pictureBox1;\n        private System.Windows.Forms.ToolStrip tspControl;\n        private System.Windows.Forms.ToolStripLabel tslbTextForEligibility;\n        private System.Windows.Forms.ToolStripLabel tslbEligible;\n        private System.Windows.Forms.ToolStripDropDownButton planToLevel;\n        private System.Windows.Forms.ToolStripMenuItem tsPlanToLevelTwo;\n        private System.Windows.Forms.ToolStripMenuItem tsPlanToLevelThree;\n        private System.Windows.Forms.ToolStripMenuItem tsPlanToLevelFive;\n        private PersistentSplitContainer leftSplitContainer;\n        private System.Windows.Forms.ToolStripMenuItem tsPlanToLevelOne;\n        private System.Windows.Forms.Panel panelRight;\n        private PersistentSplitContainer rightSplitContainer;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\n        private System.Windows.Forms.Label lblHelp;\n        private System.Windows.Forms.Label lblLevel5Time;\n        private System.Windows.Forms.ToolStripMenuItem tsPlanToLevelFour;\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/CertificateBrowserControl.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    public partial class CertificateBrowserControl : UserControl\n    {\n        private CertificateClass m_selectedCertificate;\n        private Plan m_plan;\n        private const int HPad = 40;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        public CertificateBrowserControl()\n        {\n            InitializeComponent();\n\n            rightSplitContainer.RememberDistanceKey = \"CertificateBrowser_Right\";\n            leftSplitContainer.RememberDistanceKey = \"CertificateBrowser_Left\";\n        }\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            lblName.Font = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n\n            certSelectControl.SelectionChanged += certSelectControl_SelectionChanged;\n\n            EveMonClient.PlanChanged += EveMonClient_PlanChanged;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            Disposed += OnDisposed;\n\n            // Reposition the help text along side the treeview\n            Control[] result = certSelectControl.Controls.Find(\"pnlResults\", true);\n            if (result.Length > 0)\n                lblHelp.Location = new Point(lblHelp.Location.X, result[0].Location.Y);\n\n            // Update the controls visibility\n            UpdateControlVisibility();\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            certSelectControl.SelectionChanged -= certSelectControl_SelectionChanged;\n\n            EveMonClient.PlanChanged -= EveMonClient_PlanChanged;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            Disposed -= OnDisposed;\n        }\n\n        #endregion\n\n\n        #region Internal Properties\n\n        /// <summary>\n        /// Gets or sets the character.\n        /// </summary>\n        /// <value>\n        /// The character.\n        /// </value>\n        internal Character Character\n        {\n            get { return certSelectControl.Character; }\n            set\n            {\n                if (value == null || certSelectControl.Character == value)\n                    return;\n\n                certSelectControl.Character = value;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the current plan\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                if (m_plan == value)\n                    return;\n\n                m_plan = value;\n\n                certSelectControl.Plan = m_plan;\n                certDisplayControl.Plan = m_plan;\n\n                UpdateEligibility();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the selected certificate class.\n        /// </summary>\n        /// <value>\n        /// The selected certificate class.\n        /// </value>\n        internal CertificateClass SelectedCertificateClass\n        {\n            get { return m_selectedCertificate; }\n            set\n            {\n                if (m_selectedCertificate == value)\n                    return;\n\n                m_selectedCertificate = value;\n                certDisplayControl.CertificateClass = value;\n                certSelectControl.SelectedCertificateClass = value;\n                UpdateContent();\n            }\n        }\n\n        #endregion\n\n\n        #region Content Update\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            // When no certificate class is selected, we just hide the right panel.\n            if (m_selectedCertificate == null)\n            {\n                // View help message\n                lblHelp.Visible = true;\n\n                panelRight.Visible = false;\n                return;\n            }\n\n            // Hide help message\n            lblHelp.Visible = false;\n\n            // Updates controls visibility\n            panelRight.Visible = true;\n\n            lblName.Text = m_selectedCertificate.Name;\n            lblCategory.Text = m_selectedCertificate.Category.Name;\n            textboxDescription.Text = m_selectedCertificate.Certificate.Description;\n\n            // Training time per certificate level\n            for (int i = 1; i <= 5; i++)\n            {\n                UpdateLevelLabel(panelHeader.Controls.OfType<Label>()\n                    .First(label => label.Name == $\"lblLevel{i}Time\"), i);\n            }\n\n            // Only read the recommendations from one level, because they are all the same\n            PersistentSplitContainer rSplCont = rightSplitContainer;\n            List<Control> newItems = new List<Control>();\n            SortedList<string, Item> ships = new SortedList<string, Item>();\n            foreach (Item ship in m_selectedCertificate.Certificate.Recommendations)\n            {\n                ships.Add(ship.Name, ship);\n            }\n\n            Label tempLabel = null;\n            try\n            {\n                tempLabel = new Label();\n                tempLabel.Font = new Font(tempLabel.Font, FontStyle.Bold);\n                tempLabel.AutoSize = true;\n                tempLabel.Dock = DockStyle.Top;\n                tempLabel.Text = @\"Recommended For\";\n                tempLabel.Padding = new Padding(5);\n\n                Label tsl = tempLabel;\n                tempLabel = null;\n\n                newItems.Add(tsl);\n\n                Size tslTextSize = TextRenderer.MeasureText(tsl.Text, Font);\n                int panelMinSize = rSplCont.Panel2MinSize;\n                rSplCont.Panel2MinSize = panelMinSize > tslTextSize.Width + HPad\n                    ? panelMinSize\n                    : tslTextSize.Width + HPad;\n                rSplCont.SplitterDistance = rSplCont.Width - rSplCont.Panel2MinSize;\n            }\n            finally\n            {\n                tempLabel?.Dispose();\n            }\n\n            foreach (LinkLabel linkLabel in ships.Values\n                .Select(ship =>\n                {\n                    LinkLabel linkLabel;\n                    LinkLabel tempLinkLabel = null;\n                    try\n                    {\n                        tempLinkLabel = new LinkLabel();\n                        tempLinkLabel.LinkBehavior = LinkBehavior.HoverUnderline;\n                        tempLinkLabel.Padding = new Padding(16, 0, 0, 0);\n                        tempLinkLabel.Dock = DockStyle.Top;\n                        tempLinkLabel.Text = ship.Name;\n                        tempLinkLabel.Tag = ship;\n\n                        linkLabel = tempLinkLabel;\n                        tempLinkLabel = null;\n                    }\n                    finally\n                    {\n                        tempLinkLabel?.Dispose();\n                    }\n\n                    return linkLabel;\n                }))\n            {\n                linkLabel.MouseClick += recommendations_MenuItem;\n                newItems.Add(linkLabel);\n            }\n\n            // Updates the recommendations for this certificate\n            UpdateRecommendations(newItems, rSplCont);\n\n            // Update the menus and such\n            UpdateEligibility();\n\n            // Update the certificates tree display\n            certDisplayControl.CertificateClass = m_selectedCertificate;\n        }\n\n        /// <summary>\n        /// Updates the provided label with the training time to the given level.\n        /// </summary>\n        /// <param name=\"label\">The label.</param>\n        /// <param name=\"level\">The level.</param>\n        private void UpdateLevelLabel(Control label, int level)\n        {\n            label.Visible = m_selectedCertificate?.Character != null;\n\n            if (m_selectedCertificate?.Character == null)\n                return;\n\n            StringBuilder sb = new StringBuilder();\n\n            // \"Level III: \"\n            sb.Append($\"Level {Skill.GetRomanFromInt(level)}: \");\n\n            CertificateLevel certificateLevel = m_selectedCertificate.Certificate.GetCertificateLevel(level);\n\n            // Is it already trained ?\n            if (certificateLevel.IsTrained)\n            {\n                label.Text = sb.Append(\"Already trained\").ToString();\n                return;\n            }\n\n            // Training time left for level\n            sb.Append(certificateLevel.GetTrainingTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas));\n\n            label.Text = sb.ToString();\n        }\n\n        /// <summary>\n        /// Updates the recommendations.\n        /// </summary>\n        /// <param name=\"newItems\">The new items list.</param>\n        /// <param name=\"rSplCont\">The right splitter container.</param>\n        private void UpdateRecommendations(List<Control> newItems, SplitContainer rSplCont)\n        {\n            rightSplitContainer.Panel2.Controls.Clear();\n\n            if (newItems.Count != 0)\n            {\n                newItems.Reverse();\n                rSplCont.Panel2.Controls.AddRange(newItems.ToArray());\n            }\n            else\n            {\n                Label tempLabel = null;\n                try\n                {\n                    tempLabel = new Label();\n                    tempLabel.Text = @\"No Recommendations\";\n                    tempLabel.Enabled = false;\n                    tempLabel.Dock = DockStyle.Fill;\n                    tempLabel.TextAlign = ContentAlignment.MiddleCenter;\n\n                    Label tsl = tempLabel;\n                    tempLabel = null;\n\n                    rSplCont.Panel2.Controls.Add(tsl);\n\n                    Size tslTextSize = TextRenderer.MeasureText(tsl.Text, Font);\n                    rSplCont.Panel2MinSize = tslTextSize.Width + HPad;\n                    rSplCont.SplitterDistance = rSplCont.Width - rSplCont.Panel2MinSize;\n                }\n                finally\n                {\n                    tempLabel?.Dispose();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Updates eligibility label and planning menus.\n        /// </summary>\n        private void UpdateEligibility()\n        {\n            foreach (ToolStripItem control in tspControl.Items)\n            {\n                control.Visible = m_plan != null;\n            }\n\n            // Not visible\n            if (m_selectedCertificate == null || m_plan == null)\n                return;\n\n            // First we search the highest eligible certificate level after this plan\n            IList<CertificateLevel> eligibleCertLevel = m_selectedCertificate.Certificate.AllLevel\n                .TakeWhile(cert => m_plan.WillGrantEligibilityFor(cert)).ToList();\n\n            CertificateLevel lastEligibleCertLevel = null;\n            if (!eligibleCertLevel.Any())\n                tslbEligible.Text = @\"(none)\";\n            else\n            {\n                lastEligibleCertLevel = eligibleCertLevel.Last();\n                tslbEligible.Text = lastEligibleCertLevel.ToString();\n\n                tslbEligible.Text += m_selectedCertificate.HighestTrainedLevel == null\n                    ? \" (improved from \\\"none\\\")\"\n                    : (int)lastEligibleCertLevel.Level > (int)m_selectedCertificate.HighestTrainedLevel.Level\n                        ? $\" (improved from \\\"{m_selectedCertificate.HighestTrainedLevel}\\\")\"\n                        : @\" (no change)\";\n            }\n\n            planToLevel.Enabled = false;\n\n            // \"Plan to N\" menus\n            for (int i = 1; i <= 5; i++)\n            {\n                planToLevel.Enabled |= UpdatePlanningMenuStatus(planToLevel.DropDownItems[i - 1],\n                    m_selectedCertificate.Certificate.GetCertificateLevel(i), lastEligibleCertLevel);\n            }\n        }\n\n        /// <summary>\n        /// Updates a \"plan to\" menu.\n        /// </summary>\n        /// <param name=\"menu\">The menu to update</param>\n        /// <param name=\"certLevel\">The level represent by this menu</param>\n        /// <param name=\"lastEligibleCertLevel\">The highest eligible certificate after this plan</param>\n        private bool UpdatePlanningMenuStatus(ToolStripItem menu, CertificateLevel certLevel, CertificateLevel lastEligibleCertLevel)\n        {\n            menu.Enabled = certLevel != null && (lastEligibleCertLevel == null || certLevel.Level > lastEligibleCertLevel.Level);\n\n            if (menu.Enabled)\n                menu.Tag = m_plan.TryPlanTo(certLevel);\n\n            return menu.Enabled;\n        }\n\n        #endregion\n\n\n        #region Control Events\n\n        /// <summary>\n        /// When the user select a new certificate class, we update everything.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void certSelectControl_SelectionChanged(object sender, EventArgs e)\n        {\n            SelectedCertificateClass = certSelectControl.SelectedCertificateClass;\n        }\n\n        /// <summary>\n        /// Handler for the ship-links generated for the recommendations.\n        /// </summary>\n        private void recommendations_MenuItem(object sender, EventArgs e)\n        {\n            Item ship = ((Control)sender)?.Tag as Item;\n\n            // Open the ship browser\n            PlanWindow.ShowPlanWindow(certSelectControl.Character, m_plan).ShowShipInBrowser(ship);\n        }\n\n        #endregion\n\n\n        #region Golbal Event Handlers\n\n        /// <summary>\n        /// When the current plan changes (new skills, etc), we need to update some informations.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_PlanChanged(object sender, PlanChangedEventArgs e)\n        {\n            if (e.Plan == m_plan)\n                UpdateEligibility();\n        }\n\n        /// <summary>\n        /// When the settings changes, we need to update.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateControlVisibility();\n        }\n\n        #endregion\n\n\n        #region Context menu\n\n        /// <summary>\n        /// Plan to Level N.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void tsPlanToLevel_Click(object sender, EventArgs e)\n        {\n            IPlanOperation operation = ((ToolStripMenuItem)sender).Tag as IPlanOperation;\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            if (planWindow == null)\n                return;\n\n            PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow, operation);\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Updates the control visibility.\n        /// </summary>\n        private void UpdateControlVisibility()\n        {\n            if (Settings.UI.SafeForWork)\n            {\n                pictureBox1.Visible = false;\n                planToLevel.DisplayStyle = ToolStripItemDisplayStyle.Text;\n            }\n            else\n            {\n                pictureBox1.Visible = true;\n                planToLevel.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;\n            }\n        }\n        \n        #endregion\n\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/CertificateBrowserControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"tspControl.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"planToLevel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALRSURBVDhPZZLZTxNRFIeJ/5Fx9ImoqA8m+mCMcY8GNQgJ\n        CoEQbMQGDCpSoLRsFSiVrtONLtNOKZSWrkBb6UILLbtiJIPxwfimpj8vnaoBfsnJvJzvu+fcO2V/s7G1\n        5c/lct70UtYWS6RM/mjcMB2e10+GwsVyByO0yx+qJq3HeOJQ8hsbXCaXhz+ehNEbwiDjRoeeOVA9Zudv\n        sZpuIe1HJQTmvn7/gY9737Cys4tAdhVz+U3MZlZhCMehD8WK1W9hf/VrTUcloVSaW9/dQ2JzBwurm4iu\n        bWEmnYM2ED1SXUbHz3bNxKkSyscRWeDi69vk5DXYFpKgyWmHwXHfPDoZL65I1IVrkvEzJZSPZsbPTSWX\n        wcRSRYFlPgHz3GLxa4smMeadQ5POiUq5GRUiBRFoDgoktknOtZhB9tMXrHzeLd5DaHmNrLINdyoHU3QJ\n        7XYfatUOXOhWFm4NHBKILSw3lcgiRoDZTB5BAnvIHfQ4/RA5fBA5AxC7w2gYNaJAUch3i1BC+bTprBwd\n        jGF/iv3RxQ4vhAaW7OxDM81CYJhEt90DY1sbCjevFiUllE+nycExsTTYD0voY2fRoLRgmJlGCwFfk9El\n        jA1SqRQsy2Kwvg4ymbyqhPJ5RTOclVyeazGLEU8EmmAcYtYPXSQBhWcS7mEKqSkKra2teDRsLDxWMWdL\n        KB/B+wmu5p0WVTItqkf0eDpmwn0ZjUaF6h+s66UgNDK4obCi3jxzroTyufhSyt3tVeDhkAa1BK5XkqYx\n        Beih/3CTWo96owd3FAwa7IHzJZRPRWsv125ywRJNYXZ5HcF0GpYxHh7poIhUgxqtC40TXtxTOtF0WHBa\n        2MtV9qtQKzdBQH4YeqAcYVcXVD0UnpA1qlQO1Bmm8cwewAONCwI2fFBwvPktd0LQBeq5GCdfSECRZ5II\n        KVzq6EP5m1Fc6FHh8pAe1+VW3FbsT7AvKCv7A6+/SZesMPR8AAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"pictureBox1.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAIqZJREFUeF7t\n        ewd0XOd1pmUrljaR7bhKq8RJdhO3rBLLchFJsaiQEiWSothJgARB9F5JohAkCBCFRCV6IXov0wswg8Fg\n        MMCgDzCYQS8kCKJ3EGXKazf3wThn95zdxI7FPSeJ/Z3znffwBiT/e/9bvvu/4Vf+hD/h38ZLu9j98Y8L\n        X/3a1762e/vHi2//4PU33//itAP64uXdR39c8A6+DfkV5RCYlCLYffQfGi80Xd/at//U8Y+PAKetE3id\n        WvAMCjW5+wcYXTz91u39gqYu3n4wYXU39umluzGPbT38hq84ufae8Q1qPXY7oumzwDD1pwGh9R/7h9R+\n        5BXAP+AdVHwmMCTnyp2wAtu7Efl2YRG5V2+HZl/wuxF72ss38oLvjVjr6zfjL/pejznr4R11wtEl+OjV\n        a75Hbe2uf2Jzze/jK7a+R6xtvI9csnb72Oqy63E7B3+8unx65aqfg7c38GVyeO1b3/r27tJfDF771l/+\n        5PjxYyDT6kAxMgZON28t2nn4Ljl43Fx2dfFe9/bw3/DzCTTe9A/ZvhESaQ64G0OGhITDHf9gCAu4A2GB\n        oXDv9j2IuhsFcVExEBabBNG5xZAokECqsgky0LHFPXpIa9BAcp0SkmvrIUmiwKsSUhQNkN6ogXR1K2S1\n        dMKjDi3kdOogv6cP8nsHoNAwBEV9g1Dx5BkIRp9AYmoaWLu5B+0u/cXh0+PHQdbRCcqxcfCKjJmxcvZ6\n        bOt/a9I+LmvJPi5jwS4mY8EhPnPJLSF70elB6rxbXOa8W3zmontc+oJnQuaCR1z6vFdi5qJ3YvaCL179\n        U3IWA/PKVsO5ko1oWcN2SqvWnN2jtyQ0tVvi5I3bD6T1xihh7dZ9kdwYLanbjlWoTQkNzeYElYZIbGyz\n        JGu6yNT2Hjq1U8dkdOmZrO4+hjMxDREpqRCbm6faXfaLw9u/eBtkmlZonngKt7Lyl6zRAdcSs5cd9OPg\n        UNNsdlRqLfaKDrNTfafZBe9d6rUWN2Wn2V3VQ3ju0qdRt0NvVY/FvxGp6iYCmnTEHW0/eadniEwZn2IS\n        JmYg/vEUxA5PMJH9Y3S0YYyO0o/SUQPjEDP4hHkw/JSJHZ0AlvGjk8zD8Ul4+HQGkrV6ivNkiglOSoUy\n        iRR2l/3i8Ld/+3cLlWIptE5MQIJAunHZN3DSJjxuzkHRQdhlla85ZpSt2aUUrtolF6w6pxWtOTzMW3ZO\n        LlhzSclfdcXnLN1TC1c9MopXvTNL11n6ZpeteWeVrd/Ir34eVCnZCq9tNKW16ywPtAYyqVNPJCkaTQ8E\n        su3ICuFWeHH1RkQJZyOqUrAZK6g1xYkUxriaBvNDucqS2N1HJfaNMBVD43RkSTkkZmXD6z/8m/+xu/QX\n        g29/+9u1Gbn50DQyCsUtHSa70PszNsERM3bKLsuVQuHz2zklW2kCCZHEFRKJFdWmDK6ASK7kEWlVPCKj\n        im/O4PCJtGqBJZMr3GEWT2TJFUjIHL6IeITMFdVYcmsVhKi7lynT9pJRzZ2WpG4DcXdgjA7qGCD9VG2E\n        l0Jj9qzTEN71rRYfdQd5vXuMjNB0W5KUGiK2f5TO7ewlMupV8CAlBU5csXHZXfqLwZ//xV9EhEVHQ+Pg\n        MAj6BmnXuNR526B703a4GKtSycb1/IrN7Ho1lV6rJFPFMjJLIifTBFILy3RkFvsMmS2uJXPws0d4nyOu\n        JQqkdQTeE7liOYHPiSJlEynU6qg7YsX2zfY+cnZ+BLbnB4DYWgTjygQYF8eRj2F7aQJWB2ogW2egQwVK\n        Y/zgOJOsbrPktmvh9oNYCE/L4O0u/cXglVdfOebs5g6y7h5om1uAm/mlq7bBEVPXxCrTZZ5yyzOn/Hm6\n        tI5KkdQRKXwpUkJkiWotaRyRJQsdkMEVWdJx19krGktm4+ePhFIiT1xD5IlqiBxhDUaBlMjE55VKNRnF\n        q9ly4NRtGh7rYGtOB/8vrE80gKqvhfGvVmzGavvIuAaNubjbwHiFhUOeQPR8d+kvBqgAf3Dy9CmQtLRB\n        4+QzuFXBW3e8+2DmWrV000bWYnbMrXyeKqolMuQNZIqw1pwhqCEyhFIygy+2pFUJTJlckYlNgXSOEJ0i\n        sORgyGegQ7L4EssjvticxRMSOfhnMvli1iFUMkeyeSWtdLmoS0Ov9PHAvDIJlvU5MC2NwdZ0L1IHK/1C\n        GOmrA19u42Z0Q4slurHdVNjcYfGPS4So5BT4i29+8y93l/9isHf/fqioqYW6gWEI50s3naISZ+2LOetX\n        G7WEbQHnebJYbkmWKYloroiIQUZXcM2xlXxzREmVOb6Kb4kr45qjSirMUcXl5jisDyloNDqISKzmYZpI\n        LGk8rA/iGks2RkVCtcjskVI4FyyuM081RsCSoRLWx5WwMdkOG081sDYkh2UDF5b1VRAsbzOGV0u3Ilp7\n        LBli2XZUWQXci4uD33x0+PPdpb8Y/PzttyGrqAQkXV3wQFq36RifNu+YU7p6rbWXulIifH4Pd5rT28eo\n        RkeohuEhqm18lOqdesaMLswzhulJumtinJ5YWWIWNteZxc3nzMz6Cn42y7DhvEma4enK4s798PwMhOaX\n        mm9mlix6c+q2eJ31wG1T0kUdGjqnR0dl9Q/T6QMj1MPeASqhd4COrNeYoouq10PbDAQ6eT1VXAv3MQKc\n        g24l7S79xeAffvyjufC4eOCp1JCkaDA6peUsOGXkL9u36ymrKulGQBnX1PJ0EjYpAp5trNIMMLBFWfBn\n        M2gnn1AadMyyaYvpfDLO9DydYBa2NhjtkzGql/1seIgWtreT2ifjdNvjcTqpmm/xzqlYD41NmT6RULnw\n        SSJ/4UQKZ+livmT9Kqd+00XWavSo7zB5KLWmYEWrOaaUsx7RNUCG55evZYplTAQ6IJPDHdpd+ovBm3/9\n        V0JXbx8oFAjhkbqF9MgvW3JJz112aNORNiKVMYgj2c5uaqUeadqJjAY1mV6vIh9K6ywxmOdJWOjiMdyT\n        hFJLTDWfiKniErFoJHYGIg5TJQGZhgUytqzanIq/VyqvJz0zCtc9cjjLRT2t0KAug6YuOXT0yEBnaGSG\n        H/fA9PxjeD5rAPXMYwgS1m8ldOiJO1WitZQKruV2UjJwFcoXK4i+9/3vB52+eAEe5uZBboOa9udK1j3S\n        85fsGjsstnUtJj++bDtf00anYCtLkit36kFyjYJIwVaXWoPENpcqkRHYJs0PeRJzEk9EPETdgG3QnITF\n        MYUntqRiYYwv55iL5fXUnaKqzdOx+XOKVhk9LnBgs+P/gmVrBlYmWuFmk84c29xujmrqNKH+2AzBCEjL\n        y4O/+9k//nx3+V8er33jG+8fOfop3ImJhUxJDR1co9zwyCletlc0m2zVXRYvoXz7kaaNzNJ0kMnohFSM\n        gjRsadl4zWpoJB/V41XRYClpbiEL1U1kSbOGLGtqJkVdWlLS0UlyNBqyXqcjNYODZG17Jx1RVr11MTpz\n        9pZEaZyUhcD2bB8Qm/NgXBjeuTctsx2hG/WAFEI6h4j4pg7zfcMIlSyseR6ZXwhBd8Pg5NVrN3eX/+Xx\n        8ssvf+/AB++DV2AQJJdXQHhj65Z3KWfNVa42XW3pJd0k9VupKg0pHR6lO6anmFbM8x686rAQDs7NMT1T\n        kwxbFIfm5xj9zDNmeG6WGZqdYQzPJqjhuWm6G3O/5/E4xRZBcZeWiavim+wSc+YdUGjNNMXDtCoa5tsy\n        YaYxDqYbH8CMOhZmmuNgRhMHD9u6iTBp41bc+CST3NC0mSKuAXc/PwiIjZfvLv/FYN/+A2Dr6gb3MMSi\n        GluMN0TyDY/aBqOd1kDZ1aiMKeoWokTXR3VOT9GdU8/o5vHHdOP4GF0/MsLIBgapOqRQb6Dk/f0UBxVf\n        eVsbUdCoISta2snq1jayoF5FFKnURBEbNUIJ4ZZasHAhV7j6rCsP5trTYbwpFQabH0FXUwE0a0qhTsOB\n        hg4pE93ZTd8q5KxF64eoRE2nMa+jh3b2uw7FEim9u/QXg9/s3QvnbGwgBNMgqa3LEiRv2PCVKY2OugHa\n        VqExPdR0EPndvVSp3kAXdOvIku4eioMGV/b0UiWd2h3jZf0DO1QMDuw4Qd7fR9UZDJRu4gmlffyEwW7B\n        sJ0gF+uGV275mkdi5vyV0tr1q4U1yyfTBYtHE6vnjz/kzh+JLZ898qBi9qME7vzlDO5iUFzK/F1VuyWy\n        oXW7oKvH4h0RBUWVlfDN73z3+7vL//L457ffHjt1/gJcx/zKxcXfVrVu+UvqNl3QAXbNHea7jS0Eb2iU\n        MSwtQcfUNK2bm6XbMRK6Z2boAfbZs0la/fgJ3Ts7Qxvws+bHj2nt5FO667dkRuZnKf30JDO8OM9I2jpo\n        vxLOlltM6rRLfvWKc5VsI4Qn2fAtKTZGcCtMKbVcslgtoSTNPFrU2wCO+YK1m9mlq7dU7cYUQc3zG2np\n        EI/d4NCJk5d2l//l8fc/+lHVF+fOg3tAIJS0YaFq024HoChy1fXTjq09REhTu6Wsf4jpnJ2l29ABbCr0\n        Lyzg/TO6ZXKS1kw8pTVPJ+ixpSUaR2taNz1NY52gxxYXGL6uF1OigyxQa8g8TIEiLJz3qoTGi8nF86EN\n        zZaJWh/YmNaAeXMCzFvPgCTWdjqBaWMcngg9wbayfsPzfur8dbXWEpGVNx+aXwT+WK98I6Lydpf/5fH6\n        66/7nzhzFpx9fCGBL2DidP3GAIwA92496YjjaEBzB1E+MMSIxh7TpX0DdE53L5mLLMGpTTE+TkuHR2jB\n        wCBdZeijq/R9dBl+VtWrp6qRpW0dRHFzKynV9ZL8zm6yBp8liWUWm+SChWvViueTNUFg2ZzdMfr/BEOT\n        8FQWCAGSepNTeNK0r6rLEhifNh2VV0jbuLhCannF5O7yvzxeffXVfR9/+hm4YoW9nZIGrANu1TVsebV3\n        E849BsoHe3GJoZ+qGhqlecNjNB8NlmEhbHg8QYuGhmk1RkADpoCa3X2MkqYnT+jmJxN0G3YM9dg40zAy\n        grXgKaUcGqSUg0N0Zq3C4pRduvxFUc3qeFs+zLWkwuazrp3Wt9RdCovaIljozIWJWj8o1cho64isKV9p\n        o9Evs2A+Mjl9+5yjIxRXVcMv9h84vGvCl8PXX331z//xH/4nuF+/AbdRFke0dhrvKpu3/DTtZmfDEOOu\n        6TBl9ejpptk5GFlbg5bZWehdXALt3Dyonk7SkpFRemB5EfoWF6Ef2YXhzzpC1D9A8noNFB93XYSs68NC\n        2ddPlTW1UD4lnOfHHgmX2joFMFkfDNPqGGx/8fCs7g48U9yFaWUUPKsPBVVvDVhlVC/64Fzgw6ldC49L\n        WbLx9ILIxAQoFkue7prw5fH2P70F9u6ekJSXi62w2XRb3boV1NRudOwbYpxbtESaVk/yRsdp8fgTugZT\n        oWZsnFJPTUMdGwnoBCXufgPuugqvO7Xh6VO6BSPDgIWxd2ZmRy/opqaYIawLKJLowGrxllV2xUJklxYa\n        dApI0dTTSdoO6p661eIkUBrtOYrNq+WKNdsy2bpXdNKsF6pTz7pWY+C9B8/8sFizuqW2SfNiZPH/enfP\n        kQ/ePwjW9g6QkJUFUTVyU4i6dTNY1bzt0jfMOLZ2WeK1mMPogPGN52BYXobHz9fBsLTADK6swMDqCtOz\n        MA9d8/PAdoguLIIjK8vwdH0VuqamGSm2RxG2RH53D6HoH6C5nd1UZK3S5JZbumyXV8mmwvLxbMHiJw/L\n        5u3zRXNH4/LnjiaWLHyeVr5oVaFcsyvgrvk+SJ71bOo2+0fEPQ2IvA/XPDxAXKeAP/v611/ZNeMPw0sv\n        vfRyxIP7cOzMGThrZQ3h8fFwnyu0BNU3rfvX1m964phq364jItq7LVXDI0zv0jI0P5uim6emdiJBNjaO\n        99NgWJinW3DnNZPPaAU+q8Pcl4+MUpweHVHY2kEWt3SQ+VgMS9vaSb62l0pTNROOhVXLHtXidW9VqzlE\n        qTLHqGqpii4V09ivga4BFYwO1u8owpAmDXXtXvK0n1pr9kxInwqNSTBdcXaCUk417Dn88ZldU/4wfPOb\n        3zwWFhsLpy5ZwfFTpyEkMgoiisuom5K6ZX+uaN1JayCdOvVEMBZE/sg4UzowREvQ8ArDILKPKsUcFwyO\n        MCV4LerRU8U6A1WKLO7sJkq7eshyJAfFEwevFe1adEAnKdH3k8WtHZRbpWD9lLDp+aK2GFZGBMAwFNC0\n        ebcP/BZznSlQ2VbDnI3Nm/ESKrY8iziLt6JiVy7YXIWU7GwIiI6u2jXlD4e7/3WwdXaBjz45CoFh4RBX\n        XEJ7V/IXfMuql+1QA9hj/ntjJ6geGqErkTU7dWCcRsMpXt8gJR4coniGAaoaw5yLThH2D9EcQx/JN/ST\n        1dj+BLo+koutERUiWdHRtXMv0hlIP2Ht5ulK+VpDr5JeHZHsmgxAmTd3Dkwta7Ow2FME3Z2VcDpHvIyj\n        +oqHRLUREBk7ZeXoBCERESDCyNk14w+HHRrv6usHBz74EK7fuQPZPB54FZTNu2YXzNnLGrastX20q6rV\n        VKBHQ8YeM1xsg6onkzS3f5ASDQ5TfJwFpEPDaDzOAugAvr6PEPQP0jx0gsAwQHJ79OgEA1mNhldrMRK0\n        WkI5NMKEyFWm02XitXRtB7PQXQAbEy2wNlK3cy64MiiEpd5ymG17iEyCazzVumty7rxLs9bsHxn7xOlG\n        ILh5e4O8Uf3lC+FlOzvC//Yd2HfoILj5+kMCztw+jwrmHFIynzlUC9fOtespe7l6K7NDS3BHRpmqwWFa\n        MfGElmMHEA2PMnxsbzVDI5QEHcJDJ/DRCQI9OoJND4wKMaZEDaaHDGW2rFtHcbt1TI1hgIltaiXPlQm3\n        /Jo6yIXefFju5+ycE7K7zjpguk8Auh4BtPbXgXtTl9k7+dG8U6ue9ElIe+ofcZ+67GAPUrkc/uZHP/6n\n        XVP+MPz8nXc6w2PjYO/BQ5gKzhCdnga+aVmLV6ITnlilPZo7026gTgnlm4lNrRYOVvSKvkFaiKnAagAh\n        jskYBTQfw16KIkdg6N8hRgEt6NXTAtQPHLyv7OunMwaHIXJ4FDi9BlqMgxXOHYxNlWjbrrGTzB/SQ2hb\n        K+On6SSvylu2L0uaN11qO9Y+KZKvHi5WLNsU8JYC07LnXBo7LZ65ZbPBCakbF3CAq+Rw4IKzy91dU/5V\n        vIb8+11+B/kN5HeRbyK/8v3vfz+fPXA8dORjuHgFp8KoaPBPTN04FRg2eS7s/vznzVr6aLV0O1CqMFej\n        /MVix5SgYUJUgWIUQaxDytFAARZIIUpijAh0wAAtQsPrunvplKERCBgbYzweP2b8RjGCUDJL8LNynZ5y\n        rWu0eJbzts/xFMZPK+u2Py6XmU9UK7aOVtSsu8vV296yemOIXErc0XaCSxF3yUtcv+kuqlu/lZK1YIWp\n        m5qRARmlpQOsHf8Wfon0QLojTyE/Rh5DfoH8p1deffXh3dgY+OTzk3Ds5BdwJ+YBBCammI97Bzw75nFz\n        5rPaRuJjrsxoV8E1VWm7qQIcgSt1vbQQd7xzeobumJlFBbjE6FHkKJ9MQDm782ikQN9Py3V6GmU0HTA6\n        xiRg3icjiwwDIMXnVTo9E6RqIexEdRavbj0rhBhujxq0/Sp4NtgAW9M9WAznYbmvGmbq4+E0X/3ct0Kw\n        6tLUaQ5Oz5l2vnUb7oSFgVRZ/zvrwE+QPsgwpB/SCnkeaY08hPS/eScUTuBEuNMJsLreTc+gjrn6TX5y\n        1XXqcKXIeJhfZzqTW7aVixOdevwxM7S0CL1zs8wEiqDRlWVmbG2VGVlZZfQLC0z33CwIB1DwYJjX4E5j\n        TaD90AFhI2OMG0ZC6PAwI0cnCQ19zB2cEs/Lms3p2lZmrjkVSMv6bi/436ApIzogDq7UtZm8CyuXnDv6\n        yBuZec9uJqWBq6cHlFVWwddfefW/oR3/Kr6KPIIMQd5BOiPZSDiH/AR51snLCy5ds4P9hw6B761giM7J\n        hZMe/s8+OGv79IOU3I2DAqX5s/T85zF8ISEbGmb0c9P0AKo/luOrK9A1O7Nj/ODKEo7NM8DHlEADMdcH\n        aAWmTfDoKNzEgnkPUyB9cAhEGEHSvgHmbmMzaVejMju2aKml7nIgTb8dh8mtZTAtju2cE25OdsKsOhmC\n        W9sp5/zqRU+tgfIuqpgPL6m0XMY1J6WmsS9Mfuf5APtKyR4ZgWQdcRV5Fsk64v1TFy4CO2b+eu8+cPLy\n        hviCfDjvHzz34ZnLE/tDopf2iVTEoYc56/dKK02lLW10PQ41EoOeEvToKHbmF2OYV/T0sKPwTkEUYj0Q\n        45XdfSF+VtOL9QAd0YA7r8DI4OC9qL+fftjSTl8VyMxWTT3kql6y83bo+eOmnZeky70cWOwqgRU9D2ab\n        koCr14BVRc2KZ3OXxVNYsxpRwVu3dfeA6JgYcAwIkKAdvxNsu7iNfIAMRl5Bsp7bu+/ggW0n1ALvvPsb\n        sLazh7TyUrANCV/+8OK1p4e8Ahd+I1ET78ZlrgfmFRsfyRVUZm0dmS6Vkbn1DSSbFoLuHqq8S8tUdevQ\n        ETpaiDqAfeMswjohNAzQEpwBROgMPjqC/ZmLqSHEYlnY08tY86WW08ouy5ROvDMKr+j4sKqXwkBfA4j0\n        TZCt10JIdy/YavsYP0Htuq+8ccuzsW07tIq35HI7FHxxjC/g8X9vPXAZmYKMRd5AspGw78c//emY63V/\n        +NWed+Hk+QsQl/MIXCIebHxg7TB50NZ9Zq+kkfh5/KMN17TsrYI6BZ0ukpK5tXIyVyYnC5Uqsry5heRj\n        cazu6mYqcdoT4i7zMA1QJO10B/bAhDcwBCiU8H4YUDHSVawj+vqZa1IFaVPbYLnfp4PQrk7mIrbdwy0G\n        6tNmPf15XavlnLjB4ittsNgVVFLexRVGf5HsuTvK85By7px/egZcOnsWMnGI++DkF6wtvxN/jWQjIAv5\n        EMkWxfe/+93vKt1QEr+7/wAcPfE53MJO4BOTYDxs4zx16JLdzHsiJfnzpILNs3EpG4W1MipZICSyJDXU\n        I0kNWSBTsCe/JLetgy5vaaOq0AkV2p6dMGdbHgejgYuRwB8cQQ7TItQQ0pFRkIyOQc3AEOPT0EzaVgvN\n        jopm86lqqdmbIzK6FlUY3QvLjf6VPKMbX0zcbmwh/ZvaqCuNbeCoNTBOg6Pk7SrefCRfzJxDB2TjXHAj\n        PPL3/rrfcWQ5sgCZijzzyiuv5LAHIgc+Oox64DAEsJ0g8xF1xM5t5uDZKzN7i7nGdwq4pg+jEzcy+Xwi\n        XSwhkjh8S4ZATGUKxGS2pJbMVzaSpS3t7MRHlXV2M9gKGWHfIIOzAiPBSZI3MMiUYWQ8QgGU3N5FhjW3\n        UX6KRsK+sYW2qRaaAnkiszNPavaoUxMuzR2UTXsPY9s7CFcMw+A4MAoB/SO0U6uWtpUpwbGSRwWXc+YT\n        m1qMF2xtISUlFThiyb9LFgci2W9cVCJvIe84+XjD4WPHYc+B/eAVGACxhQVw1Mlz/uAp65n9Gfnbv66U\n        WvbcT96Iq6giMuX1VLJQQmWKpUSuTEEVKpRUEbJK3UQXKOqJ3DollVAjJyJq64gAWT3pJVOS9nIVcVXZ\n        RF1UNlM2qlbqanMnZa3poq6goVe0BrikGwTvkSdg1aVnPLv0lE1dI2EnrLW4o3MciitMIVyRya+s2uRa\n        VGa+llNEXcstIqIaW7a9E5MhNCoSePzfvw6wuIiUITnIEmSQtb39jhZ4d997cBVV1q3ERPjC88bioTPW\n        0/ujEjf2iFXkL+6nbESXVZAlDSo6SyQmk8qqiIi8ArN/SobJITFt++LDjO1Tmfnbn+aVGw/llm4frRCY\n        jnEk5uNyNfWFUkNexB206jYwlwyDjPPACFzr7KVtNR2kbZ2KsOGJLdcFUjSwwuhbXGl0zyk2OmTnm5zz\n        S4xXc4qMHuXVpiCxzByqUFkSmlqpUq0OJIZBEOr7IYsnhOKiQvac8DO05XfiAFKDFCLZeZrNnYcnz52D\n        szhn/+rdPWCF/TUyIx0u+AeuHjh3eXb/zbure2rU5K8TczatYpO2bFPSjZ/HpWwdikrY+FVEwsY7D1I2\n        fvkwd+vXGSXG90v5pg+5cssReTN9uKGNOtHWw5xs7aHPazpp3H3SRqYir4nlhKdEbvbgCE0uaJhLaZXZ\n        HgucQ0mV0btaaLQrrTZ6c0VGv2rBdniN3JyHKSPEoaoeVaS8vQu4inrIx8qfVl4JcQXFUFavhLyCQnAP\n        DPq9jsv/DClGqpFcJOuIgr0HDhhtXF3gl9gKv0BdEJ2RBjYBd55/cOHa7AFnn6W9NWpqf0zqxq8e5m29\n        nZy/9U5GmXFPidD8m4oa8wGJmtxbqyb31TaRB8QNFKpH89Gc4q2PYlI3TzxI3DiDEXQZC6h1fNqmTVrO\n        1tXcYpNDOcfsLqw1OwllJm+Z0nSzVmEKq1OZU5UqIhu7S1mtnOHU1AJPKgFRnQLEygaoUauhsaMT1Ej2\n        SOwh5r6Hry84onZpbGmFpubf/5yQ1QTDSDYNpMiin/zsZ0sO+Bf9cs9eOHLsGIQ8uA/OdyOMhy7YzL53\n        7sr8noZ2ep+gntgna6L3KTT0Xmkjtb9KbDmYWWw8EJm4ecgvePXANbel985dXThsZT9/1M5t6aij5/IH\n        zj4rR3wCVj8JCls9cS92/VJK9oZLYflGqLjWlCBTmFOxpT7iC5mCai48wl1MQqMys7KhsKwcja8BuboJ\n        6pCVmOP3oqPh1Jkz9F+9+WY7rpkVdT9E1v74pz+DN994I/prL7/MDn6/N6KRg8gaZCVOhaMuKCr2ffAB\n        fIqDkXdwELjeDjW/f+Hq7MHPz87tj0jYfC8t37g/MGztoJvf8gFrx4WDZ23mD525PHfg9OX5Dy7YLhy8\n        eG1p31mbxb0sz1+dO2LvvvCFz40lu9CI5RsJyZv38wqM6WXlVAbma1xSEoSE3gW/GzfBPygIwu4/gBSU\n        4NlFxZCcmQkBt24B+yWuH/7wr9mNykCy538/QL5QjCDZesDBVthpj9Lyw88+20kBFz9f8IuIpA+cPI+t\n        0Hrh4Gen5/Z/dmb24BmrhUNo6IFL9kv78LrnnM3Sb05Zze85bTV3wtFz7rJ/8ILb3Yjl8OSU1Twuj3pU\n        UQ5RCQkQdDsE/IODd97xB4ffg8j4BEjMzkLDY8DnZgBcvGwNP3vrLQLXwqZmJHI/8v87WDm8gBR87atf\n        7blsZweXHOzhJDrgioMjXI+4B4eOnZrbd+zU/HtfXFzYe/oSGmo9t+/UpekPra5Nn/fwm/cMj1q+n5m1\n        kV1eYS7gcJiskmJ4kJwEwffCwS/oFty4cxfCYuPwWSrcS0iEGyG3weqqLc4de+Fb3/pLdgPykTbIF/tV\n        2H8HGpBdL730UsvpixfB2sEBzlhfhovYEfxDQ+EXew5O7v3o08cnrGymrVw9Fu08fVZ9goO3QiLuMbcj\n        UTBhD76Bu+sTFAh+wbd2djc8JhbCHsTA9VshcMnmGux5bx9853vfm8F/h+04XshfIP/D4K+QbBQ0fozF\n        j50Gz1+5jLQBJx8fSMjMNN+KiqAcvTzhPIbpF+fPAfs2mf0de3e3nQNV78BA8EAlye7svgMH4Qevv7GG\n        fx8bymyhYg9gvoX8Dw12ocN797+3Ywh77n4JJab7jRtg6+ICJ1Bvn7Gy3nHKNTd3sEeexSj553d+CT94\n        43X2GxuPkWVINqX+FvmfDux/nJr6x7feYrxRBl/G/LfCeuDo5QUu2Gdt8Of3j34CP8J289o3vsHubhsy\n        DsmeJ/wN8r8EIl5/4w1gX5SwUpg9FwgKC4er7q6suEhGsgcqb7G/+F8Wr732GraqWxCKRYx9V3AdK/Z7\n        77/fu/vxf31gJzj36z1759/472+yZ+0//e3TPz58b/f6J/wJ/2nxla/8C1j80OiFGVbDAAAAAElFTkSu\n        QmCC\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/CertificateSelectControl.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class CertificateSelectControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CertificateSelectControl));\n            this.cbFilter = new System.Windows.Forms.ComboBox();\n            this.cbSorting = new System.Windows.Forms.ComboBox();\n            this.lblSort = new System.Windows.Forms.Label();\n            this.pbSearchImage = new System.Windows.Forms.PictureBox();\n            this.lbSearchTextHint = new System.Windows.Forms.Label();\n            this.lblFilter = new System.Windows.Forms.Label();\n            this.tbSearchText = new System.Windows.Forms.TextBox();\n            this.pnlResults = new System.Windows.Forms.Panel();\n            this.lbNoMatches = new System.Windows.Forms.Label();\n            this.lbSearchList = new System.Windows.Forms.ListBox();\n            this.cmListCerts = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.cmiLvPlanToLevel = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel1 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel2 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel3 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel4 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel5 = new System.Windows.Forms.ToolStripMenuItem();\n            this.planToSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.cmiExpandSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmiCollapseSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.expandCollapseSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.cmiExpandAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmiCollapseAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.tvItems = new EVEMon.Common.Controls.TreeView();\n            this.ilCertIcons = new System.Windows.Forms.ImageList(this.components);\n            this.lvSortedList = new System.Windows.Forms.ListView();\n            this.chName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chSortKey = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.pnlFilter = new System.Windows.Forms.Panel();\n            this.pbSearchTextDel = new System.Windows.Forms.PictureBox();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchImage)).BeginInit();\n            this.pnlResults.SuspendLayout();\n            this.cmListCerts.SuspendLayout();\n            this.pnlFilter.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchTextDel)).BeginInit();\n            this.SuspendLayout();\n            // \n            // cbFilter\n            // \n            this.cbFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbFilter.Items.AddRange(new object[] {\n            \"All\",\n            \"Completed\",\n            \"Hide completed\",\n            \"Next level is trainable\",\n            \"Next level is untrainable\"});\n            this.cbFilter.Location = new System.Drawing.Point(45, 3);\n            this.cbFilter.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);\n            this.cbFilter.MaxDropDownItems = 12;\n            this.cbFilter.Name = \"cbFilter\";\n            this.cbFilter.Size = new System.Drawing.Size(182, 21);\n            this.cbFilter.TabIndex = 51;\n            this.cbFilter.SelectedIndexChanged += new System.EventHandler(this.cbFilter_SelectedIndexChanged);\n            // \n            // cbSorting\n            // \n            this.cbSorting.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSorting.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSorting.FormattingEnabled = true;\n            this.cbSorting.Items.AddRange(new object[] {\n            \"Name\",\n            \"Time to next level\",\n            \"Time to max level\"});\n            this.cbSorting.Location = new System.Drawing.Point(45, 29);\n            this.cbSorting.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);\n            this.cbSorting.Name = \"cbSorting\";\n            this.cbSorting.Size = new System.Drawing.Size(182, 21);\n            this.cbSorting.TabIndex = 55;\n            this.cbSorting.SelectedIndexChanged += new System.EventHandler(this.cbSorting_SelectedIndexChanged);\n            // \n            // lblSort\n            // \n            this.lblSort.AutoSize = true;\n            this.lblSort.Location = new System.Drawing.Point(9, 32);\n            this.lblSort.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.lblSort.Name = \"lblSort\";\n            this.lblSort.Size = new System.Drawing.Size(29, 13);\n            this.lblSort.TabIndex = 56;\n            this.lblSort.Text = \"Sort:\";\n            // \n            // pbSearchImage\n            // \n            this.pbSearchImage.Image = ((System.Drawing.Image)(resources.GetObject(\"pbSearchImage.Image\")));\n            this.pbSearchImage.InitialImage = null;\n            this.pbSearchImage.Location = new System.Drawing.Point(9, 54);\n            this.pbSearchImage.Margin = new System.Windows.Forms.Padding(2);\n            this.pbSearchImage.Name = \"pbSearchImage\";\n            this.pbSearchImage.Size = new System.Drawing.Size(20, 20);\n            this.pbSearchImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbSearchImage.TabIndex = 52;\n            this.pbSearchImage.TabStop = false;\n            // \n            // lbSearchTextHint\n            // \n            this.lbSearchTextHint.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left)));\n            this.lbSearchTextHint.AutoSize = true;\n            this.lbSearchTextHint.BackColor = System.Drawing.SystemColors.Window;\n            this.lbSearchTextHint.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.lbSearchTextHint.Location = new System.Drawing.Point(49, 57);\n            this.lbSearchTextHint.Name = \"lbSearchTextHint\";\n            this.lbSearchTextHint.Size = new System.Drawing.Size(65, 13);\n            this.lbSearchTextHint.TabIndex = 53;\n            this.lbSearchTextHint.Text = \"Search Text\";\n            this.lbSearchTextHint.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            this.lbSearchTextHint.Click += new System.EventHandler(this.lbSearchTextHint_Click);\n            // \n            // lblFilter\n            // \n            this.lblFilter.AutoSize = true;\n            this.lblFilter.Location = new System.Drawing.Point(6, 6);\n            this.lblFilter.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.lblFilter.Name = \"lblFilter\";\n            this.lblFilter.Size = new System.Drawing.Size(32, 13);\n            this.lblFilter.TabIndex = 54;\n            this.lblFilter.Text = \"Filter:\";\n            // \n            // tbSearchText\n            // \n            this.tbSearchText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbSearchText.Location = new System.Drawing.Point(45, 54);\n            this.tbSearchText.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);\n            this.tbSearchText.Name = \"tbSearchText\";\n            this.tbSearchText.Size = new System.Drawing.Size(182, 20);\n            this.tbSearchText.TabIndex = 57;\n            this.tbSearchText.TextChanged += new System.EventHandler(this.tbSearchText_TextChanged);\n            // \n            // pnlResults\n            // \n            this.pnlResults.AutoSize = true;\n            this.pnlResults.Controls.Add(this.lbNoMatches);\n            this.pnlResults.Controls.Add(this.lbSearchList);\n            this.pnlResults.Controls.Add(this.tvItems);\n            this.pnlResults.Controls.Add(this.lvSortedList);\n            this.pnlResults.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pnlResults.Location = new System.Drawing.Point(0, 78);\n            this.pnlResults.Margin = new System.Windows.Forms.Padding(0);\n            this.pnlResults.Name = \"pnlResults\";\n            this.pnlResults.Size = new System.Drawing.Size(227, 343);\n            this.pnlResults.TabIndex = 60;\n            // \n            // lbNoMatches\n            // \n            this.lbNoMatches.BackColor = System.Drawing.SystemColors.Window;\n            this.lbNoMatches.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbNoMatches.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.lbNoMatches.Location = new System.Drawing.Point(0, 0);\n            this.lbNoMatches.Margin = new System.Windows.Forms.Padding(0);\n            this.lbNoMatches.Name = \"lbNoMatches\";\n            this.lbNoMatches.Padding = new System.Windows.Forms.Padding(4, 30, 4, 4);\n            this.lbNoMatches.Size = new System.Drawing.Size(227, 343);\n            this.lbNoMatches.TabIndex = 23;\n            this.lbNoMatches.Text = \"No certificates match your search.\";\n            this.lbNoMatches.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            this.lbNoMatches.Visible = false;\n            // \n            // lbSearchList\n            // \n            this.lbSearchList.ContextMenuStrip = this.cmListCerts;\n            this.lbSearchList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbSearchList.FormattingEnabled = true;\n            this.lbSearchList.IntegralHeight = false;\n            this.lbSearchList.Location = new System.Drawing.Point(0, 0);\n            this.lbSearchList.Margin = new System.Windows.Forms.Padding(2);\n            this.lbSearchList.Name = \"lbSearchList\";\n            this.lbSearchList.Size = new System.Drawing.Size(227, 343);\n            this.lbSearchList.TabIndex = 46;\n            this.lbSearchList.Visible = false;\n            this.lbSearchList.SelectedIndexChanged += new System.EventHandler(this.lbSearchList_SelectedIndexChanged);\n            this.lbSearchList.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbSearchList_MouseDown);\n            this.lbSearchList.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lbSearchList_MouseMove);\n            // \n            // cmListCerts\n            // \n            this.cmListCerts.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.cmiLvPlanToLevel,\n            this.planToSeparator,\n            this.cmiExpandSelected,\n            this.cmiCollapseSelected,\n            this.expandCollapseSeparator,\n            this.cmiExpandAll,\n            this.cmiCollapseAll});\n            this.cmListCerts.Name = \"cmListSkills\";\n            this.cmListCerts.Size = new System.Drawing.Size(167, 126);\n            // \n            // cmiLvPlanToLevel\n            // \n            this.cmiLvPlanToLevel.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tsmLevel1,\n            this.tsmLevel2,\n            this.tsmLevel3,\n            this.tsmLevel4,\n            this.tsmLevel5});\n            this.cmiLvPlanToLevel.Image = ((System.Drawing.Image)(resources.GetObject(\"cmiLvPlanToLevel.Image\")));\n            this.cmiLvPlanToLevel.Name = \"cmiLvPlanToLevel\";\n            this.cmiLvPlanToLevel.Size = new System.Drawing.Size(166, 22);\n            this.cmiLvPlanToLevel.Text = \"&Plan to...\";\n            // \n            // tsmLevel1\n            // \n            this.tsmLevel1.Name = \"tsmLevel1\";\n            this.tsmLevel1.Size = new System.Drawing.Size(114, 22);\n            this.tsmLevel1.Text = \"Level I\";\n            this.tsmLevel1.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsmLevel2\n            // \n            this.tsmLevel2.Name = \"tsmLevel2\";\n            this.tsmLevel2.Size = new System.Drawing.Size(114, 22);\n            this.tsmLevel2.Text = \"Level II\";\n            this.tsmLevel2.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsmLevel3\n            // \n            this.tsmLevel3.Name = \"tsmLevel3\";\n            this.tsmLevel3.Size = new System.Drawing.Size(114, 22);\n            this.tsmLevel3.Text = \"Level III\";\n            this.tsmLevel3.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsmLevel4\n            // \n            this.tsmLevel4.Name = \"tsmLevel4\";\n            this.tsmLevel4.Size = new System.Drawing.Size(114, 22);\n            this.tsmLevel4.Text = \"Level IV\";\n            this.tsmLevel4.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsmLevel5\n            // \n            this.tsmLevel5.Name = \"tsmLevel5\";\n            this.tsmLevel5.Size = new System.Drawing.Size(114, 22);\n            this.tsmLevel5.Text = \"Level V\";\n            this.tsmLevel5.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // planToSeparator\n            // \n            this.planToSeparator.Name = \"planToSeparator\";\n            this.planToSeparator.Size = new System.Drawing.Size(163, 6);\n            // \n            // cmiExpandSelected\n            // \n            this.cmiExpandSelected.Name = \"cmiExpandSelected\";\n            this.cmiExpandSelected.Size = new System.Drawing.Size(166, 22);\n            this.cmiExpandSelected.Text = \"Expand Selected\";\n            this.cmiExpandSelected.Click += new System.EventHandler(this.cmiExpandSelected_Click);\n            // \n            // cmiCollapseSelected\n            // \n            this.cmiCollapseSelected.Name = \"cmiCollapseSelected\";\n            this.cmiCollapseSelected.Size = new System.Drawing.Size(166, 22);\n            this.cmiCollapseSelected.Text = \"Collapse Selected\";\n            this.cmiCollapseSelected.Click += new System.EventHandler(this.cmiCollapseSelected_Click);\n            // \n            // expandCollapseSeparator\n            // \n            this.expandCollapseSeparator.Name = \"expandCollapseSeparator\";\n            this.expandCollapseSeparator.Size = new System.Drawing.Size(163, 6);\n            // \n            // cmiExpandAll\n            // \n            this.cmiExpandAll.Name = \"cmiExpandAll\";\n            this.cmiExpandAll.Size = new System.Drawing.Size(166, 22);\n            this.cmiExpandAll.Text = \"&Expand All\";\n            this.cmiExpandAll.Click += new System.EventHandler(this.cmiExpandAll_Click);\n            // \n            // cmiCollapseAll\n            // \n            this.cmiCollapseAll.Name = \"cmiCollapseAll\";\n            this.cmiCollapseAll.Size = new System.Drawing.Size(166, 22);\n            this.cmiCollapseAll.Text = \"&Collapse All\";\n            this.cmiCollapseAll.Click += new System.EventHandler(this.cmiCollapseAll_Click);\n            // \n            // tvItems\n            // \n            this.tvItems.ContextMenuStrip = this.cmListCerts;\n            this.tvItems.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tvItems.HideSelection = false;\n            this.tvItems.ImageIndex = 0;\n            this.tvItems.ImageList = this.ilCertIcons;\n            this.tvItems.Location = new System.Drawing.Point(0, 0);\n            this.tvItems.Margin = new System.Windows.Forms.Padding(2);\n            this.tvItems.Name = \"tvItems\";\n            this.tvItems.SelectedImageIndex = 0;\n            this.tvItems.SelectionBackColor = System.Drawing.SystemColors.Highlight;\n            this.tvItems.SelectionMode = EVEMon.Common.Controls.TreeViewSelectionMode.SingleSelect;\n            this.tvItems.Size = new System.Drawing.Size(227, 343);\n            this.tvItems.TabIndex = 20;\n            this.tvItems.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tvItems_MouseDown);\n            this.tvItems.MouseMove += new System.Windows.Forms.MouseEventHandler(this.tvItems_MouseMove);\n            // \n            // ilCertIcons\n            // \n            this.ilCertIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilCertIcons.ImageStream\")));\n            this.ilCertIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilCertIcons.Images.SetKeyName(0, \"level0\");\n            this.ilCertIcons.Images.SetKeyName(1, \"level1\");\n            this.ilCertIcons.Images.SetKeyName(2, \"level2\");\n            this.ilCertIcons.Images.SetKeyName(3, \"level3\");\n            this.ilCertIcons.Images.SetKeyName(4, \"level4\");\n            this.ilCertIcons.Images.SetKeyName(5, \"level5\");\n            this.ilCertIcons.Images.SetKeyName(6, \"Certificate\");\n            // \n            // lvSortedList\n            // \n            this.lvSortedList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chName,\n            this.chSortKey});\n            this.lvSortedList.ContextMenuStrip = this.cmListCerts;\n            this.lvSortedList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvSortedList.FullRowSelect = true;\n            this.lvSortedList.HideSelection = false;\n            this.lvSortedList.Location = new System.Drawing.Point(0, 0);\n            this.lvSortedList.Margin = new System.Windows.Forms.Padding(2);\n            this.lvSortedList.Name = \"lvSortedList\";\n            this.lvSortedList.Size = new System.Drawing.Size(227, 343);\n            this.lvSortedList.TabIndex = 28;\n            this.lvSortedList.TileSize = new System.Drawing.Size(16, 16);\n            this.lvSortedList.UseCompatibleStateImageBehavior = false;\n            this.lvSortedList.View = System.Windows.Forms.View.Details;\n            this.lvSortedList.Visible = false;\n            this.lvSortedList.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lvSortedList_MouseDown);\n            this.lvSortedList.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lvSortedList_MouseMove);\n            // \n            // chName\n            // \n            this.chName.Text = \"Name\";\n            this.chName.Width = 120;\n            // \n            // chSortKey\n            // \n            this.chSortKey.Text = \"Sort\";\n            // \n            // pnlFilter\n            // \n            this.pnlFilter.Controls.Add(this.lbSearchTextHint);\n            this.pnlFilter.Controls.Add(this.pbSearchTextDel);\n            this.pnlFilter.Controls.Add(this.cbSorting);\n            this.pnlFilter.Controls.Add(this.cbFilter);\n            this.pnlFilter.Controls.Add(this.tbSearchText);\n            this.pnlFilter.Controls.Add(this.lblFilter);\n            this.pnlFilter.Controls.Add(this.pbSearchImage);\n            this.pnlFilter.Controls.Add(this.lblSort);\n            this.pnlFilter.Dock = System.Windows.Forms.DockStyle.Top;\n            this.pnlFilter.Location = new System.Drawing.Point(0, 0);\n            this.pnlFilter.Margin = new System.Windows.Forms.Padding(2);\n            this.pnlFilter.Name = \"pnlFilter\";\n            this.pnlFilter.Size = new System.Drawing.Size(227, 78);\n            this.pnlFilter.TabIndex = 47;\n            // \n            // pbSearchTextDel\n            // \n            this.pbSearchTextDel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.pbSearchTextDel.Image = ((System.Drawing.Image)(resources.GetObject(\"pbSearchTextDel.Image\")));\n            this.pbSearchTextDel.InitialImage = null;\n            this.pbSearchTextDel.Location = new System.Drawing.Point(209, 56);\n            this.pbSearchTextDel.Name = \"pbSearchTextDel\";\n            this.pbSearchTextDel.Size = new System.Drawing.Size(16, 16);\n            this.pbSearchTextDel.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbSearchTextDel.TabIndex = 58;\n            this.pbSearchTextDel.TabStop = false;\n            this.pbSearchTextDel.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pbSearchTextDel_MouseUp);\n            // \n            // CertificateSelectControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.pnlResults);\n            this.Controls.Add(this.pnlFilter);\n            this.Margin = new System.Windows.Forms.Padding(2);\n            this.Name = \"CertificateSelectControl\";\n            this.Size = new System.Drawing.Size(227, 421);\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchImage)).EndInit();\n            this.pnlResults.ResumeLayout(false);\n            this.cmListCerts.ResumeLayout(false);\n            this.pnlFilter.ResumeLayout(false);\n            this.pnlFilter.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchTextDel)).EndInit();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ComboBox cbFilter;\n        private System.Windows.Forms.ComboBox cbSorting;\n        private System.Windows.Forms.Label lblSort;\n        private System.Windows.Forms.PictureBox pbSearchImage;\n        private System.Windows.Forms.Label lbSearchTextHint;\n        private System.Windows.Forms.Label lblFilter;\n        private System.Windows.Forms.TextBox tbSearchText;\n        private System.Windows.Forms.Panel pnlResults;\n        private System.Windows.Forms.Label lbNoMatches;\n        private System.Windows.Forms.ListBox lbSearchList;\n        private EVEMon.Common.Controls.TreeView tvItems;\n        private System.Windows.Forms.ListView lvSortedList;\n        private System.Windows.Forms.ColumnHeader chName;\n        private System.Windows.Forms.ColumnHeader chSortKey;\n        private System.Windows.Forms.ImageList ilCertIcons;\n        private System.Windows.Forms.ContextMenuStrip cmListCerts;\n        private System.Windows.Forms.ToolStripMenuItem cmiLvPlanToLevel;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel1;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel2;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel3;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel4;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel5;\n        private System.Windows.Forms.ToolStripSeparator planToSeparator;\n        private System.Windows.Forms.ToolStripMenuItem cmiExpandAll;\n        private System.Windows.Forms.ToolStripMenuItem cmiCollapseAll;\n        private System.Windows.Forms.Panel pnlFilter;\n        private System.Windows.Forms.ToolStripMenuItem cmiExpandSelected;\n        private System.Windows.Forms.ToolStripMenuItem cmiCollapseSelected;\n        private System.Windows.Forms.ToolStripSeparator expandCollapseSeparator;\n        private System.Windows.Forms.PictureBox pbSearchTextDel;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/CertificateSelectControl.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Drawing.Imaging;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Represents a control to select certificates\n    /// </summary>\n    public partial class CertificateSelectControl : UserControl\n    {\n        // Blank image list for 'Safe for work' setting\n        private readonly ImageList m_emptyImageList = new ImageList();\n\n        private CertificateClass m_selectedCertificateClass;\n        private Character m_character;\n        private Plan m_plan;\n        private Font m_iconsFont;\n        private bool m_blockSelectionReentrancy;\n        private bool m_allExpanded;\n        private bool m_init;\n\n        public event EventHandler<EventArgs> SelectionChanged;\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        public CertificateSelectControl()\n        {\n            InitializeComponent();\n\n            tbSearchText.KeyPress += tbSearchText_KeyPress;\n            tbSearchText.Enter += tbSearchText_Enter;\n            tbSearchText.Leave += tbSearchText_Leave;\n            lvSortedList.SelectedIndexChanged += lvSortedList_SelectedIndexChanged;\n            tvItems.AfterSelect += tvItems_AfterSelect;\n            cmListCerts.Opening += cmListCerts_Opening;\n        }\n\n        #endregion\n\n\n        #region Internal Properties\n\n        /// <summary>\n        /// Gets or sets the character.\n        /// </summary>\n        /// <value>\n        /// The character.\n        /// </value>\n        internal Character Character\n        {\n            get { return m_character; }\n            set\n            {\n                if (value == null || m_character == value)\n                    return;\n\n                m_character = value;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the current plan.\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                if (m_plan == value)\n                    return;\n\n                // Should we be transforming a Data Browser to a Skill Planner?\n                bool transformToPlanner = (value != null) && (m_plan == null) && (m_character != null);\n\n                if (value == null)\n                    return;\n\n                m_plan = value;\n                m_character = (Character)m_plan.Character;\n\n                // Transform a Data Browser to a Skill Planner\n                if (!transformToPlanner)\n                    return;\n\n                InitializeFiltersControls();\n                UpdateContent();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the selected certificate class.\n        /// </summary>\n        internal CertificateClass SelectedCertificateClass\n        {\n            get { return m_selectedCertificateClass; }\n            set\n            {\n                if (m_selectedCertificateClass == value)\n                    return;\n\n                m_selectedCertificateClass = value;\n\n                if (value == null)\n                {\n                    OnSelectionChanged();\n                    return;\n                }\n\n                // Updates the selection for the three controls\n                m_blockSelectionReentrancy = true;\n                try\n                {\n                    tvItems.SelectNodeWithTag(value);\n                }\n                finally\n                {\n                    m_blockSelectionReentrancy = false;\n                }\n\n                // Fires event for subscribers\n                OnSelectionChanged();\n            }\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load, read settings and update the content.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            m_emptyImageList.ImageSize = new Size(24, 24);\n            m_emptyImageList.Images.Add(new Bitmap(24, 24));\n\n            m_iconsFont = FontFactory.GetFont(\"Tahoma\", 8.0f, FontStyle.Bold, GraphicsUnit.Pixel);\n\n            // Initialize the filters controls\n            InitializeFiltersControls();\n\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            Disposed += OnDisposed;\n\n            // Updates the controls\n            UpdateControlVisibility();\n        }\n\n        /// <summary>\n        /// Initializes the filters controls.\n        /// </summary>\n        private void InitializeFiltersControls()\n        {\n            m_init = false;\n\n            InitializeFilterControl();\n            InitializeSortControl();\n\n            InitiliazeSelectedIndexes();\n\n            m_init = true;\n        }\n\n        /// <summary>\n        /// Initializes the filter control.\n        /// </summary>\n        private void InitializeFilterControl()\n        {\n            cbFilter.Items.Clear();\n            cbFilter.Items.AddRange(EnumExtensions.GetDescriptions<CertificateFilter>()\n                .Where(description => !string.IsNullOrWhiteSpace((string)description))\n                .ToArray());\n\n            // Skill Planner or Data Browser (associated character)\n            if ((m_plan != null) || (m_character != null))\n                return;\n\n            // Data Browser (associated character)\n            if (m_character != null)\n                return;\n\n            // Data Browser (non-associated character)\n            const int Index = (int)CertificateFilter.All + 1;\n            while (cbFilter.Items.Count > Index)\n            {\n                cbFilter.Items.RemoveAt(Index);\n            }\n        }\n\n        /// <summary>\n        /// Initializes the sort control.\n        /// </summary>\n        private void InitializeSortControl()\n        {\n            cbSorting.Items.Clear();\n            cbSorting.Items.AddRange(EnumExtensions.GetDescriptions<CertificateSort>()\n                .Where(description => !string.IsNullOrWhiteSpace((string)description))\n                .ToArray());\n\n            // Skill Planner or Data Browser (associated character)\n            if ((m_plan != null) || (m_character != null))\n                return;\n\n            cbSorting.Items.Remove(CertificateSort.TimeToNextLevel.GetDescription());\n            cbSorting.Items.Remove(CertificateSort.TimeToMaxLevel.GetDescription());\n        }\n\n        /// <summary>\n        /// Initiliazes the selected indexes.\n        /// </summary>\n        private void InitiliazeSelectedIndexes()\n        {\n            if (Settings.UI.UseStoredSearchFilters)\n            {\n                CertificateBrowserSettings settings;\n\n                // Skill Planner\n                if (m_plan != null)\n                    settings = Settings.UI.CertificateBrowser;\n                // Character associated Data Browser\n                else if (m_character != null)\n                    settings = Settings.UI.CertificateCharacterDataBrowser;\n                // Data Browser\n                else\n                    settings = Settings.UI.CertificateDataBrowser;\n\n                cbFilter.SelectedItem =\n                    cbFilter.Items.Contains(settings.Filter.GetDescription())\n                        ? settings.Filter.GetDescription()\n                        : CertificateFilter.All.GetDescription();\n                cbSorting.SelectedItem =\n                    cbSorting.Items.Contains(settings.Sort.GetDescription())\n                        ? settings.Sort.GetDescription()\n                        : CertificateSort.None.GetDescription();\n\n                tbSearchText.Text = settings.TextSearch;\n                lbSearchTextHint.Visible = string.IsNullOrEmpty(tbSearchText.Text);\n\n                return;\n            }\n\n            cbFilter.SelectedItem = CertificateFilter.All.GetDescription();\n            cbSorting.SelectedItem = CertificateSort.None.GetDescription();\n        }\n\n        /// <summary>\n        /// Occurs when the control visibility changed.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\" /> that contains the event data.</param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (!Visible)\n                return;\n\n            UpdateSearchTextHintVisibility();\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// When the settings are changed, update the display\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateControlVisibility();\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Updates the control visibility.\n        /// </summary>\n        private void UpdateControlVisibility()\n        {\n            pbSearchImage.Visible = !Settings.UI.SafeForWork;\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Updates the search text hint visibility.\n        /// </summary>\n        private void UpdateSearchTextHintVisibility()\n        {\n            lbSearchTextHint.Visible = !tbSearchText.Focused && string.IsNullOrEmpty(tbSearchText.Text);\n        }\n\n        #endregion\n\n\n        #region Control Events\n\n        /// <summary>\n        /// When the combo filter changes, we need to refresh the display.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbFilter_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (!m_init)\n                return;\n\n            UpdateContent();\n\n            CertificateBrowserSettings settings;\n\n            // Skill Planner\n            if (m_plan != null)\n                settings = Settings.UI.CertificateBrowser;\n            // Character associated Data Browser\n            else if (m_character != null)\n                settings = Settings.UI.CertificateCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.CertificateDataBrowser;\n\n            settings.Filter =\n                (CertificateFilter)\n                    (EnumExtensions.GetValueFromDescription<CertificateFilter>((string)cbFilter.SelectedItem) ??\n                     CertificateFilter.All);\n        }\n\n        /// <summary>\n        /// When the sort filter changes, we need to refresh the display.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbSorting_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (!m_init)\n                return;\n\n            UpdateContent();\n            lvSortedList.Focus();\n\n            CertificateBrowserSettings settings;\n\n            // Skill Planner\n            if (m_plan != null)\n                settings = Settings.UI.CertificateBrowser;\n            // Character associated Data Browser\n            else if (m_character != null)\n                settings = Settings.UI.CertificateCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.CertificateDataBrowser;\n\n            settings.Sort =\n                    (CertificateSort)\n                        (EnumExtensions.GetValueFromDescription<CertificateSort>((string)cbSorting.SelectedItem) ??\n                         CertificateSort.None);\n        }\n\n        /// <summary>\n        /// When the \"Search Text\" label changes, we focus the textbox behind.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbSearchTextHint_Click(object sender, EventArgs e)\n        {\n            tbSearchText.Focus();\n        }\n\n        /// <summary>\n        /// When the user enters the search textbox, we hide the \"search text\" hint...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tbSearchText_Enter(object sender, EventArgs e)\n        {\n            lbSearchTextHint.Visible = false;\n        }\n\n        /// <summary>\n        /// When the user leaves the search textbox, we display the \"search text\" hint...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tbSearchText_Leave(object sender, EventArgs e)\n        {\n            UpdateSearchTextHintVisibility();\n        }\n\n        /// <summary>\n        /// When the search text box changes, we update the settings with this new filter and we update the display.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tbSearchText_TextChanged(object sender, EventArgs e)\n        {\n            if (!m_init)\n                return;\n\n            UpdateContent();\n\n            CertificateBrowserSettings settings;\n\n            // Skill Planner\n            if (m_plan != null)\n                settings = Settings.UI.CertificateBrowser;\n            // Character associated Data Browser\n            else if (m_character != null)\n                settings = Settings.UI.CertificateCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.CertificateDataBrowser;\n\n            settings.TextSearch = tbSearchText.Text;\n        }\n\n        /// <summary>\n        /// When the \"left button\" key is pressed, we select the whole text. (???)\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tbSearchText_KeyPress(object sender, KeyPressEventArgs e)\n        {\n            // (Ctrl + A) has KeyChar value 1\n            if (e.KeyChar != (char)Keys.LButton)\n                return;\n\n            tbSearchText.SelectAll();\n            e.Handled = true;\n        }\n\n        /// <summary>\n        /// When the results listbox's selection is changed, we update the selected index.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbSearchList_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            UpdateSelection(lbSearchList.SelectedItem);\n        }\n\n        /// <summary>\n        /// Changes the selection when you right click on a search.\n        /// </summary>\n        /// <param name=\"sender\">is lbSearchList</param>\n        /// <param name=\"e\"></param>\n        private void lbSearchList_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lbSearchList.SelectedIndex = lbSearchList.IndexFromPoint(e.Location);\n            lbSearchList.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbSearchList_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lbSearchList.Cursor = m_plan != null && lbSearchList.IndexFromPoint(e.Location) > -1\n                ? CustomCursors.ContextMenu\n                : Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the sorted listview' selection is changed, we update the selected index.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSortedList_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            UpdateSelection(lvSortedList.SelectedItems.Cast<ListViewItem>().FirstOrDefault()?.Tag);\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void lvSortedList_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lvSortedList.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lvSortedList_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvSortedList.Cursor = m_plan != null && lvSortedList.GetItemAt(e.X, e.Y) != null\n                ? CustomCursors.ContextMenu\n                : Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void tvItems_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            tvItems.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void tvItems_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            tvItems.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// When the treeview's selection is changed, we update the selected index.\n        /// Also used to force node selection on a right click.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tvItems_AfterSelect(object sender, TreeViewEventArgs e)\n        {\n            UpdateSelection(e.Node?.Tag);\n        }\n\n        /// <summary>\n        /// Handles the MouseUp event of the pbSearchTextDel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void pbSearchTextDel_MouseUp(object sender, MouseEventArgs e)\n        {\n            tbSearchText.Clear();\n            UpdateSearchTextHintVisibility();\n        }\n\n        #endregion\n\n\n        #region Display update\n\n        /// <summary>\n        /// Updates the display.\n        /// </summary>\n        private void UpdateContent()\n        {\n            IList<CertificateClass> classes = GetFilteredData().ToList();\n\n            tvItems.Hide();\n            lbSearchList.Hide();\n            lvSortedList.Hide();\n            lbNoMatches.Hide();\n\n            // Nothing to display ?\n            if (!classes.Any())\n            {\n                lbNoMatches.Show();\n                UpdateSelection(null);\n                return;\n            }\n\n            // Is it sorted ?\n            if (cbSorting.SelectedIndex != 0)\n            {\n                lvSortedList.Show();\n                UpdateListView(classes);\n                return;\n            }\n\n            // Not sorted but there is a text filter\n            if (!string.IsNullOrEmpty(tbSearchText.Text))\n            {\n                lbSearchList.Show();\n                UpdateListBox(classes);\n                return;\n            }\n\n            // Regular display, the tree \n            tvItems.Show();\n            UpdateTree(classes);\n        }\n\n        /// <summary>\n        /// Updates the certificates tree.\n        /// </summary>\n        /// <param name=\"classes\">The list of certificate classes to show</param>\n        private void UpdateTree(IList<CertificateClass> classes)\n        {\n            // Store the selected node (if any) to restore it after the update\n            int selectedItemHash = tvItems.SelectedNode?.Tag?.GetHashCode() ?? 0;\n            \n            // Fill the tree\n            int numberOfItems = 0;\n            tvItems.BeginUpdate();\n            try\n            {\n                tvItems.ImageList = Settings.UI.SafeForWork ? m_emptyImageList : ilCertIcons;\n\n                // Clear the existing nodes\n                tvItems.Nodes.Clear();\n\n                // Creates the nodes representing the categories\n                foreach (IGrouping<CertificateGroup, CertificateClass> category in classes.GroupBy(x => x.Category).OrderBy(x => x.Key.Name))\n                {\n                    int imageIndex = tvItems.ImageList.Images.IndexOfKey(\"Certificate\");\n\n                    TreeNode categoryNode = new TreeNode\n                    {\n                        Text = category.Key.Name,\n                        ImageIndex = imageIndex,\n                        SelectedImageIndex = imageIndex,\n                        Tag = category\n                    };\n\n                    foreach (TreeNode node in category\n                        .Select(certClass =>\n                            new\n                            {\n                                certClass,\n                                index = m_character == null ? imageIndex : GetCertImageIndex(certClass.Certificate)\n                            })\n                        .Select(childNode =>\n                            new TreeNode\n                            {\n                                Text = childNode.certClass.Name,\n                                ImageIndex = childNode.index,\n                                SelectedImageIndex = childNode.index,\n                                Tag = childNode.certClass\n                            }))\n                    {\n                        categoryNode.Nodes.Add(node);\n                        numberOfItems++;\n                    }\n\n                    tvItems.Nodes.Add(categoryNode);\n                }\n\n                TreeNode selectedNode = null;\n\n                // Restore the selected node (if any)\n                if (selectedItemHash > 0)\n                {\n                    foreach (TreeNode node in tvItems.GetAllNodes()\n                        .Where(node => node.Tag.GetHashCode() == selectedItemHash))\n                    {\n                        tvItems.SelectNodeWithTag(node.Tag);\n                        selectedNode = node;\n                    }\n                }\n\n                if (selectedNode != null)\n                    return;\n\n                // Reset if the node doesn't exist anymore\n                tvItems.SelectNodeWithTag(null);\n                UpdateSelection(null);\n            }\n            finally\n            {\n                tvItems.EndUpdate();\n                m_allExpanded = false;\n\n                // If the filtered set is small enough to fit all nodes on screen, call expandAll()\n                if (numberOfItems < tvItems.DisplayRectangle.Height / tvItems.ItemHeight)\n                {\n                    tvItems.ExpandAll();\n                    m_allExpanded = true;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Updates the list box displayed when there is a text filter and no sort criteria.\n        /// </summary>\n        /// <param name=\"classes\">The list of certificates to show</param>\n        private void UpdateListBox(IList<CertificateClass> classes)\n        {\n            // Store the selected node (if any) to restore it after the update\n            int selectedItemHash = tvItems.SelectedNode?.Tag?.GetHashCode() ?? 0;\n\n            lbSearchList.BeginUpdate();\n            try\n            {\n                lbSearchList.Items.Clear();\n\n                foreach (CertificateClass certClass in classes)\n                {\n                    lbSearchList.Items.Add(certClass);\n\n                    // Restore the selected node (if any)\n                    if (selectedItemHash > 0 && certClass.GetHashCode() == selectedItemHash)\n                        lbSearchList.SelectedItem = certClass;\n                }\n            }\n            finally\n            {\n                lbSearchList.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Updates the listview displayed when there is a sort criteria.\n        /// </summary>\n        /// <param name=\"classes\">The list of certificates to show</param>\n        private void UpdateListView(IList<CertificateClass> classes)\n        {\n            // Store the selected node (if any) to restore it after the update\n            int selectedItemHash = tvItems.SelectedNode?.Tag?.GetHashCode() ?? 0;\n\n            // Retrieve the data to fetch into the list\n            IEnumerable<string> labels = null;\n            string column = GetSortedListData(ref classes, ref labels);\n            if (labels == null)\n                return;\n\n            lvSortedList.BeginUpdate();\n            try\n            {\n                lvSortedList.Items.Clear();\n\n                using (IEnumerator<string> labelsEnumerator = labels.GetEnumerator())\n                {\n                    foreach (CertificateClass certClass in classes)\n                    {\n                        // Retrieves the label for the second column (sort key)\n                        labelsEnumerator.MoveNext();\n                        string label = labelsEnumerator.Current;\n\n                        // Add the item\n                        ListViewItem lvi = new ListViewItem(certClass.Name);\n                        lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi, label));\n                        lvi.Tag = certClass;\n\n                        lvSortedList.Items.Add(lvi);\n\n                       // Restore the selected node (if any)\n                        if (selectedItemHash > 0 && certClass.GetHashCode() == selectedItemHash)\n                            lvi.Selected = true;\n                    }\n                }\n\n                // Auto adjust column widths\n                chSortKey.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);\n                chName.Width = Math.Max(0, Math.Max(lvSortedList.ClientSize.Width / 2,\n                                                    lvSortedList.ClientSize.Width - (chSortKey.Width + 16)));\n                chSortKey.Text = column;\n            }\n            finally\n            {\n                lvSortedList.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Gets the filtered list of data.\n        /// </summary>\n        /// <returns>The fitlerd list of the data</returns>\n        private IEnumerable<CertificateClass> GetFilteredData()\n        {\n            IEnumerable<CertificateClass> classes = m_character?.CertificateClasses ??\n                                                    CertificateClassCollection.CertificateClasses;\n\n            // Apply the selected filter \n            Func<CertificateClass, bool> predicate = GetFilter();\n            classes = classes.Where(predicate);\n\n            // Text search\n            if (!string.IsNullOrEmpty(tbSearchText.Text))\n            {\n                classes = classes.Where(x => x.Name.Contains(tbSearchText.Text, ignoreCase: true));\n            }\n\n            // When sorting by \"time to...\", filter completed items\n            if ((string)cbSorting.SelectedItem == CertificateSort.TimeToMaxLevel.GetDescription() ||\n                (string)cbSorting.SelectedItem == CertificateSort.TimeToNextLevel.GetDescription())\n            {\n                classes = classes.Where(x => !x.IsCompleted);\n            }\n\n            return classes;\n        }\n\n        /// <summary>\n        /// Gets the items' filter.\n        /// </summary>\n        private Func<CertificateClass, bool> GetFilter()\n        {\n            CertificateFilter certificateFilter =\n                (CertificateFilter)\n                    (EnumExtensions.GetValueFromDescription<CertificateFilter>((string)cbFilter.SelectedItem) ??\n                     CertificateFilter.All);\n\n            // Update the base filter from the combo box\n            switch (certificateFilter)\n            {\n                default:\n                    return x => true;\n                case CertificateFilter.HideMaxLevel:\n                    return x => !x.IsCompleted;\n                case CertificateFilter.NextLevelTrainable:\n                    return x => x.IsFurtherTrainable;\n                case CertificateFilter.NextLevelUntrainable:\n                    return x => !x.IsFurtherTrainable & !x.IsCompleted;\n                case CertificateFilter.Completed:\n                    return x => x.IsCompleted;\n            }\n        }\n\n        /// <summary>\n        /// Gets the data for the sorted list view.\n        /// </summary>\n        /// <param name=\"classes\">The certificate classes which are shown</param>\n        /// <param name=\"labels\">The labeltexts to show</param>\n        /// <returns>The column header text</returns>\n        private string GetSortedListData(ref IList<CertificateClass> classes, ref IEnumerable<string> labels)\n        {\n            CertificateSort certificateSort =\n                (CertificateSort)\n                    (EnumExtensions.GetValueFromDescription<CertificateSort>((string)cbSorting.SelectedItem) ??\n                     CertificateSort.None);\n\n            IEnumerable<TimeSpan> times;\n            string columnHeader;\n\n            switch (certificateSort)\n            {\n                // Sort by name, default, occurs on initialization\n                default:\n                    return string.Empty;\n                    // Sort by time to next level\n                case CertificateSort.TimeToNextLevel:\n                    {\n                        times = classes.Select(GetTimeToNextLevel);\n                        columnHeader = \"Time\";\n                        break;\n                    }\n                    // Sort by time to max level\n                case CertificateSort.TimeToMaxLevel:\n                    {\n                        times = classes.Select(GetTimeToMaxLevel);\n                        columnHeader = \"Time to Max Level\";\n                        break;\n                    }\n            }\n\n            CertificateClass[] classesArray = classes.ToArray();\n            TimeSpan[] timesArray = times.ToArray();\n            Array.Sort(timesArray, classesArray);\n            classes = classesArray;\n            labels = timesArray.Select(x => x.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas));\n            return columnHeader;\n        }\n\n        /// <summary>\n        /// Gets the time to next grade.\n        /// </summary>\n        /// <param name=\"certificateClass\">The certificate class.</param>\n        /// <returns>The time required to finish the next grade</returns>\n        private static TimeSpan GetTimeToNextLevel(CertificateClass certificateClass)\n        {\n            CertificateLevel lowestTrinedLevel = certificateClass.Certificate.LowestUntrainedLevel;\n            return lowestTrinedLevel?.GetTrainingTime ?? TimeSpan.Zero;\n        }\n\n        /// <summary>\n        /// Gets the time to elite grade.\n        /// </summary>\n        /// <param name=\"certificateClass\">The certificate class.</param>\n        /// <returns>The time required to finish the final grade</returns>\n        private static TimeSpan GetTimeToMaxLevel(CertificateClass certificateClass)\n        {\n            CertificateLevel levelFive = certificateClass.Certificate.GetCertificateLevel(5);\n            return levelFive.IsTrained\n                ? TimeSpan.Zero\n                : levelFive.GetTrainingTime;\n        }\n\n        /// <summary>\n        /// Gets the image's index for the provided certificate class,\n        /// lazily creating the images when they're needed.\n        /// </summary>\n        /// <param name=\"certificate\">The certificate.</param>\n        /// <returns>The index of the image appropriate for the certificate</returns>\n        private int GetCertImageIndex(Certificate certificate)\n        {\n            if (!Settings.UI.SafeForWork)\n            {\n                return certificate.HighestTrainedLevel == null\n                    ? 0\n                    : (int)certificate.HighestTrainedLevel.Level;\n            }\n\n            // Prepares data\n            char[] chars = new char[5];\n            bool[] trained = new bool[5];\n\n            foreach (int level in certificate.AllLevel\n                .Select(certLevel =>\n                    new\n                    {\n                        certLevel,\n                        level = (int)certLevel.Level\n                    })\n                .Where(cert => cert.certLevel.IsTrained)\n                .Select(cert => cert.level))\n            {\n                trained[level - 1] = true;\n                chars[level - 1] = Convert.ToChar(level);\n            }\n\n            // Create key and retrieves its index, then returns if it already exists\n            string key = string.Concat(chars);\n            int index = tvItems.ImageList.Images.IndexOfKey(key);\n            if (index != -1)\n                return index;\n\n            // Create the image if it does not exist yet\n            const int ImageSize = 32;\n            const int MaxLetterWidth = 6;\n\n            Bitmap bmp;\n            using(Bitmap tempBitmap = new Bitmap(ImageSize, ImageSize, PixelFormat.Format32bppArgb))\n            {\n                bmp = (Bitmap)tempBitmap.Clone();\n            }\n\n            using (Graphics g = Graphics.FromImage(bmp))\n            {\n                string[] letters = new string[5];\n                float[] xPositions = new float[5];\n                float x = 0.0f,\n                    height = 0.0f;\n\n                int i = 0;\n                // Scroll through letters and measure them\n                foreach (var certLevel in certificate.AllLevel)\n                {\n                    letters[i] = ((int)certLevel.Level).ToString();\n                    SizeF size = g.MeasureString(letters[i], m_iconsFont, MaxLetterWidth, StringFormat.GenericTypographic);\n                    height = Math.Max(height, size.Height);\n                    xPositions[i] = x;\n                    x += size.Width + 1.0f;\n                    i++;\n                }\n\n                // Y offset\n                float y = Math.Max(0.0f, (ImageSize - height) * 0.5f);\n\n                // Draw the letters\n                g.Clear(Color.White);\n                using (SolidBrush grantedBrush = new SolidBrush(Color.Blue))\n                using (SolidBrush nonGrantedBrush = new SolidBrush(Color.Gray))\n                {\n                    for (int j = 0; j < certificate.AllLevel.Count(); j++)\n                    {\n                        // Special color for trained, gray for the other ones\n                        bool isTrained = trained[j];\n                        SolidBrush brush = isTrained ? grantedBrush : nonGrantedBrush;\n                        g.DrawString(letters[j], m_iconsFont, brush, xPositions[j], y);\n                    }\n                }\n            }\n            // Insert image and return its index\n            tvItems.ImageList.Images.Add(key, bmp);\n            return tvItems.ImageList.Images.IndexOfKey(key);\n        }\n\n        #endregion\n\n\n        #region Selection Helper Methods\n\n        /// <summary>\n        /// Called whenever the selection changes,\n        /// fires the approriate event.\n        /// </summary>\n        private void OnSelectionChanged()\n        {\n            SelectionChanged?.ThreadSafeInvoke(this, new EventArgs());\n        }\n\n        /// <summary>\n        /// Updates the item from the provided selection.\n        /// </summary>\n        /// <param name=\"selection\">The selection</param>\n        private void UpdateSelection(object selection)\n        {\n            if (!m_blockSelectionReentrancy)\n                SelectedCertificateClass = selection as CertificateClass;\n        }\n\n        #endregion\n\n\n        #region Context menus\n\n        /// <summary>\n        /// Context > Plan To > Level N\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void planToLevelMenuItem_Click(object sender, EventArgs e)\n        {\n            IPlanOperation operation = ((ToolStripMenuItem)sender).Tag as IPlanOperation;\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            if (planWindow == null)\n                return;\n\n            PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow, operation);\n        }\n\n        /// <summary>\n        /// When the tree's context menu opens,\n        /// we update the submenus' statuses.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmListCerts_Opening(object sender, CancelEventArgs e)\n        {\n            ContextMenuStrip contextMenu = sender as ContextMenuStrip;\n\n            e.Cancel = contextMenu?.SourceControl == null ||\n                       (!contextMenu.SourceControl.Visible && m_selectedCertificateClass == null) ||\n                       (!tvItems.Visible && m_plan == null);\n\n            if (e.Cancel || contextMenu?.SourceControl == null)\n                return;\n\n            contextMenu.SourceControl.Cursor = Cursors.Default;\n\n            CertificateClass certificateClass = null;\n            TreeNode node = tvItems.SelectedNode;\n            if (node != null)\n                certificateClass = node.Tag as CertificateClass;\n\n            if (m_selectedCertificateClass == null && certificateClass != null)\n                node = null;\n\n            cmiLvPlanToLevel.Visible = m_plan != null && m_selectedCertificateClass?.Certificate != null;\n            planToSeparator.Visible = m_plan != null && m_selectedCertificateClass?.Certificate != null && node != null && tvItems.Visible;\n\n            // \"Expand\" and \"Collapse\" selected menu\n            cmiExpandSelected.Visible = m_selectedCertificateClass?.Certificate == null && node != null && !node.IsExpanded;\n            cmiCollapseSelected.Visible = m_selectedCertificateClass?.Certificate == null && node != null && node.IsExpanded;\n\n            cmiExpandSelected.Text = m_selectedCertificateClass?.Certificate == null && node != null && !node.IsExpanded\n                ? $\"Expand \\\"{node.Text}\\\"\"\n                : string.Empty;\n            cmiCollapseSelected.Text = m_selectedCertificateClass?.Certificate == null && node != null && node.IsExpanded\n                ? $\"Collapse \\\"{node.Text}\\\"\"\n                : string.Empty;\n\n            expandCollapseSeparator.Visible = m_selectedCertificateClass?.Certificate == null && node != null;\n\n            // \"Expand All\" and \"Collapse All\" menu\n            cmiCollapseAll.Enabled = cmiCollapseAll.Visible = tvItems.Visible && m_allExpanded;\n            cmiExpandAll.Enabled = cmiExpandAll.Visible = tvItems.Visible && !cmiCollapseAll.Enabled;\n\n            if (m_selectedCertificateClass?.Certificate == null || m_plan == null)\n                return;\n\n            cmiLvPlanToLevel.Enabled = m_selectedCertificateClass?.Certificate != null &&\n                !m_plan.WillGrantEligibilityFor(m_selectedCertificateClass.Certificate.GetCertificateLevel(5));\n\n            cmiLvPlanToLevel.Text =\n                $\"Plan {(m_selectedCertificateClass == null ? string.Empty : $\"\\\"{m_selectedCertificateClass?.Name}\\\" \")}to...\";\n            \n            // \"Plan to N\" menus\n            for (int i = 1; i <= 5; i++)\n            {\n                SetAdditionMenuStatus(cmiLvPlanToLevel.DropDownItems[i - 1],\n                    m_selectedCertificateClass.Certificate.GetCertificateLevel(i));\n            }\n        }\n\n        /// <summary>\n        /// Sets the visible status of the context menu submenu.\n        /// </summary>\n        /// <param name=\"menu\">The menu.</param>\n        /// <param name=\"certLevel\">The cert level.</param>\n        private void SetAdditionMenuStatus(ToolStripItem menu, CertificateLevel certLevel)\n        {\n            menu.Visible = certLevel != null;\n\n            if (certLevel == null)\n                return;\n\n            menu.Enabled = !m_plan.WillGrantEligibilityFor(certLevel);\n\n            if (menu.Enabled)\n                menu.Tag = m_plan.TryPlanTo(certLevel);\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiExpandSelected_Click(object sender, EventArgs e)\n        {\n            tvItems.SelectedNode.Expand();\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse \n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiCollapseSelected_Click(object sender, EventArgs e)\n        {\n            tvItems.SelectedNode.Collapse();\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand All\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiExpandAll_Click(object sender, EventArgs e)\n        {\n            tvItems.ExpandAll();\n            m_allExpanded = true;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse All\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiCollapseAll_Click(object sender, EventArgs e)\n        {\n            tvItems.CollapseAll();\n            m_allExpanded = false;\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/CertificateSelectControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"pbSearchImage.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsNAAALDQHtB8AsAAACLklE\n        QVQ4T82TX0hTURzHV2B/QCGksIegArEMCveQMmbYQ1gucoTZZD2MGvjiHqa0ae1218Pc5W5Luy4NiuaY\n        FZWWNlg2UUQcFcZABkUFtlxlw4VOKmva+nbONZfKHoReevie8/t9z+/3OYcfHAmAf9KyxNY+FK7lvZOF\n        lU1jK/zBdD7VskSudnbOfE0gU2qIbJExa6lH96X+0nqqVEBvOS/0QllzAwVKO/YorDHqC7cCSOcvKhWY\n        2/rwIzGPh8NvYRCGsfNQIzbsM65Z9L2BMDjPKHJLraR8BaCh2ZdtbvVDy3ahrPo69iodkKuvoLCq7Y3W\n        dAd63gtVXQd2KzgCtkB74V52CkCensG0+DEZ/474bBKBF3FozD7kHeGwab9pxHjJS+qAL7PzGApN4aTx\n        PnIPc9RKAUx1fA818DT0CXbPcxzT3UZOMQvS3EABodcTCL76DN49gkpjF7bKGZx1+FgRYHcNTOsae1Be\n        0w5phYD8Mg55pRbkyBj6grCee7BwdoKcHbVh2wEGm4vqUaS6nBAB1msDSCZ/YTz6DY+ffYDFFcSOgxT+\n        d1Bn2E58jM4gHImhe3AMOr4f+YqFYUpMwiPMzf0kze/h6AhCc9H/nwFI80YKiExMo+/JOzjvjqLC0I1d\n        ZFYi4PQ590t1/U2UaFohq2qGTNWE7SVslEAy/wDWEcUU1VfHy3UuFJ9qgfS4DVkFtVMigC6rkdPTK/4N\n        smeo9O71RFk0T1u8ekHyG2jrt2s5yYVVAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"cmListCerts.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>21, 15</value>\n  </metadata>\n  <metadata name=\"ilCertIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>133, 16</value>\n  </metadata>\n  <data name=\"ilCertIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACa\n        dwAAAk1TRnQBSQFMAgEBBwEAAaQBAAGkAQABGAEAARgBAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFg\n        AwABMAMAAQEBAAEgBgABSBIAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFfAVoBVwHAAV0BWgFWAcEBXgFaAVcBwgFgAVsBWAHDAWABWwFYAcQBYQFbAVcBxwFl\n        AV4BWAHOAWUBXgFYAc4BYQFbAVcBxwFgAVsBWAHEAWABWwFYAcMBXQFaAVYBwQFfAVoBVwHAAV8BWgFX\n        AcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/EAADAgEDAw4BEwMBAQKkAAFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFX\n        AcABXQFaAVYBwQFfAVsBVgHDAWABWwFXAcQBXgFbAVcBxAFeAVsBVwHEAWABWwFXAcQBXwFbAVYBwwFd\n        AVoBVgHBAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVYBwQFg\n        AVsBWAHDAWABXAFXAcUBYQFcAVcBxwFjAV0BWQHKAWYBXgFXAdEBlwGEAVkB9QGQAYABYAHxAWYBXwFY\n        AdEBZAFeAVgBzAFhAVsBVwHHAWEBWwFYAcQBXgFaAVYBwgFdAVoBVgHBAV8BWgFXAcABXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvxAAAx8BLQNQAZoDQgF2AyABLwMEAQWcAAFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFdAVkBVgHCAV8BWgFWAcUBXwFZAVYB0gFh\n        AVgBUQHhAWIBWQFOAesBaAFhAUsB7wFpAWABSwHuAWIBWAFMAekBXQFXAVAB3wFhAVkBVgHPAV4BWwFX\n        AcQBXQFZAVYBwgFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWgFWAcEBYAFbAVgBwwFgAVwBVgHGAWMBXQFZ\n        AcoBZQFeAVcB0AFnAV4BVgHYAWsBYQFSAeYBdAFmAVIB8QF1AWcBTgHwAW8BYgFSAeYBZwFfAVYB2AFl\n        AV4BVwHQAWMBXQFZAcoBYAFcAVYBxgFgAVsBWAHDAV0BWgFWAcEBXwFaAVcBwAFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwwAAwQBBgNEAXoBYQJIAfYBagJHAfkBXQJZAdcBVwJVAbcBRgJFAX8DLgFIAw0BEZAA\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFdAVkBVgHCAWABWgFXAc0BXAFT\n        AUgB6gFTAUgBMgH7AVIBUQE+AfQBfgFtAVEB9QGwAZkBaAH+Aa0BlgFnAf4BaAFcAUkB8gFYAUsBQAH1\n        AVABRwE8AfkBXwFVAUwB5AFgAVoBVwHKAV0BWgFWAcEBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFfAVoBVwHAAV4BWgFWAcIBYQFbAVgBxAFgAVwBVgHG\n        AWQBXgFYAcsBZQFeAVUB2QFdAVQBQwHwAVsBUQE9AfoBfwFzAUsB/gGoAZEBWwH/AacBkAFaAf8BfgFu\n        AUkB/gFgAVMBQAH6AWYBXAFKAe0BaQFgAVgB1AFkAV4BWAHLAWEBXAFXAccBYAFbAVgBwwFeAVoBVgHC\n        AV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/DAADJgE5AVoCWAHGAVwCPgH4AU8CTQH6AWECVAHuAV8CTAHz\n        AVYCTQH6Al8BWQH7A00B+gFeAlsB0ANQAZ0DPQFpAycBOgMdASkDEgEYAwIBA3QAAV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFfAVsBVgHDAVwBVgFNAecBXwFVAUsB6wFfAVgBUgHZ\n        AWABWwFXAcgBbQFiAVkB2gGHAXkBXgHsAYEBdgFcAeoBZAFdAVgB0gFgAVsBVwHIAWEBWAFRAdwBWgFO\n        AUIB8AFhAVgBTwHmAV0BWQFWAcIBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV8BWgFXAcABXQFaAVYBwQFeAVoBVwHCAWABXAFXAcUBYwFdAVgByAFkAV4BWAHMAWgBYAFXAdABZgFf\n        AVEB4wFkAVgBSAHvAWkBXQFNAeoBfwFwAVUB7wGlAY0BWgH6AaQBjAFZAfoBfQFuAVQB7wFrAWABTwHt\n        AWcBWwFFAfABagFfAVYB2wFoAWABVwHQAWQBXgFYAcwBYwFeAVkByAFhAVsBWAHEAV4BWgFWAcIBXwFa\n        AVcBwAFeAVkBVwG/CAADAwEEAU0CTAGRAVoCWQHSA00B+gFtAlEB9wFgAlkB6wFiAVgBVgHvAV0BXAFa\n        Ae0BXQFcAVoB7QFiAlgB7wFfAkwB8wFtAVIBUQH3Al8BXgH7AWcCWQHyAVwCWAHRA1QBrwFHAkYBgQM4\n        AV0DKQE+AxUBHQMaASUDBAEFYAABXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXQFaAVYBwQFdAVkBVgHC\n        AV8BWwFWAcMBYAFaAVcBygFfAVsBVQHGAV0BWQFWAcIBXQFaAVYBwQFdAVkBVgHCAV8BWwFWAcMBXwFb\n        AVYBwwFdAVkBVgHCAV0BWgFWAcEBXwFbAVYBwwFfAVwBVgHJAWIBXAFWAckBXwFbAVYBwwFdAVkBVgHC\n        AV0BWgFWAcEBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFeAVoBVwHCAWABXAFXAcUBYwFd\n        AVcBygFnAV4BVgHVAWQBWQFMAewBaAFhAVcB2gFsAWIBWQHVAW0BYgFXAdYBbQFjAVgB2AFuAWUBVwHf\n        AXkBbAFXAeUBeQFsAVcB5QFzAWkBWQHgAXABZAFYAdsBbAFhAVgB2AFtAWIBVwHWAWgBYAFUAd4BYwFY\n        AU4B6QFkAV0BWAHSAWMBXgFYAckBYAFcAVcBxQFeAVoBVgHCAV8BWgFXAcAIAAMqAUABVgJVAbEDWwHQ\n        AVEBSwFFAf4BZQJSAfQBXQJOAfABYgFgAUgB9gFlAVIBTgH0AWUBUgFOAfQBZAFZAUIB9QFiAVkBQgH1\n        AWQBWQFCAfUBcQFtAVEB9wF/AWoBVwH5AX0BagFaAfkBeAFtAU0B+gF6AWoBaQH5AWQCWQHsAWACWgHe\n        AV4CXAHOAVwCWQHJAyABLmAAAV4BWQFXAb8BXwFaAVcBwAFdAVkBVgHCAWEBWQFWAc8BYQFXAVAB4gFf\n        AVoBVwHFAV0BWgFWAcEBXQFaAVYBwQFdAVoBVgHBAV8BWgFXAcABXwFaAVcBwAFeAVkBVwG/AV8BWgFX\n        AcABXQFaAVYBwQFfAVoBVwHAAV8BWgFXAcABXwFaAVcBwAFdAVoBVgHBAWABXAFXAcoBXgFXAU8B5QFg\n        AVoBVwHKAV0BWQFWAcIBXgFZAVcBvwFeAVkBVwG/AV0BWgFWAcEBYAFcAVcBxQFjAV0BWQHKAWcBXgFX\n        AdMBYwFYAUkB7wFhAVIBPAH3AWoBYwFWAdsBbQFjAVkB1AFtAWMBWQHUAWwBYwFZAdUBawFjAVYB2QFw\n        AWQBVwHbAXABZAFYAdsBawFjAVYB2QFuAWMBWQHXAWwBYwFZAdUBbQFjAVcB1gFrAWIBVAHdAVwBWAE9\n        AfgBZwFeAVMB5QFmAV8BWAHRAWMBXgFYAckBYAFbAVgBxAFdAVoBVgHBBwABAQMlATcDUAGeAVgCVgHB\n        Ak0BRQH/AWQCUwHxAWQCUwHxAXgBbQFNAfoBhwF8AV8B+wF5AW4BVAH6AYABagFiAfkBfAFxAU0B+gGF\n        AXkBTQH8AawBqAFHAf0BrAGoAUYB/QGFAXgBPQH8AXwBcQFNAfoBfwFqAUcB+QF3AWUBXAH4AXsBcAFN\n        AfoBewFwAVIB+gFbAlkBxAMYASJgAAFeAVkBVwG/AV0BWgFWAcEBXwFaAVYBxQFfAVcBTQHoAV4BVwFP\n        AeUBXwFaAVcBxQFdAVoBVgHBAWUBXgFZAckBagFkAV4B0AFhAVwBWAHHAV8BWgFXAcABXQFaAVYBwQFh\n        AVsBVwHHAWsBZgFeAdEBYQFbAVcBxwFdAVoBVgHBAV4BWQFXAb8BXwFaAVcBwAFfAVwBVgHJAVoBTgFC\n        AfABXwFVAUwB5AFeAVsBVwHEAV8BWgFXAcABXgFZAVcBvwFgAVsBVwHEAWYBXwFYAdEBaQFhAVkB1QFp\n        AWABUwHjAWIBXAE+AfgBbgFlAVQB5QFsAWEBWAHYAW0BYwFZAdQBbQFjAVkB1AFtAWIBVwHWAW0BYQFY\n        AdoBcQFoAVsB4QFzAWYBWgHgAW0BYgFZAdoBbQFiAVcB1gFsAWMBWQHVAW0BZAFYAdYBbgFkAVkB2gFq\n        AV4BTwHqAWsBWQFGAfcBaQFhAVYB3wFnAV4BVwHTAWMBXQFXAcoBXgFZAVYBwgQAAw0BEgFAAj8BbgFF\n        AkQBfAFbAlkBwwJfAVQB/wFdAVwBWgHtAWcBWQFWAfIBeQFuAU4B+gGIAYMBXwH7AYMBeQFvAfwBrAGo\n        AZ0B/QGiAZsBfwH+AaMBnAF/Af4BoQGaAX8B/gGrAagBhgH9AXwBcQFNAfoBfAFxAU0B+gGKAYQBVwH7\n        AYMBeAFDAfwBhAFxAUcB+QJiAUkB9gFSAlEBoQMMARBgAAFeAVkBVwG/AV0BWQFWAcIBXgFZAVYB0gFY\n        AUsBQAH1AWABWAFUAdEBXQFZAVYBwgFdAVkBVgHCAXkBcQFoAd0B0gHFAbEB+AFxAWsBYQHYAV0BWQFW\n        AcIBYAFbAVcBxAF+AXgBawHgAdoB0AGyAfoBgQF3AW0B4QFgAVsBVwHEAV8BWgFXAcABXgFZAVcBvwFf\n        AVsBVgHDAWEBWAFRAdwBUAFHATwB+QFhAVkBVgHPAV0BWgFWAcEBXgFZAVcBvwFjAV0BWAHLAY0BfAFd\n        AfABdwFrAVUB5wF7AWwBSwH1AZkBhgFaAfsBewFtAVYB6QFuAWMBVwHZAWwBYwFZAdUBbAFjAVkB1QFo\n        AWEBVwHaAXkBbgFfAegBywG9AakB+QG+AbEBmwH3AW8BZQFYAeMBbQFiAVkB2gFtAWQBWAHWAW4BYwFZ\n        AdcBcQFmAVcB3AF/AXABWAHsAaMBjQFUAf0BcgFmAUwB8wF7AW4BVQHqAXYBawFYAeMBYAFbAVYBxgMD\n        AQQDKQE+Az8BbQE9AjwBZwFcAlkBzwJrAV8B/wFkAlwB5wFlAlIB9AGLAYYBXwH7Aa4BqQGoAf0BpQGe\n        AYcB/gGlAZ4BggH+Aa4BqQGjAf0BogGaAX8B/gGhAZoBfwH+AY4BfAFpAfwBjgF7AWEB/AGuAagBkQH9\n        AasBqAGLAf0BegFtAVwB+AJlAVIB9AFiAlgB7wE/Aj4BbAMAAQFgAAFfAVoBVwHAAV4BWwFXAcQBXgFX\n        AU4B5QFdAVIBRwHtAV4BWgFVAcYBXwFaAVcBwAFfAVsBVgHDAX4BeAFrAeAB7QHhAcEB/QF1AXABZAHb\n        AV4BWwFXAcQBXgFZAVYBxwG3Aa4BmQH0AfMB5wHJAf4BzgHCAasB+AFgAVsBWAHIAV0BWgFWAcEBXgFZ\n        AVcBvwFdAVoBVgHBAWABWwFXAcgBWAFKAUAB9QFdAVcBUAHfAV8BWwFWAcMBXgFZAVcBvwFjAV0BWAHL\n        AX0BcAFXAegBcwFlAVYB5QGUAYEBUAH9AbkBoAFjAf8BewFuAVUB6gFuAWMBVwHZAWwBYwFZAdUBagFh\n        AVkB1wFnAV8BUwHgAaIBlgGCAfQB+AHsAc0B/wHtAeEBwwH+AX8BcgFhAe0BaAFgAVQB3gFsAWIBWAHY\n        AW4BYwFZAdcBcQFlAVgB3QGDAXIBWAHtAbkBoAFjAf8BkAF5AU8B/QF2AWgBVAHpAXsBbwFYAeYBYQFb\n        AVcBxwMLAQ8DLwFJAywBRAM3AVoBXQJYAeMBawFeAUkB/AFfAlcB6AF5AWsBXAH4Aa0BqAGcAf0BsAGp\n        AZIB/gGyAasBkwH+AacBoQGFAf4BrgGpAZ8B/QGmAZ8BfwH+AaIBmwF/Af4BjAGGAV8B+wF9AXIBTQH6\n        AYMBagFbAfkCYgFdAfYCZQFSAfQBYQJUAe4BXgJYAd0DJwE7ZAABXwFaAVcBwAFeAVsBVQHGAV0BUQFD\n        AfABaQFfAU8B7QFiAVwBVwHMAV0BWgFWAcEBXwFbAVYBwwF/AXgBbAHgAe0B4QHCAf0BdgFtAWUB3AFe\n        AVoBVQHGAWYBXwFYAdEB4gHVAb4B/AG2AasBlwH1AfEB5QHHAf4BbQFlAV8B1AFdAVkBVgHCAV4BWQFX\n        Ab8BXQFZAVYBwgFkAV0BWAHSAWkBXAFJAfIBYgFYAUwB6QFgAVsBVwHEAV4BWQFXAb8BYQFbAVcBxwFk\n        AV0BWAHSAWwBYgFRAekBkwGBAVAB/QGdAYgBXAH4AXMBZgFXAeIBbgFjAVkB1wFtAWMBVwHWAW0BYgFX\n        AdoBawFhAVMB5gHKAbsBpQH6AcsBwAGrAf0B1AHIAbIB/QGgAZcBgwH1AWgBXwFRAeMBbQFiAVkB2gFu\n        AWMBWQHXAXABZgFZAdsBewFtAVYB5wGgAY0BXwH5AYoBfwFSAf4BbAFlAVQB5QFkAV8BWAHPAWABXAFX\n        AcUDAAEBAwQBBgMEAQUDKQE+AWICSAH2AWkCXAH4AWQCWQHsAX4BdQFNAfoBrgGpAZ4B/QGvAasBpgH9\n        Aa4BqQGjAf0BrgGpAaMB/QGuAagBogH9Aa4BqQGSAf0BrgGoAZ4B/QF5AW0BXAH4AX0BcgFNAfoCYgFJ\n        AfYCZQFSAfQBZwJZAfIBYQJUAe4BWwJYAcsDEgEYZAABXwFaAVcBwAFeAVgBVQHGAW0BYQFKAfcBsgGd\n        AWAB/QFrAWMBVwHZAV0BWQFWAcIBXwFbAVYBwwF/AXgBbAHgAe0B4QHCAf0BdgFtAWIB3AFeAVsBVwHI\n        AZIBiQF7AekBywHBAakB+AFtAWYBYAHeAeEB1AG9AfwBkwGJAXwB6QFeAVsBVwHEAV8BWgFXAcABXwFb\n        AVYBwwGBAXYBXAHqAa0BlgFnAf4BaQFgAUsB7gFeAVsBVwHEAV4BWQFXAb8BYAFcAVYBxgFlAWABWAHP\n        AWgBXwFOAesBYwFfAUcB9gFyAWcBWAHhAW4BYwFXAdkBbAFjAVkB1QFtAWIBVwHWAWkBXwFUAd0BewFu\n        AV4B7AHvAeIBwwH+AXEBbQFUAfcBjgGIAWoB+QHkAdcBvQH9AWwBYwFSAegBbAFhAVUB3AFuAWMBWQHX\n        AW4BZAFZAdcBcAFlAVgB3QF0AWcBVAHkAWABWwE6AfsBaAFhAVEB5gFkAVwBWAHNAWABXAFXAcUMAAMv\n        AUoBXQFcAVQB/wFtAWcBUgH3AmUBUgH0AY8BiQFfAfsBsAGrAaQB/QGXAYkBcQH8AZcBiAFxAfwBlQGD\n        AXEB/AGPAYkBcwH7AY4BiQF2AfsBjgGJAXkB+wJlAVIB9AF5AW0BXAH4AYQBdAFqAfkBeQFtAVwB+AFk\n        AVcBUwHxAWcCWQHyA1YBswMAAQFkAAFfAVoBVwHAAV4BWQFWAccBbQFjAUsB9wGxAZkBaQH+AW0BZAFZ\n        AdoBXQFZAVYBwgFfAVsBVgHDAX8BeAFsAeAB7QHhAcIB/QF1AW8BZAHdAWABWgFXAc0B2QHQAbIB+gGt\n        AaQBkgHxAVwBWAFUAc0BtAGrAZUB8wG9AbEBnAH0AWIBXAFYAckBXwFaAVcBwAFfAVsBVgHDAYcBeQFe\n        AewBsAGZAWgB/gFoAWEBSwHvAV4BWwFXAcQBXgFZAVcBvwFgAVwBVwHFAWIBXAFYAcwBYwFZAUoB6gFf\n        AVsBRAHzAWsBYQFWAdgBbQFjAVkB1AFtAWMBWQHUAWoBYQFZAdcBZQFcAVEB3wGfAZIBfQH0AdgBywG0\n        Af0BXwFTAUIB8QFpAWQBUQH0AeoB3gG/Af4BkAGEAXAB8QFoAWABVAHeAWoBYwFZAdcBbgFjAVkB1QFu\n        AWMBWQHXAW8BYwFXAdsBWAFQAT0B+gFiAVoBUAHkAWMBXQFZAcoBYAFbAVgBxAwAAyEBMAFgAloB3gF3\n        AV0BXAH4AX4BdgFNAfoBmAGLAW0B/AG0Aa0BkgH+AbEBqwGRAf4BswGtAZQB/gGwAaoBkgH+AbABrAGo\n        Af0BlAGDAXMB/AF9AXQBaAH6AV0BUAFOAfABZAFXAVMB8QFhAlQB7gFiAlgB7wJdAVsB7QFqAWIBVwH5\n        Az4Ba2gAAV8BWgFXAcABXgFaAVUBxgFfAVUBRwHzAX4BbgFTAfEBZQFeAVcB0AFdAVoBVgHBAV8BWwFW\n        AcMBfwF4AWwB4AHtAeEBwgH9AXUBbAFkAd0BaQFiAVsB1gHiAdYBvgH8AY0BhQF5AegBXQFaAVYBygGO\n        AYIBdwHnAdABwwGsAfgBaAFhAVkBzwFdAVoBVgHBAV0BWQFWAcIBbQFiAVkB2gF+AW0BUQH1AWIBWQFO\n        AesBYAFbAVcBxAFeAVkBVwG/AWEBWwFYAcQBYwFeAVgByQFiAVwBUQHfAWgBXgFOAesBagFjAVkB1AFq\n        AWIBWQHTAWoBXwFXAdMBaAFfAVYB2AFlAVwBUQHgAcEBtwGeAfkBtAGsAZAB+QFhAVQBRgHuAWkBXQFN\n        AfAB0QHKAbAB/AG5AawBmAH4AWUBXAFRAd8BagFhAVkB1wFtAWMBWQHUAWwBYwFZAdUBagFhAVkB1wFh\n        AVoBRAHwAWUBXwFVAdwBYwFdAVgByAFgAVsBWAHDDAADGwEmAVsCWAHLAXcBaQFcAfgBjgGIAV0B+wGY\n        AYkBbQH8AbABrAGoAf0BrAGkAYgB/gGsAaYBjAH+AbABrAGoAf0BrwGrAagB/QGvAasBqAH9AX0BbQFm\n        AfcBaAJZAfUBfQFtAWMB9wJiAVsB9gJlAVIB9AFhAlQB7gFpAlwB+AMjATNoAAFfAVoBVwHAAV4BWwFX\n        AcQBXAFVAUsB5wFaAVQBSQHsAV4BWgFVAcYBXQFaAVYBwQFfAVsBVgHDAX8BeAFsAeAB7QHhAcEB/QF1\n        AWwBZAHdAXEBagFhAdsB6wHeAcAB/QGAAXkBbQHiAV4BWwFXAcgBfgF2AWoB4QHYAc8BsAH6AWkBZAFd\n        AdIBXQFZAVYBwgFdAVoBVgHBAWABWwFXAcgBUgFRAT4B9AFhAVgBUQHhAV8BWwFWAcMBXgFZAVcBvwFg\n        AVsBWAHDAWEBWwFXAccBZgFeAVgBzgFnAV4BVwHTAWoBXwFXAdMBaQFhAVkB0gFsAWMBWQHUAWcBXwFW\n        AdgBZAFbAVEB4AHTAcoBrQH7AaYBmAGBAfYBZgFYAU0B6AFnAVwBUAHqAcwBvwGmAfoBzwHCAakB+gFl\n        AVwBUQHfAWoBYQFZAdcBbAFjAVkB1QFtAWMBWQHUAWwBYwFZAdUBaQFgAVgB1AFkAVwBWAHNAWABXAFW\n        AcYBXgFaAVYBwgwAAyQBNQFiAlgB6QF6AW0BUgH3AY4BiAFdAfsBrwGrAZ8B/QGxAa4BqAH9Aa4BqAGQ\n        Af4BsQGuAagB/QGxAa0BqAH9Aa8BrAGoAf0BlAGFAXUB/AFnAlkB8gFkAVcBUwHxAWQBVwFTAfEBZwJZ\n        AfICZQFSAfQBZwJZAfIBYAJbAdYDAgEDaAABXgFZAVcBvwFfAVsBVgHDAWEBWgFVAdUBUQFJATkB9gFg\n        AVsBVgHQAV0BWQFWAcIBXQFZAVYBwgF6AXMBaAHeAeIB1QG9AfwBdQFvAWQB2wFvAWkBYAHZAdwB0wG6\n        AfsBfAF1AWkB3wFeAVoBVQHGAXoBcgFoAd4B1QHKAbEB+QFqAWQBXQHSAV0BWgFWAcEBXQFZAVYBwgFf\n        AVgBUgHZAVMBSAEyAfsBXwFZAVYB0gFdAVoBVgHBAV4BWQFXAb8BXgFaAVYBwgFgAVwBVwHFAWMBXQFZ\n        AcoBZgFfAVYB1wFoAWEBVQHcAWsBYgFXAdYBbQFiAVcB1gFpAV8BVgHZAWQBWwFSAd4B0AHEAakB+gGg\n        AZUBgwHyAWgBXwFTAeEBaQFhAVMB5AHBAbkBnQH4AcoBvAGoAfkBZwFeAVIB3QFpAWABVgHZAWoBYwFZ\n        AdcBbAFhAVYB2AFrAWABVAHgAWkBYAFYAdQBYwFdAVkBygFhAVsBWAHEAV0BWgFWAcEMAAMsAUQBgQFR\n        AUYB/QFoAVkBSgH1AX4BdAFNAfoBlAGCAXAB/AGuAaoBqAH9Aa4BqAGnAf0BlQGIAXUB/AGOAYkBfwH7\n        AZQBgwF1AfwBjAGIAXwB+wFdAU8BTgHwAWcCWQHyAWQBVQFTAfEBZwJZAfICZQFSAfQBiAF/AV8B+wNO\n        AZhsAAFeAVkBVwG/AV0BWgFWAcEBXgFaAVUBxgFdAVIBRwHtAWABWAFSAd4BYAFbAVcBxAFdAVoBVgHB\n        AWkBZAFcAc8BewF1AWsB3QFnAV8BXAHOAWQBXwFZAcwBewF1AWsB3QFpAWQBXAHPAV8BWwFWAcMBaAFj\n        AVwBzwF7AXMBaAHbAWUBXgFZAckBXQFaAVYBwQFfAVsBVQHGAVwBUwFKAeoBXAFTAUgB6gFfAVoBVgHF\n        AV8BWgFXAcABXgFZAVcBvwFdAVoBVgHBAWABWwFYAcQBYwFeAVgByQFmAV0BUwHhAWUBUgFAAfQBbgFk\n        AVcB4AFwAWQBVwHdAWwBYwFXAd0BaAFhAVUB3AF8AXMBZQHlAXYBaQFcAeEBaAFhAVcB2gFqAWEBVgHc\n        AXoBbwFhAeQBeQFzAWUB5QFrAWIBVAHdAW0BZAFVAd4BcAFlAVUB3gFrAWEBUwHkAWABUgE8AfcBZgFf\n        AVUB2wFjAV4BWAHJAWABWwFYAcMBXQFaAVYBwQwAAzsBZAFzAl8B+wJlAVIB9AF6AW0BXAH4AYkBewFu\n        AfwBhgF6AW4B/AGLAYYBZwH7AYoBhQFnAfsBiwGGAXAB+wGKAYUBcwH7AYMCagH5AWQBVgFTAfEBdwFt\n        AWQB9wF4AWkBXAH4AYwBhwFfAfsBewFvAVwB+AGGAXABXwH7AzoBYWwAAV4BWQFXAb8BXwFaAVcBwAFd\n        AVkBVgHCAV8BWgFVAdMBYAFWAU0B5AFfAVoBVwHFAV0BWgFWAcEBXQFaAVYBwQFdAVoBVgHBAV0BWgFW\n        AcEBXQFaAVYBwQFdAVoBVgHBAV0BWgFWAcEBXwFaAVcBwAFdAVoBVgHBAV0BWgFWAcEBXQFaAVYBwQFd\n        AVoBVgHBAWABWgFXAcoBXwFXAU0B6AFgAVoBVwHNAV0BWQFWAcIBXgFZAVcBvwFeAVkBVwG/AV0BWgFW\n        AcEBYAFbAVgBxAFjAV0BWAHIAWcBXQFWAdMBZwFZAUcB8gFsAVoBQgH1AYkBdwFVAfEBgQFyAVQB7gFx\n        AWQBVgHhAWkBYAFWAdkBaQFiAVcB1gFsAWIBWQHVAWwBYgFZAdUBagFhAVkB1wFqAWMBVgHbAXABZQFW\n        AeMBiwF8AVgB8QGKAXoBWQHyAWMBXwFHAfYBaAFdAU4B6QFlAV4BVwHQAWEBXAFXAccBYAFbAVgBwwFf\n        AVoBVwHADAADTAGSAXUCXAH4AmUBUgH0AX0BbQFSAfcBsAGsAagB/QGxAa4BqAH9AZcBjAF5AfwBsAGt\n        AagB/QGaAY8BfgH8AZcBiwF6AfwBegFuAVwB+AFkAVUBUwHxAmUBUgH0AYUBdwFmAfkBfgF1AVIB+gJi\n        AVoB9gNdAe0DJwE7bAABXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXQFZAVYBwgFfAVsBVgHDAV8BWwFW\n        AcMBXwFaAVcBxQFgAVsBVwHEAV0BWQFWAcIBXQFaAVYBwQFdAVoBVgHBAV0BWQFWAcIBXQFZAVYBwgFd\n        AVoBVgHBAV8BWgFXAcABXQFZAVYBwgFfAVoBVwHFAV8BWgFXAcUBXwFbAVYBwwFfAVsBVgHDAV0BWQFW\n        AcIBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFgAVsBWAHDAWABXAFWAcYBZAFcAVcBzQFp\n        AWABVAHfAWoBZgFDAfkBsgGaAWAB/wG4AaABYgH/AYYBdgFZAfABbQFjAVkB2gFtAWMBWQHUAWoBXwFX\n        AdMBagFfAVcB0wFtAWIBVwHWAW0BZQFWAdwBiwF7AVgB8QG4AZ8BYgH/Aa4BlgFkAf4BbwFgAUUB9QFn\n        AV8BVgHYAWMBXQFYAcsBYAFcAVcBxQFdAVoBVgHBAV8BWgFXAcAMAAFUAlMBrAFoAlkB9QFkAV8BTAHz\n        AXcBbQFSAfcBewFvAVgB+gF/AmoB+QF/AmoB+QF5AW4BXAH6AYACagH5AXsBbwFiAfoCYgFdAfYBfQFt\n        AWIB9wGOAYgBZwH7AYwBhwFkAfsBegFtAVwB+AGDAWoBZgH5AVsCWQHEAxkBI2wAAV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVcBwAFfAVsBVgHDAV8BWAFOAeMBYAFYAVIB3gFgAVsBVgHQ\n        AV4BWgFVAcYBZQFeAVcB0AFtAWQBWQHaAWsBYwFXAdkBYgFcAVcBzAFeAVoBVQHGAWABWAFUAdEBXgFX\n        AU8B5QFhAVoBUQHhAV0BWQFWAcIBXwFaAVcBwAFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV8BWgFXAcABXQFaAVYBwQFgAVwBVwHFAWMBXQFXAcoBaQFhAVcB1QFyAWYBVQHoAYUBbQFRAfcBngGI\n        AVwB/gF7AWkBTwHyAW0BYQFUAeEBagFhAVkB1wFqAV8BVwHTAWwBYwFZAdQBbQFiAVkB2gFrAWEBUwHk\n        AX4BbQFSAfQBowGNAVQB/QF7AWgBSQH2AW0BZAFVAeMBZQFeAVcB0AFjAV0BWAHIAWABWwFYAcQBXQFa\n        AVYBwQFfAVoBVwHADAABXgJbAdkBZAFXAVMB8QFnAlkB8gJiAUkB9gF0AW0BUgH3AXQBbQFhAfcBdAFt\n        AWEB9wF3AWEBXAH4AXcBYwFcAfgBgwJqAfkBhQF0AWoB+QGFAXoBagH5AYQBcQFqAfkBfQFzAVgB+gF9\n        AXMBVAH6AasBqAGFAf0DUQGiAw0BEWwAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFa\n        AVcBwAFdAVkBVgHCAWABXAFVAdQBXQFSAUcB7QFRAUkBOQH2AVoBVAFJAewBfgFuAVMB8QGxAZkBaQH+\n        AbIBnQFgAf0BagFhAUwB7gFaAVQBRgHuAVgBSwFAAfUBXwFXAU0B6AFgAVsBVgHQAV0BWQFWAcIBXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFeAVoBVgHC\n        AWABXAFWAcYBcAFlAVgB3QGeAYsBXAH4AXcBagFUAekBbQFjAVAB6gFkAVkBQgH1AWABUAFBAfkBYwFZ\n        AUkB7gFrAWIBWQHVAWkBXwFWAdkBXwFZAUEB8wFhAVABQQH5AWYBWQFCAfQBbwFkAVMB5wGCAXIBVAHu\n        AZABgAFgAfEBaAFgAVgBzwFgAVwBVwHFAV4BWgFWAcIBXwFaAVcBwAFeAVkBVwG/DAABaQJcAfgBZAJZ\n        AewBYgJYAe8BZwJZAfIBZwJZAfIBZwJZAfIBZAFeAUwB8wFkAV4BTAHzAmIBSQH2AX4BdwFYAfoBfgF2\n        AVMB+gGFAXcBZgH5AX4BdAFRAfoBlAF9AWUB/AGuAagBhQH9AY0BiAFfAfsBRgJFAX4DAQECbAABXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFbAVYBwwFeAVoBVQHG\n        AWEBWgFVAdUBXAFVAUsB5wFfAVUBRwHzAW0BYwFLAfcBbQFhAUoB9wFgAVMBRgHxAV4BVwFOAeUBXgFZ\n        AVYB0gFfAVoBVgHFAV0BWQFWAcIBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABYAFbAVgBwwFjAV0BVwHKAXwBbwFYAeYBaAFg\n        AVcB1gFmAV8BWAHRAWcBXgFXAdMBZQFeAVUB2QFmAV8BVAHgAWYBXwFXAdEBaQFgAVgB1AFlAV0BUAHi\n        AWYBXwFWAdcBaQFgAVgB1AFmAV8BVwHRAXMBaQFYAeIBcwFpAVoB4AFgAVsBVgHGAV4BWgFWAcIBXwFa\n        AVcBwAFeAVkBVwG/AV4BWQFXAb8IAAMNAREBXAJXAd8BWAJWAbwBVQJTAbADVAGvAVYCVAGrAVMCUgGo\n        AVICUQGhAVACTwGbA1ABmgNMAZMDTAGTA0oBjQNKAYoBSQJIAYgBSQJIAYgDUAGaAygBPXAAAV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXQFaAVYBwQFf\n        AVsBVgHDAV4BWwFXAcQBXgFaAVUBxgFeAVkBVgHHAV4BWQFWAccBXgFbAVUBxgFeAVsBVwHEAV0BWQFW\n        AcIBXQFaAVYBwQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV0BWgFWAcEBYAFbAVgBwwFgAVoBVwHFAWEBWwFX\n        AccBYwFdAVgByAFjAV4BWAHJAWMBXQFXAcoBYwFdAVcBygFjAV4BWAHJAWMBXgFYAckBYwFdAVcBygFj\n        AV0BWQHKAWMBXgFYAckBYwFdAVgByAFhAVsBVgHHAWABWgFXAcUBXgFaAVYBwgFfAVoBVwHAAV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/DAADKwFCAwgBC6wAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVcBwAFf\n        AVoBVwHAAV8BWgFXAcABXwFaAVcBwAFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFdAVoBVgHBAV4BWgFWAcIBYAFbAVgBwwFhAVsBWAHEAWABWwFY\n        AcQBYAFbAVgBxAFgAVsBWAHEAWABWwFYAcQBYQFbAVgBxAFhAVsBWAHEAWABWwFYAcQBYAFbAVgBwwFe\n        AVoBVwHCAV0BWgFWAcEBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/wAABXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVcBwAFfAVsBVgHB\n        AV8BWwFWAcEBYAFaAVcBwgFjAVsBWAHDAWMBWwFYAcMBYwFbAVgBwwFgAVsBWAHDAWABWgFXAcIBXwFb\n        AVYBwQFfAVsBVgHBAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFgAVoBVwHCAWEBWwFYAcQBYwFd\n        AVcBxQFjAV0BVwHFAWMBXAFYAcYBYwFcAVgBxgFjAV0BVwHFAWMBXQFXAcUBYwFbAVgBwwFfAVsBVgHB\n        AV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHA\n        AV0BWgFWAcEBXwFbAVYBwwFgAVsBVwHEAV8BWgFWAcUBXgFbAVcBxAFgAVsBVwHEAV8BWwFWAcMBXQFa\n        AVYBwQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFfAVoBVwHAAV0BWgFWAcEBXwFbAVYBwwFgAVsBVwHEAV8BWgFWAcUBXgFbAVcBxAFgAVsBVwHE\n        AV8BWwFWAcMBXQFaAVYBwQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWgFWAcEBXwFbAVYBwwFgAVsBVwHEAV8BWgFWAcUBXgFb\n        AVcBxAFgAVsBVwHEAV8BWwFWAcMBXQFaAVYBwQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AWwBZQFUAeUBawFjAVcB4AFhAVsBWAHEAWEBWwFYAcQBZAFeAVkByAFmAV4BVgHX\n        AWUBXwFVAdwBZgFgAVUB3AFoAWABWAHUAWMBXAFYAcYBYwFbAVgBwwFjAV4BWAHJAW0BZAFPAewBZgFf\n        AVYB2wFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXQFZAVYBwgFfAVoBVgHFAV8BWQFWAdIBYQFX\n        AU8B4gFjAVkBTgHrAWgBYAFLAe8BZgFcAUsB7wFiAVgBTAHpAV8BWgFRAeABYAFbAVYB0AFeAVsBVwHE\n        AV0BWQFWAcIBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXQFZAVYBwgFfAVoBVgHF\n        AV8BWQFWAdIBYQFXAU8B4gFjAVkBTgHrAWgBYAFLAe8BZgFgAUsB7wFiAVgBTAHpAV8BWgFRAeABYAFb\n        AVYB0AFfAVoBVgHFAV0BWQFWAcIBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXQFZ\n        AVYBwgFfAVoBVgHFAV8BWQFWAdIBYAFYAVEB4QFjAVkBTgHrAWgBYAFLAe8BZgFcAUsB7wFhAVgBTAHp\n        AV8BWQFRAeABYAFbAVYB0AFeAVsBVwHEAV0BWQFWAcIBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWgFXAcABYAFcAVcBxQFsAWIBUQHp\n        AWoBYgFVAeIBdAFnAUUB/gFvAWQBTQHxAVoBVgFHAe8BQwE+AS4B/AFLAUMBMgH7AU0BRwEyAfoBTQFH\n        ATIB+gFJAUIBMQH7AUMBPgEuAfwBXQFZAUUB8AFwAV8BRwH6AW0BYQFCAf0BawFjAVcB4AFrAWIBVwHg\n        AV0BWgFWAcEBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFdAVoBVgHBAWABWwFXAcQBYQFZAVYBzwFeAVUBSwHrAVEBSAEyAfsBVQFMAT8B8wGBAW4BVAH1\n        AbEBmQFoAf4BrwGbAV8B/QFnAWABSQHxAVcBSgE/AfUBTwFHAT0B+QFaAVUBTAHkAV4BWAFXAcsBXwFb\n        AVYBwwFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFdAVoBVgHBAV4BWwFXAcQBYQFZAVYBzwFaAVQBSQHsAVIBSQEyAfsBWQFM\n        AT4B8wGBAW4BVAH1AbEBmQFoAf4BrQGWAWcB/gFoAV0BSQHyAVIBUQE/AfQBUAFNATkB+gFeAVcBTgHl\n        AV8BWQFWAcwBYAFbAVcBxAFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFdAVoBVgHBAWABWwFXAcQBXwFaAVUBzgFdAVUBSgHr\n        AVEBSAEyAfsBUgFRAT4B9AGBAW4BVAH1AbEBmQFoAf4BrwGbAV8B/QFpAWABSQHxAVgBSgFAAfUBTwFH\n        AT0B+QFbAVQBTAHkAV4BWAFXAcsBXwFbAVYBwwFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXwFaAVcBwAFfAVsBVgHBAV8BWgFWAcEBYwFdAVkByAFvAWABTAHzAXABZAFRAewBcAFk\n        AVEB7AFvAWEBTAHzAWYBXgFOAewBZAFfAVUB2wFkAV4BWQHMAWQBXgFZAcgBZAFeAVkByAFmAV8BWAHR\n        AWUBXAFVAdwBaQFfAU8B7QFuAWABRgH1AW4BYgFUAeQBbgFiAUgB9gFqAWEBVQHhAV4BWgFXAcIBXwFb\n        AVYBwQFfAVoBVwHAAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXQFaAVYBwQFfAVoBVwHF\n        AWABWQFTAdcBWQFPAUMB8gFcAVMBSgHqAV8BWgFVAdgBYAFbAVcByAFwAWQBWQHbAYcBeQFdAewBgQF0\n        AVwB6gFjAV4BVwHRAWABWwFXAcgBXwFaAVQB2wFaAU4BQgHwAVcBUwFEAfEBYAFbAVUB1AFgAVsBVwHE\n        AV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXQFa\n        AVYBwQFfAVsBVQHGAV8BWgFUAdgBWQFMAT8B8wFcAVMBSgHqAV8BWgFUAdgBYAFbAVcByAFwAWQBWQHb\n        AYcBeQFdAewBgQF2AVwB6gFkAV0BWAHSAWABWwFXAcgBYQFaAVQB2gFYAU8BRQHvAVkBTwFEAfIBYQFa\n        AVUB1QFeAVsBVwHEAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXQFaAVYBwQFfAVoBVwHFAWABWQFTAdcBWQFPAUMB8gFfAVUBSwHrAV8BWAFSAdkBYAFb\n        AVcByAFwAWQBWQHbAYcBeQFdAewBgQF0AVwB6gFjAV4BVwHRAWABWwFXAcgBXwFZAVQB2wFaAU4BQgHw\n        AVoBTgFCAfABYAFbAVUB1AFfAVsBVgHDAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFa\n        AVYBwQFgAVoBVwHCAWMBWwFYAcMBYQFbAVgBxAFuAWQBUQHsAXABYwFAAf8BaQFhAVkB1wFjAV0BWQHK\n        AWMBXQFXAcUBYwFeAVgBxgFjAV4BWAHGAWMBXQFYAcYBYwFdAVgBxgFjAV4BWAHGAWMBXQFXAcUBYAFc\n        AVgBxgFjAV4BWAHLAWkBYQFWAd8BcgFmAUQB/gFnAWEBWQHVAWEBWwFYAcQBYwFbAVgBwwFfAVsBVgHB\n        AV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVcBxQFgAVYBUgHeAVABSQE5AfYBYQFY\n        AVEB3AFgAVsBWAHIAV0BWQFWAcIBXQFaAVYBwQFdAVkBVgHCAWABWwFXAcQBXwFbAVYBwwFdAVkBVgHC\n        AV0BWgFWAcEBXwFbAVYBwwFgAVsBVwHLAV4BVwFQAd8BWQFMAT8B8wFgAVsBVQHUAV8BWwFWAcMBXwFa\n        AVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVcBxQFhAVgBUQHh\n        AVEBSQE5AfYBXwFZAVMB2wFeAVkBVgHHAV0BWQFWAcIBXQFaAVYBwQFdAVkBVgHCAWABWwFXAcQBXwFb\n        AVYBwwFdAVkBVgHCAV0BWgFWAcEBXwFbAVYBwwFgAVoBVgHKAV4BWAFSAd0BUwFRAT4B9AFgAVgBVQHW\n        AWABWwFXAcQBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFb\n        AVYBwwFhAVgBUgHdAVIBUQE5AfcBYQFXAVEB3AFgAVsBWAHIAV0BWQFWAcIBXQFaAVYBwQFdAVkBVgHC\n        AWABWwFXAcQBXwFbAVYBwwFdAVkBVgHCAV0BWgFWAcEBXwFbAVYBwwFgAVsBVwHLAV0BVwFPAd8BUgFR\n        AT8B9AFfAVoBVQHTAV0BWQFWAcIBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BYAFaAVcBwgFhAVsBWAHE\n        AWMBXgFYAcYBZAFcAVgBzQFkAVMBQQH0AWQBWAFKAe8BYQFbAVgBxAFhAVsBWAHEAWEBWwFYAcQBYwFb\n        AVgBwwFjAVsBWAHDAWMBWwFYAcMBYwFbAVgBwwFjAVsBWAHDAWMBWwFYAcMBYQFbAVgBxAFjAV0BVwHF\n        AWEBWwFYAcQBZQFUAUEB9AFiAVgBTgHpAWQBXgFZAcgBYwFdAVcBxQFgAVsBWAHDAV8BWgFWAcEBXgFZ\n        AVcBvwFfAVoBVwHAAV0BWQFWAcIBXwFYAVQB0QFYAUoBQAH1AV8BWAFSAdkBXwFaAVYBxQFdAVoBVgHB\n        AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWgFWAcEBXQFaAVYBwQFfAVoBVwHAAV4BWQFXAb8BXwFa\n        AVcBwAFdAVoBVgHBAV8BWgFWAcUBXgFXAVAB3wFXAVMBRAHxAV4BWAFXAcsBXQFZAVYBwgFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWQFWAcIBXgFaAVMB0wFZAUoBQAH1AV8BWQFTAdcBXgFb\n        AVcBxAFdAVoBVgHBAV8BWgFXAcABXQFaAVYBwQFdAVoBVgHBAV0BWgFWAcEBXQFaAVYBwQFdAVoBVgHB\n        AV0BWgFWAcEBXwFaAVcBwAFdAVoBVgHBAV8BWgFWAcUBXgFYAVIB3QFZAU4BRAHyAV8BWQFWAcwBXQFZ\n        AVYBwgFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABYAFdAVcBygFaAVMBRQHx\n        AV8BWgFTAdsBXwFaAVYBxQFdAVkBVgHCAV0BWgFWAcEBXQFaAVYBwQFfAVoBVwHAAV0BWgFWAcEBXQFa\n        AVYBwQFfAVoBVwHAAV0BWgFWAcEBXQFaAVYBwQFdAVkBVgHCAV8BWgFWAcUBXwFaAVEB4AFcAVUBTAHn\n        AV8BWgFXAcUBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BYAFbAVgBwwFjAV0BVwHFAWEBXAFYAccBZQFe\n        AVEB5QFfAVgBSgHsAWQBXgFZAcgBYwFdAVcBxQFjAVsBWQHDAWABWgFXAcIBXwFbAVYBwQFfAVsBVgHB\n        AV8BWwFWAcEBXwFbAVYBwQFfAVsBVgHBAV8BWwFWAcEBYAFaAVcBwgFhAVsBWAHEAWMBXgFYAcYBZAFc\n        AVgBzQFYAUoBQQH1AWUBXgFUAd4BYwFeAVgBxgFhAVsBWAHEAWABWgFXAcIBXgFZAVcBvwFdAVoBVgHB\n        AV8BWgFWAcUBXwFWAU0B6AFeAVcBTgHlAV4BWQFWAccBXQFaAVYBwQFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFdAVkBVgHCAWsBZwFeAdMBagFkAV4B0AFdAVkBVgHCAV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHA\n        AV0BWgFWAcEBYAFbAVcBywFaAU4BQgHwAVoBVQFMAeQBXgFbAVcBxAFfAVoBVwHAAV4BWQFXAb8BXgFZ\n        AVcBvwFdAVoBVgHBAV4BWwFVAcYBWgFUAUkB7AFfAVgBTgHjAV4BWQFWAccBXQFaAVYBwQFfAVoBVwHA\n        AV0BWgFWAcEBZgFfAVkBzAFuAWkBYAHUAV8BWgFXAcUBYwFdAVkByAFwAWsBYgHVAWMBXQFaAcoBXQFa\n        AVYBwQFfAVoBVwHAAV0BWgFWAcEBYAFaAVYBygFZAVMBRgHuAVsBVAFKAekBXwFaAVYBxQFfAVoBVwHA\n        AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWgFWAcEBXwFbAVYBwwFgAVsBVwHLAWABWwFXAcQBXQFZ\n        AVYBwgFjAV4BWQHIAWsBZwFeAdMBZAFeAVgBywFgAVsBVwHEAWwBZAFdAdIBagFkAV4B0AFgAVsBVwHE\n        AWQBYAFaAc0BawFmAV4B0QFgAVwBVwHFAV0BWQFWAcIBXwFaAVcBxQFgAVsBVQHGAV0BWQFWAcIBXQFa\n        AVYBwQFfAVoBVwHAAV4BWQFXAb8BYQFbAVgBxAFhAVwBWAHHAWgBYAFZAc8BUgFQATkB9wFoAWABWAHU\n        AWEBXAFYAccBYQFbAVgBxAFgAVoBVwHCAV8BWgFXAcABXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV8BWgFXAcABXwFbAVYBwQFjAVsBWAHDAWMBXQFXAcUBZAFeAVgBxwFlAV8BVAHg\n        AU0BSgEzAfoBZAFdAVgBzQFjAV0BVwHFAWMBWwFZAcMBXgFZAVcBvwFdAVkBVgHCAV8BWQFWAdIBUgFJ\n        ATsB9gFgAVsBVgHQAV0BWQFWAcIBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFeAVsBVQHG\n        AdIBxAGwAfgBqQGfAY8B7wFgAVsBVwHEAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFb\n        AVYBwwFfAVoBVAHbAU8BRwE9AfkBYAFbAVYB0AFdAVoBVgHBAV4BWQFXAb8BXgFZAVcBvwFfAVsBVgHD\n        AWABWQFTAdcBWAFLAUAB9QFfAVsBVQHOAV0BWQFWAcIBXgFZAVcBvwFfAVoBVwHAAV8BWwFWAcMBfwF4\n        AWwB4AHLAcEBqAH3AWABXAFXAc0BagFlAVwB1AHaAdABswH6AXMBbQFiAdoBXwFbAVYBwwFeAVkBVwG/\n        AV8BWgFXAcABXQFZAVYBwgFgAVkBUwHXAU8BTAE4AfoBXgFaAVMB0wFdAVkBVgHCAV4BWQFXAb8BXgFZ\n        AVcBvwFdAVoBVgHBAWABWwFXAcsBYAFaAVcBzQFdAVkBVgHCAV8BWgFXAcABXQFZAVYBwgFwAWkBYQLX\n        AcwBswH5AYEBewFuAeEBXwFZAVYByQHLAcMBqwH3AagBnwGNAe8BXgFbAVcByAGQAYcBeAHnAb8BtgGf\n        AfUBZAFgAVoBzQFdAVoBVgHBAV8BWgFXAcABXQFZAVYBwgFiAVoBVQHVAWABXAFXAcoBXQFaAVYBwQFe\n        AVkBVwG/AWMBXQFXAcUBYQFcAVgBxwFjAVcBTwHoAVkBUwFFAfEBZgFfAVkByQFjAV4BWAHGAWEBWwFY\n        AcQBXwFbAVYBwQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV8BWgFXAcABYAFaAVcBwgFhAVsBWAHEAWEBXAFYAccBZAFeAVgBywFNAUoBMwH6AWUBXwFU\n        AeABYwFeAVgBxgFhAVsBWAHEAV8BWgFXAcABXgFbAVcBxAFhAVgBTQHmAV0BUgFHAe0BXwFaAVYBxQFf\n        AVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXgFZAVYBxwHbAdEBtQH6AbQBqwGY\n        AfIBXwFaAVYBxQFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV0BWgFWAcEBXgFZAVYBxwFZ\n        AUoBQQH1AV8BWgFRAeABXwFbAVYBwwFeAVkBVwG/AV8BWgFXAcABXgFbAVcBxAFbAVQBSgHpAVwBUwFK\n        AeoBXgFbAVcBxAFfAVoBVwHAAV4BWQFXAb8BXwFaAVcBwAFeAVsBVwHEAYABeQFtAeIB1QHKAbEB+QFh\n        AVwBWAHPAWkBZAFbAdYB4QHVAb0B/AF0AW0BYgHcAV8BWwFWAcMBXgFZAVcBvwFeAVkBVwG/AV8BWgFX\n        AcABXgFaAVUBxgFYAVMBRAHxAV8BWAFOAeMBXwFbAVYBwwFeAVkBVwG/AV8BWgFXAcABXwFbAVYBwwFf\n        AVUBTAHkAWABVgFLAesBXQFZAVYBwgFeAVkBVwG/AV0BWQFWAcIBcgFpAWAB2QHrAd8BwAH9AYMBegFw\n        AeQBXgFYAVQBywHbAdMBugH7AbMBqwGWAfIBXgFYAVQBywGQAYcBewHqAdABwwGsAfgBaAFhAVkBzwFd\n        AVoBVgHBAV8BWgFXAcABXgFbAVcBxAFZAUwBQAH1AV8BVwFQAd8BXQFZAVYBwgFeAVkBVwG/AWMBXQFX\n        AcUBYQFcAVgBxwFYAUoBQAH1AWUBXgFRAeUBYQFcAVgBxwFjAV0BVwHFAWABWgFXAcIBXwFaAVcBwAFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFX\n        AcABXwFbAVYBwQFjAVsBWAHDAWMBXgFYAcYBZAFeAVkByAFdAVYBSgHtAWABVwFNAesBZAFeAVgBxgFh\n        AVsBWAHEAV8BWgFXAcABXwFaAVYBxQFaAU4BQgHwAV8BWAFOAeMBYAFbAVcBxAFfAVoBVwHAAV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXgFZAVYBxwHbAdEBtQH6AbQBqwGYAfIBXwFaAVYBxQFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVYBxQFbAVQBSgHpAV8BVwFN\n        AegBXwFbAVYBwwFeAVkBVwG/AV8BWgFXAcABXwFbAVYBwwFcAVYBSgHsAWEBWAFSAdwBXQFZAVYBwgFe\n        AVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFeAVsBVwHEAYABeQFtAeIB1QHKAbEB+QFhAVwBWAHPAWkBYwFb\n        AdYB4QHVAb0B/AFzAWwBYgHcAWABWwFXAcQBXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABYAFbAVcBxAFh\n        AVcBUAHiAV4BWAFPAeUBXQFZAVYBwgFeAVkBVwG/AV8BWgFXAcABXwFaAVYBxQFYAU8BRAHvAV8BVQFM\n        AeQBXwFbAVYBwwFeAVkBVwG/AV0BWQFWAcIBcgFpAWAB2QHrAd8BwAH9AYMBegFwAeQBXgFZAVYBzAHb\n        AdMBugH7AbMBqwGWAfIBXgFYAVQBywGQAYcBewHqAdABwwGsAfgBaAFgAVsB0AFdAVoBVgHBAV8BWgFX\n        AcABXwFaAVYBxQFcAVMBSAHqAV8BVgFNAegBXwFbAVYBwwFeAVkBVwG/AWMBXQFXAcUBYwFeAVgBxgFN\n        AUcBMgH6AWUBXgFUAd0BYwFeAVgBxgFhAVsBWAHEAWABWgFXAcIBXwFaAVcBwAFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFg\n        AVoBVwHCAWMBXQFXAcUBYQFcAVgBxwFkAVoBUQHjAVoBTgFCAfABYwFeAVgBxgFhAVsBWAHEAV8BWgFX\n        AcABXgFbAVUBxgFYAUsBQAH1AV4BWAFSAd0BXwFbAVYBwwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV8BWgFXAcABXgFZAVYBxwHbAdEBtQH6AbQBqwGYAfIBXwFaAVYBxQFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVYBxQFeAVgBTgHjAV0BUgFHAe0BYAFbAVcBxAFe\n        AVkBVwG/AV4BWQFXAb8BXQFaAVYBwQFgAVsBVwHLAWABWwFVAcYBXQFaAVYBwQFeAVkBVwG/AV4BWQFX\n        Ab8BXwFaAVcBwAFeAVsBVwHEAYABeQFtAeIB1QHKAbEB+QFhAVwBWAHPAWkBYwFbAdYB4QHVAb0B/AFz\n        AWwBYgHcAWABWwFXAcQBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXQFaAVYBwQFeAVkBVgHHAWIBXAFW\n        AckBXQFaAVYBwQFeAVkBVwG/AV8BWgFXAcABXgFbAVUBxgFYAUsBQAH1AWABVgFSAd4BXwFbAVYBwwFe\n        AVkBVwG/AV0BWQFWAcIBcgFpAWAB2QHrAd8BwAH9AYMBegFwAeQBXgFZAVYBzAHbAdMBugH7AbMBqwGW\n        AfIBXgFYAVQBywGQAYcBewHqAdABwwGsAfgBaAFgAVsB0AFdAVoBVgHBAV8BWgFXAcABXwFaAVYBxQFb\n        AVUBTAHkAV0BUgFHAe0BYAFbAVcBxAFeAVkBVwG/AWEBWwFYAcQBYwFdAVcBxQFNAUwBOAH6AWUBXAFT\n        Ad8BYwFdAVcBxQFjAVsBWQHDAV8BWgFWAcEBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFgAVoBVwHCAWEBWwFY\n        AcQBYwFdAVcBxQFkAVwBUQHnAVwBTwFDAfABYQFbAVgBxAFjAVsBWAHDAV8BWgFXAcABXgFbAVUBxgFS\n        AUkBOwH2AV4BWAFSAd0BXwFbAVYBwwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFX\n        AcABXgFZAVYBxwHbAdEBtQH6AbQBqwGYAfIBXwFaAVYBxQFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV8BWgFXAcABXgFbAVcBxAFdAVcBTwHiAV0BUgFHAe0BYAFbAVcBxAFeAVkBVwG/AV4BWQFX\n        Ab8BXQFaAVYBwQFgAVsBVQHGAWABWwFXAcQBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFe\n        AVsBVwHEAYABeQFtAeIB1QHKAbEB+QFhAVwBWAHPAWkBYwFbAdYB4QHVAb0B/AFzAWwBYgHcAWABWwFX\n        AcQBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXQFaAVYBwQFgAVsBVwHEAV8BWgFXAcUBXQFaAVYBwQFe\n        AVkBVwG/AV8BWgFXAcABXgFbAVUBxgFSAUkBOwH2AV4BWAFSAd0BXwFbAVYBwwFeAVkBVwG/AV0BWQFW\n        AcIBcgFpAWAB2QHrAd8BwAH9AYMBegFwAeQBXgFZAVYBzAHbAdMBugH7AbMBqwGWAfIBXgFYAVQBywGQ\n        AYcBewHqAdABwwGsAfgBaAFgAVsB0AFdAVoBVgHBAV8BWgFXAcABXgFbAVcBxAFdAVcBTwHiAV0BUgFH\n        Ae0BXgFbAVcBxAFeAVkBVwG/AWABXAFXAcUBagFhAVcB2wFuAWEBPgH8AWcBYQFTAeQBYQFbAVgBxAFj\n        AVsBWAHDAV8BWwFWAcEBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFgAVoBVwHCAWEBWwFYAcQBYQFbAVgBxAFo\n        AV0BTgHtAWoBZwFEAfkBaQFgAVkB1wFgAVsBWAHDAV8BWgFXAcABXwFaAVYBxQFZAU8BQwHyAWABWAFR\n        AeEBXwFbAVYBwwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXgFZAVYBxwHb\n        AdEBtQH6AbQBqwGYAfIBXwFaAVYBxQFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFX\n        AcABXwFaAVYBxQFcAVUBTAHnAVwBUwFKAeoBYAFbAVcBxAFeAVkBVwG/AV8BWgFXAcABXwFbAVYBwwFg\n        AVUBTAHnAWEBWQFTAdcBXQFZAVYBwgFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFeAVsBVwHEAYABeQFt\n        AeIB1QHKAbEB+QFhAVwBWAHPAWkBYwFbAdYB4QHVAb0B/AFzAWwBYgHcAWABWwFXAcQBXgFZAVcBvwFe\n        AVkBVwG/AV8BWgFXAcABXwFbAVYBwwFfAVoBVAHbAWABWgFSAeABXQFZAVYBwgFeAVkBVwG/AV8BWgFX\n        AcABXwFaAVYBxQFZAU4BRAHyAWEBWAFRAeEBXgFbAVcBxAFfAVoBVwHAAV0BWQFWAcIBcgFpAWAB2QHr\n        Ad8BwAH9AYMBegFwAeQBXgFZAVYBzAHbAdMBugH7AbMBqwGWAfIBXgFYAVQBywGQAYcBewHqAdABwwGs\n        AfgBaAFgAVsB0AFdAVoBVgHBAV8BWgFXAcABXgFbAVUBxgFcAVUBTAHnAVwBUwFKAeoBYAFbAVcBxAFe\n        AVkBVwG/AWoBYQFVAeEBbgFgAUEB/QFwAWIBTAHzAWkBYAFZAdQBYQFbAVgBxAFhAVsBWAHEAWABWgFX\n        AcIBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV8BWgFXAcABXwFbAVYBwQFgAVoBVwHCAWEBWwFYAcQBYwFbAVkBwwFnAWABVgHYAW0BZQFO\n        AfABagFfAUQB+wFqAV8BVgHbAV8BWgFXAcABXgFbAVcBxAFcAVUBTAHnAV4BVQFLAesBXwFaAVYBxQFf\n        AVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXgFZAVYBxwHbAdEBtQH6AbIBqAGV\n        AfEBXwFaAVYBxQFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV0BWgFWAcEBXgFZAVYBxwFZ\n        AUwBPwHzAWEBWAFRAeEBXwFbAVYBwwFeAVkBVwG/AV8BWgFXAcABXgFbAVcBxAFcAVMBSgHqAV8BVgFN\n        AegBXgFbAVcBxAFfAVoBVwHAAV4BWQFXAb8BXwFaAVcBwAFgAVsBVwHEAYABeQFtAeIB1QHKAbEB+QFi\n        AVwBWAHOAWsBZAFbAdYB4QHVAb0B/AF1AWsBYwHbAV8BWwFWAcMBXgFZAVcBvwFeAVkBVwG/AV8BWgFX\n        AcABXgFbAVUBxgFaAU4BQgHwAWABVQFNAeQBXwFbAVYBwwFeAVkBVwG/AV8BWgFXAcABXgFbAVcBxAFf\n        AVYBTQHoAVkBUwFJAewBZAFcAVYBzwFgAVsBVwHEAV8BWwFWAcMBcgFpAWAB2QHrAd8BwAH9AYMBegFw\n        AeQBXgFYAVQBywHbAdMBugH7AbMBqwGWAfIBXgFYAVQBywGQAYcBewHqAdABwwGsAfgBaAFhAVkBzwFf\n        AVsBVgHDAWABWwFWAcYBXwFcAVUBzgFZAUwBPgHzAV0BVwFPAeIBXwFbAVYBwwFeAVkBVwG/AWMBXQFZ\n        AcoBagFhAVYB3AFuAWMBUQHuAW0BZgFLAfcBZAFcAVgBzQFjAV0BVwHFAWEBWwFYAcQBYAFaAVcBwgFf\n        AVsBVgHBAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFfAVoBVwHAAV8BWwFW\n        AcEBYwFbAVgBwwFhAVsBWAHEAWMBXQFXAcUBZwFfAVYB2AFvAWQBPgH8AXEBZAFQAfEBaAFhAVYB3AFg\n        AVwBVwHFAV4BWQFXAb8BXwFbAVYBwwFhAVoBVQHVAVEBSQE7AfYBYQFZAVYBzwFdAVkBVgHCAV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVYBxQHSAccBsAH4AasBnwGQAe8BYAFbAVcBxAFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV0BWQFWAcIBXwFaAVUB2AFRAUgBMgH7AV8BWQFW\n        AdIBXQFaAVYBwQFeAVkBVwG/AV4BWQFXAb8BXwFbAVYBwwFhAVoBVAHaAVIBSQE7AfYBXQFaAVUBzQFd\n        AVoBVgHBAV4BWQFXAb8BXwFaAVcBwAFfAVsBVgHDAX0BdQFpAd8BxAG7AaMB9gFiAVwBWAHMAWoBYgFd\n        AdMB1wHMAbMB+QFxAWsBYQHYAV0BWQFWAcIBXgFZAVcBvwFeAVkBVwG/AV0BWQFWAcIBYAFbAVUB1AFR\n        AUgBMgH7AWABWAFVAdYBXQFZAVYBwgFeAVkBVwG/AV4BWQFXAb8BXwFbAVYBwwFgAVgBVQHWAXIBYgFG\n        Af0BrAGQAWIB/AFmAV0BVwHTAV8BWgFWAcUBcAFpAWEB1wHbAdMBugH7AYEBeQFvAeIBXwFZAVYByQHW\n        AcsBsgH5Aa0BogGPAfABXgFbAVcByAGQAYgBewHnAcQBugGjAfYBZwFfAVwBzgFfAVoBVgHFAW0BYwFZ\n        AdoBogGUAV8B+wFtAWABQwH+AV4BWgFTAdMBXQFZAVYBwgFeAVkBVwG/AWMBXQFZAcoBbgFjAUwB7wFw\n        AWQBUAHxAW4BXQFDAfgBZgFfAVIB4wFhAVwBWAHHAWMBXgFYAcYBYQFbAVgBxAFgAVoBVwHCAV8BWwFW\n        AcEBXwFaAVcBwAFfAVoBVwHAAV8BWgFXAcABXwFaAVcBwAFfAVsBVgHBAWMBWwFYAcMBYwFdAVcBxQFj\n        AV0BWAHGAWMBXQFZAcoBZAFfAUkB8QFqAWUBTAH0AWwBZQFOAfABbAFjAVEB6gFgAVsBWAHDAV4BWQFX\n        Ab8BXQFaAVYBwQFeAVoBVQHGAV0BUgFHAe0BYAFWAVIB3gFfAVoBVwHFAV8BWgFXAcABXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXwFbAVYBwwFzAWoBYwHXAW4BaQFgAdQBXQFZAVYBwgFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFdAVoBVgHBAWABWwFYAcgBXAFTAUgB6gFeAVUBSwHrAV8BWgFWAcUBXwFaAVcBwAFe\n        AVkBVwG/AV4BWQFXAb8BXQFaAVYBwQFeAVkBVgHHAVoBTgFCAfABYQFYAVIB3AFfAVoBVwHFAV8BWgFX\n        AcABXwFaAVcBwAFdAVoBVgHBAWQBXgFYAcsBagFkAV0B0gFfAVoBVwHFAWEBWwFXAccBawFnAV4B0wFj\n        AV4BWgHIAV0BWgFWAcEBXwFaAVcBwAFdAVoBVgHBAV4BWQFWAccBXwFWAU0B6AFYAU8BRAHvAV4BWgFV\n        AcYBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXQFaAVYBwQFeAVkBVgHHAWoBYwFJAfIBtQGeAWQB/wGQ\n        AYABYAHxAV4BWQFWAccBZAFeAVgBywF4AXIBaAHaAWkBZAFcAc8BXgFbAVcBxAF0AW8BZQHZAXIBaQFi\n        AdYBXgFbAVcBxAFqAWQBXQHSAXMBbQFjAdgBYwFdAVkByAFeAVkBVgHHAZQBggFfAfMBrgGYAWAB/wFj\n        AVgBSgHvAV4BWgFVAcYBXwFaAVcBwAFeAVkBVwG/AV0BWgFWAcEBYAFcAVYBxgFjAV4BWQHIAWgBYAFY\n        AdQBWAFKAUAB9QFlAV8BVAHeAWQBXgFZAcgBYQFcAVgBxwFjAV0BVwHFAWMBWwFYAcMBYAFaAVcBwgFf\n        AVsBVgHBAV8BWwFWAcEBYAFbAVgBwwFhAVsBWAHEAWMBXgFYAcYBZAFeAVkByAFkAV4BWQHIAWQBWQFR\n        AeMBWQFVAUYB7wFkAVwBWAHNAWABXAFWAcYBYAFbAVgBwwFfAVoBVwHAAV4BWQFXAb8BXwFaAVcBwAFf\n        AVsBVgHDAWEBWgFVAdUBUgFRAT4B9AFgAVgBVQHWAV4BWwFXAcQBXwFaAVcBwAFeAVkBVwG/AV4BWQFX\n        Ab8BXwFaAVcBwAFdAVoBVgHBAV0BWgFWAcEBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXQFaAVYBwQFf\n        AVoBVgHFAWEBWAFRAdwBWQFPAUMB8gFhAVkBVgHPAV0BWQFWAcIBXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXwFaAVcBwAFfAVsBVgHDAWABWQFTAdcBWQFMAT8B8wFgAVsBVQHUAWABWwFXAcQBXwFaAVcBwAFf\n        AVoBVwHAAV8BWgFXAcABXQFaAVYBwQFfAVoBVwHAAV8BWgFXAcABXQFaAVYBwQFfAVoBVwHAAV8BWgFX\n        AcABXQFaAVYBwQFeAVsBVwHEAWEBWgFUAdoBWQFOAUMB8gFgAVgBVAHRAV0BWQFWAcIBXwFaAVcBwAFe\n        AVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFfAVsBVgHDAWEBWQFTAdcBfQFxAU0B+gFsAWUBVAHlAWABWwFX\n        AcgBXQFZAVYBwgFdAVoBVgHBAV0BWgFWAcEBXwFaAVcBwAFdAVoBVgHBAV0BWgFWAcEBXwFaAVcBwAFd\n        AVoBVgHBAV0BWgFWAcEBXwFbAVYBwwFfAVkBVgHJAXABZAFSAeoBbgFiAUgB9gFgAVsBVgHQAV0BWQFW\n        AcIBXwFaAVcBwAFeAVkBVwG/AV8BWgFXAcABYAFaAVcBwgFhAVsBWAHEAWMBXgFYAcYBZQFcAVUB3AFL\n        AUIBMgH7AWQBXQFRAeMBZQFfAVkBygFhAVwBWAHHAWMBXQFYAcYBYQFbAVgBxAFjAVsBWAHDAWMBWwFY\n        AcMBYQFbAVgBxAFjAV4BWAHGAWQBXgFZAcgBZAFeAVgBywFiAVgBTAHpAVIBTgE5AfcBZgFfAVgB0QFj\n        AV4BWAHGAWMBWwFYAcMBXwFbAVYBwQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWgFX\n        AcUBXwFYAU4B4wFSAVEBOQH3AWABWAFVAdYBXwFaAVcBxQFdAVkBVgHCAV8BWgFXAcABXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFfAVoBVwHAAV0BWQFWAcIBXgFZAVYBxwFfAVgBUgHZAVABSQE5\n        AfYBYAFZAVMB1wFgAVsBVwHEAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFf\n        AVoBVwHAAV8BWwFVAcYBXgFXAU8B5QFSAVEBOQH3AWEBWgFVAdUBXwFaAVcBxQFdAVoBVgHBAV0BWgFW\n        AcEBXQFaAVYBwQFfAVsBVgHDAV0BWQFWAcIBXQFaAVYBwQFfAVoBVwHAAV0BWQFWAcIBXgFZAVYBxwFf\n        AVkBUwHXAVEBSQE5AfYBXwFYAVIB2QFgAVsBVwHEAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFfAVoBVwHAAV4BWwFVAcYBXgFXAU4B5QFSAVABOQH3AWEBWgFVAdUBXwFaAVcBxQFd\n        AVoBVgHBAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWQFW\n        AcIBXgFZAVYBxwFeAVgBUQHYAVABSQE5AfYBXgFYAVIB2QFeAVsBVwHEAV8BWgFXAcABXgFZAVcBvwFe\n        AVkBVwG/AV8BWgFXAcABXwFbAVYBwQFjAVsBWAHDAWMBXQFXAcUBYQFcAVgBxwFmAV8BVgHbAVIBUQE/\n        AfQBYAFXAU0B6wFmAV4BVgHXAWYBXgFZAc4BYwFdAVcBxQFhAVsBWAHEAWEBWwFYAcQBYQFcAVcBxwFl\n        AV4BVwHQAWYBXgFXAdoBWgFTAUUB8QFbAUwBPwHzAWYBXwFXAdcBYQFcAVgBxwFjAV0BVwHFAWABWgFX\n        AcIBXwFbAVYBwQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV0BWgFWAcEBYAFbAVgByAFf\n        AVgBTgHjAVIBUQE+AfQBYAFWAVIB3gFhAVkBVgHPAV8BWgFWAcUBXwFbAVYBwwFfAVsBVgHDAV8BWwFW\n        AcMBYAFbAVcBxAFfAVoBVgHFAWABWwFWAdABXgFXAU4B5QFYAUoBQAH1AWABVgFSAd4BXwFaAVcBxQFd\n        AVoBVgHBAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV0BWgFW\n        AcEBYAFaAVcBygFeAVcBTgHlAVIBUQE/AfQBXgFYAVIB3QFhAVkBVgHPAV4BWgFVAcYBZQFeAVcB0AFt\n        AWQBWQHaAWsBYwFXAdkBYQFbAVcBywFeAVoBVQHGAWABWwFWAdABXwFVAUwB5AFYAUoBQAH1AV8BWgFR\n        AeABXgFZAVYBxwFdAVoBVgHBAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV0BWgFWAcEBYAFaAVcBygFeAVcBTwHlAVoBTAE/AfMBYQFYAVIB3AFdAVoBVQHNAV4BWwFX\n        AcQBXQFZAVYBwgFfAVoBVwHAAV8BWgFXAcABXQFZAVYBwgFeAVsBVwHEAWEBWQFWAc8BXwFXAU4B4wFZ\n        AUoBQAH1AWEBWAFRAeEBXgFZAVYBxwFdAVoBVgHBAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFX\n        AcABXwFaAVcBwAFfAVsBVgHBAWMBWwFYAcMBYwFeAVgBxgFhAV4BWAHHAWYBXwFZAc4BZAFbAVQB4QFc\n        AUwBPwHzAVUBUQE8AfcBbwFkAU0B8QFpAWEBVgHfAWkBYQFWAd8BbAFmAUkB8gFZAU4BPAH4AVsBUwFF\n        AfEBZgFeAVcB2gFkAV4BWQHMAWEBXAFYAccBYwFdAVcBxQFgAVsBWAHDAV8BWwFWAcEBXwFaAVcBwAFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXQFaAVYBwQFfAVoBVwHFAWEBWgFV\n        AdUBXQFSAUcB7QFRAUkBOwH2AV4BVQFLAesBYAFYAVEB4QFeAVgBUgHdAV4BWAFSAd0BXwFVAUwB5AFb\n        AVQBSgHsAVIBSQE7AfYBXwFWAU0B6AFfAVgBVAHRAV8BWgFXAcUBXQFaAVYBwQFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXQFaAVYBwQFf\n        AVoBVwHFAWEBWgFVAdUBWQFTAUYB7gFRAUkBOwH2AV0BVQFLAesBfQFuAVcB8gGxAZkBaAH+AbIBnQFg\n        Af0BaQFeAVAB7QFaAVQBSQHsAVIBSQE7AfYBWwFUAUoB6QFfAVkBVgHSAV8BWgFXAcUBXQFaAVYBwQFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFX\n        AcABXQFaAVYBwQFfAVsBVQHGAWABWAFVAdYBWgFOAUIB8AFSAUkBOwH2AVsBVAFKAekBXwFaAVUB2AFg\n        AVsBVwHEAV8BWgFXAcUBYQFaAVQB2wFcAVMBSAHqAVgBSwFAAfUBWwFTAUoB7AFeAVoBUwHTAV8BWgFX\n        AcUBXQFaAVYBwQFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFf\n        AVoBVwHAAV8BWwFWAcEBYwFbAVgBwwFjAV0BVwHFAWMBXgFYAcYBYwFeAVgBxgFjAV0BVwHFAWQBXQFY\n        AdIBcAFfAUgB+gFwAWMBTAHzAW4BYgFPAe4BcAFeAUUB+AFkAV4BWAHLAWMBXgFYAcYBYwFeAVgBxgFj\n        AV4BWAHGAWEBWwFYAcQBYAFaAVcBwgFfAVsBVgHBAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWwFWAcMBXgFaAVUBxgFh\n        AVoBVQHVAVwBVQFMAecBWQFPAUMB8gFSAUkBOwH2AVgBSwFAAfUBWgFOAUIB8AFhAVgBTQHmAV8BWQFW\n        AdIBXwFaAVYBxQFdAVkBVgHCAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWwFW\n        AcMBXgFaAVUBxgFgAVgBVQHWAV8BVgFNAegBXwFbAUcB8wFtAV0BRQH4AW0BYgFLAfcBYAFTAUUB8QFf\n        AVgBTQHmAV4BWgFTAdMBXwFaAVYBxQFdAVkBVgHCAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFf\n        AVoBVwHAAV8BWwFWAcMBXgFYAVUBxgFhAVoBVAHaAVwBUwFIAeoBXwFXAU0B6AFgAVsBVQHGAWIBXAFW\n        AckBXgFWAUoB6QFfAVYBTQHoAWABWAFSAdYBXgFbAVUBxgFdAVkBVgHCAV8BWgFXAcABXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWgFX\n        AcABXwFbAVYBwQFgAVoBVwHCAWEBWwFYAcQBYQFbAVgBxAFjAV0BVwHFAWMBXQFXAcUBbQFhAU8B7gFv\n        AWIBTAHzAW8BZAFMAe8BawFjAVcB4AFhAVsBWAHEAWMBXQFXAcUBYQFbAVgBxAFjAVsBWAHDAWABWgFX\n        AcIBXwFbAVYBwQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXQFaAVYBwQFfAVsBVgHDAV4BWwFX\n        AcQBXwFaAVYBxQFeAVsBVQHGAV4BWwFVAcYBXwFaAVYBxQFeAVsBVwHEAV0BWQFWAcIBXQFaAVYBwQFf\n        AVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXQFaAVYBwQFf\n        AVsBVgHDAV8BWgFWAcUBXgFaAVUBxgFeAVkBVgHHAV4BWQFWAccBXgFbAVUBxgFeAVsBVwHEAV0BWQFW\n        AcIBXQFaAVYBwQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFX\n        AcABXQFaAVYBwQFfAVsBVgHDAV4BWwFXAcQBXwFbAVYBwwFdAVoBVgHBAV0BWgFWAcEBXwFbAVYBwwFg\n        AVsBVwHEAV8BWwFWAcMBXQFaAVYBwQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFf\n        AVoBVwHAAV8BWwFWAcEBYAFaAVcBwgFgAVoBVwHCAV8BWwFWAcEBZgFeAVgBzgFnAV4BVwHTAWYBXwFY\n        AdEBYwFdAVkByAFfAVsBVgHBAWABWgFXAcIBXwFbAVYBwQFfAVoBVgHBAV8BWgFXAcABXwFaAVcBwAFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVcBwAFf\n        AVoBVwHAAV8BWgFXAcABXwFaAVcBwAFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFX\n        AcABXwFaAVcBwAFfAVoBVwHAAV8BWgFXAcABXwFaAVcBwAFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV8BWgFXAcABXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFfAVoBVwHAAV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AUIBTQE+BwABPgMAASgDAAFgAwABMAMAAQEBAAEBBQABQAECFgAD/wcAAfEC/wkAAfABfwH/\n        CQAB4AEPAf8JAAHgAQABHwkAAcALAAHACwABgAsAAYAZAAEBCwABAQkAAeABAAEBCQAB4AEAAQMJAAHg\n        AQABAwkAAeABAAEDCQAB4AEAAQcJAAHgAQABBwkAAeABAAEHCQAB4AEAAQcJAAHgAQABBwkAAeABAAEH\n        CQABwAEAAQ8JAAHnAv8JAAP//wAkAAs=\n</value>\n  </data>\n  <data name=\"cmiLvPlanToLevel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        vgAADr4B6kKxwAAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAALmSURB\n        VDhPZZJLTxNhFIaJP8JEFwb1FxhHV8QLujDRhXEBRI0GNQQSFAQRUUQwBAm30nKrFFqhF3qlLdPOUCgt\n        vQJthba00JarYiSDcWHcqenr0Bk1lTc5+VbP851zvi/nTza3tlyJRMIRjcXNwXBE7w6EtNO+ec2k158p\n        m3dOTbs8pbknTh7ikeykNjaYWCIJVygMncOLftKGVg2ZVQKD9Ve3QlN/+MjRg5JYMsV8+fYdH/a+YnVn\n        F+54CnPJTczGUtD6QtB4g5nqNdE/+1T6+mO5x7MlvkiUWd/dw9LmDhZSmwisbWEmmoDKHThQnTrrj2bl\n        +Fke5WL1LzCh9W325jWYF8JQs7f9D44459FGOnBdpEwXCEfP8ygX5YybmQqvgAxGMgLj/BIMc4uZ0xwI\n        Q+qYQ82YFcXDBlzseJcu7FFkC0RmG0MvxhD/+Bmrn3Yze/CurLGjbMMWSUAfWEbzhBPlCgsud8nTRX2q\n        bIHASDNTS3EEWWA2loSHhe3sDrqsLrRbnGi3uiGw+VA1pEOaIJDsbAePcmkaMzFqTxD7Xey3LrA40KCl\n        2JmdqFVTqNNOonPCDl1TE9JFNzISHuXSbrAyZDAK6v0yeqhZVI0aMUhOo54FW9jWhaQZIpEIFEWhv7IC\n        YrG0hEe5tGhIxsQuj16MQ2L3Q+kJQUC5MOZfgsw+CdsggcgUgcbGRjyQ6NOlCssFHuXyfGScKXurQolY\n        hVKJBo+ketwVq1Etk/+Fx7oJNOhIFMpMeGxw5vMolyuve5jb3TLcH1CinIUrR02olMqgHvgH1yg0qNTZ\n        cUtG4onZdYlHueQ3CplmPQ1jIILZlXV4olEYpRwsaSVYqRJlKhrV4w7cGbXiKenJFpx7JWSKe+UoH9aj\n        jv0w6r48+OgOyLsIPGTHKJFbUKGdxrMJN+4padRR/mzBqdo25nRdB4gXApx5KQTBPpOwgcDV1h7kvRna\n        /zy4NqBBwbAJN2VsB5Z9QU7ObwjkSucBbV0TAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"pbSearchTextDel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQg\n        djMuMzap5+IlAAAAUUlEQVQoU2NwdHSMCgwM3K+vry/KAAUgNkgMJMcAYqSlpf0PDw8/ApIAYRAbJAaS\n        A6uGCYBoZDbcVGRFGJIggFcBsiSIRmaDFRF0JH5vOkYBALc2UwG7hivNAAAAAElFTkSuQmCC\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/CertificateTreeDisplayControl.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    sealed partial class CertificateTreeDisplayControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CertificateTreeDisplayControl));\n            this.cmListSkills = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.planToLevel = new System.Windows.Forms.ToolStripMenuItem();\n            this.planToLevelSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.showInBrowserMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInExplorerMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.tsmExpandSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmCollapseSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.toggleSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.tsmExpandAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmCollapseAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.imageList = new System.Windows.Forms.ImageList(this.components);\n            this.imageListCertLevels = new System.Windows.Forms.ImageList(this.components);\n            this.treeView = new EVEMon.SkillPlanner.OverridenTreeView();\n            this.cmListSkills.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // cmListSkills\n            // \n            this.cmListSkills.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.planToLevel,\n            this.planToLevelSeparator,\n            this.showInBrowserMenu,\n            this.showInExplorerMenu,\n            this.showInMenuSeparator,\n            this.tsmExpandSelected,\n            this.tsmCollapseSelected,\n            this.toggleSeparator,\n            this.tsmExpandAll,\n            this.tsmCollapseAll});\n            this.cmListSkills.Name = \"cmListSkills\";\n            this.cmListSkills.Size = new System.Drawing.Size(195, 198);\n            this.cmListSkills.Opening += new System.ComponentModel.CancelEventHandler(this.cmListSkills_Opening);\n            // \n            // planToLevel\n            // \n            this.planToLevel.Image = ((System.Drawing.Image)(resources.GetObject(\"planToLevel.Image\")));\n            this.planToLevel.Name = \"planToLevel\";\n            this.planToLevel.Size = new System.Drawing.Size(194, 22);\n            this.planToLevel.Text = \"&Plan...\";\n            this.planToLevel.Click += new System.EventHandler(this.tsmAddToPlan_Click);\n            // \n            // planToLevelSeparator\n            // \n            this.planToLevelSeparator.Name = \"planToLevelSeparator\";\n            this.planToLevelSeparator.Size = new System.Drawing.Size(191, 6);\n            // \n            // showInBrowserMenu\n            // \n            this.showInBrowserMenu.Name = \"showInBrowserMenu\";\n            this.showInBrowserMenu.Size = new System.Drawing.Size(194, 22);\n            this.showInBrowserMenu.Text = \"Show in Skill &Browser\";\n            this.showInBrowserMenu.Click += new System.EventHandler(this.showInBrowserMenu_Click);\n            // \n            // showInExplorerMenu\n            // \n            this.showInExplorerMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"showInExplorerMenu.Image\")));\n            this.showInExplorerMenu.Name = \"showInExplorerMenu\";\n            this.showInExplorerMenu.Size = new System.Drawing.Size(194, 22);\n            this.showInExplorerMenu.Text = \"Show in Skill &Explorer...\";\n            this.showInExplorerMenu.Click += new System.EventHandler(this.showInExplorerMenu_Click);\n            // \n            // showInMenuSeparator\n            // \n            this.showInMenuSeparator.Name = \"showInMenuSeparator\";\n            this.showInMenuSeparator.Size = new System.Drawing.Size(191, 6);\n            // \n            // tsmExpandSelected\n            // \n            this.tsmExpandSelected.Name = \"tsmExpandSelected\";\n            this.tsmExpandSelected.Size = new System.Drawing.Size(194, 22);\n            this.tsmExpandSelected.Text = \"Expand Selected\";\n            this.tsmExpandSelected.Click += new System.EventHandler(this.tsmExpandSelected_Click);\n            // \n            // tsmCollapseSelected\n            // \n            this.tsmCollapseSelected.Name = \"tsmCollapseSelected\";\n            this.tsmCollapseSelected.Size = new System.Drawing.Size(194, 22);\n            this.tsmCollapseSelected.Text = \"Collapse Selected\";\n            this.tsmCollapseSelected.Click += new System.EventHandler(this.tsmCollapseSelected_Click);\n            // \n            // toggleSeparator\n            // \n            this.toggleSeparator.Name = \"toggleSeparator\";\n            this.toggleSeparator.Size = new System.Drawing.Size(191, 6);\n            // \n            // tsmExpandAll\n            // \n            this.tsmExpandAll.Name = \"tsmExpandAll\";\n            this.tsmExpandAll.Size = new System.Drawing.Size(194, 22);\n            this.tsmExpandAll.Text = \"&Expand All\";\n            this.tsmExpandAll.Click += new System.EventHandler(this.tsmExpandAll_Click);\n            // \n            // tsmCollapseAll\n            // \n            this.tsmCollapseAll.Name = \"tsmCollapseAll\";\n            this.tsmCollapseAll.Size = new System.Drawing.Size(194, 22);\n            this.tsmCollapseAll.Text = \"&Collapse All\";\n            this.tsmCollapseAll.Click += new System.EventHandler(this.tsmCollapseAll_Click);\n            // \n            // imageList\n            // \n            this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"imageList.ImageStream\")));\n            this.imageList.TransparentColor = System.Drawing.Color.Transparent;\n            this.imageList.Images.SetKeyName(0, \"Trained\");\n            this.imageList.Images.SetKeyName(1, \"Trainable\");\n            this.imageList.Images.SetKeyName(2, \"Untrainable\");\n            this.imageList.Images.SetKeyName(3, \"Certificate\");\n            this.imageList.Images.SetKeyName(4, \"Skillbook\");\n            this.imageList.Images.SetKeyName(5, \"Planned\");\n            // \n            // imageListCertLevels\n            // \n            this.imageListCertLevels.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"imageListCertLevels.ImageStream\")));\n            this.imageListCertLevels.TransparentColor = System.Drawing.Color.Transparent;\n            this.imageListCertLevels.Images.SetKeyName(0, \"level0\");\n            this.imageListCertLevels.Images.SetKeyName(1, \"level1\");\n            this.imageListCertLevels.Images.SetKeyName(2, \"level2\");\n            this.imageListCertLevels.Images.SetKeyName(3, \"level3\");\n            this.imageListCertLevels.Images.SetKeyName(4, \"level4\");\n            this.imageListCertLevels.Images.SetKeyName(5, \"level5\");\n            // \n            // treeView\n            // \n            this.treeView.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.treeView.ContextMenuStrip = this.cmListSkills;\n            this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.treeView.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawText;\n            this.treeView.FullRowSelect = true;\n            this.treeView.ImageIndex = 0;\n            this.treeView.ImageList = this.imageList;\n            this.treeView.Indent = 27;\n            this.treeView.ItemHeight = 1;\n            this.treeView.Location = new System.Drawing.Point(0, 0);\n            this.treeView.Name = \"treeView\";\n            this.treeView.SelectedImageIndex = 0;\n            this.treeView.Size = new System.Drawing.Size(226, 282);\n            this.treeView.TabIndex = 0;\n            this.treeView.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(this.treeView_DrawNode);\n            this.treeView.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView_NodeMouseDoubleClick);\n            this.treeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeView_MouseDown);\n            this.treeView.MouseMove += new System.Windows.Forms.MouseEventHandler(this.treeView_MouseMove);\n            // \n            // CertificateTreeDisplayControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.SystemColors.Window;\n            this.Controls.Add(this.treeView);\n            this.Name = \"CertificateTreeDisplayControl\";\n            this.Size = new System.Drawing.Size(226, 282);\n            this.cmListSkills.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private OverridenTreeView treeView;\n        private System.Windows.Forms.ImageList imageList;\n        private System.Windows.Forms.ContextMenuStrip cmListSkills;\n        private System.Windows.Forms.ToolStripSeparator toggleSeparator;\n        private System.Windows.Forms.ToolStripMenuItem tsmExpandAll;\n        private System.Windows.Forms.ToolStripMenuItem tsmCollapseAll;\n        private System.Windows.Forms.ToolStripMenuItem planToLevel;\n        private System.Windows.Forms.ToolStripMenuItem showInBrowserMenu;\n        private System.Windows.Forms.ToolStripSeparator planToLevelSeparator;\n        private System.Windows.Forms.ToolStripMenuItem showInExplorerMenu;\n        private System.Windows.Forms.ToolStripSeparator showInMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem tsmExpandSelected;\n        private System.Windows.Forms.ToolStripMenuItem tsmCollapseSelected;\n        private System.Windows.Forms.ImageList imageListCertLevels;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/CertificateTreeDisplayControl.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// UserControl to display a tree of certificates.\n    /// </summary>\n    public sealed partial class CertificateTreeDisplayControl : UserControl\n    {\n        private const string TrainedIcon = \"Trained\";\n        private const string TrainableIcon = \"Trainable\";\n        private const string UntrainableIcon = \"Untrainable\";\n        private const string SkillBookIcon = \"Skillbook\";\n        private const string PlannedIcon = \"Planned\";\n\n        // Blank image list for 'Safe for work' setting\n        private readonly ImageList m_emptyImageList = new ImageList();\n\n        private Plan m_plan;\n        private Character m_character;\n        private CertificateClass m_class;\n        private Font m_boldFont;\n\n        private bool m_allExpanded;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CertificateTreeDisplayControl\"/> class.\n        /// </summary>\n        public CertificateTreeDisplayControl()\n        {\n            SetStyle(ControlStyles.OptimizedDoubleBuffer |\n                     ControlStyles.DoubleBuffer |\n                     ControlStyles.UserPaint |\n                     ControlStyles.ResizeRedraw |\n                     ControlStyles.ContainerControl |\n                     ControlStyles.AllPaintingInWmPaint, true);\n            UpdateStyles();\n\n            InitializeComponent();\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the current plan.\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                m_plan = value;\n                if (m_plan == null)\n                    return;\n\n                m_character = (Character)m_plan.Character;\n                UpdateTree();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the certificate class (i.e. \"Core competency\").\n        /// </summary>\n        internal CertificateClass CertificateClass\n        {\n            get { return m_class; }\n            set\n            {\n                if (m_class == value)\n                    return;\n\n                m_class = value;\n                m_character = m_class?.Character;\n                UpdateTree();\n            }\n        }\n\n        /// <summary>\n        /// Gets cert of the displayed class which contains the current selection.\n        /// </summary>\n        private CertificateLevel SelectedCertificateLevel\n        {\n            get\n            {\n                TreeNode node = treeView.SelectedNode;\n                while (node != null)\n                {\n                    CertificateLevel certLevel = node.Tag as CertificateLevel;\n                    if (certLevel != null && certLevel.Certificate.Class == m_class)\n                        return certLevel;\n\n                    node = node.Parent;\n                }\n                return null;\n            }\n        }\n\n        #endregion\n\n        \n        #region Event Handlers\n\n        /// <summary>\n        /// On load, complete the initialization.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            m_boldFont = FontFactory.GetFont(Font, FontStyle.Bold);\n            treeView.Font = FontFactory.GetFont(\"Microsoft Sans Serif\", 8.25F);\n            treeView.ItemHeight = treeView.Font.Height * 2 + 6;\n\n            m_emptyImageList.ImageSize = new Size(30, 24);\n            m_emptyImageList.Images.Add(new Bitmap(30, 24));\n\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.CharacterUpdated += EveMonClient_CharacterUpdated;\n            EveMonClient.PlanChanged += EveMonClient_PlanChanged;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.CharacterUpdated -= EveMonClient_CharacterUpdated;\n            EveMonClient.PlanChanged -= EveMonClient_PlanChanged;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// On settings change, we update the tree.\n        /// </summary>\n        /// <remarks>Relates to safe for work setting</remarks>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateTree();\n        }\n\n        /// <summary>\n        /// Fired when one of the character changed (skill completion, update from CCP, etc).\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (m_plan == null)\n                return;\n\n            if (e.Character != m_plan.Character)\n                return;\n\n            UpdateTree();\n        }\n\n        /// <summary>\n        /// Occurs when the plan changes, we update the tree.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_PlanChanged(object sender, PlanChangedEventArgs e)\n        {\n            if ((e.Plan != m_plan) || (e.Plan.Character != m_plan.Character))\n                return;\n\n            UpdateTree();\n        }\n\n        /// <summary>\n        /// When the treeview is clicked, we manually select nodes since the bounding boxes are incorrect due to custom draw.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void treeView_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                treeView.Cursor = Cursors.Default;\n\n            // Perform the selection manually since the bound's width and x are incorrect in owndraw\n            TreeNode selection = null;\n            for (TreeNode node = treeView.TopNode; node != null; node = node.NextVisibleNode)\n            {\n                if (node.Bounds.Top > e.Y || node.Bounds.Bottom < e.Y)\n                    continue;\n\n                // If the user clicked the \"arrow zone\", we do not change the selection and just return\n                if (e.X < node.Bounds.Left - 32)\n                    return;\n\n                selection = node;\n                break;\n            }\n\n            treeView.SelectedNode = selection;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void treeView_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            treeView.Cursor = CustomCursors.ContextMenu;\n        }\n        \n        /// <summary>\n        /// Event handler for treenode double click event.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void treeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)\n        {\n            if (e.Node.Tag is CertificateLevel)\n            {\n                if (e.Node.IsExpanded)\n                {\n                    e.Node.Collapse();\n                    return;\n                }\n\n                e.Node.Expand();\n            }\n\n            showInBrowserMenu_Click(sender, e);\n        }\n\n        #endregion\n\n\n        #region Tree building\n\n        /// <summary>\n        /// Update the whole tree.\n        /// </summary>\n        private void UpdateTree()\n        {\n            CertificateLevel oldSelection = SelectedCertificateLevel;\n            TreeNode newSelection = null;\n\n            treeView.ImageList = Settings.UI.SafeForWork ? m_emptyImageList : imageList;\n\n            treeView.BeginUpdate();\n            try\n            {\n                // Clear the old items\n                treeView.Nodes.Clear();\n\n                // No update when not fully initialized\n                if (m_class == null)\n                    return;\n\n                // Create the nodes when not done, yet\n                if (treeView.Nodes.Count == 0)\n                {\n                    foreach (CertificateLevel certLevel in m_class.Certificate.AllLevel)\n                    {\n                        TreeNode node = CreateNode(certLevel);\n                        treeView.Nodes.Add(node);\n\n                        // Does the old selection still exists ?\n                        if (certLevel == oldSelection)\n                            newSelection = node;\n                    }\n                }\n\n                // Update the nodes\n                foreach (TreeNode node in treeView.Nodes)\n                {\n                    UpdateNode(node);\n                }\n\n                // Is the old selection kept ? Then we select the matching node\n                if (newSelection != null)\n                    treeView.SelectedNode = newSelection;\n            }\n            finally\n            {\n                treeView.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Create a node from a prerequisite certificate.\n        /// </summary>\n        /// <param name=\"certLevel\">The cert level.</param>\n        /// <returns></returns>\n        private static TreeNode CreateNode(CertificateLevel certLevel)\n        {\n            TreeNode node = new TreeNode\n            {\n                Text = certLevel.ToString(),\n                Tag = certLevel\n            };\n\n            foreach (SkillLevel prereqSkill in certLevel.PrerequisiteSkills)\n            {\n                node.Nodes.Add(CreateNode(prereqSkill));\n            }\n\n            return node;\n        }\n\n        /// <summary>\n        /// Create a node from a prerequisite skill.\n        /// </summary>\n        /// <param name=\"skillPrereq\"></param>\n        /// <returns></returns>\n        private static TreeNode CreateNode(SkillLevel skillPrereq)\n        {\n            TreeNode node = new TreeNode\n            {\n                Text = skillPrereq.ToString(),\n                Tag = skillPrereq\n            };\n\n            // Add this skill's prerequisites\n            foreach (SkillLevel prereqSkill in skillPrereq.Skill.Prerequisites\n                .Where(prereqSkill => prereqSkill.Skill != skillPrereq.Skill))\n            {\n                node.Nodes.Add(CreateNode(prereqSkill));\n            }\n\n            return node;\n        }\n\n        /// <summary>\n        /// Updates the specified node and its children.\n        /// </summary>\n        /// <param name=\"node\"></param>\n        private void UpdateNode(TreeNode node)\n        {\n            CertificateLevel certLevel = node.Tag as CertificateLevel;\n\n            // The node represents a certificate\n            if (certLevel != null)\n            {\n                if (m_character != null)\n                {\n                    if (certLevel.IsTrained)\n                        node.ImageIndex = imageList.Images.IndexOfKey(TrainedIcon);\n                    else if (certLevel.IsPartiallyTrained)\n                        node.ImageIndex = imageList.Images.IndexOfKey(TrainableIcon);\n                    else\n                        node.ImageIndex = imageList.Images.IndexOfKey(UntrainableIcon);\n                }\n            }\n            // The node represents a skill prerequisite\n            else\n            {\n                SkillLevel skillPrereq = (SkillLevel)node.Tag;\n                Skill skill = m_character?.Skills[skillPrereq.Skill.ID] ?? skillPrereq.Skill;\n\n                if (m_character != null)\n                {\n                    if (skillPrereq.IsTrained)\n                        node.ImageIndex = imageList.Images.IndexOfKey(TrainedIcon);\n                    else if (m_plan != null && m_plan.IsPlanned(skill, skillPrereq.Level))\n                        node.ImageIndex = imageList.Images.IndexOfKey(PlannedIcon);\n                    else if (skill.IsKnown)\n                        node.ImageIndex = imageList.Images.IndexOfKey(TrainableIcon);\n                    else\n                        node.ImageIndex = imageList.Images.IndexOfKey(UntrainableIcon);\n                }\n            }\n\n            // When selected, the image remains the same\n            node.SelectedImageIndex = node.ImageIndex;\n\n            // Update the children\n            foreach (TreeNode child in node.Nodes)\n            {\n                UpdateNode(child);\n            }\n        }\n\n        /// <summary>\n        /// Custom draw for the label.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void treeView_DrawNode(object sender, DrawTreeNodeEventArgs e)\n        {\n            // Prevents a bug that causes every item to be redrawn at the top left corner\n            if (e.Bounds.Left <= 10)\n            {\n                e.DrawDefault = true;\n                return;\n            }\n\n            string line2 = \"-\";\n            int supIcon = -1;\n            ImageList il;\n\n            // Is it a certificate level ?\n            CertificateLevel certLevel = e.Node.Tag as CertificateLevel;\n            if (certLevel != null)\n            {\n                if (!Settings.UI.SafeForWork)\n                    supIcon = (int)certLevel.Level;\n\n                il = imageListCertLevels;\n\n                // When not trained, let's display the training time\n                if (!certLevel.IsTrained)\n                {\n                    TimeSpan time = certLevel.GetTrainingTime;\n                    if (time != TimeSpan.Zero)\n                        line2 = time.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n                }\n            }\n            // Or a skill prerequisite ?\n            else\n            {\n                if (!Settings.UI.SafeForWork)\n                    supIcon = imageList.Images.IndexOfKey(SkillBookIcon);\n\n                il = imageList;\n                SkillLevel skillPrereq = (SkillLevel)e.Node.Tag;\n\n                // When not known to the require level, let's display the training time\n                if (!skillPrereq.IsTrained)\n                {\n                    TimeSpan time = skillPrereq.Skill.GetLeftTrainingTimeToLevel(skillPrereq.Level);\n                    if (time != TimeSpan.Zero)\n                        line2 = time.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n                }\n            }\n\n            // Choose colors according to selection\n            bool isSelected = (e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected;\n            Color backColor = isSelected ? SystemColors.Highlight : treeView.BackColor;\n            Color foreColor = isSelected ? SystemColors.HighlightText : treeView.ForeColor;\n            Color lightForeColor = isSelected ? SystemColors.HighlightText : SystemColors.GrayText;\n\n            // Draws the background\n            using (SolidBrush background = new SolidBrush(backColor))\n            {\n                int width = treeView.ClientSize.Width - e.Bounds.Left;\n                e.Graphics.FillRectangle(background, new Rectangle(e.Bounds.Left, e.Bounds.Top, width, e.Bounds.Height));\n            }\n\n            // Performs the drawing\n            using (SolidBrush foreground = new SolidBrush(foreColor))\n            {\n                float offset;\n                int left = e.Bounds.Left + il.ImageSize.Width + 2;\n                Size line1Size = TextRenderer.MeasureText(e.Node.Text, m_boldFont);\n\n                if (!string.IsNullOrEmpty(line2))\n                {\n                    Size line2Size = TextRenderer.MeasureText(line2, Font);\n\n                    offset = (float)(e.Bounds.Height - line1Size.Height - line2Size.Height) / 2;\n                    e.Graphics.DrawString(e.Node.Text, m_boldFont, foreground, new PointF(left, e.Bounds.Top + offset));\n\n                    using (SolidBrush lightForeground = new SolidBrush(lightForeColor))\n                    {\n                        e.Graphics.DrawString(line2, Font, lightForeground, new PointF(left, e.Bounds.Top + offset + line1Size.Height));\n                    }\n                }\n                else\n                {\n                    offset = (float)(e.Bounds.Height - line1Size.Height) / 2;\n                    e.Graphics.DrawString(e.Node.Text, m_boldFont, foreground, new PointF(left, e.Bounds.Top + offset));\n                }\n            }\n\n            // Draws the icon for skill/cert on the far right\n            if (supIcon == -1)\n                return;\n\n            int imgOfssetX = e.Bounds.Left;\n            float imgOffsetY = Math.Max(0.0f, (e.Bounds.Height - il.ImageSize.Height) * 0.5f);\n            e.Graphics.DrawImageUnscaled(il.Images[supIcon], imgOfssetX, (int)(e.Bounds.Top + imgOffsetY));\n        }\n\n        #endregion\n\n\n        #region Context menus\n\n        /// <summary>\n        /// Context menu opening, we update the menus' statuses.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmListSkills_Opening(object sender, CancelEventArgs e)\n        {\n            TreeNode node = treeView.SelectedNode;\n            CertificateLevel certLevel = node?.Tag as CertificateLevel;\n\n            planToLevel.Visible = planToLevelSeparator.Visible = m_plan != null && node != null;\n\n            if (m_plan != null)\n            {\n                // When a certificate is selected\n                if (certLevel != null)\n                {\n                    // Update \"add to\" menu\n                    planToLevel.Enabled = !m_plan.WillGrantEligibilityFor(certLevel);\n                    planToLevel.Text = $\"Plan \\\"{certLevel}\\\"\";\n                }\n                // When a skill is selected\n                else if (node != null)\n                {\n                    // Update \"add to\" menu\n                    SkillLevel prereq = (SkillLevel)node.Tag;\n                    Skill skill = prereq.Skill;\n                    planToLevel.Enabled = skill.Level < prereq.Level && !m_plan.IsPlanned(skill, prereq.Level);\n                    planToLevel.Text = $\"Plan \\\"{skill} {Skill.GetRomanFromInt(prereq.Level)}\\\"\";\n                }\n            }\n\n            // Update \"show in\" menu\n            showInBrowserMenu.Visible =\n                showInExplorerMenu.Visible =\n                    showInMenuSeparator.Visible = node != null && certLevel == null;\n\n            // \"Collapse\" and \"Expand\" menus\n            tsmCollapseSelected.Visible = node != null && node.GetNodeCount(true) > 0 && node.IsExpanded;\n            tsmExpandSelected.Visible = node != null && node.GetNodeCount(true) > 0 && !node.IsExpanded;\n\n            tsmExpandSelected.Text = node != null && node.GetNodeCount(true) > 0 && !node.IsExpanded\n                ? $\"Expand \\\"{node.Text}\\\"\"\n                : string.Empty;\n            tsmCollapseSelected.Text = node != null && node.GetNodeCount(true) > 0 && node.IsExpanded\n                ? $\"Collapse \\\"{node.Text}\\\"\"\n                : string.Empty;\n\n            toggleSeparator.Visible = node != null && node.GetNodeCount(true) > 0;\n\n            // \"Expand All\" and \"Collapse All\" menus\n            tsmCollapseAll.Enabled = tsmCollapseAll.Visible = m_allExpanded;\n            tsmExpandAll.Enabled = tsmExpandAll.Visible = !tsmCollapseAll.Enabled;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Plan \"(selection)\".\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmAddToPlan_Click(object sender, EventArgs e)\n        {\n            CertificateLevel cert = treeView.SelectedNode.Tag as CertificateLevel;\n            IPlanOperation operation;\n\n            if (cert != null)\n                operation = m_plan.TryPlanTo(cert);\n            else\n            {\n                SkillLevel prereq = (SkillLevel)treeView.SelectedNode.Tag;\n                operation = m_plan.TryPlanTo(prereq.Skill, prereq.Level);\n            }\n\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            if (planWindow == null)\n                return;\n\n            PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow, operation);\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmExpandSelected_Click(object sender, EventArgs e)\n        {\n            treeView.SelectedNode.Expand();\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmCollapseSelected_Click(object sender, EventArgs e)\n        {\n            treeView.SelectedNode.Collapse();\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand All.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmExpandAll_Click(object sender, EventArgs e)\n        {\n            treeView.ExpandAll();\n            m_allExpanded = true;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse All.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmCollapseAll_Click(object sender, EventArgs e)\n        {\n            treeView.CollapseAll();\n            m_allExpanded = false;\n        }\n\n        /// <summary>\n        /// Context menu > Show \"skill\" in browser | Show \"certificate class\" certificates.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInBrowserMenu_Click(object sender, EventArgs e)\n        {\n            var skillTag = treeView.SelectedNode?.Tag as SkillLevel;\n\n            if (skillTag != null)\n                // Open the skill browser\n                PlanWindow.ShowPlanWindow(m_character, m_plan).ShowSkillInBrowser(skillTag.\n                    Skill);\n        }\n\n        /// <summary>\n        /// Context menu > Show \"skill\" in explorer.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInExplorerMenu_Click(object sender, EventArgs e)\n        {\n            var skillTag = treeView.SelectedNode?.Tag as SkillLevel;\n\n            if (skillTag != null)\n                // Open the skill explorer\n                SkillExplorerWindow.ShowSkillExplorerWindow(m_character, m_plan).\n                    ShowSkillInExplorer(skillTag.Skill);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/CertificateTreeDisplayControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"cmListSkills.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"planToLevel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        wAAADsABataJCQAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAALmSURB\n        VDhPZZJLTxNhFIaJP8JEFwb1FxhHV8QLujDRhXEBRI0GNQQSFAQRUUQwBAm30nKrFFqhF3qlLdPOUCgt\n        vQJthba00JarYiSDcWHcqenr0Bk1lTc5+VbP851zvi/nTza3tlyJRMIRjcXNwXBE7w6EtNO+ec2k158p\n        m3dOTbs8pbknTh7ikeykNjaYWCIJVygMncOLftKGVg2ZVQKD9Ve3QlN/+MjRg5JYMsV8+fYdH/a+YnVn\n        F+54CnPJTczGUtD6QtB4g5nqNdE/+1T6+mO5x7MlvkiUWd/dw9LmDhZSmwisbWEmmoDKHThQnTrrj2bl\n        +Fke5WL1LzCh9W325jWYF8JQs7f9D44459FGOnBdpEwXCEfP8ygX5YybmQqvgAxGMgLj/BIMc4uZ0xwI\n        Q+qYQ82YFcXDBlzseJcu7FFkC0RmG0MvxhD/+Bmrn3Yze/CurLGjbMMWSUAfWEbzhBPlCgsud8nTRX2q\n        bIHASDNTS3EEWWA2loSHhe3sDrqsLrRbnGi3uiGw+VA1pEOaIJDsbAePcmkaMzFqTxD7Xey3LrA40KCl\n        2JmdqFVTqNNOonPCDl1TE9JFNzISHuXSbrAyZDAK6v0yeqhZVI0aMUhOo54FW9jWhaQZIpEIFEWhv7IC\n        YrG0hEe5tGhIxsQuj16MQ2L3Q+kJQUC5MOZfgsw+CdsggcgUgcbGRjyQ6NOlCssFHuXyfGScKXurQolY\n        hVKJBo+ketwVq1Etk/+Fx7oJNOhIFMpMeGxw5vMolyuve5jb3TLcH1CinIUrR02olMqgHvgH1yg0qNTZ\n        cUtG4onZdYlHueQ3CplmPQ1jIILZlXV4olEYpRwsaSVYqRJlKhrV4w7cGbXiKenJFpx7JWSKe+UoH9aj\n        jv0w6r48+OgOyLsIPGTHKJFbUKGdxrMJN+4padRR/mzBqdo25nRdB4gXApx5KQTBPpOwgcDV1h7kvRna\n        /zy4NqBBwbAJN2VsB5Z9QU7ObwjkSucBbV0TAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"showInExplorerMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABh0RVh0U29m\n        dHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAAk9JREFUOE+Vkm1P0mEYxd3c+hi8cmsrDTV1VJoaJlqE\n        TygmjYCEcGACKqAiOIKUJ0WRINNQJJ/LLB9mK0oFKmO6yGbrO/heN7cT0b9NhlL93t27zn12XTsn6X+Q\n        +YUdzUFRMvH8O/yF2mThEpvUsMohSd7ySE1r9WG5X+gmxolhT1Ywb89V74mXuLj3uh5y3130hQwwhbSI\n        mNgJ2fFUjVxLYY0zDizB+xj76oJ3ZxhTu27Mfvfg2Q9vxKQL8oDQRMjjKXPR3KoVKYa2B/Dky0N4dh5h\n        4tsIpndHMbM7BuOmBtJ1gZ6Qx0Lrzc+9Pkg9HNg0wRHqhWKlEZyZanCf16BrTQF9oA3iN1wbIf9NTls6\n        LmqycFlP2a9y0tH8qhG2TSMk8/WoHqVbbz4tP/VLx5tnhQWLdcPRT0fJbE1D5zsltO/bYNjQwBjUoWO1\n        BXRH0SohicKZZar4L1jxMZKlZ9Dua4Xap4RuXY1uvxaqZSlK+wtjDOomKjo4c8x4g1TJaZBlZ3FecW6/\n        1EyFeE6AnoAOfC87YnLFynAWR0+o8dwIR+JN3IMsJTmXos481G90RjcRTHJAtxeB4SqG7KUILcsSsKcq\n        E/cgW0V288bZ6A50wfxBD9unHgx+tsC1ZcPjbTsUy424NV15cg8ymlNTslXpB7IFcfQUy0dDNBVHyArn\n        Vh/kiw2o9ZYd34M/ZLakMSPx7lEf5IFmKQS9/yqa5kUQz95B+VBJbA9OIhJvck57BumSNpuUb6CQqKbc\n        cImtIL4H/0qB4YKqyJx3JMakpJ/GeCksDt4euAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <metadata name=\"imageList.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>130, 17</value>\n  </metadata>\n  <data name=\"imageList.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACG\n        OwAAAk1TRnQBSQFMAgEBBgEAAUgBAQFIAQEBGAEAARgBAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFg\n        AwABMAMAAQEBAAEgBgABSC4AAwEBAgMKAQ0DHAEoAykBPgMtAUUDJwE6AxUBHQMFAQcDAAEBKAADIwEz\n        AlEBTwGcAlQBUgGmA1MBqgNTAaoDUwGqA1MBqgNTAaoDUwGqA1MBqgNTAaoDUwGqA1MBqgNTAaoDUwGq\n        A1MBqgNTAaoDUwGqA0cBgQMfAS0DCwEP4AADBAEGAxsBJgFGAkUBfgNWAbMBWAJWAbsDTgGYAzIBUAMW\n        AR8DBAEGKAADMQFNAmIBWAHpAlwBPwH4AZUBhAEiAf8BmQGGASUB/wGbAYkBKQH/AZ4BjAErAf8BnwGN\n        ASwB/wGdAYsBJgH/AZ0BiQEiAf8BnQGJASEB/wGgAYwBJAH/AaQBkAEoAf8BqQGVAS0B/wGtAZsBMwH/\n        AbEBoAE5Af8BtgGkAT8B/wG2AaIBPAH/A1gBwQMsAUMDEQEX3wABAQMGAQgDSgGMA38B/gEeATgBUQH/\n        AQABCAEhAf8DWQHyA0gBhAMwAUwDFAEbAwQBBSQAAzEBTQJiAVgB6QFlAlwB+AGmAZcBQwH/AawBnQFK\n        Af8BsgGkAVMB/wG2AagBWAH/AbcBqgFaAf8BsAGhAUsB/wGrAZoBPwH/AagBlwE4Af8BqwGaATsB/wGv\n        AZ4BPwH/AbQBowFEAf8BuQGoAUoB/wG9Aa0BUAH/AcIBsgFWAf8BuwGpAUcB/wNYAcEDLAFDAxEBF+AA\n        AwoBDQNNAfoBuwHFAc8B/wEuAUkBhwH/AQABFwE2Af8BEgE0AVUB/wFaAlcBvQNEAXoDLQFGAxABFgMC\n        AQMgAAMxAU0CYgFYAekBaQFfAVwB+AG3AawBgwH/AcUBuwGZAf8BywHDAaMB/wHRAcgBqwH/AdMBywGv\n        Af8BvQGwAYQB/wGuAZ0BRQH/AacBlQE2Af8BqQGXATgB/wGsAZsBOwH/AbEBoAFAAf8BtgGlAUYB/wG6\n        AaoBTAH/Ab8BrwFTAf8BuQGnAUQB/wNYAcEDLAFDAxEBF+AAAyABLwFjAXEBfwH+AawBugHIAf8BAAEg\n        AT4B/wEAARoBPQH/AS0BgQGkAf8BSQFIAUkB9gNMAZMDQAFxAycBOwMNAREDAQECHAADMQFNAmIBWAHp\n        AWkBXwFcAfgBtgGqAYEB/wHCAbkBlQH/AckBwAGfAf8BzgHFAaYB/wHRAcgBqgH/AbsBrgGCAf8BrQGc\n        AUQB/wGmAZQBNQH/AagBlgE2Af8BqwGZATkB/wGvAZ0BPQH/AbQBogFDAf8BuAGoAUkB/wG9Aa0BUAH/\n        AbcBpQFCAf8DWAHBAywBQwMRARfgAAM1AVcBVAGKAZoB/wG3AcgB2AH/AQcBKgFMAf8BAAEjAU4B/wGB\n        Aa4B2wH/AVIBlQGvAf8BWQJWAb4BSQJIAYcDPAFmAyIBMgMKAQ4DAQECGAADMQFNAmIBWAHpAWMCXAH4\n        AaEBkgE8Af8BpQGXAUEB/wGqAZwBRwH/Aa0BnwFLAf8BsAGiAU4B/wGrAZwBQwH/AagBlwE7Af8BpQGU\n        ATQB/wGnAZUBNQH/AaoBmAE4Af8BrgGcATwB/wGzAaEBQQH/AbcBpgFHAf8BvAGrAU4B/wG2AaMBQAH/\n        A1gBwQMsAUMDEQEX4AADRwGCAa8BuwHHAf8BpAG5Ac0B/wEAASEBRAH/AQABLAGBAf8BkwHHAfMB/wGR\n        AbABzAH/AWICWAHvAUkCSAGIA0UBfQM3AVoDGwEmAwUBBxgAAzEBTQNiAekBaQFdAVwB+AGkAZcBQwH/\n        AaYBmAFDAf8BqQGbAUYB/wGrAZwBSAH/Aa0BngFJAf8BqgGaAUEB/wGpAZkBPgH/AasBmwFAAf8BrAGb\n        AUAB/wGuAZ0BQgH/AbMBogFHAf8BtQGlAUgB/wG4AakBTAH/Ab0BrQFRAf8BtQGkAT8B/wNaAcADKwFC\n        AxABFuAAAVECTwGlAdAB2QHgAf8BjwGmAbwB/wEAARsBPQH/AQIBMwGGAf8BpgHjAv8BsQHTAfEB/wGU\n        AasBvwH/AVUCUwGtAUYCRQF+AUACPwFvASwCKwFDAw0BEgMAAQEUAAMxAU0DYgHpAW4BaQFcAfgBtQGq\n        AYEB/wG2AaoBgQH/AbQBpwFZAf8BtAGnAVgB/wG2AakBWwH/AbIBpAFSAf8BswGlAVIB/wG5AasBWwH/\n        AbgBqgFXAf8BugGrAVkB/wG/AbIBhAH/AbwBrgFZAf8BvAGtAVQB/wG9Aa4BVAH/AbMBowE/Af8CWgFY\n        AcADKgFBAxABFt8AAQEBXgJaAdUB6QHvAfUB/wGAAZUBrQH/AQABGAE7Af8BGgFRAakB/wHGA/8BtwHe\n        AfgB/wGzAcoB3gH/AWQCXAHnA0QBegNAAXEDMwFTAxUBHQMDAQQUAAMxAU0DYgHpAXIBcAFnAfgB0gHL\n        AbIB/wHVAc4BtwH/AcsBwgGkAf8ByAG/AZ8B/wHNAcQBpgH/AcUBuwGXAf8BxgG7AZcB/wHPAcYBpwH/\n        AcsBwQGeAf8BzQHCAaAB/wHUAcsBrQH/AckBvQGUAf8BwQGzAYIB/wG9Aa4BVQH/An8BYAH+AlkBVwG/\n        AyoBQAMQARbcAAMHAQoCQAGAAf0B+wP/AYEBmwG1Af8BCwE2AYMB/wEzAZQBygH/AeMD/wGuAdQB6QH/\n        AaQBwQHaAf8BlQGrAb4B/wNOAZgDPQFpAzUBVwMcASgDBQEHFAADMQFNA2IB6QFyAXEBaQH4AdIBzAGz\n        Af8B1AHNAbYB/wHIAb8BoQH/Ab8BtAGQAf8BuQGtAYMB/wG7Aa8BhgH/Ab0BsQGIAf8BwAGzAYoB/wHC\n        AbUBjAH/AcQBtwGPAf8BxwG7AZQB/wHFAbgBjQH/AcIBtAGEAf8BvgGuAVcB/wGyAZ8BPQH/AloBWAHA\n        AyoBQQMQARbcAAMjATQBUgGQAacB/wHVAegB+gH/ASEBQwGHAf8BAAEOAS0B/wE8AZ0BzgH/Ad0D/wHQ\n        AfUC/wGNAbAB0QH/AaUBvAHRAf8DVAGrAzkBXwE1AjQBVQMhATADCQEMAwABARAAAzEBTQNiAekBcgFw\n        AWcB+AHRAcoBsgH/AdMBzQG2Af8ByQHCAaUB/wG/AbUBkQH/AbQBqAFaAf8BtwGqAV0B/wG5AawBgQH/\n        AboBrQGBAf8BvAGuAYEB/wG8Aa8BgQH/Ab0BsAGCAf8BwQG0AYcB/wHBAbMBhAH/Ab0BrQFXAf8BsQGe\n        AToB/wJaAVgBwAMqAUEDEAEW3AABPgI9AWoBmQGzAckB/wHfAfMB/QH/AT4BhgGlAf8BCQEzAYEB/wFP\n        AbMB2wH/AZMBxAHiAf8BlwHJAfAB/wHDAeMC/wGyAc0B5gH/A1QBrgMzAVIDMQFOAyQBNQMNAREDAQEC\n        EAADMQFNA2IB6QFxAW8BYwH4Ac4BxwGtAf8B1AHOAbcB/wHQAckBsAH/AckBwQGjAf8BvgG0AY8B/wG5\n        Aa0BhAH/AbkBrQGCAf8BvwGzAYoB/wG5AawBWwH/AbcBqQFWAf8BuAGqAVcB/wG9AbABggH/Ab4BsAGB\n        Af8BuwGrAVQB/wGuAZwBNwH/AloBWAHAAyoBQQMQARbcAAFJAkgBiAGzAcsB2QH/AeIB8gL/AS0BUwGd\n        Af8BAAEOATIB/wFMAa4BywH/AbYB4QHyAf8BNQGPAcIB/wGzAdcB9wH/AcIB4AHyAf8BUQJPAaUDLQFG\n        Ay0BRQMkATYDEQEXAwMBBBAAAzEBTQNiAekBcgFxAWkB+AHVAc8BugH/AdwB1wHEAf8B1wHSAb0B/wHU\n        Ac4BtwH/AdEBywGyAf8BzgHGAasB/wHIAb8BnwH/AcABtAGNAf8BvgGxAYcB/wG+AbABhQH/Ab8BsQGF\n        Af8BwgG1AYoB/wG+AbABgAH/AbMBogFFAf8CfwFUAf4CWQFXAb8DKgFAAxABFdwAAVkCVgG+AfwD/wHS\n        AeIB8AH/AR8BRAGLAf8BAAEkAU0B/wGdAdIB7QH/ATMBjwG+Af8BrgHcAe0B/wEvAYMBrgH/AakByQHl\n        Af8DVAGrAycBOgMnAToDIgEyAxQBGwMFAQcDAAEBDAADMQFNA2IB6QFzAXEBawH4AdkB1AHAAf8B4gHd\n        Ac4B/wHfAdoBygH/Ad4B2gHIAf8B3wHaAcoB/wHbAdUBwgH/AdQBzQG1Af8BywHCAaIB/wHJAb8BnQH/\n        AcgBvQGZAf8ByAG8AZYB/wHFAbkBjwH/Ab0BrwFcAf8BsQGfAUIB/wJ/AVIB/gJZAVcBvwMpAT8DEAEV\n        2AADAQECAVwCVQHqBP8B0wHjAfIB/wEbAT0BgwH/AQIBLQFUAf8BswHZAfEB/wEpAYoBwQH/AY4BvgHj\n        Af8BkwHCAecB/wFSAZwBvgH/AVECUAGfAyABLgMgAS4DHgErAxQBHAMHAQkDAAEBDAADMQFNA2IB6QFz\n        AXEBawH4AdoB1QHBAf8B5gHiAdUB/wHnAeMB1gH/AecB5AHXAf8B5wHjAdcB/wHfAdoBygH/Ad0B2AHG\n        Af8B4AHbAcoB/wHbAdQBvwH/AdYBzwG1Af8B0wHKAawB/wHGAboBkQH/AbsBrQFaAf8BtAGkAUoB/wJ/\n        AVEB/gJZAVcBvwMpAT8DEAEV2AADBAEFAUABggGdAf8BzgHdAesB/wGhAcsB6QH/ATcBgQGlAf8BGAFD\n        AZAB/wGgAckB3gH/AeUB9AL/ATIBjgHAAf8BjQG6AeMB/wGXAbsB3AH/AVQCUwGsAxkBIwMZASMDGAEh\n        AxIBGQMHAQoDAQECDAADMQFNA2IB6QFzAXIBbQH4AdYB0AG7Af8B2AHTAb4B/wHYAdIBvgH/AdgB0gG9\n        Af8B1wHRAbwB/wHUAc0BtwH/AdMBzQG2Af8B1QHOAbgB/wHUAc0BtQH/AdAByQGuAf8BywHCAaMB/wG/\n        AbMBiAH/AbUBpwFRAf8BrwGfAUMB/wJ/AU4B/gJZAVcBvwMpAT8DEAEVywABAQwAAwsBDwFJAUgBSQH2\n        AdkB7gH8Cf8B6gHxAfYB/wFJAZcBvAH/Ae0D/wHDAesB+wH/ATkBjwG+Af8BmwG+Ad8B/wFSAlABpAMR\n        ARcDEAEWAw8BFAMNAREDBwEJAwEBAgwAAzEBTQNiAekBdAFzAW8B+AHXAdIBvgH/AdQBzgG4Af8B0QHL\n        AbQB/wHPAcgBrwH/Ac4BxwGtAf8BzQHGAawB/wHNAcUBqwH/Ac0BxgGsAf8BzgHHAa0B/wHMAcUBqQH/\n        AcgBvwGhAf8BwAG1AY4B/wG4AawBWgH/AbMBpAFNAf8CfwFUAf4CWQFXAb8DKQE/AxABFcgAAwEBAg8A\n        AQEDQAFxAWMCfwH+AeYB+gr/AfwD/wGQAbIBzwH/AeUB9wL/AagBzgHuAf8BTwGZAb0B/wFVAlMBsAMI\n        AQsDBgEIAwQBBgMEAQUDAwEEAwABAQwAAzEBTQNiAekCdAFxAfgB3gHaAckB/wHbAdUBwgH/AdQBzQG3\n        Af8BzgHHAa4B/wHLAcQBqAH/AcoBwwGnAf8BygHCAaYB/wHKAcIBpgH/AcoBwgGmAf8BygHCAaYB/wHK\n        AcIBpgH/AckBwAGjAf8BxQG7AZkB/wG+AbMBigH/An8BYwH+AlkBVwG/AykBPwMQARXfAAEBA0IBdQJA\n        AZoB/QHqAfsC/wH9B/8B7QH4Av8BmAHKAfQB/wG+AdoB8wH/AZQBswHQAf8BVwJVAbcDAgEDAwEBAgMA\n        AQEDAAEBAwABARAAAzEBTQNiAekCdQFzAfgB5QHhAdMB/wHgAdsBywH/AdwB1gHEAf8B2QHUAcAB/wHY\n        AdMBvwH/AdUBzwG4Af8B0AHJAbAB/wHKAcIBpgH/AcoBwgGmAf8BygHCAaYB/wHKAcIBpgH/AcoBwQGl\n        Af8ByAHAAaIB/wHGAb0BnQH/AqgBhAH9A1gBuwMmATkDDgET5AADPgFrA38B/gHrAfgB/gH/Af0H/wHa\n        AeUB7wH/AZEBwwHqAf8BlAG6AdEB/wFXAlYBuCQAAzEBTQNiAekCdgF1AfgB6wHoAd0B/wHmAeIB1QH/\n        AeMB3gHQAf8B4AHbAcsB/wHdAdkBxwH/AdsB1gHCAf8B1gHQAboB/wHPAcgBrwH/AcwBxQGqAf8BywHD\n        AacB/wHKAcMBpwH/AcoBwwGnAf8ByAHAAaQB/wGAAn8B/gNcAd8DTwGXAxoBJQMJAQzoAAM7AWMBUQGS\n        AawB/wHaAesB+AH/AfkB/Qb/AdQB3gHnAf8BlAHOAeIB/wFcAlkBySQAAzEBTQNiAekCdwF2AfgB8QHv\n        AegB/wHtAeoB4QH/AekB5QHaAf8B4wHeAdAB/wHaAdUBwgH/Ad0B2AHFAf8B3QHXAcUB/wHaAdQBwAH/\n        AdEBygGxAf8BzAHFAaoB/wHLAcQBqQH/AcsBxAGpAf8BgAJ/Af4BfwF5AV8B+wNSAacDMwFTAwEBAgMA\n        AQHrAAEBA0EBcgJAAZMB/QHIAdcB5QH/AfQB+AH7Af8BZAJZAewDWQH1AVwCWQHJAwABASAAAzEBTQNi\n        AekDdQH4Ad8B3QHXAf8B2gHWAcwB/wHTAc4BvwH/AcwBxgGzAf8BxAG+AaUB/wHCAbsBoAH/AcEBuAGc\n        Af8BwAG3AZsB/wG9AbQBlgH/AbsBsgGTAf8BuwGyAZMB/wN/Af4DYQHhA1QBpgM0AVQDFAEcAwABAfQA\n        AzsBYwFlAlIB9AM3AVoDBAEFAwMBBAMtAUYkAAMvAUkDYQHcA2UB5QNfAegDZQHlA2EB5ANfAeMDYQHi\n        A2EB4gNhAeIDYQHiA2EB4gNhAeIDYQHiA10B0gNSAaMDMwFTAxUBHQMAAQH8AAMrAUIDAgEDAwABAQMA\n        AQEDAAEBJAADKgFAA1gBwQNZAb8DVwG6A1YBsQNUAa4DVgGrA1MBqgNSAakDUgGpA1IBqQNSAakDUgGp\n        A1MBqANGAX4DLQFGAwEBAgMAAQH/AEgAAQEDAAQBBAIEAwQEAQUDBAEGAwQBBgMEAQUDAwEEAwIBAwMB\n        AQIDAAEBAwABAR8AAQEXAAEBGwABATAAAwIBAwMOARMDAQECtAADAgEDAwYBCAMLAQ8DEgEZAxgBIgMc\n        ASgDHgErAx8BLQMfAS0DHgErAxwBKAMYASIDEwEaAwsBDwMGAQgDAgEDFwABAQMEAQUDBwEJAwwBEAMS\n        ARgDEQEXAwsBDwMEAQYDAQECEAADAQECAwQBBgMKAQ4DEQEXAxIBGAMNAREDBwEJAwQBBQMAAQEUAAMf\n        AS0DUAGaA0IBdgMgAS8DBAEFVwABARMAAQFAAAMGAQgDEAEWAyABLwM0AVQDQgF1AUgCSQGIAUwCTQGT\n        Ak4BTwGYAk4BTwGYAUwCTQGTAUgCSQGIA0IBdQE1AjYBWAMhATADEQEXAwcBCRQAAwMBBAMKAQ0DFQEd\n        AycBOwM4AV4DOAFcAyMBMwMLAQ8DAwEEAwABAQsAAQEDAgEDAwoBDgMhATADNwFbAzkBXwMpAT4DFQEd\n        AwoBDQMDAQQQAAMEAQYDRAF6AWECSAH2AWoCRwH5AV0CWQHXAVcCVQG3AUYCRQF/Ay4BSAMNARFEAAMD\n        AQQDCQEMAxQBGwMgAS8DHwEtAw8BFAMEAQUDAAEBNwABAQMFAQcDEgEYAyMBNAM4AV4BTQJOAZYBUwFe\n        AWUBxwFJAW0BjAHjATYBgAG6AfMBIQGMAdoB+wEhAYwB2gH7ATEBfQG9AfQBSQFrAY0B5AFVAWABZwHI\n        AU8BUAFRAZsBOQI6AWADJAE2AxMBGgMFAQcDAAEBDAADBgEIAxQBHAMnATsCPgE/AWwCUAFTAaQCUQFS\n        AaEDOgFhAxwBJwMNAREDBgEIAwEBAgMBAQIDBgEIAwwBEAMbASYDNwFbAlABUQGfAlIBVQGmA0ABcQMo\n        ATwDFQEdAwcBCRAAAyYBOQFbAlgBxgFcAT8BPgH4A00B+gFhAlQB7gFfAkwB8wNNAfoBXwFdAVkB+wNN\n        AfoBXgJbAdADUAGdAz0BaQMnAToDHQEpAxIBGAMCAQMoAAMIAQsDGAEiAzIBUQJPAU4BmAJNAUwBkQMo\n        ATwDCQEMAwQBBTAAAwIBAwMHAQkDEwEaAyoBQANCAXUBUQJSAaEBVAFfAWkByQE9AXUBpgHtARkBkgH3\n        Af8BGwGdAv8BHAGiAv8BHAGiAv8BGwGdAv8BGQGTAfgB/wE8AXcBpQHuAVQBYAFsAc0BUAFSAVMBowND\n        AXgDLAFEAxMBGgMHAQkDAwEECAADCgEOAygBPANAAXADUAGdAVUBUwFmAcYBVgFVAWMBwwNOAZQDOgFh\n        AyUBNwMRARcDBQEHAwUBBwMQARUDJAE1AzkBXwJLAUwBjwJUAWEBwgJTAWUBxwJRAVIBoQNAAXEDKQE+\n        Aw0BEQwAAwMBBAFNAkwBkQFbAlkB0gNNAfoBbQJRAfcBYAJZAesBYgJYAe8DXQHtA10B7QFiAlgB7wFf\n        AkwB8wFtAVIBUQH3Al8BXQH7AWcCWQHyAVwCWAHRA1QBrwFHAkYBgQM4AV0DKQE+AxUBHQMaASUDBAEF\n        EAADAgEDAxYBHwM0AVQCTQFMAZMBgAF2AUsB2wFzAWsBTgHTA0QBewMoAT0DEwEaAwQBBQMAAQEoAAMG\n        AQgDEAEWAyMBNANBAXIBVQFcAWIBwAFEAXQBmgHoATcBfwG5AfIBIgGRAeYB/QEZAZYB/QH/ARoBmgL/\n        ARsBnAL/ARsBnQL/ARoBmgL/ARkBlgH9Af8BIgGRAeYB/QE2AYEBvAHzAUQBdAGbAegBVgFdAWUBwwND\n        AXcDJAE2AxABFgMGAQgIAAMPARQDOAFdAlABUwGkAlUBZAHFAVQBUQF0AdQCVAFyAdQCVAFkAcQCTwFU\n        AaUDPQFpAyABLgMOARMDDgETAx0BKgM8AWYCUAFTAaMCVAFhAcIBUwFSAW8B0wFUAVEBdAHUAlMBZQHH\n        AlIBVQGmAjkBOgFgAxIBGAwAAyoBQAFWAlUBsQFdAlsB0AFRAUsBRQH+AWUCUgH0AV0CTgHwAWIBXgFI\n        AfYBZQJSAfQBZQJSAfQCWQFCAfUCWQFCAfUCWQFCAfUCbQFRAfcCagFXAfkCagFaAfkBXAJNAfoCagFm\n        AfkBZAJZAewBYAJaAd4BXgJcAc4BXAJZAckDIAEuDAADAwEEAwcBCgMpAT8CUgFQAaIBhgF+AUYB4AHE\n        AakBGQH2AboBoQElAfMBcwFrAU4B0wJPAU4BlwMqAUEDDAEQAwQBBicAAQEDCgEOAyABLwM4AV4CUQFT\n        AaABQwF3AaIB6wEaAZsC/wEZAZgC/wEiAYIB2wH8ATkBeQGtAfABSQFvAY8B5AFOAWgBgwHeAU4BaAGD\n        Ad4BSQFtAY0B4wE7AXYBrQHvASIBggHbAfwBGQGXAf4B/wEaAZsC/wE9AXkBpQHuAVIBVAFVAaYBOQI6\n        AWADIQEwAwwBEAMAAQEEAAMOARMCNQE2AVgDUAGdAlUBYAG/AVMBUgFxAdMBUQFNAX0B3AFPAU0BfgHd\n        AlQBawHLAkwBTQGTAzYBWQMpAT8DKQE/AjQBNQFVAkwBTQGRAVYBVAFpAcoBUQFNAX0B3AFPAU0BfgHd\n        AVMBUgFxAdMCVAFhAcICUAFRAZ8DNwFbAxEBFwsAAQEDJQE3A1ABngFYAlYBwQI2AS4B/wFkAlMB8QFk\n        AlMB8QFcAk0B+gNfAfsBXAFOAU0B+gJqAWEB+QFkAVIBTQH6AWoBYgEvAfwCqAFAAf0CqAFAAf0BagFh\n        ASsB/AFkAVEBTQH6AmoBRwH5A1wB+AFiAVABTQH6AWABUAFNAfoBWwJZAcQDGAEiDAADDQESAyMBNANC\n        AnYBcAFNAdUB+QHQAQAB/wH8AdQBAAH/AfoB0QEAAf8B8wHKAQAB/wF1AW4BTwHUAkcBRgGAAiwBKwFD\n        AxUBHQMFAQcDAQECHAADAQECAxABFgM0AVQCTgFPAZgBVAFgAWsBzQEwAYcBygH3ARkBlwH+Af8BHQGH\n        AeoB/gFCAXEBmQHqAVQBWwFgAb4CTAFNAZIBRQJGAX8BRQJGAX8BSwJMAZABUwFYAV4BvAFEAXEBlwHo\n        ASIBkAHkAf0BGQGXAf4B/wEoAYABzwH4AVMBYgFwAdABTwFQAVEBmwM1AVcDEwEaAwEBAgMAAQEDCQEM\n        AyABLgM3AVoDSgGLAlUBYgHAAVEBTQF9AdwCTAGDAeACUgF2AdYCVAFdAbkDTgGZA0oBiwNKAYsCTgFP\n        AZcCVAFdAbgBVAFRAXQB1QJMAYMB4AFPAU0BfgHdAlQBYQHCAksBTAGQAzgBXAMhATADCgEOAwABAQQA\n        Aw0BEgFAAj8BbgFFAkQBfAFbAlkBwwJIAT0B/wNdAe0BZwJZAfIBXAFOAU0B+gNfAfsBaQFiAVgB/AKo\n        AZ0B/QN/Af4DfwH+A38B/gKoAYYB/QFkAVIBTQH6AWQBUgFNAfoCXwFXAfsBaQFhASsB/AJqAUcB+QJi\n        AUkB9gFSAlEBoQMMARADAAEBCAADHQEqA0cBggFlAWMBUwHFAawBlwEsAe8B+wHSAQAB/wH6AdIBAAH/\n        AfkB0QEAAf8B+AHPAQAB/wG6AaEBJQHzAXgBcAFMAdcCUQFPAZ4DLgFHAxABFQMFAQccAAMCAQMDFQEd\n        A0EBcgFVAV0BZQHFAUIBdwGhAewBIgGCAdwB/AEhAYIB3AH8AUMBdwGhAesBVAFfAWkByQJKAUsBjAMy\n        AVADJAE2AyQBNQEwAjEBTQFJAkoBiQFTAV4BZQHHAUQBcQGXAegBIQGCAdoB/AEiAYIB3QH8ATwBdwGl\n        Ae4BVQFgAWcByANCAXYDGAEiAwIBAwMAAQEDBAEGAwoBDQMaASQDNgFZAlEBUwGgAVYBVAFpAckCUgF2\n        AdYBUQFQAXYB2AFUAVMBbwHRAlUBZwHIAlQBZAHEAlQBZAHEAlMBZQHHAlIBcAHSAVEBUAF2AdgCUgF2\n        AdYBVgFUAWkBygJQAVMBowM5AV8DGwEmAwoBDgMEAQYDAAEBAwMBBAMpAT4DPwFtAT0CPAFnAVwCWQHP\n        AlQBSAH/AWQCXAHnAWUCUgH0AWACXwH7A6gB/QN/Af4DfwH+AqgBogH9A38B/gN/Af4BbAFlAU0B/AFs\n        AWQBPwH8AqgBkQH9AqgBiwH9A1wB+AJlAVIB9AFiAlgB7wE/Aj4BbAMAAQEDAAEBAwcBCgMWAR8DNwFa\n        AV4BXAFUAbsBsgGcASkB8QHmAb8BBQH9AfoB0QEAAf8B6wHDAQAB/gHrAcMBAAH+AfsB0QEAAf8B+wHS\n        AQAB/wH3Ac8BAAH/AXkBcgFJAdkCSQFIAYcDLwFJAxcBIAMHAQkDAQECFAADAwEEAxgBIgNIAYQBTQFt\n        AYkB4QEkAYYB1gH6ARkBlgH5Af8BOAF+AbYB8QFUAVsBYgHBAkoBSwGMAzUBVgMdASkDDwEUAw8BFAMc\n        AScDNAFUAUkCSgGJAVQBWgFgAb0BOwF2Aa0B7wEZAZUB+gH/ASQBhwHYAfoBSQFrAY0B5AFJAkoBiQMc\n        ASgDAwEEAwAEAQQCAQMDCwEPAyIBMgM7AWQCSwFMAY8CVAFbAbYBVAFTAW8B0QFRAVABdgHYAVABTwF0\n        AdcBUQFQAXYB2AFRAVABdgHYAVABTwF0AdcBUgFNAXUB2QFUAVMBbwHRAlQBXQG4AkwBTQGRAjwBPQFn\n        AyQBNgMMARADAgEDAwEBAgMAAQEDCwEPAy8BSQMsAUQDNwFaAV0CWAHjAVMBPAEtAfwBXwJXAegDXAH4\n        AqgBnAH9AYICfwH+AYQCfwH+A38B/gKoAZ8B/QN/Af4DfwH+AWICXwH7AWYBUgFNAfoCagFbAfkCYgFa\n        AfYCZQFSAfQBYQJUAe4BXgJYAd0DJwE7CAADFgEeAzoBYQJSAVABogGJAX4BRAHhAeIBwgEFAfwB+wHS\n        AQAB/wH2Ac4BAAH/AcsBsQEXAfgB0wGvAQ8B+gH7AdIBAAL/AdYBAAH/AfoB0gEAAf8BvwGkARsB9QF/\n        AXcBSAHcAVQBUwFPAaUDMQFOAxMBGgMFAQcUAAMEAQUDGwEmAUsCTAGPATgBfgG2AfEBIAGUAfMB/gEf\n        AZIB9QH+AUsBcwGTAeUBTQJOAZYDMQFPAxwBKAMNARIDBAEGAwQBBQMNAREDHAEnATACMQFNAUsCTAGQ\n        AUoBbQGLAeIBHwGRAfUB/gEgAZUB8wH+ATEBfQG9AfQDTgGUAx8BLAMEAQUMAAMEAQYDDwEUAx0BKgMz\n        AVMCTAFNAZMBVQFTAWYBxgJSAXIB1gFSAU0BdQHZAVEBTQF9AdwBUQFNAX0B3AFSAU0BdQHZAVABTwF0\n        AdcCUwFlAccCTgFPAZcDNQFWAx4BKwMQARUDBQEHDwABAQMEAQYDBAEFAykBPgFiAkgB9gNcAfgBZAJZ\n        AewBZwFUAU0B+gKoAZ4B/QKoAaUB/QKoAaIB/QKoAaIB/QKoAaIB/QKoAZIB/QKoAZ4B/QNcAfgBZgFS\n        AU0B+gJiAUkB9gJlAVIB9AFnAlkB8gFhAlQB7gFbAlgBywMSARgIAAMcASgCSAFHAYMBZwFkAVQByAHL\n        Aa8BGgH3Af8B2gEAAf8B+wHRAQAB/wGnAZMBMQHtAWcBZAFUAcgBZAFhAVQBxAGGAX4BRgHgAbkBoAEm\n        AfIB7gHGAQAB/gH9AdUBAAH/AfwB0wEAAf8BggF5AUMB3wJMAUsBjwMyAVADGQEjAwcBCQMBAQIMAAME\n        AQYDHAEoA04BlAElAYsB1QH5ARwBogL/ARsBnQL/AU0BbQGJAeEDSAGGAyUBNwMQARUDBAEGCAADBAEF\n        Aw8BFAMkATUBRQJGAX8BTgFoAYMB3gEbAZwC/wEcAaMC/wEiAYIB3AH8Ak4BUAGZAyABLgMEAQYPAAEB\n        AwQBBgMOARMDKAE8A0gBhgFWAVUBYwHDAVABTwF0AdcBUQFNAX0B3AFNAUkBgwHhAU0BSQGDAeEBUQFN\n        AX0B3AFRAVABdgHYAlQBZAHEA0oBiwMpAT8DDwEUAwUBBwMBAQIYAAMvAUoBRgFFAT0B/wFtAWQBUgH3\n        AmUBUgH0AWoCXwH7AqgBowH9AXABawFaAfwBcAFqAVoB/AFvAWkBWgH8AWoCXwH7AWcCXwH7AWcCXwH7\n        AmUBUgH0A1wB+ANqAfkDXAH4AWQBVQFTAfEBZwJZAfIDVgGzAwABAQgAAx0BKQNIAYYBawFoAVABzQHq\n        AcMBAAH+Af8B3AEAAf8B9AHLAQAB/wFqAWcBUwHKAkABPwFvAzgBXgJPAU4BmAFrAWQBUgHLAdIBswEU\n        AfkB/wHbAQAB/wH9AdQBAAH/AcsBrwEaAfcBjAGBAUEB4wFYAVYBUgGsAzQBVAMWAR4DBwEKDAADBAEG\n        AxwBKANOAZQBJQGLAdUB+QEcAaIC/wEbAZ0C/wFNAW0BiQHhA0gBhgMmATgDEAEVAwQBBggAAwQBBQMP\n        ARQDJAE2AUYCRwGAAU4BaAGDAd4BGwGcAv8BHAGjAv8BIgGCAdwB/AJOAVABmQMgAS4DBAEGDwABAQMF\n        AQcDDgETAygBPANIAYYBVgFVAWMBwwFQAU8BdAHXAVEBTQF9AdwBTQFJAYMB4QFNAUkBgwHhAVEBTQF9\n        AdwBUQFQAXYB2AJUAWQBxAJKAUsBjAMpAT8DDwEUAwUBBwMBAQIYAAMhATABYAJaAd4DXAH4AWcBVgFN\n        AfoBcAFrAVYB/AGGAn8B/gGDAn8B/gGFAn8B/gGCAn8B/gOoAf0BbwFpAVwB/AFmAVQBTQH6AV0CTgHw\n        AWQBVQFTAfEBYQJUAe4BYgJYAe8DXQHtAWoBYQFXAfkDPgFrDAADFwEgAzsBZQJSAVEBoQFzAWsBTgHT\n        AYcBewFDAd8BbAFoAVABzQJNAUwBkwMkATUDFwEgAzUBVgJNAUwBkQFxAWwBTgHSAa8BnAEpAfAB7wHG\n        AQAB/gH/AdUBAAL/AdYBAAH/AY4BgQE+AeQCTgFNAZUDNQFXAxwBJwMJAQwDAgEDBAADBAEFAxsBJgJL\n        AUwBjgE5AXoBrgHwASUBnQHvAf0BHwGRAfQB/gFIAXIBlAHmAk4BTwGYAzMBUgMeASsDDgETAwQBBgME\n        AQYDDQESAx0BKQMyAVACTAFNAZMBSQFtAY0B4wEfAZEB9QH+ASUBngHvAf0BNgGAAboB8wFMAk0BkwMf\n        ASwDBAEFDAADBQEHAxABFQMfAS0DNQFWAk0BTgGVAlMBZQHHAVABTwF0AdcBUgFNAXUB2QFRAU0BfQHc\n        AVEBTQF9AdwBUgFNAXUB2QFQAU8BdAHXAlMBZQHHA04BmQM2AVkDIAEuAxEBFwMGAQgYAAMbASYBWwJY\n        AcsDXAH4AWcBXwFbAfsBcAFrAVYB/AKoAacB/QN/Af4DfwH+A6gB/QOoAf0DqAH9Am0BYwH3A1kB9QJt\n        AWIB9wJiAVgB9gFlAWIBUgH0AWECVAHuA1wB+AMjATMIAAMBAQIDCAELAxcBIAMsAUQDQwF3AkgBRwGD\n        Aj4BPQFqAy0BRgMTARoDCAELAxMBGgMsAUQDSgGKAWQBYQFUAcQB0AGzARcB+AH/AdwBAAH/Af4B1QEA\n        Af8B0wGzARQB+QGPAYEBPgHkAVoBVwFTAbEDOAFcAxoBJAMKAQ0DAAEBAwMBBAMYASIBRwJIAYMBTAFs\n        AYcB4AElAYwB1QH5ARkBlgH5Af8BOAF+AbYB8QFWAV0BYwHDAksBTAGOATUCNgFYAx0BKgMQARUDDwEU\n        AxwBKAM1AVYCSgFLAYwBVQFbAWABvwE5AXkBrQHwARkBlQH6Af8BIwGGAdcB+gFJAW0BjAHjAUgCSQGI\n        AxwBKAMDAQQDAAQBBAIBAwMLAQ8DIwEzAjwBPQFnAkwBTQGSAlUBXQG3AVQBUwFvAdEBUQFQAXYB2AFQ\n        AU8BdAHXAVABTwF0AdcBUAFPAXQB1wJSAXIB1gFSAU0BdQHZAlIBcAHSAlQBXQG5A04BlAM9AWkDJQE3\n        Aw0BEQMCAQMDAQECAwABAQwAAyQBNQFiAlgB6QJtAVIB9wFnAV8BWwH7AqgBnwH9A6gB/QGAAn8B/gOo\n        Af0DqAH9A6gB/QFvAWkBXgH8AWcCWQHyAWQBVQFTAfEBZAFVAVMB8QFnAlkB8gFlAWIBUgH0AWcCWQHy\n        AWACWwHWAwIBAwgAAwEBAggAAwwBEAMkATUDKQE+Ax0BKgMSARgDBwEJCAADEAEWAzABSwJKAUkBiQFu\n        AWoBUgHOAa4BmQEuAe4B6gHBAQUB/QH/AdUBAAL/AdkBAAH/AZgBiQE5AegDTgGZAzQBVAMUARsDAAEB\n        AwIBAwMVAR0DQAFxAVQBXgFkAcQBQwF3AaEB6wEiAYIB2wH8ASEBggHcAfwBQgF2AaAB7AFUAWABagHK\n        AksBTAGOAzMBUgMmATgDJQE3AzEBTwNKAYsBVQFgAWcByAFCAXEBmQHqASEBggHbAfwBIgGCAdwB/AE9\n        AXUBpgHtAVMBXgFlAccDQgF1AxgBIgMCAQMDAAEBAwQBBgMKAQ4DGgElAzcBWwJQAVIBogFWAVQBaQHK\n        AlIBdgHWAVEBUAF2AdgBVAFTAW8B0QJTAWUBxwJUAWEBwgJUAWEBwgFVAVMBZgHGAVQBUwFvAdEBUQFQ\n        AXYB2AJSAXYB1gJUAWsBywJPAVQBpQM6AWEDHAEnAwsBDwMEAQYDAAEBDAADLAFEAYECQAH9AlkBSQH1\n        AWcBVAFNAfoBbwFoAVkB/AKoAacB/QKoAaYB/QFvAWoBXgH8AWcCXwH7AW8BaQFfAfwBYgJfAfsBXQJO\n        AfABZwJZAfIBZAFUAVMB8QFnAlkB8gJlAVIB9ANfAfsDTgGYGAADAwEEAwsBDwMNARIDCgENAwUBBwMB\n        AQIIAAMFAQcDEQEXAyoBQAJHAUYBgQFgAV8BVAG9AcABpAEbAfUB/wHcAQAC/wHZAQAB/wHWAbMBDwH6\n        AYMBeAFEAd4BUQFQAU8BmgMgAS8EAAMBAQIDEAEWAzIBUQNOAZQBVAFgAWoBygEwAYcByQH3ARkBmAL/\n        ARgBkQH1Af8BQgF2AaAB7AFWAV0BYwHDA04BmQFIAkkBhwNIAYYBTgJPAZcBVQFcAWIBwAFCAXIBmQHq\n        AR0BhwHqAf4BGQGYAv8BKAGAAc8B+AFVAWIBbgHOAU0CTgGWAzQBVAMSARkDAQECAwABAQMKAQ0DIgEy\n        AzkBXwJLAUwBjwJUAWEBwgFPAU0BfgHdAk0BhwHhAlIBdgHWAlQBWwG2Ak0BTgGVA0gBhgNIAYYCTAFN\n        AZICUwFbAbUBVAFRAXQB1QJMAYMB4AFPAU0BfgHdAlQBZAHEA04BlAM6AWEDIwE0AwsBDwMAAQEMAAM7\n        AWQDXwH7AWUBYgFSAfQDXAH4AWsBZAFXAfwBagFjAVcB/AFgAl8B+wFgAl8B+wFgAl8B+wFgAl8B+wNq\n        AfkBZAFUAVMB8QJtAWMB9wNcAfgBYgJfAfsDXAH4A18B+wM6AWFAAAMPARQDLAFEAkcBRgGBAWkBZgFT\n        AckBpAGVATcB6wHSAbYBFwH4AbUBoAEmAfIBdgFuAU8B1AJNAUwBkQMfAS0HAAEBAwoBDgMfAS0DOAFc\n        AU8BUAFRAZ4BQgFyAZoB6gEaAZsC/wEZAZgC/wEiAYIB3AH8ATgBfgG2AfEBSAFyAZQB5gFNAW0BiQHh\n        AU0BbQGJAeEBSwFzAZMB5QE5AXkBrQHwASIBggHcAfwBGQGXAf4B/wEaAZsC/wE9AXcBpwHtAVABUgFT\n        AaQDOAFeAyABLwMLAQ8DAAEBBAADDgETAzYBWQJQAVEBnwJUAWIBwQFTAVIBcQHTAVEBTQF9AdwBUQFN\n        AX0B3AFWAVQBaQHKAkwBTQGSAzUBVgMoATwDKAE8AzMBUwJLAUwBjwFWAVQBaQHJAVEBTQF9AdwBUQFN\n        AX0B3AFTAVIBcQHTAVYBVQFjAcMCUQFSAaEDOAFcAxIBGBAAA0wBkgNcAfgBZQFiAVIB9AJtAVIB9wOo\n        Af0DqAH9AXABbAFiAfwDqAH9AXEBbQFnAfwBcAFrAWMB/ANcAfgBZAFUAVMB8QFlAWMBUgH0AmoBZQH5\n        AWcBVgFNAfoCYgFXAfYDXQHtAycBO0AAAwQBBgMQARUDJwE7A0QBeQJYAVIBrwGJAX8BQgHiAW4BagFS\n        Ac8DQwF4AyYBOQMOARMDAQECBAADBgEIAxABFQMjATMDQAFwAVYBWwFhAb0BSAFzAZYB5gE4AYABtgHx\n        ASIBggHcAfwBGQGWAf0B/wEbAZsC/wEbAZ0C/wEbAZ0C/wEbAZsC/wEZAZYB/QH/ASIBkQHmAf0BNwF/\n        AbkB8gFIAXMBmAHmAVUBXAFiAcADQgF1AyQBNQMQARYDBgEICAADDwEUAzgBXAJQAVMBowJUAWQBxAFU\n        AVEBdAHUAVMBUgFvAdMCVAFhAcICUAFSAaICPAE9AWcDHwEtAw4BEwMOARMDHQEpAzsBZAJRAVMBoAJV\n        AWIBwAFTAVIBbwHTAVQBUQF0AdQCUwFlAccCUAFTAaQDOQFfAxIBGBAAAVQCUwGsA1kB9QFfAV0BTAHz\n        Am0BUgH3AWABUAFNAfoDagH5A2oB+QFeAU4BTQH6A2oB+QFgAVABTQH6AmIBXQH2Am0BYAH3AWcCXwH7\n        AWICXwH7A1wB+AJqAWQB+QFbAlkBxAMZASNIAAMNARIDKAE9Az8BbQJRAVABnwNKAY0DJgE4AwcBCgME\n        AQUDAQECBAADAgEDAwYBCAMSARgDKAE8AT8CQAFvAU8CUQGcAVMBXgFmAcYBQwF3AaEB6wEYAZEB9gH/\n        ARsBnQL/ARwBogL/ARwBogL/ARsBnQL/ARgBkgH3Af8BQgF3AaEB7AFUAV8BaQHJA1ABnQNBAXIDKgFA\n        AxIBGQMGAQgDAgEDCAADCgEOAyYBOQM+AWsCTwFRAZoCVAFkAcQCVAFhAcICSwFMAZADNwFbAyMBNAMQ\n        ARUDBQEHAwUBBwMPARQDIgEyAzcBWgNKAYsCVQFiAcABVQFTAWYBxgFQAU8BUQGeAz8BbQMnATsDDAEQ\n        EAABXgJbAdkBZAFVAVMB8QFnAlkB8gJiAUkB9gJtAVIB9wJtAVIB9wJtAVIB9wNcAfgDXAH4A2oB+QNq\n        AfkCagFpAfkDagH5AWYBUwFNAfoBZgFTAU0B+gKoAYUB/QNRAaIDDQERSAADBAEGAw8BFAMZASMCIgEh\n        ATEDHwEsAw4BEwMEAQUDAAEBDwABAQMFAQcDEQEXAyMBMwM4AVwDTgGUAVQBXgFkAcQBTAFsAYcB4AE5\n        AXoBrgHwASkBhAHRAfgBKQGEAdEB+AE4AX4BtgHxAU0BbQGJAeEBVQFdAWUBxQNOAZkDOAFeAyQBNQMS\n        ARkDBQEHAwABAQwAAwYBCAMUARsDJwE6Az4BawJQAVIBogJQAVEBnwI5AToBYAMaASUDDAEQAwUBBwMB\n        AQIDAQECAwUBBwMLAQ8DGgEkAzcBWgNQAZ0CUAFTAaQDQAFwAycBOwMUARwDBwEJEAADXAH4AWQCWQHs\n        AWICWAHvAWcCWQHyAWcCWQHyAWcCWQHyAV8BXQFMAfMBXwFdAUwB8wJiAUkB9gFoAVgBTQH6AWcBWAFN\n        AfoCagFkAfkBZwFUAU0B+gFvAWYBRwH8AqgBhQH9AWQCXwH7AUYCRQF+AwEBAmMAAQEYAAMGAQgDEAEV\n        AyABLgMzAVIDQAFxA0gBhAJLAUwBjgNOAZQDTgGUAUsCTAGPA0gBhANBAXIBNAI1AVUDIAEvAxABFgMH\n        AQkUAAMDAQQDCgENAxQBHAMmATkDNwFbAzYBWQMiATIDCgEOAwMBBAMAAQELAAEBAwIBAwMKAQ4DIAEu\n        AjUBNgFYAzgBXAMoATwDFAEcAwoBDQMDAQQMAAMNAREBXAJXAd8BWAJWAbwBVQJTAbADVAGvAVYCVAGr\n        AVMCUgGoAVICUQGhAVACTwGbA1ABmgNMAZMDTAGTA0oBjQNKAYoBSQJIAYgBSQJIAYgDUAGaAygBPYAA\n        AwIBAwMFAQcDCgENAxABFgMVAR0DGAEiAxsBJgMcAScDHAEnAxsBJgMYASIDFgEeAxABFgMKAQ0DBQEH\n        AwIBAxcAAQEDAwEEAwYBCAMKAQ4DDwEUAw4BEwMKAQ0DBAEFAwEBAhAAAwEBAgMEAQUDCQEMAw4BEwMP\n        ARQDCwEPAwYBCAMDAQQDAAEBEAADKwFCAwgBC8MAAQEDAAQBBAIEAwQEAQUDBAEFAwQBBQMEAQUDAwEE\n        AwIBAwMBAQIDAAEBAwABAR8AAQEXAAEBGwABAYAAAUIBTQE+BwABPgMAASgDAAFgAwABMAMAAQEBAAEB\n        BQABQAECFgAD/wEAAf4BAAH/AcABAAEBBgAB/gEAAf8BwAEAAQEGAAH8AQABfwHAAQABAQYAAf4BAAE/\n        AcABAAEBBgAB/gEAAR8BwAEAAQEGAAH+AQABDwHAAQABAQYAAf4BAAEPAcABAAEBBgAB/gEAAQcBwAEA\n        AQEGAAH8AQABBwHAAQABAQYAAfwBAAEHAcABAAEBBgAB/AEAAQMBwAEAAQEGAAH8AQABAwHAAQABAQYA\n        AfwBAAEDAcABAAEBBgAB/AEAAQEBwAEAAQEGAAH4AQABAQHAAQABAQYAAfgBAAEBAcABAAEBBgABuAEA\n        AQEBwAEAAQEGAAG4AQABAQHAAQABAQYAAfwBAAEDAcABAAEBBgAB/wEAAX8BwAEAAQEGAAH/AYABfwHA\n        AQABAQYAAf8BgAE/AcABAAEDBgAB/wHgAX8BwAEAAQcGAAH/AfABfwHAAQABDwYAA/8B+AEAAR8B3wF+\n        Af8B8QX/AfABAAEPAYABPAEBAfABfwH/Af0B7wH/AfABAAEPAYABGAEBAeABDwH/AfgBBwH/AcABAAED\n        AYABAAEBAeABAAEfAfgBBwH/AYABAAEBAYABAAEBAcACAAHwAQEB/wGAAQABAQGAAQABAQHAAgAB4AEB\n        Af8DAAGAAQABAQGAAgAB4AEAAX8GAAGAAgABYAEAAX8LAAEfCAABAQGAAQABHwMAAeABAAEHAgABAQGA\n        AQABBwEAARgBAAHgAQABBwHgAQABAQGAAQABBwEAARgBAAHgAQABBwHgAQABAwGAAQABAQMAAeABAAEH\n        AeABAAEDCQAB4AEAAQMCYAcAAeABAAEHAeABYAEBBgAB4AEAAQcB/wH4AQEDAAGAAQABAQHgAQABBwH/\n        AfgBAAGAAQABAQGAAQABAQHgAQABBwH/Af4BAAGAAQABAQGAAQABAQHgAQABBwH/Af4BAQHAAQABAwGA\n        AQABAQHgAQABBwL/AfsB8AEAAQ8BgAEYAQEBwAEAAQ8D/wHwAQABDwGAATwBAQHnBf8B+AEAAR8B3wF+\n        BP8L\n</value>\n  </data>\n  <metadata name=\"imageListCertLevels.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>233, 17</value>\n  </metadata>\n  <data name=\"imageListCertLevels.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACg\n        XwAAAk1TRnQBSQFMAgEBBgEAAagBAAGoAQABGAEAARgBAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFg\n        AwABMAMAAQEBAAEgBgABSBIAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AloBWAHAAVoBWAFWAcEBWgFZAVcBwgJbAVkBwwJbAVkBxAFcAlkBxwFfAV4BWgHO\n        AV8BXgFaAc4BXAJZAccCWwFZAcQCWwFZAcMBWgFYAVYBwQJaAVgBwAJaAVgBwAJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBv8AAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AloBWAHAAVoBWAFWAcECWwFZAcMCWwFZAcQCWwFZAcQCWwFZAcQCWwFZAcQCWwFZAcMBWgFYAVYBwQJa\n        AVgBwAJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJaAVgBwAFbAVgBVgHBAlsBWQHDAVwBWgFXAcUBXAFaAVkBxwJdAVoBygFgAVwBWAHR\n        AY0BgAFZAfUBhgF7AWAB8QFgAV0BWAHRAV8BXAFZAcwBXAJZAccCWwFZAcQBWgFZAVcBwgFaAVgBVgHB\n        AloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/wAACWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFX\n        Ab8CWgFYAcACWQFXAcIBXAFaAVcBxQFdAlkB0gFhAVsBVgHhAWABWQFUAesBZQFhAU0B7wFlAWABTwHu\n        AWIBWAFRAekBXAFXAVYB3wFfAlkBzwJbAVkBxAJZAVcBwgJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAFaAVgBVgHBAlsBWQHDAVwBWwFYAcYCXQFa\n        AcoBYAFeAVsB0AFhAV4BWgHYAWkBYQFYAeYBcAFkAVMB8QFtAWUBTgHwAWoBYQFYAeYBYQFeAVoB2AFg\n        AV4BWwHQAl0BWgHKAVwBWwFYAcYCWwFZAcMBWgFYAVYBwQJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBv8AA\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAlkBVwHCAVwBWgFZAc0BXAFVAU0B6gFTAUgBMgH7\n        AlIBQAH0AXcBawFTAfUBrAGVAWgB/gGpAZIBZwH+AWcBWgFLAfIBWQFLAUIB9QFOAUcBQAH5AV8BWAFT\n        AeQBXQJaAcoBWgFYAVYBwQJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAJa\n        AVgBwAFaAVkBVwHCAlsBWQHEAVwBWwFYAcYBXgFbAVgBywFgAV4BVwHZAV0BVAFIAfABVwFPAT8B+gF/\n        AXMBSwH+AagBkQFZAf8BpwGQAVgB/wF+AW4BSQH+AVwBUQFCAfoBZAFdAVAB7QFjAWABWwHUAV4BWwFY\n        AcsBXAFaAVkBxwJbAVkBwwFaAVkBVwHCAloBWAHAAlkBVwG/AlkBVwG/wAACWQFXAb8CWQFXAb8CWQFX\n        Ab8CWQFXAb8CWgFYAcACWwFZAcMBXAFaAVMB5wFgAVcBUQHrAV4BWgFWAdkBXQFbAVkByAFmAWEBWwHa\n        AX0BcgFeAewBdwFuAVwB6gFfAV0BWQHSAV0BWwFZAcgBYQFbAVYB3AFaAU4BRwHwAWEBWAFTAeYCWQFX\n        AcICWgFYAcACWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWgFYAcABWgFYAVYBwQFaAVkBVwHCAVwBWgFX\n        AcUBXgFbAVoByAFfAVwBWQHMAWIBXgFbAdABZAFfAVYB4wFiAVgBSwHvAWUBXAFRAeoBdgFrAVcB7wGh\n        AYcBVgH6AaABhgFVAfoBdAFoAVYB7wFoAV4BUQHtAWUBWwFLAfABZAFfAVoB2wFiAV4BWwHQAV8BXAFZ\n        AcwBXgFcAVsByAJbAVkBxAFaAVkBVwHCAloBWAHAAlkBVwG/wAACWQFXAb8CWQFXAb8CWgFYAcABWgFY\n        AVYBwQJZAVcBwgJbAVkBwwFdAloBygJbAVgBxgJZAVcBwgFaAVgBVgHBAlkBVwHCAlsBWQHDAlsBWQHD\n        AlkBVwHCAVoBWAFWAcECWwFZAcMCXAFZAckBXgFcAVkByQJbAVkBwwJZAVcBwgFaAVgBVgHBAloBWAHA\n        AlkBVwG/AlkBVwG/AloBWAHAAVoBWQFXAcIBXAFaAVcBxQJdAVoBygFiAV4BWgHVAWQBWQFQAewBYwFh\n        AVoB2gFjAV8BWgHVAWQBYAFaAdYBYwFfAVoB2AFmAWEBVwHfAXMBZwFZAeUBcwFnAVkB5QFrAWUBWwHg\n        AWYBYQFaAdsBYwFeAVoB2AFkAWABWgHWAWQBYAFWAd4BYgFYAVEB6QFfAV0BWQHSAV4BXAFZAckBXAFa\n        AVcBxQFaAVkBVwHCAloBWAHAwAACWQFXAb8CWgFYAcACWQFXAcIBXwJZAc8BYQFaAVYB4gFcAVoBVwHF\n        AVoBWAFWAcEBWgFYAVYBwQFaAVgBVgHBAloBWAHAAloBWAHAAlkBVwG/AloBWAHAAVoBWAFWAcECWgFY\n        AcACWgFYAcACWgFYAcABWgFYAVYBwQFdAVwBWgHKAV4BWQFWAeUBXQJaAcoCWQFXAcICWQFXAb8CWQFX\n        Ab8BWgFYAVYBwQFcAVoBVwHFAl0BWgHKAV8BXQFaAdMBYgFYAUsB7wFhAVIBPgH3AWQBXwFaAdsBZQFg\n        AVwB1AFlAWABXAHUAWMBYQFaAdUBZAFfAVgB2QFmAWEBWgHbAWYBYQFaAdsBZAFfAVgB2QFmAWABWQHX\n        AWMBYQFaAdUBZAFgAVoB1gFlAV8BWAHdAVwBWgE+AfgBZQFeAVcB5QFgAV0BWAHRAV4BXAFZAckCWwFZ\n        AcQBWgFYAVYBwcAAAlkBVwG/AVoBWAFWAcEBXAFaAVcBxQFfAVcBUgHoAV4BWQFWAeUBXAFaAVcBxQFa\n        AVgBVgHBAV8BXAFZAckBYgFgAV4B0AFcAVoBWQHHAloBWAHAAVoBWAFWAcEBXAJZAccBYwFgAVwB0QFc\n        AlkBxwFaAVgBVgHBAlkBVwG/AloBWAHAAlwBWQHJAVoBTgFHAfABXwFYAVMB5AJbAVkBxAJaAVgBwAJZ\n        AVcBvwJbAVkBxAFgAV0BWAHRAWMBXgFaAdUBZQFfAVgB4wFeAVwBPgH4AWoBZQFXAeUBYwFeAVoB2AFl\n        AWABXAHUAWUBYAFcAdQBZAFgAVoB1gFmAWEBWgHaAWkBZAFbAeEBawFkAVwB4AFmAWEBWwHaAWQBYAFa\n        AdYBYwFhAVoB1QFkAWABWwHWAWcBYQFbAdoBZgFcAVIB6gFrAVcBSgH3AWMBXwFXAd8BXwFdAVoB0wJd\n        AVoBygFaAVkBVwHCwAACWQFXAb8CWQFXAcIBXQJZAdIBWQFLAUIB9QFeAlgB0QJZAVcBwgJZAVcBwgFv\n        AWkBZAHdAcQBuwGnAfgBZwFjAV4B2AJZAVcBwgJbAVkBxAFzAW4BZgHgAdABxwGsAfoBdgFuAWcB4QJb\n        AVkBxAJaAVgBwAJZAVcBvwJbAVkBwwFhAVsBVgHcAU4BRwFAAfkBXwJZAc8BWgFYAVYBwQJZAVcBvwFe\n        AVsBWAHLAYQBdgFdAfABbwFmAVgB5wFzAWoBSwH1AZYBhAFaAfsBcgFpAVgB6QFlAV8BWQHZAWMBYQFa\n        AdUBYwFhAVoB1QFjAWEBWgHaAXEBaAFfAegBvwG1AaEB+QGyAacBkwH3AWgBYgFYAeMBZgFhAVsB2gFk\n        AWABWwHWAWYBYAFZAdcBZwFhAVoB3AF5AWwBWQHsAaMBjQFSAf0BbwFiAUwB8wFyAWgBVQHqAW0BZQFY\n        AeMBXAFbAVgBxsAAAloBWAHAAlsBWQHEAV4BWQFUAeUBXQFUAU0B7QFbAVoBWAHGAloBWAHAAlsBWQHD\n        AXMBbgFmAeAB5wHbAb0B/QFqAWYBYQHbAlsBWQHEAVsBWQFYAccBpwGiAY8B9AHvAeMBxQH+AcIBuQGh\n        AfgBXQFbAVoByAFaAVgBVgHBAlkBVwG/AVoBWAFWAcEBXQFbAVkByAFZAUoBQgH1AVwBVwFWAd8CWwFZ\n        AcMCWQFXAb8BXgFbAVgBywF0AWoBVwHoAWwBZQFYAeUBlAGBAU4B/QG5AaABYQH/AXIBaAFVAeoBZQFf\n        AVkB2QFjAWEBWgHVAWMBXwFZAdcBZAFfAVkB4AGWAY4BfAH0AfgB7AHNAf8B6QHdAb8B/gF3AW0BXwHt\n        AWQBYAFWAd4BYwFeAVoB2AFmAWABWQHXAWkBYwFYAd0BewFtAVoB7QG5AaABYQH/AZABdQFNAf0BbgFj\n        AVgB6QFyAWoBWAHmAVwCWQHHwAACWgFYAcACWwFYAcYBXQFRAUgB8AFnAV0BUQHtAV4BXAFZAcwBWgFY\n        AVYBwQJbAVkBwwFzAW4BZgHgAecB2wG+Af0BbAFmAWEB3AFbAVoBWAHGAWABXQFYAdEB2AHOAboB/AGp\n        AZ8BjQH1Ae0B4QHDAf4BZQFgAV8B1AJZAVcBwgJZAVcBvwJZAVcBwgFfAV0BWQHSAWcBWgFLAfIBYgFY\n        AVEB6QJbAVkBxAJZAVcBvwFcAlkBxwFfAV0BWQHSAWgBYgFUAekBkwGBAU4B/QGZAYIBXAH4AWoBYwFa\n        AeIBZgFgAVkB1wFkAWABWgHWAWYBYQFaAdoBaQFhAVgB5gHAAbEBoQH6AcUBvQGpAf0BzgHCAbAB/QGX\n        AY0BfwH1AWUBXwFWAeMBZgFhAVsB2gFmAWABWQHXAWYBYwFaAdsBdAFpAVoB5wGYAYsBXwH5AYYBfwFS\n        Af4BZwFlAVcB5QFgAVwBWQHPAVwBWgFXAcXAAAJaAVgBwAFbAlgBxgFtAWEBTgH3AbABnQFcAf0BZAFf\n        AVkB2QJZAVcBwgJbAVkBwwFzAW4BZgHgAecB2wG+Af0BbAFmAWEB3AFcAVsBWQHIAYIBfQFyAekBvwG4\n        AaAB+AFmAWEBYAHeAdcBzgG5AfwBgwF9AXMB6QJbAVkBxAJaAVgBwAJbAVkBwwF3AW4BXAHqAakBkgFn\n        Af4BZQFgAU8B7gJbAVkBxAJZAVcBvwFcAVsBWAHGAWEBXQFZAc8BZgFgAVQB6wFiAV8BSAH2AWoBYwFb\n        AeEBZQFfAVkB2QFjAWEBWgHVAWQBYAFaAdYBZAFeAVgB3QF0AWoBXgHsAesB3gG/Af4CbQFSAfcBjAGG\n        AWoB+QHeAdEBuwH9AWgBYAFWAegBZQFhAVcB3AFmAWABWQHXAWYBYAFZAdcBaAFjAVgB3QFrAWIBVgHk\n        AV8BWwE4AfsBZgFhAVYB5gFdAVwBWgHNAVwBWgFXAcXAAAJaAVgBwAFbAVkBWAHHAW0BYwFPAfcBrQGV\n        AWkB/gFmAWEBWwHaAlkBVwHCAlsBWQHDAXMBbgFmAeAB5wHbAb4B/QFrAWcBYgHdAVwBWgFZAc0B0AHH\n        AawB+gGgAZcBiQHxAVwBWgFYAc0BpwGeAYwB8wGuAaMBkgH0AV4BXAFZAckCWgFYAcACWwFZAcMBfQFy\n        AV4B7AGsAZUBaAH+AWUBYQFNAe8CWwFZAcQCWQFXAb8BXAFaAVcBxQFeAVwBWQHMAWEBWwFQAeoBXwFd\n        AUoB8wFjAV4BWgHYAWUBYAFcAdQBZQFgAVwB1AFjAV8BWQHXAWEBXAFWAd8BkwGLAXkB9AHSAcUBsgH9\n        AWABUwFGAfEBZgFkAVIB9AHmAdoBuwH+AYYBfwFuAfEBZAFgAVYB3gFjAWABWQHXAWYBYQFaAdUBZgFg\n        AVkB1wFmAV8BWgHbAVQBTgE/AfoBYQFaAVQB5AJdAVoBygJbAVkBxMAAAloBWAHAAVsBWgFYAcYBXwFV\n        AUwB8wF3AWsBUwHxAWABXgFbAdABWgFYAVYBwQJbAVkBwwFzAW4BZgHgAecB2wG+Af0BawFlAWIB3QFj\n        AWABWwHWAdgBzgG6AfwBfgF6AXEB6AFdAVoBWQHKAYABeAFvAecBwwG6AaIB+AFhAV8BWQHPAVoBWAFW\n        AcECWQFXAcIBZgFhAVsB2gF3AWsBUwH1AWABWQFUAesCWwFZAcQCWQFXAb8CWwFZAcQBXgFcAVkByQFg\n        AVwBVgHfAWYBYAFUAesBYwFgAVwB1AFiAV4BWgHTAWIBXQFaAdMBYgFeAVoB2AFjAV4BVwHgAbcBsAGW\n        AfkBrgGlAY0B+QFhAVQBSgHuAWcBXQFOAfABywHEAawB/AGwAaIBlAH4AWEBXAFWAd8BYwFfAVkB1wFl\n        AWABXAHUAWMBYQFaAdUBYwFfAVkB1wFdAVoBSgHwAWEBXwFXAdwBXgFbAVoByAJbAVkBw8AAAloBWAHA\n        AlsBWQHEAVwBWAFTAecBWgFYAU8B7AFbAVoBWAHGAVoBWAFWAcECWwFZAcMBcwFuAWYB4AHnAdsBvQH9\n        AWsBZQFiAd0BaAFkAV8B2wHlAdgBvQH9AXMBbwFoAeIBXAFbAVkByAFyAW0BZgHhAc8BxgGqAfoBYQFf\n        AV0B0gJZAVcBwgFaAVgBVgHBAV0BWwFZAcgCUgFAAfQBYQFbAVYB4QJbAVkBwwJZAVcBvwJbAVkBwwFc\n        AlkBxwFfAV4BWgHOAV8BXQFaAdMBYgFdAVoB0wFhAV0BWQHSAWUBYAFcAdQBYQFeAVoB2AFiAV0BVwHg\n        AcsBxAGlAfsBmgGRAXsB9gFkAVgBUgHoAWUBXAFSAeoBwgG1AaIB+gHGAbgBpAH6AWEBXAFWAd8BYwFf\n        AVkB1wFjAWEBWgHVAWUBYAFcAdQBYwFhAVoB1QFjAWABWwHUAV0BXAFaAc0BXAFbAVgBxgFaAVkBVwHC\n        wAACWQFXAb8CWwFZAcMBXgFaAVkB1QFPAUkBPQH2AV4BWwFZAdACWQFXAcICWQFXAcIBbQFpAWQB3gHY\n        Ac4BuQH8AWoBZgFhAdsBZQFjAV4B2QHUAcsBsgH7AW4BaQFjAd8BWwFaAVgBxgFtAWgBZAHeAcoBvgGr\n        AfkBYQFfAV0B0gFaAVgBVgHBAlkBVwHCAV4BWgFWAdkBUwFIATIB+wFdAlkB0gFaAVgBVgHBAlkBVwG/\n        AVoBWQFXAcIBXAFaAVcBxQJdAVoBygFhAV0BWQHXAWMBYQFXAdwBZAFgAVoB1gFkAWABWgHWAWMBXgFY\n        AdkBYAFbAVUB3gHHAboBpAH6AZUBiwF9AfIBZAFfAVcB4QFkAWEBVQHkAbgBsAGZAfgBvgG0AaAB+QFj\n        AV4BVwHdAWMBXgFYAdkBYwFgAVkB1wFjAV4BWgHYAWYBXwFZAeABYwFgAVsB1AJdAVoBygJbAVkBxAFa\n        AVgBVgHBwAACWQFXAb8BWgFYAVYBwQFbAVoBWAHGAV0BVAFNAe0BYAFaAVUB3gJbAVkBxAFaAVgBVgHB\n        AWEBYAFcAc8BcAFrAWUB3QFfAV4BXAHOAV8BXAFZAcwBcAFrAWUB3QFhAWABXAHPAlsBWQHDAWEBYAFc\n        Ac8BcAFqAWMB2wFfAVwBWQHJAVoBWAFWAcECWwFYAcYBXAFVAVAB6gFcAVUBTQHqAVwBWgFXAcUCWgFY\n        AcACWQFXAb8BWgFYAVYBwQJbAVkBxAFeAVwBWQHJAWIBXQFXAeEBZQFSAUIB9AFpAWIBWgHgAWgBYgFY\n        Ad0BZQFhAVgB3QFjAWEBVwHcAXMBbAFlAeUBbQFlAVwB4QFjAWEBWgHaAWUBYQFYAdwBcAFoAWEB5AFz\n        AWwBZQHlAWUBXwFYAd0BZgFgAVgB3gFoAWEBWAHeAWcBYQFVAeQBYAFSAT4B9wFjAV8BWQHbAV4BXAFZ\n        AckCWwFZAcMBWgFYAVYBwcAAAlkBVwG/AloBWAHAAlkBVwHCAV0BWgFZAdMBYAFZAVMB5AFcAVoBVwHF\n        AVoBWAFWAcEBWgFYAVYBwQFaAVgBVgHBAVoBWAFWAcEBWgFYAVYBwQFaAVgBVgHBAVoBWAFWAcECWgFY\n        AcABWgFYAVYBwQFaAVgBVgHBAVoBWAFWAcEBWgFYAVYBwQFdAloBygFfAVcBUgHoAVwBWgFZAc0CWQFX\n        AcICWQFXAb8CWQFXAb8BWgFYAVYBwQJbAVkBxAFeAVsBWgHIAV8BXQFZAdMBZwFZAUkB8gFqAVkBQgH1\n        AYIBcgFVAfEBeQFsAVQB7gFpAWEBWgHhAWMBXgFYAdkBYwFgAVoB1gFjAV8BWgHVAWMBXwFaAdUBYwFf\n        AVkB1wFkAV8BWgHbAWkBYgFYAeMBgwF1AVgB8QGDAXYBWQHyAWIBXwFIAfYBYwFdAVEB6QFgAV4BWwHQ\n        AVwBWgFZAccCWwFZAcMCWgFYAcDAAAJZAVcBvwJZAVcBvwJaAVgBwAJZAVcBwgJbAVkBwwJbAVkBwwFc\n        AVoBVwHFAlsBWQHEAlkBVwHCAVoBWAFWAcEBWgFYAVYBwQJZAVcBwgJZAVcBwgFaAVgBVgHBAloBWAHA\n        AlkBVwHCAVwBWgFXAcUBXAFaAVcBxQJbAVkBwwJbAVkBwwJZAVcBwgJaAVgBwAJZAVcBvwJZAVcBvwJa\n        AVgBwAJbAVkBwwFcAVsBWAHGAV0BXAFZAc0BYwFeAVcB3wFqAWYBQwH5AbIBmgFeAf8BuAGgAWAB/wF8\n        AW4BWgHwAWYBYQFbAdoBZQFgAVwB1AFiAV0BWgHTAWIBXQFaAdMBZAFgAVoB1gFmAWEBWAHcAYMBdAFY\n        AfEBuAGfAWAB/wGqAZIBZAH+AW0BXAFFAfUBYQFeAVoB2AFeAVsBWAHLAVwBWgFXAcUBWgFYAVYBwQJa\n        AVgBwMAAAlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAloBWAHAAlsBWQHDAV8BWAFTAeMBYAFaAVUB3gFe\n        AVsBWQHQAVsBWgFYAcYBYAFeAVsB0AFmAWEBWwHaAWQBXwFZAdkBXgFcAVkBzAFbAVoBWAHGAV4CWAHR\n        AV4BWQFWAeUBYQFbAVYB4QJZAVcBwgJaAVgBwAJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAFa\n        AVgBVgHBAVwBWgFXAcUCXQFaAcoBYwFeAVoB1QFsAWQBVwHoAYMBbQFRAfcBmgGEAVwB/gF3AWcBUwHy\n        AWcBYQFYAeEBYwFfAVkB1wFiAV0BWgHTAWUBYAFcAdQBZgFhAVsB2gFnAWEBVQHkAXoBZwFSAfQBowGN\n        AVIB/QF3AWIBSQH2AWYBYAFYAeMBYAFeAVsB0AFeAVsBWgHIAlsBWQHEAVoBWAFWAcECWgFYAcDAAAJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAJZAVcBwgFgAVwBWQHUAV0BVAFNAe0BTwFJAT0B9gFa\n        AVgBTwHsAXcBawFTAfEBrQGVAWkB/gGwAZ0BXAH9AWcBYQFRAe4BWgFUAUoB7gFZAUsBQgH1AV8BVwFS\n        AegBXgFbAVkB0AJZAVcBwgJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAFa\n        AVkBVwHCAVwBWwFYAcYBaAFjAVgB3QGZAYUBXAH4AW8BZQFYAekBZwFhAVIB6gFgAVkBQgH1AWABTgFB\n        AfkBYQFZAU0B7gFjAV8BWgHVAWMBXgFYAdkBXwFbAUcB8wFhAU4BQQH5AWUBVwFEAfQBawFkAVUB5wF6\n        AWwBVAHuAYYBewFgAfEBYQFdAVkBzwFcAVoBVwHFAVoBWQFXAcICWgFYAcACWQFXAb/AAAJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAJbAVkBwwFbAVoBWAHGAV4BWgFZAdUBXAFYAVMB5wFf\n        AVUBTAHzAW0BYwFPAfcBbQFhAU4B9wFgAVMBSgHxAV4BWQFUAeUBXQJZAdIBXAFaAVcBxQJZAVcBwgJa\n        AVgBwAJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAJbAVkBwwJd\n        AVoBygFzAWoBWAHmAWIBYAFaAdYBYAFdAVgB0QFfAV0BWgHTAWABXgFXAdkBZAFfAVkB4AFgAV0BWAHR\n        AWMBYAFbAdQBYwFdAVYB4gFhAV0BWQHXAWMBYAFbAdQBYAFdAVgB0QFqAWQBWwHiAWsBZQFcAeABXAFb\n        AVgBxgFaAVkBVwHCAloBWAHAAlkBVwG/AlkBVwG/wAACWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFX\n        Ab8CWQFXAb8CWgFYAcABWgFYAVYBwQJbAVkBwwJbAVkBxAFbAVoBWAHGAVsBWQFYAccBWwFZAVgBxwJb\n        AVgBxgJbAVkBxAJZAVcBwgFaAVgBVgHBAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AVoBWAFWAcECWwFZAcMBXAFaAVcBxQFcAlkBxwFeAVsBWgHI\n        AV4BXAFZAckCXQFaAcoCXQFaAcoBXgFcAVkByQFeAVwBWQHJAl0BWgHKAl0BWgHKAV4BXAFZAckBXgFb\n        AVoByAFcAVkBWAHHAVwBWgFXAcUBWgFZAVcBwgJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBv8AAAlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAloBWAHA\n        AloBWAHAAloBWAHAAloBWAHAAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAVoBWAFWAcEBWgFZ\n        AVcBwgJbAVkBwwJbAVkBxAJbAVkBxAJbAVkBxAJbAVkBxAJbAVkBxAJbAVkBxAJbAVkBxAJbAVkBxAJb\n        AVkBwwFaAVkBVwHCAVoBWAFWAcECWgFYAcACWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb/AAAJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAJaAVgBwAFbAVgBVgHBAVsBWAFWAcEBWgFZAVcBwgFd\n        AVsBWQHDAV0BWwFZAcMBXQFbAVkBwwJbAVkBwwFaAVkBVwHCAVsBWAFWAcEBWwFYAVYBwQJaAVgBwAJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAFaAVkBVwHCAlsBWQHEAV0BWgFXAcUBXQFaAVcBxQFd\n        AVsBWAHGAV0BWwFYAcYBXQFaAVcBxQFdAVoBVwHFAV0BWwFZAcMBWwFYAVYBwQJaAVgBwAJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJaAVgBwAFaAVgBVgHBAlsBWQHDAlsBWQHEAVwBWgFXAcUCWwFZAcQCWwFZAcQCWwFZ\n        AcMBWgFYAVYBwQJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAFaAVgBVgHBAlsBWQHD\n        AlsBWQHEAVwBWgFXAcUCWwFZAcQCWwFZAcQCWwFZAcMBWgFYAVYBwQJaAVgBwAJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJaAVgBwAFaAVgBVgHBAlsBWQHDAlsBWQHEAVwBWgFXAcUCWwFZAcQCWwFZAcQCWwFZ\n        AcMBWgFYAVYBwQJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwFnAWUBVwHlAWYBYQFaAeACWwFZAcQCWwFZAcQBXgFc\n        AVsByAFhAV0BWQHXAWEBXwFXAdwBYQFgAVcB3AFjAWABWwHUAV0BWwFYAcYBXQFbAVkBwwFeAVwBWQHJ\n        AWkBZAFTAewBYwFfAVoB2wJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJaAVgBwAJZAVcBwgFcAVoBVwHFAV0CWQHSAWEBWgFVAeIBYQFZAVQB6wFl\n        AWABTQHvAWQBWgFNAe8BYgFYAVEB6QFfAVwBVwHgAV4BWwFZAdACWwFZAcQCWQFXAcICWgFYAcACWQFX\n        Ab8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWgFY\n        AcACWQFXAcIBXAFaAVcBxQFdAlkB0gFhAVoBVQHiAWEBWQFUAesBZQFgAU0B7wFkAWABTQHvAWIBWAFR\n        AekBXwFcAVcB4AFeAVsBWQHQAVwBWgFXAcUCWQFXAcICWgFYAcACWQFXAb8CWQFXAb8CWQFXAb8CWQFX\n        Ab8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWgFYAcACWQFXAcIBXAFaAVcBxQFd\n        AlkB0gFgAVsBVgHhAWEBWQFUAesBZQFgAU0B7wFkAVoBTQHvAWEBWAFRAekBXwFbAVcB4AFeAVsBWQHQ\n        AlsBWQHEAlkBVwHCAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHA\n        AloBWAHAAVwBWgFXAcUBaAFiAVQB6QFlAWEBVwHiAXQBZwFFAf4BbQFkAVIB8QJYAUsB7wE/ATwBLAH8\n        AUsBQwEyAfsBTQFJATIB+gFNAUkBMgH6AUkBQgExAfsBPwE8ASwB/AFdAVoBSwHwAW4BWwFJAfoBaQFd\n        AUAB/QFmAWEBWgHgAWYBYAFaAeABWgFYAVYBwQJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwFaAVgBVgHBAlsBWQHEAV8CWQHPAWABVwFRAesBUQFIATIB+wFVAUwBRAHzAXwBbAFW\n        AfUBrQGVAWgB/gGtAZsBWwH9AWQBYAFPAfEBWQFKAUIB9QFNAUcBQQH5AVoBWAFTAeQBWwJYAcsCWwFZ\n        AcMCWgFYAcACWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8BWgFY\n        AVYBwQJbAVkBxAFfAlkBzwFaAVgBTwHsAVIBSQEyAfsBWwFMAUMB8wF8AWwBVgH1Aa0BlQFoAf4BqQGS\n        AWcB/gFnAVsBSwHyAlIBQQH0AU4BTQE7AfoBXgFZAVQB5QFcAlkBzAJbAVkBxAJaAVgBwAJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwFaAVgBVgHBAlsBWQHEAV4BXAFZ\n        Ac4BXwFXAVAB6wFRAUgBMgH7AlIBQAH0AXwBbAFWAfUBrQGVAWgB/gGtAZsBWwH9AWUBYAFPAfEBWQFK\n        AUIB9QFNAUcBQQH5AVoBVgFTAeQBWwJYAcsCWwFZAcMCWgFYAcACWQFXAb8CWQFXAb8CWQFXAb8CWQFX\n        Ab8CWgFYAcABWwFYAVYBwQFbAVgBVgHBAV4CWwHIAW0BXwFMAfMBbAFkAVUB7AFsAWQBVQHsAW0BXwFM\n        AfMBZAFeAVIB7AFhAV8BWQHbAV8BXAFZAcwBXgFcAVsByAFeAVwBWwHIAWABXQFYAdEBYQFcAVcB3AFn\n        AV0BUQHtAWwBXAFGAfUBZwFhAVYB5AFoAWIBSAH2AWYBYQFZAeEBWgFZAVcBwgFbAVgBVgHBAloBWAHA\n        AloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AVoBWAFWAcEBXAFaAVcBxQFeAlkB1wFZAVMBRwHyAVwBVQFQ\n        AeoBXgFaAVgB2AFdAVsBWQHIAWYBYQFaAdsBfQFyAV0B7AF3AW0BXAHqAV8BXAFYAdEBXQFbAVkByAFf\n        AVoBWAHbAVoBTgFHAfABVwFTAUgB8QFgAVwBWQHUAlsBWQHEAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AVoBWAFWAcECWwFYAcYBXgFaAVgB2AFbAUwBRAHzAVwBVQFQAeoBXgFa\n        AVgB2AFdAVsBWQHIAWYBYQFaAdsBfQFyAV0B7AF3AW4BXAHqAV8BXQFZAdIBXQFbAVkByAFhAVwBWQHa\n        AVgBUgFKAe8BWQFTAUgB8gFeAVoBWQHVAlsBWQHEAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AVoBWAFWAcEBXAFaAVcBxQFeAlkB1wFZAVMBRwHyAWABVwFRAesBXgFaAVYB2QFd\n        AVsBWQHIAWYBYQFaAdsBfQFyAV0B7AF3AW0BXAHqAV8BXAFYAdEBXQFbAVkByAFfAVoBWAHbAVoBTgFH\n        AfABWgFOAUcB8AFgAVwBWQHUAlsBWQHDAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AVsBWAFWAcEBWgFZ\n        AVcBwgFdAVsBWQHDAlsBWQHEAWoBZAFVAewBbgFhAT4B/wFjAV8BWQHXAl0BWgHKAV0BWgFXAcUBXQFb\n        AVgBxgFdAVsBWAHGAV0BWwFYAcYBXQFbAVgBxgFdAVsBWAHGAV0BWgFXAcUBXAFbAVgBxgFeAVsBWAHL\n        AWMBXwFXAd8BcgFmAUQB/gFiAV4BWgHVAlsBWQHEAV0BWwFZAcMBWwFYAVYBwQJaAVgBwAJZAVcBvwJZ\n        AVcBvwJaAVgBwAFcAVoBVwHFAWABWgFVAd4BTgFJAT0B9gFhAVsBVgHcAV0BWwFaAcgCWQFXAcIBWgFY\n        AVYBwQJZAVcBwgJbAVkBxAJbAVkBwwJZAVcBwgFaAVgBVgHBAlsBWQHDAV0BWwFYAcsBXAFXAVYB3wFb\n        AUwBRAHzAWABXAFZAdQCWwFZAcMCWgFYAcACWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWgFYAcABXAFa\n        AVcBxQFhAVsBVgHhAU8BSQE9AfYBXwFaAVcB2wFbAVkBWAHHAlkBVwHCAVoBWAFWAcECWQFXAcICWwFZ\n        AcQCWwFZAcMCWQFXAcIBWgFYAVYBwQJbAVkBwwFdAVoBWQHKAV4BWAFXAd0CUgFAAfQBYAFbAVcB1gJb\n        AVkBxAJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAJbAVkBwwFeAVgBVwHdAVIBUQE7\n        AfcBYQFaAVYB3AFdAVsBWgHIAlkBVwHCAVoBWAFWAcECWQFXAcICWwFZAcQCWwFZAcMCWQFXAcIBWgFY\n        AVYBwQJbAVkBwwFdAVsBWAHLAVwBVwFUAd8CUgFBAfQBXQFaAVkB0wJZAVcBwgJZAVcBvwJZAVcBvwJZ\n        AVcBvwFaAVkBVwHCAlsBWQHEAV0BWwFYAcYBXQFcAVoBzQFkAVIBQwH0AWIBWAFMAe8CWwFZAcQCWwFZ\n        AcQCWwFZAcQBXQFbAVkBwwFdAVsBWQHDAV0BWwFZAcMBXQFbAVkBwwFdAVsBWQHDAV0BWwFZAcMCWwFZ\n        AcQBXQFaAVcBxQJbAVkBxAFlAVIBQwH0AWIBWAFRAekBXgFcAVsByAFdAVoBVwHFAlsBWQHDAVsBWAFW\n        AcECWQFXAb8CWgFYAcACWQFXAcIBXQJYAdEBWQFKAUIB9QFeAVoBVgHZAVwBWgFXAcUBWgFYAVYBwQJZ\n        AVcBvwJZAVcBvwJaAVgBwAFaAVgBVgHBAVoBWAFWAcECWgFYAcACWQFXAb8CWgFYAcABWgFYAVYBwQFc\n        AVoBVwHFAVwBVwFWAd8BVwFTAUgB8QFbAlgBywJZAVcBwgJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAJZ\n        AVcBwgFdAVoBVwHTAVkBSgFCAfUBXQJZAdcCWwFZAcQBWgFYAVYBwQJaAVgBwAFaAVgBVgHBAVoBWAFW\n        AcEBWgFYAVYBwQFaAVgBVgHBAVoBWAFWAcEBWgFYAVYBwQJaAVgBwAFaAVgBVgHBAVwBWgFXAcUBXgFY\n        AVcB3QFZAVEBSAHyAVwCWQHMAlkBVwHCAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAl0BWgHK\n        AVoBUwFJAfEBXwFaAVcB2wFcAVoBVwHFAlkBVwHCAVoBWAFWAcEBWgFYAVYBwQJaAVgBwAFaAVgBVgHB\n        AVoBWAFWAcECWgFYAcABWgFYAVYBwQFaAVgBVgHBAlkBVwHCAVwBWgFXAcUBXwFcAVcB4AFcAVgBUwHn\n        AVwBWgFXAcUCWgFYAcACWQFXAb8CWQFXAb8CWwFZAcMBXQFaAVcBxQFcAVoBWQHHAWUBXgFWAeUBXwFZ\n        AU8B7AFeAVwBWwHIAV0BWgFXAcUBXQFbAVkBwwFaAVkBVwHCAVsBWAFWAcEBWwFYAVYBwQFbAVgBVgHB\n        AVsBWAFWAcEBWwFYAVYBwQFbAVgBVgHBAVoBWQFXAcICWwFZAcQBXQFbAVgBxgFdAVwBWgHNAVkBSgFC\n        AfUBYQFeAVYB3gFdAVsBWAHGAlsBWQHEAVoBWQFXAcICWQFXAb8BWgFYAVYBwQFcAVoBVwHFAV8BVwFS\n        AegBXgFZAVQB5QFbAVkBWAHHAVoBWAFWAcECWQFXAb8CWQFXAb8CWQFXAb8CWQFXAcIBYgFfAV0B0wFi\n        AWABXgHQAlkBVwHCAlkBVwG/AlkBVwG/AloBWAHAAVoBWAFWAcEBXQFbAVgBywFaAU4BRwHwAVoBWAFT\n        AeQCWwFZAcQCWgFYAcACWQFXAb8CWQFXAb8BWgFYAVYBwQJbAVgBxgFaAVgBTwHsAV8BWAFTAeMBWwFZ\n        AVgBxwFaAVgBVgHBAloBWAHAAVoBWAFWAcEBXwFcAVkBzAFlAWMBYAHUAVwBWgFXAcUBXgJbAcgBZwFj\n        AV8B1QJdAVoBygFaAVgBVgHBAloBWAHAAVoBWAFWAcEBXQFaAVkBygFZAVQBSgHuAVsBWAFQAekBXAFa\n        AVcBxQJaAVgBwAJZAVcBvwJZAVcBvwJaAVgBwAFaAVgBVgHBAlsBWQHDAV0BWwFYAcsCWwFZAcQCWQFX\n        AcIBXgFcAVsByAFiAV8BXQHTAV4BWwFYAcsCWwFZAcQBZAFfAV0B0gFiAWABXgHQAlsBWQHEAV0BXAFa\n        Ac0BYwFgAVwB0QFcAVoBVwHFAlkBVwHCAVwBWgFXAcUBXAFbAVgBxgJZAVcBwgFaAVgBVgHBAloBWAHA\n        AlkBVwG/AlsBWQHEAVwBWgFZAccBYQFdAVkBzwFSAVEBOwH3AWMBYAFbAdQBXAFaAVkBxwJbAVkBxAFa\n        AVkBVwHCAloBWAHAAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAVsBWAFWAcEBXQFb\n        AVkBwwFdAVoBVwHFAVwBWwFZAccBYwFfAVkB4AFNAUwBMwH6AV0BXAFaAc0BXQFaAVcBxQFdAVsBWQHD\n        AlkBVwG/AlkBVwHCAV0CWQHSAVABSQE/AfYBXgFbAVkB0AJZAVcBwgJZAVcBvwJZAVcBvwJZAVcBvwJa\n        AVgBwAJbAVgBxgHEAboBpgH4AZcBkQGDAe8CWwFZAcQCWQFXAb8CWQFXAb8CWQFXAb8CWgFYAcACWwFZ\n        AcMBXwFaAVgB2wFNAUcBQQH5AV4BWwFZAdABWgFYAVYBwQJZAVcBvwJZAVcBvwJbAVkBwwFeAlkB1wFZ\n        AUsBQgH1AV4BXAFZAc4CWQFXAcICWQFXAb8CWgFYAcACWwFZAcMBcwFuAWYB4AHAAbYBoQH3AlwBWQHN\n        AWMBYAFcAdQB0AHHAawB+gFoAWYBYQHaAlsBWQHDAlkBVwG/AloBWAHAAlkBVwHCAV4CWQHXAk0BOgH6\n        AV0BWgFXAdMCWQFXAcICWQFXAb8CWQFXAb8BWgFYAVYBwQFdAVsBWAHLAVwBWgFZAc0CWQFXAcICWgFY\n        AcACWQFXAcIBZgFjAV8B1wHMAcABrQH5AXYBcQFoAeEBXAJZAckBwAG4AaQB9wGXAZEBgwHvAVwBWwFZ\n        AcgBgQF7AXEB5wGyAakBlwH1AV0BXAFaAc0BWgFYAVYBwQJaAVgBwAJZAVcBwgFfAVoBWQHVAV0BXAFa\n        AcoBWgFYAVYBwQJZAVcBvwFdAVoBVwHFAVwBWgFZAccBYAFXAVUB6AFZAVMBSQHxAV8BXAFZAckBXQFb\n        AVgBxgJbAVkBxAFbAVgBVgHBAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AloBWAHAAVoBWQFXAcICWwFZAcQBXAFaAVkBxwFeAVsBWAHLAU0BTAEzAfoBYwFfAVkB4AFdAVsBWAHG\n        AlsBWQHEAloBWAHAAlsBWQHEAWEBWAFSAeYBXQFUAU0B7QFcAVoBVwHFAloBWAHAAlkBVwG/AlkBVwG/\n        AlkBVwG/AloBWAHAAVsBWQFYAccB0QHJAa0B+gGkAZ0BjgHyAVwBWgFXAcUCWQFXAb8CWQFXAb8CWQFX\n        Ab8CWQFXAb8BWgFYAVYBwQFbAVkBWAHHAVkBSgFCAfUBXwFcAVcB4AJbAVkBwwJZAVcBvwJaAVgBwAJb\n        AVkBxAFbAVgBUAHpAVwBVQFQAeoCWwFZAcQCWgFYAcACWQFXAb8CWgFYAcACWwFZAcQBcwFvAWgB4gHK\n        Ab4BqwH5AV8BXAFZAc8BYwFgAVsB1gHXAc4BuQH8AWoBZgFhAdwCWwFZAcMCWQFXAb8CWQFXAb8CWgFY\n        AcABWwFaAVgBxgFYAVMBSAHxAV8BWAFTAeMCWwFZAcMCWQFXAb8CWgFYAcACWwFZAcMBXwFYAVMB5AFg\n        AVgBUQHrAlkBVwHCAlkBVwG/AlkBVwHCAWYBYwFeAdkB5QHZAb0B/QF2AXABaQHkAVsCWAHLAdMBywGy\n        AfsBpAGdAYwB8gFbAlgBywGCAXsBcgHqAcMBugGiAfgBYQFfAVkBzwFaAVgBVgHBAloBWAHAAlsBWQHE\n        AVkBTAFCAfUBXQFXAVYB3wJZAVcBwgJZAVcBvwFdAVoBVwHFAVwBWgFZAccBWQFKAUIB9QFlAV4BVgHl\n        AVwBWgFZAccBXQFaAVcBxQFaAVkBVwHCAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AloBWAHAAVsBWAFWAcEBXQFbAVkBwwFdAVsBWAHGAV4BXAFbAcgBXQFYAVAB7QFg\n        AVkBUwHrAV4BWwFYAcYCWwFZAcQCWgFYAcABXAFaAVcBxQFaAU4BRwHwAV8BWAFTAeMCWwFZAcQCWgFY\n        AcACWQFXAb8CWQFXAb8CWQFXAb8CWgFYAcABWwFZAVgBxwHRAckBrQH6AaQBnQGOAfIBXAFaAVcBxQJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAFcAVoBVwHFAVsBWAFQAekBXwFXAVIB6AJbAVkBwwJZ\n        AVcBvwJaAVgBwAJbAVkBwwFcAVkBTwHsAWEBWwFWAdwCWQFXAcICWQFXAb8CWQFXAb8CWgFYAcACWwFZ\n        AcQBcwFvAWgB4gHKAb4BqwH5AV8BXAFZAc8BYwFgAVsB1gHXAc4BuQH8AWgBZQFhAdwCWwFZAcQCWQFX\n        Ab8CWQFXAb8CWgFYAcACWwFZAcQBYQFaAVYB4gFeAVsBVgHlAlkBVwHCAlkBVwG/AloBWAHAAVwBWgFX\n        AcUBWAFSAUoB7wFfAVgBUwHkAlsBWQHDAlkBVwG/AlkBVwHCAWYBYwFeAdkB5QHZAb0B/QF2AXABaQHk\n        AVwCWQHMAdMBywGyAfsBpAGdAYwB8gFbAlgBywGCAXsBcgHqAcMBugGiAfgBYgFeAVsB0AFaAVgBVgHB\n        AloBWAHAAVwBWgFXAcUBXAFVAU0B6gFfAVcBUgHoAlsBWQHDAlkBVwG/AV0BWgFXAcUBXQFbAVgBxgFN\n        AUkBMgH6AWMBXgFYAd0BXQFbAVgBxgJbAVkBxAFaAVkBVwHCAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAVoBWQFXAcIBXQFaAVcBxQFcAVoBWQHH\n        AWABWgFWAeMBWgFOAUcB8AFdAVsBWAHGAlsBWQHEAloBWAHAAlsBWAHGAVkBSwFCAfUBXgFYAVcB3QJb\n        AVkBwwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAFbAVkBWAHHAdEByQGtAfoBpAGdAY4B8gFc\n        AVoBVwHFAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAVwBWgFXAcUBXgFYAVMB4wFdAVQBTQHt\n        AlsBWQHEAlkBVwG/AlkBVwG/AVoBWAFWAcEBXQFbAVgBywFcAVsBWAHGAVoBWAFWAcECWQFXAb8CWQFX\n        Ab8CWgFYAcACWwFZAcQBcwFvAWgB4gHKAb4BqwH5AV8BXAFZAc8BYwFgAVsB1gHXAc4BuQH8AWgBZQFh\n        AdwCWwFZAcQCWQFXAb8CWQFXAb8CWQFXAb8BWgFYAVYBwQFbAVkBWAHHAV4BXAFZAckBWgFYAVYBwQJZ\n        AVcBvwJaAVgBwAJbAVgBxgFZAUsBQgH1AWABWgFVAd4CWwFZAcMCWQFXAb8CWQFXAcIBZgFjAV4B2QHl\n        AdkBvQH9AXYBcAFpAeQBXAJZAcwB0wHLAbIB+wGkAZ0BjAHyAVsCWAHLAYIBewFyAeoBwwG6AaIB+AFi\n        AV4BWwHQAVoBWAFWAcECWgFYAcABXAFaAVcBxQFaAVgBUwHkAV0BVAFNAe0CWwFZAcQCWQFXAb8CWwFZ\n        AcQBXQFaAVcBxQJNAToB+gFhAVwBVwHfAV0BWgFXAcUBXQFbAVkBwwFbAVgBVgHBAloBWAHAAlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAVoBWQFXAcICWwFZ\n        AcQBXQFaAVcBxQFkAVwBVAHnAVwBTwFIAfACWwFZAcQBXQFbAVkBwwJaAVgBwAJbAVgBxgFQAUkBPwH2\n        AV4BWAFXAd0CWwFZAcMCWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWgFYAcABWwFZAVgBxwHRAckBrQH6\n        AaQBnQGOAfIBXAFaAVcBxQJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAJbAVkBxAFdAVoBVQHi\n        AV0BVAFNAe0CWwFZAcQCWQFXAb8CWQFXAb8BWgFYAVYBwQFcAVsBWAHGAlsBWQHEAloBWAHAAlkBVwG/\n        AlkBVwG/AloBWAHAAlsBWQHEAXMBbwFoAeIBygG+AasB+QFfAVwBWQHPAWMBYAFbAdYB1wHOAbkB/AFo\n        AWUBYQHcAlsBWQHEAlkBVwG/AlkBVwG/AlkBVwG/AVoBWAFWAcECWwFZAcQBXAFaAVcBxQFaAVgBVgHB\n        AlkBVwG/AloBWAHAAlsBWAHGAVABSQE/AfYBXgFYAVcB3QJbAVkBwwJZAVcBvwJZAVcBwgFmAWMBXgHZ\n        AeUB2QG9Af0BdgFwAWkB5AFcAlkBzAHTAcsBsgH7AaQBnQGMAfIBWwJYAcsBggF7AXIB6gHDAboBogH4\n        AWIBXgFbAdABWgFYAVYBwQJaAVgBwAJbAVkBxAFdAVoBVQHiAV0BVAFNAe0CWwFZAcQCWQFXAb8BXAFa\n        AVcBxQFkAV8BWgHbAWwBXwE8AfwBYgFhAVUB5AJbAVkBxAFdAVsBWQHDAVsBWAFWAcECWgFYAcACWQFX\n        Ab8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWgFYAcABWgFZAVcBwgJb\n        AVkBxAJbAVkBxAFmAV0BUQHtAWoBZwFEAfkBYwFeAVkB1wJbAVkBwwJaAVgBwAFcAVoBVwHFAVkBUwFH\n        AfIBYAFbAVYB4QJbAVkBwwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAFbAVkBWAHHAdEByQGt\n        AfoBpAGdAY4B8gFcAVoBVwHFAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAVwBWgFXAcUBXAFY\n        AVMB5wFcAVUBUAHqAlsBWQHEAlkBVwG/AloBWAHAAlsBWQHDAWABWAFTAecBXwJZAdcCWQFXAcICWQFX\n        Ab8CWQFXAb8CWgFYAcACWwFZAcQBcwFvAWgB4gHKAb4BqwH5AV8BXAFZAc8BYwFgAVsB1gHXAc4BuQH8\n        AWgBZQFhAdwCWwFZAcQCWQFXAb8CWQFXAb8CWgFYAcACWwFZAcMBXwFaAVgB2wFfAVwBVwHgAlkBVwHC\n        AlkBVwG/AloBWAHAAVwBWgFXAcUBWQFRAUgB8gFhAVsBVgHhAlsBWQHEAloBWAHAAlkBVwHCAWYBYwFe\n        AdkB5QHZAb0B/QF2AXABaQHkAVwCWQHMAdMBywGyAfsBpAGdAYwB8gFbAlgBywGCAXsBcgHqAcMBugGi\n        AfgBYgFeAVsB0AFaAVgBVgHBAloBWAHAAlsBWAHGAVwBWAFTAecBXAFVAVAB6gJbAVkBxAJZAVcBvwFm\n        AWEBWQHhAWoBXAFAAf0BbgFfAUwB8wFjAWABXAHUAlsBWQHEAlsBWQHEAVoBWQFXAcICWgFYAcACWQFX\n        Ab8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWgFYAcABWwFYAVYBwQFaAVkBVwHC\n        AlsBWQHEAV0BWwFZAcMBYQFeAVoB2AFpAWEBTgHwAWQBXwFEAfsBZAFfAVoB2wJaAVgBwAJbAVkBxAFc\n        AVgBUwHnAWABVwFRAesBXAFaAVcBxQJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAFbAVkBWAHH\n        AdEByQGtAfoBogGaAYsB8QFcAVoBVwHFAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AVoBWAFWAcEBWwFZ\n        AVgBxwFbAUwBRAHzAWEBWwFWAeECWwFZAcMCWQFXAb8CWgFYAcACWwFZAcQBXAFVAVAB6gFfAVcBUgHo\n        AlsBWQHEAloBWAHAAlkBVwG/AloBWAHAAlsBWQHEAXMBbwFoAeIBygG+AasB+QFeAVwBWgHOAWQBYAFb\n        AdYB1wHOAbkB/AFqAWQBXwHbAlsBWQHDAlkBVwG/AlkBVwG/AloBWAHAAlsBWAHGAVoBTgFHAfABYAFY\n        AVMB5AJbAVkBwwJZAVcBvwJaAVgBwAJbAVkBxAFfAVcBUgHoAVkBVwFPAewBYAFcAVkBzwJbAVkBxAJb\n        AVkBwwFmAWMBXgHZAeUB2QG9Af0BdgFwAWkB5AFbAlgBywHTAcsBsgH7AaQBnQGMAfIBWwJYAcsBggF7\n        AXIB6gHDAboBogH4AWEBXwFZAc8CWwFZAcMBXAFbAVgBxgFeAVwBWQHOAVsBTAFDAfMBXQFaAVUB4gJb\n        AVkBwwJZAVcBvwJdAVoBygFlAWEBWAHcAWoBYQFUAe4BbQFmAU8B9wFdAVwBWgHNAV0BWgFXAcUCWwFZ\n        AcQBWgFZAVcBwgFbAVgBVgHBAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAloBWAHAAVsBWAFW\n        AcEBXQFbAVkBwwJbAVkBxAFdAVoBVwHFAWEBXgFaAdgBbQFiATwB/AFvAWQBUwHxAWMBYQFYAdwBXAFa\n        AVcBxQJZAVcBvwJbAVkBwwFeAVoBWQHVAU8BSQE/AfYBXwJZAc8CWQFXAcICWQFXAb8CWQFXAb8CWQFX\n        Ab8CWgFYAcABXAFaAVcBxQHEAb0BpgH4AZoBkQGFAe8CWwFZAcQCWQFXAb8CWQFXAb8CWQFXAb8CWQFX\n        Ab8CWQFXAcIBXgFaAVgB2AFRAUgBMgH7AV0CWQHSAVoBWAFWAcECWQFXAb8CWQFXAb8CWwFZAcMBYQFc\n        AVkB2gFQAUkBPwH2AVwBWgFYAc0BWgFYAVYBwQJZAVcBvwJaAVgBwAJbAVkBwwFuAWkBYwHfAbQBrQGX\n        AfYBXgFcAVkBzAFiAV4BXQHTAcwBwAGtAfkBZwFjAV4B2AJZAVcBwgJZAVcBvwJZAVcBvwJZAVcBwgFg\n        AVwBWQHUAVEBSAEyAfsBYAFbAVcB1gJZAVcBwgJZAVcBvwJZAVcBvwJbAVkBwwFgAVsBVwHWAW4BXgFE\n        Af0BpwGKAWAB/AFfAV0BWgHTAVwBWgFXAcUBZgFjAV8B1wHTAcsBsgH7AXMBbwFoAeIBXAJZAckBywG/\n        AawB+QGcAZQBhgHwAVwBWwFZAcgBgQF8AXQB5wG0AawBlwH2AV8BXgFcAc4BXAFaAVcBxQFmAWEBWwHa\n        AZwBkgFfAfsBbQFgAUMB/gFdAVoBVwHTAlkBVwHCAlkBVwG/Al0BWgHKAWgBYgFOAe8BbgFkAVMB8QFr\n        AVwBQwH4AWQBXwFXAeMBXAFaAVkBxwFdAVsBWAHGAlsBWQHEAVoBWQFXAcIBWwFYAVYBwQJaAVgBwAJa\n        AVgBwAJaAVgBwAJaAVgBwAFbAVgBVgHBAV0BWwFZAcMBXQFaAVcBxQFdAVsBWAHGAl0BWgHKAWQBYAFP\n        AfEBZgFlAVAB9AFpAWEBTgHwAWYBYQFTAeoCWwFZAcMCWQFXAb8BWgFYAVYBwQFbAVoBWAHGAV0BVAFN\n        Ae0BYAFaAVUB3gFcAVoBVwHFAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlsBWQHDAWkBYwFgAdcBZQFj\n        AWAB1AJZAVcBwgJZAVcBvwJZAVcBvwJZAVcBvwFaAVgBVgHBAV0BWwFaAcgBXAFVAU0B6gFgAVcBUQHr\n        AVwBWgFXAcUCWgFYAcACWQFXAb8CWQFXAb8BWgFYAVYBwQFbAVkBWAHHAVoBTgFHAfABYQFbAVYB3AFc\n        AVoBVwHFAloBWAHAAloBWAHAAVoBWAFWAcEBXgFbAVgBywFhAV8BXQHSAVwBWgFXAcUBXAJZAccBYgFf\n        AV0B0wFeAVwBWwHIAVoBWAFWAcECWgFYAcABWgFYAVYBwQFbAVkBWAHHAV8BVwFSAegBWAFSAUoB7wFb\n        AVoBWAHGAloBWAHAAlkBVwG/AlkBVwG/AVoBWAFWAcEBWwFZAVgBxwFoAWMBSwHyAbUBngFiAf8BhgF7\n        AWAB8QFbAVkBWAHHAV4BWwFYAcsBbQFoAWMB2gFhAWABXAHPAlsBWQHEAWkBZQFgAdkBaAFjAWAB1gJb\n        AVkBxAFhAV8BXQHSAWcBYwFfAdgBXgJbAcgBWwFZAVgBxwGKAX4BXwHzAa4BmAFeAf8BYgFYAUwB7wFb\n        AVoBWAHGAloBWAHAAlkBVwG/AVoBWAFWAcEBXAFbAVgBxgFeAVwBWwHIAWMBYAFbAdQBWQFKAUIB9QFh\n        AV8BVgHeAV4BXAFbAcgBXAFaAVkBxwFdAVoBVwHFAV0BWwFZAcMBWgFZAVcBwgFbAVgBVgHBAVsBWAFW\n        AcECWwFZAcMCWwFZAcQBXQFbAVgBxgFeAVwBWwHIAV4BXAFbAcgBYAFZAVYB4wFYAVcBSgHvAV0BXAFa\n        Ac0BXAFbAVgBxgJbAVkBwwJaAVgBwAJZAVcBvwJaAVgBwAJbAVkBwwFeAVoBWQHVAlIBQAH0AWABWwFX\n        AdYCWwFZAcQCWgFYAcACWQFXAb8CWQFXAb8CWgFYAcABWgFYAVYBwQFaAVgBVgHBAloBWAHAAlkBVwG/\n        AlkBVwG/AVoBWAFWAcEBXAFaAVcBxQFhAVsBVgHcAVkBUwFHAfIBXwJZAc8CWQFXAcICWQFXAb8CWQFX\n        Ab8CWQFXAb8CWgFYAcACWwFZAcMBXgJZAdcBWwFMAUQB8wFgAVwBWQHUAlsBWQHEAloBWAHAAloBWAHA\n        AloBWAHAAVoBWAFWAcECWgFYAcACWgFYAcABWgFYAVYBwQJaAVgBwAJaAVgBwAFaAVgBVgHBAlsBWQHE\n        AWEBXAFZAdoBWQFRAUcB8gFeAlgB0QJZAVcBwgJaAVgBwAJZAVcBvwJZAVcBvwJaAVgBwAJbAVkBwwFf\n        AlkB1wF7AW8BTQH6AWcBZQFXAeUBXQFbAVkByAJZAVcBwgFaAVgBVgHBAVoBWAFWAcECWgFYAcABWgFY\n        AVYBwQFaAVgBVgHBAloBWAHAAVoBWAFWAcEBWgFYAVYBwQJbAVkBwwFcAlkByQFqAWIBVAHqAWgBYgFI\n        AfYBXgFbAVkB0AJZAVcBwgJaAVgBwAJZAVcBvwJaAVgBwAFaAVkBVwHCAlsBWQHEAV0BWwFYAcYBYQFc\n        AVcB3AFLAUIBMgH7AWABXQFWAeMBXwFdAVoBygFcAVoBWQHHAV0BWwFYAcYCWwFZAcQBXQFbAVkBwwFd\n        AVsBWQHDAlsBWQHEAV0BWwFYAcYBXgFcAVsByAFeAVsBWAHLAWIBWAFRAekBUgFRATsB9wFgAV0BWAHR\n        AV0BWwFYAcYBXQFbAVkBwwFbAVgBVgHBAloBWAHAAlkBVwG/AlkBVwG/AloBWAHAAVwBWgFXAcUBXwFY\n        AVMB4wFSAVEBOwH3AWABWwFXAdYBXAFaAVcBxQJZAVcBwgJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBvwJa\n        AVgBwAJaAVgBwAJZAVcBwgFbAVkBWAHHAV4BWgFWAdkBTgFJAT0B9gFeAlkB1wJbAVkBxAJaAVgBwAJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJaAVgBwAJbAVgBxgFeAVkBVgHlAVIBUQE7AfcBXgFaAVkB1QFc\n        AVoBVwHFAVoBWAFWAcEBWgFYAVYBwQFaAVgBVgHBAlsBWQHDAlkBVwHCAVoBWAFWAcECWgFYAcACWQFX\n        AcIBWwFZAVgBxwFdAlkB1wFPAUkBPQH2AV4BWgFWAdkCWwFZAcQCWgFYAcACWQFXAb8CWQFXAb8CWQFX\n        Ab8CWQFXAb8CWgFYAcACWwFYAcYBXgFZAVQB5QFSAVEBOwH3AV4BWgFZAdUBXAFaAVcBxQFaAVgBVgHB\n        AloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAlkBVwHCAVsBWQFYAccBXgFaAVYB2AFO\n        AUkBPQH2AV4BWgFWAdkCWwFZAcQCWgFYAcACWQFXAb8CWQFXAb8CWgFYAcABWwFYAVYBwQFdAVsBWQHD\n        AV0BWgFXAcUBXAFaAVkBxwFjAV8BWgHbAlIBQQH0AWABWQFTAesBYQFdAVkB1wFfAV4BWwHOAV0BWgFX\n        AcUCWwFZAcQCWwFZAcQBXAFaAVkBxwFgAV4BWwHQAWIBXgFaAdoBWgFTAUkB8QFdAUwBRAHzAWEBXQFZ\n        AdcBXAFaAVkBxwFdAVoBVwHFAVoBWQFXAcIBWwFYAVYBwQJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBvwFa\n        AVgBVgHBAV0BWwFaAcgBXwFYAVMB4wJSAUAB9AFgAVoBVQHeAV8CWQHPAVwBWgFXAcUCWwFZAcMCWwFZ\n        AcMCWwFZAcMCWwFZAcQBXAFaAVcBxQFeAVsBWQHQAV4BWQFUAeUBWQFKAUIB9QFgAVoBVQHeAVwBWgFX\n        AcUBWgFYAVYBwQJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwFaAVgBVgHBAV0CWgHK\n        AV4BWQFUAeUCUgFBAfQBXgFYAVcB3QFfAlkBzwFbAVoBWAHGAWABXgFbAdABZgFhAVsB2gFkAV8BWQHZ\n        AV0BWwFYAcsBWwFaAVgBxgFeAVsBWQHQAV8BWAFTAeQBWQFKAUIB9QFfAVwBVwHgAVsBWQFYAccBWgFY\n        AVYBwQJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwFaAVgBVgHBAV0CWgHKAV4BWQFW\n        AeUBXAFMAUQB8wFhAVsBVgHcAVwBWgFYAc0CWwFZAcQCWQFXAcICWgFYAcACWgFYAcACWQFXAcICWwFZ\n        AcQBXwJZAc8BXwFYAVMB4wFZAUoBQgH1AWEBWwFWAeEBWwFZAVgBxwFaAVgBVgHBAlkBVwG/AlkBVwG/\n        AlkBVwG/AloBWAHAAloBWAHAAVsBWAFWAcEBXQFbAVkBwwFdAVsBWAHGAVwBWwFZAccBXwFeAVsBzgFh\n        AVsBWAHhAV0BTAFEAfMBUwFRAT4B9wFtAWQBUgHxAWMBXwFXAd8BYwFfAVcB3wFpAWYBSwHyAVsBUAE+\n        AfgBWwFTAUkB8QFiAV4BWgHaAV8BXAFZAcwBXAFaAVkBxwFdAVoBVwHFAlsBWQHDAVsBWAFWAcECWgFY\n        AcACWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8BWgFYAVYBwQFcAVoBVwHFAV4BWgFZAdUBXQFU\n        AU0B7QFPAUkBPwH2AWABVwFRAesBYAFbAVYB4QFeAVgBVwHdAV4BWAFXAd0BXwFYAVMB5AFbAVgBTwHs\n        AVABSQE/AfYBXwFXAVIB6AFdAlgB0QFcAVoBVwHFAVoBWAFWAcECWQFXAb8CWQFXAb8CWQFXAb8CWQFX\n        Ab8CWQFXAb8CWQFXAb8CWQFXAb8CWgFYAcABWgFYAVYBwQFcAVoBVwHFAV4BWgFZAdUBWQFUAUoB7gFP\n        AUkBPwH2AV8BVwFRAesBeQFqAVkB8gGtAZUBaAH+AbABnQFcAf0BZwFdAVIB7QFaAVgBTwHsAVABSQE/\n        AfYBWwFYAVAB6QFdAlkB0gFcAVoBVwHFAVoBWAFWAcECWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFX\n        Ab8CWQFXAb8CWQFXAb8CWgFYAcABWgFYAVYBwQJbAVgBxgFgAVsBVwHWAVoBTgFHAfABUAFJAT8B9gFb\n        AVgBUAHpAV4BWgFYAdgCWwFZAcQBXAFaAVcBxQFfAVoBWAHbAVwBVQFNAeoBWQFLAUIB9QFbAVcBTwHs\n        AV0BWgFXAdMBXAFaAVcBxQFaAVgBVgHBAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHA\n        AloBWAHAAVsBWAFWAcEBXQFbAVkBwwFdAVoBVwHFAV0BWwFYAcYBXQFbAVgBxgFdAVoBVwHFAV8BXQFZ\n        AdIBbgFbAUoB+gFuAV8BTAHzAWoBYQFTAe4BbgFcAUUB+AFeAVsBWAHLAV0BWwFYAcYBXQFbAVgBxgFd\n        AVsBWAHGAlsBWQHEAVoBWQFXAcIBWwFYAVYBwQJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJaAVgBwAJbAVkBwwFbAVoBWAHGAV4BWgFZAdUBXAFYAVMB5wFZAVMBRwHy\n        AVABSQE/AfYBWQFLAUIB9QFaAU4BRwHwAWEBWAFSAeYBXQJZAdIBXAFaAVcBxQJZAVcBwgJaAVgBwAJZ\n        AVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJa\n        AVgBwAJbAVkBwwFbAVoBWAHGAWABWwFXAdYBXwFXAVIB6AFfAV0BTAHzAWkBXAFFAfgBbQFiAU8B9wFg\n        AVMBSQHxAWEBWAFSAeYBXQFaAVcB0wFcAVoBVwHFAlkBVwHCAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAlsBWQHDAVsCWAHG\n        AWEBXAFZAdoBXAFVAU0B6gFfAVcBUgHoAVwBWwFYAcYBXgFcAVkByQFeAVgBUAHpAV8BVwFSAegBYAFb\n        AVcB1gJbAVgBxgJZAVcBwgJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJaAVgBwAJaAVgBwAFbAVgBVgHBAVoBWQFXAcICWwFZAcQCWwFZAcQBXQFaAVcBxQFdAVoBVwHF\n        AWkBYQFTAe4BbQFfAUwB8wFpAWIBTgHvAWYBYQFaAeACWwFZAcQBXQFaAVcBxQJbAVkBxAFdAVsBWQHD\n        AVoBWQFXAcIBWwFYAVYBwQJaAVgBwAJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZAVcBvwJZ\n        AVcBvwJZAVcBvwJZAVcBvwJaAVgBwAFaAVgBVgHBAlsBWQHDAlsBWQHEAVwBWgFXAcUCWwFYAcYCWwFY\n        AcYBXAFaAVcBxQJbAVkBxAJZAVcBwgFaAVgBVgHBAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAVoBWAFW\n        AcECWwFZAcMBXAFaAVcBxQFbAVoBWAHGAVsBWQFYAccBWwFZAVgBxwJbAVgBxgJbAVkBxAJZAVcBwgFa\n        AVgBVgHBAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAVoBWAFWAcECWwFZAcMCWwFZAcQCWwFZAcMBWgFY\n        AVYBwQFaAVgBVgHBAlsBWQHDAlsBWQHEAlsBWQHDAVoBWAFWAcECWgFYAcACWQFXAb8CWQFXAb8CWQFX\n        Ab8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWQFXAb8CWgFYAcACWgFYAcABWwFY\n        AVYBwQFaAVkBVwHCAVoBWQFXAcIBWwFYAVYBwQFfAV4BWgHOAV8BXQFaAdMBYAFdAVgB0QFeAlsByAFb\n        AVgBVgHBAVoBWQFXAcIBWwFYAVYBwQFbAVgBVgHBAloBWAHAAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AloBWAHAAloBWAHAAloBWAHAAloBWAHAAloBWAHAAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAloBWAHAAloBWAHAAloBWAHAAloBWAHAAloBWAHA\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AloBWAHAAloBWAHA\n        AlkBVwG/AlkBVwG/AloBWAHAAloBWAHAAlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/AlkBVwG/\n        AlkBVwG/AlkBVwG/AlkBVwG/AUIBTQE+BwABPgMAASgDAAFgAwABMAMAAQEBAAEBBQABQAECFgAD//8A\n        /wBDAAs=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/EveObjectBrowserControl.Designer.cs",
    "content": "using EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.SkillPlanner\n{\n    partial class EveObjectBrowserControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EveObjectBrowserControl));\n            this.scObjectBrowser = new PersistentSplitContainer();\n            this.pnlDetails = new System.Windows.Forms.Panel();\n            this.scDetails = new System.Windows.Forms.SplitContainer();\n            this.scDetailsRight = new System.Windows.Forms.SplitContainer();\n            this.gbDescription = new System.Windows.Forms.GroupBox();\n            this.tbDescription = new System.Windows.Forms.RichTextBox();\n            this.pnlBrowserHeader = new System.Windows.Forms.Panel();\n            this.eoImage = new EVEMon.Common.Controls.EveImage();\n            this.lblEveObjCategory = new System.Windows.Forms.Label();\n            this.lblEveObjName = new System.Windows.Forms.Label();\n            this.lblHelp = new System.Windows.Forms.Label();\n            ((System.ComponentModel.ISupportInitialize)(this.scObjectBrowser)).BeginInit();\n            this.scObjectBrowser.Panel2.SuspendLayout();\n            this.scObjectBrowser.SuspendLayout();\n            this.pnlDetails.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.scDetails)).BeginInit();\n            this.scDetails.Panel2.SuspendLayout();\n            this.scDetails.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.scDetailsRight)).BeginInit();\n            this.scDetailsRight.Panel1.SuspendLayout();\n            this.scDetailsRight.SuspendLayout();\n            this.gbDescription.SuspendLayout();\n            this.pnlBrowserHeader.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // scObjectBrowser\n            // \n            this.scObjectBrowser.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.scObjectBrowser.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;\n            this.scObjectBrowser.Location = new System.Drawing.Point(0, 0);\n            this.scObjectBrowser.Margin = new System.Windows.Forms.Padding(2);\n            this.scObjectBrowser.Name = \"scObjectBrowser\";\n            this.scObjectBrowser.Panel1MinSize = 45;\n            // \n            // scObjectBrowser.Panel2\n            // \n            this.scObjectBrowser.Panel2.Controls.Add(this.pnlDetails);\n            this.scObjectBrowser.Panel2.Controls.Add(this.pnlBrowserHeader);\n            this.scObjectBrowser.Panel2.Controls.Add(this.lblHelp);\n            this.scObjectBrowser.RememberDistanceKey = null;\n            this.scObjectBrowser.Size = new System.Drawing.Size(650, 413);\n            this.scObjectBrowser.SplitterDistance = 163;\n            this.scObjectBrowser.SplitterWidth = 5;\n            this.scObjectBrowser.TabIndex = 0;\n            // \n            // pnlDetails\n            // \n            this.pnlDetails.Controls.Add(this.scDetails);\n            this.pnlDetails.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pnlDetails.Location = new System.Drawing.Point(0, 70);\n            this.pnlDetails.Name = \"pnlDetails\";\n            this.pnlDetails.Size = new System.Drawing.Size(482, 343);\n            this.pnlDetails.TabIndex = 13;\n            // \n            // scDetails\n            // \n            this.scDetails.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.scDetails.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\n            this.scDetails.Location = new System.Drawing.Point(0, 0);\n            this.scDetails.Name = \"scDetails\";\n            // \n            // scDetails.Panel2\n            // \n            this.scDetails.Panel2.Controls.Add(this.scDetailsRight);\n            this.scDetails.Panel2MinSize = 240;\n            this.scDetails.Size = new System.Drawing.Size(482, 343);\n            this.scDetails.SplitterDistance = 238;\n            this.scDetails.TabIndex = 13;\n            // \n            // scDetailsRight\n            // \n            this.scDetailsRight.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.scDetailsRight.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\n            this.scDetailsRight.Location = new System.Drawing.Point(0, 0);\n            this.scDetailsRight.Name = \"scDetailsRight\";\n            this.scDetailsRight.Orientation = System.Windows.Forms.Orientation.Horizontal;\n            // \n            // scDetailsRight.Panel1\n            // \n            this.scDetailsRight.Panel1.Controls.Add(this.gbDescription);\n            this.scDetailsRight.Panel1MinSize = 100;\n            this.scDetailsRight.Panel2MinSize = 104;\n            this.scDetailsRight.Size = new System.Drawing.Size(240, 343);\n            this.scDetailsRight.SplitterDistance = 230;\n            this.scDetailsRight.TabIndex = 0;\n            // \n            // gbDescription\n            // \n            this.gbDescription.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.gbDescription.Controls.Add(this.tbDescription);\n            this.gbDescription.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbDescription.Location = new System.Drawing.Point(0, 0);\n            this.gbDescription.Name = \"gbDescription\";\n            this.gbDescription.Size = new System.Drawing.Size(240, 230);\n            this.gbDescription.TabIndex = 14;\n            this.gbDescription.TabStop = false;\n            this.gbDescription.Text = \"Description\";\n            // \n            // tbDescription\n            // \n            this.tbDescription.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tbDescription.Location = new System.Drawing.Point(3, 16);\n            this.tbDescription.Name = \"tbDescription\";\n            this.tbDescription.ReadOnly = true;\n            this.tbDescription.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;\n            this.tbDescription.Size = new System.Drawing.Size(234, 211);\n            this.tbDescription.TabIndex = 0;\n            this.tbDescription.Text = \"\";\n            // \n            // pnlBrowserHeader\n            // \n            this.pnlBrowserHeader.Controls.Add(this.eoImage);\n            this.pnlBrowserHeader.Controls.Add(this.lblEveObjCategory);\n            this.pnlBrowserHeader.Controls.Add(this.lblEveObjName);\n            this.pnlBrowserHeader.Dock = System.Windows.Forms.DockStyle.Top;\n            this.pnlBrowserHeader.Location = new System.Drawing.Point(0, 0);\n            this.pnlBrowserHeader.Name = \"pnlBrowserHeader\";\n            this.pnlBrowserHeader.Size = new System.Drawing.Size(482, 70);\n            this.pnlBrowserHeader.TabIndex = 12;\n            // \n            // eoImage\n            // \n            this.eoImage.ImageSize = EveImageSize.x64;\n            this.eoImage.Location = new System.Drawing.Point(3, 3);\n            this.eoImage.Name = \"eoImage\";\n            this.eoImage.PopUpEnabled = true;\n            this.eoImage.Size = new System.Drawing.Size(64, 64);\n            this.eoImage.SizeMode = EveImageSizeMode.Normal;\n            this.eoImage.TabIndex = 8;\n            // \n            // lblEveObjCategory\n            // \n            this.lblEveObjCategory.AutoSize = true;\n            this.lblEveObjCategory.Location = new System.Drawing.Point(70, 3);\n            this.lblEveObjCategory.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n            this.lblEveObjCategory.Name = \"lblEveObjCategory\";\n            this.lblEveObjCategory.Size = new System.Drawing.Size(102, 13);\n            this.lblEveObjCategory.TabIndex = 6;\n            this.lblEveObjCategory.Text = \"EveObject Category\";\n            this.lblEveObjCategory.UseMnemonic = false;\n            // \n            // lblEveObjName\n            // \n            this.lblEveObjName.AutoSize = true;\n            this.lblEveObjName.Location = new System.Drawing.Point(70, 16);\n            this.lblEveObjName.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);\n            this.lblEveObjName.Name = \"lblEveObjName\";\n            this.lblEveObjName.Size = new System.Drawing.Size(131, 18);\n            this.lblEveObjName.TabIndex = 7;\n            this.lblEveObjName.Text = \"EveObject Name\";\n            // \n            // lblHelp\n            // \n            this.lblHelp.AutoSize = true;\n            this.lblHelp.Location = new System.Drawing.Point(3, 3);\n            this.lblHelp.Name = \"lblHelp\";\n            this.lblHelp.Size = new System.Drawing.Size(378, 65);\n            this.lblHelp.TabIndex = 1;\n            this.lblHelp.Text = resources.GetString(\"lblHelp.Text\");\n            // \n            // EveObjectBrowserControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.scObjectBrowser);\n            this.Name = \"EveObjectBrowserControl\";\n            this.Size = new System.Drawing.Size(650, 413);\n            this.scObjectBrowser.Panel2.ResumeLayout(false);\n            this.scObjectBrowser.Panel2.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.scObjectBrowser)).EndInit();\n            this.scObjectBrowser.ResumeLayout(false);\n            this.pnlDetails.ResumeLayout(false);\n            this.scDetails.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.scDetails)).EndInit();\n            this.scDetails.ResumeLayout(false);\n            this.scDetailsRight.Panel1.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.scDetailsRight)).EndInit();\n            this.scDetailsRight.ResumeLayout(false);\n            this.gbDescription.ResumeLayout(false);\n            this.pnlBrowserHeader.ResumeLayout(false);\n            this.pnlBrowserHeader.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        protected PersistentSplitContainer scObjectBrowser;\n        protected EVEMon.Common.Controls.EveImage eoImage;\n        protected System.Windows.Forms.Label lblEveObjCategory;\n        protected System.Windows.Forms.Label lblEveObjName;\n        protected System.Windows.Forms.Panel pnlDetails;\n        protected System.Windows.Forms.Panel pnlBrowserHeader;\n        protected System.Windows.Forms.Label lblHelp;\n        protected System.Windows.Forms.SplitContainer scDetailsRight;\n        protected System.Windows.Forms.SplitContainer scDetails;\n        protected System.Windows.Forms.GroupBox gbDescription;\n        protected System.Windows.Forms.RichTextBox tbDescription;\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/EveObjectBrowserControl.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Collections;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Base class for EveObject browsers.\n    /// Provides basic split container layout and item header including icon, name and category, \n    /// along with event handling for item selection and worksafeMode changes.\n    /// </summary>\n    /// <remarks>\n    /// Should be an abstract class but Visual Studio Designer throws a wobbler when you\n    /// try to design a class that inherits from an abstract class.\n    /// </remarks>\n    internal partial class EveObjectBrowserControl : UserControl\n    {\n        protected const int Pad = 3;\n\n        private Plan m_plan;\n\n\n        #region Initialization\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        protected EveObjectBrowserControl()\n        {\n            InitializeComponent();\n            lblEveObjName.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            SelectControl.SelectionChanged -= OnSelectionChanged;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.PlanChanged -= EveMonClient_PlanChanged;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// Occurs when the control is loaded.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            ListViewHelper.EnableDoubleBuffer(PropertiesList);\n            PropertiesList.ShowItemToolTips = true;\n\n            lblEveObjName.Font = FontFactory.GetFont(\"Tahoma\", 11.25F, FontStyle.Bold);\n\n            // Watch for selection changes\n            SelectControl.SelectionChanged += OnSelectionChanged;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.PlanChanged += EveMonClient_PlanChanged;\n            Disposed += OnDisposed;\n\n            // Reposition the help text along side the treeview\n            Control[] result = SelectControl.Controls.Find(\"lowerPanel\", true);\n            if (result.Length > 0)\n                lblHelp.Location = new Point(lblHelp.Location.X, result[0].Location.Y);\n\n            // Updates the controls visibility\n            UpdateControlsVisibility();\n\n            // Force a refresh\n            UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the character.\n        /// </summary>\n        /// <value>\n        /// The character.\n        /// </value>\n        internal Character Character\n        {\n            get { return SelectControl.Character; }\n            set\n            {\n                if (SelectControl.Character == value)\n                    return;\n\n                SelectControl.Character = value;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the current plan for this planner window.\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                m_plan = value;\n                SelectControl.Plan = value;\n                OnSelectedPlanChanged();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the currently selected object.\n        /// </summary>\n        internal Item SelectedObject\n        {\n            get { return SelectControl?.SelectedObject; }\n            set\n            {\n                if (SelectControl == null)\n                    return;\n\n                SelectControl.SelectedObject = value;\n            }\n        }\n\n        #endregion\n\n\n        #region Protected Properties\n\n        /// <summary>\n        /// Gets or sets the select control.\n        /// </summary>\n        /// <value>The select control.</value>\n        protected EveObjectSelectControl SelectControl { get; set; }\n\n        /// <summary>\n        /// Gets or sets the properties list.\n        /// </summary>\n        /// <value>The properties list.</value>\n        protected ListView PropertiesList { get; set; }\n\n        #endregion\n\n\n        #region Events\n\n        /// <summary>\n        /// Updates whenever the selected plan changed.\n        /// </summary>\n        /// <remarks>This virtual method is implemented in classes that inherit from EveObjectBrowserControl.</remarks>\n        protected virtual void OnSelectedPlanChanged()\n        {\n        }\n\n        /// <summary>\n        /// Updates whenever the plan changed.\n        /// </summary>\n        /// <remarks>This virtual method is implemented in classes that inherit from EveObjectBrowserControl.</remarks>\n        protected virtual void OnPlanChanged()\n        {\n        }\n\n        /// <summary>\n        /// Updates the controls when the selection is changed.\n        /// </summary>\n        protected virtual void OnSelectionChanged()\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Occurs when the settings changed.\n        /// </summary>\n        protected virtual void OnSettingsChanged()\n        {\n            UpdateControlsVisibility();\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// When the current plan changes (new skills, etc), we need to update some informations.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_PlanChanged(object sender, PlanChangedEventArgs e)\n        {\n            if ((e.Plan != m_plan) || (e.Plan.Character != m_plan.Character))\n                return;\n\n            OnPlanChanged();\n        }\n\n        /// <summary>\n        /// Occurs when the settings changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            OnSettingsChanged();\n        }\n\n        /// <summary>\n        /// Occurs when the selection changed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnSelectionChanged(object sender, EventArgs e)\n        {\n            OnSelectionChanged();\n        }\n\n        #endregion\n\n\n        #region Selection management\n\n        private void UpdateContent()\n        {\n            // Updates the header and the panels visibility.\n            Item firstSelected = SelectControl.SelectedObject;\n            if (firstSelected == null)\n            {\n                // Hide details and header\n                pnlDetails.Visible = false;\n                pnlBrowserHeader.Visible = false;\n\n                // View help message\n                lblHelp.Visible = true;\n\n                // Done\n                return;\n            }\n\n            // Hide help message\n            lblHelp.Visible = false;\n\n            // View details and header\n            pnlBrowserHeader.Visible = true;\n            pnlDetails.Visible = true;\n\n            // Display details\n            eoImage.EveItem = firstSelected;\n            lblEveObjName.Text = firstSelected.Name;\n            lblEveObjCategory.Text = firstSelected.CategoryPath;\n\n            // Stop here if it's the blueprint tab\n            if (SelectControl is BlueprintSelectControl)\n                return;\n\n            // Fill the list view\n            UpdatePropertiesList();\n        }\n\n        /// <summary>\n        /// Refresh the properties list.\n        /// </summary>\n        private void UpdatePropertiesList()\n        {\n            int scrollBarPosition = PropertiesList.GetVerticalScrollBarPosition();\n\n            // Store the selected item (if any) to restore it after the update\n            int selectedItem = PropertiesList.SelectedItems.Count > 0\n                ? PropertiesList.SelectedItems[0].Tag.GetHashCode()\n                : 0;\n\n            PropertiesList.BeginUpdate();\n            try\n            {\n                // Refresh columns\n                PropertiesList.Columns.Clear();\n                PropertiesList.Columns.Add(\"Attribute\");\n                foreach (Item obj in SelectControl.SelectedObjects)\n                {\n                    PropertiesList.Columns.Add(obj.Name);\n                }\n\n                // Prepare properties list\n                IEnumerable<ListViewItem> items = AddPropertyGroups();\n\n                // Fetch the new items to the list view\n                PropertiesList.Items.Clear();\n                PropertiesList.Items.AddRange(items.ToArray());\n\n                if (PropertiesList.Items.Count > 0)\n                    AdjustColumns();\n\n                // Restore the selected item (if any)\n                if (selectedItem <= 0)\n                    return;\n\n                foreach (ListViewItem lvItem in PropertiesList.Items.Cast<ListViewItem>().Where(\n                    lvItem => lvItem.Tag.GetHashCode() == selectedItem))\n                {\n                    lvItem.Selected = true;\n                }\n            }\n            finally\n            {\n                PropertiesList.EndUpdate();\n                PropertiesList.SetVerticalScrollBarPosition(scrollBarPosition);\n            }\n        }\n\n        /// <summary>\n        /// Adds the property groups.\n        /// </summary>\n        /// <returns></returns>\n        private IEnumerable<ListViewItem> AddPropertyGroups()\n        {\n            PropertiesList.Groups.Clear();\n            List<ListViewItem> items = new List<ListViewItem>();\n            foreach (EvePropertyCategory category in StaticProperties.AllCategories)\n            {\n                ListViewGroup group = new ListViewGroup(category.DisplayName);\n                bool hasProps = false;\n\n                foreach (EveProperty prop in category)\n                {\n                    // Skip the 'moon mining amount' property\n                    if (prop.ID == DBConstants.MoonMiningAmountPropertyID)\n                        continue;\n\n                    // Checks whether we must display this property\n                    bool visibleProperty = false;\n\n                    // Some properties should be always visible (fitting, shields resists, etc)\n                    if (this is ShipBrowserControl)\n                        visibleProperty = prop.AlwaysVisibleForShips;\n\n                    // Or we check whether any object has this property\n                    if (!visibleProperty)\n                        visibleProperty = SelectControl.SelectedObjects.Any(x => x.Properties[prop.ID].HasValue);\n\n                    // Some properties should be hidden if they have the default value (sensor strenght, em damage, etc)\n                    if (prop.HideIfDefault)\n                    {\n                        visibleProperty = SelectControl.SelectedObjects.Any(\n                            x =>\n                            {\n                                EvePropertyValue? eveProperty = x.Properties[prop.ID];\n                                return eveProperty != null && prop.DefaultValue != eveProperty.Value.Value;\n                            });\n                    }\n\n                    // We hide the reprocessing skill here and make it visible in the \"Reprocessing Info\" section\n                    if (prop.ID == DBConstants.ReprocessingSkillPropertyID)\n                        visibleProperty = false;\n\n                    // Jump to next property if not visible\n                    if (!visibleProperty)\n                        continue;\n\n                    hasProps = true;\n\n                    // Retrieve the data to put in the columns\n                    AddPropertyValue(items, group, prop);\n                }\n\n                // Check if the objects belong to an item family that has fitting slot property \n                if (category.Name == DBConstants.GeneralCategoryName && SelectControl.SelectedObjects.Any(\n                    x => (x.Family == ItemFamily.Item || x.Family == ItemFamily.Drone) &&\n                         x.FittingSlot != ItemSlot.NoSlot && x.FittingSlot != ItemSlot.None))\n                {\n                    AddFittingSlotProperty(items, group);\n                }\n\n                // Add properties\n                if (hasProps)\n                    PropertiesList.Groups.Add(group);\n            }\n\n            // Add the reaction info\n            AddReactionInfo(items);\n\n            // Add the control tower fuel info\n            AddControlTowerFuelInfo(items);\n\n            // Add the reprocessing-refining info \n            AddReprocessingInfo(items);\n\n            return items;\n        }\n\n        /// <summary>\n        /// Adds the property value.\n        /// </summary>\n        /// <param name=\"items\">The list of items.</param>\n        /// <param name=\"group\">The listGroup.</param>\n        /// <param name=\"prop\">The property.</param>\n        private void AddPropertyValue(ICollection<ListViewItem> items, ListViewGroup group, EveProperty prop)\n        {\n            string[] labels = SelectControl.SelectedObjects.Select(prop.GetLabelOrDefault).ToArray();\n            double[] values = SelectControl.SelectedObjects.Select(prop.GetNumericValue).ToArray();\n\n            // Create the list view item\n            ListViewItem item = new ListViewItem(group) { ToolTipText = prop.Description, Text = prop.Name, Tag = prop };\n            items.Add(item);\n\n            AddValueForSelectedObjects(prop, item, labels, values);\n        }\n\n        /// <summary>\n        /// Adds the value for selected objects.\n        /// </summary>\n        /// <param name=\"prop\">The evaluated EveProperty.</param>\n        /// <param name=\"item\">The list of items.</param>\n        /// <param name=\"labels\">The labels.</param>\n        /// <param name=\"values\">The values.</param>\n        private void AddValueForSelectedObjects(EveProperty prop, ListViewItem item, IList<string> labels, IList<double> values)\n        {\n            double min = 0f;\n            double max = 0f;\n            bool allEqual = true;\n\n            if (values.Any())\n            {\n                min = values.Min();\n                max = values.Max();\n                allEqual = values.All(x => Math.Abs(x - min) < float.Epsilon);\n                if (prop != null && !prop.HigherIsBetter)\n                {\n                    double temp = min;\n                    min = max;\n                    max = temp;\n                }\n            }\n\n            // Add the value for every selected item\n            for (int index = 0; index < SelectControl.SelectedObjects.Count(); index++)\n            {\n                // Create the subitem and choose its forecolor\n                ListViewItem.ListViewSubItem subItem = new ListViewItem.ListViewSubItem(item, labels[index]);\n                if (!allEqual)\n                {\n                    if (Math.Abs(values[index] - max) < float.Epsilon)\n                        subItem.ForeColor = Color.DarkGreen;\n                    else if (Math.Abs(values[index] - min) < float.Epsilon)\n                        subItem.ForeColor = Color.DarkRed;\n\n                    item.UseItemStyleForSubItems = false;\n                }\n                else if (SelectControl.SelectedObjects.Count() > 1)\n                {\n                    subItem.ForeColor = Color.DarkGray;\n                    item.UseItemStyleForSubItems = false;\n                }\n\n                item.SubItems.Add(subItem);\n            }\n        }\n\n        /// <summary>\n        /// Adds the fitting slot property.\n        /// </summary>\n        /// <param name=\"items\">The list of items.</param>\n        /// <param name=\"group\">The listGroup.</param>\n        private void AddFittingSlotProperty(ICollection<ListViewItem> items, ListViewGroup group)\n        {\n            string[] labels = SelectControl.SelectedObjects.Select(x => x.FittingSlot.ToString()).ToArray();\n\n            // Create the list view item\n            ListViewItem item = new ListViewItem(group)\n            { ToolTipText = \"The slot that this item fits in\", Text = @\"Fitting Slot\", Tag = Text };\n            items.Add(item);\n\n            // Add the value for every selected item\n            AddValueForSelectedObjects(null, item, labels, new double[] { });\n        }\n\n        /// <summary>\n        /// Adds the control tower fuel info.\n        /// </summary>\n        /// <param name=\"items\">The items.</param>\n        private void AddControlTowerFuelInfo(ICollection<ListViewItem> items)\n        {\n            if (SelectControl.SelectedObjects.All(x => !x.ControlTowerFuel.Any()))\n                return;\n\n            EveProperty prop = StaticProperties.GetPropertyByName(DBConstants.ConsumptionRatePropertyName);\n            IList<SerializableControlTowerFuel> fuelMaterials = SelectControl.SelectedObjects.Where(\n                x => x.ControlTowerFuel.Any()).SelectMany(x => x.ControlTowerFuel).ToList();\n\n            foreach (string purpose in fuelMaterials.Select(x => x.Purpose).Distinct())\n            {\n                string groupName = $\"Fuel Requirements - {purpose}\";\n                ListViewGroup group = new ListViewGroup(groupName);\n\n                foreach (Item item in StaticItems.AllItems.OrderBy(x => x.ID))\n                {\n                    if (fuelMaterials.Where(x => x.Purpose == purpose).All(x => x.ID != item.ID))\n                        continue;\n\n                    IEnumerable<Material> materials = GetMaterials(fuelMaterials, item);\n\n                    AddListViewItem(prop, items, group, item, materials);\n                }\n\n                PropertiesList.Groups.Add(group);\n            }\n        }\n\n        /// <summary>\n        /// Gets the materials.\n        /// </summary>\n        /// <param name=\"fuelMaterials\">The fuel materials.</param>\n        /// <param name=\"item\">The item.</param>\n        /// <returns></returns>\n        private IEnumerable<Material> GetMaterials(IEnumerable<SerializableControlTowerFuel> fuelMaterials, Item item)\n        {\n            // Create the list of materials we need to scroll through\n            List<Material> materials = new List<Material>();\n            foreach (Item obj in SelectControl.SelectedObjects)\n            {\n                // Compensate for missing entries\n                if (!obj.ControlTowerFuel.Any())\n                {\n                    materials.Add(null);\n                    continue;\n                }\n\n                materials.Add(obj.ControlTowerFuel.Where(\n                    x => x.ID == item.ID && fuelMaterials.Any(y => y == x)).Select(\n                        x => new ControlTowerFuel(x)).FirstOrDefault());\n            }\n            return materials;\n        }\n\n        /// <summary>\n        /// Adds the reaction info.\n        /// </summary>\n        /// <param name=\"items\">The items.</param>\n        private void AddReactionInfo(ICollection<ListViewItem> items)\n        {\n            if (SelectControl.SelectedObjects.All(x => !x.ReactionMaterial.Any()))\n                return;\n\n            EveProperty prop = StaticProperties.GetPropertyByID(DBConstants.ConsumptionQuantityPropertyID);\n            IList<SerializableReactionInfo> reactionMaterials = SelectControl.SelectedObjects.Where(\n                x => x.ReactionMaterial.Any()).SelectMany(x => x.ReactionMaterial).ToList();\n\n            // Add resources info\n            ListViewGroup resourcesGroup = new ListViewGroup(\"Resources\");\n            IList<SerializableReactionInfo> resources = reactionMaterials.Where(x => x.IsInput).ToList();\n            AddItemsAndSubItems(prop, items, resourcesGroup, resources);\n\n            // Add products info\n            ListViewGroup productsGroup = new ListViewGroup(\"Products\");\n            IList<SerializableReactionInfo> products = reactionMaterials.Where(x => !x.IsInput).ToList();\n            AddItemsAndSubItems(prop, items, productsGroup, products);\n        }\n\n        /// <summary>\n        /// Adds the items and sub items.\n        /// </summary>\n        /// <param name=\"prop\">The prop.</param>\n        /// <param name=\"items\">The items.</param>\n        /// <param name=\"resourcesGroup\">The resources group.</param>\n        /// <param name=\"reactionMaterials\">The reaction materials.</param>\n        private void AddItemsAndSubItems(EveProperty prop, ICollection<ListViewItem> items, ListViewGroup resourcesGroup,\n            IList<SerializableReactionInfo> reactionMaterials)\n        {\n            foreach (Item item in StaticItems.AllItems.OrderBy(x => x.ID))\n            {\n                if (reactionMaterials.All(x => x.ID != item.ID))\n                    continue;\n\n                // Create the list of materials we need to scroll through\n                List<Material> materials = new List<Material>();\n                foreach (Item obj in SelectControl.SelectedObjects)\n                {\n                    // Compensate for missing entries\n                    if (!obj.ReactionMaterial.Any())\n                    {\n                        materials.Add(null);\n                        continue;\n                    }\n\n                    materials.Add(obj.ReactionMaterial.Where(\n                        x => x.ID == item.ID && reactionMaterials.Any(y => y == x)).Select(\n                            x => new ReactionMaterial(x)).FirstOrDefault());\n                }\n\n                AddListViewItem(prop, items, resourcesGroup, item, materials);\n            }\n\n            PropertiesList.Groups.Add(resourcesGroup);\n        }\n\n        /// <summary>\n        /// Adds the reprocessing info.\n        /// </summary>\n        /// <param name=\"items\">The list of items.</param>\n        private void AddReprocessingInfo(ICollection<ListViewItem> items)\n        {\n            if (SelectControl.SelectedObjects.All(x => x.ReprocessingMaterials == null))\n                return;\n\n            string groupName = \"Reprocessing - Refining Info\";\n\n            if (SelectControl.SelectedObjects.Where(x => x.ReprocessingSkill != null)\n                .All(x => x.ReprocessingSkill.ID != DBConstants.ScrapMetalProcessingSkillID))\n            {\n                groupName = \"Refining Info\";\n            }\n\n            if (SelectControl.SelectedObjects.Where(x => x.ReprocessingSkill != null)\n                .All(x => x.ReprocessingSkill.ID == DBConstants.ScrapMetalProcessingSkillID))\n            {\n                groupName = \"Reprocessing Info\";\n            }\n\n            ListViewGroup group = new ListViewGroup(groupName);\n\n            // Add the reprocessing skill\n            AddReprocessingSkill(group, items);\n\n            IList<Material> reprocessingMaterials = SelectControl.SelectedObjects.Where(\n                x => x.ReprocessingMaterials != null).SelectMany(x => x.ReprocessingMaterials).ToList();\n\n            AddItemsAndSubItems(items, group, reprocessingMaterials);\n        }\n\n        /// <summary>\n        /// Adds the items and sub items.\n        /// </summary>\n        /// <param name=\"items\">The items.</param>\n        /// <param name=\"group\">The group.</param>\n        /// <param name=\"reprocessingMaterials\">The reprocessing materials.</param>\n        private void AddItemsAndSubItems(ICollection<ListViewItem> items, ListViewGroup group,\n            IList<Material> reprocessingMaterials)\n        {\n            foreach (Item item in StaticItems.AllItems.OrderBy(x => x.ID))\n            {\n                if (reprocessingMaterials.All(x => x.Item != item))\n                    continue;\n\n                // Create the list of reprocessing materials we need to scroll through\n                List<Material> materials = new List<Material>();\n                foreach (Item obj in SelectControl.SelectedObjects)\n                {\n                    // Compensate for missing entries\n                    if (obj.ReprocessingMaterials == null)\n                    {\n                        materials.Add(null);\n                        continue;\n                    }\n\n                    materials.Add(obj.ReprocessingMaterials.FirstOrDefault(\n                        x => x.Item == item && reprocessingMaterials.Any(y => y == x)));\n                }\n\n                AddListViewItem(null, items, group, item, materials);\n            }\n\n            PropertiesList.Groups.Add(group);\n        }\n\n        /// <summary>\n        /// Adds the list view item.\n        /// </summary>\n        /// <param name=\"prop\">The prop.</param>\n        /// <param name=\"items\">The items.</param>\n        /// <param name=\"group\">The group.</param>\n        /// <param name=\"item\">The item.</param>\n        /// <param name=\"materials\">The materials.</param>\n        private void AddListViewItem(EveProperty prop, ICollection<ListViewItem> items, ListViewGroup group, Item item,\n            IEnumerable<Material> materials)\n        {\n            // Create the list of labels and values\n            List<string> labels = new List<string>();\n            List<double> values = new List<double>();\n            foreach (Material material in materials)\n            {\n                // Add default labels and values for non existing materials\n                if (material == null)\n                {\n                    labels.Add(\"0 \");\n                    values.Add(0f);\n                    continue;\n                }\n\n                labels.Add($\"{material.Quantity:N0} {prop?.Unit}\");\n                values.Add(material.Quantity);\n            }\n\n            // Create the list view item\n            ListViewItem lvItem = new ListViewItem(group)\n            {\n                ToolTipText = item.Description,\n                Text = item.Name,\n                Tag = item\n            };\n            items.Add(lvItem);\n\n            AddValueForSelectedObjects(prop, lvItem, labels, values);\n        }\n\n        /// <summary>\n        /// Adds the reprocessing skill.\n        /// </summary>\n        /// <param name=\"group\">The listGroup.</param>\n        /// <param name=\"items\">The list of items.</param>\n        private void AddReprocessingSkill(ListViewGroup group, ICollection<ListViewItem> items)\n        {\n            // Create the list of labels\n            List<string> labels = new List<string>();\n            foreach (Item obj in SelectControl.SelectedObjects)\n            {\n                // Add a placeholder if no materials\n                if (obj.ReprocessingMaterials == null)\n                {\n                    labels.Add(\"None\");\n                    continue;\n                }\n\n                string skillName = obj.ReprocessingSkill?.Name ?? EveMonConstants.UnknownText;\n                labels.Add(skillName);\n            }\n\n            // Create the list view item\n            EveProperty property = StaticProperties.GetPropertyByID(DBConstants.ReprocessingSkillPropertyID);\n            ListViewItem item = new ListViewItem(group);\n            if (property != null)\n            {\n                item.ToolTipText = property.Description;\n                item.Text = property.Name;\n\n                StaticSkill skill = SelectControl.SelectedObjects.Select(obj => obj.ReprocessingSkill).FirstOrDefault();\n                if (skill != null && SelectControl.SelectedObjects.All(obj => obj.ReprocessingSkill == skill))\n                    item.Tag = Character?.Skills[skill.ID] ?? SkillCollection.Skills.FirstOrDefault(x => x.ID == skill.ID);\n                else\n                    item.Tag = property.ID;\n            }\n\n            items.Add(item);\n\n            // Add the value for every selected item\n            AddValueForSelectedObjects(null, item, labels, new double[] { });\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        protected void AdjustColumns()\n        {\n            foreach (ColumnHeader column in PropertiesList.Columns)\n            {\n                column.Width = -2;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column\n                if (column.Index != PropertiesList.Columns.Count - 1)\n                    continue;\n\n                const int ColumnPad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + ColumnPad * 2;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = PropertiesList.Columns[column.Index].ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + ColumnPad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n        \n        /// <summary>\n        /// Updates the controls visibility.\n        /// </summary>\n        private void UpdateControlsVisibility()\n        {\n            scDetailsRight.Panel2Collapsed = Plan == null;\n\n            if (Settings.UI.SafeForWork)\n            {\n                eoImage.ImageSize = EveImageSize.x0;\n                eoImage.Visible = false;\n                lblEveObjCategory.Location = new Point(Pad, lblEveObjCategory.Location.Y);\n                lblEveObjName.Location = new Point(Pad, lblEveObjName.Location.Y);\n            }\n            else\n            {\n                eoImage.ImageSize = EveImageSize.x64;\n                eoImage.Visible = true;\n                if (SelectControl.SelectedObject != null)\n                    eoImage.EveItem = SelectControl.SelectedObject;\n\n                lblEveObjCategory.Location = new Point(eoImage.Width + Pad * 2, lblEveObjCategory.Location.Y);\n                lblEveObjName.Location = new Point(eoImage.Width + Pad * 2, lblEveObjName.Location.Y);\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/EveObjectBrowserControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"lblHelp.Text\" xml:space=\"preserve\">\n    <value>Use the tree on the left to select an item to view.\n\nAfter selecting an item, you can compare similar items.\nTo do this,  hold down your CTRL key and click the item you wish to compare. \nYou may compare several items at once.</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/EveObjectBrowserSimple.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class EveObjectBrowserSimple\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.scDetails = new EVEMon.Common.Controls.SplitContainerMinFixed();\n            this.scDetailsRight = new EVEMon.Common.Controls.SplitContainerMinFixed();\n            this.gbDescription = new System.Windows.Forms.GroupBox();\n            this.tbDescription = new System.Windows.Forms.RichTextBox();\n            this.gbRequiredSkills = new System.Windows.Forms.GroupBox();\n            this.requiredSkillsControl = new EVEMon.SkillPlanner.RequiredSkillsControl();\n            this.scObjectBrowser.Panel2.SuspendLayout();\n            this.scObjectBrowser.SuspendLayout();\n            this.pnlDetails.SuspendLayout();\n            this.pnlBrowserHeader.SuspendLayout();\n            this.scDetails.Panel2.SuspendLayout();\n            this.scDetails.SuspendLayout();\n            this.scDetailsRight.Panel1.SuspendLayout();\n            this.scDetailsRight.Panel2.SuspendLayout();\n            this.scDetailsRight.SuspendLayout();\n            this.gbDescription.SuspendLayout();\n            this.gbRequiredSkills.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // scObjectBrowser\n            // \n            // \n            // pnlDetails\n            // \n            this.pnlDetails.Controls.Add(this.scDetails);\n            // \n            // scDetails\n            // \n            this.scDetails.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.scDetails.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\n            this.scDetails.Location = new System.Drawing.Point(0, 0);\n            this.scDetails.Name = \"scDetails\";\n            // \n            // scDetails.Panel2\n            // \n            this.scDetails.Panel2.Controls.Add(this.scDetailsRight);\n            this.scDetails.Panel2MinSize = 240;\n            this.scDetails.Size = new System.Drawing.Size(482, 343);\n            this.scDetails.SplitterDistance = 238;\n            this.scDetails.TabIndex = 13;\n            // \n            // scDetailsRight\n            // \n            this.scDetailsRight.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.scDetailsRight.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\n            this.scDetailsRight.Location = new System.Drawing.Point(0, 0);\n            this.scDetailsRight.Name = \"scDetailsRight\";\n            this.scDetailsRight.Orientation = System.Windows.Forms.Orientation.Horizontal;\n            // \n            // scDetailsRight.Panel1\n            // \n            this.scDetailsRight.Panel1.Controls.Add(this.gbDescription);\n            // \n            // scDetailsRight.Panel2\n            // \n            this.scDetailsRight.Panel2.Controls.Add(this.gbRequiredSkills);\n            this.scDetailsRight.Panel2MinSize = 120;\n            this.scDetailsRight.Size = new System.Drawing.Size(240, 343);\n            this.scDetailsRight.SplitterDistance = 218;\n            this.scDetailsRight.TabIndex = 0;\n            // \n            // gbDescription\n            // \n            this.gbDescription.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.gbDescription.Controls.Add(this.tbDescription);\n            this.gbDescription.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbDescription.Location = new System.Drawing.Point(0, 0);\n            this.gbDescription.Name = \"gbDescription\";\n            this.gbDescription.Size = new System.Drawing.Size(240, 218);\n            this.gbDescription.TabIndex = 14;\n            this.gbDescription.TabStop = false;\n            this.gbDescription.Text = \"Description\";\n            // \n            // tbDescription\n            // \n            this.tbDescription.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tbDescription.Location = new System.Drawing.Point(3, 16);\n            this.tbDescription.Name = \"tbDescription\";\n            this.tbDescription.ReadOnly = true;\n            this.tbDescription.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;\n            this.tbDescription.Size = new System.Drawing.Size(234, 199);\n            this.tbDescription.TabIndex = 0;\n            this.tbDescription.Text = \"\";\n            // \n            // gbRequiredSkills\n            // \n            this.gbRequiredSkills.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.gbRequiredSkills.Controls.Add(this.requiredSkillsControl);\n            this.gbRequiredSkills.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbRequiredSkills.Location = new System.Drawing.Point(0, 0);\n            this.gbRequiredSkills.Name = \"gbRequiredSkills\";\n            this.gbRequiredSkills.Size = new System.Drawing.Size(240, 121);\n            this.gbRequiredSkills.TabIndex = 13;\n            this.gbRequiredSkills.TabStop = false;\n            this.gbRequiredSkills.Text = \"Required Skills\";\n            // \n            // requiredSkillsControl\n            // \n            this.requiredSkillsControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.requiredSkillsControl.Object = null;\n            this.requiredSkillsControl.Location = new System.Drawing.Point(3, 16);\n            this.requiredSkillsControl.Name = \"requiredSkillsControl\";\n            this.requiredSkillsControl.Plan = null;\n            this.requiredSkillsControl.Size = new System.Drawing.Size(234, 102);\n            this.requiredSkillsControl.TabIndex = 12;\n            // \n            // EveObjectBrowserSimple\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.Name = \"EveObjectBrowserSimple\";\n            this.scObjectBrowser.Panel2.ResumeLayout(false);\n            this.scObjectBrowser.Panel2.PerformLayout();\n            this.scObjectBrowser.ResumeLayout(false);\n            this.pnlDetails.ResumeLayout(false);\n            this.pnlBrowserHeader.ResumeLayout(false);\n            this.pnlBrowserHeader.PerformLayout();\n            this.scDetails.Panel2.ResumeLayout(false);\n            this.scDetails.ResumeLayout(false);\n            this.scDetailsRight.Panel1.ResumeLayout(false);\n            this.scDetailsRight.Panel2.ResumeLayout(false);\n            this.scDetailsRight.ResumeLayout(false);\n            this.gbDescription.ResumeLayout(false);\n            this.gbRequiredSkills.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        protected System.Windows.Forms.GroupBox gbDescription;\n        protected System.Windows.Forms.GroupBox gbRequiredSkills;\n        protected EVEMon.Common.Controls.SplitContainerMinFixed scDetailsRight;\n        protected RequiredSkillsControl requiredSkillsControl;\n        protected System.Windows.Forms.RichTextBox tbDescription;\n        protected EVEMon.Common.Controls.SplitContainerMinFixed scDetails;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/EveObjectBrowserSimple.cs",
    "content": "using System;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Superclass for simple one page item browsers.\n    /// Extends EveObjectBrowserControl with the addition of Description and Required Skills panes\n    /// </summary>\n    public partial class EveObjectBrowserSimple : EveObjectBrowserControl\n    {\n        #region Constructors\n        /// <summary>\n        /// Default constructor\n        /// </summary>\n        public EveObjectBrowserSimple()\n        {\n            InitializeComponent();\n        }\n\n        #endregion\n\n        #region Event Handlers\n        /// <summary>\n        /// Updates Required Skills control when selected plan is changed\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveObjectBrowserSimple_PlanChanged(object sender, EventArgs e)\n        {\n            requiredSkillsControl.Plan = this.Plan;\n        }\n\n        #endregion\n\n        #region Methods\n        /// <summary>\n        /// Updates the controls when the selection is changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        protected override void OnSelectionChanged(object sender, EventArgs e)\n        {\n            base.OnSelectionChanged(sender, e);\n            if (SelectedObject == null) return;\n\n            // Description\n            tbDescription.Text = SelectedObject.Description;\n\n            // Required Skills\n            requiredSkillsControl.Object = SelectedObject;\n        }\n\n        protected override void OnPlanChanged()\n        {\n            base.OnPlanChanged();\n            requiredSkillsControl.Plan = Plan;\n\n            // We recalculate the right panels minimum size\n            int reqSkillControlMinWidth = requiredSkillsControl.MinimumSize.Width;\n            int reqSkillPanelMinWidth = scDetails.Panel2MinSize;\n            scDetails.Panel2MinSize = (reqSkillPanelMinWidth > reqSkillControlMinWidth ?\n                                         reqSkillPanelMinWidth : reqSkillControlMinWidth );\n        }\n        #endregion\n    }\n}\n\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/EveObjectBrowserSimple.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/EveObjectSelectControl.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class EveObjectSelectControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EveObjectSelectControl));\n            this.tbSearchText = new System.Windows.Forms.TextBox();\n            this.lbSearchTextHint = new System.Windows.Forms.Label();\n            this.lbNoMatches = new System.Windows.Forms.Label();\n            this.lbSearchList = new System.Windows.Forms.ListBox();\n            this.upperPanel = new System.Windows.Forms.Panel();\n            this.pbSerachTextDel = new System.Windows.Forms.PictureBox();\n            this.cbUsabilityFilter = new System.Windows.Forms.ComboBox();\n            this.lblFilter = new System.Windows.Forms.Label();\n            this.pbSearchImage = new System.Windows.Forms.PictureBox();\n            this.lowerPanel = new System.Windows.Forms.Panel();\n            this.tvItems = new EVEMon.Common.Controls.TreeView();\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.cmiLvPlanTo = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel1 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel2 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel3 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel4 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel5 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsSeparatorPlanTo = new System.Windows.Forms.ToolStripSeparator();\n            this.cmiExpandSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmiCollapseSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsSeparatorExpandCollapse = new System.Windows.Forms.ToolStripSeparator();\n            this.cmiExpandAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmiCollapseAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.upperPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSerachTextDel)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchImage)).BeginInit();\n            this.lowerPanel.SuspendLayout();\n            this.contextMenu.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tbSearchText\n            // \n            this.tbSearchText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbSearchText.Location = new System.Drawing.Point(45, 29);\n            this.tbSearchText.Margin = new System.Windows.Forms.Padding(0);\n            this.tbSearchText.Name = \"tbSearchText\";\n            this.tbSearchText.Size = new System.Drawing.Size(140, 20);\n            this.tbSearchText.TabIndex = 21;\n            this.tbSearchText.TextChanged += new System.EventHandler(this.tbSearchText_TextChanged);\n            this.tbSearchText.Enter += new System.EventHandler(this.tbSearchText_Enter);\n            this.tbSearchText.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.tbSearchText_KeyPress);\n            this.tbSearchText.Leave += new System.EventHandler(this.tbSearchText_Leave);\n            // \n            // lbSearchTextHint\n            // \n            this.lbSearchTextHint.AutoSize = true;\n            this.lbSearchTextHint.BackColor = System.Drawing.SystemColors.Window;\n            this.lbSearchTextHint.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.lbSearchTextHint.Location = new System.Drawing.Point(47, 32);\n            this.lbSearchTextHint.Margin = new System.Windows.Forms.Padding(0);\n            this.lbSearchTextHint.Name = \"lbSearchTextHint\";\n            this.lbSearchTextHint.Size = new System.Drawing.Size(65, 13);\n            this.lbSearchTextHint.TabIndex = 23;\n            this.lbSearchTextHint.Text = \"Search Text\";\n            this.lbSearchTextHint.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            this.lbSearchTextHint.Click += new System.EventHandler(this.lbSearchTextHint_Click);\n            // \n            // lbNoMatches\n            // \n            this.lbNoMatches.BackColor = System.Drawing.Color.Transparent;\n            this.lbNoMatches.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbNoMatches.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.lbNoMatches.Location = new System.Drawing.Point(0, 0);\n            this.lbNoMatches.Margin = new System.Windows.Forms.Padding(0);\n            this.lbNoMatches.Name = \"lbNoMatches\";\n            this.lbNoMatches.Padding = new System.Windows.Forms.Padding(4, 30, 4, 4);\n            this.lbNoMatches.Size = new System.Drawing.Size(185, 344);\n            this.lbNoMatches.TabIndex = 24;\n            this.lbNoMatches.Text = \"No ships match your search.\";\n            this.lbNoMatches.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // lbSearchList\n            // \n            this.lbSearchList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbSearchList.FormattingEnabled = true;\n            this.lbSearchList.IntegralHeight = false;\n            this.lbSearchList.Location = new System.Drawing.Point(0, 0);\n            this.lbSearchList.Margin = new System.Windows.Forms.Padding(0);\n            this.lbSearchList.Name = \"lbSearchList\";\n            this.lbSearchList.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;\n            this.lbSearchList.Size = new System.Drawing.Size(185, 344);\n            this.lbSearchList.TabIndex = 25;\n            this.lbSearchList.Visible = false;\n            this.lbSearchList.SelectedIndexChanged += new System.EventHandler(this.lbSearchList_SelectedIndexChanged);\n            this.lbSearchList.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbSearchList_MouseDown);\n            this.lbSearchList.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lbSearchList_MouseMove);\n            // \n            // upperPanel\n            // \n            this.upperPanel.Controls.Add(this.pbSerachTextDel);\n            this.upperPanel.Controls.Add(this.cbUsabilityFilter);\n            this.upperPanel.Controls.Add(this.lblFilter);\n            this.upperPanel.Controls.Add(this.lbSearchTextHint);\n            this.upperPanel.Controls.Add(this.tbSearchText);\n            this.upperPanel.Controls.Add(this.pbSearchImage);\n            this.upperPanel.Dock = System.Windows.Forms.DockStyle.Top;\n            this.upperPanel.Location = new System.Drawing.Point(0, 0);\n            this.upperPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.upperPanel.Name = \"upperPanel\";\n            this.upperPanel.Size = new System.Drawing.Size(185, 54);\n            this.upperPanel.TabIndex = 26;\n            // \n            // pbSerachTextDel\n            // \n            this.pbSerachTextDel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.pbSerachTextDel.Image = ((System.Drawing.Image)(resources.GetObject(\"pbSerachTextDel.Image\")));\n            this.pbSerachTextDel.InitialImage = null;\n            this.pbSerachTextDel.Location = new System.Drawing.Point(167, 31);\n            this.pbSerachTextDel.Name = \"pbSerachTextDel\";\n            this.pbSerachTextDel.Size = new System.Drawing.Size(16, 16);\n            this.pbSerachTextDel.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbSerachTextDel.TabIndex = 25;\n            this.pbSerachTextDel.TabStop = false;\n            this.pbSerachTextDel.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pbSearchTextDel_MouseUp);\n            // \n            // cbUsabilityFilter\n            // \n            this.cbUsabilityFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbUsabilityFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbUsabilityFilter.FormattingEnabled = true;\n            this.cbUsabilityFilter.Items.AddRange(new object[] {\n            \"All\",\n            \"Can\",\n            \"Can not\"});\n            this.cbUsabilityFilter.Location = new System.Drawing.Point(45, 3);\n            this.cbUsabilityFilter.Margin = new System.Windows.Forms.Padding(0);\n            this.cbUsabilityFilter.Name = \"cbUsabilityFilter\";\n            this.cbUsabilityFilter.Size = new System.Drawing.Size(140, 21);\n            this.cbUsabilityFilter.TabIndex = 0;\n            // \n            // lblFilter\n            // \n            this.lblFilter.AutoSize = true;\n            this.lblFilter.Location = new System.Drawing.Point(6, 6);\n            this.lblFilter.Margin = new System.Windows.Forms.Padding(0);\n            this.lblFilter.Name = \"lblFilter\";\n            this.lblFilter.Size = new System.Drawing.Size(32, 13);\n            this.lblFilter.TabIndex = 24;\n            this.lblFilter.Text = \"Filter:\";\n            // \n            // pbSearchImage\n            // \n            this.pbSearchImage.Image = ((System.Drawing.Image)(resources.GetObject(\"pbSearchImage.Image\")));\n            this.pbSearchImage.InitialImage = null;\n            this.pbSearchImage.Location = new System.Drawing.Point(9, 30);\n            this.pbSearchImage.Margin = new System.Windows.Forms.Padding(0);\n            this.pbSearchImage.Name = \"pbSearchImage\";\n            this.pbSearchImage.Size = new System.Drawing.Size(20, 20);\n            this.pbSearchImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbSearchImage.TabIndex = 20;\n            this.pbSearchImage.TabStop = false;\n            // \n            // lowerPanel\n            // \n            this.lowerPanel.AutoSize = true;\n            this.lowerPanel.Controls.Add(this.lbNoMatches);\n            this.lowerPanel.Controls.Add(this.lbSearchList);\n            this.lowerPanel.Controls.Add(this.tvItems);\n            this.lowerPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lowerPanel.Location = new System.Drawing.Point(0, 54);\n            this.lowerPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.lowerPanel.Name = \"lowerPanel\";\n            this.lowerPanel.Size = new System.Drawing.Size(185, 344);\n            this.lowerPanel.TabIndex = 27;\n            // \n            // tvItems\n            // \n            this.tvItems.ContextMenuStrip = this.contextMenu;\n            this.tvItems.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tvItems.Location = new System.Drawing.Point(0, 0);\n            this.tvItems.Margin = new System.Windows.Forms.Padding(0);\n            this.tvItems.Name = \"tvItems\";\n            this.tvItems.SelectionBackColor = System.Drawing.SystemColors.Highlight;\n            this.tvItems.SelectionMode = EVEMon.Common.Controls.TreeViewSelectionMode.MultiSelect;\n            this.tvItems.Size = new System.Drawing.Size(185, 344);\n            this.tvItems.TabIndex = 22;\n            this.tvItems.SelectionsChanged += new System.EventHandler(this.tvItems_SelectionsChanged);\n            this.tvItems.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tvItems_MouseDown);\n            this.tvItems.MouseMove += new System.Windows.Forms.MouseEventHandler(this.tvItems_MouseMove);\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.cmiLvPlanTo,\n            this.tsSeparatorPlanTo,\n            this.cmiExpandSelected,\n            this.cmiCollapseSelected,\n            this.tsSeparatorExpandCollapse,\n            this.cmiExpandAll,\n            this.cmiCollapseAll});\n            this.contextMenu.Name = \"cmListSkills\";\n            this.contextMenu.Size = new System.Drawing.Size(167, 126);\n            this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenu_Opening);\n            // \n            // cmiLvPlanTo\n            // \n            this.cmiLvPlanTo.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tsmLevel1,\n            this.tsmLevel2,\n            this.tsmLevel3,\n            this.tsmLevel4,\n            this.tsmLevel5});\n            this.cmiLvPlanTo.Image = ((System.Drawing.Image)(resources.GetObject(\"cmiLvPlanTo.Image\")));\n            this.cmiLvPlanTo.Name = \"cmiLvPlanTo\";\n            this.cmiLvPlanTo.Size = new System.Drawing.Size(166, 22);\n            this.cmiLvPlanTo.Text = \"&Plan Mastery to...\";\n            // \n            // tsmLevel1\n            // \n            this.tsmLevel1.Name = \"tsmLevel1\";\n            this.tsmLevel1.Size = new System.Drawing.Size(114, 22);\n            this.tsmLevel1.Text = \"Level I\";\n            this.tsmLevel1.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsmLevel2\n            // \n            this.tsmLevel2.Name = \"tsmLevel2\";\n            this.tsmLevel2.Size = new System.Drawing.Size(114, 22);\n            this.tsmLevel2.Text = \"Level II\";\n            this.tsmLevel2.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsmLevel3\n            // \n            this.tsmLevel3.Name = \"tsmLevel3\";\n            this.tsmLevel3.Size = new System.Drawing.Size(114, 22);\n            this.tsmLevel3.Text = \"Level III\";\n            this.tsmLevel3.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsmLevel4\n            // \n            this.tsmLevel4.Name = \"tsmLevel4\";\n            this.tsmLevel4.Size = new System.Drawing.Size(114, 22);\n            this.tsmLevel4.Text = \"Level IV\";\n            this.tsmLevel4.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsmLevel5\n            // \n            this.tsmLevel5.Name = \"tsmLevel5\";\n            this.tsmLevel5.Size = new System.Drawing.Size(114, 22);\n            this.tsmLevel5.Text = \"Level V\";\n            this.tsmLevel5.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsSeparatorPlanTo\n            // \n            this.tsSeparatorPlanTo.Name = \"tsSeparatorPlanTo\";\n            this.tsSeparatorPlanTo.Size = new System.Drawing.Size(163, 6);\n            // \n            // cmiExpandSelected\n            // \n            this.cmiExpandSelected.Name = \"cmiExpandSelected\";\n            this.cmiExpandSelected.Size = new System.Drawing.Size(166, 22);\n            this.cmiExpandSelected.Text = \"Expand Selected\";\n            this.cmiExpandSelected.Click += new System.EventHandler(this.cmiExpandSelected_Click);\n            // \n            // cmiCollapseSelected\n            // \n            this.cmiCollapseSelected.Name = \"cmiCollapseSelected\";\n            this.cmiCollapseSelected.Size = new System.Drawing.Size(166, 22);\n            this.cmiCollapseSelected.Text = \"Collapse Selected\";\n            this.cmiCollapseSelected.Click += new System.EventHandler(this.cmiCollapseSelected_Click);\n            // \n            // tsSeparatorExpandCollapse\n            // \n            this.tsSeparatorExpandCollapse.Name = \"tsSeparatorExpandCollapse\";\n            this.tsSeparatorExpandCollapse.Size = new System.Drawing.Size(163, 6);\n            // \n            // cmiExpandAll\n            // \n            this.cmiExpandAll.Name = \"cmiExpandAll\";\n            this.cmiExpandAll.Size = new System.Drawing.Size(166, 22);\n            this.cmiExpandAll.Text = \"&Expand All\";\n            this.cmiExpandAll.Click += new System.EventHandler(this.cmiExpandAll_Click);\n            // \n            // cmiCollapseAll\n            // \n            this.cmiCollapseAll.Name = \"cmiCollapseAll\";\n            this.cmiCollapseAll.Size = new System.Drawing.Size(166, 22);\n            this.cmiCollapseAll.Text = \"&Collapse All\";\n            this.cmiCollapseAll.Click += new System.EventHandler(this.cmiCollapseAll_Click);\n            // \n            // EveObjectSelectControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.Controls.Add(this.lowerPanel);\n            this.Controls.Add(this.upperPanel);\n            this.Margin = new System.Windows.Forms.Padding(0);\n            this.Name = \"EveObjectSelectControl\";\n            this.Size = new System.Drawing.Size(185, 398);\n            this.upperPanel.ResumeLayout(false);\n            this.upperPanel.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSerachTextDel)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchImage)).EndInit();\n            this.lowerPanel.ResumeLayout(false);\n            this.contextMenu.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        protected System.Windows.Forms.TextBox tbSearchText;\n        protected System.Windows.Forms.Label lbNoMatches;\n        protected System.Windows.Forms.Panel upperPanel;\n        protected System.Windows.Forms.Panel lowerPanel;\n        protected System.Windows.Forms.Label lbSearchTextHint;\n        protected System.Windows.Forms.PictureBox pbSearchImage;\n        protected System.Windows.Forms.Label lblFilter;\n        protected System.Windows.Forms.ComboBox cbUsabilityFilter;\n        protected internal System.Windows.Forms.ListBox lbSearchList;\n        protected internal EVEMon.Common.Controls.TreeView tvItems;\n        protected System.Windows.Forms.PictureBox pbSerachTextDel;\n        private System.Windows.Forms.ToolStripMenuItem cmiLvPlanTo;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel1;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel2;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel3;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel4;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel5;\n        private System.Windows.Forms.ToolStripSeparator tsSeparatorPlanTo;\n        private System.Windows.Forms.ToolStripMenuItem cmiExpandSelected;\n        private System.Windows.Forms.ToolStripMenuItem cmiCollapseSelected;\n        private System.Windows.Forms.ToolStripSeparator tsSeparatorExpandCollapse;\n        private System.Windows.Forms.ToolStripMenuItem cmiExpandAll;\n        private System.Windows.Forms.ToolStripMenuItem cmiCollapseAll;\n        protected System.Windows.Forms.ContextMenuStrip contextMenu;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/EveObjectSelectControl.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// The standard control to search for an item\n    /// </summary>\n    public partial class EveObjectSelectControl : UserControl\n    {\n        public event EventHandler SelectionChanged;\n\n        private Character m_character;\n        private Plan m_plan;\n        private Timer m_searchTextTimer;\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveObjectSelectControl\"/> class.\n        /// </summary>\n        protected EveObjectSelectControl()\n        {\n            InitializeComponent();\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the character.\n        /// </summary>\n        /// <value>\n        /// The character.\n        /// </value>\n        internal Character Character\n        {\n            get { return m_character; }\n            set\n            {\n                if (value == null || m_character == value)\n                    return;\n\n                m_character = value;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the plan.\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                if (m_plan == value)\n                    return;\n\n                // Should we be transforming a Data Browser to a Skill Planner?\n                bool transformToPlanner = (value != null) && (m_plan == null) && (m_character != null);\n\n                if (value == null)\n                    return;\n\n                m_plan = value;\n                m_character = (Character)m_plan.Character;\n\n                // Transform a Data Browser to a Skill Planner\n                if (!transformToPlanner)\n                    return;\n\n                InitializeFiltersControls();\n                UpdateContent();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the usability predicate.\n        /// </summary>\n        /// <value>The usability predicate.</value>\n        protected Func<Item, bool> UsabilityPredicate { get; set; }\n\n        /// <summary>\n        /// Gets or sets the activity filter.\n        /// </summary>\n        /// <value>The activity filter.</value>\n        protected ObjectActivityFilter ActivityFilter { get; set; }\n\n        /// <summary>\n        /// Gets or sets the activity.\n        /// </summary>\n        /// <value>The activity.</value>\n        protected BlueprintActivity Activity { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [all expanded].\n        /// </summary>\n        /// <value><c>true</c> if [all expanded]; otherwise, <c>false</c>.</value>\n        protected bool AllExpanded { get; set; }\n\n        /// <summary>\n        /// Gets or sets the search text timer.\n        /// </summary>\n        /// <value>\n        /// The search text timer.\n        /// </value>\n        protected Timer SearchTextTimer\n        {\n            get { return m_searchTextTimer; }\n            set\n            {\n                m_searchTextTimer = value;\n\n                if (m_searchTextTimer != null)\n                    m_searchTextTimer.Tick += searchTextTimer_Tick;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the search text.\n        /// </summary>\n        internal string SearchText\n        {\n            get { return tbSearchText.Text; }\n            set\n            {\n                tbSearchText.Text = value ?? string.Empty;\n                OnSearchTextChanged();\n            }\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Occurs when the control is loaded.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            UsabilityPredicate = SelectAll;\n\n            // Subscribe the events\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            Disposed += OnDisposed;\n\n            // Update the controls\n            UpdateControlVisibility();\n        }\n\n        /// <summary>\n        /// Occurs when the control visibility changed.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\" /> that contains the event data.</param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (!Visible)\n                return;\n\n            UpdateSearchTextHintVisibility();\n        }\n\n        /// <summary>\n        /// Called when [disposed].\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// Handles the SettingsChanged event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateControlVisibility();\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Updates the control visibility.\n        /// </summary>\n        private void UpdateControlVisibility()\n        {\n            pbSearchImage.Visible = !Settings.UI.SafeForWork;\n        }\n\n        /// <summary>\n        /// Updates the search text hint visibility.\n        /// </summary>\n        private void UpdateSearchTextHintVisibility()\n        {\n            lbSearchTextHint.Visible = !tbSearchText.Focused && string.IsNullOrEmpty(tbSearchText.Text);\n        }\n\n        #endregion\n\n\n        #region Search\n\n        /// <summary>\n        /// Occurs when clicking on the search text control.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbSearchTextHint_Click(object sender, EventArgs e)\n        {\n            tbSearchText.Focus();\n        }\n\n        /// <summary>\n        /// Occurs upon entering the search text control.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tbSearchText_Enter(object sender, EventArgs e)\n        {\n            lbSearchTextHint.Visible = false;\n        }\n\n        /// <summary>\n        /// Occurs upon leaving the search text control.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tbSearchText_Leave(object sender, EventArgs e)\n        {\n            UpdateSearchTextHintVisibility();\n        }\n\n        /// <summary>\n        /// Handles the MouseUp event of the pbSearchTextDel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void pbSearchTextDel_MouseUp(object sender, MouseEventArgs e)\n        {\n            tbSearchText.Clear();\n            UpdateSearchTextHintVisibility();\n        }\n\n        /// <summary>\n        /// Occurs when the search text changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tbSearchText_TextChanged(object sender, EventArgs e)\n        {\n            if (m_searchTextTimer == null)\n            {\n                OnSearchTextChanged();\n                return;\n            }\n\n            if (m_searchTextTimer.Enabled)\n                m_searchTextTimer.Stop();\n\n            m_searchTextTimer.Start();\n        }\n\n        /// <summary>\n        /// Handles the Tick event of the searchTextTimer control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void searchTextTimer_Tick(object sender, EventArgs e)\n        {\n            m_searchTextTimer.Stop();\n            OnSearchTextChanged();\n        }\n\n        /// <summary>\n        /// Occurs when pressing a key while inside the search text control.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tbSearchText_KeyPress(object sender, KeyPressEventArgs e)\n        {\n            // (Ctrl + A) has KeyChar value 1\n            if (e.KeyChar != (char)Keys.LButton)\n                return;\n\n            tbSearchText.SelectAll();\n            e.Handled = true;\n        }\n\n        /// <summary>\n        /// Updates the control when the search text changes.\n        /// </summary>\n        protected virtual void OnSearchTextChanged()\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Initializes the filters controls.\n        /// </summary>\n        /// <exception cref=\"System.NotImplementedException\"></exception>\n        protected virtual void InitializeFiltersControls()\n        {\n            throw new NotImplementedException();\n        }\n\n        #endregion\n\n\n        #region Update Content\n\n        /// <summary>\n        /// Refresh the controls.\n        /// </summary>\n        protected void UpdateContent()\n        {\n            BuildTreeView();\n            BuildListBox();\n        }\n\n        /// <summary>\n        /// Builds the tree view.\n        /// </summary>\n        protected virtual void BuildTreeView()\n        {\n            throw new NotImplementedException();\n        }\n\n        /// <summary>\n        /// Parses the tree node and extracts all the items to build the content of the list box. \n        /// It also deals with text filtering and the treeview/listbox visibility.\n        /// </summary>\n        protected virtual void BuildListBox()\n        {\n            // Store the selected node (if any) to restore it after the update\n            int selectedItemHash = tvItems.SelectedNode?.Tag?.GetHashCode() ?? 0;\n\n            lbSearchList.Items.Clear();\n\n            if (string.IsNullOrEmpty(tbSearchText.Text))\n            {\n                tvItems.Show();\n                lbSearchList.Hide();\n                lbNoMatches.Hide();\n                return;\n            }\n\n            // Find everything in the current tree that matches the search string\n            List<Item> filteredItems = new List<Item>();\n            foreach (TreeNode n in tvItems.Nodes)\n            {\n                SearchNode(n, tbSearchText.Text, filteredItems);\n            }\n\n            filteredItems.Sort((x, y) => string.CompareOrdinal(x.Name, y.Name));\n\n            lbSearchList.BeginUpdate();\n            try\n            {\n                foreach (Item item in filteredItems)\n                {\n                    lbSearchList.Items.Add(item);\n\n                    // Restore the selected node (if any)\n                    if (selectedItemHash > 0 && item.GetHashCode() == selectedItemHash)\n                        lbSearchList.SelectedItem = item;\n                }\n            }\n            finally\n            {\n                lbSearchList.EndUpdate();\n            }\n\n            lbSearchList.Show();\n            tvItems.Hide();\n            lbNoMatches.Visible = !filteredItems.Any();\n        }\n\n        /// <summary>\n        /// Creates the node.\n        /// </summary>\n        /// <param name=\"tn\"></param>\n        /// <param name=\"searchText\"></param>\n        /// <param name=\"filteredItems\"></param>\n        private static void SearchNode(TreeNode tn, string searchText, List<Item> filteredItems)\n        {\n            Item item = tn.Tag as Item;\n            if (item == null)\n            {\n                foreach (TreeNode subNode in tn.Nodes)\n                {\n                    SearchNode(subNode, searchText, filteredItems);\n                }\n                return;\n            }\n\n            if (item.Name.Contains(searchText, ignoreCase: true)\n                || item.Description.Contains(searchText, ignoreCase: true))\n            {\n                filteredItems.Add(item);\n            }\n        }\n        \n        #endregion\n\n        \n        #region Selected Objects\n\n        /// <summary>\n        /// All the selected objects (through multi-select).\n        /// </summary>\n        internal IEnumerable<Item> SelectedObjects { get; private set; }\n\n        /// <summary>\n        /// The primary selected object.\n        /// </summary>\n        internal Item SelectedObject\n        {\n            get\n            {\n                if (SelectedObjects == null || !SelectedObjects.Any())\n                    return null;\n\n                return SelectedObjects.First();\n            }\n            set\n            {\n                List<Item> selectedObjects = new List<Item>();\n                if (value != null)\n                    selectedObjects.Add(value);\n\n                SetSelectedObjects(selectedObjects);\n            }\n        }\n\n        /// <summary>\n        /// Selects the given nodes.\n        /// </summary>\n        /// <param name=\"items\"></param>\n        private void SetSelectedObjects(IEnumerable<Item> items)\n        {\n            // Updates selection\n            SelectedObjects = items == null ? new List<Item>() : new List<Item>(items);\n\n            // Selects the proper nodes\n            if (SelectedObjects.Count() == 1)\n            {\n                // If the object is not already selected\n                Item obj = SelectedObjects.First();\n                tvItems.SelectNodeWithTag(obj);\n            }\n\n            // Notify subscribers\n            SelectionChanged?.ThreadSafeInvoke(this, new EventArgs());\n        }\n\n        #endregion\n\n\n        #region Events\n\n        /// <summary>\n        /// Occurs when selection changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tvItems_SelectionsChanged(object sender, EventArgs e)\n        {\n            if (tvItems.SelectedNodes.Count != 0)\n            {\n                List<Item> selectedObjects = tvItems.SelectedNodes.Select(node => node.Tag).OfType<Item>().ToList();\n                SetSelectedObjects(selectedObjects);\n                return;\n            }\n\n            SetSelectedObjects(null);\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void tvItems_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            tvItems.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void tvItems_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            tvItems.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Occurs when the search list selection changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbSearchList_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (lbSearchList.SelectedItems.Count != 0)\n            {\n                List<Item> selectedObjects = lbSearchList.SelectedItems.OfType<Item>().ToList();\n                SetSelectedObjects(selectedObjects);\n                return;\n            }\n\n            SetSelectedObjects(null);\n        }\n\n        /// <summary>\n        /// Changes the selection when you right click on a search.\n        /// </summary>\n        /// <param name=\"sender\">is lbSearchList</param>\n        /// <param name=\"e\"></param>\n        private void lbSearchList_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lbSearchList.SelectedItems.Clear();\n            lbSearchList.SelectedIndex = lbSearchList.IndexFromPoint(e.Location);\n            lbSearchList.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbSearchList_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            // If it's not the Ship Select Control we don't display a context menu,\n            // hence there is no need to change the cursor\n            if (!(this is ShipSelectControl))\n                return;\n\n            lbSearchList.Cursor = m_plan != null && lbSearchList.IndexFromPoint(e.Location) > -1\n                ? CustomCursors.ContextMenu\n                : Cursors.Default;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand all.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiExpandAll_Click(object sender, EventArgs e)\n        {\n            tvItems.ExpandAll();\n            AllExpanded = true;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse all.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiCollapseAll_Click(object sender, EventArgs e)\n        {\n            tvItems.CollapseAll();\n            AllExpanded = false;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiExpandSelected_Click(object sender, EventArgs e)\n        {\n            tvItems.SelectedNode.Expand();\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiCollapseSelected_Click(object sender, EventArgs e)\n        {\n            tvItems.SelectedNode.Collapse();\n        }\n\n        /// <summary>\n        /// Occurs upon opening the context menu.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void contextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            ContextMenuStrip contextMenuStripControl = sender as ContextMenuStrip;\n\n            e.Cancel = contextMenuStripControl?.SourceControl == null ||\n                       (!contextMenuStripControl.SourceControl.Visible && SelectedObject == null) ||\n                       (!tvItems.Visible && m_plan == null);\n\n            if (e.Cancel || contextMenuStripControl?.SourceControl == null)\n                return;\n            \n            contextMenuStripControl.SourceControl.Cursor = Cursors.Default;\n\n            UpdateContextMenu();\n        }\n\n        /// <summary>\n        /// Updates the context menu.\n        /// </summary>\n        private void UpdateContextMenu()\n        {\n            TreeNode node = tvItems.SelectedNode;\n\n            // Special case for mastery ship levels\n            PlanToMasteryLevel(node);\n\n            // \"Expand\" and \"Collapse\" selected menu\n            cmiExpandSelected.Visible = node != null && node.GetNodeCount(true) > 0 && !node.IsExpanded;\n            cmiCollapseSelected.Visible = node != null && node.GetNodeCount(true) > 0 && node.IsExpanded;\n\n            cmiExpandSelected.Text = node != null && node.GetNodeCount(true) > 0 && !node.IsExpanded\n                ? $\"Expand \\\"{node.Text.Replace(\"&\", \"&&\")}\\\"\"\n                : string.Empty;\n            cmiCollapseSelected.Text = node != null && node.GetNodeCount(true) > 0 && node.IsExpanded\n                ? $\"Collapse \\\"{node.Text.Replace(\"&\", \"&&\")}\\\"\"\n                : string.Empty;\n\n            tsSeparatorExpandCollapse.Visible = tvItems.Visible && node != null && node.GetNodeCount(true) > 0;\n\n            // \"Expand All\" and \"Collapse All\" menu\n            cmiCollapseAll.Enabled = cmiCollapseAll.Visible = AllExpanded && tvItems.Visible;\n            cmiExpandAll.Enabled = cmiExpandAll.Visible = !cmiCollapseAll.Enabled && tvItems.Visible;\n        }\n\n        /// <summary>\n        /// Plans to mastery level.\n        /// </summary>\n        /// <param name=\"node\">The node.</param>\n        private void PlanToMasteryLevel(TreeNode node)\n        {\n            cmiLvPlanTo.Visible = tsSeparatorPlanTo.Visible = Plan != null;\n\n            if (Plan == null)\n                return;\n\n            ShipSelectControl shipSelectorControl = this as ShipSelectControl;\n\n            cmiLvPlanTo.Visible = shipSelectorControl != null;\n            tsSeparatorPlanTo.Visible = shipSelectorControl != null && lbSearchList.Items.Count == 0;\n\n            if (shipSelectorControl == null || ((node != null) && node.GetNodeCount(true) > 0) || SelectedObject == null)\n            {\n                cmiLvPlanTo.Visible = false;\n                tsSeparatorPlanTo.Visible = false;\n                return;\n            }\n\n            MasteryShip masteryShip = ((Character)Plan.Character).MasteryShips.GetMasteryShipByID(SelectedObject.ID);\n\n            if (masteryShip == null)\n            {\n                cmiLvPlanTo.Enabled = false;\n                cmiLvPlanTo.Text = @\"Plan Mastery to...\";\n                return;\n            }\n\n            cmiLvPlanTo.Enabled = !Plan.WillGrantEligibilityFor(masteryShip.GetLevel(5));\n            cmiLvPlanTo.Text = $\"Plan \\\"{masteryShip.Ship.Name}\\\" Mastery to...\";\n\n            // \"Plan to N\" menus\n            for (int i = 1; i <= 5; i++)\n            {\n                SetAdditionMenuStatus(cmiLvPlanTo.DropDownItems[i - 1], masteryShip.GetLevel(i));\n            }\n        }\n\n        /// <summary>\n        /// Sets the visible status of the context menu submenu.\n        /// </summary>\n        /// <param name=\"menu\">The menu.</param>\n        /// <param name=\"masteryLevel\">The mastery level.</param>\n        private void SetAdditionMenuStatus(ToolStripItem menu, Mastery masteryLevel)\n        {\n            menu.Visible = masteryLevel != null;\n\n            if (masteryLevel == null)\n                return;\n\n            menu.Enabled = !Plan.WillGrantEligibilityFor(masteryLevel);\n\n            if (menu.Enabled)\n                menu.Tag = Plan.TryPlanTo(masteryLevel);\n        }\n\n        /// <summary>\n        /// Context > Plan To > Level N\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void planToLevelMenuItem_Click(object sender, EventArgs e)\n        {\n            IPlanOperation operation = ((ToolStripMenuItem)sender).Tag as IPlanOperation;\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            if (planWindow == null)\n                return;\n\n            PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow, operation);\n        }\n\n        #endregion\n\n\n        #region Predicates\n\n        /// <summary>\n        /// Filter for all items.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        protected bool SelectAll(Item item) => true;\n\n        /// <summary>\n        /// Filter for items which can be used (prereqs met).\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">item</exception>\n        protected bool CanUse(Item item)\n        {\n            item.ThrowIfNull(nameof(item));\n\n            IList<StaticSkillLevel> prerequisites =\n                item.Prerequisites.Where(x => x.Activity != BlueprintActivity.ReverseEngineering).ToList();\n\n            BlueprintSelectControl blueprintSelectControl = this as BlueprintSelectControl;\n\n            // Is item a blueprint and supports the selected activity ?  \n            if (blueprintSelectControl != null)\n            {\n                bool hasSelectedActivity = prerequisites.Any(x => x.Activity == Activity)\n                                           || ((Blueprint)item).MaterialRequirements.Any(x => x.Activity == Activity);\n\n                // Can not be used when item doesn't support the selected activity\n                if ((ActivityFilter == ObjectActivityFilter.Manufacturing || ActivityFilter == ObjectActivityFilter.Invention)\n                    && !hasSelectedActivity)\n                    return false;\n\n                // Enumerates the prerequisites skills to the selected activity \n                if (ActivityFilter != ObjectActivityFilter.All && ActivityFilter != ObjectActivityFilter.Any)\n                    prerequisites = prerequisites.Where(x => x.Activity == Activity).ToList();\n            }\n\n            // Item doesn't have prerequisites\n            if (!prerequisites.Any())\n                return true;\n\n            // Is this the \"Blueprint Browser\" and the activity filter is set to \"Any\" ?\n            List<bool> prereqTrained = new List<bool>();\n            if (blueprintSelectControl != null && ActivityFilter == ObjectActivityFilter.Any)\n            {\n                List<BlueprintActivity> prereqActivity = new List<BlueprintActivity>();\n\n                // Create a list with the activities this item supports\n                foreach (StaticSkillLevel prereq in prerequisites.Where(x => !prereqActivity.Contains(x.Activity)))\n                {\n                    prereqActivity.Add(prereq.Activity);\n                }\n\n                // Create a list with each prereq skill trained status for the questioned activity\n                foreach (BlueprintActivity activity in prereqActivity)\n                {\n                    prereqTrained.Clear();\n\n                    prereqTrained.AddRange(prerequisites\n                        .Where(prereq => prereq.Skill != null && prereq.Activity == activity)\n                        .Select(prereq => new\n                        {\n                            prereq,\n                            level = m_character.GetSkillLevel(prereq.Skill)\n                        })\n                        .Select(y => y.level >= y.prereq.Level));\n\n                    // Has the character trained all prereq skills for this activity ?\n                    if (prereqTrained.All(x => x))\n                        return true;\n                }\n                return false;\n            }\n\n            // Do a simple predication and create a list with each prereq skill trained status\n            prereqTrained.AddRange(prerequisites\n                .Where(prereq => prereq.Skill != null)\n                .Select(prereq => new\n                {\n                    prereq,\n                    level = m_character.GetSkillLevel(prereq.Skill)\n                })\n                .Select(y => y.level >= y.prereq.Level));\n\n            // Has the character trained all prereq skills ?\n            return prereqTrained.All(x => x);\n        }\n\n        /// <summary>\n        /// Filter for items which can not be used (prereqs not met).\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">item</exception>\n        protected bool CannotUse(Item item)\n        {\n            item.ThrowIfNull(nameof(item));\n\n            Blueprint blueprint = item as Blueprint;\n\n            bool hasActivity = blueprint == null || ActivityFilter == ObjectActivityFilter.All\n                               || blueprint.Prerequisites.Any(x => x.Activity == Activity)\n                               || blueprint.MaterialRequirements.Any(x => x.Activity == Activity);\n\n            // Special condition check for activity 'Any' \n            // as negative logic returns incorrect results\n            if (!(this is BlueprintSelectControl) || ActivityFilter != ObjectActivityFilter.Any)\n                return !CanUse(item) && hasActivity;\n\n            List<StaticSkillLevel> prerequisites =\n                item.Prerequisites.Where(x => x.Activity != BlueprintActivity.ReverseEngineering).ToList();\n\n            IEnumerable<bool> prereqTrained = prerequisites\n                .Where(prereq => prereq.Skill != null)\n                .Select(prereq => new\n                {\n                    prereq,\n                    level = m_character.GetSkillLevel(prereq.Skill)\n                })\n                .Select(y => y.level >= y.prereq.Level);\n\n            // Has the character trained all prereq skills for this activity ?\n            return prerequisites.Any() && !prereqTrained.All(x => x);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/EveObjectSelectControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"pbSerachTextDel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQg\n        djMuMzap5+IlAAAAUUlEQVQoU2NwdHSMCgwM3K+vry/KAAUgNkgMJMcAYqSlpf0PDw8/ApIAYRAbJAaS\n        A6uGCYBoZDbcVGRFGJIggFcBsiSIRmaDFRF0JH5vOkYBALc2UwG7hivNAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"pbSearchImage.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAr/AAAK/wE0YpqCAAACLklE\n        QVQ4T82TX0hTURzHV2B/QCGksIegArEMCveQMmbYQ1gucoTZZD2MGvjiHqa0ae1218Pc5W5Luy4NiuaY\n        FZWWNlg2UUQcFcZABkUFtlxlw4VOKmva+nbONZfKHoReevie8/t9z+/3OYcfHAmAf9KyxNY+FK7lvZOF\n        lU1jK/zBdD7VskSudnbOfE0gU2qIbJExa6lH96X+0nqqVEBvOS/0QllzAwVKO/YorDHqC7cCSOcvKhWY\n        2/rwIzGPh8NvYRCGsfNQIzbsM65Z9L2BMDjPKHJLraR8BaCh2ZdtbvVDy3ahrPo69iodkKuvoLCq7Y3W\n        dAd63gtVXQd2KzgCtkB74V52CkCensG0+DEZ/474bBKBF3FozD7kHeGwab9pxHjJS+qAL7PzGApN4aTx\n        PnIPc9RKAUx1fA818DT0CXbPcxzT3UZOMQvS3EABodcTCL76DN49gkpjF7bKGZx1+FgRYHcNTOsae1Be\n        0w5phYD8Mg55pRbkyBj6grCee7BwdoKcHbVh2wEGm4vqUaS6nBAB1msDSCZ/YTz6DY+ffYDFFcSOgxT+\n        d1Bn2E58jM4gHImhe3AMOr4f+YqFYUpMwiPMzf0kze/h6AhCc9H/nwFI80YKiExMo+/JOzjvjqLC0I1d\n        ZFYi4PQ590t1/U2UaFohq2qGTNWE7SVslEAy/wDWEcUU1VfHy3UuFJ9qgfS4DVkFtVMigC6rkdPTK/4N\n        smeo9O71RFk0T1u8ekHyG2jrt2s5yYVVAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"cmiLvPlanTo.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        vgAADr4B6kKxwAAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAALmSURB\n        VDhPZZJLTxNhFIaJP8JEFwb1FxhHV8QLujDRhXEBRI0GNQQSFAQRUUQwBAm30nKrFFqhF3qlLdPOUCgt\n        vQJthba00JarYiSDcWHcqenr0Bk1lTc5+VbP851zvi/nTza3tlyJRMIRjcXNwXBE7w6EtNO+ec2k158p\n        m3dOTbs8pbknTh7ikeykNjaYWCIJVygMncOLftKGVg2ZVQKD9Ve3QlN/+MjRg5JYMsV8+fYdH/a+YnVn\n        F+54CnPJTczGUtD6QtB4g5nqNdE/+1T6+mO5x7MlvkiUWd/dw9LmDhZSmwisbWEmmoDKHThQnTrrj2bl\n        +Fke5WL1LzCh9W325jWYF8JQs7f9D44459FGOnBdpEwXCEfP8ygX5YybmQqvgAxGMgLj/BIMc4uZ0xwI\n        Q+qYQ82YFcXDBlzseJcu7FFkC0RmG0MvxhD/+Bmrn3Yze/CurLGjbMMWSUAfWEbzhBPlCgsud8nTRX2q\n        bIHASDNTS3EEWWA2loSHhe3sDrqsLrRbnGi3uiGw+VA1pEOaIJDsbAePcmkaMzFqTxD7Xey3LrA40KCl\n        2JmdqFVTqNNOonPCDl1TE9JFNzISHuXSbrAyZDAK6v0yeqhZVI0aMUhOo54FW9jWhaQZIpEIFEWhv7IC\n        YrG0hEe5tGhIxsQuj16MQ2L3Q+kJQUC5MOZfgsw+CdsggcgUgcbGRjyQ6NOlCssFHuXyfGScKXurQolY\n        hVKJBo+ketwVq1Etk/+Fx7oJNOhIFMpMeGxw5vMolyuve5jb3TLcH1CinIUrR02olMqgHvgH1yg0qNTZ\n        cUtG4onZdYlHueQ3CplmPQ1jIILZlXV4olEYpRwsaSVYqRJlKhrV4w7cGbXiKenJFpx7JWSKe+UoH9aj\n        jv0w6r48+OgOyLsIPGTHKJFbUKGdxrMJN+4padRR/mzBqdo25nRdB4gXApx5KQTBPpOwgcDV1h7kvRna\n        /zy4NqBBwbAJN2VsB5Z9QU7ObwjkSucBbV0TAAAAAElFTkSuQmCC\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ImplantCalculatorWindow.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class ImplantCalculatorWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.gbAttributes = new System.Windows.Forms.GroupBox();\n            this.AtrributesPanel = new System.Windows.Forms.Panel();\n            this.lblEffectiveWillpower = new System.Windows.Forms.Label();\n            this.nudIntelligence = new System.Windows.Forms.NumericUpDown();\n            this.lblEffectiveMemory = new System.Windows.Forms.Label();\n            this.lblIntelligence = new System.Windows.Forms.Label();\n            this.lblEffectivePerception = new System.Windows.Forms.Label();\n            this.nudCharisma = new System.Windows.Forms.NumericUpDown();\n            this.nudPerception = new System.Windows.Forms.NumericUpDown();\n            this.lblMemory = new System.Windows.Forms.Label();\n            this.lblCharisma = new System.Windows.Forms.Label();\n            this.lblAdjustMemory = new System.Windows.Forms.Label();\n            this.lblEffectiveCharisma = new System.Windows.Forms.Label();\n            this.nudMemory = new System.Windows.Forms.NumericUpDown();\n            this.lblEffectiveIntelligence = new System.Windows.Forms.Label();\n            this.lbWillpower = new System.Windows.Forms.Label();\n            this.lblAdjustCharisma = new System.Windows.Forms.Label();\n            this.lblEffective = new System.Windows.Forms.Label();\n            this.lblAdjustWillpower = new System.Windows.Forms.Label();\n            this.lblPerception = new System.Windows.Forms.Label();\n            this.nudWillpower = new System.Windows.Forms.NumericUpDown();\n            this.lblAdjustPerception = new System.Windows.Forms.Label();\n            this.lblAdjustIntelligence = new System.Windows.Forms.Label();\n            this.lblImplants = new System.Windows.Forms.Label();\n            this.gbCurrentBase = new System.Windows.Forms.GroupBox();\n            this.lblBaseDate = new System.Windows.Forms.Label();\n            this.lblBaseSpan = new System.Windows.Forms.Label();\n            this.gbCurrent = new System.Windows.Forms.GroupBox();\n            this.lblCurrentDate = new System.Windows.Forms.Label();\n            this.lblCurrentSpan = new System.Windows.Forms.Label();\n            this.gbWithThisAttributes = new System.Windows.Forms.GroupBox();\n            this.lblComparedToCurrent = new System.Windows.Forms.Label();\n            this.lblComparedToBase = new System.Windows.Forms.Label();\n            this.lblThisDate = new System.Windows.Forms.Label();\n            this.lblThisSpan = new System.Windows.Forms.Label();\n            this.miNoImplants = new System.Windows.Forms.ToolStripMenuItem();\n            this.miCurrentClone = new System.Windows.Forms.ToolStripMenuItem();\n            this.miJumpClone1 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miJumpClone2 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miJumpClone3 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miJumpClone4 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miJumpClone5 = new System.Windows.Forms.ToolStripMenuItem();\n            this.lblNotice = new System.Windows.Forms.Label();\n            this.gbAttributes.SuspendLayout();\n            this.AtrributesPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.nudIntelligence)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.nudCharisma)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.nudPerception)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.nudMemory)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.nudWillpower)).BeginInit();\n            this.gbCurrentBase.SuspendLayout();\n            this.gbCurrent.SuspendLayout();\n            this.gbWithThisAttributes.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // gbAttributes\n            // \n            this.gbAttributes.Controls.Add(this.AtrributesPanel);\n            this.gbAttributes.Location = new System.Drawing.Point(9, 25);\n            this.gbAttributes.Name = \"gbAttributes\";\n            this.gbAttributes.Size = new System.Drawing.Size(249, 188);\n            this.gbAttributes.TabIndex = 0;\n            this.gbAttributes.TabStop = false;\n            this.gbAttributes.Text = \"Attributes of \\\"Implant Set Name\\\"\";\n            // \n            // AtrributesPanel\n            // \n            this.AtrributesPanel.Controls.Add(this.lblEffectiveWillpower);\n            this.AtrributesPanel.Controls.Add(this.nudIntelligence);\n            this.AtrributesPanel.Controls.Add(this.lblEffectiveMemory);\n            this.AtrributesPanel.Controls.Add(this.lblIntelligence);\n            this.AtrributesPanel.Controls.Add(this.lblEffectivePerception);\n            this.AtrributesPanel.Controls.Add(this.nudCharisma);\n            this.AtrributesPanel.Controls.Add(this.nudPerception);\n            this.AtrributesPanel.Controls.Add(this.lblMemory);\n            this.AtrributesPanel.Controls.Add(this.lblCharisma);\n            this.AtrributesPanel.Controls.Add(this.lblAdjustMemory);\n            this.AtrributesPanel.Controls.Add(this.lblEffectiveCharisma);\n            this.AtrributesPanel.Controls.Add(this.nudMemory);\n            this.AtrributesPanel.Controls.Add(this.lblEffectiveIntelligence);\n            this.AtrributesPanel.Controls.Add(this.lbWillpower);\n            this.AtrributesPanel.Controls.Add(this.lblAdjustCharisma);\n            this.AtrributesPanel.Controls.Add(this.lblEffective);\n            this.AtrributesPanel.Controls.Add(this.lblAdjustWillpower);\n            this.AtrributesPanel.Controls.Add(this.lblPerception);\n            this.AtrributesPanel.Controls.Add(this.nudWillpower);\n            this.AtrributesPanel.Controls.Add(this.lblAdjustPerception);\n            this.AtrributesPanel.Controls.Add(this.lblAdjustIntelligence);\n            this.AtrributesPanel.Controls.Add(this.lblImplants);\n            this.AtrributesPanel.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.AtrributesPanel.Location = new System.Drawing.Point(3, 28);\n            this.AtrributesPanel.Name = \"AtrributesPanel\";\n            this.AtrributesPanel.Padding = new System.Windows.Forms.Padding(3);\n            this.AtrributesPanel.Size = new System.Drawing.Size(243, 157);\n            this.AtrributesPanel.TabIndex = 5;\n            // \n            // lblEffectiveWillpower\n            // \n            this.lblEffectiveWillpower.AutoSize = true;\n            this.lblEffectiveWillpower.Location = new System.Drawing.Point(177, 110);\n            this.lblEffectiveWillpower.Name = \"lblEffectiveWillpower\";\n            this.lblEffectiveWillpower.Size = new System.Drawing.Size(34, 13);\n            this.lblEffectiveWillpower.TabIndex = 17;\n            this.lblEffectiveWillpower.Text = \"22.14\";\n            // \n            // nudIntelligence\n            // \n            this.nudIntelligence.Location = new System.Drawing.Point(71, 24);\n            this.nudIntelligence.Maximum = new decimal(new int[] {\n            50,\n            0,\n            0,\n            0});\n            this.nudIntelligence.Minimum = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudIntelligence.Name = \"nudIntelligence\";\n            this.nudIntelligence.Size = new System.Drawing.Size(39, 20);\n            this.nudIntelligence.TabIndex = 3;\n            this.nudIntelligence.Tag = \"0\";\n            this.nudIntelligence.Value = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudIntelligence.ValueChanged += new System.EventHandler(this.nudIntelligence_ValueChanged);\n            // \n            // lblEffectiveMemory\n            // \n            this.lblEffectiveMemory.AutoSize = true;\n            this.lblEffectiveMemory.Location = new System.Drawing.Point(177, 137);\n            this.lblEffectiveMemory.Name = \"lblEffectiveMemory\";\n            this.lblEffectiveMemory.Size = new System.Drawing.Size(34, 13);\n            this.lblEffectiveMemory.TabIndex = 21;\n            this.lblEffectiveMemory.Text = \"22.14\";\n            // \n            // lblIntelligence\n            // \n            this.lblIntelligence.AutoSize = true;\n            this.lblIntelligence.Location = new System.Drawing.Point(2, 29);\n            this.lblIntelligence.Name = \"lblIntelligence\";\n            this.lblIntelligence.Size = new System.Drawing.Size(64, 13);\n            this.lblIntelligence.TabIndex = 2;\n            this.lblIntelligence.Text = \"Intelligence:\";\n            // \n            // lblEffectivePerception\n            // \n            this.lblEffectivePerception.AutoSize = true;\n            this.lblEffectivePerception.Location = new System.Drawing.Point(177, 56);\n            this.lblEffectivePerception.Name = \"lblEffectivePerception\";\n            this.lblEffectivePerception.Size = new System.Drawing.Size(34, 13);\n            this.lblEffectivePerception.TabIndex = 9;\n            this.lblEffectivePerception.Text = \"22.14\";\n            // \n            // nudCharisma\n            // \n            this.nudCharisma.Location = new System.Drawing.Point(71, 78);\n            this.nudCharisma.Maximum = new decimal(new int[] {\n            50,\n            0,\n            0,\n            0});\n            this.nudCharisma.Minimum = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudCharisma.Name = \"nudCharisma\";\n            this.nudCharisma.Size = new System.Drawing.Size(39, 20);\n            this.nudCharisma.TabIndex = 11;\n            this.nudCharisma.Tag = \"2\";\n            this.nudCharisma.Value = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudCharisma.ValueChanged += new System.EventHandler(this.nudCharisma_ValueChanged);\n            // \n            // nudPerception\n            // \n            this.nudPerception.Location = new System.Drawing.Point(71, 51);\n            this.nudPerception.Maximum = new decimal(new int[] {\n            50,\n            0,\n            0,\n            0});\n            this.nudPerception.Minimum = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudPerception.Name = \"nudPerception\";\n            this.nudPerception.Size = new System.Drawing.Size(39, 20);\n            this.nudPerception.TabIndex = 7;\n            this.nudPerception.Tag = \"1\";\n            this.nudPerception.Value = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudPerception.ValueChanged += new System.EventHandler(this.nudPerception_ValueChanged);\n            // \n            // lblMemory\n            // \n            this.lblMemory.AutoSize = true;\n            this.lblMemory.Location = new System.Drawing.Point(2, 137);\n            this.lblMemory.Name = \"lblMemory\";\n            this.lblMemory.Size = new System.Drawing.Size(47, 13);\n            this.lblMemory.TabIndex = 18;\n            this.lblMemory.Text = \"Memory:\";\n            // \n            // lblCharisma\n            // \n            this.lblCharisma.AutoSize = true;\n            this.lblCharisma.Location = new System.Drawing.Point(2, 83);\n            this.lblCharisma.Name = \"lblCharisma\";\n            this.lblCharisma.Size = new System.Drawing.Size(53, 13);\n            this.lblCharisma.TabIndex = 10;\n            this.lblCharisma.Text = \"Charisma:\";\n            // \n            // lblAdjustMemory\n            // \n            this.lblAdjustMemory.AutoSize = true;\n            this.lblAdjustMemory.Location = new System.Drawing.Point(131, 137);\n            this.lblAdjustMemory.Name = \"lblAdjustMemory\";\n            this.lblAdjustMemory.Size = new System.Drawing.Size(19, 13);\n            this.lblAdjustMemory.TabIndex = 20;\n            this.lblAdjustMemory.Text = \"+0\";\n            // \n            // lblEffectiveCharisma\n            // \n            this.lblEffectiveCharisma.AutoSize = true;\n            this.lblEffectiveCharisma.Location = new System.Drawing.Point(177, 83);\n            this.lblEffectiveCharisma.Name = \"lblEffectiveCharisma\";\n            this.lblEffectiveCharisma.Size = new System.Drawing.Size(34, 13);\n            this.lblEffectiveCharisma.TabIndex = 13;\n            this.lblEffectiveCharisma.Text = \"22.14\";\n            // \n            // nudMemory\n            // \n            this.nudMemory.Location = new System.Drawing.Point(71, 132);\n            this.nudMemory.Maximum = new decimal(new int[] {\n            50,\n            0,\n            0,\n            0});\n            this.nudMemory.Minimum = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudMemory.Name = \"nudMemory\";\n            this.nudMemory.Size = new System.Drawing.Size(39, 20);\n            this.nudMemory.TabIndex = 19;\n            this.nudMemory.Tag = \"4\";\n            this.nudMemory.Value = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudMemory.ValueChanged += new System.EventHandler(this.nudMemory_ValueChanged);\n            // \n            // lblEffectiveIntelligence\n            // \n            this.lblEffectiveIntelligence.AutoSize = true;\n            this.lblEffectiveIntelligence.Location = new System.Drawing.Point(177, 29);\n            this.lblEffectiveIntelligence.Name = \"lblEffectiveIntelligence\";\n            this.lblEffectiveIntelligence.Size = new System.Drawing.Size(34, 13);\n            this.lblEffectiveIntelligence.TabIndex = 5;\n            this.lblEffectiveIntelligence.Text = \"22.14\";\n            // \n            // lbWillpower\n            // \n            this.lbWillpower.AutoSize = true;\n            this.lbWillpower.Location = new System.Drawing.Point(2, 110);\n            this.lbWillpower.Name = \"lbWillpower\";\n            this.lbWillpower.Size = new System.Drawing.Size(56, 13);\n            this.lbWillpower.TabIndex = 14;\n            this.lbWillpower.Text = \"Willpower:\";\n            // \n            // lblAdjustCharisma\n            // \n            this.lblAdjustCharisma.AutoSize = true;\n            this.lblAdjustCharisma.Location = new System.Drawing.Point(131, 83);\n            this.lblAdjustCharisma.Name = \"lblAdjustCharisma\";\n            this.lblAdjustCharisma.Size = new System.Drawing.Size(19, 13);\n            this.lblAdjustCharisma.TabIndex = 12;\n            this.lblAdjustCharisma.Text = \"+0\";\n            // \n            // lblEffective\n            // \n            this.lblEffective.AutoSize = true;\n            this.lblEffective.Location = new System.Drawing.Point(171, 5);\n            this.lblEffective.Name = \"lblEffective\";\n            this.lblEffective.Size = new System.Drawing.Size(49, 13);\n            this.lblEffective.TabIndex = 1;\n            this.lblEffective.Text = \"Effective\";\n            // \n            // lblAdjustWillpower\n            // \n            this.lblAdjustWillpower.AutoSize = true;\n            this.lblAdjustWillpower.Location = new System.Drawing.Point(131, 110);\n            this.lblAdjustWillpower.Name = \"lblAdjustWillpower\";\n            this.lblAdjustWillpower.Size = new System.Drawing.Size(19, 13);\n            this.lblAdjustWillpower.TabIndex = 16;\n            this.lblAdjustWillpower.Text = \"+0\";\n            // \n            // lblPerception\n            // \n            this.lblPerception.AutoSize = true;\n            this.lblPerception.Location = new System.Drawing.Point(2, 56);\n            this.lblPerception.Name = \"lblPerception\";\n            this.lblPerception.Size = new System.Drawing.Size(61, 13);\n            this.lblPerception.TabIndex = 6;\n            this.lblPerception.Text = \"Perception:\";\n            // \n            // nudWillpower\n            // \n            this.nudWillpower.Location = new System.Drawing.Point(71, 105);\n            this.nudWillpower.Maximum = new decimal(new int[] {\n            50,\n            0,\n            0,\n            0});\n            this.nudWillpower.Minimum = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudWillpower.Name = \"nudWillpower\";\n            this.nudWillpower.Size = new System.Drawing.Size(39, 20);\n            this.nudWillpower.TabIndex = 15;\n            this.nudWillpower.Tag = \"3\";\n            this.nudWillpower.Value = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudWillpower.ValueChanged += new System.EventHandler(this.nudWillpower_ValueChanged);\n            // \n            // lblAdjustPerception\n            // \n            this.lblAdjustPerception.AutoSize = true;\n            this.lblAdjustPerception.Location = new System.Drawing.Point(131, 56);\n            this.lblAdjustPerception.Name = \"lblAdjustPerception\";\n            this.lblAdjustPerception.Size = new System.Drawing.Size(19, 13);\n            this.lblAdjustPerception.TabIndex = 8;\n            this.lblAdjustPerception.Text = \"+0\";\n            // \n            // lblAdjustIntelligence\n            // \n            this.lblAdjustIntelligence.AutoSize = true;\n            this.lblAdjustIntelligence.Location = new System.Drawing.Point(131, 29);\n            this.lblAdjustIntelligence.Name = \"lblAdjustIntelligence\";\n            this.lblAdjustIntelligence.Size = new System.Drawing.Size(19, 13);\n            this.lblAdjustIntelligence.TabIndex = 4;\n            this.lblAdjustIntelligence.Text = \"+0\";\n            // \n            // lblImplants\n            // \n            this.lblImplants.AutoSize = true;\n            this.lblImplants.Location = new System.Drawing.Point(120, 5);\n            this.lblImplants.Name = \"lblImplants\";\n            this.lblImplants.Size = new System.Drawing.Size(46, 13);\n            this.lblImplants.TabIndex = 0;\n            this.lblImplants.Text = \"Implants\";\n            // \n            // gbCurrentBase\n            // \n            this.gbCurrentBase.Controls.Add(this.lblBaseDate);\n            this.gbCurrentBase.Controls.Add(this.lblBaseSpan);\n            this.gbCurrentBase.Location = new System.Drawing.Point(264, 25);\n            this.gbCurrentBase.Name = \"gbCurrentBase\";\n            this.gbCurrentBase.Size = new System.Drawing.Size(279, 50);\n            this.gbCurrentBase.TabIndex = 2;\n            this.gbCurrentBase.TabStop = false;\n            this.gbCurrentBase.Text = \"Current base (without implants)\";\n            // \n            // lblBaseDate\n            // \n            this.lblBaseDate.AutoSize = true;\n            this.lblBaseDate.Location = new System.Drawing.Point(6, 30);\n            this.lblBaseDate.Name = \"lblBaseDate\";\n            this.lblBaseDate.Size = new System.Drawing.Size(94, 13);\n            this.lblBaseDate.TabIndex = 1;\n            this.lblBaseDate.Text = \"Current Base Date\";\n            // \n            // lblBaseSpan\n            // \n            this.lblBaseSpan.AutoSize = true;\n            this.lblBaseSpan.Location = new System.Drawing.Point(6, 17);\n            this.lblBaseSpan.Name = \"lblBaseSpan\";\n            this.lblBaseSpan.Size = new System.Drawing.Size(96, 13);\n            this.lblBaseSpan.TabIndex = 0;\n            this.lblBaseSpan.Text = \"Current Base Span\";\n            // \n            // gbCurrent\n            // \n            this.gbCurrent.Controls.Add(this.lblCurrentDate);\n            this.gbCurrent.Controls.Add(this.lblCurrentSpan);\n            this.gbCurrent.Location = new System.Drawing.Point(264, 81);\n            this.gbCurrent.Name = \"gbCurrent\";\n            this.gbCurrent.Size = new System.Drawing.Size(279, 50);\n            this.gbCurrent.TabIndex = 3;\n            this.gbCurrent.TabStop = false;\n            this.gbCurrent.Text = \"Current (with implants)\";\n            // \n            // lblCurrentDate\n            // \n            this.lblCurrentDate.AutoSize = true;\n            this.lblCurrentDate.Location = new System.Drawing.Point(6, 30);\n            this.lblCurrentDate.Name = \"lblCurrentDate\";\n            this.lblCurrentDate.Size = new System.Drawing.Size(67, 13);\n            this.lblCurrentDate.TabIndex = 1;\n            this.lblCurrentDate.Text = \"Current Date\";\n            // \n            // lblCurrentSpan\n            // \n            this.lblCurrentSpan.AutoSize = true;\n            this.lblCurrentSpan.Location = new System.Drawing.Point(6, 17);\n            this.lblCurrentSpan.Name = \"lblCurrentSpan\";\n            this.lblCurrentSpan.Size = new System.Drawing.Size(69, 13);\n            this.lblCurrentSpan.TabIndex = 0;\n            this.lblCurrentSpan.Text = \"Current Span\";\n            // \n            // gbWithThisAttributes\n            // \n            this.gbWithThisAttributes.Controls.Add(this.lblComparedToCurrent);\n            this.gbWithThisAttributes.Controls.Add(this.lblComparedToBase);\n            this.gbWithThisAttributes.Controls.Add(this.lblThisDate);\n            this.gbWithThisAttributes.Controls.Add(this.lblThisSpan);\n            this.gbWithThisAttributes.Location = new System.Drawing.Point(264, 137);\n            this.gbWithThisAttributes.Name = \"gbWithThisAttributes\";\n            this.gbWithThisAttributes.Size = new System.Drawing.Size(279, 76);\n            this.gbWithThisAttributes.TabIndex = 4;\n            this.gbWithThisAttributes.TabStop = false;\n            this.gbWithThisAttributes.Text = \"With These Attributes\";\n            // \n            // lblComparedToCurrent\n            // \n            this.lblComparedToCurrent.AutoSize = true;\n            this.lblComparedToCurrent.Location = new System.Drawing.Point(6, 56);\n            this.lblComparedToCurrent.Name = \"lblComparedToCurrent\";\n            this.lblComparedToCurrent.Size = new System.Drawing.Size(102, 13);\n            this.lblComparedToCurrent.TabIndex = 3;\n            this.lblComparedToCurrent.Text = \"Compare To Current\";\n            // \n            // lblComparedToBase\n            // \n            this.lblComparedToBase.AutoSize = true;\n            this.lblComparedToBase.Location = new System.Drawing.Point(6, 43);\n            this.lblComparedToBase.Name = \"lblComparedToBase\";\n            this.lblComparedToBase.Size = new System.Drawing.Size(129, 13);\n            this.lblComparedToBase.TabIndex = 2;\n            this.lblComparedToBase.Text = \"Compare To Current Base\";\n            // \n            // lblThisDate\n            // \n            this.lblThisDate.AutoSize = true;\n            this.lblThisDate.Location = new System.Drawing.Point(6, 30);\n            this.lblThisDate.Name = \"lblThisDate\";\n            this.lblThisDate.Size = new System.Drawing.Size(53, 13);\n            this.lblThisDate.TabIndex = 1;\n            this.lblThisDate.Text = \"This Date\";\n            // \n            // lblThisSpan\n            // \n            this.lblThisSpan.AutoSize = true;\n            this.lblThisSpan.Location = new System.Drawing.Point(6, 17);\n            this.lblThisSpan.Name = \"lblThisSpan\";\n            this.lblThisSpan.Size = new System.Drawing.Size(55, 13);\n            this.lblThisSpan.TabIndex = 0;\n            this.lblThisSpan.Text = \"This Span\";\n            // \n            // miNoImplants\n            // \n            this.miNoImplants.Name = \"miNoImplants\";\n            this.miNoImplants.Size = new System.Drawing.Size(32, 19);\n            // \n            // miCurrentClone\n            // \n            this.miCurrentClone.Name = \"miCurrentClone\";\n            this.miCurrentClone.Size = new System.Drawing.Size(32, 19);\n            // \n            // miJumpClone1\n            // \n            this.miJumpClone1.Name = \"miJumpClone1\";\n            this.miJumpClone1.Size = new System.Drawing.Size(32, 19);\n            // \n            // miJumpClone2\n            // \n            this.miJumpClone2.Name = \"miJumpClone2\";\n            this.miJumpClone2.Size = new System.Drawing.Size(32, 19);\n            // \n            // miJumpClone3\n            // \n            this.miJumpClone3.Name = \"miJumpClone3\";\n            this.miJumpClone3.Size = new System.Drawing.Size(32, 19);\n            // \n            // miJumpClone4\n            // \n            this.miJumpClone4.Name = \"miJumpClone4\";\n            this.miJumpClone4.Size = new System.Drawing.Size(32, 19);\n            // \n            // miJumpClone5\n            // \n            this.miJumpClone5.Name = \"miJumpClone5\";\n            this.miJumpClone5.Size = new System.Drawing.Size(32, 19);\n            // \n            // lblNotice\n            // \n            this.lblNotice.AutoSize = true;\n            this.lblNotice.ForeColor = System.Drawing.Color.Red;\n            this.lblNotice.Location = new System.Drawing.Point(6, 7);\n            this.lblNotice.Name = \"lblNotice\";\n            this.lblNotice.Size = new System.Drawing.Size(294, 13);\n            this.lblNotice.TabIndex = 6;\n            this.lblNotice.Text = \"Notice! This is not the active \\\"Implant Set\\\" of your character.\";\n            // \n            // ImplantCalculator\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.ClientSize = new System.Drawing.Size(553, 219);\n            this.Controls.Add(this.lblNotice);\n            this.Controls.Add(this.gbWithThisAttributes);\n            this.Controls.Add(this.gbCurrent);\n            this.Controls.Add(this.gbCurrentBase);\n            this.Controls.Add(this.gbAttributes);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\n            this.MaximizeBox = false;\n            this.Name = \"ImplantCalculator\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Implant Calculator\";\n            this.gbAttributes.ResumeLayout(false);\n            this.AtrributesPanel.ResumeLayout(false);\n            this.AtrributesPanel.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.nudIntelligence)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.nudCharisma)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.nudPerception)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.nudMemory)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.nudWillpower)).EndInit();\n            this.gbCurrentBase.ResumeLayout(false);\n            this.gbCurrentBase.PerformLayout();\n            this.gbCurrent.ResumeLayout(false);\n            this.gbCurrent.PerformLayout();\n            this.gbWithThisAttributes.ResumeLayout(false);\n            this.gbWithThisAttributes.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.GroupBox gbAttributes;\n        private System.Windows.Forms.NumericUpDown nudIntelligence;\n        private System.Windows.Forms.Label lblIntelligence;\n        private System.Windows.Forms.Label lbWillpower;\n        private System.Windows.Forms.Label lblMemory;\n        private System.Windows.Forms.Label lblPerception;\n        private System.Windows.Forms.Label lblCharisma;\n        private System.Windows.Forms.NumericUpDown nudWillpower;\n        private System.Windows.Forms.NumericUpDown nudMemory;\n        private System.Windows.Forms.NumericUpDown nudPerception;\n        private System.Windows.Forms.NumericUpDown nudCharisma;\n        private System.Windows.Forms.Label lblImplants;\n        private System.Windows.Forms.Label lblEffectiveWillpower;\n        private System.Windows.Forms.Label lblEffectiveMemory;\n        private System.Windows.Forms.Label lblEffectivePerception;\n        private System.Windows.Forms.Label lblEffectiveCharisma;\n        private System.Windows.Forms.Label lblEffectiveIntelligence;\n        private System.Windows.Forms.Label lblEffective;\n        private System.Windows.Forms.Label lblAdjustWillpower;\n        private System.Windows.Forms.Label lblAdjustMemory;\n        private System.Windows.Forms.Label lblAdjustPerception;\n        private System.Windows.Forms.Label lblAdjustCharisma;\n        private System.Windows.Forms.Label lblAdjustIntelligence;\n        private System.Windows.Forms.GroupBox gbCurrentBase;\n        private System.Windows.Forms.Label lblBaseDate;\n        private System.Windows.Forms.Label lblBaseSpan;\n        private System.Windows.Forms.GroupBox gbCurrent;\n        private System.Windows.Forms.Label lblCurrentDate;\n        private System.Windows.Forms.Label lblCurrentSpan;\n        private System.Windows.Forms.GroupBox gbWithThisAttributes;\n        private System.Windows.Forms.Label lblThisDate;\n        private System.Windows.Forms.Label lblThisSpan;\n        private System.Windows.Forms.Panel AtrributesPanel;\n        private System.Windows.Forms.Label lblComparedToCurrent;\n        private System.Windows.Forms.Label lblComparedToBase;\n        private System.Windows.Forms.ToolStripMenuItem miNoImplants;\n        private System.Windows.Forms.ToolStripMenuItem miCurrentClone;\n        private System.Windows.Forms.ToolStripMenuItem miJumpClone1;\n        private System.Windows.Forms.ToolStripMenuItem miJumpClone2;\n        private System.Windows.Forms.ToolStripMenuItem miJumpClone3;\n        private System.Windows.Forms.ToolStripMenuItem miJumpClone4;\n        private System.Windows.Forms.ToolStripMenuItem miJumpClone5;\n        private System.Windows.Forms.Label lblNotice;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ImplantCalculatorWindow.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Globalization;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// This controls allows the user to see how its plan's comutation times would change wth different implants.\n    /// </summary>\n    public partial class ImplantCalculatorWindow : EVEMonForm, IPlanOrderPluggable\n    {\n        private readonly PlanEditorControl m_planEditor;\n\n        private Character m_character;\n        private Plan m_plan;\n\n        private bool m_init;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Prevents a default instance of the <see cref=\"ImplantCalculatorWindow\"/> class from being created.\n        /// Default constructor for designer.\n        /// </summary>\n        private ImplantCalculatorWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ImplantCalculatorWindow\"/> class.\n        /// Constructor used in WindowsFactory.\n        /// </summary>\n        /// <param name=\"planEditor\">The plan editor.</param>\n        public ImplantCalculatorWindow(PlanEditorControl planEditor)\n            : this()\n        {\n            m_planEditor = planEditor;\n            Plan = planEditor.Plan;\n\n            planEditor.ShowWithPluggable(this);\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load, update the controls states.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Set the min and max values of the NumericUpDown controls\n            // based on character attributes value\n            foreach (NumericUpDown nud in AtrributesPanel.Controls.OfType<NumericUpDown>())\n            {\n                string tag = (nud.Tag as string) ?? string.Empty;\n                int attribIndex;\n                if (tag.TryParseInv(out attribIndex))\n                {\n                    var attrib = (EveAttribute)attribIndex;\n                    var charAttribute = m_character[attrib];\n                    long min = charAttribute.EffectiveValue - charAttribute.ImplantBonus;\n                    nud.Minimum = min;\n                    nud.Maximum = min + Math.Min(m_plan.ChosenImplantSet[attrib].Bonus,\n                        EveConstants. MaxImplantPoints);\n                }\n            }\n\n            EveMonClient.PlanNameChanged += EveMonClient_PlanNameChanged;\n\n            m_init = true;\n        }\n\n        /// <summary>\n        /// On closing, we unsubscribe the global events to help the GC.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            EveMonClient.PlanNameChanged -= EveMonClient_PlanNameChanged;\n        }\n\n        #endregion\n\n\n        #region Internal Properties\n\n        /// <summary>\n        /// Gets or sets the plan.\n        /// </summary>\n        /// <value>\n        /// The plan.\n        /// </value>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                if (m_plan == value)\n                    return;\n\n                m_plan = value;\n                m_character = (Character)m_plan.Character;\n\n                // Used by WindowsFactory.GetByTag\n                //Tag = m_plan;\n\n                // Update the title\n                UpdateTitle();\n\n                // Update the content\n                UpdateContentAsync().ConfigureAwait(true);\n            }\n        }\n\n        #endregion\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Update all the numeric boxes\n        /// </summary>\n        private async Task UpdateContentAsync()\n        {\n            gbAttributes.Text = $\"Attributes of \\\"{m_plan.ChosenImplantSet.Name}\\\"\";\n\n            CharacterScratchpad characterScratchpad = m_plan.Character.After(m_plan.ChosenImplantSet);\n\n            nudCharisma.Value = characterScratchpad.Charisma.EffectiveValue;\n            nudWillpower.Value = characterScratchpad.Willpower.EffectiveValue;\n            nudIntelligence.Value = characterScratchpad.Intelligence.EffectiveValue;\n            nudPerception.Value = characterScratchpad.Perception.EffectiveValue;\n            nudMemory.Value = characterScratchpad.Memory.EffectiveValue;\n\n            // If the implant set isn't the active one we notify the user\n            lblNotice.Visible = m_plan.ChosenImplantSet != m_character.ImplantSets.Current;\n\n            //  Update all the times on the right pane\n            await UpdateTimesAsync();\n        }\n\n        /// <summary>\n        /// Updates the labels on the right of the numeric box.\n        /// </summary>\n        /// <param name=\"attrib\"></param>\n        /// <param name=\"myValue\"></param>\n        /// <param name=\"lblAdjust\"></param>\n        /// <param name=\"lblEffectiveAttribute\"></param>\n        private void UpdateAttributeLabels(EveAttribute attrib, int myValue, Control lblAdjust, Control lblEffectiveAttribute)\n        {\n            CharacterScratchpad characterScratchpad = m_plan.Character.After(m_plan.ChosenImplantSet);\n\n            long baseAttr = characterScratchpad[attrib].EffectiveValue - characterScratchpad[attrib].ImplantBonus;\n            long adjust = myValue - baseAttr;\n\n            lblAdjust.ForeColor = adjust >= 0 ? SystemColors.ControlText : Color.Red;\n            lblAdjust.Text = $\"{(adjust >= 0 ? \"+\" : string.Empty)}{adjust}\";\n            lblEffectiveAttribute.Text = characterScratchpad[attrib].EffectiveValue.ToNumericString(0);\n        }\n\n        /// <summary>\n        /// Update all the times on the right pane (base time, best time, etc).\n        /// </summary>\n        private async Task UpdateTimesAsync()\n        {\n            // Current (with implants)\n            TimeSpan currentSpan = await UpdateTimesForCharacter(m_character.After(m_plan.ChosenImplantSet));\n\n            // Current (without implants)\n            ImplantSet noneImplantSet = m_character.ImplantSets.None;\n            TimeSpan baseSpan = await UpdateTimesForCharacter(m_character.After(noneImplantSet));\n\n            // This\n            CharacterScratchpad scratchpad = CreateModifiedScratchpad(m_character.After(m_plan.ChosenImplantSet));\n            TimeSpan thisSpan = await UpdateTimesForCharacter(scratchpad);\n\n            lblCurrentSpan.Text = currentSpan.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n            lblCurrentDate.Text = DateTime.Now.Add(currentSpan).ToString(CultureConstants.DefaultCulture);\n            lblBaseSpan.Text = baseSpan.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n            lblBaseDate.Text = DateTime.Now.Add(baseSpan).ToString(CultureConstants.DefaultCulture);\n            lblThisSpan.Text = thisSpan.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n            lblThisDate.Text = DateTime.Now.Add(thisSpan).ToString(CultureConstants.DefaultCulture);\n\n            // Are the new attributes better than current (without implants) ?\n            lblComparedToBase.ForeColor = thisSpan > baseSpan\n                ? Color.Red\n                : thisSpan < baseSpan ? Color.Green : SystemColors.ControlText;\n            lblComparedToBase.Text = thisSpan > baseSpan\n                ? $\"{thisSpan.Subtract(baseSpan).ToDescriptiveText(DescriptiveTextOptions.IncludeCommas)} slower than current base\"\n                : thisSpan < baseSpan\n                    ? $\"{baseSpan.Subtract(thisSpan).ToDescriptiveText(DescriptiveTextOptions.IncludeCommas)} faster than current base\"\n                    : @\"No time difference than current base\";\n\n            // Are the new attributes better than current (with implants) ?\n            lblComparedToCurrent.ForeColor = thisSpan > currentSpan\n                ? Color.DarkRed\n                : thisSpan < currentSpan ? Color.DarkGreen : SystemColors.ControlText;\n            lblComparedToCurrent.Text = thisSpan > currentSpan\n                ? $\"{thisSpan.Subtract(currentSpan).ToDescriptiveText(DescriptiveTextOptions.IncludeCommas)} slower than current\"\n                : thisSpan < currentSpan\n                    ? $\"{currentSpan.Subtract(thisSpan).ToDescriptiveText(DescriptiveTextOptions.IncludeCommas)} faster than current\"\n                    : @\"No time difference than current base\";\n\n            // Update the plan's pluggable column\n            m_planEditor?.ShowWithPluggable(this);\n        }\n\n        /// <summary>\n        /// Update the times labels from the given character\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <returns></returns>\n        private Task<TimeSpan> UpdateTimesForCharacter(BaseCharacter character)\n            => TaskHelper.RunCPUBoundTaskAsync(() => character.GetTrainingTimeToMultipleSkills(m_plan));\n\n        #endregion\n\n\n        #region Controls events\n\n        /// <summary>\n        /// When the intelligence numeric box changed, we update the attributes labels and the times on the right pane.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void nudIntelligence_ValueChanged(object sender, EventArgs e)\n        {\n            UpdateAttributeLabels(EveAttribute.Intelligence, (int)nudIntelligence.Value,\n                lblAdjustIntelligence, lblEffectiveIntelligence);\n\n            if (!m_init)\n                return;\n\n            //  Update all the times on the right pane\n            await UpdateTimesAsync();\n        }\n\n        /// <summary>\n        /// When the charisma numeric box changed, we update the attributes labels and the times on the right pane.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void nudCharisma_ValueChanged(object sender, EventArgs e)\n        {\n            UpdateAttributeLabels(EveAttribute.Charisma, (int)nudCharisma.Value,\n                lblAdjustCharisma, lblEffectiveCharisma);\n\n            if (!m_init)\n                return;\n\n            //  Update all the times on the right pane\n            await UpdateTimesAsync();\n        }\n\n        /// <summary>\n        /// When the perception numeric box changed, we update the attributes labels and the times on the right pane.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void nudPerception_ValueChanged(object sender, EventArgs e)\n        {\n            UpdateAttributeLabels(EveAttribute.Perception, (int)nudPerception.Value,\n                lblAdjustPerception, lblEffectivePerception);\n\n            if (!m_init)\n                return;\n\n            //  Update all the times on the right pane\n            await UpdateTimesAsync();\n        }\n\n        /// <summary>\n        /// When the memory numeric box changed, we update the attributes labels and the times on the right pane.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void nudMemory_ValueChanged(object sender, EventArgs e)\n        {\n            UpdateAttributeLabels(EveAttribute.Memory, (int)nudMemory.Value,\n                lblAdjustMemory, lblEffectiveMemory);\n\n            if (!m_init)\n                return;\n\n            //  Update all the times on the right pane\n            await UpdateTimesAsync();\n        }\n\n        /// <summary>\n        /// When the willpower numeric box changed, we update the attributes labels and the times on the right pane.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void nudWillpower_ValueChanged(object sender, EventArgs e)\n        {\n            UpdateAttributeLabels(EveAttribute.Willpower, (int)nudWillpower.Value,\n                lblAdjustWillpower, lblEffectiveWillpower);\n\n            if (!m_init)\n                return;\n\n            //  Update all the times on the right pane\n            await UpdateTimesAsync();\n        }\n\n        /// <summary>\n        /// Creates a scratchpad with the new implants values.\n        /// </summary>\n        /// <returns></returns>\n        private CharacterScratchpad CreateModifiedScratchpad(BaseCharacter character)\n        {\n            // Creates a scratchpad with new implants\n            CharacterScratchpad scratchpad = new CharacterScratchpad(character);\n\n            scratchpad.Memory.ImplantBonus += (int)nudMemory.Value - character.Memory.EffectiveValue;\n            scratchpad.Charisma.ImplantBonus += (int)nudCharisma.Value - character.Charisma.EffectiveValue;\n            scratchpad.Intelligence.ImplantBonus += (int)nudIntelligence.Value - character.Intelligence.EffectiveValue;\n            scratchpad.Perception.ImplantBonus += (int)nudPerception.Value - character.Perception.EffectiveValue;\n            scratchpad.Willpower.ImplantBonus += (int)nudWillpower.Value - character.Willpower.EffectiveValue;\n\n            return scratchpad;\n        }\n\n        #endregion\n\n\n        #region IPlanOrderPluggable Members\n\n        /// <summary>\n        /// Updates the statistics for the plan editor.\n        /// </summary>\n        /// <param name=\"plan\"></param>\n        /// <param name=\"areRemappingPointsActive\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">plan</exception>\n        public void UpdateStatistics(BasePlan plan, out bool areRemappingPointsActive)\n        {\n            plan.ThrowIfNull(nameof(plan));\n\n            areRemappingPointsActive = true;\n\n            CharacterScratchpad scratchpad = CreateModifiedScratchpad(m_character.After(m_plan.ChosenImplantSet));\n            plan.UpdateStatistics(scratchpad, true, true);\n            plan.UpdateOldTrainingTimes();\n        }\n\n        /// <summary>\n        /// Updates the times when \"choose implant set\" changes.\n        /// </summary>\n        public Task UpdateOnImplantSetChange() => UpdateContentAsync();\n\n        /// <summary>\n        /// Updates the title.\n        /// </summary>\n        private void UpdateTitle()\n        {\n            Text = $\"{m_character.Name} [{m_plan.Name}] - Implant Calculator\";\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Occurs when a plan name changed.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"PlanChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_PlanNameChanged(object sender, PlanChangedEventArgs e)\n        {\n            if (m_plan != e.Plan)\n                return;\n\n            UpdateTitle();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ImplantCalculatorWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ItemBrowserControl.Designer.cs",
    "content": "using EVEMon.Common.Enumerations;\n\nnamespace EVEMon.SkillPlanner\n{\n    partial class ItemBrowserControl\n    { \n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.gbAttributes = new System.Windows.Forms.GroupBox();\n            this.lvItemProperties = new System.Windows.Forms.ListView();\n            this.chAttribute = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.ItemAttributeContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.showInSkillBrowser = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInItemBrowser = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.itemSelectControl = new EVEMon.SkillPlanner.ItemSelectControl();\n            this.gbRequiredSkills = new System.Windows.Forms.GroupBox();\n            this.requiredSkillsControl = new EVEMon.SkillPlanner.RequiredSkillsControl();\n            ((System.ComponentModel.ISupportInitialize)(this.scObjectBrowser)).BeginInit();\n            this.scObjectBrowser.Panel1.SuspendLayout();\n            this.scObjectBrowser.Panel2.SuspendLayout();\n            this.scObjectBrowser.SuspendLayout();\n            this.pnlDetails.SuspendLayout();\n            this.pnlBrowserHeader.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.scDetailsRight)).BeginInit();\n            this.scDetailsRight.Panel1.SuspendLayout();\n            this.scDetailsRight.Panel2.SuspendLayout();\n            this.scDetailsRight.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.scDetails)).BeginInit();\n            this.scDetails.Panel1.SuspendLayout();\n            this.scDetails.Panel2.SuspendLayout();\n            this.scDetails.SuspendLayout();\n            this.gbDescription.SuspendLayout();\n            this.gbAttributes.SuspendLayout();\n            this.ItemAttributeContextMenu.SuspendLayout();\n            this.gbRequiredSkills.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // scObjectBrowser\n            // \n            // \n            // scObjectBrowser.Panel1\n            // \n            this.scObjectBrowser.Panel1.Controls.Add(this.itemSelectControl);\n            // \n            // scDetailsRight\n            // \n            // \n            // scDetailsRight.Panel2\n            // \n            this.scDetailsRight.Panel2.Controls.Add(this.gbRequiredSkills);\n            this.scDetailsRight.SplitterDistance = 235;\n            // \n            // scDetails\n            // \n            // \n            // scDetails.Panel1\n            // \n            this.scDetails.Panel1.Controls.Add(this.gbAttributes);\n            // \n            // gbDescription\n            // \n            this.gbDescription.Size = new System.Drawing.Size(240, 235);\n            // \n            // tbDescription\n            // \n            this.tbDescription.Size = new System.Drawing.Size(234, 216);\n            // \n            // gbAttributes\n            // \n            this.gbAttributes.Controls.Add(this.lvItemProperties);\n            this.gbAttributes.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbAttributes.Location = new System.Drawing.Point(0, 0);\n            this.gbAttributes.Name = \"gbAttributes\";\n            this.gbAttributes.Size = new System.Drawing.Size(238, 343);\n            this.gbAttributes.TabIndex = 15;\n            this.gbAttributes.TabStop = false;\n            this.gbAttributes.Text = \"Attributes\";\n            // \n            // lvItemProperties\n            // \n            this.lvItemProperties.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chAttribute,\n            this.chValue});\n            this.lvItemProperties.ContextMenuStrip = this.ItemAttributeContextMenu;\n            this.lvItemProperties.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvItemProperties.FullRowSelect = true;\n            this.lvItemProperties.HideSelection = false;\n            this.lvItemProperties.Location = new System.Drawing.Point(3, 16);\n            this.lvItemProperties.Name = \"lvItemProperties\";\n            this.lvItemProperties.Size = new System.Drawing.Size(232, 324);\n            this.lvItemProperties.TabIndex = 8;\n            this.lvItemProperties.UseCompatibleStateImageBehavior = false;\n            this.lvItemProperties.View = System.Windows.Forms.View.Details;\n            this.lvItemProperties.DoubleClick += new System.EventHandler(this.propertiesList_DoubleClick);\n            // \n            // chAttribute\n            // \n            this.chAttribute.Text = \"Attribute\";\n            this.chAttribute.Width = 120;\n            // \n            // chValue\n            // \n            this.chValue.Text = \"Value\";\n            this.chValue.Width = 120;\n            // \n            // ItemAttributeContextMenu\n            // \n            this.ItemAttributeContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showInSkillBrowser,\n            this.showInItemBrowser,\n            this.showInMenuSeparator,\n            this.exportToCSVToolStripMenuItem});\n            this.ItemAttributeContextMenu.Name = \"ItemAttributeContextMenu\";\n            this.ItemAttributeContextMenu.Size = new System.Drawing.Size(189, 98);\n            this.ItemAttributeContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.ShipAttributeContextMenu_Opening);\n            // \n            // showInSkillBrowser\n            // \n            this.showInSkillBrowser.Name = \"showInSkillBrowser\";\n            this.showInSkillBrowser.Size = new System.Drawing.Size(188, 22);\n            this.showInSkillBrowser.Text = \"Show In Skill Browser\";\n            this.showInSkillBrowser.Click += new System.EventHandler(this.propertiesList_DoubleClick);\n            // \n            // showInItemBrowser\n            // \n            this.showInItemBrowser.Name = \"showInItemBrowser\";\n            this.showInItemBrowser.Size = new System.Drawing.Size(188, 22);\n            this.showInItemBrowser.Text = \"Show In Item Browser\";\n            this.showInItemBrowser.Click += new System.EventHandler(this.propertiesList_DoubleClick);\n            // \n            // showInMenuSeparator\n            // \n            this.showInMenuSeparator.Name = \"showInMenuSeparator\";\n            this.showInMenuSeparator.Size = new System.Drawing.Size(185, 6);\n            // \n            // exportToCSVToolStripMenuItem\n            // \n            this.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n            this.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(188, 22);\n            this.exportToCSVToolStripMenuItem.Text = \"Export to CSV...\";\n            this.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n            // \n            // itemSelectControl\n            // \n            this.itemSelectControl.AutoSize = true;\n            this.itemSelectControl.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.itemSelectControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.itemSelectControl.Location = new System.Drawing.Point(0, 0);\n            this.itemSelectControl.Margin = new System.Windows.Forms.Padding(2);\n            this.itemSelectControl.Name = \"itemSelectControl\";\n            this.itemSelectControl.Size = new System.Drawing.Size(163, 413);\n            this.itemSelectControl.TabIndex = 0;\n            // \n            // gbRequiredSkills\n            // \n            this.gbRequiredSkills.Controls.Add(this.requiredSkillsControl);\n            this.gbRequiredSkills.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbRequiredSkills.Location = new System.Drawing.Point(0, 0);\n            this.gbRequiredSkills.Name = \"gbRequiredSkills\";\n            this.gbRequiredSkills.Size = new System.Drawing.Size(240, 104);\n            this.gbRequiredSkills.TabIndex = 0;\n            this.gbRequiredSkills.TabStop = false;\n            this.gbRequiredSkills.Text = \"Required Skills\";\n            // \n            // requiredSkillsControl\n            // \n            this.requiredSkillsControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.requiredSkillsControl.Location = new System.Drawing.Point(3, 16);\n            this.requiredSkillsControl.MinimumSize = new System.Drawing.Size(187, 0);\n            this.requiredSkillsControl.Name = \"requiredSkillsControl\";\n            this.requiredSkillsControl.Size = new System.Drawing.Size(234, 85);\n            this.requiredSkillsControl.TabIndex = 0;\n            // \n            // ItemBrowserControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Name = \"ItemBrowserControl\";\n            this.Controls.SetChildIndex(this.scObjectBrowser, 0);\n            this.scObjectBrowser.Panel1.ResumeLayout(false);\n            this.scObjectBrowser.Panel1.PerformLayout();\n            this.scObjectBrowser.Panel2.ResumeLayout(false);\n            this.scObjectBrowser.Panel2.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.scObjectBrowser)).EndInit();\n            this.scObjectBrowser.ResumeLayout(false);\n            this.pnlDetails.ResumeLayout(false);\n            this.pnlBrowserHeader.ResumeLayout(false);\n            this.pnlBrowserHeader.PerformLayout();\n            this.scDetailsRight.Panel1.ResumeLayout(false);\n            this.scDetailsRight.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.scDetailsRight)).EndInit();\n            this.scDetailsRight.ResumeLayout(false);\n            this.scDetails.Panel1.ResumeLayout(false);\n            this.scDetails.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.scDetails)).EndInit();\n            this.scDetails.ResumeLayout(false);\n            this.gbDescription.ResumeLayout(false);\n            this.gbAttributes.ResumeLayout(false);\n            this.ItemAttributeContextMenu.ResumeLayout(false);\n            this.gbRequiredSkills.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ListView lvItemProperties;\n        private System.Windows.Forms.ColumnHeader chAttribute;\n        private System.Windows.Forms.ColumnHeader chValue;\n        private ItemSelectControl itemSelectControl;\n        private System.Windows.Forms.GroupBox gbAttributes;\n        private System.Windows.Forms.ContextMenuStrip ItemAttributeContextMenu;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n        private System.Windows.Forms.GroupBox gbRequiredSkills;\n        private RequiredSkillsControl requiredSkillsControl;\n        private System.Windows.Forms.ToolStripMenuItem showInItemBrowser;\n        private System.Windows.Forms.ToolStripSeparator showInMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillBrowser;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ItemBrowserControl.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing System.Windows.Forms;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    internal partial class ItemBrowserControl : EveObjectBrowserControl\n    {\n        #region Constructors\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public ItemBrowserControl()\n        {\n            InitializeComponent();\n            scObjectBrowser.RememberDistanceKey = \"ItemBrowser_Left\";\n            SelectControl = itemSelectControl;\n            PropertiesList = lvItemProperties;\n\n            PropertiesList.MouseDown += PropertiesList_MouseDown;\n            PropertiesList.MouseMove += PropertiesList_MouseMove;\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// Exports item info to CSV format.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(PropertiesList, true);\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void PropertiesList_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            PropertiesList.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void PropertiesList_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            PropertiesList.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Occurs when double clicking on a list view item.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void propertiesList_DoubleClick(object sender, EventArgs e)\n        {\n            // Is it a skill?\n            Skill skill = PropertiesList.FocusedItem?.Tag as Skill;\n\n            if (skill != null)\n            {\n                PlanWindow.ShowPlanWindow(SelectControl.Character, Plan)?.ShowSkillInBrowser(skill);\n                return;\n            }\n\n            // Is it an item?\n            Item item = PropertiesList.FocusedItem?.Tag as Item;\n\n            if (item != null)\n                PlanWindow.ShowPlanWindow(SelectControl.Character, Plan)?.ShowItemInBrowser(item);\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the ShipAttributeContextMenu control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void ShipAttributeContextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            // Is it a skill?\n            Skill skill = PropertiesList.FocusedItem?.Tag as Skill;\n            showInSkillBrowser.Visible = skill != null;\n\n            // Is it an item?\n            Item item = PropertiesList.FocusedItem?.Tag as Item;\n            showInItemBrowser.Visible = item != null;\n\n            showInMenuSeparator.Visible = skill != null || item != null;\n        }\n\n        #endregion\n\n\n        #region Methods\n\n        /// <summary>\n        /// Replaces the user set search string with another.\n        /// </summary>\n        /// <param name=\"text\">The text to replace it with.</param>\n        internal void SetSearchText(string text)\n        {\n            itemSelectControl.SearchText = text;\n        }\n\n        /// <summary>\n        /// Updates the controls when the selection is changed.\n        /// </summary>\n        protected override void OnSelectionChanged()\n        {\n            base.OnSelectionChanged();\n\n            if (SelectedObject == null)\n                return;\n\n            // Description\n            tbDescription.Text = SelectedObject.Description;\n\n            // Required Skills\n            requiredSkillsControl.Object = SelectedObject;\n        }\n\n        /// <summary>\n        /// Updates whenever the selected plan changed.\n        /// </summary>\n        protected override void OnSelectedPlanChanged()\n        {\n            base.OnSelectedPlanChanged();\n\n            requiredSkillsControl.Plan = Plan;\n\n            // We recalculate the right panels minimum size\n            int reqSkillControlMinWidth = requiredSkillsControl.MinimumSize.Width;\n            int reqSkillPanelMinWidth = scDetails.Panel2MinSize;\n            scDetails.Panel2MinSize = reqSkillPanelMinWidth > reqSkillControlMinWidth\n                ? reqSkillPanelMinWidth\n                : reqSkillControlMinWidth;\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ItemBrowserControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"ItemAttributeContextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ItemSelectControl.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class ItemSelectControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.cbSlotFilter = new System.Windows.Forms.ComboBox();\n            this.label2 = new System.Windows.Forms.Label();\n            this.ccbGroupFilter = new EVEMon.Common.Controls.CheckedComboBox();\n            this.label4 = new System.Windows.Forms.Label();\n            this.toolTip = new System.Windows.Forms.ToolTip(this.components);\n            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\n            this.cbPowergrid = new System.Windows.Forms.CheckBox();\n            this.cbCPU = new System.Windows.Forms.CheckBox();\n            this.pnlCPU = new System.Windows.Forms.Panel();\n            this.numCPU = new System.Windows.Forms.NumericUpDown();\n            this.pnlPowergrid = new System.Windows.Forms.Panel();\n            this.numPowergrid = new System.Windows.Forms.NumericUpDown();\n            this.showAllGroupsCheckbox = new System.Windows.Forms.CheckBox();\n            this.upperPanel.SuspendLayout();\n            this.lowerPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchImage)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSerachTextDel)).BeginInit();\n            this.tableLayoutPanel1.SuspendLayout();\n            this.pnlCPU.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.numCPU)).BeginInit();\n            this.pnlPowergrid.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.numPowergrid)).BeginInit();\n            this.SuspendLayout();\n            // \n            // tbSearchText\n            // \n            this.tbSearchText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbSearchText.Location = new System.Drawing.Point(45, 135);\n            this.tbSearchText.Size = new System.Drawing.Size(179, 20);\n            this.tbSearchText.TabIndex = 10;\n            // \n            // lbNoMatches\n            // \n            this.lbNoMatches.Size = new System.Drawing.Size(224, 239);\n            this.lbNoMatches.TabIndex = 0;\n            this.lbNoMatches.Text = \"No items match your search.\";\n            // \n            // upperPanel\n            // \n            this.upperPanel.Controls.Add(this.tableLayoutPanel1);\n            this.upperPanel.Controls.Add(this.ccbGroupFilter);\n            this.upperPanel.Controls.Add(this.cbSlotFilter);\n            this.upperPanel.Controls.Add(this.label2);\n            this.upperPanel.Controls.Add(this.label4);\n            this.upperPanel.Size = new System.Drawing.Size(224, 162);\n            this.upperPanel.TabIndex = 0;\n            this.upperPanel.Controls.SetChildIndex(this.label4, 0);\n            this.upperPanel.Controls.SetChildIndex(this.label2, 0);\n            this.upperPanel.Controls.SetChildIndex(this.cbSlotFilter, 0);\n            this.upperPanel.Controls.SetChildIndex(this.lblFilter, 0);\n            this.upperPanel.Controls.SetChildIndex(this.ccbGroupFilter, 0);\n            this.upperPanel.Controls.SetChildIndex(this.tableLayoutPanel1, 0);\n            this.upperPanel.Controls.SetChildIndex(this.pbSearchImage, 0);\n            this.upperPanel.Controls.SetChildIndex(this.tbSearchText, 0);\n            this.upperPanel.Controls.SetChildIndex(this.lbSearchTextHint, 0);\n            this.upperPanel.Controls.SetChildIndex(this.cbUsabilityFilter, 0);\n            this.upperPanel.Controls.SetChildIndex(this.pbSerachTextDel, 0);\n            // \n            // lowerPanel\n            // \n            this.lowerPanel.Location = new System.Drawing.Point(0, 162);\n            this.lowerPanel.Size = new System.Drawing.Size(224, 239);\n            this.lowerPanel.TabIndex = 0;\n            // \n            // lbSearchTextHint\n            // \n            this.lbSearchTextHint.Location = new System.Drawing.Point(49, 138);\n            this.lbSearchTextHint.TabIndex = 9;\n            // \n            // pbSearchImage\n            // \n            this.pbSearchImage.Location = new System.Drawing.Point(9, 135);\n            // \n            // lblFilter\n            // \n            this.lblFilter.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            this.lblFilter.TabIndex = 0;\n            // \n            // cbUsabilityFilter\n            // \n            this.cbUsabilityFilter.Size = new System.Drawing.Size(179, 21);\n            this.cbUsabilityFilter.TabIndex = 1;\n            this.cbUsabilityFilter.SelectedIndexChanged += new System.EventHandler(this.cbUsabilityFilter_SelectedIndexChanged);\n            // \n            // lbSearchList\n            // \n            this.lbSearchList.Margin = new System.Windows.Forms.Padding(2);\n            this.lbSearchList.Size = new System.Drawing.Size(224, 239);\n            this.lbSearchList.TabIndex = 0;\n            // \n            // tvItems\n            // \n            this.tvItems.LineColor = System.Drawing.Color.Black;\n            this.tvItems.Margin = new System.Windows.Forms.Padding(2);\n            this.tvItems.Size = new System.Drawing.Size(224, 239);\n            this.tvItems.TabIndex = 12;\n            // \n            // pbSerachTextDel\n            // \n            this.pbSerachTextDel.Location = new System.Drawing.Point(205, 137);\n            // \n            // cbSlotFilter\n            // \n            this.cbSlotFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSlotFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSlotFilter.FormattingEnabled = true;\n            this.cbSlotFilter.Items.AddRange(new object[] {\n            \"All Slots\",\n            \"High Slot\",\n            \"Medium Slot\",\n            \"Low Slot\",\n            \"No Slot\"});\n            this.cbSlotFilter.Location = new System.Drawing.Point(45, 28);\n            this.cbSlotFilter.Margin = new System.Windows.Forms.Padding(0);\n            this.cbSlotFilter.Name = \"cbSlotFilter\";\n            this.cbSlotFilter.Size = new System.Drawing.Size(179, 21);\n            this.cbSlotFilter.TabIndex = 3;\n            this.cbSlotFilter.SelectedIndexChanged += new System.EventHandler(this.cbSlotFilter_SelectedIndexChanged);\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(10, 31);\n            this.label2.Margin = new System.Windows.Forms.Padding(0);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(28, 13);\n            this.label2.TabIndex = 2;\n            this.label2.Text = \"Slot:\";\n            // \n            // ccbGroupFilter\n            // \n            this.ccbGroupFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.ccbGroupFilter.CheckOnClick = true;\n            this.ccbGroupFilter.Cursor = System.Windows.Forms.Cursors.Default;\n            this.ccbGroupFilter.CustomTextBuilder = null;\n            this.ccbGroupFilter.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;\n            this.ccbGroupFilter.DropDownHeight = 1;\n            this.ccbGroupFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.ccbGroupFilter.FormattingEnabled = true;\n            this.ccbGroupFilter.IntegralHeight = false;\n            this.ccbGroupFilter.Items.AddRange(new object[] {\n            \"Faction\",\n            \"Officer\",\n            \"Deadspace\"});\n            this.ccbGroupFilter.Location = new System.Drawing.Point(45, 53);\n            this.ccbGroupFilter.Margin = new System.Windows.Forms.Padding(0);\n            this.ccbGroupFilter.Name = \"ccbGroupFilter\";\n            this.ccbGroupFilter.Size = new System.Drawing.Size(179, 21);\n            this.ccbGroupFilter.TabIndex = 7;\n            this.ccbGroupFilter.TextForAll = \"Any group\";\n            this.ccbGroupFilter.TextForNone = \"No group\";\n            this.ccbGroupFilter.ToolTip = null;\n            this.ccbGroupFilter.ValueSeparator = \", \";\n            // \n            // label4\n            // \n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(-1, 56);\n            this.label4.Margin = new System.Windows.Forms.Padding(0);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(39, 13);\n            this.label4.TabIndex = 6;\n            this.label4.Text = \"Group:\";\n            // \n            // tableLayoutPanel1\n            // \n            this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tableLayoutPanel1.ColumnCount = 2;\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel1.Controls.Add(this.cbPowergrid, 0, 1);\n            this.tableLayoutPanel1.Controls.Add(this.cbCPU, 0, 0);\n            this.tableLayoutPanel1.Controls.Add(this.pnlCPU, 1, 0);\n            this.tableLayoutPanel1.Controls.Add(this.pnlPowergrid, 1, 1);\n            this.tableLayoutPanel1.Location = new System.Drawing.Point(6, 83);\n            this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);\n            this.tableLayoutPanel1.Name = \"tableLayoutPanel1\";\n            this.tableLayoutPanel1.RowCount = 2;\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tableLayoutPanel1.Size = new System.Drawing.Size(214, 48);\n            this.tableLayoutPanel1.TabIndex = 8;\n            // \n            // cbPowergrid\n            // \n            this.cbPowergrid.AutoSize = true;\n            this.cbPowergrid.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cbPowergrid.Location = new System.Drawing.Point(0, 24);\n            this.cbPowergrid.Margin = new System.Windows.Forms.Padding(0);\n            this.cbPowergrid.Name = \"cbPowergrid\";\n            this.cbPowergrid.Size = new System.Drawing.Size(76, 24);\n            this.cbPowergrid.TabIndex = 2;\n            this.cbPowergrid.Text = \"Power limit\";\n            this.cbPowergrid.UseVisualStyleBackColor = true;\n            this.cbPowergrid.CheckedChanged += new System.EventHandler(this.cbPowergrid_CheckedChanged);\n            // \n            // cbCPU\n            // \n            this.cbCPU.AutoSize = true;\n            this.cbCPU.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.cbCPU.Location = new System.Drawing.Point(0, 0);\n            this.cbCPU.Margin = new System.Windows.Forms.Padding(0);\n            this.cbCPU.Name = \"cbCPU\";\n            this.cbCPU.Size = new System.Drawing.Size(76, 24);\n            this.cbCPU.TabIndex = 0;\n            this.cbCPU.Text = \"CPU limit\";\n            this.cbCPU.UseVisualStyleBackColor = true;\n            this.cbCPU.CheckedChanged += new System.EventHandler(this.cbCPU_CheckedChanged);\n            // \n            // pnlCPU\n            // \n            this.pnlCPU.AutoSize = true;\n            this.pnlCPU.Controls.Add(this.numCPU);\n            this.pnlCPU.Location = new System.Drawing.Point(76, 0);\n            this.pnlCPU.Margin = new System.Windows.Forms.Padding(0);\n            this.pnlCPU.Name = \"pnlCPU\";\n            this.pnlCPU.Size = new System.Drawing.Size(71, 23);\n            this.pnlCPU.TabIndex = 4;\n            // \n            // numCPU\n            // \n            this.numCPU.AutoSize = true;\n            this.numCPU.Enabled = false;\n            this.numCPU.Location = new System.Drawing.Point(0, 3);\n            this.numCPU.Margin = new System.Windows.Forms.Padding(0);\n            this.numCPU.Maximum = new decimal(new int[] {\n            10000000,\n            0,\n            0,\n            0});\n            this.numCPU.Name = \"numCPU\";\n            this.numCPU.Size = new System.Drawing.Size(71, 20);\n            this.numCPU.TabIndex = 1;\n            this.numCPU.Value = new decimal(new int[] {\n            10,\n            0,\n            0,\n            0});\n            this.numCPU.ValueChanged += new System.EventHandler(this.numCPU_ValueChanged);\n            // \n            // pnlPowergrid\n            // \n            this.pnlPowergrid.AutoSize = true;\n            this.pnlPowergrid.Controls.Add(this.numPowergrid);\n            this.pnlPowergrid.Location = new System.Drawing.Point(76, 24);\n            this.pnlPowergrid.Margin = new System.Windows.Forms.Padding(0);\n            this.pnlPowergrid.Name = \"pnlPowergrid\";\n            this.pnlPowergrid.Size = new System.Drawing.Size(71, 23);\n            this.pnlPowergrid.TabIndex = 21;\n            // \n            // numPowergrid\n            // \n            this.numPowergrid.AutoSize = true;\n            this.numPowergrid.Enabled = false;\n            this.numPowergrid.Location = new System.Drawing.Point(0, 3);\n            this.numPowergrid.Margin = new System.Windows.Forms.Padding(0);\n            this.numPowergrid.Maximum = new decimal(new int[] {\n            10000000,\n            0,\n            0,\n            0});\n            this.numPowergrid.Name = \"numPowergrid\";\n            this.numPowergrid.Size = new System.Drawing.Size(71, 20);\n            this.numPowergrid.TabIndex = 3;\n            this.numPowergrid.Value = new decimal(new int[] {\n            10,\n            0,\n            0,\n            0});\n            this.numPowergrid.ValueChanged += new System.EventHandler(this.numPowergrid_ValueChanged);\n            // \n            // showAllGroupsCheckbox\n            // \n            this.showAllGroupsCheckbox.AutoSize = true;\n            this.showAllGroupsCheckbox.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.showAllGroupsCheckbox.Location = new System.Drawing.Point(0, 401);\n            this.showAllGroupsCheckbox.Margin = new System.Windows.Forms.Padding(0);\n            this.showAllGroupsCheckbox.Name = \"showAllGroupsCheckbox\";\n            this.showAllGroupsCheckbox.Size = new System.Drawing.Size(224, 17);\n            this.showAllGroupsCheckbox.TabIndex = 13;\n            this.showAllGroupsCheckbox.Text = \"&Show all groups\";\n            this.showAllGroupsCheckbox.UseVisualStyleBackColor = true;\n            this.showAllGroupsCheckbox.CheckedChanged += new System.EventHandler(this.showAllGroupsCheckbox_CheckedChanged);\n            // \n            // ItemSelectControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.Controls.Add(this.showAllGroupsCheckbox);\n            this.Margin = new System.Windows.Forms.Padding(2);\n            this.Name = \"ItemSelectControl\";\n            this.Size = new System.Drawing.Size(224, 418);\n            this.Controls.SetChildIndex(this.upperPanel, 0);\n            this.Controls.SetChildIndex(this.showAllGroupsCheckbox, 0);\n            this.Controls.SetChildIndex(this.lowerPanel, 0);\n            this.upperPanel.ResumeLayout(false);\n            this.upperPanel.PerformLayout();\n            this.lowerPanel.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchImage)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSerachTextDel)).EndInit();\n            this.tableLayoutPanel1.ResumeLayout(false);\n            this.tableLayoutPanel1.PerformLayout();\n            this.pnlCPU.ResumeLayout(false);\n            this.pnlCPU.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.numCPU)).EndInit();\n            this.pnlPowergrid.ResumeLayout(false);\n            this.pnlPowergrid.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.numPowergrid)).EndInit();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n        #endregion\n\n        private System.Windows.Forms.ComboBox cbSlotFilter;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Label label4;\n        private EVEMon.Common.Controls.CheckedComboBox ccbGroupFilter;\n        private System.Windows.Forms.ToolTip toolTip;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\n        private System.Windows.Forms.CheckBox cbPowergrid;\n        private System.Windows.Forms.CheckBox cbCPU;\n        private System.Windows.Forms.NumericUpDown numCPU;\n        private System.Windows.Forms.NumericUpDown numPowergrid;\n        private System.Windows.Forms.CheckBox showAllGroupsCheckbox;\n        private System.Windows.Forms.Panel pnlPowergrid;\n        private System.Windows.Forms.Panel pnlCPU;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ItemSelectControl.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.SkillPlanner\n{\n    public partial class ItemSelectControl : EveObjectSelectControl\n    {\n        private readonly List<MarketGroup> m_presetGroups = new List<MarketGroup>();\n        private readonly List<ItemMetaGroup> m_metaGroups = new List<ItemMetaGroup>();\n\n        private Func<Item, bool> m_slotPredicate = x => true;\n        private Func<Item, bool> m_metaGroupPredicate = x => true;\n        private Func<Item, bool> m_fittingPredicate = x => true;\n\n        private bool m_init;\n\n\n        #region Initialization\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        public ItemSelectControl()\n        {\n            InitializeComponent();\n\n            // Initialize the search text timer\n            SearchTextTimer = new Timer { Interval = 300 };\n        }\n\n        /// <summary>\n        /// On load, we read the settings.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            // Call the base method\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            // Subscribe the 'ItemCheck' event\n            ccbGroupFilter.ItemCheck += ccbGroupFilter_ItemCheck;\n\n            // Initialize the filters controls\n            InitializeFiltersControls();\n\n            // Update the control's content\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Initializes the filters controls.\n        /// </summary>\n        protected override void InitializeFiltersControls()\n        {\n            m_init = false;\n\n            // Set the preset groups\n            m_presetGroups.Clear();\n            if (StaticItems.MarketGroups.Any())\n            {\n                m_presetGroups.Add(StaticItems.MarketGroups.First(x => x.ID == DBConstants.AmmosAndChargesMarketGroupID));\n                m_presetGroups.Add(StaticItems.MarketGroups.First(x => x.ID == DBConstants.ImplantsAndBoostersMarketGroupID));\n                m_presetGroups.Add(StaticItems.MarketGroups.First(x => x.ID == DBConstants.StarbaseStructuresMarketGroupID));\n                m_presetGroups.Add(StaticItems.MarketGroups.First(x => x.ID == DBConstants.ShipModificationsMarketGroupID));\n                m_presetGroups.Add(StaticItems.MarketGroups.First(x => x.ID == DBConstants.ShipEquipmentsMarketGroupID));\n                m_presetGroups.Add(StaticItems.MarketGroups.First(x => x.ID == DBConstants.DronesMarketGroupID));\n            }\n\n            InitializeFilterControl();\n            InitializeGroupControl();\n\n            InitiliazeSelectedIndexes();\n\n            m_init = true;\n        }\n\n        /// <summary>\n        /// Initializes the filter control.\n        /// </summary>\n        private void InitializeFilterControl()\n        {\n            // Initialize the usability filter combo box\n            cbUsabilityFilter.Items.Clear();\n            cbUsabilityFilter.Items.Add(\"All Items\");\n\n            // On Data browser exit here\n            if (Character == null)\n                return;\n\n            cbUsabilityFilter.Items.Add(\"Items I can use\");\n            cbUsabilityFilter.Items.Add(\"Items I cannot use\");\n        }\n\n        /// <summary>\n        /// Initializes the group control.\n        /// </summary>\n        private void InitializeGroupControl()\n        {\n            // Metagroups combo\n            m_metaGroups.Clear();\n            m_metaGroups.AddRange(EnumExtensions.GetBitValues<ItemMetaGroup>());\n\n            // Initialize the metagroup combo\n            ccbGroupFilter.Items.Clear();\n            ccbGroupFilter.Items.AddRange(m_metaGroups.Cast<object>().ToArray());\n            ccbGroupFilter.ToolTip = toolTip;\n        }\n\n        /// <summary>\n        /// Initiliazes the selected indexes.\n        /// </summary>\n        /// <exception cref=\"System.NotImplementedException\"></exception>\n        private void InitiliazeSelectedIndexes()\n        {\n            // Read the settings\n            if (Settings.UI.UseStoredSearchFilters)\n            {\n                ItemBrowserSettings settings;\n\n                // Skill Planner\n                if (Plan != null)\n                    settings = Settings.UI.ItemBrowser;\n                // Character associated Data Browser\n                else if (Character != null)\n                    settings = Settings.UI.ItemCharacterDataBrowser;\n                // Data Browser\n                else\n                    settings = Settings.UI.ItemDataBrowser;\n\n                // Usability combo\n                cbUsabilityFilter.SelectedIndex = (int)settings.UsabilityFilter;\n\n                // Slots combo\n                switch (settings.SlotFilter)\n                {\n                    case ItemSlot.All:\n                        cbSlotFilter.SelectedIndex = 0;\n                        break;\n                    case ItemSlot.High:\n                        cbSlotFilter.SelectedIndex = 1;\n                        break;\n                    case ItemSlot.Medium:\n                        cbSlotFilter.SelectedIndex = 2;\n                        break;\n                    case ItemSlot.Low:\n                        cbSlotFilter.SelectedIndex = 3;\n                        break;\n                    case ItemSlot.NoSlot:\n                        cbSlotFilter.SelectedIndex = 4;\n                        break;\n                    default:\n                        throw new NotImplementedException();\n                }\n                m_slotPredicate = x => settings.SlotFilter == ItemSlot.All || (x.FittingSlot & settings.SlotFilter) != ItemSlot.None;\n\n                for (int i = 0; i < m_metaGroups.Count; i++)\n                {\n                    ccbGroupFilter.SetItemChecked(i, isChecked: false);\n                    ccbGroupFilter.SetItemChecked(i, (settings.MetagroupFilter & m_metaGroups[i]) != ItemMetaGroup.None);\n                }\n                m_metaGroupPredicate = x => (x.MetaGroup & settings.MetagroupFilter) != ItemMetaGroup.None;\n\n                tbSearchText.Text = settings.TextSearch;\n                lbSearchTextHint.Visible = string.IsNullOrEmpty(tbSearchText.Text);\n\n                return;\n            }\n\n            cbUsabilityFilter.SelectedIndex = 0;\n            cbSlotFilter.SelectedIndex = 0;\n            for (int i = 0; i < m_metaGroups.Count; i++)\n            {\n                ccbGroupFilter.SetItemChecked(i, true);\n            }\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// When the search text changed, we store the next settings\n        /// and update the list view and the list/tree visibilities.\n        /// </summary>\n        protected override void OnSearchTextChanged()\n        {\n            base.OnSearchTextChanged();\n\n            ItemBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.ItemBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.ItemCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.ItemDataBrowser;\n\n            settings.TextSearch = tbSearchText.Text;\n        }\n\n        /// <summary>\n        /// When the skill filter combo is changed, we update the settings, the predicate and the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbUsabilityFilter_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            // Update the predicate\n            switch ((ObjectUsabilityFilter)cbUsabilityFilter.SelectedIndex)\n            {\n                case ObjectUsabilityFilter.All:\n                    UsabilityPredicate = SelectAll;\n                    break;\n                case ObjectUsabilityFilter.Usable:\n                    UsabilityPredicate = CanUse;\n                    break;\n                case ObjectUsabilityFilter.Unusable:\n                    UsabilityPredicate = CannotUse;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n\n            // Update the control's content\n            if (!m_init)\n                return;\n\n            // Update content\n            UpdateContent();\n\n            ItemBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.ItemBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.ItemCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.ItemDataBrowser;\n\n            // Update the settings\n            settings.UsabilityFilter = (ObjectUsabilityFilter)cbUsabilityFilter.SelectedIndex;\n        }\n\n        /// <summary>\n        /// When the slot filter combo changed, we update the settings, the predicate and the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbSlotFilter_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            // Update the control's content\n            if (!m_init)\n                return;\n\n            // Update the predicate\n            ItemSlot slot;\n\n            switch (cbSlotFilter.SelectedIndex)\n            {\n                case 0:\n                    slot = ItemSlot.All;\n                    break;\n                case 1:\n                    slot = ItemSlot.High;\n                    break;\n                case 2:\n                    slot = ItemSlot.Medium;\n                    break;\n                case 3:\n                    slot = ItemSlot.Low;\n                    break;\n                case 4:\n                    slot = ItemSlot.NoSlot;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n            \n            m_slotPredicate = x => slot == ItemSlot.All || (x.FittingSlot & slot) != ItemSlot.None;\n\n            // Update content\n            UpdateContent();\n\n            ItemBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.ItemBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.ItemCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.ItemDataBrowser;\n\n            // Update the settings\n            settings.SlotFilter = slot;\n        }\n\n        /// <summary>\n        /// When the meta group combo changed, we update the settings, the predicate and the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void ccbGroupFilter_ItemCheck(object sender, ItemCheckEventArgs e)\n        {\n            // Update the control's content\n            if (!m_init)\n                return;\n\n            // Update the predicate\n            ItemMetaGroup filter = m_metaGroups\n                .Where((t, i) => ccbGroupFilter.GetItemChecked(i))\n                .Aggregate(ItemMetaGroup.None, (current, t) => current | t);\n\n            m_metaGroupPredicate = x => (x.MetaGroup & filter) != ItemMetaGroup.None;\n\n            // Update content\n            UpdateContent();\n\n            ItemBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.ItemBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.ItemCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.ItemDataBrowser;\n\n            settings.MetagroupFilter = filter;\n        }\n\n        /// <summary>\n        /// When the CPU's numeric box changed, we update the predicate, the content (no settings)\n        /// and the numeric box's availability.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbCPU_CheckedChanged(object sender, EventArgs e)\n        {\n            numCPU.Enabled = cbCPU.Checked;\n            UpdateFittingPredicate();\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the powergrid's numeric box changed, we update the predicate, the content (no settings)\n        /// and the numeric box's availability.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbPowergrid_CheckedChanged(object sender, EventArgs e)\n        {\n            numPowergrid.Enabled = cbPowergrid.Checked;\n            UpdateFittingPredicate();\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the CPU's numeric box changed, we update the predicate and the content (no settings).\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void numCPU_ValueChanged(object sender, EventArgs e)\n        {\n            UpdateFittingPredicate();\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the powergrid's numeric box changed, we update the predicate and the content (no settings).\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void numPowergrid_ValueChanged(object sender, EventArgs e)\n        {\n            UpdateFittingPredicate();\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// When the \"show all items\" checkbox changed, we update the settings and trigger a content update.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showAllGroupsCheckbox_CheckedChanged(object sender, EventArgs e)\n        {\n            UpdateContent();\n\n            ItemBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.ItemBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.ItemCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.ItemDataBrowser;\n\n            settings.ShowAllGroups = showAllGroupsCheckbox.Checked;\n        }\n\n        /// <summary>\n        /// Updates the fitting predicate.\n        /// </summary>\n        private void UpdateFittingPredicate()\n        {\n            if (!numCPU.Enabled && !numPowergrid.Enabled)\n                m_fittingPredicate = x => true;\n            else\n            {\n                double? gridAvailable = null;\n                if (numPowergrid.Enabled)\n                    gridAvailable = (double)numPowergrid.Value;\n\n                double? cpuAvailable = null;\n                if (numCPU.Enabled)\n                    cpuAvailable = (double)numCPU.Value;\n\n                m_fittingPredicate = item => item.CanActivate(cpuAvailable, gridAvailable);\n            }\n        }\n\n        #endregion\n\n\n        #region Content creation\n\n        /// <summary>\n        /// Builds the tree view.\n        /// </summary>\n        protected override void BuildTreeView()\n        {\n            // Store the selected node (if any) to restore it after the update\n            int selectedItemHash = tvItems.SelectedNode?.Tag?.GetHashCode() ?? 0;\n\n            int numberOfItems = 0;\n            tvItems.BeginUpdate();\n            try\n            {\n                tvItems.Nodes.Clear();\n\n                // Create the nodes\n                foreach (MarketGroup group in StaticItems.MarketGroups)\n                {\n                    // Skip some groups\n                    if (!showAllGroupsCheckbox.Checked && !m_presetGroups.Contains(group))\n                        continue;\n\n                    TreeNode node = new TreeNode\n                    {\n                        Text = group.Name,\n                        Tag = group\n                    };\n\n                    int result = BuildSubtree(group, node.Nodes);\n\n                    if (result == 0)\n                        continue;\n\n                    numberOfItems += result;\n                    tvItems.Nodes.Add(node);\n                }\n\n                TreeNode selectedNode = null;\n\n                // Restore the selected node (if any)\n                if (selectedItemHash > 0)\n                {\n                    foreach (TreeNode node in tvItems.GetAllNodes()\n                        .Where(node => node.Tag.GetHashCode() == selectedItemHash))\n                    {\n                        tvItems.SelectNodeWithTag(node.Tag);\n                        selectedNode = node;\n                    }\n                }\n\n                if (selectedNode != null)\n                    return;\n\n                // Reset if the node doesn't exist anymore\n                tvItems.SelectNodeWithTag(null);\n                SelectedObject = null;\n            }\n            finally\n            {\n                tvItems.EndUpdate();\n                AllExpanded = false;\n\n                // If the filtered set is small enough to fit all nodes on screen, call expandAll()\n                if (numberOfItems < tvItems.DisplayRectangle.Height / tvItems.ItemHeight)\n                {\n                    tvItems.ExpandAll();\n                    AllExpanded = true;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Create the tree nodes for the given category and add them to the given nodes collection.\n        /// </summary>\n        /// <param name=\"group\"></param>\n        /// <param name=\"nodeCollection\"></param>\n        /// <returns></returns>\n        private int BuildSubtree(MarketGroup group, TreeNodeCollection nodeCollection)\n        {\n            // Total items count in this category and its subcategories\n            int result = 0;\n\n            // Add all subcategories\n            foreach (MarketGroup childGroup in group.SubGroups)\n            {\n                TreeNode node = new TreeNode\n                {\n                    Text = childGroup.Name,\n                    Tag = childGroup\n                };\n\n                // Add this subcategory's items count\n                result += BuildSubtree(childGroup, node.Nodes);\n\n                // Only add if this subcategory has children\n                if (node.GetNodeCount(true) > 0)\n                    nodeCollection.Add(node);\n            }\n\n            // Add all items\n            foreach (TreeNode node in group.Items\n                .Where(x => UsabilityPredicate(x)\n                            && m_slotPredicate(x)\n                            && m_metaGroupPredicate(x)\n                            && m_fittingPredicate(x))\n                .Select(childItem =>\n                    new TreeNode\n                    {\n                        Text = childItem.Name,\n                        Tag = childItem\n                    }))\n            {\n                nodeCollection.Add(node);\n                result++;\n            }\n\n            return result;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ItemSelectControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"toolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>141, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/LoadoutImportationWindow.Designer.cs",
    "content": "using EVEMon.Common.Controls;\n\nnamespace EVEMon.SkillPlanner\n{\n    partial class LoadoutImportationWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.ShowInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.cmiExpandSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmiCollapseSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.selectedSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.cmiExpandAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmiCollapseAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.BottomPanel = new System.Windows.Forms.Panel();\n            this.TrainTimeLabel = new System.Windows.Forms.Label();\n            this.PlanedLabel = new System.Windows.Forms.Label();\n            this.AddToPlanButton = new System.Windows.Forms.Button();\n            this.TrainingTimeLabel = new System.Windows.Forms.Label();\n            this.CloseButton = new System.Windows.Forms.Button();\n            this.ExplanationLabel = new System.Windows.Forms.Label();\n            this.ResultsTreeView = new System.Windows.Forms.TreeView();\n            this.HeaderPanel = new System.Windows.Forms.Panel();\n            this.DescriptionLabel = new System.Windows.Forms.Label();\n            this.ShipTypeNameLabel = new System.Windows.Forms.Label();\n            this.LoadoutNameLabel = new System.Windows.Forms.Label();\n            this.TreeViewPanel = new System.Windows.Forms.Panel();\n            this.contextMenu.SuspendLayout();\n            this.BottomPanel.SuspendLayout();\n            this.HeaderPanel.SuspendLayout();\n            this.TreeViewPanel.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.ShowInBrowserMenuItem,\n            this.showInMenuSeparator,\n            this.cmiExpandSelected,\n            this.cmiCollapseSelected,\n            this.selectedSeparator,\n            this.cmiExpandAll,\n            this.cmiCollapseAll});\n            this.contextMenu.Name = \"cmNode\";\n            this.contextMenu.Size = new System.Drawing.Size(198, 126);\n            this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenu_Opening);\n            // \n            // ShowInBrowserMenuItem\n            // \n            this.ShowInBrowserMenuItem.Name = \"ShowInBrowserMenuItem\";\n            this.ShowInBrowserMenuItem.Size = new System.Drawing.Size(197, 22);\n            this.ShowInBrowserMenuItem.Text = \"Show in &Item Browser...\";\n            this.ShowInBrowserMenuItem.Click += new System.EventHandler(this.tvLoadout_DoubleClick);\n            // \n            // showInMenuSeparator\n            // \n            this.showInMenuSeparator.Name = \"showInMenuSeparator\";\n            this.showInMenuSeparator.Size = new System.Drawing.Size(194, 6);\n            // \n            // cmiExpandSelected\n            // \n            this.cmiExpandSelected.Name = \"cmiExpandSelected\";\n            this.cmiExpandSelected.Size = new System.Drawing.Size(197, 22);\n            this.cmiExpandSelected.Text = \"Expand Selected\";\n            this.cmiExpandSelected.Click += new System.EventHandler(this.cmiExpandSelected_Click);\n            // \n            // cmiCollapseSelected\n            // \n            this.cmiCollapseSelected.Name = \"cmiCollapseSelected\";\n            this.cmiCollapseSelected.Size = new System.Drawing.Size(197, 22);\n            this.cmiCollapseSelected.Text = \"Collapse Selected\";\n            this.cmiCollapseSelected.Click += new System.EventHandler(this.cmiCollapseSelected_Click);\n            // \n            // selectedSeparator\n            // \n            this.selectedSeparator.Name = \"selectedSeparator\";\n            this.selectedSeparator.Size = new System.Drawing.Size(194, 6);\n            // \n            // cmiExpandAll\n            // \n            this.cmiExpandAll.Name = \"cmiExpandAll\";\n            this.cmiExpandAll.Size = new System.Drawing.Size(197, 22);\n            this.cmiExpandAll.Text = \"&Expand All\";\n            this.cmiExpandAll.Click += new System.EventHandler(this.cmiExpandAll_Click);\n            // \n            // cmiCollapseAll\n            // \n            this.cmiCollapseAll.Name = \"cmiCollapseAll\";\n            this.cmiCollapseAll.Size = new System.Drawing.Size(197, 22);\n            this.cmiCollapseAll.Text = \"&Collapse All\";\n            this.cmiCollapseAll.Click += new System.EventHandler(this.cmiCollapseAll_Click);\n            // \n            // BottomPanel\n            // \n            this.BottomPanel.Controls.Add(this.TrainTimeLabel);\n            this.BottomPanel.Controls.Add(this.PlanedLabel);\n            this.BottomPanel.Controls.Add(this.AddToPlanButton);\n            this.BottomPanel.Controls.Add(this.TrainingTimeLabel);\n            this.BottomPanel.Controls.Add(this.CloseButton);\n            this.BottomPanel.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.BottomPanel.Location = new System.Drawing.Point(0, 370);\n            this.BottomPanel.Name = \"BottomPanel\";\n            this.BottomPanel.Size = new System.Drawing.Size(374, 72);\n            this.BottomPanel.TabIndex = 2;\n            // \n            // TrainTimeLabel\n            // \n            this.TrainTimeLabel.AutoSize = true;\n            this.TrainTimeLabel.Location = new System.Drawing.Point(191, 14);\n            this.TrainTimeLabel.Name = \"TrainTimeLabel\";\n            this.TrainTimeLabel.Size = new System.Drawing.Size(27, 13);\n            this.TrainTimeLabel.TabIndex = 32;\n            this.TrainTimeLabel.Text = \"N/A\";\n            // \n            // PlanedLabel\n            // \n            this.PlanedLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.PlanedLabel.AutoSize = true;\n            this.PlanedLabel.Location = new System.Drawing.Point(191, 14);\n            this.PlanedLabel.Name = \"PlanedLabel\";\n            this.PlanedLabel.Size = new System.Drawing.Size(0, 13);\n            this.PlanedLabel.TabIndex = 34;\n            // \n            // AddToPlanButton\n            // \n            this.AddToPlanButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.AddToPlanButton.Enabled = false;\n            this.AddToPlanButton.Location = new System.Drawing.Point(206, 37);\n            this.AddToPlanButton.Name = \"AddToPlanButton\";\n            this.AddToPlanButton.Size = new System.Drawing.Size(75, 23);\n            this.AddToPlanButton.TabIndex = 2;\n            this.AddToPlanButton.Text = \"Add To Plan\";\n            this.AddToPlanButton.UseVisualStyleBackColor = true;\n            this.AddToPlanButton.Click += new System.EventHandler(this.btnPlan_Click);\n            // \n            // TrainingTimeLabel\n            // \n            this.TrainingTimeLabel.AutoSize = true;\n            this.TrainingTimeLabel.Location = new System.Drawing.Point(12, 14);\n            this.TrainingTimeLabel.Name = \"TrainingTimeLabel\";\n            this.TrainingTimeLabel.Size = new System.Drawing.Size(173, 13);\n            this.TrainingTimeLabel.TabIndex = 31;\n            this.TrainingTimeLabel.Text = \"Training Time for selected loadout: \";\n            // \n            // CloseButton\n            // \n            this.CloseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.CloseButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.CloseButton.Location = new System.Drawing.Point(287, 37);\n            this.CloseButton.Name = \"CloseButton\";\n            this.CloseButton.Size = new System.Drawing.Size(75, 23);\n            this.CloseButton.TabIndex = 3;\n            this.CloseButton.Text = \"Close\";\n            this.CloseButton.UseVisualStyleBackColor = true;\n            this.CloseButton.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // ExplanationLabel\n            // \n            this.ExplanationLabel.Dock = System.Windows.Forms.DockStyle.Top;\n            this.ExplanationLabel.Location = new System.Drawing.Point(0, 0);\n            this.ExplanationLabel.Name = \"ExplanationLabel\";\n            this.ExplanationLabel.Padding = new System.Windows.Forms.Padding(2, 5, 2, 5);\n            this.ExplanationLabel.Size = new System.Drawing.Size(374, 40);\n            this.ExplanationLabel.TabIndex = 1;\n            this.ExplanationLabel.Text = \"Copy an EFT, XML, CLF or DNA formated loadout into the clipboard.\";\n            this.ExplanationLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            // \n            // ResultsTreeView\n            // \n            this.ResultsTreeView.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ResultsTreeView.Location = new System.Drawing.Point(5, 5);\n            this.ResultsTreeView.Name = \"ResultsTreeView\";\n            this.ResultsTreeView.Size = new System.Drawing.Size(364, 286);\n            this.ResultsTreeView.TabIndex = 1;\n            this.ResultsTreeView.DoubleClick += new System.EventHandler(this.tvLoadout_DoubleClick);\n            this.ResultsTreeView.MouseMove += new System.Windows.Forms.MouseEventHandler(this.tvLoadout_MouseMove);\n            this.ResultsTreeView.MouseUp += new System.Windows.Forms.MouseEventHandler(this.tvLoadout_MouseUp);\n            // \n            // HeaderPanel\n            // \n            this.HeaderPanel.AutoSize = true;\n            this.HeaderPanel.Controls.Add(this.DescriptionLabel);\n            this.HeaderPanel.Controls.Add(this.ShipTypeNameLabel);\n            this.HeaderPanel.Controls.Add(this.LoadoutNameLabel);\n            this.HeaderPanel.Controls.Add(this.ExplanationLabel);\n            this.HeaderPanel.Dock = System.Windows.Forms.DockStyle.Top;\n            this.HeaderPanel.Location = new System.Drawing.Point(0, 0);\n            this.HeaderPanel.Name = \"HeaderPanel\";\n            this.HeaderPanel.Size = new System.Drawing.Size(374, 74);\n            this.HeaderPanel.TabIndex = 3;\n            // \n            // DescriptionLabel\n            // \n            this.DescriptionLabel.AutoSize = true;\n            this.DescriptionLabel.Location = new System.Drawing.Point(12, 61);\n            this.DescriptionLabel.Name = \"DescriptionLabel\";\n            this.DescriptionLabel.Size = new System.Drawing.Size(63, 13);\n            this.DescriptionLabel.TabIndex = 4;\n            this.DescriptionLabel.Text = \"Description:\";\n            // \n            // ShipTypeNameLabel\n            // \n            this.ShipTypeNameLabel.AutoSize = true;\n            this.ShipTypeNameLabel.Location = new System.Drawing.Point(12, 35);\n            this.ShipTypeNameLabel.Name = \"ShipTypeNameLabel\";\n            this.ShipTypeNameLabel.Size = new System.Drawing.Size(31, 13);\n            this.ShipTypeNameLabel.TabIndex = 3;\n            this.ShipTypeNameLabel.Text = \"Ship:\";\n            // \n            // LoadoutNameLabel\n            // \n            this.LoadoutNameLabel.AutoSize = true;\n            this.LoadoutNameLabel.Location = new System.Drawing.Point(12, 48);\n            this.LoadoutNameLabel.Name = \"LoadoutNameLabel\";\n            this.LoadoutNameLabel.Size = new System.Drawing.Size(38, 13);\n            this.LoadoutNameLabel.TabIndex = 2;\n            this.LoadoutNameLabel.Text = \"Name:\";\n            // \n            // TreeViewPanel\n            // \n            this.TreeViewPanel.Controls.Add(this.ResultsTreeView);\n            this.TreeViewPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.TreeViewPanel.Location = new System.Drawing.Point(0, 74);\n            this.TreeViewPanel.Name = \"TreeViewPanel\";\n            this.TreeViewPanel.Padding = new System.Windows.Forms.Padding(5);\n            this.TreeViewPanel.Size = new System.Drawing.Size(374, 296);\n            this.TreeViewPanel.TabIndex = 4;\n            // \n            // LoadoutImportationForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(374, 442);\n            this.Controls.Add(this.TreeViewPanel);\n            this.Controls.Add(this.HeaderPanel);\n            this.Controls.Add(this.BottomPanel);\n            this.MaximumSize = new System.Drawing.Size(390, 1280);\n            this.MinimumSize = new System.Drawing.Size(390, 480);\n            this.Name = \"LoadoutImportationForm\";\n            this.Text = \"Loadout Import\";\n            this.contextMenu.ResumeLayout(false);\n            this.BottomPanel.ResumeLayout(false);\n            this.BottomPanel.PerformLayout();\n            this.HeaderPanel.ResumeLayout(false);\n            this.HeaderPanel.PerformLayout();\n            this.TreeViewPanel.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TreeView ResultsTreeView;\n        private System.Windows.Forms.Panel BottomPanel;\n        private System.Windows.Forms.Button AddToPlanButton;\n        private System.Windows.Forms.Label TrainingTimeLabel;\n        private System.Windows.Forms.Label TrainTimeLabel;\n        private System.Windows.Forms.Button CloseButton;\n        private System.Windows.Forms.Label PlanedLabel;\n        private System.Windows.Forms.Label ExplanationLabel;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem ShowInBrowserMenuItem;\n        private System.Windows.Forms.Panel HeaderPanel;\n        private System.Windows.Forms.Label DescriptionLabel;\n        private System.Windows.Forms.Label ShipTypeNameLabel;\n        private System.Windows.Forms.Label LoadoutNameLabel;\n        private System.Windows.Forms.Panel TreeViewPanel;\n        private System.Windows.Forms.ToolStripSeparator showInMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem cmiExpandAll;\n        private System.Windows.Forms.ToolStripMenuItem cmiCollapseAll;\n        private System.Windows.Forms.ToolStripMenuItem cmiExpandSelected;\n        private System.Windows.Forms.ToolStripMenuItem cmiCollapseSelected;\n        private System.Windows.Forms.ToolStripSeparator selectedSeparator;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/LoadoutImportationWindow.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Presents the user with an interface in which a fitting tool\n    /// exported ship loadout is parsed it into a TreeView\n    /// which can be used to browse the items in the loadout.\n    /// </summary>\n    public partial class LoadoutImportationWindow : EVEMonForm\n    {\n        #region Fields\n\n        private readonly List<Item> m_objects = new List<Item>();\n        private readonly List<StaticSkillLevel> m_skillsToAdd = new List<StaticSkillLevel>();\n\n\n        private Plan m_plan;\n        private Character m_character;\n        private LoadoutFormat m_loadoutFormat;\n        private ILoadoutInfo m_loadoutInfo;\n        private string m_clipboardText;\n        private bool m_allExpanded;\n\n        #endregion\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        private LoadoutImportationWindow()\n        {\n            InitializeComponent();\n            RememberPositionKey = \"LoadoutImportationForm\";\n        }\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        /// <exception cref=\"System.ArgumentNullException\">plan</exception>\n        public LoadoutImportationWindow(Plan plan)\n            : this()\n        {\n            plan.ThrowIfNull(nameof(plan));\n\n            Plan = plan;\n\n            EveMonClient.CharacterUpdated += EveMonClient_CharacterUpdated;\n            EveMonClient.PlanChanged += EveMonClient_PlanChanged;\n            EveMonClient.PlanNameChanged += EveMonClient_PlanNameChanged;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Checks and pastes loadout from clipboard.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnActivated(EventArgs e)\n        {\n            base.OnActivated(e);\n\n            if (!Visible || ResultsTreeView.Nodes.Count > 0 || !Clipboard.ContainsText())\n                return;\n\n            m_clipboardText = Clipboard.GetText();\n\n            if (!LoadoutHelper.IsLoadout(m_clipboardText, out m_loadoutFormat))\n                return;\n\n            UpdateExplanationLabel();\n\n            BuildTreeView();\n        }\n\n        /// <summary>\n        /// Unsubscribe events on closing.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            EveMonClient.CharacterUpdated -= EveMonClient_CharacterUpdated;\n            EveMonClient.PlanChanged -= EveMonClient_PlanChanged;\n            EveMonClient.PlanNameChanged -= EveMonClient_PlanNameChanged;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the plan to which the extracted skills of the loadout should be added.\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                if (m_plan == value)\n                    return;\n\n                m_plan = value;\n                m_character = (Character)m_plan.Character;\n\n                UpdateExplanationLabel();\n\n                UpdatePlanStatus();\n            }\n        }\n\n        #endregion\n\n\n        #region Global Event Handlers\n\n        /// <summary>\n        /// When the plan changed, we need to update the training time and such.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_PlanChanged(object sender, PlanChangedEventArgs e)\n        {\n            if (e.Plan == m_plan)\n                UpdatePlanStatus();\n        }\n\n        /// <summary>\n        /// When the character changed, we need to update training time and such.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character == m_character)\n                UpdatePlanStatus();\n        }\n\n        /// <summary>\n        /// Occurs when a plan name changed.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"PlanChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_PlanNameChanged(object sender, PlanChangedEventArgs e)\n        {\n            if (e.Plan == m_plan)\n                UpdateExplanationLabel();\n        }\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Sets the DialogResult to Cancel and closes the form.\n        /// </summary>\n        /// <param name=\"sender\">Source of the event.</param>\n        /// <param name=\"e\">Arguments of the event.</param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Cancel;\n            Close();\n        }\n\n        /// <summary>\n        /// Adds the required skills to the Plan specified by the Plan property.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnPlan_Click(object sender, EventArgs e)\n        {\n            IPlanOperation operation = m_plan.TryAddSet(m_skillsToAdd, m_loadoutInfo.Loadouts.First().Name);\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = PlanWindow.ShowPlanWindow(plan: operation.Plan);\n            if (planWindow == null)\n                return;\n\n            PlanHelper.Perform(new PlanToOperationWindow(operation), planWindow);\n            planWindow.ShowPlanEditor();\n            UpdatePlanStatus();\n        }\n\n        /// <summary>\n        /// Browses the form that opened this instance of EFTLoadout to\n        /// the item that was double clicked in the TreeView.\n        /// </summary>\n        /// <param name=\"sender\">Source of the event.</param>\n        /// <param name=\"e\">Arguments of the event.</param>\n        private void tvLoadout_DoubleClick(object sender, EventArgs e)\n        {\n            Item item = ResultsTreeView.SelectedNode?.Tag as Item;\n\n            PlanWindow.ShowPlanWindow(m_character, m_plan).ShowItemInBrowser(item);\n        }\n\n        /// <summary>\n        /// Pops up the context menu for the TreeView.\n        /// </summary>\n        /// <param name=\"sender\">Source of the event.</param>\n        /// <param name=\"e\">Arguments of the event.</param>\n        private void tvLoadout_MouseUp(object sender, MouseEventArgs e)\n        {\n            // Show menu only if the right mouse button is clicked\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            ResultsTreeView.Cursor = Cursors.Default;\n\n            // Get the node that the user has clicked\n            ResultsTreeView.SelectedNode = ResultsTreeView.GetNodeAt(e.Location);\n\n            // Select the node the user has clicked\n            contextMenu.Show(ResultsTreeView, e.Location);\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void tvLoadout_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            ResultsTreeView.Cursor = ResultsTreeView.GetNodeAt(e.Location)?.Tag != null\n                ? CustomCursors.ContextMenu\n                : Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the context menu opens, we update the menus status.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CancelEventArgs\"/> instance containing the event data.</param>\n        private void contextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            e.Cancel = ResultsTreeView.Nodes.Count == 0;\n\n            if (e.Cancel)\n                return;\n\n            TreeNode node = ResultsTreeView.SelectedNode;\n            Item selectedItem = node?.Tag as Item;\n\n            ShowInBrowserMenuItem.Visible = showInMenuSeparator.Visible = selectedItem != null;\n\n            selectedSeparator.Visible = selectedItem == null && node != null;\n\n            // \"Collapse\" and \"Expand\" menus\n            cmiCollapseSelected.Visible = selectedItem == null && node != null && node.IsExpanded;\n            cmiExpandSelected.Visible = selectedItem == null && node != null && !node.IsExpanded;\n\n            cmiExpandSelected.Text = selectedItem == null && node != null && !node.IsExpanded\n                ? $\"Expand \\\"{node.Text}\\\"\"\n                : string.Empty;\n            cmiCollapseSelected.Text = selectedItem == null && node != null && node.IsExpanded\n                ? $\"Collapse \\\"{node.Text}\\\"\"\n                : string.Empty;\n            \n            // \"Expand All\" and \"Collapse All\" menus\n            cmiCollapseAll.Enabled = cmiCollapseAll.Visible = m_allExpanded;\n            cmiExpandAll.Enabled = cmiExpandAll.Visible = !cmiCollapseAll.Enabled;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiCollapseSelected_Click(object sender, EventArgs e)\n        {\n            ResultsTreeView.SelectedNode.Collapse();\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiExpandSelected_Click(object sender, EventArgs e)\n        {\n            ResultsTreeView.SelectedNode.Expand();\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand all.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiExpandAll_Click(object sender, EventArgs e)\n        {\n            ResultsTreeView.ExpandAll();\n            m_allExpanded = true;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse all.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiCollapseAll_Click(object sender, EventArgs e)\n        {\n            ResultsTreeView.CollapseAll();\n            m_allExpanded = false;\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Updates the explanation label.\n        /// </summary>\n        private void UpdateExplanationLabel()\n        {\n            if (m_loadoutFormat == LoadoutFormat.None)\n                return;\n\n            ExplanationLabel.Text = $\"The parsed {m_loadoutFormat} formated loadout is shown below{Environment.NewLine}\" +\n                                    $\"for \\\" {m_character.Name} [{m_plan.Name}] \\\" plan.\";\n        }\n\n        /// <summary>\n        /// Builds the tree view.\n        /// </summary>\n        private void BuildTreeView()\n        {\n            m_objects.Clear();\n            ResultsTreeView.Nodes.Clear();\n\n            // Decode EFT format\n            if (m_loadoutFormat == LoadoutFormat.EFT)\n                m_loadoutInfo = LoadoutHelper.DeserializeEftFormat(m_clipboardText);\n\n            // Decode XML format\n            if (m_loadoutFormat == LoadoutFormat.XML)\n                m_loadoutInfo = LoadoutHelper.DeserializeXmlFormat(m_clipboardText);\n\n            // Decode DNA format\n            if (m_loadoutFormat == LoadoutFormat.DNA)\n                m_loadoutInfo = LoadoutHelper.DeserializeDnaFormat(m_clipboardText);\n\n            // Decode CLF format\n            if (m_loadoutFormat == LoadoutFormat.CLF)\n                m_loadoutInfo = LoadoutHelper.DeserializeClfFormat(m_clipboardText);\n\n            if (m_loadoutInfo == null || !m_loadoutInfo.Loadouts.Any())\n                return;\n\n            LoadoutNameLabel.Text = $\"Name: {m_loadoutInfo.Loadouts.First().Name}{(m_loadoutFormat == LoadoutFormat.DNA ? \" - DNA loadout\" : string.Empty)}\"\n                .WordWrap(55);\n\n            ShipTypeNameLabel.Text = $\"Ship: {(m_loadoutInfo.Ship?.Name ?? string.Empty)}\"\n                .WordWrap(55);\n\n            DescriptionLabel.Text = $\"Description: {m_loadoutInfo.Loadouts.First().Description}\"\n                .WordWrap(55);\n\n            m_objects.Add(m_loadoutInfo.Ship);\n\n            BuildTreeNodes(m_loadoutInfo.Loadouts.First().Items);\n\n            // Order the nodes\n            TreeNode[] orderNodes = ResultsTreeView.Nodes.Cast<TreeNode>().OrderBy(\n                node => LoadoutHelper.OrderedSlotNames.IndexOf(string.Intern(node.Text))).ToArray();\n            ResultsTreeView.Nodes.Clear();\n            ResultsTreeView.Nodes.AddRange(orderNodes);\n\n            // Update the controls\n            UpdatePlanStatus();\n            ResultsTreeView.ExpandAll();\n            ResultsTreeView.Enabled = true;\n            Cursor = Cursors.Default;\n            m_allExpanded = true;\n        }\n\n        /// <summary>\n        /// Builds the tree nodes.\n        /// </summary>\n        /// <param name=\"items\">The items.</param>\n        private void BuildTreeNodes(IEnumerable<Item> items)\n        {\n            foreach (Item item in items)\n            {\n                TreeNode slotNode;\n                string nodeName = LoadoutHelper.OrderedSlotNames[7];\n\n                // Regular item ?\n                if (!item.MarketGroup.BelongsIn(DBConstants.AmmosAndChargesMarketGroupID))\n                {\n                    // Retrieve the tree node name for the slot\n                    switch (item.FittingSlot)\n                    {\n                        case ItemSlot.High:\n                            nodeName = LoadoutHelper.OrderedSlotNames[0];\n                            break;\n                        case ItemSlot.Medium:\n                            nodeName = LoadoutHelper.OrderedSlotNames[1];\n                            break;\n                        case ItemSlot.Low:\n                            nodeName = LoadoutHelper.OrderedSlotNames[2];\n                            break;\n                    }\n\n                    // Is it a rig?\n                    if (item.MarketGroup.BelongsIn(DBConstants.ShipModificationsMarketGroupID))\n                        nodeName = LoadoutHelper.OrderedSlotNames[3];\n                    // Is it a subsystem?\n                    else if (item.MarketGroup.BelongsIn(DBConstants.SubsystemsMarketGroupID))\n                        nodeName = LoadoutHelper.OrderedSlotNames[4];\n                    // Is it a drone?\n                    else if (item.MarketGroup.BelongsIn(DBConstants.DronesMarketGroupID))\n                        nodeName = LoadoutHelper.OrderedSlotNames[6];\n\n                    // Gets or create the node for the slot\n                    slotNode = !ResultsTreeView.Nodes.ContainsKey(nodeName)\n                        ? ResultsTreeView.Nodes.Add(nodeName, nodeName)\n                        : ResultsTreeView.Nodes[nodeName];\n\n                    // Add a new node\n                    TreeNode itemNode = new TreeNode { Text = item.Name, Tag = item };\n                    slotNode.Nodes.Add(itemNode);\n\n                    m_objects.Add(item);\n\n                    continue;\n                }\n\n                // Item is a charge ? \n                nodeName = LoadoutHelper.OrderedSlotNames[5];\n                slotNode = !ResultsTreeView.Nodes.ContainsKey(nodeName)\n                    ? ResultsTreeView.Nodes.Add(nodeName, nodeName)\n                    : ResultsTreeView.Nodes[nodeName];\n\n                TreeNode ammoNode = new TreeNode { Text = item.Name, Tag = item };\n                slotNode.Nodes.Add(ammoNode);\n\n                m_objects.Add(item);\n            }\n        }\n\n        /// <summary>\n        /// Updates the form controls to reflect the status of the Plan specified by the Plan property.\n        /// </summary>\n        private void UpdatePlanStatus()\n        {\n            if (m_loadoutFormat == LoadoutFormat.None)\n                return;\n\n            // Compute the skills to add\n            m_skillsToAdd.Clear();\n            CharacterScratchpad scratchpad = new CharacterScratchpad(m_character);\n\n            // Compute the training time for the prerequisites\n            foreach (Item obj in m_objects)\n            {\n                scratchpad.Train(obj.Prerequisites.Where(x => m_character.Skills[x.Skill.ID].Level < x.Level));\n            }\n            m_skillsToAdd.AddRange(scratchpad.TrainedSkills);\n\n            // All skills already trained ?\n            if (m_skillsToAdd.Count == 0)\n            {\n                AddToPlanButton.Enabled = false;\n                PlanedLabel.Visible = true;\n                PlanedLabel.Text = @\"All skills already trained.\";\n                TrainTimeLabel.Visible = false;\n            }\n            // Are skills already planned ?\n            else if (m_plan.AreSkillsPlanned(m_skillsToAdd))\n            {\n                AddToPlanButton.Enabled = false;\n                PlanedLabel.Visible = true;\n                PlanedLabel.Text = @\"All skills already trained or planned.\";\n                TrainTimeLabel.Visible = false;\n            }\n            // There is at least one untrained or non-planned skill\n            else\n            {\n                AddToPlanButton.Enabled = true;\n                PlanedLabel.Text = string.Empty;\n                PlanedLabel.Visible = false;\n                TrainTimeLabel.Visible = true;\n\n                // Compute training time\n                TimeSpan trainingTime = m_character.GetTrainingTimeToMultipleSkills(m_skillsToAdd);\n                TrainTimeLabel.Text = trainingTime.ToDescriptiveText(\n                    DescriptiveTextOptions.IncludeCommas | DescriptiveTextOptions.SpaceText);\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/LoadoutImportationWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/MasteryTreeDisplayControl.Designer.cs",
    "content": "﻿namespace EVEMon.SkillPlanner\n{\n    partial class MasteryTreeDisplayControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MasteryTreeDisplayControl));\n            this.imageListCertLevels = new System.Windows.Forms.ImageList(this.components);\n            this.cmListSkills = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.planToLevel = new System.Windows.Forms.ToolStripMenuItem();\n            this.planToLevelSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.showInBrowserMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInExplorerMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.tsmExpandSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmCollapseSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.toggleSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.tsmExpandAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmCollapseAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.imageList = new System.Windows.Forms.ImageList(this.components);\n            this.treeView = new EVEMon.SkillPlanner.OverridenTreeView();\n            this.imageListMasteryLevels = new System.Windows.Forms.ImageList(this.components);\n            this.cmListSkills.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // imageListCertLevels\n            // \n            this.imageListCertLevels.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"imageListCertLevels.ImageStream\")));\n            this.imageListCertLevels.TransparentColor = System.Drawing.Color.Transparent;\n            this.imageListCertLevels.Images.SetKeyName(0, \"level0\");\n            this.imageListCertLevels.Images.SetKeyName(1, \"level1\");\n            this.imageListCertLevels.Images.SetKeyName(2, \"level2\");\n            this.imageListCertLevels.Images.SetKeyName(3, \"level3\");\n            this.imageListCertLevels.Images.SetKeyName(4, \"level4\");\n            this.imageListCertLevels.Images.SetKeyName(5, \"level5\");\n            // \n            // cmListSkills\n            // \n            this.cmListSkills.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.planToLevel,\n            this.planToLevelSeparator,\n            this.showInBrowserMenu,\n            this.showInExplorerMenu,\n            this.showInMenuSeparator,\n            this.tsmExpandSelected,\n            this.tsmCollapseSelected,\n            this.toggleSeparator,\n            this.tsmExpandAll,\n            this.tsmCollapseAll});\n            this.cmListSkills.Name = \"cmListSkills\";\n            this.cmListSkills.Size = new System.Drawing.Size(195, 198);\n            // \n            // planToLevel\n            // \n            this.planToLevel.Image = ((System.Drawing.Image)(resources.GetObject(\"planToLevel.Image\")));\n            this.planToLevel.Name = \"planToLevel\";\n            this.planToLevel.Size = new System.Drawing.Size(194, 22);\n            this.planToLevel.Text = \"&Plan...\";\n            this.planToLevel.Click += new System.EventHandler(this.tsmAddToPlan_Click);\n            // \n            // planToLevelSeparator\n            // \n            this.planToLevelSeparator.Name = \"planToLevelSeparator\";\n            this.planToLevelSeparator.Size = new System.Drawing.Size(191, 6);\n            // \n            // showInBrowserMenu\n            // \n            this.showInBrowserMenu.Name = \"showInBrowserMenu\";\n            this.showInBrowserMenu.Size = new System.Drawing.Size(194, 22);\n            this.showInBrowserMenu.Text = \"Show in Skill &Browser\";\n            this.showInBrowserMenu.Click += new System.EventHandler(this.showInBrowserMenu_Click);\n            // \n            // showInExplorerMenu\n            // \n            this.showInExplorerMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"showInExplorerMenu.Image\")));\n            this.showInExplorerMenu.Name = \"showInExplorerMenu\";\n            this.showInExplorerMenu.Size = new System.Drawing.Size(194, 22);\n            this.showInExplorerMenu.Text = \"Show in Skill &Explorer...\";\n            this.showInExplorerMenu.Click += new System.EventHandler(this.showInExplorerMenu_Click);\n            // \n            // showInMenuSeparator\n            // \n            this.showInMenuSeparator.Name = \"showInMenuSeparator\";\n            this.showInMenuSeparator.Size = new System.Drawing.Size(191, 6);\n            // \n            // tsmExpandSelected\n            // \n            this.tsmExpandSelected.Name = \"tsmExpandSelected\";\n            this.tsmExpandSelected.Size = new System.Drawing.Size(194, 22);\n            this.tsmExpandSelected.Text = \"Expand Selected\";\n            this.tsmExpandSelected.Click += new System.EventHandler(this.tsmExpandSelected_Click);\n            // \n            // tsmCollapseSelected\n            // \n            this.tsmCollapseSelected.Name = \"tsmCollapseSelected\";\n            this.tsmCollapseSelected.Size = new System.Drawing.Size(194, 22);\n            this.tsmCollapseSelected.Text = \"Collapse Selected\";\n            this.tsmCollapseSelected.Click += new System.EventHandler(this.tsmCollapseSelected_Click);\n            // \n            // toggleSeparator\n            // \n            this.toggleSeparator.Name = \"toggleSeparator\";\n            this.toggleSeparator.Size = new System.Drawing.Size(191, 6);\n            // \n            // tsmExpandAll\n            // \n            this.tsmExpandAll.Name = \"tsmExpandAll\";\n            this.tsmExpandAll.Size = new System.Drawing.Size(194, 22);\n            this.tsmExpandAll.Text = \"&Expand All\";\n            this.tsmExpandAll.Click += new System.EventHandler(this.tsmExpandAll_Click);\n            // \n            // tsmCollapseAll\n            // \n            this.tsmCollapseAll.Name = \"tsmCollapseAll\";\n            this.tsmCollapseAll.Size = new System.Drawing.Size(194, 22);\n            this.tsmCollapseAll.Text = \"&Collapse All\";\n            this.tsmCollapseAll.Click += new System.EventHandler(this.tsmCollapseAll_Click);\n            // \n            // imageList\n            // \n            this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"imageList.ImageStream\")));\n            this.imageList.TransparentColor = System.Drawing.Color.Transparent;\n            this.imageList.Images.SetKeyName(0, \"Trained\");\n            this.imageList.Images.SetKeyName(1, \"Trainable\");\n            this.imageList.Images.SetKeyName(2, \"Untrainable\");\n            this.imageList.Images.SetKeyName(3, \"Certificate\");\n            this.imageList.Images.SetKeyName(4, \"Skillbook\");\n            this.imageList.Images.SetKeyName(5, \"Planned\");\n            // \n            // treeView\n            // \n            this.treeView.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.treeView.ContextMenuStrip = this.cmListSkills;\n            this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.treeView.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawText;\n            this.treeView.FullRowSelect = true;\n            this.treeView.ImageIndex = 0;\n            this.treeView.ImageList = this.imageList;\n            this.treeView.ItemHeight = 1;\n            this.treeView.Location = new System.Drawing.Point(0, 0);\n            this.treeView.Name = \"treeView\";\n            this.treeView.SelectedImageIndex = 0;\n            this.treeView.Size = new System.Drawing.Size(226, 282);\n            this.treeView.TabIndex = 0;\n            this.treeView.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView_NodeMouseClick);\n            this.treeView.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView_NodeMouseDoubleClick);\n            // \n            // imageListMasteryLevels\n            // \n            this.imageListMasteryLevels.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"imageListMasteryLevels.ImageStream\")));\n            this.imageListMasteryLevels.TransparentColor = System.Drawing.Color.Transparent;\n            this.imageListMasteryLevels.Images.SetKeyName(0, \"masteryLevel\");\n            this.imageListMasteryLevels.Images.SetKeyName(1, \"masteryLevel1\");\n            this.imageListMasteryLevels.Images.SetKeyName(2, \"masteryLevel2\");\n            this.imageListMasteryLevels.Images.SetKeyName(3, \"masteryLevel3\");\n            this.imageListMasteryLevels.Images.SetKeyName(4, \"masteryLevel4\");\n            this.imageListMasteryLevels.Images.SetKeyName(5, \"masteryLevel5\");\n            // \n            // MasteryTreeDisplayControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.treeView);\n            this.Name = \"MasteryTreeDisplayControl\";\n            this.Size = new System.Drawing.Size(226, 282);\n            this.cmListSkills.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private OverridenTreeView treeView;\n        private System.Windows.Forms.ImageList imageListCertLevels;\n        private System.Windows.Forms.ContextMenuStrip cmListSkills;\n        private System.Windows.Forms.ToolStripMenuItem planToLevel;\n        private System.Windows.Forms.ToolStripSeparator planToLevelSeparator;\n        private System.Windows.Forms.ToolStripMenuItem showInBrowserMenu;\n        private System.Windows.Forms.ToolStripMenuItem showInExplorerMenu;\n        private System.Windows.Forms.ToolStripSeparator showInMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem tsmExpandSelected;\n        private System.Windows.Forms.ToolStripMenuItem tsmCollapseSelected;\n        private System.Windows.Forms.ToolStripSeparator toggleSeparator;\n        private System.Windows.Forms.ToolStripMenuItem tsmExpandAll;\n        private System.Windows.Forms.ToolStripMenuItem tsmCollapseAll;\n        private System.Windows.Forms.ImageList imageList;\n        private System.Windows.Forms.ImageList imageListMasteryLevels;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/MasteryTreeDisplayControl.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// UserControl to display a tree of masteries.\n    /// </summary>\n    public sealed partial class MasteryTreeDisplayControl : UserControl\n    {\n        private const string TrainedIcon = \"Trained\";\n        private const string TrainableIcon = \"Trainable\";\n        private const string UntrainableIcon = \"Untrainable\";\n        private const string SkillBookIcon = \"Skillbook\";\n        private const string PlannedIcon = \"Planned\";\n\n        // Blank image list for 'Safe for work' setting\n        private readonly ImageList m_emptyImageList = new ImageList();\n        private readonly Font m_boldFont;\n\n        private Plan m_plan;\n        private Character m_character;\n        private MasteryShip m_masteryShip;\n\n        private bool m_allExpanded;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MasteryTreeDisplayControl\"/> class.\n        /// </summary>\n        public MasteryTreeDisplayControl()\n        {\n            SetStyle(ControlStyles.OptimizedDoubleBuffer |\n                     ControlStyles.DoubleBuffer |\n                     ControlStyles.UserPaint |\n                     ControlStyles.ResizeRedraw |\n                     ControlStyles.ContainerControl |\n                     ControlStyles.AllPaintingInWmPaint, true);\n            UpdateStyles();\n\n            InitializeComponent();\n\n            treeView.DrawNode += treeView_DrawNode;\n            treeView.MouseDown += treeView_MouseDown;\n            treeView.MouseMove += treeView_MouseMove;\n\n            cmListSkills.Opening += cmListSkills_Opening;\n\n            m_boldFont = FontFactory.GetFont(Font, FontStyle.Bold);\n            treeView.Font = FontFactory.GetFont(\"Microsoft Sans Serif\", 8.25F);\n            treeView.ItemHeight = treeView.Font.Height * 2 + 6;\n\n            m_emptyImageList.ImageSize = new Size(30, 24);\n            m_emptyImageList.Images.Add(new Bitmap(30, 24));\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the current plan.\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                m_plan = value;\n                if (m_plan == null)\n                    return;\n\n                m_character = (Character)m_plan.Character;\n                UpdateTree();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the mastery ship.\n        /// </summary>\n        internal MasteryShip MasteryShip\n        {\n            get { return m_masteryShip; }\n            set\n            {\n                if (value == m_masteryShip)\n                    return;\n\n                m_masteryShip = value;\n                m_character = m_masteryShip?.Character;\n                UpdateTree();\n            }\n        }\n\n        /// <summary>\n        /// Gets mastery of the displayed class which contains the current selection.\n        /// </summary>\n        private Mastery SelectedMasteryLevel\n        {\n            get\n            {\n                TreeNode node = treeView.SelectedNode;\n                while (node != null)\n                {\n                    Mastery masteryLevel = node.Tag as Mastery;\n                    if (masteryLevel != null)\n                        return masteryLevel;\n\n                    node = node.Parent;\n                }\n                return null;\n            }\n        }\n        \n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// On load, complete the initialization.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.CharacterUpdated += EveMonClient_CharacterUpdated;\n            EveMonClient.PlanChanged += EveMonClient_PlanChanged;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.CharacterUpdated -= EveMonClient_CharacterUpdated;\n            EveMonClient.PlanChanged -= EveMonClient_PlanChanged;\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// On settings change, we update the tree.\n        /// </summary>\n        /// <remarks>Relates to safe for work setting</remarks>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateTree();\n        }\n\n        /// <summary>\n        /// Fired when one of the character changed (skill completion, update from CCP, etc).\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (m_plan == null)\n                return;\n\n            if (e.Character != m_plan.Character)\n                return;\n\n            UpdateTree();\n        }\n\n        /// <summary>\n        /// Occurs when the plan changes, we update the tree.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_PlanChanged(object sender, PlanChangedEventArgs e)\n        {\n            if ((e.Plan != m_plan) || (e.Plan.Character != m_plan.Character))\n                return;\n\n            UpdateTree();\n        }\n\n        /// <summary>\n        /// When the treeview is clicked, we manually select nodes since the bounding boxes are incorrect due to custom draw.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void treeView_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                treeView.Cursor = Cursors.Default;\n\n            // Perform the selection manually since the bound's width and x are incorrect in owndraw\n            TreeNode selection = null;\n            for (TreeNode node = treeView.TopNode; node != null; node = node.NextVisibleNode)\n            {\n                if (node.Bounds.Top > e.Y || node.Bounds.Bottom < e.Y)\n                    continue;\n\n                // If the user clicked the \"arrow zone\", we do not change the selection and just return\n                if (e.X < node.Bounds.Left - 32)\n                    return;\n\n                selection = node;\n                break;\n            }\n\n            treeView.SelectedNode = selection;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void treeView_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            treeView.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Forces the selection update when a node is right-clicked.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                treeView.SelectedNode = e.Node;\n        }\n\n        /// <summary>\n        /// Event handler for treenode double click event.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void treeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)\n        {\n            if (e.Node.Tag is Mastery)\n            {\n                if (e.Node.IsExpanded)\n                {\n                    e.Node.Collapse();\n                    return;\n                }\n\n                e.Node.Expand();\n            }\n\n            showInBrowserMenu_Click(sender, e);\n        }\n\n        #endregion\n\n\n        #region Tree building\n\n        /// <summary>\n        /// Updates the shown treecontrol\n        /// </summary>\n        private void UpdateTree()\n        {\n            // Multiple copies of \"CPU Management IV\" etc. could exist in the tree. To restore\n            // the same selection, the full path to the selection must be stored\n            string path = treeView.SelectedNode?.FullPath ?? \"\";\n\n            treeView.ImageList = Settings.UI.SafeForWork ? m_emptyImageList : imageList;\n            treeView.BeginUpdate();\n            try\n            {\n                // Clear the old items\n                treeView.Nodes.Clear();\n\n                // No update when not fully initialized\n                if (m_character == null || m_masteryShip == null)\n                    return;\n\n                // Create the nodes when not done, yet\n                if (treeView.Nodes.Count == 0)\n                    foreach (Mastery masteryLevel in m_masteryShip)\n                    {\n                        var node = CreateNode(masteryLevel);\n                        treeView.Nodes.Add(node);\n                    }\n\n                // Update the nodes\n                foreach (TreeNode node in treeView.Nodes)\n                {\n                    UpdateNode(node);\n                }\n\n                // If old selection exists, select it\n                if (!string.IsNullOrEmpty(path))\n                {\n                    var nodes = treeView.Nodes;\n                    // Iterate through all components in the path\n                    string[] components = path.Split(new string[] { treeView.PathSeparator },\n                        StringSplitOptions.None);\n                    int nc = components.Length;\n                    for (int index = 0; index < nc && nodes != null; index++)\n                    {\n                        TreeNode child = null;\n                        string component = components[index];\n                        int n = nodes.Count;\n                        // Search nodes for a node with the same text\n                        for (int i = 0; i < n && child == null; i++)\n                        {\n                            var candidate = nodes[i];\n                            if (candidate.Text?.Equals(component) ?? false)\n                                child = candidate;\n                        }\n                        nodes = child?.Nodes;\n                        if (index == nc - 1 && child != null)\n                        {\n                            // Found node, select it\n                            child.EnsureVisible();\n                            treeView.SelectedNode = child;\n                        }\n                    }\n                }\n            }\n            finally\n            {\n                treeView.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Create a node from a mastery.\n        /// </summary>\n        /// <param name=\"masteryLevel\">The mastery level.</param>\n        /// <returns>The node created.</returns>\n        private TreeNode CreateNode(Mastery masteryLevel)\n        {\n            var node = new TreeNode\n            {\n                Text = masteryLevel.ToString(),\n                Tag = masteryLevel\n            };\n\n            foreach (var cert in masteryLevel.OrderBy(cert => cert.Certificate.Class.Name))\n            {\n                var certificate = cert.ToCharacter(m_character).GetCertificateLevel(\n                    masteryLevel.Level);\n                node.Nodes.Add(CreateNode(certificate));\n            }\n\n            return node;\n        }\n\n        /// <summary>\n        /// Create a node from a certificate.\n        /// </summary>\n        /// <param name=\"certificateLevel\">The certificate level.</param>\n        /// <returns></returns>\n        private static TreeNode CreateNode(CertificateLevel certificateLevel)\n        {\n            TreeNode node = new TreeNode\n            {\n                Text = certificateLevel.Certificate.Class.ToString(),\n                Tag = certificateLevel\n            };\n\n            // Add this certificate's prerequisites\n            foreach (SkillLevel prereqSkill in certificateLevel.PrerequisiteSkills)\n            {\n                node.Nodes.Add(CreateNode(prereqSkill));\n            }\n\n            return node;\n        }\n\n        /// <summary>\n        /// Create a node from a prerequisite skill.\n        /// </summary>\n        /// <param name=\"skillPrereq\">The skill prerequesites</param>\n        /// <returns></returns>\n        private static TreeNode CreateNode(SkillLevel skillPrereq)\n        {\n            TreeNode node = new TreeNode\n            {\n                Text = skillPrereq.ToString(),\n                Tag = skillPrereq\n            };\n\n            // Add this skill's prerequisites\n            foreach (var prereqSkill in skillPrereq.Skill.Prerequisites)\n            {\n                if (prereqSkill.Skill != skillPrereq.Skill)\n                    node.Nodes.Add(CreateNode(prereqSkill));\n            }\n\n            return node;\n        }\n\n        /// <summary>\n        /// Updates the specified node and its children.\n        /// </summary>\n        /// <param name=\"node\">The Treenode</param>\n        private void UpdateNode(TreeNode node)\n        {\n            Mastery masteryLevel = node.Tag as Mastery;\n            CertificateLevel certLevel = node.Tag as CertificateLevel;\n\n            // The node represents a mastery level\n            if (masteryLevel != null)\n            {\n                if (masteryLevel.IsTrained)\n                    node.ImageIndex = imageList.Images.IndexOfKey(TrainedIcon);\n                else if (masteryLevel.IsPartiallyTrained)\n                    node.ImageIndex = imageList.Images.IndexOfKey(TrainableIcon);\n                else\n                    node.ImageIndex = imageList.Images.IndexOfKey(UntrainableIcon);\n            }\n            // The node represents a certificate level\n            else if (certLevel != null)\n            {\n                if (certLevel.IsTrained)\n                    node.ImageIndex = imageList.Images.IndexOfKey(TrainedIcon);\n                else if (certLevel.IsPartiallyTrained)\n                    node.ImageIndex = imageList.Images.IndexOfKey(TrainableIcon);\n                else\n                    node.ImageIndex = imageList.Images.IndexOfKey(UntrainableIcon);\n            }\n            // The node represents a skill prerequisite\n            else\n            {\n                SkillLevel skillPrereq = (SkillLevel)node.Tag;\n                Skill skill = m_character.Skills[skillPrereq.Skill.ID];\n\n                if (m_plan != null)\n                {\n                    if (skillPrereq.IsTrained)\n                        node.ImageIndex = imageList.Images.IndexOfKey(TrainedIcon);\n                    else if (m_plan.IsPlanned(skill, skillPrereq.Level))\n                        node.ImageIndex = imageList.Images.IndexOfKey(PlannedIcon);\n                    else if (skill.IsKnown)\n                        node.ImageIndex = imageList.Images.IndexOfKey(TrainableIcon);\n                    else\n                        node.ImageIndex = imageList.Images.IndexOfKey(UntrainableIcon);\n                }\n            }\n\n            // When selected, the image remains the same\n            node.SelectedImageIndex = node.ImageIndex;\n\n            // Update the children\n            foreach (TreeNode child in node.Nodes)\n            {\n                UpdateNode(child);\n            }\n        }\n\n        /// <summary>\n        /// Custom draw for the label.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void treeView_DrawNode(object sender, DrawTreeNodeEventArgs e)\n        {\n            // Prevents a bug that causes every item to be redrawn at the top left corner\n            if (e.Bounds.Left <= 10)\n            {\n                e.DrawDefault = true;\n                return;\n            }\n\n            string line2 = \"-\";\n            int supIcon = -1;\n            ImageList il;\n\n            Mastery masteryLevel = e.Node.Tag as Mastery;\n            CertificateLevel certLevel = e.Node.Tag as CertificateLevel;\n\n            // Is it a mastery level ?\n            if (masteryLevel != null)\n            {\n                if (!Settings.UI.SafeForWork)\n                    supIcon = masteryLevel.Level;\n\n                il = imageListMasteryLevels;\n\n                // When not trained, let's display the training time of all certificates of this level\n                if (!masteryLevel.IsTrained)\n                {\n                    line2 = masteryLevel.GetTrainingTime().ToDescriptiveText(\n                        DescriptiveTextOptions.IncludeCommas);\n                }\n            }\n            else if (certLevel != null)\n            {\n                if (!Settings.UI.SafeForWork)\n                    supIcon = (int)certLevel.Level;\n\n                il = imageListCertLevels;\n\n                // When not trained, let's display the training time\n                if (!certLevel.IsTrained)\n                {\n                    line2 = certLevel.GetTrainingTime.ToDescriptiveText(DescriptiveTextOptions.\n                        IncludeCommas);\n                }\n            }\n            // Or a skill prerequisite ?\n            else\n            {\n                if (!Settings.UI.SafeForWork)\n                    supIcon = imageList.Images.IndexOfKey(SkillBookIcon);\n\n                il = imageList;\n                SkillLevel skillPrereq = (SkillLevel)e.Node.Tag;\n\n                // When not known to the require level, let's display the training time\n                if (!skillPrereq.IsTrained)\n                {\n                    TimeSpan time = skillPrereq.Skill.GetLeftTrainingTimeToLevel(skillPrereq.Level);\n                    line2 = time.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n                }\n            }\n\n            // Choose colors according to selection\n            bool isSelected = (e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected;\n            Color backColor = isSelected ? SystemColors.Highlight : treeView.BackColor;\n            Color foreColor = isSelected ? SystemColors.HighlightText : treeView.ForeColor;\n            Color lightForeColor = isSelected ? SystemColors.HighlightText : SystemColors.GrayText;\n\n            // Draws the background\n            using (SolidBrush background = new SolidBrush(backColor))\n            {\n                int width = treeView.ClientSize.Width - e.Bounds.Left;\n                e.Graphics.FillRectangle(background, new Rectangle(e.Bounds.Left, e.Bounds.Top, width, e.Bounds.Height));\n            }\n\n            // Performs the drawing\n            using (SolidBrush foreground = new SolidBrush(foreColor))\n            {\n                float offset;\n                int left = e.Bounds.Left + il.ImageSize.Width + 2;\n                Size line1Size = TextRenderer.MeasureText(e.Node.Text, m_boldFont);\n\n                if (!string.IsNullOrEmpty(line2))\n                {\n                    Size line2Size = TextRenderer.MeasureText(line2, Font);\n\n                    offset = (float)(e.Bounds.Height - line1Size.Height - line2Size.Height) / 2;\n                    e.Graphics.DrawString(e.Node.Text, m_boldFont, foreground, new PointF(left, e.Bounds.Top + offset));\n\n                    using (SolidBrush lightForeground = new SolidBrush(lightForeColor))\n                    {\n                        e.Graphics.DrawString(line2, Font, lightForeground, new PointF(left, e.Bounds.Top + offset + line1Size.Height));\n                    }\n                }\n                else\n                {\n                    offset = (float)(e.Bounds.Height - line1Size.Height) / 2;\n                    e.Graphics.DrawString(e.Node.Text, m_boldFont, foreground, new PointF(left, e.Bounds.Top + offset));\n                }\n            }\n\n            // Draws the icon for skill/cert on the far right\n            if (supIcon == -1)\n                return;\n\n            int imgOfssetX = e.Bounds.Left;\n            float imgOffsetY = Math.Max(0.0f, (e.Bounds.Height - il.ImageSize.Height) * 0.5f);\n            e.Graphics.DrawImageUnscaled(il.Images[supIcon], imgOfssetX, (int)(e.Bounds.Top + imgOffsetY));\n        }\n\n        #endregion\n\n\n        #region Context menus\n\n        /// <summary>\n        /// Context menu opening, we update the menus' statuses.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmListSkills_Opening(object sender, CancelEventArgs e)\n        {\n            TreeNode node = treeView.SelectedNode;\n            Mastery masteryLevel = node?.Tag as Mastery;\n            CertificateLevel certLevel = node?.Tag as CertificateLevel;\n\n            planToLevel.Visible = planToLevelSeparator.Visible = m_plan != null && node != null;\n\n            if (m_plan != null)\n            {\n                if (masteryLevel != null)\n                {\n                    // Update \"add to\" menu\n                    planToLevel.Enabled = !m_plan.WillGrantEligibilityFor(masteryLevel);\n                    planToLevel.Text = $\"Plan \\\"{masteryLevel}\\\"\";\n                }\n                // When a certificate is selected\n                else if (certLevel != null)\n                {\n                    // Update \"add to\" menu\n                    planToLevel.Enabled = !m_plan.WillGrantEligibilityFor(certLevel);\n                    planToLevel.Text = $\"Plan \\\"{certLevel.Certificate.Name}\\\"\";\n                }\n                // When a skill is selected\n                else if (node != null)\n                {\n                    // Update \"add to\" menu\n                    var prereq = node.Tag as SkillLevel;\n                    if (prereq != null)\n                    {\n                        Skill skill = prereq.Skill;\n                        planToLevel.Enabled = skill.Level < prereq.Level && !m_plan.\n                            IsPlanned(skill, prereq.Level);\n                        planToLevel.Text = $\"Plan \\\"{skill} {Skill.GetRomanFromInt(prereq.Level)}\\\"\";\n                    }\n                }\n            }\n            // Update \"show in skill browser\" text\n            showInBrowserMenu.Text = certLevel != null ? \"Show in Certificate Browser\" :\n                \"Show in Skill Browser\";\n\n            // Update \"show in skill browser\" menu\n            showInBrowserMenu.Visible = (node != null && masteryLevel == null);\n\n            // Update \"show in skill explorer\" menu\n            showInExplorerMenu.Visible = (node != null && masteryLevel == null && certLevel == null);\n\n            // Update \"show in\" menu\n            showInMenuSeparator.Visible = (node != null && masteryLevel == null);\n\n            // \"Collapse\" and \"Expand\" menus\n            int subNodeCount = node?.GetNodeCount(true) ?? 0;\n            tsmCollapseSelected.Visible = subNodeCount > 0 && node.IsExpanded;\n            tsmExpandSelected.Visible = subNodeCount > 0 && !node.IsExpanded;\n\n            tsmExpandSelected.Text = (subNodeCount > 0 && !node.IsExpanded) ?\n                $\"Expand \\\"{node.Text}\\\"\" : string.Empty;\n            tsmCollapseSelected.Text = (subNodeCount > 0 && node.IsExpanded) ?\n                $\"Collapse \\\"{node.Text}\\\"\" : string.Empty;\n\n            toggleSeparator.Visible = subNodeCount > 0;\n\n            // \"Expand All\" and \"Collapse All\" menus\n            tsmCollapseAll.Enabled = tsmCollapseAll.Visible = m_allExpanded;\n            tsmExpandAll.Enabled = tsmExpandAll.Visible = !tsmCollapseAll.Enabled;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Plan \"(selection)\".\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmAddToPlan_Click(object sender, EventArgs e)\n        {\n            var masteryLevel = treeView.SelectedNode.Tag as Mastery;\n            var certLevel = treeView.SelectedNode.Tag as CertificateLevel;\n            IPlanOperation operation = null;\n\n            if (masteryLevel != null)\n                operation = m_plan.TryPlanTo(masteryLevel);\n            else if (certLevel != null)\n                operation = m_plan.TryPlanTo(certLevel);\n            else\n            {\n                var prereq = treeView.SelectedNode.Tag as SkillLevel;\n                if (prereq != null)\n                    operation = m_plan.TryPlanTo(prereq.Skill, prereq.Level);\n            }\n\n            if (operation != null)\n            {\n                var planWindow = ParentForm as PlanWindow;\n                if (planWindow != null)\n                    PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow,\n                        operation);\n            }\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmExpandSelected_Click(object sender, EventArgs e)\n        {\n            treeView.SelectedNode.Expand();\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmCollapseSelected_Click(object sender, EventArgs e)\n        {\n            treeView.SelectedNode.Collapse();\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand All.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmExpandAll_Click(object sender, EventArgs e)\n        {\n            treeView.ExpandAll();\n            m_allExpanded = true;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse All.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmCollapseAll_Click(object sender, EventArgs e)\n        {\n            treeView.CollapseAll();\n            m_allExpanded = false;\n        }\n\n        /// <summary>\n        /// Context menu > Show \"skill\" in browser | Show \"certificate class\" certificates.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInBrowserMenu_Click(object sender, EventArgs e)\n        {\n            // Return when nothing is selected\n            if (treeView.SelectedNode == null)\n                return;\n\n            var certLevel = treeView.SelectedNode.Tag as CertificateLevel;\n\n            // When a certificate is selected, we select its class in the left tree\n            if (certLevel != null)\n            {\n                // Open the certificate browser\n                PlanWindow.ShowPlanWindow(m_character, m_plan).ShowCertificateInBrowser(certLevel);\n            }\n            // When a skill is selected, we select it in the skill browser\n            else\n            {\n                var skill = (treeView.SelectedNode?.Tag as SkillLevel)?.Skill;\n\n                // Open the skill browser\n                if (skill != null)\n                    PlanWindow.ShowPlanWindow(m_character, m_plan).ShowSkillInBrowser(skill);\n            }\n        }\n\n        /// <summary>\n        /// Context menu > Show \"skill\" in explorer.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInExplorerMenu_Click(object sender, EventArgs e)\n        {\n            var skill = (treeView.SelectedNode?.Tag as SkillLevel)?.Skill;\n\n            // Open the skill explorer\n            if (skill != null)\n                SkillExplorerWindow.ShowSkillExplorerWindow(m_character, m_plan).\n                    ShowSkillInExplorer(skill);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/MasteryTreeDisplayControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"imageListCertLevels.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>233, 17</value>\n  </metadata>\n  <data name=\"imageListCertLevels.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACm\n        bAAAAk1TRnQBSQFMAgEBBgEAAdABAAHQAQABGAEAARgBAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFg\n        AwABMAMAAQEBAAEgBgABSBIAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFfAVoBVwHAAV0BWgFWAcEBXgFaAVcBwgFgAVsBWAHDAWABWwFYAcQBYQFbAVcBxwFl\n        AV4BWAHOAWUBXgFYAc4BYQFbAVcBxwFgAVsBWAHEAWABWwFYAcMBXQFaAVYBwQFfAVoBVwHAAV8BWgFX\n        AcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/wAABXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWgFWAcEBXwFb\n        AVYBwwFgAVsBVwHEAV4BWwFXAcQBXgFbAVcBxAFgAVsBVwHEAV8BWwFWAcMBXQFaAVYBwQFfAVoBVwHA\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWgFWAcEBYAFbAVgBwwFgAVwBVwHF\n        AWEBXAFXAccBYwFdAVkBygFmAV4BVwHRAZcBhAFZAfUBkAGAAWAB8QFmAV8BWAHRAWQBXgFYAcwBYQFb\n        AVcBxwFhAVsBWAHEAV4BWgFWAcIBXQFaAVYBwQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb/AAAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFd\n        AVkBVgHCAV8BWgFWAcUBXwFZAVYB0gFhAVgBUQHhAWIBWQFOAesBaAFhAUsB7wFpAWABSwHuAWIBWAFM\n        AekBXQFXAVAB3wFhAVkBVgHPAV4BWwFXAcQBXQFZAVYBwgFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWgFW\n        AcEBYAFbAVgBwwFgAVwBVgHGAWMBXQFZAcoBZQFeAVcB0AFnAV4BVgHYAWsBYQFSAeYBdAFmAVIB8QF1\n        AWcBTgHwAW8BYgFSAeYBZwFfAVYB2AFlAV4BVwHQAWMBXQFZAcoBYAFcAVYBxgFgAVsBWAHDAV0BWgFW\n        AcEBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBv8AAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXwFaAVcBwAFdAVkBVgHCAWABWgFXAc0BXAFTAUgB6gFTAUgBMgH7AVIBUQE+AfQBfgFt\n        AVEB9QGwAZkBaAH+Aa0BlgFnAf4BaAFcAUkB8gFYAUsBQAH1AVABRwE8AfkBXwFVAUwB5AFgAVoBVwHK\n        AV0BWgFWAcEBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFa\n        AVcBwAFfAVoBVwHAAV4BWgFWAcIBYQFbAVgBxAFgAVwBVgHGAWQBXgFYAcsBZQFeAVUB2QFdAVQBQwHw\n        AVsBUQE9AfoBfwFzAUsB/gGoAZEBWwH/AacBkAFaAf8BfgFuAUkB/gFgAVMBQAH6AWYBXAFKAe0BaQFg\n        AVgB1AFkAV4BWAHLAWEBXAFXAccBYAFbAVgBwwFeAVoBVgHCAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/\n        wAABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWwFWAcMBXAFWAU0B5wFf\n        AVUBSwHrAV8BWAFSAdkBYAFbAVcByAFtAWIBWQHaAYcBeQFeAewBgQF2AVwB6gFkAV0BWAHSAWABWwFX\n        AcgBYQFYAVEB3AFaAU4BQgHwAWEBWAFPAeYBXQFZAVYBwgFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFdAVoBVgHBAV4BWgFXAcIBYAFcAVcBxQFjAV0BWAHIAWQBXgFY\n        AcwBaAFgAVcB0AFmAV8BUQHjAWQBWAFIAe8BaQFdAU0B6gF/AXABVQHvAaUBjQFaAfoBpAGMAVkB+gF9\n        AW4BVAHvAWsBYAFPAe0BZwFbAUUB8AFqAV8BVgHbAWgBYAFXAdABZAFeAVgBzAFjAV4BWQHIAWEBWwFY\n        AcQBXgFaAVYBwgFfAVoBVwHAAV4BWQFXAb/AAAFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFdAVoBVgHB\n        AV0BWQFWAcIBXwFbAVYBwwFgAVoBVwHKAV8BWwFVAcYBXQFZAVYBwgFdAVoBVgHBAV0BWQFWAcIBXwFb\n        AVYBwwFfAVsBVgHDAV0BWQFWAcIBXQFaAVYBwQFfAVsBVgHDAV8BXAFWAckBYgFcAVYByQFfAVsBVgHD\n        AV0BWQFWAcIBXQFaAVYBwQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV4BWgFXAcIBYAFc\n        AVcBxQFjAV0BVwHKAWcBXgFWAdUBZAFZAUwB7AFoAWEBVwHaAWwBYgFZAdUBbQFiAVcB1gFtAWMBWAHY\n        AW4BZQFXAd8BeQFsAVcB5QF5AWwBVwHlAXMBaQFZAeABcAFkAVgB2wFsAWEBWAHYAW0BYgFXAdYBaAFg\n        AVQB3gFjAVgBTgHpAWQBXQFYAdIBYwFeAVgByQFgAVwBVwHFAV4BWgFWAcIBXwFaAVcBwMAAAV4BWQFX\n        Ab8BXwFaAVcBwAFdAVkBVgHCAWEBWQFWAc8BYQFXAVAB4gFfAVoBVwHFAV0BWgFWAcEBXQFaAVYBwQFd\n        AVoBVgHBAV8BWgFXAcABXwFaAVcBwAFeAVkBVwG/AV8BWgFXAcABXQFaAVYBwQFfAVoBVwHAAV8BWgFX\n        AcABXwFaAVcBwAFdAVoBVgHBAWABXAFXAcoBXgFXAU8B5QFgAVoBVwHKAV0BWQFWAcIBXgFZAVcBvwFe\n        AVkBVwG/AV0BWgFWAcEBYAFcAVcBxQFjAV0BWQHKAWcBXgFXAdMBYwFYAUkB7wFhAVIBPAH3AWoBYwFW\n        AdsBbQFjAVkB1AFtAWMBWQHUAWwBYwFZAdUBawFjAVYB2QFwAWQBVwHbAXABZAFYAdsBawFjAVYB2QFu\n        AWMBWQHXAWwBYwFZAdUBbQFjAVcB1gFrAWIBVAHdAVwBWAE9AfgBZwFeAVMB5QFmAV8BWAHRAWMBXgFY\n        AckBYAFbAVgBxAFdAVoBVgHBwAABXgFZAVcBvwFdAVoBVgHBAV8BWgFWAcUBXwFXAU0B6AFeAVcBTwHl\n        AV8BWgFXAcUBXQFaAVYBwQFlAV4BWQHJAWoBZAFeAdABYQFcAVgBxwFfAVoBVwHAAV0BWgFWAcEBYQFb\n        AVcBxwFrAWYBXgHRAWEBWwFXAccBXQFaAVYBwQFeAVkBVwG/AV8BWgFXAcABXwFcAVYByQFaAU4BQgHw\n        AV8BVQFMAeQBXgFbAVcBxAFfAVoBVwHAAV4BWQFXAb8BYAFbAVcBxAFmAV8BWAHRAWkBYQFZAdUBaQFg\n        AVMB4wFiAVwBPgH4AW4BZQFUAeUBbAFhAVgB2AFtAWMBWQHUAW0BYwFZAdQBbQFiAVcB1gFtAWEBWAHa\n        AXEBaAFbAeEBcwFmAVoB4AFtAWIBWQHaAW0BYgFXAdYBbAFjAVkB1QFtAWQBWAHWAW4BZAFZAdoBagFe\n        AU8B6gFrAVkBRgH3AWkBYQFWAd8BZwFeAVcB0wFjAV0BVwHKAV4BWQFWAcLAAAFeAVkBVwG/AV0BWQFW\n        AcIBXgFZAVYB0gFYAUsBQAH1AWABWAFUAdEBXQFZAVYBwgFdAVkBVgHCAXkBcQFoAd0B0gHFAbEB+AFx\n        AWsBYQHYAV0BWQFWAcIBYAFbAVcBxAF+AXgBawHgAdoB0AGyAfoBgQF3AW0B4QFgAVsBVwHEAV8BWgFX\n        AcABXgFZAVcBvwFfAVsBVgHDAWEBWAFRAdwBUAFHATwB+QFhAVkBVgHPAV0BWgFWAcEBXgFZAVcBvwFj\n        AV0BWAHLAY0BfAFdAfABdwFrAVUB5wF7AWwBSwH1AZkBhgFaAfsBewFtAVYB6QFuAWMBVwHZAWwBYwFZ\n        AdUBbAFjAVkB1QFoAWEBVwHaAXkBbgFfAegBywG9AakB+QG+AbEBmwH3AW8BZQFYAeMBbQFiAVkB2gFt\n        AWQBWAHWAW4BYwFZAdcBcQFmAVcB3AF/AXABWAHsAaMBjQFUAf0BcgFmAUwB8wF7AW4BVQHqAXYBawFY\n        AeMBYAFbAVYBxsAAAV8BWgFXAcABXgFbAVcBxAFeAVcBTgHlAV0BUgFHAe0BXgFaAVUBxgFfAVoBVwHA\n        AV8BWwFWAcMBfgF4AWsB4AHtAeEBwQH9AXUBcAFkAdsBXgFbAVcBxAFeAVkBVgHHAbcBrgGZAfQB8wHn\n        AckB/gHOAcIBqwH4AWABWwFYAcgBXQFaAVYBwQFeAVkBVwG/AV0BWgFWAcEBYAFbAVcByAFYAUoBQAH1\n        AV0BVwFQAd8BXwFbAVYBwwFeAVkBVwG/AWMBXQFYAcsBfQFwAVcB6AFzAWUBVgHlAZQBgQFQAf0BuQGg\n        AWMB/wF7AW4BVQHqAW4BYwFXAdkBbAFjAVkB1QFqAWEBWQHXAWcBXwFTAeABogGWAYIB9AH4AewBzQH/\n        Ae0B4QHDAf4BfwFyAWEB7QFoAWABVAHeAWwBYgFYAdgBbgFjAVkB1wFxAWUBWAHdAYMBcgFYAe0BuQGg\n        AWMB/wGQAXkBTwH9AXYBaAFUAekBewFvAVgB5gFhAVsBVwHHwAABXwFaAVcBwAFeAVsBVQHGAV0BUQFD\n        AfABaQFfAU8B7QFiAVwBVwHMAV0BWgFWAcEBXwFbAVYBwwF/AXgBbAHgAe0B4QHCAf0BdgFtAWUB3AFe\n        AVoBVQHGAWYBXwFYAdEB4gHVAb4B/AG2AasBlwH1AfEB5QHHAf4BbQFlAV8B1AFdAVkBVgHCAV4BWQFX\n        Ab8BXQFZAVYBwgFkAV0BWAHSAWkBXAFJAfIBYgFYAUwB6QFgAVsBVwHEAV4BWQFXAb8BYQFbAVcBxwFk\n        AV0BWAHSAWwBYgFRAekBkwGBAVAB/QGdAYgBXAH4AXMBZgFXAeIBbgFjAVkB1wFtAWMBVwHWAW0BYgFX\n        AdoBawFhAVMB5gHKAbsBpQH6AcsBwAGrAf0B1AHIAbIB/QGgAZcBgwH1AWgBXwFRAeMBbQFiAVkB2gFu\n        AWMBWQHXAXABZgFZAdsBewFtAVYB5wGgAY0BXwH5AYoBfwFSAf4BbAFlAVQB5QFkAV8BWAHPAWABXAFX\n        AcXAAAFfAVoBVwHAAV4BWAFVAcYBbQFhAUoB9wGyAZ0BYAH9AWsBYwFXAdkBXQFZAVYBwgFfAVsBVgHD\n        AX8BeAFsAeAB7QHhAcIB/QF2AW0BYgHcAV4BWwFXAcgBkgGJAXsB6QHLAcEBqQH4AW0BZgFgAd4B4QHU\n        Ab0B/AGTAYkBfAHpAV4BWwFXAcQBXwFaAVcBwAFfAVsBVgHDAYEBdgFcAeoBrQGWAWcB/gFpAWABSwHu\n        AV4BWwFXAcQBXgFZAVcBvwFgAVwBVgHGAWUBYAFYAc8BaAFfAU4B6wFjAV8BRwH2AXIBZwFYAeEBbgFj\n        AVcB2QFsAWMBWQHVAW0BYgFXAdYBaQFfAVQB3QF7AW4BXgHsAe8B4gHDAf4BcQFtAVQB9wGOAYgBagH5\n        AeQB1wG9Af0BbAFjAVIB6AFsAWEBVQHcAW4BYwFZAdcBbgFkAVkB1wFwAWUBWAHdAXQBZwFUAeQBYAFb\n        AToB+wFoAWEBUQHmAWQBXAFYAc0BYAFcAVcBxcAAAV8BWgFXAcABXgFZAVYBxwFtAWMBSwH3AbEBmQFp\n        Af4BbQFkAVkB2gFdAVkBVgHCAV8BWwFWAcMBfwF4AWwB4AHtAeEBwgH9AXUBbwFkAd0BYAFaAVcBzQHZ\n        AdABsgH6Aa0BpAGSAfEBXAFYAVQBzQG0AasBlQHzAb0BsQGcAfQBYgFcAVgByQFfAVoBVwHAAV8BWwFW\n        AcMBhwF5AV4B7AGwAZkBaAH+AWgBYQFLAe8BXgFbAVcBxAFeAVkBVwG/AWABXAFXAcUBYgFcAVgBzAFj\n        AVkBSgHqAV8BWwFEAfMBawFhAVYB2AFtAWMBWQHUAW0BYwFZAdQBagFhAVkB1wFlAVwBUQHfAZ8BkgF9\n        AfQB2AHLAbQB/QFfAVMBQgHxAWkBZAFRAfQB6gHeAb8B/gGQAYQBcAHxAWgBYAFUAd4BagFjAVkB1wFu\n        AWMBWQHVAW4BYwFZAdcBbwFjAVcB2wFYAVABPQH6AWIBWgFQAeQBYwFdAVkBygFgAVsBWAHEwAABXwFa\n        AVcBwAFeAVoBVQHGAV8BVQFHAfMBfgFuAVMB8QFlAV4BVwHQAV0BWgFWAcEBXwFbAVYBwwF/AXgBbAHg\n        Ae0B4QHCAf0BdQFsAWQB3QFpAWIBWwHWAeIB1gG+AfwBjQGFAXkB6AFdAVoBVgHKAY4BggF3AecB0AHD\n        AawB+AFoAWEBWQHPAV0BWgFWAcEBXQFZAVYBwgFtAWIBWQHaAX4BbQFRAfUBYgFZAU4B6wFgAVsBVwHE\n        AV4BWQFXAb8BYQFbAVgBxAFjAV4BWAHJAWIBXAFRAd8BaAFeAU4B6wFqAWMBWQHUAWoBYgFZAdMBagFf\n        AVcB0wFoAV8BVgHYAWUBXAFRAeABwQG3AZ4B+QG0AawBkAH5AWEBVAFGAe4BaQFdAU0B8AHRAcoBsAH8\n        AbkBrAGYAfgBZQFcAVEB3wFqAWEBWQHXAW0BYwFZAdQBbAFjAVkB1QFqAWEBWQHXAWEBWgFEAfABZQFf\n        AVUB3AFjAV0BWAHIAWABWwFYAcPAAAFfAVoBVwHAAV4BWwFXAcQBXAFVAUsB5wFaAVQBSQHsAV4BWgFV\n        AcYBXQFaAVYBwQFfAVsBVgHDAX8BeAFsAeAB7QHhAcEB/QF1AWwBZAHdAXEBagFhAdsB6wHeAcAB/QGA\n        AXkBbQHiAV4BWwFXAcgBfgF2AWoB4QHYAc8BsAH6AWkBZAFdAdIBXQFZAVYBwgFdAVoBVgHBAWABWwFX\n        AcgBUgFRAT4B9AFhAVgBUQHhAV8BWwFWAcMBXgFZAVcBvwFgAVsBWAHDAWEBWwFXAccBZgFeAVgBzgFn\n        AV4BVwHTAWoBXwFXAdMBaQFhAVkB0gFsAWMBWQHUAWcBXwFWAdgBZAFbAVEB4AHTAcoBrQH7AaYBmAGB\n        AfYBZgFYAU0B6AFnAVwBUAHqAcwBvwGmAfoBzwHCAakB+gFlAVwBUQHfAWoBYQFZAdcBbAFjAVkB1QFt\n        AWMBWQHUAWwBYwFZAdUBaQFgAVgB1AFkAVwBWAHNAWABXAFWAcYBXgFaAVYBwsAAAV4BWQFXAb8BXwFb\n        AVYBwwFhAVoBVQHVAVEBSQE5AfYBYAFbAVYB0AFdAVkBVgHCAV0BWQFWAcIBegFzAWgB3gHiAdUBvQH8\n        AXUBbwFkAdsBbwFpAWAB2QHcAdMBugH7AXwBdQFpAd8BXgFaAVUBxgF6AXIBaAHeAdUBygGxAfkBagFk\n        AV0B0gFdAVoBVgHBAV0BWQFWAcIBXwFYAVIB2QFTAUgBMgH7AV8BWQFWAdIBXQFaAVYBwQFeAVkBVwG/\n        AV4BWgFWAcIBYAFcAVcBxQFjAV0BWQHKAWYBXwFWAdcBaAFhAVUB3AFrAWIBVwHWAW0BYgFXAdYBaQFf\n        AVYB2QFkAVsBUgHeAdABxAGpAfoBoAGVAYMB8gFoAV8BUwHhAWkBYQFTAeQBwQG5AZ0B+AHKAbwBqAH5\n        AWcBXgFSAd0BaQFgAVYB2QFqAWMBWQHXAWwBYQFWAdgBawFgAVQB4AFpAWABWAHUAWMBXQFZAcoBYQFb\n        AVgBxAFdAVoBVgHBwAABXgFZAVcBvwFdAVoBVgHBAV4BWgFVAcYBXQFSAUcB7QFgAVgBUgHeAWABWwFX\n        AcQBXQFaAVYBwQFpAWQBXAHPAXsBdQFrAd0BZwFfAVwBzgFkAV8BWQHMAXsBdQFrAd0BaQFkAVwBzwFf\n        AVsBVgHDAWgBYwFcAc8BewFzAWgB2wFlAV4BWQHJAV0BWgFWAcEBXwFbAVUBxgFcAVMBSgHqAVwBUwFI\n        AeoBXwFaAVYBxQFfAVoBVwHAAV4BWQFXAb8BXQFaAVYBwQFgAVsBWAHEAWMBXgFYAckBZgFdAVMB4QFl\n        AVIBQAH0AW4BZAFXAeABcAFkAVcB3QFsAWMBVwHdAWgBYQFVAdwBfAFzAWUB5QF2AWkBXAHhAWgBYQFX\n        AdoBagFhAVYB3AF6AW8BYQHkAXkBcwFlAeUBawFiAVQB3QFtAWQBVQHeAXABZQFVAd4BawFhAVMB5AFg\n        AVIBPAH3AWYBXwFVAdsBYwFeAVgByQFgAVsBWAHDAV0BWgFWAcHAAAFeAVkBVwG/AV8BWgFXAcABXQFZ\n        AVYBwgFfAVoBVQHTAWABVgFNAeQBXwFaAVcBxQFdAVoBVgHBAV0BWgFWAcEBXQFaAVYBwQFdAVoBVgHB\n        AV0BWgFWAcEBXQFaAVYBwQFdAVoBVgHBAV8BWgFXAcABXQFaAVYBwQFdAVoBVgHBAV0BWgFWAcEBXQFa\n        AVYBwQFgAVoBVwHKAV8BVwFNAegBYAFaAVcBzQFdAVkBVgHCAV4BWQFXAb8BXgFZAVcBvwFdAVoBVgHB\n        AWABWwFYAcQBYwFdAVgByAFnAV0BVgHTAWcBWQFHAfIBbAFaAUIB9QGJAXcBVQHxAYEBcgFUAe4BcQFk\n        AVYB4QFpAWABVgHZAWkBYgFXAdYBbAFiAVkB1QFsAWIBWQHVAWoBYQFZAdcBagFjAVYB2wFwAWUBVgHj\n        AYsBfAFYAfEBigF6AVkB8gFjAV8BRwH2AWgBXQFOAekBZQFeAVcB0AFhAVwBVwHHAWABWwFYAcMBXwFa\n        AVcBwMAAAV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWQFWAcIBXwFbAVYBwwFfAVsBVgHDAV8BWgFX\n        AcUBYAFbAVcBxAFdAVkBVgHCAV0BWgFWAcEBXQFaAVYBwQFdAVkBVgHCAV0BWQFWAcIBXQFaAVYBwQFf\n        AVoBVwHAAV0BWQFWAcIBXwFaAVcBxQFfAVoBVwHFAV8BWwFWAcMBXwFbAVYBwwFdAVkBVgHCAV8BWgFX\n        AcABXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABYAFbAVgBwwFgAVwBVgHGAWQBXAFXAc0BaQFgAVQB3wFq\n        AWYBQwH5AbIBmgFgAf8BuAGgAWIB/wGGAXYBWQHwAW0BYwFZAdoBbQFjAVkB1AFqAV8BVwHTAWoBXwFX\n        AdMBbQFiAVcB1gFtAWUBVgHcAYsBewFYAfEBuAGfAWIB/wGuAZYBZAH+AW8BYAFFAfUBZwFfAVYB2AFj\n        AV0BWAHLAWABXAFXAcUBXQFaAVYBwQFfAVoBVwHAwAABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFa\n        AVcBwAFfAVoBVwHAAV8BWwFWAcMBXwFYAU4B4wFgAVgBUgHeAWABWwFWAdABXgFaAVUBxgFlAV4BVwHQ\n        AW0BZAFZAdoBawFjAVcB2QFiAVwBVwHMAV4BWgFVAcYBYAFYAVQB0QFeAVcBTwHlAWEBWgFRAeEBXQFZ\n        AVYBwgFfAVoBVwHAAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFdAVoBVgHB\n        AWABXAFXAcUBYwFdAVcBygFpAWEBVwHVAXIBZgFVAegBhQFtAVEB9wGeAYgBXAH+AXsBaQFPAfIBbQFh\n        AVQB4QFqAWEBWQHXAWoBXwFXAdMBbAFjAVkB1AFtAWIBWQHaAWsBYQFTAeQBfgFtAVIB9AGjAY0BVAH9\n        AXsBaAFJAfYBbQFkAVUB4wFlAV4BVwHQAWMBXQFYAcgBYAFbAVgBxAFdAVoBVgHBAV8BWgFXAcDAAAFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXQFZAVYBwgFgAVwBVQHUAV0BUgFH\n        Ae0BUQFJATkB9gFaAVQBSQHsAX4BbgFTAfEBsQGZAWkB/gGyAZ0BYAH9AWoBYQFMAe4BWgFUAUYB7gFY\n        AUsBQAH1AV8BVwFNAegBYAFbAVYB0AFdAVkBVgHCAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXgFaAVYBwgFgAVwBVgHGAXABZQFYAd0BngGLAVwB+AF3\n        AWoBVAHpAW0BYwFQAeoBZAFZAUIB9QFgAVABQQH5AWMBWQFJAe4BawFiAVkB1QFpAV8BVgHZAV8BWQFB\n        AfMBYQFQAUEB+QFmAVkBQgH0AW8BZAFTAecBggFyAVQB7gGQAYABYAHxAWgBYAFYAc8BYAFcAVcBxQFe\n        AVoBVgHCAV8BWgFXAcABXgFZAVcBv8AAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFfAVoBVwHAAV8BWwFWAcMBXgFaAVUBxgFhAVoBVQHVAVwBVQFLAecBXwFVAUcB8wFtAWMBSwH3\n        AW0BYQFKAfcBYAFTAUYB8QFeAVcBTgHlAV4BWQFWAdIBXwFaAVYBxQFdAVkBVgHCAV8BWgFXAcABXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHA\n        AWABWwFYAcMBYwFdAVcBygF8AW8BWAHmAWgBYAFXAdYBZgFfAVgB0QFnAV4BVwHTAWUBXgFVAdkBZgFf\n        AVQB4AFmAV8BVwHRAWkBYAFYAdQBZQFdAVAB4gFmAV8BVgHXAWkBYAFYAdQBZgFfAVcB0QFzAWkBWAHi\n        AXMBaQFaAeABYAFbAVYBxgFeAVoBVgHCAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/wAABXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFdAVoBVgHBAV8BWwFW\n        AcMBXgFbAVcBxAFeAVoBVQHGAV4BWQFWAccBXgFZAVYBxwFeAVsBVQHGAV4BWwFXAcQBXQFZAVYBwgFd\n        AVoBVgHBAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXQFaAVYBwQFgAVsBWAHDAWABWgFXAcUBYQFbAVcBxwFj\n        AV0BWAHIAWMBXgFYAckBYwFdAVcBygFjAV0BVwHKAWMBXgFYAckBYwFeAVgByQFjAV0BVwHKAWMBXQFZ\n        AcoBYwFeAVgByQFjAV0BWAHIAWEBWwFWAccBYAFaAVcBxQFeAVoBVgHCAV8BWgFXAcABXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb/AAAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWgFXAcABXwFaAVcBwAFfAVoBVwHA\n        AV8BWgFXAcABXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV8BWgFXAcABXQFaAVYBwQFeAVoBVgHCAWABWwFYAcMBYQFbAVgBxAFgAVsBWAHEAWABWwFYAcQBYAFb\n        AVgBxAFgAVsBWAHEAWEBWwFYAcQBYQFbAVgBxAFgAVsBWAHEAWABWwFYAcMBXgFaAVcBwgFdAVoBVgHB\n        AV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBv8AAAV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWgFXAcABXwFbAVYBwQFfAVsBVgHBAWABWgFX\n        AcIBYwFbAVgBwwFjAVsBWAHDAWMBWwFYAcMBYAFbAVgBwwFgAVoBVwHCAV8BWwFWAcEBXwFbAVYBwQFf\n        AVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABYAFaAVcBwgFhAVsBWAHEAWMBXQFXAcUBYwFdAVcBxQFj\n        AVwBWAHGAWMBXAFYAcYBYwFdAVcBxQFjAV0BVwHFAWMBWwFYAcMBXwFbAVYBwQFfAVoBVwHAAV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFdAVoBVgHBAV8BWwFW\n        AcMBYAFbAVcBxAFfAVoBVgHFAV4BWwFXAcQBYAFbAVcBxAFfAVsBVgHDAV0BWgFWAcEBXwFaAVcBwAFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFd\n        AVoBVgHBAV8BWwFWAcMBYAFbAVcBxAFfAVoBVgHFAV4BWwFXAcQBYAFbAVcBxAFfAVsBVgHDAV0BWgFW\n        AcEBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXwFaAVcBwAFdAVoBVgHBAV8BWwFWAcMBYAFbAVcBxAFfAVoBVgHFAV4BWwFXAcQBYAFbAVcBxAFf\n        AVsBVgHDAV0BWgFWAcEBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFs\n        AWUBVAHlAWsBYwFXAeABYQFbAVgBxAFhAVsBWAHEAWQBXgFZAcgBZgFeAVYB1wFlAV8BVQHcAWYBYAFV\n        AdwBaAFgAVgB1AFjAVwBWAHGAWMBWwFYAcMBYwFeAVgByQFtAWQBTwHsAWYBXwFWAdsBXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFfAVoBVwHAAV0BWQFWAcIBXwFaAVYBxQFfAVkBVgHSAWEBVwFPAeIBYwFZAU4B6wFo\n        AWABSwHvAWYBXAFLAe8BYgFYAUwB6QFfAVoBUQHgAWABWwFWAdABXgFbAVcBxAFdAVkBVgHCAV8BWgFX\n        AcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWQFWAcIBXwFaAVYBxQFfAVkBVgHSAWEBVwFP\n        AeIBYwFZAU4B6wFoAWABSwHvAWYBYAFLAe8BYgFYAUwB6QFfAVoBUQHgAWABWwFWAdABXwFaAVYBxQFd\n        AVkBVgHCAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWQFWAcIBXwFaAVYBxQFf\n        AVkBVgHSAWABWAFRAeEBYwFZAU4B6wFoAWABSwHvAWYBXAFLAe8BYQFYAUwB6QFfAVkBUQHgAWABWwFW\n        AdABXgFbAVcBxAFdAVkBVgHCAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFfAVoBVwHAAWABXAFXAcUBbAFiAVEB6QFqAWIBVQHiAXQBZwFF\n        Af4BbwFkAU0B8QFaAVYBRwHvAUMBPgEuAfwBSwFDATIB+wFNAUcBMgH6AU0BRwEyAfoBSQFCATEB+wFD\n        AT4BLgH8AV0BWQFFAfABcAFfAUcB+gFtAWEBQgH9AWsBYwFXAeABawFiAVcB4AFdAVoBVgHBAV8BWgFX\n        AcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXQFaAVYBwQFg\n        AVsBVwHEAWEBWQFWAc8BXgFVAUsB6wFRAUgBMgH7AVUBTAE/AfMBgQFuAVQB9QGxAZkBaAH+Aa8BmwFf\n        Af0BZwFgAUkB8QFXAUoBPwH1AU8BRwE9AfkBWgFVAUwB5AFeAVgBVwHLAV8BWwFWAcMBXwFaAVcBwAFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXQFaAVYBwQFeAVsBVwHEAWEBWQFWAc8BWgFUAUkB7AFSAUkBMgH7AVkBTAE+AfMBgQFuAVQB9QGx\n        AZkBaAH+Aa0BlgFnAf4BaAFdAUkB8gFSAVEBPwH0AVABTQE5AfoBXgFXAU4B5QFfAVkBVgHMAWABWwFX\n        AcQBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXQFaAVYBwQFgAVsBVwHEAV8BWgFVAc4BXQFVAUoB6wFRAUgBMgH7AVIBUQE+\n        AfQBgQFuAVQB9QGxAZkBaAH+Aa8BmwFfAf0BaQFgAUkB8QFYAUoBQAH1AU8BRwE9AfkBWwFUAUwB5AFe\n        AVgBVwHLAV8BWwFWAcMBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFX\n        AcABXwFbAVYBwQFfAVoBVgHBAWMBXQFZAcgBbwFgAUwB8wFwAWQBUQHsAXABZAFRAewBbwFhAUwB8wFm\n        AV4BTgHsAWQBXwFVAdsBZAFeAVkBzAFkAV4BWQHIAWQBXgFZAcgBZgFfAVgB0QFlAVwBVQHcAWkBXwFP\n        Ae0BbgFgAUYB9QFuAWIBVAHkAW4BYgFIAfYBagFhAVUB4QFeAVoBVwHCAV8BWwFWAcEBXwFaAVcBwAFf\n        AVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV0BWgFWAcEBXwFaAVcBxQFgAVkBUwHXAVkBTwFD\n        AfIBXAFTAUoB6gFfAVoBVQHYAWABWwFXAcgBcAFkAVkB2wGHAXkBXQHsAYEBdAFcAeoBYwFeAVcB0QFg\n        AVsBVwHIAV8BWgFUAdsBWgFOAUIB8AFXAVMBRAHxAWABWwFVAdQBYAFbAVcBxAFfAVoBVwHAAV4BWQFX\n        Ab8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV0BWgFWAcEBXwFbAVUBxgFf\n        AVoBVAHYAVkBTAE/AfMBXAFTAUoB6gFfAVoBVAHYAWABWwFXAcgBcAFkAVkB2wGHAXkBXQHsAYEBdgFc\n        AeoBZAFdAVgB0gFgAVsBVwHIAWEBWgFUAdoBWAFPAUUB7wFZAU8BRAHyAWEBWgFVAdUBXgFbAVcBxAFf\n        AVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV0BWgFW\n        AcEBXwFaAVcBxQFgAVkBUwHXAVkBTwFDAfIBXwFVAUsB6wFfAVgBUgHZAWABWwFXAcgBcAFkAVkB2wGH\n        AXkBXQHsAYEBdAFcAeoBYwFeAVcB0QFgAVsBVwHIAV8BWQFUAdsBWgFOAUIB8AFaAU4BQgHwAWABWwFV\n        AdQBXwFbAVYBwwFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFWAcEBYAFaAVcBwgFj\n        AVsBWAHDAWEBWwFYAcQBbgFkAVEB7AFwAWMBQAH/AWkBYQFZAdcBYwFdAVkBygFjAV0BVwHFAWMBXgFY\n        AcYBYwFeAVgBxgFjAV0BWAHGAWMBXQFYAcYBYwFeAVgBxgFjAV0BVwHFAWABXAFYAcYBYwFeAVgBywFp\n        AWEBVgHfAXIBZgFEAf4BZwFhAVkB1QFhAVsBWAHEAWMBWwFYAcMBXwFbAVYBwQFfAVoBVwHAAV4BWQFX\n        Ab8BXgFZAVcBvwFfAVoBVwHAAV8BWgFXAcUBYAFWAVIB3gFQAUkBOQH2AWEBWAFRAdwBYAFbAVgByAFd\n        AVkBVgHCAV0BWgFWAcEBXQFZAVYBwgFgAVsBVwHEAV8BWwFWAcMBXQFZAVYBwgFdAVoBVgHBAV8BWwFW\n        AcMBYAFbAVcBywFeAVcBUAHfAVkBTAE/AfMBYAFbAVUB1AFfAVsBVgHDAV8BWgFXAcABXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWgFXAcUBYQFYAVEB4QFRAUkBOQH2AV8BWQFT\n        AdsBXgFZAVYBxwFdAVkBVgHCAV0BWgFWAcEBXQFZAVYBwgFgAVsBVwHEAV8BWwFWAcMBXQFZAVYBwgFd\n        AVoBVgHBAV8BWwFWAcMBYAFaAVYBygFeAVgBUgHdAVMBUQE+AfQBYAFYAVUB1gFgAVsBVwHEAV8BWgFX\n        AcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWwFWAcMBYQFYAVIB3QFS\n        AVEBOQH3AWEBVwFRAdwBYAFbAVgByAFdAVkBVgHCAV0BWgFWAcEBXQFZAVYBwgFgAVsBVwHEAV8BWwFW\n        AcMBXQFZAVYBwgFdAVoBVgHBAV8BWwFWAcMBYAFbAVcBywFdAVcBTwHfAVIBUQE/AfQBXwFaAVUB0wFd\n        AVkBVgHCAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AWABWgFXAcIBYQFbAVgBxAFjAV4BWAHGAWQBXAFY\n        Ac0BZAFTAUEB9AFkAVgBSgHvAWEBWwFYAcQBYQFbAVgBxAFhAVsBWAHEAWMBWwFYAcMBYwFbAVgBwwFj\n        AVsBWAHDAWMBWwFYAcMBYwFbAVgBwwFjAVsBWAHDAWEBWwFYAcQBYwFdAVcBxQFhAVsBWAHEAWUBVAFB\n        AfQBYgFYAU4B6QFkAV4BWQHIAWMBXQFXAcUBYAFbAVgBwwFfAVoBVgHBAV4BWQFXAb8BXwFaAVcBwAFd\n        AVkBVgHCAV8BWAFUAdEBWAFKAUAB9QFfAVgBUgHZAV8BWgFWAcUBXQFaAVYBwQFeAVkBVwG/AV4BWQFX\n        Ab8BXwFaAVcBwAFdAVoBVgHBAV0BWgFWAcEBXwFaAVcBwAFeAVkBVwG/AV8BWgFXAcABXQFaAVYBwQFf\n        AVoBVgHFAV4BVwFQAd8BVwFTAUQB8QFeAVgBVwHLAV0BWQFWAcIBXgFZAVcBvwFeAVkBVwG/AV4BWQFX\n        Ab8BXwFaAVcBwAFdAVkBVgHCAV4BWgFTAdMBWQFKAUAB9QFfAVkBUwHXAV4BWwFXAcQBXQFaAVYBwQFf\n        AVoBVwHAAV0BWgFWAcEBXQFaAVYBwQFdAVoBVgHBAV0BWgFWAcEBXQFaAVYBwQFdAVoBVgHBAV8BWgFX\n        AcABXQFaAVYBwQFfAVoBVgHFAV4BWAFSAd0BWQFOAUQB8gFfAVkBVgHMAV0BWQFWAcIBXgFZAVcBvwFe\n        AVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAWABXQFXAcoBWgFTAUUB8QFfAVoBUwHbAV8BWgFW\n        AcUBXQFZAVYBwgFdAVoBVgHBAV0BWgFWAcEBXwFaAVcBwAFdAVoBVgHBAV0BWgFWAcEBXwFaAVcBwAFd\n        AVoBVgHBAV0BWgFWAcEBXQFZAVYBwgFfAVoBVgHFAV8BWgFRAeABXAFVAUwB5wFfAVoBVwHFAV8BWgFX\n        AcABXgFZAVcBvwFeAVkBVwG/AWABWwFYAcMBYwFdAVcBxQFhAVwBWAHHAWUBXgFRAeUBXwFYAUoB7AFk\n        AV4BWQHIAWMBXQFXAcUBYwFbAVkBwwFgAVoBVwHCAV8BWwFWAcEBXwFbAVYBwQFfAVsBVgHBAV8BWwFW\n        AcEBXwFbAVYBwQFfAVsBVgHBAWABWgFXAcIBYQFbAVgBxAFjAV4BWAHGAWQBXAFYAc0BWAFKAUEB9QFl\n        AV4BVAHeAWMBXgFYAcYBYQFbAVgBxAFgAVoBVwHCAV4BWQFXAb8BXQFaAVYBwQFfAVoBVgHFAV8BVgFN\n        AegBXgFXAU4B5QFeAVkBVgHHAV0BWgFWAcEBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXQFZAVYBwgFr\n        AWcBXgHTAWoBZAFeAdABXQFZAVYBwgFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFdAVoBVgHBAWABWwFX\n        AcsBWgFOAUIB8AFaAVUBTAHkAV4BWwFXAcQBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXQFaAVYBwQFe\n        AVsBVQHGAVoBVAFJAewBXwFYAU4B4wFeAVkBVgHHAV0BWgFWAcEBXwFaAVcBwAFdAVoBVgHBAWYBXwFZ\n        AcwBbgFpAWAB1AFfAVoBVwHFAWMBXQFZAcgBcAFrAWIB1QFjAV0BWgHKAV0BWgFWAcEBXwFaAVcBwAFd\n        AVoBVgHBAWABWgFWAcoBWQFTAUYB7gFbAVQBSgHpAV8BWgFWAcUBXwFaAVcBwAFeAVkBVwG/AV4BWQFX\n        Ab8BXwFaAVcBwAFdAVoBVgHBAV8BWwFWAcMBYAFbAVcBywFgAVsBVwHEAV0BWQFWAcIBYwFeAVkByAFr\n        AWcBXgHTAWQBXgFYAcsBYAFbAVcBxAFsAWQBXQHSAWoBZAFeAdABYAFbAVcBxAFkAWABWgHNAWsBZgFe\n        AdEBYAFcAVcBxQFdAVkBVgHCAV8BWgFXAcUBYAFbAVUBxgFdAVkBVgHCAV0BWgFWAcEBXwFaAVcBwAFe\n        AVkBVwG/AWEBWwFYAcQBYQFcAVgBxwFoAWABWQHPAVIBUAE5AfcBaAFgAVgB1AFhAVwBWAHHAWEBWwFY\n        AcQBYAFaAVcBwgFfAVoBVwHAAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFf\n        AVoBVwHAAV8BWwFWAcEBYwFbAVgBwwFjAV0BVwHFAWQBXgFYAccBZQFfAVQB4AFNAUoBMwH6AWQBXQFY\n        Ac0BYwFdAVcBxQFjAVsBWQHDAV4BWQFXAb8BXQFZAVYBwgFfAVkBVgHSAVIBSQE7AfYBYAFbAVYB0AFd\n        AVkBVgHCAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXgFbAVUBxgHSAcQBsAH4AakBnwGP\n        Ae8BYAFbAVcBxAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWwFWAcMBXwFaAVQB2wFP\n        AUcBPQH5AWABWwFWAdABXQFaAVYBwQFeAVkBVwG/AV4BWQFXAb8BXwFbAVYBwwFgAVkBUwHXAVgBSwFA\n        AfUBXwFbAVUBzgFdAVkBVgHCAV4BWQFXAb8BXwFaAVcBwAFfAVsBVgHDAX8BeAFsAeABywHBAagB9wFg\n        AVwBVwHNAWoBZQFcAdQB2gHQAbMB+gFzAW0BYgHaAV8BWwFWAcMBXgFZAVcBvwFfAVoBVwHAAV0BWQFW\n        AcIBYAFZAVMB1wFPAUwBOAH6AV4BWgFTAdMBXQFZAVYBwgFeAVkBVwG/AV4BWQFXAb8BXQFaAVYBwQFg\n        AVsBVwHLAWABWgFXAc0BXQFZAVYBwgFfAVoBVwHAAV0BWQFWAcIBcAFpAWEC1wHMAbMB+QGBAXsBbgHh\n        AV8BWQFWAckBywHDAasB9wGoAZ8BjQHvAV4BWwFXAcgBkAGHAXgB5wG/AbYBnwH1AWQBYAFaAc0BXQFa\n        AVYBwQFfAVoBVwHAAV0BWQFWAcIBYgFaAVUB1QFgAVwBVwHKAV0BWgFWAcEBXgFZAVcBvwFjAV0BVwHF\n        AWEBXAFYAccBYwFXAU8B6AFZAVMBRQHxAWYBXwFZAckBYwFeAVgBxgFhAVsBWAHEAV8BWwFWAcEBXwFa\n        AVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHA\n        AWABWgFXAcIBYQFbAVgBxAFhAVwBWAHHAWQBXgFYAcsBTQFKATMB+gFlAV8BVAHgAWMBXgFYAcYBYQFb\n        AVgBxAFfAVoBVwHAAV4BWwFXAcQBYQFYAU0B5gFdAVIBRwHtAV8BWgFWAcUBXwFaAVcBwAFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV4BWQFWAccB2wHRAbUB+gG0AasBmAHyAV8BWgFWAcUBXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFdAVoBVgHBAV4BWQFWAccBWQFKAUEB9QFfAVoBUQHg\n        AV8BWwFWAcMBXgFZAVcBvwFfAVoBVwHAAV4BWwFXAcQBWwFUAUoB6QFcAVMBSgHqAV4BWwFXAcQBXwFa\n        AVcBwAFeAVkBVwG/AV8BWgFXAcABXgFbAVcBxAGAAXkBbQHiAdUBygGxAfkBYQFcAVgBzwFpAWQBWwHW\n        AeEB1QG9AfwBdAFtAWIB3AFfAVsBVgHDAV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV4BWgFVAcYBWAFT\n        AUQB8QFfAVgBTgHjAV8BWwFWAcMBXgFZAVcBvwFfAVoBVwHAAV8BWwFWAcMBXwFVAUwB5AFgAVYBSwHr\n        AV0BWQFWAcIBXgFZAVcBvwFdAVkBVgHCAXIBaQFgAdkB6wHfAcAB/QGDAXoBcAHkAV4BWAFUAcsB2wHT\n        AboB+wGzAasBlgHyAV4BWAFUAcsBkAGHAXsB6gHQAcMBrAH4AWgBYQFZAc8BXQFaAVYBwQFfAVoBVwHA\n        AV4BWwFXAcQBWQFMAUAB9QFfAVcBUAHfAV0BWQFWAcIBXgFZAVcBvwFjAV0BVwHFAWEBXAFYAccBWAFK\n        AUAB9QFlAV4BUQHlAWEBXAFYAccBYwFdAVcBxQFgAVoBVwHCAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWwFWAcEBYwFb\n        AVgBwwFjAV4BWAHGAWQBXgFZAcgBXQFWAUoB7QFgAVcBTQHrAWQBXgFYAcYBYQFbAVgBxAFfAVoBVwHA\n        AV8BWgFWAcUBWgFOAUIB8AFfAVgBTgHjAWABWwFXAcQBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFfAVoBVwHAAV4BWQFWAccB2wHRAbUB+gG0AasBmAHyAV8BWgFWAcUBXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWgFWAcUBWwFUAUoB6QFfAVcBTQHoAV8BWwFWAcMBXgFZ\n        AVcBvwFfAVoBVwHAAV8BWwFWAcMBXAFWAUoB7AFhAVgBUgHcAV0BWQFWAcIBXgFZAVcBvwFeAVkBVwG/\n        AV8BWgFXAcABXgFbAVcBxAGAAXkBbQHiAdUBygGxAfkBYQFcAVgBzwFpAWMBWwHWAeEB1QG9AfwBcwFs\n        AWIB3AFgAVsBVwHEAV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAWABWwFXAcQBYQFXAVAB4gFeAVgBTwHl\n        AV0BWQFWAcIBXgFZAVcBvwFfAVoBVwHAAV8BWgFWAcUBWAFPAUQB7wFfAVUBTAHkAV8BWwFWAcMBXgFZ\n        AVcBvwFdAVkBVgHCAXIBaQFgAdkB6wHfAcAB/QGDAXoBcAHkAV4BWQFWAcwB2wHTAboB+wGzAasBlgHy\n        AV4BWAFUAcsBkAGHAXsB6gHQAcMBrAH4AWgBYAFbAdABXQFaAVYBwQFfAVoBVwHAAV8BWgFWAcUBXAFT\n        AUgB6gFfAVYBTQHoAV8BWwFWAcMBXgFZAVcBvwFjAV0BVwHFAWMBXgFYAcYBTQFHATIB+gFlAV4BVAHd\n        AWMBXgFYAcYBYQFbAVgBxAFgAVoBVwHCAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABYAFaAVcBwgFjAV0BVwHF\n        AWEBXAFYAccBZAFaAVEB4wFaAU4BQgHwAWMBXgFYAcYBYQFbAVgBxAFfAVoBVwHAAV4BWwFVAcYBWAFL\n        AUAB9QFeAVgBUgHdAV8BWwFWAcMBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHA\n        AV4BWQFWAccB2wHRAbUB+gG0AasBmAHyAV8BWgFWAcUBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFfAVoBVwHAAV8BWgFWAcUBXgFYAU4B4wFdAVIBRwHtAWABWwFXAcQBXgFZAVcBvwFeAVkBVwG/\n        AV0BWgFWAcEBYAFbAVcBywFgAVsBVQHGAV0BWgFWAcEBXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXgFb\n        AVcBxAGAAXkBbQHiAdUBygGxAfkBYQFcAVgBzwFpAWMBWwHWAeEB1QG9AfwBcwFsAWIB3AFgAVsBVwHE\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV0BWgFWAcEBXgFZAVYBxwFiAVwBVgHJAV0BWgFWAcEBXgFZ\n        AVcBvwFfAVoBVwHAAV4BWwFVAcYBWAFLAUAB9QFgAVYBUgHeAV8BWwFWAcMBXgFZAVcBvwFdAVkBVgHC\n        AXIBaQFgAdkB6wHfAcAB/QGDAXoBcAHkAV4BWQFWAcwB2wHTAboB+wGzAasBlgHyAV4BWAFUAcsBkAGH\n        AXsB6gHQAcMBrAH4AWgBYAFbAdABXQFaAVYBwQFfAVoBVwHAAV8BWgFWAcUBWwFVAUwB5AFdAVIBRwHt\n        AWABWwFXAcQBXgFZAVcBvwFhAVsBWAHEAWMBXQFXAcUBTQFMATgB+gFlAVwBUwHfAWMBXQFXAcUBYwFb\n        AVkBwwFfAVoBVgHBAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABYAFaAVcBwgFhAVsBWAHEAWMBXQFXAcUBZAFc\n        AVEB5wFcAU8BQwHwAWEBWwFYAcQBYwFbAVgBwwFfAVoBVwHAAV4BWwFVAcYBUgFJATsB9gFeAVgBUgHd\n        AV8BWwFWAcMBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV4BWQFWAccB2wHR\n        AbUB+gG0AasBmAHyAV8BWgFWAcUBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHA\n        AV4BWwFXAcQBXQFXAU8B4gFdAVIBRwHtAWABWwFXAcQBXgFZAVcBvwFeAVkBVwG/AV0BWgFWAcEBYAFb\n        AVUBxgFgAVsBVwHEAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXgFbAVcBxAGAAXkBbQHi\n        AdUBygGxAfkBYQFcAVgBzwFpAWMBWwHWAeEB1QG9AfwBcwFsAWIB3AFgAVsBVwHEAV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV0BWgFWAcEBYAFbAVcBxAFfAVoBVwHFAV0BWgFWAcEBXgFZAVcBvwFfAVoBVwHA\n        AV4BWwFVAcYBUgFJATsB9gFeAVgBUgHdAV8BWwFWAcMBXgFZAVcBvwFdAVkBVgHCAXIBaQFgAdkB6wHf\n        AcAB/QGDAXoBcAHkAV4BWQFWAcwB2wHTAboB+wGzAasBlgHyAV4BWAFUAcsBkAGHAXsB6gHQAcMBrAH4\n        AWgBYAFbAdABXQFaAVYBwQFfAVoBVwHAAV4BWwFXAcQBXQFXAU8B4gFdAVIBRwHtAV4BWwFXAcQBXgFZ\n        AVcBvwFgAVwBVwHFAWoBYQFXAdsBbgFhAT4B/AFnAWEBUwHkAWEBWwFYAcQBYwFbAVgBwwFfAVsBVgHB\n        AV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV8BWgFXAcABYAFaAVcBwgFhAVsBWAHEAWEBWwFYAcQBaAFdAU4B7QFqAWcBRAH5\n        AWkBYAFZAdcBYAFbAVgBwwFfAVoBVwHAAV8BWgFWAcUBWQFPAUMB8gFgAVgBUQHhAV8BWwFWAcMBXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV4BWQFWAccB2wHRAbUB+gG0AasBmAHy\n        AV8BWgFWAcUBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWgFWAcUBXAFV\n        AUwB5wFcAVMBSgHqAWABWwFXAcQBXgFZAVcBvwFfAVoBVwHAAV8BWwFWAcMBYAFVAUwB5wFhAVkBUwHX\n        AV0BWQFWAcIBXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXgFbAVcBxAGAAXkBbQHiAdUBygGxAfkBYQFc\n        AVgBzwFpAWMBWwHWAeEB1QG9AfwBcwFsAWIB3AFgAVsBVwHEAV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHA\n        AV8BWwFWAcMBXwFaAVQB2wFgAVoBUgHgAV0BWQFWAcIBXgFZAVcBvwFfAVoBVwHAAV8BWgFWAcUBWQFO\n        AUQB8gFhAVgBUQHhAV4BWwFXAcQBXwFaAVcBwAFdAVkBVgHCAXIBaQFgAdkB6wHfAcAB/QGDAXoBcAHk\n        AV4BWQFWAcwB2wHTAboB+wGzAasBlgHyAV4BWAFUAcsBkAGHAXsB6gHQAcMBrAH4AWgBYAFbAdABXQFa\n        AVYBwQFfAVoBVwHAAV4BWwFVAcYBXAFVAUwB5wFcAVMBSgHqAWABWwFXAcQBXgFZAVcBvwFqAWEBVQHh\n        AW4BYAFBAf0BcAFiAUwB8wFpAWABWQHUAWEBWwFYAcQBYQFbAVgBxAFgAVoBVwHCAV8BWgFXAcABXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHA\n        AV8BWwFWAcEBYAFaAVcBwgFhAVsBWAHEAWMBWwFZAcMBZwFgAVYB2AFtAWUBTgHwAWoBXwFEAfsBagFf\n        AVYB2wFfAVoBVwHAAV4BWwFXAcQBXAFVAUwB5wFeAVUBSwHrAV8BWgFWAcUBXwFaAVcBwAFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV4BWQFWAccB2wHRAbUB+gGyAagBlQHxAV8BWgFWAcUBXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFdAVoBVgHBAV4BWQFWAccBWQFMAT8B8wFhAVgBUQHh\n        AV8BWwFWAcMBXgFZAVcBvwFfAVoBVwHAAV4BWwFXAcQBXAFTAUoB6gFfAVYBTQHoAV4BWwFXAcQBXwFa\n        AVcBwAFeAVkBVwG/AV8BWgFXAcABYAFbAVcBxAGAAXkBbQHiAdUBygGxAfkBYgFcAVgBzgFrAWQBWwHW\n        AeEB1QG9AfwBdQFrAWMB2wFfAVsBVgHDAV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV4BWwFVAcYBWgFO\n        AUIB8AFgAVUBTQHkAV8BWwFWAcMBXgFZAVcBvwFfAVoBVwHAAV4BWwFXAcQBXwFWAU0B6AFZAVMBSQHs\n        AWQBXAFWAc8BYAFbAVcBxAFfAVsBVgHDAXIBaQFgAdkB6wHfAcAB/QGDAXoBcAHkAV4BWAFUAcsB2wHT\n        AboB+wGzAasBlgHyAV4BWAFUAcsBkAGHAXsB6gHQAcMBrAH4AWgBYQFZAc8BXwFbAVYBwwFgAVsBVgHG\n        AV8BXAFVAc4BWQFMAT4B8wFdAVcBTwHiAV8BWwFWAcMBXgFZAVcBvwFjAV0BWQHKAWoBYQFWAdwBbgFj\n        AVEB7gFtAWYBSwH3AWQBXAFYAc0BYwFdAVcBxQFhAVsBWAHEAWABWgFXAcIBXwFbAVYBwQFfAVoBVwHA\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVcBwAFfAVsBVgHBAWMBWwFYAcMBYQFb\n        AVgBxAFjAV0BVwHFAWcBXwFWAdgBbwFkAT4B/AFxAWQBUAHxAWgBYQFWAdwBYAFcAVcBxQFeAVkBVwG/\n        AV8BWwFWAcMBYQFaAVUB1QFRAUkBOwH2AWEBWQFWAc8BXQFZAVYBwgFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFfAVoBVwHAAV8BWgFWAcUB0gHHAbAB+AGrAZ8BkAHvAWABWwFXAcQBXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFdAVkBVgHCAV8BWgFVAdgBUQFIATIB+wFfAVkBVgHSAV0BWgFWAcEBXgFZ\n        AVcBvwFeAVkBVwG/AV8BWwFWAcMBYQFaAVQB2gFSAUkBOwH2AV0BWgFVAc0BXQFaAVYBwQFeAVkBVwG/\n        AV8BWgFXAcABXwFbAVYBwwF9AXUBaQHfAcQBuwGjAfYBYgFcAVgBzAFqAWIBXQHTAdcBzAGzAfkBcQFr\n        AWEB2AFdAVkBVgHCAV4BWQFXAb8BXgFZAVcBvwFdAVkBVgHCAWABWwFVAdQBUQFIATIB+wFgAVgBVQHW\n        AV0BWQFWAcIBXgFZAVcBvwFeAVkBVwG/AV8BWwFWAcMBYAFYAVUB1gFyAWIBRgH9AawBkAFiAfwBZgFd\n        AVcB0wFfAVoBVgHFAXABaQFhAdcB2wHTAboB+wGBAXkBbwHiAV8BWQFWAckB1gHLAbIB+QGtAaIBjwHw\n        AV4BWwFXAcgBkAGIAXsB5wHEAboBowH2AWcBXwFcAc4BXwFaAVYBxQFtAWMBWQHaAaIBlAFfAfsBbQFg\n        AUMB/gFeAVoBUwHTAV0BWQFWAcIBXgFZAVcBvwFjAV0BWQHKAW4BYwFMAe8BcAFkAVAB8QFuAV0BQwH4\n        AWYBXwFSAeMBYQFcAVgBxwFjAV4BWAHGAWEBWwFYAcQBYAFaAVcBwgFfAVsBVgHBAV8BWgFXAcABXwFa\n        AVcBwAFfAVoBVwHAAV8BWgFXAcABXwFbAVYBwQFjAVsBWAHDAWMBXQFXAcUBYwFdAVgBxgFjAV0BWQHK\n        AWQBXwFJAfEBagFlAUwB9AFsAWUBTgHwAWwBYwFRAeoBYAFbAVgBwwFeAVkBVwG/AV0BWgFWAcEBXgFa\n        AVUBxgFdAVIBRwHtAWABVgFSAd4BXwFaAVcBxQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV8BWwFWAcMBcwFqAWMB1wFuAWkBYAHUAV0BWQFWAcIBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXQFa\n        AVYBwQFgAVsBWAHIAVwBUwFIAeoBXgFVAUsB6wFfAVoBVgHFAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/\n        AV0BWgFWAcEBXgFZAVYBxwFaAU4BQgHwAWEBWAFSAdwBXwFaAVcBxQFfAVoBVwHAAV8BWgFXAcABXQFa\n        AVYBwQFkAV4BWAHLAWoBZAFdAdIBXwFaAVcBxQFhAVsBVwHHAWsBZwFeAdMBYwFeAVoByAFdAVoBVgHB\n        AV8BWgFXAcABXQFaAVYBwQFeAVkBVgHHAV8BVgFNAegBWAFPAUQB7wFeAVoBVQHGAV8BWgFXAcABXgFZ\n        AVcBvwFeAVkBVwG/AV0BWgFWAcEBXgFZAVYBxwFqAWMBSQHyAbUBngFkAf8BkAGAAWAB8QFeAVkBVgHH\n        AWQBXgFYAcsBeAFyAWgB2gFpAWQBXAHPAV4BWwFXAcQBdAFvAWUB2QFyAWkBYgHWAV4BWwFXAcQBagFk\n        AV0B0gFzAW0BYwHYAWMBXQFZAcgBXgFZAVYBxwGUAYIBXwHzAa4BmAFgAf8BYwFYAUoB7wFeAVoBVQHG\n        AV8BWgFXAcABXgFZAVcBvwFdAVoBVgHBAWABXAFWAcYBYwFeAVkByAFoAWABWAHUAVgBSgFAAfUBZQFf\n        AVQB3gFkAV4BWQHIAWEBXAFYAccBYwFdAVcBxQFjAVsBWAHDAWABWgFXAcIBXwFbAVYBwQFfAVsBVgHB\n        AWABWwFYAcMBYQFbAVgBxAFjAV4BWAHGAWQBXgFZAcgBZAFeAVkByAFkAVkBUQHjAVkBVQFGAe8BZAFc\n        AVgBzQFgAVwBVgHGAWABWwFYAcMBXwFaAVcBwAFeAVkBVwG/AV8BWgFXAcABXwFbAVYBwwFhAVoBVQHV\n        AVIBUQE+AfQBYAFYAVUB1gFeAVsBVwHEAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXQFa\n        AVYBwQFdAVoBVgHBAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV0BWgFWAcEBXwFaAVYBxQFhAVgBUQHc\n        AVkBTwFDAfIBYQFZAVYBzwFdAVkBVgHCAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFb\n        AVYBwwFgAVkBUwHXAVkBTAE/AfMBYAFbAVUB1AFgAVsBVwHEAV8BWgFXAcABXwFaAVcBwAFfAVoBVwHA\n        AV0BWgFWAcEBXwFaAVcBwAFfAVoBVwHAAV0BWgFWAcEBXwFaAVcBwAFfAVoBVwHAAV0BWgFWAcEBXgFb\n        AVcBxAFhAVoBVAHaAVkBTgFDAfIBYAFYAVQB0QFdAVkBVgHCAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/\n        AV8BWgFXAcABXwFbAVYBwwFhAVkBUwHXAX0BcQFNAfoBbAFlAVQB5QFgAVsBVwHIAV0BWQFWAcIBXQFa\n        AVYBwQFdAVoBVgHBAV8BWgFXAcABXQFaAVYBwQFdAVoBVgHBAV8BWgFXAcABXQFaAVYBwQFdAVoBVgHB\n        AV8BWwFWAcMBXwFZAVYByQFwAWQBUgHqAW4BYgFIAfYBYAFbAVYB0AFdAVkBVgHCAV8BWgFXAcABXgFZ\n        AVcBvwFfAVoBVwHAAWABWgFXAcIBYQFbAVgBxAFjAV4BWAHGAWUBXAFVAdwBSwFCATIB+wFkAV0BUQHj\n        AWUBXwFZAcoBYQFcAVgBxwFjAV0BWAHGAWEBWwFYAcQBYwFbAVgBwwFjAVsBWAHDAWEBWwFYAcQBYwFe\n        AVgBxgFkAV4BWQHIAWQBXgFYAcsBYgFYAUwB6QFSAU4BOQH3AWYBXwFYAdEBYwFeAVgBxgFjAVsBWAHD\n        AV8BWwFWAcEBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFfAVoBVwHFAV8BWAFOAeMBUgFR\n        ATkB9wFgAVgBVQHWAV8BWgFXAcUBXQFZAVYBwgFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV8BWgFXAcABXwFaAVcBwAFdAVkBVgHCAV4BWQFWAccBXwFYAVIB2QFQAUkBOQH2AWABWQFTAdcBYAFb\n        AVcBxAFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFfAVsBVQHG\n        AV4BVwFPAeUBUgFRATkB9wFhAVoBVQHVAV8BWgFXAcUBXQFaAVYBwQFdAVoBVgHBAV0BWgFWAcEBXwFb\n        AVYBwwFdAVkBVgHCAV0BWgFWAcEBXwFaAVcBwAFdAVkBVgHCAV4BWQFWAccBXwFZAVMB1wFRAUkBOQH2\n        AV8BWAFSAdkBYAFbAVcBxAFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFa\n        AVcBwAFeAVsBVQHGAV4BVwFOAeUBUgFQATkB9wFhAVoBVQHVAV8BWgFXAcUBXQFaAVYBwQFfAVoBVwHA\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFdAVkBVgHCAV4BWQFWAccBXgFY\n        AVEB2AFQAUkBOQH2AV4BWAFSAdkBXgFbAVcBxAFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHA\n        AV8BWwFWAcEBYwFbAVgBwwFjAV0BVwHFAWEBXAFYAccBZgFfAVYB2wFSAVEBPwH0AWABVwFNAesBZgFe\n        AVYB1wFmAV4BWQHOAWMBXQFXAcUBYQFbAVgBxAFhAVsBWAHEAWEBXAFXAccBZQFeAVcB0AFmAV4BVwHa\n        AVoBUwFFAfEBWwFMAT8B8wFmAV8BVwHXAWEBXAFYAccBYwFdAVcBxQFgAVoBVwHCAV8BWwFWAcEBXwFa\n        AVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFdAVoBVgHBAWABWwFYAcgBXwFYAU4B4wFSAVEBPgH0\n        AWABVgFSAd4BYQFZAVYBzwFfAVoBVgHFAV8BWwFWAcMBXwFbAVYBwwFfAVsBVgHDAWABWwFXAcQBXwFa\n        AVYBxQFgAVsBVgHQAV4BVwFOAeUBWAFKAUAB9QFgAVYBUgHeAV8BWgFXAcUBXQFaAVYBwQFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFdAVoBVgHBAWABWgFXAcoBXgFX\n        AU4B5QFSAVEBPwH0AV4BWAFSAd0BYQFZAVYBzwFeAVoBVQHGAWUBXgFXAdABbQFkAVkB2gFrAWMBVwHZ\n        AWEBWwFXAcsBXgFaAVUBxgFgAVsBVgHQAV8BVQFMAeQBWAFKAUAB9QFfAVoBUQHgAV4BWQFWAccBXQFa\n        AVYBwQFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFdAVoBVgHB\n        AWABWgFXAcoBXgFXAU8B5QFaAUwBPwHzAWEBWAFSAdwBXQFaAVUBzQFeAVsBVwHEAV0BWQFWAcIBXwFa\n        AVcBwAFfAVoBVwHAAV0BWQFWAcIBXgFbAVcBxAFhAVkBVgHPAV8BVwFOAeMBWQFKAUAB9QFhAVgBUQHh\n        AV4BWQFWAccBXQFaAVYBwQFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWgFXAcABXwFb\n        AVYBwQFjAVsBWAHDAWMBXgFYAcYBYQFeAVgBxwFmAV8BWQHOAWQBWwFUAeEBXAFMAT8B8wFVAVEBPAH3\n        AW8BZAFNAfEBaQFhAVYB3wFpAWEBVgHfAWwBZgFJAfIBWQFOATwB+AFbAVMBRQHxAWYBXgFXAdoBZAFe\n        AVkBzAFhAVwBWAHHAWMBXQFXAcUBYAFbAVgBwwFfAVsBVgHBAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV0BWgFWAcEBXwFaAVcBxQFhAVoBVQHVAV0BUgFHAe0BUQFJ\n        ATsB9gFeAVUBSwHrAWABWAFRAeEBXgFYAVIB3QFeAVgBUgHdAV8BVQFMAeQBWwFUAUoB7AFSAUkBOwH2\n        AV8BVgFNAegBXwFYAVQB0QFfAVoBVwHFAV0BWgFWAcEBXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWgFWAcEBXwFaAVcBxQFhAVoBVQHV\n        AVkBUwFGAe4BUQFJATsB9gFdAVUBSwHrAX0BbgFXAfIBsQGZAWgB/gGyAZ0BYAH9AWkBXgFQAe0BWgFU\n        AUkB7AFSAUkBOwH2AVsBVAFKAekBXwFZAVYB0gFfAVoBVwHFAV0BWgFWAcEBXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWgFWAcEBXwFb\n        AVUBxgFgAVgBVQHWAVoBTgFCAfABUgFJATsB9gFbAVQBSgHpAV8BWgFVAdgBYAFbAVcBxAFfAVoBVwHF\n        AWEBWgFUAdsBXAFTAUgB6gFYAUsBQAH1AVsBUwFKAewBXgFaAVMB0wFfAVoBVwHFAV0BWgFWAcEBXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVcBwAFfAVsBVgHB\n        AWMBWwFYAcMBYwFdAVcBxQFjAV4BWAHGAWMBXgFYAcYBYwFdAVcBxQFkAV0BWAHSAXABXwFIAfoBcAFj\n        AUwB8wFuAWIBTwHuAXABXgFFAfgBZAFeAVgBywFjAV4BWAHGAWMBXgFYAcYBYwFeAVgBxgFhAVsBWAHE\n        AWABWgFXAcIBXwFbAVYBwQFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFfAVsBVgHDAV4BWgFVAcYBYQFaAVUB1QFcAVUBTAHn\n        AVkBTwFDAfIBUgFJATsB9gFYAUsBQAH1AVoBTgFCAfABYQFYAU0B5gFfAVkBVgHSAV8BWgFWAcUBXQFZ\n        AVYBwgFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFfAVsBVgHDAV4BWgFVAcYBYAFY\n        AVUB1gFfAVYBTQHoAV8BWwFHAfMBbQFdAUUB+AFtAWIBSwH3AWABUwFFAfEBXwFYAU0B5gFeAVoBUwHT\n        AV8BWgFWAcUBXQFZAVYBwgFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFfAVsBVgHD\n        AV4BWAFVAcYBYQFaAVQB2gFcAVMBSAHqAV8BVwFNAegBYAFbAVUBxgFiAVwBVgHJAV4BVgFKAekBXwFW\n        AU0B6AFgAVgBUgHWAV4BWwFVAcYBXQFZAVYBwgFfAVoBVwHAAV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXwFaAVcBwAFfAVoBVwHAAV8BWwFWAcEBYAFa\n        AVcBwgFhAVsBWAHEAWEBWwFYAcQBYwFdAVcBxQFjAV0BVwHFAW0BYQFPAe4BbwFiAUwB8wFvAWQBTAHv\n        AWsBYwFXAeABYQFbAVgBxAFjAV0BVwHFAWEBWwFYAcQBYwFbAVgBwwFgAVoBVwHCAV8BWwFWAcEBXwFa\n        AVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWgFWAcEBXwFbAVYBwwFeAVsBVwHEAV8BWgFWAcUBXgFb\n        AVUBxgFeAVsBVQHGAV8BWgFWAcUBXgFbAVcBxAFdAVkBVgHCAV0BWgFWAcEBXwFaAVcBwAFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWgFWAcEBXwFbAVYBwwFfAVoBVgHF\n        AV4BWgFVAcYBXgFZAVYBxwFeAVkBVgHHAV4BWwFVAcYBXgFbAVcBxAFdAVkBVgHCAV0BWgFWAcEBXwFa\n        AVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV0BWgFWAcEBXwFb\n        AVYBwwFeAVsBVwHEAV8BWwFWAcMBXQFaAVYBwQFdAVoBVgHBAV8BWwFWAcMBYAFbAVcBxAFfAVsBVgHD\n        AV0BWgFWAcEBXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVcBwAFfAVsBVgHB\n        AWABWgFXAcIBYAFaAVcBwgFfAVsBVgHBAWYBXgFYAc4BZwFeAVcB0wFmAV8BWAHRAWMBXQFZAcgBXwFb\n        AVYBwQFgAVoBVwHCAV8BWwFWAcEBXwFaAVYBwQFfAVoBVwHAAV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWgFXAcABXwFaAVcBwAFfAVoBVwHA\n        AV8BWgFXAcABXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHAAV8BWgFXAcABXwFa\n        AVcBwAFfAVoBVwHAAV8BWgFXAcABXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/\n        AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFfAVoBVwHA\n        AV8BWgFXAcABXgFZAVcBvwFeAVkBVwG/AV8BWgFXAcABXwFaAVcBwAFeAVkBVwG/AV4BWQFXAb8BXgFZ\n        AVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFeAVkBVwG/AV4BWQFXAb8BXgFZAVcBvwFCAU0BPgcA\n        AT4DAAEoAwABYAMAATADAAEBAQABAQUAAUABAhYAA///AP8AQwAL\n</value>\n  </data>\n  <metadata name=\"cmListSkills.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"planToLevel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        wAAADsABataJCQAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAALmSURB\n        VDhPZZJLTxNhFIaJP8JEFwb1FxhHV8QLujDRhXEBRI0GNQQSFAQRUUQwBAm30nKrFFqhF3qlLdPOUCgt\n        vQJthba00JarYiSDcWHcqenr0Bk1lTc5+VbP851zvi/nTza3tlyJRMIRjcXNwXBE7w6EtNO+ec2k158p\n        m3dOTbs8pbknTh7ikeykNjaYWCIJVygMncOLftKGVg2ZVQKD9Ve3QlN/+MjRg5JYMsV8+fYdH/a+YnVn\n        F+54CnPJTczGUtD6QtB4g5nqNdE/+1T6+mO5x7MlvkiUWd/dw9LmDhZSmwisbWEmmoDKHThQnTrrj2bl\n        +Fke5WL1LzCh9W325jWYF8JQs7f9D44459FGOnBdpEwXCEfP8ygX5YybmQqvgAxGMgLj/BIMc4uZ0xwI\n        Q+qYQ82YFcXDBlzseJcu7FFkC0RmG0MvxhD/+Bmrn3Yze/CurLGjbMMWSUAfWEbzhBPlCgsud8nTRX2q\n        bIHASDNTS3EEWWA2loSHhe3sDrqsLrRbnGi3uiGw+VA1pEOaIJDsbAePcmkaMzFqTxD7Xey3LrA40KCl\n        2JmdqFVTqNNOonPCDl1TE9JFNzISHuXSbrAyZDAK6v0yeqhZVI0aMUhOo54FW9jWhaQZIpEIFEWhv7IC\n        YrG0hEe5tGhIxsQuj16MQ2L3Q+kJQUC5MOZfgsw+CdsggcgUgcbGRjyQ6NOlCssFHuXyfGScKXurQolY\n        hVKJBo+ketwVq1Etk/+Fx7oJNOhIFMpMeGxw5vMolyuve5jb3TLcH1CinIUrR02olMqgHvgH1yg0qNTZ\n        cUtG4onZdYlHueQ3CplmPQ1jIILZlXV4olEYpRwsaSVYqRJlKhrV4w7cGbXiKenJFpx7JWSKe+UoH9aj\n        jv0w6r48+OgOyLsIPGTHKJFbUKGdxrMJN+4padRR/mzBqdo25nRdB4gXApx5KQTBPpOwgcDV1h7kvRna\n        /zy4NqBBwbAJN2VsB5Z9QU7ObwjkSucBbV0TAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"showInExplorerMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABh0RVh0U29m\n        dHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAAk9JREFUOE+Vkm1P0mEYxd3c+hi8cmsrDTV1VJoaJlqE\n        TygmjYCEcGACKqAiOIKUJ0WRINNQJJ/LLB9mK0oFKmO6yGbrO/heN7cT0b9NhlL93t27zn12XTsn6X+Q\n        +YUdzUFRMvH8O/yF2mThEpvUsMohSd7ySE1r9WG5X+gmxolhT1Ywb89V74mXuLj3uh5y3130hQwwhbSI\n        mNgJ2fFUjVxLYY0zDizB+xj76oJ3ZxhTu27Mfvfg2Q9vxKQL8oDQRMjjKXPR3KoVKYa2B/Dky0N4dh5h\n        4tsIpndHMbM7BuOmBtJ1gZ6Qx0Lrzc+9Pkg9HNg0wRHqhWKlEZyZanCf16BrTQF9oA3iN1wbIf9NTls6\n        LmqycFlP2a9y0tH8qhG2TSMk8/WoHqVbbz4tP/VLx5tnhQWLdcPRT0fJbE1D5zsltO/bYNjQwBjUoWO1\n        BXRH0SohicKZZar4L1jxMZKlZ9Dua4Xap4RuXY1uvxaqZSlK+wtjDOomKjo4c8x4g1TJaZBlZ3FecW6/\n        1EyFeE6AnoAOfC87YnLFynAWR0+o8dwIR+JN3IMsJTmXos481G90RjcRTHJAtxeB4SqG7KUILcsSsKcq\n        E/cgW0V288bZ6A50wfxBD9unHgx+tsC1ZcPjbTsUy424NV15cg8ymlNTslXpB7IFcfQUy0dDNBVHyArn\n        Vh/kiw2o9ZYd34M/ZLakMSPx7lEf5IFmKQS9/yqa5kUQz95B+VBJbA9OIhJvck57BumSNpuUb6CQqKbc\n        cImtIL4H/0qB4YKqyJx3JMakpJ/GeCksDt4euAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <metadata name=\"imageList.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>130, 17</value>\n  </metadata>\n  <data name=\"imageList.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABC\n        PgAAAk1TRnQBSQFMAgEBBgEAAXABAQFwAQEBGAEAARgBAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFg\n        AwABMAMAAQEBAAEgBgABSC4AAwEBAgMKAQ0DHAEoAykBPgMtAUUDJwE6AxUBHQMFAQcDAAEBKAADIwEz\n        AlEBTwGcAlQBUgGmA1MBqgNTAaoDUwGqA1MBqgNTAaoDUwGqA1MBqgNTAaoDUwGqA1MBqgNTAaoDUwGq\n        A1MBqgNTAaoDUwGqA0cBgQMfAS0DCwEP4AADBAEGAxsBJgFGAkUBfgNWAbMBWAJWAbsDTgGYAzIBUAMW\n        AR8DBAEGKAADMQFNAmIBWAHpAlwBPwH4AZUBhAEdAf8BmQGGASAB/wGbAYkBJAH/AZ4BjAEmAf8BnwGN\n        AScB/wGdAYsBIQH/AZ0BiQEdAf8BnQGJARwB/wGgAYwBHwH/AaQBkAEjAf8BqQGVASgB/wGtAZsBLgH/\n        AbEBoAE0Af8BtgGkAToB/wG2AaIBNwH/A1gBwQMsAUMDEQEX3wABAQMGAQgDSgGMA38B/gEZATMBTAH/\n        AQABAwEcAf8DWQHyA0gBhAMwAUwDFAEbAwQBBSQAAzEBTQJiAVgB6QNcAfgBpgGXAT4B/wGsAZ0BRQH/\n        AbIBpAFOAf8BtgGoAVMB/wG3AaoBVQH/AbABoQFGAf8BqwGaAToB/wGoAZcBMwH/AasBmgE2Af8BrwGe\n        AToB/wG0AaMBPwH/AbkBqAFFAf8BvQGtAUsB/wHCAbIBUQH/AbsBqQFCAf8DWAHBAywBQwMRARfgAAMK\n        AQ0DTQH6AbsBxQHPAf8BKQFEAYcB/wEAARIBMQH/AQ0BLwFQAf8BWgJXAb0DRAF6Ay0BRgMQARYDAgED\n        IAADMQFNAmIBWAHpAV8CXAH4AbcBrAGDAf8BxQG7AZkB/wHLAcMBowH/AdEByAGrAf8B0wHLAa8B/wG9\n        AbABhAH/Aa4BnQFAAf8BpwGVATEB/wGpAZcBMwH/AawBmwE2Af8BsQGgATsB/wG2AaUBQQH/AboBqgFH\n        Af8BvwGvAU4B/wG5AacBPwH/A1gBwQMsAUMDEQEX4AADIAEvAWMBcQF/Af4BrAG6AcgB/wEAARsBOQH/\n        AQABFQE4Af8BKAGBAaQB/wFJAUgBSQH2A0wBkwNAAXEDJwE7Aw0BEQMBAQIcAAMxAU0CYgFYAekBXwJc\n        AfgBtgGqAYEB/wHCAbkBlQH/AckBwAGfAf8BzgHFAaYB/wHRAcgBqgH/AbsBrgGCAf8BrQGcAT8B/wGm\n        AZQBMAH/AagBlgExAf8BqwGZATQB/wGvAZ0BOAH/AbQBogE+Af8BuAGoAUQB/wG9Aa0BSwH/AbcBpQE9\n        Af8DWAHBAywBQwMRARfgAAM1AVcBTwGKAZoB/wG3AcgB2AH/AQIBJQFHAf8BAAEeAUkB/wGBAa4B2wH/\n        AU0BlQGvAf8BWQJWAb4BSQJIAYcDPAFmAyIBMgMKAQ4DAQECGAADMQFNAmIBWAHpA1wB+AGhAZIBNwH/\n        AaUBlwE8Af8BqgGcAUIB/wGtAZ8BRgH/AbABogFJAf8BqwGcAT4B/wGoAZcBNgH/AaUBlAEvAf8BpwGV\n        ATAB/wGqAZgBMwH/Aa4BnAE3Af8BswGhATwB/wG3AaYBQgH/AbwBqwFJAf8BtgGjATsB/wNYAcEDLAFD\n        AxEBF+AAA0cBggGvAbsBxwH/AaQBuQHNAf8BAAEcAT8B/wEAAScBgQH/AZMBxwHzAf8BkQGwAcwB/wFi\n        AlgB7wFJAkgBiANFAX0DNwFaAxsBJgMFAQcYAAMxAU0DYgHpAV8CXAH4AaQBlwE+Af8BpgGYAT4B/wGp\n        AZsBQQH/AasBnAFDAf8BrQGeAUQB/wGqAZoBPAH/AakBmQE5Af8BqwGbATsB/wGsAZsBOwH/Aa4BnQE9\n        Af8BswGiAUIB/wG1AaUBQwH/AbgBqQFHAf8BvQGtAUwB/wG1AaQBOgH/A1oBwAMrAUIDEAEW4AABUQJP\n        AaUB0AHZAeAB/wGPAaYBvAH/AQABFgE4Af8BAAEuAYYB/wGmAeMC/wGxAdMB8QH/AZQBqwG/Af8BVQJT\n        Aa0BRgJFAX4BQAI/AW8BLAIrAUMDDQESAwABARQAAzEBTQNiAekBZQFfAVwB+AG1AaoBgQH/AbYBqgGB\n        Af8BtAGnAVQB/wG0AacBUwH/AbYBqQFWAf8BsgGkAU0B/wGzAaUBTQH/AbkBqwFWAf8BuAGqAVIB/wG6\n        AasBVAH/Ab8BsgGEAf8BvAGuAVQB/wG8Aa0BTwH/Ab0BrgFPAf8BswGjAToB/wJaAVgBwAMqAUEDEAEW\n        3wABAQFeAloB1QHpAe8B9QH/AYABlQGtAf8BAAETATYB/wEVAUwBqQH/AcYD/wG3Ad4B+AH/AbMBygHe\n        Af8BZAJcAecDRAF6A0ABcQMzAVMDFQEdAwMBBBQAAzEBTQNiAekBbQFpAV0B+AHSAcsBsgH/AdUBzgG3\n        Af8BywHCAaQB/wHIAb8BnwH/Ac0BxAGmAf8BxQG7AZcB/wHGAbsBlwH/Ac8BxgGnAf8BywHBAZ4B/wHN\n        AcIBoAH/AdQBywGtAf8ByQG9AZQB/wHBAbMBggH/Ab0BrgFQAf8CfwFgAf4CWQFXAb8DKgFAAxABFtwA\n        AwcBCgJAAYAB/QH7A/8BgQGbAbUB/wEGATEBgwH/AS4BlAHKAf8B4wP/Aa4B1AHpAf8BpAHBAdoB/wGV\n        AasBvgH/A04BmAM9AWkDNQFXAxwBKAMFAQcUAAMxAU0DYgHpAW0BawFfAfgB0gHMAbMB/wHUAc0BtgH/\n        AcgBvwGhAf8BvwG0AZAB/wG5Aa0BgwH/AbsBrwGGAf8BvQGxAYgB/wHAAbMBigH/AcIBtQGMAf8BxAG3\n        AY8B/wHHAbsBlAH/AcUBuAGNAf8BwgG0AYQB/wG+Aa4BUgH/AbIBnwE4Af8CWgFYAcADKgFBAxABFtwA\n        AyMBNAFNAZABpwH/AdUB6AH6Af8BHAE+AYcB/wEAAQkBKAH/ATcBnQHOAf8B3QP/AdAB9QL/AY0BsAHR\n        Af8BpQG8AdEB/wNUAasDOQFfATUCNAFVAyEBMAMJAQwDAAEBEAADMQFNA2IB6QFtAWkBXQH4AdEBygGy\n        Af8B0wHNAbYB/wHJAcIBpQH/Ab8BtQGRAf8BtAGoAVUB/wG3AaoBWAH/AbkBrAGBAf8BugGtAYEB/wG8\n        Aa4BgQH/AbwBrwGBAf8BvQGwAYIB/wHBAbQBhwH/AcEBswGEAf8BvQGtAVIB/wGxAZ4BNQH/AloBWAHA\n        AyoBQQMQARbcAAE+Aj0BagGZAbMByQH/Ad8B8wH9Af8BOQGGAaUB/wEEAS4BgQH/AUoBswHbAf8BkwHE\n        AeIB/wGXAckB8AH/AcMB4wL/AbIBzQHmAf8DVAGuAzMBUgMxAU4DJAE1Aw0BEQMBAQIQAAMxAU0DYgHp\n        AWsBZwFcAfgBzgHHAa0B/wHUAc4BtwH/AdAByQGwAf8ByQHBAaMB/wG+AbQBjwH/AbkBrQGEAf8BuQGt\n        AYIB/wG/AbMBigH/AbkBrAFWAf8BtwGpAVEB/wG4AaoBUgH/Ab0BsAGCAf8BvgGwAYEB/wG7AasBTwH/\n        Aa4BnAEyAf8CWgFYAcADKgFBAxABFtwAAUkCSAGIAbMBywHZAf8B4gHyAv8BKAFOAZ0B/wEAAQkBLQH/\n        AUcBrgHLAf8BtgHhAfIB/wEwAY8BwgH/AbMB1wH3Af8BwgHgAfIB/wFRAk8BpQMtAUYDLQFFAyQBNgMR\n        ARcDAwEEEAADMQFNA2IB6QFtAWsBXwH4AdUBzwG6Af8B3AHXAcQB/wHXAdIBvQH/AdQBzgG3Af8B0QHL\n        AbIB/wHOAcYBqwH/AcgBvwGfAf8BwAG0AY0B/wG+AbEBhwH/Ab4BsAGFAf8BvwGxAYUB/wHCAbUBigH/\n        Ab4BsAGAAf8BswGiAUAB/wJ/AVQB/gJZAVcBvwMqAUADEAEV3AABWQJWAb4B/AP/AdIB4gHwAf8BGgE/\n        AYsB/wEAAR8BSAH/AZ0B0gHtAf8BLgGPAb4B/wGuAdwB7QH/ASoBgwGuAf8BqQHJAeUB/wNUAasDJwE6\n        AycBOgMiATIDFAEbAwUBBwMAAQEMAAMxAU0DYgHpAW4BawFhAfgB2QHUAcAB/wHiAd0BzgH/Ad8B2gHK\n        Af8B3gHaAcgB/wHfAdoBygH/AdsB1QHCAf8B1AHNAbUB/wHLAcIBogH/AckBvwGdAf8ByAG9AZkB/wHI\n        AbwBlgH/AcUBuQGPAf8BvQGvAVcB/wGxAZ8BPQH/An8BUgH+AlkBVwG/AykBPwMQARXYAAMBAQIBXAJV\n        AeoE/wHTAeMB8gH/ARYBOAGDAf8BAAEoAU8B/wGzAdkB8QH/ASQBigHBAf8BjgG+AeMB/wGTAcIB5wH/\n        AU0BnAG+Af8BUQJQAZ8DIAEuAyABLgMeASsDFAEcAwcBCQMAAQEMAAMxAU0DYgHpAW4BawFhAfgB2gHV\n        AcEB/wHmAeIB1QH/AecB4wHWAf8B5wHkAdcB/wHnAeMB1wH/Ad8B2gHKAf8B3QHYAcYB/wHgAdsBygH/\n        AdsB1AG/Af8B1gHPAbUB/wHTAcoBrAH/AcYBugGRAf8BuwGtAVUB/wG0AaQBRQH/An8BUQH+AlkBVwG/\n        AykBPwMQARXYAAMEAQUBOwGCAZ0B/wHOAd0B6wH/AaEBywHpAf8BMgGBAaUB/wETAT4BkAH/AaAByQHe\n        Af8B5QH0Av8BLQGOAcAB/wGNAboB4wH/AZcBuwHcAf8BVAJTAawDGQEjAxkBIwMYASEDEgEZAwcBCgMB\n        AQIMAAMxAU0DYgHpAW4BbQFjAfgB1gHQAbsB/wHYAdMBvgH/AdgB0gG+Af8B2AHSAb0B/wHXAdEBvAH/\n        AdQBzQG3Af8B0wHNAbYB/wHVAc4BuAH/AdQBzQG1Af8B0AHJAa4B/wHLAcIBowH/Ab8BswGIAf8BtQGn\n        AUwB/wGvAZ8BPgH/An8BTgH+AlkBVwG/AykBPwMQARXLAAEBDAADCwEPAUkBSAFJAfYB2QHuAfwJ/wHq\n        AfEB9gH/AUQBlwG8Af8B7QP/AcMB6wH7Af8BNAGPAb4B/wGbAb4B3wH/AVICUAGkAxEBFwMQARYDDwEU\n        Aw0BEQMHAQkDAQECDAADMQFNA2IB6QFvAW4BZwH4AdcB0gG+Af8B1AHOAbgB/wHRAcsBtAH/Ac8ByAGv\n        Af8BzgHHAa0B/wHNAcYBrAH/Ac0BxQGrAf8BzQHGAawB/wHOAccBrQH/AcwBxQGpAf8ByAG/AaEB/wHA\n        AbUBjgH/AbgBrAFVAf8BswGkAUgB/wJ/AVQB/gJZAVcBvwMpAT8DEAEVyAADAQECDwABAQNAAXEBYwJ/\n        Af4B5gH6Cv8B/AP/AZABsgHPAf8B5QH3Av8BqAHOAe4B/wFKAZkBvQH/AVUCUwGwAwgBCwMGAQgDBAEG\n        AwQBBQMDAQQDAAEBDAADMQFNA2IB6QJvAWsB+AHeAdoByQH/AdsB1QHCAf8B1AHNAbcB/wHOAccBrgH/\n        AcsBxAGoAf8BygHDAacB/wHKAcIBpgH/AcoBwgGmAf8BygHCAaYB/wHKAcIBpgH/AcoBwgGmAf8ByQHA\n        AaMB/wHFAbsBmQH/Ab4BswGKAf8CfwFjAf4CWQFXAb8DKQE/AxABFd8AAQEDQgF1AkABmgH9AeoB+wL/\n        Af0H/wHtAfgC/wGYAcoB9AH/Ab4B2gHzAf8BlAGzAdAB/wFXAlUBtwMCAQMDAQECAwABAQMAAQEDAAEB\n        EAADMQFNA2IB6QJwAW4B+AHlAeEB0wH/AeAB2wHLAf8B3AHWAcQB/wHZAdQBwAH/AdgB0wG/Af8B1QHP\n        AbgB/wHQAckBsAH/AcoBwgGmAf8BygHCAaYB/wHKAcIBpgH/AcoBwgGmAf8BygHBAaUB/wHIAcABogH/\n        AcYBvQGdAf8CqAGEAf0DWAG7AyYBOQMOARPkAAM+AWsDfwH+AesB+AH+Af8B/Qf/AdoB5QHvAf8BkQHD\n        AeoB/wGUAboB0QH/AVcCVgG4JAADMQFNA2IB6QJxAXAB+AHrAegB3QH/AeYB4gHVAf8B4wHeAdAB/wHg\n        AdsBywH/Ad0B2QHHAf8B2wHWAcIB/wHWAdABugH/Ac8ByAGvAf8BzAHFAaoB/wHLAcMBpwH/AcoBwwGn\n        Af8BygHDAacB/wHIAcABpAH/A38B/gNcAd8DTwGXAxoBJQMJAQzoAAM7AWMBTAGSAawB/wHaAesB+AH/\n        AfkB/Qb/AdQB3gHnAf8BlAHOAeIB/wFcAlkBySQAAzEBTQNiAekCcgFxAfgB8QHvAegB/wHtAeoB4QH/\n        AekB5QHaAf8B4wHeAdAB/wHaAdUBwgH/Ad0B2AHFAf8B3QHXAcUB/wHaAdQBwAH/AdEBygGxAf8BzAHF\n        AaoB/wHLAcQBqQH/AcsBxAGpAf8DfwH+AXABagFfAfsDUgGnAzMBUwMBAQIDAAEB6wABAQNBAXICQAGT\n        Af0ByAHXAeUB/wH0AfgB+wH/AWQCWQHsA1kB9QFcAlkByQMAAQEgAAMxAU0DYgHpA3AB+AHfAd0B1wH/\n        AdoB1gHMAf8B0wHOAb8B/wHMAcYBswH/AcQBvgGlAf8BwgG7AaAB/wHBAbgBnAH/AcABtwGbAf8BvQG0\n        AZYB/wG7AbIBkwH/AbsBsgGTAf8DfwH+A2EB4QNUAaYDNAFUAxQBHAMAAQH0AAM7AWMBZQJSAfQDNwFa\n        AwQBBQMDAQQDLQFGJAADLwFJA2EB3ANlAeUDXwHoA2UB5QNhAeQDXwHjA2EB4gNhAeIDYQHiA2EB4gNh\n        AeIDYQHiA2EB4gNdAdIDUgGjAzMBUwMVAR0DAAEB/AADKwFCAwIBAwMAAQEDAAEBAwABASQAAyoBQANY\n        AcEDWQG/A1cBugNWAbEDVAGuA1YBqwNTAaoDUgGpA1IBqQNSAakDUgGpA1IBqQNTAagDRgF+Ay0BRgMB\n        AQIDAAEB/wBIAAEBAwAEAQQCBAMEBAEFAwQBBgMEAQYDBAEFAwMBBAMCAQMDAQECAwABAQMAAQEfAAEB\n        FwABARsAAQEwAAMCAQMDDgETAwEBArQAAwIBAwMGAQgDCwEPAxIBGQMYASIDHAEoAx4BKwMfAS0DHwEt\n        Ax4BKwMcASgDGAEiAxMBGgMLAQ8DBgEIAwIBAxcAAQEDBAEFAwcBCQMMARADEgEYAxEBFwMLAQ8DBAEG\n        AwEBAhAAAwEBAgMEAQYDCgEOAxEBFwMSARgDDQERAwcBCQMEAQUDAAEBFAADHwEtA1ABmgNCAXYDIAEv\n        AwQBBVcAAQETAAEBQAADBgEIAxABFgIgASEBLwEzATQBNQFUAUABRQFIAXUBRQFNAVUBiAFHAVMBXQGT\n        AUcBVQFhAZgBRwFVAWEBmAFHAVMBXQGTAUUBTQFVAYgBQAFFAUgBdQE1ATcBOAFYAyEBMAMRARcDBwEJ\n        FAADAwEEAwoBDQMVAR0CJwEoATsCOAE7AV4CNwE6AVwDIwEzAwsBDwMDAQQDAAEBCwABAQMCAQMDCgEO\n        AyEBMAI3ATkBWwI4ATwBXwMpAT4DFQEdAwoBDQMDAQQQAAMEAQYDRAF6AWECSAH2AWoCRwH5AV0CWQHX\n        AVcCVQG3AUYCRQF/Ay4BSAMNARFEAAMDAQQDCQEMAxQBGwIhASABLwMfAS0DDwEUAwQBBQMAAQE3AAEB\n        AwUBBwMSARgDIwE0ATgBOQE7AV4BRwFTAV4BlgFCAWsBjAHHATQBfQG2AeMBKAGHAdgB8wEhAY8B6gH7\n        ASEBjwHqAfsBKAGJAdoB9AEzAXoBuAHkAUIBbAGOAcgBSAFVAWIBmwE5AToBPAFgAyQBNgMTARoDBQEH\n        AwABAQwAAwYBCAMUARwDJwE7AT4BPQFDAWwBSQFHAWgBpAFJAUgBZgGhAjkBPQFhAxwBJwMNAREDBgEI\n        AwEBAgMBAQIDBgEIAwwBEAMbASYCNwE5AVsBSAFHAWQBnwJIAWoBpgE/AT4BRQFxAygBPAMVAR0DBwEJ\n        EAADJgE5AVsCWAHGAVwBPwE+AfgDTQH6AWECVAHuAV8CTAHzA00B+gFfAV0BWQH7A00B+gFeAlsB0ANQ\n        AZ0DPQFpAycBOgMdASkDEgEYAwIBAygAAwgBCwMYASIBNAEzATIBUQFgAVwBRAGYAVsBVwFDAZEDKAE8\n        AwkBDAMEAQUwAAMCAQMDBwEJAxMBGgIqASsCQAFEAUgBdQFIAVkBZwGhAUEBbgGSAckBLAGCAcoB7QEc\n        AZIB9wH/AR4BnQL/AR8BogL/AR8BogL/AR4BnQL/ARwBkwH4Af8BLAGCAcoB7gFAAW4BlgHNAUcBWgFp\n        AaMBQQFGAUoBeAIsAS0BRAMTARoDBwEJAwMBBAgAAwoBDgMoATwBPwE+AUUBcAFIAUcBYgGdAUQBQwGJ\n        AcYBRgFDAYYBwwJHAVwBlAI5AT0BYQMlATcDEQEXAwUBBwMFAQcDEAEVAyQBNQI4ATsBXwJGAVgBjwFF\n        AUMBgwHCAUMBQQGLAccBSQFHAWUBoQE/AT4BRQFxAykBPgMNAREMAAMDAQQBTQJMAZEBWwJZAdIDTQH6\n        AW0CUQH3AWACWQHrAWICWAHvA10B7QNdAe0BYgJYAe8BXwJMAfMBbQFSAVEB9wJfAV0B+wFnAlkB8gFc\n        AlgB0QNUAa8BRwJGAYEDOAFdAykBPgMVAR0DGgElAwQBBRAAAwIBAwMWAR8CNQEzAVQBWwFXAUMBkwGr\n        AZUBKwHbAZ8BjQExAdMBSwFJAUABewIpASgBPQMTARoDBAEFAwABASgAAwYBCAMQARYDIwE0AT8BQwFG\n        AXIBRQFpAYcBwAEwAYQBxgHoASkBigHaAfIBHwGRAe8B/QEcAZYB/QH/AR0BmgL/AR4BnAL/AR4BnQL/\n        AR0BmgL/ARwBlgH9Af8BHwGRAe8B/QEoAYkB2wHzATABhAHHAegBRQFqAYsBwwFBAUYBSQF3AyQBNgMQ\n        ARYDBgEICAADDwEUAjcBOgFdAUkBRwFoAaQBRQFCAYcBxQFAATwBmwHUAUABPQGaAdQBRQFCAYgBxAJI\n        AWgBpQI8AUEBaQMgAS4DDgETAw4BEwMdASoCOwE/AWYBSAFHAWcBowFGAUMBhQHCAT8BPAGXAdMBQAE8\n        AZsB1AFDAUEBiQHHAkgBagGmAjkBPAFgAxIBGAwAAyoBQAFWAlUBsQFdAlsB0AFRAUsBRQH+AWUCUgH0\n        AV0CTgHwAWIBXgFIAfYBZQJSAfQBZQJSAfQCWQFCAfUCWQFCAfUCWQFCAfUCbQFRAfcCagFXAfkCagFa\n        AfkBUwJNAfoCagFmAfkBZAJZAewBYAJaAd4BXgJcAc4BXAJZAckDIAEuDAADAwEEAwcBCgIqASkBPwFn\n        AWIBQwGiAbIBnAEmAeAB3wG8AQwB9gHYAbgBEgHzAZ8BjAExAdMBXwFaAUQBlwIrASoBQQMMARADBAEG\n        JwABAQMKAQ4CIAEhAS8BOAE5ATsBXgFHAVkBZQGgATEBggHJAesBHQGbAv8BHAGYAv8BHwGLAeoB/AEq\n        AYYB0gHwATMBfgG8AeQBNwF5AbEB3gE3AXkBsAHeATQBfQG7AeMBKwGDAdEB7wEfAYsB6gH8ARwBlwH+\n        Af8BHQGbAv8BLQGEAcwB7gFIAVsBagGmATkBOgE8AWADIQEwAwwBEAMAAQEEAAMOARMCNQE4AVgBSAFH\n        AWIBnQFFAUQBggG/AT8BPAGaAdMBPAE3AaUB3AE8ATgBpwHdAUIBQAGPAcsBRwFGAVoBkwI1ATcBWQIp\n        ASoBPwIpASoBPwI0ATYBVQJGAVoBkQFEAUIBjgHKATwBNwGmAdwBPAE3AacB3QE/ATwBmgHTAUUBQQGD\n        AcIBSAFHAWQBnwI3ATkBWwMRARcLAAEBAyUBNwNQAZ4BWAJWAcECMQEpAf8BZAJTAfEBZAJTAfEBUwJN\n        AfoDXwH7AVMCTQH6AmoBYQH5AVoCTQH6AWUBXQErAfwCqAFAAf0CqAFAAf0BZQFcASsB/AFaAk0B+gJq\n        AUcB+QNcAfgBWAJNAfoBVgJNAfoBWwJZAcQDGAEiDAADDQESAyMBNAFIAUYBPwF2AaMBkQEwAdUB+QHQ\n        AQAB/wH8AdQBAAH/AfoB0QEAAf8B8wHKAQAB/wGhAY8BMAHUAU8BTQFCAYACLAErAUMDFQEdAwUBBwMB\n        AQIcAAMBAQIDEAEWATMBNAE1AVQBRwFUAV8BmAFAAW4BlAHNASQBiwHhAfcBHAGXAf4B/wEdAY0B8AH+\n        ATABfgHCAeoBRQFmAYIBvgFGAVEBWgGSAUMBSAFNAX8BQwFIAU0BfwFGAVEBWQGQAUQBZgGAAbwBMAF9\n        AcEB6AEfAZAB7QH9ARwBlwH+Af8BIQGJAeMB+AE+AXABmQHQAUgBVQFiAZsBNQE2ATcBVwMTARoDAQEC\n        AwABAQMJAQwDIAEuAjYBOQFaAkYBVQGLAkUBgwHAATwBNwGlAdwBOQE3AawB4AE9ATwBnQHWAUcBRQF7\n        AbkBRwFGAV4BmQJGAVUBiwJGAVUBiwFHAUYBXAGXAUgBRgF6AbgBQAE8AZ0B1QE5ATcBrAHgATwBNwGn\n        Ad0BRQFDAYMBwgJGAVkBkAI3AToBXAMhATADCgEOAwABAQQAAw0BEgFAAj8BbgFFAkQBfAFbAlkBwwJD\n        ATgB/wNdAe0BZwJZAfIBUwJNAfoDXwH7AWQBXQFRAfwCqAGdAf0DfwH+A38B/gN/Af4CqAGGAf0BWgJN\n        AfoBWgJNAfoCXwFXAfsBZAFcASsB/AJqAUcB+QJiAUkB9gFSAlEBoQMMARADAAEBCAADHQEqAVABTQFC\n        AYIBigF9AToBxQHPAbABFQHvAfsB0gEAAf8B+gHSAQAB/wH5AdEBAAH/AfgBzwEAAf8B1wG4ARIB8wGm\n        AZIBLwHXAWQBXwFDAZ4CLgEtAUcDEAEVAwUBBxwAAwIBAwMVAR0BPwFDAUcBcgFEAWoBjAHFAS4BggHI\n        AewBHwGLAesB/AEeAYsB6wH8ATABgQHFAesBQQFrAY4ByQFFAU4BVQGMAjIBMwFQAyQBNgMkATUBMAIx\n        AU0BRQFNAVQBiQFCAWoBiwHHATABfQHBAegBHgGLAekB/AEfAYsB7AH8ASwBggHKAe4BQgFsAY4ByAFA\n        AUUBSQF2AxgBIgMCAQMDAAEBAwQBBgMKAQ0DGgEkAjUBOAFZAUkBRwFlAaABRQFBAY4ByQE9ATwBnQHW\n        AT0BOQGfAdgBQQE+AZUB0QFEAUEBiQHIAUUBQgGFAcQBRQFCAYUBxAFDAUEBiAHHAT8BPQGWAdIBPQE5\n        AZ8B2AE9ATwBnQHWAUQBQgGOAcoBSAFHAWcBowI4ATsBXwMbASYDCgEOAwQBBgMAAQEDAwEEAykBPgM/\n        AW0BPQI8AWcBXAJZAc8CTwFDAf8BZAJcAecBZQJSAfQDXwH7A6gB/QN/Af4DfwH+AqgBogH9A38B/gN/\n        Af4BZwFgAUMB/AFnAV8BOgH8AqgBkQH9AqgBiwH9A1wB+AJlAVIB9AFiAlgB7wE/Aj4BbAMAAQEDAAEB\n        AwcBCgMWAR8BOQE4ATYBWgGAAXQBPgG7AdMBswETAfEB7wHIAQIB/QH6AdEBAAH/AfEByQEAAf4B8QHJ\n        AQAB/gH7AdEBAAH/AfsB0gEAAf8B9wHPAQAB/wGmAZIBLAHZAVMBUAFCAYcCLwEuAUkDFwEgAwcBCQMB\n        AQIUAAMDAQQDGAEiAUUBTAFSAYQBNwF8AbUB4QEhAY8B5wH6ARwBlgH5Af8BKQGFAdYB8QFDAWgBhgHB\n        AUUBTgFVAYwBNQI2AVYDHQEpAw8BFAMPARQDHAEnATMBNAE1AVQBRQFNAVQBiQFFAWUBggG9ASsBgwHR\n        Ae8BHAGVAfoB/wEhAZAB6QH6ATMBegG4AeQBRgFOAVYBiQMcASgDAwEEAwAEAQQCAQMDCwEPAyIBMgI6\n        AT4BZAJGAVgBjwFHAUYBdgG2AUEBPgGVAdEBPQE5AZ0B2AE9ATkBnAHXAT0BOQGcAdgBPQE5AZwB2AE9\n        ATkBmwHXAT0BOQGfAdkBQQE+AZUB0QFHAUYBegG4AkYBWgGRAjsBQAFnAiQBJQE2AwwBEAMCAQMDAQEC\n        AwABAQMLAQ8DLwFJAywBRAM3AVoBXQJYAeMBSQE3ASsB/AFfAlcB6ANcAfgCqAGcAf0DfwH+A38B/gN/\n        Af4CqAGfAf0DfwH+A38B/gNfAfsBXAJNAfoCagFbAfkCYgFaAfYCZQFSAfQBYQJUAe4BXgJYAd0DJwE7\n        CAADFgEeAT0BPAE5AWEBZwFiAUMBogG2AZ8BJgHhAfEBywECAfwB+wHSAQAB/wH2Ac4BAAH/AeABvgEK\n        AfgB4gG+AQYB+gH7AdIBAAL/AdYBAAH/AfoB0gEAAf8B3AG5AQ4B9QGuAZgBKgHcAWoBZAFDAaUBMgEx\n        ATABTgMTARoDBQEHFAADBAEFAxsBJgFGAVEBWgGPASoBhgHWAfEBIAGaAfkB/gEfAZgB+wH+ATUBfwG+\n        AeUBRgFTAV0BlgExAjIBTwMcASgDDQESAwQBBgMEAQUDDQERAxwBJwEwAjEBTQFGAVEBWQGQATUBfgG5\n        AeIBHwGXAfsB/gEgAZsB+QH+ASgBiQHaAfQBRwFUAV4BlAMfASwDBAEFDAADBAEGAw8BFAMdASoCMwE0\n        AVMBRwFGAVoBkwFEAUMBhwHGAT0BOwGaAdYBPQE5AZ8B2QE8ATcBowHcATwBNwGjAdwBPQE5AZ8B2QE9\n        ATkBnAHXAUMBQQGIAccBRwFGAVwBlwI1ATYBVgMeASsDEAEVAwUBBw8AAQEDBAEGAwQBBQMpAT4BYgJI\n        AfYDXAH4AWQCWQHsAV4BTwFNAfoCqAGeAf0CqAGlAf0CqAGiAf0CqAGiAf0CqAGiAf0CqAGSAf0CqAGe\n        Af0DXAH4AVwCTQH6AmIBSQH2AmUBUgH0AWcCWQHyAWECVAHuAVsCWAHLAxIBGAgAAxwBKAFRAU4BQwGD\n        AY4BgAE5AcgB4gHAAQwB9wH/AdoBAAH/AfsB0QEAAf8BywGvARgB7QGOAYABOQHIAYkBfAE6AcQBsgGd\n        ASYB4AHYAbgBEgHyAfQBzAEAAf4B/QHVAQAB/wH8AdMBAAH/AbEBmgEmAd8BWAFVAUQBjwIzATIBUAMZ\n        ASMDBwEJAwEBAgwAAwQBBgMcASgBRwFUAV4BlAEiAY4B5gH5AR8BogL/AR4BnQL/ATcBfAG2AeEBRAFL\n        AVIBhgMlATcDEAEVAwQBBggAAwQBBQMPARQDJAE1AUIBSAFNAX8BNwF5AbAB3gEeAZwC/wEfAaMC/wEf\n        AYsB6wH8AUcBVgFiAZkDIAEuAwQBBg8AAQEDBAEGAw4BEwMoATwCRAFRAYYBRQFDAYMBwwE+ATkBnAHX\n        ATwBNwGjAdwBOQEzAaoB4QE5ATMBqgHhATwBNwGjAdwBPQE5AZwB2AFFAUIBhQHEAkYBVQGLAikBKgE/\n        Aw8BFAMFAQcDAQECGAADLwFKAUEBQAE4Af8BbQFkAVIB9wJlAVIB9ANfAfsCqAGjAf0BawFmAVUB/AFr\n        AWUBVQH8AWoBZAFVAfwDXwH7A18B+wNfAfsCZQFSAfQDXAH4A2oB+QNcAfgBZAFVAVMB8QFnAlkB8gNW\n        AbMDAAEBCAADHQEpAVMBUAFCAYYBlQGFATUBzQHwAckBAAH+Af8B3AEAAf8B9AHLAQAB/wGRAYIBOAHK\n        AUQBQgE9AW8COgE3AV4BXQFaAUQBmAGSAYMBNgHLAeMBwAEIAfkB/wHbAQAB/wH9AdQBAAH/AeIBwAEM\n        AfcBtgGgASQB4wFwAWoBQgGsAjUBMwFUAxYBHgMHAQoMAAMEAQYDHAEoAUcBVAFeAZQBIgGOAeYB+QEf\n        AaIC/wEeAZ0C/wE3AXwBuAHhAUQBSwFSAYYDJgE4AxABFQMEAQYIAAMEAQUDDwEUAyQBNgFDAUkBTgGA\n        ATcBeQGwAd4BHgGcAv8BHwGjAv8BHwGLAesB/AFHAVYBYgGZAyABLgMEAQYPAAEBAwUBBwMOARMDKAE8\n        AkQBUQGGAUUBQwGDAcMBPgE5AZwB1wE8ATcBowHcATkBMwGqAeEBOQEzAaoB4QE8ATcBowHcAT0BOQGc\n        AdgBRQFCAYUBxAJFAVUBjAIpASoBPwMPARQDBQEHAwEBAhgAAyEBMAFgAloB3gNcAfgBXgFQAU0B+gFr\n        AWYBTQH8A38B/gN/Af4DfwH+A38B/gOoAf0BagFkAVcB/AFcAU8BTQH6AV0CTgHwAWQBVQFTAfEBYQJU\n        Ae4BYgJYAe8DXQHtAWoBYQFXAfkDPgFrDAADFwEgAT8BPgE6AWUBZwFiAUQBoQGfAY8BMQHTAbYBnwEm\n        Ad8BlgGGATUBzQFbAVcBQwGTAyQBNQMXASACNgE0AVYBWgFWAUMBkQGeAYwBMgHSAdYBuAETAfAB9QHM\n        AQAB/gH/AdUBAAL/AdYBAAH/AbsBoAEiAeQBXQFZAUQBlQE3ATYBNQFXAxwBJwMJAQwDAgEDBAADBAEF\n        AxsBJgFGAVEBWgGOASsBhwHTAfABIgGdAfgB/QEfAZcB+gH+ATQBfwG/AeYBRwFTAV8BmAEyATMBNAFS\n        Ax4BKwMOARMDBAEGAwQBBgMNARIDHQEpAjIBMwFQAUYBUQFbAZMBNAF9AbsB4wEfAZcB+wH+ASIBngH4\n        Af0BKAGHAdgB8wFGAVMBXQGTAx8BLAMEAQUMAAMFAQcDEAEVAx8BLQI1ATYBVgFIAUcBXAGVAUMBQQGI\n        AccBPgE5AZwB1wE9ATkBnwHZATwBNwGjAdwBPAE3AaMB3AE9ATkBngHZAT4BOQGcAdcBQwFBAYgBxwFH\n        AUYBXwGZAjUBNwFZAyABLgMRARcDBgEIGAADGwEmAVsCWAHLA1wB+AJfAVsB+wFrAWYBTQH8AqgBpwH9\n        A38B/gN/Af4DqAH9A6gB/QOoAf0CbQFjAfcDWQH1Am0BYgH3AmIBWAH2AWUBYgFSAfQBYQJUAe4DXAH4\n        AyMBMwgAAwEBAgMIAQsDFwEgAi0BLAFEAUkBSAFAAXcBUQFPAUMBgwJBATwBagIuAS0BRgMTARoDCAEL\n        AxMBGgItASwBRAFVAVIBQwKKAX4BOgHEAeQBwAEKAfgB/wHcAQAB/wH+AdUBAAH/AeQBwAEIAfkBvAGi\n        ASIB5AF3AW4BQgGxAToBOQE2AVwDGgEkAwoBDQMAAQEDAwEEAxgBIgFEAUsBUgGDATgBewGzAeABIgGQ\n        AeYB+QEcAZYB+QH/ASkBhgHWAfEBRQFpAYgBwwFGAU8BVwGOATUBNgE3AVgDHQEqAxABFQMPARQDHAEo\n        ATUCNgFWAUUBTgFVAYwBRQFmAYQBvwEqAYYB0gHwARwBlQH6Af8BIAGPAegB+gE0AX0BtgHjAUUBTQFV\n        AYgDHAEoAwMBBAMABAEEAgEDAwsBDwMjATMCOwFAAWcBRwFGAVoBkgFIAUYBeAG3AUEBPgGVAdEBPQE5\n        AZ0B2AE9ATkBnAHXAT0BOQGcAdcBPQE5AZwB1wE9ATsBmQHWAT0BOQGfAdkBPwE9AZcB0gFHAUUBewG5\n        AkcBWwGUAjwBQQFpAyUBNwMNAREDAgEDAwEBAgMAAQEMAAMkATUBYgJYAekCbQFSAfcCXwFbAfsCqAGf\n        Af0DqAH9A38B/gOoAf0DqAH9A6gB/QFqAWQBWQH8AWcCWQHyAWQBVQFTAfEBZAFVAVMB8QFnAlkB8gFl\n        AWIBUgH0AWcCWQHyAWACWwHWAwIBAwgAAwEBAggAAwwBEAMkATUDKQE+Ax0BKgMSARgDBwEJCAADEAEW\n        AjABLwFLAVQBUQFDAYkBmQGIATUBzgHUAbUBFwHuAfMBygECAf0B/wHVAQAC/wHZAQAB/wHCAacBHgHo\n        AWABWwFDAZkCNQEzAVQDFAEbAwABAQMCAQMDFQEdAT8BQwFGAXEBRAFrAYoBxAEwAYEBxQHrAR8BiwHq\n        AfwBHgGLAesB/AEuAYEBxwHsAUIBbAGRAcoBRgFPAVcBjgEyATMBNAFSAyYBOAMlATcBMQIyAU8BRgFO\n        AVUBiwFCAWwBjgHIATABfgHCAeoBHgGLAeoB/AEfAYsB6wH8ASwBggHKAe0BQgFrAYwBxwFAAUUBSAF1\n        AxgBIgMCAQMDAAEBAwQBBgMKAQ4DGgElAjcBOQFbAkgBZgGiAUQBQgGOAcoBPQE8AZ0B1gE9ATkBnwHY\n        AUEBPgGVAdEBQwFBAYgBxwFFAUEBgwHCAUUBQQGDAcIBRAFDAYcBxgFBAT4BlQHRAT0BOQGfAdgBPQE8\n        AZ0B1gFCAUABjwHLAkgBaAGlAjkBPQFhAxwBJwMLAQ8DBAEGAwABAQwAAywBRAGBAkAB/QJZAUkB9QFe\n        AU8BTQH6AWoBYwFTAfwCqAGnAf0CqAGmAf0BagFlAVkB/ANfAfsBagFkAVoB/ANfAfsBXQJOAfABZwJZ\n        AfIBZAFUAVMB8QFnAlkB8gJlAVIB9ANfAfsDTgGYGAADAwEEAwsBDwMNARIDCgENAwUBBwMBAQIIAAMF\n        AQcDEQEXAyoBQAFPAU0BQgGBAYIBdwE+Ab0B3QG4AQ4B9QH/AdwBAAL/AdkBAAH/AeYBwgEGAfoBsAGa\n        AScB3gFjAV4BRAGaAiEBIAEvBAADAQECAxABFgEyATMBNAFRAUcBUwFcAZQBQgFsAZEBygEkAYoB4AH3\n        ARwBmAL/ARsBkQH1Af8BLgGBAccB7AFFAWoBiAHDAUcBVAFfAZkBRQFLAVIBhwFEAUsBUgGGAUYBVAFe\n        AZcBRQFpAYUBwAEwAX8BwgHqAR0BjQHwAf4BHAGYAv8BIQGJAeMB+AFBAW4BlgHOAUcBUwFdAZYBMwE0\n        ATUBVAMSARkDAQECAwABAQMKAQ0DIgEyAjgBOwFfAkYBWAGPAUYBQwGFAcIBPAE3AacB3QE5ATUBrQHh\n        AT0BPAGdAdYBRwFGAXgBtgFIAUcBXAGVAkQBUQGGAkQBUQGGAkYBWQGSAUcBRQF2AbUBQAE8AZ0B1QE5\n        ATcBrAHgATwBNwGnAd0BRQFCAYgBxAJHAVwBlAI5AT0BYQMjATQDCwEPAwABAQwAAzsBZANfAfsBZQFi\n        AVIB9ANcAfgBZgFfAU8B/AFlAV4BTwH8A18B+wNfAfsDXwH7A18B+wNqAfkBZAFUAVMB8QJtAWMB9wNc\n        AfgDXwH7A1wB+ANfAfsDOgFhQAADDwEUAS0CLAFEAU8BTQFCAYEBkgGDATkByQHOAbMBHAHrAecBwwEK\n        AfgB1QG2ARIB8gGiAY8BMAHUAVwBWAFDAZEDHwEtBwABAQMKAQ4DHwEtATcBOAE6AVwBRwFXAWQBngEw\n        AYABxAHqAR0BmwL/ARwBmAL/AR8BiwHrAfwBKgGGAdYB8QE0AX8BvwHmATcBfAG4AeEBNwF8AbgB4QE1\n        AX8BvgHlASoBhgHSAfABHwGLAesB/AEcAZcB/gH/AR0BmwL/ASwBgwHLAe0BRwFaAWkBpAE4ATkBOwFe\n        AiABIQEvAwsBDwMAAQEEAAMOARMBNgE1ATgBWQFIAUcBZAGfAUYBQwGDAcEBPwE8AZoB0wE8ATcBpQHc\n        ATwBNwGmAdwBRAFCAY4BygJGAVoBkgI1ATYBVgMoATwDKAE8AjMBNQFTAkYBWAGPAUUBQQGOAckBPAE3\n        AaYB3AE8ATcBpQHcAT8BPAGaAdMBRQFDAYYBwwFJAUgBZgGhAjcBOgFcAxIBGBAAA0wBkgNcAfgBZQFi\n        AVIB9AJtAVIB9wOoAf0DqAH9AWsBZwFdAfwDqAH9AWwBaAFiAfwBawFmAV4B/ANcAfgBZAFUAVMB8QFl\n        AWMBUgH0AmoBZQH5AV4BUAFNAfoCYgFXAfYDXQHtAycBO0AAAwQBBgMQARUDJwE7AUoBSQFAAXkBcwFs\n        AUIBrwG1AZ0BJQHiAZkBigE1Ac8BSgFIAUABeAMmATkDDgETAwEBAgQAAwYBCAMQARUDIwEzAT8BQgFF\n        AXABRwFoAYUBvQE0AYMBwgHmASkBiQHYAfEBHwGLAesB/AEcAZYB/QH/AR4BmwL/AR4BnQL/AR4BnQL/\n        AR4BmwL/ARwBlgH9Af8BHwGRAe8B/QEpAYoB2QHyATQBgwHFAeYBRQFpAYgBwAFAAUQBSAF1AyQBNQMQ\n        ARYDBgEICAADDwEUAjcBOgFcAUgBRwFnAaMBRQFCAYgBxAFAATwBmwHUAT8BPAGXAdMBRgFDAYUBwgJI\n        AWYBogI7AUABZwMfAS0DDgETAw4BEwMdASkCOgE+AWQBSQFHAWUBoAJFAYMBwAE/ATwBlwHTAUABPAGb\n        AdQBQwFBAYkBxwFJAUcBaAGkAjgBPAFfAxIBGBAAAVQCUwGsA1kB9QFfAV0BTAHzAm0BUgH3AVYCTQH6\n        A2oB+QNqAfkBVAJNAfoDagH5AVYCTQH6AmIBXQH2Am0BYAH3A18B+wNfAfsDXAH4AmoBZAH5AVsCWQHE\n        AxkBI0gAAw0BEgIpASgBPQFDAUIBPQFtAWUBYAFEAZ8BWAFVAUMBjQMmATgDBwEKAwQBBQMBAQIEAAMC\n        AQMDBgEIAxIBGAMoATwBPgFBAUQBbwFHAVcBYwGcAUMBbAGMAcYBMAGBAcYB6wEbAZEB9gH/AR4BnQL/\n        AR8BogL/AR8BogL/AR4BnQL/ARsBkgH3Af8BLgGCAcgB7AFBAW0BkgHJAUcBVwFjAZ0BPwFDAUYBcgIq\n        ASsBQAMSARkDBgEIAwIBAwgAAwoBDgMmATkCPQFCAWsBSAFGAWABmgFFAUIBiAHEAUYBQwGDAcICRgFZ\n        AZACNwE5AVsDIwE0AxABFQMFAQcDBQEHAw8BFAMiATICNgE5AVoCRgFVAYsCRQGDAcABRAFDAYkBxgFI\n        AUcBYwGeAj4BQwFtAicBKAE7AwwBEBAAAV4CWwHZAWQBVQFTAfEBZwJZAfICYgFJAfYCbQFSAfcCbQFS\n        AfcCbQFSAfcDXAH4A1wB+ANqAfkDagH5AmoBaQH5A2oB+QFcAU4BTQH6AVwBTgFNAfoCqAGFAf0DUQGi\n        Aw0BEUgAAwQBBgMPARQDGQEjAiIBIQExAx8BLAMOARMDBAEFAwABAQ8AAQEDBQEHAxEBFwMjATMBNwE4\n        AToBXAFHAVMBXAGUAUQBawGKAcQBOAF7AbMB4AErAYcB0wHwASIBjQHlAfgBIgGNAeUB+AEqAYYB1gHx\n        ATcBfAG1AeEBRAFqAYwBxQFHAVQBXwGZATgBOQE7AV4DJAE1AxIBGQMFAQcDAAEBDAADBgEIAxQBGwEn\n        ASYBJwE6Aj0BQgFrAkgBZwGiAUgBRwFkAZ8COQE8AWADGgElAwwBEAMFAQcDAQECAwEBAgMFAQcDCwEP\n        AxoBJAI2ATkBWgFIAUcBYgGdAUkBRwFoAaQBPwE+AUUBcAMnATsDFAEcAwcBCRAAA1wB+AFkAlkB7AFi\n        AlgB7wFnAlkB8gFnAlkB8gFnAlkB8gFfAV0BTAHzAV8BXQFMAfMCYgFJAfYBYAFRAU0B+gFeAVEBTQH6\n        AmoBZAH5AV4BTwFNAfoBagFhAT4B/AKoAYUB/QNfAfsBRgJFAX4DAQECYwABARgAAwYBCAMQARUDIAEu\n        ATIBMwE0AVIBPwFDAUYBcQFFAUwBUgGEAUYBUQFaAY4BRwFUAV4BlAFHAVQBXgGUAUYBUgFbAY8BRQFM\n        AVIBhAE/AUMBRwFyATQBNQE2AVUCIAEhAS8DEAEWAwcBCRQAAwMBBAMKAQ0DFAEcAyYBOQI3ATkBWwE2\n        ATUBOAFZAyIBMgMKAQ4DAwEEAwABAQsAAQEDAgEDAwoBDgMgAS4CNQE4AVgCNwE6AVwDKAE8AxQBHAMK\n        AQ0DAwEEDAADDQERAVwCVwHfAVgCVgG8AVUCUwGwA1QBrwFWAlQBqwFTAlIBqAFSAlEBoQFQAk8BmwNQ\n        AZoDTAGTA0wBkwNKAY0DSgGKAUkCSAGIAUkCSAGIA1ABmgMoAT2AAAMCAQMDBQEHAwoBDQMQARYDFQEd\n        AxgBIgMbASYDHAEnAxwBJwMbASYDGAEiAxYBHgMQARYDCgENAwUBBwMCAQMXAAEBAwMBBAMGAQgDCgEO\n        Aw8BFAMOARMDCgENAwQBBQMBAQIQAAMBAQIDBAEFAwkBDAMOARMDDwEUAwsBDwMGAQgDAwEEAwABARAA\n        AysBQgMIAQvDAAEBAwAEAQQCBAMEBAEFAwQBBQMEAQUDBAEFAwMBBAMCAQMDAQECAwABAQMAAQEfAAEB\n        FwABARsAAQGAAAFCAU0BPgcAAT4DAAEoAwABYAMAATADAAEBAQABAQUAAUABAhYAA/8BAAH+AQAB/wHA\n        AQABAQYAAf4BAAH/AcABAAEBBgAB/AEAAX8BwAEAAQEGAAH+AQABPwHAAQABAQYAAf4BAAEfAcABAAEB\n        BgAB/gEAAQ8BwAEAAQEGAAH+AQABDwHAAQABAQYAAf4BAAEHAcABAAEBBgAB/AEAAQcBwAEAAQEGAAH8\n        AQABBwHAAQABAQYAAfwBAAEDAcABAAEBBgAB/AEAAQMBwAEAAQEGAAH8AQABAwHAAQABAQYAAfwBAAEB\n        AcABAAEBBgAB+AEAAQEBwAEAAQEGAAH4AQABAQHAAQABAQYAAbgBAAEBAcABAAEBBgABuAEAAQEBwAEA\n        AQEGAAH8AQABAwHAAQABAQYAAf8BAAF/AcABAAEBBgAB/wGAAX8BwAEAAQEGAAH/AYABPwHAAQABAwYA\n        Af8B4AF/AcABAAEHBgAB/wHwAX8BwAEAAQ8GAAP/AfgBAAEfAd8BfgH/AfEF/wHwAQABDwGAATwBAQHw\n        AX8B/wH9Ae8B/wHwAQABDwGAARgBAQHgAQ8B/wH4AQcB/wHAAQABAwGAAQABAQHgAQABHwH4AQcB/wGA\n        AQABAQGAAQABAQHAAgAB8AEBAf8BgAEAAQEBgAEAAQEBwAIAAeABAQH/AwABgAEAAQEBgAIAAeABAAF/\n        BgABgAIAAWABAAF/CwABHwgAAQEBgAEAAR8DAAHgAQABBwIAAQEBgAEAAQcBAAEYAQAB4AEAAQcB4AEA\n        AQEBgAEAAQcBAAEYAQAB4AEAAQcB4AEAAQMBgAEAAQEDAAHgAQABBwHgAQABAwkAAeABAAEDAmAHAAHg\n        AQABBwHgAWABAQYAAeABAAEHAf8B+AEBAwABgAEAAQEB4AEAAQcB/wH4AQABgAEAAQEBgAEAAQEB4AEA\n        AQcB/wH+AQABgAEAAQEBgAEAAQEB4AEAAQcB/wH+AQEBwAEAAQMBgAEAAQEB4AEAAQcC/wH7AfABAAEP\n        AYABGAEBAcABAAEPA/8B8AEAAQ8BgAE8AQEB5wX/AfgBAAEfAd8BfgT/Cw==\n</value>\n  </data>\n  <metadata name=\"imageListMasteryLevels.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>392, 17</value>\n  </metadata>\n  <data name=\"imageListMasteryLevels.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAB0\n        bAAAAk1TRnQBSQFMAgEBBgEAAUgBAAFIAQABGAEAARgBAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFg\n        AwABMAMAAQEBAAEgBgABSBIAAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/wAABYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb/AAAFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBv8AAAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        wAABYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb/AAAFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBv8AAAWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BZAFdAVUBwAFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BZAFdAVUBwAFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BZAFdAVUBwAFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BZAFdAVUBwAFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/wAABYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWUBXAFWAcEBlQGOAYcB4gGjAZ0BmAHpAYoBgQF7Ad0BYwFbAVUBvwFkAV0BVQHAAWUBXAFWAcEBZAFc\n        AVYBwgFkAVwBVgHBAWQBXAFWAcEBjQGDAX4B3gGmAaIBmwHqAYsBgwF+Ad4BZAFdAVUBwAFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWIBXAFWAcEBcAGAAYsB4gFzAYcBlAHlAV4BaQF0AdkBYwFbAVYBvwFkAV0BVQHA\n        AWIBWwFWAcEBYgFcAVYBwQFjAV0BVwHAAWQBXQFVAcABXgFtAXgB2gFyAYkBlgHmAW0BeQGCAd4BZAFd\n        AVUBwAFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb/AAAFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BaAFgAVkBxAGJAYIBegHeAXwBdgFuAdgBbAFkAV0ByAFl\n        AVwBVgHCAWYBYAFYAcYBaQFiAVwByQFpAWIBXAHJAWgBYQFZAccBZwFeAVgBxAFsAWUBXQHKAXwBcwFt\n        AdgBiQGDAXwB3gFlAVwBVgHBAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BZAFeAVsBxAFtAXYBeAHaAWABZgFq\n        AdEBZAFeAVoBxQFhAVwBVwHCAWQBXgFbAcYBZAFgAV0ByAFkAWABXgHIAWEBXgFbAccBZAFeAVkBxAFk\n        AV4BWwHGAWABYwFnAdEBcAF2AXsB2wFiAVwBVgHBAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBv8AAAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BagFhAVoBxwG4AbEBrgHv\n        AX4BdQFwAdkBbAFjAVwByAFlAVwBVgHCAW4BZgFfAcwBcQFqAWIB0AFuAWgBYAHPAXgBcAFsAdUBcQFq\n        AWIB0AFqAWMBXQHKAWcBXwFXAcUBawFlAV4ByQF+AXQBbwHZAboBuAGyAfABZwFgAVkBxAFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BZQFh\n        AVwBxwF1AZMBqgHtAWABZAFpAdIBZAFdAVoBxQFjAVwBVwHCAWQBYAFdAcgBYwJhAcsBZwJrAdMBZgFn\n        AWsB0wFgAWMBZAHNAWMBYgFfAckBZAFfAVoBxQFkAV4BWwHGAWMBZgFqAdEBcwGZAbEB7wFkAWABWwHE\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb/AAAFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AW8BaAFgAcsBkQGJAYMB4QF6AXIBbQHWAWQBXQFVAcABZgFfAVgBxgGRAYcBgwHgAZgBkwGO\n        AeUBdQFtAWUB1AHXAdUB0wH3AawBqQGiAewBbgFmAV4BzgFpAWIBXAHJAWQBXAFWAcIBfAFzAW0B2AGW\n        AY8BiQHjAWwBZAFdAcgBYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWgBZAFhAcsBbgFzAXcB2QFhAWQBaAHPAWQBXQFVAcABZAFeAVsBxgJi\n        AWEBzAFiAWUBaAHQAYQBuQHMAfYBgAGqAbsB8QFfAWQBaQHSAWIBZQFmAc4BZAFgAV4ByAFjAVwBVwHC\n        AWABZgFnAdEBcAF4AX0B3AFlAWEBXAHHAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb/AAAFj\n        AVsBVgG/AWMBWwFWAb8BZAFdAVUBwAFqAWEBWwHHAYcBgAF6Ad0BdQFtAWgBzwFuAWcBYAHLAWQBXAFW\n        AcEBaAFfAVkBxwGRAYoBhAHhAZ0BlwGRAecBhgF9AXcB3wHQAcwBywH2Ac0BywHIAfYBcwFrAWIB0wFr\n        AWMBWwHLAWcBXgFYAcQBcgFsAWQBzwF5AXEBagHSAX8BeQFyAdkBbAFkAV0ByAFkAV0BVQHAAWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BZAFdAVUBwAFlAWEBXAHHAW0BeAF9AdwBZwJkAc0BZAFg\n        AV0ByAFiAVsBVgHBAWEBXgFbAccBYAFjAWQBzQFnAXIBeAHaAYABtQHMAfYBiQG/AdQB9wFhAW8BdAHZ\n        AWIBZQFoAdABYwFhAWABygFkAV4BWQHEAWMBYQFgAcoDagHQAWwBcgF2AdgBZwFjAV4ByAFkAV0BVQHA\n        AWMBWwFWAb8BYwFbAVYBv8AAAWMBWwFWAb8BYwFbAVYBvwFnAV8BWQHDAW4BaAFgAc0BlgGPAYkB5AF2\n        AW8BagHRAWwBZwFdAcoBZAFbAVYBwQFoAV8BWQHHAZEBiQGDAeEBnAGUAY4B5gGoAaIBnQHrAZABiQGE\n        AeMBvAG4AbYB8QGDAXsBdQHbAWoBYwFdAcoBZwFeAVgBxAFxAWoBYgHOAX0BdgFwAdUBjAGHAYMB4AF1\n        AWwBZQHQAWcBXwFZAcMBYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFkAV0BVwHCAWgBZQFg\n        AcoBcAGAAYsB4gNoAc8BYQFeAVsBxwFiAVwBVgHBAWEBXgFbAccDYgHMAXMBiQGTAeUBbgGLAZgB6AF2\n        AZsBrgHuAWsBfgGGAeABYQFkAWgBzwFjAWEBYAHKAWMBXQFZAcMBYwFhAWABygNrAdMBbQF6AYAB3gFp\n        AWYBYgHMAWQBXQFXAcIBYwFbAVYBvwFjAVsBVgG/wAABYwFbAVYBvwFlAVwBVgHBAWcBXwFYAcMBZwFe\n        AVgBxAFsAWcBXQHKAX8BeQFyAdkBeQFxAWwB1QFkAV0BVQHAAWcBXgFYAcQBjQGHAYEB3wGWAY8BiQHk\n        Ab8BugG2AfEBeAFwAWoB1wGeAZkBkgHnAYkBgwF8Ad4BaAFhAVkBxwFkAVwBVgHCAXsBdAFuAdcBgwF9\n        AXcB2gFpAWEBWQHHAWcBXgFZAcQBZwFfAVkBwwFlAVwBVgHBAWMBWwFWAb8BYwFbAVYBvwFiAVwBVgHB\n        AWYBXwFZAcMBZAFeAVsBxAFpAWQBYgHMAW0CbgHUAmIBZgHOAWMBWwFWAb8BZAFeAVsBxAFjAWIBXwHJ\n        AX0BnQGpAewBaAF2AX0B3AFtAYQBjAHjAXYBjwGXAecCYgFhAcwBYQFeAVsBxwFiAVwBVgHBAWIBZAFm\n        AdABbQJyAdYBZwFjAV4ByAFlAV8BWgHFAWQBXgFZAcQBYgFcAVYBwQFjAVsBVgG/wAABZQFcAVYBwQFv\n        AWYBXwHMAXcBbwFnAdMBfgF2AXAB2AGJAYEBfQHfAcUBwAG+AfMBggF7AXUB2wFoAV8BWgHFAWQBXAFW\n        AcEBcwFqAWUBzgFzAWsBZgHRAX4BdgFwAdgBbgFmAV8BzgF3AW8BZwHTAXEBagFiAc4BZgFdAVgBwwFp\n        AWABWwHGAYEBeAFyAdoBzAHKAccB9gGMAYUBfwHgAYIBfAF2AdoBeQFzAWwB1QFyAWwBZAHPAWUBXAFW\n        AcEBYgFcAVYBwQFoAWQBYQHLAmoBaAHQAW0BbgFwAdQBcAF2AXsB2wF1AZoBtwHwAV8BZwFrAdMBYwFd\n        AVkBwwFiAVsBVgHBAWQBXgFaAcUBbQJuAdQDaAHPAWYCagHRAWgBbAFqAdIBYQFeAVsBxwFjAV0BWQHD\n        AWQBXgFZAcQBYQFkAWoB0gFzAaIBwgHzAW0BdgF7AdoBbQFwAXIB1gNqAdIBaAFnAWQBzQFiAVwBVgHB\n        wAABZAFdAVUBwAFkAV0BVQHAAWQBXQFVAcABZAFdAVUBwAFkAV0BVQHAAWYBXQFYAcMBbgFmAV8BzwGB\n        AXgBcgHaAWgBXwFXAcUBZAFdAVUBwAFmAV0BWAHDAWcBXwFXAcUBZwFfAVcBxQFnAV4BWAHEAWIBWwFW\n        AcEBaAFgAVgBxgGBAXgBcgHaAW0BZgFeAc4BZAFcAVYBwgFkAV0BVQHAAWQBXQFVAcABZAFdAVUBwAFk\n        AV0BVQHAAWQBXAFVAcABZAFdAVUBwAFkAV0BVQHAAWQBXQFVAcABYgFcAVYBwQFiAVwBVgHBAWUBXwFa\n        AcUBbAFxAXMB2AFgAWYBZwHRAWQBXgFZAcQBZAFdAVUBwAFhAVwBVwHCAWQBXgFZAcQBZAFfAVoBxQFj\n        AV0BWQHDAWIBWwFWAcEBZAFeAVkBxAFgAWYBZwHRAWwBcQF2AdgBZgFfAVkBwwFiAVwBVgHBAWIBXAFW\n        AcEBZAFdAVcBwAFkAV0BVQHAAWQBXQFVAcDAAAFlAV4BWAHEAWYBXgFYAcYBZwFgAVoByAFpAWABWgHK\n        AWoBYQFbAcsBagFgAVoBzQFwAWYBYAHXAXEBbAFjAdUBjQGHAYEB3wFjAVsBVQG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BZAFdAVUBwAGRAYoBhQHhAXIBaQFiAdYBbwFoAWAB1gFsAWIBXAHO\n        AWkBYgFbAcwBaQFhAVoBygFpAV8BWQHJAWUBXgFYAccBZQFeAVcBxQFoAWUBYAHKAWoBaQFmAc4BagJs\n        AdIBbQFvAXIB1gFuAXMBeAHZAXABeAGAAd0BcQGXAbIB7wFvAYIBjQHjAV4BagF5AdsBYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWQBXQFVAcABWgFsAXsB3QFwAYMBkAHkAXIBlgGw\n        Ae4BbQF5AYIB3gFwAXYBewHbAWoBcAF0AdcBbQJuAdQCagFoAdABaQFmAWIBzMAAAWMBWwFWAb8BZAFd\n        AVUBwAFkAV0BVQHAAWQBXQFVAcABZAFdAVUBwAFkAV0BVQHAAWQBXQFVAcABZAFbAVYBwQFkAV0BVQHA\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWQBXQFVAcABZAFb\n        AVYBwQFkAV0BVQHAAWQBXQFVAcABZAFdAVUBwAFkAV0BVQHAAWQBXAFVAcABZAFdAVUBwAFkAV0BVQHA\n        AWQBXQFVAcABZAFdAVUBwAFkAV0BVwHAAWIBXAFWAcEBYgFcAVYBwQFiAVwBVgHBAWQBXQFXAcIBZgFf\n        AVkBwwFkAV0BVQHAAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWQBXQFVAcABZgFfAVkBwwFkAV0BVwHCAWIBXAFWAcEBZAFcAVYBwQFiAVwBVgHBAWQBXQFXAcABZAFd\n        AVUBwAFkAV0BVQHAwAABYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb/AAAFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBv8AAAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/wAABYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb/AAAFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBv8AAAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFb\n        AVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/\n        AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/wAABYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFkAV0BVQHAAWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFk\n        AV0BVQHAAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFk\n        AV0BVQHAAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFkAV0BVQHAAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFkAV0BVQHAAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFkAV0BVQHAAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFkAV0BVwHAAW4BZwFfAckBZAFdAVUBwAFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWQBXQFVAcABbwFnAWABygFkAV0BVwHAAWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWQBXQFVAcABkQGHAYMB4AGrAaQBoQHrAY0BhwGBAd8BYwFbAVYBvwFk\n        AV0BVQHAAWUBXAFWAcEBZAFcAVYBwgFkAVwBVgHBAWUBXAFWAcEBkgGMAYUB4AGwAaoBpQHsAYUBgAF6\n        AdsBYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWQBXQFVAcABigGAAXsB3QGwAaoBpQHsAZIBiAGD\n        AeABYwFbAVYBvwFkAV0BVQHAAWUBXAFWAcEBZAFcAVYBwgFkAVwBVgHBAWUBXAFWAcEBkQGKAYcB4QGz\n        Aa4BpwHtAX8BeQFyAdkBYwFbAVUBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWUBXAFWAcEBngGWAZAB5QGg\n        AZsBlgHoAYUBgAF5AdsBYwFbAVUBvwFkAV0BVQHAAWUBXAFWAcEBZAFcAVYBwgFkAVsBVgHBAWQBXQFV\n        AcABigGAAXsB3QGkAZ4BmQHqAZQBiwGHAeEBZAFdAVUBwAFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BZAFdAVcBwAFrAWUBXAHHAWgBYQFbAcQBYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BaAFjAVoBxQFrAWUBXAHHAWQBXQFVAcABYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWcBYAFZAcQBiQGDAXwB3gF9AXQBbwHZAWsBZQFeAckBZgFdAVgBwwFmAWABWAHGAWkBYgFc\n        AckBaQFiAVwByQFoAWEBWQHHAWcBXgFYAcQBbgFkAV4BywF8AXMBbQHYAYkBgwF8Ad4BZQFcAVYBwQFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWcBXwFZAcMBiQGDAXwB3gF9AXQBbwHZAW0BZgFeAckBZAFcAVYBwgFm\n        AWABWAHGAWoBYwFbAcgBaQFiAVwByQFoAWEBWQHHAWcBXgFYAcQBbgFkAV4BywF8AXYBbgHYAYkBggF6\n        Ad4BZQFcAVYBwQFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWkBYAFbAcYBigGAAXsB3QF8AXYBbgHYAWsBYwFb\n        AcgBZgFdAVgBwwFmAWABWAHGAWkBYgFcAckBaQFiAVwByQFoAWEBWQHHAWcBXgFYAcQBawFjAVwByQF8\n        AXYBbgHYAYkBgwF8Ad4BZQFdAVcBwgFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BaQFjAVsBxgFn\n        AV8BWQHDAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFoAWABWQHEAWgBYwFaAcUBYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFmAV0BWAHDAXABZwFh\n        AdUBegFyAWwB1gFtAWYBXgHJAWQBXAFWAcIBagFhAVsByAFtAWQBXAHMAXMBawFnAdMBcgFqAWQB0gFu\n        AWYBXgHOAWoBYwFdAcoBZwFfAVcBxQFuAWQBXgHLAXcBcAFpAdQBbwFoAWAB1gFkAVwBVgHCAWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFn\n        AV4BWAHEAbEBqQGnAe0BgwF7AXUB2wFsAWcBXQHKAWUBXAFWAcIBagFhAVsByAFxAWoBYgHQAXMBawFm\n        AdMBdwFwAWkB1AFwAWkBYQHPAWoBYwFdAcoBZwFfAVcBxQFvAWYBXwHMAYMBfQF2AdwBqwGnAaAB7AFl\n        AVwBVgHCAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFtAWYBXgHJAbQBsAGrAe4BfgF0AW8B2QFqAWEBWQHHAWQBXAFWAcIBbQFmAV8BzAFz\n        AWsBYwHRAXMBawFnAdMBcgFqAWQB0gFzAWsBZwHTAW4BZAFdAc0BZwFfAVcBxQFsAWMBXQHIAXwBcwFt\n        AdgBvwG6AbYB8QFpAWABWwHGAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWUBXAFWAcEBawFlAVwBxwFkAV0BVQHAAWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFk\n        AV0BVQHAAW0BZgFeAcgBZAFdAVUBwAFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFlAV8BVwHFAW0BZgFeAc4BfAF2AXAB2AFk\n        AV0BVQHAAWYBYAFYAcYBbQFkAVwBzAFvAWcBYAHRAZ8BlwGTAegBkAGKAYQB4wFxAWkBYQHSAW4BZgFf\n        Ac4BaQFiAVwByQFmAV0BWAHDAYEBeAFyAdoBbQFiAVwBzgFmAV0BWAHDAWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFsAWMBXQHIAZ8BmQGT\n        AecBfAFzAW4B2AFkAV0BVQHAAWYBXwFYAcYBawFiAVwBzAGMAYYBfwHgAZwBlwGQAecBrwGnAaUB7QGC\n        AXsBdgHcAW4BZgFeAc4BaQFiAVwByQFmAV0BWAHDAXwBdgFuAdgBowGcAZcB6AFpAWABWgHGAWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwF2\n        AW4BaAHPAYgBgAF7Ad0BeQFxAWwB1QFkAV0BVQHAAWYBXwFYAcYBigGAAXsB3QGdAZcBkQHnAaMBnAGX\n        AekBjwGHAYEB4gGwAakBpgHtAYIBewF2AdoBaQFiAVsByQFmAV0BWAHDAXsBdAFuAdcBjQGHAYEB3wFv\n        AWgBYAHLAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWUBXAFWAcEBaAFjAVoBxQFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWkBYwFb\n        AcYBZAFdAVcBwAFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BZgFdAVgBwwFqAWABWgHNAWkBYgFcAckBcgFsAWQBzwFkAVsBVgHBAWoBYQFb\n        AcgBbgFmAV8BzgFxAWoBYgHTAaMBnAGYAeoBmAGSAYsB5gF2AW4BZwHWAW8BagFgAdEBawFjAVsBywFn\n        AV4BWAHEAXUBbgFoAdIBaQFiAVkByQFrAWEBWwHLAWYBXQFYAcMBYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BZgFdAVgBwwFqAWABWgHNAWkBYgFbAckBdQFuAWgB0gFi\n        AVsBVgHBAWgBYQFZAccBbAFkAV0BzQGPAYgBggHiAaIBmgGXAeoBtQGuAasB8AGDAX4BdwHeAXABaAFg\n        AdABawFjAVsBywFnAV4BWAHEAXoBcgFtAdQBZwFgAVoByAFrAWEBWwHLAWYBXQFYAcMBYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWQBXQFVAcABbAFjAV0ByAGQAYcBgwHgAXMBbAFl\n        Ac8BbAFlAV0BygFlAVwBVgHBAWgBYQFZAccBjQGDAX0B3wGiAZsBlAHpAagBogGeAesBlQGPAYgB5QGz\n        Aa8BrAHvAYQBfQF2AdwBawFjAVsBywFnAV4BWAHEAXEBagFiAc4BdwFvAWoB0QGGAX4BeQHcAWsBZQFe\n        AckBZAFdAVUBwAFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWUBXAFWAcEBaAFjAVoBxQFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWkBYwFbAcYBZAFdAVcBwAFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWQBWwFW\n        AcEBZQFdAVcBxQFtAWQBXgHQAWoBYwFdAcoBcwFqAWIBzgFkAVsBVgHBAWgBYQFZAccBbgFmAV4BzgFx\n        AWoBYgHTAaIBmwGYAeoBlgGPAYkB5QF0AWwBYwHVAXABaAFgAdABagFjAV0BygFmAV0BWAHDAXYBbwFm\n        AdEBaQFhAVoBygFsAWIBXAHOAWYBXgFYAcYBZAFbAVYBwQFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWQBWwFWAcEBZQFdAVcBxQFtAWQBXgHQAWoBYwFcAcoBdgFvAWcB0QFiAVsBVgHBAWgBXwFZ\n        AccBbAFkAVwBzQGRAYgBggHhAZ8BmQGTAekBsQGtAakB7wGEAXwBdgHdAXABaAFgAdABagFjAV0BygFm\n        AV0BWAHDAXoBcgFtAdQBaQFgAVoBygFsAWIBXAHOAWYBXgFYAcYBZAFbAVYBwQFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWgBYAFZAcQBcAFoAWABzQGiAZwBlgHoAXYBbwFnAdEBbAFlAV0BygFk\n        AVwBVgHBAWgBXwFZAccBjQGCAX0B3wGgAZoBlQHoAagBogGdAesBkQGKAYYB5AGzAa4BqwHvAYQBfQF2\n        AdwBagFjAV0BygFnAV4BWAHEAW4BaAFgAc0BfAF2AXAB1QGYAZABigHkAXUBbQFlAdABaAFfAVoBxQFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWUBXAFW\n        AcEBawFlAVwBxwFkAV0BVQHAAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFkAV0BVQHAAW0BZgFeAcgBZAFdAVUBwAFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFkAV0BVQHAAWIBWwFWAcEBZAFcAVYBwgFm\n        AV4BWAHGAWsBYgFcAcwBfAF0AW4B1wFkAV0BVQHAAWcBXwFXAcUBawFjAVsBywFvAWgBYAHPAZ0BmAGS\n        AecBjwGIAYEB4gFvAWoBYAHRAWwBZAFcAc0BagFjAVsByAFlAVwBVgHBAX4BdwFwAdkBawFhAVsBywFl\n        AV4BWAHEAWQBXAFWAcIBZAFcAVYBwgFkAV0BVQHAAWMBWwFWAb8BYwFbAVYBvwFkAV0BVQHAAWIBWwFW\n        AcEBZAFcAVYBwgFmAV4BWAHGAWsBYgFcAcwBfAF2AXAB2AFkAV0BVQHAAWcBXwFXAcUBagFjAV0BygGL\n        AYEBfQHfAZwBlAGQAeYBsQGpAaYB7QGCAXoBcwHaAWsBZAFcAcwBagFjAVsByAFiAVsBVgHBAX4BdQFv\n        AdkBagFhAVsBywFlAV4BWAHEAWQBXAFWAcIBZAFcAVYBwgFkAV0BVQHAAWMBWwFWAb8BYwFbAVYBvwFk\n        AV0BVQHAAWIBWwFWAcEBZAFcAVYBwgFmAV4BWAHGAWsBZAFcAc0BdAFuAWcB0wFkAV0BVQHAAWcBXwFX\n        AcUBigGBAXsB3QGdAZYBkgHmAaMBnAGXAekBjwGHAYEB4QGxAakBpwHtAX8BeQFyAdkBagFhAVsByAFk\n        AVwBVgHCAXoBcgFtAdYBaQFiAVsBzAFlAV4BWAHEAWQBXAFWAcIBZAFcAVYBwgFkAV0BVQHAAWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BaQFjAVsBxgFn\n        AV8BWQHDAWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFnAV8BWQHDAWkBYAFbAcYBYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BZAFdAVUBwAFlAV0BVwHFAWUBXgFYAccBaQFfAVkByQFpAWIBWwHMAW8BZgFg\n        AdcBfAFzAW0B2AFpAWABWwHGAWQBWwFWAcEBZgFgAVgBxgFqAWMBXQHKAXgBcgFqAdQBdQFtAWQB0gFr\n        AWMBXQHLAWoBYwFbAcgBZgFdAVgBwwFsAWQBXQHIAXkBcwFqAdcBcAFnAWEB2AFpAWEBWgHMAWkBYAFa\n        AcoBZwFgAVkByAFlAV4BVwHFAWQBXQFVAcABZAFdAVUBwAFlAV0BVwHFAWUBXgFYAccBaQFfAVkByQFp\n        AWIBWwHMAW8BZgFgAdcBeQFzAWoB1wFsAWQBXQHIAWQBXAFWAcEBZgFgAVgBxgF0AWwBZQHQAXcBbwFn\n        AdMBewF1AW4B1gFwAWkBYQHPAWoBYQFbAcgBZgFdAVgBwwFtAWYBXgHJAXcBcAFrAdUBcAFnAWEB2AFp\n        AWEBWgHMAWkBYAFaAcoBZwFgAVkByAFlAV4BVwHFAWQBXQFVAcABZAFdAVUBwAFlAV0BVwHFAWUBXgFY\n        AccBaQFfAVkByQFpAWIBWwHMAXABZwFhAdgBgQF4AXIB2gFoAV8BVwHFAWUBXAFWAcEBcAFoAWABzQF1\n        AW0BZwHSAXkBcwFsAdUBcwFsAWQB0gF7AXIBbQHWAW4BaAFgAc0BZgFdAVgBwwFoAWABWAHGAX4BdAFv\n        AdkBcAFnAWEB2AFpAWEBWgHMAWkBYAFaAcoBZwFgAVkByAFlAV4BVwHFAWQBXQFVAcABYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BZAFdAVcBwAFtAWYBXgHIAWgBYAFZ\n        AcQBYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BaAFhAVsBxAFr\n        AWUBXAHHAWQBXQFVAcABYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BZAFdAVUBwAFkAV0BVQHAAWQBXQFVAcABZAFdAVUBwAFkAV0BVQHAAWYBXQFYAcMBbQFlAV4BzgGB\n        AXgBcgHaAWkBYAFaAcYBZAFdAVUBwAFmAV0BWAHDAWcBXwFXAcUBZwFfAVcBxQFnAV4BWAHEAWUBXAFW\n        AcEBagFhAVkBxwGBAXgBcgHaAWoBYwFcAc0BZAFcAVYBwgFkAV0BVQHAAWQBXQFVAcABZAFdAVUBwAFk\n        AV0BVQHAAWQBXAFVAcABZAFdAVUBwAFkAV0BVQHAAWQBXQFVAcABZAFdAVUBwAFkAV0BVQHAAWYBXQFY\n        AcMBagFgAVoBzQGBAXgBcgHaAWkBYAFbAcYBZAFdAVUBwAFmAV0BWAHDAWcBXwFXAcUBZwFfAVcBxQFn\n        AV4BWAHEAWQBXAFWAcEBagFhAVoBxwF+AXUBcAHZAWkBYQFaAcwBZAFcAVYBwgFkAV0BVQHAAWQBXQFV\n        AcABZAFdAVUBwAFkAV0BVQHAAWQBXAFVAcABZAFdAVUBwAFkAV0BVQHAAWQBXQFVAcABZAFdAVUBwAFk\n        AV0BVQHAAWYBXQFYAcMBbwFnAWAB0QF+AXUBbwHZAWcBXgFYAcQBZAFdAVUBwAFmAV0BWAHDAWcBXwFX\n        AcUBZwFfAVcBxQFnAV4BWAHEAWIBWwFWAcEBaAFfAVcBxQGBAXgBcgHaAW4BaAFgAc8BZAFcAVYBwgFk\n        AV0BVQHAAWQBXQFVAcABZAFdAVUBwAFkAV0BVQHAAWQBXAFVAcABYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFlAVwBVgHBAW8BaAFgAcoBZAFdAVUBwAFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWQBXQFVAcABbwFoAWEBygFkAV0BVwHAAWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BZQFeAVgBxAFm\n        AV4BWAHGAWcBYAFaAcgBaQFgAVoBygFqAWEBWwHLAWoBYAFaAc0BcAFmAWAB1wFwAWkBYAHUAZQBigGH\n        AeEBYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWUBXAFWAcEBlQGOAYgB4gFw\n        AWkBYAHUAW8BaAFgAdYBbAFiAVwBzgFpAWIBWwHMAWkBYQFaAcoBaQFfAVkByQFlAV4BWAHHAWUBXgFX\n        AcUBZQFeAVgBxAFmAV4BWAHGAWcBYAFaAcgBaQFgAVoBygFqAWEBWwHLAWoBYAFaAc0BcAFmAWAB1wFu\n        AWcBXgHTAZUBjgGHAeIBYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWUBXAFW\n        AcEBlgGQAYoB4wFuAWUBYAHUAW8BaAFgAdYBbAFiAVwBzgFpAWIBWwHMAWkBYQFaAcoBaQFfAVkByQFl\n        AV4BWAHHAWUBXgFXAcUBZQFeAVgBxAFmAV4BWAHGAWcBYAFaAcgBaQFgAVoBygFqAWEBWwHLAWoBYAFa\n        Ac0BcAFmAWAB1wF2AW0BZgHYAYoBgwF+Ad4BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWQBXQFVAcABkgGIAYMB4AFzAWwBYwHYAW8BaAFgAdYBbAFiAVwBzgFpAWIBWwHMAWkBYQFa\n        AcoBaQFfAVkByQFlAV4BWAHHAWUBXgFXAcUBYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFkAV0BVQHAAWQBXQFV\n        AcABZAFdAVUBwAFkAV0BVQHAAWQBXQFVAcABZAFdAVUBwAFkAVsBVgHBAWQBXQFVAcABYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BZAFdAVUBwAFkAVsBVgHBAWQBXQFV\n        AcABZAFdAVUBwAFkAV0BVQHAAWQBXQFVAcABZAFcAVUBwAFkAV0BVQHAAWQBXQFVAcABYwFbAVYBvwFk\n        AV0BVQHAAWQBXQFVAcABZAFdAVUBwAFkAV0BVQHAAWQBXQFVAcABZAFdAVUBwAFkAVsBVgHBAWQBXQFV\n        AcABYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BZAFdAVUBwAFk\n        AVsBVgHBAWQBXQFVAcABZAFdAVUBwAFkAV0BVQHAAWQBXQFVAcABZAFcAVUBwAFkAV0BVQHAAWQBXQFV\n        AcABYwFbAVYBvwFkAV0BVQHAAWQBXQFVAcABZAFdAVUBwAFkAV0BVQHAAWQBXQFVAcABZAFdAVUBwAFk\n        AVsBVgHBAWQBXQFVAcABYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BZAFdAVUBwAFkAVsBVgHBAWQBXQFVAcABZAFdAVUBwAFkAV0BVQHAAWQBXQFVAcABZAFcAVUBwAFk\n        AV0BVQHAAWQBXQFVAcABYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFj\n        AVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFWAb8BYwFbAVYBvwFjAVsBVgG/AWMBWwFW\n        Ab8BQgFNAT4HAAE+AwABKAMAAWADAAEwAwABAQEAAQEFAAFAAQIWAAP//wD/AEMACw==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/NewPlanWindow.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class NewPlanWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.PlanNameLabel = new System.Windows.Forms.Label();\n            this.PlanNameTextBox = new System.Windows.Forms.TextBox();\n            this.btnOk = new System.Windows.Forms.Button();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.PlanDescriptionTextBox = new System.Windows.Forms.TextBox();\n            this.label2 = new System.Windows.Forms.Label();\n            this.SuspendLayout();\n            // \n            // PlanNameLabel\n            // \n            this.PlanNameLabel.AutoSize = true;\n            this.PlanNameLabel.Location = new System.Drawing.Point(15, 13);\n            this.PlanNameLabel.Name = \"PlanNameLabel\";\n            this.PlanNameLabel.Size = new System.Drawing.Size(135, 13);\n            this.PlanNameLabel.TabIndex = 0;\n            this.PlanNameLabel.Text = \"Enter a name for this plan:\";\n            // \n            // PlanNameTextBox\n            // \n            this.PlanNameTextBox.Location = new System.Drawing.Point(16, 30);\n            this.PlanNameTextBox.Name = \"PlanNameTextBox\";\n            this.PlanNameTextBox.Size = new System.Drawing.Size(264, 21);\n            this.PlanNameTextBox.TabIndex = 1;\n            this.PlanNameTextBox.TextChanged += new System.EventHandler(this.textBox1_TextChanged);\n            // \n            // btnOk\n            // \n            this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOk.Enabled = false;\n            this.btnOk.Location = new System.Drawing.Point(124, 159);\n            this.btnOk.Name = \"btnOk\";\n            this.btnOk.Size = new System.Drawing.Size(75, 23);\n            this.btnOk.TabIndex = 2;\n            this.btnOk.Text = \"OK\";\n            this.btnOk.UseVisualStyleBackColor = true;\n            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(205, 159);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 3;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // PlanDescriptionTextBox\n            // \n            this.PlanDescriptionTextBox.AcceptsReturn = true;\n            this.PlanDescriptionTextBox.Location = new System.Drawing.Point(16, 79);\n            this.PlanDescriptionTextBox.MaxLength = 255;\n            this.PlanDescriptionTextBox.Multiline = true;\n            this.PlanDescriptionTextBox.Name = \"PlanDescriptionTextBox\";\n            this.PlanDescriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n            this.PlanDescriptionTextBox.Size = new System.Drawing.Size(264, 72);\n            this.PlanDescriptionTextBox.TabIndex = 2;\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(15, 62);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(210, 13);\n            this.label2.TabIndex = 4;\n            this.label2.Text = \"Enter a description for this plan (optional):\";\n            // \n            // NewPlanWindow\n            // \n            this.AcceptButton = this.btnOk;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(292, 194);\n            this.Controls.Add(this.PlanDescriptionTextBox);\n            this.Controls.Add(this.label2);\n            this.Controls.Add(this.btnCancel);\n            this.Controls.Add(this.btnOk);\n            this.Controls.Add(this.PlanNameTextBox);\n            this.Controls.Add(this.PlanNameLabel);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"NewPlanWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"New Plan\";\n            this.Shown += new System.EventHandler(this.NewPlanWindow_Shown);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label PlanNameLabel;\n        private System.Windows.Forms.TextBox PlanNameTextBox;\n        private System.Windows.Forms.Button btnOk;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.TextBox PlanDescriptionTextBox;\n        private System.Windows.Forms.Label label2;\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/NewPlanWindow.cs",
    "content": "using System;\nusing System.Windows.Forms;\nusing EVEMon.Common.Controls;\n\nnamespace EVEMon.SkillPlanner\n{\n    public partial class NewPlanWindow : EVEMonForm\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"NewPlanWindow\"/> class.\n        /// </summary>\n        public NewPlanWindow()\n        {\n            InitializeComponent();\n            PlanName = string.Empty;\n            PlanDescription = string.Empty;\n        }\n\n        /// <summary>\n        /// Gets or sets the name of the plan.\n        /// </summary>\n        /// <value>The name of the plan.</value>\n        public string PlanName { get; set; }\n\n        /// <summary>\n        /// Gets or sets the plan description.\n        /// </summary>\n        /// <value>The plan description.</value>\n        public string PlanDescription { get; set; }\n\n        /// <summary>\n        /// Handles the Click event of the btnCancel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Cancel;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnOk control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnOk_Click(object sender, EventArgs e)\n        {\n            PlanName = PlanNameTextBox.Text;\n            PlanDescription = PlanDescriptionTextBox.Text;\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the TextChanged event of the textBox1 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void textBox1_TextChanged(object sender, EventArgs e)\n        {\n            btnOk.Enabled = !string.IsNullOrEmpty(PlanNameTextBox.Text);\n        }\n\n        /// <summary>\n        /// Handles the Shown event of the NewPlanWindow control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void NewPlanWindow_Shown(object sender, EventArgs e)\n        {\n            PlanNameTextBox.Text = PlanName;\n            PlanDescriptionTextBox.Text = PlanDescription;\n            PlanNameTextBox.SelectAll();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/NewPlanWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ObsoleteEntriesWindow.Designer.cs",
    "content": "﻿namespace EVEMon.SkillPlanner\n{\n    partial class ObsoleteEntriesWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.MainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.InformationTextLabel = new System.Windows.Forms.Label();\n            this.ObsoleteEntriesListView = new System.Windows.Forms.ListView();\n            this.EntryColumnHeader = new System.Windows.Forms.ColumnHeader();\n            this.StatusColumnHeader = new System.Windows.Forms.ColumnHeader();\n            this.ButtonFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n            this.KeepAllButton = new System.Windows.Forms.Button();\n            this.RemoveAllButton = new System.Windows.Forms.Button();\n            this.RemoveConfirmedButton = new System.Windows.Forms.Button();\n            this.MainTableLayoutPanel.SuspendLayout();\n            this.ButtonFlowLayoutPanel.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // MainTableLayoutPanel\n            // \n            this.MainTableLayoutPanel.ColumnCount = 1;\n            this.MainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.MainTableLayoutPanel.Controls.Add(this.InformationTextLabel, 0, 0);\n            this.MainTableLayoutPanel.Controls.Add(this.ObsoleteEntriesListView, 0, 1);\n            this.MainTableLayoutPanel.Controls.Add(this.ButtonFlowLayoutPanel, 0, 2);\n            this.MainTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.MainTableLayoutPanel.Location = new System.Drawing.Point(0, 0);\n            this.MainTableLayoutPanel.Name = \"MainTableLayoutPanel\";\n            this.MainTableLayoutPanel.RowCount = 3;\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.MainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MainTableLayoutPanel.Size = new System.Drawing.Size(395, 456);\n            this.MainTableLayoutPanel.TabIndex = 0;\n            // \n            // InformationTextLabel\n            // \n            this.InformationTextLabel.AutoSize = true;\n            this.InformationTextLabel.Location = new System.Drawing.Point(8, 8);\n            this.InformationTextLabel.Margin = new System.Windows.Forms.Padding(8);\n            this.InformationTextLabel.Name = \"InformationTextLabel\";\n            this.InformationTextLabel.Size = new System.Drawing.Size(369, 26);\n            this.InformationTextLabel.TabIndex = 0;\n            this.InformationTextLabel.Text = \"One or more skills exist in this plan that may have already completed, what do yo\" +\n                \"u want to do with these entries?\";\n            // \n            // ObsoleteEntriesListView\n            // \n            this.ObsoleteEntriesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.EntryColumnHeader,\n            this.StatusColumnHeader});\n            this.ObsoleteEntriesListView.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ObsoleteEntriesListView.Location = new System.Drawing.Point(10, 52);\n            this.ObsoleteEntriesListView.Margin = new System.Windows.Forms.Padding(10, 10, 10, 3);\n            this.ObsoleteEntriesListView.Name = \"ObsoleteEntriesListView\";\n            this.ObsoleteEntriesListView.Size = new System.Drawing.Size(375, 357);\n            this.ObsoleteEntriesListView.TabIndex = 0;\n            this.ObsoleteEntriesListView.UseCompatibleStateImageBehavior = false;\n            this.ObsoleteEntriesListView.View = System.Windows.Forms.View.Details;\n            // \n            // EntryColumnHeader\n            // \n            this.EntryColumnHeader.Text = \"Planned Entry\";\n            this.EntryColumnHeader.Width = 123;\n            // \n            // StatusColumnHeader\n            // \n            this.StatusColumnHeader.Text = \"Status\";\n            // \n            // ButtonFlowLayoutPanel\n            // \n            this.ButtonFlowLayoutPanel.AutoSize = true;\n            this.ButtonFlowLayoutPanel.Controls.Add(this.KeepAllButton);\n            this.ButtonFlowLayoutPanel.Controls.Add(this.RemoveAllButton);\n            this.ButtonFlowLayoutPanel.Controls.Add(this.RemoveConfirmedButton);\n            this.ButtonFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.ButtonFlowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.ButtonFlowLayoutPanel.Location = new System.Drawing.Point(3, 415);\n            this.ButtonFlowLayoutPanel.Name = \"ButtonFlowLayoutPanel\";\n            this.ButtonFlowLayoutPanel.Size = new System.Drawing.Size(389, 38);\n            this.ButtonFlowLayoutPanel.TabIndex = 2;\n            // \n            // KeepAllButton\n            // \n            this.KeepAllButton.Location = new System.Drawing.Point(275, 3);\n            this.KeepAllButton.Margin = new System.Windows.Forms.Padding(3, 3, 6, 8);\n            this.KeepAllButton.Name = \"KeepAllButton\";\n            this.KeepAllButton.Size = new System.Drawing.Size(108, 27);\n            this.KeepAllButton.TabIndex = 3;\n            this.KeepAllButton.Text = \"&Keep All\";\n            this.KeepAllButton.UseVisualStyleBackColor = true;\n            this.KeepAllButton.MouseLeave += new System.EventHandler(this.AnyButton_Leave);\n            this.KeepAllButton.Click += new System.EventHandler(this.KeepAllButton_Click);\n            this.KeepAllButton.Leave += new System.EventHandler(this.AnyButton_Leave);\n            this.KeepAllButton.Enter += new System.EventHandler(this.KeepAllButton_Focused);\n            this.KeepAllButton.MouseHover += new System.EventHandler(this.KeepAllButton_Focused);\n            // \n            // RemoveAllButton\n            // \n            this.RemoveAllButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.RemoveAllButton.Location = new System.Drawing.Point(161, 3);\n            this.RemoveAllButton.Margin = new System.Windows.Forms.Padding(3, 3, 3, 8);\n            this.RemoveAllButton.Name = \"RemoveAllButton\";\n            this.RemoveAllButton.Size = new System.Drawing.Size(108, 27);\n            this.RemoveAllButton.TabIndex = 2;\n            this.RemoveAllButton.Text = \"&Remove All\";\n            this.RemoveAllButton.UseVisualStyleBackColor = true;\n            this.RemoveAllButton.MouseLeave += new System.EventHandler(this.AnyButton_Leave);\n            this.RemoveAllButton.Click += new System.EventHandler(this.RemoveAllButton_Click);\n            this.RemoveAllButton.Leave += new System.EventHandler(this.AnyButton_Leave);\n            this.RemoveAllButton.Enter += new System.EventHandler(this.RemoveAllButton_Focused);\n            this.RemoveAllButton.MouseHover += new System.EventHandler(this.RemoveAllButton_Focused);\n            // \n            // RemoveConfirmedButton\n            // \n            this.RemoveConfirmedButton.Location = new System.Drawing.Point(47, 3);\n            this.RemoveConfirmedButton.Margin = new System.Windows.Forms.Padding(3, 3, 3, 8);\n            this.RemoveConfirmedButton.Name = \"RemoveConfirmedButton\";\n            this.RemoveConfirmedButton.Size = new System.Drawing.Size(108, 27);\n            this.RemoveConfirmedButton.TabIndex = 1;\n            this.RemoveConfirmedButton.Text = \"Remove &Confirmed\";\n            this.RemoveConfirmedButton.UseVisualStyleBackColor = true;\n            this.RemoveConfirmedButton.MouseLeave += new System.EventHandler(this.AnyButton_Leave);\n            this.RemoveConfirmedButton.Click += new System.EventHandler(this.RemoveConfirmedButton_Click);\n            this.RemoveConfirmedButton.Leave += new System.EventHandler(this.AnyButton_Leave);\n            this.RemoveConfirmedButton.Enter += new System.EventHandler(this.RemoveConfirmedButton_Focused);\n            this.RemoveConfirmedButton.MouseHover += new System.EventHandler(this.RemoveConfirmedButton_Focused);\n            // \n            // ObsoleteEntriesForm\n            // \n            this.AcceptButton = this.KeepAllButton;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.RemoveAllButton;\n            this.ClientSize = new System.Drawing.Size(395, 456);\n            this.Controls.Add(this.MainTableLayoutPanel);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"ObsoleteEntriesForm\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\n            this.Text = \"Remove Obsolete Entries\";\n            this.MainTableLayoutPanel.ResumeLayout(false);\n            this.MainTableLayoutPanel.PerformLayout();\n            this.ButtonFlowLayoutPanel.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel MainTableLayoutPanel;\n        private System.Windows.Forms.Label InformationTextLabel;\n        private System.Windows.Forms.ListView ObsoleteEntriesListView;\n        private System.Windows.Forms.ColumnHeader EntryColumnHeader;\n        private System.Windows.Forms.ColumnHeader StatusColumnHeader;\n        private System.Windows.Forms.FlowLayoutPanel ButtonFlowLayoutPanel;\n        private System.Windows.Forms.Button KeepAllButton;\n        private System.Windows.Forms.Button RemoveAllButton;\n        private System.Windows.Forms.Button RemoveConfirmedButton;\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ObsoleteEntriesWindow.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Actions to take on obsolete entries.\n    /// </summary>\n    public enum ObsoleteEntriesAction\n    {\n        None = 0,\n        KeepAll = 1,\n        RemoveAll = 2,\n        RemoveConfirmed = 3\n    }\n\n    /// <summary>\n    /// Displays a list of obsolete skills in the plan, allowing the user\n    /// to select an action. The action is returned to the caller.\n    /// </summary>\n    public partial class ObsoleteEntriesWindow : EVEMonForm\n    {\n        private readonly Plan m_plan;\n        private ObsoleteEntriesAction m_result = ObsoleteEntriesAction.None;\n        private ObsoleteEntriesAction m_previewResult = ObsoleteEntriesAction.None;\n\n\n        #region Static Methods\n\n        /// <summary>\n        /// Creates the dialog based upon a plan.\n        /// </summary>\n        /// <param name=\"plan\">Plan to display obsolete entries from</param>\n        /// <returns>Action to be taken</returns>\n        public static ObsoleteEntriesAction ShowDialog(Plan plan)\n        {\n            if (plan == null)\n                return ObsoleteEntriesAction.None;\n\n            if (!plan.ContainsObsoleteEntries)\n                return ObsoleteEntriesAction.None;\n\n            using (ObsoleteEntriesWindow form = new ObsoleteEntriesWindow(plan))\n            {\n                return form.ShowObsoleteEntriesDialog();\n            }\n        }\n\n        #endregion\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"plan\">Plan to display obsolete entries from</param>\n        private ObsoleteEntriesWindow(Plan plan)\n        {\n            InitializeComponent();\n\n            m_plan = plan;\n\n            if (Settings.UI.PlanWindow.ObsoleteEntryRemovalBehaviour == ObsoleteEntryRemovalBehaviour.RemoveConfirmed)\n            {\n                ObsoleteEntriesListView.Columns.RemoveAt(ObsoleteEntriesListView.Columns.Count - 1);\n                RemoveConfirmedButton.Visible = false;\n            }\n\n            UpdateListView();\n            AutoFitColumnHeaders();\n        }\n\n        #endregion\n\n\n        #region Private Helper Methods\n\n        /// <summary>\n        /// Displays the dialog and returns the Action Result.\n        /// </summary>\n        /// <returns></returns>\n        private ObsoleteEntriesAction ShowObsoleteEntriesDialog()\n        {\n            ShowDialog();\n            return m_result;\n        }\n\n        /// <summary>\n        /// Update the list view with items from the plan, colour if required.\n        /// </summary>\n        private void UpdateListView()\n        {\n            // if the user has already decided just let the window close\n            if (m_result != ObsoleteEntriesAction.None)\n                return;\n\n            ObsoleteEntriesListView.BeginUpdate();\n            ObsoleteEntriesListView.Items.Clear();\n\n            foreach (PlanEntry entry in m_plan.ObsoleteEntries)\n            {\n                var lvi = new ListViewItem(entry.ToString());\n\n                if (entry.CharacterSkill.LastConfirmedLvl >= entry.Level)\n                {\n                    lvi.SubItems.Add(\"Confirmed (API)\");\n                    lvi.Tag = true;\n                }\n                else\n                {\n                    lvi.SubItems.Add(\"Unconfirmed\");\n                    lvi.Tag = false;\n                }\n\n                FormatListViewItem(lvi);\n\n                ObsoleteEntriesListView.Items.Add(lvi);\n            }\n\n            ObsoleteEntriesListView.EndUpdate();\n        }\n\n        /// <summary>\n        /// Format a ListViewItem based upon its status and the current.\n        /// preview result.\n        /// </summary>\n        /// <param name=\"lvi\"><c>ListViewItem</c> to format</param>\n        /// <exception cref=\"NotImplementedException\"></exception>\n        private void FormatListViewItem(ListViewItem lvi)\n        {\n            bool confirmed = (bool)lvi.Tag;\n\n            switch (m_previewResult)\n            {\n                case ObsoleteEntriesAction.KeepAll:\n                    FormatListViewKeepStyle(lvi);\n                    break;\n                case ObsoleteEntriesAction.RemoveAll:\n                    FormatListViewRemoveStyle(lvi);\n                    break;\n                case ObsoleteEntriesAction.RemoveConfirmed:\n                    if (confirmed)\n                        FormatListViewRemoveStyle(lvi);\n                    else\n                        FormatListViewKeepStyle(lvi);\n                    break;\n                case ObsoleteEntriesAction.None:\n                    FormatListViewNormalStyle(lvi);\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Format the ListViewItem in the Normal Style.\n        /// </summary>\n        /// <param name=\"lvi\"><c>ListViewItem</c> to format</param>\n        private static void FormatListViewNormalStyle(ListViewItem lvi)\n        {\n            lvi.ForeColor = Color.Black;\n            lvi.Font = FontFactory.GetFont(lvi.Font);\n        }\n\n        /// <summary>\n        /// Format the ListViewItem in the Remove Style\n        /// </summary>\n        /// <param name=\"lvi\"><c>ListViewItem</c> to format</param>\n        private static void FormatListViewRemoveStyle(ListViewItem lvi)\n        {\n            lvi.ForeColor = Color.Red;\n            lvi.Font = FontFactory.GetFont(lvi.Font, FontStyle.Strikeout);\n        }\n\n        /// <summary>\n        /// Format the ListViewItem in the Keep Style\n        /// </summary>\n        /// <param name=\"lvi\"><c>ListViewItem</c> to format</param>\n        private static void FormatListViewKeepStyle(ListViewItem lvi)\n        {\n            lvi.ForeColor = Color.DarkGreen;\n            lvi.Font = FontFactory.GetFont(lvi.Font);\n        }\n\n        /// <summary>\n        /// Fit the column headers to their content\n        /// </summary>\n        private void AutoFitColumnHeaders()\n        {\n            foreach (ColumnHeader column in ObsoleteEntriesListView.Columns)\n            {\n                column.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);\n            }\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// Keep All Click\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void KeepAllButton_Click(object sender, EventArgs e)\n        {\n            m_result = ObsoleteEntriesAction.KeepAll;\n            Close();\n        }\n\n        /// <summary>\n        /// Remove All Click\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void RemoveAllButton_Click(object sender, EventArgs e)\n        {\n            m_result = ObsoleteEntriesAction.RemoveAll;\n            Close();\n        }\n\n        /// <summary>\n        /// Remove Confirmed Click\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void RemoveConfirmedButton_Click(object sender, EventArgs e)\n        {\n            m_result = ObsoleteEntriesAction.RemoveConfirmed;\n            Close();\n        }\n\n        /// <summary>\n        /// Keep All Mouse Hover / Enter\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void KeepAllButton_Focused(object sender, EventArgs e)\n        {\n            m_previewResult = ObsoleteEntriesAction.KeepAll;\n            UpdateListView();\n        }\n\n        /// <summary>\n        /// Remove All Mouse Hover / Enter\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void RemoveAllButton_Focused(object sender, EventArgs e)\n        {\n            m_previewResult = ObsoleteEntriesAction.RemoveAll;\n            UpdateListView();\n        }\n\n        /// <summary>\n        /// Remove Confirmed Mouse Hover / Enter\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void RemoveConfirmedButton_Focused(object sender, EventArgs e)\n        {\n            m_previewResult = ObsoleteEntriesAction.RemoveConfirmed;\n            UpdateListView();\n        }\n\n        /// <summary>\n        /// Any button Mouse/Focus Leave \n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void AnyButton_Leave(object sender, EventArgs e)\n        {\n            m_previewResult = ObsoleteEntriesAction.None;\n            UpdateListView();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ObsoleteEntriesWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/OverridenTreeView.cs",
    "content": "﻿using System.Globalization;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Derived from TreeView class.\n    /// <para>Overrides standard node double click behaviour to prevent node expand / collapse actions</para>\n    /// </summary>\n    internal class OverridenTreeView : TreeView\n    {\n        private const int WmLButtonDblClk = 0x203;\n\n        /// <summary>\n        /// Overrides <see cref=\"M:System.Windows.Forms.Control.WndProc(System.Windows.Forms.Message@)\"/>.\n        /// </summary>\n        /// <param name=\"m\">The Windows <see cref=\"T:System.Windows.Forms.Message\"/> to process.</param>\n        protected override void WndProc(ref Message m)\n        {\n            if (m.Msg == WmLButtonDblClk)\n                HandleDoubleClick(ref m);\n            else\n                base.WndProc(ref m);\n        }\n\n        /// <summary>\n        /// Handles the double click.\n        /// </summary>\n        /// <param name=\"m\">The message.</param>\n        private void HandleDoubleClick(ref Message m)\n        {\n            // Get mouse location from message.lparam\n            // x is low order word, y is high order word\n            string lparam = m.LParam.ToString(\"X08\");\n            int x = int.Parse(lparam.Substring(4, 4), NumberStyles.HexNumber, CultureConstants.\n                InvariantCulture);\n            int y = int.Parse(lparam.Substring(0, 4), NumberStyles.HexNumber, CultureConstants.\n                InvariantCulture);\n\n            // Test for a treenode at this location\n            TreeViewHitTestInfo info = HitTest(x, y);\n\n            if (info.Node == null)\n                return;\n\n            // Raise NodeMouseDoubleClick event\n            OnNodeMouseDoubleClick(new TreeNodeMouseClickEventArgs(info.Node, MouseButtons.Left, 2, x, y));\n        }\n\n        /// <summary>\n        /// Creates the handle.\n        /// </summary>\n        protected override void CreateHandle()\n        {\n            if (!IsDisposed)\n                base.CreateHandle();\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanColumnSelectWindow.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.SkillPlanner\n{\n    public sealed class PlanColumnSelectWindow : ColumnSelectWindow\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanColumnSelectWindow\"/> class.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        public PlanColumnSelectWindow(IEnumerable<PlanColumnSettings> settings)\n            : base(settings)\n        {\n        }\n\n        /// <summary>\n        /// Gets the header.\n        /// </summary>\n        /// <param name=\"key\">The key.</param>\n        /// <returns></returns>\n        protected override string GetHeader(int key) => ((PlanColumn)key).GetDescription();\n\n        /// <summary>\n        /// Gets all keys.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<int> AllKeys\n            => EnumExtensions.GetValues<PlanColumn>()\n                .Where(x => x != PlanColumn.None).Select(x => (int)x);\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<IColumnSettings> DefaultColumns\n        {\n            get\n            {\n                PlanWindowSettings settings = new PlanWindowSettings();\n                return settings.DefaultColumns;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanEditorControl.Designer.cs",
    "content": "using EVEMon.Common.Controls;\n\nnamespace EVEMon.SkillPlanner\n{\n    sealed partial class PlanEditorControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PlanEditorControl));\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.miChangeNote = new System.Windows.Forms.ToolStripMenuItem();\n            this.miChangePriority = new System.Windows.Forms.ToolStripMenuItem();\n            this.miChangeLevel = new System.Windows.Forms.ToolStripMenuItem();\n            this.miChangeTo0 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miChangeTo1 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miChangeTo2 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miChangeTo3 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miChangeTo4 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miChangeTo5 = new System.Windows.Forms.ToolStripMenuItem();\n            this.changeMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.miRemoveFromPlan = new System.Windows.Forms.ToolStripMenuItem();\n            this.MoveToTopMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.planMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.miShowInSkillBrowser = new System.Windows.Forms.ToolStripMenuItem();\n            this.miShowInSkillExplorer = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.miMarkOwned = new System.Windows.Forms.ToolStripMenuItem();\n            this.markOwnedMenuSeaprator = new System.Windows.Forms.ToolStripSeparator();\n            this.miCopyTo = new System.Windows.Forms.ToolStripMenuItem();\n            this.miCopyToNewPlan = new System.Windows.Forms.ToolStripMenuItem();\n            this.miCopySelectedToClipboard = new System.Windows.Forms.ToolStripMenuItem();\n            this.copyMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.miPlanGroups = new System.Windows.Forms.ToolStripMenuItem();\n            this.sfdSave = new System.Windows.Forms.SaveFileDialog();\n            this.tmrAutoRefresh = new System.Windows.Forms.Timer(this.components);\n            this.tsPlan = new System.Windows.Forms.ToolStrip();\n            this.tslMove = new System.Windows.Forms.ToolStripLabel();\n            this.tsbMoveUp = new System.Windows.Forms.ToolStripButton();\n            this.tsbMoveDown = new System.Windows.Forms.ToolStripButton();\n            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\n            this.tslSort = new System.Windows.Forms.ToolStripLabel();\n            this.tsSortPriorities = new System.Windows.Forms.ToolStripButton();\n            this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();\n            this.tsbToggleSkills = new System.Windows.Forms.ToolStripButton();\n            this.tsbToggleRemapping = new System.Windows.Forms.ToolStripButton();\n            this.tssColorKey = new System.Windows.Forms.ToolStripSeparator();\n            this.tsbColorKey = new System.Windows.Forms.ToolStripButton();\n            this.ilIcons = new System.Windows.Forms.ImageList(this.components);\n            this.tmrSelect = new System.Windows.Forms.Timer(this.components);\n            this.pFooter = new System.Windows.Forms.Panel();\n            this.gbColorKey = new System.Windows.Forms.GroupBox();\n            this.flpColorKey = new System.Windows.Forms.FlowLayoutPanel();\n            this.lblTrainable = new System.Windows.Forms.Label();\n            this.lblNonPublic = new System.Windows.Forms.Label();\n            this.lblPrereqNotMet = new System.Windows.Forms.Label();\n            this.lblDepended = new System.Windows.Forms.Label();\n            this.lblQueued = new System.Windows.Forms.Label();\n            this.lblPrereqMetNotKnown = new System.Windows.Forms.Label();\n            this.lblDowntime = new System.Windows.Forms.Label();\n            this.lblCurrentlyTraining = new System.Windows.Forms.Label();\n            this.lblPartiallyTrained = new System.Windows.Forms.Label();\n            this.lblOmegaOnly = new System.Windows.Forms.Label();\n            this.pscPlan = new EVEMon.Common.Controls.PersistentSplitContainer();\n            this.lvSkills = new EVEMon.Common.Controls.DraggableListView();\n            this.tlpHeader = new System.Windows.Forms.TableLayoutPanel();\n            this.implantSetterPanel = new System.Windows.Forms.Panel();\n            this.lblChooseImplantSet = new System.Windows.Forms.Label();\n            this.cbChooseImplantSet = new System.Windows.Forms.ComboBox();\n            this.tsPreferences = new System.Windows.Forms.ToolStrip();\n            this.preferencesMenu = new System.Windows.Forms.ToolStripDropDownButton();\n            this.columnSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.autoSizeColumnsMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.skillSelectControl = new EVEMon.SkillPlanner.SkillSelectControl();\n            this.contextMenu.SuspendLayout();\n            this.tsPlan.SuspendLayout();\n            this.pFooter.SuspendLayout();\n            this.gbColorKey.SuspendLayout();\n            this.flpColorKey.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pscPlan)).BeginInit();\n            this.pscPlan.Panel1.SuspendLayout();\n            this.pscPlan.Panel2.SuspendLayout();\n            this.pscPlan.SuspendLayout();\n            this.tlpHeader.SuspendLayout();\n            this.implantSetterPanel.SuspendLayout();\n            this.tsPreferences.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.miChangeNote,\n            this.miChangePriority,\n            this.miChangeLevel,\n            this.changeMenuSeparator,\n            this.miRemoveFromPlan,\n            this.MoveToTopMenuItem,\n            this.planMenuSeparator,\n            this.miShowInSkillBrowser,\n            this.miShowInSkillExplorer,\n            this.showInMenuSeparator,\n            this.miMarkOwned,\n            this.markOwnedMenuSeaprator,\n            this.miCopyTo,\n            this.copyMenuSeparator,\n            this.miPlanGroups});\n            this.contextMenu.Name = \"cmsContextMenu\";\n            this.contextMenu.Size = new System.Drawing.Size(217, 254);\n            this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenu_Opening);\n            // \n            // miChangeNote\n            // \n            this.miChangeNote.Name = \"miChangeNote\";\n            this.miChangeNote.Size = new System.Drawing.Size(216, 22);\n            this.miChangeNote.Text = \"View/Change Note...\";\n            this.miChangeNote.Click += new System.EventHandler(this.miChangeNote_Click);\n            // \n            // miChangePriority\n            // \n            this.miChangePriority.Name = \"miChangePriority\";\n            this.miChangePriority.Size = new System.Drawing.Size(216, 22);\n            this.miChangePriority.Text = \"Change Priority...\";\n            this.miChangePriority.Click += new System.EventHandler(this.miChangePriority_Click);\n            // \n            // miChangeLevel\n            // \n            this.miChangeLevel.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.miChangeTo0,\n            this.miChangeTo1,\n            this.miChangeTo2,\n            this.miChangeTo3,\n            this.miChangeTo4,\n            this.miChangeTo5});\n            this.miChangeLevel.Image = ((System.Drawing.Image)(resources.GetObject(\"miChangeLevel.Image\")));\n            this.miChangeLevel.Name = \"miChangeLevel\";\n            this.miChangeLevel.Size = new System.Drawing.Size(216, 22);\n            this.miChangeLevel.Text = \"Change Planned Level...\";\n            // \n            // miChangeTo0\n            // \n            this.miChangeTo0.Name = \"miChangeTo0\";\n            this.miChangeTo0.Size = new System.Drawing.Size(117, 22);\n            this.miChangeTo0.Tag = \"0\";\n            this.miChangeTo0.Text = \"Remove\";\n            this.miChangeTo0.Click += new System.EventHandler(this.miChangeToLevel_Click);\n            // \n            // miChangeTo1\n            // \n            this.miChangeTo1.Name = \"miChangeTo1\";\n            this.miChangeTo1.Size = new System.Drawing.Size(117, 22);\n            this.miChangeTo1.Tag = \"1\";\n            this.miChangeTo1.Text = \"Level 1\";\n            this.miChangeTo1.Click += new System.EventHandler(this.miChangeToLevel_Click);\n            // \n            // miChangeTo2\n            // \n            this.miChangeTo2.Name = \"miChangeTo2\";\n            this.miChangeTo2.Size = new System.Drawing.Size(117, 22);\n            this.miChangeTo2.Tag = \"2\";\n            this.miChangeTo2.Text = \"Level 2\";\n            this.miChangeTo2.Click += new System.EventHandler(this.miChangeToLevel_Click);\n            // \n            // miChangeTo3\n            // \n            this.miChangeTo3.Name = \"miChangeTo3\";\n            this.miChangeTo3.Size = new System.Drawing.Size(117, 22);\n            this.miChangeTo3.Tag = \"3\";\n            this.miChangeTo3.Text = \"Level 3\";\n            this.miChangeTo3.Click += new System.EventHandler(this.miChangeToLevel_Click);\n            // \n            // miChangeTo4\n            // \n            this.miChangeTo4.Name = \"miChangeTo4\";\n            this.miChangeTo4.Size = new System.Drawing.Size(117, 22);\n            this.miChangeTo4.Tag = \"4\";\n            this.miChangeTo4.Text = \"Level 4\";\n            this.miChangeTo4.Click += new System.EventHandler(this.miChangeToLevel_Click);\n            // \n            // miChangeTo5\n            // \n            this.miChangeTo5.Name = \"miChangeTo5\";\n            this.miChangeTo5.Size = new System.Drawing.Size(117, 22);\n            this.miChangeTo5.Tag = \"5\";\n            this.miChangeTo5.Text = \"Level 5\";\n            this.miChangeTo5.Click += new System.EventHandler(this.miChangeToLevel_Click);\n            // \n            // changeMenuSeparator\n            // \n            this.changeMenuSeparator.Name = \"changeMenuSeparator\";\n            this.changeMenuSeparator.Size = new System.Drawing.Size(213, 6);\n            // \n            // miRemoveFromPlan\n            // \n            this.miRemoveFromPlan.Name = \"miRemoveFromPlan\";\n            this.miRemoveFromPlan.Size = new System.Drawing.Size(216, 22);\n            this.miRemoveFromPlan.Text = \"Remove from Plan\";\n            this.miRemoveFromPlan.Click += new System.EventHandler(this.miRemoveFromPlan_Click);\n            // \n            // MoveToTopMenuItem\n            // \n            this.MoveToTopMenuItem.Name = \"MoveToTopMenuItem\";\n            this.MoveToTopMenuItem.Size = new System.Drawing.Size(216, 22);\n            this.MoveToTopMenuItem.Text = \"Move to top of Plan\";\n            this.MoveToTopMenuItem.Click += new System.EventHandler(this.MoveToTopMenuItem_Click);\n            // \n            // planMenuSeparator\n            // \n            this.planMenuSeparator.Name = \"planMenuSeparator\";\n            this.planMenuSeparator.Size = new System.Drawing.Size(213, 6);\n            // \n            // miShowInSkillBrowser\n            // \n            this.miShowInSkillBrowser.Name = \"miShowInSkillBrowser\";\n            this.miShowInSkillBrowser.Size = new System.Drawing.Size(216, 22);\n            this.miShowInSkillBrowser.Text = \"Show in Skill &Browser\";\n            this.miShowInSkillBrowser.Click += new System.EventHandler(this.miShowInSkillBrowser_Click);\n            // \n            // miShowInSkillExplorer\n            // \n            this.miShowInSkillExplorer.Image = ((System.Drawing.Image)(resources.GetObject(\"miShowInSkillExplorer.Image\")));\n            this.miShowInSkillExplorer.Name = \"miShowInSkillExplorer\";\n            this.miShowInSkillExplorer.Size = new System.Drawing.Size(216, 22);\n            this.miShowInSkillExplorer.Text = \"Show in Skill &Explorer...\";\n            this.miShowInSkillExplorer.Click += new System.EventHandler(this.miShowInSkillExplorer_Click);\n            // \n            // showInMenuSeparator\n            // \n            this.showInMenuSeparator.Name = \"showInMenuSeparator\";\n            this.showInMenuSeparator.Size = new System.Drawing.Size(213, 6);\n            // \n            // miMarkOwned\n            // \n            this.miMarkOwned.Name = \"miMarkOwned\";\n            this.miMarkOwned.Size = new System.Drawing.Size(216, 22);\n            this.miMarkOwned.Text = \"Mark as Owned\";\n            this.miMarkOwned.Click += new System.EventHandler(this.miMarkOwned_Click);\n            // \n            // markOwnedMenuSeaprator\n            // \n            this.markOwnedMenuSeaprator.Name = \"markOwnedMenuSeaprator\";\n            this.markOwnedMenuSeaprator.Size = new System.Drawing.Size(213, 6);\n            // \n            // miCopyTo\n            // \n            this.miCopyTo.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.miCopyToNewPlan,\n            this.miCopySelectedToClipboard});\n            this.miCopyTo.Name = \"miCopyTo\";\n            this.miCopyTo.Size = new System.Drawing.Size(216, 22);\n            this.miCopyTo.Text = \"Copy selected entries to\";\n            // \n            // miCopyToNewPlan\n            // \n            this.miCopyToNewPlan.Name = \"miCopyToNewPlan\";\n            this.miCopyToNewPlan.Size = new System.Drawing.Size(152, 22);\n            this.miCopyToNewPlan.Text = \"New Plan...\";\n            this.miCopyToNewPlan.Click += new System.EventHandler(this.miCopyToNewPlan_Click);\n            // \n            // miCopySelectedToClipboard\n            // \n            this.miCopySelectedToClipboard.Name = \"miCopySelectedToClipboard\";\n            this.miCopySelectedToClipboard.Size = new System.Drawing.Size(152, 22);\n            this.miCopySelectedToClipboard.Text = \"Clipboard...\";\n            this.miCopySelectedToClipboard.Click += new System.EventHandler(this.miCopySelectedToClipboard_Click);\n            // \n            // copyMenuSeparator\n            // \n            this.copyMenuSeparator.Name = \"copyMenuSeparator\";\n            this.copyMenuSeparator.Size = new System.Drawing.Size(213, 6);\n            // \n            // miPlanGroups\n            // \n            this.miPlanGroups.Name = \"miPlanGroups\";\n            this.miPlanGroups.Size = new System.Drawing.Size(216, 22);\n            this.miPlanGroups.Text = \"Select entries from group...\";\n            // \n            // sfdSave\n            // \n            this.sfdSave.Filter = \"EVEMon Plan Format (*.emp)|*.emp|XML Format (*.xml)|*.xml|Text Format (*.txt)|*.t\" +\n    \"xt\";\n            this.sfdSave.Title = \"Save Plan As...\";\n            // \n            // tmrAutoRefresh\n            // \n            this.tmrAutoRefresh.Interval = 30000;\n            this.tmrAutoRefresh.Tick += new System.EventHandler(this.tmrAutoRefresh_Tick);\n            // \n            // tsPlan\n            // \n            this.tsPlan.Dock = System.Windows.Forms.DockStyle.Left;\n            this.tsPlan.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n            this.tsPlan.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tslMove,\n            this.tsbMoveUp,\n            this.tsbMoveDown,\n            this.toolStripSeparator1,\n            this.tslSort,\n            this.tsSortPriorities,\n            this.toolStripSeparator4,\n            this.tsbToggleSkills,\n            this.tsbToggleRemapping,\n            this.tssColorKey,\n            this.tsbColorKey});\n            this.tsPlan.Location = new System.Drawing.Point(0, 0);\n            this.tsPlan.Name = \"tsPlan\";\n            this.tsPlan.Size = new System.Drawing.Size(41, 558);\n            this.tsPlan.TabIndex = 0;\n            this.tsPlan.Text = \"planToolStrip\";\n            // \n            // tslMove\n            // \n            this.tslMove.Name = \"tslMove\";\n            this.tslMove.Size = new System.Drawing.Size(38, 15);\n            this.tslMove.Text = \"Move:\";\n            // \n            // tsbMoveUp\n            // \n            this.tsbMoveUp.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.tsbMoveUp.Enabled = false;\n            this.tsbMoveUp.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbMoveUp.Image\")));\n            this.tsbMoveUp.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbMoveUp.Name = \"tsbMoveUp\";\n            this.tsbMoveUp.Size = new System.Drawing.Size(38, 20);\n            this.tsbMoveUp.Text = \"Move up\";\n            this.tsbMoveUp.Click += new System.EventHandler(this.tsbMoveUp_Click);\n            // \n            // tsbMoveDown\n            // \n            this.tsbMoveDown.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.tsbMoveDown.Enabled = false;\n            this.tsbMoveDown.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbMoveDown.Image\")));\n            this.tsbMoveDown.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbMoveDown.Name = \"tsbMoveDown\";\n            this.tsbMoveDown.Size = new System.Drawing.Size(38, 20);\n            this.tsbMoveDown.Text = \"Move down\";\n            this.tsbMoveDown.Click += new System.EventHandler(this.tsbMoveDown_Click);\n            // \n            // toolStripSeparator1\n            // \n            this.toolStripSeparator1.Name = \"toolStripSeparator1\";\n            this.toolStripSeparator1.Size = new System.Drawing.Size(38, 6);\n            this.toolStripSeparator1.Visible = false;\n            // \n            // tslSort\n            // \n            this.tslSort.Name = \"tslSort\";\n            this.tslSort.Size = new System.Drawing.Size(38, 15);\n            this.tslSort.Text = \"Sort:\";\n            // \n            // tsSortPriorities\n            // \n            this.tsSortPriorities.CheckOnClick = true;\n            this.tsSortPriorities.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.tsSortPriorities.Image = ((System.Drawing.Image)(resources.GetObject(\"tsSortPriorities.Image\")));\n            this.tsSortPriorities.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsSortPriorities.Name = \"tsSortPriorities\";\n            this.tsSortPriorities.Size = new System.Drawing.Size(38, 20);\n            this.tsSortPriorities.Text = \"Group by priorities (Ascending only)\";\n            // \n            // toolStripSeparator4\n            // \n            this.toolStripSeparator4.Name = \"toolStripSeparator4\";\n            this.toolStripSeparator4.Size = new System.Drawing.Size(38, 6);\n            // \n            // tsbToggleSkills\n            // \n            this.tsbToggleSkills.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.tsbToggleSkills.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbToggleSkills.Image\")));\n            this.tsbToggleSkills.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbToggleSkills.Name = \"tsbToggleSkills\";\n            this.tsbToggleSkills.Size = new System.Drawing.Size(38, 20);\n            this.tsbToggleSkills.Text = \"Toggle skills\";\n            this.tsbToggleSkills.ToolTipText = \"Toggle skill pane\";\n            this.tsbToggleSkills.Click += new System.EventHandler(this.toggleSkillsPanelButton_Click);\n            // \n            // tsbToggleRemapping\n            // \n            this.tsbToggleRemapping.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.tsbToggleRemapping.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbToggleRemapping.Image\")));\n            this.tsbToggleRemapping.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbToggleRemapping.Name = \"tsbToggleRemapping\";\n            this.tsbToggleRemapping.Size = new System.Drawing.Size(38, 20);\n            this.tsbToggleRemapping.Text = \"Toggle remapping\";\n            this.tsbToggleRemapping.ToolTipText = \"Toggle remapping point (F9)\";\n            this.tsbToggleRemapping.Click += new System.EventHandler(this.tsbToggleRemapping_Click);\n            // \n            // tssColorKey\n            // \n            this.tssColorKey.Name = \"tssColorKey\";\n            this.tssColorKey.Size = new System.Drawing.Size(38, 6);\n            // \n            // tsbColorKey\n            // \n            this.tsbColorKey.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.tsbColorKey.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbColorKey.Image\")));\n            this.tsbColorKey.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbColorKey.Name = \"tsbColorKey\";\n            this.tsbColorKey.Size = new System.Drawing.Size(38, 20);\n            this.tsbColorKey.Text = \"Toggle Color Key Panel\";\n            this.tsbColorKey.ToolTipText = \"Toggle Color Key Panel\";\n            this.tsbColorKey.Click += new System.EventHandler(this.tsbColorKey_Click);\n            // \n            // ilIcons\n            // \n            this.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n            this.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilIcons.Images.SetKeyName(0, \"RedArrow.png\");\n            this.ilIcons.Images.SetKeyName(1, \"BlueArrow.png\");\n            this.ilIcons.Images.SetKeyName(2, \"GreenArrow.png\");\n            this.ilIcons.Images.SetKeyName(3, \"shape_align_middle.png\");\n            this.ilIcons.Images.SetKeyName(4, \"arrow_up.png\");\n            this.ilIcons.Images.SetKeyName(5, \"arrow_down.png\");\n            this.ilIcons.Images.SetKeyName(6, \"16x16Transparant.png\");\n            // \n            // tmrSelect\n            // \n            this.tmrSelect.Tick += new System.EventHandler(this.tmrSelect_Tick);\n            // \n            // pFooter\n            // \n            this.pFooter.Controls.Add(this.gbColorKey);\n            this.pFooter.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.pFooter.Location = new System.Drawing.Point(41, 520);\n            this.pFooter.Name = \"pFooter\";\n            this.pFooter.Size = new System.Drawing.Size(719, 38);\n            this.pFooter.TabIndex = 14;\n            this.pFooter.Visible = false;\n            // \n            // gbColorKey\n            // \n            this.gbColorKey.Controls.Add(this.flpColorKey);\n            this.gbColorKey.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbColorKey.Location = new System.Drawing.Point(0, 0);\n            this.gbColorKey.Name = \"gbColorKey\";\n            this.gbColorKey.Size = new System.Drawing.Size(719, 38);\n            this.gbColorKey.TabIndex = 0;\n            this.gbColorKey.TabStop = false;\n            this.gbColorKey.Text = \"Color Keys\";\n            // \n            // flpColorKey\n            // \n            this.flpColorKey.AutoSize = true;\n            this.flpColorKey.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.flpColorKey.Controls.Add(this.lblTrainable);\n            this.flpColorKey.Controls.Add(this.lblNonPublic);\n            this.flpColorKey.Controls.Add(this.lblPrereqNotMet);\n            this.flpColorKey.Controls.Add(this.lblDepended);\n            this.flpColorKey.Controls.Add(this.lblQueued);\n            this.flpColorKey.Controls.Add(this.lblPrereqMetNotKnown);\n            this.flpColorKey.Controls.Add(this.lblDowntime);\n            this.flpColorKey.Controls.Add(this.lblCurrentlyTraining);\n            this.flpColorKey.Controls.Add(this.lblPartiallyTrained);\n            this.flpColorKey.Controls.Add(this.lblOmegaOnly);\n            this.flpColorKey.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.flpColorKey.Location = new System.Drawing.Point(3, 16);\n            this.flpColorKey.Name = \"flpColorKey\";\n            this.flpColorKey.Padding = new System.Windows.Forms.Padding(5, 0, 0, 0);\n            this.flpColorKey.Size = new System.Drawing.Size(713, 19);\n            this.flpColorKey.TabIndex = 29;\n            // \n            // lblTrainable\n            // \n            this.lblTrainable.AutoSize = true;\n            this.lblTrainable.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.lblTrainable.ForeColor = System.Drawing.SystemColors.ControlText;\n            this.lblTrainable.Location = new System.Drawing.Point(5, 0);\n            this.lblTrainable.Margin = new System.Windows.Forms.Padding(0, 0, 4, 0);\n            this.lblTrainable.Name = \"lblTrainable\";\n            this.lblTrainable.Size = new System.Drawing.Size(53, 15);\n            this.lblTrainable.TabIndex = 37;\n            this.lblTrainable.Text = \"Trainable\";\n            this.lblTrainable.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lblNonPublic\n            // \n            this.lblNonPublic.AutoSize = true;\n            this.lblNonPublic.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.lblNonPublic.ForeColor = System.Drawing.Color.DarkRed;\n            this.lblNonPublic.Location = new System.Drawing.Point(62, 0);\n            this.lblNonPublic.Margin = new System.Windows.Forms.Padding(0, 0, 4, 0);\n            this.lblNonPublic.Name = \"lblNonPublic\";\n            this.lblNonPublic.Size = new System.Drawing.Size(61, 15);\n            this.lblNonPublic.TabIndex = 35;\n            this.lblNonPublic.Text = \"Non Public\";\n            this.lblNonPublic.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lblPrereqNotMet\n            // \n            this.lblPrereqNotMet.AutoSize = true;\n            this.lblPrereqNotMet.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.lblPrereqNotMet.ForeColor = System.Drawing.Color.Red;\n            this.lblPrereqNotMet.Location = new System.Drawing.Point(127, 0);\n            this.lblPrereqNotMet.Margin = new System.Windows.Forms.Padding(0, 0, 4, 0);\n            this.lblPrereqNotMet.Name = \"lblPrereqNotMet\";\n            this.lblPrereqNotMet.Size = new System.Drawing.Size(81, 15);\n            this.lblPrereqNotMet.TabIndex = 29;\n            this.lblPrereqNotMet.Text = \"Prereq Not Met\";\n            this.lblPrereqNotMet.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lblDepended\n            // \n            this.lblDepended.AutoSize = true;\n            this.lblDepended.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.lblDepended.ForeColor = System.Drawing.Color.Gray;\n            this.lblDepended.Location = new System.Drawing.Point(212, 0);\n            this.lblDepended.Margin = new System.Windows.Forms.Padding(0, 0, 4, 0);\n            this.lblDepended.Name = \"lblDepended\";\n            this.lblDepended.Size = new System.Drawing.Size(59, 15);\n            this.lblDepended.TabIndex = 30;\n            this.lblDepended.Text = \"Depended\";\n            this.lblDepended.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lblQueued\n            // \n            this.lblQueued.AutoSize = true;\n            this.lblQueued.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.lblQueued.ForeColor = System.Drawing.Color.RoyalBlue;\n            this.lblQueued.Location = new System.Drawing.Point(275, 0);\n            this.lblQueued.Margin = new System.Windows.Forms.Padding(0, 0, 4, 0);\n            this.lblQueued.Name = \"lblQueued\";\n            this.lblQueued.Size = new System.Drawing.Size(47, 15);\n            this.lblQueued.TabIndex = 32;\n            this.lblQueued.Text = \"Queued\";\n            this.lblQueued.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lblPrereqMetNotKnown\n            // \n            this.lblPrereqMetNotKnown.AutoSize = true;\n            this.lblPrereqMetNotKnown.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.lblPrereqMetNotKnown.ForeColor = System.Drawing.Color.LightSlateGray;\n            this.lblPrereqMetNotKnown.Location = new System.Drawing.Point(326, 0);\n            this.lblPrereqMetNotKnown.Margin = new System.Windows.Forms.Padding(0, 0, 4, 0);\n            this.lblPrereqMetNotKnown.Name = \"lblPrereqMetNotKnown\";\n            this.lblPrereqMetNotKnown.Size = new System.Drawing.Size(123, 15);\n            this.lblPrereqMetNotKnown.TabIndex = 36;\n            this.lblPrereqMetNotKnown.Text = \"Prereq Met - Not Known\";\n            this.lblPrereqMetNotKnown.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lblDowntime\n            // \n            this.lblDowntime.AutoSize = true;\n            this.lblDowntime.BackColor = System.Drawing.Color.DarkGray;\n            this.lblDowntime.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.lblDowntime.ForeColor = System.Drawing.Color.Red;\n            this.lblDowntime.Location = new System.Drawing.Point(453, 0);\n            this.lblDowntime.Margin = new System.Windows.Forms.Padding(0, 0, 4, 0);\n            this.lblDowntime.Name = \"lblDowntime\";\n            this.lblDowntime.Size = new System.Drawing.Size(56, 15);\n            this.lblDowntime.TabIndex = 33;\n            this.lblDowntime.Text = \"Downtime\";\n            this.lblDowntime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lblCurrentlyTraining\n            // \n            this.lblCurrentlyTraining.AutoSize = true;\n            this.lblCurrentlyTraining.BackColor = System.Drawing.Color.LightSteelBlue;\n            this.lblCurrentlyTraining.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.lblCurrentlyTraining.ForeColor = System.Drawing.SystemColors.ControlText;\n            this.lblCurrentlyTraining.Location = new System.Drawing.Point(513, 0);\n            this.lblCurrentlyTraining.Margin = new System.Windows.Forms.Padding(0, 0, 4, 0);\n            this.lblCurrentlyTraining.Name = \"lblCurrentlyTraining\";\n            this.lblCurrentlyTraining.Size = new System.Drawing.Size(91, 15);\n            this.lblCurrentlyTraining.TabIndex = 34;\n            this.lblCurrentlyTraining.Text = \"Currently Training\";\n            this.lblCurrentlyTraining.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lblPartiallyTrained\n            // \n            this.lblPartiallyTrained.AutoSize = true;\n            this.lblPartiallyTrained.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.lblPartiallyTrained.ForeColor = System.Drawing.Color.Green;\n            this.lblPartiallyTrained.Location = new System.Drawing.Point(608, 0);\n            this.lblPartiallyTrained.Margin = new System.Windows.Forms.Padding(0, 0, 4, 0);\n            this.lblPartiallyTrained.Name = \"lblPartiallyTrained\";\n            this.lblPartiallyTrained.Size = new System.Drawing.Size(84, 15);\n            this.lblPartiallyTrained.TabIndex = 31;\n            this.lblPartiallyTrained.Text = \"Partially Trained\";\n            this.lblPartiallyTrained.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // lblOmegaOnly\n            // \n            this.lblOmegaOnly.AutoSize = true;\n            this.lblOmegaOnly.BackColor = System.Drawing.Color.Gold;\n            this.lblOmegaOnly.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.lblOmegaOnly.ForeColor = System.Drawing.SystemColors.ControlText;\n            this.lblOmegaOnly.Margin = new System.Windows.Forms.Padding(0, 0, 4, 0);\n            this.lblOmegaOnly.Name = \"lblOmegaOnly\";\n            this.lblOmegaOnly.TabIndex = 38;\n            this.lblOmegaOnly.Text = \"Requires Omega\";\n            this.lblOmegaOnly.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // pscPlan\n            // \n            this.pscPlan.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pscPlan.Location = new System.Drawing.Point(41, 0);\n            this.pscPlan.Name = \"pscPlan\";\n            // \n            // pscPlan.Panel1\n            // \n            this.pscPlan.Panel1.Controls.Add(this.lvSkills);\n            this.pscPlan.Panel1.Controls.Add(this.tlpHeader);\n            // \n            // pscPlan.Panel2\n            // \n            this.pscPlan.Panel2.Controls.Add(this.skillSelectControl);\n            this.pscPlan.RememberDistanceKey = null;\n            this.pscPlan.Size = new System.Drawing.Size(719, 520);\n            this.pscPlan.SplitterDistance = 519;\n            this.pscPlan.TabIndex = 13;\n            // \n            // lvSkills\n            // \n            this.lvSkills.AllowColumnReorder = true;\n            this.lvSkills.AllowDrop = true;\n            this.lvSkills.AllowRowReorder = true;\n            this.lvSkills.ContextMenuStrip = this.contextMenu;\n            this.lvSkills.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvSkills.FullRowSelect = true;\n            this.lvSkills.HideSelection = false;\n            this.lvSkills.Location = new System.Drawing.Point(0, 33);\n            this.lvSkills.Name = \"lvSkills\";\n            this.lvSkills.Size = new System.Drawing.Size(519, 487);\n            this.lvSkills.SmallImageList = this.ilIcons;\n            this.lvSkills.TabIndex = 0;\n            this.lvSkills.UseCompatibleStateImageBehavior = false;\n            this.lvSkills.View = System.Windows.Forms.View.Details;\n            this.lvSkills.ListViewItemsDragged += new System.EventHandler<System.EventArgs>(this.lvSkills_ListViewItemsDragged);\n            this.lvSkills.ColumnReordered += new System.Windows.Forms.ColumnReorderedEventHandler(this.lvSkills_ColumnReordered);\n            this.lvSkills.ItemMouseHover += new System.Windows.Forms.ListViewItemMouseHoverEventHandler(this.lvSkills_ItemHover);\n            this.lvSkills.SelectedIndexChanged += new System.EventHandler(this.lvSkills_SelectedIndexChanged);\n            this.lvSkills.DragDrop += new System.Windows.Forms.DragEventHandler(this.lvSkills_DragDrop);\n            this.lvSkills.DragEnter += new System.Windows.Forms.DragEventHandler(this.lvSkills_DragEnter);\n            this.lvSkills.DragOver += new System.Windows.Forms.DragEventHandler(this.lvSkills_DragOver);\n            this.lvSkills.DragLeave += new System.EventHandler(this.lvSkills_DragLeave);\n            this.lvSkills.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvSkills_KeyDown);\n            this.lvSkills.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.lvSkills_MouseDoubleClick);\n            this.lvSkills.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lvSkills_MouseDown);\n            this.lvSkills.MouseLeave += new System.EventHandler(this.lvSkills_MouseLeave);\n            this.lvSkills.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lvSkills_MouseMove);\n            // \n            // tlpHeader\n            // \n            this.tlpHeader.ColumnCount = 2;\n            this.tlpHeader.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tlpHeader.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 33F));\n            this.tlpHeader.Controls.Add(this.implantSetterPanel, 0, 0);\n            this.tlpHeader.Controls.Add(this.tsPreferences, 1, 0);\n            this.tlpHeader.Dock = System.Windows.Forms.DockStyle.Top;\n            this.tlpHeader.Location = new System.Drawing.Point(0, 0);\n            this.tlpHeader.Name = \"tlpHeader\";\n            this.tlpHeader.RowCount = 1;\n            this.tlpHeader.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tlpHeader.Size = new System.Drawing.Size(519, 33);\n            this.tlpHeader.TabIndex = 4;\n            // \n            // implantSetterPanel\n            // \n            this.implantSetterPanel.AutoSize = true;\n            this.implantSetterPanel.Controls.Add(this.lblChooseImplantSet);\n            this.implantSetterPanel.Controls.Add(this.cbChooseImplantSet);\n            this.implantSetterPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.implantSetterPanel.Location = new System.Drawing.Point(0, 0);\n            this.implantSetterPanel.Margin = new System.Windows.Forms.Padding(0);\n            this.implantSetterPanel.Name = \"implantSetterPanel\";\n            this.implantSetterPanel.Size = new System.Drawing.Size(486, 33);\n            this.implantSetterPanel.TabIndex = 1;\n            // \n            // lblChooseImplantSet\n            // \n            this.lblChooseImplantSet.AutoSize = true;\n            this.lblChooseImplantSet.Location = new System.Drawing.Point(3, 10);\n            this.lblChooseImplantSet.Name = \"lblChooseImplantSet\";\n            this.lblChooseImplantSet.Size = new System.Drawing.Size(102, 13);\n            this.lblChooseImplantSet.TabIndex = 1;\n            this.lblChooseImplantSet.Text = \"Choose Implant Set:\";\n            // \n            // cbChooseImplantSet\n            // \n            this.cbChooseImplantSet.DisplayMember = \"Name\";\n            this.cbChooseImplantSet.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbChooseImplantSet.FormattingEnabled = true;\n            this.cbChooseImplantSet.Location = new System.Drawing.Point(111, 6);\n            this.cbChooseImplantSet.Name = \"cbChooseImplantSet\";\n            this.cbChooseImplantSet.Size = new System.Drawing.Size(170, 21);\n            this.cbChooseImplantSet.TabIndex = 2;\n            this.cbChooseImplantSet.SelectedIndexChanged += new System.EventHandler(this.cbChooseImplantSet_SelectedIndexChanged);\n            this.cbChooseImplantSet.DropDownClosed += new System.EventHandler(this.cbChooseImplantSet_DropDownClosed);\n            // \n            // tsPreferences\n            // \n            this.tsPreferences.CanOverflow = false;\n            this.tsPreferences.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tsPreferences.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n            this.tsPreferences.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.preferencesMenu});\n            this.tsPreferences.Location = new System.Drawing.Point(486, 0);\n            this.tsPreferences.Name = \"tsPreferences\";\n            this.tsPreferences.Size = new System.Drawing.Size(33, 33);\n            this.tsPreferences.TabIndex = 3;\n            this.tsPreferences.Text = \"tsPreferences\";\n            // \n            // preferencesMenu\n            // \n            this.preferencesMenu.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n            this.preferencesMenu.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.preferencesMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.columnSettingsMenuItem,\n            this.autoSizeColumnsMenuItem});\n            this.preferencesMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"preferencesMenu.Image\")));\n            this.preferencesMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.preferencesMenu.Name = \"preferencesMenu\";\n            this.preferencesMenu.Size = new System.Drawing.Size(29, 30);\n            this.preferencesMenu.Text = \"Preferences\";\n            this.preferencesMenu.ToolTipText = \"Preferences\";\n            // \n            // columnSettingsMenuItem\n            // \n            this.columnSettingsMenuItem.Name = \"columnSettingsMenuItem\";\n            this.columnSettingsMenuItem.Size = new System.Drawing.Size(176, 22);\n            this.columnSettingsMenuItem.Text = \"Column Settings\";\n            this.columnSettingsMenuItem.Click += new System.EventHandler(this.columnSettingsMenuItem_Click);\n            // \n            // autoSizeColumnsMenuItem\n            // \n            this.autoSizeColumnsMenuItem.Name = \"autoSizeColumnsMenuItem\";\n            this.autoSizeColumnsMenuItem.Size = new System.Drawing.Size(176, 22);\n            this.autoSizeColumnsMenuItem.Text = \"Auto-Size Columns\";\n            this.autoSizeColumnsMenuItem.Click += new System.EventHandler(this.autoSizeColumnsMenuItem_Click);\n            // \n            // skillSelectControl\n            // \n            this.skillSelectControl.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.skillSelectControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.skillSelectControl.Location = new System.Drawing.Point(0, 0);\n            this.skillSelectControl.Margin = new System.Windows.Forms.Padding(2);\n            this.skillSelectControl.Name = \"skillSelectControl\";\n            this.skillSelectControl.Size = new System.Drawing.Size(196, 520);\n            this.skillSelectControl.TabIndex = 12;\n            // \n            // PlanEditorControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.pscPlan);\n            this.Controls.Add(this.pFooter);\n            this.Controls.Add(this.tsPlan);\n            this.Name = \"PlanEditorControl\";\n            this.Size = new System.Drawing.Size(760, 558);\n            this.contextMenu.ResumeLayout(false);\n            this.tsPlan.ResumeLayout(false);\n            this.tsPlan.PerformLayout();\n            this.pFooter.ResumeLayout(false);\n            this.gbColorKey.ResumeLayout(false);\n            this.gbColorKey.PerformLayout();\n            this.flpColorKey.ResumeLayout(false);\n            this.flpColorKey.PerformLayout();\n            this.pscPlan.Panel1.ResumeLayout(false);\n            this.pscPlan.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.pscPlan)).EndInit();\n            this.pscPlan.ResumeLayout(false);\n            this.tlpHeader.ResumeLayout(false);\n            this.tlpHeader.PerformLayout();\n            this.implantSetterPanel.ResumeLayout(false);\n            this.implantSetterPanel.PerformLayout();\n            this.tsPreferences.ResumeLayout(false);\n            this.tsPreferences.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private DraggableListView lvSkills;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem miRemoveFromPlan;\n        private System.Windows.Forms.SaveFileDialog sfdSave;\n        private System.Windows.Forms.Timer tmrAutoRefresh;\n        private System.Windows.Forms.ToolStrip tsPlan;\n        private System.Windows.Forms.ToolStripLabel tslMove;\n        private System.Windows.Forms.ToolStripButton tsbMoveUp;\n        private System.Windows.Forms.ToolStripButton tsbMoveDown;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\n        private System.Windows.Forms.Panel implantSetterPanel;\n        private System.Windows.Forms.ToolStripMenuItem miChangeNote;\n        private System.Windows.Forms.ToolStripSeparator changeMenuSeparator;\n        private System.Windows.Forms.ToolStripLabel tslSort;\n        private System.Windows.Forms.ImageList ilIcons;\n        private System.Windows.Forms.ToolStripMenuItem miShowInSkillBrowser;\n        private System.Windows.Forms.ToolStripSeparator planMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem miPlanGroups;\n        private System.Windows.Forms.ToolStripMenuItem miCopyTo;\n        private System.Windows.Forms.ToolStripMenuItem miChangePriority;\n        private System.Windows.Forms.ToolStripMenuItem miMarkOwned;\n        private System.Windows.Forms.ToolStripMenuItem miShowInSkillExplorer;\n        private System.Windows.Forms.ToolStripSeparator copyMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem miChangeLevel;\n        private System.Windows.Forms.ToolStripMenuItem miChangeTo0;\n        private System.Windows.Forms.ToolStripMenuItem miChangeTo1;\n        private System.Windows.Forms.ToolStripMenuItem miChangeTo2;\n        private System.Windows.Forms.ToolStripMenuItem miChangeTo3;\n        private System.Windows.Forms.ToolStripMenuItem miChangeTo4;\n        private System.Windows.Forms.ToolStripMenuItem miChangeTo5;\n        private PersistentSplitContainer pscPlan;\n        private System.Windows.Forms.ToolStripButton tsbToggleSkills;\n        private System.Windows.Forms.Timer tmrSelect;\n        private System.Windows.Forms.ToolStripButton tsbToggleRemapping;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;\n        private System.Windows.Forms.ToolStripButton tsSortPriorities;\n        private System.Windows.Forms.ToolStripSeparator tssColorKey;\n        private System.Windows.Forms.ToolStripButton tsbColorKey;\n        private System.Windows.Forms.Panel pFooter;\n        private System.Windows.Forms.GroupBox gbColorKey;\n        private System.Windows.Forms.FlowLayoutPanel flpColorKey;\n        private System.Windows.Forms.Label lblTrainable;\n        private System.Windows.Forms.Label lblNonPublic;\n        private System.Windows.Forms.Label lblPrereqNotMet;\n        private System.Windows.Forms.Label lblDepended;\n        private System.Windows.Forms.Label lblQueued;\n        private System.Windows.Forms.Label lblPrereqMetNotKnown;\n        private System.Windows.Forms.Label lblDowntime;\n        private System.Windows.Forms.Label lblCurrentlyTraining;\n        private System.Windows.Forms.Label lblPartiallyTrained;\n        private System.Windows.Forms.Label lblOmegaOnly;\n        private System.Windows.Forms.ComboBox cbChooseImplantSet;\n        private System.Windows.Forms.Label lblChooseImplantSet;\n        private System.Windows.Forms.ToolStripMenuItem MoveToTopMenuItem;\n        private System.Windows.Forms.ToolStrip tsPreferences;\n        private System.Windows.Forms.ToolStripDropDownButton preferencesMenu;\n        private System.Windows.Forms.ToolStripMenuItem columnSettingsMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem autoSizeColumnsMenuItem;\n        private System.Windows.Forms.TableLayoutPanel tlpHeader;\n        private SkillSelectControl skillSelectControl;\n        private System.Windows.Forms.ToolStripSeparator showInMenuSeparator;\n        private System.Windows.Forms.ToolStripSeparator markOwnedMenuSeaprator;\n        private System.Windows.Forms.ToolStripMenuItem miCopyToNewPlan;\n        private System.Windows.Forms.ToolStripMenuItem miCopySelectedToClipboard;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanEditorControl.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Scheduling;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.NotificationWindow;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// The main control of the plan editor window, the list of plan entries.\n    /// </summary>\n    public sealed partial class PlanEditorControl : UserControl\n    {\n        #region Fields\n\n        private const string PluggableColumn = \"chPluggable\";\n        private const int ArrowUpIndex = 4;\n        private const int ArrowDownIndex = 5;\n\n        private int m_lastImplantSetIndex;\n        private bool m_areRemappingPointsActive;\n\n        private bool m_init;\n\n        private Font m_plannedSkillFont;\n        private Font m_prerequisiteSkillFont;\n        private Color m_nonImmedTrainablePlanEntryColor;\n        private Color m_remappingBackColor;\n        private Color m_remappingForeColor;\n\n        private RemappingPoint m_previousRemappingPoint;\n\n        private Plan m_plan;\n        private Character m_character;\n\n        // The ImplantsControl or the AttributesOptimizationForm\n        private IPlanOrderPluggable m_pluggable;\n\n        // Drag and drop\n        private MouseButtons m_dragButton = MouseButtons.None;\n\n        // Columns\n        private bool m_isUpdatingColumns;\n        private bool m_columnsOrderChanged;\n        private readonly List<PlanColumnSettings> m_columns = new List<PlanColumnSettings>();\n\n        // Tooltip\n        private readonly InfiniteDisplayToolTip m_tooltip;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public PlanEditorControl()\n        {\n            InitializeComponent();\n            pscPlan.RememberDistanceKey = \"PlanEditor\";\n\n            m_tooltip = new InfiniteDisplayToolTip(lvSkills);\n\n            ListViewHelper.EnableDoubleBuffer(lvSkills);\n\n            pscPlan.Panel2Collapsed = true;\n\n            lvSkills.ColumnWidthChanged += lvSkills_ColumnWidthChanged;\n            lvSkills.ColumnClick += lvSkills_ColumnClick;\n            tsSortPriorities.Click += tsSortPriorities_Clicked;\n            cbChooseImplantSet.DropDown += cbChooseImplantSet_DropDown;\n\n            EveMonClient.CharacterUpdated += EveMonClient_CharacterUpdated;\n            EveMonClient.CharacterSkillQueueUpdated += EveMonClient_CharacterSkillQueueUpdated;\n            EveMonClient.CharacterImplantSetCollectionChanged += EveMonClient_CharacterImplantSetCollectionChanged;\n            EveMonClient.ItemPricesUpdated += EveMonClient_ItemPricesUpdated;\n            EveMonClient.PlanChanged += EveMonClient_PlanChanged;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.SchedulerChanged += EveMonClient_SchedulerChanged;\n            Disposed += OnDisposed;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load, updates the controls.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            Font = FontFactory.GetFont(\"Tahoma\", 8.25F);\n\n            m_columns.Clear();\n            m_columns.AddRange(Settings.UI.PlanWindow.Columns);\n\n            m_plannedSkillFont = FontFactory.GetFont(lvSkills.Font, FontStyle.Bold);\n            m_prerequisiteSkillFont = FontFactory.GetFont(lvSkills.Font);\n            m_nonImmedTrainablePlanEntryColor = SystemColors.GrayText;\n            m_remappingForeColor = SystemColors.HotTrack;\n            m_remappingBackColor = SystemColors.Info;\n\n            m_init = true;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            m_tooltip.Dispose();\n            EveMonClient.CharacterUpdated -= EveMonClient_CharacterUpdated;\n            EveMonClient.CharacterSkillQueueUpdated -= EveMonClient_CharacterSkillQueueUpdated;\n            EveMonClient.CharacterImplantSetCollectionChanged -= EveMonClient_CharacterImplantSetCollectionChanged;\n            EveMonClient.ItemPricesUpdated -= EveMonClient_ItemPricesUpdated;\n            EveMonClient.PlanChanged -= EveMonClient_PlanChanged;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.SchedulerChanged -= EveMonClient_SchedulerChanged;\n            Disposed -= OnDisposed;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the plan represented by this editor.\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                if (value == null || m_plan == value)\n                    return;\n\n                m_plan = value;\n                m_character = (Character)m_plan.Character;\n                DisplayPlan = new PlanScratchpad(m_character);\n                m_lastImplantSetIndex = -1;\n\n                // Children controls\n                skillSelectControl.Plan = m_plan;\n\n                // Update Implant Set control\n                UpdateImplantSetList();\n                cbChooseImplantSet.SelectedIndex = 0;\n\n                // Build the plan\n                UpdateDisplayPlan(updateSkillList: false);\n\n                if (!m_init)\n                    return;\n\n                // Update the columns\n                UpdateListColumns();\n            }\n        }\n\n        /// <summary>\n        /// Gets the version of the plan as it is currently displayed.\n        /// </summary>\n        internal PlanScratchpad DisplayPlan { get; private set; }\n\n        /// <summary>\n        /// Gets the number of unique skills selected (two levels of same skill counts for one unique skill).\n        /// </summary>\n        private int UniqueSkillsCount => SelectedEntries.GetUniqueSkillsCount();\n\n        /// <summary>\n        /// Gets the number of not known skills selected (two levels of same skill counts for one unique skill).\n        /// </summary>\n        private int NotKnownSkillsCount => SelectedEntries.GetNotKnownSkillsCount();\n\n        /// <summary>\n        /// Gets the cost of known skills selected.\n        /// </summary>\n        private long SkillBooksCost => SelectedEntries.GetTotalBooksCost();\n\n        /// <summary>\n        /// Gets the cost of not known skills selected.\n        /// </summary>\n        private long NotKnownSkillBooksCost => SelectedEntries.GetNotKnownSkillBooksCost();\n\n        /// <summary>\n        /// Gets the skill points of the planned skill levels\n        /// </summary>\n        private long TotalSkillPoints => SelectedEntries.GetTotalSkillPoints();\n\n        #endregion\n\n\n        #region Global events\n\n        /// <summary>\n        /// When the character change, some entries may now be known, so we reupdate everything.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != m_character || m_character == null)\n                return;\n\n            UpdateDisplayPlan();\n        }\n\n        /// <summary>\n        /// When the character skill queue change, update everything.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterSkillQueueUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != m_character || m_character == null)\n                return;\n\n            UpdateDisplayPlan();\n        }\n\n        /// <summary>\n        /// Occurs when global item prices are loaded (this updates the skill injector costs).\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_ItemPricesUpdated(object sender, EventArgs e)\n        {\n            UpdateStatusBar();\n        }\n\n        /// <summary>\n        /// When the character implant sets changed, update the implant set selection. \n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void EveMonClient_CharacterImplantSetCollectionChanged(object sender, EventArgs e)\n        {\n            if (m_character == null)\n                return;\n\n            UpdateImplantSetList();\n            cbChooseImplantSet.SelectedIndex = m_lastImplantSetIndex < cbChooseImplantSet.Items.Count ? m_lastImplantSetIndex : 0;\n            await UpdateImplantSet();\n        }\n\n        /// <summary>\n        /// When the plan changed, entries may have changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_PlanChanged(object sender, PlanChangedEventArgs e)\n        {\n            if (e.Plan != Plan || Plan == null)\n                return;\n\n            UpdateDisplayPlan(false);\n            UpdateListColumns();\n        }\n\n        /// <summary>\n        /// When the settings changed, implant sets, the highlights and such may be different. \n        /// Entries are still the same but we may need to update implant sets, highlights and others.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            if (Plan == null)\n                return;\n\n            UpdateSkillList();\n        }\n\n        /// <summary>\n        /// When the scheduler changed, the blocking highlights may be different. \n        /// Entries are still the same but we may need to update the blocking highlights.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SchedulerChanged(object sender, EventArgs e)\n        {\n            if (Plan == null)\n                return;\n\n            UpdateSkillList();\n        }\n\n        /// <summary>\n        /// Per second check if columns have been reordered.\n        /// When true, column settings get saved and reloaded.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Visible)\n                return;\n\n            if (m_columnsOrderChanged)\n            {\n                Settings.UI.PlanWindow.Columns.Clear();\n                Settings.UI.PlanWindow.Columns.AddRange(ExportColumnSettings());\n                ImportColumnSettings(Settings.UI.PlanWindow.Columns);\n            }\n\n            m_columnsOrderChanged = false;\n        }\n\n        #endregion\n\n\n        #region Content creation and refresh\n\n        /// <summary>\n        /// Update the Implant Set control list.\n        /// </summary>\n        private void UpdateImplantSetList()\n        {\n            // Populate the \"choose implant set\"\n            cbChooseImplantSet.Items.Clear();\n            foreach (ImplantSet set in m_character.ImplantSets)\n            {\n                cbChooseImplantSet.Items.Add(set);\n            }\n\n            int comboBoxArrowWidth = 16 * (int)Math.Truncate(Graphics.FromHwnd(Handle).DpiX / EveMonConstants.DefaultDpi);\n            int maxWidth = Math.Min(m_character.ImplantSets.Max(set =>\n                TextRenderer.MeasureText(set.Name, cbChooseImplantSet.Font).Width) + comboBoxArrowWidth,\n                (int)(cbChooseImplantSet.Font.Size * EveMonConstants.ImplantSetNameMaxLength));\n\n            cbChooseImplantSet.Size = new Size(Math.Max(maxWidth, cbChooseImplantSet.Size.Width), cbChooseImplantSet.Size.Height);\n        }\n\n        /// <summary>\n        /// Whenever the sorting option or the base plan changed, we update the sorted plan.\n        /// </summary>\n        private void UpdateDisplayPlan(bool updateSkillList = true)\n        {\n            DisplayPlan.RebuildPlanFrom(m_plan, true);\n\n            // Share the remapping points\n            PlanEntry[] srcEntries = m_plan.ToArray();\n            PlanEntry[] destEntries = DisplayPlan.ToArray();\n            for (int i = 0; i < srcEntries.Length; i++)\n            {\n                destEntries[i].Remapping = srcEntries[i].Remapping;\n            }\n\n            // Apply the sort\n            DisplayPlan.Sort(m_plan.SortingPreferences);\n\n            // Update the Skill List\n            if (updateSkillList)\n                UpdateSkillList();\n        }\n\n        /// <summary>\n        /// Rebuild the list items from the entries and their remapping points. Plan entries items are not fully initialized, \n        /// only their tags and a couple of things.\n        /// Full intialization, especially the columns values and such, will be completed in <see cref=\"UpdateListViewItems\"/>.\n        /// </summary>\n        private void UpdateSkillList()\n        {\n            if (m_plan == null)\n                return;\n\n            // Disable autorefresh timer, it will be enabled if a training entry is found\n            tmrAutoRefresh.Stop();\n\n            // Stores selection and focus, to restore them after the update\n            Dictionary<int, bool> selection = StoreSelection();\n            int focusedHashCode = lvSkills.FocusedItem?.Tag.GetHashCode() ?? 0;\n\n            lvSkills.BeginUpdate();\n            try\n            {\n                // Scroll through entries and their remapping points\n                List<ListViewItem> items = new List<ListViewItem>();\n                foreach (PlanEntry entry in DisplayPlan)\n                {\n                    // In any case, we must insert a new item for this plan's entry at the current index\n                    // Do we need to insert a remapping point ?\n                    if (entry.Remapping != null)\n                    {\n                        ListViewItem rlv = new ListViewItem\n                        {\n                            UseItemStyleForSubItems = true,\n                            Tag = entry.Remapping,\n                            ImageIndex = 3\n                        };\n                        items.Add(rlv);\n                    }\n\n                    // Insert the entry\n                    ListViewItem lvi = new ListViewItem { Tag = entry };\n                    items.Add(lvi);\n\n                    // Enable refresh every 30s if a skill is in training\n                    tmrAutoRefresh.Enabled |= entry.CharacterSkill.IsTraining;\n                }\n\n                // We avoid clear + AddRange because it causes the sliders position to reset\n                while (lvSkills.Items.Count > 0)\n                {\n                    lvSkills.Items.RemoveAt(lvSkills.Items.Count - 1);\n                }\n\n                lvSkills.Items.AddRange(items.ToArray());\n\n                // Restore selection and focus\n                RestoreSelection(selection);\n                ListViewItem focusedItem = lvSkills.Items.Cast<ListViewItem>()\n                    .FirstOrDefault(x => x.Tag.GetHashCode() == focusedHashCode);\n\n                if (focusedItem != null)\n                    focusedItem.Focused = true;\n\n                lvSkills.Select();\n\n                // Complete the items initialization\n                UpdateListViewItems();\n            }\n            finally\n            {\n                lvSkills.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Completes the items initialization or refresh them. Especially their columns values.\n        /// </summary>\n        private void UpdateListViewItems()\n        {\n            CheckForPluggable();\n\n            // Start updating the list\n            lvSkills.BeginUpdate();\n            try\n            {\n                // Scroll through entries\n                for (int i = 0; i < lvSkills.Items.Count; i++)\n                {\n                    ListViewItem lvi = lvSkills.Items[i];\n                    PlanEntry entry = lvi.Tag as PlanEntry;\n\n                    // Add enough subitems to match the number of columns\n                    while (lvi.SubItems.Count < lvSkills.Columns.Count)\n                    {\n                        lvi.SubItems.Add(string.Empty);\n                    }\n\n                    // The item represents a skill level entry\n                    if (entry != null)\n                        FormatEntry(entry, lvi);\n                        // The item represents a remapping point\n                    else\n                        FormatRemappingPoint(lvi);\n                }\n            }\n            finally\n            {\n                lvSkills.EndUpdate();\n            }\n\n            UpdateStatusBar();\n        }\n\n        /// <summary>\n        /// Formats the entry.\n        /// </summary>\n        /// <param name=\"entry\">The entry.</param>\n        /// <param name=\"lvi\">The lvi.</param>\n        private void FormatEntry(PlanEntry entry, ListViewItem lvi)\n        {\n            // Is it a prerequisite or a top level entry ?\n            if (!Settings.UI.SafeForWork)\n            {\n                lvi.Font = Settings.UI.PlanWindow.HighlightPlannedSkills && entry.Type == PlanEntryType.Planned\n                    ? m_plannedSkillFont\n                    : m_prerequisiteSkillFont;\n            }\n\n            // Gray out entries that cannot be trained immediately\n            if (!entry.CanTrainNow && Settings.UI.PlanWindow.DimUntrainable)\n                lvi.ForeColor = m_nonImmedTrainablePlanEntryColor;\n\n            // Checks if this entry has not prereq-met\n            if (!entry.CharacterSkill.IsKnown)\n                lvi.ForeColor = Color.Red;\n\n            // Checks if this entry is a non-public skill\n            if (!entry.CharacterSkill.IsPublic)\n                lvi.ForeColor = Color.DarkRed;\n\n            // Checks if this entry is not known but has prereq-met\n            if (!entry.CharacterSkill.IsKnown && entry.CharacterSkill.IsPublic &&\n                entry.CharacterSkill.ArePrerequisitesMet)\n                lvi.ForeColor = Color.LightSlateGray;\n\n            // Checks if this entry is partially trained\n            bool level = entry.Level == entry.CharacterSkill.Level + 1;\n            if (Settings.UI.PlanWindow.HighlightPartialSkills)\n            {\n                bool partiallyTrained = entry.CharacterSkill.FractionCompleted > 0 &&\n                                        entry.CharacterSkill.FractionCompleted < 1;\n                if (level && partiallyTrained)\n                    lvi.ForeColor = Color.Green;\n            }\n\n            HighlightQueuedSkills(lvi, entry);\n\n            // Checks if this entry is currently training (even if it's paused)\n            if (entry.CharacterSkill.IsTraining && level)\n            {\n                lvi.BackColor = Color.LightSteelBlue;\n                lvi.ForeColor = Color.Black;\n            }\n\n            // Checks whether this entry will be blocked\n            string blockingEntry = string.Empty;\n            if (Settings.UI.PlanWindow.HighlightConflicts)\n            {\n                bool isAutoBlocking;\n                bool isBlocked = Scheduler.SkillIsBlockedAt(entry.EndTime, out blockingEntry, out isAutoBlocking);\n                bool showBlocked = true;\n                CCPCharacter ccpCharacter = m_character as CCPCharacter;\n\n                if (ccpCharacter != null)\n                {\n                    PlanEntry planEntry = m_plan.GetEntry(entry.Skill, entry.Level);\n                    int indexOfEntry = m_plan.IndexOf(planEntry);\n                    QueuedSkill queueSkill = ccpCharacter.SkillQueue.ElementAtOrDefault(indexOfEntry);\n\n                    if (queueSkill != null)\n                    {\n                        showBlocked = (Plan.Name != EveMonConstants.CurrentSkillQueueText) ||\n                                      !isAutoBlocking ||\n                                      ((ccpCharacter.SkillQueue.Count == 1) &&\n                                       (indexOfEntry == 0) &&\n                                       (queueSkill.Skill == planEntry.Skill.ToCharacter(m_character)));\n                    }\n                }\n\n                if (isBlocked && showBlocked)\n                {\n                    lvi.ForeColor = Color.Red;\n                    lvi.BackColor = Color.LightGray;\n                }\n            }\n\n            if (entry.Character.EffectiveCharacterStatus == AccountStatus.Alpha)\n            {\n                if (entry.Level > entry.CharacterSkill.StaticData.AlphaLimit)\n                {\n                    lvi.BackColor = Color.Gold;\n                }\n            }\n\n            // Update every column\n            lvi.UseItemStyleForSubItems = m_pluggable == null;\n            for (int columnIndex = 0; columnIndex < lvSkills.Columns.Count; columnIndex++)\n            {\n                // Regular columns (not pluggable-dependent)\n                if (lvSkills.Columns[columnIndex].Tag != null)\n                {\n                    PlanColumnSettings columnSettings = (PlanColumnSettings)lvSkills.Columns[columnIndex].Tag;\n\n                    lvi.SubItems[columnIndex].BackColor = lvi.BackColor;\n                    lvi.SubItems[columnIndex].ForeColor = lvi.ForeColor;\n                    lvi.SubItems[columnIndex].Text = GetColumnTextForItem(entry, columnSettings.Column, blockingEntry);\n                }\n                    // Training time differences\n                else\n                {\n                    TimeSpan timeDifference;\n                    string result = string.Empty;\n                    if (entry.OldTrainingTime < entry.TrainingTime)\n                    {\n                        result = \"+\";\n                        timeDifference = entry.TrainingTime - entry.OldTrainingTime;\n                        lvi.SubItems[columnIndex].BackColor = lvi.BackColor;\n                        lvi.SubItems[columnIndex].ForeColor = Color.DarkRed;\n                    }\n                    else if (entry.OldTrainingTime > entry.TrainingTime)\n                    {\n                        result = \"-\";\n                        timeDifference = entry.OldTrainingTime - entry.TrainingTime;\n                        lvi.SubItems[columnIndex].BackColor = lvi.BackColor;\n                        lvi.SubItems[columnIndex].ForeColor = Color.DarkGreen;\n                    }\n                    else\n                    {\n                        timeDifference = TimeSpan.Zero;\n                        lvi.SubItems[columnIndex].BackColor = lvi.BackColor;\n                        lvi.SubItems[columnIndex].ForeColor = lvi.ForeColor;\n                    }\n\n                    result += timeDifference.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n                    lvi.SubItems[columnIndex].Text = result;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Formats the remapping point.\n        /// </summary>\n        /// <param name=\"lvi\">The lvi.</param>\n        private void FormatRemappingPoint(ListViewItem lvi)\n        {\n            RemappingPoint point = (RemappingPoint)lvi.Tag;\n            for (int columnIndex = 0; columnIndex < lvSkills.Columns.Count; columnIndex++)\n            {\n                PlanColumnSettings columnSettings = (PlanColumnSettings)lvSkills.Columns[columnIndex].Tag;\n\n                lvi.SubItems[columnIndex].Text = string.Empty;\n                lvi.SubItems[columnIndex].BackColor = m_remappingBackColor;\n                lvi.SubItems[columnIndex].ForeColor = m_remappingForeColor;\n\n                // We display the text in the SkillName column for better visibility\n                if (columnSettings != null && columnSettings.Column == PlanColumn.SkillName)\n                {\n                    lvi.SubItems[columnIndex].Text = m_areRemappingPointsActive\n                        ? point.ToString()\n                        : \"Remapping (ignored)\";\n                }\n            }\n        }\n\n        /// <summary>\n        /// Checks for pluggable.\n        /// </summary>\n        private void CheckForPluggable()\n        {\n            // When there is a pluggable (implants calculator or attributes optimizer)\n            // This one provides us the scratchpad to update training times\n            m_areRemappingPointsActive = true;\n            if (m_pluggable != null)\n            {\n                bool areRemappingPointsActive;\n                m_pluggable.UpdateStatistics(DisplayPlan, out areRemappingPointsActive);\n                m_areRemappingPointsActive = areRemappingPointsActive;\n            }\n            else\n            {\n                CharacterScratchpad scratchpad = new CharacterScratchpad(m_character);\n                if (m_plan.ChosenImplantSet != null)\n                    scratchpad = scratchpad.After(m_plan.ChosenImplantSet);\n\n                DisplayPlan.UpdateStatistics(scratchpad, true, true);\n            }\n        }\n\n        /// <summary>\n        /// Applies formatting to a ListViewItem if the entry is queued.\n        /// </summary>\n        /// <param name=\"lvi\">ListViewItem to be formatted.</param>\n        /// <param name=\"entry\">Entry used to identify is queued.</param>\n        private void HighlightQueuedSkills(ListViewItem lvi, PlanEntry entry)\n        {\n            if (!Settings.UI.PlanWindow.HighlightQueuedSkills)\n                return;\n\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n\n            // Current character isn't a CCP character, so can't have a Queue\n            if (ccpCharacter == null)\n                return;\n\n            if (ccpCharacter.SkillQueue.Any(skillLevel => skillLevel.ToString() == entry.ToString()))\n                lvi.ForeColor = Color.RoyalBlue;\n        }\n\n        /// <summary>\n        /// Gets the text to display in the given column for the provided entry.\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        /// <param name=\"column\"></param>\n        /// <param name=\"blockingEntry\"></param>\n        /// <exception cref=\"NotImplementedException\"></exception>\n        /// <returns></returns>\n        private static string GetColumnTextForItem(PlanEntry entry, PlanColumn column, string blockingEntry)\n        {\n            const int MaxNotesLength = 60;\n\n            switch (column)\n            {\n                case PlanColumn.SkillName:\n                    return entry.ToString();\n                case PlanColumn.PlanGroup:\n                    return entry.PlanGroupsDescription;\n                case PlanColumn.TrainingTime:\n                    return entry.TrainingTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n                case PlanColumn.TrainingTimeNatural:\n                    return entry.NaturalTrainingTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n                case PlanColumn.EarliestStart:\n                    return $\"{entry.StartTime:ddd} {entry.StartTime:G}\";\n                case PlanColumn.EarliestEnd:\n                    return $\"{entry.EndTime:ddd} {entry.EndTime:G}\";\n                case PlanColumn.PercentComplete:\n                    return $\"{Math.Floor(entry.FractionCompleted * 100)}%\";\n                case PlanColumn.SkillRank:\n                    return entry.Skill.Rank.ToString(CultureConstants.DefaultCulture);\n                case PlanColumn.PrimaryAttribute:\n                    return entry.Skill.PrimaryAttribute.ToString();\n                case PlanColumn.SecondaryAttribute:\n                    return entry.Skill.SecondaryAttribute.ToString();\n                case PlanColumn.SkillGroup:\n                    return entry.Skill.Group.Name;\n                case PlanColumn.PlanType:\n                    return entry.Type.ToString();\n                case PlanColumn.SPTotal:\n                    return entry.EstimatedTotalSkillPoints.ToNumericString(0);\n                case PlanColumn.SPPerHour:\n                    return entry.SpPerHour.ToString(CultureConstants.DefaultCulture);\n                case PlanColumn.Priority:\n                    return entry.Priority.ToString(CultureConstants.DefaultCulture);\n                case PlanColumn.Conflicts:\n                    return blockingEntry;\n                case PlanColumn.Notes:\n                    {\n                        if (string.IsNullOrEmpty(entry.Notes))\n                            return string.Empty;\n\n                        string result = Regex.Replace(entry.Notes, @\"(\\r|\\n)+\", \" \", RegexOptions.None);\n                        if (result.Length <= MaxNotesLength)\n                            return result;\n\n                        return result.Substring(0, MaxNotesLength) + \"...\";\n                    }\n                case PlanColumn.Cost:\n                    {\n                        if (entry.Level != 1 || entry.CharacterSkill.IsKnown)\n                            return string.Empty;\n                        return entry.CharacterSkill.IsOwned ? \"Owned\" : entry.Skill.FormattedCost;\n                    }\n                case PlanColumn.SkillPointsRequired:\n                    return entry.SkillPointsRequired.ToNumericString(0);\n                case PlanColumn.OmegaRequired:\n                    return entry.OmegaRequired ? \"Omega Only\" : \"Alpha\";\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Update the columns list according to the settings.\n        /// </summary>\n        private void UpdateListColumns()\n        {\n            m_isUpdatingColumns = true;\n            lvSkills.BeginUpdate();\n\n            try\n            {\n                // Clear and add the columns\n                lvSkills.Columns.Clear();\n                lvSkills.Items.Clear();\n\n                foreach (PlanColumnSettings column in m_columns.Where(x => x.Visible))\n                {\n                    // Add the column\n                    ColumnHeader header = lvSkills.Columns.Add(column.Column.GetHeader(), column.Width);\n                    header.Tag = column;\n\n                    // Add a temporary column when there is a pluggable (implants calc, attributes optimizer, etc)\n                    if (m_pluggable == null || column.Column != PlanColumn.TrainingTime)\n                        continue;\n\n                    header = lvSkills.Columns.Add(PluggableColumn, \"Diff with Calc Atts\", -2);\n                    header.Tag = null;\n                }\n\n                // Update the items\n                UpdateSkillList();\n\n                // Update the sort arrows\n                UpdateSortVisualFeedback();\n\n                // Adjust the size of the columns\n                AdjustColumns();\n            }\n            finally\n            {\n                lvSkills.EndUpdate();\n                m_isUpdatingColumns = false;\n            }\n        }\n\n        /// <summary>\n        /// Stores the selection to a dictionary and returns it. Dictionary keys are the tags' hash codes.\n        /// </summary>\n        /// <returns></returns>\n        private Dictionary<int, bool> StoreSelection()\n        {\n            Dictionary<int, bool> c = new Dictionary<int, bool>();\n\n            // Compute and store a string ID for every item\n            foreach (ListViewItem lvi in lvSkills.SelectedItems)\n            {\n                c[lvi.Tag.GetHashCode()] = true;\n            }\n\n            return c;\n        }\n\n        /// <summary>\n        /// Restores the selection from a dictionary where keys are tags' hash codes.\n        /// </summary>\n        /// <param name=\"c\"></param>\n        private void RestoreSelection(IDictionary<int, bool> c)\n        {\n            for (int i = lvSkills.Items.Count - 1; i >= 0; i--)\n            {\n                // Retrieve this item's tag hash code\n                ListViewItem lvi = lvSkills.Items[i];\n                int hashCode = lvi.Tag.GetHashCode();\n\n                // Check whether this id must be selected\n                bool selected;\n                if (c.TryGetValue(hashCode, out selected))\n                    c.Remove(hashCode);\n\n                lvi.Selected = selected;\n            }\n        }\n\n        /// <summary>\n        /// Every 30s a timer ticks and causes the list to refresh.\n        /// If there are obsolete entries user gets asked how to handle them.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tmrAutoRefresh_Tick(object sender, EventArgs e)\n        {\n            PlanWindow planWindow = ParentForm as PlanWindow;\n\n            UpdateListViewItems();\n            planWindow?.CheckObsoleteEntries();\n        }\n\n        /// <summary>\n        /// Removes all obsolete entries and rebuilds the plan.\n        /// </summary>\n        public void ClearObsoleteEntries(ObsoleteRemovalPolicy policy)\n        {\n            m_plan.CleanObsoleteEntries(policy);\n            UpdateDisplayPlan();\n        }\n\n        /// <summary>\n        /// Updates the status bar.\n        /// </summary>\n        private void UpdateStatusBar()\n        {\n            PlanWindow planWindow = ParentForm as PlanWindow;\n\n            // 0 items selected or\n            // 1 items are selected and status bar only updates on multi-select\n            if ((lvSkills.SelectedItems.Count < 1) ||\n                ((lvSkills.SelectedItems.Count == 1) && Settings.UI.PlanWindow.OnlyShowSelectionSummaryOnMultiSelect))\n            {\n                planWindow?.UpdateStatusBar();\n                return;\n            }\n\n            // Multi-selection\n            int entriesCount = SelectedEntries.Count();\n\n            // We compute the training time\n            TimeSpan selectedTrainingTime = SelectedEntries\n                .Aggregate(TimeSpan.Zero, (current, entry) => current.Add(entry.TrainingTime));\n\n            planWindow?.UpdateSkillStatusLabel(true, entriesCount, UniqueSkillsCount);\n            planWindow?.UpdateTimeStatusLabel(true, entriesCount, selectedTrainingTime);\n            planWindow?.UpdateCostStatusLabel(true, SkillBooksCost, NotKnownSkillBooksCost);\n            planWindow?.UpdateSkillPointsStatusLabel(true, entriesCount, TotalSkillPoints);\n        }\n\n        /// <summary>\n        /// Updates the implant set.\n        /// </summary>\n        private async Task UpdateImplantSet()\n        {\n            m_plan.ChosenImplantSet = cbChooseImplantSet.SelectedItem as ImplantSet;\n            m_lastImplantSetIndex = cbChooseImplantSet.SelectedIndex;\n            DisplayPlan.ChosenImplantSet = m_plan.ChosenImplantSet;\n\n            Task updateOnImplantSetChange = m_pluggable?.UpdateOnImplantSetChange();\n            if (updateOnImplantSetChange != null)\n                await updateOnImplantSetChange;\n        }\n\n        #endregion\n\n\n        #region Pluggable management\n\n        /// <summary>\n        /// Connects a window implementing <see cref=\"IPlanOrderPluggable\"/> to this window to enable displaying the training time differences.\n        /// </summary>\n        /// <param name=\"pluggable\"></param>\n        internal void ShowWithPluggable(IPlanOrderPluggable pluggable)\n        {\n            lvSkills.BeginUpdate();\n            try\n            {\n                // Update columns when a new pluggable is inserted\n                if (m_pluggable == null)\n                {\n                    m_pluggable = pluggable;\n                    pluggable.Disposed += pluggable_Disposed;\n                    UpdateListColumns();\n                    return;\n                }\n                \n                // Updates the list view\n                UpdateListViewItems();\n            }\n            finally\n            {\n                lvSkills.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Once the pluggable window is disposed, we hide the training time difference again.\n        /// </summary>\n        /// <param name=\"o\"></param>\n        /// <param name=\"e\"></param>\n        private void pluggable_Disposed(object o, EventArgs e)\n        {\n            m_pluggable.Disposed -= pluggable_Disposed;\n            m_pluggable = null;\n            UpdateListColumns();\n        }\n\n        #endregion\n\n\n        #region Generic helper methods\n\n        /// <summary>\n        /// Updates the plan editor's skill selection control.\n        /// </summary>\n        internal void UpdatePlanEditorSkillSelection()\n        {\n            skillSelectControl.UpdateContent();\n        }\n\n        /// <summary>\n        /// Sets the plan editor's skill selection control selected skill.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        internal void SetPlanEditorSkillSelectorSelectedSkill(Skill skill)\n        {\n            skillSelectControl.SelectedSkill = skill;\n        }\n\n        /// <summary>\n        /// From an entry of the display plan, retrieve the entry of the base plan.\n        /// </summary>\n        /// <param name=\"displayEntry\"></param>\n        /// <returns></returns>\n        private PlanEntry GetOriginalEntry(ISkillLevel displayEntry) => m_plan.GetEntry(displayEntry.Skill, displayEntry.Level);\n\n        /// <summary>\n        /// Gets the plan entry attached to the given item.\n        /// </summary>\n        /// <param name=\"lvi\"></param>\n        /// <returns></returns>\n        private static PlanEntry GetPlanEntry(ListViewItem lvi) => lvi?.Tag as PlanEntry;\n\n        /// <summary>\n        /// Gets the first selected item which has a plan entry as a tag.\n        /// </summary>\n        /// <returns></returns>\n        private PlanEntry GetFirstSelectedEntry() => lvSkills.SelectedItems[0].Tag as PlanEntry;\n\n        /// <summary>\n        /// Gets an enumeration over the selected entries.\n        /// </summary>\n        private IEnumerable<PlanEntry> SelectedEntries => lvSkills.SelectedItems.Cast<ListViewItem>().Select(x => x.Tag).OfType<PlanEntry>();\n\n        #endregion\n\n\n        #region List items and columns reordering/resizing\n\n        /// <summary>\n        /// When the user manually resizes a column, we make sure to update the column preferences.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSkills_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)\n        {\n            if (m_isUpdatingColumns)\n                return;\n\n            if (m_columns.Count <= e.ColumnIndex)\n                return;\n\n            m_columns[e.ColumnIndex].Width = lvSkills.Columns[e.ColumnIndex].Width;\n            Settings.UI.PlanWindow.Columns.Clear();\n            Settings.UI.PlanWindow.Columns.AddRange(ExportColumnSettings());\n        }\n\n        /// <summary>\n        /// When the user click moves up, we move the list view items and rebuild the plan from \n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbMoveUp_Click(object sender, EventArgs e)\n        {\n            List<ListViewItem> items = lvSkills.Items.Cast<ListViewItem>().ToList();\n\n            // Skip the head\n            int index = 0;\n            while (index < items.Count)\n            {\n                if (!items[index].Selected)\n                    break;\n                index++;\n            }\n\n            // Move up the following items\n            while (index < items.Count)\n            {\n                ListViewItem item = items[index];\n                if (item.Selected)\n                {\n                    items.RemoveAt(index);\n                    items.Insert(index - 1, item);\n                }\n                index++;\n            }\n\n            // Rebuild the plan\n            RebuildPlanFromListViewOrder(items);\n        }\n\n        /// <summary>\n        /// When the user click moves down, we move the list view items and rebuild the plan from \n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbMoveDown_Click(object sender, EventArgs e)\n        {\n            List<ListViewItem> items = lvSkills.Items.Cast<ListViewItem>().ToList();\n\n            // Skip the tail\n            int index = items.Count - 1;\n            while (index >= 0)\n            {\n                if (!items[index].Selected)\n                    break;\n                index--;\n            }\n\n            // Move up the following items\n            while (index >= 0)\n            {\n                ListViewItem item = items[index];\n                if (item.Selected)\n                {\n                    items.RemoveAt(index);\n                    items.Insert(index + 1, item);\n                }\n                index--;\n            }\n\n            // Rebuild the plan\n            RebuildPlanFromListViewOrder(items);\n        }\n\n        /// <summary>\n        /// Moves the currently selected skill to the top of the plan\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void MoveToTopMenuItem_Click(object sender, EventArgs e)\n        {\n            // Extract the list and the selected item\n            List<ListViewItem> items = lvSkills.Items.Cast<ListViewItem>().ToList();\n            int index = items.First(x => x.Selected).Index;\n            ListViewItem item = items[index];\n\n            // Remove the item from the list, and add it at the top\n            items.RemoveAt(index);\n            items.Insert(0, item);\n\n            RebuildPlanFromListViewOrder(items);\n        }\n\n        /// <summary>\n        /// When an item is moved acrosss the listview, we rebuild the entire plan from the listview.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSkills_ListViewItemsDragged(object sender, EventArgs e)\n        {\n            RebuildPlanFromListViewOrder(lvSkills.Items);\n        }\n\n        /// <summary>\n        /// Rebuild the plan from the list view items.\n        /// </summary>\n        /// <param name=\"items\"></param>\n        private void RebuildPlanFromListViewOrder(IEnumerable items)\n        {\n            // Create the new entries\n            List<PlanEntry> entries = new List<PlanEntry>();\n\n            RemappingPoint remapping = null;\n            foreach (ListViewItem item in items)\n            {\n                PlanEntry entry = item.Tag as PlanEntry;\n                if (entry != null)\n                {\n                    entry.Remapping = remapping;\n                    entries.Add(entry);\n                    remapping = null;\n                    continue;\n                }\n\n                remapping = item.Tag as RemappingPoint;\n            }\n\n            // Since the list is not sorted anymore, we disable/hide the sort buttons and feedback\n            m_plan.SortingPreferences.Order = ThreeStateSortOrder.None;\n            m_plan.SortingPreferences.GroupByPriority = false;\n            UpdateSortVisualFeedback();\n\n            // Fetch them to the plan\n            m_plan.RebuildPlanFrom(entries);\n        }\n\n        /// <summary>\n        /// Rebuild the column settings from the currently displayed columns.\n        /// </summary>\n        public void ImportColumnSettings(IEnumerable<PlanColumnSettings> columns)\n        {\n            // Recreate the columns\n            m_columns.Clear();\n            m_columns.AddRange(columns);\n\n            // Update the UI\n            UpdateListColumns();\n        }\n\n        /// <summary>\n        /// Rebuild the column settings from the currently displayed columns.\n        /// </summary>\n        public IEnumerable<PlanColumnSettings> ExportColumnSettings()\n        {\n            // Recreate the columns\n            List<PlanColumnSettings> newList = new List<PlanColumnSettings>();\n\n            // Add the visible columns at the beggining\n            foreach (ColumnHeader columnHeader in lvSkills.Columns.Cast<ColumnHeader>().OrderBy(x => x.DisplayIndex))\n            {\n                // Retrieve the column and skip if null\n                PlanColumnSettings column = columnHeader.Tag as PlanColumnSettings;\n                if (column == null)\n                    continue;\n\n                if (column.Width > -1)\n                    column.Width = columnHeader.Width;\n                column.Visible = true;\n                newList.Add(column);\n            }\n\n            // Then the non-displayed ones\n            foreach (PlanColumnSettings column in m_columns.Where(x => !newList.Contains(x)))\n            {\n                column.Visible = false;\n                newList.Add(column);\n            }\n\n            return newList;\n        }\n\n        #endregion\n\n\n        #region Entries removal\n\n        /// <summary>\n        /// Remove all the selected entries when one or more get selected.\n        /// </summary>\n        private void RemoveSelectedEntries()\n        {\n            var items = lvSkills.SelectedItems;\n            if (items.Count == 1 && items[0].Tag is RemappingPoint)\n                // Right-click remove or delete on a remapping point only\n                tsbToggleRemapping_Click(null, null);\n            else if (items.Count > 0)\n            {\n                // Calculate the skill levels to remove\n                var operation = PrepareSelectionRemoval();\n                PlanWindow planWindow = ParentForm as PlanWindow;\n                if (operation != null && planWindow != null)\n                    PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow,\n                        operation);\n            }\n        }\n\n        /// <summary>\n        /// Prepares the selection removal.\n        /// </summary>\n        /// <returns></returns>\n        private IPlanOperation PrepareSelectionRemoval()\n        {\n            var entriesToRemove = lvSkills.SelectedItems.Cast<ListViewItem>().Select(x => x.\n                Tag).OfType<PlanEntry>();\n            return m_plan.TryRemoveSet(entriesToRemove);\n        }\n\n        #endregion\n\n\n        #region Sorting\n\n        /// <summary>\n        /// The user toggled the \"group priorities\" button.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsSortPriorities_Clicked(object sender, EventArgs e)\n        {\n            m_plan.SortingPreferences.GroupByPriority = tsSortPriorities.Checked;\n            UpdateDisplayPlan();\n        }\n\n        /// <summary>\n        /// When the user clicks a column header, we sort things up.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSkills_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            ColumnHeader column = lvSkills.Columns[e.Column];\n            PlanEntrySort criteria = GetPlanSort(column);\n\n            // Update sort order\n            if (criteria != PlanEntrySort.None)\n            {\n                if (m_plan.SortingPreferences.Criteria == criteria)\n                {\n                    switch (m_plan.SortingPreferences.Order)\n                    {\n                        case ThreeStateSortOrder.None:\n                            m_plan.SortingPreferences.Order = ThreeStateSortOrder.Ascending;\n                            break;\n                        case ThreeStateSortOrder.Ascending:\n                            m_plan.SortingPreferences.Order = ThreeStateSortOrder.Descending;\n                            break;\n                        case ThreeStateSortOrder.Descending:\n                            m_plan.SortingPreferences.Order = ThreeStateSortOrder.None;\n                            break;\n                    }\n                }\n                else\n                    m_plan.SortingPreferences.Order = ThreeStateSortOrder.Ascending;\n            }\n\n            // Updates the criteria\n            m_plan.SortingPreferences.Criteria = criteria;\n\n            // Updates UI and display plan\n            UpdateSortVisualFeedback();\n            UpdateDisplayPlan();\n        }\n\n        /// <summary>\n        /// Gets a column by the given sort key. Null if not found or \"none\".\n        /// </summary>\n        /// <param name=\"criteria\"></param>\n        /// <returns></returns>\n        private ColumnHeader GetColumn(PlanEntrySort criteria) => criteria == PlanEntrySort.None\n           ? null\n           : lvSkills.Columns.Cast<ColumnHeader>().FirstOrDefault(header => GetPlanSort(header) == criteria);\n\n        /// <summary>\n        /// Gets the sort key for the given column header.\n        /// </summary>\n        /// <param name=\"header\"></param>\n        /// <returns></returns>\n        private static PlanEntrySort GetPlanSort(ColumnHeader header)\n        {\n            if (header.Tag == null)\n                return PlanEntrySort.TimeDifference;\n\n            PlanColumnSettings ct = (PlanColumnSettings)header.Tag;\n            switch (ct.Column)\n            {\n                case PlanColumn.SkillName:\n                    return PlanEntrySort.Name;\n                case PlanColumn.Cost:\n                    return PlanEntrySort.Cost;\n                case PlanColumn.TrainingTime:\n                    return PlanEntrySort.TrainingTime;\n                case PlanColumn.TrainingTimeNatural:\n                    return PlanEntrySort.TrainingTimeNatural;\n                case PlanColumn.PrimaryAttribute:\n                    return PlanEntrySort.PrimaryAttribute;\n                case PlanColumn.SecondaryAttribute:\n                    return PlanEntrySort.SecondaryAttribute;\n                case PlanColumn.Priority:\n                    return PlanEntrySort.Priority;\n                case PlanColumn.SkillGroup:\n                    return PlanEntrySort.SkillGroupDuration;\n                case PlanColumn.PlanGroup:\n                    return PlanEntrySort.PlanGroup;\n                case PlanColumn.PercentComplete:\n                    return PlanEntrySort.PercentCompleted;\n                case PlanColumn.SkillRank:\n                    return PlanEntrySort.Rank;\n                case PlanColumn.SPPerHour:\n                    return PlanEntrySort.SPPerHour;\n                case PlanColumn.Notes:\n                    return PlanEntrySort.Notes;\n                case PlanColumn.PlanType:\n                    return PlanEntrySort.PlanType;\n                case PlanColumn.SkillPointsRequired:\n                    return PlanEntrySort.SkillPointsRequired;\n                case PlanColumn.OmegaRequired:\n                    return PlanEntrySort.OmegaRequired;\n                default:\n                    return PlanEntrySort.None;\n            }\n        }\n\n        /// <summary>\n        /// Updates the sort visual feedback for the specified column.\n        /// </summary>\n        /// <remarks>\n        /// The ColumnHeader.ImageIndex has a bug under Vista that\n        /// causes the value to be set to 0 if you set it to -1,\n        /// resulting in the wrong icon being selected for the sort:\n        /// https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=395739\n        /// </remarks>\n        private void UpdateSortVisualFeedback()\n        {\n            // Updates the menu icons on the left toolbar\n            tsSortPriorities.Checked = m_plan.SortingPreferences.GroupByPriority;\n\n            ColumnHeader columnWithSortCriteria = GetColumn(m_plan.SortingPreferences.Criteria);\n            foreach (ColumnHeader columnHeader in lvSkills.Columns.Cast<ColumnHeader>())\n            {\n                if (columnWithSortCriteria == columnHeader)\n                {\n                    if (m_plan.SortingPreferences.Criteria == PlanEntrySort.None ||\n                        m_plan.SortingPreferences.Order == ThreeStateSortOrder.None)\n                    {\n                        columnHeader.ImageIndex = 6;\n                        continue;\n                    }\n\n                    columnHeader.ImageIndex = m_plan.SortingPreferences.Order == ThreeStateSortOrder.Ascending\n                        ? ArrowUpIndex\n                        : ArrowDownIndex;\n                }\n                else\n                    columnHeader.ImageIndex = 6;\n            }\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            // Find the index of the pluggable column\n            int pluggableColumnIndex = lvSkills.Columns.IndexOfKey(PluggableColumn);\n\n            foreach (ColumnHeader column in lvSkills.Columns)\n            {\n                // Adjust the column index when we are past the pluggable column\n                // in order to avoid an ArgumentOutOfRangeException\n                int columnIndex = column.Index;\n                if (pluggableColumnIndex != -1 && column.Index > pluggableColumnIndex)\n                    columnIndex--;\n\n                if (m_columns[columnIndex].Width == -1)\n                    m_columns[columnIndex].Width = -2;\n\n                column.Width = m_columns[columnIndex].Width;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column and not set to auto-resize\n                if (column.Index != lvSkills.Columns.Count - 1 || m_columns[columnIndex].Width != -2)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvSkills.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvSkills.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = lvSkills.Columns[columnIndex].ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[columnIndex].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        #endregion\n\n\n        #region Context Menu\n\n        /// <summary>\n        /// When the context menu is opened, we update the status of the menus.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void contextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            e.Cancel = !m_plan.Any();\n\n            if (e.Cancel)\n                return;\n\n            PlanEntry entry = lvSkills.SelectedItems.Count > 0 ? GetPlanEntry(lvSkills.SelectedItems[0]) : null;\n\n            // By default, all hidden\n            foreach (ToolStripItem item in contextMenu.Items)\n            {\n                item.Visible = false;\n            }\n\n            // Nothing more to do when nothing selected\n            if (lvSkills.SelectedItems.Count == 0)\n                return;\n\n            // \"Change note\"\n            miChangeNote.Visible = entry != null;\n            miChangeNote.Text = @\"View/Change Note...\";\n\n            miChangePriority.Visible =\n                changeMenuSeparator.Visible = entry != null;\n\n            miCopyTo.Visible = entry != null;\n\n            // Reset text in case of previous multiple selection\n            miRemoveFromPlan.Text = @\"Remove from Plan\";\n            \n            // When there is only one selected item...\n            if (lvSkills.SelectedItems.Count == 1)\n            {\n                // When the selected item is a remapping, only \"remove from plan\" is visible\n                if (entry == null)\n                {\n                    miRemoveFromPlan.Visible = true;\n                    return;\n                }\n\n                // Enable other items\n                miShowInSkillBrowser.Visible = true;\n                miShowInSkillExplorer.Visible = true;\n                showInMenuSeparator.Visible = true;\n\n                // \"Change Planned Level\"\n                bool showChangeLevel = SetChangeLevelMenu();\n                miChangeLevel.Visible = showChangeLevel;\n\n                // If \"Change Planned Level\" hidden, \"remove from plan\" is visible \n                miRemoveFromPlan.Visible = !showChangeLevel;\n\n                // \"Move to top\"\n                bool showMoveToTop = lvSkills.Items.IndexOf(lvSkills.SelectedItems[0]) > 1;\n                MoveToTopMenuItem.Visible = showMoveToTop;\n\n                planMenuSeparator.Visible = showMoveToTop || !showChangeLevel;\n\n                // \"Plan groups\"\n                if (entry.PlanGroups.Count > 0)\n                {\n                    miPlanGroups.Visible = true;\n                    copyMenuSeparator.Visible = true;\n\n                    List<string> planGroups = new List<string>(entry.PlanGroups);\n                    planGroups.Sort();\n\n                    miPlanGroups.DropDownItems.Clear();\n                    miPlanGroups.DropDownItems.AddRange(planGroups.Select(CreateMenuItemControl).ToArray());\n                }\n            }\n                // Multiple items selected\n            else\n            {\n                miRemoveFromPlan.Visible = true;\n                planMenuSeparator.Visible = true;\n                IPlanOperation operation = PrepareSelectionRemoval();\n                if (PlanHelper.RequiresWindow(operation))\n                    miRemoveFromPlan.Text += @\"...\";\n            }\n\n            // \"Mark as owned\"\n            IList<Skill> skills = lvSkills.SelectedItems.Cast<ListViewItem>()\n                .Select(x => x.Tag).OfType<PlanEntry>().Select(x => x.CharacterSkill).ToList();\n\n            if (skills.Any(x => !x.IsKnown))\n            {\n                miMarkOwned.Text = skills.Any(x => !x.IsOwned) ? \"Mark as owned\" : \"Mark as unowned\";\n                miMarkOwned.Visible = true;\n                markOwnedMenuSeaprator.Visible = true;\n            }\n            else\n            {\n                miMarkOwned.Text = @\"Mark as owned\";\n                miMarkOwned.Visible = false;\n            }\n        }\n\n        /// <summary>\n        /// Creates the menu item control.\n        /// </summary>\n        /// <param name=\"planGroup\">The plan group.</param>\n        /// <returns></returns>\n        private ToolStripItem CreateMenuItemControl(string planGroup)\n        {\n            ToolStripMenuItem item = new ToolStripMenuItem(planGroup);\n            item.Width = TextRenderer.MeasureText(planGroup, item.Font).Width;\n            item.Click += planGroupMenu_Click;\n            return item;\n        }\n\n        /// <summary>\n        /// Update the status of the \"Plan to level N\" menu entries.\n        /// </summary>\n        /// <returns>True if at least one of the entries could be set.</returns>\n        private bool SetChangeLevelMenu()\n        {\n            PlanEntry pe = GetFirstSelectedEntry();\n\n            // Scroll through levels (and menus, one per level)\n            bool result = false;\n            for (int level = 0; level <= 5; level++)\n            {\n                m_plan.UpdatesRegularPlanToMenu(miChangeLevel.DropDownItems[level], pe.CharacterSkill, level);\n                result |= miChangeLevel.DropDownItems[level].Enabled;\n            }\n\n            return result;\n        }\n\n        /// <summary>\n        /// Context menu > \"Select entries from group...\" > Groupname\n        /// Selects all the items which belong to the same group.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void planGroupMenu_Click(object sender, EventArgs e)\n        {\n            string planGroup = ((ToolStripButton)sender).Text;\n            foreach (ListViewItem item in lvSkills.Items)\n            {\n                item.Selected = GetPlanEntry(item).PlanGroups.Contains(planGroup);\n            }\n        }\n\n        /// <summary>\n        /// Context menu > Show skill in browser.\n        /// Displays the selected entry's skill in the skill browser.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miShowInSkillBrowser_Click(object sender, EventArgs e)\n        {\n            Skill skill = ((PlanEntry)lvSkills.SelectedItems[0]?.Tag)?.CharacterSkill;\n\n            // Open the skill browser\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            planWindow?.ShowSkillInBrowser(skill);\n        }\n\n        /// <summary>\n        /// Context menu > Show skill in explorer.\n        /// Displays the selected entry's skill in the skill explorer.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miShowInSkillExplorer_Click(object sender, EventArgs e)\n        {\n            Skill skill = ((PlanEntry)lvSkills.SelectedItems[0]?.Tag)?.CharacterSkill;\n            \n            // Open the skill explorer\n            SkillExplorerWindow.ShowSkillExplorerWindow(m_character, m_plan).ShowSkillInExplorer(skill);\n        }\n\n        /// <summary>\n        /// Context menu > Remove from plan.\n        /// Removes the seleted entry or remapping point from the plan.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miRemoveFromPlan_Click(object sender, EventArgs e)\n        {\n            RemoveSelectedEntries();\n        }\n\n        /// <summary>\n        /// Context menu > Change priority.\n        /// Opens a dialog box to edit the priorities. Check for concflicts and asks the user when needed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miChangePriority_Click(object sender, EventArgs e)\n        {\n            IList<PlanEntry> entries = SelectedEntries.ToList();\n            using (PlanPrioritiesEditorWindow form = new PlanPrioritiesEditorWindow())\n            {\n                // Gets the entry's priority (or default if more than one item selected)\n                form.Priority = PlanEntry.DefaultPriority;\n                if (lvSkills.SelectedItems.Count == 1)\n                {\n                    PlanEntry pe = GetPlanEntry(lvSkills.SelectedItems[0]);\n                    if (pe != null)\n                        form.Priority = pe.Priority;\n                }\n\n                // User canceled ?\n                DialogResult dr = form.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n\n                // Update priorities, while performing backup for subsequent check\n                if (m_plan.TrySetPriority(DisplayPlan, entries, form.Priority))\n                    return;\n\n                ShowPriorityDialogBox(entries, form);\n            }\n        }\n\n        /// <summary>\n        /// Shows the priority dialog box.\n        /// </summary>\n        /// <param name=\"entries\">The entries.</param>\n        /// <param name=\"form\">The form.</param>\n        private void ShowPriorityDialogBox(IEnumerable<PlanEntry> entries, PlanPrioritiesEditorWindow form)\n        {\n            bool showDialog = Settings.UI.PlanWindow.PrioritiesMsgBox.ShowDialogBox;\n\n            // User wishes the dialog to be displayed\n            if (showDialog)\n            {\n                // Shows the custom dialog box\n                DialogResult dialogResult = MessageBoxCustom.Show(this, Properties.Resources.\n                    MessagePriorityConflict, \"Priority Conflict\",\n                    \"Do not show this dialog again\", MessageBoxButtons.YesNo, MessageBoxIcon.\n                    Exclamation);\n                Settings.UI.PlanWindow.PrioritiesMsgBox.ShowDialogBox = !MessageBoxCustom.CheckBoxChecked;\n\n                // When the checkbox is checked we store the dialog result\n                if (MessageBoxCustom.CheckBoxChecked)\n                    Settings.UI.PlanWindow.PrioritiesMsgBox.DialogResult = dialogResult;\n\n                if (dialogResult == DialogResult.Yes)\n                    m_plan.SetPriority(DisplayPlan, entries, form.Priority);\n            }\n                // User wishes the dialog not to be displayed and has set the dialog result to \"Yes\"\n            else if (Settings.UI.PlanWindow.PrioritiesMsgBox.DialogResult == DialogResult.Yes)\n                m_plan.SetPriority(DisplayPlan, entries, form.Priority);\n        }\n\n        /// <summary>\n        /// Context menu > Change note.\n        /// Opens a box to change the plan's notes.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miChangeNote_Click(object sender, EventArgs e)\n        {\n            IList<PlanEntry> entries = SelectedEntries.ToList();\n            if (!entries.Any())\n                return;\n\n            // We get the current skill's note and call the note editor window with this initial value\n            string noteText = entries.First().Notes;\n            string title = entries.Count() == 1 ? entries.First().Skill.ToString() :\n                \"Selected entries\";\n            using (PlanNotesEditorWindow f = new PlanNotesEditorWindow(title))\n            {\n                f.NoteText = noteText;\n                DialogResult dr = f.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n\n                noteText = f.NoteText;\n            }\n\n            // We update every item\n            foreach (PlanEntry entry in entries)\n            {\n                entry.Notes = noteText;\n            }\n\n            m_plan.RebuildPlanFrom(DisplayPlan, true);\n        }\n\n        /// <summary>\n        /// Context > Copy to new plan...\n        /// Opens a dialog to prompt the user for a name and create a plan with the selected entries.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miCopyToNewPlan_Click(object sender, EventArgs e)\n        {\n            IList<PlanEntry> entries = SelectedEntries.ToList();\n            if (!entries.Any())\n                return;\n\n            // Ask the user for a new name\n            string planName,\n                   planDescription;\n            using (NewPlanWindow npw = new NewPlanWindow())\n            {\n                DialogResult dr = npw.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n                planName = npw.PlanName;\n                planDescription = npw.PlanDescription;\n            }\n\n            // Create a new plan\n            Plan newPlan = new Plan(m_character) { Name = planName, Description = planDescription };\n            IPlanOperation operation = newPlan.TryAddSet(entries, \"Exported from \" + m_plan.\n                Name);\n            operation.Perform();\n\n            // Add plan and save\n            m_character.Plans.Add(newPlan);\n        }\n\n        /// <summary>\n        /// Context > Mark as owned/unowned.\n        /// Toggle the owned flag for the selected skills. \n        /// When multiple entries are selected and have different flags, we mark them as all owned.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miMarkOwned_Click(object sender, EventArgs e)\n        {\n            bool unowned = SelectedEntries.All(x => !x.CharacterSkill.IsOwned);\n\n            using (m_plan.SuspendingEvents())\n            {\n                foreach (PlanEntry entry in SelectedEntries)\n                {\n                    entry.CharacterSkill.IsOwned = unowned;\n                }\n            }\n\n            // We update the skill tree\n            skillSelectControl.UpdateContent();\n\n            // Update also the skill browser\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            planWindow?.UpdateSkillBrowser();\n\n            // Update the Owned Skill books window if open\n            OwnedSkillBooksWindow ownedSkillBooksWindow =\n                WindowsFactory.GetByTag<OwnedSkillBooksWindow, Character>((Character)m_plan.Character);\n\n            ownedSkillBooksWindow?.UpdateList();\n        }\n\n        /// <summary>\n        /// Context > Change planned level > Level N\n        /// Change the planned level, or remove if 0\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miChangeToLevel_Click(object sender, EventArgs e)\n        {\n            ToolStripMenuItem menu = sender as ToolStripMenuItem;\n\n            IPlanOperation operation = menu?.Tag as IPlanOperation;\n\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            if (planWindow == null)\n                return;\n\n            PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow, operation);\n        }\n\n        /// <summary>\n        /// Context > Copy selected skills to Clipboard\n        /// Copy selected entries to clipoboard \n        /// for importation in EVE client Skill Queue\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miCopySelectedToClipboard_Click(object sender, EventArgs e)\n        {\n            // Create a new plan\n            Plan newPlan = new Plan(m_character);\n            IPlanOperation operation = newPlan.TryAddSet(SelectedEntries, \"Exported from \" +\n                m_plan.Name);\n            operation.Perform();\n\n            // Prompt the user for settings. When null, the user cancelled\n            PlanExportSettings settings = UIHelper.PromptUserForPlanExportSettings(newPlan);\n            if (settings == null)\n                return;\n            \n            string output = PlanIOHelper.ExportAsText(newPlan, settings);\n\n            // Copy the result to the clipboard\n            try\n            {\n                Clipboard.Clear();\n                Clipboard.SetText(output);\n\n                MessageBox.Show(Properties.Resources.MessageCopiedPlan, @\"Plan Copied\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Information);\n            }\n            catch (ExternalException ex)\n            {\n                ExceptionHandler.LogException(ex, true);\n\n                MessageBox.Show(Properties.Resources.ErrorClipboardFailure,\n                    \"Plan Copy Failure\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n        }\n\n        #endregion\n\n\n        #region Drag'n drop from outer controls (inner drag'n drop is in reordering region)\n\n        /// <summary>\n        /// When the user drop a skill on the list, we plans it to the next unplanned level.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSkills_DragDrop(object sender, DragEventArgs e)\n        {\n            try\n            {\n                // Quits if the button is never the left one nor the right one\n                if (m_dragButton != MouseButtons.Left && m_dragButton != MouseButtons.Right)\n                    return;\n\n                // Checks there is a skill\n                Skill dragSkill = GetDraggingSkill(e);\n                if (dragSkill == null)\n                    return;\n\n                // Gets the item and returns if none created (already on lv5)\n                ListViewItem newItem = CreatePlanItemForSkill(dragSkill);\n                if (newItem == null)\n                    return;\n\n                // By default, drop index is at the end of the list\n                int dragIndex = lvSkills.Items.Count;\n\n                // If the user is dropping on an item, infere the drag index from this item's index\n                Point cp = lvSkills.PointToClient(new Point(e.X, e.Y));\n                ListViewItem hoverItem = lvSkills.GetItemAt(cp.X, cp.Y);\n                if (hoverItem != null)\n                {\n                    dragIndex = hoverItem.Index;\n                    Rectangle hoverBounds = hoverItem.GetBounds(ItemBoundsPortion.ItemOnly);\n\n                    // If the user is dropping on the lower half of the item, increase the dragging index\n                    if (cp.Y > hoverBounds.Top + hoverBounds.Height / 2)\n                        dragIndex++;\n                }\n\n                // Performs the insertion\n                lvSkills.Items.Insert(dragIndex, newItem);\n                RebuildPlanFromListViewOrder(lvSkills.Items);\n            }\n            finally\n            {\n                // Clean up our mess\n                lvSkills.ClearDropMarker();\n                e.Effect = DragDropEffects.None;\n                m_dragButton = MouseButtons.None;\n            }\n        }\n\n        /// <summary>\n        /// When the user drags over the skill list, updates the drop marker and dragging button.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSkills_DragOver(object sender, DragEventArgs e)\n        {\n            // Checks there is a dragged skill\n            Skill dragSkill = GetDraggingSkill(e);\n            if (dragSkill == null)\n                return;\n\n            // Updates the dragging button\n            SetDragMouseButton(e);\n\n            // Gets the hovered item\n            e.Effect = DragDropEffects.Move;\n            Point cp = lvSkills.PointToClient(new Point(e.X, e.Y));\n            ListViewItem hoverItem = lvSkills.GetItemAt(cp.X, cp.Y);\n\n            // Updates the drop marker below the hovered item.\n            if (hoverItem != null)\n            {\n                Rectangle hoverBounds = hoverItem.GetBounds(ItemBoundsPortion.ItemOnly);\n                lvSkills.DrawDropMarker(hoverItem.Index, cp.Y > hoverBounds.Top + hoverBounds.Height / 2);\n            }\n            else\n                lvSkills.ClearDropMarker();\n        }\n\n        /// <summary>\n        /// When the user begins a drag/drop operation, updates the drag/drop button and cursor.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSkills_DragEnter(object sender, DragEventArgs e)\n        {\n            // Sets up the drag button\n            SetDragMouseButton(e);\n\n            // Gets the dragging skill set up by the source control\n            Skill dragSkill = GetDraggingSkill(e);\n            if (dragSkill != null)\n                e.Effect = DragDropEffects.Move;\n        }\n\n        /// <summary>\n        /// When the user leaves a drag/drop operation, clear the drop marker and such.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSkills_DragLeave(object sender, EventArgs e)\n        {\n            m_dragButton = MouseButtons.None;\n            lvSkills.ClearDropMarker();\n        }\n\n        /// <summary>\n        /// Looks for a <see cref=\"Skill\"/> in the data of the provided event arguments.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        /// <returns></returns>\n        private static Skill GetDraggingSkill(DragEventArgs e)\n        {\n            if (e.Data.GetDataPresent(\"System.Windows.Forms.TreeNode\"))\n                return (Skill)((TreeNode)e.Data.GetData(\"System.Windows.Forms.TreeNode\")).Tag;\n\n            return null;\n        }\n\n        /// <summary>\n        /// Creates a plan entry and a list view item for it, from the given skill.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <returns></returns>\n        private ListViewItem CreatePlanItemForSkill(Skill skill)\n        {\n            // Gets the planned level of the skill.\n            long newLevel = m_plan.GetPlannedLevel(skill) + 1;\n            if (skill.Level >= newLevel)\n                newLevel = skill.Level + 1;\n\n            // Quits if already on lv5\n            if (newLevel > 5)\n                return null;\n\n            // Creates the plan entry and list item for this level\n            PlanEntry newEntry = new PlanEntry(m_plan, skill, newLevel);\n            ListViewItem newItem = new ListViewItem(newEntry.ToString()) { Tag = newEntry };\n\n            return newItem;\n        }\n\n        /// <summary>\n        /// Gets the mouse button used to drag\n        /// </summary>\n        /// <param name=\"e\"></param>\n        private void SetDragMouseButton(DragEventArgs e)\n        {\n            if ((e.KeyState & (int)Keys.LButton) != 0)\n                m_dragButton = MouseButtons.Left;\n            else if ((e.KeyState & (int)Keys.RButton) != 0)\n                m_dragButton = MouseButtons.Right;\n        }\n\n        #endregion\n\n\n        #region Other list events : keyboard, click, hovering, selection change\n\n        /// <summary>\n        /// On a doube-click on one of the list items, we open the skill browser.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSkills_MouseDoubleClick(object sender, MouseEventArgs e)\n        {\n            if (lvSkills.SelectedItems.Count != 1)\n                return;\n\n            // When the first entry is a skill, shows it in the skill browser\n            if (GetFirstSelectedEntry() != null)\n                miShowInSkillBrowser_Click(sender, e);\n            // When it is a remapping point, edit it\n            else\n            {\n                // Retrieves the point\n                ListViewItem nextItem = lvSkills.Items[lvSkills.SelectedIndices[0] + 1];\n                RemappingPoint remappingPoint = GetPlanEntry(nextItem).Remapping;\n\n                // Display the attributes optimizer\n                // if it's not already shown\n                // When we click on another point the previous form closes\n                if (remappingPoint != m_previousRemappingPoint)\n                    WindowsFactory.GetAndCloseByTag<AttributesOptimizerWindow, PlanEditorControl>(this);\n\n                m_previousRemappingPoint = remappingPoint;\n                WindowsFactory.ShowByTag<AttributesOptimizerWindow, PlanEditorControl>(ParentForm, this, remappingPoint);\n            }\n        }\n\n        /// <summary>\n        /// Handles key press.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSkills_KeyDown(object sender, KeyEventArgs e)\n        {\n            switch (e.KeyCode)\n            {\n                case Keys.Enter:\n                    miChangeNote_Click(sender, e);\n                    break;\n                case Keys.F9:\n                    tsbToggleRemapping_Click(null, null);\n                    break;\n                case Keys.F5:\n                    UpdateDisplayPlan();\n                    break;\n                case Keys.Delete:\n                    RemoveSelectedEntries();\n                    break;\n                case Keys.A:\n                    if (e.Control)\n                        lvSkills.SelectAll();\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// When the user selects another entry, we do not immediately process the change but rather delay it through a timer.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSkills_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (tmrSelect.Enabled)\n                return;\n\n            tmrSelect.Start();\n        }\n\n        /// <summary>\n        /// When the selection update timer ticks, we process the changes caused by a selection change.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tmrSelect_Tick(object sender, EventArgs e)\n        {\n            tmrSelect.Stop();\n            OnSelectionChanged();\n        }\n\n        /// <summary>\n        /// Handles the selection change (delayed every 100ms through a timer).\n        /// </summary>\n        private void OnSelectionChanged()\n        {\n            if (lvSkills.SelectedIndices.Count == 0)\n            {\n                tsbMoveUp.Enabled = false;\n                tsbMoveDown.Enabled = false;\n                ResetPrereqMarks();\n            }\n            else\n            {\n                tsbMoveUp.Enabled = lvSkills.SelectedIndices[0] != 0;\n                tsbMoveDown.Enabled = lvSkills.SelectedIndices[lvSkills.SelectedIndices.Count - 1] != lvSkills.Items.Count - 1;\n                ResetPrereqMarks();\n            }\n\n            // Creates the prerequisite indicators\n            foreach (ListViewItem current in lvSkills.Items)\n            {\n                bool isSameSkill = false;\n                bool isPreRequisite = false;\n                bool isPostRequisite = false;\n\n                // Checks whether it is a prerequisite of the currently selected entry and whether we should highlight it\n                if (!Settings.UI.SafeForWork && Settings.UI.PlanWindow.HighlightPrerequisites && SelectedEntries.Count() == 1)\n                {\n                    PlanEntry currentEntry = current.Tag as PlanEntry;\n                    PlanEntry selectedEntry = lvSkills.SelectedItems[0].Tag as PlanEntry;\n                    if (currentEntry != null && selectedEntry != null)\n                    {\n                        long neededLevel;\n                        if (currentEntry.Skill.HasAsImmediatePrereq(selectedEntry.Skill, out neededLevel))\n                        {\n                            if (currentEntry.Level == 1 && neededLevel >= selectedEntry.Level)\n                                isPostRequisite = true;\n                        }\n\n                        if (selectedEntry.Skill.HasAsImmediatePrereq(currentEntry.Skill, out neededLevel))\n                        {\n                            if (currentEntry.Level == neededLevel)\n                                isPreRequisite = true;\n                        }\n\n                        if (currentEntry.Skill == selectedEntry.Skill)\n                            isSameSkill = true;\n                    }\n                }\n\n                // Color depends on the entry's status\n                if (current.Tag is RemappingPoint)\n                    current.ImageIndex = 3;\n                else if (isSameSkill)\n                    current.ImageIndex = 1;\n                else if (isPreRequisite)\n                    current.ImageIndex = 2;\n                else if (isPostRequisite)\n                    current.ImageIndex = 0;\n                else\n                    current.ImageIndex = -1;\n            }\n\n            UpdateStatusBar();\n        }\n\n        /// <summary>\n        /// Resets the prerequisites marks.\n        /// </summary>\n        private void ResetPrereqMarks()\n        {\n            // We avoid using Invalidate() as it cause the whole listview to flicker \n            foreach (ListViewItem current in lvSkills.Items)\n            {\n                current.ImageIndex = -1;\n            }\n        }\n\n        /// <summary>\n        /// When the user hovers an item, we update the tooltip.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSkills_ItemHover(object sender, ListViewItemMouseHoverEventArgs e)\n        {\n            if (e.Item == null)\n                return;\n\n            // Is it an entry ?\n            if (e.Item.Tag is PlanEntry)\n            {\n                Skill skill = GetPlanEntry(e.Item).CharacterSkill;\n                StringBuilder builder = new StringBuilder(skill.Description.WordWrap(100, false));\n\n                if (!skill.IsKnown)\n                {\n                    builder.AppendLine();\n                    builder.Append(\"You do not know this skill - you \");\n                    if (!skill.IsOwned)\n                        builder.Append(\"do not \");\n                    builder.Append(\"own the skillbook.\");\n                }\n                e.Item.ToolTipText = builder.ToString();\n            }\n                // Then it is a remapping point\n            else if (e.Item.Tag is RemappingPoint)\n            {\n                RemappingPoint point = e.Item.Tag as RemappingPoint;\n                e.Item.ToolTipText = m_areRemappingPointsActive ? point.ToLongString() : \"Remapping (ignored)\";\n            }\n        }\n\n        /// <summary>\n        /// Upon column reordering we force a column settings update.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSkills_ColumnReordered(object sender, ColumnReorderedEventArgs e)\n        {\n            m_columnsOrderChanged = true;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void lvSkills_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Left)\n                return;\n\n            lvSkills.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we show the item's tooltip if over an item.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lvSkills_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            if (!m_plan.Any())\n            {\n                lvSkills.Cursor = Cursors.Default;\n                return;\n            }\n\n            lvSkills.Cursor = CustomCursors.ContextMenu;\n\n            ListViewItem item = lvSkills.GetItemAt(e.Location.X, e.Location.Y);\n            if (item == null)\n            {\n                m_tooltip.Hide();\n                return;\n            }\n\n            m_tooltip.Show(item.ToolTipText, e.Location);\n        }\n\n        /// <summary>\n        /// When the mouse leaves the list, we hide the item's tooltip.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void lvSkills_MouseLeave(object sender, EventArgs e)\n        {\n            m_tooltip.Hide();\n        }\n\n        #endregion\n\n\n        #region Other controls' handlers\n\n        /// <summary>\n        /// Left toolbar > Toggle skills panel.\n        /// Display a skill list on the right.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void toggleSkillsPanelButton_Click(object sender, EventArgs e)\n        {\n            pscPlan.Panel2Collapsed = !pscPlan.Panel2Collapsed;\n            tsbToggleSkills.Checked = !pscPlan.Panel2Collapsed;\n            pscPlan.SplitterDistance = pscPlan.Width - 300;\n        }\n\n        /// <summary>\n        /// Left toolbar > Toggle remapping point.\n        /// Adds or remove a remapping point.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbToggleRemapping_Click(object sender, EventArgs e)\n        {\n            if (lvSkills.SelectedIndices.Count == 0)\n                return;\n\n            ListViewItem item = lvSkills.SelectedItems[0];\n            object tag = item.Tag;\n\n            // Remove an existing point\n            if (tag is RemappingPoint)\n            {\n                // Selects the next item and focuses it.\n                int entryIndex = lvSkills.SelectedItems[0].Index + 1;\n                lvSkills.Items[entryIndex].Selected = true;\n                lvSkills.Items[entryIndex].Focused = true;\n\n                // Retrieve the original entry after this item and remove its remapping point.\n                PlanEntry entry = lvSkills.Items[entryIndex].Tag as PlanEntry;\n                PlanEntry originalEntry = GetOriginalEntry(entry);\n                originalEntry.Remapping = null;\n            }\n                // Toggle on a skill\n            else\n            {\n                // Retrieves the focused item's hash code.\n                item.Focused = true;\n\n                PlanEntry entry = tag as PlanEntry;\n                PlanEntry originalEntry = GetOriginalEntry(entry);\n\n                // Add a remapping point\n                originalEntry.Remapping = originalEntry.Remapping ?? new RemappingPoint();\n            }\n        }\n\n        /// <summary>\n        /// Left toolbar > Toggle color key panel.\n        /// Display a color key panel at the bottom.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbColorKey_Click(object sender, EventArgs e)\n        {\n            pFooter.Visible = !pFooter.Visible;\n            tsbColorKey.Checked = pFooter.Visible;\n        }\n\n        /// <summary>\n        /// When the user clicks the \"Columns Settings\",\n        /// we display the suggestions window and save the changes.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void columnSettingsMenuItem_Click(object sender, EventArgs e)\n        {\n            // Update the settings from the current columns\n            using (PlanColumnSelectWindow dialog = new PlanColumnSelectWindow(ExportColumnSettings()))\n            {\n                if (dialog.ShowDialog() != DialogResult.OK)\n                    return;\n\n                ImportColumnSettings(dialog.Columns.Cast<PlanColumnSettings>());\n                Settings.UI.PlanWindow.Columns.Clear();\n                Settings.UI.PlanWindow.Columns.AddRange(ExportColumnSettings());\n            }\n        }\n\n        /// <summary>\n        /// Auto-Sizes the columns width.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void autoSizeColumnsMenuItem_Click(object sender, EventArgs e)\n        {\n            foreach (ColumnHeader column in lvSkills.Columns.Cast<ColumnHeader>())\n            {\n                m_columns[column.Index].Width = -2;\n            }\n            UpdateListColumns();\n        }\n\n        /// <summary>\n        /// When the implant set changes we update the plan.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void cbChooseImplantSet_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (cbChooseImplantSet.SelectedIndex == m_lastImplantSetIndex)\n                return;\n\n            await UpdateImplantSet();\n\n            if (m_init)\n                UpdateSkillList();\n        }\n\n        /// <summary>\n        /// When the user clicks the \"choose implant set\", we update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbChooseImplantSet_DropDown(object sender, EventArgs e)\n        {\n            UpdateImplantSetList();\n        }\n\n        /// <summary>\n        /// When the user doesn't select a set, display the last selected.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbChooseImplantSet_DropDownClosed(object sender, EventArgs e)\n        {\n            if (cbChooseImplantSet.SelectedIndex == -1)\n                cbChooseImplantSet.SelectedIndex = m_lastImplantSetIndex;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanEditorControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>147, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"miChangeLevel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        vAAADrwBlbxySQAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAALmSURB\n        VDhPZZJLTxNhFIaJP8JEFwb1FxhHV8QLujDRhXEBRI0GNQQSFAQRUUQwBAm30nKrFFqhF3qlLdPOUCgt\n        vQJthba00JarYiSDcWHcqenr0Bk1lTc5+VbP851zvi/nTza3tlyJRMIRjcXNwXBE7w6EtNO+ec2k158p\n        m3dOTbs8pbknTh7ikeykNjaYWCIJVygMncOLftKGVg2ZVQKD9Ve3QlN/+MjRg5JYMsV8+fYdH/a+YnVn\n        F+54CnPJTczGUtD6QtB4g5nqNdE/+1T6+mO5x7MlvkiUWd/dw9LmDhZSmwisbWEmmoDKHThQnTrrj2bl\n        +Fke5WL1LzCh9W325jWYF8JQs7f9D44459FGOnBdpEwXCEfP8ygX5YybmQqvgAxGMgLj/BIMc4uZ0xwI\n        Q+qYQ82YFcXDBlzseJcu7FFkC0RmG0MvxhD/+Bmrn3Yze/CurLGjbMMWSUAfWEbzhBPlCgsud8nTRX2q\n        bIHASDNTS3EEWWA2loSHhe3sDrqsLrRbnGi3uiGw+VA1pEOaIJDsbAePcmkaMzFqTxD7Xey3LrA40KCl\n        2JmdqFVTqNNOonPCDl1TE9JFNzISHuXSbrAyZDAK6v0yeqhZVI0aMUhOo54FW9jWhaQZIpEIFEWhv7IC\n        YrG0hEe5tGhIxsQuj16MQ2L3Q+kJQUC5MOZfgsw+CdsggcgUgcbGRjyQ6NOlCssFHuXyfGScKXurQolY\n        hVKJBo+ketwVq1Etk/+Fx7oJNOhIFMpMeGxw5vMolyuve5jb3TLcH1CinIUrR02olMqgHvgH1yg0qNTZ\n        cUtG4onZdYlHueQ3CplmPQ1jIILZlXV4olEYpRwsaSVYqRJlKhrV4w7cGbXiKenJFpx7JWSKe+UoH9aj\n        jv0w6r48+OgOyLsIPGTHKJFbUKGdxrMJN+4padRR/mzBqdo25nRdB4gXApx5KQTBPpOwgcDV1h7kvRna\n        /zy4NqBBwbAJN2VsB5Z9QU7ObwjkSucBbV0TAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"miShowInSkillExplorer.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABh0RVh0U29m\n        dHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAAk9JREFUOE+Vkm1P0mEYxd3c+hi8cmsrDTV1VJoaJlqE\n        TygmjYCEcGACKqAiOIKUJ0WRINNQJJ/LLB9mK0oFKmO6yGbrO/heN7cT0b9NhlL93t27zn12XTsn6X+Q\n        +YUdzUFRMvH8O/yF2mThEpvUsMohSd7ySE1r9WG5X+gmxolhT1Ywb89V74mXuLj3uh5y3130hQwwhbSI\n        mNgJ2fFUjVxLYY0zDizB+xj76oJ3ZxhTu27Mfvfg2Q9vxKQL8oDQRMjjKXPR3KoVKYa2B/Dky0N4dh5h\n        4tsIpndHMbM7BuOmBtJ1gZ6Qx0Lrzc+9Pkg9HNg0wRHqhWKlEZyZanCf16BrTQF9oA3iN1wbIf9NTls6\n        LmqycFlP2a9y0tH8qhG2TSMk8/WoHqVbbz4tP/VLx5tnhQWLdcPRT0fJbE1D5zsltO/bYNjQwBjUoWO1\n        BXRH0SohicKZZar4L1jxMZKlZ9Dua4Xap4RuXY1uvxaqZSlK+wtjDOomKjo4c8x4g1TJaZBlZ3FecW6/\n        1EyFeE6AnoAOfC87YnLFynAWR0+o8dwIR+JN3IMsJTmXos481G90RjcRTHJAtxeB4SqG7KUILcsSsKcq\n        E/cgW0V288bZ6A50wfxBD9unHgx+tsC1ZcPjbTsUy424NV15cg8ymlNTslXpB7IFcfQUy0dDNBVHyArn\n        Vh/kiw2o9ZYd34M/ZLakMSPx7lEf5IFmKQS9/yqa5kUQz95B+VBJbA9OIhJvck57BumSNpuUb6CQqKbc\n        cImtIL4H/0qB4YKqyJx3JMakpJ/GeCksDt4euAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <metadata name=\"sfdSave.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>357, 17</value>\n  </metadata>\n  <metadata name=\"tmrAutoRefresh.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"tsPlan.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>450, 17</value>\n  </metadata>\n  <data name=\"tsbMoveUp.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHXSURBVDhPlZLdS1phHMf9V0ZFsYtCRoNuYheNqLHKG4m6\n        s6KbKa2Yg5aMICzobfRizKXL06qtoGJDx4Iy6sZeFQ0MdlFqL2r0Ii45au678zzH0zicA5s/+PAcft/z\n        /TwX5yjI9M9HIWCcjeKtLQL9hzBejJ1DM3SG+t5T1HSfoFwfopS1B0GLwpAiswGYVzMw/bjDO3sa/csp\n        9CwkYZhj8ZpJ4KXlFi3jcYqyZU8qIPTMRND5MQLdBH+z2niKakMIT7K3CpRoXGLBnGMXuczj6uZ/Cw6O\n        WejGg/D9jGY3f0cimP7qykb8+IMs9JNh2NbTUKoZiaS0qkkssC5uZiNxeeAbUG8M4GHdlEgiEZi/rIFN\n        /YbviEWH+RxTTu4rcGWtFWgcTqDylRdFNRbs+8NIpjJSgWlmBVfxNC2Xt3nxqHUfg5ygeSxGKVZ/RsFz\n        C/KrTPQ9iWCU+Y7QRRIn0SRCHOSnsa5laLmhL4DCWoZmQi4r8AcS9xCB4RNfVr3xoOCZWZTLCrYP45Qd\n        DiIg5bouD55qV5FXOYIdP8l/UWQFTk8M6+4bON0xKihWvceDioF7yF5AVuBwXfFskfMadu7Zzp38npw8\n        ZCcrWNq8/G9kBWSZC3xTofgDGmx+aEZLgGMAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"tsbMoveDown.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHwSURBVDhPrZDtS1NRHMf35/TwInxRINWIXpXIegIxCAt1\n        oSWVBiuKIdG0YiEja+Zqlou5UpiWzh7ETRrGikKFQKkY5by1rfKhle7RT9u5976Q3RcJfeHD4Z7v+X0O\n        9+gKsfbGUWntidPcHcN0J0rDzW9Ut32l8oqE4dIcelNEUNo0ixhUUxh0vQTHaA778yw2XwbrQBpLXwqz\n        J8k51zKNzj8YbyUEJcZ3xYICFneMC/dinOqQb65olSgzR9il3KqypTq0VuAZfst6sq2s9j8LHjwJKZUc\n        090oTbfnaLgRxmidpsoyqTRytu6tWSvo8gaVSs4Z+yw9wQwd+Qe9NpCjvHFUaeQUCRyP/CTTq6TyJNM5\n        6to+0OXPcd6d44htBX3tY6XPCYoEdvcL5hMZFhJZsR5tmaLFu0pVe5aKqz/YUTMkOrUvErS7nhL5nhL/\n        frZT4oTtI+aHcPj6L/Y1h9l40EPpMS+763xE4iltwfSXZV69X8RgGuekY4XTziSHLBJ7TFNsPz7CBoOT\n        wWBEnNMUvJlJCAbHY2yu9HLgskT5xRn09QE27b9P78jnfP9boCkITC4xNrFIYGKJPn9USHbWj1FS4aJ7\n        KCz2VTQFw6F5mdeFdQHXM0lIOvs/iW8VXx5NQX/w5z+jKShsrgd5Uqf7C6AcgeBP0yOcAAAAAElFTkSu\n        QmCC\n</value>\n  </data>\n  <data name=\"tsSortPriorities.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADzSURBVDhPY6AKyJr9SGXR4Xf/oVzSAUgzRQaAALIB5eXl\n        2UD8v6Sk5H9BQcH/7Ozs/6mpqf8TEhL+R0ZG/g8ODka1DOaCRQcpdAXZYO7+t/9n7Xn9P6T3tgpUiHQA\n        0ty75SV5Xghpu63Suek5XHNMTEx2RETE/8DAwP9eXl7/nZ2d/9vY2Pw3MTH5r6ur+19NTQ3Vorb1z/83\n        rnn6v2bV0wEKxPJlj/+XLn38v3jxY/JdANJsUXiF/FgAaYa5wMjIKFtbW/u/iorKfzk5uf/i4uL/hYSE\n        /vPw8PxnZ2f/z8zMjOpSkEYQti263AEVohdgYAAA22181PDz9hkAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"tsbToggleSkills.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIoSURBVDhPjZLfT1JhGMf9Y7rtzm5qq9Xf0Fa5Zuuqra2L\n        NpvN5tZKlwyssJy2WZtFUIFugHYSUdESEGgIIoLk+BUVQTIVzkERPnGYbbpO2md7b973eT/PnmffJiXE\n        0haemTHE4ga7uztsrOfYezqcWq1GZaeMc8LE4qyZsrhJMjzPqs/+fwJJLOKdGiG94qRWkdhMB1lzPifk\n        sh0uoN5ZKm0y//4VyeVZqpUy4q8UW1GBlYkBoj4HlUqlPs4u1Wq1Xl47KJQvAvMfCDkM7IjrfF9bJBOe\n        IRcwERztIeybJZ/PUygUkCRJWbDkmiQddjFneIC+6zJfF3SERztZtqhxOwQikQjxeJxisfi3QCbknSOb\n        jDClU6G9cY6wpZNVm5rQuBbB/Ba3292QiKKoLMgkvxCcM7Fg6ef+lWbiHx+Rnu4jHxLQDw8hCALRaJTt\n        7W1lgSSWcNaX6Bl/Qe+1U2QDrylErQQnh3nWr8VkMpFIJBqL3PtyENlqNQwS/GSlq7WZhGeQn0tmbG+e\n        0qtRYzQayeVyyt3/MGkx4Jseof38cT6/ayPmGKZffReVSoXdbqdUKh0ucNisTI0M0XHpBGM9F9E9vMWd\n        9jb0ej2pVKqRgb1SZSLLAYxDGjpaz9B99SS3r7fQp9USi8X+vbz9/PiW4eWghpstZ7lw+hg93ffwer2U\n        y+WjP8vIKVtwuxjo6+XJYw1+v//oufcjF8pByWazjaMY2wM0Nf0GcTz/Xh9VRkgAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"tsbToggleRemapping.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGnSURBVDhPzY/bSgJRFIZ9Hh/FJ4gigggCCYIgCCIwTMmw\n        g1aGllmKmmZNapl5tpLOJ9OIMG2aNNPuYtyXf1unIHCCugj64b/a6/vWXpI/j9ZfwtdqfEV8PP0sdciZ\n        eoVj/xX2vSrUzDcC5oTHOq3nkMcqrfuAbwzWBfb9Kmy7VVgTFSjdnLjAc8QjkSWI0UavCRwpQaDZKMKW\n        rGI5XsFi9AVDDlZcUN8azRBEKBxKE1j3BIHKw2EpVoE5UoZpp4wBS15c4KQbwxQMXREELwksCUGgcD1i\n        IVSGMfgMw1YJffO5ZoFcLqd38ghSOHBBsHlOMB/jIZPJMGhjMRcoYWazCL33CT2GO0il0mbJcpIX4DMC\n        32kNxvBbY6jfnMe0/wk6hsP4GofuqVvxE8xxHn4KeynMnNQwGxQEvcYcJtc5aD2P0LhYdGpvxAWmyBs2\n        KMgc17B2VIN+WxDI9XcYc7MYXWGhshfQrs6KCwz0y/WtelodhacCgqBr4hZq50MDVtryaFVlxAXfpUOT\n        pWABw9Y8FEv3aFGmfydooxtbRzIN8LMfT/8iEsk7c+9kh6nHk8MAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"tsbColorKey.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAMfSURBVDhPbZJrSJNxFMaPlyRK8kPZVcqSLiRUYAvTLlip\n        Q8uVlaXDopvOS5tKthnRayZdrKAs57zl3bTUaWrq1NyUdM2t1CmmWUYZFGlf+pBQ9PTu3bxAPnA4/OH/\n        ew7n4dB/CjPsWiN9U+B14/Unv5Te3+5XDGPr4rVN80Ta00SwsvyaRWH6eY4SQ3FU3jvcUI6AKRsGU/oO\n        TMkgmKIBhN4xYIXo5QdXactmCzFDLLwqVv/5dt1nJFV+BFM+ArlqFKPjE1Bqv06ZJOQYsfRk4W/PhPpA\n        C2nW/Eh9tuzxe8TkD0Gcx1buIJS6bzDp7ehPiBU9EMvfQPzQgNDrHVhwsuG79F7+SjMd3uXpe8uIqMw+\n        CO/3Qphq5Po5uRFF6lFcyGbfN19BeL0TwuSXECa1w/VUHVyiX1RmZGTMIZtw3f0TqT3gJ2rBT9KBf60L\n        wXdf43LhAC4X9EOS3g1+ggZ8aSv4F5rBj1PBI7wWdseax9LT0zfSEklX995EHZxFrdgk0YAXp8FOaRvU\n        vd+5FQxDP8CLaAAv/DncztZifYgSywPKQIey/l598Mib1kr0v1zjOkDHX4CEGlizZRvSiiulw5xBW/84\n        7AQ1sPVTgryfgrweg3YWgviVOJhYFU9OYt03Z5EGdLQJdKzFXEHNkBUNcQbqvnGQfzXItwK0l528uxjk\n        mQ/a/wxhKaXnySFCV7MxmjU4VA8KbAAdbuS6rHDQbGAc46ZNTd9VBPLIg/VR1USaQuFjuoH4DdFtoAM1\n        oIBakKCO67L8AbMBmwUH7ymdnr49Fw5nWoaysrLcTAYOiyK14zb+VSC/6bqU188ZtBtZg0l4RwEHkyDz\n        b+DVqqScnBxH7hRsRHpf6yA2A59yruwFVaju+MIZfP3xCy7BbAaTMLvG6hh1g0Kh2MrBk7KP7JRZBbf+\n        oX1PsFBQCfcoFdwjGuEuqodLEJuBCWbDXBal6byZ+iiQYRhbCzotJ7GaN/dM+wgdUZmTN6VuSp/NxTZU\n        /dPr0vN77PXxZoVnSsAoPbZcbEpwjtWUbJM1yoOTK86mpWXw5HL5YssXi4j+AUNSAjR4Zvh7AAAAAElF\n        TkSuQmCC\n</value>\n  </data>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>271, 17</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABw\n        BgAAAk1TRnQBSQFMAgEBBwEAAXQBAgF0AQIBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABIAMAAQEBAAEQBgABEP8A/wD/AP8A/wD/AP8A/wD/ACMAAUQBXAFzAW4cAAE4AQkBuwFOHAAB4gES\n        AXMBUyQAAXkBMgF5ATIBeQEyAXkBMgF5ATIOAAFlAWAB6QFkAXMBbhoAAXgBDQHZAR0BuwFOGgABAwEb\n        AScBKwFzAU8iAAF5ATIBeQFOAXkBTgF5AU4BeQEyDgABZgFgAdEBbQHpAWQBUwFuGAABmQENAZsBOgHZ\n        AR0BuwFKGAABAwEfAW4BRwEnASsBcgFPFAABPwFPAT8BTwE/AU8BPwFPAT8BTwIAAXkBMgF5AU4BeQFO\n        AXkBTgF5ATIOAAGIAWQB8QFxAfEBbQHqAWQBUgFuFgABuQERAbwBPgGcAT4B2gEdAbsBRhYAASQBJwGP\n        AUsBbwFHAScBKwFyAU8SAAE+AVMBPgFTAT4BUwE+AVMBPwFPAgABeQEyAXkBTgF5AU4BeQFOAXkBMg4A\n        AcoBaAEyAXIB0AFtAfEBcQEKAWUBMgFuAf8BfxIAAdoBGQG8AUIBmwE6AbwBPgH6AR0BmwFGAf8BfxIA\n        AUYBKwGRAU8BbgFHAY8BSwEoAS8BcQFLAf8Bfw4AAT4BUwE+AVMBPgFTAT4BUwE/AU8CAAF5ATIBeQFO\n        AXkBTgF5AU4BeQEyDgABCwFpAVMBcgHQAW0B0QFtARIBcgELAWkBEQFuEgABGgEiAdwBSgGcAToBnAE6\n        AbwBQgH6ASEBmwFCEgABSAEzAZIBUwFuAUcBbgFHAZABSwFIAS8BcAFLDgABPgFTAT4BUwE+AVMBPgFT\n        AT4BUwIAAXkBMgE+AVMBeQFOAXkBTgF5ATIOAAFNAW0BdAF2ARIBcgESAXIBMwFyASwBaQErAWUSAAE7\n        ASoB/QFOAbwBQgG8AUIB3AFGAToBJgH5ASESAAFqATcBswFXAZABSwGQAUsBkQFPAUkBNwEpATMMAAGM\n        ATEBPgFTAT8BZwE+AVMBPgFTAT4BUwEpASUBeQEyAT4BUwE+AVMBPgFTAXkBMgGlARQMAAGOAXEBlQF2\n        AVMBcgF0AXYBjgFtAXUBbhQAAVwBMgEdAVMB3QFKAf0BTgFbATIB/AFOFAABjAE/AbQBWwGSAVMBswFX\n        AWwBPwFzAVcQAAE+AVMBPwFnAT8BZwE/AWcBPgFTAgABeQFOAT4BUwE+AVMBPgFTAXkBMg4AAbABcQG2\n        AXYBlQF2AdEBcQG2AXIWAAGcATYBHQFXAR0BUwGcAToBHAFXFgABjQFDAbUBWwG0AVsBjgFHAZUBXxIA\n        AT4BUwE/AWcBPwFnAT8BZwE+AVMCAAF5AU4BPgFTAT4BUwE+AVMBeQEyDgAB8QFxAbYBdgESAXIBGQF3\n        GAABnAE+AT0BVwHdAUIBXQFjGAABjwFHAbUBXwGQAU8BuAFnFAABPgFTAT8BZwE/AWcBPwFnAT4BUwIA\n        AT4BUwE+AVMBPgFTAT4BUwF5ATIOAAHxAXUB8QFxAToBdxoAAb0BQgG9AT4BfQFnGgABrwFLAY8BRwG5\n        AWsWAAE+AVMBPgFTAT4BUwE+AVMBPgFTAgABPgFTAT4BUwE+AVMBPgFTAXkBTg4AATIBcgFaAXccAAHd\n        AUYBfQFrHAABkQFPAboBayQAAT4BUwE+AVMBPgFTAT4BUwF5AU52AAE+AVMBPgFTAT4BUwE+AVMBPgFT\n        hgABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/wEABv8CAAb/AgAG/wIABv8CAAb/\n        AgAG/wIAAfABDwH+AX8C/wIAAfgBHwH8AT8C/wIAAfwBPwH4AR8C/wIAAf4BfwHwAQ8C/wIABv8CAAb/\n        AgAG/wIABv8CAAb/AgAG/wIAEP8B8wH/AfMB/wHzAv8BBwHxAf8B8QH/AfEC/wEHAfAB/wHwAf8B8AH/\n        AcEBBwHwAX8B8AF/AfABfwHBAQcB8AEfAfABHwHwAR8BwQEHAfABHwHwAR8B8AEfAcEBBwHwAR8B8AEf\n        AfABHwGAAQMB8AE/AfABPwHwAT8BwQEHAfABfwHwAX8B8AF/AcEBBwHwAf8B8AH/AfAB/wHBAQcB8QH/\n        AfEB/wHxAf8BwQEHAfMB/wHzAf8B8wL/AQcH/wEHCP8L\n</value>\n  </data>\n  <metadata name=\"tmrSelect.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>534, 17</value>\n  </metadata>\n  <metadata name=\"tsPreferences.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>643, 19</value>\n  </metadata>\n  <data name=\"preferencesMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALsSURBVDhPlZN9SJNRFMZnzUqNxqIaikEyU3KWbXPz27np\n        bPmZrlYiRCZpy82VkmkFU0styj+yb/0vkIwU00VWpH1YRrMyDSPJ1NhIxfwqKKl4n85rgwjE6IHfe+Ce\n        +5x77n3v5cwjJwcLiQXswP+INToXGPTxFHkioXA1RVdiEfHPYouKC/KLbl2vG+npaMfDB21DL6zWzwqF\n        wttoNPoJBAI3mjN3kaysbbzm5sbv/T3duFZ9kbE+amX6X3dhZnoCfd3PMTjwbkwkEq12d3dnu2G7/CNa\n        gVtddWL67fNOXD51EoNvetF+y4Ixmw2T4+N439fL2IdsTEtlxU/zwYMeZGHP5o/OlpW0Zui2wLQrndmb\n        pkNpfi7OV5RhZmoSfV1P8XniE8btNnTcbYJOpwsgy9/bSImNQnpyPLZq1AgXb3iVFK08rdWoRwpz9DDn\n        GvDtyzQulJmZsY/DqK2psTtsvyX28T6ljVUhWaVAVOBGnDl22OpIccIC/A3pyUnIy9yJQ/o9qKu5hPaW\n        m5OFej3fMYXDCZVIhMnKSGjV0QgN8MeTlhvo7Hh0jlLsYS0NEgcciY8Mxetnj1Fk2AfL1Sug8eXEYoLD\n        kYl8yuPCQ2h1Ce7VX8PXqQngx1fcsTT0JsWoTOvXCotjQqSQrBOi1dIES13tKNmkxJrZAlsPHHBRy8Xw\n        8VjFDLzpIfMMRu0fUGo2Mzs0mxATHIQkZQTj7+XFJEZFwNd3bQXZthPhswXiVaoIjSK4TRu3CY8f3mfG\n        h224Q20e35+DzSFyFGbthlIeCJmfNw5lZ0+SpZrIJTSsn5VTWkLCiljaRqYuBRmpiUxVSRFOFuThdmM9\n        TlCkDhAXJgfXyamN5lcSKYRg1sx+SM5cLlemDJZdz9qeimN5RpTnm2jFXdiTmgDeMt43yjfQvKNEEOFC\n        /HUb2ZvlShJTzI4Nk7/0XMlvU0ilvQI+/7ibm4uJxsOIlcS8D4pNLiHY3+RJuBNsq3M8Ig7nF3XpQZRk\n        QrLKAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"$this.TrayHeight\" type=\"System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>83</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanImportationFromCharacterWindow.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class PlanImportationFromCharacterWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.panel1 = new System.Windows.Forms.Panel();\n            this.cbCharacter = new System.Windows.Forms.ComboBox();\n            this.label2 = new System.Windows.Forms.Label();\n            this.label1 = new System.Windows.Forms.Label();\n            this.lbPlan = new System.Windows.Forms.ListBox();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnLoad = new System.Windows.Forms.Button();\n            this.panel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // panel1\n            // \n            this.panel1.Controls.Add(this.cbCharacter);\n            this.panel1.Controls.Add(this.label2);\n            this.panel1.Controls.Add(this.label1);\n            this.panel1.Controls.Add(this.lbPlan);\n            this.panel1.Dock = System.Windows.Forms.DockStyle.Top;\n            this.panel1.Location = new System.Drawing.Point(0, 0);\n            this.panel1.Name = \"panel1\";\n            this.panel1.Size = new System.Drawing.Size(292, 292);\n            this.panel1.TabIndex = 0;\n            // \n            // cbCharacter\n            // \n            this.cbCharacter.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;\n            this.cbCharacter.FormattingEnabled = true;\n            this.cbCharacter.Location = new System.Drawing.Point(15, 25);\n            this.cbCharacter.MaxDropDownItems = 20;\n            this.cbCharacter.Name = \"cbCharacter\";\n            this.cbCharacter.Size = new System.Drawing.Size(121, 21);\n            this.cbCharacter.Sorted = true;\n            this.cbCharacter.TabIndex = 4;\n            this.cbCharacter.SelectedIndexChanged += new System.EventHandler(this.cbCharacter_SelectedIndexChanged);\n            // \n            // label2\n            // \n            this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(158, 9);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(70, 13);\n            this.label2.TabIndex = 3;\n            this.label2.Text = \"Select Plan...\";\n            // \n            // label1\n            // \n            this.label1.AccessibleName = \"Select \";\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(12, 9);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(95, 13);\n            this.label1.TabIndex = 2;\n            this.label1.Text = \"Select Character...\";\n            // \n            // lbPlan\n            // \n            this.lbPlan.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lbPlan.DisplayMember = \"Name\";\n            this.lbPlan.FormattingEnabled = true;\n            this.lbPlan.Location = new System.Drawing.Point(161, 25);\n            this.lbPlan.Name = \"lbPlan\";\n            this.lbPlan.Size = new System.Drawing.Size(113, 251);\n            this.lbPlan.TabIndex = 1;\n            this.lbPlan.SelectedIndexChanged += new System.EventHandler(this.lbPlan_SelectedIndexChanged);\n            this.lbPlan.DoubleClick += new System.EventHandler(this.btnLoad_Click);\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(205, 298);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 5;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // btnLoad\n            // \n            this.btnLoad.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnLoad.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnLoad.Enabled = false;\n            this.btnLoad.Location = new System.Drawing.Point(124, 298);\n            this.btnLoad.Name = \"btnLoad\";\n            this.btnLoad.Size = new System.Drawing.Size(75, 23);\n            this.btnLoad.TabIndex = 6;\n            this.btnLoad.Text = \"Load\";\n            this.btnLoad.UseVisualStyleBackColor = true;\n            this.btnLoad.Click += new System.EventHandler(this.btnLoad_Click);\n            // \n            // PlanImportationFromCharacterForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(292, 333);\n            this.Controls.Add(this.btnCancel);\n            this.Controls.Add(this.btnLoad);\n            this.Controls.Add(this.panel1);\n            this.Name = \"PlanImportationFromCharacterForm\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Cross Character Plan Import\";\n            this.Load += new System.EventHandler(this.CrossPlanSelect_Load);\n            this.panel1.ResumeLayout(false);\n            this.panel1.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Panel panel1;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnLoad;\n        private System.Windows.Forms.ListBox lbPlan;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.ComboBox cbCharacter;\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanImportationFromCharacterWindow.cs",
    "content": "using System;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// This window allow the exportation of plans between characters.\n    /// </summary>\n    public partial class PlanImportationFromCharacterWindow : EVEMonForm\n    {\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"targetCharacter\"></param>\n        public PlanImportationFromCharacterWindow(Character targetCharacter)\n        {\n            InitializeComponent();\n            TargetCharacter = targetCharacter;\n        }\n\n        /// <summary>\n        /// Gets the selected source plan.\n        /// </summary>\n        public Plan SourcePlan { get; private set; }\n\n        /// <summary>\n        /// Gets the target character.\n        /// </summary>\n        public Character TargetCharacter { get; }\n\n        /// <summary>\n        /// Gets the exported plan. \n        /// </summary>\n        /// <remarks>This plan has not been added to the character's list and still has the same name than the source plan.</remarks>\n        public Plan TargetPlan { get; private set; }\n\n        /// <summary>\n        /// Populate the plans list from the given character\n        /// </summary>\n        /// <param name=\"character\"></param>\n        private void PopulatePlans(Character character)\n        {\n            btnLoad.Enabled = false;\n            lbPlan.Items.Clear();\n            foreach (Plan plan in character.Plans)\n            {\n                lbPlan.Items.Add(plan);\n            }\n        }\n\n\n        #region Event handlers\n\n        /// <summary>\n        /// Populate the character list with all characters except the target\n        /// </summary>\n        private void CrossPlanSelect_Load(object sender, EventArgs e)\n        {\n            cbCharacter.Items.Clear();\n            foreach (Character character in EveMonClient.Characters.Where(x => x.CharacterID != TargetCharacter.CharacterID))\n            {\n                cbCharacter.Items.Add(character);\n            }\n            cbCharacter.SelectedIndex = 0;\n            PopulatePlans(cbCharacter.SelectedItem as Character);\n        }\n\n        /// <summary>\n        /// When the selected character changed, we update the plans list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbCharacter_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            PopulatePlans(cbCharacter.Items[cbCharacter.SelectedIndex] as Character);\n        }\n\n        /// <summary>\n        /// When the selected plan changed, we enable/disable the \"load\" button.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbPlan_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            btnLoad.Enabled = lbPlan.SelectedItems.Count == 1;\n        }\n\n        /// <summary>\n        /// When the user clicks \"load\", import the plan.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnLoad_Click(object sender, EventArgs e)\n        {\n            SourcePlan = (Plan)lbPlan.SelectedItem;\n            TargetPlan = SourcePlan.Clone(TargetCharacter);\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanImportationFromCharacterWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanManagementWindow.Designer.cs",
    "content": "﻿using EVEMon.Common.Controls;\n\nnamespace EVEMon.SkillPlanner\n{\n    partial class PlanManagementWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PlanManagementWindow));\n            this.label1 = new System.Windows.Forms.Label();\n            this.btnClose = new System.Windows.Forms.Button();\n            this.ofdOpenDialog = new System.Windows.Forms.OpenFileDialog();\n            this.panel1 = new System.Windows.Forms.Panel();\n            this.lbPlanList = new EVEMon.Common.Controls.DraggableListView();\n            this.PlanName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.PlanDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.PlanSkills = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.PlanDescription = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.cmiOpen = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmiExport = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.cmiRenameEdit = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmiDelete = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStrip = new System.Windows.Forms.ToolStrip();\n            this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();\n            this.tsbMoveUp = new System.Windows.Forms.ToolStripButton();\n            this.tsbMoveDown = new System.Windows.Forms.ToolStripButton();\n            this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.ButtonsFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\n            this.btnOpen = new System.Windows.Forms.Button();\n            this.menuStrip = new System.Windows.Forms.MenuStrip();\n            this.mFile = new System.Windows.Forms.ToolStripMenuItem();\n            this.miNewPlan = new System.Windows.Forms.ToolStripMenuItem();\n            this.NewPlanToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.miImportPlanFromFile = new System.Windows.Forms.ToolStripMenuItem();\n            this.miImportPlanFromCharacter = new System.Windows.Forms.ToolStripMenuItem();\n            this.ImportExportPlanToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.miExportPlan = new System.Windows.Forms.ToolStripMenuItem();\n            this.miExportCharacterSkillsAsPlan = new System.Windows.Forms.ToolStripMenuItem();\n            this.ExportCharAsPlanToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.miRestorePlans = new System.Windows.Forms.ToolStripMenuItem();\n            this.miSavePlans = new System.Windows.Forms.ToolStripMenuItem();\n            this.mEdit = new System.Windows.Forms.ToolStripMenuItem();\n            this.miRenameEdit = new System.Windows.Forms.ToolStripMenuItem();\n            this.miDelete = new System.Windows.Forms.ToolStripMenuItem();\n            this.panel1.SuspendLayout();\n            this.contextMenu.SuspendLayout();\n            this.toolStrip.SuspendLayout();\n            this.tableLayoutPanel.SuspendLayout();\n            this.ButtonsFlowLayoutPanel.SuspendLayout();\n            this.menuStrip.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(9, 6);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(236, 13);\n            this.label1.TabIndex = 1;\n            this.label1.Text = \"Select a plan to open, or multiple plans to merge:\";\n            // \n            // btnClose\n            // \n            this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnClose.Location = new System.Drawing.Point(84, 3);\n            this.btnClose.Name = \"btnClose\";\n            this.btnClose.Size = new System.Drawing.Size(75, 23);\n            this.btnClose.TabIndex = 3;\n            this.btnClose.Text = \"Close\";\n            this.btnClose.UseVisualStyleBackColor = true;\n            this.btnClose.Click += new System.EventHandler(this.btnClose_Click);\n            // \n            // ofdOpenDialog\n            // \n            this.ofdOpenDialog.Filter = \"Plan Files (*.emp)|*.emp|Plan Files (*.xml)|*.xml|All Files (*.*)|*.*\";\n            this.ofdOpenDialog.Title = \"Open Plan File\";\n            // \n            // panel1\n            // \n            this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.panel1.Controls.Add(this.lbPlanList);\n            this.panel1.Controls.Add(this.toolStrip);\n            this.panel1.Location = new System.Drawing.Point(9, 22);\n            this.panel1.MinimumSize = new System.Drawing.Size(305, 155);\n            this.panel1.Name = \"panel1\";\n            this.panel1.Size = new System.Drawing.Size(647, 327);\n            this.panel1.TabIndex = 6;\n            // \n            // lbPlanList\n            // \n            this.lbPlanList.AllowDrop = true;\n            this.lbPlanList.AllowRowReorder = true;\n            this.lbPlanList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.PlanName,\n            this.PlanDate,\n            this.PlanSkills,\n            this.PlanDescription});\n            this.lbPlanList.ContextMenuStrip = this.contextMenu;\n            this.lbPlanList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbPlanList.FullRowSelect = true;\n            this.lbPlanList.HideSelection = false;\n            this.lbPlanList.Location = new System.Drawing.Point(0, 0);\n            this.lbPlanList.Name = \"lbPlanList\";\n            this.lbPlanList.Size = new System.Drawing.Size(606, 327);\n            this.lbPlanList.TabIndex = 2;\n            this.lbPlanList.UseCompatibleStateImageBehavior = false;\n            this.lbPlanList.View = System.Windows.Forms.View.Details;\n            this.lbPlanList.ListViewItemsDragged += new System.EventHandler<System.EventArgs>(this.lbPlanList_ListViewItemsDragged);\n            this.lbPlanList.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lbPlanList_ColumnClick);\n            this.lbPlanList.SelectedIndexChanged += new System.EventHandler(this.lbPlanList_SelectedIndexChanged);\n            this.lbPlanList.DoubleClick += new System.EventHandler(this.lbPlanList_DoubleClick);\n            this.lbPlanList.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbPlanList_MouseDown);\n            this.lbPlanList.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lbPlanList_MouseMove);\n            // \n            // PlanName\n            // \n            this.PlanName.Text = \"Plan Name\";\n            this.PlanName.Width = 176;\n            // \n            // PlanDate\n            // \n            this.PlanDate.Text = \"Completion Time\";\n            this.PlanDate.Width = 197;\n            // \n            // PlanSkills\n            // \n            this.PlanSkills.Text = \"Skills\";\n            // \n            // PlanDescription\n            // \n            this.PlanDescription.Text = \"Description\";\n            this.PlanDescription.Width = 170;\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.cmiOpen,\n            this.cmiExport,\n            this.toolStripSeparator,\n            this.cmiRenameEdit,\n            this.cmiDelete});\n            this.contextMenu.Name = \"contextMenuStrip1\";\n            this.contextMenu.Size = new System.Drawing.Size(127, 98);\n            this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenu_Opening);\n            // \n            // cmiOpen\n            // \n            this.cmiOpen.Image = ((System.Drawing.Image)(resources.GetObject(\"cmiOpen.Image\")));\n            this.cmiOpen.Name = \"cmiOpen\";\n            this.cmiOpen.Size = new System.Drawing.Size(126, 22);\n            this.cmiOpen.Text = \"Open...\";\n            this.cmiOpen.Click += new System.EventHandler(this.btnOpen_Click);\n            // \n            // cmiExport\n            // \n            this.cmiExport.Image = ((System.Drawing.Image)(resources.GetObject(\"cmiExport.Image\")));\n            this.cmiExport.Name = \"cmiExport\";\n            this.cmiExport.Size = new System.Drawing.Size(126, 22);\n            this.cmiExport.Text = \"Export...\";\n            this.cmiExport.Click += new System.EventHandler(this.miExportPlan_Click);\n            // \n            // toolStripSeparator\n            // \n            this.toolStripSeparator.Name = \"toolStripSeparator\";\n            this.toolStripSeparator.Size = new System.Drawing.Size(123, 6);\n            // \n            // cmiRenameEdit\n            // \n            this.cmiRenameEdit.Image = ((System.Drawing.Image)(resources.GetObject(\"cmiRenameEdit.Image\")));\n            this.cmiRenameEdit.Name = \"cmiRenameEdit\";\n            this.cmiRenameEdit.Size = new System.Drawing.Size(126, 22);\n            this.cmiRenameEdit.Text = \"Rename...\";\n            this.cmiRenameEdit.Click += new System.EventHandler(this.miRenameEdit_Click);\n            // \n            // cmiDelete\n            // \n            this.cmiDelete.Image = ((System.Drawing.Image)(resources.GetObject(\"cmiDelete.Image\")));\n            this.cmiDelete.Name = \"cmiDelete\";\n            this.cmiDelete.Size = new System.Drawing.Size(126, 22);\n            this.cmiDelete.Text = \"Delete\";\n            this.cmiDelete.Click += new System.EventHandler(this.miDelete_Click);\n            // \n            // toolStrip\n            // \n            this.toolStrip.Dock = System.Windows.Forms.DockStyle.Right;\n            this.toolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n            this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.toolStripLabel1,\n            this.tsbMoveUp,\n            this.tsbMoveDown});\n            this.toolStrip.Location = new System.Drawing.Point(606, 0);\n            this.toolStrip.Name = \"toolStrip\";\n            this.toolStrip.Size = new System.Drawing.Size(41, 327);\n            this.toolStrip.TabIndex = 0;\n            this.toolStrip.Text = \"toolStrip\";\n            // \n            // toolStripLabel1\n            // \n            this.toolStripLabel1.Name = \"toolStripLabel1\";\n            this.toolStripLabel1.Size = new System.Drawing.Size(38, 15);\n            this.toolStripLabel1.Text = \"Move:\";\n            // \n            // tsbMoveUp\n            // \n            this.tsbMoveUp.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.tsbMoveUp.Enabled = false;\n            this.tsbMoveUp.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbMoveUp.Image\")));\n            this.tsbMoveUp.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbMoveUp.Name = \"tsbMoveUp\";\n            this.tsbMoveUp.Size = new System.Drawing.Size(38, 20);\n            this.tsbMoveUp.Text = \"Move Up\";\n            this.tsbMoveUp.Click += new System.EventHandler(this.tsbMoveUp_Click);\n            // \n            // tsbMoveDown\n            // \n            this.tsbMoveDown.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;\n            this.tsbMoveDown.Enabled = false;\n            this.tsbMoveDown.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbMoveDown.Image\")));\n            this.tsbMoveDown.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbMoveDown.Name = \"tsbMoveDown\";\n            this.tsbMoveDown.Size = new System.Drawing.Size(38, 20);\n            this.tsbMoveDown.Text = \"Move Down\";\n            this.tsbMoveDown.Click += new System.EventHandler(this.tsbMoveDown_Click);\n            // \n            // tableLayoutPanel\n            // \n            this.tableLayoutPanel.AutoSize = true;\n            this.tableLayoutPanel.ColumnCount = 1;\n            this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tableLayoutPanel.Controls.Add(this.panel1, 0, 1);\n            this.tableLayoutPanel.Controls.Add(this.label1, 0, 0);\n            this.tableLayoutPanel.Controls.Add(this.ButtonsFlowLayoutPanel, 0, 2);\n            this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tableLayoutPanel.Location = new System.Drawing.Point(0, 24);\n            this.tableLayoutPanel.Name = \"tableLayoutPanel\";\n            this.tableLayoutPanel.Padding = new System.Windows.Forms.Padding(6, 6, 0, 12);\n            this.tableLayoutPanel.RowCount = 3;\n            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n            this.tableLayoutPanel.Size = new System.Drawing.Size(659, 401);\n            this.tableLayoutPanel.TabIndex = 8;\n            // \n            // ButtonsFlowLayoutPanel\n            // \n            this.ButtonsFlowLayoutPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.ButtonsFlowLayoutPanel.AutoSize = true;\n            this.ButtonsFlowLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.ButtonsFlowLayoutPanel.Controls.Add(this.btnClose);\n            this.ButtonsFlowLayoutPanel.Controls.Add(this.btnOpen);\n            this.ButtonsFlowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\n            this.ButtonsFlowLayoutPanel.Location = new System.Drawing.Point(491, 360);\n            this.ButtonsFlowLayoutPanel.Margin = new System.Windows.Forms.Padding(0, 8, 6, 0);\n            this.ButtonsFlowLayoutPanel.Name = \"ButtonsFlowLayoutPanel\";\n            this.ButtonsFlowLayoutPanel.Size = new System.Drawing.Size(162, 29);\n            this.ButtonsFlowLayoutPanel.TabIndex = 2;\n            // \n            // btnOpen\n            // \n            this.btnOpen.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOpen.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.btnOpen.Enabled = false;\n            this.ButtonsFlowLayoutPanel.SetFlowBreak(this.btnOpen, true);\n            this.btnOpen.Location = new System.Drawing.Point(3, 3);\n            this.btnOpen.Name = \"btnOpen\";\n            this.btnOpen.Size = new System.Drawing.Size(75, 23);\n            this.btnOpen.TabIndex = 4;\n            this.btnOpen.Text = \"Open\";\n            this.btnOpen.UseVisualStyleBackColor = true;\n            this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click);\n            // \n            // menuStrip\n            // \n            this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.mFile,\n            this.mEdit});\n            this.menuStrip.Location = new System.Drawing.Point(0, 0);\n            this.menuStrip.Name = \"menuStrip\";\n            this.menuStrip.Padding = new System.Windows.Forms.Padding(4, 2, 0, 2);\n            this.menuStrip.Size = new System.Drawing.Size(659, 24);\n            this.menuStrip.TabIndex = 9;\n            this.menuStrip.Text = \"menuBar\";\n            // \n            // mFile\n            // \n            this.mFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.miNewPlan,\n            this.NewPlanToolStripSeparator,\n            this.miImportPlanFromFile,\n            this.miImportPlanFromCharacter,\n            this.ImportExportPlanToolStripSeparator,\n            this.miExportPlan,\n            this.miExportCharacterSkillsAsPlan,\n            this.ExportCharAsPlanToolStripSeparator,\n            this.miRestorePlans,\n            this.miSavePlans});\n            this.mFile.Name = \"mFile\";\n            this.mFile.Size = new System.Drawing.Size(37, 20);\n            this.mFile.Text = \"&File\";\n            this.mFile.DropDownOpening += new System.EventHandler(this.mFile_DropDownOpening);\n            // \n            // miNewPlan\n            // \n            this.miNewPlan.Image = ((System.Drawing.Image)(resources.GetObject(\"miNewPlan.Image\")));\n            this.miNewPlan.Name = \"miNewPlan\";\n            this.miNewPlan.Size = new System.Drawing.Size(239, 22);\n            this.miNewPlan.Text = \"&New Plan…\";\n            this.miNewPlan.Click += new System.EventHandler(this.miNewPlan_Click);\n            // \n            // NewPlanToolStripSeparator\n            // \n            this.NewPlanToolStripSeparator.Name = \"NewPlanToolStripSeparator\";\n            this.NewPlanToolStripSeparator.Size = new System.Drawing.Size(236, 6);\n            // \n            // miImportPlanFromFile\n            // \n            this.miImportPlanFromFile.Image = ((System.Drawing.Image)(resources.GetObject(\"miImportPlanFromFile.Image\")));\n            this.miImportPlanFromFile.Name = \"miImportPlanFromFile\";\n            this.miImportPlanFromFile.Size = new System.Drawing.Size(239, 22);\n            this.miImportPlanFromFile.Text = \"&Import Plan from File…\";\n            this.miImportPlanFromFile.Click += new System.EventHandler(this.miImportPlanFromFile_Click);\n            // \n            // miImportPlanFromCharacter\n            // \n            this.miImportPlanFromCharacter.Image = ((System.Drawing.Image)(resources.GetObject(\"miImportPlanFromCharacter.Image\")));\n            this.miImportPlanFromCharacter.Name = \"miImportPlanFromCharacter\";\n            this.miImportPlanFromCharacter.Size = new System.Drawing.Size(239, 22);\n            this.miImportPlanFromCharacter.Text = \"Import Plan from &Character…\";\n            this.miImportPlanFromCharacter.Click += new System.EventHandler(this.miImportPlanFromCharacter_Click);\n            // \n            // ImportExportPlanToolStripSeparator\n            // \n            this.ImportExportPlanToolStripSeparator.Name = \"ImportExportPlanToolStripSeparator\";\n            this.ImportExportPlanToolStripSeparator.Size = new System.Drawing.Size(236, 6);\n            // \n            // miExportPlan\n            // \n            this.miExportPlan.Image = ((System.Drawing.Image)(resources.GetObject(\"miExportPlan.Image\")));\n            this.miExportPlan.Name = \"miExportPlan\";\n            this.miExportPlan.Size = new System.Drawing.Size(239, 22);\n            this.miExportPlan.Text = \"&Export Plan...\";\n            this.miExportPlan.Click += new System.EventHandler(this.miExportPlan_Click);\n            // \n            // miExportCharacterSkillsAsPlan\n            // \n            this.miExportCharacterSkillsAsPlan.Image = ((System.Drawing.Image)(resources.GetObject(\"miExportCharacterSkillsAsPlan.Image\")));\n            this.miExportCharacterSkillsAsPlan.Name = \"miExportCharacterSkillsAsPlan\";\n            this.miExportCharacterSkillsAsPlan.Size = new System.Drawing.Size(239, 22);\n            this.miExportCharacterSkillsAsPlan.Text = \"Export Character &Skills as Plan...\";\n            this.miExportCharacterSkillsAsPlan.Click += new System.EventHandler(this.miExportCharacterSkillsAsPlan_Click);\n            // \n            // ExportCharAsPlanToolStripSeparator\n            // \n            this.ExportCharAsPlanToolStripSeparator.Name = \"ExportCharAsPlanToolStripSeparator\";\n            this.ExportCharAsPlanToolStripSeparator.Size = new System.Drawing.Size(236, 6);\n            // \n            // miRestorePlans\n            // \n            this.miRestorePlans.Image = ((System.Drawing.Image)(resources.GetObject(\"miRestorePlans.Image\")));\n            this.miRestorePlans.Name = \"miRestorePlans\";\n            this.miRestorePlans.Size = new System.Drawing.Size(239, 22);\n            this.miRestorePlans.Text = \"&Restore Plans...\";\n            this.miRestorePlans.Click += new System.EventHandler(this.miRestorePlans_Click);\n            // \n            // miSavePlans\n            // \n            this.miSavePlans.Image = ((System.Drawing.Image)(resources.GetObject(\"miSavePlans.Image\")));\n            this.miSavePlans.Name = \"miSavePlans\";\n            this.miSavePlans.Size = new System.Drawing.Size(239, 22);\n            this.miSavePlans.Text = \"&Save Plans...\";\n            this.miSavePlans.Click += new System.EventHandler(this.miSavePlans_Click);\n            // \n            // mEdit\n            // \n            this.mEdit.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.miRenameEdit,\n            this.miDelete});\n            this.mEdit.Name = \"mEdit\";\n            this.mEdit.Size = new System.Drawing.Size(39, 20);\n            this.mEdit.Text = \"&Edit\";\n            this.mEdit.DropDownOpening += new System.EventHandler(this.mEdit_DropDownOpening);\n            // \n            // miRenameEdit\n            // \n            this.miRenameEdit.Image = ((System.Drawing.Image)(resources.GetObject(\"miRenameEdit.Image\")));\n            this.miRenameEdit.Name = \"miRenameEdit\";\n            this.miRenameEdit.ShortcutKeys = System.Windows.Forms.Keys.F2;\n            this.miRenameEdit.Size = new System.Drawing.Size(145, 22);\n            this.miRenameEdit.Text = \"&Rename...\";\n            this.miRenameEdit.Click += new System.EventHandler(this.miRenameEdit_Click);\n            // \n            // miDelete\n            // \n            this.miDelete.Image = ((System.Drawing.Image)(resources.GetObject(\"miDelete.Image\")));\n            this.miDelete.Name = \"miDelete\";\n            this.miDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete;\n            this.miDelete.Size = new System.Drawing.Size(145, 22);\n            this.miDelete.Text = \"&Delete\";\n            this.miDelete.Click += new System.EventHandler(this.miDelete_Click);\n            // \n            // PlanManagementWindow\n            // \n            this.AcceptButton = this.btnOpen;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(659, 425);\n            this.Controls.Add(this.tableLayoutPanel);\n            this.Controls.Add(this.menuStrip);\n            this.MainMenuStrip = this.menuStrip;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"PlanManagementWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Manage Plans\";\n            this.panel1.ResumeLayout(false);\n            this.panel1.PerformLayout();\n            this.contextMenu.ResumeLayout(false);\n            this.toolStrip.ResumeLayout(false);\n            this.toolStrip.PerformLayout();\n            this.tableLayoutPanel.ResumeLayout(false);\n            this.tableLayoutPanel.PerformLayout();\n            this.ButtonsFlowLayoutPanel.ResumeLayout(false);\n            this.menuStrip.ResumeLayout(false);\n            this.menuStrip.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Button btnClose;\n        private System.Windows.Forms.OpenFileDialog ofdOpenDialog;\n        private System.Windows.Forms.Panel panel1;\n        private System.Windows.Forms.ToolStrip toolStrip;\n        private System.Windows.Forms.ToolStripButton tsbMoveUp;\n        private System.Windows.Forms.ToolStripButton tsbMoveDown;\n        private System.Windows.Forms.ToolStripLabel toolStripLabel1;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;\n        private System.Windows.Forms.FlowLayoutPanel ButtonsFlowLayoutPanel;\n        private System.Windows.Forms.Button btnOpen;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem cmiDelete;\n        private System.Windows.Forms.ToolStripMenuItem cmiRenameEdit;\n        private System.Windows.Forms.ToolStripMenuItem cmiOpen;\n        private DraggableListView lbPlanList;\n        private System.Windows.Forms.ColumnHeader PlanName;\n        private System.Windows.Forms.ColumnHeader PlanDate;\n        private System.Windows.Forms.ColumnHeader PlanSkills;\n        private System.Windows.Forms.MenuStrip menuStrip;\n        private System.Windows.Forms.ToolStripMenuItem mFile;\n        private System.Windows.Forms.ToolStripMenuItem mEdit;\n        private System.Windows.Forms.ToolStripMenuItem miImportPlanFromFile;\n        private System.Windows.Forms.ToolStripMenuItem miImportPlanFromCharacter;\n        private System.Windows.Forms.ToolStripMenuItem miRenameEdit;\n        private System.Windows.Forms.ToolStripMenuItem miDelete;\n        private System.Windows.Forms.ToolStripMenuItem miNewPlan;\n        private System.Windows.Forms.ToolStripMenuItem cmiExport;\n        private System.Windows.Forms.ColumnHeader PlanDescription;\n        private System.Windows.Forms.ToolStripMenuItem miRestorePlans;\n        private System.Windows.Forms.ToolStripSeparator ImportExportPlanToolStripSeparator;\n        private System.Windows.Forms.ToolStripMenuItem miSavePlans;\n        private System.Windows.Forms.ToolStripMenuItem miExportPlan;\n        private System.Windows.Forms.ToolStripSeparator NewPlanToolStripSeparator;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator;\n        private System.Windows.Forms.ToolStripMenuItem miExportCharacterSkillsAsPlan;\n        private System.Windows.Forms.ToolStripSeparator ExportCharAsPlanToolStripSeparator;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanManagementWindow.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.Serialization.Settings;\nusing SortOrder = EVEMon.Common.Enumerations.SortOrder;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// This window allows the user to manage all the plans : renaming, reordering, etc.\n    /// </summary>\n    public partial class PlanManagementWindow : EVEMonForm\n    {\n        private readonly PlanComparer m_columnSorter;\n        private readonly Character m_character;\n\n        /// <summary>\n        /// Constructor for designer.\n        /// </summary>\n        private PlanManagementWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Regular constructor for use in code.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        public PlanManagementWindow(Character character)\n            : this()\n        {\n            m_character = character;\n            m_columnSorter = new PlanComparer(PlanSort.Name);\n        }\n\n        /// <summary>\n        /// On loading, populate the plan\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            MinimumSize = Size;\n\n            EveMonClient.CharacterPlanCollectionChanged += EveMonClient_CharacterPlanCollectionChanged;\n            if (m_character != null)\n                Text = \"Manage Plans: \" + m_character.Name;\n\n            UpdateContent(true);\n            lbPlanList.ListViewItemSorter = null;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on closing.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            EveMonClient.CharacterPlanCollectionChanged -= EveMonClient_CharacterPlanCollectionChanged;\n        }\n\n        /// <summary>\n        /// The button \"open\" is the same than \"merge\". When the button is in \"open\" state, we close the window and returns OK as a result.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnOpen_Click(object sender, EventArgs e)\n        {\n            // Are we performing a merge ?\n            if (lbPlanList.SelectedItems.Count > 1)\n            {\n                MergePlans();\n                return;\n            }\n\n            // Or are we just opening a plan ?\n            Plan plan = (Plan)lbPlanList.SelectedItems[0].Tag;\n            PlanWindow.ShowPlanWindow(plan: plan);\n            Close();\n        }\n\n        /// <summary>\n        /// On close, nothing special.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnClose_Click(object sender, EventArgs e)\n        {\n            Close();\n        }\n\n\n        #region List management and creation\n\n        /// <summary>\n        /// Occurs when new plans are added or removed to the collection\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterPlanCollectionChanged(object sender, CharacterChangedEventArgs e)\n        {\n            UpdateContent(true);\n        }\n\n        /// <summary>\n        /// Rebuild the plans list.\n        /// </summary>\n        /// <param name=\"restoreSelectionAndFocus\"></param>\n        private void UpdateContent(bool restoreSelectionAndFocus)\n        {\n            // Store selection and focus\n            Plan selection = lbPlanList.Items.Cast<ListViewItem>().Where(x => x.Selected)\n                .Select(x => x.Tag).OfType<Plan>().FirstOrDefault();\n            Plan focused = lbPlanList.FocusedItem?.Tag as Plan;\n\n            lbPlanList.BeginUpdate();\n            try\n            {\n                // Recreate the list from scratch\n                lbPlanList.Items.Clear();\n                foreach (Plan plan in m_character.Plans)\n                {\n                    // Create the item and add it\n                    ListViewItem lvi = new ListViewItem(plan.Name) { Tag = plan };\n                    lvi.SubItems.Add(plan.TotalTrainingTime\n                        .ToDescriptiveText(DescriptiveTextOptions.FullText |\n                                           DescriptiveTextOptions.IncludeCommas |\n                                           DescriptiveTextOptions.SpaceText));\n                    lvi.SubItems.Add(plan.UniqueSkillsCount.ToString(CultureConstants.DefaultCulture));\n                    lvi.SubItems.Add(string.IsNullOrWhiteSpace(plan.Description)\n                                         ? \"(None)\"\n                                         : plan.Description.Replace(Environment.NewLine, \" \"));\n                    lbPlanList.Items.Add(lvi);\n\n                    // Restore selection and focus\n                    if (!restoreSelectionAndFocus)\n                        continue;\n\n                    lvi.Selected = selection == plan;\n                    lvi.Focused = focused == plan;\n                }\n\n                // Adjust the size of the columns\n                AdjustColumns();\n\n                // Enable/disable the button\n                btnOpen.Enabled = lbPlanList.SelectedItems.Count > 0;\n            }\n            finally\n            {\n                lbPlanList.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lbPlanList.Columns)\n            {\n                column.Width = -2;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column\n                if (column.Index != lbPlanList.Columns.Count - 1)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lbPlanList.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lbPlanList.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        /// <summary>\n        /// Merge the selected plans.\n        /// </summary>\n        private void MergePlans()\n        {\n            // Build the merge plan\n            Plan result = new Plan(m_character);\n            using (result.SuspendingEvents())\n            {\n                // Merge the plans\n                foreach (ListViewItem item in lbPlanList.SelectedItems)\n                {\n                    Plan plan = (Plan)item.Tag;\n                    foreach (PlanEntry entry in plan)\n                    {\n                        // If not planned yet, we add the new entry\n                        if (!result.IsPlanned(entry.Skill, entry.Level))\n                            result.PlanTo(entry.Skill, entry.Level, entry.Priority, entry.Notes);\n\n                        // Then we update the entry's groups\n                        PlanEntry newEntry = result.GetEntry(entry.Skill, entry.Level);\n\n                        // The entry may be null if the character already knows it\n                        newEntry?.PlanGroups.Add(plan.Name);\n                    }\n                }\n            }\n\n            // Request a new name for this plan\n            using (NewPlanWindow npw = new NewPlanWindow())\n            {\n                DialogResult dr = npw.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n\n                // Change the plan's name and add it\n                result.Name = npw.PlanName;\n                result.Description = npw.PlanDescription;\n                m_character.Plans.Add(result);\n            }\n        }\n\n        #endregion\n\n\n        #region List's events\n\n        /// <summary>\n        /// When the user select another item, we update the control's status.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbPlanList_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            // One one plan selected means we can move it\n            tsbMoveUp.Enabled = lbPlanList.SelectedItems.Count == 1;\n            tsbMoveDown.Enabled = lbPlanList.SelectedItems.Count == 1;\n\n            // No items -> Disabled \"open\"\n            // One item -> Enabled \"open\"\n            // More items -> Enabled \"merge\"\n            btnOpen.Enabled = lbPlanList.SelectedItems.Count > 0;\n            btnOpen.Text = lbPlanList.SelectedItems.Count > 1 ? \"Merge\" : \"Open\";\n        }\n\n        /// <summary>\n        /// When the user double-click an item, we open this plan.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbPlanList_DoubleClick(object sender, EventArgs e)\n        {\n            if (lbPlanList.SelectedItems.Count == 1)\n                btnOpen_Click(this, new EventArgs());\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbPlanList_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lbPlanList.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbPlanList_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lbPlanList.Cursor = lbPlanList.GetItemAt(e.X, e.Y) != null\n                ? CustomCursors.ContextMenu\n                : Cursors.Default;\n        }\n\n        /// <summary>\n        /// On a column click, we update the sort.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbPlanList_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            // Click on the same column than the one already sorted ?\n            if (e.Column == (int)m_columnSorter.Sort)\n            {\n                // Swap sort order\n                m_columnSorter.Order = m_columnSorter.Order == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending;\n            }\n                // Or a new column\n            else\n            {\n                m_columnSorter.Sort = (PlanSort)e.Column;\n                m_columnSorter.Order = SortOrder.Ascending;\n            }\n\n            // Update sort\n            lbPlanList.ListViewItemSorter = new ListViewItemComparerByTag<Plan>(m_columnSorter);\n            lbPlanList.Sort();\n\n            // Rebuild the plans list from the listview items\n            m_character.Plans.RebuildFrom(lbPlanList.Items.Cast<ListViewItem>().Select(x => x.Tag).OfType<Plan>());\n        }\n\n        /// <summary>\n        /// On reordering through drag'n drop, we fetch the new data to the character's plans collection.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbPlanList_ListViewItemsDragged(object sender, EventArgs e)\n        {\n            // Rebuild the plans list from the listview items\n            m_character.Plans.RebuildFrom(lbPlanList.Items.Cast<ListViewItem>().Select(x => x.Tag).OfType<Plan>());\n        }\n\n        #endregion\n\n\n        #region Menus and buttons handlers\n\n        /// <summary>\n        /// File > New plan...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miNewPlan_Click(object sender, EventArgs e)\n        {\n            // Request a new name for this plan\n            using (NewPlanWindow npw = new NewPlanWindow())\n            {\n                DialogResult dr = npw.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n\n                // Create the plan and add it\n                Plan plan = new Plan(m_character) { Name = npw.PlanName, Description = npw.PlanDescription };\n                m_character.Plans.Add(plan);\n\n                // Open a window for this plan\n                PlanWindow.ShowPlanWindow(plan: plan);\n            }\n\n            Close();\n        }\n\n        /// <summary>\n        /// File > Import Plan from File...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miImportPlanFromFile_Click(object sender, EventArgs e)\n        {\n            // Prompt the user to select a file\n            DialogResult dr = ofdOpenDialog.ShowDialog();\n            if (dr == DialogResult.Cancel)\n                return;\n\n            // Load from file and returns if an error occurred (user has already been warned)\n            SerializablePlan serial = PlanIOHelper.ImportFromXML(ofdOpenDialog.FileName);\n            if (serial == null)\n                return;\n\n            // Imports the plan\n            Plan loadedPlan = new Plan(m_character, serial);\n\n            // Prompt the user for the plan name\n            using (NewPlanWindow npw = new NewPlanWindow())\n            {\n                npw.PlanName = Path.GetFileNameWithoutExtension(ofdOpenDialog.FileName);\n                DialogResult xdr = npw.ShowDialog();\n                if (xdr == DialogResult.Cancel)\n                    return;\n\n                loadedPlan.Name = npw.PlanName;\n                loadedPlan.Description = npw.PlanDescription;\n                m_character.Plans.Add(loadedPlan);\n            }\n        }\n\n        /// <summary>\n        /// File > Import Plan from Character....\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miImportPlanFromCharacter_Click(object sender, EventArgs e)\n        {\n            // Prompt the user to choose the source character and plan.\n            using (PlanImportationFromCharacterWindow cps = new PlanImportationFromCharacterWindow(m_character))\n            {\n                DialogResult dr = cps.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n\n                // Retrieves the cloned plan\n                Plan plan = cps.TargetPlan;\n\n                // Adds and fixes the prerequisites order\n                plan.FixPrerequisites();\n\n                // Prompt the user for the new plan's name\n                using (NewPlanWindow f = new NewPlanWindow())\n                {\n                    f.PlanName = $\"{m_character.Name}-{plan.Name}\";\n                    f.Text = @\"Save Plan As\";\n\n                    dr = f.ShowDialog();\n                    if (dr == DialogResult.Cancel)\n                        return;\n\n                    plan.Name = f.PlanName;\n                    plan.Description = f.PlanDescription;\n                }\n\n                // Add the plan to the character's list\n                m_character.Plans.Add(plan);\n            }\n        }\n\n        /// <summary>\n        /// File > Export Plan...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void miExportPlan_Click(object sender, EventArgs e)\n        {\n            if (lbPlanList.SelectedItems.Count != 1)\n                return;\n\n            Plan plan = (Plan)lbPlanList.SelectedItems[0].Tag;\n            await UIHelper.ExportPlanAsync(plan);\n        }\n\n        /// <summary>\n        /// File > Export Character Skills as Plan...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void miExportCharacterSkillsAsPlan_Click(object sender, EventArgs e)\n        {\n            await UIHelper.ExportCharacterSkillsAsPlanAsync(m_character);\n        }\n\n        /// <summary>\n        /// File > Restore Plans...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miRestorePlans_Click(object sender, EventArgs e)\n        {\n            // Prompt the user to select a file\n            using (OpenFileDialog restorePlansDialog = new OpenFileDialog())\n            {\n                restorePlansDialog.Title = @\"Restore from File\";\n                restorePlansDialog.Filter = @\"EVEMon Plans Backup Format (*.epb)|*.epb\";\n                DialogResult dr = restorePlansDialog.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n\n                // Load from file and returns if an error occurred (user has already been warned)\n                IEnumerable<SerializablePlan> serial = PlanIOHelper.ImportPlansFromXML(restorePlansDialog.FileName);\n                if (serial == null)\n                    return;\n\n                // Imports the plans\n                IEnumerable<Plan> loadedPlans = serial.Select(plan => new Plan(m_character, plan));\n                m_character.Plans.AddRange(loadedPlans);\n            }\n        }\n\n        /// <summary>\n        /// File > Save Plans...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void miSavePlans_Click(object sender, EventArgs e)\n        {\n            IList<Plan> plans = lbPlanList.Items.Cast<ListViewItem>().Select(item => item.Tag as Plan).ToList();\n            await UIHelper.SavePlansAsync(plans);\n        }\n\n        /// <summary>\n        /// Edit > Rename...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miRenameEdit_Click(object sender, EventArgs e)\n        {\n            // Quit if none selected\n            if (lbPlanList.SelectedItems.Count == 0)\n                return;\n\n            // Prompts the user for a new name\n            Plan plan = (Plan)lbPlanList.SelectedItems[0].Tag;\n            using (NewPlanWindow f = new NewPlanWindow())\n            {\n                f.Text = @\"Rename Plan or Edit Description\";\n                f.PlanName = plan.Name;\n                f.PlanDescription = plan.Description;\n                DialogResult dr = f.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return;\n\n                // Change the name\n                plan.Name = f.PlanName;\n                plan.Description = f.PlanDescription;\n                UpdateContent(true);\n            }\n        }\n\n        /// <summary>\n        /// File > Delete.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miDelete_Click(object sender, EventArgs e)\n        {\n            // Quit if none selected\n            if (lbPlanList.SelectedItems.Count == 0)\n                return;\n\n            // Prepare the title and retrieve the plan's name for the incoming message box\n            string planName;\n            string title = \"Delete Plan\";\n            if (lbPlanList.SelectedItems.Count > 1)\n            {\n                planName = \"the selected plans\";\n                title += \"s\";\n            }\n            else\n            {\n                Plan plan = (Plan)lbPlanList.SelectedItems[0].Tag;\n                planName = $\"\\\"{plan.Name}\\\"\";\n            }\n\n            // Prompt the user for confirmation with a message box\n            DialogResult dr = MessageBox.Show($\"Are you sure you want to delete {planName}?\", title,\n                                              MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);\n\n            if (dr != DialogResult.Yes)\n                return;\n\n            // Remove the items\n            foreach (ListViewItem lvi in lbPlanList.SelectedItems)\n            {\n                m_character.Plans.Remove(lvi.Tag as Plan);\n            }\n        }\n\n        /// <summary>\n        /// Right toolbar > Move up.\n        /// Move the plan and reinsert it at the proper position.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbMoveUp_Click(object sender, EventArgs e)\n        {\n            int idx = lbPlanList.SelectedIndices[0];\n            if (idx == 0)\n                return;\n\n            // Rebuild a plans array\n            Plan[] plans = lbPlanList.Items.Cast<ListViewItem>().Select(x => x.Tag).OfType<Plan>().ToArray();\n            Plan temp = plans[idx - 1];\n            plans[idx - 1] = plans[idx];\n            plans[idx] = temp;\n\n            lbPlanList.ListViewItemSorter = null;\n            m_character.Plans.RebuildFrom(plans);\n        }\n\n        /// <summary>\n        /// Right toolbar > Move down.\n        /// Move the plan and reinsert it at the proper position.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbMoveDown_Click(object sender, EventArgs e)\n        {\n            int idx = lbPlanList.SelectedIndices[0];\n            if (idx == lbPlanList.Items.Count - 1)\n                return;\n\n            // Rebuild a plans array\n            Plan[] plans = lbPlanList.Items.Cast<ListViewItem>().Select(x => x.Tag).OfType<Plan>().ToArray();\n            Plan temp = plans[idx + 1];\n            plans[idx + 1] = plans[idx];\n            plans[idx] = temp;\n\n            lbPlanList.ListViewItemSorter = null;\n            m_character.Plans.RebuildFrom(plans);\n        }\n\n        #endregion\n\n\n        #region Context Menu\n\n        /// <summary>\n        /// When the context menu opens, we change the items states.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void contextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)\n        {\n            if (lbPlanList.SelectedItems.Count > 1)\n            {\n                cmiDelete.Enabled = true;\n                cmiRenameEdit.Enabled = false;\n                cmiExport.Enabled = false;\n                cmiOpen.Text = @\"Merge\";\n                return;\n            }\n\n            if (lbPlanList.SelectedItems.Count == 1)\n            {\n                cmiDelete.Enabled = true;\n                cmiRenameEdit.Enabled = true;\n                cmiExport.Enabled = true;\n                cmiOpen.Enabled = true;\n                cmiOpen.Text = @\"Open\";\n                return;\n            }\n\n            e.Cancel = true;\n        }\n\n        /// <summary>\n        /// When the \"file\" menu is opening, we enable or disable \"load plans\".\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void mFile_DropDownOpening(object sender, EventArgs e)\n        {\n            // See if we have multiple characters to determine if load from character is enabled\n            miImportPlanFromCharacter.Enabled = EveMonClient.Characters.Count > 1;\n            miExportPlan.Enabled = lbPlanList.SelectedItems.Count == 1;\n            miSavePlans.Enabled = lbPlanList.Items.Count > 0;\n        }\n\n        /// <summary>\n        /// When the \"edit\" menu is opening, we enable or disable the options.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void mEdit_DropDownOpening(object sender, EventArgs e)\n        {\n            miRenameEdit.Enabled = lbPlanList.SelectedItems.Count == 1;\n            miDelete.Enabled = lbPlanList.SelectedItems.Count > 0;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanManagementWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"ofdOpenDialog.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>340, 17</value>\n  </metadata>\n  <metadata name=\"toolStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>241, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"cmiOpen.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        vAAADrwBlbxySQAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAALvSURB\n        VDhPZZJJT1NRGIaJP8JEFwb1FxhFXRgVdGGCCzcComEykpIQQREQRBFCwABSylikUBlu55Hb20sZSicK\n        tAwttFDKJGIkF+PCuFPT19PBxZU3+XJWz/MNOUn/sru3Zw+FQtbVQNDo9fk1Ds+ianJ2XjnucsfK4ppT\n        sHanIPnc+RMJhJ/wzg4XCG3CvuiD2upCD23BOyXNK6GW+dM+qqw5eer0cUlgM8x9+/ET+0ffsXFwCEcw\n        jLnNXdgCYahmF6F0eWPVZWB/d8s0NWeSz/Ils/5VbvvwCCu7B1gI78KztYfp1RBkDs+xeq9mfjVQussJ\n        NB7GvcAtbn8inbdgXPBBQbr9Dw7NzKOZtuJeBxXJEA3fSKDxUNMObsK3Dtrrjwn08yvQzi3HXqPHh0Hr\n        HMrlDPIHtEht/RjJ7BzlCzqMFo5dDiD4+Ss2vhzG7uBa3yKrfILFH4LGs4aGsRkUj5pwu20kktUt4wuE\n        epabWAnCSwBbYBNOAk+RG7QxdrSYbGhhHBBaZpE3oEe6SB7JEav4gjq5gVM4vYhOER1daLLijcpMdp5B\n        pcKMKtU4GmkbKtSTSO+Wo0A6lppA42nRMhztXYV5aQ2dZhueD+tRr51ATRQkozcRuJl1oVpHjijWQECZ\n        +YJGJc0ZyPHY5SD6p9yQuZYgNNshd6+gz7oArTeAJrMTlbpp3P+giwhGTTcTaDzVQzquqE+GQrEMgn4l\n        iiRq5IoVEAzqUEiqhGLwVMGinAgypQY8086kJdB47tR3co/apXjcS6F4UIPSYQPy+pTI6KKQ1aNAjoSI\n        RhiUqqfwUErjhdF+K4HGk/ZWxDVoWOg9ftjWtzG/tY8yyoTMLhke9CqRN6hHkYxFGblBzjCDCtrJF1yv\n        FXH5XSMoHtCginyYGhWLJxINsnsVyJVoSXcTSlSTeDnmQAHFosrs5gsuVDZzF6tacemVECmvRbhS24mU\n        um5crRfjWpMk+nlwl0ySMWBAtpRMYIoKkpL+Ai7ITNdrNpjxAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"cmiExport.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvAAADrwBlbxySQAAAtlJREFUOE9lkttLk2Ec\n        x8U/wMugQNGELroIorSCKM0uQm+iC42ISkWbJBRBymplE9Fw6pxzHnDL1J3d3OZOzsNObnMHD9vcdJs6\n        NSN5jS6iu4p9e/dWymsPfPk9F8/n8/yeH08GACrJ7W1HLBazhiNRXSAYUjn9i8oZt1cx5fJQsbgW5GbH\n        PCP3dH5mxt+V5g4Fia0tIhKLw7EYxLjVhT69Be8Uelq4auOvbrGCdeLkKUpCE0TiCeLLt+/YPfiK9b19\n        OKMJLMSTsEcSULoXoXAFqPRqzT8FUhUrJzcvkyZwh8LE5v4BVpJ78CWS8G9sYy4cg9Tp/y+d48YfLZKJ\n        QprA6PERi5s75M0b0PmCkJO3HQdHbF6066243SNJlfNGr9MEkjknMR1cgz4QogQa7wrUC8tU1fmDeG9d\n        wAuZEZUiNYo7PqQq+GK6oEdnIczLEUQ/fsb6p31qDq61DfIpO7CEYlD5V9EyaUO92ICbXWOpuwIpXcDV\n        mInplSgCJGCPxDFPwrPkDLqMDnAMdnCMTnAtbjwSaVDGk6UeDCjpArZMS8jnA0h3kW6da7DijdJEvtmG\n        RrkJTOUUWvV2NIzPoEwgQ9XwZDFNwFEbCX0gDNPSKvgmO56PatCsngYrDZKtt5FwVb8WZ+t7cYU9DIbE\n        RBe0KvSElhyeeTmKoVkPpK4lcE0OyDwrGLT6oA5EcO5pHzJKm5BdwwVDbCiiCV6OTBB1g1LUDkjBGFKg\n        TjiOErYQ+Y+5FHQYC0HVrPI2G1lLDwW3mvnE/e5hVPdLUP9ehWejWuTVdB5Bx/NHKD8U3HjLI1pUZmj8\n        IdjXNuHd2MUdjgQ51R3/Dh/JyJpVcayDa008orJ3DPUiFZjkh2EpzagRqnCvX46HQjVqxww484RPwXl1\n        PWCaPCXk/mgG5xvbiQvMDlx8xUXBax4uNfFRwBbgcvMArrYJ058HhWwRsmu7UdQqQYMhLWjK+A0VeL6s\n        BZcSIgAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"cmiRenameEdit.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABJxAAAScQHz3HqOAAABBElE\n        QVQ4T7WQPYqEQBCFvZPgD4iBYO4PRibGBh7AxNhYjAwEDQ2MvYIH8ARewJ/8zVarO93DsMy67AcF1Y9+\n        r6pb+i9wFsH3v+a28eLzgGEYkGUZiqLAtm38+oymaaBpGivqT/mgqipEUYQkSWDbNlzXFQL6vmdGpnxB\n        /TiOz5C2bb8PQRBA13UhgMJfA8qyfAYQdV2zDRzH4S8LAXzFcXzcoffSVBL2fUcYhlBVVQjwfZ+ZhLUv\n        uq5jU/M8ZwGmaUJRFCHg+sA0TbGuK+Z5BvnYDTIZhsFMnufBsizIsiwEEPRm+mAqGnjKB8uyYJomUTx4\n        p30Mma+6zW0zP/nPW/yAJD0Arq+1SOUH9iwAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"cmiDelete.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvAAADrwBlbxySQAAAytJREFUOE9l0mtIk1EY\n        B/B3fuiLlBGoWCRln4LM5p3INOlGRRlEBYkVkblaVIalpS5DpLzNOa/pzNvmNqfbmnPNy5xz3jYvm242\n        5z0je5WgC/Whwn/vRg1WB/6cT8/vnOc5hwDgzPzCQq/NZtNMWKxyo8ks0RlGxJ39Q6LX+gFn1PpBoaq3\n        L2lHwC4P4s9y1LkA+9wcabFNo3fEhGaNHmUKNZ6JFG5htyh/FTWK0n38tjoRN8AybSfXPn/F0upHvFle\n        gc5qx+D0PLQWO8T9IxDpjc6UyFQ/SwWSdP8dOz3cgH7zBDm7sorx+WUM2+dhmFlA94QNAp3hvxQ0K39k\n        81vD3QDlwDA5MrtInTwD+bAJQuq0fwvreoaQq9Agrpi/fp5TH+0G8Lt1ZIdpCgqj2QlIh8bRMjjm3OUG\n        E2o0g0hpUuIqrwWH8mvXL3Ab3YFiuZpUjVlgffseb96tOOegn5qhWlmE2myDxDCJ7Fc9YDa24XBhw/rF\n        UoE7wJaqyI5xK4xUgdYyjT6quIuaQUGbFnmOKHVgq/txhSfFSU7TekKFOJr29ykcyWqSkcI+Ixy3cFyd\n        3aZBprgdWXwZ7t24g1v5FchRaPGguRNHWGwkBoUWbCeIbS4gr0VJKowTaB+dBLddi+R6KbIkajDzyrC2\n        aROUwWFI5VSBWcRDeXAkvm/ciGAaLdoF5IgUpIwanmrMiqquAQj0o2C396JS2Y3kE6fxgUK69tIhp4fi\n        o5cXkrx9ejwJwt8FPKprJRmVAiRWCJBUJQKjuhmXK4RIqmnFxZwSpIQfAHx9AT8/pAcGIzY+8bpjBC7g\n        +FMuGV/0EtfK+WDWSHC3ToorlSKc5zYiLrMAtUEh+LJlCz5Rad0diHOXrjGo/0xzAbFPOGS2RAWpwQzt\n        1CyGZpZwn9+GszllqKWH48vmzbgdEglGZBRIqoU+H9+pAIIIcAEHWRzyakkDmDwJ0qgPky5W4Xq1BHEZ\n        eej09kFiRBQSCqvBeCFEfMwxDHh6fgui0aJcAP1hLhmSlo/Qx2yEZXAQweIiLKsUYWmF2BN/E/tTn+NU\n        OdUST4YzuTzsiznK2kAQvr8Be7imxcpSESAAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"tsbMoveUp.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHXSURBVDhPlZLdS1phHMf9V0ZFsYtCRoNuYheNqLHKG4m6\n        s6KbKa2Yg5aMICzobfRizKXL06qtoGJDx4Iy6sZeFQ0MdlFqL2r0Ii45au678zzH0zicA5s/+PAcft/z\n        /TwX5yjI9M9HIWCcjeKtLQL9hzBejJ1DM3SG+t5T1HSfoFwfopS1B0GLwpAiswGYVzMw/bjDO3sa/csp\n        9CwkYZhj8ZpJ4KXlFi3jcYqyZU8qIPTMRND5MQLdBH+z2niKakMIT7K3CpRoXGLBnGMXuczj6uZ/Cw6O\n        WejGg/D9jGY3f0cimP7qykb8+IMs9JNh2NbTUKoZiaS0qkkssC5uZiNxeeAbUG8M4GHdlEgiEZi/rIFN\n        /YbviEWH+RxTTu4rcGWtFWgcTqDylRdFNRbs+8NIpjJSgWlmBVfxNC2Xt3nxqHUfg5ygeSxGKVZ/RsFz\n        C/KrTPQ9iWCU+Y7QRRIn0SRCHOSnsa5laLmhL4DCWoZmQi4r8AcS9xCB4RNfVr3xoOCZWZTLCrYP45Qd\n        DiIg5bouD55qV5FXOYIdP8l/UWQFTk8M6+4bON0xKihWvceDioF7yF5AVuBwXfFskfMadu7Zzp38npw8\n        ZCcrWNq8/G9kBWSZC3xTofgDGmx+aEZLgGMAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"tsbMoveDown.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHwSURBVDhPrZDtS1NRHMf35/TwInxRINWIXpXIegIxCAt1\n        oSWVBiuKIdG0YiEja+Zqlou5UpiWzh7ETRrGikKFQKkY5by1rfKhle7RT9u5976Q3RcJfeHD4Z7v+X0O\n        9+gKsfbGUWntidPcHcN0J0rDzW9Ut32l8oqE4dIcelNEUNo0ixhUUxh0vQTHaA778yw2XwbrQBpLXwqz\n        J8k51zKNzj8YbyUEJcZ3xYICFneMC/dinOqQb65olSgzR9il3KqypTq0VuAZfst6sq2s9j8LHjwJKZUc\n        090oTbfnaLgRxmidpsoyqTRytu6tWSvo8gaVSs4Z+yw9wQwd+Qe9NpCjvHFUaeQUCRyP/CTTq6TyJNM5\n        6to+0OXPcd6d44htBX3tY6XPCYoEdvcL5hMZFhJZsR5tmaLFu0pVe5aKqz/YUTMkOrUvErS7nhL5nhL/\n        frZT4oTtI+aHcPj6L/Y1h9l40EPpMS+763xE4iltwfSXZV69X8RgGuekY4XTziSHLBJ7TFNsPz7CBoOT\n        wWBEnNMUvJlJCAbHY2yu9HLgskT5xRn09QE27b9P78jnfP9boCkITC4xNrFIYGKJPn9USHbWj1FS4aJ7\n        KCz2VTQFw6F5mdeFdQHXM0lIOvs/iW8VXx5NQX/w5z+jKShsrgd5Uqf7C6AcgeBP0yOcAAAAAElFTkSu\n        QmCC\n</value>\n  </data>\n  <metadata name=\"menuStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>522, 17</value>\n  </metadata>\n  <data name=\"miNewPlan.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvAAADrwBlbxySQAAAu5JREFUOE9lkltI02EY\n        xjUQgjTqIg9dhNVtBKFWRFRmUOBFXWlE5IlsgoQUKZZlisxjzrktFU952NHNqTs5D3Obc7qDbtNN5zxn\n        ZH+ji+iuwqdv/1D72/fy8H03z+993pcvBACt1bU1k9/vN8x6ff0Ot0dutjtlwxNT0kGLlZbeMinRmcZZ\n        sWfOHgr59+wCAisrlNe/CJPTjR6DBe9VelRIVQxxFJrfdd3SosiYk/uQXYB3MUB9/f4DG9vfsLC5BbMv\n        gMnFVRi9AcgmnJBaHLT4fbpfApG86FTs6b+QXcCEZ5Za3tqGa3UTtsAq7EtrGJ31Q2S2/6d3PZqfZcLe\n        iwyAxmqjnMvrpPMS+m1uSEi3g8aOsSlUqQy4Vy/cSeF2XmcAhKNmasg9D5XDQwOUUy4oJmfou9/uRpth\n        Ei/EGmS0KpBY82EnldfNBNT36yndjBe+j5+x8GmL3oNlfomMsg69xw+5fQ5lA2PI7VbjVm3Xzn2BiAng\n        KHXUkMsHBzEYvYsYJ+YRsoNajQnVaiOqNWZw9BNIb1UimSveedQoYwJKxH2UZNyBYIpgdI7agDcyLZl5\n        DAUSLQplg2CrjMjvGUayQIzM9oFEBqBaoaFUjllop+fA0xrxrFOJUsUQioJGEr2cmO925uFYdTTO12WC\n        JdQyAWypiuojy9PN+NA8YoXIMg2O1gSx1YUmgw0KhxfHa2Jwm9SRikiwutU3GICXHb1UTpMI2Y0isJql\n        yGnpQVqjBKy2XlzhZ+FoVRQtGlAZibDyw19C2aFP9wB3SnnUw7p2ZDUIkdsmR15nH9KbpEjhCxFecYI2\n        HiwCWN8D3HzLpcrkOijtHhjnlzG1tIHnQjVS+SLE1WUggnTdTRBeGYWwigMJrhVzqQx+F3Jb5SgkH6ZI\n        psPjFjkeNEiQ1qJAdpeaAKJpQAQBFWqtSeS9v4MLBVVUXGEN4l9xkPCai0vFPCSUCHC5tBFXy1uCnwfn\n        SJLg/PH8J8hXW5NC2aEhfwBb+54EkVCpdAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"miImportPlanFromFile.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvAAADrwBlbxySQAAAttJREFUOE9lkttLk3EY\n        x4d/gJdFXYgmdBMIkVpXldlF6E0EaUhUKpqSVAhqM8sUsXDqnHO60mkedvTdQXdyHuY2d3Kbuumm2zxn\n        JK/RRXRXsW/vXkV57QdfHnjg+3me58uPBYDW1va2NRwOm5eDoTGvP0DYPD7FlMMtn7A7aZnsLpnROleW\n        fCE1gXX04r5jQHRzkwyGI7D6/Bg129GtNeGDXMsQV6n/2zEirztz7jwNYQCCkSj5/ecv7B78wNrePmyh\n        KFyRLViCUSgcPsjtXlpdGuMfgYSoS0pOSWAAHIFlcmP/AEtbe5iPbsGzvo2Z5TAkNs9/ahvV/24SqzIZ\n        AL1znvRt7FCT1zE274eMmnbaODjrRovWjLud4lgeb+gGAyCesZGT/lVovQEaoHYvQelapOuYx49+swtV\n        Uj0KRUpktX6O5fNHmIDOMRNpXAwi9OUb1r7u0znYV9epU3ZgCoRBeFbQND6LihEdbrcPxx4IJEwAV20k\n        J5dC8FIGSzCCOco8TWXQrreCo7OAo7eBa3LgiUiNXJ409kioYAIapBpSNudFfIv46lydGW8VBurmWdTI\n        DGArJtCstaB6dAq5AimKBsazGACOUk9qvcswLKyAb7CgckiNRuUk6ijj4y4Cac8FKOrRoFZFhSgkUCY2\n        MAHNci2pocIzLobQO+2ExL4ArsEKqXMJ6ZVCsHLqkfaiGzWqGdz/pIqVjehuMgC1gyqy/KMEpUIJynrl\n        KO8bRXZDH1Kfcmkzy0Qe1iMl5r2fpWrOMeBOI5982DGA4h4xKvoJvBzSIKWk7cR8Wocg2THg1jse2UQY\n        ofYEYFndgHt9F/c4YiQVt55AjqbHlZh/aoPr9TyysGsYFSICbOrD1CmMKOkjUNAjQ3Lp4RkXn/HxatyG\n        IrERbIMzm+qdZHC5poW8wm5F+msuMt7wcLWej4wGAa41CnGpqgtnCznIbBAhT6RBwYAe1bo4oJ71D7qM\n        vjXrw+JbAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"miImportPlanFromCharacter.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        vAAADrwBlbxySQAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAAM/SURB\n        VDhPZZJrSJNRGMdXfehD9K3sZlGLirQLmlpZKGml1YJS7GKWlSSJFqJheZut7GIlcy7T8pq6ubnpZnO+\n        WSo6p07nvc12MS8ZyatFRBR089/xfY2QfvBwzpff/3nOw+H8ZWh4uMlisTT0m8xVxt4+pa6js/xli0H+\n        XN/KVK2+TUY1NV9czV07d0aZje3NG9pksaKpsxeKBj0eaWpxV66ZVcIK7a+MUnmSw7Ll/4eYrDZ68vMX\n        jE58xOuxcejMNrRZh9BosqG8pRNyvZGph2rqZ5ZUmbRq9ZrZIS19/fTg+AR6hsbQbhtCh30Y9f0WlDYa\n        IKHq8PX7D+SWlCBXW4d0hfZHqqTSY0Zl0ba2052DI6SzHVXtvZCRblJdBxPw/sMkphno1uFAwBEcyZRM\n        HRMVe8+oLJJ6Hf2idwAaYx8ToDL0oKKtmznv3OJDmpOGYD93OO/chT0PiqaOi0unA+awNiGzqpamuk0w\n        v32P1+/G2T2YrFBoayAvl0GcEAnf9cvg7bkVXrGCqd3hMYFEW8DaBKGKol/0mGG0j5DFWdE8YEfRMwr5\n        WenM+MB3pEaeROh+Z4SGnYHTXl4k0ZawNkFQpqZlzUZMTzE9urC6AWE30qAqe8Lov79NIiU8ACG+WxAf\n        HYa1O7z4RFvJ2oT7FVpaY+xHTdcriGsaEVOsQkSaCGpJNhPwbWIYp/xdwHPlQnDpBBydtoiI5sbahNty\n        Da0my6O6zcita4VU34Vr2UUoFKcwAZOjr3D6oAsC3FcgJsgbDtz1eUT7F5DwtJKOeCxFeI4UF3PliMhT\n        IDRHhvC4ONCDBtRrS8DbwYXz4vnw3MzF0nUbC4jmzNoE/xtiOiSjEGHZEkQVKBFdrMbZx3IcupKMhvzb\n        uBcVCP9Ni+C4cB427D0Mpz1+yURzYG2Cz3URnaqkoOroQ+PAIAz2UcRKqnE04RZ5wCdUZcYjKdgDfq4r\n        sPP8ZQTy04KI9u8feKWI6HMPSxCVr0R8mRZJ5RQu5CkRcDMDYyNWlIn44J/3QSDPCzyBELGV9ftmVBaX\n        q/fobfEP4JYohHuyCNtTxHAXZMEjOROHrqeDF5sI/+grOEjuQY8UiKtu9eVwOJw/m3kvmJXgWpMAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n  <data name=\"miExportPlan.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvAAADrwBlbxySQAAAtlJREFUOE9lkttLk2Ec\n        x8U/wMugQNGELroIorSCKM0uQm+iC42ISkWbJBRBymplE9Fw6pxzHnDL1J3d3OZOzsNObnMHD9vcdJs6\n        NSN5jS6iu4p9e/dWymsPfPk9F8/n8/yeH08GACrJ7W1HLBazhiNRXSAYUjn9i8oZt1cx5fJQsbgW5GbH\n        PCP3dH5mxt+V5g4Fia0tIhKLw7EYxLjVhT69Be8Uelq4auOvbrGCdeLkKUpCE0TiCeLLt+/YPfiK9b19\n        OKMJLMSTsEcSULoXoXAFqPRqzT8FUhUrJzcvkyZwh8LE5v4BVpJ78CWS8G9sYy4cg9Tp/y+d48YfLZKJ\n        QprA6PERi5s75M0b0PmCkJO3HQdHbF6066243SNJlfNGr9MEkjknMR1cgz4QogQa7wrUC8tU1fmDeG9d\n        wAuZEZUiNYo7PqQq+GK6oEdnIczLEUQ/fsb6p31qDq61DfIpO7CEYlD5V9EyaUO92ICbXWOpuwIpXcDV\n        mInplSgCJGCPxDFPwrPkDLqMDnAMdnCMTnAtbjwSaVDGk6UeDCjpArZMS8jnA0h3kW6da7DijdJEvtmG\n        RrkJTOUUWvV2NIzPoEwgQ9XwZDFNwFEbCX0gDNPSKvgmO56PatCsngYrDZKtt5FwVb8WZ+t7cYU9DIbE\n        RBe0KvSElhyeeTmKoVkPpK4lcE0OyDwrGLT6oA5EcO5pHzJKm5BdwwVDbCiiCV6OTBB1g1LUDkjBGFKg\n        TjiOErYQ+Y+5FHQYC0HVrPI2G1lLDwW3mvnE/e5hVPdLUP9ehWejWuTVdB5Bx/NHKD8U3HjLI1pUZmj8\n        IdjXNuHd2MUdjgQ51R3/Dh/JyJpVcayDa008orJ3DPUiFZjkh2EpzagRqnCvX46HQjVqxww484RPwXl1\n        PWCaPCXk/mgG5xvbiQvMDlx8xUXBax4uNfFRwBbgcvMArrYJ058HhWwRsmu7UdQqQYMhLWjK+A0VeL6s\n        BZcSIgAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"miExportCharacterSkillsAsPlan.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALEQAACxEBf2RfkQAAA3xJREFUOE9dk3tMU2cY\n        xs/YGJdkLplDp1OuqXNmZgydJoOlCM3GVhlDRpWSctBYwWVZLRYGgmhMacGBXYVK52jKpRcOvVg5tAXa\n        UguH2kE3RTHsliwmarJl/uWyZZvrs9OzqXFv8uRNvuT5vZe8HxGPxMTEpFqSrJn0eu6e6e68OTntm1y8\n        umSfXYiO+eYj1CQT5jTFXB71hubqM7NzEjjjg0hNSV7DMKEfwQYz7YCkqgK2GQbn6Cl0UvRj0jjc9z8z\n        UW1r1q1/DJLaIpN+O+00ooEUoqhgJ27cvI3gtRXM3fgOM9e+wdh8FBSzyKnP5f1LZ7G3pWdm/Qd5IiFt\n        +6YX/W9mrcK2F1JRWSaEf/EKAtGroMNRDAfmYQ59CcvswkP12Nx/Ks3OHXF72gcl/MjK9QV4Rs5C8vbr\n        2PNGOsSicqgGhtFrpzHkZ2C6FOGMQ8EITtMzeP+sOSbSDvOJRIIoP991PD4+lqN+dMhJVBXmQLG/AoqO\n        LmgtdliDYVyIfA1DIIxGqxv7DQ7s6h6M7e018YlnkwiS+qIbf/x2L0ZbdJBVCVDy6no0Sytx/JQSn1tt\n        7ChLcH+1DFtkCcrxID4yTUBwZiS2T2fhE888TZCD51T4/d6d+55RPfa9k4uC7NVoP1iKOpkcyl492gdt\n        6HT50MWaNVPzqDVcgFBrjdXox/hESgIh7lc14NdfVmIXTb2oLsmDYMvzaBcXQiCqhkjRhmNGCo3mcTRT\n        XqjoS2iy+SDUWXHAOL4rvsS1tRVvLXx/xY9BnRpVgq3YmbEKxa9sxCYhiQzxSZQrDVC6AlCxHZz2Mjjm\n        ZJeot6Pe7OEABG/jWkVH3R5Iy/KRz0sDb91q5JcIkSlqBfHuCeyQ90MfuAzH4jLUnjl84gyg8rwzVm+a\n        KOQAuZuzpaHRPghLS7FBIOFMDzX1E5dz6jQo+9SMj0e9aGQBe40uyB3BIg6Qt4VH3vphGVtFDY9M/xf7\n        nnlIg0Mjbhyx+VFtpKG4GCrmAMnJSVknWhsDRZWSv9N3f/io+gMYm9MP9kCgGsJhixdH2R3UDLvRRM9x\n        gPg9p7A/kvea9Ojd95qVkKj7IB+g8PJhLWfOYM3kgIOtPgHZmA/N47M4YPaixRP+twM2nmT1VK5C9XNe\n        Uxe2tXRje6sGL8l68JxEjc0NWhSoB+LHg939FEQGF8RGtoOJcPE/gxI4ZT68SM4AAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"miRestorePlans.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAfdJREFUOE9j+P//P0UY\n        qyAMYwF8QPwQiPXBPBDAphGGkQAnEAsDsRMQ/wNikGQHECMMAAF+Xi4GIy15Tn11WdPSRPeKGB8LX6Cw\n        OSMj41mQUiz4IIoBemoyPjuWdJ27fGzbj1vnD/1fM6XsHRMTE8xGbLgD2QCuGbUxu8/sXf1/17Le/2un\n        lv/3sdf7z83J/j/Q2fD/nMa4/z0lof/FhPj+A136Dag+EKQJbgDQJum5TfH3J1ZE/F/ckQY2ZMu85v/H\n        ty/+/+D6mf+3Lx4Bshf9B3rrf2OW3weg1nh0A6TC3E1uzW6I+//66b3/z+5f+//o1oX/dy8f/3/j7P7/\n        l49v/39g3fT/2xa2/S+Kc30P1BqJboCkma7iDZBTQZqun977/+a5A2D6yokd/y8c2vj/7L41/0FejPY2\n        vwHUagbSBzcAGNISCtIiV0EGgDRdOrr1PzAwwTRMM8g7J3cu++9lq7sHaIAUhgHAALoyqz4WrAmk4ez+\n        tRAMYgPxiR1L/gNj6a+mkmQ50AAWFAOAQAYYurdAgXj+4Ib/p/eshNsKDMwPkyoiTkR5mfeoyIn5A9Xy\n        gjSgGyDIwsJ8tC7D5/+RzXP/LGxLvpYX7bzIXE8pBWiwHlAelBpRALoBIKAjJSaQJS0u6Ahki0OEcAMU\n        A8jFWAWJx/8ZAKtpCVAVWEA+AAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"miSavePlans.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAdVJREFUOE9j+P//P0UY\n        qyApGKsgCCMBfSB+CMR8YB4SAKtD1sDPy8VgpCXPqa8ua1qa6F4hLMCzBqQOiP9pKkm2BLkYVQPZ3CC1\n        IIBhgJ6ajM+OJV3nLh/b9sPOWA0kiIE5OdgeCvJxJwLZGAZwzaiN2X1m7+r/u5b1/g91M0HRiIwZGRn/\n        AWk7FAOYmJik5zbF359YEfF/cUca2JCNs+r+q8qL/5cUFfi/sC35/4aZNf8zwx3+s7OxggzYjm6AVJi7\n        ya3ZDXH/Xz+99//Z/Wv/H9268P/66b3/k4Ns/p/YseT/+YMb/p/es/J/jI/FJ6ABdegGSJrpKt6Y0xj3\n        /+7l42CNN88dANO7V/T/P7h+xv+z+9b8B3kx2tv8BtAAMxQDgP6SUJAWuQoyAKTp0tGt/4GBCaYvHNoI\n        1nx8++L/J3cu++9lq7sHaIAUhgFiQnxXZtXHgjWBNJzdvxaCQWwgBnkDGEt/gVFaDjSABcUAIJABpoNb\n        oECE+RVm65Z5zR8mVUSciPIy71GRE/MHquUFaUA3QJCFhfloXYbP/yOb5/4Bhvq1vGjnReZ6SilAg/WA\n        8pwgRcgA3QAQ0JESE8iSFhd0BLLFIUK4AYoB5GKsgsTj/wwARGYaXejhOfMAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"miRenameEdit.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABJxAAAScQHz3HqOAAABBElE\n        QVQ4T7WQPYqEQBCFvZPgD4iBYO4PRibGBh7AxNhYjAwEDQ2MvYIH8ARewJ/8zVarO93DsMy67AcF1Y9+\n        r6pb+i9wFsH3v+a28eLzgGEYkGUZiqLAtm38+oymaaBpGivqT/mgqipEUYQkSWDbNlzXFQL6vmdGpnxB\n        /TiOz5C2bb8PQRBA13UhgMJfA8qyfAYQdV2zDRzH4S8LAXzFcXzcoffSVBL2fUcYhlBVVQjwfZ+ZhLUv\n        uq5jU/M8ZwGmaUJRFCHg+sA0TbGuK+Z5BvnYDTIZhsFMnufBsizIsiwEEPRm+mAqGnjKB8uyYJomUTx4\n        p30Mma+6zW0zP/nPW/yAJD0Arq+1SOUH9iwAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"miDelete.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvAAADrwBlbxySQAAAytJREFUOE9l0mtIk1EY\n        B/B3fuiLlBGoWCRln4LM5p3INOlGRRlEBYkVkblaVIalpS5DpLzNOa/pzNvmNqfbmnPNy5xz3jYvm242\n        5z0je5WgC/Whwn/vRg1WB/6cT8/vnOc5hwDgzPzCQq/NZtNMWKxyo8ks0RlGxJ39Q6LX+gFn1PpBoaq3\n        L2lHwC4P4s9y1LkA+9wcabFNo3fEhGaNHmUKNZ6JFG5htyh/FTWK0n38tjoRN8AybSfXPn/F0upHvFle\n        gc5qx+D0PLQWO8T9IxDpjc6UyFQ/SwWSdP8dOz3cgH7zBDm7sorx+WUM2+dhmFlA94QNAp3hvxQ0K39k\n        81vD3QDlwDA5MrtInTwD+bAJQuq0fwvreoaQq9Agrpi/fp5TH+0G8Lt1ZIdpCgqj2QlIh8bRMjjm3OUG\n        E2o0g0hpUuIqrwWH8mvXL3Ab3YFiuZpUjVlgffseb96tOOegn5qhWlmE2myDxDCJ7Fc9YDa24XBhw/rF\n        UoE7wJaqyI5xK4xUgdYyjT6quIuaQUGbFnmOKHVgq/txhSfFSU7TekKFOJr29ykcyWqSkcI+Ixy3cFyd\n        3aZBprgdWXwZ7t24g1v5FchRaPGguRNHWGwkBoUWbCeIbS4gr0VJKowTaB+dBLddi+R6KbIkajDzyrC2\n        aROUwWFI5VSBWcRDeXAkvm/ciGAaLdoF5IgUpIwanmrMiqquAQj0o2C396JS2Y3kE6fxgUK69tIhp4fi\n        o5cXkrx9ejwJwt8FPKprJRmVAiRWCJBUJQKjuhmXK4RIqmnFxZwSpIQfAHx9AT8/pAcGIzY+8bpjBC7g\n        +FMuGV/0EtfK+WDWSHC3ToorlSKc5zYiLrMAtUEh+LJlCz5Rad0diHOXrjGo/0xzAbFPOGS2RAWpwQzt\n        1CyGZpZwn9+GszllqKWH48vmzbgdEglGZBRIqoU+H9+pAIIIcAEHWRzyakkDmDwJ0qgPky5W4Xq1BHEZ\n        eej09kFiRBQSCqvBeCFEfMwxDHh6fgui0aJcAP1hLhmSlo/Qx2yEZXAQweIiLKsUYWmF2BN/E/tTn+NU\n        OdUST4YzuTzsiznK2kAQvr8Be7imxcpSESAAAAAASUVORK5CYII=\n</value>\n  </data>\n  <metadata name=\"$this.TrayHeight\" type=\"System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>44</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanNotesEditorWindow.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    sealed partial class PlanNotesEditorWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.NoteTextBox = new System.Windows.Forms.TextBox();\n            this.btnOk = new System.Windows.Forms.Button();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.SuspendLayout();\n            // \n            // NoteTextBox\n            // \n            this.NoteTextBox.AcceptsReturn = true;\n            this.NoteTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.NoteTextBox.Location = new System.Drawing.Point(12, 12);\n            this.NoteTextBox.Multiline = true;\n            this.NoteTextBox.Name = \"NoteTextBox\";\n            this.NoteTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n            this.NoteTextBox.Size = new System.Drawing.Size(410, 208);\n            this.NoteTextBox.TabIndex = 0;\n            this.NoteTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown);\n            // \n            // btnOk\n            // \n            this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOk.Location = new System.Drawing.Point(266, 226);\n            this.btnOk.Name = \"btnOk\";\n            this.btnOk.Size = new System.Drawing.Size(75, 23);\n            this.btnOk.TabIndex = 1;\n            this.btnOk.Text = \"OK\";\n            this.btnOk.UseVisualStyleBackColor = true;\n            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(347, 226);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 2;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // PlanNotesEditorWindow\n            // \n            this.AcceptButton = this.btnOk;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(434, 261);\n            this.Controls.Add(this.btnCancel);\n            this.Controls.Add(this.btnOk);\n            this.Controls.Add(this.NoteTextBox);\n            this.MaximizeBox = false;\n            this.MinimumSize = new System.Drawing.Size(450, 300);\n            this.Name = \"PlanNotesEditorWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Notes\";\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TextBox NoteTextBox;\n        private System.Windows.Forms.Button btnOk;\n        private System.Windows.Forms.Button btnCancel;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanNotesEditorWindow.cs",
    "content": "using System;\nusing System.Windows.Forms;\nusing EVEMon.Common.Controls;\n\nnamespace EVEMon.SkillPlanner\n{\n    public sealed partial class PlanNotesEditorWindow : EVEMonForm\n    {\n        private PlanNotesEditorWindow()\n        {\n            InitializeComponent();\n        }\n\n        public PlanNotesEditorWindow(string skillName)\n            : this()\n        {\n            Text = @\"Notes for \" + skillName;\n        }\n\n        /// <summary>\n        /// Gets or sets the note text.\n        /// </summary>\n        /// <value>The note text.</value>\n        public string NoteText\n        {\n            get { return NoteTextBox.Text; }\n            set\n            {\n                if (string.IsNullOrEmpty(value))\n                    value = string.Empty;\n\n                NoteTextBox.Lines = value.Split(new[] { \"\\r\\n\", \"\\n\\r\", \"\\r\", \"\\n\" }, StringSplitOptions.None);\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnOk control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnOk_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnCancel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Cancel;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the KeyDown event of the NoteTextBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.KeyEventArgs\"/> instance containing the event data.</param>\n        private void textBox1_KeyDown(object sender, KeyEventArgs e)\n        {\n            if (e.Control && e.KeyCode == Keys.Enter)\n                btnOk_Click(sender, e);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanNotesEditorWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanPrioritiesEditorWindow.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class PlanPrioritiesEditorWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PlanPrioritiesEditorWindow));\n            this.nudPriority = new System.Windows.Forms.NumericUpDown();\n            this.label1 = new System.Windows.Forms.Label();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnOk = new System.Windows.Forms.Button();\n            this.label2 = new System.Windows.Forms.Label();\n            ((System.ComponentModel.ISupportInitialize)(this.nudPriority)).BeginInit();\n            this.SuspendLayout();\n            // \n            // nudPriority\n            // \n            this.nudPriority.Location = new System.Drawing.Point(56, 95);\n            this.nudPriority.Maximum = new decimal(new int[] {\n            99,\n            0,\n            0,\n            0});\n            this.nudPriority.Minimum = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.nudPriority.Name = \"nudPriority\";\n            this.nudPriority.Size = new System.Drawing.Size(41, 21);\n            this.nudPriority.TabIndex = 0;\n            this.nudPriority.Value = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(12, 97);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(41, 13);\n            this.label1.TabIndex = 1;\n            this.label1.Text = \"Priority\";\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(179, 125);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 4;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            // \n            // btnOk\n            // \n            this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOk.Location = new System.Drawing.Point(98, 125);\n            this.btnOk.Name = \"btnOk\";\n            this.btnOk.Size = new System.Drawing.Size(75, 23);\n            this.btnOk.TabIndex = 3;\n            this.btnOk.Text = \"OK\";\n            this.btnOk.UseVisualStyleBackColor = true;\n            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(12, 9);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(248, 78);\n            this.label2.TabIndex = 5;\n            this.label2.Text = resources.GetString(\"label2.Text\");\n            // \n            // PlanPrioritiesEditorForm\n            // \n            this.AcceptButton = this.btnOk;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(266, 160);\n            this.Controls.Add(this.btnCancel);\n            this.Controls.Add(this.btnOk);\n            this.Controls.Add(this.label1);\n            this.Controls.Add(this.nudPriority);\n            this.Controls.Add(this.label2);\n            this.Name = \"PlanPrioritiesEditorForm\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\n            this.Text = \"Change Plan Entry Priorty\";\n            this.Load += new System.EventHandler(this.ChangePriorityForm_Load);\n            ((System.ComponentModel.ISupportInitialize)(this.nudPriority)).EndInit();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.NumericUpDown nudPriority;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnOk;\n        private System.Windows.Forms.Label label2;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanPrioritiesEditorWindow.cs",
    "content": "using System;\nusing System.Windows.Forms;\nusing EVEMon.Common.Controls;\n\nnamespace EVEMon.SkillPlanner\n{\n    public partial class PlanPrioritiesEditorWindow : EVEMonForm\n    {\n        public PlanPrioritiesEditorWindow()\n        {\n            InitializeComponent();\n        }\n\n        public int Priority\n        {\n            get { return (int)nudPriority.Value; }\n            set { nudPriority.Value = value; }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnOk control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnOk_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the Load event of the ChangePriorityForm control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void ChangePriorityForm_Load(object sender, EventArgs e)\n        {\n            nudPriority.Select(0, 3);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanPrioritiesEditorWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"label2.Text\" xml:space=\"preserve\">\n    <value>Note: Priorities of Prerequisites and dependant \nskills may be adjusted.\nPreequisites must have higher or same priority.\nDependant skills must have same or lower priority.\n(1 is higher priority than 5)\n\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanToOperationWindow.Designer.cs",
    "content": "﻿using EVEMon.Common.Controls.MultiPanel;\n\nnamespace EVEMon.SkillPlanner\n{\n    partial class PlanToOperationWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PlanToOperationWindow));\n            this.label1 = new System.Windows.Forms.Label();\n            this.warningPicture = new System.Windows.Forms.PictureBox();\n            this.label5 = new System.Windows.Forms.Label();\n            this.label3 = new System.Windows.Forms.Label();\n            this.previousButton = new System.Windows.Forms.Button();\n            this.cancelButton = new System.Windows.Forms.Button();\n            this.nextButton = new System.Windows.Forms.Button();\n            this.rootMultiPanel = new EVEMon.Common.Controls.MultiPanel.MultiPanel();\n            this.additionPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.priorityGroup = new System.Windows.Forms.GroupBox();\n            this.priorityLabel = new System.Windows.Forms.Label();\n            this.lbExisting = new System.Windows.Forms.Label();\n            this.priorityNumericBox = new System.Windows.Forms.NumericUpDown();\n            this.additionsListBox = new System.Windows.Forms.ListBox();\n            this.dependenciesSuppressionPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.suppressionListBox = new System.Windows.Forms.ListBox();\n            this.label2 = new System.Windows.Forms.Label();\n            this.uselessPrereqsSuppressionPage = new EVEMon.Common.Controls.MultiPanel.MultiPanelPage();\n            this.uselessPrereqsListBox = new System.Windows.Forms.ListBox();\n            this.uselessPrereqsCheckbox = new System.Windows.Forms.CheckBox();\n            ((System.ComponentModel.ISupportInitialize)(this.warningPicture)).BeginInit();\n            this.rootMultiPanel.SuspendLayout();\n            this.additionPage.SuspendLayout();\n            this.priorityGroup.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.priorityNumericBox)).BeginInit();\n            this.dependenciesSuppressionPage.SuspendLayout();\n            this.uselessPrereqsSuppressionPage.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(4, 4);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(175, 13);\n            this.label1.TabIndex = 1;\n            this.label1.Text = \"The following entries will be added.\";\n            // \n            // warningPicture\n            // \n            this.warningPicture.Image = ((System.Drawing.Image)(resources.GetObject(\"warningPicture.Image\")));\n            this.warningPicture.Location = new System.Drawing.Point(3, 3);\n            this.warningPicture.Name = \"warningPicture\";\n            this.warningPicture.Size = new System.Drawing.Size(32, 32);\n            this.warningPicture.TabIndex = 0;\n            this.warningPicture.TabStop = false;\n            // \n            // label5\n            // \n            this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n                        | System.Windows.Forms.AnchorStyles.Left)));\n            this.label5.AutoSize = true;\n            this.label5.Location = new System.Drawing.Point(7, 229);\n            this.label5.Name = \"label5\";\n            this.label5.Size = new System.Drawing.Size(90, 13);\n            this.label5.TabIndex = 14;\n            this.label5.Text = \"Add with priority:\";\n            // \n            // label3\n            // \n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(6, 17);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(287, 26);\n            this.label3.TabIndex = 6;\n            this.label3.Text = \"You have exisiting pre-requisites in your plan, so you must\\r\\n\\r\\n\";\n            // \n            // previousButton\n            // \n            this.previousButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.previousButton.Location = new System.Drawing.Point(78, 368);\n            this.previousButton.Name = \"previousButton\";\n            this.previousButton.Size = new System.Drawing.Size(75, 23);\n            this.previousButton.TabIndex = 2;\n            this.previousButton.Text = \"< &Previous\";\n            this.previousButton.UseVisualStyleBackColor = true;\n            this.previousButton.Click += new System.EventHandler(this.previousButton_Click);\n            // \n            // cancelButton\n            // \n            this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.cancelButton.Location = new System.Drawing.Point(241, 368);\n            this.cancelButton.Name = \"cancelButton\";\n            this.cancelButton.Size = new System.Drawing.Size(75, 23);\n            this.cancelButton.TabIndex = 3;\n            this.cancelButton.Text = \"&Cancel\";\n            this.cancelButton.UseVisualStyleBackColor = true;\n            this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);\n            // \n            // nextButton\n            // \n            this.nextButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.nextButton.Location = new System.Drawing.Point(160, 368);\n            this.nextButton.Name = \"nextButton\";\n            this.nextButton.Size = new System.Drawing.Size(75, 23);\n            this.nextButton.TabIndex = 1;\n            this.nextButton.Text = \"Next >\";\n            this.nextButton.UseVisualStyleBackColor = true;\n            this.nextButton.Click += new System.EventHandler(this.nextButton_Click);\n            // \n            // rootMultiPanel\n            // \n            this.rootMultiPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n                        | System.Windows.Forms.AnchorStyles.Left)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.rootMultiPanel.Controls.Add(this.additionPage);\n            this.rootMultiPanel.Controls.Add(this.dependenciesSuppressionPage);\n            this.rootMultiPanel.Controls.Add(this.uselessPrereqsSuppressionPage);\n            this.rootMultiPanel.Location = new System.Drawing.Point(12, 12);\n            this.rootMultiPanel.Name = \"rootMultiPanel\";\n            this.rootMultiPanel.SelectedPage = this.dependenciesSuppressionPage;\n            this.rootMultiPanel.Size = new System.Drawing.Size(304, 350);\n            this.rootMultiPanel.TabIndex = 0;\n            // \n            // additionPage\n            // \n            this.additionPage.Controls.Add(this.label5);\n            this.additionPage.Controls.Add(this.priorityGroup);\n            this.additionPage.Controls.Add(this.priorityNumericBox);\n            this.additionPage.Controls.Add(this.label1);\n            this.additionPage.Controls.Add(this.additionsListBox);\n            this.additionPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.additionPage.Location = new System.Drawing.Point(0, 0);\n            this.additionPage.Name = \"additionPage\";\n            this.additionPage.Size = new System.Drawing.Size(304, 350);\n            this.additionPage.TabIndex = 0;\n            this.additionPage.Text = \"additionPage\";\n            // \n            // priorityGroup\n            // \n            this.priorityGroup.Controls.Add(this.priorityLabel);\n            this.priorityGroup.Controls.Add(this.lbExisting);\n            this.priorityGroup.Controls.Add(this.label3);\n            this.priorityGroup.Location = new System.Drawing.Point(7, 263);\n            this.priorityGroup.Name = \"priorityGroup\";\n            this.priorityGroup.Size = new System.Drawing.Size(294, 84);\n            this.priorityGroup.TabIndex = 13;\n            this.priorityGroup.TabStop = false;\n            this.priorityGroup.Text = \"Existing Priorities\";\n            // \n            // priorityLabel\n            // \n            this.priorityLabel.AutoSize = true;\n            this.priorityLabel.Location = new System.Drawing.Point(7, 57);\n            this.priorityLabel.Name = \"priorityLabel\";\n            this.priorityLabel.Size = new System.Drawing.Size(178, 13);\n            this.priorityLabel.TabIndex = 10;\n            this.priorityLabel.Text = \"The highest priority you can set is 3\";\n            // \n            // lbExisting\n            // \n            this.lbExisting.AutoSize = true;\n            this.lbExisting.Location = new System.Drawing.Point(6, 30);\n            this.lbExisting.Name = \"lbExisting\";\n            this.lbExisting.Size = new System.Drawing.Size(251, 13);\n            this.lbExisting.TabIndex = 9;\n            this.lbExisting.Text = \"select a lower priority than that of existing entries.\";\n            // \n            // priorityNumericBox\n            // \n            this.priorityNumericBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n                        | System.Windows.Forms.AnchorStyles.Left)));\n            this.priorityNumericBox.Location = new System.Drawing.Point(103, 227);\n            this.priorityNumericBox.Maximum = new decimal(new int[] {\n            99,\n            0,\n            0,\n            0});\n            this.priorityNumericBox.Minimum = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            this.priorityNumericBox.Name = \"priorityNumericBox\";\n            this.priorityNumericBox.Size = new System.Drawing.Size(47, 21);\n            this.priorityNumericBox.TabIndex = 12;\n            this.priorityNumericBox.Value = new decimal(new int[] {\n            1,\n            0,\n            0,\n            0});\n            // \n            // additionsListBox\n            // \n            this.additionsListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n                        | System.Windows.Forms.AnchorStyles.Left)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.additionsListBox.FormattingEnabled = true;\n            this.additionsListBox.Location = new System.Drawing.Point(4, 22);\n            this.additionsListBox.Name = \"additionsListBox\";\n            this.additionsListBox.SelectionMode = System.Windows.Forms.SelectionMode.None;\n            this.additionsListBox.Size = new System.Drawing.Size(297, 199);\n            this.additionsListBox.TabIndex = 0;\n            // \n            // dependenciesSuppressionPage\n            // \n            this.dependenciesSuppressionPage.Controls.Add(this.suppressionListBox);\n            this.dependenciesSuppressionPage.Controls.Add(this.label2);\n            this.dependenciesSuppressionPage.Controls.Add(this.warningPicture);\n            this.dependenciesSuppressionPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.dependenciesSuppressionPage.Location = new System.Drawing.Point(0, 0);\n            this.dependenciesSuppressionPage.Name = \"dependenciesSuppressionPage\";\n            this.dependenciesSuppressionPage.Size = new System.Drawing.Size(304, 350);\n            this.dependenciesSuppressionPage.TabIndex = 0;\n            this.dependenciesSuppressionPage.Text = \"dependenciesSuppressionPage\";\n            // \n            // suppressionListBox\n            // \n            this.suppressionListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n                        | System.Windows.Forms.AnchorStyles.Left)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.suppressionListBox.FormattingEnabled = true;\n            this.suppressionListBox.Location = new System.Drawing.Point(4, 41);\n            this.suppressionListBox.Name = \"suppressionListBox\";\n            this.suppressionListBox.SelectionMode = System.Windows.Forms.SelectionMode.None;\n            this.suppressionListBox.Size = new System.Drawing.Size(297, 290);\n            this.suppressionListBox.TabIndex = 2;\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(41, 13);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(190, 13);\n            this.label2.TabIndex = 1;\n            this.label2.Text = \"The following entries will be removed :\";\n            // \n            // uselessPrereqsSuppressionPage\n            // \n            this.uselessPrereqsSuppressionPage.Controls.Add(this.uselessPrereqsListBox);\n            this.uselessPrereqsSuppressionPage.Controls.Add(this.uselessPrereqsCheckbox);\n            this.uselessPrereqsSuppressionPage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.uselessPrereqsSuppressionPage.Location = new System.Drawing.Point(0, 0);\n            this.uselessPrereqsSuppressionPage.Name = \"uselessPrereqsSuppressionPage\";\n            this.uselessPrereqsSuppressionPage.Size = new System.Drawing.Size(304, 273);\n            this.uselessPrereqsSuppressionPage.TabIndex = 1;\n            this.uselessPrereqsSuppressionPage.Text = \"uselessPrereqsSuppressionPage\";\n            // \n            // uselessPrereqsListBox\n            // \n            this.uselessPrereqsListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n                        | System.Windows.Forms.AnchorStyles.Left)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.uselessPrereqsListBox.FormattingEnabled = true;\n            this.uselessPrereqsListBox.Location = new System.Drawing.Point(4, 28);\n            this.uselessPrereqsListBox.Name = \"uselessPrereqsListBox\";\n            this.uselessPrereqsListBox.SelectionMode = System.Windows.Forms.SelectionMode.None;\n            this.uselessPrereqsListBox.Size = new System.Drawing.Size(297, 225);\n            this.uselessPrereqsListBox.TabIndex = 1;\n            // \n            // uselessPrereqsCheckbox\n            // \n            this.uselessPrereqsCheckbox.AutoSize = true;\n            this.uselessPrereqsCheckbox.Location = new System.Drawing.Point(4, 4);\n            this.uselessPrereqsCheckbox.Name = \"uselessPrereqsCheckbox\";\n            this.uselessPrereqsCheckbox.Size = new System.Drawing.Size(273, 17);\n            this.uselessPrereqsCheckbox.TabIndex = 0;\n            this.uselessPrereqsCheckbox.Text = \"Remove the now useless prerequisites listed below.\";\n            this.uselessPrereqsCheckbox.UseVisualStyleBackColor = true;\n            // \n            // PlanToOperationForm\n            // \n            this.AcceptButton = this.nextButton;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.BackColor = System.Drawing.SystemColors.Window;\n            this.CancelButton = this.cancelButton;\n            this.ClientSize = new System.Drawing.Size(328, 403);\n            this.Controls.Add(this.nextButton);\n            this.Controls.Add(this.rootMultiPanel);\n            this.Controls.Add(this.previousButton);\n            this.Controls.Add(this.cancelButton);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"PlanToOperationForm\";\n            this.Text = \"PlanToOperationForm\";\n            ((System.ComponentModel.ISupportInitialize)(this.warningPicture)).EndInit();\n            this.rootMultiPanel.ResumeLayout(false);\n            this.additionPage.ResumeLayout(false);\n            this.additionPage.PerformLayout();\n            this.priorityGroup.ResumeLayout(false);\n            this.priorityGroup.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.priorityNumericBox)).EndInit();\n            this.dependenciesSuppressionPage.ResumeLayout(false);\n            this.dependenciesSuppressionPage.PerformLayout();\n            this.uselessPrereqsSuppressionPage.ResumeLayout(false);\n            this.uselessPrereqsSuppressionPage.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private MultiPanel rootMultiPanel;\n        private MultiPanelPage additionPage;\n        private MultiPanelPage dependenciesSuppressionPage;\n        private MultiPanelPage uselessPrereqsSuppressionPage;\n        private System.Windows.Forms.Button previousButton;\n        private System.Windows.Forms.Button cancelButton;\n        private System.Windows.Forms.Button nextButton;\n        private System.Windows.Forms.ListBox additionsListBox;\n        private System.Windows.Forms.ListBox suppressionListBox;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.ListBox uselessPrereqsListBox;\n        private System.Windows.Forms.CheckBox uselessPrereqsCheckbox;\n        private System.Windows.Forms.GroupBox priorityGroup;\n        private System.Windows.Forms.Label priorityLabel;\n        private System.Windows.Forms.Label lbExisting;\n        private System.Windows.Forms.NumericUpDown priorityNumericBox;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.PictureBox warningPicture;\n        private System.Windows.Forms.Label label5;\n        private System.Windows.Forms.Label label3;\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanToOperationWindow.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Controls.MultiPanel;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// This window allows the user to deal with addition and suppresion of entries of plans.\n    /// </summary>\n    public partial class PlanToOperationWindow : EVEMonForm\n    {\n        private readonly IPlanOperation m_operation;\n\n        /// <summary>\n        /// Designer constructor\n        /// </summary>\n        private PlanToOperationWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Constructor for use in-code.\n        /// </summary>\n        /// <param name=\"operation\">The operation.</param>\n        /// <exception cref=\"System.ArgumentException\">@This window doesn't support empty operations.;operation</exception>\n        /// <exception cref=\"System.ArgumentNullException\">operation</exception>\n        public PlanToOperationWindow(IPlanOperation operation)\n            : this()\n        {\n            operation.ThrowIfNull(nameof(operation));\n\n            if (operation.Type == PlanOperations.None)\n                throw new ArgumentException(@\"This window doesn't support empty operations.\", nameof(operation));\n\n            m_operation = operation;\n            rootMultiPanel.SelectedPage = additionPage;\n        }\n\n        /// <summary>\n        /// On load, selects the proper page.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Are we performing an addition ?\n            if (m_operation.Type == PlanOperations.Addition)\n            {\n                Text = @\"Add entries to plan\";\n\n                // Updates the other buttons\n                previousButton.Visible = false;\n                nextButton.DialogResult = DialogResult.OK;\n                nextButton.Text = @\"OK\";\n                nextButton.Focus();\n\n                // Loads the listbox\n                FillListBox(m_operation.AllEntriesToAdd, additionsListBox);\n\n                // Priority controls\n                if (m_operation.HighestPriorityForAddition < 1)\n                {\n                    priorityNumericBox.Minimum = 1;\n                    priorityGroup.Visible = false;\n                }\n                else\n                {\n                    priorityNumericBox.Minimum = m_operation.HighestPriorityForAddition;\n                    priorityLabel.Text = $\"The highest priority you can set is {m_operation.HighestPriorityForAddition}\";\n                }\n            }\n                // Suppression \n            else\n            {\n                Text = @\"Remove entries from plan\";\n                previousButton.Visible = m_operation.RemovablePrerequisites.Count() != 0;\n                cancelButton.Focus();\n\n                // Updates the selected page\n                rootMultiPanel.SelectionChange += rootMultiPanel_SelectionChange;\n                rootMultiPanel.SelectedPage = dependenciesSuppressionPage;\n\n                // Loads the entries to remove listbox\n                FillListBox(m_operation.AllEntriesToRemove, suppressionListBox);\n\n                // Loads the useless prerequisites listbox\n                FillListBox(m_operation.RemovablePrerequisites, uselessPrereqsListBox);\n            }\n        }\n\n        /// <summary>\n        /// Fetches the items to the given list box.\n        /// </summary>\n        private void FillListBox<T>(IEnumerable<T> items, ListBox listBox)\n            where T : ISkillLevel\n        {\n            PlanScratchpad plan = new PlanScratchpad(m_operation.Plan.Character);\n            plan.RebuildPlanFrom(items.Select(x => new PlanEntry(x.Skill, x.Level)));\n            plan.FixPrerequisites();\n\n            listBox.Items.Clear();\n            foreach (PlanEntry entry in plan)\n            {\n                string name = entry.ToString();\n\n                if (m_operation.Type == PlanOperations.Addition)\n                {\n                    // Skip if the entry is already in the plan\n                    if (m_operation.Plan.IsPlanned(entry.Skill, entry.Level))\n                        continue;\n                }\n                else\n                {\n                    // On creation of \"entries to remove\" listbox (first pass),\n                    // skip if entry type is of prerequisite.\n                    // \"Useless prerequisites\" listbox is created on second pass\n                    // and in that case entry type is of type planned.\n                    if (entry.Type == PlanEntryType.Prerequisite)\n                        continue;\n\n                    if (entry.Type == PlanEntryType.Planned)\n                        name += \" (planned)\";\n                }\n\n                listBox.Items.Add(name);\n            }\n        }\n\n        /// <summary>\n        /// When the selected page changes, we update the buttons. Only occurs for suppression.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"args\"></param>\n        private void rootMultiPanel_SelectionChange(object sender, MultiPanelSelectionChangeEventArgs args)\n        {\n            // When there are useless prereqs, we offer the user to remove them on a second page.\n            // When there aren't any, we just have one page.\n\n            // Guess whether we're on the final page (2/2 or 1/1)\n            bool isFinal;\n            if (rootMultiPanel.SelectedPage == uselessPrereqsSuppressionPage)\n                isFinal = true;\n            else\n                isFinal = !m_operation.RemovablePrerequisites.Any();\n\n            // Final page ? \n            if (isFinal)\n            {\n                nextButton.Text = @\"OK\";\n                nextButton.DialogResult = DialogResult.OK;\n                previousButton.Enabled = true;\n            }\n            else\n            {\n                nextButton.Text = @\"&Next >\";\n                nextButton.DialogResult = DialogResult.None;\n                previousButton.Enabled = false;\n            }\n        }\n\n        /// <summary>\n        /// Click on the previous button\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void previousButton_Click(object sender, EventArgs e)\n        {\n            rootMultiPanel.SelectedPage = dependenciesSuppressionPage;\n        }\n\n        /// <summary>\n        /// Click on the Next/OK button.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void nextButton_Click(object sender, EventArgs e)\n        {\n            // Are we on the first page ? Then it's \"Next >\".\n            if (nextButton.DialogResult == DialogResult.None)\n            {\n                rootMultiPanel.SelectedPage = uselessPrereqsSuppressionPage;\n                return;\n            }\n\n            // Then we're on the last page and the button is now \"OK\"\n            if (m_operation.Type == PlanOperations.Addition)\n                m_operation.PerformAddition((int)priorityNumericBox.Value);\n            else\n                m_operation.PerformSuppression(uselessPrereqsCheckbox.Checked);\n\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        /// <summary>\n        /// Click on the cancel button.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cancelButton_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Cancel;\n            Close();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanToOperationWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"warningPicture.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAA5gAA\n        AOYBIly6UQAAB5hJREFUWEe9l3tQVPcVx388RUTeKFpjmhrfD9Kad2bMmESxYya2aUendaYzNPUPp52E\n        ZGLbpDEt1kgQIWDiAw01CRiRh7A8FY0UdkmBJAgxIAvugizPfe+9u8s+2P32/C64wTYPoGnuzJm77My9\n        38/3e865d2EA2GxKqGYPWqpZm6aI7ReqmN9s7sGvma34XKHGf9hz7SnYrsRCns2e+74BXnLIlwFD72L8\n        +k6MljBlfDQLnQ3EjBOg6EPJ/Yjnxm8BSyO8mmzYLi9AfSbb+30BvOyQ3wsMnwFMVwFDJcbbdmC0mPXM\n        JoUZJUDu5wnV/lpPF7XcVEfi1YDuAry9KbDVxkGeyf4w0xRmBlDF/uRoWEG9zyXxiyReCoyeozRy4b62\n        DdrzTLX6LhY2E4hpA9CqhQlVAXpP1+8A4yUSl5F4AYm/BwyegEf5ImyXYqHIYC/8fwAq2SsOxUoSOw3o\n        y0F2AbOCAD4ANFnArUNwtWyGroD1PryKzZ8uxLQSECrZfHJv9Nwg9/oKEi8i8XrSoGOsl8TTgN6/YfyL\n        JNiqY9B4hL30XQO85lCsot6fJPFiYOQsXPZRtLe3w+12UwrvAqpXgJ5kOJsehe5Dduv+5Sx8OhDfmgC5\n        jxAqA0zeGzT5NPEYPSut3549e+g5yrBy5UpYdW0kTqaVe6WVtFZG4eN0tu+7Aahgrzvka4CBtycnnvbf\n        bcSmTZskAF719dSO/nSgix5OHb+Cs3Ej9GeZZvN6FvFtEN+YgFDBIsXKQLOX77008SRuvCK1PjEx0Qcg\n        l8sBawfQuRv44lmMtzwOsTwSTYfZn/83gHKW4lSsJffZJP4+bUCO5J4fO3bs8AG0trZODKT6NeDz7UDb\n        E3A0rIE+jw1u+wmL+iaIr01AKGdRYkWgIPV+hFZt6BQ8upoJITp27drlA+ju7p74Umwn8aeA1sfg/ngD\n        xLIINKexv8wOQMYOOhXrqLcZJE67TzPgtI34AJKSknwAg4ODvu+9yt8Dn95PtRFjdcuhf58NPfMAi/k6\n        iK9MQJCxaLEiSPR20t7TKxcD78A5LMPY2JhPKDk52QdgsVh837uNzZI4L7diPayl8/FJGnt9pgCHnHSx\n        p3UbvMoXKIVMmHS9sNls8Hg8klhKSooPYHx83AfgcDjg7ngOLvk6GEuWwFq7BIYzbHTnoyz2qyD+KwFy\n        HyuWB1k917ZSHxPgIhBz26vQarUQRXHiwUNHdna2BBASEvJl/F4v7HY7DOrLNDZxGHovBoaSeIjFYfg0\n        lR2YHkAZS5PctzwiRehoSEB/TxNGRkZgNpvBHXpJKC8vTwKIjeXGJg6XyyVB6nQ6DJZvx9A/ojGYGwmx\n        Jh6GXKb99WNswX9C3JGAUMbiRFmQTXLfuEGKUdv8PFQqFfigGQwGWK1WKQWNRoOAgADs28cfeJBaw2eE\n        Q3LYW+0yEo+C5lQEvaBiIBTNxWep7CBB36F5J0ApS3cqNsDT/IgUvaM+AcrP69HT0yMJ8jbwgeNCHIKD\n        8ci5uNPplNxzyKGhIajVavQVJUKTE45bJ8IgVMbAeJrpkx5nC6em4AMQStlCcm+/7d7ZwN0no6OjA11d\n        Xejr68Pw8LAkwIU4yPHjx5Gfny+1hQ8od88hOSyH7moqRP+J+eg7Ng8j+eEQCuag9Q2WOjWFqQCZTvkG\n        jDc9LEXvaLgPyutyCYAXdzswMCAJmEwm5OTk+LagublZEtfr9ZL73t5eCZpfpy5IRN/boVAfDYG5PBzG\n        HGbY+yRbdDsFCYDcx4uy4DFP6xYpemf9WmibXvSJ8xsplUopBS7AhywrK0sC8PPzAwfg4rz3/f39uHnz\n        pu/aG/8qRO/RuVC9NYe2IhTCh0G4dpAdvp3CBMAFluVSJGC8+SHw6B3/XIOBT9LvAOjs7JRuzAU4BG/H\n        7t27sX//fikVLs4T4u457O3kOtpboM4KgSozGD1HAmEqDeEpmJ7fyhZzbS6+WCwLdkju5RPux66uhu2j\n        ddDX74S2jurqLzF6heryL6Cls5afa+nvS89ipObnGK76Ga3dM9CUbUd/yU+hPr8VqoItUJ19EqpT90ru\n        bx4JQvfhAGhOB8GSH4C2AyyDp8CEEnbUJb8P7qYHyf1aOOrWwP7RKvpnYwWsF5dDrF4GS8U9MMvuJvql\n        MBQvgb5wMXTnFtFvk4UYyYuj36UxGKSdHzgdKU29NHjvzJOiV2eReAa5Tw9E95v+6Er1g7GYkjjBzMlb\n        2RJmKQ5o8bRtJ4CH4Gp8AE7FRlq/H8NelwD71fUEshZi7WoINStgqVoOc+UymGQ/hJHDXCCYIoI5Hw/t\n        uQUEFEvTHk1v7kgMngnHQG4YOZ6L/pwQWsVg2oZAGkh/gvaH5QOGk79hTzNTISu11y7F2JVlsF/+Eey1\n        98B+6W7YLy6FveYu2Kt/AHvVYtiqFsFWGQ9bxQLYZHFUMbCWRdPLJgriBXralUTQIzccYlEYxMJ5EM+H\n        QiwIgXBuDlUwDV8gBIrekk/ieX4wn2Rjrz7NNrOGNBZ0/Rj7Y2s2O96aRfUWVeZkZdD5yJRKp8+HJyuN\n        zm9OViqdD02pN+jzQaq/T9YBOqd8WZ/9lR17eRvbQhMQ/m+Xc4Q7dCv0TAAAAABJRU5ErkJggg==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanWindow.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class PlanWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PlanWindow));\n            this.MainStatusStrip = new System.Windows.Forms.StatusStrip();\n            this.ObsoleteEntriesStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();\n            this.SkillsStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();\n            this.TimeStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();\n            this.CostStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();\n            this.SkillPointsStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();\n            this.upperToolStrip = new System.Windows.Forms.ToolStrip();\n            this.tsddbPlans = new System.Windows.Forms.ToolStripDropDownButton();\n            this.newPlanToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.createPlanFromSkillQueueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();\n            this.tsddbSave = new System.Windows.Forms.ToolStripDropDownButton();\n            this.tsmiExportPlan = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmiAfterPlanCharacter = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsbDeletePlan = new System.Windows.Forms.ToolStripButton();\n            this.tsbPrintPlan = new System.Windows.Forms.ToolStripButton();\n            this.tsbCopyToClipboard = new System.Windows.Forms.ToolStripButton();\n            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\n            this.tsbImplantCalculator = new System.Windows.Forms.ToolStripButton();\n            this.attributesOptimizerStripButton = new System.Windows.Forms.ToolStripButton();\n            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\n            this.tsbLoadoutImport = new System.Windows.Forms.ToolStripButton();\n            this.tsbClipboardImport = new System.Windows.Forms.ToolStripButton();\n            this.ttToolTip = new System.Windows.Forms.ToolTip(this.components);\n            this.sfdSave = new System.Windows.Forms.SaveFileDialog();\n            this.tabControl = new System.Windows.Forms.TabControl();\n            this.tpPlanEditor = new System.Windows.Forms.TabPage();\n            this.planEditor = new EVEMon.SkillPlanner.PlanEditorControl();\n            this.tpSkillBrowser = new System.Windows.Forms.TabPage();\n            this.skillBrowser = new EVEMon.SkillPlanner.SkillBrowserControl();\n            this.tpCertificateBrowser = new System.Windows.Forms.TabPage();\n            this.certBrowser = new EVEMon.SkillPlanner.CertificateBrowserControl();\n            this.tpShipBrowser = new System.Windows.Forms.TabPage();\n            this.shipBrowser = new EVEMon.SkillPlanner.ShipBrowserControl();\n            this.tpItemBrowser = new System.Windows.Forms.TabPage();\n            this.itemBrowser = new EVEMon.SkillPlanner.ItemBrowserControl();\n            this.tpBlueprintBrowser = new System.Windows.Forms.TabPage();\n            this.blueprintBrowser = new EVEMon.SkillPlanner.BlueprintBrowserControl();\n            this.ilTabIcons = new System.Windows.Forms.ImageList(this.components);\n            this.MainStatusStrip.SuspendLayout();\n            this.upperToolStrip.SuspendLayout();\n            this.tabControl.SuspendLayout();\n            this.tpPlanEditor.SuspendLayout();\n            this.tpSkillBrowser.SuspendLayout();\n            this.tpCertificateBrowser.SuspendLayout();\n            this.tpShipBrowser.SuspendLayout();\n            this.tpItemBrowser.SuspendLayout();\n            this.tpBlueprintBrowser.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // MainStatusStrip\n            // \n            this.MainStatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.ObsoleteEntriesStatusLabel,\n            this.SkillsStatusLabel,\n            this.TimeStatusLabel,\n            this.CostStatusLabel,\n            this.SkillPointsStatusLabel});\n            this.MainStatusStrip.Location = new System.Drawing.Point(0, 540);\n            this.MainStatusStrip.Name = \"MainStatusStrip\";\n            this.MainStatusStrip.ShowItemToolTips = true;\n            this.MainStatusStrip.Size = new System.Drawing.Size(943, 22);\n            this.MainStatusStrip.TabIndex = 1;\n            // \n            // ObsoleteEntriesStatusLabel\n            // \n            this.ObsoleteEntriesStatusLabel.Image = ((System.Drawing.Image)(resources.GetObject(\"ObsoleteEntriesStatusLabel.Image\")));\n            this.ObsoleteEntriesStatusLabel.IsLink = true;\n            this.ObsoleteEntriesStatusLabel.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(255)))));\n            this.ObsoleteEntriesStatusLabel.Name = \"ObsoleteEntriesStatusLabel\";\n            this.ObsoleteEntriesStatusLabel.Size = new System.Drawing.Size(117, 17);\n            this.ObsoleteEntriesStatusLabel.Text = \"Obsolete Entries...\";\n            this.ObsoleteEntriesStatusLabel.Visible = false;\n            this.ObsoleteEntriesStatusLabel.Click += new System.EventHandler(this.obsoleteEntriesToolStripStatusLabel_Click);\n            // \n            // SkillsStatusLabel\n            // \n            this.SkillsStatusLabel.AutoToolTip = true;\n            this.SkillsStatusLabel.Image = ((System.Drawing.Image)(resources.GetObject(\"SkillsStatusLabel.Image\")));\n            this.SkillsStatusLabel.Name = \"SkillsStatusLabel\";\n            this.SkillsStatusLabel.Size = new System.Drawing.Size(104, 17);\n            this.SkillsStatusLabel.Text = \"0 Skills Planned\";\n            this.SkillsStatusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // TimeStatusLabel\n            // \n            this.TimeStatusLabel.Image = ((System.Drawing.Image)(resources.GetObject(\"TimeStatusLabel.Image\")));\n            this.TimeStatusLabel.Name = \"TimeStatusLabel\";\n            this.TimeStatusLabel.Size = new System.Drawing.Size(116, 17);\n            this.TimeStatusLabel.Text = \"356d 23h 25m 10s\";\n            this.TimeStatusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // CostStatusLabel\n            // \n            this.CostStatusLabel.Image = ((System.Drawing.Image)(resources.GetObject(\"CostStatusLabel.Image\")));\n            this.CostStatusLabel.Name = \"CostStatusLabel\";\n            this.CostStatusLabel.Size = new System.Drawing.Size(98, 17);\n            this.CostStatusLabel.Text = \"0 ISK Required\";\n            this.CostStatusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // SkillPointsStatusLabel\n            // \n            this.SkillPointsStatusLabel.Image = ((System.Drawing.Image)(resources.GetObject(\"SkillPointsStatusLabel.Image\")));\n            this.SkillPointsStatusLabel.Name = \"SkillPointsStatusLabel\";\n            this.SkillPointsStatusLabel.Size = new System.Drawing.Size(95, 17);\n            this.SkillPointsStatusLabel.Text = \"0 SP Required\";\n            this.SkillPointsStatusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // upperToolStrip\n            // \n            this.upperToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n            this.upperToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tsddbPlans,\n            this.tsddbSave,\n            this.tsbDeletePlan,\n            this.tsbPrintPlan,\n            this.tsbCopyToClipboard,\n            this.toolStripSeparator1,\n            this.tsbImplantCalculator,\n            this.attributesOptimizerStripButton,\n            this.toolStripSeparator2,\n            this.tsbLoadoutImport,\n            this.tsbClipboardImport});\n            this.upperToolStrip.Location = new System.Drawing.Point(0, 0);\n            this.upperToolStrip.Name = \"upperToolStrip\";\n            this.upperToolStrip.Size = new System.Drawing.Size(943, 25);\n            this.upperToolStrip.TabIndex = 3;\n            this.upperToolStrip.Text = \"toolStrip1\";\n            // \n            // tsddbPlans\n            // \n            this.tsddbPlans.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.newPlanToolStripMenuItem,\n            this.createPlanFromSkillQueueToolStripMenuItem,\n            this.toolStripSeparator3});\n            this.tsddbPlans.Image = ((System.Drawing.Image)(resources.GetObject(\"tsddbPlans.Image\")));\n            this.tsddbPlans.ImageTransparentColor = System.Drawing.Color.Black;\n            this.tsddbPlans.Name = \"tsddbPlans\";\n            this.tsddbPlans.Size = new System.Drawing.Size(93, 22);\n            this.tsddbPlans.Text = \"Select Plan\";\n            this.tsddbPlans.DropDownOpening += new System.EventHandler(this.tsddbPlans_DropDownOpening);\n            this.tsddbPlans.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.tsddbPlans_DropDownItemClicked);\n            // \n            // newPlanToolStripMenuItem\n            // \n            this.newPlanToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"newPlanToolStripMenuItem.Image\")));\n            this.newPlanToolStripMenuItem.Name = \"newPlanToolStripMenuItem\";\n            this.newPlanToolStripMenuItem.Size = new System.Drawing.Size(234, 22);\n            this.newPlanToolStripMenuItem.Text = \"New Plan...\";\n            this.newPlanToolStripMenuItem.Click += new System.EventHandler(this.newPlanToolStripMenuItem_Click);\n            // \n            // createPlanFromSkillQueueToolStripMenuItem\n            // \n            this.createPlanFromSkillQueueToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject(\"createPlanFromSkillQueueToolStripMenuItem.Image\")));\n            this.createPlanFromSkillQueueToolStripMenuItem.Name = \"createPlanFromSkillQueueToolStripMenuItem\";\n            this.createPlanFromSkillQueueToolStripMenuItem.Size = new System.Drawing.Size(234, 22);\n            this.createPlanFromSkillQueueToolStripMenuItem.Text = \"Create Plan from Skill Queue...\";\n            this.createPlanFromSkillQueueToolStripMenuItem.Click += new System.EventHandler(this.createPlanFromSkillQueueToolStripMenuItem_Click);\n            // \n            // toolStripSeparator3\n            // \n            this.toolStripSeparator3.Name = \"toolStripSeparator3\";\n            this.toolStripSeparator3.Size = new System.Drawing.Size(231, 6);\n            // \n            // tsddbSave\n            // \n            this.tsddbSave.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tsmiExportPlan,\n            this.tsmiAfterPlanCharacter});\n            this.tsddbSave.Image = ((System.Drawing.Image)(resources.GetObject(\"tsddbSave.Image\")));\n            this.tsddbSave.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsddbSave.Name = \"tsddbSave\";\n            this.tsddbSave.Size = new System.Drawing.Size(69, 22);\n            this.tsddbSave.Text = \"Export\";\n            // \n            // tsmiExportPlan\n            // \n            this.tsmiExportPlan.Image = ((System.Drawing.Image)(resources.GetObject(\"tsmiExportPlan.Image\")));\n            this.tsmiExportPlan.Name = \"tsmiExportPlan\";\n            this.tsmiExportPlan.Size = new System.Drawing.Size(189, 22);\n            this.tsmiExportPlan.Text = \"&Plan...\";\n            this.tsmiExportPlan.Click += new System.EventHandler(this.tsmiExportPlan_Click);\n            // \n            // tsmiAfterPlanCharacter\n            // \n            this.tsmiAfterPlanCharacter.Image = ((System.Drawing.Image)(resources.GetObject(\"tsmiAfterPlanCharacter.Image\")));\n            this.tsmiAfterPlanCharacter.Name = \"tsmiAfterPlanCharacter\";\n            this.tsmiAfterPlanCharacter.Size = new System.Drawing.Size(189, 22);\n            this.tsmiAfterPlanCharacter.Text = \"After Plan &Character...\";\n            this.tsmiAfterPlanCharacter.Click += new System.EventHandler(this.tsmiAfterPlanCharacter_Click);\n            // \n            // tsbDeletePlan\n            // \n            this.tsbDeletePlan.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbDeletePlan.Image\")));\n            this.tsbDeletePlan.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbDeletePlan.Name = \"tsbDeletePlan\";\n            this.tsbDeletePlan.Size = new System.Drawing.Size(69, 22);\n            this.tsbDeletePlan.Text = \"Delete...\";\n            this.tsbDeletePlan.Click += new System.EventHandler(this.tsbDeletePlan_Click);\n            // \n            // tsbPrintPlan\n            // \n            this.tsbPrintPlan.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbPrintPlan.Image\")));\n            this.tsbPrintPlan.ImageTransparentColor = System.Drawing.Color.Black;\n            this.tsbPrintPlan.Name = \"tsbPrintPlan\";\n            this.tsbPrintPlan.Size = new System.Drawing.Size(61, 22);\n            this.tsbPrintPlan.Text = \"Print...\";\n            this.tsbPrintPlan.ToolTipText = \"Print this plan\";\n            this.tsbPrintPlan.Click += new System.EventHandler(this.tsbPrintPlan_Click);\n            // \n            // tsbCopyToClipboard\n            // \n            this.tsbCopyToClipboard.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbCopyToClipboard.Image\")));\n            this.tsbCopyToClipboard.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbCopyToClipboard.Name = \"tsbCopyToClipboard\";\n            this.tsbCopyToClipboard.Size = new System.Drawing.Size(133, 22);\n            this.tsbCopyToClipboard.Text = \"Copy to Clipboard...\";\n            this.tsbCopyToClipboard.Click += new System.EventHandler(this.tsbCopyToClipboard_Click);\n            // \n            // toolStripSeparator1\n            // \n            this.toolStripSeparator1.Name = \"toolStripSeparator1\";\n            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);\n            // \n            // tsbImplantCalculator\n            // \n            this.tsbImplantCalculator.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbImplantCalculator.Image\")));\n            this.tsbImplantCalculator.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbImplantCalculator.Name = \"tsbImplantCalculator\";\n            this.tsbImplantCalculator.Size = new System.Drawing.Size(103, 22);\n            this.tsbImplantCalculator.Text = \"Implant Calc...\";\n            this.tsbImplantCalculator.Click += new System.EventHandler(this.tsbImplantCalculator_Click);\n            // \n            // attributesOptimizerStripButton\n            // \n            this.attributesOptimizerStripButton.Image = ((System.Drawing.Image)(resources.GetObject(\"attributesOptimizerStripButton.Image\")));\n            this.attributesOptimizerStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.attributesOptimizerStripButton.Name = \"attributesOptimizerStripButton\";\n            this.attributesOptimizerStripButton.Size = new System.Drawing.Size(143, 22);\n            this.attributesOptimizerStripButton.Text = \"Attributes Optimizer...\";\n            this.attributesOptimizerStripButton.Click += new System.EventHandler(this.tsbAttributesOptimizer_Click);\n            // \n            // toolStripSeparator2\n            // \n            this.toolStripSeparator2.Name = \"toolStripSeparator2\";\n            this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);\n            // \n            // tsbLoadoutImport\n            // \n            this.tsbLoadoutImport.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbLoadoutImport.Image\")));\n            this.tsbLoadoutImport.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbLoadoutImport.Name = \"tsbLoadoutImport\";\n            this.tsbLoadoutImport.Size = new System.Drawing.Size(119, 22);\n            this.tsbLoadoutImport.Text = \"Loadout Import...\";\n            this.tsbLoadoutImport.Click += new System.EventHandler(this.tsbLoadoutImport_Click);\n            // \n            // tsbClipboardImport\n            // \n            this.tsbClipboardImport.Image = ((System.Drawing.Image)(resources.GetObject(\"tsbClipboardImport.Image\")));\n            this.tsbClipboardImport.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsbClipboardImport.Name = \"tsbClipboardImport\";\n            this.tsbClipboardImport.Size = new System.Drawing.Size(118, 22);\n            this.tsbClipboardImport.Text = \"Clipboard Import\";\n            this.tsbClipboardImport.ToolTipText = \"Clipboard Import...\";\n            this.tsbClipboardImport.Click += new System.EventHandler(this.tsbClipboardImport_Click);\n            // \n            // ttToolTip\n            // \n            this.ttToolTip.AutoPopDelay = 5000;\n            this.ttToolTip.InitialDelay = 500;\n            this.ttToolTip.ReshowDelay = 100;\n            // \n            // sfdSave\n            // \n            this.sfdSave.Filter = \"EVEMon Plan Format (*.emp)|*.emp|XML  Format (*.xml)|*.xml|Text Format (*.txt)|*.\" +\n    \"txt\";\n            this.sfdSave.Title = \"Save to File\";\n            // \n            // tabControl\n            // \n            this.tabControl.Controls.Add(this.tpPlanEditor);\n            this.tabControl.Controls.Add(this.tpSkillBrowser);\n            this.tabControl.Controls.Add(this.tpCertificateBrowser);\n            this.tabControl.Controls.Add(this.tpShipBrowser);\n            this.tabControl.Controls.Add(this.tpItemBrowser);\n            this.tabControl.Controls.Add(this.tpBlueprintBrowser);\n            this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tabControl.ImageList = this.ilTabIcons;\n            this.tabControl.Location = new System.Drawing.Point(0, 25);\n            this.tabControl.Name = \"tabControl\";\n            this.tabControl.SelectedIndex = 0;\n            this.tabControl.Size = new System.Drawing.Size(943, 515);\n            this.tabControl.TabIndex = 4;\n            this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged);\n            // \n            // tpPlanEditor\n            // \n            this.tpPlanEditor.Controls.Add(this.planEditor);\n            this.tpPlanEditor.ImageIndex = 0;\n            this.tpPlanEditor.Location = new System.Drawing.Point(4, 31);\n            this.tpPlanEditor.Margin = new System.Windows.Forms.Padding(0);\n            this.tpPlanEditor.Name = \"tpPlanEditor\";\n            this.tpPlanEditor.Size = new System.Drawing.Size(935, 480);\n            this.tpPlanEditor.TabIndex = 1;\n            this.tpPlanEditor.Text = \"Plan editor\";\n            this.tpPlanEditor.UseVisualStyleBackColor = true;\n            // \n            // planEditor\n            // \n            this.planEditor.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.planEditor.Location = new System.Drawing.Point(0, 0);\n            this.planEditor.Name = \"planEditor\";\n            this.planEditor.Size = new System.Drawing.Size(935, 480);\n            this.planEditor.TabIndex = 2;\n            this.planEditor.TabIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged);\n            // \n            // tpSkillBrowser\n            // \n            this.tpSkillBrowser.Controls.Add(this.skillBrowser);\n            this.tpSkillBrowser.ImageIndex = 1;\n            this.tpSkillBrowser.Location = new System.Drawing.Point(4, 31);\n            this.tpSkillBrowser.Margin = new System.Windows.Forms.Padding(0);\n            this.tpSkillBrowser.Name = \"tpSkillBrowser\";\n            this.tpSkillBrowser.Size = new System.Drawing.Size(935, 480);\n            this.tpSkillBrowser.TabIndex = 0;\n            this.tpSkillBrowser.Text = \"Skill browser\";\n            this.tpSkillBrowser.UseVisualStyleBackColor = true;\n            // \n            // skillBrowser\n            // \n            this.skillBrowser.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.skillBrowser.Location = new System.Drawing.Point(0, 0);\n            this.skillBrowser.Name = \"skillBrowser\";\n            this.skillBrowser.Size = new System.Drawing.Size(935, 480);\n            this.skillBrowser.TabIndex = 0;\n            // \n            // tpCertificateBrowser\n            // \n            this.tpCertificateBrowser.Controls.Add(this.certBrowser);\n            this.tpCertificateBrowser.ImageIndex = 5;\n            this.tpCertificateBrowser.Location = new System.Drawing.Point(4, 31);\n            this.tpCertificateBrowser.Name = \"tpCertificateBrowser\";\n            this.tpCertificateBrowser.Padding = new System.Windows.Forms.Padding(3);\n            this.tpCertificateBrowser.Size = new System.Drawing.Size(935, 480);\n            this.tpCertificateBrowser.TabIndex = 6;\n            this.tpCertificateBrowser.Text = \"Certificate browser\";\n            this.tpCertificateBrowser.UseVisualStyleBackColor = true;\n            // \n            // certBrowser\n            // \n            this.certBrowser.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.certBrowser.Location = new System.Drawing.Point(3, 3);\n            this.certBrowser.Name = \"certBrowser\";\n            this.certBrowser.Size = new System.Drawing.Size(929, 474);\n            this.certBrowser.TabIndex = 0;\n            // \n            // tpShipBrowser\n            // \n            this.tpShipBrowser.Controls.Add(this.shipBrowser);\n            this.tpShipBrowser.ImageIndex = 2;\n            this.tpShipBrowser.Location = new System.Drawing.Point(4, 31);\n            this.tpShipBrowser.Margin = new System.Windows.Forms.Padding(0);\n            this.tpShipBrowser.Name = \"tpShipBrowser\";\n            this.tpShipBrowser.Size = new System.Drawing.Size(935, 480);\n            this.tpShipBrowser.TabIndex = 2;\n            this.tpShipBrowser.Text = \"Ship browser\";\n            this.tpShipBrowser.UseVisualStyleBackColor = true;\n            // \n            // shipBrowser\n            // \n            this.shipBrowser.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.shipBrowser.Location = new System.Drawing.Point(0, 0);\n            this.shipBrowser.Name = \"shipBrowser\";\n            this.shipBrowser.Size = new System.Drawing.Size(935, 480);\n            this.shipBrowser.TabIndex = 0;\n            // \n            // tpItemBrowser\n            // \n            this.tpItemBrowser.Controls.Add(this.itemBrowser);\n            this.tpItemBrowser.ImageIndex = 3;\n            this.tpItemBrowser.Location = new System.Drawing.Point(4, 31);\n            this.tpItemBrowser.Margin = new System.Windows.Forms.Padding(0);\n            this.tpItemBrowser.Name = \"tpItemBrowser\";\n            this.tpItemBrowser.Size = new System.Drawing.Size(935, 480);\n            this.tpItemBrowser.TabIndex = 3;\n            this.tpItemBrowser.Text = \"Item browser\";\n            this.tpItemBrowser.UseVisualStyleBackColor = true;\n            // \n            // itemBrowser\n            // \n            this.itemBrowser.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.itemBrowser.Location = new System.Drawing.Point(0, 0);\n            this.itemBrowser.Name = \"itemBrowser\";\n            this.itemBrowser.Size = new System.Drawing.Size(935, 480);\n            this.itemBrowser.TabIndex = 0;\n            // \n            // tpBlueprintBrowser\n            // \n            this.tpBlueprintBrowser.Controls.Add(this.blueprintBrowser);\n            this.tpBlueprintBrowser.ImageIndex = 4;\n            this.tpBlueprintBrowser.Location = new System.Drawing.Point(4, 31);\n            this.tpBlueprintBrowser.Name = \"tpBlueprintBrowser\";\n            this.tpBlueprintBrowser.Size = new System.Drawing.Size(935, 480);\n            this.tpBlueprintBrowser.TabIndex = 5;\n            this.tpBlueprintBrowser.Text = \"Blueprint browser\";\n            this.tpBlueprintBrowser.UseVisualStyleBackColor = true;\n            // \n            // blueprintBrowser\n            // \n            this.blueprintBrowser.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.blueprintBrowser.Location = new System.Drawing.Point(0, 0);\n            this.blueprintBrowser.Name = \"blueprintBrowser\";\n            this.blueprintBrowser.Size = new System.Drawing.Size(935, 480);\n            this.blueprintBrowser.TabIndex = 0;\n            // \n            // ilTabIcons\n            // \n            this.ilTabIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilTabIcons.ImageStream\")));\n            this.ilTabIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilTabIcons.Images.SetKeyName(0, \"Plan\");\n            this.ilTabIcons.Images.SetKeyName(1, \"Skill\");\n            this.ilTabIcons.Images.SetKeyName(2, \"Ships\");\n            this.ilTabIcons.Images.SetKeyName(3, \"Items\");\n            this.ilTabIcons.Images.SetKeyName(4, \"Blueprint\");\n            this.ilTabIcons.Images.SetKeyName(5, \"Certificate\");\n            // \n            // PlanWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(943, 562);\n            this.Controls.Add(this.tabControl);\n            this.Controls.Add(this.upperToolStrip);\n            this.Controls.Add(this.MainStatusStrip);\n            this.MinimumSize = new System.Drawing.Size(780, 350);\n            this.Name = \"PlanWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"EVEMon Skill Planner\";\n            this.MainStatusStrip.ResumeLayout(false);\n            this.MainStatusStrip.PerformLayout();\n            this.upperToolStrip.ResumeLayout(false);\n            this.upperToolStrip.PerformLayout();\n            this.tabControl.ResumeLayout(false);\n            this.tpPlanEditor.ResumeLayout(false);\n            this.tpSkillBrowser.ResumeLayout(false);\n            this.tpCertificateBrowser.ResumeLayout(false);\n            this.tpShipBrowser.ResumeLayout(false);\n            this.tpItemBrowser.ResumeLayout(false);\n            this.tpBlueprintBrowser.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.StatusStrip MainStatusStrip;\n        private System.Windows.Forms.ToolStripStatusLabel SkillsStatusLabel;\n        private System.Windows.Forms.ToolStrip upperToolStrip;\n        private System.Windows.Forms.ToolStripButton tsbDeletePlan;\n        private System.Windows.Forms.ToolTip ttToolTip;\n        private System.Windows.Forms.ToolStripButton tsbCopyToClipboard;\n        private System.Windows.Forms.SaveFileDialog sfdSave;\n        private System.Windows.Forms.TabControl tabControl;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;\n        private System.Windows.Forms.ToolStripButton tsbImplantCalculator;\n        private System.Windows.Forms.TabPage tpItemBrowser;\n        private ItemBrowserControl itemBrowser;\n        private System.Windows.Forms.TabPage tpPlanEditor;\n        private PlanEditorControl planEditor;\n        private System.Windows.Forms.TabPage tpShipBrowser;\n        private ShipBrowserControl shipBrowser;\n        private System.Windows.Forms.TabPage tpSkillBrowser;\n        private SkillBrowserControl skillBrowser;\n        private System.Windows.Forms.ToolStripDropDownButton tsddbPlans;\n        private System.Windows.Forms.ToolStripButton tsbPrintPlan;\n        private System.Windows.Forms.ToolStripDropDownButton tsddbSave;\n        private System.Windows.Forms.ToolStripMenuItem tsmiAfterPlanCharacter;\n        private System.Windows.Forms.ToolStripMenuItem tsmiExportPlan;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\n        private System.Windows.Forms.ToolStripButton attributesOptimizerStripButton;\n        private System.Windows.Forms.ImageList ilTabIcons;\n        private System.Windows.Forms.ToolStripButton tsbLoadoutImport;\n        private System.Windows.Forms.ToolStripStatusLabel ObsoleteEntriesStatusLabel;\n        private System.Windows.Forms.TabPage tpBlueprintBrowser;\n        private BlueprintBrowserControl blueprintBrowser;\n        private System.Windows.Forms.ToolStripStatusLabel CostStatusLabel;\n        private System.Windows.Forms.ToolStripStatusLabel TimeStatusLabel;\n        private System.Windows.Forms.TabPage tpCertificateBrowser;\n        private CertificateBrowserControl certBrowser;\n        private System.Windows.Forms.ToolStripStatusLabel SkillPointsStatusLabel;\n        private System.Windows.Forms.ToolStripMenuItem newPlanToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem createPlanFromSkillQueueToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;\n        private System.Windows.Forms.ToolStripButton tsbClipboardImport;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanWindow.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nusing R = EVEMon.Properties.Resources;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Represents the plan window.\n    /// </summary>\n    public partial class PlanWindow : EVEMonForm\n    {\n        private static PlanWindow s_lastActivated;\n\n        // Blank image list for 'Safe for work' setting\n        private readonly ImageList m_emptyImageList = new ImageList();\n\n        private Plan m_plan;\n        private Character m_character;\n        private Regex m_skill_regex = new Regex(@\"(.*)\\b(\\d+|\\w+)\", RegexOptions.Compiled);\n\n\n        #region Initialization and Lifecycle\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanWindow\"/> class.\n        /// Default constructor for designer and WindowsFactory.\n        /// </summary>\n        public PlanWindow()\n        {\n            InitializeComponent();\n            RememberPositionKey = \"PlanWindow\";\n\n            // ToolStripLabels don't support AutoEllipsis so we user a custom renderer\n            // via: http://discuss.joelonsoftware.com/default.asp?dotnet.12.597246.5\n            MainStatusStrip.Renderer = new AutoEllipsisToolStripRenderer();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanWindow\"/> class.\n        /// Constructor used in WindowsFactory.\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        public PlanWindow(Plan plan)\n            : this()\n        {\n            Plan = plan;\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanWindow\"/> class.\n        /// Constructor used in WindowsFactory.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        public PlanWindow(Character character)\n            : this()\n        {\n            Character = character;\n        }\n\n        /// <summary>\n        /// On load, we update the controls.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            m_emptyImageList.ImageSize = new Size(24, 24);\n            m_emptyImageList.Images.Add(new Bitmap(24, 24));\n\n            // Global events (unsubscribed on window closing)\n            EveMonClient.PlanNameChanged += EveMonClient_PlanNameChanged;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.ItemPricesUpdated += EveMonClient_ItemPricesUpdated;\n\n            // Compatibility mode : Mac OS\n            if (Settings.Compatibility == CompatibilityMode.Wine)\n            {\n                // Under Wine, the upper tool bar is not displayed\n                // We move it at the top of the first tab\n                Controls.Remove(upperToolStrip);\n                tabControl.TabPages[0].Controls.Add(upperToolStrip);\n                tabControl.TabPages[0].Controls.SetChildIndex(upperToolStrip, 0);\n            }\n\n            //Update the controls\n            UpdateControlsVisibility();\n\n            // Update the plan controls\n            UpdatePlanControls();\n        }\n\n        /// <summary>\n        /// On activation, we import the up-to-date plan column settings.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnActivated(EventArgs e)\n        {\n            base.OnActivated(e);\n\n            if (s_lastActivated == this)\n                return;\n\n            s_lastActivated = this;\n\n            if (m_plan != null)\n                planEditor.ImportColumnSettings(Settings.UI.PlanWindow.Columns);\n        }\n\n        /// <summary>\n        /// On closing, we unsubscribe the global events to help the GC.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            // Unsubscribe global events\n            EveMonClient.PlanNameChanged -= EveMonClient_PlanNameChanged;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.ItemPricesUpdated -= EveMonClient_ItemPricesUpdated;\n\n            // Save settings if this one is the last activated and up-to-date\n            if (s_lastActivated == this)\n            {\n                if (tabControl.TabPages.Contains(tpPlanEditor))\n                {\n                    Settings.UI.PlanWindow.Columns.Clear();\n                    Settings.UI.PlanWindow.Columns.AddRange(planEditor.ExportColumnSettings());\n                }\n                s_lastActivated = null;\n            }\n\n            Settings.Save();\n\n            // We're closing down\n            if (e.CloseReason != CloseReason.ApplicationExitCall && // and Application.Exit() was not called\n                e.CloseReason != CloseReason.TaskManagerClosing &&\n                // and the user isn't trying to shut the program down for some reason\n                e.CloseReason != CloseReason.WindowsShutDown) // and Windows is not shutting down\n            {\n                // Tell the loadout importation window we're closing down\n                WindowsFactory.GetAndCloseByTag<LoadoutImportationWindow, Character>(m_character);\n\n                // Tell the ship loadout window we're closing down\n                WindowsFactory.GetAndCloseByTag<ShipLoadoutSelectWindow, Character>(m_character);\n\n                // Tell the skill explorer we're closing down\n                WindowsFactory.GetAndCloseByTag<SkillExplorerWindow, Character>(m_character);\n\n                // Tell the attributes optimization window we're closing down\n                WindowsFactory.GetAndCloseByTag<AttributesOptimizerOptionsWindow, PlanEditorControl>(planEditor);\n                WindowsFactory.GetAndCloseByTag<AttributesOptimizerWindow, PlanEditorControl>(planEditor);\n\n                // Tell the implant window we're closing down\n                WindowsFactory.GetAndCloseByTag<ImplantCalculatorWindow, PlanEditorControl>(planEditor);\n            }\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the character.\n        /// </summary>\n        /// <value>\n        /// The character.\n        /// </value>\n        private Character Character\n        {\n            get { return m_character; }\n            set\n            {\n                if (value == null || m_character == value)\n                    return;\n\n                m_character = value;\n\n                // Assign the new character to the children\n                skillBrowser.Character = m_character;\n                certBrowser.Character = m_character;\n                shipBrowser.Character = m_character;\n                itemBrowser.Character = m_character;\n                blueprintBrowser.Character = m_character;\n            }\n        }\n\n        /// <summary>\n        /// Gets the plan represented by this window.\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            private set\n            {\n                if (m_plan == value)\n                    return;\n\n                // Should we be transforming a Data Browser to a Skill Planner?\n                bool transformToPlanner = (value != null) && (m_plan == null) && (m_character != null);\n\n                if (value == null)\n                    return;\n\n                // If the ImplantCalculator is open, assign the new plan\n                ImplantCalculatorWindow implantCalcWindow = WindowsFactory.GetByTag<ImplantCalculatorWindow, PlanEditorControl>(planEditor);\n                if (implantCalcWindow != null)\n                    implantCalcWindow.Plan = value;\n\n                // Assign the new plan\n                m_plan = value;\n\n                // Assign the associated character\n                m_character = (Character)m_plan.Character;\n\n                // Update any open window that is associated with this plan window\n                UpdateOpenedWindows(value);\n\n                // Check to see if one or more obsolete entries were found,\n                // we do this now so the related label is immediately visible\n                CheckObsoleteEntries();\n\n                // Jump to the appropriate tab depending on whether\n                // or not the plan is empty\n                tabControl.SelectedTab = m_plan.Count == 0 ? tpSkillBrowser : tpPlanEditor;\n\n                // Update title\n                UpdateTitle();\n\n                // Assign the new plan to the children\n                planEditor.Plan = m_plan;\n                skillBrowser.Plan = m_plan;\n                certBrowser.Plan = m_plan;\n                shipBrowser.Plan = m_plan;\n                itemBrowser.Plan = m_plan;\n                blueprintBrowser.Plan = m_plan;\n\n                // Transform a Data Browser to a Skill Planner\n                if (transformToPlanner)\n                    UpdatePlanControls();\n\n                // Check to see if one or more invalid entries were found,\n                // we do this last so as not to cause problems for background update tasks.\n                CheckInvalidEntries();\n            }\n        }\n\n        #endregion\n\n\n        #region Helper methods\n\n        /// <summary>\n        /// Updates the title.\n        /// </summary>\n        private void UpdateTitle()\n        {\n            Text = $\"{m_character.Name} [{m_plan.Name}] - EVEMon Skill Planner\";\n        }\n\n        /// <summary>\n        /// Updates the opened windows.\n        /// </summary>\n        /// <param name=\"value\">The value.</param>\n        private void UpdateOpenedWindows(Plan value)\n        {\n            // If the EFTLoadoutImportationForm is open, assign the new plan\n            // We do the check here as we need to catch the previous plan value\n            LoadoutImportationWindow eftloadoutImportation = WindowsFactory.GetByTag<LoadoutImportationWindow, Character>(m_character);\n            if (eftloadoutImportation != null)\n                eftloadoutImportation.Plan = value;\n\n            // If the ShipLoadoutSelectWindow is open, assign the new plan\n            ShipLoadoutSelectWindow loadoutSelect = WindowsFactory.GetByTag<ShipLoadoutSelectWindow, Character>(m_character);\n            if (loadoutSelect != null)\n                loadoutSelect.Plan = value;\n\n            // If the SkillExplorerWindow is open, assign the new plan\n            SkillExplorerWindow skillExplorer = WindowsFactory.GetByTag<SkillExplorerWindow, Character>(m_character);\n            if (skillExplorer != null)\n                skillExplorer.Plan = value;\n        }\n\n        /// <summary>\n        /// Updates the controls visibility.\n        /// </summary>\n        private void UpdateControlsVisibility()\n        {\n            tabControl.ImageList = !Settings.UI.SafeForWork\n                ? ilTabIcons\n                : m_emptyImageList;\n\n            foreach (ToolStripItem item in upperToolStrip.Items)\n            {\n                // Enable or disable the tool strip items except the plan selector and the loadout import\n                item.Enabled = (item == tsddbPlans) || (item == tsbLoadoutImport) || (item == tsbClipboardImport) || tabControl.SelectedIndex == 0;\n\n                item.DisplayStyle = !Settings.UI.SafeForWork\n                    ? ToolStripItemDisplayStyle.ImageAndText\n                    : ToolStripItemDisplayStyle.Text;\n            }\n\n            foreach (ToolStripItem label in MainStatusStrip.Items)\n            {\n                label.DisplayStyle = !Settings.UI.SafeForWork\n                    ? ToolStripItemDisplayStyle.ImageAndText\n                    : ToolStripItemDisplayStyle.Text;\n            }\n        }\n\n        /// <summary>\n        /// Updates the plan controls.\n        /// </summary>\n        private void UpdatePlanControls()\n        {\n            // Set the upper toolstrip visibility\n            upperToolStrip.Visible = m_plan != null;\n\n            // Update the status bar\n            UpdateStatusBar();\n\n            if (m_plan != null)\n            {\n                if (!tabControl.TabPages.Contains(tpPlanEditor))\n                    tabControl.TabPages.Insert(0, tpPlanEditor);\n\n                // Show the hint tip\n                TipWindow.ShowTip(this, \"planner\",\n                    \"Welcome to the Skill Planner\",\n                    \"Select skills to add to your plan using the list on the left.\" +\n                    \" To view the list of skills you've added to your plan,\" +\n                    \" choose \\\"Select Plan\\\" from the drop down in the upper left.\");\n\n                return;\n            }\n\n            // If we got this far we want to show the plan window as a Data Browser\n            // Remove the Plan Editor if it exists\n            if (tabControl.TabPages.Contains(tpPlanEditor))\n                tabControl.TabPages.Remove(tpPlanEditor);\n\n            Text = $\"{(m_character == null ? string.Empty : $\"{m_character.Name} - \")}EVEMon Data Browser\";\n        }\n\n        /// <summary>\n        /// Shows the plan window.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"plan\">The plan.</param>\n        /// <returns></returns>\n        internal static PlanWindow ShowPlanWindow(Character character = null, Plan plan = null)\n        {\n            // If no character is associated, open a unique Data Browser (non-associated character)\n            if (character == null && plan == null)\n                return WindowsFactory.ShowUnique<PlanWindow>();\n\n            // Check if a Skill Planner is already open\n            // (a Skill Planner has the same Tag as a Data Browser but it has a plan attached)\n            PlanWindow planWindow = WindowsFactory.GetByTag<PlanWindow, Character>(character ?? (Character)plan.Character);\n\n            // Do we have a Skill Planner open?\n            if (planWindow?.Plan != null)\n            {\n                // Activate\n                planWindow = WindowsFactory.ShowByTag<PlanWindow, Character>(character ?? (Character)plan.Character);\n\n                // If a plan was passed, assign the new plan\n                if (plan != null)\n                    planWindow.Plan = plan;\n\n                return planWindow;\n            }\n\n            // No plan window found, open a new one\n            if (planWindow == null || plan == null)\n            {\n                // Open a new Data Browser associated with the character\n                if (plan == null)\n                    return WindowsFactory.ShowByTag<PlanWindow, Character>(character);\n\n                // Open a new Skill Planner (use the plan as tag for the creating the window)\n                // (This should be the only time a plan is used as the tag)\n                planWindow = WindowsFactory.ShowByTag<PlanWindow, Plan>(plan);\n\n                // Change the tag (we changed it to the character for window lookup)\n                WindowsFactory.ChangeTag<PlanWindow, Plan, Character>(plan, (Character)plan.Character);\n\n                return planWindow;\n            }\n\n            // Activate\n            planWindow = WindowsFactory.ShowByTag<PlanWindow, Character>(character);\n\n            // It's a Data Browser, transform it to a Skill Planner\n            planWindow.Plan = plan;\n\n            return planWindow;\n        }\n\n        /// <summary>\n        /// Shows the plan editor.\n        /// </summary>\n        internal void ShowPlanEditor()\n        {\n            tabControl.SelectedTab = tpPlanEditor;\n        }\n\n        /// <summary>\n        /// Shows the skill in the skill browser and switches to this tab.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <exception cref=\"System.ArgumentNullException\">skill</exception>\n        internal void ShowSkillInBrowser(Skill skill)\n        {\n            // Quit if it's an \"Unknown\" skill\n            if (skill != null && skill.ID != int.MaxValue && skill.ID != 0)\n            {\n                ShowSkillBrowser();\n                skillBrowser.SelectedSkill = skill;\n            }\n        }\n\n        /// <summary>\n        /// Shows the skill browser.\n        /// </summary>\n        internal void ShowSkillBrowser()\n        {\n            tabControl.SelectedTab = tpSkillBrowser;\n        }\n\n        /// <summary>\n        /// Shows the certificate in the certificate browser and switches to this tab.\n        /// </summary>\n        /// <param name=\"certificate\">The certificate.</param>\n        /// <exception cref=\"System.ArgumentNullException\">certificate</exception>\n        internal void ShowCertificateInBrowser(CertificateLevel certificate)\n        {\n            certificate.ThrowIfNull(nameof(certificate));\n\n            ShowCertificateBrowser();\n            certBrowser.SelectedCertificateClass = certificate.Certificate.Class;\n        }\n\n        /// <summary>\n        /// Shows the certificate browser.\n        /// </summary>\n        internal void ShowCertificateBrowser()\n        {\n            tabControl.SelectedTab = tpCertificateBrowser;\n        }\n\n        /// <summary>\n        /// Shows the ship in the ship browser and switches to this tab.\n        /// </summary>\n        /// <param name=\"ship\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">ship</exception>\n        internal void ShowShipInBrowser(Item ship)\n        {\n            ship.ThrowIfNull(nameof(ship));\n\n            // Quit if it's an \"Unknown\" item\n            if (ship.ID == int.MaxValue)\n                return;\n\n            shipBrowser.SetSearchText(ship.Name);\n            ShowShipBrowser();\n            shipBrowser.SelectedObject = ship;\n        }\n\n        /// <summary>\n        /// Shows the ship browser.\n        /// </summary>\n        internal void ShowShipBrowser()\n        {\n            tabControl.SelectedTab = tpShipBrowser;\n        }\n\n        /// <summary>\n        /// Shows the item in the item browser and switches to this tab.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">item</exception>\n        internal void ShowItemInBrowser(Item item)\n        {\n            item.ThrowIfNull(nameof(item));\n\n            // Quit if it's an \"Unknown\" item\n            if (item.ID == int.MaxValue)\n                return;\n\n            itemBrowser.SetSearchText(item.Name);\n            ShowItemBrowser();\n            itemBrowser.SelectedObject = item;\n        }\n\n        /// <summary>\n        /// Shows the item browser.\n        /// </summary>\n        internal void ShowItemBrowser()\n        {\n            tabControl.SelectedTab = tpItemBrowser;\n        }\n\n        /// <summary>\n        /// Shows the blueprint in the blueprint browser and switches to this tab.\n        /// </summary>\n        /// <param name=\"blueprint\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">blueprint</exception>\n        internal void ShowBlueprintInBrowser(Item blueprint)\n        {\n            blueprint.ThrowIfNull(nameof(blueprint));\n\n            // Quit if it's an \"Unknown\" item\n            if (blueprint.ID == int.MaxValue)\n                return;\n\n            blueprintBrowser.SetSearchText(blueprint.Name);\n            ShowBlueprintBrowser();\n            blueprintBrowser.SelectedObject = blueprint;\n        }\n\n        /// <summary>\n        /// Shows the blueprint browser.\n        /// </summary>\n        internal void ShowBlueprintBrowser()\n        {\n            tabControl.SelectedTab = tpBlueprintBrowser;\n        }\n\n        /// <summary>\n        /// Identifies if there are obsolete entries in the skill plan,\n        /// displays message if required.\n        /// </summary>\n        /// <exception cref=\"NotImplementedException\"></exception>\n        public void CheckObsoleteEntries()\n        {\n            switch (Settings.UI.PlanWindow.ObsoleteEntryRemovalBehaviour)\n            {\n                case ObsoleteEntryRemovalBehaviour.AlwaysAsk:\n                    ObsoleteEntriesStatusLabel.Visible = m_plan.ContainsObsoleteEntries;\n                    break;\n                case ObsoleteEntryRemovalBehaviour.RemoveAll:\n                    m_plan.CleanObsoleteEntries(ObsoleteRemovalPolicy.RemoveAll);\n                    break;\n                case ObsoleteEntryRemovalBehaviour.RemoveConfirmed:\n                    m_plan.CleanObsoleteEntries(ObsoleteRemovalPolicy.ConfirmedOnly);\n                    ObsoleteEntriesStatusLabel.Visible = m_plan.ContainsObsoleteEntries;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Identifies if there are invalid entries in the skill plan,\n        /// displays message if required.\n        /// </summary>\n        private void CheckInvalidEntries()\n        {\n            if (!m_plan.ContainsInvalidEntries)\n                return;\n\n            StringBuilder message = new StringBuilder();\n\n            message\n                .AppendLine(\"When loading the plan one or more skills were not found. \" +\n                            \"This can be caused by loading a plan from a previous version of EVEMon or CCP have renamed a skill.\")\n                .AppendLine();\n\n            foreach (InvalidPlanEntry entry in m_plan.InvalidEntries)\n            {\n                message.AppendLine($\" - {entry.SkillName} planned to {entry.PlannedLevel}\");\n            }\n\n            message\n                .AppendLine()\n                .AppendLine(\"Do you wish to keep these entries?\")\n                .AppendLine()\n                .AppendLine(\"- If you select \\\"Yes\\\" the entries will be removed from the plan and will be stored in settings.\")\n                .Append(\"- If you select \\\"No\\\" the entries will be discarded.\");\n\n            DialogResult result = MessageBox.Show(message.ToString(),\n                @\"Invalid Entries Detected\",\n                MessageBoxButtons.YesNo,\n                MessageBoxIcon.Exclamation);\n\n            switch (result)\n            {\n                case DialogResult.No:\n                    m_plan.ClearInvalidEntries();\n                    break;\n                case DialogResult.Yes:\n                    m_plan.AcknoledgeInvalidEntries();\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Sets the plan editor's skill selection control selected skill.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        internal void SetPlanEditorSkillSelectorSelectedSkill(Skill skill)\n        {\n            planEditor.SetPlanEditorSkillSelectorSelectedSkill(skill);\n        }\n\n        /// <summary>\n        /// Updates the plan editor's skill selection control.\n        /// </summary>\n        internal void UpdatePlanEditorSkillSelection()\n        {\n            planEditor.UpdatePlanEditorSkillSelection();\n        }\n\n        /// <summary>\n        /// Sets the skill browser's skill selection control selected skill.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        internal void SetSkillBrowserSkillSelectorSelectedSkill(Skill skill)\n        {\n            skillBrowser.SetSkillBrowserSkillSelectorSelectedSkill(skill);\n        }\n\n        /// <summary>\n        /// Updates the skill browser.\n        /// </summary>\n        internal void UpdateSkillBrowser()\n        {\n            skillBrowser.UpdateSkillBrowser();\n        }\n\n        /// <summary>\n        /// Checks to see if the current contents of the clipboard is a valid list of skills.\n        /// </summary>\n        /// <param name=\"text\">Clipboard contents.</param>\n        private bool CheckClipboardSkillQueue(string text, List<StaticSkillLevel> clipboardSkills)\n        {\n            // Nothing to evaluate\n            if (string.IsNullOrEmpty(text))\n                return false;\n\n            // Multiline regex match the clipboard content\n            var matches = m_skill_regex.Matches(text);\n\n            if (matches.Count == 0)\n                return false;\n\n            for (int i = 0; i < matches.Count; i++)\n            {\n                Match m = matches[i];\n                if (m.Groups.Count != 3)\n                    return false;\n\n                // Try to identify a level from the 2nd capture group\n                int level;\n                if (!int.TryParse(m.Groups[2].Value, out level))\n                    level = Skill.GetIntFromRoman(m.Groups[2].Value);\n\n                if (level < 1 || level > 5)\n                    return false;\n\n                // 1st capture group will be skill name\n                string name = m.Groups[1].Value?.Trim();\n\n                var skill = new StaticSkillLevel(name, level);\n\n                // Did we find an actual skill?\n                if (skill.Skill == StaticSkill.UnknownStaticSkill)\n                    return false;\n\n                clipboardSkills.Add(skill);\n            }\n\n            return true;\n        }\n\n        #endregion\n\n\n        #region Global events\n\n        /// <summary>\n        /// Occurs when global item prices are loaded (this updates the skill injector costs).\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_ItemPricesUpdated(object sender, EventArgs e)\n        {\n            UpdateStatusBar();\n        }\n\n        /// <summary>\n        /// Occurs when a plan name changed.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"PlanChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_PlanNameChanged(object sender, PlanChangedEventArgs e)\n        {\n            if (m_plan != e.Plan)\n                return;\n\n            UpdateTitle();\n        }\n\n        /// <summary>\n        /// Occurs when the settings changed.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateControlsVisibility();\n        }\n\n        #endregion\n\n\n        #region Content creation\n\n        /// <summary>\n        /// Updates the skill status label.\n        /// </summary>\n        /// <param name=\"selected\">if set to <c>true</c> [selected].</param>\n        /// <param name=\"skillCount\">The skill count.</param>\n        /// <param name=\"uniqueCount\">The unique count.</param>\n        internal void UpdateSkillStatusLabel(bool selected, int skillCount, int uniqueCount)\n        {\n            SkillsStatusLabel.Text = $\"{skillCount} skill{skillCount.S()} \" +\n                $\"{(selected ? \"selected\" : \"planned\")} ({uniqueCount} unique)\";\n        }\n\n        /// <summary>\n        /// Updates the time status label.\n        /// </summary>\n        /// <param name=\"selected\">if set to <c>true</c> [selected].</param>\n        /// <param name=\"skillCount\">The skill count.</param>\n        /// <param name=\"totalTime\">The total time.</param>\n        internal void UpdateTimeStatusLabel(bool selected, int skillCount, TimeSpan totalTime)\n        {\n            string time = totalTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n            TimeStatusLabel.AutoToolTip = false;\n            TimeStatusLabel.Text = time + \" to train \" + (selected ?\n                $\"selected skill{skillCount.S()}\" : \"whole plan\");\n        }\n\n        /// <summary>\n        /// Updates the cost status label.\n        /// </summary>\n        /// <param name=\"selected\">if set to <c>true</c> [selected].</param>\n        /// <param name=\"totalcost\">The totalcost.</param>\n        /// <param name=\"cost\">The cost.</param>\n        internal void UpdateCostStatusLabel(bool selected, long totalcost, long cost)\n        {\n            CostStatusLabel.AutoToolTip = totalcost <= 0;\n\n            if (totalcost > 0)\n            {\n                CostStatusLabel.ToolTipText = $\"{totalcost:N2} ISK required to purchase \" +\n                    (selected ? \"selected\" : \"all\") +\n                    $\" skill{(m_plan.UniqueSkillsCount.S())} anew\";\n            }\n\n            CostStatusLabel.Text = cost > 0 ? $\"{cost:N2} ISK required\" : \"0 ISK required\";\n        }\n\n        /// <summary>\n        /// Updates the skill points status label.\n        /// </summary>\n        /// <param name=\"selected\">if set to <c>true</c> [selected].</param>\n        /// <param name=\"skillCount\">The skill count.</param>\n        /// <param name=\"skillPoints\">The skill points.</param>\n        internal void UpdateSkillPointsStatusLabel(bool selected, int skillCount, long skillPoints)\n        {\n            var skillInjectorsCount = m_plan.Character.GetRequiredSkillInjectorsForSkillPoints(\n                skillPoints);\n\n            SkillPointsStatusLabel.AutoToolTip = skillPoints <= 0;\n\n            if (skillPoints > 0)\n            {\n                // If a market pricer is set up and it has prices for injectors, use it\n                var pricer = Settings.MarketPricer?.Pricer;\n                double cost = 0.0;\n                if (pricer != null)\n                {\n                    double cs = pricer.GetPriceByTypeID(DBConstants.SmallSkillInjectorID),\n                        cl = pricer.GetPriceByTypeID(DBConstants.LargeSkillInjectorID);\n                    if (cs > 0.0 && cl > 0.0)\n                        cost = skillInjectorsCount.Large * cl + skillInjectorsCount.Small * cs;\n                }\n\n                string tooltip = $\"{skillPoints:N0} skill points required to train \" +\n                    (selected ? \"selected\" : \"all\") + $\" skill{skillCount.S()}\";\n                if (cost > 0.0)\n                    tooltip += $\"\\n{cost:N2} ISK required to purchase these injectors\";\n                SkillPointsStatusLabel.ToolTipText = tooltip;\n            }\n            else\n                SkillPointsStatusLabel.ToolTipText = \"\";\n\n            SkillPointsStatusLabel.Text = skillPoints <= 0 ? \"No SP required\" :\n                $\"{skillPoints:N0} SP required ({skillInjectorsCount})\";\n        }\n\n        /// <summary>\n        /// Autonomously updates the status bar with the plan's training time.\n        /// </summary>\n        internal void UpdateStatusBar()\n        {\n            MainStatusStrip.Visible = m_plan != null;\n\n            if (m_plan == null)\n                return;\n\n            int entriesCount = m_plan.Count();\n\n            // Training time\n            CharacterScratchpad scratchpad = m_plan.ChosenImplantSet != null\n                ? m_plan.Character.After(m_plan.ChosenImplantSet)\n                : new CharacterScratchpad(m_character);\n\n            TimeSpan trainingTime = planEditor.DisplayPlan.GetTotalTime(scratchpad, true);\n\n            UpdateSkillStatusLabel(false, entriesCount, m_plan.UniqueSkillsCount);\n            UpdateTimeStatusLabel(false, entriesCount, trainingTime);\n            UpdateCostStatusLabel(false, m_plan.TotalBooksCost, m_plan.NotKnownSkillBooksCost);\n            UpdateSkillPointsStatusLabel(false, entriesCount, planEditor.DisplayPlan.TotalSkillPoints);\n        }\n\n\n        /// <summary>\n        /// Imports list of skills from the clipboard to the training plan\n        /// </summary>\n        /// <param name=\"text\">Clipboard contents.</param>\n        internal void ImportSkillsFromClipboard(List<StaticSkillLevel> list)\n        {\n            // Nothing to evaluate\n            if (list.Count == 0)\n                return;\n\n            CharacterScratchpad scratchpad = new CharacterScratchpad(m_character);\n\n            foreach (StaticSkillLevel skill in list)\n            {\n                // Make sure we actually have a valid skill\n                if (skill.Skill != StaticSkill.UnknownStaticSkill)\n                {\n                    // Add any dependencies that the skill may have\n                    scratchpad.Train(skill.AllDependencies.Where(x => m_character.Skills[\n                        x.Skill.ID].Level < x.Level));\n\n                    // Add the skill itself\n                    scratchpad.Train(skill);\n                }\n            }\n\n            TimeSpan trainingTime = TimeSpan.Zero;\n            int skillCountToAdd = 0;\n\n            foreach (var skill in scratchpad.TrainedSkills)\n            {\n                // Check if skill level is already planned\n                if (!m_plan.IsPlanned(skill.Skill, skill.Level))\n                {\n                    // Include skill in calculation\n                    skillCountToAdd++;\n                    trainingTime = trainingTime.Add(m_character.\n                        GetTrainingTime(skill.Skill, skill.Level,\n                        TrainingOrigin.FromPreviousLevelOrCurrent));\n                }\n            }\n\n            if (scratchpad.TrainedSkills.Count == 0)\n            {\n                MessageBox.Show(R.MessageClipboardTrained, @\"Already Trained\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n            }\n            else if (skillCountToAdd == 0)\n            {\n                MessageBox.Show(R.MessageClipboardPlanned, @\"Already Trained or Planned\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n            }\n            else\n            {\n                string trainingDesc = trainingTime.ToDescriptiveText(DescriptiveTextOptions.\n                    IncludeCommas | DescriptiveTextOptions.SpaceText);\n\n                var dr = MessageBox.Show($\"Are you sure you want to add {skillCountToAdd} \" +\n                    $\"skills with a total training time of {trainingDesc}?\\n\\n\" +\n                    \"This will also include any dependencies not included in your paste.\",\n                    \"Add Skills?\", MessageBoxButtons.YesNo, MessageBoxIcon.Question,\n                    MessageBoxDefaultButton.Button2);\n\n                if (dr == DialogResult.Yes)\n                {\n                    IPlanOperation operation = m_plan.TryAddSet(scratchpad.TrainedSkills, \"Paste from Clipboard\");\n\n                    if (operation != null)\n                    {\n                        PlanHelper.Perform(new PlanToOperationWindow(operation), this);\n                        ShowPlanEditor();\n                    }\n                }\n            }\n        }\n\n        #endregion\n\n\n        #region Controls handlers\n\n        /// <summary>\n        /// Toolbar > Delete.\n        /// Prompts the user and delete the currently selected plan.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbDeletePlan_Click(object sender, EventArgs e)\n        {\n            DialogResult dr = MessageBox.Show(Properties.Resources.PromptDeletePlan,\n                @\"Delete Plan\", MessageBoxButtons.YesNo, MessageBoxIcon.Question,\n                MessageBoxDefaultButton.Button2);\n\n            if (dr != DialogResult.Yes)\n                return;\n\n            // Close the skill explorer\n            WindowsFactory.GetAndCloseByTag<SkillExplorerWindow, PlanWindow>(this);\n\n            // Remove the plan\n            int index = m_character.Plans.IndexOf(m_plan);\n            m_character.Plans.Remove(m_plan);\n\n            // Choose which plan to show next\n            // By default we choose the next one,\n            // if it was the last in the list we select the previous one\n            if (index > m_character.Plans.Count - 1)\n                index--;\n\n            // When no plans exists after deletion we close the window\n            if (index < 0)\n            {\n                Close();\n                return;\n            }\n\n            // New plan to show\n            Plan newplan = m_character.Plans[index];\n            Plan = newplan;\n        }\n\n        /// <summary>\n        /// When the selected tab changes we update the list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tabControl_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (DesignMode || m_plan == null)\n                return;\n\n            UpdateControlsVisibility();\n\n            // Close the implant calculator and attribute optimizer if the user moves away for the plan editor\n            if (tabControl.SelectedTab == tpPlanEditor)\n                return;\n\n            // Tell the attributes optimization window we're closing down\n            WindowsFactory.GetAndCloseByTag<AttributesOptimizerOptionsWindow, PlanEditorControl>(planEditor);\n            WindowsFactory.GetAndCloseByTag<AttributesOptimizerWindow, PlanEditorControl>(planEditor);\n\n            // Tell the implant window we're closing down\n            WindowsFactory.GetAndCloseByTag<ImplantCalculatorWindow, PlanEditorControl>(planEditor);\n        }\n\n        /// <summary>\n        /// Status bar > Obsolete entries label.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        /// <exception cref=\"NotImplementedException\"></exception>\n        private void obsoleteEntriesToolStripStatusLabel_Click(object sender, EventArgs e)\n        {\n            ObsoleteEntriesAction action = ObsoleteEntriesWindow.ShowDialog(m_plan);\n\n            switch (action)\n            {\n                case ObsoleteEntriesAction.RemoveAll:\n                    planEditor.ClearObsoleteEntries(ObsoleteRemovalPolicy.RemoveAll);\n                    ObsoleteEntriesStatusLabel.Visible = false;\n                    break;\n                case ObsoleteEntriesAction.RemoveConfirmed:\n                    planEditor.ClearObsoleteEntries(ObsoleteRemovalPolicy.ConfirmedOnly);\n                    ObsoleteEntriesStatusLabel.Visible = false;\n                    break;\n                case ObsoleteEntriesAction.KeepAll:\n                case ObsoleteEntriesAction.None:\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Select Plan > New Plan.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void newPlanToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            if (m_character == null)\n                return;\n\n            Plan newPlan = CreateNewPlan(m_character);\n\n            if (newPlan == null)\n                return;\n\n            m_character.Plans.Add(newPlan);\n            Plan = newPlan;\n        }\n\n        /// <summary>\n        /// Select Plan > Create Plan from Skill Queue.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void createPlanFromSkillQueueToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            if (m_character == null)\n                return;\n\n            Plan newPlan = CreateNewPlan(m_character, EveMonConstants.CurrentSkillQueueText);\n\n            if (newPlan == null)\n                return;\n\n            // Add skill queue to new plan and insert it on top of the plans\n            bool planCreated = PlanIOHelper.CreatePlanFromCharacterSkillQueue(newPlan, m_character);\n\n            if (planCreated)\n                Plan = newPlan;\n        }\n\n        /// <summary>\n        /// When the plans menu is opening, we update the items.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsddbPlans_DropDownOpening(object sender, EventArgs e)\n        {\n            ToolStripItem[] noTagItems = tsddbPlans.DropDownItems\n                .Cast<ToolStripItem>()\n                .Where(item => item.Tag == null).ToArray();\n\n            tsddbPlans.DropDownItems.Clear();\n            tsddbPlans.DropDownItems.AddRange(noTagItems);\n\n            CCPCharacter ccpCharacter = m_character as CCPCharacter;\n            createPlanFromSkillQueueToolStripMenuItem.Enabled = ccpCharacter != null && ccpCharacter.SkillQueue.Any();\n\n            m_character.Plans.AddTo(\n                tsddbPlans.DropDownItems,\n                (menuPlanItem, plan) =>\n                {\n                    menuPlanItem.Tag = plan;\n                    menuPlanItem.ToolTipText = plan.Description.WordWrap(100);\n\n                    if (plan != m_plan)\n                        return;\n\n                    // Disable selection of the current plan and make it italic and bold\n                    menuPlanItem.Enabled = false;\n                    menuPlanItem.Font = FontFactory.GetFont(menuPlanItem.Font, FontStyle.Italic | FontStyle.Bold);\n                });\n        }\n\n        /// <summary>\n        /// Occurs when the user clicks one of the children of the \"Plans\" menu.\n        /// The item may be an existing plan or the \"New plan\" item.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsddbPlans_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)\n        {\n            if (e.ClickedItem?.Tag == m_plan || e.ClickedItem?.Tag == null)\n                return;\n\n            // Is it another plan ?\n            // Opens the existing window when there is one, or switch to this plan when no window opened\n            ShowPlanWindow(m_character, m_plan);\n            Plan = (Plan)e.ClickedItem.Tag;\n        }\n\n        /// <summary>\n        /// Creates a new plan.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"planName\">Name of the plan.</param>\n        /// <returns></returns>\n        internal static Plan CreateNewPlan(Character character, string planName = null)\n        {\n            using (NewPlanWindow npw = new NewPlanWindow { PlanName = planName })\n            {\n                DialogResult dr = npw.ShowDialog();\n                if (dr == DialogResult.Cancel)\n                    return null;\n\n                return new Plan(character)\n                {\n                    Name = npw.PlanName,\n                    Description = npw.PlanDescription\n                };\n            }\n        }\n\n        /// <summary>\n        /// Toolbar > Export > Plan.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void tsmiExportPlan_Click(object sender, EventArgs e)\n        {\n            await UIHelper.ExportPlanAsync(m_plan);\n        }\n\n        /// <summary>\n        /// Toolbar > Export > After Plan Character.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void tsmiAfterPlanCharacter_Click(object sender, EventArgs e)\n        {\n            await UIHelper.ExportCharacterAsync(m_character, m_plan);\n        }\n\n        /// <summary>\n        /// Opens the Loadout form and passes it the current Plan.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbLoadoutImport_Click(object sender, EventArgs e)\n        {\n            // Opens a loadout importation window (use the plan as tag for the creating the window)\n            // (This should be the only time a plan is used as the tag)\n            WindowsFactory.ShowByTag<LoadoutImportationWindow, Plan>(m_plan);\n\n            // Change the tag (we changed it to the character for window lookup)\n            WindowsFactory.ChangeTag<LoadoutImportationWindow, Plan, Character>(m_plan, m_character);\n        }\n\n        /// <summary>\n        /// Toolbar > Copy to clipboard.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbCopyToClipboard_Click(object sender, EventArgs e)\n        {\n            // Prompt the user for settings. When null, the user cancelled\n            PlanExportSettings settings = UIHelper.PromptUserForPlanExportSettings(m_plan);\n            if (settings == null)\n                return;\n\n            string output = PlanIOHelper.ExportAsText(m_plan, settings);\n\n            // Copy the result to the clipboard\n            try\n            {\n                Clipboard.Clear();\n                Clipboard.SetText(output);\n\n                MessageBox.Show(Properties.Resources.MessageCopiedPlan, \"Plan Copied\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Information);\n            }\n            catch (ExternalException ex)\n            {\n                ExceptionHandler.LogException(ex, true);\n\n                MessageBox.Show(Properties.Resources.ErrorClipboardFailure, \"Plan Copy Failure\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Information);\n            }\n        }\n\n        /// <summary>\n        /// Toolbar > Implants calculator.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbImplantCalculator_Click(object sender, EventArgs e)\n        {\n            WindowsFactory.ShowByTag<ImplantCalculatorWindow, PlanEditorControl>(this, planEditor);\n        }\n\n        /// <summary>\n        /// Toolbar > Attributes optimizer.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbAttributesOptimizer_Click(object sender, EventArgs e)\n        {\n            WindowsFactory.ShowByTag<AttributesOptimizerOptionsWindow, PlanEditorControl>(this, planEditor);\n        }\n\n        /// <summary>\n        /// Toolbar > Print.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsbPrintPlan_Click(object sender, EventArgs e)\n        {\n            PlanPrinter.Print(m_plan);\n        }\n\n        private void tsbClipboardImport_Click(object sender, EventArgs e)\n        {\n            string clipboard = Clipboard.GetText();\n\n            List<StaticSkillLevel> clipboardSkills = new List<StaticSkillLevel>();\n\n            if (CheckClipboardSkillQueue(clipboard, clipboardSkills))\n            {\n                ImportSkillsFromClipboard(clipboardSkills);\n            }\n            else\n            {\n                MessageBox.Show(R.ErrorClipboardImport, @\"Not a Skill Set\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/PlanWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"MainStatusStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"ObsoleteEntriesStatusLabel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQg\n        djMuMzap5+IlAAACo0lEQVQ4T5WNW0iTcRjG/25unpI0Lwo6EQ6jllKQsKCuOlx56003QQyMJFh5iCTw\n        piAlgqywYc25zPOYOg0vcoXOZZ6Qyi9xbTrHDt+387ec2+zb05zfjWBiv6uX932e30v+BfuBCMKjh+as\n        XVmP+dX/ERwm1zlLHWIz1/50PSTH+PXeSH4XRsalDHzDSNgaYHmfoeZPeyM4lHYjkfwOTz/gakXUdIHr\n        fkBO8OfdYYc3vxd7wfQC7BRAd4CjKmBtE7fzkd0J6AU3E+b7ANOHdxo1jIakyHwXkU9STltHCvnYzrBD\n        JH19vNgPVxsQnodEIoFcLgdsT7AxfQXLKnE3H92ZwICwgluqQsKZFCTikEqlqKysBH5/B+YvY23kKKet\n        JUV8fDvsIBGtjxUH4WhGhB7DJjKZDDU1Nak58VOOuPEMlltEfXxlO4F+we2NrzLEvsnh87rBcRzKy8tR\n        X1+fEsQ8Rvj7jiCkzed01eQUX9uCHSDiiEES3DCdg2OmEW63G9FoFFVVVVCr1SlBOByGQ3cVTMcB2JTC\n        fr66RVAnvLMxWYqI8SKoH3Ow2+0IhUIwm83weDyIxWLw+XxYnu3BanMu/J3ZnL6aSFNlVkcy1g0SNj5x\n        FvbpBiwsLMBisYBhGJSVlUGhUCAYDMLpdGJxcRHW9ktwqrJheynQpwQBrfBe3HQe0c9SuL7UwDb1AiuT\n        TXDNKWEaeIS5kQa4Z5WwTTRhydAIs+Yifj0VwatJTwwqSAlZN5z0x02lSUEJ1kZPIzxShJC+EH7dcXh7\n        DoPpPAiXpgAOVR5WlTlYeZUJ6/N0ON8KYXlG2omzI6fFoy2gPL35lKcnj2K69lNMRy5Ft++jaE0ORbdl\n        UXRrJkWrxBT9RkS5W4SUSymgXK/TFj7Wklt/ARi0y6f9vdeMAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"SkillsStatusLabel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAhdJREFUOE9j\n        GHSAEYphgJGVhUVYUFBACMrHC5gXzG3fcnT3jJvbFnTcOrd//pPHj/a/+/Dm6p9jB9bcZGZmZoGqww7Y\n        2dllPzw/9ufz+9P/z22b///5tUP/v72/9v/Xz6f/v327/t/H0yUBqhQn4NixduqVjy/2/zuzdcr/E1vm\n        /L93dv3/V3f2/P/88tT/jfOaHwAt4YCqxQo40hIjFz463Prv/L7J/+sT/P/PLE/6v21yxf9TK7v/n1jR\n        /d/B0rQQqhYrYNfQ0Ch6fHTq/zf3F/53VZf4760l/T/WXOV/jrPe//IAq//RtvqvmJiY+KHqMQAwwFns\n        n9w6/uPu4Y7/xZHW/7WFuP4bifP9t5AW+G8nL/zfSkboPz8HeyNUPQZgBmLd9oayi6eXFP5f3BjxX4qD\n        5b88L/t/HXHe/7pAg7TFeP8rCfB8ArpCCqIFCTAyMjIBKXkLM+OFs0v8/y+sDPmvB7TRREn8v5G8KJAt\n        /N9CWfJ/srfZDy4OdnuILlQAMkCMjZW1YNvCvj+rOnP+z27I+t+RFwPEUf97C6P/tWQE/sj2N7nIzsYs\n        D9GCCkApEBRAfkYaKseCbDTvGyhKXpYW4tsmys89iYeTPYuFmckKKC8AxCDLsAJ2INYC4hggBiUcdyA2\n        BGJFIAYlZ5A8Ts0gAApIQSAGaQA5UwSIuYHhwwrEyHkEJwApYgaqZQEFKmFNDAwAPzO/BZOVJioAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n  <data name=\"TimeStatusLabel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0w0hl6ky4wgPQuIB0EURhmBhjKAMMMTWyIqEBEEREBRZCggAGjoUis\n        iGIhKKhgD0gQUGIwiqioZEbWSnx5ee/l5ffHvd/aZ+9z99l7n7UuACRPHy4vBZYCIJkn4Ad6ONNXhUfQ\n        sf0ABniAAaYAMFnpqb5B7sFAJC83F3q6yAn8i94MAUj8vmXo6U+ng/9P0qxUvgAAyF/E5mxOOkvE+SJO\n        yhSkiu0zIqbGJIoZRomZL0pQxHJijlvkpZ99FtlRzOxkHlvE4pxT2clsMfeIeHuGkCNixEfEBRlcTqaI\n        b4tYM0mYzBXxW3FsMoeZDgCKJLYLOKx4EZuImMQPDnQR8XIAcKS4LzjmCxZwsgTiQ7mkpGbzuXHxArou\n        S49uam3NoHtyMpM4AoGhP5OVyOSz6S4pyalMXjYAi2f+LBlxbemiIluaWltaGpoZmX5RqP+6+Dcl7u0i\n        vQr43DOI1veH7a/8UuoAYMyKarPrD1vMfgA6tgIgd/8Pm+YhACRFfWu/8cV5aOJ5iRcIUm2MjTMzM424\n        HJaRuKC/6386/A198T0j8Xa/l4fuyollCpMEdHHdWClJKUI+PT2VyeLQDf88xP848K/zWBrIieXwOTxR\n        RKhoyri8OFG7eWyugJvCo3N5/6mJ/zDsT1qca5Eo9Z8ANcoISN2gAuTnPoCiEAESeVDc9d/75oMPBeKb\n        F6Y6sTj3nwX9+65wifiRzo37HOcSGExnCfkZi2viawnQgAAkARXIAxWgAXSBITADVsAWOAI3sAL4gWAQ\n        DtYCFogHyYAPMkEu2AwKQBHYBfaCSlAD6kEjaAEnQAc4DS6Ay+A6uAnugAdgBIyD52AGvAHzEARhITJE\n        geQhVUgLMoDMIAZkD7lBPlAgFA5FQ3EQDxJCudAWqAgqhSqhWqgR+hY6BV2ArkID0D1oFJqCfoXewwhM\n        gqmwMqwNG8MM2An2hoPhNXAcnAbnwPnwTrgCroOPwe3wBfg6fAcegZ/DswhAiAgNUUMMEQbigvghEUgs\n        wkc2IIVIOVKHtCBdSC9yCxlBppF3KAyKgqKjDFG2KE9UCIqFSkNtQBWjKlFHUe2oHtQt1ChqBvUJTUYr\n        oQ3QNmgv9Cp0HDoTXYAuRzeg29CX0HfQ4+g3GAyGhtHBWGE8MeGYBMw6TDHmAKYVcx4zgBnDzGKxWHms\n        AdYO64dlYgXYAux+7DHsOewgdhz7FkfEqeLMcO64CBwPl4crxzXhzuIGcRO4ebwUXgtvg/fDs/HZ+BJ8\n        Pb4LfwM/jp8nSBN0CHaEYEICYTOhgtBCuER4SHhFJBLVidbEACKXuIlYQTxOvEIcJb4jyZD0SS6kSJKQ\n        tJN0hHSedI/0ikwma5MdyRFkAXknuZF8kfyY/FaCImEk4SXBltgoUSXRLjEo8UISL6kl6SS5VjJHslzy\n        pOQNyWkpvJS2lIsUU2qDVJXUKalhqVlpirSptJ90snSxdJP0VelJGayMtoybDFsmX+awzEWZMQpC0aC4\n        UFiULZR6yiXKOBVD1aF6UROoRdRvqP3UGVkZ2WWyobJZslWyZ2RHaAhNm+ZFS6KV0E7QhmjvlygvcVrC\n        WbJjScuSwSVzcopyjnIcuUK5Vrk7cu/l6fJu8onyu+U75B8poBT0FQIUMhUOKlxSmFakKtoqshQLFU8o\n        3leClfSVApXWKR1W6lOaVVZR9lBOVd6vfFF5WoWm4qiSoFKmclZlSpWiaq/KVS1TPaf6jC5Ld6In0Svo\n        PfQZNSU1TzWhWq1av9q8uo56iHqeeqv6Iw2CBkMjVqNMo1tjRlNV01czV7NZ874WXouhFa+1T6tXa05b\n        RztMe5t2h/akjpyOl06OTrPOQ12yroNumm6d7m09jB5DL1HvgN5NfVjfQj9ev0r/hgFsYGnANThgMLAU\n        vdR6KW9p3dJhQ5Khk2GGYbPhqBHNyMcoz6jD6IWxpnGE8W7jXuNPJhYmSSb1Jg9MZUxXmOaZdpn+aqZv\n        xjKrMrttTjZ3N99o3mn+cpnBMs6yg8vuWlAsfC22WXRbfLS0suRbtlhOWWlaRVtVWw0zqAx/RjHjijXa\n        2tl6o/Vp63c2ljYCmxM2v9ga2ibaNtlOLtdZzllev3zMTt2OaVdrN2JPt4+2P2Q/4qDmwHSoc3jiqOHI\n        dmxwnHDSc0pwOub0wtnEme/c5jznYuOy3uW8K+Lq4Vro2u8m4xbiVun22F3dPc692X3Gw8Jjncd5T7Sn\n        t+duz2EvZS+WV6PXzAqrFetX9HiTvIO8K72f+Oj78H26fGHfFb57fB+u1FrJW9nhB/y8/Pb4PfLX8U/z\n        /z4AE+AfUBXwNNA0MDewN4gSFBXUFPQm2Dm4JPhBiG6IMKQ7VDI0MrQxdC7MNaw0bGSV8ar1q66HK4Rz\n        wzsjsBGhEQ0Rs6vdVu9dPR5pEVkQObRGZ03WmqtrFdYmrT0TJRnFjDoZjY4Oi26K/sD0Y9YxZ2O8Yqpj\n        ZlgurH2s52xHdhl7imPHKeVMxNrFlsZOxtnF7YmbineIL4+f5rpwK7kvEzwTahLmEv0SjyQuJIUltSbj\n        kqOTT/FkeIm8nhSVlKyUgVSD1ILUkTSbtL1pM3xvfkM6lL4mvVNAFf1M9Ql1hVuFoxn2GVUZbzNDM09m\n        SWfxsvqy9bN3ZE/kuOd8vQ61jrWuO1ctd3Pu6Hqn9bUboA0xG7o3amzM3zi+yWPT0c2EzYmbf8gzySvN\n        e70lbEtXvnL+pvyxrR5bmwskCvgFw9tst9VsR23nbu/fYb5j/45PhezCa0UmReVFH4pZxde+Mv2q4quF\n        nbE7+0ssSw7uwuzi7Rra7bD7aKl0aU7p2B7fPe1l9LLCstd7o/ZeLV9WXrOPsE+4b6TCp6Jzv+b+Xfs/\n        VMZX3qlyrmqtVqreUT13gH1g8KDjwZYa5ZqimveHuIfu1nrUttdp15UfxhzOOPy0PrS+92vG140NCg1F\n        DR+P8I6MHA082tNo1djYpNRU0gw3C5unjkUeu/mN6zedLYYtta201qLj4Ljw+LNvo78dOuF9ovsk42TL\n        d1rfVbdR2grbofbs9pmO+I6RzvDOgVMrTnV32Xa1fW/0/ZHTaqerzsieKTlLOJt/duFczrnZ86nnpy/E\n        XRjrjup+cHHVxds9AT39l7wvXbnsfvlir1PvuSt2V05ftbl66hrjWsd1y+vtfRZ9bT9Y/NDWb9nffsPq\n        RudN65tdA8sHzg46DF645Xrr8m2v29fvrLwzMBQydHc4cnjkLvvu5L2key/vZ9yff7DpIfph4SOpR+WP\n        lR7X/aj3Y+uI5ciZUdfRvidBTx6Mscae/5T+04fx/Kfkp+UTqhONk2aTp6fcp24+W/1s/Hnq8/npgp+l\n        f65+ofviu18cf+mbWTUz/pL/cuHX4lfyr468Xva6e9Z/9vGb5Dfzc4Vv5d8efcd41/s+7P3EfOYH7IeK\n        j3ofuz55f3q4kLyw8Bv3hPP74uYdwgAAAAlwSFlzAAALDAAACwwBP0AiyAAAABl0RVh0U29mdHdhcmUA\n        UGFpbnQuTkVUIHYzLjUuNUmK/OAAAALxSURBVDhPfVJrSJNRGJ6EWCaKgnmbZOouWllB2TSnkk3J8rKZ\n        Q+uHrbZpgfVtM2oTKjeFlBRCkcDbPwcp85f+cYIXDEW8zBSi1EBwhiCoeL/wdM5xWEL1wAvfed/zPO/7\n        Pufj/Q0A3HJzlOHZWfKUzLtZN7Mz5XxX6f/IUdw7wXE6dV1t3bfq99Uwl1lQVmZGVWUVamvrHK9eGpUN\n        DY1uruvHoZDn+JVbyu0GQwnkcgUjNze3oKmxCSZTKRQk9+b1W1S+q2p7WKA65aIdIiMj073E8OKzMleJ\n        UnJ5bm4OKysrsFqtaG9vh81mw+DgIPQ6PR6pHlOhtoryit+TPCl6asjLy4fRaMLS0hIcDge2t7cxMDDA\n        iBqNBvPz8xgfH0dx8TNo1VroOH0eI1vMFncy0hJZAVNfprC1tYWOjg4sLCxgf38fvb29aGlpwe7uLtbX\n        19Hf38/W0WoKp5hAwg1pfPrtOzCR7hMTE1hcXITT6YRarWbfHMdhdXWVie3t7aGnp4fUNEhKTELMxRg+\n        73z0hQdiURQslnLWeXp6GgcHB4ysKyhAjcnEzlRgcnISra2tRFSHKHE0jRRelDiqQCwSw2y2MNOGh4fZ\n        ZUqyEYGvdvtR976+PvIyzeCec6BNRUKxjCeIFCbTQ37+feY8NWpnZwfOkRF8MhoZke5PvaGrjJB8qiyV\n        CZwLCxfzggKDPInSKgmMjY1hbW0NGxsbsKpU+EnWoMTNzU2WowLd3XaQprT7D2Lh4VNGRghqhAIRqJnU\n        /Rkydmd9PYaGhlhH6v7o6ChmZ2chlSZSMgjHwMgUZ/wDfIUC4XdaSEtNw8fqaiwvLx/9SHS1rs4uSBMo\n        WUQnGPTx9jnpoh8iODhETFyduXzpCttPdkuGosIiaLWF5MmSWY68GEijscDAwGAX7Th8ff38I8IjPly7\n        GrsWJ4lHnCQOEhLXYyUgwsvENLOXl5e36/o/4ebpeToglB+aHXY2TE+C44eEpnt4ePi56n+Ax/sFpcbn\n        bGBLAN0AAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"CostStatusLabel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL\n        DAAACwwBP0AiyAAAAAd0SU1FB9kMERABNPA5XDgAAANCSURBVDhPY8AFmJiYoCwGRiCbG0RDuAjQ2NgI\n        ZaEBRkaIWqBGRgUFRdnZs2e2TZrQGbJv52yNg7tnaxzdM0dj+8bpxiClYIUgoBEdBKaNWssZM1bNYdZM\n        i2YGcpmUlNQMdu7Y9M7NzfU4KwvzSg4O9lWzW7O/e7pYfQXKQzQhAa6MY9veN587+D1lzYKv5t213UAx\n        Nk115cWsrKxSQDbT+tWz6qP8bf8C2YeAmA+IESCwpSZ74o0T/wtWLvh//sG9/8svnfkIFGYHYlAYsC6Y\n        Pzlo+cTC/0D2fSBWAWII4JWSANO2E5ujPGd1/U/bs/r/roc3//cc2v0OJL5pzcT4LRtmLL95ZuuvztbC\n        v5XlKVfVVKRBYcDA8P8/0EB3axavOT3OYfMmrXCf1f3fsrvxf9OmNf8zNy37AFQSBsLzJ1XeCfJ3+y0o\n        KLQYyA8BYhcghoAVh/fNSdix6n/jnk3/Ozes/le+Z+P/w28e/Y+cP/ULEzNz4Z5dy09EB9iD/L0XiFlB\n        erZuXdFuZmoqC2IzOExtW9b24Nj/Q1+e/f/068f/6WeP/I9fv/B/wsH1/w49ufv1zuWtIH/fAWJxsAYg\n        uHph7Xkg5c3AwsAk7jix5YRZS8X/yA0L/m86e/pf2MyJ/6J3LP+k313/3y0z8b+RofY/Uwv91/q6qteM\n        DdRPmRlrn9HRUrwLNCCGgU9KQkInLqLNqLros35V0c/cGZOf8OlolDh21GyPXjf7f+7mZf/3Xr7w3zw7\n        +SILN1cwUJMIEItCMQcQMzCxcnMJy+mo61sumngg/+SO/7Und/+Xrcr7ZF5T9Npr8ZQ3plVFj2Vd7JO0\n        kiM1IqZ1Opj11OgB9QmBNMMAo6SRnlnplT1fTDuq/3m1Nvw/9OTef04p8UlC8jLqzGxsMrad1TmJR7b+\n        bzi5579ZQ/l/xXD/HUB9ihDtQCCoIK9smp81XyY9+bNKfsZHy4ria6xcnKDUBwJMLu1VfdVX9/6s37fx\n        36uvn//71pSDwgBhACjL8ctIisqZGKrJmRmrqLg6iAHF4JmFTVRUVinEv1MzI/mgR2/zdYOEyDSQMFiS\n        EaEOE0BzJhAwAjM4B7+YsDCQDQpIdiYmZgYAFMk3wFl326oAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"SkillPointsStatusLabel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        wwAADsMBx2+oZAAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC45bDN+TgAAAktJREFUOE9jIBIw\n        AjETEDNDaRCfKABSyALE7EYeroEeMeGzrX3cKhiEGPiAYiCD8AKQAg4g5k+d0Fs87cqF3xMunPtfsHH1\n        /5z2quVQOZwuAUmwAbFQ/Zw5VXtu33qz8Pat95f///8/6/Wb/97Ntb/5pUQNoOqwAiZubm6xxgXzZu26\n        cf1N1ZbN94/+/Pn3LNCA1pfv/msmpfzhERW0BqrDboCkvKSGr7/L5Skr5v7NWbPi4b5fv/6dBmqe8u33\n        /5i1a//zqqitBSoThqhGA4KC3Dq2DqZ3g8J8/tuG+P1f9Pz5/0NAzZN+/Pmfuu/Aezlz8xqgMnUgZgVr\n        QAJMIiK8Xrpaiq/1dFT/m5jq/HcN9vo/ad2y/z0v3v1PPXz0h6qddTFQnSwQo2rm5+cXkFeSWW1uqvXL\n        193mf0K0z//YGP//9e2l/2u7qv47Feb+0XF17Acq1QRiULSi+l1YQrhEUlbyv5Ky/H8dbZX/69bO/r9m\n        3Zz/nV3l/9Mzkv4D5W4AlVkCMchmzIDjF+RPMTQz+F9UVfRfQkr8v7uX6//mptz/MdHB/4ODvH7Jykr2\n        AJWJATH2UGdjY/OMTg77Ji4h8l9YWOC/kCD/fw11pf92Nmb/jE311wCVWAExzjhnYGJiSubi5lgnLCL4\n        VVxM+L+ymtJ/cUlxoGH8l4HSIUAM8jduwMvLq8rBwVYmJiZ0QF1d6b26ttofEVHBj4yMjH1AaX6IKvwA\n        5Dw1Vg7WGCYWpiIgGxRdtUCsD8QkAVB2BeUBkIEEcxsDAwMDAAVowmbMzTvpAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"upperToolStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>155, 17</value>\n  </metadata>\n  <data name=\"newPlanToolStripMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAu5JREFUOE9lkltI02EY\n        xjUQgjTqIg9dhNVtBKFWRFRmUOBFXWlE5IlsgoQUKZZlisxjzrktFU952NHNqTs5D3Obc7qDbtNN5zxn\n        ZH+ji+iuwqdv/1D72/fy8H03z+993pcvBACt1bU1k9/vN8x6ff0Ot0dutjtlwxNT0kGLlZbeMinRmcZZ\n        sWfOHgr59+wCAisrlNe/CJPTjR6DBe9VelRIVQxxFJrfdd3SosiYk/uQXYB3MUB9/f4DG9vfsLC5BbMv\n        gMnFVRi9AcgmnJBaHLT4fbpfApG86FTs6b+QXcCEZ5Za3tqGa3UTtsAq7EtrGJ31Q2S2/6d3PZqfZcLe\n        iwyAxmqjnMvrpPMS+m1uSEi3g8aOsSlUqQy4Vy/cSeF2XmcAhKNmasg9D5XDQwOUUy4oJmfou9/uRpth\n        Ei/EGmS0KpBY82EnldfNBNT36yndjBe+j5+x8GmL3oNlfomMsg69xw+5fQ5lA2PI7VbjVm3Xzn2BiAng\n        KHXUkMsHBzEYvYsYJ+YRsoNajQnVaiOqNWZw9BNIb1UimSveedQoYwJKxH2UZNyBYIpgdI7agDcyLZl5\n        DAUSLQplg2CrjMjvGUayQIzM9oFEBqBaoaFUjllop+fA0xrxrFOJUsUQioJGEr2cmO925uFYdTTO12WC\n        JdQyAWypiuojy9PN+NA8YoXIMg2O1gSx1YUmgw0KhxfHa2Jwm9SRikiwutU3GICXHb1UTpMI2Y0isJql\n        yGnpQVqjBKy2XlzhZ+FoVRQtGlAZibDyw19C2aFP9wB3SnnUw7p2ZDUIkdsmR15nH9KbpEjhCxFecYI2\n        HiwCWN8D3HzLpcrkOijtHhjnlzG1tIHnQjVS+SLE1WUggnTdTRBeGYWwigMJrhVzqQx+F3Jb5SgkH6ZI\n        psPjFjkeNEiQ1qJAdpeaAKJpQAQBFWqtSeS9v4MLBVVUXGEN4l9xkPCai0vFPCSUCHC5tBFXy1uCnwfn\n        SJLg/PH8J8hXW5NC2aEhfwBb+54EkVCpdAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"createPlanFromSkillQueueToolStripMenuItem.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        wgAADsIBFShKgAAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAAM/SURB\n        VDhPZZJrSJNRGMdXfehD9K3sZlGLirQLmlpZKGml1YJS7GKWlSSJFqJheZut7GIlcy7T8pq6ubnpZnO+\n        WSo6p07nvc12MS8ZyatFRBR089/xfY2QfvBwzpff/3nOw+H8ZWh4uMlisTT0m8xVxt4+pa6js/xli0H+\n        XN/KVK2+TUY1NV9czV07d0aZje3NG9pksaKpsxeKBj0eaWpxV66ZVcIK7a+MUnmSw7Ll/4eYrDZ68vMX\n        jE58xOuxcejMNrRZh9BosqG8pRNyvZGph2rqZ5ZUmbRq9ZrZIS19/fTg+AR6hsbQbhtCh30Y9f0WlDYa\n        IKHq8PX7D+SWlCBXW4d0hfZHqqTSY0Zl0ba2052DI6SzHVXtvZCRblJdBxPw/sMkphno1uFAwBEcyZRM\n        HRMVe8+oLJJ6Hf2idwAaYx8ToDL0oKKtmznv3OJDmpOGYD93OO/chT0PiqaOi0unA+awNiGzqpamuk0w\n        v32P1+/G2T2YrFBoayAvl0GcEAnf9cvg7bkVXrGCqd3hMYFEW8DaBKGKol/0mGG0j5DFWdE8YEfRMwr5\n        WenM+MB3pEaeROh+Z4SGnYHTXl4k0ZawNkFQpqZlzUZMTzE9urC6AWE30qAqe8Lov79NIiU8ACG+WxAf\n        HYa1O7z4RFvJ2oT7FVpaY+xHTdcriGsaEVOsQkSaCGpJNhPwbWIYp/xdwHPlQnDpBBydtoiI5sbahNty\n        Da0my6O6zcita4VU34Vr2UUoFKcwAZOjr3D6oAsC3FcgJsgbDtz1eUT7F5DwtJKOeCxFeI4UF3PliMhT\n        IDRHhvC4ONCDBtRrS8DbwYXz4vnw3MzF0nUbC4jmzNoE/xtiOiSjEGHZEkQVKBFdrMbZx3IcupKMhvzb\n        uBcVCP9Ni+C4cB427D0Mpz1+yURzYG2Cz3URnaqkoOroQ+PAIAz2UcRKqnE04RZ5wCdUZcYjKdgDfq4r\n        sPP8ZQTy04KI9u8feKWI6HMPSxCVr0R8mRZJ5RQu5CkRcDMDYyNWlIn44J/3QSDPCzyBELGV9ftmVBaX\n        q/fobfEP4JYohHuyCNtTxHAXZMEjOROHrqeDF5sI/+grOEjuQY8UiKtu9eVwOJw/m3kvmJXgWpMAAAAA\n        SUVORK5CYII=\n</value>\n  </data>\n  <data name=\"tsddbPlans.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALUSURBVDhPZZLbT5JhHMf9l1pZXbTM8qLNLrooTTt4aJls\n        Lp3OjLJIh9m0CU5UnCB5AF7O4Au8HjkJKqByEBAFT9lyr62L1l01vz3A2wX63X57bp7P5/d7fnsK/ie9\n        v+9OJpOOaDRuCYYiendgTTvvW9XMeH3ZmvX4KMbtreeun09id5eNJbfhXgtD5/BiiJ7FRw2dVwKD7a9o\n        imrnkPzEEgn2+89fODz5ga2jY3jiO1jZ3oMrtgOtbw0abzBbEoXij0SlPy9xRqJs+vgEob0j+Hf2EEjt\n        YzGahMoTOFcC3fRvodJ4mUNzoZf97Fr6gHROweIPgyLdzoLjzlX00A7cFQhO7/WPF3FoLspFJzsXToAO\n        RrIC02oIhpWN7GkJhDHmWEGr2oYauQHFWYEyXyC20CyzEUP8yzdsfT3O7sGbSJGnHGA2koQ+sAnhtBMN\n        U1aUEEHF4BmByESzc6E4ggRwxbaxROAFsoM+mxu9Vhd6bR6IZn2olptQSgSPRzT5gg61maWWgshMkRld\n        ZHXgndZO3uxEG2UHXzuDD7QLL3XzKB1Uo/azuZhDc+miaJYORmFf38SA3YXmCRM6DXNoz4Bk9G4C9zBe\n        vDaSJUr14E1ZzwvMZHnMRhyjC8tQedchsruhXg5hxOGHIRhDt30JbcZF3BcIT59P0jc4NBe+zMjyRlSo\n        k6pQP6oBT6ZDlZRC/ZgRdaQalTa8oBi0EkG5wowmw+JNDs3ldqeYfSRW4OmwEg1jejRNmFE9okGZRIkH\n        QxSeyIho0oYm3QIeKmg0T3tucWguRe/FrFDPwBSIwJVIYzV1iBalFeUSFSqGNageM4GnYtBCdvBkwobW\n        s4LrfDFbI5lEg1wPPvkw7VoGz2R6VA5TqJIZSHcrGrXzeDXtQa2SAd/uyxdcaOtiL/I/4dIbEQrf9uOK\n        YACFHYO42inFtW4ZSvomcYdMUiY3o1KRmSAjKCj4BwtgSfD3myyxAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"tsmiExportPlan.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAOvAAADrwBlbxySQAAAtlJREFUOE9lkttLk2Ec\n        x8U/wMugQNGELroIorSCKM0uQm+iC42ISkWbJBRBymplE9Fw6pxzHnDL1J3d3OZOzsNObnMHD9vcdJs6\n        NSN5jS6iu4p9e/dWymsPfPk9F8/n8/yeH08GACrJ7W1HLBazhiNRXSAYUjn9i8oZt1cx5fJQsbgW5GbH\n        PCP3dH5mxt+V5g4Fia0tIhKLw7EYxLjVhT69Be8Uelq4auOvbrGCdeLkKUpCE0TiCeLLt+/YPfiK9b19\n        OKMJLMSTsEcSULoXoXAFqPRqzT8FUhUrJzcvkyZwh8LE5v4BVpJ78CWS8G9sYy4cg9Tp/y+d48YfLZKJ\n        QprA6PERi5s75M0b0PmCkJO3HQdHbF6066243SNJlfNGr9MEkjknMR1cgz4QogQa7wrUC8tU1fmDeG9d\n        wAuZEZUiNYo7PqQq+GK6oEdnIczLEUQ/fsb6p31qDq61DfIpO7CEYlD5V9EyaUO92ICbXWOpuwIpXcDV\n        mInplSgCJGCPxDFPwrPkDLqMDnAMdnCMTnAtbjwSaVDGk6UeDCjpArZMS8jnA0h3kW6da7DijdJEvtmG\n        RrkJTOUUWvV2NIzPoEwgQ9XwZDFNwFEbCX0gDNPSKvgmO56PatCsngYrDZKtt5FwVb8WZ+t7cYU9DIbE\n        RBe0KvSElhyeeTmKoVkPpK4lcE0OyDwrGLT6oA5EcO5pHzJKm5BdwwVDbCiiCV6OTBB1g1LUDkjBGFKg\n        TjiOErYQ+Y+5FHQYC0HVrPI2G1lLDwW3mvnE/e5hVPdLUP9ehWejWuTVdB5Bx/NHKD8U3HjLI1pUZmj8\n        IdjXNuHd2MUdjgQ51R3/Dh/JyJpVcayDa008orJ3DPUiFZjkh2EpzagRqnCvX46HQjVqxww484RPwXl1\n        PWCaPCXk/mgG5xvbiQvMDlx8xUXBax4uNfFRwBbgcvMArrYJ058HhWwRsmu7UdQqQYMhLWjK+A0VeL6s\n        BZcSIgAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"tsmiAfterPlanCharacter.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH\n        DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp\n        bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE\n        sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs\n        AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4\n        JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR\n        3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd\n        li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF\n        ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX\n        wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF\n        hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55\n        4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ\n        VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB\n        5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC\n        qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE\n        j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I\n        1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9\n        rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG\n        fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp\n        B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ\n        yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC\n        YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln\n        yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v\n        vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp\n        vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L\n        Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA\n        bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z\n        llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW\n        ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s\n        xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6\n        eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw\n        YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR\n        XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm\n        WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl\n        xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2\n        dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8\n        V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za\n        Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v\n        Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb\n        PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/\n        0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h\n        /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr\n        XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS\n        fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+\n        tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/\n        6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAjRJREFUOE9j+P//PwoG\n        AVZWVvaE+Pi4NatXbY2PDutiY2URB0tgA9gM4OLkEDty5OB9IP//kV1r/2vKCa8AS2ADyJpBGAq4KvNT\n        b+5aN/9/Ubz3fxEu5mNAMSYgZgFiVigbArAawMgkaqImvcdWke+/sQTXf0Uh7s1AUUEo5gNiNpAqIMZq\n        gGiIh/2J65dP/d+2eNLfWDeTf0FWcv+NlSU3AuVMgFgWiDmAmBmIMQ0Aui9wVmctkPn//9Uze/60FsT9\n        jXRQ/l8Q5fUOqDwMiLWAmBuIQQYwYhjAz84Qv3J2z/+f3z7/27xs6p/8SOd/HvpS/8uSAn+yMDLkAjVZ\n        ADHIK5CwQDeAl40hfsG0tv/fPz/7s23FjD8RHvr/bJSE/9cmef0CGlAN1OQDxCBvgMKBBcMATiaGqOlt\n        Rf+/vLn+b+OSyX+jPQz/uWiJ/K+NsP0F1NAKxIFQA7C7AAjEE4LdTt0+v+f/gqltfyKddf6Zy/P9t1cT\n        +8KgYL6awSHvMINdViRQHfYwAAFVWfGS1vSg/6n+1v+sVUX/y/BxfAQKz2OwyTjH4FX/n8GjZg2QzwRW\n        j80AAw2l1IMrpvz39vX9J+MS+x+sCYZ3voSxVwCxF1YDjLRU45/cufJfN6wIoQkdwwzBZgAHB7tifXXp\n        XqfAiKeS7mmfoIoRhsE043ABKJ1zAnOkKpA2AGJDIFYBYkEGz7pVSJoZwBiLASAACmFQxgHFNQiDoowF\n        aIA3VLMXxIB6BgD9s5edGjob9gAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"tsddbSave.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHzSURBVDhPYxi8IDU11cjNzU3W3t6eIzAw0BUqTDwoLi6O\n        yM3NrdPQ0BAOCQlZ7OrqqgOVIg5YWFjo3r9//39LS8vW4ODgp+np6e/d3d0ToNK4QV5ennhBQYEL0NnZ\n        69ev//4fCC5cuPC/qqrqf35e/v+MjIyFpqamwlDlCODi4iIHlJzV2tr6evr06f/Xrl37f+vWrf9PnTjx\n        /8OHDyBz/s+ZM+d/TU3N/9LS0utBQUEuUK0MDDo6OnqJiYkPs7Oz/1dUVPxvb+/4DzJk1apV//ft2/f/\n        6tWr/798+QI2BOSaiRMm/J81a9b/2NjYNpB+bmBoXwaa+D8mOuZ/fn7+/4aGhv8TgIoWLFzwf/Pmzf9P\n        AF3x5sUbsAGbNm36X1Nb+x/o1ZfOzs5JDCoqKhk+Pj7/QTgyMvJ/dnbW//q6uv8TJ04Eu2LlypX/T506\n        9f/SpUsgp//39/f/D/TuNhMTEyWw883NzY/Z2dl909PTOw2Msu1A7yw3MjKaC4y2NfX19X82bNjwH0j/\n        A8bAf6CaH5qamqVgjTCgpKS0mJWVNRXIdAJiUyDWAmJRERERn97e3v/AKFwBNPiVlJTUFUFBQUugHAZg\n        h9IowMrKKtjGxiYXyBQQEhKq4+fnF4DIEAmAXtME2gqKb2Y+Pj5liOjgAwwMAIzd5EHVp/iOAAAAAElF\n        TkSuQmCC\n</value>\n  </data>\n  <data name=\"tsbDeletePlan.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAMXSURBVDhPZZJrSJNRHMZPfQrElGCJFH0I+hBk5V0iy6Ab\n        FWUQkWE3THO16EaXkbUMldJsE81LOi/l1qbTOV/nmpdddEvdTN3c5rzkJSN7i6CM+lDR03FbhPrAw/vl\n        /H7n/z+85F/GJiaMbrdbZ7c7VdZ+m8Jo6a1pNXfLX5rMnmo7zDKN0ZRKjy71EgvievOGdbiHYewdQK3O\n        hEJGiwdyZl4FderfwmpZGj2+WOJwudhPX79h6uNnDE3PoMM5gq7hcRgcI6gx90JusnpaUFHxq0CqWCzR\n        2+zs2MxH9I9Po2dkHJbRCbTb3ZB2WBZVUNv4M0NSH+VDvWFe9bC9Y5P05lGoegYgo7ctBKv03chmdIgX\n        CP4cyava7kO9kbTr2ZYBFxirzSNQdvejrqvP81VZBlCu68L1F2qcEddhh0cgmS8QqRhW0+eA8+17DL2b\n        8byDyTVKV5mE1uaGwjKIjEY9eNVN2EkFCU8WCIRKhm3pd8JKAYNjGJ0UbqNvkNtkQM5c1R0Qas04LVZi\n        PxWcKJHPF6S/aGBlnVbMTTE3urBJh7s1zUiXNODKuUu48KgYWYwBN2pbsUsgRPKmiNzVhKzy4YRkyhiW\n        sdrR/HoQ+c0GXH2mRLpCC15OIT4tXw51WCRu5ZWCJxKjKCwGP/z9sZmQ/1PMCRro42n6nChtewWp6TWE\n        zUaUqNtxdd9BfKCSto2hUIVG4HNAAFI5HP0yQtb4cEL4ZfUst0SKlGIpUkvl4JbV4lSxDKnl9TiWVYDr\n        UVuBoCAgOBhpIWHYcfxssg/1Zu99EZsoqkBSkQS8cgUuVylxukSOo/nViL+bi8pN4ZhdsQJfaOvXh+BI\n        QhKXYku8NM32eyI2Q6GB0mKDwTWG7tEpXJM04XBWISpDozAbGIiL4THgxsSCpSt0cjiudYSs9eGEbOOL\n        2DMFz8ETK8CnP0xajQbJZQrE38lBK2clUqJjcfJxGbhPZUiM2wO9n9/3EEJifTghoTcz2XD+I0TcFiLy\n        Th6iBfmITH+CSP5jbEg8jy23HuJAEV1J3IBD2WJsjtst8CMk6C/NBC+VDJdTmgAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"tsbPrintPlan.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFzSURBVDhPnZLNSgJhGIW/63ERBCGRVPQnQRJClKm0L/qB\n        6AIMYkKL2gZBt+AiEAyMApcthIQiQp3UcdRsHIt0hJi3OR9TNmWDdeABh/c5h28h+5rERfzyLBEjOxLn\n        8aSp/wwEXdfpt+AGx9StCS4FwqexKBfbbY00g5bWMmhSswVe+Q0OXLPWicPheDs+OeJS40WlxnOdVIN6\n        Q6G6+kSKAQIHrlnrZHh8jHZ2t7lUrZWp8ihTGVRLJFclkisSv8GBa9YY2z+MbIZCoWZ4T6C1jRUu5SXR\n        IEcPxRyJxSyJhQzl8hl+gwMXHXQZfmiaxo+eWU9PIOigy7CGKEqNJtxTJEQEW+DARdD9HCjJBRoaGaXl\n        9VVb4MBFLANZ8Z76nYM04/XaAgcuYhm4ubumvgFnT5SiW7xjGUjfpv4Ewgf8QZ8+75ujxcAC+YO9gw66\n        bHLazQdS6auuz+0GXoAOuszpch18DHx/ph3ooMv/jfj4D4wx9g60zXc0WDcvAAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"tsbCopyToClipboard.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJJSURBVDhPjZHPT5JhAMdfzx3y0F9gHepch7ZWzs02u1RL\n        iYZUWELKj0GKCOPHK6WikqL4+iLaQMAQTQUzfQgtQG2reUictlULrQ7VgfVjnbp8e0xu8m58t++e9/DZ\n        d8/zeRmWNbdPeO6n/Kwi3qupiesl5+K6mjNxvbgibrp1YalDJ5l2NksPMULxDtgSiRduzJMHmIl1Ihxh\n        MRYy46HfBG64GU8Czp8fl6YO5/GD4e0NxDtmhb5NBZXhNnQmBVpYJbT01Lc1IjHH5XbeREvz+MF0tUhI\n        T38T5NobkMqvoa6xFk1mBWTKWmiMcsw9NuZ2kqzwgOHOJRKI2OENtYH3WcD7rfCM2eB0WTA+0o4Aq/zb\n        pxUtC7oxNVQT3yMWAyNGuDwGOFxa9PEtGOYsKMqNVXuVRGIOhKNdGJ91IDRDYfo9Sp9VlBuTupqQpBtP\n        k4NYTA+BrOx3qEeNotzUSyrJyvooFtIcnq3xeP7KC7LKodMmQyE3e+WDdgTdylzUdbOUUdVVkc3sJDZ3\n        p7D1ZRqrGz7Mp9zovidHITf9w63w0FFfHx1g6YBNcyXx+VsU2a+z+PQ9iu0PIbzbnQDXq0YhN+FYNyaJ\n        C0FOmaM/sYSpOn28/+71ivdaUXlGJzqbUV8+lZGfP5ExyCt/F3KzkOKwsOoB1yndG/ifI7THaMtoj+Zb\n        JhOXpwu5mSZOLK55MGgX/6CccITczNNbxV97MdJV/4tiJft0gQi52Xjrx3Y2gpcz/B+KCQ8IuVFfPJnp\n        UIu27K2N6wzDlPwD71sEwk6Uj+MAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"tsbImplantCalculator.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOmSURBVDhPdZF7TFtlHIaLlN7jLMYFFmlky9wkE7ANlAC1\n        A8Ns2ApxlI0WRhdAiPYiENqtRSitQ4RQrhuldWtKYeCsqWMsm3WuJZQBbQ1krsFE2YybwVvczIyJl7Wv\n        p8Ul/uObvPny5XzP8zvfOaT/SUIej1dg6uw0N9XXX6uVya7XSKWTgtzcg7FnW0f+E7FYnFktlQ4cEomE\n        GRkZLBGNNnrZ5cKg2YyDIhH6e3vhJva6tjacfqd9QXWs7KV/0XgSCEhJrC+WFe2/5bHZvjdkZ0bf2rkT\n        46Oj0La2wNTVhY3bt2EfGYTLpMf66sLXO3aw07ZwEonG4XBeYbPZ+/Zu324w8HOi53J4sCUno5aXDWeH\n        GuPdJzGmb4ajqQ4/ffMVEH0ExdEDnQTLiAmoRJ9KT0/PaWazjxxnsVBCo6Nr327c8TrwXehDuEcMWHEP\n        E9zPQOQvxHJKXzVHoVB2xwRkookF/ILCdpmsT5Kfj0IyGQs9amxeHMa9qxb8fecTRANT+OP6EEIDb0Ij\n        LYe+Mn+OTqfnxQRJfD7/eFZWVj+Py/2N+B6PDlAocCqrMNkuR3+jGD/MDuLueQPCtjbMaCthFmWgsabc\n        QaPRCkkpKSnPSCSSNxQKxcARieSCYn/RQ0NRMYzVZTivqcRMew2+dfXiz3U3Ir8swvfe61iyaWCxWK4k\n        JSVlklJTUxlyudw/MTUB6/vWeB2TDjTXV6G7nIshaQHuzZzC759PI/oggMhdD+6vXcHKkm+DTCbnxK7A\n        EFQKQsP+YRhnjej4qAMqhwqlpVy0FnJgrRYiPNaCHy/24cG1EaxbW9Etzkb+86mXGQzGoZiAIquVfTrt\n        nobNaYN1wgr7jB0q+WsYO8qFOD0ZfqMMYbsOq2dUMFbkYUgojOx57tlBJpNZEhM8YTabP765dhPLN5ax\n        vLSM8BdhOAeMWOyrx0lBGiy1L2PN0oyVcQ3OKA9DXpy7+TSbfeLxb0wwmUyXAoEAvF5vvMFgENNjvXh4\n        4xymmorh7amDz1kR+czeuTl79u0NXUOZh8VgNBBsclyg1+uv+v1+eDyeeGMSg8EQjd5fxa2zJ+DSVkB/\n        rCTIYrD0TDqzhXh1FXH/VwmWQhKJRFStVrsYCoXg8/kwPz8fFzTV1X15YWIkGL409Ovcuw0oztrjfJLJ\n        rKZSqbsIMIUoKzacKClNIBDYNRpNUK1WB5RK5YpOpwtyudzJxESKhL1tW6O8VPjBC7s4PcRU3mNoKyTS\n        P0mf2ayCvdhxAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"attributesOptimizerStripButton.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAMcSURBVDhPYyAAGKE0DHDz8/MLgGggZgaLQAGjvLw8B4hG\n        YEF+Tk5hKQYGcZBiBhVdXRlBcXFtdnZ2ZQEBAT2gkAgQM4HkGDSMjCSVNDVVxbjFxKVFNFWBQjxycipa\n        hiaOQcrKBlaaBuaqzkFhUzTMzSM4ODhkxeTknDk5OWWA6ljBBqirq/NKKympOjuHxLm6RmQraGrKa+oZ\n        mQsLS2ooKuq4RkaWLHJ2C5siLC7uJCQubqZrY5OmpKblJCgoyA82AAgYtY2MlBVUNc0lJOS0lDU0jJQ1\n        dCwVZbRNnSwDIyqyZ1xztgudYWblXuofkl7mG5O+U9fUKgGojw+iHegUMytXN5CNwEASNDKy9zHWdkhu\n        LJm98eim2/eu7Lvyp77+0p+G+Pm/8/P7v9vY+2wEesUWqI8Hop1BhtPdPT7PSM/eR1JS2cjRNqQ0K65j\n        79zeQ69ntGx93pq//Lu9nu9SZSntEjFeiRgudi4PYGAqADWyQPQDvWBk5GRkY+mdpqtlGRLtVzY/Lbzl\n        jLtt5Fx9PevWwvIp78UEpTI4GDjkgGqFgBjkdEgAAsEbIN4FxLuBeL+Nha9HdkLnMwsdz2ZLa69OTU2T\n        2PT8rodKcjp5QHlwlOIDjP7BWY3udjFHfANSVsjLawS6+8aUVbbMeakir50FlAclIvTEBXcB2BU8PEIP\n        ubjEPzMxMV309k6Y4u+ZOTE1s/6Ispxeia66TYi4uDzI75AEhASYNZVNtUM90zKK86acLC6YdK2gYOqd\n        lLjWG35+OXcVZbSK/TzTpgb4ZHZY2XpHKykpweMfBN6yc3BcVlJV+2pp7vDPUN/2f1fX5s/R0cVXjIwc\n        V/PxCKfzcfKZurhE5isr6zsYmTl4m1u72AD1QbzCLyampGtuleAZGFnl5OTfl15ef8/a1XsDDw9PMBcr\n        qzE05LmMLOx0tfTMnCzsPAKV1HVMgGJwb7wF4v2MjIynGJmYTjuEhPRpmpq2AeNZESjOBsQwhUya+qba\n        qlr6BkC2MEQIAkBOAWVNDjExMXF5HR1LYGp0AvJBIY4OQGpBhkJjgoEBAKDLuCi2Wg2FAAAAAElFTkSu\n        QmCC\n</value>\n  </data>\n  <data name=\"tsbLoadoutImport.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJQSURBVDhPlZBdSJNhFMe3bOTH2oo2ssV0ChuTWVtje8mt\n        5YVTZ4KmvJqRMizEcn14sSipsGDp5oJaBpVuptNU+pxWIpVDES8KBN1FiRQZ5EVddqNU9O9M39pFVOsH\n        Px7O857/eQ4vj2MNyf+DcfFfzf9EKpPphEKhlCsTuDP+B/y9/ciy5A6XeTwN7TMzU2Z3y0VeWlrGBoUi\n        XZKevoNri/L70JLK6ubbI2HklLJoH32G+eVv6H2/iDqvr8fV1bPY2Nz8pTbQ6ZYzjIXaYwNoZUlhRfVI\n        4G4IJ9ouL3XR+eb1HMLhCQT77mBy7h3qGxrhuNCCWQBs06ljXHQVjVZrPn3Jh7yiIjAMs2y327+OTUxi\n        9PkYIm8X8PTFNLZkKmHKLcDg2DjyWbaMi8bW2K43OJ3nXZiencWVQDfoiuQjv7gU9x+GEPnwCWe919Da\n        MQClRudeTXGsl0iUN4J9r2g7jE9HIMs2QK03g7HakCRNRZZxF1y+6+i4NwylWv9xbWLibi7K48lVqtKK\n        OsfnGocTgQePccbrQ+vNLrTd6oe5mEXxgdrv6m3Gl9T6RJCUFKbTvBL8SY51z2CVowmbVAYwJZWocRxH\n        39AjbFZkQJy6dcrjDyJVLh+g1r2kkzREc7+QKRT2TJ0FefsPoaB8H/0sFcRi8RJ98q9LTj6oZcydAoHA\n        TjVLWkkRGcPGVoVOuq9CZTQhRShcSBGJhui6nSwnk6M9fyVbbzxnstnm+fyEIJXRFQ+T9aSSjItE8ih5\n        hCwkd5IbybiJDtCQspUqbni8HyEN4JeJdSY/AAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"tsbClipboardImport.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALsSURBVDhPXZFbSFNxHMf1padeeu1ZKQi6GEER9BiES1DJ\n        OV1q0xJpkam74G3uYm3OzXk7c+4+d7bpOV7mpm5qFxfSyCVDy9RUKAh62XmSCnr4djyb0vrCl9/5n8Pn\n        c36Hk3OU7d1t10Yy/vtD1Mok7G3MqqGWoVuKmF5+AdPBy2c6i/IZRcklpqf6OkOIeYekoirJgcfZiHnp\n        hWAf/LQGE5PdCFBqeMhOOFytsDrkGLXLQVikGDJLoDc+xbLPcJBB09lwt1IRnwL0Uj8CIQMCYQPIGT28\n        0z1w01rY/BqMkhqMjClhGetCfHV6L4Omk+h7SIUdErRpG1FZx0dJRTHulBSiqKwIwrpyCB7c4+7fZc+9\n        wzLEo8ZsQVDGo8i+enTom1EnFkIgKkNJZTFKhcV4IhFB3CJCVb0AgtqytGBWkS0wCAooUycfHnZth18F\n        Z0ANu08FBztd4+z6XiXMzk5Y2U8wuxWYHWjIFmhKL1DGDj5ckzqYRmTQDzZD2/8MuoEm6IeauTPhbMew\n        ox0WTxdsiupsQY/gGjWoEsJJv+AAq7eLFUmh6hGjf1QOk0UGIyHBoK2V3UoDu6ImW9AnukkRz2vgnzPA\n        7lciENRx0zmuhm9GBxcLkVNa0HNG9s/o4Fbf38+g6RCPb1PW3nqE3gxjYSXdyAqBSMzMdSFGYJ59dlmW\n        h1M1uThff+ZXBk3HISulPEQjwm8JTIT1mFwwYmbJhOCyiZtHnYoaOfg0criZQdNxtfNpv02CVwk75mND\n        iLCipXcjeL1m5XpFns9B/wq4VuXGOIFbUUFTbjnin0kkdkisf/EhuR9AYtuL4EvTCfh/j+5zgpC+lo5O\n        KZH8RuMj263vk9j5MYPl9xYsxglcbTt38tZjkOvxBuuOJno1pMH6LonNPR+2DgLY/hrAp32SrZe99mFt\n        05Yl4MDjLOofOYPdop+kWpjysaXZUu3lKY+UlzI33EoN1dxIkZLC1MWGs3+O4CvSvMM0mZPzFxg0GcRa\n        HXNfAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"ttToolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>288, 17</value>\n  </metadata>\n  <metadata name=\"sfdSave.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>389, 17</value>\n  </metadata>\n  <metadata name=\"ilTabIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>482, 17</value>\n  </metadata>\n  <data name=\"ilTabIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        PQAAAk1TRnQBSQFMAgEBBgEAAWwBAgFsAQIBGAEAARgBAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFg\n        AwABMAMAAQEBAAEgBgABSBoAAx8BLQM2AVkDNgFZAzYBWQM2AVkDNgFZAzYBWQM2AVkDNgFZAzYBWQM2\n        AVkDNgFZAzYBWQM2AVkDNgFZAzYBWQM0AVQDBAEGIAADAgEDAw4BEwMBAQL/AAkAAyoBQANNAZYDUwGs\n        A1MBrANTAawDUwGsA1MBrANTAawDUwGsA1MBrANTAawDUwGsA1MBrANTAawDUwGsA1MBrANTAawDNAFU\n        AwQBBiAAAx8BLQNQAZoDQgF2AyABLwMEAQX/AAEAAkcBRgGAAVMBIgEAAf8BUAEgAQAB/wFNAR4BAAH/\n        AVcBKAEAAf8BSAEbAQAB/wFGARoBAAH/AUQBGQEAAf8BTAEhAQAB/wE/ARYBAAH/AUIBGQEAAf8BRgEe\n        AQAB/wFGAR8BAAH/AT4BFwEAAf8BQQEbAQAB/wE6ARUBAAH/AV0BMgEAAf8DOAFdAwUBBxwAAwQBBgNE\n        AXoCWwFJAfYCaAFgAfkDWQHXA1UBtwNFAX8DLgFIAw0BEfQAAkcBRgGAAVYBJAEAAf8BUwEiAQAB/wFQ\n        ASABAAH/AVkBKQEAAf8BSwEdAQAB/wFIARsBAAH/AUYBGgEAAf8BTgEiAQAB/wFBARgBAAH/AT8BFgEA\n        Af8BQwEaAQAB/wFIASABAAH/AUABGQEAAf8BQQEaAQAB/wFBARoBAAH/AV8BMgEAAf8DNAFVAxUBHQMB\n        AQIYAAMmATkDWAHGA1wB+ANNAfoBYQFeAVQB7gJfAVUB8wFQAU8BTQH6A18B+wNNAfoDWwHQA1ABnQM9\n        AWkDJwE6Ax0BKQMSARgDAgED2AACRwFGAYABWgEmAQAB/wFYASYBAAH/AYgBNgEAAf8BkgFAAQAB/wGH\n        ATYBAAH/AV8BMAEAAf8BTwEhAQAB/wFQASMBAAH/AUQBGQEAAf8BQQEYAQAB/wE/ARYBAAH/AUgBHgEA\n        Af8BPAEVAQAB/wE6ARQBAAH/ATkBEwEAAf8BgAEzAQAB/wM0AVQDBwEKAxcBIAMBAQIQAAMDAQQDTAGR\n        A1kB0gNNAfoCbQFiAfcCYAFZAesCYgFYAe8DXQHtA10B7QJiAVgB7wNfAfMDbQH3A18B+wNnAfIDXAHR\n        A1QBrwNHAYEDOAFdAykBPgMVAR0DGgElAwQBBcQAAkcBRgGAAYsBNQEAAf8BhwEyAQAB/wGDAS8BAAH/\n        AYQBMgEAAf8BWwEqAQAB/wFYASgBAAH/AVUBJgEAAf8BVwEpAQAB/wFQASMBAAH/AU4BIgEAAf8BSwEh\n        AQAB/wFOASQBAAH/AUgBHgEAAf8BRgEeAQAB/wFFAR0BAAH/AYYBOAEAAf8DNAFUAwQBBgMFAQcDGgEk\n        AwEBAgwAAyoBQANVAbEDWwHQAksBRQH+AmUBZAH0Al0BTgHwAmIBSAH2AmUBUgH0AmUBUgH0AWQBYAFC\n        AfUBZAFgAUgB9QFmAWIBWQH1AXEBbgFjAfcBfwF6AWoB+QF9AXoBagH5AXgBdwFnAfoCegFqAfkDZAHs\n        A2AB3gNeAc4DXAHJAyABLsQAAkcBRgGAAYEBKgEAAf8BXgEoAQAB/wGJATUBAAH/AZUBQQEAAf8BoQFJ\n        AQAB/wGPATsBAAH/AYUBMgEAAf8BhQEzAQAB/wFeAS4BAAH/AVkBKgEAAf8BVgEoAQAB/wFcAS8BAAH/\n        AVIBJgEAAf8BTgEiAQAB/wFLASEBAAH/AYMBNQEAAf8DTgGXAz4BawM+AWsDPwFtAyUBNwsAAQEDJQE3\n        A1ABngNWAcECQgE6Af8CZAFbAfECZAFTAfEBeAF3AWQB+gKGAXMB+wF4AXcBawH6AYEBgAFqAfkBewF6\n        AVYB+gGFAYABWAH8AasBqQFIAf0BqwGpAUcB/QGFAX8BQQH8AXsBegFNAfoBgAF9AWUB+QF3AXYBXAH4\n        AXoBeQFQAfoBegF5AWoB+gNbAcQDGAEixAACRwFGAYABhQEsAQAB/wGBASoBAAH/AYYBMAEAAf8BkQE7\n        AQAB/wGUAT4BAAH/AVkBJwEAAf8BUQEhAQAB/wFTASMBAAH/AVABIgEAAf8BSQEcAQAB/wGDATUBAAH/\n        AVABJAEAAf8BRwEdAQAB/wFAARcBAAH/AUABFwEAAf8BWgEuAQAB/wNPAZsDPwFvAz8BbQM/AW4DJQE3\n        CAADDQESAz8BbgNEAXwDWQHDAlQBSQH/A10B7QJnAVkB8gF4AXcBaAH6AogBgAH7AYMBggFzAfwBqwGq\n        AagB/QGkAaMBfwH+AaUBpAF/Af4BowGiAX8B/gGqAakBkgH9AXsBegFNAfoBewF6AU0B+gGLAYkBXwH7\n        AYMBfwFRAfwBhAGDAWoB+QNiAfYDUgGhAwwBEMQAAkcBRgGAAYkBLgEAAf8BhgEtAQAB/wGNATUBAAH/\n        AZcBQAEAAf8BmwFCAQAB/wFdASsBAAH/AVUBJAEAAf8BWAEnAQAB/wFVASUBAAH/AVUBJwEAAf8BTAEf\n        AQAB/wFMAR8BAAH/AUgBHQEAAf8BQQEYAQAB/wE/ARYBAAH/AVYBKQEAAf8DUAGdA0ABcQM/AW4DPwFu\n        AyUBNwQAAwMBBAMpAT4DPwFtAzwBZwNZAc8CYAFUAf8CZAFcAecCZQFSAfQCiwGCAfsCrQGoAf0BpwGm\n        AYkB/gGnAaYBhAH+Aq0BqAH9AaQBogF/Af4BowGiAX8B/gGLAYgBbAH8AYsBhQFoAfwBrQGsAZ0B/QGq\n        AakBlwH9AXoBeQFjAfgDZQH0A2IB7wM/AWwDAAEBxAACRwFGAYABnQE+AQAB/wGXATsBAAH/AZIBOAEA\n        Af8BkwE6AQAB/wGcAUEBAAH/AYABKwEAAf8BgQEuAQAB/wGEATIBAAH/AYUBNAEAAf8BgQExAQAB/wFV\n        AScBAAH/AVEBIwEAAf8BUAEjAQAB/wFKAR4BAAH/AUcBHQEAAf8BWwEtAQAB/wNQAZ0DQAFxAz8BbgM/\n        AW4DJQE3BAADCwEPAy8BSQMsAUQDNwFaA1gB4wFmAWUBVgH8Al8BVwHoAXkBdwFcAfgBrAGrAagB/QGy\n        AbEBlgH+AbQBswGYAf4CqQGHAf4BrQGsAagB/QGoAacBfwH+AaQBowF/Af4BjQGLAV8B+wF8AXsBTQH6\n        AYMBggFqAfkDYgH2A2UB9ANhAe4DXgHdAycBO8gAAkcBRgGAAZIBMwEAAf8BjwEzAQAB/wGZAT8BAAH/\n        AZwBQgEAAf8BoQFFAQAB/wGJATMBAAH/AYUBMQEAAf8BgwEvAQAB/wGAAS4BAAH/AYEBMAEAAf8BUgEi\n        AQAB/wFVAScBAAH/AU8BIQEAAf8BSgEeAQAB/wFIAR0BAAH/AV4BMAEAAf8DUAGdA0ABcQM/AW4DPwFu\n        AyUBNwcAAQEDBAEGAwQBBQMpAT4CXAFJAfYBZwFlAVwB+AJkAV0B7AF+AX0BXgH6Aa4BrQGoAf0BrwGu\n        AagB/QGuAa0BqAH9Aa0BrAGoAf0BrQGsAagB/QGtAawBngH9Aa0BrAGoAf0BegF4AVwB+AF8AXsBYgH6\n        A2IB9gNlAfQDZwHyA2EB7gNbAcsDEgEYyAACRwFGAYABlgE2AQAB/wGTATQBAAH/AacBTAEAAf8BowFH\n        AQAB/wGpAUwBAAH/AYsBNAEAAf8BiwE2AQAB/wGLATYBAAH/AYYBMwEAAf8BXwEuAQAB/wFdASwBAAH/\n        AVoBKwEAAf8BWgErAQAB/wFaASwBAAH/AVYBKQEAAf8BiQE5AQAB/wNQAZ0DQAFxAz8BbgM/AW4DJQE3\n        EAADLwFKAVIBUQFJAf8DbQH3A2UB9AGQAY4BXwH7Aq8BqAH9ApQBdgH8AZQBkgF1AfwBkgGPAXQB/AGP\n        AY4BhQH7AY8BjgGFAfsBjwGOAYYB+wNlAfQBegF5AW0B+AGEAYMBdAH5AXkBeAFtAfgDZAHxA2cB8gNW\n        AbMDAAEByAACRwFGAYABmwE4AQAB/wGWATYBAAH/AZQBNQEAAf8BpAFHAQAB/wGlAUgBAAH/AY0BNQEA\n        Af8BjgE3AQAB/wGUAT0BAAH/AZEBPAEAAf8BiAE2AQAB/wFeAS0BAAH/AVwBKwEAAf8BXAEsAQAB/wFM\n        AR4BAAH/AVABIgEAAf8BgQEwAQAB/wNQAZ0DQAFxAz8BbgM/AW4DJQE3EAADIQEwA2AB3gF2AXUBXAH4\n        AX4BfQFQAfoBlwGUAXAB/AG2AbUBlgH+ArMBlQH+ArUBmQH+ArIBlgH+Aq8BqAH9AZEBjwF4AfwCfQFy\n        AfoDXQHwA2QB8QNhAe4DYgHvA10B7QNqAfkDPgFrzAACRwFGAYABsQFLAQAB/wGrAUcBAAH/AaYBRAEA\n        Af8BqAFHAQAB/wGqAUsBAAH/AZcBPAEAAf8BjQEzAQAB/wGNATUBAAH/AYkBMwEAAf8BggEtAQAB/wGL\n        ATgBAAH/AYIBMAEAAf8BXAEqAQAB/wFXASgBAAH/AVUBJgEAAf8BhgE0AQAB/wNQAZ0DQAFxAz8BbgM/\n        AW4DJQE3EAADGwEmA1sBywF4AXcBXwH4AY8BjgFfAfsBlQGUAXAB/AGwAa8BqAH9Aa4BrAGKAf4CrgGO\n        Af4CsAGoAf0CrgGoAf0CrgGoAf0BfQF6AW0B9wFpAWgBWQH1AX0BegFtAfcDYgH2A2UB9ANhAe4BZwFl\n        AVwB+AMjATPMAAJHAUYBgAGjAT0BAAH/AZ8BOwEAAf8BmwE4AQAB/wGmAUQBAAH/Aa4BTwEAAf8BqQFN\n        AQAB/wGVAToBAAH/AZIBOAEAAf8BiQExAQAB/wGCASwBAAH/AYYBMQEAAf8BjwE8AQAB/wGCATABAAH/\n        AVsBKwEAAf8BVAElAQAB/wGLATgBAAH/A1ABnQNAAXEDPwFuAz8BbgMlATcQAAMkATUCYgFhAekCegFt\n        AfcBjwGNAV8B+wGvAa4BqAH9ArIBqAH9ArABlAH+ArEBqAH9ArEBqQH9Aq8BqAH9ApEBewH8A2cB8gNk\n        AfEDZAHxA2cB8gNlAfQDZwHyA2AB1gMCAQPMAAJHAUYBgAGnAUABAAH/AaQBPQEAAf8BnwE7AQAB/wGq\n        AUcBAAH/AacBRwEAAf8BkgEzAQAB/wGVATkBAAH/AZgBPQEAAf8BkQE4AQAB/wGMATUBAAH/AYUBMAEA\n        Af8BnQFIAQAB/wGHATQBAAH/AVsBKgEAAf8BVgEmAQAB/wGNATgBAAH/A1ABmgNAAXEDPwFuAz8BbgMl\n        ATcQAAMsAUQBgQGAAUcB/QFpAWgBWQH1AX4BfAFPAfoBkQGOAXQB/AGuAa0BqAH9Aa0BrAGoAf0CkgF7\n        AfwBjwGOAYcB+wGRAY8BfAH8Ao0BhgH7A10B8ANnAfIDZAHxA2cB8gNlAfQBiAGGAV8B+wNOAZjQAANH\n        AYABqwFCAQAB/wGnAUABAAH/AaMBPQEAAf8BsQFLAQAB/wGpAUoBAAH/AZYBNgEAAf8BlQE3AQAB/wGg\n        AUMBAAH/AZQBOgEAAf8BjAEzAQAB/wGIATEBAAH/AYcBMAEAAf8BXwEqAQAB/wFYASYBAAH/AVQBIwEA\n        Af8BkAE7AQAB/wNAAXEDPwFuAz8BbgM/AW4DJQE3EAADOwFkAXYBcAFfAfsDZQH0AXoBeAFcAfgBiAGF\n        AXEB/AGFAYIBcQH8AosBgwH7AYsBigGDAfsCiwGEAfsBiwGKAYUB+wGDAYIBdAH5A2QB8QF6AXcBbQH3\n        AXgBdwFuAfgBjQGLAYEB+wF7AXoBZwH4AYUBhAFfAfsDOgFh0AADRwGAAdcBpwEAAf8B1QGjAQAB/wHT\n        AZ8BAAH/AdoBogEAAf8BzgGUAQAB/wG5AVsBAAH/AbUBVgEAAf8BtgFWAQAB/wG0AVQBAAH/AasBSwEA\n        Af8BrAFNAQAB/wGtAU4BAAH/AaoBTgEAAf8BoQFHAQAB/wGjAUoBAAH/AaoBUAEAAf8DPwFuAz8BbgM/\n        AW4DPwFuAyUBNxAAA0wBkgF1AXQBZQH4A2UB9AF9AXoBbQH3ArABqAH9ArEBqwH9AZQBlQGAAfwCsAGr\n        Af0CmAGLAfwClAGDAfwBegF5AXQB+ANkAfEDZQH0AYUBhAFqAfkBgAF9AWoB+gNiAfYDXQHtAycBO9QA\n        AwQBBQMAAQEIAAM3AVoDPAFmAz4BawM/AW0BQAI/AW4BQAI/AW4BQAI/AW4BQAI/AW4BQAI/AW4DPwFu\n        Az8BbgM/AW4DPwFuAz8BbgM/AW4DPwFuAyUBNxAAA1QBrAFpAWgBYAH1AWYBZAFfAfMBdwF0AW0B9wF6\n        AXkBbAH6AYABfQFqAfkBfwF9AWsB+QF5AXcBbQH6AYABfwFuAfkBegF5AW8B+gNiAfYBfwF6AW0B9wGO\n        AY0BgwH7AY0BjAGDAfsBegF5AWsB+AGDAYIBagH5A1sBxAMZASPXAAEBAwoBDgMBAQIEAAI6ATkBYAM9\n        AWkBPwI+AWwBQAI/AW4BQAI/AW4BQAI/AW4DPwFuAz8BbgM/AW4DPwFuAz8BbgFAAj8BbgFAAj8BbgM/\n        AW4DPwFuAz8BbgMlATcQAANeAdkDZAHxAmcBWQHyA2IB9gF3AXEBbQH3AXQBcQFtAfcBdwFxAW0B9wF3\n        AXUBaQH4AXcBdgFrAfgBgwGBAW4B+QGFAYQBawH5AYUBhAFqAfkBhAGDAWoB+QF9AXsBbAH6AX0BfAFr\n        AfoBqQGoAZEB/QNRAaIDDQER2AADAQECAxMBGgMDAQQDPAFmAz4BawFAAj8BbgFAAj8BbgFAAj8BbgFA\n        Aj8BbgM/AW4DPwFuAUACPwFuAz8BbgM/AW4DPwFuAz8BbgM/AW4DPwFuAz8BbgMlATcQAAFnAWUBXAH4\n        A2QB7AJiAWEB7wNnAfIDZwHyA2cB8gFkAWIBXwHzAWYBYgFfAfMDYgH2AYABfgFsAfoBgAF+AWsB+gGF\n        AYQBagH5AX4BfQFpAfoBkQGJAWoB/AGtAasBkQH9AY4BjQGAAfsDRgF+AwEBAtwAAwIBAwMZASMCPgE9\n        AWoDPwFtAUACPwFuAUACPwFuAUACPwFuAUACPwFuAUACPwFuAz8BbgFAAj8BbgM/AW4DPwFuAz8BbgM/\n        AW4DPwFuAz8BbgM/AW4DJQE3DAADDQERA1wB3wNYAbwDVQGwA1QBrwNWAasDUwGoA1IBoQNQAZsDUAGa\n        A0wBkwNMAZMDSgGNA0oBigNJAYgDSQGIA1ABmgMoAT3kAAMDAQQDJAE2AyUBNwMlATcDJQE3AyUBNwMl\n        ATcDJQE3AyUBNwMlATcDJQE3AyUBNwMlATcDJQE3AyUBNwMlATcDJQE3AxQBHBAAAysBQgMIAQv/AP8A\n        ngADAgEDAwUBBwMGAQgDBQEHAwUBBwMLAQ8DEgEYAxQBGwMPARQDDAEQAxcBIAMjATMDJwE7AyMBMwMT\n        ARoDAwEEGwAEAQECAwcBCQMQARUDGQEjAyABLgMgAS8DHQEpAxgBIgMSARgDDwEUAwoBDQMHAQkDBAEG\n        AwEBAgMBAQIbAAQBAQIDAAEBAwQBBgMBAQILAAEBAwQBBQMEAQUDAQECYwABAQMAAQE4AAMFAQcDFgEe\n        AyIBMgMoATwDJQE3AyYBOAE2AjUBWANAAXEDQwF3ATYCNQFYAzEBTgFPAk4BlwNZAccDWgHKAVECTwGl\n        ATECMAFNAxQBHAMCAQMXAAEBAwIBAwMLAQ8DGgEkAycBOwMxAU4DMgFRAy8BSQMoAT0DIQEwAxwBKAMX\n        ASADEwEaAw0BEgMKAQ0DBQEHAwIBAwMAAQETAAQBAQIDEQEXAysBQgMnATsDGgEkAwwBEAMBAQIDAAEB\n        AwMEBAEFAwIBAwMAAQFQAAMBAQIDCgENASwCKwFDAToCOQFgAx8BLQMJAQwDAQECAwABASgAAwoBDQNF\n        AX0BWwJYAcsDWwHWAVcCVQG6A1UBtQEZATEBjgH/AQABBQEjAf8CAAEGAf8DWQHMAVsCWQHDAbIBwQHO\n        Af8BAAEbAYEB/wMAAf8BIwE7AVAB/gNIAYQDKwFCAwoBDhcAAQEDBQEHAxEBFwMjATQDOAFdA0gBhQNL\n        AZADSAGHA0MBeAM7AWQDMgFRAyoBQAMjATMDHAEoAxYBHgMPARQDCAELAwQBBgMBAQIDAAEBAwABAQwA\n        Aw4BEwM8AWYDQgF0Az8BbQM4AVwDJwE6Aw4BEwMAAQEEAAMCBAMBBAMBAQJEAAMBAQIDCQEMAxwBKAFX\n        AlYBuANNAfoDTQH6A1kB9QFaAlcBxQM/AW0DIwE0AxMBGgMGAQgDAAEBGAADBAEFA1ABngGkAbQBxAH/\n        AQsBJgGKAf8DAAH/A0AB/QGOAZMBoAH9Ac4B2AHhAf8BAAEHASQB/wIAAQUB/wIAARYB/wEmAYEBkAH/\n        Ac0B1gHeAf8BAAEUAS4B/wIAARQB/wFCAV8BfwH+A1sB0AM7AWUDGAEhAwABARMAAQEDBwEKAxYBHwMt\n        AUYDRwGDA1kBxwNaAdsDWQHXA1kB0gNZAcQDUwGtA00BlQNFAX4DPQFqAzQBVQMoAT0DGQEjAwkBDAsA\n        AQEDAAEBBAADGgEkA08BmwNSAaYDSwGPAz8BbgM/AW4DQAFxAzcBWwMpAT4DHAEnAwcBCgMAAQEDAwEE\n        CAADAQECAwEBAgMBAQIkAAMBAQIDBwEJAxMBGgM4AV4DUQGiAVIBYgFmAfcDKwH8ASUBWQFbAfsBJgFu\n        AXoB/gJAAYYB/QMrAfwBWwF6AX0B/gFbAlgB6QFYAlYBuwFHAkYBgAM4AVwDJgE4AxoBJAMSARgDCAEL\n        CAADEwEaAWgBegF/Af4B2AHfAeYB/wERASwBjQH/AgABHgH/AQABAQEgAf8BpwGyAb0B/wGtAboBxwH/\n        AgABGAH/AQABAgEpAf8BAAEVAYEB/wEeAS8BiAH/AbQBwgHOAf8CAAEQAf8CAAESAf8BDQGEAa0B/wFa\n        Al8B+wFMAksBkAMkATUDAgEDEAADAQECAwkBDAMcASgDMwFTA1QBrwE5AUQBXgH/AU8BiQGrAf8BWAGY\n        AbwB/wFJAV8BngH/ATgBSQGAAf8BLwE+AVUB/wNAAf0CTgFcAfADVwHfA1gBywNWAbMDTAGTA0IBdAMw\n        AUsDFgEeAwIBAwgAAzUBVgHEAbwBqgH/AmoBZwH5A10B7QNaAdMDTgGYAz8BbwNAAXADQAFxAz0BagMx\n        AU8DEwEaBAADBAEGAxABFQMGAQgDAgEDAwQBBQMCAQMDAQECAwEBAgMAAQEPAAEBAwoBDQMaASUDOAFd\n        AVcCVQG3AVcCVAHuAysB/AM+AfgBJQEmASkB+wM+AfgDPgH4A0AB/QMrAfwBNAE9ATwB/gEnAUkBTwH7\n        A0AB/QNIAfYBXAJXAd8BWAJWAbwDTgGUAT0CPAFnAyQBNggAAzUBVwEEARsBMgH/AboBxgHTAf8CAAEU\n        Af8DAAH/AgABEwH/AaMBsQG9Af8BpgG7AcoB/wIAAQwB/wIAAS4B/wEAAScBlQH/AZEBmwGkAf8BuwHJ\n        AdYB/wIAARIB/wIAAS0B/wGDAbkB6wH/AY4BrgHIAf8BWwJZAcMDLwFJAwgBCw8AAQEDAgEDAwwBEAMh\n        ATADPAFmA1wBzwGcAbEByAH/AT8BXQGeAf8BgAGdAboB/wGHAaEBvgH/AVgBjwGqAf8BUAGEAaAB/wFH\n        AVsBlQH/AUYBWwGWAf8BQgFZAZYB/wFFAVwBmwH/AUIBWwGaAf8BOwFUAZMB/wEyAUgBiAH/AlgBXgHd\n        AzgBXgMFAQcIAAMmATgDcQH3AsQBtQH/AaQBnAGOAf8BQwE7ATAB/wNCAfUDWgHTA1ABmgNDAXgDPwFv\n        A0ABcAM5AV8DFgEfAxIBGQM4AV0DKAE8AwcBCQMDBAQBBQMEAQUDAQECEAADCAELAygBPANUAa8DWQH1\n        AQABEwEaAf8BIwEmASwB+wNAAf0BEgERARUB/gNSAfQBWgJYAd0DXwH7A38B/gN/Af4DAAH/AwAB/wMA\n        Af8DKwH8A0AB/QExAUEBRAH+A0AB/QFeAlwBzgMeASsIAAFJAkgBiAGNAZwBqwH/AcwB1gHeAf8BAAED\n        ASQB/wIAASEB/wEAARsBgQH/AdkB3AHfAf8BgwGbAbMB/wIAAQsB/wEAATIBsAH/AQIBJgGOAf8BwAHE\n        AcgB/wGcAa4BvwH/AgABBgH/AgABLQH/AZUBzQHxAf8BnwG+Ad8B/wFhAlgB5gNAAXEDFgEfAwEBAgsA\n        AQEDBAEFAw0BEQMkATUDRwGDA2QB5wFaAZsBvAH/AQABIQFPAf8BHwE+AYgB/wELASIBQAH/AgABEQH/\n        AQABCAEeAf8BEgEgATkB/wEhATMBTQH/ATIBRwGDAf8BRgFeAZoB/wFIAYMBnwH/AUEBXAGbAf8BMgFL\n        AY0B/wFRAVIBbQH3Ay4BRwwAAxcBIANdAdIBOAE0ATIB/wFIAUEBMgH7AV4BWAFFAfwBXAFQAUQB/gEZ\n        ARQBEAH+AysB/ANUAe4DVAGvA0IBdQM/AW0DOwFjAy8BSQM7AWUDPwFtAxoBJQMCBAMBBAMDAQQDAQEC\n        DAADDwEUAT8CPgFsAV8CXAHUATkBXQFmAf4DKwH8ASMCIQH7ARkBGAEXAf4DQQH5A1gB7wFcAlUB6gNZ\n        AfUBZAJSAfQBXwJaAeQBYgJIAfYDfwH+AU8BXgFkAf4DQAH9ASkBKwEvAfoDKwH8A1EB9wNcAdQDPwFt\n        AwcBCggAAVMCUgGoAdsB5QHrAf8BvwHLAdUB/wIAARQB/wIAAScB/wEPASkBigH/AekB6wHtAf8BFwEy\n        AZYB/wIAAQQB/wEAASQBnQH/AQABGgEvAf8B5QHoAeoB/wGIAZ4BsQH/AwAB/wEAAQUBMgH/AacB4gH0\n        Af8BugHgAfwB/wNcAfgBVQJTAa0DJAE1AwQBBgsAAQEDBAEFAxABFQMoAT0DUAGjAXABfwGEAfsBBgEy\n        AYQB/wEZAUcBlAH/AUIBiQGxAf8BAAEKAR0B/wIAAQEB/wEAAQEBEgH/AgABCQH/AgABAwH/AgABAQH/\n        AwAB/wMAAf8CAAEHAf8CAAEMAf8BLAFKAYMB/wJVAVcBugMPARQMAANCAXQBKgEpASMB/wEhARYBDgH+\n        A0AB/QFlAWMBXAH8AUwBPwE0Af4DQAH9AVkBUgFHAf4BIAEZAQ8B/wNbAcgDQgF2A00BlQNeAdoDSgGM\n        AzkBXwMNARIDAwEEAwMBBAMAAQEQAAMgAS8BXQJaAcoBSwFkAWcB/gEtAUEBQwH+ASUCIQH7A1kB7AFk\n        AlkB7ANZAfUBZwJZAfIBaQJRAfcBQQI+AfgBhwGRAZAB/wJfAWIB/gNCAfUDfwH+AYEBhAGGAf8BagF2\n        AXkB/gIAAQkB/wMrAfwDUwHxA0QBeQMsAUQDBwEKBAADDAEQAVcCVQG6A/4B/wGjAbcBygH/AgABDAH/\n        AgABGgH/AYABjwGgAf8B9wH7Af4B/wEAAR8BhAH/AgABBgH/AQABKgGjAf8BCQEhAS0B/wH1AfgB+gH/\n        AScBigGiAf8DAAH/AQABIwGaAf8B1AH3Av8BuQHoAf4B/wOoAf0BYQFWAV4B7gM4AV4DCgEOAwABAQcA\n        AQEDBAEGAxQBGwMxAU4DWQHCAdIB7QH5Af8BSQGQAbQB/wFRAZ4BxwH/ATgBgAGkAf8CAAEDAf8DAAH/\n        AgABAgH/AgABAQH/AgABCgH/AQABAgEVAf8CAAELAf8CAAEQAf8CAAEMAf8DAAH/AQYBEwEsAf8DVgG5\n        Aw0BEgwAAzABTANfAfsBPQE6ATYB/wFDATwBMQH8AZsBmQGTAf0DKwH8AVIBTQEyAfsBVwFVAUMB/AMr\n        AfwBJwEgARcB/wNaAc0DUgGpASgBIgEZAf8DVwHoA0QBegMqAUADKgFAAyoBQAMhATEDCAELEAADBwEJ\n        A0IBdgFYAlYBwQFbAlkBwwNNAfoBYAJZAesDVQHqAWUBYQFiAf4BuAG9AcEB/wEAAQMBBAH/AQkBDwES\n        Af8DAAH/A1kB8gMrAfwBnQGeAaAB/wERARkBIAH/AwAB/wMAAf8DQAH9A04BmAM4AVwDEwEaBAADHAEo\n        AV0CWQHSAv4C/wGKAaEBtgH/AgABEgH/AgABHwH/AZYBpAGxAf8B6gHzAfgB/wEAAR8BiQH/AgABKQH/\n        AQABgQGxAf8BKwGBAY8B/wHsAfIB9wH/ASIBiwGmAf8CAAEeAf8BEAGUAcMB/wHqAfsC/wHPAe0B9gH/\n        AYEBpgHMAf8DagH5AVoCWAHAAw8BFAMCAQMHAAEBAwUBBwMWAR8DPQFqA18B4AGCAbAB1AH/AT0BmgHI\n        Af8BjAHHAe8B/wEdAT0BXAH/AwAB/wMAAf8DAAH/AwAB/wIAAQcB/wIAAQsB/wIAAQkB/wIAAQ4B/wIA\n        AQoB/wMAAf8DSAH2AygBPQMAAQEMAAMzAVMBRwFCAT0B/wGFAYEBVQH/AUcBQwE2AfwBNAEvASsB/ANf\n        AfsDXwH7A6gB/QF3AnkB/AJdAVsB/gMrAfwDWgHkAS0BJwEVAf8DXgHaA0QBeQM/AW4DQgF1A0MBdwNC\n        AXUDMQFOAwwBEAwAAwwBEAM+AWsBXgJaAdgBXQJOAfABZAJZAewBWwFDAUcB+QMAAf8BFAEYARoB/wcA\n        Af8BDgESARUB/wMAAf8DQAH9A2oB+QErATABgQH/AYEBhgGQAf8BKgGAAYYB/wFhAWQBbAH+AU8BSAFJ\n        AfsDVQHqAUACPwFvAxIBGQQAAygBPQFkAlwB5wT/ATABlwGyAf8BAAEPAYQB/wEAAQsBgQH/Aa0BugHH\n        Af8ByAHYAegB/wIAARgB/wIAARsB/wEAASYBmAH/AZgBqgG9Af8B4wHtAfUB/wETAYEBmgH/AgABAQH/\n        AQgBiwGxAf8B0AHwAfoB/wHVAfYC/wGsAdAB6gH/AbYB0AHqAf8BYQJUAe4DEgEYAwQBBQcAAQEDBwEK\n        AxkBIwNIAYcBqgGtAa4B/QGYAbgB1wH/AVoBtwHVAf8BlQHbAfIB/wEFARsBMwH/AwAB/wIAAQQB/wIA\n        AQcB/wIAAQkB/wIAAQsB/wIAAQ4B/wIAARIB/wIAARIB/wIAAQ8B/wIAARAB/wNMAZIDBgEIEAADGgEl\n        A1oBxQGDAYEBVQH/ASUBJwElAf8DQAH9AmEBXgH8A38B/gN/Af4DqAH9A6gB/QFaAVABSgH+ASgBIQEP\n        Af8BQwE/ASYB/wNaAdsDVQG0A1YBtgNTAawDSgGKA0EBcgNCAXUDMQFOAwcBCQcAAQEBQAI/AW8DXwH7\n        AUcCQQH5ATIBLAEwAfsBjAGQAZQB/wcAAf8BIQEjASYB/wMAAf8DAAH/AwAB/wFfAVgBWQH7AwAB/wGq\n        Aa0BrgH/ARQBGAEgAf8BFwEdASgB/wERARkBIwH/AREBGAEhAf8DQAH9A1gB7wNIAYQDAQECBAADNAFU\n        A38B/gH3A/8BCwErAZQB/wMAAf8CAAEPAf8B0gHgAe0B/wHTAegB9gH/AQ4BMAGZAf8BAAETAYcB/wIA\n        AR8B/wHAAeAB8QH/AdgB5QHyAf8BAAETAYEB/wIAAQMB/wGBAbIB2AH/ATEBpwHPAf8BAAGCAcMB/wHZ\n        AfkC/wHQAe8C/wErASwBNAH8AxABFgMFAQcHAAEBAwgBCwMgAS8DUgGnAd4B+AL/AUgBpQHQAf8BmQHd\n        Ae4B/wFYAa8BwgH/AQABBAEfAf8CAAEJAf8CAAETAf8CAAEXAf8CAAEcAf8CAAEgAf8BAAEDASQB/wEA\n        AQUBJwH/AQABBQEoAf8BAAECASUB/wNYAekDJAE1GAADDQESA04BlgFxAXQBcgH+A38B/gOoAf0CcQFv\n        AfwBVwFTAUMB/ANAAf0DXwH7AWMBYgFeAfwDIQH7A0AB/QFfAU8BOAH8AVwBVAFJAfsBSQFGATIB+wNf\n        AfsCZAFgAfEDUwGwA0IBdgMwAUwDBAEGBAADFgEfAVwCWQHJAcQBwwHGAf8BgAKBAf8CAAECAf8DAAH/\n        AwAB/wMAAf8BBAIHAf8BGgEbAR0B/wMAAf8CFwEbAf8DAAH/AwAB/wHHAcgByQH/AQsBDwEWAf8BBgEK\n        ARYB/wMAAf8DAAH/AysB/AFHAkEB+QFMAksBkAgAA0IBdgG0AcQBzwX/ARABgQGkAf8CAAEaAf8CAAEg\n        Af8B3QHtAfMB/wG1AdEB6wH/AgABDQH/AgABBgH/AQABHwGLAf8B+AL+Af8B2AHmAfMB/wEAAR4BjAH/\n        AwAB/wElAZ0BwQH/Ab4B5AH3Af8BFAGWAcIB/wGBAawB0gH/AdcB8gH4Af8BKwEtATYB/AMPARQDBgEI\n        BAADAQECAwgBCwMuAUcDXgHQAa0B2AHzAf8BSwGvAdcB/wG1AfwC/wErAU4BhQH/AgABFAH/AgABGgH/\n        AQABAwElAf8BAAEJAS0B/wEAAQ8BNAH/AQIBEwE6Af8BBQEYAUAB/wEIARwBRAH/AQkBHAFDAf8BCAEZ\n        AT8B/wNIAYUDAgEDHAADEgEYA1sBxAHBAcMBwAH/Aa8BsAGvAf0DswH9AWwBawFpAfwDQAH9AysB/AJA\n        AT0B/QMrAfwDIQH7AkABPgH9AVYBUgFNAf4DfwH+AbQCtQH+AaUBpAGfAf8BNwE6ATMB/wNQAZ0DEgEZ\n        CAADFgEfA1sByAEZASEBHwH/AwAB/wMAAf8DAAH/AQwCDQH/AQ4BEgERAf8BJQEpASsB/wFUAVMBVgH+\n        ARYBGwEfAf8BFAEVARYB/wMAAf8DAAH/AqwBsQH/AQABBgERAf8BAAEGARMB/wEAAQEBCgH/AysB/ANM\n        AfMDQgH1A1ABngMDAQQEAANQAZoB2AHhAekB/wH2A/8BAAEmAZgB/wMAAf8BhwGeAbMF/wGmAcIB2wH/\n        AgABFgH/AgABHwH/AYEBlwGvBf8BzgHbAecB/wEAAQcBKAH/AgABDgH/AZ0B0QHwAf8BDQGBAbEB/wHV\n        Af0B/gH/ASgBoQHEAf8BgwGrAc0B/wGgAboB0wH/Aw4BEwMHAQkEAAMBAQIDCAELAzkBXwF0AXoBfQH3\n        AYABvgHmAf8BjQHNAegB/wGsAecB8QH/AREBLAFLAf8CAAEeAf8BAAEQATIB/wEIARwBQgH/AQ8BJAFO\n        Af8BFQEvAVgB/wEfATkBgwH/ASkBQwGMAf8BNQFOAZQB/wFHAVwBogH/AloBXwHbAyABLxAAAwEEAgED\n        AwQBBQMAAQEDAgEDAy8BSQNeAdUBogKkAf4BsQKyAf0CqwGqAf0BZwFlAWEB/AMrAfwBKwEnASMB/AE+\n        ATIBLAH9AysB/AGQAZMBkgH9A7IB/QOzAf0DqAH9A6gB/QL7AfkB/wNQAZsDBgEIAwIBAwQAAwwBEANW\n        AbYBEwEXARkB/wMAAf8BFgIbAf8BPwE7AT8B/gEBAQIBBwH/AQcBCwEOAf8ClQGWAf8DAAH/AQkBDQER\n        Af8DAAH/AwAB/wMAAf8CjwGXAf8DKwH8AysB/AEPASUBmgH/AVYBZgF/Af4DUQH3A1MB8QFSAlABowME\n        AQUEAAFeAlsB2QH2AfgB+QH/Ae0B/QL/AQABDAEwAf8CAAEMAf8BuQHHAdYF/wGhAbsB0QH/AgABBQH/\n        AgABJAH/AaUBtgHGBf8BoQG+AdkB/wIAAScB/wIAASMB/wGsAckB4AH/AYUBswHgAf8BAAEXAaIB/wGv\n        Ad4B9gH/ATEBowHKAf8BrAHKAeQB/wMLAQ8DCAELBAADAgEDAwwBEANFAXwBsgHWAfAB/wFRAboB3wH/\n        AbkB8QH6Af8BiwG5AcoB/wEXATEBUwH/ARoBKQFKAf8BKAE6AV4B/wE4AU8BlAH/AUYBXwGlAf8BVgGR\n        AbUB/wGDAZ8BwgH/AYkBpgHHAf8BjQGpAckB/wFGAY4BqAH9A0QBfBQAAwEBAgMDBAQBBgMDAQQEAAMa\n        ASUDUgGnAZsBlwGOAf8BkAGRAY0B/QOoAf0BawFpAWUB/AEuASYBIQH7AysB/AE7Aj0B/AF/AYABfwH8\n        AbcBtQGwAf4DqAH9AYsBigGGAf4BoQGeAZMB/QH0AfMB8QH/A1wB3wMlATcEAAMGAQgIAAE+Aj0BagGG\n        AYgBigH/AZYBlwGZAf8BDAEQAREB/wEvATABgAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ASIBJQEm\n        Af8BAQIEAf8CgQGJAf8CAAEOAf8BBAENASoB/wEHASUBqwH/AQkBJAGlAf8BHwGBAawB/wN/Af4DVQG1\n        Aw4BEwQAAS4BjwGmAf8B9QH7Af0B/wG+Ad4B9wH/AQABCgGBAf8CAAEdAf8BugHMAdwB/wHdAe4B+wH/\n        AYEBpwHKAf8BAAEaAYkB/wEAAQsBgQH/ASUBiwGoAf8B3AHoAfQB/wG+Ad8B9AH/AYwBqAHDAf8BGwGE\n        AaIB/wEqAZkBuwH/AfAB9AH5Af8BhQG3Ad8B/wEHAYQBtwH/AasB0AHzAf8BsQHSAe4B/wMQARUDCQEM\n        AwABAQMAAQEDEwEaA1EBnAF/AYQBogH+AY8ByAHkAf8B0wH/Af4B/wGHAaoBxgH/AVUBiAGlAf8BhQGX\n        Aa4B/wGKAaABuQH/AZABqQHDAf8BlwG0Ac8B/wGdAbwB2AH/AaIBxQHhAf8BowHGAeMB/wGoAcsB6wH/\n        AVsCXgHQAxsBJhsAAQEDAAEBAwQBBQMAAQEDKQE+A1wB+AFFAUIBPQH+A0AB/QMrAfwDXwH7AW0BawFo\n        AfwDqAH9A6gB/QOzAf0CsAGuAf0BkgGMAYIB/QNAAf0BgAFbAU4B/wNkAecCNQE0AVUEAAMFAQcDBAEF\n        CAADDwEUAVgCVgG5AysB/AEeASQBJgH/AwAB/wMAAf8DAAH/AwAB/wMAAf8BAgEBAQIB/wGSAY4BkgH/\n        AZABjgGQAf8BhwGKAYcB/wEeASYBLwH/AQABBwEWAf8BAwERASYB/wEAAQMBMgH/AQABCAGOAf8BAAEJ\n        AaYB/wIAAS8B/wFGAkUBfwMGAQgDBAEFARgBgQGfAf8B5AHwAfoB/wHUAegB+AH/AbUBxgHXAf8BBQEk\n        AYgB/wEUAYYBrgH/AfAB9wH8Af8B8AH5Av8B4AHnAe0B/wGnAbYBxQH/AQABEAGBAf8BygHmAfQN/wGu\n        AcQB2AH/AbsBywHcAf8B9gP/AYUBtQHXAf8BKQGcAcQB/wGrAcwB6wH/AwoBDgMFAQcDAAEBBAADHgEr\n        A10B0wFxAYIBgwH5AcYB7gH1Af8BxgHsAfEB/wGJAagBwgH/AZABpQG9Af8BnAG3AcsB/wGrAcoB2QH/\n        Aa4BzwHgAf8BuQHaAegB/wG5AdwB6gH/AcsB6gHzAf8BygHvAfoB/wFsAXYBewH6A0IBdCQAAwEBAgQA\n        AxcBIANbAcMBxwLJAf8BwQHAAb0B/wFrAWoBaQH8A6gB/QOoAf0BrgGtAawB/QGoAakBqAH9A6gB/QHg\n        AdwB1wH/Ae4B7AHoAf8BTgFFATcB/wJhAVgB5gM0AVQDEAEWAwIBAwMFAQcDAwEEDAADEwEaAVYCVQGx\n        AXoBeAF6Af4DAAH/AwAB/wIAAQIB/wGEAoYB/wGWAZgBlwH/AgoBCwH/AwAB/wMuAf8B1QHXAdYB/wGy\n        ArgB/wGJAZABlwH/ASABJwEyAf8BAAEDASEB/wIAARgB/wIAAR0B/wNdAe0DFAEbAwMBBAQAA1QB7gHK\n        AdoB5wn/AfgB9wH4Af8CAAEFAf8BiQGqAcYN/wGtAb0BxwH/AwAB/wHJAeUB9A3/AY4BtgHYAf8BwwHd\n        Ae4B/wHPAewB+AH/AZEBtAHXAf8BnQHCAeEB/wMUARwIAAMBAQIDMgFRAXsBhgGOAfwBXwGHAYwB+wHP\n        AvkB/wG1AdYB5AH/AZMBrQHHAf8BsQHAAdIB/wG5AcwB3QH/AcYB3QHsAf8B0QHqAfcB/wHgAfQB+gH/\n        Ad0B+gH8Af8B4gL6Af8B2gP/A10BygMTARowAAMSARgDSAGDA14B1QFlAWMBXAH4AYcBhgFIAf0DfwH+\n        AcwBygHEAf8B8gH0AfIB/wKRAY8B/ANkAewDVAGuA18B4AFbAloB2wMIAQsDBwEJAwYBCAMDAQQQAAMB\n        AQIDGgElAV0CWgHKAyEB/wHAAcIBwQH/ARgBGwEdAf8DAAH/AwAB/wIrAS8B/wHPAdIBzwH/AdMB1wHV\n        Af8BkQKVAf8BiAGRAZQB/wGMAZMBmAH/AaUBpwGuAf8BngGlAasB/wGgAagBsQH/ASoBgQGUAf8DUAGd\n        AwQBBgMCAQMEAAMkATYBXgJaAdUBxgHUAeAJ/wL0AfUB/wEBAR0BgwH/AZABqQG/Df8BpwG6AcoB/wEA\n        AREBgQH/AbsBzAHcDf8BmAHFAe8B/wGmAdAB7wH/AaEBwAHaAf8BgQGgAb8B/wMLAQ8IAAMBAQIDQAFu\n        AfED/wF/AZ8BrAH+AdsC+gH/AaQByQHbAf8BnAGxAcoB/wG9AcwB3gH/AcgB3QHsAf8B0AHqAfUB/wHi\n        AfcB+QH/AecB+QH6Af8B6AH7AfoB/wHiAv0B/wNlAfQDPwFsPAADEAEWA1gBuQGFAVwBTAH/AmQBYAHn\n        A1QBrgNOAZUDMwFSAxMBGgMDAQQDHwEsAlIBUAGkAwcBCgMCBAMBBAMBAQIXAAEBAx0BKgFYAlYBuQNN\n        AfoBMAEyAYEB/wGqAq4B/wG1ArgB/wHBAb8BwQH/AacBqQGnAf8BlwGYAZcB/wHFAsYB/wG2AbsBuQH/\n        AaQBpwGpAf8BjAGQAZcB/wGHAYoBjwH/A10B7QNIAYUDBAEFAwABAQwAAyABLwNbAdABtQHHAdgJ/wHj\n        AecB6gH/ARQBLwGSAf8BggGeAbkB/wH5C/8BrQG7AcsB/wEAARgBhgH/AbgBywHeAf8B+wP/Af4D/wH9\n        AfsB+gH/AaoByQHhAf8BlwHSAeQB/wEqAZIBqgH/AxoBJQwAAzEBTgHgA/8BrwHyAfgB/wHGAfAB+AH/\n        AaIBwwHcAf8BqQG+AdgB/wGwAckB4wH/AbsB2wHxAf8BxwHtAfYB/wHWAfcB+QH/Ad8C+QH/AeUB+gH5\n        Af8B1wH5Af0B/wNbAcsDCwEPQAADMAFMAZMBjgGDAf8DSAGGCwABAQMEAQUDAgEDAwEBAgQAAwEEAgED\n        AwABAR8AAQEDEwEaA04BlANdAe0BsQGwAbQB/wG+AbwBwAH/AdUB0gHVAf8B7wHwAe8B/wHsAu0B/wHf\n        AeAB4gH/AtgB2QH/A38B/gN/Af4BYQJeAdoDPgFrAwwBEBwAAVoCVwHFAb0B1AHgDf8BCgElAYUB/wEj\n        AYwBqgH/Ae0B+wr/AbYBxwHTAf8DAAH/AakBvQHNAf8B7wH8B/8C/QH/AZABrgHBAf8BhQHFAfkB/wMW\n        AR8MAAMQARUDTgGZA10B1wNeAdkDXQHXA14B2QNhAeIDZAHsA2IB9gGIAo8B+wHiAfsC/wHmAf4C/wGb\n        AawBswH+Az0BZ0gAA0UBfAMqAUAHAAEBAwQBBgMDAQQEAAMCAQMIAAMBAQIrAAEBAx0BKgFSAlEBpwNZ\n        AfUB9gHyAfYB/wPwAf8B5wHoAekB/wHZAdgB2wH/A38B/gFhAl4B7gFHAkYBgQMDAQQDAgEDIAADFgEf\n        AVUCUwGwAagBvgHRAf8B6gH1AfoB/wH8Af0G/wFmAXYBfwH+ATEBkgGoAf8B0gHjAfAB/wNcAeoBWgJX\n        Ab0BWAJWAcEDWgHkAZMBpAG4Af8BWgJXAcUDSAGFA0gBhgNSAakDKgFBEAADCgEOAxgBIgMZASMDGAEi\n        AxkBIwMaASUDHAEoAx8BLAMhATADLQFGAz4BagM4AV4DBwEJPwABAWcAAQEDFgEfAz0BaQFRAlABnwNM\n        AZMDOwFkAyYBOAMOARMDAAEBLAADFwEgA04BmQGBAZYBqQH/AVcCVQG6ATUCNAFVAzQBVANLAY4BGwGB\n        AZIB/wMtAUYDDwEUAxIBGAMnAToBTgJNAZUDFAEcDAADCwEPOwABAQMAAQFDAAEBcAADAQECAwEBAgMB\n        AQJAAAFGAkUBfgMvAUkMAAEiAiEBMf8ATQABQgFNAT4HAAE+AwABKAMAAWADAAEwAwABAQEAAQEFAAFA\n        AQIWAAP/AQABwAEAAQ8B8QL/BgABgAEAAQ8B8AF/Af8GAAGAAQABDwHgAQ8B/wYAAYABAAEHAeABAAEf\n        BgABgAEAAQMBwAgAAYABAAEBAcAIAAGAAQABAQGACAABgAEAAQEBgAgAAYABAAEBCQABgAEAAQECAAEB\n        BgABgAEAAQECAAEBBgABgAEAAQEB4AEAAQEGAAGAAQABAQHgAQABAwYAAYABAAEBAeABAAEDBgABgAEA\n        AQEB4AEAAQMGAAGAAQABAQHgAQABBwYAAYABAAEBAeABAAEHBgABgAEAAQEB4AEAAQcGAAHMAQABAQHg\n        AQABBwYAAcQBAAEBAeABAAEHBgAB4AEAAQEB4AEAAQcGAAHwAQABAQHAAQABDwYAAfgBAAEBAecC/wYA\n        Bv8GAAHwAQABDwHAAQABPwEGAR8C/wHnAf8B4AEAAQcBwAEAAQ8BAAEHAv8BgAF/AeABAAEHAcABAAEB\n        AcABIwH/Af4BAAEPAcABAAEDAcABAAEMAYABAwEfAfACAAHAAQABAwHAAQABAQGAAQQBAQHAAgABwAEA\n        AQMBgAEAAQEBgAEAAQMBwAIAAcABAAEBAYABAAEDAYABAAEDAYACAAHAAQABAQGAAQABAQHAAQABBwGA\n        AgABgAIAAYABAAEBAcABAAEDAcACAAGAAgABgAEAAQEBwAEAAQEBwAEgAQABgAIAAYABAAEDAcACAAGB\n        AgABgAIAAYABAAEHAeACAAGAAQABAQGAAgABgAEAAQcB8AEAAQEBgAIAAYACAAGAAQABDwMAAYACAAGA\n        AgABgAEAAR8BCAEAAQIBwAIAAYAEAAEfAYABAAEEAcAFAAFAAQABPwHoAgAB4AIAAYABAAEBAYABAAE/\n        AfwBAAEBAeACAAGAAQABAQGAAQABfwH/AQABAQHwAQABAQHAAQABAQHAAQABfwH/AYwBIwH4AQABBwHw\n        AQABAQHAAQAC/wHIAbcB/gEAAQ8B8AEAAQEB4AEAAf8B/gP/AYABPwH4AQABHQH/AfkB/wH+A/8B8QH/\n        Af4Bdwr/Cw==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/RequiredSkillsControl.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class RequiredSkillsControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RequiredSkillsControl));\n            this.btnAddSkills = new System.Windows.Forms.Button();\n            this.panel1 = new System.Windows.Forms.Panel();\n            this.lblTimeRequired = new System.Windows.Forms.Label();\n            this.panel2 = new System.Windows.Forms.Panel();\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.planToMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.level0ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.level1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.level2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.level3ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.level4ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.level5ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.showInSkillBrowserMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInSkillExplorerMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsSeparatorBrowser = new System.Windows.Forms.ToolStripSeparator();\n            this.tsmExpand = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmCollapse = new System.Windows.Forms.ToolStripMenuItem();\n            this.ilIcons = new System.Windows.Forms.ImageList(this.components);\n            this.tvSkillList = new EVEMon.SkillPlanner.OverridenTreeView();\n            this.panel1.SuspendLayout();\n            this.panel2.SuspendLayout();\n            this.contextMenu.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // btnAddSkills\n            // \n            this.btnAddSkills.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnAddSkills.Location = new System.Drawing.Point(153, 4);\n            this.btnAddSkills.Name = \"btnAddSkills\";\n            this.btnAddSkills.Size = new System.Drawing.Size(88, 23);\n            this.btnAddSkills.TabIndex = 0;\n            this.btnAddSkills.Text = \"Add All To Plan\";\n            this.btnAddSkills.UseVisualStyleBackColor = true;\n            this.btnAddSkills.Click += new System.EventHandler(this.btnAddSkills_Click);\n            // \n            // panel1\n            // \n            this.panel1.Controls.Add(this.lblTimeRequired);\n            this.panel1.Controls.Add(this.btnAddSkills);\n            this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.panel1.Location = new System.Drawing.Point(0, 127);\n            this.panel1.Name = \"panel1\";\n            this.panel1.Size = new System.Drawing.Size(244, 30);\n            this.panel1.TabIndex = 4;\n            // \n            // lblTimeRequired\n            // \n            this.lblTimeRequired.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.lblTimeRequired.AutoSize = true;\n            this.lblTimeRequired.Location = new System.Drawing.Point(3, 9);\n            this.lblTimeRequired.Name = \"lblTimeRequired\";\n            this.lblTimeRequired.Size = new System.Drawing.Size(71, 13);\n            this.lblTimeRequired.TabIndex = 1;\n            this.lblTimeRequired.Text = \"Time required\";\n            // \n            // panel2\n            // \n            this.panel2.Controls.Add(this.tvSkillList);\n            this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.panel2.Location = new System.Drawing.Point(0, 0);\n            this.panel2.Name = \"panel2\";\n            this.panel2.Size = new System.Drawing.Size(244, 127);\n            this.panel2.TabIndex = 5;\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.planToMenu,\n            this.showInMenuSeparator,\n            this.showInSkillBrowserMenu,\n            this.showInSkillExplorerMenu,\n            this.tsSeparatorBrowser,\n            this.tsmExpand,\n            this.tsmCollapse});\n            this.contextMenu.Name = \"contextMenu\";\n            this.contextMenu.Size = new System.Drawing.Size(195, 126);\n            this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenu_Opening);\n            // \n            // planToMenu\n            // \n            this.planToMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.level0ToolStripMenuItem,\n            this.level1ToolStripMenuItem,\n            this.level2ToolStripMenuItem,\n            this.level3ToolStripMenuItem,\n            this.level4ToolStripMenuItem,\n            this.level5ToolStripMenuItem});\n            this.planToMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"planToMenu.Image\")));\n            this.planToMenu.Name = \"planToMenu\";\n            this.planToMenu.Size = new System.Drawing.Size(194, 22);\n            this.planToMenu.Text = \"&Plan to...\";\n            // \n            // level0ToolStripMenuItem\n            // \n            this.level0ToolStripMenuItem.Name = \"level0ToolStripMenuItem\";\n            this.level0ToolStripMenuItem.Size = new System.Drawing.Size(117, 22);\n            this.level0ToolStripMenuItem.Text = \"&Remove\";\n            this.level0ToolStripMenuItem.Click += new System.EventHandler(this.planToMenuItem_Click);\n            // \n            // level1ToolStripMenuItem\n            // \n            this.level1ToolStripMenuItem.Name = \"level1ToolStripMenuItem\";\n            this.level1ToolStripMenuItem.Size = new System.Drawing.Size(117, 22);\n            this.level1ToolStripMenuItem.Text = \"Level &1\";\n            this.level1ToolStripMenuItem.Click += new System.EventHandler(this.planToMenuItem_Click);\n            // \n            // level2ToolStripMenuItem\n            // \n            this.level2ToolStripMenuItem.Name = \"level2ToolStripMenuItem\";\n            this.level2ToolStripMenuItem.Size = new System.Drawing.Size(117, 22);\n            this.level2ToolStripMenuItem.Text = \"Level &2\";\n            this.level2ToolStripMenuItem.Click += new System.EventHandler(this.planToMenuItem_Click);\n            // \n            // level3ToolStripMenuItem\n            // \n            this.level3ToolStripMenuItem.Name = \"level3ToolStripMenuItem\";\n            this.level3ToolStripMenuItem.Size = new System.Drawing.Size(117, 22);\n            this.level3ToolStripMenuItem.Text = \"Level &3\";\n            this.level3ToolStripMenuItem.Click += new System.EventHandler(this.planToMenuItem_Click);\n            // \n            // level4ToolStripMenuItem\n            // \n            this.level4ToolStripMenuItem.Name = \"level4ToolStripMenuItem\";\n            this.level4ToolStripMenuItem.Size = new System.Drawing.Size(117, 22);\n            this.level4ToolStripMenuItem.Text = \"Level &4\";\n            this.level4ToolStripMenuItem.Click += new System.EventHandler(this.planToMenuItem_Click);\n            // \n            // level5ToolStripMenuItem\n            // \n            this.level5ToolStripMenuItem.Name = \"level5ToolStripMenuItem\";\n            this.level5ToolStripMenuItem.Size = new System.Drawing.Size(117, 22);\n            this.level5ToolStripMenuItem.Text = \"Level &5\";\n            this.level5ToolStripMenuItem.Click += new System.EventHandler(this.planToMenuItem_Click);\n            // \n            // showInMenuSeparator\n            // \n            this.showInMenuSeparator.Name = \"showInMenuSeparator\";\n            this.showInMenuSeparator.Size = new System.Drawing.Size(191, 6);\n            // \n            // showInSkillBrowserMenu\n            // \n            this.showInSkillBrowserMenu.Name = \"showInSkillBrowserMenu\";\n            this.showInSkillBrowserMenu.Size = new System.Drawing.Size(194, 22);\n            this.showInSkillBrowserMenu.Text = \"Show in Skill &Browser\";\n            this.showInSkillBrowserMenu.Click += new System.EventHandler(this.showInSkillBrowserMenu_Click);\n            // \n            // showInSkillExplorerMenu\n            // \n            this.showInSkillExplorerMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"showInSkillExplorerMenu.Image\")));\n            this.showInSkillExplorerMenu.Name = \"showInSkillExplorerMenu\";\n            this.showInSkillExplorerMenu.Size = new System.Drawing.Size(194, 22);\n            this.showInSkillExplorerMenu.Text = \"Show in Skill &Explorer...\";\n            this.showInSkillExplorerMenu.Click += new System.EventHandler(this.showInSkillExplorerMenu_Click);\n            // \n            // tsSeparatorBrowser\n            // \n            this.tsSeparatorBrowser.Name = \"tsSeparatorBrowser\";\n            this.tsSeparatorBrowser.Size = new System.Drawing.Size(191, 6);\n            // \n            // tsmExpand\n            // \n            this.tsmExpand.Name = \"tsmExpand\";\n            this.tsmExpand.Size = new System.Drawing.Size(194, 22);\n            this.tsmExpand.Text = \"&Expand all\";\n            this.tsmExpand.Click += new System.EventHandler(this.tsmExpandAll_Click);\n            // \n            // tsmCollapse\n            // \n            this.tsmCollapse.Name = \"tsmCollapse\";\n            this.tsmCollapse.Size = new System.Drawing.Size(194, 22);\n            this.tsmCollapse.Text = \"&Collapse all\";\n            this.tsmCollapse.Click += new System.EventHandler(this.tsmCollapseAll_Click);\n            // \n            // ilIcons\n            // \n            this.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n            this.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilIcons.Images.SetKeyName(0, \"Untrainable\");\n            this.ilIcons.Images.SetKeyName(1, \"Trained\");\n            this.ilIcons.Images.SetKeyName(2, \"Planned\");\n            this.ilIcons.Images.SetKeyName(3, \"Trainable\");\n            // \n            // tvSkillList\n            // \n            this.tvSkillList.ContextMenuStrip = this.contextMenu;\n            this.tvSkillList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tvSkillList.FullRowSelect = true;\n            this.tvSkillList.ImageIndex = 0;\n            this.tvSkillList.ImageList = this.ilIcons;\n            this.tvSkillList.Location = new System.Drawing.Point(0, 0);\n            this.tvSkillList.Name = \"tvSkillList\";\n            this.tvSkillList.SelectedImageIndex = 0;\n            this.tvSkillList.Size = new System.Drawing.Size(244, 127);\n            this.tvSkillList.TabIndex = 0;\n            this.tvSkillList.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.tvSkillList_NodeMouseDoubleClick);\n            // \n            // RequiredSkillsControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.panel2);\n            this.Controls.Add(this.panel1);\n            this.Name = \"RequiredSkillsControl\";\n            this.Size = new System.Drawing.Size(244, 157);\n            this.panel1.ResumeLayout(false);\n            this.panel1.PerformLayout();\n            this.panel2.ResumeLayout(false);\n            this.contextMenu.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n        #endregion\n\n        private System.Windows.Forms.Button btnAddSkills;\n        private System.Windows.Forms.Panel panel1;\n        private System.Windows.Forms.Label lblTimeRequired;\n        private System.Windows.Forms.Panel panel2;\n        private OverridenTreeView tvSkillList;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem planToMenu;\n        private System.Windows.Forms.ToolStripMenuItem level1ToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem level2ToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem level3ToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem level4ToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem level5ToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator showInMenuSeparator;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillBrowserMenu;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillExplorerMenu;\n        private System.Windows.Forms.ToolStripMenuItem level0ToolStripMenuItem;\n        private System.Windows.Forms.ToolStripSeparator tsSeparatorBrowser;\n        private System.Windows.Forms.ToolStripMenuItem tsmExpand;\n        private System.Windows.Forms.ToolStripMenuItem tsmCollapse;\n        private System.Windows.Forms.ImageList ilIcons;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/RequiredSkillsControl.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// User control to display required skills for a given eveobject and update a plan object for requirements not met\n    /// </summary>\n    public partial class RequiredSkillsControl : UserControl\n    {\n        private BlueprintActivity m_activity;\n        private Item m_object;\n        private Plan m_plan;\n        private bool m_allExpanded;\n\n\n        #region Object Lifecycle\n\n        /// <summary>\n        /// Default constructor\n        /// </summary>\n        public RequiredSkillsControl()\n        {\n            InitializeComponent();\n\n            tvSkillList.MouseDown += tvSkillList_MouseDown;\n            tvSkillList.MouseMove += tvSkillList_MouseMove;\n\n            Disposed += OnDisposed;\n            EveMonClient.PlanChanged += EveMonClient_PlanChanged;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            Disposed -= OnDisposed;\n            EveMonClient.PlanChanged -= EveMonClient_PlanChanged;\n        }\n\n        /// <summary>\n        /// Occurs when the plan changes, when update the display.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_PlanChanged(object sender, PlanChangedEventArgs e)\n        {\n            UpdateDisplay();\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the activity.\n        /// </summary>\n        /// <value>\n        /// The activity.\n        /// </value>\n        internal BlueprintActivity Activity\n        {\n            get { return m_activity; }\n            set\n            {\n                m_activity = value;\n                UpdateDisplay();\n            }\n        }\n\n        /// <summary>\n        /// An EveObject for which we want to show required skills\n        /// </summary>\n        internal Item Object\n        {\n            get { return m_object; }\n            set\n            {\n                m_object = value;\n                UpdateDisplay();\n            }\n        }\n\n        /// <summary>\n        /// The target Plan object to add any required skills\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                m_plan = value;\n                UpdateDisplay();\n            }\n        }\n\n        #endregion\n\n\n        #region Content creation\n\n        /// <summary>\n        /// Updates control contents\n        /// </summary>\n        private void UpdateDisplay()\n        {\n            // We have nothing to display\n            if (m_object == null || m_plan == null)\n                return;\n\n            // Default all known flag to true. Will be set to false in getSkillNode() if a requirement is not met\n            bool allSkillsKnown = true;\n\n            // Default unplanned skills flag to false. Will be set to true in getSkillNode() if a requirement is neither met nor planned\n            bool skillsUnplanned = false;\n\n            // Treeview update\n            tvSkillList.BeginUpdate();\n\n            IList<StaticSkillLevel> prerequisites = Activity == BlueprintActivity.None\n                ? m_object.Prerequisites\n                    .Where(x => !x.Level.Equals(0) && x.Activity.Equals(Activity)).ToList()\n                : m_object.Prerequisites\n                    .Where(x => !x.Level.Equals(0) && x.Activity.Equals(Activity))\n                    .OrderBy(x => x.Skill.Name).ToList();\n\n            try\n            {\n                tvSkillList.Nodes.Clear();\n\n                // Recursively create nodes\n                foreach (StaticSkillLevel prereq in prerequisites)\n                {\n                    tvSkillList.Nodes.Add(GetSkillNode(prereq, ref allSkillsKnown, ref skillsUnplanned));\n                }\n            }\n            finally\n            {\n                tvSkillList.EndUpdate();\n            }\n\n            // Set training time required label\n            if (allSkillsKnown)\n                lblTimeRequired.Text = @\"No training required\";\n            else\n            {\n                TimeSpan trainTime = m_plan.Character.GetTrainingTimeToMultipleSkills(prerequisites);\n                lblTimeRequired.Text = trainTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n            }\n\n            // Set minimun control size\n            Size timeRequiredTextSize = TextRenderer.MeasureText(lblTimeRequired.Text, Font);\n            Size newMinimumSize = new Size(timeRequiredTextSize.Width + btnAddSkills.Width, 0);\n            if (MinimumSize.Width < newMinimumSize.Width)\n                MinimumSize = newMinimumSize;\n\n            // Enable / disable button\n            btnAddSkills.Enabled = skillsUnplanned;\n        }\n\n        /// <summary>\n        /// Recursive method to generate treenodes for tvSkillList.\n        /// </summary>\n        /// <param name=\"prereq\">The prereq.</param>\n        /// <param name=\"allSkillsKnown\">if set to <c>true</c> [all skills known].</param>\n        /// <param name=\"skillsUnplanned\">if set to <c>true</c> [skills unplanned].</param>\n        /// <returns></returns>\n        private TreeNode GetSkillNode(ISkillLevel prereq, ref bool allSkillsKnown, ref bool skillsUnplanned)\n        {\n            if (prereq.Skill == null)\n                return new TreeNode();\n\n            Character character = (Character)m_plan.Character;\n            Skill skill = character.Skills[prereq.Skill.ID];\n            TreeNode node = new TreeNode(prereq.ToString()) { Tag = new SkillLevel(skill, prereq.Level) };\n\n            // Skill requirement met\n            if (skill.Level >= prereq.Level)\n            {\n                node.ImageIndex = 1;\n                node.SelectedImageIndex = 1;\n            }\n                // Requirement not met, but planned\n            else if (m_plan.IsPlanned(skill, prereq.Level))\n            {\n                node.ImageIndex = 2;\n                node.SelectedImageIndex = 2;\n                allSkillsKnown = false;\n            }\n                // Requirement not met, but trainable\n            else if (skill.Level < prereq.Level && skill.IsKnown)\n            {\n                node.ImageIndex = 3;\n                node.SelectedImageIndex = 3;\n                allSkillsKnown = false;\n                skillsUnplanned = true;\n            }\n                // Requirement not met\n            else\n            {\n                node.ImageIndex = 0;\n                node.SelectedImageIndex = 0;\n                allSkillsKnown = false;\n                skillsUnplanned = true;\n            }\n\n            // Generate child nodes if required\n            foreach (StaticSkillLevel childPrereq in skill.StaticData.Prerequisites.Where(childPrereq => childPrereq != prereq))\n            {\n                node.Nodes.Add(GetSkillNode(childPrereq, ref allSkillsKnown, ref skillsUnplanned));\n            }\n\n            return node;\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// When the treeview is clicked, we manually select nodes since the bounding boxes are incorrect.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tvSkillList_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                tvSkillList.Cursor = Cursors.Default;\n\n            // Perform the selection manually since the bound's width and x are incorrect\n            TreeNode selection = null;\n            for (TreeNode node = tvSkillList.TopNode; node != null; node = node.NextVisibleNode)\n            {\n                if (node.Bounds.Top > e.Y || node.Bounds.Bottom < e.Y)\n                    continue;\n\n                // If the user clicked the \"arrow zone\", we do not change the selection and just return\n                if (e.X < node.Bounds.Left - 32)\n                    return;\n\n                selection = node;\n                break;\n            }\n\n            tvSkillList.SelectedNode = selection;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void tvSkillList_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            tvSkillList.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Event handler method for Add Skills button\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnAddSkills_Click(object sender, EventArgs e)\n        {\n            // Add skills to plan\n            IPlanOperation operation = m_plan.TryAddSet(m_object.Prerequisites.Where(x => x.Activity.Equals(Activity)),\n                                                        m_object.Name);\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            if (planWindow == null)\n                return;\n\n            PlanHelper.Perform(new PlanToOperationWindow(operation), planWindow);\n\n            // Refresh display to reflect plan changes\n            UpdateDisplay();\n        }\n\n        /// <summary>\n        /// Event handler for treenode double click event\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tvSkillList_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)\n        {\n            Skill skill = ((SkillLevel)e.Node.Tag)?.Skill;\n\n            // Open skill browser tab for this skill\n            PlanWindow.ShowPlanWindow(null, m_plan).ShowSkillInBrowser(skill);\n        }\n\n        #endregion\n\n\n        #region Context menu\n\n        /// <summary>\n        /// Context menu opening, updates the \"plan to\" menus\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void contextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            tsSeparatorBrowser.Visible = tvSkillList.SelectedNode != null;\n            tsmCollapse.Enabled = tsmCollapse.Visible = m_allExpanded;\n            tsmExpand.Enabled = tsmExpand.Visible = !tsmCollapse.Enabled;\n\n            // Update \"show in...\" menu\n            planToMenu.Visible =\n                showInMenuSeparator.Visible =\n                    showInSkillBrowserMenu.Visible =\n                        showInSkillExplorerMenu.Visible = tvSkillList.SelectedNode != null;\n\n            if (tvSkillList.SelectedNode == null)\n                return;\n\n            // \"Plan to N\" menus\n            SkillLevel skillLevel = (SkillLevel)tvSkillList.SelectedNode.Tag;\n            Skill skill = skillLevel?.Skill;\n\n            if (skill == null)\n                return;\n\n            planToMenu.Enabled = false;\n            for (int i = 0; i <= 5; i++)\n            {\n                planToMenu.Enabled |= m_plan.UpdatesRegularPlanToMenu(planToMenu.DropDownItems[i], skill, i);\n            }\n        }\n\n        /// <summary>\n        /// Context > Show in Skill Browser\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInSkillBrowserMenu_Click(object sender, EventArgs e)\n        {\n            Skill skill = ((SkillLevel)tvSkillList.SelectedNode?.Tag)?.Skill;\n\n            // Open the skill browser\n            PlanWindow.ShowPlanWindow(null, m_plan).ShowSkillInBrowser(skill);\n        }\n\n        /// <summary>\n        /// Context > Show in Skill Explorer\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInSkillExplorerMenu_Click(object sender, EventArgs e)\n        {\n            Skill skill = ((SkillLevel)tvSkillList.SelectedNode?.Tag)?.Skill;\n            \n            // Open the skill explorer\n            SkillExplorerWindow.ShowSkillExplorerWindow(skill?.Character, m_plan).ShowSkillInExplorer(skill);\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand All\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmExpandAll_Click(object sender, EventArgs e)\n        {\n            tvSkillList.ExpandAll();\n            m_allExpanded = true;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse All\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmCollapseAll_Click(object sender, EventArgs e)\n        {\n            tvSkillList.CollapseAll();\n            m_allExpanded = false;\n        }\n\n        /// <summary>\n        /// Context > Plan To > Level N\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void planToMenuItem_Click(object sender, EventArgs e)\n        {\n            ToolStripMenuItem menu = (ToolStripMenuItem)sender;\n            IPlanOperation operation = (IPlanOperation)menu.Tag;\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            if (planWindow == null)\n                return;\n\n            PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow, operation);\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/RequiredSkillsControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>100, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"planToMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        wQAADsEBuJFr7QAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAALmSURB\n        VDhPZZJLTxNhFIaJP8JEFwb1FxhHV8QLujDRhXEBRI0GNQQSFAQRUUQwBAm30nKrFFqhF3qlLdPOUCgt\n        vQJthba00JarYiSDcWHcqenr0Bk1lTc5+VbP851zvi/nTza3tlyJRMIRjcXNwXBE7w6EtNO+ec2k158p\n        m3dOTbs8pbknTh7ikeykNjaYWCIJVygMncOLftKGVg2ZVQKD9Ve3QlN/+MjRg5JYMsV8+fYdH/a+YnVn\n        F+54CnPJTczGUtD6QtB4g5nqNdE/+1T6+mO5x7MlvkiUWd/dw9LmDhZSmwisbWEmmoDKHThQnTrrj2bl\n        +Fke5WL1LzCh9W325jWYF8JQs7f9D44459FGOnBdpEwXCEfP8ygX5YybmQqvgAxGMgLj/BIMc4uZ0xwI\n        Q+qYQ82YFcXDBlzseJcu7FFkC0RmG0MvxhD/+Bmrn3Yze/CurLGjbMMWSUAfWEbzhBPlCgsud8nTRX2q\n        bIHASDNTS3EEWWA2loSHhe3sDrqsLrRbnGi3uiGw+VA1pEOaIJDsbAePcmkaMzFqTxD7Xey3LrA40KCl\n        2JmdqFVTqNNOonPCDl1TE9JFNzISHuXSbrAyZDAK6v0yeqhZVI0aMUhOo54FW9jWhaQZIpEIFEWhv7IC\n        YrG0hEe5tGhIxsQuj16MQ2L3Q+kJQUC5MOZfgsw+CdsggcgUgcbGRjyQ6NOlCssFHuXyfGScKXurQolY\n        hVKJBo+ketwVq1Etk/+Fx7oJNOhIFMpMeGxw5vMolyuve5jb3TLcH1CinIUrR02olMqgHvgH1yg0qNTZ\n        cUtG4onZdYlHueQ3CplmPQ1jIILZlXV4olEYpRwsaSVYqRJlKhrV4w7cGbXiKenJFpx7JWSKe+UoH9aj\n        jv0w6r48+OgOyLsIPGTHKJFbUKGdxrMJN+4padRR/mzBqdo25nRdB4gXApx5KQTBPpOwgcDV1h7kvRna\n        /zy4NqBBwbAJN2VsB5Z9QU7ObwjkSucBbV0TAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"showInSkillExplorerMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABh0RVh0U29m\n        dHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAAk9JREFUOE+Vkm1P0mEYxd3c+hi8cmsrDTV1VJoaJlqE\n        TygmjYCEcGACKqAiOIKUJ0WRINNQJJ/LLB9mK0oFKmO6yGbrO/heN7cT0b9NhlL93t27zn12XTsn6X+Q\n        +YUdzUFRMvH8O/yF2mThEpvUsMohSd7ySE1r9WG5X+gmxolhT1Ywb89V74mXuLj3uh5y3130hQwwhbSI\n        mNgJ2fFUjVxLYY0zDizB+xj76oJ3ZxhTu27Mfvfg2Q9vxKQL8oDQRMjjKXPR3KoVKYa2B/Dky0N4dh5h\n        4tsIpndHMbM7BuOmBtJ1gZ6Qx0Lrzc+9Pkg9HNg0wRHqhWKlEZyZanCf16BrTQF9oA3iN1wbIf9NTls6\n        LmqycFlP2a9y0tH8qhG2TSMk8/WoHqVbbz4tP/VLx5tnhQWLdcPRT0fJbE1D5zsltO/bYNjQwBjUoWO1\n        BXRH0SohicKZZar4L1jxMZKlZ9Dua4Xap4RuXY1uvxaqZSlK+wtjDOomKjo4c8x4g1TJaZBlZ3FecW6/\n        1EyFeE6AnoAOfC87YnLFynAWR0+o8dwIR+JN3IMsJTmXos481G90RjcRTHJAtxeB4SqG7KUILcsSsKcq\n        E/cgW0V288bZ6A50wfxBD9unHgx+tsC1ZcPjbTsUy424NV15cg8ymlNTslXpB7IFcfQUy0dDNBVHyArn\n        Vh/kiw2o9ZYd34M/ZLakMSPx7lEf5IFmKQS9/yqa5kUQz95B+VBJbA9OIhJvck57BumSNpuUb6CQqKbc\n        cImtIL4H/0qB4YKqyJx3JMakpJ/GeCksDt4euAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD+\n        CwAAAk1TRnQBSQFMAgEBBAEAATABAQEwAQEBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AqgACYgFYAekBjAFp\n        ASMB/wGPAWsBJAH/AZEBbQElAf8BkwFvAScB/wGVAYEBJQH/AZgBggEoAf8BnAGHASwB/wGjAY4BNAH/\n        AakBlwE8Af8BsAGdAUYB/wG1AZ8BSgH/AywBQ8wAAmIBWAHpAaMBlAFRAf8BrAGdAVwB/wG1AacBaQH/\n        AbcBqgFsAf8BrAGcAVUB/wGoAZcBSgH/Aa0BnAFPAf8BtAGjAVYB/wG7AaoBXwH/AcIBsgFoAf8BtwGl\n        AVIB/wMsAUNQAAMyAVADRAF5AxEBFxQAAzIBUANEAXoDEgEYHAADEAEWA0UBfQMkATYoAAJiAVgB6QG3\n        AawBhAH/AdEBygGvAf8B3AHWAcAB/wHhAdsByAH/AbQBpQFjAf8BpgGUAUcB/wGpAZcBSQH/Aa8BngFQ\n        Af8BtwGmAVkB/wG+Aa4BYwH/AbUBogFOAf8DLAFDGAADCQEMAy4BRwNAAXADQgF1AzYBWQMSARggAAJC\n        AVkB9QIAAv8CUQFSAacQAAMxAU8CKQFuAfoCAAL/A0MBeBwAA1IBqQGdAf8BnQH/A14B3QMBAQIkAAJi\n        AVgB6QGfAZABTAH/AaUBlwFTAf8BrAGeAVwB/wGwAaIBYAH/AakBmQFQAf8BpQGUAUYB/wGoAZYBSAH/\n        Aa4BnAFOAf8BtQGjAVYB/wG8AasBYAH/AbMBnwFLAf8DLAFDFAADBQEHAVgCWwHGAQABtwL/AQABsQL/\n        AQABqgL/AQABowL/AT4CXAH4AzEBThwAAlkBWwHDAgAC/wJAAagB/QJRAVIBpwMRARcEAAM7AWUCTQFu\n        AfoCAAL/AkEBagH5Ay8BShQAAxABFgNSAakBfwGeAX4B/gGNAd8BjQH/AZMB+wGTAf8DWwHLAxQBGyAA\n        A2IB6QGmAZkBWQH/AaYBmAFWAf8BqQGbAVgB/wGrAZwBWQH/AagBmAFPAf8BrgGeAVgB/wGuAZ4BVgH/\n        AbUBpQFfAf8BtwGoAV4B/wG9Aa4BZQH/AbABnwFHAf8DKwFCEAADHAEnAVoCXwHbAVcCXwHoAUYBRQFG\n        AX8DLAFDAyMBMwM9AWkBWAJcAdEDXQHtAzEBThgAAxQBGwFWAVQBVgHuAh0C/wI4Av8BUgFRAVIBpwMx\n        AU4CTQFuAfoCKAL/AUcBQQFqAfkDKAE9GAADUgGpAUUB/wFFAf8BTQFuAU0B+gMtAUUDZAHnAYEB/wGB\n        Af8DUQGiIAADYgHpAdAByQGwAf8B1QHOAbcB/wHGAbwBmwH/Ac0BxAGmAf8BwQG2AY8B/wHPAcYBpwH/\n        AckBvgGZAf8B1AHLAa0B/wHDAbYBhwH/Ab0BrgFnAf8BjwF/AVUB/gMqAUAQAANOAZQBAAHFAv8DMwFS\n        FAABWAJcAdEBPgJcAfgDEgEYGAADFAEbAVoBVwFaAcUCUwL/Al8BhAH7A2IB9gKDAv8CTQFtAfoDOAFc\n        HAABWwFiAUkB9gFNAW0BTQH6AzgBXAQAAzUBVQFuAY8BaAH+AV8BhAFcAfsBSAJHAYMDBgEIGAADYgHp\n        AdIBywGzAf8B0wHNAbYB/wHAAbYBkwH/Aa8BogFiAf8BugGtAYIB/wG4AaoBbAH/Ab8BsgGGAf8BwAGz\n        AYcB/wHEAbcBigH/Ab4BrgFqAf8BrAGYAUAB/wMqAUEQAAFbAl4B2QNZAccDBAEGFAADPQFpAQABjwL/\n        AzYBWRwAAxQBGwFcAlUB6gKsAv8CuAL/A1kB9QMoAT0gAAMzAVMDKQE/DAADRAF7ATYB6QEzAf8BJgH/\n        ASYB/wM7AWUYAANiAekBywHDAagB/wHUAc4BtwH/Ac4BxwGtAf8BvgG0AY8B/wG2AaoBbgH/Ab8BswGK\n        Af8BtgGoAWcB/wG4AaoBaQH/AcABswGGAf8BuwGrAWYB/wGnAZUBOwH/AyoBQRAAAVICZQH0AzwBZhgA\n        AyMBMwEAAY8C/wNCAXUcAAM7AWQCXAFnAfgCowL/AqwC/wGKAYMBqAH9AVQBUgFUAaYDEAEWNAACUgFQ\n        AaMBGQH/ARkB/wFaAWEBWgHkAywBQxQAA2IB6QHVAc8BugH/AeAB2wHLAf8B2QHUAcAB/wHbAdYBwwH/\n        AdgB0gG8Af8BwQG1AY4B/wHAAbQBiwH/AcIBtQGLAf8BxQG5AY8B/wGvAZ0BUAH/AYgBfwFLAf4DKQE/\n        EAABWAJiAe8DSAGGGAADLAFDAQABjwL/A0ABcBgAAzEBTgFeAUcBagH5AkkC/wFqAWcBagH5AWQBUwFk\n        AfECUwL/AjcC/wFRAU8BUwGlNAADDwEUAVkBZwFZAfIBAAH/AQAB/wNYAeMDIgEyEAADYgHpAdQBzgG3\n        Af8B5gHiAdUB/wHnAeQB1wH/AecB4wHXAf8B2wHWAcQB/wHgAdsBygH/AdgB0QG5Af8B0wHKAawB/wG/\n        AbIBhAH/AbQBpAFcAf8BhAF/AUQB/gMpAT8QAANZAccDXAHnAwgBCxQAAUYBRQFGAX8BAAGPAv8DLgFH\n        FAADOwFkAkEBagH5AhMC/wJNAW0B+gM4AVwDFAEcAVsBWAFbAcYCHQL/AisBegH8Ak8BUwGlAxABFjAA\n        AxoBJAFYAV4BWAHdAQAB/wEAAf8DQAFuEAABYwJiAekB1gHQAboB/wHRAcsBswH/AdAByQGxAf8BzwHI\n        Aa8B/wHOAccBrQH/Ac8ByAGvAf8B0AHKAbEB/wHHAb4BngH/AbUBpwFlAf8BrQGdAVEB/wGBAX8BQQH+\n        AykBPxAAAT8CQAFvAQABxQL/A0wBkgMIAQsIAAMEAQYDMwFSAVcCXwHoAlgBWwHGAwkBDBQAAkwBXwHz\n        AgAC/wEyASkBbQH6AykBPggAAxQBHAFTAU4BXQHwAgAC/wIAAv8DQgF1NAADMQFOA1oB0wMTARoQAAJj\n        AWIB6QHgAdwBzAH/AdsB1QHCAf8B0AHJAbEB/wHLAcQBqAH/AcoBwgGmAf8BygHCAaYB/wHKAcIBpgH/\n        AcoBwgGmAf8ByAG/AaEB/wG+AbMBigH/AYYBfwFQAf4DKQE/EAADAwEEA1YBtgEAAb4C/wNcAecDSAGG\n        AzwBZgNZAccBAAGdAv8BWgJfAdsDBQEHGAACWQFbAcQCUgFlAfQDOAFdEAADFAEcAlkBWwHEAlkBZwHy\n        Ay8BSlAAA2MB6QHqAecB3AH/AeMB3gHPAf8B3gHaAckB/wHfAdsBygH/AdgB0gG9Af8BygHCAaYB/wHK\n        AcIBpgH/AcoBwgGmAf8BygHCAaYB/wHKAcIBpgH/AYwBgwF0AfoDJAE2FAADAwEEAT8CQAFvA1kBxwFY\n        AmIB7wFSAmUB9AFaAl4B2ANOAZQDHAEnmAACZQFjAekB8wHxAesB/wHtAeoB4QH/AecB4wHXAf8B2gHV\n        AcIB/wHeAdkBxwH/AdoB1AHAAf8BzAHFAaoB/wHLAcQBqQH/AcsBxAGpAf8BkQGPAYQB+wNFAXwDAQEC\n        zAADZQHpAdkB2AHUAf8B0AHMAcEB/wHEAb4BqwH/AbkBswGWAf8BswGpAYgB/wGzAakBiAH/AbMBqQGI\n        Af8BswGpAYgB/wGLAX8BdAH8A0UBfAMBAQLQAANYAcEDWQG+A1YBsQNUAawDUwGqA1IBqQNSAakDUgGp\n        A1MBqAM9AWgDAQECTAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EABP8BwAEB\n        Bv8BwAEBAv8C4wH4Af8BwAEBAfgBHwHjAcMB+AF/AcABAQHwAQ8B4AGDAeABPwHAAQEB4AEHAeABBwHg\n        AT8BwAEBAuMB8AEPAeIBDwHAAQEC4wH4AR8B5wEPAcABAQHnAeMB+AEPAf8BhwHAAQEB5wHjAfABDwH/\n        AYMBwAEBAuMB4AEDAf8BwwHAAQEB4QGDAeEBgwH/AeMBwAEBAeABBwHjAcMC/wHAAQEB8AEPBP8BwAEB\n        Bv8BwAEDBv8BwAEHAv8L\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ShipBrowserControl.Designer.cs",
    "content": "using EVEMon.Common.Enumerations;\n\nnamespace EVEMon.SkillPlanner\n{\n    partial class ShipBrowserControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ShipBrowserControl));\n            this.gbAttributes = new System.Windows.Forms.GroupBox();\n            this.lvShipProperties = new System.Windows.Forms.ListView();\n            this.chAttribute = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.ShipAttributeContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.exportToCSVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.shipSelectControl = new EVEMon.SkillPlanner.ShipSelectControl();\n            this.gbRequiredSkills = new System.Windows.Forms.GroupBox();\n            this.requiredSkillsControl = new EVEMon.SkillPlanner.RequiredSkillsControl();\n            this.tbCntrlShipInformation = new System.Windows.Forms.TabControl();\n            this.tbPgShipDetails = new System.Windows.Forms.TabPage();\n            this.tbPgShipMastery = new System.Windows.Forms.TabPage();\n            this.pnlMastery = new System.Windows.Forms.Panel();\n            this.masteryTreeDisplayControl = new EVEMon.SkillPlanner.MasteryTreeDisplayControl();\n            this.tlStrpPlanTo = new System.Windows.Forms.ToolStrip();\n            this.tslbTextForEligibility = new System.Windows.Forms.ToolStripLabel();\n            this.tslbEligible = new System.Windows.Forms.ToolStripLabel();\n            this.tsPlanToMenu = new System.Windows.Forms.ToolStripDropDownButton();\n            this.tsPlanToLevelOne = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsPlanToLevelTwo = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsPlanToLevelThree = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsPlanToLevelFour = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsPlanToLevelFive = new System.Windows.Forms.ToolStripMenuItem();\n            this.splitButtonLoadouts = new EVEMon.Common.Controls.SplitButton();\n            this.LoadoutsProviderContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.lblViewLoadouts = new System.Windows.Forms.Label();\n            this.showInMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.showInSkillBrowser = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInItemBrowser = new System.Windows.Forms.ToolStripMenuItem();\n            ((System.ComponentModel.ISupportInitialize)(this.scObjectBrowser)).BeginInit();\n            this.scObjectBrowser.Panel1.SuspendLayout();\n            this.scObjectBrowser.Panel2.SuspendLayout();\n            this.scObjectBrowser.SuspendLayout();\n            this.pnlDetails.SuspendLayout();\n            this.pnlBrowserHeader.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.scDetailsRight)).BeginInit();\n            this.scDetailsRight.Panel1.SuspendLayout();\n            this.scDetailsRight.Panel2.SuspendLayout();\n            this.scDetailsRight.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.scDetails)).BeginInit();\n            this.scDetails.Panel1.SuspendLayout();\n            this.scDetails.Panel2.SuspendLayout();\n            this.scDetails.SuspendLayout();\n            this.gbDescription.SuspendLayout();\n            this.gbAttributes.SuspendLayout();\n            this.ShipAttributeContextMenu.SuspendLayout();\n            this.gbRequiredSkills.SuspendLayout();\n            this.tbCntrlShipInformation.SuspendLayout();\n            this.tbPgShipDetails.SuspendLayout();\n            this.tbPgShipMastery.SuspendLayout();\n            this.pnlMastery.SuspendLayout();\n            this.tlStrpPlanTo.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // scObjectBrowser\n            // \n            // \n            // scObjectBrowser.Panel1\n            // \n            this.scObjectBrowser.Panel1.Controls.Add(this.shipSelectControl);\n            this.scObjectBrowser.Size = new System.Drawing.Size(765, 512);\n            // \n            // pnlDetails\n            // \n            this.pnlDetails.Size = new System.Drawing.Size(597, 442);\n            // \n            // pnlBrowserHeader\n            // \n            this.pnlBrowserHeader.Controls.Add(this.lblViewLoadouts);\n            this.pnlBrowserHeader.Controls.Add(this.splitButtonLoadouts);\n            this.pnlBrowserHeader.Size = new System.Drawing.Size(597, 70);\n            this.pnlBrowserHeader.Controls.SetChildIndex(this.lblEveObjName, 0);\n            this.pnlBrowserHeader.Controls.SetChildIndex(this.lblEveObjCategory, 0);\n            this.pnlBrowserHeader.Controls.SetChildIndex(this.eoImage, 0);\n            this.pnlBrowserHeader.Controls.SetChildIndex(this.splitButtonLoadouts, 0);\n            this.pnlBrowserHeader.Controls.SetChildIndex(this.lblViewLoadouts, 0);\n            // \n            // scDetailsRight\n            // \n            // \n            // scDetailsRight.Panel1\n            // \n            this.scDetailsRight.Panel1.Padding = new System.Windows.Forms.Padding(0, 14, 0, 0);\n            // \n            // scDetailsRight.Panel2\n            // \n            this.scDetailsRight.Panel2.Controls.Add(this.gbRequiredSkills);\n            this.scDetailsRight.Panel2MinSize = 108;\n            this.scDetailsRight.Size = new System.Drawing.Size(240, 442);\n            this.scDetailsRight.SplitterDistance = 330;\n            // \n            // scDetails\n            // \n            // \n            // scDetails.Panel1\n            // \n            this.scDetails.Panel1.Controls.Add(this.tbCntrlShipInformation);\n            this.scDetails.Size = new System.Drawing.Size(597, 442);\n            this.scDetails.SplitterDistance = 353;\n            // \n            // gbDescription\n            // \n            this.gbDescription.Location = new System.Drawing.Point(0, 14);\n            this.gbDescription.Size = new System.Drawing.Size(240, 316);\n            // \n            // tbDescription\n            // \n            this.tbDescription.Size = new System.Drawing.Size(234, 297);\n            // \n            // gbAttributes\n            // \n            this.gbAttributes.Controls.Add(this.lvShipProperties);\n            this.gbAttributes.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbAttributes.Location = new System.Drawing.Point(3, 3);\n            this.gbAttributes.Name = \"gbAttributes\";\n            this.gbAttributes.Size = new System.Drawing.Size(339, 410);\n            this.gbAttributes.TabIndex = 4;\n            this.gbAttributes.TabStop = false;\n            this.gbAttributes.Text = \"Attributes\";\n            // \n            // lvShipProperties\n            // \n            this.lvShipProperties.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chAttribute,\n            this.chValue});\n            this.lvShipProperties.ContextMenuStrip = this.ShipAttributeContextMenu;\n            this.lvShipProperties.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvShipProperties.FullRowSelect = true;\n            this.lvShipProperties.HideSelection = false;\n            this.lvShipProperties.Location = new System.Drawing.Point(3, 16);\n            this.lvShipProperties.Name = \"lvShipProperties\";\n            this.lvShipProperties.Size = new System.Drawing.Size(333, 391);\n            this.lvShipProperties.TabIndex = 3;\n            this.lvShipProperties.UseCompatibleStateImageBehavior = false;\n            this.lvShipProperties.View = System.Windows.Forms.View.Details;\n            this.lvShipProperties.DoubleClick += new System.EventHandler(this.propertiesList_DoubleClick);\n            // \n            // chAttribute\n            // \n            this.chAttribute.Text = \"Attribute\";\n            this.chAttribute.Width = 120;\n            // \n            // chValue\n            // \n            this.chValue.Text = \"Value\";\n            this.chValue.Width = 120;\n            // \n            // ShipAttributeContextMenu\n            // \n            this.ShipAttributeContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showInSkillBrowser,\n            this.showInItemBrowser,\n            this.showInMenuSeparator,\n            this.exportToCSVToolStripMenuItem});\n            this.ShipAttributeContextMenu.Name = \"ShipPropertiesContextMenu\";\n            this.ShipAttributeContextMenu.Size = new System.Drawing.Size(189, 76);\n            this.ShipAttributeContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.ItemAttributeContextMenu_Opening);\n            // \n            // exportToCSVToolStripMenuItem\n            // \n            this.exportToCSVToolStripMenuItem.Name = \"exportToCSVToolStripMenuItem\";\n            this.exportToCSVToolStripMenuItem.Size = new System.Drawing.Size(188, 22);\n            this.exportToCSVToolStripMenuItem.Text = \"Export To CSV...\";\n            this.exportToCSVToolStripMenuItem.Click += new System.EventHandler(this.exportToCSVToolStripMenuItem_Click);\n            // \n            // shipSelectControl\n            // \n            this.shipSelectControl.AutoSize = true;\n            this.shipSelectControl.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.shipSelectControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.shipSelectControl.Location = new System.Drawing.Point(0, 0);\n            this.shipSelectControl.Margin = new System.Windows.Forms.Padding(2);\n            this.shipSelectControl.Name = \"shipSelectControl\";\n            this.shipSelectControl.Size = new System.Drawing.Size(163, 512);\n            this.shipSelectControl.TabIndex = 0;\n            // \n            // gbRequiredSkills\n            // \n            this.gbRequiredSkills.Controls.Add(this.requiredSkillsControl);\n            this.gbRequiredSkills.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbRequiredSkills.Location = new System.Drawing.Point(0, 0);\n            this.gbRequiredSkills.Name = \"gbRequiredSkills\";\n            this.gbRequiredSkills.Size = new System.Drawing.Size(240, 108);\n            this.gbRequiredSkills.TabIndex = 0;\n            this.gbRequiredSkills.TabStop = false;\n            this.gbRequiredSkills.Text = \"Required Skills\";\n            // \n            // requiredSkillsControl\n            // \n            this.requiredSkillsControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.requiredSkillsControl.Location = new System.Drawing.Point(3, 16);\n            this.requiredSkillsControl.MinimumSize = new System.Drawing.Size(187, 0);\n            this.requiredSkillsControl.Name = \"requiredSkillsControl\";\n            this.requiredSkillsControl.Size = new System.Drawing.Size(234, 89);\n            this.requiredSkillsControl.TabIndex = 0;\n            // \n            // tbCntrlShipInformation\n            // \n            this.tbCntrlShipInformation.Controls.Add(this.tbPgShipDetails);\n            this.tbCntrlShipInformation.Controls.Add(this.tbPgShipMastery);\n            this.tbCntrlShipInformation.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tbCntrlShipInformation.Location = new System.Drawing.Point(0, 0);\n            this.tbCntrlShipInformation.Name = \"tbCntrlShipInformation\";\n            this.tbCntrlShipInformation.SelectedIndex = 0;\n            this.tbCntrlShipInformation.Size = new System.Drawing.Size(353, 442);\n            this.tbCntrlShipInformation.TabIndex = 1;\n            // \n            // tbPgShipDetails\n            // \n            this.tbPgShipDetails.Controls.Add(this.gbAttributes);\n            this.tbPgShipDetails.Location = new System.Drawing.Point(4, 22);\n            this.tbPgShipDetails.Name = \"tbPgShipDetails\";\n            this.tbPgShipDetails.Padding = new System.Windows.Forms.Padding(3);\n            this.tbPgShipDetails.Size = new System.Drawing.Size(345, 416);\n            this.tbPgShipDetails.TabIndex = 0;\n            this.tbPgShipDetails.Text = \"Overview\";\n            this.tbPgShipDetails.UseVisualStyleBackColor = true;\n            // \n            // tbPgShipMastery\n            // \n            this.tbPgShipMastery.Controls.Add(this.pnlMastery);\n            this.tbPgShipMastery.Location = new System.Drawing.Point(4, 22);\n            this.tbPgShipMastery.Name = \"tbPgShipMastery\";\n            this.tbPgShipMastery.Padding = new System.Windows.Forms.Padding(3);\n            this.tbPgShipMastery.Size = new System.Drawing.Size(230, 317);\n            this.tbPgShipMastery.TabIndex = 1;\n            this.tbPgShipMastery.Text = \"Mastery\";\n            this.tbPgShipMastery.UseVisualStyleBackColor = true;\n            // \n            // pnlMastery\n            // \n            this.pnlMastery.Controls.Add(this.masteryTreeDisplayControl);\n            this.pnlMastery.Controls.Add(this.tlStrpPlanTo);\n            this.pnlMastery.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pnlMastery.Location = new System.Drawing.Point(3, 3);\n            this.pnlMastery.Name = \"pnlMastery\";\n            this.pnlMastery.Size = new System.Drawing.Size(224, 311);\n            this.pnlMastery.TabIndex = 2;\n            // \n            // masteryTreeDisplayControl\n            // \n            this.masteryTreeDisplayControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.masteryTreeDisplayControl.Location = new System.Drawing.Point(0, 25);\n            this.masteryTreeDisplayControl.Name = \"masteryTreeDisplayControl\";\n            this.masteryTreeDisplayControl.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10);\n            this.masteryTreeDisplayControl.Size = new System.Drawing.Size(224, 286);\n            this.masteryTreeDisplayControl.TabIndex = 2;\n            // \n            // tlStrpPlanTo\n            // \n            this.tlStrpPlanTo.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n            this.tlStrpPlanTo.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tslbTextForEligibility,\n            this.tslbEligible,\n            this.tsPlanToMenu});\n            this.tlStrpPlanTo.Location = new System.Drawing.Point(0, 0);\n            this.tlStrpPlanTo.Name = \"tlStrpPlanTo\";\n            this.tlStrpPlanTo.Size = new System.Drawing.Size(224, 25);\n            this.tlStrpPlanTo.TabIndex = 1;\n            this.tlStrpPlanTo.Text = \"toolStrip1\";\n            // \n            // tslbTextForEligibility\n            // \n            this.tslbTextForEligibility.Name = \"tslbTextForEligibility\";\n            this.tslbTextForEligibility.Size = new System.Drawing.Size(202, 22);\n            this.tslbTextForEligibility.Text = \"After this plan you will be eligible to :\";\n            // \n            // tslbEligible\n            // \n            this.tslbEligible.Name = \"tslbEligible\";\n            this.tslbEligible.Size = new System.Drawing.Size(34, 22);\n            this.tslbEligible.Text = \"none\";\n            // \n            // tsPlanToMenu\n            // \n            this.tsPlanToMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tsPlanToLevelOne,\n            this.tsPlanToLevelTwo,\n            this.tsPlanToLevelThree,\n            this.tsPlanToLevelFour,\n            this.tsPlanToLevelFive});\n            this.tsPlanToMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"tsPlanToMenu.Image\")));\n            this.tsPlanToMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsPlanToMenu.Name = \"tsPlanToMenu\";\n            this.tsPlanToMenu.Size = new System.Drawing.Size(84, 22);\n            this.tsPlanToMenu.Text = \"Plan To...\";\n            // \n            // tsPlanToLevelOne\n            // \n            this.tsPlanToLevelOne.Name = \"tsPlanToLevelOne\";\n            this.tsPlanToLevelOne.Size = new System.Drawing.Size(114, 22);\n            this.tsPlanToLevelOne.Text = \"&Level I\";\n            this.tsPlanToLevelOne.Click += new System.EventHandler(this.tsPlanToLevel_Click);\n            // \n            // tsPlanToLevelTwo\n            // \n            this.tsPlanToLevelTwo.Name = \"tsPlanToLevelTwo\";\n            this.tsPlanToLevelTwo.Size = new System.Drawing.Size(114, 22);\n            this.tsPlanToLevelTwo.Text = \"&Level II\";\n            this.tsPlanToLevelTwo.Click += new System.EventHandler(this.tsPlanToLevel_Click);\n            // \n            // tsPlanToLevelThree\n            // \n            this.tsPlanToLevelThree.Name = \"tsPlanToLevelThree\";\n            this.tsPlanToLevelThree.Size = new System.Drawing.Size(114, 22);\n            this.tsPlanToLevelThree.Text = \"&Level III\";\n            this.tsPlanToLevelThree.Click += new System.EventHandler(this.tsPlanToLevel_Click);\n            // \n            // tsPlanToLevelFour\n            // \n            this.tsPlanToLevelFour.Name = \"tsPlanToLevelFour\";\n            this.tsPlanToLevelFour.Size = new System.Drawing.Size(114, 22);\n            this.tsPlanToLevelFour.Text = \"&Level IV\";\n            this.tsPlanToLevelFour.Click += new System.EventHandler(this.tsPlanToLevel_Click);\n            // \n            // tsPlanToLevelFive\n            // \n            this.tsPlanToLevelFive.Name = \"tsPlanToLevelFive\";\n            this.tsPlanToLevelFive.Size = new System.Drawing.Size(114, 22);\n            this.tsPlanToLevelFive.Text = \"&Level V\";\n            this.tsPlanToLevelFive.Click += new System.EventHandler(this.tsPlanToLevel_Click);\n            // \n            // splitButtonLoadouts\n            // \n            this.splitButtonLoadouts.AutoSize = true;\n            this.splitButtonLoadouts.ContextMenuStrip = this.LoadoutsProviderContextMenuStrip;\n            this.splitButtonLoadouts.Location = new System.Drawing.Point(170, 44);\n            this.splitButtonLoadouts.Name = \"splitButtonLoadouts\";\n            this.splitButtonLoadouts.Size = new System.Drawing.Size(97, 23);\n            this.splitButtonLoadouts.TabIndex = 12;\n            this.splitButtonLoadouts.Text = \"Select provider\";\n            this.splitButtonLoadouts.UseVisualStyleBackColor = true;\n            this.splitButtonLoadouts.Click += new System.EventHandler(this.splitButtonLoadouts_Click);\n            // \n            // LoadoutsProviderContextMenuStrip\n            // \n            this.LoadoutsProviderContextMenuStrip.Name = \"LoadoutsProviderContextMenuStrip\";\n            this.LoadoutsProviderContextMenuStrip.Size = new System.Drawing.Size(61, 4);\n            // \n            // lblViewLoadouts\n            // \n            this.lblViewLoadouts.AutoSize = true;\n            this.lblViewLoadouts.Location = new System.Drawing.Point(70, 49);\n            this.lblViewLoadouts.Name = \"lblViewLoadouts\";\n            this.lblViewLoadouts.Size = new System.Drawing.Size(99, 13);\n            this.lblViewLoadouts.TabIndex = 13;\n            this.lblViewLoadouts.Text = \"View loadouts from:\";\n            // \n            // showInMenuSeparator\n            // \n            this.showInMenuSeparator.Name = \"showInMenuSeparator\";\n            this.showInMenuSeparator.Size = new System.Drawing.Size(185, 6);\n            // \n            // showInSkillBrowser\n            // \n            this.showInSkillBrowser.Name = \"showInSkillBrowser\";\n            this.showInSkillBrowser.Size = new System.Drawing.Size(188, 22);\n            this.showInSkillBrowser.Text = \"Show In Skill Browser\";\n            this.showInSkillBrowser.Click += new System.EventHandler(this.propertiesList_DoubleClick);\n            // \n            // showInItemBrowser\n            // \n            this.showInItemBrowser.Name = \"showInItemBrowser\";\n            this.showInItemBrowser.Size = new System.Drawing.Size(188, 22);\n            this.showInItemBrowser.Text = \"Show In Item Browser\";\n            this.showInItemBrowser.Click += new System.EventHandler(this.propertiesList_DoubleClick);\n            // \n            // ShipBrowserControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Name = \"ShipBrowserControl\";\n            this.Size = new System.Drawing.Size(765, 512);\n            this.Controls.SetChildIndex(this.scObjectBrowser, 0);\n            this.scObjectBrowser.Panel1.ResumeLayout(false);\n            this.scObjectBrowser.Panel1.PerformLayout();\n            this.scObjectBrowser.Panel2.ResumeLayout(false);\n            this.scObjectBrowser.Panel2.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.scObjectBrowser)).EndInit();\n            this.scObjectBrowser.ResumeLayout(false);\n            this.pnlDetails.ResumeLayout(false);\n            this.pnlBrowserHeader.ResumeLayout(false);\n            this.pnlBrowserHeader.PerformLayout();\n            this.scDetailsRight.Panel1.ResumeLayout(false);\n            this.scDetailsRight.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.scDetailsRight)).EndInit();\n            this.scDetailsRight.ResumeLayout(false);\n            this.scDetails.Panel1.ResumeLayout(false);\n            this.scDetails.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.scDetails)).EndInit();\n            this.scDetails.ResumeLayout(false);\n            this.gbDescription.ResumeLayout(false);\n            this.gbAttributes.ResumeLayout(false);\n            this.ShipAttributeContextMenu.ResumeLayout(false);\n            this.gbRequiredSkills.ResumeLayout(false);\n            this.tbCntrlShipInformation.ResumeLayout(false);\n            this.tbPgShipDetails.ResumeLayout(false);\n            this.tbPgShipMastery.ResumeLayout(false);\n            this.pnlMastery.ResumeLayout(false);\n            this.pnlMastery.PerformLayout();\n            this.tlStrpPlanTo.ResumeLayout(false);\n            this.tlStrpPlanTo.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ListView lvShipProperties;\n        private System.Windows.Forms.ColumnHeader chAttribute;\n        private System.Windows.Forms.ColumnHeader chValue;\n        private ShipSelectControl shipSelectControl;\n        private System.Windows.Forms.GroupBox gbAttributes;\n        private System.Windows.Forms.ContextMenuStrip ShipAttributeContextMenu;\n        private System.Windows.Forms.ToolStripMenuItem exportToCSVToolStripMenuItem;\n        private System.Windows.Forms.GroupBox gbRequiredSkills;\n        private RequiredSkillsControl requiredSkillsControl;\n        private System.Windows.Forms.TabControl tbCntrlShipInformation;\n        private System.Windows.Forms.TabPage tbPgShipDetails;\n        private System.Windows.Forms.TabPage tbPgShipMastery;\n        private System.Windows.Forms.ToolStrip tlStrpPlanTo;\n        private System.Windows.Forms.ToolStripDropDownButton tsPlanToMenu;\n        private System.Windows.Forms.ToolStripMenuItem tsPlanToLevelOne;\n        private System.Windows.Forms.ToolStripMenuItem tsPlanToLevelTwo;\n        private System.Windows.Forms.ToolStripMenuItem tsPlanToLevelThree;\n        private System.Windows.Forms.ToolStripMenuItem tsPlanToLevelFour;\n        private System.Windows.Forms.ToolStripMenuItem tsPlanToLevelFive;\n        private System.Windows.Forms.Panel pnlMastery;\n        private MasteryTreeDisplayControl masteryTreeDisplayControl;\n        private System.Windows.Forms.ToolStripLabel tslbTextForEligibility;\n        private System.Windows.Forms.ToolStripLabel tslbEligible;\n        private Common.Controls.SplitButton splitButtonLoadouts;\n        private System.Windows.Forms.Label lblViewLoadouts;\n        private System.Windows.Forms.ContextMenuStrip LoadoutsProviderContextMenuStrip;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillBrowser;\n        private System.Windows.Forms.ToolStripMenuItem showInItemBrowser;\n        private System.Windows.Forms.ToolStripSeparator showInMenuSeparator;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ShipBrowserControl.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Loadouts;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    internal partial class ShipBrowserControl : EveObjectBrowserControl\n    {\n        #region Constructors\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public ShipBrowserControl()\n        {\n            InitializeComponent();\n            scObjectBrowser.RememberDistanceKey = \"ShipsBrowser_Left\";\n            SelectControl = shipSelectControl;\n            PropertiesList = lvShipProperties;\n\n            PropertiesList.MouseDown += PropertiesList_MouseDown;\n            PropertiesList.MouseMove += PropertiesList_MouseMove;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Occurs when the settings changed.\n        /// </summary>\n        protected override void OnSettingsChanged()\n        {\n            base.OnSettingsChanged();\n\n            UpdateControlVisibility();\n        }\n\n        /// <summary>\n        /// Occurs when the conrol loads.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            if (Character != null)\n            {\n                ToolStripItem[] toolStripItems = LoadoutsProvider.Providers\n                    .Select(provider => new ToolStripMenuItem(provider.Name))\n                    .ToArray<ToolStripItem>();\n\n                LoadoutsProviderContextMenuStrip.Items.AddRange(toolStripItems);\n\n                foreach (ToolStripMenuItem toolStripItem in LoadoutsProviderContextMenuStrip.Items)\n                {\n                    toolStripItem.Click += toolStripItem_Click;\n                }\n\n                splitButtonLoadouts.Text = Settings.LoadoutsProvider.Provider?.Name;\n            }\n\n            lblViewLoadouts.Visible = splitButtonLoadouts.Visible = Character != null;\n\n            UpdateControlVisibility();\n        }\n\n        /// <summary>\n        /// Updates the controls when the selection is changed.\n        /// </summary>\n        protected override void OnSelectionChanged()\n        {\n            base.OnSelectionChanged();\n            if (SelectedObject == null)\n                return;\n\n            // Description\n            tbDescription.Text = SelectedObject.Description;\n\n            // Required Skills\n            requiredSkillsControl.Object = SelectedObject;\n\n            // Update the Mastery tab\n            masteryTreeDisplayControl.MasteryShip = Character?.MasteryShips.GetMasteryShipByID(SelectedObject.ID);\n\n            ShipLoadoutSelectWindow loadoutSelect = WindowsFactory.GetByTag<ShipLoadoutSelectWindow, Character>(Character);\n            if (loadoutSelect != null)\n                loadoutSelect.Ship = shipSelectControl.SelectedObject;\n\n            // Update the eligibity controls\n            UpdateEligibility();\n        }\n\n        /// <summary>\n        /// Updates whenever the selected plan changed.\n        /// </summary>\n        protected override void OnSelectedPlanChanged()\n        {\n            base.OnSelectedPlanChanged();\n\n            requiredSkillsControl.Plan = Plan;\n            masteryTreeDisplayControl.Plan = Plan;\n\n            // We recalculate the right panels minimum size\n            int reqSkillControlMinWidth = requiredSkillsControl.MinimumSize.Width;\n            int reqSkillPanelMinWidth = scDetails.Panel2MinSize;\n            scDetails.Panel2MinSize = reqSkillPanelMinWidth > reqSkillControlMinWidth\n                ? reqSkillPanelMinWidth\n                : reqSkillControlMinWidth;\n\n            UpdateEligibility();\n        }\n\n        /// <summary>\n        /// Updates whenever the plan changed.\n        /// </summary>\n        protected override void OnPlanChanged()\n        {\n            UpdateEligibility();\n        }\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Exports item info to CSV format.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void exportToCSVToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            ListViewExporter.CreateCSV(PropertiesList, true);\n        }\n\n        /// <summary>\n        /// Plan to Level N.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void tsPlanToLevel_Click(object sender, EventArgs e)\n        {\n            IPlanOperation operation = ((ToolStripMenuItem)sender).Tag as IPlanOperation;\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            if (planWindow == null)\n                return;\n\n            PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow, operation);\n        }\n\n        /// <summary>\n        /// Occurs when clicking a menu item.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void toolStripItem_Click(object sender, EventArgs e)\n        {\n            ToolStripMenuItem control = sender as ToolStripMenuItem;\n\n            if (control == null)\n                return;\n\n            splitButtonLoadouts.Text = control.Text;\n            Settings.LoadoutsProvider.ProviderName = control.Text;\n        }\n\n        /// <summary>\n        /// Occurs when clicking the button.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void splitButtonLoadouts_Click(object sender, EventArgs e)\n        {\n            if (Character == null)\n                return;\n\n            if (Settings.LoadoutsProvider.Provider == null)\n                return;\n\n            ShipLoadoutSelectWindow loadoutWindow;\n            if (Plan != null)\n            {\n                loadoutWindow = WindowsFactory.GetByTag<ShipLoadoutSelectWindow, Character>(Character);\n\n                if (loadoutWindow == null)\n                {\n                    loadoutWindow = WindowsFactory.ShowByTag<ShipLoadoutSelectWindow, Plan>(Plan);\n                    WindowsFactory.ChangeTag<ShipLoadoutSelectWindow, Plan, Character>(Plan, Character);\n                }\n                else\n                    loadoutWindow = WindowsFactory.ShowByTag<ShipLoadoutSelectWindow, Character>(Character);\n            }\n            else\n                loadoutWindow = WindowsFactory.ShowByTag<ShipLoadoutSelectWindow, Character>(Character);\n\n            loadoutWindow.Ship = SelectedObject;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void PropertiesList_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            PropertiesList.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void PropertiesList_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            PropertiesList.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Occurs when double clicking on a list view item.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void propertiesList_DoubleClick(object sender, EventArgs e)\n        {\n            // Is it a skill?\n            Skill skill = PropertiesList.FocusedItem?.Tag as Skill;\n\n            if (skill != null)\n            {\n                PlanWindow.ShowPlanWindow(SelectControl.Character, Plan)?.ShowSkillInBrowser(skill);\n                return;\n            }\n\n            // Is it an item?\n            Item item = PropertiesList.FocusedItem?.Tag as Item;\n\n            if (item != null)\n                PlanWindow.ShowPlanWindow(SelectControl.Character, Plan)?.ShowItemInBrowser(item);\n        }\n\n        /// <summary>\n        /// Handles the Opening event of the ItemAttributeContextMenu control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.CancelEventArgs\"/> instance containing the event data.</param>\n        private void ItemAttributeContextMenu_Opening(object sender, CancelEventArgs e)\n        {\n            // Is it a skill?\n            Skill skill = PropertiesList.FocusedItem?.Tag as Skill;\n            showInSkillBrowser.Visible = skill != null;\n\n            // Is it an item?\n            Item item = PropertiesList.FocusedItem?.Tag as Item;\n            showInItemBrowser.Visible = item != null;\n\n            showInMenuSeparator.Visible = skill != null || item != null;\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Replaces the user set search string with another.\n        /// </summary>\n        /// <param name=\"text\">The text to replace it with.</param>\n        internal void SetSearchText(string text)\n        {\n            shipSelectControl.SearchText = text;\n        }\n\n        /// <summary>\n        /// Updates the contol visibility.\n        /// </summary>\n        private void UpdateControlVisibility()\n        {\n            if (Character == null)\n                tbCntrlShipInformation.TabPages.Remove(tbPgShipMastery);\n\n            lblViewLoadouts.Location = Settings.UI.SafeForWork\n                ? new Point(Pad, lblViewLoadouts.Location.Y)\n                : new Point(eoImage.Width + Pad * 2, lblViewLoadouts.Location.Y);\n\n            splitButtonLoadouts.Location = Settings.UI.SafeForWork\n                ? new Point(Pad + lblViewLoadouts.Width, splitButtonLoadouts.Location.Y)\n                : new Point(eoImage.Width + lblViewLoadouts.Width + Pad * 2, splitButtonLoadouts.Location.Y);\n        }\n\n        /// <summary>\n        /// Updates eligibility label and planning menus.\n        /// </summary>\n        private void UpdateEligibility()\n        {\n            foreach (ToolStripItem control in tlStrpPlanTo.Items)\n            {\n                control.Visible = Plan != null;\n            }\n\n            // Not visible\n            if (SelectedObject == null || Plan == null)\n                return;\n\n            MasteryShip masteryShip = masteryTreeDisplayControl.MasteryShip;\n\n            if (masteryShip == null)\n                return;\n\n            // First we search the highest eligible mastery level after this plan\n            IEnumerable<Mastery> eligibleMasteryLevel =\n                masteryShip.TakeWhile(masteryLevel => Plan.WillGrantEligibilityFor(masteryLevel)).ToList();\n\n            Mastery lastEligibleMasteryLevel = null;\n            if (!eligibleMasteryLevel.Any())\n            {\n                tslbEligible.Text = @\"(none)\";\n            }\n            else\n            {\n                lastEligibleMasteryLevel = eligibleMasteryLevel.Last();\n                tslbEligible.Text = lastEligibleMasteryLevel.ToString();\n\n                if (masteryShip.HighestTrainedLevel == null)\n                {\n                    tslbEligible.Text += @\" (improved from \"\"none\"\")\";\n                }\n                else if (lastEligibleMasteryLevel.Level > masteryShip.HighestTrainedLevel.Level)\n                {\n                    tslbEligible.Text += string.Format(CultureConstants.DefaultCulture, \" (improved from \\\"{0}\\\")\",\n                        masteryShip.HighestTrainedLevel);\n                }\n                else\n                {\n                    tslbEligible.Text += @\" (no change)\";\n                }\n            }\n\n            // \"Plan to N\" menus\n            for (int i = 1; i <= 5; i++)\n            {\n                UpdatePlanningMenuStatus(tsPlanToMenu.DropDownItems[i - 1], masteryShip.GetLevel(i), lastEligibleMasteryLevel);\n            }\n        }\n\n        /// <summary>\n        /// Updates a \"plan to\" menu.\n        /// </summary>\n        /// <param name=\"menu\">The menu to update</param>\n        /// <param name=\"masteryLevel\">The level represent by this menu</param>\n        /// <param name=\"lastEligibleMasteryLevel\">The highest eligible mastery after this plan</param>\n        private void UpdatePlanningMenuStatus(ToolStripItem menu, Mastery masteryLevel, Mastery lastEligibleMasteryLevel)\n        {\n            menu.Visible = masteryLevel != null;\n            menu.Enabled = masteryLevel != null &&\n                           (lastEligibleMasteryLevel == null || masteryLevel.Level > lastEligibleMasteryLevel.Level);\n\n            if (menu.Enabled)\n                menu.Tag = Plan.TryPlanTo(masteryLevel);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ShipBrowserControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"LoadoutsProviderContextMenuStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>340, 17</value>\n  </metadata>\n  <metadata name=\"ShipAttributeContextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"tlStrpPlanTo.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>222, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"tsPlanToMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALSSURBVDhPZZLZTxNRFIeJ/5Fx9IkoKg8m+mCMcY8GNQgJ\n        CoEQbARSDGpla8u+tRMobacLdJl2SqGUrixtpQstlB3FSAbjg/FNTX/edqqG8ktO5uV83z3n3in6m+29\n        PW86nXYnEilLOBo3ekMR/WxwSTcdCObK6QsyDm+ggrSeEoiCpHd2+GR6A95IDAZ3AP2sExIde6w6J+2/\n        pRNMI2k/KUmup/mv33/g49E3rB8cwpfaxOLGLjzJTeiDEegC4Vz1Ttl/9WqMJyX+eILfPjxCdPcAy5u7\n        CG3tYS6RhsYXOlHtBvZnq3rqXB4Vwi4s85HtfXLyFizLMTDktEJwbH4Jbawb12WqzE352IU8KkQ95+Fn\n        Ymtgw/GcwLQUxeTiSu5rCcWgdC+iXmtHmWISF9uURKA+LpBZHLxjJYnUpy9Y/3yYu4fA2hZZZR/OeBrG\n        0CparfOomrChtGMsc7evQCA12fmZaAphAniSG/AT2EXuoMvuRbttHu12H6TOIGpHDchQFDY625FHhbRo\n        zTzjDyM7RXZ0qc2NZj1Hdp5HA8NBpJ9Gp9UFQ0sLMndu5CR5VMh7A8uz4QS4D6vo4TyoHTdhmJ1FIwHf\n        ktHlrAXd3d3gOA79NdUYHFSU51EhbxiWN5PLc6ykMOJagNofgZTzQrsQBe2ahnOYQnyGglgsxtMhfeaZ\n        ii3Jo0JE9BRfOaRB+aAGFSM6vFAa8WiQQR2t+gdrZRSaDSxu02bUTM5dyqNCrryW8w9kNJ4MqFFF4Jpx\n        0qSkwQz8h+sndKgxuHCfZlFr9V3Oo0JKxDK+1eiAKRSHZ20b/kQCJqUAj0goIlWjUuNA3ZQbD8ftqC8U\n        nG+S8WW9KlQpjBCRH4bpK0bQ0QFVF4XnZI1ylQ3V+lm8tPrwWO2AiAseF5xukPBnRB2gXklxtkkOijyT\n        vJnCVUkPit+NorRLhWsDOtxSmHGPzk6QFRQV/QFZaUl1TyHaOQAAAABJRU5ErkJggg==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ShipLoadoutSelectWindow.Designer.cs",
    "content": "\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.SkillPlanner\n{\n    partial class ShipLoadoutSelectWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ShipLoadoutSelectWindow));\n            this.lblLoadouts = new System.Windows.Forms.Label();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.lowerPanel = new System.Windows.Forms.Panel();\n            this.persistentSplitContainer = new EVEMon.Common.Controls.PersistentSplitContainer();\n            this.lvLoadouts = new System.Windows.Forms.ListView();\n            this.colName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.colAuthor = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.colRating = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.colDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.ilIcons = new System.Windows.Forms.ImageList(this.components);\n            this.tvLoadout = new System.Windows.Forms.TreeView();\n            this.throbberFitting = new EVEMon.Common.Controls.Throbber();\n            this.throbberLoadouts = new EVEMon.Common.Controls.Throbber();\n            this.lblSubmitDate = new System.Windows.Forms.Label();\n            this.SubDateLabel = new System.Windows.Forms.Label();\n            this.AuthorLabel = new System.Windows.Forms.Label();\n            this.LoadoutNameLabel = new System.Windows.Forms.Label();\n            this.ShipLabel = new System.Windows.Forms.Label();\n            this.lblAuthor = new System.Windows.Forms.Label();\n            this.lblLoadoutName = new System.Windows.Forms.Label();\n            this.lblShipName = new System.Windows.Forms.Label();\n            this.lblPlanned = new System.Windows.Forms.Label();\n            this.TrainingTimeLabel = new System.Windows.Forms.Label();\n            this.lblTrainTime = new System.Windows.Forms.Label();\n            this.btnPlan = new System.Windows.Forms.Button();\n            this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.miShowInBrowser = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInMenuSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.miExportToClipboard = new System.Windows.Forms.ToolStripMenuItem();\n            this.exportLoadoutSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.cmiExpandSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmiCollapseSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.selectedSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.cmiExpandAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmiCollapseAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.eveImage = new EVEMon.Common.Controls.EveImage();\n            this.buttonForumTopic = new System.Windows.Forms.Button();\n            this.lowerPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.persistentSplitContainer)).BeginInit();\n            this.persistentSplitContainer.Panel1.SuspendLayout();\n            this.persistentSplitContainer.Panel2.SuspendLayout();\n            this.persistentSplitContainer.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.throbberFitting)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.throbberLoadouts)).BeginInit();\n            this.contextMenu.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // lblLoadouts\n            // \n            this.lblLoadouts.AutoSize = true;\n            this.lblLoadouts.Location = new System.Drawing.Point(114, 82);\n            this.lblLoadouts.Name = \"lblLoadouts\";\n            this.lblLoadouts.Size = new System.Drawing.Size(101, 13);\n            this.lblLoadouts.TabIndex = 1;\n            this.lblLoadouts.Text = \"Found {0} Loadouts\";\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(641, 471);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 3;\n            this.btnCancel.Text = \"Close\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // lowerPanel\n            // \n            this.lowerPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lowerPanel.Controls.Add(this.persistentSplitContainer);\n            this.lowerPanel.Controls.Add(this.throbberLoadouts);\n            this.lowerPanel.Location = new System.Drawing.Point(6, 123);\n            this.lowerPanel.Name = \"lowerPanel\";\n            this.lowerPanel.Size = new System.Drawing.Size(716, 342);\n            this.lowerPanel.TabIndex = 6;\n            // \n            // persistentSplitContainer\n            // \n            this.persistentSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.persistentSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\n            this.persistentSplitContainer.Location = new System.Drawing.Point(0, 0);\n            this.persistentSplitContainer.Name = \"persistentSplitContainer\";\n            // \n            // persistentSplitContainer.Panel1\n            // \n            this.persistentSplitContainer.Panel1.Controls.Add(this.lvLoadouts);\n            this.persistentSplitContainer.Panel1MinSize = 300;\n            // \n            // persistentSplitContainer.Panel2\n            // \n            this.persistentSplitContainer.Panel2.Controls.Add(this.tvLoadout);\n            this.persistentSplitContainer.Panel2.Controls.Add(this.throbberFitting);\n            this.persistentSplitContainer.RememberDistanceKey = null;\n            this.persistentSplitContainer.Size = new System.Drawing.Size(716, 342);\n            this.persistentSplitContainer.SplitterDistance = 373;\n            this.persistentSplitContainer.TabIndex = 5;\n            // \n            // lvLoadouts\n            // \n            this.lvLoadouts.AllowColumnReorder = true;\n            this.lvLoadouts.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.colName,\n            this.colAuthor,\n            this.colRating,\n            this.colDate});\n            this.lvLoadouts.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvLoadouts.FullRowSelect = true;\n            this.lvLoadouts.HideSelection = false;\n            this.lvLoadouts.Location = new System.Drawing.Point(0, 0);\n            this.lvLoadouts.MinimumSize = new System.Drawing.Size(300, 190);\n            this.lvLoadouts.MultiSelect = false;\n            this.lvLoadouts.Name = \"lvLoadouts\";\n            this.lvLoadouts.Size = new System.Drawing.Size(373, 342);\n            this.lvLoadouts.SmallImageList = this.ilIcons;\n            this.lvLoadouts.TabIndex = 0;\n            this.lvLoadouts.UseCompatibleStateImageBehavior = false;\n            this.lvLoadouts.View = System.Windows.Forms.View.Details;\n            this.lvLoadouts.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvLoadouts_ColumnClick);\n            this.lvLoadouts.Click += new System.EventHandler(this.lvLoadouts_Click);\n            // \n            // colName\n            // \n            this.colName.Text = \"Name\";\n            this.colName.Width = 153;\n            // \n            // colAuthor\n            // \n            this.colAuthor.Text = \"Author\";\n            this.colAuthor.Width = 68;\n            // \n            // colRating\n            // \n            this.colRating.Text = \"Rating\";\n            this.colRating.Width = 56;\n            // \n            // colDate\n            // \n            this.colDate.Text = \"Date\";\n            this.colDate.Width = 90;\n            // \n            // ilIcons\n            // \n            this.ilIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilIcons.ImageStream\")));\n            this.ilIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilIcons.Images.SetKeyName(0, \"arrow_up.png\");\n            this.ilIcons.Images.SetKeyName(1, \"arrow_down.png\");\n            this.ilIcons.Images.SetKeyName(2, \"16x16Transparant.png\");\n            // \n            // tvLoadout\n            // \n            this.tvLoadout.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tvLoadout.HideSelection = false;\n            this.tvLoadout.Location = new System.Drawing.Point(0, 0);\n            this.tvLoadout.Name = \"tvLoadout\";\n            this.tvLoadout.Size = new System.Drawing.Size(339, 342);\n            this.tvLoadout.TabIndex = 3;\n            this.tvLoadout.DoubleClick += new System.EventHandler(this.tvLoadout_DoubleClick);\n            this.tvLoadout.MouseMove += new System.Windows.Forms.MouseEventHandler(this.tvLoadout_MouseMove);\n            this.tvLoadout.MouseUp += new System.Windows.Forms.MouseEventHandler(this.tvLoadout_MouseUp);\n            // \n            // throbberFitting\n            // \n            this.throbberFitting.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.throbberFitting.BackColor = System.Drawing.SystemColors.Window;\n            this.throbberFitting.Location = new System.Drawing.Point(157, 159);\n            this.throbberFitting.MaximumSize = new System.Drawing.Size(24, 24);\n            this.throbberFitting.MinimumSize = new System.Drawing.Size(24, 24);\n            this.throbberFitting.Name = \"throbberFitting\";\n            this.throbberFitting.Size = new System.Drawing.Size(24, 24);\n            this.throbberFitting.State = EVEMon.Common.Enumerations.ThrobberState.Stopped;\n            this.throbberFitting.TabIndex = 4;\n            this.throbberFitting.TabStop = false;\n            // \n            // throbberLoadouts\n            // \n            this.throbberLoadouts.Anchor = System.Windows.Forms.AnchorStyles.None;\n            this.throbberLoadouts.BackColor = System.Drawing.Color.Transparent;\n            this.throbberLoadouts.Location = new System.Drawing.Point(346, 159);\n            this.throbberLoadouts.MaximumSize = new System.Drawing.Size(24, 24);\n            this.throbberLoadouts.MinimumSize = new System.Drawing.Size(24, 24);\n            this.throbberLoadouts.Name = \"throbberLoadouts\";\n            this.throbberLoadouts.Size = new System.Drawing.Size(24, 24);\n            this.throbberLoadouts.State = EVEMon.Common.Enumerations.ThrobberState.Stopped;\n            this.throbberLoadouts.TabIndex = 6;\n            this.throbberLoadouts.TabStop = false;\n            // \n            // lblSubmitDate\n            // \n            this.lblSubmitDate.AutoSize = true;\n            this.lblSubmitDate.Location = new System.Drawing.Point(204, 51);\n            this.lblSubmitDate.Name = \"lblSubmitDate\";\n            this.lblSubmitDate.Size = new System.Drawing.Size(62, 13);\n            this.lblSubmitDate.TabIndex = 25;\n            this.lblSubmitDate.Text = \"SubmitDate\";\n            // \n            // SubDateLabel\n            // \n            this.SubDateLabel.AutoSize = true;\n            this.SubDateLabel.Location = new System.Drawing.Point(114, 51);\n            this.SubDateLabel.Name = \"SubDateLabel\";\n            this.SubDateLabel.Size = new System.Drawing.Size(89, 13);\n            this.SubDateLabel.TabIndex = 24;\n            this.SubDateLabel.Text = \"Submission Date:\";\n            // \n            // AuthorLabel\n            // \n            this.AuthorLabel.AutoSize = true;\n            this.AuthorLabel.Location = new System.Drawing.Point(114, 38);\n            this.AuthorLabel.Name = \"AuthorLabel\";\n            this.AuthorLabel.Size = new System.Drawing.Size(41, 13);\n            this.AuthorLabel.TabIndex = 22;\n            this.AuthorLabel.Text = \"Author:\";\n            // \n            // LoadoutNameLabel\n            // \n            this.LoadoutNameLabel.AutoSize = true;\n            this.LoadoutNameLabel.Location = new System.Drawing.Point(114, 25);\n            this.LoadoutNameLabel.Name = \"LoadoutNameLabel\";\n            this.LoadoutNameLabel.Size = new System.Drawing.Size(80, 13);\n            this.LoadoutNameLabel.TabIndex = 21;\n            this.LoadoutNameLabel.Text = \"Loadout Name:\";\n            // \n            // ShipLabel\n            // \n            this.ShipLabel.AutoSize = true;\n            this.ShipLabel.Location = new System.Drawing.Point(114, 12);\n            this.ShipLabel.Name = \"ShipLabel\";\n            this.ShipLabel.Size = new System.Drawing.Size(31, 13);\n            this.ShipLabel.TabIndex = 20;\n            this.ShipLabel.Text = \"Ship:\";\n            // \n            // lblAuthor\n            // \n            this.lblAuthor.AutoSize = true;\n            this.lblAuthor.Location = new System.Drawing.Point(204, 38);\n            this.lblAuthor.Name = \"lblAuthor\";\n            this.lblAuthor.Size = new System.Drawing.Size(66, 13);\n            this.lblAuthor.TabIndex = 19;\n            this.lblAuthor.Text = \"AuthorName\";\n            // \n            // lblLoadoutName\n            // \n            this.lblLoadoutName.AutoSize = true;\n            this.lblLoadoutName.Location = new System.Drawing.Point(204, 25);\n            this.lblLoadoutName.Name = \"lblLoadoutName\";\n            this.lblLoadoutName.Size = new System.Drawing.Size(74, 13);\n            this.lblLoadoutName.TabIndex = 18;\n            this.lblLoadoutName.Text = \"LoadoutName\";\n            // \n            // lblShipName\n            // \n            this.lblShipName.AutoSize = true;\n            this.lblShipName.Location = new System.Drawing.Point(204, 12);\n            this.lblShipName.Name = \"lblShipName\";\n            this.lblShipName.Size = new System.Drawing.Size(56, 13);\n            this.lblShipName.TabIndex = 17;\n            this.lblShipName.Text = \"ShipName\";\n            // \n            // lblPlanned\n            // \n            this.lblPlanned.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.lblPlanned.AutoSize = true;\n            this.lblPlanned.Location = new System.Drawing.Point(191, 481);\n            this.lblPlanned.Name = \"lblPlanned\";\n            this.lblPlanned.Size = new System.Drawing.Size(0, 13);\n            this.lblPlanned.TabIndex = 28;\n            // \n            // TrainingTimeLabel\n            // \n            this.TrainingTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.TrainingTimeLabel.AutoSize = true;\n            this.TrainingTimeLabel.Location = new System.Drawing.Point(12, 481);\n            this.TrainingTimeLabel.Name = \"TrainingTimeLabel\";\n            this.TrainingTimeLabel.Size = new System.Drawing.Size(173, 13);\n            this.TrainingTimeLabel.TabIndex = 26;\n            this.TrainingTimeLabel.Text = \"Training Time for selected loadout: \";\n            // \n            // lblTrainTime\n            // \n            this.lblTrainTime.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.lblTrainTime.AutoSize = true;\n            this.lblTrainTime.Location = new System.Drawing.Point(191, 481);\n            this.lblTrainTime.Name = \"lblTrainTime\";\n            this.lblTrainTime.Size = new System.Drawing.Size(27, 13);\n            this.lblTrainTime.TabIndex = 27;\n            this.lblTrainTime.Text = \"N/A\";\n            // \n            // btnPlan\n            // \n            this.btnPlan.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnPlan.Enabled = false;\n            this.btnPlan.Location = new System.Drawing.Point(560, 471);\n            this.btnPlan.Name = \"btnPlan\";\n            this.btnPlan.Size = new System.Drawing.Size(75, 23);\n            this.btnPlan.TabIndex = 29;\n            this.btnPlan.Text = \"Add To Plan\";\n            this.btnPlan.UseVisualStyleBackColor = true;\n            this.btnPlan.Click += new System.EventHandler(this.btnPlan_Click);\n            // \n            // contextMenu\n            // \n            this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.miShowInBrowser,\n            this.showInMenuSeparator,\n            this.miExportToClipboard,\n            this.exportLoadoutSeparator,\n            this.cmiExpandSelected,\n            this.cmiCollapseSelected,\n            this.selectedSeparator,\n            this.cmiExpandAll,\n            this.cmiCollapseAll});\n            this.contextMenu.Name = \"cmNode\";\n            this.contextMenu.Size = new System.Drawing.Size(226, 176);\n            this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenu_Opening);\n            // \n            // miShowInBrowser\n            // \n            this.miShowInBrowser.Name = \"miShowInBrowser\";\n            this.miShowInBrowser.Size = new System.Drawing.Size(225, 22);\n            this.miShowInBrowser.Text = \"Show in Item Browser...\";\n            this.miShowInBrowser.Click += new System.EventHandler(this.tvLoadout_DoubleClick);\n            // \n            // showInMenuSeparator\n            // \n            this.showInMenuSeparator.Name = \"showInMenuSeparator\";\n            this.showInMenuSeparator.Size = new System.Drawing.Size(222, 6);\n            // \n            // miExportToClipboard\n            // \n            this.miExportToClipboard.Name = \"miExportToClipboard\";\n            this.miExportToClipboard.Size = new System.Drawing.Size(225, 22);\n            this.miExportToClipboard.Text = \"Copy Loadout To Clipboard\";\n            this.miExportToClipboard.Click += new System.EventHandler(this.miExportToClipboard_Click);\n            // \n            // exportLoadoutSeparator\n            // \n            this.exportLoadoutSeparator.Name = \"exportLoadoutSeparator\";\n            this.exportLoadoutSeparator.Size = new System.Drawing.Size(222, 6);\n            // \n            // cmiExpandSelected\n            // \n            this.cmiExpandSelected.Name = \"cmiExpandSelected\";\n            this.cmiExpandSelected.Size = new System.Drawing.Size(225, 22);\n            this.cmiExpandSelected.Text = \"Expand Selected\";\n            this.cmiExpandSelected.Click += new System.EventHandler(this.cmiExpandSelected_Click);\n            // \n            // cmiCollapseSelected\n            // \n            this.cmiCollapseSelected.Name = \"cmiCollapseSelected\";\n            this.cmiCollapseSelected.Size = new System.Drawing.Size(225, 22);\n            this.cmiCollapseSelected.Text = \"Collapse Selected\";\n            this.cmiCollapseSelected.Click += new System.EventHandler(this.cmiCollapseSelected_Click);\n            // \n            // selectedSeparator\n            // \n            this.selectedSeparator.Name = \"selectedSeparator\";\n            this.selectedSeparator.Size = new System.Drawing.Size(222, 6);\n            // \n            // cmiExpandAll\n            // \n            this.cmiExpandAll.Name = \"cmiExpandAll\";\n            this.cmiExpandAll.Size = new System.Drawing.Size(225, 22);\n            this.cmiExpandAll.Text = \"&Expand All\";\n            this.cmiExpandAll.Click += new System.EventHandler(this.cmiExpandAll_Click);\n            // \n            // cmiCollapseAll\n            // \n            this.cmiCollapseAll.Name = \"cmiCollapseAll\";\n            this.cmiCollapseAll.Size = new System.Drawing.Size(225, 22);\n            this.cmiCollapseAll.Text = \"&Collapse All\";\n            this.cmiCollapseAll.Click += new System.EventHandler(this.cmiCollapseAll_Click);\n            // \n            // eveImage\n            // \n            this.eveImage.ImageSize = EVEMon.Common.Enumerations.EveImageSize.x128;\n            this.eveImage.Location = new System.Drawing.Point(12, 12);\n            this.eveImage.Name = \"eveImage\";\n            this.eveImage.PopUpEnabled = true;\n            this.eveImage.Size = new System.Drawing.Size(80, 80);\n            this.eveImage.SizeMode = EVEMon.Common.Enumerations.EveImageSizeMode.StretchImage;\n            this.eveImage.TabIndex = 30;\n            // \n            // buttonForumTopic\n            // \n            this.buttonForumTopic.Location = new System.Drawing.Point(6, 98);\n            this.buttonForumTopic.Name = \"buttonForumTopic\";\n            this.buttonForumTopic.Size = new System.Drawing.Size(109, 23);\n            this.buttonForumTopic.TabIndex = 31;\n            this.buttonForumTopic.Text = \"Discuss this loadout\";\n            this.buttonForumTopic.UseVisualStyleBackColor = true;\n            this.buttonForumTopic.Click += new System.EventHandler(this.buttonForumTopic_Click);\n            // \n            // ShipLoadoutSelectWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.ClientSize = new System.Drawing.Size(728, 506);\n            this.Controls.Add(this.buttonForumTopic);\n            this.Controls.Add(this.eveImage);\n            this.Controls.Add(this.btnPlan);\n            this.Controls.Add(this.lblPlanned);\n            this.Controls.Add(this.lblSubmitDate);\n            this.Controls.Add(this.TrainingTimeLabel);\n            this.Controls.Add(this.SubDateLabel);\n            this.Controls.Add(this.lblTrainTime);\n            this.Controls.Add(this.AuthorLabel);\n            this.Controls.Add(this.LoadoutNameLabel);\n            this.Controls.Add(this.ShipLabel);\n            this.Controls.Add(this.lblAuthor);\n            this.Controls.Add(this.lblLoadoutName);\n            this.Controls.Add(this.lblShipName);\n            this.Controls.Add(this.btnCancel);\n            this.Controls.Add(this.lblLoadouts);\n            this.Controls.Add(this.lowerPanel);\n            this.MinimumSize = new System.Drawing.Size(744, 544);\n            this.Name = \"ShipLoadoutSelectWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Loadout Selection\";\n            this.lowerPanel.ResumeLayout(false);\n            this.persistentSplitContainer.Panel1.ResumeLayout(false);\n            this.persistentSplitContainer.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.persistentSplitContainer)).EndInit();\n            this.persistentSplitContainer.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.throbberFitting)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.throbberLoadouts)).EndInit();\n            this.contextMenu.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label lblLoadouts;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.ListView lvLoadouts;\n        private System.Windows.Forms.ColumnHeader colName;\n        private System.Windows.Forms.ColumnHeader colAuthor;\n        private System.Windows.Forms.ColumnHeader colRating;\n        private System.Windows.Forms.ColumnHeader colDate;\n        private PersistentSplitContainer persistentSplitContainer;\n        private System.Windows.Forms.Panel lowerPanel;\n        private System.Windows.Forms.Label lblSubmitDate;\n        private System.Windows.Forms.Label SubDateLabel;\n        private System.Windows.Forms.Label AuthorLabel;\n        private System.Windows.Forms.Label LoadoutNameLabel;\n        private System.Windows.Forms.Label ShipLabel;\n        private System.Windows.Forms.Label lblAuthor;\n        private System.Windows.Forms.Label lblLoadoutName;\n        private System.Windows.Forms.Label lblShipName;\n        private System.Windows.Forms.TreeView tvLoadout;\n        private System.Windows.Forms.Label lblPlanned;\n        private System.Windows.Forms.Label TrainingTimeLabel;\n        private System.Windows.Forms.Label lblTrainTime;\n        private System.Windows.Forms.Button btnPlan;\n        private System.Windows.Forms.ContextMenuStrip contextMenu;\n        private System.Windows.Forms.ToolStripMenuItem miShowInBrowser;\n        private System.Windows.Forms.ToolStripMenuItem miExportToClipboard;\n        private Common.Controls.EveImage eveImage;\n        private System.Windows.Forms.ImageList ilIcons;\n        private Throbber throbberLoadouts;\n        private Throbber throbberFitting;\n        private System.Windows.Forms.Button buttonForumTopic;\n        private System.Windows.Forms.ToolStripSeparator showInMenuSeparator;\n        private System.Windows.Forms.ToolStripSeparator exportLoadoutSeparator;\n        private System.Windows.Forms.ToolStripMenuItem cmiExpandAll;\n        private System.Windows.Forms.ToolStripMenuItem cmiCollapseAll;\n        private System.Windows.Forms.ToolStripMenuItem cmiExpandSelected;\n        private System.Windows.Forms.ToolStripMenuItem cmiCollapseSelected;\n        private System.Windows.Forms.ToolStripSeparator selectedSeparator;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ShipLoadoutSelectWindow.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing SortOrder = System.Windows.Forms.SortOrder;\n\nnamespace EVEMon.SkillPlanner\n{\n    public partial class ShipLoadoutSelectWindow : EVEMonForm\n    {\n        #region Fields\n\n        private readonly List<StaticSkillLevel> m_prerequisites = new List<StaticSkillLevel>();\n        private readonly LoadoutListSorter m_columnSorter;\n\n        private ILoadoutInfo m_loadoutInfo;\n        private Loadout m_selectedLoadout;\n        private Character m_character;\n        private Item m_ship;\n        private Plan m_plan;\n\n        private bool m_allExpanded;\n        \n        #endregion\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ShipLoadoutSelectWindow\"/> class.\n        /// </summary>\n        private ShipLoadoutSelectWindow()\n        {\n            InitializeComponent();\n\n            persistentSplitContainer.RememberDistanceKey = \"ShipLoadoutBrowser\";\n\n            m_columnSorter = new LoadoutListSorter { OrderOfSort = SortOrder.Descending, SortColumn = 2 };\n            lvLoadouts.ListViewItemSorter = m_columnSorter;\n            \n            UpdateControlsVisibility();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ShipLoadoutSelectWindow\"/> class.\n        /// Constructor for WindowsFactory.\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        public ShipLoadoutSelectWindow(Plan plan)\n            : this()\n        {\n            Plan = plan;\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ShipLoadoutSelectWindow\"/> class.\n        /// Constructor for WindowsFactory.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        public ShipLoadoutSelectWindow(Character character)\n            : this()\n        {\n            m_character = character;\n\n            UpdateTitle();\n            UpdatePlanningControls();\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the plan.\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                if (m_plan == value)\n                    return;\n\n                m_plan = value;\n                m_character = (Character)m_plan.Character;\n\n                UpdateTitle();\n                UpdatePlanningControls();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the ship.\n        /// </summary>\n        internal Item Ship\n        {\n            get { return m_ship; }\n            set\n            {\n                if (m_ship == value)\n                    return;\n\n                m_ship = value;\n                QueryLoadoutsFeed();\n            }\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load, download the loadouts feed for this ship.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            // Subscribe global events\n            EveMonClient.PlanChanged += EveMonClient_PlanChanged;\n            EveMonClient.PlanNameChanged += EveMonClient_PlanNameChanged;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.LoadoutUpdated += EveMonClient_LoadoutUpdated;\n            EveMonClient.LoadoutFeedUpdated += EveMonClient_LoadoutFeedUpdated;\n        }\n\n        /// <summary>\n        /// When the window is closing, we clean things up\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            // Unsubscribe global events\n            EveMonClient.PlanChanged -= EveMonClient_PlanChanged;\n            EveMonClient.PlanNameChanged -= EveMonClient_PlanNameChanged;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.LoadoutUpdated -= EveMonClient_LoadoutUpdated;\n            EveMonClient.LoadoutFeedUpdated -= EveMonClient_LoadoutFeedUpdated;\n        }\n\n        #endregion\n\n\n        #region Downloads\n\n        /// <summary>\n        /// Query the loadouts feed for the current ship.\n        /// </summary>\n        private void QueryLoadoutsFeed()\n        {\n            if (Settings.LoadoutsProvider.Provider == null)\n                return;\n\n            // Wait cursor until we retrieved the loadout\n            Cursor = Cursors.WaitCursor;\n            throbberLoadouts.State = ThrobberState.Rotating;\n            persistentSplitContainer.Visible = false;\n\n            // We clear previous data\n            lvLoadouts.Items.Clear();\n            tvLoadout.Nodes.Clear();\n            m_prerequisites.Clear();\n\n            // Download the eve image\n            eveImage.EveItem = m_ship;\n\n            // Download the loadouts feed\n            Settings.LoadoutsProvider.Provider.GetLoadoutsFeedAsync(m_ship);\n\n            // Set labels while the user wait\n            lblShipName.Text = m_ship.Name;\n            lblLoadoutName.Text = @\"No Loadout Selected\";\n            lblAuthor.Text = string.Empty;\n            lblSubmitDate.Text = string.Empty;\n            lblPlanned.Text = string.Empty;\n            lblPlanned.Hide();\n            lblTrainTime.Text = @\"N/A\";\n            lblTrainTime.Visible = m_character != null;\n            lblLoadouts.Text = $\"Fetching loadouts for {m_ship.Name}\";\n            btnPlan.Enabled = false;\n        }\n\n        /// <summary>\n        /// Updates the loadout feed information.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"LoadoutFeedEventArgs\"/> instance containing the event data.</param>\n        private void UpdateLoadoutFeedInfo(LoadoutFeedEventArgs e)\n        {\n            if (IsDisposed)\n                return;\n\n            // Restore the default cursor instead of the waiting one\n            Cursor = Cursors.Default;\n            btnPlan.Enabled = false;\n\n            if (Settings.LoadoutsProvider.Provider == null)\n                return;\n\n            // Was there an error ?\n            if (e.HasError)\n            {\n                throbberLoadouts.State = ThrobberState.Strobing;\n                lblLoadouts.Text = $\"There was a problem connecting to {Settings.LoadoutsProvider.Provider.Name}, \" +\n                                   $\"it may be down for maintainance.{Environment.NewLine}{e.Error.Message}\";\n\n                return;\n            }\n\n            m_loadoutInfo = Settings.LoadoutsProvider.Provider.DeserializeLoadoutsFeed(m_ship, e.LoadoutFeed);\n\n            // Are there no feeds ?\n            if (!m_loadoutInfo.Loadouts.Any())\n            {\n                throbberLoadouts.State = ThrobberState.Strobing;\n                lblLoadouts.Text = $\"There are no loadouts for {m_ship.Name}, \" +\n                                   $\"why not submit one to {Settings.LoadoutsProvider.Provider.Name}?\";\n                return;\n            }\n\n            // Add the listview items for every loadout\n            foreach (Loadout loadout in m_loadoutInfo.Loadouts)\n            {\n                ListViewItem lvi = new ListViewItem(loadout.Name) { Text = loadout.Name, Tag = loadout };\n                lvi.SubItems.Add(loadout.Author);\n                lvi.SubItems.Add(loadout.Rating.ToString(CultureConstants.DefaultCulture));\n                lvi.SubItems.Add(loadout.SubmissionDate.ToString(\"G\"));\n                lvLoadouts.Items.Add(lvi);\n            }\n\n            // Update the header\n            lblLoadouts.Text = $\"Found {lvLoadouts.Items.Count} loadouts\";\n\n            // Update the listview's comparer and sort\n            lvLoadouts.Sort();\n            UpdateSortVisualFeedback();\n\n            // Adjust the size of the columns\n            AdjustColumns();\n\n            throbberLoadouts.State = ThrobberState.Stopped;\n            persistentSplitContainer.Visible = lvLoadouts.Items.Count > 0;\n        }\n\n        /// <summary>\n        /// Downloads the given loadout.\n        /// </summary>\n        /// <param name=\"loadout\"></param>\n        private void DownloadLoadout(Loadout loadout)\n        {\n            // Prevent downloading the same loadout\n            if (m_selectedLoadout == loadout)\n                return;\n\n            if (Settings.LoadoutsProvider.Provider == null)\n                return;\n\n            // Reset controls and set the cursor to wait\n            btnPlan.Enabled = false;\n            lblTrainTime.Visible = false;\n            Cursor = Cursors.WaitCursor;\n            throbberFitting.State = ThrobberState.Rotating;\n            throbberFitting.BringToFront();\n            tvLoadout.Nodes.Clear();\n\n            // Store the selected loadout\n            m_selectedLoadout = loadout;\n\n            // Set the headings\n            lblLoadoutName.Text = m_selectedLoadout.Name;\n            lblAuthor.Text = m_selectedLoadout.Author;\n            lblSubmitDate.Text = m_selectedLoadout.SubmissionDate.ToString(\"G\");\n\n            // Download the loadout details\n            Settings.LoadoutsProvider.Provider.GetLoadoutByIDAsync(m_selectedLoadout.ID);\n        }\n\n        /// <summary>\n        /// Updates the loadout information.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"LoadoutEventArgs\"/> instance containing the event data.</param>\n        private void UpdateLoadoutInfo(LoadoutEventArgs e)\n        {\n            if (IsDisposed)\n                return;\n\n            // Reset the controls\n            m_prerequisites.Clear();\n            tvLoadout.Nodes.Clear();\n            Cursor = Cursors.Default;\n\n            if (Settings.LoadoutsProvider.Provider == null)\n                return;\n\n            // Was there an error ?\n            if (e.HasError)\n            {\n                throbberFitting.State = ThrobberState.Strobing;\n                lblTrainTime.Text = $\"Couldn't download that loadout.{Environment.NewLine}{e.Error.Message}\";\n                lblTrainTime.Visible = true;\n                return;\n            }\n\n            Settings.LoadoutsProvider.Provider.DeserializeLoadout(m_selectedLoadout, e.Loadout);\n\n            // Fill the items tree\n            BuildTreeNodes(m_selectedLoadout.Items);\n\n            throbberFitting.State = ThrobberState.Stopped;\n            throbberFitting.SendToBack();\n\n            // Compute the training time\n            UpdatePlanningControls();\n        }\n\n        /// <summary>\n        /// Builds the tree nodes.\n        /// </summary>\n        /// <param name=\"items\">The items.</param>\n        private void BuildTreeNodes(IEnumerable<Item> items)\n        {\n            // Add the prerequisites for the ship it self\n            m_prerequisites.AddRange(m_ship.Prerequisites);\n\n            // Add the prerequisites for each item\n            foreach (IGrouping<string, Item> slotItems in items.GroupBy(LoadoutHelper.GetSlotByItem))\n            {\n                TreeNode typeNode = new TreeNode(slotItems.Key);\n\n                foreach (Item item in slotItems)\n                {\n                    TreeNode slotNode = new TreeNode { Text = item.Name, Tag = item };\n                    typeNode.Nodes.Add(slotNode);\n\n                    m_prerequisites.AddRange(item.Prerequisites);\n                }\n\n                tvLoadout.Nodes.Add(typeNode);\n            }\n\n            // Order the nodes\n            TreeNode[] orderNodes = tvLoadout.Nodes.Cast<TreeNode>().OrderBy(\n                node => LoadoutHelper.OrderedSlotNames.IndexOf(string.Intern(node.Text))).ToArray();\n\n            tvLoadout.BeginUpdate();\n            try\n            {\n                tvLoadout.Nodes.Clear();\n                tvLoadout.Nodes.AddRange(orderNodes);\n                tvLoadout.ExpandAll();\n                m_allExpanded = true;\n\n                IList<TreeNode> tvNodes = tvLoadout.Nodes.Cast<TreeNode>().ToList();\n\n                if (tvNodes.Any())\n                    tvNodes.First().EnsureVisible();\n            }\n            finally\n            {\n                tvLoadout.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Update the plan status : training time, skills already trained, etc\n        /// </summary>\n        private void UpdatePlanningControls()\n        {\n            btnPlan.Visible = m_plan != null;\n            lblTrainTime.Visible = TrainingTimeLabel.Visible = m_character != null;\n\n            if (m_character == null)\n                return;\n\n            btnPlan.Enabled = false;\n\n            if (!m_prerequisites.Any())\n                return;\n\n            // Are all the prerequisites trained ?\n            if (m_prerequisites.All(x => m_character.GetSkillLevel(x.Skill) >= x.Level))\n            {\n                lblPlanned.Show();\n                lblPlanned.Text = @\"All skills already trained.\";\n                lblTrainTime.Hide();\n                return;\n            }\n\n            if (m_plan == null)\n            {\n                lblPlanned.Show();\n                lblPlanned.Text = @\"Some skills need training.\";\n                lblTrainTime.Hide();\n                return;\n            }\n\n            // Are all the prerequisites planned ?\n            if (m_plan.AreSkillsPlanned(m_prerequisites.Where(x => m_character.Skills[x.Skill.ID].Level < x.Level)))\n            {\n                lblPlanned.Show();\n                lblPlanned.Text = @\"All skills already trained or planned.\";\n                lblTrainTime.Hide();\n                return;\n            }\n\n            // Compute the training time\n            CharacterScratchpad scratchpad = new CharacterScratchpad(m_character);\n            foreach (PlanEntry entry in m_plan)\n            {\n                scratchpad.Train(entry);\n            }\n\n            TimeSpan startTime = scratchpad.TrainingTime;\n            foreach (StaticSkillLevel prereq in m_prerequisites)\n            {\n                scratchpad.Train(prereq);\n            }\n\n            TimeSpan trainingTime = scratchpad.TrainingTime.Subtract(startTime);\n\n            // Update the labels\n            lblTrainTime.Text = trainingTime.ToDescriptiveText(\n                DescriptiveTextOptions.IncludeCommas | DescriptiveTextOptions.SpaceText);\n            lblTrainTime.Show();\n            lblPlanned.Text = string.Empty;\n            lblPlanned.Hide();\n            btnPlan.Enabled = true;\n        }\n\n        /// <summary>\n        /// Updates the sort visual feedback.\n        /// </summary>\n        private void UpdateSortVisualFeedback()\n        {\n            foreach (ColumnHeader columnHeader in lvLoadouts.Columns.Cast<ColumnHeader>())\n            {\n                if (m_columnSorter.SortColumn == columnHeader.Index)\n                    columnHeader.ImageIndex = m_columnSorter.OrderOfSort == SortOrder.Ascending ? 0 : 1;\n                else\n                    columnHeader.ImageIndex = 2;\n            }\n        }\n\n        /// <summary>\n        /// Adjusts the columns.\n        /// </summary>\n        private void AdjustColumns()\n        {\n            foreach (ColumnHeader column in lvLoadouts.Columns)\n            {\n                column.Width = -2;\n\n                // Due to .NET design we need to prevent the last colummn to resize to the right end\n\n                // Return if it's not the last column and not set to auto-resize\n                if (column.Index != lvLoadouts.Columns.Count - 1)\n                    continue;\n\n                const int Pad = 4;\n\n                // Calculate column header text width with padding\n                int columnHeaderWidth = TextRenderer.MeasureText(column.Text, Font).Width + Pad * 2;\n\n                // If there is an image assigned to the header, add its width with padding\n                if (lvLoadouts.SmallImageList != null && column.ImageIndex > -1)\n                    columnHeaderWidth += lvLoadouts.SmallImageList.ImageSize.Width + Pad;\n\n                // Calculate the width of the header and the items of the column\n                int columnMaxWidth = column.ListView.Items.Cast<ListViewItem>().Select(\n                    item => TextRenderer.MeasureText(item.SubItems[column.Index].Text, Font).Width).Concat(\n                        new[] { columnHeaderWidth }).Max() + Pad + 1;\n\n                // Assign the width found\n                column.Width = columnMaxWidth;\n            }\n        }\n\n        #endregion\n\n\n        #region Global events\n\n        /// <summary>\n        /// Occurs when the plan changed. We update the status of the training time and such.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_PlanChanged(object sender, PlanChangedEventArgs e)\n        {\n            if (e.Plan == m_plan)\n                UpdatePlanningControls();\n        }\n\n        /// <summary>\n        /// Occurs when the settings changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateControlsVisibility();\n        }\n\n        /// <summary>\n        /// Occurs when the loadout feed from the provider updated.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        /// <exception cref=\"System.NotImplementedException\"></exception>\n        private void EveMonClient_LoadoutFeedUpdated(object sender, LoadoutFeedEventArgs e)\n        {\n            UpdateLoadoutFeedInfo(e);\n        }\n\n        /// <summary>\n        /// Occurs when the loadout from the provider updated.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"LoadoutEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_LoadoutUpdated(object sender, LoadoutEventArgs e)\n        {\n            UpdateLoadoutInfo(e);\n        }\n\n        /// <summary>\n        /// Occurs when a plan name changed.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"PlanChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_PlanNameChanged(object sender, PlanChangedEventArgs e)\n        {\n            if (e.Plan == m_plan)\n                UpdateTitle();\n        }\n\n        #endregion\n\n\n        #region Controls' events handlers\n\n        /// <summary>\n        /// When the user click a loadout, we download it.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvLoadouts_Click(object sender, EventArgs e)\n        {\n            if (lvLoadouts.SelectedItems.Count == 0)\n                return;\n\n            Loadout loadout = (Loadout)lvLoadouts.SelectedItems[0].Tag;\n            DownloadLoadout(loadout);\n        }\n\n        /// <summary>\n        /// When the user clicks cancel, we quit.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Cancel;\n            Close();\n        }\n\n        /// <summary>\n        /// When the user clicks one of the loadouts list' column, we update the sort.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvLoadouts_ColumnClick(object sender, ColumnClickEventArgs e)\n        {\n            // Is the column we're already sorting by ? Then swap sort order\n            if (e.Column == m_columnSorter.SortColumn)\n            {\n                m_columnSorter.OrderOfSort = m_columnSorter.OrderOfSort == SortOrder.Ascending\n                    ? SortOrder.Descending\n                    : SortOrder.Ascending;\n            }\n                // Then the user wants to sort by a different column\n            else\n            {\n                m_columnSorter.SortColumn = e.Column;\n                m_columnSorter.OrderOfSort = SortOrder.Ascending;\n            }\n\n            // Sort\n            lvLoadouts.ListViewItemSorter = m_columnSorter;\n            lvLoadouts.Sort();\n            UpdateSortVisualFeedback();\n        }\n\n        /// <summary>\n        /// When the user clicks the \"discuss this loadout\", we open the browser.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void buttonForumTopic_Click(object sender, EventArgs e)\n        {\n            if (m_selectedLoadout != null)\n            {\n                Util.OpenURL(m_selectedLoadout.TopicUrl);\n                return;\n            }\n\n            MessageBox.Show(@\"Please select a loadout to discuss.\", @\"No Loadout Selected\", MessageBoxButtons.OK,\n                MessageBoxIcon.Error);\n        }\n\n        /// <summary>\n        /// When the user clicks the \"plan\" button, we add the prerqs to the plan and refresh the display.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnPlan_Click(object sender, EventArgs e)\n        {\n            IPlanOperation operation = m_plan.TryAddSet(m_prerequisites, m_selectedLoadout.Name);\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = PlanWindow.ShowPlanWindow(plan: operation.Plan);\n            if (planWindow == null)\n                return;\n\n            PlanHelper.Perform(new PlanToOperationWindow(operation), planWindow);\n            UpdatePlanningControls();\n        }\n\n        /// <summary>\n        /// When the user right-click an item, we display a context menu.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tvLoadout_MouseUp(object sender, MouseEventArgs e)\n        {\n            // Show menu only if the right mouse button is clicked.\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            tvLoadout.Cursor = Cursors.Default;\n\n            // Get the node that the user has clicked.\n            tvLoadout.SelectedNode = tvLoadout.GetNodeAt(e.Location);\n\n            // Select the node the user has clicked.\n            // The node appears selected until the menu is displayed on the screen.\n            contextMenu.Show(tvLoadout, e.Location);\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void tvLoadout_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            tvLoadout.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// When the user double-click an item or uses the \"Show\n        /// in item browser\" context menu item, we open the items\n        /// browser.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tvLoadout_DoubleClick(object sender, EventArgs e)\n        {\n            // user double clicked an area that isn't a node\n            Item item = tvLoadout.SelectedNode?.Tag as Item;\n\n            PlanWindow.ShowPlanWindow(m_character, m_plan).ShowItemInBrowser(item);\n        }\n\n        /// <summary>\n        /// Context menu opening, we update the menus' statuses.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void contextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)\n        {\n            e.Cancel = tvLoadout.Nodes.Count == 0;\n\n            if (e.Cancel)\n                return;\n\n            TreeNode node = tvLoadout.SelectedNode;\n            Item selectedItem = node?.Tag as Item;\n\n            miShowInBrowser.Visible = showInMenuSeparator.Visible = selectedItem != null;\n\n            exportLoadoutSeparator.Visible = selectedItem == null && node != null;\n\n            // \"Collapse\" and \"Expand\" menus\n            cmiCollapseSelected.Visible = selectedItem == null && node != null && node.IsExpanded;\n            cmiExpandSelected.Visible = selectedItem == null && node != null && !node.IsExpanded;\n\n            cmiExpandSelected.Text = selectedItem == null && node != null && !node.IsExpanded\n                ? $\"Expand \\\"{node.Text}\\\"\"\n                : string.Empty;\n            cmiCollapseSelected.Text = selectedItem == null && node != null && node.IsExpanded\n                ? $\"Collapse \\\"{node.Text}\\\"\"\n                : string.Empty;\n\n            // \"Expand All\" and \"Collapse All\" menus\n            cmiCollapseAll.Enabled = cmiCollapseAll.Visible = m_allExpanded;\n            cmiExpandAll.Enabled = cmiExpandAll.Visible = !cmiCollapseAll.Enabled;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiCollapseSelected_Click(object sender, EventArgs e)\n        {\n            tvLoadout.SelectedNode.Collapse();\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiExpandSelected_Click(object sender, EventArgs e)\n        {\n            tvLoadout.SelectedNode.Expand();\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand all.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiExpandAll_Click(object sender, EventArgs e)\n        {\n            tvLoadout.ExpandAll();\n            m_allExpanded = true;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse all.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiCollapseAll_Click(object sender, EventArgs e)\n        {\n            tvLoadout.CollapseAll();\n            m_allExpanded = false;\n        }\n\n        /// <summary>\n        /// Export to Clipboard\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void miExportToClipboard_Click(object sender, EventArgs e)\n        {\n            LoadoutExporter.ExportToClipboard(m_loadoutInfo, m_selectedLoadout);\n        }\n\n        #endregion\n\n\n        #region Helper methods\n\n        /// <summary>\n        /// Updates the title.\n        /// </summary>\n        private void UpdateTitle()\n        {\n            Text = $\"{m_character} \" +\n                   (m_plan == null ? string.Empty : $\" [{m_plan.Name}] \") +\n                   $\"- {Settings.LoadoutsProvider.Provider?.Name} Loadout Selection\";\n        }\n\n        /// <summary>\n        /// Updates the controls visibility.\n        /// </summary>\n        private void UpdateControlsVisibility()\n        {\n            eveImage.Visible = !Settings.UI.SafeForWork;\n            if (!Settings.UI.SafeForWork && m_ship != null)\n                eveImage.EveItem = m_ship;\n        }\n\n\n        #endregion\n\n\n        #region LoadoutListSorter\n\n        private class LoadoutListSorter : IComparer\n        {\n            /// <summary>\n            /// Initializes a new instance of the <see cref=\"LoadoutListSorter\"/> class.\n            /// </summary>\n            public LoadoutListSorter()\n            {\n                OrderOfSort = SortOrder.Ascending;\n            }\n\n            /// <summary>\n            /// Gets or sets the order of sort.\n            /// </summary>\n            /// <value>The order of sort.</value>\n            public SortOrder OrderOfSort { get; set; }\n\n            /// <summary>\n            /// Gets or sets the sort column.\n            /// </summary>\n            /// <value>The sort column.</value>\n            public int SortColumn { get; set; }\n\n            /// <summary>\n            /// Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other.\n            /// </summary>\n            /// <param name=\"x\">The first object to compare.</param>\n            /// <param name=\"y\">The second object to compare.</param>\n            /// <returns>\n            /// A signed integer that indicates the relative values of <paramref name=\"x\"/> and <paramref name=\"y\"/>,\n            /// as shown in the following table.Value Meaning Less than zero <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n            /// Zero <paramref name=\"x\"/> equals <paramref name=\"y\"/>. Greater than zero <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n            /// </returns>\n            /// <exception cref=\"T:System.ArgumentException\">Neither <paramref name=\"x\"/> nor <paramref name=\"y\"/>\n            /// implements the <see cref=\"T:System.IComparable\"/> interface.-or- <paramref name=\"x\"/> and <paramref name=\"y\"/>\n            /// are of different types and neither one can handle comparisons with the other. </exception>\n            public int Compare(object x, object y)\n            {\n                int compareResult = 0;\n                ListViewItem a = (ListViewItem)x;\n                ListViewItem b = (ListViewItem)y;\n\n                if (OrderOfSort == SortOrder.Descending)\n                {\n                    ListViewItem tmp = b;\n                    b = a;\n                    a = tmp;\n                }\n\n                Loadout loadoutA = a.Tag as Loadout;\n                Loadout loadoutB = b.Tag as Loadout;\n\n                switch (SortColumn)\n                {\n                    case 0: // sort by name\n                        compareResult = string.Compare(a.Text, b.Text, StringComparison.CurrentCulture);\n                        break;\n                    case 1: // Author\n                        compareResult = string.Compare(a.SubItems[1].Text, b.SubItems[1].Text, StringComparison.CurrentCulture);\n                        break;\n                    case 2: // Rating\n                        if (loadoutB != null && loadoutA != null && loadoutA.Rating < loadoutB.Rating)\n                            compareResult = -1;\n                        else if (loadoutB != null && loadoutA != null && loadoutA.Rating > loadoutB.Rating)\n                            compareResult = 1;\n                        break;\n                    case 3: // Date\n                        if (loadoutA != null && loadoutB != null)\n                            compareResult = loadoutA.SubmissionDate.CompareTo(loadoutB.SubmissionDate);\n                        break;\n                }\n\n                return compareResult;\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ShipLoadoutSelectWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"ilIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>115, 17</value>\n  </metadata>\n  <data name=\"ilIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi\n        AAAAAk1TRnQBSQFMAgEBAwEAAawBBQGsAQUBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABEAMAAQEBAAEQBgABCP8A/wD/AP8A/wD/AP8A/wAaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB\n        AQABAQUAAYAXAAP/AQAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAB8AEPAf4BfwL/AgAB+AEfAfwBPwL/\n        AgAB/AE/AfgBHwL/AgAB/gF/AfABDwL/AgAG/wIABv8CAAb/AgAG/wIABv8CAAb/AgAL\n</value>\n  </data>\n  <metadata name=\"contextMenu.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ShipSelectControl.Designer.cs",
    "content": "﻿namespace EVEMon.SkillPlanner\n{\n    partial class ShipSelectControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n        private void InitializeComponent()\n        {\n            this.cbCaldari = new System.Windows.Forms.CheckBox();\n            this.cbFaction = new System.Windows.Forms.CheckBox();\n            this.cbGallente = new System.Windows.Forms.CheckBox();\n            this.cbMinmatar = new System.Windows.Forms.CheckBox();\n            this.cbORE = new System.Windows.Forms.CheckBox();\n            this.cbAmarr = new System.Windows.Forms.CheckBox();\n            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\n            this.upperPanel.SuspendLayout();\n            this.lowerPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchImage)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSerachTextDel)).BeginInit();\n            this.tableLayoutPanel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tbSearchText\n            // \n            this.tbSearchText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbSearchText.Location = new System.Drawing.Point(45, 135);\n            this.tbSearchText.Size = new System.Drawing.Size(179, 20);\n            this.tbSearchText.TabIndex = 35;\n            // \n            // lbNoMatches\n            // \n            this.lbNoMatches.Size = new System.Drawing.Size(224, 256);\n            // \n            // upperPanel\n            // \n            this.upperPanel.Controls.Add(this.tableLayoutPanel1);\n            this.upperPanel.Size = new System.Drawing.Size(224, 162);\n            this.upperPanel.Controls.SetChildIndex(this.cbUsabilityFilter, 0);\n            this.upperPanel.Controls.SetChildIndex(this.tableLayoutPanel1, 0);\n            this.upperPanel.Controls.SetChildIndex(this.pbSearchImage, 0);\n            this.upperPanel.Controls.SetChildIndex(this.tbSearchText, 0);\n            this.upperPanel.Controls.SetChildIndex(this.lbSearchTextHint, 0);\n            this.upperPanel.Controls.SetChildIndex(this.lblFilter, 0);\n            this.upperPanel.Controls.SetChildIndex(this.pbSerachTextDel, 0);\n            // \n            // lowerPanel\n            // \n            this.lowerPanel.Location = new System.Drawing.Point(0, 162);\n            this.lowerPanel.Size = new System.Drawing.Size(224, 256);\n            // \n            // lbSearchTextHint\n            // \n            this.lbSearchTextHint.Location = new System.Drawing.Point(49, 138);\n            // \n            // pbSearchImage\n            // \n            this.pbSearchImage.Location = new System.Drawing.Point(9, 135);\n            // \n            // lblFilter\n            // \n            this.lblFilter.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);\n            // \n            // cbUsabilityFilter\n            // \n            this.cbUsabilityFilter.Size = new System.Drawing.Size(179, 21);\n            this.cbUsabilityFilter.SelectedIndexChanged += new System.EventHandler(this.cbUsabilityFilter_SelectedIndexChanged);\n            // \n            // lbSearchList\n            // \n            this.lbSearchList.Size = new System.Drawing.Size(224, 256);\n            // \n            // tvItems\n            // \n            this.tvItems.LineColor = System.Drawing.Color.Black;\n            this.tvItems.Size = new System.Drawing.Size(224, 256);\n            // \n            // pbSerachTextDel\n            // \n            this.pbSerachTextDel.Location = new System.Drawing.Point(205, 137);\n            // \n            // cbCaldari\n            // \n            this.cbCaldari.AccessibleRole = System.Windows.Forms.AccessibleRole.None;\n            this.cbCaldari.AutoSize = true;\n            this.cbCaldari.Cursor = System.Windows.Forms.Cursors.Default;\n            this.cbCaldari.Location = new System.Drawing.Point(0, 22);\n            this.cbCaldari.Margin = new System.Windows.Forms.Padding(0);\n            this.cbCaldari.Name = \"cbCaldari\";\n            this.cbCaldari.Size = new System.Drawing.Size(58, 17);\n            this.cbCaldari.TabIndex = 27;\n            this.cbCaldari.Text = \"Caldari\";\n            this.cbCaldari.UseVisualStyleBackColor = true;\n            this.cbCaldari.CheckedChanged += new System.EventHandler(this.cbRace_SelectedChanged);\n            // \n            // cbFaction\n            // \n            this.cbFaction.AutoSize = true;\n            this.cbFaction.Location = new System.Drawing.Point(106, 22);\n            this.cbFaction.Margin = new System.Windows.Forms.Padding(0);\n            this.cbFaction.Name = \"cbFaction\";\n            this.cbFaction.Size = new System.Drawing.Size(61, 17);\n            this.cbFaction.TabIndex = 30;\n            this.cbFaction.Text = \"Faction\";\n            this.cbFaction.UseVisualStyleBackColor = true;\n            this.cbFaction.CheckedChanged += new System.EventHandler(this.cbRace_SelectedChanged);\n            // \n            // cbGallente\n            // \n            this.cbGallente.AutoSize = true;\n            this.cbGallente.Location = new System.Drawing.Point(0, 44);\n            this.cbGallente.Margin = new System.Windows.Forms.Padding(0);\n            this.cbGallente.Name = \"cbGallente\";\n            this.cbGallente.Size = new System.Drawing.Size(65, 17);\n            this.cbGallente.TabIndex = 28;\n            this.cbGallente.Text = \"Gallente\";\n            this.cbGallente.UseVisualStyleBackColor = true;\n            this.cbGallente.CheckedChanged += new System.EventHandler(this.cbRace_SelectedChanged);\n            // \n            // cbMinmatar\n            // \n            this.cbMinmatar.AutoSize = true;\n            this.cbMinmatar.Location = new System.Drawing.Point(106, 0);\n            this.cbMinmatar.Margin = new System.Windows.Forms.Padding(0);\n            this.cbMinmatar.Name = \"cbMinmatar\";\n            this.cbMinmatar.Size = new System.Drawing.Size(69, 17);\n            this.cbMinmatar.TabIndex = 29;\n            this.cbMinmatar.Text = \"Minmatar\";\n            this.cbMinmatar.UseVisualStyleBackColor = true;\n            this.cbMinmatar.CheckedChanged += new System.EventHandler(this.cbRace_SelectedChanged);\n            // \n            // cbORE\n            // \n            this.cbORE.AutoSize = true;\n            this.cbORE.Location = new System.Drawing.Point(106, 44);\n            this.cbORE.Margin = new System.Windows.Forms.Padding(0);\n            this.cbORE.Name = \"cbORE\";\n            this.cbORE.Size = new System.Drawing.Size(49, 17);\n            this.cbORE.TabIndex = 31;\n            this.cbORE.Text = \"ORE\";\n            this.cbORE.UseVisualStyleBackColor = true;\n            this.cbORE.CheckedChanged += new System.EventHandler(this.cbRace_SelectedChanged);\n            // \n            // cbAmarr\n            // \n            this.cbAmarr.AutoSize = true;\n            this.cbAmarr.Location = new System.Drawing.Point(0, 0);\n            this.cbAmarr.Margin = new System.Windows.Forms.Padding(0);\n            this.cbAmarr.Name = \"cbAmarr\";\n            this.cbAmarr.Size = new System.Drawing.Size(53, 17);\n            this.cbAmarr.TabIndex = 26;\n            this.cbAmarr.Text = \"Amarr\";\n            this.cbAmarr.UseVisualStyleBackColor = true;\n            this.cbAmarr.CheckedChanged += new System.EventHandler(this.cbRace_SelectedChanged);\n            // \n            // tableLayoutPanel1\n            // \n            this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tableLayoutPanel1.ColumnCount = 2;\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n            this.tableLayoutPanel1.Controls.Add(this.cbAmarr, 0, 0);\n            this.tableLayoutPanel1.Controls.Add(this.cbMinmatar, 1, 0);\n            this.tableLayoutPanel1.Controls.Add(this.cbCaldari, 0, 1);\n            this.tableLayoutPanel1.Controls.Add(this.cbFaction, 1, 1);\n            this.tableLayoutPanel1.Controls.Add(this.cbGallente, 0, 2);\n            this.tableLayoutPanel1.Controls.Add(this.cbORE, 1, 2);\n            this.tableLayoutPanel1.Location = new System.Drawing.Point(6, 45);\n            this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);\n            this.tableLayoutPanel1.Name = \"tableLayoutPanel1\";\n            this.tableLayoutPanel1.RowCount = 3;\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 34F));\n            this.tableLayoutPanel1.Size = new System.Drawing.Size(212, 69);\n            this.tableLayoutPanel1.TabIndex = 36;\n            // \n            // ShipSelectControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Name = \"ShipSelectControl\";\n            this.Size = new System.Drawing.Size(224, 418);\n            this.upperPanel.ResumeLayout(false);\n            this.upperPanel.PerformLayout();\n            this.lowerPanel.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchImage)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSerachTextDel)).EndInit();\n            this.tableLayoutPanel1.ResumeLayout(false);\n            this.tableLayoutPanel1.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n        #endregion\n\n        private System.Windows.Forms.CheckBox cbFaction;\n        private System.Windows.Forms.CheckBox cbAmarr;\n        private System.Windows.Forms.CheckBox cbORE;\n        private System.Windows.Forms.CheckBox cbGallente;\n        private System.Windows.Forms.CheckBox cbMinmatar;\n        private System.Windows.Forms.CheckBox cbCaldari;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ShipSelectControl.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.SkillPlanner\n{\n    public sealed partial class ShipSelectControl : EveObjectSelectControl\n    {\n        private Func<Item, bool> m_racePredicate = x => true;\n\n        private bool m_init;\n\n\n        #region Initialization\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public ShipSelectControl()\n        {\n            InitializeComponent();\n\n            // Bind the contextmenu for masteries\n            lbSearchList.ContextMenuStrip = contextMenu;\n            UsabilityPredicate = SelectAll;\n        }\n\n        /// <summary>\n        /// On load, we read the settings and fill the tree.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            // Call the base method\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            // Initialize the filters controls\n            InitializeFiltersControls();\n\n            // Update the control's content\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Initializes the filters controls.\n        /// </summary>\n        protected override void InitializeFiltersControls()\n        {\n            m_init = false;\n\n            InitializeFilterControl();\n\n            InitiliazeSelectedIndexes();\n\n            m_init = true;\n        }\n\n        /// <summary>\n        /// Initializes the filter control.\n        /// </summary>\n        private void InitializeFilterControl()\n        {\n            // Initialize the usability filter combo box\n            cbUsabilityFilter.Items.Clear();\n            cbUsabilityFilter.Items.Add(\"All Ships\");\n\n            // On Data browser exit here\n            if (Character == null)\n                return;\n\n            cbUsabilityFilter.Items.Add(\"Ships I can fly\");\n            cbUsabilityFilter.Items.Add(\"Ships I cannot fly\");\n        }\n\n        /// <summary>\n        /// Initiliazes the selected indexes.\n        /// </summary>\n        /// <exception cref=\"System.NotImplementedException\"></exception>\n        private void InitiliazeSelectedIndexes()\n        {\n            // Read the settings\n            if (Settings.UI.UseStoredSearchFilters)\n            {\n                ShipBrowserSettings settings;\n\n                // Skill Planner\n                if (Plan != null)\n                    settings = Settings.UI.ShipBrowser;\n                // Character associated Data Browser\n                else if (Character != null)\n                    settings = Settings.UI.ShipCharacterDataBrowser;\n                // Data Browser\n                else\n                    settings = Settings.UI.ShipDataBrowser;\n\n                cbUsabilityFilter.SelectedIndex = (int)settings.UsabilityFilter;\n\n                cbAmarr.Checked = (settings.RacesFilter & Race.Amarr) != Race.None;\n                cbCaldari.Checked = (settings.RacesFilter & Race.Caldari) != Race.None;\n                cbGallente.Checked = (settings.RacesFilter & Race.Gallente) != Race.None;\n                cbMinmatar.Checked = (settings.RacesFilter & Race.Minmatar) != Race.None;\n                cbFaction.Checked = (settings.RacesFilter & Race.Faction) != Race.None;\n                cbORE.Checked = (settings.RacesFilter & Race.Ore) != Race.None;\n\n                // See comment in cbRace_SelectedChanged for rationale behind this workaround\n                m_racePredicate = x => ((x.Race == Race.None ? Race.Faction : x.Race) &\n                    settings.RacesFilter) != Race.None;\n\n                tbSearchText.Text = settings.TextSearch;\n                lbSearchTextHint.Visible = string.IsNullOrEmpty(tbSearchText.Text);\n\n                return;\n            }\n\n            cbUsabilityFilter.SelectedIndex = 0;\n            cbAmarr.Checked = true;\n            cbCaldari.Checked = true;\n            cbGallente.Checked = true;\n            cbMinmatar.Checked = true;\n            cbFaction.Checked = true;\n            cbORE.Checked = true;\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// When the combo for filter changes, we update the settings and the control content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        /// <exception cref=\"NotImplementedException\"></exception>\n        private void cbUsabilityFilter_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            // Update the filter delegate\n            switch ((ObjectUsabilityFilter)cbUsabilityFilter.SelectedIndex)\n            {\n                case ObjectUsabilityFilter.All:\n                    UsabilityPredicate = SelectAll;\n                    break;\n\n                case ObjectUsabilityFilter.Usable:\n                    UsabilityPredicate = CanUse;\n                    break;\n\n                case ObjectUsabilityFilter.Unusable:\n                    UsabilityPredicate = CannotUse;\n                    break;\n\n                default:\n                    throw new NotImplementedException();\n            }\n\n            // Update the control's content\n            if (!m_init)\n                return;\n\n            // Update content\n            UpdateContent();\n\n            ShipBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.ShipBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.ShipCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.ShipDataBrowser;\n\n            // Update settings\n            settings.UsabilityFilter = (ObjectUsabilityFilter)cbUsabilityFilter.SelectedIndex;\n        }\n\n        /// <summary>\n        /// When one of the races combo is checked/unchecked, we update the settings and the control content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbRace_SelectedChanged(object sender, EventArgs e)\n        {\n            // Update the control's content\n            if (!m_init)\n                return;\n\n            // Retrieve the race\n            Race race = Race.None;\n            if (cbAmarr.Checked)\n                race |= Race.Amarr;\n            if (cbCaldari.Checked)\n                race |= Race.Caldari;\n            if (cbGallente.Checked)\n                race |= Race.Gallente;\n            if (cbMinmatar.Checked)\n                race |= Race.Minmatar;\n            if (cbFaction.Checked)\n                race |= Race.Faction;\n            if (cbORE.Checked)\n                race |= Race.Ore;\n\n            // Update the predicate\n            // Substitute Faction for \"no race\" since the CCP data dump has the CONCORD faction\n            // ships with a NULL race (please fix CCP!)\n            m_racePredicate = x => ((x.Race == Race.None ? Race.Faction : x.Race) & race) !=\n                Race.None;\n\n            // Update content\n            UpdateContent();\n\n            ShipBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.ShipBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.ShipCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.ShipDataBrowser;\n\n            // Update the settings\n            settings.RacesFilter |= race;\n        }\n\n        /// <summary>\n        /// When the search text changed, we store the next settings\n        /// and update the list view and the list/tree visibilities.\n        /// </summary>\n        protected override void OnSearchTextChanged()\n        {\n            base.OnSearchTextChanged();\n\n            ShipBrowserSettings settings;\n\n            // Skill Planner\n            if (Plan != null)\n                settings = Settings.UI.ShipBrowser;\n            // Character associated Data Browser\n            else if (Character != null)\n                settings = Settings.UI.ShipCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.ShipDataBrowser;\n\n            settings.TextSearch = tbSearchText.Text;\n        }\n\n        #endregion\n\n\n        #region Content creation\n\n        /// <summary>\n        /// Builds the tree view.\n        /// </summary>\n        protected override void BuildTreeView()\n        {\n            // Store the selected node (if any) to restore it after the update\n            int selectedItemHash = tvItems.SelectedNode?.Tag?.GetHashCode() ?? 0;\n\n            if (StaticItems.ShipsMarketGroup == null)\n                return;\n\n            int numberOfItems = 0;\n            tvItems.BeginUpdate();\n            try\n            {\n                tvItems.Nodes.Clear();\n\n                // Create the nodes\n                foreach (MarketGroup group in StaticItems.ShipsMarketGroup.SubGroups)\n                {\n                    TreeNode node = new TreeNode\n                    {\n                        Text = group.Name,\n                        Tag = group\n                    };\n\n                    int result = BuildSubtree(group, node.Nodes);\n\n                    if (result == 0)\n                        continue;\n\n                    numberOfItems += result;\n                    tvItems.Nodes.Add(node);\n                }\n\n                TreeNode selectedNode = null;\n\n                // Restore the selected node (if any)\n                if (selectedItemHash > 0)\n                {\n                    foreach (TreeNode node in tvItems.GetAllNodes().Where(node => node.Tag.GetHashCode() == selectedItemHash))\n                    {\n                        tvItems.SelectNodeWithTag(node.Tag);\n                        selectedNode = node;\n                    }\n                }\n\n                if (selectedNode != null)\n                    return;\n\n                // Reset if the node doesn't exist anymore\n                tvItems.SelectNodeWithTag(null);\n                SelectedObject = null;\n            }\n            finally\n            {\n                tvItems.EndUpdate();\n                AllExpanded = false;\n\n                // If the filtered set is small enough to fit all nodes on screen, call expandAll()\n                if (numberOfItems < tvItems.DisplayRectangle.Height / tvItems.ItemHeight)\n                {\n                    tvItems.ExpandAll();\n                    AllExpanded = true;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Create the tree nodes for the given group and add them to the given nodes collection\n        /// </summary>\n        /// <param name=\"group\"></param>\n        /// <param name=\"nodeCollection\"></param>\n        /// <returns></returns>\n        private int BuildSubtree(MarketGroup group, TreeNodeCollection nodeCollection)\n        {\n            // Total items count in this category and its subcategories\n            int result = 0;\n\n            // Add all subcategories\n            foreach (MarketGroup childGroup in group.SubGroups)\n            {\n                TreeNode node = new TreeNode\n                {\n                    Text = childGroup.Name,\n                    Tag = childGroup\n                };\n\n                // Add this subcategory's items count\n                result += BuildSubtree(childGroup, node.Nodes);\n\n                // Only add if this subcategory has children\n                if (node.GetNodeCount(true) > 0)\n                    nodeCollection.Add(node);\n            }\n\n            // Add all items\n            foreach (TreeNode node in group.Items.Where(\n                x => UsabilityPredicate(x) && m_racePredicate(x)).Select(\n                    childItem => new TreeNode { Text = childItem.Name, Tag = childItem }))\n            {\n                nodeCollection.Add(node);\n                result++;\n            }\n            return result;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/ShipSelectControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SkillBrowserControl.Designer.cs",
    "content": "using EVEMon.Common.Controls;\n\nnamespace EVEMon.SkillPlanner\n{\n    partial class SkillBrowserControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SkillBrowserControl));\n            this.cmsSkillContext = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.miPlanTo0 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miPlanTo1 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miPlanTo2 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miPlanTo3 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miPlanTo4 = new System.Windows.Forms.ToolStripMenuItem();\n            this.miPlanTo5 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tmrTrainingSkillTick = new System.Windows.Forms.Timer(this.components);\n            this.verticalSplitContainer = new EVEMon.Common.Controls.PersistentSplitContainer();\n            this.skillSelectControl = new EVEMon.SkillPlanner.SkillSelectControl();\n            this.rightPanel = new System.Windows.Forms.Panel();\n            this.skillTreeDisplay = new EVEMon.SkillPlanner.SkillTreeDisplayControl();\n            this.headerPanel = new System.Windows.Forms.Panel();\n            this.toolStrip = new System.Windows.Forms.ToolStrip();\n            this.showSkillExplorerMenu = new System.Windows.Forms.ToolStripButton();\n            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\n            this.ownsBookToolStripButton = new System.Windows.Forms.ToolStripButton();\n            this.planToLevel = new System.Windows.Forms.ToolStripDropDownButton();\n            this.planTo0Menu = new System.Windows.Forms.ToolStripMenuItem();\n            this.planTo1Menu = new System.Windows.Forms.ToolStripMenuItem();\n            this.planTo2Menu = new System.Windows.Forms.ToolStripMenuItem();\n            this.planTo3Menu = new System.Windows.Forms.ToolStripMenuItem();\n            this.planTo4Menu = new System.Windows.Forms.ToolStripMenuItem();\n            this.planTo5Menu = new System.Windows.Forms.ToolStripMenuItem();\n            this.pnlPlanControl = new System.Windows.Forms.Panel();\n            this.flpSkillNameCost = new System.Windows.Forms.FlowLayoutPanel();\n            this.lblSkillName = new System.Windows.Forms.Label();\n            this.lblSkillCost = new System.Windows.Forms.Label();\n            this.lblSkillClass = new System.Windows.Forms.Label();\n            this.descriptionTextBox = new System.Windows.Forms.TextBox();\n            this.lblAttributes = new System.Windows.Forms.Label();\n            this.lblLevel5Time = new System.Windows.Forms.Label();\n            this.lblLevel4Time = new System.Windows.Forms.Label();\n            this.lblLevel3Time = new System.Windows.Forms.Label();\n            this.lblLevel2Time = new System.Windows.Forms.Label();\n            this.lblLevel1Time = new System.Windows.Forms.Label();\n            this.lblHelp = new System.Windows.Forms.Label();\n            this.cmsSkillContext.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.verticalSplitContainer)).BeginInit();\n            this.verticalSplitContainer.Panel1.SuspendLayout();\n            this.verticalSplitContainer.Panel2.SuspendLayout();\n            this.verticalSplitContainer.SuspendLayout();\n            this.rightPanel.SuspendLayout();\n            this.headerPanel.SuspendLayout();\n            this.toolStrip.SuspendLayout();\n            this.pnlPlanControl.SuspendLayout();\n            this.flpSkillNameCost.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // cmsSkillContext\n            // \n            this.cmsSkillContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.miPlanTo0,\n            this.miPlanTo1,\n            this.miPlanTo2,\n            this.miPlanTo3,\n            this.miPlanTo4,\n            this.miPlanTo5});\n            this.cmsSkillContext.Name = \"cmsSkillContext\";\n            this.cmsSkillContext.Size = new System.Drawing.Size(151, 136);\n            // \n            // miPlanTo0\n            // \n            this.miPlanTo0.Name = \"miPlanTo0\";\n            this.miPlanTo0.Size = new System.Drawing.Size(150, 22);\n            this.miPlanTo0.Text = \"Remove\";\n            this.miPlanTo0.Click += new System.EventHandler(this.planToMenu_Click);\n            // \n            // miPlanTo1\n            // \n            this.miPlanTo1.Name = \"miPlanTo1\";\n            this.miPlanTo1.Size = new System.Drawing.Size(150, 22);\n            this.miPlanTo1.Text = \"Plan to Level 1\";\n            this.miPlanTo1.Click += new System.EventHandler(this.planToMenu_Click);\n            // \n            // miPlanTo2\n            // \n            this.miPlanTo2.Name = \"miPlanTo2\";\n            this.miPlanTo2.Size = new System.Drawing.Size(150, 22);\n            this.miPlanTo2.Text = \"Plan to Level 2\";\n            this.miPlanTo2.Click += new System.EventHandler(this.planToMenu_Click);\n            // \n            // miPlanTo3\n            // \n            this.miPlanTo3.Name = \"miPlanTo3\";\n            this.miPlanTo3.Size = new System.Drawing.Size(150, 22);\n            this.miPlanTo3.Text = \"Plan to Level 3\";\n            this.miPlanTo3.Click += new System.EventHandler(this.planToMenu_Click);\n            // \n            // miPlanTo4\n            // \n            this.miPlanTo4.Name = \"miPlanTo4\";\n            this.miPlanTo4.Size = new System.Drawing.Size(150, 22);\n            this.miPlanTo4.Text = \"Plan to Level 4\";\n            this.miPlanTo4.Click += new System.EventHandler(this.planToMenu_Click);\n            // \n            // miPlanTo5\n            // \n            this.miPlanTo5.Name = \"miPlanTo5\";\n            this.miPlanTo5.Size = new System.Drawing.Size(150, 22);\n            this.miPlanTo5.Text = \"Plan to Level 5\";\n            this.miPlanTo5.Click += new System.EventHandler(this.planToMenu_Click);\n            // \n            // tmrTrainingSkillTick\n            // \n            this.tmrTrainingSkillTick.Interval = 30000;\n            this.tmrTrainingSkillTick.Tick += new System.EventHandler(this.tmrTrainingSkill_Tick);\n            // \n            // verticalSplitContainer\n            // \n            this.verticalSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.verticalSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;\n            this.verticalSplitContainer.Location = new System.Drawing.Point(0, 0);\n            this.verticalSplitContainer.Name = \"verticalSplitContainer\";\n            // \n            // verticalSplitContainer.Panel1\n            // \n            this.verticalSplitContainer.Panel1.Controls.Add(this.skillSelectControl);\n            this.verticalSplitContainer.Panel1MinSize = 45;\n            // \n            // verticalSplitContainer.Panel2\n            // \n            this.verticalSplitContainer.Panel2.Controls.Add(this.rightPanel);\n            this.verticalSplitContainer.Panel2.Controls.Add(this.lblHelp);\n            this.verticalSplitContainer.RememberDistanceKey = null;\n            this.verticalSplitContainer.Size = new System.Drawing.Size(840, 513);\n            this.verticalSplitContainer.SplitterDistance = 200;\n            this.verticalSplitContainer.SplitterWidth = 3;\n            this.verticalSplitContainer.TabIndex = 1;\n            // \n            // skillSelectControl\n            // \n            this.skillSelectControl.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.skillSelectControl.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.skillSelectControl.HostedInSkillBrowser = true;\n            this.skillSelectControl.Location = new System.Drawing.Point(0, 0);\n            this.skillSelectControl.Margin = new System.Windows.Forms.Padding(2);\n            this.skillSelectControl.Name = \"skillSelectControl\";\n            this.skillSelectControl.Size = new System.Drawing.Size(200, 513);\n            this.skillSelectControl.TabIndex = 0;\n            this.skillSelectControl.SelectedSkillChanged += new System.EventHandler<System.EventArgs>(this.skillSelectControl_SelectedSkillChanged);\n            // \n            // rightPanel\n            // \n            this.rightPanel.Controls.Add(this.skillTreeDisplay);\n            this.rightPanel.Controls.Add(this.headerPanel);\n            this.rightPanel.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.rightPanel.Location = new System.Drawing.Point(0, 0);\n            this.rightPanel.Name = \"rightPanel\";\n            this.rightPanel.Size = new System.Drawing.Size(637, 513);\n            this.rightPanel.TabIndex = 2;\n            // \n            // skillTreeDisplay\n            // \n            this.skillTreeDisplay.AutoScroll = true;\n            this.skillTreeDisplay.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.skillTreeDisplay.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.skillTreeDisplay.Location = new System.Drawing.Point(0, 131);\n            this.skillTreeDisplay.Margin = new System.Windows.Forms.Padding(4);\n            this.skillTreeDisplay.Name = \"skillTreeDisplay\";\n            this.skillTreeDisplay.Size = new System.Drawing.Size(637, 382);\n            this.skillTreeDisplay.TabIndex = 1;\n            this.skillTreeDisplay.SkillClicked += new System.EventHandler<EVEMon.Common.CustomEventArgs.SkillClickedEventArgs>(this.skillTreeDisplay_SkillClicked);\n            // \n            // headerPanel\n            // \n            this.headerPanel.Controls.Add(this.toolStrip);\n            this.headerPanel.Controls.Add(this.pnlPlanControl);\n            this.headerPanel.Dock = System.Windows.Forms.DockStyle.Top;\n            this.headerPanel.Location = new System.Drawing.Point(0, 0);\n            this.headerPanel.Name = \"headerPanel\";\n            this.headerPanel.Size = new System.Drawing.Size(637, 131);\n            this.headerPanel.TabIndex = 0;\n            // \n            // toolStrip\n            // \n            this.toolStrip.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.toolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n            this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.showSkillExplorerMenu,\n            this.toolStripSeparator1,\n            this.ownsBookToolStripButton,\n            this.planToLevel});\n            this.toolStrip.Location = new System.Drawing.Point(0, 106);\n            this.toolStrip.Name = \"toolStrip\";\n            this.toolStrip.Size = new System.Drawing.Size(637, 25);\n            this.toolStrip.TabIndex = 20;\n            this.toolStrip.Text = \"toolStrip\";\n            // \n            // showSkillExplorerMenu\n            // \n            this.showSkillExplorerMenu.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n            this.showSkillExplorerMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"showSkillExplorerMenu.Image\")));\n            this.showSkillExplorerMenu.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.showSkillExplorerMenu.Name = \"showSkillExplorerMenu\";\n            this.showSkillExplorerMenu.Size = new System.Drawing.Size(147, 22);\n            this.showSkillExplorerMenu.Text = \"Show In Skill Explorer...\";\n            this.showSkillExplorerMenu.ToolTipText = \"Opens the Skill Explorer.\";\n            this.showSkillExplorerMenu.Click += new System.EventHandler(this.showSkillExplorerMenu_Click);\n            // \n            // toolStripSeparator1\n            // \n            this.toolStripSeparator1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n            this.toolStripSeparator1.Name = \"toolStripSeparator1\";\n            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);\n            // \n            // ownsBookToolStripButton\n            // \n            this.ownsBookToolStripButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\n            this.ownsBookToolStripButton.CheckOnClick = true;\n            this.ownsBookToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;\n            this.ownsBookToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject(\"ownsBookToolStripButton.Image\")));\n            this.ownsBookToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.ownsBookToolStripButton.Name = \"ownsBookToolStripButton\";\n            this.ownsBookToolStripButton.Size = new System.Drawing.Size(71, 22);\n            this.ownsBookToolStripButton.Text = \"&Owns book\";\n            this.ownsBookToolStripButton.CheckedChanged += new System.EventHandler(this.ownsBookToolStripButton_CheckedChanged);\n            // \n            // planToLevel\n            // \n            this.planToLevel.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.planTo0Menu,\n            this.planTo1Menu,\n            this.planTo2Menu,\n            this.planTo3Menu,\n            this.planTo4Menu,\n            this.planTo5Menu});\n            this.planToLevel.Image = ((System.Drawing.Image)(resources.GetObject(\"planToLevel.Image\")));\n            this.planToLevel.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.planToLevel.Name = \"planToLevel\";\n            this.planToLevel.Size = new System.Drawing.Size(82, 22);\n            this.planToLevel.Text = \"&Plan to...\";\n            // \n            // planTo0Menu\n            // \n            this.planTo0Menu.Name = \"planTo0Menu\";\n            this.planTo0Menu.Size = new System.Drawing.Size(117, 22);\n            this.planTo0Menu.Text = \"&Remove\";\n            this.planTo0Menu.Click += new System.EventHandler(this.planToMenu_Click);\n            // \n            // planTo1Menu\n            // \n            this.planTo1Menu.Name = \"planTo1Menu\";\n            this.planTo1Menu.Size = new System.Drawing.Size(117, 22);\n            this.planTo1Menu.Text = \"Level &1\";\n            this.planTo1Menu.Click += new System.EventHandler(this.planToMenu_Click);\n            // \n            // planTo2Menu\n            // \n            this.planTo2Menu.Name = \"planTo2Menu\";\n            this.planTo2Menu.Size = new System.Drawing.Size(117, 22);\n            this.planTo2Menu.Text = \"Level &2\";\n            this.planTo2Menu.Click += new System.EventHandler(this.planToMenu_Click);\n            // \n            // planTo3Menu\n            // \n            this.planTo3Menu.Name = \"planTo3Menu\";\n            this.planTo3Menu.Size = new System.Drawing.Size(117, 22);\n            this.planTo3Menu.Text = \"Level &3\";\n            this.planTo3Menu.Click += new System.EventHandler(this.planToMenu_Click);\n            // \n            // planTo4Menu\n            // \n            this.planTo4Menu.Name = \"planTo4Menu\";\n            this.planTo4Menu.Size = new System.Drawing.Size(117, 22);\n            this.planTo4Menu.Text = \"Level &4\";\n            this.planTo4Menu.Click += new System.EventHandler(this.planToMenu_Click);\n            // \n            // planTo5Menu\n            // \n            this.planTo5Menu.Name = \"planTo5Menu\";\n            this.planTo5Menu.Size = new System.Drawing.Size(117, 22);\n            this.planTo5Menu.Text = \"Level &5\";\n            this.planTo5Menu.Click += new System.EventHandler(this.planToMenu_Click);\n            // \n            // pnlPlanControl\n            // \n            this.pnlPlanControl.Controls.Add(this.flpSkillNameCost);\n            this.pnlPlanControl.Controls.Add(this.lblSkillClass);\n            this.pnlPlanControl.Controls.Add(this.descriptionTextBox);\n            this.pnlPlanControl.Controls.Add(this.lblAttributes);\n            this.pnlPlanControl.Controls.Add(this.lblLevel5Time);\n            this.pnlPlanControl.Controls.Add(this.lblLevel4Time);\n            this.pnlPlanControl.Controls.Add(this.lblLevel3Time);\n            this.pnlPlanControl.Controls.Add(this.lblLevel2Time);\n            this.pnlPlanControl.Controls.Add(this.lblLevel1Time);\n            this.pnlPlanControl.Dock = System.Windows.Forms.DockStyle.Top;\n            this.pnlPlanControl.Location = new System.Drawing.Point(0, 0);\n            this.pnlPlanControl.Name = \"pnlPlanControl\";\n            this.pnlPlanControl.Size = new System.Drawing.Size(637, 106);\n            this.pnlPlanControl.TabIndex = 4;\n            // \n            // flpSkillNameCost\n            // \n            this.flpSkillNameCost.AutoSize = true;\n            this.flpSkillNameCost.Controls.Add(this.lblSkillName);\n            this.flpSkillNameCost.Controls.Add(this.lblSkillCost);\n            this.flpSkillNameCost.Location = new System.Drawing.Point(0, 19);\n            this.flpSkillNameCost.Margin = new System.Windows.Forms.Padding(0);\n            this.flpSkillNameCost.Name = \"flpSkillNameCost\";\n            this.flpSkillNameCost.Size = new System.Drawing.Size(113, 13);\n            this.flpSkillNameCost.TabIndex = 20;\n            // \n            // lblSkillName\n            // \n            this.lblSkillName.AutoSize = true;\n            this.lblSkillName.Location = new System.Drawing.Point(3, 0);\n            this.lblSkillName.Margin = new System.Windows.Forms.Padding(3, 0, 0, 0);\n            this.lblSkillName.Name = \"lblSkillName\";\n            this.lblSkillName.Size = new System.Drawing.Size(57, 13);\n            this.lblSkillName.TabIndex = 0;\n            this.lblSkillName.Text = \"Skill Name\";\n            // \n            // lblSkillCost\n            // \n            this.lblSkillCost.Anchor = System.Windows.Forms.AnchorStyles.Top;\n            this.lblSkillCost.AutoSize = true;\n            this.lblSkillCost.Location = new System.Drawing.Point(60, 0);\n            this.lblSkillCost.Margin = new System.Windows.Forms.Padding(0);\n            this.lblSkillCost.Name = \"lblSkillCost\";\n            this.lblSkillCost.Size = new System.Drawing.Size(50, 13);\n            this.lblSkillCost.TabIndex = 19;\n            this.lblSkillCost.Text = \"Skill Cost\";\n            // \n            // lblSkillClass\n            // \n            this.lblSkillClass.AutoSize = true;\n            this.lblSkillClass.Location = new System.Drawing.Point(3, 4);\n            this.lblSkillClass.Name = \"lblSkillClass\";\n            this.lblSkillClass.Size = new System.Drawing.Size(71, 13);\n            this.lblSkillClass.TabIndex = 18;\n            this.lblSkillClass.Text = \"Skill Category\";\n            // \n            // descriptionTextBox\n            // \n            this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.descriptionTextBox.BackColor = System.Drawing.SystemColors.Window;\n            this.descriptionTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;\n            this.descriptionTextBox.Location = new System.Drawing.Point(334, 19);\n            this.descriptionTextBox.Multiline = true;\n            this.descriptionTextBox.Name = \"descriptionTextBox\";\n            this.descriptionTextBox.ReadOnly = true;\n            this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n            this.descriptionTextBox.Size = new System.Drawing.Size(300, 81);\n            this.descriptionTextBox.TabIndex = 17;\n            this.descriptionTextBox.Text = \"Description of the skill\";\n            // \n            // lblAttributes\n            // \n            this.lblAttributes.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblAttributes.Location = new System.Drawing.Point(296, 4);\n            this.lblAttributes.Name = \"lblAttributes\";\n            this.lblAttributes.Size = new System.Drawing.Size(338, 13);\n            this.lblAttributes.TabIndex = 14;\n            this.lblAttributes.Text = \"Primary: Intelligence, Secondary: Perception (SP/Hour : 2,000)\";\n            this.lblAttributes.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // lblLevel5Time\n            // \n            this.lblLevel5Time.AutoSize = true;\n            this.lblLevel5Time.Location = new System.Drawing.Point(3, 87);\n            this.lblLevel5Time.Name = \"lblLevel5Time\";\n            this.lblLevel5Time.Size = new System.Drawing.Size(268, 13);\n            this.lblLevel5Time.TabIndex = 5;\n            this.lblLevel5Time.Text = \"Level V: 63d, 18hh, 27m, 56s (plus 154d, 2h, 54m, 24s)\";\n            // \n            // lblLevel4Time\n            // \n            this.lblLevel4Time.AutoSize = true;\n            this.lblLevel4Time.Location = new System.Drawing.Point(3, 74);\n            this.lblLevel4Time.Name = \"lblLevel4Time\";\n            this.lblLevel4Time.Size = new System.Drawing.Size(259, 13);\n            this.lblLevel4Time.TabIndex = 4;\n            this.lblLevel4Time.Text = \"Level IV: 11d, 6h, 33m, 3s (plus 142d, 20h, 21m, 21s)\";\n            // \n            // lblLevel3Time\n            // \n            this.lblLevel3Time.AutoSize = true;\n            this.lblLevel3Time.Location = new System.Drawing.Point(3, 61);\n            this.lblLevel3Time.Name = \"lblLevel3Time\";\n            this.lblLevel3Time.Size = new System.Drawing.Size(264, 13);\n            this.lblLevel3Time.TabIndex = 3;\n            this.lblLevel3Time.Text = \"Level III: 1d, 23h, 49m, 36s (plus 140d, 12h, 31m, 10s)\";\n            // \n            // lblLevel2Time\n            // \n            this.lblLevel2Time.AutoSize = true;\n            this.lblLevel2Time.Location = new System.Drawing.Point(3, 48);\n            this.lblLevel2Time.Name = \"lblLevel2Time\";\n            this.lblLevel2Time.Size = new System.Drawing.Size(231, 13);\n            this.lblLevel2Time.TabIndex = 2;\n            this.lblLevel2Time.Text = \"Level II: 8h, 27m, 17s (plus 140d, 12h, 4m, 26s)\";\n            // \n            // lblLevel1Time\n            // \n            this.lblLevel1Time.AutoSize = true;\n            this.lblLevel1Time.Location = new System.Drawing.Point(3, 35);\n            this.lblLevel1Time.Name = \"lblLevel1Time\";\n            this.lblLevel1Time.Size = new System.Drawing.Size(234, 13);\n            this.lblLevel1Time.TabIndex = 1;\n            this.lblLevel1Time.Text = \"Level I: 1h, 48m, 55s (plus 140d, 10h, 15m, 30s)\";\n            // \n            // lblHelp\n            // \n            this.lblHelp.AutoSize = true;\n            this.lblHelp.Location = new System.Drawing.Point(0, 0);\n            this.lblHelp.Name = \"lblHelp\";\n            this.lblHelp.Size = new System.Drawing.Size(218, 13);\n            this.lblHelp.TabIndex = 30;\n            this.lblHelp.Text = \"Use the tree on the left to select skill to view.\";\n            // \n            // SkillBrowserControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.verticalSplitContainer);\n            this.Name = \"SkillBrowserControl\";\n            this.Size = new System.Drawing.Size(840, 513);\n            this.cmsSkillContext.ResumeLayout(false);\n            this.verticalSplitContainer.Panel1.ResumeLayout(false);\n            this.verticalSplitContainer.Panel2.ResumeLayout(false);\n            this.verticalSplitContainer.Panel2.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.verticalSplitContainer)).EndInit();\n            this.verticalSplitContainer.ResumeLayout(false);\n            this.rightPanel.ResumeLayout(false);\n            this.headerPanel.ResumeLayout(false);\n            this.headerPanel.PerformLayout();\n            this.toolStrip.ResumeLayout(false);\n            this.toolStrip.PerformLayout();\n            this.pnlPlanControl.ResumeLayout(false);\n            this.pnlPlanControl.PerformLayout();\n            this.flpSkillNameCost.ResumeLayout(false);\n            this.flpSkillNameCost.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n        #endregion\n\n        private PersistentSplitContainer verticalSplitContainer;\n        private EVEMon.SkillPlanner.SkillSelectControl skillSelectControl;\n        private System.Windows.Forms.ContextMenuStrip cmsSkillContext;\n        private System.Windows.Forms.ToolStripMenuItem miPlanTo1;\n        private System.Windows.Forms.ToolStripMenuItem miPlanTo2;\n        private System.Windows.Forms.ToolStripMenuItem miPlanTo3;\n        private System.Windows.Forms.ToolStripMenuItem miPlanTo4;\n        private System.Windows.Forms.ToolStripMenuItem miPlanTo5;\n        private System.Windows.Forms.Timer tmrTrainingSkillTick;\n        private System.Windows.Forms.Panel pnlPlanControl;\n        private System.Windows.Forms.Label lblSkillClass;\n        private System.Windows.Forms.TextBox descriptionTextBox;\n        private System.Windows.Forms.Label lblAttributes;\n        private System.Windows.Forms.Label lblLevel5Time;\n        private System.Windows.Forms.Label lblLevel4Time;\n        private System.Windows.Forms.Label lblLevel3Time;\n        private System.Windows.Forms.Label lblLevel2Time;\n        private System.Windows.Forms.Label lblLevel1Time;\n        private System.Windows.Forms.Label lblSkillName;\n        private SkillTreeDisplayControl skillTreeDisplay;\n        private System.Windows.Forms.ToolStripMenuItem miPlanTo0;\n        private System.Windows.Forms.ToolStrip toolStrip;\n        private System.Windows.Forms.Panel rightPanel;\n        private System.Windows.Forms.Panel headerPanel;\n        private System.Windows.Forms.ToolStripButton showSkillExplorerMenu;\n        private System.Windows.Forms.ToolStripDropDownButton planToLevel;\n        private System.Windows.Forms.ToolStripMenuItem planTo2Menu;\n        private System.Windows.Forms.ToolStripMenuItem planTo0Menu;\n        private System.Windows.Forms.ToolStripMenuItem planTo1Menu;\n        private System.Windows.Forms.ToolStripMenuItem planTo3Menu;\n        private System.Windows.Forms.ToolStripMenuItem planTo4Menu;\n        private System.Windows.Forms.ToolStripMenuItem planTo5Menu;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\n        private System.Windows.Forms.ToolStripButton ownsBookToolStripButton;\n        private System.Windows.Forms.Label lblHelp;\n        private System.Windows.Forms.Label lblSkillCost;\n        private System.Windows.Forms.FlowLayoutPanel flpSkillNameCost;\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SkillBrowserControl.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.NotificationWindow;\n\nnamespace EVEMon.SkillPlanner\n{\n    public partial class SkillBrowserControl : UserControl\n    {\n        private Skill m_selectedSkill;\n        private Plan m_plan;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public SkillBrowserControl()\n        {\n            InitializeComponent();\n            verticalSplitContainer.RememberDistanceKey = \"SkillBrowser_Vertical\";\n        }\n\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            lblSkillName.Font = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n\n            // Reposition the help text along side the treeview\n            Control[] result = skillSelectControl.Controls.Find(\"pnlResults\", true);\n            if (result.Length > 0)\n                lblHelp.Location = new Point(lblHelp.Location.X, result[0].Location.Y);\n\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.PlanChanged += EveMonClient_PlanChanged;\n            EveMonClient.CharacterUpdated += EveMonClient_CharacterUpdated;\n            Disposed += OnDisposed;\n\n            //Update the controls visibility\n            UpdateControlVisibility();\n\n            if (m_plan == null)\n                UpdateContent();\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.PlanChanged -= EveMonClient_PlanChanged;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.CharacterUpdated -= EveMonClient_CharacterUpdated;\n            Disposed -= OnDisposed;\n        }\n\n        #endregion\n\n\n        #region Internal Properties\n\n        /// <summary>\n        /// Gets or sets the character.\n        /// </summary>\n        /// <value>\n        /// The character.\n        /// </value>\n        internal Character Character\n        {\n            get { return skillSelectControl.Character; }\n            set\n            {\n                if (skillSelectControl.Character == value)\n                    return;\n\n                skillSelectControl.Character = value;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the plan this control is bound to.\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                if (m_plan == value)\n                    return;\n\n                m_plan = value;\n                skillSelectControl.Plan = value;\n                skillTreeDisplay.Plan = value;\n                UpdateContent();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the selected skills.\n        /// </summary>\n        internal Skill SelectedSkill\n        {\n            get { return m_selectedSkill; }\n            set\n            {\n                if (m_selectedSkill == value)\n                    return;\n\n                m_selectedSkill = value;\n                skillTreeDisplay.RootSkill = value;\n                UpdateContent();\n            }\n        }\n\n        #endregion\n\n\n        #region Content update\n\n        /// <summary>\n        /// Updates the skill browser.\n        /// </summary>\n        internal void UpdateSkillBrowser()\n        {\n            skillSelectControl.UpdateContent();\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Updates the control visibility.\n        /// </summary>\n        private void UpdateControlVisibility()\n        {\n            if (!Settings.UI.SafeForWork)\n            {\n                planToLevel.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;\n                showSkillExplorerMenu.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;\n            }\n            else\n            {\n                planToLevel.DisplayStyle = ToolStripItemDisplayStyle.Text;\n                showSkillExplorerMenu.DisplayStyle = ToolStripItemDisplayStyle.Text;\n            }\n        }\n\n        /// <summary>\n        /// Updates the combo on the top right, to change the planned level.\n        /// </summary>\n        private void UpdatePlannedLevel()\n        {\n            planToLevel.Visible = m_plan != null;\n\n            // Not visible\n            if (m_selectedSkill == null || m_plan == null)\n                return;\n\n            planToLevel.Enabled = false;\n\n            // Toolbar > Planned to... dropdown menu\n            for (int i = 0; i <= 5; i++)\n            {\n                planToLevel.Enabled |= m_plan.UpdatesRegularPlanToMenu(planToLevel.DropDownItems[i], m_selectedSkill, i);\n            }\n\n            // Toolbar > \"Planned to\" label\n            int level = m_plan.GetPlannedLevel(m_selectedSkill);\n            planToLevel.Text = $\"Planned To {(level == 0 ? \"(none)\" : $\"Level {Skill.GetRomanFromInt(level)}\")}...\";\n        }\n\n        /// <summary>\n        /// Updates the browser's content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            if (m_selectedSkill == null)\n            {\n                // View help message\n                lblHelp.Visible = true;\n\n                rightPanel.Visible = false;\n                return;\n            }\n\n            // Hide help message\n            lblHelp.Visible = false;\n\n            // Updates controls visibility\n            rightPanel.Visible = true;\n\n            // Updates the main labels\n            lblSkillClass.Text = m_selectedSkill.Group?.Name ?? EveMonConstants.UnknownText;\n            lblSkillName.Text = $\"{m_selectedSkill.Name} ({m_selectedSkill.Rank})\";\n            lblSkillCost.Text = $\"{m_selectedSkill.FormattedCost} ISK\";\n            descriptionTextBox.Text = m_selectedSkill.Description;\n\n            if (!m_selectedSkill.IsPublic)\n                descriptionTextBox.Text += @\" ** THIS IS A NON-PUBLIC SKILL **\";\n\n            lblAttributes.Text = $\"Primary: {m_selectedSkill.PrimaryAttribute}, \" +\n                                 $\"Secondary: {m_selectedSkill.SecondaryAttribute}\";\n\n            if (m_selectedSkill.Character != null)\n                lblAttributes.Text += $\" (SP/Hour: {m_selectedSkill.SkillPointsPerHour:N0})\";\n\n            // Training time per level\n            for (int i = 1; i <= 5; i++)\n            {\n                UpdateLevelLabel(pnlPlanControl.Controls.OfType<Label>()\n                    .First(label => label.Name == $\"lblLevel{i}Time\"), i);\n            }\n\n            // Update \"owned\" checkbox\n            if (m_selectedSkill.IsKnown)\n            {\n                ownsBookToolStripButton.Checked = false;\n                ownsBookToolStripButton.Enabled = false;\n            }\n            else\n            {\n                ownsBookToolStripButton.Checked = m_selectedSkill.IsOwned;\n                ownsBookToolStripButton.Enabled = true;\n            }\n            ownsBookToolStripButton.Visible = m_selectedSkill.Character != null;\n\n            // Update \"planned level\" combo (on the top left)\n            UpdatePlannedLevel();\n\n            // Enable refresh every 30s if the selected skill is in training\n            tmrTrainingSkillTick.Enabled = m_selectedSkill.IsTraining;\n        }\n\n        /// <summary>\n        /// Updates the provided label with the training time to the given level.\n        /// </summary>\n        /// <param name=\"label\"></param>\n        /// <param name=\"level\"></param>\n        private void UpdateLevelLabel(Control label, int level)\n        {\n            label.Visible = m_selectedSkill?.Character != null;\n\n            if (m_selectedSkill?.Character == null)\n                return;\n\n            StringBuilder sb = new StringBuilder();\n\n            // \"Level III: \"\n            sb.Append($\"Level {Skill.GetRomanFromInt(level)}: \");\n\n            // Is it already trained ?\n            if (m_selectedSkill.Level >= level)\n            {\n                label.Text = sb.Append(\"Already trained\").ToString();\n                return;\n            }\n\n            // Left training time for level only\n            TimeSpan timeOfLevelOnly = m_selectedSkill.GetLeftTrainingTimeForLevelOnly(level);\n            sb.Append(timeOfLevelOnly.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas));\n\n            // Total training time or completion percentage\n            TimeSpan timeForPrereqs = m_selectedSkill.Character.GetTrainingTimeToMultipleSkills(m_selectedSkill.Prerequisites);\n            TimeSpan totalPrereqTime = m_selectedSkill.GetLeftTrainingTimeToLevel(level - 1).Add(timeForPrereqs);\n            if (totalPrereqTime > TimeSpan.Zero)\n            {\n                sb.Append($\" (plus {totalPrereqTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas)})\");\n            }\n            else\n            {\n                // Completion percentage\n                if (m_selectedSkill.Level != 5)\n                {\n                    float percentDone = m_selectedSkill.FractionCompleted;\n                    sb.Append($\" ({percentDone:P0} complete)\");\n                }\n            }\n            if(level > m_selectedSkill.StaticData.AlphaLimit)\n            {\n                sb.Append(\" (Omega only)\");\n            }\n\n            label.Text = sb.ToString();\n        }\n\n        /// <summary>\n        /// Sets the plan editor's skill selector selected skill.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        private void SetPlanEditorSkillSelectorSelectedSkill(Skill skill)\n        {\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            planWindow?.SetPlanEditorSkillSelectorSelectedSkill(skill);\n        }\n\n        /// <summary>\n        /// Updates the owned skill book controls.\n        /// </summary>\n        private void UpdateOwnedSkillBookControls()\n        {\n            // Set button check state according to skills 'owned' property;\n            // this will also trigger a check through the character's assets\n            ownsBookToolStripButton.Checked = m_selectedSkill.IsOwned | (m_selectedSkill.\n                HasBookInAssets && !m_selectedSkill.IsKnown);\n\n            skillSelectControl.UpdateContent();\n\n            // Update also the skill selector of the Plan Editor\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            planWindow?.UpdatePlanEditorSkillSelection();\n\n            // Update the Owned Skill books window if open\n            if (m_plan != null)\n                WindowsFactory.GetByTag<OwnedSkillBooksWindow, Character>(m_plan.Character as\n                    Character)?.UpdateList();\n        }\n\n        #endregion\n\n\n        /// <summary>\n        /// Sets the skill browser's skill selection control selected skill.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        internal void SetSkillBrowserSkillSelectorSelectedSkill(Skill skill)\n        {\n            skillSelectControl.SelectedSkill = skill;\n        }\n        \n\n        #region Global events\n\n        /// <summary>\n        /// Occurs whenever a plan is changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_PlanChanged(object sender, PlanChangedEventArgs e)\n        {\n            UpdatePlannedLevel();\n        }\n\n        /// <summary>\n        /// Occurs whenever the settings changed.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateControlVisibility();\n        }\n\n        /// <summary>\n        /// Occurs whenever the settings changed.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (m_plan == null || e.Character != m_plan.Character || m_selectedSkill == null)\n                return;\n\n            // Update the 'Owns book' indicator \n            // if the indicator is not already set\n            // This prevents the update on repeated requests from IGB\n            if (ownsBookToolStripButton.Checked != m_selectedSkill.IsOwned)\n                UpdateOwnedSkillBookControls();\n        }\n\n        #endregion\n\n\n        #region Controls events handlers\n\n        /// <summary>\n        /// Every 30s, we update the time for the training skill.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tmrTrainingSkill_Tick(object sender, EventArgs e)\n        {\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Whenever the selection changes, we update the selected skill.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void skillSelectControl_SelectedSkillChanged(object sender, EventArgs e)\n        {\n            SelectedSkill = skillSelectControl.SelectedSkill;\n            SetPlanEditorSkillSelectorSelectedSkill(skillSelectControl.SelectedSkill);\n        }\n\n        /// <summary>\n        /// Toolbar > Owns book.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void ownsBookToolStripButton_CheckedChanged(object sender, EventArgs e)\n        {\n            // Set skill's 'owned' property according to button check state\n            m_selectedSkill.IsOwned = ownsBookToolStripButton.Checked;\n\n            UpdateOwnedSkillBookControls();\n        }\n\n        /// <summary>\n        /// Toolbar > Show what this skills enables...\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showSkillExplorerMenu_Click(object sender, EventArgs e)\n        {\n            // Open the skill explorer\n            SkillExplorerWindow.ShowSkillExplorerWindow(skillSelectControl.Character, m_plan).\n                ShowSkillInExplorer(m_selectedSkill);\n        }\n\n        #endregion\n\n\n        #region Skill tree's context menu\n\n        /// <summary>\n        /// Whenever the user right-click the skill tree on the left, we display the context menu.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void skillTreeDisplay_SkillClicked(object sender, SkillClickedEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n            {\n                if (m_plan == null)\n                    return;\n\n                for (int i = 0; i <= 5; i++)\n                {\n                    m_plan.UpdatesRegularPlanToMenu(cmsSkillContext.Items[i], e.Skill, i);\n                }\n\n                Cursor = Cursors.Default;\n                cmsSkillContext.Show(skillTreeDisplay, e.Location);\n                return;\n            }\n\n            SelectedSkill = e.Skill;\n            skillSelectControl.SelectedSkill = e.Skill;\n            SetPlanEditorSkillSelectorSelectedSkill(e.Skill);\n        }\n\n        /// <summary>\n        /// Context menu > Plan to N / Remove.\n        /// Toolbar > Plan to... > Level N / Remove.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void planToMenu_Click(object sender, EventArgs e)\n        {\n            IPlanOperation operation = ((ToolStripMenuItem)sender).Tag as IPlanOperation;\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            if (planWindow == null)\n                return;\n\n            PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow, operation);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SkillBrowserControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"cmsSkillContext.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"tmrTrainingSkillTick.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>150, 18</value>\n  </metadata>\n  <metadata name=\"toolStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>304, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"showSkillExplorerMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI+SURBVDhPlZLvT5JRGIbZ3Poz+OTWRoko5ZbYGKMIHWVO\n        X7UQ0wQyUQNUfqQCQ0hAFBJNUoswMkLKpYUzN4oQK2K6yGbrf/C7bm53QG8tE6mu7flwdu5zdp7zXJT/\n        Qbkq6SUCRB65/DvpsHRBRJWuiKid6Yq0JOVRqYfczo1wtqqmIXh+W/ayCZ2vxFCGr8GRMMOW0EO5KnWR\n        sezUTPHy68bYu/a1AXg/u+HbnIZ/y4O5rzN4+s2XusQAZUxiI+MHueDmeTRLckxujOL+pzuY2byL2S/3\n        8GTrAQJbXljjOsgjYhMZ3w/fzi4rHSjeG43bMJ4YgWqpA40BAk3PamGIqGCKadG2csVJxn9QomWgVHcC\n        JfqSneoJAboWO+CMW9E+L0a1p2I49ZlH0rnmYF1Sslg/nTn0O8U9Beh/rYb+jRbmqA7WNSN6l7tR4eIu\n        k5EMogChyTrGQjkNN8M96AurYXzbh8FVPTQhOcod7H0XXHp0MbsHx9uPolBxDEwVfad8iAtZUAJLzIir\n        PiH4Ts6vFmq9gmRqvLk9YKrpZbQ+2p4p2p95ieRxIwSuM0hNBoqFVnSH2nHZX5XbA6aG7ml+KMRgzICh\n        dyY4P1gw9tEO97oTUxsuqEIdaPBXHe5BkYKWf7KNsat4Lsu0Yn9vzkxlPDGMiXUHlC+uo95Xmd2DnzC6\n        CmqKNIxt7q3TOGfnQHD7LG7Mt0I214LKSf5+Dw6DIIg8pppJZelTZWFROTZWkjfCPujBv8I2n/rDAwrl\n        O131KF98C1uOAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"ownsBookToolStripButton.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG\n        YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9\n        0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw\n        bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc\n        VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9\n        c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32\n        Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo\n        mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+\n        kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D\n        TgDQASA1MVpwzwAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <data name=\"planToLevel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALTSURBVDhPZZLrT1JxGMdd/1Hr1CuXXXzRVi9aa91Xs5rp\n        Zul0zlgm2LScNy7iJRGYIni4KJcDB1EEQfACJBcBUfFSttyx9aL1rhrffnCopn63Z+fN8/n8nuf3OyV/\n        k93d9WUyGU8ikbKGo3GTLxQxzAaX9dOBYKFc/iDt9AWqSOspnjiW9PY2l8xswBeJwegJYIBxoUPPHCnh\n        pOO3eJxuJu0nJcl0mvv6/Qc+Hn7D+v4B/KlNLG3sYD65CUMwAn0gXCi5WvdLrjOdlHjjCS57cIjozj5W\n        NncQ2trFXCIDnT90ooRG28827dS5IsqHWVzhItk9cvIWrCsx0OS04+CodxmdjAfXW+W5m9LRsiLKRzvn\n        5WZiaTDheEFgXo5icmm18LWGYlB5ltA44UCFchIXhWIi0B4VSKwM51xNIvXpC9Y/HxTuIZDeIqvswRXP\n        wBRaQ5vNi5pxO8qFstzd/mMCsZnhZqIphAkwn9zAAoHd5A56HT502b3ocvghdgVRP2JEjqKw0dOFIsqn\n        dcLC0Qth5KfIjy62e9BiYMnOXjTRLASGafTY3DC2tiJ350ZBUkT5tNMMx4QTYD+soY+dR/2YGcPMLJoJ\n        +JaMLmWskMlkYFkWA3W1GBpSVhZRPnmBhVyeczUFhXsR2oUIxKwPE4tRqN3TcA1TiM9QEIlEeNqpyD3T\n        MBeKKB/ByBRX/V6HyiEdqhR6vFCZ8GiIRoNa8w+ekFBoMTK4rbagbnLuUhHlc+WNhHsgUePJoBY1BK4b\n        I00qNejB/3DjuB51RjfuqxnU2/yXiyifMpGEazM5YQ7FMZ/OYiGRgFnFw4oOiki1qNY50TDlwcMxBxqP\n        C84LJFyFXIMapQkC8sPQ/aUIOruh6aXwnKxRqbGj1jCLlzY/HmudELDBo4LTTe3cGUE3qFdinH0tBUWe\n        SdpC4WpHH0rfjaC8V4Nrg3rcUlpwT52fIC8oKfkDVINIp0nV8IoAAAAASUVORK5CYII=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SkillExplorerWindow.Designer.cs",
    "content": "using EVEMon.Common.Controls;\n\nnamespace EVEMon.SkillPlanner\n{\n    partial class SkillExplorerWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode(\"Node0\");\n            System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode(\"Node0\");\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SkillExplorerWindow));\n            this.grpPlanName = new System.Windows.Forms.GroupBox();\n            this.lblSkillInfo = new System.Windows.Forms.Label();\n            this.btnClose = new System.Windows.Forms.Button();\n            this.lowerPanel = new System.Windows.Forms.Panel();\n            this.lblRedFont = new System.Windows.Forms.Label();\n            this.lblDimmedFont = new System.Windows.Forms.Label();\n            this.lblRedFontInfo = new System.Windows.Forms.Label();\n            this.lblDimmedFontInfo = new System.Windows.Forms.Label();\n            this.lblNormalFont = new System.Windows.Forms.Label();\n            this.middlePanel = new System.Windows.Forms.Panel();\n            this.splitContainer = new EVEMon.Common.Controls.PersistentSplitContainer();\n            this.tvSkills = new System.Windows.Forms.TreeView();\n            this.pnlSkillHeader = new System.Windows.Forms.Panel();\n            this.lblSkills = new System.Windows.Forms.Label();\n            this.tvEntity = new System.Windows.Forms.TreeView();\n            this.pnlItemHeader = new System.Windows.Forms.Panel();\n            this.lblItems = new System.Windows.Forms.Label();\n            this.cmSkills = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.planToMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsRemove = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsAddL1 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsAddL2 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsAddL3 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsAddL4 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsAddL5 = new System.Windows.Forms.ToolStripMenuItem();\n            this.planToSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.showInSkillBrowserMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInBrowserSeperator = new System.Windows.Forms.ToolStripSeparator();\n            this.showInSkillExplorerMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.showPrerequisitiesMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInMenuSeperator = new System.Windows.Forms.ToolStripSeparator();\n            this.tsmiSkillsExpandAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmiSkillsCollapseAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmEntity = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.planToObject = new System.Windows.Forms.ToolStripMenuItem();\n            this.planToObjectSeperator = new System.Windows.Forms.ToolStripSeparator();\n            this.showObjectInBrowserMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.showObjectInBrowserSeperator = new System.Windows.Forms.ToolStripSeparator();\n            this.showObjectPrerequisitiesMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.showObjectInMenuSeperator = new System.Windows.Forms.ToolStripSeparator();\n            this.tsmiObjectsExpandAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmiObjectsCollapseAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.groupBox2 = new System.Windows.Forms.GroupBox();\n            this.cbHistory = new System.Windows.Forms.ComboBox();\n            this.cbShowBaseOnly = new System.Windows.Forms.CheckBox();\n            this.rbShowAlpha = new System.Windows.Forms.RadioButton();\n            this.rbShowTree = new System.Windows.Forms.RadioButton();\n            this.tmrAutoUpdate = new System.Windows.Forms.Timer(this.components);\n            this.toolTip = new System.Windows.Forms.ToolTip(this.components);\n            this.grpPlanName.SuspendLayout();\n            this.lowerPanel.SuspendLayout();\n            this.middlePanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();\n            this.splitContainer.Panel1.SuspendLayout();\n            this.splitContainer.Panel2.SuspendLayout();\n            this.splitContainer.SuspendLayout();\n            this.pnlSkillHeader.SuspendLayout();\n            this.pnlItemHeader.SuspendLayout();\n            this.cmSkills.SuspendLayout();\n            this.cmEntity.SuspendLayout();\n            this.groupBox2.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // grpPlanName\n            // \n            this.grpPlanName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.grpPlanName.Controls.Add(this.lblSkillInfo);\n            this.grpPlanName.Location = new System.Drawing.Point(12, 12);\n            this.grpPlanName.Name = \"grpPlanName\";\n            this.grpPlanName.Size = new System.Drawing.Size(560, 40);\n            this.grpPlanName.TabIndex = 0;\n            this.grpPlanName.TabStop = false;\n            this.grpPlanName.Text = \"Selected Skill Details\";\n            // \n            // lblSkillInfo\n            // \n            this.lblSkillInfo.AutoSize = true;\n            this.lblSkillInfo.Location = new System.Drawing.Point(12, 16);\n            this.lblSkillInfo.Name = \"lblSkillInfo\";\n            this.lblSkillInfo.Size = new System.Drawing.Size(47, 13);\n            this.lblSkillInfo.TabIndex = 0;\n            this.lblSkillInfo.Text = \"Skill Info\";\n            // \n            // btnClose\n            // \n            this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnClose.Location = new System.Drawing.Point(482, 22);\n            this.btnClose.Name = \"btnClose\";\n            this.btnClose.Size = new System.Drawing.Size(75, 23);\n            this.btnClose.TabIndex = 2;\n            this.btnClose.Text = \"Close\";\n            this.btnClose.UseVisualStyleBackColor = true;\n            this.btnClose.Click += new System.EventHandler(this.btnClose_Click);\n            // \n            // lowerPanel\n            // \n            this.lowerPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lowerPanel.Controls.Add(this.lblRedFont);\n            this.lowerPanel.Controls.Add(this.lblDimmedFont);\n            this.lowerPanel.Controls.Add(this.lblRedFontInfo);\n            this.lowerPanel.Controls.Add(this.lblDimmedFontInfo);\n            this.lowerPanel.Controls.Add(this.lblNormalFont);\n            this.lowerPanel.Controls.Add(this.btnClose);\n            this.lowerPanel.Location = new System.Drawing.Point(12, 389);\n            this.lowerPanel.Name = \"lowerPanel\";\n            this.lowerPanel.Size = new System.Drawing.Size(557, 47);\n            this.lowerPanel.TabIndex = 4;\n            // \n            // lblRedFont\n            // \n            this.lblRedFont.AutoSize = true;\n            this.lblRedFont.ForeColor = System.Drawing.Color.Red;\n            this.lblRedFont.Location = new System.Drawing.Point(337, 3);\n            this.lblRedFont.Name = \"lblRedFont\";\n            this.lblRedFont.Size = new System.Drawing.Size(27, 13);\n            this.lblRedFont.TabIndex = 8;\n            this.lblRedFont.Text = \"Red\";\n            // \n            // lblDimmedFont\n            // \n            this.lblDimmedFont.AutoSize = true;\n            this.lblDimmedFont.ForeColor = System.Drawing.Color.DimGray;\n            this.lblDimmedFont.Location = new System.Drawing.Point(153, 3);\n            this.lblDimmedFont.Name = \"lblDimmedFont\";\n            this.lblDimmedFont.Size = new System.Drawing.Size(45, 13);\n            this.lblDimmedFont.TabIndex = 6;\n            this.lblDimmedFont.Text = \"Dimmed\";\n            // \n            // lblRedFontInfo\n            // \n            this.lblRedFontInfo.AutoSize = true;\n            this.lblRedFontInfo.Location = new System.Drawing.Point(361, 3);\n            this.lblRedFontInfo.Name = \"lblRedFontInfo\";\n            this.lblRedFontInfo.Size = new System.Drawing.Size(151, 13);\n            this.lblRedFontInfo.TabIndex = 9;\n            this.lblRedFontInfo.Text = \"= other untrained skills needed\";\n            // \n            // lblDimmedFontInfo\n            // \n            this.lblDimmedFontInfo.AutoSize = true;\n            this.lblDimmedFontInfo.Location = new System.Drawing.Point(194, 3);\n            this.lblDimmedFontInfo.Name = \"lblDimmedFontInfo\";\n            this.lblDimmedFontInfo.Size = new System.Drawing.Size(138, 13);\n            this.lblDimmedFontInfo.TabIndex = 7;\n            this.lblDimmedFontInfo.Text = \"= unlocked by this skill level\";\n            // \n            // lblNormalFont\n            // \n            this.lblNormalFont.AutoSize = true;\n            this.lblNormalFont.Location = new System.Drawing.Point(6, 3);\n            this.lblNormalFont.Name = \"lblNormalFont\";\n            this.lblNormalFont.Size = new System.Drawing.Size(142, 13);\n            this.lblNormalFont.TabIndex = 5;\n            this.lblNormalFont.Text = \"Normal font = already trained\";\n            // \n            // middlePanel\n            // \n            this.middlePanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.middlePanel.Controls.Add(this.splitContainer);\n            this.middlePanel.Location = new System.Drawing.Point(12, 115);\n            this.middlePanel.Name = \"middlePanel\";\n            this.middlePanel.Size = new System.Drawing.Size(560, 268);\n            this.middlePanel.TabIndex = 5;\n            // \n            // splitContainer\n            // \n            this.splitContainer.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\n            this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;\n            this.splitContainer.Location = new System.Drawing.Point(0, 0);\n            this.splitContainer.Name = \"splitContainer\";\n            // \n            // splitContainer.Panel1\n            // \n            this.splitContainer.Panel1.Controls.Add(this.tvSkills);\n            this.splitContainer.Panel1.Controls.Add(this.pnlSkillHeader);\n            // \n            // splitContainer.Panel2\n            // \n            this.splitContainer.Panel2.Controls.Add(this.tvEntity);\n            this.splitContainer.Panel2.Controls.Add(this.pnlItemHeader);\n            this.splitContainer.RememberDistanceKey = null;\n            this.splitContainer.Size = new System.Drawing.Size(560, 268);\n            this.splitContainer.SplitterDistance = 278;\n            this.splitContainer.SplitterWidth = 3;\n            this.splitContainer.TabIndex = 0;\n            // \n            // tvSkills\n            // \n            this.tvSkills.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tvSkills.Location = new System.Drawing.Point(0, 18);\n            this.tvSkills.Name = \"tvSkills\";\n            treeNode1.Name = \"Node0\";\n            treeNode1.Text = \"Node0\";\n            this.tvSkills.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {\n            treeNode1});\n            this.tvSkills.ShowNodeToolTips = true;\n            this.tvSkills.Size = new System.Drawing.Size(274, 246);\n            this.tvSkills.TabIndex = 0;\n            this.tvSkills.DoubleClick += new System.EventHandler(this.tvSkills_DoubleClick);\n            // \n            // pnlSkillHeader\n            // \n            this.pnlSkillHeader.BackColor = System.Drawing.Color.Cornsilk;\n            this.pnlSkillHeader.Controls.Add(this.lblSkills);\n            this.pnlSkillHeader.Dock = System.Windows.Forms.DockStyle.Top;\n            this.pnlSkillHeader.ForeColor = System.Drawing.SystemColors.ControlText;\n            this.pnlSkillHeader.Location = new System.Drawing.Point(0, 0);\n            this.pnlSkillHeader.Name = \"pnlSkillHeader\";\n            this.pnlSkillHeader.Size = new System.Drawing.Size(274, 18);\n            this.pnlSkillHeader.TabIndex = 1;\n            // \n            // lblSkills\n            // \n            this.lblSkills.AutoSize = true;\n            this.lblSkills.Location = new System.Drawing.Point(1, 2);\n            this.lblSkills.Name = \"lblSkills\";\n            this.lblSkills.Size = new System.Drawing.Size(73, 13);\n            this.lblSkills.TabIndex = 0;\n            this.lblSkills.Text = \"Enabled Skills\";\n            // \n            // tvEntity\n            // \n            this.tvEntity.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tvEntity.Location = new System.Drawing.Point(0, 18);\n            this.tvEntity.Name = \"tvEntity\";\n            treeNode2.Name = \"Node0\";\n            treeNode2.Text = \"Node0\";\n            this.tvEntity.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {\n            treeNode2});\n            this.tvEntity.ShowNodeToolTips = true;\n            this.tvEntity.Size = new System.Drawing.Size(275, 246);\n            this.tvEntity.TabIndex = 0;\n            this.tvEntity.DoubleClick += new System.EventHandler(this.tvEntity_DoubleClick);\n            // \n            // pnlItemHeader\n            // \n            this.pnlItemHeader.BackColor = System.Drawing.Color.LightCyan;\n            this.pnlItemHeader.Controls.Add(this.lblItems);\n            this.pnlItemHeader.Dock = System.Windows.Forms.DockStyle.Top;\n            this.pnlItemHeader.Location = new System.Drawing.Point(0, 0);\n            this.pnlItemHeader.Name = \"pnlItemHeader\";\n            this.pnlItemHeader.Size = new System.Drawing.Size(275, 18);\n            this.pnlItemHeader.TabIndex = 0;\n            // \n            // lblItems\n            // \n            this.lblItems.AutoSize = true;\n            this.lblItems.Location = new System.Drawing.Point(1, 2);\n            this.lblItems.Name = \"lblItems\";\n            this.lblItems.Size = new System.Drawing.Size(74, 13);\n            this.lblItems.TabIndex = 0;\n            this.lblItems.Text = \"Enabled Items\";\n            // \n            // cmSkills\n            // \n            this.cmSkills.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.planToMenu,\n            this.planToSeparator,\n            this.showInSkillBrowserMenu,\n            this.showInBrowserSeperator,\n            this.showInSkillExplorerMenu,\n            this.showPrerequisitiesMenu,\n            this.showInMenuSeperator,\n            this.tsmiSkillsExpandAll,\n            this.tsmiSkillsCollapseAll});\n            this.cmSkills.Name = \"cmSkills\";\n            this.cmSkills.Size = new System.Drawing.Size(242, 154);\n            this.cmSkills.Opening += new System.ComponentModel.CancelEventHandler(this.cmSkills_Opening);\n            // \n            // planToMenu\n            // \n            this.planToMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tsRemove,\n            this.tsAddL1,\n            this.tsAddL2,\n            this.tsAddL3,\n            this.tsAddL4,\n            this.tsAddL5});\n            this.planToMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"planToMenu.Image\")));\n            this.planToMenu.Name = \"planToMenu\";\n            this.planToMenu.Size = new System.Drawing.Size(241, 22);\n            this.planToMenu.Text = \"Plan to...\";\n            // \n            // tsRemove\n            // \n            this.tsRemove.Name = \"tsRemove\";\n            this.tsRemove.Size = new System.Drawing.Size(117, 22);\n            this.tsRemove.Text = \"Remove\";\n            this.tsRemove.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsAddL1\n            // \n            this.tsAddL1.Name = \"tsAddL1\";\n            this.tsAddL1.Size = new System.Drawing.Size(117, 22);\n            this.tsAddL1.Text = \"Level 1\";\n            this.tsAddL1.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsAddL2\n            // \n            this.tsAddL2.Name = \"tsAddL2\";\n            this.tsAddL2.Size = new System.Drawing.Size(117, 22);\n            this.tsAddL2.Text = \"Level 2\";\n            this.tsAddL2.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsAddL3\n            // \n            this.tsAddL3.Name = \"tsAddL3\";\n            this.tsAddL3.Size = new System.Drawing.Size(117, 22);\n            this.tsAddL3.Text = \"Level 3\";\n            this.tsAddL3.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsAddL4\n            // \n            this.tsAddL4.Name = \"tsAddL4\";\n            this.tsAddL4.Size = new System.Drawing.Size(117, 22);\n            this.tsAddL4.Text = \"Level 4\";\n            this.tsAddL4.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsAddL5\n            // \n            this.tsAddL5.Name = \"tsAddL5\";\n            this.tsAddL5.Size = new System.Drawing.Size(117, 22);\n            this.tsAddL5.Text = \"Level 5\";\n            this.tsAddL5.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // planToSeparator\n            // \n            this.planToSeparator.Name = \"planToSeparator\";\n            this.planToSeparator.Size = new System.Drawing.Size(238, 6);\n            // \n            // showInSkillBrowserMenu\n            // \n            this.showInSkillBrowserMenu.Name = \"showInSkillBrowserMenu\";\n            this.showInSkillBrowserMenu.Size = new System.Drawing.Size(241, 22);\n            this.showInSkillBrowserMenu.Text = \"Show In Skill Browser...\";\n            this.showInSkillBrowserMenu.Click += new System.EventHandler(this.showInSkillBrowserMenu_Click);\n            // \n            // showInBrowserSeperator\n            // \n            this.showInBrowserSeperator.Name = \"showInBrowserSeperator\";\n            this.showInBrowserSeperator.Size = new System.Drawing.Size(238, 6);\n            // \n            // showInSkillExplorerMenu\n            // \n            this.showInSkillExplorerMenu.Name = \"showInSkillExplorerMenu\";\n            this.showInSkillExplorerMenu.Size = new System.Drawing.Size(241, 22);\n            this.showInSkillExplorerMenu.Text = \"Show me what this skill unlocks\";\n            this.showInSkillExplorerMenu.Click += new System.EventHandler(this.showInSkillExplorerMenu_Click);\n            // \n            // showPrerequisitiesMenu\n            // \n            this.showPrerequisitiesMenu.Name = \"showPrerequisitiesMenu\";\n            this.showPrerequisitiesMenu.Size = new System.Drawing.Size(241, 22);\n            this.showPrerequisitiesMenu.Text = \"Show Untrained Prerequisites\";\n            this.showPrerequisitiesMenu.Click += new System.EventHandler(this.showPrerequisitiesMenu_Click);\n            // \n            // showInMenuSeperator\n            // \n            this.showInMenuSeperator.Name = \"showInMenuSeperator\";\n            this.showInMenuSeperator.Size = new System.Drawing.Size(238, 6);\n            // \n            // tsmiSkillsExpandAll\n            // \n            this.tsmiSkillsExpandAll.Name = \"tsmiSkillsExpandAll\";\n            this.tsmiSkillsExpandAll.Size = new System.Drawing.Size(241, 22);\n            this.tsmiSkillsExpandAll.Text = \"&Expand All\";\n            this.tsmiSkillsExpandAll.Click += new System.EventHandler(this.tsmiExpandAll_Click);\n            // \n            // tsmiSkillsCollapseAll\n            // \n            this.tsmiSkillsCollapseAll.Name = \"tsmiSkillsCollapseAll\";\n            this.tsmiSkillsCollapseAll.Size = new System.Drawing.Size(241, 22);\n            this.tsmiSkillsCollapseAll.Text = \"&Collapse All\";\n            this.tsmiSkillsCollapseAll.Click += new System.EventHandler(this.tsmiColapseAll_Click);\n            // \n            // cmEntity\n            // \n            this.cmEntity.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.planToObject,\n            this.planToObjectSeperator,\n            this.showObjectInBrowserMenuItem,\n            this.showObjectInBrowserSeperator,\n            this.showObjectPrerequisitiesMenu,\n            this.showObjectInMenuSeperator,\n            this.tsmiObjectsExpandAll,\n            this.tsmiObjectsCollapseAll});\n            this.cmEntity.Name = \"cmShips\";\n            this.cmEntity.Size = new System.Drawing.Size(229, 154);\n            this.cmEntity.Opening += new System.ComponentModel.CancelEventHandler(this.cmEntity_Opening);\n            // \n            // planToObject\n            // \n            this.planToObject.Name = \"planToObject\";\n            this.planToObject.Size = new System.Drawing.Size(228, 22);\n            this.planToObject.Text = \"Add To Plan...\";\n            this.planToObject.Click += new System.EventHandler(this.planToObjectMenuItem_Click);\n            // \n            // planToObjectSeperator\n            // \n            this.planToObjectSeperator.Name = \"planToObjectSeperator\";\n            this.planToObjectSeperator.Size = new System.Drawing.Size(225, 6);\n            // \n            // showObjectInBrowserMenuItem\n            // \n            this.showObjectInBrowserMenuItem.Name = \"showObjectInBrowserMenuItem\";\n            this.showObjectInBrowserMenuItem.Size = new System.Drawing.Size(228, 22);\n            this.showObjectInBrowserMenuItem.Text = \"Show In Browser...\";\n            this.showObjectInBrowserMenuItem.Click += new System.EventHandler(this.tvEntity_DoubleClick);\n            // \n            // showObjectInBrowserSeperator\n            // \n            this.showObjectInBrowserSeperator.Name = \"showObjectInBrowserSeperator\";\n            this.showObjectInBrowserSeperator.Size = new System.Drawing.Size(225, 6);\n            // \n            // showObjectPrerequisitiesMenu\n            // \n            this.showObjectPrerequisitiesMenu.Name = \"showObjectPrerequisitiesMenu\";\n            this.showObjectPrerequisitiesMenu.Size = new System.Drawing.Size(228, 22);\n            this.showObjectPrerequisitiesMenu.Text = \"Show Untrained Prerequisites\";\n            this.showObjectPrerequisitiesMenu.Click += new System.EventHandler(this.tsShowItemPrereqs_Click);\n            // \n            // showObjectInMenuSeperator\n            // \n            this.showObjectInMenuSeperator.Name = \"showObjectInMenuSeperator\";\n            this.showObjectInMenuSeperator.Size = new System.Drawing.Size(225, 6);\n            // \n            // tsmiObjectsExpandAll\n            // \n            this.tsmiObjectsExpandAll.Name = \"tsmiObjectsExpandAll\";\n            this.tsmiObjectsExpandAll.Size = new System.Drawing.Size(228, 22);\n            this.tsmiObjectsExpandAll.Text = \"&Expand All\";\n            this.tsmiObjectsExpandAll.Click += new System.EventHandler(this.tsmiObjectExpandAll_Click);\n            // \n            // tsmiObjectsCollapseAll\n            // \n            this.tsmiObjectsCollapseAll.Name = \"tsmiObjectsCollapseAll\";\n            this.tsmiObjectsCollapseAll.Size = new System.Drawing.Size(228, 22);\n            this.tsmiObjectsCollapseAll.Text = \"&Collapse All\";\n            this.tsmiObjectsCollapseAll.Click += new System.EventHandler(this.tsmiObjectCollapseAll_Click);\n            // \n            // groupBox2\n            // \n            this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.groupBox2.Controls.Add(this.cbHistory);\n            this.groupBox2.Controls.Add(this.cbShowBaseOnly);\n            this.groupBox2.Controls.Add(this.rbShowAlpha);\n            this.groupBox2.Controls.Add(this.rbShowTree);\n            this.groupBox2.Location = new System.Drawing.Point(12, 58);\n            this.groupBox2.Name = \"groupBox2\";\n            this.groupBox2.Size = new System.Drawing.Size(560, 51);\n            this.groupBox2.TabIndex = 0;\n            this.groupBox2.TabStop = false;\n            this.groupBox2.Text = \"Options\";\n            // \n            // cbHistory\n            // \n            this.cbHistory.DisplayMember = \"Name\";\n            this.cbHistory.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbHistory.FormattingEnabled = true;\n            this.cbHistory.Location = new System.Drawing.Point(5, 19);\n            this.cbHistory.Name = \"cbHistory\";\n            this.cbHistory.Size = new System.Drawing.Size(254, 21);\n            this.cbHistory.TabIndex = 3;\n            this.cbHistory.SelectedIndexChanged += new System.EventHandler(this.cbHistory_SelectedIndexChanged);\n            // \n            // cbShowBaseOnly\n            // \n            this.cbShowBaseOnly.AutoSize = true;\n            this.cbShowBaseOnly.Location = new System.Drawing.Point(288, 30);\n            this.cbShowBaseOnly.Name = \"cbShowBaseOnly\";\n            this.cbShowBaseOnly.Size = new System.Drawing.Size(109, 17);\n            this.cbShowBaseOnly.TabIndex = 2;\n            this.cbShowBaseOnly.Text = \"Only show T1/T2\";\n            this.cbShowBaseOnly.UseVisualStyleBackColor = true;\n            this.cbShowBaseOnly.CheckedChanged += new System.EventHandler(this.cbShowBaseOnly_CheckedChanged);\n            // \n            // rbShowAlpha\n            // \n            this.rbShowAlpha.AutoSize = true;\n            this.rbShowAlpha.Checked = true;\n            this.rbShowAlpha.Location = new System.Drawing.Point(288, 10);\n            this.rbShowAlpha.Name = \"rbShowAlpha\";\n            this.rbShowAlpha.Size = new System.Drawing.Size(124, 17);\n            this.rbShowAlpha.TabIndex = 1;\n            this.rbShowAlpha.TabStop = true;\n            this.rbShowAlpha.Text = \"Show Alphabetic List\";\n            this.rbShowAlpha.UseVisualStyleBackColor = true;\n            this.rbShowAlpha.CheckedChanged += new System.EventHandler(this.rbShowAlpha_CheckedChanged);\n            // \n            // rbShowTree\n            // \n            this.rbShowTree.AutoSize = true;\n            this.rbShowTree.Location = new System.Drawing.Point(418, 10);\n            this.rbShowTree.Name = \"rbShowTree\";\n            this.rbShowTree.Size = new System.Drawing.Size(127, 17);\n            this.rbShowTree.TabIndex = 0;\n            this.rbShowTree.Text = \"Show Category Trees\";\n            this.rbShowTree.UseVisualStyleBackColor = true;\n            // \n            // tmrAutoUpdate\n            // \n            this.tmrAutoUpdate.Interval = 30000;\n            this.tmrAutoUpdate.Tick += new System.EventHandler(this.tmrAutoUpdate_Tick);\n            // \n            // toolTip\n            // \n            this.toolTip.IsBalloon = true;\n            // \n            // SkillExplorerWindow\n            // \n            this.AcceptButton = this.btnClose;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnClose;\n            this.ClientSize = new System.Drawing.Size(584, 441);\n            this.Controls.Add(this.grpPlanName);\n            this.Controls.Add(this.middlePanel);\n            this.Controls.Add(this.lowerPanel);\n            this.Controls.Add(this.groupBox2);\n            this.MinimumSize = new System.Drawing.Size(600, 480);\n            this.Name = \"SkillExplorerWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Skill Explorer - What Is This Skill Used For?\";\n            this.grpPlanName.ResumeLayout(false);\n            this.grpPlanName.PerformLayout();\n            this.lowerPanel.ResumeLayout(false);\n            this.lowerPanel.PerformLayout();\n            this.middlePanel.ResumeLayout(false);\n            this.splitContainer.Panel1.ResumeLayout(false);\n            this.splitContainer.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();\n            this.splitContainer.ResumeLayout(false);\n            this.pnlSkillHeader.ResumeLayout(false);\n            this.pnlSkillHeader.PerformLayout();\n            this.pnlItemHeader.ResumeLayout(false);\n            this.pnlItemHeader.PerformLayout();\n            this.cmSkills.ResumeLayout(false);\n            this.cmEntity.ResumeLayout(false);\n            this.groupBox2.ResumeLayout(false);\n            this.groupBox2.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n        #endregion\n\n        private System.Windows.Forms.GroupBox grpPlanName;\n        private System.Windows.Forms.Button btnClose;\n        private System.Windows.Forms.Panel lowerPanel;\n        private System.Windows.Forms.Panel middlePanel;\n        private PersistentSplitContainer splitContainer;\n        private System.Windows.Forms.GroupBox groupBox2;\n        private System.Windows.Forms.CheckBox cbShowBaseOnly;\n        private System.Windows.Forms.RadioButton rbShowAlpha;\n        private System.Windows.Forms.RadioButton rbShowTree;\n        private System.Windows.Forms.Label lblSkillInfo;\n        private System.Windows.Forms.TreeView tvSkills;\n        private System.Windows.Forms.ContextMenuStrip cmSkills;\n        private System.Windows.Forms.ToolStripMenuItem planToMenu;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillExplorerMenu;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillBrowserMenu;\n        private System.Windows.Forms.ToolStripMenuItem showPrerequisitiesMenu;\n        private System.Windows.Forms.ToolStripMenuItem tsAddL1;\n        private System.Windows.Forms.ToolStripMenuItem tsAddL2;\n        private System.Windows.Forms.ToolStripMenuItem tsAddL3;\n        private System.Windows.Forms.ToolStripMenuItem tsAddL4;\n        private System.Windows.Forms.ToolStripMenuItem tsAddL5;\n        private System.Windows.Forms.Panel pnlSkillHeader;\n        private System.Windows.Forms.Label lblSkills;\n        private System.Windows.Forms.TreeView tvEntity;\n        private System.Windows.Forms.Panel pnlItemHeader;\n        private System.Windows.Forms.Label lblItems;\n        private System.Windows.Forms.ContextMenuStrip cmEntity;\n        private System.Windows.Forms.ToolStripMenuItem planToObject;\n        private System.Windows.Forms.ToolStripMenuItem showObjectPrerequisitiesMenu;\n        private System.Windows.Forms.ToolStripMenuItem showObjectInBrowserMenuItem;\n        private System.Windows.Forms.Label lblDimmedFont;\n        private System.Windows.Forms.Label lblNormalFont;\n        private System.Windows.Forms.Label lblRedFontInfo;\n        private System.Windows.Forms.Label lblRedFont;\n        private System.Windows.Forms.Label lblDimmedFontInfo;\n        private System.Windows.Forms.Timer tmrAutoUpdate;\n        private System.Windows.Forms.ComboBox cbHistory;\n        private System.Windows.Forms.ToolTip toolTip;\n        private System.Windows.Forms.ToolStripSeparator planToSeparator;\n        private System.Windows.Forms.ToolStripSeparator showInBrowserSeperator;\n        private System.Windows.Forms.ToolStripSeparator showInMenuSeperator;\n        private System.Windows.Forms.ToolStripMenuItem tsmiSkillsExpandAll;\n        private System.Windows.Forms.ToolStripMenuItem tsmiSkillsCollapseAll;\n        private System.Windows.Forms.ToolStripSeparator planToObjectSeperator;\n        private System.Windows.Forms.ToolStripSeparator showObjectInBrowserSeperator;\n        private System.Windows.Forms.ToolStripSeparator showObjectInMenuSeperator;\n        private System.Windows.Forms.ToolStripMenuItem tsmiObjectsExpandAll;\n        private System.Windows.Forms.ToolStripMenuItem tsmiObjectsCollapseAll;\n        private System.Windows.Forms.ToolStripMenuItem tsRemove;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SkillExplorerWindow.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Collections;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Skill Explorer Window - allows easy exploration of skills.\n    /// </summary>\n    /// <remarks>\n    /// This class is the Skill Explorer - or \"What items/ships other skills does this skill enable for me\" form.\n    /// For a given skill, we show 2 tree controls (with splitter bars seperating them), one for skills, one for either ships or items, depending on the skill we're exploring.\n    /// (There is no skill that enables both a ship and an item)\n    /// Each tree shows a node for each level of the chosen skill with child nodes for all items that this level\n    /// is a direct prerequisite for. If we can use the item, it is shown in a normal font. If this level of skill would \n    /// enable use of the item, we show it dimmed. If this level is one of a number of missing skills for the item, then\n    /// we show the item in red (with a tooltip indicating the other missing skills).\n    /// The user can chose to view the trees in alphabetic order, or by the categories (alpha is default).\n    /// For items, you can chose to show just the base T1/T2 items, or all variants of an item (default is base items)\n    /// \n    /// There's a dropdown listbox that keeps track of what skills you've been exploring in this session.\n    /// \n    /// Each node has a context menu that enables you to view the item in the relevant browser, add missing skills to \n    /// your plan, show list of all prerequisites (including costs if unowned), and for the skill tree, use the selected skill as a new base skill.\n    /// \n    /// Doubleclicking a ship/item leaf node will show the selected item in the browser.\n    /// Doubleclicking a skill in the tree will set that skill as the base skill we're exploring\n    /// </remarks>\n    public partial class SkillExplorerWindow : EVEMonForm\n    {\n        private Plan m_plan;\n        private Character m_character;\n        private Skill m_skill;\n        private bool m_hasItems;\n        private bool m_hasShips;\n        private bool m_hasBlueprints;\n        private bool m_allSkillsExpanded;\n        private bool m_allObjectsExpanded;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SkillExplorerWindow\"/> class.\n        /// Constructor for designer and WindowsFactory.\n        /// </summary>\n        public SkillExplorerWindow()\n        {\n            InitializeComponent();\n            splitContainer.RememberDistanceKey = \"SkillExplorer\";\n\n            toolTip.SetToolTip(cbHistory, \"A history of the skills that you have been looking at.\");\n\n            tvSkills.MouseUp += tvSkills_MouseDown;\n            tvSkills.MouseMove += tvSkills_MouseMove;\n            tvEntity.MouseUp += tvEntity_MouseDown;\n            tvEntity.MouseMove += tvEntity_MouseMove;\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SkillExplorerWindow\"/> class.\n        /// Constructor for WindowsFactory.\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        public SkillExplorerWindow(Plan plan)\n            :this()\n        {\n            Plan = plan;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load, restores the window rectangle from the settings.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            EveMonClient.PlanNameChanged += EveMonClient_PlanNameChanged;\n            EveMonClient.CharacterUpdated += EveMonClient_CharacterUpdated;\n        }\n\n\n        /// <summary>\n        /// Unsubscribe events on closing.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            EveMonClient.CharacterUpdated -= EveMonClient_CharacterUpdated;\n            EveMonClient.PlanNameChanged -= EveMonClient_PlanNameChanged;\n        }\n\n        #endregion\n\n\n        #region Internal Properties\n\n        /// <summary>\n        /// Gets or sets the plan.\n        /// </summary>\n        /// <value>\n        /// The plan.\n        /// </value>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                if (m_plan == value)\n                    return;\n\n                m_plan = value;\n                m_character = (Character)m_plan.Character;\n\n                UpdatePlanName();\n            }\n        }\n\n\n        #endregion\n\n        #region Setters\n\n        /// <summary>\n        /// Sets the skill.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        private void SetSkill(Skill skill)\n        {\n            if (m_skill == skill)\n                return;\n\n            // We can't unset a skill\n            if (skill == null)\n                return;\n\n            m_skill = skill;\n            m_character = skill.Character;\n\n            // If already in history combo, remove it to reinsert it at the top\n            if (cbHistory.Items.Contains(m_skill))\n                cbHistory.Items.RemoveAt(cbHistory.Items.IndexOf(m_skill));\n\n            cbHistory.Items.Insert(0, m_skill);\n            cbHistory.SelectedIndex = 0;\n\n            UpdateContent();\n        }\n        \n        #endregion\n\n\n        #region Content creation and update\n\n        /// <summary>\n        /// Update all the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            UpdateHeader();\n            UpdateTrees();\n        }\n\n        /// <summary>\n        /// Update the character and plan name on the skill header group title.\n        /// </summary>\n        private void UpdatePlanName()\n        {\n            if (m_character != null)\n                grpPlanName.Text = $\"{m_character.Name}\";\n\n            if (m_plan != null)\n                grpPlanName.Text += $\" - {m_plan.Name}\";\n        }\n\n        /// <summary>\n        /// Sets the details for the skill we're analysing.\n        /// Work out if we know the skill, if so, how many  points.\n        /// If we don't know it, show if we could train it now or not\n        /// and indicate if we own the book, if not, show the cost.\n        /// </summary>\n        private void UpdateHeader()\n        {\n            StringBuilder sb = new StringBuilder();\n            if (m_skill.IsTraining)\n                sb.Append($\"{m_skill.Name} - In Training \");\n\n            if (m_skill.IsKnown)\n            {\n                sb.Append($\"Trained to level {m_skill.Level} with \" +\n                          $\"{(m_skill.SkillPoints > 0 ? $\"{m_skill.SkillPoints:N0} sp\" : \"0 sp\")}\");\n            }\n            else if (m_skill.Character != null)\n            {\n                sb.Append($\"Not Trained - prereqs {(m_skill.ArePrerequisitesMet ? string.Empty : \"not \")}met, \" +\n                          $\"skillbook is {(m_skill.IsOwned ? \"owned\" : $\"not owned, book costs {m_skill.FormattedCost} ISK\")}\");\n            }\n            else\n                sb.Append($\"Skillbook costs {m_skill.FormattedCost} ISK\");\n\n            lblSkillInfo.Text = sb.ToString();\n            tmrAutoUpdate.Enabled = m_skill.IsTraining;\n        }\n\n        /// <summary>\n        /// Recreate the trees and their headers.\n        /// \n        /// Items, ships and skills may be presented alphabetically (skill level > enabled skill) or grouped (skill level > enabled skill group > enabled skill).\n        /// \n        /// Each item is colored appropriately : normal if we know all the prereqs for the item,\n        /// dimmed if this level enables the item or red if we need other skills to enable the item in\n        /// addition to this level of skill.\n        /// </summary>\n        private void UpdateTrees()\n        {\n            UpdateSkillsTree();\n            UpdateItemsTree();\n            UpdateTreesHeaders();\n        }\n\n        /// <summary>\n        /// Update the trees' headers : \"blueprints\", \"items\" or \"ships\".\n        /// </summary>\n        private void UpdateTreesHeaders()\n        {\n            if (m_hasBlueprints && m_hasItems)\n            {\n                lblItems.BackColor = Color.Thistle;\n                pnlItemHeader.BackColor = Color.Thistle;\n                lblItems.Text = @\"Enabled Blueprints and Items\";\n            }\n            else if (m_hasShips && m_hasBlueprints)\n            {\n                lblItems.BackColor = Color.Lavender;\n                pnlItemHeader.BackColor = Color.Lavender;\n                lblItems.Text = @\"Enabled Ships and Blueprints\";\n            }\n            else if (m_hasShips && m_hasItems)\n            {\n                lblItems.BackColor = Color.Honeydew;\n                pnlItemHeader.BackColor = Color.Honeydew;\n                lblItems.Text = @\"Enabled Ships and Items\";\n            }\n            else if (m_hasBlueprints)\n            {\n                lblItems.BackColor = Color.LightBlue;\n                pnlItemHeader.BackColor = Color.LightBlue;\n                lblItems.Text = @\"Enabled Blueprints\";\n            }\n            else if (m_hasShips)\n            {\n                lblItems.BackColor = Color.LightCyan;\n                pnlItemHeader.BackColor = Color.LightCyan;\n                lblItems.Text = @\"Enabled Ships\";\n            }\n            else if (m_hasItems)\n            {\n                lblItems.BackColor = Color.MistyRose;\n                pnlItemHeader.BackColor = Color.MistyRose;\n                lblItems.Text = @\"Enabled Items\";\n            }\n            else\n            {\n                lblItems.BackColor = Color.WhiteSmoke;\n                pnlItemHeader.BackColor = Color.WhiteSmoke;\n                lblItems.Text = @\"Enabled Ships, Blueprints or Items\";\n            }\n        }\n\n        /// <summary>\n        /// Set up the enabled Skills tree.\n        /// </summary>\n        private void UpdateSkillsTree()\n        {\n            tvSkills.BeginUpdate();\n            try\n            {\n                tvSkills.Nodes.Clear();\n                if (m_skill == null)\n                    return;\n\n                IEnumerable<Skill> skills = m_skill.Character?.Skills ?? SkillCollection.Skills;\n\n                for (int i = 1; i <= 5; i++)\n                {\n                    SkillLevel skillLevel = new SkillLevel(m_skill, i);\n\n                    // Gets the enabled skills and check it's not empty\n                    List<Skill> enabledSkills = skills\n                        .Where(x => x.Prerequisites.Any(y => y.Skill == m_skill && y.Level == i) && x.IsPublic)\n                        .ToList();\n\n                    if (!enabledSkills.Any())\n                        continue;\n\n                    // Add a node for this skill level\n                    AddNode(i, skillLevel, enabledSkills);\n                    m_allSkillsExpanded = true;\n                }\n\n                // No enabled skill found for any level ?\n                if (tvSkills.Nodes.Count == 0)\n                    tvSkills.Nodes.Add(new TreeNode(\"No skills enabled by this skill\"));\n            }\n            finally\n            {\n                tvSkills.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Adds the node.\n        /// </summary>\n        /// <param name=\"i\">The i.</param>\n        /// <param name=\"skillLevel\">The skill level.</param>\n        /// <param name=\"enabledSkills\">The enabled skills.</param>\n        private void AddNode(int i, SkillLevel skillLevel, IEnumerable<Skill> enabledSkills)\n        {\n            TreeNode levelNode = new TreeNode(skillLevel.ToString());\n            if (m_skill.Level >= i)\n                levelNode.Text += @\" (Trained)\";\n\n            levelNode.ForeColor = Color.DarkBlue;\n\n            // Is it a plain alphabetical presentation ?\n            if (rbShowAlpha.Checked)\n            {\n                foreach (Skill skill in enabledSkills.OrderBy(x => x.Name))\n                {\n                    levelNode.Nodes.Add(CreateNode(skill, skill.Prerequisites.ToList()));\n                }\n            }\n                // Or do we need to group skills by their groups ?\n            else if (rbShowTree.Checked)\n            {\n                foreach (IGrouping<SkillGroup, Skill> group in enabledSkills.GroupBy(\n                    x => x.Group).ToArray().OrderBy(x => x.Key.Name))\n                {\n                    TreeNode groupNode = new TreeNode(group.Key.Name);\n                    foreach (Skill skill in group.ToArray().OrderBy(x => x.Name))\n                    {\n                        groupNode.Nodes.Add(CreateNode(skill, skill.Prerequisites.ToList()));\n                    }\n                    levelNode.Nodes.Add(groupNode);\n                }\n            }\n\n            // Add node\n            levelNode.Expand();\n            tvSkills.Nodes.Add(levelNode);\n        }\n\n        /// <summary>\n        /// Set up the items/ships/blueprints tree.\n        /// </summary>\n        private void UpdateItemsTree()\n        {\n            m_hasShips = false;\n            m_hasItems = false;\n            m_hasBlueprints = false;\n\n            tvEntity.BeginUpdate();\n            try\n            {\n                tvEntity.Nodes.Clear();\n                if (m_skill == null)\n                    return;\n\n                List<Item> items = StaticItems.AllItems\n                    .Concat(StaticBlueprints.AllBlueprints)\n                    // exclude skills\n                    .Where(x => x.MarketGroup.ParentGroup != null &&\n                                x.MarketGroup.ParentGroup.ID != DBConstants.SkillsMarketGroupID)\n                    .Where(x => x.Prerequisites.Any(y => y.Skill == m_skill.StaticData))\n                    .Where(x => !cbShowBaseOnly.Checked || x.MetaGroup == ItemMetaGroup.T1 || x.MetaGroup == ItemMetaGroup.T2)\n                    .ToList();\n\n                // Scroll through levels\n                for (int i = 1; i <= 5; i++)\n                {\n                    SkillLevel skillLevel = new SkillLevel(m_skill, i);\n\n                    // Gets the enabled objects and check it's not empty\n                    List<Item> enabledObjects = items\n                        .Where(x => x.Prerequisites.Any(y => y.Skill == m_skill.StaticData && y.Level == i))\n                        .ToList();\n\n                    if (!enabledObjects.Any())\n                        continue;\n\n                    // Add a node for this skill level\n                    AddNode(i, skillLevel, enabledObjects);\n                    m_allObjectsExpanded = true;\n                }\n                \n                // No enabled skill found for any level ?\n                if (tvEntity.Nodes.Count == 0)\n                    tvEntity.Nodes.Add(new TreeNode(\"No ships, blueprints or items enabled by this skill\"));\n            }\n            finally\n            {\n                tvEntity.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Adds the node.\n        /// </summary>\n        /// <param name=\"i\">The i.</param>\n        /// <param name=\"skillLevel\">The skill level.</param>\n        /// <param name=\"enabledObjects\">The enabled objects.</param>\n        private void AddNode(int i, SkillLevel skillLevel, IList<Item> enabledObjects)\n        {\n            // Add a node for this skill level\n            TreeNode levelNode = new TreeNode(skillLevel.ToString());\n            if (m_skill.Level >= i)\n                levelNode.Text += @\" (Trained)\";\n\n            levelNode.ForeColor = Color.DarkBlue;\n\n            // Is it a plain alphabetical presentation ?\n            if (rbShowAlpha.Checked)\n                GroupByAlphabet(i, levelNode, enabledObjects);\n            // Or do we need to group items by their groups ?\n            else if (rbShowTree.Checked)\n                GroupByMarketGroup(i, levelNode, enabledObjects);\n\n            // Add node\n            levelNode.Expand();\n            tvEntity.Nodes.Add(levelNode);\n        }\n\n        /// <summary>\n        /// AllGroups the by alphabet.\n        /// </summary>\n        /// <param name=\"i\">The i.</param>\n        /// <param name=\"levelNode\">The level node.</param>\n        /// <param name=\"enabledObjects\">The enabled objects.</param>\n        private void GroupByAlphabet(int i, TreeNode levelNode, IList<Item> enabledObjects)\n        {\n            foreach (Ship ship in enabledObjects.OfType<Ship>().OrderBy(x => x.Name))\n            {\n                levelNode.Nodes.Add(CreateNode(ship, ship.Prerequisites.ToCharacter(m_character).ToList()));\n                m_hasShips = true;\n            }\n\n            foreach (Blueprint blueprint in enabledObjects.OfType<Blueprint>().OrderBy(x => x.Name))\n            {\n                List<BlueprintActivity> listOfActivities = blueprint.Prerequisites\n                    .Where(x => x.Skill == m_skill.StaticData && x.Level == i)\n                    .Select(x => x.Activity).ToList();\n\n                TreeNode node = CreateNode(blueprint, blueprint.Prerequisites\n                    .Where(x => listOfActivities.Contains(x.Activity)).ToCharacter(m_character).ToList());\n\n                node.Text =\n                    $\"{node.Text} ({string.Join(\", \", listOfActivities.Select(activity => activity.GetDescription()))})\";\n                levelNode.Nodes.Add(node);\n                m_hasBlueprints = true;\n            }\n\n            foreach (Item item in enabledObjects.Where(x => !(x is Ship) && !(x is Blueprint)).OrderBy(x => x.Name))\n            {\n                levelNode.Nodes.Add(CreateNode(item, item.Prerequisites.ToCharacter(m_character).ToList()));\n                m_hasItems = true;\n            }\n        }\n\n        /// <summary>\n        /// AllGroups the by market group.\n        /// </summary>\n        /// <param name=\"levelNode\">The level node.</param>\n        /// <param name=\"i\">The i.</param>\n        /// <param name=\"enabledObjects\">The enabled objects.</param>\n        private void GroupByMarketGroup(int i, TreeNode levelNode, IList<Item> enabledObjects)\n        {\n            // Add ships\n            IGrouping<MarketGroup, Ship>[] shipsToAdd = enabledObjects.OfType<Ship>()\n                .GroupBy(x => x.MarketGroup.ParentGroup).ToArray();\n\n            foreach (IGrouping<MarketGroup, Ship> shipGroup in shipsToAdd.OrderBy(x => x.Key.Name))\n            {\n                TreeNode groupNode = new TreeNode(shipGroup.Key.Name);\n                foreach (Ship ship in shipGroup.OrderBy(x => x.Name))\n                {\n                    groupNode.Nodes.Add(CreateNode(ship, ship.Prerequisites.ToCharacter(m_skill.Character).ToList()));\n                }\n                levelNode.Nodes.Add(groupNode);\n                m_hasShips = true;\n            }\n\n            // Add blueprints recursively                       \n            foreach (TreeNode node in StaticBlueprints.BlueprintMarketGroups\n                .SelectMany(\n                    blueprintMarketGroup =>\n                        CreateMarketGroupsNode(blueprintMarketGroup, enabledObjects.OfType<Blueprint>().ToList(), i)))\n            {\n                levelNode.Nodes.Add(node);\n                m_hasBlueprints = true;\n            }\n\n            // Add items recursively\n            foreach (TreeNode node in StaticItems.MarketGroups\n                .SelectMany(marketGroup => CreateMarketGroupsNode(marketGroup, enabledObjects\n                    .Where(x => !(x is Ship) && !(x is Blueprint)).ToList())))\n            {\n                levelNode.Nodes.Add(node);\n                m_hasItems = true;\n            }\n        }\n\n        /// <summary>\n        /// Recursively creates tree nodes for the children market groups of the given group.\n        /// The added blueprints will be the ones which require the current skill (<see cref=\"m_skill\"/>) at the specified level.\n        /// </summary>\n        /// <param name=\"blueprintMarketGroup\">The blueprint market group.</param>\n        /// <param name=\"blueprints\">The blueprints.</param>\n        /// <param name=\"level\">The level.</param>\n        /// <returns></returns>\n        private IEnumerable<TreeNode> CreateMarketGroupsNode(BlueprintMarketGroup blueprintMarketGroup,\n                                                             IList<Blueprint> blueprints, int level)\n        {\n            // Add categories\n            foreach (BlueprintMarketGroup category in blueprintMarketGroup.SubGroups)\n            {\n                List<TreeNode> children = CreateMarketGroupsNode(category, blueprints, level).ToList();\n                if (!children.Any())\n                    continue;\n\n                TreeNode node = new TreeNode(category.Name);\n                node.Nodes.AddRange(children.ToArray());\n                yield return node;\n            }\n\n            // Add blueprints\n            foreach (Blueprint blueprint in blueprints.Where(x => x.MarketGroup == blueprintMarketGroup))\n            {\n                List<BlueprintActivity> listOfActivities = blueprint.Prerequisites\n                    .Where(x => x.Skill == m_skill.StaticData && x.Level == level)\n                    .Select(x => x.Activity).ToList();\n\n                TreeNode node = CreateNode(blueprint, blueprint.Prerequisites\n                    .Where(x => listOfActivities.Contains(x.Activity)).ToCharacter(m_character).ToList());\n\n                node.Text = $\"{node.Text} \" +\n                            $\"({string.Join(\", \", listOfActivities.Select(activity => activity.GetDescription()))})\";\n                yield return node;\n            }\n        }\n\n        /// <summary>\n        /// Recursively creates tree nodes for the children market groups of the given group.\n        /// The added items will be the ones which require the current skill (<see cref=\"m_skill\"/>) at the specified level.\n        /// </summary>\n        /// <param name=\"marketGroup\">The market group.</param>\n        /// <param name=\"items\">The items.</param>\n        /// <returns></returns>\n        private IEnumerable<TreeNode> CreateMarketGroupsNode(MarketGroup marketGroup, IList<Item> items)\n        {\n            // Add categories\n            foreach (MarketGroup category in marketGroup.SubGroups)\n            {\n                List<TreeNode> children = CreateMarketGroupsNode(category, items).ToList();\n                if (!children.Any())\n                    continue;\n\n                TreeNode node = new TreeNode(category.Name);\n                node.Nodes.AddRange(children.ToArray());\n                yield return node;\n            }\n\n            // Add items\n            foreach (Item item in items.Where(x => x.MarketGroup == marketGroup))\n            {\n                yield return CreateNode(item, item.Prerequisites.ToCharacter(m_character).ToList());\n            }\n        }\n\n        /// <summary>\n        /// Adds a node to the tree, and colors it appropriately, and set the tooltip.\n        /// Also sets the tag of the node to the Skill object.\n        /// </summary>\n        /// <param name=\"obj\">The object.</param>\n        /// <param name=\"prerequisites\">The object's prerequisites.</param>\n        /// <returns></returns>\n        private TreeNode CreateNode(object obj, IList<SkillLevel> prerequisites)\n        {\n            TreeNode node = new TreeNode(obj.ToString()) { ToolTipText = string.Empty, Tag = obj };\n\n            // When all prereqs satisifed, keep the default color\n            if (prerequisites.All(x => x.IsTrained))\n                return node;\n\n            // Are all other prerequisites known ?\n            if (prerequisites.All(x => x.IsTrained || x.Skill == m_skill))\n            {\n                node.ForeColor = Color.Gray;\n                return node;\n            }\n\n            // Then we need to list the other prerequisites\n            StringBuilder sb = new StringBuilder(\"Also Need To Train:\");\n            foreach (SkillLevel prereq in CreatePrereqList(prerequisites.Where(x => x.Skill != m_skill && !x.IsTrained)))\n            {\n                sb\n                    .AppendLine()\n                    .Append(prereq);\n            }\n\n            node.ToolTipText = sb.ToString();\n            node.ForeColor = Color.Red;\n            return node;\n        }\n\n        /// <summary>\n        /// Creates a prereq skills list for a blueprint with the given activity.\n        /// </summary>\n        /// <param name=\"prerequisites\">The prerequisites of a blueprint activities</param>\n        private static IEnumerable<SkillLevel> CreatePrereqList(IEnumerable<SkillLevel> prerequisites)\n        {\n            List<SkillLevel> prereqList = new List<SkillLevel>();\n            foreach (SkillLevel prereq in prerequisites.Where(prereq => prereqList.All(x => x.ToString() != prereq.ToString())))\n            {\n                prereqList.Add(prereq);\n            }\n\n            return prereqList;\n        }\n\n        #endregion\n\n\n        #region Global events and auto-update\n\n        /// <summary>\n        /// Occurs whenever the plan name changes.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_PlanNameChanged(object sender, PlanChangedEventArgs e)\n        {\n            if (e.Plan != m_plan)\n                return;\n\n            UpdatePlanName();\n        }\n\n        /// <summary>\n        /// occurs whenever the character is updated from CCP, skills are estimed to have completed, etc.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character != m_character)\n                return;\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Update skill header every 30s if we're training it\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tmrAutoUpdate_Tick(object sender, EventArgs e)\n        {\n            UpdateHeader();\n        }\n\n        #endregion\n\n\n        #region Skills context Menu\n\n        /// <summary>\n        /// Returns the currently selected skill or null if non is selected.\n        /// </summary>\n        /// <returns></returns>\n        private Skill GetSelectedSkill() => tvSkills.SelectedNode?.Tag as Skill;\n\n        /// <summary>\n        /// When the user clicks, we check whether we must display the context menu.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void tvSkills_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            tvSkills.Cursor = Cursors.Default;\n\n            // Updates selection\n            tvSkills.SelectedNode = tvSkills.GetNodeAt(e.Location);\n\n            // Show menu\n            cmSkills.Show(tvSkills, e.Location);\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void tvSkills_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            tvSkills.Cursor = tvSkills.GetNodeCount(true) > 1\n                ? CustomCursors.ContextMenu\n                : Cursors.Default;\n        }\n\n        /// <summary>\n        /// Context menu opening, updates the menus status\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CancelEventArgs\"/> instance containing the event data.</param>\n        private void cmSkills_Opening(object sender, CancelEventArgs e)\n        {\n            if (tvSkills.GetNodeCount(true) < 2)\n            {\n                e.Cancel = true;\n                return;\n            }\n\n            planToMenu.Visible = m_plan != null && tvSkills.SelectedNode != null;\n            planToSeparator.Visible = m_plan != null && tvSkills.SelectedNode != null;\n            showInSkillBrowserMenu.Visible = showInBrowserSeperator.Visible =  tvSkills.SelectedNode != null;\n\n            // \"Expand All\" and \"Collapse All\" menus\n            tsmiSkillsCollapseAll.Enabled = tsmiSkillsCollapseAll.Visible = m_allSkillsExpanded;\n            tsmiSkillsExpandAll.Enabled = tsmiSkillsExpandAll.Visible = !tsmiSkillsCollapseAll.Enabled;\n            \n            // \"Plan to N\" menus\n            Skill skill = GetSelectedSkill();\n\n            // Update the \"show in skill explorer\" menu\n            showInSkillExplorerMenu.Visible = skill != null && m_skill != skill;\n\n            // Update the \"show prerequisites\" menu\n            showPrerequisitiesMenu.Visible = skill != null && !skill.ArePrerequisitesMet;\n\n            showInMenuSeperator.Visible = skill != null;\n\n            if (skill == null)\n                return;\n\n            // Update the \"plan to X\" menus\n            planToMenu.Enabled = skill.Level < 5;\n\n            if (m_plan == null)\n                return;\n\n            for (int i = 0; i <= 5; i++)\n            {\n                m_plan.UpdatesRegularPlanToMenu(planToMenu.DropDownItems[i], skill, i);\n            }\n        }\n\n        /// <summary>\n        /// Skill context menu > Plan to level \n        /// theres a menu item for each level, each one is tagged with a \n        /// string representing level number.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void planToLevelMenuItem_Click(object sender, EventArgs e)\n        {\n            IPlanOperation operation = ((ToolStripMenuItem)sender).Tag as IPlanOperation;\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = PlanWindow.ShowPlanWindow(plan: operation.Plan);\n            if (planWindow == null)\n                return;\n\n            PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow, operation);\n        }\n\n        /// <summary>\n        /// Skill context menu > Show me what this skill unlocks.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInSkillExplorerMenu_Click(object sender, EventArgs e)\n        {\n            SetSkill(GetSelectedSkill());\n        }\n\n        /// <summary>\n        /// Skill context menu > Show skill in browser.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInSkillBrowserMenu_Click(object sender, EventArgs e)\n        {\n            Skill skill = GetSelectedSkill();\n\n            // Open the skill browser\n            PlanWindow.ShowPlanWindow(m_character, m_plan).ShowSkillInBrowser(skill);\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand All\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void tsmiExpandAll_Click(object sender, EventArgs e)\n        {\n            tvSkills.ExpandAll();\n            m_allSkillsExpanded = true;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse All\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void tsmiColapseAll_Click(object sender, EventArgs e)\n        {\n            tvSkills.CollapseAll();\n            m_allSkillsExpanded = false;\n        }\n\n        /// <summary>\n        /// Skill Menu - Show all prereq stats in a dialog box.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showPrerequisitiesMenu_Click(object sender, EventArgs e)\n        {\n            Skill skill = GetSelectedSkill();\n            if (skill == null)\n                return;\n\n            int index = 0;\n            StringBuilder sb = new StringBuilder();\n            foreach (SkillLevel prereq in skill.Prerequisites)\n            {\n                FormatPrerequisite(sb, prereq, ref index);\n            }\n\n            MessageBox.Show(sb.ToString(), @\"Untrained Prerequisites for \" + skill.Name, MessageBoxButtons.OK,\n                            MessageBoxIcon.Information);\n        }\n\n        /// <summary>\n        /// Helper method for the Show Prereqs menu used by both ship and item trees.\n        /// This method adds one prereq to the string that will be displayed in the\n        /// dialog box.\n        /// </summary>\n        /// <param name=\"sb\">The StringBuilder object.</param>\n        /// <param name=\"prereq\">The prereq</param>\n        /// <param name=\"index\">The index.</param>\n        private static void FormatPrerequisite(StringBuilder sb, SkillLevel prereq, ref int index)\n        {\n            if (prereq.Skill.IsKnown)\n            {\n                if (prereq.IsTrained)\n                    return;\n\n                // We know this prereq, but not to a high enough level\n                index++;\n                string level = prereq.Skill.Level > 0\n                    ? $\"(Trained to level {prereq.Skill.RomanLevel})\"\n                    : \"(Not yet trained)\";\n                sb.AppendLine($\"{index}. {prereq} {level}\");\n                return;\n            }\n\n            // We don't know this prereq at all\n            index++;\n            sb\n                .Append($\"{index}. {prereq} \")\n                .Append($\"(Prereqs {(prereq.Skill.Prerequisites.AreTrained() ? string.Empty : \"not \")}met, \")\n                .AppendLine($\"skillbook {(prereq.Skill.IsOwned ? \"owned)\" : $\"not owned, costs {prereq.Skill.FormattedCost} ISK)\")}\");\n        }\n\n        #endregion\n\n\n        #region Items Ships and Blueprints context menu\n\n        /// <summary>\n        /// Returns the currently selected item or null if non is selected.\n        /// </summary>\n        /// <returns></returns>\n        private Item GetSelectedItem() => tvEntity.SelectedNode?.Tag as Item;\n\n        /// <summary>\n        /// Gets the selected item activities.\n        /// </summary>\n        /// <param name=\"entity\">The entity.</param>\n        /// <returns></returns>\n        private List<string> GetSelectedItemActivities(Item entity)\n        {\n            List<string> list =\n                tvEntity.SelectedNode.Text.Replace(entity.Name, string.Empty).Trim().Trim(\"()\".ToCharArray()).Split(',').ToList();\n\n            if (list.First().Length == 0)\n                list[0] = BlueprintActivity.None.GetDescription();\n\n            return list;\n        }\n\n        /// <summary>\n        /// When the user clicks, we check whether we must display the context menu.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void tvEntity_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            tvEntity.Cursor = Cursors.Default;\n\n            // Updates selection\n            tvEntity.SelectedNode = tvEntity.GetNodeAt(e.Location);\n\n            // Show menu\n            cmEntity.Show(tvEntity, e.Location);\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void tvEntity_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            tvEntity.Cursor = tvEntity.GetNodeCount(true) > 1\n                ? CustomCursors.ContextMenu\n                : Cursors.Default;\n        }\n\n        /// <summary>\n        /// Context menu opening, updates the menus status\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"CancelEventArgs\"/> instance containing the event data.</param>\n        private void cmEntity_Opening(object sender, CancelEventArgs e)\n        {\n            if (tvEntity.GetNodeCount(true) < 2)\n            {\n                e.Cancel = true;\n                return;\n            }\n\n            Item item = GetSelectedItem();\n\n            planToObject.Visible =\n                planToObjectSeperator.Visible = m_plan != null && tvEntity.SelectedNode != null && item != null;\n            showObjectInBrowserMenuItem.Visible =\n                showObjectInBrowserSeperator.Visible = tvEntity.SelectedNode != null && item != null;\n\n            if (item != null)\n            {\n                Blueprint blueprint = StaticBlueprints.GetBlueprintByID(item.ID);\n                Ship ship = item as Ship;\n\n                string text = ship != null ? \"Ship\" : blueprint != null ? \"Blueprint\" : \"Item\";\n\n                showObjectInBrowserMenuItem.Text = $\"Show In {text} Browser...\";\n            }\n\n            // \"Expand All\" and \"Collapse All\" menus\n            tsmiObjectsCollapseAll.Enabled = tsmiObjectsCollapseAll.Visible = m_allObjectsExpanded;\n            tsmiObjectsExpandAll.Enabled = tsmiObjectsExpandAll.Visible = !tsmiObjectsCollapseAll.Enabled;\n\n            List<string> listOfActivities = item != null ? GetSelectedItemActivities(item): new List<string>();\n\n            // \"Add to plan\" is enabled if we don't know all the prereqs \n            // and we're not already planning at least one of the unknown prereqs\n            planToObject.Enabled = item != null && m_plan != null && item.Prerequisites\n                .Where(x => listOfActivities.Contains(x.Activity.GetDescription())).ToCharacter(m_character)\n                .Any(x => !x.IsTrained && !m_plan.IsPlanned(x.Skill, x.Level));\n\n            bool untrainedPrerequisitiesExists = item != null && !item.Prerequisites.ToCharacter(m_character).AreTrained();\n\n            // Update the \"show prerequisites\" menu\n            showObjectPrerequisitiesMenu.Visible = untrainedPrerequisitiesExists;\n            showObjectInMenuSeperator.Visible = untrainedPrerequisitiesExists;\n        }\n\n        /// <summary>\n        /// Shared context menu - add ship/item/blueprint to plan.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void planToObjectMenuItem_Click(object sender, EventArgs e)\n        {\n            Item entity = GetSelectedItem();\n\n            if (entity == null)\n                return;\n\n            List<string> listOfActivities = GetSelectedItemActivities(entity);\n            IPlanOperation operation = m_plan\n                .TryAddSet(entity.Prerequisites\n                    .Where(x => listOfActivities.Contains(x.Activity.GetDescription())), entity.Name);\n\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = PlanWindow.ShowPlanWindow(plan: operation.Plan);\n            if (planWindow == null)\n                return;\n\n            PlanHelper.Perform(new PlanToOperationWindow(operation), planWindow);\n        }\n\n        /// <summary>\n        /// Shared Ship/Blueprint/Item Show Prereqs menu.\n        /// Builds a nicely formatted list of prereqs for the ship/item/blueprint\n        /// and shows them in a dialog box.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsShowItemPrereqs_Click(object sender, EventArgs e)\n        {\n            Item entity = GetSelectedItem();\n            if (entity == null)\n                return;\n\n            List<string> listOfActivities = GetSelectedItemActivities(entity);\n            IEnumerable<SkillLevel> prereqList = CreatePrereqList(entity.Prerequisites.Where(\n                x => listOfActivities.Contains(x.Activity.GetDescription())).ToCharacter(m_character));\n\n            int index = 0;\n            StringBuilder sb = new StringBuilder();\n            foreach (SkillLevel prereq in prereqList)\n            {\n                FormatPrerequisite(sb, prereq, ref index);\n            }\n\n            MessageBox.Show(sb.ToString(), @\"Untrained Prerequisites for \" + entity.Name, MessageBoxButtons.OK,\n                            MessageBoxIcon.Information);\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand All\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void tsmiObjectExpandAll_Click(object sender, EventArgs e)\n        {\n            tvEntity.ExpandAll();\n            m_allObjectsExpanded = true;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse All\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void tsmiObjectCollapseAll_Click(object sender, EventArgs e)\n        {\n            tvEntity.CollapseAll();\n            m_allObjectsExpanded = false;\n        }\n\n        #endregion\n\n\n        #region Controls' events\n\n        /// <summary>\n        /// Toggling the radio buttons to switch between sorted list and category views.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void rbShowAlpha_CheckedChanged(object sender, EventArgs e)\n        {\n            UpdateTrees();\n        }\n\n        /// <summary>\n        /// Toggling the \"Show base items/show variants\",\n        /// just redisplay the items tree.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbShowBaseOnly_CheckedChanged(object sender, EventArgs e)\n        {\n            UpdateItemsTree();\n        }\n\n        /// <summary>\n        /// Occurs when the window closes.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnClose_Click(object sender, EventArgs e)\n        {\n            Close();\n        }\n\n        /// <summary>\n        /// Doubleclicks on a ship/item leaf node will show the ship/item in the browser\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tvEntity_DoubleClick(object sender, EventArgs e)\n        {\n            Item item = GetSelectedItem();\n            if (item == null)\n                return;\n\n            Item ship = item as Ship;\n            if (ship != null)\n            {\n                PlanWindow.ShowPlanWindow(m_character, m_plan).ShowShipInBrowser(ship);\n                return;\n            }\n\n            Item blueprint = item as Blueprint;\n            if (blueprint != null)\n            {\n                PlanWindow.ShowPlanWindow(m_character, m_plan).ShowBlueprintInBrowser(blueprint);\n                return;\n            }\n\n            PlanWindow.ShowPlanWindow(m_character, m_plan).ShowItemInBrowser(item);\n        }\n\n        /// <summary>\n        /// Sklll context menu > Show me what this skill unlocks.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tvSkills_DoubleClick(object sender, EventArgs e)\n        {\n            SetSkill(GetSelectedSkill());\n        }\n\n        /// <summary>\n        /// We want to go look at a skill in the history list again.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbHistory_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            Skill skill = (Skill)cbHistory.Items[cbHistory.SelectedIndex];\n            SetSkill(m_character?.Skills[skill.ID] ?? skill);\n        }\n\n        #endregion\n\n\n        #region Skill Explorer Window factory\n\n        /// <summary>\n        /// Shows the skill in the skill explorer.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <exception cref=\"System.ArgumentNullException\">skill</exception>\n        internal void ShowSkillInExplorer(Skill skill)\n        {\n            if (skill == null)\n                return;\n\n            // Quit if it's an \"Unknown\" skill\n            if (skill.ID == int.MaxValue)\n                return;\n\n            SetSkill(skill);\n        }\n\n        /// <summary>\n        /// Shows the skill explorer window.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"plan\">The plan.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">skill</exception>\n        internal static SkillExplorerWindow ShowSkillExplorerWindow(Character character, Plan plan = null)\n        {\n            // If no character is associated, open a unique Data Browser (non-associated character)\n            if (character == null && plan == null)\n                return WindowsFactory.ShowUnique<SkillExplorerWindow>();\n\n            // Check if a Skill Planner is already open\n            // (a Skill Planner has the same Tag as a Data Browser but it has a plan attached)\n            PlanWindow planWindow = WindowsFactory.GetByTag<PlanWindow, Character>(character ?? (Character)plan.Character);\n\n            SkillExplorerWindow skillExplorerWindow;\n\n            // Do we have a Skill Planner open?\n            if (planWindow?.Plan != null)\n            {\n                // Activate\n                skillExplorerWindow =\n                    WindowsFactory.ShowByTag<SkillExplorerWindow, Character>(character ?? (Character)planWindow.Plan?.Character);\n\n                // If a plan was passed, assign the new plan\n                if (plan != null)\n                    skillExplorerWindow.Plan = planWindow.Plan;\n\n                return skillExplorerWindow;\n            }\n\n            // No plan window found, open a new Skill Explorer\n            if (planWindow == null || plan == null)\n            {\n                // Open a new Skill Explorer associated with the character\n                if (plan == null)\n                    return WindowsFactory.ShowByTag<SkillExplorerWindow, Character>(character);\n\n                // Open a new Skill Explorer (use the plan as tag for the creating the window)\n                // (This should be the only time a plan is used as the tag)\n                skillExplorerWindow = WindowsFactory.ShowByTag<SkillExplorerWindow, Plan>(plan);\n\n                // Change the tag (we changed it to the character for window lookup)\n                WindowsFactory.ChangeTag<SkillExplorerWindow, Plan, Character>(plan, (Character)plan.Character);\n\n                return skillExplorerWindow;\n            }\n\n            // Activate\n            skillExplorerWindow = WindowsFactory.ShowByTag<SkillExplorerWindow, Character>(character);\n\n            // It's a Data Browser, transform it to a Skill Planner\n            skillExplorerWindow.Plan = plan;\n\n            return skillExplorerWindow;\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SkillExplorerWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"cmSkills.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>36, 19</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"planToMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        wgAADsIBFShKgAAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAALmSURB\n        VDhPZZJLTxNhFIaJP8JEFwb1FxhHV8QLujDRhXEBRI0GNQQSFAQRUUQwBAm30nKrFFqhF3qlLdPOUCgt\n        vQJthba00JarYiSDcWHcqenr0Bk1lTc5+VbP851zvi/nTza3tlyJRMIRjcXNwXBE7w6EtNO+ec2k158p\n        m3dOTbs8pbknTh7ikeykNjaYWCIJVygMncOLftKGVg2ZVQKD9Ve3QlN/+MjRg5JYMsV8+fYdH/a+YnVn\n        F+54CnPJTczGUtD6QtB4g5nqNdE/+1T6+mO5x7MlvkiUWd/dw9LmDhZSmwisbWEmmoDKHThQnTrrj2bl\n        +Fke5WL1LzCh9W325jWYF8JQs7f9D44459FGOnBdpEwXCEfP8ygX5YybmQqvgAxGMgLj/BIMc4uZ0xwI\n        Q+qYQ82YFcXDBlzseJcu7FFkC0RmG0MvxhD/+Bmrn3Yze/CurLGjbMMWSUAfWEbzhBPlCgsud8nTRX2q\n        bIHASDNTS3EEWWA2loSHhe3sDrqsLrRbnGi3uiGw+VA1pEOaIJDsbAePcmkaMzFqTxD7Xey3LrA40KCl\n        2JmdqFVTqNNOonPCDl1TE9JFNzISHuXSbrAyZDAK6v0yeqhZVI0aMUhOo54FW9jWhaQZIpEIFEWhv7IC\n        YrG0hEe5tGhIxsQuj16MQ2L3Q+kJQUC5MOZfgsw+CdsggcgUgcbGRjyQ6NOlCssFHuXyfGScKXurQolY\n        hVKJBo+ketwVq1Etk/+Fx7oJNOhIFMpMeGxw5vMolyuve5jb3TLcH1CinIUrR02olMqgHvgH1yg0qNTZ\n        cUtG4onZdYlHueQ3CplmPQ1jIILZlXV4olEYpRwsaSVYqRJlKhrV4w7cGbXiKenJFpx7JWSKe+UoH9aj\n        jv0w6r48+OgOyLsIPGTHKJFbUKGdxrMJN+4padRR/mzBqdo25nRdB4gXApx5KQTBPpOwgcDV1h7kvRna\n        /zy4NqBBwbAJN2VsB5Z9QU7ObwjkSucBbV0TAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"cmEntity.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>127, 20</value>\n  </metadata>\n  <metadata name=\"tmrAutoUpdate.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>216, 20</value>\n  </metadata>\n  <metadata name=\"toolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>333, 19</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SkillSelectControl.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class SkillSelectControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SkillSelectControl));\n            this.cbSkillFilter = new System.Windows.Forms.ComboBox();\n            this.tbSearchText = new System.Windows.Forms.TextBox();\n            this.pbSearchImage = new System.Windows.Forms.PictureBox();\n            this.cmSkills = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.cmiPlanToLevel = new System.Windows.Forms.ToolStripMenuItem();\n            this.level0ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.level1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.level2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.level3ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.level4ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.level5ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.planToMenuSkillSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.showInSkillBrowserMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInSkillExplorerMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmiExpandSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmiCollapseSelected = new System.Windows.Forms.ToolStripMenuItem();\n            this.expandCollapseSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.cmiExpandAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.cmiCollapseAll = new System.Windows.Forms.ToolStripMenuItem();\n            this.lbSearchList = new System.Windows.Forms.ListBox();\n            this.cmListSkills = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.cmiLvPlanTo = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel0 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel1 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel2 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel3 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel4 = new System.Windows.Forms.ToolStripMenuItem();\n            this.tsmLevel5 = new System.Windows.Forms.ToolStripMenuItem();\n            this.planToMenuSkillListSeparator = new System.Windows.Forms.ToolStripSeparator();\n            this.showInSkillBrowserListMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.showInSkillExplorerListMenu = new System.Windows.Forms.ToolStripMenuItem();\n            this.lbSearchTextHint = new System.Windows.Forms.Label();\n            this.lbNoMatches = new System.Windows.Forms.Label();\n            this.cbShowNonPublic = new System.Windows.Forms.CheckBox();\n            this.lblFilter = new System.Windows.Forms.Label();\n            this.cbSorting = new System.Windows.Forms.ComboBox();\n            this.lblSort = new System.Windows.Forms.Label();\n            this.lvSortedSkillList = new System.Windows.Forms.ListView();\n            this.chName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.chSortKey = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));\n            this.ilSkillIcons = new System.Windows.Forms.ImageList(this.components);\n            this.pnlFilter = new System.Windows.Forms.Panel();\n            this.pbSearchTextDel = new System.Windows.Forms.PictureBox();\n            this.cbFilterByAttributes = new System.Windows.Forms.ComboBox();\n            this.lblFilterBy = new System.Windows.Forms.Label();\n            this.pnlResults = new System.Windows.Forms.Panel();\n            this.tvItems = new EVEMon.Common.Controls.TreeView();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchImage)).BeginInit();\n            this.cmSkills.SuspendLayout();\n            this.cmListSkills.SuspendLayout();\n            this.pnlFilter.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchTextDel)).BeginInit();\n            this.pnlResults.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // cbSkillFilter\n            // \n            this.cbSkillFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSkillFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSkillFilter.FormattingEnabled = true;\n            this.cbSkillFilter.Location = new System.Drawing.Point(45, 3);\n            this.cbSkillFilter.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);\n            this.cbSkillFilter.MaxDropDownItems = 12;\n            this.cbSkillFilter.Name = \"cbSkillFilter\";\n            this.cbSkillFilter.Size = new System.Drawing.Size(182, 21);\n            this.cbSkillFilter.Sorted = true;\n            this.cbSkillFilter.TabIndex = 0;\n            this.cbSkillFilter.SelectedIndexChanged += new System.EventHandler(this.cbSkillFilter_SelectedIndexChanged);\n            // \n            // tbSearchText\n            // \n            this.tbSearchText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbSearchText.Location = new System.Drawing.Point(45, 76);\n            this.tbSearchText.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);\n            this.tbSearchText.Name = \"tbSearchText\";\n            this.tbSearchText.Size = new System.Drawing.Size(182, 20);\n            this.tbSearchText.TabIndex = 3;\n            this.tbSearchText.TextChanged += new System.EventHandler(this.tbSearch_TextChanged);\n            this.tbSearchText.Enter += new System.EventHandler(this.tbSearch_Enter);\n            this.tbSearchText.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.tbSearch_KeyPress);\n            this.tbSearchText.Leave += new System.EventHandler(this.tbSearch_Leave);\n            // \n            // pbSearchImage\n            // \n            this.pbSearchImage.Image = ((System.Drawing.Image)(resources.GetObject(\"pbSearchImage.Image\")));\n            this.pbSearchImage.InitialImage = null;\n            this.pbSearchImage.Location = new System.Drawing.Point(9, 76);\n            this.pbSearchImage.Margin = new System.Windows.Forms.Padding(2);\n            this.pbSearchImage.Name = \"pbSearchImage\";\n            this.pbSearchImage.Size = new System.Drawing.Size(20, 20);\n            this.pbSearchImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbSearchImage.TabIndex = 19;\n            this.pbSearchImage.TabStop = false;\n            // \n            // cmSkills\n            // \n            this.cmSkills.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.cmiPlanToLevel,\n            this.planToMenuSkillSeparator,\n            this.showInSkillBrowserMenu,\n            this.showInSkillExplorerMenu,\n            this.cmiExpandSelected,\n            this.cmiCollapseSelected,\n            this.expandCollapseSeparator,\n            this.cmiExpandAll,\n            this.cmiCollapseAll});\n            this.cmSkills.Name = \"contextMenuStrip1\";\n            this.cmSkills.Size = new System.Drawing.Size(195, 170);\n            this.cmSkills.Opening += new System.ComponentModel.CancelEventHandler(this.cmSkills_Opening);\n            // \n            // cmiPlanToLevel\n            // \n            this.cmiPlanToLevel.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.level0ToolStripMenuItem,\n            this.level1ToolStripMenuItem,\n            this.level2ToolStripMenuItem,\n            this.level3ToolStripMenuItem,\n            this.level4ToolStripMenuItem,\n            this.level5ToolStripMenuItem});\n            this.cmiPlanToLevel.Image = ((System.Drawing.Image)(resources.GetObject(\"cmiPlanToLevel.Image\")));\n            this.cmiPlanToLevel.Name = \"cmiPlanToLevel\";\n            this.cmiPlanToLevel.Size = new System.Drawing.Size(194, 22);\n            this.cmiPlanToLevel.Text = \"&Plan to...\";\n            // \n            // level0ToolStripMenuItem\n            // \n            this.level0ToolStripMenuItem.Name = \"level0ToolStripMenuItem\";\n            this.level0ToolStripMenuItem.Size = new System.Drawing.Size(117, 22);\n            this.level0ToolStripMenuItem.Text = \"&Remove\";\n            this.level0ToolStripMenuItem.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // level1ToolStripMenuItem\n            // \n            this.level1ToolStripMenuItem.Name = \"level1ToolStripMenuItem\";\n            this.level1ToolStripMenuItem.Size = new System.Drawing.Size(117, 22);\n            this.level1ToolStripMenuItem.Text = \"Level &1\";\n            this.level1ToolStripMenuItem.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // level2ToolStripMenuItem\n            // \n            this.level2ToolStripMenuItem.Name = \"level2ToolStripMenuItem\";\n            this.level2ToolStripMenuItem.Size = new System.Drawing.Size(117, 22);\n            this.level2ToolStripMenuItem.Text = \"Level &2\";\n            this.level2ToolStripMenuItem.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // level3ToolStripMenuItem\n            // \n            this.level3ToolStripMenuItem.Name = \"level3ToolStripMenuItem\";\n            this.level3ToolStripMenuItem.Size = new System.Drawing.Size(117, 22);\n            this.level3ToolStripMenuItem.Text = \"Level &3\";\n            this.level3ToolStripMenuItem.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // level4ToolStripMenuItem\n            // \n            this.level4ToolStripMenuItem.Name = \"level4ToolStripMenuItem\";\n            this.level4ToolStripMenuItem.Size = new System.Drawing.Size(117, 22);\n            this.level4ToolStripMenuItem.Text = \"Level &4\";\n            this.level4ToolStripMenuItem.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // level5ToolStripMenuItem\n            // \n            this.level5ToolStripMenuItem.Name = \"level5ToolStripMenuItem\";\n            this.level5ToolStripMenuItem.Size = new System.Drawing.Size(117, 22);\n            this.level5ToolStripMenuItem.Text = \"Level &5\";\n            this.level5ToolStripMenuItem.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // planToMenuSkillSeparator\n            // \n            this.planToMenuSkillSeparator.Name = \"planToMenuSkillSeparator\";\n            this.planToMenuSkillSeparator.Size = new System.Drawing.Size(191, 6);\n            // \n            // showInSkillBrowserMenu\n            // \n            this.showInSkillBrowserMenu.Name = \"showInSkillBrowserMenu\";\n            this.showInSkillBrowserMenu.Size = new System.Drawing.Size(194, 22);\n            this.showInSkillBrowserMenu.Text = \"Show in Skill &Browser\";\n            this.showInSkillBrowserMenu.Click += new System.EventHandler(this.showInSkillBrowserMenu_Click);\n            // \n            // showInSkillExplorerMenu\n            // \n            this.showInSkillExplorerMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"showInSkillExplorerMenu.Image\")));\n            this.showInSkillExplorerMenu.Name = \"showInSkillExplorerMenu\";\n            this.showInSkillExplorerMenu.Size = new System.Drawing.Size(194, 22);\n            this.showInSkillExplorerMenu.Text = \"Show in Skill &Explorer...\";\n            this.showInSkillExplorerMenu.Click += new System.EventHandler(this.showInSkillExplorerMenu_Click);\n            // \n            // cmiExpandSelected\n            // \n            this.cmiExpandSelected.Name = \"cmiExpandSelected\";\n            this.cmiExpandSelected.Size = new System.Drawing.Size(194, 22);\n            this.cmiExpandSelected.Text = \"Expand Selected\";\n            this.cmiExpandSelected.Click += new System.EventHandler(this.cmiExpandSelected_Click);\n            // \n            // cmiCollapseSelected\n            // \n            this.cmiCollapseSelected.Name = \"cmiCollapseSelected\";\n            this.cmiCollapseSelected.Size = new System.Drawing.Size(194, 22);\n            this.cmiCollapseSelected.Text = \"Collapse Selected\";\n            this.cmiCollapseSelected.Click += new System.EventHandler(this.cmiCollapseSelected_Click);\n            // \n            // expandCollapseSeparator\n            // \n            this.expandCollapseSeparator.Name = \"expandCollapseSeparator\";\n            this.expandCollapseSeparator.Size = new System.Drawing.Size(191, 6);\n            // \n            // cmiExpandAll\n            // \n            this.cmiExpandAll.Name = \"cmiExpandAll\";\n            this.cmiExpandAll.Size = new System.Drawing.Size(194, 22);\n            this.cmiExpandAll.Text = \"Expand All\";\n            this.cmiExpandAll.Click += new System.EventHandler(this.cmiExpandAll_Click);\n            // \n            // cmiCollapseAll\n            // \n            this.cmiCollapseAll.Name = \"cmiCollapseAll\";\n            this.cmiCollapseAll.Size = new System.Drawing.Size(194, 22);\n            this.cmiCollapseAll.Text = \"Collapse All\";\n            this.cmiCollapseAll.Click += new System.EventHandler(this.cmiCollapseAll_Click);\n            // \n            // lbSearchList\n            // \n            this.lbSearchList.ContextMenuStrip = this.cmListSkills;\n            this.lbSearchList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbSearchList.FormattingEnabled = true;\n            this.lbSearchList.IntegralHeight = false;\n            this.lbSearchList.Location = new System.Drawing.Point(0, 0);\n            this.lbSearchList.Margin = new System.Windows.Forms.Padding(2);\n            this.lbSearchList.Name = \"lbSearchList\";\n            this.lbSearchList.Size = new System.Drawing.Size(227, 299);\n            this.lbSearchList.TabIndex = 1;\n            this.lbSearchList.Visible = false;\n            this.lbSearchList.SelectedIndexChanged += new System.EventHandler(this.lbSearchList_SelectedIndexChanged);\n            this.lbSearchList.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbSearchList_MouseDown);\n            this.lbSearchList.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lbSearchList_MouseMove);\n            // \n            // cmListSkills\n            // \n            this.cmListSkills.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.cmiLvPlanTo,\n            this.planToMenuSkillListSeparator,\n            this.showInSkillBrowserListMenu,\n            this.showInSkillExplorerListMenu});\n            this.cmListSkills.Name = \"cmListSkills\";\n            this.cmListSkills.Size = new System.Drawing.Size(195, 98);\n            this.cmListSkills.Opening += new System.ComponentModel.CancelEventHandler(this.cmListSkills_Opening);\n            // \n            // cmiLvPlanTo\n            // \n            this.cmiLvPlanTo.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.tsmLevel0,\n            this.tsmLevel1,\n            this.tsmLevel2,\n            this.tsmLevel3,\n            this.tsmLevel4,\n            this.tsmLevel5});\n            this.cmiLvPlanTo.Image = ((System.Drawing.Image)(resources.GetObject(\"cmiLvPlanTo.Image\")));\n            this.cmiLvPlanTo.Name = \"cmiLvPlanTo\";\n            this.cmiLvPlanTo.Size = new System.Drawing.Size(194, 22);\n            this.cmiLvPlanTo.Text = \"&Plan To...\";\n            // \n            // tsmLevel0\n            // \n            this.tsmLevel0.Name = \"tsmLevel0\";\n            this.tsmLevel0.Size = new System.Drawing.Size(117, 22);\n            this.tsmLevel0.Text = \"&Remove\";\n            this.tsmLevel0.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsmLevel1\n            // \n            this.tsmLevel1.Name = \"tsmLevel1\";\n            this.tsmLevel1.Size = new System.Drawing.Size(117, 22);\n            this.tsmLevel1.Text = \"Level &1\";\n            this.tsmLevel1.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsmLevel2\n            // \n            this.tsmLevel2.Name = \"tsmLevel2\";\n            this.tsmLevel2.Size = new System.Drawing.Size(117, 22);\n            this.tsmLevel2.Text = \"Level &2\";\n            this.tsmLevel2.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsmLevel3\n            // \n            this.tsmLevel3.Name = \"tsmLevel3\";\n            this.tsmLevel3.Size = new System.Drawing.Size(117, 22);\n            this.tsmLevel3.Text = \"Level &3\";\n            this.tsmLevel3.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsmLevel4\n            // \n            this.tsmLevel4.Name = \"tsmLevel4\";\n            this.tsmLevel4.Size = new System.Drawing.Size(117, 22);\n            this.tsmLevel4.Text = \"Level &4\";\n            this.tsmLevel4.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // tsmLevel5\n            // \n            this.tsmLevel5.Name = \"tsmLevel5\";\n            this.tsmLevel5.Size = new System.Drawing.Size(117, 22);\n            this.tsmLevel5.Text = \"Level &5\";\n            this.tsmLevel5.Click += new System.EventHandler(this.planToLevelMenuItem_Click);\n            // \n            // planToMenuSkillListSeparator\n            // \n            this.planToMenuSkillListSeparator.Name = \"planToMenuSkillListSeparator\";\n            this.planToMenuSkillListSeparator.Size = new System.Drawing.Size(191, 6);\n            // \n            // showInSkillBrowserListMenu\n            // \n            this.showInSkillBrowserListMenu.Name = \"showInSkillBrowserListMenu\";\n            this.showInSkillBrowserListMenu.Size = new System.Drawing.Size(194, 22);\n            this.showInSkillBrowserListMenu.Text = \"Show in Skill &Browser\";\n            this.showInSkillBrowserListMenu.Click += new System.EventHandler(this.showInSkillBrowserMenu_Click);\n            // \n            // showInSkillExplorerListMenu\n            // \n            this.showInSkillExplorerListMenu.Image = ((System.Drawing.Image)(resources.GetObject(\"showInSkillExplorerListMenu.Image\")));\n            this.showInSkillExplorerListMenu.Name = \"showInSkillExplorerListMenu\";\n            this.showInSkillExplorerListMenu.Size = new System.Drawing.Size(194, 22);\n            this.showInSkillExplorerListMenu.Text = \"Show in Skill &Explorer...\";\n            this.showInSkillExplorerListMenu.Click += new System.EventHandler(this.showInSkillExplorerMenu_Click);\n            // \n            // lbSearchTextHint\n            // \n            this.lbSearchTextHint.AutoSize = true;\n            this.lbSearchTextHint.BackColor = System.Drawing.SystemColors.Window;\n            this.lbSearchTextHint.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.lbSearchTextHint.Location = new System.Drawing.Point(49, 79);\n            this.lbSearchTextHint.Name = \"lbSearchTextHint\";\n            this.lbSearchTextHint.Size = new System.Drawing.Size(65, 13);\n            this.lbSearchTextHint.TabIndex = 22;\n            this.lbSearchTextHint.Text = \"Search Text\";\n            this.lbSearchTextHint.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            this.lbSearchTextHint.Click += new System.EventHandler(this.lblSearchTextHint_Click);\n            // \n            // lbNoMatches\n            // \n            this.lbNoMatches.BackColor = System.Drawing.SystemColors.Window;\n            this.lbNoMatches.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbNoMatches.ForeColor = System.Drawing.SystemColors.GrayText;\n            this.lbNoMatches.Location = new System.Drawing.Point(0, 0);\n            this.lbNoMatches.Margin = new System.Windows.Forms.Padding(0);\n            this.lbNoMatches.Name = \"lbNoMatches\";\n            this.lbNoMatches.Padding = new System.Windows.Forms.Padding(4, 30, 4, 4);\n            this.lbNoMatches.Size = new System.Drawing.Size(227, 299);\n            this.lbNoMatches.TabIndex = 1;\n            this.lbNoMatches.Text = \"No skills match your search.\";\n            this.lbNoMatches.TextAlign = System.Drawing.ContentAlignment.TopCenter;\n            this.lbNoMatches.Visible = false;\n            // \n            // cbShowNonPublic\n            // \n            this.cbShowNonPublic.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.cbShowNonPublic.Location = new System.Drawing.Point(0, 399);\n            this.cbShowNonPublic.Margin = new System.Windows.Forms.Padding(2);\n            this.cbShowNonPublic.Name = \"cbShowNonPublic\";\n            this.cbShowNonPublic.Padding = new System.Windows.Forms.Padding(2, 0, 0, 0);\n            this.cbShowNonPublic.Size = new System.Drawing.Size(227, 22);\n            this.cbShowNonPublic.TabIndex = 2;\n            this.cbShowNonPublic.Text = \"Show Non-Public Skills\";\n            this.cbShowNonPublic.UseVisualStyleBackColor = true;\n            this.cbShowNonPublic.CheckedChanged += new System.EventHandler(this.cbShowNonPublic_CheckedChanged);\n            // \n            // lblFilter\n            // \n            this.lblFilter.AutoSize = true;\n            this.lblFilter.Location = new System.Drawing.Point(6, 6);\n            this.lblFilter.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.lblFilter.Name = \"lblFilter\";\n            this.lblFilter.Size = new System.Drawing.Size(32, 13);\n            this.lblFilter.TabIndex = 25;\n            this.lblFilter.Text = \"Filter:\";\n            // \n            // cbSorting\n            // \n            this.cbSorting.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbSorting.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbSorting.FormattingEnabled = true;\n            this.cbSorting.Location = new System.Drawing.Point(45, 51);\n            this.cbSorting.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);\n            this.cbSorting.Name = \"cbSorting\";\n            this.cbSorting.Size = new System.Drawing.Size(182, 21);\n            this.cbSorting.TabIndex = 2;\n            this.cbSorting.SelectedIndexChanged += new System.EventHandler(this.cbSorting_SelectedIndexChanged);\n            // \n            // lblSort\n            // \n            this.lblSort.AutoSize = true;\n            this.lblSort.Location = new System.Drawing.Point(9, 54);\n            this.lblSort.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.lblSort.Name = \"lblSort\";\n            this.lblSort.Size = new System.Drawing.Size(29, 13);\n            this.lblSort.TabIndex = 27;\n            this.lblSort.Text = \"Sort:\";\n            // \n            // lvSortedSkillList\n            // \n            this.lvSortedSkillList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\n            this.chName,\n            this.chSortKey});\n            this.lvSortedSkillList.ContextMenuStrip = this.cmListSkills;\n            this.lvSortedSkillList.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lvSortedSkillList.FullRowSelect = true;\n            this.lvSortedSkillList.HideSelection = false;\n            this.lvSortedSkillList.Location = new System.Drawing.Point(0, 0);\n            this.lvSortedSkillList.Margin = new System.Windows.Forms.Padding(2);\n            this.lvSortedSkillList.MultiSelect = false;\n            this.lvSortedSkillList.Name = \"lvSortedSkillList\";\n            this.lvSortedSkillList.Size = new System.Drawing.Size(227, 299);\n            this.lvSortedSkillList.TabIndex = 1;\n            this.lvSortedSkillList.TileSize = new System.Drawing.Size(16, 16);\n            this.lvSortedSkillList.UseCompatibleStateImageBehavior = false;\n            this.lvSortedSkillList.View = System.Windows.Forms.View.Details;\n            this.lvSortedSkillList.Visible = false;\n            this.lvSortedSkillList.SelectedIndexChanged += new System.EventHandler(this.lvSortedSkillList_SelectedIndexChanged);\n            this.lvSortedSkillList.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lvSortedSkillList_MouseDown);\n            this.lvSortedSkillList.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lvSortedSkillList_MouseMove);\n            // \n            // chName\n            // \n            this.chName.Text = \"Name\";\n            this.chName.Width = 120;\n            // \n            // chSortKey\n            // \n            this.chSortKey.Text = \"Sort\";\n            // \n            // ilSkillIcons\n            // \n            this.ilSkillIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"ilSkillIcons.ImageStream\")));\n            this.ilSkillIcons.TransparentColor = System.Drawing.Color.Transparent;\n            this.ilSkillIcons.Images.SetKeyName(0, \"book\");\n            this.ilSkillIcons.Images.SetKeyName(1, \"PrereqsNOTMet\");\n            this.ilSkillIcons.Images.SetKeyName(2, \"PrereqsMet\");\n            this.ilSkillIcons.Images.SetKeyName(3, \"lvl0\");\n            this.ilSkillIcons.Images.SetKeyName(4, \"lvl1\");\n            this.ilSkillIcons.Images.SetKeyName(5, \"lvl2\");\n            this.ilSkillIcons.Images.SetKeyName(6, \"lvl3\");\n            this.ilSkillIcons.Images.SetKeyName(7, \"lvl4\");\n            this.ilSkillIcons.Images.SetKeyName(8, \"lvl5\");\n            this.ilSkillIcons.Images.SetKeyName(9, \"Skill\");\n            this.ilSkillIcons.Images.SetKeyName(10, \"Skills\");\n            // \n            // pnlFilter\n            // \n            this.pnlFilter.Controls.Add(this.pbSearchTextDel);\n            this.pnlFilter.Controls.Add(this.cbFilterByAttributes);\n            this.pnlFilter.Controls.Add(this.lblFilterBy);\n            this.pnlFilter.Controls.Add(this.cbSorting);\n            this.pnlFilter.Controls.Add(this.cbSkillFilter);\n            this.pnlFilter.Controls.Add(this.lblSort);\n            this.pnlFilter.Controls.Add(this.pbSearchImage);\n            this.pnlFilter.Controls.Add(this.lbSearchTextHint);\n            this.pnlFilter.Controls.Add(this.lblFilter);\n            this.pnlFilter.Controls.Add(this.tbSearchText);\n            this.pnlFilter.Dock = System.Windows.Forms.DockStyle.Top;\n            this.pnlFilter.Location = new System.Drawing.Point(0, 0);\n            this.pnlFilter.Margin = new System.Windows.Forms.Padding(2);\n            this.pnlFilter.Name = \"pnlFilter\";\n            this.pnlFilter.Size = new System.Drawing.Size(227, 100);\n            this.pnlFilter.TabIndex = 0;\n            // \n            // pbSearchTextDel\n            // \n            this.pbSearchTextDel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.pbSearchTextDel.Image = ((System.Drawing.Image)(resources.GetObject(\"pbSearchTextDel.Image\")));\n            this.pbSearchTextDel.InitialImage = null;\n            this.pbSearchTextDel.Location = new System.Drawing.Point(209, 78);\n            this.pbSearchTextDel.Name = \"pbSearchTextDel\";\n            this.pbSearchTextDel.Size = new System.Drawing.Size(16, 16);\n            this.pbSearchTextDel.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;\n            this.pbSearchTextDel.TabIndex = 38;\n            this.pbSearchTextDel.TabStop = false;\n            this.pbSearchTextDel.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pbSearchTextDel_MouseUp);\n            // \n            // cbFilterByAttributes\n            // \n            this.cbFilterByAttributes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.cbFilterByAttributes.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cbFilterByAttributes.FormattingEnabled = true;\n            this.cbFilterByAttributes.Location = new System.Drawing.Point(45, 27);\n            this.cbFilterByAttributes.Name = \"cbFilterByAttributes\";\n            this.cbFilterByAttributes.Size = new System.Drawing.Size(182, 21);\n            this.cbFilterByAttributes.Sorted = true;\n            this.cbFilterByAttributes.TabIndex = 1;\n            this.cbFilterByAttributes.SelectedIndexChanged += new System.EventHandler(this.cbFilterByAttributes_SelectedIndexChanged);\n            // \n            // lblFilterBy\n            // \n            this.lblFilterBy.AutoSize = true;\n            this.lblFilterBy.Location = new System.Drawing.Point(16, 30);\n            this.lblFilterBy.Name = \"lblFilterBy\";\n            this.lblFilterBy.Size = new System.Drawing.Size(22, 13);\n            this.lblFilterBy.TabIndex = 37;\n            this.lblFilterBy.Text = \"By:\";\n            // \n            // pnlResults\n            // \n            this.pnlResults.AutoSize = true;\n            this.pnlResults.Controls.Add(this.lbNoMatches);\n            this.pnlResults.Controls.Add(this.lbSearchList);\n            this.pnlResults.Controls.Add(this.tvItems);\n            this.pnlResults.Controls.Add(this.lvSortedSkillList);\n            this.pnlResults.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pnlResults.Location = new System.Drawing.Point(0, 100);\n            this.pnlResults.Margin = new System.Windows.Forms.Padding(0);\n            this.pnlResults.Name = \"pnlResults\";\n            this.pnlResults.Size = new System.Drawing.Size(227, 299);\n            this.pnlResults.TabIndex = 1;\n            // \n            // tvItems\n            // \n            this.tvItems.ContextMenuStrip = this.cmSkills;\n            this.tvItems.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tvItems.HideSelection = false;\n            this.tvItems.Location = new System.Drawing.Point(0, 0);\n            this.tvItems.Margin = new System.Windows.Forms.Padding(2);\n            this.tvItems.Name = \"tvItems\";\n            this.tvItems.SelectionBackColor = System.Drawing.SystemColors.Highlight;\n            this.tvItems.SelectionMode = EVEMon.Common.Controls.TreeViewSelectionMode.SingleSelect;\n            this.tvItems.Size = new System.Drawing.Size(227, 299);\n            this.tvItems.TabIndex = 0;\n            this.tvItems.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.tvItems_ItemDrag);\n            this.tvItems.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvSkillList_AfterSelect);\n            this.tvItems.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tvItems_MouseDown);\n            this.tvItems.MouseMove += new System.Windows.Forms.MouseEventHandler(this.tvItems_MouseMove);\n            // \n            // SkillSelectControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.pnlResults);\n            this.Controls.Add(this.pnlFilter);\n            this.Controls.Add(this.cbShowNonPublic);\n            this.Margin = new System.Windows.Forms.Padding(2);\n            this.Name = \"SkillSelectControl\";\n            this.Size = new System.Drawing.Size(227, 421);\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchImage)).EndInit();\n            this.cmSkills.ResumeLayout(false);\n            this.cmListSkills.ResumeLayout(false);\n            this.pnlFilter.ResumeLayout(false);\n            this.pnlFilter.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pbSearchTextDel)).EndInit();\n            this.pnlResults.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TextBox tbSearchText;\n        private System.Windows.Forms.PictureBox pbSearchImage;\n        private System.Windows.Forms.ListBox lbSearchList;\n        private System.Windows.Forms.Label lbSearchTextHint;\n        private System.Windows.Forms.Label lbNoMatches;\n        private System.Windows.Forms.CheckBox cbShowNonPublic;\n        private System.Windows.Forms.Label lblFilter;\n        private System.Windows.Forms.ComboBox cbSorting;\n        private System.Windows.Forms.Label lblSort;\n        private System.Windows.Forms.ListView lvSortedSkillList;\n        private System.Windows.Forms.ColumnHeader chName;\n        private System.Windows.Forms.ColumnHeader chSortKey;\n        private System.Windows.Forms.ImageList ilSkillIcons;\n        private EVEMon.Common.Controls.TreeView tvItems;\n        private System.Windows.Forms.Panel pnlFilter;\n        private System.Windows.Forms.Panel pnlResults;\n        private System.Windows.Forms.ComboBox cbSkillFilter;\n        private System.Windows.Forms.ContextMenuStrip cmSkills;\n        private System.Windows.Forms.ToolStripMenuItem cmiExpandAll;\n        private System.Windows.Forms.ToolStripMenuItem cmiCollapseAll;\n        private System.Windows.Forms.ToolStripMenuItem cmiExpandSelected;\n        private System.Windows.Forms.ToolStripMenuItem cmiCollapseSelected;\n        private System.Windows.Forms.ToolStripSeparator planToMenuSkillSeparator;\n        private System.Windows.Forms.ToolStripMenuItem cmiPlanToLevel;\n        private System.Windows.Forms.ToolStripMenuItem level1ToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem level2ToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem level3ToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem level4ToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem level5ToolStripMenuItem;\n        private System.Windows.Forms.ContextMenuStrip cmListSkills;\n        private System.Windows.Forms.ToolStripMenuItem cmiLvPlanTo;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel1;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel2;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel3;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel4;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel5;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillBrowserMenu;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillExplorerMenu;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillBrowserListMenu;\n        private System.Windows.Forms.ToolStripMenuItem showInSkillExplorerListMenu;\n        private System.Windows.Forms.ToolStripSeparator expandCollapseSeparator;\n        private System.Windows.Forms.ToolStripSeparator planToMenuSkillListSeparator;\n        private System.Windows.Forms.ToolStripMenuItem level0ToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem tsmLevel0;\n        private System.Windows.Forms.ComboBox cbFilterByAttributes;\n        private System.Windows.Forms.Label lblFilterBy;\n        private System.Windows.Forms.PictureBox pbSearchTextDel;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SkillSelectControl.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Configuration;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Resources;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Resources.Skill_Select;\nusing EVEMon.Common.Models.Collections;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.SkillPlanner\n{\n    public partial class SkillSelectControl : UserControl\n    {\n        public event EventHandler<EventArgs> SelectedSkillChanged;\n\n        private bool m_allExpanded;\n        private Character m_character;\n        private Skill m_selectedSkill;\n        private Plan m_plan;\n        private bool m_init;\n        private bool m_blockSelectionReentrancy;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        public SkillSelectControl()\n        {\n            InitializeComponent();\n        }\n\n        #endregion\n\n\n        #region Internal Properties\n\n        /// <summary>\n        /// Gets or sets the character.\n        /// </summary>\n        /// <value>\n        /// The character.\n        /// </value>\n        internal Character Character\n        {\n            get { return m_character; }\n            set\n            {\n                if (value == null || m_character == value)\n                    return;\n\n                m_character = value;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the plan.\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                if (m_plan == value)\n                    return;\n\n                // Should we be transforming a Data Browser to a Skill Planner?\n                bool transformToPlanner = (value != null) && (m_plan == null) && (m_character != null);\n\n                if (value == null)\n                    return;\n\n                m_plan = value;\n                m_character = (Character)m_plan.Character;\n\n                // Transform a Data Browser to a Skill Planner\n                if (!transformToPlanner)\n                    return;\n\n                InitializeFiltersControls();\n                UpdateContent();\n            }\n        }\n\n        /// <summary>\n        /// Gets the selected skill.\n        /// </summary>\n        internal Skill SelectedSkill\n        {\n            get { return m_selectedSkill; }\n            set\n            {\n                if (m_selectedSkill == value)\n                    return;\n\n                m_selectedSkill = value;\n\n                if (value == null)\n                {\n                    OnSelectionChanged();\n                    return;\n                }\n\n                // Updates the selection for the three controls\n                m_blockSelectionReentrancy = true;\n                try\n                {\n                    tvItems.SelectNodeWithTag(value);\n                }\n                finally\n                {\n                    m_blockSelectionReentrancy = false;\n                }\n\n                // Fires event for subscribers\n                OnSelectionChanged();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets true whether the control is hosted in the skill browser.\n        /// When true, the \"Show in skill browser\" context menus won't be displayed.\n        /// </summary>\n        [Category(\"Behavior\"),\n         Description(\"When true, the \\\"Show in Skill Browser\\\" context menus won't be displayed.\"),\n         DefaultValue(false)]\n        public bool HostedInSkillBrowser { get; set; }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// On load, restore settings and update the content\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            // Call the base method\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            // Initialize the filters controls\n            InitializeFiltersControls();\n\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            Disposed += OnDisposed;\n\n            // Updates the controls\n            UpdateControlVisibility();\n        }\n\n        /// <summary>\n        /// Initializes the filters controls.\n        /// </summary>\n        private void InitializeFiltersControls()\n        {\n            m_init = false;\n\n            // Create the attributes combinations and add them to the combo box\n            cbFilterByAttributes.Items.AddRange(GetAttributesCombinations().ToArray());\n\n            InitializeFilterControl();\n            InitializeSortControl();\n\n            InitiliazeSelectedIndexes();\n\n            m_init = true;\n        }\n\n        /// <summary>\n        /// Initializes the filter control.\n        /// </summary>\n        private void InitializeFilterControl()\n        {\n            cbSkillFilter.Items.Clear();\n            cbSkillFilter.Items.AddRange(EnumExtensions.GetDescriptions<SkillFilter>()\n                .Where(description => !string.IsNullOrWhiteSpace((string)description))\n                .ToArray());\n\n            // Skill Planner\n            if (m_plan != null)\n                return;\n\n            // Data Browser (associated character)\n            if (m_character != null)\n            {\n                cbSkillFilter.Items.Remove(SkillFilter.NotPlanned.GetDescription());\n                cbSkillFilter.Items.Remove(SkillFilter.NotPlannedButTrainable.GetDescription());\n                cbSkillFilter.Items.Remove(SkillFilter.Planned.GetDescription());\n\n                return;\n            }\n\n            // Data Browser (non-associated character)\n            const int Index = (int)SkillFilter.ByAttributes + 1;\n            while (cbSkillFilter.Items.Count > Index)\n            {\n                cbSkillFilter.Items.RemoveAt(Index);\n            }\n            cbSkillFilter.Items.Add(SkillFilter.AlphaFriendly.GetDescription());\n        }\n\n        /// <summary>\n        /// Initializes the sort control.\n        /// </summary>\n        private void InitializeSortControl()\n        {\n            cbSorting.Items.Clear();\n            cbSorting.Items.AddRange(EnumExtensions.GetDescriptions<SkillSort>()\n                .Where(description => !string.IsNullOrWhiteSpace((string)description))\n                .ToArray());\n\n            // Skill Planner or Data Browser (associated character)\n            if ((m_plan != null) || (m_character != null))\n                return;\n\n            cbSorting.Items.Remove(SkillSort.TimeToNextLevel.GetDescription());\n            cbSorting.Items.Remove(SkillSort.TimeToLevel5.GetDescription());\n            cbSorting.Items.Remove(SkillSort.SPPerHour.GetDescription());\n        }\n\n        /// <summary>\n        /// Initiliazes the selected indexes.\n        /// </summary>\n        private void InitiliazeSelectedIndexes()\n        {\n            if (Settings.UI.UseStoredSearchFilters)\n            {\n                SkillBrowserSettings settings;\n\n                // Skill Planner\n                if (m_plan != null)\n                    settings = Settings.UI.SkillBrowser;\n                // Character associated Data Browser\n                else if (m_character != null)\n                    settings = Settings.UI.SkillCharacterDataBrowser;\n                // Data Browser\n                else\n                    settings = Settings.UI.SkillDataBrowser;\n\n                cbShowNonPublic.Checked = settings.ShowNonPublicSkills;\n\n                cbSkillFilter.SelectedItem =\n                    cbSkillFilter.Items.Contains(settings.Filter.GetDescription())\n                        ? settings.Filter.GetDescription()\n                        : SkillFilter.All.GetDescription();\n\n                cbFilterByAttributes.SelectedIndex = settings.FilterByAttributesIndex;\n                cbSorting.SelectedItem =\n                    cbSorting.Items.Contains(settings.Sort.GetDescription())\n                        ? settings.Sort.GetDescription()\n                        : SkillSort.None.GetDescription();\n\n                tbSearchText.Text = settings.TextSearch;\n                lbSearchTextHint.Visible = string.IsNullOrEmpty(tbSearchText.Text);\n\n                return;\n            }\n\n            cbShowNonPublic.Checked = false;\n            cbSkillFilter.SelectedItem = SkillFilter.All.GetDescription();\n            cbFilterByAttributes.SelectedIndex = 0;\n            cbSorting.SelectedItem = SkillSort.None.GetDescription();\n        }\n\n        /// <summary>\n        /// Occurs when the control visibility changed.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\" /> that contains the event data.</param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (!Visible)\n                return;\n\n            UpdateSearchTextHintVisibility();\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            Disposed -= OnDisposed;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n        }\n\n        /// <summary>\n        /// When the settings are changed, update the display\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateControlVisibility();\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Called whenever the selection changes,\n        /// fires the approriate event.\n        /// </summary>\n        private void OnSelectionChanged()\n        {\n            if (HostedInSkillBrowser)\n            {\n                SelectedSkillChanged?.ThreadSafeInvoke(this, new EventArgs());\n                return;\n            }\n\n            // Set the selected skill in plan editor's skill selector\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            planWindow?.SetSkillBrowserSkillSelectorSelectedSkill(m_selectedSkill);\n        }\n\n        /// <summary>\n        /// Updates the control visibility.\n        /// </summary>\n        private void UpdateControlVisibility()\n        {\n            pbSearchImage.Visible = !Settings.UI.SafeForWork;\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Updates the item from the provided selection.\n        /// </summary>\n        /// <param name=\"selection\">The selection</param>\n        private void UpdateSelection(object selection)\n        {\n            if (!m_blockSelectionReentrancy)\n                SelectedSkill = selection as Skill;\n        }\n\n        /// <summary>\n        /// Updates the search text hint visibility.\n        /// </summary>\n        private void UpdateSearchTextHintVisibility()\n        {\n            lbSearchTextHint.Visible = !tbSearchText.Focused && string.IsNullOrEmpty(tbSearchText.Text);\n        }\n\n        /// <summary>\n        /// Gets the attributes combinations.\n        /// </summary>\n        /// <returns></returns>\n        /// <remarks> \n        /// This complex LINQ expression ensures the automatic catch of all present attributes combinations \n        /// and the ones that CCP may introduce in the future\n        /// </remarks>\n        private static IEnumerable<object> GetAttributesCombinations()\n            => EnumExtensions.GetValues<EveAttribute>()\n                .Where(attribute => attribute != EveAttribute.None)\n                .OrderBy(attribute => attribute)\n                .SelectMany(primaryAttribute => StaticSkills.AllSkills\n                    .Where(staticSkill => staticSkill.PrimaryAttribute == primaryAttribute)\n                    .Select(staticSkill => staticSkill.SecondaryAttribute)\n                    .Distinct()\n                    .OrderBy(secondaryAttribute => secondaryAttribute)\n                    .Select(secondaryAttribute => $\"{primaryAttribute} - {secondaryAttribute}\"));\n\n        #endregion\n\n\n        #region Icon set\n\n        /// <summary>\n        /// Gets the icon set for the given index, using the given list for missing icons.\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        private ImageList GetIconSet(int index)\n        {\n            string groupname = string.Empty;\n\n            if (index > 0 && index < IconSettings.Default.Properties.Count)\n            {\n                SettingsProperty settingsProperty = IconSettings.Default.Properties[\"Group\" + index];\n                if (settingsProperty != null)\n                    groupname = settingsProperty.DefaultValue.ToString();\n            }\n\n            string groupDirectory = $\"{AppDomain.CurrentDomain.BaseDirectory}Resources\\\\Skill_Select\\\\Group\";\n            string defaultResourcesPath = $\"{groupDirectory}0\\\\Default.resources\";\n            string groupResourcesPath = $\"{groupDirectory}{index}\\\\{groupname}.resources\";\n\n            if (!File.Exists(defaultResourcesPath) ||\n                (!string.IsNullOrEmpty(groupname) && !File.Exists(groupResourcesPath)))\n            {\n                groupname = string.Empty;\n            }\n\n            return string.IsNullOrEmpty(groupname) ? ilSkillIcons : GetIconSet(defaultResourcesPath, groupResourcesPath);\n        }\n\n        /// <summary>\n        /// Gets the icon set for the given index, using the given list for missing icons.\n        /// </summary>\n        /// <param name=\"defaultResourcesPath\">The default resources path.</param>\n        /// <param name=\"groupResourcesPath\">The group resources path.</param>\n        /// <returns></returns>\n        private static ImageList GetIconSet(string defaultResourcesPath, string groupResourcesPath)\n        {\n            ImageList imageList;\n            ImageList tempImageList = null;\n            try\n            {\n                tempImageList = new ImageList();\n                IDictionaryEnumerator basicx;\n                IResourceReader defaultGroupReader = null;\n                tempImageList.ColorDepth = ColorDepth.Depth32Bit;\n\n                try\n                {\n                    defaultGroupReader = new ResourceReader(defaultResourcesPath);\n\n                    basicx = defaultGroupReader.GetEnumerator();\n\n                    while (basicx.MoveNext())\n                    {\n                        tempImageList.Images.Add(basicx.Key.ToString(), (Icon)basicx.Value);\n                    }\n                }\n                finally\n                {\n                    defaultGroupReader?.Close();\n                }\n\n                IResourceReader groupReader = null;\n                try\n                {\n                    groupReader = new ResourceReader(groupResourcesPath);\n\n                    basicx = groupReader.GetEnumerator();\n\n                    while (basicx.MoveNext())\n                    {\n                        if (tempImageList.Images.ContainsKey(basicx.Key.ToString()))\n                            tempImageList.Images.RemoveByKey(basicx.Key.ToString());\n\n                        tempImageList.Images.Add(basicx.Key.ToString(), (Icon)basicx.Value);\n                    }\n                }\n                finally\n                {\n                    groupReader?.Close();\n                }\n\n                imageList = tempImageList;\n                tempImageList = null;\n            }\n            finally\n            {\n                tempImageList?.Dispose();\n            }\n\n            return imageList;\n        }\n\n        #endregion\n\n\n        #region Content creation and update\n\n        /// <summary>\n        /// Updates the skills list content.\n        /// </summary>\n        internal void UpdateContent()\n        {\n            IList<Skill> skills = GetFilteredData().ToList();\n\n            tvItems.Hide();\n            lbSearchList.Hide();\n            lvSortedSkillList.Hide();\n            lbNoMatches.Hide();\n\n            // Nothing to display ?\n            if (!skills.Any())\n            {\n                lbNoMatches.Show();\n                UpdateSelection(null);\n                return;\n            }\n\n            // Is it sorted ?\n            if (cbSorting.SelectedIndex > 0)\n            {\n                lvSortedSkillList.Show();\n                UpdateListView(skills);\n                return;\n            }\n\n            // Not sorted but there is a text filter\n            if (!string.IsNullOrEmpty(tbSearchText.Text))\n            {\n                lbSearchList.Show();\n                UpdateListBox(skills);\n                return;\n            }\n\n            // Regular display, the tree\n            tvItems.Show();\n            UpdateTree(skills);\n        }\n\n        /// <summary>\n        /// Gets the filtered skills.\n        /// </summary>\n        /// <returns></returns>\n        private IEnumerable<Skill> GetFilteredData()\n        {\n            IEnumerable<Skill> skills = m_character?.Skills ?? SkillCollection.Skills;\n\n            // Non-public skills\n            if (!cbShowNonPublic.Checked)\n                skills = skills.Where(skill => skill.IsPublic);\n\n            // Filter\n            Func<Skill, bool> predicate = GetFilter();\n            skills = skills.Where(predicate);\n\n            // Text search\n            if (!string.IsNullOrEmpty(tbSearchText.Text))\n            {\n                skills = skills\n                    .Where(skill => skill.Name.Contains(tbSearchText.Text, ignoreCase: true)\n                                    || skill.Description.Contains(tbSearchText.Text, ignoreCase: true));\n            }\n\n            // When sorting by \"time to...\", remove lv5 skills\n            if ((string)cbSorting.SelectedItem == SkillSort.TimeToLevel5.GetDescription() || \n                (string)cbSorting.SelectedItem == SkillSort.TimeToNextLevel.GetDescription())\n            {\n                skills = skills.Where(skill => skill.Level < 5);\n            }\n\n            return skills;\n        }\n\n        /// <summary>\n        /// Gets the skill predicate for the selected combo filter index.\n        /// </summary>\n        /// <returns></returns>\n        private Func<Skill, bool> GetFilter()\n        {\n            var skillFilter = (SkillFilter)(EnumExtensions.GetValueFromDescription<\n                SkillFilter>((string)cbSkillFilter.SelectedItem) ?? SkillFilter.All);\n\n            lblFilterBy.Enabled = cbFilterByAttributes.Enabled = (skillFilter ==\n                SkillFilter.ByAttributes);\n\n            EveAttribute primary = EveAttribute.None;\n            EveAttribute secondary = EveAttribute.None;\n            if (cbFilterByAttributes.Enabled)\n            {\n                string[] attributes = cbFilterByAttributes.SelectedItem.ToString().Split('-');\n                Enum.TryParse(attributes.First().Trim(), out primary);\n                Enum.TryParse(attributes.Last().Trim(), out secondary);\n            }\n\n            switch (skillFilter)\n            {\n                default:\n                    return x => true;\n                case SkillFilter.ByAttributes:\n                    return x => x.PrimaryAttribute == primary && x.SecondaryAttribute == secondary;\n                case SkillFilter.Known:\n                    return x => x.IsKnown;\n                case SkillFilter.AlphaFriendly:\n                    return x => x.StaticData.AlphaFriendly;\n                case SkillFilter.Unknown:\n                    return x => !x.IsKnown;\n                case SkillFilter.UnknownAndNotOwned:\n                    return x => !x.IsKnown && !x.IsOwned;\n                case SkillFilter.UnknownButOwned:\n                    return x => !x.IsKnown && x.IsOwned;\n                case SkillFilter.UnknownButTrainable:\n                    return x => !x.IsKnown && x.ArePrerequisitesMet;\n                case SkillFilter.UnknownAndNotTrainable:\n                    return x => !x.IsKnown && !x.ArePrerequisitesMet;\n                case SkillFilter.Planned:\n                    return x => m_plan.IsPlanned(x);\n                case SkillFilter.Lv1Ready:\n                    return x => x.Level == 0 && x.ArePrerequisitesMet && !x.IsPartiallyTrained;\n                case SkillFilter.Trainable:\n                    return x => x.ArePrerequisitesMet && x.Level < 5;\n                case SkillFilter.PartiallyTrained:\n                    return x => x.IsPartiallyTrained;\n                case SkillFilter.NotPlanned:\n                    return x => !(m_plan.IsPlanned(x) || x.Level == 5);\n                case SkillFilter.NotPlannedButTrainable:\n                    return x => !m_plan.IsPlanned(x) && x.ArePrerequisitesMet && x.Level < 5;\n                case SkillFilter.NoLv5:\n                    return x => x.Level < 5;\n            }\n        }\n\n        /// <summary>\n        /// Updates the skills tree.\n        /// </summary>\n        private void UpdateTree(IEnumerable<Skill> skills)\n        {\n            // Store the selected node (if any) to restore it after the update\n            int selectedItemHash = tvItems.SelectedNode?.Tag?.GetHashCode() ?? 0;\n\n            // Update the image list choice\n            int iconGroupIndex = Settings.UI.SkillBrowser.IconsGroupIndex;\n            if (iconGroupIndex == 0)\n                iconGroupIndex = 1;\n\n            // Special case when displaying the planner as EVE data browser\n            tvItems.ImageList = m_character == null && !Settings.UI.SafeForWork\n                ? GetIconSet(0)\n                : GetIconSet(iconGroupIndex);\n\n            // Rebuild the nodes\n            int numberOfItems = 0;\n            tvItems.BeginUpdate();\n            try\n            {\n                tvItems.Nodes.Clear();\n\n                numberOfItems = AddNodes(skills, numberOfItems);\n\n                TreeNode selectedNode = null;\n\n                // Restore the selected node (if any)\n                if (selectedItemHash > 0)\n                {\n                    foreach (TreeNode node in tvItems.GetAllNodes()\n                        .Where(node => node.Tag.GetHashCode() == selectedItemHash))\n                    {\n                        tvItems.SelectNodeWithTag(node.Tag);\n                        selectedNode = node;\n                    }\n                }\n\n                if (selectedNode != null)\n                    return;\n\n                // Reset if the node doesn't exist anymore\n                tvItems.SelectNodeWithTag(null);\n                UpdateSelection(null);\n            }\n            finally\n            {\n                tvItems.EndUpdate();\n                m_allExpanded = false;\n\n                // If the filtered set is small enough to fit all nodes on screen, call expandAll()\n                if (numberOfItems < tvItems.DisplayRectangle.Height / tvItems.ItemHeight)\n                {\n                    tvItems.ExpandAll();\n                    m_allExpanded = true;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Adds the nodes.\n        /// </summary>\n        /// <param name=\"skills\">The skills.</param>\n        /// <param name=\"numberOfItems\">The number of items.</param>\n        /// <returns></returns>\n        private int AddNodes(IEnumerable<Skill> skills, int numberOfItems)\n        {\n            string key = Settings.UI.SafeForWork\n                ? \"book_old\"\n                : m_character == null\n                    ? \"Skills\"\n                    : \"book\";\n\n            int groupImageIndex =  tvItems.ImageList.Images.IndexOfKey(key);\n\n            // When we display the skill browser as EVE data browser\n            int dataBrowserSkillImageIndex = Settings.UI.SafeForWork\n                ? groupImageIndex\n                : tvItems.ImageList.Images.IndexOfKey(\"Skill\");\n\n            foreach (IGrouping<SkillGroup, Skill> group in skills.GroupBy(x => x.Group).OrderBy(x => x.Key.Name))\n            {\n                TreeNode groupNode = new TreeNode\n                {\n                    Text = group.Key.Name,\n                    ImageIndex = groupImageIndex,\n                    SelectedImageIndex = groupImageIndex,\n                    Tag = group.Key\n                };\n\n                // Add nodes for skills in this group\n                foreach (Skill skill in group)\n                {\n                    int imageIndex;\n                    if (m_character != null)\n                    {\n                        // Choose image index\n                        if (skill.Level != 0)\n                            imageIndex = tvItems.ImageList.Images.IndexOfKey(\"lvl\" + skill.Level);\n                        else if (skill.IsKnown)\n                            imageIndex = tvItems.ImageList.Images.IndexOfKey(\"lvl0\");\n                        else if (skill.IsOwned)\n                            imageIndex = tvItems.ImageList.Images.IndexOfKey(\"book\");\n                        else if (skill.ArePrerequisitesMet)\n                            imageIndex = tvItems.ImageList.Images.IndexOfKey(\"PrereqsMet\");\n                        else\n                            imageIndex = tvItems.ImageList.Images.IndexOfKey(\"PrereqsNOTMet\");\n                    }\n                    else\n                        imageIndex = dataBrowserSkillImageIndex;\n                    \n                    // Create node and adds it\n                    TreeNode node = new TreeNode\n                    {\n                        Text = $\"{skill.Name} ({skill.Rank})\",\n                        ImageIndex = imageIndex,\n                        SelectedImageIndex = imageIndex,\n                        Tag = skill\n                    };\n\n                    // We color some nodes\n                    if (!skill.IsPublic && Settings.UI.SkillBrowser.ShowNonPublicSkills)\n                        node.ForeColor = Color.DarkRed;\n\n                    if (skill.IsPartiallyTrained && Settings.UI.PlanWindow.HighlightPartialSkills)\n                        node.ForeColor = Color.Green;\n\n                    if (skill.IsQueued && !skill.IsTraining && Settings.UI.PlanWindow.HighlightQueuedSkills)\n                        node.ForeColor = Color.RoyalBlue;\n\n                    if (skill.IsTraining)\n                    {\n                        node.BackColor = Color.LightSteelBlue;\n                        node.ForeColor = Color.Black;\n                    }\n\n                    groupNode.Nodes.Add(node);\n                    numberOfItems++;\n                }\n\n                // Add group when not empty\n                tvItems.Nodes.Add(groupNode);\n            }\n            return numberOfItems;\n        }\n\n        /// <summary>\n        /// Updates the list box displayed when there is a text filter and no sort criteria.\n        /// </summary>\n        /// <param name=\"skills\"></param>\n        private void UpdateListBox(IEnumerable<Skill> skills)\n        {\n            // Store the selected node (if any) to restore it after the update\n            int selectedItemHash = tvItems.SelectedNode?.Tag?.GetHashCode() ?? 0;\n\n            lbSearchList.BeginUpdate();\n            try\n            {\n                lbSearchList.Items.Clear();\n                foreach (Skill skill in skills)\n                {\n                    lbSearchList.Items.Add(skill);\n\n                    // Restore the selected node (if any)\n                    if (selectedItemHash > 0 && skill.GetHashCode() == selectedItemHash)\n                        lbSearchList.SelectedItem = skill;\n                }\n            }\n            finally\n            {\n                lbSearchList.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Updates the listview displayed when there is a sort criteria.\n        /// </summary>\n        /// <param name=\"skills\"></param>\n        private void UpdateListView(IList<Skill> skills)\n        {\n            // Store the selected node (if any) to restore it after the update\n            int selectedItemHash = tvItems.SelectedNode?.Tag?.GetHashCode() ?? 0;\n\n            // Retrieve the data to fetch into the list\n            IEnumerable<string> labels = null;\n            string column = GetSortedListData(ref skills, ref labels);\n            if (labels == null)\n                return;\n\n            // Update the listview\n            lvSortedSkillList.BeginUpdate();\n            try\n            {\n                lvSortedSkillList.Items.Clear();\n\n                using (IEnumerator<string> labelsEnumerator = labels.GetEnumerator())\n                {\n                    foreach (Skill skill in skills)\n                    {\n                        // Retrieves the label for the second column (sort key)\n                        labelsEnumerator.MoveNext();\n                        string label = labelsEnumerator.Current;\n\n                        // Creates the item and adds it\n                        ListViewItem lvi = new ListViewItem(skill.Name);\n                        lvi.SubItems.Add(label);\n                        lvi.Tag = skill;\n\n                        lvSortedSkillList.Items.Add(lvi);\n\n                        // Restore the selected node (if any)\n                        if (selectedItemHash > 0 && skill.GetHashCode() == selectedItemHash)\n                            lvi.Selected = true;\n                    }\n                }\n\n                // Auto adjust column widths\n                chSortKey.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);\n                chName.Width = lvSortedSkillList.ClientSize.Width - chSortKey.Width;\n                chSortKey.Text = column;\n            }\n            finally\n            {\n                lvSortedSkillList.EndUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Gets the data for the sorted list view.\n        /// </summary>\n        /// <param name=\"skills\"></param>\n        /// <param name=\"labels\"></param>\n        /// <returns></returns>\n        private string GetSortedListData(ref IList<Skill> skills, ref IEnumerable<string> labels)\n        {\n            SkillSort skillSort =\n                (SkillSort)\n                    (EnumExtensions.GetValueFromDescription<SkillSort>((string)cbSorting.SelectedItem) ??\n                     SkillSort.None);\n\n            switch (skillSort)\n            {\n                // Sort by name, default, occurs on initialization\n                default:\n                    return string.Empty;\n\n                // Time to next level\n                case SkillSort.TimeToNextLevel:\n                    IEnumerable<TimeSpan> times = skills\n                        .Select(x => m_character.GetTrainingTimeToMultipleSkills(x.Prerequisites)\n                            .Add(x.GetLeftTrainingTimeToNextLevel));\n\n                    TimeSpan[] timesArray = times.ToArray();\n                    Skill[] skillsArray = skills.ToArray();\n                    Array.Sort(timesArray, skillsArray);\n\n                    string[] labelsArray = new string[skillsArray.Length];\n                    for (int i = 0; i < labelsArray.Length; i++)\n                    {\n                        TimeSpan time = timesArray[i];\n                        labelsArray[i] = time == TimeSpan.Zero\n                            ? \"-\"\n                            : $\"{Skill.GetRomanFromInt(skillsArray[i].Level + 1)}: \" +\n                              $\"{time.ToDescriptiveText(DescriptiveTextOptions.None)}\";\n                    }\n\n                    skills = skillsArray;\n                    labels = labelsArray;\n\n                    return \"Time\";\n\n                // Time to level 5\n                case SkillSort.TimeToLevel5:\n                    times = skills.\n                        Select(x => m_character.GetTrainingTimeToMultipleSkills(x.Prerequisites)\n                        .Add(x.GetLeftTrainingTimeToLevel(5)));\n\n                    timesArray = times.ToArray();\n                    skillsArray = skills.ToArray();\n                    Array.Sort(timesArray, skillsArray);\n\n                    labelsArray = new string[skillsArray.Length];\n                    for (int i = 0; i < labelsArray.Length; i++)\n                    {\n                        TimeSpan time = timesArray[i];\n                        labelsArray[i] = time == TimeSpan.Zero\n                            ? \"-\"\n                            : time.ToDescriptiveText(DescriptiveTextOptions.None);\n                    }\n\n                    skills = skillsArray;\n                    labels = labelsArray;\n\n                    return \"Time to Max Level\";\n\n                // Skill rank\n                case SkillSort.Rank:\n                    skills = skills.OrderBy(x => x.Rank).ToList();\n                    labels = skills.Select(x => x.Rank.ToString(CultureConstants.DefaultCulture));\n                    return \"Rank\";\n\n                // Skill SP/hour\n                case SkillSort.SPPerHour:\n                    skills = skills.OrderByDescending(x => x.SkillPointsPerHour).ToList();\n                    labels = skills.Select(x => x.SkillPointsPerHour.ToString(CultureConstants.DefaultCulture));\n                    return \"SP/hour\";\n            }\n        }\n\n        #endregion\n\n\n        #region Control Events\n\n        /// <summary>\n        /// When the user click the text search hint, he actually wants to select the text box.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lblSearchTextHint_Click(object sender, EventArgs e)\n        {\n            tbSearchText.Focus();\n        }\n\n        /// <summary>\n        /// When the user begins to write in the text box, we don't want to bother him with the text search hint.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tbSearch_Enter(object sender, EventArgs e)\n        {\n            lbSearchTextHint.Visible = false;\n        }\n\n        /// <summary>\n        /// When the user leaves the text box, we display the text search hint if the box is empty.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tbSearch_Leave(object sender, EventArgs e)\n        {\n            UpdateSearchTextHintVisibility();\n        }\n\n        /// <summary>\n        /// When the search text box changes, we update the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tbSearch_TextChanged(object sender, EventArgs e)\n        {\n            if (!m_init)\n                return;\n\n            UpdateContent();\n\n            SkillBrowserSettings settings;\n\n            // Skill Planner\n            if (m_plan != null)\n                settings = Settings.UI.SkillBrowser;\n            // Character associated Data Browser\n            else if (m_character != null)\n                settings = Settings.UI.SkillCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.SkillDataBrowser;\n\n            settings.TextSearch = tbSearchText.Text;\n        }\n\n        /// <summary>\n        /// When the selection of the listbox changes, updates the control's selection and fires the event.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lbSearchList_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            UpdateSelection(lbSearchList.SelectedItem);\n        }\n\n        /// <summary>\n        /// When the selection of the tree changes, updates the control's selection and fires the event.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tvSkillList_AfterSelect(object sender, TreeViewEventArgs e)\n        {\n            UpdateSelection(e.Node?.Tag);\n        }\n\n        /// <summary>\n        /// When the selection of the listview changes, updates the control's selection and fires the event.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void lvSortedSkillList_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            UpdateSelection(lvSortedSkillList.SelectedItems.Cast<ListViewItem>().FirstOrDefault()?.Tag);\n        }\n\n        /// <summary>\n        /// When the \"show non public\" checkbox is checked, we update settings and the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbShowNonPublic_CheckedChanged(object sender, EventArgs e)\n        {\n            if (!m_init)\n                return;\n\n            UpdateContent();\n\n            SkillBrowserSettings settings;\n\n            // Skill Planner\n            if (m_plan != null)\n                settings = Settings.UI.SkillBrowser;\n            // Character associated Data Browser\n            else if (m_character != null)\n                settings = Settings.UI.SkillCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.SkillDataBrowser;\n\n            settings.ShowNonPublicSkills = cbShowNonPublic.Checked;\n        }\n\n        /// <summary>\n        /// When the sorting combo box changes, we update settings and the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbSorting_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (!m_init)\n                return;\n\n            UpdateContent();\n            lvSortedSkillList.Focus();\n\n            SkillBrowserSettings settings;\n\n            // Skill Planner\n            if (m_plan != null)\n                settings = Settings.UI.SkillBrowser;\n            // Character associated Data Browser\n            else if (m_character != null)\n                settings = Settings.UI.SkillCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.SkillDataBrowser;\n\n            settings.Sort =\n                    (SkillSort)\n                        (EnumExtensions.GetValueFromDescription<SkillSort>((string)cbSorting.SelectedItem) ??\n                         SkillSort.None);\n        }\n\n        /// <summary>\n        /// When the filter by attributes combo box changes, we update settings and the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbFilterByAttributes_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (!m_init)\n                return;\n\n            UpdateContent();\n\n            SkillBrowserSettings settings;\n\n            // Skill Planner\n            if (m_plan != null)\n                settings = Settings.UI.SkillBrowser;\n            // Character associated Data Browser\n            else if (m_character != null)\n                settings = Settings.UI.SkillBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.SkillDataBrowser;\n\n            settings.FilterByAttributesIndex = cbFilterByAttributes.SelectedIndex;\n        }\n\n        /// <summary>\n        /// When the filter combo box changes, we update the settings and the content.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cbSkillFilter_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            if (!m_init)\n                return;\n\n            UpdateContent();\n\n            SkillBrowserSettings settings;\n\n            // Skill Planner\n            if (m_plan != null)\n                settings = Settings.UI.SkillBrowser;\n            // Character associated Data Browser\n            else if (m_character != null)\n                settings = Settings.UI.SkillCharacterDataBrowser;\n            // Data Browser\n            else\n                settings = Settings.UI.SkillDataBrowser;\n\n            settings.Filter =\n                (SkillFilter)\n                    (EnumExtensions.GetValueFromDescription<SkillFilter>((string)cbSkillFilter.SelectedItem) ??\n                     SkillFilter.All);\n        }\n\n        /// <summary>\n        /// When the user clicks the search text box, we select the whole text.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tbSearch_KeyPress(object sender, KeyPressEventArgs e)\n        {\n            // (Ctrl + A) has KeyChar value 1\n            if (e.KeyChar != (char)Keys.LButton)\n                return;\n\n            tbSearchText.SelectAll();\n            e.Handled = true;\n        }\n\n        /// <summary>\n        /// Changes the selection when you right click on a search.\n        /// </summary>\n        /// <param name=\"sender\">is lbSearchList</param>\n        /// <param name=\"e\"></param>\n        private void lbSearchList_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lbSearchList.SelectedIndex = lbSearchList.IndexFromPoint(e.Location);\n            lbSearchList.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lbSearchList_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lbSearchList.Cursor = lbSearchList.IndexFromPoint(e.Location) > -1\n                ? CustomCursors.ContextMenu\n                : Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void lvSortedSkillList_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            lvSortedSkillList.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void lvSortedSkillList_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            lvSortedSkillList.Cursor = lvSortedSkillList.GetItemAt(e.X, e.Y) != null\n                ? CustomCursors.ContextMenu\n                : Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse gets pressed, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void tvItems_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (e.Button != MouseButtons.Right)\n                return;\n\n            tvItems.Cursor = Cursors.Default;\n        }\n\n        /// <summary>\n        /// When the mouse moves over the list, we change the cursor.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        private void tvItems_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            tvItems.Cursor = CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// When the user begins dragging a skill from the treeview, we start a drag'n drop operation.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tvItems_ItemDrag(object sender, ItemDragEventArgs e)\n        {\n            TreeNode node = tvItems.SelectedNode;\n\n            if (node?.Nodes.Count != 0)\n                return;\n\n            Skill skill = node.Tag as Skill;\n            if (skill == null || m_plan == null || m_plan.GetPlannedLevel(skill) == 5 || skill.Level == 5)\n                return;\n\n            DoDragDrop(node, DragDropEffects.Move);\n        }\n\n        /// <summary>\n        /// Handles the MouseUp event of the pbSearchTextDel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void pbSearchTextDel_MouseUp(object sender, MouseEventArgs e)\n        {\n            tbSearchText.Clear();\n            UpdateSearchTextHintVisibility();\n        }\n\n        #endregion\n\n\n        #region Context menu\n\n        /// <summary>\n        /// When the tree's context menu opens, we update the submenus' statuses.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmSkills_Opening(object sender, CancelEventArgs e)\n        {\n            ContextMenuStrip contextMenu = sender as ContextMenuStrip;\n\n            e.Cancel = contextMenu?.SourceControl == null || (!contextMenu.SourceControl.Visible && m_selectedSkill == null);\n\n            if (e.Cancel || contextMenu?.SourceControl == null)\n                return;\n\n            contextMenu.SourceControl.Cursor = Cursors.Default;\n\n            Skill skill = null;\n            TreeNode node = tvItems.SelectedNode;\n            if (node != null)\n                skill = node.Tag as Skill;\n\n            if (m_selectedSkill == null && skill != null)\n                node = null;\n\n            cmiPlanToLevel.Visible = planToMenuSkillSeparator.Visible = m_plan != null && m_selectedSkill != null;\n\n            // \"Show in skill browser/explorer\"\n            showInSkillExplorerMenu.Visible = m_selectedSkill != null;\n            showInSkillBrowserMenu.Visible = m_selectedSkill != null && !HostedInSkillBrowser;\n\n            // \"Collapse\" and \"Expand\" menus\n            cmiCollapseSelected.Visible = m_selectedSkill == null && node != null && node.IsExpanded;\n            cmiExpandSelected.Visible = m_selectedSkill == null && node != null && !node.IsExpanded;\n\n            cmiExpandSelected.Text = m_selectedSkill == null && node != null && !node.IsExpanded\n                ? $\"Expand \\\"{node.Text}\\\"\"\n                : string.Empty;\n            cmiCollapseSelected.Text = m_selectedSkill == null && node != null && node.IsExpanded\n                ? $\"Collapse \\\"{node.Text}\\\"\"\n                : string.Empty;\n\n            expandCollapseSeparator.Visible = node != null;\n\n            // \"Expand All\" and \"Collapse All\" menus\n            cmiCollapseAll.Enabled = cmiCollapseAll.Visible = m_allExpanded;\n            cmiExpandAll.Enabled = cmiExpandAll.Visible = !cmiCollapseAll.Enabled;\n\n            // \"Plan to N\" menus\n            if (m_selectedSkill == null || m_plan == null)\n                return;\n\n            cmiPlanToLevel.Enabled = false;\n            for (int i = 0; i <= 5; i++)\n            {\n                cmiPlanToLevel.Enabled |= m_plan.UpdatesRegularPlanToMenu(cmiPlanToLevel.DropDownItems[i], m_selectedSkill, i);\n            }\n        }\n\n        /// <summary>\n        /// When the list's context menu opens, we update the menus status.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmListSkills_Opening(object sender, CancelEventArgs e)\n        {\n            cmiLvPlanTo.Visible = planToMenuSkillListSeparator.Visible = m_plan != null && m_selectedSkill != null;\n\n            // \"Show in skill browser\"\n            showInSkillBrowserListMenu.Visible = !HostedInSkillBrowser;\n\n            // \"Plan to N\" menus\n            if (m_selectedSkill == null || m_plan == null)\n                return;\n\n            for (int i = 0; i <= 5; i++)\n            {\n                m_plan.UpdatesRegularPlanToMenu(cmiLvPlanTo.DropDownItems[i], m_selectedSkill, i);\n            }\n        }\n\n        /// <summary>\n        /// Listview, listbox, and tree view contexts menu > Plan to > Plan to N.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void planToLevelMenuItem_Click(object sender, EventArgs e)\n        {\n            ToolStripMenuItem levelItem = (ToolStripMenuItem)sender;\n            IPlanOperation operation = levelItem.Tag as IPlanOperation;\n            if (operation == null)\n                return;\n\n            PlanWindow planWindow = ParentForm as PlanWindow;\n            if (planWindow == null)\n                return;\n\n            PlanHelper.SelectPerform(new PlanToOperationWindow(operation), planWindow, operation);\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiCollapseSelected_Click(object sender, EventArgs e)\n        {\n            tvItems.SelectedNode.Collapse();\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiExpandSelected_Click(object sender, EventArgs e)\n        {\n            tvItems.SelectedNode.Expand();\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Expand all.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiExpandAll_Click(object sender, EventArgs e)\n        {\n            tvItems.ExpandAll();\n            m_allExpanded = true;\n        }\n\n        /// <summary>\n        /// Treeview's context menu > Collapse all.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void cmiCollapseAll_Click(object sender, EventArgs e)\n        {\n            tvItems.CollapseAll();\n            m_allExpanded = false;\n        }\n\n        /// <summary>\n        /// Context menu > Show In Skill Browser.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInSkillBrowserMenu_Click(object sender, EventArgs e)\n        {\n            // Open the skill browser\n            PlanWindow.ShowPlanWindow(m_character, m_plan).ShowSkillInBrowser(m_selectedSkill);\n        }\n\n        /// <summary>\n        /// Context menu > Show In Skill Explorer.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void showInSkillExplorerMenu_Click(object sender, EventArgs e)\n        {\n            // Open the skill explorer\n            SkillExplorerWindow.ShowSkillExplorerWindow(m_character, m_plan).ShowSkillInExplorer(m_selectedSkill);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SkillSelectControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"pbSearchImage.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsMAAALDAE/QCLIAAACLklE\n        QVQ4T82TX0hTURzHV2B/QCGksIegArEMCveQMmbYQ1gucoTZZD2MGvjiHqa0ae1218Pc5W5Luy4NiuaY\n        FZWWNlg2UUQcFcZABkUFtlxlw4VOKmva+nbONZfKHoReevie8/t9z+/3OYcfHAmAf9KyxNY+FK7lvZOF\n        lU1jK/zBdD7VskSudnbOfE0gU2qIbJExa6lH96X+0nqqVEBvOS/0QllzAwVKO/YorDHqC7cCSOcvKhWY\n        2/rwIzGPh8NvYRCGsfNQIzbsM65Z9L2BMDjPKHJLraR8BaCh2ZdtbvVDy3ahrPo69iodkKuvoLCq7Y3W\n        dAd63gtVXQd2KzgCtkB74V52CkCensG0+DEZ/474bBKBF3FozD7kHeGwab9pxHjJS+qAL7PzGApN4aTx\n        PnIPc9RKAUx1fA818DT0CXbPcxzT3UZOMQvS3EABodcTCL76DN49gkpjF7bKGZx1+FgRYHcNTOsae1Be\n        0w5phYD8Mg55pRbkyBj6grCee7BwdoKcHbVh2wEGm4vqUaS6nBAB1msDSCZ/YTz6DY+ffYDFFcSOgxT+\n        d1Bn2E58jM4gHImhe3AMOr4f+YqFYUpMwiPMzf0kze/h6AhCc9H/nwFI80YKiExMo+/JOzjvjqLC0I1d\n        ZFYi4PQ590t1/U2UaFohq2qGTNWE7SVslEAy/wDWEcUU1VfHy3UuFJ9qgfS4DVkFtVMigC6rkdPTK/4N\n        smeo9O71RFk0T1u8ekHyG2jrt2s5yYVVAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"cmSkills.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <data name=\"cmiPlanToLevel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        vAAADrwBlbxySQAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAALmSURB\n        VDhPZZJLTxNhFIaJP8JEFwb1FxhHV8QLujDRhXEBRI0GNQQSFAQRUUQwBAm30nKrFFqhF3qlLdPOUCgt\n        vQJthba00JarYiSDcWHcqenr0Bk1lTc5+VbP851zvi/nTza3tlyJRMIRjcXNwXBE7w6EtNO+ec2k158p\n        m3dOTbs8pbknTh7ikeykNjaYWCIJVygMncOLftKGVg2ZVQKD9Ve3QlN/+MjRg5JYMsV8+fYdH/a+YnVn\n        F+54CnPJTczGUtD6QtB4g5nqNdE/+1T6+mO5x7MlvkiUWd/dw9LmDhZSmwisbWEmmoDKHThQnTrrj2bl\n        +Fke5WL1LzCh9W325jWYF8JQs7f9D44459FGOnBdpEwXCEfP8ygX5YybmQqvgAxGMgLj/BIMc4uZ0xwI\n        Q+qYQ82YFcXDBlzseJcu7FFkC0RmG0MvxhD/+Bmrn3Yze/CurLGjbMMWSUAfWEbzhBPlCgsud8nTRX2q\n        bIHASDNTS3EEWWA2loSHhe3sDrqsLrRbnGi3uiGw+VA1pEOaIJDsbAePcmkaMzFqTxD7Xey3LrA40KCl\n        2JmdqFVTqNNOonPCDl1TE9JFNzISHuXSbrAyZDAK6v0yeqhZVI0aMUhOo54FW9jWhaQZIpEIFEWhv7IC\n        YrG0hEe5tGhIxsQuj16MQ2L3Q+kJQUC5MOZfgsw+CdsggcgUgcbGRjyQ6NOlCssFHuXyfGScKXurQolY\n        hVKJBo+ketwVq1Etk/+Fx7oJNOhIFMpMeGxw5vMolyuve5jb3TLcH1CinIUrR02olMqgHvgH1yg0qNTZ\n        cUtG4onZdYlHueQ3CplmPQ1jIILZlXV4olEYpRwsaSVYqRJlKhrV4w7cGbXiKenJFpx7JWSKe+UoH9aj\n        jv0w6r48+OgOyLsIPGTHKJFbUKGdxrMJN+4padRR/mzBqdo25nRdB4gXApx5KQTBPpOwgcDV1h7kvRna\n        /zy4NqBBwbAJN2VsB5Z9QU7ObwjkSucBbV0TAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"showInSkillExplorerMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABh0RVh0U29m\n        dHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAAk9JREFUOE+Vkm1P0mEYxd3c+hi8cmsrDTV1VJoaJlqE\n        TygmjYCEcGACKqAiOIKUJ0WRINNQJJ/LLB9mK0oFKmO6yGbrO/heN7cT0b9NhlL93t27zn12XTsn6X+Q\n        +YUdzUFRMvH8O/yF2mThEpvUsMohSd7ySE1r9WG5X+gmxolhT1Ywb89V74mXuLj3uh5y3130hQwwhbSI\n        mNgJ2fFUjVxLYY0zDizB+xj76oJ3ZxhTu27Mfvfg2Q9vxKQL8oDQRMjjKXPR3KoVKYa2B/Dky0N4dh5h\n        4tsIpndHMbM7BuOmBtJ1gZ6Qx0Lrzc+9Pkg9HNg0wRHqhWKlEZyZanCf16BrTQF9oA3iN1wbIf9NTls6\n        LmqycFlP2a9y0tH8qhG2TSMk8/WoHqVbbz4tP/VLx5tnhQWLdcPRT0fJbE1D5zsltO/bYNjQwBjUoWO1\n        BXRH0SohicKZZar4L1jxMZKlZ9Dua4Xap4RuXY1uvxaqZSlK+wtjDOomKjo4c8x4g1TJaZBlZ3FecW6/\n        1EyFeE6AnoAOfC87YnLFynAWR0+o8dwIR+JN3IMsJTmXos481G90RjcRTHJAtxeB4SqG7KUILcsSsKcq\n        E/cgW0V288bZ6A50wfxBD9unHgx+tsC1ZcPjbTsUy424NV15cg8ymlNTslXpB7IFcfQUy0dDNBVHyArn\n        Vh/kiw2o9ZYd34M/ZLakMSPx7lEf5IFmKQS9/yqa5kUQz95B+VBJbA9OIhJvck57BumSNpuUb6CQqKbc\n        cImtIL4H/0qB4YKqyJx3JMakpJ/GeCksDt4euAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <metadata name=\"cmListSkills.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>96, 17</value>\n  </metadata>\n  <data name=\"cmiLvPlanTo.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        vAAADrwBlbxySQAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAALmSURB\n        VDhPZZJLTxNhFIaJP8JEFwb1FxhHV8QLujDRhXEBRI0GNQQSFAQRUUQwBAm30nKrFFqhF3qlLdPOUCgt\n        vQJthba00JarYiSDcWHcqenr0Bk1lTc5+VbP851zvi/nTza3tlyJRMIRjcXNwXBE7w6EtNO+ec2k158p\n        m3dOTbs8pbknTh7ikeykNjaYWCIJVygMncOLftKGVg2ZVQKD9Ve3QlN/+MjRg5JYMsV8+fYdH/a+YnVn\n        F+54CnPJTczGUtD6QtB4g5nqNdE/+1T6+mO5x7MlvkiUWd/dw9LmDhZSmwisbWEmmoDKHThQnTrrj2bl\n        +Fke5WL1LzCh9W325jWYF8JQs7f9D44459FGOnBdpEwXCEfP8ygX5YybmQqvgAxGMgLj/BIMc4uZ0xwI\n        Q+qYQ82YFcXDBlzseJcu7FFkC0RmG0MvxhD/+Bmrn3Yze/CurLGjbMMWSUAfWEbzhBPlCgsud8nTRX2q\n        bIHASDNTS3EEWWA2loSHhe3sDrqsLrRbnGi3uiGw+VA1pEOaIJDsbAePcmkaMzFqTxD7Xey3LrA40KCl\n        2JmdqFVTqNNOonPCDl1TE9JFNzISHuXSbrAyZDAK6v0yeqhZVI0aMUhOo54FW9jWhaQZIpEIFEWhv7IC\n        YrG0hEe5tGhIxsQuj16MQ2L3Q+kJQUC5MOZfgsw+CdsggcgUgcbGRjyQ6NOlCssFHuXyfGScKXurQolY\n        hVKJBo+ketwVq1Etk/+Fx7oJNOhIFMpMeGxw5vMolyuve5jb3TLcH1CinIUrR02olMqgHvgH1yg0qNTZ\n        cUtG4onZdYlHueQ3CplmPQ1jIILZlXV4olEYpRwsaSVYqRJlKhrV4w7cGbXiKenJFpx7JWSKe+UoH9aj\n        jv0w6r48+OgOyLsIPGTHKJFbUKGdxrMJN+4padRR/mzBqdo25nRdB4gXApx5KQTBPpOwgcDV1h7kvRna\n        /zy4NqBBwbAJN2VsB5Z9QU7ObwjkSucBbV0TAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"showInSkillExplorerListMenu.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABh0RVh0U29m\n        dHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAAk9JREFUOE+Vkm1P0mEYxd3c+hi8cmsrDTV1VJoaJlqE\n        TygmjYCEcGACKqAiOIKUJ0WRINNQJJ/LLB9mK0oFKmO6yGbrO/heN7cT0b9NhlL93t27zn12XTsn6X+Q\n        +YUdzUFRMvH8O/yF2mThEpvUsMohSd7ySE1r9WG5X+gmxolhT1Ywb89V74mXuLj3uh5y3130hQwwhbSI\n        mNgJ2fFUjVxLYY0zDizB+xj76oJ3ZxhTu27Mfvfg2Q9vxKQL8oDQRMjjKXPR3KoVKYa2B/Dky0N4dh5h\n        4tsIpndHMbM7BuOmBtJ1gZ6Qx0Lrzc+9Pkg9HNg0wRHqhWKlEZyZanCf16BrTQF9oA3iN1wbIf9NTls6\n        LmqycFlP2a9y0tH8qhG2TSMk8/WoHqVbbz4tP/VLx5tnhQWLdcPRT0fJbE1D5zsltO/bYNjQwBjUoWO1\n        BXRH0SohicKZZar4L1jxMZKlZ9Dua4Xap4RuXY1uvxaqZSlK+wtjDOomKjo4c8x4g1TJaZBlZ3FecW6/\n        1EyFeE6AnoAOfC87YnLFynAWR0+o8dwIR+JN3IMsJTmXos481G90RjcRTHJAtxeB4SqG7KUILcsSsKcq\n        E/cgW0V288bZ6A50wfxBD9unHgx+tsC1ZcPjbTsUy424NV15cg8ymlNTslXpB7IFcfQUy0dDNBVHyArn\n        Vh/kiw2o9ZYd34M/ZLakMSPx7lEf5IFmKQS9/yqa5kUQz95B+VBJbA9OIhJvck57BumSNpuUb6CQqKbc\n        cImtIL4H/0qB4YKqyJx3JMakpJ/GeCksDt4euAAAAABJRU5ErkJggg==\n</value>\n  </data>\n  <metadata name=\"ilSkillIcons.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>196, 16</value>\n  </metadata>\n  <data name=\"ilSkillIcons.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABW\n        FgAAAk1TRnQBSQFMAgEBCwEAAbQBAAG0AQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA\n        AwABMAMAAQEBAAEgBgABMGEABAEBAgMAAQE/AAQBAQIDAQECAwYBCAMHAQoDAQECnAADAQECAwcBCQMQ\n        ARUDEgEYAw0BEQMHAQoDAwEEAwABARwAAwEBAgMSARkDHQEpAx4BKwMuAUgDMAFNAykBPwNAAXADQgF2\n        AyMBMwMEAQVcAAGWAgoB/wGWAgoB/xgAAZYCCgH/AZYCCgH/FAADAgEDAxIBGQMnAToDLgFHAyYBOQMc\n        AScDEwEaAw0BEQMGAQgDAQECFAADDQESAVQBWAFcAc0BMAE9AUwB8QFUAVYBWAHJAUgBYwFxAfkBKQE6\n        AUwB8wFXAV0BZAHiAUYBWwFzAf8BEwEuAUgB/wNIAYcDIAEvAwEBAlQAAZYCCgH/AVoCCgH/AVoCCgH/\n        AZYCCgH/EAABlgIKAf8BWgIKAf8BWgIKAf8BlgIKAf8QAAMGAQgDIAEuA0UBfQJQAVEBrgNOAZsDRAF6\n        AzgBXAMqAUEDHQEpAw0BEQMAAQEQAANHAYIBhwGZAasB/wElAUUBYwH/AVYBcAGLAf8BSwFmAX8B/gEp\n        AU0BcAH/AWQBeAGRAf8BPgFdAX4B/gE9AWUBkAH/AU4BWAFlAeUDQwF4AxkBI1QAAZYCCgH/AVoCCgH/\n        AVoCCgH/AZYCCgH/EAABlgIKAf8BWgIKAf8BWgIKAf8BlgIKAf8QAAMKAQ0DLAFEAVgCWQHJAWsBhgGl\n        Af8BVAFqAY4B/QFQAVkBbQH1AVEBVgFkAecBUgFWAVkB0gFTAlUBtwNLAY8DOQFfAxwBJwwAAVUBVwFc\n        AdwBhAGcAbEB/wEMATABUwH/AYwBpQG3Af8BOAFbAXgB/wEyAWABjAH/AbIBvgHLAf8BLgFTAXQB/wFh\n        AZMBvAH/AX4BnQG7AfwDSwGPAzwBZwMSARhUAAGWAgoB/wGWAgoB/xgAAZYCCgH/AZYCCgH/FAADDQER\n        AzkBYAF7AYYBjwHvAVwBiAGvAf8BbwGXAbsB/wFbAXYBnAH/AWYBhAGlAf8BcwGSAbEB/wGDAZ8BvQH/\n        AXoBmAG3Af8BbQGOAa4B/wNDAXcMAAFtAXkBiwH/AWoBfwGYAf4BGgFBAWMB/wHJAdgB4AH/AScBTAFu\n        Af8BMAFdAYYB/wHVAd0B6gH/AR8BQgFlAf8BeQGxAdAB/wG3AdsB8AH/AWEBZgFqAdsDQQFzAyoBQQMB\n        AQJgAAGWAgoB/wGWAgoB/yQAAxABFgNIAYcBhgGgAboB/wFOAYIBqwH/AWUBmgHAAf8BQAFoAY8B/wFZ\n        AYoBqgH/AV4BjwGvAf8BYQGRAbAB/wFjAY8BrAH/AWsBlQGzAf8BXAFfAWABvQgAAxQBGwGwAboBxgH/\n        AU8BcQGQAf8BLgFSAXQB/wHyAfQB+gH/ATwBYQGHAf8BVwGHAa8B/wHlAfAB9QH/AS0BUwF5Af8BtQHe\n        AfEB/wG2AdgB6AH/AZEBrwHGAf8DQwF4AzABTAMHAQlcAAGWAgoB/wFaAgoB/wFaAgoB/wGWAgoB/yAA\n        AxcBIANYAbYBgwGoAccB/wF4AbQB2QH/AVwBjQG2Af8BVAGAAagB/wFpAZwBwgH/AXEBpgHMAf8BegGw\n        AdYB/wF4Aa8B1QH/AYwBwgHkAf8DQwF3CAADJAE2AcYB2QHkAf8BZAF/AZwB/gFIAWUBhwH/AdUB5wH6\n        Af8BKQFLAW4B/wFgAYgBqgH/Ac0B4QHvAf8BEAE0AVsB/wGLAcEB3AH/AZgBxgHrAf8BrAHOAeYB/wE/\n        AkABbwMuAUgDDQESXAABlgIKAf8BWgIKAf8BWgIKAf8BlgIKAf8fAAEBAyMBMwF+AYIBhQHhAXkBsQHV\n        Af8BjQHLAeAB/wFfAY0BtgH/AXUBpwHPAf8BhAG1Ad4B/wGNAcAB6QH/AZgBzQH0Af8BoQHaAv8BbAF3\n        AXkB1QMIAQsIAAM1AVcB8AH9Av8BKQFLAW0B/wFqAYYBnQH/Ac4B4QH0Af8BHAFBAWYB/wGLAaUBvAH/\n        Ac8B3QHpAf8BGAFDAWoB/wGUAckB5AH/AYkBuQHYAf8BmwG/AdsB/wM6AWEDJgE5AxQBGwMAAQFcAAGW\n        AgoB/wGWAgoB/yQAAzUBVwGzAdMB6QH/AYQBzAHpAf8BkAHEAdwB/wF5AagB0AH/AZgBywHzAf8BowHZ\n        Af0B/wGtAegC/wG1AfQC/wHHA/8DOgFhDAABTAJNAY8B6gH0AfcB/gEuAVIBdwH/AZgBrQHBAf8BxwHa\n        AegB/wElAU8BdgH/AacBvAHOAf8BpQG+AdUB/wEqAVUBgQH/AawB0QHlAf8BWgGRAcEB/wGBAacBygH/\n        AzMBUwMbASYDFAEbAwEBAkwAAZYCCgH/AZYCCgH/GAABlgIKAf8BlgIKAf8UAANKAYoBpgHSAe4B/wGx\n        AekB9gH/AY8BxAHpAf8BngHNAfIB/wG2Ae4C/wG6AfgC/wG9Af0C/wHOA/8BaAJsAcoDBAEFDAABVAFX\n        AVkBrgHPAeEB7QH+AawBvwHRAf8BegGaAbQB/wHsAfYB+wH/Ad8B6gHyAf8BcAGSAakB/wHyAf0C/wH0\n        AfgB+wH/Ab0B2QHpAf8BxwHiAfAB/gF0AaABxQH/Ay8BSgMLAQ8DCQEMAwIBA0gAAZYCCgH/AVoCCgH/\n        AVoCCgH/AZYCCgH/EAABlgIKAf8BWgIKAf8BWgIKAf8BlgIKAf8MAAMCAQMBYAJjAcMBqQHTAeQB/wG/\n        AfAB/AH/AZgB0AH2Af8BlwHOAecB/wGhAdsB6QH/AakB5AHuAf8BvQH0AfsB/wHoA/8DMwFTEAADLAFE\n        AZsBswHHAf8D+AH+Aa4BwAHQAf8BnAG0AcYB/wH8A/8B1gHfAecB/wFtAY8BqgH/AfoD/wHwAfgB+wH/\n        AbABzwHmAf8BiwGuAcwB/wMqAUEDAAEBUAABlgIKAf8BWgIKAf8BWgIKAf8BlgIKAf8QAAGWAgoB/wFa\n        AgoB/wFaAgoB/wGWAgoB/wwAAxgBIgGTAaUBrwHzAbgB4wHqAf8BuwHvAv8BsQHhAfgB/wG0AeUB8wH/\n        AcUB7wH5Af8BxwHwAfcB/wHkA/8BYQJjAb4YAAMrAUIBogGuAbkB+gP4Af4BuwHJAdUB/wGxAcMB0gX/\n        Ad8B4wHrAf8BggGeAbIB/wHrAfEB9gH+AeoB+QH7Af8BtwHRAd8B/wMvAUpYAAGWAgoB/wGWAgoB/xgA\n        AZYCCgH/AZYCCgH/EAADHAEoAbUBzAHXAfgBzAH7Av8BwgH8Av8B3AP/AfIL/wH0A/8DLQFFHAADKAE8\n        AY8BpAGzAf8B3gHmAesB/gGXAaABqAHzAYIBkwGrAfwDuQHuAXUBeAF7AdsBXwF5AYcB+gNVAaIDOgFh\n        AycBO5QAA0UBfAFXAlsBsQFWAVgBWQGsAVsCXAGzAWECYwG8A2oBxwGfAaUBrgHuA1cBqyQAAx0BKgNM\n        AZADBQEHAyQBNQMCAQMEAAMJAQy4AAMNAREDBwEKRwABAf8A/wDeAAH/Ai8C/wIvAf/0AAH/Ai8B/wHc\n        AgoB/wHcAgoC/wIvAf84AAHcAgoB/wHcAgoB/xAAAdwCCgH/AdwCCgH/ZAAB/wKBAv8CgQH/LAAB/wIv\n        Af8B3AIKAf8B3AIKAv8CLwH/NAAB3AIKAf8BlgIKAf8BlgIKAf8B3AIKAf8IAAHcAgoB/wGWAgoB/wGW\n        AgoB/wHcAgoB/1wAAf8CgQL/Ai8C/wIvAv8CgQH/LAAB/wIvAv8CLwH/OAAB3AIKAf8BlgIKAf8BlgIK\n        Af8B3AIKAf8IAAHcAgoB/wGWAgoB/wGWAgoB/wHcAgoB/ygAAf8CsQL/ArEB/ywAAf8CgQL/Ai8C/wIv\n        Av8CgQH/PAAB/wIvAv8CLwH/LAAB3AIKAf8B3AIKAf8QAAHcAgoB/wHcAgoB/ygAAf8CsQL/AoEC/wKB\n        Av8CsQH/LAAB/wKBAv8CgQH/PAAB/wIvAf8B3AIKAf8B3AIKAv8CLwH/cAAB/wKxAv8CgQL/AoEC/wKx\n        Af88AAH/AoEC/wKBAf8sAAH/Ai8B/wHcAgoB/wHcAgoC/wIvAf90AAH/ArEC/wKxAf88AAH/AoEC/wIv\n        Av8CLwL/AoEB/ywAAf8CLwL/Ai8B/ywAAdwCCgH/AdwCCgH/EAAB3AIKAf8B3AIKAf9wAAH/AoEC/wIv\n        Av8CLwL/AoEB/zwAAf8CLwL/Ai8B/xgAAdwCCgH/AZYCCgH/AZYCCgH/AdwCCgH/CAAB3AIKAf8BlgIK\n        Af8BlgIKAf8B3AIKAf9wAAH/AoEC/wKBAf88AAH/Ai8B/wHcAgoB/wHcAgoC/wIvAf8UAAHcAgoB/wGW\n        AgoB/wGWAgoB/wHcAgoB/wgAAdwCCgH/AZYCCgH/AZYCCgH/AdwCCgH/tAAB/wIvAf8B3AIKAf8B3AIK\n        Av8CLwH/GAAB3AIKAf8B3AIKAf8QAAHcAgoB/wHcAgoB/7wAAf8CLwL/Ai8B//8A/wD/AGcAA/4B/wP3\n        Af8D+AH/9AAD4AH/AoEBggH/AYYBiAGKAf8D6AH/IAACjwHpAf8CCgL/AgoC/wKPAekB/xAAAo8B6QH/\n        AgoC/wIKAv8CjwHpAf8kAAFTAdwBCgH/AVMB3AEKAf80AAFhAf8BLwH/AWEB/wEvAf84AAFoAoEB/wFU\n        AoEB/wE6AVoBgQH/A48B/wPuAf8gAAKBAe0B/wIKAv8CCgL/EAACCgL/AgoC/wKBAe0B/ygAAVMB3AEK\n        Af8BUwHcAQoB/zAAAWEB/wEvAf8BYQH/AS8B/wFhAf8BLwH/AWEB/wEvAf80AAKBAY0B/wE3AVoBgQH/\n        AYEBoQHOAf8BgAKBAf8DowH/A/UB/yAAAloB8gH/AgoC/wIKAv8IAAIKAv8CCgL/AloB8gH/KAABUwHc\n        AQoB/wFHAbkBCgH/AUcBuQEKAf8BUwHcAQoB/ygAAWEB/wEvAf8BYQH/AS8B/wFhAf8BLwH/AWEB/wEv\n        Af8BYQH/AS8B/zQAAccB0wHaAf8BJwFMAYEB/wGiAdwB/QH/AY0BowG4Af8DgQH/A8MB/wP+Af8gAAIK\n        Av8CCgL/AloB8gH/AloB8gH/AgoC/wIKAv8sAAFTAdwBCgH/AUcBuQEKAf8BRwG5AQoB/wFTAdwBCgH/\n        IAABYQH/AS8B/wFhAf8BLwH/AWEB/wEvAf8BYQH/AS8B/wQAAWEB/wEvAf8BYQH/AS8B/wFhAf8BLwH/\n        LAAD/QH/AfgB/AH+Af8BLwFYAYEB/wHbA/8BqwHFAd0B/wGHAYsBjgH/A6kB/wP5Af8kAAIKAv8CCgL/\n        AgoC/wIKAv8oAAFTAdwBCgH/AVMB3AEKAf8BRwG5AQoB/wE7AZYBCgH/ATsBlgEKAf8BRwG5AQoB/wFT\n        AdwBCgH/AVMB3AEKAf8YAAFhAf8BLwH/AWEB/wEvAf8BYQH/AS8B/wwAAWEB/wEvAf8BYQH/AS8B/ywA\n        AdkB3gHjAf8B3QHwAf0B/wEzAVoBgQH/AakB1AHrAf8BvAHdAfkB/wGLAZQBnAH/A68B/wPvAf8kAAJl\n        Ae8B/wIKAv8CCgL/AmUB7wH/IAABUwHcAQoB/wFTAdwBCgH/AUcBuQEKAf8BRwG5AQoB/wE7AZYBCgH/\n        ATsBlgEKAf8BOwGWAQoB/wE7AZYBCgH/AUcBuQEKAf8BRwG5AQoB/wFTAdwBCgH/AVMB3AEKAf8oAAFh\n        Af8BLwH/AWEB/wEvAf8BYQH/AS8B/ygAAYEBjwGiAf8B1gHmAfUB/wEkAU4BgQH/AYEBtQHZAf8BgQGa\n        AcIB/wGVAaEBrAH/A8MB/wPlAf8D/gH/IAACCgL/AgoC/wIKAv8CCgL/IAABUwHcAQoB/wFTAdwBCgH/\n        AUcBuQEKAf8BRwG5AQoB/wE7AZYBCgH/ATsBlgEKAf8BOwGWAQoB/wE7AZYBCgH/AUcBuQEKAf8BRwG5\n        AQoB/wFTAdwBCgH/AVMB3AEKAf8sAAFhAf8BLwH/AWEB/wEvAf8oAAGBAYYBoAH/AaQByQHlAf8BQgGB\n        AY0B/wG/AdwB9QH/AZsBxwHuAf8BowGzAcEB/wPaAf8D5QH/A/0B/xwAAgoC/wIKAv8CWgHyAf8CWgHy\n        Af8CCgL/AgoC/yQAAVMB3AEKAf8BUwHcAQoB/wFHAbkBCgH/ATsBlgEKAf8BOwGWAQoB/wFHAbkBCgH/\n        AVMB3AEKAf8BUwHcAQoB/zQAAWEB/wEvAf8BYQH/AS8B/wFhAf8BLwH/JAABgQGRAaYB/wHuAfwG/wGu\n        AccB3AH/AZgBwAHjAf8BpAG3AckB/wP0Af8D9wH/A/4B/xgAAloB8gH/AgoC/wIKAv8IAAIKAv8CCgL/\n        AloB8gH/KAABUwHcAQoB/wFHAbkBCgH/AUcBuQEKAf8BUwHcAQoB/0AAAWEB/wEvAf8BYQH/AS8B/ygA\n        AYQBmAGrAf8B8gH7Bv8BpgHQAe8B/wGVAaoBvgH/IAACgQHtAf8CCgL/AgoC/xAAAgoC/wIKAv8CgQHt\n        Af8kAAFTAdwBCgH/AUcBuQEKAf8BRwG5AQoB/wFTAdwBCgH/QAABYQH/AS8B/wFhAf8BLwH/AWEB/wEv\n        Af8oAAGEAZUBpgH/AdUB4gHuAf8B/gP/AYgBqAHFAf8cAAKPAekB/wIKAv8CCgL/Ao8B6QH/EAACjwHp\n        Af8CCgL/AgoC/wKPAekB/yQAAVMB3AEKAf8BUwHcAQoB/0gAAWEB/wEvAf8BYQH/AS8B/wFhAf8BLwH/\n        KAABrQG4AcMB/wP+Af8D/gH/cAABUwHcAQoB/wFTAdwBCgH/TAABYQH/AS8B/wFhAf8BLwH//wD/AAoA\n        AUIBTQE+BwABPgMAASgDAAFAAwABMAMAAQEBAAEBBQABgAEBFgAD/wEAAv8B4wH/AfgBHwIAAv8BwAE/\n        AYABDwIAAucBwAEPAYABBwIAAsMBwAEHAYABBwIAAsMBwAEDAYABAwIAAucBwAEDAYABAQIAAf4BfwHA\n        AQMBAAEBAgAB/AE/AcABAwEAAQECAAH8AT8BgAEDBAAB/gF/AcABBwQAAucBwAEHBAACwwGAAQ8BAAED\n        AgACwwGAAR8BgAEHAgAC5wGAAR8BwAEHAgAC/wHAAT8B4AG/AgAD/wE/Af8B7wIAFP8B5wf/AcMB/wHz\n        Ac8C/wH5Af8BwwH/AeEBhwL/AfAB/wHnAf8B4QGHAf4BfwHwAf8B/gF/AfMBzwH8AT8B+QH/AfwBPwL/\n        AfwBPwH/AZ8B/AE/Av8B/gF/Af8BDwH+AX8B8wHPA/8BDwH/AecB4QGHA/8BnwH/AcMB4QGHBf8BwwHz\n        Ac8F/wHnGv8B/AF/Bv8B/AE/AsMB/gF/AfwB/wH8AR8B4wHHAf4BfwH4AX8B/AEPAfEBjwH8AT8B8AF/\n        AfwBBwH4AR8B/AE/AcIBPwH4AQcB/AE/AfABDwHHAT8B+AEHAfwBPwHAAQMB/wEfAfgBAwH8AT8BwAED\n        Af8BnwH4AQMB+AEfAfABDwH/AY8B+AEDAfEBjwH8AT8B/wHPAfwBHwHjAccB/AE/Af8BxwH+AR8CwwH+\n        AX8B/wHjAf8BHwL/Af4BfwH/AfMQ/ws=\n</value>\n  </data>\n  <data name=\"pbSearchTextDel.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6\n        JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQg\n        djMuMzap5+IlAAAAUUlEQVQoU2NwdHSMCgwM3K+vry/KAAUgNkgMJMcAYqSlpf0PDw8/ApIAYRAbJAaS\n        A6uGCYBoZDbcVGRFGJIggFcBsiSIRmaDFRF0JH5vOkYBALc2UwG7hivNAAAAAElFTkSuQmCC\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SkillTreeDisplayControl.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class SkillTreeDisplayControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.tmrSkillTick = new System.Windows.Forms.Timer(this.components);\n            this.SuspendLayout();\n            // \n            // tmrSkillTick\n            // \n            this.tmrSkillTick.Interval = 1000;\n            this.tmrSkillTick.Tick += new System.EventHandler(this.tmrSkillTick_Tick);\n            // \n            // SkillTreeDisplay\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoScroll = true;\n            this.DoubleBuffered = true;\n            this.Name = \"SkillTreeDisplay\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Timer tmrSkillTick;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SkillTreeDisplayControl.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Represents the diagram displayed on the skill browser.\n    /// </summary>\n    public partial class SkillTreeDisplayControl : UserControl\n    {\n        #region Fields\n\n        private const int SkillboxMarginUd = 20;\n        private const int SkillboxMarginLr = 10;\n\n        private const DescriptiveTextOptions TimeFormat =\n            DescriptiveTextOptions.UppercaseText | DescriptiveTextOptions.IncludeCommas;\n\n        public event EventHandler<SkillClickedEventArgs> SkillClicked;\n\n        private Plan m_plan;\n        private Skill m_rootSkill;\n        private Cell m_rootCell;\n        private Rectangle m_graphBounds = new Rectangle(0, 0, 10, 10);\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public SkillTreeDisplayControl()\n        {\n            InitializeComponent();\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Subscribe events on load.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            // Return on design mode\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            SetStyle(ControlStyles.AllPaintingInWmPaint |\n                     ControlStyles.Opaque |\n                     ControlStyles.ResizeRedraw, true);\n            UpdateStyles();\n\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.CharacterUpdated += EveMonClient_CharacterUpdated;\n            EveMonClient.PlanChanged += EveMonClient_PlanChanged;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.CharacterUpdated -= EveMonClient_CharacterUpdated;\n            EveMonClient.PlanChanged -= EveMonClient_PlanChanged;\n            Disposed -= OnDisposed;\n        }\n\n        #endregion\n\n\n        #region Private Properties\n\n        /// <summary>\n        /// Gets the cell width according to dpi (for font scaling support).\n        /// </summary>\n        private int CellWidth\n        {\n            get\n            {\n                Graphics g = Graphics.FromHwnd(Handle);\n                float dpi = g.DpiX;\n\n                if (dpi > 125)\n                    return 353;\n\n                return dpi > EveMonConstants.DefaultDpi ? 295 : 235;\n            }\n        }\n\n        /// <summary>\n        /// Gets the cell height according to dpi (for font scaling support).\n        /// </summary>\n        private int CellHeight\n        {\n            get\n            {\n                Graphics g = Graphics.FromHwnd(Handle);\n                float dpi = g.DpiX;\n\n                if (dpi > 125)\n                    return 110;\n\n                return dpi > EveMonConstants.DefaultDpi ? 92 : 73;\n            }\n        }\n\n        #endregion\n\n\n        #region Internal Properties\n\n        /// <summary>\n        /// Gets or sets the plan this control is bound to.\n        /// </summary>\n        internal Plan Plan\n        {\n            get { return m_plan; }\n            set\n            {\n                m_plan = value;\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the root skill.\n        /// </summary>\n        internal Skill RootSkill\n        {\n            get { return m_rootSkill; }\n            set\n            {\n                if (m_rootSkill == value)\n                    return;\n\n                m_rootSkill = value;\n                UpdateLayout();\n            }\n        }\n\n        #endregion\n\n\n        #region Layout and painting\n\n        /// <summary>\n        /// Checks training data.\n        /// </summary>\n        private void CheckTraining()\n        {\n            if (m_rootSkill == null)\n                return;\n\n            tmrSkillTick.Enabled = m_rootSkill.AllPrerequisites.Any(x => x.Skill.IsTraining);\n        }\n\n        /// <summary>\n        /// Build the layout.\n        /// </summary>\n        private void UpdateLayout()\n        {\n            if (m_rootSkill == null)\n                return;\n\n            m_rootCell = new Cell(m_rootSkill);\n            ArrangeGraph();\n        }\n\n        /// <summary>\n        /// Arranges the graph position.\n        /// </summary>\n        private void ArrangeGraph()\n        {\n            if (m_rootSkill == null)\n                return;\n\n            m_graphBounds = m_rootCell.Arrange(Size);\n            AutoScrollMinSize = m_graphBounds.Size;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Performs the painting.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            Graphics g = e.Graphics;\n\n            // Draws the background (solid or gradient, depending on safe mode or not)\n            if (!Settings.UI.SafeForWork)\n            {\n                using (Brush b = new LinearGradientBrush(ClientRectangle, Color.LightBlue, Color.DarkBlue, 90.0F))\n                {\n                    g.FillRectangle(b, e.ClipRectangle);\n                }\n            }\n            else\n                g.FillRectangle(SystemBrushes.Control, e.ClipRectangle);\n\n            // Returns when no root skill\n            if (m_rootSkill == null)\n                return;\n\n            // Compute offset caused by scrollers\n            int ofsLeft = AutoScrollPosition.X;\n            int ofsTop = AutoScrollPosition.Y;\n\n            // Draw the lines\n            using (Pen linePen = new Pen(Settings.UI.SafeForWork ? SystemColors.ControlText : Color.White, 5.0F))\n            {\n                foreach (Cell cell in m_rootCell.Cells)\n                {\n                    DrawLines(g, m_rootCell, cell, linePen, ofsLeft, ofsTop);\n                }\n            }\n\n            // Draw the cells\n            using (Font boldFont = FontFactory.GetFont(Font, FontStyle.Bold))\n            {\n                foreach (Cell cell in m_rootCell.AllCells)\n                {\n                    DrawCell(g, cell, boldFont, ofsLeft, ofsTop);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Draws the line between the given cells and recursively repeats the operation for the children cell.\n        /// </summary>\n        /// <param name=\"g\"></param>\n        /// <param name=\"startCell\"></param>\n        /// <param name=\"endCell\"></param>\n        /// <param name=\"pen\"></param>\n        /// <param name=\"ofsLeft\"></param>\n        /// <param name=\"ofsTop\"></param>\n        private static void DrawLines(Graphics g, Cell startCell, Cell endCell, Pen pen, int ofsLeft, int ofsTop)\n        {\n            Rectangle startRect = startCell.Rectangle;\n            Rectangle endRect = endCell.Rectangle;\n\n            g.DrawLine(pen,\n                startRect.Location.X + ofsLeft + (startRect.Width >> 1),\n                startRect.Location.Y + ofsTop + (startRect.Height >> 1),\n                endRect.Location.X + ofsLeft + (startRect.Width >> 1),\n                endRect.Location.Y + ofsTop + (startRect.Height >> 1));\n\n            foreach (Cell child in endCell.Cells)\n            {\n                DrawLines(g, endCell, child, pen, ofsLeft, ofsTop);\n            }\n        }\n\n        /// <summary>\n        /// Paints the provided cell and recursively repeats the operation for the children cell.\n        /// </summary>\n        /// <param name=\"g\"></param>\n        /// <param name=\"cell\"></param>\n        /// <param name=\"boldFont\"></param>\n        /// <param name=\"ofsLeft\"></param>\n        /// <param name=\"ofsTop\"></param>\n        private void DrawCell(Graphics g, Cell cell, Font boldFont, int ofsLeft, int ofsTop)\n        {\n            Rectangle rect = cell.Rectangle;\n            rect.Offset(ofsLeft, ofsTop);\n\n            Color stdTextColor = !Settings.UI.SafeForWork ? Color.Black : SystemColors.ControlText;\n            Color reqTextColor = !Settings.UI.SafeForWork ? Color.Red : SystemColors.GrayText;\n            Color prTextColor = !Settings.UI.SafeForWork ? Color.Yellow : SystemColors.ControlText;\n\n            Brush fillBrush = null;\n            try\n            {\n                StringBuilder currentLevelText = new StringBuilder();\n\n                if (m_plan != null)\n                {\n                    // Retrieves the output of the second line : \"Current Level : II (Planned to IV)\"\n                    currentLevelText.Append($\"Current Level: {Skill.GetRomanFromInt(cell.Skill.Level)}\");\n\n                    if (m_plan.GetPlannedLevel(cell.Skill) > 0)\n                        currentLevelText.Append($\" (Planned To: {Skill.GetRomanFromInt(m_plan.GetPlannedLevel(cell.Skill))})\");\n                }\n\n                // Retrieves the output and colors for the lower lines\n                string thisRequiredTime = null;\n                string requiredLevel = null;\n                string prereqTime = null;\n                if (cell.RequiredLevel > 0)\n                {\n                    // Third line : \"Required Level : V\"\n                    requiredLevel = $\"Required Level: {Skill.GetRomanFromInt(cell.RequiredLevel)}\";\n\n                    if (cell.Skill.Character != null && cell.RequiredLevel > cell.Skill.Level)\n                    {\n                        // Fourth line : \"This Time : 9H, 26M, 42S\"\n                        TimeSpan ts = cell.Skill.GetLeftTrainingTimeToLevel(cell.RequiredLevel);\n                        thisRequiredTime = $\"This Time: {ts.ToDescriptiveText(TimeFormat)}\";\n                        reqTextColor = !Settings.UI.SafeForWork ? Color.Yellow : SystemColors.GrayText;\n\n                        if (cell.Skill.ArePrerequisitesMet)\n                            fillBrush = GetLinearGradientBrush(rect, Color.LightPink, Color.DarkRed, 90.0F);\n                        else\n                        {\n                            fillBrush = GetLinearGradientBrush(rect, Color.Red, Color.Black, 90.0F);\n                            stdTextColor = !Settings.UI.SafeForWork ? Color.White : SystemColors.ControlText;\n                        }\n                    }\n                    // Required level already met\n                    else\n                    {\n                        reqTextColor = !Settings.UI.SafeForWork ? Color.Black : SystemColors.ControlText;\n                        fillBrush = GetLinearGradientBrush(rect, Color.LightSeaGreen, Color.DarkGreen, 90.0F);\n                    }\n                }\n                // Skill at level 0, prerequisites met\n                else if (cell.Skill.ArePrerequisitesMet)\n                    fillBrush = GetLinearGradientBrush(rect, Color.LightBlue, Color.Blue, 90.0F);\n                // Skill unknown, not trainable\n                else\n                {\n                    fillBrush = GetLinearGradientBrush(rect, Color.Blue, Color.Black, 90.0F);\n                    stdTextColor = !Settings.UI.SafeForWork ? Color.White : SystemColors.ControlText;\n                }\n\n                // Last line : prerequisites time\n                if (cell.Skill.Character != null && !cell.Skill.ArePrerequisitesMet)\n                {\n                    TimeSpan pts = cell.Skill.Character.GetTrainingTimeToMultipleSkills(cell.Skill.Prerequisites);\n                    prereqTime = $\"Prerequisite: {pts.ToDescriptiveText(TimeFormat)}\";\n                }\n\n                // Fill the background\n                if (Settings.UI.SafeForWork)\n                    fillBrush = new SolidBrush(SystemColors.Control);\n\n                g.FillRectangle(fillBrush, rect);\n\n                // Draw text (two to five lines)\n                Point drawPoint = new Point(rect.Left + 5, rect.Top + 5);\n                Size sz = MeasureAndDrawText(g, cell.Skill.Name, boldFont, drawPoint, stdTextColor);\n                drawPoint.Y += sz.Height;\n\n                sz = MeasureAndDrawText(g, currentLevelText.ToString(), Font, drawPoint, stdTextColor);\n                drawPoint.Y += sz.Height;\n\n                if (!string.IsNullOrEmpty(requiredLevel))\n                {\n                    sz = MeasureAndDrawText(g, requiredLevel, Font, drawPoint, reqTextColor);\n                    drawPoint.Y += sz.Height;\n                }\n                if (!string.IsNullOrEmpty(thisRequiredTime))\n                {\n                    sz = MeasureAndDrawText(g, thisRequiredTime, Font, drawPoint, reqTextColor);\n                    drawPoint.Y += sz.Height;\n                }\n                if (!string.IsNullOrEmpty(prereqTime))\n                {\n                    sz = MeasureAndDrawText(g, prereqTime, Font, drawPoint, prTextColor);\n                    drawPoint.Y += sz.Height;\n                }\n\n                // Draw border\n                g.DrawRectangle(!Settings.UI.SafeForWork ? Pens.Black : SystemPens.ControlDarkDark, rect);\n            }\n            finally\n            {\n                fillBrush?.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Gets the linear gradient brush.\n        /// </summary>\n        /// <param name=\"rect\">The rect.</param>\n        /// <param name=\"color1\">The color1.</param>\n        /// <param name=\"color2\">The color2.</param>\n        /// <param name=\"angle\">The angle.</param>\n        /// <returns></returns>\n        private static Brush GetLinearGradientBrush(Rectangle rect, Color color1, Color color2, float angle)\n        {\n            Brush brush;\n            Brush tempBrush = null;\n            try\n            {\n                tempBrush = new LinearGradientBrush(rect, color1, color2, angle);\n\n                brush = tempBrush;\n                tempBrush = null;\n            }\n            finally\n            {\n                tempBrush?.Dispose();\n            }\n            return brush;\n        }\n\n        /// <summary>\n        /// Simultaneously measures and renders the text.\n        /// </summary>\n        /// <param name=\"g\"></param>\n        /// <param name=\"text\"></param>\n        /// <param name=\"f\"></param>\n        /// <param name=\"p\"></param>\n        /// <param name=\"c\"></param>\n        /// <returns></returns>\n        private static Size MeasureAndDrawText(IDeviceContext g, string text, Font f, Point p, Color c)\n        {\n            Size res = TextRenderer.MeasureText(g, text, f);\n\n            TextRenderer.DrawText(g, text, f,\n                new Rectangle(p.X, p.Y, res.Width, res.Height), c, Color.Transparent,\n                TextFormatFlags.Default);\n            return res;\n        }\n\n        /// <summary>\n        /// Once the size changed, we rearrange the graph and update scroll bars.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnSizeChanged(EventArgs e)\n        {\n            base.OnSizeChanged(e);\n\n            ArrangeGraph();\n        }\n\n        #endregion\n\n\n        #region Other events\n\n        /// <summary>\n        /// When the root skill or one of its prerequisites is in training,\n        /// every 30s we invalidate the display.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tmrSkillTick_Tick(object sender, EventArgs e)\n        {\n            Invalidate();\n            CheckTraining();\n        }\n\n        /// <summary>\n        /// On mouse down, we detect which skill is under the mouse location.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnMouseDown(MouseEventArgs e)\n        {\n            base.OnMouseDown(e);\n                        \n            if (e.Button == MouseButtons.Right)\n                Cursor = Cursors.Default;\n\n            Skill skill;\n            Point mouseLocation = GetMouseLocation(e, out skill);\n\n            // Fires the event when skill not null\n            if (skill == null)\n                return;\n\n            SkillClicked?.ThreadSafeInvoke(this, new SkillClickedEventArgs(skill, e.Button, mouseLocation));\n        }\n\n        /// <summary>\n        /// On mouse move, we change the cursor according to mouse location.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        /// <remarks>If under a skill we display the context menu cursor, otherwise the default cursor</remarks>\n        protected override void OnMouseMove(MouseEventArgs e)\n        {\n            base.OnMouseMove(e);\n\n            Skill skill;\n            GetMouseLocation(e, out skill);\n\n            Cursor = skill == null || m_plan == null ? Cursors.Default : CustomCursors.ContextMenu;\n        }\n\n        /// <summary>\n        /// Gets the mouse location.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        /// <param name=\"skill\">The skill.</param>\n        /// <returns></returns>\n        private Point GetMouseLocation(MouseEventArgs e, out Skill skill)\n        {\n            // Computes the offsets caused by scrollers\n            int ofsLeft = -AutoScrollPosition.X;\n            int ofsTop = -AutoScrollPosition.Y;\n\n            // Checks every cell\n            Point mouseLocation = e.Location;\n            mouseLocation.Offset(ofsLeft, ofsTop);\n            skill = m_rootCell.AllCells.FirstOrDefault(cell => cell.Rectangle.Contains(mouseLocation))?.Skill;\n            return mouseLocation;\n        }\n\n        /// <summary>\n        /// On scrolling, we invalidate the display.\n        /// </summary>\n        /// <param name=\"se\"></param>\n        protected override void OnScroll(ScrollEventArgs se)\n        {\n            base.OnScroll(se);\n\n            Invalidate();\n        }\n\n        /// <summary>\n        /// On mouse wheel, the scroll changes, so we invalidate.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnMouseWheel(MouseEventArgs e)\n        {\n            base.OnMouseWheel(e);\n\n            Invalidate();\n        }\n\n        /// <summary>\n        /// On settings change, we invalidate the drawing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Fired when one of the character changed (skill completion, update from CCP, etc).\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (m_plan == null)\n                return;\n\n            if (e.Character != m_plan.Character)\n                return;\n\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Occurs when the plan changes, we invalidate the drawing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_PlanChanged(object sender, PlanChangedEventArgs e)\n        {\n            Invalidate();\n        }\n\n        #endregion\n\n\n        #region Private Support Classes\n\n\n        #region Private Class \"Row\"\n\n        /// <summary>\n        /// Represents a cells' row.\n        /// </summary>\n        private sealed class Row : List<Cell>\n        {\n            /// <summary>\n            /// Constructor.\n            /// </summary>\n            public Row(Cell cell)\n            {\n                Add(cell);\n            }\n\n            /// <summary>\n            /// Gets true if two cells overlaps or if their space is lesser than the regular spacing.\n            /// </summary>\n            /// <param name=\"leftIndex\"></param>\n            /// <param name=\"rightIndex\"></param>\n            /// <param name=\"space\">The space between the two cells, including the margins. Negative when boxes are overlapping.</param>\n            /// <returns></returns>\n            public bool AreOverlapping(int leftIndex, int rightIndex, out int space)\n            {\n                space = 0;\n                if (leftIndex == rightIndex || rightIndex >= Count || leftIndex >= Count || rightIndex < -1 ||\n                    leftIndex < -1)\n                    return false;\n\n                Cell left = this[Math.Min(leftIndex, rightIndex)];\n                Cell right = this[Math.Max(leftIndex, rightIndex)];\n\n                space = right.Rectangle.Left - (left.Rectangle.Right + SkillboxMarginLr);\n                return space < 0;\n            }\n        }\n\n        #endregion\n\n\n        #region Private Class \"Cell\"\n\n        /// <summary>\n        /// Helper class to store layout informations about a skill.\n        /// </summary>\n        private sealed class Cell\n        {\n            #region Constructor\n\n            /// <summary>\n            /// Constructor for root.\n            /// </summary>\n            /// <param name=\"skill\"></param>\n            public Cell(Skill skill)\n            {\n                Skill = skill;\n                RequiredLevel = -1;\n\n                // Create the top row\n                List<Row> rows = new List<Row> { new Row(this) };\n\n                // Create the children\n                Cells = new List<Cell>();\n                foreach (SkillLevel prereq in skill.Prerequisites.Where(prereq => prereq.Skill != skill))\n                {\n                    Cells.Add(new Cell(prereq, rows, 1));\n                }\n\n                // Perform the layout\n                FirstPassLayout(0, 0);\n                SecondPassLayout(rows, 0);\n            }\n\n            /// <summary>\n            /// Constructor for prerequisites.\n            /// </summary>\n            /// <param name=\"rows\"></param>\n            /// <param name=\"level\"></param>\n            /// <param name=\"prereq\"></param>\n            private Cell(SkillLevel prereq, IList<Row> rows, int level)\n            {\n                Skill = prereq.Skill;\n                RequiredLevel = prereq.Level;\n\n                // Put on the appropriate row\n                if (rows.Count == level)\n                    rows.Add(new Row(this));\n                else\n                    rows[level].Add(this);\n\n                // Create the children\n                Cells = new List<Cell>();\n                foreach (SkillLevel childPrereq in prereq.Skill.Prerequisites\n                    .Where(childPrereq => childPrereq.Skill != prereq.Skill))\n                {\n                    Cells.Add(new Cell(childPrereq, rows, level + 1));\n                }\n            }\n\n            #endregion\n\n\n            #region Properties\n\n            /// <summary>\n            /// Gets or sets the skill.\n            /// </summary>\n            /// <value>The skill.</value>\n            public Skill Skill { get; }\n\n            /// <summary>\n            /// Gets or sets the required level.\n            /// </summary>\n            /// <value>The required level.</value>\n            public long RequiredLevel { get; }\n\n            /// <summary>\n            /// Gets or sets the cells.\n            /// </summary>\n            /// <value>The cells.</value>\n            public List<Cell> Cells { get; }\n\n            /// <summary>\n            /// Gets or sets the rectangle.\n            /// </summary>\n            /// <value>The rectangle.</value>\n            public Rectangle Rectangle { get; private set; }\n\n            /// <summary>\n            /// Gets this cell and all its descendants.\n            /// </summary>\n            public IEnumerable<Cell> AllCells\n            {\n                get\n                {\n                    yield return this;\n                    foreach (Cell cell in Cells.SelectMany(child => child.AllCells))\n                    {\n                        yield return cell;\n                    }\n                }\n            }\n\n            #endregion\n\n\n            #region Methods\n\n            /// <summary>\n            /// Arrange cells in a hierarchical order matching prerequisites,\n            /// the first one being centered on x = 0.\n            /// </summary>\n            /// <param name=\"left\"></param>\n            /// <param name=\"top\"></param>\n            /// <returns></returns>\n            private void FirstPassLayout(int left, int top)\n            {\n                using (SkillTreeDisplayControl stdc = new SkillTreeDisplayControl())\n                {\n                    // Layout this cell\n                    Rectangle = new Rectangle(left, top, stdc.CellWidth, stdc.CellHeight);\n\n                    // Layout the children\n                    int childrenTop = top + stdc.CellHeight + SkillboxMarginUd;\n                    int childrenWidth = Cells.Count * stdc.CellWidth + (Cells.Count - 1) * SkillboxMarginLr;\n\n                    left += (stdc.CellWidth - childrenWidth) / 2;\n                    foreach (Cell cell in Cells)\n                    {\n                        cell.FirstPassLayout(left, childrenTop);\n                        left += stdc.CellWidth + SkillboxMarginLr;\n                    }\n                }\n            }\n\n            /// <summary>\n            /// The first pass may have created overlapping rectangles,\n            /// so we check every row and shift boxes when required.\n            /// </summary>\n            /// <param name=\"rows\"></param>\n            /// <param name=\"level\"></param>\n            private static void SecondPassLayout(IList<Row> rows, int level)\n            {\n                // Gets the row for this level\n                if (level == rows.Count)\n                    return;\n\n                Row row = rows[level];\n\n                // Scan every cell and, when there is a conflict, shift all the other cells\n                for (int i = 0; i < row.Count - 1; i++)\n                {\n                    int space;\n                    if (!row.AreOverlapping(i, i + 1, out space))\n                        continue;\n\n                    // Shift the two cells\n                    int shift = -space >> 1;\n                    row[i].Offset(-shift, 0);\n                    row[i + 1].Offset(shift, 0);\n\n                    // Shift boxes on the left of \"left\"\n                    for (int j = i - 1; j >= 0; j--)\n                    {\n                        if (!row.AreOverlapping(j, j + 1, out space))\n                            break;\n\n                        row[j].Offset(space, 0);\n                    }\n                    // Shift boxes on the right of \"right\"\n                    for (int j = i + 2; j < row.Count; j++)\n                    {\n                        if (!row.AreOverlapping(j, j - 1, out space))\n                            break;\n\n                        row[j].Offset(-space, 0);\n                    }\n                }\n\n                // Next level\n                SecondPassLayout(rows, level + 1);\n            }\n\n            /// <summary>\n            /// Offsets this cell and all its children.\n            /// </summary>\n            /// <param name=\"x\"></param>\n            /// <param name=\"y\"></param>\n            private void Offset(int x, int y)\n            {\n                Rectangle rect = Rectangle;\n                rect.Offset(x, y);\n                Rectangle = rect;\n\n                foreach (Cell cell in Cells)\n                {\n                    cell.Offset(x, y);\n                }\n            }\n\n            /// <summary>\n            /// Arranges the whole graph into the given surface. Centers the cells and then return the global bounding box.\n            /// </summary>\n            /// <param name=\"size\"></param>\n            /// <returns>The graph bounds, centered into the given surface (or aligned on top left when there is overlap.</returns>\n            public Rectangle Arrange(Size size)\n            {\n                // Compute the global rect\n                int left = Rectangle.Left,\n                    right = Rectangle.Right,\n                    top = Rectangle.Top,\n                    bottom = Rectangle.Bottom;\n                foreach (Rectangle rect in AllCells.Select(cell => cell.Rectangle))\n                {\n                    left = Math.Min(left, rect.Left);\n                    right = Math.Max(right, rect.Right);\n                    bottom = Math.Max(bottom, rect.Bottom);\n                    top = Math.Min(top, rect.Top);\n                }\n\n                // Compute the new origins\n                int xOrigin = Math.Max(10, size.Width - (right - left)) >> 1;\n                int yOrigin = Math.Max(10, size.Height - (bottom - top)) >> 1;\n\n                // Offset the cell's rectangles\n                foreach (Cell cell in AllCells)\n                {\n                    Rectangle rect = cell.Rectangle;\n                    rect.Offset(xOrigin - left, yOrigin - top);\n                    cell.Rectangle = rect;\n                }\n\n                // Return the global rect\n                return new Rectangle(xOrigin, yOrigin, 20 + right - left, 20 + bottom - top);\n            }\n\n            #endregion\n        }\n\n        #endregion\n\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SkillTreeDisplayControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"tmrSkillTick.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SuggestionWindow.Designer.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    partial class SuggestionWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.label1 = new System.Windows.Forms.Label();\n            this.lbSkills = new System.Windows.Forms.ListBox();\n            this.btnAdd = new System.Windows.Forms.Button();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.label2 = new System.Windows.Forms.Label();\n            this.label3 = new System.Windows.Forms.Label();\n            this.label4 = new System.Windows.Forms.Label();\n            this.lblBeforeTime = new System.Windows.Forms.Label();\n            this.lblAfterTime = new System.Windows.Forms.Label();\n            this.lblDiffTime = new System.Windows.Forms.Label();\n            this.panel1 = new System.Windows.Forms.Panel();\n            this.panel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // label1\n            // \n            this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.label1.Location = new System.Drawing.Point(12, 9);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(267, 31);\n            this.label1.TabIndex = 0;\n            this.label1.Text = \"Adding the following learning skills to your skill plan will reduce the overall t\" +\n                \"raining time of the plan:\";\n            // \n            // lbSkills\n            // \n            this.lbSkills.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.lbSkills.FormattingEnabled = true;\n            this.lbSkills.IntegralHeight = false;\n            this.lbSkills.Location = new System.Drawing.Point(0, 0);\n            this.lbSkills.Name = \"lbSkills\";\n            this.lbSkills.Size = new System.Drawing.Size(264, 131);\n            this.lbSkills.TabIndex = 1;\n            // \n            // btnAdd\n            // \n            this.btnAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnAdd.Location = new System.Drawing.Point(124, 251);\n            this.btnAdd.Name = \"btnAdd\";\n            this.btnAdd.Size = new System.Drawing.Size(75, 23);\n            this.btnAdd.TabIndex = 2;\n            this.btnAdd.Text = \"Add\";\n            this.btnAdd.UseVisualStyleBackColor = true;\n            this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(205, 251);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 3;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(12, 186);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(111, 13);\n            this.label2.TabIndex = 4;\n            this.label2.Text = \"Time before changes:\";\n            // \n            // label3\n            // \n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(12, 199);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(103, 13);\n            this.label3.TabIndex = 5;\n            this.label3.Text = \"Time after changes:\";\n            // \n            // label4\n            // \n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(12, 222);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(65, 13);\n            this.label4.TabIndex = 6;\n            this.label4.Text = \"Time saved:\";\n            // \n            // lblBeforeTime\n            // \n            this.lblBeforeTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblBeforeTime.AutoSize = true;\n            this.lblBeforeTime.Location = new System.Drawing.Point(129, 186);\n            this.lblBeforeTime.Name = \"lblBeforeTime\";\n            this.lblBeforeTime.Size = new System.Drawing.Size(35, 13);\n            this.lblBeforeTime.TabIndex = 7;\n            this.lblBeforeTime.Text = \"label5\";\n            // \n            // lblAfterTime\n            // \n            this.lblAfterTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblAfterTime.AutoSize = true;\n            this.lblAfterTime.Location = new System.Drawing.Point(129, 199);\n            this.lblAfterTime.Name = \"lblAfterTime\";\n            this.lblAfterTime.Size = new System.Drawing.Size(35, 13);\n            this.lblAfterTime.TabIndex = 8;\n            this.lblAfterTime.Text = \"label6\";\n            // \n            // lblDiffTime\n            // \n            this.lblDiffTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblDiffTime.AutoSize = true;\n            this.lblDiffTime.Location = new System.Drawing.Point(129, 222);\n            this.lblDiffTime.Name = \"lblDiffTime\";\n            this.lblDiffTime.Size = new System.Drawing.Size(35, 13);\n            this.lblDiffTime.TabIndex = 9;\n            this.lblDiffTime.Text = \"label7\";\n            // \n            // panel1\n            // \n            this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.panel1.Controls.Add(this.lbSkills);\n            this.panel1.Location = new System.Drawing.Point(12, 43);\n            this.panel1.Name = \"panel1\";\n            this.panel1.Size = new System.Drawing.Size(264, 131);\n            this.panel1.TabIndex = 10;\n            // \n            // SuggestionWindow\n            // \n            this.AcceptButton = this.btnAdd;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(292, 286);\n            this.Controls.Add(this.panel1);\n            this.Controls.Add(this.lblDiffTime);\n            this.Controls.Add(this.lblAfterTime);\n            this.Controls.Add(this.lblBeforeTime);\n            this.Controls.Add(this.label4);\n            this.Controls.Add(this.label3);\n            this.Controls.Add(this.label2);\n            this.Controls.Add(this.btnCancel);\n            this.Controls.Add(this.btnAdd);\n            this.Controls.Add(this.label1);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"SuggestionWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Plan Suggestion\";\n            this.Load += new System.EventHandler(this.SuggestionWindow_Load);\n            this.panel1.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.ListBox lbSkills;\n        private System.Windows.Forms.Button btnAdd;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.Label lblBeforeTime;\n        private System.Windows.Forms.Label lblAfterTime;\n        private System.Windows.Forms.Label lblDiffTime;\n        private System.Windows.Forms.Panel panel1;\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SuggestionWindow.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\n\nnamespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Presents the user with a list of learning skills suggestions for a plan.\n    /// </summary>\n    public partial class SuggestionWindow : EVEMonForm\n    {\n        PlanSuggestions m_suggestions;\n        private Plan m_plan;\n\n        /// <summary>\n        /// Designer constructor\n        /// </summary>\n        public SuggestionWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Constructor to use in code\n        /// </summary>\n        /// <param name=\"plan\"></param>\n        public SuggestionWindow(Plan plan)\n            : this()\n        {\n            m_plan = plan;\n            m_suggestions = m_plan.GetSuggestions();\n        }\n\n        /// <summary>\n        /// On load, fill the list and update the labels.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void SuggestionWindow_Load(object sender, EventArgs e)\n        {\n            if (this.DesignMode)\n                return;\n\n            // Update the suggestions list\n            lbSkills.Items.Clear();\n            foreach (var entry in m_suggestions)\n            {\n                lbSkills.Items.Add(entry.ToString());\n            }\n\n            // Update the times labels\n            CharacterScratchpad character = m_plan.Character.After(m_plan.ChosenImplantSet);\n            TimeSpan preTime = m_plan.GetTotalTime(character, true);\n            TimeSpan postTime = preTime.Subtract(m_suggestions.TimeBenefit);\n\n            lblBeforeTime.Text = preTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n            lblAfterTime.Text = postTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n            lblDiffTime.Text = m_suggestions.TimeBenefit.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas);\n        }\n\n        /// <summary>\n        /// On \"cancel\", nothing special.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            this.DialogResult = DialogResult.Cancel;\n            this.Close();\n        }\n\n        /// <summary>\n        /// On \"add\", apply the suggestions\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnAdd_Click(object sender, EventArgs e)\n        {\n            this.DialogResult = DialogResult.OK;\n            m_suggestions.ApplySuggestions();\n            this.Close();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/SkillPlanner/SuggestionWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/Updater/DataUpdateDownloadForm.Designer.cs",
    "content": "﻿namespace EVEMon.Updater\n{\n    partial class DataUpdateDownloadForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.btCancel = new System.Windows.Forms.Button();\n            this.SuspendLayout();\n            // \n            // btCancel\n            // \n            this.btCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btCancel.Location = new System.Drawing.Point(325, 16);\n            this.btCancel.Name = \"btCancel\";\n            this.btCancel.Size = new System.Drawing.Size(75, 23);\n            this.btCancel.TabIndex = 3;\n            this.btCancel.Text = \"Cancel\";\n            this.btCancel.UseVisualStyleBackColor = true;\n            this.btCancel.Click += new System.EventHandler(this.btCancel_Click);\n            // \n            // DataUpdateDownloadForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(412, 51);\n            this.ControlBox = false;\n            this.Controls.Add(this.btCancel);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"DataUpdateDownloadForm\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Downloading Update...\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Button btCancel;\n    }\n}"
  },
  {
    "path": "src/EVEMon/Updater/DataUpdateDownloadForm.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization.PatchXml;\nusing EVEMon.Common.Threading;\n\nnamespace EVEMon.Updater\n{\n    public partial class DataUpdateDownloadForm : EVEMonForm\n    {\n        private TableLayoutPanel m_tableLayoutPanel;\n\n        private readonly List<DataUpdateDownloadControl> m_controls;\n        private readonly List<SerializableDatafile> m_datafiles;\n        private bool m_canceling;\n\n        /// <summary>\n        /// Prevents a default instance of the <see cref=\"DataUpdateDownloadForm\"/> class from being created.\n        /// </summary>\n        private DataUpdateDownloadForm()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"DataUpdateDownloadForm\"/> class.\n        /// </summary>\n        /// <param name=\"datafiles\">The datafiles.</param>\n        public DataUpdateDownloadForm(List<SerializableDatafile> datafiles)\n            : this()\n        {\n            m_datafiles = datafiles;\n            m_controls = new List<DataUpdateDownloadControl>();\n\n            InitilizeControls();\n        }\n\n        /// <summary>\n        /// Initilizes the controls.\n        /// </summary>\n        private void InitilizeControls()\n        {\n            SuspendLayout();\n\n            m_tableLayoutPanel = new TableLayoutPanel\n            {\n                AutoSize = true,\n                ColumnCount = 1,\n                Dock = DockStyle.Top,\n                Location = new Point(0, 0),\n                Name = \"m_tableLayoutPanel\",\n                RowCount = m_datafiles.Count,\n                TabIndex = 0,\n            };\n\n            m_tableLayoutPanel.ColumnStyles.Add(new ColumnStyle());\n\n            foreach (SerializableDatafile datafile in m_datafiles)\n            {\n                DataUpdateDownloadControl control = new DataUpdateDownloadControl(datafile)\n                {\n                    Dock = DockStyle.Fill,\n                    Margin = new Padding(10)\n                };\n                m_controls.Add(control);\n\n                m_tableLayoutPanel.RowStyles.Add(new RowStyle());\n                m_tableLayoutPanel.Controls.Add(control, 0, m_datafiles.IndexOf(datafile));\n            }\n\n            int height = m_tableLayoutPanel.PreferredSize.Height + ClientSize.Height;\n\n            btCancel.Location = new Point(325, height - btCancel.Height - 14);\n            Controls.Add(m_tableLayoutPanel);\n            ClientSize = new Size(ClientSize.Width, height);\n            ResumeLayout(false);\n            PerformLayout();\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Form.Shown\" /> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.EventArgs\" /> that contains the event data.</param>\n        protected override void OnShown(EventArgs e)\n        {\n            base.OnShown(e);\n\n            do\n            {\n                Application.DoEvents();\n            } while (!m_canceling && m_controls.Any(control => control.Tag == null || !(bool)control.Tag));\n\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the FormClosing event of the UpdateDownloadForm control.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"FormClosingEventArgs\"/> instance containing the event data.</param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            if (!Visible ||\n                (e.CloseReason != CloseReason.ApplicationExitCall && e.CloseReason != CloseReason.TaskManagerClosing &&\n                 e.CloseReason != CloseReason.WindowsShutDown))\n            {\n                return;\n            }\n\n            Cancel();\n        }\n\n\n        /// <summary>\n        /// Handles the Click event of the btCancel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EventArgs\"/> instance containing the event data.</param>\n        private void btCancel_Click(object sender, EventArgs e)\n        {\n            Cancel();\n        }\n\n        /// <summary>\n        /// Cancels this instance.\n        /// </summary>\n        private void Cancel()\n        {\n            m_canceling = true;\n            m_controls.ForEach(control => control?.WebClient?.CancelAsync());\n        }\n\n\n        #region DataUpdateDownloadControl class\n\n        private class DataUpdateDownloadControl : UserControl\n        {\n            private Label m_label;\n            private Label m_progressLabel;\n            private ProgressBar m_progressBar;\n\n            private readonly SerializableDatafile m_datafile;\n            private readonly string m_tempFilename;\n\n            /// <summary>\n            /// Initializes a new instance of the <see cref=\"DataUpdateDownloadControl\"/> class.\n            /// </summary>\n            /// <param name=\"datafile\">The datafile.</param>\n            internal DataUpdateDownloadControl(SerializableDatafile datafile)\n            {\n                InitializeComponent();\n\n                m_datafile = datafile;\n                m_label.Text = $\"{datafile.Name}\";\n                m_progressLabel.Text = @\"Downloading update...\";\n                m_tempFilename = Path.Combine(EveMonClient.EVEMonDataDir, $\"{datafile.Name}.tmp\");\n\n                WebClient = HttpWebClientService.GetWebClient();\n            }\n\n            /// <summary>\n            /// Initializes the component.\n            /// </summary>\n            private void InitializeComponent()\n            {\n                SuspendLayout();\n\n                m_label = new Label\n                {\n                    AutoSize = true,\n                    Location = new Point(0, 0),\n                    Name = \"lblDatafileName\"\n                };\n\n                m_progressLabel = new Label\n                {\n                    AutoSize = true,\n                    Location = new Point(0, 35),\n                    Name = \"lblProgress\"\n                };\n\n                m_progressBar = new ProgressBar\n                {\n                    Location = new Point(3, 15),\n                    Name = \"pbProgress\",\n                    Size = new Size(385, 18)\n                };\n\n                Controls.Add(m_progressLabel);\n                Controls.Add(m_progressBar);\n                Controls.Add(m_label);\n\n                ClientSize = PreferredSize;\n                ResumeLayout(false);\n                PerformLayout();\n            }\n\n            /// <summary>\n            /// Raises the <see cref=\"E:System.Windows.Forms.Control.OnVisibleChangeds\"/> event.\n            /// </summary>\n            /// <param name=\"e\">An <see cref=\"T:System.EventArgs\" /> that contains the event data.</param>\n            protected override void OnVisibleChanged(EventArgs e)\n            {\n                base.OnVisibleChanged(e);\n\n                BeginDownload();\n            }\n\n            /// <summary>\n            /// Gets the web client.\n            /// </summary>\n            /// <value>\n            /// The web client.\n            /// </value>\n            internal WebClient WebClient { get; }\n\n            /// <summary>\n            /// Begins the download.\n            /// </summary>\n            private void BeginDownload()\n            {\n                Uri url = new Uri($\"{m_datafile.Address}/{m_datafile.Name}\");\n                string urlValidationError;\n                if (!HttpWebClientService.IsValidURL(url, out urlValidationError))\n                    return;\n\n                if (File.Exists(m_tempFilename))\n                    FileHelper.DeleteFile(m_tempFilename);\n\n                try\n                {\n                    using (WebClient)\n                    {\n                        WebClient.DownloadFileCompleted += DownloadCompleted;\n                        WebClient.DownloadProgressChanged += ProgressChanged;\n\n                        try\n                        {\n                            WebClient.DownloadFileAsync(url, m_tempFilename);\n                        }\n                        catch (WebException ex)\n                        {\n                            throw HttpWebClientServiceException.HttpWebClientException(url, ex);\n                        }\n                        catch (Exception ex)\n                        {\n                            throw HttpWebClientServiceException.Exception(url, ex);\n                        }\n                    }\n                }\n                catch (Exception ex)\n                {\n                    ExceptionHandler.LogRethrowException(ex);\n                    throw;\n                }\n            }\n\n            /// <summary>\n            /// Handles the download progress changed event.\n            /// </summary>\n            /// <param name=\"sender\">The sender.</param>\n            /// <param name=\"e\">The <see cref=\"DownloadProgressChangedEventArgs\" /> instance containing the event data.</param>\n            private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)\n            {\n                if (InvokeRequired)\n                {\n                    Dispatcher.Invoke(() => ProgressChanged(sender, e));\n                    return;\n                }\n\n                if (e.TotalBytesToReceive > 0)\n                {\n                    m_progressLabel.Text = $\"Downloading update ({e.ProgressPercentage}%, \" +\n                                           $\"{e.BytesReceived:N0} of {e.TotalBytesToReceive:N0} bytes received)...\";\n                    m_progressBar.Style = ProgressBarStyle.Continuous;\n\n                    // Under Vista and Windows 7 there is a lag when progress bar updates too quick.\n                    // This hackish way though solves this issue (in a way) as explained in\n                    // http://stackoverflow.com/questions/977278/how-can-i-make-the-progress-bar-update-fast-enough/1214147#1214147.\n                    m_progressBar.Value = e.ProgressPercentage;\n                    m_progressBar.Value = e.ProgressPercentage == m_progressBar.Minimum ||\n                                          e.ProgressPercentage == m_progressBar.Maximum\n                        ? e.ProgressPercentage\n                        : e.ProgressPercentage - 1;\n                }\n                else\n                {\n                    m_progressLabel.Text = $\"Downloading update ({e.BytesReceived:N0} bytes received)...\";\n                    m_progressBar.Style = ProgressBarStyle.Marquee;\n                }\n            }\n\n            /// <summary>\n            /// Called when download is completed.\n            /// </summary>\n            /// <param name=\"sender\">The sender.</param>\n            /// <param name=\"e\">The <see cref=\"AsyncCompletedEventArgs\"/> instance containing the event data.</param>\n            private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)\n            {\n                if (InvokeRequired)\n                {\n                    Dispatcher.Invoke(() => DownloadCompleted(sender, e));\n                    return;\n                }\n\n                if (e.Error != null)\n                    ExceptionHandler.LogException(e.Error, true);\n\n                if (e.Cancelled)\n                {\n                    if (File.Exists(m_tempFilename))\n                        FileHelper.DeleteFile(m_tempFilename);\n                }\n\n                // Set the download state in the tag for conditional check\n                Tag = m_datafile.IsDownloaded = !e.Cancelled && (e.Error == null);\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Updater/DataUpdateDownloadForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/Updater/DataUpdateNotifyForm.Designer.cs",
    "content": "namespace EVEMon.Updater\n{\n    partial class DataUpdateNotifyForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.btnUpdate = new System.Windows.Forms.Button();\n            this.btnLater = new System.Windows.Forms.Button();\n            this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();\n            this.lblChangedFiles = new System.Windows.Forms.Label();\n            this.tbFiles = new System.Windows.Forms.TextBox();\n            this.lblUpdateNotes = new System.Windows.Forms.Label();\n            this.tbNotes = new System.Windows.Forms.TextBox();\n            this.tableLayoutPanel.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // btnUpdate\n            // \n            this.btnUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnUpdate.Location = new System.Drawing.Point(547, 417);\n            this.btnUpdate.Name = \"btnUpdate\";\n            this.btnUpdate.Size = new System.Drawing.Size(75, 23);\n            this.btnUpdate.TabIndex = 0;\n            this.btnUpdate.Text = \"Update...\";\n            this.btnUpdate.UseVisualStyleBackColor = true;\n            this.btnUpdate.Click += new System.EventHandler(this.btnUpdate_Click);\n            // \n            // btnLater\n            // \n            this.btnLater.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnLater.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnLater.Location = new System.Drawing.Point(421, 417);\n            this.btnLater.Name = \"btnLater\";\n            this.btnLater.Size = new System.Drawing.Size(120, 23);\n            this.btnLater.TabIndex = 1;\n            this.btnLater.Text = \"Remind Me Later\";\n            this.btnLater.UseVisualStyleBackColor = true;\n            this.btnLater.Click += new System.EventHandler(this.btnLater_Click);\n            // \n            // tableLayoutPanel\n            // \n            this.tableLayoutPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tableLayoutPanel.ColumnCount = 1;\n            this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel.Controls.Add(this.lblChangedFiles, 0, 0);\n            this.tableLayoutPanel.Controls.Add(this.tbFiles, 0, 1);\n            this.tableLayoutPanel.Controls.Add(this.lblUpdateNotes, 0, 2);\n            this.tableLayoutPanel.Controls.Add(this.tbNotes, 0, 3);\n            this.tableLayoutPanel.Location = new System.Drawing.Point(12, 12);\n            this.tableLayoutPanel.Name = \"tableLayoutPanel\";\n            this.tableLayoutPanel.RowCount = 4;\n            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel.Size = new System.Drawing.Size(610, 385);\n            this.tableLayoutPanel.TabIndex = 3;\n            // \n            // lblChangedFiles\n            // \n            this.lblChangedFiles.AutoSize = true;\n            this.lblChangedFiles.Location = new System.Drawing.Point(3, 0);\n            this.lblChangedFiles.Name = \"lblChangedFiles\";\n            this.lblChangedFiles.Size = new System.Drawing.Size(192, 39);\n            this.lblChangedFiles.TabIndex = 0;\n            this.lblChangedFiles.Text = \"A data update for EVEMon is available.\\r\\n\\r\\nData Files:\";\n            // \n            // tbFiles\n            // \n            this.tbFiles.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tbFiles.Location = new System.Drawing.Point(3, 42);\n            this.tbFiles.Multiline = true;\n            this.tbFiles.Name = \"tbFiles\";\n            this.tbFiles.ReadOnly = true;\n            this.tbFiles.RightToLeft = System.Windows.Forms.RightToLeft.No;\n            this.tbFiles.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n            this.tbFiles.Size = new System.Drawing.Size(604, 154);\n            this.tbFiles.TabIndex = 4;\n            // \n            // lblUpdateNotes\n            // \n            this.lblUpdateNotes.AutoSize = true;\n            this.lblUpdateNotes.Location = new System.Drawing.Point(3, 199);\n            this.lblUpdateNotes.Name = \"lblUpdateNotes\";\n            this.lblUpdateNotes.Size = new System.Drawing.Size(76, 26);\n            this.lblUpdateNotes.TabIndex = 5;\n            this.lblUpdateNotes.Text = \"\\r\\nUpdate Notes:\";\n            // \n            // tbNotes\n            // \n            this.tbNotes.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tbNotes.Location = new System.Drawing.Point(3, 228);\n            this.tbNotes.Multiline = true;\n            this.tbNotes.Name = \"tbNotes\";\n            this.tbNotes.ReadOnly = true;\n            this.tbNotes.RightToLeft = System.Windows.Forms.RightToLeft.No;\n            this.tbNotes.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n            this.tbNotes.Size = new System.Drawing.Size(604, 154);\n            this.tbNotes.TabIndex = 1;\n            // \n            // DataUpdateNotifyForm\n            // \n            this.AcceptButton = this.btnUpdate;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.CancelButton = this.btnLater;\n            this.ClientSize = new System.Drawing.Size(634, 452);\n            this.Controls.Add(this.tableLayoutPanel);\n            this.Controls.Add(this.btnLater);\n            this.Controls.Add(this.btnUpdate);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"DataUpdateNotifyForm\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Data Update Available\";\n            this.tableLayoutPanel.ResumeLayout(false);\n            this.tableLayoutPanel.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Button btnUpdate;\n        private System.Windows.Forms.Button btnLater;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;\n        private System.Windows.Forms.Label lblChangedFiles;\n        private System.Windows.Forms.TextBox tbFiles;\n        private System.Windows.Forms.TextBox tbNotes;\n        private System.Windows.Forms.Label lblUpdateNotes;\n    }\n}"
  },
  {
    "path": "src/EVEMon/Updater/DataUpdateNotifyForm.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Serialization.PatchXml;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Updater\n{\n    public partial class DataUpdateNotifyForm : EVEMonForm\n    {\n        private readonly DataUpdateAvailableEventArgs m_args;\n        private bool m_formClosing;\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        private DataUpdateNotifyForm()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public DataUpdateNotifyForm(DataUpdateAvailableEventArgs args)\n            : this()\n        {\n            m_args = args;\n        }\n\n        /// <summary>\n        /// On load we update the informations.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            StringBuilder changedFiles = new StringBuilder();\n            StringBuilder notes = new StringBuilder();\n\n            foreach (SerializableDatafile versionDatafile in m_args.ChangedFiles)\n            {\n                changedFiles\n                    .AppendLine($\"Filename: {versionDatafile.Name.PadRight(35)}\\tReleased: {versionDatafile.Date}\");\n\n                notes\n                    .AppendLine(versionDatafile.Message)\n                    .AppendLine();\n            }\n            tbFiles.Lines = changedFiles.ToString().TrimEnd(Environment.NewLine.ToCharArray()).Split(Environment.NewLine.ToCharArray());\n            tbNotes.Lines = notes.ToString().TrimEnd(Environment.NewLine.ToCharArray()).Replace(\"\\r\", string.Empty).Split('\\n');\n        }\n\n        /// <summary>\n        /// Handles the FormClosing event of the DataUpdateNotifyForm control.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"FormClosingEventArgs\"/> instance containing the event data.</param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            if (!Visible ||\n                (e.CloseReason != CloseReason.ApplicationExitCall && e.CloseReason != CloseReason.TaskManagerClosing &&\n                 e.CloseReason != CloseReason.WindowsShutDown))\n            {\n                return;\n            }\n\n            m_formClosing = true;\n        }\n\n        /// <summary>\n        /// Occurs on \"update\" button click.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnUpdate_Click(object sender, EventArgs e)\n        {\n            DialogResult result = DialogResult.Yes;\n            int changedFilesCount = m_args.ChangedFiles.Count, newCount = changedFilesCount;\n\n            // Delete the EVE Flags xml file from cache to force a refetch on next startup\n            FileHelper.DeleteFile(LocalXmlCache.GetFileInfo(EveFlag.Filename).FullName);\n\n            while (newCount != 0 && result == DialogResult.Yes)\n            {\n                if (m_formClosing)\n                    break;\n\n                DownloadUpdates();\n                newCount = m_args.ChangedFiles.Count;\n\n                if (newCount == 0)\n                    break;\n\n                // One or more files failed\n                string message = newCount +\n                    $\" file{(newCount.S())} failed to download, do you wish to try again?\";\n\n                result = MessageBox.Show(message, @\"Failed Download\", MessageBoxButtons.YesNo);\n            }\n\n            // If no files were updated, abort the update process\n            DialogResult = newCount == changedFilesCount ? DialogResult.Abort : DialogResult.OK;\n        }\n\n        /// <summary>\n        /// Downloads the updates.\n        /// </summary>\n        private void DownloadUpdates()\n        {\n            List<SerializableDatafile> datafiles = new List<SerializableDatafile>();\n\n            // Copy the new datafiles to a new list\n            datafiles.AddRange(m_args.ChangedFiles);\n\n            // Show the download dialog, which will download the files\n            using (DataUpdateDownloadForm form = new DataUpdateDownloadForm(datafiles))\n            {\n                form.ShowDialog();\n            }\n\n            foreach (SerializableDatafile versionDatafile in datafiles.Where(datafile => datafile.IsDownloaded))\n            {\n                string oldFilename = Path.Combine(EveMonClient.EVEMonDataDir, versionDatafile.Name);\n                string tempFilename = $\"{oldFilename}.tmp\";\n\n                Datafile downloadedDatafile = new Datafile(Path.GetFileName(tempFilename));\n\n                if (versionDatafile.MD5Sum != null && versionDatafile.MD5Sum != downloadedDatafile.MD5Sum)\n                {\n                    FileHelper.DeleteFile(tempFilename);\n                    continue;\n                }\n\n                UpdateManager.ReplaceDatafile(oldFilename, tempFilename);\n                m_args.ChangedFiles.Remove(versionDatafile);\n            }\n        }\n\n        /// <summary>\n        /// Occurs on \"remind me later\" button click.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnLater_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Abort;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Updater/DataUpdateNotifyForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/Updater/UpdateDownloadForm.Designer.cs",
    "content": "namespace EVEMon.Updater\n{\n    partial class UpdateDownloadForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.pbProgress = new System.Windows.Forms.ProgressBar();\n            this.ProgressLabel = new System.Windows.Forms.Label();\n            this.btCancel = new System.Windows.Forms.Button();\n            this.SuspendLayout();\n            // \n            // pbProgress\n            // \n            this.pbProgress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.pbProgress.Location = new System.Drawing.Point(12, 12);\n            this.pbProgress.Name = \"pbProgress\";\n            this.pbProgress.Size = new System.Drawing.Size(388, 18);\n            this.pbProgress.TabIndex = 0;\n            // \n            // ProgressLabel\n            // \n            this.ProgressLabel.AutoSize = true;\n            this.ProgressLabel.Location = new System.Drawing.Point(9, 33);\n            this.ProgressLabel.Name = \"ProgressLabel\";\n            this.ProgressLabel.Size = new System.Drawing.Size(114, 13);\n            this.ProgressLabel.TabIndex = 1;\n            this.ProgressLabel.Text = \"Downloading update...\";\n            // \n            // btCancel\n            // \n            this.btCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btCancel.Location = new System.Drawing.Point(325, 52);\n            this.btCancel.Name = \"btCancel\";\n            this.btCancel.Size = new System.Drawing.Size(75, 23);\n            this.btCancel.TabIndex = 2;\n            this.btCancel.Text = \"Cancel\";\n            this.btCancel.UseVisualStyleBackColor = true;\n            this.btCancel.Click += new System.EventHandler(this.btCancel_Click);\n            // \n            // UpdateDownloadForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.ClientSize = new System.Drawing.Size(412, 87);\n            this.ControlBox = false;\n            this.Controls.Add(this.btCancel);\n            this.Controls.Add(this.ProgressLabel);\n            this.Controls.Add(this.pbProgress);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"UpdateDownloadForm\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Downloading Update...\";\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ProgressBar pbProgress;\n        private System.Windows.Forms.Label ProgressLabel;\n        private System.Windows.Forms.Button btCancel;\n    }\n}"
  },
  {
    "path": "src/EVEMon/Updater/UpdateDownloadForm.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing System.IO;\nusing System.Net;\nusing System.Windows.Forms;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Threading;\n\nnamespace EVEMon.Updater\n{\n    public partial class UpdateDownloadForm : EVEMonForm\n    {\n        private readonly Uri m_url;\n        private readonly string m_fileName;\n        private WebClient m_client;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"UpdateDownloadForm\"/> class.\n        /// </summary>\n        private UpdateDownloadForm()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"UpdateDownloadForm\"/> class.\n        /// </summary>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"fileName\">The filename.</param>\n        public UpdateDownloadForm(Uri url, string fileName)\n            : this()\n        {\n            m_url = url;\n            m_fileName = fileName;\n        }\n\n        /// <summary>\n        /// Handles the Shown event of the UpdateDownloadForm control.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        protected override void OnShown(EventArgs e)\n        {\n            base.OnShown(e);\n\n            string urlValidationError;\n            if (!HttpWebClientService.IsValidURL(m_url, out urlValidationError))\n                throw new ArgumentException(urlValidationError);\n\n            try\n            {\n                using (m_client = HttpWebClientService.GetWebClient())\n                {\n                    m_client.DownloadFileCompleted += DownloadCompleted;\n                    m_client.DownloadProgressChanged += ProgressChanged;\n\n                    try\n                    {\n                        m_client.DownloadFileAsync(m_url, m_fileName);\n                    }\n                    catch (WebException ex)\n                    {\n                        throw HttpWebClientServiceException.HttpWebClientException(m_url, ex);\n                    }\n                    catch (Exception ex)\n                    {\n                        throw HttpWebClientServiceException.Exception(m_url, ex);\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                ExceptionHandler.LogRethrowException(ex);\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Handles the FormClosing event of the UpdateDownloadForm control.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"FormClosingEventArgs\"/> instance containing the event data.</param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            if (!Visible || (e.CloseReason != CloseReason.ApplicationExitCall && e.CloseReason != CloseReason.TaskManagerClosing &&\n                e.CloseReason != CloseReason.WindowsShutDown))\n            {\n                return;\n            }\n\n            m_client?.CancelAsync();\n        }\n\n        /// <summary>\n        /// Handles the download progress changed event.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"DownloadProgressChangedEventArgs\" /> instance containing the event data.</param>\n        private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)\n        {\n            if (InvokeRequired)\n            {\n                Dispatcher.Invoke(() => ProgressChanged(sender, e));\n                return;\n            }\n\n            if (e.TotalBytesToReceive > 0)\n            {\n                ProgressLabel.Text = $\"Downloading update ({e.ProgressPercentage}%, \" +\n                                     $\"{e.BytesReceived:N0} of {e.TotalBytesToReceive:N0} bytes received)...\";\n                pbProgress.Style = ProgressBarStyle.Continuous;\n\n                // Under Vista and Windows 7 there is a lag when progress bar updates too quick.\n                // This hackish way though solves this issue (in a way) as explained in\n                // http://stackoverflow.com/questions/977278/how-can-i-make-the-progress-bar-update-fast-enough/1214147#1214147.\n                pbProgress.Value = e.ProgressPercentage;\n                pbProgress.Value = e.ProgressPercentage == pbProgress.Minimum ||\n                                   e.ProgressPercentage == pbProgress.Maximum\n                    ? e.ProgressPercentage\n                    : e.ProgressPercentage - 1;\n            }\n            else\n            {\n                ProgressLabel.Text = $\"Downloading update ({e.BytesReceived:N0} bytes received)...\";\n                pbProgress.Style = ProgressBarStyle.Marquee;\n            }\n        }\n\n        /// <summary>\n        /// Called when download is completed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"AsyncCompletedEventArgs\"/> instance containing the event data.</param>\n        private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)\n        {\n            if (InvokeRequired)\n            {\n                Dispatcher.Invoke(() => DownloadCompleted(sender, e));\n                return;\n            }\n\n            if (e.Error != null)\n            {\n                ExceptionHandler.LogException(e.Error, true);\n                DialogResult = DialogResult.Cancel;\n            }\n            else if (e.Cancelled)\n            {\n                DialogResult = DialogResult.Cancel;\n                if (File.Exists(m_fileName))\n                    FileHelper.DeleteFile(m_fileName);\n            }\n            else\n                DialogResult = DialogResult.OK;\n\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btCancel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btCancel_Click(object sender, EventArgs e)\n        {\n            m_client?.CancelAsync();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon/Updater/UpdateDownloadForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/Updater/UpdateNotifyForm.Designer.cs",
    "content": "namespace EVEMon.Updater\n{\n    partial class UpdateNotifyForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.btnUpdate = new System.Windows.Forms.Button();\n            this.btnLater = new System.Windows.Forms.Button();\n            this.btnIgnore = new System.Windows.Forms.Button();\n            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\n            this.labelInfo = new System.Windows.Forms.Label();\n            this.updateNotesTextBox = new System.Windows.Forms.RichTextBox();\n            this.cbAutoInstall = new System.Windows.Forms.CheckBox();\n            this.tableLayoutPanel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // btnUpdate\n            // \n            this.btnUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnUpdate.Location = new System.Drawing.Point(297, 426);\n            this.btnUpdate.Name = \"btnUpdate\";\n            this.btnUpdate.Size = new System.Drawing.Size(75, 23);\n            this.btnUpdate.TabIndex = 0;\n            this.btnUpdate.Text = \"Update...\";\n            this.btnUpdate.UseVisualStyleBackColor = true;\n            this.btnUpdate.Click += new System.EventHandler(this.btnUpdate_Click);\n            // \n            // btnLater\n            // \n            this.btnLater.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnLater.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnLater.Location = new System.Drawing.Point(171, 426);\n            this.btnLater.Name = \"btnLater\";\n            this.btnLater.Size = new System.Drawing.Size(120, 23);\n            this.btnLater.TabIndex = 1;\n            this.btnLater.Text = \"Remind Me Later\";\n            this.btnLater.UseVisualStyleBackColor = true;\n            this.btnLater.Click += new System.EventHandler(this.btnLater_Click);\n            // \n            // btnIgnore\n            // \n            this.btnIgnore.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnIgnore.Location = new System.Drawing.Point(50, 426);\n            this.btnIgnore.Name = \"btnIgnore\";\n            this.btnIgnore.Size = new System.Drawing.Size(115, 23);\n            this.btnIgnore.TabIndex = 2;\n            this.btnIgnore.Text = \"Ignore This Update\";\n            this.btnIgnore.UseVisualStyleBackColor = true;\n            this.btnIgnore.Click += new System.EventHandler(this.btnIgnore_Click);\n            // \n            // tableLayoutPanel1\n            // \n            this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tableLayoutPanel1.ColumnCount = 1;\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel1.Controls.Add(this.labelInfo, 0, 0);\n            this.tableLayoutPanel1.Controls.Add(this.updateNotesTextBox, 0, 1);\n            this.tableLayoutPanel1.Controls.Add(this.cbAutoInstall, 0, 2);\n            this.tableLayoutPanel1.Location = new System.Drawing.Point(12, 12);\n            this.tableLayoutPanel1.Name = \"tableLayoutPanel1\";\n            this.tableLayoutPanel1.RowCount = 3;\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.Size = new System.Drawing.Size(360, 408);\n            this.tableLayoutPanel1.TabIndex = 3;\n            // \n            // labelInfo\n            // \n            this.labelInfo.AutoSize = true;\n            this.labelInfo.Location = new System.Drawing.Point(3, 0);\n            this.labelInfo.Name = \"labelInfo\";\n            this.labelInfo.Size = new System.Drawing.Size(226, 78);\n            this.labelInfo.TabIndex = 0;\n            this.labelInfo.Text = \"An EVEMon update is available.\\r\\n\\r\\nCurrent version: {0}\\r\\nNewest version: {1}\\r\\n\\r\\nTh\" +\n    \"e newest version has the following updates:\";\n            // \n            // updateNotesTextBox\n            // \n            this.updateNotesTextBox.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.updateNotesTextBox.Location = new System.Drawing.Point(3, 81);\n            this.updateNotesTextBox.Name = \"updateNotesTextBox\";\n            this.updateNotesTextBox.Size = new System.Drawing.Size(354, 301);\n            this.updateNotesTextBox.TabIndex = 1;\n            this.updateNotesTextBox.Text = \"\";\n            // \n            // cbAutoInstall\n            // \n            this.cbAutoInstall.AutoSize = true;\n            this.cbAutoInstall.Location = new System.Drawing.Point(3, 388);\n            this.cbAutoInstall.Name = \"cbAutoInstall\";\n            this.cbAutoInstall.Size = new System.Drawing.Size(172, 17);\n            this.cbAutoInstall.TabIndex = 2;\n            this.cbAutoInstall.Text = \"Automatically install this update\";\n            this.cbAutoInstall.UseVisualStyleBackColor = true;\n            // \n            // UpdateNotifyForm\n            // \n            this.AcceptButton = this.btnUpdate;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.CancelButton = this.btnLater;\n            this.ClientSize = new System.Drawing.Size(384, 461);\n            this.Controls.Add(this.tableLayoutPanel1);\n            this.Controls.Add(this.btnIgnore);\n            this.Controls.Add(this.btnLater);\n            this.Controls.Add(this.btnUpdate);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"UpdateNotifyForm\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Update Available\";\n            this.tableLayoutPanel1.ResumeLayout(false);\n            this.tableLayoutPanel1.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Button btnUpdate;\n        private System.Windows.Forms.Button btnLater;\n        private System.Windows.Forms.Button btnIgnore;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\n        private System.Windows.Forms.Label labelInfo;\n        private System.Windows.Forms.RichTextBox updateNotesTextBox;\n        private System.Windows.Forms.CheckBox cbAutoInstall;\n\n\n\n    }\n}"
  },
  {
    "path": "src/EVEMon/Updater/UpdateNotifyForm.cs",
    "content": "using System;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.IO;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Updater\n{\n    public partial class UpdateNotifyForm : EVEMonForm\n    {\n        private readonly UpdateAvailableEventArgs m_args;\n        private bool m_formClosing;\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        private UpdateNotifyForm()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public UpdateNotifyForm(UpdateAvailableEventArgs args)\n            : this()\n        {\n            m_args = args;\n        }\n\n        /// <summary>\n        /// On form shown we subcribe the event handler.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n            // Set the basic update information\n            labelInfo.Text = string.Format(labelInfo.Text, m_args.CurrentVersion, m_args.NewestVersion);\n            // Set the detailed update information (from the XML)\n            string updMessage = m_args.UpdateMessage;\n            updMessage = updMessage.Replace(\"\\r\", string.Empty);\n            updateNotesTextBox.Lines = updMessage.Split('\\n');\n\n            cbAutoInstall.Enabled = m_args.CanAutoInstall;\n            cbAutoInstall.Checked = m_args.CanAutoInstall;\n        }\n\n        /// <summary>\n        /// Handles the FormClosing event of the UpdateNotifyForm control.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"FormClosingEventArgs\"/> instance containing the event data.</param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n            if (Visible && (e.CloseReason == CloseReason.ApplicationExitCall || e.CloseReason ==\n                CloseReason.TaskManagerClosing || e.CloseReason == CloseReason.WindowsShutDown))\n                m_formClosing = true;\n        }\n        /// <summary>\n        /// Occurs on \"ignore\" button click.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnIgnore_Click(object sender, EventArgs e)\n        {\n            DialogResult dr = MessageBox.Show(Properties.Resources.PromptIgnoreUpdate,\n                @\"Ignore Update?\", MessageBoxButtons.YesNo, MessageBoxIcon.Question,\n                MessageBoxDefaultButton.Button2);\n            if (dr != DialogResult.No)\n            {\n                Settings.Updates.MostRecentDeniedUpgrade = m_args.NewestVersion.ToString();\n                Settings.Save();\n                DialogResult = DialogResult.Ignore;\n            }\n        }\n\n        /// <summary>\n        /// Occurs on \"update\" button click.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnUpdate_Click(object sender, EventArgs e)\n        {\n            if (cbAutoInstall.Enabled && cbAutoInstall.Checked)\n            {\n                DialogResult result = DialogResult.Yes;\n                while (result == DialogResult.Yes && !DownloadUpdate())\n                {\n                    // File download failed\n                    result = MessageBox.Show(Properties.Resources.ErrorDownloadFailure,\n                        @\"Failed Download\", MessageBoxButtons.YesNo);\n                }\n            }\n            else\n            {\n                Util.OpenURL(m_args.ForumUrl);\n                DialogResult = DialogResult.OK;\n            }\n        }\n\n        /// <summary>\n        /// Downloads the update.\n        /// </summary>\n        private bool DownloadUpdate()\n        {\n            string filename = Path.GetFileName(m_args.InstallerUrl.AbsoluteUri);\n            if (string.IsNullOrWhiteSpace(filename))\n                return false;\n\n            string localFilename = Path.Combine(EveMonClient.EVEMonDataDir, filename);\n\n            // If the file already exists delete it\n            if (File.Exists(localFilename))\n                UpdateManager.DeleteInstallationFiles();\n\n            using (UpdateDownloadForm form = new UpdateDownloadForm(m_args.InstallerUrl, localFilename))\n            {\n                if (m_formClosing || form.ShowDialog() != DialogResult.OK)\n                    return false;\n\n                string downloadedFileMD5Sum = Util.CreateMD5From(localFilename);\n                if (m_args.MD5Sum != null && m_args.MD5Sum != downloadedFileMD5Sum)\n                    return false;\n\n                UpdateManager.DeleteDataFiles();\n                ExecutePatcher(localFilename, m_args.AutoInstallArguments);\n                DialogResult = DialogResult.OK;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Initiates the auto installer.\n        /// </summary>\n        /// <param name=\"filename\"></param>\n        /// <param name=\"args\"></param>\n        private void ExecutePatcher(string filename, string args)\n        {\n            if (!File.Exists(filename))\n            {\n                MessageBox.Show(this, Properties.Resources.ErrorInstallerNotFound,\n                    @\"File not found\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return;\n            }\n\n            try\n            {\n                Process.Start(filename, args);\n            }\n            catch (InvalidOperationException e)\n            {\n                ExceptionHandler.LogException(e, true);\n                if (File.Exists(filename))\n                    FileHelper.DeleteFile(filename);\n            }\n        }\n\n        /// <summary>\n        /// Occurs on \"remind me later\" button click.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnLater_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Abort;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon/Updater/UpdateNotifyForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon/app.manifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n  <assemblyIdentity version=\"1.0.0.0\" name=\"MyApplication.app\"/>\n  <trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v2\">\n    <security>\n      <requestedPrivileges xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n        <!-- UAC Manifest Options\n             If you want to change the Windows User Account Control level replace the \n             requestedExecutionLevel node with one of the following.\n\n        <requestedExecutionLevel  level=\"asInvoker\" uiAccess=\"false\" />\n        <requestedExecutionLevel  level=\"requireAdministrator\" uiAccess=\"false\" />\n        <requestedExecutionLevel  level=\"highestAvailable\" uiAccess=\"false\" />\n\n            Specifying requestedExecutionLevel element will disable file and registry virtualization. \n            Remove this element if your application requires this virtualization for backwards\n            compatibility.\n        -->\n        <requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" />\n      </requestedPrivileges>\n    </security>\n  </trustInfo>\n\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- A list of the Windows versions that this application has been tested on and is\n           designed to work with. Uncomment the appropriate elements and Windows will \n           automatically selected the most compatible environment. -->\n\n      <!-- Windows Vista -->\n      <supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\" />\n\n      <!-- Windows 7 -->\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" />\n\n      <!-- Windows 8 -->\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" />\n\n      <!-- Windows 8.1 -->\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" />\n\n      <!-- Windows 10 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" />\n\n    </application>\n  </compatibility>\n\n  <!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher\n       DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need \n       to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should \n       also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. -->\n  <!--\n  <application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n    <windowsSettings>\n      <dpiAware xmlns=\"http://schemas.microsoft.com/SMI/2005/WindowsSettings\">true</dpiAware>\n    </windowsSettings>\n  </application>\n  -->\n\n  <!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->\n  <!--\n  <dependency>\n    <dependentAssembly>\n      <assemblyIdentity\n          type=\"win32\"\n          name=\"Microsoft.Windows.Common-Controls\"\n          version=\"6.0.0.0\"\n          processorArchitecture=\"*\"\n          publicKeyToken=\"6595b64144ccf1df\"\n          language=\"*\"\n        />\n    </dependentAssembly>\n  </dependency>\n  -->\n\n</assembly>\n"
  },
  {
    "path": "src/EVEMon.Common/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <sectionGroup name=\"userSettings\" type=\"System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n      <section name=\"EVEMon.Common.CloudStorageServices.OneDrive.OneDriveCloudStorageServiceSettings\" type=\"System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" allowExeDefinition=\"MachineToLocalUser\" requirePermission=\"false\" />\n      <section name=\"EVEMon.Common.CloudStorageServices.Dropbox.DropboxCloudStorageServiceSettings\" type=\"System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" allowExeDefinition=\"MachineToLocalUser\" requirePermission=\"false\" />\n      <section name=\"EVEMon.Common.CloudStorageServices.CloudStorageServiceSettings\" type=\"System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" allowExeDefinition=\"MachineToLocalUser\" requirePermission=\"false\" />\n    </sectionGroup>\n    <sectionGroup name=\"applicationSettings\" type=\"System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n      <section name=\"EVEMon.Common.CloudStorageServices.OneDrive.OneDriveCloudStorageServiceSettings\" type=\"System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" requirePermission=\"false\" />\n      <section name=\"EVEMon.Common.CloudStorageServices.GoogleDrive.GoogleDriveCloudStorageServiceSettings\" type=\"System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" requirePermission=\"false\" />\n      <section name=\"EVEMon.Common.CloudStorageServices.Dropbox.DropboxCloudStorageServiceSettings\" type=\"System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" requirePermission=\"false\" />\n    </sectionGroup>\n  </configSections>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" culture=\"neutral\" publicKeyToken=\"30ad4fe6b2a6aeed\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-10.0.0.0\" newVersion=\"10.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.36.0.0\" newVersion=\"1.36.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis.Core\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.42.0.0\" newVersion=\"1.42.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n<startup><supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\" /></startup></configuration>\n"
  },
  {
    "path": "src/EVEMon.Common/AsyncPump.cs",
    "content": "using System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.Common\n{\n    public sealed class AsyncPump\n    {\n        /// <summary>\n        /// Runs the specified function.\n        /// </summary>\n        /// <param name=\"func\">The function.</param>\n        public static void Run(Func<Task> func)\n        {\n            SynchronizationContext prevCtx = SynchronizationContext.Current;\n            try\n            {\n                var syncCtx = new SingleThreadSynchronizationContext();\n                SynchronizationContext.SetSynchronizationContext(syncCtx);\n\n                Task task = func();\n                task.ContinueWith(_ => syncCtx.Complete(), TaskScheduler.Default);\n\n                syncCtx.RunOnCurrentThread();\n\n                task.GetAwaiter().GetResult();\n            }\n            finally\n            {\n                SynchronizationContext.SetSynchronizationContext(prevCtx);\n            }\n        }\n\n        private sealed class SingleThreadSynchronizationContext : SynchronizationContext\n        {\n            private readonly\n                BlockingCollection<KeyValuePair<SendOrPostCallback, object>> m_queue =\n                    new BlockingCollection<KeyValuePair<SendOrPostCallback, object>>();\n\n            /// <summary>\n            /// Posts the specified callback.\n            /// </summary>\n            /// <param name=\"d\">The callback.</param>\n            /// <param name=\"state\">The state.</param>\n            public override void Post(SendOrPostCallback d, object state)\n            {\n                m_queue.Add(new KeyValuePair<SendOrPostCallback, object>(d, state));\n            }\n\n            /// <summary>\n            /// Runs the on current thread.\n            /// </summary>\n            public void RunOnCurrentThread()\n            {\n                KeyValuePair<SendOrPostCallback, object> workItem;\n                while (m_queue.TryTake(out workItem, Timeout.Infinite))\n                    workItem.Key(workItem.Value);\n            }\n\n            /// <summary>\n            /// Completes this instance.\n            /// </summary>\n            public void Complete()\n            {\n                m_queue.CompleteAdding();\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Attributes/EnforceUIThreadAffinity.cs",
    "content": "﻿using System;\n\n#if !NO_THREAD_SAFETY\nusing PostSharp.Laos;\nusing PostSharp.Reflection;\nusing PostSharp.Extensibility;\n#endif\n\nnamespace EVEMon.Common.Attributes\n{\n#if NO_THREAD_SAFETY\n    internal sealed class EnforceUIThreadAffinityAttribute : Attribute\n    {\n    }\n#else\n    /// <summary>\n    /// All public and internal descendant methods (methods, properties accessors, etc - not constructors) will begin with a call to AssertAccess() (will check the execution performs on the <see cref=\"DataObject.CommonActor\"/> thread)\n    /// </summary>\n    [Serializable]\n    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Method)]\n\n    // Propagation rule, apply to all public and internal descendant methods (on a class, will transform all methods, props accessors, etc)\n    [MulticastAttributeUsage(MulticastTargets.Method, Inheritance = MulticastInheritance.Multicast,\n        TargetMemberAttributes = \n        MulticastAttributes.AnyScope | \n        MulticastAttributes.Managed | MulticastAttributes.NonAbstract | \n        MulticastAttributes.Public | MulticastAttributes.Internal | MulticastAttributes.InternalOrProtected)]\n\n    // Method\n    internal sealed class EnforceUIThreadAffinityAttribute : OnMethodBoundaryAspect\n    {\n        // Specify the code to write at the beginning of every public / internal method\n        public override void OnEntry(MethodExecutionEventArgs context)\n        {\n            Dispatcher.AssertAccess();\n        }\n    }\n#endif\n}"
  },
  {
    "path": "src/EVEMon.Common/Attributes/ForcedOnStartupAttribute.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.Attributes\n{\n    /// <summary>\n    /// This attribute marks the API methods which are always queried on startup.\n    /// </summary>\n    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]\n    public sealed class ForcedOnStartupAttribute : Attribute\n    {\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Attributes/FullKeyAttribute.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.Attributes\n{\n    /// <summary>\n    /// An attribute used to mark the API methods which require a full API key.\n    /// </summary>\n    public sealed class FullKeyAttribute : Attribute\n    {\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Attributes/HeaderAttribute.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.Attributes\n{\n    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]\n    public sealed class HeaderAttribute : Attribute\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"HeaderAttribute\"/> class.\n        /// </summary>\n        /// <param name=\"header\">The header.</param>\n        public HeaderAttribute(string header)\n        {\n            Header = header;\n        }\n\n        /// <summary>\n        /// Gets the header.\n        /// </summary>\n        /// <value>The header.</value>\n        public string Header { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Attributes/Internals/NotifyPropertyChanged.Subs.cs",
    "content": "﻿\n#if !NO_THREAD_SAFETY\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.ComponentModel;\nusing PostSharp.Laos;\n\nnamespace EVEMon.Common.Attributes.Internals\n{\n    /// <summary>\n    /// Provides an implementation for <see cref=\"INotifyPropertyChanged\"/>. It never inherited, just reimplemented by our custom attributes.\n    /// </summary>\n    internal class NotifyPropertyChangedImplementation : INotifyPropertyChanged \n    { \n        private object instance;\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        public NotifyPropertyChangedImplementation(object instance) \n        { \n            this.instance = instance; \n        } \n        \n        public void OnPropertyChanged(string propertyName) \n        { \n            if (this.PropertyChanged != null) \n            { \n                this.PropertyChanged(this.instance, new PropertyChangedEventArgs(propertyName)); \n            } \n        } \n    }\n\n    /// <summary>\n    /// Auto-implements <see cref=\"INotifyPropertyChanged\"/> on the class, copying the <see cref=\"NotifyPropertyChangedImplementation\"/> implementation.\n    /// This attribute does not transform the property setters though.\n    /// </summary>\n    [Serializable]\n    internal class AddNotifyPropertyChangedInterfaceSubAspect : CompositionAspect\n    {\n        public override object CreateImplementationObject(InstanceBoundLaosEventArgs eventArgs) \n        { \n            return new NotifyPropertyChangedImplementation(eventArgs.Instance); \n        }    \n        \n        public override Type GetPublicInterface(Type containerType) \n        { \n            return typeof(INotifyPropertyChanged); \n        }\n\n        public override CompositionAspectOptions GetOptions()\n        {\n            return CompositionAspectOptions.GenerateImplementationAccessor | CompositionAspectOptions.IgnoreIfAlreadyImplemented;\n        }\n    }\n\n    /// <summary>\n    /// Auto-fires the <see cref=\"INotifyPropertyChanged.PropertyChanged\"/> event at the end of the method.\n    /// </summary>\n    [Serializable]\n    internal class OnPropertySetSubAspect : OnMethodBoundaryAspect\n    {\n        string propertyName; \n        \n        public OnPropertySetSubAspect(string propertyName, NotifyPropertyChangedAttribute parent) \n        { \n            this.AspectPriority = parent.AspectPriority; \n            this.propertyName = propertyName; \n        }\n\n        public override void OnSuccess(MethodExecutionEventArgs eventArgs)\n        {\n            var instance = (IComposed<INotifyPropertyChanged>)eventArgs.Instance;\n            var implementation = (NotifyPropertyChangedImplementation)instance.GetImplementation(eventArgs.InstanceCredentials); \n            implementation.OnPropertyChanged(this.propertyName);\n        }\n    }\n\n}\n#endif"
  },
  {
    "path": "src/EVEMon.Common/Attributes/ParentAttribute.cs",
    "content": "﻿using System;\nusing System.Linq;\n\nnamespace EVEMon.Common.Attributes\n{\n    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]\n    public sealed class ParentAttribute : Attribute\n    {\n        public ParentAttribute(params object[] parents)\n        {\n            Parents = parents?.Where(x => x as Enum != null).Select(x => (Enum)x).ToArray();\n        }\n\n        public Enum[] Parents { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Attributes/UpdateAttribute.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.Common.Attributes\n{\n    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]\n    public sealed class UpdateAttribute : Attribute\n    {\n        #region Constructors\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"defaultPeriod\">Default length of time between updates.</param>\n        /// <param name=\"minimum\">Minimum length of time between updates.</param>\n        public UpdateAttribute(UpdatePeriod defaultPeriod, UpdatePeriod minimum)\n        {\n            CreateUpdateAttribute(defaultPeriod, minimum, UpdatePeriod.Week);\n        }\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"defaultPeriod\">Default length of time between updates.</param>\n        /// <param name=\"minimum\">Minimum length of time between updates.</param>\n        /// <param name=\"maximum\">Maximum length of time between updates.</param>\n        public UpdateAttribute(UpdatePeriod defaultPeriod, UpdatePeriod minimum, UpdatePeriod maximum)\n        {\n            CreateUpdateAttribute(defaultPeriod, minimum, maximum);\n        }\n\n        /// <summary>\n        /// Constructor helper method.\n        /// </summary>\n        /// <param name=\"defaultPeriod\">Default length of time between updates.</param>\n        /// <param name=\"minimum\">Minimum length of time between updates.</param>\n        /// <param name=\"maximum\">Maximum length of time between updates.</param>\n        private void CreateUpdateAttribute(UpdatePeriod defaultPeriod, UpdatePeriod minimum, UpdatePeriod maximum)\n        {\n            DefaultPeriod = defaultPeriod;\n            Minimum = minimum;\n            Maximum = maximum;\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the default update period.\n        /// </summary>\n        /// <value>\n        /// The default period.\n        /// </value>\n        public UpdatePeriod DefaultPeriod { get; private set; }\n\n        /// <summary>\n        /// Gets the minimum update period.\n        /// </summary>\n        /// <value>\n        /// The minimum.\n        /// </value>\n        public UpdatePeriod Minimum { get; private set; }\n\n        /// <summary>\n        /// Gets the maximum update period.\n        /// </summary>\n        /// <value>\n        /// The maximum.\n        /// </value>\n        public UpdatePeriod Maximum { get; private set; }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/AuthenticationSteps.cs",
    "content": "namespace EVEMon.Common.CloudStorageServices\n{\n    public enum AuthenticationSteps\n    {\n        One,\n        Two\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/CloudStorageServiceAPIFile.cs",
    "content": "namespace EVEMon.Common.CloudStorageServices\n{\n    public sealed class CloudStorageServiceAPIFile\n    {\n        /// <summary>\n        /// Gets or sets the name of the file.\n        /// </summary>\n        /// <value>\n        /// The name of the file.\n        /// </value>\n        public string FileName { get; set; }\n\n        /// <summary>\n        /// Gets or sets the content of the file.\n        /// </summary>\n        /// <value>\n        /// The content of the file.\n        /// </value>\n        public string FileContent { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/CloudStorageServiceProvider.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Web;\nusing System.Windows.Forms;\nusing System.Xml.Serialization;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.Threading;\n\nnamespace EVEMon.Common.CloudStorageServices\n{\n    public abstract class CloudStorageServiceProvider\n    {\n        private bool m_queryPending;\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// Occurs when the credentials get checked with the cloud storage service provider.\n        /// </summary>\n        public static event EventHandler<CloudStorageServiceProviderEventArgs> CredentialsChecked;\n\n        /// <summary>\n        /// Occurs when the credentials of the cloud storage service provider get reset.\n        /// </summary>\n        public static event EventHandler<CloudStorageServiceProviderEventArgs> SettingsReset;\n\n        /// <summary>\n        /// Occurs when the file gets uploaded to the cloud storage service provider.\n        /// </summary>\n        public static event EventHandler<CloudStorageServiceProviderEventArgs> FileUploaded;\n\n        /// <summary>\n        /// Occurs when the file gets uploaded to the cloud storage service provider.\n        /// </summary>\n        public static event EventHandler<CloudStorageServiceProviderEventArgs> FileDownloaded;\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the name of the provider.\n        /// </summary>\n        /// <value>\n        /// The name.\n        /// </value>\n        public abstract string Name { get; }\n\n        /// <summary>\n        /// Gets the authentication steps.\n        /// </summary>\n        /// <value>\n        /// The authentication steps.\n        /// </value>\n        public abstract AuthenticationSteps AuthSteps { get; }\n\n        /// <summary>\n        /// Gets a value indicating whether this <see cref=\"CloudStorageServiceProvider\"/> is enabled.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if enabled; otherwise, <c>false</c>.\n        /// </value>\n        protected abstract bool Enabled { get; }\n\n        /// <summary>\n        /// Gets a value indicating whether the user is authenticated with the provider.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if the user is authenticated with the provider; otherwise, <c>false</c>.\n        /// </value>\n        [XmlIgnore]\n        public static bool IsAuthenticated { get; protected set; }\n\n        /// <summary>\n        /// Gets a value indicating whether the provider API credentials are stored.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the provider API credentials are stored; otherwise, <c>false</c>.\n        /// </value>\n        public virtual bool HasCredentialsStored => false;\n\n        /// <summary>\n        /// Gets a value indicating whether the provider supports compressed responses.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the provider supports compressed responses; otherwise, <c>false</c>.\n        /// </value>\n        protected virtual bool SupportsDataCompression => false;\n\n        /// <summary>\n        /// Gets the settings.\n        /// </summary>\n        /// <value>\n        /// The settings.\n        /// </value>\n        protected virtual ApplicationSettingsBase Settings => CloudStorageServiceSettings.Default;\n\n        /// <summary>\n        /// Gets the refferal link.\n        /// </summary>\n        /// <value>\n        /// The refferal link.\n        /// </value>\n        public virtual Uri RefferalLink => null;\n\n        /// <summary>\n        /// Gets the logo.\n        /// </summary>\n        /// <value>\n        /// The logo.\n        /// </value>\n        public virtual Image Logo => null;\n\n        /// <summary>\n        /// Gets the providers.\n        /// </summary>\n        /// <value>\n        /// The providers.\n        /// </value>\n        public static IEnumerable<CloudStorageServiceProvider> Providers\n            => Assembly.GetExecutingAssembly().GetTypes()\n                .Where(type => typeof(CloudStorageServiceProvider).IsAssignableFrom(type) &&\n                               type.GetConstructor(Type.EmptyTypes) != null)\n                .Select(type => Activator.CreateInstance(type) as CloudStorageServiceProvider)\n                .Where(provider => !string.IsNullOrWhiteSpace(provider.Name) && provider.Enabled)\n                .OrderBy(provider => provider.Name);\n\n        /// <summary>\n        /// Gets the content of the settings file url encoded.\n        /// </summary>\n        /// <value>\n        /// The settings file content URL encode.\n        /// </value>\n        protected static string SettingsFileContentUrlEncode\n            => HttpUtility.UrlEncode(File.ReadAllText(EveMonClient.SettingsFileNameFullPath));\n\n        /// <summary>\n        /// Gets the content of the settings file in a byte array.\n        /// </summary>\n        /// <value>\n        /// The settings file content byte array.\n        /// </value>\n        protected static byte[] SettingsFileContentByteArray\n            => Encoding.UTF8.GetBytes(File.ReadAllText(EveMonClient.SettingsFileNameFullPath));\n\n        /// <summary>\n        /// Gets the settings file name without extension.\n        /// </summary>\n        /// <value>\n        /// The settings file name without extension.\n        /// </value>\n        protected static string SettingsFileNameWithoutExtension\n            => Path.GetFileNameWithoutExtension(EveMonClient.SettingsFileName);\n\n        protected static Configuration Configuration\n            => ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);\n\n        #endregion\n\n\n        #region Abstract Methods\n\n        /// <summary>\n        /// Asynchronously checks that the provider authentication with credentials is valid.\n        /// </summary>\n        /// <param name=\"userId\">The user identifier.</param>\n        /// <param name=\"apiKey\">The API key.</param>\n        protected abstract Task<SerializableAPIResult<SerializableAPICredentials>>\n            CheckProviderAuthWithCredentialsIsValidAsync(uint userId, string apiKey);\n\n        /// <summary>\n        /// Asynchronously requests the provider an authentication code.\n        /// </summary>\n        protected abstract Task<SerializableAPIResult<SerializableAPICredentials>> RequestProviderAuthCodeAsync();\n\n        /// <summary>\n        /// Asynchronously checks the provider authentication code.\n        /// </summary>\n        /// <param name=\"code\">The code.</param>\n        protected abstract Task<SerializableAPIResult<SerializableAPICredentials>> CheckProviderAuthCodeAsync(string code);\n\n        /// <summary>\n        /// Asynchronously checks the authentication.\n        /// </summary>\n        protected abstract Task<SerializableAPIResult<SerializableAPICredentials>> CheckAuthenticationAsync();\n\n        /// <summary>\n        /// Asynchronously revokes the authorization.\n        /// </summary>\n        /// <returns></returns>\n        protected abstract Task<SerializableAPIResult<SerializableAPICredentials>> RevokeAuthorizationAsync();\n\n        /// <summary>\n        /// Asynchronously uploads the file.\n        /// </summary>\n        protected abstract Task<SerializableAPIResult<CloudStorageServiceAPIFile>> UploadFileAsync();\n\n        /// <summary>\n        /// Asynchronously downloads the file.\n        /// </summary>\n        protected abstract Task<SerializableAPIResult<CloudStorageServiceAPIFile>> DownloadFileAsync();\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Upgrades the settings.\n        /// </summary>\n        public static void UpgradeSettings()\n        {\n            // Quit if the settings file is of the current version\n            if (Configuration.HasFile)\n                return;\n\n            // Find the parent directory of the settings file\n            DirectoryInfo configFileParentDir = Directory.GetParent(Configuration.FilePath);\n\n            // Find the parent directory of the settings file directory\n            DirectoryInfo configFileParentParentDir = configFileParentDir.Parent;\n\n            // Quits if there is no parent directory\n            if (configFileParentParentDir == null)\n                return;\n\n            // If the parent directory doesn't exist delete all old settings folders\n            if (!Directory.Exists(configFileParentParentDir.FullName))\n            {\n                // Delete all old settings folders\n                DeleteOldSettingsFolders(configFileParentParentDir);\n\n                return;\n            }\n\n            // Upgrade the settings file to the current version\n            CloudStorageServiceSettings.Default.Upgrade();\n            foreach (CloudStorageServiceProvider provider in Providers)\n            {\n                provider.Settings.Upgrade();\n            }\n\n            // Delete all old settings files inside the settings folder\n            foreach (string directory in Directory.GetDirectories(configFileParentParentDir.FullName)\n                .Where(directory => directory != configFileParentDir.FullName))\n            {\n                // Delete the folder recursively\n                Directory.Delete(directory, true);\n            }\n\n            // Delete all old settings folders\n            DeleteOldSettingsFolders(configFileParentParentDir);\n        }\n\n        /// <summary>\n        /// Asynchronously requests an authentication code.\n        /// </summary>\n        public async Task RequestAuthCodeAsync()\n        {\n            if (m_queryPending || HasCredentialsStored)\n                return;\n\n            m_queryPending = true;\n\n            EveMonClient.Trace(\"Initiated\");\n\n            IsAuthenticated = false;\n\n            SerializableAPIResult<SerializableAPICredentials> result = await RequestProviderAuthCodeAsync().ConfigureAwait(false);\n\n            CredentialsChecked?.ThreadSafeInvoke(this, new CloudStorageServiceProviderEventArgs(result.Error?.ErrorMessage));\n\n            m_queryPending = false;\n\n            var resultText = result.HasError ? \"Failed\" : \"Completed\";\n            EveMonClient.Trace($\"CloudStorageServiceProvider.RequestAuthCodeAsync - {resultText}\", printMethod: false);\n        }\n\n        /// <summary>\n        /// Asynchronously checks the authentication code.\n        /// </summary>\n        /// <param name=\"code\">The code.</param>\n        public async Task CheckAuthCodeAsync(string code)\n        {\n            if (m_queryPending && AuthSteps == AuthenticationSteps.Two)\n                return;\n\n            m_queryPending = true;\n\n            EveMonClient.Trace(\"Initiated\");\n\n            SerializableAPIResult<SerializableAPICredentials> result = await CheckProviderAuthCodeAsync(code).ConfigureAwait(false);\n            \n            if (!result.HasError)\n                Settings.Save();\n\n            IsAuthenticated = !result.HasError && HasCredentialsStored;\n\n            CredentialsChecked?.ThreadSafeInvoke(this, new CloudStorageServiceProviderEventArgs(result.Error?.ErrorMessage));\n\n            m_queryPending = false;\n\n            var actionText = result.HasError ? \"Failed\" : \"Completed\";\n            EveMonClient.Trace($\"CloudStorageServiceProvider.CheckAuthCodeAsync - {actionText}\", printMethod: false);\n        }\n\n        /// <summary>\n        /// Synchronously checks the API authentication with credentials is valid.\n        /// </summary>\n        /// <param name=\"userID\">The user identifier.</param>\n        /// <param name=\"apiKey\">The API key.</param>\n        public bool CheckAPIAuthWithCredentialsIsValid(uint userID, string apiKey)\n            => !CheckProviderAuthWithCredentialsIsValidAsync(userID, apiKey).Result.HasError;\n\n        /// <summary>\n        /// Asynchronously checks the API authentication with credentials is valid.\n        /// </summary>\n        /// <param name=\"userID\">The user identifier.</param>\n        /// <param name=\"apiKey\">The API key.</param>\n        public async Task CheckAPIAuthWithCredentialsIsValidAsync(uint userID, string apiKey)\n        {\n            if (m_queryPending)\n                return;\n\n            m_queryPending = true;\n\n            EveMonClient.Trace(\"Initiated\");\n\n            IsAuthenticated = false;\n\n            SerializableAPIResult<SerializableAPICredentials> result =\n                await CheckProviderAuthWithCredentialsIsValidAsync(userID, apiKey).ConfigureAwait(false);\n\n            IsAuthenticated = !result.HasError;\n\n            CredentialsChecked?.ThreadSafeInvoke(this, new CloudStorageServiceProviderEventArgs(result.Error?.ErrorMessage));\n\n            m_queryPending = false;\n\n            var resultText = result.HasError ? \"Failed\" : \"Completed\";\n            EveMonClient.Trace($\"CloudStorageServiceProvider.CheckAPIAuthWithCredentialsIsValidAsync - {resultText}\",\n                printMethod: false);\n        }\n\n        /// <summary>\n        /// Synchronously checks that API authentication is valid.\n        /// </summary>\n        /// <remarks>Because only Google and Dropbox are correctly implementing the use of \"<![CDATA[ Task<T>.Result ]]>\"\n        /// we are forced to use \"<![CDATA[ Task.Run ]]>\" to avoid deadlocks.\n        /// When the rest of the providers implement it correctly it should be removed.\n        /// </remarks>\n        public bool CheckAPIAuthIsValid()\n            => !TaskHelper.RunCPUBoundTaskAsync(CheckAuthenticationAsync).Result.HasError;\n\n        /// <summary>\n        /// Asynchronously checks that API authentication is valid.\n        /// </summary>\n        public async Task CheckAPIAuthIsValidAsync()\n        {\n            if (m_queryPending)\n                return;\n\n            m_queryPending = true;\n\n            EveMonClient.Trace(\"Initiated\");\n\n            IsAuthenticated = false;\n\n            SerializableAPIResult<SerializableAPICredentials> result = await CheckAuthenticationAsync().ConfigureAwait(false);\n\n            IsAuthenticated = !result.HasError && HasCredentialsStored;\n\n            CredentialsChecked?.ThreadSafeInvoke(this, new CloudStorageServiceProviderEventArgs(result.Error?.ErrorMessage));\n\n            m_queryPending = false;\n\n            var resultText = result.HasError ? \"Failed\" : \"Completed\";\n            EveMonClient.Trace($\"CloudStorageServiceProvider.CheckAPIAuthIsValidAsync - {resultText}\", printMethod: false);\n        }\n\n        /// <summary>\n        /// Asynchronously resets the settings.\n        /// </summary>\n        public async Task ResetSettingsAsync()\n        {\n            EveMonClient.Trace(\"Initiated\");\n\n            SerializableAPIResult<SerializableAPICredentials> result = await RevokeAuthorizationAsync().ConfigureAwait(false);\n\n            if (!result.HasError)\n                Settings.Reset();\n\n            SettingsReset?.ThreadSafeInvoke(this, new CloudStorageServiceProviderEventArgs(null));\n\n            var resultText = result.HasError ? \"Failed\" : \"Completed\";\n            EveMonClient.Trace($\"CloudStorageServiceProvider.ResetSettingsAsync - {resultText}\", printMethod: false);\n        }\n\n        /// <summary>\n        /// Uploads the settings file.\n        /// </summary>\n        /// <returns></returns>\n        public async Task<bool> UploadSettingsFileOnExitAsync()\n        {\n            if (!CloudStorageServiceSettings.Default.UploadAlways || !HasCredentialsStored)\n                return true;\n\n            //var isValid = CheckAPIAuthIsValid();\n\n            // Quit if user is not authenticated\n            if (!IsAuthenticated && !CheckAPIAuthIsValid())\n            {\n                MessageBox.Show($\"The {Name} API credentials could not be authenticated.\", $\"{Name} API Error\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Error);\n\n                return false;\n            }\n\n            EveMonClient.Trace(\"Initiated\");\n\n            // Ask for user action if uploading fails\n            while (true)\n            {\n                SerializableAPIResult<CloudStorageServiceAPIFile> result = await UploadFileAsync().ConfigureAwait(false);\n                FileUploaded?.ThreadSafeInvoke(this, new CloudStorageServiceProviderEventArgs(result.Error?.ErrorMessage));\n\n                if (!result.HasError)\n                {\n                    EveMonClient.Trace(\"CloudStorageServiceProvider.UploadSettingsFileOnExitAsync - Completed\", printMethod: false);\n                    return true;\n                }\n\n                DialogResult dialogResult = MessageBox.Show(result.Error?.ErrorMessage, $\"{Name} API Error\",\n                    MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);\n\n                switch (dialogResult)\n                {\n                    case DialogResult.Abort:\n                        EveMonClient.Trace(\"Failed and Aborted\");\n                        return false;\n                    case DialogResult.Retry:\n                        continue;\n                }\n\n                EveMonClient.Trace(\"Failed and Ignored\");\n                return true;\n            }\n        }\n\n        /// <summary>\n        /// Downloads the settings file.\n        /// </summary>\n        /// <returns></returns>\n        public CloudStorageServiceAPIFile DownloadSettingsFile()\n        {\n            if (!CloudStorageServiceSettings.Default.DownloadAlways || !HasCredentialsStored)\n                return null;\n\n            if (!IsAuthenticated && !CheckAPIAuthIsValid())\n            {\n                MessageBox.Show($\"The {Name} API credentials could not be authenticated.\",\n                    $\"{Name} API Error\", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n\n                return null;\n            }\n\n            EveMonClient.Trace(\"Initiated\");\n\n            SerializableAPIResult<CloudStorageServiceAPIFile> result = DownloadFileAsync().Result;\n            FileDownloaded?.ThreadSafeInvoke(this, new CloudStorageServiceProviderEventArgs(result.Error?.ErrorMessage));\n\n            if (CloudStorageServiceSettings.Default.UseImmediately)\n            {\n                if (result.HasError)\n                {\n                    MessageBox.Show($\"File could not be downloaded.\\n\\nThe error was:\\n{result.Error?.ErrorMessage}\",\n                        $\"{Name} API Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                }\n                else\n                {\n                    EveMonClient.Trace(\"Completed\");\n                    return result.Result;\n                }\n            }\n            else\n            {\n                var resultText = result.HasError ? \"Failed\" : \"Completed\";\n                EveMonClient.Trace(resultText);\n\n                if (!result.HasError)\n                    SaveSettingsFile(result.Result);\n            }\n\n            return null;\n        }\n\n        /// <summary>\n        /// Uploads the settings file asynchronously.\n        /// </summary>\n        public async Task UploadSettingsFileAsync()\n        {\n            if (m_queryPending)\n                return;\n\n            m_queryPending = true;\n\n            EveMonClient.Trace(\"Initiated\");\n\n            SerializableAPIResult<CloudStorageServiceAPIFile> result = await UploadFileAsync().ConfigureAwait(false);\n            FileUploaded?.ThreadSafeInvoke(this, new CloudStorageServiceProviderEventArgs(result.Error?.ErrorMessage));\n            m_queryPending = false;\n\n            string resultText = result.HasError ? \"Failed\" : \"Completed\";\n            EveMonClient.Trace($\"CloudStorageServiceProvider.UploadSettingsFileAsync - {resultText}\", printMethod: false);\n        }\n\n        /// <summary>\n        /// Downloads the settings file asynchronously.\n        /// </summary>\n        public async Task DownloadSettingsFileAsync()\n        {\n            if (m_queryPending)\n                return;\n\n            m_queryPending = true;\n\n            EveMonClient.Trace(\"Initiated\");\n\n            SerializableAPIResult<CloudStorageServiceAPIFile> result = await DownloadFileAsync().ConfigureAwait(false);\n            FileDownloaded?.ThreadSafeInvoke(this, new CloudStorageServiceProviderEventArgs(result.Error?.ErrorMessage));\n            m_queryPending = false;\n\n            string resultText = result.HasError ? \"Failed\" : \"Completed\";\n            EveMonClient.Trace($\"CloudStorageServiceProvider.DownloadSettingsFileAsync - {resultText}\", printMethod: false);\n\n            if (!result.HasError)\n                Dispatcher.Invoke(() => SaveSettingsFile(result.Result));\n        }\n\n        /// <summary>\n        /// Cancels the pending queries.\n        /// </summary>\n        public void CancelPendingQueries()\n        {\n            m_queryPending = false;\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Deletes the old settings folders.\n        /// </summary>\n        /// <param name=\"configFileParentParentDir\">The configuration file parent parent dir.</param>\n        private static void DeleteOldSettingsFolders(DirectoryInfo configFileParentParentDir)\n        {\n            if (configFileParentParentDir.Parent == null || !Directory.Exists(configFileParentParentDir.Parent.FullName))\n                return;\n\n            foreach (string directory in Directory.GetDirectories(configFileParentParentDir.Parent.FullName)\n                .Where(directory => directory != configFileParentParentDir.FullName &&\n                                    directory.StartsWith(EveMonClient.FileVersionInfo.ProductName,\n                                        StringComparison.OrdinalIgnoreCase)))\n            {\n                // Delete the folder recursively\n                Directory.Delete(directory, true);\n            }\n        }\n\n        /// <summary>\n        /// Saves the queried settings file.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        /// <exception cref=\"System.ArgumentNullException\">result</exception>\n        private static void SaveSettingsFile(CloudStorageServiceAPIFile result)\n        {\n            result.ThrowIfNull(nameof(result));\n\n            using (SaveFileDialog saveFileDialog = new SaveFileDialog())\n            {\n                saveFileDialog.Title = @\"EVEMon Settings Backup File Save\";\n                saveFileDialog.DefaultExt = \"bak\";\n                saveFileDialog.Filter = @\"EVEMon Settings Backup Files (*.bak)|*.bak\";\n                saveFileDialog.FilterIndex = 1;\n                saveFileDialog.RestoreDirectory = true;\n\n                // Prompts the user for a location\n                saveFileDialog.FileName = $\"{result.FileName}.bak\";\n                saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);\n                DialogResult dialogResult = saveFileDialog.ShowDialog();\n\n                // Save settings file if OK\n                if (dialogResult != DialogResult.OK)\n                    return;\n\n                // Save the file to destination\n                File.WriteAllText(saveFileDialog.FileName, result.FileContent);\n            }\n        }\n\n        /// <summary>\n        /// Asynchronously gets a mapped API file.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        /// <param name=\"response\">The response.</param>\n        /// <returns></returns>\n        protected static async Task<SerializableAPIResult<CloudStorageServiceAPIFile>> GetMappedAPIFileAsync(\n            SerializableAPIResult<CloudStorageServiceAPIFile> result, Stream response)\n        {\n            if (response == null)\n                return null;\n\n            string content;\n            using (StreamReader reader = new StreamReader(Util.ZlibUncompress(response)))\n                content = await reader.ReadToEndAsync();\n\n            if (string.IsNullOrWhiteSpace(content))\n            {\n                result.Error = new SerializableAPIError\n                {\n                    ErrorMessage = @\"The settings file was not in a correct format.\"\n                };\n\n                return result;\n            }\n\n            result.Result = new CloudStorageServiceAPIFile\n            {\n                FileName = $\"{SettingsFileNameWithoutExtension}.xml\",\n                FileContent = content\n            };\n\n            return result;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/CloudStorageServiceResources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Common.CloudStorageServices {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class CloudStorageServiceResources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal CloudStorageServiceResources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Common.CloudStorageServices.CloudStorageServiceResources\", typeof(CloudStorageServiceResources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap DropboxLogo {\n            get {\n                object obj = ResourceManager.GetObject(\"DropboxLogo\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap GoogleDriveLogo {\n            get {\n                object obj = ResourceManager.GetObject(\"GoogleDriveLogo\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap OneDriveLogo {\n            get {\n                object obj = ResourceManager.GetObject(\"OneDriveLogo\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/CloudStorageServiceResources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"DropboxLogo\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\dropbox_48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"GoogleDriveLogo\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\googledrive_48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"OneDriveLogo\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\onedrive_48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/CloudStorageServiceSettings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Common.CloudStorageServices {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"14.0.0.0\")]\n    public sealed partial class CloudStorageServiceSettings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static CloudStorageServiceSettings defaultInstance = ((CloudStorageServiceSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new CloudStorageServiceSettings())));\n        \n        public static CloudStorageServiceSettings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"False\")]\n        public bool UploadAlways {\n            get {\n                return ((bool)(this[\"UploadAlways\"]));\n            }\n            set {\n                this[\"UploadAlways\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"False\")]\n        public bool DownloadAlways {\n            get {\n                return ((bool)(this[\"DownloadAlways\"]));\n            }\n            set {\n                this[\"DownloadAlways\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"False\")]\n        public bool UseImmediately {\n            get {\n                return ((bool)(this[\"UseImmediately\"]));\n            }\n            set {\n                this[\"UseImmediately\"] = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/CloudStorageServiceSettings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\" GeneratedClassNamespace=\"EVEMon.Common.CloudStorageServices\" GeneratedClassName=\"CloudStorageServiceSettings\">\n  <Profiles />\n  <Settings>\n    <Setting Name=\"UploadAlways\" Type=\"System.Boolean\" Scope=\"User\">\n      <Value Profile=\"(Default)\">False</Value>\n    </Setting>\n    <Setting Name=\"DownloadAlways\" Type=\"System.Boolean\" Scope=\"User\">\n      <Value Profile=\"(Default)\">False</Value>\n    </Setting>\n    <Setting Name=\"UseImmediately\" Type=\"System.Boolean\" Scope=\"User\">\n      <Value Profile=\"(Default)\">False</Value>\n    </Setting>\n  </Settings>\n</SettingsFile>"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/Dropbox/DropboxCloudStorageServiceProvider.cs",
    "content": "﻿using System;\nusing System.Configuration;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Security;\nusing System.Security.Cryptography.X509Certificates;\nusing System.Threading.Tasks;\nusing Dropbox.Api;\nusing Dropbox.Api.Files;\nusing Dropbox.Api.Users;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization;\n\nnamespace EVEMon.Common.CloudStorageServices.Dropbox\n{\n    public sealed class DropboxCloudStorageServiceProvider : CloudStorageServiceProvider\n    {\n        private SerializableAPIResult<SerializableAPICredentials> m_result =\n                new SerializableAPIResult<SerializableAPICredentials>();\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the name of the provider.\n        /// </summary>\n        /// <value>\n        /// The name.\n        /// </value>\n        public override string Name => \"Dropbox\";\n\n        /// <summary>\n        /// Gets the authentication steps.\n        /// </summary>\n        /// <value>\n        /// The authentication steps.\n        /// </value>\n        public override AuthenticationSteps AuthSteps => AuthenticationSteps.Two;\n\n        /// <summary>\n        /// Gets a value indicating whether this <see cref=\"CloudStorageServiceProvider\" /> is enabled.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if enabled; otherwise, <c>false</c>.\n        /// </value>\n        protected override bool Enabled => true;\n\n        /// <summary>\n        /// Gets a value indicating whether the provider API credentials are stored.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if the provider API credentials are stored; otherwise, <c>false</c>.\n        /// </value>\n        public override bool HasCredentialsStored\n            => !string.IsNullOrEmpty(DropboxCloudStorageServiceSettings.Default.AccessToken);\n\n        /// <summary>\n        /// Gets the settings.\n        /// </summary>\n        /// <value>\n        /// The settings.\n        /// </value>\n        protected override ApplicationSettingsBase Settings => DropboxCloudStorageServiceSettings.Default;\n\n        /// <summary>\n        /// Gets the refferal link.\n        /// </summary>\n        /// <value>\n        /// The refferal link.\n        /// </value>\n        public override Uri RefferalLink => new Uri(\"https://www.dropbox.com/referrals/NTEyOTk1Njg4MDk?src=app9-891961\");\n\n        /// <summary>\n        /// Gets the logo.\n        /// </summary>\n        /// <value>\n        /// The logo.\n        /// </value>\n        public override Image Logo => CloudStorageServiceResources.DropboxLogo;\n\n        #endregion\n\n\n        #region Implementation Methods\n\n        /// <summary>\n        /// Asynchronously checks that the provider authentication with credentials is valid.\n        /// </summary>\n        /// <param name=\"userId\">The user identifier.</param>\n        /// <param name=\"apiKey\">The API key.</param>\n        protected override Task<SerializableAPIResult<SerializableAPICredentials>>\n            CheckProviderAuthWithCredentialsIsValidAsync(uint userId, string apiKey)\n        {\n            throw new NotImplementedException();\n        }\n\n        /// <summary>\n        /// Asynchronously requests the provider an authentication code.\n        /// </summary>\n        protected override Task<SerializableAPIResult<SerializableAPICredentials>> RequestProviderAuthCodeAsync()\n        {\n            m_result = new SerializableAPIResult<SerializableAPICredentials>();\n\n            try\n            {\n                Uri authorizeUri = DropboxOAuth2Helper.GetAuthorizeUri(\n                    Util.Decrypt(DropboxCloudStorageServiceSettings.Default.AppKey,\n                        CultureConstants.InvariantCulture.NativeName));\n\n                Util.OpenURL(authorizeUri);\n            }\n            catch (Exception exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return Task.FromResult(m_result);\n        }\n\n        /// <summary>\n        /// Asynchronously checks the provider authentication code.\n        /// </summary>\n        /// <param name=\"code\">The code.</param>\n        protected override async Task<SerializableAPIResult<SerializableAPICredentials>> CheckProviderAuthCodeAsync(\n            string code)\n        {\n            if (m_result == null)\n                m_result = new SerializableAPIResult<SerializableAPICredentials>();\n\n            try\n            {\n                OAuth2Response response = await DropboxOAuth2Helper.ProcessCodeFlowAsync(code,\n                    Util.Decrypt(DropboxCloudStorageServiceSettings.Default.AppKey,\n                        CultureConstants.InvariantCulture.NativeName),\n                    Util.Decrypt(DropboxCloudStorageServiceSettings.Default.AppSecret,\n                        CultureConstants.InvariantCulture.NativeName)).ConfigureAwait(false);\n\n                await CheckAuthenticationAsync().ConfigureAwait(false);\n\n                if (!m_result.HasError)\n                    DropboxCloudStorageServiceSettings.Default.AccessToken = response.AccessToken;\n            }\n            catch (OAuth2Exception exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n            catch (Exception exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return m_result;\n        }\n\n        /// <summary>\n        /// Asynchronously checks the authentication.\n        /// </summary>\n        protected override async Task<SerializableAPIResult<SerializableAPICredentials>> CheckAuthenticationAsync()\n        {\n            if (m_result == null)\n                m_result = new SerializableAPIResult<SerializableAPICredentials>();\n\n            if (!HasCredentialsStored)\n                return m_result;\n            try\n            {\n                InitializeCertPinning();\n                using (DropboxClient client = GetClient())\n                {\n                    await client.Users.GetCurrentAccountAsync().ConfigureAwait(false);\n                }\n            }\n            catch (ApiException<GetAccountError> exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n            catch (AuthException exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n\n                if (exc.ErrorResponse.IsInvalidAccessToken && HasCredentialsStored)\n                    await ResetSettingsAsync().ConfigureAwait(false);\n            }\n            catch (BadInputException exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n            catch (Exception exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n            finally\n            {\n                ClearCertPinning();\n            }\n\n            return m_result;\n        }\n\n        /// <summary>\n        /// Asynchronously revokes the authorization.\n        /// </summary>\n        /// <returns></returns>\n        protected override Task<SerializableAPIResult<SerializableAPICredentials>> RevokeAuthorizationAsync()\n            => Task.FromResult(new SerializableAPIResult<SerializableAPICredentials>());\n\n        /// <summary>\n        /// Asynchronously uploads the file.\n        /// </summary>\n        /// <returns></returns>\n        protected override async Task<SerializableAPIResult<CloudStorageServiceAPIFile>> UploadFileAsync()\n        {\n            SerializableAPIResult<CloudStorageServiceAPIFile> result = new SerializableAPIResult<CloudStorageServiceAPIFile>();\n\n            try\n            {\n                byte[] content = Util.GZipCompress(SettingsFileContentByteArray).ToArray();\n                CommitInfo commitInfo = new CommitInfo($\"/{SettingsFileNameWithoutExtension}\",\n                    WriteMode.Overwrite.Instance);\n\n                InitializeCertPinning();\n                using (DropboxClient client = GetClient())\n                using (Stream stream = Util.GetMemoryStream(content))\n                {\n                    await client.Files.UploadAsync(commitInfo, stream).ConfigureAwait(false);\n                    return result;\n                }\n            }\n            catch (ApiException<UploadError> ex)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = ex.Message };\n            }\n            catch (AuthException exc)\n            {\n                IsAuthenticated = false;\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n            catch (BadInputException exc)\n            {\n                IsAuthenticated = false;\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n            catch (Exception exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n            finally\n            {\n                ClearCertPinning();\n            }\n\n            return result;\n        }\n\n        /// <summary>\n        /// Asynchronously downloads the file.\n        /// </summary>\n        /// <returns></returns>\n        protected override async Task<SerializableAPIResult<CloudStorageServiceAPIFile>> DownloadFileAsync()\n        {\n            SerializableAPIResult<CloudStorageServiceAPIFile> result = new SerializableAPIResult<CloudStorageServiceAPIFile>();\n\n            try\n            {\n                InitializeCertPinning();\n                DownloadArg arg = new DownloadArg($\"/{SettingsFileNameWithoutExtension}\");\n                using (DropboxClient client = GetClient())\n                {\n                    Task<Stream> response = await client.Files.DownloadAsync(arg)\n                        .ContinueWith(async task => await task.Result.GetContentAsStreamAsync());\n                    return await GetMappedAPIFileAsync(result, response.Result);\n                }\n            }\n            catch (ApiException<DownloadError> ex)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = ex.Message };\n            }\n            catch (AuthException exc)\n            {\n                IsAuthenticated = false;\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n            catch (BadInputException exc)\n            {\n                IsAuthenticated = false;\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n            catch (Exception exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n            finally\n            {\n                ClearCertPinning();\n            }\n\n            return result;\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Initializes the cert pinning.\n        /// </summary>\n        private static void InitializeCertPinning()\n        {\n            ServicePointManager.ServerCertificateValidationCallback = EveMonClient.IsDebugBuild\n                ? HttpWebClientService.DummyCertificateValidationCallback\n                : (RemoteCertificateValidationCallback)DropboxCertificateValidationCallback;\n        }\n\n        /// <summary>\n        /// De-initializes the cert pinning.\n        /// </summary>\n        private static void ClearCertPinning()\n        {\n            // Default value is null\n            ServicePointManager.ServerCertificateValidationCallback = null;\n        }\n\n        /// <summary>\n        /// The Dropbox certificate validation callback.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"certificate\">The certificate.</param>\n        /// <param name=\"chain\">The chain.</param>\n        /// <param name=\"sslpolicyerrors\">The sslpolicyerrors.</param>\n        /// <returns></returns>\n        private static bool DropboxCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain,\n            SslPolicyErrors sslpolicyerrors)\n        {\n            // http://babbacom.com/?p=300 - fix security hole\n            if (sslpolicyerrors != SslPolicyErrors.None || chain == null)\n                return false;\n            int n = chain.ChainElements.Count;\n            if (n == 0)\n                return false;\n            X509ChainElement root = chain.ChainElements[n - 1];\n            string publicKey = root.Certificate.GetPublicKeyString();\n\n            return DropboxCertHelper.IsKnownRootCertPublicKey(publicKey);\n        }\n\n        /// <summary>\n        /// Gets the client.\n        /// </summary>\n        /// <returns></returns>\n        private static DropboxClient GetClient()\n        {\n            return new DropboxClient(DropboxCloudStorageServiceSettings.Default.AccessToken,\n                new DropboxClientConfig(HttpWebClientServiceState.UserAgent));\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/Dropbox/DropboxCloudStorageServiceSettings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Common.CloudStorageServices.Dropbox {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"14.0.0.0\")]\n    internal sealed partial class DropboxCloudStorageServiceSettings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static DropboxCloudStorageServiceSettings defaultInstance = ((DropboxCloudStorageServiceSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new DropboxCloudStorageServiceSettings())));\n        \n        public static DropboxCloudStorageServiceSettings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"\")]\n        public string AccessToken {\n            get {\n                return ((string)(this[\"AccessToken\"]));\n            }\n            set {\n                this[\"AccessToken\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.ApplicationScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"EtR+7IGX0c33DEX3I/td5A==\")]\n        public string AppKey {\n            get {\n                return ((string)(this[\"AppKey\"]));\n            }\n        }\n        \n        [global::System.Configuration.ApplicationScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"vjAI3MH5c/3jEisSqOH8AA==\")]\n        public string AppSecret {\n            get {\n                return ((string)(this[\"AppSecret\"]));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/Dropbox/DropboxCloudStorageServiceSettings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\" GeneratedClassNamespace=\"EVEMon.Common.CloudStorageServices.Dropbox\" GeneratedClassName=\"DropboxCloudStorageServiceSettings\">\n  <Profiles />\n  <Settings>\n    <Setting Name=\"AccessToken\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\" />\n    </Setting>\n    <Setting Name=\"AppKey\" Type=\"System.String\" Scope=\"Application\">\n      <Value Profile=\"(Default)\">EtR+7IGX0c33DEX3I/td5A==</Value>\n    </Setting>\n    <Setting Name=\"AppSecret\" Type=\"System.String\" Scope=\"Application\">\n      <Value Profile=\"(Default)\">vjAI3MH5c/3jEisSqOH8AA==</Value>\n    </Setting>\n  </Settings>\n</SettingsFile>"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/GoogleDrive/GoogleDriveCloudStorageServiceProvider.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Exceptions;\nusing EVEMon.Common.Serialization;\nusing Google;\nusing Google.Apis.Auth.OAuth2;\nusing Google.Apis.Auth.OAuth2.Responses;\nusing Google.Apis.Download;\nusing Google.Apis.Drive.v3;\nusing Google.Apis.Drive.v3.Data;\nusing Google.Apis.Services;\nusing Google.Apis.Upload;\nusing Google.Apis.Util.Store;\nusing File = System.IO.File;\nusing GoogleFile = Google.Apis.Drive.v3.Data.File;\n\nnamespace EVEMon.Common.CloudStorageServices.GoogleDrive\n{\n    public sealed class GoogleDriveCloudStorageServiceProvider : CloudStorageServiceProvider\n    {\n        private SerializableAPIResult<SerializableAPICredentials> m_result =\n                new SerializableAPIResult<SerializableAPICredentials>();\n\n        private static UserCredential s_credential;\n        private string m_fileId;\n\n        private const string Spaces = \"appDataFolder\";\n        private const string ContentType = \"application/xml\";\n        private const string CredentialsDirectory = @\".googledrive\";\n        private const string UserId = @\"user\";\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the name of the provider.\n        /// </summary>\n        /// <value>\n        /// The name.\n        /// </value>\n        public override string Name => \"Google Drive\";\n\n        /// <summary>\n        /// Gets the authentication steps.\n        /// </summary>\n        /// <value>\n        /// The authentication steps.\n        /// </value>\n        public override AuthenticationSteps AuthSteps => AuthenticationSteps.One;\n\n        /// <summary>\n        /// Gets a value indicating whether this <see cref=\"CloudStorageServiceProvider\" /> is enabled.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if enabled; otherwise, <c>false</c>.\n        /// </value>\n        protected override bool Enabled => true;\n\n        /// <summary>\n        /// Gets a value indicating whether the provider API credentials are stored.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if the provider API credentials are stored; otherwise, <c>false</c>.\n        /// </value>\n        public override bool HasCredentialsStored\n        {\n            get\n            {\n                try\n                {\n                    return !string.IsNullOrWhiteSpace(GetCredentialsPath(checkAuth: true));\n                }\n                catch (APIException)\n                {\n                    return false;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets the settings.\n        /// </summary>\n        /// <value>\n        /// The settings.\n        /// </value>\n        protected override ApplicationSettingsBase Settings => GoogleDriveCloudStorageServiceSettings.Default;\n\n        /// <summary>\n        /// Gets the refferal link.\n        /// </summary>\n        /// <value>\n        /// The refferal link.\n        /// </value>\n        public override Uri RefferalLink => new Uri(\"https://accounts.google.com/SignUp\");\n\n        /// <summary>\n        /// Gets the logo.\n        /// </summary>\n        /// <value>\n        /// The logo.\n        /// </value>\n        public override Image Logo => CloudStorageServiceResources.GoogleDriveLogo;\n\n        #endregion\n\n\n        #region Implementation Methods\n\n        /// <summary>\n        /// Asynchronous checks the provider authentication with credentials is valid.\n        /// </summary>\n        /// <param name=\"userId\">The user identifier.</param>\n        /// <param name=\"apiKey\">The API key.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.NotImplementedException\"></exception>\n        protected override Task<SerializableAPIResult<SerializableAPICredentials>>\n            CheckProviderAuthWithCredentialsIsValidAsync(uint userId, string apiKey)\n        {\n            throw new NotImplementedException();\n        }\n\n        /// <summary>\n        /// Asynchronously requests the provider an authentication code.\n        /// </summary>\n        protected override async Task<SerializableAPIResult<SerializableAPICredentials>> RequestProviderAuthCodeAsync()\n        {\n            m_result = new SerializableAPIResult<SerializableAPICredentials>();\n\n            try\n            {\n                await GetCredentialsAsync().ConfigureAwait(false);\n                await CheckAuthCodeAsync(string.Empty).ConfigureAwait(false);\n            }\n            catch (GoogleApiException exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Error.Message };\n            }\n            catch (TokenResponseException exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Error.ErrorDescription ?? exc.Error.Error };\n            }\n            catch (APIException exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorCode = exc.ErrorCode, ErrorMessage = exc.Message };\n            }\n            catch (Exception exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return m_result;\n        }\n\n        /// <summary>\n        /// Asynchronously checks the provider authentication code.\n        /// </summary>\n        /// <param name=\"code\">The code.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.NotImplementedException\"></exception>\n        protected override async Task<SerializableAPIResult<SerializableAPICredentials>> CheckProviderAuthCodeAsync(\n            string code) \n            => await CheckAuthenticationAsync().ConfigureAwait(false);\n\n        /// <summary>\n        /// Asynchronously checks the authentication.\n        /// </summary>\n        protected override async Task<SerializableAPIResult<SerializableAPICredentials>> CheckAuthenticationAsync()\n        {\n            if (m_result == null)\n                m_result = new SerializableAPIResult<SerializableAPICredentials>();\n\n            try\n            {\n                if (!HasCredentialsStored)\n                    return m_result;\n\n                if (s_credential == null)\n                    await GetCredentialsAsync().ConfigureAwait(false);\n\n                using (DriveService client = GetClient())\n                {\n                    AboutResource.GetRequest request = client.About.Get();\n                    request.Fields = \"user\";\n\n                    await request.ExecuteAsync().ConfigureAwait(false);\n                }\n            }\n            catch (GoogleApiException exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Error.Message };\n            }\n            catch (TokenResponseException exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Error.ErrorDescription ?? exc.Error.Error };\n\n                if (HasCredentialsStored)\n                    await ResetSettingsAsync().ConfigureAwait(false);\n            }\n            catch (Exception exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return m_result;\n        }\n\n        /// <summary>\n        /// Asynchronously revokes the authorization.\n        /// </summary>\n        /// <returns></returns>\n        protected override async Task<SerializableAPIResult<SerializableAPICredentials>> RevokeAuthorizationAsync()\n        {\n            m_result = new SerializableAPIResult<SerializableAPICredentials>();\n\n            try\n            {\n                Task<bool> revokeTokenAsync = s_credential?.RevokeTokenAsync(CancellationToken.None);\n                bool success = revokeTokenAsync != null && await revokeTokenAsync.ConfigureAwait(false);\n\n                if (!success)\n                {\n                    m_result.Error = new SerializableAPIError { ErrorMessage = \"Unable to revoke authorization\" };\n                }\n            }\n            catch (GoogleApiException exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Error.Message };\n            }\n            catch (TokenResponseException exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Error.ErrorDescription ?? exc.Error.Error };\n            }\n            catch (Exception exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return m_result;\n        }\n\n        /// <summary>\n        /// Asynchronously uploads the file.\n        /// </summary>\n        /// <returns></returns>\n        protected override async Task<SerializableAPIResult<CloudStorageServiceAPIFile>> UploadFileAsync()\n        {\n            SerializableAPIResult<CloudStorageServiceAPIFile> result = new SerializableAPIResult<CloudStorageServiceAPIFile>();\n\n            try\n            {\n                m_fileId = m_fileId ?? await GetFileIdAsync().ConfigureAwait(false);\n\n                byte[] content = Util.GZipCompress(SettingsFileContentByteArray).ToArray();\n\n                using (DriveService client = GetClient())\n                using (Stream stream = Util.GetMemoryStream(content))\n                {\n                    ResumableUpload<GoogleFile, GoogleFile> request;\n                    GoogleFile fileMetadata = new GoogleFile { Name = SettingsFileNameWithoutExtension };\n                    if (string.IsNullOrWhiteSpace(m_fileId))\n                    {\n                        //Upload\n                        fileMetadata.Parents = new List<string> { Spaces };\n                        request = client.Files.Create(fileMetadata, stream, ContentType);\n                        ((FilesResource.CreateMediaUpload)request).Fields = \"id, name\";\n                    }\n                    else\n                    {\n                        //Update\n                        request = client.Files.Update(fileMetadata, m_fileId, stream, ContentType);\n                        ((FilesResource.UpdateMediaUpload)request).AddParents = Spaces;\n                        ((FilesResource.UpdateMediaUpload)request).Fields = \"id, name\";\n                    }\n\n                    // Do the actual upload\n                    IUploadProgress response = await request.UploadAsync().ConfigureAwait(false);\n                    m_fileId = request.ResponseBody?.Id;\n\n                    // Chceck response for exception\n                    if (response.Exception != null)\n                    {\n                        result.Error = new SerializableAPIError { ErrorMessage = response.Exception.Message };\n                    }\n                }\n            }\n            catch (GoogleApiException exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Error.Message };\n            }\n            catch (TokenResponseException exc)\n            {\n                IsAuthenticated = false;\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Error.ErrorDescription ?? exc.Error.Error };\n            }\n            catch (Exception exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return result;\n        }\n\n        /// <summary>\n        /// Asynchronously downloads the file.\n        /// </summary>\n        /// <returns></returns>\n        /// <exception cref=\"System.IO.FileNotFoundException\"></exception>\n        protected override async Task<SerializableAPIResult<CloudStorageServiceAPIFile>> DownloadFileAsync()\n        {\n            SerializableAPIResult<CloudStorageServiceAPIFile> result = new SerializableAPIResult<CloudStorageServiceAPIFile>();\n\n            try\n            {\n                m_fileId = m_fileId ?? await GetFileIdAsync().ConfigureAwait(false);\n\n                if (string.IsNullOrWhiteSpace(m_fileId))\n                    throw new FileNotFoundException();\n\n                using (DriveService client = GetClient())\n                using (Stream stream = new MemoryStream())\n                {\n                    FilesResource.GetRequest request = client.Files.Get(m_fileId);\n                    request.Fields = \"id, name\";\n\n                    IDownloadProgress response = await request.DownloadAsync(stream).ConfigureAwait(false);\n\n                    if (response.Exception == null)\n                        return await GetMappedAPIFileAsync(result, stream);\n\n                    result.Error = new SerializableAPIError { ErrorMessage = response.Exception.Message };\n                }\n            }\n            catch (GoogleApiException exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Error.Message };\n            }\n            catch (TokenResponseException exc)\n            {\n                IsAuthenticated = false;\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Error.ErrorDescription ?? exc.Error.Error };\n            }\n            catch (Exception exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return result;\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Asynchronously gets the credentials.\n        /// </summary>\n        /// <returns></returns>\n        private static async Task GetCredentialsAsync()\n        {\n            var clientSecrets = new ClientSecrets\n            {\n                ClientId = Util.Decrypt(GoogleDriveCloudStorageServiceSettings.Default.AppKey,\n                    CultureConstants.InvariantCulture.NativeName),\n                ClientSecret = Util.Decrypt(GoogleDriveCloudStorageServiceSettings.Default.AppSecret,\n                    CultureConstants.InvariantCulture.NativeName)\n            };\n\n            s_credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(clientSecrets,\n                new[] { DriveService.Scope.DriveAppdata }, UserId, CancellationToken.None,\n                new FileDataStore(GetCredentialsPath(), true)).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Gets the credentials path.\n        /// </summary>\n        /// <param name=\"checkAuth\">if set to <c>true</c> [check authentication].</param>\n        /// <returns></returns>\n        /// <exception cref=\"EVEMon.Common.Exceptions.APIException\"></exception>\n        private static string GetCredentialsPath(bool checkAuth = false)\n        {\n            Configuration configuration =\n                ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);\n\n            string certPath = Directory.GetParent(configuration.FilePath).Parent?.Parent?.FullName;\n\n            bool fileExists = false;\n            if (!string.IsNullOrWhiteSpace(certPath))\n            {\n                certPath = Path.Combine(certPath, CredentialsDirectory);\n                string filePath = Path.Combine(certPath, $\"{typeof(TokenResponse).FullName}-{UserId}\");\n                fileExists = File.Exists(filePath);\n            }\n\n            if (!checkAuth || fileExists)\n                return certPath;\n\n            SerializableAPIError error = new SerializableAPIError\n            {\n                ErrorCode = @\"Authentication required\",\n                ErrorMessage = \"Authentication required.\\n\\n\" +\n                               \"Go to External Calendar options to request authentication.\\n\" +\n                               \"(i.e. Tools > Options... > Scheduler > External Calendar)\"\n            };\n\n            throw new APIException(error);\n        }\n\n        /// <summary>\n        /// Gets the client.\n        /// </summary>\n        /// <returns></returns>\n        private static DriveService GetClient()\n        {\n            var initializer = new BaseClientService.Initializer\n            {\n                HttpClientInitializer = s_credential,\n                ApplicationName = EveMonClient.FileVersionInfo.ProductName,\n            };\n\n            return new DriveService(initializer);\n        }\n\n        /// <summary>\n        /// Gets the file identifier.\n        /// </summary>\n        /// <returns></returns>\n        private static async Task<string> GetFileIdAsync()\n        {\n            FileList result;\n            using (DriveService client = GetClient())\n            {\n                FilesResource.ListRequest listRequest = client.Files.List();\n                listRequest.Spaces = Spaces;\n                listRequest.Fields = \"files(id, name)\";\n\n                result = await listRequest.ExecuteAsync().ConfigureAwait(false);\n            }\n\n            return result.Files.SingleOrDefault(file => file.Name == SettingsFileNameWithoutExtension)?.Id;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/GoogleDrive/GoogleDriveCloudStorageServiceSettings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Common.CloudStorageServices.GoogleDrive {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"14.0.0.0\")]\n    internal sealed partial class GoogleDriveCloudStorageServiceSettings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static GoogleDriveCloudStorageServiceSettings defaultInstance = ((GoogleDriveCloudStorageServiceSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new GoogleDriveCloudStorageServiceSettings())));\n        \n        public static GoogleDriveCloudStorageServiceSettings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n        \n        [global::System.Configuration.ApplicationScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"8BvIlzHHSodUmiKJYYZAZt0G+0e3FAPudDgGnisxIPlRhL6OtAuJ0rLrvcABqSjZbpUiNTD7HO+9jMyFB\" +\n            \"fO1eNCKLg1j/GOfC/huJ6LXspc=\")]\n        public string AppKey {\n            get {\n                return ((string)(this[\"AppKey\"]));\n            }\n        }\n        \n        [global::System.Configuration.ApplicationScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"N08mlOe0XcXZLP2EZRKwLGbaOCKnEp6iTDNLNCAse0A=\")]\n        public string AppSecret {\n            get {\n                return ((string)(this[\"AppSecret\"]));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/GoogleDrive/GoogleDriveCloudStorageServiceSettings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\" GeneratedClassNamespace=\"EVEMon.Common.CloudStorageServices.GoogleDrive\" GeneratedClassName=\"GoogleDriveCloudStorageServiceSettings\">\n  <Profiles />\n  <Settings>\n    <Setting Name=\"AppKey\" Type=\"System.String\" Scope=\"Application\">\n      <Value Profile=\"(Default)\">8BvIlzHHSodUmiKJYYZAZt0G+0e3FAPudDgGnisxIPlRhL6OtAuJ0rLrvcABqSjZbpUiNTD7HO+9jMyFBfO1eNCKLg1j/GOfC/huJ6LXspc=</Value>\n    </Setting>\n    <Setting Name=\"AppSecret\" Type=\"System.String\" Scope=\"Application\">\n      <Value Profile=\"(Default)\">N08mlOe0XcXZLP2EZRKwLGbaOCKnEp6iTDNLNCAse0A=</Value>\n    </Setting>\n  </Settings>\n</SettingsFile>"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/OneDrive/OneDriveCloudStorageServiceProvider.cs",
    "content": "﻿using System;\nusing System.Configuration;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Serialization;\nusing Microsoft.OneDrive.Sdk;\nusing Microsoft.OneDrive.Sdk.WindowsForms;\nusing Image = System.Drawing.Image;\n\nnamespace EVEMon.Common.CloudStorageServices.OneDrive\n{\n    public sealed class OneDriveCloudStorageServiceProvider : CloudStorageServiceProvider\n    {\n        private SerializableAPIResult<SerializableAPICredentials> m_result =\n                new SerializableAPIResult<SerializableAPICredentials>();\n\n        private const string RedirectUri = \"https://login.live.com/oauth20_desktop.srf\";\n\n        private static readonly string[] s_scopes = { \"wl.offline_access\", \"onedrive.appfolder\" };\n\n        private string m_fileId;\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the name of the provider.\n        /// </summary>\n        /// <value>\n        /// The name.\n        /// </value>\n        public override string Name => \"OneDrive\";\n\n        /// <summary>\n        /// Gets the authentication steps.\n        /// </summary>\n        /// <value>\n        /// The authentication steps.\n        /// </value>\n        public override AuthenticationSteps AuthSteps => AuthenticationSteps.One;\n\n        /// <summary>\n        /// Gets a value indicating whether this <see cref=\"CloudStorageServiceProvider\" /> is enabled.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if enabled; otherwise, <c>false</c>.\n        /// </value>\n        protected override bool Enabled => true;\n\n        /// <summary>\n        /// Gets a value indicating whether the provider API credentials are stored.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if the provider API credentials are stored; otherwise, <c>false</c>.\n        /// </value>\n        public override bool HasCredentialsStored\n            => !string.IsNullOrEmpty(OneDriveCloudStorageServiceSettings.Default.RefreshToken);\n\n        /// <summary>\n        /// Gets the settings.\n        /// </summary>\n        /// <value>\n        /// The settings.\n        /// </value>\n        protected override ApplicationSettingsBase Settings => OneDriveCloudStorageServiceSettings.Default;\n\n        /// <summary>\n        /// Gets the logo.\n        /// </summary>\n        /// <value>\n        /// The logo.\n        /// </value>\n        public override Image Logo => CloudStorageServiceResources.OneDriveLogo;\n\n        #endregion\n\n\n        #region Implementation Methods\n\n        /// <summary>\n        /// Asynchronously checks that the provider authentication with credentials is valid.\n        /// </summary>\n        /// <param name=\"userId\">The user identifier.</param>\n        /// <param name=\"apiKey\">The API key.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.NotImplementedException\"></exception>\n        protected override Task<SerializableAPIResult<SerializableAPICredentials>>\n            CheckProviderAuthWithCredentialsIsValidAsync(uint userId, string apiKey)\n        {\n            throw new NotImplementedException();\n        }\n\n        /// <summary>\n        /// Asynchronously requests the provider an authentication code.\n        /// </summary>\n        /// <returns></returns>\n        protected override async Task<SerializableAPIResult<SerializableAPICredentials>> RequestProviderAuthCodeAsync()\n        {\n            m_result = new SerializableAPIResult<SerializableAPICredentials>();\n\n            await CheckAuthCodeAsync(string.Empty).ConfigureAwait(false);\n\n            return m_result;\n        }\n\n        /// <summary>\n        /// Asynchronously checks the provider authentication code.\n        /// </summary>\n        /// <param name=\"code\">The code.</param>\n        /// <returns></returns>\n        protected override async Task<SerializableAPIResult<SerializableAPICredentials>> CheckProviderAuthCodeAsync(\n            string code)\n        {\n            if (m_result == null)\n                m_result = new SerializableAPIResult<SerializableAPICredentials>();\n\n            try\n            {\n                // Checks that the client is authenticated\n                // Settings save is done on caller method\n                return await CheckAuthAsync().ConfigureAwait(false);\n            }\n            catch (OneDriveException exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Error.Message };\n            }\n            catch (Exception exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return m_result;\n        }\n\n        /// <summary>\n        /// Asynchronously checks the authentication.\n        /// </summary>\n        /// <returns></returns>\n        protected override async Task<SerializableAPIResult<SerializableAPICredentials>> CheckAuthenticationAsync()\n        {\n            if (m_result == null)\n                m_result = new SerializableAPIResult<SerializableAPICredentials>();\n\n            try\n            {\n                if (!HasCredentialsStored)\n                    return m_result;\n\n                // Checks that the client is authenticated\n                // Settings save is done on called method\n                return await CheckAuthAsync(saveOnChangeCheck: true).ConfigureAwait(false);\n            }\n            catch (OneDriveException exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Error.Message };\n\n                if (exc.Error.Code == OneDriveErrorCode.AuthenticationFailure.ToString() && HasCredentialsStored)\n                    await ResetSettingsAsync().ConfigureAwait(false);\n            }\n            catch (Exception exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return m_result;\n        }\n\n        /// <summary>\n        /// Asynchronously revokes the authorization.\n        /// </summary>\n        /// <returns></returns>\n        protected override async Task<SerializableAPIResult<SerializableAPICredentials>> RevokeAuthorizationAsync()\n        {\n            m_result = new SerializableAPIResult<SerializableAPICredentials>();\n\n            try\n            {\n                using (OneDriveClient client = (OneDriveClient)await GetClient().ConfigureAwait(false))\n                {\n                    bool cansignout = client.AuthenticationProvider.CurrentAccountSession.CanSignOut;\n\n                    if (cansignout)\n                        await client.AuthenticationProvider.SignOutAsync().ConfigureAwait(false);\n                    else\n                        m_result.Error = new SerializableAPIError { ErrorMessage = \"Unable to revoke authorization\" };\n                }\n            }\n            catch (OneDriveException exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Error.Message };\n            }\n            catch (Exception exc)\n            {\n                m_result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return m_result;\n        }\n\n        /// <summary>\n        /// Asynchronously uploads the file.\n        /// </summary>\n        /// <returns></returns>\n        protected override async Task<SerializableAPIResult<CloudStorageServiceAPIFile>> UploadFileAsync()\n        {\n            SerializableAPIResult<CloudStorageServiceAPIFile> result = new SerializableAPIResult<CloudStorageServiceAPIFile>();\n\n            try\n            {\n                m_fileId = m_fileId ?? await GetFileIdAsync().ConfigureAwait(false);\n\n                byte[] content = Util.GZipCompress(SettingsFileContentByteArray).ToArray();\n\n                using (OneDriveClient client = (OneDriveClient)await GetClient().ConfigureAwait(false))\n                using (Stream stream = Util.GetMemoryStream(content))\n                {\n                    Item response = await (string.IsNullOrWhiteSpace(m_fileId)\n                        ? client.Drive.Special.AppRoot\n                            .ItemWithPath(Uri.EscapeUriString(SettingsFileNameWithoutExtension))\n                        : client.Drive.Items[m_fileId])\n                        .Content.Request().PutAsync<Item>(stream).ConfigureAwait(false);\n\n                    m_fileId = response?.Id;\n                }\n            }\n            catch (OneDriveException exc)\n            {\n                if (exc.Error.Code == OneDriveErrorCode.AuthenticationFailure.ToString())\n                    IsAuthenticated = false;\n\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Error.Message };\n            }\n            catch (Exception exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return result;\n        }\n\n        /// <summary>\n        /// Asynchronously downloads the file.\n        /// </summary>\n        /// <returns></returns>\n        /// <exception cref=\"System.IO.FileNotFoundException\"></exception>\n        protected override async Task<SerializableAPIResult<CloudStorageServiceAPIFile>> DownloadFileAsync()\n        {\n            SerializableAPIResult<CloudStorageServiceAPIFile> result = new SerializableAPIResult<CloudStorageServiceAPIFile>();\n\n            try\n            {\n                m_fileId = m_fileId ?? await GetFileIdAsync().ConfigureAwait(false);\n\n                if (string.IsNullOrWhiteSpace(m_fileId))\n                    throw new FileNotFoundException();\n\n                using (OneDriveClient client = (OneDriveClient)await GetClient().ConfigureAwait(false))\n                {\n                    Stream stream = await client.Drive.Items[m_fileId].Content.Request().GetAsync().ConfigureAwait(false);\n                    return await GetMappedAPIFileAsync(result, stream);\n                }\n            }\n            catch (OneDriveException exc)\n            {\n                if (exc.Error.Code == OneDriveErrorCode.AuthenticationFailure.ToString())\n                    IsAuthenticated = false;\n\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Error.Message };\n            }\n            catch (Exception exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return result;\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Asynchronously checks the authentication.\n        /// </summary>\n        /// <param name=\"saveOnChangeCheck\">if set to <c>true</c> save the settings on change check.</param>\n        /// <returns></returns>\n        private async Task<SerializableAPIResult<SerializableAPICredentials>> CheckAuthAsync(bool saveOnChangeCheck = false)\n        {\n            SerializableAPIResult<SerializableAPICredentials> result =\n                new SerializableAPIResult<SerializableAPICredentials>();\n\n            using (OneDriveClient client = (OneDriveClient)await GetClient())\n            {\n                if (!client.IsAuthenticated)\n                {\n                    result.Error = new SerializableAPIError { ErrorMessage = \"The client could not be authenticated\" };\n                    return result;\n                }\n\n                AuthenticationProvider authenticationProvider =\n                    (MicrosoftAccountAuthenticationProvider)client.AuthenticationProvider;\n\n                if (authenticationProvider.CurrentAccountSession.RefreshToken ==\n                    OneDriveCloudStorageServiceSettings.Default.RefreshToken)\n                {\n                    return result;\n                }\n\n                OneDriveCloudStorageServiceSettings.Default.Credentials =\n                    Encoding.Default.GetString(authenticationProvider.ServiceInfo.CredentialCache.GetCacheBlob());\n                OneDriveCloudStorageServiceSettings.Default.UserId = authenticationProvider.CurrentAccountSession.UserId;\n                OneDriveCloudStorageServiceSettings.Default.RefreshToken =\n                    authenticationProvider.CurrentAccountSession.RefreshToken;\n\n                if (saveOnChangeCheck)\n                    Settings.Save();\n            }\n\n            return result;\n        }\n\n        /// <summary>\n        /// Gets the client.\n        /// </summary>\n        /// <returns></returns>\n        private static async Task<IOneDriveClient> GetClient()\n        {\n            CredentialCache credentialCache = new CredentialCache();\n            string credentials = OneDriveCloudStorageServiceSettings.Default.Credentials;\n\n            if (!string.IsNullOrWhiteSpace(credentials))\n                credentialCache.InitializeCacheFromBlob(Encoding.Default.GetBytes(credentials));\n\n            IServiceInfoProvider serviceInfoProvider = new ServiceInfoProvider(new FormsWebAuthenticationUi())\n            {\n                UserSignInName = OneDriveCloudStorageServiceSettings.Default.UserId\n            };\n\n            return await OneDriveClient.GetAuthenticatedMicrosoftAccountClient(\n                Util.Decrypt(OneDriveCloudStorageServiceSettings.Default.AppKey, CultureConstants.InvariantCulture.NativeName),\n                RedirectUri, s_scopes, serviceInfoProvider, credentialCache).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Gets the file identifier.\n        /// </summary>\n        /// <returns></returns>\n        private static async Task<string> GetFileIdAsync()\n        {\n            try\n            {\n                using (OneDriveClient client = (OneDriveClient)await GetClient().ConfigureAwait(false))\n                {\n                    IItemRequest request = client.Drive.Special.AppRoot\n                        .ItemWithPath($\"/{Uri.EscapeUriString(SettingsFileNameWithoutExtension)}\")\n                        .Request();\n                    Item response = await request.GetAsync().ConfigureAwait(false);\n                    return response.Id;\n                }\n            }\n            catch (OneDriveException exc)\n            {\n                if (exc.IsMatch(OneDriveErrorCode.ItemNotFound.ToString()))\n                    return string.Empty;\n\n                throw;\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/OneDrive/OneDriveCloudStorageServiceSettings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Common.CloudStorageServices.OneDrive {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"14.0.0.0\")]\n    internal sealed partial class OneDriveCloudStorageServiceSettings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static OneDriveCloudStorageServiceSettings defaultInstance = ((OneDriveCloudStorageServiceSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new OneDriveCloudStorageServiceSettings())));\n        \n        public static OneDriveCloudStorageServiceSettings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"\")]\n        public string Credentials {\n            get {\n                return ((string)(this[\"Credentials\"]));\n            }\n            set {\n                this[\"Credentials\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"\")]\n        public string RefreshToken {\n            get {\n                return ((string)(this[\"RefreshToken\"]));\n            }\n            set {\n                this[\"RefreshToken\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"\")]\n        public string UserId {\n            get {\n                return ((string)(this[\"UserId\"]));\n            }\n            set {\n                this[\"UserId\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.ApplicationScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"uO36xFqIL5DZzMuzQDWW518vzrWJdFxyESpa98psjpY=\")]\n        public string AppKey {\n            get {\n                return ((string)(this[\"AppKey\"]));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CloudStorageServices/OneDrive/OneDriveCloudStorageServiceSettings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\" GeneratedClassNamespace=\"EVEMon.Common.CloudStorageServices.OneDrive\" GeneratedClassName=\"OneDriveCloudStorageServiceSettings\">\n  <Profiles />\n  <Settings>\n    <Setting Name=\"Credentials\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\" />\n    </Setting>\n    <Setting Name=\"RefreshToken\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\" />\n    </Setting>\n    <Setting Name=\"UserId\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\" />\n    </Setting>\n    <Setting Name=\"AppKey\" Type=\"System.String\" Scope=\"Application\">\n      <Value Profile=\"(Default)\">uO36xFqIL5DZzMuzQDWW518vzrWJdFxyESpa98psjpY=</Value>\n    </Setting>\n  </Settings>\n</SettingsFile>"
  },
  {
    "path": "src/EVEMon.Common/Collections/BaseList.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Collections\n{\n    /// <summary>\n    /// A base class for lists when we want to be able to connect or disconnect items, or fire collection changes.\n    /// </summary>\n    public abstract class BaseList<T> : IList<T>\n        where T : class\n    {\n        private List<T> m_items = new List<T>();\n\n        /// <summary>\n        /// Gets the items.\n        /// </summary>\n        /// <value>The items.</value>\n        protected IEnumerable<T> Items => m_items;\n\n        /// <summary>\n        /// Sets the items.\n        /// </summary>\n        /// <param name=\"items\">The items.</param>\n        protected void SetItems(IEnumerable<T> items)\n        {\n            m_items = new List<T>(items);\n        }\n\n        /// <summary>\n        /// Executed any time an item is going to be added to the list.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        protected virtual void OnAdding(ref T item)\n        {\n        }\n\n        /// <summary>\n        /// Executed any time an item is going to be removed from the list.\n        /// </summary>\n        /// <param name=\"oldItem\"></param>\n        protected virtual void OnRemoving(T oldItem)\n        {\n        }\n\n        /// <summary>\n        /// Executed any time a change is going to occur to the list.\n        /// </summary>\n        protected virtual void OnChanged()\n        {\n        }\n\n        /// <summary>\n        /// Moves the given item to the target index.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <param name=\"targetIndex\"></param>\n        public void MoveTo(T item, int targetIndex)\n        {\n            int oldIndex = m_items.IndexOf(item);\n            if (oldIndex == -1)\n                throw new InvalidOperationException(\"The item was not found in the collection.\");\n\n            m_items.RemoveAt(oldIndex);\n            m_items.Insert(targetIndex, item);\n\n            OnChanged();\n        }\n\n        /// <summary>\n        /// Rebuild the list from the given enumeration\n        /// </summary>\n        /// <param name=\"items\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">items</exception>\n        public void RebuildFrom(IEnumerable<T> items)\n        {\n            items.ThrowIfNull(nameof(items));\n\n            // Removing old items\n            foreach (T item in m_items)\n            {\n                OnRemoving(item);\n            }\n            m_items.Clear();\n\n            // Adding new items\n            foreach (T item in items)\n            {\n                T copy = item;\n                OnAdding(ref copy);\n                m_items.Add(copy);\n            }\n            OnChanged();\n        }\n\n\n        #region IList<T> Members\n\n        /// <summary>\n        /// Gets the index of the given item, -1 when not found.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        public int IndexOf(T item) => m_items.IndexOf(item);\n\n        /// <summary>\n        /// Inserts the given item at the provided index\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"item\"></param>\n        public void Insert(int index, T item)\n        {\n            OnAdding(ref item);\n            m_items.Insert(index, item);\n            OnChanged();\n        }\n\n        /// <summary>\n        /// Removes the item at the provided index\n        /// </summary>\n        /// <param name=\"index\"></param>\n        public void RemoveAt(int index)\n        {\n            T item = m_items[index];\n\n            OnRemoving(item);\n            m_items.RemoveAt(index);\n            OnChanged();\n        }\n\n        /// <summary>\n        /// Gets or sets the item at the given index\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        public T this[int index]\n        {\n            get { return m_items[index]; }\n            set\n            {\n                T item = m_items[index];\n\n                OnRemoving(item);\n                OnAdding(ref value);\n                m_items[index] = value;\n                OnChanged();\n            }\n        }\n\n        #endregion\n\n\n        #region ICollection<T> Members\n\n        /// <summary>\n        /// Adds an item at the end of the list.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        public void Add(T item)\n        {\n            OnAdding(ref item);\n            m_items.Add(item);\n            OnChanged();\n        }\n\n        /// <summary>\n        /// Adds the elements of the specified collection to the end of the list.\n        /// </summary>\n        /// <param name=\"items\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">items</exception>\n        public void AddRange(IEnumerable<T> items)\n        {\n            items.ThrowIfNull(nameof(items));\n\n            foreach (T item in items)\n            {\n                T copy = item;\n                OnAdding(ref copy);\n                m_items.Add(copy);\n            }\n            OnChanged();\n        }\n\n        /// <summary>\n        /// Removes the item from the list.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        public bool Remove(T item)\n        {\n            OnRemoving(item);\n\n            if (!m_items.Remove(item))\n                return false;\n\n            OnChanged();\n            return true;\n        }\n\n        /// <summary>\n        /// Clears the list.\n        /// </summary>\n        public void Clear()\n        {\n            foreach (T item in m_items)\n            {\n                OnRemoving(item);\n            }\n            m_items.Clear();\n            OnChanged();\n        }\n\n        /// <summary>\n        /// Gets true whether the list contains the given item.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        public bool Contains(T item) => m_items.Contains(item);\n\n        /// <summary>\n        /// Copy the list to the given array.\n        /// </summary>\n        /// <param name=\"array\"></param>\n        /// <param name=\"arrayIndex\"></param>\n        public void CopyTo(T[] array, int arrayIndex)\n        {\n            m_items.CopyTo(array, arrayIndex);\n        }\n\n        /// <summary>\n        /// Gets the number of items in the list.\n        /// </summary>\n        public int Count => m_items.Count;\n\n        /// <summary>\n        /// Gets false\n        /// </summary>\n        public bool IsReadOnly => false;\n\n        #endregion\n\n\n        #region IEnumerable<T> Members\n\n        /// <summary>\n        /// Gets an enumerator over this list.\n        /// </summary>\n        /// <returns></returns>\n        public IEnumerator<T> GetEnumerator() => m_items.GetEnumerator();\n\n        IEnumerator IEnumerable.GetEnumerator() => m_items.GetEnumerator();\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Collections/CollectionExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Collections\n{\n    public static class CollectionExtensions\n    {\n        /// <summary>\n        /// Adds the elements of the specified collection to the end of the <see cref=\"System.Collections.ObjectModel.Collection{T}\" />.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"collection\">The collection.</param>\n        /// <param name=\"values\">The values.</param>\n        /// <exception cref=\"System.ArgumentNullException\">collection or values</exception>\n        public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> values)\n        {\n            collection.ThrowIfNull(nameof(collection));\n\n            values.ThrowIfNull(nameof(values));\n\n            foreach (T item in values)\n            {\n                collection.Add(item);\n            }\n        }\n\n        /// <summary>\n        /// Searches for an element that matches the conditions defined by the specified predicate,\n        /// and returns the first occurrence within the entire <see cref=\"System.Collections.ObjectModel.Collection{T}\" />.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"collection\">The collection.</param>\n        /// <param name=\"predicate\">The predicate.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">collection</exception>\n        public static T Find<T>(this ICollection<T> collection, Predicate<T> predicate)\n        {\n            collection.ThrowIfNull(nameof(collection));\n\n            foreach (T item in collection.Where(item => predicate(item)))\n            {\n                return item;\n            }\n            return default(T);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Collections/EnumerableExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Collections\n{\n    public static class EnumerableExtensions\n    {\n        /// <summary>\n        /// Uses an insertion sort algorithm to perform a stable sort (keep the initial order of the keys with equal values).\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"list\">The list.</param>\n        /// <param name=\"comparer\">The comparer.</param>\n        /// <remarks>Memory overhead is null, average complexity is O(n.ln(n)), worst-case is O(n²).</remarks>\n        public static void StableSort<T>(this IList<T> list, IComparer<T> comparer)\n        {\n            list.StableSort(comparer.Compare);\n        }\n\n        /// <summary>\n        /// Uses an insertion sort algorithm to perform a stable sort (keep the initial order of the keys with equal values).\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"list\">The list.</param>\n        /// <param name=\"comparison\">The comparison.</param>\n        /// <remarks>Memory overhead is null, average complexity is O(n.ln(n)), worst-case is O(n²).</remarks>\n        /// <exception cref=\"System.ArgumentNullException\">list or comparison</exception>\n        public static void StableSort<T>(this IList<T> list, Comparison<T> comparison)\n        {\n            list.ThrowIfNull(nameof(list));\n\n            comparison.ThrowIfNull(nameof(comparison));\n\n            // For every key\n            for (int i = 1; i < list.Count; i++)\n            {\n                T value = list[i];\n                int j = i - 1;\n\n                // Move the key backward while the previous items are lesser than it, shifting those items to the right\n                while (j >= 0 && comparison(list[j], value) > 0)\n                {\n                    list[j + 1] = list[j];\n                    j--;\n                }\n\n                // Insert at the left of the scrolled sequence, immediately on the right of the first lesser or equal value it found\n                list[j + 1] = value;\n            }\n        }\n\n        /// <summary>\n        /// Gets the index of the given element in this enumeration, or -1 when the item is absent from the enumeration.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"src\"></param>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public static int IndexOf<T>(this IEnumerable<T> src, T item)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            int index = 0;\n            foreach (T srcItem in src)\n            {\n                if (Equals(item, srcItem))\n                    return index;\n                index++;\n            }\n            return -1;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Collections/FastList.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Collections\n{\n    /// <summary>\n    /// Implements an as fast and light list as possible. No checks are performed, no synchronization possibilities, etc, etc, etc.\n    /// </summary>\n    /// <remarks>\n    /// Beware ! This list is a struct. Resizing it (or adding items and such) may mean to change the array and, therefore, the structure.\n    /// Also, this structure *must* be initialized with the custom capacity-based constructor to avoid <see cref=\"NullReferenceException\"/>.\n    /// Use when you're sure about what you're doing.\n    /// </remarks>\n    /// <typeparam name=\"T\"></typeparam>\n    public struct FastList<T> : IList<T>\n    {\n        #region Enumerator\n\n        /// <summary>\n        /// An enumerator for the FastList.\n        /// </summary>\n        private struct Enumerator : IEnumerator<T>\n        {\n            private T[] m_items;\n            private int m_index;\n            private readonly int m_count;\n\n            /// <summary>\n            /// Constructor\n            /// </summary>\n            /// <param name=\"items\"></param>\n            /// <param name=\"count\"></param>\n            public Enumerator(T[] items, int count)\n            {\n                m_items = items;\n                m_count = count;\n                m_index = -1;\n            }\n\n            /// <summary>\n            /// Gets the current.\n            /// </summary>\n            /// <value>The current.</value>\n            public T Current => m_items[m_index];\n\n            /// <summary>\n            /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.\n            /// </summary>\n            public void Dispose()\n            {\n                m_items = null;\n            }\n\n            /// <summary>\n            /// Gets the current.\n            /// </summary>\n            /// <value>The current.</value>\n            object IEnumerator.Current => m_items[m_index];\n\n            /// <summary>\n            /// Advances the enumerator to the next element of the collection.\n            /// </summary>\n            /// <returns>\n            /// true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection.\n            /// </returns>\n            /// <exception cref=\"T:System.InvalidOperationException\">The collection was modified after the enumerator was created. </exception>\n            public bool MoveNext()\n            {\n                m_index++;\n                return m_index < m_count;\n            }\n\n            /// <summary>\n            /// Sets the enumerator to its initial position, which is before the first element in the collection.\n            /// </summary>\n            /// <exception cref=\"T:System.InvalidOperationException\">The collection was modified after the enumerator was created. </exception>\n            public void Reset()\n            {\n                m_index = -1;\n            }\n        }\n\n        #endregion\n\n\n        private T[] m_items;\n\n        /// <summary>\n        /// Constructor with a starting capacity. Always use this constructor, not the default one !\n        /// </summary>\n        /// <param name=\"capacity\">Initial capacity of the list</param>\n        public FastList(int capacity)\n            : this()\n        {\n            m_items = new T[capacity];\n            Count = 0;\n        }\n\n        /// <summary>\n        /// Gets the number of items within this list.\n        /// </summary>\n        public int Count { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the current capacity of the list.\n        /// </summary>\n        public int Capacity\n        {\n            get { return m_items.Length; }\n            set\n            {\n                if (value < Count)\n                    throw new ArgumentException(\"The given count is lesser than the items in the list.\");\n\n                Array.Resize(ref m_items, value);\n            }\n        }\n\n        /// <summary>\n        /// Gets / sets the item at the given index.\n        /// </summary>\n        /// <param name=\"index\">The index where the item is located</param>\n        /// <returns>The item found at the given index</returns>\n        public T this[int index]\n        {\n            get { return m_items[index]; }\n            set { m_items[index] = value; }\n        }\n\n        /// <summary>\n        /// Gets the index of an item within the list.\n        /// </summary>\n        /// <param name=\"item\">The item to search for</param>\n        /// <returns>The index where the item was found, -1 otherwise</returns>\n        public int IndexOf(T item)\n        {\n            EqualityComparer<T> comparer = EqualityComparer<T>.Default;\n\n            for (int i = 0; i < Count; i++)\n            {\n                if (comparer.Equals(m_items[i], item))\n                    return i;\n            }\n            return -1;\n        }\n\n        /// <summary>\n        /// Adds an item at the end of the list.\n        /// </summary>\n        /// <param name=\"item\">The item to add</param>\n        public void Add(T item)\n        {\n            // We ensure the capacity is high enough\n            if (Count == m_items.Length)\n            {\n                int newSize = Math.Max(1, Count + 1);\n                Capacity = newSize;\n            }\n\n            // We add the item\n            m_items[Count] = item;\n\n            // Finally, we increase the count\n            Count++;\n        }\n\n        /// <summary>\n        /// Add items at the end of the list.\n        /// </summary>\n        /// <param name=\"enumerable\">The enumeration containing the items to add</param>\n        /// <exception cref=\"System.ArgumentNullException\">enumerable</exception>\n        public void AddRange(IEnumerable<T> enumerable)\n        {\n            enumerable.ThrowIfNull(nameof(enumerable));\n\n            // Scroll through the items to add\n            foreach (T item in enumerable)\n            {\n                // Ensure size is enough\n                if (Count == m_items.Length)\n                {\n                    int newSize = Math.Max(1, Count + 1);\n                    Array.Resize(ref m_items, newSize);\n                }\n\n                // We add the item\n                m_items[Count] = item;\n\n                // Finally, we increase the count\n                Count++;\n            }\n        }\n\n        /// <summary>\n        /// Add items at the end of the list.\n        /// </summary>\n        /// <param name=\"list\">The list containing the items to add</param>\n        public void AddRange(FastList<T> list)\n        {\n            AddRange(list.m_items, list.Count);\n        }\n\n        /// <summary>\n        /// Add items at the end of the list.\n        /// </summary>\n        /// <param name=\"newItems\">The array containing the items to add</param>\n        /// <param name=\"newCount\">The number of items to add</param>\n        private void AddRange(T[] newItems, int newCount)\n        {\n            // We ensure the capacity is high enough\n            if (Count + newCount > m_items.Length)\n            {\n                int newSize = Math.Max(Count + newCount, Count + 1);\n                Array.Resize(ref m_items, newSize);\n            }\n\n            // Append items\n            Array.Copy(newItems, 0, m_items, Count, newCount);\n\n            // Finally, we increase the count\n            Count += newCount;\n        }\n\n        /// <summary>\n        /// Insert an item at the given index.\n        /// </summary>\n        /// <param name=\"index\">The item to insert</param>\n        /// <param name=\"item\">The index to insert the item in</param>\n        public void Insert(int index, T item)\n        {\n            // We ensure the capacity is high enough\n            if (Count == m_items.Length)\n            {\n                int newSize = Math.Max(1, Count + 1);\n                Array.Resize(ref m_items, newSize);\n            }\n\n            // Do we need to shift items before ? (insertion rather than addition)\n            if (index < Count)\n                Array.Copy(m_items, index, m_items, index + 1, Count - index);\n            m_items[index] = item;\n\n            // Finally, we increase the count\n            Count++;\n        }\n\n        /// <summary>\n        /// Removes the item located at the specified index.\n        /// </summary>\n        /// <param name=\"index\">The index to remove the item from</param>\n        public void RemoveAt(int index)\n        {\n            // When item is not the last item, shift the items after it to the left\n            if (index < Count - 1)\n                Array.Copy(m_items, index + 1, m_items, index, Count - (index + 1));\n\n            // Make sure we don't hold a reference anymore over the left item\n            m_items[Count - 1] = default(T);\n\n            // Updates the count\n            Count--;\n        }\n\n        /// <summary>\n        /// Removes the specified item from the list.\n        /// </summary>\n        /// <param name=\"item\">The item to remove</param>\n        /// <returns>True if the item was found, false otherwise</returns>\n        public bool Remove(T item)\n        {\n            EqualityComparer<T> comparer = EqualityComparer<T>.Default;\n\n            for (int i = 0; i < Count; i++)\n            {\n                if (!comparer.Equals(m_items[i], item))\n                    continue;\n\n                RemoveAt(i);\n                return true;\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// Clears the list.\n        /// </summary>\n        public void Clear()\n        {\n            Array.Clear(m_items, 0, Count);\n            Count = 0;\n        }\n\n        /// <summary>\n        /// Checks whether a given item is present in the list.\n        /// </summary>\n        /// <param name=\"item\">The item to search for</param>\n        /// <returns>True if the item was found in this list, false otherwise</returns>\n        public bool Contains(T item)\n        {\n            EqualityComparer<T> comparer = EqualityComparer<T>.Default;\n\n            for (int i = 0; i < Count; i++)\n            {\n                if (comparer.Equals(m_items[i], item))\n                    return true;\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// Copy those list's items in the specified array.\n        /// </summary>\n        /// <param name=\"array\">The destination array</param>\n        /// <param name=\"arrayIndex\">The starynig index in the destination array</param>\n        public void CopyTo(T[] array, int arrayIndex)\n        {\n            Array.Copy(m_items, 0, array, arrayIndex, Count);\n        }\n\n        /// <summary>\n        /// Reverses the list.\n        /// </summary>\n        public void Reverse()\n        {\n            Array.Reverse(m_items);\n        }\n\n        /// <summary>\n        /// Gets an enumerator over this list.\n        /// </summary>\n        /// <returns>The enumerator over this list</returns>\n        public IEnumerator<T> GetEnumerator()\n        {\n            if (m_items == null || Count == 0)\n                return new Enumerator();\n            return new Enumerator(m_items, Count);\n        }\n\n        /// <summary>\n        /// Gets a non-generic enumerator over this list.\n        /// </summary>\n        /// <returns>The enumerator over this list</returns>\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            if (m_items == null || Count == 0)\n                return new Enumerator();\n            return new Enumerator(m_items, Count);\n        }\n\n        /// <summary>\n        /// Gets false, since the list is not readonly.\n        /// </summary>\n        bool ICollection<T>.IsReadOnly => false;\n\n        /// <summary>\n        /// Trims the list.\n        /// </summary>\n        internal void Trim()\n        {\n            Array.Resize(ref m_items, Count);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Collections/Global/GlobalAPIKeyCollection.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Collections.Global\n{\n    public class GlobalAPIKeyCollection : ReadonlyKeyedCollection<long, ESIKey>\n    {\n\n        #region Indexer\n\n        /// <summary>\n        /// Gets the API key with the provided id, null when not found\n        /// </summary>\n        /// <value>\n        /// The <see cref=\"ESIKey\"/>.\n        /// </value>\n        /// <param name=\"id\">The id to look for</param>\n        /// <returns>\n        /// The searched API key when found; null otherwise.\n        /// </returns>\n        public ESIKey this[long id] => Items.Values.FirstOrDefault(apiKey => apiKey.ID == id);\n\n        #endregion\n\n\n        #region Addition / Removal Methods\n\n        /// <summary>\n        /// Removes the provided API key from this collection.\n        /// </summary>\n        /// <param name=\"apiKey\">The API key to remove</param>\n        /// <exception cref=\"System.InvalidOperationException\">The API key does not exist in the list.</exception>\n        /// <exception cref=\"System.ArgumentNullException\">apiKey</exception>\n        public void Remove(ESIKey apiKey)\n        {\n            apiKey.ThrowIfNull(nameof(apiKey));\n\n            // Removes the API key on the owned identities\n            foreach (CharacterIdentity identity in apiKey.CharacterIdentities.Where(x => x.ESIKeys.Contains(apiKey)))\n            {\n                identity.ESIKeys.Remove(apiKey);\n\n                if (identity.CCPCharacter != null)\n                    EveMonClient.OnCharacterUpdated(identity.CCPCharacter);\n            }\n\n            // Remove the API key\n            if (!Items.Remove(apiKey.ID))\n                throw new InvalidOperationException(\"This API key does not exist in the list.\");\n\n            // Dispose\n            apiKey.Dispose();\n\n            EveMonClient.OnESIKeyCollectionChanged();\n        }\n\n        /// <summary>\n        /// Adds an API key to this collection.\n        /// </summary>\n        /// <param name=\"apiKey\"></param>\n        internal void Add(ESIKey apiKey)\n        {\n            Items.Add(apiKey.ID, apiKey);\n            EveMonClient.OnESIKeyCollectionChanged();\n        }\n\n        #endregion\n\n\n        #region Import / Export Methods\n\n        /// <summary>\n        /// Imports the serialized API key.\n        /// </summary>\n        /// <param name=\"serial\"></param>\n        internal void Import(IEnumerable<SerializableESIKey> serial)\n        {\n            // Unsubscribe events\n            foreach (ESIKey apiKey in Items.Values)\n            {\n                apiKey.Dispose();\n            }\n\n            Items.Clear();\n            foreach (SerializableESIKey apikey in serial)\n            {\n                try\n                {\n                    Items.Add(apikey.ID, new ESIKey(apikey));\n                }\n                catch (ArgumentException ex)\n                {\n                    EveMonClient.Trace($\"An API key with id {apikey.ID} already existed; additional instance ignored.\");\n                    ExceptionHandler.LogException(ex, true);\n                }\n            }\n\n            EveMonClient.OnESIKeyCollectionChanged();\n        }\n\n        /// <summary>\n        /// Exports the data to a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        internal IEnumerable<SerializableESIKey> Export() => Items.Values.Select(apikey => apikey.Export());\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Collections/Global/GlobalAPIProviderCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Collections.Global\n{\n    /// <summary>\n    /// Represents the API providers defined by the user.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class GlobalAPIProviderCollection : ReadonlyVirtualCollection<APIProvider>\n    {\n        private readonly List<APIProvider> m_customProviders = new List<APIProvider>();\n        private APIProvider m_currentProvider;\n\n        /// <summary>\n        /// Private constructor, only the mother class can instantiate it.\n        /// </summary>\n        internal GlobalAPIProviderCollection()\n        {\n            CurrentProvider = DefaultProvider;\n        }\n\n\n        #region Public properties\n\n        /// <summary>\n        /// Gets the default provider.\n        /// </summary>\n        public static APIProvider DefaultProvider => APIProvider.DefaultProvider;\n\n        /// <summary>\n        /// Gets the default provider.\n        /// </summary>\n        public static APIProvider TestProvider => APIProvider.TestProvider;\n        \n        /// <summary>\n        /// Gets the used provider.\n        /// </summary>\n        /// <exception cref=\"InvalidOperationException\">The given provider is not in the list</exception>\n        public APIProvider CurrentProvider\n        {\n            get { return m_currentProvider; }\n            set\n            {\n                // Is it the default provider ?\n                if (APIProvider.DefaultProvider == value)\n                    m_currentProvider = value;\n                // is it the test provider\n                else if (APIProvider.TestProvider == value)\n                    m_currentProvider = value;\n                // Then it's a non-register provider, we messed up since it should be in this global collection\n                else\n                    throw new InvalidOperationException(\"The given provider is not in the list\");\n            }\n        }\n\n        #endregion\n\n\n        #region Indexer\n\n        /// <summary>\n        /// Gets an API provider by its name, returning null when not found.\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <returns>The wanted API provider when found; null otherwise.</returns>\n        // Is it the default provider ? If not look among custom providers\n        private APIProvider this[string name]\n            => DefaultProvider.Name == name\n                ? DefaultProvider\n                : m_customProviders.FirstOrDefault(provider => provider.Name == name);\n\n        #endregion\n        \n\n        /// <summary>\n        /// Core method to implement for collection services.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<APIProvider> Enumerate()\n        {\n            yield return APIProvider.DefaultProvider;\n\n            foreach (APIProvider provider in m_customProviders)\n            {\n                yield return provider;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Collections/Global/GlobalCharacterCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Collections.Global\n{\n    /// <summary>\n    /// Represents the global collection of characters.\n    /// </summary>\n    public sealed class GlobalCharacterCollection : ReadonlyCollection<Character>\n    {\n        /// <summary>\n        /// Gets a character by its guid.\n        /// </summary>\n        /// <param name=\"guid\"></param>\n        /// <returns></returns>\n        public Character this[string guid] => Items.FirstOrDefault(character => character.Guid.ToString() == guid);\n\n        /// <summary>\n        /// Adds a character to this collection.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"notify\"></param>\n        /// <param name=\"monitor\"></param>\n        internal void Add(Character character, bool notify = true, bool monitor = true)\n        {\n            Items.Add(character);\n\n            if (monitor)\n                character.Monitored = true;\n\n            if (notify)\n                EveMonClient.OnCharacterCollectionChanged();\n        }\n\n        /// <summary>\n        /// Removes a character from this collection.\n        /// Also removes it from the monitored characters collection and removes all of its\n        /// related ESI keys.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"notify\"></param>\n        public void Remove(Character character, bool notify = true)\n        {\n            Items.Remove(character);\n            character.Monitored = false;\n\n            if (character is CCPCharacter) {\n                var keys = character.Identity.ESIKeys;\n                var oldKeys = keys.ToList();\n\n                // Clear all the keys so that we do not get into an infinite loop\n                keys.Clear();\n                oldKeys.ForEach(esiKey => EveMonClient.ESIKeys.Remove(esiKey));\n            }\n\n            // Dispose\n            character.Dispose();\n\n            if (notify)\n                EveMonClient.OnCharacterCollectionChanged();\n        }\n\n        /// <summary>\n        /// Asynchronously adds a character from the given uri, adding a new identity when needed.\n        /// </summary>\n        /// <param name=\"uri\">The uri to load the character sheet from</param>\n        /// <exception cref=\"System.ArgumentNullException\">uri</exception>\n        public static async Task<UriCharacterEventArgs> TryAddOrUpdateFromUriAsync(Uri uri)\n        {\n            uri.ThrowIfNull(nameof(uri));\n\n            // It's a web address, let's do it in an async way\n            if (!uri.IsFile)\n            {\n                var result = await Util.DownloadAPIResultAsync<SerializableAPICharacterSheet>(\n                    uri, null, APIProvider.RowsetsTransform);\n                return new UriCharacterEventArgs(uri, result);\n            }\n\n            // We have a file, let's just deserialize it synchronously\n            string xmlRootElement = Util.GetXmlRootElement(uri);\n\n            switch (xmlRootElement.ToLower(CultureConstants.DefaultCulture))\n            {\n                case \"eveapi\":\n                    CCPAPIResult<SerializableAPICharacterSheet> apiResult =\n                        Util.DeserializeAPIResultFromFile<SerializableAPICharacterSheet>(uri.LocalPath,\n                            APIProvider.RowsetsTransform);\n                    return new UriCharacterEventArgs(uri, apiResult);\n                case \"serializableccpcharacter\":\n                    try\n                    {\n                        SerializableCCPCharacter ccpResult =\n                            Util.DeserializeXmlFromFile<SerializableCCPCharacter>(uri.LocalPath);\n                        return new UriCharacterEventArgs(uri, ccpResult);\n                    }\n                    catch (NullReferenceException ex)\n                    {\n                        return new UriCharacterEventArgs(uri,\n                            $\"Unable to load file (SerializableCCPCharacter). ({ex.Message})\");\n                    }\n                case \"serializableuricharacter\":\n                    try\n                    {\n                        SerializableUriCharacter uriCharacterResult =\n                            Util.DeserializeXmlFromFile<SerializableUriCharacter>(uri.LocalPath);\n                        return new UriCharacterEventArgs(uri, uriCharacterResult);\n                    }\n                    catch (NullReferenceException ex)\n                    {\n                        return new UriCharacterEventArgs(uri,\n                            $\"Unable to load file (SerializableUriCharacter). ({ex.Message})\");\n                    }\n                default:\n                    return new UriCharacterEventArgs(uri, \"Format Not Recognized\");\n            }\n        }\n\n        /// <summary>\n        /// Imports the character identities from a serialization object.\n        /// </summary>\n        /// <param name=\"serial\"></param>\n        internal void Import(IEnumerable<SerializableSettingsCharacter> serial)\n        {\n            // Clear the API key on every identity\n            foreach (CharacterIdentity id in EveMonClient.CharacterIdentities)\n            {\n                id.ESIKeys.Clear();\n            }\n\n            // Unsubscribe any event handlers in character\n            foreach (Character character in Items)\n            {\n                character.Dispose();\n            }\n\n            // Import the characters, their identies, etc\n            Items.Clear();\n            foreach (SerializableSettingsCharacter serialCharacter in serial)\n            {\n                // Gets the identity or create it\n                CharacterIdentity id = EveMonClient.CharacterIdentities[serialCharacter.ID] ??\n                    EveMonClient.CharacterIdentities.Add(serialCharacter.ID, serialCharacter.Name);\n\n                // Imports the character\n                SerializableCCPCharacter ccpCharacter = serialCharacter as SerializableCCPCharacter;\n                if (ccpCharacter != null)\n                    this.Add(new CCPCharacter(id, ccpCharacter), false, false);\n                else\n                {\n                    SerializableUriCharacter uriCharacter = serialCharacter as SerializableUriCharacter;\n                    this.Add(new UriCharacter(id, uriCharacter), false, false);\n                }\n            }\n\n            // Notify the change\n            EveMonClient.OnCharacterCollectionChanged();\n        }\n\n        /// <summary>\n        /// Exports this collection to a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        internal IEnumerable<SerializableSettingsCharacter> Export() => Items.Select(character => character.Export());\n\n        /// <summary>\n        /// Searches through all characters in this collection and reports a list of the\n        /// custom labels that are already defined. null and empty string will not be\n        /// included. Labels are case sensitive.\n        /// </summary>\n        /// <returns></returns>\n        public IEnumerable<string> GetKnownLabels()\n        {\n            var labels = new SortedSet<string>();\n            foreach (Character character in Items)\n            {\n                string label = character.Label;\n                if (!label.IsEmptyOrUnknown())\n                    labels.Add(label);\n            }\n            return labels;\n        }\n\n        /// <summary>\n        /// imports the plans from serialization objects.\n        /// </summary>\n        /// <param name=\"serial\"></param>\n        internal void ImportPlans(ICollection<SerializablePlan> serial)\n        {\n            foreach (Character character in Items)\n            {\n                character.ImportPlans(serial);\n            }\n        }\n\n        /// <summary>\n        /// Exports the plans as serialization objects.\n        /// </summary>\n        /// <returns></returns>\n        internal IEnumerable<SerializablePlan> ExportPlans()\n        {\n            List<SerializablePlan> serial = new List<SerializablePlan>();\n            foreach (Character character in Items)\n            {\n                character.ExportPlans(serial);\n            }\n\n            return serial;\n        }\n\n        /// <summary>\n        /// Update character account statuses. Used after APIKeys list is updated\n        /// </summary>\n        internal void UpdateAccountStatuses()\n        {\n            foreach (Character character in Items)\n            {\n                character.UpdateAccountStatus();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Collections/Global/GlobalCharacterIdentityCollection.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Collections.Global\n{\n    /// <summary>\n    /// Represents the characters list\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class GlobalCharacterIdentityCollection : ReadonlyKeyedCollection<long, CharacterIdentity>\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        internal GlobalCharacterIdentityCollection()\n        {\n        }\n\n        /// <summary>\n        /// Gets the character identity with the given id, or null if none was created so far.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public CharacterIdentity this[long id] => GetByKey(id);\n\n        /// <summary>\n        /// Creates and stores a new character identity.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <param name=\"name\">The name.</param>\n        /// <returns>The identity created.</returns>\n        internal CharacterIdentity Add(long id, string name)\n        {\n            if (Items.ContainsKey(id))\n                throw new ArgumentException(\"An identity with the same ID already exists.\");\n\n            CharacterIdentity identity = new CharacterIdentity(id, name);\n            Items[id] = identity;\n            return identity;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Collections/Global/GlobalDatafileCollection.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Collections.Global\n{\n    /// <summary>\n    /// Implements a collection of datafiles\n    /// </summary>\n    public sealed class GlobalDatafileCollection : ReadonlyCollection<Datafile>\n    {\n        public static event EventHandler LoadingProgress;\n\n        /// <summary>\n        /// Default constructor. This class is only instantiated by EveMonClient.\n        /// </summary>\n        internal GlobalDatafileCollection()\n        {\n            try\n            {\n                Items.Clear();\n                Items.Add(new Datafile(DatafileConstants.PropertiesDatafile));\n                Items.Add(new Datafile(DatafileConstants.ItemsDatafile));\n                Items.Add(new Datafile(DatafileConstants.SkillsDatafile));\n                Items.Add(new Datafile(DatafileConstants.CertificatesDatafile));\n                Items.Add(new Datafile(DatafileConstants.MasteriesDatafile));\n                Items.Add(new Datafile(DatafileConstants.BlueprintsDatafile));\n                Items.Add(new Datafile(DatafileConstants.GeographyDatafile));\n                Items.Add(new Datafile(DatafileConstants.ReprocessingDatafile));\n            }\n            catch (Exception ex)\n            {\n                // Don't worry if we can't create MD5 maybe they have FIPS enforced\n                EveMonClient.Trace(\n                    \"Couldn't compute datafiles checksums. FIPS was enforced, the datafiles were missing, or we couldn't copy to %APPDATA%.\");\n                ExceptionHandler.LogRethrowException(ex);\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Loads the static data.\n        /// </summary>\n        public static async Task LoadAsync()\n        {\n            // Quit if the client has been shut down\n            if (EveMonClient.Closed)\n                return;\n\n            // This is the time optimal loading order\n            // (min order to follow : \n            // skills before anything else,\n            // properties before items,\n            // items before blueprints, reprocessing and certificates,\n            // certs before masteries)\n\n            EveMonClient.Trace(\"Datafiles.Load - begin\", printMethod: false);\n\n            // Must always run first\n            // It will have finished loading until static skills finish\n            Task properties = TaskHelper.RunIOBoundTaskAsync(() => StaticProperties.Load());\n\n            // Must always run before items\n            Task skills = TaskHelper.RunIOBoundTaskAsync(() => StaticSkills.Load());\n\n            await Task.WhenAll(skills, properties);\n\n            // Must always run synchronously as blueprints, reprocessing and certificates depend on it\n            await TaskHelper.RunIOBoundTaskAsync(() => StaticItems.Load());\n\n            // Must always run synchronously as masteries depend on it\n            await TaskHelper.RunIOBoundTaskAsync(() => StaticCertificates.Load());\n\n            // Must always run synchronously as ID to name depends on it\n            await TaskHelper.RunIOBoundTaskAsync(() => StaticGeography.Load());\n\n            // Non critical loadings as all dependencies have been loaded\n            Task blueprints = TaskHelper.RunIOBoundTaskAsync(() => StaticBlueprints.Load());\n            Task reprocessing = TaskHelper.RunIOBoundTaskAsync(() => StaticReprocessing.Load());\n            await TaskHelper.RunIOBoundTaskAsync(() => StaticMasteries.Load());\n\n            EveMonClient.Trace(\"Datafiles.Load - done\", printMethod: false);\n        }\n\n        /// <summary>\n        /// Called when a datafile has been loaded.\n        /// </summary>\n        public static void OnDatafileLoaded()\n        {\n            // Notify the subscribers\n            LoadingProgress?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Collections/Global/GlobalMonitoredCharacterCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Collections.Global\n{\n    /// <summary>\n    /// Represents the characters list\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class GlobalMonitoredCharacterCollection : ReadonlyCollection<Character>\n    {\n        /// <summary>\n        /// Update the order from the given list.\n        /// </summary>\n        /// <param name=\"order\"></param>\n        public void Update(IEnumerable<Character> order)\n        {\n            Items.Clear();\n            Items.AddRange(order);\n\n            // Notify the change\n            EveMonClient.OnMonitoredCharactersChanged();\n        }\n\n        /// <summary>\n        /// Moves the given character to the target index.\n        /// </summary>\n        /// <remarks>\n        /// When the item is located before the target index, it is decremented. \n        /// That way we ensures the item is actually inserted before the item that originally was at <c>targetindex</c>.\n        /// </remarks>\n        /// <param name=\"item\"></param>\n        /// <param name=\"targetIndex\"></param>\n        public void MoveTo(Character item, int targetIndex)\n        {\n            int oldIndex = Items.IndexOf(item);\n            if (oldIndex == -1)\n                throw new InvalidOperationException(\"The item was not found in the collection.\");\n\n            if (oldIndex < targetIndex)\n                targetIndex--;\n            Items.RemoveAt(oldIndex);\n            Items.Insert(targetIndex, item);\n\n            EveMonClient.OnMonitoredCharactersChanged();\n        }\n\n        /// <summary>\n        /// When the <see cref=\"Character.Monitored\"/> property changed, this collection is updated.\n        /// </summary>\n        /// <param name=\"character\">The character for which the property changed.</param>\n        /// <param name=\"value\"></param>\n        internal void OnCharacterMonitoringChanged(Character character, bool value)\n        {\n            if (value)\n            {\n                if (Items.Contains(character))\n                    return;\n\n                Items.Add(character);\n                EveMonClient.OnMonitoredCharactersChanged();\n                return;\n            }\n\n            if (!Items.Contains(character))\n                return;\n\n            Items.Remove(character);\n            EveMonClient.OnMonitoredCharactersChanged();\n        }\n\n        /// <summary>\n        /// Imports the given characters.\n        /// </summary>\n        /// <param name=\"monitoredCharacters\"></param>\n        internal void Import(ICollection<MonitoredCharacterSettings> monitoredCharacters)\n        {\n            Items.Clear();\n\n            if (!monitoredCharacters.Any())\n            {\n                EveMonClient.OnMonitoredCharactersChanged();\n                return;\n            }\n\n            foreach (MonitoredCharacterSettings characterSettings in monitoredCharacters)\n            {\n                Character character = EveMonClient.Characters[characterSettings.CharacterGuid.ToString()];\n                if (character == null)\n                    continue;\n\n                Items.Add(character);\n                character.Monitored = true;\n                character.UISettings = characterSettings.Settings;\n\n                EveMonClient.OnMonitoredCharactersChanged();\n            }\n        }\n\n        /// <summary>\n        /// Updates the settings from <see cref=\"Settings\"/>. Adds and removes group as needed.\n        /// </summary>\n        internal IEnumerable<MonitoredCharacterSettings> Export()\n            => Items.Select(character => new MonitoredCharacterSettings(character));\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Collections/Global/GlobalNotificationCollection.cs",
    "content": "﻿using EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Notifications;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace EVEMon.Common.Collections.Global\n{\n    /// <summary>\n    /// The collection used by <see cref=\"EveMonClient.Notifications\"/>\n    /// </summary>\n    public sealed class GlobalNotificationCollection : ReadonlyCollection<NotificationEventArgs>\n    {\n        /// <summary>\n        /// Constructor, used by <see cref=\"EveMonClient\"/> only.\n        /// </summary>\n        internal GlobalNotificationCollection()\n        {\n        }\n\n        /// <summary>\n        /// Protected default constructor with an initial capacity.\n        /// </summary>\n        internal GlobalNotificationCollection(int capacity)\n            : base(capacity)\n        {\n        }\n\n        /// <summary>\n        /// Clears the collection.\n        /// </summary>\n        public void Clear()\n        {\n            Items.Clear();\n        }\n\n        /// <summary>\n        /// Adds a notification to this collection.\n        /// </summary>\n        /// <param name=\"notification\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">notification</exception>\n        public void Notify(NotificationEventArgs notification)\n        {\n            notification.ThrowIfNull(nameof(notification));\n\n            switch (notification.Behaviour)\n            {\n            case NotificationBehaviour.Cohabitate:\n                Items.Add(notification);\n                break;\n\n            case NotificationBehaviour.Overwrite:\n                // Replace the previous notifications with the same invalidation key\n                InvalidateCore(notification.InvalidationKey);\n                Items.Add(notification);\n                break;\n\n            case NotificationBehaviour.Merge:\n                // Merge the notifications with the same key\n                long key = notification.InvalidationKey;\n                foreach (NotificationEventArgs other in Items.Where(x => x.InvalidationKey == key))\n                {\n                    notification.Append(other);\n                }\n\n                // Replace the previous notifications with the same invalidation key\n                InvalidateCore(key);\n                Items.Add(notification);\n                break;\n            }\n\n            EveMonClient.OnNotificationSent(notification);\n        }\n\n        /// <summary>\n        /// Invalidates the notifications with the given key and notify an event.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        public void Invalidate(NotificationInvalidationEventArgs e)\n        {\n            if (InvalidateCore(e.Key))\n                EveMonClient.OnNotificationInvalidated(e);\n        }\n\n        /// <summary>\n        /// Invalidates the notifications with the given key.\n        /// </summary>\n        /// <param name=\"key\"></param>\n        private bool InvalidateCore(long key)\n        {\n            int index = 0;\n            bool foundAny = false;\n\n            // Removes all the notifications with the given key\n            while (index < Items.Count)\n            {\n                if (Items[index].InvalidationKey != key)\n                    index++;\n                else\n                {\n                    Items.RemoveAt(index);\n                    foundAny = true;\n                }\n            }\n\n            // Did we remove anything\n            return foundAny;\n        }\n\n\n        #region API Server error\n\n        /// <summary>\n        /// Invalidates the notification for an API server querying error.\n        /// </summary>\n        internal void InvalidateAPIError()\n        {\n            Invalidate(new NotificationInvalidationEventArgs(null, NotificationCategory.\n                QueryingError));\n        }\n\n        /// <summary>\n        /// Notifies an SSO sign-in error.\n        /// </summary>\n        internal void NotifySSOError()\n        {\n            var notification = new NotificationEventArgs(null, NotificationCategory.\n                QueryingError)\n            {\n                Description = Properties.Resources.ErrorSSO,\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies an SSO character list error.\n        /// </summary>\n        /// <param name=\"key\">The ESI key which failed to load.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterListError(ESIKey key, JsonResult<EsiAPITokenInfo> result)\n        {\n            string charName = string.Format(\"token {0:D}\", key.ID);\n            // Attempt to match the ESI key to a character name\n            var id = EveMonClient.CharacterIdentities.FirstOrDefault((charID) => charID.\n                ESIKeys.Contains(key));\n            if (id != null)\n                charName = id.CharacterName;\n            var notification = new NotificationEventArgs(null, NotificationCategory.\n                QueryingError)\n            {\n                Description = string.Format(Properties.Resources.ErrorCharacterList, charName),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a citadel querying error.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCitadelQueryError(EsiResult<EsiAPIStructure> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(null, result)\n            {\n                Description = Properties.Resources.ErrorStructure,\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a kill mail query error.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyKillMailError(EsiResult<EsiAPIKillMail> result, string hash)\n        {\n            var notification = new APIErrorNotificationEventArgs(null, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorKillMail, hash),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a station querying error.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyStationQueryError(EsiResult<EsiAPIStation> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(null, result)\n            {\n                Description = Properties.Resources.ErrorStation,\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies an EVE factional warfare stats querying error.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyEveFactionalWarfareStatsError(EsiResult<EsiAPIEveFactionalWarfareStats> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(null, result)\n            {\n                Description = Properties.Resources.ErrorEVEFacWarStat,\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies an EVE factional war list querying error.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyEveFactionWarsError(EsiResult<EsiAPIEveFactionWars> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(null, result)\n            {\n                Description = Properties.Resources.ErrorEVEFacWarList,\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a character Id to name querying error.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterNameError(EsiResult<EsiAPICharacterNames> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(null, result)\n            {\n                Description = Properties.Resources.ErrorIDToName,\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a planet querying error.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyPlanetInfoError(EsiResult<EsiAPIPlanet> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(null, result)\n            {\n                Description = Properties.Resources.ErrorPlanets,\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        #endregion\n\n\n        #region Server status API error\n\n        /// <summary>\n        /// Notifies a server status querying error.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyServerStatusError(EsiResult<EsiAPIServerStatus> result)\n        {\n            var notification =\n                new APIErrorNotificationEventArgs(null, result)\n                {\n                    Description = Properties.Resources.ErrorStatus,\n                    Behaviour = NotificationBehaviour.Overwrite,\n                    Priority = NotificationPriority.Error\n                };\n            Notify(notification);\n        }\n\n        #endregion\n\n#if false\n\n        /// <summary>\n        /// Invalidates the notification for an account status error.\n        /// </summary>\n        /// <param name=\"apiKey\">The API key.</param>\n        internal void InvalidateAccountStatusError(ESIKey apiKey)\n        {\n            Invalidate(new NotificationInvalidationEventArgs(apiKey, NotificationCategory.QueryingError));\n        }\n\n        /// <summary>\n        /// Notifies an account status querying error.\n        /// </summary>\n        /// <param name=\"apiKey\">The API key.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyAccountStatusError(ESIKey apiKey, EsiResult<EsiAPIAccountStatus> result)\n        {\n            var notification =\n                new APIErrorNotificationEventArgs(apiKey, result)\n                {\n                    Description = string.Format(Properties.Resources.ErrorAccountStatus, apiKey),\n                    Behaviour = NotificationBehaviour.Overwrite,\n                    Priority = NotificationPriority.Error\n                };\n            Notify(notification);\n        }\n\n#endif\n\n\n        #region Character API errors\n\n        /// <summary>\n        /// Invalidates the notification for a character's API error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal void InvalidateCharacterAPIError(CCPCharacter character)\n        {\n            Invalidate(new NotificationInvalidationEventArgs(character, NotificationCategory.\n                QueryingError));\n        }\n\n        /// <summary>\n        /// Notifies a character sheet querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterSheetError(CCPCharacter character,\n            EsiResult<EsiAPICharacterSheet> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorCharacterSheet,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a character account balance querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterBalanceError(CCPCharacter character,\n            EsiResult<string> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorAccountBalance,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a character location querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterLocationError(CCPCharacter character,\n            EsiResult<EsiAPILocation> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorLocation,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a character clones querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterClonesError(CCPCharacter character,\n            EsiResult<EsiAPIClones> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorJumpClones,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a character jump fatigue querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterFatigueError(CCPCharacter character,\n            EsiResult<EsiAPIJumpFatigue> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorJumpFatigue,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a character attribute querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterAttributesError(CCPCharacter character,\n            EsiResult<EsiAPIAttributes> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorAttributes,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a character ship querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterShipError(CCPCharacter character,\n            EsiResult<EsiAPIShip> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorShip, character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a character implants querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterImplantsError(CCPCharacter character,\n            EsiResult<List<int>> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorImplants,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a skill querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterSkillsError(CCPCharacter character,\n            EsiResult<EsiAPISkills> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorSkills, character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies an employment history querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterEmploymentError(CCPCharacter character,\n            EsiResult<EsiAPIEmploymentHistory> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorEmploymentHistory,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a skill queue querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifySkillQueueError(CCPCharacter character,\n            EsiResult<EsiAPISkillQueue> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorSkillQueue,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a standings querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterStandingsError(CCPCharacter character,\n            EsiResult<EsiAPIStandings> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorStandings,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a factional warfare stats querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterFactionalWarfareStatsError(CCPCharacter character,\n            EsiResult<EsiAPIFactionalWarfareStats> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorFacWarStat,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies an assets querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterAssetsError(CCPCharacter character,\n            EsiResult<EsiAPIAssetList> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorAssets, character?.\n                    Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies the character market orders querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterMarketOrdersError(CCPCharacter character,\n            EsiResult<EsiAPIMarketOrders> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorMarketOrders,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a corporation market orders querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCorporationMarketOrdersError(CCPCharacter character,\n            EsiResult<EsiAPIMarketOrders> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorMarketOrders,\n                    character?.CorporationName),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies the character contracts querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterContractsError(CCPCharacter character,\n            EsiResult<EsiAPIContracts> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorContracts,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies the corporation contracts querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCorporationContractsError(CCPCharacter character,\n            EsiResult<EsiAPIContracts> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorContracts,\n                    character?.CorporationName),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a contract items querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyContractItemsError(CCPCharacter character,\n            EsiResult<EsiAPIContractItems> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorContractItems,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a contract bids querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyContractBidsError(CCPCharacter character,\n            EsiResult<EsiAPIContractBids> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorContractBids,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a wallet journal querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterWalletJournalError(CCPCharacter character,\n            EsiResult<EsiAPIWalletJournal> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorWalletJournal,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a wallet transactions querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterWalletTransactionsError(CCPCharacter character,\n            EsiResult<EsiAPIWalletTransactions> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorWalletTransactions,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a character industry jobs querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterIndustryJobsError(CCPCharacter character,\n            EsiResult<EsiAPIIndustryJobs> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorIndustryJobs,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a corporation industry jobs querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCorporationIndustryJobsError(CCPCharacter character,\n            EsiResult<EsiAPIIndustryJobs> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorIndustryJobs,\n                    character?.CorporationName),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a research querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterResearchPointsError(CCPCharacter character,\n            EsiResult<EsiAPIResearchPoints> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorResearchPoints,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a mail messages query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyEVEMailMessagesError(CCPCharacter character,\n            EsiResult<EsiAPIMailMessages> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorEVEMail,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a mail body query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyEVEMailBodiesError(CCPCharacter character,\n            EsiResult<EsiAPIMailBody> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorEVEMailBody,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a mailing lists query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyMailingListsError(CCPCharacter character,\n            EsiResult<EsiAPIMailingLists> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorEVEMailLists,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a notifications query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyEVENotificationsError(CCPCharacter character,\n            EsiResult<EsiAPINotifications> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorNotifications,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a contact list query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterContactsError(CCPCharacter character,\n            EsiResult<EsiAPIContactsList> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorContacts, character?.\n                    Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a medals query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterMedalsError(CCPCharacter character,\n            EsiResult<EsiAPIMedals> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorMedals, character?.\n                    Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a corporation medals querying error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCorporationMedalsError(CCPCharacter character,\n            EsiResult<EsiAPIMedals> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorMedals, character?.\n                    CorporationName),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies an upcoming calendar event details query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterUpcomingCalendarEventDetailsError(CCPCharacter character,\n            EsiResult<EsiAPICalendarEvent> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorCalendarDetails,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies an upcoming calendar events query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterUpcomingCalendarEventsError(CCPCharacter character,\n            EsiResult<EsiAPICalendarEvents> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorCalendarEvents,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a calendar event body query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterUpcomingCalendarEventInfoError(CCPCharacter character,\n            EsiResult<EsiAPICalendarEvent> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorCalendarDetails,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a calendar event attendees query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterCalendarEventAttendeesError(CCPCharacter character,\n            EsiResult<EsiAPICalendarEventAttendees> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorCalendarAttendees,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a kill log query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterKillLogError(CCPCharacter character,\n            EsiResult<EsiAPIKillLog> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorKillLog, character?.\n                    Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a planetary colonies query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterPlanetaryColoniesError(CCPCharacter character,\n            EsiResult<EsiAPIPlanetaryColoniesList> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorPlanets, character?.\n                    Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a planetary layout query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterPlanetaryLayoutError(CCPCharacter character,\n            EsiResult<EsiAPIPlanetaryColony> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorPlanetLayout,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notifies a loyalty query error.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"result\">The result.</param>\n        internal void NotifyCharacterLoyaltyPointsError(CCPCharacter character,\n            EsiResult<EsiAPILoyality> result)\n        {\n            var notification = new APIErrorNotificationEventArgs(character, result)\n            {\n                Description = string.Format(Properties.Resources.ErrorLoyalty,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Error\n            };\n            Notify(notification);\n        }\n\n        #endregion\n\n\n        #region Account expiration\n\n        /// <summary>\n        /// Invalidates the notification for an account expiration.\n        /// </summary>\n        /// <param name=\"apiKey\">The API key.</param>\n        internal void InvalidateAccountExpiration(ESIKey apiKey)\n        {\n            Invalidate(new NotificationInvalidationEventArgs(apiKey, NotificationCategory.\n                AccountExpiration));\n        }\n\n        /// <summary>\n        /// Notifies an account is to expire within a week.\n        /// </summary>\n        /// <param name=\"apiKey\">The API key.</param>\n        /// <param name=\"expireDate\">The expire date.</param>\n        /// <param name=\"priority\">The priority.</param>\n        internal void NotifyAccountExpiration(ESIKey apiKey, DateTime expireDate,\n            NotificationPriority priority)\n        {\n            var notification = new NotificationEventArgs(apiKey, NotificationCategory.\n                AccountExpiration)\n            {\n                Description = string.Format(Properties.Resources.MessageExpiration,\n                    expireDate.ToRemainingTimeShortDescription(DateTimeKind.Utc), apiKey),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = priority\n            };\n            Notify(notification);\n        }\n\n        #endregion\n\n\n        #region Insufficient balance\n\n        /// <summary>\n        /// Invalidates the notification for an insufficient balance.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal void InvalidateInsufficientBalance(CCPCharacter character)\n        {\n            Invalidate(new NotificationInvalidationEventArgs(character, NotificationCategory.\n                InsufficientBalance));\n        }\n\n        /// <summary>\n        /// Notifies an account has an insufficient balance.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal void NotifyInsufficientBalance(CCPCharacter character)\n        {\n            var notification = new NotificationEventArgs(character, NotificationCategory.\n                InsufficientBalance)\n            {\n                Description = string.Format(Properties.Resources.MessageMarginTrading,\n                    character?.Name),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Warning\n            };\n            Notify(notification);\n        }\n\n        #endregion\n\n\n        #region Skill completion\n\n        /// <summary>\n        /// Notifies a character finished training a skill.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"skillsCompleted\">The completed skills.</param>\n        internal void NotifySkillCompletion(CCPCharacter character,\n            IEnumerable<QueuedSkill> skillsCompleted)\n        {\n            var notification = new SkillCompletionNotificationEventArgs(character,\n                skillsCompleted)\n            {\n                Behaviour = NotificationBehaviour.Merge,\n                Priority = NotificationPriority.Information\n            };\n            Notify(notification);\n        }\n\n        #endregion\n\n\n        #region Skill queue less than threshold\n\n        /// <summary>\n        /// Invalidates the notification for skill queue availability.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal void InvalidateSkillQueueThreshold(CCPCharacter character)\n        {\n            Invalidate(new NotificationInvalidationEventArgs(character, NotificationCategory.\n                SkillQueueRoomAvailable));\n        }\n\n        /// <summary>\n        /// Notify when we have room to queue more skills.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"threshold\">The number of days to which the warning is set.</param>\n        internal void NotifySkillQueueThreshold(CCPCharacter character, int threshold)\n        {\n            string text, name = character?.Name;\n            if (threshold == 1)\n                text = \"a\";\n            else\n                text = threshold.ToString();\n            var notification = new NotificationEventArgs(character, NotificationCategory.\n                SkillQueueRoomAvailable)\n            {\n                Description = string.Format(Properties.Resources.MessageLessThanDay,\n                    character?.Name, text, threshold.S()),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Warning\n            };\n            Notify(notification);\n        }\n\n        #endregion\n\n\n        #region Server status\n\n        /// <summary>\n        /// Invalidates the notification for the server status.\n        /// </summary>\n        internal void InvalidateServerStatusChange()\n        {\n            Invalidate(new NotificationInvalidationEventArgs(null, NotificationCategory.\n                ServerStatusChange));\n        }\n\n        /// <summary>\n        /// Notifies about the server status.\n        /// </summary>\n        /// <param name=\"serverName\">Name of the server.</param>\n        /// <param name=\"status\">The status.</param>\n        internal void NotifyServerStatusChanged(string serverName, ServerStatus status)\n        {\n            string text = string.Empty;\n            switch (status)\n            {\n            case ServerStatus.Offline:\n                text = $\"{serverName} is offline.\";\n                break;\n            case ServerStatus.Online:\n                text = $\"{serverName} is online.\";\n                break;\n            case ServerStatus.CheckDisabled:\n            case ServerStatus.Unknown:\n                break;\n            default:\n                throw new NotImplementedException();\n            }\n\n            if (!string.IsNullOrEmpty(text))\n            {\n                var notification = new NotificationEventArgs(null, NotificationCategory.\n                    ServerStatusChange)\n                {\n                    Description = text,\n                    Behaviour = NotificationBehaviour.Overwrite,\n                    Priority = NotificationPriority.Information\n                };\n                Notify(notification);\n            }\n        }\n\n        #endregion\n\n\n        #region Market orders expiration\n\n        /// <summary>\n        /// Notify some character market orders have been expired or fulfilled.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"expiredOrders\">The expired orders.</param>\n        internal void NotifyCharacterMarketOrdersEnded(Character character,\n            IEnumerable<MarketOrder> expiredOrders)\n        {\n            var notification = new MarketOrdersNotificationEventArgs(character, expiredOrders)\n            {\n                Behaviour = NotificationBehaviour.Merge,\n                Priority = NotificationPriority.Information\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notify some corporation market orders have been expired or fulfilled.\n        /// </summary>\n        /// <param name=\"corporation\">The corporation.</param>\n        /// <param name=\"expiredOrders\">The expired orders.</param>\n        internal void NotifyCorporationMarketOrdersEnded(Corporation corporation,\n            IEnumerable<MarketOrder> expiredOrders)\n        {\n            var notification = new MarketOrdersNotificationEventArgs(corporation, expiredOrders)\n            {\n                Behaviour = NotificationBehaviour.Merge,\n                Priority = NotificationPriority.Information\n            };\n            Notify(notification);\n        }\n\n        #endregion\n\n\n        #region Contracts expiration\n\n        /// <summary>\n        /// Notify some character contracts have been expired or fulfilled.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"endedContracts\">The ended contracts.</param>\n        public void NotifyCharacterContractsEnded(Character character,\n            IEnumerable<Contract> endedContracts)\n        {\n            var notification = new ContractsNotificationEventArgs(character, endedContracts)\n            {\n                Behaviour = NotificationBehaviour.Merge,\n                Priority = NotificationPriority.Information\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notify some corporation contracts have been expired or fulfilled.\n        /// </summary>\n        /// <param name=\"corporation\">The corporation.</param>\n        /// <param name=\"endedContracts\">The ended contracts.</param>\n        public void NotifyCorporationContractsEnded(Corporation corporation,\n            IEnumerable<Contract> endedContracts)\n        {\n            var notification = new ContractsNotificationEventArgs(corporation, endedContracts)\n            {\n                Behaviour = NotificationBehaviour.Merge,\n                Priority = NotificationPriority.Information\n            };\n            Notify(notification);\n        }\n\n        #endregion\n\n\n        #region Contracts assigned\n\n        /// <summary>\n        /// Invalidates the notification for assigned contracts.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal void InvalidateCharacterContractsAssigned(CCPCharacter character)\n        {\n            Invalidate(new NotificationInvalidationEventArgs(character, NotificationCategory.\n                ContractsAssigned));\n        }\n\n        /// <summary>\n        /// Notifies for character assigned contracts.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"assignedContracts\">The assigned contracts.</param>\n        public void NotifyCharacterContractsAssigned(Character character, int assignedContracts)\n        {\n            var notification = new NotificationEventArgs(character, NotificationCategory.\n                ContractsAssigned)\n            {\n                Description = string.Format(Properties.Resources.MessageNewContracts,\n                    assignedContracts, assignedContracts.S()),\n                Behaviour = NotificationBehaviour.Overwrite,\n                Priority = NotificationPriority.Information\n            };\n            Notify(notification);\n        }\n\n        #endregion\n\n\n        #region Industry jobs completion\n\n        /// <summary>\n        /// Notify some character industry jobs have ended.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"jobsCompleted\">The completed jobs.</param>\n        internal void NotifyCharacterIndustryJobCompletion(Character character,\n            IEnumerable<IndustryJob> jobsCompleted)\n        {\n            var notification = new IndustryJobsNotificationEventArgs(character, jobsCompleted)\n            {\n                Behaviour = NotificationBehaviour.Merge,\n                Priority = NotificationPriority.Information\n            };\n            Notify(notification);\n        }\n\n        /// <summary>\n        /// Notify some corporation industry jobs have ended.\n        /// </summary>\n        /// <param name=\"corporation\">The corporation.</param>\n        /// <param name=\"jobsCompleted\">The completed jobs.</param>\n        internal void NotifyCorporationIndustryJobCompletion(Corporation corporation,\n            IEnumerable<IndustryJob> jobsCompleted)\n        {\n            var notification = new IndustryJobsNotificationEventArgs(corporation, jobsCompleted)\n            {\n                Behaviour = NotificationBehaviour.Merge,\n                Priority = NotificationPriority.Information\n            };\n            Notify(notification);\n        }\n\n        #endregion\n\n\n        #region Planetary Pins expiration\n\n        /// <summary>\n        /// Invalidates the notification for completed planetary pins.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal void InvalidateCharacterPlanetaryPinCompleted(CCPCharacter character)\n        {\n            Invalidate(new NotificationInvalidationEventArgs(character, NotificationCategory.\n                PlanetaryPinsCompleted));\n        }\n\n        /// <summary>\n        /// Notify some character planetary pins have ended.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"pinsCompleted\">The completed pins.</param>\n        internal void NotifyCharacterPlanetaryPinCompleted(Character character,\n            IEnumerable<PlanetaryPin> pinsCompleted)\n        {\n            var notification = new PlanetaryPinsNotificationEventArgs(character, pinsCompleted)\n            {\n                Behaviour = NotificationBehaviour.Merge,\n                Priority = NotificationPriority.Information\n            };\n            Notify(notification);\n        }\n\n\n        #endregion\n\n\n        #region New EVE mail message\n\n        /// <summary>\n        /// Notify new EVE mail message is available.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"newMessages\">The new messages.</param>\n        internal void NotifyNewEVEMailMessages(Character character, int newMessages)\n        {\n            var notification = new EveMailMessageNotificationEventArgs(character, newMessages)\n            {\n                Behaviour = NotificationBehaviour.Merge,\n                Priority = NotificationPriority.Information\n            };\n            Notify(notification);\n        }\n\n        #endregion\n\n\n        #region New EVE notification\n\n        /// <summary>\n        /// Notify new EVE notification is available.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"newNotifications\">The new notifications.</param>\n        internal void NotifyNewEVENotifications(Character character, int newNotifications)\n        {\n            var notification = new EveNotificationEventArgs(character, newNotifications)\n            {\n                Behaviour = NotificationBehaviour.Merge,\n                Priority = NotificationPriority.Information\n            };\n            Notify(notification);\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Collections/IReadonlyCollection.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace EVEMon.Common.Collections\n{\n    /// <summary>\n    /// Represents a read-only collection\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public interface IReadonlyCollection<out T> : IEnumerable<T>\n    {\n        int Count { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Collections/IReadonlyKeyedCollection.cs",
    "content": "using System.Collections.Generic;\n\nnamespace EVEMon.Common.Collections\n{\n    /// <summary>\n    /// Represents a read-only collection\n    /// </summary>\n    /// <typeparam name=\"TKey\">The type of the key.</typeparam>\n    /// <typeparam name=\"TItem\">The type of the item.</typeparam>\n    public interface IReadonlyKeyedCollection<in TKey, out TItem> : IEnumerable<TItem>\n    {\n        int Count { get; }\n        TItem this[TKey key] { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Collections/ReadonlyCollection.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\n\nnamespace EVEMon.Common.Collections\n{\n    /// <summary>\n    /// Represents a base readonly collection relying on an inner list.\n    /// </summary>\n    public abstract class ReadonlyCollection<T> : IReadonlyCollection<T>\n    {\n        protected FastList<T> Items;\n\n        /// <summary>\n        /// Protected default constructor with an initial capacity.\n        /// </summary>\n        protected ReadonlyCollection(int capacity)\n        {\n            Items = new FastList<T>(capacity);\n        }\n\n        /// <summary>\n        /// Protected default constructor\n        /// </summary>\n        protected ReadonlyCollection()\n        {\n            Items = new FastList<T>(0);\n        }\n\n        /// <summary>\n        /// Gets the number of items in this collection\n        /// </summary>\n        public int Count => Items.Count;\n\n        /// <summary>\n        /// Gets true if the collection contains the given item\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        public bool Contains(T item) => Items.Contains(item);\n\n\n        #region Enumerators\n\n        IEnumerator<T> IEnumerable<T>.GetEnumerator() => Items.GetEnumerator();\n\n        IEnumerator IEnumerable.GetEnumerator() => Items.GetEnumerator();\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Collections/ReadonlyKeyedCollection.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace EVEMon.Common.Collections\n{\n    /// <summary>\n    /// Represents a base readonly collection based on an inner dictionary.\n    /// </summary>\n    public abstract class ReadonlyKeyedCollection<TKey, TItem> : IReadonlyKeyedCollection<TKey, TItem>\n        where TItem : class\n    {\n        protected readonly Dictionary<TKey, TItem> Items = new Dictionary<TKey, TItem>();\n\n        /// <summary>\n        /// Gets the number of items in this collection\n        /// </summary>\n        public int Count => Items.Count;\n\n        /// <summary>\n        /// Gets the item with the given key\n        /// </summary>\n        /// <param name=\"key\"></param>\n        /// <returns></returns>\n        protected TItem GetByKey(TKey key)\n        {\n            TItem item;\n            Items.TryGetValue(key, out item);\n            return item;\n        }\n\n\n        #region Enumerators\n\n        IEnumerator<TItem> IEnumerable<TItem>.GetEnumerator() => Items.Values.GetEnumerator();\n\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => Items.Values.GetEnumerator();\n\n        #endregion\n\n\n        #region IReadonlyKeyedCollection<TKey,TItem> Members\n\n        TItem IReadonlyKeyedCollection<TKey, TItem>.this[TKey key] => GetByKey(key);\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Collections/ReadonlyVirtualCollection.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace EVEMon.Common.Collections\n{\n    /// <summary>\n    /// Represents a base readonly collection relying on a method override providing an <see cref=\"IEnumerable{T}\"/>.\n    /// </summary>\n    public abstract class ReadonlyVirtualCollection<T> : IReadonlyCollection<T>\n    {\n        /// <summary>\n        /// The core method to implement : all other methods rely on this one.\n        /// </summary>\n        /// <returns></returns>\n        protected abstract IEnumerable<T> Enumerate();\n\n        /// <summary>\n        /// Gets the number of items in this collection\n        /// </summary>\n        public int Count => Enumerate().Count();\n\n\n        #region Enumerators\n\n        IEnumerator<T> IEnumerable<T>.GetEnumerator() => Enumerate().GetEnumerator();\n\n        IEnumerator IEnumerable.GetEnumerator() => Enumerate().GetEnumerator();\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Constants/CultureConstants.cs",
    "content": "﻿using System.Globalization;\n\nnamespace EVEMon.Common.Constants\n{\n    public static class CultureConstants\n    {\n        public static CultureInfo DefaultCulture => CultureInfo.CurrentCulture;\n\n        public static CultureInfo InvariantCulture => CultureInfo.InvariantCulture;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Constants/DBConstants.cs",
    "content": "﻿using System.Collections.ObjectModel;\n\nnamespace EVEMon.Common.Constants\n{\n    /// <summary>\n    /// Provides constants about the CCP databases.\n    /// </summary>\n    public static class DBConstants\n    {\n        #region Custom Constants\n\n        public const string GeneralCategoryName = \"General\";\n        public const string PropulsionCategoryName = \"Propulsion\";\n        public const string ConsumptionRatePropertyName = \"Consumption Rate\";\n        public const string PackagedVolumePropertyName = \"Packaged Volume\";\n\n        #endregion\n\n\n        #region Collections\n\n        // Group of PropertyIDs\n        public static ReadOnlyCollection<int> RequiredSkillPropertyIDs => new ReadOnlyCollection<int>(new[]\n        {\n            RequiredSkill1PropertyID, RequiredSkill2PropertyID,\n            RequiredSkill3PropertyID, RequiredSkill4PropertyID,\n            RequiredSkill5PropertyID, RequiredSkill6PropertyID\n        });\n\n        public static ReadOnlyCollection<int> RequiredSkillLevelPropertyIDs => new ReadOnlyCollection<int>(new[]\n        {\n            RequiredSkill1LevelPropertyID, RequiredSkill2LevelPropertyID,\n            RequiredSkill3LevelPropertyID, RequiredSkill4LevelPropertyID,\n            RequiredSkill5LevelPropertyID, RequiredSkill6LevelPropertyID\n        });\n\n        public static ReadOnlyCollection<int> AlwaysVisibleForShipPropertyIDs => new ReadOnlyCollection<int>(new[]\n        {\n            CPUOutputPropertyID, PGOutputPropertyID, UpgradeCapacityPropertyID,\n            HiSlotsPropertyID, MedSlotsPropertyID, LowSlotsPropertyID,\n            DroneCapacityPropertyID, DroneBandwidthPropertyID, CargoCapacityPropertyID,\n            MassPropertyID, VolumePropertyID, CapacitorCapacityPropertyID,\n            CapacitorRechargeRatePropertyID, MaxTargetRangePropertyID,\n            ScanResolutionPropertyID, SignatureRadiusPropertyID, MaxVelocityPropertyID,\n            ShipWarpSpeedPropertyID, StructureHitpointsPropertyID, ShieldHitpointsPropertyID,\n            ArmorHitpointsPropertyID, ShieldRechargeRatePropertyID,\n            ShieldEMResistancePropertyID, ShieldExplosiveResistancePropertyID,\n            ShieldKineticResistancePropertyID, ShieldThermalResistancePropertyID,\n            ArmorEMResistancePropertyID, ArmorExplosiveResistancePropertyID,\n            ArmorKineticResistancePropertyID, ArmorThermalResistancePropertyID\n        });\n\n        public static ReadOnlyCollection<int> HideIfDefaultPropertyIDs => new ReadOnlyCollection<int>(new[]\n        {\n            LauncherSlotsLeftPropertyID, TurretSlotsLeftPropertyID,\n            TurretHardPointModifierPropertyID, LauncherHardPointModifierPropertyID,\n            HiSlotModifierPropertyID, MedSlotModifierPropertyID,\n            LowSlotModifierPropertyID, ScanRadarStrengthPropertyID,\n            ScanLadarStrengthPropertyID, ScanMagnetometricStrengthPropertyID,\n            ScanGravimetricStrengthPropertyID, HullEMResistancePropertyID,\n            HullExplosiveResistancePropertyID, HullKineticResistancePropertyID,\n            HullThermalResistancePropertyID, EmDamagePropertyID, ExplosiveDamagePropertyID,\n            KineticDamagePropertyID, ThermalDamagePropertyID,\n            CharismaModifierPropertyID, IntelligenceModifierPropertyID,\n            MemoryModifierPropertyID, PerceptionModifierPropertyID,\n            WillpowerModifierPropertyID, MetaLevelPropertyID\n        });\n\n        public static ReadOnlyCollection<int> LauncherGroupPropertyIDs => new ReadOnlyCollection<int>(new[]\n        {\n            LauncherGroupPropertyID, LauncherGroup2PropertyID, LauncherGroup3PropertyID\n        });\n\n        public static ReadOnlyCollection<int> ChargeGroupPropertyIDs => new ReadOnlyCollection<int>(new[]\n        {\n            ChargeGroup1PropertyID, ChargeGroup2PropertyID, ChargeGroup3PropertyID,\n            ChargeGroup4PropertyID, ChargeGroup5PropertyID\n        });\n\n        public static ReadOnlyCollection<int> CanFitShipGroupPropertyIDs => new ReadOnlyCollection<int>(new[]\n        {\n            CanFitShipGroup1PropertyID, CanFitShipGroup2PropertyID,\n            CanFitShipGroup3PropertyID, CanFitShipGroup4PropertyID\n        });\n\n        public static ReadOnlyCollection<int> ModuleShipGroupPropertyIDs => new ReadOnlyCollection<int>(new[]\n        {\n            ModuleShipGroup1PropertyID, ModuleShipGroup2PropertyID,\n            ModuleShipGroup3PropertyID\n        });\n\n        public static ReadOnlyCollection<int> ReactionGroupPropertyIDs => new ReadOnlyCollection<int>(new[]\n        {\n            ReactionGroup1PropertyID, ReactionGroup2PropertyID\n        });\n\n        public static ReadOnlyCollection<int> IndustryModifyingPropertyIDs => new ReadOnlyCollection<int>(new[]\n        {\n            ManufacturingTimeBonusPropertyID, ManufactureCostBonusPropertyID,\n            CopySpeedBonusPropertyID, BlueprintManufactureTimeBonusPropertyID,\n            MineralNeedResearchBonusPropertyID\n        });\n\n        public static ReadOnlyCollection<int> SpecialisationAsteroidGroupPropertyIDs => new ReadOnlyCollection<int>(new[]\n        {\n            SpecialisationAsteroidGroupPropertyID\n        });\n\n        public static ReadOnlyCollection<int> PosCargobayAcceptGroupPropertyIDs => new ReadOnlyCollection<int>(new[]\n        {\n            PosCargobayAcceptGroupPropertyID\n        });\n\n        // Group of MarketGroupIDs\n        public static ReadOnlyCollection<int> StrategicComponentsMarketGroupIDs\n            => new ReadOnlyCollection<int>(new[] { SubsystemsMarketGroupID, StrategicCruisersMarketGroupID });\n\n        public static ReadOnlyCollection<int> SmallToLargeShipsMarketGroupIDs => new ReadOnlyCollection<int>(new[]\n        {\n            ShuttlessMarketGroupID, StandardFrigatesMarketGroupID, StandardDestroyersMarketGroupID,\n            FightersMarketGroupID, StandardCruisersMarketGroupID,\n            StandardBattlecruisersMarketGroupID, StandardBattleshipsMarketGroupID,\n            StandardIndustrialShipsMarketGroupID,\n            MiningBargesMarketGroupID, FreightersMarketGroupID\n        });\n\n        public static ReadOnlyCollection<int> AdvancedSmallToLargeShipsMarketGroupIDs => new ReadOnlyCollection<int>(new[]\n        {\n            InterceptorsMarketGroupID, CovertOpsMarketGroupID, AssaultShipsMarketGroupID,\n            LogisticsMarketGroupID, HeavyAssaultShipsMarketGroupID,\n            TransportShipsMarketGroupID, CommandShipsMarketGroupID, InterdictorsMarketGroupID,\n            ReconShipsMarketGroupID, ExhumersMarketGroupID,\n            ElectronicAttackFrigatesMarketGroupID, HeavyInterdictorsMarketGroupID,\n            BlackOpsMarketGroupID, MaraudersMarketGroupID, JumpFreightersMarketGroupID\n        });\n\n        public static ReadOnlyCollection<int> CapitalShipsMarketGroupIDs => new ReadOnlyCollection<int>(new[]\n        {\n            StandardBattleshipsMarketGroupID, DreadnoughtsMarketGroupID, FreightersMarketGroupID,\n            CarriersMarketGroupID, CapitalIndustrialShipsMarketGroupID, ForceAuxiliariesMarketGroupID\n        });\n\n        public static ReadOnlyCollection<int> SupercapitalShipsMarketGroupIDs => new ReadOnlyCollection<int>(new[]\n        {\n            DreadnoughtsMarketGroupID, FreightersMarketGroupID, CarriersMarketGroupID, ForceAuxiliariesMarketGroupID,\n            CapitalIndustrialShipsMarketGroupID, JumpFreightersMarketGroupID, TitansMarketGroupID\n        });\n\n        // Group of Implants IDs\n        public static ReadOnlyCollection<int> ManufacturingModifyingImplantIDs => new ReadOnlyCollection<int>(new[]\n        {\n            ZainouBeancounterBX801ID, ZainouBeancounterBX802ID, ZainouBeancounterBX804ID\n        });\n\n        public static ReadOnlyCollection<int> ResearchMaterialEfficiencyTimeModifyingImplantIDs => new ReadOnlyCollection<int>(new[]\n        {\n            ZainouBeancounterMY701ID, ZainouBeancounterMY703ID, ZainouBeancounterMY705ID\n        });\n\n        public static ReadOnlyCollection<int> ResearchCopyTimeModifyingImplantIDs => new ReadOnlyCollection<int>(new[]\n        {\n            ZainouBeancounterSC801ID, ZainouBeancounterSC803ID, ZainouBeancounterSC805ID\n        });\n\n        public static ReadOnlyCollection<int> ResearchTimeEfficiencyTimeModifyingImplantIDs => new ReadOnlyCollection<int>(new[]\n        {\n            ZainouBeancounterRR601ID, ZainouBeancounterRR603ID, ZainouBeancounterRR605ID\n        });\n\n        // Group of Faction IDs\n        public static ReadOnlyCollection<int> FactionIDs => new ReadOnlyCollection<int>(new[]\n        {\n            CaldariFactionID, MinmatarFactionID, AmarrFactionID,\n            GallenteFactionID, JoveFactionID, ConcordAssemblyFactionID,\n            AmmatarMandateFactionID, KhanidKingdomFactionID, TheSyndicateFactionID,\n            GuristasPiratesFactionID, AngelCartelFactionID, BloodRaiderCovenantFactionID,\n            TheInterBusFactionID, OREFactionID, ThukkerTribeFactionID,\n            ServantSistersofEVEFactionID, TheSocietyofConsciousThoughtFactionID,\n            MordusLegionCommandFactionID, SanshasNationFactionID, SerpentisFactionID\n        });\n\n        // Group of Faction Market Group IDs\n        public static ReadOnlyCollection<int> FactionMarketGroupIDs => new ReadOnlyCollection<int>(new[]\n        {\n            FactionFrigatesMarketGroupID, FactionCruisersMarketGroupID,\n            FactionBattleshipsMarketGroupID, FactionCarrierMarketGroupID\n        });\n\n        // Group of Extarvtor COntrol Unit Type IDs\n        public static ReadOnlyCollection<int> EcuTypeIDs => new ReadOnlyCollection<int>(new[]\n        {\n            BarrenExtractorControlUnit, GasExtractorControlUnit, IceExtractorControlUnit,\n            LavaExtractorControlUnit, OceanicExtractorControlUnit, PlasmaExtractorControlUnit,\n            StormExtractorControlUnit, TemperateExtractorControlUnit\n        });\n\n        #endregion\n\n\n        #region Effect IDs\n\n        public const int LowSlotEffectID = 11;\n        public const int HiSlotEffectID = 12;\n        public const int MedSlotEffectID = 13;\n\n        #endregion\n\n\n        #region Faction IDs\n\n        public const int CaldariFactionID = 500001;\n        public const int MinmatarFactionID = 500002;\n        public const int AmarrFactionID = 500003;\n        public const int GallenteFactionID = 500004;\n        public const int JoveFactionID = 500005;\n        public const int ConcordAssemblyFactionID = 500006;\n        public const int AmmatarMandateFactionID = 500007;\n        public const int KhanidKingdomFactionID = 500008;\n        public const int TheSyndicateFactionID = 500009;\n        public const int GuristasPiratesFactionID = 500010;\n        public const int AngelCartelFactionID = 500011;\n        public const int BloodRaiderCovenantFactionID = 500012;\n        public const int TheInterBusFactionID = 500013;\n        public const int OREFactionID = 500014;\n        public const int ThukkerTribeFactionID = 500015;\n        public const int ServantSistersofEVEFactionID = 500016;\n        public const int TheSocietyofConsciousThoughtFactionID = 500017;\n        public const int MordusLegionCommandFactionID = 500018;\n        public const int SanshasNationFactionID = 500019;\n        public const int SerpentisFactionID = 500020;\n\n        #endregion\n\n\n        #region Attribute Category IDs\n\n        public const int FittingAtributeCategoryID = 1;\n        public const int StructureAtributeCategoryID = 4;\n        public const int MiscellaneousAttributeCategoryID = 7;\n        public const int NullAtributeCategoryID = 9;\n        public const int SpeedAtributeCategoryID = 17;\n\n        #endregion\n\n\n        #region Attribute types IDs (Properties)\n\n        public const int MassPropertyID = 4;\n        public const int CapacitorNeedPropertyID = 6;\n        public const int StructureHitpointsPropertyID = 9;\n        public const int PGOutputPropertyID = 11;\n        public const int LowSlotsPropertyID = 12;\n        public const int MedSlotsPropertyID = 13;\n        public const int HiSlotsPropertyID = 14;\n        public const int PGNeedPropertyID = 30;\n        public const int MaxVelocityPropertyID = 37;\n        public const int CargoCapacityPropertyID = 38;\n        public const int CPUOutputPropertyID = 48;\n        public const int CPUNeedPropertyID = 50;\n        public const int CapacitorRechargeRatePropertyID = 55;\n        public const int ShieldBonusPropertyID = 68;\n        public const int AgilityPropertyID = 70;\n        public const int DurationPropertyID = 73;\n        public const int MaxTargetRangePropertyID = 76;\n        public const int ScanSpeedPropertyID = 79;\n        public const int ShieldTransferRangePropertyID = 87;\n        public const int LauncherSlotsLeftPropertyID = 101;\n        public const int TurretSlotsLeftPropertyID = 102;\n        public const int EmDamagePropertyID = 114;\n        public const int ExplosiveDamagePropertyID = 116;\n        public const int KineticDamagePropertyID = 117;\n        public const int ThermalDamagePropertyID = 118;\n        public const int UniformityPropertyID = 136;\n        public const int LauncherGroupPropertyID = 137;\n        public const int CapacitorRechargeRateMultiplierPropertyID = 144;\n        public const int VolumePropertyID = 161;\n        public const int CharismaPropertyID = 164;\n        public const int IntelligencePropertyID = 165;\n        public const int MemoryPropertyID = 166;\n        public const int PerceptionPropertyID = 167;\n        public const int WillpowerPropertyID = 168;\n        public const int CharismaModifierPropertyID = 175;\n        public const int IntelligenceModifierPropertyID = 176;\n        public const int MemoryModifierPropertyID = 177;\n        public const int PerceptionModifierPropertyID = 178;\n        public const int WillpowerModifierPropertyID = 179;\n        public const int PrimaryAttributePropertyID = 180;\n        public const int SecondaryAttributePropertyID = 181;\n        public const int RequiredSkill1PropertyID = 182;\n        public const int RequiredSkill2PropertyID = 183;\n        public const int RequiredSkill3PropertyID = 184;\n        public const int CPUOutputBonusPropertyID = 202;\n        public const int ScanRadarStrengthPropertyID = 208;\n        public const int ScanLadarStrengthPropertyID = 209;\n        public const int ScanMagnetometricStrengthPropertyID = 210;\n        public const int ScanGravimetricStrengthPropertyID = 211;\n        public const int ShieldHitpointsPropertyID = 263;\n        public const int ArmorHitpointsPropertyID = 265;\n        public const int ArmorEMResistancePropertyID = 267;\n        public const int ArmorExplosiveResistancePropertyID = 268;\n        public const int ArmorKineticResistancePropertyID = 269;\n        public const int ArmorThermalResistancePropertyID = 270;\n        public const int ShieldEMResistancePropertyID = 271;\n        public const int ShieldExplosiveResistancePropertyID = 272;\n        public const int ShieldKineticResistancePropertyID = 273;\n        public const int ShieldThermalResistancePropertyID = 274;\n        public const int SkillTimeConstantPropertyID = 275;\n        public const int RequiredSkill1LevelPropertyID = 277;\n        public const int RequiredSkill2LevelPropertyID = 278;\n        public const int RequiredSkill3LevelPropertyID = 279;\n        public const int DroneCapacityPropertyID = 283;\n        public const int ImplantSlotPropertyID = 331;\n        public const int TechLevelPropertyID = 422;\n        public const int CPUOutputBonus2PropertyID = 424;\n        public const int ManufacturingTimeBonusPropertyID = 440;\n        public const int ManufactureCostBonusPropertyID = 451;\n        public const int CopySpeedBonusPropertyID = 452;\n        public const int BlueprintManufactureTimeBonusPropertyID = 453;\n        public const int MineralNeedResearchBonusPropertyID = 468;\n        public const int ShieldRechargeRatePropertyID = 479;\n        public const int CapacitorCapacityPropertyID = 482;\n        public const int ShieldUniformityPropertyID = 484;\n        public const int ArmorUniformityPropertyID = 524;\n        public const int StructureUniformityPropertyID = 525;\n        public const int SignatureRadiusPropertyID = 552;\n        public const int AnchoringDelayPropertyID = 556;\n        public const int CloakingTargetingDelayPropertyID = 560;\n        public const int ScanResolutionPropertyID = 564;\n        public const int WarpSpeedMultiplierPropertyID = 600;\n        public const int LauncherGroup2PropertyID = 602;\n        public const int LauncherGroup3PropertyID = 603;\n        public const int ChargeGroup1PropertyID = 604;\n        public const int ChargeGroup2PropertyID = 605;\n        public const int ChargeGroup3PropertyID = 606;\n        public const int ChargeGroup4PropertyID = 609;\n        public const int ChargeGroup5PropertyID = 610;\n        public const int MetaLevelPropertyID = 633;\n        public const int ModuleShipGroup2PropertyID = 666;\n        public const int ModuleShipGroup3PropertyID = 667;\n        public const int ModuleShipGroup1PropertyID = 668;\n        public const int ModuleReactivationDelayPropertyID = 669;\n        public const int UnanchoringDelayPropertyID = 676;\n        public const int OnliningDelayPropertyID = 677;\n        public const int ConsumptionQuantityPropertyID = 714;\n        public const int MoonMiningAmountPropertyID = 726;\n        public const int IceHarvestCycleBonusPropertyID = 780;\n        public const int SpecialisationAsteroidGroupPropertyID = 781;\n        public const int ReprocessingSkillPropertyID = 790;\n        public const int ReactionGroup1PropertyID = 842;\n        public const int ReactionGroup2PropertyID = 843;\n        public const int ShipMaintenanceBayCapacityPropertyID = 908;\n        public const int HullEMResistancePropertyID = 974;\n        public const int HullExplosiveResistancePropertyID = 975;\n        public const int HullKineticResistancePropertyID = 976;\n        public const int HullThermalResistancePropertyID = 977;\n        public const int CanNotBeTrainedOnTrialPropertyID = 1047;\n        public const int CPUPenaltyPercentPropertyID = 1082;\n        public const int UpgradeCapacityPropertyID = 1132;\n        public const int RigSlotsPropertyID = 1137;\n        public const int UpgradeCostPropertyID = 1153;\n        public const int DroneBandwidthPropertyID = 1271;\n        public const int DroneBandwidthUsedPropertyID = 1272;\n        public const int ShipWarpSpeedPropertyID = 1281;\n        public const int RequiredSkill4PropertyID = 1285;\n        public const int RequiredSkill4LevelPropertyID = 1286;\n        public const int RequiredSkill5LevelPropertyID = 1287;\n        public const int RequiredSkill6LevelPropertyID = 1288;\n        public const int RequiredSkill5PropertyID = 1289;\n        public const int RequiredSkill6PropertyID = 1290;\n        public const int CanFitShipGroup1PropertyID = 1298;\n        public const int CanFitShipGroup2PropertyID = 1299;\n        public const int CanFitShipGroup3PropertyID = 1300;\n        public const int CanFitShipGroup4PropertyID = 1301;\n        public const int PosCargobayAcceptGroupPropertyID = 1352;\n        public const int MaxSubSystemsPropertyID = 1367;\n        public const int TurretHardPointModifierPropertyID = 1368;\n        public const int LauncherHardPointModifierPropertyID = 1369;\n        public const int HiSlotModifierPropertyID = 1374;\n        public const int MedSlotModifierPropertyID = 1375;\n        public const int LowSlotModifierPropertyID = 1376;\n        public const int FitsToShipTypePropertyID = 1380;\n        public const int AITargetSwitchTimerPropertyID = 1416;\n        public const int RigSizePropertyID = 1547;\n        public const int MetaGroupPropertyID = 1692;\n\n        #endregion\n\n\n        #region EVE Unit IDs (Properties UnitID's)\n\n        public const int MassUnitID = 2;\n        public const int MillsecondsUnitID = 101;\n        public const int AbsolutePercentUnitID = 127;\n        public const int InverseAbsolutePercentUnitID = 108;\n        public const int ModifierPercentUnitID = 109;\n        public const int InversedModifierPercentUnitID = 111;\n        public const int GroupIDUnitID = 115;\n        public const int TypeUnitID = 116;\n        public const int SizeclassUnitID = 117;\n\n        #endregion\n\n\n        #region Category IDs\n\n        public const int ShipCategoryID = 6;\n        public const int BlueprintCategoryID = 9;\n        public const int SkillCategoryID = 16;\n        public const int ImplantCategoryID = 20;\n        public const int ReactionCategoryID = 24;\n        public const int AsteroidCategoryID = 25;\n        public const int AncientRelicsCategoryID = 34;\n\n        #endregion\n\n\n        #region Group IDs\n\n        public const int FrigateGroupID = 25;\n        public const int CruiserGroupID = 26;\n        public const int BattleshipGroupID = 27;\n        public const int IndustrialGroupID = 28;\n        public const int TitanGroupID = 30;\n        public const int RookieShipGroupID = 237;\n        public const int TradeSkillsGroupID = 274;\n        public const int SocialSkillsGroupID = 278;\n        public const int AssaultFrigateGroupID = 324;\n        public const int HeavyAssaultCruiserGroupID = 358;\n        public const int ControlTowerGroupID = 365;\n        public const int DeepSpaceTransportGroupID = 380;\n        public const int EliteBattleshipGroupID = 381;\n        public const int CombatBattlecruiserGroupID = 419;\n        public const int DestroyerGroupID = 420;\n        public const int MiningBargeGroupID = 463;\n        public const int DreadnoughtGroupID = 485;\n        public const int FakeSkillsGroupID = 505;\n        public const int FreighterGroupID = 513;\n        public const int CommandShipGroupID = 540;\n        public const int InterdictorGroupID = 541;\n        public const int ExhumerGroupID = 543;\n        public const int CarrierGroupID = 547;\n        public const int SupercarrierGroupID = 659;\n        public const int CyberLearningImplantsGroupID = 745;\n        public const int CovertOpsGroupID = 830;\n        public const int InterceptorGroupID = 831;\n        public const int LogisticsGroupID = 832;\n        public const int ForceReconShipGroupID = 833;\n        public const int StealthBomberGroupID = 834;\n        public const int CapitalIndustrialShipGroupID = 883;\n        public const int ElectronicAttackShipGroupID = 893;\n        public const int HeavyInterdictorCruiserGroupID = 894;\n        public const int BlackOpsGroupID = 898;\n        public const int MarauderGroupID = 900;\n        public const int JumpFreighterGroupID = 902;\n        public const int CombatReconShipGroupID = 906;\n        public const int IndustrialCommandShipGroupID = 941;\n        public const int StrategicCruiserGroupID = 963;\n        public const int CorporationManagementSkillsGroupID = 266;\n        public const int AttackBattlecruiserGroupID = 1201;\n        public const int BlockadeRunnerGroupID = 1202;\n        public const int ExpeditionFrigateGroupID = 1283;\n        public const int TacticalDestroyerGroupID = 1305;\n\n        #endregion\n\n\n        #region Market group IDs\n\n        public const int BlueprintsMarketGroupID = 2;\n        public const int ShipsMarketGroupID = 4;\n        public const int StandardFrigatesMarketGroupID = 5;\n        public const int StandardCruisersMarketGroupID = 6;\n        public const int StandardBattleshipsMarketGroupID = 7;\n        public const int StandardIndustrialShipsMarketGroupID = 8;\n        public const int ShipEquipmentsMarketGroupID = 9;\n        public const int AmmosAndChargesMarketGroupID = 11;\n        public const int ImplantsAndBoostersMarketGroupID = 24;\n        public const int ImplantsMarketGroupID = 27;\n        public const int SkillsMarketGroupID = 150;\n        public const int DronesMarketGroupID = 157;\n        public const int ShuttlessMarketGroupID = 391;\n        public const int InterceptorsMarketGroupID = 399;\n        public const int CovertOpsMarketGroupID = 420;\n        public const int AssaultShipsMarketGroupID = 432;\n        public const int LogisticsMarketGroupID = 437;\n        public const int HeavyAssaultShipsMarketGroupID = 448;\n        public const int StandardDestroyersMarketGroupID = 464;\n        public const int StandardBattlecruisersMarketGroupID = 469;\n        public const int ComponentsMarketGroupID = 475;\n        public const int StarbaseStructuresMarketGroupID = 477;\n        public const int MiningBargesMarketGroupID = 494;\n        public const int TransportShipsMarketGroupID = 629;\n        public const int DreadnoughtsMarketGroupID = 761;\n        public const int FreightersMarketGroupID = 766;\n        public const int StandardCapitalShipComponentsMarketGroupID = 781;\n        public const int TitansMarketGroupID = 812;\n        public const int CarriersMarketGroupID = 817;\n        public const int CommandShipsMarketGroupID = 822;\n        public const int InterdictorsMarketGroupID = 823;\n        public const int ReconShipsMarketGroupID = 824;\n        public const int ExhumersMarketGroupID = 874;\n        public const int ShipModificationsMarketGroupID = 955;\n        public const int BoostersMarketGroupID = 977;\n        public const int CapitalIndustrialShipsMarketGroupID = 1047;\n        public const int ElectronicAttackFrigatesMarketGroupID = 1065;\n        public const int HeavyInterdictorsMarketGroupID = 1070;\n        public const int BlackOpsMarketGroupID = 1075;\n        public const int MaraudersMarketGroupID = 1080;\n        public const int JumpFreightersMarketGroupID = 1089;\n        public const int SubsystemsMarketGroupID = 1112;\n        public const int StrategicCruisersMarketGroupID = 1138;\n        public const int FactionFrigatesMarketGroupID = 1362;\n        public const int FactionCruisersMarketGroupID = 1369;\n        public const int FactionBattleshipsMarketGroupID = 1378;\n        public const int FactionCarrierMarketGroupID = 1392;\n        public const int FuelBlocksMarketGroupID = 1870;\n        public const int DatacoresMarketGroupID = 1880;\n        public const int AdvancedCapitalComponentsMarketGroupID = 1883;\n        public const int AncientRelicsMarketGroupID = 1909;\n        public const int FightersMarketGroupID = 2236;\n        public const int ForceAuxiliariesMarketGroupID = 2271;\n\n        #endregion\n\n\n        #region Custom market group IDs\n\n        public const int RootNonMarketGroupID = 11000;\n\n        public const int UniqueDesignsRootNonMarketGroupID = 10000;\n\n        public const int BlueprintRootNonMarketGroupID = 21000;\n        public const int BlueprintTechINonMarketGroupID = 21001;\n        public const int BlueprintTechIINonMarketGroupID = 21002;\n        public const int BlueprintStorylineNonMarketGroupID = 21003;\n        public const int BlueprintFactionNonMarketGroupID = 21004;\n        public const int BlueprintOfficerNonMarketGroupID = 21005;\n        public const int BlueprintTechIIINonMarketGroupID = 21014;\n        public const int ResearchEquipmentNonMarketGroupID = 21100;\n\n        #endregion\n\n\n        #region MetaGroup IDs\n\n        public const int TechIMetaGroupID = 1;\n        public const int TechIIMetaGroupID = 2;\n        public const int StorylineMetaGroupID = 3;\n        public const int FactionMetaGroupID = 4;\n        public const int OfficerMetaGroupID = 5;\n        public const int DeadspaceMetaGroupID = 6;\n        public const int TechIIIMetaGroupID = 14;\n\n        #endregion\n\n\n        #region TechLevels\n\n        public const int TechLevelII = 2;\n        public const int TechLevelIII = 3;\n\n        #endregion\n\n\n        #region Icon IDs\n\n        public const int UnknownIconID = 0;\n        public const int UnknownShipIconID = 1443;\n        public const int UnknownBlueprintBackdropIconID = 2703;\n\n        #endregion\n\n\n        #region Types IDs\n\n        public const int CorporationID = 2;\n        public const int CapsuleID = 670;\n        public const int CharacterAmarrID = 1373;\n        public const int CharacterVherokiorID = 1386;\n        public const int AdrestiaBlueprintID = 2837;\n        public const int BarrenExtractorControlUnit = 2848;\n        public const int GasExtractorControlUnit = 3060;\n        public const int IceExtractorControlUnit = 3061;\n        public const int LavaExtractorControlUnit = 3062;\n        public const int OceanicExtractorControlUnit = 3063;\n        public const int PlasmaExtractorControlUnit = 3064;\n        public const int StormExtractorControlUnit = 3067;\n        public const int TemperateExtractorControlUnit = 3068;\n        public const int GunnerySkillID = 3300;\n        public const int SmallHybridTurretSkillID = 3301;\n        public const int SmallProjectileTurretSkillID = 3302;\n        public const int SmallEnergyTurretSkillID = 3303;\n        public const int RapidFiringSkillID = 3310;\n        public const int SharpshooterSkillID = 3311;\n        public const int MotionPredictionSkillID = 3312;\n        public const int SurgicalStrikeSkillID = 3315;\n        public const int ControlledBurstsSkillID = 3316;\n        public const int TrajectoryAnalysisSkillID = 3317;\n        public const int WeaponUpgradesSkillID = 3318;\n        public const int MissileLauncherOperationSkillID = 3319;\n        public const int GallenteIndustrialSkillID = 3340;\n        public const int MinmatarIndustrialSkillID = 3341;\n        public const int CaldariIndustrialSkillID = 3342;\n        public const int AmarrIndustrialSkillID = 3343;\n        public const int SpaceshipCommandSkillID = 3327;\n        public const int GallenteFrigateSkillID = 3328;\n        public const int MinmatarFrigateSkillID = 3329;\n        public const int CaldariFrigateSkillID = 3330;\n        public const int AmarrFrigateSkillID = 3331;\n        public const int DiplomacySkillID = 3357;\n        public const int ConnectionsSkillID = 3359;\n        public const int IndustrySkillID = 3380;\n        public const int MiningSkillID = 3386;\n        public const int MassProductionSkillID = 3387;\n        public const int AdvancedIndustrySkillID = 3388;\n        public const int MechanicSkillID = 3392;\n        public const int RepairSystemsSkillID = 3393;\n        public const int HullUpgradesSkillID = 3394;\n        public const int ScienceSkillID = 3402;\n        public const int ResearchSkillID = 3403;\n        public const int LaboratoryOperationSkillID = 3406;\n        public const int MetallurgySkillID = 3409;\n        public const int CyberneticsSkillID = 3411;\n        public const int AstrometricsSkillID = 3412;\n        public const int PowerGridManagementSkillID = 3413;\n        public const int ShieldOperationSkillID = 3416;\n        public const int CapacitorSystemsOperationSkillID = 3417;\n        public const int CapacitorManagementSkillID = 3418;\n        public const int ShieldManagementSkillID = 3419;\n        public const int TacticalShieldManipulationSkillID = 3420;\n        public const int EnergyGridUpgradesSkillID = 3424;\n        public const int ShieldUpgradesSkillID = 3425;\n        public const int CPUManagementSkillID = 3426;\n        public const int ElectronicWarfareSkillID = 3427;\n        public const int LongRangeTargetingSkillID = 3428;\n        public const int TargetManagementSkillID = 3429;\n        public const int SignatureAnalysisSkillID = 3431;\n        public const int ElectronicsUpgradesSkillID = 3432;\n        public const int PropulsionJammingSkillID = 3435;\n        public const int DronesSkillID = 3436;\n        public const int DroneAvionicsSkillID = 3437;\n        public const int TradeSkillID = 3443;\n        public const int RetailSkillID = 3444;\n        public const int BrokerRelationsSkillID = 3446;\n        public const int VisibilitySkillID = 3447;\n        public const int NavigationSkillID = 3449;\n        public const int AfterburnerSkillID = 3450;\n        public const int SurveySkillID = 3551;\n        public const int AccelerationControlSkillID = 3452;\n        public const int EvasiveManeuveringSkillID = 3453;\n        public const int HighSpeedManeuveringSkillID = 3454;\n        public const int WarpDriveOperationSkillID = 3455;\n        public const int EchelonBlueprintID = 3533;\n        public const int ScrapMetalProcessingSkillID = 12196;\n        public const int ArchaeologySkillID = 13278;\n        public const int AllianceID = 16159;\n        public const int ProcurementSkillID = 16594;\n        public const int DaytradingSkillID = 16595;\n        public const int WholesaleSkillID = 16596;\n        public const int MarketingSkillID = 16598;\n        public const int AccountingSkillID = 16622;\n        public const int CaldariNavyHookbillBlueprintID = 17620;\n        public const int ImperialNavySlicerBlueprintID = 17704;\n        public const int PhantasmBlueprintID = 17719;\n        public const int CynabalBlueprintID = 17721;\n        public const int NightmareBlueprintID = 17737;\n        public const int MacharielBlueprintID = 17739;\n        public const int RepublicFleetFiretailBlueprintID = 17813;\n        public const int FederationNavyCometBlueprintID = 17842;\n        public const int AshimmuBlueprintID = 17923;\n        public const int SuccubusBlueprintID = 17925;\n        public const int CruorBlueprintID = 17927;\n        public const int DaredevilBlueprintID = 17929;\n        public const int DramielBlueprintID = 17933;\n        public const int TycoonSkillID = 18580;\n        public const int GorusShuttleBlueprintID = 21098;\n        public const int GuristasShuttleBlueprintID = 21629;\n        public const int HackingSkillID = 21718;\n        public const int GallenteMiningLaserBlueprintID = 21842;\n        public const int WildMinerIBlueprintID = 22924;\n        public const int InfomorphPsychologySkillID = 24242;\n        public const int SupplyChainManagementSkillID = 24268;\n        public const int ScientificNetworkingSkillID = 24270;\n        public const int AdvancedLaboratoryOperationSkillID = 24624;\n        public const int AdvancedMassProductionSkillID = 24625;\n        public const int ReactionsSkillID = 45746;\n        public const int MassReactionsSkillID = 45748;\n        public const int AdvancedMassReactionsSkillID = 45749;\n        public const int RemoteReactionsSkillID = 45750;\n        public const int AstrometricRangefindingSkillID = 25739;\n        public const int AstrometricAcquisitionSkillID = 25811;\n        public const int SalvagingSkillID = 25863;\n        public const int ZainouBeancounterBX802ID = 27167;\n        public const int ZainouBeancounterBX801ID = 27170;\n        public const int ZainouBeancounterBX804ID = 27171;\n        public const int ZainouBeancounterMY703ID = 27176;\n        public const int ZainouBeancounterRR603ID = 27177;\n        public const int ZainouBeancounterSC803ID = 27178;\n        public const int ZainouBeancounterRR605ID = 27179;\n        public const int ZainouBeancounterRR601ID = 27180;\n        public const int ZainouBeancounterMY705ID = 27181;\n        public const int ZainouBeancounterMY701ID = 27182;\n        public const int ZainouBeancounterSC805ID = 27184;\n        public const int ZainouBeancounterSC801ID = 27185;\n        public const int ThermodynamicsSkillID = 28164;\n        public const int TenguBlueprintID = 29985;\n        public const int LegionBlueprintID = 29987;\n        public const int ProteusBlueprintID = 29989;\n        public const int LokiBlueprintID = 29991;\n        public const int LegionElectronicsEnergyParasiticComplexBlueprintID = 30037;\n        public const int TenguElectronicsObfuscationManifoldBlueprintID = 30047;\n        public const int ProteusElectronicsFrictionExtensionProcessorBlueprintID = 30057;\n        public const int LokiElectronicsImmobilityDriversBlueprintID = 30067;\n        public const int LegionPropulsionChassisOptimizationBlueprintID = 30077;\n        public const int TenguPropulsionIntercalatedNanofibersBlueprintID = 30087;\n        public const int ProteusPropulsionWakeLimiterBlueprintID = 30097;\n        public const int LokiPropulsionChassisOptimizationBlueprintID = 30107;\n        public const int TenguEngineeringPowerCoreMultiplierBlueprintID = 30140;\n        public const int ProteusEngineeringPowerCoreMultiplierBlueprintID = 30150;\n        public const int LokiEngineeringPowerCoreMultiplierBlueprintID = 30160;\n        public const int LegionEngineeringPowerCoreMultiplierBlueprintID = 30170;\n        public const int LegionDefensiveAdaptiveAugmenterBlueprintID = 30227;\n        public const int TenguDefensiveAdaptiveShieldingBlueprintID = 30232;\n        public const int ProteusDefensiveAdaptiveAugmenterBlueprintID = 30237;\n        public const int LokiDefensiveAdaptiveShieldingBlueprintID = 30242;\n        public const int LegionOffensiveDroneSynthesisProjectorBlueprintID = 30392;\n        public const int TenguOffensiveAcceleratedEjectionBayBlueprintID = 30397;\n        public const int ProteusOffensiveDissonicEncodingPlatformBlueprintID = 30402;\n        public const int LokiOffensiveTurretConcurrenceRegistryBlueprintID = 30407;\n        public const int InterbusShuttleBlueprintID = 30843;\n        public const int FrekiBlueprintID = 32208;\n        public const int MimirBlueprintID = 32210;\n        public const int MiningFrigateSkillID = 32918;\n        public const int LargeSkillInjectorID = 40520;\n        public const int SmallSkillInjectorID = 45635;\n        public const int FleetCoordinationSkillID = 57318;\n        public const int FleetFormationsSkillID = 57317;\n\n        public const int AlphaDataAnalyzerIBlueprintID = 22330;\n        public const int DaemonDataAnalyzerIBlueprintID = 22326;\n        public const int CodexDataAnalyzerIBlueprintID = 22328;\n        public const int LibramDataAnalyzerIBlueprintID = 22332;\n        public const int CropGasCloudHarvesterBlueprintID = 25541;\n        public const int PlowGascloudHarvesterBlueprintID = 25543;\n        public const int Dual1000mmScoutIAcceleratorCannonBlueprintID = 3557;\n        public const int HabitatMinerIBlueprintID = 22922;\n        public const int LimosCitadelCruiseLauncherIBlueprintID = 3564;\n        public const int MagpieMobileTractorUnitBlueprintID = 33703;\n        public const int PackratMobileTractorUnitBlueprintID = 33701;\n        public const int ShockLimosCitadelTorpedoBayIBlueprintID = 3570;\n        public const int WetuMobileDepotBlueprintID = 33521;\n        public const int YurtMobileDepotBlueprintID = 33523;\n\n        public const int AsteroBlueprintID = 33469;\n        public const int BarghestBlueprintID = 33821;\n        public const int CambionBlueprintID = 32789;\n        public const int ChremoasBlueprintID = 33398;\n        public const int EtanaBlueprintID = 32791;\n        public const int GarmurBlueprintID = 33817;\n        public const int MaliceBlueprintID = 3517;\n        public const int MorachaBlueprintID = 33396;\n        public const int NestorBlueprintID = 33473;\n        public const int OrthrusBlueprintID = 33819;\n        public const int PolicePursuitCometBlueprintID = 33678;\n        public const int ScorpionIshukoneWatchBlueprintID = 4006;\n        public const int ShadowBlueprintID = 2949;\n        public const int StratiosBlueprintID = 33471;\n        public const int StratiosEmergencyResponderBlueprintID = 33554;\n        public const int UtuBlueprintID = 2835;\n        public const int VangelBlueprintID = 3519;\n        public const int WhiptailBlueprintID = 33674;\n\n        public const int BladeBlueprintID = 11374;\n        public const int BlazeLBlueprintID = 12813;\n        public const int BlazeMBlueprintID = 12811;\n        public const int BlazeSBlueprintID = 12562;\n        public const int BoltLBlueprintID = 12800;\n        public const int BoltMBlueprintID = 12798;\n        public const int BoltSBlueprintID = 12617;\n        public const int CapitalRemoteCapacitorTransmitterIIBlueprintID = 12224;\n        public const int CapitalRemoteShieldBoosterIIBlueprintID = 3619;\n        public const int ChameleonBlueprintID = 33676;\n        public const int DaggerBlueprintID = 12037;\n        public const int DesolationLBlueprintID = 12796;\n        public const int DesolationMBlueprintID = 12794;\n        public const int DesolationSBlueprintID = 12611;\n        public const int DroneDamageRigIIBlueprintID = 26928;\n        public const int ErinyeBlueprintID = 11376;\n        public const int GathererBlueprintID = 11384;\n        public const int HighGradeAscendancyAlphaBlueprintID = 33536;\n        public const int HighGradeAscendancyBetaBlueprintID = 33543;\n        public const int HighGradeAscendancyGammaBlueprintID = 33545;\n        public const int HighGradeAscendancyDeltaBlueprintID = 33547;\n        public const int HighGradeAscendancyEpsilonBlueprintID = 33546;\n        public const int HighGradeAscendancyOmegaBlueprintID = 33548;\n        public const int KisharBlueprintID = 11390;\n        public const int LuxLBlueprintID = 12833;\n        public const int LuxMBlueprintID = 12831;\n        public const int LuxSBlueprintID = 12553;\n        public const int MackinawOREDevelopmentEditionBlueprintID = 33684;\n        public const int MediumEWDroneRangeAugmentorIIBlueprintID = 32080;\n        public const int MidGradeAscenancyAlphaBlueprintID = 33556;\n        public const int MidGradeAscenancyBetaBlueprintID = 33558;\n        public const int MidGradeAscenancyGammaBlueprintID = 33564;\n        public const int MidGradeAscenancyDeltaBlueprintID = 33560;\n        public const int MidGradeAscenancyEpsilonBlueprintID = 33562;\n        public const int MidGradeAscenancyOmegaBlueprintID = 33566;\n        public const int MinerIIChinaBlueprintID = 26607;\n        public const int MiningLaserOptimizationIIBlueprintID = 28891;\n        public const int MiningLaserRangeIIBlueprintID = 28895;\n        public const int ReconProbeLauncherIIBlueprintID = 25772;\n        public const int ScanProbeLauncherIIBlueprintID = 17902;\n        public const int ShieldTransporterRigIIBlueprintID = 26967;\n        public const int ShockLBlueprintID = 12764;\n        public const int ShockMBlueprintID = 12770;\n        public const int ShockSBlueprintID = 12630;\n        public const int SmallEWDroneRangeAugmentorIIBlueprintID = 32078;\n        public const int StormLBlueprintID = 12784;\n        public const int StormMBlueprintID = 12782;\n        public const int StormSBlueprintID = 12628;\n        public const int TalismanAlphaBlueprintID = 11074;\n        public const int AdvancedInfomorphPsychologySkillID = 33407;\n        public const int InfomorphSynchronizingSkillID = 33399;\n\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Constants/EveConstants.cs",
    "content": "namespace EVEMon.Common.Constants\n{\n    public static class EveConstants\n    {\n        public const int SpareAttributePointsOnRemap = 14;\n        public const int CharacterBaseAttributePoints = 17;\n        public const int MaxRemappablePointsPerAttribute = 10;\n        public const int MaxImplantPoints = 5;\n        public const int DowntimeHour = 11;\n        public const int DowntimeDuration = 30;\n        public const float TransactionTaxBase = 0.05f;\n        public const float BrokerFeeBase = 0.05f;\n        public const int MaxSkillsInQueue = 50;\n        public const int MaxAlphaSkillTraining = 5000000;\n\n        /// <summary>\n        /// Represents a \"region\" range.\n        /// </summary>\n        public const int RegionRange = 32767;\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Constants/EveMonConstants.cs",
    "content": "namespace EVEMon.Common.Constants\n{\n    public static class EveMonConstants\n    {\n        public const int DefaultDpi = 96;\n        public const int ImplantSetNameMaxLength = 128;\n        public const string UnknownText = \"Unknown\";\n        public const string DowntimeText = \"DOWNTIME\";\n        public const string CurrentSkillQueueText = \"Current Skill Queue\";\n        public const string PatchXmlFilename = \"patch.xml\";\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Constants/NetworkConstants.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ESIServerStatus\" xml:space=\"preserve\">\n    <value>/v1/status/</value>\n    <comment>30</comment>\n  </data>\n  <data name=\"ESISkillQueue\" xml:space=\"preserve\">\n    <value>/v2/characters/{0:D}/skillqueue/</value>\n    <comment>120</comment>\n  </data>\n  <data name=\"EVEMonUpdates\" xml:space=\"preserve\">\n    <value>/updates/patch.xml</value>\n  </data>\n  <data name=\"CCPPortraits\" xml:space=\"preserve\">\n    <value>/characters/{0:D}/portrait?tenant=tranquility&amp;size={1:D}</value>\n    <comment>New web address for portraits as part of Incursion 1.1.0</comment>\n  </data>\n  <data name=\"EVEMonMainPage\" xml:space=\"preserve\">\n    <value>https://evemondevteam.github.io/evemon/</value>\n    <comment>Out of date but mirroring it will be challenging</comment>\n  </data>\n  <data name=\"EVEMonForums\" xml:space=\"preserve\">\n    <value>https://forums.eveonline.com/t/evemon-4-0-beta-under-new-ownership-conversion-for-esi/75953</value>\n  </data>\n  <data name=\"ESIAccountBalance\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/wallet/</value>\n    <comment>120</comment>\n  </data>\n  <data name=\"MyEVELevelImage\" xml:space=\"preserve\">\n    <value>/bitmaps/character/level</value>\n  </data>\n  <data name=\"ESIMarketOrders\" xml:space=\"preserve\">\n    <value>/v2/characters/{0:D}/orders/</value>\n    <comment>1200</comment>\n  </data>\n  <data name=\"EVEMonUserVoice\" xml:space=\"preserve\">\n    <value>https://github.com/peterhaneve/evemon/issues/</value>\n  </data>\n  <data name=\"ESIIndustryJobs\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/industry/jobs/</value>\n    <comment>300</comment>\n  </data>\n  <data name=\"ESIResearchPoints\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/agents_research/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESIAccountStatus\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/accountStatus/</value>\n    <comment>RIP</comment>\n  </data>\n  <data name=\"ESIMailBodies\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/mail/{1:D}/</value>\n    <comment>30</comment>\n  </data>\n  <data name=\"ESIMailingLists\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/mail/lists/</value>\n    <comment>120</comment>\n  </data>\n  <data name=\"ESIMailMessages\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/mail/</value>\n    <comment>30</comment>\n  </data>\n  <data name=\"ESINotifications\" xml:space=\"preserve\">\n    <value>/v5/characters/{0:D}/notifications/</value>\n    <comment>600</comment>\n  </data>\n  <data name=\"ESICharacterSheet\" xml:space=\"preserve\">\n    <value>/v4/characters/{0:D}/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESIStandings\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/standings/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"CCPCorporationLogo\" xml:space=\"preserve\">\n    <value>/corporations/{0:D}/logo?tenant=tranquility&amp;size={1:D}</value>\n    <comment>New web address for characters and alliances as part of Incursion 1.1.0</comment>\n  </data>\n  <data name=\"EVEGateMailOpen\" xml:space=\"preserve\">\n    <value>/Mail/ReadMessage/{0}</value>\n  </data>\n  <data name=\"EVEGateMailForward\" xml:space=\"preserve\">\n    <value>/Mail/ComposeForward/{0}</value>\n  </data>\n  <data name=\"EVEGateMailReply\" xml:space=\"preserve\">\n    <value>/Mail/ComposeReply/{0}</value>\n  </data>\n  <data name=\"EVEGateMailReplyAll\" xml:space=\"preserve\">\n    <value>/Mail/ComposeReplyAll/{0}</value>\n  </data>\n  <data name=\"EVEGateCharacterProfile\" xml:space=\"preserve\">\n    <value>/Profile/{0}</value>\n  </data>\n  <data name=\"EVEGateAllianceProfile\" xml:space=\"preserve\">\n    <value>/Alliance/{0}</value>\n  </data>\n  <data name=\"EVEGateCorporationProfile\" xml:space=\"preserve\">\n    <value>/Corporation/{0}</value>\n  </data>\n  <data name=\"CCPAccountManage\" xml:space=\"preserve\">\n    <value>https://secure.eveonline.com/AccountManMenu.aspx</value>\n  </data>\n  <data name=\"ESICorporationIndustryJobs\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/industry/jobs/</value>\n    <comment>300</comment>\n  </data>\n  <data name=\"ESICorporationMarketOrders\" xml:space=\"preserve\">\n    <value>/v3/corporations/{0:D}/orders/</value>\n    <comment>1200</comment>\n  </data>\n  <data name=\"ESIContractBids\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/contracts/{1:D}/bids/</value>\n    <comment>300</comment>\n  </data>\n  <data name=\"ESIContractItems\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/contracts/{1:D}/items/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESIContracts\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/contracts/</value>\n    <comment>300</comment>\n  </data>\n  <data name=\"ESICorporationContractBids\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/contracts/{1:D}/bids/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICorporationContractItems\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/contracts/{1:D}/items/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICorporationContracts\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/contracts/</value>\n    <comment>300</comment>\n  </data>\n  <data name=\"ESIAllianceList\" xml:space=\"preserve\">\n    <value>/v2/alliances/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESIAssetList\" xml:space=\"preserve\">\n    <value>/v5/characters/{0:D}/assets/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICalendarEventAttendees\" xml:space=\"preserve\">\n    <value>/v2/characters/{0:D}/calendar/{1:D}/attendees/</value>\n    <comment>600</comment>\n  </data>\n  <data name=\"ESIContactList\" xml:space=\"preserve\">\n    <value>/v2/characters/{0:D}/contacts/</value>\n    <comment>300</comment>\n  </data>\n  <data name=\"ESICorporationAccountBalance\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/wallets/</value>\n    <comment>300</comment>\n  </data>\n  <data name=\"ESICorporationAssetList\" xml:space=\"preserve\">\n    <value>/v5/corporations/{0:D}/assets/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICorporationContactList\" xml:space=\"preserve\">\n    <value>/v2/corporations/{0:D}/contacts/</value>\n    <comment>300</comment>\n  </data>\n  <data name=\"ESICorporationContainerLog\" xml:space=\"preserve\">\n    <value>/v2/corporations/{0:D}/containers/logs/</value>\n    <comment>600</comment>\n  </data>\n  <data name=\"ESICorporationFactionalWarfareStats\" xml:space=\"preserve\">\n    <value>/v2/corporations/{0:D}/fw/stats/</value>\n    <comment>downtime</comment>\n  </data>\n  <data name=\"ESICorporationKillLog\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/killmails/recent/</value>\n    <comment>300</comment>\n  </data>\n  <data name=\"ESICorporationMedals\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/medals/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICorporationMemberMedals\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/medals/issued/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICorporationMemberTracking\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/membertracking/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICorporationShareholders\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/shareholders/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICorporationSheet\" xml:space=\"preserve\">\n    <value>/v4/corporations/{0:D}/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICorporationStandings\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/standings/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICorporationTitles\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/titles/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICorporationWalletJournal\" xml:space=\"preserve\">\n    <value>/v4/corporations/{0:D}/wallets/{1:D}/journal/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICorporationWalletTransactions\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/wallets/{1:D}/transactions/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESIEVEFactionalWarfareStats\" xml:space=\"preserve\">\n    <value>/v2/fw/stats/</value>\n    <comment>downtime</comment>\n  </data>\n  <data name=\"ESIEVEFactionalWarfareTopStats\" xml:space=\"preserve\">\n    <value>/v2/fw/leaderboards/</value>\n    <comment>downtime</comment>\n  </data>\n  <data name=\"ESIFactionalWarfareStats\" xml:space=\"preserve\">\n    <value>/v2/characters/{0:D}/fw/stats/</value>\n    <comment>downtime</comment>\n  </data>\n  <data name=\"ESIKillLog\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/killmails/recent/</value>\n    <comment>120</comment>\n  </data>\n  <data name=\"ESILocation\" xml:space=\"preserve\">\n    <value>/v2/characters/{0:D}/location/</value>\n    <comment>5</comment>\n  </data>\n  <data name=\"ESIMedals\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/medals/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESIUpcomingCalendarEvents\" xml:space=\"preserve\">\n    <value>/v2/characters/{0:D}/calendar/</value>\n    <comment>5</comment>\n  </data>\n  <data name=\"ESIWalletJournal\" xml:space=\"preserve\">\n    <value>/v6/characters/{0:D}/wallet/journal/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESIWalletTransactions\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/wallet/transactions/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESIFactionalWarfareSystems\" xml:space=\"preserve\">\n    <value>/v3/fw/systems/</value>\n    <comment>1800</comment>\n  </data>\n  <data name=\"ESIJumps\" xml:space=\"preserve\">\n    <value>/v1/universe/system_jumps/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESIKills\" xml:space=\"preserve\">\n    <value>/v2/universe/system_kills/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESISovereignty\" xml:space=\"preserve\">\n    <value>/v1/sovereignty/structures/</value>\n    <comment>120</comment>\n  </data>\n  <data name=\"BitBucketWikiBase\" xml:space=\"preserve\">\n    <value>https://bitbucket.org/EVEMonDevTeam/evemon/wiki</value>\n  </data>\n  <data name=\"EVECommunityBase\" xml:space=\"preserve\">\n    <value>https://community.eveonline.com</value>\n  </data>\n  <data name=\"EVEImageServerBase\" xml:space=\"preserve\">\n    <value>https://images.evetech.net</value>\n  </data>\n  <data name=\"ESICharacterFatigue\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/fatigue/</value>\n    <comment>300</comment>\n  </data>\n  <data name=\"ESIPlanetaryColonies\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/planets/</value>\n    <comment>600</comment>\n  </data>\n  <data name=\"ESIPlanetaryLayout\" xml:space=\"preserve\">\n    <value>/v3/characters/{0:D}/planets/{1:D}/</value>\n    <comment>600</comment>\n  </data>\n  <data name=\"ESIBlueprints\" xml:space=\"preserve\">\n    <value>/v2/characters/{0:D}/blueprints/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICorporationBlueprints\" xml:space=\"preserve\">\n    <value>/v2/corporations/{0:D}/blueprints/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ExternalEveNotificationTextParser\" xml:space=\"preserve\">\n    <value>/eve/ExternalEveNotificationTextParser.cs</value>\n  </data>\n  <data name=\"NotificationRefTypes\" xml:space=\"preserve\">\n    <value>/eve/NotificationRefTypes.xml</value>\n  </data>\n  <data name=\"EVEMonTwitter\" xml:space=\"preserve\">\n    <value>https://twitter.com/evemon</value>\n  </data>\n  <data name=\"GoogleAnalyticsUrl\" xml:space=\"preserve\">\n    <value>https://ssl.google-analytics.com/collect</value>\n  </data>\n  <data name=\"EVEMarketDataAPIItemPrices\" xml:space=\"preserve\">\n    <value>/api/item_prices2.xml?char_name=evemon&amp;buysell=a</value>\n  </data>\n  <data name=\"EVEMarketDataBaseUrl\" xml:space=\"preserve\">\n    <value>http://api.eve-marketdata.com</value>\n  </data>\n  <data name=\"EVEMarketerAPIItemPrices\" xml:space=\"preserve\">\n    <value>/ec/marketstat</value>\n  </data>\n  <data name=\"EVEMarketerBaseUrl\" xml:space=\"preserve\">\n    <value>https://api.evemarketer.com</value>\n  </data>\n  <data name=\"NISTTimeServer\" xml:space=\"preserve\">\n    <value>tcp://time.nist.gov:13</value>\n  </data>\n  <data name=\"OsmiumBaseUrl\" xml:space=\"preserve\">\n    <value>https://o.smium.org</value>\n  </data>\n  <data name=\"OsmiumLoadoutFeed\" xml:space=\"preserve\">\n    <value>/api/json/loadout/query/{0}?limit=50&amp;sortby=creationdate</value>\n  </data>\n  <data name=\"OsmiumLoadoutDetails\" xml:space=\"preserve\">\n    <value>/api/convert/{0}/eft</value>\n  </data>\n  <data name=\"OsmiumLoadoutTopic\" xml:space=\"preserve\">\n    <value>/loadout/{0}</value>\n  </data>\n  <data name=\"GitHubDownloadsBase\" xml:space=\"preserve\">\n    <value>https://github.com/peterhaneve/evemon/releases</value>\n  </data>\n  <data name=\"BitBucketDatafilesBase\" xml:space=\"preserve\">\n    <value>https://peterhaneve.github.io/evemon-datafiles/</value>\n  </data>\n  <data name=\"BitBucketIssuesBase\" xml:space=\"preserve\">\n    <value>https://bitbucket.org/EVEMonDevTeam/evemon/issues</value>\n  </data>\n  <data name=\"EveFlags\" xml:space=\"preserve\">\n    <value>/eve/Flags.xml</value>\n  </data>\n  <data name=\"GitHubBase\" xml:space=\"preserve\">\n    <value>https://raw.githubusercontent.com/peterhaneve/evemon/main</value>\n  </data>\n  <data name=\"EVEMonManual\" xml:space=\"preserve\">\n    <value>https://evemon.readthedocs.org/</value>\n  </data>\n  <data name=\"ESIBookmarks\" xml:space=\"preserve\">\n    <value>/v2/characters/{0:D}/bookmarks/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESIClones\" xml:space=\"preserve\">\n    <value>/v4/characters/{0:D}/clones/</value>\n    <comment>120</comment>\n  </data>\n  <data name=\"ESISkills\" xml:space=\"preserve\">\n    <value>/v4/characters/{0:D}/skills/</value>\n    <comment>120</comment>\n  </data>\n  <data name=\"ESICorporationBookmarks\" xml:space=\"preserve\">\n    <value>/v1/corporations/{0:D}/bookmarks/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"GlobalNTPPool\" xml:space=\"preserve\">\n    <value>0.pool.ntp.org</value>\n  </data>\n  <data name=\"ESIBase\" xml:space=\"preserve\">\n    <value>https://esi.evetech.net</value>\n  </data>\n  <data name=\"ESICharacterName\" xml:space=\"preserve\">\n    <value>/v3/universe/names/</value>\n  </data>\n  <data name=\"ESICitadelInfo\" xml:space=\"preserve\">\n    <value>/v2/universe/structures/{0}/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESIStationInfo\" xml:space=\"preserve\">\n    <value>/v2/universe/stations/{0}/</value>\n    <comment>300</comment>\n  </data>\n  <data name=\"SSOBase\" xml:space=\"preserve\">\n    <value>https://login.eveonline.com/oauth/</value>\n  </data>\n  <data name=\"SSOCharID\" xml:space=\"preserve\">\n    <value>verify</value>\n  </data>\n  <data name=\"SSOLogin\" xml:space=\"preserve\">\n    <value>authorize/?response_type=code&amp;redirect_uri={0}&amp;client_id={3}&amp;scope={2}&amp;state={1}</value>\n  </data>\n  <data name=\"SSORedirect\" xml:space=\"preserve\">\n    <value>http://localhost:{0:D}/callback</value>\n  </data>\n  <data name=\"SSOToken\" xml:space=\"preserve\">\n    <value>token</value>\n  </data>\n  <data name=\"PostDataAuthToken\" xml:space=\"preserve\">\n    <value>grant_type=authorization_code&amp;code={0}</value>\n  </data>\n  <data name=\"CCPApplicationRegistration\" xml:space=\"preserve\">\n    <value>https://peterhaneve.github.io/evemon-esi</value>\n  </data>\n  <data name=\"SSOScopes\" xml:space=\"preserve\">\n    <value>esi-wallet.read_character_wallet.v1 esi-calendar.read_calendar_events.v1 esi-location.read_location.v1 esi-location.read_ship_type.v1 esi-mail.read_mail.v1 esi-skills.read_skills.v1 esi-skills.read_skillqueue.v1 esi-clones.read_clones.v1 esi-characters.read_contacts.v1 esi-universe.read_structures.v1 esi-killmails.read_killmails.v1 esi-assets.read_assets.v1 esi-planets.manage_planets.v1 esi-markets.structure_markets.v1 esi-corporations.read_structures.v1 esi-characters.read_loyalty.v1 esi-characters.read_medals.v1 esi-characters.read_standings.v1 esi-characters.read_agents_research.v1 esi-industry.read_character_jobs.v1 esi-markets.read_character_orders.v1 esi-characters.read_blueprints.v1 esi-characters.read_corporation_roles.v1 esi-contracts.read_character_contracts.v1 esi-clones.read_implants.v1 esi-characters.read_fatigue.v1 esi-killmails.read_corporation_killmails.v1 esi-wallet.read_corporation_wallets.v1 esi-characters.read_notifications.v1 esi-corporations.read_divisions.v1 esi-corporations.read_contacts.v1 esi-assets.read_corporation_assets.v1 esi-corporations.read_blueprints.v1 esi-contracts.read_corporation_contracts.v1 esi-corporations.read_standings.v1 esi-industry.read_corporation_jobs.v1 esi-markets.read_corporation_orders.v1 esi-corporations.read_medals.v1 esi-alliances.read_contacts.v1 esi-characters.read_fw_stats.v1 esi-corporations.read_fw_stats.v1</value>\n  </data>\n  <data name=\"PostDataRefreshToken\" xml:space=\"preserve\">\n    <value>grant_type=refresh_token&amp;refresh_token={0}</value>\n  </data>\n  <data name=\"ESIUpcomingCalendarEventDetails\" xml:space=\"preserve\">\n    <value>/v4/characters/{0:D}/calendar/{1:D}/</value>\n    <comment>5</comment>\n  </data>\n  <data name=\"ESIFactionWars\" xml:space=\"preserve\">\n    <value>/v2/fw/wars/</value>\n    <comment>downtime</comment>\n  </data>\n  <data name=\"ESICharacterAffiliation\" xml:space=\"preserve\">\n    <value>/v1/characters/affiliation/</value>\n  </data>\n  <data name=\"ESIAttributes\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/attributes/</value>\n    <comment>120</comment>\n  </data>\n  <data name=\"ESIImplants\" xml:space=\"preserve\">\n    <value>/v2/characters/{0:D}/implants/</value>\n    <comment>300</comment>\n  </data>\n  <data name=\"ESIShip\" xml:space=\"preserve\">\n    <value>/v2/characters/{0:D}/ship/</value>\n    <comment>5</comment>\n  </data>\n  <data name=\"ESIEmploymentHistory\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/corporationhistory/</value>\n    <comment>86400</comment>\n  </data>\n  <data name=\"BitBucketBase\" xml:space=\"preserve\">\n    <value>https://bitbucket.org/EVEMonDevTeam/evemon</value>\n  </data>\n  <data name=\"ESIPlanetInfo\" xml:space=\"preserve\">\n    <value>/v1/universe/planets/{0:D}/</value>\n    <comment>downtime</comment>\n  </data>\n  <data name=\"HammertimeCitadel\" xml:space=\"preserve\">\n    <value>https://stop.hammerti.me.uk/api/citadel/{0:D}</value>\n  </data>\n  <data name=\"ESIKillMail\" xml:space=\"preserve\">\n    <value>/v1/killmails/{0}/{1}/</value>\n    <comment>2 weeks</comment>\n  </data>\n  <data name=\"ForumThreadBase\" xml:space=\"preserve\">\n    <value>https://forums.eveonline.com/t/evemon-4-0-beta-under-new-ownership-conversion-for-esi/75953</value>\n  </data>\n  <data name=\"GoogleCalendarSetup\" xml:space=\"preserve\">\n    <value>https://www.google.com/search?q=google%20calendar%20get%20calendar%20id</value>\n  </data>\n  <data name=\"SSOLoginPKCE\" xml:space=\"preserve\">\n    <value>authorize/?response_type=code&amp;redirect_uri={0}&amp;client_id={3}&amp;scope={2}&amp;state={1}&amp;code_challenge_method=S256&amp;code_challenge={4}</value>\n  </data>\n  <data name=\"SSODefaultAppID\" xml:space=\"preserve\">\n    <value>05153596dde44fd8b0d60c0ad3b90c24</value>\n    <comment>PKCE mode</comment>\n  </data>\n  <data name=\"PostDataAuthPKCE\" xml:space=\"preserve\">\n    <value>grant_type=authorization_code&amp;code={0}&amp;client_id={1}&amp;code_verifier={2}</value>\n  </data>\n  <data name=\"SSOBaseV2\" xml:space=\"preserve\">\n    <value>https://login.eveonline.com/v2/oauth/</value>\n  </data>\n  <data name=\"PostDataRefreshPKCE\" xml:space=\"preserve\">\n    <value>grant_type=refresh_token&amp;client_id={1}&amp;refresh_token={0}</value>\n  </data>\n  <data name=\"ESILoyaltyPoints\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/loyalty/points/</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESICorporationMarketOrdersHistory\" xml:space=\"preserve\">\n    <value>/v2/corporations/{0:D}/orders/history</value>\n    <comment>3600</comment>\n  </data>\n  <data name=\"ESIMarketOrdersHistory\" xml:space=\"preserve\">\n    <value>/v1/characters/{0:D}/orders/history</value>\n    <comment>1200</comment>\n  </data>\n  <data name=\"CCPAllianceLogo\" xml:space=\"preserve\">\n    <value>/alliances/{0:D}/logo?tenant=tranquility&amp;size={1:D}</value>\n  </data>\n  <data name=\"CCPTypeImage\" xml:space=\"preserve\">\n    <value>/types/{0:D}/icon?tenant=tranquility&amp;size={1:D}</value>\n  </data>\n  <data name=\"CCPTypeRender\" xml:space=\"preserve\">\n    <value>/types/{0:D}/render?tenant=tranquility&amp;size={1:D}</value>\n  </data>\n  <data name=\"FuzzworksMarketUrl\" xml:space=\"preserve\">\n    <value>https://market.fuzzwork.co.uk/aggregates/?region=10000002&amp;types=</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Constants/NetworkConstants1.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Common.Constants {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public class NetworkConstants {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal NetworkConstants() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Common.Constants.NetworkConstants\", typeof(NetworkConstants).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://bitbucket.org/EVEMonDevTeam/evemon.\n        /// </summary>\n        public static string BitBucketBase {\n            get {\n                return ResourceManager.GetString(\"BitBucketBase\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://peterhaneve.github.io/evemon-datafiles/.\n        /// </summary>\n        public static string BitBucketDatafilesBase {\n            get {\n                return ResourceManager.GetString(\"BitBucketDatafilesBase\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://bitbucket.org/EVEMonDevTeam/evemon/issues.\n        /// </summary>\n        public static string BitBucketIssuesBase {\n            get {\n                return ResourceManager.GetString(\"BitBucketIssuesBase\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://bitbucket.org/EVEMonDevTeam/evemon/wiki.\n        /// </summary>\n        public static string BitBucketWikiBase {\n            get {\n                return ResourceManager.GetString(\"BitBucketWikiBase\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://secure.eveonline.com/AccountManMenu.aspx.\n        /// </summary>\n        public static string CCPAccountManage {\n            get {\n                return ResourceManager.GetString(\"CCPAccountManage\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /alliances/{0:D}/logo?tenant=tranquility&amp;size={1:D}.\n        /// </summary>\n        public static string CCPAllianceLogo {\n            get {\n                return ResourceManager.GetString(\"CCPAllianceLogo\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://peterhaneve.github.io/evemon-esi.\n        /// </summary>\n        public static string CCPApplicationRegistration {\n            get {\n                return ResourceManager.GetString(\"CCPApplicationRegistration\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /corporations/{0:D}/logo?tenant=tranquility&amp;size={1:D}.\n        /// </summary>\n        public static string CCPCorporationLogo {\n            get {\n                return ResourceManager.GetString(\"CCPCorporationLogo\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /characters/{0:D}/portrait?tenant=tranquility&amp;size={1:D}.\n        /// </summary>\n        public static string CCPPortraits {\n            get {\n                return ResourceManager.GetString(\"CCPPortraits\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /types/{0:D}/icon?tenant=tranquility&amp;size={1:D}.\n        /// </summary>\n        public static string CCPTypeImage {\n            get {\n                return ResourceManager.GetString(\"CCPTypeImage\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /types/{0:D}/render?tenant=tranquility&amp;size={1:D}.\n        /// </summary>\n        public static string CCPTypeRender {\n            get {\n                return ResourceManager.GetString(\"CCPTypeRender\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/wallet/.\n        /// </summary>\n        public static string ESIAccountBalance {\n            get {\n                return ResourceManager.GetString(\"ESIAccountBalance\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/accountStatus/.\n        /// </summary>\n        public static string ESIAccountStatus {\n            get {\n                return ResourceManager.GetString(\"ESIAccountStatus\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/alliances/.\n        /// </summary>\n        public static string ESIAllianceList {\n            get {\n                return ResourceManager.GetString(\"ESIAllianceList\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v5/characters/{0:D}/assets/.\n        /// </summary>\n        public static string ESIAssetList {\n            get {\n                return ResourceManager.GetString(\"ESIAssetList\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/attributes/.\n        /// </summary>\n        public static string ESIAttributes {\n            get {\n                return ResourceManager.GetString(\"ESIAttributes\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://esi.evetech.net.\n        /// </summary>\n        public static string ESIBase {\n            get {\n                return ResourceManager.GetString(\"ESIBase\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/characters/{0:D}/blueprints/.\n        /// </summary>\n        public static string ESIBlueprints {\n            get {\n                return ResourceManager.GetString(\"ESIBlueprints\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/characters/{0:D}/bookmarks/.\n        /// </summary>\n        public static string ESIBookmarks {\n            get {\n                return ResourceManager.GetString(\"ESIBookmarks\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/characters/{0:D}/calendar/{1:D}/attendees/.\n        /// </summary>\n        public static string ESICalendarEventAttendees {\n            get {\n                return ResourceManager.GetString(\"ESICalendarEventAttendees\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/affiliation/.\n        /// </summary>\n        public static string ESICharacterAffiliation {\n            get {\n                return ResourceManager.GetString(\"ESICharacterAffiliation\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/fatigue/.\n        /// </summary>\n        public static string ESICharacterFatigue {\n            get {\n                return ResourceManager.GetString(\"ESICharacterFatigue\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v3/universe/names/.\n        /// </summary>\n        public static string ESICharacterName {\n            get {\n                return ResourceManager.GetString(\"ESICharacterName\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v4/characters/{0:D}/.\n        /// </summary>\n        public static string ESICharacterSheet {\n            get {\n                return ResourceManager.GetString(\"ESICharacterSheet\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/universe/structures/{0}/.\n        /// </summary>\n        public static string ESICitadelInfo {\n            get {\n                return ResourceManager.GetString(\"ESICitadelInfo\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v4/characters/{0:D}/clones/.\n        /// </summary>\n        public static string ESIClones {\n            get {\n                return ResourceManager.GetString(\"ESIClones\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/characters/{0:D}/contacts/.\n        /// </summary>\n        public static string ESIContactList {\n            get {\n                return ResourceManager.GetString(\"ESIContactList\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/contracts/{1:D}/bids/.\n        /// </summary>\n        public static string ESIContractBids {\n            get {\n                return ResourceManager.GetString(\"ESIContractBids\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/contracts/{1:D}/items/.\n        /// </summary>\n        public static string ESIContractItems {\n            get {\n                return ResourceManager.GetString(\"ESIContractItems\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/contracts/.\n        /// </summary>\n        public static string ESIContracts {\n            get {\n                return ResourceManager.GetString(\"ESIContracts\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/wallets/.\n        /// </summary>\n        public static string ESICorporationAccountBalance {\n            get {\n                return ResourceManager.GetString(\"ESICorporationAccountBalance\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v5/corporations/{0:D}/assets/.\n        /// </summary>\n        public static string ESICorporationAssetList {\n            get {\n                return ResourceManager.GetString(\"ESICorporationAssetList\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/corporations/{0:D}/blueprints/.\n        /// </summary>\n        public static string ESICorporationBlueprints {\n            get {\n                return ResourceManager.GetString(\"ESICorporationBlueprints\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/bookmarks/.\n        /// </summary>\n        public static string ESICorporationBookmarks {\n            get {\n                return ResourceManager.GetString(\"ESICorporationBookmarks\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/corporations/{0:D}/contacts/.\n        /// </summary>\n        public static string ESICorporationContactList {\n            get {\n                return ResourceManager.GetString(\"ESICorporationContactList\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/corporations/{0:D}/containers/logs/.\n        /// </summary>\n        public static string ESICorporationContainerLog {\n            get {\n                return ResourceManager.GetString(\"ESICorporationContainerLog\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/contracts/{1:D}/bids/.\n        /// </summary>\n        public static string ESICorporationContractBids {\n            get {\n                return ResourceManager.GetString(\"ESICorporationContractBids\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/contracts/{1:D}/items/.\n        /// </summary>\n        public static string ESICorporationContractItems {\n            get {\n                return ResourceManager.GetString(\"ESICorporationContractItems\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/contracts/.\n        /// </summary>\n        public static string ESICorporationContracts {\n            get {\n                return ResourceManager.GetString(\"ESICorporationContracts\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/corporations/{0:D}/fw/stats/.\n        /// </summary>\n        public static string ESICorporationFactionalWarfareStats {\n            get {\n                return ResourceManager.GetString(\"ESICorporationFactionalWarfareStats\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/industry/jobs/.\n        /// </summary>\n        public static string ESICorporationIndustryJobs {\n            get {\n                return ResourceManager.GetString(\"ESICorporationIndustryJobs\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/killmails/recent/.\n        /// </summary>\n        public static string ESICorporationKillLog {\n            get {\n                return ResourceManager.GetString(\"ESICorporationKillLog\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v3/corporations/{0:D}/orders/.\n        /// </summary>\n        public static string ESICorporationMarketOrders {\n            get {\n                return ResourceManager.GetString(\"ESICorporationMarketOrders\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/corporations/{0:D}/orders/history.\n        /// </summary>\n        public static string ESICorporationMarketOrdersHistory {\n            get {\n                return ResourceManager.GetString(\"ESICorporationMarketOrdersHistory\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/medals/.\n        /// </summary>\n        public static string ESICorporationMedals {\n            get {\n                return ResourceManager.GetString(\"ESICorporationMedals\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/medals/issued/.\n        /// </summary>\n        public static string ESICorporationMemberMedals {\n            get {\n                return ResourceManager.GetString(\"ESICorporationMemberMedals\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/membertracking/.\n        /// </summary>\n        public static string ESICorporationMemberTracking {\n            get {\n                return ResourceManager.GetString(\"ESICorporationMemberTracking\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/shareholders/.\n        /// </summary>\n        public static string ESICorporationShareholders {\n            get {\n                return ResourceManager.GetString(\"ESICorporationShareholders\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v4/corporations/{0:D}/.\n        /// </summary>\n        public static string ESICorporationSheet {\n            get {\n                return ResourceManager.GetString(\"ESICorporationSheet\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/standings/.\n        /// </summary>\n        public static string ESICorporationStandings {\n            get {\n                return ResourceManager.GetString(\"ESICorporationStandings\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/titles/.\n        /// </summary>\n        public static string ESICorporationTitles {\n            get {\n                return ResourceManager.GetString(\"ESICorporationTitles\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v4/corporations/{0:D}/wallets/{1:D}/journal/.\n        /// </summary>\n        public static string ESICorporationWalletJournal {\n            get {\n                return ResourceManager.GetString(\"ESICorporationWalletJournal\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/corporations/{0:D}/wallets/{1:D}/transactions/.\n        /// </summary>\n        public static string ESICorporationWalletTransactions {\n            get {\n                return ResourceManager.GetString(\"ESICorporationWalletTransactions\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/corporationhistory/.\n        /// </summary>\n        public static string ESIEmploymentHistory {\n            get {\n                return ResourceManager.GetString(\"ESIEmploymentHistory\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/fw/stats/.\n        /// </summary>\n        public static string ESIEVEFactionalWarfareStats {\n            get {\n                return ResourceManager.GetString(\"ESIEVEFactionalWarfareStats\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/fw/leaderboards/.\n        /// </summary>\n        public static string ESIEVEFactionalWarfareTopStats {\n            get {\n                return ResourceManager.GetString(\"ESIEVEFactionalWarfareTopStats\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/characters/{0:D}/fw/stats/.\n        /// </summary>\n        public static string ESIFactionalWarfareStats {\n            get {\n                return ResourceManager.GetString(\"ESIFactionalWarfareStats\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v3/fw/systems/.\n        /// </summary>\n        public static string ESIFactionalWarfareSystems {\n            get {\n                return ResourceManager.GetString(\"ESIFactionalWarfareSystems\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/fw/wars/.\n        /// </summary>\n        public static string ESIFactionWars {\n            get {\n                return ResourceManager.GetString(\"ESIFactionWars\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/characters/{0:D}/implants/.\n        /// </summary>\n        public static string ESIImplants {\n            get {\n                return ResourceManager.GetString(\"ESIImplants\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/industry/jobs/.\n        /// </summary>\n        public static string ESIIndustryJobs {\n            get {\n                return ResourceManager.GetString(\"ESIIndustryJobs\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/universe/system_jumps/.\n        /// </summary>\n        public static string ESIJumps {\n            get {\n                return ResourceManager.GetString(\"ESIJumps\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/killmails/recent/.\n        /// </summary>\n        public static string ESIKillLog {\n            get {\n                return ResourceManager.GetString(\"ESIKillLog\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/killmails/{0}/{1}/.\n        /// </summary>\n        public static string ESIKillMail {\n            get {\n                return ResourceManager.GetString(\"ESIKillMail\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/universe/system_kills/.\n        /// </summary>\n        public static string ESIKills {\n            get {\n                return ResourceManager.GetString(\"ESIKills\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/characters/{0:D}/location/.\n        /// </summary>\n        public static string ESILocation {\n            get {\n                return ResourceManager.GetString(\"ESILocation\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/loyalty/points/.\n        /// </summary>\n        public static string ESILoyaltyPoints {\n            get {\n                return ResourceManager.GetString(\"ESILoyaltyPoints\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/mail/{1:D}/.\n        /// </summary>\n        public static string ESIMailBodies {\n            get {\n                return ResourceManager.GetString(\"ESIMailBodies\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/mail/lists/.\n        /// </summary>\n        public static string ESIMailingLists {\n            get {\n                return ResourceManager.GetString(\"ESIMailingLists\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/mail/.\n        /// </summary>\n        public static string ESIMailMessages {\n            get {\n                return ResourceManager.GetString(\"ESIMailMessages\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/characters/{0:D}/orders/.\n        /// </summary>\n        public static string ESIMarketOrders {\n            get {\n                return ResourceManager.GetString(\"ESIMarketOrders\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/orders/history.\n        /// </summary>\n        public static string ESIMarketOrdersHistory {\n            get {\n                return ResourceManager.GetString(\"ESIMarketOrdersHistory\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/medals/.\n        /// </summary>\n        public static string ESIMedals {\n            get {\n                return ResourceManager.GetString(\"ESIMedals\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v5/characters/{0:D}/notifications/.\n        /// </summary>\n        public static string ESINotifications {\n            get {\n                return ResourceManager.GetString(\"ESINotifications\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/planets/.\n        /// </summary>\n        public static string ESIPlanetaryColonies {\n            get {\n                return ResourceManager.GetString(\"ESIPlanetaryColonies\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v3/characters/{0:D}/planets/{1:D}/.\n        /// </summary>\n        public static string ESIPlanetaryLayout {\n            get {\n                return ResourceManager.GetString(\"ESIPlanetaryLayout\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/universe/planets/{0:D}/.\n        /// </summary>\n        public static string ESIPlanetInfo {\n            get {\n                return ResourceManager.GetString(\"ESIPlanetInfo\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/agents_research/.\n        /// </summary>\n        public static string ESIResearchPoints {\n            get {\n                return ResourceManager.GetString(\"ESIResearchPoints\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/status/.\n        /// </summary>\n        public static string ESIServerStatus {\n            get {\n                return ResourceManager.GetString(\"ESIServerStatus\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/characters/{0:D}/ship/.\n        /// </summary>\n        public static string ESIShip {\n            get {\n                return ResourceManager.GetString(\"ESIShip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/characters/{0:D}/skillqueue/.\n        /// </summary>\n        public static string ESISkillQueue {\n            get {\n                return ResourceManager.GetString(\"ESISkillQueue\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v4/characters/{0:D}/skills/.\n        /// </summary>\n        public static string ESISkills {\n            get {\n                return ResourceManager.GetString(\"ESISkills\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/sovereignty/structures/.\n        /// </summary>\n        public static string ESISovereignty {\n            get {\n                return ResourceManager.GetString(\"ESISovereignty\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/standings/.\n        /// </summary>\n        public static string ESIStandings {\n            get {\n                return ResourceManager.GetString(\"ESIStandings\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/universe/stations/{0}/.\n        /// </summary>\n        public static string ESIStationInfo {\n            get {\n                return ResourceManager.GetString(\"ESIStationInfo\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v4/characters/{0:D}/calendar/{1:D}/.\n        /// </summary>\n        public static string ESIUpcomingCalendarEventDetails {\n            get {\n                return ResourceManager.GetString(\"ESIUpcomingCalendarEventDetails\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v2/characters/{0:D}/calendar/.\n        /// </summary>\n        public static string ESIUpcomingCalendarEvents {\n            get {\n                return ResourceManager.GetString(\"ESIUpcomingCalendarEvents\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v6/characters/{0:D}/wallet/journal/.\n        /// </summary>\n        public static string ESIWalletJournal {\n            get {\n                return ResourceManager.GetString(\"ESIWalletJournal\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /v1/characters/{0:D}/wallet/transactions/.\n        /// </summary>\n        public static string ESIWalletTransactions {\n            get {\n                return ResourceManager.GetString(\"ESIWalletTransactions\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://community.eveonline.com.\n        /// </summary>\n        public static string EVECommunityBase {\n            get {\n                return ResourceManager.GetString(\"EVECommunityBase\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /eve/Flags.xml.\n        /// </summary>\n        public static string EveFlags {\n            get {\n                return ResourceManager.GetString(\"EveFlags\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /Alliance/{0}.\n        /// </summary>\n        public static string EVEGateAllianceProfile {\n            get {\n                return ResourceManager.GetString(\"EVEGateAllianceProfile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /Profile/{0}.\n        /// </summary>\n        public static string EVEGateCharacterProfile {\n            get {\n                return ResourceManager.GetString(\"EVEGateCharacterProfile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /Corporation/{0}.\n        /// </summary>\n        public static string EVEGateCorporationProfile {\n            get {\n                return ResourceManager.GetString(\"EVEGateCorporationProfile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /Mail/ComposeForward/{0}.\n        /// </summary>\n        public static string EVEGateMailForward {\n            get {\n                return ResourceManager.GetString(\"EVEGateMailForward\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /Mail/ReadMessage/{0}.\n        /// </summary>\n        public static string EVEGateMailOpen {\n            get {\n                return ResourceManager.GetString(\"EVEGateMailOpen\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /Mail/ComposeReply/{0}.\n        /// </summary>\n        public static string EVEGateMailReply {\n            get {\n                return ResourceManager.GetString(\"EVEGateMailReply\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /Mail/ComposeReplyAll/{0}.\n        /// </summary>\n        public static string EVEGateMailReplyAll {\n            get {\n                return ResourceManager.GetString(\"EVEGateMailReplyAll\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://images.evetech.net.\n        /// </summary>\n        public static string EVEImageServerBase {\n            get {\n                return ResourceManager.GetString(\"EVEImageServerBase\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /api/item_prices2.xml?char_name=evemon&amp;buysell=a.\n        /// </summary>\n        public static string EVEMarketDataAPIItemPrices {\n            get {\n                return ResourceManager.GetString(\"EVEMarketDataAPIItemPrices\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to http://api.eve-marketdata.com.\n        /// </summary>\n        public static string EVEMarketDataBaseUrl {\n            get {\n                return ResourceManager.GetString(\"EVEMarketDataBaseUrl\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /ec/marketstat.\n        /// </summary>\n        public static string EVEMarketerAPIItemPrices {\n            get {\n                return ResourceManager.GetString(\"EVEMarketerAPIItemPrices\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://api.evemarketer.com.\n        /// </summary>\n        public static string EVEMarketerBaseUrl {\n            get {\n                return ResourceManager.GetString(\"EVEMarketerBaseUrl\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://forums.eveonline.com/t/evemon-4-0-beta-under-new-ownership-conversion-for-esi/75953.\n        /// </summary>\n        public static string EVEMonForums {\n            get {\n                return ResourceManager.GetString(\"EVEMonForums\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://evemondevteam.github.io/evemon/.\n        /// </summary>\n        public static string EVEMonMainPage {\n            get {\n                return ResourceManager.GetString(\"EVEMonMainPage\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://evemon.readthedocs.org/.\n        /// </summary>\n        public static string EVEMonManual {\n            get {\n                return ResourceManager.GetString(\"EVEMonManual\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://twitter.com/evemon.\n        /// </summary>\n        public static string EVEMonTwitter {\n            get {\n                return ResourceManager.GetString(\"EVEMonTwitter\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /updates/patch.xml.\n        /// </summary>\n        public static string EVEMonUpdates {\n            get {\n                return ResourceManager.GetString(\"EVEMonUpdates\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://github.com/peterhaneve/evemon/issues/.\n        /// </summary>\n        public static string EVEMonUserVoice {\n            get {\n                return ResourceManager.GetString(\"EVEMonUserVoice\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /eve/ExternalEveNotificationTextParser.cs.\n        /// </summary>\n        public static string ExternalEveNotificationTextParser {\n            get {\n                return ResourceManager.GetString(\"ExternalEveNotificationTextParser\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://forums.eveonline.com/t/evemon-4-0-beta-under-new-ownership-conversion-for-esi/75953.\n        /// </summary>\n        public static string ForumThreadBase {\n            get {\n                return ResourceManager.GetString(\"ForumThreadBase\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://market.fuzzwork.co.uk/aggregates/?region=10000002&amp;types=.\n        /// </summary>\n        public static string FuzzworksMarketUrl {\n            get {\n                return ResourceManager.GetString(\"FuzzworksMarketUrl\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://raw.githubusercontent.com/peterhaneve/evemon/main.\n        /// </summary>\n        public static string GitHubBase {\n            get {\n                return ResourceManager.GetString(\"GitHubBase\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://github.com/peterhaneve/evemon/releases.\n        /// </summary>\n        public static string GitHubDownloadsBase {\n            get {\n                return ResourceManager.GetString(\"GitHubDownloadsBase\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to 0.pool.ntp.org.\n        /// </summary>\n        public static string GlobalNTPPool {\n            get {\n                return ResourceManager.GetString(\"GlobalNTPPool\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://ssl.google-analytics.com/collect.\n        /// </summary>\n        public static string GoogleAnalyticsUrl {\n            get {\n                return ResourceManager.GetString(\"GoogleAnalyticsUrl\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://www.google.com/search?q=google%20calendar%20get%20calendar%20id.\n        /// </summary>\n        public static string GoogleCalendarSetup {\n            get {\n                return ResourceManager.GetString(\"GoogleCalendarSetup\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://stop.hammerti.me.uk/api/citadel/{0:D}.\n        /// </summary>\n        public static string HammertimeCitadel {\n            get {\n                return ResourceManager.GetString(\"HammertimeCitadel\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /bitmaps/character/level.\n        /// </summary>\n        public static string MyEVELevelImage {\n            get {\n                return ResourceManager.GetString(\"MyEVELevelImage\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to tcp://time.nist.gov:13.\n        /// </summary>\n        public static string NISTTimeServer {\n            get {\n                return ResourceManager.GetString(\"NISTTimeServer\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /eve/NotificationRefTypes.xml.\n        /// </summary>\n        public static string NotificationRefTypes {\n            get {\n                return ResourceManager.GetString(\"NotificationRefTypes\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://o.smium.org.\n        /// </summary>\n        public static string OsmiumBaseUrl {\n            get {\n                return ResourceManager.GetString(\"OsmiumBaseUrl\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /api/convert/{0}/eft.\n        /// </summary>\n        public static string OsmiumLoadoutDetails {\n            get {\n                return ResourceManager.GetString(\"OsmiumLoadoutDetails\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /api/json/loadout/query/{0}?limit=50&amp;sortby=creationdate.\n        /// </summary>\n        public static string OsmiumLoadoutFeed {\n            get {\n                return ResourceManager.GetString(\"OsmiumLoadoutFeed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to /loadout/{0}.\n        /// </summary>\n        public static string OsmiumLoadoutTopic {\n            get {\n                return ResourceManager.GetString(\"OsmiumLoadoutTopic\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to grant_type=authorization_code&amp;code={0}&amp;client_id={1}&amp;code_verifier={2}.\n        /// </summary>\n        public static string PostDataAuthPKCE {\n            get {\n                return ResourceManager.GetString(\"PostDataAuthPKCE\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to grant_type=authorization_code&amp;code={0}.\n        /// </summary>\n        public static string PostDataAuthToken {\n            get {\n                return ResourceManager.GetString(\"PostDataAuthToken\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to grant_type=refresh_token&amp;client_id={1}&amp;refresh_token={0}.\n        /// </summary>\n        public static string PostDataRefreshPKCE {\n            get {\n                return ResourceManager.GetString(\"PostDataRefreshPKCE\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to grant_type=refresh_token&amp;refresh_token={0}.\n        /// </summary>\n        public static string PostDataRefreshToken {\n            get {\n                return ResourceManager.GetString(\"PostDataRefreshToken\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://login.eveonline.com/oauth/.\n        /// </summary>\n        public static string SSOBase {\n            get {\n                return ResourceManager.GetString(\"SSOBase\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://login.eveonline.com/v2/oauth/.\n        /// </summary>\n        public static string SSOBaseV2 {\n            get {\n                return ResourceManager.GetString(\"SSOBaseV2\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to verify.\n        /// </summary>\n        public static string SSOCharID {\n            get {\n                return ResourceManager.GetString(\"SSOCharID\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to 05153596dde44fd8b0d60c0ad3b90c24.\n        /// </summary>\n        public static string SSODefaultAppID {\n            get {\n                return ResourceManager.GetString(\"SSODefaultAppID\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to authorize/?response_type=code&amp;redirect_uri={0}&amp;client_id={3}&amp;scope={2}&amp;state={1}.\n        /// </summary>\n        public static string SSOLogin {\n            get {\n                return ResourceManager.GetString(\"SSOLogin\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to authorize/?response_type=code&amp;redirect_uri={0}&amp;client_id={3}&amp;scope={2}&amp;state={1}&amp;code_challenge_method=S256&amp;code_challenge={4}.\n        /// </summary>\n        public static string SSOLoginPKCE {\n            get {\n                return ResourceManager.GetString(\"SSOLoginPKCE\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to http://localhost:{0:D}/callback.\n        /// </summary>\n        public static string SSORedirect {\n            get {\n                return ResourceManager.GetString(\"SSORedirect\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to esi-wallet.read_character_wallet.v1 esi-calendar.read_calendar_events.v1 esi-location.read_location.v1 esi-location.read_ship_type.v1 esi-mail.read_mail.v1 esi-skills.read_skills.v1 esi-skills.read_skillqueue.v1 esi-clones.read_clones.v1 esi-characters.read_contacts.v1 esi-universe.read_structures.v1 esi-killmails.read_killmails.v1 esi-assets.read_assets.v1 esi-planets.manage_planets.v1 esi-markets.structure_markets.v1 esi-corporations.read_structures.v1 esi-characters.read_loyalty.v1 esi-characters.read_me [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string SSOScopes {\n            get {\n                return ResourceManager.GetString(\"SSOScopes\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to token.\n        /// </summary>\n        public static string SSOToken {\n            get {\n                return ResourceManager.GetString(\"SSOToken\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/ApiErrorTroubleshooter.Designer.cs",
    "content": "﻿namespace EVEMon.Common.Controls\n{\n    partial class ApiErrorTroubleshooter\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.SuspendLayout();\n            // \n            // ApiErrorTroubleshooter\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Name = \"ApiErrorTroubleshooter\";\n            this.Size = new System.Drawing.Size(395, 117);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/ApiErrorTroubleshooter.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Controls\n{\n    public partial class ApiErrorTroubleshooter : UserControl\n    {\n        /// <summary>\n        /// Occurs when a resolution has been completed.\n        /// </summary>\n        public event EventHandler<ApiErrorTroubleshooterEventArgs> ErrorResolved;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ApiErrorTroubleshooter\"/> class.\n        /// </summary>\n        protected ApiErrorTroubleshooter()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Called when the error is unresolved.\n        /// </summary>\n        protected void OnErrorUnresolved()\n        {\n            ErrorResolved?.ThreadSafeInvoke(null, new ApiErrorTroubleshooterEventArgs());\n        }\n\n        /// <summary>\n        /// Called when the error is resolved.\n        /// </summary>\n        /// <param name=\"action\">The action.</param>\n        protected void OnErrorResolved(ResolutionAction action)\n        {\n            ErrorResolved?.ThreadSafeInvoke(null, new ApiErrorTroubleshooterEventArgs(action));\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/ApiErrorTroubleshooter.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Controls/AutoEllipsisToolStripRenderer.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// Renders the text of a ToolStripLabel with an Ellipsis if it\n    /// overflows the available space.\n    /// </summary>\n    /// <remarks>\n    /// For this render to work correctly the ToolStripStatusLabel\n    /// Spring property should be set to True, set the TextAlign\n    /// property to MiddleLeft to approximate the functionality of the\n    /// standard ToolStripStatusLabel.\n    /// \n    /// This class was adapted from the code on Joel on Software:\n    ///   http://discuss.joelonsoftware.com/default.asp?dotnet.12.597246.5\n    /// </remarks>\n    public class AutoEllipsisToolStripRenderer : ToolStripSystemRenderer\n    {\n        protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)\n        {\n            ToolStripStatusLabel label = e.Item as ToolStripStatusLabel;\n\n            // It's not a label, panic, wait no; just let the SystemRenderer do it's thing\n            if (label == null)\n            {\n                base.OnRenderItemText(e);\n                return;\n            }\n\n            // If we are rendering a link we don't support AutoEllipsie\n            if (label.IsLink)\n            {\n                base.OnRenderItemText(e);\n                return;\n            }\n\n            TextRenderer.DrawText(e.Graphics, label.Text, label.Font, e.TextRectangle, label.ForeColor,\n                                  TextFormatFlags.EndEllipsis);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/BorderPanel.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// This control draws a border around its children.\n    /// Unfortunately, you need to adjust the padding and such to prevents the top and left lines to be hidden by your controls.\n    /// There is probably some way to change the client rectangle area but I didn't find it.\n    /// Did I mention I hate winforms very much ?\n    /// </summary>\n    public sealed class BorderPanel : Panel\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public BorderPanel()\n        {\n            DoubleBuffered = true;\n            BackColor = SystemColors.Window;\n            Padding = new Padding(0);\n            Margin = new Padding(0);\n            SetStyle(ControlStyles.OptimizedDoubleBuffer |\n                     ControlStyles.ContainerControl |\n                     ControlStyles.DoubleBuffer |\n                     ControlStyles.UserPaint |\n                     ControlStyles.ResizeRedraw |\n                     ControlStyles.AllPaintingInWmPaint, true);\n            UpdateStyles();\n        }\n\n        /// <summary>\n        /// Paints the border.\n        /// </summary>\n        /// <param name=\"pe\"></param>\n        protected override void OnPaint(PaintEventArgs pe)\n        {\n            base.OnPaint(pe);\n\n            Rectangle rect = ClientRectangle;\n            rect.Inflate(-1, -1);\n\n            using (Pen pen = new Pen(Color.Gray, 1.0f))\n            {\n                pe.Graphics.DrawRectangle(pen, rect);\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/CharacterPortrait.Designer.cs",
    "content": "﻿namespace EVEMon.Common.Controls\n{\n    partial class CharacterPortrait\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterPortrait));\n            this.pictureBox = new System.Windows.Forms.PictureBox();\n            this.cmsPictureOptions = new System.Windows.Forms.ContextMenuStrip(this.components);\n            this.updatePicture = new System.Windows.Forms.ToolStripMenuItem();\n            this.updatePictureFromEVECache = new System.Windows.Forms.ToolStripMenuItem();\n            this.setEVEFolder = new System.Windows.Forms.ToolStripMenuItem();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();\n            this.cmsPictureOptions.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // pictureBox\n            // \n            this.pictureBox.ContextMenuStrip = this.cmsPictureOptions;\n            this.pictureBox.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pictureBox.InitialImage = ((System.Drawing.Image)(resources.GetObject(\"pictureBox.InitialImage\")));\n            this.pictureBox.Location = new System.Drawing.Point(0, 0);\n            this.pictureBox.Name = \"pictureBox\";\n            this.pictureBox.Size = new System.Drawing.Size(256, 256);\n            this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;\n            this.pictureBox.TabIndex = 0;\n            this.pictureBox.TabStop = false;\n            this.pictureBox.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseDown);\n            this.pictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseMove);\n            // \n            // cmsPictureOptions\n            // \n            this.cmsPictureOptions.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.updatePicture,\n            this.updatePictureFromEVECache,\n            this.setEVEFolder});\n            this.cmsPictureOptions.Name = \"contextMenuStrip1\";\n            this.cmsPictureOptions.Size = new System.Drawing.Size(244, 70);\n            // \n            // updatePicture\n            // \n            this.updatePicture.Name = \"updatePicture\";\n            this.updatePicture.Size = new System.Drawing.Size(243, 22);\n            this.updatePicture.Text = \"Update Portrait From The Web\";\n            this.updatePicture.Click += new System.EventHandler(this.miUpdatePicture_Click);\n            // \n            // updatePictureFromEVECache\n            // \n            this.updatePictureFromEVECache.Name = \"updatePictureFromEVECache\";\n            this.updatePictureFromEVECache.Size = new System.Drawing.Size(243, 22);\n            this.updatePictureFromEVECache.Text = \"Update Portrait From EVE Cache\";\n            this.updatePictureFromEVECache.Click += new System.EventHandler(this.miUpdatePictureFromEVECache_Click);\n            // \n            // setEVEFolder\n            // \n            this.setEVEFolder.Name = \"setEVEFolder\";\n            this.setEVEFolder.Size = new System.Drawing.Size(243, 22);\n            this.setEVEFolder.Text = \"Set Portrait Folder\";\n            this.setEVEFolder.Click += new System.EventHandler(this.miSetEVEFolder_Click);\n            // \n            // CharacterPortrait\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.pictureBox);\n            this.Name = \"CharacterPortrait\";\n            this.Size = new System.Drawing.Size(256, 256);\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();\n            this.cmsPictureOptions.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n        #endregion\n\n        private System.Windows.Forms.ToolStripMenuItem updatePicture;\n        private System.Windows.Forms.ToolStripMenuItem updatePictureFromEVECache;\n        private System.Windows.Forms.ToolStripMenuItem setEVEFolder;\n        private System.Windows.Forms.ContextMenuStrip cmsPictureOptions;\n        private System.Windows.Forms.PictureBox pictureBox;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/CharacterPortrait.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Service;\n\nnamespace EVEMon.Common.Controls\n{\n    public partial class CharacterPortrait : UserControl\n    {\n        private Character m_character;\n        private bool m_updatingPortrait;\n        private bool m_pendingUpdate;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public CharacterPortrait()\n        {\n            InitializeComponent();\n            pictureBox.Image = pictureBox.InitialImage;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// When the control is made visible, we check for a pending update.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            // If we previously delayed an update, we do it now.\n            if (Visible && m_pendingUpdate)\n                UpdateContent();\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the character.\n        /// </summary>\n        [Browsable(false)]\n        public Character Character\n        {\n            get { return m_character; }\n            set\n            {\n                if (value == null || m_character == value)\n                    return;\n\n                m_character = value;\n                UpdateContent();\n            }\n        }\n\n        #endregion\n\n\n        #region Default mechanism on character change (portraits cache, then ImageService for CCP url)\n\n        /// <summary>\n        /// Update the portrait.\n        /// <list type=\"bullet\">\n        /// <item>We check for a cached portrait in %APPDATA%\\cache\\portraits.</item>\n        /// <item>It if failed, we assemble the url for a CCP download and give it to ImageService.</item>\n        /// <item>ImageService will first check its cache (%APPDATA%\\cache),\n        /// then download the url if no image was found in cache.</item>\n        /// </list>\n        /// </summary>\n        /// <remarks>Note this method will first check the ImageService cache before to resort to download.</remarks>\n        private void UpdateContent()\n        {\n            if (!Visible)\n            {\n                m_pendingUpdate = true;\n                return;\n            }\n            m_pendingUpdate = false;\n\n            // In safe mode, doesn't bother with the character portrait\n            if (Settings.UI.SafeForWork)\n                return;\n\n            if (m_character == null)\n                return;\n\n            // Try to retrieve the portrait from our portrait cache (%APPDATA%\\cache\\portraits)\n            var image = ImageService.GetImageFromCache($\"{m_character.Guid}.png\",\n                EveMonClient.EVEMonPortraitCacheDir);\n            if (image != null)\n            {\n                pictureBox.Image = image;\n            }\n            else\n            {\n                // The image does not exist in cache, we try to retrieve it from CCP\n                pictureBox.Image = pictureBox.InitialImage;\n                UpdateCharacterImageFromCCPAsync().ConfigureAwait(false);\n            }\n        }\n\n        /// <summary>\n        /// Download the image from CCP...\n        /// <list type=\"bullet\">\n        /// <item>We assemble the url for a CCP download and give it to ImageService.</item>\n        /// <item>ImageService will first check its cache (%APPDATA%\\cache),\n        /// then download the url if no image was found in cache.</item>\n        /// </list>\n        /// </summary>\n        private async Task UpdateCharacterImageFromCCPAsync()\n        {\n            if (m_updatingPortrait)\n                return;\n\n            // Skip if it's a blank character\n            if (m_character.CharacterID == UriCharacter.BlankCharacterID)\n                return;\n\n            pictureBox.Cursor = Cursors.WaitCursor;\n\n            m_updatingPortrait = true;\n\n            Image image = await ImageService.GetCharacterImageAsync(m_character.CharacterID);\n\n            pictureBox.Cursor = CustomCursors.ContextMenu;\n\n            // Release the updating flag\n            m_updatingPortrait = false;\n\n            if (image == null)\n                return;\n\n            // Update the portrait\n            pictureBox.Image = image;\n\n            // The image was retrieved, we save it to the cache\n            await SaveCharacterImageToCacheAsync(image);\n        }\n\n        /// <summary>\n        /// Save the specified image to the EVEMon cache as this character's portrait.\n        /// </summary>\n        /// <param name=\"image\">The portrait image.</param>\n        private Task SaveCharacterImageToCacheAsync(Image image)\n        {\n            if (m_character == null)\n                return Task.CompletedTask;\n\n            // Save to the portraits cache\n            return ImageService\n                .AddImageToCacheAsync(image, $\"{m_character.Guid}.png\", EveMonClient.EVEMonPortraitCacheDir);\n        }\n\n        #endregion\n\n\n        #region Mechanisms related to the game folder\n\n        /// <summary>\n        /// Download the image from the EVE cache (in EVE Online client installation folder).\n        /// </summary>\n        private Task UpdateCharacterFromEVECacheAsync()\n        {\n            m_updatingPortrait = true;\n\n            // If we don't have the game's portraits cache already, prompt the user\n            // Return if the user canceled\n            if (!EveMonClient.DefaultEvePortraitCacheFolders.Any() ||\n                EveMonClient.EvePortraitCacheFolders == null ||\n                !EveMonClient.EvePortraitCacheFolders.Any())\n            {\n                if (!ChangeEVEPortraitCache() || EveMonClient.EvePortraitCacheFolders == null)\n                {\n                    m_updatingPortrait = false;\n                    return Task.CompletedTask;\n                }\n            }\n\n            // Now, search in the game folder all matching files \n            // (different resolutions are available for every character)\n            // Retrieve all files in the EVE cache directory which matches \"<characterId>*\"\n            List<FileInfo> filesInEveCache = new List<FileInfo>();\n            List<FileInfo> imageFilesInEveCache = new List<FileInfo>();\n            foreach (DirectoryInfo di in EveMonClient.EvePortraitCacheFolders\n                .Select(evePortraitCacheFolder => new DirectoryInfo(evePortraitCacheFolder))\n                .Where(directory => directory.Exists))\n            {\n                filesInEveCache.AddRange(di.GetFiles($\"{m_character.CharacterID}*\"));\n\n                // Look up for an image file and add it to the list\n                // Note by Jimi : CCP changed image format in Incursion 1.1.0\n                // as part of new character portraits creator,\n                // so I added an image file check method to provide compatibility\n                // with all image formats\n                imageFilesInEveCache.AddRange(filesInEveCache.Where(IsImageFile));\n            }\n\n            // Displays an error message if none found\n            if (!imageFilesInEveCache.Any())\n            {\n                StringBuilder message = new StringBuilder();\n\n                message.AppendLine(\"No portraits for your character were found in the folder you selected.\");\n                message.AppendLine().AppendLine(\"Ensure that you have checked the following:\");\n                message.AppendLine(\" - You have logged into EVE with that characters' account.\");\n                message.AppendLine(\" - You have selected a folder that contains EVE Portraits.\");\n\n                if (EveMonClient.DefaultEvePortraitCacheFolders.Any())\n                {\n                    message.AppendLine(\"Your default EVE Portrait directory is:\");\n                    message.Append(EveMonClient.DefaultEvePortraitCacheFolders.First());\n                }\n\n                MessageBox.Show(message.ToString(), @\"Portrait Error\", MessageBoxButtons.OK,\n                    MessageBoxIcon.Exclamation);\n\n                m_updatingPortrait = false;\n                return Task.CompletedTask;\n            }\n\n            // Search for the largest portrait\n            int bestSize = 0;\n            string bestFile = string.Empty;\n            int charIDLength = m_character.CharacterID.ToString(CultureConstants.\n                InvariantCulture).Length;\n            foreach (FileInfo file in imageFilesInEveCache)\n            {\n                int sizeLength = file.Name.Length - (file.Extension.Length + 1) - charIDLength,\n                    imageSize;\n                if (file.Name.Substring(charIDLength + 1, sizeLength).TryParseInv(out\n                    imageSize) && imageSize > bestSize)\n                {\n                    bestFile = file.FullName;\n                    bestSize = imageSize;\n                }\n            }\n\n            // Open the largest image and save it\n            Image image = Image.FromFile(bestFile);\n\n            // Release the updating flag\n            m_updatingPortrait = false;\n\n            // Update the portrait\n            pictureBox.Image = image;\n\n            return SaveCharacterImageToCacheAsync(image);\n        }\n\n        /// <summary>\n        /// Determines whether the specified file is an image file.\n        /// </summary>\n        /// <param name=\"file\">The file.</param>\n        /// <returns>\n        /// \t<c>true</c> if the specified file is an image file; otherwise, <c>false</c>.\n        /// </returns>\n        private static bool IsImageFile(FileInfo file)\n        {\n            try\n            {\n                Image.FromFile(file.FullName);\n                return true;\n            }\n            catch (OutOfMemoryException)\n            {\n                return false;\n            }\n            catch (FileNotFoundException)\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Pops up a window for the user to select their EVE portrait cache folder.\n        /// </summary>\n        private static bool ChangeEVEPortraitCache()\n        {\n            using (EveFolderWindow folderWindow = new EveFolderWindow())\n            {\n                if (folderWindow.ShowDialog() != DialogResult.OK)\n                    return false;\n\n                EveMonClient.EvePortraitCacheFolders = folderWindow.SpecifiedEVEPortraitCacheFolder;\n                return true;\n            }\n        }\n\n        #endregion\n\n\n        #region Controls and global events handler\n\n        /// <summary>\n        /// Handles the Click event of the miUpdatePicture control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private async void miUpdatePicture_Click(object sender, EventArgs e)\n        {\n            await UpdateCharacterImageFromCCPAsync();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the miUpdatePictureFromEVECache control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private async void miUpdatePictureFromEVECache_Click(object sender, EventArgs e)\n        {\n            await UpdateCharacterFromEVECacheAsync();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the miSetEVEFolder control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void miSetEVEFolder_Click(object sender, EventArgs e)\n        {\n            ChangeEVEPortraitCache();\n        }\n\n        /// <summary>\n        /// Handles the MouseDown event of the pictureBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void pictureBox_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (m_updatingPortrait)\n                return;\n\n            pictureBox.Cursor = Cursors.Default;\n\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            cmsPictureOptions.Show(MousePosition);\n        }\n\n        /// <summary>\n        /// Handles the MouseMove event of the pictureBox control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void pictureBox_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n                return;\n\n            pictureBox.Cursor = CustomCursors.ContextMenu;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/CharacterPortrait.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"cmsPictureOptions.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"pictureBox.InitialImage\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYG\n        BwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoK\n        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAEAAQADASIAAhEBAxEB/8QA\n        HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh\n        MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW\n        V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG\n        x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF\n        BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV\n        YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE\n        hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq\n        8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8y6csbMcYqRYlU5p6qWOBQAwQhfvLTkj67F+tSJAxGSP1qZIF\n        xgLmgCEW7t0NSC3C9amEO73qVIAM5GPxoAhEGP8AlnTvIJ6irAtiOqZqUW5brQBWW3PYYp3kA9BVpLfr\n        8v609Lfr8maAKv2f/pnT/IH92rYtgP4ad9kPoKAKf2Q+gp32f/Z/Wrv2VR1zSi3RehoAo/Z/9n9aUW2f\n        4f1q95APQUohx1TNAFD7IPQ0G2x/D+tX/KH/ADzFBhz0TFAGf9n/ANn9aPs/+z+tX/IA6ikNujdTQBn/\n        AGQ+gpPIH92tD7Kp6Zpn2Q+goAz/ALP/ANM6Z5AHUVoG2A6JmmPb/wCxigDPMDHqP1pgg98VoPb/AOz+\n        tMNtt6igDP8As/8A0zqJ4Aegz+NaBtieiYqN4Aegz+NAGe8Dp2zTHj/vr9M1eMO32qN4FxgrigCkIcfd\n        pjRspxirTwMBkD9aYUx99aAHxwN94ip4oUAxipltwTjrUscALcCgCFICTgipkgBzhc1MkBOcjP41Mlvk\n        4K0AQi23dBT0t+vy/rVlLfIzt/WpkgXGAuaAKy22442VKlqBndVpbd2x71KlooOTQBUSAHOFzT0gIzhc\n        Ve+zKvQVItuewxQBRFozdaeLPPY1fNsx6g1W1rUtH8NabJq2uX0cEEY5dz1PoB1JPoKAGfZV/vfpVDXf\n        Evhjwym7XNXggOMiMtlz9FGSa8z8bfHnWdXd7HwmjWFryPPJBmkHr6J+HPvXAzTTXErT3EzySOcu8jZL\n        H1JPJoA9a1f9oLw3auV0fRLq6I6PIwiU/wAz+grFn/aG15nzb+H7NV9Hd2P55Fee0UAei2n7Q+qxnF54\n        ZtpFzyIpmQ/mQ1b+j/HnwbfFY9UtrmyY9WZBIn5rz+leN0UAfSulalo2u232zSb6G6i/vwyA4+vp+NWf\n        siHtivmnTNW1TRbsX2k6hNbSr0khcqfpx1HtXp/gH4/LO8el+Oo1U8BdQiTA/wCBqOn1H5d6APRPsq/3\n        v0phs8djWjCttdQpcwMskciho5EYEMD3BHUUNaA9BigDLNo47/pUbwE9VzWqYGXoKY1ue4zQBlGEHquK\n        je09BWo0C9xUT2nOdpoAy2ttpxsqF7f/AGf1rVa3dc+1QvAuMFcUAZpttvUVCYCnXjNaTW20Z21C9v8A\n        7GKAM5rcA46VA8C4wVxWk9v/ALP61DJAA3IoAmS3yM7f1qZLfJwVqaK2wQdvWp4oVHyhc0ARR2oHzH+V\n        TRxkfKFqeG1J+YjNWY7ZR8o5oArRWjN8x/lU6QLjAGasR2hblqnjtgRjHSgCtHCQMqOtSi0A6jNW47Uk\n        g4qZLTrkUAU0tOuRUotCeoxV1LXrlalFkzdFzQBi65qemeGtHuNc1eYRW9vHukbHJ9AB3JOAB7185/EH\n        4g6v8QNYa/vGMdtGSLO0VvliX+rHuf6V2n7TXjeS/wBdj8DWE/8Ao9hiS8Cnh5iMgfRVI/EmvLKACiii\n        gAooooAKKKKACiiigDvPg58XJ/Bt/HoWvXDPpMz4y2SbZifvD/Z9R+Ir3wQxyoskLBkYAqynIIIyCPwr\n        5Hr3r9mfx02v6HL4M1ObN1pqbrYseXgJ6f8AAScfQr6UAd69r6gVF9lP901rva+oNRPaFDgrQBkvaegq\n        F7Uk5ArYe19FqF7Uk5xQBkNbkDLDNQyWyt14rXktcdulV5IOSNtAGTJakfMP5VBLCp+UritZ7YjkDFQS\n        wg/KRigDKltsfNtqCS3H3dlas1oVJIP6VXlhU/KVxQBNFbsxyRVmKEKQAM1NFbbgBirEVttIGKAIobZi\n        cmrEVtgcDrU0FqOOKsw22McUAQR2h29KnittoxszVmKzz8wH6VYjtf4cUAVYrbcMbanjtcdulW0sm+8/\n        4VPHaEEBUoApx2hPRetR6xc2+iaPd63e8Q2ds80p/wBlVLH+VbC2bMMnFcR+0nqB0L4P6mY32yXbRW6H\n        /ecbv/HQ1AHyxq+p3Wtarc6xetumup3mlPqzMSf51XoooAKKKKACiiigAooooAKKKKACuk+EXilvB/xF\n        0vWGk2w/aRFdAngxOdjE/TO76gVzdFAH24bOMdVxUZtSgyDS+BNRbxJ4I0jXXbc93psEsh/22jUsPzzW\n        i9oM5C4oAxpbUqMbP1qJ7Uk5ArZls9ozgVBJaAkgrQBjS220Y21XktTt5FbT2TfeT8arvaAkg8UAY01t\n        tBGKrz2/+zWzNaYzVaa2znigDGktiCdtV5bYMcMMVsS22TnFVprbcSMUASwQdPlq1Ba8Z21NDbYx8tWY\n        LU8cUARQ22cfLVqGAZwBmp4rQucmrUVtuAGKAK8dop+Zx9Ksx2vAGKtQ22MfLVmGzzjigCpFZlTirENr\n        /Dtq3Ha9CBVmO14AxQBTS1IGAK8f/bWujafDzTdPUf6/Vw7D1CxSf1YflXucdiB1GcV4L+3mzwaR4agZ\n        Th7i6fH+6sY/9moA+baKKKACiiigAooooAKKKKACiiigAooooA+y/wBm0vqHwQ8P3ONxFtJGTn+5M6j9\n        AK7R7XjGK5H9kqBJ/wBn3QGXqrXYbPr9qlP9a9De0bGQlAGHLaZ+WoJbPHyhf0rblswOg61BJa8EYoAw\n        5bNScharyWvBGK25LUEE4qtJa9QBQBiyW235lP6VUltgCQe9bc1pnNVZ7Uc8UAYs1tjPy1Vmts5+Wtqe\n        12A8daqT2oOcUASwwDOAM1dhtsY4qSC16bT+lXLa2x2oAijtTkZq3DbZxxUsFqOOKuQWo44oAhhtsY+W\n        rMFqeOKtQWhOMLmrMNmABkZoArQWmcbUqzFZqPmK5q3DZkgZWrMFoOMLQBSS3WGIySAIqglmZsAADJNf\n        Mn7bvi3wX440Xw5qng3xVYamlneXcNz9kuVcxswiIyAeAdhw3Q44Ne2ftW+IF8IfATX7xS3m3lutlDtJ\n        BzKwQ8/7pY/hivg6gAooooAKKKKACiiigAooooAKKKKACiiigD7P/ZC8ReFLb4MeHvCd14k05NVnW6kj\n        0xr1BcFTcSkHy87uRz06GvWZbME5C4r84NG1a/0HV7XXNLnMVzZ3CTQSKSCrqcg/mK/SvS3TWNHtdXhT\n        at3bJMoPYMob+tAGZLZqAQVzVaSxA+bH6VvS2e05xVae0HOVoAwp7QjOVxVWazxnit6azIBwtVJrMEHA\n        xQBhSWvUkVUntRzxW9NbZz8tU57Uc8UAYUtuVzgVUntd5PHStye1HPFU57Uc8UASwW/+zV2C1HHFPtrb\n        PartvbY6rQBHBajjirtvZk9VxUsFrnHFXILUccUAQwWo44q5BajjirEFrvA46VcgsSegoArw2ecVZgtD\n        xhatQ2YBGVq3DZkkZGKAPHP20/Dj6v8As465LCpMlk1vcqB/szoG/wDHWavguv1M8YeC7Pxt4N1XwdfK\n        BDqmnzWsjEZ2h0K5HuM5HuK/L/xDoOp+FtfvfDWtW5iu9Pu5La6iP8EiMVYfmDQBTooooAKKKKACiiig\n        AooooAKKKKACiiigB0EE11OltbRF5JGCoijJYk8ADua/ULwzoFxonhbTtGuFHmWlhDC208ZSNV49uK+D\n        P2NvhvJ8TP2g9C06S38y102b+0r7IyAkOGXI7gyeWv8AwOv0YksQCSooAwZrTGarTWZXIK1vT2mc7kqt\n        NZkE4GaAOfms85qrPajnit6e0Azhapz2o54oAwZ7Uc8VUntCc4XNbs9qOeKpz2o54oAwZ7Uc8VRuLbP8\n        NdBc2eaoT2p54oAfBa5IGOtaFvbY/hpbW14xir9ra9wKAGwWo44q5BajjipLe2x1Wr9tbY7UARwWp44q\n        5BanjipoLQHGVzV6Cy6f4UAV4LQDGFxVyC1PHFWYbPOKtwWR4wM0AVYbPGOK/PP/AIKAeDLrwl+0xq94\n        9oYrbWba2vrQheHBiVHOfXzUkr9IYbMADK5rzP8Aan/ZO0H9pnwhb2El+NN1rTHZ9K1MQ7wobG6KQZBK\n        NgdDlSARnkMAfmBRXV/G34Sa58DPidqfwt8R39tdXemGHzLiz3eXIJIUlUruAPRwDx1BrlKACiiigAoo\n        ooAKKKKACiiigAoor0j9nD9l74g/tO67faP4GvtNtU0yOKS/udSmdVRXYgbQiMWb5W446daAPf8A/glR\n        4PEln4w8bz2WWMtpZW1wR2AeSVQce8RP0FfXEtnkEYxWZ8C/gR4c+AfwzsPhx4ePnC3Bkvb1kCtd3DY3\n        ykDpnAAHZVUZOM11M9iewoA5+azxmqs9l7Vvz2p54qpNZ5zQBgT2gOcrmqc1njPFdBPZdf8ACqM9qeeK\n        AOfuLPHaqU9qOeK6G4swei4qhPajnigDAurXtiqNxZ57Vv3FtnotULm2z2oAW1te4FaNtbY7UlvbZ6rW\n        ja2vOMUAJbW2CBt61oWtr3Apba2yAAOlX4LUccUAMgtTxxV+C1HHFSW9tj+Gr8FqOOKAIILUccVegsT3\n        FT29njnHPrV2C1PHFAFaGyxjalW4bNWxkVagtTxxVuGzLYwKAPzW/wCCqvhM6B+0nba4kfyaz4btp2fH\n        WRHkiI/BUQ/iK+aK+8v+Cx3gGVvDfgr4kQQ4S2vLrTbmQL3lVZYh+HlS/nXwbQAUUUUAFFFFABRRRQAU\n        UUUAFfe//BH7webf4ceMfGzRY+361b2Svjr5ERc4/G4/lXwRX6rf8E1PALeEP2QPDtzc2+yfWprnUpRj\n        GRJKyoffMaRn8aAPXprPGeKqz2QGcDFb81njNVZ7L2oAwJ7TGdyVTuLMjoua6Ge1PPFU57U88UAc7Paj\n        niqdzZ5robizB6LiqFzaZoA56e1PPFUbm2z2roJ7U88VQuLbHRaAOeubPLEY6Vn3Vr2Arobq1yDkVnXV\n        vgkbaACztsHG3rWjaWvQYptnbYx8vWtG1tcDGKAH2tr3ArQt7bP8NJa2vOMVpWtrk4xQAltZ5rQtbXgc\n        UttbZAwvHr61o2tr3AoAjgtTxxV62tMVLa2vYir0FoTjC5oAhgtRxxVuGzJIyuKs29njtVuCxHcUAePf\n        tq/Au6+O/wCzR4k8DaNYefqsdsL7R4wPma5gPmKi+7qHj/7aV+PM0MtvM9vPEySRsVkR1wVYdQR2PtX7\n        5Q2eMcV+Vf8AwVx+Hng/4f8A7WPmeENLhtP7d8OW+qanHApVWu3nuI3fHQFhEjHHUkk8k0AfL9FFFABR\n        RRQAUUUUAFFFFAGl4O8Ja9498Wab4J8L2L3Oo6rex2tlAikl5HYKvToMnk9hzX7f+BfAmnfD/wACaN4D\n        0gf6Loul29jbnGMpFGqA/wDjufqTXxf/AMEU/gt4F1zTfE3xt1bRUu9e0vUl07TLicZFnG0O6R0HZ23b\n        Sx5AGBgM2fvya0zmgDBntOu5P1qrNZkE4XNb89qOeKpzWYJOFoAwJrPGapT2XX/Cugms854qlc2ZxyuK\n        AOfntTzxVC4tRgjFdDPanniqE9qOeKAOcurXk8VQurXtiuhurXg8VnXNttJGKAOeubbAIC9azrm2zkFa\n        6G5tskjb0rNubbcCNtAEdrb9DtrTtrbHaorK3yM7a07S36NtoAltbXkcVpWtrwOKZa2nRcVp21tkAbel\n        ADrW17gVoW9tnqtJa2uTjFaVra+3y0AJbWefpV+3s89qfBanjir8FqOOKAGQWp44q5BanjipoLU8cVct\n        7YjgLmgCCGzJAytfkr/wV78SRa5+2rqulRvu/sXRNPs256Exefj/AMjiv1i+IHjvwN8JPBl98QfiP4jt\n        tK0fTYDLd3t0+FUDooHVmJ4VVBZiQACa/DD9oX4rz/HP44eKfi3PC8Y17WprqCGQ5aKAtiKM+6xhF/Cg\n        DjqKKKACiiigAooooAKKKKAP0b/4ISeI7a98LfEPwW8uJra/0+9RCeWWVJo2I+hiXP8AvCvvae0wMMlf\n        i7+wF+1qP2P/AI7ReOdYsZ7zQNTs20/xDa22DIIGdXE0YJALoyggHGVLLkbsj9l/ht8Sfh38ZvBtr8QP\n        hd4tsta0i9TMN3ZS5APdHU/NG4zyjAMO4FADprMgHC1UntTzxW9NZgg4XFU57Q85WgDBntTzxVCe1HPF\n        dBc22O1UZ7Uc8UAc9dWuztWddWvYCuiubbHas66tdnAHHYUAc9dW/P3azru16jFdDdWuDjFZl5bYGNtA\n        HPXVvzjbWZdW/P3a6K7t8Z+XpWXe2/8AFtoAhsrf+HbWrZW/crVWzhIAAXrWtZ2ynGB0oAsWtv0O2tK1\n        t+cbahtbfodtalpbYGdvWgCW0tegxWnbW2e1RWlv0XbXPfEX9oD4FfBiFpPij8VdE0eRVz9lub5TcMMZ\n        +WFcyN+CmgDt7W17gVoW9tn+Gvi/4rf8FoPgT4TElh8JPA+seKblchLq6P8AZ9ofQ5cNKR3wY1+tfLHx\n        q/4Kn/tb/GBJdN07xhD4S0yTI+xeFojBJt7ZuGLSg467WUH0oA/UT4x/tSfs9fs825f4u/FPS9LnCbk0\n        0Sma8kHbbbxBpCD/AHtu31Ir5I+N/wDwXI0SzWbSP2dfhPNdyYKprXil/Ljz6rbxMWcHggmRD6jtX503\n        t9faneS6jqV5LcXE7l5p5pCzyMeSzEkkk+tRUAd/8ef2ovjt+0tra6z8YviDd6osTlrTT+I7S1z/AM8o\n        UwiHHG7G49ya4CiigAooooAKKKKACiiigAooooAK7f4HftG/Gn9nDxP/AMJZ8G/H17o87lftVvGwe2u1\n        HRZoWykg9CwJHYg81xFFAH6afs6f8Fvvh/4ljt/D37THgmTw/enCtr2gxvcWTf7UkBJlhH+6ZfwHT7J+\n        HXxX+Ffxm0MeJfhT8QNJ8QWRALTaXepKYif4ZFB3Rt/ssAR6V+AVaHhnxZ4p8FaxF4h8HeJL/Sb+A5hv\n        dMvHgmjPs6EEfgaAP6BLm2xzis+6te2K/Jr4R/8ABXT9sT4ZrFY+IPE9h4vsY8DyfEdlulVfaeIpIW93\n        L/SvpX4Yf8Fuvgv4hEVj8XPhjrXh6dsB7vTZkv7dTxlm/wBXIo6nAV8dMnrQB9gXVvz92s28tsDG3rXJ\n        fDn9sT9lz4x+XF8P/jZoNzcS48uxurr7LcsfRYZwjsfotd5dQKRhRkEdaAOevLYjK7azbq36nbXQXltn\n        K7ay7yEEZ2dKAMC8tsjOOlZV5CRltldDeQ7edv61l3duMkEYoArWMefmcVoq1tZ273V3KkUUalpJHbAU\n        DqST0FfGPxz/AOCpml6LNN4e+AHhuPUJEJU6/q8bLBnpmKHhmHoXK8j7pFfKvxR/aG+NHxnuGl+I/wAQ\n        9R1GJm3CxM3l2yntiFNsY/LPAzmgD9KviP8At7fsr/Ccvbap8SYNWu4s/wCheHl+2OSOoLofLUjphnBr\n        wH4k/wDBZPW3Mlp8HfhDb268+Xf+I7lpG9j5MJUKR1/1jD6iviCigD1z4m/t2ftWfFgSW/iT4w6na2ku\n        Q1jorCxh2/3SIQpcf75avJZppbiVp55GeR2LO7tksT3J7mm0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUU\n        UAFFFFABRRRQAUUUUAFFFFABXdfDT9p39oT4PCOL4b/GHXtMgj+7ZJfNJbe2YJN0Z/Fa4WigD6++Gv8A\n        wWN+O/h/y7T4n+C9F8TQL9+4tlaxuW+rIGj/AAEYr6D+Gn/BU79l34itHZ+J73UfCd45ClNZtd8Bb0E0\n        W4Y93Ce+K/L6igD9stF8TeFfG2kprng/xFYarZSf6u7067SaJvoyEg1FfW/BG2vxs8C/Efx78MdYGv8A\n        w88Yajo14MZm067aLePRgDhx7HI9q+rvgD/wVX8Q2c0Hhv8AaH0VL+2JCf8ACQ6XbhJ4x/elhHyuO5Kb\n        SAPuseoB8b0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF\n        FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF\n        FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF\n        FFFABRRRQAUUUUAFFFFABRRRQB//2Q==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Controls/CheckedComboBox.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Drawing.Design;\nusing System.Text;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// Code based on Stelios Alexandrakis's CheckedComboBox, see :\n    /// http://www.codeproject.com/KB/combobox/checkedcombobox.aspx\n    /// License : http://www.codeproject.com/info/cpol10.aspx\n    /// </summary>\n    public class CheckedComboBox : CustomComboBox\n    {\n        #region CustomCheckedListBox\n\n        /// <summary>\n        /// A custom CheckedListBox being shown within the dropdown form representing the dropdown list of the CheckedComboBox.\n        /// </summary>\n        internal class CustomCheckedListBox : CheckedListBox\n        {\n            private int m_curSelIndex = -1;\n\n            public CustomCheckedListBox()\n            {\n                SelectionMode = SelectionMode.One;\n                HorizontalScrollbar = true;\n            }\n\n            /// <summary>\n            /// Intercepts the keyboard input, [Enter] confirms a selection and [Esc] cancels it.\n            /// </summary>\n            /// <param name=\"e\">The Key event arguments</param>\n            protected override void OnKeyDown(KeyEventArgs e)\n            {\n                base.OnKeyDown(e);\n\n                switch (e.KeyCode)\n                {\n                    case Keys.Enter:\n                    case Keys.Escape:\n                        // Enact selection.\n                        ((Dropdown)Parent).ForceDeactivate(new CustomComboBoxEventArgs(true));\n                        e.Handled = true;\n                        break;\n                    case Keys.Delete:\n                        // Delete unckecks all, [Shift + Delete] checks all.\n                        for (int i = 0; i < Items.Count; i++)\n                        {\n                            SetItemChecked(i, e.Shift);\n                        }\n                        e.Handled = true;\n                        break;\n                }\n            }\n\n            /// <summary>\n            /// When the mouse moves, we update the selection.\n            /// </summary>\n            /// <param name=\"e\"></param>\n            protected override void OnMouseMove(MouseEventArgs e)\n            {\n                base.OnMouseMove(e);\n                int index = IndexFromPoint(e.Location);\n                //Debug.WriteLine(\"Mouse over item: \" + (index >= 0 ? GetItemText(Items[index]) : \"None\"));\n                if ((index >= 0) && (index != m_curSelIndex))\n                {\n                    m_curSelIndex = index;\n                    SetSelected(index, true);\n                }\n            }\n        }\n\n        #endregion\n\n\n        // The content of the popup\n        private CustomCheckedListBox listBox;\n\n        /// <summary>\n        /// The valueSeparator character(s) between the ticked elements as they appear in the text portion of the CheckedComboBox.\n        /// </summary> \n        public string ValueSeparator { get; set; }\n\n        public bool CheckOnClick\n        {\n            get { return listBox.CheckOnClick; }\n            set { listBox.CheckOnClick = value; }\n        }\n\n        public new string DisplayMember\n        {\n            get { return listBox.DisplayMember; }\n            set { listBox.DisplayMember = value; }\n        }\n\n        public delegate string CheckedComboBoxTextBuilderDelegate(CheckedComboBox box);\n\n        public CheckedComboBoxTextBuilderDelegate CustomTextBuilder { get; set; }\n\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]\n        public string TextForAll { get; set; }\n\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]\n        public string TextForNone { get; set; }\n\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        [Editor(\n            \"System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\"\n            , typeof(UITypeEditor))]\n        public new CheckedListBox.ObjectCollection Items => listBox.Items;\n\n        public CheckedListBox.CheckedItemCollection CheckedItems => listBox.CheckedItems;\n\n        public CheckedListBox.CheckedIndexCollection CheckedIndices => listBox.CheckedIndices;\n\n        // Array holding the checked states of the items. This will be used to reverse any changes if user cancels selection.\n        private bool[] oldStates;\n        private string displayText;\n\n        // Event handler for when an item check state changes.\n        public event ItemCheckEventHandler ItemCheck;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        public CheckedComboBox()\n        {\n            // Default value separator.\n            TextForAll = \"All\";\n            TextForNone = \"None\";\n            ValueSeparator = \", \";\n            Cursor = Cursors.Default;\n            DropDownStyle = ComboBoxStyle.DropDownList;\n            DrawMode = DrawMode.OwnerDrawFixed;\n            DrawItem += CheckedComboBox_DrawItem;\n\n            // CheckOnClick style for the dropdown (NOTE: must be set after dropdown is created).\n            CheckOnClick = true;\n            listBox.ItemCheck += listBox_ItemCheck;\n            listBox.IntegralHeight = false;\n        }\n\n        /// <summary>\n        /// Create the popup's content\n        /// </summary>\n        /// <returns>The control to add to the popup</returns>\n        protected override Control CreateContent()\n        {\n            listBox = new CustomCheckedListBox();\n            listBox.BorderStyle = BorderStyle.None;\n            listBox.Dock = DockStyle.Fill;\n            listBox.FormattingEnabled = true;\n            listBox.Location = new Point(0, 0);\n            listBox.Name = \"listBox\";\n            listBox.Size = new Size(47, 15);\n            listBox.TabIndex = 0;\n            return listBox;\n        }\n\n        public override string GetTextValue()\n        {\n            if (listBox.CheckedItems.Count == 0)\n                return TextForNone;\n            if (listBox.CheckedItems.Count == listBox.Items.Count)\n                return TextForAll;\n\n            if (CustomTextBuilder != null)\n                return CustomTextBuilder(this);\n            else\n            {\n                StringBuilder sb = new StringBuilder(\"\");\n                for (int i = 0; i < listBox.CheckedItems.Count; i++)\n                {\n                    if (i != 0)\n                        sb.Append(ValueSeparator);\n                    sb.Append(listBox.GetItemText(listBox.CheckedItems[i]));\n                }\n                return sb.ToString();\n            }\n        }\n\n        protected override void OnDropDownDeactivated(bool validate)\n        {\n            // Perform the actual selection and display of checked items.\n            if (!validate)\n            {\n                // Caller cancelled selection - need to restore the checked items to their original state.\n                for (int i = 0; i < listBox.Items.Count; i++)\n                {\n                    SetItemChecked(i, oldStates[i]);\n                }\n            }\n            // Set the text portion equal to the string comprising all checked items (if any, otherwise empty!).\n            displayText = GetTextValue();\n        }\n\n        protected override void OnDropDownActivated()\n        {\n            // Make a copy of the checked state of each item, in cace caller cancels selection.\n            oldStates = new bool[Items.Count];\n            for (int i = 0; i < Items.Count; i++)\n            {\n                oldStates[i] = GetItemChecked(i);\n            }\n\n            FitDropDownToContent();\n        }\n\n        private void FitDropDownToContent()\n        {\n            Size preferedSize = listBox.GetPreferredSize(new Size(Width, 600));\n            int width = Math.Max(preferedSize.Width, Width);\n            int height = Math.Max(96, preferedSize.Height);\n            dropdown.MaximumSize = new Size(Width, height + 20);\n            dropdown.ClientSize = new Size(width, height);\n            listBox.Refresh();\n        }\n\n        public bool GetItemChecked(int index)\n        {\n            if (index < 0 || index > Items.Count)\n                throw new ArgumentOutOfRangeException(nameof(index), @\"value out of range\");\n            else\n                return listBox.GetItemChecked(index);\n        }\n\n        public void SetItemChecked(int index, bool isChecked)\n        {\n            if (index < 0 || index > Items.Count)\n                throw new ArgumentOutOfRangeException(nameof(index), @\"value out of range\");\n            else\n            {\n                listBox.SetItemChecked(index, isChecked);\n                // Need to update the Text.\n                displayText = GetTextValue();\n            }\n        }\n\n        public CheckState GetItemCheckState(int index)\n        {\n            if (index < 0 || index > Items.Count)\n                throw new ArgumentOutOfRangeException(nameof(index), @\"value out of range\");\n            else\n                return listBox.GetItemCheckState(index);\n        }\n\n        public void SetItemCheckState(int index, CheckState state)\n        {\n            if (index < 0 || index > Items.Count)\n                throw new ArgumentOutOfRangeException(nameof(index), @\"value out of range\");\n            else\n            {\n                listBox.SetItemCheckState(index, state);\n                // Need to update the Text.\n                displayText = GetTextValue();\n            }\n        }\n\n        private bool manuallyFired;\n\n        private void listBox_ItemCheck(object sender, ItemCheckEventArgs e)\n        {\n            if (!manuallyFired)\n            {\n                // Force the update of the checkeditems\n                try\n                {\n                    manuallyFired = true;\n                    SetItemCheckState(e.Index, e.NewValue);\n                }\n                finally\n                {\n                    manuallyFired = false;\n                }\n\n                // Update the combobox's text\n                displayText = GetTextValue();\n                Invalidate();\n\n                ItemCheck?.Invoke(sender, e);\n            }\n        }\n\n        /// <summary>\n        /// Draws the item that appears on the textbox\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void CheckedComboBox_DrawItem(object sender, DrawItemEventArgs e)\n        {\n            using (Brush backBrush = new SolidBrush(BackColor))\n            {\n                e.Graphics.FillRectangle(backBrush, e.Bounds);\n            }\n\n            if (displayText != null)\n            {\n                using (Brush foreBrush = new SolidBrush(ForeColor))\n                {\n                    const float offset = 3.0f;\n                    SizeF size = e.Graphics.MeasureString(displayText, Font);\n                    RectangleF rect = new RectangleF(offset, (Bounds.Height - size.Height) * 0.5f, e.Bounds.Width - offset,\n                                                     size.Height);\n                    e.Graphics.DrawString(displayText, Font, foreBrush, rect, StringFormat.GenericTypographic);\n                }\n            }\n\n            e.DrawFocusRectangle();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/ColumnSelectWindow.Designer.cs",
    "content": "namespace EVEMon.Common.Controls\n{\n    partial class ColumnSelectWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.clbColumns = new System.Windows.Forms.CheckedListBox();\n            this.SelectColumnLabel = new System.Windows.Forms.Label();\n            this.TipLabel = new System.Windows.Forms.Label();\n            this.btnOk = new System.Windows.Forms.Button();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnReset = new System.Windows.Forms.Button();\n            this.ColumnsPanel = new System.Windows.Forms.Panel();\n            this.ColumnsPanel.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // clbColumns\n            // \n            this.clbColumns.CheckOnClick = true;\n            this.clbColumns.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.clbColumns.FormattingEnabled = true;\n            this.clbColumns.IntegralHeight = false;\n            this.clbColumns.Location = new System.Drawing.Point(0, 0);\n            this.clbColumns.Name = \"clbColumns\";\n            this.clbColumns.Size = new System.Drawing.Size(295, 314);\n            this.clbColumns.TabIndex = 0;\n            this.clbColumns.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.clbColumns_ItemCheck);\n            // \n            // SelectColumnLabel\n            // \n            this.SelectColumnLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.SelectColumnLabel.AutoSize = true;\n            this.SelectColumnLabel.Location = new System.Drawing.Point(12, 9);\n            this.SelectColumnLabel.Name = \"SelectColumnLabel\";\n            this.SelectColumnLabel.Size = new System.Drawing.Size(199, 13);\n            this.SelectColumnLabel.TabIndex = 1;\n            this.SelectColumnLabel.Text = \"Select which columns you want to show:\";\n            // \n            // TipLabel\n            // \n            this.TipLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.TipLabel.Location = new System.Drawing.Point(9, 348);\n            this.TipLabel.Margin = new System.Windows.Forms.Padding(3, 6, 3, 6);\n            this.TipLabel.Name = \"TipLabel\";\n            this.TipLabel.Size = new System.Drawing.Size(287, 39);\n            this.TipLabel.TabIndex = 2;\n            this.TipLabel.Text = \"Tip: You can rearrange the order of the columns in the view by dragging the colum\" +\n    \"n headers.\";\n            // \n            // btnOk\n            // \n            this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOk.Location = new System.Drawing.Point(151, 396);\n            this.btnOk.Name = \"btnOk\";\n            this.btnOk.Size = new System.Drawing.Size(75, 23);\n            this.btnOk.TabIndex = 0;\n            this.btnOk.Text = \"OK\";\n            this.btnOk.UseVisualStyleBackColor = true;\n            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(232, 396);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 1;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // btnReset\n            // \n            this.btnReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnReset.Location = new System.Drawing.Point(46, 396);\n            this.btnReset.Name = \"btnReset\";\n            this.btnReset.Size = new System.Drawing.Size(99, 23);\n            this.btnReset.TabIndex = 3;\n            this.btnReset.Text = \"Reset To Default\";\n            this.btnReset.UseVisualStyleBackColor = true;\n            this.btnReset.Click += new System.EventHandler(this.btnReset_Click);\n            // \n            // ColumnsPanel\n            // \n            this.ColumnsPanel.Controls.Add(this.clbColumns);\n            this.ColumnsPanel.Location = new System.Drawing.Point(12, 25);\n            this.ColumnsPanel.Name = \"ColumnsPanel\";\n            this.ColumnsPanel.Size = new System.Drawing.Size(295, 314);\n            this.ColumnsPanel.TabIndex = 4;\n            // \n            // ColumnSelectWindow\n            // \n            this.AcceptButton = this.btnOk;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.btnCancel;\n            this.ClientSize = new System.Drawing.Size(319, 431);\n            this.Controls.Add(this.ColumnsPanel);\n            this.Controls.Add(this.btnReset);\n            this.Controls.Add(this.SelectColumnLabel);\n            this.Controls.Add(this.btnCancel);\n            this.Controls.Add(this.btnOk);\n            this.Controls.Add(this.TipLabel);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"ColumnSelectWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Select Columns\";\n            this.ColumnsPanel.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label TipLabel;\n        private System.Windows.Forms.Button btnOk;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnReset;\n        private System.Windows.Forms.Panel ColumnsPanel;\n        private System.Windows.Forms.CheckedListBox clbColumns;\n        private System.Windows.Forms.Label SelectColumnLabel;\n\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/ColumnSelectWindow.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// This form allow the user to selected and order the columns he wants to use for plans.\n    /// </summary>\n    public partial class ColumnSelectWindow : EVEMonForm\n    {\n        private readonly List<IColumnSettings> m_initialColumns = new List<IColumnSettings>();\n        private readonly List<IColumnSettings> m_columns = new List<IColumnSettings>();\n\n        /// <summary>\n        /// Prevents a default instance of the <see cref=\"ColumnSelectWindow\"/> class from being created.\n        /// </summary>\n        private ColumnSelectWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ColumnSelectWindow\"/> class.\n        /// </summary>\n        /// <param name=\"columns\">The columns.</param>\n        protected ColumnSelectWindow(IEnumerable<IColumnSettings> columns)\n            : this()\n        {\n            // Fill the columns list\n            m_initialColumns.AddRange(columns.Select(x => (IColumnSettings)x.Clone()));\n            m_columns.AddRange(m_initialColumns.Select(x => (IColumnSettings)x.Clone()));\n        }\n\n        /// <summary>\n        /// Gets the columns settings.\n        /// </summary>\n        public IEnumerable<IColumnSettings> Columns => m_columns;\n\n        /// <summary>\n        /// On load, rebuild the window.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            UpdateContent();\n        }\n\n        /// <summary>\n        /// Updates the content.\n        /// </summary>\n        private void UpdateContent()\n        {\n            clbColumns.Items.Clear();\n            foreach (int key in AllKeys)\n            {\n                IColumnSettings column = m_columns.First(x => x.Key == key);\n                clbColumns.Items.Add(GetHeader(key), column.Visible);\n            }\n        }\n\n        /// <summary>\n        /// When a checkbox state changed, we update the controls list.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void clbColumns_ItemCheck(object sender, ItemCheckEventArgs e)\n        {\n            bool isChecked = e.NewValue == CheckState.Checked;\n\n            // Gets the key of the modified column\n            string header = (string)clbColumns.Items[e.Index];\n            int key = AllKeys.First(x => GetHeader(x) == header);\n\n            // Gets the column for this key\n            IColumnSettings column = m_columns.First(x => x.Key == key);\n\n            column.Visible = isChecked;\n        }\n\n        /// <summary>\n        /// On cancel, nothing special.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            // Revert changes\n            m_columns.Clear();\n            m_columns.AddRange(m_initialColumns);\n\n            DialogResult = DialogResult.Cancel;\n            Close();\n        }\n\n        /// <summary>\n        /// On OK, we update the settings.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnOk_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        /// <summary>\n        /// On reset button... we reset (how surprising).\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnReset_Click(object sender, EventArgs e)\n        {\n            m_columns.Clear();\n            m_columns.AddRange(DefaultColumns);\n            UpdateContent();\n        }\n\n        protected virtual string GetHeader(int key) => string.Empty;\n\n        protected virtual IEnumerable<int> AllKeys => Enumerable.Empty<int>();\n\n        protected virtual IEnumerable<IColumnSettings> DefaultColumns => Enumerable.Empty<IColumnSettings>();\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/ColumnSelectWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Controls/ControlExtensions.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    public static class ControlExtensions\n    {\n        /// <summary>\n        /// Recursively checks among the container anecestry line whether one of the container is in design mode.\n        /// This is done because <see cref=\"Control.DesignMode\"/> is false when it is not the control directly edited in the designer, \n        /// like when it is a component of a form or another control.\n        /// </summary>\n        /// <param name=\"control\"></param>\n        /// <returns></returns>\n        public static bool IsDesignModeHosted(this Control control)\n        {\n            while (control != null)\n            {\n                if (control.Site != null && control.Site.DesignMode)\n                    return true;\n                control = control.Parent;\n            }\n            return false;\n        }\n        \n        /// <summary>\n        /// Suspends the drawing.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        public static void SuspendDrawing(this Control parent)\n        {\n            NativeMethods.SendMessage(parent.Handle, NativeMethods.WM_SETREDRAW, IntPtr.Zero, IntPtr.Zero);\n        }\n\n        /// <summary>\n        /// Resumes the drawing.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        public static void ResumeDrawing(this Control parent)\n        {\n            NativeMethods.SendMessage(parent.Handle, NativeMethods.WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);\n            parent.Refresh();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/CopySaveOptionsWindow.Designer.cs",
    "content": "namespace EVEMon.Common.Controls\n{\n    partial class CopySaveOptionsWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.groupBox1 = new System.Windows.Forms.GroupBox();\n            this.tbPreview = new System.Windows.Forms.TextBox();\n            this.btnOk = new System.Windows.Forms.Button();\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.groupBox2 = new System.Windows.Forms.GroupBox();\n            this.cbIncludeHeader = new System.Windows.Forms.CheckBox();\n            this.groupBox3 = new System.Windows.Forms.GroupBox();\n            this.cbEntryCost = new System.Windows.Forms.CheckBox();\n            this.cbEntryFinishDate = new System.Windows.Forms.CheckBox();\n            this.cbEntryStartDate = new System.Windows.Forms.CheckBox();\n            this.cbEntryTrainingTimes = new System.Windows.Forms.CheckBox();\n            this.cbEntryNumber = new System.Windows.Forms.CheckBox();\n            this.groupBox4 = new System.Windows.Forms.GroupBox();\n            this.cbFooterCost = new System.Windows.Forms.CheckBox();\n            this.cbFooterDate = new System.Windows.Forms.CheckBox();\n            this.cbFooterTotalTime = new System.Windows.Forms.CheckBox();\n            this.cbFooterCount = new System.Windows.Forms.CheckBox();\n            this.cbRememberOptions = new System.Windows.Forms.CheckBox();\n            this.cmbFormatting = new System.Windows.Forms.ComboBox();\n            this.groupBox5 = new System.Windows.Forms.GroupBox();\n            this.cbShoppingList = new System.Windows.Forms.CheckBox();\n            this.label1 = new System.Windows.Forms.Label();\n            this.cbRemappingPoints = new System.Windows.Forms.CheckBox();\n            this.groupBox1.SuspendLayout();\n            this.groupBox2.SuspendLayout();\n            this.groupBox3.SuspendLayout();\n            this.groupBox4.SuspendLayout();\n            this.groupBox5.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // groupBox1\n            // \n            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.groupBox1.Controls.Add(this.tbPreview);\n            this.groupBox1.Location = new System.Drawing.Point(12, 292);\n            this.groupBox1.Name = \"groupBox1\";\n            this.groupBox1.Size = new System.Drawing.Size(340, 154);\n            this.groupBox1.TabIndex = 6;\n            this.groupBox1.TabStop = false;\n            this.groupBox1.Text = \"Output Sample\";\n            // \n            // tbPreview\n            // \n            this.tbPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tbPreview.Location = new System.Drawing.Point(6, 20);\n            this.tbPreview.Multiline = true;\n            this.tbPreview.Name = \"tbPreview\";\n            this.tbPreview.ReadOnly = true;\n            this.tbPreview.ScrollBars = System.Windows.Forms.ScrollBars.Both;\n            this.tbPreview.Size = new System.Drawing.Size(328, 128);\n            this.tbPreview.TabIndex = 0;\n            this.tbPreview.WordWrap = false;\n            // \n            // btnOk\n            // \n            this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOk.Location = new System.Drawing.Point(198, 454);\n            this.btnOk.Name = \"btnOk\";\n            this.btnOk.Size = new System.Drawing.Size(75, 23);\n            this.btnOk.TabIndex = 4;\n            this.btnOk.Text = \"OK\";\n            this.btnOk.UseVisualStyleBackColor = true;\n            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.btnCancel.Location = new System.Drawing.Point(279, 454);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 5;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // groupBox2\n            // \n            this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.groupBox2.Controls.Add(this.cbIncludeHeader);\n            this.groupBox2.Location = new System.Drawing.Point(12, 12);\n            this.groupBox2.Name = \"groupBox2\";\n            this.groupBox2.Size = new System.Drawing.Size(340, 47);\n            this.groupBox2.TabIndex = 0;\n            this.groupBox2.TabStop = false;\n            this.groupBox2.Text = \"Header Options\";\n            // \n            // cbIncludeHeader\n            // \n            this.cbIncludeHeader.AutoSize = true;\n            this.cbIncludeHeader.Location = new System.Drawing.Point(16, 20);\n            this.cbIncludeHeader.Name = \"cbIncludeHeader\";\n            this.cbIncludeHeader.Size = new System.Drawing.Size(196, 17);\n            this.cbIncludeHeader.TabIndex = 0;\n            this.cbIncludeHeader.Text = \"Include header with character name\";\n            this.cbIncludeHeader.UseVisualStyleBackColor = true;\n            // \n            // groupBox3\n            // \n            this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.groupBox3.Controls.Add(this.cbRemappingPoints);\n            this.groupBox3.Controls.Add(this.cbEntryCost);\n            this.groupBox3.Controls.Add(this.cbEntryFinishDate);\n            this.groupBox3.Controls.Add(this.cbEntryStartDate);\n            this.groupBox3.Controls.Add(this.cbEntryTrainingTimes);\n            this.groupBox3.Controls.Add(this.cbEntryNumber);\n            this.groupBox3.Location = new System.Drawing.Point(12, 65);\n            this.groupBox3.Name = \"groupBox3\";\n            this.groupBox3.Size = new System.Drawing.Size(340, 97);\n            this.groupBox3.TabIndex = 1;\n            this.groupBox3.TabStop = false;\n            this.groupBox3.Text = \"Body Options\";\n            // \n            // cbEntryCost\n            // \n            this.cbEntryCost.AutoSize = true;\n            this.cbEntryCost.Location = new System.Drawing.Point(16, 67);\n            this.cbEntryCost.Name = \"cbEntryCost\";\n            this.cbEntryCost.Size = new System.Drawing.Size(145, 17);\n            this.cbEntryCost.TabIndex = 4;\n            this.cbEntryCost.Text = \"Include cost (if unknown)\";\n            this.cbEntryCost.UseVisualStyleBackColor = true;\n            // \n            // cbEntryFinishDate\n            // \n            this.cbEntryFinishDate.AutoSize = true;\n            this.cbEntryFinishDate.Location = new System.Drawing.Point(169, 43);\n            this.cbEntryFinishDate.Name = \"cbEntryFinishDate\";\n            this.cbEntryFinishDate.Size = new System.Drawing.Size(136, 17);\n            this.cbEntryFinishDate.TabIndex = 3;\n            this.cbEntryFinishDate.Text = \"Include finish date/time\";\n            this.cbEntryFinishDate.UseVisualStyleBackColor = true;\n            // \n            // cbEntryStartDate\n            // \n            this.cbEntryStartDate.AutoSize = true;\n            this.cbEntryStartDate.Location = new System.Drawing.Point(169, 20);\n            this.cbEntryStartDate.Name = \"cbEntryStartDate\";\n            this.cbEntryStartDate.Size = new System.Drawing.Size(132, 17);\n            this.cbEntryStartDate.TabIndex = 2;\n            this.cbEntryStartDate.Text = \"Include start date/time\";\n            this.cbEntryStartDate.UseVisualStyleBackColor = true;\n            // \n            // cbEntryTrainingTimes\n            // \n            this.cbEntryTrainingTimes.AutoSize = true;\n            this.cbEntryTrainingTimes.Location = new System.Drawing.Point(16, 43);\n            this.cbEntryTrainingTimes.Name = \"cbEntryTrainingTimes\";\n            this.cbEntryTrainingTimes.Size = new System.Drawing.Size(120, 17);\n            this.cbEntryTrainingTimes.TabIndex = 1;\n            this.cbEntryTrainingTimes.Text = \"Include training time\";\n            this.cbEntryTrainingTimes.UseVisualStyleBackColor = true;\n            // \n            // cbEntryNumber\n            // \n            this.cbEntryNumber.AutoSize = true;\n            this.cbEntryNumber.Location = new System.Drawing.Point(16, 20);\n            this.cbEntryNumber.Name = \"cbEntryNumber\";\n            this.cbEntryNumber.Size = new System.Drawing.Size(97, 17);\n            this.cbEntryNumber.TabIndex = 0;\n            this.cbEntryNumber.Text = \"Number entries\";\n            this.cbEntryNumber.UseVisualStyleBackColor = true;\n            // \n            // groupBox4\n            // \n            this.groupBox4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.groupBox4.Controls.Add(this.cbFooterCost);\n            this.groupBox4.Controls.Add(this.cbFooterDate);\n            this.groupBox4.Controls.Add(this.cbFooterTotalTime);\n            this.groupBox4.Controls.Add(this.cbFooterCount);\n            this.groupBox4.Location = new System.Drawing.Point(12, 168);\n            this.groupBox4.Name = \"groupBox4\";\n            this.groupBox4.Size = new System.Drawing.Size(192, 118);\n            this.groupBox4.TabIndex = 2;\n            this.groupBox4.TabStop = false;\n            this.groupBox4.Text = \"Footer Options\";\n            // \n            // cbFooterCost\n            // \n            this.cbFooterCost.AutoSize = true;\n            this.cbFooterCost.Location = new System.Drawing.Point(16, 90);\n            this.cbFooterCost.Name = \"cbFooterCost\";\n            this.cbFooterCost.Size = new System.Drawing.Size(168, 17);\n            this.cbFooterCost.TabIndex = 3;\n            this.cbFooterCost.Text = \"Include cost of unknown skills\";\n            this.cbFooterCost.UseVisualStyleBackColor = true;\n            // \n            // cbFooterDate\n            // \n            this.cbFooterDate.AutoSize = true;\n            this.cbFooterDate.Location = new System.Drawing.Point(16, 66);\n            this.cbFooterDate.Name = \"cbFooterDate\";\n            this.cbFooterDate.Size = new System.Drawing.Size(163, 17);\n            this.cbFooterDate.TabIndex = 2;\n            this.cbFooterDate.Text = \"Include completion date/time\";\n            this.cbFooterDate.UseVisualStyleBackColor = true;\n            // \n            // cbFooterTotalTime\n            // \n            this.cbFooterTotalTime.AutoSize = true;\n            this.cbFooterTotalTime.Location = new System.Drawing.Point(16, 43);\n            this.cbFooterTotalTime.Name = \"cbFooterTotalTime\";\n            this.cbFooterTotalTime.Size = new System.Drawing.Size(143, 17);\n            this.cbFooterTotalTime.TabIndex = 1;\n            this.cbFooterTotalTime.Text = \"Include total training time\";\n            this.cbFooterTotalTime.UseVisualStyleBackColor = true;\n            // \n            // cbFooterCount\n            // \n            this.cbFooterCount.AutoSize = true;\n            this.cbFooterCount.Location = new System.Drawing.Point(16, 20);\n            this.cbFooterCount.Name = \"cbFooterCount\";\n            this.cbFooterCount.Size = new System.Drawing.Size(111, 17);\n            this.cbFooterCount.TabIndex = 0;\n            this.cbFooterCount.Text = \"Include skill count\";\n            this.cbFooterCount.UseVisualStyleBackColor = true;\n            // \n            // cbRememberOptions\n            // \n            this.cbRememberOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.cbRememberOptions.AutoSize = true;\n            this.cbRememberOptions.Location = new System.Drawing.Point(18, 458);\n            this.cbRememberOptions.Name = \"cbRememberOptions\";\n            this.cbRememberOptions.Size = new System.Drawing.Size(137, 17);\n            this.cbRememberOptions.TabIndex = 3;\n            this.cbRememberOptions.Text = \"Save options as default\";\n            this.cbRememberOptions.UseVisualStyleBackColor = true;\n            // \n            // cmbFormatting\n            // \n            this.cmbFormatting.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.cmbFormatting.FormattingEnabled = true;\n            this.cmbFormatting.Items.AddRange(new object[] {\n            \"BBCode\",\n            \"HTML\",\n            \"Plain text\"});\n            this.cmbFormatting.Location = new System.Drawing.Point(8, 34);\n            this.cmbFormatting.Margin = new System.Windows.Forms.Padding(2);\n            this.cmbFormatting.Name = \"cmbFormatting\";\n            this.cmbFormatting.Size = new System.Drawing.Size(92, 21);\n            this.cmbFormatting.TabIndex = 3;\n            this.cmbFormatting.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);\n            // \n            // groupBox5\n            // \n            this.groupBox5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.groupBox5.Controls.Add(this.cbShoppingList);\n            this.groupBox5.Controls.Add(this.label1);\n            this.groupBox5.Controls.Add(this.cmbFormatting);\n            this.groupBox5.Location = new System.Drawing.Point(221, 168);\n            this.groupBox5.Margin = new System.Windows.Forms.Padding(2);\n            this.groupBox5.Name = \"groupBox5\";\n            this.groupBox5.Padding = new System.Windows.Forms.Padding(2);\n            this.groupBox5.Size = new System.Drawing.Size(130, 118);\n            this.groupBox5.TabIndex = 7;\n            this.groupBox5.TabStop = false;\n            this.groupBox5.Text = \"Other Options\";\n            // \n            // cbShoppingList\n            // \n            this.cbShoppingList.AutoSize = true;\n            this.cbShoppingList.Location = new System.Drawing.Point(8, 67);\n            this.cbShoppingList.Margin = new System.Windows.Forms.Padding(2);\n            this.cbShoppingList.Name = \"cbShoppingList\";\n            this.cbShoppingList.Size = new System.Drawing.Size(86, 17);\n            this.cbShoppingList.TabIndex = 0;\n            this.cbShoppingList.Text = \"Shopping list\";\n            this.cbShoppingList.UseVisualStyleBackColor = true;\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(6, 18);\n            this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(59, 13);\n            this.label1.TabIndex = 4;\n            this.label1.Text = \"Formatting:\";\n            // \n            // cbRemappingPoints\n            // \n            this.cbRemappingPoints.AutoSize = true;\n            this.cbRemappingPoints.Location = new System.Drawing.Point(169, 66);\n            this.cbRemappingPoints.Name = \"cbRemappingPoints\";\n            this.cbRemappingPoints.Size = new System.Drawing.Size(144, 17);\n            this.cbRemappingPoints.TabIndex = 5;\n            this.cbRemappingPoints.Text = \"Include remapping points\";\n            this.cbRemappingPoints.UseVisualStyleBackColor = true;\n            // \n            // CopySaveOptionsWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.ClientSize = new System.Drawing.Size(364, 487);\n            this.Controls.Add(this.cbRememberOptions);\n            this.Controls.Add(this.groupBox5);\n            this.Controls.Add(this.groupBox4);\n            this.Controls.Add(this.groupBox3);\n            this.Controls.Add(this.groupBox2);\n            this.Controls.Add(this.btnCancel);\n            this.Controls.Add(this.btnOk);\n            this.Controls.Add(this.groupBox1);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"CopySaveOptionsWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Copy Options\";\n            this.Load += new System.EventHandler(this.CopySaveOptionsWindow_Load);\n            this.groupBox1.ResumeLayout(false);\n            this.groupBox1.PerformLayout();\n            this.groupBox2.ResumeLayout(false);\n            this.groupBox2.PerformLayout();\n            this.groupBox3.ResumeLayout(false);\n            this.groupBox3.PerformLayout();\n            this.groupBox4.ResumeLayout(false);\n            this.groupBox4.PerformLayout();\n            this.groupBox5.ResumeLayout(false);\n            this.groupBox5.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.GroupBox groupBox1;\n        private System.Windows.Forms.Button btnOk;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.GroupBox groupBox2;\n        private System.Windows.Forms.CheckBox cbIncludeHeader;\n        private System.Windows.Forms.GroupBox groupBox3;\n        private System.Windows.Forms.CheckBox cbEntryFinishDate;\n        private System.Windows.Forms.CheckBox cbEntryStartDate;\n        private System.Windows.Forms.CheckBox cbEntryTrainingTimes;\n        private System.Windows.Forms.CheckBox cbEntryNumber;\n        private System.Windows.Forms.GroupBox groupBox4;\n        private System.Windows.Forms.CheckBox cbFooterDate;\n        private System.Windows.Forms.CheckBox cbFooterTotalTime;\n        private System.Windows.Forms.CheckBox cbFooterCount;\n        private System.Windows.Forms.CheckBox cbRememberOptions;\n        private System.Windows.Forms.TextBox tbPreview;\n        private System.Windows.Forms.ComboBox cmbFormatting;\n        private System.Windows.Forms.GroupBox groupBox5;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.CheckBox cbShoppingList;\n        private System.Windows.Forms.CheckBox cbFooterCost;\n        private System.Windows.Forms.CheckBox cbEntryCost;\n        private System.Windows.Forms.CheckBox cbRemappingPoints;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/CopySaveOptionsWindow.cs",
    "content": "using System;\nusing System.Windows.Forms;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Controls\n{\n    public partial class CopySaveOptionsWindow : EVEMonForm\n    {\n        private readonly PlanExportSettings m_planTextOptions;\n        private readonly Plan m_plan;\n        private readonly bool m_isForCopy;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CopySaveOptionsWindow\"/> class.\n        /// </summary>\n        private CopySaveOptionsWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CopySaveOptionsWindow\"/> class.\n        /// </summary>\n        /// <param name=\"pto\">The pto.</param>\n        /// <param name=\"plan\">The p.</param>\n        /// <param name=\"isForCopy\">if set to <c>true</c> [is for copy].</param>\n        public CopySaveOptionsWindow(PlanExportSettings pto, Plan plan, bool isForCopy)\n            : this()\n        {\n            m_planTextOptions = pto;\n            m_plan = plan;\n            m_isForCopy = isForCopy;\n        }\n\n        /// <summary>\n        /// Handles the Load event of the CopySaveOptionsWindow control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void CopySaveOptionsWindow_Load(object sender, EventArgs e)\n        {\n            Text = m_isForCopy ? \"Copy Options\" : \"Save Options\";\n\n            cbIncludeHeader.Checked = m_planTextOptions.IncludeHeader;\n            cbEntryNumber.Checked = m_planTextOptions.EntryNumber;\n            cbEntryTrainingTimes.Checked = m_planTextOptions.EntryTrainingTimes;\n            cbEntryCost.Checked = m_planTextOptions.EntryCost;\n            cbEntryStartDate.Checked = m_planTextOptions.EntryStartDate;\n            cbEntryFinishDate.Checked = m_planTextOptions.EntryFinishDate;\n            cbRemappingPoints.Checked = m_planTextOptions.RemappingPoints;\n            cbFooterCount.Checked = m_planTextOptions.FooterCount;\n            cbFooterTotalTime.Checked = m_planTextOptions.FooterTotalTime;\n            cbFooterDate.Checked = m_planTextOptions.FooterDate;\n            cbFooterCost.Checked = m_planTextOptions.FooterCost;\n            cbShoppingList.Checked = m_planTextOptions.ShoppingList;\n            cmbFormatting.SelectedIndex = m_planTextOptions.Markup == MarkupType.Forum\n                ? 0\n                : m_planTextOptions.Markup == MarkupType.Html ? 1 : 2;\n\n            RecurseUnder(this);\n            OptionChange();\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether [set as default].\n        /// </summary>\n        /// <value><c>true</c> if [set as default]; otherwise, <c>false</c>.</value>\n        public bool SetAsDefault { get; private set; }\n\n        /// <summary>\n        /// Recursively downwards looks for chackboxws.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        private void RecurseUnder(Control parent)\n        {\n            foreach (Control control in parent.Controls)\n            {\n                CheckBox checkBox = control as CheckBox;\n                if (checkBox != null && checkBox != cbRememberOptions)\n                    checkBox.CheckedChanged += checkBox_CheckedChanged;\n\n                RecurseUnder(control);\n            }\n        }\n\n        /// <summary>\n        /// Updates the options.\n        /// </summary>\n        private void UpdateOptions()\n        {\n            m_planTextOptions.IncludeHeader = cbIncludeHeader.Checked;\n            m_planTextOptions.EntryNumber = cbEntryNumber.Checked;\n            m_planTextOptions.EntryTrainingTimes = cbEntryTrainingTimes.Checked;\n            m_planTextOptions.EntryStartDate = cbEntryStartDate.Checked;\n            m_planTextOptions.EntryFinishDate = cbEntryFinishDate.Checked;\n            m_planTextOptions.EntryCost = cbEntryCost.Checked;\n            m_planTextOptions.RemappingPoints = cbRemappingPoints.Checked;\n            m_planTextOptions.FooterCount = cbFooterCount.Checked;\n            m_planTextOptions.FooterTotalTime = cbFooterTotalTime.Checked;\n            m_planTextOptions.FooterCost = cbFooterCost.Checked;\n            m_planTextOptions.FooterDate = cbFooterDate.Checked;\n            m_planTextOptions.ShoppingList = cbShoppingList.Checked;\n            m_planTextOptions.Markup = cmbFormatting.SelectedIndex == 0\n                ? MarkupType.Forum\n                : cmbFormatting.SelectedIndex == 1 ? MarkupType.Html : MarkupType.None;\n        }\n\n        /// <summary>\n        /// Occurs when an option change.\n        /// </summary>\n        private void OptionChange()\n        {\n            UpdateOptions();\n            tbPreview.Text = PlanIOHelper.ExportAsText(m_plan, m_planTextOptions);\n        }\n\n        /// <summary>\n        /// Handles the CheckedChanged event of the cb control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void checkBox_CheckedChanged(object sender, EventArgs e)\n        {\n            OptionChange();\n        }\n\n        /// <summary>\n        /// Handles the SelectedIndexChanged event of the comboBox1 control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            OptionChange();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnCancel control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            DialogResult = DialogResult.Cancel;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnOk control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnOk_Click(object sender, EventArgs e)\n        {\n            UpdateOptions();\n\n            SetAsDefault = cbRememberOptions.Checked;\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/CopySaveOptionsWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Controls/CustomComboBox.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// Code based on Stelios Alexandrakis's CheckedComboBox, see :\n    /// http://www.codeproject.com/KB/combobox/checkedcombobox.aspx\n    /// License : http://www.codeproject.com/info/cpol10.aspx\n    /// </summary>\n    public abstract class CustomComboBox : ComboBox\n    {\n        #region CustomComboBoxEventArgs\n\n        /// <summary>\n        /// Custom EventArgs encapsulating value as to whether the combo box value(s) should be assignd to or not.\n        /// </summary>\n        protected class CustomComboBoxEventArgs : EventArgs\n        {\n            private bool validate;\n\n            public bool Validate\n            {\n                get { return validate; }\n                set { validate = value; }\n            }\n\n            public CustomComboBoxEventArgs(bool validate)\n                : base()\n            {\n                this.validate = validate;\n            }\n        }\n\n        #endregion\n\n\n        #region Dropdown\n\n        /// <summary>\n        /// Internal class to represent the dropdown list of the CheckedComboBox\n        /// </summary>\n        protected class Dropdown : Form\n        {\n            private CustomComboBox ccbParent;\n            private Control content;\n\n            // Keeps track of whether checked item(s) changed, hence the value of the CheckedComboBox as a whole changed.\n            // This is simply done via maintaining the old string-representation of the value(s) and the new one and comparing them!\n            private string oldStrValue = string.Empty;\n\n            public bool ValueChanged\n            {\n                get\n                {\n                    string newStrValue = ccbParent.Text;\n                    if ((oldStrValue.Length > 0) && (newStrValue.Length > 0))\n                        return oldStrValue.CompareTo(newStrValue) != 0;\n                    else\n                        return oldStrValue.Length != newStrValue.Length;\n                }\n            }\n\n            // Whether the dropdown is closed.\n            private bool dropdownClosed = true;\n\n            public Dropdown(CustomComboBox ccbParent, Control content)\n            {\n                this.ccbParent = ccbParent;\n                this.content = content;\n\n                InitializeComponent();\n\n                this.ShowInTaskbar = false;\n            }\n\n            // Create a CustomCheckedListBox which fills up the entire form area.\n            private void InitializeComponent()\n            {\n                this.SuspendLayout();\n                // \n                // Dropdown\n                // \n                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n                this.BackColor = System.Drawing.SystemColors.Menu;\n                this.ControlBox = false;\n                this.Controls.Add(this.content);\n                this.ForeColor = System.Drawing.SystemColors.ControlText;\n                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;\n                this.MinimizeBox = false;\n                this.Name = \"dropdown\";\n                this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;\n                this.ResumeLayout(false);\n            }\n\n            /// <summary>\n            /// Closes the dropdown portion and enacts any changes according to the specified boolean parameter.\n            /// NOTE: even though the caller might ask for changes to be enacted, this doesn't necessarily mean\n            ///       that any changes have occurred as such. Caller should check the ValueChanged property of the\n            ///       CheckedComboBox (after the dropdown has closed) to determine any actual value changes.\n            /// </summary>\n            /// <param name=\"validate\"></param>\n            public void CloseDropdown(bool validate)\n            {\n                if (dropdownClosed)\n                    return;\n                //Debug.WriteLine(\"CloseDropdown\");\n                // Cancel parent's selection before we close\n                if (validate)\n                    ccbParent.SelectedIndex = -1;\n                ccbParent.OnDropDownDeactivated(validate);\n                // From now on the dropdown is considered closed. We set the flag here to prevent OnDeactivate() calling\n                // this method once again after hiding this window.\n                dropdownClosed = true;\n                // Set the focus to our parent CheckedComboBox and hide the dropdown check list.\n                ccbParent.Focus();\n                this.Hide();\n                // Notify CheckedComboBox that its dropdown is closed. (NOTE: it does not matter which parameters we pass to\n                // OnDropDownClosed() as long as the argument is CCBoxEventArgs so that the method knows the notification has\n                // come from our code and not from the framework).\n                ccbParent.OnDropDownClosed(new CustomComboBoxEventArgs(false));\n            }\n\n            protected override void OnActivated(EventArgs e)\n            {\n                //Debug.WriteLine(\"OnActivated\");\n                base.OnActivated(e);\n                dropdownClosed = false;\n                // Assign the old string value to compare with the new value for any changes.\n                oldStrValue = ccbParent.Text;\n                ccbParent.OnDropDownActivated();\n            }\n\n            protected override void OnDeactivate(EventArgs e)\n            {\n                //Debug.WriteLine(\"OnDeactivate\");\n                base.OnDeactivate(e);\n                CustomComboBoxEventArgs ce = e as CustomComboBoxEventArgs;\n                if (ce != null)\n                    CloseDropdown(ce.Validate);\n                else\n                {\n                    // If not custom event arguments passed, means that this method was called from the\n                    // framework. We assume that the checked values should be registered regardless.\n                    CloseDropdown(true);\n                }\n            }\n\n            public void ForceDeactivate(CustomComboBoxEventArgs e)\n            {\n                OnDeactivate(e);\n            }\n        }\n\n        #endregion\n\n\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        // A form-derived object representing the drop-down list of the checked combo box.\n        protected Dropdown dropdown;\n        private Control content;\n\n        public bool ValueChanged => dropdown.ValueChanged;\n\n        private ToolTip toolTip;\n\n        public ToolTip ToolTip\n        {\n            get { return this.toolTip; }\n            set\n            {\n                if (value != this.toolTip)\n                {\n                    this.toolTip = value;\n                    UpdateToolTip();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        protected CustomComboBox()\n            : base()\n        {\n            this.content = this.CreateContent();\n\n            // We want to do the drawing of the dropdown.\n            this.DrawMode = DrawMode.OwnerDrawVariable;\n            // This prevents the actual ComboBox dropdown to show, although it's not strickly-speaking necessary.\n            // But including this remove a slight flickering just before our dropdown appears (which is caused by\n            // the empty-dropdown list of the ComboBox which is displayed for fractions of a second).\n            this.DropDownHeight = 1;\n            // This is the default setting - text portion is editable and user must click the arrow button\n            // to see the list portion. Although we don't want to allow the user to edit the text portion\n            // the DropDownList style is not being used because for some reason it wouldn't allow the text\n            // portion to be programmatically set. Hence we set it as editable but disable keyboard input (see below).\n            this.DropDownStyle = ComboBoxStyle.DropDown;\n            this.dropdown = new Dropdown(this, this.content);\n        }\n\n        public abstract string GetTextValue();\n        protected abstract Control CreateContent();\n        protected abstract void OnDropDownActivated();\n        protected abstract void OnDropDownDeactivated(bool validate);\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n                components?.Dispose();\n            base.Dispose(disposing);\n        }\n\n        protected override void OnTextChanged(EventArgs e)\n        {\n            base.OnTextChanged(e);\n            UpdateToolTip();\n        }\n\n        private void UpdateToolTip()\n        {\n            this.toolTip?.SetToolTip(this, this.Text + \"\\n(use del and shift + del to unselect/select all)\");\n        }\n\n        private void DoDropDown()\n        {\n            if (!dropdown.Visible)\n            {\n                Rectangle rect = RectangleToScreen(this.ClientRectangle);\n                dropdown.Location = new Point(rect.X, rect.Y + this.Size.Height);\n                this.content.Refresh();\n                Size preferedSize = this.content.GetPreferredSize(new Size(this.Width, 600));\n                dropdown.ClientSize = new Size(Math.Max(preferedSize.Width, this.Width), Math.Max(96, preferedSize.Height));\n                dropdown.Show(this);\n            }\n        }\n\n        protected override void OnDropDown(EventArgs e)\n        {\n            base.OnDropDown(e);\n            DoDropDown();\n        }\n\n        protected override void OnDropDownClosed(EventArgs e)\n        {\n            // Call the handlers for this event only if the call comes from our code - NOT the framework's!\n            // NOTE: that is because the events were being fired in a wrong order, due to the actual dropdown list\n            //       of the ComboBox which lies underneath our dropdown and gets involved every time.\n            if (e is CustomComboBoxEventArgs)\n                base.OnDropDownClosed(e);\n        }\n\n        protected override void OnKeyDown(KeyEventArgs e)\n        {\n            base.OnKeyDown(e);\n\n            if (e.KeyCode == Keys.Down)\n            {\n                // Signal that the dropdown is \"down\". This is required so that the behaviour of the dropdown is the same\n                // when it is a result of user pressing the Down_Arrow (which we handle and the framework wouldn't know that\n                // the list portion is down unless we tell it so).\n                // NOTE: all that so the DropDownClosed event fires correctly!                \n                OnDropDown(null);\n            }\n            // Make sure that certain keys or combinations are not blocked.\n            e.Handled = !e.Alt && e.KeyCode != Keys.Tab &&\n                        !((e.KeyCode == Keys.Left) || (e.KeyCode == Keys.Right) || (e.KeyCode == Keys.Home) ||\n                          (e.KeyCode == Keys.End));\n\n        }\n\n        protected override void OnKeyPress(KeyPressEventArgs e)\n        {\n            base.OnKeyPress(e);\n            e.Handled = true;\n        }\n\n        protected override void OnSizeChanged(EventArgs e)\n        {\n            base.OnSizeChanged(e);\n            this.dropdown.MaximumSize = new Size(this.Width, 6 * this.ItemHeight);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/CustomCursors.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Windows.Forms;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Common.Controls\n{\n    public static class CustomCursors\n    {\n        private static Cursor s_contextMenuCursor;\n\n        /// <summary>\n        /// Gets the context menu cursor.\n        /// </summary>\n        /// <value>\n        /// The context menu.\n        /// </value>\n        public static Cursor ContextMenu\n            => s_contextMenuCursor ??\n               (s_contextMenuCursor = GetCursorFromResource(Properties.Resources.ContextMenuPointer));\n\n        /// <summary>\n        /// Gets the cursor from resource.\n        /// </summary>\n        /// <param name=\"resource\">The resource.</param>\n        /// <returns></returns>\n        private static Cursor GetCursorFromResource(byte[] resource)\n        {\n            try\n            {\n                string tempFile = Path.GetTempFileName();\n\n                using (MemoryStream cursorStream = new MemoryStream(resource))\n                using (FileStream fileStream = Util.GetFileStream(tempFile))\n                    cursorStream.WriteTo(fileStream);\n\n                Cursor cursor = new Cursor(NativeMethods.LoadCursorFromFile(tempFile));\n                FileHelper.DeleteFile(tempFile);\n\n                return cursor;\n            }\n            catch (Exception exc)\n            {\n                ExceptionHandler.LogException(exc, true);\n                return Cursor.Current;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/DraggableListView.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Controls\n{\n    public class DraggableListView : ListView\n    {\n        public event EventHandler<ListViewDragEventArgs> ListViewItemsDragging;\n        public event EventHandler<EventArgs> ListViewItemsDragged;\n\n        private const string Reorder = \"Reorder\";\n\n        private bool m_dragging;\n        private bool m_allowRowReorder = true;\n        private int m_dropMarkerOn = -1;\n        private bool m_dropMarkerBelow;\n\n        public DraggableListView()\n        {\n            Initialize();\n        }\n\n\n        #region Draggable stuff\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [allow row reorder].\n        /// </summary>\n        /// <value><c>true</c> if [allow row reorder]; otherwise, <c>false</c>.</value>\n        public bool AllowRowReorder\n        {\n            get { return m_allowRowReorder; }\n            set\n            {\n                m_allowRowReorder = value;\n                base.AllowDrop = value;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the sort order for items in the control.\n        /// </summary>\n        /// <value></value>\n        /// <returns>One of the <see cref=\"T:System.Windows.Forms.SortOrder\"/> values.\n        /// The default is <see cref=\"F:System.Windows.Forms.SortOrder.None\"/>.</returns>\n        /// <exception cref=\"T:System.ComponentModel.InvalidEnumArgumentException\">The value specified is not one of the <see cref=\"T:System.Windows.Forms.SortOrder\"/> values. </exception>\n        public new System.Windows.Forms.SortOrder Sorting\n        {\n            get { return System.Windows.Forms.SortOrder.None; }\n            set { base.Sorting = System.Windows.Forms.SortOrder.None; }\n        }\n\n        /// <summary>\n        /// Initializes this instance.\n        /// </summary>\n        private void Initialize()\n        {\n            AllowRowReorder = true;\n        }\n\n        /// <summary>\n        /// Gets the dragging skill.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.DragEventArgs\"/> instance containing the event data.</param>\n        /// <returns></returns>\n        private static Skill GetDraggingSkill(DragEventArgs e)\n        {\n            if (e.Data.GetDataPresent(\"System.Windows.Forms.TreeNode\"))\n                return (Skill)((TreeNode)e.Data.GetData(\"System.Windows.Forms.TreeNode\")).Tag;\n\n            return null;\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.DragDrop\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.DragEventArgs\"/> that contains the event data. </param>\n        protected override void OnDragDrop(DragEventArgs e)\n        {\n            base.OnDragDrop(e);\n\n            Skill dragSkill = GetDraggingSkill(e);\n            if (dragSkill != null)\n                return;\n\n            m_dragging = false;\n            ClearDropMarker();\n            if (!AllowRowReorder)\n                return;\n\n            if (SelectedItems.Count == 0)\n                return;\n\n            Point cp = PointToClient(new Point(e.X, e.Y));\n            ListViewItem dragToItem = GetItemAt(cp.X, cp.Y);\n            if (dragToItem == null)\n                return;\n\n            int dropIndex = dragToItem.Index;\n            if (dropIndex > SelectedItems[0].Index)\n                dropIndex++;\n\n            if (ListViewItemsDragging != null)\n            {\n                ListViewDragEventArgs args = new ListViewDragEventArgs(SelectedItems[0].Index,\n                                                                       SelectedItems.Count, dropIndex);\n                ListViewItemsDragging(this, args);\n                if (args.Cancel)\n                    return;\n            }\n\n            // Make a copy of all the selected items\n            ArrayList insertItems = new ArrayList(SelectedItems.Count);\n            foreach (ListViewItem item in SelectedItems)\n            {\n                insertItems.Add(item.Clone());\n            }\n\n            // insert the copied items in reverse order at the drop index so \n            // they appear in the right order after they've all been inserted\n            for (int i = insertItems.Count - 1; i >= 0; i--)\n            {\n                Items.Insert(dropIndex, (ListViewItem)insertItems[i]);\n            }\n\n            // remove the selected items\n            foreach (ListViewItem item in SelectedItems)\n            {\n                // must clear the items icon index or an exception is thrown when it is removed\n                item.StateImageIndex = -1;\n                Items.Remove(item);\n            }\n\n            ListViewItemsDragged?.ThreadSafeInvoke(this, new EventArgs());\n\n            // if the item was dragged to the end of the plan.\n            if (dropIndex >= Items.Count)\n                EnsureVisible(Items.Count - 1);\n            else\n                EnsureVisible(dropIndex);\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.DragOver\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.DragEventArgs\"/> that contains the event data. </param>\n        protected override void OnDragOver(DragEventArgs e)\n        {\n            base.OnDragOver(e);\n\n            Skill dragSkill = GetDraggingSkill(e);\n            if (dragSkill != null)\n                return;\n\n            if (!AllowRowReorder)\n            {\n                e.Effect = DragDropEffects.None;\n                ClearDropMarker();\n                return;\n            }\n            if (!e.Data.GetDataPresent(DataFormats.Text))\n            {\n                e.Effect = DragDropEffects.None;\n                ClearDropMarker();\n                return;\n            }\n            Point cp = PointToClient(new Point(e.X, e.Y));\n            ListViewItem hoverItem = GetItemAt(cp.X, cp.Y);\n            if (hoverItem == null)\n            {\n                e.Effect = DragDropEffects.None;\n                ClearDropMarker();\n                return;\n            }\n\n            if (SelectedItems.Cast<ListViewItem>().Any(moveItem => moveItem.Index == hoverItem.Index))\n            {\n                e.Effect = DragDropEffects.None;\n                hoverItem.EnsureVisible();\n                ClearDropMarker();\n                return;\n            }\n\n            base.OnDragOver(e);\n            string text = (string)e.Data.GetData(Reorder.GetType());\n            if (string.Compare(text, Reorder, StringComparison.CurrentCulture) == 0)\n            {\n                e.Effect = DragDropEffects.Move;\n                hoverItem.EnsureVisible();\n\n                Rectangle hoverBounds = hoverItem.GetBounds(ItemBoundsPortion.ItemOnly);\n                DrawDropMarker(hoverItem.Index, cp.Y > hoverBounds.Top + hoverBounds.Height / 2);\n            }\n            else\n            {\n                e.Effect = DragDropEffects.None;\n                ClearDropMarker();\n            }\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.DragEnter\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.DragEventArgs\"/> that contains the event data. </param>\n        protected override void OnDragEnter(DragEventArgs e)\n        {\n            base.OnDragEnter(e);\n\n            Skill dragSkill = GetDraggingSkill(e);\n            if (dragSkill != null)\n                return;\n\n            if (!AllowRowReorder)\n            {\n                e.Effect = DragDropEffects.None;\n                ClearDropMarker();\n                return;\n            }\n\n            if (!e.Data.GetDataPresent(DataFormats.Text))\n            {\n                e.Effect = DragDropEffects.None;\n                ClearDropMarker();\n                return;\n            }\n\n            base.OnDragEnter(e);\n            string text = (string)e.Data.GetData(Reorder.GetType());\n            if (string.Compare(text, Reorder, StringComparison.CurrentCulture) == 0)\n                e.Effect = DragDropEffects.Move;\n            else\n            {\n                e.Effect = DragDropEffects.None;\n                ClearDropMarker();\n            }\n        }\n\n        public void ClearDropMarker()\n        {\n            if (m_dropMarkerOn != -1)\n                RestrictedPaint();\n            m_dropMarkerOn = -1;\n        }\n\n        public void DrawDropMarker(int index, bool below)\n        {\n            if (m_dropMarkerOn != -1 && (m_dropMarkerOn != index || m_dropMarkerBelow != below))\n                ClearDropMarker();\n\n            if (m_dropMarkerOn == index)\n                return;\n\n            m_dropMarkerOn = index;\n            m_dropMarkerBelow = below;\n            RestrictedPaint();\n        }\n\n        private void RestrictedPaint()\n        {\n            Rectangle itemRect = GetItemRect(m_dropMarkerOn, ItemBoundsPortion.ItemOnly);\n            Point start = new Point(itemRect.Left, m_dropMarkerBelow ? itemRect.Bottom : itemRect.Top);\n            Point end = new Point(Width < itemRect.Right ? Width : itemRect.Right,\n                                  m_dropMarkerBelow ? itemRect.Bottom : itemRect.Top);\n            start = PointToScreen(start);\n            end = PointToScreen(end);\n            ControlPaint.DrawReversibleLine(start, end, SystemColors.Window);\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.Control.Paint\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.PaintEventArgs\"/> that contains the event data. </param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            if (m_dragging)\n                RestrictedPaint();\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.ListView.ItemDrag\"/> event.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.Windows.Forms.ItemDragEventArgs\"/> that contains the event data. </param>\n        protected override void OnItemDrag(ItemDragEventArgs e)\n        {\n            base.OnItemDrag(e);\n            if (!AllowRowReorder)\n                return;\n\n            DoDragDrop(Reorder, DragDropEffects.Move);\n            m_dragging = true;\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/DraggableTabControl.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// A tab control which support drag and dropping.\n    /// </summary>\n    public sealed class DraggableTabControl : TabControl\n    {\n        private int m_markerIndex;\n        private bool m_markerOnLeft;\n        private Point m_lastPoint;\n        private readonly InsertionMarker m_marker;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public DraggableTabControl()\n        {\n            m_markerIndex = -1;\n            m_marker = new InsertionMarker(this);\n            AllowDrop = true;\n        }\n\n        /// <summary>\n        /// On size changing, we repaint, otherwise there are artifacts when a\n        /// notification is closed.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnSizeChanged(EventArgs e)\n        {\n            base.OnSizeChanged(e);\n            Invalidate();\n        }\n\n        /// <summary>\n        /// On disposing, we close the marker and disposes it.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            m_marker.Hide();\n            m_marker.Dispose();\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// On dragging, we updates the cursor and displays an insertion marker.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnDragOver(DragEventArgs e)\n        {\n            base.OnDragOver(e);\n\n            TabPage draggedTab = GetDraggedTab(e);\n\n            // Retrieve the point in client coordinates\n            Point pt = new Point(e.X, e.Y);\n            pt = PointToClient(pt);\n            if (pt.Equals(m_lastPoint))\n                return;\n            m_lastPoint = pt;\n\n            // Make sure there is a TabPage being dragged.\n            if (draggedTab == null)\n            {\n                e.Effect = DragDropEffects.None;\n                return;\n            }\n\n            // Retrieve the dragged page. If same as dragged page, return\n            TabPage hoveredTab = GetTabPageAt(pt);\n            if (draggedTab == hoveredTab)\n            {\n                e.Effect = DragDropEffects.None;\n                m_markerIndex = -1;\n                return;\n            }\n\n            // Get the old and new marker indices\n            bool onLeft;\n            int newIndex = GetMarkerIndex(draggedTab, pt, out onLeft);\n            int oldIndex = m_markerIndex;\n            m_markerIndex = newIndex;\n            m_markerOnLeft = onLeft;\n\n            // Updates the new tab index\n            if (oldIndex != newIndex)\n                UpdateMarker();\n\n            e.Effect = DragDropEffects.Move;\n        }\n\n        /// <summary>\n        /// On drag and drop, we updates the tab order.\n        /// </summary>\n        /// <param name=\"drgevent\"></param>\n        protected override void OnDragDrop(DragEventArgs drgevent)\n        {\n            TabPage draggedTab = GetDraggedTab(drgevent);\n\n            m_lastPoint = new Point(int.MaxValue, int.MaxValue);\n            m_markerIndex = -1;\n            UpdateMarker();\n\n            // Retrieve the point in client coordinates\n            Point pt = new Point(drgevent.X, drgevent.Y);\n            pt = PointToClient(pt);\n\n            // Get the tab we are hovering over.\n            bool onLeft;\n            int markerIndex = GetMarkerIndex(draggedTab, pt, out onLeft);\n            int index = GetInsertionIndex(markerIndex, onLeft);\n\n            // Make sure there is a TabPage being dragged.\n            if (draggedTab == null)\n            {\n                drgevent.Effect = DragDropEffects.None;\n                base.OnDragDrop(drgevent);\n                return;\n            }\n\n            // Retrieve the dragged page. If same as dragged page, return\n            int draggedIndex = TabPages.IndexOf(draggedTab);\n            if (draggedIndex == index || (draggedIndex == index - 1 && onLeft))\n            {\n                drgevent.Effect = DragDropEffects.None;\n                base.OnDragDrop(drgevent);\n                return;\n            }\n\n            // Move the tabs\n            drgevent.Effect = DragDropEffects.Move;\n            this.SuspendDrawing();\n            SuspendLayout();\n            try\n            {\n                if (TabPages.IndexOf(draggedTab) < index)\n                    index--;\n                TabPages.Remove(draggedTab);\n                TabPages.Insert(index, draggedTab);\n                SelectedTab = draggedTab;\n            }\n            finally\n            {\n                ResumeLayout(false);\n                this.ResumeDrawing();\n                base.OnDragDrop(drgevent);\n            }\n        }\n\n        /// <summary>\n        /// On drag and drop leave, removes the marker index.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnDragLeave(EventArgs e)\n        {\n            base.OnDragLeave(e);\n\n            if (m_marker.Bounds.Contains(Cursor.Position))\n                return;\n            m_markerIndex = -1;\n            UpdateMarker();\n        }\n\n        /// <summary>\n        /// Get the dragged tab\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"DragEventArgs\"/> instance containing the event data.</param>\n        /// <returns></returns>\n        private static TabPage GetDraggedTab(DragEventArgs e)\n        {\n            if (!e.Data.GetDataPresent(typeof(TabPage)))\n                return null;\n            return (TabPage)e.Data.GetData(typeof(TabPage));\n        }\n\n        /// <summary>\n        /// Gets the insertion index from the given point.\n        /// </summary>\n        /// <param name=\"draggedPage\"></param>\n        /// <param name=\"pt\"></param>\n        /// <param name=\"onLeft\"></param>\n        /// <returns></returns>\n        private int GetMarkerIndex(TabPage draggedPage, Point pt, out bool onLeft)\n        {\n            TabPage hoveredPage = GetTabPageAt(pt);\n            if (hoveredPage == null)\n            {\n                // Is it on the left or the right side of this control ?\n                if (pt.X < Width / 2)\n                {\n                    onLeft = true;\n                    return 0;\n                }\n\n                onLeft = false;\n                return TabCount;\n            }\n\n            // So we're over a page, retrieves its index.\n            int newIndex = TabPages.IndexOf(hoveredPage);\n\n            // Is it on the left or the right side of the tab ?\n            Rectangle rect = GetTabRect(newIndex);\n            onLeft = pt.X < (rect.Left + rect.Right) / 2;\n            if (onLeft)\n                return newIndex;\n\n            // If there is a tab on the right, we may put the burden on it\n            if (newIndex + 1 >= TabCount)\n                return newIndex;\n\n            TabPage nextPage = GetTabPageAt(new Point(rect.Right + 1, pt.Y));\n\n            if (nextPage == null || nextPage == draggedPage)\n                return newIndex;\n\n            onLeft = true;\n            newIndex++;\n\n            return newIndex;\n        }\n\n        /// <summary>\n        /// Gets the insertion index.\n        /// </summary>\n        /// <param name=\"markerIndex\"></param>\n        /// <param name=\"onLeft\"></param>\n        /// <returns></returns>\n        private static int GetInsertionIndex(int markerIndex, bool onLeft)\n        {\n            if (markerIndex == -1)\n                return 0;\n\n            if (onLeft)\n                return markerIndex;\n\n            return markerIndex + 1;\n        }\n\n        /// <summary>\n        /// When the user moves the mouse with the left button pressed, we do a drag and drop operation.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnMouseMove(MouseEventArgs e)\n        {\n            base.OnMouseMove(e);\n\n            if ((e.Button & MouseButtons.Left) != MouseButtons.Left)\n                return;\n\n            TabPage tp = SelectedTab;\n\n            if (tp != null)\n                DoDragDrop(tp, DragDropEffects.All);\n        }\n\n        /// <summary>\n        /// Finds the TabPage whose tab is contains the given point.\n        /// </summary>\n        /// <param name=\"pt\">The point (given in client coordinates) to look for a TabPage.</param>\n        /// <returns>The TabPage whose tab is at the given point (null if there isn't one).</returns>\n        private TabPage GetTabPageAt(Point pt)\n        {\n            TabPage tp = null;\n\n            for (int i = 0; i < TabPages.Count; i++)\n            {\n                if (!GetTabRect(i).Contains(pt))\n                    continue;\n\n                tp = TabPages[i];\n                break;\n            }\n\n            return tp;\n        }\n\n        /// <summary>\n        /// Updates the insertion marker.\n        /// </summary>\n        private void UpdateMarker()\n        {\n            if (m_markerIndex == -1)\n            {\n                m_marker.Visible = false;\n                return;\n            }\n\n            Rectangle rect = GetTabRect(m_markerIndex);\n            rect.Height -= 1;\n            rect.X += 1;\n            rect.Y += 1;\n\n            Point topLeft = PointToScreen(new Point(rect.Left, rect.Top));\n            Point topRight = PointToScreen(new Point(rect.Right, rect.Top));\n\n            m_marker.Reversed = !m_markerOnLeft;\n            m_marker.ShowInactiveTopmost();\n\n            if (m_markerOnLeft)\n                m_marker.SetBounds(topLeft.X, topLeft.Y, 5, rect.Height);\n            else\n                m_marker.SetBounds(topRight.X - 7, topRight.Y, 5, rect.Height);\n        }\n\n\n        #region InsertionMarker\n\n        /// <summary>\n        /// A window displaying the insertion marker.\n        /// </summary>\n        private sealed class InsertionMarker : Form\n        {\n            private bool m_reversed;\n            private readonly DraggableTabControl m_owner;\n\n            /// <summary>\n            /// Constructor.\n            /// </summary>\n            public InsertionMarker(DraggableTabControl owner)\n            {\n                m_owner = owner;\n\n                SetStyle(ControlStyles.UserPaint, true);\n                SetStyle(ControlStyles.AllPaintingInWmPaint, true);\n                SetStyle(ControlStyles.OptimizedDoubleBuffer, true);\n\n                Opacity = 0.5;\n                FormBorderStyle = FormBorderStyle.None;\n                ShowInTaskbar = false;\n                AllowDrop = true;\n                Height = 16;\n                Width = 6;\n            }\n\n            /// <summary>\n            /// gets or sets the gradent shoudl be reversed.\n            /// </summary>\n            public bool Reversed\n            {\n                get { return m_reversed; }\n                set\n                {\n                    if (m_reversed == value)\n                        return;\n                    m_reversed = value;\n                    Invalidate();\n                }\n            }\n\n            /// <summary>\n            /// Performs the painting.\n            /// </summary>\n            /// <param name=\"e\"></param>\n            protected override void OnPaint(PaintEventArgs e)\n            {\n                base.OnPaint(e);\n\n                Rectangle rect = ClientRectangle;\n                Color startColor = Color.FromArgb(0, 148, 255);\n                Color endColor = Color.FromArgb(0, 255, 255);\n\n                // Computes the marker rectangle and the gradient\n                if (m_reversed)\n                {\n                    Color tempColor = startColor;\n                    startColor = endColor;\n                    endColor = tempColor;\n                }\n\n                // Draws the marker rectangle\n                using (\n                    LinearGradientBrush brush = new LinearGradientBrush(new Point(0, 0), new Point(Width, 0), startColor, endColor)\n                    )\n                {\n                    e.Graphics.FillRectangle(brush, rect);\n                }\n            }\n\n            /// <summary>\n            /// Raises the <see cref=\"E:System.Windows.Forms.Control.DragEnter\"/> event.\n            /// </summary>\n            /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.DragEventArgs\"/> that contains the event data.</param>\n            protected override void OnDragEnter(DragEventArgs e)\n            {\n                base.OnDragEnter(e);\n                m_owner.OnDragEnter(e);\n            }\n\n            /// <summary>\n            /// Raises the <see cref=\"E:System.Windows.Forms.Control.DragDrop\"/> event.\n            /// </summary>\n            /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.DragEventArgs\"/> that contains the event data.</param>\n            protected override void OnDragDrop(DragEventArgs e)\n            {\n                base.OnDragDrop(e);\n                m_owner.OnDragDrop(e);\n            }\n\n            /// <summary>\n            /// Raises the <see cref=\"E:System.Windows.Forms.Control.DragOver\"/> event.\n            /// </summary>\n            /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.DragEventArgs\"/> that contains the event data.</param>\n            protected override void OnDragOver(DragEventArgs e)\n            {\n                base.OnDragOver(e);\n                m_owner.OnDragOver(e);\n            }\n\n            /// <summary>\n            /// Raises the <see cref=\"E:System.Windows.Forms.Control.DragLeave\"/> event.\n            /// </summary>\n            /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n            protected override void OnDragLeave(EventArgs e)\n            {\n                base.OnDragLeave(e);\n\n                Point pt = m_owner.PointToClient(Cursor.Position);\n                if (m_owner.ClientRectangle.Contains(pt))\n                    return;\n\n                m_owner.OnDragLeave(e);\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/DropDownMouseMoveComboBox.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Drawing.Design;\nusing System.Windows.Forms;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// A combobox which notified subscribers about which items are under the mouse and when this changes.\n    /// </summary>\n    /// <remarks>\n    /// Pay attention to call this type explicitly and not use it as a cast <see cref=\"ComboBox\"/>. \n    /// Indeed, the <see cref=\"Items\"/>, <see cref=\"SelectedItem\"/> and <see cref=\"SelectedIndex\"/> properties are not overriden, \n    /// they're declared with <c>new</c>.\n    /// </remarks>\n    public sealed class DropDownMouseMoveComboBox : CustomComboBox\n    {\n        #region Private Class 'CustomListBox'\n\n        /// <summary>\n        /// A custom <see cref=\"ListBox\"/> being shown within the dropdown form representing the dropdown list.\n        /// </summary>\n        private sealed class CustomListBox : ListBox\n        {\n            public event EventHandler<DropDownMouseMoveEventArgs> DropDownMouseMove;\n\n            /// <summary>\n            /// Constructor.\n            /// </summary>\n            public CustomListBox()\n            {\n                SelectionMode = SelectionMode.One;\n                HorizontalScrollbar = true;\n                IntegralHeight = false;\n            }\n\n            /// <summary>\n            /// Intercepts the keyboard input, [Enter] and [Esc] confirms a selection.\n            /// </summary>\n            /// <param name=\"e\">The Key event arguments</param>\n            protected override void OnKeyDown(KeyEventArgs e)\n            {\n                base.OnKeyDown(e);\n\n                if (e.KeyCode != Keys.Enter && e.KeyCode != Keys.Escape)\n                    return;\n\n                // Enact selection.\n                ((Dropdown)Parent).ForceDeactivate(new CustomComboBoxEventArgs(true));\n                e.Handled = true;\n            }\n\n            /// <summary>\n            /// On mouse move, we notify the subscribers of <see cref=\"DropDownMouseMove\"/>.\n            /// </summary>\n            /// <param name=\"e\"></param>\n            protected override void OnMouseMove(MouseEventArgs e)\n            {\n                base.OnMouseMove(e);\n                int index = IndexFromPoint(e.Location);\n                if (index < 0)\n                    return;\n\n                DropDownMouseMove?.ThreadSafeInvoke(this, new DropDownMouseMoveEventArgs(Items[index], e.Location));\n            }\n\n            /// <summary>\n            /// On click, closes the dropdown.\n            /// </summary>\n            /// <param name=\"e\"></param>\n            protected override void OnClick(EventArgs e)\n            {\n                base.OnClick(e);\n                // Enact selection.\n                ((Dropdown)Parent).ForceDeactivate(new CustomComboBoxEventArgs(true));\n            }\n        }\n\n        #endregion\n\n\n        public event EventHandler<DropDownMouseMoveEventArgs> DropDownMouseMove;\n        private CustomListBox m_listBox;\n        private string m_displayText;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public DropDownMouseMoveComboBox()\n        {\n            // Default value separator.\n            Cursor = Cursors.Default;\n            DropDownStyle = ComboBoxStyle.DropDownList;\n            DrawMode = DrawMode.OwnerDrawFixed;\n            DrawItem += ToolTipComboBox_DrawItem;\n        }\n\n        /// <summary>\n        /// Create the popup's content\n        /// </summary>\n        /// <returns>The control to add to the popup</returns>\n        protected override Control CreateContent()\n        {\n            CustomListBox tempListBox = null;\n            try\n            {\n                tempListBox = new CustomListBox();\n                tempListBox.DropDownMouseMove += listBox_DropDownMouseMove;\n                tempListBox.SelectedIndexChanged += listBox_SelectedIndexChanged;\n                tempListBox.BorderStyle = BorderStyle.None;\n                tempListBox.Dock = DockStyle.Fill;\n                tempListBox.FormattingEnabled = true;\n                tempListBox.Location = new Point(0, 0);\n                tempListBox.Name = \"listBox\";\n                tempListBox.Size = new Size(47, 15);\n                tempListBox.TabIndex = 0;\n\n                m_listBox = tempListBox;\n                tempListBox = null;\n            }\n            finally\n            {\n                tempListBox?.Dispose();\n            }\n            return m_listBox;\n        }\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            m_listBox.Dispose();\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Gets the list of items.\n        /// </summary>\n        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]\n        [Editor(\n            \"System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\"\n            , typeof(UITypeEditor))]\n        public new ListBox.ObjectCollection Items => m_listBox.Items;\n\n        /// <summary>\n        /// Gets or sets the selected item.\n        /// </summary>\n        [Browsable(false)]\n        public new object SelectedItem\n        {\n            get { return m_listBox.SelectedItem; }\n            set { m_listBox.SelectedItem = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets the selected index.\n        /// </summary>\n        [Browsable(false)]\n        public new int SelectedIndex\n        {\n            get { return m_listBox.SelectedIndex; }\n            set { m_listBox.SelectedIndex = value; }\n        }\n\n        /// <summary>\n        /// On selection, updates the list box selection.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnSelectionChangeCommitted(EventArgs e)\n        {\n            base.OnSelectionChangeCommitted(e);\n            m_listBox.SelectedItem = SelectedItem;\n        }\n\n        /// <summary>\n        /// Gets the text to display.\n        /// </summary>\n        /// <returns></returns>\n        public override string GetTextValue() => m_listBox.SelectedItem?.ToString() ?? string.Empty;\n\n        /// <summary>\n        /// When the drop down is closed, we hide the tooltip.\n        /// </summary>\n        /// <param name=\"validate\"></param>\n        protected override void OnDropDownDeactivated(bool validate)\n        {\n            // Set the text portion equal to the string comprising all checked items (if any, otherwise empty!).\n            m_displayText = GetTextValue();\n            Invalidate();\n        }\n\n        /// <summary>\n        /// On drop down activation. Nothing to do but the base method was abstract.\n        /// </summary>\n        protected override void OnDropDownActivated()\n        {\n        }\n\n        /// <summary>\n        /// When the mouse moves over a drop down item, we fire the event.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"DropDownMouseMoveEventArgs\"/> instance containing the event data.</param>\n        private void listBox_DropDownMouseMove(object sender, DropDownMouseMoveEventArgs e)\n        {\n            DropDownMouseMove?.ThreadSafeInvoke(sender, e);\n        }\n\n        /// <summary>\n        /// When the list box selection changes, we update the combo text.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void listBox_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            m_displayText = GetTextValue();\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Draws the item that appears on the textbox.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void ToolTipComboBox_DrawItem(object sender, DrawItemEventArgs e)\n        {\n            // Background\n            using (Brush backBrush = new SolidBrush(BackColor))\n            {\n                e.Graphics.FillRectangle(backBrush, e.Bounds);\n            }\n\n            // Display text\n            if (!string.IsNullOrEmpty(m_displayText))\n            {\n                using (Brush foreBrush = new SolidBrush(ForeColor))\n                {\n                    const int Offset = 3;\n                    Size size = e.Graphics.MeasureString(m_displayText, Font).ToSize();\n                    Rectangle rect = new Rectangle(Offset, (Bounds.Height - size.Height) / 2, e.Bounds.Width - Offset,\n                        size.Height);\n                    e.Graphics.DrawString(m_displayText, Font, foreBrush, rect, StringFormat.GenericTypographic);\n                }\n            }\n\n            // Focus rect\n            e.DrawFocusRectangle();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/EVEMonForm.Designer.cs",
    "content": "namespace EVEMon.Common.Controls\n{\n    partial class EVEMonForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EVEMonForm));\n            this.SuspendLayout();\n            // \n            // EVEMonForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(292, 266);\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.Name = \"EVEMonForm\";\n            this.Text = \"EVEMon\";\n            this.ResumeLayout(false);\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/EVEMonForm.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// This base class provides the common icon shared by all of our forms, along with an optional position storing service.\n    /// </summary>\n    public partial class EVEMonForm : Form\n    {\n        protected const int MaxTitleLength = 259;\n\n        private bool m_loaded;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        protected EVEMonForm()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Gets or sets a key used to store and restore the position and size of the window. When null or empty, the position won't be persisted.\n        /// </summary>\n        [Category(\"Behavior\")]\n        [Description(\n            \"A key used to store and restore the position and size of the window. When null or empty, the position won't be persisted.\"\n            )]\n        protected string RememberPositionKey { get; set; }\n\n        /// <summary>\n        /// On load, restores the window rectangle from the settings.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            RestoreLocation();\n            m_loaded = true;\n            SaveLocation();\n        }\n\n        /// <summary>\n        /// On closing, stores the window rect.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosed(FormClosedEventArgs e)\n        {\n            base.OnFormClosed(e);\n\n            SaveLocation();\n        }\n\n        /// <summary>\n        /// When the size changes, stores the window rect.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnSizeChanged(EventArgs e)\n        {\n            base.OnSizeChanged(e);\n\n            SaveLocation();\n        }\n\n        /// <summary>\n        /// When the location changes, stores the window rect.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLocationChanged(EventArgs e)\n        {\n            base.OnLocationChanged(e);\n\n            SaveLocation();\n        }\n\n        /// <summary>\n        /// Saves the window rect to the settings when the key is not null or empty.\n        /// </summary>\n        private void SaveLocation()\n        {\n            if (!m_loaded)\n                return;\n\n            if (string.IsNullOrEmpty(RememberPositionKey))\n                return;\n\n            Rectangle r = new Rectangle(Location, Size);\n            if (WindowState == FormWindowState.Normal && VerifyValidWindowLocation(r) == r)\n                Settings.UI.WindowLocations[RememberPositionKey] = (WindowLocationSettings)new Rectangle(Location, Size);\n        }\n\n        /// <summary>\n        /// Restores the window rect from the settings when the key is not null or empty.\n        /// </summary>\n        private void RestoreLocation()\n        {\n            if (string.IsNullOrEmpty(RememberPositionKey))\n                return;\n\n            List<Form> formList = Application.OpenForms.Cast<Form>().Where(form => form.GetType() == GetType()).ToList();\n\n            if (!Settings.UI.WindowLocations.ContainsKey(RememberPositionKey))\n                return;\n\n            Rectangle r = (Rectangle)Settings.UI.WindowLocations[RememberPositionKey];\n            if (formList.Count > 1)\n            {\n                Point pfl = formList[formList.Count - 2].Location;\n                r.Location = new Point(pfl.X + 20, pfl.Y + 20);\n            }\n\n            r = VerifyValidWindowLocation(r);\n            SetBounds(r.X, r.Y, r.Width, r.Height);\n        }\n\n        /// <summary>\n        /// Verify the window location is valid and resets it when necessary.\n        /// </summary>\n        /// <param name=\"inRect\">The proposed rectangle.</param>\n        /// <returns>The corrected rectangle.</returns>\n        private Rectangle VerifyValidWindowLocation(Rectangle inRect)\n        {\n            Point p = inRect.Location;\n            Size s = inRect.Size;\n            s.Width = Math.Max(s.Width, MinimumSize.Width);\n            s.Height = Math.Max(s.Height, MinimumSize.Height);\n\n            foreach (Screen ts in Screen.AllScreens)\n            {\n                if (ts.WorkingArea.Contains(inRect))\n                    return inRect;\n\n                if (!ts.WorkingArea.Contains(p))\n                    continue;\n\n                p.X = ts.WorkingArea.Left + 50;\n                p.Y = ts.WorkingArea.Top + 100;\n                return new Rectangle(p, s);\n            }\n\n            p.X = Screen.PrimaryScreen.WorkingArea.X + 5;\n            p.Y = Screen.PrimaryScreen.WorkingArea.Y + 5;\n            return new Rectangle(p, s);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/EVEMonForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAUAgIAAAAEAIAAoCAEAVgAAAEBAAAABACAAKEIAAH4IAQAwMAAAAQAgAKglAACmSgEAICAAAAEA\n        IACoEAAATnABABAQAAABACAAaAQAAPaAAQAoAAAAgAAAAAABAAABACAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        ABEAAABaAAAAnAAAAMsAAADtAAAA8QAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADxAAAA2wAAAK4AAAB1AAAAKQAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAACGAAAA5QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAArwAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAABtAAAA7AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAKcAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAYAAAAuAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOgAAABKAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAM8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPkAAABaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAACwAAADaAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEB\n        Af8AAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAH/AAAB/wAAAP8AAAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAH/AAAB/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        APsAAABuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbAAAA1gAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/EwMA/z8MAP9iEwD/cRUA/3EVAP9yFgD/cxYA/3QWAP9zFgD/dRYA/3kX\n        AP95FwD/ehcA/4IbA/+IIQn/fxcA/4AZAP99GAD/ghkA/4UZAP+HGgD/ihoA/4oaAP+MGgD/jhsA/48b\n        AP+PGwD/kRwA/5AcAP+THAD/lx0A/5cdAP+WHAD/lxwA/5kdAP+bHQD/nB0A/5sdAP+cHgH/mR8D/3oY\n        AP93FwD/dxcA/3YXAP95FwD/excA/3oXAP94FwD/iBsB/5skCf+aJAn/mR4D/5YbAP+XHAD/lRwA/5Yd\n        AP+YHQD/lxwA/5gcAP+XHAD/lx0A/5ceAf+YHgL/mB4D/5geA/+XHwP/lx8D/5YgBP+WIAT/liEG/5Yi\n        B/+WIgf/liMJ/5YjCP+WIwn/lSMJ/5UkCf+VJQv/lSgO/5UsE/+VLRb/lC4W/5QvF/+UKA//lCcN/5Qq\n        Ef+UKRD/kyUL/5MlC/+TJw//kyYM/5MtFf+TMRv/kzUf/5I1H/+SMx3/kioR/5MqEv+NKRL/Zx4N/zEO\n        Bv8CAQD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABaAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAK8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EAMA/1MQAP+IGgD/mR4A/5se\n        AP+aHgD/mh4A/5seAP+cHgD/nB4A/54eAP+iHgD/piAA/6cgAP+qIAD/riIB/68kA/+uIQD/tCIA/7Mi\n        AP+1IgD/uSMA/7wkAP+9JAD/viUA/8IlAP/CJQD/xSYA/8snAP/HJgD/yCYA/80nAP/PKAD/0CgA/9Eo\n        AP/RKAD/1ikA/9spAP/cKQD/2ykA/+MsAf+6JQL/mx0A/6EeAP+iHwD/nh4A/6MfAP+kHwD/oh8A/6Uf\n        AP+nIAD/vSUC/98xCP/iMwv/2isD/80nAP/OKAD/0SgA/9EoAP/TKAD/1igA/9IoAP/QKAD/zygA/9Yp\n        Af/XKQH/1ykB/9wqAf/bKwP/2y0E/9stBP/bLgb/2i8G/9ovCP/aMAn/2jAJ/9owCv/aMgv/2TcR/9k7\n        F//ZPhr/2UAd/9g9Gf/YOBP/2DQO/9gwCv/XMQr/1zEK/9cyDP/XMQz/1zEL/9c2D//WPhv/1j4a/9U8\n        GP/VTCv/1Ukp/9VMK//VPRn/1DkW/9U7GP/YPBj/zDgW/5kqEP83EAb/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAOwAAAAuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/yEGAP92FgD/jRsA/4kaAP+GGgD/hxoA/4caAP+HGgD/ihsA/4wbAP+LGwD/jBsA/44b\n        AP+QGwD/lB0A/5kdAP+bHQD/mx0A/5weAP+dHgD/nx4A/6EfAP+jHwD/pSAA/6cgAP+sIQD/rSEA/60h\n        AP+uIgD/sSIA/7EiAP+0IgD/uCMA/7gjAP+6IwD/uyQA/70kAP/BJQD/xCYA/8ElAP/IJgD/vCQA/4ca\n        AP+KGgD/jRsA/4oaAP+KGgD/iRoA/40bAP+NGwD/kRwA/5IcAP+RGwD/ox8A/80sB//bMAj/zCcA/7ci\n        AP+8JAD/wSUA/8kmAP/GJgD/wiUA/74kAP/AJQD/xyYA/8YmAP/HJgD/0icA/9MoAP/TKQL/0ykC/9Mp\n        Av/SKgP/0SoC/9EqA//RLQf/0TIO/9E2Ev/RORX/0TkV/9E1Ef/QMAv/0CsG/9AqA//QKgT/zysF/88s\n        Bv/OKwb/ziwH/84tCP/OLAf/zjIN/85CIf/OORb/zjQR/81EJP/NRSX/zUkq/80+HP/MNhP/zDgV/8w4\n        Fv/NOBb/1TsY/887F/9nHQv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAL0AAAABAAAAAAAA\n        AAAAAAAAAAAAGQAAAN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8kBwD/cxYA/34ZAP96GAD/ehcA/3wY\n        AP99GAD/fRgA/34YAP9/GQD/gxkA/4MZAP+FGgD/hRoA/4YZAP+KGwD/jRsA/48cAP+PHAD/lBwA/5Qc\n        AP+WHAD/mR0A/5kdAP+ZHQD/nh4A/6IfAP+hHwD/ox8A/6MfAP+kHwD/piAA/6shAP+sIQD/qyEA/68i\n        AP+wIgD/sSIA/7YjAP+6JAD/uSMA/7wjAP+EGQD/eBcA/3sYAP98GAD/fRgA/30YAP+CGQD/ihsA/4IZ\n        AP+JGgD/ihsA/4obAP+HGgD/kRsA/8MoBP/dLgX/zCYA/60hAP+yIgD/uSQA/7UjAP+yIgD/ryEA/7Qi\n        AP+4IwD/uiMA/8AlAP/EJgD/zScA/9MpAf/SKAH/0CcA/9AnAP/RKQL/0i0I/9IzDv/TNxL/0zQP/9Ew\n        Cv/NKgT/zCcB/84mAP/QJwD/0CgB/9ApAv/QKgT/0CoE/9ArBP/PKwT/zysF/84rBf/ONBD/zkMi/846\n        F//OMg3/zkEh/85EJP/OSCn/zT0c/802Ev/NNhT/zTcU/8w3FP/MNxT/zzcU/9U5FP94IAv/BAEA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF0AAAAAAAAAAAAAAAAAAAB3AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/GwUA/2wVAP9zFgD/bxYA/3EWAP9vFgD/chYA/3QWAP90FgD/dxcA/3kXAP95FwD/excA/34Y\n        AP9+GAD/fhgA/4MZAP+HGgD/hhoA/4gaAP+MGwD/ixsA/4wcAP+OHAD/jxwA/5McAP+YHQD/mR0A/5kd\n        AP+cHQD/mx0A/5wdAP+gHgD/oB4A/6EeAP+jHwD/pyAA/6kgAP+rIQD/rSEA/60iAP+0IwD/jRsA/2wV\n        AP9wFgD/bxYA/3EWAP90FgD/cRYA/30YAP96GAD/dxcA/3sYAP+AGAD/gBgA/4QaAP+CGQD/hhkA/7gl\n        A//ZLQb/pCAA/5weAP+dHgD/oB8A/6IfAP+iHwD/pB8A/6YgAP+pIAD/riEA/7AiAP+1IwD/uSMA/7wj\n        AP/AJQD/0SwG/9QxC//VMw7/1DIM/84rBf/IJwH/xiUA/8QkAP/IJgD/zScA/88nAP/RJwD/0CcA/9Ao\n        Af/RKAL/0CgC/9ApAv/QKQL/0CkC/880EP/PQB//zjsY/84vCf/ONhP/zkIh/85DI//ONRL/zjEN/84y\n        Df/NMw//zTMP/800D//NMxD/zjQR/9o4Ev9zHgr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAywAA\n        AAQAAAAAAAAABwAAANIAAAD/AAAA/wAAAP8AAAD/AAAA/wYBAP9aEQD/bhUA/2oUAP9rFAD/axQA/2oU\n        AP9sFQD/bhUA/2wVAP9uFgD/cBYA/3AWAP9zFgD/dRYA/3UWAP93FgD/ehcA/3wYAP99GAD/fxgA/4MZ\n        AP+CGQD/ghgA/4YaAP+HGgD/ixsA/48bAP+OGwD/kBwA/5McAP+RHAD/kx0A/5cdAP+YHQD/mh0A/50e\n        AP+fHgD/nh4A/6IfAP+mHwD/qiAA/5gdAP9lEwD/ZhMA/2oUAP9sFQD/bhYA/2kUAP9vFQD/dBcA/28V\n        AP9wFgD/cRYA/3UWAP94FwD/eRcA/3kXAP94FwD/ehcA/6YgAf+UHQD/jBsA/44bAP+THAD/lh0A/5oe\n        AP+dHgD/nx8A/6EfAP+lHwD/pSAA/6cgAP+oIAD/sCEA/7okAP/WMAn/0S8I/8MoBP+3IwD/sCEA/7Ih\n        AP+4IwD/uiMA/78kAP++JAD/wSUA/8gmAP/DJQD/xCUA/8YlAP/JJgD/yiYA/8kmAP/OJwD/0DUR/9A9\n        Gv/QORX/zzcU/884FP/OPh3/zkAg/84wDP/OLwv/zjEM/84wDP/OMAz/zjEM/80xDf/NMQ3/zzIN/9Q0\n        D/9AEAT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAARwAAAAAAAAA/AAAA/gAAAP8AAAD/AAAA/wAA\n        AP8AAAD/MAkA/2kUAP9jEwD/ZxMA/2YTAP9nEwD/ZxMA/2cUAP9pFAD/aRQA/2sUAP9qFAD/ahUA/2sV\n        AP9sFQD/bRUA/28VAP9wFQD/chUA/3YWAP94FwD/eBcA/3oYAP98GAD/fhgA/38YAP+EGQD/hhoA/4ca\n        AP+KGwD/jBsA/4sbAP+NGwD/kRwA/5McAP+UHQD/lh0A/5YdAP+XHQD/mx0A/58eAP+aHQD/ZhMA/3AV\n        AP9sFAD/ZBIA/2YTAP9rFAD/YhMA/28WAP9pFAD/axUA/2oVAP9sFQD/bhYA/28WAP9zFwD/dxcA/3cX\n        AP92FgD/cxYA/3kXAP94FwD/excA/4IYAP+FGQD/hBkA/4gaAP+LGwD/ixsA/4wbAP+OGwD/jhsA/5Qc\n        AP+ZHQD/pB8A/7QiAP+gHgD/mh0A/58eAP+lIAD/qCAA/6ogAP+pIQD/ryEA/7IhAP+7JAD/wCUA/7Ui\n        AP+8JAD/viQA/78kAP/CJQD/wSQA/8YlAP/RNRH/0T0a/9A2Ev/QPBr/0DgV/9A9Gv/PPRr/zy8K/84u\n        Cv/OLwv/zi8L/84vC//OLwv/zjAM/84wC//OMAz/1jIN/6koCv8FAQD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACUAAAAAgAAAH8AAAD/AAAA/wAAAP8AAAD/AAAA/wUBAP9VEQD/YxQA/2ATAP9iEwD/YxMA/2MT\n        AP9jEwD/ZBMA/2UTAP9mEwD/ZhMA/2cTAP9oFAD/aBQA/2oVAP9qFQD/ahUA/2wVAP9sFQD/bxUA/3QX\n        AP92FwD/dhYA/3cXAP94FwD/eBcA/3sXAP9/GAD/gBkA/4MZAP+EGQD/hBkA/4gaAP+MGwD/jBsA/48c\n        AP+RHAD/kRwA/5MdAP+YHQD/mx0A/3AVAP9dEQD/bxUA/2ITAP9eEgD/XhIA/1wRAP9nFAD/aBQA/2MS\n        AP9mEwD/ZRMA/2YTAP9pFAD/axQA/24VAP9wFgD/chYA/28WAP9uFgD/cRYA/3EWAP92FwD/ehcA/3kX\n        AP97FwD/ehcA/3wXAP97FwD/fRgA/4MZAP+DGgD/hhoA/4caAP+JGgD/iRsA/5EcAP+ZHQD/mh0A/5we\n        AP+cHQD/nR0A/6MfAP+nIAD/qiEA/7UiAP+wIgD/qiAA/7UjAP+3IwD/tiMA/7cjAP+6JAD/wSUA/9E1\n        EP/ROxj/0TQQ/9E7GP/RORb/0DwZ/9A7GP/QLgn/0C4I/88tCP/PLgj/zi4I/84uCf/OLgn/zi8L/84v\n        C//PMAz/1TMM/0UQBP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANQAAAAtAAAArQAAAP8AAAD/AAAA/wAA\n        AP8AAAD/HAUA/2ATAP9fEgD/XxIA/2ATAP9hEwD/YRMA/2ETAP9hEwD/YhMA/2QTAP9lEwD/ZRMA/2UT\n        AP9mEwD/ZhMA/2cUAP9pFAD/ahUA/2oVAP9qFQD/bxYA/3EWAP9zFgD/dBYA/3QWAP92FgD/dxcA/3kY\n        AP98GAD/fxgA/4AYAP+CGAD/gxkA/4caAP+HGgD/jBsA/44bAP+OGwD/khwA/5oeAP9/GQD/VBAA/1kS\n        AP9aEgD/VhEA/1gSAP9ZEgD/XBIA/2QTAP9cEgD/XRIA/2ESAP9fEgD/YRIA/2MSAP9jEgD/ZBMA/2cU\n        AP9pFAD/bhYA/20VAP9qFQD/bRYA/28WAP9wFgD/cBYA/3MWAP92FgD/eBcA/3sXAP98FwD/fxgA/4EZ\n        AP9/GAD/gRkA/4caAP+LGwD/jBsA/40bAP+PGwD/kxwA/5YdAP+YHQD/mh0A/50dAP+iHwD/qSEA/6Ug\n        AP+jIAD/sSIA/6whAP+xIgD/tyQB/68hAP/BJQD/0zUQ/9E2Ef/RMg3/0TkW/9E6F//ROxn/0TgV/9Es\n        B//QLAf/0CwH/9AsB//QLAf/zy0I/88sB//OLAj/zi4I/84uCf/aMgv/hB4G/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA9QAAAFQAAADPAAAA/wAAAP8AAAD/AAAA/wAAAP8vCQD/YRMA/1wSAP9cEgD/XRIA/14S\n        AP9eEgD/YBMA/18TAP9gEwD/YRMA/2ITAP9jEwD/YxMA/2QTAP9lEwD/ZRMA/2YTAP9mEwD/aBQA/2gU\n        AP9sFQD/bhYA/3IWAP9yFgD/cRYA/3QWAP92FgD/dxcA/3oYAP96GAD/exgA/38YAP+AGAD/gxkA/4MZ\n        AP+GGgD/hxoA/4caAP+PGwD/hxoA/1UQAP9SEAD/UxAA/1EQAP9TEAD/UhAA/1QRAP9eEgD/WBEA/1MR\n        AP9WEgD/WBIA/1gSAP9eEgD/XxIA/18SAP9hEgD/YxIA/2YUAP9pFAD/ZhMA/2cTAP9rFQD/ahUA/2oV\n        AP9sFQD/bhYA/28WAP9wFgD/cxcA/3YXAP95FwD/ehcA/3kXAP+CGQD/gBkA/34YAP9+GAD/ghkA/4ca\n        AP+MGwD/jxsA/5EcAP+SHAD/lhwA/5sdAP+jHwD/nh4A/6AeAP+hHwD/oyAA/6ghAf/CKAT/rSAA/8Em\n        Av/VNRD/0jUQ/9IzDv/RNhL/0TgU/9E4FP/RMw7/0SsE/9EsBf/RLAX/0SwF/9AsBv/QLAb/0CsG/9At\n        B//PLQj/zy0I/9QuCP+yJwf/CAIA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAegAAAOUAAAD/AAAA/wAA\n        AP8AAAD/AAAA/zoMAP9fEwD/WhIA/1oSAP9bEgD/WxIA/10SAP9eEgD/XhIA/14SAP9gEwD/YBMA/2AT\n        AP9hEwD/YhMA/2UTAP9lEwD/ZRMA/2UTAP9nFAD/aBQA/2oUAP9pFAD/bBUA/2sVAP9sFQD/cxYA/3MW\n        AP90FgD/dxcA/3gXAP95GAD/fBgA/3sYAP9+GAD/gBgA/4MZAP+EGQD/iRoA/4UaAP9hEgD/Sw4A/0wO\n        AP9ODwD/TQ8A/04PAP9NDwD/UxAA/1gRAP9PDwD/UQ8A/1MQAP9UEQD/VBEA/1sSAP9cEgD/XRIA/18S\n        AP9gEgD/ZRMA/2ITAP9gEgD/ZRMA/2YTAP9kEwD/YxMA/2YTAP9oFAD/bBUA/28WAP9uFgD/bxYA/3IW\n        AP9xFgD/dRYA/38YAP94FwD/eRcA/3sXAP98GAD/gRkA/4MaAP+HGgD/iRsA/4obAP+LGwD/lx0A/50e\n        AP+VHQD/lx0A/5sdAP+fHgD/oR8A/6IfAP+iHwD/vyYC/9YzDf/TNQ//0zQP/9M1D//SNhH/0jYR/9Ew\n        C//RKgP/0SsE/9ErBP/RKwT/0SsE/9EsBP/RLAX/0CwH/9AsCP/QLAf/0y0H/8cqBv8WBQH/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACUAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/PwwA/1sSAP9ZEgD/WhIA/1oS\n        AP9aEgD/WxIA/1wSAP9cEgD/XhIA/14SAP9eEgD/XhIA/2ATAP9gEwD/YRMA/2ETAP9iEwD/ZRMA/2UT\n        AP9nFAD/aBQA/2kUAP9pFAD/aBQA/2oVAP9rFQD/bhUA/3IWAP91FgD/dxcA/2kUAP9eEwD/axQA/34Y\n        AP+AGAD/hBkA/30YAP9oFAD/VBAA/0sOAP9LDgD/Sg4A/0oOAP9LDgD/Sw4A/00PAP9WEQD/Tg8A/0oO\n        AP9NDwD/UA8A/08PAP9READ/VxEA/1cRAP9XEgD/XBIA/14SAP9gEgD/WhIA/1wSAP9gEgD/XhIA/2AS\n        AP9gEgD/YRIA/2ISAP9kEwD/ZxQA/2kUAP9qFAD/bRUA/2sVAP90FgD/excA/3MWAP92FwD/eRcA/3oX\n        AP99FwD/fBgA/34YAP+CGQD/gRgA/4YaAP+SHAD/khwA/4wbAP+QHAD/lBwA/5ccAP+bHQD/nB0A/5wd\n        AP/BKAT/1i4H/9QzDf/TMw7/0zIM/9MyDP/TMg3/0zAL/9IqA//SKgP/0SwG/9EtCP/RKgP/0SsE/9Er\n        BP/RLQf/0S0H/9EtCP/TLgj/yiwI/yQIAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAKEAAADwAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8+DAD/WxIA/1cRAP9ZEgD/WhIA/1oSAP9aEgD/WhIA/1oSAP9bEgD/XhIA/14S\n        AP9eEgD/XhIA/2ATAP9hEwD/YRMA/2ETAP9hEwD/ZRMA/2UTAP9mEwD/aBQA/2kUAP9pFAD/aRQA/2kU\n        AP9sFQD/chYA/2wVAP9hEwD/XhMA/2UTAP9/GAD/gRkA/3sXAP9mFAD/Tw8A/0gNAP9LDgD/SA4A/0kO\n        AP9JDgD/SQ4A/0kOAP9IDgD/UhAA/1EQAP9LDgD/Sg4A/0wOAP9MDgD/TQ8A/00PAP9TEAD/UhAA/1UR\n        AP9aEgD/XRIA/1gRAP9UEQD/WxIA/1wSAP9iEwD/YhMA/2UTAP9lEwD/ZBMA/2QTAP9lEwD/YxMA/2MT\n        AP9mEwD/ZxQA/3UXAP91FwD/bhYA/28WAP9yFgD/dBYA/3MWAP92FgD/excA/30YAP97FwD/gBgA/4ka\n        AP+IGgD/hxoA/4wbAP+NGwD/kBwA/5EcAP+UHAD/lxwA/8YpBf/KKAL/wicD/9cwCv/TLwr/0y8J/9Mw\n        Cv/TMQz/0y0H/9MrBP/UMQv/0i4I/9IrBP/RKwT/0SsE/9EsBf/RLAb/0S0G/9QuB//LKwb/JAcB/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/z4MAP9bEgD/VxEA/1cR\n        AP9ZEgD/WxIA/1sSAP9aEgD/WhIA/1oSAP9eEgD/XhIA/14SAP9eEgD/YRMA/2ETAP9hEwD/YRMA/2ET\n        AP9mEwD/ZhMA/2UTAP9nFAD/aRQA/2kUAP9qFAD/aRQA/28VAP9qFAD/Qw4A/1oRAP9uFQD/cxYA/5oe\n        AP+IGgD/XhIA/0cOAP9LDgD/Sw4A/0MOAP9NDwD/Rw4A/0YOAP9HDgD/Rg4A/0wPAP9SEAD/Rw4A/0cO\n        AP9JDgD/TQ4A/00OAP9NDwD/Tg8A/1EQAP9READ/VREA/1YRAP9XEQD/ZBQA/1kRAP9bEgD/WxIA/10S\n        AP9hEgD/YhMA/2MTAP9kEwD/ZRMA/2gUAP9nFAD/YxMA/2MTAP9lEwD/dBYA/20VAP9pFQD/axUA/20W\n        AP9wFgD/bxYA/3AWAP93FgD/eRcA/3kXAP+AGQD/hxoA/4MZAP+CGQD/hhoA/40bAf+HGgD/iBoA/40b\n        AP+XHAD/0SsE/78lAf+fHgD/xygD/9gwCf/ULwn/0y8K/9MwC//UMQv/1DYR/8EoBf/NKgX/0C4I/9Qt\n        B//SKgT/0ioE/9ErBP/RLAX/1C0G/8srBf8kBwH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/PgwA/1sSAP9XEQD/VxEA/1kSAP9bEgD/WxIA/1sSAP9bEgD/XBMA/14T\n        AP9fEwD/XxMA/14SAP9gEgD/YhMA/2ITAP9hEwD/YRMA/2YTAP9mEwD/ZhMA/2cUAP9pFAD/aRQA/2oU\n        AP9sFQD/axQA/0gOAP9IDgD/cxYA/4QZAP+XHQD/nB4A/2wVAP9KDwD/TQ8A/0kPAP9CDgD/QQ0A/0YO\n        AP9BDgD/Qg4A/0IOAP9GDgD/Tw8A/0oPAP9GDgD/SA4A/0oOAP9LDgD/Sw4A/0sOAP9NDgD/TQ4A/0wO\n        AP9TEAD/VBEA/10SAP94FwD/VhEA/1gSAP9XEgD/VhEA/1gSAP9ZEgD/WxIA/1wSAP9hEgD/YRIA/2ES\n        AP9iEwD/YRIA/2cUAP9wFgD/aRQA/2YUAP9oFAD/bBUA/24WAP9yFgD/cxYA/3MWAP91FwD/dxcA/38Y\n        AP+EGgD/fhgA/38YAP+AGAD/lB4D/4kbAf+EGQD/hxoA/5UcAP/UKgP/uCMB/5gdAP+aHQD/uyYD/9gv\n        CP/WLgf/1S4H/88rBP/NKwX/sSIA/8ooAv/BJQH/xCkF/9IsBv/TKwT/0ywF/9IsBf/VLQX/yysF/yMH\n        Af8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8/DAD/XBIA/1cR\n        AP9XEQD/WxIA/1sSAP9bEgD/WxIA/1sSAP9dEwD/XxMA/18TAP9fEwD/XxMA/2ETAP9iEwD/YhMA/2MT\n        AP9lEwD/ZhMA/2YTAP9mEwD/ZhMA/2oUAP9qFAD/ahQA/20VAP9VEQD/SQ4A/28WAP+DGQD/lx0A/48c\n        AP96GAD/SQ8A/0oPAP9LDwD/RA4A/z8NAP9BDgD/Qg4A/0YOAP9ADQD/QA0A/0kOAP9JDgD/RQ4A/0MO\n        AP9DDgD/SQ4A/0gOAP9HDgD/Rg4A/0oOAP9MDgD/TQ8A/1QQAP9MDgD/chYA/2YUAP9TEAD/VhEA/1YR\n        AP9YEQD/WBIA/1kSAP9cEgD/XBIA/18SAP9iEgD/YRIA/2ASAP9eEgD/aBQA/2sUAP9lEwD/ZhMA/2QT\n        AP9lFAD/bBUA/20VAP9yFgD/cRYA/28WAP9xFgD/fRcA/34YAP95FwD/fBcA/34YAP9+GAD/gxkA/40b\n        AP+DGQD/lh0A/80oAf+lHwD/lh0A/5cdAP+RHAD/qSEB/9ArBP/WLAT/zScB/6MeAP+dHgD/uyQB/7oj\n        AP+1IwH/zy0H/9QrBP/TLAX/0y0G/9YtB//NLAf/IwgB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAA\n        APAAAAD/AAAA/wAAAP8AAAD/AAAA/z8MAP9cEgD/WBEA/1gRAP9bEgD/WxIA/1sSAP9bEgD/WxIA/10T\n        AP9fEwD/XxMA/18TAP9fEwD/YRQA/2MUAP9iEwD/YxMA/2QTAP9kEwD/ZhMA/2YTAP9mEwD/aRQA/2oU\n        AP9sFAD/WxIA/0UNAP9FDgD/dhcA/5QdAP9jEwD/QQ0A/0oPAP9GDgD/RQ4A/0INAP8+DQD/QQ0A/0AN\n        AP9ADQD/QQ0A/z8NAP9EDgD/Sw8A/0ANAP89DAD/Qg4A/0UOAP9IDgD/SQ4A/0gOAP9JDgD/SQ4A/0sO\n        AP9QDwD/TQ8A/1APAP9yFgD/UQ8A/1UQAP9XEQD/VhEA/1cRAP9WEQD/VxIA/1cSAP9XEgD/WRIA/1wS\n        AP9eEgD/WxIA/1wSAP9qFAD/ZxQA/2ISAP9jEgD/YhIA/2QTAP9oFAD/aRQA/2wVAP9vFQD/bhUA/28W\n        AP94FwD/eRcA/3IXAP95FwD/ehcA/3cWAP+MGwH/mh8C/3QVAP+bHgH/xygD/5YcAP+VHAD/lx0A/5Uc\n        AP+OGwD/pSAA/9EoAf/RKQL/uCMA/5UcAP+oIAD/tyMA/64jAv/QLwn/1CsD/9MsBf/TLAX/1i4H/80t\n        CP8kCAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/PwwA/1wS\n        AP9YEQD/WBEA/1sSAP9bEgD/WxIA/1sSAP9bEgD/XBIA/1sSAP9cEgD/XxMA/18TAP9hFAD/YxQA/2MU\n        AP9jFAD/YhQA/2MTAP9mEwD/ZxMA/2YTAP9oFAD/axQA/2oUAP9JDgD/Qg0A/0QNAP+AGQD/WxEA/zsL\n        AP8/DQD/RQ4A/0INAP89DAD/PAwA/zwMAP8/DAD/PQwA/z0MAP88DAD/Pw0A/0gOAP9GDgD/Qg4A/0EN\n        AP9ADQD/QQ0A/0EOAP9DDgD/RA4A/0QOAP9HDgD/Sw4A/04PAP9GDgD/ZRQA/2MTAP9MDgD/VBAA/1MQ\n        AP9UEQD/VhEA/1gRAP9XEQD/VhEA/1YRAP9XEQD/WRIA/1wSAP9XEQD/XhIA/2cTAP9jEgD/XRIA/14S\n        AP9iEgD/ZBMA/2QTAP9kEwD/ZhQA/2oUAP9rFAD/bxYA/3YXAP90FgD/bxYA/3QXAP95FwD/eBYA/3wY\n        AP97FwD/dRYA/6QgAf/JKQT/jhsA/48bAP+QGwD/khwA/4obAP+YHQD/ySYA/88nAf+zIgD/kBwA/5oe\n        AP/AJQH/qSEC/9IwCv/VLAT/1CwF/9QtBv/WLwj/zS0I/yQIAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8/DAD/XBIA/1gRAP9YEQD/XBIA/1wSAP9cEgD/WxIA/1sS\n        AP9bEgD/WxIA/10SAP9fEwD/XxMA/2EUAP9jFAD/YxQA/2MUAP9jFAD/ZhQA/2cUAP9nEwD/ZxMA/2oU\n        AP9sFAD/WxEA/0ENAP88DAD/YBIA/1UQAP86CwD/RA4A/0QOAP9BDQD/OwwA/zwMAP87DAD/PAwA/zoL\n        AP88DAD/PAwA/zwMAP89DAD/PwwA/z8NAP9CDgD/RA4A/0MOAP9CDgD/Qw4A/0gPAP9JDwD/Rw4A/0kO\n        AP9ODgD/Sg4A/0sPAP9rFQD/TA4A/0wOAP9MDwD/XBIA/1UQAP9SEAD/UxAA/1URAP9VEQD/VREA/1YR\n        AP9XEQD/VxEA/1cRAP9iEwD/ZhMA/14SAP9YEQD/XhIA/18SAP9gEgD/YBMA/2ISAP9mEwD/ZhMA/2UT\n        AP9tFQD/cxcA/28VAP9tFQD/dBcA/4IZAP9yFgD/dxcA/3MWAP9vFQD/rSEA/8soAf+JGgD/jBsA/44b\n        AP+NGwD/hhoA/5YdAP/GJgD/2SkA/7EiAP+CGQD/jRsA/8cpBP/WLwj/1SwF/9UtBf/VLQX/1S0H/9cv\n        CP/OLQj/JAgB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/z8M\n        AP9cEgD/WBEA/1gRAP9cEgD/XBIA/1wSAP9cEgD/XBIA/1wSAP9bEgD/YBMA/2ATAP9gEwD/YRQA/2MU\n        AP9jFAD/YxQA/2MUAP9nFAD/ZxQA/2cUAP9nFAD/axQA/2oUAP9GDgD/Pw0A/0INAP9hEwD/Qg0A/z8N\n        AP8/DAD/PgwA/zkLAP85CwD/NwsA/zoMAP87DAD/OQsA/zoLAP88DAD/PQwA/zsMAP87DAD/PAwA/z8M\n        AP9ADQD/Qg4A/0ANAP8/DQD/VhEA/0kPAP9EDgD/Rg4A/0oOAP9EDgD/XxMA/2ATAP9FDQD/TA4A/0wO\n        AP9QDwD/Tg8A/08PAP9PDwD/UxAA/1MQAP9TEAD/VBAA/1URAP9XEQD/VxEA/2UTAP9hEwD/WhIA/1gS\n        AP9aEgD/XBIA/14SAP9gEgD/YBIA/2MTAP9jEwD/ZRMA/24VAP9yFgD/bBUA/2wVAP9vFQD/bRUA/28W\n        AP91FwD/cRYA/28VAP+3JQL/2CoC/4kZAP+DGgD/ihsA/4obAP+EGgD/mh0A/8AlAP/KJwH/vSYC/4oa\n        AP+OGwD/uSUC/9sxCv/WLQX/1i0G/9YuB//VLgj/2C8I/88tCP8kCAH/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/QAwA/10SAP9ZEQD/WBEA/1wSAP9cEgD/XBIA/1wS\n        AP9cEgD/XBIA/1wSAP9gEwD/YBMA/2ATAP9iFAD/ZBQA/2QUAP9jFAD/YxQA/2QUAP9oFAD/ZxQA/2cU\n        AP9uFQD/XRIA/z4NAP86DAD/XxIA/2ITAP84CwD/PgwA/zgKAP83CgD/OQsA/zUKAP84CgD/OQsA/zkL\n        AP85CwD/OAsA/zoLAP87DAD/OgsA/0ENAP8/DQD/Pw0A/0ENAP9BDQD/QA0A/0gOAP9XEQD/QQ0A/0QO\n        AP9EDgD/Rg4A/0cOAP9vFQD/Sg8A/0YOAP9LDwD/TA4A/0sOAP9LDgD/TA4A/00OAP9ODwD/Tg8A/1AP\n        AP9RDwD/URAA/1IQAP9WEQD/XBIA/1gRAP9WEQD/WREA/1kSAP9aEgD/XRIA/2ASAP9iEwD/ZBMA/2MS\n        AP9jEgD/ZxMA/2sVAP9oFAD/aBQA/2oUAP9rFQD/bBUA/3AWAP9uFgD/bhQA/7sjAv/gLQP/lx0A/3EV\n        AP97GAD/gRkA/34YAP+cHQD/lRwA/4oaAP+hHwD/mh4A/5IcAP+aHQD/1S0G/9ctBv/WLQX/1i4H/9Yv\n        CP/ZMAn/0C4J/yQIAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAA\n        AP9ADAD/XRIA/1kRAP9ZEQD/XBIA/1wSAP9cEgD/XBIA/1wSAP9cEgD/XBIA/2ATAP9gEwD/YBMA/2IU\n        AP9kFAD/ZhQA/2UUAP9kFAD/aBQA/2gUAP9oFAD/aBQA/28VAP9dEQD/PwwA/z8MAP9+GQD/eRcA/0oO\n        AP83CwD/OQsA/zoLAP82CgD/MwoA/0QNAP9ADAD/OgsA/zwMAP85CwD/PQwA/z8NAP89DAD/PAwA/zwM\n        AP8+DQD/Pw0A/0ENAP8/DQD/YRMA/0sPAP9BDgD/RA4A/0YMAP8+BwD/YQoA/2IIAP85AAD/QwMA/0QG\n        AP9HCwD/Sw4A/0wPAP9MDgD/TA4A/0wOAP9MDgD/Tg8A/08PAP9QDwD/VBAA/1QQAP9UEAD/VBAA/1QQ\n        AP9WEQD/VhEA/1YRAP9ZEgD/XBMA/1wTAP9gEwD/XBMA/18SAP9jEgD/YxMA/2UTAP9lEwD/ZRMA/2YT\n        AP9nFAD/aBQA/2oSAP9wFQT/yDEN/+IrAf+uIQD/bBUA/3MWAP92FwD/cxYA/5IcAP+GGgD/excA/4Ua\n        AP+THAD/kxwA/4YaAP+8JQH/3DIK/9YtBv/WLwj/1i8I/9kwCf/QLgn/JAgB/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0AMAP9dEgD/WREA/1kRAP9cEgD/XBIA/1wS\n        AP9cEgD/XBIA/1wSAP9eEwD/YRMA/2ETAP9iFAD/YxQA/2QUAP9lFAD/ZxQA/2gVAP9jDQD/XgUA/18G\n        AP9fBgD/ZQgA/2MTAP83CwD/WREA/3oXAP9uFAD/RAMA/zcAAP88AAD/LgAA/yQAAP8vBQD/NgsA/zUK\n        AP82CgD/NwsA/zEFAP8sAAD/LwAA/y4AAP8yAgD/OwsA/zwMAP89DAD/OwwA/0sPAP+KGwD/Tw8A/zwI\n        AP86AgD/QgwB/10sH/+iVkT/j2Ra/4doX/+AWlD/az4z/1IaDP9GBgD/RAYA/0sOAP9NDwD/TA8A/0wO\n        AP9NDgD/Tw8A/08QAP9PDAD/SQEA/0gBAP9JAQD/TAMA/1cQAP9ZEgD/WBEA/1oRAP9cEgD/XhMA/2AT\n        AP9kFAD/ZhQA/2MTAP9iEgD/YxIA/2MSAP9lEwD/ZRMA/2cTAP9kDwD/ZAwA/7KEef/lemH/2R8A/7wk\n        AP9vFQD/ahUA/3AWAP9uFgD/iBoA/5IcAP97FwD/gRkA/4gaAP+THAD/iBoA/5IbAP/SMQz/2jEK/9cv\n        CP/XLwj/2TAI/9AuCP8kCAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAA\n        AP8AAAD/QQwA/10SAP9ZEQD/WREA/10SAP9dEgD/XBIA/1wSAP9cEgD/XBIA/18TAP9hEwD/YRMA/2QU\n        AP9kFAD/ZBQA/2QUAP9nFAD/ZQ0A/4hFNf+tfnP/qHds/6l5bv+ncmX/bBsH/1QPAP9uFQD/cRQA/2YX\n        Bf+LaGD/lHZv/5NzbP+Kc23/inNt/0spIf8uBQD/MwoA/zQKAP8uAwD/Xz42/5J5dP+Ncmz/kndx/3dV\n        Tf88CwD/PAsA/z0MAP88DAD/WhIA/5MbAP9RBgD/RxkP/4tqYv/JvLj/8Orp///9/P//////////////\n        ///39fT/5NfU/7SVjv9sPTH/RgcA/0cJAP9ODwD/TQ8A/00PAP9MDgD/SgoA/2AoG/+ZdGz/mnVt/5x3\n        bv+XbmX/WRYH/1QPAP9WEQD/VxEA/1gRAP9eEwD/ZxQA/14TAP9hEwD/YBMA/2ATAP9eEwD/YRMA/2ET\n        AP9kEwD/Yg0A/2MPAv+4koj//////92Dbv/NGwD/xSYA/3gXAP9nEwD/bRUA/2oUAP99GAD/jRsA/3wY\n        AP+AGAD/gRgA/40bAP+PHAD/ghgA/7ImBf/bMwz/2C4H/9guB//bMAj/0S4I/yQIAf8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9BDAD/XhIA/1oRAP9aEQD/XRIA/10S\n        AP9dEgD/XRIA/1wSAP9cEgD/XxMA/2ETAP9hEwD/ZRQA/2UUAP9kFAD/ZhQA/2oUAP9eAwD/tIqA////\n        //////////////bx8P91Iw//bxIA/3IWAP9nEQD/VhsN/+/p6P//////////////////////c1hR/ygA\n        AP80CgD/NAoA/yQAAP+ZhID/////////////////yby6/zkKAP84CQD/NwsA/0oPAP9cDgD/jBUA/5de\n        Uf/a09H///////////////////////////////////////////////////////f09P+ymJL/WSMX/0EE\n        AP9NDwD/TA8A/0wPAP9HBQD/fE5D//////////////////Xx8P9fHxD/UQwA/1QQAP9WEQD/VxEA/1gR\n        AP9YEgD/XBIA/10SAP9iEwD/ZhQA/10SAP9lFAD/YBMA/18KAP+DHwz/0q2j////////////135p/7YW\n        AP/QJwD/iRoA/18SAP9pFAD/ZBMA/3AVAP+SHAD/excA/3QXAP95FwD/hxoA/5McAP+KGwD/kR0C/9Uy\n        DP/ZLwf/2C8I/9swCP/SLgj/JQgB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAA\n        AP8AAAD/AAAA/0EMAP9eEgD/WhEA/1oRAP9dEgD/XRIA/10SAP9dEgD/XRIA/2ATAP9iEwD/YRMA/2MU\n        AP9lFAD/ZRQA/2UUAP9lFAD/aBQA/18EAP+yhnz/////////////////9vHw/3UjD/9sEQD/dBcA/18P\n        AP9KFwv/6uTi//////////////////////90Vk7/LwAA/zsMAP89DAD/MAAA/56GgP//////////////\n        ///Iurb/PAsA/zsKAP8/DAD/Ww4A/1EPA//AlIn///39////////////////////////////////////\n        ///////////////////////////////////g1dP/bjow/0cEAP9RDwD/UQ8A/0kFAP97TED///7+////\n        ////////8+7t/2AgEP9QDAD/UQ8A/1URAP9XEQD/WBEA/1gRAP9ZEQD/WBEA/1gRAP9YEgD/WhIA/1gR\n        AP9TBwD/by0e/9fDvv/////////////////Xfmn/rhUA/8cmAP+oIAD/ZxMA/20VAP9rFAD/bhUA/4ca\n        AP90FwD/cBcA/6AfAP+xIgD/ihoA/5UcAP+SHQH/1S4I/9ovCP/YLwj/2zAI/9IuCP8lCAH/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/QQwA/14SAP9aEQD/WhEA/14S\n        AP9eEgD/XhIA/10SAP9dEgD/XxMA/2ITAP9iEwD/YxQA/2UUAP9lFAD/ZRQA/2UUAP9nFAD/XQQA/7KG\n        fP/////////////////28fD/diMP/2sRAP9zFgD/ZBAA/00YC//q4+L//////////////////////3FV\n        Tv8oAAD/MwoA/zcKAP8kAAD/mYSA/////////////////8e6tv86CgD/OwoA/1cPAP9ZDgD/sJiS////\n        ///////////////////79/b/5ca//9GXiv+pfXP/nXpx/6CBev/Rq6P/8ePg////////////////////\n        ///p4+H/cDsv/00GAP9PEAD/TAYA/4lOQP///v7////////////07+7/ZSUV/0sLAP9ODwD/UQ8A/1MQ\n        AP9VEAD/VRAA/1UQAP9TEAD/UxAA/1YRAP9WEAD/TgQA/3k/Mf/n3dn//////////////////////9h+\n        af+0FgD/uyMA/8cmAP+QHAD/dhgA/3sYAP9yFgD/hRoA/4AZAP9xFgD/ryEA/9osA/+cHwL/jxsA/6gh\n        Av/bMAn/2i8I/9ovCP/cLwj/0y0H/yUIAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAA\n        AP8AAAD/AAAA/wAAAP9BDAD/XhIA/1oRAP9aEQD/XhIA/14SAP9eEgD/XhIA/14SAP9eEgD/YhMA/2IT\n        AP9iEwD/ZRQA/2UUAP9lFAD/ZRQA/2UUAP9dBAD/soZ8//////////////////bx8P92Iw//axEA/3IW\n        AP9qEQD/UhkL/+nk4v//////////////////////dFVO/y0AAP80CwD/PAwA/yIAAP+VhID/////////\n        ////////xLm2/zIIAP86CQD/XQoA/5d4cv//////////////////////yr+8/55QPv+hIAL/ZQoA/zIA\n        AP9DAAD/UAQA/4ASAP98Kxj/xIp8//3y8P/////////////////k08//XSMX/0gJAP9IBgD/gUxA///+\n        /v////////////Tv7v9kJRX/UwwA/1gRAP9XEQD/VxEA/1gRAP9YEQD/VxEA/1kRAP9aEgD/WA8A/08F\n        AP+GVUn/7+jn////////////////////////////1X5p/7cWAP+1IgD/xiYA/7skAP92FwD/dBcA/3UX\n        AP+EGQD/kBsA/3wYAP+3IgD/2ywE/8IqBv+FGQD/wSgF/+AwCP/aLwf/2i4G/90wB//TLQf/JQgB/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0ENAP9fEwD/WhEA/1oR\n        AP9eEgD/XhIA/14SAP9eEgD/XhIA/14SAP9iEwD/YhMA/2ITAP9jFAD/ZhQA/2YUAP9mFAD/ZRQA/1wE\n        AP+yhnz/////////////////9vHw/3YjD/9rEQD/cRYA/3ATAP9RGQv/5uPi////////////////////\n        //9yVU7/LAAA/zwMAP9ADAD/LQAA/56FgP/////////////////Hurb/OAkA/0QEAP9tOi//8e3t////\n        /////////////7Wbk/9UFAn/iRAA/44YAP89CwD/Pg0A/0cOAP94FwD/kRsA/4ETAP+REQD/w1pB//jo\n        5P////////////////+xlY//RgcA/0EDAP98TUL////+////////////8+/u/2AkFf9PCwD/UA8A/1EP\n        AP9VEQD/VhEA/1YQAP9YEQD/XRIA/1sOAP9XCAD/oHNm//n19P//////////////////////////////\n        ///OfWn/sBUA/6wgAP+9JAD/0SgA/5YdAP9pFAD/exgA/4AZAP+EGgD/qiEA/8kmAP/SKgP/3y8H/9Ir\n        Bf/aLgb/2y8H/9syC//bOBL/3i8G/9QuB/8lCAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/QQ0A/18TAP9bEgD/WxIA/14SAP9eEgD/XhIA/14SAP9eEgD/XhIA/2IT\n        AP9iEwD/YhMA/2ITAP9mFAD/ZhQA/2YUAP9mFAD/XAQA/7KGfP/////////////////28fD/diMP/2sR\n        AP90FgD/aBEA/0AVC//m4+L//////////////////////3BVTv8pAAD/PAwA/zkLAP8yAAD/noWA////\n        /////////////9O8tv9FCwD/RwcA/7Sjnv/////////////////WraP/RQsC/2kPAP+bHgD/cRYA/zEJ\n        AP9CDQD/XhIA/4waAP+ZHQD/tSQB/5YbAP+qEwD/xFtE//bz8v////////////Tx7/9qOi//QgAA/4JQ\n        Rf/////////////////07+7/YSMV/0gKAP9EDgD/Rw4A/0gOAP9JDgD/SQ4A/0wPAP9JCQD/SwsB/7GN\n        hf///////////////////////////////////////////9J9af+pFAD/tSIA/7wkAP/GJgD/sSIA/3MW\n        AP9tFQD/chYA/28WAP+qIQH/1ioB/9YqA//dLwf/3i8H/90uBv/bLwf/2zAI/9sxCv/eMAf/1S4H/yUI\n        Af8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9BDQD/XxMA/1sS\n        AP9bEgD/XhIA/14SAP9eEgD/XhIA/14SAP9eEgD/YxMA/2MTAP9iEwD/YhMA/2YUAP9mFAD/ZhQA/2YU\n        AP9cBAD/soZ8//////////////////bx8P93Iw//bBEA/3MWAP9KCwD/NxML/+fj4v//////////////\n        ////////dlZO/zYBAP86CwD/OAsA/y0AAP+ZhID/////////////////0ry2/1QJAP9dLiT/7+zr////\n        ////////8uHc/3ssHf9BBgD/ihsA/6MfAP9xFgD/NAoA/zsMAP94FwD/jRsA/5geAP+dHgD/mh0A/64h\n        AP+REQD/qoiB/////////////////6uOh/85AAD/dU5E//////////////////Tx8P9hJxj/TgoA/00P\n        AP9MDwD/Tg8A/00PAP9NDwD/RgYA/1EWDP+6opz/////////////////////////////////////////\n        ////////y3xp/6oVAP+3IwD/tSMA/7YjAP+zIgD/mx4A/2QUAP9rFAD/ahQA/7YjAP/VKAD/1ysD/94u\n        Bv/dLgb/3S0F/9wuBv/cLwf/3C8H/94wB//VLgf/JQgB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAA\n        APAAAAD/AAAA/wAAAP8AAAD/AAAA/0ENAP9fEwD/WxIA/1sSAP9dEgD/XhIA/14SAP9eEgD/XhIA/14S\n        AP9jEwD/YxMA/2MTAP9jEwD/ZRQA/2cUAP9mFAD/ZhQA/1wEAP+xhnz/////////////////9vHw/3gk\n        D/9wEgD/YBIA/ywFAP85FQv/5+Pi//////////////////////90Vk7/MQEA/zsMAP8+DAD/KgAA/5uF\n        gP/////////////////Kurb/VgUA/59wZP////////////////+vhHv/QAIA/2oVAP+XHQD/pR8A/2AT\n        AP9FDQD/UxAA/4oaAP95FwD/jxsA/6IfAP+jHwD/nB4A/2kOAP+ZMx//7ubj////////////2tDN/z8M\n        AP93S0H/////////////////9vLx/2EqHP9GCQD/TQ8A/1gRAP9aEQD/VxEA/1IGAP9qJxr/0b65////\n        ////////////////////////+PX0/+DU0P////////////////+tdmn/kxAA/6cgAP+uIgD/rCEA/7Yj\n        AP+zIgD/hhoA/2cUAP+EGgD/xyYA/8kmAP/WKwP/3y8G/94uBf/dLQX/3S4G/90uBv/dLwf/3y8H/9Yt\n        Bv8lCAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/QQ0A/18T\n        AP9bEgD/WxIA/1sSAP9eEwD/XxMA/18TAP9eEgD/XhIA/2MTAP9jEwD/YxMA/2MTAP9lFAD/ZxQA/2cU\n        AP9nFAD/XAQA/7CGfP/////////////////28fD/dyMP/24RAP89DAD/LQYA/zwVC//n4+L/////////\n        /////////////3ZWTv88AgD/PgwA/z4NAP8vAAD/lYSA/////////////////8a4tf9GBwD/xKKa////\n        ////////+fj3/2A8Nv9ABAD/iRoA/5weAP+SHAD/Qw0A/zkLAP9tFQD/nB4A/6ogAP+THAD/bhUA/4ca\n        AP9wFgD/fBcA/6obAP/Rsar////////////z8PD/Wi0i/3lIPf/////////////////18fH/Wigb/0kK\n        AP9XEQD/UhAA/0cOAP8+AQD/aTUq/+HU0f////////////////////////////j08/+NYlj/lGtj////\n        /////////////5Zyaf9uCQD/nB0A/5kdAP+tIQD/siMA/6ohAP+nIAD/bhUA/5kdAP/AJQD/uSMA/9Qr\n        Av/gLgX/3i4F/94uBf/eLgX/3i4F/90uBv/gLwf/1i0G/yUIAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9CDQD/YBMA/1wSAP9bEgD/WxIA/10TAP9fEwD/XxMA/18T\n        AP9fEwD/ZBQA/2MTAP9jEwD/YxMA/2UUAP9nFAD/ZxQA/2cUAP9dBAD/sYZ8//////////////////bx\n        8P95Iw//XQ4A/zQLAP9LDAD/TBkL/+fj4v//////////////////////dVVO/zkBAP88DAD/OwwA/yQA\n        AP+YhID/////////////////w7e0/zkKAP/Pv7v////////////v6un/RBwT/04LAP+QHAD/qCEA/28V\n        AP80CgD/PQwA/4EZAP+zJQT/sCMB/2ASAP83CwD/Tg8A/1sSAP9aEQD/ig4A/9mUhP//////////////\n        //9vSD7/dkU5//////////////////Xx8f9nKhv/TgoA/0UOAP89CwD/NwAA/3VKQP/t5uT/////////\n        ///////////////////v5OH/iU5B/0sAAP+ecWj/////////////////mHJp/0wCAP+UHAD/oh8A/5ge\n        AP+mIAD/oB4A/6ggAP+XHQD/sSIA/6sgAP+1IwD/2CsC/+AuBP/eLQT/3i4F/94uBf/eLwb/3i8G/+Ew\n        Bv/YLgb/JggB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0IN\n        AP9gEwD/XBIA/1wSAP9cEgD/XRMA/18TAP9fEwD/XxMA/18TAP9kFAD/ZBQA/2QUAP9kFAD/ZBQA/2cU\n        AP9nFAD/ZxQA/10EAP+yhnz/////////////////+PHw/28hD/8xBgD/LgkA/y8GAP9AFgv/6OPi////\n        //////////////////9wVU7/LwAA/zsMAP86CwD/HwAA/5iEgP/////////////////CtrP/Ng4D/9XM\n        yf///////////+nm5v9HFw3/PgkA/4MZAP+hHwD/Tw8A/zMKAP9dEgD/riEA/7EiAP+aHgD/Rg4A/0cO\n        AP9VEQD/Qw0A/0gOAP+LDAD/y4l7/////////////////3ZTSv9xQzj/////////////////9vLx/2Yq\n        G/86BwD/NwgA/zYDAP+KaWD/9fLy////////////////////////////28rG/3w0JP9cBwD/RAAA/5hy\n        af////////////////+bcmn/QAAA/20VAP+fHwD/lB0A/6EfAP+ZHgD/sSIA/7cjAP+xIgD/sSIA/7oj\n        AP/cLAP/4S4F/98tBP/fLQT/3y4F/94vBv/eLwb/4S8F/9gtBf8mCAH/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/Qg0A/2ATAP9cEgD/XBIA/1wSAP9cEgD/YBMA/2AT\n        AP9gEwD/XxMA/2MUAP9kFAD/ZBQA/2QUAP9kFAD/ZxQA/2cUAP9nFAD/XQQA/7OGfP//////////////\n        ///48fD/SxsP/yUEAP8sCQD/JQUA/zgUC//o4+L//////////////////////3JVTv8tAAD/NQsA/y8J\n        AP8kAAD/moWA/////////////////8O3tP81DAL/0MfE////////////7Ojm/3UhDf9BCQD/dBYA/3EV\n        AP9JDgD/Sg8A/4QaAP+aHgD/nR4A/2ITAP8+DAD/Sw8A/0kOAP85CwD/bBUA/4IMAP/Cinz/////////\n        ////////dU5F/3BEOf/////////////////18/L/Xy0g/z0CAP8+CAD/noV+////////////////////\n        /////////////72nov9WGg//VggA/2MTAP9lCQD/qndr/////////////////5dyaf9BAQD/UA8A/4AZ\n        AP+XHQD/oB4A/5IdAP+vIgD/siMA/7QiAP/AJAD/vyQA/9wrAv/hLgX/4C0E/+AuBf/gLQT/3y4F/98u\n        Bf/hLgT/2CwE/yYIAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAA\n        AP9DDQD/YRMA/1wSAP9cEgD/XBIA/1wSAP9gEwD/YBMA/2ATAP9gEwD/YhQA/2QUAP9kFAD/ZBQA/2QU\n        AP9nFAD/ZxQA/2cUAP9dBAD/s4Z8//////////////////Pw8P87GA//KAUA/y0JAP8sBgD/NBQL/+fj\n        4v//////////////////////cFVO/ygAAP8pCQD/KQkA/x0AAP+XhID/////////////////yLi0/zUH\n        AP+8r6v////////////58u//kTcj/zYGAP9bEgD/Tw8A/y8JAP9bEgD/nx8A/3sYAP+eHwD/Rg0A/zkL\n        AP9DDQD/OwsA/z4MAP+KGgD/gRAA/8Sflv////////////75+f9wPDD/dko///////////////////Xz\n        8v9PIx7/PwwE/7OemP////////////////////////////38/P+ghn//PwcA/zwGAP9TEAD/WREA/4UR\n        AP/RgnD/////////////////l3Jp/0cBAP9MDgD/WREA/4YZAP+fHgD/khwA/6YgAP+0IwD/tiMA/8Ak\n        AP/BJAD/2SoC/+EtBP/gLgX/4C4F/+AtBP/gLQT/4C0E/+MuBP/ZLAT/JggB/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0MNAP9hEwD/XRIA/10SAP9cEgD/XBIA/2AT\n        AP9gEwD/YBMA/2ATAP9hEwD/ZBQA/2QUAP9kFAD/ZBQA/2UVAP9oFQD/aBUA/14FAP+zhnz/////////\n        ////////8/Dw/zoYD/8pBQD/LQkA/zYHAP83FAv/5+Pi//////////////////////9nU07/HQAA/ycI\n        AP8nCAD/GAAA/5OEgP/////////////////Eubb/KAAA/5iEf/////////////////+QYFT/KAAA/zgL\n        AP83CwD/NQsA/4AZAP/HJgD/hxoA/4AZAP8+DAD/PQwA/zsLAP82CgD/VxEA/4IWAP9NEwb/1cvI////\n        ////////6eLg/0waDf92TUP/////////////////8e3t/2lAN//Csq7/////////////////////////\n        ///y7+7/imRb/z4DAP9CCgD/Rw4A/0wOAP9WEQD/SwIA/5pxaf////////////////+Zcmn/YAcA/4Qc\n        A/9SEAD/eRgA/5EcAP+QHAD/oB8A/7YjAP+3IwD/vSQA/7ckAf/dLAP/4i0D/+EtBP/hLQT/4C0E/+At\n        BP/gLQT/4y4E/9osBP8mCAH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAA\n        AP8AAAD/Qw0A/2ETAP9dEgD/XRIA/10SAP9eEwD/XxMA/2ATAP9gEwD/YBMA/2MUAP9lFAD/ZBQA/2QU\n        AP9kFAD/ZBQA/2cVAP9oFQD/XgUA/7KGfP/////////////////x8PD/LA8P/xkAAP8dAQD/JgQA/zQU\n        C//n4+L//////////////////////2dTTv8YAAD/GQMA/xMAAP8EAAD/i4CA/////////////////8W5\n        tv8jAAD/YkdB//7+/f///////////761sf8uBwD/MAcA/zIKAP9HDgD/jRsA/7EiAP+YHgH/VBAA/zoM\n        AP87CwD/OgsA/zsMAP+DGQD/XAcA/3dTS//+/v7////////////Isqz/NwAA/3JPR///////////////\n        ///49/b/5uDe////////////////////////////5t/d/2xDOf87AQD/QwwA/0UOAP9EDgD/RQ4A/0MN\n        AP84AAD/kHFp/////////////////5hyaf9XBAD/YxMB/1MQAP9iEwD/dhYA/4waAP+aHQD/rSEA/7cj\n        AP+zIgD/ryEB/94sA//jLQL/4i0D/+ItA//hLQP/4S0C/+EtBP/jLgX/2iwE/yYIAf8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9DDQD/YRMA/10SAP9dEgD/XRIA/2AT\n        AP9fEwD/YBMA/2ATAP9gEwD/ZRQA/2UUAP9lFAD/ZRQA/2UUAP9kFAD/ZhUA/2gVAP9eBQD/sYZ8////\n        //////////////n49/+ei4j/l4SA/5F9eP8uDAT/MREJ/+fj4v//////////////////////ZVNO/xAA\n        AP9aRUD/l4yJ/4p7d//JwsD/////////////////xbm2/yoEAP8yDgb/08rI/////////////////3ti\n        XP8pAAD/MgoA/1YRAP+FGQD/jRsB/4scAv8wCgD/NwsA/zYLAP84CwD/Sw4A/5oXAP+MJRH/38zI////\n        /////////////7NoVv9SAAD/bE9I/////////////////////////////////////////////////8zB\n        vv9QKCD/MAAA/zsLAP88DAD/PAwA/zwMAP88DAD/PQwA/zEAAP+NcGn/////////////////kXFp/zkA\n        AP9EDQD/Rg4A/0ENAP9cEgD/gxoA/50eAP+eHgD/tyMA/7gjAP+2IwD/3ywC/+QsAf/jLQP/4i0D/+Iu\n        BP/iLgT/4i4E/+QuBP/bLAT/JggB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAA\n        AP8AAAD/AAAA/0MNAP9hEwD/XRIA/10SAP9dEgD/YBMA/18TAP9hEwD/YRMA/2ETAP9lFAD/ZRQA/2UU\n        AP9lFAD/ZRQA/2UUAP9nFQD/aRUA/14FAP+xhnz/////////////////////////////////8vDw/y4T\n        DP8qDgf/5uPi//////////////////////9lU07/CAAA/5KDgP//////////////////////////////\n        ///Fubb/LQcA/yIAAP+CZ2D/////////////////7erp/2RGP/8zAAD/bxIA/2ETAP9tFQD/ghkA/zYL\n        AP82CwD/NwwA/zAKAP9mCwD/lx8H/9msof/////////////////jy8X/kCIJ/4sOAP+EVEn//f//////\n        //////////////////////////////////+xoZz/PRMN/y8BAP81CgD/NQoA/zYKAP84CwD/OgsA/zoL\n        AP83CgD/LQAA/5pyaf////////////////+ScWn/NwAA/0ANAP9ADQD/QA0A/0INAP9oFAD/khwA/50e\n        AP+mIAD/uiMA/6whAf/eLQT/5CwB/+MtAv/jLQP/4y0C/+MtAv/iLgP/5S8E/9ssA/8mCAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/RA0A/2ITAP9eEgD/XRIA/10S\n        AP9gEwD/XxMA/2ETAP9iEwD/ZBQA/2YUAP9mFAD/ZRQA/2UUAP9lFAD/ZRQA/2cVAP9pFQD/XwUA/7KG\n        fP/////////////////////////////////y8PD/MhQM/zEQB//n4+L//////////////////////2VT\n        Tv8IAAD/kYOA/////////////////////////////////8W5tv8tCAD/IgIA/3MYBP/xv7P/////////\n        ////////7Ovr/5ZqXv90FQH/cAsA/4gUAP+QGAD/RQoA/0MIAP85AgD/KwAA/2cvIv/WuLH/////////\n        ////////+/j3/6ZYRv+AEAD/iBEA/4tVSf/8///////////////////////////////7+vr/ln95/zMH\n        Af8xBQD/NgsA/zUKAP81CgD/NQoA/zcKAP86CwD/OwsA/zUKAP8xAAD/q3Vp/////////////////51z\n        af8/AAD/ZhQA/0sPAP9HDgD/QQ0A/2kUAP9+GAD/mx4A/6whAP+xIgD/rCMC/+AwB//lKwD/4yoA/+Ms\n        Af/jLAH/4ywB/+MtAv/mLwT/3CwC/yYIAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAA\n        AP8AAAD/AAAA/wAAAP9EDQD/YhMA/14SAP9eEgD/XhIA/2ATAP9fEwD/YRMA/2ETAP9jFAD/ZRQA/2cU\n        AP9nFAD/ZhQA/2YUAP9lFAD/ZhUA/2kVAP9fBQD/soZ8//////////////////////////////////Lw\n        8P80FAz/Lw8H/+fj4v//////////////////////ZlNO/w4AAP+WhID/////////////////////////\n        ////////w7m2/yYHAP85CQD/lxYA/4A0I//a2tr///////////////////38/9i+uP+kaVv/q0Eo/5os\n        Ef9jHw7/Yykb/35KPv+ejIj/6+bm///////////////////////Fh3j/iBMA/5AaAP+CEAD/gFRJ//7/\n        ////////////////////////7+zr/3ZYUf8sAAD/MwgA/zYLAP81CwD/NQsA/zUKAP82CgD/NQoA/zgK\n        AP82CgD/NAoA/zkAAP+xd2n/////////////////j3Bp/zUAAP9IDwD/Qg0A/z8NAP9BDQD/Sw8A/1wS\n        AP+RHAD/sSIA/68hAP+yJAL/4y8F/+IqAP/iKwD/4yoA/+QsAf/jLAL/4y0D/+YuA//dKwH/JgcA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0QNAP9iEwD/XhIA/14S\n        AP9eEgD/YBMA/2ETAP9iEwD/YRMA/2ETAP9jFAD/ZRQA/2UUAP9nFAD/ZhQA/2YUAP9mFAD/ahUA/18F\n        AP+xhnz/////////////////////////////////8/Dw/zUUDP8sDgf/6ePi////////////////////\n        //9oU07/DAAA/5OEgP/////////////////////////////////Eubb/KggA/10QAP9UEAD/IQAA/1U1\n        Lv/i3Nr////////////////////////////79/b/9+/t//Xu7f/08fH//vz8////////////////////\n        ////////xI+B/4kVAP+GFwD/jhwA/2kLAP90VU3//////////////////////93W1P9cOTH/KgAA/zUK\n        AP82CwD/NgsA/zYLAP82CwD/NgsA/zcLAP83CwD/OAsA/zkLAP82CgD/OAAA/6d1af//////////////\n        //+RcWn/OQAA/0cOAP9IDgD/Rw4A/0gOAP9GDgD/SQ4A/4EZAP+wIgD/qCAA/7kkAf/iLwX/4isA/98r\n        AP/gKgD/4ysA/+UsAf/kKgD/5isA/9opAP8mBwD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/RA0A/2ITAP9eEgD/XhIA/14SAP9gEwD/YRMA/2ETAP9iEwD/YxMA/2ET\n        AP9sFQD/fBgA/2QUAP9mFAD/ZhQA/2YUAP9qFQD/YAUA/7WKgP//////////////////////////////\n        ///08PD/NRQL/yoPCf/r6Oj//////////////////////2tXUf8MAAD/k4SA////////////////////\n        /////////////8a8uv88CwD/Vg8A/yYIAP8wCQD/JQAA/0gnIP+/tLH/////////////////////////\n        ////////////////////////////////////////6+fl/6BuYf92EAD/hxcA/4UbAP+KGwD/WggA/3BU\n        Tf/////////////////EuLT/RyAY/ywAAP82CwD/NgsA/zYLAP82CwD/NgsA/zULAP82CwD/NgsA/zYL\n        AP82CwD/OQsA/zgLAP8tAAD/l3Zu/////////////////450bv8uAAD/OgsA/zwMAP8+DAD/Qg0A/0MN\n        AP9CDQD/VRAA/5gdAP+fHgD/vCUC/+EvBf/gKwD/3SoA/90qAP/eKgD/4SsA/+UrAP/oKwD/3CkA/ycH\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9EDQD/YhMA/14S\n        AP9eEgD/XhIA/2ATAP9hEwD/YRMA/2ITAP9iEwD/ZBMA/2YUAP9tFQD/ZhQA/2YUAP9mFAD/ZhQA/2oV\n        AP9oDwD/e0Ay/4Rxbf9+a2b/fGpm/3xqZv98a2b/gm1o/4NnYP8oDAX/JgoD/3JgW/9/bWj/fWtm/35s\n        Z/9+bGf/Qicg/x0AAP9SOjP/hHJt/4BrZv9/a2b/gGxn/5lyaP+HcGr/aVBJ/zoLAP9EDAD/JwgA/ysJ\n        AP8sCQD/JAEA/y4KBf97YVr/08fF//z6+f//////////////////////////////////////6+bl/6uX\n        kf9ULCP/TAUA/3UVAP+CGgD/fhkA/4AZAP9JBQD/cFVP////////////qpiT/zcNB/8vAwD/NgsA/zYL\n        AP82CwD/NgsA/zYLAP81CwD/NgsA/zULAP85DAD/NwsA/zYLAP83CwD/NgsA/zIEAP9/PzD/yId4/8ON\n        gf/PoJX/fUg7/zUDAP86CwD/OAsA/zoLAP87DAD/PAwA/z0MAP9ADQD/axUA/5kdAP+5JQL/4C8F/9wp\n        AP/cKQD/3SoA/9sqAP/dKgD/4SsA/+QsAP/dKgD/JwcA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAA\n        APAAAAD/AAAA/wAAAP8AAAD/AAAA/0QNAP9jEwD/XxIA/14SAP9eEgD/YBMA/2ETAP9hEwD/YhMA/2IT\n        AP9iEwD/ZBMA/2UUAP9mFAD/ZhQA/2YUAP9mFAD/aBUA/24WAP9SCwD/HQAA/xwAAP8bAAD/GQAA/xQA\n        AP8mAAD/LQAA/yMIAP8lCAD/HAAA/xoAAP8aAAD/GgAA/xoAAP8jBAD/KQkA/yAEAP8aAAD/HwAA/xwA\n        AP8uBAD/Wg0A/xsAAP8jAQD/MQkA/zAJAP8wCQD/MgoA/zMKAP8yCgD/NAcA/ywAAP88EAj/n1VD/86e\n        kv/jzcf/9+bi//vu6//r29f/ybSv/591av9NJx3/QQYA/zYEAP8/DAD/ZRQA/3cXAP+BGQD/ehcA/zcC\n        AP9wU0z/8e7u/5mDfP8wAwD/MQYA/zULAP81CwD/NQsA/zULAP81CwD/NAoA/zULAP82CwD/MgoA/0QO\n        AP87DAD/NwsA/zgLAP83CwD/OAsA/3ERAP+NEAD/eA4A/3APAP9vEgD/UhAA/zsMAP8+DAD/PgwA/0AN\n        AP9ADQD/RA0A/0INAP9KDgD/fhgA/7QjAf/gLQT/2SkA/9kpAP/ZKQD/3SoA/90qAP/gKwD/5CwA/9oq\n        AP8nBwD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/RA0A/2MT\n        AP9fEgD/XxIA/18SAP9hEwD/YRMA/18SAP9iEwD/YhMA/2ITAP9lFAD/ZxQA/2cUAP9nFAD/ZhQA/2YU\n        AP9mFAD/axUA/18TAP8pCAD/KwkA/ywJAP8sCQD/KQgA/0QOAP8rCQD/JAcA/ycIAP8lBwD/JggA/yYI\n        AP8nCAD/JwgA/ycIAP8nCAD/JwgA/ykJAP8qCQD/JwgA/zwMAP80CQD/KQkA/ygIAP85CwD/VBEA/yoJ\n        AP8tCQD/LwkA/zAKAP8xCgD/NAoA/y4GAP9lDQD/hxcA/3wSAP/RbVb/6qOS/5cbAP9MDwL/WgsA/zYG\n        AP81CQD/OQsA/zgLAP9SEAD/bRUA/4YaAP94FwD/NQoA/zoPBf9AFwz/NQgB/zUJAP82CwD/MwoA/zUK\n        AP82CwD/NQsA/zULAP81CwD/NAoA/zQLAP8zCgD/PwwA/zgMAP83CwD/OAsA/zYLAP86DAD/ehcA/5cd\n        AP+KGgD/cxUA/3MVAP9mFAD/Rw4A/zwMAP8/DAD/PQwA/z4MAP9ADQD/QQ0A/z4MAP9WEQD/oyAB/+At\n        A//aKQD/2ykA/9wqAP/aKQD/2ykA/94qAP/hKwD/2ioA/yYHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9ADAD/YBIA/18SAP9fEgD/XxIA/2ASAP9fEgD/XxIA/2IT\n        AP9iEwD/YhMA/2ITAP9nFAD/ZxQA/2cUAP9nFAD/ZxQA/2YUAP9pFQD/axUA/00PAP8oCAD/KwgA/yoJ\n        AP86CwD/RQ0A/yIHAP8kBwD/JggA/yUHAP8lCAD/JQgA/ycIAP8nCAD/JwgA/ycIAP8nCAD/KAgA/ygI\n        AP8nCAD/QA0A/zMKAP8pCQD/JggA/z0MAP9NDwD/IwcA/yYIAP8sCQD/LAkA/ysJAP8rCQD/LwkA/z8M\n        AP93EwD/mR0D//PJv//58O3/uzsl/1sJAP9QDwD/Rg4A/zQKAP83CwD/OAsA/z8MAP9fEgD/gBkA/1gR\n        AP8zCgD/NQkA/zQHAP82CgD/NwsA/zUKAP8yCgD/NwsA/zULAP81CwD/NQsA/zULAP82CwD/NgsA/zYL\n        AP81CwD/NgsA/zYLAP82CwD/NQoA/0wOAP+UHQD/lx0A/5MdAP+BGQD/chYA/3QXAP9nFAD/PQwA/zoL\n        AP87CwD/OwsA/z0MAP9ADQD/QQ0A/z8NAP+BGQH/4C0D/9opAP/dKQD/3ioA/94qAP/eKgD/3SoA/+Er\n        AP/bKgD/JgcA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0EN\n        Af9hEwH/XxIA/18SAP9fEgD/XxIA/18SAP9fEgD/YRMA/2MTAP9jEwD/YhMA/2QUAP9nFAD/ZxQA/2cU\n        AP9nFQD/Yw8A/2MHAP9lCAD/ZwgA/0sDAP8kAAD/HwAA/0MCAP8nAQD/FQAA/xkAAP8YAAD/GQAA/xoA\n        AP8YAAD/GAAA/xkAAP8ZAAD/GQAA/xkAAP8aAAD/GwAA/xkAAP8uAQD/OAYA/ygJAP8qCQD/MQoA/y8J\n        AP8rCQD/KwkA/y0JAP8uCQD/LwkA/y8JAP8yCgD/MAkA/1cFAP/YeWP/+v////T9///xsKL/kBQA/0cN\n        AP9TEAD/NAoA/zcLAP84CwD/NgsA/0sPAP9tFQD/Qg0A/zQLAP81CwD/NwsA/zAHAP8nAAD/JQAA/ycA\n        AP8qAAD/KAAA/ykAAP8qAAD/KgAA/yoAAP8qAAD/KgAA/ykAAP8pAAD/KQAA/ykAAP8nAAD/ZQgA/5cS\n        AP+XEgD/jhAA/4IOAP9yCwD/dgwA/3UOAP9SDwD/NAsA/zgLAP83CwD/OgsA/z4MAP9DDQD/PQwA/2ET\n        AP/cKwH/2ioA/9wpAP/bKQD/2ykA/9gpAP/bKgD/4isA/9kpAP8lBwD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/Qw0B/2EUAf9gEwH/YBMB/2ATAf9fEgD/YRMA/2AS\n        AP9hEgD/YxMA/2MTAP9jEwD/ZBQA/2UUAP9oFAD/ZxQA/2EOAP+SPCf/xX1s/795aP/AeWj/w3po/6Rx\n        Zf+XZlr/q2pa/5NhVf+SYVX/kmFV/5JhVf+SYVb/kWFW/5BhVv+RYVb/kmFW/5JhVf+SYVX/kmFV/5Jh\n        Vf+SYVX/kGBU/55qXf+QQC3/LQQA/yoJAP8zCgD/SA4A/y4JAP8vCQD/LwkA/zAJAP8yCgD/NQoA/zUK\n        AP8rBAD/Yh0O//nd1v/1+vv/9PX1//r5+P/RW0L/TwUA/1sSAP82CwD/NwsA/zYLAP9GDgD/PwwA/1YR\n        AP81CgD/MgoA/zQLAP8tBgD/YiUX/5hiVf+RYlb/k2FV/5RhVf+UYVX/k2FV/5NhVf+TYVX/k2FV/5Ng\n        VP+TYFT/kmBU/5JgVP+SYFT/k2BU/5NhVf++bVr/yG9a/8hwW//Eb1r/wG9b/7lsWf+0bVz/r2BM/2IW\n        BP86CgD/PAwA/zoLAP8/DAD/QQ0A/0INAP8/DAD/ZBMA/9opAP/ZKgD/2yoA/9wqAP/eKQD/2ikA/9sp\n        AP/eKgD/1SgA/yUHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAA\n        AP9DDQH/XxMB/2ATAf9gEwH/YBMB/2ATAf9hEwH/YRMB/18SAP9iEwD/YxMA/2MTAP9kEwD/YxMA/2gU\n        AP9oFAD/XQYA/7RzY///////////////////////////////////////////////////////////////\n        /////////////////////////////////v////7////+/////v////7//////+qUgP85AAD/JwgA/0UO\n        AP9bEgD/JQgA/yoJAP8pCAD/KwkA/ywJAP8tCAD/KQkA/yoAAP/EhHb//v////X09P/08/P/9fz+//nJ\n        vv92GAP/VA4A/z8MAP83CwD/NAoA/1cRAP9ADAD/Sw8A/zIKAP8xCQD/NQoA/yYAAP+YXE3///77//75\n        +f/9+Pb//fj2//349v/9+Pb//fj2//z39v/89/b//Pf1//z29f/79vX/+/b1//v29P/69fT/+vX0//T1\n        9f/y9fX/8vX1//P19f/09fX/9PT0//b5+v/v3Nf/ax0L/zkIAP88DAD/NAsA/zULAP83CwD/OwwA/z4M\n        AP9qFAD/2CkA/9gqAP/ZKgD/2yoA/90qAP/cKgD/2yoA/94pAP/VKAD/JQcA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0INAf9hEwH/YBMB/2ATAf9gEwH/YBMB/2AT\n        Af9gEwH/YBMB/2IUAf9kFAH/YxMA/2MTAP9kEwD/aBQA/2gUAP9eBwD/s29e///////9/////f39//z9\n        /f/8/f3//P39//z9/f/7/P3/+/z9//v8/P/6/Pz/+vv8//r7/P/6+/z/+vv7//r7+//6+/v/+vv7//n6\n        +//5+vr/+Pr6//j6+v/+////2Y59/zgAAP8nCAD/NwsA/zIKAP8pCAD/KgkA/ykIAP8rCQD/KwkA/ycI\n        AP8/BgD/eDIn//zq5f/2+fr/9fT0//X09P/19fX//v///7x1ZP9PAwD/Rg4A/zEJAP82CgD/VBEA/z4N\n        AP9BDQD/MgoA/zAJAP8zCgD/JAAA/5FZTP//+Pb/8fT1//Hy8v/x8vL/8PLy//Dx8f/w8fH/8PHx//Dx\n        8f/w8fH/8PHx//Dx8f/v8PH/7/Dw/+/w8P/v8PD/7u/v/+7v7//t7u//7e7v/+3u7v/t7u7/7/Lz/+vW\n        0f9vHgr/NQgA/zoMAP87DAD/PAwA/0AMAP9BDQD/PAwA/24VAP/XKQD/2ioA/9gqAP/YKgD/2SoA/9kq\n        AP/ZKgD/2ysA/9IpAP8lBwD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAA\n        AP8AAAD/QgwB/2ATAf9gEwH/YBMB/2ATAf9gEwH/YhQB/2EUAf9gEwH/YxQB/2QUAf9kFAH/ZRQB/2YU\n        Af9nFAD/aBQA/14HAP+zb17///////3+/v/9/f3//f39//7/////////////////////////////////\n        ///////////////////////////////////////////////////////////////////KjoD/LwAA/ykI\n        AP8xCgD/PgwA/y4JAP8sCQD/LQkA/y4JAP8wCQD/KwcA/z0BAP/drKL//f////X09P/19vb/9fb2//X1\n        9f/3+/3/9tvV/3IeDf9JCwD/OAsA/z0MAP9NDwD/PAwA/zYLAP8yCgD/NAoA/zIKAP8gAAD/kVhK///3\n        9f/y9PT/8vLy//Lz9P/4/v7/+f////n////4////+P////j////3////+P////f////3////8v3///H8\n        ///w/P7/8Pv9//D7/v/w+/7/8Pr9//D6/f/y////6+Lh/3MfDP9QDQD/QA0A/0INAP9DDQD/Qg0A/0MN\n        AP87CwD/kBwA/9gpAP/UKAD/1ioA/9gqAP/YKgD/2ioA/9kqAP/dKwD/0ikA/yUHAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9DDAD/YRIA/18SAP9gEwH/YBMB/2AT\n        Af9iFAH/YRMB/2ITAf9kFAH/ZBQB/2QUAf9kFAH/ZxUB/2kVAf9pFQH/XgcA/7NwYP///////f////7/\n        /////fz/+qya/8+Le/+3iX7/uop+/7mJfv+6iX7/u4l+/7qJfv+7iX7/u4l+/76Kff++in3/u4l9/7uJ\n        ff+8iX3/u4l9/7yJff+8iX3/xpGG/5FOPv8pAgD/JwgA/0UNAP9jEwD/JggA/ygIAP8pCAD/KgkA/ysJ\n        AP8gAAD/iUtA///8+v/3+Pj/9vT0//j6+v/7+vn/9fb2//X09P/9////zot9/0MAAP87DAD/PQwA/z0M\n        AP89DAD/MgoA/zQKAP8zCgD/LgkA/ykAAP+hXEz///v6//T4+P/1+Pn/8uro/8eNf/++hXf/wIZ5/8KH\n        ef/Bh3j/wYd4/8KHeP/Bhnj/w4d4/8SGd//ekYD/65WB/+qXg//rm4j/65mG/+mUgf/ploP/55F9/+qT\n        f//Xg2//SRMG/0cMAP9ADQD/QQwA/0YOAP9CDQD/Qw0A/5EcAP/RJwD/0CcA/88nAP/QJwD/0SgA/9Qp\n        AP/XKgD/2yoA/90rAP/UKQD/JQcA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAA\n        AP8AAAD/AAAA/0MNAP9jEwD/XxIA/18SAP9fEgD/XxIA/18SAf9fEgH/YhQB/2MUAf9oFQH/bxcC/2QU\n        Af9mFQH/aBUB/2kVAf9eCAD/tHBf/////////Pn///f0//3l3/9vGQ7/IQAA/x8AAP8hAAD/IQAA/yEA\n        AP8iAAD/IwAA/yQAAP8lAAD/JwAA/ycAAP8jAAD/JAAA/yYAAP8lAAD/JgAA/yYAAP8rAAD/KQQA/ywJ\n        AP8qCAD/PAwA/zoLAP8pCAD/KQgA/ygIAP8pCQD/IwUA/0MMAv/wy8P//P////f29v/6////6baq/8+W\n        if/9////9vX1//f6+//+7Of/dDIo/ywCAP82CwD/NgsA/zQKAP8vCQD/MAkA/y8JAP8tCQD/IQAA/5FX\n        Sf//7ef/9ejl//js6f/pzcf/QAsK/y4AAP80AAD/NQAA/zIAAP80AAD/NQAA/zYAAP83AAD/PgAA/4cO\n        AP+LDwD/qRYA/6QWAP+fFAD/lRIA/5gTAP+BDQD/fwwA/38NAP8+DAD/OQwA/z4NAP9KDwD/OgsA/00P\n        AP+tIQD/2yoA/84nAP/MJwD/zicA/80nAP/MJwD/zycA/9cpAP/dKgD/3SsA/9QpAP8lBwD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/Qw0A/2MTAP9fEgD/XxIA/18S\n        AP9fEgD/XxIA/18SAP9hEwD/YxQB/28XAv+DHgb/YhMA/2UUAf9kFAH/aBUB/2QSAP+NKRH/t0sx/7RH\n        Lv9/KRX/ThoO/yIGAf8ZBAD/GwQA/xoEAP8aBAD/HAUA/xsFAP8cBQD/HgUA/yQGAP8jBgD/IgYA/yAG\n        AP8hBgD/IwYA/yMGAP8jBgD/IwYA/yYHAP8nCAD/LQkA/zIKAP80CgD/MgoA/zUKAP81CgD/NAoA/zIK\n        AP8mAAD/rGhY///////4+fn/+Pn5///7+f+ERTz/UA4D//jh2v/5/f7/9vb2//7////Vrab/NgIA/y8I\n        AP8yCgD/MAkA/zAJAP8uCQD/LgkA/y4JAP8rCAD/RREF/2ggDv9lHw7/ZB8O/10cDf8tCQH/KgcA/y0I\n        AP8sCAD/LAgA/y4IAP8uCQD/MgkA/y4IAP9TDwD/ihkA/4saAP+kHgD/khsA/4cYAP+PGgD/kBoA/3gW\n        AP+GGQD/eRYA/0UOAP9FDgD/UhAA/14TAf9WEQD/uCQA/9sqAP/QKAD/yycA/80nAP/PJwD/zScA/88o\n        AP/QJwD/2CkA/98qAP/eKwD/1CkA/yUHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAA\n        AP8AAAD/AAAA/wAAAP9ADAD/YRIA/14SAP9eEgD/XxIA/18SAP9fEgD/XxIA/2ETAP9jEwD/ZBMA/2ES\n        AP9mFAH/ZBQB/2QUAf9kFAH/aBUB/2cSAf9oDwD/YgoA/zUAAP8oAAD/LgAA/zAAAP8wAAD/LgAA/ywA\n        AP8uAAD/LgAA/y0AAP8xAAD/OQIA/zUAAP81AAD/NQAA/zUAAP81AAD/NQEA/zUBAP83AgD/OQEA/zIF\n        AP8vCQD/NAoA/zYKAP82CgD/NwsA/zcLAP84CwD/MQUA/24iE//+4tr/+/7///j39///////1aee/0MB\n        AP8tAAD/vHdm///////39/f/9/n5///7+f+FRTv/JAAA/zIJAP8xCQD/MQkA/zAJAP8tCQD/LQkA/y0K\n        AP8sBQD/MAAA/y8AAP8xAAD/MgAA/zoDAP87AwD/OwMA/0AEAP9ABAD/QAQA/0AEAP9CBAD/QgUA/3ES\n        AP+AFAD/mBkA/50aAP+dGgD/mBoA/5kZAP+RGQD/iRYA/6McAP+DFgD/PgwA/0ANAP86DAD/bBUA/8gm\n        AP/XKQD/0SgA/88oAP/NKAD/zSgA/84nAP/PJwD/0igA/9IoAP/UKAD/1ykA/9wrAP/VKQD/JQcA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0EMAP9fEgD/WxIA/10S\n        AP9eEgD/XxIA/18SAP9fEgD/YBIA/2ESAP9iEwD/ZBMA/2QTAP9jEwD/YxMA/2MTAf9ZCQD/rlxJ///R\n        x//1u6//8qWT//KjkP/yo5D/8qOQ//KjkP/yopD/8aKQ//GjkP/xo5H/8KKQ//GjkP/xpZP/8aOR//Cj\n        kf/wo5D/8KOQ//Cjkf/wo5L/8KOS//Ckkv/5rpz/rVxJ/ywAAP80CgD/NwoA/zgLAP83CgD/OAsA/zQK\n        AP8yAAD/yY1////////6+fn/+/3+///w7P93NCn/NAMA/zIHAP99GgX//9DE//n////49/f//P////DI\n        v/9IDQH/KAUA/y4JAP8tCQD/LgkA/ywJAP8tCQD/IQEA/347K//ypJL/6qOS/+mikf/popH/6aKR/+ii\n        kf/oopD/6KGQ/+ihkP/noZH/6KGR/+ehkf/oo5L/6q6g/+msnv/srqD/66+h/+yvof/tsKH/7K+h/+uv\n        of/rrqD/8LKk/96ilP9FFQn/OAkA/4AZAP/NJwD/0CcA/8smAP/OKAD/zygA/9AoAP/SKAD/0igA/9Io\n        AP/QJwD/zycA/9AnAP/RJwD/2SgA/9MoAP8kBwD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/Qw0A/2ASAP9YEQD/XhIA/14SAP9eEgD/XhIA/14SAP9fEgD/YRMA/2MT\n        AP9jEwD/YxMA/2MTAP9jEwD/YxMA/1gFAP+xcmP/////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///EjID/LwAA/zMJAP82CgD/NwoA/zgLAP85CwD/LAEA/3s6MP//9fH/+/39//r6+v//////yIFy/zcA\n        AP88DAD/NQsA/1MFAP/aZEv//v////j5+f/49/j//////6ZqXP8iAAD/LwkA/ywJAP8sCQD/LwkA/zEJ\n        AP8eAAD/lF1Q///////5////+f////j////4////+P////j////4////9/////f////3////9/////b/\n        ///2/v//9f3///T9///0/P7/9Pz+//T8/v/0/P7/8/z+//P8/f/2////5t/e/1gaC/+XGgD/zCYA/8gm\n        AP/NJwD/yyYA/8smAP/QKAD/0SgA/9EoAP/UKQD/0ykA/9IoAP/SKAD/0ygA/9YrA//dMgr/zSYA/yQH\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9CDQD/YhMA/1wS\n        AP9dEgD/XhIA/14SAP9eEgD/XhIA/2ATAP9iEwD/YhMA/2MTAP9jEwD/YxMA/2MTAP9jEwD/WAYA/7Bu\n        Xv///////v////7/////////////////////////////////////////////////////////////////\n        //////////////7////+/////v////3////9/v///////8KMf/8uAAD/MQkA/zcKAP84CwD/OgsA/zQJ\n        AP9AAAD/3K6m///////6+fn//P////nb1P9hGgr/MgYA/z0MAP83CwD/UQ8A/50WAP/1taf//P////j3\n        9//6/v//+t/Y/2MdEP8jAwD/LAkA/y4JAP8xCQD/LAkA/xgAAP+RWEr///z7//b4+v/29/f/9ff3//X3\n        9//19vf/9fb2//X29//19vb/9fb2//X29v/09fb/9PX1//T19f/09fX/8/T0//P09P/z9PT/8vP0//Lz\n        8//y8vP/8vPy//T4+P/q2dX/rioK/8UjAP/FJQD/xSUA/8gmAP/KJgD/yiYA/84nAP/QKAD/0SgA/9Up\n        AP/VKQD/0SgA/9YpAP/XKgD/1CoB/9csA//PKAD/JAcA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAA\n        APAAAAD/AAAA/wAAAP8AAAD/AAAA/0MNAP9gEgD/XRIA/1wSAP9eEgD/XhIA/14SAP9eEgD/XhIA/2ET\n        AP9iEwD/YhMA/2ITAP9iEwD/YxMA/2MTAP9YBQD/sXNj////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////zI6A/zIAAP81CgD/OgsA/zoLAP86CwD/LwAA/51SQv////7//P3+//z8/f//////rGBP/zMA\n        AP88DAD/PQwA/zYKAP9RDwD/ihMA/5Y7K//68Oz/+/7+//n4+P//////xIh6/ycAAP8tCQD/LwkA/zEK\n        AP8pCAD/GQAA/5VcTv/////////+///+/P///vz///78///9/P///fz///38///9/P///Pv///z7//78\n        /P/8/f3//P39//v8/f/5/P3/+fz9//n8/P/4/Pz/+Pv8//j7+//5+vr/9/7///Ho5v/DMQ3/vSEA/8Yl\n        AP/GJQD/xCUA/8YkAP/KJgD/yiYA/88nAP/QKAD/0ykA/9YpAP/TKQD/1ikA/9YpAP/RKAD/0igA/84o\n        AP8lBwD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/QQ0A/2AS\n        AP9dEgD/XRIA/14SAP9eEgD/XhIA/18SAP9eEgD/XxMA/2ITAP9iEwD/YhMA/2ITAP9iEwD/YhMA/1wN\n        AP+QPCj/r3Fj/5ljVv+UYVX/kmBU/49gVf+PYFX/j2FV/49hVf+QYVX/kWFW/5NiVv+UYlb/lmNX/51l\n        Wf+YZFf/nWVY/55lV/+cZVj/nWRX/51kV/+dZFf/mWJW/59qXf9+PC3/MQQA/zUKAP86CwD/OgsA/zQH\n        AP9QEQP/9M/G///////9/Pz///////HEuv9PCQD/PAoA/0INAP9BDQD/OQsA/00PAP+HGgD/RQEA/8CB\n        c///////+vr6//v8/f//8u3/dDQq/ywBAP84CwD/LQkA/yYIAP8fBAD/XCUX/5lkWP+RYVX/kWFV/5Jh\n        Vf+SYVX/kWBV/5NhVf+XYlb/mGJW/5ZhVf+YYVX/sGlY/8RxXf/CcFz/xnBc/9N1Xv/UdV7/znNe/9J1\n        X//TdV7/z3Nd/8dwW//aeGH/4nZc/8ApBf/CJAD/xCUA/8QlAP/IKQT/zjEN/8MkAP/GJQD/yiYA/8wm\n        AP/QJwD/0SgA/9EoAP/QKAD/0CgA/9IoAP/WKQD/zygA/yUHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9CDQD/YRMA/10SAP9dEgD/XRIA/10SAP9eEgD/XxIA/2ES\n        AP9nFAD/YRMA/2ITAP9iEwD/YhMA/2ITAP9iEwD/ZBQA/1sKAP8nAAD/FgAA/wkAAP8FAAD/DAAA/xAA\n        AP8PAAD/DwAA/xAAAP8PAAD/FQAA/xcAAP8cAAD/KAAA/yAAAP8pAAD/JwAA/yUAAP8kAAD/KwAA/ywA\n        AP8mAAD/MgAA/zgFAf8zCwH/NwsB/zoLAP83CgD/MwAA/7Z3aP///////fz8//7//////vv/j0Y7/zMA\n        AP8/DAD/Qg0A/0ENAP87CwD/SA4A/40bAP9PCwD/VhgL//jg2v/9////+vn5///////bqqD/QQAA/zIJ\n        AP8pCAD/KAgA/yoJAP8cBAD/DQAA/w8AAP8LAAD/DAAA/xkAAP8aAAD/IQAA/ygAAP8pAAD/KQAA/ywA\n        AP9pCgD/fA0A/3sNAP+MEAD/mhIA/5sTAP+ZEgD/khEA/5sTAP+QEQD/nBMA/8QbAP++GgD/wCUA/8Al\n        AP+/JQD/wyUA/8gnAf/JKQT/xCUA/8UlAP/IJQD/yiYA/8wnAP/NJwD/zCYA/84nAP/OJwD/0CgA/9Qp\n        AP/NJwD/JQcA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0EN\n        AP9hEwD/XRIA/10SAP9dEgD/WxIA/10SAP9eEgD/ZRQA/3QWAP9dEgD/YhMA/2ITAP9iEwD/YhMA/2IT\n        AP9cDQD/jjom/6Z9c/+aeXH/lHlx/49xav8uCwf/FgAA/xsCAP8eAgD/GQIA/xkCAP8eAwD/IQMA/yQE\n        AP8tBQD/KAQA/zIHAP8/CQD/MQYA/ywFAP8uBgD/MAYA/zYHAP86CAD/OQoB/zMLAf82CwH/OwwB/y8F\n        AP9nHA///uji///////9/f3//////9WjmP8/AAD/OgsA/z4MAP87CwD/PwwA/zwLAP9BDAD/kRwA/2QT\n        AP8rAAD/rWhY///////6+/z/+vv8///+/P+VT0H/IgAA/ywJAP8sCQD/JQQA/2EtIf+beHD/lHdw/5V5\n        cv+MZ1//LQkE/yUCAP8sBQD/MQYA/zMGAP8xBgD/LgUA/14PAP+LFwD/hhYA/4sXAP+PFwD/kBgA/5ka\n        AP+BFQD/iRYA/4EVAP+qHAD/wCAA/7kfAP+9JAD/vyUA/74lAP/CJgD/xiYA/8gmAP/JJgD/ySYA/8sm\n        AP/LJgD/yyYA/8smAP/PJwD/0SgA/9IoAP/SKAD/0SgA/8smAP8lBwD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/QQ0A/2ETAP9dEgD/XRIA/10SAP9dEgD/XRIA/14S\n        AP9eEgD/WxIA/10SAP9fEwD/YhMA/2ITAP9iEwD/YhMA/1cHAP+xYU7///////////////////Tx/3sw\n        Hv8sEQr/NhYO/zsXDv86Fw7/NhYO/zsXDv8+GA7/QBgO/1UcD/9OGw//UxsO/1EbD/9THA//UxwP/0ob\n        D/9JGw//SRsQ/0scEf9DEwj/MQkA/zYLAf84CwD/NgAA/8+Wiv////////7/////////6+X/cCkd/y0C\n        AP89DAD/PgwA/zoLAP9CDQD/PAwA/0AMAP+SHAD/YxMA/zYIAP9mEAH/9si///7////7+vr///////HO\n        x/9EDQP/JwUA/ywJAP8eAAD/ll9Q//////////////////bn4/9bJhn/RxYK/1UcDv9aHQ7/Wh0O/18d\n        Dv9gHg7/ZR8O/7QvEP/INBH/wjEP/8g0Ef/INRP/yTQR/8EyEP/FMxL/xDcW/9E8Gf/aRSP/2EIf/8An\n        Av+8JAD/vSQA/78lAP/EJgD/xiYA/8gnAP/KJwD/xyYA/8gmAP/LJgD/yyYA/8smAP/PJwD/0ygA/9Eo\n        AP/TKAD/zScA/yUHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAA\n        AP9DDQD/YRMA/10SAP9dEgD/XRIA/10SAP9dEgD/XRIA/14SAP9eEgD/XRIA/18TAP9hEwD/YRMA/2IT\n        AP9iEwD/VggA/6hXQ////Pr/+vz8//r7+//7+vn/+O3r//Dq6f/x6un/8uvp//Pr6v/y6+r/8uvq//Ps\n        6v/z7Or/9+3r//bt6//27ev/9u3r//ft6//47uz/9u3s//Xt7P/27uz///39/7+Ed/80AAD/MwsB/yoA\n        AP+APjT///36/////////////////76Acv8yAAD/OwwB/z4MAP9KDgD/PgwA/0ENAP87CwD/PgwA/40b\n        AP9hEgD/MgoA/zMBAP+NSTz///z6//z+/v/8/Pz//////6hpWv8fAAD/KAgA/xkAAP+QWEv////9//r8\n        /P/6+vr/+vj4//Tq6P/y6ef/8+no//Pq5//z6uj/9Onm//To5v/z6Ob/++rn///r6P/+6+f//uvn//3r\n        5//96ub//erm//3q5v/96+j/++zp//ry8f/22tT/wi8M/7whAP++JAD/vyUA/8ElAP/BJQD/wiUA/8Qm\n        AP/IJgD/yicA/8snAP/LJwD/yyYA/84nAP/SKAD/0igA/9QoAP/KJgD/IwcA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/0INAP9gEwD/XBIA/1wSAP9dEgD/XRIA/10S\n        AP9dEgD/XRIA/10SAP9dEgD/XxMA/2ETAP9hEwD/YRMA/2ITAP9RBwD/nFRD///7+P/6+/v/+vn5//r6\n        +v/8/v///v////7////+////////////////////////////////////////////////////////////\n        ////////////////////////woyA/zUAAP80CQD/PQQA/924sf////////7+///////20sr/URUI/zEH\n        AP86DAH/OwwB/zwMAf8/DAH/OwsA/zkLAP9CDAD/iRoA/2ASAP8wCQD/NAkA/zgAAP/RoZb///////z7\n        +//+/////+Pc/2IcDv8dAgD/GAAA/5BYS/////3/+vz8//r6+v/6+vv//P7///3+///8/v7//P3+//z9\n        /v/7/f7/+/39//v9/f/4/P3/+Pz9//j8/f/4/Pz/+Pv8//j7/P/3+/z/9/v7//f6+//3+fr/9/7///Lk\n        4f++Lgz/uyEA/8AlAP/AJQD/wCUA/8AlAP+/JQD/viUA/8IlAP/IJgD/yScA/8snAP/MJwD/zigA/9Eo\n        AP/SKAD/0ygA/8kmAP8jBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAA\n        AP8AAAD/Qg0A/2ATAP9cEgD/WhIA/1sSAP9cEgD/XRIA/10SAP9dEgD/XRIA/10SAP9dEgD/XxMA/2ET\n        AP9hEwD/YxMA/0gFAP+WVEX///////3////9/v7//f////7////+/////v////7////+/////v//////\n        ///////////////////////////////////////////////////////////////////UkID/OgAA/yoA\n        AP+jXU7//////////////////////6BXSP8qAAD/OgwB/zsMAf87DAH/Pw0B/z0MAf85DAH/Qg0B/0MN\n        Af95FwD/ZhMA/zYKAP86CwD/MQMA/3UvI///7uj/////////////////xpWJ/yUAAP8TAAD/k1tN////\n        //////////////7////+/////v////7////+/////f////3////9/////P////z+///8/v7/+/7+//r9\n        /v/6/f7/+v3+//r9/f/5/P3/+Pz9//j7/P/5////9Obj/7wuDf+5IAD/vSQA/78lAP/AJQD/wCUA/8Al\n        AP/AJQD/xCYA/8MmAP/EJgD/xyYA/8cnAP/IJgD/yycA/80nAP/SKAD/yicA/yMHAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP9CDQD/XxMA/1wSAP9ZEQD/WREA/1wS\n        AP9cEgD/XBIA/1wSAP9dEgD/XRIA/10SAP9dEgD/XxMA/2ETAP9kFAD/PAQA/4tJO//44Nv/69/d/+ve\n        2//s3tv/7N7b/+zf2//s39v/7d/c/+3f3P/t39z/7d/c/+3h3v/t4d7/7uLf/+/h3v/w4t//8OPg//Hj\n        3//x49//8OLf//Di3//x4+D/9vHw/9KFc/85AAD/Sw4A/+i5rv/17ev/8uTg//ft6v/XqqD/QwYA/zQJ\n        AP83CwH/NQsB/zgLAf83CwH/OgwB/zYLAf8/DQH/QQ0B/3sYAf9mFAH/NQoB/z0MAP85CwD/NQAA/7h2\n        Z//67ev/8eTh//Hm4//64dv/aTIl/wsAAP+LUUP//efh/+/j4P/v4d7/7uHe/+7h3v/u4d7/7uHe/+7h\n        3v/u4d7/7uHe/+7h3v/u4d7/7uHd/+7g3f/v4t//9OXh//Pk4f/y49//8uPf//Tk4P/05eH/9OXi//Xp\n        5v/w08z/vC0M/7kgAP+9JAD/vSQA/70kAP+/JQD/wCUA/8ElAP/DJgD/xCYA/8QmAP/DJgD/wiYA/8gm\n        AP/OJwD/0SgA/9MoAP/MJwD/JAcA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAA\n        AP8AAAD/AAAA/0ANAP9cEgD/WhIA/1kRAP9aEgD/XBIA/1wSAP9cEgD/XBIA/1wSAP9cEgD/XBIA/10S\n        AP9eEwD/YRMA/2ETAP86CwD/MAwC/zASC/8sEQv/LBEK/ysRC/8sEQv/LxIL/ywRC/8sEQv/LBEL/ywR\n        C/8sEQv/MBIL/zASC/87FQv/OxQL/zwUC/9EFgv/RhYL/0kXC/9FFgv/QxUL/z8UC/9BFQz/OA8G/yoH\n        AP83DAL/PBkQ/0EVC/9DFgv/RBcM/zsLBv8sBgD/MwoA/zQKAf85CwH/OQsB/zoMAf85CwH/OAsB/z8N\n        Af89DQH/bRUB/2wWAf9iFAH/RA4B/0INAf85CgD/QQwC/0cXC/9EFwz/PBQL/zgXDv8vEAj/IQUA/y4L\n        A/82Ewv/NRML/zUTC/81Ewv/NRML/zoUC/86FAv/PxUL/0YXC/9CFgv/RRYL/0UXC/9GFwv/QxYL/0sY\n        DP+VJwz/qCsM/6YqDP+nKgz/riwM/78vDf+6Lg3/uy4N/70tDP+5JAH/uyMA/70kAP+9JAD/vSQA/70k\n        AP+/JQD/wyYA/8QmAP/FJgD/xCYA/8QmAP/FJgD/yiYA/80nAP/QKAD/1ykA/9AoAP8kBwD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/PgwA/1sSAP9WEQD/WRIA/1sS\n        AP9cEgD/XBIA/1wSAP9cEgD/XBIA/1wSAP9cEgD/XBIA/14TAP9hEwD/WxIA/zAKAP8oCAD/HAMA/xsC\n        AP8cAgD/GQIA/xsCAP8qBQD/HAIA/xoCAP8aAgD/GwIA/xsCAP8fAwD/HwMA/yoFAP8tBQD/KwUA/y0F\n        AP8tBQD/MQYA/zMGAP8xBgD/LQUA/zEGAP8wCAD/KAgA/ycIAP8nBQD/LQUA/ysFAP8uBQD/MQgA/zQK\n        AP83CgD/MwkA/zYKAP85CwD/OgsB/zsMAf81CwH/OwwB/zkMAf9lFAH/axUB/0QOAf8+DQH/PQwB/zwM\n        Af86CgH/NwgA/zoIAP8tBgD/IwQA/yIGAP8kBwD/JAYA/yQEAP8kBAD/JAQA/yQEAP8kBAD/JwUA/ywF\n        AP8qBQD/MQYA/zMGAP82BwD/NQcA/zYHAP81BwD/LwYA/10PAP+cGwD/oxwA/6cdAP+2HwD/uCAA/7Mf\n        AP+1HwD/tiAA/7gjAP+8JAD/vCQA/7sjAP++JAD/viQA/7skAP+9JAD/wiUA/8QmAP/FJgD/yCYA/8km\n        AP/NJwD/zScA/8wnAP/XKQD/0igA/yUHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8/DAD/XBIA/1YSAf9bFQT/WxIA/1sSAP9bEgD/WxIA/1wSAP9cEgD/XBIA/1wS\n        AP9cEgD/XBIA/2ATAP9QEAD/LAkA/ycIAP8eBgD/HAYA/x4GAP8fBgD/HwYA/x4GAP8fBgD/HwYA/x8G\n        AP8fBgD/HwYA/yMHAP8jBwD/LAkA/zAJAP8pCAD/JQcA/yQHAP8lBwD/KAgA/ysIAP8oCAD/JwgA/yoJ\n        AP8sCQD/KwgA/ykIAP8tCQD/KwkA/ysJAP8vCQD/MAkA/zQJAP8xCQD/LgkA/zEJAP8vCQD/NAoA/y4J\n        AP8wCQH/LQoB/2ATAf9wFgH/OAsB/0ANAf86DAH/OQwB/zgMAf86DAH/Qw4B/zMKAf8oCQH/IwgB/yIH\n        AP8jBwD/KAgA/ygIAP8oCAD/KQgA/ygIAP8oCAD/LwkA/y0JAP8vCQD/NgoA/zgLAP84CgD/OgsA/zsL\n        AP83CwD/NwoA/4AYAP+hHwD/qiEA/7gjAP+0IgD/sSIA/7MiAP+2IwD/uiQA/7okAP+5IwD/uiMA/7sj\n        AP++JAD/vCMA/7wjAP+/JQD/wiUA/8YmAP/IJgD/yiYA/84oAf/PKwT/zScA/9MoAP/LJwD/JAcA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/z4MAP9bEgD/WBQD/2Ab\n        C/9bEQD/WxIA/1sSAP9bEgD/WxIA/1sSAP9bEgD/XBIA/1wSAP9cEgD/XhIA/04PAP8sCQD/JQcA/x0G\n        AP8aBQD/GgUA/xsFAP8cBQD/HwYA/x4GAP8eBgD/HwYA/x8GAP8fBgD/IwcA/yMHAP8qCAD/LQkA/ykI\n        AP8jBwD/IwcA/yQHAP8kBwD/JAcA/yUHAP8jBwD/IwcA/yoIAP8sCQD/KQgA/ygIAP8qCAD/JwcA/y0J\n        AP8sCQD/KwgA/ywJAP8uCQD/KwkA/y8JAP8wCQD/LQkA/y8JAP8rCAD/YxMA/20VAf8xCgH/OQsB/zUL\n        Af85DAH/OgwB/z4NAf9ADQH/MgsB/ygJAf8kCAH/JAgB/yUIAf8oCAH/KAgA/ygIAP8nCAD/KAgA/ycI\n        AP8tCQD/LgkA/y4JAP81CQD/NwoA/zkLAP82CgD/OgsA/zcKAP8yCQD/SQ4A/5EbAP+7JAD/vCQA/7Ei\n        AP+yIgD/siIA/7UiAP+5JAD/uiQA/7okAP+6JAD/uyQA/74kAP+/JAD/wCQA/8IlAP/FJgD/xyYA/8Ym\n        AP/IJgD/0SoE/9IxDP/PJgD/0SgA/8gmAP8jBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/PgwA/1oRAP9aFwb/ZycW/1oQAP9bEgD/WxIA/1sSAP9bEgD/WxIA/1sS\n        AP9bEgD/WxIA/1sSAP9dEgD/UhAA/ywJAP8gBwD/HQYA/xkFAP8ZBQD/GgUA/xsFAP8aBQD/GgUA/xwG\n        AP8fBgD/HQYA/x4GAP8gBwD/IQcA/ycIAP8rCQD/KQgA/yIHAP8gBwD/IgcA/yMHAP8iBwD/IwcA/yIH\n        AP8iBwD/JQgA/ygIAP8nCAD/IgcA/ycIAP8pCAD/JgcA/ycIAP8oCAD/KQgA/ysIAP8qCAD/KwgA/yoJ\n        AP8pCQD/LgkA/ywIAP9dEgD/UA8A/yUHAP8pCAD/KwkB/ywKAf8tCgH/LwoB/zAKAf8tCgH/KQkB/yII\n        Af8jCAH/JAgB/yUIAf8nCAH/KgkB/y4JAf8nCAD/JwgA/yoIAP8wCQD/LgkA/zUKAP81CgD/NgoA/zYK\n        AP86CwD/OAoA/zcKAP81CgD/dRcA/6wgAP+yIQD/siIA/7IiAP+yIgD/tyMA/7kkAP+7JAD/uyQA/7sk\n        AP++JQD/vyUA/8EmAP/DJgD/wiUA/8UlAP/GJgD/xyYA/8olAP/MLQj/0TsY/88lAP/UKAD/ySYA/yMG\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8+DAD/WREA/1oX\n        Bv91Nyr/XBIB/1kRAP9YEgD/WxIA/1sSAP9bEgD/WxIA/1sSAP9bEgD/WxIA/1wSAP9WEQD/JwgA/x0G\n        AP8bBQD/GQUA/xkFAP8ZBQD/GQUA/xkFAP8aBQD/GwUA/xsFAP8bBQD/GwUA/x8GAP8fBgD/JQgA/ywJ\n        AP8nCAD/HwYA/x8GAP8fBgD/IAYA/x8GAP8hBgD/IgcA/ycIAP8gBgD/IAYA/yEHAP8fBgD/IAYA/yEH\n        AP8hBwD/IAYA/yEHAP8hBwD/IgcA/yQHAP8kBwD/JAcA/yYIAP8mBwD/IwcA/0AMAP8tCQD/IwcA/yQH\n        AP8lBwD/JQcA/yYIAP8nCAH/JggB/ysJAf8pCQH/IwgB/yMIAf8kCAH/JAgB/yQIAf8oCQH/Qg4B/ykJ\n        Af8mCAH/KAkB/y4JAP8tCQD/LwkA/zEJAP8xCQD/NAoA/zkKAP88CwD/NgoA/zcKAP9qFQD/siIA/68h\n        AP+vIQD/sSEA/7MiAP+2IwD/uCMA/7kkAP+7JAD/uyQA/7skAP+8JAD/vyUA/8MmAP/DJgD/xCYA/8Qm\n        AP/IJgD/yiMA/806Gf/RQSD/yiMA/8wnAP/CJQD/IgYA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAA\n        APAAAAD/AAAA/wAAAP8AAAD/AAAA/z0LAP9YEAD/WRUF/4BJPf9jHg//WQ8A/1oRAP9ZEgD/WxIA/1sS\n        AP9bEgD/WxIA/1sSAP9bEgD/XBIA/1kRAP8oCAD/HAYA/xkFAP8ZBQD/GQUA/xkFAP8ZBQD/GQUA/xkF\n        AP8aBQD/GwUA/xsFAP8bBQD/HQYA/x4GAP8iBwD/LQkA/ycIAP8eBgD/HwYA/x8GAP8fBgD/HwYA/yAG\n        AP8iBwD/KAgA/yIHAP8qCAD/JAgA/yEGAP8gBgD/IgcA/yEGAP8fBgD/IQYA/x8GAP8hBgD/IQcA/yIH\n        AP8gBgD/JAcA/yMGAP8iBgD/KwgA/yMHAP8iBwD/JAcA/yMHAP8jBwD/IwcA/yMHAP8mCAD/KggA/ykJ\n        Af8jCAH/JAgB/yQIAf8kCAH/JAgB/yUIAf8mCQH/JwkB/ygJAf8pCQH/KwoB/y8KAf8rCQH/LwkA/zEJ\n        AP81CgD/NQoA/zgKAP83CgD/MAkA/3IWAP+2IgD/sCEA/68hAP+uIQD/sCEA/7EhAP+2IwD/uCMA/7ok\n        AP+8JAD/uyQA/74kAP/CJQD/wyYA/8MmAP/DJgD/xSYA/8gnAP/JJQD/0lAy/9FFJP/GIgD/yicA/8Ul\n        AP8iBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/PQwA/1gQ\n        AP9YFAT/g1BF/3c8Lv9WDgD/WBEA/1kRAP9YEgD/WxIA/1sSAP9bEgD/WxIA/1sSAP9cEgD/WhIA/ywJ\n        AP8cBQD/GgUA/xkFAP8ZBQD/GQUA/xkFAP8ZBQD/GQUA/xoFAP8bBQD/GgUA/xoFAP8cBQD/HgYA/yEH\n        AP8qCQD/JQcA/x4GAP8fBgD/HwYA/x8GAP8fBgD/HgYA/yMHAP8oCAD/IQYA/ycIAP8hBwD/IAYA/x8G\n        AP8fBgD/HwYA/yEGAP8gBgD/HwYA/yEHAP8hBwD/IgcA/x8GAP8pCAD/LAkA/yQHAP8pCQD/JAcA/yIH\n        AP8jBwD/IwcA/yMHAP8jBwD/IwcA/yQHAP8rCAD/JwgA/yEHAP8fBgD/JAgB/yQIAf8kCAH/IwgB/yYI\n        Af8nCQH/KQkB/ygJAf8pCQH/LwoB/ysKAf8wCgH/MQoB/zUKAf81CgD/NgoA/zUKAP9MDwD/nR4A/7Ei\n        AP+wIQD/sCEA/68hAP+yIgD/syIA/7MiAP+1IgD/uCMA/7skAP+8JAD/viUA/8AlAP/BJQD/wSUA/8Al\n        AP/AJQD/wyMA/8o1Ev/YZ0v/zkUk/8cjAP/JJwD/wiUA/yIGAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP89DAD/WA8A/1gUBP+DUUb/ilhN/2UjFP9VDQD/WhEA/1oR\n        AP9aEQD/WhEA/1sSAP9bEgD/WxIA/1sSAP9eEwD/NwsA/xkFAP8aBQD/FwUA/xgFAP8ZBQD/GQUA/xgE\n        AP8XBAD/GgUA/xoFAP8ZBQD/GAUA/xsGAP8eBgD/IQcA/yoJAP8iBwD/GwUA/xsFAP8dBgD/HAYA/xwF\n        AP8eBgD/HwYA/x8GAP8fBgD/HwYA/x8GAP8eBgD/HwYA/x8GAP8fBgD/HwYA/x8GAP8fBgD/IAcA/yAH\n        AP8gBgD/IAYA/ykIAP8pCAD/KggA/ysJAP8gBgD/IAYA/yEHAP8gBgD/HwYA/yIHAP8fBgD/KwgA/zEJ\n        AP8lCAD/IQcA/x8GAP8iBwD/JAcA/yUHAP8kBwH/IwgB/yQIAf8lCAH/JwkB/yYJAf8rCQH/LQoB/y4K\n        Af8wCgH/NAsB/zYLAf80CgH/NAoB/30YAP+xIgD/qiEA/60hAP+wIQD/syIA/7QiAP+0IgD/tCIA/7Mi\n        AP+zIgD/uCMA/7gjAP+/JQD/wCUA/8ElAP+/JQD/vyUA/8EkAP/CJgL/0Fc6/9ZsU//NRiX/xyMA/8oo\n        AP/CJgD/IgYA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/zwL\n        AP9WDwD/WBUF/4ZVSv+NXlP/hlBE/10XCP9YDgD/WREA/1oRAP9aEQD/WhEA/1oRAP9aEQD/WhIA/14T\n        AP9NDwD/HAYA/xkFAP8XBAD/GQUA/xkFAP8ZBQD/FwUA/xYEAP8YBQD/GAUA/xgFAP8WBAD/GgUA/x4G\n        AP8gBwD/KgkA/yIHAP8dBgD/HQYA/xsFAP8cBQD/GwUA/xwFAP8cBgD/HQYA/xwGAP8eBgD/HQUA/xwF\n        AP8fBgD/HwYA/x8GAP8fBgD/HwYA/x8GAP8gBwD/IAcA/x8GAP8fBgD/HwYA/x4GAP8lBwD/IwcA/x8G\n        AP8fBgD/IAYA/yAHAP8hBwD/IwcA/x8GAP8+DAD/OQsA/yIHAP8gBgD/HwYA/yEHAP8jBwD/JAcA/yIH\n        AP8iBwD/IwcA/yQHAf8kCAH/JAgB/ykJAf8vCgH/LQoB/zEKAf8yCgH/NgsB/zMLAf85CwH/ihsB/60h\n        Af+pIAD/rCEA/64hAP+zIgD/tSIA/7QiAP+0IgD/tCIA/7QiAP+0IgD/tyMA/70kAP++JAD/wCUA/8El\n        AP/BJAD/vyIA/8pIKv/Ua1P/1W1V/8pGKP+/IQD/xicA/8AlAP8iBgD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/OgsA/1QPAP9XFQX/iVlP/41fVf+SY1j/fkg7/1YP\n        Av9WDgD/VhAA/1oRAP9aEQD/WhEA/1oRAP9aEQD/WhEA/1wRAP8vCQD/GAQA/xgFAP8ZBQD/GQUA/xkF\n        AP8YBQD/FQQA/xgFAP8YBQD/FwQA/xYEAP8ZBQD/HQYA/x8GAP8nCAD/KwkA/ycIAP8tCQD/KwkA/ykJ\n        AP8nCAD/JQgA/yMHAP8kBwD/IwcA/yIHAP8hBwD/HwYA/yEGAP8fBgD/HwYA/x0GAP8dBgD/HgYA/x4G\n        AP8dBgD/HgYA/x4GAP8dBgD/HwYA/yEHAP8eBgD/HwYA/x8GAP8fBgD/IQcA/yMHAP8iBwD/IwcA/1cR\n        AP8/DAD/IAYA/yAGAP8fBgD/IgcA/yMHAP8lBwD/IwcA/yIHAP8jBwD/IwcA/yMHAP8iBwD/KQkB/zAK\n        Af8uCgH/LwoB/y8KAf83CwH/NgsB/zYLAf+SHAH/sSUE/7srCv+sIQD/ryIB/7EhAf+yIQD/tSIA/7Ui\n        AP+1IgD/tCIA/7YjAP+5IwD/uSMA/7kjAP+5IwD/uyMA/74fAP/IQSH/1W9W/9VtVf/WcVr/ykkq/74g\n        AP/EJgD/vyUA/yEGAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAA\n        AP86CwD/Ug4A/1UUBf+LXlT/kGRb/5FjWf+UZlz/ekQ4/1gRA/9SDAD/VxAA/1oRAP9aEQD/WhEA/1oR\n        AP9aEQD/XRIA/00PAP8bBgD/GAUA/xYEAP8YBQD/FwUA/xYEAP8VBAD/FwUA/xkFAP8YBQD/FgQA/xgF\n        AP8cBgD/HgYA/ycIAP8oCAD/JAgA/ykIAP8oCAD/JwgA/ykJAP8pCQD/KQgA/yoIAP8pCQD/KwkA/ywJ\n        AP8qCAD/KggA/ysJAP8rCQD/KwgA/yoIAP8rCAD/KQgA/ygIAP8nCAD/JQgA/yIHAP8jBwD/IQYA/yAG\n        AP8gBgD/IAYA/x8GAP8eBgD/HgYA/xsFAP8vCQD/bBUA/0AMAP8fBgD/IQYA/x8GAP8iBwD/IwcA/yIH\n        AP8hBwD/IgcA/yMHAP8jBwD/IQcA/yIHAP8mCAD/LwkA/ywJAP8uCQH/MAoB/zcLAf80CwH/TxAB/6Af\n        Af+nIQL/riQE/6wiAf+tIgH/sCIB/7IiAf+yIgH/siIB/7UiAP+1IgD/tSIA/7kjAP+5IwD/uSMA/7gh\n        AP+4HgD/xT4e/9VvVv/Xclv/13BZ/9h1X//LSy3/wiEA/8YnAP+9JQD/IQYA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/zoLAP9SDgD/VBQG/41hV/+TaV//kmdd/5Rn\n        Xf+ZbGL/iFRI/2MhEf9WDAD/VQ0A/1kQAP9aEQD/WhEA/1oRAP9aEQD/XxIA/zYLAP8VBAD/FgQA/xUE\n        AP8XBAD/FQQA/xcEAP8XBQD/GAUA/xkFAP8WBAD/FgUA/xwGAP8cBgD/JggA/ycIAP8nCAD/JAgA/yMH\n        AP8jBwD/JQgA/yUIAP8mCAD/JAcA/yEHAP8jBwD/JAcA/yYIAP8mCAD/JQgA/ycIAP8oCAD/KQgA/ygI\n        AP8pCAD/KQgA/y4JAP8uCQD/MAkA/zAJAP8sCQD/LQkA/y8JAP8sCQD/LAkA/y0JAP8pCAD/JgcA/0gO\n        AP95FwD/QAwA/x8GAP8fBgD/HwYA/yAGAP8gBgD/IAYA/x8GAP8fBgD/IwcA/yMHAP8hBwD/IQYA/yUH\n        AP8tCQD/KwkA/ywJAP8yCgD/NQoA/zYKAf+PHAH/qSEB/6UgAf+nIQH/qyIB/60iAf+tIgH/riIB/7Ei\n        Af+wIgH/siIB/7QiAf+2IgD/tSEA/7QgAP+zHQD/tSYF/8VOM//VdV//1XZf/9V0Xf/WdF3/13pk/8tN\n        L/+/HwD/xiYA/70kAP8hBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAA\n        AP8AAAD/OgsA/1IOAP9UFQb/kGVc/5ZtZP+Va2L/lmti/5drYv+bcGb/lmle/4BJPP9kIxT/WREA/1cO\n        AP9VCgD/VQoA/1YLAP9aDAD/UgsA/x0BAP8RAAD/EQAA/xEAAP8QAAD/EAAA/xAAAP8QAAD/EQAA/xAA\n        AP8SAAD/FgAA/xQAAP8gAgD/IgIA/yACAP8dAQD/GwEA/xoBAP8aAQD/GgEA/x0BAP8eAgD/HwIA/yMC\n        AP8hAgD/IAIA/yQCAP8dAQD/IwIA/yMDAP8hAgD/IgMA/yQDAP8iAgD/IwMA/yQDAP8jAgD/JgMA/yYD\n        AP8mAwD/KAMA/ycDAP8pBAD/LAQA/ygDAP8qBAD/SwoA/3sTAP86BgD/GQAA/xkAAP8ZAAD/GwEA/xsB\n        AP8dAQD/GgAA/xwAAP8dAQD/HgEA/xwBAP8bAAD/HwEA/ykDAP8nAwD/KgMA/zIEAP8sAwD/Yg4A/6gb\n        AP+jGgD/pRsA/6YcAP+mHAD/qx0A/6sdAP+rHQD/qx0A/64dAP+wHAD/sRwA/7IeAP+1IgD/uCsK/8JI\n        LP/Qa1T/1ntm/9R4Y//Ud2L/1nhi/9Z4Yv/Yfmn/zU8x/8AfAP/CJQD/uyQA/yEGAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP86CwD/Ug4A/1QVBv+TaWD/mXFo/5hv\n        Zv+Yb2b/mG9m/5lwZv+bcWj/nXRr/5lvZf+NXVL/g01A/3tBNP96PzH/dDYo/3Q2KP93Nyj/XjIo/zor\n        KP88LCj/OSso/zkrKP85Kyj/OSso/zkrKP85Kyj/OSso/zorKP8/LCj/PSwo/0YuKP9GLyj/Ri4o/0Uu\n        KP9ELij/Qy4o/0ItKP9CLSj/RS4o/0UvKP9GLyj/TC8o/1gxKP9CLSj/Qi4o/0QuKP9ELij/RC4o/0Mu\n        KP9KLyj/Si8o/0UuKP9ILyj/TC8o/0kvKP9JLyj/Sy8o/0svKP9LLyj/TC8o/0wvKP9OLyj/TS8o/0ov\n        KP9pNSj/lT0o/10yKP9BLSj/Qi0o/0EtKP9DLSj/Qy0o/0QuKP9CLSj/Qi0o/0MtKP9CLSj/Qy4o/0Qu\n        KP9HLij/UDAo/04wKP9PMCj/Ui8o/2EyKP+pQSj/r0Io/7NDKP+zQij/tEIo/7VDKP+2Qyn/uEQp/7lE\n        Kf+5RCn/vEMo/8BJLv/BTjT/w1Q7/8ljS//OdF//039r/9V9av/We2b/1ntm/9Z7Zv/Xe2b/2Htm/9mB\n        bf/KUDP/ux4A/8AlAP+8JAD/IQYA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAA\n        AP8AAAD/AAAA/zoLAP9SDgD/VBUG/5ZtZf+cdm3/m3Rr/5t0a/+bdGv/m3Rr/510a/+cdGv/nXVs/6B3\n        bv+ieXH/o3ty/6J6cf+hd2//oXdv/6J3b/+jeG//hHJv/3lwb/97cG//e3Bv/3twb/96cG//enBv/3pw\n        b/96cG//e3Bv/31wb/99cW//hXNv/4x0b/+Bcm//g3Jv/4Fyb/+Bcm//gXJv/4Fyb/+Bcm//f3Jv/4Jy\n        b/+Fcm//k3Vv/4Rzb/9/cm//gHJv/39yb/99cW//fXFv/3xxb/9+cm//fHFv/39yb/+Gc2//hHJv/4Ry\n        b/+Gc2//g3Jv/4Nyb/+Ccm//gnJv/4Ryb/+Ic2//h3Nv/5t3b/+1fG//knVv/4Byb/+AcW//fnFv/4By\n        b/+Acm//gHJv/4Bxb/+AcW//f3Fv/39xb/+Ccm//gHJv/4hzb/+Ic2//hnNv/4lzb/+Jc2//t3xv/8l/\n        b//Hf2//yYBv/8iAb//KgG//y4Bv/8yAbv/MgG7/zIBu/82Bbv/PgG7/0oNw/9OEcv/UhHL/0oJv/9J/\n        bf/Tf2v/035r/9R+a//Wf2v/1n9r/9h/a//Zf2v/24Zz/8tSNv+7HgD/wiUA/70kAP8hBgD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/OQsA/1IOAP9VFgf/mHJp/556\n        cv+deHD/nnhw/554cP+eeHD/oHlw/6B5cP+eeHD/n3hw/594cP+heHD/oXlw/6F5cP+heXD/oXlw/6N5\n        cP+ad3D/hHNw/4FzcP+Bc3D/gHJw/35ycP99cnD/fHJw/3txcP96cXD/fHJw/3lycP+RdnD/l3dw/4Bz\n        cP+GdHD/kHZw/4Z0cP+Ec3D/hXRw/4p1cP+IdHD/g3Nw/4Z0cP+Td3D/oHlw/6N5cP+ienD/onpw/6F5\n        cP+feXD/mXhw/5R3cP+OdnD/iXVw/4d0cP+FdHD/hHRw/4d1cP+EdHD/hHRw/4NzcP+Ec3D/hnRw/4h1\n        cP+GdXD/mnhw/7R8cP+SdnD/gXNw/4JzcP+Bc3D/gXNw/4FzcP+Bc3D/gXNw/4FzcP+Bc3D/gXNw/4Fz\n        cP+FdHD/iXVw/4Z0cP+GdHD/hnRw/6V6cP/KgXD/x4Bw/8iAcP/HgHD/x4Bw/8mAcP/JgHD/yoFw/8uB\n        cP/LgXD/0YJx/9mFcv/QgnD/0IJw/9GCcP/QgnD/0YJw/9SCcP/UgnD/1YNw/9WDcP/Vg3D/1oNw/9aD\n        cP/ainj/y1Q5/74eAP/HJgD/vSQA/yEGAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAA\n        AP8AAAD/AAAA/wAAAP85CwD/UQ4A/1UWB/+cdm3/pn92/6B8dP+hfHT/oXx0/6F8dP+jfXT/o310/6N9\n        dP+jfXT/o3x0/6R9dP+kfXT/pH10/6V9dP+lfXT/pX10/6Z9dP+lfXT/pH10/6V9dP+jfXT/oXx0/558\n        dP+be3T/lnp0/5R6dP+SeXT/jnl0/6N9dP+ffHT/i3h0/4p4dP+MeHT/iXh0/4h4dP+HeHT/i3h0/4t4\n        dP+FeHT/hnh0/5d7dP+wf3T/sX90/7F/dP+xf3T/sn90/7KAdP+zgHT/soB0/7OAdP+tf3T/jHh0/4l4\n        dP+KeHT/i3h0/4p4dP+JeHT/inh0/4l4dP+KeHT/i3h0/4l4dP+efHT/sYB0/5J6dP+Fd3T/hXd0/4V3\n        dP+Fd3T/hXd0/4V3dP+Fd3T/hXd0/4V3dP+Fd3T/hnd0/4x4dP+LeHT/inh0/4p4dP+VenT/woN0/8eD\n        dP/Ig3T/yYR0/8qEdP/KhHT/yoR0/8mEdP/JhHT/y4V0/8uFdP/PhXT/0oZ0/9GGdP/QhXT/0YV0/9KG\n        dP/ShnT/04Z0/9SGdP/Wh3T/14d0/9eHdP/Xh3T/14d0/9mOfP/KVjv/vh4A/8YmAf+/JQH/IgYA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/zkLAP9RDgD/UxYH/6N6\n        cv+0hnz/oYB5/6KAef+kgXn/pIF5/6SBef+mgXn/p4F5/6WBef+lgXn/p4F5/6eBef+ngXn/p4F5/6eB\n        ef+ngXn/p4F5/6iBef+qgnn/qoJ5/6qCef+qgnn/q4J5/62Def+vg3n/r4N5/6+Def+ug3n/rYJ5/6yC\n        ef+sgnn/q4J5/6uCef+pgnn/poF5/6SBef+fgHn/nn95/5x/ef+Zf3n/qIF5/7ODef+xg3n/sYN5/7GD\n        ef+xg3n/sYN5/7GDef+yg3n/tYR5/7GDef+NfHn/i315/5d+ef+Zf3n/jn15/5B9ef+NfHn/k355/5N+\n        ef+RfXn/kH15/6GAef+3hXn/nH95/4h8ef+Je3n/iHt5/4d7ef+He3n/iXx5/4l8ef+JfHn/iXx5/4h8\n        ef+NfXn/j315/419ef+MfHn/lH55/7qFef/KiHn/yIh5/8iIef/IiHn/yYh5/8qIef/KiHn/y4h5/8uI\n        ef/MiHn/y4h5/8yIef/PiXn/0Il5/9KKef/Rinn/04p5/9OKef/Tinn/04p5/9SKef/Xi3n/14t5/9iL\n        ef/Yi3n/3JOB/8tYPf+5HQD/wSYB/70lAf8iBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAA\n        AP8AAAD/AAAA/wAAAP8AAAD/OQsA/1EOAP9TFgj/oH12/6eHgP+mhX7/pYV+/6aFfv+nhX7/p4V+/6mF\n        fv+qhX7/qIZ+/6iGfv+qhX7/qoV+/6qFfv+qhX7/qoV+/6qFfv+qhX7/qoV+/6uGfv+shn7/rIZ+/6yG\n        fv+shn7/rIZ+/66Gfv+vhn7/r4Z+/6+Gfv+vhn7/r4Z+/6+Hfv+wh37/soh+/7KIfv+yiH7/s4h+/7SI\n        fv+0iH7/s4h+/7OIfv+ziH7/s4d+/7SHfv+0h37/tId+/7SHfv+0h37/tId+/7SHfv+0iH7/tId+/5+E\n        fv+ag37/mIJ+/5SCfv+Wgn7/k4F+/5GBfv+Xgn7/l4N+/5GBfv+QgX7/oIR+/8CKfv+jhH7/i39+/42A\n        fv+MgX7/jIB+/4yAfv+NgX7/jYB+/42Afv+MgH7/jYF+/5SBfv+SgX7/j4F+/5mDfv+9iX7/yIt+/8eM\n        fv/JjH7/yox+/8qMfv/KjH7/yox+/8qMfv/LjH7/zIx+/86Nfv/QjX7/zYx+/86Mfv/PjX7/0I1+/9OO\n        fv/Ujn7/1Y5+/9WOfv/Ujn7/1o5+/9SOfv/Wjn7/2Y5+/9uPfv/fl4f/zVpA/70dAP/DJgH/uiQB/yAG\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP85CwD/UQ4A/1QW\n        CP+jgnr/qouE/6mJgv+qiYL/qImC/6mJgv+rioL/rYqC/6yKgv+sioL/rYqC/66Kgv+tioL/rYqC/62K\n        gv+tioL/rYqC/62Kgv+tioL/rYqC/6+Kgv+vioL/r4qC/6+Kgv+vioL/sYuC/7KLgv+yi4L/souC/7KL\n        gv+yi4L/souC/7OLgv+0i4L/tIuC/7SLgv+0i4L/tIuC/7SLgv+0i4L/tIuC/7SLgv+1i4L/t4uC/7eL\n        gv+3i4L/t4uC/7eLgv+3i4L/t4uC/7aLgv+3i4L/uYyC/7mMgv+3jIL/toyC/7aMgv+zi4L/souC/62K\n        gv+oiYL/qomC/6iJgv+yi4L/wY6C/6iJgv+ShIL/koWC/5GFgv+QhYL/j4SC/46Egv+PhIL/kISC/5GF\n        gv+ThYL/loWC/5GFgv+gh4L/xo+C/8mQgv/Fj4L/xo+C/8mPgv/LkIL/y5CC/8uQgv/MkIL/zJCC/8yQ\n        gv/MkIL/0ZGD/9iUhP/OkIL/z5CC/8+Qgv/RkYL/1JGC/9SRgv/UkYL/1ZKC/9aSgv/VkoL/1pKC/9eS\n        gv/YkoL/2pKC/9+bi//KW0L/uh0A/8EmAf+7JAH/IQYA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAA\n        APAAAAD/AAAA/wAAAP8AAAD/AAAA/zgLAP9QDQD/VRcI/6WFfv+tj4j/q42G/62Nhv+sjYb/rI2G/66O\n        hv+vjob/r46G/6+Ohv+xjob/sY6G/7COhv+wjob/sI6G/7COhv+wjob/sI6G/7COhv+wjob/sY6G/7KO\n        hv+yjob/so6G/7KOhv+yj4b/so+G/7OPhv+0j4b/tI+G/7SPhv+0j4b/tI+G/7eQhv+3kIb/to+G/7aP\n        hv+3j4b/t4+G/7ePhv+2j4b/to+G/7ePhv+4j4b/uY+G/7mPhv+5j4b/uY+G/7mPhv+5j4b/uY+G/7mP\n        hv+6kIb/u5CG/7yQhv+8kIb/vJCG/7yQhv++kYb/vpGG/72Rhv++kYb/wJKG/7+Rhv/AkYb/wJKG/7yQ\n        hv+4kIb/tY+G/7KPhv+wjob/rI6G/6aNhv+ji4b/oYuG/5+Lhv+ciob/p42G/8SShv/UlYb/y5OG/8iT\n        hv/Jk4b/ypOG/8uThv/MlIb/zJOG/82Thv/OlIb/zZSG/82Uhv/OlIb/zpSG/9GUhv/QlIb/0ZWG/9OV\n        hv/UlYb/1ZWG/9SVhv/VlYb/15aG/9iWhv/Ylob/2paG/9qWhv/alob/3p6P/8tdQ/+4GwD/vCQA/7Yj\n        AP8hBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/OAsA/04N\n        AP9TFwj/qImD/7CTjf+vkYv/sJKL/7CSi/+wkov/sJKL/7CSi/+ykov/s5KL/7OSi/+ykov/s5KL/7OS\n        i/+zkov/spKL/7GSi/+zk4v/s5OL/7OSi/+zk4v/tJOL/7WTi/+1k4v/tZOL/7WTi/+0k4v/tpOL/7eT\n        i/+3k4v/t5OL/7eTi/+3k4v/uJSL/7iUi/+5lIv/uZSL/7mUi/+5lIv/upSL/7qUi/+6lIv/upSL/7mU\n        i/+7lIv/vJSL/7yUi/+8lIv/vJSL/7yUi/+8lIv/vJSL/7yUi/++lIv/vpSL/76Ui/++lIv/vpSL/76U\n        i/++lIv/v5SL/72Vi/+9lYv/v5WL/8CVi//Elov/xJaL/8WWi//Hlov/yJaL/8iWi//Ilov/x5aL/8WW\n        i//Glov/yJaL/8iXi//Kl4v/yJeL/8WWi//Jlov/y5eL/8yXi//Ml4v/zJeL/82Xi//Nl4v/zpeL/8+Y\n        i//QmIv/0JiL/9CYi//QmIv/0JiL/9GYi//TmYv/1JmL/9WZi//VmYv/1pmL/9aZi//Wmov/2JqL/9ia\n        i//amov/25qL/9yai//go5X/zF9G/7QaAP+7IwD/uSQB/yEHAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP84CwD/TQ0A/1MXCf+rjof/s5iT/7GWkP+ylpD/s5aQ/7OW\n        kP+zlpD/s5aQ/7SXkP+1l5D/tZeQ/7WXkP+1l5D/tZeQ/7WXkP+5mJD/wpuR/7WXkP+2l5D/tpeQ/7aX\n        kP+2l5D/t5eQ/7iXkP+4l5D/t5eQ/7iYkP+6mJD/upiQ/7qYkP+6mJD/upiQ/7qYkP+6mJD/upiQ/7uY\n        kP+7mJD/u5iQ/7yYkP+8mJD/vJiQ/7yYkP+8mJD/vJiQ/7yYkP++mJD/vpiQ/76YkP++mJD/vpiQ/76Y\n        kP++mJD/vpiQ/7+ZkP/AmZD/wJmQ/8CZkP/AmZD/wJmQ/8CZkP/DmZD/wpmQ/8GZkP/CmZD/wpmQ/8SZ\n        kP/FmZD/xJmQ/8aakP/GmpD/xpqQ/8eakP/HmpD/x5qQ/8ebkP/ImpD/ypuQ/8qbkP/Jm5D/ypuQ/8qb\n        kP/Km5D/zJuQ/8ybkP/Nm5D/zpuQ/8+ckP/PnJD/z5yQ/8+ckP/RnJD/0pyQ/9KckP/RnJD/0ZyQ/9Kc\n        kP/UnZD/1Z2Q/9WdkP/XnZD/2J2Q/9idkP/YnZD/2p6Q/9qekP/anpD/256Q/+Gnmv/KYEj/sxoA/7oj\n        AP/CKAT/JAcB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/zUK\n        AP9MDQD/UxcJ/6+TjP+3nZj/tZuV/7ablf+2mpX/tpqV/7aalf+2mpX/t5uV/7mblf+5m5X/t5uV/7mb\n        lf+5m5X/uZuV/7qblf+9nJX/uZuV/7mblf+5m5X/uZuV/7qclf+6nJX/upyV/7yclf+8nJX/u5yV/7yc\n        lf+9nJX/vZyV/72clf+9nJX/vZyV/72clf+9nJX/vZyV/76clf+/nZX/vp2V/76dlf++nZX/v52V/7+d\n        lf+/nZX/v52V/8Gdlf/BnZX/wZ2V/8Gdlf/BnZX/wZ2V/8Gdlf/BnZX/wZ2V/8Gdlf/CnZX/w52V/8Od\n        lf/DnZX/wp2V/8Odlf/EnZX/xZ2V/8Wdlf/FnZX/xZ2V/8edlf/InpX/yJ6V/8ielf/HnpX/yJ6V/8me\n        lf/JnpX/yZ6V/8melf/JnpX/yp+V/8yflf/NoJX/zaCV/82flf/Nn5X/zZ+V/82flf/On5X/z6CV/9Gg\n        lf/RoJX/0aCV/9Oglf/SoJX/06CV/9Oglf/UoJX/1KCV/9Oglf/ToJX/1KGV/9ihlf/ZopX/2aGV/9qi\n        lf/bopX/26KV/92ilf/dopX/4auf/8hiS/+yGQD/uSMA/7MiAP8fBgD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAACfAAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/NwsA/1ANAP9VGAn/spaQ/7qinP+4n5n/uZ+Z/7qf\n        mf+6n5n/up+Z/7qfmf+5n5n/up+Z/7yfmf+7n5n/vJ+Z/7yfmf+8n5n/vJ+Z/7yfmf+8n5n/vJ+Z/7yf\n        mf+8n5n/vaCZ/72gmf+9oJn/vqCZ/76gmf++oJn/v6CZ/8Cgmf/AoJn/wKCZ/8Cgmf/AoJn/wKCZ/8Cg\n        mf/AoJn/wKCZ/8Ghmf/CoZn/wqGZ/8Khmf/CoZn/wqGZ/8Khmf/CoZn/w6GZ/8Ohmf/EoZn/xKGZ/8Sh\n        mf/EoZn/xKGZ/8Shmf/EoZn/xKGZ/8Shmf/FoZn/xqGZ/8ahmf/GoZn/xaGZ/8Whmf/GoZn/yKGZ/8ih\n        mf/IoZn/x6GZ/8ihmf/Kopn/yqKZ/8qimf/Kopn/yqKZ/8uimf/Lopn/zKKZ/8yimf/Mopn/zqOZ/86j\n        mf/Po5n/z6OZ/8+jmf/Po5n/0KOZ/8+jmf/Qo5n/0qSZ/9Okmf/TpJn/06SZ/9Kkmf/TpJn/1aSZ/9Wk\n        mf/VpJn/1qSZ/9akmf/WpZn/16WZ/9ilmf/apZn/26aZ/9ummf/cppn/3qaZ/96mmf/isKT/yGRN/68Y\n        AP+2IwD/sCEA/x4GAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAA\n        AP83CwD/Tg0A/1QYCf+0mZT/vaah/7ujnv+7o57/u6Oe/72knv+9pJ7/vaSe/72knv+9pJ7/vaSe/76k\n        nv++pJ7/vqSe/76knv++pJ7/vqSe/76knv++pJ7/vqSe/76knv+/pJ7/wKSe/8Cknv/ApJ7/wKSe/8Ck\n        nv/BpJ7/wqWe/8Klnv/CpZ7/wqWe/8Klnv/CpZ7/wqWe/8Klnv/CpZ7/w6We/8Slnv/EpZ7/xKWe/8Sl\n        nv/EpZ7/xKWe/8Slnv/EpZ7/xKWe/8Wlnv/GpZ7/xqWe/8alnv/GpZ7/xqWe/8alnv/GpZ7/xqWe/8el\n        nv/HpZ7/yKWe/8ilnv/IpZ7/yKWe/8ilnv/JpZ7/yaae/8mmnv/Kpp7/yaWe/8umnv/Mpp7/zKae/82n\n        nv/Np57/zKae/8ymnv/Np57/zqee/9Cnnv/Qp57/z6ee/8+nnv/Qp57/0Kee/9Cnnv/RqJ7/0qie/9Ko\n        nv/TqJ7/06ie/9Wonv/VqJ7/1aie/9aonv/XqJ7/16ie/9eonv/XqJ7/16ie/9ipnv/YqZ7/2Kme/9yq\n        nv/cqp7/466h/9+rn//fqp7/4Kqe/+OzqP/GYkv/rhkA/7UiAP+uIQD/HgYA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/zcLAP9PDgD/UBMF/6uOh//BrKf/vqei/76n\n        ov++p6L/v6ei/7+nov++p6L/wKei/8Cnov/Ap6L/v6ei/8Goov/CqKL/waei/8Cnov/CqKL/wqii/8Ko\n        ov/CqKL/wqii/8Ooov/DqKL/w6ii/8Ooov/DqKL/xKii/8Ooov/EqaL/xami/8Wpov/FqaL/xami/8Wp\n        ov/FqaL/xami/8Wpov/FqaL/xqmi/8epov/HqaL/x6mi/8epov/HqaL/x6mi/8epov/HqaL/x6mi/8ip\n        ov/JqaL/yami/8mpov/JqaL/yami/8mpov/JqaL/yami/8ipov/JqaL/y6mi/8upov/LqaL/y6mi/8up\n        ov/KqaL/yqmi/8qoof/VsKf/0Kyk/82qov/NqqL/zqqi/86qov/PqqL/z6qi/9Cqov/QqqL/0Kqi/9Gr\n        ov/Sq6L/0qui/9Krov/Sq6L/0qui/9Orov/Uq6L/1Kyi/9Ssov/UrKL/1Kyi/9Wsov/XrKL/2Kyi/9is\n        ov/ZrKL/2ayi/9isov/YrKL/2ayi/9msov/araL/3a2i/92tov/grqP/366i/+Cuov/grqP/4rKn/8BU\n        O/+sGgD/tCMA/64hAP8eBgD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAA8AAAAP8AAAD/AAAA/wAA\n        AP8AAAD/NQoA/00OAP9MDQD/nn11/8e0r//BrKf/wayn/8Gsp//BrKf/wqyn/8Ksp//CrKf/wqyn/8Ks\n        p//CrKf/w6yn/8Ssp//DrKf/w6yn/8Ssp//ErKf/xKyn/8Wsp//Fraf/xq2n/8atp//Graf/xq2n/8at\n        p//Graf/xq2n/8atp//Hraf/x62n/8itp//Iraf/yK2n/8itp//Iraf/yK2n/8itp//Iraf/ya2n/8mt\n        p//Jraf/ya2n/8mtp//Jraf/ya2n/8mtp//Jraf/yq2n/8utp//Lraf/y62n/8utp//Lraf/y62n/8ut\n        p//Lraf/y62n/8utp//Lraf/zK2n/82up//Orqf/zq6n/82up//Nrqf/za2n/9CwqP/Pr6f/z66n/9Cu\n        p//Qrqf/z66n/9Gup//Sr6f/0a+n/9Gvp//Rr6f/0q+n/9Ovp//Ur6f/1K+n/9Svp//Ur6f/1a+n/9Wv\n        p//Wr6f/1q+n/9Wvp//Vr6f/2LCn/9iwp//YsKf/2rCn/9qwp//asKf/27Cn/9uwp//asKf/2rCn/9ux\n        p//dsaf/37Gn/9+yp//gsqf/4LKn/+K0qf/gsaX/tj8j/6wcAP+yIgD/rSEA/x4GAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAJ8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP80CgD/TQ8A/0YGAP+HXlX/y7q2/8Sw\n        rP/EsKz/xLCs/8SwrP/EsKz/xbCs/8axrP/Gsaz/xrGs/8axrP/Hsaz/xrGs/9C0rf/Ksqz/x7Gs/8ew\n        rP/IsKz/yLCs/8ixrP/Jsaz/ybGs/8mxrP/Jsaz/ybGs/8mxrP/Jsaz/ybGs/8mxrP/Jsaz/ybGs/8qy\n        rP/Lsqz/y7Ks/8uyrP/Lsqz/y7Ks/8uyrP/Lsqz/zLKs/8yyrP/Msqz/zLGs/8yxrP/Msaz/zLGs/8yx\n        rP/Msaz/zLGs/8yxrP/Nsaz/zrGs/86xrP/Osaz/zrGs/86xrP/Osaz/zrGs/86xrP/Osaz/zrKs/8+y\n        rP/Qsqz/0LKs/9CyrP/Qsqz/z7Ks/9CyrP/Rsqz/07Os/9OzrP/Tsqz/07Ks/9SzrP/Us6z/1LOs/9Sz\n        rP/Ts6z/07Os/9SzrP/Ws6z/17Os/9ezrP/Ws6z/1rOs/9azrP/Xs6z/2LOs/9izrP/atKz/27Ss/9q0\n        rP/atKz/2rSs/9q0rP/ctKz/3bSs/920rP/dtaz/3bWs/9+1rP/gtqz/4bas/+C2rP/gtqz/47qx/9qi\n        lP+pJgb/qh8A/64hAP+oIAD/HgYA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAnwAAAPAAAAD/AAAA/wAA\n        AP8AAAD/AAAA/zUKAP9NDwD/SAkA/2gzJ//Hs6//ybay/8i0sP/ItLD/yLSw/8i0sP/HtLD/yLWw/8m1\n        sP/JtbD/ybWw/8q1sP/LtbD/zbaw/8y1sP/KtbD/y7Ww/8u1sP/LtbD/y7Ww/8u1sP/LtbD/y7Ww/8y1\n        sP/MtbD/zLWw/8y1sP/MtbD/zLWw/8y1sP/MtbD/zLaw/862sP/OtrD/zraw/862sP/OtrD/zraw/862\n        sP/OtrD/zraw/8+2sP/PtrD/z7aw/8+2sP/PtrD/z7aw/8+2sP/PtrD/z7aw/8+2sP/QtrD/0baw/9G2\n        sP/RtrD/0baw/9G2sP/RtrD/0baw/9G2sP/RtrD/0Law/9G2sP/StrD/0raw/9O2sP/TtrD/07aw/9O2\n        sP/Ut7D/1rew/9a3sP/Wt7D/1rew/9a3sP/Wt7D/1rew/9e3sP/Xt7D/1rew/9i3sP/Zt7D/2bew/9m3\n        sP/Zt7D/2Lew/9m4sP/auLD/2riw/9q4sP/cuLD/3Liw/924sP/duLD/3biw/9y4sP/euLD/3riw/965\n        sP/gubD/4Lmw/+K5sP/iurD/47qw/+O6sP/nw7v/yHto/6MaAP+oIQD/riEA/6QgAP8eBgD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAACgAAAA7gAAAP8AAAD/AAAA/wAAAP8AAAD/MAkA/0wPAP9IDQD/TA4A/6yQ\n        iv/Rwb7/y7m1/8u5tf/LubX/y7m1/8u5tf/LubX/zLm1/8y5tf/MubX/zbm1/825tf/NubX/zbm1/865\n        tf/OubX/zrm1/865tf/NubX/zbm1/825tf/NubX/zrq1/8+6tf/PurX/z7q1/8+6tf/PurX/z7q1/8+6\n        tf/PurX/0Lq1/9C6tf/QurX/0Lq1/9C6tf/QurX/0Lq1/9C6tf/QurX/0Lq1/9K6tf/SurX/0bq1/9G6\n        tf/RurX/0bq1/9G6tf/RurX/0bq1/9K6tf/TurX/07q1/9O6tf/TurX/07q1/9O6tf/TurX/07q1/9S6\n        tf/TurX/1Lu1/9S7tf/Uu7X/1Lu1/9a7tf/Wu7X/1bu1/9a7tf/Xu7X/17u1/9i7tf/Yu7X/17u1/9i7\n        tf/Yu7X/2bu1/9m7tf/Zu7X/2ry1/9q8tf/avLX/2ry1/9q8tf/avLX/27y1/9y8tf/cvLX/27y1/9y8\n        tf/evLX/3ry1/968tf/fvLX/3ry1/968tf/gvbX/4L21/+G9tf/hvbX/4r21/+O9tf/kvbX/5b+3/+S+\n        tf+xQin/pRoA/6ghAP+rIgD/oB8A/xIDAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ4AAADVAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8jBwD/TA8A/0gOAP9FBgD/c0Q5/9LDv//Pvrv/zr25/869uf/Ovbn/zr25/869\n        uf/Ovbn/z725/8+9uf/Qvbn/z725/9C9uf/Rvbn/0L25/9G9uf/Rvbn/0b25/9G9uf/Rvbn/0b25/9G9\n        uf/Rvbn/0r65/9K+uf/Svrn/0r65/9K+uf/Svrn/0r65/9K+uf/Svrn/0r65/9O+uf/Tvrn/0765/9O+\n        uf/Tvrn/0765/9O+uf/Tvrn/0765/9S+uf/Vvrn/1b65/9W+uf/Vvrn/1b65/9W+uf/Vvrn/1L65/9S+\n        uf/Wvrn/1r65/9a+uf/Wvrn/1r65/9a+uf/Wvrn/1r65/9a+uf/Wvrn/1765/9e+uf/Xvrn/1765/9e+\n        uf/Yv7n/2b+5/9m/uf/Yv7n/2b+5/9m/uf/Zv7n/2r+5/9q/uf/av7n/2r+5/9u/uf/bv7n/3MC5/93A\n        uf/dwLn/3cC5/93Auf/dwLn/3sC5/97Auf/ewLn/3sC5/97Auf/fwLn/4MC5/+DAuf/gwLn/4cC5/+LA\n        uf/iwLn/4sG5/+LBuf/kwbn/5cG5/+TBuf/py8T/zYh5/58ZAP+mHwD/qCEA/60iAP+LGwD/BAEA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAgQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/xMDAP9JDgD/SA4A/0gN\n        AP9ICQD/poeB/9rMyv/Rwb7/0cG+/9HBvv/Rwb7/0cG+/9HBvv/Swb7/0sK+/9PCvv/Swr7/0sK+/9TC\n        vv/Uwr7/08K+/9PCvv/Twr7/08K+/9PCvv/Twr7/08K+/9TCvv/Uwr7/1MK+/9TCvv/Uwr7/1MK+/9TC\n        vv/Uwr7/1MK+/9TCvv/Uwr7/1cK+/9bCvv/Wwr7/1sK+/9bCvv/Wwr7/1sK+/9bCvv/Wwr7/18O+/9fD\n        vv/Xw77/18O+/9fDvv/Xw77/18O+/9fDvv/Xw77/18O+/9jDvv/Yw77/2MO+/9jDvv/Yw77/2MO+/9jD\n        vv/Yw77/2MO+/9jDvv/Zw77/2sO+/9rDvv/Zw77/2sO+/9rDvv/bw77/28O+/9vDvv/bw77/3MO+/9zD\n        vv/cw77/3MO+/93Dvv/dxL7/3cS+/93Evv/dxL7/3sS+/9/Evv/fxL7/38S+/9/Evv/fxL7/4MS+/+DE\n        vv/gxL7/4cS+/+LEvv/ixL7/4cS+/+HEvv/jxL7/48S+/+PFvv/jxb7/5MW+/+XFvv/mxb7/6MrE/+K7\n        s/+oNR7/mxgA/6MgAP+nIAD/sSIA/2QTAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPYAAABYAAAAhwAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AgAA/zwMAP9LDwD/SA4A/0QJAP9WHhX/wKun/9vOy//UxsP/1MbD/9TG\n        w//UxsP/1cbD/9XFw//VxsP/1sbD/9XGw//VxsP/1sbD/9fGw//XxsP/1sbD/9bGw//WxsP/1sbD/9bG\n        w//XxsP/18bD/9fGw//XxsP/18bD/9fGw//YxsP/2MbD/9jGw//Yx8P/2MfD/9jHw//Yx8P/2cfD/9nH\n        w//Zx8P/2cfD/9nHw//Zx8P/2cfD/9nHw//Zx8P/2cfD/9rHw//ax8P/2sfD/9rHw//ax8P/2sfD/9rH\n        w//ax8P/28fD/9vHw//bx8P/28fD/9vHw//bx8P/28fD/9vHw//bx8P/28fD/9vHw//bx8P/3MfD/9zH\n        w//cx8P/3MfD/9zHw//cx8P/3cfD/97Iw//fyMP/38jD/9/Hw//fx8P/38fD/9/Iw//gyMP/4MjD/+DI\n        w//gyMP/4MjD/+HIw//hyMP/4cjD/+HIw//iyMP/4cjD/+HIw//jyMP/5MjD/+TIw//kycP/5MnD/+TI\n        w//kycP/5cnD/+XJw//lycP/5snD/+jMxv/qzsj/t1lE/5kVAP+dHgD/nx4A/6QfAP+qIQD/LwkA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA2wAAADIAAABHAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HgUA/0sP\n        AP9HDgD/Rw4A/0AEAP9mNSr/0sK//93S0P/Yysf/2MrH/9jKx//Zysf/2crH/9nKx//Zysf/2crH/9rK\n        x//aysf/2srH/9rKx//aysf/2srH/9rKx//aysf/2srH/9rKx//aysf/2srH/9rKx//aysf/28rH/9vK\n        x//bysf/28rH/9vLx//by8f/28vH/9vLx//by8f/3MvH/9zLx//cy8f/3MvH/9zLx//cy8f/3MvH/9zL\n        x//cy8f/3MvH/93Lx//dy8f/3cvH/93Lx//dy8f/3svH/97Lx//ey8f/3svH/97Lx//ey8f/3svH/97L\n        x//ey8f/3svH/97Lx//ey8f/3svH/97Lx//ey8f/3svH/97Lx//ey8f/38vH/9/Lx//fy8f/4MzH/+HM\n        x//izMf/4szH/+LMx//izMf/4szH/+LMx//izMf/4szH/+LMx//jzMf/48zH/+PMx//kzMf/5MzH/+TM\n        x//kzMf/5MzH/+XMx//lzMf/5czH/+bNx//nzcf/5szH/+fNx//nzcf/583H/+fNx//oz8r/7tjU/8J4\n        Z/+YFQD/nR0A/50eAP+eHgD/qyEA/4AZAP8BAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACaAAAABgAA\n        AAwAAADbAAAA/wAAAP8AAAD/AAAA/wAAAP8BAAD/NgoA/0sOAP9HDgD/SA4A/0UFAP90Qzr/0MC9/+Ta\n        2f/c0M7/287M/9vOzP/bzsz/287M/9zPzP/czsz/3c7M/93PzP/cz8z/3c/M/93PzP/dz8z/3M/M/9zP\n        zP/cz8z/3M/M/9zPzP/cz8z/3M/M/9zPzP/ez8z/3s/M/97PzP/dz8z/3c/M/93PzP/dz8z/3c/M/93P\n        zP/dz8z/3s/M/97PzP/ez8z/3s/M/97PzP/ez8z/3s/M/9/PzP/fz8z/38/M/9/PzP/fz8z/38/M/9/P\n        zP/fz8z/38/M/9/PzP/gz8z/4M/M/+DPzP/gz8z/4M/M/+DPzP/hz8z/4c/M/+HPzP/gz8z/4M/M/+HQ\n        zP/h0Mz/4dDM/+HQzP/h0Mz/4tDM/+LQzP/i0Mz/49DM/+PQzP/j0Mz/5NDM/+TQzP/j0Mz/49DM/+PQ\n        zP/k0Mz/5NDM/+TQzP/k0Mz/5NDM/+XQzP/l0Mz/5dDM/+bQzP/m0cz/5tHM/+bRzP/m0cz/59HM/+nR\n        zP/p0cz/6dHM/+nRzP/p0cz/7dfT/+3Y1P/EgG//lxsC/5caAP+bHgD/mx4A/6MfAP+fHgD/JQcA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAFEAAAAAAAAAAAAAAIMAAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8KAgD/PwsA/0kNAP9HDQD/SA0A/0QDAP9gKh//tZuW/+LY1v/m3dz/4dbV/+DU0v/g09H/4dTR/+DT\n        0f/f0tH/4NPR/+DT0f/g09H/4NPR/+DT0f/g09H/4NPR/+DT0f/g09H/4NPR/+DT0f/g09H/4NPR/+DT\n        0f/g09H/4dPR/+HT0f/h09H/4dPR/+HT0f/h09H/4dPR/+HU0f/h1NH/4dTR/+HU0f/h1NH/4tTR/+LU\n        0f/i1NH/4tTR/+LU0f/i09H/4tPR/+LT0f/i09H/4tPR/+LT0f/i09H/4tPR/+LT0f/j09H/49PR/+PT\n        0f/j09H/49PR/+PT0f/j09H/49PR/+TT0f/k09H/5NTR/+TU0f/k1NH/5NTR/+TU0f/k1NH/5dTR/+XU\n        0f/l1NH/5dTR/+XU0f/l1NH/5tTR/+bU0f/m1NH/5tTR/+bU0f/n1dH/59XR/+fU0f/n1dH/6NXR/+jV\n        0f/o1NH/6NTR/+jV0f/p1dH/6dXR/+nV0f/q1dH/69bR/+vW0v/r19P/79zZ//Df3P/gwLn/sFxH/5IV\n        AP+WGgD/mR4A/5seAP+bHQD/oR8A/0AMAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADSAAAACAAA\n        AAAAAAAAAAAAIQAAAOcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TAwD/Rw0A/0oOAP9HDQD/Sw4A/0YH\n        AP9JCgL/dEU5/7KYk//ZzMn/4tjW/+ff3f/p4N7/7OXk/+zl5P/s5eT/7eXk/+3l5P/t5eT/7eXk/+3l\n        5P/t5eT/7eXk/+3l5P/t5eT/7eXk/+3l5P/t5eT/7eXk/+3m5P/t5uT/7eXk/+3l5P/t5eT/7eXk/+3l\n        5P/t5eT/7ubk/+7m5P/u5uT/7ubk/+7m5P/u5uT/7ubk/+7m5P/u5uT/7ubk/+7m5P/v5uT/7+bk/+/m\n        5P/v5uT/7+bk/+/m5P/v5uT/7+bk/+/m5P/v5uT/7+bk/+/m5P/v5uT/7+bk/+/m5P/v5uT/8Obk//Dm\n        5P/w5uT/7+bk/+/m5P/v5uT/7+bk/+/m5P/v5uT/8Obk//Dm5P/w5uT/8Obk//Dm5P/x5uT/8ebk//Hm\n        5P/x5uT/8ebk//Hn5P/x5+T/8ebk//Lm5P/y5uT/8ubk//Ln5P/y5+T/8ufk//Ln5P/y5+T/8ufk//Hk\n        4f/w4N3/7t3Z/+rV0P/bta3/t21d/5UmDf+KEgD/kxsA/5YdAP+ZHQD/nR4A/6YgAP9cEQD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGcAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8UAwD/QQwA/0wOAP9NDgD/TA4A/0oMAP9DBQD/RwkA/1wjFf90RDn/h11T/4xi\n        WP+adGv/nHVs/511bP+ddWz/nHVs/511bP+bdWz/m3Vs/511bP+cdWz/nHVs/5x1bP+ddWz/nXVs/511\n        bP+ddWz/nXVs/551bP+fdWz/n3Zs/592bP+fdmz/n3Zs/592bP+fdmz/oXZs/6J2bP+idmz/onZs/6J2\n        bP+idmz/onZs/6J2bP+idmz/onZs/6J2bP+kd2z/pXds/6N3bP+ld2z/pXds/6V3bP+leGz/pXhs/6V4\n        bP+leGz/p3hs/6h4bP+oeGz/qHhs/6h4bP+oeGz/qHhs/6h4bP+qeGz/qnhs/6p4bP+qeGz/qnhs/6p4\n        bP+qeGz/q3hs/6x4bP+teWz/r3ls/7B5bP+xeWz/sXls/7B5bP+xeWz/sXls/7B5bP+xeWz/s3ps/7N5\n        bP+zeWz/s3ps/7Z6bP+2emz/tnts/7l7bP+7fG7/tHFg/65mU/+oWUb/mzki/40dBP+IEQD/jhgA/44b\n        AP+RHAD/mB0A/54fAP+ZHgD/URAA/wIAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADEAAAABQAA\n        AAAAAAAAAAAAAAAAAAAAAAADAAAAuwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HAQD/KQgA/0UN\n        AP9NDwD/UA8A/08PAP9ODQD/SwoA/0kGAP9KBAD/SgQA/0gCAP9LAgD/TQIA/00CAP9LAgD/SwIA/04C\n        AP9KAgD/TAIA/04DAP9OAwD/TgMA/04DAP9OAwD/TgMA/08DAP9PAwD/TwMA/08DAP9RAwD/UwQA/1ME\n        AP9TBAD/UwQA/1MEAP9UBAD/VQQA/1gFAP9YBQD/WAUA/1kFAP9ZBQD/WQUA/1kFAP9ZBQD/WQUA/1kF\n        AP9bBQD/XQYA/10GAP9dBgD/XQYA/10GAP9eBgD/YgcA/2IHAP9jBwD/YwcA/2MHAP9jBwD/ZAcA/2QH\n        AP9kBwD/ZAcA/2QHAP9mCAD/aAgA/2gIAP9oCAD/aAgA/2gIAP9rCQD/agkA/24JAP9uCQD/bwkA/3AK\n        AP9zCgD/dQoA/3QKAP90CgD/dQsA/3cLAP94CwD/eAsA/3gLAP95CwD/ewwA/34NAP9/DQD/gg0A/4QO\n        AP+EDwD/hxAA/4oSAP+QFwD/jxkA/5EcAP+THAD/lR0A/5cdAP+SHAD/bBUA/yUHAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA8gAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAA2wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BwEA/xoFAP8oBwD/LQgA/zEJAP82CgD/NgoA/zcL\n        AP85CwD/OQsA/zkLAP85CwD/OQsA/zsLAP87CwD/PAwA/zsMAP85CwD/PAwA/zwMAP88DAD/PAwA/zwM\n        AP88DAD/PQwA/z0MAP89DAD/PQsA/z0LAP89DAD/PwwA/0AMAP9ADAD/QAwA/0AMAP9ADAD/Qg0A/0MN\n        AP9DDQD/Qw0A/0MNAP9DDQD/RA0A/0QNAP9EDQD/RA0A/0MNAP9GDQD/Rw0A/0cNAP9HDQD/Rg0A/0YN\n        AP9KDgD/Sg4A/0oOAP9KDgD/Sg4A/0oOAP9KDgD/Sg4A/0oOAP9LDgD/Sw4A/0wPAP9NDwD/Tg8A/04P\n        AP9ODwD/Tg8A/1APAP9READ/URAA/1EQAP9QEAD/URAA/1MQAP9VEQD/VRAA/1UQAP9WEAD/VhAA/1YQ\n        AP9XEQD/WBEA/1gRAP9ZEQD/WxIA/1sSAP9cEgD/XRIA/14TAP9hEwD/YhMA/2MTAP9kEwD/XhIA/1YQ\n        AP9RDwD/PgwA/xkFAP8BAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABkAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAAAA4QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAsAAAA1gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+gAAAGsAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbAAAAuQAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAOoAAABNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAHAAAAcAAAAOgAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAACkAAAAIQAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAA\n        AHsAAADaAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AO4AAACkAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAABCAAAAgAAAAK0AAADKAAAA0wAA\n        AN4AAADxAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA\n        APAAAADwBQEA7wQBANgAAADRAAAAuQAAAJMAAABcAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////////////////////////////////////////\n        ////////////////////////////////////4AAAAAAAAAAAAAAAAA///4AAAAAAAAAAAAAAAAAD//4A\n        AAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAB/+AAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAA\n        AB/gAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAA\n        AAAAAAADgAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA\n        AAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAP8AAAAAAA\n        AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAA//+A\n        AAAAAAAAAAAAAAAAA///4AAAAAAAAAAAAAAAAA//KAAAAEAAAACAAAAAAQAgAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAkAAABgAAAAuwAAAOYAAADuAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO4AAADdAAAApAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAADgAAADTAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAqAAA\n        ABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE0AAADzAAAA/wAAAP8AAAD/AQAA/wQBAP8EAQD/BAEA/wQB\n        AP8EAQD/BAEA/wQBAP8EAQD/BAEA/wUBAP8FAQD/BQEA/wQBAP8EAQD/BQEA/wQBAP8EAQD/BAEA/wYB\n        AP8EAQD/BAEA/wQBAP8FAQD/BgIB/wQAAP8FAQD/BQEA/wQBAP8FAQD/BQEA/wQBAP8EAQD/BAEA/wQB\n        Af8EAQH/BAEA/wQBAP8EAQD/BAEB/wQCAv8EAgL/AwIB/wMBAf8DAQH/BAEB/wMCAf8DAQH/AgEB/wAA\n        AP8AAAD/AAAA/wAAAP8AAADOAAAAHAAAAAAAAAAAAAAAAAAAADkAAAD2AAAA/wAAAP8FAQD/PAwA/3AW\n        AP+AGAD/gBgA/4EZAP+FGQD/ihoA/5EeA/+QHAD/khwA/5cdAP+bHQD/nh4A/6IfAP+jHwD/qCAA/6og\n        AP+sIQD/sSEA/7UjAf+THQH/ghgA/4QZAP+GGgD/ixsA/6klBv+1JgT/px8A/6ogAP+uIQD/qyEA/6wh\n        Af+vIgL/sCMC/68kBP+vJQb/riYH/64nCP+uKgz/rjAT/60yFv+sLhH/rCoL/6wqDP+sKQv/qy4Q/6s0\n        GP+qPCP/qjYc/6svEv+LJxD/Nw8G/wAAAP8AAAD/AAAA/wAAAMkAAAALAAAAAAAAAAYAAADLAAAA/wAA\n        AP8JAgD/XRIA/4oaAP+JGgD/iBoA/4sbAP+OGwD/kBwA/5cdAP+bHQD/nh4A/6IfAP+lHwD/qyAA/68h\n        AP+xIgD/tSIA/7kjAP+8JAD/wSUA/8kmAP+3IwD/hxoA/4gaAP+LGgD/jxsA/5EcAP+aHQD/xSkF/9Uq\n        Av+/JAD/xSYA/78lAP/DJQD/ySYA/9QoAP/aKgH/2CoC/9otBf/bNA3/2TYQ/9YyDP/XLQX/2CsD/9cs\n        Bf/WLQb/1S0G/9U8GP/UOhb/1EUk/9REI//TOBT/2DsW/9Q6Fv9qHQr/AAAA/wAAAP8AAAD/AAAAhwAA\n        AAAAAABXAAAA/wAAAP8BAAD/UA8A/3UWAP9tFQD/bxUA/3EWAP90FgD/dxcA/3kXAP9/GQD/gxkA/4Ya\n        AP+IGgD/jRsA/5McAP+WHQD/lx0A/5seAP+fHgD/ox8A/6kgAP+nIAD/dBYA/2sVAP9uFQD/dBYA/3UW\n        AP94FwD/exgA/34YAP+qIgL/nB4A/5YdAP+dHgD/oR8A/6cgAP+sIQD/syIA/8kpA//PLgn/wikF/74k\n        AP/BIwD/yCUA/8smAP/LJwH/zScB/84oAf/PORb/zzcU/848Gv/OOxn/zjAM/80yDv/PMw7/2zcQ/2AY\n        B/8AAAD/AAAA/wAAAOsAAAAaAAAAqQAAAP8AAAD/IwcA/2gUAP9lEwD/ZRMA/2YTAP9oFAD/aRQA/2oV\n        AP9sFQD/bxUA/3QWAP94FwD/eRcA/30YAP+DGQD/hxoA/4kaAP+OHAD/khwA/5UdAP+dHgD/dhYA/2UT\n        AP9hEgD/ZRQA/2kUAP9nFAD/aRQA/24VAP9yFgD/cBUA/3UWAP97GAD/gBgA/4MZAP+FGQD/iRoA/44b\n        AP+cHgD/nB4A/50eAP+iHwD/qSAA/7MiAP+1IwD/uCMA/7sjAP/CJQD/0TcT/9A5Fv/QPBr/zzUS/88t\n        CP/OLgn/zi8K/9MwC//FLgz/FwYB/wAAAP8AAAD/AAAAXwAAANcAAAD/AAAA/0ENAP9iEwD/XxIA/2AT\n        AP9hEwD/YxMA/2QTAP9mEwD/ZxMA/2gUAP9rFAD/cBYA/3IWAP91FgD/eRgA/34YAP+CGQD/hRoA/4ob\n        AP+THAD/fBgA/1MQAP9VEAD/VhEA/10SAP9ZEQD/XBIA/2ASAP9iEgD/ZxMA/2oUAP9qFQD/bBUA/28V\n        AP9zFgD/dxcA/3sYAP9+GAD/ghkA/4YaAP+NGwD/kxwA/5gdAP+iHwD/ox8A/6cgAP+xIwH/uyQB/9M1\n        D//SNhL/0ToW/9ExDP/QKwT/0CwG/88sB//PLQj/2zEJ/1MSA/8AAAD/AAAA/wAAAJIAAADsAAAA/wEA\n        AP9JDgD/XBMA/1sSAP9dEgD/XRIA/14SAP9fEwD/YhMA/2MTAP9lEwD/aBQA/2oUAP9qFQD/bxUA/3cX\n        AP9yFgD/cBYA/4AYAP+BGQD/cRYA/1APAP9KDgD/Sw4A/1IQAP9READ/Tw8A/1IQAP9YEQD/XBIA/2AS\n        AP9eEgD/YhMA/2ISAP9kEwD/aRQA/2sVAP9vFgD/eBcA/3cXAP96FwD/fxgA/4QZAP+HGgD/lB0A/5Mc\n        AP+YHQD/nR4A/7EjAf/XMgv/1DQO/9I0D//SLQf/0isE/9IrBf/RKwT/0C0H/90vCP9yGAT/AAAA/wAA\n        AP8AAACsAAAA7QAAAP8CAAD/SQ4A/1sSAP9aEgD/WhIA/1oSAP9eEgD/XhIA/2ETAP9hEwD/YxMA/2UT\n        AP9oFAD/aRQA/20VAP9iEwD/XxIA/38YAP97GAD/VBAA/0cNAP9IDgD/Rw4A/0oOAP9PDwD/SQ4A/0wO\n        AP9NDgD/URAA/1YRAP9cEgD/WRIA/10SAP9iEgD/YxMA/2UTAP9kEwD/ZhMA/3EWAP9tFQD/cRYA/3MW\n        AP95FwD/fhgA/4caAP+HGgD/jRsA/4saAP+yIwL/wSYC/88tB//XMAr/1DAK/9AuCf/QLAb/0isF/9Es\n        Bf/dLwb/dhkD/wAAAP8AAAD/AAAArgAAAO0AAAD/AgAA/0kOAP9aEgD/WhIA/1sSAP9cEgD/XxMA/18T\n        AP9hEwD/YhMA/2UTAP9mEwD/aBMA/2sUAP9jEwD/UxAA/4QZAP+LGwD/VhEA/0UOAP9BDQD/Qw4A/0EN\n        AP9JDgD/Rg4A/0cOAP9KDgD/Sg4A/00OAP9SEAD/ZxQA/1gRAP9XEQD/WRIA/1wSAP9gEgD/YRIA/2QT\n        AP9qFAD/ZRMA/2sVAP9wFgD/chYA/3oXAP9/GAD/fhgA/4cbAf+FGgD/sSIB/6cgAP+fHwH/ySoF/9Ms\n        Bf+0IwL/uyQB/8cpBP/ULAX/3y8G/3YZA/8AAAD/AAAA/wAAAK4AAADtAAAA/wIAAP9JDgD/WxIA/1sS\n        AP9bEgD/XBIA/10TAP9fEwD/YhQA/2MUAP9kEwD/ZhMA/2gTAP9rFAD/SQ4A/2ETAP9oFAD/RQ4A/0IN\n        AP8/DQD/Pg0A/z4NAP9DDQD/RQ4A/0ANAP9EDgD/RQ4A/0cOAP9MDgD/VhEA/10SAP9TEAD/VhEA/1cR\n        AP9XEQD/WhIA/1sSAP9iEwD/YxIA/2ESAP9kEwD/aBQA/2wVAP9zFgD/dBYA/3cXAP9/GAD/gBgA/6wi\n        Av+ZHQD/jxsA/5kdAP/OKAH/oh8A/6cgAP/CKQX/1i0F/+AwB/92GgX/AAAA/wAAAP8AAACuAAAA7QAA\n        AP8CAAD/SQ4A/1sSAP9cEgD/XBIA/1sSAP9dEgD/XxMA/2IUAP9jFAD/ZBQA/2cUAP9rFAD/XBIA/0EN\n        AP9SEAD/PQwA/z0MAP86CwD/OgsA/zoLAP88DAD/PQwA/0ANAP9CDQD/Qg0A/0oPAP9GDgD/SA4A/1oR\n        AP9NDgD/UA8A/1EQAP9SEAD/VBAA/1URAP9YEQD/YxMA/1sSAP9cEgD/YBIA/2MSAP9lEwD/bxUA/24V\n        AP9zFgD/cxYA/3MVAP+5IwH/jxwA/4gaAP+QHAD/xyYA/58eAP+kIQL/2C4H/9UtBv/iMQj/dxoF/wAA\n        AP8AAAD/AAAArgAAAO0AAAD/AgAA/0oOAP9cEgD/XBIA/1wSAP9cEgD/XhIA/2ATAP9jFAD/ZRUA/2MR\n        AP9hCQD/ZgwA/0oOAP9WEQD/Vw0A/y8AAP8vAAD/NwkA/zwMAP83CQD/MwEA/zYEAP8+DAD/Pw0A/0sP\n        AP9KDQD/OQIA/0kDAP9RBwD/PgIA/0EBAP9JCgD/TQ4A/04PAP9READ/UAoA/08GAP9TDAD/WRIA/1wS\n        AP9gEwD/YRIA/2YTAP9nEwD/ZxQA/2cSAP9uEAL/ziwG/48bAP9yFgD/iRoA/48bAP+THAD/lBwA/84s\n        Bv/YLwf/4zIJ/3gaBf8AAAD/AAAA/wAAAK4AAADtAAAA/wIAAP9KDgD/XBIA/1wSAP9cEgD/XBIA/18T\n        AP9iFAD/ZBQA/2USAP9xIQ//jEw8/4tGNf9aFQT/aBAA/3ArG/9uRz3/YkE4/zsUCv8yBgD/QRgP/2pG\n        Pf9gOTD/PA0B/zoLAP9oDQD/UQ8F/3ZUSv+7mpL/yLKu/7einf+PaF//VBsQ/0MDAP9MDgD/SwwA/2gw\n        I/99TED/aCsd/1QNAP9YEgD/XxMA/2ITAP9iEwD/YhMA/2EOAP9hCgD/tIuA/+JaOv+ZFgD/YxMA/3gX\n        AP+FGQD/fxgA/4cZAP+nIwT/2zEK/+QxCP94GgX/AAAA/wAAAP8AAACuAAAA7QAAAP8CAAD/Sw4A/10S\n        AP9dEgD/XRIA/10SAP9hEwD/ZBQA/2QUAP9gCQD/kFBB///////17+7/eiYS/10BAP+fgXn///////39\n        /P9YNS3/JwAA/2tKQv//////4NjW/z8RBP89AQD/gTYn/97JxP///////////////////////////+ni\n        4P99UUj/RQIA/0YDAP+6oZv//////6qIgP9IAAD/VRAA/1kRAP9aEgD/XRMA/1cKAP9gEwb/yqWb////\n        ///OVjr/qhgA/2YUAP9vFQD/fhgA/4EZAP+VHAD/kh0B/9QvCf/mMgj/eRoE/wAAAP8AAAD/AAAArgAA\n        AO0AAAD/AgAA/0sOAP9dEgD/XhIA/14SAP9eEgD/YhMA/2QUAP9lFAD/XgkA/45PQP//////9e/u/3km\n        Ev9eAQD/n4B4///////9/Pz/WDUt/ycAAP9oSUL//////93X1f87CQD/aCoe/+ni4P//////2sC6/61l\n        U/9yRDn/klZI/8+nnf///////Pz7/4JSSv8/AAD/vqGa//////+sioH/SQEA/1UQAP9XEQD/WBIA/1AG\n        AP9gHhL/0b24////////////x1Q4/70cAP+QHAD/chYA/4AZAP+dHgD/wSYD/6MhAv/bLwj/5zII/3oa\n        BP8AAAD/AAAA/wAAAK4AAADtAAAA/wIAAP9MDwD/XhMA/14SAP9eEgD/XhIA/2ITAP9jEwD/ZhQA/14J\n        AP+NT0D///////Xv7v95JhL/YAIA/5t/eP///////Pz8/1g1Lf8rAAD/bkpC///////g19T/QwoA/8Cr\n        p///////s5aP/3cQAP9ZBQD/PAMA/4IOAP+UDgD/zHNd///////k3Nr/TA4B/7iemP//////qomB/0MA\n        AP9NDwD/UA8A/0gCAP9vMSb/49bS/////////////////8NTOP+5GwD/tCIA/3AWAP94FwD/uSQA/9wt\n        Bf/YLQb/3DAI/+g0Cv96GgT/AAAA/wAAAP8AAACuAAAA7QAAAP8CAAD/TA8A/14TAP9eEgD/XhIA/14S\n        AP9jEwD/YhMA/2UUAP9fCQD/jU9A///////17+7/fSYS/0MAAP+OfHj///////z8/P9dNi3/KwAA/2xK\n        Qv//////39HN/3Q7LP/7/f3/5dfU/10TCf+TFwD/UxAA/18SAP+UHAD/pR4A/44NAP/MqKD//////35X\n        Tf+vlpD//////6qLhP9DAQD/UQ8A/0YAAP94Rzz/7Obl///////6+fj/9/X0//////+yUDj/rBkA/7cj\n        AP+MGwD/bxUA/8MlAP/cLQT/3y4G/90uBv/pMQf/exoE/wAAAP8AAAD/AAAArgAAAO0AAAD/AgAA/0wP\n        AP9eEwD/XBIA/18TAP9eEwD/YxMA/2MTAP9mFAD/YAkA/41PQP//////9+/u/3MlEv8uAAD/ln54////\n        ///8/Pz/YDct/y4AAP9pSkL//////9TKx/+PamH//////52Lif9iBQD/khwA/z8MAP+SHAH/khwA/2AT\n        AP9lCAD/tmBQ//////+okIr/sZaP//////+rjIX/QAAA/zwAAP+IX1b/+fX0///////8+fj/lmhd/8iy\n        rf//////hEc4/5MUAP+oIAD/pR8A/5cdAP+5IwD/2iwE/98uBf/eLgb/6jEG/3waA/8AAAD/AAAA/wAA\n        AK4AAADtAAAA/wIAAP9NDwD/XxMA/10SAP9fEwD/XxMA/2MUAP9kFAD/ZhQA/2AJAP+OT0D///////fv\n        7v9NHRL/HQAA/5R+eP///////Pz8/1o2Lf8lAAD/ZklC///////SyMb/jXVw//////+ff3r/XAQA/2gU\n        AP9UEQD/pyAA/2MTAP8+DAD/SwUA/6pSQP//////tZ+a/7GXkf//////qImF/y0AAP+Yfnf////+////\n        ///s6Ob/hE5C/1UAAP/Rt7L//////3FDOP9sDAD/mx4A/6UgAP+1IwD/uyMA/9wsA//gLgX/3y4F/+wx\n        Bf98GgP/AAAA/wAAAP8AAACuAAAA7QAAAP8CAAD/Tg8A/18TAP9cEgD/YBMA/2ATAP9jFAD/ZBQA/2UU\n        AP9gCgD/jk9A///////w7u7/MBES/xgAAP+Rfnj///////38/P9RNC3/DwAA/1lBQv//////1MvJ/3dc\n        Vf//////wJ6X/zgAAP87DAD/ixsA/4wbAP9DDQD/OAsA/1oEAP+iaF3//////6CEff+wl5H//////6iS\n        jP+kjIb////////////c0M3/XCwk/z4AAP9fCwD/2bu0//////9/Rjn/WQkA/4gaAP+eHgD/tyMA/74k\n        AP/dLAP/4i0E/+AtBP/tMAX/fRkC/wAAAP8AAAD/AAAArgAAAO0AAAD/AgAA/04PAP9gEwD/XhIA/2AT\n        AP9gEwD/ZBQA/2QUAP9kFAD/YAoA/45QQP//////9fPy/3JaVP83Fg7/i3h0///////8/Pz/RjAq/z0l\n        H/+Jenb//////9jRz/9EJB3/7+3t//Du7f9CIR7/OAEA/5YdAP9rFQH/MAoA/0EHAP96EgL/0sTB////\n        //9/RTj/rZiU///////29PT//v39//////+/sKz/RRUO/zgCAP9ADQD/NwIA/8S2sv//////eEU4/0gG\n        AP9cEgD/kRsA/68hAP+4IwD/3isC/+MtA//iLQP/7jAE/34ZAv8AAAD/AAAA/wAAAK4AAADtAAAA/wIA\n        AP9ODwD/YBMA/18SAP9gEwD/YhMA/2UUAP9lFAD/ZRQA/2EKAP+OUED/////////////////hXRw/39s\n        aP///////Pz8/0EqJP+/t7T////////////c1tT/KQEA/7aMgv//////y8PB/2wpGv92CQD/WwYA/ykA\n        AP9PEwf/1aOX///////ewLn/gQwA/8Gknf////////////////+gi4b/MQUB/y8EAP83CwD/OAoA/zMB\n        AP/Ot7L//////3FDOP9ABAD/QA0A/3YXAP+lHwD/tSQB/94sA//kLAH/4y0C//AwBP9/GQL/AAAA/wAA\n        AP8AAACuAAAA7QAAAP8CAAD/Tw8A/2ETAP9fEgD/YBMA/2ITAP9mFAD/aBQA/2YUAP9hCgD/kFFC////\n        /////////////4h0b/+Cb2r///////z8/P9FKyX/wLe0////////////29fW/0MOAv9fEgT/v7az////\n        ///07ev/06Wb/7qHe/+wlI7/4drZ///////u3tr/mjYh/3YGAP+8pqD///////f19f9/ZF3/KwAA/zMI\n        AP81CwD/NgoA/zYKAP84AgD/1Lq0//////9tRDr/PwQA/0MNAP9PDwD/mR0A/7ckAf/gLAL/4ioA/+Qs\n        Af/yLgH/fxgA/wAAAP8AAAD/AAAArgAAAO0AAAD/AgAA/08PAP9hEwD/XxIA/2ETAP9iEwD/ZxQA/2wV\n        AP9lFAD/ZA0A/4A9LP+/t7X/urKw/8W9uv9rU03/YU1I/8a+u/+5sK3/PCAZ/5CAfP/Curf/ybq2/6iX\n        kv9DEAP/JgIA/y8MCP+ah4L/9fHw//////////////////v7+/+5qaT/eCob/4IQAP9jCgD/ua2p//Lw\n        7/9iQTn/KQAA/zUKAP82CwD/NgsA/zgLAP82CwD/NAQA/7KJf//p0Mr/YjYs/zQDAP8+DAD/PAwA/2UT\n        AP+xIwH/4CwC/90qAP/eKgD/8C0A/38XAP8AAAD/AAAA/wAAAK4AAADtAAAA/wIAAP9PDwD/YRMA/18S\n        AP9hEwD/YhMA/2MTAP9mFAD/ZhQA/2kVAP9eEAD/IQAA/x0AAP8nAAD/KAQA/yAEAP8cAAD/HQAA/yUH\n        AP8gAgD/HwAA/zYEAP8mAgD/OgsA/zAKAP8tBgD/JQAA/2ImGP+1a1n/67is/654a/9iMyf/MAIA/0cJ\n        AP+AGQD/Vw0A/3JYUf9XMi3/KQAA/zUKAP80CgD/NAoA/zUKAP87DAD/NQsA/zkLAP9/EwD/fxMA/2MS\n        AP8+DAD/PQwA/z8MAP8/DAD/jBsB/98rAf/bKQD/3CoA/+0tAP9+GAD/AAAA/wAAAP8AAACuAAAA7QAA\n        AP8BAAD/TQ8A/2ITAP9fEgD/XxIA/2ITAP9iEwD/ZhQA/2cUAP9mEgD/aQwA/0sGAP8pAAD/NgIA/x4A\n        AP8fAAD/HgAA/yAAAP8gAAD/IAAA/yIAAP8yAwD/KQgA/zkLAP8rCAD/LQkA/y0JAP8tAAD/iSgc//rb\n        0v+fQTT/QAAA/zUKAP84DAD/YxMA/0YOAP8sAwD/KwAA/y0AAP8vAQD/LwEA/zABAP8wAQD/LwEA/ywA\n        AP9HBgD/lhQA/4kRAP92DQD/Wg0A/zcLAP87CwD/OwsA/14TAP/ZKgH/3ikA/9spAP/qLAD/fRgA/wAA\n        AP8AAAD/AAAArgAAAO0AAAD/AgAA/04PAf9jFAH/YBMB/2ATAP9hEwD/YxMA/2QTAP9iDQD/hTck/+C5\n        sP/eubD/zbGq/8utpf/EqqT/xKqk/8Sqpf/EqqT/xKqk/8Oqo//HsKv/uoZ6/zUGAP89DAD/LgkA/ywJ\n        AP8vCQD/KwAA/8Gclf//////6b+2/2AOAP82CQD/PgwA/0gOAP81CgD/LwMA/5tvZf/Graj/wKaf/8Cm\n        n//ApZ//wKWf/7+knv+9o57/yqif/9usof/Xq6H/2bOq/5dZSv81AgD/OAsA/zkLAP9XEAD/1CkA/90q\n        AP/cKgD/6CsA/3sXAP8AAAD/AAAA/wAAAK4AAADtAAAA/wIAAP9NDwH/YxQB/2ATAf9gEwH/YRMB/2MT\n        Af9kEwD/YQoA/49HNv///////////////////////////////////////////////////////////+XF\n        vf82AwD/NwoA/ywJAP8rCQD/IgAA/3ZAN//99/X/+f7+//////+fYVb/NQAA/0MOAP8/DQD/MgkA/yoA\n        AP/IqqP///////3///////////////////////////////v////3////+P////////+whHj/OgAA/z0M\n        AP82CgD/ZBMA/9YpAP/YKgD/2SoA/+YtAP95FwD/AAAA/wAAAP8AAACuAAAA7QAAAP8CAAD/Tg8A/2IT\n        AP9gEwH/YBMB/2MUAf9pFQL/ZhQB/2IMAP+QRDL///n1//fn4/+VXlD/aUU8/25JQP9vSUD/cUlA/3JJ\n        P/9wST//cUk//3VMQv9oOi//LAcA/0ENAP8tCQD/JgcA/y8FAP/Wvbf//////+vSzP/6/f7/69XQ/04U\n        C/81BwD/NQoA/y8JAP8qAAD/vpiP//z39f+zkYn/cj8z/3pJPf96ST3/eUg8/5pPPv/EW0L/xFxE/71Z\n        Qf+5WUL/eS8d/zwJAP88DAD/ZBMA/78kAP/RJwD/zycA/9UpAP/pLQD/ehcA/wAAAP8AAAD/AAAArgAA\n        AO0AAAD/AQAA/00PAP9iEwD/XxIA/18SAP9iEwD/bBYC/2UUAf9jEwD/dh4J/5w8Jf9gHg//KQEB/yMA\n        AP8kAAD/JAAA/ysAAP8sAAD/KwAA/ywAAP8sAAD/LQIA/zAJAP80CgD/NQoA/ykAAP+PX1b//////+7f\n        2/9jIRb/38nD//////+jfHX/JQAA/zAJAP8uCQD/KwgA/04WCP9iIBD/Rw4G/zEAAP81AAD/NgAA/zgA\n        AP9uDAD/mhUA/5cVAP+PEwD/jBIA/14PAP86DAD/fBgA/80nAP/UKAD/zScA/84nAP/TKAD/5ywA/3sX\n        AP8AAAD/AAAA/wAAAK4AAADtAAAA/wEAAP9MDwD/XxIA/14SAP9eEgD/YBMA/2ITAP9jEwD/XQsA/4c+\n        LP/y19D/6svE/+/Oxv/wzsb/8M7G/+/Ox//vz8f/787G/+/Nxv/uzcb/9dfP/8ydk/81BAD/NgoA/zIG\n        AP9KFA3/7trU//////+da2L/JQAA/6daS///////+O3p/1YmHv8lAgD/LQkA/ycAAP+vg3j/6c3H/+TH\n        v//nycH/58jB/+bIwP/myMH/6czG/+vNxv/szcb/683G//XY0v+WaV3/fA4A/88nAP/QJwD/0CgA/9Ip\n        AP/SKAD/0SgA/+ItAv95FwD/AAAA/wAAAP8AAACuAAAA7QAAAP8BAAD/TQ8A/2ATAP9eEgD/XhIA/2AS\n        AP9iEwD/YhMA/1wJAP+LRjX/////////////////////////////////////////////////////////\n        ///ew73/NwMA/zYKAP8uAAD/rYF4///////jyML/RQsC/zIHAP9uDQD/4rOp///////Cnpb/JwAA/y4I\n        AP8iAAD/yKmi/////////////////////////v7//f////v+/v/5/f7/+P3+//j8/f/6////04p4/8MY\n        AP/HJgD/ySYA/80nAP/SKAD/1SkA/9UpAP/gLAH/dxcA/wAAAP8AAAD/AAAArgAAAO0AAAD/AQAA/00P\n        AP9gEwD/XRIA/14SAP9jEwD/YhMA/2ITAP9gEQD/bR0K/2s2Kf9VLyb/UzIr/1QzK/9VMyv/WTQs/2E2\n        Lf9lNy3/Zzgt/2Y3LP9oOS7/Yi4h/zcJAP8wAgD/YSsi//zy7///////g0xC/zUAAP87DAD/XgsA/3o0\n        KP/79fP///78/3Q/N/8lAAD/JgYA/00iF/9aMif/WDIp/1w1K/9iNSv/ZTYr/5VBLf+mRS7/tUgu/7JI\n        Lv+uRy7/wEww/8o6GP/AIgD/xicC/8coA//HJQD/zScA/88nAP/QKAD/3ioA/3cXAP8AAAD/AAAA/wAA\n        AK4AAADtAAAA/wEAAP9NDwD/YBMA/1wSAP9dEgD/ZBMA/2ATAP9iEwD/XQ0A/34wHf/Hr6r/uKSg/0Ac\n        FP8mCwX/Kg4I/y0PCP85EQj/QRMI/0UUCP8+Ewn/PxQJ/0ESB/80CgD/MwAA/8ijnP//////zami/zgA\n        AP89CwD/OQsA/2gUAP9NAgD/uo6G///////av7j/MAUA/yQAAP+Xc2v/yr67/3pZUv81CQD/RhQI/0YU\n        CP+AHwj/qicI/60oCf+pJwj/pCcK/8MxD//FLAj/vSQA/8ImAP/IJgD/ySYA/8omAP/MJgD/0SgA/90q\n        AP92FgD/AAAA/wAAAP8AAACuAAAA7QAAAP8CAAD/TQ8A/2ATAP9dEgD/XRIA/10SAP9eEgD/YRMA/1oL\n        AP+EPCr///37///////18O//8u7t//Pv7v/z7+7/9vDv//fx7//38e//9/Hw//z7+//VubP/LwAA/3lL\n        Qf///////vTy/2MtJv8zAwD/QQ0A/zgLAP9lEwD/SwoA/08ZEf/y4t3//////41iWf8VAAD/x6qj////\n        ///69vb/8+zr//Tu7P/07ev/9+3r///v6//87uv//O3q//zu6//9/Pv/2oZy/7oYAP/AJQD/wSUA/8Mm\n        AP/JJwD/yycA/88oAP/eKgD/dBYA/wAAAP8AAAD/AAAArgAAAO0AAAD/AgAA/00PAP9eEgD/WxIA/1wS\n        AP9cEgD/XRIA/18TAP9bDAD/cDMk/+3f3P/q5eT/7efm/+7o5//v6ef/7+no//Dq6f/x6un/8uvq//Pr\n        6v/39fX/17Wt/0MCAP/Rsar////+/6qAd/8tAAD/OQwB/zoMAf85CwH/YBMB/1URAP8sAAD/lmVd//35\n        9//hyML/MQcA/7WUjf/18O//7efl/+/p6P/w6ef/7+nn/+3o5//t6Of/9Oro//Hp5//z6uf/9/b1/9WC\n        b/+4FwD/viUA/8AlAP/CJgD/xCYA/8UmAP/KJwD/3CoA/3UWAP8AAAD/AAAA/wAAAK4AAADtAAAA/wEA\n        AP9JDgD/WxIA/1sSAP9cEgD/XBIA/1wSAP9eEgD/XRIA/zUMAv8vFA7/LRQO/zIVDv8wFA7/LhQO/y8V\n        Dv84Fg7/PxgP/0IYD/9FGQ//QhgP/z4UCv8wCwL/QRsS/0IZD/80CQT/MwkA/zgLAf85CwH/NgsB/1QR\n        Af9gEwH/PgwB/zwJA/9JGQ7/PxwU/ykMBf8xEQj/OBgP/zcXD/87GA//QRgP/0YZD/9HGg//RxoP/48o\n        D/+uLg//uTAQ/7wyEf+7Kgj/uyMA/70kAP+9JAD/wSUA/8QmAP/GJgD/zCcA/94rAP94FwD/AAAA/wAA\n        AP8AAACuAAAA7QAAAP8BAAD/SA4A/10VBP9bEgD/WxIA/1sSAP9bEgD/XhIA/1YRAP8pCAD/FwEA/xgB\n        AP8bAgD/GwIA/xsCAP8cAgD/JAQA/ygFAP8gAwD/IgMA/yMEAP8jBAD/KggA/yYEAP8mBAD/LQgA/zAJ\n        AP8vCQD/MAkA/ywIAP9NDwH/VBEB/zULAf84CwH/OggA/yoFAP8iBwH/IwUA/yQEAP8jBAD/JwQA/ysF\n        AP8zBgD/NQcA/zAGAP9MCwD/pB0A/7cfAP+wHgD/tyEA/7okAP+7IwD/viQA/78kAP/EJgD/ySYA/88q\n        BP/cKgH/dRYA/wAAAP8AAAD/AAAArgAAAO0AAAD/AQAA/0cNAP9lIRH/XBQE/1oSAP9bEgD/WxIA/1wS\n        AP9WEQD/JggA/xkFAP8ZBQD/GgUA/xsFAP8dBgD/HgYA/yQHAP8qCAD/IAYA/yAGAP8hBwD/IwcA/yUH\n        AP8jBwD/JAcA/yQHAP8kBwD/JggA/ycIAP8lCAD/OwsA/zUKAP8mCAD/KgkB/ywJAf8qCQH/IwgB/yQI\n        Af8pCQH/LgkB/ygIAP8uCQD/MgkA/zUKAP84CwD/MwkA/4wbAP+2IgD/siIA/7cjAP+7JAD/uyQA/78l\n        AP/DJgD/xSYA/8klAP/PNRP/2SoB/3IVAP8AAAD/AAAA/wAAAK4AAADtAAAA/wEAAP9ECgD/cDEj/2Yj\n        Ff9WDgD/WhIA/1sSAP9cEgD/WRIA/yUIAP8YBQD/GQUA/xkFAP8aBQD/GgUA/xsFAP8hBwD/KAgA/x4G\n        AP8eBgD/HwYA/yQHAP8kBwD/IgYA/x8GAP8fBgD/HwYA/yAGAP8hBgD/JggA/yYIAP8jBwD/IwcA/yIH\n        AP8kBwD/KAgA/yIHAf8kCAH/JQgB/ygJAf8oCQH/LAkB/y4JAf8zCQD/NQoA/z0LAP+ZHQD/syIA/7Ah\n        AP+zIgD/uCMA/7skAP/AJQD/wiYA/8IkAP/JLQn/0Uws/9MoAP9wFQD/AAAA/wAAAP8AAACuAAAA7QAA\n        AP8BAAD/QwgA/3M4Kv+BTED/WBAC/1gPAP9aEQD/WxIA/10TAP8wCQD/FQQA/xkFAP8YBQD/GAQA/xkF\n        AP8ZBQD/IAcA/yUIAP8eBgD/HgYA/x0GAP8fBgD/HgYA/x0GAP8eBgD/HgYA/x4GAP8fBgD/HwYA/yMH\n        AP8mBwD/IAYA/yAGAP8gBgD/KwgA/y0JAP8fBgD/IgcA/yQHAP8jBwH/JQgB/ygJAf8uCgH/MgoB/y8J\n        Af9eEgH/sCIB/64hAP+0IgD/tCIA/7QiAP+3IwD/viUA/8AkAP+/IAD/zU8x/9FaPf/QJgD/bxUA/wAA\n        AP8AAAD/AAAArgAAAO0AAAD/AQAA/0AHAP9yOCv/lWph/3lAM/9UDQD/VgwA/1kQAP9dEQD/Sw4A/xgF\n        AP8XBQD/FwQA/xYEAP8YBQD/FwQA/x4GAP8nCAD/KAgA/ygIAP8mCAD/JQcA/yUHAP8kBwD/JQcA/yQH\n        AP8kBwD/IwcA/yMHAP8hBgD/IQYA/yAGAP8gBgD/HQUA/0UNAP81CgD/HQYA/yEHAP8iBwD/IgcA/yIH\n        AP8lBwD/LgkA/y8KAf8vCQH/bxYB/7QlBP+uIgH/sSIA/7MiAP+0IgD/tyIA/7ggAP+4HgD/yEUl/9d0\n        Xf/QXED/zSUA/20VAP8AAAD/AAAA/wAAAK4AAADtAAAA/wEAAP8/BwD/dDwv/5hvZv+YbWT/hVFF/2Yk\n        FP9ZEQD/Vw0A/1sOAP8vBQD/DgAA/xEAAP8RAAD/EgAA/xIAAP8XAQD/IQMA/yEDAP8dAgD/HgMA/yAD\n        AP8iAwD/IwMA/yIDAP8kBAD/JQQA/yUEAP8nBAD/KAQA/ygEAP8oBAD/KAQA/yUDAP9dDgD/MwYA/xgA\n        AP8cAgD/HAIA/x0CAP8eAgD/HwIA/ygEAP8qBAD/QgkA/50aAP+nHQD/qR4A/6weAP+uHgD/sh4A/7Uh\n        AP+5Lw7/yFY7/9V3Yv/Xe2X/0WFG/8wkAP9sFAD/AAAA/wAAAP8AAACuAAAA7QAAAP8BAAD/PgYA/3ZB\n        NP+ed3D/mnJp/552bf+bcmn/kWJX/4tYTf+KVEj/glNI/1pLSP9USkj/VEpI/1VKSP9VSkj/WUtI/2RN\n        SP9hTUj/X01I/15MSP9fTUj/ZU5I/2lOSP9fTUj/YExI/2BMSP9fTEj/Yk1I/2RNSP9lTkj/ZE1I/2VN\n        SP9nTkj/j1VI/29PSP9bTEj/X0xI/19MSP9eTEj/XkxI/2JNSP9nTkj/aE5I/59YSP/AXkj/vV5I/79e\n        SP/BX0j/xGBI/8hjTP/La1X/0Xpm/9aBbv/WfWn/2YFu/9FmTv/JIwD/bBQA/wAAAP8AAAD/AAAArgAA\n        AO0AAAD/AQAA/z0GAP97RTn/pYF5/596cv+genL/oXtz/6N9df+mf3b/poB3/6iAd/+ffnf/l313/5V8\n        d/+SfHf/jnt3/417d/+cfnf/j3t3/498d/+Le3f/jXt3/4l6d/+if3f/rYF3/6uAd/+pgHf/pYB3/5V9\n        d/+Ke3f/jHt3/4p6d/+Le3f/jXt3/6iAd/+SfHf/hnl3/4d6d/+Henf/h3p3/4h6d/+Ne3f/iXp3/6aA\n        d//Nh3f/yoZ3/8qGd//Lhnf/zId3/9OJeP/SiHb/0od1/9OFc//VhHL/14Vy/9iKd//RbFX/zCQA/24V\n        AP8AAAD/AAAA/wAAAK4AAADtAAAA/wEAAP88BQD/fko+/62Lg/+kgnv/poN7/6iDe/+ng3v/qIN7/6mD\n        e/+pg3v/qoR7/62Fe/+thXv/rYV7/6+Fe/+uhXv/roV7/6yEe/+shHv/qoR7/6iEe/+lg3v/sIV7/7WF\n        e/+0hXv/tIV7/7iGe/+mg3v/lYB7/5aAe/+Sf3v/lH97/5B/e/+thXv/loB7/4Z9e/+Ifnv/iX57/4l+\n        e/+Nfnv/jX97/5+Ce//FiXv/yop7/8qKe//Kinv/y4p7/82Ke//Oi3v/0It7/9OMe//UjHv/1Ix7/9aM\n        e//akoH/03Jc/8kkAP9sFQD/AAAA/wAAAP8AAACuAAAA7QAAAP8BAAD/PAQA/39OQv+wk43/q4uE/6yL\n        hP+ujIT/royE/66MhP+ujIT/royE/6+MhP+vjIT/sIyE/7CMhP+yjYT/s42E/7ONhP+zjYT/to6E/7aO\n        hP+3joT/t46E/7aNhP+4jYT/uI2E/7iNhP+4jYT/uY6E/7mOhP+3joT/to2E/7ONhP+yjYT/vI6E/6+M\n        hP+kioT/ooqE/56JhP+biIT/moiE/6mLhP/KkYT/yZGE/8qRhP/MkoT/zJKE/8yShP/Rk4T/0JKE/9GS\n        hP/Uk4T/1ZSE/9aUhP/XlIT/25mK/9N3Yv/GIgD/ahQA/wAAAP8AAAD/AAAArgAAAO0AAAD/AQAA/zoE\n        AP+BUkf/tp2W/7GUjf+ylI3/s5SN/7SVjf+0lY3/tJWN/7eWjf+1lY3/tJWN/7WVjf+2lY3/tpWN/7iV\n        jf+4lY3/uJWN/7mWjf+6lo3/upaN/7uWjf+7lo3/u5aN/72Wjf+9lo3/vZaN/72Wjf+/l43/wJeN/8CX\n        jf/Bl43/wpeN/8KXjf/FmI3/yJiN/8iYjf/HmI3/xZiN/8aYjf/KmY3/ypmN/8uZjf/MmY3/zZmN/8+a\n        jf/Qmo3/0ZqN/9Gajf/Tm43/1ZuN/9ebjf/YnI3/2pyN/92ilP/TfWn/wiEA/20VAf8AAAD/AAAA/wAA\n        AK4AAADtAAAA/wEAAP85AwD/hVdM/76mof+4nZf/uJ2X/7idl/+6nZf/up2X/7qdl/+8nZf/up2X/7qd\n        l/+7npf/vJ6X/72el/++npf/vp6X/76el/++npf/vp6X/8Cfl//An5f/wJ+X/8Cfl//Cn5f/wp+X/8Kf\n        l//Cn5f/w5+X/8Sfl//En5f/xJ+X/8Wfl//Gn5f/x5+X/8igl//JoJf/yqCX/8qgl//LoJf/zKGX/82h\n        l//OoZf/zqGX/8+hl//Sopf/0qKX/9Oil//Uopf/1KKX/9Wil//Yo5f/2qSX/9ykl//fqp7/04Nx/74g\n        AP9nEwD/AAAA/wAAAP8AAACuAAAA7QAAAP8BAAD/OQMA/4VXTP/Erqr/vaWg/76moP++pqD/vqWg/7+l\n        oP/ApqD/v6ag/8CmoP/ApqD/waag/8KmoP/CpqD/wqag/8SnoP/Ep6D/w6eg/8OnoP/Ep6D/xqeg/8an\n        oP/Gp6D/xaeg/8enoP/Hp6D/x6eg/8enoP/Hp6D/yKeg/8mnoP/Jp6D/yqeg/8qnoP/OqaH/zaig/82o\n        oP/NqKD/zqig/9CpoP/RqaD/0amg/9GpoP/TqqD/1Kqg/9SqoP/XqqD/2Kqg/9iqoP/YqqD/2aug/92r\n        oP/graH/4rOo/9GDcf+6HgD/ZBMA/wAAAP8AAAD/AAAArgAAAO0AAAD/AQAA/zkEAP91QjX/yLax/8Ou\n        qf/Drqn/xK6p/8Suqf/Erqn/x6+p/8euqf/Grqn/xq6p/8evqf/Hr6n/x6+p/8evqf/Ir6n/ya+p/8mv\n        qf/Jr6n/ya+p/8qvqf/Lr6n/y6+p/8uvqf/Lr6n/y6+p/82vqf/Nr6n/za+p/82vqf/Nr6n/zrCp/86w\n        qf/OsKn/0LGq/9Gwqf/SsKn/0rCp/9Oxqf/Tsan/1LGp/9Wxqf/Vsan/1rGp/9axqf/Ysan/2rKp/9qy\n        qf/asqn/27Kp/9yyqf/fs6n/4LSp/+W+tP/Hbln/tBoA/2MTAP8AAAD/AAAA/wAAAK4AAADtAAAA/wEA\n        AP86CQD/VxwO/8Cqpv/Mu7f/ybey/8m3sv/Kt7L/y7ey/823sv/Mt7L/zLey/8y3sv/Mt7L/zLey/823\n        sv/Ot7L/zrey/864sv/PuLL/z7iy/8+4sv/PuLL/z7iy/9C4sv/QuLL/0Liy/9C4sv/RuLL/0riy/9K4\n        sv/SuLL/0riy/9K4sv/TuLL/07iy/9S4sv/VubL/1rmy/9e5sv/XubL/17my/9e5sv/ZubL/2bqy/9m6\n        sv/aurL/27qy/926sv/durL/3bqy/966sv/gu7L/4buy/+O8s//kv7f/s0Io/7EdAP9cEgD/AAAA/wAA\n        AP8AAACuAAAA2gAAAP8AAAD/MQkA/0YFAP+NZV3/2c3K/9C/vP/Qv7z/0L+8/9G/vP/Rv7z/0r+8/9K/\n        vP/Sv7z/0r+8/9LAvP/TwLz/08C8/9PAvP/TwLz/08C8/9TAvP/UwLz/1MC8/9TAvP/VwLz/1sC8/9bA\n        vP/WwLz/1sC8/9fAvP/XwLz/18C8/9fAvP/XwLz/18G8/9jBvP/Ywbz/2cG8/9rBvP/awbz/28G8/9zB\n        vP/cwbz/3MK8/97CvP/ewrz/3sK8/9/CvP/fwrz/4cK8/+HCvP/iwrz/48O8/+TDvP/qz8n/zo1//6AZ\n        AP+xIgD/QAwA/wAAAP8AAAD/AAAAlQAAAK0AAAD/AAAA/xgFAP9KDAD/SQ4D/7GWkf/h19X/18nG/9fI\n        xf/YyMX/2MjF/9jIxf/YyMX/2MjF/9jIxf/YyMX/2MjF/9nIxf/ZyMX/2cjF/9nJxf/ZycX/2snF/9rJ\n        xf/aycX/2snF/9vJxf/bycX/28nF/9vJxf/cycX/3MnF/9zJxf/cycX/3MnF/9zJxf/dycX/3cnF/93J\n        xf/eycX/38rF/+DKxf/gysX/4MrF/+DKxf/hysX/4srF/+LKxf/jysX/48rF/+TKxf/ly8X/5cvF/+bL\n        xf/s19L/3ras/6IrE/+hGgD/mh4A/xADAP8AAAD/AAAA/wAAAGIAAABcAAAA/wAAAP8AAAD/MAkA/0gJ\n        AP9SGA//rpKL/+LY1//n3tz/5dvZ/+Xa2P/l2tj/5drY/+Xb2P/l2tj/5drY/+Xa2P/l2tj/5tvY/+bb\n        2P/m29j/5tvY/+bb2P/m29j/5tvY/+fb2P/n29j/59vY/+fb2P/n29j/59vY/+jb2P/o29j/6NvY/+jb\n        2P/o29j/6NvY/+jb2P/o29j/6dvY/+nb2P/q29j/6tvY/+rb2P/q29j/69zY/+vb2P/s3Nj/7NzY/+zc\n        2P/s3Nj/7t3Z//Df3P/v3tr/16yi/6I2IP+ZFgD/piAA/0EMAP8AAAD/AAAA/wAAAO4AAAAdAAAACQAA\n        AM8AAAD/AAAA/wUBAP82CgD/SwoA/0sJAP91Qjb/pYJ6/7ialP/ApZ//waWf/8Gln//BpZ//waWf/8Gl\n        n//BpZ//wqWf/8Kln//DpZ//w6Wf/8Oln//Epp//xaaf/8Wmn//Fpp//xaaf/8Wmn//Hpp//x6af/8en\n        n//Hp5//yKef/8mnn//Kp5//yqef/8qnn//Lp5//y6ef/8unn//Lp5//zaif/86on//QqJ//0Kif/9Co\n        n//RqJ//0qif/9Opn//UqZ//1qmg/9Kil//LkIL/sVpF/5UdBf+aGAD/nx8A/1IPAP8AAAD/AAAA/wAA\n        AP8AAACMAAAAAAAAAAAAAAA+AAAA+AAAAP8AAAD/AgEA/x0GAP81CQD/NgIA/zYBAP87BAD/PgYA/z8G\n        AP8/BgD/QAYA/0AGAP9BBgD/QQYA/0EGAP9CBgD/QwcA/0QHAP9FBwD/RQcA/0gIAP9JCAD/SQgA/0oI\n        AP9KCAD/SwgA/00JAP9NCQD/TgkA/1EJAP9SCgD/UgoA/1IKAP9SCgD/VAoA/1YLAP9WCwD/VwsA/1oM\n        AP9bDAD/XQwA/18MAP9fDAD/YQ0A/2MNAP9kDQD/Zw4A/2oPAP9rDgD/bgwA/24MAP9uEwD/XhIA/yYH\n        AP8AAAD/AAAA/wAAAP8AAADNAAAADgAAAAAAAAAAAAAAAAAAAFIAAAD2AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEA\n        AP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEAAP8BAAD/AQAA/wEA\n        AP8CAAD/AgAA/wIAAP8CAAD/AQAA/wEAAP8CAAD/AgAA/wIAAP8CAAD/AgAA/wIAAP8CAAD/AgAA/wIA\n        AP8BAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADTAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAA\n        ANMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACpAAAAFAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAIAAAAWQAAAK8AAADYAAAA5QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QEAAO0BAADjAAAA0AAAAJkAAAA6AAAAAAAA\n        AAAAAAAAAAAAAAAAAAD/////////////////////8AAAAAAAAB/gAAAAAAAAB8AAAAAAAAADgAAAAAAA\n        AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAGAAAAAAAAAAcAAAAAAAAAD4AAAAAAAAAfwAAAAAAAAHygAAAAwAAAAYAAAAAEA\n        IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAXgAA\n        AJMAAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAA\n        AJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAA\n        AJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACQAAAAVgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        ACUAAAC4AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAKkAAAAXAAAAAAAA\n        AAAAAAAAAAAALgAAAOMAAAD/AAAA/xkFAP8lBwD/JQcA/yYHAP8oCAD/KggB/ykIAP8sCAD/LQkA/y4J\n        AP8vCQD/MAkA/zEJAP8zCgD/MgoB/ycIAP8mBwD/JwcA/zELAv8yCgH/LwkA/zEJAP8wCQD/MQoB/zEK\n        Af8wCgH/MAsD/zALAv8wCwP/Lw4H/y8PB/8vDAT/LwwE/y8MBP8vDwj/LxEK/y8OBv8cCAP/AAAA/wAA\n        AP8AAADVAAAAHgAAAAAAAAARAAAA1QAAAP8IAgD/VBAA/4oaAP+PHAD/khwA/5YdAP+eHwD/oyAA/6cg\n        AP+tIQD/syIA/7cjAP+8JAD/wSUA/8YmAP/RKAD/siIB/48bAP+UHQD/lx0A/6giAv/PKwT/zCcB/8km\n        AP/GJgD/yicA/9MpAf/YKwP/1iwF/9gxC//WNhD/1TUQ/9UxC//ULgj/0y4I/9I2Ef/RPx3/0Ugo/9E8\n        Gf/JNxX/dSAM/wUCAf8AAAD/AAAAwQAAAAcAAABqAAAA/wMAAP9NDwD/eBcA/3EVAP9zFgD/dxcA/3oY\n        AP9/GQD/hRoA/4kbAP+PHAD/lR0A/5cdAP+dHgD/oh8A/6ohAP+iHwD/cRYA/24VAP91FwD/eBcA/3oX\n        AP+LGwH/pCAB/5gdAP+fHgD/piAA/64iAP+5IwD/zCsF/8UrBv+/JgP/xCQA/8smAP/MJwH/zScB/9A0\n        EP/QOhf/zz8e/880EP/QMw7/3TcR/38gCf8AAAD/AAAA/wAAAE0AAAC+AAAA/xsFAP9nFAD/YxMA/2QT\n        AP9mFAD/aBQA/2oUAP9sFQD/chYA/3cXAP97GAD/gRkA/4YaAP+MGwD/khwA/5UcAP9qFAD/XhIA/2ET\n        AP9kEwD/ZBMA/2kUAP9tFQD/bhUA/3QWAP95GAD/fRgA/4MZAP+JGgD/lB0A/5cdAP+dHgD/pyAA/68h\n        AP+zIgD/uiMA/80xDf/SORb/0DoX/9AuCf/PLQj/0C8K/9IwC/8rCgL/AAAA/wAAALEAAADnAAAA/zMK\n        AP9gEwD/XRIA/14SAP9gEwD/YhMA/2QTAP9mEwD/ahUA/24VAP9yFgD/eBcA/3UWAP+CGQD/hhoA/2oV\n        AP9LDgD/Tw8A/1URAP9SEAD/WBEA/10SAP9iEwD/ZBMA/2YTAP9oFAD/bRYA/3IWAP95FwD/excA/4IZ\n        AP+KGwD/kxwA/5odAP+eHgD/qiAA/84vC//VNhH/0TQP/9IrBP/RLAX/0CwG/94wCP9nFwT/AAAA/wAA\n        ANwAAADuAAAA/zYKAP9dEgD/WhIA/1sSAP9eEgD/XxIA/2ETAP9jEwD/ZxMA/2kUAP9sFQD/YhMA/3YX\n        AP93FwD/UhAA/0cOAP9HDgD/TQ8A/0wOAP9LDgD/Tw8A/1URAP9cEgD/WhIA/18SAP9iEgD/ZBMA/2cU\n        AP9wFgD/bxYA/3QWAP95FwD/gxkA/4gaAP+NGwD/lx0A/8EnA//OLQj/1zEL/9EuCP/RLAX/0isF/94v\n        Bv9wGAP/AAAA/wAAAOIAAADtAAAA/zYKAP9dEgD/WxIA/1wSAP9fEwD/YBMA/2ITAP9lEwD/ZhMA/2wU\n        AP9ZEQD/ahUA/3oYAP9QEAD/QA0A/0EOAP9EDgD/Rw4A/0UOAP9IDgD/Sg4A/1MQAP9jEwD/VhEA/1gS\n        AP9bEgD/XxIA/2ITAP9oFAD/ZhMA/20VAP9xFgD/ehcA/3wYAP+GGwH/khwA/6cgAP+cHgH/yCkE/7ol\n        Av+0IwH/yyoF/+EvBv9wGAT/AAAA/wAAAOEAAADtAAAA/zYKAP9eEgD/XBIA/1sSAP9dEgD/YBMA/2MU\n        AP9kFAD/aBMA/2UTAP9IDgD/VBEA/z8NAP87DAD/PAwA/zwMAP9ADQD/Qg0A/0IOAP9HDgD/Rw0A/1IP\n        AP9TDwD/UQ8A/1QQAP9WEQD/VxEA/2ATAP9fEgD/YBIA/2QTAP9qFAD/cRYA/3MWAP91FgD/kRsA/50f\n        Af+GGgD/ryEA/7IiAP+mIQL/1C0G/+IwB/9wGQX/AAAA/wAAAOEAAADtAAAA/zcKAP9fEgD/XBIA/1wS\n        AP9eEgD/YRMA/2UVAP9iDwD/YgcA/1UNAP9XEgD/QwQA/ysAAP82CAD/OgwA/zEAAP80AgD/PQ0A/0gO\n        AP9DBgD/QAUA/1gPAP9FCgD/QwIA/0oKAP9QEAD/UQ4A/04DAP9SCgD/WxMA/18TAP9jEwD/ZxQA/2gU\n        AP9gDAD/oCQG/6oiAv90FgD/jxsA/5QcAP+gIAH/1i4H/+QyCf9xGQX/AAAA/wAAAOEAAADtAAAA/zgK\n        AP9fEgD/XRIA/1wSAP9gEwD/YxQA/2EMAP+KRzf/wqCX/303Jv9hCQD/nHVs/6uZlf9GIRj/MwgA/52H\n        gv+McGn/NAUA/1QFAP+ATEL/ybq2/+fd2//c1NH/rZKM/1MZDv9DAwD/XSUX/7ablf+HVkv/UAgA/1oS\n        AP9gEwD/YRMA/1gEAP+KTD3/4qOU/7MeAf9lEwD/fhgA/34YAP+FGgD/uSkH/+kzCf9yGQT/AAAA/wAA\n        AOEAAADtAAAA/zgKAP9gEgD/XRIA/14SAP9iEwD/ZRQA/10GAP+lcmb//////5hWRv9WAAD/1crH////\n        //9YNS3/MgYA//Lw7//Nw8H/MwAA/6B1bP//////9OLe/8Snof/PubX//////9/W0/9bIBf/ajAi////\n        //+wkYr/RwAA/1cRAP9XEAD/TwIA/4dRRv/28O7/8Ma8/7caAP9+GAD/dxcA/4obAP+nIAH/tycF/+sz\n        Cf9zGQT/AAAA/wAAAOEAAADtAAAA/zgLAP9gEwD/XhIA/14SAP9iEwD/ZBQA/10HAP+gbWD//////5ZS\n        Qv9XAAD/yr+8//////9YMyr/OAgA/+jj4v/Dsa3/ZjYr//////+5l4//eRQF/0AAAP96CwD/sEAp//vu\n        6//GtbH/ZC0g//////+qioP/RAAA/08NAP9KAwD/m25m//7+/v//////57qw/7kbAP+nIAD/bhYA/6Yg\n        AP/aLAT/1y4H/+k1C/90GQT/AAAA/wAAAOEAAADtAAAA/zgLAP9hEwD/XhIA/14SAP9iEwD/ZBMA/14H\n        AP+gbWD//////5dSQv87AAD/xr68//////9cNCr/OAgA/+bj4v/Frqj/up6X/+jl5f9vFAD/dBEA/1kR\n        AP+YHQD/iQsA/7JkUv/9////iWVd//////+qjIX/QQAA/0kIAP+rjYb///////Hs6v/q4+H/2b22/50W\n        AP+0IgD/gBkA/6whAP/fLQT/3y4G/+oxB/91GQP/AAAA/wAAAOEAAADtAAAA/zkLAP9hEwD/XRMA/2AT\n        AP9jFAD/ZBMA/18HAP+hbWD//////4BOQv8iAAD/yr+8//////9aNCr/MwcA/+bj4v+9r6v/xrm2/87E\n        wv9nCwD/WxEA/40cAP95FwD/QgYA/5U6JP//////pImD///+/v+hg3z/OggF/72rpf//////5drW/3cz\n        Kf/RurX/zsG+/2sMAP+gHwD/pyAA/7UjAP/cLAT/4C4F/+wxBv92GAP/AAAA/wAAAOEAAADtAAAA/zoL\n        AP9hEwD/XhIA/2ATAP9jFAD/ZBQA/14HAP+hbWD//////1s+N/8UAAD/yb+9//////9MMCn/GgAA/+Xh\n        4P+8rqr/uKyp/+TW0/84AwD/WRAA/4sbAP9DDQD/PwIA/4xFNP//////l3ly//z6+v+3pJ//yLm1////\n        ///It7P/ThsT/04AAP/exb//0cG+/1cJAP+GGQD/qiEA/74kAP/dLAP/4S0E/+4wBP92GAL/AAAA/wAA\n        AOEAAADtAAAA/zoLAP9iEwD/XxIA/2ETAP9kFAD/ZRQA/14IAP+hbWD//////7quq/9YREL/v7Wz////\n        //9POzb/j4F///Tz8v+1qKT/dVtV//////9pUEn/WgAA/3IOAP8mAAD/YQkA/9e8tv/v39v/gUEy//b2\n        9////////////6WRjP83BwH/NwQA/zUCAP/Owb3/0cG+/0EEAP9XEQD/mR4A/7gkAP/fLAL/4y0D/+8w\n        BP93GAL/AAAA/wAAAOEAAADtAAAA/zoLAP9jEwD/XxIA/2ETAP9mFAD/ZhQA/14HAP+lcWT/////////\n        //+XhoL/v7Wz//////9eSUP//fz8//////+9tLL/RQUA/9bBvP/7+vn/tIN6/5RHN/93UUz/zriy////\n        //+wX03/hjIe//3////+/v7/kHhz/y0AAP8xBgD/NgoA/zYBAP/eysX/08jG/0AEAP9BDQD/ehcA/7ck\n        Af/gLAP/5CwA//IvAv94GAH/AAAA/wAAAOEAAADtAAAA/zoLAP9jEwD/YBMA/2ETAP9qFQD/ahUA/2EL\n        AP+MVEb/xL68/8e+vP9xW1b/kIF9/8W8uv9ONS7/tKmm/8rAvf+ZhH//MAEA/zQRDP+rm5j//Pv5////\n        ////////5eDe/5JbUP98BwD/fEEz/+rp6P9wUUv/KQAA/zQJAP83CwD/NwsA/zQEAP+9mI//uJmS/zUE\n        AP87CwD/SA4A/6AgAf/gLAL/3ioA//AtAP94FwD/AAAA/wAAAOEAAADtAAAA/zoLAP9kEwD/YBIA/2ET\n        AP9kFAD/ZxQA/2gTAP9QAgD/GgAA/x0AAP8aAAD/EwAA/xIAAP8YAAD/FAAA/yMAAP8rBAD/NAsA/yoF\n        AP8mAAD/cCUX/92aiv+fV0b/QA4E/zgCAP9xFAD/Ux4R/0ckG/8fAAD/KgAA/ykAAP8rAAD/LQAA/zIA\n        AP9/CQD/dQgA/0sHAP87DAD/OQwA/2oVAf/cKwH/3SkA/+wtAP93FwD/AAAA/wAAAOEAAADtAAAA/zkL\n        Af9lFAH/YBIA/2ESAP9jEwD/ZBEA/3QjD/+0d2n/oXht/5hxZ/+ObWX/jW1l/41tZf+NbWX/j3Bo/4tf\n        VP82DAH/MwoA/ysJAP8nAwD/VBkM//bj3/+7gHH/OQAA/zcLAP9IDwD/LQMA/1wrHv+UbmT/kGxi/5Bs\n        Y/+QbGP/jWti/5huY//Cd2X/vHlp/5hXR/84CAD/NwsA/1AQAP/TKQD/3yoA/+ksAP91FgD/AAAA/wAA\n        AOEAAADtAAAA/zoLAf9lFAH/YRMB/2ETAf9jFAH/YQ0A/4M4Jv/////////////7+f//+/j///r4///6\n        +P//+ff////8/+3Uzf88DwT/MggA/ygIAP8nAAD/tpOL///////57er/bCwf/zQEAP88DAD/JAAA/51z\n        af///////vf1//vv7v/78O7/+vDt//zx7//38e////r5/9CwqP89BQD/NQoA/1wSAP/SKAD/2ioA/+ct\n        AP9zFgD/AAAA/wAAAOEAAADtAAAA/zoLAP9kEwD/YBIB/2ITAf9oFQH/YxAA/30tGv/Zu7T/mGtg/zQJ\n        BP81DgT/OQ4E/zwPBP87DwT/PQ8E/zwPA/8xCgD/NgsA/yEAAP9eNCv//Pn4/9/Buv/6+Pf/vJyV/y8A\n        AP8zCQD/JgMA/3hNQ//GtK//ZTUq/0MKBP9HEQT/VhQE/50kB/+sKQn/nyQH/3sbBP85CwD/WxIA/7wk\n        AP/QJwD/0CgA/+gsAP90FgD/AAAA/wAAAOEAAADtAAAA/zkLAP9iEwD/XxIA/2ASAP9lFAD/YRAB/3Qk\n        Ef+xeGr/kGxk/41uZ/+Nbmb/jm5m/5FuZv+Qbmb/kW9n/4RfVf82DAL/MwcA/zUEAP/Rta7//PTy/1Yb\n        Ef+/k4j//////2U5L/8lAAD/KAUA/14wJf+YbmP/kGxj/5FtZP+QbGP/nXBl/794Z//CeGf/wXxs/5VY\n        Sf9mEQD/xiYA/9YpAP/PKAD/0SgA/+MsAf9zFgD/AAAA/wAAAOEAAADtAAAA/zkLAP9iEwD/XhIA/18S\n        AP9iEwD/XQwA/3w0I//48e////38/////////////////////////////////+za1f8+EAT/KwAA/4JR\n        RP//////pXpv/yoAAP95Jxb/9urm/9XCvf8uBAD/HgAA/5BoXv/++fj/+/f2//z49//9+Pf//Pj3//j3\n        9//49/f/+////+K5sP/AHQD/zCcB/8wnAP/SKQD/1CkA/+EsAf9wFgH/AAAA/wAAAOEAAADtAAAA/zkL\n        AP9iEwD/XhIA/2ATAP9iEwD/YREA/2sdCv97U0r/VDMr/y8SDP8zEwz/OxYM/0UYDf9HGA3/RhgN/0gX\n        C/80CQH/Qw4E/+rc2f/q2tb/SRAJ/zgIAP9SAgD/o3Nn//////+KX1T/GgAA/00mHf9xUkr/SSMZ/0EU\n        DP9TGgz/jycN/6YrDv+mKw7/qiwP/8YwDP/BJQD/xicB/8gmAP/MJgD/zycA/94qAP9wFQD/AAAA/wAA\n        AOEAAADtAAAA/zkLAP9iEwD/XRIA/14SAP9fEwD/XQ0A/3ovHf/59vX/28nF/5eHiP+cjIj/oI2I/6iP\n        if+pj4n/p5GL/5l7dP8vAQD/poF4//////+DVUv/MQAA/zsMAP9bEAD/TAwC/+XSzv/u5OL/MxEN/4xn\n        Xv/+/v7/u6ah/6eJh/+tjob/1ZaH/+SZh//gmIf/5J+P/95+Z/+8IAD/wiUA/8UmAP/JJgD/zScA/94q\n        AP9vFQD/AAAA/wAAAOEAAADtAAAA/zkLAP9gEwD/XBIA/1wSAP9eEgD/XQ4A/2opGf/e0s//6+bl//Hr\n        6f/x6+r/8uzr//Pt7P/17uz/+PHv/9zGwv9bJBj/4dTQ/8iup/80AwD/OQsA/zgLAf9cEgH/PAMA/3RF\n        Of/u5uT/g2BX/3xUSv/q5OL/7ujn//Hs6v/x6+r/6+np//Ls6v/07On/9/Ty/+S0qP+6HAD/vyQA/8El\n        AP/FJgD/yCYA/9wqAP9vFQD/AAAA/wAAAOEAAADtAAAA/zYLAP9dEwD/WxIA/1wSAP9cEgD/YBMA/zoM\n        Af8lDAb/KA0G/ygNBv8mDAb/Kw4G/zYQBv83EAf/OREH/zUOBf8yDgX/OBUM/zQIAP8zCAD/NgsA/zMK\n        Af9VEQH/ThAB/zgIAP9CEwf/MREJ/ykKAv8wDwf/MA8G/zcQB/8/EQf/PBEH/2UaB/+wKAf/uisI/7ko\n        Bv+7IwD/vSQA/78lAP/FJgD/yiYA/90qAP9xFgD/AAAA/wAAAOEAAADtAAAA/zUKAP9gFwX/WxIA/1sS\n        AP9bEgD/XRIA/zIKAP8XAgD/GAIA/xkDAP8bAwD/HwQA/ycGAP8fBAD/IAQA/yEFAP8mBwD/IwUA/yYG\n        AP8pCAD/KgkA/ygIAP9EDQD/OAwA/y8JAf8xCAD/JQcA/yIHAP8nBgD/JwYA/ysGAP8yBwD/NQcA/zYI\n        AP+VGgD/tSAA/7UhAP+7JAD/vSUA/8ElAP/FJQD/yykC/9wuBf9tFAD/AAAA/wAAAOEAAADtAAAA/zMI\n        AP9sKRn/XhgH/1gQAP9bEgD/XhMA/zIKAP8WBQD/GQUA/xkFAP8bBQD/HQYA/ycIAP8fBgD/HgYA/yEH\n        AP8jBwD/IAYA/x8GAP8fBgD/IAYA/yUHAP8nCAD/IgcA/yIHAP8lCAD/JggA/yIIAf8mCAH/KAkB/yoJ\n        Af8uCgH/MwoA/zwLAP+YHQD/tCIA/7MiAP+4IwD/vSQA/8ImAP/CIgD/zT0b/9g1D/9qEwD/AAAA/wAA\n        AOEAAADtAAAA/zAFAP93Oiz/eUEz/1QLAP9YDwD/XhIA/0UNAP8VBAD/GQUA/xcFAP8YBQD/GwUA/yUI\n        AP8iBwD/IAcA/x8GAP8fBgD/HwYA/yAGAP8gBgD/HwYA/yIHAP8iBwD/HwYA/x8GAP8wCgD/JwgA/yEH\n        AP8jBwD/IwcA/yYIAf8vCgH/LwoB/04QAf+tIgH/sSIA/7QiAP+0IgD/uiMA/7wfAP/DLwz/0mNJ/9M1\n        D/9oEgD/AAAA/wAAAOEAAADtAAAA/y4EAP92PC//mW9l/3lBNP9dFwn/VwsA/1YLAP8iAgD/DgAA/xAA\n        AP8RAAD/EgAA/x8BAP8iAgD/IAEA/yABAP8gAgD/IAIA/yECAP8jAgD/JAIA/yQCAP8jAQD/IgEA/yAB\n        AP9JCQD/IgIA/xkAAP8bAAD/HAEA/x4BAP8nAwD/KQMA/3IRAP+sHQD/rB0A/68cAP+yHAD/tSAA/743\n        Gf/SaVH/13Ve/9E0D/9mEQD/AAAA/wAAAOEAAADtAAAA/y0DAP95QTX/nnhw/552bf+WamD/hlJH/4VL\n        P/91ST7/TUE+/0xBPv9MQT7/TUE+/1hDPv9ZRD7/VUM+/1ZDPv9eRD7/X0U+/1pEPv9aRD7/WUQ+/11E\n        Pv9eRT7/XUQ+/2BFPv+ASz7/W0Q+/1RCPv9WQz7/VkM+/1lDPv9cRD7/dEg+/7dVPv+7Vj7/vVY//8BX\n        Pv/EWUH/ymhS/9R+av/XgGz/13tm/881Ef9mEQD/AAAA/wAAAOEAAADtAAAA/ysCAP+ARzr/p4R8/6J8\n        dP+kf3b/poJ6/6iDev+qg3r/oYF6/52Aev+bgHr/mYB6/6CBev+egXr/moB6/5V/ev+Vf3r/roR6/7KE\n        ev+vhHr/p4J6/5B+ev+Pfnr/jH16/49+ev+lgnr/jX56/4h9ev+JfXr/iX16/41+ev+Rfnr/wYd6/82J\n        ev/LiXr/zIl6/9CKev/Ti3r/04l4/9SHdf/XiHX/14Vy/9A4FP9nEQD/AAAA/wAAAOEAAADtAAAA/ysB\n        AP+BTEH/rpCJ/6mIgf+riYH/rImB/6yJgf+siYH/romB/7CKgf+xioH/s4qB/7OKgf+0ioH/tIqB/7OK\n        gf+zioH/toqB/7eKgf+3ioH/t4uB/66Jgf+siYH/qIiB/6WHgf+yioH/m4aB/5WFgf+UhIH/k4SB/5mF\n        gf+7jIH/y46B/8uPgf/Lj4H/zo+B/9CQgf/Rj4H/1JGB/9WRgf/XkoL/2pB//845Fv9lEAD/AAAA/wAA\n        AOEAAADtAAAA/yoBAP+DUkf/t5yW/7GUjf+zlI3/tJSN/7SUjf+1lI3/tJSN/7WVjf+2lY3/t5WN/7iV\n        jf+4lY3/uZaN/7qWjf+7lo3/u5aN/7yWjf+9lo3/vZaN/8CWjf/Blo3/wZaN/8KXjf/Dl43/xJeN/8SX\n        jf/Cl43/wpeN/8aYjf/MmY3/y5mN/82Zjf/PmY3/0JqN/9Gajf/Tmo3/1puN/9ibjf/anI//25qL/8o5\n        F/9kEAD/AAAA/wAAAOEAAADtAAAA/ygAAP+IWU7/wKmk/7qgmv+6oJr/u6Ca/7ygmv+8oJr/vKCa/7yg\n        mv++oJr/v6Ca/8Chmv/AoZr/wKGa/8Ghmv/CoZr/wqGa/8Ohmv/EoZr/xKGa/8Shmv/FoZr/xqGa/8ai\n        mv/Hopr/yaKa/8uimv/Mo5r/zKOa/86jmv/OpJr/z6Sa/9Ckmv/SpJr/06Sa/9Wlmv/VpZr/16Wa/9qm\n        mv/fqJz/3qWX/8Y6Gv9fDgD/AAAA/wAAAOEAAADtAAAA/ygAAP+GVkv/yLWx/8Grpv/Cq6b/wqum/8Sr\n        pv/Eq6b/xKum/8Wspv/FrKb/xaym/8aspv/HrKb/x6ym/8ispv/Jrab/ya2m/8mtpv/Jrab/y62m/8ut\n        pv/Lrab/y62m/8ytpv/Mrab/zq6n/9Cupv/Qrqb/0a6m/9Gupv/Trqb/1K6m/9Wvpv/Wr6b/16+m/9mv\n        pv/ar6b/2rCm/92wpv/itKn/36yg/78zEf9dDgD/AAAA/wAAAOEAAADtAAAA/ycCAP9tNij/zLq2/8q4\n        tP/Jt7L/yrey/8y3sv/Mt7L/zLey/8y3sv/Nt7L/zbey/863sv/OuLL/z7iy/8+4sv/PuLL/0Liy/9C4\n        sv/QuLL/0Liy/9G4sv/SuLL/0riy/9K4sv/TuLL/1Liy/9S4sv/WubL/17my/9e5sv/YubL/2rmy/9q5\n        sv/aurL/3Lqy/926sv/eurL/37qy/+G7sv/mxb3/0Ix8/7EeAf9ZEQD/AAAA/wAAAOEAAADTAAAA/xoF\n        AP9ICAD/ooN7/9zQzv/Swb7/08K+/9TCvv/Uwr7/1MK+/9TCvv/Uwr7/1cK+/9XCvv/Vwr7/1cK+/9bC\n        vv/Wwr7/1sK+/9fDvv/Yw77/2MO+/9jDvv/Zw77/2cO+/9nDvv/Zw77/2sO+/9rDvv/bw77/3MO+/93E\n        vv/dxL7/3sS+/9/Evv/fxL7/4MS+/+LEvv/ixL7/48W+/+bKxP/nx8D/r0Mr/6kaAP8yCgD/AAAA/wAA\n        AMcAAACKAAAA/wUBAP86CAD/VBgO/7eemf/k29n/49jX/+LW1P/i1tT/4tbU/+LW1P/i1tT/4tbU/+PW\n        1P/j1tT/49bU/+PW1P/j1tT/49bU/+TX1P/k19T/5NbU/+XW1P/l1tT/5dbU/+XW1P/l1tT/5tfU/+bX\n        1P/n19T/59fU/+jX1P/o19T/6NfU/+nX1P/q19T/6tjU/+vX0//s2dX/7t3Z/+nQy/+2X0z/ohcA/30Y\n        AP8DAQD/AAAA/wAAAHIAAAAsAAAA9wAAAP8PAwD/PAYA/1IRBv+EVUv/tpaQ/8aqpP/IrKb/x6yl/8is\n        pf/IrKX/yKyl/8ispf/JrKX/yayl/8qspf/LrKX/zKyl/8yspf/MrKX/za2l/82tpf/OraX/z62l/9Ct\n        pf/QraX/0K6l/9Gupf/SrqX/0q6l/9Supf/WrqX/1q6l/9evpf/Yr6X/2q+l/9ywpv/ZqZ7/yIR0/6c8\n        JP+aFgD/ghkA/xUEAP8AAAD/AAAA6wAAABcAAAAAAAAAZgAAAP8AAAD/BQEA/x4EAP8kAAD/JgAA/ysD\n        AP8sBAD/LQQA/y0EAP8tBAD/LgQA/y4EAP8vBAD/MAUA/zEFAP8yBQD/MwUA/zMFAP80BQD/NQYA/zYG\n        AP83BgD/OQYA/zkGAP85BgD/OgcA/zwHAP88BwD/PggA/z8IAP9BCAD/QwgA/0QJAP9FCQD/RwkA/0oK\n        AP9LCQD/TAUA/00JAP84CwD/BgEA/wAAAP8AAAD6AAAATQAAAAAAAAAAAAAAAAAAAGIAAADxAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOYAAABMAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAhAAAAgAAAAM8AAADnAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAA\n        AO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAA\n        AO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gEAAOYAAADKAAAAdQAAABoAAAAAAAAAAAAA\n        AAD///////8AH+AAAAAABwAfwAAAAAADAB+AAAAAAAEAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAA\n        AAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAA\n        AB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAA\n        AAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAA\n        AB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAA\n        AAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAfAAAAAAAA\n        AB+AAAAAAAEAH8AAAAAAAwAf4AAAAAAHAB8oAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAI4AAADjAAAA7wAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADvAAAA3AAAAHkAAAAGAAAAAAAAAA8AAADFAwAA/y4JAP9FDQD/Rg0A/0sPAf9ODwD/URAA/1UQ\n        AP9YEQD/WxEA/2ATAP9LDwD/RQ0A/1IRAv9fEwL/XREA/1wSAP9eEwH/XhQC/10VBf9dGQn/XBkK/1sX\n        B/9aFwj/Wh4Q/1sdDv8zDwb/AAAA/wAAAKgAAAACAAAAiQAAAP9GDgD/gRkA/4YaAP+MGwD/lR0A/5we\n        AP+lIAD/rSEA/7MiAP/AJQD/sCIA/4QaAP+IGgD/kh0B/7ckAv+5JAD/uSQA/8QmAP/UKgL/2TAI/9Qv\n        CP/ZLQX/2isD/9o0Dv/aQh//2z4a/9Y3Ev9lGgj/AAAA/wAAAGQAAADYGgUA/2YUAP9jEwD/ZRQA/2gU\n        AP9tFQD/dBcA/3wYAP+DGQD/jhwA/44bAP9hEwD/XBIA/2ETAP9lFAD/bBUA/3IWAP95FwD/gBkA/40b\n        AP+WHQD/nx4A/6whAP+0IQD/yS4J/9M7F//QMAv/1C4I/84vCv8fBwL/AAAAvAAAAO0nCAD/XxMA/1sS\n        AP9eEgD/YRMA/2UTAP9qFAD/bBUA/3cXAP91FwD/VBEA/0gOAP9OEAD/ThAA/1cRAP9dEgD/YBMA/2UT\n        AP9qFQD/chYA/3YXAP+BGQD/jRsA/5QdAP+9KAX/1TIM/9MuCP/RKwX/2i4H/z0NAv8AAADgAAAA7ScH\n        AP9eEgD/XBIA/14TAP9iEwD/ZRMA/2cUAP9bEgD/ahUA/0gPAP89DAD/RA4A/0QOAP9HDgD/UA4A/1sR\n        AP9XEQD/WxIA/2ETAP9lEwD/aRQA/3MWAP97GAD/hRkB/6IfAf+rIgH/wCYD/70nA//dLwb/PQ0C/wAA\n        AOEAAADtJwcA/18SAP9cEgD/XxMA/2QVAP9jDAD/WwwA/04OAP8yAAD/NwsA/zQEAP85BwD/QwsA/z8C\n        AP9SEAL/SgoB/0cFAP9READ/UgcA/1cOAP9gEwD/aBQA/2kSAP91EQL/oyID/4UZAP+cHgD/tSUD/+Iy\n        CP89DgP/AAAA4QAAAO0nBwD/YBIA/10SAP9hEwD/YQ0A/6d0aP+WXE7/dS8e/62bl/8+Fgz/hWtk/3BQ\n        Sf9SDwP/tJaP/93PzP/QxsP/hV9X/0YEAP+mhX3/czsu/1YMAP9aDQD/XA4D/7uLf/++RSn/bhAA/34Y\n        AP+ZHwL/3jEJ/z8OAv8AAADhAAAA7SgIAP9hEwD/XxIA/2MTAP9eCAD/z7Wv/7uNgv+BQzP/+fz9/0gf\n        FP+5qaX/noB6/7minf/Vs6r/fD0u/61dSv/539n/hl5V/9jKx/+HWU7/RAAA/1gTCf/KtK7//////8dF\n        Jv+GFAD/kBwA/8gpBP/hMQn/Pw4C/wAAAOEAAADtKAgA/2ITAP9fEwD/YxMA/18IAP/PtK7/tYyC/2w+\n        Mv/7+/z/Sx8U/7Oinv/KtbD/zsC8/3EUB/9kCgD/gAcA/6lbTf/Nvrr/28/M/3pMSP9SFgz/3dDM/+3k\n        4v/l3tz/qkIp/54ZAP+kIAD/4i4F/+cxB/9ADgL/AAAA4QAAAO0oCAD/YhMA/2ATAP9jFAD/XwgA/9O1\n        rv+VgoL/Vjcy//79/P87GRT/qZyc/8vCvv/ItbP/SwQA/34XAP9HBAD/gj83/9fHw//Zzcv/n4N8/+Xe\n        3P/Pwb3/ZiMW/9jGxP99Pi//lhcA/7wkAP/eLQT/6TAF/0ANAv8AAADhAAAA7SkIAP9jEwD/YRMA/2UU\n        AP9fCQD/y6yk/97c3P+Cbmn/7uzs/3JhXP/t6+v/m4WA/9HEwf+JY1j/agkA/0MNAv/Usqr/v5KI/9XC\n        vf//////q5mU/zUFAP89CgP/287K/2o7L/9mDgD/tiMA/+EtA//sLwT/QQ0B/wAAAOEAAADtKQgA/2QT\n        AP9iEwD/ZxQA/2ILAP+rh37/39/f/4V0cP+/t7X/g3Ju/+nm5f97WVP/XjUu/+DV0//hx8H/29PR/8uu\n        p/+DHwv/08TA/4t0bv8oAAD/LgQA/zwOBP/Jrab/XDEn/z0HAP+ZHgH/4iwB/+wtAf9CDQD/AAAA4QAA\n        AO0pCAD/ZBMA/2ETAP9lEwD/axUA/1UTA/81DgT/LwwD/y0MBP8tDAP/Nw4E/zYMAf8lAQD/PA0F/9Gb\n        jf+SXE7/OgIA/1wRAv9NJx7/MQQA/zkNAv86DgP/RRAC/4sgB/9hFgP/NAoA/14TAP/aKgH/6CwA/0EM\n        AP8AAADhAAAA7SkIAf9lFAH/YRMB/2AOAP9+MR7/7NfR/97Lxv/UxMD/08O//9jJxv/DpZ//PQ8D/yYD\n        AP8+FQ//8eXi/7eMhP82AAD/MgEA/21IQ//g1dH/0b66/8++uv/Vv7r/6MnC/7yRhv80BQD/Tw8A/9Qp\n        AP/lLAD/PwwA/wAAAOEAAADtKQgA/2QTAP9iEwH/ZBAA/30tGf/EmY//c05F/2ZEO/9sRj3/bUg//2Q8\n        M/83DAH/JQAA/6mOiv/dyMP/59fT/10yLP8hAAD/ZDwy/6iFff9vQzj/ckY7/6hTPv+9WkL/ij8t/04O\n        AP+tIQD/0ygA/+ArAP8/DAD/AAAA4QAAAO0oCAD/YhMA/18SAP9fDgD/eS0b/9i5sf/dx8P/38jC/9/I\n        w//kzsj/yqmi/zQFAP9fMiz/8ePe/1cgGf+8i4L/x7Ov/x4AAP9nQDb/2L+4/9jCvf/Zwr3/48a//+nO\n        yP/Il4v/sRwA/9UoAP/TKQD/3CsB/z4MAP8AAADhAAAA7SkIAP9iEwD/YBMA/18QAP9zJRP/pIZ//2ZN\n        R/9gRT//bklB/3NMQ/9pPzX/NwYA/9C7tv+rioX/MQAA/2ccDv/s3Nf/cE1H/1EtJf+ZgHn/aEQ8/4pN\n        P/++WED/vFtD/8xPMf/GJQD/yCYA/84nAP/aKgD/PQwA/wAAAOEAAADtKAgA/2ETAP9dEgD/Ww0A/3Mt\n        HP/p393/29TS/9bOzP/b0c7/4tjW/8Kqo/98UEb/4c/L/0YWD/88CQD/TQQA/45oYf/Js67/eVZO//Hs\n        6//Zzsv/3c/M/+zSy//w2tb/4qWW/7weAP/CJQD/yCcA/9cpAP89DAD/AAAA4QAAAO0nCAD/XxMB/1wS\n        AP9fEgD/RRAC/ysVEP8yGhX/MxsV/z0dFf9AHhb/PBkQ/zsXDf85FA3/LwcA/zULAf9REAH/PQoD/0Qd\n        FP8uEQn/ORoS/0EeFf9FHhX/XyMV/7M1Fv+9MRD/uyMA/78lAP/GJgD/1ykB/z0MAP8AAADhAAAA7ScJ\n        Af9oIRD/WRAA/18TAP88DAD/EgEA/xYBAP8YAQD/IQMA/xsCAP8eAwD/IQUA/x4DAP8jBwD/JggA/y4K\n        AP8lBwD/JQUA/yIGAf8kBAD/JwUA/y0FAP84BwD/nRoA/7YgAP+7JAD/wSQA/8cpBv/VNA//OgoA/wAA\n        AOEAAADtIwYA/39GOf9lIxT/VwoA/0cJAP8TAAD/EgAA/xMAAP8dAgD/HgIA/x4CAP8dAQD/HAEA/xwB\n        AP8eAgD/HAIA/x0BAP8tBAD/HAEA/x4CAP8hAgD/JgMA/00LAP+tHgD/sh0A/7QdAP+7HwD/zE0v/9NF\n        Iv84BwD/AAAA4QAAAO0gAwD/i1hN/5dsYv97QzX/dDQl/0ssJf80JyX/NSgl/0AqJf9DKyX/QSsl/0cs\n        Jf9HLCX/Riwl/0crJf9HKyX/Ti0l/2EwJf8+KiX/QCol/0EqJf9ILCX/jjkl/7lCJf+5QSX/v0Up/8pe\n        Rf/YgGv/0Ucn/zcGAP8AAADhAAAA7SADAP+SY1j/qIZ+/6iFfP+phHv/qIN7/6GCe/+fgnv/ooJ7/6CC\n        e/+bgXv/o4J7/7CEe/+uhHv/moF7/5F/e/+WgHv/n4J7/4h9e/+IfXv/in57/6mEe//Oinv/zIp7/8+L\n        e//TjHz/1o17/9mOff/RTS7/NwUA/wAAAOEAAADtHwIA/5pwZv+zlo//sZCJ/7KRif+zkYn/tZGJ/7eS\n        if+4kon/uZKJ/7qSif+6kon/u5KJ/7ySif+8kon/u5KJ/7qSif+8k4n/tJGJ/7CQif+2kon/y5aJ/82W\n        if/Olon/0ZeJ/9SXif/XmIn/3J6Q/9BSNf81BAD/AAAA4QAAAO0eAQD/o310/8Coo/+8oZz/vaKc/76i\n        nP++opz/v6Kc/8GinP/Bopz/wqOc/8OjnP/Do5z/xaOc/8ajnP/Ho5z/yKSc/8qknP/OpZz/z6Wc/9Cl\n        nP/QpZz/0aWc/9OmnP/Vppz/16ec/9qonP/isKX/y1Y7/zICAP8AAADhAAAA7RoAAP+Yb2X/0L+8/8ey\n        rv/Js67/ybOu/8qzrv/Ks67/y7Ou/8y0rv/MtK7/zbSu/860rv/OtK7/z7Su/9C0rv/QtK7/0bSu/9O1\n        rv/Vta7/1bWu/9e1rv/Ytq7/2bau/9y2rv/dtq7/4Lmw/+S8s/++QiT/MAQA/wAAAOEAAADZDwAA/18o\n        HP/Murb/3tLQ/9rLyP/ay8j/2svI/9vLyP/by8j/28vI/9zLyP/cy8j/3czI/97MyP/ezMj/38vI/97L\n        yP/fzMj/4MzI/+HMyP/izMj/48zI/+TNyP/lzcj/5s3I/+jPyf/u2NT/0It7/58aAP8YBAD/AAAAvgAA\n        AIwAAAD/JgAA/2w2K/+4mpP/zbWv/8+1r//Ota//z7Wv/8+1r//Qta//0bav/9K2r//Stq//07av/9S2\n        r//Ut6//1rev/9a3r//Xt6//2Lev/9q3r//cuK//3Liv/964r//gubD/4LWr/8iAb/+gIwn/SgwA/wAA\n        AP8AAABnAAAAEQAAAMcCAAD/EAAA/xwCAP8lCgP/JwsE/ygLBP8oCwT/KAsE/ykMBP8qDAT/LAwE/ywM\n        BP8tDAT/LgwE/y8NBP8wDQT/MA0E/zINBP8zDQT/NA4E/zYOBP83DgT/OA8E/zsPBP88CwL/OAIA/yIF\n        AP8AAQD/AAAAqwAAAAMAAAAAAAAAEQAAAIwAAADcAAAA7AAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAA\n        AO4AAADsAAAA1gAAAHcAAAAHAAAAAP////+AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABKAAAABAAAAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAA4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAAgAAAD/PQwA/2YUAP9uFQD/ehcA/4gaAP9yFgD/ZxQB/4IZAf+JGgD/lR8E/5ch\n        Bv+aJAj/ni4V/14YCP8AAAD/AAAA/2MTAP9pFAD/cRUA/4EYAP9+GAD/WhEA/14QAP9tFAD/ehcA/4sb\n        AP+dHQD/vCcD/+A1Df/SLQf/AAAA/wAAAP9cEgD/YRMA/2QSAP9SEAD/PAwA/zsGAP9WHhD/VhgJ/1IL\n        AP9gEwH/Zw4A/4wbAP+jIAH/xCkF/wAAAP8AAAD/XhEA/2kbB/9SEAD/UhAA/1IQAP87BgD/UhAA/50d\n        AP+dHQD/UhAA/50dAP9SEAD/hhIA/8AoBf8AAAD/AAAA/18RAP9sHQn//////////////////////1IQ\n        AP//////UhAA//////9SEAD//////6YXAP/dLQX/AAAA/wAAAP9hEgD/ZxQA/825tP9SEAD/UhAA/50d\n        AP8tDgb//////zsGAP//////phcA//////98EwD/4SwC/wAAAP8AAAD/YBAA/3IhDv//////////////\n        ////////ciEO//////9SEAD//////6YXAP//////UREB/9EnAP8AAAD/AAAA/14PAP94Khj/zbm0/3Ih\n        Dv9SEAD/LQ4G/1IQAP//////ciEO//////+mFwD//////6MhAv/TKAD/AAAA/wAAAP9cDgD/biUT////\n        //////////////////9SEAD//////825tP//////zbm0///////KKQP/yiUA/wAAAP8AAAD/XxMB/0sL\n        AP8jEAv/LxUP/zIUDP9yIQ7/JgEA/zEFAP8tDgb/MRQM/0kaD/+tKgv/wCEA/8cpA/8AAAD/AAAA/39G\n        Ov9pLB7/MRoW/y4aFf81HBb/OB0X/zgeGP86Hhj/PB4W/y0bFv9bIxb/tDMW/8RDJf/LUTX/AAAA/wAA\n        AP+eeG//sY+H/6uJgv+piYL/qomC/7GKgv+vioL/qYmC/6aIgv+fh4L/wo2C/9CQgv/YmYr/z3Fb/wAA\n        AP8AAAD/sJCJ/825tP/Jsaz/y7Ks/82yrP/Osqz/0LKs/9KzrP/Vs6z/2LSs/9m0rP/atKz/5MC4/9B+\n        a/8AAAD/AAAA/2tGPv/Jsaz/y7Ww/8u0r//MtK//zrWv/8+1r//Qta//0bWv/9S2r//Xtq//2rmy/9ur\n        of+LNyT/AAAA/wAAADcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAACsAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA\n        rEEAAKxBAACsQQAArEEAAKxB\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Controls/EveFolderWindow.Designer.cs",
    "content": "namespace EVEMon.Common.Controls\n{\n    partial class EveFolderWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.BrowseButton = new System.Windows.Forms.Button();\n            this.FilenameTextBox = new System.Windows.Forms.TextBox();\n            this.OpenDirFolderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog();\n            this.CancelButon = new System.Windows.Forms.Button();\n            this.OKButton = new System.Windows.Forms.Button();\n            this.DefaultFolderRadioButton = new System.Windows.Forms.RadioButton();\n            this.SpecifyFolderRadioButton = new System.Windows.Forms.RadioButton();\n            this.SuspendLayout();\n            // \n            // BrowseButton\n            // \n            this.BrowseButton.Enabled = false;\n            this.BrowseButton.Location = new System.Drawing.Point(268, 58);\n            this.BrowseButton.Name = \"BrowseButton\";\n            this.BrowseButton.Size = new System.Drawing.Size(75, 23);\n            this.BrowseButton.TabIndex = 3;\n            this.BrowseButton.Text = \"Browse...\";\n            this.BrowseButton.UseVisualStyleBackColor = true;\n            this.BrowseButton.Click += new System.EventHandler(this.BrowseButton_Click);\n            // \n            // FilenameTextBox\n            // \n            this.FilenameTextBox.Enabled = false;\n            this.FilenameTextBox.Location = new System.Drawing.Point(43, 60);\n            this.FilenameTextBox.Name = \"FilenameTextBox\";\n            this.FilenameTextBox.ReadOnly = true;\n            this.FilenameTextBox.Size = new System.Drawing.Size(219, 20);\n            this.FilenameTextBox.TabIndex = 2;\n            // \n            // OpenDirFolderBrowserDialog\n            // \n            this.OpenDirFolderBrowserDialog.Description = \"Select the folder that contains EVE Portraits.\";\n            // \n            // CancelButon\n            // \n            this.CancelButon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.CancelButon.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.CancelButon.Location = new System.Drawing.Point(268, 103);\n            this.CancelButon.Name = \"CancelButon\";\n            this.CancelButon.Size = new System.Drawing.Size(75, 23);\n            this.CancelButon.TabIndex = 5;\n            this.CancelButon.Text = \"Cancel\";\n            this.CancelButon.UseVisualStyleBackColor = true;\n            // \n            // OKButton\n            // \n            this.OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.OKButton.Enabled = false;\n            this.OKButton.Location = new System.Drawing.Point(187, 103);\n            this.OKButton.Name = \"OKButton\";\n            this.OKButton.Size = new System.Drawing.Size(75, 23);\n            this.OKButton.TabIndex = 4;\n            this.OKButton.Text = \"OK\";\n            this.OKButton.UseVisualStyleBackColor = true;\n            this.OKButton.Click += new System.EventHandler(this.OKButton_Click);\n            // \n            // DefaultFolderRadioButton\n            // \n            this.DefaultFolderRadioButton.AutoSize = true;\n            this.DefaultFolderRadioButton.Checked = true;\n            this.DefaultFolderRadioButton.Location = new System.Drawing.Point(13, 13);\n            this.DefaultFolderRadioButton.Name = \"DefaultFolderRadioButton\";\n            this.DefaultFolderRadioButton.Size = new System.Drawing.Size(126, 17);\n            this.DefaultFolderRadioButton.TabIndex = 0;\n            this.DefaultFolderRadioButton.TabStop = true;\n            this.DefaultFolderRadioButton.Text = \"&Use the default folder\";\n            this.DefaultFolderRadioButton.UseVisualStyleBackColor = true;\n            this.DefaultFolderRadioButton.CheckedChanged += new System.EventHandler(this.DefaultFolderRadioButton_CheckedChanged);\n            // \n            // SpecifyFolderRadioButton\n            // \n            this.SpecifyFolderRadioButton.AutoSize = true;\n            this.SpecifyFolderRadioButton.Location = new System.Drawing.Point(13, 37);\n            this.SpecifyFolderRadioButton.Name = \"SpecifyFolderRadioButton\";\n            this.SpecifyFolderRadioButton.Size = new System.Drawing.Size(98, 17);\n            this.SpecifyFolderRadioButton.TabIndex = 1;\n            this.SpecifyFolderRadioButton.Text = \"&Specify a folder\";\n            this.SpecifyFolderRadioButton.UseVisualStyleBackColor = true;\n            this.SpecifyFolderRadioButton.CheckedChanged += new System.EventHandler(this.SpecifyFolderRadioButton_CheckedChanged);\n            // \n            // EveFolderWindow\n            // \n            this.AcceptButton = this.OKButton;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.CancelButon;\n            this.ClientSize = new System.Drawing.Size(355, 138);\n            this.Controls.Add(this.SpecifyFolderRadioButton);\n            this.Controls.Add(this.DefaultFolderRadioButton);\n            this.Controls.Add(this.BrowseButton);\n            this.Controls.Add(this.FilenameTextBox);\n            this.Controls.Add(this.OKButton);\n            this.Controls.Add(this.CancelButon);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"EveFolderWindow\";\n            this.ShowInTaskbar = false;\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"EVE Portraits Folder\";\n            this.Load += new System.EventHandler(this.EVEFolderWindow_Load);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Button BrowseButton;\n        private System.Windows.Forms.TextBox FilenameTextBox;\n        private System.Windows.Forms.FolderBrowserDialog OpenDirFolderBrowserDialog;\n        private System.Windows.Forms.Button CancelButon;\n        private System.Windows.Forms.Button OKButton;\n        private System.Windows.Forms.RadioButton DefaultFolderRadioButton;\n        private System.Windows.Forms.RadioButton SpecifyFolderRadioButton;\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/EveFolderWindow.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    public partial class EveFolderWindow : EVEMonForm\n    {\n        private IEnumerable<string> m_specifiedPortraitFolder = new List<string>();\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveFolderWindow\"/> class.\n        /// </summary>\n        public EveFolderWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Handles the Load event of the EVEFolderWindow control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EVEFolderWindow_Load(object sender, EventArgs e)\n        {\n            if (!EveMonClient.DefaultEvePortraitCacheFolders.Any())\n            {\n                SpecifyFolderRadioButton.Checked = true;\n                DefaultFolderRadioButton.Enabled = false;\n            }\n            else\n                SpecifyFolderRadioButton.Checked = true;\n        }\n\n        /// <summary>\n        /// Gets the specified EVE portrait cache folder.\n        /// </summary>\n        /// <value>The specified EVE portrait cache folder.</value>\n        public IEnumerable<string> SpecifiedEVEPortraitCacheFolder => m_specifiedPortraitFolder;\n\n        /// <summary>\n        /// Handles the Click event of the BrowseButton control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void BrowseButton_Click(object sender, EventArgs e)\n        {\n            DialogResult dr = OpenDirFolderBrowserDialog.ShowDialog();\n            if (dr != DialogResult.OK)\n                return;\n\n            FilenameTextBox.Text = OpenDirFolderBrowserDialog.SelectedPath;\n            OKButton.Enabled = true;\n            AcceptButton = OKButton;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the OKButton control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OKButton_Click(object sender, EventArgs e)\n        {\n            m_specifiedPortraitFolder = DefaultFolderRadioButton.Checked\n                                            ? EveMonClient.DefaultEvePortraitCacheFolders\n                                            : new List<string> { FilenameTextBox.Text };\n\n            DialogResult = DialogResult.OK;\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the CheckedChanged event of the DefaultFolderRadioButton control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void DefaultFolderRadioButton_CheckedChanged(object sender, EventArgs e)\n        {\n            if (!DefaultFolderRadioButton.Checked)\n                return;\n\n            OKButton.Enabled = true;\n            AcceptButton = OKButton;\n        }\n\n        /// <summary>\n        /// Handles the CheckedChanged event of the SpecifyFolderRadioButton control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void SpecifyFolderRadioButton_CheckedChanged(object sender, EventArgs e)\n        {\n            BrowseButton.Enabled = FilenameTextBox.Enabled = SpecifyFolderRadioButton.Checked;\n            if (SpecifyFolderRadioButton.Checked && FilenameTextBox.Text.Length == 0)\n                AcceptButton = BrowseButton;\n\n            OKButton.Enabled = SpecifyFolderRadioButton.Checked && FilenameTextBox.Text.Length != 0;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/EveFolderWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"OpenDirFolderBrowserDialog.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Controls/EveImage.Designer.cs",
    "content": "namespace EVEMon.Common.Controls\n{\n    partial class EveImage\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EveImage));\n            this.pbImage = new System.Windows.Forms.PictureBox();\n            this.toolTip = new System.Windows.Forms.ToolTip(this.components);\n            this.overlayImageList = new System.Windows.Forms.ImageList(this.components);\n            ((System.ComponentModel.ISupportInitialize)(this.pbImage)).BeginInit();\n            this.SuspendLayout();\n            // \n            // pbImage\n            // \n            this.pbImage.Cursor = System.Windows.Forms.Cursors.Default;\n            this.pbImage.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.pbImage.Location = new System.Drawing.Point(0, 0);\n            this.pbImage.Margin = new System.Windows.Forms.Padding(0);\n            this.pbImage.Name = \"pbImage\";\n            this.pbImage.Size = new System.Drawing.Size(64, 64);\n            this.pbImage.TabIndex = 0;\n            this.pbImage.TabStop = false;\n            this.pbImage.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.pbImage_MouseDoubleClick);\n            this.pbImage.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pbImage_MouseClick);\n            this.toolTip.SetToolTip(this.pbImage, \"Double-click to view a larger image\");\n            // \n            // overlayImageList\n            // \n            this.overlayImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject(\"overlayImageList.ImageStream\")));\n            this.overlayImageList.TransparentColor = System.Drawing.Color.Transparent;\n            this.overlayImageList.Images.SetKeyName(0, \"T1\");\n            this.overlayImageList.Images.SetKeyName(1, \"T2\");\n            this.overlayImageList.Images.SetKeyName(2, \"T3\");\n            this.overlayImageList.Images.SetKeyName(3, \"T4\");\n            this.overlayImageList.Images.SetKeyName(4, \"Storyline\");\n            this.overlayImageList.Images.SetKeyName(5, \"Faction\");\n            this.overlayImageList.Images.SetKeyName(6, \"Deadspace\");\n            this.overlayImageList.Images.SetKeyName(7, \"Officer\");\n            // \n            // EveImage\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.pbImage);\n            this.Name = \"EveImage\";\n            this.Size = new System.Drawing.Size(64, 64);\n            ((System.ComponentModel.ISupportInitialize)(this.pbImage)).EndInit();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.PictureBox pbImage;\n        private System.Windows.Forms.ToolTip toolTip;\n        private System.Windows.Forms.ImageList overlayImageList;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/EveImage.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Service;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// Displays an image for a given EveObject.\n    /// </summary>\n    /// <remarks>\n    /// Setting the PopUpEnabled property to true enables a pop-up\n    /// window for EveObjects with a 256 x 256 image available, accessed\n    /// via the user double-clicking the image. Image size must be\n    /// set using the ImageSize property. The default Size property is\n    /// overriden.\n    /// </remarks>\n    public partial class EveImage : UserControl\n    {\n        private readonly Timer m_timer = new Timer();\n        private MouseEventArgs m_mouseEvent;\n\n        /// <summary>\n        /// Holds configuration data for different image types.\n        /// </summary>\n        private Dictionary<ImageType, ImageTypeData> m_imageTypeAttributes;\n\n        private bool m_popUpActive;\n        private EveImageSize m_imageSize;\n        private EveImageSizeMode m_sizeMode;\n        private Item m_item;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initialize the control.\n        /// </summary>\n        /// <remarks>\n        /// The default image size is 64 x 64, with the image pop-up enabled.\n        /// </remarks>\n        public EveImage()\n        {\n            InitializeComponent();\n            SetImageTypeAttributes();\n            ImageSize = EveImageSize.x64;\n            PopUpEnabled = true;\n            ShowBlankImage();\n\n            m_timer.Interval = 500;\n            m_timer.Tick += m_timer_Tick;\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the state of the pop-up ability.\n        /// </summary>\n        public bool PopUpEnabled { get; set; }\n\n        /// <summary>\n        /// Gets or sets the item to display an image for.\n        /// </summary>\n        [Browsable(false), ReadOnly(true)]\n        public Item EveItem\n        {\n            get { return m_item; }\n            set\n            {\n                m_item = value;\n                if (m_imageSize != EveImageSize.x0)\n                   GetImageAsync().ConfigureAwait(false);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the size of the image in eve parlance.\n        /// </summary>\n        public EveImageSize ImageSize\n        {\n            get { return m_imageSize; }\n            set\n            {\n                m_imageSize = value;\n\n                if (m_sizeMode != EveImageSizeMode.AutoSize)\n                    return;\n\n                pbImage.Size = new Size((int)m_imageSize, (int)m_imageSize);\n                Size = pbImage.Size;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the size of the image in pixels.\n        /// </summary>\n        public new Size Size\n        {\n            get { return base.Size; }\n            set\n            {\n                base.Size = m_sizeMode == EveImageSizeMode.AutoSize\n                    ? new Size((int)m_imageSize, (int)m_imageSize)\n                    : value;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the size mode.\n        /// </summary>\n        /// <value>The size mode.</value>\n        public EveImageSizeMode SizeMode\n        {\n            get { return m_sizeMode; }\n            set\n            {\n                m_sizeMode = value;\n\n                switch (value)\n                {\n                    case EveImageSizeMode.Normal:\n                        pbImage.SizeMode = PictureBoxSizeMode.Normal;\n                        break;\n                    case EveImageSizeMode.AutoSize:\n                        pbImage.Size = new Size((int)m_imageSize, (int)m_imageSize);\n                        Size = pbImage.Size;\n                        pbImage.SizeMode = PictureBoxSizeMode.AutoSize;\n                        break;\n                    case EveImageSizeMode.StretchImage:\n                        pbImage.SizeMode = PictureBoxSizeMode.StretchImage;\n                        break;\n                }\n            }\n        }\n\n        #endregion\n\n\n        #region Private Methods\n\n        /// <summary>\n        /// Builds the m_ImageTypeAttributes dictionary.\n        /// </summary>\n        private void SetImageTypeAttributes()\n        {\n            m_imageTypeAttributes = new Dictionary<ImageType, ImageTypeData>();\n\n            // Ships\n            ArrayList validSizes = new ArrayList { EveImageSize.x32, EveImageSize.x64, EveImageSize.x128, EveImageSize.x256 };\n            m_imageTypeAttributes.Add(ImageType.Ship,\n                new ImageTypeData(\"Ships\", \"icons\", ImageNameFrom.TypeID, validSizes));\n\n            // Items\n            validSizes = new ArrayList { EveImageSize.x16, EveImageSize.x32, EveImageSize.x64, EveImageSize.x128 };\n            m_imageTypeAttributes.Add(ImageType.Item,\n                new ImageTypeData(\"Items\", \"icons\", ImageNameFrom.Icon, validSizes));\n\n            // Drones\n            validSizes = new ArrayList { EveImageSize.x32, EveImageSize.x64, EveImageSize.x128, EveImageSize.x256 };\n            m_imageTypeAttributes.Add(ImageType.Drone,\n                new ImageTypeData(\"Drones\", \"icons\", ImageNameFrom.TypeID, validSizes));\n\n            // Structures\n            validSizes = new ArrayList { EveImageSize.x32, EveImageSize.x64, EveImageSize.x128, EveImageSize.x256 };\n            m_imageTypeAttributes.Add(ImageType.Structure,\n                new ImageTypeData(\"\", \"icons\", ImageNameFrom.TypeID, validSizes));\n\n            // Blueprints\n            validSizes = new ArrayList { EveImageSize.x64 };\n            m_imageTypeAttributes.Add(ImageType.Blueprint,\n                new ImageTypeData(\"Blueprints\", \"icons\", ImageNameFrom.TypeID, validSizes));\n        }\n\n        /// <summary>\n        /// Gets the type of the image.\n        /// </summary>\n        /// <param name=\"item\">The item.</param>\n        /// <returns></returns>\n        private static ImageType GetImageType(Item item)\n        {\n            switch (item.Family)\n            {\n                case ItemFamily.Ship:\n                    return ImageType.Ship;\n                case ItemFamily.Drone:\n                    return ImageType.Drone;\n                case ItemFamily.StarbaseStructure:\n                    return ImageType.Structure;\n                case ItemFamily.Blueprint:\n                    return ImageType.Blueprint;\n                default:\n                    return ImageType.Item;\n            }\n        }\n\n        /// <summary>\n        /// Renders a BackColor square as a placeholder for the image.\n        /// </summary>\n        private void ShowBlankImage()\n        {\n            Bitmap bmp;\n            using (Bitmap tempBitmap = new Bitmap(pbImage.ClientSize.Width, pbImage.ClientSize.Height))\n            {\n                bmp = (Bitmap)tempBitmap.Clone();\n            }\n\n            using (Graphics g = Graphics.FromImage(bmp))\n            using (SolidBrush brush = new SolidBrush(BackColor))\n            {\n                g.FillRectangle(brush, new Rectangle(0, 0, bmp.Width, bmp.Height));\n            }\n\n            pbImage.Image = bmp;\n        }\n\n        /// <summary>\n        /// Retrieves image for the given EveObject.\n        /// </summary>\n        private async Task GetImageAsync()\n        {\n            // Reset flags and cursor\n            m_popUpActive = false;\n            toolTip.Active = false;\n            pbImage.Cursor = Cursors.Default;\n\n            if (m_item == null)\n                return;\n\n            ImageType imageType = GetImageType(m_item);\n            ImageTypeData typeData = m_imageTypeAttributes[imageType];\n\n            // Only display an image if the correct size is available\n            if (!typeData.ValidSizes.Contains(m_imageSize))\n                return;\n\n            // Enable pop up if required\n            if (PopUpEnabled && typeData.ValidSizes.Contains(EveImageSize.x256))\n            {\n                toolTip.Active = true;\n                m_popUpActive = true;\n                pbImage.Cursor = Cursors.Hand;\n            }\n\n            await GetImageFromCCPAsync().ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Gets the image from CCP's image server.\n        /// </summary>\n        private async Task GetImageFromCCPAsync()\n        {\n            while (true)\n            {\n                Image img = await ImageService.GetImageAsync(GetImageUrl()).ConfigureAwait(false);\n                GotImage(m_item.ID, img);\n                break;\n            }\n        }\n\n        /// <summary>\n        /// Gets the image URL.\n        /// </summary>\n        /// <returns></returns>\n        private Uri GetImageUrl()\n        {\n            int size = (int)m_imageSize;\n            string path = string.Format(CultureConstants.InvariantCulture, (size > 64 ?\n                NetworkConstants.CCPTypeRender : NetworkConstants.CCPTypeImage), m_item.ID,\n                size);\n            return ImageService.GetImageServerBaseUri(path);\n        }\n\n        /// <summary>\n        /// Callback method for asynchronous web requests.\n        /// </summary>\n        /// <param name=\"id\">EveObject id for retrieved image</param>\n        /// <param name=\"image\">Image object retrieved</param>\n        private void GotImage(long id, Image image)\n        {\n            // Only display the image if the id matches the current EveObject\n            if (image != null && m_item.ID == id)\n            {\n                pbImage.Image = image;\n\n                // Draw the overlay icon\n                if ((int)m_imageSize > 64)\n                    DrawOverlayIcon();\n            }\n            else\n                ShowBlankImage();\n        }\n\n        /// <summary>\n        /// Draws the overlay icon.\n        /// </summary>\n        private void DrawOverlayIcon()\n        {\n            Bitmap overlayIcon = null;\n            try\n            {\n                switch (m_item.MetaGroup)\n                {\n                    case ItemMetaGroup.T2:\n                        overlayIcon = Properties.Resources.T2;\n                        break;\n                    case ItemMetaGroup.T3:\n                        overlayIcon = Properties.Resources.T3;\n                        break;\n                    case ItemMetaGroup.Storyline:\n                        overlayIcon = Properties.Resources.Storyline;\n                        break;\n                    case ItemMetaGroup.Deadspace:\n                        overlayIcon = Properties.Resources.Deadspace;\n                        break;\n                    case ItemMetaGroup.Officer:\n                        overlayIcon = Properties.Resources.Officer;\n                        break;\n                    case ItemMetaGroup.Faction:\n                        overlayIcon = Properties.Resources.Faction;\n                        break;\n                    default:\n                        overlayIcon = new Bitmap(16, 16);\n                        break;\n                }\n\n                Image image = (Image)pbImage.Image.Clone();\n\n                using (Graphics graph = Graphics.FromImage(image))\n                {\n                    graph.DrawImage(overlayIcon, 0, 0, (int)m_imageSize / 4, (int)m_imageSize / 4);\n                }\n\n                pbImage.Image = image;\n            }\n            finally\n            {\n                overlayIcon?.Dispose();\n            }\n        }\n\n        #endregion\n\n\n        #region Local Event Handlers\n\n        /// <summary>\n        /// Handles the Tick event of the m_timer control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void m_timer_Tick(object sender, EventArgs e)\n        {\n            m_timer.Stop();\n\n            if (!Enabled)\n                return;\n\n            // Actions according to mouse clicks\n            switch (m_mouseEvent.Clicks)\n            {\n                case 1:\n                {\n                    base.OnMouseClick(m_mouseEvent);\n                }\n                    break;\n                case 2:\n                {\n                    base.OnMouseDoubleClick(m_mouseEvent);\n\n                    WindowsFactory.ShowByTag<EveImagePopUp, Item>(m_item);\n                }\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Event handler for image click.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void pbImage_MouseClick(object sender, MouseEventArgs e)\n        {\n            // If item does not support pop-up trigger the event immediately\n            if (!m_popUpActive)\n            {\n                base.OnMouseClick(e);\n                return;\n            }\n\n            // Store the single mouse click event\n            m_mouseEvent = e;\n            m_timer.Start();\n        }\n\n        /// <summary>\n        /// Event handler for image double click.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"MouseEventArgs\"/> instance containing the event data.</param>\n        private void pbImage_MouseDoubleClick(object sender, MouseEventArgs e)\n        {\n            // Display the pop up form if pop-ups are enabled and a suitable image can be retrieved\n            // otherwise trigger a single mouse click event\n            if (!m_popUpActive)\n            {\n                base.OnMouseClick(e);\n                return;\n            }\n\n            // Store the double mouse click event\n            m_mouseEvent = e;\n            m_timer.Start();\n        }\n\n        #endregion\n\n\n        #region Private Enumerations and Structs\n\n        /// <summary>\n        /// Identifies the image type being handled.\n        /// </summary>\n        private enum ImageType\n        {\n            Ship,\n            Drone,\n            Structure,\n            Item,\n            Blueprint\n        }\n\n        /// <summary>\n        /// Indicates the source of the .png image name.\n        /// </summary>\n        private enum ImageNameFrom\n        {\n            TypeID,\n            Icon\n        };\n\n        /// <summary>\n        /// Defines configuration data for a specific ImageType.\n        /// </summary>\n        private struct ImageTypeData\n        {\n            internal readonly string LocalComponent;\n            internal readonly string URLPath;\n            internal readonly ImageNameFrom NameFrom;\n            internal readonly ArrayList ValidSizes;\n\n            internal ImageTypeData(string local, string url, ImageNameFrom name, ArrayList sizes)\n            {\n                LocalComponent = local;\n                URLPath = url;\n                NameFrom = name;\n                ValidSizes = sizes;\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/EveImage.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"toolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"overlayImageList.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>107, 17</value>\n  </metadata>\n  <data name=\"overlayImageList.ImageStream\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\n        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\n        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAg\n        DwAAAk1TRnQBSQFMAgEBCAEAAUABAAFAAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo\n        AwABQAMAATADAAEBAQABCAYAAQwYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA\n        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5\n        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA\n        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm\n        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM\n        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA\n        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz\n        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ\n        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM\n        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA\n        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA\n        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ\n        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/\n        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA\n        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm\n        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ\n        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz\n        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA\n        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM\n        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM\n        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM\n        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA\n        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM\n        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ\n        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz\n        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm\n        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw\n        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8ABQAB8gH0\n        DgAB8gH0DgAB8gH0DgAB8gH0DgABSQHyAfQNAAEhAfIB9A0AAYYB8gH0DQABYAHyAfQNAAJJAfIB9AwA\n        AiEB8gH0DAAChgHyAfQMAAJgAfIB9AwAA0kB8gH0CwADIQHyAfQLAAOGAfIB9AsAA2AB8gH0CwAESQHy\n        AfQKAAQhAfIB9AoABIYB8gH0CgAEYAHyAfQKAAVJAfIB9AkABSEB8gH0CQAFhgHyAfQJAAVgAfIB9AkA\n        BkkB8gH0CAABIgUhAfIB9AgABoYB8gH0CAAGYAHyAfQIAAFKBkkB8gH0BwABSQYhAfIB9AcAAYsGhgHy\n        AfQHAAFmBmAB8gH0BwABUAJJAygCSQHyAfQGAAFJByEB8gH0BgABiwKGA2YChgHyAfQGAAGGB2AB8gH0\n        BgABUAFJAeoBBwH/AQcB6gJJAfIB9AUAAUkCIQFJAfQBSQMhAfIB9AUAAa4ChgFmAf8BZgOGAfIB9AUA\n        AYwCYAH3AQwB7wNgAfIB9AUAAXIBKAEHAUoBIgFKAQcBKAJJAfIB9AQAARIBIQFJAQcBFAEHAUkDIQHy\n        AfQEAAGuAmYBDQH/AQ0CZgKGAfIB9AQAAYwBYAEMAQcB/wEHAQwDYAHyAfQEAAFyASgB/wEiAUkBIgH/\n        ASgDSQHyAfQDAAFyASEB9AEUASEBFAH0BCEB8gH0AwABkQFmBf8BZgOGAfIB9AMAAa4BYAHtAfQB/wH0\n        Ae0EYAHyAfQDAAFzASgBBwFKASIBSgEHASgESQHyAfQCAAFyASEBSQEHARQBBwFJBSEB8gH0AgABtAJm\n        AQ0B/wENAmYEhgHyAfQCAAGuAmABDAHxAQwGYAHyAfQCAAFzAUkB6gEHAf8BBwHqBkkB8gH0AQABcgIh\n        AUkB9AFJByEB8gH0AQABtQKGAWYB/wFmB4YB8gH0AQABjQNgAa4IYAHyAfQBAAEcAkkDKAhJAfIB9AHs\n        DSEB8gH0AbUChgNmCIYB8gH0Aa8NYAHyAfQCHAJzAnICUAFKBkkB8gHtAewDcgESA0kBIgUhAfIDtQG0\n        AZECrgKLBoYB8gG1Aa8BjQKuAowBhgFmBmAC8gH0DgAB8gH0DgAB8gH0DgAB8gH0DgABMQHyAfQNAAEq\n        AfIB9A0AASQB8gH0DQABIwHyAfQNAAIxAfIB9AwAAioB8gH0DAACJAHyAfQMAAIjAfIB9AwAAzEB8gH0\n        CwADKgHyAfQLAAMkAfIB9AsAAyMB8gH0CwAEMQHyAfQKAAQqAfIB9AoABCQB8gH0CgAEIwHyAfQKAAUx\n        AfIB9AkABSoB8gH0CQAFJAHyAfQJAAUjAfIB9AkABjEB8gH0CAAGKgHyAfQIAAYkAfIB9AgAAUQFIwHy\n        AfQIAAFYBjEB8gH0BwAHKgHyAfQHAAckAfIB9AcAAUQGIwHyAfQHAAFYAzEBMAMxAfIB9AYAAUsHKgHy\n        AfQGAAFLByQB8gH0BgABRAEjAR4CIwEeAiMB8gH0BgABWAIxAQMB/wEDAzEB8gH0BQABTAEqASMB/wEj\n        Af8BIwIqAfIB9AUAAUwBIwH/ASMB/wEjAf8BIwEkAfIB9AUAAUQBCwH/AQsBRAHwAUQCIwHyAfQFAAFY\n        AjEBAwH/AQMEMQHyAfQEAAFSASoBIwH/ASMB/wEjAyoB8gH0BAABTAEjAf8BIwH/ASMB/wEjAiQB8gH0\n        BAABSwELAf8BCwHsAbwB7AEeAiMB8gH0BAABeQIxAQMB/wEDBTEB8gH0AwABdAEqASMB/wEjAf8BIwQq\n        AfIB9AMAAW8BIwH/ASMB/wEjAf8BIwMkAfIB9AMAAW4BCwH/AQsB9AELAfQBCwMjAfIB9AMAAXkCMQED\n        Af8BAwYxAfIB9AIAAXQBKgEjAf8BIwH/ASMFKgHyAfQCAAF0ASMB/wEjAf8BIwH/ASMEJAHyAfQCAAFu\n        AQsB/wELAf8BCwH/AQsEIwHyAfQCAAF5AjEBAwH/AQMHMQHyAfQBAAF0ASoBIwH/ASMB/wEjBioB8gH0\n        AQABdAEjAf8BIwH/ASMB/wEjBSQB8gH0AQABbgELAf8BCwH/AQsB/wELBSMB8gH0AQABeQMxATAJMQHy\n        AfQBdA0qAfIB9AF0DSQB8gH0Ae0BIwUeByMB8gH0AZkEeQRYBjEB8gGZBHQBUgFMAUsHKgHyAZMDdAFv\n        AkwBSwckAfIBHAHtA24BSwREBSMB8gFCAU0BPgcAAT4DAAEoAwABQAMAATADAAEBAQABAQUAAYABARYA\n        A/+BAAE/Af8BPwH/AT8B/wE/Af8BHwH/AR8B/wEfAf8BHwH/AQ8B/wEPAf8BDwH/AQ8B/wEHAf8BBwH/\n        AQcB/wEHAf8BAwH/AQMB/wEDAf8BAwH/AQEB/wEBAf8BAQH/AQEB/wEAAf8BAAH/AQAB/wEAAf8BAAF/\n        AQABfwEAAX8BAAF/AQABPwEAAT8BAAE/AQABPwEAAR8BAAEfAQABHwEAAR8BAAEPAQABDwEAAQ8BAAEP\n        AQABBwEAAQcBAAEHAQABBwEAAQMBAAEDAQABAwEAAQMBAAEBAQABAQEAAQEBAAEBEAABPwH/AT8B/wE/\n        Af8BPwH/AR8B/wEfAf8BHwH/AR8B/wEPAf8BDwH/AQ8B/wEPAf8BBwH/AQcB/wEHAf8BBwH/AQMB/wED\n        Af8BAwH/AQMB/wEBAf8BAQH/AQEB/wEBAf8BAAH/AQAB/wEAAf8BAAH/AQABfwEAAX8BAAF/AQABfwEA\n        AT8BAAE/AQABPwEAAT8BAAEfAQABHwEAAR8BAAEfAQABDwEAAQ8BAAEPAQABDwEAAQcBAAEHAQABBwEA\n        AQcBAAEDAQABAwEAAQMBAAEDAQABAQEAAQEBAAEBAQABARAACw==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Controls/EveImagePopUp.Designer.cs",
    "content": "using EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Controls\n{\n    partial class EveImagePopUp\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.eveImage = new EVEMon.Common.Controls.EveImage();\n            this.SuspendLayout();\n            // \n            // eveImage\n            // \n            this.eveImage.ImageSize = EveImageSize.x256;\n            this.eveImage.Location = new System.Drawing.Point(0, 0);\n            this.eveImage.Name = \"eveImage\";\n            this.eveImage.PopUpEnabled = false;\n            this.eveImage.Size = new System.Drawing.Size(256, 256);\n            this.eveImage.TabIndex = 0;\n            // \n            // EveImagePopUp\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(256, 256);\n            this.Controls.Add(this.eveImage);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;\n            this.MaximizeBox = false;\n            this.Name = \"EveImagePopUp\";\n            this.Text = \"EveImagePopUp\";\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private EveImage eveImage;\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/EveImagePopUp.cs",
    "content": "using System;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// Displays 256 x 256 image of specified EveObject in a separate window.\n    /// </summary>\n    public partial class EveImagePopUp : EVEMonForm\n    {\n        private const string TitleBase = \"EVEMon Image Viewer\";\n        private readonly Item m_imageSource;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveImagePopUp\"/> class.\n        /// </summary>\n        /// <param name=\"imageSource\">The image source.</param>\n        public EveImagePopUp(Item imageSource)\n        {\n            InitializeComponent();\n            m_imageSource = imageSource;\n        }\n\n        /// <summary>\n        /// On load, restores the window rectangle from the settings.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            Text = TitleBase;\n\n            if (m_imageSource == null)\n                return;\n\n            // Set window title\n            Text = $\"{m_imageSource.Name} - {TitleBase}\";\n            eveImage.EveItem = m_imageSource;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/EveImagePopUp.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Controls/ExpandablePanelControl.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    public class ExpandablePanelControl : NoFlickerPanel\n    {\n        #region Fields\n\n        private readonly IContainer components;\n\n        // Settings\n        private PanelState m_panelState;\n        private int m_animationStep;\n        private int m_expandedHeight;\n\n        // ContextMenu\n        private ContextMenuStrip m_contextMenuStrip;\n        private ToolStripMenuItem m_tsmiExpandCollapse;\n        private ToolStripMenuItem m_tsmiSelectAnim;\n        private ToolStripSeparator m_tsmiSeparator;\n        private ToolStripMenuItem m_tsmiNoAnim;\n        private ToolStripMenuItem m_tsmiHighAnim;\n        private ToolStripMenuItem m_tsmiMedAnim;\n        private ToolStripMenuItem m_tsmiLowAnim;\n\n        // Graphics variables\n        private Bitmap m_headerImage;\n        private Bitmap m_expandImage;\n        private Bitmap m_collapseImage;\n        private int m_offset;\n        private const int Pad = 6;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Cunstructor.\n        /// </summary>\n        public ExpandablePanelControl()\n        {\n            components = new Container();\n\n            HeaderText = string.Empty;\n            ExpandDirection = Direction.Up;\n\n            // Header\n            CreateHeader();\n\n            // ContextMenu\n            CreateContextMenu();\n\n            // Event handlers\n            Header.Paint += nfpHeader_Paint;\n            Header.MouseClick += expandablePanelControl_MouseClick;\n            MouseClick += expandablePanelControl_MouseClick;\n        }\n\n        #endregion\n\n\n        #region Dispose\n\n        /// <summary>\n        /// Releases the unmanaged resources used by the <see cref=\"T:System.Windows.Forms.Control\"/> \n        /// and its child controls and optionally releases the managed resources.\n        /// </summary>\n        /// <param name=\"disposing\">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n                components?.Dispose();\n\n            base.Dispose(disposing);\n        }\n\n        #endregion\n\n\n        #region Control Creation Methods\n\n        /// <summary>\n        /// Creates the Header.\n        /// </summary>\n        private void CreateHeader()\n        {\n            Header = new NoFlickerPanel\n            {\n                Width = Width,\n                Height = 30,\n                BackColor = Color.Transparent\n            };\n\n            Controls.Add(Header);\n        }\n\n        /// <summary>\n        /// Creates the context menu.\n        /// </summary>\n        private void CreateContextMenu()\n        {\n            m_tsmiExpandCollapse = new ToolStripMenuItem();\n            m_tsmiSelectAnim = new ToolStripMenuItem(\"Animation Speed\");\n            m_tsmiNoAnim = new ToolStripMenuItem(\"None\");\n            m_tsmiHighAnim = new ToolStripMenuItem(\"High\");\n            m_tsmiMedAnim = new ToolStripMenuItem(\"Medium\");\n            m_tsmiLowAnim = new ToolStripMenuItem(\"Low\");\n            m_tsmiSeparator = new ToolStripSeparator();\n\n            // Add menu items\n            m_tsmiSelectAnim.DropDownItems.AddRange(new ToolStripItem[]\n            {\n                m_tsmiNoAnim,\n                m_tsmiHighAnim,\n                m_tsmiMedAnim,\n                m_tsmiLowAnim\n            });\n\n            // Create context menu\n            m_contextMenuStrip = new ContextMenuStrip(components);\n            m_contextMenuStrip.SuspendLayout();\n            m_contextMenuStrip.Items.AddRange(new ToolStripItem[]\n            {\n                m_tsmiExpandCollapse,\n                m_tsmiSeparator,\n                m_tsmiSelectAnim\n            });\n            m_contextMenuStrip.ResumeLayout(false);\n\n            // Subscribe events\n            m_tsmiExpandCollapse.Click += tsmiExpandCollapse_Click;\n            foreach (ToolStripMenuItem item in m_tsmiSelectAnim.DropDownItems)\n            {\n                item.Click += animationSpeedSelect_Click;\n            }\n        }\n\n        /// <summary>\n        // Sets the check state of the appropriate AnimationSpeed menu item\n        /// </summary>\n        private void SetAnimationSpeedContextMenuItemCheckState()\n        {\n            foreach (ToolStripMenuItem item in m_tsmiSelectAnim.DropDownItems.Cast<ToolStripMenuItem>())\n            {\n                AnimationSpeed speed;\n                if (Enum.TryParse(item.Text, out speed))\n                    item.Checked = (speed == AnimationSpeed);\n            }\n        }\n\n        #endregion\n\n\n        #region Graphics Methods\n\n        /// <summary>\n        /// Draws the main Panel.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            Graphics gr = e.Graphics;\n            gr.SmoothingMode = SmoothingMode.AntiAlias;\n            using (Pen pen = new Pen(SystemBrushes.ControlDark, 1))\n            {\n                gr.DrawLine(pen, 0, 0, 0, Height);\n                gr.DrawLine(pen, 0, Height - 1, Width - 1, Height - 1);\n                gr.DrawLine(pen, Width - 1, Height - 1, Width - 1, 0);\n                gr.DrawLine(pen, Width - 1, 0, 0, 0);\n            }\n\n            int height = ExpandDirection == Direction.Up ? Height - Header.Height : 0;\n            Header.Location = new Point(0, height);\n        }\n\n        /// <summary>\n        /// Draws the Header.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void nfpHeader_Paint(object sender, PaintEventArgs e)\n        {\n            Graphics gr = e.Graphics;\n            gr.SmoothingMode = SmoothingMode.AntiAlias;\n\n            Header.Width = Width;\n            m_headerImage = IsExpanded ? m_collapseImage : m_expandImage;\n\n            if (m_headerImage != null)\n            {\n                m_offset = m_headerImage.Width + Pad;\n                gr.DrawImage(m_headerImage,\n                             new Rectangle(Pad, Header.Height / 2 - m_headerImage.Height / 2, m_headerImage.Width,\n                                           m_headerImage.Height));\n            }\n\n            using (StringFormat hCenteredStringFormat = new StringFormat())\n            {\n                hCenteredStringFormat.LineAlignment = StringAlignment.Center;\n\n                gr.DrawString(HeaderText, Font, Brushes.Black,\n                              new RectangleF(Pad + m_offset, 0, Header.Width - Pad * 4, Header.Height), hCenteredStringFormat);\n            }\n        }\n\n        #endregion\n\n\n        #region Private Properties\n\n        /// <summary>\n        /// Gets true if the Panel is expanded.\n        /// </summary>\n        private bool IsExpanded => m_panelState == PanelState.Expanded;\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the Header of the Panel.\n        /// </summary>\n        [Browsable(false)]\n        public NoFlickerPanel Header { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the expanded Height of the Panel.\n        /// </summary>\n        [Browsable(false)]\n        public int ExpandedHeight\n        {\n            get { return m_expandedHeight; }\n            set\n            {\n                m_expandedHeight = value;\n\n                // If we start collapsed we don't have to update the height\n                if (!IsExpanded && !ExpandedOnStartup)\n                    return;\n\n                Height = m_expandedHeight;\n                Refresh();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the Header text.\n        /// </summary>\n        [Description(\"The text to be shown in the header.\")]\n        public string HeaderText { get; set; }\n\n        /// <summary>\n        /// Gets or sets the image shown in the header when Panel is collapsed. Height must be less than HeaderHeight - 4 pixels. Null to disable it.\n        /// </summary>\n        [Description(\"The image used in the header when the Panel is collapsed.\")]\n        public Bitmap ImageExpand\n        {\n            get { return m_expandImage; }\n            set\n            {\n                if (value?.Height > Header.Height - 4)\n                    throw new ArgumentException(\"HeaderIcon: Height must be less than HeaderHeight - 4 pixels.\");\n\n                m_expandImage = value;\n                Header.Refresh();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the image shown in the header when Panel is expanded. Height must be less than HeaderHeight - 4 pixels. Null to disable it.\n        /// </summary>\n        [Description(\"The image used in the header when the Panel is expanded.\")]\n        public Bitmap ImageCollapse\n        {\n            get { return m_collapseImage; }\n            set\n            {\n                if (value?.Height > Header.Height - 4)\n                    throw new ArgumentException(\"HeaderIcon: Height must be less than HeaderHeight - 4 pixels.\");\n\n                m_collapseImage = value;\n                Header.Refresh();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the Expand/Collapse Speed.\n        /// </summary>\n        [Description(\"Set the Expand/Collapse Speed.\")]\n        public AnimationSpeed AnimationSpeed { get; set; }\n\n        /// <summary>\n        /// Gets or sets the Header's height of the Panel. Height must be between 30 and 50.\n        /// </summary>\n        [Description(\"Set the Header's height of the Panel. Height must be between 30 and 50.\")]\n        public int HeaderHeight\n        {\n            get { return Header.Height; }\n            set\n            {\n                if (value < 30 || value > 50)\n                    throw new ArgumentException(\"Height must be between 30 and 50.\");\n\n                Header.Height = value;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the direction of the Panel expansion.\n        /// </summary>\n        [Description(\"Set the direction of the Panel expansion.\")]\n        public Direction ExpandDirection { get; set; }\n\n        /// <summary>\n        /// Gets or sets  whether the Panel should start expanded.\n        /// </summary>\n        [Description(\"Indicates whether the Panel should start expanded.\")]\n        public bool ExpandedOnStartup { get; set; }\n\n        /// <summary>\n        /// Gets or sets whether the contextMenu should be shown by right-clicking on the header.\n        /// </summary>\n        [Description(\"Indicates whether the contextMenu should be shown by right-clicking on the header.\")]\n        public bool EnableContextMenu { get; set; }\n\n        #endregion\n\n\n        #region Expand/Collapse Methods\n\n        /// <summary>\n        /// Expands the Panel.\n        /// </summary>\n        private void ExpandPanel()\n        {\n            while (AnimationSpeed != AnimationSpeed.None && Height < m_expandedHeight - m_animationStep)\n            {\n                Height += m_animationStep;\n                Refresh();\n            }\n\n            Height = m_expandedHeight;\n            m_headerImage = m_collapseImage;\n            m_panelState = PanelState.Expanded;\n\n            Refresh();\n        }\n\n        /// <summary>\n        /// Collapses the Panel.\n        /// </summary>\n        private void CollapsePanel()\n        {\n            while (AnimationSpeed != AnimationSpeed.None && Height > Header.Height + m_animationStep)\n            {\n                Height -= m_animationStep;\n                Refresh();\n            }\n\n            Height = Header.Height;\n            m_headerImage = m_expandImage;\n            m_panelState = PanelState.Collapsed;\n\n            Refresh();\n        }\n\n        /// <summary>\n        /// Triggers the Panel to expand or collapse.\n        /// </summary>\n        private void SwitchStatus()\n        {\n            switch (m_panelState)\n            {\n                case PanelState.Collapsed:\n                    ExpandPanel();\n                    break;\n                case PanelState.Expanded:\n                    CollapsePanel();\n                    break;\n            }\n\n            UpdateContextMenu();\n        }\n\n        /// <summary>\n        /// Updates the context menu text.\n        /// </summary>\n        private void UpdateContextMenu()\n        {\n            m_tsmiExpandCollapse.Text = IsExpanded ? \"Collapse Panel\" : \"Expand Panel\";\n        }\n\n        /// <summary>\n        /// Updates the animation speed.\n        /// </summary>\n        private void UpdateAnimationSpeed()\n        {\n            switch (AnimationSpeed)\n            {\n                case AnimationSpeed.None:\n                    m_animationStep = ExpandedHeight;\n                    break;\n                case AnimationSpeed.High:\n                    m_animationStep = ExpandedHeight / 4;\n                    break;\n                case AnimationSpeed.Medium:\n                    m_animationStep = ExpandedHeight / 20;\n                    break;\n                case AnimationSpeed.Low:\n                    m_animationStep = 1;\n                    break;\n            }\n\n            // Set the check state of the appropriate AnimationSpeed menu item\n            if (EnableContextMenu)\n                SetAnimationSpeedContextMenuItemCheckState();\n        }\n\n        #endregion\n\n\n        #region ContextMenu Events\n\n        /// <summary>\n        /// Occurs when we click on an animation choice context menu item.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void animationSpeedSelect_Click(object sender, EventArgs e)\n        {\n            string choice = ((ToolStripItem)sender).Text;\n\n            switch (choice)\n            {\n                case \"None\":\n                    AnimationSpeed = AnimationSpeed.None;\n                    break;\n                case \"High\":\n                    AnimationSpeed = AnimationSpeed.High;\n                    break;\n                case \"Medium\":\n                    AnimationSpeed = AnimationSpeed.Medium;\n                    break;\n                case \"Low\":\n                    AnimationSpeed = AnimationSpeed.Low;\n                    break;\n            }\n\n            UpdateAnimationSpeed();\n        }\n\n        /// <summary>\n        /// Occurs when we click the Expand/Collapse context menu item.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void tsmiExpandCollapse_Click(object sender, EventArgs e)\n        {\n            SwitchStatus();\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// Updates the controls settings.\n        /// </summary>\n        protected override void OnCreateControl()\n        {\n            base.OnCreateControl();\n\n            // Set the expanded height of the panel according to the height set in the designer\n            // It can be set to a manual height by replacing \"Height\" with the number of your choice\n            m_expandedHeight = Height;\n\n            if (DesignMode)\n                return;\n\n            // Set the panel status for startup\n            m_animationStep = m_expandedHeight;\n            m_panelState = ExpandedOnStartup ? PanelState.Collapsed : PanelState.Expanded;\n            SwitchStatus();\n\n            // Set the animation speed\n            UpdateAnimationSpeed();\n        }\n\n        /// <summary>\n        /// Occurs on resizing the Panel.\n        /// </summary>\n        /// <remarks>Forces the Panel to redraw.</remarks>\n        /// <param name=\"e\"></param>\n        protected override void OnSizeChanged(EventArgs e)\n        {\n            base.OnSizeChanged(e);\n\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Occurs on a mouse click.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.Windows.Forms.MouseEventArgs\"/> instance containing the event data.</param>\n        public void OnMouseClick(object sender, MouseEventArgs e)\n        {\n            expandablePanelControl_MouseClick(sender, e);\n        }\n\n        /// <summary>\n        /// Occurs on a mouse click in the main Panel.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void expandablePanelControl_MouseClick(object sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Right)\n            {\n                if (!EnableContextMenu)\n                    return;\n\n                int x = e.X;\n                int y = e.Y;\n\n                if (sender != this)\n                {\n                    Control ctl = (Control)sender;\n                    x += ctl.Bounds.X;\n                    y += ctl.Bounds.Y;\n                }\n\n                m_contextMenuStrip.Enabled = EnableContextMenu;\n                m_contextMenuStrip.Show(this, new Point(x, y));\n                m_contextMenuStrip.BringToFront();\n                return;\n            }\n\n            SwitchStatus();\n        }\n\n        #endregion\n    }\n\n\n    #region Enumerations\n\n    /// <summary>\n    /// Enumerator for the status of the Panel.\n    /// </summary>\n    public enum PanelState\n    {\n        Expanded,\n        Collapsed\n    }\n\n    /// <summary>\n    /// Enumerator for the speed of the Expand/Collapse animation.\n    /// </summary>\n    public enum AnimationSpeed\n    {\n        None,\n        High,\n        Medium,\n        Low\n    }\n\n    /// <summary>\n    /// Enumerator for the direction of the expansion.\n    /// </summary>\n    public enum Direction\n    {\n        Up,\n        Down\n    }\n\n    #endregion\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/InfiniteDisplayToolTip.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// A wrapper around <see cref=\"ToolTip\"/> to use for infinite display.\n    /// </summary>\n    public class InfiniteDisplayToolTip : ToolTip\n    {\n        private readonly Control m_owner;\n        private readonly Timer m_initialDelayTimer;\n        private Point m_point;\n        private string m_text;\n\n        /// <summary>\n        /// Initializes <see cref=\"InfiniteDisplayToolTip\"/> instance.\n        /// </summary>\n        /// <param name=\"owner\">Owner of this tooltip</param>\n        public InfiniteDisplayToolTip(Control owner)\n        {\n            m_owner = owner;\n            m_initialDelayTimer = new Timer();\n            m_initialDelayTimer.Tick += m_initialDelayTimer_Tick;\n            m_initialDelayTimer.Interval = InitialDelay;\n            Disposed += OnDisposed;\n        }\n\n        /// <summary>\n        /// Called when disposed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            m_initialDelayTimer.Tick -= m_initialDelayTimer_Tick;\n            m_initialDelayTimer.Dispose();\n            Disposed -= OnDisposed;\n        }\n\n        /// <summary>\n        /// Diplays the tooltip on timer tick.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void m_initialDelayTimer_Tick(object sender, EventArgs e)\n        {\n            m_initialDelayTimer.Stop();\n            Show(m_text, m_owner, m_point);\n        }\n\n        /// <summary>\n        /// Popups a tool tip with provided text, at the given point.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"pt\">The pt.</param>\n        public void Show(string text, Point pt)\n        {\n            if (text == m_text)\n                return;\n\n            pt.Offset(0, 24);\n            m_point = pt;\n\n            Hide(m_owner);\n            m_text = text;\n            m_initialDelayTimer.Start();\n        }\n\n        /// <summary>\n        /// Hides a tooltip.\n        /// </summary>\n        public void Hide()\n        {\n            Hide(m_owner);\n            m_text = string.Empty;\n            m_initialDelayTimer.Stop();\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/IntuitiveDataGridView.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    public sealed class IntuitiveDataGridView : DataGridView\n    {\n        /// <summary>\n        /// Processes F2 and Enter correctly.\n        /// </summary>\n        /// <param name=\"keyData\"></param>\n        /// <returns></returns>\n        protected override bool ProcessDialogKey(Keys keyData)\n        {\n            Keys key = keyData & Keys.KeyCode;\n            if (key == Keys.Return)\n            {\n                if (!IsCurrentCellInEditMode)\n                    return ProcessF2Key(keyData);\n\n                DataGridViewCell currentCell = CurrentCell;\n                CurrentCell = null;\n                CurrentCell = currentCell;\n                EndEdit();\n                return true;\n            }\n            if (key == Keys.F2)\n            {\n                if (!IsCurrentCellInEditMode)\n                    return ProcessF2Key(keyData);\n\n                DataGridViewCell currentCell = CurrentCell;\n                CurrentCell = null;\n                CurrentCell = currentCell;\n                EndEdit();\n                return true;\n            }\n\n            return base.ProcessDialogKey(keyData);\n        }\n\n        /// <summary>\n        /// Processes F2 and Enter correctly.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        /// <returns></returns>\n        protected override bool ProcessDataGridViewKey(KeyEventArgs e)\n        {\n            if (e.KeyCode == Keys.Return && !IsCurrentCellInEditMode)\n                return ProcessF2Key(e.KeyData);\n\n            if (e.KeyCode == Keys.F2)\n                return !IsCurrentCellInEditMode ? ProcessF2Key(e.KeyData) : EndEdit();\n\n            return base.ProcessDataGridViewKey(e);\n        }\n\n        /// <summary>\n        /// When the user clicks the cell content, we begin editing.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnCellClick(DataGridViewCellEventArgs e)\n        {\n            base.OnCellClick(e);\n\n            if (e.ColumnIndex >= 0)\n                BeginEdit(true);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/ListViewDragEventArgs.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.Controls\n{\n    public class ListViewDragEventArgs : EventArgs\n    {\n        internal ListViewDragEventArgs(int from, int count, int to)\n        {\n            MovingFrom = from;\n            MovingCount = count;\n            MovingTo = to;\n        }\n\n        /// <summary>\n        /// Gets the moving from.\n        /// </summary>\n        /// <value>\n        /// The moving from.\n        /// </value>\n        public int MovingFrom { get; }\n\n        /// <summary>\n        /// Gets the moving count.\n        /// </summary>\n        /// <value>\n        /// The moving count.\n        /// </value>\n        public int MovingCount { get; }\n\n        /// <summary>\n        /// Gets the moving to.\n        /// </summary>\n        /// <value>\n        /// The moving to.\n        /// </value>\n        public int MovingTo { get; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"ListViewDragEventArgs\"/> is cancel.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if cancel; otherwise, <c>false</c>.\n        /// </value>\n        public bool Cancel { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/ListViewHelper.cs",
    "content": "using System;\nusing System.Windows.Forms;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// Contains helper methods to change extended styles on ListView, including enabling double buffering.\n    /// Based on Giovanni Montrone's article on <see cref=\"http://www.codeproject.com/KB/list/listviewxp.aspx\"/>\n    /// </summary>\n    public static class ListViewHelper\n    {\n        /// <summary>\n        /// Sets the extended style.\n        /// </summary>\n        /// <param name=\"control\">The control.</param>\n        /// <param name=\"exStyle\">The ex style.</param>\n        /// <exception cref=\"System.ArgumentNullException\">control</exception>\n        public static void SetExtendedStyle(Control control, ListViewExtendedStyles exStyle)\n        {\n            control.ThrowIfNull(nameof(control));\n\n            ListViewExtendedStyles styles =\n                (ListViewExtendedStyles)NativeMethods.SendMessage(control.Handle, (int)ListViewMessages.GetExtendedStyle,\n                                                                  IntPtr.Zero, IntPtr.Zero);\n            styles |= exStyle;\n            NativeMethods.SendMessage(control.Handle, (int)ListViewMessages.SetExtendedStyle, IntPtr.Zero, (IntPtr)styles);\n        }\n\n        /// <summary>\n        /// Enables the double buffer.\n        /// </summary>\n        /// <param name=\"control\">The control.</param>\n        /// <exception cref=\"System.ArgumentNullException\">control</exception>\n        public static void EnableDoubleBuffer(Control control)\n        {\n            control.ThrowIfNull(nameof(control));\n\n            // read current style\n            ListViewExtendedStyles styles =\n                (ListViewExtendedStyles)NativeMethods.SendMessage(control.Handle, (int)ListViewMessages.GetExtendedStyle,\n                                                                  IntPtr.Zero, IntPtr.Zero);\n\n            // enable double buffer and border select\n            styles |= ListViewExtendedStyles.DoubleBuffer | ListViewExtendedStyles.BorderSelect;\n            // write new style\n            NativeMethods.SendMessage(control.Handle, (int)ListViewMessages.SetExtendedStyle, IntPtr.Zero, (IntPtr)styles);\n        }\n\n        /// <summary>\n        /// Disables the double buffer.\n        /// </summary>\n        /// <param name=\"control\">The control.</param>\n        /// <exception cref=\"System.ArgumentNullException\">control</exception>\n        public static void DisableDoubleBuffer(Control control)\n        {\n            control.ThrowIfNull(nameof(control));\n\n            // read current style\n            ListViewExtendedStyles styles =\n                (ListViewExtendedStyles)NativeMethods.SendMessage(control.Handle, (int)ListViewMessages.GetExtendedStyle,\n                                                                  IntPtr.Zero, IntPtr.Zero);\n            // disable double buffer and border select\n            styles -= styles & ListViewExtendedStyles.DoubleBuffer;\n            styles -= styles & ListViewExtendedStyles.BorderSelect;\n            // write new style\n            NativeMethods.SendMessage(control.Handle, (int)ListViewMessages.SetExtendedStyle, IntPtr.Zero, (IntPtr)styles);\n        }\n\n        private enum ListViewMessages\n        {\n            First = 0x1000,\n            SetExtendedStyle = First + 54,\n            GetExtendedStyle = First + 55,\n        }\n    }\n\n    [Flags]\n    public enum ListViewExtendedStyles\n    {\n        /// <summary>\n        /// LVS_EX_GRIDLINES\n        /// </summary>\n        GridLines = 0x00000001,\n\n        /// <summary>\n        /// LVS_EX_SUBITEMIMAGES\n        /// </summary>\n        SubItemImages = 0x00000002,\n\n        /// <summary>\n        /// LVS_EX_CHECKBOXES\n        /// </summary>\n        CheckBoxes = 0x00000004,\n\n        /// <summary>\n        /// LVS_EX_TRACKSELECT\n        /// </summary>\n        TrackSelect = 0x00000008,\n\n        /// <summary>\n        /// LVS_EX_HEADERDRAGDROP\n        /// </summary>\n        HeaderDragDrop = 0x00000010,\n\n        /// <summary>\n        /// LVS_EX_FULLROWSELECT\n        /// </summary>\n        FullRowSelect = 0x00000020,\n\n        /// <summary>\n        /// LVS_EX_ONECLICKACTIVATE\n        /// </summary>\n        OneClickActivate = 0x00000040,\n\n        /// <summary>\n        /// LVS_EX_TWOCLICKACTIVATE\n        /// </summary>\n        TwoClickActivate = 0x00000080,\n\n        /// <summary>\n        /// LVS_EX_FLATSB\n        /// </summary>\n        FlatsB = 0x00000100,\n\n        /// <summary>\n        /// LVS_EX_REGIONAL\n        /// </summary>\n        Regional = 0x00000200,\n\n        /// <summary>\n        /// LVS_EX_INFOTIP\n        /// </summary>\n        InfoTip = 0x00000400,\n\n        /// <summary>\n        /// LVS_EX_UNDERLINEHOT\n        /// </summary>\n        UnderlineHot = 0x00000800,\n\n        /// <summary>\n        /// LVS_EX_UNDERLINECOLD\n        /// </summary>\n        UnderlineCold = 0x00001000,\n\n        /// <summary>\n        /// LVS_EX_MULTIWORKAREAS\n        /// </summary>\n        MultilWorkAreas = 0x00002000,\n\n        /// <summary>\n        /// LVS_EX_LABELTIP\n        /// </summary>\n        LabelTip = 0x00004000,\n\n        /// <summary>\n        /// LVS_EX_BORDERSELECT\n        /// </summary>\n        BorderSelect = 0x00008000,\n\n        /// <summary>\n        /// LVS_EX_DOUBLEBUFFER\n        /// </summary>\n        DoubleBuffer = 0x00010000,\n\n        /// <summary>\n        /// LVS_EX_HIDELABELS\n        /// </summary>\n        HideLabels = 0x00020000,\n\n        /// <summary>\n        /// LVS_EX_SINGLEROW\n        /// </summary>\n        SingleRow = 0x00040000,\n\n        /// <summary>\n        /// LVS_EX_SNAPTOGRID\n        /// </summary>\n        SnapToGrid = 0x00080000,\n\n        /// <summary>\n        /// LVS_EX_SIMPLESELECT\n        /// </summary>\n        SimpleSelect = 0x00100000\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/ListViewItemComparerByTag.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// Simple comparer for <see cref=\"ListViewItem\"/> relying on a <see cref=\"IComparer{T}\"/> for tags comparison. \n    /// For use with <see cref=\"ListView.ListViewItemSorter\"/>.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public sealed class ListViewItemComparerByTag<T> : IComparer\n    {\n        private readonly IComparer<T> m_comparer;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ListViewItemComparerByTag&lt;T&gt;\"/> class.\n        /// </summary>\n        /// <param name=\"comparer\">The tags comparer</param>\n        public ListViewItemComparerByTag(IComparer<T> comparer)\n        {\n            m_comparer = comparer;\n        }\n\n        /// <summary>\n        /// Comparer two <see cref=\"ListViewItem\"/>.\n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <returns></returns>\n        public int Compare(object x, object y)\n        {\n            ListViewItem itemX = (ListViewItem)x;\n            ListViewItem itemY = (ListViewItem)y;\n            T tagX = (T)itemX.Tag;\n            T tagY = (T)itemY.Tag;\n\n            return m_comparer.Compare(tagX, tagY);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/MessageBoxCustom.Designer.cs",
    "content": "﻿namespace EVEMon.Common.Controls\n{\n    partial class MessageBoxCustom\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.cbOption = new System.Windows.Forms.CheckBox();\n            this.button2 = new System.Windows.Forms.Button();\n            this.button1 = new System.Windows.Forms.Button();\n            this.panel1 = new System.Windows.Forms.Panel();\n            this.msgIcon = new System.Windows.Forms.PictureBox();\n            this.msgText = new System.Windows.Forms.Label();\n            this.panel2 = new System.Windows.Forms.Panel();\n            this.button3 = new System.Windows.Forms.Button();\n            this.panel3 = new System.Windows.Forms.Panel();\n            this.panel4 = new System.Windows.Forms.Panel();\n            this.panel1.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.msgIcon)).BeginInit();\n            this.panel2.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // cbOption\n            // \n            this.cbOption.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.cbOption.AutoSize = true;\n            this.cbOption.Location = new System.Drawing.Point(12, 19);\n            this.cbOption.Name = \"cbOption\";\n            this.cbOption.Size = new System.Drawing.Size(71, 17);\n            this.cbOption.TabIndex = 0;\n            this.cbOption.Text = \"<cbText>\";\n            this.cbOption.UseVisualStyleBackColor = true;\n            this.cbOption.CheckedChanged += new System.EventHandler(this.cbOption_CheckedChanged);\n            // \n            // button2\n            // \n            this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.button2.Location = new System.Drawing.Point(299, 9);\n            this.button2.Name = \"button2\";\n            this.button2.Size = new System.Drawing.Size(90, 27);\n            this.button2.TabIndex = 1;\n            this.button2.Text = \"button2\";\n            this.button2.UseVisualStyleBackColor = true;\n            // \n            // button1\n            // \n            this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.button1.Location = new System.Drawing.Point(395, 9);\n            this.button1.Name = \"button1\";\n            this.button1.Size = new System.Drawing.Size(90, 27);\n            this.button1.TabIndex = 2;\n            this.button1.Text = \"button1\";\n            this.button1.UseVisualStyleBackColor = true;\n            // \n            // panel1\n            // \n            this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.panel1.AutoSize = true;\n            this.panel1.BackColor = System.Drawing.SystemColors.Window;\n            this.panel1.Controls.Add(this.msgIcon);\n            this.panel1.Controls.Add(this.msgText);\n            this.panel1.Location = new System.Drawing.Point(0, 25);\n            this.panel1.Name = \"panel1\";\n            this.panel1.Size = new System.Drawing.Size(494, 65);\n            this.panel1.TabIndex = 5;\n            // \n            // msgIcon\n            // \n            this.msgIcon.Location = new System.Drawing.Point(27, 0);\n            this.msgIcon.Name = \"msgIcon\";\n            this.msgIcon.Size = new System.Drawing.Size(32, 32);\n            this.msgIcon.TabIndex = 2;\n            this.msgIcon.TabStop = false;\n            // \n            // msgText\n            // \n            this.msgText.AutoEllipsis = true;\n            this.msgText.AutoSize = true;\n            this.msgText.Location = new System.Drawing.Point(65, 0);\n            this.msgText.MaximumSize = new System.Drawing.Size(420, 0);\n            this.msgText.Name = \"msgText\";\n            this.msgText.Size = new System.Drawing.Size(62, 13);\n            this.msgText.TabIndex = 1;\n            this.msgText.Text = \"<Message>\";\n            this.msgText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // panel2\n            // \n            this.panel2.BackColor = System.Drawing.SystemColors.Control;\n            this.panel2.Controls.Add(this.button3);\n            this.panel2.Controls.Add(this.cbOption);\n            this.panel2.Controls.Add(this.button2);\n            this.panel2.Controls.Add(this.button1);\n            this.panel2.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.panel2.Location = new System.Drawing.Point(0, 115);\n            this.panel2.Name = \"panel2\";\n            this.panel2.Size = new System.Drawing.Size(494, 48);\n            this.panel2.TabIndex = 6;\n            // \n            // button3\n            // \n            this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.button3.Location = new System.Drawing.Point(203, 9);\n            this.button3.Name = \"button3\";\n            this.button3.Size = new System.Drawing.Size(90, 27);\n            this.button3.TabIndex = 3;\n            this.button3.Text = \"button3\";\n            this.button3.UseVisualStyleBackColor = true;\n            // \n            // panel3\n            // \n            this.panel3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.panel3.AutoSize = true;\n            this.panel3.Location = new System.Drawing.Point(0, 0);\n            this.panel3.Name = \"panel3\";\n            this.panel3.Size = new System.Drawing.Size(494, 25);\n            this.panel3.TabIndex = 7;\n            // \n            // panel4\n            // \n            this.panel4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.panel4.AutoSize = true;\n            this.panel4.Location = new System.Drawing.Point(0, 90);\n            this.panel4.Name = \"panel4\";\n            this.panel4.Size = new System.Drawing.Size(494, 25);\n            this.panel4.TabIndex = 8;\n            // \n            // MessageBoxCustom\n            //\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.BackColor = System.Drawing.SystemColors.Window;\n            this.ClientSize = new System.Drawing.Size(494, 163);\n            this.Controls.Add(this.panel2);\n            this.Controls.Add(this.panel1);\n            this.Controls.Add(this.panel4);\n            this.Controls.Add(this.panel3);\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"MessageBoxCustom\";\n            this.ShowIcon = false;\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"<Caption>\";\n            this.panel1.ResumeLayout(false);\n            this.panel1.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.msgIcon)).EndInit();\n            this.panel2.ResumeLayout(false);\n            this.panel2.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n\n        private System.Windows.Forms.CheckBox cbOption;\n        private System.Windows.Forms.PictureBox msgIcon;\n        private System.Windows.Forms.Label msgText;\n        private System.Windows.Forms.Button button1;\n        private System.Windows.Forms.Button button2;\n        private System.Windows.Forms.Button button3;\n        private System.Windows.Forms.Panel panel1;\n        private System.Windows.Forms.Panel panel2;\n        private System.Windows.Forms.Panel panel3;\n        private System.Windows.Forms.Panel panel4;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/MessageBoxCustom.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing EVEMon.Common.Factories;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// Class for a message box with integrated checkbox.\n    /// </summary>\n    public sealed partial class MessageBoxCustom : Form\n    {\n        private DialogResult m_dialogResult;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Creates a new instance of <see cref=\"MessageBoxCustom\"/>.\n        /// </summary>\n        public MessageBoxCustom()\n        {\n            InitializeComponent();\n\n            msgText.Font = FontFactory.GetFont(\"Segoe UI\", 9f);\n            cbOption.Font = FontFactory.GetFont(\"Segoe UI\", 9f);\n            button1.Font = FontFactory.GetFont(\"Segoe UI\", 9f);\n            button2.Font = FontFactory.GetFont(\"Segoe UI\", 9f);\n            button3.Font = FontFactory.GetFont(\"Segoe UI\", 9f);\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the button1.\n        /// </summary>\n        /// <value>The button1.</value>\n        public Button Button1 => button1;\n\n        public Button Button2 => button2;\n\n        public Button Button3 => button3;\n\n        public Label Message => msgText;\n\n        public PictureBox PictureBox => msgIcon;\n\n        public CheckBox CheckBox => cbOption;\n\n        /// <summary>\n        /// Gets a value indicating whether the checkbox is checked.\n        /// </summary>\n        /// <value><c>true</c> if the checkbox is checked; otherwise, <c>false</c>.</value>\n        public static bool CheckBoxChecked { get; private set; }\n\n        #endregion\n\n\n        #region Static Public Methods\n\n        /// <summary>\n        /// Displays a message box.\n        /// </summary>\n        /// <param name=\"owner\">The owner.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"caption\">The caption.</param>\n        /// <param name=\"cbText\">The cb text.</param>\n        /// <param name=\"buttons\">The buttons.</param>\n        /// <param name=\"icon\">The icon.</param>\n        /// <returns></returns>\n        public static DialogResult Show(IWin32Window owner, string text, string caption, string cbText,\n            MessageBoxButtons buttons = MessageBoxButtons.OK,\n            MessageBoxIcon icon = MessageBoxIcon.None)\n        {\n            using (MessageBoxCustom form = new MessageBoxCustom())\n            {\n                return form.ShowDialog(owner, text, caption, cbText, buttons, icon);\n            }\n        }\n\n        /// <summary>\n        /// Displays a message box.\n        /// </summary>\n        /// <param name=\"owner\">Owner window.</param>\n        /// <param name=\"text\">Text to display.</param>\n        /// <param name=\"caption\">Text to display in the title bar.</param>\n        /// <returns>One of the <see cref=\"DialogResult\"/> values.</returns>\n        public static DialogResult Show(IWin32Window owner, string text, string caption)\n            => Show(owner, text, caption, string.Empty);\n\n        /// <summary>\n        /// Displays a message box.\n        /// </summary>\n        /// <param name=\"owner\">Owner window.</param>\n        /// <param name=\"text\">Text to display.</param>\n        /// <returns>One of the <see cref=\"DialogResult\"/> values.</returns>\n        public static DialogResult Show(IWin32Window owner, string text) => Show(owner, text, string.Empty, string.Empty);\n\n        #endregion\n\n\n        # region Event Handlers\n\n        /// <summary>\n        /// Called when a button is clicked.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnButtonClick(object sender, EventArgs e)\n        {\n            ButtonBase button = sender as Button;\n\n            if (button == null)\n                return;\n\n            m_dialogResult = GetDialogResult(button.Text);\n            Close();\n        }\n\n        /// <summary>\n        /// Handles the CheckedChanged event of the cbOption control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void cbOption_CheckedChanged(object sender, EventArgs e)\n        {\n            CheckBoxChecked = cbOption.Checked;\n        }\n\n        # endregion\n\n\n        # region Help Methods\n\n        /// <summary>\n        /// Displays a message box.\n        /// </summary>\n        /// <param name=\"owner\">Owner window.</param>\n        /// <param name=\"text\">Text to display.</param>\n        /// <param name=\"caption\">Text to display in the title bar.</param>\n        /// <param name=\"cbText\">Text to display near check box.</param>\n        /// <param name=\"buttons\">Buttons to display in the message box.</param>\n        /// <param name=\"icon\">Icon to display in the mesage box.</param>\n        /// <returns>One of the <see cref=\"DialogResult\"/> values.</returns>\n        private DialogResult ShowDialog(IWin32Window owner, string text, string caption, string cbText,\n            MessageBoxButtons buttons = MessageBoxButtons.OK,\n            MessageBoxIcon icon = MessageBoxIcon.None)\n        {\n            button1.Click += OnButtonClick;\n            button2.Click += OnButtonClick;\n            button3.Click += OnButtonClick;\n\n            Text = caption;\n            msgText.Text = text;\n            cbOption.Text = cbText;\n\n            if (Environment.OSVersion.Platform == PlatformID.Win32NT)\n            {\n                NativeMethods.EnableMenuItem(NativeMethods.GetSystemMenu(Handle, false),\n                    NativeMethods.SC_CLOSE, NativeMethods.MF_BYCOMMAND | NativeMethods.MF_GRAYED);\n            }\n            else\n                ControlBox = false;\n\n            SetButtonsToDisplay(buttons);\n\n            SetIconToDisplay(icon);\n\n            MessageBeep(icon);\n\n            ShowDialog(owner);\n\n            return m_dialogResult;\n        }\n\n        /// <summary>\n        /// Sets buttons for the message box.\n        /// </summary>\n        /// <param name=\"buttons\">Which buttons to display.</param>\n        private void SetButtonsToDisplay(MessageBoxButtons buttons)\n        {\n            AcceptButton = button2;\n\n            switch (buttons)\n            {\n                case MessageBoxButtons.AbortRetryIgnore:\n                    button3.Text = \"Ignore\";\n                    button2.Text = \"Retry\";\n                    button1.Text = \"Abort\";\n                    break;\n                case MessageBoxButtons.OK:\n                    button3.Visible = false;\n                    button2.Visible = false;\n                    button1.Text = \"OK\";\n                    AcceptButton = button1;\n                    break;\n                case MessageBoxButtons.OKCancel:\n                    button3.Visible = false;\n                    button2.Text = \"OK\";\n                    button1.Text = \"Cancel\";\n                    break;\n                case MessageBoxButtons.RetryCancel:\n                    button3.Visible = false;\n                    button2.Text = \"Retry\";\n                    button1.Text = \"Cancel\";\n                    break;\n                case MessageBoxButtons.YesNo:\n                    button3.Visible = false;\n                    button2.Text = \"Yes\";\n                    button1.Text = \"No\";\n                    break;\n                case MessageBoxButtons.YesNoCancel:\n                    button3.Text = \"Yes\";\n                    button2.Text = \"No\";\n                    button1.Text = \"Cancel\";\n                    AcceptButton = button3;\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Sets icon for the message box.\n        /// </summary>\n        /// <param name=\"icon\">Icon type.</param>\n        private void SetIconToDisplay(MessageBoxIcon icon)\n        {\n            switch (icon.GetHashCode())\n            {\n                case 0:\n                    break;\n                case 16:\n                    msgIcon.Image = SystemIcons.Hand.ToBitmap();\n                    break;\n                case 32:\n                    msgIcon.Image = SystemIcons.Question.ToBitmap();\n                    break;\n                case 48:\n                    msgIcon.Image = SystemIcons.Exclamation.ToBitmap();\n                    break;\n                case 64:\n                    msgIcon.Image = SystemIcons.Asterisk.ToBitmap();\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Plays one of the system message beeps.\n        /// </summary>\n        /// <param name=\"icon\">Sound type to play.</param>\n        private static void MessageBeep(MessageBoxIcon icon)\n        {\n            switch (icon.GetHashCode())\n            {\n                case 0:\n                    System.Media.SystemSounds.Beep.Play();\n                    break;\n\n                case 16:\n                    System.Media.SystemSounds.Hand.Play();\n                    break;\n\n                case 32:\n                    System.Media.SystemSounds.Question.Play();\n                    break;\n\n                case 48:\n                    System.Media.SystemSounds.Exclamation.Play();\n                    break;\n\n                case 64:\n                    System.Media.SystemSounds.Asterisk.Play();\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Returns dialog result based on button text.\n        /// </summary>\n        /// <param name=\"buttonText\">Text on selected button.</param>\n        /// <returns>Corresponding <see cref=\"DialogResult\"/>.</returns>\n        private static DialogResult GetDialogResult(string buttonText)\n        {\n            switch (buttonText)\n            {\n                case \"Abort\":\n                    return DialogResult.Abort;\n                case \"Cancel\":\n                    return DialogResult.Cancel;\n                case \"Ignore\":\n                    return DialogResult.Ignore;\n                case \"No\":\n                    return DialogResult.No;\n                case \"OK\":\n                    return DialogResult.OK;\n                case \"Retry\":\n                    return DialogResult.Retry;\n                case \"Yes\":\n                    return DialogResult.Yes;\n                default:\n                    return DialogResult.None;\n            }\n        }\n\n        # endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/MessageBoxCustom.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Controls/MultiPanel/Design/MultiPanelDesigner.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.ComponentModel.Design;\nusing System.Windows.Forms;\nusing System.Windows.Forms.Design;\n\nnamespace EVEMon.Common.Controls.MultiPanel.Design\n{\n    /// <summary>\n    /// A designer hosting a <see cref=\"MultiPanel\"/>.\n    /// </summary>\n    /// <remarks>\n    /// Based on the work from Liron Levi on Code Project, under public domain. \n    /// See http://www.codeproject.com/KB/cs/multipanelcontrol.aspx\n    /// </remarks>\n    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = \"FullTrust\")]\n    public class MultiPanelDesigner : ParentControlDesigner\n    {\n        private MultiPanel m_panel;\n\n        /// <summary>\n        /// Overridden. Gets the collection of verbs that are available to this designer.\n        /// </summary>\n        public override DesignerVerbCollection Verbs\n        {\n            get\n            {\n                IDesignerHost host = (IDesignerHost)GetService(typeof(IDesignerHost));\n                return MultiPanelDesignerHelper.GetDesignerVerbs(host, m_panel);\n            }\n        }\n\n        /// <summary>\n        /// Overriden. Gets the collection of components associated with the component managed by the designer.\n        /// </summary>\n        public override ICollection AssociatedComponents => m_panel.Controls;\n\n        /// <summary>\n        /// Initializes the components\n        /// </summary>\n        /// <param name=\"component\"></param>\n        public override void Initialize(IComponent component)\n        {\n            // Should not happen\n            m_panel = component as MultiPanel;\n            if (m_panel == null)\n            {\n                DisplayError(\n                    new ArgumentException(\n                        \"Tried to use the MultiPanelControlDesign with a class that does not inherit from MultiPanel.\",\n                        \"component\"));\n                return;\n            }\n\n            m_panel.SelectionChange += OnPanelSelectionChange;\n            base.Initialize(component);\n\n            // Subscribe events \n            IComponentChangeService componentChangeService =\n                (IComponentChangeService)GetService(typeof(IComponentChangeService));\n            if (componentChangeService != null)\n                componentChangeService.ComponentRemoved += OnComponentRemoved;\n\n            ISelectionService selectionService = (ISelectionService)GetService(typeof(ISelectionService));\n            if (selectionService != null)\n                selectionService.SelectionChanged += OnServiceSelectionChanged;\n        }\n\n        /// <summary>\n        /// Overridden. Inherited from <see cref=\"IDesigner.DoDefaultAction()\"/>.\n        /// </summary>\n        public override void DoDefaultAction()\n        {\n        }\n\n        /// <summary>\n        /// Prevents the user to add anything else than MultiPanelPages to this control.\n        /// </summary>\n        /// <param name=\"control\"></param>\n        /// <returns></returns>\n        public override bool CanParent(Control control) => control is MultiPanelPage && !Control.Contains(control);\n\n\n        #region Private Methods\n\n        /// <summary>\n        /// Occurs when the service's selection changes.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnServiceSelectionChanged(object sender, EventArgs e)\n        {\n            ISelectionService service = (ISelectionService)GetService(typeof(ISelectionService));\n\n            if (service?.PrimarySelection == null)\n                return;\n\n            MultiPanelPage page = GetMultiPanelPage((Control)service.PrimarySelection);\n\n            if (page != null)\n                m_panel.SelectedPage = page;\n        }\n\n        /// <summary>\n        /// When the panel's selection change, notify to the designer the property changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"args\"></param>\n        private void OnPanelSelectionChange(object sender, MultiPanelSelectionChangeEventArgs args)\n        {\n            RaiseComponentChanging(TypeDescriptor.GetProperties(Control)[\"SelectedPage\"]);\n            RaiseComponentChanged(TypeDescriptor.GetProperties(Control)[\"SelectedPage\"], args.OldPage, args.NewPage);\n        }\n\n        /// <summary>\n        /// Occurs when a component has been removed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"cea\"></param>\n        private static void OnComponentRemoved(object sender, ComponentEventArgs cea)\n        {\n        }\n\n        /// <summary>\n        /// Return the page hosting the provided control, or the control itself it it is a page. If the matching page is not bound to this represented panel, returns null.\n        /// </summary>\n        /// <param name=\"ctrl\"></param>\n        /// <returns></returns>\n        private MultiPanelPage GetMultiPanelPage(Control ctrl)\n        {\n            while (true)\n            {\n                // If the control is a page, return it if the parent is the represented panel, null otherwise.\n                MultiPanelPage page = ctrl as MultiPanelPage;\n\n                if (page != null)\n                    return ReferenceEquals(m_panel, page.Parent) ? page : null;\n\n                // If the control has a parent, browser its ancestry\n                if (ctrl.Parent == null)\n                    return null;\n\n                ctrl = ctrl.Parent;\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/MultiPanel/Design/MultiPanelDesignerHelper.cs",
    "content": "﻿using System.ComponentModel.Design;\nusing System.Linq;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls.MultiPanel.Design\n{\n    public static class MultiPanelDesignerHelper\n    {\n        /// <summary>\n        /// Gets the collection of verbs displayed in the top right menu of the designer.\n        /// </summary>\n        /// <param name=\"host\"></param>\n        /// <param name=\"panel\"></param>\n        /// <returns></returns>\n        public static DesignerVerbCollection GetDesignerVerbs(IDesignerHost host, MultiPanel panel)\n        {\n            DesignerVerbCollection verbs = new DesignerVerbCollection\n                                               {\n                                                   new DesignerVerb(\"Add Page\", (sender, args) => AddPage(host, panel)),\n                                                   new DesignerVerb(\"Remove Page\", (sender, args) => RemovePage(host, panel))\n                                               };\n\n            foreach (MultiPanelPage page in panel.Controls)\n            {\n                MultiPanelPage pageCopy = page;\n                verbs.Add(new DesignerVerb(\"Select \\\"\" + page.Text + \"\\\"\", (sender, args) => SelectPage(host, panel, pageCopy)));\n            }\n\n            return verbs;\n        }\n\n        /// <summary>\n        /// Event handler for the \"Add Page\" verb.\n        /// </summary>\n        /// <param name=\"dh\"></param>\n        /// <param name=\"panel\"></param>\n        private static void AddPage(IDesignerHost dh, MultiPanel panel)\n        {\n            DesignerTransaction dt = dh.CreateTransaction(\"Added new page\");\n\n            // Gets a free name\n            int i = 1;\n            while (panel.Controls.Cast<Control>().Any(x => x.Name == \"Page\" + i))\n            {\n                i++;\n            }\n            string name = \"Page\" + i;\n\n            // Creates the page\n            MultiPanelPage newPage = dh.CreateComponent(typeof(MultiPanelPage), name) as MultiPanelPage;\n            if (newPage != null)\n            {\n                newPage.Text = name;\n                panel.Controls.Add(newPage);\n\n                // Update selection\n                panel.SelectedPage = newPage;\n            }\n\n            dt.Commit();\n        }\n\n        /// <summary>\n        /// Event handler for the \"Remove Tab\" verb.\n        /// </summary>\n        /// <param name=\"dh\"></param>\n        /// <param name=\"panel\"></param>\n        private static void RemovePage(IDesignerHost dh, MultiPanel panel)\n        {\n            MultiPanelPage page = panel.SelectedPage;\n            if (page == null)\n                return;\n\n            DesignerTransaction dt = dh.CreateTransaction(\"Removed page\");\n\n            panel.Controls.Remove(page);\n            dh.DestroyComponent(page);\n\n            panel.SelectedPage = panel.Controls.Count > 0 ? (MultiPanelPage)panel.Controls[0] : null;\n\n            dt.Commit();\n        }\n\n        /// <summary>\n        /// Event handler for the \"Select X page\" handler.\n        /// </summary>\n        /// <param name=\"dh\"></param>\n        /// <param name=\"panel\"></param>\n        /// <param name=\"page\"></param>\n        /// <returns></returns>\n        private static void SelectPage(IDesignerHost dh, MultiPanel panel, MultiPanelPage page)\n        {\n            DesignerTransaction dt = dh.CreateTransaction(\"Selected page\");\n\n            panel.SelectedPage = page;\n            dt.Commit();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/MultiPanel/Design/MultiPanelPageDesigner.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.ComponentModel.Design;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing System.Windows.Forms.Design;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Controls.MultiPanel.Design\n{\n    /// <summary>\n    /// A designer hosting a page of the <see cref=\"MultiPanel\"/> control.\n    /// </summary>\n    /// <remarks>\n    /// Based on the work from Liron Levi on Code Project, under public domain. \n    /// See http://www.codeproject.com/KB/cs/multipanelcontrol.aspx\n    /// </remarks>\n    public class MultiPanelPageDesigner : ScrollableControlDesigner\n    {\n        private MultiPanelPage m_page;\n        private readonly Font m_font = new Font(\"Courier New\", 8F, FontStyle.Bold);\n\n        private readonly StringFormat m_rightFormat =\n            new StringFormat(StringFormatFlags.NoWrap | StringFormatFlags.DirectionRightToLeft);\n\n        /// <summary>\n        /// Overridden. Initializes the component.\n        /// </summary>\n        /// <param name=\"component\">The <see cref=\"IComponent\"/> hosted by the designer.</param>\n        public override void Initialize(IComponent component)\n        {\n            // Should not happen.\n            m_page = component as MultiPanelPage;\n            if (m_page == null)\n            {\n                DisplayError(\n                    new InvalidOperationException(\n                        \"You attempted to use a MultiPanelPageDesigner with a class that does not inherit from MultiPanelPage.\"));\n            }\n\n            base.Initialize(component);\n        }\n\n        /// <summary>\n        /// Prevents the user to assign this page to anything else than a MultiPanel.\n        /// </summary>\n        /// <param name=\"parentDesigner\"></param>\n        /// <returns></returns>\n        public override bool CanBeParentedTo(IDesigner parentDesigner) => (parentDesigner != null) && parentDesigner.Component is MultiPanel;\n\n        /// <summary>\n        /// Gets or sets the <see cref=\"MultiPanelPage.Text\"/> property of the represented designer.\n        /// </summary>\n        [Category(\"Design\")]\n        [Description(\"The text identifying the page.\")]\n        public string Text\n        {\n            get { return m_page.Text; }\n            set\n            {\n                m_page.Text = value;\n\n                IComponentChangeService service = GetService(typeof(IComponentChangeService)) as IComponentChangeService;\n                if (service == null)\n                    return;\n\n                MultiPanel panel = m_page.Parent as MultiPanel;\n                panel?.Refresh();\n            }\n        }\n\n        /// <summary>\n        /// Overridden. Gets the collection of verbs that are available to this designer.\n        /// </summary>\n        public override DesignerVerbCollection Verbs\n        {\n            get\n            {\n                IDesignerHost host = (IDesignerHost)GetService(typeof(IDesignerHost));\n                MultiPanel panel = (MultiPanel)m_page.Parent;\n                return MultiPanelDesignerHelper.GetDesignerVerbs(host, panel);\n            }\n        }\n\n        /// <summary>\n        /// Overridden. Paint the adornments on the four corners.\n        /// </summary>\n        /// <param name=\"pea\">\n        /// Some <see cref=\"PaintEventArgs\"/>.\n        /// </param>\n        protected override void OnPaintAdornments(PaintEventArgs pea)\n        {\n            base.OnPaintAdornments(pea);\n\n            // My thanks to bschurter (Bruce), CodeProject member #1255339 for this!\n            using (Pen p = new Pen(SystemColors.ControlDark, 1))\n            {\n                p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;\n                pea.Graphics.DrawRectangle(p, 0, 0, m_page.Width - 1, m_page.Height - 1);\n            }\n\n            using (Brush b = new SolidBrush(Color.FromArgb(100, Color.Black)))\n            {\n                float fh = m_font.GetHeight(pea.Graphics);\n                RectangleF tleft = new RectangleF(0, 0, (float)m_page.Width / 2, fh);\n                RectangleF bleft = new RectangleF(0, m_page.Height - fh, (float)m_page.Width / 2, fh);\n                RectangleF tright = new RectangleF((float)m_page.Width / 2, 0, (float)m_page.Width / 2, fh);\n                RectangleF bright = new RectangleF((float)m_page.Width / 2, m_page.Height - fh, (float)m_page.Width / 2, fh);\n                pea.Graphics.DrawString(m_page.Text, m_font, b, tleft);\n                pea.Graphics.DrawString(m_page.Text, m_font, b, bleft);\n                pea.Graphics.DrawString(m_page.Text, m_font, b, tright, m_rightFormat);\n                pea.Graphics.DrawString(m_page.Text, m_font, b, bright, m_rightFormat);\n            }\n        }\n\n        /// <summary>\n        /// Overridden. Adds properties to or removes properties from the Properties grid in a design host at design time\n        /// or provides new design-time properties that might correspond to properties on the associated control.\n        /// </summary>\n        /// <param name=\"properties\">The original properties dictionary.</param>\n        /// <exception cref=\"System.ArgumentNullException\">properties</exception>\n        protected override void PreFilterProperties(IDictionary properties)\n        {\n            properties.ThrowIfNull(nameof(properties));\n\n            base.PreFilterProperties(properties);\n            properties[\"Text\"] = TypeDescriptor.CreateProperty(typeof(MultiPanelPageDesigner),\n                                                               (PropertyDescriptor)properties[\"Text\"], new Attribute[0]);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/MultiPanel/Design/MultiPanelSelectionEditor.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.ComponentModel.Design;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Controls.MultiPanel.Design\n{\n    /// <summary>\n    /// The editor for selecting the selected page property of the <see cref=\"MultiPanel\"/>.\n    /// </summary>\n    internal class MultiPanelSelectionEditor : ObjectSelectorEditor\n    {\n        /// <summary>\n        /// Main method.\n        /// </summary>\n        /// <param name=\"selector\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"provider\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">selector or context or provider</exception>\n        protected override void FillTreeWithData(Selector selector, ITypeDescriptorContext context, IServiceProvider provider)\n        {\n            selector.ThrowIfNull(nameof(selector));\n\n            context.ThrowIfNull(nameof(context));\n\n            provider.ThrowIfNull(nameof(provider));\n\n            // Base method, clear the selector\n            base.FillTreeWithData(selector, context, provider);\n\n            // Scroll through the pages\n            MultiPanel panel = (MultiPanel)context.Instance;\n            foreach (MultiPanelPage page in panel.Controls)\n            {\n                SelectorNode node = new SelectorNode(page.Name, page);\n                selector.Nodes.Add(node);\n\n                if (page != panel.SelectedPage)\n                    continue;\n\n                selector.SelectedNode = node;\n                return;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/MultiPanel/MultiPanel.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Drawing.Design;\nusing System.Windows.Forms;\nusing EVEMon.Common.Controls.MultiPanel.Design;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Controls.MultiPanel\n{\n    /// <summary>\n    /// A panel with multiple pages that can be switched.\n    /// </summary>\n    /// <remarks>\n    /// Based on the work from Liron Levi on Code Project, under public domain. \n    /// See http://www.codeproject.com/KB/cs/multipanelcontrol.aspx\n    /// </remarks>\n    [Designer(typeof(MultiPanelDesigner))]\n    public class MultiPanel : Panel\n    {\n        public event EventHandler<MultiPanelSelectionChangeEventArgs> SelectionChange;\n\n        private MultiPanelPage m_selectedPage;\n\n        /// <summary>\n        /// Gets or sets the selected page.\n        /// </summary>\n        [Category(\"Appearance\")]\n        [Description(\"The selected page.\")]\n        [Editor(typeof(MultiPanelSelectionEditor), typeof(UITypeEditor))]\n        public MultiPanelPage SelectedPage\n        {\n            get { return m_selectedPage; }\n            set\n            {\n                if (m_selectedPage == value)\n                    return;\n\n                MultiPanelPage oldPage = m_selectedPage;\n                m_selectedPage = value;\n\n                foreach (Control child in Controls)\n                {\n                    child.Visible = ReferenceEquals(child, m_selectedPage);\n                }\n\n                SelectionChange?.ThreadSafeInvoke(null, new MultiPanelSelectionChangeEventArgs(oldPage, value));\n            }\n        }\n\n        /// <summary>\n        /// Repaint the panel.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            Graphics g = e.Graphics;\n\n            using (SolidBrush br = new SolidBrush(BackColor))\n            {\n                g.FillRectangle(br, ClientRectangle);\n            }\n        }\n\n        /// <summary>\n        /// Overriden. Creates the underlying controls collection.\n        /// </summary>\n        /// <returns></returns>\n        protected override ControlCollection CreateControlsInstance() => new MultiPanelPagesCollection(this);\n\n\n        #region MultiPanelPagesCollection\n\n        /// <summary>\n        /// A collection of pages for the <see cref=\"MultiPanel\"/> control.\n        /// </summary>\n        /// <remarks>\n        /// Based on the work from Liron Levi on Code Project, under public domain. \n        /// See http://www.codeproject.com/KB/cs/multipanelcontrol.aspx\n        /// </remarks>\n        private sealed class MultiPanelPagesCollection : ControlCollection\n        {\n            private readonly MultiPanel m_owner;\n\n            /// <summary>\n            /// Constructor.\n            /// </summary>\n            /// <param name=\"owner\">A <see cref=\"T:System.Windows.Forms.Control\" /> representing the control that owns the control collection.</param>\n            /// <exception cref=\"System.ArgumentException\">Tried to create a MultiPanelPagesCollection with a non-MultiPanel owner.;owner</exception>\n            /// <exception cref=\"System.ArgumentNullException\">owner</exception>\n            public MultiPanelPagesCollection(Control owner)\n                : base(owner)\n            {\n                owner.ThrowIfNull(nameof(owner), \"Tried to create a MultiPanelPagesCollection with a null owner.\");\n\n                m_owner = owner as MultiPanel;\n                if (m_owner == null)\n                {\n                    throw new ArgumentException(\"Tried to create a MultiPanelPagesCollection with a non-MultiPanel owner.\",\n                        \"owner\");\n                }\n            }\n\n            /// <summary>\n            /// Adds a page.\n            /// </summary>\n            /// <param name=\"value\">The <see cref=\"T:System.Windows.Forms.Control\" /> to add to the control collection.</param>\n            /// <exception cref=\"System.ArgumentNullException\">value</exception>\n            /// <exception cref=\"System.ArgumentException\">Tried to add a non-MultiPanelPage control to the MultiPanelPagesCollection;value</exception>\n            public override void Add(Control value)\n            {\n                value.ThrowIfNull(nameof(value), \"Tried to add a null value to the MultiPanelPagesCollection.\");\n\n                MultiPanelPage p = value as MultiPanelPage;\n                if (p == null)\n                {\n                    throw new ArgumentException(\"Tried to add a non-MultiPanelPage control to the MultiPanelPagesCollection\",\n                        \"value\");\n                }\n\n                p.SendToBack();\n                base.Add(p);\n            }\n\n            /// <summary>\n            /// Adds an array of pages\n            /// </summary>\n            /// <param name=\"controls\"></param>\n            /// <exception cref=\"System.ArgumentNullException\">controls</exception>\n            public override void AddRange(Control[] controls)\n            {\n                controls.ThrowIfNull(nameof(controls));\n\n                foreach (MultiPanelPage p in controls)\n                {\n                    Add(p);\n                }\n            }\n\n            /// <summary>\n            /// Retrieves the index of the page with the given key.\n            /// </summary>\n            /// <param name=\"key\"></param>\n            /// <returns></returns>\n            public override int IndexOfKey(string key)\n            {\n                Control ctrl = base[key];\n                return GetChildIndex(ctrl);\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/MultiPanel/MultiPanelPage.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Windows.Forms;\nusing EVEMon.Common.Controls.MultiPanel.Design;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Controls.MultiPanel\n{\n    /// <summary>\n    /// A page of the <see cref=\"MultiPanel\"/> control.\n    /// </summary>\n    /// <remarks>\n    /// Based on the work from Liron Levi on Code Project, under public domain. \n    /// See http://www.codeproject.com/KB/cs/multipanelcontrol.aspx\n    /// </remarks>\n    [Designer(typeof(MultiPanelPageDesigner))]\n    public class MultiPanelPage : ContainerControl\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public MultiPanelPage()\n        {\n            base.Dock = DockStyle.Fill;\n        }\n\n        /// <summary>\n        /// Gets <see cref=\"DockStyle.Fill\"/>. Sets is available but always set <see cref=\"DockStyle.Fill\"/>.\n        /// </summary>\n        public override DockStyle Dock\n        {\n            get { return base.Dock; }\n            set { base.Dock = DockStyle.Fill; }\n        }\n\n        /// <summary>\n        /// Only here so that it shows up in the property panel.\n        /// </summary>\n        [Category(\"Design\")]\n        [Description(\"The text identifying the page.\")]\n        public override string Text\n        {\n            get { return base.Text; }\n            set { base.Text = value; }\n        }\n\n        /// <summary>\n        /// Overriden. Creates the underlying controls collection.\n        /// </summary>\n        /// <returns>A <see cref=\"MultiPanelPage.ControlCollection\"/>.</returns>\n        protected override ControlCollection CreateControlsInstance() => new PageControlCollection(this);\n\n\n        #region ControlCollection\n\n        /// <summary>\n        /// A control collection when ensures only <see cref=\"MultiPanelPage\"/> are added.\n        /// </summary>\n        private sealed class PageControlCollection : ControlCollection\n        {\n            /// <summary>\n            /// Constructor.\n            /// </summary>\n            /// <param name=\"owner\">A <see cref=\"T:System.Windows.Forms.Control\" /> representing the control that owns the control collection.</param>\n            /// <exception cref=\"System.ArgumentException\">Tried to create a MultiPanelPage.ControlCollection with a non-MultiPanelPage owner.;owner</exception>\n            /// <exception cref=\"System.ArgumentNullException\">owner</exception>\n            public PageControlCollection(Control owner)\n                : base(owner)\n            {\n                // Should not happen\n                owner.ThrowIfNull(nameof(owner), \"Tried to create a MultiPanelPage.ControlCollection with a null owner.\");\n\n                // Should not happen\n                MultiPanelPage c = owner as MultiPanelPage;\n                if (c == null)\n                {\n                    throw new ArgumentException(\n                        @\"Tried to create a MultiPanelPage.ControlCollection with a non-MultiPanelPage owner.\", nameof(owner));\n                }\n            }\n\n            /// <summary>\n            /// Adds an item to the control. Ensures it is a <see cref=\"MultiPanelPage\" />.\n            /// </summary>\n            /// <param name=\"value\">The <see cref=\"T:System.Windows.Forms.Control\" /> to add to the control collection.</param>\n            /// <exception cref=\"System.ArgumentException\">Tried to add a MultiPanelPage control to the MultiPanelPage.ControlCollection.;value</exception>\n            /// <exception cref=\"System.ArgumentNullException\">value</exception>\n            public override void Add(Control value)\n            {\n                value.ThrowIfNull(nameof(value), \"Tried to add a null value to the MultiPanelPage.ControlCollection.\");\n\n                MultiPanelPage p = value as MultiPanelPage;\n                if (p != null)\n                {\n                    throw new ArgumentException(\"Tried to add a MultiPanelPage control to the MultiPanelPage.ControlCollection.\",\n                        \"value\");\n                }\n\n                base.Add(value);\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/MultiPanel/MultiPanelSelectionChangeEventArgs.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.Controls.MultiPanel\n{\n    /// <summary>\n    /// Argument for the <see cref=\"MultiPanel.SelectionChange\"/> event.\n    /// </summary>\n    public sealed class MultiPanelSelectionChangeEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"oldPage\"></param>\n        /// <param name=\"newPage\"></param>\n        public MultiPanelSelectionChangeEventArgs(MultiPanelPage oldPage, MultiPanelPage newPage)\n        {\n            OldPage = oldPage;\n            NewPage = newPage;\n        }\n\n        /// <summary>\n        /// Gets the old selection.\n        /// </summary>\n        public MultiPanelPage OldPage { get; }\n\n        /// <summary>\n        /// Gets the new selection.\n        /// </summary>\n        public MultiPanelPage NewPage { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/NativeMethods.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Runtime.InteropServices;\nusing System.Windows.Forms;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Controls\n{\n    public static class NativeMethods\n    {\n        private const int HWND_TOPMOST = -1;\n        private const int GWL_STYLE = -16;\n        public const uint SWP_NOSIZE = 0x0001;\n        public const uint SWP_NOMOVE = 0x0002;\n        private const uint SW_SHOWNOACTIVATE = 0x0004;\n        private const uint SWP_NOACTIVATE = 0x0010;\n        private const uint SRCCOPY = 0x00CC0020;\n        private const uint WS_VSCROLL = 0x200000;\n        private const uint WS_HSCROLL = 0x100000;\n\n        internal const int WM_NULL = 0x0000;\n        internal const int WM_SETREDRAW = 0x000B;\n        internal const int WM_ERASEBKGND = 0x0014;\n        internal const int WM_POINTERDOWN = 0x0246;\n        internal const int WM_POINTERUP = 0x0247;\n\n        internal const int PT_POINTER = 0x00000001;\n        internal const int PT_TOUCH = 0x00000002;\n        internal const int PT_PEN = 0x00000003;\n        internal const int PT_MOUSE = 0x00000004;\n        internal const uint PT_POINTERID_MASK = 0x0000FFFF;\n\n        [DllImport(\"psapi.dll\", CharSet = CharSet.Auto)]\n        [return: MarshalAs(UnmanagedType.Bool)]\n        internal static extern bool EmptyWorkingSet(IntPtr proc);\n\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto)]\n        internal static extern IntPtr SendMessage(IntPtr handle, int messg, IntPtr wparam, IntPtr lparam);\n\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto)]\n        internal static extern IntPtr LoadCursorFromFile(string fileName);\n\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto)]\n        [return: MarshalAs(UnmanagedType.Bool)]\n        private static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y,\n            int cx, int cy, uint uFlags);\n\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto)]\n        [return: MarshalAs(UnmanagedType.Bool)]\n        private static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);\n\n        [DllImport(\"user32.dll\", SetLastError = true)]\n        private static extern uint GetWindowLong(IntPtr hWnd, int nIndex);\n\n        [DllImport(\"gdi32.dll\", CharSet = CharSet.Auto)]\n        [return: MarshalAs(UnmanagedType.Bool)]\n        private static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest, int nWidth,\n            int nHeight, IntPtr hObjSource, int nXSrc, int nYSrc, uint dwRop);\n\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto)]\n        [return: MarshalAs(UnmanagedType.Bool)]\n        private static extern bool LockWindowUpdate(IntPtr hWndLock);\n\n        /// <summary>\n        /// Retrieves the (touch) pointer event type, given the pointer ID.\n        /// </summary>\n        /// <param name=\"pPointerID\">The pointer ID from the window event.</param>\n        /// <param name=\"pPointerType\">The location where the pointer event type will be placed.</param>\n        /// <returns>true if the event type was placed into pPointerType, or false otherwise</returns>\n        [DllImport(\"User32.dll\")]\n        [return: MarshalAs(UnmanagedType.Bool)]\n        public static extern bool GetPointerType(uint pPointerID, out int pPointerType);\n\n        /// <summary>\n        /// Locks or unlocks updates on this control; used to avoid the window blinking problem\n        /// which occurs when Suspend/ResumeDrawing is called.\n        /// </summary>\n        /// <param name=\"form\">The form to update.</param>\n        /// <param name=\"locked\">true to lock window drawing updates, or false to enable them.</param>\n        public static void LockWindowUpdate(this Control form, bool locked)\n        {\n            if (locked)\n                LockWindowUpdate(form.Handle);\n            else\n                LockWindowUpdate(IntPtr.Zero);\n        }\n\n        /// <summary>\n        /// Show the given form on topmost without activating it.\n        /// </summary>\n        /// <param name=\"form\">The form.</param>\n        /// <param name=\"uFlags\">The u flags.</param>\n        /// <exception cref=\"System.ArgumentNullException\">form</exception>\n        public static void ShowInactiveTopmost(this Control form, uint uFlags = 0)\n        {\n            form.ThrowIfNull(nameof(form));\n\n            // We store the 'left' and 'top' position because for some reason\n            // on first execution of 'ShowWindow' the form position gets reset\n            int left = form.Left;\n            int top = form.Top;\n\n            SetWindowPos(form.Handle, HWND_TOPMOST, left, top, form.Width, form.Height, SWP_NOACTIVATE | uFlags);\n            ShowWindow(form.Handle, SW_SHOWNOACTIVATE);\n        }\n\n        /// <summary>\n        /// Wrapper around BitBlt.\n        /// </summary>\n        /// <param name=\"dest\"></param>\n        /// <param name=\"destClip\">Clipping rectangle on dest</param>\n        /// <param name=\"graphics\"></param>\n        /// <param name=\"bltFrom\">Upper-left point on src to blt from</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">dest or graphics</exception>\n        public static void CopyGraphics(Graphics dest, Rectangle destClip, Graphics graphics, Point bltFrom)\n        {\n            dest.ThrowIfNull(nameof(dest));\n\n            graphics.ThrowIfNull(nameof(graphics));\n\n            BitBlt(dest.GetHdc(), destClip.Left, destClip.Top, destClip.Width, destClip.Height,\n                graphics.GetHdc(), bltFrom.X, bltFrom.Y, SRCCOPY);\n        }\n\n\n        #region Graphic Text Character Spacing\n\n        /// <summary>\n        /// Sets the text character spacing.\n        /// </summary>\n        /// <param name=\"graphics\">The g.</param>\n        /// <param name=\"spacing\">The spacing.</param>\n        /// <exception cref=\"System.ArgumentNullException\">graphics</exception>\n        public static void SetTextCharacterSpacing(Graphics graphics, int spacing)\n        {\n            graphics.ThrowIfNull(nameof(graphics));\n\n            IntPtr hdc = graphics.GetHdc();\n            SetTextCharacterExtra(hdc, spacing);\n            graphics.ReleaseHdc();\n        }\n\n        [DllImport(\"gdi32.dll\", CharSet = CharSet.Auto)]\n        private static extern int SetTextCharacterExtra(IntPtr hdc, int nCharExtra);\n\n        #endregion\n\n\n        #region Scrollbar visibility\n\n        /// <summary>\n        /// Gets if the vertical scrollbar is visible on the specified control.\n        /// </summary>\n        /// <param name=\"control\">The control.</param>\n        /// <returns></returns>\n        public static bool VerticalScrollBarVisible(this Control control)\n        {\n            uint wndStyle = GetWindowLong(control.Handle, GWL_STYLE);\n            return (wndStyle & WS_VSCROLL) == WS_VSCROLL;\n        }\n\n        /// <summary>\n        /// Gets if the horizontal scrollbar is visible on the specified control.\n        /// </summary>\n        /// <param name=\"control\">The control.</param>\n        /// <returns></returns>\n        public static bool HorizontalScrollBarVisible(this Control control)\n        {\n            uint wndStyle = GetWindowLong(control.Handle, GWL_STYLE);\n            return (wndStyle & WS_HSCROLL) == WS_HSCROLL;\n        }\n\n        #endregion\n\n\n        #region ScrollBar positioning\n\n        /// <summary>\n        /// Gets the sroll bar position of the list view.\n        /// </summary>\n        /// <param name=\"control\">The list view.</param>\n        /// <returns>The scroll bar position.</returns>\n        /// <exception cref=\"System.ArgumentNullException\">control</exception>\n        public static int GetVerticalScrollBarPosition(this Control control)\n        {\n            control.ThrowIfNull(nameof(control));\n\n            Scrollinfo currentInfo = new Scrollinfo();\n            currentInfo.cbSize = Marshal.SizeOf(currentInfo);\n            currentInfo.fMask = (int)ScrollInfoMask.SIF_ALL;\n\n            GetScrollInfo(control.Handle, (int)ScrollBarDirection.SB_VERT, ref currentInfo);\n            return currentInfo.nPos;\n        }\n\n        /// <summary>\n        /// Sets the scroll bar position of the list view.\n        /// </summary>\n        /// <param name=\"control\">The list view.</param>\n        /// <param name=\"position\">The scroll bar position.</param>\n        /// <exception cref=\"System.ArgumentNullException\">control</exception>\n        public static void SetVerticalScrollBarPosition(this Control control, int position)\n        {\n            control.ThrowIfNull(nameof(control));\n\n            SendMessage(new HandleRef(control, control.Handle), (uint)ListViewMessages.LVM_SCROLL, IntPtr.Zero, (IntPtr)position);\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct Scrollinfo\n        {\n            public int cbSize;\n            public uint fMask;\n            public int nMin;\n            public int nMax;\n            public uint nPage;\n            public int nPos;\n            public int nTrackPos;\n        }\n\n        private enum ScrollBarDirection\n        {\n            SB_HORZ = 0,\n            SB_VERT = 1,\n            SB_CTL = 2,\n            SB_BOTH = 3\n        }\n\n        [Flags]\n        private enum ScrollInfoMask\n        {\n            SIF_RANGE = 0x1,\n            SIF_PAGE = 0x2,\n            SIF_POS = 0x4,\n            SIF_DISABLENOSCROLL = 0x8,\n            SIF_TRACKPOS = 0x10,\n            SIF_ALL = SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS\n        }\n\n        private enum ListViewMessages\n        {\n            LVM_FIRST = 0x1000,\n            LVM_SCROLL = LVM_FIRST + 20\n        }\n\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto)]\n        private static extern int GetScrollInfo(IntPtr hwnd, int fnBar, ref Scrollinfo lpsi);\n\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto, SetLastError = false)]\n        private static extern IntPtr SendMessage(HandleRef hwnd, uint msg, IntPtr wParam, IntPtr lParam);\n\n        #endregion\n\n\n        #region Tray Icon\n\n        // All definitions taken from http://pinvoke.net\n        [DllImport(\"shell32.dll\", CharSet = CharSet.Auto)]\n        internal static extern IntPtr SHAppBarMessage(uint dwMessage, ref AppBarData pData);\n\n        [DllImport(\"user32.dll\", CharSet = CharSet.Unicode)]\n        internal static extern IntPtr FindWindow(string lpClassName, string lpWindowName);\n\n        public const string TaskbarClass = \"Shell_TrayWnd\";\n\n        [StructLayout(LayoutKind.Sequential)]\n        internal struct AppBarData\n        {\n            private int cbSize;\n            private readonly IntPtr hWnd;\n            private readonly uint uCallbackMessage;\n            private readonly uint uEdge;\n            private readonly RECT m_rect;\n            private readonly int lParam;\n\n            public uint UEdge => uEdge;\n\n            public RECT Rect => m_rect;\n\n            public static AppBarData Create()\n            {\n                AppBarData appBarData = new AppBarData { cbSize = Marshal.SizeOf(typeof(AppBarData)) };\n                return appBarData;\n            }\n        }\n\n        public const int ABM_QUERYPOS = 2;\n        public const int ABM_GETTASKBARPOS = 5;\n\n        public const int ABE_LEFT = 0;\n        public const int ABE_TOP = 1;\n        public const int ABE_RIGHT = 2;\n        public const int ABE_BOTTOM = 3;\n\n        [Serializable, StructLayout(LayoutKind.Sequential)]\n        internal struct RECT\n        {\n            /// <summary>\n            /// Initializes a new instance of the <see cref=\"RECT\"/> struct.\n            /// </summary>\n            /// <param name=\"left\">The left.</param>\n            /// <param name=\"top\">The top.</param>\n            /// <param name=\"right\">The right.</param>\n            /// <param name=\"bottom\">The bottom.</param>\n            private RECT(int left, int top, int right, int bottom)\n                : this()\n            {\n                Left = left;\n                Top = top;\n                Right = right;\n                Bottom = bottom;\n            }\n\n            /// <summary>\n            /// Gets the left.\n            /// </summary>\n            /// <value>\n            /// The left.\n            /// </value>\n            public int Left { get; }\n\n            /// <summary>\n            /// Gets the top.\n            /// </summary>\n            /// <value>\n            /// The top.\n            /// </value>\n            public int Top { get; }\n\n            /// <summary>\n            /// Gets the right.\n            /// </summary>\n            /// <value>\n            /// The right.\n            /// </value>\n            public int Right { get; }\n\n            /// <summary>\n            /// Gets the bottom.\n            /// </summary>\n            /// <value>\n            /// The bottom.\n            /// </value>\n            public int Bottom { get; }\n\n            /// <summary>\n            /// Gets the height.\n            /// </summary>\n            /// <value>\n            /// The height.\n            /// </value>\n            public int Height => Bottom - Top + 1;\n\n            /// <summary>\n            /// Gets the width.\n            /// </summary>\n            /// <value>\n            /// The width.\n            /// </value>\n            public int Width => Right - Left + 1;\n\n            /// <summary>\n            /// Gets the size.\n            /// </summary>\n            /// <value>\n            /// The size.\n            /// </value>\n            public Size Size => new Size(Width, Height);\n\n            /// <summary>\n            /// Gets the location.\n            /// </summary>\n            /// <value>\n            /// The location.\n            /// </value>\n            public Point Location => new Point(Left, Top);\n\n            /// <summary>\n            /// Handy method for converting to a System.Drawing.Rectangle\n            /// </summary>\n            /// <returns></returns>\n            public Rectangle ToRectangle() => Rectangle.FromLTRB(Left, Top, Right, Bottom);\n\n            /// <summary>\n            /// Froms the rectangle.\n            /// </summary>\n            /// <param name=\"rectangle\">The rectangle.</param>\n            /// <returns></returns>\n            public static RECT FromRectangle(Rectangle rectangle)\n                => new RECT(rectangle.Left, rectangle.Top, rectangle.Right, rectangle.Bottom);\n\n            public override int GetHashCode()\n                => Left ^ ((Top << 13) | (Top >> 0x13))\n                   ^ ((Width << 0x1a) | (Width >> 6))\n                   ^ ((Height << 7) | (Height >> 0x19));\n\n\n            #region Operator overloads\n\n            public static implicit operator Rectangle(RECT rect)\n                => Rectangle.FromLTRB(rect.Left, rect.Top, rect.Right, rect.Bottom);\n\n            public static implicit operator RECT(Rectangle rect) => new RECT(rect.Left, rect.Top, rect.Right, rect.Bottom);\n\n            #endregion\n        }\n\n        #endregion\n\n\n        #region Custom Message Box\n\n        public const int SC_CLOSE = 0xF060;\n        public const int MF_BYCOMMAND = 0x0;\n        public const int MF_GRAYED = 0x1;\n        public const int MF_ENABLED = 0x0;\n\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto)]\n        internal static extern IntPtr GetSystemMenu(IntPtr hWnd, [MarshalAs(UnmanagedType.Bool)] bool bRevert);\n\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto)]\n        [return: MarshalAs(UnmanagedType.Bool)]\n        internal static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/NoFlickerListBox.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    public class NoFlickerListBox : ListBox\n    {\n        /// <summary>\n        /// The long-press time in milliseconds - change to pull from Windows settings where possible\n        /// </summary>\n        private const double TOUCH_HOLD_TIME = 250.0;\n\n        private DateTime pointerDown;\n\n        public NoFlickerListBox() : base()\n        {\n            pointerDown = DateTime.MinValue;\n        }\n\n        /// <summary>\n        /// Raises the <see cref=\"E:System.Windows.Forms.ListBox.DrawItem\"/> event.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.DrawItemEventArgs\"/> that contains the event data.</param>\n        protected override void OnDrawItem(DrawItemEventArgs e)\n        {\n            var newBounds = new Rectangle(0, 0, e.Bounds.Width, e.Bounds.Height);\n\n            if (newBounds.Width == 0 || newBounds.Height == 0)\n                return;\n\n            // stacked using blocks to avoid indentation, don't need to call IDisposable.Dispose explicitly\n            using (var currentContext = new BufferedGraphicsContext())\n            using (BufferedGraphics bufferedGraphics = currentContext.Allocate(e.Graphics, newBounds))\n            {\n                var newArgs = new DrawItemEventArgs(bufferedGraphics.Graphics, e.Font,\n                    newBounds, e.Index, e.State, e.ForeColor, e.BackColor);\n\n                // Supply the real DrawItem with the off-screen graphics context\n                base.OnDrawItem(newArgs);\n\n                NativeMethods.CopyGraphics(e.Graphics, e.Bounds, bufferedGraphics.Graphics, new Point(0, 0));\n            }\n        }\n        \n        /// <summary>\n        /// The list's window procedure.\n        /// </summary>\n        /// <param name=\"m\">A Windows Message Object.</param>\n        protected override void WndProc(ref Message m)\n        {\n            switch (m.Msg)\n            {\n            case NativeMethods.WM_ERASEBKGND:\n                PaintNonItemRegion();\n                m.Msg = NativeMethods.WM_NULL;\n                break;\n            case NativeMethods.WM_POINTERDOWN:\n                uint id = (uint)m.WParam & NativeMethods.PT_POINTERID_MASK;\n                if (NativeMethods.GetPointerType(id, out int pPointerType))\n                {\n                    if (pPointerType == NativeMethods.PT_TOUCH)\n                        // Touch press down\n                        pointerDown = DateTime.UtcNow;\n                    else\n                        pointerDown = DateTime.MinValue;\n                    // Handle the event\n                    m.Msg = NativeMethods.WM_NULL;\n                    m.Result = new IntPtr(1);\n                } else\n                    pointerDown = DateTime.MinValue;\n                break;\n            case NativeMethods.WM_POINTERUP:\n                // Check for tap and hold\n                if (DateTime.UtcNow.Subtract(pointerDown).TotalMilliseconds >= TOUCH_HOLD_TIME)\n                {\n                    // Extract position from the event and convert to control coordinates\n                    var pos = PointToClient(new Point(m.LParam.ToInt32()));\n                    OnMouseDown(new MouseEventArgs(MouseButtons.Right, 1, pos.X, pos.Y, 0));\n                }\n                // Handle the event\n                m.Msg = NativeMethods.WM_NULL;\n                m.Result = new IntPtr(1);\n                pointerDown = DateTime.MinValue;\n                break;\n            }\n            base.WndProc(ref m);\n        }\n\n        /// <summary>\n        /// Paints the non item region.\n        /// </summary>\n        private void PaintNonItemRegion()\n        {\n            using (var g = Graphics.FromHwnd(Handle))\n            {\n                using (var r = new Region(ClientRectangle))\n                {\n                    for (int i = 0; i < Items.Count; i++)\n                    {\n                        Rectangle itemRect = GetItemRectangle(i);\n                        r.Exclude(itemRect);\n                    }\n\n                    g.FillRegion(SystemBrushes.Window, r);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/NoFlickerPanel.cs",
    "content": "using System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    public class NoFlickerPanel : Panel\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"NoFlickerPanel\"/> class.\n        /// </summary>\n        public NoFlickerPanel()\n        {\n            SetStyle(ControlStyles.OptimizedDoubleBuffer |\n                     ControlStyles.DoubleBuffer |\n                     ControlStyles.UserPaint |\n                     ControlStyles.ResizeRedraw |\n                     ControlStyles.ContainerControl |\n                     ControlStyles.AllPaintingInWmPaint, true);\n            UpdateStyles();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/PersistentSplitContainer.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing System.Windows.Forms;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Common.Controls\n{\n    public class PersistentSplitContainer : SplitContainer\n    {\n        private string m_rememberDistanceKey;\n\n        /// <summary>\n        /// A key used to store position for this control.\n        /// Do not set up directly in the designer, call it from the control's constructor, after InitializeComponent().\n        /// </summary>\n        [Browsable(false)]\n        public string RememberDistanceKey\n        {\n            get { return m_rememberDistanceKey; }\n            set\n            {\n                m_rememberDistanceKey = value;\n\n                // Set the splitter width here rather than in an override of CreateControl()\n                // because CreateControl is only called when we make the container visible\n                // so if the container is created, but never shown, the persistant splitter \n                // width will be reset to the default for the base SplitContainer\n                try\n                {\n                    if (string.IsNullOrEmpty(m_rememberDistanceKey))\n                        return;\n\n                    if (Settings.UI.Splitters.ContainsKey(m_rememberDistanceKey))\n                    {\n                        int d = Settings.UI.Splitters[m_rememberDistanceKey];\n                        d = VerifyValidSplitterDistance(d);\n                        SplitterDistance = d;\n                    }\n                    else\n                        Settings.UI.Splitters.Add(m_rememberDistanceKey, Math.Min(Width / 4, 100));\n                }\n                catch (InvalidOperationException err)\n                {\n                    // This occurs when we're in the designer. DesignMode doesn't get set\n                    // when the control is a subcontrol of a user control, so we should handle\n                    // this here :(\n                    ExceptionHandler.LogException(err, false);\n                }\n                catch (Exception ex)\n                {\n                    ExceptionHandler.LogRethrowException(ex);\n                    throw;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Releases the unmanaged resources used by the <see cref=\"T:System.Windows.Forms.Control\"/> \n        /// and its child controls and optionally releases the managed resources.\n        /// </summary>\n        /// <param name=\"disposing\">true to release both managed and unmanaged resources;\n        /// false to release only unmanaged resources.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (!string.IsNullOrEmpty(m_rememberDistanceKey))\n            {\n                int d = SplitterDistance;\n                if (VerifyValidSplitterDistance(d) == d)\n                    Settings.UI.Splitters[m_rememberDistanceKey] = d;\n            }\n\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Verifies the valid splitter distance.\n        /// </summary>\n        /// <param name=\"d\">The d.</param>\n        /// <returns></returns>\n        private int VerifyValidSplitterDistance(int d)\n        {\n            int defaultDistance = SplitterDistance;\n\n            if ((d < Panel1MinSize) || (d + Panel2MinSize > Width))\n                return defaultDistance;\n            return d;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/PrintOptionsDialog.Designer.cs",
    "content": "using System.Windows.Forms;\n\nnamespace EVEMon.Common.Controls\n{\n    partial class PrintOptionsDialog\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.comboPrinters = new System.Windows.Forms.ComboBox();\n            this.label1 = new System.Windows.Forms.Label();\n            this.checkEntryNumber = new System.Windows.Forms.CheckBox();\n            this.checkStartDate = new System.Windows.Forms.CheckBox();\n            this.checkTrainingTimes = new System.Windows.Forms.CheckBox();\n            this.checkFinishDate = new System.Windows.Forms.CheckBox();\n            this.checkPageHeaders = new System.Windows.Forms.CheckBox();\n            this.checkPageNumbers = new System.Windows.Forms.CheckBox();\n            this.checkDateInformation = new System.Windows.Forms.CheckBox();\n            this.checkTotalTimes = new System.Windows.Forms.CheckBox();\n            this.buttonOK = new System.Windows.Forms.Button();\n            this.buttonCancel = new System.Windows.Forms.Button();\n            this.btn_setDefs = new System.Windows.Forms.Button();\n            this.checkNotes = new System.Windows.Forms.CheckBox();\n            this.SuspendLayout();\n            // \n            // comboPrinters\n            // \n            this.comboPrinters.FormattingEnabled = true;\n            this.comboPrinters.Location = new System.Drawing.Point(55, 17);\n            this.comboPrinters.Name = \"comboPrinters\";\n            this.comboPrinters.Size = new System.Drawing.Size(215, 21);\n            this.comboPrinters.TabIndex = 0;\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(12, 20);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(37, 13);\n            this.label1.TabIndex = 1;\n            this.label1.Text = \"Printer\";\n            // \n            // checkEntryNumber\n            // \n            this.checkEntryNumber.AutoSize = true;\n            this.checkEntryNumber.Location = new System.Drawing.Point(55, 44);\n            this.checkEntryNumber.Name = \"checkEntryNumber\";\n            this.checkEntryNumber.Size = new System.Drawing.Size(114, 17);\n            this.checkEntryNumber.TabIndex = 2;\n            this.checkEntryNumber.Text = \"Print Entry Number\";\n            this.checkEntryNumber.UseVisualStyleBackColor = true;\n            // \n            // checkStartDate\n            // \n            this.checkStartDate.AutoSize = true;\n            this.checkStartDate.Location = new System.Drawing.Point(55, 90);\n            this.checkStartDate.Name = \"checkStartDate\";\n            this.checkStartDate.Size = new System.Drawing.Size(98, 17);\n            this.checkStartDate.TabIndex = 3;\n            this.checkStartDate.Text = \"Print Start Date\";\n            this.checkStartDate.UseVisualStyleBackColor = true;\n            // \n            // checkTrainingTimes\n            // \n            this.checkTrainingTimes.AutoSize = true;\n            this.checkTrainingTimes.Location = new System.Drawing.Point(55, 113);\n            this.checkTrainingTimes.Name = \"checkTrainingTimes\";\n            this.checkTrainingTimes.Size = new System.Drawing.Size(119, 17);\n            this.checkTrainingTimes.TabIndex = 4;\n            this.checkTrainingTimes.Text = \"Print Training Times\";\n            this.checkTrainingTimes.UseVisualStyleBackColor = true;\n            // \n            // checkFinishDate\n            // \n            this.checkFinishDate.AutoSize = true;\n            this.checkFinishDate.Location = new System.Drawing.Point(55, 136);\n            this.checkFinishDate.Name = \"checkFinishDate\";\n            this.checkFinishDate.Size = new System.Drawing.Size(103, 17);\n            this.checkFinishDate.TabIndex = 5;\n            this.checkFinishDate.Text = \"Print Finish Date\";\n            this.checkFinishDate.UseVisualStyleBackColor = true;\n            // \n            // checkPageHeaders\n            // \n            this.checkPageHeaders.AutoSize = true;\n            this.checkPageHeaders.Location = new System.Drawing.Point(55, 159);\n            this.checkPageHeaders.Name = \"checkPageHeaders\";\n            this.checkPageHeaders.Size = new System.Drawing.Size(118, 17);\n            this.checkPageHeaders.TabIndex = 6;\n            this.checkPageHeaders.Text = \"Print Page Headers\";\n            this.checkPageHeaders.UseVisualStyleBackColor = true;\n            // \n            // checkPageNumbers\n            // \n            this.checkPageNumbers.AutoSize = true;\n            this.checkPageNumbers.Location = new System.Drawing.Point(55, 182);\n            this.checkPageNumbers.Name = \"checkPageNumbers\";\n            this.checkPageNumbers.Size = new System.Drawing.Size(120, 17);\n            this.checkPageNumbers.TabIndex = 7;\n            this.checkPageNumbers.Text = \"Print Page Numbers\";\n            this.checkPageNumbers.UseVisualStyleBackColor = true;\n            // \n            // checkDateInformation\n            // \n            this.checkDateInformation.AutoSize = true;\n            this.checkDateInformation.Location = new System.Drawing.Point(55, 205);\n            this.checkDateInformation.Name = \"checkDateInformation\";\n            this.checkDateInformation.Size = new System.Drawing.Size(128, 17);\n            this.checkDateInformation.TabIndex = 8;\n            this.checkDateInformation.Text = \"Print Date Information\";\n            this.checkDateInformation.UseVisualStyleBackColor = true;\n            // \n            // checkTotalTimes\n            // \n            this.checkTotalTimes.AutoSize = true;\n            this.checkTotalTimes.Location = new System.Drawing.Point(55, 228);\n            this.checkTotalTimes.Name = \"checkTotalTimes\";\n            this.checkTotalTimes.Size = new System.Drawing.Size(146, 17);\n            this.checkTotalTimes.TabIndex = 9;\n            this.checkTotalTimes.Text = \"Print Total Training Times\";\n            this.checkTotalTimes.UseVisualStyleBackColor = true;\n            // \n            // buttonOK\n            // \n            this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK;\n            this.buttonOK.Location = new System.Drawing.Point(39, 300);\n            this.buttonOK.Name = \"buttonOK\";\n            this.buttonOK.Size = new System.Drawing.Size(75, 23);\n            this.buttonOK.TabIndex = 10;\n            this.buttonOK.Text = \"OK\";\n            this.buttonOK.UseVisualStyleBackColor = true;\n            this.buttonOK.Click += new System.EventHandler(this.OnAccept);\n            // \n            // buttonCancel\n            // \n            this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.buttonCancel.Location = new System.Drawing.Point(171, 300);\n            this.buttonCancel.Name = \"buttonCancel\";\n            this.buttonCancel.Size = new System.Drawing.Size(75, 23);\n            this.buttonCancel.TabIndex = 11;\n            this.buttonCancel.Text = \"Cancel\";\n            this.buttonCancel.UseVisualStyleBackColor = true;\n            // \n            // btn_setDefs\n            // \n            this.btn_setDefs.Location = new System.Drawing.Point(39, 261);\n            this.btn_setDefs.Name = \"btn_setDefs\";\n            this.btn_setDefs.Size = new System.Drawing.Size(207, 23);\n            this.btn_setDefs.TabIndex = 12;\n            this.btn_setDefs.Text = \"Set as Default Options\";\n            this.btn_setDefs.UseVisualStyleBackColor = true;\n            this.btn_setDefs.Click += new System.EventHandler(this.OnSetAsDefaults);\n            // \n            // checkNotes\n            // \n            this.checkNotes.AutoSize = true;\n            this.checkNotes.Location = new System.Drawing.Point(55, 67);\n            this.checkNotes.Name = \"checkNotes\";\n            this.checkNotes.Size = new System.Drawing.Size(78, 17);\n            this.checkNotes.TabIndex = 13;\n            this.checkNotes.Text = \"Print Notes\";\n            this.checkNotes.UseVisualStyleBackColor = true;\n            // \n            // PrintOptionsDialog\n            // \n            this.AcceptButton = this.buttonOK;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            ((Form)this).CancelButton = this.buttonCancel;\n            this.ClientSize = new System.Drawing.Size(290, 339);\n            this.Controls.Add(this.checkNotes);\n            this.Controls.Add(this.btn_setDefs);\n            this.Controls.Add(this.buttonCancel);\n            this.Controls.Add(this.buttonOK);\n            this.Controls.Add(this.checkTotalTimes);\n            this.Controls.Add(this.checkDateInformation);\n            this.Controls.Add(this.checkPageNumbers);\n            this.Controls.Add(this.checkPageHeaders);\n            this.Controls.Add(this.checkFinishDate);\n            this.Controls.Add(this.checkTrainingTimes);\n            this.Controls.Add(this.checkStartDate);\n            this.Controls.Add(this.checkEntryNumber);\n            this.Controls.Add(this.label1);\n            this.Controls.Add(this.comboPrinters);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n            this.MaximizeBox = false;\n            this.MinimizeBox = false;\n            this.Name = \"PrintOptionsDialog\";\n            this.Text = \"Skill Printer Options\";\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ComboBox comboPrinters;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.CheckBox checkEntryNumber;\n        private System.Windows.Forms.CheckBox checkStartDate;\n        private System.Windows.Forms.CheckBox checkTrainingTimes;\n        private System.Windows.Forms.CheckBox checkFinishDate;\n        private System.Windows.Forms.CheckBox checkPageHeaders;\n        private System.Windows.Forms.CheckBox checkPageNumbers;\n        private System.Windows.Forms.CheckBox checkDateInformation;\n        private System.Windows.Forms.CheckBox checkTotalTimes;\n        private System.Windows.Forms.Button buttonOK;\n        private System.Windows.Forms.Button buttonCancel;\n        private System.Windows.Forms.Button btn_setDefs;\n        private System.Windows.Forms.CheckBox checkNotes;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/PrintOptionsDialog.cs",
    "content": "using System;\nusing System.Drawing.Printing;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Controls\n{\n    public partial class PrintOptionsDialog : EVEMonForm\n    {\n        private readonly PlanExportSettings m_pto;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PrintOptionsDialog\"/> class.\n        /// </summary>\n        /// <param name=\"pto\">The pto.</param>\n        /// <param name=\"doc\">The document.</param>\n        /// <exception cref=\"System.ArgumentNullException\">pto or doc</exception>\n        public PrintOptionsDialog(PlanExportSettings pto, PrintDocument doc)\n        {\n            pto.ThrowIfNull(nameof(pto));\n\n            doc.ThrowIfNull(nameof(doc));\n\n            InitializeComponent();\n\n            string curPrinter = doc.PrinterSettings.PrinterName;\n\n            m_pto = pto;\n\n            foreach (string printer in PrinterSettings.InstalledPrinters)\n            {\n                int index = comboPrinters.Items.Add(printer);\n\n                doc.PrinterSettings.PrinterName = printer;\n                if (doc.PrinterSettings.IsDefaultPrinter)\n                    comboPrinters.SelectedIndex = index;\n            }\n\n            // If this dialog is cancelled, we dont want the name of the printer to have changed\n            doc.PrinterSettings.PrinterName = curPrinter;\n\n            EntryFinishDate = pto.EntryFinishDate;\n            EntryNumber = pto.EntryNumber;\n            EntryStartDate = pto.EntryStartDate;\n            EntryTrainingTimes = pto.EntryTrainingTimes;\n            EntryNotes = pto.EntryNotes;\n            FooterCount = pto.FooterCount;\n            FooterDate = pto.FooterDate;\n            FooterTotalTime = pto.FooterTotalTime;\n            IncludeHeader = pto.IncludeHeader;\n        }\n\n        /// <summary>\n        /// Gets the name of the printer.\n        /// </summary>\n        /// <value>The name of the printer.</value>\n        public string PrinterName => comboPrinters.Items[comboPrinters.SelectedIndex].ToString();\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [entry finish date].\n        /// </summary>\n        /// <value><c>true</c> if [entry finish date]; otherwise, <c>false</c>.</value>\n        public bool EntryFinishDate\n        {\n            get { return checkFinishDate.Checked; }\n            set { checkFinishDate.Checked = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [entry number].\n        /// </summary>\n        /// <value><c>true</c> if [entry number]; otherwise, <c>false</c>.</value>\n        public bool EntryNumber\n        {\n            get { return checkEntryNumber.Checked; }\n            set { checkEntryNumber.Checked = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [entry start date].\n        /// </summary>\n        /// <value><c>true</c> if [entry start date]; otherwise, <c>false</c>.</value>\n        public bool EntryStartDate\n        {\n            get { return checkStartDate.Checked; }\n            set { checkStartDate.Checked = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [entry training times].\n        /// </summary>\n        /// <value><c>true</c> if [entry training times]; otherwise, <c>false</c>.</value>\n        public bool EntryTrainingTimes\n        {\n            get { return checkTrainingTimes.Checked; }\n            set { checkTrainingTimes.Checked = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [entry notes].\n        /// </summary>\n        /// <value><c>true</c> if [entry notes]; otherwise, <c>false</c>.</value>\n        public bool EntryNotes\n        {\n            get { return checkNotes.Checked; }\n            set { checkNotes.Checked = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [footer count].\n        /// </summary>\n        /// <value><c>true</c> if [footer count]; otherwise, <c>false</c>.</value>\n        public bool FooterCount\n        {\n            get { return checkPageNumbers.Checked; }\n            set { checkPageNumbers.Checked = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [footer date].\n        /// </summary>\n        /// <value><c>true</c> if [footer date]; otherwise, <c>false</c>.</value>\n        public bool FooterDate\n        {\n            get { return checkDateInformation.Checked; }\n            set { checkDateInformation.Checked = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [footer total time].\n        /// </summary>\n        /// <value><c>true</c> if [footer total time]; otherwise, <c>false</c>.</value>\n        public bool FooterTotalTime\n        {\n            get { return checkTotalTimes.Checked; }\n            set { checkTotalTimes.Checked = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [include header].\n        /// </summary>\n        /// <value><c>true</c> if [include header]; otherwise, <c>false</c>.</value>\n        public bool IncludeHeader\n        {\n            get { return checkPageHeaders.Checked; }\n            set { checkPageHeaders.Checked = value; }\n        }\n\n        /// <summary>\n        /// Called when [set as defaults].\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnSetAsDefaults(object sender, EventArgs e)\n        {\n            OnAccept(sender, e);\n            Settings.Save();\n        }\n\n        /// <summary>\n        /// Called when [accept].\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnAccept(object sender, EventArgs e)\n        {\n            m_pto.EntryFinishDate = EntryFinishDate;\n            m_pto.EntryNumber = EntryNumber;\n            m_pto.EntryStartDate = EntryStartDate;\n            m_pto.EntryTrainingTimes = EntryTrainingTimes;\n            m_pto.EntryNotes = EntryNotes;\n            m_pto.FooterCount = FooterCount;\n            m_pto.FooterDate = FooterDate;\n            m_pto.FooterTotalTime = FooterTotalTime;\n            m_pto.IncludeHeader = IncludeHeader;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/PrintOptionsDialog.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Controls/ResolutionAction.cs",
    "content": "namespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// Defines the action that the parent should take upon notification of an API Error Troubleshooter resolution.\n    /// </summary>\n    public enum ResolutionAction\n    {\n        /// <summary>\n        /// No action.\n        /// </summary>\n        None,\n\n        /// <summary>\n        /// Close the window.\n        /// </summary>\n        Close,\n\n        /// <summary>\n        /// Hide the troubleshooter.\n        /// </summary>\n        HideTroubleshooter\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/SkillQueueControl.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Controls\n{\n    public class SkillQueueControl : Control\n    {\n        private readonly InfiniteDisplayToolTip m_toolTip;\n\n        private static DateTime s_nextRepainting = DateTime.MinValue;\n\n        private SkillQueue m_skillQueue;\n        private Color m_lessThanDayFirstColor = Color.Yellow;\n        private Color m_lessThanDaySecondColor = Color.DarkKhaki;\n        private Color m_moreThanDayFirstColor = Color.LightBlue;\n        private Color m_moreThanDaySecondColor = Color.DarkBlue;\n        private Color m_emptyColor = Color.DimGray;\n        private Color m_borderColor = Color.Gray;\n        private Point m_lastLocation = new Point(-1, -1);\n\n\n        #region Constructors, disposing, global events\n\n        /// <summary>\n        /// Creates the skill queue control without an associates skill queue.\n        /// </summary>\n        public SkillQueueControl()\n        {\n            m_toolTip = new InfiniteDisplayToolTip(this);\n\n            Disposed += OnDisposed;\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            EveMonClient.CharacterUpdated += EveMonClient_CharacterUpdated;\n        }\n\n        /// <summary>\n        /// Unsubscribe events on disposing.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDisposed(object sender, EventArgs e)\n        {\n            Disposed -= OnDisposed;\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            EveMonClient.CharacterUpdated -= EveMonClient_CharacterUpdated;\n            m_toolTip.Dispose();\n        }\n\n        /// <summary>\n        /// Every second, we checks whether we should update the display.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (!Visible)\n                return;\n\n            if (DateTime.Now > s_nextRepainting)\n                Invalidate();\n        }\n\n        /// <summary>\n        /// When the settings changed, the \"SafeForWork\" propety which affects our color schemes may have changed.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            if (Visible)\n                Invalidate();\n        }\n\n        /// <summary>\n        /// When the character changes, we invalidate the repainting.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_CharacterUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (!Visible)\n                return;\n\n            CCPCharacter ccpCharacter = e.Character as CCPCharacter;\n\n            // Current character isn't a CCP character, so can't have a Queue.\n            if (ccpCharacter == null)\n                return;\n\n            if (m_skillQueue == null || ccpCharacter.SkillQueue != m_skillQueue)\n                return;\n\n            Invalidate();\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Skill Queue to be rendered.\n        /// </summary>\n        [Category(\"Data\")]\n        [Description(\"Skill queue to render on the control canvas\")]\n        public SkillQueue SkillQueue\n        {\n            get { return m_skillQueue; }\n            set\n            {\n                m_skillQueue = value;\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// The first of two colors to be used in the queue for less than day.\n        /// </summary>\n        [Category(\"Appearance\")]\n        [Description(\"Less than day first color of the component\")]\n        public Color LessThanDayFirstColor\n        {\n            get { return m_lessThanDayFirstColor; }\n\n            set\n            {\n                m_lessThanDayFirstColor = value;\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// The second of two colours to be used in the queue for less than day.\n        /// </summary>\n        [Category(\"Appearance\")]\n        [Description(\"Less than day second color of the component\")]\n        public Color LessThanDaySecondColor\n        {\n            get { return m_lessThanDaySecondColor; }\n            set\n            {\n                m_lessThanDaySecondColor = value;\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// The first of two colors to be used in the queue for more than day.\n        /// </summary>\n        [Category(\"Appearance\")]\n        [Description(\"Less than day first color of the component\")]\n        public Color MoreThanDayFirstColor\n        {\n            get { return m_moreThanDayFirstColor; }\n\n            set\n            {\n                m_moreThanDayFirstColor = value;\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// The second of two colours to be used in the queue for more than day.\n        /// </summary>\n        [Category(\"Appearance\")]\n        [Description(\"More than day second color of the component\")]\n        public Color MoreThanDaySecondColor\n        {\n            get { return m_moreThanDaySecondColor; }\n            set\n            {\n                m_moreThanDaySecondColor = value;\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// The color used for the free space at the end of the queue.\n        /// </summary>\n        [Category(\"Appearance\")]\n        [Description(\"Color used for the free space at the end of the queue when there are less than 24h of training queued.\")]\n        public Color EmptyColor\n        {\n            get { return m_emptyColor; }\n            set\n            {\n                m_emptyColor = value;\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// The color used for the border of the queue.\n        /// </summary>\n        [Category(\"Appearance\")]\n        [Description(\"Color used for the border of the queue.\")]\n        public Color BorderColor\n        {\n            get { return m_borderColor; }\n            set\n            {\n                m_borderColor = value;\n                Invalidate();\n            }\n        }\n\n        #endregion\n\n\n        #region Overridden Methods\n\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            if (Visible)\n                Invalidate();\n        }\n\n        /// <summary>\n        /// Paint the skill queue to the control surface.\n        /// </summary>\n        /// <remarks>\n        /// e.Graphics is control surface. Width and Height are\n        /// derived from the control itself not e.ClipRectangle \n        /// which could point to part of the control.\n        /// </remarks>\n        /// <param name=\"e\">Paint Event</param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            Graphics g = e.Graphics;\n            int width = Width;\n            int height = Height;\n\n            // If we are in DesignMode we just paint a dummy queue\n            if (DesignMode || this.IsDesignModeHosted())\n            {\n                PaintDesignerQueue(g, width, height);\n                return;\n            }\n\n            PaintQueue(g, width, height);\n\n            // We need to update the painting only every (skillqueue end time hour / width in pixels)\n            s_nextRepainting = DateTime.Now.AddHours((double)m_skillQueue.EndTime.Hour / width);\n        }\n\n        #endregion\n\n\n        #region Private Methods\n\n        /// <summary>\n        /// Get the less than day first of the two alternating colours.\n        /// </summary>\n        /// <remarks>\n        /// Implements safe for work functionality\n        /// </remarks>\n        /// <returns>First Colour property, or dark Gray if in safe for work mode</returns>\n        private Color GetLessThanDayFirstColor() => Settings.UI.SafeForWork ? Color.LightGray : m_lessThanDayFirstColor;\n\n        /// <summary>\n        /// Get the less than day second of the two alternating colours.\n        /// </summary>\n        /// <remarks>\n        /// Implements safe for work functionality\n        /// </remarks>\n        /// <returns>Second Colour property, or gray if in safe for work mode</returns>\n        private Color GetLessThanDaySecondColor() => Settings.UI.SafeForWork ? Color.Gray : m_lessThanDaySecondColor;\n\n        /// <summary>\n        /// Get the more than day first of the two alternating colours.\n        /// </summary>\n        /// <remarks>\n        /// Implements safe for work functionality\n        /// </remarks>\n        /// <returns>First Colour property, or dark Gray if in safe for work mode</returns>\n        private Color GetMoreThanDayFirstColor() => Settings.UI.SafeForWork ? Color.DarkGray : m_moreThanDayFirstColor;\n\n        /// <summary>\n        /// Get the more than day second of the two alternating colours.\n        /// </summary>\n        /// <remarks>\n        /// Implements safe for work functionality\n        /// </remarks>\n        /// <returns>Second Colour property, or gray if in safe for work mode</returns>\n        private Color GetMoreThanDaySecondColor() => Settings.UI.SafeForWork ? Color.DimGray : m_moreThanDaySecondColor;\n\n        /// <summary>\n        /// Gets the color for the free time.\n        /// </summary>\n        /// <remarks>\n        /// Implements safe for work functionality\n        /// </remarks>\n        /// <returns>Second Colour property, or dim gray if in safe for work mode</returns>\n        private Color GetEmptyColor() => Settings.UI.SafeForWork ? Color.DimGray : m_emptyColor;\n\n        /// <summary>\n        /// Gets the border color.\n        /// </summary>\n        /// <remarks>\n        /// Implements safe for work functionality\n        /// </remarks>\n        /// <returns>Second Colour property, or black if in safe for work mode</returns>\n        private Color GetBorderColor() => Settings.UI.SafeForWork ? Color.Black : m_borderColor;\n\n        /// <summary>\n        /// Paints the first 24 hours of the skill queue including the\n        /// point if the queue has more than 24 hours contained within it.\n        /// </summary>\n        /// <param name=\"g\">Graphics canvas</param>\n        /// <param name=\"width\">Width of the canvas</param>\n        /// <param name=\"height\">Height of the canvas</param>\n        private void PaintQueue(Graphics g, int width, int height)\n        {\n            Brush[] lessThanDayBrushes =\n            {\n                new SolidBrush(GetLessThanDayFirstColor()),\n                new SolidBrush(GetLessThanDaySecondColor()),\n            };\n            Brush[] moreThanDayBrushes =\n            {\n                new SolidBrush(GetMoreThanDayFirstColor()),\n                new SolidBrush(GetMoreThanDaySecondColor())\n            };\n\n            try\n            {\n                if (m_skillQueue == null)\n                    return;\n\n                int brushNumber = 0;\n                float lastX = 0f;\n                double oneDaySkillQueueWidth = m_skillQueue.GetOneDaySkillQueueWidth(width);\n\n                foreach (QueuedSkill skill in m_skillQueue)\n                {\n                    IList<RectangleF> skillRects = m_skillQueue.GetSkillRects(skill, width, height).ToList();\n                    RectangleF skillRectFirst = skillRects.First();\n\n                    // Skill starts before the 24h marker\n                    if (skillRectFirst.X < oneDaySkillQueueWidth)\n                    {\n                        // Copy the brush for internal use\n                        int internalBrushNumber = brushNumber;\n\n                        // Iterate only through rectangles with width as they tamper with the lastX value\n                        foreach (RectangleF skillRect in skillRects.Skip(1).Where(rect => rect.Width > 0))\n                        {\n                            Brush[] brushes = lessThanDayBrushes;\n                            if (oneDaySkillQueueWidth - skillRect.X <= 0)\n                            {\n                                brushes = moreThanDayBrushes;\n\n                                // Rotate the brush\n                                internalBrushNumber = (internalBrushNumber + 1) % brushes.Length;\n                            }\n\n                            internalBrushNumber = PaintRect(g, brushes, skillRect, internalBrushNumber);\n                            lastX = skillRect.Right;\n                        }\n\n                        // Rotate the brush\n                        brushNumber = (brushNumber + 1) % lessThanDayBrushes.Length;\n\n                        continue;\n                    }\n\n                    brushNumber = PaintRect(g, moreThanDayBrushes, skillRectFirst, brushNumber);\n                    lastX = skillRectFirst.Right;\n                }\n\n                // If there are less than 24 hours in the queue draw a dark region at the end and the border\n                if (!m_skillQueue.LessThanWarningThreshold)\n                    return;\n\n                // Empty region\n                RectangleF emptyRect = new RectangleF(lastX, 0, width - lastX, Height);\n                using (SolidBrush brush = new SolidBrush(GetEmptyColor()))\n                {\n                    g.FillRectangle(brush, emptyRect);\n                }\n\n                // Then the border\n                using (Pen pen = new Pen(GetBorderColor(), 1.0f))\n                {\n                    g.DrawRectangle(pen, 0, 0, width - 1, height - 1);\n                }\n            }\n            finally\n            {\n                foreach (Brush brush in lessThanDayBrushes.Concat(moreThanDayBrushes))\n                {\n                    brush.Dispose();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Paints the rectangle.\n        /// </summary>\n        /// <param name=\"g\">The g.</param>\n        /// <param name=\"brushes\">The brushes.</param>\n        /// <param name=\"skillRect\">The skill rect.</param>\n        /// <param name=\"brushNumber\">The brush number.</param>\n        /// <returns></returns>\n        private static int PaintRect(Graphics g, IReadOnlyList<Brush> brushes, RectangleF skillRect, int brushNumber)\n        {\n            g.FillRectangle(brushes[brushNumber], skillRect);\n\n            // Rotate the brush\n            brushNumber = (brushNumber + 1) % brushes.Count;\n\n            return brushNumber;\n        }\n\n        /// <summary>\n        /// Displays the skill tool tip.\n        /// </summary>\n        /// <param name=\"skillRect\">The skill rect.</param>\n        /// <param name=\"skill\">The skill.</param>\n        private void DisplaySkillToolTip(RectangleF skillRect, QueuedSkill skill)\n        {\n            const string Format = \"{0} {1}\\n  Start{2}\\t{3}\\n  Ends\\t{4}\";\n            string skillName = skill.SkillName;\n            string skillLevel = Skill.GetRomanFromInt(skill.Level);\n            string skillStart = skill.Owner.IsTraining\n                ? skill.StartTime.ToLocalTime().ToAbsoluteDateTimeDescription(DateTimeKind.Local)\n                : \"Paused\";\n            string skillEnd = skill.Owner.IsTraining\n                ? skill.EndTime.ToLocalTime().ToAbsoluteDateTimeDescription(DateTimeKind.Local)\n                : \"Paused\";\n            string startText = skill.StartTime < DateTime.UtcNow ? \"ed\" : \"s\";\n            string text = string.Format(CultureConstants.DefaultCulture, Format, skillName, skillLevel, startText, skillStart,\n                skillEnd);\n            Size textSize = TextRenderer.MeasureText(text, Font);\n            Size toolTipSize = new Size(textSize.Width + 13, textSize.Height + 11);\n            Point tipPoint = new Point((int)(Math.Min(skillRect.Right, Width) + skillRect.Left) / 2 - toolTipSize.Width / 2,\n                -toolTipSize.Height);\n            tipPoint.Offset(0, -21);\n            m_toolTip.Show(text, tipPoint);\n        }\n\n        /// <summary>\n        /// Displays the free room tool tip.\n        /// </summary>\n        /// <param name=\"emptyRect\">The empty rect.</param>\n        private void DisplayFreeRoomToolTip(RectangleF emptyRect)\n        {\n            int remaining = EveConstants.MaxSkillsInQueue - m_skillQueue.Count;\n            string text = $\"Room for {remaining} more skill{(remaining == 1 ? string.Empty : \"s\")}\";\n            Size textSize = TextRenderer.MeasureText(text, Font);\n            Size toolTipSize = new Size(textSize.Width + 13, textSize.Height + 11);\n            Point tipPoint = new Point((int)(emptyRect.Right + emptyRect.Left) / 2 - toolTipSize.Width / 2, -toolTipSize.Height);\n            tipPoint.Offset(0, -21);\n            m_toolTip.Show(text, tipPoint);\n        }\n\n        /// <summary>\n        /// Triggers when the mouse is moved displays skill.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnMouseMove(MouseEventArgs e)\n        {\n            base.OnMouseMove(e);\n\n            if (m_skillQueue == null)\n                return;\n\n            // Prevent rapid triggering of event when the mouse hasn't moved\n            if (e.Location == m_lastLocation)\n                return;\n\n            m_lastLocation = e.Location;\n\n            float lastX = 0f;\n            foreach (QueuedSkill skill in m_skillQueue)\n            {\n                // Find the rectangle for the skill\n                RectangleF skillRect = m_skillQueue.GetSkillRects(skill, Width, Height).First();\n                lastX = skillRect.Right;\n\n                if (!skillRect.Contains(e.Location))\n                    continue;\n\n                DisplaySkillToolTip(skillRect, skill);\n                return;\n            }\n\n            // Are we in the empty space ?\n            RectangleF emptyRect = new RectangleF(lastX, 0, Width - lastX, Height);\n            if (emptyRect.Contains(e.Location))\n            {\n                DisplayFreeRoomToolTip(emptyRect);\n                return;\n            }\n\n            m_toolTip.Hide();\n        }\n\n        /// <summary>\n        /// Hide tooltip when mouse moves out of skill queue.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnMouseLeave(EventArgs e)\n        {\n            base.OnMouseLeave(e);\n\n            m_toolTip.Hide();\n        }\n\n        /// <summary>\n        /// Spit out a static skill queue for the designer.\n        /// </summary>\n        /// <param name=\"g\"></param>\n        /// <param name=\"width\"></param>\n        /// <param name=\"height\"></param>\n        private void PaintDesignerQueue(Graphics g, int width, int height)\n        {\n            using (Brush lessThanDayFirstBrush = new SolidBrush(GetLessThanDayFirstColor()))\n            using (Brush lessThanDaySecondBrush = new SolidBrush(GetLessThanDaySecondColor()))\n            using (Brush moreThanDayFirstBrush = new SolidBrush(GetMoreThanDayFirstColor()))\n            using (Brush moreThanDaySecondBrush = new SolidBrush(GetMoreThanDaySecondColor()))\n            using (Brush emptyBrush = new SolidBrush(GetEmptyColor()))\n            {\n                g.FillRectangle(lessThanDayFirstBrush, new RectangleF(0, 0, width / 5f, height));\n                g.FillRectangle(lessThanDaySecondBrush, new RectangleF(width / 5f, 0, width / 5f, height));\n                g.FillRectangle(moreThanDayFirstBrush, new RectangleF(width * 2 / 5f, 0, width / 5f, height));\n                g.FillRectangle(moreThanDaySecondBrush, new RectangleF(width * 3 / 5f, 0, width / 5f, height));\n                g.FillRectangle(emptyBrush, new RectangleF(width * 4 / 5f, 0, width / 5f, height));\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/SplitButton.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing System.Windows.Forms.VisualStyles;\nusing EVEMon.Common.Extensions;\n\n/* Code from http://blogs.msdn.com/jfoscoding/articles/491523.aspx */\n\nnamespace EVEMon.Common.Controls\n{\n    public sealed class SplitButton : Button\n    {\n        private PushButtonState m_state;\n        private const int PushButtonWidth = 14;\n        private static readonly int s_borderSize = SystemInformation.Border3DSize.Width * 2;\n        private bool m_skipNextOpen;\n        private Rectangle m_dropDownRectangle;\n        private bool m_showSplit = true;\n        public event EventHandler ContextMenuShowing;\n\n        public SplitButton()\n        {\n            AutoSize = true;\n        }\n\n        [DefaultValue(true)]\n        public bool ShowSplit\n        {\n            get { return m_showSplit; }\n            set\n            {\n                if (value == m_showSplit)\n                    return;\n\n                m_showSplit = value;\n                Invalidate();\n                Parent?.PerformLayout();\n            }\n        }\n\n        private PushButtonState State\n        {\n            get { return m_state; }\n\n            set\n            {\n                if (m_state.Equals(value))\n                    return;\n\n                m_state = value;\n                Invalidate();\n            }\n        }\n\n        public override Size GetPreferredSize(Size proposedSize)\n        {\n            Size preferredSize = base.GetPreferredSize(proposedSize);\n            if (m_showSplit && !string.IsNullOrEmpty(Text) &&\n                TextRenderer.MeasureText(Text, Font).Width + PushButtonWidth > preferredSize.Width)\n                return preferredSize + new Size(PushButtonWidth + s_borderSize * 2, 0);\n\n            return preferredSize;\n        }\n\n        protected override bool IsInputKey(Keys keyData)\n        {\n            if (keyData.Equals(Keys.Down) && m_showSplit)\n                return true;\n\n            return base.IsInputKey(keyData);\n        }\n\n        protected override void OnGotFocus(EventArgs e)\n        {\n            base.OnGotFocus(e);\n\n            if (!m_showSplit)\n                return;\n\n            if (!State.Equals(PushButtonState.Pressed) && !State.Equals(PushButtonState.Disabled))\n                State = PushButtonState.Default;\n        }\n\n        protected override void OnKeyDown(KeyEventArgs e)\n        {\n            base.OnKeyDown(e);\n\n            if (!m_showSplit)\n                return;\n\n            if (e.KeyCode.Equals(Keys.Down))\n                ShowContextMenuStrip();\n\n            if (e.KeyCode.Equals(Keys.Space) && e.Modifiers == Keys.None)\n                State = PushButtonState.Pressed;\n        }\n\n        protected override void OnKeyUp(KeyEventArgs e)\n        {\n            base.OnKeyUp(e);\n\n            if (!e.KeyCode.Equals(Keys.Space))\n                return;\n\n            if (MouseButtons == MouseButtons.None)\n                State = PushButtonState.Normal;\n        }\n\n        protected override void OnLostFocus(EventArgs e)\n        {\n            base.OnLostFocus(e);\n\n            if (!m_showSplit)\n                return;\n\n            if (!State.Equals(PushButtonState.Pressed) && !State.Equals(PushButtonState.Disabled))\n                State = PushButtonState.Normal;\n        }\n\n        protected override void OnMouseDown(MouseEventArgs e)\n        {\n            base.OnMouseDown(e);\n\n            if (!m_showSplit)\n                return;\n\n            if (m_dropDownRectangle.Contains(e.Location))\n                ShowContextMenuStrip();\n            else\n                State = PushButtonState.Pressed;\n        }\n\n        protected override void OnMouseEnter(EventArgs e)\n        {\n            base.OnMouseEnter(e);\n\n            if (!m_showSplit)\n                return;\n\n            if (!State.Equals(PushButtonState.Pressed) && !State.Equals(PushButtonState.Disabled))\n                State = PushButtonState.Hot;\n        }\n\n        protected override void OnMouseLeave(EventArgs e)\n        {\n            base.OnMouseLeave(e);\n\n            if (!m_showSplit)\n                return;\n\n            if (!State.Equals(PushButtonState.Pressed) && !State.Equals(PushButtonState.Disabled))\n                State = Focused ? PushButtonState.Default : PushButtonState.Normal;\n        }\n\n        protected override void OnMouseUp(MouseEventArgs e)\n        {\n            base.OnMouseUp(e);\n\n            if (!m_showSplit)\n                return;\n\n            if (ContextMenuStrip != null && ContextMenuStrip.Visible)\n                return;\n\n            SetButtonDrawState();\n            if (Bounds.Contains(Parent.PointToClient(Cursor.Position)) && !m_dropDownRectangle.Contains(e.Location))\n                OnClick(new EventArgs());\n        }\n\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            if (!m_showSplit)\n                return;\n\n            Graphics g = e.Graphics;\n            Rectangle bounds = ClientRectangle;\n\n            // draw the button background as according to the current state.\n            if (State != PushButtonState.Pressed && IsDefault && !Application.RenderWithVisualStyles)\n            {\n                Rectangle backgroundBounds = bounds;\n                backgroundBounds.Inflate(-1, -1);\n                ButtonRenderer.DrawButton(g, backgroundBounds, State);\n\n                // button renderer doesnt draw the black frame when themes are off =(\n                g.DrawRectangle(SystemPens.WindowFrame, 0, 0, bounds.Width - 1, bounds.Height - 1);\n            }\n\n            else\n                ButtonRenderer.DrawButton(g, bounds, State);\n\n            // calculate the current dropdown rectangle.\n            m_dropDownRectangle = new Rectangle(bounds.Right - PushButtonWidth - 1, s_borderSize, PushButtonWidth,\n                                                bounds.Height - s_borderSize * 2);\n            int internalBorder = s_borderSize;\n            Rectangle focusRect =\n                new Rectangle(internalBorder,\n                              internalBorder,\n                              bounds.Width - m_dropDownRectangle.Width - internalBorder,\n                              bounds.Height - internalBorder * 2);\n\n            bool drawSplitLine = State == PushButtonState.Hot || State == PushButtonState.Pressed ||\n                                 !Application.RenderWithVisualStyles;\n\n            if (RightToLeft == RightToLeft.Yes)\n            {\n                m_dropDownRectangle.X = bounds.Left + 1;\n                focusRect.X = m_dropDownRectangle.Right;\n                if (drawSplitLine)\n                {\n                    // draw two lines at the edge of the dropdown button\n                    g.DrawLine(SystemPens.ButtonShadow, bounds.Left + PushButtonWidth, s_borderSize, bounds.Left + PushButtonWidth,\n                               bounds.Bottom - s_borderSize);\n                    g.DrawLine(SystemPens.ButtonFace, bounds.Left + PushButtonWidth + 1, s_borderSize,\n                               bounds.Left + PushButtonWidth + 1, bounds.Bottom - s_borderSize);\n                }\n            }\n            else\n            {\n                if (drawSplitLine)\n                {\n                    // draw two lines at the edge of the dropdown button\n                    g.DrawLine(SystemPens.ButtonShadow, bounds.Right - PushButtonWidth, s_borderSize,\n                               bounds.Right - PushButtonWidth, bounds.Bottom - s_borderSize);\n                    g.DrawLine(SystemPens.ButtonFace, bounds.Right - PushButtonWidth - 1, s_borderSize,\n                               bounds.Right - PushButtonWidth - 1, bounds.Bottom - s_borderSize);\n                }\n            }\n\n            // Draw an arrow in the correct location\n            PaintArrow(g, m_dropDownRectangle);\n\n            // Figure out how to draw the text\n            TextFormatFlags formatFlags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter;\n\n            // If we dont' use mnemonic, set formatFlag to NoPrefix as this will show ampersand.\n            if (!UseMnemonic)\n                formatFlags = formatFlags | TextFormatFlags.NoPrefix;\n\n            if (!ShowKeyboardCues)\n                formatFlags = formatFlags | TextFormatFlags.HidePrefix;\n\n            if (!string.IsNullOrEmpty(Text))\n                TextRenderer.DrawText(g, Text, Font, focusRect, SystemColors.ControlText, formatFlags);\n\n            // draw the focus rectangle.\n            if (State != PushButtonState.Pressed && Focused)\n                ControlPaint.DrawFocusRectangle(g, focusRect);\n        }\n\n        private static void PaintArrow(Graphics g, Rectangle dropDownRect)\n        {\n            Point middle = new Point(Convert.ToInt32(dropDownRect.Left + dropDownRect.Width / 2),\n                                     Convert.ToInt32(dropDownRect.Top + dropDownRect.Height / 2));\n\n            //if the width is odd - favor pushing it over one pixel right.\n            middle.X += dropDownRect.Width % 2;\n            Point[] arrow = new[]\n                                {\n                                    new Point(middle.X - 2, middle.Y - 1), new Point(middle.X + 3, middle.Y - 1),\n                                    new Point(middle.X, middle.Y + 2)\n                                };\n            g.FillPolygon(SystemBrushes.ControlText, arrow);\n        }\n\n        private void ShowContextMenuStrip()\n        {\n            if (m_skipNextOpen)\n            {\n                // we were called because we're closing the context menu strip\n                // when clicking the dropdown button.\n                m_skipNextOpen = false;\n                return;\n            }\n\n            //expose an opportunity to modify the context menu\n            ContextMenuShowing?.ThreadSafeInvoke(this, EventArgs.Empty);\n\n            State = PushButtonState.Pressed;\n            if (ContextMenuStrip == null)\n                return;\n\n            ContextMenuStrip.Closing += ContextMenuStrip_Closing;\n            ContextMenuStrip.Show(this, new Point(0, Height), ToolStripDropDownDirection.BelowRight);\n        }\n\n        private void ContextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e)\n        {\n            ContextMenuStrip cms = sender as ContextMenuStrip;\n            if (cms != null)\n                cms.Closing -= ContextMenuStrip_Closing;\n\n            SetButtonDrawState();\n\n            if (e.CloseReason == ToolStripDropDownCloseReason.AppClicked)\n                m_skipNextOpen = m_dropDownRectangle.Contains(PointToClient(Cursor.Position));\n        }\n\n        private void SetButtonDrawState()\n        {\n            if (Bounds.Contains(Parent.PointToClient(Cursor.Position)))\n                State = PushButtonState.Hot;\n            else if (Focused)\n                State = PushButtonState.Default;\n            else\n                State = PushButtonState.Normal;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/Throbber.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// The little \"flower\" displayed on the top right of the characters monitors.\n    /// </summary>\n    public sealed class Throbber : PictureBox\n    {\n        // Static members\n        private static int s_runners;\n        private static Timer s_timer;\n        private static Image s_strobeFrame;\n        private static Image[] s_movingFrames;\n\n        // Instance members\n        private ThrobberState m_state = ThrobberState.Stopped;\n        private bool m_running;\n        private int m_ticks;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public Throbber()\n        {\n            // Initializes the common images\n            if (s_strobeFrame == null)\n                InitImages();\n\n            // Initializes the common timer\n            if (s_timer == null)\n                s_timer = new Timer();\n\n            // Always subscribed to the timer (ridiculous CPU overhead, less work for the GC with no subscriptions/unsubscriptions, cleaner code)\n            s_timer.Tick += TimerTick;\n\n            // Forces the control to be 24*24\n            MinimumSize = new Size(24, 24);\n            MaximumSize = new Size(24, 24);\n        }\n\n        /// <summary>\n        /// Releases the unmanaged resources used by the <see cref=\"T:System.Windows.Forms.PictureBox\"/> \n        /// and optionally releases the managed resources.\n        /// </summary>\n        /// <param name=\"disposing\">true to release managed and unmanaged resources; false to release unmanaged resources only.</param>\n        protected override void Dispose(bool disposing)\n        {\n            s_timer.Tick -= TimerTick;\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Gets or sets the throbber's state.\n        /// </summary>\n        public ThrobberState State\n        {\n            get { return m_state; }\n            set\n            {\n                // Is the state unchanged ? \n                if (value == m_state)\n                    return;\n                m_state = value;\n\n                // Leave it stopped if not visible\n                if (!Visible)\n                    return;\n\n                // Start or stop\n                switch (m_state)\n                {\n                    case ThrobberState.Rotating:\n                    case ThrobberState.Strobing:\n                        Start();\n                        Refresh();\n                        break;\n\n                    default:\n                        Stop();\n                        Invalidate();\n                        break;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Start animating this throbber.\n        /// </summary>\n        private void Start()\n        {\n            // Always refresh the ticks since we're changing the state or becoming visible\n            m_ticks = 0;\n\n            // Is it already running ?\n            if (m_running)\n                return;\n            m_running = true;\n\n            // Start\n            s_runners++;\n            if (s_runners == 1)\n                s_timer.Start();\n        }\n\n        /// <summary>\n        /// Stop animating this throbber\n        /// </summary>\n        private void Stop()\n        {\n            // Is it already stopped ?\n            if (!m_running)\n                return;\n            m_running = false;\n\n            // Stop\n            s_runners--;\n            if (s_runners == 0)\n                s_timer.Stop();\n        }\n\n        /// <summary>\n        /// Occurs when the timer ticks.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void TimerTick(object sender, EventArgs e)\n        {\n            // Invalidates the control\n            Refresh();\n            m_ticks++;\n        }\n\n        /// <summary>\n        /// Handles the painting.\n        /// </summary>\n        /// <param name=\"pe\"></param>\n        protected override void OnPaint(PaintEventArgs pe)\n        {\n            // Calling the base method\n            base.OnPaint(pe);\n\n            Image frame = s_strobeFrame;\n\n            // Select the frame to display\n            switch (m_state)\n            {\n                case ThrobberState.Rotating:\n                    frame = s_movingFrames[m_ticks % s_movingFrames.Length];\n                    break;\n\n                case ThrobberState.Strobing:\n                    if (m_ticks % 10 >= 5)\n                        return;\n                    break;\n            }\n\n            // Draw the selected image\n            pe.Graphics.DrawImage(frame, 0, 0);\n        }\n\n        /// <summary>\n        /// Any time the visibility change, we may start or stop the timer.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnVisibleChanged(EventArgs e)\n        {\n            base.OnVisibleChanged(e);\n\n            // When not visible, stop\n            if (!Visible)\n            {\n                Stop();\n                return;\n            }\n\n            // When animated and visible, restart\n            if (m_state != ThrobberState.Stopped)\n                Start();\n        }\n\n        /// <summary>\n        /// Initialize the images shared by those controls.\n        /// </summary>\n        private static void InitImages()\n        {\n            const int ImageWidth = 24;\n            const int ImageHeight = 24;\n            Image b = Properties.Resources.Throbber;\n\n            //Make the stopped Image\n            s_strobeFrame = new Bitmap(ImageWidth, ImageHeight);\n            using (Graphics g = Graphics.FromImage(s_strobeFrame))\n            {\n                g.DrawImage(b, new Rectangle(0, 0, ImageWidth, ImageHeight), new Rectangle(0, 0, ImageWidth, ImageHeight),\n                            GraphicsUnit.Pixel);\n            }\n\n            //Make the moving Images\n            s_movingFrames = new Image[8];\n            for (int i = 1; i < 9; i++)\n            {\n                Bitmap bmp;\n                using (Bitmap tempBitmap = new Bitmap(ImageWidth, ImageHeight))\n                {\n                    bmp = (Bitmap)tempBitmap.Clone();\n                }\n\n                using (Graphics g = Graphics.FromImage(bmp))\n                {\n                    g.DrawImage(b, new Rectangle(0, 0, ImageWidth, ImageHeight),\n                                new Rectangle(i * ImageWidth, 0, ImageWidth, ImageHeight),\n                                GraphicsUnit.Pixel);\n                }\n                s_movingFrames[i - 1] = bmp;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/TipWindow.Designer.cs",
    "content": "namespace EVEMon.Common.Controls\n{\n    sealed partial class TipWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\n            this.pictureBox = new System.Windows.Forms.PictureBox();\n            this.btnOk = new System.Windows.Forms.Button();\n            this.cbDontShowAgain = new System.Windows.Forms.CheckBox();\n            this.TipLabel = new System.Windows.Forms.Label();\n            this.panel1 = new System.Windows.Forms.Panel();\n            this.tableLayoutPanel1.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();\n            this.panel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // tableLayoutPanel1\n            // \n            this.tableLayoutPanel1.AutoSize = true;\n            this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.tableLayoutPanel1.ColumnCount = 2;\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 225F));\n            this.tableLayoutPanel1.Controls.Add(this.pictureBox, 0, 0);\n            this.tableLayoutPanel1.Controls.Add(this.btnOk, 1, 2);\n            this.tableLayoutPanel1.Controls.Add(this.cbDontShowAgain, 1, 1);\n            this.tableLayoutPanel1.Controls.Add(this.TipLabel, 1, 0);\n            this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3);\n            this.tableLayoutPanel1.Name = \"tableLayoutPanel1\";\n            this.tableLayoutPanel1.RowCount = 3;\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.Size = new System.Drawing.Size(263, 102);\n            this.tableLayoutPanel1.TabIndex = 0;\n            // \n            // pictureBox\n            // \n            this.pictureBox.Location = new System.Drawing.Point(3, 3);\n            this.pictureBox.Name = \"pictureBox\";\n            this.pictureBox.Size = new System.Drawing.Size(32, 32);\n            this.pictureBox.TabIndex = 0;\n            this.pictureBox.TabStop = false;\n            // \n            // btnOk\n            // \n            this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnOk.Location = new System.Drawing.Point(185, 76);\n            this.btnOk.Name = \"btnOk\";\n            this.btnOk.Size = new System.Drawing.Size(75, 23);\n            this.btnOk.TabIndex = 1;\n            this.btnOk.Text = \"Close\";\n            this.btnOk.UseVisualStyleBackColor = true;\n            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);\n            // \n            // cbDontShowAgain\n            // \n            this.cbDontShowAgain.AutoSize = true;\n            this.cbDontShowAgain.Checked = true;\n            this.cbDontShowAgain.CheckState = System.Windows.Forms.CheckState.Checked;\n            this.cbDontShowAgain.Location = new System.Drawing.Point(41, 53);\n            this.cbDontShowAgain.Margin = new System.Windows.Forms.Padding(3, 15, 3, 3);\n            this.cbDontShowAgain.Name = \"cbDontShowAgain\";\n            this.cbDontShowAgain.Size = new System.Drawing.Size(141, 17);\n            this.cbDontShowAgain.TabIndex = 2;\n            this.cbDontShowAgain.Text = \"Don\\'t show this tip again\";\n            this.cbDontShowAgain.UseVisualStyleBackColor = true;\n            // \n            // TipLabel\n            // \n            this.TipLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left)));\n            this.TipLabel.AutoSize = true;\n            this.TipLabel.Location = new System.Drawing.Point(41, 0);\n            this.TipLabel.Name = \"TipLabel\";\n            this.TipLabel.Size = new System.Drawing.Size(42, 38);\n            this.TipLabel.TabIndex = 3;\n            this.TipLabel.Text = \"Tip text\";\n            this.TipLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            // \n            // panel1\n            // \n            this.panel1.AutoSize = true;\n            this.panel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.panel1.Controls.Add(this.tableLayoutPanel1);\n            this.panel1.Location = new System.Drawing.Point(0, 0);\n            this.panel1.Margin = new System.Windows.Forms.Padding(0);\n            this.panel1.Name = \"panel1\";\n            this.panel1.Size = new System.Drawing.Size(271, 110);\n            this.panel1.TabIndex = 1;\n            // \n            // TipWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.BackColor = System.Drawing.SystemColors.Info;\n            this.Controls.Add(this.panel1);\n            this.Name = \"TipWindow\";\n            this.Size = new System.Drawing.Size(271, 110);\n            this.tableLayoutPanel1.ResumeLayout(false);\n            this.tableLayoutPanel1.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();\n            this.panel1.ResumeLayout(false);\n            this.panel1.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\n        private System.Windows.Forms.PictureBox pictureBox;\n        private System.Windows.Forms.Button btnOk;\n        private System.Windows.Forms.CheckBox cbDontShowAgain;\n        private System.Windows.Forms.Label TipLabel;\n        private System.Windows.Forms.Panel panel1;\n\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/TipWindow.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Controls\n{\n    public sealed partial class TipWindow : UserControl\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TipWindow\"/> class.\n        /// </summary>\n        private TipWindow()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TipWindow\" /> class.\n        /// </summary>\n        /// <param name=\"form\">The form.</param>\n        /// <param name=\"title\">The title.</param>\n        /// <param name=\"tiptext\">The tiptext.</param>\n        /// <param name=\"key\">The key.</param>\n        /// <param name=\"checkboxVisible\">if set to <c>true</c> the checkbox is visible.</param>\n        private TipWindow(Form form, string title, string tiptext, string key, bool checkboxVisible)\n            : this()\n        {\n            form.Controls.Add(this);\n\n            Tag = key;\n            cbDontShowAgain.Visible = checkboxVisible;\n            pictureBox.Image = SystemIcons.Information.ToBitmap();\n\n            Text = title;\n            TipLabel.Text = tiptext;\n            // Aligns the top right corner of the tip window with the top right corner of the owner's client rectangle\n            Location = new Point(form.ClientRectangle.Left + form.ClientSize.Width - Width,\n                form.ClientRectangle.Top);\n            Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            BringToFront();\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnOk control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnOk_Click(object sender, EventArgs e)\n        {\n            if (cbDontShowAgain.Checked)\n            {\n                Settings.UI.ConfirmedTips.Add((string)Tag);\n                Settings.Save();\n            }\n\n            Parent.Controls.Remove(this);\n            \n            Dispose();\n        }\n\n        /// <summary>\n        /// Show a \"tip of the day\"-like message on the top right corner of the given window.\n        /// </summary>\n        /// <param name=\"form\">The owner window.</param>\n        /// <param name=\"key\">The key used to store informations about messages the user already saw. Every messages is only displayed once.</param>\n        /// <param name=\"title\">The title of the tip window.</param>\n        /// <param name=\"tiptext\">The text of the tip window.</param>\n        /// <param name=\"checkBoxVisible\">if set to <c>true</c> the checkbox is visible.</param>\n        /// <exception cref=\"System.ArgumentNullException\">form</exception>\n        public static void ShowTip(Form form, string key, string title, string tiptext, bool checkBoxVisible = true)\n        {\n            form.ThrowIfNull(nameof(form));\n\n            if (Settings.UI.ConfirmedTips.Contains(key))\n                return;\n\n            // Quit if it's already shown\n            if (form.Controls.OfType<TipWindow>().Any())\n                return;\n\n            // Gets disposed when clicking the OK button\n            TipWindow tipWindow = new TipWindow(form, title, tiptext, key, checkBoxVisible);\n            tipWindow.Show();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/TipWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Controls/TrayIcon.Designer.cs",
    "content": "namespace EVEMon.Common.Controls\n{\n    partial class TrayIcon\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new System.ComponentModel.Container();\n            this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components);\n            // \n            // notifyIcon\n            // \n            this.notifyIcon.Text = \"notifyIcon1\";\n            this.notifyIcon.Click += new System.EventHandler(this.notifyIcon_Click);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.NotifyIcon notifyIcon;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Controls/TrayIcon.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Threading;\nusing System.Windows.Forms;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing Timer = System.Threading.Timer;\n\nnamespace EVEMon.Common.Controls\n{\n    /// <summary>\n    /// Wrapper class for the NotifyIcon component. Implements the NotifyIcon properties and events\n    /// required for EVEMon usage, and adds MouseHover and MouseLeave events not provided by\n    /// the NotifyIcon class.\n    /// </summary>\n    public partial class TrayIcon : Component\n    {\n        /// <summary>\n        /// Holds the current mouse position state.\n        /// The initial state is <see cref=\"MouseStateOut\"/>. See <see cref=\"TrayIcon.MouseState\"/> for more info.\n        /// </summary>\n        private MouseState m_mouseState;\n\n        private string m_iconText;\n        private int m_mouseHoverTime;\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TrayIcon\"/> class with the specfied container.\n        /// </summary>\n        /// <param name=\"container\">An <see cref=\"System.ComponentModel.IContainer\"/> that represents the container for the <see cref=\"TrayIcon\"/> control.</param>\n        public TrayIcon(IContainer container)\n        {\n            container?.Add(this);\n\n            InitializeComponent();\n\n            m_mouseState = new MouseStateOut(this);\n        }\n\n        #endregion\n\n\n        #region NotifyIcon properties\n\n        /// <summary>\n        /// Gets or sets the current icon.\n        /// </summary>\n        /// <remarks>\n        /// Exposes the value of the underlying <see cref=\"System.Windows.Forms.NotifyIcon.Icon\"/> property.\n        /// </remarks>\n        [Category(\"Appearance\"),\n         Description(\"The icon to display in the system tray\")]\n        public Icon Icon\n        {\n            get { return notifyIcon.Icon; }\n            set { notifyIcon.Icon = new Icon(value, new Size(16, 16)); }\n        }\n\n        /// <summary>\n        /// Gets or sets the ToolTip text displayed when the mouse pointer rests on a notification area icon.\n        /// </summary>\n        /// <remarks>\n        /// Exposes the value of the underlying <see cref=\"System.Windows.Forms.NotifyIcon.Text\"/> property.\n        /// </remarks>\n        [Category(\"Appearance\"),\n         Description(\"The text that will be displayed when the mouse hovers over the icon\")]\n        public string Text\n        {\n            get { return notifyIcon.Text; }\n            set { notifyIcon.Text = value; }\n        }\n\n        /// <summary>\n        /// The length of time, in milliseconds, for which the mouse must remain stationary over the control before the MouseHover event is raised.\n        /// </summary>\n        [Category(\"Behaviour\"),\n         Description(\n             \"The length of time, in milliseconds, for which the mouse must remain stationary over the control before the MouseHover event is raised\"\n             ),\n         DefaultValue(250)]\n        public int MouseHoverTime\n        {\n            get { return m_mouseHoverTime; }\n            set { m_mouseHoverTime = value < 250 ? 250 : value; }\n        }\n\n        /// <summary>\n        /// Gets or sets the shortcut menu associated with the <see cref=\"TrayIcon\"/>.\n        /// </summary>\n        /// <remarks>\n        /// Exposes the value of the underlying <see cref=\"System.Windows.Forms.NotifyIcon.ContextMenuStrip\"/> property.\n        /// </remarks>\n        [Category(\"Behaviour\")]\n        public ContextMenuStrip ContextMenuStrip\n        {\n            get { return notifyIcon.ContextMenuStrip; }\n            set { notifyIcon.ContextMenuStrip = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the icon is visible in the notification area of the taskbar.\n        /// </summary>\n        /// <remarks>\n        /// Exposes the value of the underlying <see cref=\"System.Windows.Forms.NotifyIcon.Visible\"/> property.\n        /// </remarks>\n        [Category(\"Behaviour\"),\n         Description(\"Determines whether the control is visible or hidden\"),\n         DefaultValue(false)]\n        public bool Visible\n        {\n            get { return notifyIcon.Visible; }\n            set { notifyIcon.Visible = value; }\n        }\n\n        #endregion\n\n\n        #region NotifyIcon Event Handler Methods\n\n        /// <summary>\n        /// Propagates the NotifyIcon Click event to our subscribers.\n        /// </summary>\n        private void notifyIcon_Click(object sender, EventArgs e)\n        {\n            OnClick(e);\n        }\n\n        #endregion\n\n\n        #region Events\n\n        /// <summary>\n        /// Raised when the user clicks the icon in the notification area.\n        /// </summary>\n        [Category(\"Action\"),\n         Description(\"Occurs when the icon is clicked\")]\n        public event EventHandler Click;\n\n        /// <summary>\n        /// Raised when the mouse pointer remains stationery over the icon in the notification area.\n        /// for the length of time specified by <see cref=\"TrayIcon.MouseHoverTime\"/>\n        /// </summary>\n        [Category(\"Mouse\"),\n         Description(\"Occurs when the mouse remains stationary inside the control for an amount of time\")]\n        public event EventHandler MouseHover;\n\n        /// <summary>\n        /// Raised when the mouse pointer moves away from the icon in the notification area after it has been hovering over the icon.\n        /// </summary>\n        [Category(\"Mouse\"),\n         Description(\"Occurs when the mouse leaves the visible part of the control\")]\n        public event EventHandler MouseLeave;\n\n        #endregion\n\n\n        #region Event methods\n\n        /// <summary>\n        /// Raises the Click event.\n        /// </summary>\n        private void OnClick(EventArgs e)\n        {\n            Click?.ThreadSafeInvoke(this, e);\n        }\n\n        /// <summary>\n        /// Raises the MouseHover event.\n        /// </summary>\n        private void OnMouseHover(EventArgs e)\n        {\n            MouseHover?.ThreadSafeInvoke(this, e);\n        }\n\n        /// <summary>\n        /// Raises the MouseLeave event.\n        /// </summary>\n        private void OnMouseLeave(EventArgs e)\n        {\n            MouseLeave?.ThreadSafeInvoke(this, e);\n        }\n\n        #endregion\n\n\n        #region Static Popup management methods\n\n        /// <summary>\n        /// Sets the tool tip location.\n        /// </summary>\n        /// <param name=\"tooltipForm\">The tooltip form.</param>\n        /// <exception cref=\"System.ArgumentNullException\">tooltipForm</exception>\n        public static void SetToolTipLocation(Form tooltipForm)\n        {\n            tooltipForm.ThrowIfNull(nameof(tooltipForm));\n\n            Point mp = Control.MousePosition;\n            NativeMethods.AppBarData appBarData = NativeMethods.AppBarData.Create();\n            NativeMethods.SHAppBarMessage(NativeMethods.ABM_GETTASKBARPOS, ref appBarData);\n            NativeMethods.RECT taskBarLocation = appBarData.Rect;\n\n            Screen curScreen = Screen.FromPoint(mp);\n            Point winPoint;\n            bool slideLeftRight;\n            switch (appBarData.UEdge)\n            {\n                default:\n                    winPoint = mp;\n                    slideLeftRight = true;\n                    break;\n                case NativeMethods.ABE_BOTTOM:\n                    winPoint = new Point(mp.X, taskBarLocation.Top - tooltipForm.Height);\n                    slideLeftRight = true;\n                    break;\n                case NativeMethods.ABE_TOP:\n                    winPoint = new Point(mp.X, taskBarLocation.Bottom);\n                    slideLeftRight = true;\n                    break;\n                case NativeMethods.ABE_LEFT:\n                    winPoint = new Point(taskBarLocation.Right, mp.Y);\n                    slideLeftRight = false;\n                    break;\n                case NativeMethods.ABE_RIGHT:\n                    winPoint = new Point(taskBarLocation.Left - tooltipForm.Width, mp.Y);\n                    slideLeftRight = false;\n                    break;\n            }\n\n            if (slideLeftRight)\n            {\n                if (winPoint.X + tooltipForm.Width > curScreen.Bounds.Right)\n                    winPoint = new Point(curScreen.Bounds.Right - tooltipForm.Width - 1, winPoint.Y);\n\n                if (winPoint.X < curScreen.Bounds.Left)\n                    winPoint = new Point(curScreen.Bounds.Left + 2, winPoint.Y);\n            }\n            else\n            {\n                if (winPoint.Y + tooltipForm.Height > curScreen.Bounds.Bottom)\n                    winPoint = new Point(winPoint.X, curScreen.Bounds.Bottom - tooltipForm.Height - 1);\n\n                if (winPoint.Y < curScreen.Bounds.Top)\n                    winPoint = new Point(winPoint.X, curScreen.Bounds.Top + 2);\n            }\n\n            tooltipForm.Location = winPoint;\n        }\n\n        #endregion\n\n\n        #region State Management\n\n\n        #region Private Abstract Class \"MouseState\"\n\n        /// <summary>\n        /// Abstract base class for monitoring mouse state through the derived concrete classes\n        /// </summary>\n        /// <remarks>\n        /// Provides methods for monitoring mouse position and changing state\n        /// </remarks>\n        private abstract class MouseState\n        {\n            /// <summary>\n            /// Thread syncronisation lock. Used extensively to enusre that mouseMove event handlers\n            /// and thread timer callbacks always have a consistent object state.\n            /// </summary>\n            protected readonly object SyncLock = new object();\n\n            /// <summary>\n            /// Flag to determine if mouse tracking enabled\n            /// </summary>\n            private bool m_mouseTrackingEnabled;\n\n            /// <summary>\n            /// Specifies a mouse state\n            /// </summary>\n            protected enum States\n            {\n                MouseOut,\n                MouseOver,\n                MouseHovering\n            };\n\n            /// <summary>\n            /// Initialises a new instance of the <see cref=\"MouseState\"/> class with the given trayIcon and mousePosition.\n            /// </summary>\n            /// <param name=\"trayIcon\">The <see cref=\"TrayIcon\"/> whose state is being managed.</param>\n            /// <param name=\"mousePosition\">A <see cref=\"System.Drawing.Point\"/> representing the last known mouse location.</param>\n            protected MouseState(TrayIcon trayIcon, Point mousePosition)\n            {\n                TrayIcon = trayIcon;\n                MousePosition = mousePosition;\n            }\n\n            /// <summary>\n            /// A <see cref=\"System.Drawing.Point\"/> holding the last known mouse position\n            /// </summary>\n            protected Point MousePosition { get; private set; }\n\n            /// <summary>\n            /// The <see cref=\"TrayIcon\"/> whose MouseState we are managing\n            /// </summary>\n            protected TrayIcon TrayIcon { get; }\n\n            /// <summary>\n            /// Enables the mouse tracking.\n            /// </summary>\n            protected void EnableMouseTracking()\n            {\n                lock (SyncLock)\n                {\n                    // Add event handler for mouse movement\n                    TrayIcon.notifyIcon.MouseMove += notifyIcon_MouseMove;\n                    m_mouseTrackingEnabled = true;\n                }\n            }\n\n            /// <summary>\n            /// Disables the mouse tracking.\n            /// </summary>\n            protected void DisableMouseTracking()\n            {\n                lock (SyncLock)\n                {\n                    if (!m_mouseTrackingEnabled)\n                        return;\n\n                    // Unsubscribe this MouseState from the notify icon MouseMove event\n                    TrayIcon.notifyIcon.MouseMove -= notifyIcon_MouseMove;\n                    m_mouseTrackingEnabled = false;\n                }\n            }\n\n            /// <summary>\n            /// Event handler to track the position of the mouse over the notification area icon.\n            /// </summary>\n            /// <param name=\"sender\"></param>\n            /// <param name=\"e\"></param>\n            private void notifyIcon_MouseMove(object sender, MouseEventArgs e)\n            {\n                // Lock syncLock to ensure that further events block until\n                // we've handled this one\n                lock (SyncLock)\n                {\n                    // Only cascade the event if mouse tracking still active\n                    if (!m_mouseTrackingEnabled)\n                        return;\n\n                    MousePosition = Control.MousePosition;\n                    OnMouseMove();\n                }\n            }\n\n            /// <summary>\n            /// Virtual stub overridden by derived classes to capture mouse movement.\n            /// </summary>\n            protected virtual void OnMouseMove()\n            {\n            }\n\n            /// <summary>\n            /// Changes the state of the parent <see cref=\"TrayIcon\"/>.\n            /// </summary>\n            /// <param name=\"state\">A <see cref=\"MouseState.States\"/> indicating the state to change to.</param>\n            protected void ChangeState(States state)\n            {\n                // Change the parent TrayIcon's state\n                switch (state)\n                {\n                    case States.MouseOut:\n                        // Restore the default icon text\n                        TrayIcon.notifyIcon.Text = TrayIcon.m_iconText;\n                        TrayIcon.m_mouseState = new MouseStateOut(TrayIcon);\n                        break;\n                    case States.MouseOver:\n                        TrayIcon.m_mouseState = GetMouseStateOver();\n                        break;\n                    case States.MouseHovering:\n                        TrayIcon.m_mouseState = GetMouseStateHovering();\n                        break;\n                }\n            }\n\n            /// <summary>\n            /// Gets the mouse state over.\n            /// </summary>\n            /// <returns></returns>\n            private MouseStateOver GetMouseStateOver() => new MouseStateOver(TrayIcon, MousePosition);\n\n            /// <summary>\n            /// Gets the mouse state hovering.\n            /// </summary>\n            /// <returns></returns>\n            private MouseStateHovering GetMouseStateHovering() => new MouseStateHovering(TrayIcon, MousePosition);\n        }\n\n        #endregion\n\n\n        #region Private Class \"MouseStateOut\"\n\n        /// <summary>\n        /// The initial state for mouse tracking.\n        /// </summary>\n        /// <remarks>\n        /// State is changed to <see cref=\"TrayIcon.MouseStateOver\"/> when the mouses moves over the icon.\n        /// </remarks>\n        private class MouseStateOut : MouseState\n        {\n            /// <summary>\n            /// Initializes a new instance of the <see cref=\"TrayIcon.MouseStateOut\"/> class for a given trayIcon.\n            /// </summary>\n            /// <param name=\"trayIcon\">A <see cref=\"TrayIcon\"/> whose state we are managing.</param>\n            public MouseStateOut(TrayIcon trayIcon)\n                : base(trayIcon, new Point(0, 0))\n            {\n                EnableMouseTracking();\n            }\n\n            /// <summary>\n            /// Overrides the base OnMouseMove method to change state to MouseOver when we capture a MouseMove event\n            /// from the parent TrayIcon's underlying NotifyIcon.\n            /// </summary>\n            protected override void OnMouseMove()\n            {\n                DisableMouseTracking();\n                ChangeState(States.MouseOver);\n            }\n        }\n\n        #endregion\n\n\n        #region Private Class \"MouseStateOver\"\n\n        /// <summary>\n        /// Mouse tracking state where the mouse has moved over the tray icon\n        /// but we haven't established a hover state. To move to MouseStateHovering\n        /// the mouse must remain stationary for the length of time specified\n        /// by TrayIcon.MouseHoverTime.\n        /// </summary>\n        private sealed class MouseStateOver : MouseState, IDisposable\n        {\n            /// <summary>\n            /// A <see cref=\"System.Threading.Timer\"/> used to monitor mouse hover.\n            /// </summary>\n            private Timer m_timer;\n\n            /// <summary>\n            /// Initialises a new instance of the <see cref=\"MouseState\"/> class with the given trayIcon and mousePosition.\n            /// </summary>\n            /// <param name=\"trayIcon\">The <see cref=\"TrayIcon\"/> whose state is being managed.</param>\n            /// <param name=\"mousePosition\">A <see cref=\"System.Drawing.Point\"/> representing the last known mouse location.</param>\n            public MouseStateOver(TrayIcon trayIcon, Point mousePosition)\n                : base(trayIcon, mousePosition)\n            {\n                // Store the existing icon text, then reset it if popups aren't disabled\n                trayIcon.m_iconText = trayIcon.notifyIcon.Text;\n                if (Settings.UI.SystemTrayPopup.Style != TrayPopupStyles.Disabled)\n                    trayIcon.notifyIcon.Text = string.Empty;\n\n                // Start the timer and enable mouse tracking\n                // Lock the syncLock since we don't know the timeout value and need to ensure\n                // initialisation completes before the timeout occurs\n                lock (SyncLock)\n                {\n                    // Start the hover timer\n                    m_timer = new Timer(HoverTimeout, null, TrayIcon.m_mouseHoverTime, Timeout.Infinite);\n\n                    // Start tracking the mouse\n                    EnableMouseTracking();\n                }\n            }\n\n            /// <summary>\n            /// A <see cref=\"System.Threading.TimerCallback\"/> method invoked when the hover timer expires.\n            /// </summary>\n            /// <remarks>\n            /// If the mouse position is unchanged from the last captured mouse position we change to MouseHovering state\n            /// otherwise we change to MouseOut.\n            /// </remarks>\n            /// <param name=\"state\"></param>\n            private void HoverTimeout(object state)\n            {\n                lock (SyncLock)\n                {\n                    // We may have multiple callbacks pending because the threads in the threadpool were busy waiting for our requests to CCP\n                    // As a result, they're going to execute one after the other one, raising ObjectDisposedException when trying to stops the timer\n                    if (m_timer == null)\n                        return;\n\n                    // Stops and disposes the timer\n                    try\n                    {\n                        // Stop the timer in case its been restarted by a MouseMove\n                        // in the event we were blocked\n                        m_timer.Change(0, 0);\n                    }\n                    finally\n                    {\n                        // Dispose of the timer since we're done with it\n                        Dispose();\n                    }\n\n                    // Mouse tracking no longer required\n                    DisableMouseTracking();\n\n                    // Check if the mouse is still in the same place\n                    // Since we update mousePosition and reset the timer on MouseMove events, if it has moved\n                    // when HoverTimeout is called it means its no longer over the icon\n                    ChangeState(Control.MousePosition == MousePosition ? States.MouseHovering : States.MouseOut);\n                }\n            }\n\n            /// <summary>\n            /// Overrides the base OnMouseMove method to reset the hover timer if the mouse moves while over the notification area icon.\n            /// </summary>\n            protected override void OnMouseMove()\n            {\n                try\n                {\n                    // Mouse has moved, so reset the hover timer\n                    m_timer.Change(TrayIcon.m_mouseHoverTime, Timeout.Infinite);\n                }\n                catch (ObjectDisposedException)\n                {\n                    // Swallow any disposed exceptions\n                    // Can only occur if timings cause a MouseMove after we've disposed of the timer\n                    // Shouldn't happen, but catch it just in case\n                }\n            }\n\n            /// <summary>\n            /// Releases unmanaged and - optionally - managed resources\n            /// </summary>\n            /// <param name=\"disposing\"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>\n            private void Dispose(bool disposing)\n            {\n                if (!disposing)\n                    return;\n\n                // Dispose timer\n                m_timer.Dispose();\n                m_timer = null;\n            }\n\n            /// <summary>\n            /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.\n            /// </summary>\n            public void Dispose()\n            {\n                Dispose(true);\n            }\n        }\n\n        #endregion\n\n\n        #region Private Class \"MouseStateHovering\"\n\n        /// <summary>\n        /// The hover state reached when the mouse has been stationary over the notification icon\n        /// for at least the length of time specified by <see cref=\"TrayIcon.MouseHoverTime\"/>.\n        /// Fires the parent TrayIcon's MouseHover event on entry.\n        /// </summary>\n        /// <remarks>\n        /// The mouse position is monitored every 100ms. If the mouse position changes but does not match\n        /// the position from the last MouseMove event, we assume the mouse has moved away and fire\n        /// the parent TrayIcon's MouseLeave event.\n        /// </remarks>\n        private sealed class MouseStateHovering : MouseState, IDisposable\n        {\n            private Timer m_timer;\n\n            /// <summary>\n            /// Initialises a new instance of the <see cref=\"MouseState\"/> class with the given trayIcon and mousePosition.\n            /// </summary>\n            /// <param name=\"trayIcon\">The <see cref=\"TrayIcon\"/> whose state is being managed.</param>\n            /// <param name=\"mousePosition\">A <see cref=\"System.Drawing.Point\"/> representing the last known mouse location.</param>\n            public MouseStateHovering(TrayIcon trayIcon, Point mousePosition)\n                : base(trayIcon, mousePosition)\n            {\n                // Fire the MouseHover event\n                TrayIcon.OnMouseHover(new EventArgs());\n\n                // Lock the syncLock to make sure the timer is initialised before mouse events are handled\n                lock (SyncLock)\n                {\n                    // Start the timer to monitor mouse position\n                    m_timer = new Timer(MouseMonitor, null, 100, Timeout.Infinite);\n\n                    // Start tracking the mouse\n                    EnableMouseTracking();\n                }\n            }\n\n            /// <summary>\n            /// A <see cref=\"System.Threading.TimerCallback\"/> method invoked to monitor mouse position.\n            /// </summary>\n            /// <remarks>\n            /// Called every 100ms so long as the mouse does not move.\n            /// If the mouse moves, fire the parent TrayIcon's MouseLeave event and changes state to MouseOut.\n            /// </remarks>\n            /// <param name=\"state\"></param>\n            private void MouseMonitor(object state)\n            {\n                lock (SyncLock)\n                {\n                    // We may have multiple callbacks pending because the threads in the threadpool were busy waiting for our requests to CCP\n                    // As a result, they're going to execute one after the other one, raising ObjectDisposedException when trying to stops the timer\n                    if (m_timer == null)\n                        return;\n\n                    if (Control.MousePosition == MousePosition)\n                    {\n                        // Mouse hasn't moved so check back in 100ms\n                        m_timer.Change(100, Timeout.Infinite);\n                        return;\n                    }\n\n                    // Mouse has moved, and since we're tracking it over the icon this means its moved away\n                    // Dispose of the timer since we're done with it\n                    Dispose();\n\n                    // Switch of mouse tracking\n                    DisableMouseTracking();\n\n                    // Fire the MouseLeave event\n                    TrayIcon.OnMouseLeave(new EventArgs());\n\n                    // Change to MouseOut state\n                    ChangeState(States.MouseOut);\n                }\n            }\n\n            /// <summary>\n            /// Releases unmanaged and - optionally - managed resources\n            /// </summary>\n            /// <param name=\"disposing\"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>\n            private void Dispose(bool disposing)\n            {\n                if (!disposing)\n                    return;\n\n                // Dispose timer\n                m_timer.Dispose();\n                m_timer = null;\n            }\n\n            /// <summary>\n            /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.\n            /// </summary>\n            public void Dispose()\n            {\n                Dispose(true);\n            }\n        }\n\n        #endregion\n\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/TrayIcon.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"notifyIcon.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"$this.TrayLargeIcon\" type=\"System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>False</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Controls/TreeView.cs",
    "content": "// *****************************************************************************\n// \n//  Copyright 2004, Coder's Lab\n//  All rights reserved. The software and associated documentation \n//  supplied hereunder are the proprietary information of Coder's Lab\n//  and are supplied subject to licence terms.\n//  \n//  If you modify this code, add your code comments and sent the modified code\n//  to coder's lab.\n//\n//  You can use this control freely in your projects, but let me know if you\n//  are using it so I can add you to a list of references. \n//\n//  Email: ludwig.stuyck@coders-lab.be\n//  Home page: http://www.coders-lab.be\n//\n//  History\n//\t\t18/07/2004\t\n//\t\t\t- Control creation\t\n//\t\t24/07/2004\t\n//\t\t\t- Implemented rubberband selection; also combination keys work: \n//\t\t\t  ctrl, shift, ctrl+shift\t\n//\t\t25/08/2004\t\n//\t\t\t- Rubberband selection temporary removed due to scrolling problems. \n//\t\t\t- Renamed TreeViewSelectionMode property to SelectionMode.\n//\t\t\t- Renamed SelectionModes enumeration to TreeViewSelectionMode.\n//\t\t\t- Added MultiSelectSameParent selection mode.\n//\t\t\t- Added keyboard functionality.\n//\t\t\t- Enhanced selection drawing.\n//\t\t\t- Added SelectionBackColor property.\t\n//\t\t02/09/2004\t\n//\t\t\t- When shift/ctrl was pressed, treeview scrolled to last selected \n//\t\t\t  node. Fixed.\n//\t\t\t- Moved TreeViewSelectionMode outside the TreeView class.\n//\t\t\t- BeforeSelect was fired multiple times, AfterSelect was never \n//\t\t\t  fired. Fixed.\n//\t\t\t- Collapsing/Expanding node changed selection. This does not happen \n//\t\t\t  anymore, except if a node that has selected descendants is \n//\t\t\t  collapsed; then all descendants are unselected and the collapsed \n//\t\t\t  node becomes selected.\n//\t\t\t- If in the BeforeSelect event, e.Cancel is set to true, then node \n//\t\t\t  will not be selected\n//\t\t\t- SHIFT selection sometimes didnt behave correctly. Fixed.\n//\t\t04/09/2004\t\n//\t\t\t- SelectedNodes is no longer an array of tree nodes, but a \n//\t\t\t  SelectedNodesCollection\n//\t\t\t- In the AfterSelect event, the SelectedNodes contained two tree \n//\t\t\t  nodes; the old one and the new one. Fixed.\n//\t\t05/09/2004\t\n//\t\t\t- Added Home, End, PgUp and PgDwn keys functionality\t\n//\t\t08/10/2004\n//\t\t\t- SelectedNodeCollection renamed to NodeCollection\n//\t\t\t- Fixes by GKM\n//\n//\t\t18/8/2005\n//\t\t\t- Added events BeforeDeselect and AfterDeselect\n//\t\t09/5/2007\n//\t\t\t- Added an InvokeRequired check to Flashnode()\n//\t\t16/5/2007\n//\t\t\t- Gave the document a consistant format\n//\t\t\t- Created a new event 'SelectionsChanged'\n// \n// *****************************************************************************\n\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Threading;\nusing System.Windows.Forms;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Controls\n{\n\n\n    #region TreeViewSelectionMode enumeration\n\n    /// <summary>\n    /// Selection mode for the treeview.\t\n    /// </summary>\n    /// <remarks>\n    /// The Selection mode determines how treeview nodes can be selected.\n    /// </remarks>\n    public enum TreeViewSelectionMode\n    {\n        /// <summary>\n        /// Only one node can be selected at a time.\n        /// </summary>\n        SingleSelect,\n\n        /// <summary>\n        /// Multiple nodes can be selected at the same time without restriction.\n        /// </summary>\n        MultiSelect,\n\n        /// <summary>\n        /// Multiple nodes that belong to the same root branch can be selected at the same time.\n        /// </summary>\n        MultiSelectSameRootBranch,\n\n        /// <summary>\n        /// Multiple nodes that belong to the same level can be selected at the same time.\n        /// </summary>\n        MultiSelectSameLevel,\n\n        /// <summary>\n        /// Multiple nodes that belong to the same level and same root branch can be selected at the same time.\n        /// </summary>\n        MultiSelectSameLevelAndRootBranch,\n\n        /// <summary>\n        /// Only nodes that belong to the same direct parent can be selected at the same time.\n        /// </summary>\n        MultiSelectSameParent\n    }\n\n    #endregion\n\n\n    #region Delegates\n\n    /// <summary>\n    /// Delegate used for tree node events.\n    /// </summary>\n    public delegate void TreeNodeEventHandler(TreeNode tn);\n\n    #endregion\n\n\n    /// <summary>\n    /// The TreeView control is a regular treeview with multi-selection capability.\n    /// </summary>\n    [ToolboxItem(true)]\n    public class TreeView : System.Windows.Forms.TreeView\n    {\n        public event TreeViewEventHandler AfterDeselect;\n        public event TreeViewEventHandler BeforeDeselect;\n        public event EventHandler SelectionsChanged;\n\n        protected void OnAfterDeselect(TreeNode tn)\n        {\n            AfterDeselect?.Invoke(this, new TreeViewEventArgs(tn));\n        }\n\n        protected void OnBeforeDeselect(TreeNode tn)\n        {\n            BeforeDeselect?.Invoke(this, new TreeViewEventArgs(tn));\n        }\n\n        protected void OnSelectionsChanged()\n        {\n            if (!m_blnSelectionChanged)\n                return;\n\n            SelectionsChanged?.ThreadSafeInvoke(this, new EventArgs());\n        }\n\n\n        #region Private variables\n\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private Container m_components;\n\n        /// <summary>\n        /// Used to make sure that SelectedNode can only be used from within this class.\n        /// </summary>\n        private bool m_blnInternalCall;\n\n        /// <summary>\n        /// List that contains all selected nodes.\n        /// </summary>\n        private readonly List<object> m_listSelectedNodes = new List<object>();\n\n        /// <summary>\n        /// Track whether the total SelectedNodes changed across multiple operations\n        /// for SelectionsChanged event\n        /// </summary>\n        private bool m_blnSelectionChanged;\n\n        /// <summary>\n        /// Hashtable to preserve Node's original colors (colors can be set on the TreeView, or individual nodes)\n        /// (GKM)\n        /// </summary>\n        private readonly Hashtable m_htblSelectedNodesOrigColors = new Hashtable();\n\n        /// <summary>\n        /// Keeps track of node that has to be pu in edit mode.\n        /// </summary>\n        private TreeNode m_tnNodeToStartEditOn;\n\n        /// <summary>\n        /// Remembers whether mouse click on a node was single or double click.\n        /// </summary>\n        private bool m_blnWasDoubleClick;\n\n        /// <summary>\n        /// Keeps track of most recent selected node.\n        /// </summary>\n        private TreeNode m_tnMostRecentSelectedNode;\n\n        /// <summary>\n        /// Keeps track of the selection mirror point; this is the last selected node without SHIFT key pressed.\n        /// It is used as the mirror node during SHIFT selection.\n        /// </summary>\n        private TreeNode m_tnSelectionMirrorPoint;\n\n        /// <summary>\n        /// Keeps track of the number of mouse clicks.\n        /// </summary>\n        private int m_intMouseClicks;\n\n        /// <summary>\n        /// Selection mode.\n        /// </summary>\n        private TreeViewSelectionMode m_selectionMode = TreeViewSelectionMode.SingleSelect;\n\n        /// <summary>\n        /// Backcolor for selected nodes.\n        /// </summary>\n        private Color m_selectionBackColor = SystemColors.Highlight;\n\n        /// <summary>\n        /// Keeps track whether a node click has been handled by the mouse down event. This is almost always the\n        /// case, except when a selected node has been clicked again. Then, it will not be handled in the mouse\n        /// down event because we might want to drag the node and if that's the case, node should not go in edit \n        /// mode.\n        /// </summary>\n        private bool m_blnNodeProcessedOnMouseDown;\n\n        /// <summary>\n        /// Holds node that needs to be flashed.\n        /// </summary>\n        private TreeNode m_tnToFlash;\n\n        /// <summary>\n        /// Keeps track of the first selected node when selection has begun with the keyboard.\n        /// </summary>\n        private TreeNode m_tnKeysStartNode;\n\n        #endregion\n\n\n        #region SelectedNode, SelectionMode, SelectionBackColor, SelectedNodes + events\n\n        /// <summary>\n        /// This property is for internal use only. Use SelectedNodes instead.\n        /// </summary>\n        public new TreeNode SelectedNode\n        {\n            get\n            {\n                // Instead of not working, return the most recent selected node\n                //throw new NotSupportedException(\"Use SelectedNodes instead of SelectedNode.\");\n                return !m_blnInternalCall ? m_tnMostRecentSelectedNode : base.SelectedNode;\n            }\n            set\n            {\n                if (!m_blnInternalCall)\n                    base.SelectedNode = value;\n            }\n        }\n\n        /// <summary>\n        /// Gets/sets selection mode.\n        /// </summary>\n        public TreeViewSelectionMode SelectionMode\n        {\n            get { return m_selectionMode; }\n            set { m_selectionMode = value; }\n        }\n\n        /// <summary>\n        /// Gets/sets backcolor for selected nodes.\n        /// </summary>\n        public Color SelectionBackColor\n        {\n            get { return m_selectionBackColor; }\n            set { m_selectionBackColor = value; }\n        }\n\n        /// <summary>\n        /// Gets selected nodes.\n        /// </summary>\n        public NodesCollection SelectedNodes\n        {\n            get\n            {\n                // Create a SelectedNodesCollection to return, and add event handlers to catch actions on it\n                NodesCollection selectedNodesCollection = new NodesCollection();\n                foreach (TreeNode tn in m_listSelectedNodes)\n                {\n                    selectedNodesCollection.Add(tn);\n                }\n\n                selectedNodesCollection.TreeNodeAdded += SelectedNodes_TreeNodeAdded;\n                selectedNodesCollection.TreeNodeInserted += SelectedNodes_TreeNodeInserted;\n                selectedNodesCollection.TreeNodeRemoved += SelectedNodes_TreeNodeRemoved;\n                selectedNodesCollection.SelectedNodesCleared += SelectedNodes_SelectedNodesCleared;\n\n                return selectedNodesCollection;\n            }\n        }\n\n        /// <summary>\n        /// Gets the last selected node.\n        /// </summary>\n        public TreeNode LastSelectedNode => m_tnMostRecentSelectedNode;\n\n        /// <summary>\n        /// Occurs when a tree node is added to the SelectedNodes collection.\n        /// </summary>\n        /// <param name=\"tn\">Tree node that was added.</param>\n        private void SelectedNodes_TreeNodeAdded(TreeNode tn)\n        {\n            m_blnSelectionChanged = false;\n\n            SelectNode(tn, true, TreeViewAction.Unknown);\n\n            OnSelectionsChanged();\n        }\n\n        /// <summary>\n        /// Occurs when a tree node is inserted to the SelectedNodes collection.\n        /// </summary>\n        /// <param name=\"tn\">tree node that was inserted.</param>\n        private void SelectedNodes_TreeNodeInserted(TreeNode tn)\n        {\n            m_blnSelectionChanged = false;\n\n            SelectNode(tn, true, TreeViewAction.Unknown);\n\n            OnSelectionsChanged();\n        }\n\n        /// <summary>\n        /// Occurs when a tree node is removed from the SelectedNodes collection.\n        /// </summary>\n        /// <param name=\"tn\">Tree node that was removed.</param>\n        private void SelectedNodes_TreeNodeRemoved(TreeNode tn)\n        {\n            m_blnSelectionChanged = false;\n\n            SelectNode(tn, false, TreeViewAction.Unknown);\n\n            OnSelectionsChanged();\n        }\n\n        /// <summary>\n        /// Occurs when the SelectedNodes collection was cleared.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void SelectedNodes_SelectedNodesCleared(object sender, EventArgs e)\n        {\n            m_blnSelectionChanged = false;\n\n            UnselectAllNodes(TreeViewAction.Unknown);\n\n            OnSelectionsChanged();\n        }\n\n        #endregion\n\n\n        #region Node selection methods\n\n        /// <summary>\n        /// Unselects all selected nodes.\n        /// </summary>\n        internal void UnselectAllNodes()\n        {\n            UnselectAllNodesExceptNode(null, TreeViewAction.Unknown);\n        }\n\n        /// <summary>\n        /// Unselects all selected nodes.\n        /// </summary>\n        /// <param name=\"tva\">Specifies the action that caused the selection change.</param>\n        private void UnselectAllNodes(TreeViewAction tva)\n        {\n            UnselectAllNodesExceptNode(null, tva);\n        }\n\n        /// <summary>\n        /// Unselects all selected nodes that don't belong to the specified level.\n        /// </summary>\n        /// <param name=\"level\">Node level.</param>\n        /// <param name=\"tva\">Specifies the action that caused the selection change.</param>\n        private void UnselectAllNodesNotBelongingToLevel(int level, TreeViewAction tva)\n        {\n            // First, build list of nodes that need to be unselected\n            ArrayList arrNodesToDeselect = new ArrayList();\n            foreach (TreeNode selectedTreeNode in m_listSelectedNodes.Cast<TreeNode>().Where(\n                selectedTreeNode => GetNodeLevel(selectedTreeNode) != level))\n            {\n                arrNodesToDeselect.Add(selectedTreeNode);\n            }\n\n            // Do the actual unselect\n            foreach (TreeNode tnToDeselect in arrNodesToDeselect)\n            {\n                SelectNode(tnToDeselect, false, tva);\n            }\n        }\n\n        /// <summary>\n        /// Unselects all selected nodes that don't belong directly to the specified parent.\n        /// </summary>\n        /// <param name=\"parent\">Parent node.</param>\n        /// <param name=\"tva\">Specifies the action that caused the selection change.</param>\n        private void UnselectAllNodesNotBelongingDirectlyToParent(TreeNode parent, TreeViewAction tva)\n        {\n            // First, build list of nodes that need to be unselected\n            ArrayList arrNodesToDeselect = new ArrayList();\n            foreach (TreeNode selectedTreeNode in m_listSelectedNodes.Cast<TreeNode>().Where(\n                selectedTreeNode => selectedTreeNode.Parent != parent))\n            {\n                arrNodesToDeselect.Add(selectedTreeNode);\n            }\n\n            // Do the actual unselect\n            foreach (TreeNode tnToDeselect in arrNodesToDeselect)\n            {\n                SelectNode(tnToDeselect, false, tva);\n            }\n        }\n\n        /// <summary>\n        /// Unselects all selected nodes that don't belong directly or indirectly to the specified parent.\n        /// </summary>\n        /// <param name=\"parent\">Parent node.</param>\n        /// <param name=\"tva\">Specifies the action that caused the selection change.</param>\n        private void UnselectAllNodesNotBelongingToParent(TreeNode parent, TreeViewAction tva)\n        {\n            // First, build list of nodes that need to be unselected\n            ArrayList arrNodesToDeselect = new ArrayList();\n            foreach (TreeNode selectedTreeNode in m_listSelectedNodes.Cast<TreeNode>().Where(\n                selectedTreeNode => !IsChildOf(selectedTreeNode, parent)))\n            {\n                arrNodesToDeselect.Add(selectedTreeNode);\n            }\n\n            // Do the actual unselect\n            foreach (TreeNode tnToDeselect in arrNodesToDeselect)\n            {\n                SelectNode(tnToDeselect, false, tva);\n            }\n        }\n\n        /// <summary>\n        /// Unselects all selected nodes, except for the specified node which should not be touched.\n        /// </summary>\n        /// <param name=\"nodeKeepSelected\">Node not to touch.</param>\n        /// <param name=\"tva\">Specifies the action that caused the selection change.</param>\n        internal void UnselectAllNodesExceptNode(TreeNode nodeKeepSelected, TreeViewAction tva)\n        {\n            // First, build list of nodes that need to be unselected\n            ArrayList arrNodesToDeselect = new ArrayList();\n            foreach (TreeNode selectedTreeNode in m_listSelectedNodes)\n            {\n                if (nodeKeepSelected == null)\n                    arrNodesToDeselect.Add(selectedTreeNode);\n                else if (selectedTreeNode != nodeKeepSelected)\n                    arrNodesToDeselect.Add(selectedTreeNode);\n            }\n\n            // Do the actual unselect\n            foreach (TreeNode tnToDeselect in arrNodesToDeselect)\n            {\n                SelectNode(tnToDeselect, false, tva);\n            }\n        }\n\n        /// <summary>\n        /// occurs when a node is about to be selected.\n        /// </summary>\n        /// <param name=\"e\">TreeViewCancelEventArgs.</param>\n        protected override void OnBeforeSelect(TreeViewCancelEventArgs e)\n        {\n            // We don't want the base TreeView to handle the selection, because it can only handle single selection. \n            // Instead, we'll handle the selection ourselves by keeping track of the selected nodes and drawing the \n            // selection ourselves.\n            e.Cancel = true;\n        }\n\n        /// <summary>\n        /// Determines whether the specified node is selected or not.\n        /// </summary>\n        /// <param name=\"tn\">Node to check.</param>\n        /// <returns>True if specified node is selected, false if not.</returns>\n        private bool IsNodeSelected(TreeNode tn) => tn != null && m_listSelectedNodes.Contains(tn);\n\n        /// <summary>\n        /// Preserves the nodes color.\n        /// </summary>\n        /// <param name=\"tn\">Node to check.</param>\n        private void PreserveNodeColors(TreeNode tn)\n        {\n            if (tn == null)\n                return;\n\n            if (!m_htblSelectedNodesOrigColors.ContainsKey(tn.GetHashCode()))\n                m_htblSelectedNodesOrigColors.Add(tn.GetHashCode(), new[] { tn.BackColor, tn.ForeColor });\n        }\n\n        /// <summary>\n        /// (Un)selects the specified node.\n        /// </summary>\n        /// <param name=\"tn\">Node to (un)select.</param>\n        /// <param name=\"select\">True to select node, false to unselect node.</param>\n        /// <param name=\"tva\">Specifies the action that caused the selection change.</param>\n        /// <returns>True if node was selected, false if not.</returns>\n        internal void SelectNode(TreeNode tn, bool select, TreeViewAction tva)\n        {\n            if (tn == null)\n                return;\n\n            if (select)\n            {\n                // Only try to select node if it was not already selected\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n                if (!IsNodeSelected(tn))\n                {\n                    // Check if node selection is cancelled\n                    TreeViewCancelEventArgs tvcea = new TreeViewCancelEventArgs(tn, false, tva);\n                    base.OnBeforeSelect(tvcea);\n\n                    // This node selection was cancelled!\t\t\t\t\t\t\n                    if (tvcea.Cancel)\n                        return;\n\n                    PreserveNodeColors(tn);\n\n                    tn.BackColor = SelectionBackColor; // GKM moved from above\n                    tn.ForeColor = BackColor; // GKM moved from above\t\t\t\t\t\t\t\t\t\n\n                    m_listSelectedNodes.Add(tn);\n                    m_blnSelectionChanged = true;\n\n                    base.OnAfterSelect(new TreeViewEventArgs(tn, tva));\n                }\n\n                m_tnMostRecentSelectedNode = tn;\n            }\n            else\n            {\n                // Only unselect node if it was selected\n                if (!IsNodeSelected(tn))\n                    return;\n\n                OnBeforeDeselect(tn);\n\n                Color[] originalColors = (Color[])m_htblSelectedNodesOrigColors[tn.GetHashCode()];\n                if (originalColors != null)\n                {\n                    m_listSelectedNodes.Remove(tn);\n                    m_blnSelectionChanged = true;\n                    m_htblSelectedNodesOrigColors.Remove(tn.GetHashCode());\n\n                    // GKM - Restore original node colors\n                    tn.BackColor = originalColors[0]; // GKM - was BackColor;\n                    tn.ForeColor = originalColors[1]; // GKM - was ForeColor;\n                }\n\n                OnAfterDeselect(tn);\n            }\n        }\n\n        /// <summary>\n        /// Selects nodes within the specified range.\n        /// </summary>\n        /// <param name=\"startNode\">Start node.</param>\n        /// <param name=\"endNode\">End Node.</param>\n        /// <param name=\"tva\">Specifies the action that caused the selection change.</param>\n        private void SelectNodesInsideRange(TreeNode startNode, TreeNode endNode, TreeViewAction tva)\n        {\n            if (startNode == null || endNode == null)\n                return;\n\n            // Calculate start node and end node\n            TreeNode firstNode;\n            TreeNode lastNode;\n            if (startNode.Bounds.Y < endNode.Bounds.Y)\n            {\n                firstNode = startNode;\n                lastNode = endNode;\n            }\n            else\n            {\n                firstNode = endNode;\n                lastNode = startNode;\n            }\n\n            // Select each node in range\n            SelectNode(firstNode, true, tva);\n            TreeNode tnTemp = firstNode;\n            while (tnTemp != lastNode && tnTemp != null)\n            {\n                tnTemp = tnTemp.NextVisibleNode;\n                if (tnTemp != null)\n                    SelectNode(tnTemp, true, tva);\n            }\n            SelectNode(lastNode, true, tva);\n        }\n\n        /// <summary>\n        /// Unselects nodes outside the specified range.\n        /// </summary>\n        /// <param name=\"startNode\">Start node.</param>\n        /// <param name=\"endNode\">End node.</param>\n        /// <param name=\"tva\">Specifies the action that caused the selection change.</param>\n        private void UnselectNodesOutsideRange(TreeNode startNode, TreeNode endNode, TreeViewAction tva)\n        {\n            if (startNode == null || endNode == null)\n                return;\n\n            // Calculate start node and end node\n            TreeNode firstNode;\n            TreeNode lastNode;\n            if (startNode.Bounds.Y < endNode.Bounds.Y)\n            {\n                firstNode = startNode;\n                lastNode = endNode;\n            }\n            else\n            {\n                firstNode = endNode;\n                lastNode = startNode;\n            }\n\n            // Unselect each node outside range\n            TreeNode tnTemp = firstNode;\n            while (tnTemp != null)\n            {\n                tnTemp = tnTemp.PrevVisibleNode;\n                if (tnTemp != null)\n                    SelectNode(tnTemp, false, tva);\n            }\n\n            tnTemp = lastNode;\n            while (tnTemp != null)\n            {\n                tnTemp = tnTemp.NextVisibleNode;\n                if (tnTemp != null)\n                    SelectNode(tnTemp, false, tva);\n            }\n        }\n\n        /// <summary>\n        /// Recursively unselect node.\n        /// </summary>\n        /// <param name=\"tn\">Node to recursively unselect.</param>\n        /// <param name=\"tva\">Specifies the action that caused the selection change.</param>\n        private void UnselectNodesRecursively(TreeNode tn, TreeViewAction tva)\n        {\n            SelectNode(tn, false, tva);\n            foreach (TreeNode child in tn.Nodes)\n            {\n                UnselectNodesRecursively(child, tva);\n            }\n        }\n\n        #endregion\n\n\n        #region Helper methods\n\n        /// <summary>\n        /// Determines whether a mouse click was inside the node bounds or outside the node bounds..\n        /// </summary>\n        /// <param name=\"tn\">TreeNode to check.</param>\n        /// <param name=\"e\">MouseEventArgs.</param>\n        /// <returns>True is mouse was clicked inside the node bounds, false if it was clicked ouside the node bounds.</returns>\n        private static bool IsClickOnNode(TreeNode tn, MouseEventArgs e)\n        {\n            if (tn == null)\n                return false;\n\n            // GKM\n            // Determine the rightmost position we'll process clicks (so that the click has to be on the node's bounds, \n            // like the .NET treeview\n            int rightMostX = tn.Bounds.X + tn.Bounds.Width;\n            return e.X < rightMostX; // GKM\n        }\n\n        /// <summary>\n        /// Gets level of specified node.\n        /// </summary>\n        /// <param name=\"node\">Node.</param>\n        /// <returns>Level of node.</returns>\n        private static int GetNodeLevel(TreeNode node)\n        {\n            int level = 0;\n            while ((node = node.Parent) != null)\n            {\n                level++;\n            }\n            return level;\n        }\n\n        /// <summary>\n        /// Determines whether the specified node is a child (indirect or direct) of the specified parent.\n        /// </summary>\n        /// <param name=\"child\">Node to check.</param>\n        /// <param name=\"parent\">Parent node.</param>\n        /// <returns>True if specified node is a direct or indirect child of parent node, false if not.</returns>\n        private static bool IsChildOf(TreeNode child, TreeNode parent)\n        {\n            bool blnChild = false;\n\n            TreeNode tnTemp = child;\n            while (tnTemp != null)\n            {\n                if (tnTemp == parent)\n                {\n                    blnChild = true;\n                    break;\n                }\n                tnTemp = tnTemp.Parent;\n            }\n\n            return blnChild;\n        }\n\n        /// <summary>\n        /// Gets root parent of specified node.\n        /// </summary>\n        /// <param name=\"child\">Node.</param>\n        /// <returns>Root parent of specified node.</returns>\n        private static TreeNode GetRootParent(TreeNode child)\n        {\n            TreeNode tnParent = child;\n\n            while (tnParent.Parent != null)\n            {\n                tnParent = tnParent.Parent;\n            }\n\n            return tnParent;\n        }\n\n        /// <summary>\n        /// Gets number of visible nodes.\n        /// </summary>\n        /// <returns>Number of visible nodes.</returns>\n        private int GetNumberOfVisibleNodes()\n        {\n            int intCounter = 0;\n\n            TreeNode tnTemp = Nodes[0];\n\n            while (tnTemp != null)\n            {\n                if (tnTemp.IsVisible)\n                    intCounter++;\n\n                tnTemp = tnTemp.NextVisibleNode;\n            }\n\n            return intCounter;\n        }\n\n        /// <summary>\n        /// Gets last visible node.\n        /// </summary>\n        /// <returns>Last visible node.</returns>\n        private TreeNode GetLastVisibleNode()\n        {\n            TreeNode tnTemp = Nodes[0];\n\n            while (tnTemp.NextVisibleNode != null)\n            {\n                tnTemp = tnTemp.NextVisibleNode;\n            }\n\n            return tnTemp;\n        }\n\n        /// <summary>\n        /// Gets next tree node(s), starting from the specified node and direction.\n        /// </summary>\n        /// <param name=\"start\">Node to start from.</param>\n        /// <param name=\"down\">True to go down, false to go up.</param>\n        /// <param name=\"intNumber\">Number of nodes to go down or up.</param>\n        /// <returns>Next node.</returns>\n        private static TreeNode GetNextTreeNode(TreeNode start, bool down, int intNumber)\n        {\n            int intCounter = 0;\n            TreeNode tnTemp = start;\n            while (intCounter < intNumber)\n            {\n                if (down)\n                {\n                    if (tnTemp.NextVisibleNode != null)\n                        tnTemp = tnTemp.NextVisibleNode;\n                    else\n                        break;\n                }\n                else\n                {\n                    if (tnTemp.PrevVisibleNode != null)\n                        tnTemp = tnTemp.PrevVisibleNode;\n                    else\n                        break;\n                }\n\n                intCounter++;\n            }\n\n            return tnTemp;\n        }\n\n        /// <summary>\n        /// makes focus rectangle visible or hides it.\n        /// </summary>\n        /// <param name=\"tn\">Node to make focus rectangle (in)visible for.</param>\n        /// <param name=\"visible\">True to make focus rectangle visible, false to hide it.</param>\n        private void SetFocusToNode(TreeNode tn, bool visible)\n        {\n            Graphics g = CreateGraphics();\n            Rectangle rect = new Rectangle(tn.Bounds.X, tn.Bounds.Y, tn.Bounds.Width, tn.Bounds.Height);\n            if (visible)\n            {\n                Invalidate(rect, false);\n                Update();\n                if (tn.BackColor == SelectionBackColor)\n                    return;\n\n                using (SolidBrush brush = new SolidBrush(SelectionBackColor))\n                using (Pen pen = new Pen(brush, 1))\n                {\n                    g.DrawRectangle(pen, rect);\n                }\n            }\n            else\n            {\n                if (tn.BackColor != SelectionBackColor)\n                {\n                    using (SolidBrush brush = new SolidBrush(BackColor))\n                    using (Pen pen = new Pen(brush, 1))\n                    {\n                        g.DrawRectangle(pen, m_tnMostRecentSelectedNode.Bounds.X, m_tnMostRecentSelectedNode.Bounds.Y,\n                            m_tnMostRecentSelectedNode.Bounds.Width, m_tnMostRecentSelectedNode.Bounds.Height);\n                    }\n                }\n\n                Invalidate(rect, false);\n                Update();\n            }\n        }\n\n        #endregion\n\n\n        #region Dispose\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                m_components?.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #endregion\n\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            m_components = new Container();\n        }\n\n        #endregion\n\n\n        #region OnMouseUp, OnMouseDown\n\n        /// <summary>\n        /// Occurs when mouse button is up after a click.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnMouseUp(MouseEventArgs e)\n        {\n#if DEBUG\n            try\n            {\n#endif\n            if (!m_blnNodeProcessedOnMouseDown)\n            {\n                TreeNode tn = GetNodeAt(e.X, e.Y);\n\n                // Mouse click has not been handled by the mouse down event, so do it here. This is the case when\n                // a selected node was clicked again; in that case we handle that click here because in case the\n                // user is dragging the node, we should not put it in edit mode.\t\t\t\t\t\n\n                if (IsClickOnNode(tn, e))\n                {\n                    ProcessNodeRange(m_tnMostRecentSelectedNode, tn, e, ModifierKeys, TreeViewAction.ByMouse,\n                        true);\n                }\n            }\n\n            m_blnNodeProcessedOnMouseDown = false;\n\n            base.OnMouseUp(e);\n#if DEBUG\n            }\n            catch (Exception ex)\n            {\n                // GKM - Untrapped exceptions were killing me for debugging purposes.\n                // It probably shouldn't be here permanently, but it was causing real trouble for me.\n                MessageBox.Show(this, ex.ToString());\n                throw;\n            }\n#endif\n        }\n\n        /// <summary>\n        /// Checks if we have clicked on the plus/minus icon.\n        /// </summary>\n        /// <param name=\"tn\">Node to check.</param>\n        /// <param name=\"e\"></param>\n        /// <returns>True if we click on the plus/minus icon</returns>\n        private static bool IsPlusMinusClicked(TreeNode tn, MouseEventArgs e) => e.X < tn?.Bounds.X;\n\n        /// <summary>\n        /// Occurs when mouse is down.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnMouseDown(MouseEventArgs e)\n        {\n            m_tnKeysStartNode = null;\n\n            // Store number of mouse clicks in OnMouseDown event, because here we also get e.Clicks = 2 when an item was doubleclicked\n            // in OnMouseUp we seem to get always e.Clicks = 1, also when item is doubleclicked\n            m_intMouseClicks = e.Clicks;\n\n            TreeNode tn = GetNodeAt(e.X, e.Y);\n\n            if (tn == null)\n                return;\n\n            // Preserve colors here, because if you do it later then it will already have selected colors \n            // Don't know why...!\n            PreserveNodeColors(tn);\n\n            // If +/- was clicked, we should not process the node.\n            if (!IsPlusMinusClicked(tn, e))\n            {\n                // If mouse down on a node that is already selected, then we should process this node in the mouse up event, because we\n                // might want to drag it and it should not be put in edit mode.\n                // Also, only process node if click was in node's bounds.\n                if (IsClickOnNode(tn, e) && !IsNodeSelected(tn))\n                {\n                    // Flash node. In case the node selection is cancelled by the user, this gives the effect that it\n                    // was selected and unselected again.\n                    m_tnToFlash = tn;\n                    Thread t = new Thread(FlashNode);\n                    t.Start();\n\n                    m_blnNodeProcessedOnMouseDown = true;\n                    ProcessNodeRange(m_tnMostRecentSelectedNode, tn, e, ModifierKeys, TreeViewAction.ByMouse, true);\n                }\n            }\n\n            base.OnMouseDown(e);\n        }\n\n        #endregion\n\n\n        #region FlashNode, StartEdit\n\n        /// <summary>\n        /// Flashes node.\n        /// </summary>\n        private void FlashNode()\n        {\n            if (InvokeRequired)\n            {\n                Invoke(new MethodInvoker(FlashNode));\n                return;\n            }\n\n            TreeNode tn = m_tnToFlash;\n            // Only flash node is it's not yet selected\n            if (!IsNodeSelected(tn))\n            {\n                tn.BackColor = SelectionBackColor;\n                tn.ForeColor = BackColor;\n                Invalidate();\n                Refresh();\n                Application.DoEvents();\n                Thread.Sleep(200);\n            }\n\n            // If node is not selected yet, restore default colors to end flashing\n            if (IsNodeSelected(tn))\n                return;\n\n            tn.BackColor = BackColor;\n            tn.ForeColor = ForeColor;\n        }\n\n        /// <summary>\n        /// Starts edit on a node.\n        /// </summary>\n        private void StartEdit()\n        {\n            Thread.Sleep(200);\n            if (!m_blnWasDoubleClick)\n            {\n                m_blnInternalCall = true;\n                SelectedNode = m_tnNodeToStartEditOn;\n                m_blnInternalCall = false;\n                m_tnNodeToStartEditOn.BeginEdit();\n            }\n            else\n                m_blnWasDoubleClick = false;\n        }\n\n        #endregion\n\n\n        #region ProcessNodeRange\n\n        /// <summary>\n        /// Processes a node range.\n        /// </summary>\n        /// <param name=\"startNode\">Start node of range.</param>\n        /// <param name=\"endNode\">End node of range.</param>\n        /// <param name=\"e\">MouseEventArgs.</param>\n        /// <param name=\"keys\">Keys.</param>\n        /// <param name=\"tva\">TreeViewAction.</param>\n        /// <param name=\"allowStartEdit\">True if node can go to edit mode, false if not.</param>\n        public void ProcessNodeRange(TreeNode startNode, TreeNode endNode, MouseEventArgs e, Keys keys, TreeViewAction tva,\n            bool allowStartEdit)\n        {\n            m_blnSelectionChanged = false; // prepare for OnSelectionsChanged\n\n            switch (e.Button)\n            {\n                case MouseButtons.Left:\n                {\n                    m_blnWasDoubleClick = m_intMouseClicks == 2;\n\n                    if (((keys & Keys.Control) == 0) && ((keys & Keys.Shift) == 0))\n                    {\n                        // CTRL and SHIFT not held down\t\t\t\t\t\t\t\n                        m_tnSelectionMirrorPoint = endNode;\n                        int intNumberOfSelectedNodes = SelectedNodes.Count;\n\n                        // If it was a double click, select node and suspend further processing\t\t\t\t\t\n                        if (m_blnWasDoubleClick)\n                        {\n                            base.OnMouseDown(e);\n                            return;\n                        }\n\n                        if (!IsPlusMinusClicked(endNode, e))\n                        {\n                            bool blnNodeWasSelected = IsNodeSelected(endNode);\n\n                            UnselectAllNodesExceptNode(endNode, tva);\n                            SelectNode(endNode, true, tva);\n\n\n                            if (blnNodeWasSelected && LabelEdit && allowStartEdit && !m_blnWasDoubleClick &&\n                                (intNumberOfSelectedNodes <= 1))\n                            {\n                                // Node should be put in edit mode\t\t\t\t\t\n                                m_tnNodeToStartEditOn = endNode;\n                                Thread t = new Thread(StartEdit);\n                                t.Start();\n                            }\n                        }\n                    }\n                    else if (((keys & Keys.Control) != 0) && ((keys & Keys.Shift) == 0))\n                        HandleControlHeldDown(endNode, tva);\n                    else if (((keys & Keys.Control) == 0) && ((keys & Keys.Shift) != 0))\n                        HandleShiftPressed(startNode, endNode, tva);\n                    else if (((keys & Keys.Control) != 0) && ((keys & Keys.Shift) != 0))\n                        HandleShiftAndControlPressed(startNode, endNode, tva);\n                }\n                    break;\n                case MouseButtons.Right:\n                    if (!IsNodeSelected(endNode))\n                    {\n                        UnselectAllNodes(tva);\n                        SelectNode(endNode, true, tva);\n                    }\n                    break;\n            }\n            OnSelectionsChanged();\n        }\n\n        /// <summary>\n        /// Handles the control key held down.\n        /// </summary>\n        /// <param name=\"endNode\">The end node.</param>\n        /// <param name=\"tva\">The tva.</param>\n        private void HandleControlHeldDown(TreeNode endNode, TreeViewAction tva)\n        {\n            // CTRL held down\n            m_tnSelectionMirrorPoint = null;\n\n            if (!IsNodeSelected(endNode))\n            {\n                switch (m_selectionMode)\n                {\n                    case TreeViewSelectionMode.SingleSelect:\n                        UnselectAllNodesExceptNode(endNode, tva);\n                        break;\n\n                    case TreeViewSelectionMode.MultiSelectSameRootBranch:\n                        TreeNode tnAbsoluteParent2 = GetRootParent(endNode);\n                        UnselectAllNodesNotBelongingToParent(tnAbsoluteParent2, tva);\n                        break;\n\n                    case TreeViewSelectionMode.MultiSelectSameLevel:\n                        UnselectAllNodesNotBelongingToLevel(GetNodeLevel(endNode), tva);\n                        break;\n\n                    case TreeViewSelectionMode.MultiSelectSameLevelAndRootBranch:\n                        TreeNode tnAbsoluteParent = GetRootParent(endNode);\n                        UnselectAllNodesNotBelongingToParent(tnAbsoluteParent, tva);\n                        UnselectAllNodesNotBelongingToLevel(GetNodeLevel(endNode), tva);\n                        break;\n\n                    case TreeViewSelectionMode.MultiSelectSameParent:\n                        TreeNode tnParent = endNode.Parent;\n                        UnselectAllNodesNotBelongingDirectlyToParent(tnParent, tva);\n                        break;\n                }\n\n                SelectNode(endNode, true, tva);\n            }\n            else\n                SelectNode(endNode, false, tva);\n        }\n\n        /// <summary>\n        /// Handles the shift key pressed.\n        /// </summary>\n        /// <param name=\"startNode\">The start node.</param>\n        /// <param name=\"endNode\">The end node.</param>\n        /// <param name=\"tva\">The tva.</param>\n        private void HandleShiftPressed(TreeNode startNode, TreeNode endNode, TreeViewAction tva)\n        {\n            TreeNode tnTemp;\n            int intNodeLevelStart;\n\n            // SHIFT pressed\n            if (m_tnSelectionMirrorPoint == null)\n                m_tnSelectionMirrorPoint = startNode;\n\n            switch (m_selectionMode)\n            {\n                case TreeViewSelectionMode.SingleSelect:\n                    UnselectAllNodesExceptNode(endNode, tva);\n                    SelectNode(endNode, true, tva);\n                    break;\n\n                case TreeViewSelectionMode.MultiSelectSameRootBranch:\n                    TreeNode tnAbsoluteParentStartNode = GetRootParent(startNode);\n                    tnTemp = startNode;\n                    // Check each visible node from startNode to endNode and select it if needed\n                    while ((tnTemp != null) && (tnTemp != endNode))\n                    {\n                        tnTemp = startNode.Bounds.Y > endNode.Bounds.Y\n                            ? tnTemp.PrevVisibleNode\n                            : tnTemp.NextVisibleNode;\n                        if (tnTemp == null)\n                            continue;\n\n                        TreeNode tnAbsoluteParent = GetRootParent(tnTemp);\n                        if (tnAbsoluteParent == tnAbsoluteParentStartNode)\n                            SelectNode(tnTemp, true, tva);\n                    }\n                    UnselectAllNodesNotBelongingToParent(tnAbsoluteParentStartNode, tva);\n                    UnselectNodesOutsideRange(m_tnSelectionMirrorPoint, endNode, tva);\n                    break;\n\n                case TreeViewSelectionMode.MultiSelectSameLevel:\n                    intNodeLevelStart = GetNodeLevel(startNode);\n                    tnTemp = startNode;\n                    // Check each visible node from startNode to endNode and select it if needed\n                    while ((tnTemp != null) && (tnTemp != endNode))\n                    {\n                        tnTemp = startNode.Bounds.Y > endNode.Bounds.Y\n                            ? tnTemp.PrevVisibleNode\n                            : tnTemp.NextVisibleNode;\n                        if (tnTemp == null)\n                            continue;\n\n                        int intNodeLevel = GetNodeLevel(tnTemp);\n                        if (intNodeLevel == intNodeLevelStart)\n                            SelectNode(tnTemp, true, tva);\n                    }\n                    UnselectAllNodesNotBelongingToLevel(intNodeLevelStart, tva);\n                    UnselectNodesOutsideRange(m_tnSelectionMirrorPoint, endNode, tva);\n                    break;\n\n                case TreeViewSelectionMode.MultiSelectSameLevelAndRootBranch:\n                    TreeNode tnAbsoluteParentStart = GetRootParent(startNode);\n                    intNodeLevelStart = GetNodeLevel(startNode);\n                    tnTemp = startNode;\n                    // Check each visible node from startNode to endNode and select it if needed\n                    while ((tnTemp != null) && (tnTemp != endNode))\n                    {\n                        tnTemp = startNode.Bounds.Y > endNode.Bounds.Y\n                            ? tnTemp.PrevVisibleNode\n                            : tnTemp.NextVisibleNode;\n                        if (tnTemp == null)\n                            continue;\n\n                        int intNodeLevel = GetNodeLevel(tnTemp);\n                        TreeNode tnAbsoluteParent = GetRootParent(tnTemp);\n                        if ((intNodeLevel == intNodeLevelStart) && (tnAbsoluteParent == tnAbsoluteParentStart))\n                            SelectNode(tnTemp, true, tva);\n                    }\n                    UnselectAllNodesNotBelongingToParent(tnAbsoluteParentStart, tva);\n                    UnselectAllNodesNotBelongingToLevel(intNodeLevelStart, tva);\n                    UnselectNodesOutsideRange(m_tnSelectionMirrorPoint, endNode, tva);\n                    break;\n\n                case TreeViewSelectionMode.MultiSelect:\n                    SelectNodesInsideRange(m_tnSelectionMirrorPoint, endNode, tva);\n                    UnselectNodesOutsideRange(m_tnSelectionMirrorPoint, endNode, tva);\n                    break;\n\n                case TreeViewSelectionMode.MultiSelectSameParent:\n                    TreeNode tnParentStartNode = startNode.Parent;\n                    tnTemp = startNode;\n                    // Check each visible node from startNode to endNode and select it if needed\n                    while ((tnTemp != null) && (tnTemp != endNode))\n                    {\n                        tnTemp = startNode.Bounds.Y > endNode.Bounds.Y\n                            ? tnTemp.PrevVisibleNode\n                            : tnTemp.NextVisibleNode;\n                        if (tnTemp == null)\n                            continue;\n\n                        TreeNode tnParent = tnTemp.Parent;\n                        if (tnParent == tnParentStartNode)\n                            SelectNode(tnTemp, true, tva);\n                    }\n                    UnselectAllNodesNotBelongingDirectlyToParent(tnParentStartNode, tva);\n                    UnselectNodesOutsideRange(m_tnSelectionMirrorPoint, endNode, tva);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Handles the shift and control keys pressed.\n        /// </summary>\n        /// <param name=\"startNode\">The start node.</param>\n        /// <param name=\"endNode\">The end node.</param>\n        /// <param name=\"tva\">The tva.</param>\n        private void HandleShiftAndControlPressed(TreeNode startNode, TreeNode endNode, TreeViewAction tva)\n        {\n            TreeNode tnTemp;\n            int intNodeLevelStart;\n\n            // SHIFT AND CTRL pressed\n            switch (m_selectionMode)\n            {\n                case TreeViewSelectionMode.SingleSelect:\n                    UnselectAllNodesExceptNode(endNode, tva);\n                    SelectNode(endNode, true, tva);\n                    break;\n\n                case TreeViewSelectionMode.MultiSelectSameRootBranch:\n                    TreeNode tnAbsoluteParentStartNode = GetRootParent(startNode);\n                    tnTemp = startNode;\n                    // Check each visible node from startNode to endNode and select it if needed\n                    while ((tnTemp != null) && (tnTemp != endNode))\n                    {\n                        tnTemp = startNode.Bounds.Y > endNode.Bounds.Y\n                            ? tnTemp.PrevVisibleNode\n                            : tnTemp.NextVisibleNode;\n                        if (tnTemp == null)\n                            continue;\n\n                        TreeNode tnAbsoluteParent = GetRootParent(tnTemp);\n                        if (tnAbsoluteParent == tnAbsoluteParentStartNode)\n                            SelectNode(tnTemp, true, tva);\n                    }\n                    UnselectAllNodesNotBelongingToParent(tnAbsoluteParentStartNode, tva);\n                    break;\n\n                case TreeViewSelectionMode.MultiSelectSameLevel:\n                    intNodeLevelStart = GetNodeLevel(startNode);\n                    tnTemp = startNode;\n                    // Check each visible node from startNode to endNode and select it if needed\n                    while ((tnTemp != null) && (tnTemp != endNode))\n                    {\n                        tnTemp = startNode.Bounds.Y > endNode.Bounds.Y\n                            ? tnTemp.PrevVisibleNode\n                            : tnTemp.NextVisibleNode;\n                        if (tnTemp == null)\n                            continue;\n\n                        int intNodeLevel = GetNodeLevel(tnTemp);\n                        if (intNodeLevel == intNodeLevelStart)\n                            SelectNode(tnTemp, true, tva);\n                    }\n                    UnselectAllNodesNotBelongingToLevel(intNodeLevelStart, tva);\n                    break;\n\n                case TreeViewSelectionMode.MultiSelectSameLevelAndRootBranch:\n                    TreeNode tnAbsoluteParentStart = GetRootParent(startNode);\n                    intNodeLevelStart = GetNodeLevel(startNode);\n                    tnTemp = startNode;\n                    // Check each visible node from startNode to endNode and select it if needed\n                    while ((tnTemp != null) && (tnTemp != endNode))\n                    {\n                        tnTemp = startNode.Bounds.Y > endNode.Bounds.Y\n                            ? tnTemp.PrevVisibleNode\n                            : tnTemp.NextVisibleNode;\n                        if (tnTemp == null)\n                            continue;\n\n                        int intNodeLevel = GetNodeLevel(tnTemp);\n                        TreeNode tnAbsoluteParent = GetRootParent(tnTemp);\n                        if ((intNodeLevel == intNodeLevelStart) && (tnAbsoluteParent == tnAbsoluteParentStart))\n                            SelectNode(tnTemp, true, tva);\n                    }\n                    UnselectAllNodesNotBelongingToParent(tnAbsoluteParentStart, tva);\n                    UnselectAllNodesNotBelongingToLevel(intNodeLevelStart, tva);\n                    break;\n\n                case TreeViewSelectionMode.MultiSelect:\n                    tnTemp = startNode;\n                    // Check each visible node from startNode to endNode and select it if needed\n                    while ((tnTemp != null) && (tnTemp != endNode))\n                    {\n                        tnTemp = startNode.Bounds.Y > endNode.Bounds.Y\n                            ? tnTemp.PrevVisibleNode\n                            : tnTemp.NextVisibleNode;\n                        if (tnTemp != null)\n                            SelectNode(tnTemp, true, tva);\n                    }\n                    break;\n\n                case TreeViewSelectionMode.MultiSelectSameParent:\n                    TreeNode tnParentStartNode = startNode.Parent;\n                    tnTemp = startNode;\n                    // Check each visible node from startNode to endNode and select it if needed\n                    while ((tnTemp != null) && (tnTemp != endNode))\n                    {\n                        tnTemp = startNode.Bounds.Y > endNode.Bounds.Y\n                            ? tnTemp.PrevVisibleNode\n                            : tnTemp.NextVisibleNode;\n                        if (tnTemp == null)\n                            continue;\n\n                        TreeNode tnParent = tnTemp.Parent;\n                        if (tnParent == tnParentStartNode)\n                            SelectNode(tnTemp, true, tva);\n                    }\n                    UnselectAllNodesNotBelongingDirectlyToParent(tnParentStartNode, tva);\n                    break;\n            }\n        }\n\n        #endregion\n\n\n        #region OnBeforeLabelEdit\n\n        /// <summary>\n        /// Occurs before node goes into edit mode.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnBeforeLabelEdit(NodeLabelEditEventArgs e)\n        {\n            m_blnSelectionChanged = false; // prepare for OnSelectionsChanged\n\n            // Make sure that it's the only selected node\n            SelectNode(e.Node, true, TreeViewAction.ByMouse);\n            UnselectAllNodesExceptNode(e.Node, TreeViewAction.ByMouse);\n\n            OnSelectionsChanged();\n\n            base.OnBeforeLabelEdit(e);\n        }\n\n        #endregion\n\n\n        #region OnKeyDown\n\n        /// <summary>\n        /// occurs when a key is down.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnKeyDown(KeyEventArgs e)\n        {\n            Keys kMod = Keys.None;\n            switch (e.Modifiers)\n            {\n                case Keys.Shift:\n                case Keys.Control:\n                case Keys.Control | Keys.Shift:\n                    kMod = Keys.Shift;\n                    if (m_tnKeysStartNode == null)\n                        m_tnKeysStartNode = m_tnMostRecentSelectedNode;\n                    break;\n                default:\n                    m_tnKeysStartNode = null;\n                    break;\n            }\n\n            int intNumber = 0;\n\n            TreeNode tnNewlySelectedNodeWithKeys = null;\n            if (m_tnMostRecentSelectedNode != null)\n            {\n                switch (e.KeyCode)\n                {\n                    case Keys.Down:\n                        tnNewlySelectedNodeWithKeys = m_tnMostRecentSelectedNode.NextVisibleNode;\n                        break;\n\n                    case Keys.Up:\n                        tnNewlySelectedNodeWithKeys = m_tnMostRecentSelectedNode.PrevVisibleNode;\n                        break;\n\n                    case Keys.Left:\n                        if (m_tnMostRecentSelectedNode.IsExpanded)\n                            m_tnMostRecentSelectedNode.Collapse();\n                        else\n                            tnNewlySelectedNodeWithKeys = m_tnMostRecentSelectedNode.Parent;\n                        break;\n\n                    case Keys.Right:\n                        if (!m_tnMostRecentSelectedNode.IsExpanded)\n                            m_tnMostRecentSelectedNode.Expand();\n                        else\n                            tnNewlySelectedNodeWithKeys = m_tnMostRecentSelectedNode.Nodes[0];\n                        break;\n\n                    case Keys.Home:\n                        tnNewlySelectedNodeWithKeys = Nodes[0];\n                        break;\n\n                    case Keys.End:\n                        tnNewlySelectedNodeWithKeys = GetLastVisibleNode();\n                        break;\n\n                    case Keys.PageDown:\n\n                        intNumber = GetNumberOfVisibleNodes();\n                        tnNewlySelectedNodeWithKeys = GetNextTreeNode(m_tnMostRecentSelectedNode, true, intNumber);\n                        break;\n\n                    case Keys.PageUp:\n\n                        intNumber = GetNumberOfVisibleNodes();\n                        tnNewlySelectedNodeWithKeys = GetNextTreeNode(m_tnMostRecentSelectedNode, false, intNumber);\n                        break;\n\n                    default:\n                        base.OnKeyDown(e); // GKM\n                        return;\n                }\n            }\n            if (tnNewlySelectedNodeWithKeys != null)\n            {\n                SetFocusToNode(m_tnMostRecentSelectedNode, false);\n                ProcessNodeRange(m_tnKeysStartNode, tnNewlySelectedNodeWithKeys,\n                    new MouseEventArgs(MouseButtons.Left, 1, Cursor.Position.X, Cursor.Position.Y, 0), kMod,\n                    TreeViewAction.ByKeyboard, false);\n                m_tnMostRecentSelectedNode = tnNewlySelectedNodeWithKeys;\n                SetFocusToNode(m_tnMostRecentSelectedNode, true);\n            }\n\n            // Ensure visibility\n            if (m_tnMostRecentSelectedNode != null)\n            {\n                TreeNode tnToMakeVisible = null;\n                switch (e.KeyCode)\n                {\n                    case Keys.Down:\n                    case Keys.Right:\n                        tnToMakeVisible = GetNextTreeNode(m_tnMostRecentSelectedNode, true, 5);\n                        break;\n\n                    case Keys.Up:\n                    case Keys.Left:\n                        tnToMakeVisible = GetNextTreeNode(m_tnMostRecentSelectedNode, false, 5);\n                        break;\n\n                    case Keys.Home:\n                    case Keys.End:\n                        tnToMakeVisible = m_tnMostRecentSelectedNode;\n                        break;\n\n                    case Keys.PageDown:\n                        tnToMakeVisible = GetNextTreeNode(m_tnMostRecentSelectedNode, true, intNumber - 2);\n                        break;\n\n                    case Keys.PageUp:\n                        tnToMakeVisible = GetNextTreeNode(m_tnMostRecentSelectedNode, false, intNumber - 2);\n                        break;\n                }\n\n                tnToMakeVisible?.EnsureVisible();\n            }\n\n            base.OnKeyDown(e);\n        }\n\n        #endregion\n\n\n        #region OnAfterCollapse\n\n        /// <summary>\n        /// Occurs after a node is collapsed.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnAfterCollapse(TreeViewEventArgs e)\n        {\n            m_blnSelectionChanged = false;\n\n            // All child nodes should be deselected\n            bool blnChildSelected = false;\n            foreach (TreeNode tn in e.Node.Nodes)\n            {\n                if (IsNodeSelected(tn))\n                    blnChildSelected = true;\n                UnselectNodesRecursively(tn, TreeViewAction.Collapse);\n            }\n\n            if (blnChildSelected)\n                SelectNode(e.Node, true, TreeViewAction.Collapse);\n\n            OnSelectionsChanged();\n\n            base.OnAfterCollapse(e);\n        }\n\n        #endregion\n\n\n        #region OnItemDrag\n\n        /// <summary>\n        /// Occurs when an item is being dragged.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnItemDrag(ItemDragEventArgs e)\n        {\n            e = new ItemDragEventArgs(MouseButtons.Left, SelectedNodes);\n            base.OnItemDrag(e);\n        }\n\n        #endregion\n    }\n\n\n    #region SelectedNodesCollection\n\n    /// <summary>\n    /// Collection of selected nodes.\n    /// </summary>\n    public class NodesCollection : CollectionBase, IList<TreeNode>\n    {\n        #region Events\n\n        /// <summary>\n        /// Event fired when a tree node has been added to the collection.\n        /// </summary>\n        internal event TreeNodeEventHandler TreeNodeAdded;\n\n        /// <summary>\n        /// Event fired when a tree node has been removed to the collection.\n        /// </summary>\n        internal event TreeNodeEventHandler TreeNodeRemoved;\n\n        /// <summary>\n        /// Event fired when a tree node has been inserted to the collection.\n        /// </summary>\n        internal event TreeNodeEventHandler TreeNodeInserted;\n\n        /// <summary>\n        /// Event fired the collection has been cleared.\n        /// </summary>\n        internal event EventHandler SelectedNodesCleared;\n\n        #endregion\n\n\n        #region CollectionBase members\n\n        /// <summary>\n        /// Gets tree node at specified index.\n        /// </summary>\n        public TreeNode this[int index] => (TreeNode)List[index];\n\n        /// <summary>\n        /// Adds a tree node to the collection.\n        /// </summary>\n        /// <param name=\"treeNode\">Tree node to add.</param>\n        /// <returns>The position into which the new element was inserted.</returns>\n        public void Add(TreeNode treeNode)\n        {\n            TreeNodeAdded?.Invoke(treeNode);\n\n            List.Add(treeNode);\n        }\n\n        /// <summary>\n        /// Inserts a tree node at specified index.\n        /// </summary>\n        /// <param name=\"index\">The position into which the new element has to be inserted.</param>\n        /// <param name=\"treeNode\">Tree node to insert.</param>\n        public void InsertAt(int index, TreeNode treeNode)\n        {\n            TreeNodeInserted?.Invoke(treeNode);\n\n            List.Insert(index, treeNode);\n        }\n\n        /// <summary>\n        /// Removed a tree node from the collection.\n        /// </summary>\n        /// <param name=\"treeNode\">Tree node to remove.</param>\n        public void Remove(TreeNode treeNode)\n        {\n            TreeNodeRemoved?.Invoke(treeNode);\n\n            List.Remove(treeNode);\n        }\n\n        /// <summary>\n        /// Determines whether treenode belongs to the collection.\n        /// </summary>\n        /// <param name=\"treeNode\">Tree node to check.</param>\n        /// <returns>True if tree node belongs to the collection, false if not.</returns>\n        public bool Contains(TreeNode treeNode) => List.Contains(treeNode);\n\n        /// <summary>\n        /// Gets index of tree node in the collection.\n        /// </summary>\n        /// <param name=\"treeNode\">Tree node to get index of.</param>\n        /// <returns>Index of tree node in the collection.</returns>\n        public int IndexOf(TreeNode treeNode) => List.IndexOf(treeNode);\n\n        /// <summary>\n        /// Copies the tree node array to.\n        /// </summary>\n        /// <param name=\"array\">The array.</param>\n        /// <param name=\"arrayIndex\">Index of the array.</param>\n        public void CopyTo(TreeNode[] array, int arrayIndex)\n        {\n            List.CopyTo(array, arrayIndex);\n        }\n\n        #endregion\n\n\n        #region IList<T> members\n\n        void ICollection<TreeNode>.Add(TreeNode treeNode)\n        {\n        }\n\n        bool ICollection<TreeNode>.Contains(TreeNode treeNode) => true;\n\n        void ICollection<TreeNode>.CopyTo(TreeNode[] array, int arrayIndex)\n        {\n        }\n\n        bool ICollection<TreeNode>.IsReadOnly => false;\n\n        bool ICollection<TreeNode>.Remove(TreeNode treeNode)\n        {\n            if (!List.Contains(treeNode))\n                return false;\n\n            List.Remove(treeNode);\n            return true;\n        }\n\n        int IList<TreeNode>.IndexOf(TreeNode treeNode) => List.IndexOf(treeNode);\n\n        void IList<TreeNode>.Insert(int index, TreeNode treeNode)\n        {\n        }\n\n        TreeNode IList<TreeNode>.this[int index]\n        {\n            get { return (TreeNode)List[index]; }\n            set { }\n        }\n\n        IEnumerator<TreeNode> IEnumerable<TreeNode>.GetEnumerator() => new NodesCollectionEnumerator(InnerList.GetEnumerator());\n\n        #endregion\n\n\n        #region OnClear\n\n        /// <summary>\n        /// Occurs when collection is being cleared.\n        /// </summary>\n        protected override void OnClear()\n        {\n            SelectedNodesCleared?.ThreadSafeInvoke(this, EventArgs.Empty);\n\n            base.OnClear();\n        }\n\n        #endregion\n\n\n        #region IEnumerator Implementation\n\n        private class NodesCollectionEnumerator : IEnumerator<TreeNode>\n        {\n            private readonly IEnumerator m_enumerator;\n\n            public NodesCollectionEnumerator(IEnumerator enumerator)\n            {\n                m_enumerator = enumerator;\n            }\n\n            public TreeNode Current => (TreeNode)m_enumerator.Current;\n\n            object IEnumerator.Current => m_enumerator.Current;\n\n            public bool MoveNext() => m_enumerator.MoveNext();\n\n            public void Reset()\n            {\n                m_enumerator.Reset();\n            }\n\n            public void Dispose()\n            {\n            }\n        }\n\n        #endregion\n    }\n\n    #endregion\n}"
  },
  {
    "path": "src/EVEMon.Common/Controls/TreeViewExtensions.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Controls\n{\n    public static class TreeViewExtensions\n    {\n        /// <summary>\n        /// Gets an enumerator over all the tree nodes\n        /// </summary>\n        /// <param name=\"treeView\"></param>\n        /// <returns></returns>\n        public static IEnumerable<TreeNode> GetAllNodes(this TreeView treeView)\n        {\n            Stack<IEnumerator> enumerators = new Stack<IEnumerator>();\n            IEnumerator currentEnumerator = treeView.Nodes.GetEnumerator();\n\n            try\n            {\n                while (true)\n                {\n                    // Is there still a node at this level ?\n                    if (currentEnumerator.MoveNext())\n                    {\n                        // Retrieve the new current node\n                        TreeNode node = (TreeNode)currentEnumerator.Current;\n\n                        // Pushes the enumerator over its children\n                        if (node.Nodes.Count != 0)\n                        {\n                            enumerators.Push(currentEnumerator);\n                            currentEnumerator = node.Nodes.GetEnumerator();\n                        }\n\n                        // Return this node\n                        yield return node;\n                    }\n                    // Is there a previous level ?\n                    else if (enumerators.Count != 0)\n                    {\n                        // Clean up\n                        IDisposable disposable = currentEnumerator as IDisposable;\n                        disposable?.Dispose();\n\n                        // Previous level\n                        currentEnumerator = enumerators.Pop();\n                    }\n                    // Then, we're done\n                    else\n                        yield break;\n                }\n            }\n            finally\n            {\n                // Clean up the enumerators\n                foreach (IDisposable disposable in enumerators.OfType<IDisposable>())\n                {\n                    disposable.Dispose();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets an eneumerator over all the tree nodes\n        /// </summary>\n        /// <param name=\"treeView\"></param>\n        /// <returns></returns>\n        public static IEnumerable<TreeNode> GetAllVisibleNodes(this TreeView treeView)\n        {\n            for (TreeNode node = treeView.TopNode; node != null; node = node.NextVisibleNode)\n            {\n                yield return node;\n            }\n        }\n\n        /// <summary>\n        /// Retrieves the node with the provided tag.\n        /// </summary>\n        /// <remarks>Tags are compared using reference comparison, so avoid boxed value types and such.</remarks>\n        /// <param name=\"treeView\"></param>\n        /// <param name=\"tag\">The tag to search for, using object references comparison</param>\n        /// <returns>The matching node if found, null otherwise</returns>\n        public static TreeNode GetNodeWithTag(this TreeView treeView, object tag)\n            => GetAllNodes(treeView).FirstOrDefault(node => ReferenceEquals(node.Tag, tag));\n\n        /// <summary>\n        /// Selects the node with the provided tag, or unselect the current selection if the tag was not found.\n        /// </summary>\n        /// <remarks>Tags are compared using reference comparison, so avoid boxed value types and such.</remarks>\n        /// <param name=\"treeView\"></param>\n        /// <param name=\"tag\"></param>\n        /// <returns>The selected node, null if this tag was not found</returns>\n        /// <exception cref=\"System.ArgumentNullException\">treeView</exception>\n        public static void SelectNodeWithTag(this TreeView treeView, object tag)\n        {\n            treeView.ThrowIfNull(nameof(treeView));\n\n            foreach (TreeNode node in GetAllNodes(treeView).Where(node => ReferenceEquals(node.Tag, tag)))\n            {\n                node.EnsureVisible();\n                treeView.UnselectAllNodesExceptNode(node, TreeViewAction.ByMouse);\n                treeView.SelectNode(node, true, TreeViewAction.ByMouse);\n                return;\n            }\n\n            treeView.UnselectAllNodes();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/ApiErrorTroubleshooterEventArgs.cs",
    "content": "using System;\nusing EVEMon.Common.Controls;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    /// <summary>\n    /// Provides event arguments for API Error troubleshooters to notify their parents.\n    /// </summary>\n    public sealed class ApiErrorTroubleshooterEventArgs : EventArgs\n    {\n        private readonly bool m_resolved;\n        private readonly ResolutionAction m_action;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ApiErrorTroubleshooterEventArgs\"/> class with the error unresolved.\n        /// </summary>\n        public ApiErrorTroubleshooterEventArgs()\n        {\n            m_action = ResolutionAction.None;\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ApiErrorTroubleshooterEventArgs\"/> class with the error resolved.\n        /// </summary>\n        /// <param name=\"action\">The action.</param>\n        public ApiErrorTroubleshooterEventArgs(ResolutionAction action)\n        {\n            m_resolved = true;\n            m_action = action;\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether this <see cref=\"ApiErrorTroubleshooterEventArgs\"/> is resolved.\n        /// </summary>\n        /// <value><c>true</c> if resolved; otherwise, <c>false</c>.</value>\n        public bool Resolved => m_resolved;\n\n        /// <summary>\n        /// Gets the action.\n        /// </summary>\n        /// <value>The action.</value>\n        public ResolutionAction Action => m_action;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/AttributeChangedEventArgs.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class AttributeChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"remapping\">The remapping.</param>\n        public AttributeChangedEventArgs(RemappingResult remapping)\n        {\n            Remapping = remapping;\n        }\n\n        /// <summary>\n        /// Gets the remapping.\n        /// </summary>\n        /// <value>The remapping.</value>\n        public RemappingResult Remapping { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/AttributeHighlightingEventArgs.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class AttributeHighlightingEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"AttributeHighlightingEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"highlightValue\">The highlight value.</param>\n        public AttributeHighlightingEventArgs(long highlightValue)\n        {\n            Value = highlightValue;\n        }\n\n        /// <summary>\n        /// Gets the value.\n        /// </summary>\n        /// <value>The value.</value>\n        public long Value { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/AttributeValueChangedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class AttributeValueChangedEventArgs : EventArgs\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/AttributeValueChangingEventArgs.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class AttributeValueChangingEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"AttributeValueChangingEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"deltaValue\">The delta value.</param>\n        public AttributeValueChangingEventArgs(long deltaValue)\n        {\n            Value = deltaValue;\n        }\n\n        /// <summary>\n        /// Gets the value.\n        /// </summary>\n        /// <value>The value.</value>\n        public long Value { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/CharacterChangedEventArgs.cs",
    "content": "using System;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class CharacterChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        public CharacterChangedEventArgs(Character character)\n        {\n            Character = character;\n        }\n\n        /// <summary>\n        /// Gets the character related to this event.\n        /// </summary>\n        public Character Character { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/CharacterIdentityChangedEventArgs.cs",
    "content": "using System;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class CharacterIdentityChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"identity\"></param>\n        public CharacterIdentityChangedEventArgs(CharacterIdentity identity)\n        {\n            CharacterIdentity = identity;\n        }\n\n        /// <summary>\n        /// Gets the character identity related to this event.\n        /// </summary>\n        public CharacterIdentity CharacterIdentity { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/CloudStorageServiceProviderEventArgs.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class CloudStorageServiceProviderEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"errorMessage\">The error message.</param>\n        public CloudStorageServiceProviderEventArgs(string errorMessage)\n        {\n            if (errorMessage != null && string.IsNullOrWhiteSpace(errorMessage))\n                errorMessage = @\"An error occured.\";\n\n            HasError = !string.IsNullOrWhiteSpace(errorMessage);\n            ErrorMessage = errorMessage;\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this event has error.\n        /// </summary>\n        /// <value><c>true</c> if this event has error; otherwise, <c>false</c>.</value>\n        public bool HasError { get; }\n\n        /// <summary>\n        /// Gets or sets the error message.\n        /// </summary>\n        /// <value>The error message.</value>\n        public string ErrorMessage { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/ContractsEventArgs.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class ContractsEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"endedContracts\">The ended contracts.</param>\n        public ContractsEventArgs(Character character, IEnumerable<Contract> endedContracts)\n        {\n            Character = character;\n            EndedContracts = endedContracts;\n        }\n\n        /// <summary>\n        /// Gets the character.\n        /// </summary>\n        /// <value>The character.</value>\n        public Character Character { get; }\n\n        /// <summary>\n        /// Gets the ended contracts.\n        /// </summary>\n        /// <value>The ended contracts.</value>\n        public IEnumerable<Contract> EndedContracts { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/DataUpdateAvailableEventArgs.cs",
    "content": "using System;\nusing System.Collections.ObjectModel;\nusing EVEMon.Common.Serialization.PatchXml;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class DataUpdateAvailableEventArgs : EventArgs\n    {\n        private readonly Collection<SerializableDatafile> m_changedFiles;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"DataUpdateAvailableEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"changedFiles\">The changed files.</param>\n        public DataUpdateAvailableEventArgs(Collection<SerializableDatafile> changedFiles)\n        {\n            m_changedFiles = changedFiles;\n        }\n\n        /// <summary>\n        /// Gets or sets the changed files.\n        /// </summary>\n        /// <value>The changed files.</value>\n        public Collection<SerializableDatafile> ChangedFiles => m_changedFiles;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/DaySelectedEventArgs.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class DaySelectedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"datetime\">The datetime.</param>\n        /// <param name=\"dateTimeIsSameMonthAsPrevious\">if set to <c>true</c> [date time is same month as previous].</param>\n        /// <param name=\"mouse\">The <see cref=\"System.Windows.Forms.MouseEventArgs\" /> instance containing the event data.</param>\n        /// <param name=\"location\">The location.</param>\n        public DaySelectedEventArgs(DateTime datetime, bool dateTimeIsSameMonthAsPrevious, MouseEventArgs mouse, Point location)\n        {\n            DateTime = datetime;\n            DateTimeIsSameMonthAsPrevious = dateTimeIsSameMonthAsPrevious;\n            Mouse = mouse;\n            Location = location;\n        }\n\n        /// <summary>\n        /// Gets the date time.\n        /// </summary>\n        /// <value>The date time.</value>\n        public DateTime DateTime { get; }\n\n        /// <summary>\n        /// Gets a value indicating whether this date is in the same month as the previous.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if this date is in the same month as the previous; otherwise, <c>false</c>.\n        /// </value>\n        public bool DateTimeIsSameMonthAsPrevious { get; }\n\n        /// <summary>\n        /// Gets the mouse.\n        /// </summary>\n        /// <value>The mouse.</value>\n        public MouseEventArgs Mouse { get; }\n\n        /// <summary>\n        /// Gets the location.\n        /// </summary>\n        /// <value>The location.</value>\n        public Point Location { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/DropDownMouseMoveEventArgs.cs",
    "content": "﻿using System;\nusing System.Drawing;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class DropDownMouseMoveEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"DropDownMouseMoveEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"item\">The item.</param>\n        /// <param name=\"location\">The location.</param>\n        public DropDownMouseMoveEventArgs(object item, Point location)\n        {\n            Item = item;\n            Location = location;\n        }\n\n        /// <summary>\n        /// Gets the item.\n        /// </summary>\n        /// <value>The item.</value>\n        public object Item { get; }\n\n        /// <summary>\n        /// Gets the location.\n        /// </summary>\n        /// <value>The location.</value>\n        public Point Location { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/ESIKeyCreationEventArgs.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class ESIKeyCreationEventArgs : EventArgs\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ESIKeyCreationEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <param name=\"refreshToken\">The refresh token.</param>\n        /// <param name=\"charInfo\">The ESI key info.</param>\n        /// <exception cref=\"System.ArgumentNullException\">charInfo</exception>\n        public ESIKeyCreationEventArgs(long id, string refreshToken, JsonResult<EsiAPITokenInfo> charInfo)\n        {\n            charInfo.ThrowIfNull(nameof(charInfo));\n\n            ID = id;\n            RefreshToken = refreshToken;\n            // At some point the ability to use limited scopes would be nice\n            AccessMask = ulong.MaxValue;\n\n            if (charInfo.HasError)\n                CCPError = new CCPAPIError()\n                {\n                    ErrorCode = charInfo.ResponseCode,\n                    ErrorMessage = charInfo.ErrorMessage ??\n                        \"No character result retrieved from ESI key\"\n                };\n            else\n            {\n                EsiAPITokenInfo result = charInfo.Result;\n                CCPError = null;\n                long charId = result.CharacterID;\n                string name = result.CharacterName;\n\n                // Only one character per ESI key\n                // Look for an existing character ID and update its name\n                CharacterIdentity identity = EveMonClient.CharacterIdentities[charId];\n                if (identity != null)\n                    identity.CharacterName = name;\n                else\n                    // Create an identity if necessary\n                    identity = EveMonClient.CharacterIdentities.Add(charId, name);\n                Identity = identity;\n            }\n        }\n\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        public long ID { get; }\n\n        /// <summary>\n        /// Gets or sets the verification code.\n        /// </summary>\n        /// <value>The verification code.</value>\n        public string RefreshToken { get; }\n\n        /// <summary>\n        /// Gets or sets the access mask.\n        /// </summary>\n        /// <value>The access mask.</value>\n        public ulong AccessMask { get; }\n        \n        /// <summary>\n        /// Gets or sets the expiration.\n        /// </summary>\n        /// <value>The expiration.</value>\n        public DateTime Expiration { get; }\n        \n        /// <summary>\n        /// Gets or sets the CCP error.\n        /// </summary>\n        /// <value>The CCP error.</value>\n        public CCPAPIError CCPError { get; }\n        \n        /// <summary>\n        /// Gets the identity available from this ESI key.\n        /// </summary>\n        public CharacterIdentity Identity { get; }\n\n        #endregion\n\n\n        #region Methods\n\n        /// <summary>\n        /// Creates or updates the ESI key.\n        /// </summary>\n        /// <returns></returns>\n        public ESIKey CreateOrUpdate()\n        {\n            // Checks whether this ESI key already exists to update it\n            ESIKey esiKey = EveMonClient.ESIKeys[ID];\n            if (esiKey != null)\n            {\n                esiKey.Update(this);\n\n                // Fires the event regarding the ESI key info update\n                EveMonClient.OnESIKeyInfoUpdated(esiKey);\n            }\n            else\n            {\n                esiKey = new ESIKey(ID);\n                esiKey.Update(this);\n                EveMonClient.ESIKeys.Add(esiKey);\n            }\n\n            return esiKey;\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/ESIKeyInfoChangedEventArgs.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class ESIKeyInfoChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"esiKey\"></param>\n        public ESIKeyInfoChangedEventArgs(ESIKey esiKey)\n        {\n            ESIKey = esiKey;\n        }\n\n        /// <summary>\n        /// Gets the ESI key related to this event.\n        /// </summary>\n        public ESIKey ESIKey { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/EveServerEventArgs.cs",
    "content": "using System;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    /// <summary>\n    /// Represents an argument for server changes\n    /// </summary>\n    public sealed class EveServerEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"previousStatus\"></param>\n        /// <param name=\"status\"></param>\n        public EveServerEventArgs(EveServer server, ServerStatus previousStatus, ServerStatus status)\n        {\n            Server = server;\n            Status = status;\n            PreviousStatus = previousStatus;\n        }\n\n        /// <summary>\n        /// Gets the updated server\n        /// </summary>\n        public EveServer Server { get; }\n\n        /// <summary>\n        /// Gets the current status\n        /// </summary>\n        public ServerStatus Status { get; }\n\n        /// <summary>\n        /// Gets the previous status\n        /// </summary>\n        public ServerStatus PreviousStatus { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/IndustryJobsEventArgs.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class IndustryJobsEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"industryJobs\">The industry jobs.</param>\n        public IndustryJobsEventArgs(Character character, IEnumerable<IndustryJob> industryJobs)\n        {\n            Character = character;\n            CompletedJobs = industryJobs.ToList().AsReadOnly();\n        }\n\n        /// <summary>\n        /// Gets the character related to this event.\n        /// </summary>\n        public Character Character { get; }\n\n        /// <summary>\n        /// Gets the industry jobs related to this event.\n        /// </summary>\n        public ReadOnlyCollection<IndustryJob> CompletedJobs { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/LabelChangedEventArgs.cs",
    "content": "﻿using EVEMon.Common.Models;\nusing System;\nusing System.Collections.Generic;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class LabelChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"allLabels\">The list of all valid labels.</param>\n        public LabelChangedEventArgs(Character character, IEnumerable<string> allLabels)\n        {\n            Character = character;\n            AllLabels = allLabels;\n        }\n\n        /// <summary>\n        /// Gets the character related to this event.\n        /// </summary>\n        public Character Character { get; }\n\n        /// <summary>\n        /// Gets the list of all valid labels, computed once to save resources.\n        /// </summary>\n        public IEnumerable<string> AllLabels { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/LoadoutEventArgs.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class LoadoutEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"LoadoutEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"errorMessage\">The error message.</param>\n        public LoadoutEventArgs(object loadout, string errorMessage)\n        {\n            HasError = !string.IsNullOrEmpty(errorMessage);\n            Error = !string.IsNullOrEmpty(errorMessage) ? new Exception(errorMessage) : null;\n            Loadout = loadout;\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether this instance has error.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if this instance has error; otherwise, <c>false</c>.\n        /// </value>\n        public bool HasError { get; }\n\n        /// <summary>\n        /// Gets the error.\n        /// </summary>\n        /// <value>\n        /// The error.\n        /// </value>\n        public Exception Error { get; }\n\n        /// <summary>\n        /// Gets the loadout.\n        /// </summary>\n        /// <value>\n        /// The feed.\n        /// </value>\n        public object Loadout { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/LoadoutFeedEventArgs.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class LoadoutFeedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"LoadoutFeedEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"loadoutFeed\">The loadout feed.</param>\n        /// <param name=\"errorMessage\">The error message.</param>\n        public LoadoutFeedEventArgs(object loadoutFeed, string errorMessage)\n        {\n            HasError = !string.IsNullOrEmpty(errorMessage);\n            Error = !string.IsNullOrEmpty(errorMessage) ? new Exception(errorMessage) : null;\n            LoadoutFeed = loadoutFeed;\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether this instance has error.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if this instance has error; otherwise, <c>false</c>.\n        /// </value>\n        public bool HasError { get; }\n\n        /// <summary>\n        /// Gets the error.\n        /// </summary>\n        /// <value>\n        /// The error.\n        /// </value>\n        public Exception Error { get; }\n\n        /// <summary>\n        /// Gets the loadout feed.\n        /// </summary>\n        /// <value>\n        /// The feed.\n        /// </value>\n        public object LoadoutFeed { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/MarketOrdersEventArgs.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class MarketOrdersEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"endedOrders\">The ended orders.</param>\n        public MarketOrdersEventArgs(Character character, IEnumerable<MarketOrder> endedOrders)\n        {\n            Character = character;\n            EndedOrders = endedOrders;\n        }\n\n        /// <summary>\n        /// Gets the character.\n        /// </summary>\n        /// <value>The character.</value>\n        public Character Character { get; }\n\n        /// <summary>\n        /// Gets the ended orders.\n        /// </summary>\n        /// <value>The ended orders.</value>\n        public IEnumerable<MarketOrder> EndedOrders { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/PlanChangedEventArgs.cs",
    "content": "using System;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class PlanChangedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"plan\"></param>\n        public PlanChangedEventArgs(Plan plan)\n        {\n            Plan = plan;\n        }\n\n        /// <summary>\n        /// Gets the plan related to this event.\n        /// </summary>\n        public Plan Plan { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/PlanetaryPinsEventArgs.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class PlanetaryPinsEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"planetaryPins\">The planetary pins.</param>\n        public PlanetaryPinsEventArgs(Character character, IEnumerable<PlanetaryPin> planetaryPins)\n        {\n            Character = character;\n            CompletedPins = planetaryPins.ToList().AsReadOnly();\n        }\n\n        /// <summary>\n        /// Gets the character related to this event.\n        /// </summary>\n        public Character Character { get; }\n\n        /// <summary>\n        /// Gets the planetary pins related to this event.\n        /// </summary>\n        public ReadOnlyCollection<PlanetaryPin> CompletedPins { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/QueuedSkillsEventArgs.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class QueuedSkillsEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"queuedSkills\">The queued skills.</param>\n        public QueuedSkillsEventArgs(Character character, IEnumerable<QueuedSkill> queuedSkills)\n        {\n            Character = character;\n            CompletedSkills = new List<QueuedSkill>(queuedSkills).AsReadOnly();\n        }\n\n        /// <summary>\n        /// Gets the character related to this event.\n        /// </summary>\n        public Character Character { get; }\n\n        /// <summary>\n        /// Gets the queued skills related to this event.\n        /// </summary>\n        public ReadOnlyCollection<QueuedSkill> CompletedSkills { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/SkillClickedEventArgs.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    /// <summary>\n    /// Arguments for the skill clicked event args\n    /// </summary>\n    public sealed class SkillClickedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SkillClickedEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"button\">The button.</param>\n        /// <param name=\"location\">The location.</param>\n        public SkillClickedEventArgs(Skill skill, MouseButtons button, Point location)\n        {\n            Skill = skill;\n            Button = button;\n            Location = location;\n        }\n\n        /// <summary>\n        /// Gets the skill.\n        /// </summary>\n        /// <value>The skill.</value>\n        public Skill Skill { get; }\n\n        /// <summary>\n        /// Gets the button.\n        /// </summary>\n        /// <value>The button.</value>\n        public MouseButtons Button { get; }\n\n        /// <summary>\n        /// Gets the location.\n        /// </summary>\n        /// <value>The location.</value>\n        public Point Location { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/TimeCheckSyncEventArgs.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n\n    ///// <summary>\n    ///// Helper class for the result of asyncronous time sync requests.\n    ///// </summary>\n    public class TimeCheckSyncEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TimeCheckSyncEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"isSynchronised\">if set to <c>true</c> the user's machine is synchronised.</param>\n        /// <param name=\"serverTimeToLocalTime\">The server time to local time.</param>\n        /// <param name=\"localTime\">The local time.</param>\n        internal TimeCheckSyncEventArgs(bool isSynchronised, DateTime serverTimeToLocalTime, DateTime localTime)\n        {\n            IsSynchronised = isSynchronised;\n            ServerTimeToLocalTime = serverTimeToLocalTime;\n            LocalTime = localTime;\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether this instance is synchronised.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if this instance is synchronised; otherwise, <c>false</c>.\n        /// </value>\n        public bool IsSynchronised { get; }\n\n        /// <summary>\n        /// Gets the server time to local time.\n        /// </summary>\n        /// <value>\n        /// The server time to local time.\n        /// </value>\n        public DateTime ServerTimeToLocalTime { get; }\n\n        /// <summary>\n        /// Gets the local time.\n        /// </summary>\n        /// <value>\n        /// The local time.\n        /// </value>\n        public DateTime LocalTime { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/UpdateAvailableEventArgs.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    public sealed class UpdateAvailableEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"UpdateAvailableEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"forumUrl\">The forum URL.</param>\n        /// <param name=\"installerUrl\">The installer URL.</param>\n        /// <param name=\"updateMessage\">The update message.</param>\n        /// <param name=\"currentVersion\">The current version.</param>\n        /// <param name=\"newestVersion\">The newest version.</param>\n        /// <param name=\"md5Sum\">The MD5 sum.</param>\n        /// <param name=\"canAutoInstall\">if set to <c>true</c> [can auto install].</param>\n        /// <param name=\"installArgs\">The install args.</param>\n        public UpdateAvailableEventArgs(Uri forumUrl, Uri installerUrl, string updateMessage,\n                                        Version currentVersion, Version newestVersion, string md5Sum,\n                                        bool canAutoInstall, string installArgs)\n        {\n            ForumUrl = forumUrl;\n            InstallerUrl = installerUrl;\n            UpdateMessage = updateMessage;\n            CurrentVersion = currentVersion;\n            NewestVersion = newestVersion;\n            MD5Sum = md5Sum;\n            CanAutoInstall = canAutoInstall;\n            AutoInstallArguments = installArgs;\n        }\n\n        /// <summary>\n        /// Gets the forum URL.\n        /// </summary>\n        /// <value>The forum URL.</value>\n        public Uri ForumUrl { get; }\n\n        /// <summary>\n        /// Gets the installer URL.\n        /// </summary>\n        /// <value>The auto install URL.</value>\n        public Uri InstallerUrl { get; }\n\n        /// <summary>\n        /// Gets the update message.\n        /// </summary>\n        /// <value>The update message.</value>\n        public string UpdateMessage { get; }\n\n        /// <summary>\n        /// Gets the current version.\n        /// </summary>\n        /// <value> The current version.</value>\n        public Version CurrentVersion { get; }\n\n        /// <summary>\n        /// Gets the newest version.\n        /// </summary>\n        /// <value>The newest version.</value>\n        public Version NewestVersion { get; }\n\n        /// <summary>\n        /// Gets the MD5 sum.\n        /// </summary>\n        /// <value>The M d5 sum.</value>\n        public string MD5Sum { get; }\n\n        /// <summary>\n        /// Gets a value indicating whether this instance can auto install.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if this instance can auto install; otherwise, <c>false</c>.\n        /// </value>\n        public bool CanAutoInstall { get; }\n\n        /// <summary>\n        /// Gets the auto install arguments.\n        /// </summary>\n        /// <value>The auto install arguments.</value>\n        public string AutoInstallArguments { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/CustomEventArgs/UriCharacterEventArgs.cs",
    "content": "using System;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.CustomEventArgs\n{\n    /// <summary>\n    /// Represents the argument for the callback for uri characters addition\n    /// </summary>\n    public sealed class UriCharacterEventArgs : EventArgs\n    {\n        private readonly CCPAPIResult<SerializableAPICharacterSheet> m_apiResult;\n        private readonly SerializableCharacterSheetBase m_result;\n\n        /// <summary>\n        /// Constructor for API Characters.\n        /// </summary>\n        /// <param name=\"uri\">URI of the character</param>\n        /// <param name=\"result\">API Result</param>\n        /// <exception cref=\"System.ArgumentNullException\">result</exception>\n        public UriCharacterEventArgs(Uri uri, CCPAPIResult<SerializableAPICharacterSheet> result)\n        {\n            result.ThrowIfNull(nameof(result));\n\n            Uri = uri;\n            m_apiResult = result;\n            m_result = m_apiResult.Result;\n            HasError = m_apiResult.HasError;\n            Error = m_apiResult.ErrorMessage;\n        }\n\n        /// <summary>\n        /// Constructor for CCP Characters.\n        /// </summary>\n        /// <param name=\"uri\">URI of the character</param>\n        /// <param name=\"result\">Serialized Result</param>\n        public UriCharacterEventArgs(Uri uri, SerializableCharacterSheetBase result)\n        {\n            Uri = uri;\n            m_result = result;\n            HasError = false;\n            Error = string.Empty;\n        }\n\n        /// <summary>\n        /// Constructor for characters that throw errors.\n        /// </summary>\n        /// <param name=\"uri\">URI of the chracter</param>\n        /// <param name=\"error\"></param>\n        public UriCharacterEventArgs(Uri uri, string error)\n        {\n            Uri = uri;\n            HasError = true;\n            Error = error;\n        }\n\n        /// <summary>\n        /// Gets the created Uri character.\n        /// </summary>\n        public Uri Uri { get; }\n\n        /// <summary>\n        /// Gets or sets a value indicating if there was an error.\n        /// </summary>\n        public bool HasError { get; }\n\n        /// <summary>\n        /// Gets or sets the error which occurred.\n        /// </summary>\n        public string Error { get; }\n\n        /// <summary>\n        /// Gets the character's name.\n        /// </summary>\n        public string CharacterName => m_result.Name;\n\n        /// <summary>\n        /// Creates the character.\n        /// </summary>\n        public UriCharacter CreateCharacter()\n        {\n            CharacterIdentity identity = GetIdentity(m_result);\n\n            // Instantiates characters, adds, notify\n            var uriCharacter = m_apiResult != null ? new UriCharacter(identity, Uri, m_apiResult) :\n                new UriCharacter(identity, Uri, m_result as SerializableSettingsCharacter);\n\n            EveMonClient.Characters.Add(uriCharacter);\n\n            return uriCharacter;\n        }\n\n        /// <summary>\n        /// Updates the given character.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">character</exception>\n        public void UpdateCharacter(UriCharacter character)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            CharacterIdentity identity = GetIdentity(m_result);\n\n            // Updates\n            if (m_apiResult != null)\n                character.Update(identity, Uri, m_apiResult);\n            else\n            {\n                SerializableCCPCharacter ccpCharacter = m_result as SerializableCCPCharacter;\n                character.Update(identity, Uri, ccpCharacter);\n            }\n        }\n\n        /// <summary>\n        /// Gets the character identity.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <returns></returns>\n        // Retrieve the identity and create one if needed\n        private static CharacterIdentity GetIdentity(ISerializableCharacterIdentity character)\n            => EveMonClient.CharacterIdentities[character.ID] ??\n               EveMonClient.CharacterIdentities.Add(character.ID, character.Name);\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/Agent.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    public sealed class Agent\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"station\">The station.</param>\n        /// <param name=\"src\">The source.</param>\n        internal Agent(Station station, SerializableAgent src)\n        {\n            Station = station;\n            ID = src.ID;\n            Name = src.Name;\n            Level = src.Level;\n            Quality = src.Quality;\n            Division = src.DivisionName;\n            AgentType type;\n            if (!Enum.TryParse(src.AgentType, out type))\n                type = AgentType.NonAgent;\n            AgentType = type;\n            ResearchSkill = StaticSkills.GetSkillName(src.ResearchSkillID);\n            LocatorService = src.LocatorService;\n        }\n\n        #endregion\n\n\n        # region Public Properties\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        public int ID { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the level.\n        /// </summary>\n        /// <value>The level.</value>\n        public int Level { get; private set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the agent has locator service.\n        /// </summary>\n        /// <value><c>true</c> if the agent has locator service; otherwise, <c>false</c>.</value>\n        public bool LocatorService { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the quality.\n        /// </summary>\n        /// <value>The quality.</value>\n        public int Quality { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the research skill.\n        /// </summary>\n        /// <value>The research skill.</value>\n        public string ResearchSkill { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the type of the agent.\n        /// </summary>\n        /// <value>The type of the agent.</value>\n        public AgentType AgentType { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the division.\n        /// </summary>\n        /// <value>The division.</value>\n        public string Division { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the station.\n        /// </summary>\n        /// <value>The station.</value>\n        public Station Station { get; private set; }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/Blueprint.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    public class Blueprint : Item\n    {\n        private readonly Dictionary<int, decimal> m_inventBlueprints;\n        private readonly FastList<StaticRequiredMaterial> m_materialRequirements;\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"group\">Market Group the Blueprint will be a member of.</param>\n        /// <param name=\"src\">Source serializable blueprint.</param>\n        internal Blueprint(MarketGroup group, SerializableBlueprint src)\n            : base(group, src)\n        {\n            RunsPerCopy = src.MaxProductionLimit;\n            ProducesItem = StaticItems.GetItemByID(src.ProduceItemID);\n            ProductionTime = src.ProductionTime;\n            ResearchCopyTime = src.ResearchCopyTime;\n            ResearchMaterialTime = src.ResearchMaterialTime;\n            ResearchProductivityTime = src.ResearchProductivityTime;\n            ResearchInventionTime = src.InventionTime;\n            ReverseEngineeringTime = src.ReverseEngineeringTime;\n            ReactionTime = src.ReactionTime;\n            if (src.ReactionOutcome != null)\n                ReactionOutcome = new Material(src.ReactionOutcome);\n\n            // Invented blueprints\n            m_inventBlueprints = new Dictionary<int, decimal>(src.InventionTypeIDs?.Count ?? 0);\n            if (src.InventionTypeIDs != null && src.InventionTypeIDs.Any())\n            {\n                m_inventBlueprints.AddRange(src.InventionTypeIDs);\n            }\n\n            // Materials prerequisites\n            m_materialRequirements =\n                new FastList<StaticRequiredMaterial>(src.ReqMaterial?.Count ?? 0);\n            if (src.ReqMaterial == null)\n                return;\n\n            foreach (SerializableRequiredMaterial prereq in src.ReqMaterial)\n            {\n                m_materialRequirements.Add(new StaticRequiredMaterial(prereq));\n            }\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the item this blueprint produces.\n        /// </summary>\n        public Item ProducesItem { get; private set; }\n\n        /// <summary>\n        /// Gets the maximum items this blueprint can produce.\n        /// </summary>\n        public int RunsPerCopy { get; private set; }\n\n        /// <summary>\n        /// Gets the production time of the blueprint.\n        /// </summary>\n        public double ProductionTime { get; private set; }\n\n        /// <summary>\n        /// Gets the copying time of the blueprint.\n        /// </summary>\n        public double ResearchCopyTime { get; private set; }\n\n        /// <summary>\n        /// Gets the material efficiency research time of the blueprint.\n        /// </summary>\n        public double ResearchMaterialTime { get; private set; }\n\n        /// <summary>\n        /// Gets the productivity efficiency research time of the blueprint.\n        /// </summary>\n        public double ResearchProductivityTime { get; private set; }\n\n        /// <summary>\n        /// Gets the invention time of the blueprint.\n        /// </summary>\n        public double ResearchInventionTime { get; private set; }\n\n        /// <summary>\n        /// Gets the reverse engineering time.\n        /// </summary>\n        public double ReverseEngineeringTime { get; private set; }\n\n        /// <summary>\n        /// Gets the reaction time.\n        /// </summary>\n        public double ReactionTime { get; private set; }\n\n        /// <summary>\n        /// Gets the reaction outcome material.\n        /// </summary>\n        public Material ReactionOutcome { get; private set; }\n\n        /// <summary>\n        /// Gets the collection of materials this blueprint must satisfy to be build.\n        /// </summary>\n        public IEnumerable<StaticRequiredMaterial> MaterialRequirements => m_materialRequirements;\n\n        /// <summary>\n        /// Gets the collection of blueprints this object can invent.\n        /// </summary>\n        public IEnumerable<KeyValuePair<Blueprint, decimal>> InventBlueprints\n            => m_inventBlueprints\n                .Select(inventBlueprint => new KeyValuePair<Blueprint, decimal>(\n                    StaticBlueprints.GetBlueprintByID(inventBlueprint.Key), inventBlueprint.Value));\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/BlueprintCollection.cs",
    "content": "﻿using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a read-only collection of blueprints.\n    /// </summary>\n    public sealed class BlueprintCollection : ReadonlyCollection<Blueprint>\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"group\">Blueprint Market Group that the blueprint will contain.</param>\n        /// <param name=\"src\">One or more serializable blueprints.</param>\n        internal BlueprintCollection(BlueprintMarketGroup group, ICollection<SerializableBlueprint> src)\n            : base(src?.Count ?? 0)\n        {\n            if (src == null)\n                return;\n\n            foreach (SerializableBlueprint blueprint in src)\n            {\n                Items.Add(new Blueprint(group, blueprint));\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/BlueprintMarketGroup.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    public sealed class BlueprintMarketGroup : MarketGroup\n    {\n        #region Constructors\n\n        /// <summary>\n        /// Deserialization constructor for root category only.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public BlueprintMarketGroup(SerializableBlueprintMarketGroup src)\n            : base(src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            SubGroups = new BlueprintMarketGroupCollection(this, src.SubGroups);\n            Blueprints = new BlueprintCollection(this, src.Blueprints);\n        }\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public BlueprintMarketGroup(MarketGroup parent, SerializableBlueprintMarketGroup src)\n            : base(parent, src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            SubGroups = new BlueprintMarketGroupCollection(this, src.SubGroups);\n            Blueprints = new BlueprintCollection(this, src.Blueprints);\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the sub categories.\n        /// </summary>\n        public new BlueprintMarketGroupCollection SubGroups { get; }\n\n        /// <summary>\n        /// Gets the blueprints in this category.\n        /// </summary>\n        public BlueprintCollection Blueprints { get; }\n\n        /// <summary>\n        /// Gets the collection of all the blueprints in this category and its descendants.\n        /// </summary>\n        public IEnumerable<Blueprint> AllBlueprints\n        {\n            get\n            {\n                foreach (Blueprint blueprint in Blueprints)\n                {\n                    yield return blueprint;\n                }\n\n                foreach (Blueprint subBlueprint in SubGroups.SelectMany(cat => cat.AllBlueprints))\n                {\n                    yield return subBlueprint;\n                }\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/BlueprintMarketGroupCollection.cs",
    "content": "﻿using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a read-only collection of blueprint groups\n    /// </summary>\n    public sealed class BlueprintMarketGroupCollection : ReadonlyCollection<BlueprintMarketGroup>\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"group\">The blueprint market group.</param>\n        /// <param name=\"src\">The source.</param>\n        internal BlueprintMarketGroupCollection(BlueprintMarketGroup group, ICollection<SerializableBlueprintMarketGroup> src)\n            : base(src?.Count ?? 0)\n        {\n            if (src == null)\n                return;\n\n            foreach (SerializableBlueprintMarketGroup subGroup in src)\n            {\n                Items.Add(new BlueprintMarketGroup(group, subGroup));\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/Certificate.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a certificate from a character's point of view.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class Certificate\n    {\n        private readonly Character m_character;\n        private readonly CertificateLevel[] m_levels;\n\n\n        #region Initialization, importation, exportation and update\n\n        /// <summary>\n        /// Constructor at character's initialization time.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"src\"></param>\n        /// <param name=\"certClass\"></param>\n        internal Certificate(Character character, StaticCertificate src, CertificateClass certClass)\n        {\n            m_character = character;\n            m_levels = new CertificateLevel[6];\n\n            StaticData = src;\n            Class = certClass;\n\n            foreach (KeyValuePair<CertificateGrade, List<StaticSkillLevel>> skill in src.PrerequisiteSkills)\n            {\n                m_levels[(int)skill.Key] = new CertificateLevel(skill, this, character);\n            }\n        }\n\n        #endregion\n\n\n        #region Core Properties\n\n        /// <summary>\n        /// Gets the static data associated with this certificate.\n        /// </summary>\n        private StaticCertificate StaticData { get; }\n\n        /// <summary>\n        /// Gets this certificate's id.\n        /// </summary>\n        public int ID => StaticData.ID;\n\n        /// <summary>\n        /// Gets this certificate's name.\n        /// </summary>\n        public string Name => StaticData.Class.Name;\n\n        /// <summary>\n        /// Gets this certificate's description.\n        /// </summary>\n        public string Description => StaticData.Description;\n\n        /// <summary>\n        /// Gets the class for this certificate.\n        /// </summary>\n        public CertificateClass Class { get; }\n\n        /// <summary>\n        /// Gets the ships this certificate is recommended for.\n        /// </summary>\n        public IEnumerable<Item> Recommendations => StaticData.Recommendations;\n\n        /// <summary>\n        /// Gets all levels of the cerificate.\n        /// </summary>\n        /// <value>\n        /// All level.\n        /// </value>\n        public IEnumerable<CertificateLevel> AllLevel => m_levels.Where(level => level != null);\n\n        /// <summary>\n        /// Gets all the top-level prerequisite skills.\n        /// </summary>\n        public IEnumerable<SkillLevel> AllTopPrerequisiteSkills => StaticData.AllTopPrerequisiteSkills.ToCharacter(m_character);\n\n        /// <summary>\n        /// Gets the required training time for the provided character to train this certificate.\n        /// </summary>\n        /// <returns></returns>\n        public TimeSpan GetTrainingTime => m_character.GetTrainingTimeToMultipleSkills(AllTopPrerequisiteSkills);\n\n        /// <summary>\n        /// Gets the lowest untrained certificate level.\n        /// Null if all certificates have been trained.\n        /// </summary>\n        public CertificateLevel LowestUntrainedLevel => AllLevel.FirstOrDefault(cert => !cert.IsTrained);\n\n        /// <summary>\n        /// Gets the highest trained certificate level.\n        /// Null if no certificates have been trained.\n        /// </summary>\n        public CertificateLevel HighestTrainedLevel => AllLevel.LastOrDefault(cert => cert.IsTrained);\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the certificate level.\n        /// </summary>\n        /// <param name=\"level\">The level.</param>\n        /// <returns></returns>\n        public CertificateLevel GetCertificateLevel(int level) => AllLevel.FirstOrDefault(x => (int)x.Level == level);\n\n        /// <summary>\n        /// Try to update the certificate's status. \n        /// </summary>\n        /// <returns>True if the status was updated, false otherwise.</returns>\n        internal bool TryUpdateCertificateStatus()\n            => AllLevel.Aggregate(false, (current, level) => current | level.TryUpdateCertificateStatus());\n\n        #endregion\n\n\n        /// <summary>\n        /// Gets a string representation of this certificate.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => StaticData.ToString();\n\n        /// <summary>\n        /// Implicit conversion operator to the static equivalent of this certificate.\n        /// </summary>\n        /// <param name=\"cert\"></param>\n        /// <returns></returns>\n        public static implicit operator StaticCertificate(Certificate cert) => cert?.StaticData;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/CertificateCategoryCollection.cs",
    "content": "﻿using EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a certificate category.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class CertificateCategoryCollection : ReadonlyKeyedCollection<int, CertificateGroup>\n    {\n        /// <summary>\n        /// Constructor for the character initialization.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        internal CertificateCategoryCollection(Character character)\n        {\n            foreach (var srcCategory in StaticCertificates.AllGroups)\n            {\n                var category = new CertificateGroup(character, srcCategory);\n                Items[category.ID] = category;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/CertificateClass.cs",
    "content": "﻿using System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a certificate class from a character's point of view.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class CertificateClass\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\">The character</param>\n        /// <param name=\"src\">The static certificate class</param>\n        /// <param name=\"category\">The owning category</param>\n        internal CertificateClass(Character character, StaticCertificateClass src, CertificateGroup category)\n        {\n            Character = character;\n            Category = category;\n            StaticData = src;\n            Certificate = new Certificate(character, src.Certificate, this);\n        }\n\n        /// <summary>\n        /// Gets the character this certificate is bound to.\n        /// </summary>\n        public Character Character { get; }\n\n        /// <summary>\n        /// Gets the static data associated with this object.\n        /// </summary>\n        public StaticCertificateClass StaticData { get; }\n\n        /// <summary>\n        /// Gets the category for this certificate class.\n        /// </summary>\n        public CertificateGroup Category { get; private set; }\n\n        /// <summary>\n        /// Gets the certificate of this certificate class\n        /// </summary>\n        public Certificate Certificate { get; }\n\n        /// <summary>\n        /// Gets this skill's id.\n        /// </summary>\n        public int ID => StaticData.ID;\n\n        /// <summary>\n        /// Gets this skill's name.\n        /// </summary>\n        public string Name => StaticData.Name;\n\n        /// <summary>\n        /// Gets the lowest untrained certificate level.\n        /// Null if all certificates have been trained.\n        /// </summary>\n        public CertificateLevel LowestUntrainedLevel\n            => Certificate.AllLevel.FirstOrDefault(level => !level.IsTrained);\n\n        /// <summary>\n        /// Gets the highest trained certificate level.\n        /// May be null if no level has been trained.\n        /// </summary>\n        public CertificateLevel HighestTrainedLevel\n            => Certificate.AllLevel.LastOrDefault(level => level.IsTrained);\n\n        /// <summary>\n        /// Gets true if the provided character has completed this class.\n        /// </summary>\n        public bool IsCompleted => Certificate.AllLevel.All(certLevel => certLevel.IsTrained);\n\n        /// <summary>\n        /// Gets true if the provided character can train to the next grade,\n        /// false if the class has already been completed or if the next grade is untrainable.\n        /// </summary>\n        /// <returns></returns>\n        public bool IsFurtherTrainable\n        {\n            get\n            {\n                if (Certificate.AllLevel.All(cert => cert.IsTrained))\n                    return false;\n\n                foreach (CertificateLevel certLevel in Certificate.AllLevel)\n                {\n                    switch (certLevel.Status)\n                    {\n                        case CertificateStatus.PartiallyTrained:\n                            return true;\n                        case CertificateStatus.Untrained:\n                            return false;\n                    }\n                }\n\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Gets the name of the class.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => StaticData.Name;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/CertificateClassCollection.cs",
    "content": "﻿using System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represetns a collection of character's certificate class\n    /// </summary>\n    public sealed class CertificateClassCollection : ReadonlyKeyedCollection<int, CertificateClass>\n    {\n        private static CertificateClassCollection s_certificatesCollection;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CertificateClassCollection\"/> class.\n        /// Used to build a non-character associated certificates collection.\n        /// </summary>\n        public CertificateClassCollection()\n            : this(null)\n        {\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CertificateClassCollection\"/> class.\n        /// Used to build a character associated certificates collection.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal CertificateClassCollection(Character character)\n        {\n            foreach (CertificateClass certClass in character?.CertificateCategories.SelectMany(category => category) ??\n                                                   StaticCertificates.AllGroups.SelectMany(group => new CertificateGroup(group)))\n\n            {\n                Items[certClass.ID] = certClass;\n            }\n        }\n\n        /// <summary>\n        /// Gets a certificate class from its name.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public CertificateClass this[int id] => GetByKey(id);\n\n        /// <summary>\n        /// Gets a collection of non-character assosiated certificates.\n        /// </summary>\n        /// <value>\n        /// The skills.\n        /// </value>\n        public static CertificateClassCollection CertificateClasses\n            => s_certificatesCollection ?? (s_certificatesCollection = new CertificateClassCollection());\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/CertificateCollection.cs",
    "content": "﻿using EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Models;\nusing System.Linq;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a collection of certificates\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class CertificateCollection : ReadonlyKeyedCollection<int, Certificate>\n    {\n        /// <summary>\n        /// Constructor\n        /// <param name=\"character\">The character</param>\n        /// </summary>\n        internal CertificateCollection(Character character)\n        {\n            // Builds the list\n            foreach (var certGroup in character.CertificateCategories)\n                foreach (var certClass in certGroup)\n                {\n                    var certificate = certClass.Certificate;\n                    Items[certificate.ID] = certificate;\n                }\n        }\n\n        /// <summary>\n        /// Gets a certificate from its ID.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public Certificate this[int id] => GetByKey(id);\n\n        /// <summary>\n        /// Initializes the certificates.\n        /// </summary>\n        internal void Initialize()\n        {\n            while (Items.Values.Aggregate(false, (current, cert) => current | cert.\n                TryUpdateCertificateStatus())) ;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/CertificateGroup.cs",
    "content": "﻿using System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a certificate category from a character's point of view.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class CertificateGroup : ReadonlyKeyedCollection<string, CertificateClass>\n    {\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"src\"></param>\n        internal CertificateGroup(Character character, StaticCertificateGroup src)\n        {\n            StaticData = src;\n\n            foreach (CertificateClass certClass in src\n                .Select(srcClass => new CertificateClass(character, srcClass, this)))\n            {\n                Items[certClass.Name] = certClass;\n            }\n        }\n\n        /// <summary>\n        /// Constructor, used to build an non-character CertificateGroup, only used by CertificateClassCollection.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        internal CertificateGroup(StaticCertificateGroup src)\n            : this(null, src)\n        {\n        }\n\n        /// <summary>\n        /// Gets the static data associated with this object.\n        /// </summary>\n        public StaticCertificateGroup StaticData { get; }\n\n        /// <summary>\n        /// Gets this skill's id\n        /// </summary>\n        public int ID => StaticData.ID;\n\n        /// <summary>\n        /// Gets this skill's name\n        /// </summary>\n        public string Name => StaticData.Name;\n\n        /// <summary>\n        /// Gets this skill's description\n        /// </summary>\n        public string Description => StaticData.Description;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/CertificateLevel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Wraps the informations of a specific level of a certificate\n    /// </summary>\n    public sealed class CertificateLevel\n    {\n        private bool m_initialized;\n\n        private readonly Character m_character;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CertificateLevel\"/> class.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"cert\">The cert.</param>\n        /// <param name=\"character\">The character.</param>\n        public CertificateLevel(KeyValuePair<CertificateGrade, List<StaticSkillLevel>> skill, Certificate cert,\n            Character character)\n        {\n            m_character = character;\n\n            Level = skill.Key;\n            Certificate = cert;\n            Status = CertificateStatus.Untrained;\n            PrerequisiteSkills = skill.Value.ToCharacter(character);\n        }\n\n        /// <summary>\n        /// Gets the level (also known as Grade).\n        /// </summary>\n        /// <value>\n        /// The level.\n        /// </value>\n        public CertificateGrade Level { get; }\n\n        /// <summary>\n        /// Gets the certificate.\n        /// </summary>\n        /// <value>\n        /// The certificate.\n        /// </value>\n        public Certificate Certificate { get; }\n\n        /// <summary>\n        /// Gets the status.\n        /// </summary>\n        /// <value>\n        /// The status.\n        /// </value>\n        public CertificateStatus Status { get; private set; }\n\n        /// <summary>                                                                                                             \n        /// Gets the immediate prerequisite skills.                                                                                                            \n        /// </summary>\n        public IEnumerable<SkillLevel> PrerequisiteSkills { get; }\n\n        /// <summary>\n        /// Gets true whether the certificate is trained.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if this certificate is trained; otherwise, <c>false</c>.\n        /// </value>\n        public bool IsTrained => Status == CertificateStatus.Trained;\n\n        /// <summary>\n        /// Gets true whether the certificate is partially trained.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if this certificate is partilly trained; otherwise, <c>false</c>.\n        /// </value>\n        public bool IsPartiallyTrained => Status == CertificateStatus.PartiallyTrained;\n\n        /// <summary>\n        /// Gets the required training time for the provided character to train this certificate.\n        /// </summary>\n        /// <returns></returns>\n        public TimeSpan GetTrainingTime => m_character?.GetTrainingTimeToMultipleSkills(PrerequisiteSkills) ?? TimeSpan.Zero;\n\n        /// <summary>\n        /// Try to update the certificate's status. \n        /// </summary>\n        /// <returns>True if the status was updated, false otherwise.</returns>\n        internal bool TryUpdateCertificateStatus()\n        {\n            if (m_initialized)\n                return false;\n\n            bool noPrereq = true;\n            bool trained = true;\n\n            // Scan prerequisite skills\n            foreach (SkillLevel prereqSkill in PrerequisiteSkills)\n            {\n                // Trained only if the skill's level is greater or equal than the minimum level\n                trained &= prereqSkill.Skill.Level >= prereqSkill.Level;\n\n                // Untrainable if no prereq is satisfied\n                noPrereq &= prereqSkill.AllDependencies.All(x => !x.IsTrained);\n            }\n\n            // Updates status\n            if (trained)\n                Status = CertificateStatus.Trained;\n            else if (noPrereq)\n                Status = CertificateStatus.Untrained;\n            else\n                Status = CertificateStatus.PartiallyTrained;\n\n            m_initialized = true;\n            return true;\n        }\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\" /> that represents this instance.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\" /> that represents this instance.\n        /// </returns>\n        public override string ToString() => $\"Level {Skill.GetRomanFromInt((int)Level)}\";\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/Constellation.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a constellation of the EVE universe.\n    /// </summary>\n    public sealed class Constellation : ReadonlyCollection<SolarSystem>, IComparable<Constellation>\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"region\">The region.</param>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public Constellation(Region region, SerializableConstellation src)\n            : base(src?.Systems.Count ?? 0)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            ID = src.ID;\n            Name = src.Name;\n            Region = region;\n\n            foreach (SerializableSolarSystem srcSystem in src.Systems)\n            {\n                Items.Add(new SolarSystem(this, srcSystem));\n            }\n        }\n\n        public Constellation()\n        {\n            ID = 0;\n            Name = \"unknown\";\n            Region = new Region();\n        }\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets this object's id.\n        /// </summary>\n        public int ID { get; }\n\n        /// <summary>\n        /// Gets this object's name.\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// Gets the region where this constellation is located.\n        /// </summary>\n        public Region Region { get; }\n\n        /// <summary>\n        /// Gets something like Region > Constellation.\n        /// </summary>\n        public string FullLocation => $\"{Region.Name} > {Name}\";\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Compares this system with another one.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">other</exception>\n        public int CompareTo(Constellation other)\n        {\n            other.ThrowIfNull(nameof(other));\n\n            return Region != other.Region\n                ? Region.CompareTo(other.Region)\n                : string.Compare(Name, other.Name, StringComparison.CurrentCulture);\n        }\n\n        #endregion\n\n\n        #region Overridden Methods\n\n        /// <summary>\n        /// Gets the name of this object.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => Name;\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/ControlTowerFuel.cs",
    "content": "using EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    public sealed class ControlTowerFuel : Material\n    {\n        # region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public ControlTowerFuel(SerializableControlTowerFuel src)\n            : base(src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            Purpose = src.Purpose;\n            MinSecurityLevel = src.MinSecurityLevel;\n            FactionName = src.FactionName;\n        }\n\n        #endregion\n\n\n        # region Public Properties\n\n        /// <summary>\n        /// Gets the purpose.\n        /// </summary>\n        public string Purpose { get; private set; }\n\n        /// <summary>\n        /// Gets the min security level.\n        /// </summary>\n        public string MinSecurityLevel { get; private set; }\n\n        /// <summary>\n        /// Gets the name of the faction.\n        /// </summary>\n        /// <value>\n        /// The name of the faction.\n        /// </value>\n        public string FactionName { get; private set; }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/ControlTowerFuelCollection.cs",
    "content": "using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    public sealed class ControlTowerFuelCollection : ReadonlyCollection<SerializableControlTowerFuel>\n    {     \n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ControlTowerFuelCollection\"/> class.\n        /// </summary>\n        /// <param name=\"controlTowerFuelInfo\">The controlTowerFuelInfo.</param>\n        internal ControlTowerFuelCollection(ICollection<SerializableControlTowerFuel> controlTowerFuelInfo)\n            : base(controlTowerFuelInfo?.Count ?? 0)\n        {\n            if (controlTowerFuelInfo == null)\n                return;\n\n            foreach (SerializableControlTowerFuel reaction in controlTowerFuelInfo)\n            {\n                Items.Add(reaction);\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/Datafile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Common.Data\n{\n\n\n    #region Datafile class\n\n    /// <summary>\n    /// Represents a datafile\n    /// </summary>\n    public sealed class Datafile\n    {\n        private const string DatafileExtension = \".xml.gzip\";\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"filename\"></param>\n        public Datafile(string filename)\n        {\n            // The file may be in local directory, %APPDATA%, etc.\n            Filename = filename;\n\n            // Compute the MD5 sum\n            MD5Sum = Util.CreateMD5From(GetFullPath(Filename));\n        }\n\n        /// <summary>\n        /// Gets or sets the datafile name\n        /// </summary>\n        public string Filename { get; }\n\n        /// <summary>\n        /// Gets or sets the MD5 sum\n        /// </summary>\n        public string MD5Sum { get; private set; }\n\n        /// <summary>\n        /// Gets the datafile extension.\n        /// </summary>\n        /// <value>\n        /// The datafile extension.\n        /// </value>\n        public static string DatafilesExtension => DatafileExtension;\n\n        /// <summary>\n        /// Gets the old datafile extension.\n        /// </summary>\n        /// <value>\n        /// The old datafile extension.\n        /// </value>\n        public static string OldDatafileExtension => DatafileExtension.TrimEnd(\"ip\".ToCharArray());\n\n        /// <summary>\n        /// Gets the fully-qualified path of the provided datafile name\n        /// </summary>\n        /// <param name=\"filename\">The filename.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.IO.FileNotFoundException\"></exception>\n        /// <remarks>\n        /// Attempts to find a datafile  - firstly, look in the %APPDATA% folder\n        /// Then look in the Application data folder (roaming users on usb devices)\n        /// If not there, this could be a first run so copy from resources folder in installation directory\n        /// </remarks>\n        internal static string GetFullPath(string filename)\n        {\n            string evemonDataDir = EveMonClient.EVEMonDataDir ??\n                                   Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \"EVEMon\");\n\n            // Look in the %APPDATA% folder\n            string filepath = $\"{evemonDataDir}{Path.DirectorySeparatorChar}{filename}\";\n\n            if (File.Exists(filepath))\n                return filepath;\n\n            // File isn't in the current folder, look in installation directory (\"resources\" subdirectory)\n            string baseFile = $\"{AppDomain.CurrentDomain.BaseDirectory}Resources{Path.DirectorySeparatorChar}{filename}\";\n\n            // Does not exist also ? \n            if (!File.Exists(baseFile))\n                throw new FileNotFoundException($\"{baseFile} not found!\");\n\n            // The file was in the installation directory, let's copy it to %APPDATA%\n            FileHelper.CopyOrWarnTheUser(baseFile, filepath);\n\n            // Return\n            return baseFile;\n        }\n\n        /// <summary>\n        /// Gets the data files from the given directory path.\n        /// </summary>\n        /// <param name=\"dirPath\">The directory path.</param>\n        /// <param name=\"fileExtension\">The file extension.</param>\n        /// <returns></returns>\n        public static IEnumerable<string> GetFilesFrom(string dirPath, string fileExtension)\n            => Directory.GetFiles(dirPath, \"*\" + fileExtension, SearchOption.TopDirectoryOnly);\n    }\n\n    #endregion\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/EveProperty.cs",
    "content": "﻿using EVEMon.Common.Constants;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Datafiles;\nusing System;\n\nnamespace EVEMon.Common.Data\n{\n    public sealed class EveProperty\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"category\"></param>\n        /// <param name=\"serial\"></param>\n        internal EveProperty(EvePropertyCategory category, SerializableProperty serial)\n        {\n            ID = serial.ID;\n            Name = serial.Name;\n            Description = serial.Description;\n            DefaultValue = serial.DefaultValue;\n            Icon = serial.Icon;\n            Unit = serial.Unit;\n            UnitID = serial.UnitID;\n            HigherIsBetter = serial.HigherIsBetter;\n            Category = category;\n\n            switch (serial.ID)\n            {\n                case DBConstants.CPUNeedPropertyID:\n                    CPU = this;\n                    break;\n                case DBConstants.PGNeedPropertyID:\n                    Powergrid = this;\n                    break;\n            }\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the property's ID.\n        /// </summary>\n        public int ID { get; }\n\n        /// <summary>\n        /// Gets the property name (the displayName in the CCP tables).\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// Gets the property's description.\n        /// </summary>\n        public string Description { get; }\n\n        /// <summary>\n        /// Gets the string representation of the default value.\n        /// </summary>\n        public string DefaultValue { get; }\n\n        /// <summary>\n        /// Gets the icon for this property.\n        /// </summary>\n        public string Icon { get; }\n\n        /// <summary>\n        /// Gets the unit for this property.\n        /// </summary>\n        public string Unit { get; }\n\n        /// <summary>\n        /// Gets the unitID for this property.\n        /// </summary>\n        public long UnitID { get; }\n\n        /// <summary>\n        /// When true, the higher the value, the better it is.\n        /// </summary>\n        public bool HigherIsBetter { get; }\n\n        /// <summary>\n        /// Gets the property's category.\n        /// </summary>\n        public EvePropertyCategory Category { get; }\n\n        /// <summary>\n        /// When true, the property is always visible in the ships browsers, even when an object has no value for this property.\n        /// </summary>\n        public bool AlwaysVisibleForShips { get; internal set; }\n\n        /// <summary>\n        /// When true, the property is hidden in the ships/items browsers if the value is the same then the default value.\n        /// </summary>\n        public bool HideIfDefault { get; internal set; }\n\n        /// <summary>\n        /// Gets the CPU Output property.\n        /// </summary>\n        public static EveProperty CPU { get; private set; }\n\n        /// <summary>\n        /// Gets the Powergrid Output property.\n        /// </summary>\n        public static EveProperty Powergrid { get; private set; }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the label of this property's value for the given item or, when the property is absent, the default value.\n        /// The returned string will include the unit.\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">obj</exception>\n        public string GetLabelOrDefault(Item obj)\n        {\n            obj.ThrowIfNull(nameof(obj));\n\n            EvePropertyValue? value = obj.Properties[ID];\n            return Format(value?.Value ?? DefaultValue);\n        }\n\n        /// <summary>\n        /// Gets the numeric interpretation of the object's property value, or NaN if the property value is not a numeric. \n        /// When the given object has no value for this property, we use the default one.\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">obj</exception>\n        public double GetNumericValue(Item obj)\n        {\n            obj.ThrowIfNull(nameof(obj));\n\n            // Retrieve the string for the number\n            EvePropertyValue? value = obj.Properties[ID];\n            string number = value?.Value ?? DefaultValue;\n\n            // Try to parse it as a real\n            float result;\n            number.TryParseInv(out result);\n            // result is set to default(float) if it fails anyways\n            return result;\n        }\n\n        /// <summary>\n        /// Format a property value as shown in EVE.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        private string Format(string value)\n        {\n            float numericValue;\n            if (!value.TryParseInv(out numericValue))\n                return value;\n\n            try\n            {\n                // Format a value of Packaged Volume\n                if (Name == DBConstants.PackagedVolumePropertyName)\n                    return $\"{numericValue:N1} {Unit}\";\n\n                // Format a value of Structure Volume\n                if (ID == DBConstants.VolumePropertyID)\n                {\n                    return numericValue <= 1000\n                        ? $\"{numericValue:N2} {Unit}\"\n                        : $\"{numericValue:#,##0.0##} {Unit}\";\n                }\n\n                // Format a value of Capacitor Capacity\n                if (ID == DBConstants.CapacitorCapacityPropertyID)\n                    return $\"{Math.Floor(numericValue):N0} {Unit}\";\n\n                // Format a value of Ships Warp Speed\n                if (ID == DBConstants.ShipWarpSpeedPropertyID)\n                    return $\"{numericValue:N2} {Unit}\";\n\n                switch (UnitID)\n                {\n                        // Format a value of Mass\n                    case DBConstants.MassUnitID:\n                        return numericValue <= 1000\n                            ? $\"{numericValue:#,##0.0#} {Unit}\"\n                            : $\"{numericValue:N0} {Unit}\";\n\n                        // Format a value of Millseconds\n                    case DBConstants.MillsecondsUnitID:\n                        return $\"{numericValue / 1000:N2} {Unit}\";\n\n                        // Format a value of Absolute Percentage\n                    case DBConstants.AbsolutePercentUnitID:\n                        return $\"{numericValue * 100:0.###} {Unit}\";\n\n                        // Format a value of Inverse Absolute Percentage\n                    case DBConstants.InverseAbsolutePercentUnitID:\n                        return $\"{(1 - numericValue) * 100:0.###} {Unit}\";\n\n                        // Format a value of Modifier Percentage\n                    case DBConstants.ModifierPercentUnitID:\n                        return $\"{(numericValue - 1) * 100:0.###} {Unit}\";\n\n                        // Format a value of Inverse Modifier Percentage\n                    case DBConstants.InversedModifierPercentUnitID:\n                        return $\"{(1 - numericValue) * 100:0.###} {Unit}\";\n\n                        // A reference to a group (groupID), it has been pre-transformed on XmlGenerator\n                    case DBConstants.GroupIDUnitID:\n                        return value;\n\n                        // A reference to an item or a skill (typeID)\n                    case DBConstants.TypeUnitID:\n                        int id;\n                        return (!value.TryParseInv(out id) || id == 0) ? string.Empty :\n                            StaticItems.GetItemName(id);\n\n                        // Format a Sizeclass (\"1=small 2=medium 3=l\")\n                    case DBConstants.SizeclassUnitID:\n                        int size;\n                        value.TryParseInv(out size);\n                        switch (size)\n                        {\n                            case 1:\n                                return \"Small\";\n                            case 2:\n                                return \"Medium\";\n                            case 3:\n                                return \"Large\";\n                            case 4:\n                                return \"Extra Large\";\n                            default:\n                                return EveMonConstants.UnknownText;\n                        }\n\n                        // Format all other values (use of thousand and decimal separator)\n                    default:\n                        return $\"{numericValue:#,##0.###} {Unit}\";\n                }\n            }\n            catch (FormatException)\n            {\n                return \"N/A\";\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/EvePropertyCategory.cs",
    "content": "﻿using EVEMon.Common.Collections;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    public sealed class EvePropertyCategory : ReadonlyCollection<EveProperty>\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"serial\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">serial</exception>\n        public EvePropertyCategory(SerializablePropertyCategory serial)\n            : base(serial?.Properties.Count ?? 0)\n        {\n            serial.ThrowIfNull(nameof(serial));\n\n            ID = serial.ID;\n            Name = serial.Name;\n            Description = serial.Description;\n\n            foreach (SerializableProperty serialProp in serial.Properties)\n            {\n                Items.Add(new EveProperty(this, serialProp));\n            }\n\n            // Sets the display name\n            switch (Name)\n            {\n                default:\n                    DisplayName = Name;\n                    break;\n                case \"NULL\":\n                    DisplayName = \"System\";\n                    break;\n            }\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets this category's id.\n        /// </summary>\n        public int ID { get; }\n\n        /// <summary>\n        /// Gets this category's name.\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// Gets this category's description.\n        /// </summary>\n        public string Description { get; }\n\n        /// <summary>\n        /// Gets the category's display name.\n        /// </summary>\n        public string DisplayName { get; }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/EvePropertyCollection.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    public sealed class EvePropertyCollection : ReadonlyCollection<EvePropertyValue>\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Deserialization consructor.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        internal EvePropertyCollection(ICollection<SerializablePropertyValue> src)\n            : base(src?.Count ?? 0)\n        {\n            if (src == null)\n                return;\n\n            foreach (EvePropertyValue prop in src.Select(\n                srcProp => new EvePropertyValue(srcProp)).Where(prop => prop.Property != null))\n            {\n                Items.Add(prop);\n            }\n        }\n\n        #endregion\n\n\n        #region Indexers\n\n        /// <summary>\n        /// Gets a property from its id. If not found, return null.\n        /// </summary>\n        /// <param name=\"id\">The property id we're searching for.</param>\n        /// <returns>The wanted property when found; null otherwise.</returns>\n        public EvePropertyValue? this[int id]\n        {\n            get\n            {\n                foreach (EvePropertyValue prop in Items.TakeWhile(prop => prop.Property != null).Where(\n                    prop => prop.Property.ID == id))\n                {\n                    return prop;\n                }\n                return null;\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/EvePropertyValue.cs",
    "content": "﻿using EVEMon.Common.Constants;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Describes a property of a ship/item (e.g. CPU size)\n    /// </summary>\n    public struct EvePropertyValue\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        internal EvePropertyValue(SerializablePropertyValue src)\n            : this()\n        {\n            Property = StaticProperties.GetPropertyByID(src.ID);\n            Value = src.Value;\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the property.\n        /// </summary>\n        public EveProperty Property { get; }\n\n        /// <summary>\n        /// Gets the property value.\n        /// </summary>\n        public string Value { get; }\n\n        /// <summary>\n        /// Gets the integer value.\n        /// </summary>\n        public long Int64Value => long.Parse(Value, CultureConstants.InvariantCulture);\n\n        /// <summary>\n        /// Gets the floating point value.\n        /// </summary>\n        public double DoubleValue => double.Parse(Value, CultureConstants.InvariantCulture);\n\n        #endregion\n\n\n        #region Overridden Methods\n\n        /// <summary>\n        /// Gets a string representation of this prerequisite.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => Property.Name;\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/Faction.cs",
    "content": "using EVEMon.Common.Extensions;\nusing System;\n\nnamespace EVEMon.Common.Data\n{\n    public sealed class Faction\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"Faction\"/> class.\n        /// </summary>\n        /// <param name=\"station\">The station.</param>\n        /// <exception cref=\"System.ArgumentNullException\">station</exception>\n        public Faction(int id, NPCCorporation baseCorp, NPCCorporation militiaCorp, string name)\n        {\n            baseCorp.ThrowIfNull(nameof(baseCorp));\n            // Militia corp can be null\n            if (name.IsEmptyOrUnknown())\n                throw new ArgumentException(\"name\");\n\n            Corporation = baseCorp;\n            ID = id;\n            MilitiaCorporation = militiaCorp;\n            Name = name;\n        }\n\n        /// <summary>\n        /// Gets or sets the faction's executor corporation.\n        /// </summary>\n        /// <value>The executor NPC corporation.</value>\n        public NPCCorporation Corporation { get; }\n\n        /// <summary>\n        /// Gets or sets the faction's ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        public long ID { get; }\n\n        /// <summary>\n        /// Gets or sets the faction's militia corporation.\n        /// </summary>\n        /// <value>The militia NPC corporation.</value>\n        public NPCCorporation MilitiaCorporation { get; }\n\n        /// <summary>\n        /// Gets or sets the faction's name.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/Implant.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents an implant.\n    /// </summary>\n    public sealed class Implant : Item\n    {\n\n        #region Constructors\n\n        /// <summary>\n        /// Internal constructor for the default.\n        /// </summary>\n        internal Implant(ImplantSlots slot)\n            : base(-1, ImplantSlots.None.ToString())\n        {\n            Slot = slot;\n        }\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"group\"></param>\n        /// <param name=\"src\"></param>\n        internal Implant(MarketGroup group, SerializableItem src)\n            : base(group, src)\n        {\n            // Gets the slot\n            EvePropertyValue? slotProperty = Properties[DBConstants.ImplantSlotPropertyID];\n\n            if (slotProperty == null)\n                return;\n\n            Slot = (ImplantSlots)(slotProperty.Value.Int64Value - 1);\n\n            // Sets the implant bonus\n            SetImplantBonus();\n\n            // Adds itself to the implants slot\n            StaticItems.GetImplants(Slot).Add(this);\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the slot.\n        /// </summary>\n        public ImplantSlots Slot { get; }\n\n        /// <summary>\n        /// For attributes implants, gets the amount of bonus points it grants.\n        /// </summary>\n        public long Bonus { get; private set; }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Sets the implant bonus.\n        /// </summary>\n        private void SetImplantBonus()\n        {\n            EvePropertyValue? eveProperty;\n\n            // Get the bonus\n            switch (Slot)\n            {\n                case ImplantSlots.Charisma:\n                    eveProperty = Properties[DBConstants.CharismaModifierPropertyID];\n                    if (eveProperty != null)\n                        Bonus = eveProperty.Value.Int64Value;\n                    break;\n                case ImplantSlots.Intelligence:\n                    eveProperty = Properties[DBConstants.IntelligenceModifierPropertyID];\n                    if (eveProperty != null)\n                        Bonus = eveProperty.Value.Int64Value;\n                    break;\n                case ImplantSlots.Memory:\n                    eveProperty = Properties[DBConstants.MemoryModifierPropertyID];\n                    if (eveProperty != null)\n                        Bonus = eveProperty.Value.Int64Value;\n                    break;\n                case ImplantSlots.Perception:\n                    eveProperty = Properties[DBConstants.PerceptionModifierPropertyID];\n                    if (eveProperty != null)\n                        Bonus = eveProperty.Value.Int64Value;\n                    break;\n                case ImplantSlots.Willpower:\n                    eveProperty = Properties[DBConstants.WillpowerModifierPropertyID];\n                    if (eveProperty != null)\n                        Bonus = eveProperty.Value.Int64Value;\n                    break;\n                default:\n                    Bonus = 0;\n                    break;\n            }\n        }\n\n        #endregion\n\n\n        #region Static Methods\n\n        /// <summary>\n        /// Converts the provided slot to an attribute. Returns <see cref=\"EveAttribute.None\"/> when the provided slot does not match any attribute.\n        /// </summary>\n        /// <param name=\"slot\"></param>\n        /// <returns></returns>\n        public static EveAttribute SlotToAttrib(ImplantSlots slot)\n        {\n            switch (slot)\n            {\n                case ImplantSlots.Perception:\n                    return EveAttribute.Perception;\n                case ImplantSlots.Memory:\n                    return EveAttribute.Memory;\n                case ImplantSlots.Willpower:\n                    return EveAttribute.Willpower;\n                case ImplantSlots.Intelligence:\n                    return EveAttribute.Intelligence;\n                case ImplantSlots.Charisma:\n                    return EveAttribute.Charisma;\n                default:\n                    return EveAttribute.None;\n            }\n        }\n\n        /// <summary>\n        /// Converts the provided slot to an attribute. Returns <see cref=\"ImplantSlots.None\"/> when the provided slot does not match any attribute.\n        /// </summary>\n        /// <param name=\"attr\"></param>\n        /// <returns></returns>\n        public static ImplantSlots AttribToSlot(EveAttribute attr)\n        {\n            switch (attr)\n            {\n                case EveAttribute.Perception:\n                    return ImplantSlots.Perception;\n                case EveAttribute.Memory:\n                    return ImplantSlots.Memory;\n                case EveAttribute.Willpower:\n                    return ImplantSlots.Willpower;\n                case EveAttribute.Intelligence:\n                    return ImplantSlots.Intelligence;\n                case EveAttribute.Charisma:\n                    return ImplantSlots.Charisma;\n                default:\n                    return ImplantSlots.None;\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/ImplantCollection.cs",
    "content": "﻿using System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a collection of all the implants bound to a given group.\n    /// </summary>\n    public sealed class ImplantCollection : ReadonlyCollection<Implant>\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"slot\"></param>\n        internal ImplantCollection(ImplantSlots slot)\n        {\n            Items.Add(new Implant(slot));\n        }\n\n        #endregion\n\n\n        #region Indexers\n\n        /// <summary>\n        /// Gets an implant by its name.\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        public Implant this[string name] => Items.FirstOrDefault(implant => implant.Name == name);\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Add an implant to this slot.\n        /// </summary>\n        /// <param name=\"implant\"></param>\n        internal void Add(Implant implant)\n        {\n            Items.Add(implant);\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/Item.cs",
    "content": "using EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Datafiles;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Text;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Base class for ships, items, implants.\n    /// </summary>\n    public class Item\n    {\n        private readonly FastList<StaticSkillLevel> m_prerequisites;\n        private static Item s_unknownItem;\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Constructor for an unknown item.\n        /// </summary>\n        private Item()\n            : this(int.MaxValue, EveMonConstants.UnknownText)\n        {\n        }\n\n        /// <summary>\n        /// Base constructor for default items.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <param name=\"name\"></param>\n        internal Item(int id, string name)\n        {\n            ID = id;\n            Name = name;\n            Description = \"No description.\";\n\n            m_prerequisites = new FastList<StaticSkillLevel>(0);\n        }\n\n        /// <summary>\n        /// Base constructor for blueprints.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <param name=\"src\">The source.</param>\n        internal Item(MarketGroup group, SerializableBlueprint src)\n            : this(src.ID, src.Name)\n        {\n            Icon = src.Icon;\n            MetaGroup = src.MetaGroup;\n            MarketGroup = group;\n            Family = ItemFamily.Blueprint;\n\n            // Skills prerequisites\n            m_prerequisites = new FastList<StaticSkillLevel>(src.PrereqSkill?.Count ?? 0);\n            if (src.PrereqSkill == null)\n                return;\n\n            foreach (SerializablePrereqSkill prereq in src.PrereqSkill)\n            {\n                m_prerequisites.Add(new StaticSkillLevel(prereq.ID, prereq.Level, prereq.Activity));\n            }\n        }\n\n        /// <summary>\n        /// Base deserialization constructor.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <param name=\"src\">The source.</param>\n        internal Item(MarketGroup group, SerializableItem src)\n            : this(src.ID, src.Name)\n        {\n            MarketGroup = group;\n            Icon = src.Icon;\n            Race = src.Race;\n            FittingSlot = src.Slot == ItemSlot.None ? ItemSlot.NoSlot : src.Slot;\n            Family = src.Family;\n            Description = src.Description;\n            CategoryName = src.Category;\n            GroupName = src.Group;\n\n            PortionSize = src.PortionSize;\n            MetaLevel = src.MetaLevel;\n            MetaGroup = src.MetaGroup;\n\n            Properties = new EvePropertyCollection(src.Properties);\n            ReactionMaterial = new ReactionMaterialCollection(src.ReactionInfo);\n            ControlTowerFuel = new ControlTowerFuelCollection(src.ControlTowerFuelInfo);\n\n            // Skills prerequisites\n            m_prerequisites = new FastList<StaticSkillLevel>(src.PrerequisiteSkills?.Count ?? 0);\n            if (src.PrerequisiteSkills == null)\n                return;\n\n            foreach (SerializablePrerequisiteSkill prereq in src.PrerequisiteSkills)\n            {\n                m_prerequisites.Add(new StaticSkillLevel(prereq.ID, prereq.Level));\n            }\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets this object's ID.\n        /// </summary>\n        public int ID { get; }\n\n        /// <summary>\n        /// Gets this object's icon.\n        /// </summary>\n        public string Icon { get; }\n\n        /// <summary>\n        /// Gets this object's name\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// Gets the item's family.\n        /// </summary>\n        public ItemFamily Family { get; }\n\n        /// <summary>\n        /// Gets the race this object is bound to.\n        /// </summary>\n        public Race Race { get; }\n\n        /// <summary>\n        /// Gets this object's portion size.\n        /// </summary>\n        public int PortionSize { get; }\n\n        /// <summary>\n        /// Gets this object's description.\n        /// </summary>\n        public string Description { get; }\n\n        /// <summary>\n        /// Gets the metalevel this item belong to.\n        /// </summary>\n        public long MetaLevel { get; }\n\n        /// <summary>\n        /// Gets the category this item belong to.\n        /// </summary>\n        public string CategoryName { get; }\n\n        /// <summary>\n        /// Gets the group this item belong to.\n        /// </summary>\n        public string GroupName { get; }\n\n        /// <summary>\n        /// Gets the metagroup this item belong to.\n        /// </summary>\n        public ItemMetaGroup MetaGroup { get; }\n\n        /// <summary>\n        /// Gets the market group this item belong to.\n        /// </summary>\n        public MarketGroup MarketGroup { get; }\n\n        /// <summary>\n        /// Gets the slot this items fit to.\n        /// </summary>\n        public ItemSlot FittingSlot { get; }\n\n        /// <summary>\n        /// Gets the collection of properties of this object.\n        /// </summary>\n        public EvePropertyCollection Properties { get; }\n\n        /// <summary>\n        /// Gets the collection of reaction info of this object.\n        /// </summary>\n        public ReactionMaterialCollection ReactionMaterial { get; }\n\n        /// <summary>\n        /// Gets the collection of control tower fuel info of this object.\n        /// </summary>\n        public ControlTowerFuelCollection ControlTowerFuel { get; }\n\n        /// <summary>\n        /// Gets the collection of skills this object must satisfy to be used.\n        /// </summary>\n        public IEnumerable<StaticSkillLevel> Prerequisites => m_prerequisites;\n\n        /// <summary>\n        /// Gets the reprocessing materials and their quantities.\n        /// </summary>\n        public IEnumerable<Material> ReprocessingMaterials => StaticReprocessing.GetItemMaterialsByID(ID);\n\n        /// <summary>\n        /// Gets the skill used to reprocess those items.\n        /// </summary>\n        public StaticSkill ReprocessingSkill\n        {\n            get\n            {\n                EvePropertyValue? property = Properties[DBConstants.ReprocessingSkillPropertyID];\n\n                // Returns scrap metal processing by default\n                if (property == null)\n                    return StaticSkills.GetSkillByID(DBConstants.ScrapMetalProcessingSkillID);\n\n                // Returns the reprocessing skill specified by the property\n                long id = property.Value.Int64Value;\n                return StaticSkills.GetSkillByID(id);\n            }\n        }\n\n        /// <summary>\n        /// Gets the category path of this item.\n        /// </summary>\n        /// <returns></returns>\n        public string CategoryPath\n        {\n            get\n            {\n                StringBuilder sb = new StringBuilder();\n                MarketGroup cat = MarketGroup;\n\n                while (cat != null)\n                {\n                    sb.Insert(0, cat.Name);\n                    cat = cat.ParentGroup;\n                    if (cat != null)\n                        sb.Insert(0, \" > \");\n                }\n                return sb.ToString();\n            }\n        }\n\n        /// <summary>\n        /// Gets the unknown item.\n        /// </summary>\n        /// <value>\n        /// The unknown item.\n        /// </value>\n        public static Item UnknownItem => s_unknownItem ?? (s_unknownItem = new Item());\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        ///   Evaluates whether this item can be activated if the given CPU\n        ///   and/or PowerGrid resources are available. Either argument for this\n        ///   method can be null, which is interpreted as \"no upper limit\".\n        ///   If the CPU and/or Grid requirements for this item are unknown,\n        ///   the method returns false.\n        /// </summary>\n        /// <param name=\"cpuAvailable\">The upper limit for CPU usage, or null for unlimited.</param>\n        /// <param name=\"gridAvailable\">The upper limit for Grid usage or null for unlimited.</param>\n        /// <returns>true if both the CPU and powergrid requirements of this\n        /// item lie between 0.0d and the given bounds.</returns>\n        public bool CanActivate(double? cpuAvailable, double? gridAvailable)\n        {\n            // There are no limits, so anything fits\n            if (cpuAvailable == null && gridAvailable == null)\n                return true;\n\n            if (FittingSlot == ItemSlot.None)\n                return false;\n\n            // If we have a slot index, we're a fittable item\n            // Now see if we can find our usage numbers\n            string cpuUsage = FindProperty(EveProperty.CPU, null);\n            string gridUsage = FindProperty(EveProperty.Powergrid, null);\n\n            double? cpuRequired = TryParseNullable(TryStripTail(cpuUsage, \" tf\"));\n            double? gridRequired = TryParseNullable(TryStripTail(gridUsage, \" MW\"));\n\n            if (cpuRequired == null && gridRequired == null)\n                return false;\n\n            //We have information about this item, see if it fits\n            bool fits = true;\n            if (cpuAvailable != null)\n                fits &= cpuRequired <= cpuAvailable;\n\n            if (gridAvailable != null)\n                fits &= gridRequired <= gridAvailable;\n\n            return fits;\n\n            // We lack information about this item, or this item isn't fittable\n            // Return false as specced in the method docs\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Tries to strip the given tail from the end of some string.\n        /// </summary>\n        /// <param name=\"stripMe\">The string to evaluate</param>\n        /// <param name=\"tail\">The &quot;tail&quot; to try and remove</param>\n        /// <returns>null if stripMe is null, stripMe if tail is null or stripMe doesn't\n        /// end in tail, stripMe-with-tail-removed otherwise.</returns>\n        private static string TryStripTail(string stripMe, string tail)\n        {\n            if (stripMe == null)\n                return null;\n\n            if (tail == null)\n                return stripMe;\n\n            return stripMe.EndsWith(tail, StringComparison.CurrentCulture) ? stripMe.Remove(\n                stripMe.Length - tail.Length) : stripMe;\n        }\n\n        /// <summary>\n        /// Try to parse a String as a double. Returns null for any kind of\n        /// invalid input.\n        /// </summary>\n        /// <param name=\"parseMe\">The string to try and parse.</param>\n        /// <returns>The string as double, or null if failed to parse.</returns>\n        private static double? TryParseNullable(string parseMe)\n        {\n            double? result = null;\n            double tempValue;\n            if (parseMe.TryParseInv(out tempValue))\n                result = tempValue;\n            return result;\n        }\n\n        /// <summary>\n        /// Searches _properties for a property with the given property name and\n        /// returns its value. If the property isn't found, it returns the given\n        /// default value. If the property occurs more than once, only the first\n        /// occurance is considered.\n        /// </summary>\n        /// <param name=\"property\">The property name to look for.</param>\n        /// <param name=\"defaultValue\">The value to return if the property isn't found.</param>\n        /// <returns>Either the value of the named property, or the given default value.</returns>\n        private string FindProperty(EveProperty property, string defaultValue)\n        {\n            string result = defaultValue;\n            foreach (EvePropertyValue prop in Properties)\n            {\n                if (prop.Property != property)\n                    continue;\n\n                result = prop.Value;\n                break;\n            }\n            return result;\n        }\n\n        #endregion\n\n\n        #region Overridden Methods\n\n        /// <summary>\n        /// Gets a string representation of this object\n        /// </summary>\n        /// <returns>Name of the Item</returns>\n        public override string ToString() => Name;\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/ItemCollection.cs",
    "content": "﻿using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a read-only collection of items.\n    /// </summary>\n    public sealed class ItemCollection : ReadonlyCollection<Item>\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"group\">Market Group for the item</param>\n        /// <param name=\"src\">One or more source serializable items</param>\n        internal ItemCollection(MarketGroup group, ICollection<SerializableItem> src)\n            : base(src?.Count ?? 0)\n        {\n            if (src == null)\n                return;\n\n            foreach (SerializableItem item in src)\n            {\n                switch (item.Family)\n                {\n                    default:\n                        Items.Add(new Item(group, item));\n                        break;\n                    case ItemFamily.Implant:\n                        Items.Add(new Implant(group, item));\n                        break;\n                    case ItemFamily.Ship:\n                        Items.Add(new Ship(group, item));\n                        break;\n                }\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/MarketGroup.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents an item category\n    /// </summary>\n    public class MarketGroup\n    {\n        #region Constructors\n\n        /// <summary>\n        /// Deserialization constructor for root category only.\n        /// </summary>\n        /// <param name=\"src\">Source Serializable Market Group</param>\n        private MarketGroup(SerializableMarketGroup src)\n        {\n            ID = src.ID;\n            Name = src.Name;\n            SubGroups = new MarketGroupCollection(this, src.SubGroups);\n            Items = new ItemCollection(this, src.Items);\n        }\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"parent\">The Market Group this Market Group is contained within</param>\n        /// <param name=\"src\">Source Serializable Market Group</param>\n        public MarketGroup(MarketGroup parent, SerializableMarketGroup src)\n            : this(src)\n        {\n            ParentGroup = parent;\n        }\n\n        /// <summary>\n        /// Deserialization constructor for root category only.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        protected MarketGroup(SerializableBlueprintMarketGroup src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            ID = src.ID;\n            Name = src.Name;\n        }\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"parent\">The Market Group this Market Group is contained within</param>\n        /// <param name=\"src\">Source Blueprint Group</param>\n        protected MarketGroup(MarketGroup parent, SerializableBlueprintMarketGroup src)\n            : this(src)\n        {\n            ParentGroup = parent;\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the group ID.\n        /// </summary>\n        public int ID { get; }\n\n        /// <summary>\n        /// Gets the parent category. <c>Null</c> for the root category.\n        /// </summary>\n        public MarketGroup ParentGroup { get; }\n\n        /// <summary>\n        /// Gets the sub categories.\n        /// </summary>\n        public MarketGroupCollection SubGroups { get; }\n\n        /// <summary>\n        /// Gets the items in this category.\n        /// </summary>\n        public ItemCollection Items { get; }\n\n        /// <summary>\n        /// Gets this category's name.\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// Gets the collection of all the items in this category and its descendants.\n        /// </summary>\n        public IEnumerable<Item> AllItems\n        {\n            get\n            {\n                foreach (Item item in Items)\n                {\n                    yield return item;\n                }\n\n                foreach (Item subItem in SubGroups.SelectMany(cat => cat.AllItems))\n                {\n                    yield return subItem;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets this category full category name.\n        /// </summary>\n        public string CategoryPath\n        {\n            get\n            {\n                StringBuilder fullCategoryPath = new StringBuilder();\n                MarketGroup group = this;\n\n                while (group != null)\n                {\n                    fullCategoryPath.Insert(0, group.Name);\n                    group = group.ParentGroup;\n                    if (group != null)\n                        fullCategoryPath.Insert(0, \" > \");\n                }\n\n                return fullCategoryPath.ToString();\n            }\n        }\n\n        #endregion\n\n\n        #region Overidden Methods\n\n        /// <summary>\n        /// Gets the name of this item.\n        /// </summary>\n        /// <returns>Name of the Market Group.</returns>\n        public override string ToString() => Name;\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/MarketGroupCollection.cs",
    "content": "﻿using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a read-only collection of items.\n    /// </summary>\n    public sealed class MarketGroupCollection : ReadonlyCollection<MarketGroup>\n    {\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <param name=\"src\">The SRC.</param>\n        internal MarketGroupCollection(MarketGroup group, ICollection<SerializableMarketGroup> src)\n            : base(src?.Count ?? 0)\n        {\n            if (src == null)\n                return;\n\n            foreach (SerializableMarketGroup subCat in src)\n            {\n                Items.Add(new MarketGroup(group, subCat));\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/MarketGroupExtensions.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nnamespace EVEMon.Common.Data\n{\n    public static class MarketGroupExtensions\n    {\n        /// <summary>\n        /// Gets true if the item's market group belongs to the questioned group. \n        /// </summary>\n        public static bool BelongsIn(this MarketGroup marketGroup, int group)\n            => marketGroup.BelongsIn(new[] { group });\n\n        /// <summary>\n        /// Gets true if the item's market group belongs to the questioned group. \n        /// </summary>\n        public static bool BelongsIn(this MarketGroup marketGroup, IList<int> group)\n        {\n            while (marketGroup != null)\n            {\n                if (group.Any(x => x == marketGroup.ID))\n                    return true;\n\n                marketGroup = marketGroup.ParentGroup;\n            }\n\n            return false;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/Mastery.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a mastery level.\n    /// </summary>\n    public sealed class Mastery : ReadonlyCollection<MasteryCertificate>, IComparable<Mastery>\n    {\n        private bool m_updated;\n        private readonly Character m_character;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"masteryShip\">The mastery ship.</param>\n        /// <param name=\"src\">The source.</param>\n        internal Mastery(MasteryShip masteryShip, SerializableMastery src)\n            : base(src?.Certificates.Count ?? 0)\n        {\n            if (src != null)\n            {\n                MasteryShip = masteryShip;\n                Level = src.Grade;\n                Status = MasteryStatus.Untrained;\n                foreach (SerializableMasteryCertificate certificate in src.Certificates)\n                    Items.Add(new MasteryCertificate(this, certificate));\n            }\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"Mastery\"/> class.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"mastery\">The mastery.</param>\n        internal Mastery(Character character, Mastery mastery)\n            : base(mastery.Count)\n        {\n            m_character = character;\n            MasteryShip = mastery.MasteryShip;\n            Level = mastery.Level;\n            Status = MasteryStatus.Untrained;\n            foreach (MasteryCertificate masteryCertificate in mastery)\n                Items.Add(new MasteryCertificate(character, masteryCertificate));\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the mastery ship.\n        /// </summary>\n        public MasteryShip MasteryShip { get; }\n\n        /// <summary>\n        /// Gets the level.\n        /// </summary>\n        public int Level { get; }\n\n        /// <summary>\n        /// Gets the status.\n        /// </summary>\n        /// <value>\n        /// The status.\n        /// </value>\n        public MasteryStatus Status { get; private set; }\n\n        /// <summary>\n        /// Gets true whether the mastery is trained.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if this mastery is trained; otherwise, <c>false</c>.\n        /// </value>\n        public bool IsTrained => Status == MasteryStatus.Trained;\n\n        /// <summary>\n        /// Gets true whether the mastery is partially trained.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if this mastery is partilly trained; otherwise, <c>false</c>.\n        /// </value>\n        public bool IsPartiallyTrained => Status == MasteryStatus.PartiallyTrained;\n\n        /// <summary>\n        /// Gets the prerequisite skills.\n        /// </summary>\n        /// <returns></returns>\n        public IEnumerable<SkillLevel> GetPrerequisiteSkills() => Items.SelectMany(cert =>\n            cert.Certificate.PrerequisiteSkills.Where(level => (int)level.Key == Level).\n            SelectMany(level => level.Value.ToCharacter(m_character))).Distinct();\n\n        /// <summary>\n        /// Gets the training time.\n        /// </summary>\n        /// <returns></returns>\n        public TimeSpan GetTrainingTime() => m_character.GetTrainingTimeToMultipleSkills(\n            GetPrerequisiteSkills());\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Tries to update the mastery level status.\n        /// </summary>\n        public bool TryUpdateMasteryStatus()\n        {\n            if (m_updated)\n                return false;\n\n            bool noPrereq = true;\n            bool trained = true;\n\n            // Scan prerequisite skills\n            foreach (SkillLevel prereqSkill in GetPrerequisiteSkills())\n            {\n                // Trained only if the skill's level is greater or equal to the minimum level\n                trained = trained && prereqSkill.Skill.Level >= prereqSkill.Level;\n                noPrereq = noPrereq && prereqSkill.AllDependencies.All(x => !x.IsTrained);\n            }\n\n            // Updates status\n            if (trained)\n                Status = MasteryStatus.Trained;\n            else if (noPrereq)\n                Status = MasteryStatus.Untrained;\n            else\n                Status = MasteryStatus.PartiallyTrained;\n\n            m_updated = true;\n            return true;\n        }\n\n        /// <summary>\n        /// Sets this mastery as \"untrained\", a useful optimization for low-SP characters\n        /// (which are more numerous than maxed chars)\n        /// </summary>\n        public bool SetAsUntrained()\n        {\n            if (m_updated)\n                return false;\n\n            m_updated = true;\n            Status = MasteryStatus.Untrained;\n            return true;\n        }\n\n        #endregion\n\n        public int CompareTo(Mastery other)\n        {\n            MasteryShip sm = MasteryShip, osm = other.MasteryShip;\n            int comparison;\n            if (sm == null)\n                // NULL versions should not be intermixed, but if they are, put them last\n                comparison = (osm == null) ? 0 : 1;\n            else if (osm == null)\n                comparison = -1;\n            else\n            {\n                // Both are not null\n                string shipOne = sm.Ship?.Name ?? string.Empty, shipTwo = osm.Ship?.Name ??\n                    string.Empty;\n                comparison = shipOne.CompareTo(shipTwo);\n                if (comparison == 0)\n                    // Levels are 1 to 5, no overflow can occur here\n                    comparison = Level - other.Level;\n            }\n            return comparison;\n        }\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\" /> that represents this instance.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\" /> that represents this instance.\n        /// </returns>\n        public override string ToString() => \"Level \" + Skill.GetRomanFromInt(Level);\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/MasteryCertificate.cs",
    "content": "using System.Linq;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a mastery certificate.\n    /// </summary>\n    public sealed class MasteryCertificate\n    {\n\n        #region Constructor\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"masteryLevel\">The mastery level.</param>\n        /// <param name=\"src\">The source.</param>\n        internal MasteryCertificate(Mastery masteryLevel, SerializableMasteryCertificate src)\n        {\n            MasteryLevel = masteryLevel;\n            Certificate = StaticCertificates.GetCertificateByID(src.ID);\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MasteryCertificate\"/> class.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"masteryCertificate\">The mastery certificate.</param>\n        internal MasteryCertificate(Character character, MasteryCertificate masteryCertificate)\n        {\n            if (masteryCertificate == null)\n                return;\n\n            MasteryLevel = masteryCertificate.MasteryLevel;\n            Certificate = masteryCertificate.ToCharacter(character);\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the mastery level.\n        /// </summary>\n        public Mastery MasteryLevel { get; }\n\n        /// <summary>\n        /// Gets or sets the certificate.\n        /// </summary>\n        public StaticCertificate Certificate { get; }\n\n        /// <summary>\n        /// Gets this certificate's representation for the provided character.\n        /// </summary>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">character</exception>\n        public Certificate ToCharacter(Character character)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            return character.Certificates.FirstOrDefault(x => x.ID == Certificate.ID);\n        }\n\n        #endregion\n\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/MasteryShip.cs",
    "content": "using System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Datafiles;\nusing System.Collections.Generic;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a mastery ship.\n    /// </summary>\n    public sealed class MasteryShip : ReadonlyCollection<Mastery>\n    {\n\n        #region Constructor\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"ship\">The ship.</param>\n        internal MasteryShip(SerializableMasteryShip src, Ship ship) : base(src.Masteries.\n            Count)\n        {\n            Ship = ship;\n            // Add in sorted order 1-5\n            var masteriesSorted = new List<Mastery>(src.Masteries.Count);\n            foreach (var mastery in src.Masteries)\n                masteriesSorted.Add(new Mastery(this, mastery));\n            masteriesSorted.Sort();\n            Items.AddRange(masteriesSorted);\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MasteryShip\"/> class.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"masteryShip\">The mastery ship.</param>\n        internal MasteryShip(Character character, MasteryShip masteryShip) : base(masteryShip.\n            Count)\n        {\n            Character = character;\n            Ship = masteryShip.Ship;\n            // Add in sorted order 1-5\n            var masteriesSorted = new List<Mastery>(masteryShip.Count);\n            foreach (var mastery in masteryShip)\n                masteriesSorted.Add(new Mastery(character, mastery));\n            masteriesSorted.Sort();\n            Items.AddRange(masteriesSorted);\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the character this certificate is bound to.\n        /// </summary>\n        public Character Character { get; }\n\n        /// <summary>\n        /// Gets the ship.\n        /// </summary>\n        public Ship Ship { get; }\n\n        /// <summary>\n        /// Gets the highest trained mastery level.\n        /// May be null if no level has been trained.\n        /// </summary>\n        public Mastery HighestTrainedLevel => Items.LastOrDefault(level => level.IsTrained);\n\n        #endregion\n\n        /// <summary>\n        /// Gets the level.\n        /// </summary>\n        /// <param name=\"level\">The level.</param>\n        /// <returns></returns>\n        public Mastery GetLevel(int level) => Items.FirstOrDefault(mastery => mastery.Level ==\n            level);\n\n        /// <summary>\n        /// Initializes the mastery.\n        /// </summary>\n        /// <exception cref=\"System.ArgumentNullException\">character</exception>\n        internal void Initialize()\n        {\n            bool updatedAnything;\n            do\n            {\n                updatedAnything = false;\n                bool previousUntrained = false;\n                // Iterate 1 to 5\n                // If a mastery is untrained, then we know that all levels above it are\n                // also untrained\n                foreach (var mastery in Items)\n                {\n                    if (!previousUntrained)\n                    {\n                        updatedAnything = updatedAnything | mastery.TryUpdateMasteryStatus();\n                        previousUntrained = mastery.Status == Enumerations.MasteryStatus.\n                            Untrained;\n                    }\n                    else\n                        // This method had side effects (setting m_updated to true) which are\n                        // also satisfied here\n                        updatedAnything = updatedAnything | mastery.SetAsUntrained();\n                }\n            } while (updatedAnything);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/MasteryShipCollection.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Data\n{\n    public class MasteryShipCollection : ReadonlyKeyedCollection<int, MasteryShip>\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MasteryShipCollection\"/> class.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        public MasteryShipCollection(Character character)\n        {\n            // Builds the list\n            foreach (var masteryShip in StaticMasteries.AllMasteryShips)\n                if (masteryShip.Ship != null)\n                    Items[masteryShip.Ship.ID] = new MasteryShip(character, masteryShip);\n        }\n\n        /// <summary>\n        /// Gets the mastery ship by identifier.\n        /// </summary>\n        /// <param name=\"id\">The identifier.</param>\n        /// <returns></returns>\n        public MasteryShip GetMasteryShipByID(int id) => Items.ContainsKey(id) ? Items[id] :\n            null;\n\n        /// <summary>\n        /// Initializes each item in the collection.\n        /// </summary>\n        public void Initialize()\n        {\n            foreach (KeyValuePair<int, MasteryShip> item in Items)\n                item.Value.Initialize();\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/Material.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a product of the reprocessing.\n    /// </summary>\n    public class Material\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public Material(SerializableMaterialQuantity src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            Item = StaticItems.GetItemByID(src.ID);\n            Quantity = src.Quantity;\n        }\n\n        #endregion\n\n\n        # region Public Properties\n\n        /// <summary>\n        /// Gets the reprocessing item.\n        /// </summary>\n        public Item Item { get; }\n\n        /// <summary>\n        /// Gets the reprocessed quantity.\n        /// </summary>\n        public long Quantity { get; }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/MaterialCollection.cs",
    "content": "using System.Collections.Generic;\nusing EVEMon.Common.Collections;\n\nnamespace EVEMon.Common.Data\n{\n    public sealed class MaterialCollection : ReadonlyCollection<Material>\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MaterialCollection\"/> class.\n        /// </summary>\n        /// <param name=\"materials\">The materials.</param>\n        internal MaterialCollection(ICollection<Material> materials)\n            : base(materials?.Count ?? 0)\n        {\n            if (materials == null)\n                return;\n\n            foreach (Material material in materials)\n            {\n                Items.Add(material);\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/NPCCorporation.cs",
    "content": "using EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Data\n{\n    public sealed class NPCCorporation\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"NPCCorporation\"/> class.\n        /// </summary>\n        /// <param name=\"station\">The station.</param>\n        /// <exception cref=\"System.ArgumentNullException\">station</exception>\n        public NPCCorporation(Station station)\n        {\n            station.ThrowIfNull(nameof(station));\n\n            ID = station.CorporationID;\n            Name = station.CorporationName;\n        }\n\n        /// <summary>\n        /// Gets or sets the corporation's ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        public long ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the corporation's name.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/Planet.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Datafiles;\nusing System;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a planet inside the EVE universe.\n    /// </summary>\n    public class Planet : IComparable<Planet>\n    {\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SolarSystem\"/> class.\n        /// </summary>\n        /// <param name=\"owner\">The owner.</param>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">owner or src</exception>\n        public Planet(SolarSystem owner, SerializablePlanet src)\n        {\n            owner.ThrowIfNull(nameof(owner));\n            src.ThrowIfNull(nameof(src));\n\n            SolarSystem = owner;\n            ID = src.ID;\n            Name = src.Name;\n            TypeID = src.TypeID;\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Compares this planet with another one.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">other</exception>\n        public int CompareTo(Planet other)\n        {\n            other.ThrowIfNull(nameof(other));\n\n            return SolarSystem != other.SolarSystem\n                ? SolarSystem.CompareTo(other.SolarSystem)\n                : string.Compare(Name, other.Name, StringComparison.CurrentCulture);\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets this object's id.\n        /// </summary>\n        public int ID { get; }\n\n        /// <summary>\n        /// Gets this object's name.\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// Gets this object's parent solar system.\n        /// </summary>\n        public SolarSystem SolarSystem { get; }\n\n        /// <summary>\n        /// Gets this object's type ID.\n        /// </summary>\n        public int TypeID { get; }\n\n        #endregion\n\n\n        #region Overridden Methods\n\n        public override string ToString() => Name;\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/ReactionMaterial.cs",
    "content": "using EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    public sealed class ReactionMaterial : Material\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public ReactionMaterial(SerializableReactionInfo src)\n            : base(src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            IsInput = src.IsInput;\n        }\n\n        #endregion\n\n\n        # region Public Properties\n\n        /// <summary>\n        /// Gets a value indicating whether the item is a resource or a product.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if this instance is input; otherwise, <c>false</c>.\n        /// </value>\n        public bool IsInput { get; }\n\n        #endregion\n\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/ReactionMaterialCollection.cs",
    "content": "using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    public sealed class ReactionMaterialCollection : ReadonlyCollection<SerializableReactionInfo>\n    {       \n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ReactionMaterialCollection\"/> class.\n        /// </summary>\n        /// <param name=\"reactionInfo\">The reactionInfo.</param>\n        internal ReactionMaterialCollection(ICollection<SerializableReactionInfo> reactionInfo)\n            : base(reactionInfo?.Count ?? 0)\n        {\n            if (reactionInfo == null)\n                return;\n\n            foreach (SerializableReactionInfo reaction in reactionInfo)\n            {\n                Items.Add(reaction);\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/Region.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a region of the EVE universe.\n    /// </summary>\n    public sealed class Region : ReadonlyCollection<Constellation>, IComparable<Region>\n    {\n        # region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        internal Region(SerializableRegion src)\n            : base(src.Constellations.Count)\n        {\n            ID = src.ID;\n            Name = src.Name;\n\n            foreach (SerializableConstellation srcConstellation in src.Constellations)\n            {\n                Items.Add(new Constellation(this, srcConstellation));\n            }\n        }\n\n        internal Region()\n        {\n            ID = 0;\n            Name = \"unknown\";\n        }\n        #endregion\n\n\n        # region Public Properties\n\n        /// <summary>\n        /// Gets this object's id.\n        /// </summary>\n        public long ID { get; }\n\n        /// <summary>\n        /// Gets this object's name.\n        /// </summary>\n        public string Name { get; }\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Compare two regions by their names.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">other</exception>\n        public int CompareTo(Region other)\n        {\n            other.ThrowIfNull(nameof(other));\n\n            return string.Compare(Name, other.Name, StringComparison.CurrentCulture);\n        }\n\n        #endregion\n\n\n        #region Overridden Methods\n\n        /// <summary>\n        /// Gets the name of this object.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => Name;\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/Ship.cs",
    "content": "using EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a readonly ship definition.\n    /// </summary>\n    public class Ship : Item\n    {\n        # region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <param name=\"src\">The source.</param>\n        internal Ship(MarketGroup group, SerializableItem src)\n            : base(group, src)\n        {\n            Recommendations = new StaticRecommendations<StaticCertificate>();\n        }\n\n        #endregion\n\n\n        # region Public Properties\n\n        /// <summary>\n        /// Gets the recommended certificates.\n        /// </summary>\n        public StaticRecommendations<StaticCertificate> Recommendations { get; }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/SolarSystem.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a solar system of the EVE universe.\n    /// </summary>\n    public sealed class SolarSystem : ReadonlyCollection<Station>, IComparable<SolarSystem>\n    {\n        /// <summary>\n        /// The unknown solar system, with an empty location and ID of 0.\n        /// </summary>\n        public static readonly SolarSystem UNKNOWN = new SolarSystem();\n\n        // Do not set this as readonly !\n        private FastList<SolarSystem> m_jumps;\n\n        // The planets in this system.\n        private readonly FastList<Planet> m_planets;\n\n        private readonly int m_x;\n        private readonly int m_y;\n        private readonly int m_z;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SolarSystem\"/> class.\n        /// </summary>\n        /// <param name=\"owner\">The owner.</param>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">owner or src</exception>\n        public SolarSystem(Constellation owner, SerializableSolarSystem src)\n            : base(src?.Stations?.Count ?? 0)\n        {\n            owner.ThrowIfNull(nameof(owner));\n            src.ThrowIfNull(nameof(src));\n\n            ID = src.ID;\n            Constellation = owner;\n            Name = src.Name;\n            SecurityLevel = src.SecurityLevel;\n            FullLocation = $\"{owner.FullLocation} > {src.Name}\";\n            m_jumps = new FastList<SolarSystem>(0);\n\n            m_x = src.X;\n            m_y = src.Y;\n            m_z = src.Z;\n\n            if (src.Stations != null)\n                foreach (SerializableStation srcStation in src.Stations)\n                    Items.Add(new Station(this, srcStation));\n\n            if (src.Planets != null)\n            {\n                // Add planets\n                m_planets = new FastList<Planet>(src.Planets.Count);\n                foreach (SerializablePlanet srcPlanet in src.Planets)\n                    m_planets.Add(new Planet(this, srcPlanet));\n            }\n            else\n                m_planets = new FastList<Planet>(1);\n        }\n\n        public SolarSystem()\n        {\n            ID = 0;\n            Constellation = new Constellation();\n            SecurityLevel = 0.0F;\n            FullLocation = \"\";\n        }\n        #endregion\n\n\n        # region Public Properties\n\n        /// <summary>\n        /// Gets this object's id.\n        /// </summary>\n        public int ID { get; }\n\n        /// <summary>\n        /// Gets this object's name.\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// Gets the real security level, between -1.0 and +1.0\n        /// </summary>\n        public float SecurityLevel { get; }\n\n        /// <summary>\n        /// Gets the constellation this solar system is located.\n        /// </summary>\n        public Constellation Constellation { get; }\n\n        /// <summary>\n        /// Gets something like Region > Constellation > Solar System.\n        /// </summary>\n        public string FullLocation { get; }\n\n        /// <summary>\n        /// Gets the planets in this solar system.\n        /// </summary>\n        public ICollection<Planet> Planets\n        {\n            get { return m_planets; }\n        }\n\n        /// <summary>\n        /// Gets or sets the color of the security level.\n        /// </summary>\n        /// <value>The color of the security level.</value>\n        public Color SecurityLevelColor\n        {\n            get\n            {\n                if (IsNullSec)\n                    return Color.Red;\n\n                return IsLowSec ? Color.DarkOrange : Color.Green;\n            }\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether this solar system is in high sec.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if this solar system is in high sec; otherwise, <c>false</c>.\n        /// </value>\n        public bool IsHighSec => Math.Round(SecurityLevel, 1) >= 0.5;\n\n        /// <summary>\n        /// Gets a value indicating whether this solar system is in low sec.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if this solar system is in low sec; otherwise, <c>false</c>.\n        /// </value>\n        public bool IsLowSec\n        {\n            get\n            {\n                double secLevel = Math.Round(SecurityLevel, 1);\n                return secLevel > 0 && secLevel < 0.5;\n            }\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether this solar system is in null sec.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if this solar system is in null sec; otherwise, <c>false</c>.\n        /// </value>\n        public bool IsNullSec => Math.Round(SecurityLevel, 1) <= 0;\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Looks up a planet by its ID.\n        /// </summary>\n        /// <param name=\"planetID\">The planet ID.</param>\n        /// <returns>The planet, or null if the planet is not in this system.</returns>\n        public Planet FindPlanetByID(int planetID)\n        {\n            Planet planet = null;\n            // May look slow but there are only a few planets per system\n            foreach (var srcPlanet in m_planets)\n                if (srcPlanet.ID == planetID)\n                {\n                    planet = srcPlanet;\n                    break;\n                }\n            return planet;\n        }\n\n        /// <summary>\n        /// Gets the square distance with the given system.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">other</exception>\n        public int GetSquareDistanceWith(SolarSystem other)\n        {\n            other.ThrowIfNull(nameof(other));\n\n            int dx = m_x - other.m_x;\n            int dy = m_y - other.m_y;\n            int dz = m_z - other.m_z;\n\n            return dx * dx + dy * dy + dz * dz;\n        }\n\n        /// <summary>\n        /// Gets the solar systems within the given range.\n        /// </summary>\n        /// <param name=\"maxInclusiveNumberOfJumps\">The maximum, inclusive, number of jumps from this system.</param>\n        /// <returns></returns>\n        public IEnumerable<SolarSystemRange> GetSystemsWithinRange(int maxInclusiveNumberOfJumps)\n            => SolarSystemRange.GetSystemRangesFrom(this, maxInclusiveNumberOfJumps);\n\n        /// <summary>\n        /// Find the guessed shortest path using a A* (heuristic) algorithm.\n        /// </summary>\n        /// <param name=\"target\">The target system.</param>\n        /// <param name=\"criteria\">The path searching criteria.</param>\n        /// <param name=\"minSecurityLevel\">The minimum, inclusive, real security level. Systems have levels between -1 and +1.</param>\n        /// <param name=\"maxSecurityLevel\">The maximum, inclusive, real security level. Systems have levels between -1 and +1.</param>\n        /// <returns>\n        /// The list of systems, beginning with this one and ending with the provided target.\n        /// </returns>\n        public IEnumerable<SolarSystem> GetFastestPathTo(SolarSystem target, PathSearchCriteria criteria,\n            float minSecurityLevel = -1.0f, float maxSecurityLevel = 1.0f)\n            => PathFinder.FindBestPath(this, target, criteria, minSecurityLevel, maxSecurityLevel);\n\n        /// <summary>\n        /// Gets the systems which have a jumpgate connection with his one.\n        /// </summary>\n        public IEnumerable<SolarSystem> Neighbors => m_jumps;\n\n        #endregion\n\n\n        # region Internal Methods\n\n        /// <summary>\n        /// Adds a neighbor with a jumpgate connection to this system.\n        /// </summary>\n        /// <param name=\"system\"></param>\n        internal void AddNeighbor(SolarSystem system)\n        {\n            m_jumps.Add(system);\n        }\n\n        /// <summary>\n        /// Trims the neighbors list.\n        /// </summary>\n        internal void TrimNeighbors()\n        {\n            if (m_jumps.Capacity > m_jumps.Count)\n                m_jumps.Trim();\n        }\n\n        #endregion\n\n\n        #region Overridden Methods\n\n        /// <summary>\n        /// Gets the name of this object.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => Name;\n\n        /// <summary>\n        /// Gets the ID of the object.\n        /// </summary>\n        /// <returns></returns>\n        public override int GetHashCode() => ID;\n\n        #endregion\n\n\n        #region Comparer Method\n\n        /// <summary>\n        /// Compares this system with another one.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">other</exception>\n        public int CompareTo(SolarSystem other)\n        {\n            other.ThrowIfNull(nameof(other));\n\n            return Constellation != other.Constellation\n                ? Constellation.CompareTo(other.Constellation)\n                : string.Compare(Name, other.Name, StringComparison.CurrentCulture);\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/SolarSystemRange.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents the collections of solar systems at a given number of jumps of a certain solar system.\n    /// </summary>\n    public sealed class SolarSystemRange : ReadonlyCollection<SolarSystem>\n    {\n        # region Private constructor\n\n        /// <summary>\n        /// Private constructor.\n        /// </summary>\n        /// <param name=\"source\">The source.</param>\n        /// <param name=\"range\">The range.</param>\n        private SolarSystemRange(SolarSystem source, int range)\n            : base(1)\n        {\n            Source = source;\n            Range = range;\n        }\n\n        #endregion\n\n\n        # region Public Properties\n\n        /// <summary>\n        /// Gets the source solar system.\n        /// </summary>\n        public SolarSystem Source { get; }\n\n        /// <summary>\n        /// The number of jumps those system are located from the source.\n        /// </summary>\n        public int Range { get; }\n\n        #endregion\n\n\n        /// <summary>\n        /// Gets a list of solar systems within the specified range of the specified solar system.\n        /// </summary>\n        /// <param name=\"system\">The system.</param>\n        /// <param name=\"maxInclusiveNumberOfJumps\">The maximum, inclusive, number of jumps.</param>\n        /// <returns></returns>\n        internal static IEnumerable<SolarSystemRange> GetSystemRangesFrom(SolarSystem system, int maxInclusiveNumberOfJumps)\n        {\n            Dictionary<long, SolarSystem> collectedSystems = new Dictionary<long, SolarSystem>();\n            List<SolarSystemRange> ranges = new List<SolarSystemRange>();\n            SolarSystemRange lastRange = new SolarSystemRange(system, 0);\n\n            collectedSystems.Add(system.ID, system);\n            lastRange.Items.Add(system);\n\n            for (int i = 1; i <= maxInclusiveNumberOfJumps; i++)\n            {\n                lastRange = lastRange.GetNextRange(collectedSystems);\n                ranges.Add(lastRange);\n            }\n\n            return ranges;\n        }\n\n        /// <summary>\n        /// Gets the next solar system range.\n        /// </summary>\n        /// <returns></returns>\n        private SolarSystemRange GetNextRange(IDictionary<long, SolarSystem> collectedSystems)\n        {\n            SolarSystemRange nextRange = new SolarSystemRange(Source, Range + 1);\n\n            foreach (SolarSystem child in Items.SelectMany(system => system.Neighbors.Where(\n                child => !collectedSystems.ContainsKey(child.ID))))\n            {\n                collectedSystems.Add(child.ID, child);\n                nextRange.Items.Add(child);\n            }\n\n            return nextRange;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticBlueprints.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections.Global;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents the list of all static blueprints.\n    /// </summary>\n    public static class StaticBlueprints\n    {\n        private static readonly Dictionary<int, Blueprint> s_blueprintsByID = new Dictionary<int, Blueprint>();\n\n\n        #region Initialization\n\n        /// <summary>\n        /// Initialize static blueprints.\n        /// </summary>\n        internal static void Load()\n        {\n            if (BlueprintMarketGroups != null)\n                return;\n\n            BlueprintsDatafile datafile = Util.DeserializeDatafile<BlueprintsDatafile>(DatafileConstants.BlueprintsDatafile,\n                Util.LoadXslt(Properties.Resources.DatafilesXSLT));\n\n            BlueprintMarketGroups = new BlueprintMarketGroupCollection(null, datafile.MarketGroups);\n\n            foreach (BlueprintMarketGroup srcGroup in BlueprintMarketGroups)\n            {\n                InitializeDictionaries(srcGroup);\n            }\n\n            GlobalDatafileCollection.OnDatafileLoaded();\n        }\n\n        /// <summary>\n        /// Recursively collect the blueprints within all groups and stores them in the dictionaries.\n        /// </summary>\n        /// <param name=\"marketGroup\"></param>\n        private static void InitializeDictionaries(BlueprintMarketGroup marketGroup)\n        {\n            foreach (Blueprint blueprint in marketGroup.Blueprints)\n            {\n                s_blueprintsByID[blueprint.ID] = blueprint;\n            }\n\n            foreach (BlueprintMarketGroup childGroup in marketGroup.SubGroups)\n            {\n                InitializeDictionaries(childGroup);\n            }\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the root category, containing all the top level categories\n        /// </summary>\n        public static BlueprintMarketGroupCollection BlueprintMarketGroups { get; private set; }\n\n        /// <summary>\n        /// Gets the collection of all the blueprints in this category and its descendants.\n        /// </summary>\n        public static IEnumerable<Blueprint> AllBlueprints => s_blueprintsByID.Values;\n\n        #endregion\n\n\n        #region Public Finders\n\n        /// <summary>\n        /// Recursively searches the root category and all underlying categories\n        /// for the first blueprint with an Id matching the given blueprintId.\n        /// </summary>\n        /// <param name=\"blueprintId\">The id of the blueprint to find.</param>\n        /// <returns>The first blueprint which id matches blueprintId, Null if no such blueprint is found.</returns>\n        public static Blueprint GetBlueprintByID(int blueprintId)\n        {\n            Blueprint value;\n            s_blueprintsByID.TryGetValue(blueprintId, out value);\n            return value;\n        }\n\n        /// <summary>\n        /// Recursively searches the root category and all underlying categories\n        /// for the first blueprint with a name matching the given blueprintId.\n        /// </summary>\n        /// <param name=\"blueprintName\">The name of the blueprint to find.</param>\n        /// <returns>The first blueprint which name matches blueprintName, Null if no such blueprint is found.</returns>\n        public static Blueprint GetBlueprintByName(string blueprintName)\n            => s_blueprintsByID.Values.FirstOrDefault(x => x.Name == blueprintName);\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticCertificate.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a certificate from the datafiles.\n    /// </summary>\n    public sealed class StaticCertificate\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from XML.\n        /// </summary>\n        /// <param name=\"certClass\"></param>\n        /// <param name=\"src\"></param>\n        internal StaticCertificate(StaticCertificateClass certClass, SerializableCertificate src)\n        {\n            ID = src.ID;\n            Description = src.Description;\n            Class = certClass;\n            Grades = new Dictionary<CertificateGrade, List<StaticSkillLevel>>();\n            PrerequisiteSkills = new Dictionary<CertificateGrade, List<StaticSkillLevel>>();\n\n            // Recommendations\n            Recommendations = new StaticRecommendations<Item>();\n            if (src.Recommendations == null || StaticItems.ShipsMarketGroup == null)\n                return;\n\n            foreach (Ship ship in src.Recommendations\n                .Select(recommendation => StaticItems.ShipsMarketGroup.AllItems.OfType<Ship>()\n                    .FirstOrDefault(item => item.Name == recommendation.ShipName))\n                .Where(ship => ship != null))\n            {\n                ship.Recommendations.Add(this);\n                Recommendations.Add(ship);\n            }\n        }\n\n        #endregion\n\n\n        # region Public Properties\n\n        /// <summary>\n        /// Gets this certificate's ID.\n        /// </summary>\n        public int ID { get; }\n\n        /// <summary>\n        /// Gets the certificate's class.\n        /// </summary>\n        public StaticCertificateClass Class { get; }\n\n        /// <summary>\n        /// Gets this certificate's description.\n        /// </summary>\n        public string Description { get; }\n\n        /// <summary>\n        /// Gets this certificate's grades.\n        /// </summary>\n        public IDictionary<CertificateGrade, List<StaticSkillLevel>> Grades { get; }\n\n        /// <summary>\n        /// Gets the ships this certificate is recommended for.\n        /// </summary>\n        public StaticRecommendations<Item> Recommendations { get; }\n\n        /// <summary>\n        /// Gets the prerequisite skills.\n        /// </summary>\n        public Dictionary<CertificateGrade, List<StaticSkillLevel>> PrerequisiteSkills { get; }\n\n        /// <summary>\n        /// Gets all the top-level prerequisite skills\n        /// </summary>\n        public IEnumerable<StaticSkillLevel> AllTopPrerequisiteSkills\n        {\n            get\n            {\n                long[] highestLevels = new long[StaticSkills.ArrayIndicesCount];\n                List<StaticSkillLevel> list = new List<StaticSkillLevel>();\n\n                // Collect all prerequisites from skills\n                foreach (StaticSkillLevel skillPrereq in PrerequisiteSkills.SelectMany(entry => entry.Value).Where(\n                    skillPrereq => skillPrereq.Skill != null && highestLevels[skillPrereq.Skill.ArrayIndex] < skillPrereq.Level))\n                {\n                    highestLevels[skillPrereq.Skill.ArrayIndex] = skillPrereq.Level;\n                    list.Add(skillPrereq);\n                }\n\n                // Return the result\n                foreach (StaticSkillLevel newItem in list.Where(\n                    newItem => highestLevels[newItem.Skill.ArrayIndex] != 0))\n                {\n                    yield return new StaticSkillLevel(newItem.Skill, highestLevels[newItem.Skill.ArrayIndex]);\n                    highestLevels[newItem.Skill.ArrayIndex] = 0;\n                }\n            }\n        }\n\n        # endregion\n\n\n        # region Helper Methods\n\n        /// <summary>\n        /// Completes the initialization by updating the prerequisites.\n        /// </summary>\n        internal void CompleteInitialization(IEnumerable<SerializableCertificatePrerequisite> prereqs)\n        {\n            foreach (var prereqGrade in prereqs.GroupBy(x => x.Grade))\n            {\n                var prereqList = new List<StaticSkillLevel>(32);\n                foreach (var prereq in prereqGrade)\n                {\n                    int level;\n                    if (prereq.Level.TryParseInv(out level))\n                        prereqList.Add(new StaticSkillLevel(prereq.ID, level));\n                }\n                PrerequisiteSkills.Add(prereqGrade.Key, prereqList);\n            }\n        }\n\n        #endregion\n\n\n        #region Overridden Methods\n\n        /// <summary>\n        /// Gets a string representation of this certificate.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => Description;\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticCertificateClass.cs",
    "content": "﻿using EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a certificate class.\n    /// </summary>\n    public sealed class StaticCertificateClass\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"group\"></param>\n        /// <param name=\"src\"></param>\n        internal StaticCertificateClass(StaticCertificateGroup group, SerializableCertificateClass src)\n        {\n            ID = src.ID;\n            Name = src.Name;\n            Description = src.Description;\n            Group = group;\n            Certificate = new StaticCertificate(this, src.Certificate);\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets this class's id.\n        /// </summary>\n        public int ID { get; }\n\n        /// <summary>\n        /// Gets this class's name.\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// Gets this class's description.\n        /// </summary>\n        public string Description { get; }\n\n        /// <summary>\n        /// Gets the certificates class's Group.\n        /// </summary>\n        public StaticCertificateGroup Group { get; }\n\n        public StaticCertificate Certificate { get; }\n\n        #endregion\n\n        \n        #region Overridden Methods\n\n        /// <summary>\n        /// Gets a string representation of this class.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => Name;\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticCertificateGroup.cs",
    "content": "﻿using EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a certificate group.\n    /// </summary>\n    public sealed class StaticCertificateGroup : ReadonlyCollection<StaticCertificateClass>\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        internal StaticCertificateGroup(SerializableCertificateGroup src)\n            : base(src.Classes.Count)\n        {\n            ID = src.ID;\n            Name = src.Name;\n            Description = src.Description;\n\n            foreach (SerializableCertificateClass srcClass in src.Classes)\n            {\n                Items.Add(new StaticCertificateClass(this, srcClass));\n            }\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets this group's id.\n        /// </summary>\n        public int ID { get; }\n\n        /// <summary>\n        /// Gets this group's name.\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// Gets this group's description.\n        /// </summary>\n        public string Description { get; }\n\n        #endregion\n\n\n        #region Overridden Methods\n\n        /// <summary>\n        /// Gets a string representation of this class.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => Name;\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticCertificates.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing EVEMon.Common.Collections.Global;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// The static list of the certificates.\n    /// </summary>\n    public static class StaticCertificates\n    {\n        private static readonly Dictionary<string, StaticCertificateClass> s_classesByName =\n            new Dictionary<string, StaticCertificateClass>();\n\n        private static readonly Dictionary<int, StaticCertificate> s_certificatesByID = new Dictionary<int, StaticCertificate>();\n\n\n        #region Initialization\n\n        /// <summary>\n        /// Initialize static certificates.\n        /// </summary>\n        internal static void Load()\n        {\n            CertificatesDatafile datafile = Util.DeserializeDatafile<CertificatesDatafile>(DatafileConstants.CertificatesDatafile,\n                    Util.LoadXslt(Properties.Resources.DatafilesXSLT));\n\n            AllGroups = new Collection<StaticCertificateGroup>();\n\n            foreach (SerializableCertificateGroup srcGroup in datafile.Groups)\n            {\n                AllGroups.Add(new StaticCertificateGroup(srcGroup));\n            }\n\n            // Build inner collections\n            foreach (StaticCertificateClass certClass in AllGroups.SelectMany(certClass => certClass))\n            {\n                s_classesByName[certClass.Name] = certClass;\n                s_certificatesByID[certClass.Certificate.ID] = certClass.Certificate;\n            }\n\n            // Completes intialization\n            foreach (SerializableCertificateClass srcClass in datafile.Groups.SelectMany(srcGroup => srcGroup.Classes))\n            {\n                s_classesByName[srcClass.Name].Certificate.CompleteInitialization(srcClass.Certificate.Prerequisites);\n            }\n\n            GlobalDatafileCollection.OnDatafileLoaded();\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the categories, sorted by name.\n        /// </summary>\n        public static Collection<StaticCertificateGroup> AllGroups { get; private set; }\n\n        /// <summary>\n        /// Gets the certificate classes, hierarchically sorted (category's name, class's name).\n        /// </summary>\n        public static IEnumerable<StaticCertificateClass> AllClasses => AllGroups.SelectMany(certClass => certClass);\n\n        /// <summary>\n        /// Gets the certificates, hierarchically sorted (category's name, class's name, grade).\n        /// </summary>\n        public static IEnumerable<StaticCertificate> AllCertificates\n            => AllGroups\n                .SelectMany(group => group, (group, certClass) => new { group, certClass })\n                .Select(x => x.certClass.Certificate);\n\n        #endregion\n\n\n        #region Public Finders\n\n        /// <summary>\n        /// Gets the certificate with the specified ID.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public static StaticCertificate GetCertificateByID(int id) => s_certificatesByID[id];\n\n        /// <summary>\n        /// Gets the certificates class with the specified name.\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        public static StaticCertificateClass GetCertificateClassByName(string name) => s_classesByName[name];\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticGeography.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections.Global;\nusing EVEMon.Common.Serialization.Datafiles;\nusing EVEMon.Common.Constants;\nusing System;\nusing System.Globalization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Stores all the data regarding geography.\n    /// </summary>\n    public static class StaticGeography\n    {\n        #region Fields\n\n        private static readonly Dictionary<int, Faction> s_factionsByID = new Dictionary<int, Faction>();\n        private static readonly Dictionary<int, Region> s_regionsByID = new Dictionary<int, Region>();\n        private static readonly Dictionary<int, Constellation> s_constellationsByID = new Dictionary<int, Constellation>();\n        private static readonly Dictionary<long, Planet> s_planetsByID = new Dictionary<long, Planet>();\n        private static readonly Dictionary<int, SolarSystem> s_solarSystemsByID = new Dictionary<int, SolarSystem>();\n        private static readonly Dictionary<long, Station> s_stationsByID = new Dictionary<long, Station>();\n        private static readonly Dictionary<int, NPCCorporation> s_corporationsByID = new Dictionary<int, NPCCorporation>();\n        private static readonly Dictionary<int, Agent> s_agentsByID = new Dictionary<int, Agent>();\n\n        #endregion\n\n\n        #region Initialization\n\n        /// <summary>\n        /// Initialize static geography.\n        /// </summary>\n        internal static void Load()\n        {\n            GeoDatafile datafile = LoadGeoData();\n            LoadFactions();\n\n            CompleteInitialization(datafile);\n\n            GlobalDatafileCollection.OnDatafileLoaded();\n        }\n\n        /// <summary>\n        /// Initialize the NPC factions.\n        /// </summary>\n        private static void LoadFactions()\n        {\n            // This is a workaround until XmlGenerator can be updated\n            foreach (string factionInfo in Properties.Resources.chrFactions.Split('\\n'))\n            {\n                string[] entries = factionInfo.Split(',');\n                NPCCorporation baseCorp = null, militiaCorp = null;\n                if (entries.Length > 9)\n                {\n                    // factionID,factionName,description,raceIDs,solarSystemID,corporationID,\n                    // sizeFactor,stationCount,stationSystemCount,militiaCorporationID,iconID\n                    int id, end = entries.Length, corpID, militiaID;\n                    string factionName = entries[1].Trim();\n                    // Find executor and militia corps (also NPC)\n                    if (entries[end - 2].TryParseInv(out militiaID))\n                        militiaCorp = GetCorporationByID(militiaID);\n                    if (entries[end - 6].TryParseInv(out corpID))\n                        baseCorp = GetCorporationByID(corpID);\n                    if (entries[0].TryParseInv(out id) && !string.IsNullOrEmpty(factionName) &&\n                            id > 0 && baseCorp != null)\n                        s_factionsByID.Add(id, new Faction(id, baseCorp, militiaCorp,\n                            factionName));\n                }\n            }\n        }\n\n        /// <summary>\n        /// Initializes the geography gzip data file.\n        /// </summary>\n        private static GeoDatafile LoadGeoData()\n        {\n            var datafile = Util.DeserializeDatafile<GeoDatafile>(DatafileConstants.GeographyDatafile,\n                Util.LoadXslt(Properties.Resources.DatafilesXSLT));\n\n            // Generate the nodes\n            foreach (SerializableRegion srcRegion in datafile.Regions)\n            {\n                Region region = new Region(srcRegion);\n                s_regionsByID[srcRegion.ID] = region;\n\n                // Store the children into their dictionaries\n                foreach (Constellation constellation in region)\n                {\n                    s_constellationsByID[constellation.ID] = constellation;\n\n                    foreach (SolarSystem solarSystem in constellation)\n                    {\n                        s_solarSystemsByID[solarSystem.ID] = solarSystem;\n\n                        // Add planets to global lookup\n                        var systemPlanets = solarSystem.Planets;\n                        if (systemPlanets != null)\n                            foreach (var planet in systemPlanets)\n                                s_planetsByID[planet.ID] = planet;\n\n                        foreach (Station station in solarSystem)\n                        {\n                            s_stationsByID[station.ID] = station;\n\n                            s_corporationsByID[station.CorporationID] = new NPCCorporation(station);\n\n                            foreach (Agent agent in station)\n                                s_agentsByID[agent.ID] = agent;\n                        }\n                    }\n                }\n            }\n\n            return datafile;\n        }\n\n        /// <summary>\n        /// Completes the initialization.\n        /// </summary>\n        /// <param name=\"datafile\">The datafile.</param>\n        private static void CompleteInitialization(GeoDatafile datafile)\n        {\n            // Connects the systems\n            foreach (SerializableJump srcJump in datafile.Jumps)\n            {\n                SolarSystem a = GetSolarSystemByID(srcJump.FirstSystemID);\n                SolarSystem b = GetSolarSystemByID(srcJump.SecondSystemID);\n\n                if (a == null || b == null)\n                    continue;\n\n                a.AddNeighbor(b);\n                b.AddNeighbor(a);\n            }\n\n            foreach (SolarSystem system in s_solarSystemsByID.Values)\n            {\n                system.TrimNeighbors();\n            }\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets an enumeration of all the regions in the universe.\n        /// </summary>\n        public static IEnumerable<Region> AllRegions => s_regionsByID.Values;\n\n        /// <summary>\n        /// Gets an enumeration of all the constellations in the universe.\n        /// </summary>\n        public static IEnumerable<Constellation> AllConstellations => s_constellationsByID.Values;\n\n        /// <summary>\n        /// Gets an enumeration of all the solar systems in the universe.\n        /// </summary>\n        public static IEnumerable<SolarSystem> AllSolarSystems => s_solarSystemsByID.Values;\n\n        /// <summary>\n        /// Gets an enumeration of all the stations in the universe.\n        /// </summary>\n        public static IEnumerable<Station> AllStations => s_stationsByID.Values;\n\n        /// <summary>\n        /// Gets an enumeration of all the NPCCorporations in the universe.\n        /// </summary>\n        public static IEnumerable<NPCCorporation> AllNPCCorporations => s_corporationsByID.Values;\n\n        /// <summary>\n        /// Gets an enumeration of all the agents in the universe.\n        /// </summary>\n        public static IEnumerable<Agent> AllAgents => s_agentsByID.Values;\n\n        #endregion\n\n\n        #region Public Finders\n\n        /// <summary>\n        /// Gets the region with the provided ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns></returns>\n        public static Region GetRegionByID(int id)\n        {\n            Region result;\n            s_regionsByID.TryGetValue(id, out result);\n            return result;\n        }\n        \n        /// <summary>\n        /// Gets the constellation with the provided ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns></returns>\n        public static Constellation GetConstellationByID(int id)\n        {\n            Constellation result;\n            s_constellationsByID.TryGetValue(id, out result);\n            return result;\n        }\n\n        /// <summary>\n        /// Gets the planet with the provided ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns></returns>\n        public static Planet GetPlanetByID(int id)\n        {\n            Planet result;\n            s_planetsByID.TryGetValue(id, out result);\n            return result;\n        }\n\n        /// <summary>\n        /// Gets the system with the provided ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns></returns>\n        public static SolarSystem GetSolarSystemByID(int id)\n        {\n            SolarSystem result;\n            s_solarSystemsByID.TryGetValue(id, out result);\n            return result;\n        }\n\n        /// <summary>\n        /// Gets the system name with the provided ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns>The system name, or EveMonConstants.UnknownText if no system has this ID</returns>\n        public static string GetSolarSystemName(int id)\n        {\n            return GetSolarSystemByID(id)?.Name ?? EveMonConstants.UnknownText;\n        }\n\n        /// <summary>\n        /// Gets the system with the provided name. Slow!\n        /// </summary>\n        /// <param name=\"name\">The name.</param>\n        /// <returns></returns>\n        public static SolarSystem GetSolarSystemByName(string name) => s_solarSystemsByID.\n            Values.FirstOrDefault(system => system.Name == name);\n\n        /// <summary>\n        /// Gets the station with the provided ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns></returns>\n        public static Station GetStationByID(long id)\n        {\n            Station result;\n            s_stationsByID.TryGetValue(id, out result);\n            return result;\n        }\n        \n        /// <summary>\n        /// Gets the NPC Corporation with the provided ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns></returns>\n        public static NPCCorporation GetCorporationByID(int id)\n        {\n            NPCCorporation result;\n            s_corporationsByID.TryGetValue(id, out result);\n            return result;\n        }\n        \n        /// <summary>\n        /// Gets the agent with the provided ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns></returns>\n        public static Agent GetAgentByID(int id)\n        {\n            Agent result;\n            s_agentsByID.TryGetValue(id, out result);\n            return result;\n        }\n\n        /// <summary>\n        /// Gets the agent with the provided name.\n        /// </summary>\n        /// <param name=\"name\">The name.</param>\n        /// <returns></returns>\n        public static Agent GetAgentByName(string name) => s_agentsByID.Values.FirstOrDefault(\n            agent => agent.Name.Equals(name, StringComparison.InvariantCulture));\n\n        /// <summary>\n        /// Gets the faction with the provided ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns></returns>\n        public static Faction GetFactionByID(int id)\n        {\n            Faction result;\n            s_factionsByID.TryGetValue(id, out result);\n            return result;\n        }\n\n        #endregion\n\n\n        /// <summary>\n        /// The description of the range.\n        /// </summary>\n        public static string GetRange(int range)\n        {\n            switch (range)\n            {\n                case 0:\n                    return \"stations\";\n                case 1:\n                    return \"solar systems\";\n                case 2:\n                    return \"5 jumps\";\n                case 3:\n                    return \"10 jumps\";\n                case 4:\n                    return \"20 jumps\";\n                case 5:\n                    return \"regions\";\n                default:\n                    return string.Empty;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticItems.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections.Global;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents all the items loaded from the datafiles. \n    /// </summary>\n    public static class StaticItems\n    {\n        private static readonly Dictionary<int, MarketGroup> s_marketGroupsByID = new Dictionary<int, MarketGroup>();\n        private static readonly Dictionary<int, Item> s_itemsByID = new Dictionary<int, Item>();\n        private static readonly ImplantCollection[] s_implantSlots = new ImplantCollection[10];\n\n\n        #region Initialization\n\n        /// <summary>\n        /// Initialize static items.\n        /// </summary>\n        internal static void Load()\n        {\n            if (MarketGroups != null)\n                return;\n\n            // Create the implants slots\n            for (int i = 0; i < s_implantSlots.Length; i++)\n            {\n                s_implantSlots[i] = new ImplantCollection((ImplantSlots)i);\n            }\n\n            // Deserialize the items datafile\n            ItemsDatafile datafile = Util.DeserializeDatafile<ItemsDatafile>(DatafileConstants.ItemsDatafile,\n                Util.LoadXslt(Properties.Resources.DatafilesXSLT));\n\n            MarketGroups = new MarketGroupCollection(null, datafile.MarketGroups);\n\n            // Gather the items into a by-ID dictionary\n            foreach (MarketGroup marketGroup in MarketGroups)\n            {\n                InitializeDictionaries(marketGroup);\n            }\n\n            GlobalDatafileCollection.OnDatafileLoaded();\n        }\n\n        /// <summary>\n        /// Recursively collect the items within all groups and stores them in the dictionaries.\n        /// </summary>\n        /// <param name=\"marketGroup\"></param>\n        private static void InitializeDictionaries(MarketGroup marketGroup)\n        {\n            // Special groups\n            if (marketGroup.ID == DBConstants.ShipsMarketGroupID)\n                ShipsMarketGroup = marketGroup;\n\n            s_marketGroupsByID[marketGroup.ID] = marketGroup;\n\n            foreach (Item item in marketGroup.Items)\n            {\n                s_itemsByID[item.ID] = item;\n            }\n\n            foreach (MarketGroup childGroup in marketGroup.SubGroups)\n            {\n                InitializeDictionaries(childGroup);\n            }\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the root category, containing all the top level categories.\n        /// </summary>\n        public static MarketGroupCollection MarketGroups { get; private set; }\n\n        /// <summary>\n        /// Gets the market group for ships.\n        /// </summary>\n        public static MarketGroup ShipsMarketGroup { get; private set; }\n\n        /// <summary>\n        /// Gets the collection of all the market groups in this category and its descendants.\n        /// </summary>\n        public static IEnumerable<MarketGroup> AllGroups => s_marketGroupsByID.Values;\n\n        /// <summary>\n        /// Gets the collection of all the items in this category and its descendants.\n        /// </summary>\n        public static IEnumerable<Item> AllItems => s_itemsByID.Values;\n\n        #endregion\n\n\n        #region Public Finders\n\n        /// <summary>\n        /// Gets the collection of implants for the given slot.\n        /// </summary>\n        /// <param name=\"slot\"></param>\n        /// <returns></returns>\n        public static ImplantCollection GetImplants(ImplantSlots slot) => s_implantSlots[(int)slot];\n\n        /// <summary>\n        /// Recursively searches the root category and all underlying categories\n        /// for the first item with an Id matching the given itemId.\n        /// </summary>\n        /// <param name=\"itemId\">The id of the item to find.</param>\n        /// <returns>The first item which id matches itemId, Null if no such item is found.</returns>\n        public static Item GetItemByID(int itemId)\n        {\n            Item value;\n            s_itemsByID.TryGetValue(itemId, out value);\n            return value;\n        }\n\n        /// <summary>\n        /// Shorthand for GetItemByID that returns \"unknown\" if item is not in the database.\n        /// </summary>\n        /// <param name=\"itemId\">The id of the item to find.</param>\n        /// <returns>The first item name which id matches Item ID, EveMonConstants.UnknownText if no such item is found.</returns>\n        public static string GetItemName(int itemId)\n        {\n            return GetItemByID(itemId)?.Name ?? EveMonConstants.UnknownText;\n        }\n\n        /// <summary>\n        /// Recursively searches the root category and all underlying categories for the first item with a \n        /// name that exactly matches the given itemName.\n        /// </summary>\n        /// <param name=\"itemName\">The name of the item to find.</param>\n        /// <returns>The first item which name matches itemName, Null if no such item is found.</returns>\n        public static Item GetItemByName(string itemName)\n            => s_itemsByID.Values.FirstOrDefault(item => item.Name == itemName);\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticMasteries.cs",
    "content": "﻿using System.Collections.Generic;\nusing EVEMon.Common.Collections.Global;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// The static list of the masteries.\n    /// </summary>\n    public static class StaticMasteries\n    {\n        private static readonly Dictionary<int, MasteryShip> s_masteryShipsByID =\n            new Dictionary<int, MasteryShip>();\n\n\n        #region Initialization\n\n        /// <summary>\n        /// Initialize static masteries.\n        /// </summary>\n        internal static void Load()\n        {\n            MasteriesDatafile datafile = Util.DeserializeDatafile<MasteriesDatafile>(\n                DatafileConstants.MasteriesDatafile);\n\n            foreach (SerializableMasteryShip srcShip in datafile.MasteryShips)\n            {\n                Ship ship = StaticItems.GetItemByID(srcShip.ID) as Ship;\n                if (ship != null)\n                    s_masteryShipsByID[ship.ID] = new MasteryShip(srcShip, ship);\n            }\n\n            GlobalDatafileCollection.OnDatafileLoaded();\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets an enumeration of all the mastery ships.\n        /// </summary>\n        public static IEnumerable<MasteryShip> AllMasteryShips => s_masteryShipsByID.Values;\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticProperties.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections.Global;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    public static class StaticProperties\n    {\n        #region Fields\n\n        private static readonly Dictionary<int, EvePropertyCategory> s_categoriesByID =\n            new Dictionary<int, EvePropertyCategory>();\n\n        private static readonly Dictionary<string, EvePropertyCategory> s_categoriesByName =\n            new Dictionary<string, EvePropertyCategory>();\n\n        private static readonly Dictionary<int, EveProperty> s_propertiesByID = new Dictionary<int, EveProperty>();\n        private static readonly Dictionary<string, EveProperty> s_propertiesByName = new Dictionary<string, EveProperty>();\n\n        #endregion\n\n\n        #region Initilization\n\n        /// <summary>\n        /// Initialize static properties.\n        /// </summary>\n        internal static void Load()\n        {\n            PropertiesDatafile datafile = \n                Util.DeserializeDatafile<PropertiesDatafile>(DatafileConstants.PropertiesDatafile,\n                    Util.LoadXslt(Properties.Resources.DatafilesXSLT));\n\n            // Fetch deserialized data\n            foreach (EvePropertyCategory category in datafile.Categories.Select(\n                srcCategory => new EvePropertyCategory(srcCategory)))\n            {\n                s_categoriesByID[category.ID] = category;\n                s_categoriesByName[category.Name] = category;\n\n                // Store properties\n                foreach (EveProperty property in category)\n                {\n                    s_propertiesByID[property.ID] = property;\n                    s_propertiesByName[property.Name] = property;\n                }\n            }\n\n            // Set visibility in ships browser\n            foreach (int propertyID in DBConstants.AlwaysVisibleForShipPropertyIDs.Where(\n                propertyID => s_propertiesByID.ContainsKey(propertyID)))\n            {\n                s_propertiesByID[propertyID].AlwaysVisibleForShips = true;\n            }\n\n            // Set hide if default for properties\n            // we want to hide in browser if they just show their default value\n            foreach (int propertyID in DBConstants.HideIfDefaultPropertyIDs.Where(\n                propertyID => s_propertiesByID.ContainsKey(propertyID)))\n            {\n                s_propertiesByID[propertyID].HideIfDefault = true;\n            }\n\n            GlobalDatafileCollection.OnDatafileLoaded();\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the list of properties categories.\n        /// </summary>\n        public static IEnumerable<EvePropertyCategory> AllCategories\n        {\n            get\n            {\n                if (s_categoriesByID.Keys.Any(id => id == 0))\n                    return s_categoriesByName.Values;\n                return s_categoriesByID.Values;\n            }\n        }\n\n        /// <summary>\n        /// Gets the list of properties.\n        /// </summary>\n        public static IEnumerable<EveProperty> AllProperties => s_propertiesByID.Values;\n\n        #endregion\n\n\n        #region Public Finders\n\n        /// <summary>\n        /// Gets a property by its id.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public static EveProperty GetPropertyByID(int id)\n        {\n            EveProperty property;\n            s_propertiesByID.TryGetValue(id, out property);\n            return property;\n        }\n\n        /// <summary>\n        /// Gets a property by its name.\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        public static EveProperty GetPropertyByName(string name)\n        {\n            EveProperty property;\n            s_propertiesByName.TryGetValue(name, out property);\n            return property;\n        }\n\n        /// <summary>\n        /// Gets a group by its id.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public static EvePropertyCategory GetCategoryByID(int id)\n        {\n            EvePropertyCategory category;\n            s_categoriesByID.TryGetValue(id, out category);\n            return category;\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticRecommendations.cs",
    "content": "﻿using EVEMon.Common.Collections;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a list of recommendations\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public sealed class StaticRecommendations<T> : ReadonlyCollection<T>\n    {\n        /// <summary>\n        /// Default constructor, only used during datafiles initialization\n        /// </summary>\n        internal StaticRecommendations()\n        {\n        }\n\n        /// <summary>\n        /// Adds the given item to the recommendations list.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        internal void Add(T item)\n        {\n            Items.Add(item);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticReprocessing.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections.Global;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Stores all the data regarding reprocessing.\n    /// </summary>\n    public static class StaticReprocessing\n    {\n        private static readonly Dictionary<int, MaterialCollection> s_itemMaterialsByID = new Dictionary<int, MaterialCollection>();\n\n        /// <summary>\n        /// Initialize static reprocssing information.\n        /// </summary>\n        internal static void Load()\n        {\n            ReprocessingDatafile datafile = Util.DeserializeDatafile<ReprocessingDatafile>(\n                DatafileConstants.ReprocessingDatafile, Util.LoadXslt(Properties.Resources.DatafilesXSLT));\n\n            foreach (SerializableItemMaterials item in datafile.Items)\n            {\n                MaterialCollection materials = new MaterialCollection(item.Materials.Select(itemMaterial => new Material(itemMaterial)).ToList());\n                s_itemMaterialsByID[item.ID] = materials;\n            }\n\n            GlobalDatafileCollection.OnDatafileLoaded();\n        }\n\n        /// <summary>\n        /// Gets an enumeration of all the reprocessing materials.\n        /// </summary>\n        public static IEnumerable<MaterialCollection> AllReprocessingMaterials => s_itemMaterialsByID.Values;\n\n        /// <summary>\n        /// Gets the materials for the provided itemID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns></returns>\n        public static IEnumerable<Material> GetItemMaterialsByID(int id)\n        {\n            MaterialCollection result;\n            s_itemMaterialsByID.TryGetValue(id, out result);\n            return result;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticRequiredMaterial.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    public class StaticRequiredMaterial : Item\n    {\n        #region Constructors\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        internal StaticRequiredMaterial(SerializableRequiredMaterial src)\n            : base(src.ID, GetName(src.ID))\n        {\n            Quantity = src.Quantity;\n            Activity = (BlueprintActivity)Enum.ToObject(typeof(BlueprintActivity), src.Activity);\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the quantity.\n        /// </summary>\n        public long Quantity { get; }\n\n        /// <summary>\n        /// Gets or sets the activity.\n        /// </summary>\n        public BlueprintActivity Activity { get; }\n\n        #endregion\n\n\n        #region Private Finders\n\n        /// <summary>\n        /// Gets the material's name.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns></returns>\n        private static string GetName(int id)\n        {\n            Item item = StaticItems.GetItemByID(id);\n\n            return item?.Name ?? string.Empty;\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticSkill.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a skill definition. Characters use their own representation, through <see cref=\"Skill\"/>.\n    /// </summary>\n    public sealed class StaticSkill : IStaticSkill\n    {\n        private static StaticSkill s_unknownStaticSkill;\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Constructor for an unknown static skill.\n        /// </summary>\n        private StaticSkill()\n        {\n            ID = int.MaxValue;\n            Name = $\"{EveMonConstants.UnknownText} Skill\";\n            Description = \"An unknown skill.\";\n            ArrayIndex = short.MaxValue;\n            Prerequisites = new Collection<StaticSkillLevel>();\n            PrimaryAttribute = EveAttribute.None;\n            SecondaryAttribute = EveAttribute.None;\n            Group = StaticSkillGroup.UnknownStaticSkillGroup;\n            FormattedCost = Cost.ToNumericString(0);\n            AlphaLimit = 0;\n       }\n\n        /// <summary>\n        /// Deserialization constructor from datafiles.\n        /// </summary>\n        /// <param name=\"group\"></param>\n        /// <param name=\"src\"></param>\n        /// <param name=\"arrayIndex\"></param>\n        internal StaticSkill(StaticSkillGroup group, SerializableSkill src, int arrayIndex)\n        {\n            ID = src.ID;\n            Cost = src.Cost;\n            Rank = src.Rank;\n            IsPublic = src.Public;\n            Name = src.Name;\n            Description = src.Description;\n            PrimaryAttribute = src.PrimaryAttribute;\n            SecondaryAttribute = src.SecondaryAttribute;\n            ArrayIndex = arrayIndex;\n            Group = group;\n            Prerequisites = new Collection<StaticSkillLevel>();\n            FormattedCost = Cost.ToNumericString(0);\n            AlphaLimit = src.AlphaLimit;\n        }\n\n        #endregion\n\n\n        #region Initialization\n\n        /// <summary>\n        /// Completes the initialization by updating the prequisites and checking trainability on trial account.\n        /// </summary>\n        internal void CompleteInitialization(IEnumerable<SerializableSkillPrerequisite> prereqs)\n        {\n            if (prereqs == null)\n                return;\n\n            // Create the prerequisites list\n            Prerequisites.AddRange(prereqs.Select(x => new StaticSkillLevel(x.GetSkill(), x.Level)));\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the ID of this skill.\n        /// </summary>\n        public int ID { get; }\n\n        /// <summary>\n        /// Gets a zero-based index for skills (allow the use of arrays to optimize computations).\n        /// </summary>\n        public int ArrayIndex { get; }\n\n        /// <summary>\n        /// Gets the name of this skill (interned).\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// Gets the description of this skill.\n        /// </summary>\n        public string Description { get; }\n\n        /// <summary>\n        /// Gets the rank of this skill.\n        /// </summary>\n        public long Rank { get; }\n\n        /// <summary>\n        /// Gets the skill's cost.\n        /// </summary>\n        public long Cost { get; }\n\n        /// <summary>\n        /// Gets the skill group this skill is part of.\n        /// </summary>\n        public StaticSkillGroup Group { get; }\n\n        /// <summary>\n        /// Gets false when the skill is not for sale by any NPC (CCP never published it or removed it from the game, it's inactive).\n        /// </summary>\n        public bool IsPublic { get; }\n\n        /// <summary>\n        /// Gets the primary attribute of this skill.\n        /// </summary>\n        public EveAttribute PrimaryAttribute { get; }\n\n        /// <summary>\n        /// Gets the secondary attribute of this skill.\n        /// </summary>\n        public EveAttribute SecondaryAttribute { get; }\n\n        /// <summary>\n        /// Get whether skill is trainable on a alpha account.\n        /// </summary>\n        public bool AlphaFriendly { get { return AlphaLimit > 0; } }\n\n        /// <summary>\n        /// Get the level limit for an alpha clone.\n        /// </summary>\n        public long AlphaLimit { get; private set; }\n\n        /// <summary>\n        /// Gets the prerequisites a character must satisfy before it can be trained.\n        /// </summary>\n        public Collection<StaticSkillLevel> Prerequisites { get; }\n\n        /// <summary>\n        /// Gets a formatted representation of the price.\n        /// </summary>\n        public string FormattedCost { get; }\n\n        /// <summary>\n        /// Gets all the prerequisites. I.e, for eidetic memory, it will return <c>{ instant recall IV }</c>.\n        /// The order matches the hierarchy but skills are not duplicated and are systematically trained to the highest required level.\n        /// For example, if some skill is required to lv3 and, later, to lv4, this first time it is encountered, lv4 is returned.\n        /// </summary>\n        /// <value>All prerequisites.</value>\n        /// <remarks>Please note they may be redundancies.</remarks>\n        public IEnumerable<StaticSkillLevel> AllPrerequisites\n        {\n            get\n            {\n                long[] highestLevels = new long[StaticSkills.ArrayIndicesCount];\n                List<StaticSkillLevel> list = new List<StaticSkillLevel>();\n\n                // Fill the array\n                foreach (StaticSkillLevel prereq in Prerequisites)\n                {\n                    StaticSkillEnumerableExtensions.FillPrerequisites(highestLevels, list, prereq, true);\n                }\n\n                // Return the result\n                foreach (StaticSkillLevel newItem in list.Where(x => highestLevels[x.Skill.ArrayIndex] != 0))\n                {\n                    yield return new StaticSkillLevel(newItem.Skill, highestLevels[newItem.Skill.ArrayIndex]);\n                    highestLevels[newItem.Skill.ArrayIndex] = 0;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets the unknown static skill.\n        /// </summary>\n        /// <value>\n        /// The unknown static skill.\n        /// </value>\n        public static StaticSkill UnknownStaticSkill => s_unknownStaticSkill ?? (s_unknownStaticSkill = new StaticSkill());\n\n        #endregion\n\n\n        #region Public Methods - Computations\n\n        /// <summary>\n        /// Calculates the cumulative points required for a level of this skill (starting from a zero level).\n        /// </summary>\n        /// <param name=\"level\">The level.</param>\n        /// <returns>The required nr. of points.</returns>\n        /// <exception cref=\"NotImplementedException\"></exception>\n        public long GetPointsRequiredForLevel(long level)\n        {\n            // Much faster than the old formula. This one too may have 1pt difference here and there, only on the lv2 skills\n            switch (level)\n            {\n                case -1:\n                case 0:\n                    return 0;\n                case 1:\n                    return 250 * Rank;\n                case 2:\n                    switch (Rank)\n                    {\n                        case 1:\n                            return 1415;\n                        default:\n                            return (int)(Rank * 1414.3f + 0.5f);\n                    }\n                case 3:\n                    return 8000 * Rank;\n                case 4:\n                    return Convert.ToInt32(Math.Ceiling(Math.Pow(2, 2.5 * level - 2.5) * 250 * Rank));\n                case 5:\n                    return 256000 * Rank;\n                default:\n                    throw new NotImplementedException($\"One of our devs messed up. Skill level was {level} ?!\");\n            }\n        }\n\n        /// <summary>\n        /// Calculates the cumulative points required for a level of this skill (starting from a zero level).\n        /// </summary>\n        /// <param name=\"level\">The level.</param>\n        /// <returns>The required nr. of points.</returns>\n        public long GetPointsRequiredForLevelOnly(int level)\n        {\n            if (level == 0)\n                return 0;\n\n            return GetPointsRequiredForLevel(level) - GetPointsRequiredForLevelOnly(level - 1);\n        }\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Gets this skill's representation for the provided character.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">character</exception>\n        public Skill ToCharacter(Character character)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            return character.Skills.GetByArrayIndex(ArrayIndex);\n        }\n\n        #endregion\n\n\n        #region Overridden Methods\n\n        /// <summary>\n        /// Gets a string representation for this skill (the name of the skill).\n        /// </summary>\n        /// <returns>Name of the Static Skill.</returns>\n        public override string ToString() => Name;\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticSkillGroup.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a readonly skill group definition. Characters have their own implementations, <see cref=\"SkillGroup\"/>\n    /// </summary>\n    public sealed class StaticSkillGroup : ReadonlyKeyedCollection<int, StaticSkill>\n    {\n        private static StaticSkillGroup s_unknownStaticSkillGroup;\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Constructor for an unknown static skill group.\n        /// </summary>\n        private StaticSkillGroup()\n        {\n            ID = int.MaxValue;\n            Name = EveMonConstants.UnknownText;\n        }\n\n        /// <summary>\n        /// Deserialization constructor from datafiles.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <param name=\"skillArrayIndex\"></param>\n        internal StaticSkillGroup(SerializableSkillGroup src, ref int skillArrayIndex)\n        {\n            ID = src.ID;\n            Name = src.Name;\n            foreach (SerializableSkill srcSkill in src.Skills)\n            {\n                Items[srcSkill.ID] = new StaticSkill(this, srcSkill, skillArrayIndex);\n                skillArrayIndex++;\n            }\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the group's identifier.\n        /// </summary>\n        public int ID { get; }\n\n        /// <summary>\n        /// Gets the group's name.\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// Gets the unknown static skill group.\n        /// </summary>\n        /// <value>\n        /// The unknown static skill group.\n        /// </value>\n        public static StaticSkillGroup UnknownStaticSkillGroup\n            => s_unknownStaticSkillGroup ?? (s_unknownStaticSkillGroup = new StaticSkillGroup());\n\n        #endregion\n\n\n        #region Indexers\n\n        /// <summary>\n        /// Gets a skill from this group by its id.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public StaticSkill this[int id] => GetByKey(id);\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Checks whether this group contains the specified skill.\n        /// </summary>\n        /// <param name=\"skillID\"></param>\n        /// <returns></returns>\n        public bool Contains(int skillID) => Items.ContainsKey(skillID);\n\n        #endregion\n\n\n        #region IEnumerable<StaticSkill> Members\n\n        /// <summary>\n        /// Gets the enumerator.\n        /// </summary>\n        /// <returns></returns>\n        public IEnumerator<StaticSkill> GetEnumerator() => Items.Values.GetEnumerator();\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticSkillLevel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a skill and level tuple.\n    /// </summary>\n    public class StaticSkillLevel : ISkillLevel\n    {\n        #region Constructors\n\n        /// <summary>\n        /// Constructor from the skill id.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <param name=\"level\"></param>\n        public StaticSkillLevel(long id, long level)\n        {\n            Skill = StaticSkills.GetSkillByID(id) ?? StaticSkill.UnknownStaticSkill;\n            Level = level;\n        }\n\n        /// <summary>\n        /// Constructor from the skill name.\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"level\"></param>\n        public StaticSkillLevel(string name, long level)\n        {\n            Skill = StaticSkills.GetSkillByName(name) ?? StaticSkill.UnknownStaticSkill;\n            Level = level;\n        }\n\n        /// <summary>\n        /// Constructor from the static skill object.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"level\"></param>\n        public StaticSkillLevel(StaticSkill skill, long level)\n        {\n            Skill = skill;\n            Level = level;\n        }\n\n        /// <summary>\n        /// Constructor from an <see cref=\"ISkillLevel\"/> object.\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">obj</exception>\n        public StaticSkillLevel(ISkillLevel obj)\n        {\n            obj.ThrowIfNull(nameof(obj));\n\n            Skill = obj.Skill;\n            Level = obj.Level;\n        }\n\n        /// <summary>\n        /// Constructor from the skill id with activity.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <param name=\"level\"></param>\n        /// <param name=\"activityId\"></param>\n        public StaticSkillLevel(long id, long level, int activityId)\n        {\n            Skill = StaticSkills.GetSkillByID(id) ?? StaticSkill.UnknownStaticSkill;\n            Level = level;\n            Activity = (BlueprintActivity)Enum.ToObject(typeof(BlueprintActivity), activityId);\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the skill.\n        /// </summary>\n        public StaticSkill Skill { get; }\n\n        /// <summary>\n        /// Gets or sets the skill level.\n        /// </summary>\n        public long Level { get; }\n\n        /// <summary>\n        /// Gets or sets the activity for the skill.\n        /// </summary>\n        public BlueprintActivity Activity { get; }\n\n        /// <summary>\n        /// Gets all the dependencies, in a way matching the hirarchical order and without redudancies.\n        /// I.e, for eidetic memory II, it will return <c>{ instant recall I, instant recall II, instant recall III, instant recall IV,  eidetic memory I, eidetic memory II }</c>.\n        /// </summary>\n        public IEnumerable<StaticSkillLevel> AllDependencies\n        {\n            get\n            {\n                SkillLevelSet<StaticSkillLevel> set = new SkillLevelSet<StaticSkillLevel>();\n                List<StaticSkillLevel> list = new List<StaticSkillLevel>();\n\n                // Fill the set and list\n                list.FillDependencies(set, this, false);\n\n                // Return the results\n                return list;\n            }\n        }\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Gets true if this skill level is, in any way, dependent of the provided skill level. Checks prerequisites but also same skill's lower levels.\n        /// </summary>\n        /// <param name=\"skillLevel\"><see cref=\"ISkillLevel\">ISkillLevel</see> to check if current skill is a dependant of the SkillLevel pass</param>\n        /// <returns>True if the given item's skill is a prerequisite of this one or if it is a lower level of the same skill.</returns>\n        /// <exception cref=\"System.ArgumentNullException\">skillLevel</exception>\n        public bool IsDependentOf(ISkillLevel skillLevel)\n        {\n            skillLevel.ThrowIfNull(nameof(skillLevel));\n\n            // Same skill, lower level ?\n            if (Skill == skillLevel.Skill)\n                return Level > skillLevel.Level;\n\n            // Prerequisite\n            long neededLevel;\n            Skill.HasAsPrerequisite(skillLevel.Skill, out neededLevel);\n            return skillLevel.Level <= neededLevel;\n        }\n\n        #endregion\n\n\n        #region Public Operators\n\n        /// <summary>\n        /// Implicitly converts from a non-static training.\n        /// </summary>\n        /// <param name=\"training\"></param>\n        /// <returns></returns>\n        public static implicit operator StaticSkillLevel(SkillLevel training)\n            => training == null ? null : new StaticSkillLevel(training.Skill.StaticData, training.Level);\n\n        #endregion\n\n\n        #region Overridden Methods\n\n        /// <summary>\n        /// Gets a string representation of this prerequisite.\n        /// </summary>\n        /// <returns>Skill Name and Level</returns>\n        public override string ToString() => $\"{Skill.Name} {Models.Skill.GetRomanFromInt(Level)}\";\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/StaticSkills.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing EVEMon.Common.Collections.Global;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Datafiles;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents the list of all static skills.\n    /// </summary>\n    public static class StaticSkills\n    {\n        private static int s_arrayIndicesCount;\n        private static StaticSkill[] s_skills;\n        private static readonly Dictionary<long, StaticSkill> s_skillsByID = new Dictionary<long, StaticSkill>();\n        private static readonly Dictionary<string, StaticSkill> s_skillsByName = new Dictionary<string, StaticSkill>();\n        private static readonly Dictionary<int, StaticSkillGroup> s_skillGroupsByID = new Dictionary<int, StaticSkillGroup>();\n\n\n        #region Initialization\n\n        /// <summary>\n        /// Initialize static skills.\n        /// </summary>\n        internal static void Load()\n        {\n            SkillsDatafile datafile = Util.DeserializeDatafile<SkillsDatafile>(DatafileConstants.SkillsDatafile,\n                Util.LoadXslt(Properties.Resources.DatafilesXSLT));\n\n            // Fetch deserialized data\n            s_arrayIndicesCount = 0;\n            List<Collection<SerializableSkillPrerequisite>> prereqs = new List<Collection<SerializableSkillPrerequisite>>();\n            foreach (SerializableSkillGroup srcGroup in datafile.SkillGroups)\n            {\n                StaticSkillGroup group = new StaticSkillGroup(srcGroup, ref s_arrayIndicesCount);\n                s_skillGroupsByID[@group.ID] = @group;\n\n                // Store skills\n                foreach (StaticSkill skill in @group)\n                {\n                    s_skillsByID[skill.ID] = skill;\n                    s_skillsByName[skill.Name] = skill;\n                }\n\n                // Store prereqs\n                prereqs.AddRange(srcGroup.Skills.Select(serialSkill => serialSkill.SkillPrerequisites));\n            }\n\n            // Complete initialization\n            s_skills = new StaticSkill[s_arrayIndicesCount];\n            foreach (StaticSkill staticSkill in s_skillsByID.Values)\n            {\n                staticSkill.CompleteInitialization(prereqs[staticSkill.ArrayIndex]);\n                s_skills[staticSkill.ArrayIndex] = staticSkill;\n            }\n\n            GlobalDatafileCollection.OnDatafileLoaded();\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the total number of zero-based indices given to skills (for optimization purposes, it allows the use of arrays for computations).\n        /// </summary>\n        public static int ArrayIndicesCount => s_arrayIndicesCount;\n\n        /// <summary>\n        /// Gets the list of groups.\n        /// </summary>\n        public static IEnumerable<StaticSkillGroup> AllGroups => s_skillGroupsByID.Values;\n\n        /// <summary>\n        /// Gets the list of groups.\n        /// </summary>\n        public static IEnumerable<StaticSkill> AllSkills => s_skillGroupsByID.Values.SelectMany(group => group);\n\n        #endregion\n\n\n        #region Public Finders\n\n        /// <summary>\n        /// Gets a skill by its id or its name.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <returns>The static skill</returns>\n        /// <remarks>\n        /// This method exists for backwards compatibility\n        /// with settings that don't contain the skill's id.\n        /// </remarks>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public static StaticSkill GetSkill(this SerializableSkillPrerequisite src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            return GetSkillByID(src.ID) ?? GetSkillByName(src.Name) ?? StaticSkill.UnknownStaticSkill;\n        }\n\n        /// <summary>\n        /// Gets the name of the skill.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns>The skill name or <see cref=\"EveMonConstants.UnknownText\"/> if the is no such skill in our data.</returns>\n        public static string GetSkillName(int id)\n        {\n            if (id == 0)\n                return string.Empty;\n\n            StaticSkill skill = GetSkillByID(id);\n            return skill?.Name ?? EveMonConstants.UnknownText;\n        }\n\n        /// <summary>\n        /// Gets a skill by its name.\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        public static StaticSkill GetSkillByName(string name)\n        {\n            StaticSkill skill;\n            s_skillsByName.TryGetValue(name, out skill);\n            return skill;\n        }\n\n        /// <summary>\n        /// Gets a skill by its identifier.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public static StaticSkill GetSkillByID(long id)\n        {\n            StaticSkill skill;\n            s_skillsByID.TryGetValue(id, out skill);\n            return skill;\n        }\n\n        /// <summary>\n        /// Gets a skill by its array index.\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        public static StaticSkill GetSkillByArrayIndex(int index) => s_skills[index];\n\n        /// <summary>\n        /// Gets a group by its name.\n        /// </summary>\n        /// <param name=\"groupId\"></param>\n        /// <returns></returns>\n        public static StaticSkillGroup GetSkillGroupByID(int groupId)\n        {\n            StaticSkillGroup group;\n            s_skillGroupsByID.TryGetValue(groupId, out group);\n            return group;\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Data/Station.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Datafiles;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Represents a station inside the EVE universe.\n    /// </summary>\n    public class Station : ReadonlyCollection<Agent>, IComparable<Station>\n    {\n        /// <summary>\n        /// Creates a station modelling an inaccessible citadel with the given ID.\n        /// </summary>\n        /// <param name=\"id\">The citadel ID that could not be accessed.</param>\n        /// <returns>A dummy station object that represents that structure.</returns>\n        public static Station CreateInaccessible(long id)\n        {\n            return new Station(new SerializableOutpost()\n            {\n                CorporationID = 0,\n                SolarSystemID = 0,\n                StationID = id,\n                StationName = \"Inaccessible Structure\",\n                StationTypeID = 35832 // Astrahus\n            });\n        }\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"Station\"/> class.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public Station(SerializableOutpost src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            ID = src.StationID;\n            Name = src.StationName;\n            CorporationID = src.CorporationID;\n            CorporationName = src.CorporationName;\n            SolarSystem = StaticGeography.GetSolarSystemByID(src.SolarSystemID);\n            FullLocation = GetFullLocation(SolarSystem, src.StationName);\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"Station\"/> class.\n        /// </summary>\n        /// <param name=\"owner\">The owner.</param>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">owner or src</exception>\n        public Station(SolarSystem owner, SerializableStation src)\n            : base(src?.Agents?.Count ?? 0)\n        {\n            owner.ThrowIfNull(nameof(owner));\n\n            src.ThrowIfNull(nameof(src));\n\n            ID = src.ID;\n            Name = src.Name;\n            CorporationID = src.CorporationID;\n            CorporationName = src.CorporationName;\n            SolarSystem = owner;\n            ReprocessingStationsTake = src.ReprocessingStationsTake;\n            ReprocessingEfficiency = src.ReprocessingEfficiency;\n            FullLocation = GetFullLocation(owner, src.Name);\n\n            if (src.Agents == null)\n                return;\n\n            foreach (SerializableAgent agent in src.Agents)\n            {\n                Items.Add(new Agent(this, agent));\n            }\n        }\n        \n        #endregion\n\n\n        #region Public Properties\n            \n        /// <summary>\n        /// Gets this object's id.\n        /// </summary>\n        public long ID { get; }\n\n        /// <summary>\n        /// Gets this object's name.\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// Gets this object's corporation id.\n        /// </summary>\n        public int CorporationID { get; }\n\n        /// <summary>\n        /// Gets this object's corporation name.\n        /// </summary>\n        public string CorporationName { get; }\n\n        /// <summary>\n        /// Gets the solar system where this station is located.\n        /// </summary>\n        public SolarSystem SolarSystem { get; }\n\n        /// <summary>\n        /// Gets the solar system where this station is located. This accessor is checked\n        /// and instead of returning null returns an empty solar system\n        /// </summary>\n        public SolarSystem SolarSystemChecked => SolarSystem ?? SolarSystem.UNKNOWN;\n\n        /// <summary>\n        /// Gets something like Region > Constellation > Solar System > Station.\n        /// </summary>\n        public string FullLocation { get; }\n\n        /// <summary>\n        /// Gets the base reprocessing efficiency of the station.\n        /// </summary>\n        public float ReprocessingEfficiency { get; }\n\n        /// <summary>\n        /// Gets the fraction of reprocessing products taken by the station.\n        /// </summary>\n        public float ReprocessingStationsTake { get; }\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Compares this station with another one.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">other</exception>\n        public int CompareTo(Station other)\n        {\n            other.ThrowIfNull(nameof(other));\n            // Properly handle null SolarSystem, it should be equal to SolarSystem with ID = 0\n            SolarSystem mine = SolarSystemChecked, theirs = other.SolarSystemChecked;\n            return mine != theirs ? mine.CompareTo(theirs) : string.Compare(Name, other.Name,\n                StringComparison.CurrentCulture);\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the station's full location.\n        /// </summary>\n        /// <param name=\"solarSystem\">The solar system.</param>\n        /// <param name=\"name\">The name.</param>\n        /// <returns></returns>\n        private static string GetFullLocation(SolarSystem solarSystem, string name)\n            => (solarSystem == null) ? string.Empty : $\"{solarSystem.FullLocation} > {name}\";\n        \n        #endregion\n\n\n        #region Overridden Methods\n\n        /// <summary>\n        /// Gets the name of this object.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => Name;\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Data/StationServices.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Data\n{\n    /// <summary>\n    /// Stations services as gotten from the data dumps (staServices table).\n    /// </summary>\n    [Flags]\n    public enum StationServices\n    {\n        None = 0,\n\n        [Header(\"Bounty Missions\")]\n        BountyMissions = 1,\n\n        [Header(\"Assassination Missions\")]\n        AssassinationMissions = 0x2,\n\n        [Header(\"Courier Missions\")]\n        CourierMissions = 0x4,\n\n        [Header(\"Interbus\")]\n        Interbus = 0x8,\n\n        [Header(\"Reprocessing Plant\")]\n        ReprocessingPlant = 0x10,\n\n        [Header(\"Refinery\")]\n        Refinery = 0x20,\n\n        [Header(\"Market\")]\n        Market = 0x40,\n\n        [Header(\"Black Market\")]\n        BlackMarket = 0x80,\n\n        [Header(\"Stock Exchange\")]\n        StockExchange = 0x100,\n\n        [Header(\"Cloning\")]\n        Cloning = 0x200,\n\n        [Header(\"Surgery\")]\n        Surgery = 0x400,\n\n        [Header(\"DNA Therapy\")]\n        DNATherapy = 0x800,\n\n        [Header(\"Repair Facilities\")]\n        RepairFacilities = 0x1000,\n\n        [Header(\"Factory\")]\n        Factory = 0x2000,\n\n        [Header(\"Laboratory\")]\n        Laboratory = 0x4000,\n\n        [Header(\"Gambling\")]\n        Gambling = 0x8000,\n\n        [Header(\"Fitting\")]\n        Fitting = 0x10000,\n\n        [Header(\"Paintshop\")]\n        Paintshop = 0x20000,\n\n        [Header(\"News\")]\n        News = 0x40000,\n\n        [Header(\"Storage\")]\n        Storage = 0x80000,\n\n        [Header(\"Insurance\")]\n        [Description(\"Used to buy insurance for ships.\")]\n        Insurance = 0x100000,\n\n        [Header(\"Docking\")]\n        Docking = 0x200000,\n\n        [Header(\"Office Rental\")]\n        OfficeRental = 0x400000,\n\n        [Header(\"Jump Clone Facility\")]\n        JumpCloneFacility = 0x800000,\n\n        [Header(\"Loyalty Point Store\")]\n        LoyaltyPointStore = 0x1000000,\n\n        [Header(\"Navy Offices\")]\n        NavyOffices = 0x2000000\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/EVEMon.Common.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{C0665275-3E0B-4117-81B0-751206ED03CD}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>EVEMon.Common</RootNamespace>\n    <AssemblyName>EVEMon.Common</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <SolutionDir Condition=\"$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'\">..\\..\\</SolutionDir>\n    <RestorePackages>true</RestorePackages>\n    <TargetFrameworkProfile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>TRACE;NO_THREAD_SAFETY</DefineConstants>\n    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\n    <DebugType>full</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NO_THREAD_SAFETY</DefineConstants>\n    <Optimize>true</Optimize>\n    <DebugType>none</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NO_THREAD_SAFETY</DefineConstants>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Dropbox.Api, Version=4.0.0.0, Culture=neutral, PublicKeyToken=310f0e82fbb45d01, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Dropbox.Api.4.9.4\\lib\\net45\\Dropbox.Api.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Google.Apis, Version=1.42.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Google.Apis.1.42.0\\lib\\net45\\Google.Apis.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Google.Apis.Auth, Version=1.42.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Google.Apis.Auth.1.42.0\\lib\\net45\\Google.Apis.Auth.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Google.Apis.Auth.PlatformServices, Version=1.42.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Google.Apis.Auth.1.42.0\\lib\\net45\\Google.Apis.Auth.PlatformServices.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Google.Apis.Calendar.v3, Version=1.42.0.1795, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Google.Apis.Calendar.v3.1.42.0.1795\\lib\\net45\\Google.Apis.Calendar.v3.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Google.Apis.Core, Version=1.42.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Google.Apis.Core.1.42.0\\lib\\net45\\Google.Apis.Core.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Google.Apis.Drive.v3, Version=1.42.0.1778, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Google.Apis.Drive.v3.1.42.0.1778\\lib\\net45\\Google.Apis.Drive.v3.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Google.Apis.PlatformServices, Version=1.42.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Google.Apis.1.42.0\\lib\\net45\\Google.Apis.PlatformServices.dll</HintPath>\n    </Reference>\n    <Reference Include=\"ICSharpCode.SharpZipLib, Version=1.2.0.246, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\SharpZipLib.1.2.0\\lib\\net45\\ICSharpCode.SharpZipLib.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"Microsoft.IdentityModel.JsonWebTokens, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.IdentityModel.JsonWebTokens.5.6.0\\lib\\net461\\Microsoft.IdentityModel.JsonWebTokens.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Logging, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.IdentityModel.Logging.5.6.0\\lib\\net461\\Microsoft.IdentityModel.Logging.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Tokens, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.IdentityModel.Tokens.5.6.0\\lib\\net461\\Microsoft.IdentityModel.Tokens.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Threading.Tasks, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.Bcl.Async.1.0.168\\lib\\net40\\Microsoft.Threading.Tasks.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.Threading.Tasks.Extensions, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.Bcl.Async.1.0.168\\lib\\net40\\Microsoft.Threading.Tasks.Extensions.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.Threading.Tasks.Extensions.Desktop, Version=1.0.168.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.Bcl.Async.1.0.168\\lib\\net40\\Microsoft.Threading.Tasks.Extensions.Desktop.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Nancy, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Nancy.2.0.0\\lib\\net452\\Nancy.dll</HintPath>\n    </Reference>\n    <Reference Include=\"NetOffice, Version=1.7.3.0, Culture=neutral, PublicKeyToken=297f57b43ae7c1de, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\NetOffice.Core.Net40.1.7.4.4\\lib\\net40\\NetOffice.dll</HintPath>\n      <EmbedInteropTypes>False</EmbedInteropTypes>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Newtonsoft.Json.10.0.3\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"OfficeApi, Version=1.7.3.0, Culture=neutral, PublicKeyToken=a39beb0835c43c8e, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\NetOffice.Core.Net40.1.7.4.4\\lib\\net40\\OfficeApi.dll</HintPath>\n      <EmbedInteropTypes>False</EmbedInteropTypes>\n    </Reference>\n    <Reference Include=\"OneDriveSdk, Version=1.1.29.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.OneDriveSDK.1.1.29\\lib\\net451\\OneDriveSdk.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"OneDriveSdk.WindowsForms, Version=1.1.29.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.OneDriveSDK.1.1.29\\lib\\net451\\OneDriveSdk.WindowsForms.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"OutlookApi, Version=1.7.3.0, Culture=neutral, PublicKeyToken=b118031aaa1097f3, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\NetOffice.Outlook.Net40.1.7.4.4\\lib\\net40\\OutlookApi.dll</HintPath>\n      <EmbedInteropTypes>False</EmbedInteropTypes>\n    </Reference>\n    <Reference Include=\"System.IdentityModel.Tokens.Jwt, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\System.IdentityModel.Tokens.Jwt.5.6.0\\lib\\net461\\System.IdentityModel.Tokens.Jwt.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Net.Http.Primitives, Version=4.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.Net.Http.2.2.29\\lib\\net45\\System.Net.Http.Primitives.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Net.Http.WebRequest\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.configuration\" />\n    <Reference Include=\"System.Design\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"VBIDEApi, Version=1.7.3.0, Culture=neutral, PublicKeyToken=931cec8882205047, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\NetOffice.Core.Net40.1.7.4.4\\lib\\net40\\VBIDEApi.dll</HintPath>\n      <EmbedInteropTypes>False</EmbedInteropTypes>\n    </Reference>\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"YamlDotNet, Version=8.0.0.0, Culture=neutral, PublicKeyToken=ec19458f3c15af5e, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\YamlDotNet.8.0.0\\lib\\net45\\YamlDotNet.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Zlib.Portable, Version=1.11.0.0, Culture=neutral, PublicKeyToken=431cba815f6a8b5b, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Zlib.Portable.Signed.1.11.0\\lib\\portable-net4+sl5+wp8+win8+wpa81+MonoTouch+MonoAndroid\\Zlib.Portable.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\..\\SharedAssemblyInfo.cs\">\n      <Link>Properties\\SharedAssemblyInfo.cs</Link>\n    </Compile>\n    <Compile Include=\"AsyncPump.cs\" />\n    <Compile Include=\"Attributes\\ParentAttribute.cs\" />\n    <Compile Include=\"CloudStorageServices\\AuthenticationSteps.cs\" />\n    <Compile Include=\"Collections\\Global\\GlobalAPIProviderCollection.cs\" />\n    <Compile Include=\"Constants\\NetworkConstants1.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>NetworkConstants.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\CustomCursors.cs\" />\n    <Compile Include=\"CustomEventArgs\\LabelChangedEventArgs.cs\" />\n    <Compile Include=\"Data\\Faction.cs\" />\n    <Compile Include=\"Data\\Planet.cs\" />\n    <Compile Include=\"Enumerations\\AttributeOptimizationStrategy.cs\" />\n    <Compile Include=\"Enumerations\\BlinkAction.cs\" />\n    <Compile Include=\"Enumerations\\CCPAPI\\CCPAPIContactType.cs\" />\n    <Compile Include=\"Enumerations\\CCPAPI\\ESIAPIGenericMethods.cs\" />\n    <Compile Include=\"Enumerations\\CCPAPI\\CCPAPILocationType.cs\" />\n    <Compile Include=\"Enumerations\\CCPAPI\\CCPAPIPlanetTypes.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\AssetGrouping.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\CalendarProvider.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\CloseBehaviour.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\ContractGrouping.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\EVEMailMessagesGrouping.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\EVENotificationsGrouping.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\GoogleCalendarReminder.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\IndustryJobGrouping.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\MainWindowTitleFormat.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\MarketOrderGrouping.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\MarkupType.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\ObsoleteEntryRemovalBehaviour.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\PlanetaryGrouping.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\PortraitSizes.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\ReadingPanePositioning.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\SystemTrayBehaviour.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\ThreeStateSortOrder.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\TrayPopupGrouping.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\TrayPopupSort.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\TrayPopupStyles.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\UpdatePeriod.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\WalletJournalGrouping.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\WalletTransactionGrouping.cs\" />\n    <Compile Include=\"EveMonClient.Events.cs\" />\n    <Compile Include=\"Exceptions\\APIException.cs\" />\n    <Compile Include=\"CustomEventArgs\\TimeCheckSyncEventArgs.cs\" />\n    <Compile Include=\"Extensions\\EventHandlerExtensions.cs\" />\n    <Compile Include=\"Enumerations\\CharacterSaveFormat.cs\" />\n    <Compile Include=\"Extensions\\HttpExtensions.cs\" />\n    <Compile Include=\"Extensions\\ObjectExtensions.cs\" />\n    <Compile Include=\"Helpers\\BlankCharacterUIHelper.cs\" />\n    <Compile Include=\"Helpers\\ImageHelper.cs\" />\n    <Compile Include=\"Helpers\\TaskHelper.cs\" />\n    <Compile Include=\"MarketPricer\\Fuzzworks\\FuzzworksItemPricer.cs\" />\n    <Compile Include=\"Models\\AccountStatus.cs\" />\n    <Compile Include=\"Models\\ESIMethod.cs\" />\n    <Compile Include=\"Models\\Extended\\ESIMethods.cs\" />\n    <Compile Include=\"Models\\Loyalty.cs\" />\n    <Compile Include=\"Models\\Collections\\LoyaltyCollection.cs\" />\n    <Compile Include=\"Net\\HttpWebClientService.StringDownload.cs\" />\n    <Compile Include=\"Net\\RequestParams.cs\" />\n    <Compile Include=\"Net\\ResponseParams.cs\" />\n    <Compile Include=\"QueryMonitor\\CCPQueryMonitorBase.cs\" />\n    <Compile Include=\"QueryMonitor\\PagedQueryMonitor.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializablePlanet.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiLoyaltyListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIContactsList.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPILoyalty.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIMedals.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIPlanet.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiErrors.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableLocation.cs\" />\n    <Compile Include=\"Serialization\\Fuzzworks\\SerializableFuzzworksPriceItem.cs\" />\n    <Compile Include=\"Serialization\\Fuzzworks\\SerializableFuzzworksPriceListItem.cs\" />\n    <Compile Include=\"Serialization\\Hammertime\\HammertimeStructure.cs\" />\n    <Compile Include=\"Serialization\\JsonResult.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiResult.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIError.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPITokenInfo.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAccountBalanceListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPICorpAccountBalance.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIAssetList.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIAttributes.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPICalendarEvent.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPICalendarEventAttendees.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPICalendarEvents.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPICharacterNames.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIClones.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIContactNotifications.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIContractBids.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIContractItems.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIContracts.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPICorporationSheet.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIDivisions.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIEmploymentHistory.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIEveFactionalWarfareStats.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIFactionalWarfareStats.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIEveFactionWars.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIIndustryJobs.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIJumpFatigue.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIKillLog.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIKillMail.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPILocation.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIMailBody.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIMailingLists.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIMailMessages.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIMarketOrders.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPINotifications.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIPlanetaryColoniesList.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIPlanetaryColony.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIResearchPoints.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIServerStatus.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIShip.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPISkillQueue.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPISkills.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPISovStructures.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIStandings.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIStation.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIStructure.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIType.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIWalletJournal.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPIWalletTransactions.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAssetListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiCalendarEventAttendeeListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiCalendarEventListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiJumpCloneListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiCharacterBase.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiCharacterNameListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiAPICharacterSheet.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiSkillListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiContactListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiContactNotifyListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiContractBidsListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiContractItemsListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiContractListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiDivisionListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiEmploymentHistoryListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiEveFactionalWarfareStatsListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiEveFactionWarsListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiEveFactionWarfareTotals.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiJobListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiKillLogAttackersListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiKillLogItemListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiKillLogListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiKillLogVictim.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiLocationBase.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiMailBase.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiMailingListsListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiMailMessagesListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiMailRecipientListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiMedalsListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiNotificationsListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiOrderListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiPlanetaryColonyListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiPlanetaryContentsListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiPlanetaryExtractorDetails.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiPlanetaryExtractorHead.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiPlanetaryFactoryDetails.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiPlanetaryLink.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiPlanetaryPin.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiPlanetaryRoute.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiPosition.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiSkillQueueListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiRefTypeString.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiResearchListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiStandingsListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiSovStructureListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiWalletJournalListItem.cs\" />\n    <Compile Include=\"Serialization\\Esi\\EsiWalletTransactionsListItem.cs\" />\n    <Compile Include=\"Serialization\\SerializableAPIError.cs\" />\n    <Compile Include=\"CloudStorageServices\\CloudStorageServiceAPIFile.cs\" />\n    <Compile Include=\"Serialization\\SerializableAPIResult.cs\" />\n    <Compile Include=\"CloudStorageServices\\CloudStorageServiceProvider.cs\" />\n    <Compile Include=\"Serialization\\SerializableAPICredentials.cs\" />\n    <Compile Include=\"CloudStorageServices\\CloudStorageServiceResources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>CloudStorageServiceResources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"CloudStorageServices\\Dropbox\\DropboxCloudStorageServiceProvider.cs\" />\n    <Compile Include=\"CloudStorageServices\\Dropbox\\DropboxCloudStorageServiceSettings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n      <DependentUpon>DropboxCloudStorageServiceSettings.settings</DependentUpon>\n    </Compile>\n    <Compile Include=\"CloudStorageServices\\GoogleDrive\\GoogleDriveCloudStorageServiceProvider.cs\" />\n    <Compile Include=\"CloudStorageServices\\GoogleDrive\\GoogleDriveCloudStorageServiceSettings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n      <DependentUpon>GoogleDriveCloudStorageServiceSettings.settings</DependentUpon>\n    </Compile>\n    <Compile Include=\"CloudStorageServices\\OneDrive\\OneDriveCloudStorageServiceProvider.cs\" />\n    <Compile Include=\"CloudStorageServices\\OneDrive\\OneDriveCloudStorageServiceSettings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n      <DependentUpon>OneDriveCloudStorageServiceSettings.settings</DependentUpon>\n    </Compile>\n    <Compile Include=\"Constants\\EveConstants.cs\" />\n    <Compile Include=\"Constants\\EveMonConstants.cs\" />\n    <Compile Include=\"CustomEventArgs\\LoadoutEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\LoadoutFeedEventArgs.cs\" />\n    <Compile Include=\"Data\\MasteryCertificate.cs\" />\n    <Compile Include=\"Data\\Mastery.cs\" />\n    <Compile Include=\"Data\\MasteryShipCollection.cs\" />\n    <Compile Include=\"Data\\MasteryShip.cs\" />\n    <Compile Include=\"Data\\StaticMasteries.cs\" />\n    <Compile Include=\"Enumerations\\AbbreviationFormat.cs\" />\n    <Compile Include=\"Enumerations\\ActiveJobState.cs\" />\n    <Compile Include=\"Enumerations\\AgentType.cs\" />\n    <Compile Include=\"Enumerations\\AmarrMilitiaRank.cs\" />\n    <Compile Include=\"Enumerations\\Ancestry.cs\" />\n    <Compile Include=\"Enumerations\\CCPAPI\\ESIAPICharacterMethods.cs\" />\n    <Compile Include=\"Enumerations\\CCPAPI\\ESIAPICorporationMethods.cs\" />\n    <Compile Include=\"Enumerations\\CCPAPI\\CCPAPIKeyType.cs\" />\n    <Compile Include=\"Enumerations\\CCPAPI\\CCPAPIMethodsEnum.cs\" />\n    <Compile Include=\"Enumerations\\CCPAPI\\APIErrorType.cs\" />\n    <Compile Include=\"Enumerations\\CCPAPI\\CCPJobCompletedStatus.cs\" />\n    <Compile Include=\"Enumerations\\CCPAPI\\CCPOrderState.cs\" />\n    <Compile Include=\"Enumerations\\Bloodline.cs\" />\n    <Compile Include=\"Enumerations\\BlueprintActivity.cs\" />\n    <Compile Include=\"Enumerations\\BlueprintType.cs\" />\n    <Compile Include=\"Enumerations\\CaldariMilitiaRank.cs\" />\n    <Compile Include=\"Enumerations\\CertificateFilter.cs\" />\n    <Compile Include=\"Enumerations\\CertificateGrade.cs\" />\n    <Compile Include=\"Enumerations\\CertificateSort.cs\" />\n    <Compile Include=\"Enumerations\\CertificateStatus.cs\" />\n    <Compile Include=\"Enumerations\\CharacterSortCriteria.cs\" />\n    <Compile Include=\"Enumerations\\ConnectionStatus.cs\" />\n    <Compile Include=\"Enumerations\\ContactGroup.cs\" />\n    <Compile Include=\"Enumerations\\ContactType.cs\" />\n    <Compile Include=\"Enumerations\\ContractAvailability.cs\" />\n    <Compile Include=\"Enumerations\\ContractState.cs\" />\n    <Compile Include=\"Enumerations\\ContractType.cs\" />\n    <Compile Include=\"Enumerations\\DataCompression.cs\" />\n    <Compile Include=\"Enumerations\\DescriptiveTextOptions.cs\" />\n    <Compile Include=\"Enumerations\\EveAttribute.cs\" />\n    <Compile Include=\"Enumerations\\EveImageSize.cs\" />\n    <Compile Include=\"Enumerations\\EveImageSizeMode.cs\" />\n    <Compile Include=\"Enumerations\\EveMailState.cs\" />\n    <Compile Include=\"Enumerations\\GallenteMilitiaRank.cs\" />\n    <Compile Include=\"Enumerations\\Gender.cs\" />\n    <Compile Include=\"Enumerations\\ImplantSlots.cs\" />\n    <Compile Include=\"Enumerations\\IssuedFor.cs\" />\n    <Compile Include=\"Enumerations\\ItemFamily.cs\" />\n    <Compile Include=\"Enumerations\\ItemMetaGroup.cs\" />\n    <Compile Include=\"Enumerations\\ItemSlot.cs\" />\n    <Compile Include=\"Enumerations\\JobState.cs\" />\n    <Compile Include=\"Enumerations\\KillGroup.cs\" />\n    <Compile Include=\"Enumerations\\LearningOptions.cs\" />\n    <Compile Include=\"Enumerations\\LoadoutFormat.cs\" />\n    <Compile Include=\"Enumerations\\MasteryStatus.cs\" />\n    <Compile Include=\"Enumerations\\MedalGroup.cs\" />\n    <Compile Include=\"Enumerations\\MinmatarMilitiaRank.cs\" />\n    <Compile Include=\"Enumerations\\ObjectActivityFilter.cs\" />\n    <Compile Include=\"Enumerations\\ObjectUsabilityFilter.cs\" />\n    <Compile Include=\"Enumerations\\ObsoleteRemovalPolicy.cs\" />\n    <Compile Include=\"Enumerations\\OrderState.cs\" />\n    <Compile Include=\"Enumerations\\PathSearchCriteria.cs\" />\n    <Compile Include=\"Enumerations\\PlanChange.cs\" />\n    <Compile Include=\"Enumerations\\PlanEntrySort.cs\" />\n    <Compile Include=\"Enumerations\\PlanEntryType.cs\" />\n    <Compile Include=\"Enumerations\\PlanetaryPinState.cs\" />\n    <Compile Include=\"Enumerations\\PlanFormat.cs\" />\n    <Compile Include=\"Enumerations\\PlanOperations.cs\" />\n    <Compile Include=\"Enumerations\\PlanSort.cs\" />\n    <Compile Include=\"Enumerations\\QueryStatus.cs\" />\n    <Compile Include=\"Enumerations\\Race.cs\" />\n    <Compile Include=\"Enumerations\\RemappingPointStatus.cs\" />\n    <Compile Include=\"Enumerations\\ServerStatus.cs\" />\n    <Compile Include=\"Enumerations\\SkillFilter.cs\" />\n    <Compile Include=\"Enumerations\\SkillSort.cs\" />\n    <Compile Include=\"Enumerations\\SortOrder.cs\" />\n    <Compile Include=\"Enumerations\\StandingGroup.cs\" />\n    <Compile Include=\"Enumerations\\StandingStatus.cs\" />\n    <Compile Include=\"Enumerations\\ThrobberState.cs\" />\n    <Compile Include=\"Enumerations\\TrainingOrigin.cs\" />\n    <Compile Include=\"Enumerations\\TransactionType.cs\" />\n    <Compile Include=\"Collections\\CollectionExtensions.cs\" />\n    <Compile Include=\"Collections\\IReadonlyKeyedCollection.cs\" />\n    <Compile Include=\"Helpers\\LoadoutBase.cs\" />\n    <Compile Include=\"Helpers\\GAnalyticsTracker.cs\" />\n    <Compile Include=\"Helpers\\Loadout.cs\" />\n    <Compile Include=\"Helpers\\LoadoutExporter.cs\" />\n    <Compile Include=\"Helpers\\LoadoutInfo.cs\" />\n    <Compile Include=\"Interfaces\\ILoadoutInfo.cs\" />\n    <Compile Include=\"Helpers\\LoadoutHelper.cs\" />\n    <Compile Include=\"Helpers\\PlanHelper.cs\" />\n    <Compile Include=\"Loadouts\\LoadoutsProvider.cs\" />\n    <Compile Include=\"Loadouts\\Osmium\\OsmiumLoadoutsProvider.cs\" />\n    <Compile Include=\"Net\\DownloadResult.cs\" />\n    <Compile Include=\"Net\\HttpClientServiceRequest.cs\" />\n    <Compile Include=\"Net\\HttpWebClientService.cs\" />\n    <Compile Include=\"Net\\HttpWebClientService.StreamDownload.cs\" />\n    <Compile Include=\"Net\\HttpWebClientService.XmlDownload.cs\" />\n    <Compile Include=\"Serialization\\FittingClf\\SerializableClfFittingChargeType.cs\" />\n    <Compile Include=\"Serialization\\FittingClf\\SerializableClfFittingDroneType.cs\" />\n    <Compile Include=\"Serialization\\FittingClf\\SerializableClfFittingDroneSet.cs\" />\n    <Compile Include=\"Serialization\\FittingClf\\SerializableClfFitting.cs\" />\n    <Compile Include=\"Serialization\\FittingClf\\SerializableClfFittingMetaData.cs\" />\n    <Compile Include=\"Serialization\\FittingClf\\SerializableClfFittingModule.cs\" />\n    <Compile Include=\"Serialization\\FittingClf\\SerializableClfFittingPreset.cs\" />\n    <Compile Include=\"Serialization\\FittingClf\\SerializableClfFittingShipType.cs\" />\n    <Compile Include=\"Serialization\\Osmium\\Loadout\\SerializableOsmiumLoadoutAuthor.cs\" />\n    <Compile Include=\"Serialization\\Osmium\\Loadout\\SerializableOsmiumLoadoutFeed.cs\" />\n    <Compile Include=\"MarketPricer\\EveMarketer\\EMItemPricer.cs\" />\n    <Compile Include=\"Models\\Asset.cs\" />\n    <Compile Include=\"Data\\Certificate.cs\" />\n    <Compile Include=\"Data\\CertificateLevel.cs\" />\n    <Compile Include=\"Data\\CertificateGroup.cs\" />\n    <Compile Include=\"Data\\CertificateCategoryCollection.cs\" />\n    <Compile Include=\"Data\\CertificateClass.cs\" />\n    <Compile Include=\"Data\\CertificateClassCollection.cs\" />\n    <Compile Include=\"Data\\CertificateCollection.cs\" />\n    <Compile Include=\"Models\\Corporation.cs\" />\n    <Compile Include=\"Models\\ContractItem.cs\" />\n    <Compile Include=\"Models\\Contract.cs\" />\n    <Compile Include=\"Models\\ContractBid.cs\" />\n    <Compile Include=\"Models\\Contact.cs\" />\n    <Compile Include=\"Models\\Collections\\AssetCollection.cs\" />\n    <Compile Include=\"Models\\Collections\\CharacterIdentityIgnoreList.cs\" />\n    <Compile Include=\"Models\\Collections\\ContactCollection.cs\" />\n    <Compile Include=\"Models\\Collections\\ContractCollection.cs\" />\n    <Compile Include=\"Models\\Comparers\\AssetComparer.cs\" />\n    <Compile Include=\"Models\\Comparers\\ContractComparer.cs\" />\n    <Compile Include=\"Models\\Comparers\\ContractItemComparer.cs\" />\n    <Compile Include=\"Serialization\\EveMarketer\\MarketPricer\\SerializableECItemPriceItem.cs\" />\n    <Compile Include=\"Serialization\\EveMarketer\\MarketPricer\\SerializableECItemPriceListItem.cs\" />\n    <Compile Include=\"Serialization\\EveMarketer\\MarketPricer\\SerializableECItemPrices.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableCharacterCertificate.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\MasteriesDatafile.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableMastery.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableMasteryCertificate.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableMasteryShip.cs\" />\n    <Compile Include=\"Models\\Comparers\\SerializableSettingsComparer.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableStationList.cs\" />\n    <Compile Include=\"Service\\ISSOWebServer.cs\" />\n    <Compile Include=\"Service\\SSOWebServerHttpListener.cs\" />\n    <Compile Include=\"Service\\CodeCompiler.cs\" />\n    <Compile Include=\"Controls\\AutoEllipsisToolStripRenderer.cs\" />\n    <Compile Include=\"Controls\\BorderPanel.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\ColumnSelectWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\ColumnSelectWindow.Designer.cs\">\n      <DependentUpon>ColumnSelectWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\InfiniteDisplayToolTip.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\DraggableListView.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\DraggableTabControl.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\DropDownMouseMoveComboBox.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\ExpandablePanelControl.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\IntuitiveDataGridView.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\ListViewDragEventArgs.cs\" />\n    <Compile Include=\"Controls\\ListViewHelper.cs\" />\n    <Compile Include=\"Controls\\ListViewItemComparerByTag.cs\" />\n    <Compile Include=\"Controls\\MultiPanel\\Design\\MultiPanelDesigner.cs\" />\n    <Compile Include=\"Controls\\MultiPanel\\Design\\MultiPanelDesignerHelper.cs\" />\n    <Compile Include=\"Controls\\MultiPanel\\Design\\MultiPanelPageDesigner.cs\" />\n    <Compile Include=\"Controls\\MultiPanel\\Design\\MultiPanelSelectionEditor.cs\" />\n    <Compile Include=\"Controls\\MultiPanel\\MultiPanel.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\MultiPanel\\MultiPanelPage.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\MultiPanel\\MultiPanelSelectionChangeEventArgs.cs\" />\n    <Compile Include=\"Controls\\NativeMethods.cs\" />\n    <Compile Include=\"Controls\\NoFlickerListBox.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\NoFlickerPanel.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\PersistentSplitContainer.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\PrintOptionsDialog.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\PrintOptionsDialog.Designer.cs\">\n      <DependentUpon>PrintOptionsDialog.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\SkillQueueControl.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\Throbber.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\TipWindow.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\TipWindow.Designer.cs\">\n      <DependentUpon>TipWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\TrayIcon.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\TrayIcon.Designer.cs\">\n      <DependentUpon>TrayIcon.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"QueryMonitor\\ESIKeyQueryMonitor.cs\" />\n    <Compile Include=\"QueryMonitor\\CharacterDataQuerying.cs\" />\n    <Compile Include=\"QueryMonitor\\CorporationDataQuerying.cs\" />\n    <Compile Include=\"QueryMonitor\\CorporationQueryMonitor.cs\" />\n    <Compile Include=\"CustomEventArgs\\ApiErrorTroubleshooterEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\ESIKeyCreationEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\ESIKeyInfoChangedEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\AttributeChangedEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\CloudStorageServiceProviderEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\CharacterChangedEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\CharacterIdentityChangedEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\ContractsEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\DataUpdateAvailableEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\DaySelectedEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\DropDownMouseMoveEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\EveServerEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\AttributeHighlightingEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\IndustryJobsEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\MarketOrdersEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\PlanChangedEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\PlanetaryPinsEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\QueuedSkillsEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\SkillClickedEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\UpdateAvailableEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\UriCharacterEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\AttributeValueChangedEventArgs.cs\" />\n    <Compile Include=\"CustomEventArgs\\AttributeValueChangingEventArgs.cs\" />\n    <Compile Include=\"Data\\Agent.cs\" />\n    <Compile Include=\"Data\\ControlTowerFuel.cs\" />\n    <Compile Include=\"Data\\ControlTowerFuelCollection.cs\" />\n    <Compile Include=\"Data\\ImplantCollection.cs\" />\n    <Compile Include=\"Data\\EvePropertyCollection.cs\" />\n    <Compile Include=\"Data\\MaterialCollection.cs\" />\n    <Compile Include=\"Data\\NPCCorporation.cs\" />\n    <Compile Include=\"Data\\ReactionMaterialCollection.cs\" />\n    <Compile Include=\"Data\\ReactionMaterial.cs\" />\n    <Compile Include=\"Data\\StaticCertificate.cs\" />\n    <Compile Include=\"Data\\StaticCertificateClass.cs\" />\n    <Compile Include=\"Data\\StaticCertificateGroup.cs\" />\n    <Compile Include=\"Data\\StaticCertificates.cs\" />\n    <Compile Include=\"Data\\StaticRecommendations.cs\" />\n    <Compile Include=\"Data\\StaticReprocessing.cs\" />\n    <Compile Include=\"EmailProvider\\DefaultProvider.cs\" />\n    <Compile Include=\"EmailProvider\\EmailProviders.cs\" />\n    <Compile Include=\"EmailProvider\\GmxProvider.cs\" />\n    <Compile Include=\"EmailProvider\\GoogleProvider.cs\" />\n    <Compile Include=\"EmailProvider\\HotmailProvider.cs\" />\n    <Compile Include=\"EmailProvider\\IEmailProvider.cs\" />\n    <Compile Include=\"EmailProvider\\YahooPlusProvider.cs\" />\n    <Compile Include=\"EmailProvider\\YahooProvider.cs\" />\n    <Compile Include=\"Models\\Collections\\EmploymentRecordCollection.cs\" />\n    <Compile Include=\"Models\\EmploymentRecord.cs\" />\n    <Compile Include=\"Models\\EveFactionWarfareStats.cs\" />\n    <Compile Include=\"Models\\Collections\\EveFactionWarfareStatsCollection.cs\" />\n    <Compile Include=\"Models\\EveFactionWar.cs\" />\n    <Compile Include=\"Models\\Collections\\EveFactionWarsCollection.cs\" />\n    <Compile Include=\"Service\\EveFlag.cs\" />\n    <Compile Include=\"Models\\EveMailingList.cs\" />\n    <Compile Include=\"Models\\Collections\\EveMailingListCollection.cs\" />\n    <Compile Include=\"Models\\Extended\\InternalEveNotificationTextParser.cs\" />\n    <Compile Include=\"Models\\Extended\\EveNotificationTextParser.cs\" />\n    <Compile Include=\"Service\\EveIDToStation.cs\" />\n    <Compile Include=\"Service\\EveNotificationType.cs\" />\n    <Compile Include=\"Models\\CalendarEventAttendee.cs\" />\n    <Compile Include=\"Service\\EveRefType.cs\" />\n    <Compile Include=\"ExternalCalendar\\CalendarEvent.cs\" />\n    <Compile Include=\"ExternalCalendar\\ExternalCalendar.cs\" />\n    <Compile Include=\"ExternalCalendar\\GoogleCalendarEvent.cs\" />\n    <Compile Include=\"ExternalCalendar\\OutlookCalendarEvent.cs\" />\n    <Compile Include=\"Models\\EveFactionalWarfareStats.cs\" />\n    <Compile Include=\"Models\\FactionalWarfareStats.cs\" />\n    <Compile Include=\"Helpers\\FormatHelper.cs\" />\n    <Compile Include=\"Collections\\Global\\GlobalAPIKeyCollection.cs\" />\n    <Compile Include=\"GlobalSuppressions.cs\" />\n    <Compile Include=\"Interfaces\\IEveMessage.cs\" />\n    <Compile Include=\"Models\\EveNotification.cs\" />\n    <Compile Include=\"Models\\Collections\\EveNotificationCollection.cs\" />\n    <Compile Include=\"Models\\Comparers\\EveNotificationComparer.cs\" />\n    <Compile Include=\"Models\\EveNotificationText.cs\" />\n    <Compile Include=\"Interfaces\\IListView.cs\" />\n    <Compile Include=\"Interfaces\\IPlanOrderPluggable.cs\" />\n    <Compile Include=\"Interfaces\\IQueryMonitorEx.cs\" />\n    <Compile Include=\"Interfaces\\ISkillLevel.cs\" />\n    <Compile Include=\"Models\\KillLog.cs\" />\n    <Compile Include=\"Models\\Collections\\KillLogCollection.cs\" />\n    <Compile Include=\"Models\\Comparers\\KillLogComparer.cs\" />\n    <Compile Include=\"Helpers\\KillLogExporter.cs\" />\n    <Compile Include=\"Models\\KillLogItem.cs\" />\n    <Compile Include=\"MarketPricer\\ItemPricer.cs\" />\n    <Compile Include=\"Models\\Medal.cs\" />\n    <Compile Include=\"Models\\Collections\\MedalCollection.cs\" />\n    <Compile Include=\"Models\\Comparers\\MedalComparer.cs\" />\n    <Compile Include=\"Net\\INetworkChangeSubscriber.cs\" />\n    <Compile Include=\"Notifications\\APIErrorNotificationEventArgs.cs\" />\n    <Compile Include=\"Notifications\\ContractsNotificationEventArgs.cs\" />\n    <Compile Include=\"Notifications\\IndustryJobsNotificationEventArgs.cs\" />\n    <Compile Include=\"Notifications\\MarketOrdersNotificationEventArgs.cs\" />\n    <Compile Include=\"Notifications\\EveMailMessageNotificationEventArgs.cs\" />\n    <Compile Include=\"Notifications\\EveNotificationNotificationEventArgs.cs\" />\n    <Compile Include=\"Notifications\\NotificationBehaviour.cs\" />\n    <Compile Include=\"Notifications\\NotificationCategory.cs\" />\n    <Compile Include=\"Notifications\\NotificationEventArgs.cs\" />\n    <Compile Include=\"Notifications\\NotificationInvalidationEventArgs.cs\" />\n    <Compile Include=\"Notifications\\NotificationPriority.cs\" />\n    <Compile Include=\"Notifications\\PlanetaryPinsNotificationEventArgs.cs\" />\n    <Compile Include=\"Notifications\\SkillCompletionNotificationEventArgs.cs\" />\n    <Compile Include=\"Models\\Comparers\\PlanEntryComparer.cs\" />\n    <Compile Include=\"Models\\PlanetaryColony.cs\" />\n    <Compile Include=\"Models\\Collections\\PlanetaryColonyCollection.cs\" />\n    <Compile Include=\"Models\\Comparers\\PlanetaryPinComparer.cs\" />\n    <Compile Include=\"Models\\PlanetaryLink.cs\" />\n    <Compile Include=\"Models\\PlanetaryPin.cs\" />\n    <Compile Include=\"Models\\PlanetaryRoute.cs\" />\n    <Compile Include=\"Helpers\\PlanPrinter.cs\" />\n    <Compile Include=\"Models\\RemappingResult.cs\" />\n    <Compile Include=\"Resources\\Skill_Select\\IconSettings.Designer.cs\">\n      <DependentUpon>IconSettings.settings</DependentUpon>\n      <AutoGen>True</AutoGen>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n    <Compile Include=\"Serialization\\Eve\\SerializableAPIEveFactionalWarfareStats.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableAPIKillLog.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableCharacterJumpClone.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableCharacterJumpCloneImplant.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableNewImplant.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableAPIRefTypes.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableAPIUpcomingCalendarEvents.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableAPIWalletJournal.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableCalendarEventAttendeeListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableEveFactionalWarfareStatsListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableEveFactionWarsListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableEveFacWarfareTotals.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableKillLogAttackersListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableKillLogItemListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableKillLogListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableKillLogVictim.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableRefTypesListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableUpcomingCalendarEventsListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableWalletJournalListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableAPIWalletTransactions.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableWalletTransactionsListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableAPIContracts.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableContractListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableEmploymentHistory.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableEmploymentHistoryListItem.cs\" />\n    <Compile Include=\"CloudStorageServices\\CloudStorageServiceSettings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n      <DependentUpon>CloudStorageServiceSettings.settings</DependentUpon>\n    </Compile>\n    <Compile Include=\"Serialization\\Datafiles\\CertificatesDatafile.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableAgent.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableBlueprint.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableBlueprintMarketGroup.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableCertificate.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableCertificateClass.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableCertificateGroup.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableCertificatePrerequisite.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableCertificateRecommendation.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableConstellation.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableControlTowerFuel.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableItem.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableItemMaterials.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableJump.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableMarketGroup.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableMaterialQuantity.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializablePrereqSkill.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializablePrerequisiteSkill.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableProperty.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializablePropertyCategory.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializablePropertyValue.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableReactionInfo.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableRegion.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableRequiredMaterial.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableSkill.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableSkillGroup.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableSkillPrerequisite.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableSolarSystem.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SerializableStation.cs\" />\n    <Compile Include=\"Serialization\\EveMarketData\\MarketPricer\\SerializableEMDItemPriceList.cs\" />\n    <Compile Include=\"Serialization\\EveMarketData\\MarketPricer\\SerializableEMDItemPriceListItem.cs\" />\n    <Compile Include=\"Serialization\\EveMarketData\\MarketPricer\\SerializableEMDItemPrices.cs\" />\n    <Compile Include=\"Serialization\\Exportation\\OutputAttributeEnhancer.cs\" />\n    <Compile Include=\"Serialization\\Exportation\\OutputPlans.cs\" />\n    <Compile Include=\"Serialization\\Exportation\\OutputSkill.cs\" />\n    <Compile Include=\"Serialization\\FittingXml\\SerializableXmlFitting.cs\" />\n    <Compile Include=\"Serialization\\FittingXml\\SerializableXmlFittingDescription.cs\" />\n    <Compile Include=\"Serialization\\FittingXml\\SerializableXmlFittingHardware.cs\" />\n    <Compile Include=\"Serialization\\FittingXml\\SerializableXmlFittings.cs\" />\n    <Compile Include=\"Serialization\\FittingXml\\SerializableXmlFittingShipType.cs\" />\n    <Compile Include=\"Serialization\\PatchXml\\SerializableDatafile.cs\" />\n    <Compile Include=\"Serialization\\PatchXml\\SerializablePatch.cs\" />\n    <Compile Include=\"Serialization\\PatchXml\\SerializableRelease.cs\" />\n    <Compile Include=\"Serialization\\SerializableEveFlagsListItem.cs\" />\n    <Compile Include=\"Serialization\\SerializableEveIDToNameListItem.cs\" />\n    <Compile Include=\"Serialization\\SerializableEveFlags.cs\" />\n    <Compile Include=\"Serialization\\SerializableNotificationRefTypes.cs\" />\n    <Compile Include=\"Serialization\\SerializableNotificationRefTypesListItem.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableAPIKey.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableContract.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableEndPoint.cs\" />\n    <Compile Include=\"Service\\IDToObjectProvider.cs\" />\n    <Compile Include=\"Service\\SSOAuthenticationService.cs\" />\n    <Compile Include=\"SettingsObjects\\CertificateBrowserSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\CloudStorageServiceProviderSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\CombatLogSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\LoadoutsProviderSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\MarketPricerSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\PlanetarySettings.cs\" />\n    <Compile Include=\"SettingsObjects\\PlanetaryColumn.cs\" />\n    <Compile Include=\"SettingsObjects\\PlanetaryColumnSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\PortableEveInstallationsSettings.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializablePortableEveInstallation.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableStanding.cs\" />\n    <Compile Include=\"SettingsObjects\\AssetColumn.cs\" />\n    <Compile Include=\"SettingsObjects\\AssetColumnSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\AssetSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\ContractColumn.cs\" />\n    <Compile Include=\"SettingsObjects\\ContractColumnSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\ContractSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\ModifiedSerializableDictionary.cs\" />\n    <Compile Include=\"SettingsObjects\\EveNotificationColumn.cs\" />\n    <Compile Include=\"SettingsObjects\\EveNotificationColumnSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\EveNotificationSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\IColumnSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\UpdatePeriodExtensions.cs\" />\n    <Compile Include=\"SettingsObjects\\WalletJournalColumn.cs\" />\n    <Compile Include=\"SettingsObjects\\WalletJournalColumnSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\WalletJournalSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\WalletTransactionColumn.cs\" />\n    <Compile Include=\"SettingsObjects\\WalletTransactionColumnSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\WalletTransactionSettings.cs\" />\n    <Compile Include=\"Models\\Standing.cs\" />\n    <Compile Include=\"Models\\Collections\\StandingCollection.cs\" />\n    <Compile Include=\"Extensions\\StaticSkillExtensions.cs\" />\n    <Compile Include=\"Models\\ESIKey.cs\" />\n    <Compile Include=\"Extensions\\StringExtensions.cs\" />\n    <Compile Include=\"Helpers\\UIHelper.cs\" />\n    <Compile Include=\"Models\\UpcomingCalendarEvent.cs\" />\n    <Compile Include=\"Models\\Collections\\UpcomingCalendarEventCollection.cs\" />\n    <Compile Include=\"Models\\WalletJournal.cs\" />\n    <Compile Include=\"Models\\Collections\\WalletJournalCollection.cs\" />\n    <Compile Include=\"Models\\Comparers\\WalletJournalComparer.cs\" />\n    <Compile Include=\"Models\\WalletTransaction.cs\" />\n    <Compile Include=\"Models\\Comparers\\WalletTransactionComparer.cs\" />\n    <Compile Include=\"Models\\Collections\\WalletTransactionsCollection.cs\" />\n    <Compile Include=\"Factories\\WindowsFactory.cs\" />\n    <Compile Include=\"Extensions\\WinFormsExtensions.cs\" />\n    <None Include=\"App.config\" />\n    <Compile Include=\"Net\\HttpWebClientService.ImageDownload.cs\" />\n    <None Include=\"CloudStorageServices\\Dropbox\\DropboxCloudStorageServiceSettings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>DropboxCloudStorageServiceSettings.Designer.cs</LastGenOutput>\n    </None>\n    <None Include=\"CloudStorageServices\\GoogleDrive\\GoogleDriveCloudStorageServiceSettings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>GoogleDriveCloudStorageServiceSettings.Designer.cs</LastGenOutput>\n    </None>\n    <None Include=\"CloudStorageServices\\OneDrive\\OneDriveCloudStorageServiceSettings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>OneDriveCloudStorageServiceSettings.Designer.cs</LastGenOutput>\n    </None>\n    <None Include=\"packages.config\" />\n    <Compile Include=\"Models\\BuyOrder.cs\" />\n    <Compile Include=\"Data\\Datafile.cs\" />\n    <Compile Include=\"Models\\APIProvider.cs\" />\n    <Compile Include=\"Helpers\\AttributesOptimizer.cs\" />\n    <Compile Include=\"Controls\\CheckedComboBox.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\CustomComboBox.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Enumerations\\KillLogFittingContentGroup.cs\" />\n    <Compile Include=\"EveMonClient.cs\" />\n    <Compile Include=\"Service\\EveIDToName.cs\" />\n    <Compile Include=\"Models\\EveMailBody.cs\" />\n    <Compile Include=\"Models\\EveMailMessage.cs\" />\n    <Compile Include=\"Models\\Comparers\\EveMailMessageComparer.cs\" />\n    <Compile Include=\"Factories\\FontFactory.cs\" />\n    <Compile Include=\"Service\\ImageService.cs\" />\n    <Compile Include=\"Models\\Collections\\EveMailMessageCollection.cs\" />\n    <Compile Include=\"InstanceManager.cs\" />\n    <Compile Include=\"Helpers\\ListViewExporter.cs\" />\n    <Compile Include=\"Helpers\\FileHelper.cs\" />\n    <Compile Include=\"Helpers\\PlanEntrySorter.cs\" />\n    <Compile Include=\"Models\\ResearchPoint.cs\" />\n    <Compile Include=\"Models\\Collections\\ResearchPointCollection.cs\" />\n    <Compile Include=\"Models\\Comparers\\ResearchPointComparer.cs\" />\n    <Compile Include=\"Models\\SellOrder.cs\" />\n    <Compile Include=\"Enumerations\\CCPAPI\\CCPContractStatus.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableAPIMailBodies.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableAPIMailMessages.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableCharacterNameListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableCharacterListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableMailBodiesListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableMailMessagesListItem.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableOutpost.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableQueuedSkill.cs\" />\n    <Compile Include=\"Serialization\\Eve\\ISerializableCharacterIdentity.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableAPIMethod.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableAPIProvider.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableAPIUpdate.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableCCPCharacter.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableImplantSetCollection.cs\" />\n    <Compile Include=\"Serialization\\SerializableEveIDToName.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableInvalidPlanEntry.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializablePlanEntry.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableRemappingPoint.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableSettings.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableUriCharacter.cs\" />\n    <Compile Include=\"Settings.cs\" />\n    <Compile Include=\"Enumerations\\UISettings\\CompatibilityMode.cs\" />\n    <Compile Include=\"SettingsObjects\\EveMailMessageColumn.cs\" />\n    <Compile Include=\"SettingsObjects\\EveMailMessageColumnSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\EveMailMessageSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\ProxyAuthentication.cs\" />\n    <Compile Include=\"SettingsObjects\\ResearchColumn.cs\" />\n    <Compile Include=\"SettingsObjects\\ResearchColumnSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\ResearchSettings.cs\" />\n    <Compile Include=\"Helpers\\TimeCheck.cs\" />\n    <Compile Include=\"Net\\HttpWebClientServiceException.cs\" />\n    <Compile Include=\"Net\\HttpWebClientServiceExceptionStatus.cs\" />\n    <Compile Include=\"Net\\HttpWebClientServiceState.cs\" />\n    <Compile Include=\"Net\\ExceptionMessages.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>ExceptionMessages.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Models\\APIMethod.cs\" />\n    <Compile Include=\"Service\\AutoShrink.cs\" />\n    <Compile Include=\"Serialization\\Eve\\CCPAPIError.cs\" />\n    <Compile Include=\"Controls\\CopySaveOptionsWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\CopySaveOptionsWindow.Designer.cs\">\n      <DependentUpon>CopySaveOptionsWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\EveImage.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\EveImage.Designer.cs\">\n      <DependentUpon>EveImage.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\EveImagePopUp.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\EveImagePopUp.Designer.cs\">\n      <DependentUpon>EveImagePopUp.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\EVEMonForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\EVEMonForm.Designer.cs\">\n      <DependentUpon>EVEMonForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Models\\EveServer.cs\" />\n    <Compile Include=\"Helpers\\ExceptionHandler.cs\" />\n    <Compile Include=\"Models\\ImplantSet.cs\" />\n    <Compile Include=\"SettingsObjects\\SerializableColor.cs\" />\n    <Compile Include=\"Models\\Skill.cs\" />\n    <Compile Include=\"Models\\SkillGroup.cs\" />\n    <Compile Include=\"Service\\LocalXmlCache.cs\" />\n    <Compile Include=\"SettingsObjects\\PlanExportSettings.cs\" />\n    <Compile Include=\"Models\\Character.cs\" />\n    <Compile Include=\"Models\\Plan.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableCharacterSheetBase.cs\" />\n    <Compile Include=\"Controls\\SplitButton.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\TreeView.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\TreeViewExtensions.cs\" />\n    <Compile Include=\"Threading\\Dispatcher.cs\" />\n    <Compile Include=\"UpdateManager.cs\" />\n    <Compile Include=\"Util.cs\" />\n    <None Include=\"Serialization\\Exportation\\output-html.xslt\" />\n    <None Include=\"CloudStorageServices\\CloudStorageServiceSettings.settings\">\n      <Generator>PublicSettingsSingleFileGenerator</Generator>\n      <LastGenOutput>CloudStorageServiceSettings.Designer.cs</LastGenOutput>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"CloudStorageServices\\CloudStorageServiceResources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>CloudStorageServiceResources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\ColumnSelectWindow.resx\">\n      <DependentUpon>ColumnSelectWindow.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\EVEMonForm.resx\">\n      <DependentUpon>EVEMonForm.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Attributes\\EnforceUIThreadAffinity.cs\" />\n    <Compile Include=\"Attributes\\ForcedOnStartupAttribute.cs\" />\n    <Compile Include=\"Attributes\\HeaderAttribute.cs\" />\n    <Compile Include=\"Attributes\\Internals\\NotifyPropertyChanged.Subs.cs\" />\n    <Compile Include=\"Models\\BaseCharacter.cs\" />\n    <Compile Include=\"Models\\BasePlan.cs\" />\n    <Compile Include=\"Models\\CharacterAttribute.cs\" />\n    <Compile Include=\"Helpers\\CharacterAttributeScratchpad.cs\" />\n    <Compile Include=\"Models\\Comparers\\CharacterComparer.cs\" />\n    <Compile Include=\"Helpers\\CharacterExporter.cs\" />\n    <Compile Include=\"QueryMonitor\\CharacterQueryMonitor.cs\" />\n    <Compile Include=\"Collections\\FastList.cs\" />\n    <Compile Include=\"Controls\\ApiErrorTroubleshooter.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\ApiErrorTroubleshooter.Designer.cs\">\n      <DependentUpon>ApiErrorTroubleshooter.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\MessageBoxCustom.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\MessageBoxCustom.Designer.cs\">\n      <DependentUpon>MessageBoxCustom.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\ResolutionAction.cs\" />\n    <Compile Include=\"Constants\\CultureConstants.cs\" />\n    <Compile Include=\"Data\\Blueprint.cs\" />\n    <Compile Include=\"Data\\BlueprintCollection.cs\" />\n    <Compile Include=\"Data\\BlueprintMarketGroupCollection.cs\" />\n    <Compile Include=\"Data\\Constellation.cs\" />\n    <Compile Include=\"Constants\\DBConstants.cs\" />\n    <Compile Include=\"Data\\EveProperty.cs\" />\n    <Compile Include=\"Data\\EvePropertyCategory.cs\" />\n    <Compile Include=\"Data\\EvePropertyValue.cs\" />\n    <Compile Include=\"Data\\BlueprintMarketGroup.cs\" />\n    <Compile Include=\"Data\\ItemCollection.cs\" />\n    <Compile Include=\"Data\\MarketGroupCollection.cs\" />\n    <Compile Include=\"Data\\MarketGroupExtensions.cs\" />\n    <Compile Include=\"Data\\StaticBlueprints.cs\" />\n    <Compile Include=\"Data\\StaticGeography.cs\" />\n    <Compile Include=\"Data\\Implant.cs\" />\n    <Compile Include=\"Data\\Item.cs\" />\n    <Compile Include=\"Data\\MarketGroup.cs\" />\n    <Compile Include=\"Data\\Material.cs\" />\n    <Compile Include=\"Helpers\\PathFinder.cs\" />\n    <Compile Include=\"Data\\Region.cs\" />\n    <Compile Include=\"Data\\Ship.cs\" />\n    <Compile Include=\"Data\\SolarSystem.cs\" />\n    <Compile Include=\"Data\\SolarSystemRange.cs\" />\n    <Compile Include=\"Data\\StaticItems.cs\" />\n    <Compile Include=\"Data\\StaticProperties.cs\" />\n    <Compile Include=\"Data\\StaticRequiredMaterial.cs\" />\n    <Compile Include=\"Data\\StaticSkill.cs\" />\n    <Compile Include=\"Extensions\\StaticSkillEnumerableExtensions.cs\" />\n    <Compile Include=\"Data\\StaticSkillGroup.cs\" />\n    <Compile Include=\"Data\\StaticSkillLevel.cs\" />\n    <Compile Include=\"Extensions\\StaticSkillLevelEnumerableExtensions.cs\" />\n    <Compile Include=\"Data\\StaticSkills.cs\" />\n    <Compile Include=\"Data\\Station.cs\" />\n    <Compile Include=\"Data\\StationServices.cs\" />\n    <Compile Include=\"Extensions\\EnumExtensions.cs\" />\n    <Compile Include=\"Collections\\Global\\GlobalNotificationCollection.cs\" />\n    <Compile Include=\"Attributes\\UpdateAttribute.cs\" />\n    <Compile Include=\"Models\\IndustryJob.cs\" />\n    <Compile Include=\"Models\\Collections\\IndustryJobCollection.cs\" />\n    <Compile Include=\"Models\\Comparers\\IndustryJobComparer.cs\" />\n    <Compile Include=\"Models\\InvalidPlanEntry.cs\" />\n    <Compile Include=\"Interfaces\\IQueryMonitor.cs\" />\n    <Compile Include=\"Models\\MarketOrder.cs\" />\n    <Compile Include=\"Models\\Collections\\MarketOrderCollection.cs\" />\n    <Compile Include=\"Models\\Comparers\\MarketOrderComparer.cs\" />\n    <Compile Include=\"Net\\NetworkMonitor.cs\" />\n    <Compile Include=\"Helpers\\CharacterScratchpad.cs\" />\n    <Compile Include=\"Collections\\IReadonlyCollection.cs\" />\n    <Compile Include=\"Collections\\ReadonlyKeyedCollection.cs\" />\n    <Compile Include=\"Collections\\ReadonlyVirtualCollection.cs\" />\n    <Compile Include=\"Interfaces\\IPlanOperation.cs\" />\n    <Compile Include=\"Extensions\\PlanEntryExtensions.cs\" />\n    <Compile Include=\"Helpers\\PlanScratchpad.cs\" />\n    <Compile Include=\"Controls\\CharacterPortrait.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\CharacterPortrait.Designer.cs\">\n      <DependentUpon>CharacterPortrait.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Controls\\ControlExtensions.cs\" />\n    <Compile Include=\"Controls\\EveFolderWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Controls\\EveFolderWindow.Designer.cs\">\n      <DependentUpon>EveFolderWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Factories\\DisposableWithCallback.cs\" />\n    <Compile Include=\"Models\\CCPCharacter.cs\" />\n    <Compile Include=\"Service\\Emailer.cs\" />\n    <Compile Include=\"Collections\\EnumerableExtensions.cs\" />\n    <Compile Include=\"Collections\\Global\\GlobalCharacterCollection.cs\" />\n    <Compile Include=\"Collections\\Global\\GlobalDatafileCollection.cs\" />\n    <Compile Include=\"Interfaces\\ICharacterAttribute.cs\" />\n    <Compile Include=\"Models\\Collections\\ImplantSetCollection.cs\" />\n    <Compile Include=\"Interfaces\\IStaticSkill.cs\" />\n    <Compile Include=\"Collections\\BaseList.cs\" />\n    <Compile Include=\"Models\\Collections\\PlanCollection.cs\" />\n    <Compile Include=\"Models\\Comparers\\PlanComparer.cs\" />\n    <Compile Include=\"QueryMonitor\\QueryMonitor.cs\" />\n    <Compile Include=\"QueryMonitor\\QueryMonitorCollection.cs\" />\n    <Compile Include=\"Serialization\\Eve\\IAPIResult.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\BlueprintsDatafile.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\DatafileConstants.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>DatafileConstants.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Serialization\\Datafiles\\GeoDatafile.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\ItemsDatafile.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\PropertiesDatafile.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\ReprocessingDatafile.cs\" />\n    <Compile Include=\"Serialization\\Exportation\\OutputCharacter.cs\" />\n    <Compile Include=\"Serialization\\Exportation\\OutputPlan.cs\" />\n    <Compile Include=\"Serialization\\Exportation\\OutputSkillGroup.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableBuyOrder.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableJob.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableOrderBase.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableSellOrder.cs\" />\n    <Compile Include=\"SettingsObjects\\BlueprintBrowserSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\CharacterUISettings.cs\" />\n    <Compile Include=\"SettingsObjects\\CustomMsgBoxSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\ExportationSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\IndustryJobColumn.cs\" />\n    <Compile Include=\"SettingsObjects\\IndustryJobColumnSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\IndustryJobSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\MarketOrderColumn.cs\" />\n    <Compile Include=\"SettingsObjects\\MarketOrderColumnSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\MarketOrderSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\NotificationCategorySettings.cs\" />\n    <Compile Include=\"SettingsObjects\\PlanColumn.cs\" />\n    <Compile Include=\"Models\\PlanEntry.cs\" />\n    <Compile Include=\"Helpers\\PlanIOHelper.cs\" />\n    <Compile Include=\"Models\\RemappingPoint.cs\" />\n    <Compile Include=\"Scheduling\\Enumerations.cs\" />\n    <Compile Include=\"Scheduling\\RecurringScheduleEntry.cs\" />\n    <Compile Include=\"Scheduling\\ScheduleDateTimeRange.cs\" />\n    <Compile Include=\"Scheduling\\ScheduleEntry.cs\" />\n    <Compile Include=\"Scheduling\\ScheduleEntryTitleComparer.cs\" />\n    <Compile Include=\"Scheduling\\Scheduler.cs\" />\n    <Compile Include=\"Scheduling\\SimpleScheduleEntry.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableAPICharacterSheet.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableCharacterAttributes.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableRecurringScheduleEntry.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableScheduleEntry.cs\" />\n    <Compile Include=\"SettingsObjects\\CalendarSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\ItemBrowserSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\MonitoredCharacterSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\PlanColumnSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\PlanSorting.cs\" />\n    <Compile Include=\"SettingsObjects\\ProxySettings.cs\" />\n    <Compile Include=\"SettingsObjects\\SchedulerUISettings.cs\" />\n    <Compile Include=\"SettingsObjects\\G15Settings.cs\" />\n    <Compile Include=\"SettingsObjects\\MainWindowSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\NotificationSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\SchedulerSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\SerializableDictionary.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableSettingsImplantSet.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializablePlan.cs\" />\n    <Compile Include=\"Serialization\\Datafiles\\SkillsDatafile.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableCharacterIdentity.cs\" />\n    <Compile Include=\"Serialization\\Settings\\SerializableSettingsCharacter.cs\" />\n    <Compile Include=\"SettingsObjects\\WindowLocationSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\PlanWindowSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\ShipBrowserSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\SkillBrowserSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\SkillPieChartSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\ToolTipNotificationBehaviour.cs\" />\n    <Compile Include=\"SettingsObjects\\TrayPopupSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\TrayTooltipSettings.cs\" />\n    <Compile Include=\"SettingsObjects\\UISettings.cs\" />\n    <Compile Include=\"SettingsObjects\\UpdateSettings.cs\" />\n    <Compile Include=\"Models\\Collections\\SkillCollection.cs\" />\n    <Compile Include=\"Extensions\\SkillEnumerableExtensions.cs\" />\n    <Compile Include=\"Models\\Collections\\SkillGroupCollection.cs\" />\n    <Compile Include=\"Extensions\\SkillLevelEnumerableExtensions.cs\" />\n    <Compile Include=\"Models\\SkillLevelSet.cs\" />\n    <Compile Include=\"Models\\SkillQueue.cs\" />\n    <Compile Include=\"Models\\CharacterIdentity.cs\" />\n    <Compile Include=\"Serialization\\Eve\\CCPAPIResult.cs\" />\n    <Compile Include=\"Collections\\ReadonlyCollection.cs\" />\n    <Compile Include=\"Models\\SkillLevel.cs\" />\n    <Compile Include=\"Extensions\\TimeExtensions.cs\" />\n    <Compile Include=\"Models\\UriCharacter.cs\" />\n    <Compile Include=\"Collections\\Global\\GlobalCharacterIdentityCollection.cs\" />\n    <Compile Include=\"Collections\\Global\\GlobalMonitoredCharacterCollection.cs\" />\n    <Compile Include=\"Serialization\\Eve\\ISerializableWithLocalClock.cs\" />\n    <Compile Include=\"Serialization\\Eve\\SerializableCharacterSkill.cs\" />\n    <Compile Include=\"Models\\QueuedSkill.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"Controls\\PrintOptionsDialog.resx\">\n      <DependentUpon>PrintOptionsDialog.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\TipWindow.resx\">\n      <DependentUpon>TipWindow.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\TrayIcon.resx\">\n      <DependentUpon>TrayIcon.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Constants\\NetworkConstants.resx\">\n      <SubType>Designer</SubType>\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>NetworkConstants1.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\CopySaveOptionsWindow.resx\">\n      <DependentUpon>CopySaveOptionsWindow.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\EveImage.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>EveImage.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\EveImagePopUp.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>EveImagePopUp.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Net\\ExceptionMessages.resx\">\n      <SubType>Designer</SubType>\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>ExceptionMessages.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <SubType>Designer</SubType>\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"Controls\\ApiErrorTroubleshooter.resx\">\n      <DependentUpon>ApiErrorTroubleshooter.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\CharacterPortrait.resx\">\n      <DependentUpon>CharacterPortrait.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\EveFolderWindow.resx\">\n      <DependentUpon>EveFolderWindow.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Controls\\MessageBoxCustom.resx\">\n      <DependentUpon>MessageBoxCustom.cs</DependentUpon>\n    </EmbeddedResource>\n    <None Include=\"Resources\\Skill_Select\\Group0\\Default.resources\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\Skill_Select\\Group1\\Dice_Spots.resources\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\Skill_Select\\Group2\\Slashes.resources\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\Skill_Select\\Group3\\Pie_Slices.resources\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\Skill_Select\\Group4\\Pentagons.resources\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\Skill_Select\\Group5\\Pentagrams.resources\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\Skill_Select\\Group6\\Black_Dice.resources\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\Skill_Select\\Group7\\Red_Dice.resources\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\Skill_Select\\Group8\\Bars.resources\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <EmbeddedResource Include=\"Serialization\\Eve\\rowsets-transform.xslt\">\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Serialization\\Datafiles\\datafile-transform.xslt\" />\n    <EmbeddedResource Include=\"Serialization\\Datafiles\\DatafileConstants.resx\">\n      <Generator>PublicResXFileCodeGenerator</Generator>\n      <LastGenOutput>DatafileConstants.Designer.cs</LastGenOutput>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Serialization\\Settings\\settings-transform.xslt\" />\n    <EmbeddedResource Include=\"Serialization\\NotificationRefTypes.xml\" />\n    <EmbeddedResource Include=\"Serialization\\Flags.xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\eve-blueprints-en-US.xml.gzip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\eve-certificates-en-US.xml.gzip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\eve-geography-en-US.xml.gzip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\eve-items-en-US.xml.gzip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\eve-masteries-en-US.xml.gzip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\eve-properties-en-US.xml.gzip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\eve-reprocessing-en-US.xml.gzip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\eve-skills-en-US.xml.gzip\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Include=\"Resources\\Skill_Select\\IconSettings.settings\">\n      <Generator>PublicSettingsSingleFileGenerator</Generator>\n      <LastGenOutput>IconSettings.Designer.cs</LastGenOutput>\n    </None>\n    <None Include=\"Resources\\MD5Sums.txt\" />\n    <None Include=\"Resources\\License\\gpl.txt\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n  <ItemGroup />\n  <ItemGroup>\n    <None Include=\"Resources\\callback_ok.htm\" />\n    <None Include=\"Resources\\callback_fail.htm\" />\n    <Content Include=\"Resources\\chrFactions.txt\" />\n    <Content Include=\"Serialization\\RefTypes.xml\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets. -->\n  <Target Name=\"GenerateSerializationAssembliesForAllTypes\" DependsOnTargets=\"AssignTargetPaths;Compile;ResolveKeySource\" Inputs=\"$(MSBuildAllProjects);@(IntermediateAssembly)\" Outputs=\"$(OutputPath)$(_SGenDllName)\">\n    <SGen BuildAssemblyName=\"$(TargetFileName)\" BuildAssemblyPath=\"$(OutputPath)\" References=\"@(ReferencePath)\" ShouldGenerateSerializer=\"true\" UseProxyTypes=\"false\" KeyContainer=\"$(KeyContainerName)\" KeyFile=\"$(KeyOriginatorFile)\" DelaySign=\"$(DelaySign)\" ToolPath=\"$(SGenToolPath)\">\n      <Output TaskParameter=\"SerializationAssembly\" ItemName=\"SerializationAssembly\" />\n    </SGen>\n  </Target>\n  <UsingTask TaskName=\"GitVersionFile\" AssemblyFile=\"..\\..\\tools\\MSBuildVersioning\\MSBuildVersioning.dll\" />\n  <Target Name=\"BeforeBuild\" Condition=\" '$(Configuration)' == 'Release' OR '$(Configuration)' == 'Snapshot' \">\n    <GitVersionFile TemplateFile=\"..\\..\\SharedAssemblyInfo.template.cs\" DestinationFile=\"..\\..\\SharedAssemblyInfo.cs\" />\n  </Target>\n  <Target Name=\"AfterBuild\" DependsOnTargets=\"GenerateSerializationAssembliesForAllTypes\">\n  </Target>\n  <Import Project=\"..\\..\\packages\\Microsoft.Bcl.Build.1.0.21\\build\\Microsoft.Bcl.Build.targets\" Condition=\"Exists('..\\..\\packages\\Microsoft.Bcl.Build.1.0.21\\build\\Microsoft.Bcl.Build.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\..\\packages\\Microsoft.Bcl.Build.1.0.21\\build\\Microsoft.Bcl.Build.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\packages\\Microsoft.Bcl.Build.1.0.21\\build\\Microsoft.Bcl.Build.targets'))\" />\n  </Target>\n</Project>"
  },
  {
    "path": "src/EVEMon.Common/EmailProvider/DefaultProvider.cs",
    "content": "﻿\nnamespace EVEMon.Common.EmailProvider\n{\n    public sealed class DefaultProvider : IEmailProvider\n    {\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name => \"Other\";\n\n        /// <summary>\n        /// Gets the server address.\n        /// </summary>\n        /// <value>The server address.</value>\n        public string ServerAddress => string.Empty;\n\n        /// <summary>\n        /// Gets the server port.\n        /// </summary>\n        /// <value>The server port.</value>\n        public int ServerPort => 25;\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires SSL.\n        /// </summary>\n        /// <value><c>true</c> if the server requires SSL; otherwise, <c>false</c>.</value>\n        public bool RequiresSsl => false;\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires authentication.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the server requires authentication ; otherwise, <c>false</c>.\n        /// </value>\n        public bool RequiresAuthentication => false;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/EmailProvider/EmailProviders.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\n\nnamespace EVEMon.Common.EmailProvider\n{\n    public static class EmailProviders\n    {\n        private static readonly Dictionary<string, IEmailProvider> s_emailProviders = new Dictionary<string, IEmailProvider>();\n\n        /// <summary>\n        /// Initializes this instance.\n        /// </summary>\n        public static void Initialize()\n        {\n            foreach (IEmailProvider provider in Assembly.GetExecutingAssembly().GetTypes().Where(\n                type => typeof(IEmailProvider).IsAssignableFrom(type) && type.GetConstructor(Type.EmptyTypes) != null).Select(\n                    type => Activator.CreateInstance(type) as IEmailProvider).OrderBy(provider => provider.Name))\n            {\n                s_emailProviders[provider.Name] = provider;\n            }\n        }\n\n        /// <summary>\n        /// Gets the providers.\n        /// </summary>\n        /// <value>The providers.</value>\n        public static IEnumerable<IEmailProvider> Providers => s_emailProviders.Values;\n\n        /// <summary>\n        /// Gets the value by the provided key.\n        /// </summary>\n        /// <param name=\"name\">The name.</param>\n        /// <returns></returns>\n        public static IEmailProvider GetByKey(string name)\n        {\n            IEmailProvider provider;\n            s_emailProviders.TryGetValue(name, out provider);\n            return provider;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/EmailProvider/GmxProvider.cs",
    "content": "\nnamespace EVEMon.Common.EmailProvider\n{\n    public sealed class GmxProvider : IEmailProvider\n    {\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name => \"GMX\";\n\n        /// <summary>\n        /// Gets the server address.\n        /// </summary>\n        /// <value>The server address.</value>\n        public string ServerAddress => \"mail.gmx.net\";\n\n        /// <summary>\n        /// Gets the server port.\n        /// </summary>\n        /// <value>The server port.</value>\n        public int ServerPort => 465;\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires SSL.\n        /// </summary>\n        /// <value><c>true</c> if the server requires SSL; otherwise, <c>false</c>.</value>\n        public bool RequiresSsl => true;\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires authentication.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the server requires authentication ; otherwise, <c>false</c>.\n        /// </value>\n        public bool RequiresAuthentication => true;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/EmailProvider/GoogleProvider.cs",
    "content": "﻿\nnamespace EVEMon.Common.EmailProvider\n{\n    public sealed class GoogleProvider : IEmailProvider\n    {\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name => \"Google\";\n\n        /// <summary>\n        /// Gets the server address.\n        /// </summary>\n        /// <value>The server address.</value>\n        public string ServerAddress => \"smtp.gmail.com\";\n\n        /// <summary>\n        /// Gets the server port.\n        /// </summary>\n        /// <value>The server port.</value>\n        public int ServerPort => 587;\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires SSL.\n        /// </summary>\n        /// <value><c>true</c> if the server requires SSL; otherwise, <c>false</c>.</value>\n        public bool RequiresSsl => true;\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires authentication.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the server requires authentication ; otherwise, <c>false</c>.\n        /// </value>\n        public bool RequiresAuthentication => true;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/EmailProvider/HotmailProvider.cs",
    "content": "﻿\nnamespace EVEMon.Common.EmailProvider\n{\n    public sealed class HotmailProvider : IEmailProvider\n    {\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name => \"Hotmail / Live\";\n\n        /// <summary>\n        /// Gets the server address.\n        /// </summary>\n        /// <value>The server address.</value>\n        public string ServerAddress => \"smtp-mail.outlook.com\";\n\n        /// <summary>\n        /// Gets the server port.\n        /// </summary>\n        /// <value>The server port.</value>\n        public int ServerPort => 587;\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires SSL.\n        /// </summary>\n        /// <value><c>true</c> if the server requires SSL; otherwise, <c>false</c>.</value>\n        public bool RequiresSsl => true;\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires authentication.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the server requires authentication ; otherwise, <c>false</c>.\n        /// </value>\n        public bool RequiresAuthentication => true;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/EmailProvider/IEmailProvider.cs",
    "content": "﻿\nnamespace EVEMon.Common.EmailProvider\n{\n    public interface IEmailProvider\n    {\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        string Name { get; }\n\n        /// <summary>\n        /// Gets the server address.\n        /// </summary>\n        /// <value>The server address.</value>\n        string ServerAddress { get; }\n\n        /// <summary>\n        /// Gets the server port.\n        /// </summary>\n        /// <value>The server port.</value>\n        int ServerPort { get; }\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires SSL.\n        /// </summary>\n        /// <value><c>true</c> if the server requires SSL; otherwise, <c>false</c>.</value>\n        bool RequiresSsl { get; }\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires authentication.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the server requires authentication ; otherwise, <c>false</c>.\n        /// </value>\n        bool RequiresAuthentication { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/EmailProvider/YahooPlusProvider.cs",
    "content": "﻿\nnamespace EVEMon.Common.EmailProvider\n{\n    public sealed class YahooPlusProvider : IEmailProvider\n    {\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name => \"Yahoo Plus\";\n\n        /// <summary>\n        /// Gets the server address.\n        /// </summary>\n        /// <value>The server address.</value>\n        public string ServerAddress => \"plus.smtp.mail.yahoo.com\";\n\n        /// <summary>\n        /// Gets the server port.\n        /// </summary>\n        /// <value>The server port.</value>\n        public int ServerPort => 465;\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires SSL.\n        /// </summary>\n        /// <value><c>true</c> if the server requires SSL; otherwise, <c>false</c>.</value>\n        public bool RequiresSsl => true;\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires authentication.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the server requires authentication ; otherwise, <c>false</c>.\n        /// </value>\n        public bool RequiresAuthentication => true;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/EmailProvider/YahooProvider.cs",
    "content": "﻿\nnamespace EVEMon.Common.EmailProvider\n{\n    public sealed class YahooProvider : IEmailProvider\n    {\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name => \"Yahoo\";\n\n        /// <summary>\n        /// Gets the server address.\n        /// </summary>\n        /// <value>The server address.</value>\n        public string ServerAddress => \"smtp.mail.yahoo.com\";\n\n        /// <summary>\n        /// Gets the server port.\n        /// </summary>\n        /// <value>The server port.</value>\n        public int ServerPort => 465;\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires SSL.\n        /// </summary>\n        /// <value><c>true</c> if the server requires SSL; otherwise, <c>false</c>.</value>\n        public bool RequiresSsl => true;\n\n        /// <summary>\n        /// Gets a value indicating whether the server requires authentication.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the server requires authentication ; otherwise, <c>false</c>.\n        /// </value>\n        public bool RequiresAuthentication => true;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/AbbreviationFormat.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// The abbreviation format status of a market orders value.\n    /// </summary>\n    public enum AbbreviationFormat\n    {\n        AbbreviationWords,\n        AbbreviationSymbols\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ActiveJobState.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// The status of an active job.\n    /// </summary>\n    public enum ActiveJobState\n    {\n        None,\n\n        [Description(\"Pending\")]\n        Pending,\n\n        [Description(\"In progress\")]\n        InProgress,\n\n        [Description(\"Ready\")]\n        Ready\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/AgentType.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of Agent type.\n    /// </summary>\n    public enum AgentType\n    {\n        [Description]\n        NonAgent,\n\n        [Description(\"Agents\")]\n        BasicAgent,\n\n        [Description(\"Tutorial\")]\n        TutorialAgent,\n\n        [Description(\"Research\")]\n        ResearchAgent,\n\n        [Description(\"CONCORD\")]\n        CONCORDAgent,\n\n        [Description(\"Storyline\")]\n        GenericStorylineMissionAgent,\n\n        [Description(\"Stolyline\")]\n        StorylineMissionAgent,\n\n        [Description(\"Event\")]\n        EventMissionAgent,\n\n        [Description(\"Factional Warfare\")]\n        FactionalWarfareAgent,\n\n        [Description(\"Epic\")]\n        EpicArcAgent,\n\n        [Description(\"Aura\")]\n        AuraAgent,\n\n        [Description(\"Career\")]\n        CareerAgent\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/AmarrMilitiaRank.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of Amarr Militia ranking.\n    /// </summary>\n    public enum AmarrMilitiaRank\n    {\n        [Description(\"Paladin Crusader\")]\n        PaladinCrusader = 0,\n\n        [Description(\"Templar Lieutenant\")]\n        TemplarLieutenant = 1,\n\n        [Description(\"Cardinal Lieutenant\")]\n        CardinalLieutenant = 2,\n\n        [Description(\"Arch Lieutenant\")]\n        ArchLieutenant = 3,\n\n        [Description(\"Imperial Major\")]\n        ImperialMajor = 4,\n\n        [Description(\"Marshal Commander\")]\n        MarshalCommander = 5,\n\n        [Description(\"Imperator Commander\")]\n        ImperatorCommander = 6,\n\n        [Description(\"Tribunus Colonel\")]\n        TribunusColonel = 7,\n\n        [Description(\"Legatus Commodore\")]\n        LegatusCommodore = 8,\n\n        [Description(\"Divine Commodore\")]\n        DivineCommodore = 9,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/Ancestry.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of a character's ancestry.\n    /// </summary>\n    public enum Ancestry\n    {\n        Liberal_Holders = 1,\n        Wealthy_Commoners = 2,\n        Religious_Reclaimers = 3,\n        Free_Merchants = 4,\n        Border_Runners = 5,\n        Navy_Veterans = 6,\n        Cyber_Knights = 37,\n        Unionists = 38,\n        Zealots = 39,\n        Merchandisers = 10,\n        Scientists = 11,\n        Tube_Child = 12,\n        Entrepreneurs = 7,\n        Mercs = 8,\n        Dissenters = 9,\n        Inventors = 31,\n        Monks = 32,\n        Stargazers = 33,\n        Activists = 13,\n        Miners = 14,\n        Immigrants = 15,\n        Artists = 16,\n        Diplomats = 17,\n        Reborn = 18,\n        Sang_Do_Caste = 34,\n        Saan_Go_Caste = 35,\n        Jing_Ko_Caste = 36,\n        Tinkerers = 19,\n        Traders = 20,\n        Rebels = 21,\n        Workers = 22,\n        Tribal_Traditionalists = 23,\n        Slave_Child = 24,\n        Drifters = 40,\n        Mystics = 41,\n        Retailers = 42,\n        Elders = 25,\n        Unsullied = 26,\n        Stasis_People = 27,\n        Existentialists = 28,\n        Puritan = 29,\n        Lab_Rat = 30,\n        Unknown = 0\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/AttributeOptimizationStrategy.cs",
    "content": "namespace EVEMon.SkillPlanner\n{\n    /// <summary>\n    /// Remapping strategy.\n    /// </summary>\n    public enum AttributeOptimizationStrategy\n    {\n        /// <summary>\n        /// Stratagy based on remapping points.\n        /// </summary>\n        RemappingPoints,\n\n        /// <summary>\n        /// Strategy based on the first year from a plan.\n        /// </summary>\n        OneYearPlan,\n\n        /// <summary>\n        /// Strategy based on already trained skills.\n        /// </summary>\n        Character,\n\n        /// <summary>\n        /// Used when the user double-click a remapping point to manually edit it.\n        /// </summary>\n        ManualRemappingPointEdition\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/BlinkAction.cs",
    "content": "﻿namespace EVEMon.Common.Enumerations\n{\n    public enum BlinkAction\n    {\n        Reset,\n        Blink,\n        Stop\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/Bloodline.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of a character's bloodline.\n    /// </summary>\n    public enum Bloodline\n    {\n        Amarr = 5,\n        Ni_Kunni = 6,\n        Khanid = 13,\n        Deteis = 1,\n        Civire = 2,\n        Achura = 11,\n        Gallente = 7,\n        Intaki = 8,\n        Jin_Mei = 12,\n        Sebiestor = 3,\n        Brutor = 4,\n        Vherokior = 14,\n        Static = 9,\n        Modifier = 10,\n        Drifter = 19,\n        Unknown = 0\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/BlueprintActivity.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents the activity of a blueprint.\n    /// </summary>\n    public enum BlueprintActivity\n    {\n        [Description(\"None\")]\n        None = 0,\n\n        [Description(\"Manufacturing\")]\n        Manufacturing = 1,\n\n        [Description(\"Researching Technology\")]\n        ResearchingTechnology = 2,\n\n        [Description(\"Time Efficiency Research\")]\n        ResearchingTimeEfficiency = 3,\n\n        [Description(\"Material Efficiency Research\")]\n        ResearchingMaterialEfficiency = 4,\n\n        [Description(\"Copying\")]\n        Copying = 5,\n\n        [Description(\"Duplicating\")]\n        Duplicating = 6,\n\n        [Description(\"Reverse Engineering\")]\n        ReverseEngineering = 7,\n\n        [Description(\"Invention\")]\n        Invention = 8,\n\n        [Description(\"Simple Reactions\")]\n        SimpleReactions = 9,\n\n        [Description(\"Reactions\")]\n        Reactions = 11\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/BlueprintType.cs",
    "content": "using EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// A blueprint's type.\n    /// </summary>\n    /// <remarks>The integer value determines the value assigned in <see cref=\"IndustryJob\"/>.</remarks>\n    public enum BlueprintType\n    {\n        Original = 0,\n        Copy = 1\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CCPAPI/APIErrorType.cs",
    "content": "namespace EVEMon.Common.Enumerations.CCPAPI\n{\n    /// <summary>\n    /// Represents the category of error which can occur with the API.\n    /// </summary>\n    public enum APIErrorType\n    {\n        /// <summary>\n        /// There was no error.\n        /// </summary>\n        None,\n\n        /// <summary>\n        /// The error was caused by the network.\n        /// </summary>\n        Http,\n\n        /// <summary>\n        /// The error occurred during JSON decoding.\n        /// </summary>\n        Json,\n\n        /// <summary>\n        /// The error occurred during XML decoding.\n        /// </summary>\n        Xml,\n\n        /// <summary>\n        /// It was a managed CCP error.\n        /// </summary>\n        CCP\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CCPAPI/CCPAPIContactType.cs",
    "content": "﻿namespace EVEMon.Common.Enumerations.CCPAPI\n{\n    // Used for the contact list to determine who set this contact\n    public enum CCPAPIContactType\n    {\n        Eve_Server, Character, Corporation, Alliance, Faction, System, Other\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CCPAPI/CCPAPIKeyType.cs",
    "content": "namespace EVEMon.Common.Enumerations.CCPAPI\n{\n    /// <summary>\n    /// Enumeration of API key types.\n    /// </summary>\n    public enum CCPAPIKeyType\n    {\n        /// <summary>\n        /// The API key type wouldn't be checked because of an error.\n        /// </summary>\n        Unknown = 0,\n\n        /// <summary>\n        /// This is a character wide ESI key.\n        /// </summary>\n        Character = 2\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CCPAPI/CCPAPILocationType.cs",
    "content": "﻿namespace EVEMon.Common.Enumerations.CCPAPI\n{\n    // Used in asset lists and clone lists to determine the type of the target location\n    public enum CCPAPILocationType\n    {\n        Station, Structure, Solar_System, Other\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CCPAPI/CCPAPIMethodsEnum.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.Enumerations.CCPAPI\n{\n    /// <summary>\n    /// Enumerations to support APIMethodsEnum.\n    /// </summary>\n    [Flags]\n    public enum CCPAPIMethodsEnum : ulong\n    {\n        None = 0,\n\n        /// <summary>\n        /// The basic character features of APIMethodsEnum.\n        /// </summary>\n        BasicCharacterFeatures = ESIAPICharacterMethods.AccountBalance |\n            ESIAPICharacterMethods.Attributes | ESIAPICharacterMethods.CharacterSheet |\n            ESIAPICharacterMethods.Clones | ESIAPICharacterMethods.EmploymentHistory |\n            ESIAPICharacterMethods.Location | ESIAPICharacterMethods.Implants |\n            ESIAPICharacterMethods.Ship | ESIAPICharacterMethods.SkillQueue |\n            ESIAPICharacterMethods.Skills,\n\n        /// <summary>\n        /// The advanced character features of APIMethodsEnum.\n        /// </summary>\n        AdvancedCharacterFeatures = ESIAPICharacterMethods.AssetList |\n            ESIAPICharacterMethods.CalendarEventAttendees | ESIAPICharacterMethods.ContactList |\n            ESIAPICharacterMethods.Contracts | ESIAPICharacterMethods.ContractBids |\n            ESIAPICharacterMethods.ContractItems | ESIAPICharacterMethods.FactionalWarfareStats |\n            ESIAPICharacterMethods.IndustryJobs | ESIAPICharacterMethods.JumpFatigue |\n            ESIAPICharacterMethods.KillLog | ESIAPICharacterMethods.MailMessages |\n            ESIAPICharacterMethods.MailBodies | ESIAPICharacterMethods.MailingLists |\n            ESIAPICharacterMethods.MarketOrders | ESIAPICharacterMethods.Medals |\n            ESIAPICharacterMethods.Notifications | ESIAPICharacterMethods.PlanetaryColonies |\n            ESIAPICharacterMethods.PlanetaryLayout | ESIAPICharacterMethods.ResearchPoints |\n            ESIAPICharacterMethods.Standings | ESIAPICharacterMethods.UpcomingCalendarEvents |\n            ESIAPICharacterMethods.UpcomingCalendarEventDetails |\n            ESIAPICharacterMethods.WalletJournal | ESIAPICharacterMethods.WalletTransactions |\n            ESIAPICharacterMethods.CitadelInfo | ESIAPICharacterMethods.LoyaltyPoints |\n            ESIAPICharacterMethods.MarketOrdersHistory,\n\n        /// <summary>\n        /// The advanced corporation features of APIMethodsEnum.\n        /// </summary>\n        AdvancedCorporationFeatures = ESIAPICorporationMethods.CorporationContracts |\n            ESIAPICorporationMethods.CorporationMedals |\n            ESIAPICorporationMethods.CorporationMarketOrders |\n            ESIAPICorporationMethods.CorporationIndustryJobs |\n            ESIAPICorporationMethods.CorporationMarketOrdersHistory,\n\n        /// <summary>\n        /// All character features of APIMethodsEnum\n        /// </summary>\n        AllCharacterFeatures = BasicCharacterFeatures | AdvancedCharacterFeatures,\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CCPAPI/CCPAPIPlanetTypes.cs",
    "content": "﻿namespace EVEMon.Common.Enumerations.CCPAPI\n{\n    /// <summary>\n    /// Maps planet types () to type IDs.\n    /// </summary>\n    public enum CCPAPIPlanetTypes\n    {\n        Temperate = 11,\n        Barren = 2016,\n        Oceanic = 2014,\n        Ice = 12,\n        Gas = 13,\n        Lava = 2015,\n        Storm = 2017,\n        Plasma = 2063,\n        Unknown = 0\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CCPAPI/CCPContractStatus.cs",
    "content": "﻿using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations.CCPAPI\n{\n    public enum CCPContractStatus\n    {\n        [Description(\"None\")]\n        None,\n\n        [Description(\"Outstanding\")]\n        Outstanding,\n\n        [Description(\"In Progress\")]\n        InProgress,\n\n        [Description(\"Deleted\")]\n        Deleted,\n\n        [Description(\"Finished\")]\n        Completed,\n\n        [Description(\"Failed\")]\n        Failed,\n\n        [Description(\"Completed By Issuer\")]\n        CompletedByIssuer,\n\n        [Description(\"Completed By Contractor\")]\n        CompletedByContractor,\n\n        [Description(\"Canceled\")]\n        Canceled,\n\n        [Description(\"Rejected\")]\n        Rejected,\n\n        [Description(\"Overdue\")]\n        Overdue,\n\n        [Description(\"Reversed\")]\n        Reversed\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CCPAPI/CCPJobCompletedStatus.cs",
    "content": "﻿namespace EVEMon.Common.Enumerations.CCPAPI\n{\n    public enum CCPJobCompletedStatus\n    {\n        Active = 1,\n        Paused = 2,\n        Ready = 3,\n\n        Delivered = 101,\n        Cancelled = 102,\n        Reverted = 103,\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CCPAPI/CCPOrderState.cs",
    "content": "﻿namespace EVEMon.Common.Enumerations.CCPAPI\n{\n    /// <summary>\n    /// The status of a market order.\n    /// </summary>\n    public enum CCPOrderState\n    {\n        Opened = 0,\n        Closed = 1,\n        ExpiredOrFulfilled = 2,\n        Canceled = 3,\n        Pending = 4,\n        CharacterDeleted = 5\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CCPAPI/ESIAPICharacterMethods.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.Common.Enumerations.CCPAPI\n{\n    /// <summary>\n    /// Enumeration of the character related API methods. Each method has an access mask.\n    /// Each method should have an entry in APIMethodsEnum and an equivalent string entry \n    /// in NetworkConstants indicating the default path of the method.\n    /// </summary>\n    [Flags]\n    public enum ESIAPICharacterMethods : ulong\n    {\n        None = 0,\n\n        /// <summary>\n        /// A character's wallet balance.\n        /// </summary>\n        [Parent(CharacterSheet)]\n        AccountBalance = 1 << 0,\n\n        /// <summary>\n        /// The assets of a character.\n        /// </summary>\n        [Header(\"Assets\")]\n        [Description(\"The assets of a character.\")]\n        [Update(UpdatePeriod.Hours2, UpdatePeriod.Hours1)]\n        AssetList = 1 << 1,\n\n        /// <summary>\n        /// The attributes of a character.\n        /// </summary>\n        Attributes = 1 << 2,\n\n        /// <summary>\n        /// Tha attendees to a character's calendar event.\n        /// </summary>\n        [Header(\"Calendar Event Attendees\")]\n        [Description(\"The attendees and their response status to a calendar event.\")]\n        [Update(UpdatePeriod.Minutes15, UpdatePeriod.Hours1)]\n        CalendarEventAttendees = 1 << 3,\n\n        /// <summary>\n        /// A character sheet with public information.\n        /// </summary>\n        [Header(\"Character Sheet\")]\n        [Description(\"A character's sheet listing biography, skills, attributes and implants informations.\")]\n        [Update(UpdatePeriod.Hours1, UpdatePeriod.Minutes30)]\n        CharacterSheet = 1 << 4,\n\n        /// <summary>\n        /// The Citadel information for a character\n        /// </summary>\n        CitadelInfo = 1L << 35,\n\n        /// <summary>\n        /// The clones of a character.\n        /// </summary>\n        [Parent(CharacterSheet)]\n        Clones = 1 << 5,\n\n        /// <summary>\n        /// The contact list of a character.\n        /// </summary>\n        [Header(\"Contacts\")]\n        [Description(\"The contacts of a character.\")]\n        [Update(UpdatePeriod.Minutes5, UpdatePeriod.Minutes15)]\n        ContactList = 1 << 6,\n\n        /// <summary>\n        /// Contact notifications for a character.\n        /// </summary>\n        ContactNotifications = 1 << 7,\n\n        /// <summary>\n        /// The personal issued contracts of a character.\n        /// </summary>\n        [Header(\"Contracts\")]\n        [Description(\"The contracts of a character.\")]\n        [Update(UpdatePeriod.Minutes5, UpdatePeriod.Minutes15)]\n        Contracts = 1 << 8,\n\n        /// <summary>\n        /// The contract items of a character contract.\n        /// </summary>\n        ContractItems = 1 << 9,\n\n        /// <summary>\n        /// The bids list of a character contract.\n        /// </summary>\n        ContractBids = 1 << 10,\n\n        /// <summary>\n        /// The employment history of a character.\n        /// </summary>\n        [Parent(CharacterSheet)]\n        EmploymentHistory = 1 << 11,\n\n        /// <summary>\n        /// The factional warfare stats of a character.\n        /// </summary>\n        [Header(\"Factional Warfare Stats\")]\n        [Description(\"The factional warfare stats of a character.\")]\n        [Update(UpdatePeriod.Hours6, UpdatePeriod.Hours1)]\n        FactionalWarfareStats = 1 << 12,\n\n        /// <summary>\n        /// The active implants of a character.\n        /// </summary>\n        [Parent(CharacterSheet)]\n        Implants = 1 << 13,\n\n        /// <summary>\n        /// The personal issued industry jobs of a character.\n        /// </summary>\n        [Header(\"Industry Jobs\")]\n        [Description(\"The industry jobs of a character.\")]\n        [Update(UpdatePeriod.Minutes15, UpdatePeriod.Minutes5)]\n        IndustryJobs = 1 << 14,\n\n        /// <summary>\n        /// The jump fatigue of a character.\n        /// </summary>\n        JumpFatigue = 1 << 15,\n\n        /// <summary>\n        /// The Kill log for a character (Kill mails).\n        /// </summary>\n        [Header(\"Combat Log\")]\n        [Description(\"The combat log of a character.\")]\n        [Update(UpdatePeriod.Minutes30, UpdatePeriod.Minutes5)]\n        KillLog = 1 << 16,\n\n        /// <summary>\n        /// Allows the fetching of coordinate and name data for items owned by the character.\n        /// </summary>\n        [Parent(CharacterSheet)]\n        Location = 1 << 17,\n\n        /// <summary>\n        /// A character's loyalty point balances.\n        /// </summary>\n        [Header(\"Loyalty Points\")]\n        [Description(\"The Loyalty Point balances of a character.\")]\n        [Update(UpdatePeriod.Hours2, UpdatePeriod.Hours1)]\n        LoyaltyPoints = 1L << 36,\n\n        /// <summary>\n        /// Mail messages for a character.\n        /// </summary>\n        [Header(\"EVE Mail Messages\")]\n        [Description(\"The EVE mails of a character.\")]\n        [Update(UpdatePeriod.Minutes15, UpdatePeriod.Minutes5)]\n        MailMessages = 1 << 18,\n\n        /// <summary>\n        /// The body text of an EVE mail message.\n        /// </summary>\n        MailBodies = 1 << 19,\n\n        /// <summary>\n        /// The character mailing lists. Used to convert mailing list IDs to Names.\n        /// </summary>\n        [Parent(MailMessages)]\n        MailingLists = 1 << 20,\n\n        /// <summary>\n        /// The personal issued market orders of a character.\n        /// </summary>\n        [Header(\"Market Orders\")]\n        [Description(\"The market orders of a character.\")]\n        [Update(UpdatePeriod.Hours1, UpdatePeriod.Minutes15)]\n        MarketOrders = 1 << 21,\n\n        /// <summary>\n        /// The medals of a character.\n        /// </summary>\n        [Header(\"Medals\")]\n        [Description(\"The medals of a character.\")]\n        [Update(UpdatePeriod.Hours6, UpdatePeriod.Hours2)]\n        Medals = 1 << 22,\n\n        /// <summary>\n        /// The EVE notifications of a character.\n        /// </summary>\n        [Header(\"EVE Notifications\")]\n        [Description(\"The EVE notifications of a character.\")]\n        [Update(UpdatePeriod.Minutes15, UpdatePeriod.Minutes15)]\n        Notifications = 1 << 23,\n\n        /// <summary>\n        /// The planetary colony list of a character.\n        /// </summary>\n        [Header(\"Planetary Colonies\")]\n        [Description(\"The planetary colonies owned by a character.\")]\n        [Update(UpdatePeriod.Minutes30, UpdatePeriod.Minutes15)]\n        PlanetaryColonies = 1 << 24,\n\n        /// <summary>\n        /// The planetary colony layout of a character.\n        /// </summary>\n        PlanetaryLayout = 1 << 25,\n\n        /// <summary>\n        /// The research points of a character.\n        /// </summary>\n        [Header(\"Research Points\")]\n        [Description(\"The research points of a character.\")]\n        [Update(UpdatePeriod.Hours2, UpdatePeriod.Hours1)]\n        ResearchPoints = 1 << 26,\n\n        /// <summary>\n        /// The current ship of a character.\n        /// </summary>\n        [Parent(CharacterSheet)]\n        Ship = 1 << 27,\n\n        /// <summary>\n        /// The skill queue of a character.\n        /// </summary>\n        [Header(\"Skill Queue\")]\n        [Description(\"The skill queue of a character.\")]\n        [Update(UpdatePeriod.Minutes15, UpdatePeriod.Minutes5)]\n        SkillQueue = 1 << 28,\n\n        /// <summary>\n        /// The skills of a character.\n        /// </summary>\n        [Parent(CharacterSheet)]\n        Skills = 1 << 29,\n\n        /// <summary>\n        /// A character's standings towards NPC's.\n        /// </summary>\n        [Header(\"NPC Standings\")]\n        [Description(\"The NPC standings of a character.\")]\n        [Update(UpdatePeriod.Hours2, UpdatePeriod.Hours1)]\n        Standings = 1 << 30,\n\n        /// <summary>\n        /// The upcoming calendar events for a character.\n        /// </summary>\n        [Header(\"Calendar Events\")]\n        [Description(\"The upcoming calendar events of a character.\")]\n        [Update(UpdatePeriod.Minutes5, UpdatePeriod.Minutes30)]\n        UpcomingCalendarEvents = 1L << 31,\n\n        /// <summary>\n        /// The upcoming calendar event details for a character.\n        /// </summary>\n        [Header(\"Calendar Event Details\")]\n        [Description(\"Details on the upcoming calendar events of a character.\")]\n        [Update(UpdatePeriod.Minutes5, UpdatePeriod.Minutes30)]\n        UpcomingCalendarEventDetails = 1L << 32,\n\n        /// <summary>\n        /// The wallet journal of a character.\n        /// </summary>\n        [Header(\"Wallet Journal\")]\n        [Description(\"The wallet journal of a character.\")]\n        [Update(UpdatePeriod.Hours1, UpdatePeriod.Hours1)]\n        WalletJournal = 1L << 33,\n\n        /// <summary>\n        /// The wallet transactions of a character.\n        /// </summary>\n        [Header(\"Wallet Transactions\")]\n        [Description(\"The wallet transactions of a character.\")]\n        [Update(UpdatePeriod.Hours1, UpdatePeriod.Hours1)]\n        WalletTransactions = 1L << 34,\n\n        /// <summary>\n        /// The personal issued market order history of a character.\n        /// </summary>\n        [Update(UpdatePeriod.Hours2, UpdatePeriod.Minutes30)]\n        MarketOrdersHistory = 1L << 37,\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CCPAPI/ESIAPICorporationMethods.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.Common.Enumerations.CCPAPI\n{\n    /// <summary>\n    /// Enumeration of the corporation related API methods. Each method has an access mask.\n    /// Each method should have an entry in APIMethodsEnum and\n    /// an equivalent string entry in NetworkConstants indicating the default path of the method.\n    /// </summary>\n    [Flags]\n    public enum ESIAPICorporationMethods : ulong\n    {\n        None = 0,\n\n        /// <summary>\n        /// The corporation issued market orders.\n        /// </summary>\n        [Header(\"Market Orders\")]\n        [Description(\"The corporation market orders of a character.\")]\n        [Update(UpdatePeriod.Hours1, UpdatePeriod.Hours1)]\n        CorporationMarketOrders = 1 << 1,\n\n        /// <summary>\n        /// The corporation issued contracts.\n        /// </summary>\n        [Header(\"Contracts\")]\n        [Description(\"The corporation contracts of a character.\")]\n        [Update(UpdatePeriod.Minutes15, UpdatePeriod.Minutes15)]\n        CorporationContracts = 1 << 2,\n\n        /// <summary>\n        /// The corporation issued industry jobs.\n        /// </summary>\n        [Header(\"Industry Jobs\")]\n        [Description(\"The corporation industry jobs of a character.\")]\n        [Update(UpdatePeriod.Minutes15, UpdatePeriod.Minutes15)]\n        CorporationIndustryJobs = 1 << 3,\n\n        /// <summary>\n        /// A corporation's wallet balances.\n        /// </summary>\n        CorporationAccountBalance = 1 << 4,\n\n        /// <summary>\n        /// Asset list of a corporation.\n        /// </summary>\n        CorporationAssetList = 1 << 5,\n\n        /// <summary>\n        /// A list of corporation contacts.\n        /// </summary>\n        CorporationContactList = 1 << 6,\n\n        /// <summary>\n        /// The log of the corporation's containers.\n        /// </summary>\n        CorporationContainerLog = 1 << 7,\n\n        /// <summary>\n        /// Public corporation info.\n        /// </summary>\n        CorporationSheet = 1 << 8,\n\n        /// <summary>\n        /// Factional warfare statistics for a corporation.\n        /// </summary>\n        CorporationFactionalWarfareStats = 1 << 9,\n\n        /// <summary>\n        /// The Kill log for a corporation (Kill mails).\n        /// </summary>\n        CorporationKillLog = 1 << 10,\n\n        /// <summary>\n        /// List of all medals created by the corporation.\n        /// </summary>\n        [Header(\"Medals\")]\n        [Description(\"The medals created by a corporation.\")]\n        [Update(UpdatePeriod.Hours6, UpdatePeriod.Hours6)]\n        CorporationMedals = 1 << 11,\n\n        /// <summary>\n        /// List of medals awarded to corporation members.\n        /// </summary>\n        CorporationMemberMedals = 1 << 12,\n\n        /// <summary>\n        /// Member roles and titles.\n        /// </summary>\n        CorporationMemberSecurity = 1 << 13,\n\n        /// <summary>\n        /// Member role and title change log.\n        /// </summary>\n        CorporationMemberSecurityLog = 1 << 14,\n\n        /// <summary>\n        /// Corporation member information.\n        /// </summary>\n        CorporationMemberTracking = 1 << 15,\n        \n        /// <summary>\n        /// List of all outposts controlled by the corporation.\n        /// </summary>\n        CorporationOutpostList = 1 << 16,\n\n        /// <summary>\n        /// List of all service settings of corporate outposts.\n        /// </summary>\n        CorporationOutpostServiceDetail = 1 << 17,\n\n        /// <summary>\n        /// Shareholders of the corporation.\n        /// </summary>\n        CorporationShareholders = 1 << 18,\n\n        /// <summary>\n        /// NPC Standings towards corporation.\n        /// </summary>\n        CorporationStandings = 1 << 19,\n\n        /// <summary>\n        /// List of all settings of corporate starbases.\n        /// </summary>\n        CorporationStarbaseDetails = 1 << 20,\n\n        /// <summary>\n        /// List of all corporate starbases.\n        /// </summary>\n        CorporationStarbaseList = 1 << 21,\n\n        /// <summary>\n        /// Titles of corporation and the roles they grant.\n        /// </summary>\n        CorporationTitles = 1 << 22,\n\n        /// <summary>\n        /// Wallet journal for all corporate accounts.\n        /// </summary>\n        CorporationWalletJournal = 1 << 23,\n\n        /// <summary>\n        /// Market transactions of all corporate accounts.\n        /// </summary>\n        CorporationWalletTransactions = 1 << 24,\n        \n        /// <summary>\n        /// List of all corporate bookmarks.\n        /// </summary>\n        CorporationBookmarks = 1 << 25,\n\n        /// <summary>\n        /// List of corporate contract bids.\n        /// </summary>\n        CorporationContractBids = 1 << 26,\n\n        /// <summary>\n        /// List of corporate contract items.\n        /// </summary>\n        CorporationContractItems = 1 << 27,\n\n        /// <summary>\n        /// The corporation issued market order history of a corporation.\n        /// </summary>\n        [Update(UpdatePeriod.Hours2, UpdatePeriod.Hours1)]\n        CorporationMarketOrdersHistory = 1 << 28,\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CCPAPI/ESIAPIGenericMethods.cs",
    "content": "using System.ComponentModel;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.Common.Enumerations.CCPAPI\n{\n    /// <summary>\n    /// Enumeration of the ESI API methods. Those methods do not require a token.\n    /// Each method should have an entry in APIMethodsEnum and\n    /// an equivalent string entry in NetworkConstants indicating the default path of the method.\n    /// </summary>\n    public enum ESIAPIGenericMethods\n    {\n        /// <summary>\n        /// The EVE server status.\n        /// </summary>\n        [Header(\"EVE Server Status\")]\n        [Description(\"The status of the EVE server.\")]\n        [Update(UpdatePeriod.Minutes5, UpdatePeriod.Never, UpdatePeriod.Hours1)]\n        ServerStatus,\n        \n        /// <summary>\n        /// Used to convert IDs to Names.\n        /// </summary>\n        CharacterName,\n\n        /// <summary>\n        /// Used to convert Names to IDs.\n        /// </summary>\n        CharacterID,\n        \n        /// <summary>\n        /// Retrieves information about a conquerable station.\n        /// </summary>\n        StationInfo,\n\n        /// <summary>\n        /// Retrieves information about a citadel.\n        /// </summary>\n        CitadelInfo,\n\n        /// <summary>\n        /// Retrieves information about a planet.\n        /// </summary>\n        PlanetInfo,\n\n        /// <summary>\n        /// List of alliances in EVE.\n        /// </summary>\n        AllianceList,\n        \n        /// <summary>\n        /// Factional warfare statistics for all EVE.\n        /// </summary>\n        EVEFactionalWarfareStats,\n\n        /// <summary>\n        /// Factional warfare top 100 statistics for all EVE.\n        /// </summary>\n        EVEFactionalWarfareTopStats,\n\n        /// <summary>\n        /// List of factions at war.\n        /// </summary>\n        FactionWars,\n\n        /// <summary>\n        /// List of references of typeIDs.\n        /// </summary>\n        RefTypes,\n        \n        /// <summary>\n        /// Used to convert typeIDs to typeNames.\n        /// </summary>\n        TypeName,\n\n        /// <summary>\n        /// List of solar systems taking part in Factional Warfare and their occupancy.\n        /// </summary>\n        FactionalWarfareSystems,\n\n        /// <summary>\n        /// List of solar sytems with jump gates.\n        /// </summary>\n        Jumps,\n\n        /// <summary>\n        /// List of solar systems with kills within the last hour.\n        /// </summary>\n        Kills,\n\n        /// <summary>\n        /// List of solar systems that are controlled by a faction or alliance.\n        /// </summary>\n        Sovereignty,\n\n        /// <summary>\n        /// An individual killmail by hash.\n        /// </summary>\n        KillMail\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CaldariMilitiaRank.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of Caldari Militia ranking.\n    /// </summary>\n    public enum CaldariMilitiaRank\n    {\n        [Description(\"Protectorate Ensign\")]\n        ProtectorateEnsign = 0,\n\n        [Description(\"Second Lieutenant\")]\n        SecondLieutenant = 1,\n\n        [Description(\"First Lieutenant\")]\n        FirstLieutenant = 2,\n\n        [Description(\"Captain\")]\n        Captain = 3,\n\n        [Description(\"Major\")]\n        Major = 4,\n\n        [Description(\"Lieutenant Colonel\")]\n        LieutenantColonel = 5,\n\n        [Description(\"Colonel\")]\n        Colonel = 6,\n\n        [Description(\"Major General\")]\n        MajorGeneral = 7,\n\n        [Description(\"Lieutenant General\")]\n        LieutenantGeneral = 8,\n\n        [Description(\"Brigadier General\")]\n        BrigadierGeneral = 9,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CertificateFilter.cs",
    "content": "﻿using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    public enum CertificateFilter\n    {\n        [Description(\"All\")]\n        All = 0,\n\n        [Description(\"Completed\")]\n        Completed = 1,\n\n        [Description(\"Hide Completed\")]\n        HideMaxLevel = 2,\n\n        [Description(\"Trrainable Next Level\")]\n        NextLevelTrainable = 3,\n\n        [Description(\"Untrainable Next Level\")]\n        NextLevelUntrainable = 4\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CertificateGrade.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents a certificate grade.\n    /// </summary>\n    public enum CertificateGrade\n    {\n        None = 0,\n        Basic = 1,\n        Standard = 2,\n        Improved = 3,\n        Advanced = 4,\n        Elite = 5\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CertificateSort.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    public enum CertificateSort\n    {\n        [Description(\"No Sorting\")]\n        None = 0,\n\n        [Description(\"Time to Next Level\")]\n        TimeToNextLevel = 1,\n\n        [Description(\"Time to Max Level\")]\n        TimeToMaxLevel = 2,\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CertificateStatus.cs",
    "content": "﻿namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents a certificate's status from a character's point of view.\n    /// </summary>\n    public enum CertificateStatus\n    {\n        /// <summary>\n        /// The certificate is trained by the char, all prerequisites are met.\n        /// </summary>\n        Trained,\n\n        /// <summary>\n        /// The certificate is not trained yet but at least one prerequisite is satisfied\n        /// </summary>\n        PartiallyTrained,\n\n        /// <summary>\n        /// The certificate is not trained and none of its prerequisites are satisfied\n        /// </summary>\n        Untrained\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CharacterSaveFormat.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// The available formats for a character exportation.\n    /// </summary>\n    public enum CharacterSaveFormat\n    {\n        None = 0,\n        Text = 1,\n        EFTCHR = 2,\n        HTML = 3,\n        EVEMonXML = 4,\n        CCPXML = 5,\n        PNG = 6,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/CharacterSortCriteria.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of character sort criteria.\n    /// </summary>\n    public enum CharacterSortCriteria\n    {\n        /// <summary>\n        /// Characters are sorted by their names\n        /// </summary>\n        Name = 0,\n\n        /// <summary>\n        /// Characters are sorted by their training completion time or, when not in training, their names.\n        /// </summary>\n        TrainingCompletion = 1,\n    };\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ConnectionStatus.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents the status of the Internet connection.\n    /// </summary>\n    public enum ConnectionStatus\n    {\n        /// <summary>\n        /// Everything normal, we're online\n        /// </summary>\n        Online,\n\n        /// <summary>\n        /// The user requested to stay offline after connection failures\n        /// </summary>\n        Offline,\n\n        /// <summary>\n        /// The connection has not been tested yet\n        /// </summary>\n        Unknown\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ContactGroup.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of contact group.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order.</remarks>\n    public enum ContactGroup\n    {\n        [Description(\"Personal\")]\n        Personal = 0,\n\n        [Description(\"Corporation\")]\n        Corporate = 1,\n\n        [Description(\"Alliance\")]\n        Alliance = 2,\n\n        [Description(\"Agents\")]\n        Agent = 3,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ContactType.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of contact type.\n    /// </summary>\n    public enum ContactType\n    {\n        Character,\n        Corporation,\n        Alliance,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ContractAvailability.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// The contract availability.\n    /// </summary>\n    public enum ContractAvailability\n    {\n        None,\n\n        [Description(\"Public\")]\n        Public,\n\n        [Description(\"Private\")]\n        Private\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ContractState.cs",
    "content": "using EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// The status of a contract.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order.</remarks>\n    public enum ContractState\n    {\n        [Header(\"Assigned contracts\")]\n        Assigned = 0,\n\n        [Header(\"Created contracts\")]\n        Created = 1,\n\n        [Header(\"Canceled contracts\")]\n        Canceled = 2,\n\n        [Header(\"Deleted contracts\")]\n        Deleted = 3,\n\n        [Header(\"Expired contracts\")]\n        Expired = 4,\n\n        [Header(\"Rejected contracts\")]\n        Rejected = 5,\n\n        [Header(\"Finished contracts\")]\n        Finished = 6,\n\n        [Header(\"Failed contracts\")]\n        Failed = 7,\n\n        [Header(\"Unknown contracts\")]\n        Unknown = 8\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ContractType.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// The contract type.\n    /// </summary>\n    public enum ContractType\n    {\n        None,\n\n        [Description(\"Item Exchange\")]\n        ItemExchange,\n\n        [Description(\"Courier\")]\n        Courier,\n\n        [Description(\"Loan\")]\n        Loan,\n\n        [Description(\"Auction\")]\n        Auction\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/DataCompression.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of data compression.\n    /// </summary>\n    public enum DataCompression\n    {\n        None,\n        Gzip,\n        Deflate\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/DescriptiveTextOptions.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Flags options for the text representation format of a skill.\n    /// </summary>\n    [Flags]\n    public enum DescriptiveTextOptions\n    {\n        None = 0,\n        FullText = 1,\n        UppercaseText = 2,\n        SpaceText = 4,\n        IncludeCommas = 8,\n        IncludeZeroes = 16,\n        SpaceBetween = 32,\n        FirstLetterUppercase = 64\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/EveAttribute.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of the attributes in Eve. None is -1, other range from 0 to 4,\n    /// matching the attributes order on the ingame character sheets.\n    /// </summary>\n    public enum EveAttribute\n    {\n        [XmlEnum(\"none\")]\n        None = -1,\n\n        [XmlEnum(\"intelligence\")]\n        Intelligence = 0,\n\n        [XmlEnum(\"perception\")]\n        Perception = 1,\n\n        [XmlEnum(\"charisma\")]\n        Charisma = 2,\n\n        [XmlEnum(\"willpower\")]\n        Willpower = 3,\n\n        [XmlEnum(\"memory\")]\n        Memory = 4\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/EveImageSize.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents the image size of an EVE icon.\n    /// </summary>\n    [Flags]\n    public enum EveImageSize\n    {\n        None = 0,\n        x0 = 1,\n        x16 = 16,\n        x32 = 32,\n        x64 = 64,\n        x128 = 128,\n        x256 = 256\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/EveImageSizeMode.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of EVE image sizemode.\n    /// </summary>\n    public enum EveImageSizeMode\n    {\n        Normal,\n        AutoSize,\n        StretchImage\n    };\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/EveMailState.cs",
    "content": "using EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// The status of an EVE mail message.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order in \"Group by...\".</remarks>\n    public enum EveMailState\n    {\n        [Header(\"Inbox\")]\n        Inbox = 0,\n\n        [Header(\"Sent Items\")]\n        SentItem = 1,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/GallenteMilitiaRank.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of Gallente Militia ranking.\n    /// </summary>\n    public enum GallenteMilitiaRank\n    {\n        [Description(\"Federation Minuteman\")]\n        FederationMinuteman = 0,\n\n        [Description(\"Defender Lieutenant\")]\n        DefenderLieutenant = 1,\n\n        [Description(\"Guardian Lieutenant\")]\n        GuardianLieutenant = 2,\n\n        [Description(\"Lieutenant Sentinel\")]\n        LieutenantSentinel = 3,\n\n        [Description(\"Shield Commander\")]\n        ShieldCommander = 4,\n\n        [Description(\"Aegis Commander\")]\n        AegisCommander = 5,\n\n        [Description(\"Vice Commander\")]\n        ViceCommander = 6,\n\n        [Description(\"Major General\")]\n        MajorGeneral = 7,\n\n        [Description(\"Lieutenant General\")]\n        LieutenantGeneral = 8,\n\n        [Description(\"Luminaire General\")]\n        LuminaireGeneral = 9,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/Gender.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of a character's gender.\n    /// </summary>\n    public enum Gender\n    {\n        Female = 0,\n        Male = 1\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ImplantSlots.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumerations of the implants slots. None is -1, other range from 0 to 4, matching the order of the implants ingame.\n    /// </summary>\n    public enum ImplantSlots\n    {\n        [Description(\"None\")]\n        None = -1,\n\n        [Description(\"Slot  1 (Perception)\")]\n        Perception = 0,\n\n        [Description(\"Slot  2 (Memory)\")]\n        Memory = 1,\n\n        [Description(\"Slot  3 (Willpower)\")]\n        Willpower = 2,\n\n        [Description(\"Slot  4 (Intelligence)\")]\n        Intelligence = 3,\n\n        [Description(\"Slot  5 (Charisma)\")]\n        Charisma = 4,\n\n        [Description(\"Slot  6\")]\n        Slot6 = 5,\n\n        [Description(\"Slot  7\")]\n        Slot7 = 6,\n\n        [Description(\"Slot  8\")]\n        Slot8 = 7,\n\n        [Description(\"Slot  9\")]\n        Slot9 = 8,\n\n        [Description(\"Slot 10\")]\n        Slot10 = 9\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/IssuedFor.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// For which the object was issued.\n    /// </summary>\n    public enum IssuedFor\n    {\n        None,\n        Character,\n        Corporation,\n        Alliance,\n        All\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ItemFamily.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents the type of an item.\n    /// </summary>\n    public enum ItemFamily\n    {\n        Item = 0,\n        Implant = 1,\n        StarbaseStructure = 2,\n        Drone = 3,\n        Ship = 4,\n        Blueprint = 5\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ItemMetaGroup.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents the metagroup of an item.\n    /// </summary>\n    [Flags]\n    public enum ItemMetaGroup\n    {\n        T1 = 2,\n        T2 = 4,\n        T3 = 8,\n        Faction = 16,\n        Officer = 32,\n        Deadspace = 64,\n        Storyline = 128,\n\n        None = 0,\n        AllTechLevel = T1 | T2 | T3,\n        AllNonTechLevel = Faction | Officer | Deadspace | Storyline,\n        All = AllTechLevel | AllNonTechLevel\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ItemSlot.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Flags for the items slots.\n    /// </summary>\n    [Flags]\n    public enum ItemSlot\n    {\n        None = 0,\n        NoSlot = 1,\n        Low = 2,\n        Medium = 4,\n        High = 8,\n\n        All = Low | Medium | High | NoSlot\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/JobState.cs",
    "content": "using EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// The status of a industry job.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order in \"Group by...\".</remarks>\n    public enum JobState\n    {\n        [Header(\"Active jobs\")]\n        Active = 0,\n\n        [Header(\"Delivered jobs\")]\n        Delivered = 1,\n\n        [Header(\"Canceled jobs\")]\n        Canceled = 2,\n\n        [Header(\"Paused jobs\")]\n        Paused = 3,\n\n        [Header(\"Failed jobs\")]\n        Failed = 4\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/KillGroup.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of Kill log group.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order.</remarks>\n    public enum KillGroup\n    {\n        Kills = 0,\n        Losses = 1\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/KillLogFittingContentGroup.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of Kill log fitting and content group.\n    /// </summary>\n    public enum KillLogFittingContentGroup\n    {\n        [Description(\"Unknown\")]\n        None = 0,\n\n        [Description(\"High Power Slots\")]\n        HighSlot = 1,\n\n        [Description(\"Medium Power Slots\")]\n        MediumSlot = 2,\n\n        [Description(\"Low Power Slots\")]\n        LowSlot = 3,\n\n        [Description(\"Subsystem Slots\")]\n        SubsystemSlot = 4,\n\n        [Description(\"Rig Slots\")]\n        RigSlot = 5,\n\n        [Description(\"Drone Bay\")]\n        DroneBay = 6,\n\n        [Description(\"Cargo Bay\")]\n        Cargo = 7,\n\n        [Description(\"Implants\")]\n        Implant = 8,\n\n        [Description(\"Boosters\")]\n        Booster = 9,\n\n        [Description(\"Other\")]\n        Other = 10\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/LearningOptions.cs",
    "content": "using System;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents the options one can use with <see cref=\"CharacterScratchpad.SetSkillLevel\"/>. Those are only optimizations.\n    /// </summary>\n    [Flags]\n    public enum LearningOptions\n    {\n        /// <summary>\n        /// None, regular learning.\n        /// </summary>\n        None = 0,\n\n        /// <summary>\n        /// Do not update the total SP count.\n        /// </summary>\n        FreezeSP = 1,\n\n        /// <summary>\n        /// Do not update the training time and the trained skills enumeration.\n        /// </summary>\n        IgnoreTraining = 2,\n\n        /// <summary>\n        /// Assume the prerequisites are already known.\n        /// </summary>\n        IgnorePrereqs = 4,\n\n        /// <summary>\n        /// Ignore the changes when the given target level is lower than the current one\n        /// </summary>\n        UpgradeOnly = 8\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/LoadoutFormat.cs",
    "content": "﻿namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents an enumeration of loadout formats.\n    /// </summary>\n    public enum LoadoutFormat\n    {\n        None,\n        EFT,\n        XML,\n        DNA,\n        CLF\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/MasteryStatus.cs",
    "content": "﻿namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents a mastery's status from a character's point of view.\n    /// </summary>\n    public enum MasteryStatus\n    {\n        /// <summary>\n        /// The mastery is trained by the char, all prerequisites are met.\n        /// </summary>\n        Trained,\n\n        /// <summary>\n        /// The mastery is not trained yet but at least one prerequisite is satisfied\n        /// </summary>\n        PartiallyTrained,\n\n        /// <summary>\n        /// The mastery is not trained and none of its prerequisites are satisfied\n        /// </summary>\n        Untrained\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/MedalGroup.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of medal group.\n    /// </summary>\n    public enum MedalGroup\n    {\n        [Description(\"Corporation\")]\n        Corporation,\n\n        [Description(\"Current Corporation\")]\n        CurrentCorporation,\n\n        [Description(\"Other Corporation\")]\n        OtherCorporation,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/MinmatarMilitiaRank.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of Minmatar Militia ranking.\n    /// </summary>\n    public enum MinmatarMilitiaRank\n    {\n        [Description(\"Nation Warrior\")]\n        NationWarrior = 0,\n\n        [Description(\"Spike Lieutenant\")]\n        SpikeLieutenant = 1,\n\n        [Description(\"Spear Lieutenant\")]\n        SpearLieutenant = 2,\n\n        [Description(\"Venge Captain\")]\n        VengeCaptain = 3,\n\n        [Description(\"Lance Commander\")]\n        LanceCommander = 4,\n\n        [Description(\"Blade Commander\")]\n        BladeCommander = 5,\n\n        [Description(\"Talon Commander\")]\n        TalonCommander = 6,\n\n        [Description(\"Voshud Major\")]\n        VoshudMajor = 7,\n\n        [Description(\"Matar Colonel\")]\n        MatarGeneral = 8,\n\n        [Description(\"Valklear General\")]\n        ValklearGeneral = 9,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ObjectActivityFilter.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of blueprint browser activity filter.\n    /// </summary>\n    public enum ObjectActivityFilter\n    {\n        Any = 0,\n        All = 1,\n        Manufacturing = 2,\n        Copying = 3,\n        ResearchingMaterialEfficiency = 4,\n        ResearchingTimeEfficiency = 5,\n        Invention = 6\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ObjectUsabilityFilter.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of browser usability filter.\n    /// </summary>\n    public enum ObjectUsabilityFilter\n    {\n        All = 0,\n        Usable = 1,\n        Unusable = 2\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ObsoleteRemovalPolicy.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// The policy to apply when removing obsolete entries from a plan.\n    /// </summary>\n    public enum ObsoleteRemovalPolicy\n    {\n        None = 0,\n        RemoveAll = 1,\n        ConfirmedOnly = 2\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/OrderState.cs",
    "content": "using EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// The status of a market order.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order.</remarks>\n    public enum OrderState\n    {\n        [Header(\"Active orders\")]\n        Active = 0,\n\n        [Header(\"Canceled orders\")]\n        Canceled = 1,\n\n        [Header(\"Expired orders\")]\n        Expired = 2,\n\n        [Header(\"Fulfilled orders\")]\n        Fulfilled = 3,\n\n        [Header(\"Modified orders\")]\n        Modified = 4\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/PathSearchCriteria.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of path between solar systems search criteria.\n    /// </summary>\n    public enum PathSearchCriteria\n    {\n        FewerJumps,\n        ShortestDistance\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/PlanChange.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Describes the kind of changes which occurred.\n    /// </summary>\n    [Flags]\n    public enum PlanChange\n    {\n        None = 0,\n        Notification = 1,\n        Prerequisites = 2,\n        All = Notification | Prerequisites\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/PlanEntrySort.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents a plan entry sort.\n    /// </summary>\n    public enum PlanEntrySort\n    {\n        None,\n        Cost,\n        Rank,\n        Name,\n        Priority,\n        PlanGroup,\n        SPPerHour,\n        TrainingTime,\n        TrainingTimeNatural,\n        PrimaryAttribute,\n        SecondaryAttribute,\n        SkillGroupDuration,\n        PercentCompleted,\n        TimeDifference,\n        PlanType,\n        Notes,\n        SkillPointsRequired,\n        OmegaRequired\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/PlanEntryType.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Describes whether this entry is a prerequisite of another entry.\n    /// </summary>\n    public enum PlanEntryType\n    {\n        /// <summary>\n        /// This entry is a top-level one, no entries depend on it.\n        /// </summary>\n        Planned,\n\n        /// <summary>\n        /// This entry is required by another entry\n        /// </summary>\n        Prerequisite\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/PlanFormat.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of a plan exportation format.\n    /// </summary>\n    public enum PlanFormat\n    {\n        None = 0,\n        Emp = 1,\n        Xml = 2,\n        Text = 3\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/PlanOperations.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents the type of a plan operation.\n    /// </summary>\n    public enum PlanOperations\n    {\n        /// <summary>\n        /// None, there is nothing to do.\n        /// </summary>\n        None,\n\n        /// <summary>\n        /// The operation is an addition.\n        /// </summary>\n        Addition,\n\n        /// <summary>\n        /// The operation is a suppression.\n        /// </summary>\n        Suppression\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/PlanSort.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of a plan sort.\n    /// </summary>\n    public enum PlanSort\n    {\n        Name = 0,\n        Time = 1,\n        SkillsCount = 2,\n        Description = 3\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/PlanetaryPinState.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// The status of a planetary pin.\n    /// </summary>\n    public enum PlanetaryPinState\n    {\n        None,\n\n        [Description(\"Extracting\")]\n        Extracting,\n\n        [Description(\"In production\")]\n        Producing,\n\n        [Description(\"Idle\")]\n        Idle\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/QueryStatus.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    public enum QueryStatus\n    {\n        /// <summary>\n        /// The query will be updated on due time.\n        /// </summary>\n        [Description(\"Pending...\")]\n        Pending,\n\n        /// <summary>\n        /// The query is being updated.\n        /// </summary>\n        [Description(\"Updating...\")]\n        Updating,\n\n        /// <summary>\n        /// The query is disabled.\n        /// </summary>\n        [Description(\"Disabled.\")]\n        Disabled,\n\n        /// <summary>\n        /// There is no network connection.\n        /// </summary>\n        [Description(\"No TCP/IP connection.\")]\n        NoNetwork,\n\n        /// <summary>\n        /// The character is not on any API key.\n        /// </summary>\n        [Description(\"No associated API key.\")]\n        NoESIKey,\n\n        /// <summary>\n        /// The API key has no access to query the call.\n        /// </summary>\n        [Description(\"No access via the API key.\")]\n        NoAccess\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/Race.cs",
    "content": "using System;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Flags for the races.\n    /// </summary>\n    [Flags]\n    public enum Race\n    {\n        [XmlEnum(\"Caldari\")]\n        Caldari = 1,\n\n        [XmlEnum(\"Minmatar\")]\n        Minmatar = 2,\n\n        [XmlEnum(\"Amarr\")]\n        Amarr = 4,\n\n        [XmlEnum(\"Gallente\")]\n        Gallente = 8,\n\n        [XmlEnum(\"Jove\")]\n        Jove = 16,\n\n        [XmlEnum(\"Faction\")]\n        Faction = 32,\n\n        [XmlEnum(\"Sleepers\")]\n        Sleepers = 64,\n\n        [XmlEnum(\"ORE\")]\n        Ore = 128,\n\n        None = 0,\n        All = Amarr | Minmatar | Caldari | Gallente | Jove | Faction | Sleepers | Ore\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/RemappingPointStatus.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Describes whether it has already been computed or not.\n    /// </summary>\n    public enum RemappingPointStatus\n    {\n        NotComputed,\n        UpToDate\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ServerStatus.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents a server status.\n    /// </summary>\n    public enum ServerStatus\n    {\n        /// <summary>\n        /// The server is offline\n        /// </summary>\n        Offline,\n\n        /// <summary>\n        /// The server is online\n        /// </summary>\n        Online,\n\n        /// <summary>\n        /// The API couldn't be queried or has not been queried yet.\n        /// </summary>\n        Unknown,\n\n        /// <summary>\n        /// The server's status checks have been disabled.\n        /// </summary>\n        CheckDisabled\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/SkillFilter.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of skill browser filter.\n    /// </summary>\n    public enum SkillFilter\n    {\n        [Description(\"All\")]\n        All = 0,\n\n        [Description(\"By Attributes\")]\n        ByAttributes = 1,\n\n        [Description(\"Hide Completed\")]\n        NoLv5 = 2,\n\n        [Description(\"Known\")]\n        Known = 3,\n\n        [Description(\"Level I Ready\")]\n        Lv1Ready = 4,\n\n        [Description(\"Not Known\")]\n        Unknown = 5,\n\n        [Description(\"Not Known - Owned\")]\n        UnknownButOwned = 6,\n\n        [Description(\"Not Known - Trainable\")]\n        UnknownButTrainable = 7,\n\n        [Description(\"Not Known - Unowned\")]\n        UnknownAndNotOwned = 8,\n\n        [Description(\"Not Known - Untrainable\")]\n        UnknownAndNotTrainable = 9,\n\n        [Description(\"Not Planned\")]\n        NotPlanned = 10,\n\n        [Description(\"Not Planned - Trainable\")]\n        NotPlannedButTrainable = 11,\n\n        [Description(\"Partially Trained\")]\n        PartiallyTrained = 12,\n\n        [Description(\"Planned\")]\n        Planned = 13,\n\n        [Description(\"Trainable (All)\")]\n        Trainable = 14,\n\n        [Description(\"Trainable on alpha account\")]\n        AlphaFriendly = 15\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/SkillSort.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of skill browser sorter.\n    /// </summary>\n    public enum SkillSort\n    {\n        [Description(\"No Sorting\")]\n        None = 0,\n\n        [Description(\"Time to Next Level\")]\n        TimeToNextLevel = 1,\n\n        [Description(\"Time to Max Level\")]\n        TimeToLevel5 = 2,\n\n        [Description(\"Skill Rank\")]\n        Rank = 3,\n\n        [Description(\"Skill Points per Hour\")]\n        SPPerHour = 4\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/SortOrder.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of sort order.\n    /// </summary>\n    public enum SortOrder\n    {\n        Ascending = 0,\n        Descending = 1\n    };\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/StandingGroup.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of standing group.\n    /// </summary>\n    public enum StandingGroup\n    {\n        [Description(\"Agents\")]\n        Agents,\n\n        [Description(\"NPC Corporations\")]\n        NPCCorporations,\n\n        [Description(\"Factions\")]\n        Factions\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/StandingStatus.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of a standing status.\n    /// </summary>\n    public enum StandingStatus\n    {\n        Excellent,\n        Good,\n        Neutral,\n        Bad,\n        Terrible\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/ThrobberState.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of the throbber state.\n    /// </summary>\n    public enum ThrobberState\n    {\n        Stopped,\n        Rotating,\n        Strobing\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/TrainingOrigin.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Represents how much current SP and levels are taken into account for a training time computation.\n    /// </summary>\n    public enum TrainingOrigin\n    {\n        /// <summary>\n        /// The training starts at level 0 with no SP.\n        /// </summary>\n        FromScratch,\n\n        /// <summary>\n        /// The training starts at the end of the previous level, the skill not being partially trained.\n        /// </summary>\n        FromPreviousLevel,\n\n        /// <summary>\n        /// The training starts from the current SP, including the ones for the partially trained level.\n        /// </summary>\n        FromCurrent,\n\n        /// <summary>\n        /// The training starts at the end of the previous level, or current if this level is already partially trained\n        /// </summary>\n        FromPreviousLevelOrCurrent\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/TransactionType.cs",
    "content": "namespace EVEMon.Common.Enumerations\n{\n    /// <summary>\n    /// Enumeration of a transaction type.\n    /// </summary>\n    public enum TransactionType\n    {\n        Buy,\n        Sell\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/AssetGrouping.cs",
    "content": "using EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Enumeration for the assets to be group by.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order.</remarks>\n    public enum AssetGrouping\n    {\n        [Header(\"No group\")]\n        None = 0,\n\n        [Header(\"Group by group\")]\n        Group = 1,\n\n        [Header(\"Group by group (Desc)\")]\n        GroupDesc = 2,\n\n        [Header(\"Group by category\")]\n        Category = 3,\n\n        [Header(\"Group by category (Desc)\")]\n        CategoryDesc = 4,\n\n        [Header(\"Group by container\")]\n        Container = 5,\n\n        [Header(\"Group by container (Desc)\")]\n        ContainerDesc = 6,\n\n        [Header(\"Group by location\")]\n        Location = 7,\n\n        [Header(\"Group by location (Desc)\")]\n        LocationDesc = 8,\n\n        [Header(\"Group by region\")]\n        Region = 9,\n\n        [Header(\"Group by region (Desc)\")]\n        RegionDesc = 10,\n\n        [Header(\"Group by jumps\")]\n        Jumps = 11,\n\n        [Header(\"Group by jumps (Desc)\")]\n        JumpsDesc = 12\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/CalendarProvider.cs",
    "content": "namespace EVEMon.Common.Enumerations.UISettings\n{\n    public enum CalendarProvider\n    {\n        Google,\n        Outlook\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/CloseBehaviour.cs",
    "content": "namespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Represents the behaviour when closing the main form\n    /// </summary>\n    public enum CloseBehaviour\n    {\n        /// <summary>\n        /// Exit the application\n        /// </summary>\n        Exit = 0,\n\n        /// <summary>\n        /// Minimize to the system tray\n        /// </summary>\n        MinimizeToTray = 1,\n\n        /// <summary>\n        /// Minimize to the task bar\n        /// </summary>\n        MinimizeToTaskbar = 2\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/CompatibilityMode.cs",
    "content": "﻿namespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Describes the target platform to allow EVEMon to apply different tweaks at runtime\n    /// </summary>\n    public enum CompatibilityMode\n    {\n        /// <summary>\n        /// Windows and Linux + Wine\n        /// </summary>\n        Default = 0,\n\n        /// <summary>\n        /// Wine\n        /// </summary>\n        Wine = 1\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/ContractGrouping.cs",
    "content": "using EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Enumeration for the contracts to be group by.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order.</remarks>\n    public enum ContractGrouping\n    {\n        [Header(\"Group by contract state\")]\n        State = 0,\n\n        [Header(\"Group by contract state (Desc)\")]\n        StateDesc = 1,\n\n        [Header(\"Group by contract type\")]\n        ContractType = 2,\n\n        [Header(\"Group by contract type (Desc)\")]\n        ContractTypeDesc = 3,\n\n        [Header(\"Group by issue day\")]\n        Issued = 4,\n\n        [Header(\"Group by issue day (Desc)\")]\n        IssuedDesc = 5,\n\n        [Header(\"Group by starting station\")]\n        StartLocation = 6,\n\n        [Header(\"Group by starting station (Desc)\")]\n        StartLocationDesc = 7\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/EVEMailMessagesGrouping.cs",
    "content": "using EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Enumeration for the EVE mail messages to be group by.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order.</remarks>\n    public enum EVEMailMessagesGrouping\n    {\n        [Header(\"Group by mail state\")]\n        State = 0,\n\n        [Header(\"Group by mail state (Desc)\")]\n        StateDesc = 1,\n\n        [Header(\"Group by received date\")]\n        SentDate = 2,\n\n        [Header(\"Group by received date (Desc)\")]\n        SentDateDesc = 3,\n\n        [Header(\"Group by sender\")]\n        Sender = 4,\n\n        [Header(\"Group by sender (Desc)\")]\n        SenderDesc = 5,\n\n        [Header(\"Group by subject\")]\n        Subject = 6,\n\n        [Header(\"Group by subject (Desc)\")]\n        SubjectDesc = 7,\n\n        [Header(\"Group by recipient\")]\n        Recipient = 8,\n\n        [Header(\"Group by recipient (Desc)\")]\n        RecipientDesc = 9,\n\n        [Header(\"Group by Corp or Alliance\")]\n        CorpOrAlliance = 10,\n\n        [Header(\"Group by Corp or Alliance (Desc)\")]\n        CorpOrAllianceDesc = 11,\n\n        [Header(\"Group by mailing list\")]\n        MailingList = 12,\n\n        [Header(\"Group by mailing list (Desc)\")]\n        MailingListDesc = 13\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/EVENotificationsGrouping.cs",
    "content": "using EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Enumeration for the EVE notifications to be group by.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order.</remarks>\n    public enum EVENotificationsGrouping\n    {\n        [Header(\"Group by type\")]\n        Type = 0,\n\n        [Header(\"Group by type (Desc)\")]\n        TypeDesc = 1,\n\n        [Header(\"Group by received date\")]\n        SentDate = 2,\n\n        [Header(\"Group by received date (Desc)\")]\n        SentDateDesc = 3,\n\n        [Header(\"Group by sender\")]\n        Sender = 4,\n\n        [Header(\"Group by sender (Desc)\")]\n        SenderDesc = 5,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/GoogleCalendarReminder.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations.UISettings\n{\n    public enum GoogleCalendarReminder\n    {\n        [Description(\"Email\")]\n        Email,\n\n        [Description(\"Pop-up\")]\n        PopUp,\n\n        [Description(\"SMS\")]\n        Sms,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/IndustryJobGrouping.cs",
    "content": "using EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Enumeration for the industry jobs to be group by.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order.</remarks>\n    public enum IndustryJobGrouping\n    {\n        [Header(\"Group by job state\")]\n        State = 0,\n\n        [Header(\"Group by job state (Desc)\")]\n        StateDesc = 1,\n\n        [Header(\"Group by ending date\")]\n        EndDate = 2,\n\n        [Header(\"Group by ending date (Desc)\")]\n        EndDateDesc = 3,\n\n        [Header(\"Group by installed blueprint type\")]\n        InstalledItemType = 4,\n\n        [Header(\"Group by installed blueprint type (Desc)\")]\n        InstalledItemTypeDesc = 5,\n\n        [Header(\"Group by output item type\")]\n        OutputItemType = 6,\n\n        [Header(\"Group by output item type (Desc)\")]\n        OutputItemTypeDesc = 7,\n\n        [Header(\"Group by job activity\")]\n        Activity = 8,\n\n        [Header(\"Group by job activity (Desc)\")]\n        ActivityDesc = 9,\n\n        [Header(\"Group by installed location\")]\n        Location = 10,\n\n        [Header(\"Group by installed location (Desc)\")]\n        LocationDesc = 11\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/MainWindowTitleFormat.cs",
    "content": "namespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Represents what is displayed in the main window title.\n    /// </summary>\n    public enum MainWindowTitleFormat\n    {\n        Default = 0,\n        NextCharToFinish = 1,\n        SelectedChar = 2,\n        AllCharacters = 3,\n        AllCharactersButSelectedOneAhead = 4\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/MarketOrderGrouping.cs",
    "content": "using EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Enumeration for the market orders to be group by.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order.</remarks>\n    public enum MarketOrderGrouping\n    {\n        [Header(\"Group by order status\")]\n        State = 0,\n\n        [Header(\"Group by order status (Desc)\")]\n        StateDesc = 1,\n\n        [Header(\"Group by buying/selling\")]\n        OrderType = 2,\n\n        [Header(\"Group by buying/selling (Desc)\")]\n        OrderTypeDesc = 3,\n\n        [Header(\"Group by issue day\")]\n        Issued = 4,\n\n        [Header(\"Group by issue day (Desc)\")]\n        IssuedDesc = 5,\n\n        [Header(\"Group by item type\")]\n        ItemType = 6,\n\n        [Header(\"Group by item type (Desc)\")]\n        ItemTypeDesc = 7,\n\n        [Header(\"Group by station\")]\n        Location = 8,\n\n        [Header(\"Group by station (Desc)\")]\n        LocationDesc = 9\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/MarkupType.cs",
    "content": "namespace EVEMon.Common.Enumerations.UISettings\n{\n    public enum MarkupType\n    {\n        Undefined,\n        None,\n        Forum,\n        Html\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/ObsoleteEntryRemovalBehaviour.cs",
    "content": "namespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Describes the behaviour employed to remove Obsolete Entries from plans.\n    /// </summary>\n    public enum ObsoleteEntryRemovalBehaviour\n    {\n        /// <summary>\n        /// Never remove entries from the plan, always ask the user.\n        /// </summary>\n        AlwaysAsk = 0,\n\n        /// <summary>\n        /// Only remove confirmed completed (by API) entries from the plan, ask about unconfirmed entries.\n        /// </summary>\n        RemoveConfirmed = 1,\n\n        /// <summary>\n        /// Always remove all entries automatically.\n        /// </summary>\n        RemoveAll = 2\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/PlanetaryGrouping.cs",
    "content": "using EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Enumeration for the planetary colonies to be group by.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order.</remarks>\n    public enum PlanetaryGrouping\n    {\n        [Header(\"No group\")]\n        None = 0,\n\n        [Header(\"Group by colony\")]\n        Colony = 1,\n\n        [Header(\"Group by colony (Desc)\")]\n        ColonyDesc = 2,\n\n        [Header(\"Group by solar system\")]\n        SolarSystem = 3,\n\n        [Header(\"Group by solar system (Desc)\")]\n        SolarSystemDesc = 4,\n\n        [Header(\"Group by planet type\")]\n        PlanetType = 5,\n\n        [Header(\"Group by planet type (Desc)\")]\n        PlanetTypeDesc = 6,\n\n        [Header(\"Group by ending date\")]\n        EndDate = 7,\n\n        [Header(\"Group by ending date (Desc)\")]\n        EndDateDesc = 8,\n\n        [Header(\"Group by type group\")]\n        GroupName = 9,\n\n        [Header(\"Group by type group (Desc)\")]\n        GroupNameDesc = 10,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/PortraitSizes.cs",
    "content": "using System.ComponentModel;\n\nnamespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Enumeration of portrait sizes\n    /// </summary>\n    public enum PortraitSizes\n    {\n        [DefaultValue(16)]\n        x16 = 0,\n\n        [DefaultValue(24)]\n        x24 = 1,\n\n        [DefaultValue(32)]\n        x32 = 2,\n\n        [DefaultValue(48)]\n        x48 = 3,\n\n        [DefaultValue(64)]\n        x64 = 4,\n\n        [DefaultValue(80)]\n        x80 = 5,\n\n        [DefaultValue(96)]\n        x96 = 6\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/ReadingPanePositioning.cs",
    "content": "namespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Enumeration for the reading pane position of the EVE mail bodies.\n    /// </summary>\n    public enum ReadingPanePositioning\n    {\n        /// <summary>\n        /// No reading pane\n        /// </summary>\n        Off = 0,\n\n        /// <summary>\n        /// Position the reading pane positioning at the bottom\n        /// </summary>\n        Bottom = 1,\n\n        /// <summary>\n        /// Position the reading pane positioning at the right\n        /// </summary>\n        Right = 2,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/SystemTrayBehaviour.cs",
    "content": "namespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Represents the behaviour for the system tray icon\n    /// </summary>\n    public enum SystemTrayBehaviour\n    {\n        /// <summary>\n        /// The tray icon is always hidden\n        /// </summary>\n        Disabled = 0,\n\n        /// <summary>\n        /// The tray icon is visible when the main window is minimized\n        /// </summary>\n        ShowWhenMinimized = 1,\n\n        /// <summary>\n        /// The tray icon is always visible\n        /// </summary>\n        AlwaysVisible = 2\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/ThreeStateSortOrder.cs",
    "content": "namespace EVEMon.Common.Enumerations.UISettings\n{\n    public enum ThreeStateSortOrder\n    {\n        None = 0,\n        Ascending = 1,\n        Descending = 2\n    };\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/TrayPopupGrouping.cs",
    "content": "namespace EVEMon.Common.Enumerations.UISettings\n{\n    public enum TrayPopupGrouping\n    {\n        None = 0,\n        TrainingAtTop = 1,\n        TrainingAtBottom = 2,\n        Account = 3\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/TrayPopupSort.cs",
    "content": "namespace EVEMon.Common.Enumerations.UISettings\n{\n    public enum TrayPopupSort\n    {\n        TrainingCompletionTimeDESC = 0,\n        TrainingCompletionTimeASC = 1,\n        NameASC = 2,\n        NameDESC = 3\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/TrayPopupStyles.cs",
    "content": "namespace EVEMon.Common.Enumerations.UISettings\n{\n    public enum TrayPopupStyles\n    {\n        PopupForm = 0,\n        WindowsTooltip = 1,\n        Disabled = 2\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/UpdatePeriod.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations.UISettings\n{\n    [XmlRoot(\"period\")]\n    public enum UpdatePeriod\n    {\n        [Header(\"Never\")]\n        Never,\n\n        [Header(\"5 Minutes\")]\n        Minutes5,\n\n        [Header(\"15 Minutes\")]\n        Minutes15,\n\n        [Header(\"30 Minutes\")]\n        Minutes30,\n\n        [Header(\"1 Hour\")]\n        Hours1,\n\n        [Header(\"2 Hours\")]\n        Hours2,\n\n        [Header(\"3 Hours\")]\n        Hours3,\n\n        [Header(\"6 Hours\")]\n        Hours6,\n\n        [Header(\"12 Hours\")]\n        Hours12,\n\n        [Header(\"Day\")]\n        Day,\n\n        [Header(\"Week\")]\n        Week\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/WalletJournalGrouping.cs",
    "content": "using EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Enumeration for the wallet journal to be group by.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order.</remarks>\n    public enum WalletJournalGrouping\n    {\n        [Header(\"No group\")]\n        None = 0,\n\n        [Header(\"Group by date\")]\n        Date = 1,\n\n        [Header(\"Group by date (Desc)\")]\n        DateDesc = 2,\n\n        [Header(\"Group by type\")]\n        Type = 3,\n\n        [Header(\"Group by type (Desc)\")]\n        TypeDesc = 4,\n\n        [Header(\"Group by issuer\")]\n        Issuer = 5,\n\n        [Header(\"Group by issuer (Desc)\")]\n        IssuerDesc = 6,\n\n        [Header(\"Group by recipient\")]\n        Recipient = 7,\n\n        [Header(\"Group by recipient (Desc)\")]\n        RecipientDesc = 8\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Enumerations/UISettings/WalletTransactionGrouping.cs",
    "content": "using EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Enumerations.UISettings\n{\n    /// <summary>\n    /// Enumeration for the wallet transactions to be group by.\n    /// </summary>\n    /// <remarks>The integer value determines the sort order.</remarks>\n    public enum WalletTransactionGrouping\n    {\n        [Header(\"No group\")]\n        None = 0,\n\n        [Header(\"Group by date\")]\n        Date = 1,\n\n        [Header(\"Group by date (Desc)\")]\n        DateDesc = 2,\n\n        [Header(\"Group by item type\")]\n        ItemType = 3,\n\n        [Header(\"Group by item type (Desc)\")]\n        ItemTypeDesc = 4,\n\n        [Header(\"Group by client\")]\n        Client = 5,\n\n        [Header(\"Group by client (Desc)\")]\n        ClientDesc = 6,\n\n        [Header(\"Group by station\")]\n        Location = 7,\n\n        [Header(\"Group by station (Desc)\")]\n        LocationDesc = 8\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/EveMonClient.Events.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Notifications;\nusing EVEMon.Common.Serialization.PatchXml;\n\nnamespace EVEMon.Common\n{\n    public static partial class EveMonClient\n    {\n        #region Events firing\n\n        /// <summary>\n        /// Occurs every second.\n        /// </summary>\n        public static event EventHandler TimerTick;\n\n        /// <summary>\n        /// Occurs when the scheduler entries changed.\n        /// </summary>\n        public static event EventHandler SchedulerChanged;\n\n        /// <summary>\n        /// Occurs when the settings changed.\n        /// </summary>\n        public static event EventHandler SettingsChanged;\n\n        /// <summary>\n        /// Occurs when the collection of ESI Keys changed.\n        /// </summary>\n        public static event EventHandler ESIKeyCollectionChanged;\n\n        /// <summary>\n        /// Occurs when the ESI Keys monitored state changed.\n        /// </summary>\n        public static event EventHandler ESIKeyMonitoredChanged;\n\n        /// <summary>\n        /// Occurs when the collection of characters changed.\n        /// </summary>\n        public static event EventHandler CharacterCollectionChanged;\n\n        /// <summary>\n        /// Occurs when a character's label is changed.\n        /// </summary>\n        public static event EventHandler<LabelChangedEventArgs> CharacterLabelChanged;\n\n        /// <summary>\n        /// Occurs when the collection of monitored characters changed.\n        /// </summary>\n        public static event EventHandler MonitoredCharacterCollectionChanged;\n\n        /// <summary>\n        /// Occurs when the collection of a character implant set changed.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterImplantSetCollectionChanged;\n        \n        /// <summary>\n        /// Occurs when an account status has been updated.\n        /// </summary>\n        public static event EventHandler AccountStatusUpdated;\n\n        /// <summary>\n        /// Occurs when the conquerable station list has been updated.\n        /// </summary>\n        public static event EventHandler ConquerableStationListUpdated;\n\n        /// <summary>\n        /// Occurs when the EVE factional warfare statistics has been updated.\n        /// </summary>\n        public static event EventHandler EveFactionalWarfareStatsUpdated;\n\n        /// <summary>\n        /// Occurs when the ESI key info have been updated.\n        /// </summary>\n        public static event EventHandler ESIKeyInfoUpdated;\n\n        /// <summary>\n        /// Occurs when the EveIDToName list has been updated.\n        /// </summary>\n        public static event EventHandler EveIDToNameUpdated;\n\n        /// <summary>\n        /// Occurs when the RefTypes list has been updated.\n        /// </summary>\n        public static event EventHandler RefTypesUpdated;\n\n        /// <summary>\n        /// Occurs when the NotificationRefTypes list has been updated.\n        /// </summary>\n        public static event EventHandler NotificationRefTypesUpdated;\n\n        /// <summary>\n        /// Occurs when the EveFlags list has been updated.\n        /// </summary>\n        public static event EventHandler EveFlagsUpdated;\n\n        /// <summary>\n        /// Occurs when the list of characters in an ESI key has been updated.\n        /// </summary>\n        public static event EventHandler<ESIKeyInfoChangedEventArgs> CharacterListUpdated;\n\n        /// <summary>\n        /// Occurs when one or many queued skills have been completed.\n        /// </summary>\n        public static event EventHandler<QueuedSkillsEventArgs> QueuedSkillsCompleted;\n\n        /// <summary>\n        /// Occurs when one of the character's collection of plans changed.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterPlanCollectionChanged;\n\n        /// <summary>\n        /// Occurs when a character's potrait has been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterPortraitUpdated;\n\n        /// <summary>\n        /// Occurs when a character sheet has been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterUpdated;\n\n        /// <summary>\n        /// Occurs when a character info has been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterInfoUpdated;\n        \n        /// <summary>\n        /// Occurs when a character skill queue has been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterSkillQueueUpdated;\n\n        /// <summary>\n        /// Occurs when a character standings have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterStandingsUpdated;\n\n        /// <summary>\n        /// Occurs when a character factional warfare stats have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterFactionalWarfareStatsUpdated;\n\n        /// <summary>\n        /// Occurs when a character assets have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterAssetsUpdated;\n\n        /// <summary>\n        /// Occurs when both personal and corporation market orders of a character have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> MarketOrdersUpdated;\n\n        /// <summary>\n        /// Occurs when personal market orders of a character have been updated.\n        /// </summary>\n        public static event EventHandler<MarketOrdersEventArgs> CharacterMarketOrdersUpdated;\n\n        /// <summary>\n        /// Occurs when corporation market orders of a character have been updated.\n        /// </summary>\n        public static event EventHandler<MarketOrdersEventArgs> CorporationMarketOrdersUpdated;\n\n        /// <summary>\n        /// Occurs when both personal and corporation contracts of a character have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> ContractsUpdated;\n\n        /// <summary>\n        /// Occurs when personal contracts of a character have been updated.\n        /// </summary>\n        public static event EventHandler<ContractsEventArgs> CharacterContractsUpdated;\n\n        /// <summary>\n        /// Occurs when corporation contracts of a character have been updated.\n        /// </summary>\n        public static event EventHandler<ContractsEventArgs> CorporationContractsUpdated;\n\n        /// <summary>\n        /// Occurs when personal contract bids of a character have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterContractBidsDownloaded;\n\n        /// <summary>\n        /// Occurs when corporation contract bids of a character have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CorporationContractBidsDownloaded;\n\n        /// <summary>\n        /// Occurs when items list of a character's contract have been downloaded.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterContractItemsDownloaded;\n\n        /// <summary>\n        /// Occurs when items list of a corporation's contract have been downloaded.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CorporationContractItemsDownloaded;\n\n        /// <summary>\n        /// Occurs when a character wallet journal have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterWalletJournalUpdated;\n\n        /// <summary>\n        /// Occurs when a character walet transactions have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterWalletTransactionsUpdated;\n\n        /// <summary>\n        /// Occurs when industry jobs of a character have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> IndustryJobsUpdated;\n\n        /// <summary>\n        /// Occurs when industry jobs of a character have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterIndustryJobsUpdated;\n\n        /// <summary>\n        /// Occurs when industry jobs of a character have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CorporationIndustryJobsUpdated;\n\n        /// <summary>\n        /// Occurs when the industry jobs of a character have been completed.\n        /// </summary>\n        public static event EventHandler<IndustryJobsEventArgs> CharacterIndustryJobsCompleted;\n\n        /// <summary>\n        /// Occurs when the industry jobs of a character have been completed.\n        /// </summary>\n        public static event EventHandler<IndustryJobsEventArgs> CorporationIndustryJobsCompleted;\n\n        /// <summary>\n        /// Occurs when the planetary pins of a character have been completed.\n        /// </summary>\n        public static event EventHandler<PlanetaryPinsEventArgs> CharacterPlaneteryPinsCompleted;\n\n        /// <summary>\n        /// Occurs when the research points of a character have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterResearchPointsUpdated;\n\n        /// <summary>\n        /// Occurs when the mail messages of a character have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterEVEMailMessagesUpdated;\n\n        /// <summary>\n        /// Occurs when the mailing list of a character have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterEVEMailingListsUpdated;\n\n        /// <summary>\n        /// Occurs when the body of a character EVE mail message has been downloaded.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterEVEMailBodyDownloaded;\n\n        /// <summary>\n        /// Occurs when the notifications of a character have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterEVENotificationsUpdated;\n        \n        /// <summary>\n        /// Occurs when the text of a character contacts have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterContactsUpdated;\n\n        /// <summary>\n        /// Occurs when the text of a character medals have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterMedalsUpdated;\n\n        /// <summary>\n        /// Occurs when the text of a corporation medals have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CorporationMedalsUpdated;\n\n        /// <summary>\n        /// Occurs when the text of a character upcoming calendar events have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterUpcomingCalendarEventsUpdated;\n\n        /// <summary>\n        /// Occurs when the text of a character calendar event attendees have been downloaded.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterCalendarEventAttendeesDownloaded;\n\n        /// <summary>\n        /// Occurs when the text of a character kill logs have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterKillLogUpdated;\n\n        /// <summary>\n        /// Occurs when the character planetary colony list has been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterPlanetaryColoniesUpdated;\n\n        /// <summary>\n        /// Occurs when the character planetary colony layout has been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterPlanetaryLayoutUpdated;\n\n        /// <summary>\n        /// Occurs when the character loyalty point balances have been updated.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CharacterLoyaltyPointsUpdated;\n\n        /// <summary>\n        /// Occurs when a plan's name changed.\n        /// </summary>\n        public static event EventHandler<PlanChangedEventArgs> PlanNameChanged;\n\n        /// <summary>\n        /// Occurs when a plan changed.\n        /// </summary>\n        public static event EventHandler<PlanChangedEventArgs> PlanChanged;\n\n        /// <summary>\n        /// Fired every time we ping the TQ server status (update pilots online count etc).\n        /// </summary>\n        public static event EventHandler<EveServerEventArgs> ServerStatusUpdated;\n\n        /// <summary>\n        /// Fired every time a notification (API errors, skill completed) is sent.\n        /// </summary>\n        public static event EventHandler<NotificationEventArgs> NotificationSent;\n\n        /// <summary>\n        /// Fired every time a notification (API errors, skill completed) is invalidated.\n        /// </summary>\n        public static event EventHandler<NotificationInvalidationEventArgs> NotificationInvalidated;\n\n        /// <summary>\n        /// Occurs when an application update is available.\n        /// </summary>\n        public static event EventHandler<UpdateAvailableEventArgs> UpdateAvailable;\n\n        /// <summary>\n        /// Occurs when a data files update is available.\n        /// </summary>\n        public static event EventHandler<DataUpdateAvailableEventArgs> DataUpdateAvailable;\n\n        /// <summary>\n        /// Occurs when the loadout feed updated.\n        /// </summary>\n        public static event EventHandler<LoadoutFeedEventArgs> LoadoutFeedUpdated;\n\n        /// <summary>\n        /// Occurs when the loadout updated.\n        /// </summary>\n        public static event EventHandler<LoadoutEventArgs> LoadoutUpdated;\n\n        /// <summary>\n        /// Occurs when item prices updated.\n        /// </summary>\n        public static event EventHandler ItemPricesUpdated;\n\n        /// <summary>\n        /// Fires the timer tick event to notify the subscribers.\n        /// </summary>\n        internal static void UpdateOnOneSecondTick()\n        {\n            if (Closed)\n                return;\n\n            // Fires the event for subscribers\n            TimerTick?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when settings changed.\n        /// </summary>\n        internal static void OnSettingsChanged()\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            Settings.Save();\n            UpdateSettings();\n            SettingsChanged?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when the scheduler changed.\n        /// </summary>\n        internal static void OnSchedulerChanged()\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            Settings.Save();\n            SchedulerChanged?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when the ESI key collection changed.\n        /// </summary>\n        internal static void OnESIKeyCollectionChanged()\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            EveMonClient.Characters.UpdateAccountStatuses();\n            Settings.Save();\n            ESIKeyCollectionChanged?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when the monitored state of an ESI key changed.\n        /// </summary>\n        internal static void OnESIKeyMonitoredChanged()\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            Settings.Save();\n            ESIKeyMonitoredChanged?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when the monitored characters changed.\n        /// </summary>\n        internal static void OnMonitoredCharactersChanged()\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            Settings.Save();\n            MonitoredCharacterCollectionChanged?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when the character collection changed.\n        /// </summary>\n        internal static void OnCharacterCollectionChanged()\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            Settings.Save();\n            CharacterCollectionChanged?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n\n        /// <summary>\n        /// Called when the conquerable station list has been updated.\n        /// </summary>\n        internal static void OnConquerableStationListUpdated()\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            ConquerableStationListUpdated?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when the EVE factional warfare statistics have been updated.\n        /// </summary>\n        internal static void OnEveFactionalWarfareStatsUpdated()\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            EveFactionalWarfareStatsUpdated?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when the EveIDToName list has been updated.\n        /// </summary>\n        internal static void OnEveIDToNameUpdated()\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            EveIDToNameUpdated?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when the RefTypes list has been updated.\n        /// </summary>\n        internal static void OnRefTypesUpdated()\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            RefTypesUpdated?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when the NotificationRefTypes list has been updated.\n        /// </summary>\n        internal static void OnNotificationRefTypesUpdated()\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            NotificationRefTypesUpdated?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when the EveFlags list has been updated.\n        /// </summary>\n        internal static void OnEveFlagsUpdated()\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            EveFlagsUpdated?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when the ESI key info is updated.\n        /// </summary>\n        /// <param name=\"esiKey\">The ESI key.</param>\n        internal static void OnESIKeyInfoUpdated(ESIKey esiKey)\n        {\n            if (Closed)\n                return;\n\n            Trace(esiKey.ToString());\n            Settings.Save();\n            ESIKeyInfoUpdated?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when an account status has been updated.\n        /// </summary>\n        /// <param name=\"esiKey\">The ESI key.</param>\n        internal static void OnAccountStatusUpdated(ESIKey esiKey)\n        {\n            if (Closed)\n                return;\n\n            Trace(esiKey.ToString());\n            Characters.UpdateAccountStatuses();\n            Settings.Save();\n            AccountStatusUpdated?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Called when the character list updated.\n        /// </summary>\n        /// <param name=\"esiKey\">The ESI key.</param>\n        internal static void OnCharacterListUpdated(ESIKey esiKey)\n        {\n            if (Closed)\n                return;\n\n            Trace(esiKey.ToString());\n            Settings.Save();\n            CharacterListUpdated?.ThreadSafeInvoke(null, new ESIKeyInfoChangedEventArgs(esiKey));\n        }\n        \n        /// <summary>\n        /// Called when the character implant set collection changed.\n        /// </summary>\n        internal static void OnCharacterImplantSetCollectionChanged(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            Settings.Save();\n            CharacterImplantSetCollectionChanged?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character sheet updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            Settings.Save();\n            CharacterUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character info updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterInfoUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            Settings.Save();\n            CharacterInfoUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character label is changed via the UI.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        public static void OnCharacterLabelChanged(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterLabelChanged?.ThreadSafeInvoke(null, new LabelChangedEventArgs(character,\n                Characters.GetKnownLabels()));\n        }\n\n        /// <summary>\n        /// Called when the character skill queue updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterSkillQueueUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            character.UpdateAccountStatus();\n            Settings.Save();\n            CharacterSkillQueueUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character queued skills completed.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"skillsCompleted\">The skills completed.</param>\n        internal static void OnCharacterQueuedSkillsCompleted(Character character, IEnumerable<QueuedSkill> skillsCompleted)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            QueuedSkillsCompleted?.ThreadSafeInvoke(null, new QueuedSkillsEventArgs(character, skillsCompleted));\n        }\n\n        /// <summary>\n        /// Called when the character standings updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterStandingsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterStandingsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character factinal warfare stats updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterFactionalWarfareStatsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterFactionalWarfareStatsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character assets updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterAssetsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterAssetsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when both character and corporation issued market orders of a character updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnMarketOrdersUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            Settings.Save();\n            MarketOrdersUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the personal market orders of a character updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"endedOrders\">The ended orders.</param>\n        internal static void OnCharacterMarketOrdersUpdated(Character character, IEnumerable<MarketOrder> endedOrders)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterMarketOrdersUpdated?.ThreadSafeInvoke(null, new MarketOrdersEventArgs(character, endedOrders));\n        }\n\n        /// <summary>\n        /// Called when both character and corporation issued contracts of a character updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnContractsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            Settings.Save();\n            ContractsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the personal contracts of a character updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"endedContracts\">The ended contracts.</param>\n        internal static void OnCharacterContractsUpdated(Character character, IEnumerable<Contract> endedContracts)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterContractsUpdated?.ThreadSafeInvoke(null, new ContractsEventArgs(character, endedContracts));\n        }\n\n        /// <summary>\n        /// Called when the bid list of a personal contract has been downloaded.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterContractBidsDownloaded(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterContractBidsDownloaded?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the item list of a personal contract has been downloaded.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterContractItemsDownloaded(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterContractItemsDownloaded?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character wallet journal updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterWalletJournalUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterWalletJournalUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character wallet transcations updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterWalletTransactionsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterWalletTransactionsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when both character and corporation issued industry jobs for a character updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnIndustryJobsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            Settings.Save();\n            IndustryJobsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character industry jobs for a character updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterIndustryJobsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterIndustryJobsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the corporation issued industry jobs for a character updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCorporationIndustryJobsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CorporationIndustryJobsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character's industry jobs completed.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"jobsCompleted\">The jobs completed.</param>\n        internal static void OnCharacterIndustryJobsCompleted(Character character, IEnumerable<IndustryJob> jobsCompleted)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterIndustryJobsCompleted?.ThreadSafeInvoke(null, new IndustryJobsEventArgs(character, jobsCompleted));\n        }\n\n        /// <summary>\n        /// Called when the character's planetary pins completed.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"pinsCompleted\">The pins completed.</param>\n        internal static void OnCharacterPlanetaryPinsCompleted(Character character, IEnumerable<PlanetaryPin> pinsCompleted)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterPlaneteryPinsCompleted?.ThreadSafeInvoke(null, new PlanetaryPinsEventArgs(character, pinsCompleted));\n        }\n\n        /// <summary>\n        /// Called when the character research points updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterResearchPointsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterResearchPointsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character EVE mail messages updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterEVEMailMessagesUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            Settings.Save();\n            CharacterEVEMailMessagesUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character EVE mailing list updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterEVEMailingListsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterEVEMailingListsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character EVE mail message body downloaded.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterEVEMailBodyDownloaded(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterEVEMailBodyDownloaded?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character EVE notifications updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterEVENotificationsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            Settings.Save();\n            CharacterEVENotificationsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n        \n        /// <summary>\n        /// Called when the character contacts updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterContactsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterContactsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character medals updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterMedalsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterMedalsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the corporation medals updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCorporationMedalsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CorporationMedalsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character upcoming calendar events updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterUpcomingCalendarEventsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterUpcomingCalendarEventsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character calendar event attendees downloaded.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterCalendarEventAttendeesDownloaded(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterCalendarEventAttendeesDownloaded?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character kill log updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterKillLogUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterKillLogUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character planetary colonies updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterPlanetaryColoniesUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterPlanetaryColoniesUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character planetary pins updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterPlanetaryLayoutUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterPlanetaryLayoutUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character loyalty point balances updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterLoyaltyPointsUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterLoyaltyPointsUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character portrait updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterPortraitUpdated(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            CharacterPortraitUpdated?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character plan collection changed.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCharacterPlanCollectionChanged(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.Name);\n            Settings.Save();\n            CharacterPlanCollectionChanged?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the corporation market orders of a character updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"endedOrders\">The ended orders.</param>\n        internal static void OnCorporationMarketOrdersUpdated(Character character, IEnumerable<MarketOrder> endedOrders)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.CorporationName);\n            CorporationMarketOrdersUpdated?.ThreadSafeInvoke(null, new MarketOrdersEventArgs(character, endedOrders));\n        }\n\n        /// <summary>\n        /// Called when the corporation contracts of a character updated.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"endedContracts\">The ended contracts.</param>\n        internal static void OnCorporationContractsUpdated(Character character, IEnumerable<Contract> endedContracts)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.CorporationName);\n            CorporationContractsUpdated?.ThreadSafeInvoke(null, new ContractsEventArgs(character, endedContracts));\n        }\n\n        /// <summary>\n        /// Called when the bid list of a corporation contract has been downloaded.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCorporationContractBidsDownloaded(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.CorporationName);\n            CorporationContractBidsDownloaded?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the item list of a corporation contract has been downloaded.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal static void OnCorporationContractItemsDownloaded(Character character)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.CorporationName);\n            CorporationContractItemsDownloaded?.ThreadSafeInvoke(null, new CharacterChangedEventArgs(character));\n        }\n\n        /// <summary>\n        /// Called when the character's corporation industry jobs completed.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"jobsCompleted\">The jobs completed.</param>\n        internal static void OnCorporationIndustryJobsCompleted(Character character, IEnumerable<IndustryJob> jobsCompleted)\n        {\n            if (Closed)\n                return;\n\n            Trace(character.CorporationName);\n            CorporationIndustryJobsCompleted?.ThreadSafeInvoke(null, new IndustryJobsEventArgs(character, jobsCompleted));\n        }\n\n        /// <summary>\n        /// Called when a plan changed.\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        internal static void OnPlanChanged(Plan plan)\n        {\n            if (Closed)\n                return;\n\n            Trace(plan.Name);\n            Settings.Save();\n            PlanChanged?.ThreadSafeInvoke(null, new PlanChangedEventArgs(plan));\n        }\n\n        /// <summary>\n        /// Called when a plan name changed.\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        internal static void OnPlanNameChanged(Plan plan)\n        {\n            if (Closed)\n                return;\n\n            Trace(plan.Name);\n            Settings.Save();\n            PlanNameChanged?.ThreadSafeInvoke(null, new PlanChangedEventArgs(plan));\n        }\n\n        /// <summary>\n        /// Called when the server status updated.\n        /// </summary>\n        /// <param name=\"server\">The server.</param>\n        /// <param name=\"previousStatus\">The previous status.</param>\n        /// <param name=\"status\">The status.</param>\n        internal static void OnServerStatusUpdated(EveServer server, ServerStatus previousStatus, ServerStatus status)\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            ServerStatusUpdated?.ThreadSafeInvoke(null, new EveServerEventArgs(server, previousStatus, status));\n        }\n\n        /// <summary>\n        /// Called when a notification is sent.\n        /// </summary>\n        /// <param name=\"notification\">The notification.</param>\n        internal static void OnNotificationSent(NotificationEventArgs notification)\n        {\n            if (Closed)\n                return;\n\n            Trace(notification.ToString());\n            NotificationSent?.ThreadSafeInvoke(null, notification);\n        }\n\n        /// <summary>\n        /// Called when a notification gets invalidated.\n        /// </summary>\n        /// <param name=\"args\">The <see cref=\"EVEMon.Common.Notifications.NotificationInvalidationEventArgs\"/> instance containing the event data.</param>\n        internal static void OnNotificationInvalidated(NotificationInvalidationEventArgs args)\n        {\n            if (Closed)\n                return;\n\n            Trace();\n            NotificationInvalidated?.ThreadSafeInvoke(null, args);\n        }\n\n        /// <summary>\n        /// Called when an update is available.\n        /// </summary>\n        /// <param name=\"forumUrl\">The forum URL.</param>\n        /// <param name=\"installerUrl\">The installer URL.</param>\n        /// <param name=\"updateMessage\">The update message.</param>\n        /// <param name=\"currentVersion\">The current version.</param>\n        /// <param name=\"newestVersion\">The newest version.</param>\n        /// <param name=\"md5Sum\">The MD5 sum.</param>\n        /// <param name=\"canAutoInstall\">if set to <c>true</c> [can auto install].</param>\n        /// <param name=\"installArgs\">The install args.</param>\n        internal static void OnUpdateAvailable(Uri forumUrl, Uri installerUrl, string updateMessage,\n            Version currentVersion, Version newestVersion, string md5Sum,\n            bool canAutoInstall, string installArgs)\n        {\n            Trace($\"({currentVersion} -> {newestVersion}, {canAutoInstall}, {installArgs})\");\n            UpdateAvailable?.ThreadSafeInvoke(null, new UpdateAvailableEventArgs(forumUrl, installerUrl, updateMessage, currentVersion,\n                newestVersion, md5Sum, canAutoInstall, installArgs));\n        }\n\n        /// <summary>\n        /// Called when data update is available.\n        /// </summary>\n        /// <param name=\"changedFiles\">The changed files.</param>\n        internal static void OnDataUpdateAvailable(Collection<SerializableDatafile> changedFiles)\n        {\n            Trace($\"(ChangedFiles = {changedFiles.Count})\");\n            DataUpdateAvailable?.ThreadSafeInvoke(null, new DataUpdateAvailableEventArgs(changedFiles));\n        }\n\n        /// <summary>\n        /// Called when we downloaded a loadouts feed from the provider.\n        /// </summary>\n        /// <param name=\"loadoutFeed\">The loadout feed.</param>\n        /// <param name=\"errorMessage\">The error message.</param>\n        internal static void OnLoadoutsFeedDownloaded(object loadoutFeed, string errorMessage)\n        {\n            LoadoutFeedUpdated?.ThreadSafeInvoke(null, new LoadoutFeedEventArgs(loadoutFeed, errorMessage));\n        }\n\n        /// <summary>\n        /// Called when we downloaded a loadout from the provider.\n        /// </summary>\n        /// <param name=\"loadout\">The loadout.</param>\n        /// <param name=\"errorMessage\">The error message.</param>\n        internal static void OnLoadoutDownloaded(object loadout, string errorMessage)\n        {\n            LoadoutUpdated?.ThreadSafeInvoke(null, new LoadoutEventArgs(loadout, errorMessage));\n        }\n\n        /// <summary>\n        /// Called when prices downloaded.\n        /// </summary>\n        /// <param name=\"pricesFeed\">The prices feed.</param>\n        /// <param name=\"errormessage\">The errormessage.</param>\n        internal static void OnPricesDownloaded(object pricesFeed, string errormessage)\n        {\n            ItemPricesUpdated?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/EveMonClient.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections.Global;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Extended;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Threading;\n\nnamespace EVEMon.Common\n{\n    /// <summary>\n    /// Provides a controller layer for the application. This class manages API querying, objects lifecycle, etc. \n    /// See it as the entry point of the library and its collections as databases with stored procedures (the public ones).\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public static partial class EveMonClient\n    {\n        #region Fields\n\n        private static StreamWriter s_traceStream;\n        private static TextWriterTraceListener s_traceListener;\n        private static readonly DateTime s_startTime = DateTime.UtcNow;\n\n        private static IEnumerable<string> s_defaultEvePortraitCacheFolders;\n        private static bool s_initialized;\n        private static string s_traceFile;\n\n        #endregion\n\n\n        #region Initialization and threading\n\n        /// <summary>\n        /// Initializes paths, static objects, check and load datafiles, etc.\n        /// </summary>\n        /// <remarks>May be called more than once without causing redundant operations to occur.</remarks>\n        public static void Initialize()\n        {\n            if (s_initialized)\n                return;\n\n            s_initialized = true;\n\n            Trace(\"begin\");\n\n            // Network monitoring (connection availability changes)\n            NetworkMonitor.Initialize();\n\n            // ESIMethods collection initialization (always before members instatiation)\n            ESIMethods.Initialize();\n\n            // Members instantiations\n            APIProviders = new GlobalAPIProviderCollection();\n            MonitoredCharacters = new GlobalMonitoredCharacterCollection();\n            CharacterIdentities = new GlobalCharacterIdentityCollection();\n            Notifications = new GlobalNotificationCollection();\n            Characters = new GlobalCharacterCollection();\n            Datafiles = new GlobalDatafileCollection();\n            ESIKeys = new GlobalAPIKeyCollection();\n            EVEServer = new EveServer();\n\n            Trace(\"done\");\n        }\n\n        /// <summary>\n        /// Starts the event processing on a multi-threaded model, with the UI actor being the main actor.\n        /// </summary>\n        /// <param name=\"thread\">The thread.</param>\n        public static void Run(Thread thread)\n        {\n            Dispatcher.Run(thread);\n            Trace();\n        }\n\n        /// <summary>\n        /// Shutdowns the timer.\n        /// </summary>\n        public static void Shutdown()\n        {\n            Closed = true;\n            Dispatcher.Shutdown();\n            Trace();\n        }\n\n        /// <summary>\n        /// Resets collection that need to be cleared.\n        /// </summary>\n        internal static void ResetCollections()\n        {\n            ESIKeys = new GlobalAPIKeyCollection();\n            Characters = new GlobalCharacterCollection();\n            Notifications = new GlobalNotificationCollection();\n            CharacterIdentities = new GlobalCharacterIdentityCollection();\n            MonitoredCharacters = new GlobalMonitoredCharacterCollection();\n        }\n\n        /// <summary>\n        /// Gets true whether the client has been shut down.\n        /// </summary>\n        public static bool Closed { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this instance is debug build.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if this instance is debug build; otherwise, <c>false</c>.\n        /// </value>\n        public static bool IsDebugBuild { get; private set; }\n\n        /// <summary>\n        /// Gets a value indicating whether this instance is snapshot build.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if this instance is snapshot build; otherwise, <c>false</c>.\n        /// </value>\n        public static bool IsSnapshotBuild { get; private set; }\n\n        #endregion\n\n\n        #region Version\n\n        /// <summary>\n        /// Gets the file version information.\n        /// </summary>\n        /// <value>\n        /// The file version.\n        /// </value>\n        public static FileVersionInfo FileVersionInfo\n            => FileVersionInfo.GetVersionInfo(Assembly.GetEntryAssembly().Location);\n\n        #endregion\n\n\n        #region File paths\n\n        /// <summary>\n        /// Gets the EVE Online installations default portrait cache folder.\n        /// </summary>\n        public static IEnumerable<string> DefaultEvePortraitCacheFolders\n        {\n            get\n            {\n                if (s_defaultEvePortraitCacheFolders != null && s_defaultEvePortraitCacheFolders.Any())\n                    return s_defaultEvePortraitCacheFolders;\n\n                s_defaultEvePortraitCacheFolders = Settings.PortableEveInstallations.EVEClients\n                    .Select(eveClientInstallation => $\"{eveClientInstallation.Path}\\\\cache\\\\Pictures\\\\Characters\")\n                    .Where(Directory.Exists).ToList();\n\n                if (s_defaultEvePortraitCacheFolders.Any())\n                    EvePortraitCacheFolders = s_defaultEvePortraitCacheFolders;\n\n                return s_defaultEvePortraitCacheFolders;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the portrait cache folder defined by the user.\n        /// </summary>\n        public static IEnumerable<string> EvePortraitCacheFolders { get; internal set; }\n\n        /// <summary>\n        /// Gets or sets the EVE Online application data folder.\n        /// </summary>\n        public static string EVEApplicationDataDir { get; private set; }\n\n        /// <summary>\n        /// Returns the state of the EVE database.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if EVE database is out of service; otherwise, <c>false</c>.\n        /// </value>\n        public static bool EVEDatabaseDisabled { get; internal set; }\n\n        /// <summary>\n        /// Returns the current data storage directory.\n        /// </summary>\n        public static string EVEMonDataDir { get; private set; }\n\n        /// <summary>\n        /// Returns the current cache directory.\n        /// </summary>\n        public static string EVEMonCacheDir { get; private set; }\n\n        /// <summary>\n        /// Returns the current xml cache directory.\n        /// </summary>\n        public static string EVEMonXmlCacheDir { get; private set; }\n\n        /// <summary>\n        /// Returns the current image cache directory (not portraits).\n        /// </summary>\n        public static string EVEMonImageCacheDir { get; private set; }\n\n        /// <summary>\n        /// Returns the current portraits cache directory.\n        /// </summary>\n        /// <remarks>\n        /// We're talking about the cache in %APPDATA%\\cache\\portraits\n        /// This is different from the ImageService's hit cache (%APPDATA%\\cache\\image)\n        /// or the game's portrait cache (in EVE Online folder)\n        ///</remarks>\n        public static string EVEMonPortraitCacheDir { get; private set; }\n\n        /// <summary>\n        /// Gets the name of the current settings file.\n        /// </summary>\n        public static string SettingsFileName { get; private set; }\n\n        /// <summary>\n        /// Gets a value indicating whether cache folder in EVE default location exist.\n        /// </summary>\n        public static bool EveAppDataFoldersExistInDefaultLocation { get; private set; }\n\n        /// <summary>\n        /// Gets the fully qualified path to the current settings file.\n        /// </summary>\n        public static string SettingsFileNameFullPath => Path.Combine(EVEMonDataDir, SettingsFileName);\n\n        /// <summary>\n        /// Gets the fully qualified path to the trace file.\n        /// </summary>\n        public static string TraceFileNameFullPath => Path.Combine(EVEMonDataDir, s_traceFile);\n\n        /// <summary>\n        /// Creates the file system paths (settings file name, appdata directory, etc).\n        /// </summary>\n        public static void InitializeFileSystemPaths()\n        {\n            // Ensure it is made once only\n            if (!string.IsNullOrEmpty(SettingsFileName))\n                return;\n\n            string debugAddition = IsDebugBuild ? \"-debug\" : string.Empty;\n            SettingsFileName = $\"settings{debugAddition}.xml\";\n            s_traceFile = $\"trace{debugAddition}.txt\";\n\n            while (true)\n            {\n                try\n                {\n                    InitializeEVEMonPaths();\n                    InitializeDefaultEvePortraitCachePath();\n                    return;\n                }\n                catch (UnauthorizedAccessException exc)\n                {\n                    string msg = \"An error occurred while EVEMon was looking for its data directory. \" +\n                                 \"You may have insufficient rights or a synchronization may be taking place.\\n\\n\" +\n                                 $\"The message was :{Environment.NewLine}{exc.Message}\";\n\n                    DialogResult result = MessageBox.Show(msg, @\"EVEMon Error\", MessageBoxButtons.RetryCancel,\n                        MessageBoxIcon.Error);\n\n                    if (result != DialogResult.Cancel)\n                        continue;\n\n                    Application.Exit();\n                    return;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Initializes all needed EVEMon paths.\n        /// </summary>\n        private static void InitializeEVEMonPaths()\n        {\n            // Assign or create the EVEMon data directory\n            if (!Directory.Exists(EVEMonDataDir))\n            {\n                string appDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \"EVEMon\");\n\n                // If settings.xml exists in the app's directory, we use this one\n                EVEMonDataDir = Path.GetDirectoryName(Application.ExecutablePath) ?? appDataPath;\n\n                // Else, we use %APPDATA%\\EVEMon\n                if (!File.Exists(SettingsFileNameFullPath))\n                    EVEMonDataDir = appDataPath;\n\n                // Create the directory if it does not exist already\n                if (!Directory.Exists(EVEMonDataDir))\n                    Directory.CreateDirectory(EVEMonDataDir);\n            }\n\n            // Create the cache subfolder\n            EVEMonCacheDir = Path.Combine(EVEMonDataDir, \"cache\");\n            if (!Directory.Exists(EVEMonCacheDir))\n                Directory.CreateDirectory(EVEMonCacheDir);\n\n            // Create the xml cache subfolder\n            EVEMonXmlCacheDir = Path.Combine(EVEMonCacheDir, \"xml\");\n            if (!Directory.Exists(EVEMonXmlCacheDir))\n                Directory.CreateDirectory(EVEMonXmlCacheDir);\n\n            // Create the images cache subfolder (not portraits)\n            EVEMonImageCacheDir = Path.Combine(EVEMonCacheDir, \"images\");\n            if (!Directory.Exists(EVEMonImageCacheDir))\n                Directory.CreateDirectory(EVEMonImageCacheDir);\n\n            // Create the portraits cache subfolder\n            EVEMonPortraitCacheDir = Path.Combine(EVEMonCacheDir, \"portraits\");\n            if (!Directory.Exists(EVEMonPortraitCacheDir))\n                Directory.CreateDirectory(EVEMonPortraitCacheDir);\n        }\n\n        /// <summary>\n        /// Retrieves the portrait cache folder, from the game installation.\n        /// </summary>\n        private static void InitializeDefaultEvePortraitCachePath()\n        {\n            string localApplicationData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);\n            EVEApplicationDataDir = $\"{localApplicationData}\\\\CCP\\\\EVE\";\n\n            // Check folder exists\n            if (!Directory.Exists(EVEApplicationDataDir))\n                return;\n\n            // Create a pattern that matches anything \"*_tranquility\"\n            // Enumerate files in the EVE cache directory\n            DirectoryInfo di = new DirectoryInfo(EVEApplicationDataDir);\n            DirectoryInfo[] tranquilityFolders = di.GetDirectories(\"*_tranquility\");\n\n            EveAppDataFoldersExistInDefaultLocation = tranquilityFolders.Any();\n\n            if (!tranquilityFolders.Any())\n                return;\n\n            s_defaultEvePortraitCacheFolders = tranquilityFolders\n                .Select(traquilityFolder => $\"{EVEApplicationDataDir}\\\\{traquilityFolder.Name}\\\\cache\\\\Pictures\\\\Characters\")\n                .Where(Directory.Exists);\n\n            EvePortraitCacheFolders = s_defaultEvePortraitCacheFolders;\n        }\n\n        /// <summary>\n        /// Ensures the cache directories are initialized.\n        /// </summary>\n        internal static void EnsureCacheDirInit()\n        {\n            InitializeEVEMonPaths();\n        }\n\n        #endregion\n\n\n        #region Services\n\n        /// <summary>\n        /// Gets the current synchronization context.\n        /// </summary>\n        /// <value>\n        /// The current synchronization context.\n        /// </value>\n        public static TaskScheduler CurrentSynchronizationContext => TaskScheduler.FromCurrentSynchronizationContext();\n\n        /// <summary>\n        /// Gets an enumeration over the datafiles checksums.\n        /// </summary>\n        public static GlobalDatafileCollection Datafiles { get; private set; }\n\n        /// <summary>\n        /// Gets the API providers collection.\n        /// </summary>\n        public static GlobalAPIProviderCollection APIProviders { get; private set; }\n\n        /// <summary>\n        /// Gets the EVE server's informations.\n        /// </summary>\n        public static EveServer EVEServer { get; private set; }\n\n        /// <summary>\n        /// Apply some settings changes.\n        /// </summary>\n        private static void UpdateSettings()\n        {\n            HttpWebClientServiceState.Proxy = Settings.Proxy;\n        }\n\n        #endregion\n\n\n        #region Cache Clearing\n\n        public static void ClearCache()\n        {\n            try\n            {\n                List<FileInfo> cachedFiles = new List<FileInfo>();\n                cachedFiles.AddRange(new DirectoryInfo(EVEMonImageCacheDir).GetFiles());\n                cachedFiles.AddRange(new DirectoryInfo(EVEMonXmlCacheDir).GetFiles());\n                cachedFiles.AddRange(new DirectoryInfo(EVEMonPortraitCacheDir).GetFiles());\n\n                cachedFiles.ForEach(x => x.Delete());\n            }\n            finally\n            {\n                InitializeEVEMonPaths();\n            }\n        }\n\n        #endregion\n\n\n        #region API Keys management\n\n        /// <summary>\n        /// Gets the collection of all known API keys.\n        /// </summary>\n        public static GlobalAPIKeyCollection ESIKeys { get; private set; }\n\n        /// <summary>\n        /// Gets the collection of all characters.\n        /// </summary>\n        public static GlobalCharacterCollection Characters { get; private set; }\n\n        /// <summary>\n        /// Gets the collection of all known character identities. For monitored character, see <see cref=\"MonitoredCharacters\"/>.\n        /// </summary>\n        public static GlobalCharacterIdentityCollection CharacterIdentities { get; private set; }\n\n        /// <summary>\n        /// Gets the collection of all monitored characters.\n        /// </summary>\n        public static GlobalMonitoredCharacterCollection MonitoredCharacters { get; private set; }\n\n        /// <summary>\n        /// Gets the collection of notifications.\n        /// </summary>\n        public static GlobalNotificationCollection Notifications { get; private set; }\n\n        #endregion\n\n\n        #region Diagnostics\n\n        /// <summary>\n        /// Sends a message to the trace with the prepended time since\n        /// startup, in addition to argument inserting into the format.\n        /// </summary>\n        /// <param name=\"format\"></param>\n        /// <param name=\"args\"></param>\n        public static void Trace(string format, params object[] args)\n        {\n            string message = string.Format(CultureConstants.DefaultCulture, format, args);\n            Trace(message);\n        }\n\n        /// <summary>\n        /// Sends a message to the trace with the prepended time since startup.\n        /// </summary>\n        /// <param name=\"message\">The message.</param>\n        /// <param name=\"printMethod\">if set to <c>true</c> [print method].</param>\n        public static void Trace(string message = null, bool printMethod = true)\n        {\n            string header = string.Empty;\n\n            if (printMethod)\n            {\n                StackTrace stackTrace = new StackTrace();\n                StackFrame frame = stackTrace.GetFrame(1);\n                MethodBase method = frame.GetMethod();\n                if (method.Name == \"MoveNext\")\n                    method = stackTrace.GetFrame(3).GetMethod();\n\n                Type declaringType = method.DeclaringType;\n                header = $\"{declaringType?.Name}.{method.Name}\";\n            }\n\n            TimeSpan time = DateTime.UtcNow.Subtract(s_startTime);\n            string timeStr = $\"{time.Days:#0}d {time.Hours:#0}h {time.Minutes:00}m {time.Seconds:00}s > \";\n            message = string.IsNullOrWhiteSpace(message) || !printMethod ? message : $\" - {message}\";\n            string msgStr = $\"{header}{message}\";\n\n            System.Diagnostics.Trace.WriteLine($\"{timeStr}{msgStr.TrimEnd(Environment.NewLine.ToCharArray())}\");\n        }\n\n        /// <summary>\n        /// Sends a message to the trace with the calling method, time\n        /// and the types of any arguments passed to the method.\n        /// </summary>\n        public static void TraceMethod()\n        {\n            StackTrace stackTrace = new StackTrace();\n            StackFrame frame = stackTrace.GetFrame(1);\n            MethodBase method = frame.GetMethod();\n            string parameters = FormatParameters(method.GetParameters());\n            string declaringType = method.DeclaringType?.ToString().Replace(\"EVEMon.\", string.Empty);\n\n            Trace($\"{declaringType}.{method.Name}({parameters})\");\n        }\n\n        /// <summary>\n        /// Formats the parameters of a method into a string.\n        /// </summary>\n        /// <param name=\"parameters\">The parameters.</param>\n        /// <returns>A comma seperated string of paramater types and names.</returns>\n        private static string FormatParameters(IEnumerable<ParameterInfo> parameters)\n        {\n            StringBuilder paramDetail = new StringBuilder();\n\n            foreach (ParameterInfo param in parameters)\n            {\n                if (paramDetail.Length != 0)\n                    paramDetail.Append(\", \");\n\n                paramDetail.Append($\"{param.GetType().Name} {param.Name}\");\n            }\n\n            return paramDetail.ToString();\n        }\n\n        /// <summary>\n        /// Starts the logging of trace messages to a file.\n        /// </summary>\n        public static void StartTraceLogging()\n        {\n            try\n            {\n                System.Diagnostics.Trace.AutoFlush = true;\n                s_traceStream = File.CreateText(TraceFileNameFullPath);\n                s_traceListener = new TextWriterTraceListener(s_traceStream);\n                System.Diagnostics.Trace.Listeners.Add(s_traceListener);\n            }\n            catch (IOException e)\n            {\n                string text = \"EVEMon has encountered an error and needs to terminate.\\n\" +\n                              $\"The error message is:\\n\\n\\\"{e.Message}\\\"\";\n\n                MessageBox.Show(text, @\"EVEMon Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                Application.Exit();\n            }\n        }\n\n        /// <summary>\n        /// Stops the logging of trace messages to a file.\n        /// </summary>\n        public static void StopTraceLogging()\n        {\n            System.Diagnostics.Trace.Listeners.Remove(s_traceListener);\n            s_traceListener.Close();\n            s_traceStream.Close();\n        }\n\n        /// <summary>\n        /// Will only execute if DEBUG is set, thus lets us avoid #IFDEF.\n        /// </summary>\n        [Conditional(\"DEBUG\")]\n        public static void CheckIsDebug()\n        {\n            IsDebugBuild = true;\n        }\n\n        /// <summary>\n        /// Will only execute if SHAPSHOT is set, thus lets us avoid #IFDEF.\n        /// </summary>\n        [Conditional(\"SNAPSHOT\")]\n        public static void CheckIsSnapshot()\n        {\n            IsSnapshotBuild = true;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Exceptions/APIException.cs",
    "content": "using System;\nusing EVEMon.Common.Serialization;\n\nnamespace EVEMon.Common.Exceptions\n{\n    internal class APIException : Exception\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"APIException\"/> class.\n        /// </summary>\n        /// <param name=\"error\">The error.</param>\n        public APIException(SerializableAPIError error)\n            : base(error.ErrorMessage)\n        {\n            ErrorCode = error.ErrorCode;\n        }\n\n        /// <summary>\n        /// Gets or sets the error code.\n        /// </summary>\n        /// <value>\n        /// The error code.\n        /// </value>\n        public string ErrorCode { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Extensions/EnumExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Reflection;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Extensions\n{\n    public static class EnumExtensions\n    {\n        /// <summary>\n        /// Checks whether the given member has an access mask.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        public static bool HasForcedOnStartup(this Enum item) => GetAttribute<ForcedOnStartupAttribute>(item) != null;\n\n        /// <summary>\n        /// Gets the description bound to the given enumeration member.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        public static string GetDescription(this Enum item) => GetAttribute<DescriptionAttribute>(item).Description;\n\n        /// <summary>\n        /// Checks whether the given member has a header.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        public static bool HasHeader(this Enum item) => GetAttribute<HeaderAttribute>(item) != null;\n\n        /// <summary>\n        /// Gets the header bound to the given enumeration member.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        public static string GetHeader(this Enum item) => GetAttribute<HeaderAttribute>(item).Header;\n\n        /// <summary>\n        /// Checks whether the given member has a specific parent.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        public static bool HasParent(this Enum item, Enum other) => GetAttribute<ParentAttribute>(item)?.Parents?.Any(e => other.Equals(e)) ?? false;\n\n        /// <summary>\n        /// Gets the period bound to the given enumeration member.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        public static UpdateAttribute GetUpdatePeriod(this Enum item) => GetAttribute<UpdateAttribute>(item);\n\n        /// <summary>\n        /// Gets the default value of the given enumeration member.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        public static int GetDefaultValue(this Enum item) => (int)GetAttribute<DefaultValueAttribute>(item).Value;\n\n        /// <summary>\n        /// Gets the attribute associated to the given enumeration item.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">item</exception>\n        private static TAttribute GetAttribute<TAttribute>(this Enum item)\n            where TAttribute : Attribute\n        {\n            item.ThrowIfNull(nameof(item));\n\n            MemberInfo[] members = item.GetType().GetMember(item.ToString());\n            if (members.Length <= 0)\n                return null;\n\n            object[] attrs = members[0].GetCustomAttributes(typeof(TAttribute), false);\n            if (attrs.Length > 0)\n                return (TAttribute)attrs[0];\n\n            return null;\n        }\n\n        /// <summary>\n        /// Gets the values for this enum.\n        /// </summary>\n        /// <typeparam name=\"TEnum\"></typeparam>\n        /// <returns></returns>\n        public static IEnumerable<TEnum> GetValues<TEnum>() => Enum.GetValues(typeof(TEnum)).Cast<TEnum>();\n\n        /// <summary>\n        /// Gets the descriptions for this enum.\n        /// </summary>\n        /// <typeparam name=\"TEnum\"></typeparam>\n        /// <returns></returns>\n        public static IEnumerable<object> GetDescriptions<TEnum>()\n            => Enum.GetValues(typeof(TEnum)).Cast<Enum>().Select(item => item.GetDescription());\n\n        /// <summary>\n        /// Gets the values that are powers of two for this flag enum, excluding the one for zero.\n        /// </summary>\n        /// <typeparam name=\"TEnum\"></typeparam>\n        /// <returns></returns>\n        public static IEnumerable<TEnum> GetBitValues<TEnum>()\n        {\n            foreach (object value in Enum.GetValues(typeof(TEnum)))\n            {\n                // Check it matches a power of two \n                bool found = false;\n                for (int i = 0; i < 32; i++)\n                {\n                    if ((int)value != 1 << i)\n                        continue;\n                    found = !found;\n\n                    // If two bits matched, found is false again and value is not a power of two\n                    if (!found)\n                        break;\n                }\n\n                // Is it a power of two ?\n                if (found)\n                    yield return (TEnum)value;\n            }\n        }\n\n        /// <summary>\n        /// Gets the enum value from description.\n        /// </summary>\n        /// <param name=\"description\">The description.</param>\n        /// <returns></returns>\n        public static Enum GetValueFromDescription<TEnum>(string description)\n            => Enum.GetValues(typeof(TEnum)).Cast<Enum>().FirstOrDefault(item => item.GetDescription() == description);\n\n\n        #region Account Status\n\n        // pessimist mode on.\n        private const float trainingRateUnknown = 0.5f;\n        private const float trainingRateAlpha = 0.5f;\n        private const float trainingRateOmega = 1.0f;\n\n        /// <summary>\n        /// Returns true if this status denotes an Alpha clone.\n        /// </summary>\n        /// <param name=\"status\">The current account status</param>\n        /// <returns>true if the account is Alpha, or false otherwise</returns>\n        public static bool IsAlpha(this AccountStatus status)\n        {\n            return status == AccountStatus.Alpha;\n        }\n\n        /// <summary>\n        /// Returns the SP training rate adjusted for account status.\n        /// </summary>\n        /// <param name=\"status\">The current account status</param>\n        /// <returns>The skill point accrual rate (1.0 = base) modifier</returns>\n        public static float GetTrainingRate(this AccountStatus status)\n        {\n            float rate = trainingRateUnknown;\n            switch (status)\n            {\n            case AccountStatus.Alpha:\n                rate = trainingRateAlpha;\n                break;\n            case AccountStatus.Omega:\n                rate = trainingRateOmega;\n                break;\n            case AccountStatus.Unknown:\n                rate = trainingRateUnknown;\n                break;\n            }\n            return rate;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Extensions/EventHandlerExtensions.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Linq;\n\nnamespace EVEMon.Common.Extensions\n{\n    public static class EventHandlerExtensions\n    {\n        /// <summary>\n        /// Helper method to fire events in a thread safe manner.\n        /// </summary>\n        /// <param name=\"eventHandler\">The <see cref=\"System.EventHandler\" /> for the event to be raised.</param>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">An <see cref=\"System.EventArgs\" /> to be passed with the event invocation.</param>\n        /// <remarks>\n        /// Checks whether subscribers implement <see cref=\"System.ComponentModel.ISynchronizeInvoke\" /> to ensure we raise the\n        /// event on the correct thread.\n        /// </remarks>\n        public static void ThreadSafeInvoke(this EventHandler eventHandler, object sender, EventArgs e)\n        {\n            // Make sure we have some subscribers\n            if (eventHandler == null)\n                return;\n\n            // Get each subscriber in turn\n            foreach (EventHandler handler in eventHandler.GetInvocationList().Cast<EventHandler>())\n            {\n                // Get the object containing the subscribing method\n                // If the target doesn't implement ISyncronizeInvoke, this will be null\n                ISynchronizeInvoke sync = handler.Target as ISynchronizeInvoke;\n\n                // Check if our target requires an Invoke\n                if (sync != null && sync.InvokeRequired)\n                {\n                    // Yes it does, so invoke the handler using the target's BeginInvoke method, but wait for it to finish\n                    // This is preferable to using Invoke so that if an exception is thrown its presented\n                    // in the context of the handler, not the current thread\n                    IAsyncResult result = sync.BeginInvoke(handler, new[] { sender, e });\n                    sync.EndInvoke(result);\n                    continue;\n                }\n\n                // No it doesn't, so invoke the handler directly\n                handler.Invoke(sender, e);\n            }\n        }\n\n        /// <summary>\n        /// Helper method to fire events in a thread safe manner.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"eventHandler\">The <see cref=\"System.EventHandler\" /> for the event to be raised.</param>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">An <see cref=\"System.EventArgs\" /> to be passed with the event invocation.</param>\n        /// <remarks>\n        /// Checks whether subscribers implement <see cref=\"System.ComponentModel.ISynchronizeInvoke\" /> to ensure we raise the\n        /// event on the correct thread.\n        /// </remarks>\n        public static void ThreadSafeInvoke<T>(this EventHandler<T> eventHandler, object sender, T e) where T : EventArgs\n        {\n            // Make sure we have some subscribers\n            if (eventHandler == null)\n                return;\n\n            // Get each subscriber in turn\n            foreach (EventHandler<T> handler in eventHandler.GetInvocationList().Cast<EventHandler<T>>())\n            {\n                // Get the object containing the subscribing method\n                // If the target doesn't implement ISyncronizeInvoke, this will be null\n                ISynchronizeInvoke sync = handler.Target as ISynchronizeInvoke;\n\n                // Check if our target requires an Invoke\n                if (sync != null && sync.InvokeRequired)\n                {\n                    // Yes it does, so invoke the handler using the target's BeginInvoke method, but wait for it to finish\n                    // This is preferable to using Invoke so that if an exception is thrown its presented\n                    // in the context of the handler, not the current thread\n                    IAsyncResult result = sync.BeginInvoke(handler, new[] { sender, e });\n                    sync.EndInvoke(result);\n                    continue;\n                }\n\n                // No it doesn't, so invoke the handler directly\n                handler(sender, e);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Extensions/HttpExtensions.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Net.Http.Headers;\n\nnamespace EVEMon.Common.Extensions\n{\n    public static class HttpExtensions\n    {\n        /// <summary>\n        /// Retrieves an integer header value.\n        /// </summary>\n        /// <param name=\"headers\">The headers to use.</param>\n        /// <param name=\"name\">The header name to query.</param>\n        /// <returns>The value of that header as an integer, or null if the header is missing\n        /// or in a non-integer format.</returns>\n        private static int? GetIntParam(HttpResponseHeaders headers, string name)\n        {\n            IEnumerable<string> values;\n            int? ret = null;\n            // If values are available, try to parse as integer, use the last one\n            if (headers.TryGetValues(name, out values))\n                foreach (string value in values)\n                {\n                    int intVal;\n                    if (value.Trim().TryParseInv(out intVal) && intVal >= 0)\n                        ret = intVal;\n                }\n            return ret;\n        }\n\n        /// <summary>\n        /// Retrieves the number of ESI errors remaining, or null if this header is not\n        /// included.\n        /// </summary>\n        /// <param name=\"headers\">The response headers.</param>\n        public static int? ErrorCount(this HttpResponseHeaders headers)\n        {\n            return GetIntParam(headers, \"X-Esi-Error-Limit-Remain\");\n        }\n\n        /// <summary>\n        /// Retrieves the number of ESI pages in the response, or 0 if this header is not\n        /// included.\n        /// </summary>\n        /// <param name=\"headers\">The response headers.</param>\n        public static int PageCount(this HttpResponseHeaders headers)\n        {\n            return GetIntParam(headers, \"X-Pages\") ?? 0;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Extensions/ObjectExtensions.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.Extensions\n{\n    public static class ObjectExtensions\n    {\n        /// <summary>\n        /// Throws an ArgumentNullException if the object is null.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"obj\">The object.</param>\n        /// <param name=\"paramName\">Name of the parameter.</param>\n        /// <param name=\"message\">The message.</param>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static void ThrowIfNull<T>(this T obj, string paramName, string message = null)\n        {\n            if (obj == null)\n                throw new ArgumentNullException(paramName, message ?? \"Value cannot be null.\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Extensions/PlanEntryExtensions.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\n\nnamespace EVEMon.Common.Extensions\n{\n    public static class PlanEntryExtensions\n    {\n        /// <summary>\n        /// Gets the total number of unique skills (two levels of same skill counts for one unique skill).\n        /// </summary>\n        /// <param name=\"items\">List of <see cref=\"PlanEntry\" />.</param>\n        /// <returns>Count of unique skills.</returns>\n        /// <exception cref=\"System.ArgumentNullException\">items</exception>\n        public static int GetUniqueSkillsCount(this IEnumerable<PlanEntry> items)\n        {\n            items.ThrowIfNull(nameof(items));\n\n            return items.Distinct(new PlanEntryComparer()).Count();\n        }\n\n        /// <summary>\n        /// Gets the number of not known skills selected (two levels of same skill counts for one unique skill).\n        /// </summary>\n        /// <param name=\"items\">List of <see cref=\"PlanEntry\" />.</param>\n        /// <returns>Count of not known skills.</returns>\n        /// <exception cref=\"System.ArgumentNullException\">items</exception>\n        public static int GetNotKnownSkillsCount(this IEnumerable<PlanEntry> items)\n        {\n            items.ThrowIfNull(nameof(items));\n\n            return items.Distinct(new PlanEntryComparer())\n                .Count(entry => !entry.CharacterSkill.IsKnown && !entry.CharacterSkill.IsOwned);\n        }\n\n        /// <summary>\n        /// Gets the total cost of the skill books, in ISK.\n        /// </summary>\n        /// <param name=\"items\">List of <see cref=\"PlanEntry\" />.</param>\n        /// <returns>Cumulative cost of all skill books.</returns>\n        /// <exception cref=\"System.ArgumentNullException\">items</exception>\n        public static long GetTotalBooksCost(this IEnumerable<PlanEntry> items)\n        {\n            items.ThrowIfNull(nameof(items));\n\n            return items.Distinct(new PlanEntryComparer()).Sum(entry => entry.Skill.Cost);\n        }\n\n        /// <summary>\n        /// Gets the cost of the not known skill books, in ISK.\n        /// </summary>\n        /// <param name=\"items\">List of <see cref=\"PlanEntry\" />.</param>\n        /// <returns>Cumulative cost of not known skill books.</returns>\n        /// <exception cref=\"System.ArgumentNullException\">items</exception>\n        public static long GetNotKnownSkillBooksCost(this IEnumerable<PlanEntry> items)\n        {\n            items.ThrowIfNull(nameof(items));\n\n            return items.Distinct(new PlanEntryComparer())\n                .Where(entry => !entry.CharacterSkill.IsKnown && !entry.CharacterSkill.IsOwned)\n                .Sum(entry => entry.Skill.Cost);\n        }\n\n        public static long GetTotalSkillPoints(this IEnumerable<PlanEntry> items)\n        {\n            items.ThrowIfNull(nameof(items));\n\n            return items.Sum(entry => entry.SkillPointsRequired);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Extensions/SkillEnumerableExtensions.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Extensions\n{\n    public static class SkillEnumerableExtensions\n    {\n        /// <summary>\n        /// Rreturns an enumeration of static equivalent of those character skills.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <returns></returns>\n        public static IEnumerable<StaticSkill> ToStatic(this IEnumerable<Skill> src) => src.Select(item => item.StaticData);\n\n        /// <summary>\n        /// Gets all the prerequisites. I.e, for eidetic memory, it will return <c>{ instant recall IV }</c>. \n        /// The order matches the hirerarchy but skills are not duplicated and are systematically trained to the highest required level.\n        /// For example, if some skill is required to lv3 and, later, to lv4, this first time it is encountered, lv4 is returned.\n        /// </summary>\n        /// <remarks>Please note they may be redundancies.</remarks>\n        public static IEnumerable<SkillLevel> GetAllPrerequisites(this IEnumerable<Skill> src)\n        {\n            var enumerable = src as IList<Skill> ?? src.ToList();\n            Skill first = enumerable.FirstOrDefault();\n            return first == null\n                ? Enumerable.Empty<SkillLevel>()\n                : enumerable.ToStatic().GetAllPrerequisites().ToCharacter(first.Character);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Extensions/SkillLevelEnumerableExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Extensions\n{\n    public static class SkillLevelEnumerableExtensions\n    {\n        /// <summary>\n        /// Returns an enumeration of the static equivalent of the items.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <returns></returns>\n        public static IEnumerable<StaticSkillLevel> ToStatic(this IEnumerable<SkillLevel> src)\n            => src.Select(item => new StaticSkillLevel(item));\n\n        /// <summary>\n        /// Gets all the dependencies, in a way matching the hierachical order and without redudancies.\n        /// I.e, for eidetic memory II, it will return <c>{ instant recall I, instant recall II, instant recall III, instant recall IV,  eidetic memory I, eidetic memory II }</c>.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <param name=\"includeRoots\">When true, the levels in this enumeration are also included.</param>\n        public static IEnumerable<SkillLevel> GetAllDependencies(this IEnumerable<SkillLevel> src, bool includeRoots)\n        {\n            var skillLevels = src as IList<SkillLevel> ?? src.ToList();\n            SkillLevel first = skillLevels.FirstOrDefault();\n            return first == null || first.Skill == null\n                ? Enumerable.Empty<SkillLevel>()\n                : skillLevels.ToStatic().GetAllDependencies(includeRoots).ToCharacter(first.Skill.Character);\n        }\n\n        /// <summary>\n        /// Gets true if all the levels are known\n        /// </summary>\n        /// <param name=\"src\"></param>\n        public static bool AreTrained(this IEnumerable<SkillLevel> src) => src.All(x => x.IsTrained);\n\n        /// <summary>\n        /// Checks whether those prerequisites contains the provided skill, returning the need level\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"neededLevel\"></param>\n        /// <returns></returns>\n        public static bool Contains(this IEnumerable<SkillLevel> src, Skill skill, out long neededLevel)\n        {\n            neededLevel = 0;\n            foreach (SkillLevel prereq in src.Where(prereq => prereq.Skill == skill))\n            {\n                neededLevel = prereq.Level;\n                return true;\n            }\n            return false;\n        }\n\n\n        #region GetTotalTrainingTime\n\n        /// <summary>\n        /// Gets the points required to train all the prerequisites\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <returns></returns>\n        public static TimeSpan GetTotalTrainingTime(this IEnumerable<SkillLevel> src)\n        {\n            bool junk = false;\n            return src.GetTotalTrainingTime(new Dictionary<Skill, long>(), ref junk);\n        }\n\n        /// <summary>\n        /// Gets the points required to train all the prerequisites\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"alreadyCountedList\">The already counted list.</param>\n        /// <returns></returns>\n        public static TimeSpan GetTotalTrainingTime(this IEnumerable<SkillLevel> src, Dictionary<Skill, long> alreadyCountedList)\n        {\n            bool junk = false;\n            return src.GetTotalTrainingTime(alreadyCountedList, ref junk);\n        }\n\n        /// <summary>\n        /// Gets the points required to train all the prerequisites\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"isCurrentlyTraining\">if set to <c>true</c> [is currently training].</param>\n        /// <returns></returns>\n        public static TimeSpan GetTotalTrainingTime(this IEnumerable<SkillLevel> src, ref bool isCurrentlyTraining)\n            => src.GetTotalTrainingTime(new Dictionary<Skill, long>(), ref isCurrentlyTraining);\n\n        /// <summary>\n        /// Gets the time required to train all the prerequisites\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"alreadyCountedList\">The already counted list.</param>\n        /// <param name=\"isCurrentlyTraining\">if set to <c>true</c> [is currently training].</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">src or alreadyCountedList</exception>\n        public static TimeSpan GetTotalTrainingTime(this IEnumerable<SkillLevel> src, Dictionary<Skill, long> alreadyCountedList,\n            ref bool isCurrentlyTraining)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            alreadyCountedList.ThrowIfNull(nameof(alreadyCountedList));\n\n            TimeSpan result = TimeSpan.Zero;\n            foreach (SkillLevel item in src)\n            {\n                Skill skill = item.Skill;\n                isCurrentlyTraining |= skill.IsTraining;\n\n                // Gets the number of points we're starting from\n                long fromPoints = skill.SkillPoints;\n                if (alreadyCountedList.ContainsKey(skill))\n                    fromPoints = alreadyCountedList[skill];\n\n                // Gets the number of points we're targeting\n                long toPoints = skill.GetLeftPointsRequiredToLevel(item.Level);\n                if (fromPoints < toPoints)\n                    result += skill.GetTimeSpanForPoints(toPoints - fromPoints);\n\n                // Updates the alreadyCountedList\n                alreadyCountedList[skill] = Math.Max(fromPoints, toPoints);\n\n                // Recursive\n                if (fromPoints < toPoints)\n                    result += skill.Prerequisites.GetTotalTrainingTime(alreadyCountedList, ref isCurrentlyTraining);\n            }\n            return result;\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Extensions/StaticSkillEnumerableExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Extensions\n{\n    public static class StaticSkillEnumerableExtensions\n    {\n        /// <summary>\n        /// Returns an equivalent enumeration with character skills.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <param name=\"character\"></param>\n        /// <returns></returns>\n        public static IEnumerable<Skill> ToCharacter(this IEnumerable<StaticSkill> src, Character character)\n            => src.Select(skill => character.Skills[skill.ID]);\n\n        /// <summary>\n        /// Gets all the prerequisites. I.e, for eidetic memory, it will return <c>{ instant recall IV }</c>. \n        /// The order matches the hirerarchy but skills are not duplicated and are systematically trained to the highest required level.\n        /// For example, if some skill is required to lv3 and, later, to lv4, this first time it is encountered, lv4 is returned.\n        /// </summary>\n        /// <remarks>Please note they may be redundancies.</remarks>\n        public static IEnumerable<StaticSkillLevel> GetAllPrerequisites(this IEnumerable<StaticSkill> src)\n        {\n            long[] highestLevels = new long[StaticSkills.ArrayIndicesCount];\n            List<StaticSkillLevel> list = new List<StaticSkillLevel>();\n\n            // Fill the array\n            foreach (StaticSkillLevel prereq in src.SelectMany(skill => skill.Prerequisites))\n            {\n                FillPrerequisites(highestLevels, list, prereq, true);\n            }\n\n            // Return the result\n            foreach (StaticSkillLevel newSkill in list.Where(newSkill => highestLevels[newSkill.Skill.ArrayIndex] != 0))\n            {\n                yield return new StaticSkillLevel(newSkill.Skill, highestLevels[newSkill.Skill.ArrayIndex]);\n                highestLevels[newSkill.Skill.ArrayIndex] = 0;\n            }\n        }\n\n        /// <summary>\n        /// Fills the given levels array with the prerequisites and when <c>includeRoots</c> is true, the item level itself.\n        /// </summary>\n        /// <param name=\"highestLevels\"></param>\n        /// <param name=\"list\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"includeRoots\"></param>\n        internal static void FillPrerequisites(long[] highestLevels, List<StaticSkillLevel> list, StaticSkillLevel item,\n            bool includeRoots)\n        {\n            // Prerequisites\n            if (highestLevels[item.Skill.ArrayIndex] == 0)\n            {\n                foreach (StaticSkillLevel prereq in item.Skill.Prerequisites.Where(prereq => prereq.Skill != item.Skill))\n                {\n                    FillPrerequisites(highestLevels, list, prereq, true);\n                }\n            }\n\n            // The very level\n            if (!includeRoots || highestLevels[item.Skill.ArrayIndex] >= item.Level)\n                return;\n\n            highestLevels[item.Skill.ArrayIndex] = item.Level;\n            list.Add(item);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Extensions/StaticSkillExtensions.cs",
    "content": "using System;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Interfaces;\n\nnamespace EVEMon.Common.Extensions\n{\n    public static class StaticSkillExtensions\n    {\n        /// <summary>\n        /// Checks whether a certain skill is a prerequisite of this skill.\n        /// The check is performed recursively through all prerequisites.\n        /// </summary>\n        /// <param name=\"thisSkill\">This skill.</param>\n        /// <param name=\"skill\">Skill to check.</param>\n        /// <returns>\n        /// \t<code>true</code> if it is a prerequisite.\n        /// </returns>\n        public static bool HasAsPrerequisite(this IStaticSkill thisSkill, IStaticSkill skill)\n        {\n            long neededLevel = 0;\n            return thisSkill.HasAsPrerequisite(skill, ref neededLevel, true);\n        }\n\n        /// <summary>\n        /// Checks whether a certain skill is a prerequisite of this skill, and what level it needs.\n        /// The check is performed recursively through all prerequisites.\n        /// </summary>\n        /// <param name=\"thisSkill\">This skill.</param>\n        /// <param name=\"skill\">Skill to check.</param>\n        /// <param name=\"neededLevel\">The level that is needed. Out parameter.</param>\n        /// <returns>\n        /// \t<code>true</code> if it is a prerequisite, needed level in <var>neededLevel</var> out parameter.\n        /// </returns>\n        public static bool HasAsPrerequisite(this IStaticSkill thisSkill, IStaticSkill skill, out long neededLevel)\n        {\n            neededLevel = 0;\n            return thisSkill.HasAsPrerequisite(skill, ref neededLevel, true);\n        }\n\n        /// <summary>\n        /// Checks whether a certain skill is a prerequisite of this skill, and what level it needs.\n        /// Find the highest level needed by searching entire prerequisite tree.\n        /// </summary>\n        /// <param name=\"thisSkill\">This skill.</param>\n        /// <param name=\"skill\">Skill to check.</param>\n        /// <param name=\"neededLevel\">The level that is needed. Out parameter.</param>\n        /// <param name=\"recurse\">Pass <code>true</code> to check recursively.</param>\n        /// <returns>\n        /// \t<code>true</code> if it is a prerequisite, needed level in <var>neededLevel</var> out parameter.\n        /// </returns>\n        private static bool HasAsPrerequisite(this IStaticSkill thisSkill, IStaticSkill skill, ref long neededLevel, bool recurse)\n        {\n            long thisID = thisSkill.ID;\n\n            foreach (StaticSkillLevel prereq in thisSkill.Prerequisites)\n            {\n                if (prereq.Skill == skill)\n                    neededLevel = Math.Max(prereq.Level, neededLevel);\n\n                if (recurse && neededLevel < 5 && prereq.Skill.ID != thisID)\n                    // check for neededLevel fixes recursive skill bug (e.g polaris )\n                    prereq.Skill.HasAsPrerequisite(skill, ref neededLevel, true);\n            }\n            return neededLevel > 0;\n        }\n\n        /// <summary>\n        /// Checks whether a certain skill is an immediate prerequisite of this skill,\n        /// and the level needed\n        /// </summary>\n        /// <param name=\"thisSkill\">This skill.</param>\n        /// <param name=\"skill\">Skill that may be an immediate prereq</param>\n        /// <param name=\"neededLevel\">needed level of skill</param>\n        /// <returns>\n        /// Skill gs is an immediate prereq of this skill\n        /// </returns>\n        public static bool HasAsImmediatePrereq(this IStaticSkill thisSkill, IStaticSkill skill, out long neededLevel)\n        {\n            neededLevel = 0;\n            return thisSkill.HasAsPrerequisite(skill, ref neededLevel, false);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Extensions/StaticSkillLevelEnumerableExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Collections;\n\nnamespace EVEMon.Common.Extensions\n{\n    /// <summary>\n    /// Extension methods for objects of <see cref=\"StaticSkillLevel\">StaticSkillLevel</see> objects.\n    /// </summary>\n    public static class StaticSkillLevelEnumerableExtensions\n    {\n        #region Methods on Enumerations of StaticSkillLevel\n\n        /// <summary>\n        /// Returns an equivalent enumeration with character skills.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <param name=\"character\"></param>\n        /// <returns></returns>\n        public static IEnumerable<SkillLevel> ToCharacter(this IEnumerable<StaticSkillLevel> src, Character character)\n            => src.Where(item => item.Skill != null).Select(item => new SkillLevel(character?.\n            Skills[item.Skill.ID] ?? SkillCollection.Skills[item.Skill.ID], item.Level));\n\n        /// <summary>\n        /// Gets all the dependencies, in a way matching the hierachical order and without redudancies.\n        /// I.e, for eidetic memory II, it will return <c>{ instant recall I, instant recall II, instant recall III, instant recall IV,  eidetic memory I, eidetic memory II }</c>.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"includeRoots\">When true, the levels in this enumeration are also included.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public static IEnumerable<StaticSkillLevel> GetAllDependencies(this IEnumerable<StaticSkillLevel> src, bool includeRoots)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            SkillLevelSet<StaticSkillLevel> set = new SkillLevelSet<StaticSkillLevel>();\n            List<StaticSkillLevel> list = new List<StaticSkillLevel>();\n\n            // Fill the set and list\n            foreach (StaticSkillLevel item in src)\n            {\n                list.FillDependencies(set, item, includeRoots);\n            }\n\n            // Return the results\n            return list;\n        }\n\n        /// <summary>\n        /// Add the item, its previous levels and its prerequisites to the given set and list.\n        /// </summary>\n        /// <param name=\"list\">The list.</param>\n        /// <param name=\"set\">The set.</param>\n        /// <param name=\"item\">The item.</param>\n        /// <param name=\"includeRoots\">if set to <c>true</c> [include roots].</param>\n        internal static void FillDependencies(this IList<StaticSkillLevel> list, SkillLevelSet<StaticSkillLevel> set,\n            StaticSkillLevel item, bool includeRoots)\n        {\n            StaticSkill skill = item.Skill;\n\n            // Add first level and prerequisites\n            if (!set.Contains(skill, 1))\n            {\n                // Prerequisites\n                foreach (StaticSkillLevel prereq in skill.Prerequisites.Where(prereq => skill != prereq.Skill))\n                {\n                    list.FillDependencies(set, prereq, true);\n                }\n\n                // Include the first level\n                StaticSkillLevel newItem = new StaticSkillLevel(skill, 1);\n                list.Add(newItem);\n                set.Set(newItem);\n            }\n\n            // Add greater levels\n            long max = includeRoots ? item.Level : item.Level - 1;\n            for (int i = 2; i <= max; i++)\n            {\n                if (set.Contains(skill, i))\n                    continue;\n\n                StaticSkillLevel newItem = new StaticSkillLevel(skill, i);\n                list.Add(newItem);\n                set.Set(newItem);\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Extensions/StringExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Web;\nusing EVEMon.Common.Constants;\n\nnamespace EVEMon.Common.Extensions\n{\n    public static class StringExtensions\n    {\n        // Regular expressions used to speed up string operations.\n        private static readonly Regex s_email = new Regex(@\"^(?(\"\")(\"\"[^\"\"]+?\"\"@)|(([0-9a-z\" +\n            @\"A-Z]((\\.(?!\\.))|[-!#\\$%&'\\*\\+/=\\?\\^`\\{\\}\\|~\\w])*)(?<=[0-9a-zA-Z])@))(?(\\[)(\\[(\" +\n            @\"\\d{1,3}\\.){3}\\d{1,3}\\])|(([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,6}))$\");\n        private static readonly Regex s_removePath = new Regex(@\"[a-zA-Z]+:\\\\.*\\\\(?=EVEMon)\",\n            RegexOptions.Compiled | RegexOptions.IgnoreCase);\n        private static readonly Regex s_unicode = new Regex(@\"\\\\u(?<Value>[a-zA-Z0-9]{4})\",\n            RegexOptions.Compiled);\n        private static readonly Regex s_upperText = new Regex(\"\\\\B([A-Z])\",\n            RegexOptions.Compiled | RegexOptions.CultureInvariant);\n\n        /// <summary>\n        /// Removes the project local path from the text.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns></returns>\n        public static string RemoveProjectLocalPath(this string text) => s_removePath.Replace(\n            text, string.Empty);\n\n        /// <summary>\n        /// Converts a string that has been HTML-encoded for HTTP transmission into a decoded\n        /// string.        \n        /// </summary>\n        /// <param name=\"text\">The string to decode.</param>\n        /// <returns></returns>\n        public static string HtmlDecode(this string text)\n        {\n            string newText;\n            while (text != (newText = HttpUtility.HtmlDecode(text)))\n                text = newText;\n            return text;\n        }\n\n        /// <summary>\n        /// Determines whether the string is of a valid email format.\n        /// </summary>\n        /// <param name=\"strIn\">The string.</param>\n        /// <returns>\n        /// \t<c>true</c> if the string is of a valid email format; otherwise, <c>false</c>.\n        /// </returns>\n        // Return true if strIn is in valid e-mail format\n        public static bool IsValidEmail(this string strIn) => s_email.IsMatch(strIn);\n\n        /// <summary>\n        /// Converts new lines to break lines.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>The text with all \"\\r\", \"\\r\\n\", and \"\\n\" replaced with \"&lt;br&gt;\"</returns>\n        /// <exception cref=\"System.ArgumentNullException\">text</exception>\n        public static string NewLinesToBreakLines(this string text)\n        {\n            text.ThrowIfNull(nameof(text));\n\n            if (string.IsNullOrWhiteSpace(text))\n                return text;\n\n            text = text.Replace(@\"\\r\\n\", Environment.NewLine).Replace(@\"\\r\",\n                Environment.NewLine).Replace(@\"\\n\", Environment.NewLine);\n\n            using (StringReader sr = new StringReader(text))\n            using (StringWriter sw = new StringWriter(CultureConstants.InvariantCulture))\n            {\n                while (sr.Peek() > -1)\n                {\n                    // Read a line from the string and writes it to an internal StringBuilder\n                    // created automatically\n                    sw.Write(sr.ReadLine());\n\n                    // Adds an HTML break line as long as it's not the last line\n                    if (sr.Peek() > -1)\n                        sw.Write(\"<br>\");\n                }\n\n                return sw.GetStringBuilder().ToString();\n            }\n        }\n\n        /// <summary>\n        /// Converts underscores to dashes, meant for getting around limitations on valid\n        /// identifiers for Enum names.\n        /// </summary>\n        /// <param name=\"text\">The text to convert.</param>\n        /// <returns>The text with all \"_\" replaced with \"-\".</returns>\n        /// <exception cref=\"System.ArgumentNullException\">text</exception>\n        public static string UnderscoresToDashes(this string text)\n        {\n            text.ThrowIfNull(nameof(text));\n            return text.Replace('_', '-');\n        }\n\n        /// <summary>\n        /// Converts underscores to spaces, meant for getting around limitations on valid\n        /// identifiers for Enum names.\n        /// </summary>\n        /// <param name=\"text\">The text to convert.</param>\n        /// <returns>The text with all \"_\" replaced with \" \".</returns>\n        /// <exception cref=\"System.ArgumentNullException\">text</exception>\n        public static string UnderscoresToSpaces(this string text)\n        {\n            text.ThrowIfNull(nameof(text));\n            return text.Replace('_', ' ');\n        }\n\n        /// <summary>\n        /// Decodes the unicode characters.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">text</exception>\n        public static string DecodeUnicodeCharacters(this string text)\n        {\n            text.ThrowIfNull(nameof(text));\n            \n            return s_unicode.Replace(text, m => ((char)int.Parse(m.Groups[\"Value\"].Value,\n                NumberStyles.HexNumber, CultureConstants.InvariantCulture)).ToString(\n                CultureConstants.DefaultCulture));\n        }\n\n        /// <summary>\n        /// Converts the upper to lower camel case.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">text</exception>\n        public static string ConvertUpperToLowerCamelCase(this string text)\n        {\n            text.ThrowIfNull(nameof(text));\n\n            return string.Concat(text.Substring(0, 1).ToLowerInvariant(), text.Substring(1,\n                text.Length - 1));\n        }\n\n        /// <summary>\n        /// Converts an upper camel case text to a sentence string.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns></returns>\n        public static string ConvertUpperCamelCaseToString(this string text) => s_upperText.\n            Replace(text.Trim(), \" $1\");\n\n        /// <summary>\n        /// Determines whether the source contains the specified text.\n        /// </summary>\n        /// <param name=\"source\">The source.</param>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"ignoreCase\">if set to <c>true</c> [ignore case].</param>\n        /// <returns></returns>\n        public static bool Contains(this string source, string text, bool ignoreCase = false)\n        {\n            if (!ignoreCase)\n                return source.Contains(text);\n\n            return source.IndexOf(text, StringComparison.OrdinalIgnoreCase) >= 0;\n        }\n\n        /// <summary>\n        /// Returns true if the text is null, empty, or equal to EveMonConstants.UnknownText.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns></returns>\n        public static bool IsEmptyOrUnknown(this string text)\n        {\n            return string.IsNullOrEmpty(text) || text == EveMonConstants.UnknownText;\n        }\n\n        /// <summary>\n        /// Converts the specified string to titlecase.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">text</exception>\n        public static string ToTitleCase(this string text)\n        {\n            text.ThrowIfNull(nameof(text));\n\n            string[] words = text.Split(\" \".ToCharArray());\n            StringBuilder sb = new StringBuilder();\n\n            foreach (string word in words)\n            {\n                if (string.IsNullOrEmpty(word))\n                {\n                    sb.Append(\" \");\n                    continue;\n                }\n\n                sb.Append(string.Concat(word.Substring(0, 1).ToUpperInvariant(),\n                    word.Substring(1, word.Length - 1).ToLowerInvariant()));\n                if (word != words.Last())\n                    sb.Append(\" \");\n            }\n\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Convert an Int32 number to string with the specified decimals.\n        /// </summary>\n        /// <param name=\"number\">The number.</param>\n        /// <param name=\"decimals\">The decimals.</param>\n        /// <param name=\"culture\">The culture.</param>\n        /// <returns></returns>\n        public static string ToNumericString(this int number, int decimals, CultureInfo culture = null)\n            => ToNumericString(Convert.ToInt64(number), decimals, culture);\n\n        /// <summary>\n        /// Convert an Single number to string with the specified decimals.\n        /// </summary>\n        /// <param name=\"number\">The number.</param>\n        /// <param name=\"decimals\">The decimals.</param>\n        /// <param name=\"culture\">The culture.</param>\n        /// <returns></returns>\n        public static string ToNumericString(this float number, int decimals, CultureInfo culture = null)\n            => ToNumericString(Convert.ToDouble(number), decimals, culture);\n\n        /// <summary>\n        /// Convert an Decimal number to string with the specified decimals.\n        /// </summary>\n        /// <param name=\"number\">The number.</param>\n        /// <param name=\"decimals\">The decimals.</param>\n        /// <param name=\"culture\">The culture.</param>\n        /// <returns></returns>\n        public static string ToNumericString(this decimal number, int decimals, CultureInfo culture = null)\n            => ToNumericString(Convert.ToDouble(number), decimals, culture);\n\n        /// <summary>\n        /// Convert an Int64 number to string with the specified decimals.\n        /// </summary>\n        /// <param name=\"number\">The number.</param>\n        /// <param name=\"decimals\">The decimals.</param>\n        /// <param name=\"culture\">The culture.</param>\n        /// <returns></returns>\n        public static string ToNumericString(this long number, int decimals, CultureInfo culture = null)\n        {\n            string decimalsString = string.Format(culture ?? CultureConstants.DefaultCulture, \"N{0}\", decimals);\n            return number.ToString(decimalsString, culture ?? CultureConstants.DefaultCulture);\n        }\n\n        /// <summary>\n        /// Convert an Double number to string with the specified decimals.\n        /// </summary>\n        /// <param name=\"number\">The number.</param>\n        /// <param name=\"decimals\">The decimals.</param>\n        /// <param name=\"culture\">The culture.</param>\n        /// <returns></returns>\n        public static string ToNumericString(this double number, int decimals, CultureInfo culture = null)\n        {\n            string decimalsString = string.Format(culture ?? CultureConstants.DefaultCulture, \"N{0}\", decimals);\n            return number.ToString(decimalsString, culture ?? CultureConstants.DefaultCulture);\n        }\n\n        /// <summary>\n        /// Remove line feeds and some other characters to format the string.\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <param name=\"maxLength\"></param>\n        /// <param name=\"removeNewLine\"> </param>\n        /// <returns></returns>\n        public static string WordWrap(this string text, int maxLength, bool removeNewLine = true)\n        {\n            if (string.IsNullOrWhiteSpace(text))\n                return string.Empty;\n\n            text = removeNewLine ? text.Replace(Environment.NewLine, \" \") :\n                text.Replace(Environment.NewLine, \" \" + Environment.NewLine + \" \");\n\n            text = text.Replace(\".\", \". \");\n            text = text.Replace(\">\", \"> \");\n            text = text.Replace(\"\\t\", \" \");\n            text = text.Replace(\",\", \", \");\n            text = text.Replace(\";\", \"; \");\n\n            string[] words = text.Split(' ');\n            var lines = new LinkedList<string>();\n            int currentLineLength = 0;\n            string currentLine = string.Empty;\n            bool inTag = false;\n\n            foreach (string currentWord in words.Where(currentWord => currentWord.Length > 0))\n            {\n                if (currentWord.Substring(0, 1) == \"<\")\n                    inTag = true;\n\n                if (inTag)\n                {\n                    // Handle filenames inside html tags\n                    if (currentLine.EndsWith(\".\", StringComparison.CurrentCulture))\n                        currentLine += currentWord;\n                    else\n                        currentLine += currentWord + \" \";\n\n                    if (currentWord.IndexOf(\">\", StringComparison.CurrentCulture) > -1)\n                        inTag = false;\n                }\n                else\n                {\n                    if (currentWord != Environment.NewLine && currentLine != Environment.NewLine &&\n                        currentLineLength + currentWord.Length + 1 < maxLength)\n                    {\n                        currentLine += currentWord + \" \";\n                        currentLineLength += currentWord.Length + 1;\n                    }\n                    else\n                    {\n                        lines.AddLast(currentLine.Trim());\n                        currentLine = currentWord + \" \";\n                        currentLineLength = currentWord.Length;\n                    }\n                }\n            }\n\n            if (currentLine.Length != 0)\n                lines.AddLast(currentLine.Trim());\n            \n            return string.Join(Environment.NewLine, lines);\n        }\n\n        /// <summary>\n        /// Pluralizes a string as necessary.\n        /// </summary>\n        /// <param name=\"value\">The value which will be displayed.</param>\n        /// <returns>\"s\" for value > 1, and \"\" otherwise.</returns>\n        public static string S(this int value)\n        {\n            return (value > 1) ? \"s\" : string.Empty;\n        }\n\n        /// <summary>\n        /// Tries to parse a value as an integer, using the invariant culture. If the parameter\n        /// is an invalid number, false will be returned.\n        /// </summary>\n        /// <param name=\"value\">The value to parse. If null or empty, false will be returned.</param>\n        /// <param name=\"result\">The parsed result.</param>\n        /// <returns>true if the parse was successful, or false otherwise</returns>\n        public static bool TryParseInv(this string value, out int result)\n        {\n            return int.TryParse(value, NumberStyles.Integer, CultureConstants.InvariantCulture,\n                out result);\n        }\n\n        /// <summary>\n        /// Tries to parse a value as a long integer, using the invariant culture. If the\n        /// parameter is an invalid number, false will be returned.\n        /// </summary>\n        /// <param name=\"value\">The value to parse. If null or empty, false will be returned.</param>\n        /// <param name=\"result\">The parsed result.</param>\n        /// <returns>true if the parse was successful, or false otherwise</returns>\n        public static bool TryParseInv(this string value, out long result)\n        {\n            return long.TryParse(value, NumberStyles.Integer, CultureConstants.InvariantCulture,\n                out result);\n        }\n\n        /// <summary>\n        /// Tries to parse a value as a single-precision real number, using the invariant\n        /// culture. If the parameter is an invalid number, false will be returned.\n        /// </summary>\n        /// <param name=\"value\">The value to parse. If null or empty, false will be returned.</param>\n        /// <param name=\"result\">The parsed result.</param>\n        /// <returns>true if the parse was successful, or false otherwise</returns>\n        public static bool TryParseInv(this string value, out float result)\n        {\n            return float.TryParse(value, NumberStyles.Float, CultureConstants.\n                InvariantCulture, out result);\n        }\n\n        /// <summary>\n        /// Tries to parse a value as a double-precision real number, using the invariant\n        /// culture. If the parameter is an invalid number, false will be returned.\n        /// </summary>\n        /// <param name=\"value\">The value to parse. If null or empty, false will be returned.</param>\n        /// <param name=\"result\">The parsed result.</param>\n        /// <returns>true if the parse was successful, or false otherwise</returns>\n        public static bool TryParseInv(this string value, out double result)\n        {\n            return double.TryParse(value, NumberStyles.Float, CultureConstants.\n                InvariantCulture, out result);\n        }\n\n        /// <summary>\n        /// Tries to parse a value as a decimal number, using the invariant culture. If the\n        /// parameter is an invalid number, false will be returned.\n        /// </summary>\n        /// <param name=\"value\">The value to parse. If null or empty, false will be returned.</param>\n        /// <param name=\"result\">The parsed result.</param>\n        /// <returns>true if the parse was successful, or false otherwise</returns>\n        public static bool TryParseInv(this string value, out decimal result)\n        {\n            return decimal.TryParse(value, NumberStyles.Float, CultureConstants.\n                InvariantCulture, out result);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Extensions/TimeExtensions.cs",
    "content": "﻿using EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing System;\nusing System.Globalization;\nusing System.Text;\n\nnamespace EVEMon.Common.Extensions\n{\n    public static class TimeExtensions\n    {\n\n        /// <summary>\n        /// Converts a Windows timestamp to <see cref=\"System.DateTime\"/>.\n        /// </summary>\n        /// <param name=\"timestamp\">The timestamp.</param>\n        /// <returns></returns>\n        public static DateTime WinTimeStampToDateTime(this long timestamp)\n            => new DateTime(1601, 1, 1).AddTicks(timestamp);\n\n        /// <summary>\n        /// Converts a Unix timestamp to <see cref=\"System.DateTime\"/>.\n        /// </summary>\n        /// <param name=\"timestamp\">The timestamp.</param>\n        /// <returns></returns>\n        public static DateTime UnixTimeStampToDateTime(this long timestamp) \n            => new DateTime(1970, 1, 1).AddSeconds(timestamp);\n\n        /// <summary>\n        /// Converts a DateTime to the API date/time string.\n        /// </summary>\n        /// <param name=\"time\">The time.</param>\n        /// <param name=\"format\">The format.</param>\n        /// <returns></returns>\n        // 'time' can be any predefined or custom format\n        public static string DateTimeToTimeString(this DateTime time, string format = null)\n            => !string.IsNullOrWhiteSpace(format)\n                ? time.ToString(format, CultureConstants.InvariantCulture.DateTimeFormat)\n                : time.ToString(\"u\", CultureConstants.InvariantCulture.DateTimeFormat).TrimEnd('Z');\n\n        /// <summary>\n        /// Converts an API date/time string to a UTC DateTime.\n        /// </summary>\n        /// <param name=\"timeUtc\"></param>\n        /// <returns></returns>\n        public static DateTime TimeStringToDateTime(this string timeUtc)\n        {\n            // timeUTC = yyyy-MM-dd HH:mm:ss\n            DateTime dt;\n            return DateTime.TryParse(timeUtc, CultureConstants.DefaultCulture.DateTimeFormat,\n                DateTimeStyles.AdjustToUniversal, out dt) ? dt : default(DateTime);\n        }\n\n        /// <summary>\n        /// Converts a DateTime to a dot formatted date/time string.\n        /// </summary>\n        /// <param name=\"time\">The time.</param>\n        /// <returns></returns>\n        /// <remarks>\n        /// String Format: yyyy.MM.dd HH:mm:ss\n        /// </remarks>\n        // time can be any predefined or custom format\n        public static string DateTimeToDotFormattedString(this DateTime time)\n            => time.DateTimeToTimeString().Replace(\"-\", \".\");\n\n        /// <summary>\n        /// Returns a string representation for the time left to the given date, using the following formats : \n        /// <list type=\"bullet\">\n        /// <item>1d 3h 5m 6s</item>\n        /// <item>3h 5m</item>\n        /// <item>Done</item>\n        /// </list>\n        /// </summary>\n        /// <param name=\"t\">The time (in the future) for which you want a span.</param>\n        /// <param name=\"dateTimeKind\">The kind of the dateTime (UTC or Local) being converted.</param>\n        /// <remarks>DateTimeKind.Unspecified will be treated as UTC</remarks>\n        /// <returns></returns>\n        public static string ToRemainingTimeShortDescription(this DateTime t, DateTimeKind dateTimeKind)\n        {\n            DateTime now = dateTimeKind == DateTimeKind.Local ? DateTime.Now : DateTime.UtcNow;\n            if (t <= now)\n                return \"Done\";\n\n            // Fixing the small chance that the method could cross over the\n            // second boundary, and have an inconsistent result.\n            double factor = Math.Pow(10, 7);\n            long roundedTicks = (long)Math.Round(t.Subtract(now).Ticks / factor) * (int)factor;\n            TimeSpan ts = new TimeSpan(roundedTicks);\n\n            return ts.ToDescriptiveText(DescriptiveTextOptions.SpaceBetween);\n        }\n\n        /// <summary>\n        /// Returns a string representation for the time left to the given date, using the following formats : \n        /// <list type=\"bullet\">\n        /// <item>1D 13:00:05</item>\n        /// <item>13:00:05</item>\n        /// <item>00:13:05</item>\n        /// </list>\n        /// </summary>\n        /// <param name=\"t\">The t.</param>\n        /// <param name=\"dateTimeKind\">Kind of the date time.</param>\n        /// <returns></returns>\n        public static string ToRemainingTimeDigitalDescription(this DateTime t, DateTimeKind dateTimeKind)\n        {\n            DateTime now = dateTimeKind == DateTimeKind.Local ? DateTime.Now : DateTime.UtcNow;\n\n            // Small chance that the function could cross over the\n            // second boundry, and have an inconsistent result.\n            StringBuilder sb = new StringBuilder();\n            if (t <= now)\n                return string.Empty;\n\n            double factor = Math.Pow(10, 7);\n            long roundedTicks = (long)Math.Round(t.Subtract(now).Ticks / factor) * (int)factor;\n            TimeSpan ts = new TimeSpan(roundedTicks);\n\n            if (ts.Days > 0)\n            {\n                sb.Append(ts.Days.ToString(CultureConstants.DefaultCulture));\n                sb.Append(\"D \");\n            }\n\n            ts -= TimeSpan.FromDays(ts.Days);\n            sb.Append(ts.Hours.ToString(\"0#\"));\n            sb.Append(\":\");\n\n            ts -= TimeSpan.FromHours(ts.Hours);\n            sb.Append(ts.Minutes.ToString(\"0#\"));\n            sb.Append(\":\");\n\n            ts -= TimeSpan.FromMinutes(ts.Minutes);\n            sb.Append(ts.Seconds.ToString(\"0#\"));\n\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Returns a string representation for the time left to the given date, using the following formats :\n        /// <list type=\"bullet\">\n        /// \t\t<item>2 days, 3 hours, 1 minute, 5seconds</item>\n        /// \t\t<item>3 hours, 1 minute</item>\n        /// \t\t<item>Completed</item>\n        /// \t</list>\n        /// </summary>\n        /// <param name=\"t\">The time (in the future) for which you want a span.</param>\n        /// <param name=\"dateTimeKind\">The kind of the dateTime (UTC or Local) being converted.</param>\n        /// <remarks>DateTimeKind.Unspecified will be treated as UTC</remarks>\n        /// <returns></returns>\n        public static string ToRemainingTimeDescription(this DateTime t, DateTimeKind dateTimeKind)\n        {\n            DateTime now = dateTimeKind == DateTimeKind.Local ? DateTime.Now : DateTime.UtcNow;\n\n            StringBuilder sb = new StringBuilder();\n            if (t <= now)\n                return \"Completed\";\n\n            double factor = Math.Pow(10, 7);\n            long roundedTicks = (long)Math.Round(t.Subtract(now).Ticks / factor) * (int)factor;\n            TimeSpan ts = new TimeSpan(roundedTicks);\n\n            if (ts.Days > 0)\n            {\n                sb.Append(ts.Days.ToString(CultureConstants.DefaultCulture));\n                sb.Append(\" day\");\n                if (ts.Days > 1)\n                    sb.Append(\"s\");\n            }\n            ts -= TimeSpan.FromDays(ts.Days);\n            if (ts.Hours > 0)\n            {\n                if (sb.Length > 0)\n                    sb.Append(\", \");\n\n                sb.Append(ts.Hours.ToString(CultureConstants.DefaultCulture));\n                sb.Append(\" hour\");\n                if (ts.Hours > 1)\n                    sb.Append(\"s\");\n            }\n            ts -= TimeSpan.FromHours(ts.Hours);\n            if (ts.Minutes > 0)\n            {\n                if (sb.Length > 0)\n                    sb.Append(\", \");\n\n                sb.Append(ts.Minutes.ToString(CultureConstants.DefaultCulture));\n                sb.Append(\" minute\");\n                if (ts.Minutes > 1)\n                    sb.Append(\"s\");\n            }\n            ts -= TimeSpan.FromMinutes(ts.Minutes);\n            if (ts.Seconds > 0)\n            {\n                if (sb.Length > 0)\n                    sb.Append(\", \");\n                sb.Append(ts.Seconds.ToString(CultureConstants.DefaultCulture));\n                sb.Append(\" second\");\n                if (ts.Seconds > 1)\n                    sb.Append(\"s\");\n            }\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Generates an absolute string based upon the following format :\n        /// <list type=\"bullet\">\n        /// \t\t<item>17:27 Tomorrow</item>\n        /// \t\t<item>07:43 Wednesday</item>\n        /// \t\t<item>03:12 23/04/2009</item>\n        /// \t</list>\n        /// </summary>\n        /// <param name=\"absoluteDateTime\">The absolute date time.</param>\n        /// <param name=\"dateTimeKind\">The kind of the dateTime (UTC or Local) being converted.</param>\n        /// <remarks>DateTimeKind.Unspecified will be treated as UTC</remarks>\n        /// <returns>String representation of the time and relative date.</returns>\n        public static string ToAbsoluteDateTimeDescription(this DateTime absoluteDateTime, DateTimeKind dateTimeKind)\n        {\n            DateTime now = dateTimeKind == DateTimeKind.Local ? DateTime.Now : DateTime.UtcNow;\n            string shortTime = absoluteDateTime.ToShortTimeString();\n\n            // Yesterday (i.e. before 00:00 today)\n            if (absoluteDateTime.Date == now.Date.AddDays(-1))\n                return $\"{shortTime} Yesterday\";\n\n            // Today (i.e. before 00:00 tomorrow)\n            if (absoluteDateTime.Date == now.Date)\n                return $\"{shortTime} Today\";\n\n            // Tomorrow (i.e. after 23:59 today but before 00:00 the day after tomorrow)\n            DateTime tomorrow = now.Date.AddDays(1);\n            if (absoluteDateTime.Date == tomorrow)\n                return $\"{shortTime} Tomorrow\";\n\n            // After tomorrow but within 7 days\n            DateTime sevenDays = now.Date.AddDays(7);\n            if (absoluteDateTime.Date > tomorrow)\n            {\n                string dayOfWeek = absoluteDateTime.DayOfWeek.ToString();\n                if (absoluteDateTime.Date < sevenDays)\n                    return $\"{shortTime} This {dayOfWeek}\";\n\n                if (absoluteDateTime.Date == sevenDays)\n                    return $\"{shortTime} Next {dayOfWeek}\";\n            }\n\n            // More than seven days away or more than one day ago\n            string shortDate = absoluteDateTime.ToString(\"d\", CultureConstants.DefaultCulture);\n            return $\"{shortTime} {shortDate}\";\n        }\n\n        /// <summary>\n        /// Convert a timespan into English text.\n        /// </summary>\n        /// <param name=\"ts\">The timespan.</param>\n        /// <param name=\"dto\">Formatting options.</param>\n        /// <param name=\"includeSeconds\"></param>\n        /// <returns>Timespan formatted as English text.</returns>\n        public static string ToDescriptiveText(this TimeSpan ts, DescriptiveTextOptions dto, bool includeSeconds = true)\n        {\n            StringBuilder sb = new StringBuilder();\n\n            BuildDescriptiveFragment(sb, ts.Days, dto, \"days\");\n            BuildDescriptiveFragment(sb, ts.Hours, dto, \"hours\");\n            BuildDescriptiveFragment(sb, ts.Minutes, dto, \"minutes\");\n\n            if (includeSeconds)\n                BuildDescriptiveFragment(sb, ts.Seconds, dto, \"seconds\");\n\n            if (sb.Length == 0)\n                sb.Append(\"(none)\");\n\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Builds the string representation for this string, just for one part of the time\n        /// (may be the days, the hours, the mins, etc).\n        /// </summary>\n        /// <param name=\"sb\"></param>\n        /// <param name=\"p\"></param>\n        /// <param name=\"dto\"></param>\n        /// <param name=\"dstr\"></param>\n        private static void BuildDescriptiveFragment(StringBuilder sb, int p, DescriptiveTextOptions dto, string dstr)\n        {\n            if (((dto & DescriptiveTextOptions.IncludeZeroes) == DescriptiveTextOptions.None) && p == 0)\n                return;\n\n            if ((dto & DescriptiveTextOptions.IncludeCommas) != DescriptiveTextOptions.None)\n            {\n                if (sb.Length > 0)\n                    sb.Append(\", \");\n            }\n\n            if ((dto & DescriptiveTextOptions.SpaceBetween) != DescriptiveTextOptions.None)\n            {\n                if (sb.Length > 0)\n                    sb.Append(' ');\n            }\n\n            sb.Append(p.ToString(CultureConstants.DefaultCulture));\n\n            if ((dto & DescriptiveTextOptions.SpaceText) != DescriptiveTextOptions.None)\n                sb.Append(' ');\n\n            if ((dto & DescriptiveTextOptions.FirstLetterUppercase) != DescriptiveTextOptions.None)\n                dstr = char.ToUpper(dstr[0], CultureConstants.DefaultCulture) + dstr.Substring(1);\n\n            if ((dto & DescriptiveTextOptions.UppercaseText) != DescriptiveTextOptions.None)\n                dstr = dstr.ToUpper(CultureConstants.DefaultCulture);\n\n            if ((dto & DescriptiveTextOptions.FullText) != DescriptiveTextOptions.None)\n            {\n                if (p == 1)\n                    dstr = dstr.Substring(0, dstr.Length - 1);\n\n                sb.Append(dstr);\n            }\n            else\n                sb.Append(dstr[0]);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Extensions/WinFormsExtensions.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace EVEMon.Common.Extensions\n{\n    public static class WinFormsExtensions\n    {\n        /// <summary>\n        /// Selects every item in a <c>List</c>.\n        /// </summary>\n        /// <remarks>\n        /// Not recommended for use on a <c>ListView</c> that contains thousands of items.\n        /// </remarks>\n        /// <param name=\"lv\"><c>ListView</c> to select all items in</param>\n        public static void SelectAll(this ListView lv)\n        {\n            if (lv == null)\n                return;\n\n            if (lv.Items.Count == 0)\n                return;\n\n            foreach (ListViewItem item in lv.Items)\n            {\n                item.Selected = true;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/ExternalCalendar/CalendarEvent.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.Common.ExternalCalendar\n{\n    /// <summary>\n    /// Common Appointment Class used for both instances of the calendar.\n    /// </summary>\n    public abstract class CalendarEvent\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CalendarEvent\"/> class.\n        /// </summary>\n        protected CalendarEvent()\n        {\n            StartDate = DateTime.Now;\n            EndDate = DateTime.Now.AddDays(1);\n            Subject = string.Empty;\n            ItemReminder = true;\n            Minutes = 5;\n            AlternateReminder = false;\n            EarlyReminder = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 8, 0, 0);\n            LateReminder = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 20, 0, 0);\n            Events = new ArrayList();\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets Start Date.\n        /// </summary>\n        public DateTime StartDate { get; set; }\n\n        /// <summary>\n        /// Gets or sets End Date.\n        /// </summary>\n        public DateTime EndDate { get; set; }\n\n        /// <summary>\n        /// Gets or sets Subject.\n        /// </summary>\n        public string Subject { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the appointment requires a reminder.\n        /// </summary>\n        public bool ItemReminder { get; set; }\n\n        /// <summary>\n        /// Gets or sets Minutes.\n        /// </summary>\n        public int Minutes { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the appointment uses the Alternate Reminder.\n        /// </summary>\n        public bool AlternateReminder { get; set; }\n\n        /// <summary>\n        /// Gets or sets Early Reminder for alternate reminders.\n        /// </summary>\n        public DateTime EarlyReminder { get; set; }\n\n        /// <summary>\n        /// Gets or sets LateReminder for alternate reminders.\n        /// </summary>\n        public DateTime LateReminder { get; set; }\n\n        /// <summary>\n        /// Gets the number of events.\n        /// </summary>\n        public int ItemCount => Events.Count;\n\n        /// <summary>\n        /// Gets the events.\n        /// </summary>\n        /// <value>\n        /// The events.\n        /// </value>\n        protected ArrayList Events { get; }\n\n        #endregion\n\n\n        #region Abstract Methods\n\n        /// <summary>\n        /// Method to search for any existing event for this skill.\n        /// </summary>\n        internal abstract Task ReadEventsAsync();\n\n        /// <summary>\n        /// Method to get the relevant event item and populate the details.\n        /// </summary>\n        /// <returns>\n        /// \t<c>true</c> if an event is found, <c>false</c> otherwise.\n        /// </returns>\n        internal abstract bool GetEvent();\n\n        /// <summary>\n        /// Add a new appointment or Update the appropriate event in the calendar.\n        /// </summary>\n        /// <param name=\"eventExists\">if set to <c>true</c> the event exists.</param>\n        /// <param name=\"queuePosition\">The queue position.</param>\n        /// <param name=\"lastSkillInQueue\">if set to <c>true</c> skill is the last in queue.</param>\n        internal abstract Task AddOrUpdateEventAsync(bool eventExists, int queuePosition, bool lastSkillInQueue);\n\n        /// <summary>\n        /// Delete the appropriate event.\n        /// </summary>\n        /// <param name=\"eventIndex\">The index of the event.</param>\n        internal abstract Task DeleteEventAsync(int eventIndex);\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Figure out whether the appointment falls within the times set that the users will\n        /// be away from the PC and return the times they have specified.\n        /// </summary>\n        /// <returns>\n        /// The date and time of the relevant reminder.\n        /// </returns>\n        protected DateTime WorkOutAlternateReminders()\n        {\n            // See whether the appointment falls within the middle of the two, it it does, set the early reminder\n            if ((StartDate >= EarlyReminder) && (StartDate <= LateReminder))\n                return EarlyReminder;\n\n            // If the appointment falls outside the two reminders: if the appointment is before the early reminder, set \n            // the late reminder to the day before....\n            if (StartDate >= EarlyReminder)\n                return LateReminder;\n\n            DateTime lateRem = LateReminder;\n            lateRem = lateRem.AddDays(-1);\n            return lateRem;\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/ExternalCalendar/ExternalCalendar.cs",
    "content": "using System;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Exceptions;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing Google;\nusing Google.Apis.Auth.OAuth2.Responses;\n\nnamespace EVEMon.Common.ExternalCalendar\n{\n    public static class ExternalCalendar\n    {\n        /// <summary>\n        /// Gets a value indicating whether MSOutlook is installed.\n        /// </summary>\n        /// <value><c>true</c> if MSOutlook is installed; otherwise, <c>false</c>.</value>\n        public static bool OutlookInstalled => OutlookCalendarEvent.OutlookApplication != null;\n\n        /// <summary>\n        /// Gets true if the Outlook calendar exist.\n        /// </summary>\n        /// <param name=\"useDefaultCalendar\">if set to <c>true</c> [use default].</param>\n        /// <param name=\"path\">The path.</param>\n        /// <returns></returns>\n        public static bool OutlookCalendarExist(bool useDefaultCalendar, string path)\n            => OutlookCalendarEvent.OutlookCalendarExist(useDefaultCalendar, path);\n\n        /// <summary>\n        /// Process the selected character skill queue into the selected calendar.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <exception cref=\"System.ArgumentNullException\">character</exception>\n        public static async Task UpdateCalendar(CCPCharacter character)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            SkillQueue skillQueue = character.SkillQueue;\n\n            foreach (QueuedSkill queuedSkill in skillQueue)\n            {\n                bool lastSkillInQueue = queuedSkill == skillQueue.Last();\n                int queuePosition = skillQueue.IndexOf(queuedSkill) + 1;\n\n                // Continue if user has selected 'Last Queued Skill Only'\n                if (Settings.Calendar.LastQueuedSkillOnly && !lastSkillInQueue)\n                    continue;\n\n                try\n                {\n                    if (Settings.Calendar.Provider == CalendarProvider.Outlook && OutlookInstalled)\n                        await DoOutlookAppointmentAsync(queuedSkill, queuePosition, lastSkillInQueue);\n\n                    if (Settings.Calendar.Provider == CalendarProvider.Google)\n                        await DoGoogleAppointmentAsync(queuedSkill, queuePosition, lastSkillInQueue);\n                }\n                catch (Exception ex)\n                {\n                    ExceptionHandler.LogRethrowException(ex);\n                    throw;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Process the queue into MS Outlook.\n        /// </summary>\n        /// <param name=\"queuedSkill\">The queued skill.</param>\n        /// <param name=\"queuePosition\">The queue position.</param>\n        /// <param name=\"lastSkillInQueue\">if set to <c>true</c> skill is the last in queue.</param>\n        private static async Task DoOutlookAppointmentAsync(QueuedSkill queuedSkill, int queuePosition, bool lastSkillInQueue)\n        {\n            // Get the calendar\n            if (!OutlookCalendarEvent.OutlookCalendarExist(Settings.Calendar.UseOutlookDefaultCalendar))\n            {\n                MessageBox.Show(@\"Outlook calendar does not exist. Please check your settings.\", @\"Outlook Error\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return;\n            }\n\n            // Set the subject to the character name and the skill and level in queue for uniqueness sake\n            OutlookCalendarEvent outlookAppointmentFilter = new OutlookCalendarEvent\n            {\n                StartDate = DateTime.Now.AddDays(-40),\n                EndDate = DateTime.Now.AddDays(100),\n                Subject = string.Format(\n                    CultureConstants.DefaultCulture,\n                    \"{0} - {1} {2}\",\n                    queuedSkill.Owner.Name,\n                    queuedSkill.SkillName,\n                    Skill.GetRomanFromInt(queuedSkill.Level))\n            };\n\n\n            // Pull the list of appointments, hopefully we should either get 1 or none back\n            await outlookAppointmentFilter.ReadEventsAsync();\n\n            // If there is an appointment, get the first one\n            bool foundAppointment = false;\n            if (outlookAppointmentFilter.ItemCount > 0)\n                foundAppointment = outlookAppointmentFilter.GetEvent();\n\n            // Update the appointment we may have pulled or the new one\n            // Set the appointment length to 5 minutes, starting at the estimated completion date and time\n            // Reminder value was already validated\n            // Use the values from the screen as these may differ what the user has set for defaults\n            outlookAppointmentFilter.StartDate = queuedSkill.EndTime.ToLocalTime();\n            outlookAppointmentFilter.EndDate = queuedSkill.EndTime.ToLocalTime().AddMinutes(5);\n            outlookAppointmentFilter.ItemReminder = Settings.Calendar.UseReminding;\n            outlookAppointmentFilter.AlternateReminder = Settings.Calendar.UseAlternateReminding;\n            outlookAppointmentFilter.EarlyReminder = Settings.Calendar.EarlyReminding;\n            outlookAppointmentFilter.LateReminder = Settings.Calendar.LateReminding;\n            outlookAppointmentFilter.Minutes = Settings.Calendar.RemindingInterval;\n\n            await outlookAppointmentFilter.AddOrUpdateEventAsync(foundAppointment, queuePosition, lastSkillInQueue);\n        }\n\n        /// <summary>\n        /// Process the queue into Google calendar.\n        /// </summary>\n        /// <param name=\"queuedSkill\">The queued skill.</param>\n        /// <param name=\"queuePosition\">The queue position.</param>\n        /// <param name=\"lastSkillInQueue\">if set to <c>true</c> skill is the last in queue.</param>\n        private static async Task DoGoogleAppointmentAsync(QueuedSkill queuedSkill, int queuePosition, bool lastSkillInQueue)\n        {\n            try\n            {\n                // Set the subject to the character name and the skill and level in queue for uniqueness sakes\n                GoogleCalendarEvent googleAppointmentFilter = new GoogleCalendarEvent\n                {\n                    StartDate = DateTime.Now.AddDays(-40),\n                    EndDate = DateTime.Now.AddDays(100),\n                    Subject = string.Format(\n                        CultureConstants.DefaultCulture,\n                        \"{0} - {1} {2}\",\n                        queuedSkill.Owner.Name,\n                        queuedSkill.SkillName,\n                        Skill.GetRomanFromInt(queuedSkill.Level))\n                };\n\n                // Pull the list of appointments, hopefully we should either get 1 or none back\n                await googleAppointmentFilter.ReadEventsAsync();\n\n                // If there is are appointments, see if any match the subject\n                bool foundAppointment = false;\n                if (googleAppointmentFilter.ItemCount > 0)\n                    foundAppointment = googleAppointmentFilter.GetEvent();\n\n                // Update the appointment we may have pulled or the new one\n                // Set the appointment length to 5 minutes, starting at the estimated completion date and time\n                // Reminder interval was already validated\n                // Use the values from the screen as these may differ what the user has set for defaults\n                googleAppointmentFilter.StartDate = queuedSkill.EndTime.ToLocalTime();\n                googleAppointmentFilter.EndDate = queuedSkill.EndTime.ToLocalTime().AddMinutes(5);\n                googleAppointmentFilter.ItemReminder = Settings.Calendar.UseReminding;\n                googleAppointmentFilter.AlternateReminder = Settings.Calendar.UseAlternateReminding;\n                googleAppointmentFilter.EarlyReminder = Settings.Calendar.EarlyReminding;\n                googleAppointmentFilter.LateReminder = Settings.Calendar.LateReminding;\n                googleAppointmentFilter.Minutes = Settings.Calendar.RemindingInterval;\n                googleAppointmentFilter.ReminderMethod = Settings.Calendar.GoogleEventReminder;\n\n                await googleAppointmentFilter.AddOrUpdateEventAsync(foundAppointment, queuePosition, lastSkillInQueue);\n            }\n            catch (TokenResponseException ex)\n            {\n                MessageBox.Show(ex.Error.ErrorDescription, @\"Google Calendar\");\n            }\n            catch (GoogleApiException ex)\n            {\n                MessageBox.Show(ex.Error.Message, @\"Google Calendar\");\n            }\n            catch (APIException ex)\n            {\n                MessageBox.Show(ex.Message, ex.ErrorCode ?? @\"Google Calendar\");\n            }\n            catch (Exception ex)\n            {\n                MessageBox.Show(ex.Message, @\"Google Calendar\");\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/ExternalCalendar/GoogleCalendarEvent.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing EVEMon.Common.CloudStorageServices.GoogleDrive;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Exceptions;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.SettingsObjects;\nusing Google;\nusing Google.Apis.Auth.OAuth2;\nusing Google.Apis.Auth.OAuth2.Responses;\nusing Google.Apis.Calendar.v3;\nusing Google.Apis.Calendar.v3.Data;\nusing Google.Apis.Services;\nusing Google.Apis.Util.Store;\n\nnamespace EVEMon.Common.ExternalCalendar\n{\n    /// <summary>\n    /// Class for handling Google calendar.\n    /// </summary>\n    public sealed class GoogleCalendarEvent : CalendarEvent\n    {\n        #region Fields\n\n        /// <summary>\n        /// The maximum of minutes google accepts.\n        /// </summary>\n        private const int MaxGoogleMinutes = 40320;\n\n        /// <summary>\n        /// The Google credential\n        /// </summary>\n        private static UserCredential s_credential;\n\n        /// <summary>\n        /// The calendar identifier\n        /// </summary>\n        private static string s_calendarId;\n\n        /// <summary>\n        /// Determines if the calendar is the primary one\n        /// </summary>\n        private static bool s_isPrimaryCalendar;\n\n        /// <summary>\n        /// The credentials directory\n        /// </summary>\n        private const string CredentialsDirectory = @\".googlecalendar\";\n\n        /// <summary>\n        /// The user identifier\n        /// </summary>\n        private const string UserId = @\"user\";\n\n        #endregion\n\n\n        #region Public Static Properties\n\n        /// <summary>\n        /// Gets the google reminder methods.\n        /// </summary>\n        /// <value>The reminder methods.</value>\n        public static IEnumerable<object> ReminderMethods\n            => Enum.GetValues(typeof(GoogleCalendarReminder))\n                .Cast<Enum>()\n                .Select(item => item.GetDescription());\n\n        #endregion\n\n\n        #region Internal Properties\n\n        /// <summary>\n        /// Gets or sets Reminder Method.\n        /// </summary>\n        internal GoogleCalendarReminder ReminderMethod { private get; set; }\n\n        #endregion\n\n\n        #region Internal Methods\n\n        /// <summary>\n        /// Add a new event or Update the appropriate event in the calendar.\n        /// </summary>\n        /// <param name=\"eventExists\">if set to <c>true</c> the event exists.</param>\n        /// <param name=\"queuePosition\">The queue position.</param>\n        /// <param name=\"lastSkillInQueue\">if set to <c>true</c> skill is the last in queue.</param>\n        internal override async Task AddOrUpdateEventAsync(bool eventExists, int queuePosition, bool lastSkillInQueue)\n        {\n            Event eventItem = eventExists\n                ? (Event)Events[0]\n                : new Event();\n\n            // Set the title and content of the entry\n            eventItem.Summary = Subject;\n            eventItem.Start = new EventDateTime { DateTime = StartDate };\n            eventItem.End = new EventDateTime { DateTime = EndDate };\n            eventItem.Reminders = new Event.RemindersData();\n\n            if (AlternateReminder)\n            {\n                EarlyReminder = new DateTime(StartDate.Year,\n                    StartDate.Month,\n                    StartDate.Day,\n                    EarlyReminder.Hour,\n                    EarlyReminder.Minute,\n                    EarlyReminder.Second);\n\n                LateReminder = new DateTime(StartDate.Year,\n                    StartDate.Month,\n                    StartDate.Day,\n                    LateReminder.Hour,\n                    LateReminder.Minute,\n                    LateReminder.Second);\n\n                // Subtract the reminder time from the event time\n                DateTime dateTimeAlternateReminder = WorkOutAlternateReminders();\n                TimeSpan timeSpan = eventItem.Start.DateTime.GetValueOrDefault().Subtract(dateTimeAlternateReminder);\n                Minutes = Math.Abs(timeSpan.Hours * 60 + timeSpan.Minutes);\n\n                SetGoogleReminder(eventItem);\n            }\n            else if (ItemReminder)\n                SetGoogleReminder(eventItem);\n            else\n                eventItem.Reminders.UseDefault = false;\n\n            using (CalendarService client = await GetClient())\n            {\n                if (eventExists)\n                {\n                    // Update the event\n                    await client.Events.Update(eventItem, await GetCalendarId(), eventItem.Id).ExecuteAsync();\n                }\n                else\n                {\n                    // Send the request and receive the response\n                    await client.Events.Insert(eventItem, await GetCalendarId()).ExecuteAsync();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Get the relevant Google event.\n        /// </summary>\n        /// <returns>\n        /// \t<c>true</c> if an event is found, <c>false</c> otherwise.\n        /// </returns>\n        internal override bool GetEvent()\n        {\n            if (Events.Count < 1)\n                return false;\n\n            Event eventItem = (Event)Events[0];\n            if (!eventItem.Start.DateTime.HasValue || !eventItem.End.DateTime.HasValue)\n                return false;\n\n            StartDate = eventItem.Start.DateTime.Value;\n            EndDate = eventItem.End.DateTime.Value;\n            Subject = eventItem.Summary;\n\n            if (eventItem.Reminders?.Overrides != null)\n            {\n                ItemReminder = true;\n                eventItem.Reminders.UseDefault = true;\n\n                if (!eventItem.Reminders.Overrides.Any())\n                    return true;\n\n                eventItem.Reminders.UseDefault = false;\n                GoogleCalendarReminder reminderMethod;\n                Enum.TryParse(eventItem.Reminders.Overrides.First().Method, out reminderMethod);\n                ReminderMethod = reminderMethod;\n                Minutes = eventItem.Reminders.Overrides.First().Minutes.GetValueOrDefault();\n            }\n            else\n            {\n                ItemReminder = false;\n                Minutes = 10;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Read the Google events.\n        /// </summary>\n        internal override async Task ReadEventsAsync()\n        {\n            Events.Clear();\n\n            using (CalendarService client = await GetClient())\n            {\n                EventsResource.ListRequest request = client.Events.List(await GetCalendarId());\n                request.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime;\n                request.SingleEvents = true;\n                request.ShowDeleted = false;\n                request.TimeMin = StartDate;\n                request.TimeMax = EndDate;\n                request.Q = Subject;\n\n                Events events = await request.ExecuteAsync();\n\n                foreach (Event @event in events.Items\n                    .Where(entry => entry.Summary == Subject))\n                {\n                    Events.Add(@event);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Delete the relevant event.\n        /// </summary>\n        /// <param name=\"eventIndex\">The event index.</param>\n        internal override async Task DeleteEventAsync(int eventIndex)\n        {\n            Event eventItem = (Event)Events[eventIndex];\n\n            using (CalendarService client = await GetClient())\n            {\n                await client.Events.Delete(await GetCalendarId(), eventItem.Id).ExecuteAsync();\n            }\n        }\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Requests the authentication.\n        /// </summary>\n        /// <param name=\"checkAuth\">if set to <c>true</c> [check authentication].</param>\n        /// <returns></returns>\n        public static async Task<SerializableAPIResult<SerializableAPICredentials>> RequestAuth(bool checkAuth = false)\n            => await LogOn(checkAuth);\n\n        /// <summary>\n        /// Revokes the authentication.\n        /// </summary>\n        /// <returns></returns>\n        public static async Task<SerializableAPIResult<SerializableAPICredentials>> RevokeAuth() \n            => await LogOut();\n\n        #endregion\n\n\n        #region Private Methods\n\n        /// <summary>\n        /// Gets the credentials path.\n        /// </summary>\n        /// <param name=\"checkAuth\">if set to <c>true</c> [check authentication].</param>\n        /// <returns></returns>\n        /// <exception cref=\"EVEMon.Common.Exceptions.APIException\"></exception>\n        private static string GetCredentialsPath(bool checkAuth = false)\n        {\n            Configuration configuration =\n                ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);\n\n            string certPath = Directory.GetParent(configuration.FilePath).Parent?.Parent?.FullName;\n\n            bool fileExists = false;\n            if (!string.IsNullOrWhiteSpace(certPath))\n            {\n                certPath = Path.Combine(certPath, CredentialsDirectory);\n                string filePath = Path.Combine(certPath, $\"{typeof(TokenResponse).FullName}-{UserId}\");\n                fileExists = File.Exists(filePath);\n            }\n\n            if (!checkAuth || fileExists)\n                return certPath;\n\n            SerializableAPIError error = new SerializableAPIError\n            {\n                ErrorCode = @\"Authentication required\",\n                ErrorMessage = \"Authentication required.\\n\\n\" +\n                               \"Go to External Calendar options to request authentication.\\n\" +\n                               \"(i.e. Tools > Options... > Scheduler > External Calendar)\"\n            };\n\n            throw new APIException(error);\n        }\n\n        /// <summary>\n        /// Gets the calendar identifier.\n        /// </summary>\n        /// <returns></returns>\n        private static async Task<string> GetCalendarId()\n        {\n            if (s_calendarId != null)\n            {\n                if (string.IsNullOrWhiteSpace(Settings.Calendar.GoogleCalendarName) && s_isPrimaryCalendar)\n                    return s_calendarId;\n\n                if (s_calendarId == Settings.Calendar.GoogleCalendarName)\n                    return s_calendarId;\n            }\n\n            s_isPrimaryCalendar = string.IsNullOrWhiteSpace(Settings.Calendar.GoogleCalendarName);\n            s_calendarId = string.IsNullOrWhiteSpace(Settings.Calendar.GoogleCalendarName)\n                               ? \"primary\"\n                               : Settings.Calendar.GoogleCalendarName;\n\n            using (CalendarService client = await GetClient())\n            {\n                Calendar response = await client.Calendars.Get(s_calendarId).ExecuteAsync();\n                s_calendarId = response.Id;\n            }\n\n            return s_calendarId;\n        }\n\n        /// <summary>\n        /// Determines whether credentials are stored.\n        /// </summary>\n        /// <returns></returns>\n        public static bool HasCredentialsStored()\n        {\n            try\n            {\n                GetCredentialsPath(true);\n            }\n            catch (APIException)\n            {\n                return false;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Logon to Google.\n        /// </summary>\n        /// <param name=\"checkAuth\">if set to <c>true</c> [check authentication].</param>\n        /// <returns></returns>\n        private static async Task<SerializableAPIResult<SerializableAPICredentials>> LogOn(bool checkAuth = false)\n        {\n            SerializableAPIResult<SerializableAPICredentials> result =\n                new SerializableAPIResult<SerializableAPICredentials>();\n\n            if (checkAuth && !HasCredentialsStored())\n                return result;\n\n            var clientSecrets = new ClientSecrets\n            {\n                ClientId = Util.Decrypt(GoogleDriveCloudStorageServiceSettings.Default.AppKey,\n                    CultureConstants.InvariantCulture.NativeName),\n                ClientSecret = Util.Decrypt(GoogleDriveCloudStorageServiceSettings.Default.AppSecret,\n                    CultureConstants.InvariantCulture.NativeName)\n            };\n\n            try\n            {\n                s_credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(clientSecrets,\n                    new[] { CalendarService.Scope.Calendar }, UserId, CancellationToken.None,\n                    new FileDataStore(GetCredentialsPath(checkAuth), true));\n\n                if (checkAuth)\n                {\n                    using (CalendarService client = await GetClient())\n                        await client.Settings.List().ExecuteAsync();\n                }\n            }\n            catch (GoogleApiException exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Error.Message };\n            }\n            catch (TokenResponseException exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Error.ErrorDescription ?? exc.Error.Error };\n            }\n            catch (APIException exc)\n            {\n                result.Error = new SerializableAPIError { ErrorCode = exc.ErrorCode, ErrorMessage = exc.Message };\n            }\n            catch (Exception exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return result;\n        }\n\n        /// <summary>\n        /// Logout from Google.\n        /// </summary>\n        private static async Task<SerializableAPIResult<SerializableAPICredentials>> LogOut()\n        {\n            SerializableAPIResult<SerializableAPICredentials> result =\n                new SerializableAPIResult<SerializableAPICredentials>();\n\n            try\n            {\n                Task<bool> revokeTokenAsync = s_credential?.RevokeTokenAsync(CancellationToken.None);\n                bool success = revokeTokenAsync != null && await revokeTokenAsync;\n\n                if (!success)\n                {\n                    result.Error = new SerializableAPIError { ErrorMessage = \"Unable to revoke authorization\" };\n                }\n            }\n            catch (GoogleApiException exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Error.Message };\n            }\n            catch (TokenResponseException exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Error.ErrorDescription ?? exc.Error.Error };\n            }\n            catch (Exception exc)\n            {\n                result.Error = new SerializableAPIError { ErrorMessage = exc.Message };\n            }\n\n            return result;\n        }\n\n        /// <summary>\n        /// Gets the client.\n        /// </summary>\n        /// <returns></returns>\n        private static async Task<CalendarService> GetClient()\n        {\n            if ((s_credential == null) || !HasCredentialsStored())\n            {\n                GetCredentialsPath(true);\n                await LogOn(true);\n            }\n\n            var initializer = new BaseClientService.Initializer\n            {\n                HttpClientInitializer = s_credential,\n                ApplicationName = EveMonClient.FileVersionInfo.ProductName,\n            };\n\n            return new CalendarService(initializer);\n        }\n\n        /// <summary>\n        /// Sets the goolge reminder.\n        /// </summary>\n        /// <param name=\"eventItem\">The event item.</param>\n        private void SetGoogleReminder(Event eventItem)\n        {\n            eventItem.Reminders.UseDefault = false;\n            eventItem.Reminders.Overrides = eventItem.Reminders.Overrides ?? new List<EventReminder>();\n\n            EventReminder reminder = eventItem.Reminders.Overrides.FirstOrDefault() ?? new EventReminder();\n            reminder.Minutes = Math.Min(Minutes, MaxGoogleMinutes);\n            reminder.Method = ReminderMethod.ToString().ToLowerInvariant();\n\n            eventItem.Reminders.Overrides.Clear();\n            eventItem.Reminders.Overrides.Add(reminder);\n        }\n\n        #endregion\n\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/ExternalCalendar/OutlookCalendarEvent.cs",
    "content": "using System;\nusing System.Collections;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Helpers;\nusing NetOffice.OutlookApi;\nusing NetOffice.OutlookApi.Enums;\n\nnamespace EVEMon.Common.ExternalCalendar\n{\n    /// <summary>\n    /// Class for handling MS Outlook calendar.\n    /// </summary>\n    public sealed class OutlookCalendarEvent : CalendarEvent\n    {\n        private static Application s_outlookApplication;\n        private static MAPIFolder s_mapiFolder;\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the Outlook application.\n        /// </summary>\n        /// <value>The outlook application.</value>\n        internal static Application OutlookApplication\n        {\n            get\n            {\n                try\n                {\n                    if (s_outlookApplication == null)\n                    {\n                        s_outlookApplication = new Application();\n                        s_outlookApplication.QuitEvent += Outlook_Quit;\n                    }\n                }\n                catch (COMException ex)\n                {\n                    ExceptionHandler.LogException(ex, true);\n                }\n                catch (ArgumentException ex)\n                {\n                    ExceptionHandler.LogException(ex, true);\n                }\n                return s_outlookApplication;\n            }\n        }\n\n        #endregion\n\n\n        #region Event Hanlders\n\n        /// <summary>\n        /// Occurs when Outlook quits.\n        /// </summary>\n        private static void Outlook_Quit()\n        {\n            s_outlookApplication.QuitEvent -= Outlook_Quit;\n            s_outlookApplication.Dispose();\n            s_outlookApplication = null;\n            s_mapiFolder = null;\n        }\n\n\n        #endregion\n\n\n        #region Internal Methods\n\n        /// <summary>\n        /// Add a new event or Update the appropriate event in the calendar.\n        /// </summary>\n        /// <param name=\"eventExists\">if set to <c>true</c> the event exists.</param>\n        /// <param name=\"queuePosition\">The queue position.</param>\n        /// <param name=\"lastSkillInQueue\">if set to <c>true</c> skill is the last in queue.</param>\n        internal override Task AddOrUpdateEventAsync(bool eventExists, int queuePosition, bool lastSkillInQueue)\n            => TaskHelper.RunIOBoundTaskAsync(() =>\n            {\n                AppointmentItem eventItem = eventExists\n                    ? (AppointmentItem)Events[0]\n                    : (AppointmentItem)s_mapiFolder.Items.Add(OlItemType.olAppointmentItem);\n\n                eventItem.Subject = Subject;\n                eventItem.Start = StartDate;\n                eventItem.End = EndDate;\n\n                string queuePositionText = lastSkillInQueue\n                    ? \"End Of Queue\"\n                    : queuePosition.ToString(CultureConstants.DefaultCulture);\n\n                eventItem.Body = eventExists\n                    ? $\"{eventItem.Body} {Environment.NewLine}Updated: {DateTime.Now} Queue Position: {queuePositionText}\"\n                    : $\"Added: {DateTime.Now} Queue Position: {queuePositionText}\";\n\n                eventItem.ReminderSet = ItemReminder || AlternateReminder;\n                eventItem.BusyStatus = OlBusyStatus.olBusy;\n                eventItem.AllDayEvent = false;\n                eventItem.Location = string.Empty;\n\n                if (AlternateReminder)\n                {\n                    EarlyReminder = new DateTime(StartDate.Year,\n                        StartDate.Month,\n                        StartDate.Day,\n                        EarlyReminder.Hour,\n                        EarlyReminder.Minute,\n                        EarlyReminder.Second);\n\n                    LateReminder = new DateTime(StartDate.Year,\n                        StartDate.Month,\n                        StartDate.Day,\n                        LateReminder.Hour,\n                        LateReminder.Minute,\n                        LateReminder.Second);\n\n                    DateTime dateTimeAlternateReminder = WorkOutAlternateReminders();\n\n                    // Subtract the reminder time from the event time\n                    TimeSpan timeSpan = eventItem.Start.Subtract(dateTimeAlternateReminder);\n                    eventItem.ReminderMinutesBeforeStart = Math.Abs(timeSpan.Hours * 60 + timeSpan.Minutes);\n                    Minutes = eventItem.ReminderMinutesBeforeStart;\n                }\n\n                eventItem.ReminderMinutesBeforeStart = eventItem.ReminderSet ? Minutes : 0;\n                eventItem.Save();\n            });\n\n        /// <summary>\n        /// Get the relevant event item and populate the details.\n        /// </summary>\n        /// <returns>\n        /// \t<c>true</c> if an event is found, <c>false</c> otherwise.\n        /// </returns>\n        internal override bool GetEvent()\n        {\n            if (Events.Count < 1)\n                return false;\n\n            AppointmentItem eventItem = (AppointmentItem)Events[0];\n            StartDate = eventItem.Start;\n            EndDate = eventItem.End;\n            Subject = eventItem.Subject;\n            ItemReminder = eventItem.ReminderSet;\n            Minutes = eventItem.ReminderMinutesBeforeStart;\n            return true;\n        }\n\n        /// <summary>\n        /// Pull all the events and populate the event array.\n        /// </summary>\n        internal override Task ReadEventsAsync()\n            => TaskHelper.RunIOBoundTaskAsync(() =>\n            {\n                Events.Clear();\n                Events.AddRange(GetEventItems());\n            });\n\n        /// <summary>\n        /// Delete the specified event.\n        /// </summary>\n        /// <param name=\"eventIndex\">The event index.</param>\n        internal override Task DeleteEventAsync(int eventIndex)\n            => TaskHelper.RunIOBoundTaskAsync(() =>\n            {\n                ((AppointmentItem)Events[eventIndex]).Delete();\n            });\n\n        /// <summary>\n        /// Gets true if the Outlook calendar exist.\n        /// </summary>\n        /// <param name=\"useDefaultCalendar\">if set to <c>true</c> [use default calendar].</param>\n        /// <param name=\"path\">The path.</param>\n        /// <returns></returns>\n        internal static bool OutlookCalendarExist(bool useDefaultCalendar, string path = null)\n        {\n            s_mapiFolder = null;\n            return GetMapiFolder(OutlookApplication.Session.Folders, useDefaultCalendar, path);\n        }\n\n        /// <summary>\n        /// Gets the mapi folder.\n        /// </summary>\n        /// <param name=\"folders\">The folders.</param>\n        /// <param name=\"useDefaultCalendar\">if set to <c>true</c> [use default calendar].</param>\n        /// <param name=\"path\">The path.</param>\n        /// <returns></returns>\n        private static bool GetMapiFolder(IEnumerable folders, bool useDefaultCalendar = false, string path = null)\n        {\n            if (useDefaultCalendar)\n            {\n                s_mapiFolder = OutlookApplication.Session.GetDefaultFolder(OlDefaultFolders.olFolderCalendar);\n                return s_mapiFolder != null;\n            }\n\n            if (string.IsNullOrWhiteSpace(path))\n                path = Settings.Calendar.OutlookCustomCalendarPath;\n\n            if (!path.StartsWith(@\"\\\\\", StringComparison.Ordinal))\n                return s_mapiFolder != null;\n\n            string pathRoot = GetFolderPathRoot(path);\n\n            foreach (MAPIFolder folder in folders.Cast<MAPIFolder>().TakeWhile(\n                folder => s_mapiFolder == null).Select(\n                    folder => new { folder, folderRoot = GetFolderPathRoot(folder.FolderPath) }).Where(\n                        folder => folder.folderRoot == pathRoot).Select(folder => folder.folder))\n            {\n                if (folder.DefaultItemType == OlItemType.olAppointmentItem && folder.FolderPath == path)\n                {\n                    s_mapiFolder = folder;\n                    break;\n                }\n\n                if (folder.Folders.Any())\n                    GetMapiFolder(folder.Folders, path: path);\n            }\n\n            return s_mapiFolder != null && s_mapiFolder.FolderPath == path;\n        }\n\n        #endregion\n\n\n        #region Private Methods\n\n        /// <summary>\n        /// Get events matching the subject.\n        /// </summary>\n        /// <returns>\n        /// Array of relevant events or empty array.\n        /// </returns>\n        private ArrayList GetEventItems()\n        {\n            // Use a Jet Query to filter the details we need initially between the two specified dates\n            string dateFilter = $\"[Start] >= '{StartDate:g}' and [End] <= '{EndDate:g}'\";\n            _Items calendarItems = s_mapiFolder.Items.Restrict(dateFilter);\n            calendarItems.Sort(\"[Start]\", Type.Missing);\n            calendarItems.IncludeRecurrences = true;\n\n            // Must use 'like' comparison for Find/FindNext\n            string subjectFilter = !string.IsNullOrEmpty(Subject)\n                ? $\"@SQL=\\\"urn:schemas:httpmail:subject\\\" like '%{Subject.Replace(\"'\", \"''\")}%'\"\n                : \"@SQL=\\\"urn:schemas:httpmail:subject\\\" <> '!@#'\";\n\n            // Use Find and FindNext methods to get all the items\n            ArrayList resultArray = new ArrayList();\n            AppointmentItem eventItem = calendarItems.Find(subjectFilter) as AppointmentItem;\n            while (eventItem != null)\n            {\n                resultArray.Add(eventItem);\n\n                // Find the next event\n                eventItem = calendarItems.FindNext() as AppointmentItem;\n            }\n\n            return resultArray;\n        }\n\n        /// <summary>\n        /// Gets the folder path root.\n        /// </summary>\n        /// <param name=\"folderPath\">The folder path.</param>\n        /// <returns></returns>\n        private static string GetFolderPathRoot(string folderPath)\n        {\n            // Strip header directory seperator characters\n            folderPath = folderPath.Remove(0, 2);\n\n            // Find the index of a directory seperator character\n            int index = folderPath.IndexOf(Path.DirectorySeparatorChar, 0);\n\n            // Reconstruct the root path according to the index found\n            return $\"\\\\{(index > 0 ? folderPath.Substring(0, index) : folderPath)}\";\n        }\n\n        #endregion\n\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Factories/DisposableWithCallback.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Factories\n{\n    /// <summary>\n    /// Implements a disposable pattern which invokes a call back once it is disposed. Use it in a <c>using</c> block.\n    /// </summary>\n    public struct DisposableWithCallback : IDisposable\n    {\n        private readonly Action m_action;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"action\">The callback used when this structure will be disposed</param>\n        public DisposableWithCallback(Action action)\n        {\n            m_action = action;\n        }\n\n        /// <summary>\n        /// Dispose the structure and calls back the specified action\n        /// </summary>\n        public void Dispose()\n        {\n            m_action();\n        }\n\n        /// <summary>\n        /// Performs an action and send back a Disposable which will perform another action once it is disposed. Typically used to make temporary changes through\n        /// the \"using\" pattern.\n        /// </summary>\n        /// <param name=\"push\">The action to perform right now</param>\n        /// <param name=\"pop\">The action to perform once the returned object will be disposed</param>\n        /// <returns>An object implementing IDisposable</returns>\n        /// <exception cref=\"System.ArgumentNullException\">push</exception>\n        public static IDisposable Begin(Action push, Action pop)\n        {\n            push.ThrowIfNull(nameof(push));\n\n            push();\n            return new DisposableWithCallback(pop);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Factories/FontFactory.cs",
    "content": "using System;\nusing System.Drawing;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Common.Factories\n{\n    /// <summary>\n    /// A simple font helper factory.\n    /// </summary>\n    public static class FontFactory\n    {\n        /// <summary>\n        /// Variable to store default font in.\n        /// </summary>\n        /// <remarks>\n        /// DefaultFont is cached for the following reasons:\n        /// 1) improve the display time of the traybar popup.\n        /// 2) remove the 50+ TrueType exceptions which SystemFonts.DefaultFont generates (at least on WinXP).\n        /// </remarks>\n        private static Font s_cachedDefaultFont;\n\n        /// <summary>\n        /// Gets the default font.\n        /// </summary>\n        /// <value>The default font.</value>\n        private static Font DefaultFont => s_cachedDefaultFont ?? (s_cachedDefaultFont = SystemFonts.DefaultFont);\n\n\n        #region Helpers for default font\n\n        /// <summary>\n        /// Gets the default font.\n        /// </summary>\n        /// <returns></returns>\n        public static Font GetDefaultFont() => DefaultFont;\n\n        /// <summary>\n        /// Gets the default font.\n        /// </summary>\n        /// <param name=\"style\">The style.</param>\n        /// <returns></returns>\n        public static Font GetDefaultFont(FontStyle style) => GetDefaultFont(SystemFonts.DefaultFont.Size, style);\n\n        /// <summary>\n        /// Gets the default font.\n        /// </summary>\n        /// <param name=\"emSize\">Size of the em, in the given unit.</param>\n        /// <param name=\"style\">The style.</param>\n        /// <param name=\"unit\">Units for the size : pixels, points, etc. Default should be point.</param>\n        /// <returns></returns>\n        public static Font GetDefaultFont(float emSize, FontStyle style = FontStyle.Regular,\n            GraphicsUnit unit = GraphicsUnit.Point) => GetFont(DefaultFont.FontFamily.Name, emSize, style, unit);\n\n        #endregion\n\n\n        #region Helpers for non-default font\n\n        /// <summary>\n        /// Gets the specified font.\n        /// </summary>\n        /// <param name=\"fontName\">The font's name</param>\n        /// <param name=\"style\">The font's style</param>\n        /// <returns></returns>\n        public static Font GetFont(string fontName, FontStyle style = FontStyle.Regular)\n            => GetFont(fontName, DefaultFont.Size, style, DefaultFont.Unit);\n\n        /// <summary>\n        /// Gets the specified font.\n        /// </summary>\n        /// <param name=\"prototype\">The font's prototype this font will be based on</param>\n        /// <param name=\"style\">The overriden style.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">prototype</exception>\n        public static Font GetFont(Font prototype, FontStyle style = FontStyle.Regular)\n        {\n            prototype.ThrowIfNull(nameof(prototype));\n\n            return GetFont(prototype.FontFamily.Name, prototype.Size, style, prototype.Unit);\n        }\n\n        /// <summary>\n        /// Gets the specified font.\n        /// </summary>\n        /// <param name=\"family\">The font's family</param>\n        /// <param name=\"emSize\">Size of the font, in the provided unit.</param>\n        /// <param name=\"style\">The font's style.</param>\n        /// <param name=\"unit\">The unit to use for the given size (points, pixels, etc)</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">family</exception>\n        public static Font GetFont(FontFamily family, float emSize, FontStyle style = FontStyle.Regular,\n            GraphicsUnit unit = GraphicsUnit.Point)\n        {\n            family.ThrowIfNull(nameof(family));\n\n            return GetFont(family.Name, emSize, style, unit);\n        }\n\n        #endregion\n\n\n        /// <summary>\n        /// Gets the specified font.\n        /// </summary>\n        /// <param name=\"familyName\">The font's family</param>\n        /// <param name=\"emSize\">Size of the font, in the given unit.</param>\n        /// <param name=\"style\">The font's style.</param>\n        /// <param name=\"unit\">Units for the size : pixels, points, etc. Default is point.</param>\n        /// <returns></returns>\n        public static Font GetFont(string familyName, float emSize, FontStyle style = FontStyle.Regular,\n            GraphicsUnit unit = GraphicsUnit.Point)\n        {\n            try\n            {\n                FontFamily family = null;\n                try\n                {\n                    try\n                    {\n                        // Initial try\n                        family = new FontFamily(familyName); // Will accept anything and won't throw an error\n                        return new Font(familyName, emSize, style, unit);\n                    }\n                    catch (ArgumentException e)\n                    {\n                        // First fallback : default family\n                        ExceptionHandler.LogException(e, true);\n                        return new Font(DefaultFont.FontFamily, emSize, style, unit);\n                    }\n                }\n                catch (ArgumentException e)\n                {\n                    // Second fallback : default family and style\n                    ExceptionHandler.LogException(e, true);\n                    family = family ?? DefaultFont.FontFamily;\n                    return new Font(family, emSize, DefaultFont.Style, unit);\n                }\n                finally\n                {\n                    family?.Dispose();\n                }\n            }\n            catch (ArgumentException e)\n            {\n                // Third fallback : all to default\n                ExceptionHandler.LogException(e, true);\n                return DefaultFont;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Factories/WindowsFactory.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Windows.Forms;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Common.Factories\n{\n    /// <summary>\n    /// This factory allows us keep unique instances of \n    /// </summary>\n    public static class WindowsFactory\n    {\n        private static readonly object s_syncLock = new object();\n        private static readonly List<Form> s_taggedWindows = new List<Form>();\n        private static readonly List<Form> s_uniqueWindows = new List<Form>();\n\n        /// <summary>\n        /// Gets the window displayed as unique if it exists, null otherwise.\n        /// </summary>\n        /// <returns></returns>\n        public static TForm GetUnique<TForm>()\n            where TForm : Form\n        {\n            lock (s_syncLock)\n            {\n                return s_uniqueWindows.OfType<TForm>()\n                    .FirstOrDefault(uniqueWindow => uniqueWindow != null && !uniqueWindow.IsDisposed);\n            }\n        }\n\n        /// <summary>\n        /// Show the unique window. \n        /// When none exist, it is created using the default constructor.\n        /// When it already exists, it is bringed to front, or show when hidden.\n        /// </summary>\n        /// <returns></returns>\n        public static TForm ShowUnique<TForm>()\n            where TForm : Form\n            => ShowUnique(Activator.CreateInstance<TForm>);\n\n        /// <summary>\n        /// Show the unique window.\n        /// When none exist, it is created using the provided callback.\n        /// When it already exists, it is bringed to front, or show when hidden.\n        /// </summary>\n        /// <typeparam name=\"TForm\"></typeparam>\n        /// <param name=\"creation\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">creation</exception>\n        private static TForm ShowUnique<TForm>(Func<TForm> creation)\n            where TForm : Form\n        {\n            creation.ThrowIfNull(nameof(creation));\n\n            lock (s_syncLock)\n            {\n                try\n                {\n                    // Does it already exist ?\n                    foreach (TForm existingUniqueWindow in s_uniqueWindows.OfType<TForm>()\n                        .Where(existingUniqueWindow => existingUniqueWindow != null && !existingUniqueWindow.IsDisposed))\n                    {\n                        // Bring to front or show\n                        if (existingUniqueWindow.Visible)\n                            existingUniqueWindow.BringToFront();\n                        else\n                            existingUniqueWindow.Show();\n\n                        // Give focus and return\n                        existingUniqueWindow.Activate();\n                        return existingUniqueWindow;\n                    }\n                }\n                    // Catch exception when the window is being disposed\n                catch (ObjectDisposedException ex)\n                {\n                    ExceptionHandler.LogException(ex, true);\n                }\n\n                // Create the window and subscribe to its closing for cleanup\n                TForm uniqueWindow = creation.Invoke();\n                uniqueWindow.Disposed += (sender, args) =>\n                {\n                    lock (s_syncLock)\n                    {\n                        s_uniqueWindows.Remove((TForm)sender);\n                    }\n                };\n                s_uniqueWindows.Add(uniqueWindow);\n\n                // Show and return\n                uniqueWindow.Show();\n                return uniqueWindow;\n            }\n        }\n\n        /// <summary>\n        /// Changes the tag of a stored window.\n        /// Usually used to switch the tag of a plan window.\n        /// </summary>\n        /// <typeparam name=\"TForm\">The type of the form.</typeparam>\n        /// <typeparam name=\"TTag1\">The type of the tag1.</typeparam>\n        /// <typeparam name=\"TTag2\">The type of the tag2.</typeparam>\n        /// <param name=\"oldTag\">The old tag.</param>\n        /// <param name=\"newTag\">The new tag.</param>\n        public static void ChangeTag<TForm, TTag1, TTag2>(TTag1 oldTag, TTag2 newTag)\n            where TForm : Form\n            where TTag1 : class\n            where TTag2 : class\n        {\n            lock (s_syncLock)\n            {\n                TForm taggedWindow = GetByTag<TForm, TTag1>(oldTag);\n                taggedWindow.Tag = newTag;\n            }\n        }\n\n        /// <summary>\n        /// Gets the existing form associated with the given tag.\n        /// </summary>\n        /// <typeparam name=\"TForm\"></typeparam>\n        /// <typeparam name=\"TTag\"></typeparam>\n        /// <param name=\"tag\"></param>\n        /// <returns></returns>\n        public static TForm GetByTag<TForm, TTag>(TTag tag)\n            where TForm : Form\n            where TTag : class\n        {\n            object otag = tag;\n\n            lock (s_syncLock)\n            {\n                return s_taggedWindows.OfType<TForm>()\n                    .FirstOrDefault(existingWindow => existingWindow.Tag == otag && !existingWindow.IsDisposed);\n            }\n        }\n\n        /// <summary>\n        /// Show the window with the given owner and tag.\n        /// When none exist, it is created using the public constructor accepting an argument of type <see cref=\"TTag\" />,\n        /// or the default constructor if the previous one does not exist.\n        /// When it already exists, it is brought to front, or shown when hidden.\n        /// </summary>\n        /// <typeparam name=\"TForm\">The type of the form.</typeparam>\n        /// <typeparam name=\"TTag\">The type of the tag.</typeparam>\n        /// <param name=\"owner\">The owner.</param>\n        /// <param name=\"tag\">The tag.</param>\n        /// <param name=\"args\">The arguments.</param>\n        /// <returns></returns>\n        public static TForm ShowByTag<TForm, TTag>(IWin32Window owner, TTag tag, params object[] args)\n            where TForm : Form\n            where TTag : class\n            => ShowByTag(owner, tag, Create<TForm>, args);\n\n        /// <summary>\n        /// Show the window with the given tag.\n        /// When none exist, it is created using the public constructor accepting an argument of type <see cref=\"TTag\"/>,\n        /// or the default constructor if the previous one does not exist.\n        /// When it already exists, it is brought to front, or shown when hidden.\n        /// </summary>\n        /// <typeparam name=\"TForm\">The type of the form.</typeparam>\n        /// <typeparam name=\"TTag\">The type of the tag.</typeparam>\n        /// <param name=\"tag\">The tag.</param>\n        /// <param name=\"args\">The arguments.</param>\n        /// <returns></returns>\n        public static TForm ShowByTag<TForm, TTag>(TTag tag, params object[] args)\n            where TForm : Form\n            where TTag : class\n            => ShowByTag(null, tag, Create<TForm>, args);\n\n        /// <summary>\n        /// Show the window with the given tag.\n        /// When none exist, it is created using the provided callback, and the provided tag is then associated with it.\n        /// When it already exists, it is brought to front, or shown when hidden.\n        /// </summary>\n        /// <typeparam name=\"TForm\">The type of the form.</typeparam>\n        /// <typeparam name=\"TTag\">The type of the tag.</typeparam>\n        /// <param name=\"owner\">The owner.</param>\n        /// <param name=\"tag\">The tag.</param>\n        /// <param name=\"creation\">The creation.</param>\n        /// <param name=\"pars\">The parameters.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">\n        /// tag\n        /// or\n        /// creation\n        /// </exception>\n        private static TForm ShowByTag<TForm, TTag>(IWin32Window owner, TTag tag, Func<object[], TForm> creation, IEnumerable<object> pars)\n            where TForm : Form\n            where TTag : class\n        {\n            tag.ThrowIfNull(nameof(tag));\n\n            creation.ThrowIfNull(nameof(creation));\n\n            object otag = tag;\n\n            lock (s_syncLock)\n            {\n                // Does it already exist ?\n                foreach (TForm existingWindow in s_taggedWindows.OfType<TForm>()\n                    .Where(existingWindow => existingWindow.Tag == otag && !existingWindow.IsDisposed))\n                {\n                    try\n                    {\n                        // Bring to front or show\n                        if (existingWindow.Visible)\n                            existingWindow.BringToFront();\n                        else\n                        {\n                            if (owner != null)\n                                existingWindow.Show(owner);\n                            else\n                                existingWindow.Show();\n                        }\n\n                        // Give focus and return\n                        existingWindow.Activate();\n                        return existingWindow;\n                    }\n                        // Catch exception when the window was disposed\n                    catch (ObjectDisposedException ex)\n                    {\n                        ExceptionHandler.LogException(ex, true);\n                    }\n                }\n\n                // Combine the tag parameter with the rest\n                // Always put the tag parameter first\n                object[] parameters = new[] { tag }.Concat(pars).ToArray();\n\n                // Create the window and attach the tag\n                TForm window = creation.Invoke(parameters);\n                window.Tag = otag;\n\n                // Store it and subscribe to closing for clean up\n                s_taggedWindows.Add(window);\n                window.Disposed += (sender, args) =>\n                {\n                    lock (s_syncLock)\n                    {\n                        s_taggedWindows.Remove((TForm)sender);\n                    }\n                };\n\n                // Show and return\n                if (owner != null)\n                    window.Show(owner);\n                else\n                    window.Show();\n                return window;\n            }\n        }\n\n        /// <summary>\n        /// Call the public constructor with the provided arguments.\n        /// </summary>\n        /// <typeparam name=\"TForm\"></typeparam>\n        /// <param name=\"args\"></param>\n        /// <returns></returns>\n        private static TForm Create<TForm>(object[] args)\n            where TForm : Form\n        {\n            // Search for a public instance constructor with the specified arguments\n            // If no constructor found, use the default constructor\n            ConstructorInfo ctor = typeof(TForm).GetConstructor(args.Select(arg => arg.GetType()).ToArray());\n            return (TForm)ctor?.Invoke(args) ?? Activator.CreateInstance<TForm>();\n        }\n\n        /// <summary>\n        /// Close the window with the given tag.\n        /// </summary>\n        /// <typeparam name=\"TForm\"></typeparam>\n        /// <typeparam name=\"TTag\"></typeparam>\n        /// <param name=\"form\"></param>\n        /// <param name=\"tag\"></param>\n        private static void CloseByTag<TForm, TTag>(TForm form, TTag tag)\n            where TForm : Form\n            where TTag : class\n        {\n            object otag = tag;\n\n            lock (s_syncLock)\n            {\n                // While we find windows to close...\n                while (true)\n                {\n                    // Search all the disposed windows or windows with the same tag\n                    bool isDisposed = false;\n                    TForm formToRemove = null;\n                    foreach (TForm existingWindow in s_taggedWindows\n                        .Where(taggedWindow => taggedWindow == form).Cast<TForm>())\n                    {\n                        try\n                        {\n                            if (existingWindow.Tag != otag)\n                                continue;\n\n                            formToRemove = existingWindow;\n                            break;\n                        }\n                            // Catch exception when the window was disposed - we will remove it also by the way\n                        catch (ObjectDisposedException ex)\n                        {\n                            ExceptionHandler.LogException(ex, true);\n                            formToRemove = existingWindow;\n                            isDisposed = true;\n                        }\n                    }\n\n                    // Returns if nothing found on this cycle\n                    if (formToRemove == null)\n                        return;\n\n                    if (isDisposed)\n                        s_taggedWindows.Remove(formToRemove);\n                    else\n                        formToRemove.Close();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets and closes the window with the given tag.\n        /// </summary>\n        /// <typeparam name=\"TForm\">The type of the form.</typeparam>\n        /// <typeparam name=\"TTag\">The type of the tag.</typeparam>\n        /// <param name=\"tag\">The tag.</param>\n        public static void GetAndCloseByTag<TForm, TTag>(TTag tag)\n            where TForm : Form\n            where TTag : class\n        {\n            TForm window = GetByTag<TForm, TTag>(tag);\n\n            if (window != null)\n                CloseByTag(window, tag);\n        }\n\n        /// <summary>\n        /// Closes all tagged windows.\n        /// </summary>\n        public static void CloseAllTagged()\n        {\n            lock (s_syncLock)\n            {\n                List<Form> formsToClose = s_taggedWindows.ToList();\n                foreach (Form existingWindow in formsToClose.Where(form => !form.IsDisposed))\n                {\n                    existingWindow.Close();\n                }\n                s_taggedWindows.Clear();\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage \n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given \n// a specific target and scoped to a namespace, type, member, etc.\n//\n// To add a suppression to this file, right-click the message in the \n// Error List, point to \"Suppress Message(s)\", and click \n// \"In Project Suppression File\".\n// You do not need to add suppressions to this file manually.\n\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1704:IdentifiersShouldBeSpelledCorrectly\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1702:CompoundWordsShouldBeCasedCorrectly\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1707:IdentifiersShouldNotContainUnderscores\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1703:ResourceStringsShouldBeSpelledCorrectly\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1020:AvoidNamespacesWithFewTypes\", Scope = \"namespace\", Target = \"EVEMon.Common.Models.Extended\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1020:AvoidNamespacesWithFewTypes\", Scope = \"namespace\", Target = \"EVEMon.Common.Serialization.PatchXml\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA2210:AssembliesShouldHaveValidStrongNames\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1014:MarkAssembliesWithClsCompliant\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1703:ResourceStringsShouldBeSpelledCorrectly\", MessageId = \"Killlog\", Scope = \"resource\", Target = \"EVEMon.Common.Constants.NetworkConstants.resources\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1703:ResourceStringsShouldBeSpelledCorrectly\", MessageId = \"Howtowriteanusefulbugreport\", Scope = \"resource\", Target = \"EVEMon.Common.Constants.NetworkConstants.resources\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1703:ResourceStringsShouldBeSpelledCorrectly\", MessageId = \"Fac\", Scope = \"resource\", Target = \"EVEMon.Common.Constants.NetworkConstants.resources\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1020:AvoidNamespacesWithFewTypes\", Scope = \"namespace\", Target = \"EVEMon.Common.MarketPricer\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1020:AvoidNamespacesWithFewTypes\", Scope = \"namespace\", Target = \"EVEMon.Common.Factories\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1020:AvoidNamespacesWithFewTypes\", Scope = \"namespace\", Target = \"EVEMon.Common.ExternalCalendar\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1020:AvoidNamespacesWithFewTypes\", Scope = \"namespace\", Target = \"EVEMon.Common.Controls.MultiPanel\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1716:IdentifiersShouldNotMatchKeywords\", MessageId = \"Global\", Scope = \"namespace\", Target = \"EVEMon.Common.Collections.Global\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1020:AvoidNamespacesWithFewTypes\", Scope = \"namespace\", Target = \"EVEMon.Common.Attributes\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\", Scope = \"member\", Target = \"EVEMon.Common.Threading.Actor.#DoWork()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Login\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.API.APICCPError.#IsLoginDeniedByAccountStatus\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA2217:DoNotMarkEnumsWithFlags\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.API.APICharacterMethods\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1717:OnlyFlagsEnumsShouldHavePluralNames\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.API.APIGenericMethods\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1721:PropertyNamesShouldNotMatchGetMethods\", Scope = \"member\", Target = \"EVEMon.Common.Models.APIKey.#Type\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1021:AvoidOutParameters\", MessageId = \"0#\", Scope = \"member\", Target = \"EVEMon.Common.Models.APIKey.#HasCharactersNotTraining(System.String&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1721:PropertyNamesShouldNotMatchGetMethods\", Scope = \"member\", Target = \"EVEMon.Common.CustomEventArgs.APIKeyCreationEventArgs.#Type\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1714:FlagsEnumsShouldHavePluralNames\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.API.APIMethodsEnum\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1711:IdentifiersShouldNotHaveIncorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.API.APIMethodsEnum\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA2217:DoNotMarkEnumsWithFlags\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.API.APIMethodsEnum\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\", Scope = \"member\", Target = \"EVEMon.Common.Models.APIProvider.#QueryMethod`1(System.Enum,System.String,System.Xml.Xsl.XslCompiledTransform)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.ApiTesterUIHelper.#SaveDocument(System.String,System.Xml.XPath.IXPathNavigable)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.ApiTesterUIHelper.#SaveDocument(System.String,System.Xml.XPath.IXPathNavigable)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.ApiTesterUIHelper.#SaveDocument(System.String,System.Xml.XPath.IXPathNavigable)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Flag\", Scope = \"member\", Target = \"EVEMon.Common.Models.Asset.#Flag\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Flag\", Scope = \"member\", Target = \"EVEMon.Common.SettingsObjects.AssetColumn.#Flag\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1721:PropertyNamesShouldNotMatchGetMethods\", Scope = \"member\", Target = \"EVEMon.Common.Models.BaseCharacter.#SkillPoints\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Models.BaseCharacter.#GetTrainingTime(EVEMon.Common.Data.StaticSkill,System.Int64,EVEMon.Common.Enumerations.TrainingOrigin)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Collections.BaseList`1\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1045:DoNotPassTypesByReference\", MessageId = \"0#\", Scope = \"member\", Target = \"EVEMon.Common.Collections.BaseList`1.#OnAdding(!0&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Models.BasePlan\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1021:AvoidOutParameters\", MessageId = \"2#\", Scope = \"member\", Target = \"EVEMon.Common.Models.BasePlan.#GetAllEntriesToAdd`1(System.Collections.Generic.IEnumerable`1<!!0>,System.String,System.Int32&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Title(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.BlankCharacterUIHelper.#Save(System.Action)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.BlankCharacterUIHelper.#Save(System.Action)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1006:DoNotNestGenericTypesInMemberSignatures\", Scope = \"member\", Target = \"EVEMon.Common.Data.Blueprint.#InventBlueprints\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"member\", Target = \"EVEMon.Common.Models.CCPCharacter.#.ctor(EVEMon.Common.Models.CharacterIdentity,System.Guid)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1008:EnumsShouldHaveZeroValue\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.API.CCPJobCompletedStatus\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1720:IdentifiersShouldNotContainTypeNames\", MessageId = \"guid\", Scope = \"member\", Target = \"EVEMon.Common.Models.Character.#.ctor(EVEMon.Common.Models.CharacterIdentity,System.Guid)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1711:IdentifiersShouldNotHaveIncorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Models.CharacterAttribute\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1815:OverrideEqualsAndOperatorEqualsOnValueTypes\", Scope = \"type\", Target = \"EVEMon.Common.Models.Comparers.CharacterComparer\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"member\", Target = \"EVEMon.Common.QueryMonitor.CharacterDataQuerying.#.ctor(EVEMon.Common.Models.CCPCharacter)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.CharacterExporter.#Export(EVEMon.Common.Helpers.CharacterSaveFormat,EVEMon.Common.Models.Character,EVEMon.Common.Models.Plan)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Models.Collections.CharacterIdentityIgnoreList\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Controls.CharacterPortrait.#UpdateCharacterFromEVECache()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.CharacterPortrait.#UpdateCharacterFromEVECache()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.CharacterPortrait.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1721:PropertyNamesShouldNotMatchGetMethods\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.CharacterScratchpad.#TrainingTime\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1062:Validate arguments of public methods\", MessageId = \"0\", Scope = \"member\", Target = \"EVEMon.Common.Controls.CheckedComboBox+CustomCheckedListBox.#OnKeyDown(System.Windows.Forms.KeyEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1062:Validate arguments of public methods\", MessageId = \"0\", Scope = \"member\", Target = \"EVEMon.Common.Controls.CheckedComboBox+CustomCheckedListBox.#OnMouseMove(System.Windows.Forms.MouseEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1034:NestedTypesShouldNotBeVisible\", Scope = \"type\", Target = \"EVEMon.Common.Controls.CheckedComboBox+CheckedComboBoxTextBuilderDelegate\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1711:IdentifiersShouldNotHaveIncorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Controls.CheckedComboBox+CheckedComboBoxTextBuilderDelegate\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Indices\", Scope = \"member\", Target = \"EVEMon.Common.Controls.CheckedComboBox.#CheckedIndices\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.ColumnSelectWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Models.ConquerableStation\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1036:OverrideMethodsOnComparableTypes\", Scope = \"type\", Target = \"EVEMon.Common.Data.Constellation\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Data.Constellation\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1823:AvoidUnusedPrivateFields\", Scope = \"member\", Target = \"EVEMon.Common.Models.Collections.ContactCollection.#m_character\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.Common.Models.Comparers.ContractComparer.#CompareCore(EVEMon.Common.Models.Contract,EVEMon.Common.Models.Contract)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.CopySaveOptionsWindow.#CopySaveOptionsWindow_Load(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.CopySaveOptionsWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1708:IdentifiersShouldDifferByMoreThanCase\", Scope = \"type\", Target = \"EVEMon.Common.Controls.CustomComboBox\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1307:SpecifyStringComparison\", MessageId = \"System.String.CompareTo(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.CustomComboBox+Dropdown.#ValueChanged\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1011:ConsiderPassingBaseTypesAsParameters\", Scope = \"member\", Target = \"EVEMon.Common.Controls.CustomComboBox+Dropdown.#ForceDeactivate(EVEMon.Common.Controls.CustomComboBox+CustomComboBoxEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.Common.Controls.CustomComboBox.#dropdown\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1024:UsePropertiesWhereAppropriate\", Scope = \"member\", Target = \"EVEMon.Common.Controls.CustomComboBox.#GetTextValue()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.CustomComboBox.#UpdateToolTip()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1720:IdentifiersShouldNotContainTypeNames\", MessageId = \"long\", Scope = \"member\", Target = \"EVEMon.Common.Constants.DBConstants.#LongRangeTargetingSkillID\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1720:IdentifiersShouldNotContainTypeNames\", MessageId = \"object\", Scope = \"member\", Target = \"EVEMon.Common.Threading.Dispatcher.#BackgroundInvoke(System.Action,System.AsyncCallback,System.Object)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1815:OverrideEqualsAndOperatorEqualsOnValueTypes\", Scope = \"type\", Target = \"EVEMon.Common.Factories.DisposableWithCallback\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"cancelled\", Scope = \"member\", Target = \"EVEMon.Common.Net.DownloadFileAsyncResult.#.ctor(System.IO.FileInfo,EVEMon.Common.Net.HttpWebServiceException,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Cancelled\", Scope = \"member\", Target = \"EVEMon.Common.Net.DownloadFileAsyncResult.#Cancelled\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA1801:ReviewUnusedParameters\", MessageId = \"value\", Scope = \"member\", Target = \"EVEMon.Common.Controls.DraggableListView.#Sorting\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1725:ParameterNamesShouldMatchBaseDeclaration\", MessageId = \"0#\", Scope = \"member\", Target = \"EVEMon.Common.Controls.DraggableListView.#OnDragDrop(System.Windows.Forms.DragEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1725:ParameterNamesShouldMatchBaseDeclaration\", MessageId = \"0#\", Scope = \"member\", Target = \"EVEMon.Common.Controls.DraggableListView.#OnDragOver(System.Windows.Forms.DragEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1725:ParameterNamesShouldMatchBaseDeclaration\", MessageId = \"0#\", Scope = \"member\", Target = \"EVEMon.Common.Controls.DraggableListView.#OnDragEnter(System.Windows.Forms.DragEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\", Scope = \"member\", Target = \"EVEMon.Common.Controls.DraggableTabControl+InsertionMarker.#Reversed\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Service.Emailer.#SendCompleted(System.Object,System.ComponentModel.AsyncCompletedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.Service.Emailer.#SendCompleted(System.Object,System.ComponentModel.AsyncCompletedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.Service.Emailer.#SendCompleted(System.Object,System.ComponentModel.AsyncCompletedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1823:AvoidUnusedPrivateFields\", Scope = \"member\", Target = \"EVEMon.Common.Models.EmploymentRecord.#m_character\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1720:IdentifiersShouldNotContainTypeNames\", MessageId = \"obj\", Scope = \"member\", Target = \"EVEMon.Common.Enforce.#Implementation`1(System.Object)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1717:OnlyFlagsEnumsShouldHavePluralNames\", Scope = \"type\", Target = \"EVEMon.Common.SettingsObjects.PortraitSizes\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1717:OnlyFlagsEnumsShouldHavePluralNames\", Scope = \"type\", Target = \"EVEMon.Common.SettingsObjects.TrayPopupStyles\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1711:IdentifiersShouldNotHaveIncorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.EveAttribute\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Flag\", Scope = \"type\", Target = \"EVEMon.Common.Service.EveFlag\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.EveFolderWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FolderBrowserDialog.set_Description(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.EveFolderWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1810:InitializeReferenceTypeStaticFieldsInline\", Scope = \"member\", Target = \"EVEMon.Common.Service.EveIDToName.#.cctor()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Mobility\", \"CA1601:DoNotUseTimersThatPreventPowerStateChanges\", Scope = \"member\", Target = \"EVEMon.Common.Controls.EveImage.#.ctor()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolTip.SetToolTip(System.Windows.Forms.Control,System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.EveImage.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.Controls.EveImagePopUp.#OnLoad(System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.EveImagePopUp.#OnLoad(System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EveImagePopUp\", Scope = \"member\", Target = \"EVEMon.Common.Controls.EveImagePopUp.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.EveImagePopUp.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1714:FlagsEnumsShouldHavePluralNames\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.EveImageSize\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.Common.EveMonClient\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.EveMonClient.#InitializeFileSystemPaths()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.EveMonClient.#InitializeFileSystemPaths()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.EveMonClient.#InitializeFileSystemPaths()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.EveMonClient.#StartTraceLogging()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.EveMonClient.#StartTraceLogging()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.EveMonClient.#StartTraceLogging()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.Controls.EVEMonForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.EVEMonForm.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1305:SpecifyIFormatProvider\", MessageId = \"System.String.Format(System.String,System.Object)\", Scope = \"member\", Target = \"EVEMon.Common.Models.EveNotificationText.#Parse(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1053:StaticHolderTypesShouldNotHaveConstructors\", Scope = \"type\", Target = \"EVEMon.Common.Service.EveNotificationType\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.Common.Data.EveProperty.#Format(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Data.EvePropertyCategory\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1815:OverrideEqualsAndOperatorEqualsOnValueTypes\", Scope = \"type\", Target = \"EVEMon.Common.Data.EvePropertyValue\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.ExpandablePanelControl.#CreateContextMenu()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.ExpandablePanelControl.#UpdateContextMenu()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1724:TypeNamesShouldNotMatchNamespaces\", Scope = \"type\", Target = \"EVEMon.Common.ExternalCalendar.ExternalCalendar\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.ExternalCalendar.ExternalCalendar.#DoOutlookAppointment(EVEMon.Common.Models.QueuedSkill,System.Int32,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.ExternalCalendar.ExternalCalendar.#DoOutlookAppointment(EVEMon.Common.Models.QueuedSkill,System.Int32,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.ExternalCalendar.ExternalCalendar.#DoGoogleAppointment(EVEMon.Common.Models.QueuedSkill,System.Int32,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String)\", Scope = \"member\", Target = \"EVEMon.Common.ExternalCalendar.ExternalCalendar.#DoGoogleAppointment(EVEMon.Common.Models.QueuedSkill,System.Int32,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1062:Validate arguments of public methods\", MessageId = \"2\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.ExternalEveNotificationTextxParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1305:SpecifyIFormatProvider\", MessageId = \"System.Int32.Parse(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.ExternalEveNotificationTextxParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1062:Validate arguments of public methods\", MessageId = \"0\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.ExternalEveNotificationTextxParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1305:SpecifyIFormatProvider\", MessageId = \"System.Int64.ToString\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.ExternalEveNotificationTextxParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1305:SpecifyIFormatProvider\", MessageId = \"System.Int64.Parse(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.ExternalEveNotificationTextxParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1305:SpecifyIFormatProvider\", MessageId = \"System.Convert.ToBoolean(System.Object)\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.ExternalEveNotificationTextxParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1815:OverrideEqualsAndOperatorEqualsOnValueTypes\", Scope = \"type\", Target = \"EVEMon.Common.Collections.FastList`1\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Collections.FastList`1\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FileHelper.#OpenRead(System.String,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"occuring\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FileHelper.#OpenRead(System.String,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FileHelper.#OpenRead(System.String,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FileHelper.#OpenRead(System.String,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FileHelper.#CopyOrWarnTheUser(System.String,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"occuring\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FileHelper.#CopyOrWarnTheUser(System.String,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FileHelper.#CopyOrWarnTheUser(System.String,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FileHelper.#CopyOrWarnTheUser(System.String,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FileHelper.#HasPermissionToRemoveReadOnlyAttributes\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"datas\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FileHelper.#HasPermissionToRemoveReadOnlyAttributes\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FileHelper.#HasPermissionToRemoveReadOnlyAttributes\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"behaviours\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FileHelper.#HasPermissionToRemoveReadOnlyAttributes\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FileHelper.#HasPermissionToRemoveReadOnlyAttributes\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Factories.FontFactory.#GetDefaultFont(System.Single,System.Drawing.FontStyle,System.Drawing.GraphicsUnit)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Factories.FontFactory.#GetFont(System.String,System.Drawing.FontStyle)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Factories.FontFactory.#GetFont(System.Drawing.Font,System.Drawing.FontStyle)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Factories.FontFactory.#GetFont(System.Drawing.FontFamily,System.Single,System.Drawing.FontStyle,System.Drawing.GraphicsUnit)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Factories.FontFactory.#GetFont(System.String,System.Single,System.Drawing.FontStyle,System.Drawing.GraphicsUnit)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1719:ParameterNamesShouldNotMatchMemberNames\", MessageId = \"1#\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FormatHelper.#Format(System.Double,EVEMon.Common.Enumerations.AbbreviationFormat,System.Boolean,System.Globalization.CultureInfo)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FormatHelper.#Format(System.Double,EVEMon.Common.Enumerations.AbbreviationFormat,System.Boolean,System.Globalization.CultureInfo)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1719:ParameterNamesShouldNotMatchMemberNames\", MessageId = \"1#\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FormatHelper.#Format(System.Int32,EVEMon.Common.Enumerations.AbbreviationFormat,System.Boolean,System.Globalization.CultureInfo)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FormatHelper.#Format(System.Int32,EVEMon.Common.Enumerations.AbbreviationFormat,System.Boolean,System.Globalization.CultureInfo)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1719:ParameterNamesShouldNotMatchMemberNames\", MessageId = \"1#\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FormatHelper.#Format(System.Int64,EVEMon.Common.Enumerations.AbbreviationFormat,System.Boolean,System.Globalization.CultureInfo)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FormatHelper.#Format(System.Int64,EVEMon.Common.Enumerations.AbbreviationFormat,System.Boolean,System.Globalization.CultureInfo)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1719:ParameterNamesShouldNotMatchMemberNames\", MessageId = \"1#\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FormatHelper.#Format(System.Decimal,EVEMon.Common.Enumerations.AbbreviationFormat,System.Boolean,System.Globalization.CultureInfo)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.FormatHelper.#Format(System.Decimal,EVEMon.Common.Enumerations.AbbreviationFormat,System.Boolean,System.Globalization.CultureInfo)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Collections.Global.GlobalCharacterCollection.#Remove(EVEMon.Common.Models.Character,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.ExternalCalendar.GoogleAppointmentFilter.#ReadEventsAsync()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String)\", Scope = \"member\", Target = \"EVEMon.Common.ExternalCalendar.GoogleAppointmentFilter.#ReadEventsAsync()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Net.HttpPostData.#.ctor(System.String,EVEMon.Common.Enumerations.DataCompression)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Net.HttpWebService.#DownloadFile(System.Uri,System.String,EVEMon.Common.Enumerations.HttpMethod,System.Boolean,System.String,EVEMon.Common.Enumerations.DataCompression)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Net.HttpWebService.#DownloadFileAsync(System.Uri,System.String,EVEMon.Common.Net.DownloadFileCompletedCallback,EVEMon.Common.Net.DownloadProgressChangedCallback,EVEMon.Common.Enumerations.HttpMethod,System.Boolean,System.String,EVEMon.Common.Enumerations.DataCompression)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Net.HttpWebService.#DownloadImage(System.Uri,EVEMon.Common.Enumerations.HttpMethod,System.Boolean,System.String,EVEMon.Common.Enumerations.DataCompression)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Net.HttpWebService.#DownloadImageAsync(System.Uri,EVEMon.Common.Net.DownloadImageCompletedCallback,System.Object,EVEMon.Common.Enumerations.HttpMethod,System.Boolean,System.String,EVEMon.Common.Enumerations.DataCompression)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Net.HttpWebService.#DownloadString(System.Uri,EVEMon.Common.Enumerations.HttpMethod,System.Boolean,System.String,EVEMon.Common.Enumerations.DataCompression)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Net.HttpWebService.#DownloadStringAsync(System.Uri,EVEMon.Common.Net.DownloadStringCompletedCallback,System.Object,EVEMon.Common.Enumerations.HttpMethod,System.Boolean,System.String,EVEMon.Common.Enumerations.DataCompression)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Net.HttpWebService.#DownloadXml(System.Uri,EVEMon.Common.Enumerations.HttpMethod,System.Boolean,System.String,EVEMon.Common.Enumerations.DataCompression)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Net.HttpWebService.#DownloadXmlAsync(System.Uri,EVEMon.Common.Net.DownloadXmlCompletedCallback,System.Object,EVEMon.Common.Enumerations.HttpMethod,System.Boolean,System.String,EVEMon.Common.Enumerations.DataCompression)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.Common.Net.HttpWebServiceRequest.#GetHttpWebRequest()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1716:IdentifiersShouldNotMatchKeywords\", MessageId = \"Stop\", Scope = \"member\", Target = \"EVEMon.Common.Threading.IActorTimer.#Stop()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1711:IdentifiersShouldNotHaveIncorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Interfaces.ICharacterAttribute\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Service.ImageService.#GetImageAsync(System.Uri,EVEMon.Common.Service.GetImageCallback,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Models.ImplantSet\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1717:OnlyFlagsEnumsShouldHavePluralNames\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.ImplantSlots\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\", Scope = \"member\", Target = \"EVEMon.Common.Models.IndustryJob.#BlueprintType\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\", Scope = \"member\", Target = \"EVEMon.Common.Models.IndustryJob.#InstalledME\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\", Scope = \"member\", Target = \"EVEMon.Common.Models.IndustryJob.#InstalledTE\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1062:Validate arguments of public methods\", MessageId = \"2\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.InternalEveNotificationTextParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1305:SpecifyIFormatProvider\", MessageId = \"System.Int32.Parse(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.InternalEveNotificationTextParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1062:Validate arguments of public methods\", MessageId = \"0\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.InternalEveNotificationTextParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1305:SpecifyIFormatProvider\", MessageId = \"System.Int64.ToString\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.InternalEveNotificationTextParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1305:SpecifyIFormatProvider\", MessageId = \"System.Int64.Parse(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.InternalEveNotificationTextParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1305:SpecifyIFormatProvider\", MessageId = \"System.Convert.ToBoolean(System.Object)\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.InternalEveNotificationTextParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1021:AvoidOutParameters\", MessageId = \"1#\", Scope = \"member\", Target = \"EVEMon.Common.Interfaces.IPlanOrderPluggable.#UpdateStatistics(EVEMon.Common.Models.BasePlan,System.Boolean&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1714:FlagsEnumsShouldHavePluralNames\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.ItemMetaGroup\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1714:FlagsEnumsShouldHavePluralNames\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.ItemSlot\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.KillLogExporter.#CopyKillInfoToClipboard(EVEMon.Common.Models.KillLog)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.KillLogExporter.#CopyKillInfoToClipboard(EVEMon.Common.Models.KillLog)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.KillLogExporter.#CopyKillInfoToClipboard(EVEMon.Common.Models.KillLog)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Flag\", Scope = \"member\", Target = \"EVEMon.Common.Models.KillLogItem.#EVEFlag\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.ListViewExporter.#CreateCSV(System.Windows.Forms.ListView,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.ListViewExporter.#CreateCSV(System.Windows.Forms.ListView,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.Common.Helpers.ListViewExporter.MakeCSVString(System.String,System.Boolean)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.ListViewExporter.#CreateCSV(System.Windows.Forms.ListView,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.Common.Helpers.ListViewExporter.MakeCSVNumber(System.String,System.Boolean)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.ListViewExporter.#MakeCSVString(System.String,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1815:OverrideEqualsAndOperatorEqualsOnValueTypes\", Scope = \"type\", Target = \"EVEMon.Common.Threading.Message\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Controls.MessageBoxCustom.#Show(System.Windows.Forms.IWin32Window,System.String,System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.MessageBoxCustom.#SetButtonsToDisplay(System.Windows.Forms.MessageBoxButtons)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"cbText\", Scope = \"member\", Target = \"EVEMon.Common.Controls.MessageBoxCustom.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.MessageBoxCustom.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1724:TypeNamesShouldNotMatchNamespaces\", Scope = \"type\", Target = \"EVEMon.Common.Controls.MultiPanel.MultiPanel\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.ComponentModel.Design.DesignerVerb.#ctor(System.String,System.EventHandler)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.MultiPanel.Design.MultiPanelDesignerHelper.#GetDesignerVerbs(System.ComponentModel.Design.IDesignerHost,EVEMon.Common.Controls.MultiPanel.MultiPanel)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.MultiPanel.Design.MultiPanelDesignerHelper.#AddPage(System.ComponentModel.Design.IDesignerHost,EVEMon.Common.Controls.MultiPanel.MultiPanel)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"MultiPanelPageDesigner\", Scope = \"member\", Target = \"EVEMon.Common.Controls.MultiPanel.Design.MultiPanelPageDesigner.#Initialize(System.ComponentModel.IComponent)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"MultiPanelPage\", Scope = \"member\", Target = \"EVEMon.Common.Controls.MultiPanel.Design.MultiPanelPageDesigner.#Initialize(System.ComponentModel.IComponent)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1725:ParameterNamesShouldMatchBaseDeclaration\", MessageId = \"0#\", Scope = \"member\", Target = \"EVEMon.Common.Controls.MultiPanel.Design.MultiPanelPageDesigner.#OnPaintAdornments(System.Windows.Forms.PaintEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Flags\", Scope = \"member\", Target = \"EVEMon.Common.Controls.NativeMethods.#ShowInactiveTopmost(System.Windows.Forms.Control,System.UInt32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Controls.NativeMethods.#ShowInactiveTopmost(System.Windows.Forms.Control,System.UInt32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA1806:DoNotIgnoreMethodResults\", MessageId = \"EVEMon.Common.Controls.NativeMethods.SetTextCharacterExtra(System.IntPtr,System.Int32)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.NativeMethods.#SetTextCharacterSpacing(System.Drawing.Graphics,System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1011:ConsiderPassingBaseTypesAsParameters\", Scope = \"member\", Target = \"EVEMon.Common.Controls.NativeMethods.#GetVerticalScrollBarPosition(System.Windows.Forms.ListView)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA1806:DoNotIgnoreMethodResults\", MessageId = \"EVEMon.Common.Controls.NativeMethods.GetScrollInfo(System.IntPtr,System.Int32,EVEMon.Common.Controls.NativeMethods+Scrollinfo@)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.NativeMethods.#GetVerticalScrollBarPosition(System.Windows.Forms.ListView)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1011:ConsiderPassingBaseTypesAsParameters\", Scope = \"member\", Target = \"EVEMon.Common.Controls.NativeMethods.#SetVerticalScrollBarPosition(System.Windows.Forms.ListView,System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"EVEMon.Common.Net.NetworkMonitor.#Initialize()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1041:ProvideObsoleteAttributeMessage\", Scope = \"member\", Target = \"EVEMon.Common.Notifications.NotificationCategory.#ClaimableCertificate\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1041:ProvideObsoleteAttributeMessage\", Scope = \"member\", Target = \"EVEMon.Common.Notifications.NotificationCategory.#InsufficientClone\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA2227:CollectionPropertiesShouldBeReadOnly\", Scope = \"member\", Target = \"EVEMon.Common.SettingsObjects.NotificationSettings.#Categories\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Models.Plan\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1714:FlagsEnumsShouldHavePluralNames\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.PlanChange\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1721:PropertyNamesShouldNotMatchGetMethods\", Scope = \"member\", Target = \"EVEMon.Common.Models.PlanEntry.#Type\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1036:OverrideMethodsOnComparableTypes\", Scope = \"type\", Target = \"EVEMon.Common.Models.PlanetaryColony\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.Common.Models.Comparers.PlanetaryPinComparer.#CompareCore(EVEMon.Common.Models.PlanetaryPin,EVEMon.Common.Models.PlanetaryPin)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.PlanIOHelper.#ExportAsText(EVEMon.Common.Models.Plan,EVEMon.Common.SettingsObjects.PlanExportSettings,System.Action`3<System.Text.StringBuilder,EVEMon.Common.Models.PlanEntry,EVEMon.Common.SettingsObjects.PlanExportSettings>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.PlanIOHelper.#ImportFromXML(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.PlanIOHelper.#ImportFromXML(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"gzip\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.PlanIOHelper.#ImportFromXML(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.PlanIOHelper.#ImportPlansFromXML(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.PlanIOHelper.#ImportPlansFromXML(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"gzip\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.PlanIOHelper.#ImportPlansFromXML(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1717:OnlyFlagsEnumsShouldHavePluralNames\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.PlanOperations\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.PlanPrinter.#doc_PrintPage(System.Object,System.Drawing.Printing.PrintPageEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Helpers.PlanScratchpad\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA1801:ReviewUnusedParameters\", MessageId = \"regions\", Scope = \"member\", Target = \"EVEMon.Common.MarketPricer.Pricer.#QueryRegionalMarketOrdersAsync(System.Collections.Generic.IEnumerable`1<System.Int32>,System.Collections.Generic.IEnumerable`1<System.Int32>,System.Action`1<EVEMon.Common.MarketPricer.PricerMarketOrdersQueryResult>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA1801:ReviewUnusedParameters\", MessageId = \"itemIDs\", Scope = \"member\", Target = \"EVEMon.Common.MarketPricer.Pricer.#QueryRegionalMarketOrdersAsync(System.Collections.Generic.IEnumerable`1<System.Int32>,System.Collections.Generic.IEnumerable`1<System.Int32>,System.Action`1<EVEMon.Common.MarketPricer.PricerMarketOrdersQueryResult>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.PrintOptionsDialog.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1043:UseIntegralOrStringArgumentForIndexers\", Scope = \"member\", Target = \"EVEMon.Common.QueryMonitor.QueryMonitorCollection.#Item[System.Enum]\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1714:FlagsEnumsShouldHavePluralNames\", Scope = \"type\", Target = \"EVEMon.Common.Enumerations.Race\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.Common.Collections.ReadonlyCollection`1.#Items\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1033:InterfaceMethodsShouldBeCallableByChildTypes\", Scope = \"member\", Target = \"EVEMon.Common.Collections.ReadonlyCollection`1.#System.Collections.Generic.IEnumerable`1<!0>.GetEnumerator()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1033:InterfaceMethodsShouldBeCallableByChildTypes\", Scope = \"member\", Target = \"EVEMon.Common.Collections.ReadonlyCollection`1.#System.Collections.IEnumerable.GetEnumerator()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1051:DoNotDeclareVisibleInstanceFields\", Scope = \"member\", Target = \"EVEMon.Common.Collections.ReadonlyKeyedCollection`2.#Items\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Security\", \"CA2104:DoNotDeclareReadOnlyMutableReferenceTypes\", Scope = \"member\", Target = \"EVEMon.Common.Collections.ReadonlyKeyedCollection`2.#Items\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1033:InterfaceMethodsShouldBeCallableByChildTypes\", Scope = \"member\", Target = \"EVEMon.Common.Collections.ReadonlyKeyedCollection`2.#System.Collections.Generic.IEnumerable`1<!1>.GetEnumerator()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1033:InterfaceMethodsShouldBeCallableByChildTypes\", Scope = \"member\", Target = \"EVEMon.Common.Collections.ReadonlyKeyedCollection`2.#System.Collections.IEnumerable.GetEnumerator()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1033:InterfaceMethodsShouldBeCallableByChildTypes\", Scope = \"member\", Target = \"EVEMon.Common.Collections.ReadonlyKeyedCollection`2.#EVEMon.Common.Collections.IReadonlyKeyedCollection`2<!0,!1>.Item[!0]\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1033:InterfaceMethodsShouldBeCallableByChildTypes\", Scope = \"member\", Target = \"EVEMon.Common.Collections.ReadonlyVirtualCollection`1.#System.Collections.Generic.IEnumerable`1<!0>.GetEnumerator()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1033:InterfaceMethodsShouldBeCallableByChildTypes\", Scope = \"member\", Target = \"EVEMon.Common.Collections.ReadonlyVirtualCollection`1.#System.Collections.IEnumerable.GetEnumerator()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1036:OverrideMethodsOnComparableTypes\", Scope = \"type\", Target = \"EVEMon.Common.Data.Region\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Data.Region\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1823:AvoidUnusedPrivateFields\", Scope = \"member\", Target = \"EVEMon.Common.Models.Collections.ResearchPointCollection.#m_character\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1725:ParameterNamesShouldMatchBaseDeclaration\", MessageId = \"1#\", Scope = \"member\", Target = \"EVEMon.Common.Scheduling.ScheduleEntryTitleComparer.#Compare(EVEMon.Common.Scheduling.ScheduleEntry,EVEMon.Common.Scheduling.ScheduleEntry)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1725:ParameterNamesShouldMatchBaseDeclaration\", MessageId = \"0#\", Scope = \"member\", Target = \"EVEMon.Common.Scheduling.ScheduleEntryTitleComparer.#Compare(EVEMon.Common.Scheduling.ScheduleEntry,EVEMon.Common.Scheduling.ScheduleEntry)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1021:AvoidOutParameters\", MessageId = \"1#\", Scope = \"member\", Target = \"EVEMon.Common.Scheduling.Scheduler.#SkillIsBlockedAt(System.DateTime,System.String&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1056:UriPropertiesShouldNotBeStrings\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.API.SerializableAPICorporationSheet.#WebUrl\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1721:PropertyNamesShouldNotMatchGetMethods\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.Settings.SerializableAPIKey.#Type\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1721:PropertyNamesShouldNotMatchGetMethods\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.API.SerializableAPIKeyItem.#Type\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1711:IdentifiersShouldNotHaveIncorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Serialization.API.SerializableAPISkillQueue\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Flag\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.API.SerializableAssetListItem.#EVEFlag\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA2227:CollectionPropertiesShouldBeReadOnly\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.Datafiles.SerializableBlueprint.#InventionTypeIDs\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1305:SpecifyIFormatProvider\", MessageId = \"System.String.Format(System.String,System.Object)\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.API.SerializableCharacterJumpClone.#CloneNameXml\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA2225:OperatorOverloadsHaveNamedAlternates\", Scope = \"member\", Target = \"EVEMon.Common.SettingsObjects.SerializableColor.#op_Explicit(EVEMon.Common.SettingsObjects.SerializableColor):System.Drawing.Color\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA2225:OperatorOverloadsHaveNamedAlternates\", Scope = \"member\", Target = \"EVEMon.Common.SettingsObjects.SerializableColor.#op_Explicit(System.Drawing.Color):EVEMon.Common.SettingsObjects.SerializableColor\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1721:PropertyNamesShouldNotMatchGetMethods\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.API.SerializableContractListItem.#Type\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1059:MembersShouldNotExposeCertainConcreteTypes\", MessageId = \"System.Xml.XmlNode\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.PatchXml.SerializableDatafile.#MessageXml\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Flags\", Scope = \"type\", Target = \"EVEMon.Common.Serialization.SerializableEveFlags\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Flags\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.SerializableEveFlags.#EVEFlags\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Flags\", Scope = \"type\", Target = \"EVEMon.Common.Serialization.SerializableEveFlagsListItem\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1711:IdentifiersShouldNotHaveIncorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Serialization.Settings.SerializableImplantSetCollection\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA2227:CollectionPropertiesShouldBeReadOnly\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.Settings.SerializableImplantSetCollection.#JumpClones\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Flag\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.API.SerializableKillLogItemListItem.#EVEFlag\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1056:UriPropertiesShouldNotBeStrings\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.Settings.SerializableLocalhostEndPoint.#UrlXml\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1721:PropertyNamesShouldNotMatchGetMethods\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.Settings.SerializablePlanEntry.#Type\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1059:MembersShouldNotExposeCertainConcreteTypes\", MessageId = \"System.Xml.XmlNode\", Scope = \"member\", Target = \"EVEMon.Common.Serialization.PatchXml.SerializableRelease.#MessageXml\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1724:TypeNamesShouldNotMatchNamespaces\", Scope = \"type\", Target = \"EVEMon.Common.Settings\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.Common.Settings\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Settings.#Import(EVEMon.Common.Serialization.Settings.SerializableSettings,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.Common.Settings.#OnImportCompleted()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Settings.#TryDeserializeFromFileContent(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.Settings.#TryDeserializeFromFileContent(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.Settings.#TryDeserializeFromBackupFile(System.String,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Settings.#TryDeserializeFromBackupFile(System.String,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Settings.#CheckSettingsVersion(EVEMon.Common.Serialization.Settings.SerializableSettings)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.Settings.#CheckSettingsVersion(EVEMon.Common.Serialization.Settings.SerializableSettings)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon,System.Windows.Forms.MessageBoxDefaultButton)\", Scope = \"member\", Target = \"EVEMon.Common.Settings.#CheckSettingsVersion(EVEMon.Common.Serialization.Settings.SerializableSettings)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Title(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Settings.#CheckSettingsVersion(EVEMon.Common.Serialization.Settings.SerializableSettings)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"bak\", Scope = \"member\", Target = \"EVEMon.Common.Settings.#CheckSettingsVersion(EVEMon.Common.Serialization.Settings.SerializableSettings)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Settings.#CheckSettingsVersion(EVEMon.Common.Serialization.Settings.SerializableSettings)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1720:IdentifiersShouldNotContainTypeNames\", MessageId = \"int\", Scope = \"member\", Target = \"EVEMon.Common.Models.Skill.#GetIntFromRoman(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Models.SkillGroup\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1021:AvoidOutParameters\", MessageId = \"2#\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.SkillLevelEnumerableExtensions.#Contains(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.SkillLevel>,EVEMon.Common.Models.Skill,System.Int64&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1045:DoNotPassTypesByReference\", MessageId = \"1#\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.SkillLevelEnumerableExtensions.#GetTotalTrainingTime(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.SkillLevel>,System.Boolean&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1045:DoNotPassTypesByReference\", MessageId = \"2#\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.SkillLevelEnumerableExtensions.#GetTotalTrainingTime(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.SkillLevel>,System.Collections.Generic.Dictionary`2<EVEMon.Common.Models.Skill,System.Int64>,System.Boolean&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1711:IdentifiersShouldNotHaveIncorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Models.SkillQueue\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Models.SkillQueue\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.SkillQueueControl.#DisplaySkillToolTip(System.Drawing.Rectangle,EVEMon.Common.Models.QueuedSkill)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.Common.Controls.InfiniteDisplayToolTip.Show(System.String,System.Drawing.Point)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.SkillQueueControl.#DisplaySkillToolTip(System.Drawing.Rectangle,EVEMon.Common.Models.QueuedSkill)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.TextRenderer.MeasureText(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.SkillQueueControl.#DisplayFreeRoomToolTip(System.Drawing.Rectangle)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.Common.Controls.InfiniteDisplayToolTip.Show(System.String,System.Drawing.Point)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.SkillQueueControl.#DisplayFreeRoomToolTip(System.Drawing.Rectangle)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1036:OverrideMethodsOnComparableTypes\", Scope = \"type\", Target = \"EVEMon.Common.Data.SolarSystem\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Data.SolarSystem\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Data.SolarSystem.#GetFastestPathTo(EVEMon.Common.Data.SolarSystem,EVEMon.Common.Enumerations.PathSearchCriteria,System.Single,System.Single)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Data.SolarSystemRange\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1006:DoNotNestGenericTypesInMemberSignatures\", Scope = \"member\", Target = \"EVEMon.Common.Data.StaticCertificate.#Grades\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Data.StaticCertificateGroup\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Data.StaticRecommendations`1\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"devs\", Scope = \"member\", Target = \"EVEMon.Common.Data.StaticSkill.#GetPointsRequiredForLevel(System.Int64)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1021:AvoidOutParameters\", MessageId = \"2#\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.StaticSkillExtensions.#HasAsPrerequisite(EVEMon.Common.Interfaces.IStaticSkill,EVEMon.Common.Interfaces.IStaticSkill,System.Int64&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1021:AvoidOutParameters\", MessageId = \"2#\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.StaticSkillExtensions.#HasAsImmediatePrereq(EVEMon.Common.Interfaces.IStaticSkill,EVEMon.Common.Interfaces.IStaticSkill,System.Int64&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Data.StaticSkillGroup\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1726:UsePreferredTerms\", MessageId = \"Indices\", Scope = \"member\", Target = \"EVEMon.Common.Data.StaticSkills.#ArrayIndicesCount\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1036:OverrideMethodsOnComparableTypes\", Scope = \"type\", Target = \"EVEMon.Common.Data.Station\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1710:IdentifiersShouldHaveCorrectSuffix\", Scope = \"type\", Target = \"EVEMon.Common.Data.Station\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.StringExtensions.#ConvertUpperToLowerCamelCase(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.StringExtensions.#ToTitleCase(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.StringExtensions.#ToNumericString(System.Int32,System.Int32,System.Globalization.CultureInfo)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.StringExtensions.#ToNumericString(System.Single,System.Int32,System.Globalization.CultureInfo)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.StringExtensions.#ToNumericString(System.Decimal,System.Int32,System.Globalization.CultureInfo)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.StringExtensions.#ToNumericString(System.Int64,System.Int32,System.Globalization.CultureInfo)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.StringExtensions.#ToNumericString(System.Double,System.Int32,System.Globalization.CultureInfo)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.StringExtensions.#WordWrap(System.String,System.Int32,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1305:SpecifyIFormatProvider\", MessageId = \"System.Int32.ToString(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.TimeExtensions.#ToRemainingTimeDigitalDescription(System.DateTime,System.DateTimeKind)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Extensions.TimeExtensions.#ToDescriptiveText(System.TimeSpan,EVEMon.Common.Enumerations.DescriptiveTextOptions,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Controls.TipWindow.#ShowTip(System.Windows.Forms.Form,System.String,System.String,System.String,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.TipWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1823:AvoidUnusedPrivateFields\", Scope = \"member\", Target = \"EVEMon.Common.Controls.TrayIcon.#m_mouseState\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.NotifyIcon.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Controls.TrayIcon.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1713:EventsShouldNotHaveBeforeOrAfterPrefix\", Scope = \"member\", Target = \"EVEMon.Common.Controls.TreeView.#AfterDeselect\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1713:EventsShouldNotHaveBeforeOrAfterPrefix\", Scope = \"member\", Target = \"EVEMon.Common.Controls.TreeView.#BeforeDeselect\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\", Scope = \"member\", Target = \"EVEMon.Common.Controls.TreeView.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.Common.Controls.TreeView.#HandleShiftPressed(System.Windows.Forms.TreeNode,System.Windows.Forms.TreeNode,System.Windows.Forms.TreeViewAction)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.Common.Controls.TreeView.#HandleShiftAndControlPressed(System.Windows.Forms.TreeNode,System.Windows.Forms.TreeNode,System.Windows.Forms.TreeViewAction)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1058:TypesShouldNotExtendCertainBaseTypes\", Scope = \"type\", Target = \"EVEMon.Common.Controls.NodesCollection\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1033:InterfaceMethodsShouldBeCallableByChildTypes\", Scope = \"member\", Target = \"EVEMon.Common.Controls.NodesCollection.#System.Collections.Generic.ICollection`1<System.Windows.Forms.TreeNode>.IsReadOnly\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1033:InterfaceMethodsShouldBeCallableByChildTypes\", Scope = \"member\", Target = \"EVEMon.Common.Controls.NodesCollection.#System.Collections.Generic.IList`1<System.Windows.Forms.TreeNode>.Insert(System.Int32,System.Windows.Forms.TreeNode)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1033:InterfaceMethodsShouldBeCallableByChildTypes\", Scope = \"member\", Target = \"EVEMon.Common.Controls.NodesCollection.#System.Collections.Generic.IList`1<System.Windows.Forms.TreeNode>.Item[System.Int32]\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Title(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#SavePlans(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.Plan>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"epb\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#SavePlans(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.Plan>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#SavePlans(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.Plan>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#SavePlans(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.Plan>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#SavePlans(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.Plan>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#SavePlans(System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.Plan>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportCharacterSkillsAsPlan(EVEMon.Common.Models.Character,System.Collections.Generic.IEnumerable`1<EVEMon.Common.Models.Skill>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Title(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportPlan(EVEMon.Common.Models.Plan,EVEMon.Common.Models.Character)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"emp\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportPlan(EVEMon.Common.Models.Plan,EVEMon.Common.Models.Character)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportPlan(EVEMon.Common.Models.Plan,EVEMon.Common.Models.Character)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportPlan(EVEMon.Common.Models.Plan,EVEMon.Common.Models.Character)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportPlan(EVEMon.Common.Models.Plan,EVEMon.Common.Models.Character)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportPlan(EVEMon.Common.Models.Plan,EVEMon.Common.Models.Character)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportCharacter(EVEMon.Common.Models.Character,EVEMon.Common.Models.Plan)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Title(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportCharacter(EVEMon.Common.Models.Character,EVEMon.Common.Models.Plan)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportCharacter(EVEMon.Common.Models.Character,EVEMon.Common.Models.Plan)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"chr\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportCharacter(EVEMon.Common.Models.Character,EVEMon.Common.Models.Plan)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportCharacter(EVEMon.Common.Models.Character,EVEMon.Common.Models.Plan)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"png\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportCharacter(EVEMon.Common.Models.Character,EVEMon.Common.Models.Plan)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportCharacter(EVEMon.Common.Models.Character,EVEMon.Common.Models.Plan)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportCharacter(EVEMon.Common.Models.Character,EVEMon.Common.Models.Plan)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ExportCharacter(EVEMon.Common.Models.Character,EVEMon.Common.Models.Plan)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ShowNoSupportMessage()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ShowNoSupportMessage()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.Common.Helpers.UIHelper.#ShowNoSupportMessage()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA2227:CollectionPropertiesShouldBeReadOnly\", Scope = \"member\", Target = \"EVEMon.Common.SettingsObjects.UISettings.#WindowLocations\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA2227:CollectionPropertiesShouldBeReadOnly\", Scope = \"member\", Target = \"EVEMon.Common.SettingsObjects.UISettings.#Splitters\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA2227:CollectionPropertiesShouldBeReadOnly\", Scope = \"member\", Target = \"EVEMon.Common.SettingsObjects.UpdateSettings.#Periods\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1724:TypeNamesShouldNotMatchNamespaces\", Scope = \"type\", Target = \"EVEMon.Common.Util\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.Common.Util\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Util.#DeserializeXmlFromFile`1(System.String,System.Xml.Xsl.XslCompiledTransform)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Util.#DeserializeXmlFromString`1(System.String,System.Xml.Xsl.XslCompiledTransform)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Common.Util.#DeserializeDatafile`1(System.String,System.Xml.Xsl.XslCompiledTransform)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.Common.Serialization.API.CCPAPIResult<T>.#ctor(EVEMon.Common.Enumerations.API.APIError,System.String)\", Scope = \"member\", Target = \"EVEMon.Common.Util.#DownloadAPIResult`1(System.Uri,System.Boolean,System.String,System.Xml.Xsl.XslCompiledTransform)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"EVEMon.Common.Util.#DownloadAPIResult`1(System.Uri,System.Boolean,System.String,System.Xml.Xsl.XslCompiledTransform)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Util.#DownloadXmlAsync`1(System.Uri,EVEMon.Common.DownloadCallback`1<!!0>,System.Boolean,System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1062:Validate arguments of public methods\", MessageId = \"0\", Scope = \"member\", Target = \"EVEMon.Common.Util.#SerializeToXmlDocument(System.Object)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.Common.Util.#CreateMD5(System.IO.Stream)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1308:NormalizeStringsToUppercase\", Scope = \"member\", Target = \"EVEMon.Common.Util.#CreateSHA1(System.IO.Stream)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Util.#GetMemoryStream(System.Byte[])\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1026:DefaultParametersShouldNotBeUsed\", Scope = \"member\", Target = \"EVEMon.Common.Util.#GetFileStream(System.String,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1721:PropertyNamesShouldNotMatchGetMethods\", Scope = \"member\", Target = \"EVEMon.Common.Models.WalletJournal.#Type\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1823:AvoidUnusedPrivateFields\", Scope = \"member\", Target = \"EVEMon.Common.Models.Collections.WalletJournalCollection.#m_character\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1823:AvoidUnusedPrivateFields\", Scope = \"member\", Target = \"EVEMon.Common.Models.Collections.WalletTransactionsCollection.#m_character\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA2225:OperatorOverloadsHaveNamedAlternates\", Scope = \"member\", Target = \"EVEMon.Common.SettingsObjects.WindowLocationSettings.#op_Explicit(EVEMon.Common.SettingsObjects.WindowLocationSettings):System.Drawing.Rectangle\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Usage\", \"CA2225:OperatorOverloadsHaveNamedAlternates\", Scope = \"member\", Target = \"EVEMon.Common.SettingsObjects.WindowLocationSettings.#op_Explicit(System.Drawing.Rectangle):EVEMon.Common.SettingsObjects.WindowLocationSettings\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1004:GenericMethodsShouldProvideTypeParameter\", Scope = \"member\", Target = \"EVEMon.Common.Factories.WindowsFactory.#GetAndCloseByTag`2(!!1)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1506:AvoidExcessiveClassCoupling\", Scope = \"type\", Target = \"EVEMon.Common.Models.CCPCharacter\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.ExternalEveNotificationTextxParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\", Scope = \"member\", Target = \"EVEMon.Common.Models.Extended.InternalEveNotificationTextParser.#Parse(EVEMon.Common.Models.EveNotification,System.Collections.Generic.KeyValuePair`2<YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode>,System.Collections.Generic.IDictionary`2<System.String,System.String>)\")]\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/AttributesOptimizer.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Helpers\n{\n    public static class AttributesOptimizer\n    {\n        #region Computations\n\n        /// <summary>\n        /// Compute the best possible attributes to fulfill the given trainings array\n        /// </summary>\n        /// <param name=\"skills\"></param>\n        /// <param name=\"baseScratchpad\"></param>\n        /// <param name=\"maxDuration\"></param>\n        /// <returns></returns>\n        internal static CharacterScratchpad Optimize<T>(IEnumerable<T> skills, CharacterScratchpad baseScratchpad,\n                                                       TimeSpan maxDuration)\n            where T : ISkillLevel\n        {\n            CharacterScratchpad bestScratchpad = new CharacterScratchpad(baseScratchpad);\n            CharacterScratchpad tempScratchpad = new CharacterScratchpad(baseScratchpad);\n            TimeSpan baseTime = baseScratchpad.TrainingTime;\n            TimeSpan bestTime = TimeSpan.MaxValue;\n            int bestSkillCount = 0;\n\n            // Now, we have the points to spend, let's perform all the\n            // combinations (less than 11^4 = 14,641)\n            for (int per = 0; per <= EveConstants.MaxRemappablePointsPerAttribute; per++)\n            {\n                // WIL\n                int maxWillpower = EveConstants.SpareAttributePointsOnRemap - per;\n                for (int will = 0; will <= maxWillpower && will <= EveConstants.MaxRemappablePointsPerAttribute; will++)\n                {\n                    // INT\n                    int maxIntelligence = maxWillpower - will;\n                    for (int intell = 0;\n                         intell <= maxIntelligence && intell <= EveConstants.MaxRemappablePointsPerAttribute;\n                         intell++)\n                    {\n                        // MEM\n                        int maxMemory = maxIntelligence - intell;\n                        for (int mem = 0; mem <= maxMemory && mem <= EveConstants.MaxRemappablePointsPerAttribute; mem++)\n                        {\n                            // CHA\n                            int cha = maxMemory - mem;\n\n                            // Reject invalid combinations\n                            if (cha > EveConstants.MaxRemappablePointsPerAttribute)\n                                continue;\n\n                            // Resets the scratchpad\n                            tempScratchpad.Reset();\n\n                            // Set new attributes\n                            tempScratchpad.Memory.Base = mem + EveConstants.CharacterBaseAttributePoints;\n                            tempScratchpad.Charisma.Base = cha + EveConstants.CharacterBaseAttributePoints;\n                            tempScratchpad.Willpower.Base = will + EveConstants.CharacterBaseAttributePoints;\n                            tempScratchpad.Perception.Base = per + EveConstants.CharacterBaseAttributePoints;\n                            tempScratchpad.Intelligence.Base = intell + EveConstants.CharacterBaseAttributePoints;\n\n                            // Train skills\n                            int tempSkillCount = 0;\n                            foreach (T skill in skills)\n                            {\n                                tempSkillCount++;\n                                tempScratchpad.Train(skill);\n\n                                // Did it go over max duration ?\n                                if (tempScratchpad.TrainingTime - baseTime > maxDuration)\n                                    break;\n\n                                // Did it go over the best time so far without training more skills ?\n                                if (tempSkillCount <= bestSkillCount && tempScratchpad.TrainingTime > bestTime)\n                                    break;\n                            }\n\n                            // Did it manage to train more skills before the max duration, \n                            // or did it train the same number of skills in a lesser time ?\n                            if (tempSkillCount <= bestSkillCount &&\n                                (tempSkillCount != bestSkillCount || tempScratchpad.TrainingTime >= bestTime))\n                                continue;\n\n                            bestScratchpad.Reset();\n                            bestScratchpad.Memory.Base = tempScratchpad.Memory.Base;\n                            bestScratchpad.Charisma.Base = tempScratchpad.Charisma.Base;\n                            bestScratchpad.Willpower.Base = tempScratchpad.Willpower.Base;\n                            bestScratchpad.Perception.Base = tempScratchpad.Perception.Base;\n                            bestScratchpad.Intelligence.Base = tempScratchpad.Intelligence.Base;\n                            bestTime = tempScratchpad.TrainingTime;\n                            bestSkillCount = tempSkillCount;\n                        }\n                    }\n                }\n            }\n\n            // Return the best scratchpad found\n            return bestScratchpad;\n        }\n\n        /// <summary>\n        /// Generate a trainings array from a plan\n        /// </summary>\n        /// <param name=\"plan\"></param>\n        /// <returns></returns>\n        public static ICollection<RemappingResult> OptimizeFromPlanAndRemappingPoints(BasePlan plan)\n        {\n            Collection<RemappingResult> results = GetResultsFromRemappingPoints(plan);\n            foreach (RemappingResult result in results)\n            {\n                result.Optimize(TimeSpan.MaxValue);\n            }\n            return results;\n        }\n\n        /// <summary>\n        /// Gets the list of remapping results from a plan.\n        /// </summary>\n        /// <param name=\"plan\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">plan</exception>\n        public static Collection<RemappingResult> GetResultsFromRemappingPoints(BasePlan plan)\n        {\n            plan.ThrowIfNull(nameof(plan));\n\n            CharacterScratchpad scratchpad = new CharacterScratchpad(plan.Character.After(plan.ChosenImplantSet));\n            Collection<RemappingResult> remappingList = new Collection<RemappingResult>();\n            Collection<ISkillLevel> list = new Collection<ISkillLevel>();\n\n            // Scroll through the entries and split it into remappings\n            foreach (PlanEntry entry in plan)\n            {\n                // Ends the current remapping and start a new one\n                if (entry.Remapping != null)\n                {\n                    // Creates a new remapping\n                    RemappingResult remapping = new RemappingResult(entry.Remapping, scratchpad.Clone());\n                    remappingList.Add(remapping);\n                    list = remapping.Skills;\n                }\n\n                // Add this skill to the training list\n                scratchpad.Train(entry);\n                list.Add(entry);\n            }\n\n            // Return\n            return remappingList;\n        }\n\n        /// <summary>\n        /// Compute the best remapping for the first year of this plan.\n        /// </summary>\n        /// <param name=\"plan\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">plan</exception>\n        public static RemappingResult OptimizeFromFirstYearOfPlan(BasePlan plan)\n        {\n            plan.ThrowIfNull(nameof(plan));\n\n            RemappingResult remapping = new RemappingResult(new CharacterScratchpad(plan.Character.After(plan.ChosenImplantSet)));\n\n            // Scroll through the entries and split it into remappings\n            foreach (PlanEntry entry in plan)\n            {\n                remapping.Skills.Add(entry);\n            }\n\n            // Compute\n            remapping.Optimize(TimeSpan.FromDays(365.0));\n            return remapping;\n        }\n\n        /// <summary>\n        /// Generate a trainings array from the skills already know by a character.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"plan\">The plan.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">character or plan</exception>\n        public static RemappingResult OptimizeFromCharacter(Character character, BasePlan plan)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            plan.ThrowIfNull(nameof(plan));\n\n            // Create a character without any skill\n            CharacterScratchpad scratchpad = new CharacterScratchpad(character.After(plan.ChosenImplantSet));\n            scratchpad.ClearSkills();\n\n            // Create a new plan\n            Plan newPlan = new Plan(scratchpad);\n\n            // Add all trained skill levels that the character has trained so far\n            foreach (Skill skill in character.Skills)\n            {\n                newPlan.PlanTo(skill, skill.Level);\n            }\n\n            // Create a new remapping\n            RemappingResult remapping = new RemappingResult(scratchpad);\n\n            // Add those skills to the remapping\n            foreach (PlanEntry entry in newPlan)\n            {\n                remapping.Skills.Add(entry);\n            }\n\n            // Optimize\n            remapping.Optimize(TimeSpan.MaxValue);\n            return remapping;\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Helpers/BlankCharacterUIHelper.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing System.Xml;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Collections.Global;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Helpers\n{\n    public static class BlankCharacterUIHelper\n    {\n        #region Fields\n\n        private static readonly Dictionary<int, int> s_allRaceSkills = new Dictionary<int, int>\n        {\n            // Armor -- all empire-specific, see below\n            // Drones\n            { DBConstants.DroneAvionicsSkillID, 1 },\n            { DBConstants.DronesSkillID, 1 },\n            // Electronic Systems\n            { DBConstants.ElectronicWarfareSkillID, 1 },\n            { DBConstants.PropulsionJammingSkillID, 1 },\n            // Engineering\n            { DBConstants.CapacitorManagementSkillID, 3 },\n            { DBConstants.CapacitorSystemsOperationSkillID, 3 },\n            { DBConstants.CPUManagementSkillID, 4 },\n            { DBConstants.ElectronicsUpgradesSkillID, 3 },\n            { DBConstants.EnergyGridUpgradesSkillID, 1 },\n            { DBConstants.PowerGridManagementSkillID, 4 },\n            { DBConstants.WeaponUpgradesSkillID, 2 },\n            // Gunnery -- some empire-specific\n            { DBConstants.GunnerySkillID, 4 },\n            { DBConstants.MotionPredictionSkillID, 2 },\n            { DBConstants.RapidFiringSkillID, 2 },\n            { DBConstants.SharpshooterSkillID, 2 },\n            { DBConstants.TrajectoryAnalysisSkillID, 1 },\n            // Missiles\n            { DBConstants.MissileLauncherOperationSkillID, 1 },\n            // Navigation\n            { DBConstants.AfterburnerSkillID, 3 },\n            { DBConstants.EvasiveManeuveringSkillID, 1 },\n            { DBConstants.HighSpeedManeuveringSkillID, 1 },\n            { DBConstants.NavigationSkillID, 3 },\n            { DBConstants.WarpDriveOperationSkillID, 2 },\n            // Neural Enhancement\n            { DBConstants.CyberneticsSkillID, 1 },\n            // Production\n            { DBConstants.IndustrySkillID, 1 },\n            // Resource Processing\n            { DBConstants.MiningSkillID, 3 },\n            { DBConstants.SalvagingSkillID, 3 },\n            // Scanning\n            { DBConstants.ArchaeologySkillID, 1 },\n            { DBConstants.AstrometricAcquisitionSkillID, 1 },\n            { DBConstants.AstrometricRangefindingSkillID, 1 },\n            { DBConstants.AstrometricsSkillID, 3 },\n            { DBConstants.HackingSkillID, 1 },\n            { DBConstants.SurveySkillID, 3 },\n            // Science\n            { DBConstants.ScienceSkillID, 4 },\n            // Shield -- all empire-specific\n            // Spaceship Command -- some empire-specific\n            { DBConstants.MiningFrigateSkillID, 1 },\n            { DBConstants.SpaceshipCommandSkillID, 3 },\n            // Targeting\n            { DBConstants.LongRangeTargetingSkillID, 2 },\n            { DBConstants.SignatureAnalysisSkillID, 2 },\n            { DBConstants.TargetManagementSkillID, 3 },\n            // Trade\n            { DBConstants.MarketingSkillID, 1 },\n            { DBConstants.TradeSkillID, 2 }\n        };\n\n        private static readonly Dictionary<int, int> s_amarrRaceSkills = new Dictionary<int, int>\n        {\n            // Armor\n            { DBConstants.HullUpgradesSkillID, 3 },\n            { DBConstants.MechanicSkillID, 3 },\n            // Gunnery\n            { DBConstants.SmallEnergyTurretSkillID, 1 },\n            { DBConstants.ControlledBurstsSkillID, 2 },\n            // Shield\n            { DBConstants.ShieldManagementSkillID, 1 },\n            { DBConstants.ShieldUpgradesSkillID, 1 },\n            { DBConstants.TacticalShieldManipulationSkillID, 1 },\n            // Spaceship Command\n            { DBConstants.AmarrFrigateSkillID, 1 },\n            { DBConstants.AmarrIndustrialSkillID, 1 }\n       };\n\n        private static readonly Dictionary<int, int> s_caldariRaceSkills = new Dictionary<int, int>\n        {\n            // Armor\n            { DBConstants.HullUpgradesSkillID, 2 },\n            { DBConstants.MechanicSkillID, 2 },\n            // Gunnery\n            { DBConstants.SmallHybridTurretSkillID, 1 },\n            { DBConstants.ControlledBurstsSkillID, 2 },\n            // Shield\n            { DBConstants.ShieldManagementSkillID, 2 },\n            { DBConstants.ShieldUpgradesSkillID, 2 },\n            { DBConstants.TacticalShieldManipulationSkillID, 2 },\n            // Spaceship Command\n            { DBConstants.CaldariFrigateSkillID, 1 },\n            { DBConstants.CaldariIndustrialSkillID, 1 }\n        };\n\n        private static readonly Dictionary<int, int> s_gallenteRaceSkills = new Dictionary<int, int>\n        {\n            // Armor\n            { DBConstants.HullUpgradesSkillID, 3 },\n            { DBConstants.MechanicSkillID, 3 },\n            // Gunnery\n            { DBConstants.SmallHybridTurretSkillID, 1 },\n            { DBConstants.ControlledBurstsSkillID, 2 },\n            // Shield\n            { DBConstants.ShieldManagementSkillID, 1 },\n            { DBConstants.ShieldUpgradesSkillID, 1 },\n            { DBConstants.TacticalShieldManipulationSkillID, 1 },\n            // Spaceship Command\n            { DBConstants.GallenteFrigateSkillID, 1 },\n            { DBConstants.GallenteIndustrialSkillID, 1 }\n        };\n\n        private static readonly Dictionary<int, int> s_minmatarRaceSkills = new Dictionary<int, int>\n        {\n            // Armor\n            { DBConstants.HullUpgradesSkillID, 3 },\n            { DBConstants.MechanicSkillID, 3 },\n            // Gunnery\n            { DBConstants.SmallProjectileTurretSkillID, 1 },\n            { DBConstants.ControlledBurstsSkillID, 1 },\n            // Shield\n            { DBConstants.ShieldManagementSkillID, 1 },\n            { DBConstants.ShieldUpgradesSkillID, 1 },\n            { DBConstants.TacticalShieldManipulationSkillID, 1 },\n            // Spaceship Command\n            { DBConstants.MinmatarFrigateSkillID, 1 },\n            { DBConstants.MinmatarIndustrialSkillID, 1 }\n        };\n\n        private static string s_filename;\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the name of the character.\n        /// </summary>\n        /// <value>\n        /// The name of the character.\n        /// </value>\n        public static string CharacterName { get; set; }\n\n        /// <summary>\n        /// Gets or sets the race.\n        /// </summary>\n        /// <value>\n        /// The race.\n        /// </value>\n        public static Race Race { get; set; }\n\n        /// <summary>\n        /// Sets the gender.\n        /// </summary>\n        /// <value>\n        /// The gender.\n        /// </value>\n        public static Gender Gender { get; set; }\n\n        /// <summary>\n        /// Gets or sets the bloodline.\n        /// </summary>\n        /// <value>\n        /// The bloodline.\n        /// </value>\n        public static Bloodline Bloodline { get; set; }\n\n        /// <summary>\n        /// Sets the ancestry.\n        /// </summary>\n        /// <value>\n        /// The ancestry.\n        /// </value>\n        public static Ancestry Ancestry { get; set; }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Creates the character.\n        /// </summary>\n        /// <returns></returns>\n        private static SerializableCCPCharacter CreateCharacter()\n        {\n            var serial = new SerializableCCPCharacter\n            {\n                ID = UriCharacter.BlankCharacterID,\n                Name = CharacterName,\n                Birthday = DateTime.UtcNow,\n                Race = Race.ToString(),\n                BloodLine = Bloodline.ToString().Replace(\"_\", \"-\"),\n                Ancestry = Ancestry.ToString().Replace(\"_\", \" \"),\n                Gender = Gender.ToString(),\n                CorporationName = \"Blank Character's Corp\",\n                CorporationID = 9999999,\n                Balance = 0,\n                // Default to Omega clones\n                CloneState = AccountStatusMode.Omega.ToString(),\n                Attributes = new SerializableCharacterAttributes\n                {\n                    Intelligence = EveConstants.CharacterBaseAttributePoints + 3,\n                    Memory = EveConstants.CharacterBaseAttributePoints + 3,\n                    Perception = EveConstants.CharacterBaseAttributePoints + 3,\n                    Willpower = EveConstants.CharacterBaseAttributePoints + 3,\n                    Charisma = EveConstants.CharacterBaseAttributePoints + 2\n                },\n                ImplantSets = new SerializableImplantSetCollection\n                {\n                    ActiveClone = new SerializableSettingsImplantSet\n                    { Name = \"Active Clone\" },\n                },\n            };\n\n            serial.Skills.AddRange(GetSkillsForRace());\n\n            return serial;\n        }\n\n        /// <summary>\n        /// Gets the skills for each race.\n        /// </summary>\n        /// <returns></returns>\n        private static IEnumerable<SerializableCharacterSkill> GetSkillsForRace()\n        {\n            Dictionary<int, int> startingSkills = GetStartingSkills();\n\n            return startingSkills.Select(\n                raceSkill => new\n                {\n                    raceSkill,\n                    staticSkill = StaticSkills.GetSkillByID(raceSkill.Key)\n                }).Where(raceSkill => raceSkill.staticSkill != null).Select(\n                    skill => new SerializableCharacterSkill\n                    {\n                        ID = skill.raceSkill.Key,\n                        Level = skill.raceSkill.Value,\n                        Name = StaticSkills.GetSkillByID(skill.raceSkill.Key).Name,\n                        Skillpoints =\n                            StaticSkills.GetSkillByID(skill.raceSkill.Key).GetPointsRequiredForLevel\n                                (skill.raceSkill.Value),\n                        IsKnown = true,\n                        OwnsBook = false,\n                    });\n        }\n\n        /// <summary>\n        /// Gets the starting skills.\n        /// </summary>\n        /// <returns></returns>\n        private static Dictionary<int, int> GetStartingSkills()\n        {\n            Dictionary<int, int> startingSkills = new Dictionary<int, int>();\n\n            switch (Race)\n            {\n                case Race.Amarr:\n                    startingSkills = s_allRaceSkills.Concat(s_amarrRaceSkills).ToDictionary(x => x.Key, x => x.Value);\n                    break;\n                case Race.Caldari:\n                    startingSkills = s_allRaceSkills.Concat(s_caldariRaceSkills).ToDictionary(x => x.Key, x => x.Value);\n                    break;\n                case Race.Gallente:\n                    startingSkills = s_allRaceSkills.Concat(s_gallenteRaceSkills).ToDictionary(x => x.Key, x => x.Value);\n                    break;\n                case Race.Minmatar:\n                    startingSkills = s_allRaceSkills.Concat(s_minmatarRaceSkills).ToDictionary(x => x.Key, x => x.Value);\n                    break;\n            }\n            return startingSkills;\n        }\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Saves the blank character.\n        /// </summary>\n        /// <param name=\"callback\">The callback.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">callback</exception>\n        public static async Task SaveAsync(Action callback)\n        {\n            callback.ThrowIfNull(nameof(callback));\n\n            SerializableCCPCharacter serial = CreateCharacter();\n\n            using (SaveFileDialog fileDialog = new SaveFileDialog())\n            {\n                fileDialog.Title = @\"Save Blank Character\";\n                fileDialog.Filter = @\"Blank Character CCPXML (*.xml) | *.xml\";\n                fileDialog.FileName = $\"{serial.Name}.xml\";\n                fileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);\n\n                DialogResult result = fileDialog.ShowDialog();\n                if (result != DialogResult.OK)\n                    return;\n\n                XmlDocument xmlDoc = (XmlDocument)Util.SerializeToXmlDocument(serial);\n                string content = Util.GetXmlStringRepresentation(xmlDoc);\n                await FileHelper.OverwriteOrWarnTheUserAsync(fileDialog.FileName,\n                    async fs =>\n                    {\n                        using (StreamWriter writer = new StreamWriter(fs, Encoding.UTF8))\n                        {\n                            await writer.WriteAsync(content);\n                            await writer.FlushAsync();\n                            await fs.FlushAsync();\n                        }\n                        return true;\n                    });\n\n                s_filename = fileDialog.FileName;\n                callback.Invoke();\n            }\n        }\n\n        /// <summary>\n        /// Adds the blank character.\n        /// </summary>\n        public static async Task AddBlankCharacterAsync(Action callback)\n        {\n            // Add blank character\n            var result = await GlobalCharacterCollection.TryAddOrUpdateFromUriAsync(new Uri(s_filename));\n\n            if (result == null || result.HasError)\n                return;\n\n            UriCharacter character = result.CreateCharacter();\n            character.Monitored = true;\n\n            callback.Invoke();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/CharacterAttributeScratchpad.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\n\nnamespace EVEMon.Common.Helpers\n{\n    /// <summary>\n    /// Represents an attribute for a character scratchpad\n    /// </summary>\n    public sealed class CharacterAttributeScratchpad : ICharacterAttribute\n    {\n        private readonly EveAttribute m_attrib;\n\n        private long m_base;\n        private long m_implantBonus;\n\n        /// <summary>\n        /// Constructor from a character attribute.\n        /// </summary>\n        /// <param name=\"attrib\"></param>\n        internal CharacterAttributeScratchpad(EveAttribute attrib)\n        {\n            m_attrib = attrib;\n        }\n\n        /// <summary>\n        /// Resets the attribute with the given source\n        /// </summary>\n        /// <param name=\"baseAttribute\"></param>\n        /// <param name=\"implantBonus\"></param>\n        internal void Reset(long baseAttribute, long implantBonus)\n        {\n            m_base = baseAttribute;\n            m_implantBonus = implantBonus;\n            UpdateEffectiveAttribute();\n        }\n\n        /// <summary>\n        /// Resets the attribute with the given source\n        /// </summary>\n        /// <param name=\"src\"></param>\n        internal void Reset(ICharacterAttribute src)\n        {\n            m_base = src.Base;\n            m_implantBonus = src.ImplantBonus;\n            UpdateEffectiveAttribute();\n        }\n\n        /// <summary>\n        /// Updates the effective attribute\n        /// </summary>\n        internal void UpdateEffectiveAttribute()\n        {\n            EffectiveValue = m_base + m_implantBonus;\n        }\n\n        /// <summary>\n        /// Gets or sets the base attribute.\n        /// </summary>\n        public long Base\n        {\n            get { return m_base; }\n            set\n            {\n                m_base = value;\n                UpdateEffectiveAttribute();\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the bonus granted by the implant\n        /// </summary>\n        public long ImplantBonus\n        {\n            get { return m_implantBonus; }\n            set\n            {\n                m_implantBonus = value;\n                UpdateEffectiveAttribute();\n            }\n        }\n\n        /// <summary>\n        /// Gets the effective attribute value.\n        /// </summary>\n        public long EffectiveValue { get; private set; }\n\n        /// <summary>\n        /// Gets a string representation with the provided format. The following parameters are accepted :\n        /// <list type=\"bullet\">\n        /// <item>%n for name (lower case)</item>\n        /// <item>%N for name (CamelCase)</item>\n        /// <item>%B for attribute base value</item>\n        /// <item>%b for base bonus</item>\n        /// <item>%i for implant bonus</item>\n        /// <item>%r for remapping points</item>\n        /// <item>%e for effective value</item>\n        /// </list>\n        /// </summary>\n        /// <returns>The formatted string.</returns>\n        /// <exception cref=\"System.ArgumentNullException\">format</exception>\n        public string ToString(string format)\n        {\n            format.ThrowIfNull(nameof(format));\n\n            format = format.Replace(\"%n\", m_attrib.ToString().ToLower(CultureConstants.DefaultCulture));\n            format = format.Replace(\"%N\", m_attrib.ToString());\n            format = format.Replace(\"%B\", EveConstants.CharacterBaseAttributePoints.ToString(CultureConstants.DefaultCulture));\n            format = format.Replace(\"%b\", m_base.ToString(CultureConstants.DefaultCulture));\n            format = format.Replace(\"%i\", ImplantBonus.ToString(CultureConstants.DefaultCulture));\n            format = format.Replace(\"%r\", (m_base - EveConstants.CharacterBaseAttributePoints).ToString(CultureConstants.DefaultCulture));\n            format = format.Replace(\"%e\", EffectiveValue.ToString(\"0\", CultureConstants.DefaultCulture));\n            return format;\n        }\n\n        /// <summary>\n        /// Gets a string representation with the following format : \"<c>Intelligence : 15</c>\"\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => $\"{m_attrib} : {EffectiveValue}\";\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Helpers/CharacterExporter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Xml;\nusing System.Xml.Xsl;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Exportation;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.Service;\n\nnamespace EVEMon.Common.Helpers\n{\n    /// <summary>\n    /// Provides exportation under different formats for characters.\n    /// </summary>\n    public static class CharacterExporter\n    {\n        /// <summary>\n        /// Creates a TXT format file for character exportation.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"plan\"></param>\n        private static string ExportAsText(Character character, Plan plan)\n        {\n            const string Separator = \"=======================================================================\";\n            const string SubSeparator = \"-----------------------------------------------------------------------\";\n\n            StringBuilder builder = new StringBuilder();\n            builder\n                .AppendLine(\"BASIC INFO\")\n                .AppendLine(Separator)\n                .AppendLine($\"     Name: {character.Name}\")\n                .AppendLine(FormattableString.Invariant($\"  Balance: {character.Balance:N2} ISK\"))\n                .AppendLine($\" Birthday: {character.Birthday.DateTimeToTimeString()} UTC\")\n                .AppendLine($\"   Gender: {character.Gender}\")\n                .AppendLine($\"     Race: {character.Race}\")\n                .AppendLine($\"Bloodline: {character.Bloodline}\")\n                .AppendLine($\" Ancestry: {character.Ancestry}\")\n                .AppendLine()\n                .AppendLine(\"ATTRIBUTES\")\n                .AppendLine(Separator)\n                .AppendLine($\"Intelligence: {character.Intelligence.EffectiveValue}\")\n                .AppendLine($\"    Charisma: {character.Charisma.EffectiveValue}\")\n                .AppendLine($\"  Perception: {character.Perception.EffectiveValue}\")\n                .AppendLine($\"      Memory: {character.Memory.EffectiveValue}\")\n                .AppendLine($\"   Willpower: {character.Willpower.EffectiveValue}\")\n                .AppendLine();\n\n            // Implants\n            IList<Implant> implants = character.CurrentImplants.ToList();\n            if (implants.Any())\n            {\n                builder.AppendLine(\"AUGMENTATIONS\");\n                builder.AppendLine(Separator);\n                foreach (Implant implant in implants)\n                {\n                    builder.AppendLine($\"+{implant.Bonus} {implant.Slot.GetDescription().PadRight(22)} : {implant.Name}\");\n                }\n                builder.AppendLine();\n            }\n\n            // Skill groups\n            builder.AppendLine(\"SKILLS\");\n            builder.AppendLine(Separator);\n            foreach (SkillGroup skillGroup in character.SkillGroups)\n            {\n                AddSkillGroups(character, plan, builder, skillGroup);\n\n                builder.AppendLine(SubSeparator);\n            }\n\n            return builder.ToString();\n        }\n\n        /// <summary>\n        /// Adds the skill groups.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"plan\">The plan.</param>\n        /// <param name=\"builder\">The builder.</param>\n        /// <param name=\"skillGroup\">The skill group.</param>\n        private static void AddSkillGroups(Character character, Plan plan, StringBuilder builder, SkillGroup skillGroup)\n        {\n            int count = skillGroup\n                .Where(x => x.IsKnown || (plan != null && plan.IsPlanned(x)))\n                .Select(x => GetMergedSkill(plan, x))\n                .Count();\n\n            long skillGroupTotalSP = skillGroup\n                .Where(x => x.IsKnown || (plan != null && plan.IsPlanned(x)))\n                .Select(x => GetMergedSkill(plan, x))\n                .Sum(x => x.Skillpoints);\n\n            // Skill Group\n            builder.AppendLine($\"{skillGroup.Name}, \" +\n                               $\"{count} Skill{(count > 1 ? \"s\" : string.Empty)}, \" +\n                               FormattableString.Invariant($\"{skillGroupTotalSP:N0} Points\"));\n\n            // Skills\n            foreach (Skill skill in skillGroup.Where(x => x.IsKnown || (plan != null && plan.IsPlanned(x))))\n            {\n                AddSkills(character, plan, builder, skill);\n            }\n        }\n\n        /// <summary>\n        /// Adds the skills.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"plan\">The plan.</param>\n        /// <param name=\"builder\">The builder.</param>\n        /// <param name=\"skill\">The skill.</param>\n        private static void AddSkills(Character character, Plan plan, StringBuilder builder, Skill skill)\n        {\n            SerializableCharacterSkill mergedSkill = GetMergedSkill(plan, skill);\n\n            string skillPointsText = FormattableString.Invariant($\"{mergedSkill.Skillpoints:N0}\");\n            string pointToLevelFiveText = FormattableString.Invariant($\"{skill.StaticData.GetPointsRequiredForLevel(5):N0}\");\n            string skillDesc = $\"{skill} ({skill.Rank})\";\n            builder.AppendLine($\"  {skillDesc.PadRight(45)} \" +\n                               $\"L{mergedSkill.Level} \".PadLeft(5) +\n                               $\"{skillPointsText}/{pointToLevelFiveText} Points\");\n\n            // If the skill is in training...\n            if (!skill.IsTraining)\n                return;\n\n            string levelText = Skill.GetRomanFromInt(character.CurrentlyTrainingSkill.Level);\n            string adjustedEndTimeText = character.CurrentlyTrainingSkill.EndTime.DateTimeToTimeString();\n            builder.AppendLine($\":  (Currently training to level {levelText}, completes {adjustedEndTimeText} UTC)\");\n        }\n\n        /// <summary>\n        /// Creates a CHR format file for character exportation.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"plan\"></param>\n        private static string ExportAsEFTCHR(Character character, Plan plan)\n        {\n            StringBuilder builder = new StringBuilder();\n\n            foreach (SerializableCharacterSkill skill in character.Skills\n                .Where(x => x.IsPublic &&\n                            x.Group.ID != DBConstants.CorporationManagementSkillsGroupID &&\n                            x.Group.ID != DBConstants.SocialSkillsGroupID &&\n                            x.Group.ID != DBConstants.TradeSkillsGroupID)\n                .Select(x => GetMergedSkill(plan, x)))\n            {\n                builder.AppendLine($\"{skill.Name}={skill.Level}\");\n            }\n\n            ESIKey apiKey = character.Identity.FindAPIKeyWithAccess(ESIAPICharacterMethods.CharacterSheet);\n\n            if (apiKey == null)\n                return builder.ToString();\n\n            builder\n                .AppendLine($\"KeyID={apiKey.ID}\")\n                .AppendLine($\"VCode={apiKey.AccessToken}\")\n                .Append($\"CharID={character.CharacterID}\");\n\n            return builder.ToString();\n        }\n\n        /// <summary>\n        /// Creates a HTML format file for character exportation.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"plan\"></param>\n        private static string ExportAsHTML(Character character, Plan plan)\n        {\n            // Retrieves a XML representation of this character\n            OutputCharacter serial = new OutputCharacter\n            {\n                Name = character.Name,\n                Balance = character.Balance.ToNumericString(2, CultureConstants.InvariantCulture),\n                Birthday = character.Birthday.DateTimeToTimeString(),\n                CorporationName = character.CorporationName,\n                CharacterID = character.CharacterID,\n                BloodLine = character.Bloodline,\n                Ancestry = character.Ancestry,\n                Gender = character.Gender,\n                Race = character.Race,\n                Intelligence = character.Intelligence.EffectiveValue,\n                Perception = character.Perception.EffectiveValue,\n                Willpower = character.Willpower.EffectiveValue,\n                Charisma = character.Charisma.EffectiveValue,\n                Memory = character.Memory.EffectiveValue\n            };\n\n            CompleteSerialization(character, plan, serial);\n\n            // Serializes to XML and apply a XSLT to generate the HTML doc\n            XmlDocument doc = (XmlDocument)Util.SerializeToXmlDocument(serial);\n\n            XslCompiledTransform xslt = Util.LoadXslt(Properties.Resources.XmlToHtmlXslt);\n            XmlDocument htmlDoc = (XmlDocument)Util.Transform(doc, xslt);\n\n            // Returns the string representation of the generated doc\n            return Util.GetXmlStringRepresentation(htmlDoc);\n        }\n\n        /// <summary>\n        /// Completes the serialization.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"plan\">The plan.</param>\n        /// <param name=\"serial\">The serial.</param>\n        private static void CompleteSerialization(Character character, Plan plan, OutputCharacter serial)\n        {\n            // Attributes enhancers\n            foreach (Implant implant in character.CurrentImplants)\n            {\n                serial.AttributeEnhancers.Add(new OutputAttributeEnhancer\n                {\n                    Attribute = implant.Slot,\n                    Description = implant.Slot.GetDescription(),\n                    Bonus = implant.Bonus,\n                    Name = implant.Name\n                });\n            }\n\n            // Skills (grouped by skill groups)\n            foreach (SkillGroup skillGroup in character.SkillGroups)\n            {\n                OutputSkillGroup outGroup = AddSkillGroup(plan, skillGroup);\n\n                foreach (Skill skill in skillGroup.Where(x => x.IsKnown || (plan != null && plan.IsPlanned(x))))\n                {\n                    AddSkill(plan, outGroup, skill);\n                }\n\n                if (outGroup.Skills.Count != 0)\n                    serial.SkillGroups.Add(outGroup);\n            }\n        }\n\n        /// <summary>\n        /// Adds the skill group.\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        /// <param name=\"skillGroup\">The skill group.</param>\n        /// <returns></returns>\n        private static OutputSkillGroup AddSkillGroup(Plan plan, SkillGroup skillGroup)\n        {\n            int count = skillGroup\n                .Where(x => x.IsKnown || (plan != null && plan.IsPlanned(x)))\n                .Select(x => GetMergedSkill(plan, x))\n                .Count();\n\n            long skillGroupTotalSP = skillGroup\n                .Where(x => x.IsKnown || (plan != null && plan.IsPlanned(x)))\n                .Select(x => GetMergedSkill(plan, x))\n                .Sum(x => x.Skillpoints);\n\n            OutputSkillGroup outGroup = new OutputSkillGroup\n            {\n                Name = skillGroup.Name,\n                SkillsCount = count,\n                TotalSP = FormattableString.Invariant($\"{skillGroupTotalSP:N0}\")\n            };\n            return outGroup;\n        }\n\n        /// <summary>\n        /// Adds the skill.\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        /// <param name=\"outGroup\">The out group.</param>\n        /// <param name=\"skill\">The skill.</param>\n        private static void AddSkill(Plan plan, OutputSkillGroup outGroup, Skill skill)\n        {\n            SerializableCharacterSkill mergedSkill = GetMergedSkill(plan, skill);\n\n            outGroup.Skills.Add(new OutputSkill\n            {\n                Name = mergedSkill.Name,\n                Rank = skill.Rank,\n                Level = mergedSkill.Level,\n                SkillPoints = FormattableString.Invariant($\"{mergedSkill.Skillpoints:N0}\"),\n                RomanLevel = Skill.GetRomanFromInt(mergedSkill.Level),\n                MaxSkillPoints = FormattableString.Invariant($\"{skill.StaticData.GetPointsRequiredForLevel(5):N0}\")\n            });\n        }\n\n        /// <summary>\n        /// Creates a XML format file for character exportation.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"plan\"></param>\n        private static string ExportAsEVEMonXML(Character character, Plan plan)\n        {\n            SerializableSettingsCharacter serial = character.Export();\n\n            if (plan != null)\n            {\n                serial.Skills.Clear();\n                serial.Skills.AddRange(character.Skills.Where(skill => skill.IsKnown || plan.IsPlanned(skill))\n                    .Select(skill => GetMergedSkill(plan, skill)));\n            }\n\n            XmlDocument doc = (XmlDocument)Util.SerializeToXmlDocument(serial);\n            return doc != null ? Util.GetXmlStringRepresentation(doc) : null;\n        }\n\n        /// <summary>\n        /// Creates a XML format file for character exportation.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        private static string ExportAsCCPXML(Character character)\n        {\n            // Try to use the last XML character sheet downloaded from CCP\n            XmlDocument doc = (XmlDocument)LocalXmlCache.GetCharacterXml(character);\n            return doc != null ? Util.GetXmlStringRepresentation(doc) : null;\n        }\n\n        /// <summary>\n        /// Creates a BBCode format file for character exportation.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">character</exception>\n        public static string ExportAsBBCode(Character character)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            StringBuilder result = new StringBuilder();\n\n            result\n                .AppendLine($\"[b]{character.Name}[/b]\")\n                .AppendLine()\n                .AppendLine(\"[b]Attributes[/b]\")\n                .AppendLine(\"[table]\")\n                .AppendLine(\"[tr][td]Intelligence:[/td][td]\" +\n                            $\"{character.Intelligence.EffectiveValue}\".PadLeft(5) +\n                            \"[/td][/tr]\")\n                .AppendLine(\"[tr][td]Perception:[/td][td]\" +\n                            $\"{character.Perception.EffectiveValue}\".PadLeft(5) +\n                            \"[/td][/tr]\")\n                .AppendLine(\"[tr][td]Charisma:[/td][td]\" +\n                            $\"{character.Charisma.EffectiveValue}\".PadLeft(5) +\n                            \"[/td][/tr]\")\n                .AppendLine(\"[tr][td]Willpower:[/td][td]\" +\n                            $\"{character.Willpower.EffectiveValue}\".PadLeft(5) +\n                            \"[/td][/tr]\")\n                .AppendLine(\"[tr][td]Memory:[/td][td]\" +\n                            $\"{character.Memory.EffectiveValue}\".PadLeft(5) +\n                            \"[/td][/tr]\")\n                .AppendLine(\"[/table]\");\n\n            foreach (SkillGroup skillGroup in character.SkillGroups)\n            {\n                bool skillGroupAppended = false;\n                foreach (Skill skill in skillGroup.Where(skill => skill.Level > 0))\n                {\n                    if (!skillGroupAppended)\n                    {\n                        result.AppendLine();\n                        result.AppendLine($\"[b]{skillGroup.Name}[/b]\");\n\n                        skillGroupAppended = true;\n                    }\n\n                    result.AppendLine($\"[img]{NetworkConstants.EVECommunityBase}\" +\n                                      $\"{NetworkConstants.MyEVELevelImage}{skill.Level}.gif[/img] {skill.Name}\");\n                }\n\n                if (skillGroupAppended)\n                {\n                    result.AppendLine(\n                        FormattableString.Invariant($\"Total Skillpoints in Group: {skillGroup.TotalSP:N0}\"));\n                }\n            }\n\n            result\n                .AppendLine()\n                .AppendLine(FormattableString.Invariant($\"Total Skillpoints: {character.SkillPoints:N0}\"))\n                .AppendLine(\n                    $\"Total Number of Skills: {character.KnownSkillCount}\".PadLeft(5))\n                .AppendLine();\n\n            for (int i = 0; i <= 5; i++)\n            {\n                result\n                    .AppendLine($\"Skills at Level {i}: \" +\n                                $\"{character.GetSkillCountAtLevel(i)}\".PadLeft(5));\n            }\n\n            return result.ToString();\n        }\n\n        /// <summary>\n        /// Gets the skill properties of a merged skill with a plan entry, if one is provided.\n        /// If no plan is provided, the skill properties are returned unmodified.\n        /// </summary>\n        /// <param name=\"plan\"></param>\n        /// <param name=\"skill\"></param>\n        /// <returns>The skill properties after the merge</returns>\n        private static SerializableCharacterSkill GetMergedSkill(Plan plan, Skill skill)\n        {\n            SerializableCharacterSkill mergedSkill = new SerializableCharacterSkill\n            {\n                ID = skill.ID,\n                Name = skill.Name,\n                IsKnown = skill.IsKnown,\n                OwnsBook = skill.IsOwned,\n                Level = skill.Level,\n                Skillpoints = skill.SkillPoints\n            };\n\n\n            plan?.Merge(mergedSkill);\n\n            return mergedSkill;\n        }\n\n        /// <summary>\n        /// Creates formatted string for character exportation.\n        /// </summary>\n        /// <param name=\"format\"></param>\n        /// <param name=\"character\"></param>\n        /// <param name=\"plan\"></param>\n        /// <exception cref=\"NotImplementedException\"></exception>\n        /// <returns></returns>\n        public static string Export(CharacterSaveFormat format, Character character, Plan plan = null)\n        {\n            switch (format)\n            {\n                case CharacterSaveFormat.Text:\n                    return ExportAsText(character, plan);\n                case CharacterSaveFormat.EFTCHR:\n                    return ExportAsEFTCHR(character, plan);\n                case CharacterSaveFormat.EVEMonXML:\n                    return ExportAsEVEMonXML(character, plan);\n                case CharacterSaveFormat.HTML:\n                    return ExportAsHTML(character, plan);\n                case CharacterSaveFormat.CCPXML:\n                    return ExportAsCCPXML(character);\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Helpers/CharacterScratchpad.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Helpers\n{\n    /// <summary>\n    /// Represents a character class designed for computations and temporary modifications (new implants, remaps, etc)\n    /// </summary>\n    public sealed class CharacterScratchpad : BaseCharacter\n    {\n        private readonly CharacterAttributeScratchpad[] m_attributes = new CharacterAttributeScratchpad[5];\n        private readonly long[] m_skillLevels;\n        private readonly long[] m_skillSP;\n\n        private readonly BaseCharacter m_character;\n        private long m_skillPoints;\n\n        /// <summary>\n        /// Constructor from a character.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        public CharacterScratchpad(BaseCharacter character)\n        {\n            TrainedSkills = new Collection<StaticSkillLevel>();\n            TrainingTime = TimeSpan.Zero;\n            m_character = character;\n            m_skillSP = new long[StaticSkills.ArrayIndicesCount];\n            m_skillLevels = new long[StaticSkills.ArrayIndicesCount];\n            m_cloneStateSetting = character.AccountStatusSettings;\n\n            for (int i = 0; i < m_attributes.Length; i++)\n            {\n                m_attributes[i] = new CharacterAttributeScratchpad((EveAttribute)i);\n            }\n\n            Reset();\n        }\n\n        /// <summary>\n        /// Gets Alpha/Omega status for this character.\n        /// </summary>\n        public override AccountStatus CharacterStatus\n        {\n            get\n            {\n                // Note that EffectiveCharacterStatus will always return CharacterStatus,\n                // because the AccountStatusMode will always be \"Auto\"\n                if (m_character != null)\n                {\n                    return m_character.CharacterStatus;\n                }\n                return base.CharacterStatus;\n            }\n            protected set\n            {\n                base.CharacterStatus = value;\n            }\n        }\n\n        #region Attributes\n\n        /// <summary>\n        /// Gets the intelligence of the character.\n        /// </summary> \n        public new CharacterAttributeScratchpad Intelligence => m_attributes[(int)EveAttribute.Intelligence];\n\n        /// <summary>\n        /// Gets the charisma of the character.\n        /// </summary> \n        public new CharacterAttributeScratchpad Charisma => m_attributes[(int)EveAttribute.Charisma];\n\n        /// <summary>\n        /// Gets the perception of the character.\n        /// </summary> \n        public new CharacterAttributeScratchpad Perception => m_attributes[(int)EveAttribute.Perception];\n\n        /// <summary>\n        /// Gets the memory of the character.\n        /// </summary> \n        public new CharacterAttributeScratchpad Memory => m_attributes[(int)EveAttribute.Memory];\n\n        /// <summary>\n        /// Gets the willpower of the character.\n        /// </summary> \n        public new CharacterAttributeScratchpad Willpower => m_attributes[(int)EveAttribute.Willpower];\n\n        /// <summary>\n        /// Gets the specified attribute.\n        /// </summary>\n        /// <param name=\"attribute\">The attribute to retrieve</param>\n        /// <returns></returns>\n        public new CharacterAttributeScratchpad this[EveAttribute attribute] => m_attributes[(int)attribute];\n\n        /// <summary>\n        /// Performs the given remapping\n        /// </summary>\n        /// <param name=\"point\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">point</exception>\n        public void Remap(RemappingPoint point)\n        {\n            point.ThrowIfNull(nameof(point));\n\n            for (int i = 0; i < m_attributes.Length; i++)\n            {\n                EveAttribute attrib = (EveAttribute)i;\n                m_attributes[i].Base = point[attrib];\n            }\n        }\n\n        /// <summary>\n        /// Remove all the implants\n        /// </summary>\n        public void ClearImplants()\n        {\n            foreach (CharacterAttributeScratchpad attribute in m_attributes)\n            {\n                attribute.ImplantBonus = 0;\n            }\n        }\n\n        #endregion\n\n\n        #region Overriden methods\n\n        /// <summary>\n        /// Gets the total skill points.\n        /// </summary>\n        /// <returns></returns>\n        protected override long TotalSkillPoints => m_skillPoints;\n\n        /// <summary>\n        /// Gets the current level of the given skill.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">skill</exception>\n        public override long GetSkillLevel(StaticSkill skill)\n        {\n            skill.ThrowIfNull(nameof(skill));\n\n            return m_skillLevels[skill.ArrayIndex];\n        }\n\n        /// <summary>\n        /// Gets the current level of the given skill.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">skill</exception>\n        public override long GetSkillPoints(StaticSkill skill)\n        {\n            skill.ThrowIfNull(nameof(skill));\n\n            return m_skillSP[skill.ArrayIndex];\n        }\n\n        /// <summary>\n        /// Gets the requested attribute.\n        /// </summary>\n        /// <param name=\"attribute\"></param>\n        /// <returns></returns>\n        protected override ICharacterAttribute GetAttribute(EveAttribute attribute) => m_attributes[(int)attribute];\n\n        /// <summary>\n        /// Releases unmanaged and - optionally - managed resources\n        /// </summary>\n        internal override void Dispose()\n        {\n            m_character.Dispose();\n        }\n\n        #endregion\n\n\n        #region Training and skill levels updates\n\n        /// <summary>\n        /// Gets or sets the total training time. Note the training time is always zero when you create a scratchpad from a character.\n        /// </summary>\n        public TimeSpan TrainingTime { get; private set; }\n\n        /// <summary>\n        /// Gets the list of skills trained so far (by the <see cref=\"Train&lt;T&gt;\"/> or <see cref=\"SetSkillLevel\"/> methods).\n        /// </summary>\n        public Collection<StaticSkillLevel> TrainedSkills { get; }\n\n        /// <summary>\n        /// Clears the training time and trained skills only. \n        /// Does not remove the benefits from those skills (use <see cref=\"Reset()\"/> for that purpose).\n        /// </summary>\n        public void ClearTraining()\n        {\n            TrainingTime = TimeSpan.Zero;\n            TrainedSkills.Clear();\n        }\n\n        /// <summary>\n        /// Performs the given training.\n        /// Rely on <see cref=\"SetSkillLevel\"/> but only applied when the given level is greater than the current one.\n        /// </summary>\n        /// <param name=\"trainings\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">trainings</exception>\n        public void Train<T>(IEnumerable<T> trainings)\n            where T : ISkillLevel\n        {\n            trainings.ThrowIfNull(nameof(trainings));\n\n            foreach (T item in trainings)\n            {\n                Train(item.Skill, item.Level);\n            }\n        }\n\n        /// <summary>\n        /// Performs the given training, also apply remapping points.\n        /// Rely on <see cref=\"SetSkillLevel\"/> but only applied when the given level is greater than the current one.\n        /// </summary>\n        /// <param name=\"entries\"></param>\n        /// <param name=\"applyRemappingPoints\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">entries</exception>\n        public void TrainEntries(IEnumerable<PlanEntry> entries, bool applyRemappingPoints)\n        {\n            entries.ThrowIfNull(nameof(entries));\n\n            foreach (PlanEntry entry in entries)\n            {\n                if (entry.Remapping != null && entry.Remapping.Status == RemappingPointStatus.UpToDate &&\n                    applyRemappingPoints)\n                    Remap(entry.Remapping);\n\n                Train(entry.Skill, entry.Level);\n            }\n        }\n\n        /// <summary>\n        /// Performs the given training.\n        /// Same as <see cref=\"SetSkillLevel\"/> but only applied when the given level is greater than the current one.\n        /// </summary>\n        /// <param name=\"training\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">training</exception>\n        public void Train(ISkillLevel training)\n        {\n            training.ThrowIfNull(nameof(training));\n\n            Train(training.Skill, training.Level);\n        }\n\n        /// <summary>\n        /// Performs the given training. Same as <see cref=\"SetSkillLevel\"/> but only applied when the given level is greater than the current one.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"level\"></param>\n        public void Train(StaticSkill skill, long level)\n        {\n            SetSkillLevel(skill, level, LearningOptions.UpgradeOnly);\n        }\n\n        /// <summary>\n        /// Changes the level of the provided skill, updating the results.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"level\">The level.</param>\n        /// <param name=\"options\">The options.</param>\n        private void SetSkillLevel(StaticSkill skill, long level, LearningOptions options = LearningOptions.None)\n        {\n            int index = skill.ArrayIndex;\n\n            if (index > m_skillLevels.Length)\n                return;\n\n            // May quit for if this level is alread equal (or greater, depending on the options)\n            if ((options & LearningOptions.UpgradeOnly) != LearningOptions.None)\n            {\n                if (m_skillLevels[index] >= level)\n                    return;\n            }\n            else\n            {\n                if (m_skillLevels[index] == level)\n                    return;\n            }\n\n            // Update prerequisites\n            if ((options & LearningOptions.IgnorePrereqs) == LearningOptions.None)\n            {\n                // Deal with recursive prereqs (like Polaris)\n                foreach (StaticSkillLevel prereq in skill.Prerequisites.Where(prereq => prereq.Skill != skill))\n                {\n                    // Set the prereq's level\n                    SetSkillLevel(prereq.Skill, prereq.Level, options | LearningOptions.UpgradeOnly);\n                }\n            }\n\n            // Update training time\n            if ((options & LearningOptions.IgnoreTraining) == LearningOptions.None)\n            {\n                TrainingTime += GetTrainingTime(skill, level);\n                TrainedSkills.Add(new StaticSkillLevel(skill, level));\n            }\n\n            // Update skillpoints\n            if ((options & LearningOptions.FreezeSP) == LearningOptions.None)\n                UpdateSP(skill, level);\n\n            // Updates the skill level\n            m_skillLevels[index] = level;\n        }\n\n        /// <summary>\n        /// Updates the total SP count for this character\n        /// </summary>\n        /// <param name=\"staticSkill\"></param>\n        /// <param name=\"level\"></param>\n        private void UpdateSP(StaticSkill staticSkill, long level)\n        {\n            long targetSP = staticSkill.GetPointsRequiredForLevel(level);\n            long difference = targetSP - m_skillSP[staticSkill.ArrayIndex];\n\n            m_skillSP[staticSkill.ArrayIndex] = targetSP;\n            m_skillPoints += difference;\n        }\n\n        #endregion\n\n\n        #region Cloning, reseting, temporary changes\n\n        /// <summary>\n        /// Clear all the skills.\n        /// </summary>\n        public void ClearSkills()\n        {\n            for (int i = 0; i < m_skillSP.Length; i++)\n            {\n                m_skillLevels[i] = 0;\n            }\n\n            for (int i = 0; i < m_skillLevels.Length; i++)\n            {\n                m_skillLevels[i] = 0;\n            }\n\n            m_skillPoints = 0;\n            TrainingTime = TimeSpan.Zero;\n\n            foreach (CharacterAttributeScratchpad attribute in m_attributes)\n            {\n                attribute.UpdateEffectiveAttribute();\n            }\n        }\n\n        /// <summary>\n        /// Returns a clone of this scratchpad.\n        /// </summary>\n        /// <returns></returns>\n        public CharacterScratchpad Clone() => new CharacterScratchpad(this);\n\n        /// <summary>\n        /// Resets the scratchpad from the <see cref=\"BaseCharacter\"/> it was built upon.\n        /// </summary>\n        public void Reset()\n        {\n            CharacterScratchpad character = m_character as CharacterScratchpad;\n            if (character != null)\n                Reset(character);\n            else\n                ResetFromCharacter();\n        }\n\n        /// <summary>\n        /// Resets this scratchpad using the provided scratchpad.\n        /// </summary>\n        /// <param name=\"scratchpad\"></param>\n        private void Reset(CharacterScratchpad scratchpad)\n        {\n            m_skillPoints = scratchpad.m_skillPoints;\n            TrainingTime = scratchpad.TrainingTime;\n\n            TrainedSkills.Clear();\n            TrainedSkills.AddRange(scratchpad.TrainedSkills);\n\n            for (int i = 0; i < m_attributes.Length; i++)\n            {\n                m_attributes[i].Reset(scratchpad.m_attributes[i]);\n            }\n\n            scratchpad.m_skillSP.CopyTo(m_skillSP, 0);\n            scratchpad.m_skillLevels.CopyTo(m_skillLevels, 0);\n        }\n\n        /// <summary>\n        /// Resets the scratchpad from the <see cref=\"BaseCharacter\"/> it was built upon.\n        /// </summary>\n        private void ResetFromCharacter()\n        {\n            TrainingTime = TimeSpan.Zero;\n            TrainedSkills.Clear();\n\n            // Initialize attributes-related stuff\n            for (int i = 0; i < m_attributes.Length; i++)\n            {\n                ICharacterAttribute attrib = m_character[(EveAttribute)i];\n                m_attributes[i].Reset(attrib.Base, attrib.ImplantBonus);\n            }\n\n            // Initialize skills\n            m_skillPoints = 0;\n            foreach (StaticSkill skill in StaticSkills.AllSkills)\n            {\n                long sp = m_character.GetSkillPoints(skill);\n                long level = m_character.GetSkillLevel(skill);\n\n                m_skillPoints += sp;\n                m_skillSP[skill.ArrayIndex] = sp;\n                m_skillLevels[skill.ArrayIndex] = level;\n            }\n        }\n\n        /// <summary>\n        /// Allow to store the state of this scratchpad to restore it later.\n        /// The method returns an <see cref=\"IDisposable\"/> object which, once disposed, will restore the state.\n        /// </summary>\n        /// <remarks>Use it in a <c>using</c> block to enforce an automatic restoration of the object even when exceptions are throw.</remarks>\n        /// <returns>A disposable object which, once disposed, will restore the state of the </returns>\n        public IDisposable BeginTemporaryChanges()\n        {\n            CharacterScratchpad clone = Clone();\n            return new DisposableWithCallback(() => Reset(clone));\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/ExceptionHandler.cs",
    "content": "using System;\nusing System.Diagnostics;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Helpers\n{\n    public static class ExceptionHandler\n    {\n        /// <summary>\n        /// Logs an exception.\n        /// </summary>\n        /// <param name=\"e\">The exception.</param>\n        /// <param name=\"handled\">if set to <c>true</c> [handled].</param>\n        public static void LogException(Exception e, bool handled)\n        {\n            LogException(e, handled ? \"Handled exception\" : \"Unhandled exception\");\n        }\n\n        /// <summary>\n        /// Logs a rethrown exception.\n        /// </summary>\n        /// <param name=\"e\">The exception.</param>\n        public static void LogRethrowException(Exception e)\n        {\n            LogException(e, \"Exception caught and rethrown\");\n        }\n\n        /// <summary>\n        /// Logs the exception.\n        /// </summary>\n        /// <param name=\"e\">The exception.</param>\n        /// <param name=\"header\">The header.</param>\n        private static void LogException(Exception e, string header)\n        {\n            Trace.WriteLine(string.Empty);\n            EveMonClient.Trace(header);\n            Trace.Indent();\n            Trace.WriteLine(e.ToString().RemoveProjectLocalPath());\n            Trace.WriteLine(string.Empty);\n            Trace.Unindent();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Helpers/FileHelper.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Helpers\n{\n    public static class FileHelper\n    {\n        private static bool? s_removeReadOnlyAttributes;\n        private static readonly object s_removeReadOnlyAttributesLock = new object(); // Nullable<T> assignment is not atomic\n\n        /// <summary>\n        /// Opens a file, offering the user to retry if an exception occurs.\n        /// </summary>\n        /// <param name=\"filename\"></param>\n        /// <param name=\"allowIgnore\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">filename</exception>\n        public static Stream OpenRead(string filename, bool allowIgnore)\n        {\n            filename.ThrowIfNull(nameof(filename));\n\n            Uri uri = new Uri(filename);\n\n            if (uri.IsFile && !File.Exists(uri.LocalPath))\n                return null;\n\n            // While problems happen and the user ask to retry...\n            while (true)\n            {\n                try\n                {\n                    return new MemoryStream(File.ReadAllBytes(uri.LocalPath));\n                }\n                catch (UnauthorizedAccessException exc)\n                {\n                    ExceptionHandler.LogException(exc, true);\n\n                    string message = exc.Message;\n                    message += \"\\r\\n\\r\\nEVEMon failed to read a file. \" +\n                               \"You may have insufficient rights or a synchronization may be occuring. Choosing to \" +\n                               (allowIgnore ? \"abort\" : \"cancel\") + \" will make EVEMon quit.\";\n\n                    DialogResult result = MessageBox.Show(message, @\"Failed to read a file\",\n                        allowIgnore\n                            ? MessageBoxButtons.AbortRetryIgnore\n                            : MessageBoxButtons.RetryCancel,\n                        MessageBoxIcon.Error);\n\n                    // On abort, we quit the application\n                    if (result == DialogResult.Abort || result == DialogResult.Cancel)\n                    {\n                        Application.Exit();\n                        return null;\n                    }\n\n                    // The loop will begin again if the users asked to retry\n                    if (result == DialogResult.Ignore)\n                        return null;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Overwrites a destination file with the temporary file populated with content using the provided callback.\n        /// This method will take care of the readonly attributes, prompting the user to EVEMon removing them.\n        /// Finally, should a <see cref=\"UnauthorizedAccessException\"/> occurs, EVEMon will display a readable message for the end-user.\n        /// </summary>\n        /// <param name=\"destFileName\">The destination file name, it does not have to already exist</param>\n        /// <param name=\"writeContentFunc\"></param>\n        /// <returns>\n        /// False if the provided callback returned false or \n        /// if the user denied to remove the read-only attribute or \n        /// if he didn't have the permissions to write the file;\n        /// true otherwise.</returns>\n        /// <exception cref=\"System.ArgumentNullException\">destFileName or writeContentFunc</exception>\n        public static async Task OverwriteOrWarnTheUserAsync(string destFileName,\n            Func<Stream, Task<bool>> writeContentFunc)\n        {\n            destFileName.ThrowIfNull(nameof(destFileName));\n\n            writeContentFunc.ThrowIfNull(nameof(writeContentFunc));\n\n            string tempFileName = Path.GetTempFileName();\n            try\n            {\n                using (FileStream fs = Util.GetFileStream(tempFileName, FileMode.Open))\n                {\n                    if (!await writeContentFunc(fs))\n                        return;\n                }\n\n                CopyOrWarnTheUser(tempFileName, destFileName);\n            }\n            finally\n            {\n                DeleteFile(tempFileName);\n            }\n        }\n\n        /// <summary>\n        /// Overwrites a destination file with the provided source file by copying this one.\n        /// This method will take care of the readonly attributes, prompting the user to EVEMon removing them.\n        /// Finally, should a <see cref=\"UnauthorizedAccessException\"/> occurs, EVEMon will display a readable message for the end-user.\n        /// </summary>\n        /// <param name=\"srcFileName\">The source file name.</param>\n        /// <param name=\"destFileName\">The destination file name, it does not have to already exist</param>\n        /// <returns>False if the user denied to remove the read-only attribute or if he didn't have the permissions to write the file; true otherwise.</returns>\n        public static void CopyOrWarnTheUser(string srcFileName, string destFileName)\n        {\n            // While problems happen and the user ask to retry...\n            while (true)\n            {\n                try\n                {\n                    // We need to make sure this file is not read-only\n                    // If it is, this method will request the user the permission to automatically remove the readonly attributes\n                    if (!EnsureWritable(destFileName))\n                        return;\n\n                    // Overwrite the file\n                    CopyFile(srcFileName, destFileName);\n\n                    // Ensures we didn't copied a read-only attribute, no permission required since the file has been overwritten\n                    FileInfo destFile = new FileInfo(destFileName);\n                    destFile.Refresh();\n                    destFile.IsReadOnly = false;\n\n                    // Quit the loop\n                    return;\n                }\n                catch (UnauthorizedAccessException exc)\n                {\n                    ExceptionHandler.LogException(exc, true);\n\n                    string message = exc.Message;\n                    message += \"\\r\\n\\r\\nEVEMon failed to save to a file. You may have \" +\n                        \"insufficient rights or a synchronization may be active. \" +\n                        \"Choosing to abort will make EVEMon quit.\";\n\n                    DialogResult result = MessageBox.Show(message, @\"Failed to write over a file\",\n                        MessageBoxButtons.AbortRetryIgnore,\n                        MessageBoxIcon.Error);\n\n                    switch (result)\n                    {\n                        // On abort, we quit the application\n                        case DialogResult.Abort:\n                            Application.Exit();\n                            return;\n                        // The loop will begin again if the users asked to retry\n                        case DialogResult.Ignore:\n                            return;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Copies a file to another file.\n        /// </summary>\n        /// <param name=\"srcFileName\">Name of the source file.</param>\n        /// <param name=\"destFileName\">Name of the destination file.</param>\n        /// <returns></returns>\n        private static void CopyFile(string srcFileName, string destFileName)\n        {\n            using (Stream sourceStream = Util.GetFileStream(srcFileName, FileMode.Open, FileAccess.Read, FileShare.Read))\n            using (Stream destStream = Util.GetFileStream(destFileName, FileMode.Create, FileAccess.Write))\n                sourceStream.CopyTo(destStream);\n        }\n\n        /// <summary>\n        /// Ensures the given file is writable.\n        /// </summary>\n        /// <param name=\"filename\">The file to make writable.</param>\n        /// <returns>False if file exists, is readonly and the user denied permission to make it writable; true otherwise.</returns>\n        private static bool EnsureWritable(string filename)\n        {\n            FileInfo file = new FileInfo(filename);\n            return !file.Exists || TryMakeWritable(file);\n        }\n\n        /// <summary>\n        /// Try to make a file writable, requesting the user the right to remove the readonly attributes the first time\n        /// </summary>\n        /// <param name=\"file\">The file to make writable. It must exists but does not have to be read-only</param>\n        /// <returns>False if the file was readonly and the user denied permission to make it writable; true otherwise</returns>\n        private static bool TryMakeWritable(FileInfo file)\n        {\n            // Return true if the file can be written to.\n            if (!file.IsReadOnly)\n                return true;\n\n            // Return false if we're not allowed to remove the read-only attribute\n            if (!HasPermissionToRemoveReadOnlyAttributes)\n                return false;\n\n            // Remove the attribute\n            file.IsReadOnly = false;\n\n            return true;\n        }\n\n        /// <summary>\n        /// Request from the use the permission for EVEMon to remove the read-only attributes on its own files\n        /// </summary>\n        /// <returns>True if the user granted the rights to make its files writable, false otherwise</returns>\n        private static bool HasPermissionToRemoveReadOnlyAttributes\n        {\n            get\n            {\n                lock (s_removeReadOnlyAttributesLock)\n                {\n                    // We request the user to allow us to remove the attributes\n                    if (s_removeReadOnlyAttributes.HasValue)\n                        return s_removeReadOnlyAttributes.Value;\n\n                    // Prepare caption and text\n                    string message = \"EVEMon detected that some of its files are read-only, \" +\n                                     \"preventing it to save its datas.\\r\\n\\r\\n\";\n                    message +=\n                        \"Choosing YES will allow EVEMon to remove the read-only attributes on its own files (only).\\r\\n\";\n                    message += \"Choosing NO will force EVEMon to continue without writing its files. \" +\n                               \"This can cause unexpected behaviours.\\r\\n\\r\\n\";\n                    message += \"Note : if you restart EVEMon and it still encounters read-only files, \" +\n                               \"you will be prompted again.\";\n\n                    // Display the message box\n                    DialogResult result = MessageBox.Show(message, @\"Allow EVEMon to make its files writable\",\n                        MessageBoxButtons.YesNo,\n                        MessageBoxIcon.Error);\n\n                    // User denied us the permission to make files writeable\n                    s_removeReadOnlyAttributes = result != DialogResult.No;\n\n                    // Returns the permission granted by the user\n                    return s_removeReadOnlyAttributes.Value;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Deletes the file.\n        /// </summary>\n        /// <param name=\"filename\">The filename.</param>\n        public static bool DeleteFile(string filename)\n        {\n            bool success = false;\n            try\n            {\n                File.Delete(filename);\n                success = true;\n            }\n            catch (ArgumentException ex)\n            {\n                ExceptionHandler.LogException(ex, false);\n            }\n            catch (IOException ex)\n            {\n                ExceptionHandler.LogException(ex, false);\n            }\n            catch (UnauthorizedAccessException ex)\n            {\n                ExceptionHandler.LogException(ex, false);\n            }\n\n            return success;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/FormatHelper.cs",
    "content": "﻿using System;\nusing System.Globalization;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Helpers\n{\n    public static class FormatHelper\n    {\n\n        /// <summary>\n        /// Formats the given value into an abbreviated format string.\n        /// </summary>\n        /// <param name=\"value\">The value.</param>\n        /// <param name=\"format\">The format.</param>\n        /// <param name=\"truncated\">if set to <c>true</c> [truncated].</param>\n        /// <param name=\"culture\">The culture.</param>\n        /// <returns></returns>\n        public static string Format(double value, AbbreviationFormat format, bool truncated = true, CultureInfo culture = null)\n            => Format(Convert.ToDecimal(value), format, truncated, culture);\n\n        /// <summary>\n        /// Formats the given value into an abbreviated format string.\n        /// </summary>\n        /// <param name=\"value\">The value.</param>\n        /// <param name=\"format\">The format.</param>\n        /// <param name=\"truncated\">if set to <c>true</c> [truncated].</param>\n        /// <param name=\"culture\">The culture.</param>\n        /// <returns></returns>\n        public static string Format(int value, AbbreviationFormat format, bool truncated = true, CultureInfo culture = null)\n            => Format(Convert.ToDecimal(value), format, truncated, culture);\n\n        /// <summary>\n        /// Formats the given value into an abbreviated format string.\n        /// </summary>\n        /// <param name=\"value\">The value.</param>\n        /// <param name=\"format\">The format.</param>\n        /// <param name=\"truncated\">if set to <c>true</c> [truncated].</param>\n        /// <param name=\"culture\">The culture.</param>\n        /// <returns></returns>\n        public static string Format(long value, AbbreviationFormat format, bool truncated = true, CultureInfo culture = null)\n            => Format(Convert.ToDecimal(value), format, truncated, culture);\n\n        /// <summary>\n        /// Formats the given value into an abbreviated format string.\n        /// </summary>\n        /// <param name=\"value\">The value.</param>\n        /// <param name=\"format\">The format.</param>\n        /// <param name=\"truncated\">if set to <c>true</c> [truncated].</param>\n        /// <param name=\"culture\">The culture.</param>\n        /// <returns></returns>\n        public static string Format(decimal value, AbbreviationFormat format, bool truncated = true, CultureInfo culture = null)\n        {\n            if (culture == null)\n                culture = CultureConstants.DefaultCulture;\n\n            decimal abs = Math.Abs(value);\n            if (format == AbbreviationFormat.AbbreviationWords)\n            {\n                if (abs >= 1E9M)\n                    return Format(\" Billions\", value / 1E9M, truncated, culture);\n                if (abs >= 1E6M)\n                    return Format(\" Millions\", value / 1E6M, truncated, culture);\n\n                return abs >= 1E3M\n                    ? Format(\" Thousands\", value / 1E3M, truncated, culture)\n                    : Format(string.Empty, value, truncated, culture);\n            }\n\n            if (abs >= 1E9M)\n                return Format(\" B\", value / 1E9M, truncated, culture);\n            if (abs >= 1E6M)\n                return Format(\" M\", value / 1E6M, truncated, culture);\n\n            return abs >= 1E3M ? Format(\" K\", value / 1E3M, truncated, culture) : Format(string.Empty, value, truncated, culture);\n        }\n\n        /// <summary>\n        /// Formats the given value and suffix the way we want.\n        /// </summary>\n        /// <param name=\"suffix\">The suffix.</param>\n        /// <param name=\"value\">The value.</param>\n        /// <param name=\"truncated\">if set to <c>true</c> [truncated].</param>\n        /// <param name=\"culture\">The culture.</param>\n        /// <returns></returns>\n        private static string Format(string suffix, decimal value, bool truncated, CultureInfo culture)\n        {\n            if (!truncated)\n                return value.ToNumericString(2, culture) + suffix;\n\n            // Explanations : 999.99 was displayed as 1000 because only three digits were required\n            // So we do the truncation at hand for the number of digits we exactly request\n\n            decimal abs = Math.Abs(value);\n            if (abs < 1.0M)\n                return ((int)value * 100 / 100M).ToString(\"0.##\", culture) + suffix;\n            if (abs < 10.0M)\n                return ((int)value * 1000 / 1000M).ToString(\"#.##\", culture) + suffix;\n            if (abs < 100.0M)\n                return ((int)value * 1000 / 1000M).ToString(\"##.#\", culture) + suffix;\n\n            return ((int)value * 1000 / 1000M).ToString(\"###\", culture) + suffix;\n        }\n\n        /// <summary>\n        /// Formats the given value into an abbreviated format string.\n        /// </summary>\n        /// <param name=\"direct\">If true, ToNumericString is used instead of Format.</param>\n        /// <param name=\"places\">If direct is true, the number of decimal places used for ToNumericString.</param>\n        /// <param name=\"value\">The value.</param>\n        /// <param name=\"format\">The format.</param>\n        /// <param name=\"truncated\">if set to <c>true</c> [truncated].</param>\n        /// <param name=\"culture\">The culture.</param>\n        /// <returns></returns>\n        public static string FormatIf(bool direct, int places, decimal value,\n            AbbreviationFormat format, bool truncated = true, CultureInfo culture = null)\n        {\n            return direct ? Format(value, format, truncated, culture) : value.ToNumericString(\n                places);\n        }\n\n        /// <summary>\n        /// Formats the given value into an abbreviated format string.\n        /// </summary>\n        /// <param name=\"direct\">If true, ToNumericString is used instead of Format.</param>\n        /// <param name=\"places\">If direct is true, the number of decimal places used for ToNumericString.</param>\n        /// <param name=\"value\">The value.</param>\n        /// <param name=\"format\">The format.</param>\n        /// <param name=\"truncated\">if set to <c>true</c> [truncated].</param>\n        /// <param name=\"culture\">The culture.</param>\n        /// <returns></returns>\n        public static string FormatIf(bool direct, long value, AbbreviationFormat format,\n            bool truncated = true, CultureInfo culture = null)\n        {\n            return direct ? Format(value, format, truncated, culture) : value.\n                ToNumericString(0);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/GAnalyticsTracker.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Threading;\n\nnamespace EVEMon.Common.Helpers\n{\n    public static class GAnalyticsTracker\n    {\n        private static readonly GampParameters s_parameters;\n\n        private const string DailyStartText = \"Daily-Start\";\n\n        /// <summary>\n        /// Initializes the <see cref=\"GAnalyticsTracker\"/> class.\n        /// </summary>\n        static GAnalyticsTracker()\n        {\n            string userAgentId = Util.Decrypt(\"+PzrIVxVhL3PBJcRYN2tXg==\", CultureConstants.InvariantCulture.NativeName);\n            string clientId = EveMonClient.IsDebugBuild ? \"2\" : \"1\";\n\n            s_parameters = new GampParameters\n            {\n                ProtocolVersion = \"1\",\n                TrackerId = $\"{userAgentId}-{clientId}\",\n                AnonymizeIp = true,\n                ClientId = Util.CreateSHA1SumFromMacAddress(),\n                ApplicationName = EveMonClient.FileVersionInfo.ProductName,\n                ApplicationVersion = EveMonClient.FileVersionInfo.FileVersion,\n                ScreenResolution = $\"{Screen.PrimaryScreen.WorkingArea.Width}x{Screen.PrimaryScreen.WorkingArea.Height}\",\n                UserAgent = HttpWebClientServiceState.UserAgent\n            };\n        }\n\n        /// <summary>\n        /// Tracks the starting of the application asynchronously.\n        /// </summary>\n        /// <param name=\"type\">The type.</param>\n        /// <param name=\"action\">The action.</param>\n        /// <remarks>Default action is 'Start'</remarks>\n        public static void TrackStart(Type type, string action = null)\n        {\n            if (string.IsNullOrWhiteSpace(action))\n                action = SessionStatus.Start.ToString();\n\n            if (action != SessionStatus.Start.ToString() && action != DailyStartText)\n            {\n                throw new ArgumentException($\"Only actions '{SessionStatus.Start}' and '{DailyStartText}' are allowed.\");\n            }\n\n            TrackEventAsync(type, \"ApplicationLifecycle\", action);\n        }\n\n        /// <summary>\n        /// Tracks the ending of the application.\n        /// </summary>\n        /// <param name=\"type\">The type.</param>\n        public static void TrackEnd(Type type)\n        {\n            TrackEvent(type, \"ApplicationLifecycle\", SessionStatus.End.ToString());\n        }\n\n        /// <summary>\n        /// Tracks the event.\n        /// </summary>\n        /// <param name=\"type\">The type.</param>\n        /// <param name=\"category\">The category.</param>\n        /// <param name=\"action\">The action.</param>\n        private static void TrackEvent(Type type, string category, string action)\n        {\n            InitEvent(type, category, action);\n            if (NetworkMonitor.IsNetworkAvailable)\n            {\n                var result = HttpWebClientService.DownloadImage(new Uri(NetworkConstants.\n                    GoogleAnalyticsUrl), new RequestParams(BuildQueryString()));\n                if (EveMonClient.IsDebugBuild)\n                {\n                    // Trace the error (if any) and event category\n                    EveMonClient.Trace($\"({category} - {action})\");\n                    if (result.Error != null)\n                        EveMonClient.Trace($\"{result.Error.Message}\");\n                }\n            }\n            else\n            {\n                // Reschedule later\n                Dispatcher.Schedule(TimeSpan.FromMinutes(1), () => TrackEvent(type, category,\n                    action));\n                if (EveMonClient.IsDebugBuild)\n                    EveMonClient.Trace($\"in {TimeSpan.FromMinutes(1)}\");\n            }\n        }\n\n        /// <summary>\n        /// Tracks the event asynchronously.\n        /// </summary>\n        /// <param name=\"type\">The type.</param>\n        /// <param name=\"category\">The category.</param>\n        /// <param name=\"action\">The action.</param>\n        private static void TrackEventAsync(Type type, string category, string action)\n        {\n            InitEvent(type, category, action);\n\n            // Sent notification\n            if (NetworkMonitor.IsNetworkAvailable)\n            {\n                HttpWebClientService.DownloadImageAsync(new Uri(NetworkConstants.GoogleAnalyticsUrl),\n                    new RequestParams(BuildQueryString())).ContinueWith(task =>\n                {\n                    if (EveMonClient.IsDebugBuild)\n                    {\n                        EveMonClient.Trace($\"GAnalyticsTracker.TrackEventAsync - ({category} - {action})\",\n                            printMethod: false);\n                        if (task.Result.Error != null)\n                            EveMonClient.Trace($\"GAnalyticsTracker.TrackEventAsync - {task.Result.Error.Message}\",\n                                printMethod: false);\n                        else\n                            EveMonClient.Trace($\"GAnalyticsTracker.TrackEventAsync - in {TimeSpan.FromDays(1)}\",\n                                printMethod: false);\n                    }\n                    Dispatcher.Schedule(TimeSpan.FromDays(1), () => TrackStart(type, DailyStartText));\n                }, EveMonClient.CurrentSynchronizationContext);\n            }\n            else\n            {\n                // Reschedule later\n                Dispatcher.Schedule(TimeSpan.FromMinutes(1), () => TrackEventAsync(type,\n                    category, action));\n                if (EveMonClient.IsDebugBuild)\n                    EveMonClient.Trace($\"GAnalyticsTracker.TrackEventAsync - in {TimeSpan.FromMinutes(1)}\",\n                        printMethod: false);\n            }\n        }\n\n        /// <summary>\n        /// Initializes the event.\n        /// </summary>\n        /// <param name=\"type\">The type.</param>\n        /// <param name=\"category\">The category.</param>\n        /// <param name=\"action\">The action.</param>\n        private static void InitEvent(Type type, string category, string action)\n        {\n            s_parameters.HitType = GaHitType.Event;\n            s_parameters.ScreenName = type.Name;\n            s_parameters.EventCategory = category;\n            s_parameters.EventAction = action;\n\n            SessionStatus status;\n            s_parameters.SessionControl = Enum.TryParse(action, true, out status)\n                ? status.ToString().ToLowerInvariant()\n                : null;\n        }\n\n        /// <summary>\n        /// Builds the query string.\n        /// </summary>\n        /// <returns></returns>\n        private static string BuildQueryString()\n        {\n            StringBuilder sb = new StringBuilder();\n            IDictionary<string, string> parameters = GetParametersAsDict();\n\n            foreach (KeyValuePair<string, string> parameter in parameters)\n            {\n                sb.Append($\"{parameter.Key}={Uri.EscapeDataString(parameter.Value)}\");\n\n                if (parameters.Keys.Last() != parameter.Key)\n                    sb.Append(\"&\");\n            }\n\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Gets the parameters as dictionary.\n        /// </summary>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        private static IDictionary<string, string> GetParametersAsDict()\n        {\n            IDictionary<string, string> parametersDict = new Dictionary<string, string>();\n\n            foreach (PropertyInfo prop in s_parameters\n                .GetType().GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))\n            {\n                GampParameterAttribute attribute =\n                    Attribute.GetCustomAttribute(prop, typeof(GampParameterAttribute), true) as GampParameterAttribute;\n\n                if (attribute == null)\n                    continue;\n\n                object value = prop.GetValue(s_parameters, null);\n\n                if (value == null)\n                {\n                    if (attribute.IsRequired)\n                        prop.ThrowIfNull(prop.Name, $\"{prop.Name} is a required parameter\");\n\n                    continue;\n                }\n\n                if (prop.PropertyType.IsEnum)\n                    value = value.ToString().ToLowerInvariant();\n                else if (prop.PropertyType == typeof(bool))\n                    value = Convert.ToInt32(value);\n\n                parametersDict.Add(attribute.Token, value.ToString());\n            }\n\n            return parametersDict;\n        }\n\n\n        #region Private Helper Classes\n\n        private enum GaHitType\n        {\n            Event,\n        }\n\n        private enum SessionStatus\n        {\n            Start,\n            End\n        }\n\n        private class GampParameters\n        {\n            /// <summary>\n            /// Gets or sets the protocol version.\n            /// </summary>\n            /// <value>\n            /// The protocol version.\n            /// </value>\n            [GampParameter(\"v\", true)]\n            internal string ProtocolVersion { get; set; }\n\n            /// <summary>\n            /// Gets or sets the tracker identifier.\n            /// </summary>\n            /// <value>\n            /// The tracker identifier.\n            /// </value>\n            [GampParameter(\"tid\", true)]\n            internal string TrackerId { get; set; }\n\n            /// <summary>\n            /// Gets or sets a value indicating whether [anonymize ip].\n            /// </summary>\n            /// <value>\n            ///   <c>true</c> if [anonymize ip]; otherwise, <c>false</c>.\n            /// </value>\n            [GampParameter(\"aip\")]\n            internal bool AnonymizeIp { get; set; }\n\n            /// <summary>\n            /// Gets or sets the client identifier.\n            /// </summary>\n            /// <value>\n            /// The client identifier.\n            /// </value>\n            [GampParameter(\"cid\", true)]\n            internal string ClientId { get; set; }\n\n            /// <summary>\n            /// Gets or sets the type of the hit.\n            /// </summary>\n            /// <value>\n            /// The type of the hit.\n            /// </value>\n            [GampParameter(\"t\", true)]\n            internal GaHitType HitType { get; set; }\n\n            /// <summary>\n            /// Gets or sets the name of the screen.\n            /// </summary>\n            /// <value>\n            /// The name of the screen.\n            /// </value>\n            [GampParameter(\"cd\", true)]\n            internal string ScreenName { get; set; }\n\n            /// <summary>\n            /// Gets or sets the name of the application.\n            /// </summary>\n            /// <value>\n            /// The name of the application.\n            /// </value>\n            [GampParameter(\"an\", true)]\n            internal string ApplicationName { get; set; }\n\n            /// <summary>\n            /// Gets or sets the control of the session.\n            /// </summary>\n            /// <value>\n            /// The name of the screen.\n            /// </value>\n            [GampParameter(\"sc\")]\n            internal string SessionControl { get; set; }\n\n            /// <summary>\n            /// Gets or sets the resolution of the screen.\n            /// </summary>\n            /// <value>\n            /// The name of the screen.\n            /// </value>\n            [GampParameter(\"sr\")]\n            internal string ScreenResolution { get; set; }\n\n            /// <summary>\n            /// Gets or sets the application version.\n            /// </summary>\n            /// <value>\n            /// The application version.\n            /// </value>\n            [GampParameter(\"av\")]\n            internal string ApplicationVersion { get; set; }\n\n            /// <summary>\n            /// Gets or sets the event category.\n            /// </summary>\n            /// <value>\n            /// The event category.\n            /// </value>\n            [GampParameter(\"ec\")]\n            internal string EventCategory { get; set; }\n\n            /// <summary>\n            /// Gets or sets the event action.\n            /// </summary>\n            /// <value>\n            /// The event action.\n            /// </value>\n            [GampParameter(\"ea\")]\n            internal string EventAction { get; set; }\n\n            /// <summary>\n            /// Gets or sets the user agent info.\n            /// </summary>\n            /// <value>\n            /// The name of the screen.\n            /// </value>\n            [GampParameter(\"ua\")]\n            internal string UserAgent { get; set; }\n\n            /// <summary>\n            /// Gets or sets the user language.\n            /// </summary>\n            /// <value>\n            /// The name of the screen.\n            /// </value>\n            [GampParameter(\"ul\")]\n            internal string UserLanguage => Encoding.Default.BodyName;\n\n            /// <summary>\n            /// Gets or sets the document encoding.\n            /// </summary>\n            /// <value>\n            /// The name of the screen.\n            /// </value>\n            [GampParameter(\"de\")]\n            internal string DocumentEncoding => CultureInfo.CurrentUICulture.Name;\n        }\n\n        [AttributeUsage(AttributeTargets.Property | AttributeTargets.Enum)]\n        private class GampParameterAttribute : Attribute\n        {\n            /// <summary>\n            /// Initializes a new instance of the <see cref=\"GampParameterAttribute\"/> class.\n            /// </summary>\n            /// <param name=\"token\">The token.</param>\n            /// <param name=\"isRequried\">if set to <c>true</c> [is requried].</param>\n            internal GampParameterAttribute(string token, bool isRequried = false)\n            {\n                Token = token;\n                IsRequired = isRequried;\n            }\n\n            /// <summary>\n            /// Gets the token.\n            /// </summary>\n            /// <value>\n            /// The token.\n            /// </value>\n            internal string Token { get; }\n\n            /// <summary>\n            /// Gets a value indicating whether this instance is required.\n            /// </summary>\n            /// <value>\n            /// <c>true</c> if this instance is required; otherwise, <c>false</c>.\n            /// </value>\n            internal bool IsRequired { get; }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/ImageHelper.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Service;\n\nnamespace EVEMon.Common.Helpers\n{\n    public static class ImageHelper\n    {\n        private const string NO_TYPE = \"\";\n\n        /// <summary>\n        /// Gets the URL for the image of the specified alliance.\n        /// </summary>\n        /// <param name=\"id\">the ID for the given type.</param>\n        /// <param name=\"size\">the image size.</param>\n        /// <returns></returns>\n        public static Uri GetAllianceImageURL(long id, int size = (int)EveImageSize.x32)\n        {\n            return ImageService.GetImageServerBaseUri(string.Format(CultureConstants.\n                InvariantCulture, NetworkConstants.CCPAllianceLogo, id, size));\n        }\n\n        /// <summary>\n        /// Gets the URL for the image of the specified corporation.\n        /// </summary>\n        /// <param name=\"id\">the ID for the given type.</param>\n        /// <param name=\"size\">the image size.</param>\n        /// <returns></returns>\n        public static Uri GetCorporationImageURL(long id, int size = (int)EveImageSize.x32)\n        {\n            return ImageService.GetImageServerBaseUri(string.Format(CultureConstants.\n                InvariantCulture, NetworkConstants.CCPCorporationLogo, id, size));\n        }\n\n        /// <summary>\n        /// Gets the URL for the image of the specified type.\n        /// </summary>\n        /// <param name=\"id\">the ID for the given type.</param>\n        /// <param name=\"size\">the image size.</param>\n        /// <returns></returns>\n        public static Uri GetTypeImageURL(long id, int size = (int)EveImageSize.x32)\n        {\n            return ImageService.GetImageServerBaseUri(string.Format(CultureConstants.\n                InvariantCulture, NetworkConstants.CCPTypeImage, id, size));\n        }\n\n        /// <summary>\n        /// Gets the URL for the render of the specified type.\n        /// </summary>\n        /// <param name=\"id\">the ID for the given type.</param>\n        /// <param name=\"size\">the image size.</param>\n        /// <returns></returns>\n        public static Uri GetTypeRenderURL(long id, int size = (int)EveImageSize.x32)\n        {\n            return ImageService.GetImageServerBaseUri(string.Format(CultureConstants.\n                InvariantCulture, NetworkConstants.CCPTypeRender, id, size));\n        }\n\n        /// <summary>\n        /// Gets the URL for the portrait of the specified character.\n        /// </summary>\n        /// <param name=\"id\">the ID for the character.</param>\n        /// <param name=\"size\">the image size.</param>\n        /// <returns></returns>\n        public static Uri GetPortraitUrl(long id, int size = (int)EveImageSize.x32)\n        {\n            return ImageService.GetImageServerBaseUri(string.Format(CultureConstants.\n                InvariantCulture, NetworkConstants.CCPPortraits, id, size));\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/KillLogExporter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Helpers\n{\n    public static class KillLogExporter\n    {\n        /// <summary>\n        /// Copies the kill info to clipboard.\n        /// </summary>\n        public static void CopyKillInfoToClipboard(KillLog killLog)\n        {\n            try\n            {\n                string killLogInfoText = ExportKillLogInfo(killLog);\n                if (string.IsNullOrEmpty(killLogInfoText))\n                {\n                    MessageBox.Show(@\"No kill info was available. Nothing has been copied to the clipboard.\",\n                        @\"Copy\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                    return;\n                }\n\n                Clipboard.SetText(killLogInfoText, TextDataFormat.Text);\n                MessageBox.Show(@\"The kill info have been copied to the clipboard.\",\n                    @\"Copy\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n            }\n            catch (ExternalException ex)\n            {\n                // Occurs when another process is using the clipboard\n                ExceptionHandler.LogException(ex, true);\n                MessageBox.Show(@\"Couldn't complete the operation, the clipboard is being used by another process. \" +\n                                @\"Wait a few moments and try again.\");\n            }\n        }\n\n        /// <summary>\n        /// Exports the kill log info.\n        /// </summary>\n        /// <returns></returns>\n        private static string ExportKillLogInfo(KillLog killLog)\n        {\n            if (killLog == null)\n                return string.Empty;\n\n            StringBuilder sb = new StringBuilder();\n            sb\n                .AppendLine(killLog.KillTime.DateTimeToDotFormattedString())\n                .AppendLine()\n                .AppendLine($\"Victim: {killLog.Victim.Name}\")\n                .AppendLine($\"Corp: {killLog.Victim.CorporationName}\")\n                .AppendLine($\"Alliance: {killLog.Victim.AllianceName}\")\n                .AppendLine($\"Faction: {killLog.Victim.FactionName}\")\n                .AppendLine($\"Destroyed: {killLog.Victim.ShipTypeName}\")\n                .AppendLine($\"System: {killLog.SolarSystem?.Name}\")\n                .AppendLine(FormattableString.Invariant($\"Security: {killLog.SolarSystem?.SecurityLevel:N1}\"))\n                .AppendLine(FormattableString.Invariant($\"Damage Taken: {killLog.Victim.DamageTaken:N}\"));\n\n            sb.AppendLine();\n            sb.AppendLine(\"Involved parties:\");\n            sb.AppendLine();\n\n            foreach (SerializableKillLogAttackersListItem attacker in killLog.Attackers.OrderByDescending(x => x.DamageDone))\n            {\n                // Append info for NPC or player entities\n                if (string.IsNullOrEmpty(attacker.Name))\n                    sb.Append($\"Name: {attacker.ShipTypeName} / {attacker.CorporationName}\");\n                else\n                    sb.Append($\"Name: {attacker.Name}\");\n\n                if (attacker.FinalBlow)\n                    sb.Append(\" (laid the final blow)\");\n\n                sb.AppendLine();\n\n                // Append info only for player entities\n                if (!string.IsNullOrEmpty(attacker.Name))\n                {\n                    sb.AppendLine(FormattableString.Invariant($\"Security: {attacker.SecurityStatus:N1}\"))\n                        .AppendLine($\"Corp: {attacker.CorporationName}\")\n                        .AppendLine($\"Alliance: {(attacker.AllianceName.IsEmptyOrUnknown() ? \"None\" : attacker.AllianceName)}\")\n                        .AppendLine($\"Faction: {(attacker.FactionName.IsEmptyOrUnknown() ? \"None\" : attacker.FactionName)}\")\n                        .AppendLine($\"Ship: {attacker.ShipTypeName}\")\n                        .AppendLine($\"Weapon: {attacker.WeaponTypeName}\");\n                }\n\n                sb.AppendLine(FormattableString.Invariant($\"Damage Done: {attacker.DamageDone:N}\")).AppendLine();\n            }\n\n            if (killLog.Items.Any(x => x.QtyDestroyed != 0))\n            {\n                sb.AppendLine(\"Destroyed items:\");\n                sb.AppendLine();\n                AppendDestroyedItems(sb, killLog.Items.Where(x => x.QtyDestroyed != 0));\n                sb.AppendLine();\n            }\n\n            if (killLog.Items.Any(x => x.QtyDropped != 0))\n            {\n                sb.AppendLine(\"Dropped items:\");\n                sb.AppendLine();\n                AppendDroppedItems(sb, killLog.Items.Where(x => x.QtyDropped != 0));\n                sb.AppendLine();\n            }\n\n            sb.AppendLine(\"<-- Generated by EVEMon -->\");\n\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Appends the dropped items.\n        /// </summary>\n        /// <param name=\"sb\">The sb.</param>\n        /// <param name=\"droppedItems\">The dropped items.</param>\n        private static void AppendDroppedItems(StringBuilder sb, IEnumerable<KillLogItem> droppedItems)\n        {\n            foreach (KillLogItem droppedItem in droppedItems.Where(droppedItem => droppedItem.EVEFlag != 0 || droppedItem.IsInContainer))\n            {\n                if (droppedItem.IsInContainer)\n                    sb.Append(\"   \");\n\n                sb.Append(droppedItem.Name);\n\n                if (droppedItem.QtyDropped > 1)\n                    sb.Append(FormattableString.Invariant($\", Qty: {droppedItem.QtyDropped:N}\"));\n\n                if (!string.IsNullOrEmpty(droppedItem.InventoryText))\n                    sb.Append($\" ({droppedItem.InventoryText})\");\n\n                if (droppedItem.IsInContainer)\n                    sb.Append(\" (In Container)\");\n\n                sb.AppendLine();\n\n                // Append any items inside a container\n                if (droppedItem.Items.Any())\n                    AppendDroppedItems(sb, droppedItem.Items.Where(x => x.QtyDropped != 0));\n            }\n        }\n\n        /// <summary>\n        /// Appends the destroyed items.\n        /// </summary>\n        /// <param name=\"sb\">The sb.</param>\n        /// <param name=\"destroyedItems\">The destroyed items.</param>\n        private static void AppendDestroyedItems(StringBuilder sb, IEnumerable<KillLogItem> destroyedItems)\n        {\n            foreach (KillLogItem destroyedItem in destroyedItems.Where(destroyedItem => destroyedItem.EVEFlag != 0 || destroyedItem.IsInContainer))\n            {\n                if (destroyedItem.IsInContainer)\n                    sb.Append(\"   \");\n\n                sb.Append(destroyedItem.Name);\n\n                if (destroyedItem.QtyDestroyed > 1)\n                    sb.Append(FormattableString.Invariant($\", Qty: {destroyedItem.QtyDestroyed:N}\"));\n\n                if (!string.IsNullOrEmpty(destroyedItem.InventoryText))\n                    sb.Append($\" ({destroyedItem.InventoryText})\");\n\n                if (destroyedItem.IsInContainer)\n                    sb.Append(\" (In Container)\");\n\n                sb.AppendLine();\n\n                // Append any items inside a container\n                if (destroyedItem.Items.Any())\n                    AppendDestroyedItems(sb, destroyedItem.Items.Where(x => x.QtyDestroyed != 0));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/ListViewExporter.cs",
    "content": "using System;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Helpers\n{\n    public static class ListViewExporter\n    {\n        /// <summary>\n        /// This method takes a list view and returns a multi-line string that represents the listview as a CSV (comma-delimited) file.\n        /// </summary>\n        /// <param name=\"listViewToExport\">Thr listview to export.</param>\n        /// <param name=\"withUnit\">if set to <c>true</c> listView is exported with unit column.</param>\n        /// <remarks>\n        /// For delimiter we use the semicolon in order to support decimal and thousand seperator in different cultures.\n        /// The major difference is that the list view assumes to contain units, so if the values in each column contain two values seperated by a space\n        /// and the second value is the same in every column (1 and beyond), the unit is seperated out and placed in column \"2\". This allows the\n        /// values to be imported into the spreadsheet software as a number, instead of a string enabling numerical analysis of the export.\n        /// </remarks>\n        /// <exception cref=\"System.ArgumentNullException\">listViewToExport</exception>\n        public static void CreateCSV(ListView listViewToExport, bool withUnit = false)\n        {\n            listViewToExport.ThrowIfNull(nameof(listViewToExport));\n\n            using (var saveFileDialog = new SaveFileDialog())\n            {\n                saveFileDialog.Filter = @\"Comma Delimited Files (Semicolon) (*.csv)|*.csv\";\n                if (saveFileDialog.ShowDialog() != DialogResult.OK)\n                    return;\n\n                var sb = new StringBuilder(8192);\n                bool hasGroups = (listViewToExport.Groups?.Count ?? 0) > 0;\n\n                // Export the column headers\n                bool ignoreSemicolon = true;\n                for (int i = 0; i < listViewToExport.Columns.Count; i++)\n                {\n                    ColumnHeader myColumn = listViewToExport.Columns[i];\n                    sb.Append(MakeCSVString(myColumn.Text, ignoreSemicolon));\n                    ignoreSemicolon = false;\n\n                    if (i == 0 && withUnit)\n                        sb.Append(MakeCSVString(\"Unit\"));\n                }\n                if (hasGroups)\n                    sb.Append(MakeCSVString(\"Group\"));\n                sb.AppendLine();\n\n                for (int line = 0; line < listViewToExport.Items.Count; line++)\n                {\n                    var item = listViewToExport.Items[line];\n                    string[] elements = item.SubItems[1].Text.Split(\" \".ToCharArray());\n                    string unit = string.Empty;\n                    if (withUnit)\n                    {\n                        // Determine if the items have a unit description\n                        string possibleUnit = string.Join(\" \", elements.Skip(1));\n                        bool hasUnit = elements.Length > 1 &&\n                                       StaticProperties.AllProperties.Any(prop => prop.Unit == possibleUnit);\n                        if (hasUnit)\n                            unit = possibleUnit;\n                    }\n\n                    // Export the lines\n                    ignoreSemicolon = true;\n                    int maxElements = Math.Min(listViewToExport.Columns.Count, item.SubItems.Count);\n\n                    for (int subitem = 0; subitem < maxElements; subitem++)\n                    {\n                        elements = item.SubItems[subitem].Text.Split(\" \".ToCharArray());\n\n                        // If the value is a number format it as so; as string otherwise\n                        double number;\n                        sb.Append(double.TryParse(elements[0], out number) ? MakeCSVNumber(\n                            number.ToString(CultureConstants.DefaultCulture), ignoreSemicolon) :\n                            MakeCSVString(item.SubItems[subitem].Text, ignoreSemicolon));\n\n                        ignoreSemicolon = false;\n\n                        if (subitem == 0 && withUnit)\n                            sb.Append(MakeCSVString(unit));\n                    }\n\n                    // Export the group\n                    var group = item.Group;\n                    if (hasGroups && group != null)\n                        sb.Append(MakeCSVString(group.Header));\n                    sb.AppendLine();\n                }\n\n                File.WriteAllText(saveFileDialog.FileName, sb.ToString());\n            }\n        }\n\n        /// <summary>\n        /// Makes the CSV string.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"ignoreSemicolon\">if set to <c>true</c> ignore semicolon.</param>\n        /// <returns></returns>\n        private static string MakeCSVString(string text, bool ignoreSemicolon = false)\n            => MakeCSVNumber($\"\\\"{text}\\\"\", ignoreSemicolon);\n\n        /// <summary>\n        /// Makes the CSV number.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"ignoreSemicolon\">if set to <c>true</c> ignore semicolon.</param>\n        /// <returns></returns>\n        private static string MakeCSVNumber(string text, bool ignoreSemicolon = false)\n            => $\"{(ignoreSemicolon ? string.Empty : \";\")}{text}\";\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/Loadout.cs",
    "content": "using System;\nusing System.Linq;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Helpers\n{\n    public sealed class Loadout : LoadoutBase\n    {\n        /// <summary>\n        /// Prevents a default instance of the <see cref=\"Loadout\"/> class from being created.\n        /// </summary>\n        public Loadout()\n        {\n            ID = 0;\n            Name = string.Empty;\n            Description = string.Empty;\n            Author = string.Empty;\n            Rating = 0;\n            SubmissionDate = DateTimeOffset.MinValue;\n            Items = Enumerable.Empty<Item>();\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"Loadout\"/> class.\n        /// </summary>\n        /// <param name=\"name\">The name.</param>\n        /// <param name=\"description\">The description.</param>\n        internal Loadout(string name, string description)\n            : this()\n        {\n            Name = name;\n            Description = description;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Helpers/LoadoutBase.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Helpers\n{\n    public abstract class LoadoutBase\n    {\n        /// <summary>\n        /// Gets or sets the identifier.\n        /// </summary>\n        /// <value>\n        /// The identifier.\n        /// </value>\n        public long ID { get; internal set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>\n        /// The name of the loadout.\n        /// </value>\n        public string Name { get; internal set; }\n\n        /// <summary>\n        /// Gets or sets the description.\n        /// </summary>\n        /// <value>\n        /// The loadout description.\n        /// </value>\n        public string Description { get; internal set; }\n\n        /// <summary>\n        /// Gets or sets the author.\n        /// </summary>\n        /// <value>\n        /// The author.\n        /// </value>\n        public string Author { get; internal set; }\n\n        /// <summary>\n        /// Gets or sets the rating.\n        /// </summary>\n        /// <value>\n        /// The rating.\n        /// </value>\n        public double Rating { get; internal set; }\n\n        /// <summary>\n        /// Gets or sets the submission date.\n        /// </summary>\n        /// <value>\n        /// The submission date.\n        /// </value>\n        public DateTimeOffset SubmissionDate { get; internal set; }\n\n        /// <summary>\n        /// Gets the topic URL.\n        /// </summary>\n        /// <value>\n        /// The topic URL.\n        /// </value>\n        public Uri TopicUrl { get; internal set; }\n\n        /// <summary>\n        /// Gets or sets the items.\n        /// </summary>\n        /// <value>\n        /// The items.\n        /// </value>\n        public IEnumerable<Item> Items { get; protected internal set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Helpers/LoadoutExporter.cs",
    "content": "﻿using EVEMon.Common.Data;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Helpers\n{\n    public static class LoadoutExporter\n    {\n        private static readonly string[] EMPTY_SLOTS =\n        {\n            \"[empty high slot]\", \"[empty med slot]\", \"[empty low slot]\", \"[empty rig slot]\", \"\"\n        };\n        private static readonly Regex NOT_DIGITS = new Regex(@\"[^\\d]\");\n        private static readonly int[] SLOT_ORDER = { 2, 1, 0, 3, 4 };\n\n        /// <summary>\n        /// Exports to clipboard.\n        /// </summary>\n        /// <param name=\"loadoutInfo\">The loadout information.</param>\n        /// <param name=\"loadout\">The loadout.</param>\n        public static void ExportToClipboard(ILoadoutInfo loadoutInfo, Loadout loadout)\n        {\n            Dictionary<string, List<string>> items = GetItemsBySlots(loadout.Items);\n            ExtractProperties(loadoutInfo, items);\n            string exportText = SerializeToEFTFormat(loadoutInfo, loadout, items);\n\n            // Copy to clipboard\n            try\n            {\n                Clipboard.Clear();\n                Clipboard.SetText(exportText);\n            }\n            catch (ExternalException ex)\n            {\n                // There is a bug that results in an exception being\n                // thrown when the clipboard is in use by another process\n                ExceptionHandler.LogException(ex, true);\n            }\n        }\n\n        /// <summary>\n        /// Gets the items by slots.\n        /// </summary>\n        /// <param name=\"items\">The items.</param>\n        /// <returns></returns>\n        private static Dictionary<string, List<string>> GetItemsBySlots(IEnumerable<Item> items)\n        {\n            // AllGroups items by slots\n            Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();\n\n            foreach (IGrouping<string, Item> slotItems in items.GroupBy(LoadoutHelper.GetSlotByItem))\n            {\n                dictionary[slotItems.Key] = new List<string>();\n                foreach (Item item in slotItems)\n                {\n                    dictionary[slotItems.Key].Add(item.Name);\n                }\n            }\n\n            return dictionary;\n        }\n\n        /// <summary>\n        /// Extracts the properties.\n        /// </summary>\n        /// <param name=\"loadoutInfo\">The loadout information.</param>\n        /// <param name=\"items\">The items.</param>\n        private static void ExtractProperties(ILoadoutInfo loadoutInfo, IDictionary<string, List<string>> items)\n        {\n            // Add \"empty slot\" mentions for every slot type\n            foreach (EvePropertyValue prop in loadoutInfo.Ship.Properties.Where(prop => prop.Property != null))\n            {\n                for (int i = 0; i < 5; i++)\n                {\n                    string slotName = LoadoutHelper.OrderedSlotNames[i], empty;\n                    // Fill slots by type\n                    if (prop.Property.Name.Contains(slotName))\n                    {\n                        int slots;\n                        NOT_DIGITS.Replace(prop.Value, string.Empty).TryParseInv(out slots);\n                        empty = EMPTY_SLOTS[i];\n                        while (items.ContainsKey(slotName) && items[slotName].Count < slots)\n                            items[slotName].Add(empty);\n                        break;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Serializes to EFT format.\n        /// </summary>\n        /// <param name=\"loadoutInfo\">The loadout information.</param>\n        /// <param name=\"loadout\">The loadout.</param>\n        /// <param name=\"items\">The items.</param>\n        /// <returns></returns>\n        private static string SerializeToEFTFormat(ILoadoutInfo loadoutInfo, Loadout loadout,\n            IDictionary<string, List<string>> items)\n        {\n            string name;\n            // Build the output format for EFT\n            StringBuilder exportText = new StringBuilder();\n            exportText.AppendLine($\"[{loadoutInfo.Ship.Name}, {loadout.Name} (EVEMon)]\");\n\n            // Slots in order: Low, Medium, High, Rig, Subsystem\n            foreach (int index in SLOT_ORDER)\n            {\n                name = LoadoutHelper.OrderedSlotNames[index];\n                if (items.ContainsKey(name))\n                {\n                    // Same function as appending the joined string, but faster\n                    foreach (string slotItem in items[name])\n                        exportText.AppendLine(slotItem);\n                    exportText.AppendLine();\n                }\n            }\n\n            // Drones need quantity\n            name = LoadoutHelper.OrderedSlotNames[6];\n            if (items.ContainsKey(name))\n                foreach (var itemName in items[name].GroupBy(itemName => itemName))\n                    exportText.AppendLine($\"{itemName.Key} x{itemName.Count()}\");\n\n            return exportText.ToString();\n        }\n    }\n}\n\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/LoadoutHelper.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Serialization.FittingClf;\nusing EVEMon.Common.Serialization.FittingXml;\n\nnamespace EVEMon.Common.Helpers\n{\n    public static class LoadoutHelper\n    {\n        /// <summary>\n        /// Gets the ordered slot names.\n        /// </summary>\n        /// <value>\n        /// The ordered slot names.\n        /// </value>\n        public static string[] OrderedSlotNames => new[]\n        {\n            \"High Slots\", \"Med Slots\", \"Low Slots\",\n            \"Rig Slots\", \"Subsystem Slots\", \"Ammunition & Charges\",\n            \"Drones\", \"Unknown\"\n        };\n\n        /// <summary>\n        /// Determines whether the specified text is a loadout.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"format\">The format.</param>\n        /// <returns></returns>\n        public static bool IsLoadout(string text, out LoadoutFormat format)\n        {\n            if (IsEFTFormat(text))\n            {\n                format = LoadoutFormat.EFT;\n                return true;\n            }\n\n            if (IsXMLFormat(text))\n            {\n                format = LoadoutFormat.XML;\n                return true;\n            }\n\n            if (IsDNAFormat(text))\n            {\n                format = LoadoutFormat.DNA;\n                return true;\n            }\n\n            if (IsCLFFormat(text))\n            {\n                format = LoadoutFormat.CLF;\n                return true;\n            }\n\n            format = LoadoutFormat.None;\n            return false;\n        }\n\n        /// <summary>\n        /// Determines whether the loadout is in EFT format.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if the loadout is in EFT format; otherwise, <c>false</c>.\n        /// </returns>\n        internal static bool IsEFTFormat(string text)\n        {\n            string[] lines = text.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);\n\n            // Nothing to evaluate\n            if (lines.Length == 0)\n                return false;\n\n            // Error on first line ?\n            string line = lines.First();\n            if (string.IsNullOrEmpty(line) || !line.StartsWith(\"[\", StringComparison.CurrentCulture) || !line.Contains(\",\"))\n                return false;\n\n            // Retrieve the ship\n            int commaIndex = line.IndexOf(',');\n            string shipTypeName = line.Substring(1, commaIndex - 1);\n\n            return StaticItems.ShipsMarketGroup.AllItems.Any(x => x.Name == shipTypeName);\n        }\n\n        /// <summary>\n        /// Determines whether the loadout is in XML format.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if the loadout is in XML format; otherwise, <c>false</c>.\n        /// </returns>\n        internal static bool IsXMLFormat(string text)\n        {\n            XmlRootAttribute xmlRoot = new SerializableXmlFittings().GetType().GetCustomAttributes(\n                typeof(XmlRootAttribute), false).Cast<XmlRootAttribute>().FirstOrDefault();\n\n            if (xmlRoot == null)\n                return false;\n\n            using (TextReader reader = new StringReader(text))\n            {\n                if (Util.GetXmlRootElement(reader) != xmlRoot.ElementName)\n                    return false;\n            }\n\n            SerializableXmlFittings fittings = Util.DeserializeXmlFromString<SerializableXmlFittings>(text);\n            return StaticItems.ShipsMarketGroup.AllItems.Any(x => x.Name == fittings.Fitting.ShipType.Name);\n        }\n\n        /// <summary>\n        /// Determines whether the loadout is in DNA format.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if the loadout is in DNA format; otherwise, <c>false</c>.\n        /// </returns>\n        internal static bool IsDNAFormat(string text)\n        {\n            string[] lines = text.Split(\":\".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);\n\n            // Nothing to evaluate\n            if (lines.Length == 0)\n                return false;\n\n            // Error on first line ?\n            int shipID;\n            string line = lines.First();\n            if (string.IsNullOrEmpty(line) || !line.TryParseInv(out shipID))\n                return false;\n\n            return StaticItems.ShipsMarketGroup.AllItems.Any(x => x.ID == shipID);\n        }\n\n        /// <summary>\n        /// Determines whether whether the loadout is in CLF format.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns>\n        /// \t<c>true</c> if the loadout is in CLF format; otherwise, <c>false</c>.\n        /// </returns>\n        internal static bool IsCLFFormat(string text)\n            => text.Length != 0 && text.StartsWith(\"{\\\"clf-version\\\":\", StringComparison.InvariantCultureIgnoreCase);\n\n        /// <summary>\n        /// Deserializes an EFT loadout text.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">text</exception>\n        public static ILoadoutInfo DeserializeEftFormat(string text)\n        {\n            text.ThrowIfNull(nameof(text));\n\n            string[] lines = text.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);\n\n            ILoadoutInfo loadoutInfo = new LoadoutInfo();\n\n            // Nothing to evaluate\n            if (lines.Length == 0)\n                return loadoutInfo;\n\n            var listOfItems = new List<Item>();\n            Loadout loadout = null;\n\n            foreach (string line in lines.Where(line => !string.IsNullOrEmpty(line) &&\n                !line.Contains(\"empty\") && !line.Contains(\"slot\")))\n            {\n                // Retrieve the ship\n                if (line == lines.First())\n                {\n                    // Retrieve the loadout name\n                    int commaIndex = line.IndexOf(',');\n                    loadoutInfo.Ship = StaticItems.GetItemByName(line.Substring(1,\n                        commaIndex - 1));\n                    if (loadoutInfo.Ship == null)\n                        return loadoutInfo;\n                    loadout = new Loadout(line.Substring(commaIndex + 1, line.Length -\n                        commaIndex - 2).Trim(), string.Empty);\n                    continue;\n                }\n\n                // Retrieve the item (might be a drone)\n                int lastX = line.LastIndexOf(\" x\", StringComparison.CurrentCulture);\n                int lastComma = line.LastIndexOf(',');\n                string itemName = lastComma >= 0 ? line.Substring(0, lastComma) : (lastX >= 0 ?\n                    line.Substring(0, lastX) : line);\n\n                int quantity = lastX >= 0 ? int.Parse(line.Substring(lastX + 2, line.Length -\n                    (lastX + 2))) : 1;\n\n                Item item = StaticItems.GetItemByName(itemName) ?? Item.UnknownItem;\n\n                for (int i = 0; i < Math.Min(quantity, 100); i++)\n                {\n                    listOfItems.Add(item);\n                }\n\n                // Retrieve the charge\n                string chargeName = lastComma >= 0 ? line.Substring(lastComma + 1).Trim() :\n                    null;\n\n                if (string.IsNullOrEmpty(chargeName))\n                    continue;\n\n                Item charge = StaticItems.GetItemByName(chargeName) ?? Item.UnknownItem;\n\n                listOfItems.Add(charge);\n            }\n\n            if (loadout == null)\n                return loadoutInfo;\n\n            loadout.Items = listOfItems;\n            loadoutInfo.Loadouts.Add(loadout);\n\n            return loadoutInfo;\n        }\n\n        /// <summary>\n        /// Deserializes an XML loadout text.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns></returns>\n        public static ILoadoutInfo DeserializeXmlFormat(string text)\n        {\n            SerializableXmlFittings fittings = Util.DeserializeXmlFromString<SerializableXmlFittings>(text);\n\n            ILoadoutInfo loadoutInfo = new LoadoutInfo();\n\n            // Nothing to evaluate\n            if (fittings == null)\n                return loadoutInfo;\n\n            // Retrieve the ship\n            loadoutInfo.Ship = StaticItems.GetItemByName(fittings.Fitting.ShipType.Name);\n\n            if (loadoutInfo.Ship == null)\n                return loadoutInfo;\n\n            // Special case to avoid displaying gzCLF block from Osmium\n            if (fittings.Fitting.Description.Text.StartsWith(\"BEGIN gzCLF BLOCK\", StringComparison.InvariantCultureIgnoreCase))\n                fittings.Fitting.Description.Text = string.Empty;\n\n            Loadout loadout = new Loadout(fittings.Fitting.Name, fittings.Fitting.Description.Text);\n\n            IEnumerable<Item> listOfItems = fittings.Fitting.FittingHardware\n                .Where(hardware => hardware != null && hardware.Item != null && hardware.Slot != \"drone bay\")\n                .Select(hardware => hardware.Item);\n\n            IEnumerable<SerializableXmlFittingHardware> listOfXmlDrones = fittings.Fitting.FittingHardware\n                .Where(hardware => hardware != null &&\n                                   hardware.Item != null &&\n                                   hardware.Slot == \"drone bay\");\n\n            var listOfDrones = new List<Item>();\n            foreach (SerializableXmlFittingHardware drone in listOfXmlDrones)\n            {\n                for (int i = 0; i < drone.Quantity; i++)\n                {\n                    listOfDrones.Add(drone.Item);\n                }\n            }\n\n            loadout.Items = listOfItems.Concat(listOfDrones);\n            loadoutInfo.Loadouts.Add(loadout);\n\n            return loadoutInfo;\n        }\n\n        /// <summary>\n        /// Deserializes a DNA loadout text.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns></returns>\n        public static ILoadoutInfo DeserializeDnaFormat(string text)\n        {\n            string[] lines = text.Split(\":\".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);\n\n            ILoadoutInfo loadoutInfo = new LoadoutInfo();\n\n            // Nothing to evaluate\n            if (lines.Length == 0)\n                return loadoutInfo;\n\n            var listOfItems = new List<Item>();\n            Loadout loadout = null;\n\n            foreach (string line in lines.Where(line => !string.IsNullOrEmpty(line)))\n            {\n                // Retrieve the ship\n                if (line == lines.First())\n                {\n                    int shipID;\n                    if (line.TryParseInv(out shipID))\n                    {\n                        loadoutInfo.Ship = StaticItems.GetItemByID(shipID);\n                        if (loadoutInfo.Ship == null)\n                            return loadoutInfo;\n                        loadout = new Loadout(loadoutInfo.Ship.Name, string.Empty);\n                        continue;\n                    }\n                }\n\n                // Retrieve the item\n                int itemID;\n                Item item = line.Substring(0, line.LastIndexOf(';')).TryParseInv(out itemID) ?\n                    (StaticItems.GetItemByID(itemID) ?? Item.UnknownItem) : Item.UnknownItem;\n\n                // Retrieve the quantity\n                int quantity;\n                line.Substring(line.LastIndexOf(';') + 1).TryParseInv(out quantity);\n\n                // Trim excess ammo & charges, no need to display more than the max number of modules\n                if (item.MarketGroup.BelongsIn(DBConstants.AmmosAndChargesMarketGroupID) && quantity > 8)\n                    quantity = 1;\n\n                for (int i = 0; i < quantity; i++)\n                {\n                    listOfItems.Add(item);\n                }\n            }\n\n            if (loadout == null)\n                return loadoutInfo;\n\n            loadout.Items = listOfItems;\n            loadoutInfo.Loadouts.Add(loadout);\n\n            return loadoutInfo;\n        }\n\n        /// <summary>\n        /// Deserializes a CLF loadout text.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns></returns>\n        public static ILoadoutInfo DeserializeClfFormat(string text)\n        {\n            ILoadoutInfo loadoutInfo = new LoadoutInfo();\n\n            // Nothing to evaluate\n            if (text.Length == 0)\n                return loadoutInfo;\n\n            SerializableClfFitting clfFitting = Util.DeserializeJson<SerializableClfFitting>(text);\n\n            // Nothing to evaluate\n            if (clfFitting == null)\n                return loadoutInfo;\n\n            // Retrieve the ship\n            loadoutInfo.Ship = clfFitting.Ship.Item;\n\n            if (loadoutInfo.Ship == null)\n                return loadoutInfo;\n\n            Loadout loadout = new Loadout(clfFitting.MetaData.Title, clfFitting.MetaData.Description);\n\n            IEnumerable<Item> listOfItems = clfFitting.Presets.SelectMany(x => x.Modules)\n                .Where(module => module != null && module.Item != null)\n                .Select(module => module.Item);\n\n            IEnumerable<Item> listOfCharges = clfFitting.Presets.SelectMany(x => x.Modules)\n                .SelectMany(module => module.Charges)\n                .Where(module => module != null && module.Item != null)\n                .Select(module => module.Item);\n\n            IEnumerable<SerializableClfFittingDroneType> listOfClfDrones = clfFitting.Drones.SelectMany(x => x.InBay)\n                .Concat(clfFitting.Drones.SelectMany(x => x.InSpace))\n                .Where(drone => drone != null && drone.Item != null)\n                .Select(drone => drone);\n\n            var listOfDrones = new List<Item>();\n            foreach (SerializableClfFittingDroneType clfDrone in listOfClfDrones)\n            {\n                for (int i = 0; i < clfDrone.Quantity; i++)\n                {\n                    listOfDrones.Add(clfDrone.Item);\n                }\n            }\n\n            loadout.Items = listOfItems.Concat(listOfCharges).Concat(listOfDrones);\n            loadoutInfo.Loadouts.Add(loadout);\n\n            return loadoutInfo;\n        }\n\n        /// <summary>\n        /// Gets the slot by item.\n        /// </summary>\n        /// <param name=\"item\">The item.</param>\n        /// <returns></returns>\n        public static string GetSlotByItem(Item item)\n        {\n            switch (item.FittingSlot)\n            {\n                // High Slot\n                case ItemSlot.High:\n                    return OrderedSlotNames[0];\n                // Medium Slot\n                case ItemSlot.Medium:\n                    return OrderedSlotNames[1];\n                // Low Slot\n                case ItemSlot.Low:\n                    return OrderedSlotNames[2];\n            }\n\n            // Rig Slot\n            if (item.MarketGroup.BelongsIn(DBConstants.ShipModificationsMarketGroupID))\n                return OrderedSlotNames[3];\n\n            // Subsystems\n            if (item.MarketGroup.BelongsIn(DBConstants.SubsystemsMarketGroupID))\n                return OrderedSlotNames[4];\n\n            // Ammunition & Charges\n            if (item.MarketGroup.BelongsIn(DBConstants.AmmosAndChargesMarketGroupID))\n                return OrderedSlotNames[5];\n\n            // Drones\n            if (item.MarketGroup.BelongsIn(DBConstants.DronesMarketGroupID))\n                return OrderedSlotNames[6];\n\n            return OrderedSlotNames[7];\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/LoadoutInfo.cs",
    "content": "using System.Collections.ObjectModel;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Interfaces;\n\nnamespace EVEMon.Common.Helpers\n{\n    public sealed class LoadoutInfo : ILoadoutInfo\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"LoadoutInfo\"/> class.\n        /// </summary>\n        public LoadoutInfo()\n        {\n            Ship = Item.UnknownItem;\n            Loadouts = new Collection<Loadout>();\n        }\n\n        /// <summary>\n        /// Gets or sets the ship of the loadout.\n        /// </summary>\n        /// <value>\n        /// The ship.\n        /// </value>\n        public Item Ship { get; set; }\n\n        /// <summary>\n        /// Gets or sets the loadouts.\n        /// </summary>\n        /// <value>\n        /// The items.\n        /// </value>\n        public Collection<Loadout> Loadouts { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Helpers/PathFinder.cs",
    "content": "﻿using System.Collections.Generic;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Helpers\n{\n    internal sealed class PathFinder\n    {\n        private readonly PathFinder m_parent;\n        private readonly SolarSystem m_system;\n\n        /// <summary>\n        /// Constructor for a starting point\n        /// </summary>\n        /// <param name=\"system\"></param>\n        private PathFinder(SolarSystem system)\n        {\n            m_parent = null;\n            m_system = system;\n        }\n\n        /// <summary>\n        /// Constructor for a child.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"system\"></param>\n        private PathFinder(PathFinder parent, SolarSystem system)\n        {\n            m_parent = parent;\n            m_system = system;\n        }\n\n        /// <summary>\n        /// Gets the best possible path (approximate solution) using a A* alogrithm.\n        /// </summary>\n        /// <param name=\"start\"></param>\n        /// <param name=\"target\"></param>\n        /// <param name=\"criteria\"></param>\n        /// <param name=\"minSecurityLevel\">The minimum, inclusive, security level.</param>\n        /// <param name=\"maxSecurityLevel\">The maximum, inclusive, security level.</param>\n        /// <returns></returns>\n        public static IEnumerable<SolarSystem> FindBestPath(SolarSystem start, SolarSystem target, PathSearchCriteria criteria,\n            float minSecurityLevel, float maxSecurityLevel)\n        {\n            PathFinder result = FindBestPathCore(start, target, criteria, minSecurityLevel, maxSecurityLevel);\n\n            // Transforms the result into a list\n            List<SolarSystem> list = new List<SolarSystem>();\n            for (PathFinder item = result; item != null; item = item.m_parent)\n            {\n                list.Insert(0, item.m_system);\n            }\n\n            return list;\n        }\n\n        /// <summary>\n        /// Gets the best possible path (approximate solution) using a A* alogrithm.\n        /// </summary>\n        /// <param name=\"start\"></param>\n        /// <param name=\"target\"></param>\n        /// <param name=\"criteria\"></param>\n        /// <param name=\"minSecurityLevel\">The minimum, inclusive, security level.</param>\n        /// <param name=\"maxSecurityLevel\">The maximum, inclusive, security level.</param>\n        /// <returns></returns>\n        private static PathFinder FindBestPathCore(SolarSystem start, SolarSystem target, PathSearchCriteria criteria,\n            float minSecurityLevel, float maxSecurityLevel)\n        {\n            Dictionary<SolarSystem, int> bestDepths = new Dictionary<SolarSystem, int>();\n            SortedList<int, PathFinder> paths = new SortedList<int, PathFinder>();\n            PathFinder root = new PathFinder(start);\n            bestDepths.Add(start, -1);\n            paths.Add(0, root);\n\n            while (true)\n            {\n                if (paths.Count == 0)\n                    return null;\n\n                PathFinder best;\n                int depth;\n\n                // Pick the best candidate path, but ensures it matches the best depth found so far\n                while (true)\n                {\n                    // Picks the best one, returns if we found our target\n                    best = paths.Values[0];\n\n                    if (best.m_system == target)\n                        return best;\n\n                    // Removes it from the list\n                    paths.RemoveAt(0);\n\n                    int bestDepth;\n                    depth = best.Depth;\n                    bestDepths.TryGetValue(best.m_system, out bestDepth);\n\n                    if (bestDepth == depth || best.m_system == start)\n                        break;\n                }\n\n                // Gets the subpaths for the best path so far\n                depth++;\n                foreach (PathFinder child in best.GetChildren(depth, bestDepths))\n                {\n                    // Gets the heuristic key based on path search criteria\n                    int criteriaValue = criteria == PathSearchCriteria.ShortestDistance\n                        ? child.m_system.GetSquareDistanceWith(target)\n                        : 1;\n                    int key = criteriaValue * depth * depth;\n                    if (child.m_system.SecurityLevel < minSecurityLevel || child.m_system.SecurityLevel > maxSecurityLevel)\n                        key *= 100;\n\n                    while (paths.ContainsKey(key))\n                    {\n                        key++;\n                    }\n\n                    // Stores it in the sorted list\n                    paths.Add(key, child);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets all the immediate children paths.\n        /// </summary>\n        /// <returns></returns>\n        private IEnumerable<PathFinder> GetChildren(int depth, IDictionary<SolarSystem, int> bestDepths)\n        {\n            // Check this system is not already present with a lesser range\n            foreach (SolarSystem neighbor in m_system.Neighbors)\n            {\n                // Checks the best depth so far\n                int bestDepth;\n                bestDepths.TryGetValue(neighbor, out bestDepth);\n\n                // Enumerates it\n                if (bestDepth != 0 && depth >= bestDepth)\n                    continue;\n\n                bestDepths[neighbor] = depth;\n                yield return new PathFinder(this, neighbor);\n            }\n        }\n\n        /// <summary>\n        /// Gets the depth of this node.\n        /// </summary>\n        private int Depth\n        {\n            get\n            {\n                int count = 0;\n                for (PathFinder parent = m_parent; parent != null; parent = parent.m_parent)\n                {\n                    count++;\n                }\n                return count;\n            }\n        }\n\n        /// <summary>\n        /// Gets the name of the solar system.\n        /// </summary>\n        public override string ToString() => m_system.ToString();\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Helpers/PlanEntrySorter.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Helpers\n{\n    /// <summary>\n    /// This class holds the responsibility to sort enumerations of plan entries.\n    /// </summary>\n    internal sealed class PlanEntrySorter\n    {\n        private readonly PlanEntrySort m_sort;\n        private readonly bool m_reverseOrder;\n        private readonly bool m_groupByPriority;\n        private readonly IEnumerable<PlanEntry> m_entries;\n        private readonly BaseCharacter m_character;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"entries\"></param>\n        /// <param name=\"sort\"></param>\n        /// <param name=\"reverseOrder\"></param>\n        /// <param name=\"groupByPriority\"></param>\n        internal PlanEntrySorter(BaseCharacter character, IEnumerable<PlanEntry> entries, PlanEntrySort sort, bool reverseOrder,\n            bool groupByPriority)\n        {\n            m_sort = sort;\n            m_entries = entries;\n            m_reverseOrder = reverseOrder;\n            m_groupByPriority = groupByPriority;\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Performs the sort.\n        /// </summary>\n        /// <returns></returns>\n        public IEnumerable<PlanEntry> Sort()\n        {\n            int initialCount = m_entries.Count();\n\n            // Apply first pass (priorities grouping)\n            // We split the entries into multiple priority groups if that selection is made\n            List<PlanScratchpad> groupedPlan = new List<PlanScratchpad>();\n            CharacterScratchpad scratchpad = new CharacterScratchpad(m_character);\n\n            if (m_groupByPriority)\n            {\n                groupedPlan.AddRange(\n                    m_entries.GroupBy(x => x.Priority).OrderBy(x => x.Key).Select(group => new PlanScratchpad(scratchpad, group)));\n            }\n            else\n                groupedPlan.Add(new PlanScratchpad(scratchpad, m_entries));\n\n            // Apply second pass (sorts)\n            // We sort every group, and merge them once they're sorted\n            List<PlanEntry> list = new List<PlanEntry>();\n\n            foreach (PlanScratchpad group in groupedPlan)\n            {\n                group.UpdateStatistics(scratchpad, false, false);\n                group.SimpleSort(m_sort, m_reverseOrder);\n                list.AddRange(group);\n            }\n\n            // Fix prerequisites order\n            FixPrerequisitesOrder(list);\n\n            // Check we didn't mess up anything\n            if (initialCount != list.Count)\n                throw new UnauthorizedAccessException(\"The sort algorithm messed up and deleted items\");\n\n            // Return\n            return list;\n        }\n\n        /// <summary>\n        /// Ensures the prerequisites order is correct.\n        /// </summary>\n        /// <param name=\"list\"></param>\n        private static void FixPrerequisitesOrder(ICollection<PlanEntry> list)\n        {\n            // Gather prerequisites/postrequisites relationships and use them to connect nodes - O(n) operation\n            Dictionary<PlanEntry, List<PlanEntry>> dependencies = new Dictionary<PlanEntry, List<PlanEntry>>();\n            foreach (PlanEntry entry in list)\n            {\n                dependencies[entry] = new List<PlanEntry>(list.Where(x => entry.IsDependentOf(x)));\n            }\n\n\n            // Insert entries\n            LinkedList<PlanEntry> entriesToAdd = new LinkedList<PlanEntry>(list);\n            SkillLevelSet<PlanEntry> set = new SkillLevelSet<PlanEntry>();\n            list.Clear();\n\n            while (entriesToAdd.Count != 0)\n            {\n                // Gets the first entry which has all its prerequisites satisfied.\n                PlanEntry item = entriesToAdd.First(x => dependencies[x].All(y => set[y.Skill, y.Level] != null));\n\n                // Add it to the set and list, and remove it from the entries to add\n                set[item.Skill, item.Level] = item;\n                entriesToAdd.Remove(item);\n                list.Add(item);\n            }\n        }\n\n\n        #region Simple sort operators\n\n        /// <summary>\n        /// Compares by name.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareByName(PlanEntry x, PlanEntry y)\n        {\n            int nameDiff = string.CompareOrdinal(x.Skill.Name, y.Skill.Name);\n            return nameDiff != 0 ? nameDiff : Convert.ToInt32(x.Level - y.Level);\n        }\n\n        /// <summary>\n        /// Compares by cost.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareByCost(PlanEntry x, PlanEntry y)\n        {\n            long xCost = x.Level == 1 && !x.CharacterSkill.IsOwned ? x.Skill.Cost : 0;\n            long yCost = y.Level == 1 && !x.CharacterSkill.IsOwned ? y.Skill.Cost : 0;\n            return xCost.CompareTo(yCost);\n        }\n\n        /// <summary>\n        /// Compares by training time.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareByTrainingTime(PlanEntry x, PlanEntry y) => x.TrainingTime.CompareTo(y.TrainingTime);\n\n        /// <summary>\n        /// Compares by training time natural.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareByTrainingTimeNatural(PlanEntry x, PlanEntry y)\n            => x.NaturalTrainingTime.CompareTo(y.NaturalTrainingTime);\n\n        /// <summary>\n        /// Compares by SP per hour.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareBySPPerHour(PlanEntry x, PlanEntry y) => x.SpPerHour - y.SpPerHour;\n\n        /// <summary>\n        /// Compares by primary attribute.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareByPrimaryAttribute(PlanEntry x, PlanEntry y)\n            => (int)x.Skill.PrimaryAttribute - (int)y.Skill.PrimaryAttribute;\n\n        /// <summary>\n        /// Compares by secondary attribute.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareBySecondaryAttribute(PlanEntry x, PlanEntry y)\n            => (int)x.Skill.SecondaryAttribute - (int)y.Skill.SecondaryAttribute;\n\n        /// <summary>\n        /// Compares by priority.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareByPriority(PlanEntry x, PlanEntry y) => x.Priority - y.Priority;\n\n        /// <summary>\n        /// Compares by plan group.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareByPlanGroup(PlanEntry x, PlanEntry y)\n            => string.Compare(x.PlanGroupsDescription, y.PlanGroupsDescription, StringComparison.CurrentCulture);\n\n        /// <summary>\n        /// Compares by plan type.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareByPlanType(PlanEntry x, PlanEntry y) => (int)x.Type - (int)y.Type;\n\n        /// <summary>\n        /// Compares by notes.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareByNotes(PlanEntry x, PlanEntry y)\n            => string.Compare(x.Notes, y.Notes, StringComparison.CurrentCulture);\n\n        /// <summary>\n        /// Compares by time difference.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareByTimeDifference(PlanEntry x, PlanEntry y)\n        {\n            TimeSpan xDuration = x.TrainingTime - x.OldTrainingTime;\n            TimeSpan yDuration = y.TrainingTime - y.OldTrainingTime;\n            return xDuration.CompareTo(yDuration);\n        }\n\n        /// <summary>\n        /// Compares by percent completed.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareByPercentCompleted(PlanEntry x, PlanEntry y)\n        {\n            float xRatio = x.CharacterSkill.FractionCompleted;\n            float yRatio = y.CharacterSkill.FractionCompleted;\n            return xRatio.CompareTo(yRatio);\n        }\n\n        /// <summary>\n        /// Compares by rank.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareByRank(PlanEntry x, PlanEntry y) => Convert.ToInt32(x.Skill.Rank - y.Skill.Rank);\n\n        /// <summary>\n        /// Compares by skill points required.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareBySkillPointsRequired(PlanEntry x, PlanEntry y)\n            => x.SkillPointsRequired.CompareTo(y.SkillPointsRequired);\n\n        /// <summary>\n        /// Compares by clone state required.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public static int CompareByOmegaRequired(PlanEntry x, PlanEntry y)\n            => x.OmegaRequired.CompareTo(y.OmegaRequired);\n\n        /// <summary>\n        /// Compares by skill group duration.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <param name=\"entries\">The entries.</param>\n        /// <param name=\"skillGroupsDurations\">The skill groups durations.</param>\n        /// <returns></returns>\n        public static int CompareBySkillGroupDuration(PlanEntry x, PlanEntry y, IEnumerable<PlanEntry> entries,\n            Dictionary<StaticSkillGroup, TimeSpan> skillGroupsDurations)\n        {\n            TimeSpan xDuration = GetSkillGroupDuration(x.Skill.Group, entries, skillGroupsDurations);\n            TimeSpan yDuration = GetSkillGroupDuration(y.Skill.Group, entries, skillGroupsDurations);\n            return xDuration.CompareTo(yDuration);\n        }\n\n        /// <summary>\n        /// Gets the duration of the skill group.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <param name=\"entries\">The entries.</param>\n        /// <param name=\"skillGroupsDurations\">The skill groups durations.</param>\n        /// <returns></returns>\n        private static TimeSpan GetSkillGroupDuration(StaticSkillGroup group, IEnumerable<PlanEntry> entries,\n            IDictionary<StaticSkillGroup, TimeSpan> skillGroupsDurations)\n        {\n            if (skillGroupsDurations.ContainsKey(group))\n                return skillGroupsDurations[group];\n\n            TimeSpan time = entries.Where(x => x.Skill.Group == group).Aggregate(TimeSpan.Zero,\n                (current, entry) =>\n                    current + entry.TrainingTime);\n            skillGroupsDurations[group] = time;\n\n            return skillGroupsDurations[group];\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/PlanHelper.cs",
    "content": "﻿using System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Helpers\n{\n    /// <summary>\n    /// Helper for the \"Plan To\" and \"Remove\" menus.\n    /// </summary>\n    public static class PlanHelper\n    {\n        /// <summary>\n        /// Updates a regular \"Plan to X\" menu : text, tag, enable/disable.\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        /// <param name=\"menu\">The menu.</param>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"level\">The level.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">menu\n        /// or\n        /// plan</exception>\n        public static bool UpdatesRegularPlanToMenu(this Plan plan, ToolStripItem menu, Skill skill, int level)\n        {\n            menu.ThrowIfNull(nameof(menu));\n\n            plan.ThrowIfNull(nameof(plan));\n\n            menu.Text = level == 0 ? \"Remove\" : $\"Level {level}\";\n\n            menu.Enabled = plan.EnablePlanTo(skill, level);\n            if (menu.Enabled)\n            {\n                IPlanOperation operation = plan.TryPlanTo(skill, level);\n                menu.Tag = operation;\n                if (RequiresWindow(operation))\n                    menu.Text += @\"...\";\n            }\n\n            ToolStripMenuItem menuItem = menu as ToolStripMenuItem;\n            if (menuItem != null)\n                menuItem.Checked = plan.GetPlannedLevel(skill) == level;\n\n            return menu.Enabled;\n        }\n\n        /// <summary>\n        /// Checks whether the given operation absolutely requires a confirmation from the user.\n        /// True when there are dependencies to remove.\n        /// </summary>\n        /// <param name=\"operation\">The operation.</param>\n        /// <returns></returns>\n        public static bool RequiresWindow(IPlanOperation operation)\n        {\n            if (operation?.Type != PlanOperations.Suppression)\n                return false;\n\n            return operation.SkillsToRemove.Count() != operation.AllEntriesToRemove.Count();\n        }\n\n        /// <summary>\n        /// Performs the action for the \"Plan To N\" and \"Remove\" menu options, in a silent way whenever possible.\n        /// </summary>\n        /// <param name=\"operationForm\">The operation form.</param>\n        /// <param name=\"parentForm\">The parent form.</param>\n        /// <param name=\"operation\">The operation.</param>\n        private static void PerformSilently(Form operationForm, IWin32Window parentForm, IPlanOperation operation)\n        {\n            if (operation == null)\n                return;\n\n            // A window is required\n            if (RequiresWindow(operation) && Perform(operationForm, parentForm) != DialogResult.OK)\n                return;\n\n            // Silent way\n            operation.Perform();\n        }\n\n        /// <summary>\n        /// Performs the action for the \"Plan To N\" and \"Remove\" menu options.\n        /// </summary>\n        /// <param name=\"operationForm\">The operation form.</param>\n        /// <param name=\"parentForm\">The parent form.</param>\n        /// <returns></returns>\n        public static DialogResult Perform(Form operationForm, IWin32Window parentForm)\n        {\n            using (Form window = operationForm)\n            {\n                window.ShowDialog(parentForm);\n                return window.DialogResult;\n            }\n        }\n\n        /// <summary>\n        /// Selects which type of Perform will be called according to user settings.\n        /// </summary>\n        /// <param name=\"operationForm\">The operation form.</param>\n        /// <param name=\"parentForm\">The parent form.</param>\n        /// <param name=\"operation\">The operation.</param>\n        public static void SelectPerform(Form operationForm, IWin32Window parentForm, IPlanOperation operation)\n        {\n            if (operation == null)\n                return;\n\n            if (Settings.UI.PlanWindow.UseAdvanceEntryAddition && operation.Type == PlanOperations.Addition)\n            {\n                Perform(operationForm, parentForm);\n                return;\n            }\n\n            PerformSilently(operationForm, parentForm, operation);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Helpers/PlanIOHelper.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing System.Xml;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Models.Comparers;\nusing EVEMon.Common.Serialization.Exportation;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Helpers\n{\n    public static class PlanIOHelper\n    {\n        /// <summary>\n        /// Exports the plan under a text format.\n        /// </summary>\n        /// <param name=\"planToExport\">The plan to export.</param>\n        /// <param name=\"settings\">The settings.</param>\n        /// <param name=\"exportActions\">The export actions.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">\n        /// planToExport\n        /// or\n        /// settings\n        /// </exception>\n        /// <exception cref=\"System.NotImplementedException\"></exception>\n        /// <exception cref=\"System.ArgumentNullException\">planToExport or settings</exception>\n        public static string ExportAsText(Plan planToExport, PlanExportSettings settings,\n                                          Action<StringBuilder, PlanEntry, PlanExportSettings> exportActions = null)\n        {\n            planToExport.ThrowIfNull(nameof(planToExport));\n\n            settings.ThrowIfNull(nameof(settings));\n\n            PlanScratchpad plan = new PlanScratchpad(planToExport.Character, planToExport);\n            plan.Sort(planToExport.SortingPreferences);\n            plan.UpdateStatistics();\n\n            StringBuilder builder = new StringBuilder();\n            Character character = (Character)plan.Character;\n\n            // Initialize constants\n            string lineFeed = Environment.NewLine;\n            string boldStart = string.Empty;\n            string boldEnd = string.Empty;\n\n            switch (settings.Markup)\n            {\n                case MarkupType.Forum:\n                    boldStart = \"[b]\";\n                    boldEnd = \"[/b]\";\n                    break;\n                case MarkupType.Html:\n                    lineFeed = $\"<br />{Environment.NewLine}\";\n                    boldStart = \"<b>\";\n                    boldEnd = \"</b>\";\n                    break;\n                case MarkupType.Undefined:\n                case MarkupType.None:\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n\n            // Header\n            if (settings.IncludeHeader)\n            {\n                builder.Append(boldStart)\n                    .Append($\"{(settings.ShoppingList ? \"Shopping list \" : \"Skill plan \")} for {character.Name}\")\n                    .Append(boldEnd)\n                    .Append(lineFeed)\n                    .Append(lineFeed);\n            }\n\n            // Scroll through entries\n            int index = 0;\n            DateTime endTime = DateTime.Now;\n            foreach (PlanEntry entry in plan)\n            {\n                // Skip is we're only build a shopping list\n                bool shoppingListCandidate = !(entry.CharacterSkill.IsKnown || entry.Level != 1 || entry.CharacterSkill.IsOwned);\n                if (settings.ShoppingList && !shoppingListCandidate)\n                    continue;\n\n                // Remapping point\n                if (!settings.ShoppingList && (entry.Remapping != null) && settings.RemappingPoints)\n                {\n                    builder\n                        .Append($\"***{entry.Remapping}***\")\n                        .Append(lineFeed);\n                }\n\n                // Entry's index\n                index++;\n                if (settings.EntryNumber)\n                    builder.Append($\"{index}. \");\n\n                // Name\n                builder.Append(boldStart);\n                AddName(settings, entry, builder);\n                builder.Append(boldEnd);\n\n                // Training time\n                AddTrainingTime(settings, shoppingListCandidate, entry, builder);\n\n                exportActions?.Invoke(builder, entry, settings);\n\n                builder.Append(lineFeed);\n\n                // End time\n                endTime = entry.EndTime;\n            }\n\n            // Footer\n            AddFooter(settings, boldEnd, index, endTime, builder, lineFeed, plan, boldStart);\n\n            // Returns the text representation.\n            return builder.ToString().TrimEnd(Environment.NewLine.ToCharArray());\n        }\n\n        /// <summary>\n        /// Adds the name.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        /// <param name=\"entry\">The entry.</param>\n        /// <param name=\"builder\">The builder.</param>\n        private static void AddName(PlanExportSettings settings, ISkillLevel entry, StringBuilder builder)\n        {\n            if (settings.Markup == MarkupType.Html)\n            {\n                builder.Append(\"<a href=\\\"\\\" onclick=\\\"CCPEVE.show\" +\n                               $\"{(!settings.ShoppingList ? \"Info\" : \"MarketDetails\")}({entry.Skill.ID})\\\">\");\n            }\n            builder.Append(entry.Skill.Name);\n\n            if (settings.Markup == MarkupType.Html)\n                builder.Append(\"</a>\");\n\n            if (!settings.ShoppingList)\n                builder.Append($\" {Skill.GetRomanFromInt(entry.Level)}\");\n\n        }\n\n        /// <summary>\n        /// Adds the training time.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        /// <param name=\"shoppingListCandidate\">if set to <c>true</c> [shopping list candidate].</param>\n        /// <param name=\"entry\">The entry.</param>\n        /// <param name=\"builder\">The builder.</param>\n        private static void AddTrainingTime(PlanExportSettings settings, bool shoppingListCandidate, PlanEntry entry, StringBuilder builder)\n        {\n            if (!settings.EntryTrainingTimes && !settings.EntryStartDate && !settings.EntryFinishDate &&\n                (!settings.EntryCost || !shoppingListCandidate))\n                return;\n\n            const DescriptiveTextOptions TimeFormat = DescriptiveTextOptions.FullText\n                                                      | DescriptiveTextOptions.IncludeCommas\n                                                      | DescriptiveTextOptions.SpaceText;\n\n            builder.Append(\" (\");\n            bool needComma = false;\n\n            // Training time\n            if (settings.EntryTrainingTimes)\n            {\n                needComma = true;\n                builder.Append(entry.TrainingTime.ToDescriptiveText(TimeFormat));\n            }\n\n            // Training start date\n            if (settings.EntryStartDate)\n            {\n                if (needComma)\n                    builder.Append(\"; \");\n\n                needComma = true;\n\n                builder.Append($\"Start: {entry.StartTime.ToUniversalTime().DateTimeToTimeString()} UTC\");\n            }\n\n            // Training end date\n            if (settings.EntryFinishDate)\n            {\n                if (needComma)\n                    builder.Append(\"; \");\n\n                needComma = true;\n\n                builder.Append($\"Finish: {entry.EndTime.ToUniversalTime().DateTimeToTimeString()} UTC\");\n            }\n\n            // Skill cost\n            if (settings.EntryCost && shoppingListCandidate)\n            {\n                if (needComma)\n                    builder.Append(\"; \");\n\n                builder.Append(FormattableString.Invariant($\"Cost: {entry.Skill.Cost:N0} ISK\"));\n            }\n\n            builder.Append(')');\n        }\n\n        /// <summary>\n        /// Adds the footer.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        /// <param name=\"boldEnd\">The bold end.</param>\n        /// <param name=\"index\">The index.</param>\n        /// <param name=\"endTime\">The end time.</param>\n        /// <param name=\"builder\">The builder.</param>\n        /// <param name=\"lineFeed\">The line feed.</param>\n        /// <param name=\"plan\">The plan.</param>\n        /// <param name=\"boldStart\">The bold start.</param>\n        private static void AddFooter(PlanExportSettings settings, string boldEnd, int index, DateTime endTime, StringBuilder builder,\n                                      string lineFeed, BasePlan plan, string boldStart)\n        {\n            if (!settings.FooterCount && !settings.FooterTotalTime && !settings.FooterDate && !settings.FooterCost)\n                return;\n\n            builder.AppendLine(lineFeed);\n            bool needComma = false;\n\n            // Skills count\n            if (settings.FooterCount)\n            {\n                builder\n                    .Append($\"{boldStart}{plan.GetUniqueSkillsCount()}{boldEnd} \" +\n                            $\"unique skill{(plan.GetUniqueSkillsCount() == 1 ? string.Empty : \"s\")}, \")\n                    .Append($\"{boldStart}{index}{boldEnd} skill level{(index == 1 ? string.Empty : \"s\")}\");\n\n                needComma = true;\n            }\n\n            // Plan's training duration\n            if (settings.FooterTotalTime)\n            {\n                const DescriptiveTextOptions TimeFormat =\n                    DescriptiveTextOptions.FullText | DescriptiveTextOptions.IncludeCommas | DescriptiveTextOptions.SpaceText;\n\n                if (needComma)\n                    builder.Append(\"; \");\n\n                needComma = true;\n\n                builder.Append($\"Total time: {boldStart}{plan.TotalTrainingTime.ToDescriptiveText(TimeFormat)}{boldEnd}\");\n            }\n\n            // End training date\n            if (settings.FooterDate)\n            {\n                if (needComma)\n                    builder.Append(\"; \");\n\n                needComma = true;\n\n                builder.Append($\"Completion: {boldStart}{endTime.ToUniversalTime().DateTimeToTimeString()}{boldEnd} UTC\");\n            }\n\n            // Total books cost\n            if (settings.FooterCost)\n            {\n                if (needComma)\n                    builder.Append(\"; \");\n\n                string formattedIsk = FormattableString.Invariant($\"{plan.NotKnownSkillBooksCost:N0}\");\n                builder.Append($\"Cost: {boldStart}{formattedIsk}{boldEnd} ISK\");\n            }\n\n            // Warning about skill costs\n            builder.Append(lineFeed);\n            if (settings.FooterCost || settings.EntryCost)\n                builder.Append(\"N.B. Skill costs are based on CCP's database and are indicative only\");\n        }\n\n        /// <summary>\n        /// Exports the plan under an XML format.\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">plan</exception>\n        public static string ExportAsXML(Plan plan)\n        {\n            plan.ThrowIfNull(nameof(plan));\n\n            // Generates a settings plan and transforms it to an output plan\n            SerializablePlan serial = plan.Export();\n            OutputPlan output = new OutputPlan { Name = serial.Name, Owner = serial.Owner, Revision = Settings.Revision };\n            output.Entries.AddRange(serial.Entries);\n\n            // Serializes to XML document and gets a string representation\n            XmlDocument doc = (XmlDocument)Util.SerializeToXmlDocument(output);\n            return Util.GetXmlStringRepresentation(doc);\n        }\n\n        /// <summary>\n        /// Exports the plan under an XML format.\n        /// </summary>\n        /// <param name=\"plans\">The plans.</param>\n        /// <returns></returns>\n        public static string ExportAsXML(IEnumerable<Plan> plans)\n        {\n            OutputPlans output = new OutputPlans { Revision = Settings.Revision };\n            output.Plans.AddRange(plans.Select(plan => plan.Export()));\n\n            // Serializes to XML document and gets a string representation\n            XmlDocument doc = (XmlDocument)Util.SerializeToXmlDocument(output);\n            return Util.GetXmlStringRepresentation(doc);\n        }\n\n        /// <summary>\n        /// Imports a <see cref=\"SerializablePlan\" /> from the given filename. Works with old and new formats.\n        /// </summary>\n        /// <param name=\"filename\">The filename.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">filename</exception>\n        public static SerializablePlan ImportFromXML(string filename)\n        {\n            filename.ThrowIfNull(nameof(filename));\n\n            int revision = -1;\n            SerializablePlan result = null;\n            try\n            {\n                // Is the format compressed ? \n                if (filename.EndsWith(\".emp\", StringComparison.OrdinalIgnoreCase))\n                {\n                    string tempFile = Util.UncompressToTempFile(filename);\n                    try\n                    {\n                        return ImportFromXML(tempFile);\n                    }\n                    finally\n                    {\n                        FileHelper.DeleteFile(tempFile);\n                    }\n                }\n\n                // Reads the revision number from the file\n                revision = Util.GetRevisionNumber(filename);\n\n                // Old format\n                result = revision == 0\n                             ? (SerializablePlan)UIHelper.ShowNoSupportMessage()\n                             : Util.DeserializeXmlFromFile<OutputPlan>(filename);\n            }\n            catch (UnauthorizedAccessException exc)\n            {\n                MessageBox.Show(@\"Couldn't read the given file, access was denied. Maybe the directory was under synchronization.\");\n                ExceptionHandler.LogException(exc, true);\n            }\n            catch (InvalidDataException exc)\n            {\n                MessageBox.Show(@\"The file seems to be corrupted, wrong gzip format.\");\n                ExceptionHandler.LogException(exc, true);\n            }\n\n            if (result == null && revision > 0)\n                MessageBox.Show(@\"There was a problem with the format of the document.\");\n\n            return result;\n        }\n\n        /// <summary>\n        /// Imports plans from the given filename.\n        /// </summary>\n        /// <param name=\"filename\">The filename.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">filename</exception>\n        public static IEnumerable<SerializablePlan> ImportPlansFromXML(string filename)\n        {\n            filename.ThrowIfNull(nameof(filename));\n\n            OutputPlans result = null;\n            try\n            {\n                // Is the format compressed ? \n                if (filename.EndsWith(\".epb\", StringComparison.OrdinalIgnoreCase))\n                {\n                    string tempFile = Util.UncompressToTempFile(filename);\n                    try\n                    {\n                        return ImportPlansFromXML(tempFile);\n                    }\n                    finally\n                    {\n                        FileHelper.DeleteFile(tempFile);\n                    }\n                }\n\n                // Reads the revision number from the file\n                int revision = Util.GetRevisionNumber(filename);\n\n                if (revision != 0)\n                    result = Util.DeserializeXmlFromFile<OutputPlans>(filename);\n            }\n            catch (UnauthorizedAccessException exc)\n            {\n                MessageBox.Show(@\"Couldn't read the given file, access was denied. Maybe the directory was under synchronization.\");\n                ExceptionHandler.LogException(exc, true);\n            }\n            catch (InvalidDataException exc)\n            {\n                MessageBox.Show(@\"The file seems to be corrupted, wrong gzip format.\");\n                ExceptionHandler.LogException(exc, true);\n            }\n\n            if (result != null)\n                return result.Plans;\n\n            MessageBox.Show(@\"There was a problem with the format of the document.\");\n            return null;\n        }\n\n        /// <summary>\n        /// Creates a plan from a character skill queue.\n        /// </summary>\n        /// <param name=\"newPlan\">The new plan.</param>\n        /// <param name=\"character\">The character.</param>\n        public static bool CreatePlanFromCharacterSkillQueue(Plan newPlan, Character character)\n        {\n            CCPCharacter ccpCharacter = character as CCPCharacter;\n\n            if (ccpCharacter == null)\n                return false;\n\n            if (!ccpCharacter.SkillQueue.Any())\n            {\n                MessageBox.Show(@\"There are no skills in the characters' queue.\",\n                    @\"Plan Creation Failure\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n                return false;\n            }\n\n            if (ccpCharacter.Plans.Any(x => x.Name == newPlan.Name))\n            {\n                MessageBox.Show(@\"There is already a plan with the same name in the characters' Plans.\",\n                    @\"Plan Creation Failure\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n                return false;\n            }\n\n            // Add skill queue in plan\n            foreach (QueuedSkill qSkill in ccpCharacter.SkillQueue)\n            {\n                newPlan.PlanTo(qSkill.Skill, qSkill.Level);\n            }\n\n            // Check if there is already a plan with the same skills\n            if (ccpCharacter.Plans.Any(plan => !newPlan.Except(plan, new PlanEntryComparer()).Any()))\n            {\n                MessageBox.Show(@\"There is already a plan with the same skills in the characters' Plans.\",\n                    @\"Plan Creation Failure\",\n                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n                return false;\n            }\n\n            // Add plan and save\n            ccpCharacter.Plans.Insert(0, newPlan);\n\n            return true;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Helpers/PlanPrinter.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Drawing.Printing;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Helpers\n{\n    /// <summary>\n    /// Prints a plan.\n    /// </summary>\n    public class PlanPrinter\n    {\n        private readonly Plan m_plan;\n        private readonly Character m_character;\n        private readonly Font m_font;\n        private readonly Font m_boldFont;\n        private readonly PlanExportSettings m_settings;\n\n        private TimeSpan m_trainingTime;\n        private DateTime m_completionDate;\n        private Point m_point;\n        private int m_entryToPrint;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        private PlanPrinter(Plan plan)\n        {\n            m_plan = plan;\n            m_plan.UpdateStatistics();\n\n            m_character = (Character)plan.Character;\n            m_settings = Settings.Exportation.PlanToText;\n\n            m_font = FontFactory.GetFont(\"Arial\", 10);\n            m_boldFont = FontFactory.GetFont(\"Arial\", 10, FontStyle.Bold | FontStyle.Underline);\n        }\n\n        /// <summary>\n        /// Prints the given plan.\n        /// </summary>\n        /// <param name=\"plan\"></param>\n        public static void Print(Plan plan)\n        {\n            PlanPrinter printer = new PlanPrinter(plan);\n            printer.PrintPlan();\n        }\n\n        /// <summary>\n        /// Main method\n        /// </summary>\n        private void PrintPlan()\n        {\n            using (PrintDocument doc = new PrintDocument())\n            {\n                doc.DocumentName = $\"Skill Plan for {m_character.Name} ({m_plan.Name})\";\n                doc.PrintPage += doc_PrintPage;\n\n                //Display the options\n                using (PrintOptionsDialog prdlg = new PrintOptionsDialog(m_settings, doc))\n                {\n                    if (prdlg.ShowDialog() != DialogResult.OK)\n                        return;\n\n                    doc.PrinterSettings.PrinterName = prdlg.PrinterName;\n\n                    // Display the preview\n                    using (PrintPreviewDialog pd = new PrintPreviewDialog())\n                    {\n                        pd.Document = doc;\n                        pd.ShowDialog();\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Occurs anytime the preview dialog needs to print a page\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.Drawing.Printing.PrintPageEventArgs\"/> instance containing the event data.</param>\n        private void doc_PrintPage(object sender, PrintPageEventArgs e)\n        {\n            Graphics g = e.Graphics;\n            string s = $\"Skill Plan for {m_character.Name} ({m_plan.Name})\";\n\n            m_point.X = 5;\n            m_point.Y = 5;\n\n            // Print header\n            if (m_settings.IncludeHeader)\n            {\n                Size size = g.MeasureString(s, m_boldFont).ToSize();\n                m_point.X = (e.MarginBounds.Width - size.Width) / 2;\n\n                size = PrintBold(g, s);\n                m_point.Y += size.Height * 2;\n                m_point.X = 5;\n            }\n\n            bool resetTotal = true;\n            if (m_entryToPrint == 0)\n                m_completionDate = DateTime.Now;\n\n            // Scroll through entries\n            int index = 0;\n            foreach (PlanEntry pe in m_plan)\n            {\n                index++;\n\n                // Not displayed on this page ?\n                if (m_entryToPrint >= index)\n                {\n                    resetTotal = false;\n                    continue;\n                }\n\n                // Update training time\n                if (resetTotal)\n                    m_trainingTime = TimeSpan.Zero;\n\n                m_trainingTime += pe.TrainingTime;\n                m_completionDate = pe.EndTime;\n                resetTotal = false;\n\n                // Print entry\n                PrintEntry(g, index, pe);\n\n                // End of page ?\n                if (m_point.Y > e.MarginBounds.Bottom)\n                {\n                    m_entryToPrint = index;\n                    e.HasMorePages = true;\n                    return;\n                }\n\n                m_entryToPrint = 0;\n            }\n\n            // Reached the end of the plan\n            e.HasMorePages = false;\n            m_entryToPrint = 0;\n\n            // Print footer\n            PrintPageFooter(g, index);\n        }\n\n        /// <summary>\n        /// Prints a single entry\n        /// </summary>\n        /// <param name=\"g\">The graphics canvas.</param>\n        /// <param name=\"index\">The index.</param>\n        /// <param name=\"pe\">The plan entry.</param>\n        private void PrintEntry(Graphics g, int index, PlanEntry pe)\n        {\n            Size size;\n\n            // Print entry index\n            if (m_settings.EntryNumber)\n            {\n                size = Print(g, $\"{index}: \");\n                m_point.X += size.Width;\n            }\n\n            // Print skill name and level\n            size = PrintBold(g, pe.ToString());\n            m_point.X += size.Width;\n\n            // Print Notes ?\n            if (m_settings.EntryNotes)\n            {\n                // Jump to next line\n                m_point.Y += size.Height;\n                m_point.X = 20;\n\n                // Note\n                size = Print(g, pe.Notes);\n                m_point.X += size.Width;\n            }\n\n            // Print additional infos below\n            if (m_settings.EntryTrainingTimes || m_settings.EntryStartDate || m_settings.EntryFinishDate)\n            {\n                // Jump to next line\n                m_point.Y += size.Height;\n                m_point.X = 20;\n\n                // Open parenthesis\n                size = Print(g, \" (\");\n                m_point.X += size.Width;\n\n                // Training time ?\n                bool needComma = false;\n                if (m_settings.EntryTrainingTimes)\n                {\n                    size = Print(g, pe.TrainingTime.ToDescriptiveText(\n                        DescriptiveTextOptions.FullText |\n                        DescriptiveTextOptions.IncludeCommas |\n                        DescriptiveTextOptions.SpaceText));\n                    m_point.X += size.Width;\n                    needComma = true;\n                }\n\n                // Start date ?\n                if (m_settings.EntryStartDate)\n                {\n                    if (needComma)\n                    {\n                        size = Print(g, \"; \");\n                        m_point.X += size.Width;\n                    }\n\n                    size = Print(g, \"Start: \");\n                    m_point.X += size.Width;\n\n                    size = Print(g, pe.StartTime.ToString());\n                    m_point.X += size.Width;\n\n                    needComma = true;\n                }\n\n                // End date ?\n                if (m_settings.EntryFinishDate)\n                {\n                    if (needComma)\n                    {\n                        size = Print(g, \"; \");\n                        m_point.X += size.Width;\n                    }\n                    size = Print(g, \"Finish: \");\n                    m_point.X += size.Width;\n\n                    size = Print(g, pe.EndTime.ToString());\n                    m_point.X += size.Width;\n                }\n\n                // Close parenthesis\n                size = Print(g, \")\");\n                m_point.X += size.Width;\n            }\n\n            // Jump to next line\n            m_point.X = 5;\n            m_point.Y += size.Height;\n        }\n\n        /// <summary>\n        /// Prints the footer displaying the statistics for this page ONLY\n        /// </summary>\n        /// <param name=\"g\">The graphis canvas.</param>\n        /// <param name=\"index\">The index.</param>\n        private void PrintPageFooter(Graphics g, int index)\n        {\n            Size size = Size.Empty;\n            bool needComma = false;\n\n            if (!m_settings.FooterCount && !m_settings.FooterTotalTime && !m_settings.FooterDate)\n                return;\n\n            // Jump to next line\n            m_point.X = 5;\n            m_point.Y += 20;\n\n            // Total number of entries on this page\n            if (m_settings.FooterCount)\n            {\n                size = Print(g, index.ToString(CultureConstants.DefaultCulture));\n                m_point.X += size.Width;\n\n                size = Print(g, index > 1 ? \" skill levels\" : \" skill level\");\n\n                m_point.X += size.Width;\n                needComma = true;\n            }\n\n            // Total training time for ths page\n            if (m_settings.FooterTotalTime)\n            {\n                if (needComma)\n                {\n                    size = Print(g, \"; \");\n                    m_point.X += size.Width;\n                }\n                size = Print(g, \"Total time: \");\n                m_point.X += size.Width;\n\n                size = Print(g, m_trainingTime.ToDescriptiveText(\n                    DescriptiveTextOptions.FullText\n                    | DescriptiveTextOptions.IncludeCommas\n                    | DescriptiveTextOptions.SpaceText));\n\n                m_point.X += size.Width;\n\n                needComma = true;\n            }\n\n            // Date at the end of this plan\n            if (m_settings.FooterDate)\n            {\n                if (needComma)\n                {\n                    size = Print(g, \"; \");\n                    m_point.X += size.Width;\n                }\n                size = Print(g, \"Completion: \");\n                m_point.X += size.Width;\n                size = Print(g, m_completionDate.ToString());\n                m_point.X += size.Width;\n            }\n\n            // Jump line\n            m_point.X = 5;\n            m_point.Y += size.Height;\n        }\n\n        /// <summary>\n        /// Measures and prints using the bold font.\n        /// </summary>\n        /// <param name=\"g\">The graphics canvas.</param>\n        /// <param name=\"s\">The string to print.</param>\n        /// <returns></returns>\n        private Size PrintBold(Graphics g, string s)\n        {\n            using (SolidBrush brush = new SolidBrush(Color.Black))\n            {\n                g.DrawString(s, m_boldFont, brush, m_point);\n            }\n            return g.MeasureString(s, m_boldFont).ToSize();\n        }\n\n        /// <summary>\n        /// Measures and prints using the regular font.\n        /// </summary>\n        /// <param name=\"g\">The graphics canvas.</param>\n        /// <param name=\"s\">The string to print.</param>\n        /// <returns></returns>\n        private Size Print(Graphics g, string s)\n        {\n            using (SolidBrush brush = new SolidBrush(Color.Black))\n            {\n                g.DrawString(s, m_font, brush, m_point);\n            }\n            return g.MeasureString(s, m_font).ToSize();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Helpers/PlanScratchpad.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Helpers\n{\n    /// <summary>\n    /// Represents a plan made for computation, without the automatic priorities fixing and prerequisites checks. \n    /// It therefore provides different methods from <see cref=\"Plan\"/> for insertions and removals, to allow usage of this class as a regular collection.\n    /// It also does not fire events.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class PlanScratchpad : BasePlan\n    {\n        #region Disposable\n\n        /// <summary>\n        /// A stub disposable object.\n        /// </summary>\n        private sealed class Disposable : IDisposable\n        {\n            public void Dispose()\n            {\n            }\n        }\n\n        #endregion\n\n\n        private static readonly Disposable s_disposable = new Disposable();\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        public PlanScratchpad(BaseCharacter character)\n            : base(character)\n        {\n        }\n\n        /// <summary>\n        /// Constructor from an enumeration.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"entries\"></param>\n        public PlanScratchpad(BaseCharacter character, IEnumerable<PlanEntry> entries)\n            : this(character)\n        {\n            AddRange(entries);\n        }\n\n\n        #region Event firing and suppression\n\n        /// <summary>\n        /// Returns an <see cref=\"IDisposable\"/> object which suspends events notification and will resume them once disposed.\n        /// </summary>\n        /// <remarks>Use the returned object in a <c>using</c> block to ensure the disposal of the object even when exceptions are thrown.</remarks>\n        /// <returns></returns>\n        public override IDisposable SuspendingEvents() => s_disposable;\n\n        /// <summary>\n        /// Notify changes happened in the entries\n        /// </summary>\n        internal override void OnChanged(PlanChange change)\n        {\n        }\n\n        #endregion\n\n\n        #region Insertions and removals\n\n        /// <summary>\n        /// Adds an item.\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        public void Add(PlanEntry entry)\n        {\n            AddCore(entry);\n        }\n\n        /// <summary>\n        /// Adds the provided items.\n        /// </summary>\n        /// <param name=\"entries\">The entries.</param>\n        /// <exception cref=\"System.ArgumentNullException\">entries</exception>\n        public void AddRange(IEnumerable<PlanEntry> entries)\n        {\n            entries.ThrowIfNull(nameof(entries));\n\n            foreach (PlanEntry entry in entries)\n            {\n                AddCore(entry);\n            }\n        }\n\n        /// <summary>\n        /// Removes an item.\n        /// </summary>\n        /// <param name=\"entry\">The entry.</param>\n        /// <exception cref=\"System.ArgumentNullException\">entry</exception>\n        public void Remove(PlanEntry entry)\n        {\n            entry.ThrowIfNull(nameof(entry));\n\n            int index = IndexOf(entry.Skill, entry.Level);\n            if (index != -1)\n                RemoveCore(index);\n        }\n\n        #endregion\n\n\n        #region Simple sort\n\n        /// <summary>\n        /// Performs a simple ordering by the given sort criteria, based on the latest statistics.\n        /// </summary>\n        /// <param name=\"sort\"></param>\n        /// <param name=\"reverseOrder\"></param>\n        internal void SimpleSort(PlanEntrySort sort, bool reverseOrder)\n        {\n            // Apply simple sort operators\n            switch (sort)\n            {\n                case PlanEntrySort.None:\n                    break;\n                case PlanEntrySort.Name:\n                    Items.StableSort(PlanEntrySorter.CompareByName);\n                    break;\n                case PlanEntrySort.Cost:\n                    Items.StableSort(PlanEntrySorter.CompareByCost);\n                    break;\n                case PlanEntrySort.PrimaryAttribute:\n                    Items.StableSort(PlanEntrySorter.CompareByPrimaryAttribute);\n                    break;\n                case PlanEntrySort.SecondaryAttribute:\n                    Items.StableSort(PlanEntrySorter.CompareBySecondaryAttribute);\n                    break;\n                case PlanEntrySort.Priority:\n                    Items.StableSort(PlanEntrySorter.CompareByPriority);\n                    break;\n                case PlanEntrySort.PlanGroup:\n                    Items.StableSort(PlanEntrySorter.CompareByPlanGroup);\n                    break;\n                case PlanEntrySort.PercentCompleted:\n                    Items.StableSort(PlanEntrySorter.CompareByPercentCompleted);\n                    break;\n                case PlanEntrySort.Rank:\n                    Items.StableSort(PlanEntrySorter.CompareByRank);\n                    break;\n                case PlanEntrySort.Notes:\n                    Items.StableSort(PlanEntrySorter.CompareByNotes);\n                    break;\n                case PlanEntrySort.PlanType:\n                    Items.StableSort(PlanEntrySorter.CompareByPlanType);\n                    break;\n                case PlanEntrySort.TimeDifference:\n                    Items.StableSort(PlanEntrySorter.CompareByTimeDifference);\n                    break;\n                case PlanEntrySort.TrainingTime:\n                    Items.StableSort(PlanEntrySorter.CompareByTrainingTime);\n                    break;\n                case PlanEntrySort.TrainingTimeNatural:\n                    Items.StableSort(PlanEntrySorter.CompareByTrainingTimeNatural);\n                    break;\n                case PlanEntrySort.SkillGroupDuration:\n                    Dictionary<StaticSkillGroup, TimeSpan> skillGroupsDurations = new Dictionary<StaticSkillGroup, TimeSpan>();\n                    Items.StableSort((x, y) => PlanEntrySorter.CompareBySkillGroupDuration(x, y, Items, skillGroupsDurations));\n                    break;\n                case PlanEntrySort.SPPerHour:\n                    Items.StableSort(PlanEntrySorter.CompareBySPPerHour);\n                    break;\n                case PlanEntrySort.SkillPointsRequired:\n                    Items.StableSort(PlanEntrySorter.CompareBySkillPointsRequired);\n                    break;\n                case PlanEntrySort.OmegaRequired:\n                    Items.StableSort(PlanEntrySorter.CompareByOmegaRequired);\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n\n            // Reverse order\n            if (reverseOrder)\n                Items.Reverse();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/TaskHelper.cs",
    "content": "﻿using System;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.Common.Helpers\n{\n    public static class TaskHelper\n    {\n        /// <summary>\n        /// Runs the IO bound action asynchronously.\n        /// </summary>\n        /// <param name=\"action\">The action.</param>\n        /// <param name=\"cancellationToken\">The cancellation token.</param>\n        /// <returns></returns>\n        /// <remarks>\n        /// This methods purpose is to help developers understand\n        /// the concept of running IO bound task using <![CDATA[TaskCompletionSource<T>()]]>\n        /// See more at: https://msdn.microsoft.com/en-us/library/hh873177.aspx\n        /// </remarks>\n        public static Task RunIOBoundTaskAsync(Action action,\n            CancellationToken cancellationToken = default(CancellationToken))\n        {\n            var tcs = new TaskCompletionSource<object>();\n\n            try\n            {\n                if (!cancellationToken.IsCancellationRequested)\n                {\n                    return Task.Factory.FromAsync(action.BeginInvoke,\n                        result =>\n                        {\n                            try\n                            {\n                                action.EndInvoke(result);\n                                tcs.TrySetResult(default(object));\n                            }\n                            catch (Exception exc)\n                            {\n                                tcs.TrySetException(exc);\n                            }\n                        }, null);\n                }\n\n                tcs.TrySetCanceled(cancellationToken);\n                return tcs.Task;\n            }\n            catch (Exception exc)\n            {\n                tcs.TrySetException(exc);\n            }\n\n            return tcs.Task;\n        }\n\n        /// <summary>\n        /// Runs the IO bound function asynchronously.\n        /// </summary>\n        /// <param name=\"function\">The function.</param>\n        /// <param name=\"cancellationToken\">The cancellation token.</param>\n        /// <returns></returns>\n        /// <remarks>\n        /// This methods purpose is to help developers understand\n        /// the concept of running IO bound task using <![CDATA[TaskCompletionSource<T>()]]>\n        /// See more at: https://msdn.microsoft.com/en-us/library/hh873177.aspx\n        /// </remarks>\n        public static Task RunIOBoundTaskAsync(Func<Task> function,\n            CancellationToken cancellationToken = default(CancellationToken))\n            => RunIOBoundTaskAsync<Task>(function, cancellationToken).Unwrap();\n\n        /// <summary>\n        /// Runs the IO bound function asynchronously.\n        /// </summary>\n        /// <typeparam name=\"TResult\">The type of the result.</typeparam>\n        /// <param name=\"function\">The function.</param>\n        /// <param name=\"cancellationToken\">The cancellation token.</param>\n        /// <returns></returns>\n        /// <remarks>\n        /// This methods purpose is to help developers understand\n        /// the concept of running IO bound task using <![CDATA[TaskCompletionSource<T>()]]>\n        /// See more at: https://msdn.microsoft.com/en-us/library/hh873177.aspx\n        /// </remarks>\n        public static Task<TResult> RunIOBoundTaskAsync<TResult>(Func<TResult> function,\n            CancellationToken cancellationToken = default(CancellationToken))\n        {\n            var tcs = new TaskCompletionSource<TResult>();\n\n            try\n            {\n                if (!cancellationToken.IsCancellationRequested)\n                {\n                    return Task.Factory.FromAsync(function.BeginInvoke,\n                        asyncResult =>\n                        {\n                            TResult tResult = function.EndInvoke(asyncResult);\n                            tcs.TrySetResult(tResult);\n                            return tResult;\n                        }, null);\n                }\n\n                tcs.TrySetCanceled(cancellationToken);\n                return tcs.Task;\n            }\n            catch (Exception exc)\n            {\n                tcs.TrySetException(exc);\n            }\n\n            return tcs.Task;\n        }\n\n        /// <summary>\n        /// Runs the IO bound function asynchronously.\n        /// </summary>\n        /// <typeparam name=\"TResult\">The type of the result.</typeparam>\n        /// <param name=\"function\">The function.</param>\n        /// <param name=\"cancellationToken\">The cancellation token.</param>\n        /// <returns></returns>\n        /// <remarks>\n        /// This methods purpose is to help developers understand\n        /// the concept of running IO bound task using <![CDATA[TaskCompletionSource<T>()]]>\n        /// See more at: https://msdn.microsoft.com/en-us/library/hh873177.aspx\n        /// </remarks>\n        public static Task<TResult> RunIOBoundTaskAsync<TResult>(Func<Task<TResult>> function,\n            CancellationToken cancellationToken = default(CancellationToken))\n            => RunIOBoundTaskAsync<Task<TResult>>(function, cancellationToken).Unwrap();\n\n        /// <summary>\n        /// Runs the compute bound task asynchronously.\n        /// </summary>\n        /// <param name=\"action\">The action.</param>\n        /// <param name=\"cancellationToken\">The cancellation token.</param>\n        /// <returns></returns>\n        /// <remarks>\n        /// This methods purpose is to help developers understand\n        /// the concept of running compute bound task using <![CDATA[Task.Run()]]>\n        /// See more at: https://msdn.microsoft.com/en-us/library/hh873177.aspx\n        /// </remarks>\n        public static Task RunCPUBoundTaskAsync(Action action,\n            CancellationToken cancellationToken = default(CancellationToken))\n            => Task.Run(action, cancellationToken);\n\n        /// <summary>\n        /// Runs the compute bound task asynchronously.\n        /// </summary>\n        /// <param name=\"function\">The function.</param>\n        /// <param name=\"cancellationToken\">The cancellation token.</param>\n        /// <returns></returns>\n        /// <remarks>\n        /// This methods purpose is to help developers understand\n        /// the concept of running compute bound task using <![CDATA[Task.Run()]]>\n        /// See more at: https://msdn.microsoft.com/en-us/library/hh873177.aspx\n        /// </remarks>\n        public static Task RunCPUBoundTaskAsync(Func<Task> function,\n            CancellationToken cancellationToken = default(CancellationToken))\n            => Task.Run(function, cancellationToken);\n\n        /// <summary>\n        /// Runs the compute bound task asynchronously.\n        /// </summary>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"function\">The function.</param>\n        /// <param name=\"cancellationToken\">The cancellation token.</param>\n        /// <returns></returns>\n        /// <remarks>\n        /// This methods purpose is to help developers understand\n        /// the concept of running compute bound task using <![CDATA[Task.Run()]]>\n        /// See more at: https://msdn.microsoft.com/en-us/library/hh873177.aspx\n        /// </remarks>\n        public static Task<TResult> RunCPUBoundTaskAsync<TResult>(Func<TResult> function,\n            CancellationToken cancellationToken = default(CancellationToken))\n            => Task.Run(function, cancellationToken);\n\n        /// <summary>\n        /// Runs the compute bound task asynchronously.\n        /// </summary>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"function\">The function.</param>\n        /// <param name=\"cancellationToken\">The cancellation token.</param>\n        /// <returns></returns>\n        /// <remarks>\n        /// This methods purpose is to help developers understand\n        /// the concept of running compute bound task using <![CDATA[Task.Run()]]>\n        /// See more at: https://msdn.microsoft.com/en-us/library/hh873177.aspx\n        /// </remarks>\n        public static Task<TResult> RunCPUBoundTaskAsync<TResult>(Func<Task<TResult>> function,\n            CancellationToken cancellationToken = default(CancellationToken))\n            => Task.Run(function, cancellationToken);\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/TimeCheck.cs",
    "content": "using EVEMon.Common.Constants;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Threading;\nusing System;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Sockets;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.Common.Helpers\n{\n    /// <summary>\n    /// Ensures synchronization of local time to a known time source.\n    /// </summary>\n    public static class TimeCheck\n    {\n        /// <summary>\n        /// Occurs when time check completed.\n        /// </summary>\n        public static event EventHandler<TimeCheckSyncEventArgs> TimeCheckCompleted;\n\n        /// <summary>\n        /// Check for time synchronization,\n        /// or reschedule it for later if no connection is available.\n        /// </summary>\n        public static void ScheduleCheck(TimeSpan time)\n        {\n            Dispatcher.Schedule(time, () => BeginCheckAsync().ConfigureAwait(false));\n            EveMonClient.Trace($\"in {time}\");\n        }\n\n        /// <summary>\n        /// Method to determine if the user's clock is syncrhonised to NTP time pool.\n        /// Updated to move to NTP (global NTP pool) rather than NIST port 13 time check, which is being deprecated\n        /// </summary>\n        private static async Task BeginCheckAsync()\n        {\n            if (!NetworkMonitor.IsNetworkAvailable)\n            {\n                // Reschedule later otherwise\n                ScheduleCheck(TimeSpan.FromMinutes(1));\n                return;\n            }\n\n            EveMonClient.Trace();\n\n            string ntpServer = NetworkConstants.GlobalNTPPool;// \"pool.ntp.org\";\n            DateTime serverTimeToLocalTime;\n            bool isSynchronised;\n\n            await Dns.GetHostAddressesAsync(ntpServer)\n                .ContinueWith(task =>\n                {\n                    IPAddress[] ipAddresses = task.Result;\n\n                    if (!ipAddresses.Any())\n                        return;\n\n                    try\n                    {\n                        DateTime dateTimeNowUtc;\n                        DateTime localTime = DateTime.Now;\n                        \n                        var ntpData = new byte[48];\n                        ntpData[0] = 0x1B; //LeapIndicator = 0 (no warning), VersionNum = 3 (IPv4 only), Mode = 3 (Client Mode)\n\n                        var ipEndPoint = new IPEndPoint(task.Result.First(), 123);\n                        using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))\n                        {\n                            socket.ReceiveTimeout = 5000;\n                            socket.SendTimeout = 5000;\n                            socket.Connect(ipEndPoint);\n                            socket.Send(ntpData);\n                            socket.Receive(ntpData);\n                            socket.Close();\n                        }\n\n                        ulong intPart = (ulong)ntpData[40] << 24 | (ulong)ntpData[41] << 16 | (ulong)ntpData[42] << 8 | (ulong)ntpData[43];\n                        ulong fractPart = (ulong)ntpData[44] << 24 | (ulong)ntpData[45] << 16 | (ulong)ntpData[46] << 8 | (ulong)ntpData[47];\n\n                        var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);\n                        var networkDateTime = (new DateTime(1900, 1, 1)).AddMilliseconds((long)milliseconds);\n\n                        dateTimeNowUtc = networkDateTime;\n\n                        serverTimeToLocalTime = dateTimeNowUtc.ToLocalTime();\n                        TimeSpan timediff =\n                            TimeSpan.FromSeconds(Math.Abs(serverTimeToLocalTime.Subtract(localTime).TotalSeconds));\n                        isSynchronised = timediff < TimeSpan.FromSeconds(60);\n\n                        OnCheckCompleted(isSynchronised, serverTimeToLocalTime, localTime);\n                    }\n                    catch (Exception exc)\n                    {\n                        CheckFailure(exc);\n                    }\n                }, EveMonClient.CurrentSynchronizationContext).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Called when the check fails.\n        /// </summary>\n        /// <param name=\"exc\">The exc.</param>\n        private static void CheckFailure(Exception exc)\n        {\n            EveMonClient.Trace(exc.Message);\n            ScheduleCheck(TimeSpan.FromMinutes(1));\n        }\n\n        /// <summary>\n        /// Called when time check completed.\n        /// </summary>\n        /// <param name=\"isSynchronised\">if set to <c>true</c> [is synchronised].</param>\n        /// <param name=\"serverTimeToLocalTime\">The server time to local time.</param>\n        /// <param name=\"localTime\">The local time.</param>\n        private static void OnCheckCompleted(bool isSynchronised, DateTime serverTimeToLocalTime, DateTime localTime)\n        {\n            EveMonClient.Trace(Settings.Updates.CheckTimeOnStartup ?  \"Synchronised\" : \"Disabled\");\n\n            TimeCheckCompleted?.ThreadSafeInvoke(null, new TimeCheckSyncEventArgs(isSynchronised, serverTimeToLocalTime, localTime));\n\n            // Reschedule\n            ScheduleCheck(TimeSpan.FromDays(1));\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Helpers/UIHelper.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Drawing.Imaging;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Helpers\n{\n    /// <summary>\n    /// Saves a couple of repetitive tasks.\n    /// </summary>\n    public static class UIHelper\n    {\n        public static Bitmap CharacterMonitorScreenshot { get; set; }\n\n        /// <summary>\n        /// Saves the plans to a file.\n        /// </summary>\n        /// <param name=\"plans\">The plans.</param>\n        public static async Task SavePlansAsync(IList<Plan> plans)\n        {\n            Character character = (Character)plans.First().Character;\n\n            // Prompt the user to pick a file name\n            using (SaveFileDialog sfdSave = new SaveFileDialog())\n            {\n                sfdSave.FileName = $\"{character.Name} - Plans Backup\";\n                sfdSave.Title = @\"Save to File\";\n                sfdSave.Filter = @\"EVEMon Plans Backup Format (*.epb)|*.epb\";\n                sfdSave.FilterIndex = (int)PlanFormat.Emp;\n\n                if (sfdSave.ShowDialog() == DialogResult.Cancel)\n                    return;\n\n                try\n                {\n                    string content = PlanIOHelper.ExportAsXML(plans);\n\n                    // Moves to the final file\n                    await FileHelper.OverwriteOrWarnTheUserAsync(\n                        sfdSave.FileName,\n                        async fs =>\n                            {\n                                // Emp is actually compressed xml\n                                Stream stream = new GZipStream(fs, CompressionMode.Compress);\n                                using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))\n                                {\n                                    await writer.WriteAsync(content);\n                                    await writer.FlushAsync();\n                                    await stream.FlushAsync();\n                                    await fs.FlushAsync();\n                                }\n                                return true;\n                            });\n                }\n                catch (IOException err)\n                {\n                    ExceptionHandler.LogException(err, false);\n                    MessageBox.Show($\"There was an error writing out the file:\\n\\n{err.Message}\",\n                                    @\"Save Failed\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Displays the plan exportation window and then exports it.\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static async Task ExportPlanAsync(Plan plan)\n        {\n            plan.ThrowIfNull(nameof(plan));\n\n            await ExportPlanAsync(plan, (Character)plan.Character);\n        }\n\n        /// <summary>\n        /// Exports the character's selected skills as plan.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"selectedSkills\">The selected skills.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static async Task ExportCharacterSkillsAsPlanAsync(Character character, IEnumerable<Skill> selectedSkills = null)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            // Create a character without any skill\n            CharacterScratchpad scratchpad = new CharacterScratchpad(character);\n            scratchpad.ClearSkills();\n\n            // Create a new plan\n            Plan plan = new Plan(scratchpad) { Name = \"Skills Plan\" };\n\n            IEnumerable<Skill> skills = selectedSkills ?? character.Skills.Where(skill => skill.IsPublic);\n\n            // Add all trained skill levels that the character has trained so far\n            foreach (Skill skill in skills)\n            {\n                plan.PlanTo(skill, skill.Level);\n            }\n\n            await ExportPlanAsync(plan, character);\n        }\n\n        /// <summary>\n        /// Displays the plan exportation window and then exports it.\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        /// <param name=\"character\">The character.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        /// <exception cref=\"System.NotImplementedException\"></exception>\n        private static async Task ExportPlanAsync(Plan plan, Character character)\n        {\n            plan.ThrowIfNull(nameof(plan));\n\n            character.ThrowIfNull(nameof(character));\n\n            // Assemble an initial filename and remove prohibited characters\n            string planSaveName = $\"{character.Name} - {plan.Name}\";\n            char[] invalidFileChars = Path.GetInvalidFileNameChars();\n            int fileInd = planSaveName.IndexOfAny(invalidFileChars);\n            while (fileInd != -1)\n            {\n                planSaveName = planSaveName.Replace(planSaveName[fileInd], '-');\n                fileInd = planSaveName.IndexOfAny(invalidFileChars);\n            }\n\n            // Prompt the user to pick a file name\n            using (SaveFileDialog sfdSave = new SaveFileDialog())\n            {\n                sfdSave.FileName = planSaveName;\n                sfdSave.Title = @\"Save to File\";\n                sfdSave.Filter =\n                    @\"EVEMon Plan Format (*.emp)|*.emp|XML  Format (*.xml)|*.xml|Text Format (*.txt)|*.txt\";\n                sfdSave.FilterIndex = (int)PlanFormat.Emp;\n\n                if (sfdSave.ShowDialog() == DialogResult.Cancel)\n                    return;\n\n                // Serialize\n                try\n                {\n                    PlanFormat format = (PlanFormat)sfdSave.FilterIndex;\n\n                    string content;\n                    switch (format)\n                    {\n                        case PlanFormat.Emp:\n                        case PlanFormat.Xml:\n                            content = PlanIOHelper.ExportAsXML(plan);\n                            break;\n                        case PlanFormat.Text:\n                            // Prompts the user and returns if canceled\n                            PlanExportSettings settings = PromptUserForPlanExportSettings(plan);\n                            if (settings == null)\n                                return;\n\n                            content = PlanIOHelper.ExportAsText(plan, settings);\n                            break;\n                        default:\n                            throw new NotImplementedException();\n                    }\n\n                    // Moves to the final file\n                    await FileHelper.OverwriteOrWarnTheUserAsync(\n                        sfdSave.FileName,\n                        async fs =>\n                            {\n                                Stream stream = fs;\n                                // Emp is actually compressed text\n                                if (format == PlanFormat.Emp)\n                                    stream = new GZipStream(fs, CompressionMode.Compress);\n\n                                using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))\n                                {\n                                    await writer.WriteAsync(content);\n                                    await writer.FlushAsync();\n                                    await stream.FlushAsync();\n                                    await fs.FlushAsync();\n                                }\n                                return true;\n                            });\n                }\n                catch (IOException err)\n                {\n                    ExceptionHandler.LogException(err, true);\n                    MessageBox.Show($\"There was an error writing out the file:\\n\\n{err.Message}\",\n                                    @\"Save Failed\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Prompt the user to select plan exportation settings.\n        /// </summary>\n        /// <returns></returns>\n        public static PlanExportSettings PromptUserForPlanExportSettings(Plan plan)\n        {\n            PlanExportSettings settings = Settings.Exportation.PlanToText;\n            using (CopySaveOptionsWindow f = new CopySaveOptionsWindow(settings, plan, false))\n            {\n                if (settings.Markup == MarkupType.Undefined)\n                    settings.Markup = MarkupType.None;\n\n                f.ShowDialog();\n                if (f.DialogResult == DialogResult.Cancel)\n                    return null;\n\n                // Save the new settings\n                if (!f.SetAsDefault)\n                    return settings;\n\n                Settings.Exportation.PlanToText = settings;\n                Settings.Save();\n\n                return settings;\n            }\n        }\n\n        /// <summary>\n        /// Displays the character exportation window and then exports it.\n        /// Optionally it exports it as it would be after the plan finish.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"plan\">The plan.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">character</exception>\n        public static async Task ExportCharacterAsync(Character character, Plan plan = null)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            bool isAfterPlanExport = plan != null;\n\n            // Open the dialog box\n            using (SaveFileDialog characterSaveDialog = new SaveFileDialog())\n            {\n                characterSaveDialog.Title = $\"Save {(isAfterPlanExport ? \"After Plan \" : string.Empty)}Character Info\";\n                characterSaveDialog.Filter =\n                    @\"Text Format|*.txt|CHR Format (EFT)|*.chr|HTML Format|*.html|XML Format (EVEMon)|*.xml\";\n\n                if (!isAfterPlanExport)\n                    characterSaveDialog.Filter += @\"|XML Format (CCP API)|*.xml|PNG Image|*.png\";\n\n                characterSaveDialog.FileName =\n                    $\"{character.Name}{(isAfterPlanExport ? $\" (after plan {plan.Name})\" : string.Empty)}\";\n\n                characterSaveDialog.FilterIndex = isAfterPlanExport\n                                                      ? (int)CharacterSaveFormat.EVEMonXML\n                                                      : (int)CharacterSaveFormat.CCPXML;\n\n                if (characterSaveDialog.ShowDialog() == DialogResult.Cancel)\n                    return;\n\n                // Serialize\n                try\n                {\n                    CharacterSaveFormat format = (CharacterSaveFormat)characterSaveDialog.FilterIndex;\n\n                    // Save character with the chosen format to our file\n                    await FileHelper.OverwriteOrWarnTheUserAsync(\n                        characterSaveDialog.FileName,\n                        async fs =>\n                            {\n                                if (format == CharacterSaveFormat.PNG)\n                                {\n                                    Image image = CharacterMonitorScreenshot;\n                                    image.Save(fs, ImageFormat.Png);\n                                    await fs.FlushAsync();\n                                    return true;\n                                }\n\n                                string content = CharacterExporter.Export(format, character, plan);\n                                if ((format == CharacterSaveFormat.CCPXML) && string.IsNullOrEmpty(content))\n                                {\n                                    MessageBox.Show(\n                                        @\"This character has never been downloaded from CCP, cannot find it in the XML cache.\",\n                                        @\"Cannot export the character\", MessageBoxButtons.OK, MessageBoxIcon.Warning);\n                                    return false;\n                                }\n\n                                using (StreamWriter sw = new StreamWriter(fs))\n                                {\n                                    await sw.WriteAsync(content);\n                                    await sw.FlushAsync();\n                                    await fs.FlushAsync();\n                                }\n                                return true;\n                            });\n                }\n                    // Handle exception\n                catch (IOException exc)\n                {\n                    ExceptionHandler.LogException(exc, true);\n                    MessageBox.Show(@\"A problem occurred during exportation. The operation has not been completed.\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// Adds the plans as toolstrip items to the list.\n        /// </summary>\n        /// <param name=\"plans\">The plans.</param>\n        /// <param name=\"list\">The list.</param>\n        /// <param name=\"initialize\">The initialize.</param>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static void AddTo(this IEnumerable<Plan> plans, ToolStripItemCollection list,\n                                 Action<ToolStripMenuItem, Plan> initialize)\n        {\n            plans.ThrowIfNull(nameof(plans));\n\n            list.ThrowIfNull(nameof(list));\n\n            initialize.ThrowIfNull(nameof(initialize));\n\n            //Scroll through plans\n            foreach (Plan plan in plans)\n            {\n                ToolStripMenuItem item;\n                using (ToolStripMenuItem planItem = new ToolStripMenuItem(plan.Name))\n                {\n                    initialize(planItem, plan);\n                    item = planItem;\n                }\n                list.Add(item);\n            }\n        }\n\n        /// <summary>\n        /// Shows a no support message.\n        /// </summary>\n        /// <returns></returns>\n        internal static object ShowNoSupportMessage()\n        {\n            MessageBox.Show($\"The file is probably from an EVEMon version prior to 1.3.0.{Environment.NewLine}\" +\n                            @\"This type of file is no longer supported.\",\n                            @\"File type not supported\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n\n            return null;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/IgbService/ClientConnectedEventArgs.cs",
    "content": "﻿using System;\nusing System.Net.Sockets;\n\nnamespace EVEMon.Common.IgbService\n{\n    /// <summary>\n    /// Event arguments triggered on client connect.\n    /// </summary>\n    public class ClientConnectedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ClientConnectedEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"client\">The client.</param>\n        public ClientConnectedEventArgs(TcpClient client)\n        {\n            TcpClient = client;\n        }\n\n        /// <summary>\n        /// Gets or sets the TCP client.\n        /// </summary>\n        /// <value>The TCP client.</value>\n        public TcpClient TcpClient { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/IgbService/IgbClientDataReadEventArgs.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace EVEMon.Common.IgbService\n{\n    public class IgbClientDataReadEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"IgbClientDataReadEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"buffer\">The buffer.</param>\n        /// <param name=\"count\">The count.</param>\n        public IgbClientDataReadEventArgs(IEnumerable<byte> buffer, int count)\n        {\n            Buffer = buffer;\n            Count = count;\n        }\n\n        /// <summary>\n        /// Gets or sets the buffer.\n        /// </summary>\n        /// <value>The buffer.</value>\n        public IEnumerable<byte> Buffer { get; }\n\n        /// <summary>\n        /// Gets or sets the count.\n        /// </summary>\n        /// <value>The count.</value>\n        public int Count { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/IgbService/IgbServer.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Http;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Web;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.IgbService\n{\n    /// <summary>\n    /// Incomplete HTTP 1.0 web server, to serve out simple pages to\n    /// the in-game browser to allow in-game interaction with EVEMon.\n    /// </summary>\n    public class IgbServer\n    {\n        private bool m_isPublic;\n        private bool m_running;\n        private IgbTcpListener m_listener;\n        private readonly Dictionary<IgbTcpClient, byte[]> m_clients = new Dictionary<IgbTcpClient, byte[]>();\n\n\n        #region Construction, Start, Stop and Reset\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"isPublic\">Is publicly available</param>\n        /// <param name=\"port\">Initial TCP/IP port</param>\n        public IgbServer(bool isPublic, int port)\n        {\n            IgbServerPort = port;\n            m_isPublic = isPublic;\n            CreateListener();\n        }\n\n        /// <summary>\n        /// Gets the active IGB Server port.\n        /// </summary>\n        public int IgbServerPort { get; private set; }\n\n        /// <summary>\n        /// Re-initilize the IGB web server service.\n        /// </summary>\n        /// <param name=\"isPublic\">Is publicly available</param>\n        /// <param name=\"port\">New TCP/IP port</param>\n        public void Reset(bool isPublic, int port)\n        {\n            m_isPublic = isPublic;\n            IgbServerPort = port;\n            Stop();\n            m_listener = null;\n\n            CreateListener();\n        }\n\n        /// <summary>\n        /// Creates the listener bound to an address and port, wires up the events.\n        /// </summary>\n        private void CreateListener()\n        {\n            m_listener = new IgbTcpListener(new IPEndPoint(AddressToBind(), IgbServerPort));\n            m_listener.ClientConnected += OnClientConnected;\n        }\n\n        /// <summary>\n        /// Cacluates the address to bind to.\n        /// </summary>\n        /// <returns>IPAddress.Any if public, IPAddress.Loopback if not public</returns>\n        private IPAddress AddressToBind() => m_isPublic ? IPAddress.Any : IPAddress.Loopback;\n\n        /// <summary>\n        /// Starts the IGB Service if not running.\n        /// </summary>\n        public void Start()\n        {\n            if (m_running)\n                return;\n\n            m_running = true;\n            m_listener.Start();\n        }\n\n        /// <summary>\n        /// Stops the IGB Service if running.\n        /// </summary>\n        public void Stop()\n        {\n            if (!m_running)\n                return;\n\n            m_running = false;\n            m_listener.Stop();\n        }\n\n        #endregion\n\n\n        #region Client Event Handlers\n\n        /// <summary>\n        /// Event triggered on client connection.\n        /// </summary>\n        /// <param name=\"sender\">Sending object</param>\n        /// <param name=\"e\">Argments</param>\n        private void OnClientConnected(object sender, ClientConnectedEventArgs e)\n        {\n            IgbTcpClient cli = new IgbTcpClient(e.TcpClient);\n            cli.DataRead += OnDataRead;\n            cli.Closed += OnClosed;\n            lock (m_clients)\n            {\n                m_clients.Add(cli, new byte[0]);\n            }\n            cli.Start();\n        }\n\n        /// <summary>\n        /// Event triggered on data read.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnDataRead(object sender, IgbClientDataReadEventArgs e)\n        {\n            IgbTcpClient igbSender = (IgbTcpClient)sender;\n            byte[] newBuf;\n            lock (m_clients)\n            {\n                byte[] existingBuf = m_clients[igbSender];\n                newBuf = new byte[existingBuf.Length + e.Count];\n\n                Array.Copy(existingBuf, newBuf, existingBuf.Length);\n                Array.Copy(e.Buffer.ToArray(), 0, newBuf, existingBuf.Length, e.Count);\n\n                m_clients[igbSender] = newBuf;\n            }\n\n            TryProcessBuffer(igbSender, newBuf, Math.Min(e.Count + 1, newBuf.Length));\n        }\n\n        /// <summary>\n        /// Event triggered on connection close read.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnClosed(object sender, EventArgs e)\n        {\n            lock (m_clients)\n            {\n                m_clients.Remove((IgbTcpClient)sender);\n            }\n        }\n\n        /// <summary>\n        /// Process the buffer and respond to the client.\n        /// </summary>\n        /// <param name=\"client\">client to respond to</param>\n        /// <param name=\"buffer\">buffer to use</param>\n        /// <param name=\"length\">length of tail</param>\n        private void TryProcessBuffer(IgbTcpClient client, byte[] buffer, int length)\n        {\n            // make sure the request is well formed\n            if (!TailHasTwoNewLine(buffer, length))\n                return;\n\n            Dictionary<string, string> headers = new Dictionary<string, string>();\n\n            string requestType = String.Empty;\n            string requestPath = ExtractHeaders(buffer, headers, ref requestType);\n\n            SendOutputToClient(client, headers, requestType, requestPath);\n            client.Close();\n        }\n\n        /// <summary>\n        /// Process request and send output to client.\n        /// </summary>\n        /// <param name=\"client\">client to send output to</param>\n        /// <param name=\"headers\">dictionary of headers</param>\n        /// <param name=\"request\">the requested method</param>\n        /// <param name=\"requestPath\">url to respond to</param>\n        private void SendOutputToClient(IgbTcpClient client, IDictionary<string, string> headers, string request,\n            string requestPath)\n        {\n            MemoryStream stream = Util.GetMemoryStream();\n            using (StreamWriter sw = new StreamWriter(stream))\n            {\n                ProcessRequest(request, requestPath, headers, sw);\n\n                sw.Flush();\n                stream.Seek(0, SeekOrigin.Begin);\n\n                // We should support only the \"GET\" method\n                string responseStatusCode = request.Equals(HttpMethod.Get.Method)\n                    ? $\"{(int)HttpStatusCode.OK} {HttpStatusCode.OK.ToString().ConvertUpperCamelCaseToString()}\"\n                    : $\"{(int)HttpStatusCode.NotImplemented} {HttpStatusCode.NotImplemented.ToString().ConvertUpperCamelCaseToString()}\";\n                client.Write($\"HTTP/1.1 {responseStatusCode}\\n\");\n                client.Write(\"Server: EVEMon/1.0\\n\");\n                client.Write(\"Content-Type: text/html; charset=utf-8\\n\");\n                if (headers.ContainsKey(\"eve_trusted\") &&\n                    headers[\"eve_trusted\"].ToLower(CultureConstants.InvariantCulture) == \"no\")\n                {\n                    client.Write($\"eve.trustme: {BuildHostAndPort(headers[\"host\"])}/::EVEMon needs your character information.\\n\");\n                }\n\n                client.Write(\"Connection: close\\n\");\n                client.Write($\"Content-Length: {stream.Length}\\n\\n\");\n\n                StreamReader sr = new StreamReader(stream);\n                client.Write(sr.ReadToEnd());\n            }\n        }\n\n        /// <summary>\n        /// Extract the headers from the buffer and ad them to a dictionary.\n        /// </summary>\n        /// <param name=\"buffer\">the buffer to extract headers from</param>\n        /// <param name=\"headers\">dictionary to add headers to</param>\n        /// <param name=\"request\">the requested method</param>\n        /// <returns></returns>\n        private static string ExtractHeaders(byte[] buffer, IDictionary<string, string> headers, ref string request)\n        {\n            string headerStr = Encoding.UTF8.GetString(buffer);\n\n            if (headerStr.IndexOf('\\r') != -1)\n                headerStr = headerStr.Replace(\"\\r\", String.Empty);\n\n            bool first = true;\n            string requestPath = String.Empty;\n            foreach (string tline in headerStr.Split('\\n'))\n            {\n                if (first)\n                {\n                    // We should support only the \"GET\" method\n                    Regex getMatcher = new Regex(@\"^(GET) (.+) HTTP/(.*)$\", RegexOptions.Compiled);\n                    Match m = getMatcher.Match(tline);\n\n                    request = m.Groups[1].Value;\n\n                    if (m.Success)\n                        requestPath = m.Groups[2].Value;\n\n                    first = false;\n                }\n                else\n                {\n                    Regex headerMatcher = new Regex(\"^(.*?): (.*)$\", RegexOptions.Compiled);\n                    Match m = headerMatcher.Match(tline);\n                    if (m.Success)\n                        headers[m.Groups[1].Value.ToLower(CultureConstants.InvariantCulture)] = m.Groups[2].Value;\n                }\n            }\n            return requestPath;\n        }\n\n        /// <summary>\n        /// Checks to see if the header contains two New Lines as per HTTP specification.\n        /// </summary>\n        /// <param name=\"buffer\">Buffer</param>\n        /// <param name=\"length\">The length.</param>\n        /// <returns></returns>\n        private static bool TailHasTwoNewLine(IList<byte> buffer, int length)\n        {\n            bool gotOne = false;\n            for (int i = 0; i < length; i++)\n            {\n                if (buffer[buffer.Count - i - 1] == (byte)'\\n')\n                {\n                    if (gotOne)\n                        return true;\n\n                    gotOne = true;\n                }\n                else if (buffer[buffer.Count - i - 1] != (byte)'\\r')\n                    gotOne = false;\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Create the host:port string for the trustme request.\n        /// </summary>\n        /// <param name=\"host\">The host header from the IGB</param>\n        /// <returns>hostname:port number</returns>\n        private string BuildHostAndPort(string host)\n        {\n            // Currently IGB returns host:port as the host header, it shouldn't\n            // really do this\n            string hostPort = host;\n\n            // Add the 'http' scheme to the address if it's missing\n            if (!host.StartsWith(\"http://\", StringComparison.OrdinalIgnoreCase))\n                hostPort = $\"http://{hostPort}\";\n\n            // If the host string already contains a port then do nothing\n            // (IGB shouldn't really do this but it is!)\n            if (hostPort.Contains(\":\"))\n                return hostPort;\n\n            // Now cater for when/if CCP fix the IGB to not send port as part of the host header\n            if (IgbServerPort != 80)\n                // non-standard port - let's add it\n                hostPort = $\"{hostPort}:{IgbServerPort}\";\n\n            return hostPort;\n        }\n\n        /// <summary>\n        /// Process the request.\n        /// </summary>\n        /// <param name=\"request\">the requested method</param>\n        /// <param name=\"requestPath\">URL of the request</param>\n        /// <param name=\"headers\">dictionary of headers</param>\n        /// <param name=\"sw\">stream writer to output to</param>\n        private void ProcessRequest(string request, string requestPath, IDictionary<string, string> headers, TextWriter sw)\n        {\n            WriteDocumentHeader(sw);\n\n            if (!request.Equals(HttpMethod.Get.Method))\n            {\n                sw.WriteLine(\"<h1>Error loading requested URL</h1>\" +\n                             \"The {0} method is not implemented.<br/><br/><i>Error Code: -501</i>\",\n                    request);\n                return;\n            }\n\n            string trusted;\n            if (!headers.TryGetValue(\"eve_trusted\", out trusted))\n            {\n                sw.WriteLine(\"Please visit this site using the in-game browser.\");\n                return;\n            }\n\n            if (trusted.ToLower(CultureConstants.InvariantCulture) != \"yes\")\n            {\n                sw.WriteLine(\"The in-game browser do not trust EVEMon.<br/>\");\n                sw.WriteLine(\"<a href=\\\"\\\" onclick=\\\"CCPEVE.requestTrust('{0}')\\\">Trust EVEMon</a>.\",\n                    BuildHostAndPort(headers[\"host\"]));\n                return;\n            }\n\n            string characterName;\n            if (!headers.TryGetValue(\"eve_charname\", out characterName))\n            {\n                // No character in header\n                sw.WriteLine(\"Not a valid CCP character.\");\n                return;\n            }\n\n            // Character not listed in EVEMon \n            if (EveMonClient.Characters.All(x => x.Name != characterName))\n            {\n                sw.WriteLine(\"Hello {0}, this character is not recognized by EVEMon!\", characterName);\n                return;\n            }\n\n            Regex contextRegex = new Regex(@\"(?'context'\\/characters(\\/(?'charName'[^\\/]*))?)?(?'request'.*)\",\n                RegexOptions.CultureInvariant | RegexOptions.Compiled);\n            Match match = contextRegex.Match(requestPath);\n            if (match.Success)\n            {\n                Group contextGroup = match.Groups[\"context\"];\n                if (contextGroup.Success)\n                    characterName = HttpUtility.UrlDecode(match.Groups[\"charName\"].Value);\n\n                requestPath = match.Groups[\"request\"].Value;\n            }\n            Character character = !String.IsNullOrEmpty(characterName)\n                ? EveMonClient.MonitoredCharacters.FirstOrDefault(x => x.Name == characterName)\n                : null;\n            if (character == null)\n            {\n                GenerateCharacterList(characterName, sw, EveMonClient.MonitoredCharacters);\n                return;\n            }\n\n            string context = $\"/characters/{HttpUtility.UrlEncode(character.Name)}\";\n\n            if (requestPath.StartsWith(\"/plan/\", StringComparison.OrdinalIgnoreCase)\n                || requestPath.StartsWith(\"/shopping/\", StringComparison.OrdinalIgnoreCase)\n                || requestPath.StartsWith(\"/owned/\", StringComparison.OrdinalIgnoreCase))\n                GeneratePlanOrShoppingOutput(context, requestPath, sw, character);\n            else if (requestPath.StartsWith(\"/skills/bytime\", StringComparison.OrdinalIgnoreCase))\n                GenerateSkillsByTimeOutput(context, sw, character);\n            else\n                GeneratePlanListOutput(context, sw, character);\n\n            WriteDocumentFooter(sw);\n        }\n\n        /// <summary>\n        /// Outputs a list of characters to a stream writer.\n        /// </summary>\n        /// <param name=\"currentCharacterName\">Name of the current character.</param>\n        /// <param name=\"sw\">stream writer to output to</param>\n        /// <param name=\"characters\">list of characters to output</param>\n        private static void GenerateCharacterList(string currentCharacterName, TextWriter sw, IEnumerable<Character> characters)\n        {\n            sw.WriteLine(\"<h1>Welcome!</h1>\");\n\n            sw.WriteLine(\"<h2>Monitored characters:</h2>\");\n            foreach (Character character in characters)\n            {\n                sw.WriteLine(\"<a href=\\\"/characters/{0}\\\">{1}</a>\",\n                    HttpUtility.UrlEncode(character.Name),\n                    HttpUtility.HtmlEncode(character.Name));\n\n                if (!String.IsNullOrEmpty(currentCharacterName) && (currentCharacterName == character.Name))\n                    sw.WriteLine(\" (current)\");\n\n                sw.WriteLine(\"<br/>\");\n            }\n        }\n\n        /// <summary>\n        /// Outputs the document header.\n        /// </summary>\n        /// <param name=\"sw\"></param>\n        private static void WriteDocumentHeader(TextWriter sw)\n        {\n            sw.WriteLine(\"<html>\");\n            sw.WriteLine(\"  <head>\");\n            sw.WriteLine(\"    <style>\");\n            sw.WriteLine(\"      body { background-color: black; color: white; font-family: Arial; font-size: small; }\");\n            sw.WriteLine(\"      a:link { color: #5555FF; }\");\n            sw.WriteLine(\"      a:visited { color: #FF9900; }\");\n            sw.WriteLine(\"    </style>\");\n            sw.WriteLine(\"    <title>EVEMon</title>\");\n            sw.WriteLine(\"  </head>\");\n            sw.WriteLine(\"  <body>\");\n        }\n\n        /// <summary>\n        /// Outputs the documents footer.\n        /// </summary>\n        /// <param name=\"sw\"></param>\n        private static void WriteDocumentFooter(TextWriter sw)\n        {\n            sw.WriteLine(\"  </body>\");\n            sw.WriteLine(\"</html>\");\n        }\n\n        /// <summary>\n        /// Outputs a list of plans for a given character to a stream writer.\n        /// </summary>\n        /// <param name=\"context\">context of the request</param>\n        /// <param name=\"sw\">stream writer to output to</param>\n        /// <param name=\"character\">character to use</param>\n        private static void GeneratePlanListOutput(string context, TextWriter sw, Character character)\n        {\n            sw.WriteLine(\"<h1>Hello, {0}</h1>\", HttpUtility.HtmlEncode(character.Name));\n            sw.WriteLine(\"<a href=\\\"/characters\\\">List all characters</a><hr/>\");\n\n            sw.WriteLine(\"<h2>Your plans:</h2>\");\n            foreach (Plan plan in character.Plans)\n            {\n                sw.WriteLine(\"<a href=\\\"{0}/plan/{1}\\\">{2}</a> (<a href=\\\"{0}/shopping/{1}\\\">shopping list</a>)<br/>\",\n                    context,\n                    HttpUtility.UrlEncode(plan.Name),\n                    HttpUtility.HtmlEncode(plan.Name));\n            }\n\n            sw.WriteLine(\"<h2>Your skills:</h2>\");\n            sw.WriteLine(\"<a href=\\\"{0}/skills/bytime\\\">By training time</a><br/>\", context);\n\n            sw.WriteLine(\"<hr/><a href=\\\"/characters\\\">List all characters</a>\");\n        }\n\n        /// <summary>\n        /// Outputs a list of skills for a given character ordered by time to a stream writer.\n        /// </summary>\n        /// <param name=\"context\">context of the request</param>\n        /// <param name=\"sw\">stream writer to output to</param>\n        /// <param name=\"character\">character to use</param>\n        private static void GenerateSkillsByTimeOutput(string context, TextWriter sw, Character character)\n        {\n            sw.WriteLine(\"<h1>Hello, {0}</h1>\", HttpUtility.HtmlEncode(character.Name));\n            sw.WriteLine(\"<a href=\\\"/characters\\\">List all characters</a><hr/>\");\n            sw.WriteLine(\"<a href=\\\"{0}\\\">Character overview</a>\", context);\n\n            sw.WriteLine(\"<h2>Your skills by training time:</h2>\");\n\n            IEnumerable<Skill> allskills = character.Skills.Where(x => x.IsPublic && x.Level < 5 && x.Level > 0);\n            allskills = allskills.OrderBy(x => x.GetLeftTrainingTimeToNextLevel);\n\n            sw.WriteLine(\"<table>\");\n            sw.Write(\"<tr><td colspan=\\\"2\\\" width=\\\"265\\\"><b>Skill</b></td>\" +\n                     \"<td width=\\\"100\\\"><b>Next Level</b></td><td><b>Training Time</b></td></tr>\");\n\n            int index = 0;\n            foreach (Skill s in allskills)\n            {\n                index++;\n                sw.Write(\"<tr>\");\n\n                sw.Write(\"<td width=\\\"15\\\">\");\n                sw.Write(\"<b>{0}.</b>\", index);\n                sw.Write(\"</td>\");\n\n                sw.Write(\"<td width=\\\"300\\\">\");\n                sw.Write(\"<b><a href=\\\"\\\" onclick=\\\"CCPEVE.showInfo({0})\\\">{1}</a></b>\", s.ID, s.Name);\n                sw.Write(\"</td>\");\n\n                sw.Write(\"<td width=\\\"100\\\">\");\n                sw.Write(\"<b>{0} -&gt; {1}</b>\", s.RomanLevel, Skill.GetRomanFromInt(s.Level + 1));\n                sw.Write(\"</td>\");\n\n                sw.Write(\"<td>\");\n                sw.Write(s.GetLeftTrainingTimeToNextLevel.ToDescriptiveText(\n                    DescriptiveTextOptions.FullText |\n                    DescriptiveTextOptions.IncludeCommas |\n                    DescriptiveTextOptions.SpaceText));\n                sw.Write(\"</td>\");\n                sw.Write(\"</tr>\");\n            }\n            sw.WriteLine(\"</table>\");\n\n            sw.WriteLine(\"<br/><a href=\\\"{0}\\\">Character overview</a>\", context);\n            sw.WriteLine(\"<hr/><a href=\\\"/characters\\\">List all characters</a>\");\n        }\n\n        /// <summary>\n        /// Outputs a plan or shopping list for a given character to a stream writer.\n        /// </summary>\n        /// <param name=\"context\">context of the request</param>\n        /// <param name=\"requestPath\">url of the request</param>\n        /// <param name=\"sw\">stream writer to output to</param>\n        /// <param name=\"character\">character to use</param>\n        private static void GeneratePlanOrShoppingOutput(string context, string requestPath, TextWriter sw, Character character)\n        {\n            sw.WriteLine(\"<h1>Hello, {0}</h1>\", HttpUtility.HtmlEncode(character.Name));\n            sw.WriteLine(\"<a href=\\\"/characters\\\">List all characters</a><hr/>\");\n            sw.WriteLine(\"<a href=\\\"{0}\\\">Character overview</a>\", context);\n\n            Regex regex =\n                new Regex(\n                    @\"\\/(owned\\/(?'skillId'[^\\/]+)\\/(?'markOwned'[^\\/]+)\\/)?(?'requestType'shopping|plan)\\/(?'planName'[^\\/]+)(.*)\",\n                    RegexOptions.CultureInvariant | RegexOptions.Compiled);\n            Match match = regex.Match(requestPath);\n\n            if (match.Success)\n            {\n                string requestType = match.Groups[\"requestType\"].Value;\n                bool shopping = requestType.Equals(\"shopping\", StringComparison.OrdinalIgnoreCase);\n                string planName = HttpUtility.UrlDecode(match.Groups[\"planName\"].Value);\n\n                int skillId;\n                bool setAsOwned;\n                if (match.Groups[\"skillId\"].Success &&\n                    match.Groups[\"markOwned\"].Success &&\n                    Int32.TryParse(match.Groups[\"skillId\"].Value, out skillId) &&\n                    Boolean.TryParse(match.Groups[\"markOwned\"].Value, out setAsOwned))\n                {\n                    Skill skill = character.Skills.FirstOrDefault(x => x.ID == skillId);\n                    if (skill != null)\n                    {\n                        sw.WriteLine(\"<h2>Skillbook shopping result</h2>\");\n                        skill.IsOwned = setAsOwned;\n                        sw.WriteLine(\"<a href=\\\"\\\" onclick=\\\"CCPEVE.showInfo({0})\\\">{1}</a> is now marked as {2} owned.\", skill.ID,\n                            HttpUtility.HtmlEncode(skill.Name), skill.IsOwned ? String.Empty : \"not\");\n                    }\n                    else\n                    {\n                        // Display an error message\n                        sw.WriteLine(\"<h2>Error Message</h2>\");\n                        sw.WriteLine(\"Skill with id '{0}' could not be found\", skillId);\n                    }\n                    sw.WriteLine(\"<hr/>\");\n                }\n\n                Plan plan = character.Plans[planName];\n                if (plan == null)\n                {\n                    // Display an error message\n                    sw.WriteLine(\"<h2>Error Message</h2>\");\n                    sw.WriteLine(\"A plan named \\\"{0}\\\" does not exist.\", HttpUtility.HtmlEncode(planName));\n                }\n                else\n                {\n                    sw.WriteLine(\"<h2>Plan: {0}</h2>\", HttpUtility.HtmlEncode(plan.Name));\n\n                    PlanExportSettings x = new PlanExportSettings\n                    {\n                        // Only if not shopping\n                        EntryTrainingTimes = !shopping,\n                        // Only if not shopping\n                        EntryStartDate = !shopping,\n                        // Only if not shopping\n                        EntryFinishDate = !shopping,\n                        // Only if not shopping\n                        FooterTotalTime = !shopping,\n                        // Only if not shopping\n                        FooterDate = !shopping,\n                        FooterCount = true,\n                        ShoppingList = shopping,\n                        EntryCost = true,\n                        FooterCost = true,\n                        Markup = MarkupType.Html\n                    };\n\n                    sw.Write(PlanIOHelper.ExportAsText(plan, x, ExportActions(context, requestType, plan)));\n                }\n            }\n            else\n            {\n                sw.WriteLine(\"<h2>Error Message</h2>\");\n                sw.WriteLine(\"Invalid request\");\n            }\n\n            sw.WriteLine(\"<br/><br/><a href=\\\"{0}\\\">Character overview</a>\", context);\n            sw.WriteLine(\"<hr/><a href=\\\"/characters\\\">List all characters</a>\");\n        }\n\n        /// <summary>\n        /// Exports the actions.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"requestType\">Type of the request.</param>\n        /// <param name=\"plan\">The plan.</param>\n        /// <returns></returns>\n        private static Action<StringBuilder, PlanEntry, PlanExportSettings> ExportActions(string context, string requestType,\n            Plan plan)\n            => (builder, entry, settings) =>\n            {\n                if (settings.Markup != MarkupType.Html)\n                    return;\n\n                // Skill is known\n                if (entry.CharacterSkill.IsKnown || entry.Level != 1)\n                    return;\n\n                builder.Append($\" <a href='{context}/owned/{entry.Skill.ID}/\" +\n                               $\"{!entry.CharacterSkill.IsOwned}/{requestType}/\" +\n                               $\"{HttpUtility.HtmlEncode(plan.Name)}'>\" +\n                               $\"{HttpUtility.HtmlEncode(!entry.CharacterSkill.IsOwned ? \"Mark as owned\" : \"Mark as not owned\")}</a>\");\n            };\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/IgbService/IgbTcpClient.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Net.Sockets;\nusing System.Text;\nusing System.Threading;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Common.IgbService\n{\n    /// <summary>\n    /// Manages a individual client connection\n    /// </summary>\n    public class IgbTcpClient\n    {\n        public event EventHandler<EventArgs> Closed;\n        public event EventHandler<IgbClientDataReadEventArgs> DataRead;\n\n        private readonly Object m_syncLock = new Object();\n        private readonly TcpClient m_client;\n\n        private const int BufferSize = 4096;\n\n        private byte[] m_buffer;\n        private bool m_running;\n        private NetworkStream m_stream;\n\n\n        #region Constructor and Close\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"client\">Client information</param>\n        public IgbTcpClient(TcpClient client)\n        {\n            m_client = client;\n        }\n\n        /// <summary>\n        /// Closes this instance.\n        /// </summary>\n        public void Close()\n        {\n            if (!m_running)\n                return;\n\n            m_running = false;\n            try\n            {\n                m_client.Close();\n            }\n            catch (SocketException e)\n            {\n                ExceptionHandler.LogException(e, false);\n            }\n            OnClosed();\n        }\n\n        /// <summary>\n        /// Called when [closed].\n        /// </summary>\n        private void OnClosed()\n        {\n            Closed?.ThreadSafeInvoke(this, new EventArgs());\n        }\n\n        #endregion\n\n\n        #region Reading\n\n        /// <summary>\n        /// Start reading from the client.\n        /// </summary>\n        public void Start()\n        {\n            lock (m_syncLock)\n            {\n                m_running = true;\n                m_stream = m_client.GetStream();\n                m_buffer = new byte[BufferSize];\n                BeginRead(false);\n            }\n        }\n\n        /// <summary>\n        /// Begin reading from the client.\n        /// </summary>\n        /// <param name=\"acquireLock\">lock the object</param>\n        private void BeginRead(bool acquireLock)\n        {\n            if (acquireLock)\n                Monitor.Enter(m_syncLock);\n\n            try\n            {\n                IAsyncResult ar;\n                do\n                {\n                    ar = null;\n                    if (m_running)\n                        ar = m_stream.BeginRead(m_buffer, 0, m_buffer.Length, EndRead, null);\n                } while (ar != null && ar.CompletedSynchronously);\n            }\n            finally\n            {\n                if (acquireLock)\n                    Monitor.Exit(m_syncLock);\n            }\n        }\n\n        /// <summary>\n        /// Async called when reading has finished.\n        /// </summary>\n        /// <param name=\"ar\">result</param>\n        private void EndRead(IAsyncResult ar)\n        {\n            try\n            {\n                int bytesRead = m_stream.EndRead(ar);\n                if (bytesRead <= 0)\n                    Close();\n                else\n                {\n                    OnDataRead(m_buffer, bytesRead);\n                    if (!ar.CompletedSynchronously)\n                        BeginRead(true);\n                }\n            }\n            catch (IOException ex)\n            {\n                Close();\n                ExceptionHandler.LogException(ex, true);\n            }\n            catch (Exception ex)\n            {\n                Close();\n                ExceptionHandler.LogRethrowException(ex);\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Event triggered on data read.\n        /// </summary>\n        /// <param name=\"buffer\">buffer</param>\n        /// <param name=\"count\">bytes read</param>\n        private void OnDataRead(IEnumerable<byte> buffer, int count)\n        {\n            DataRead?.ThreadSafeInvoke(this, new IgbClientDataReadEventArgs(buffer, count));\n        }\n\n        #endregion\n\n\n        #region Writing\n\n        /// <summary>\n        /// Writes the specified string.\n        /// </summary>\n        /// <param name=\"str\">The string.</param>\n        public void Write(string str)\n        {\n            byte[] outbuf = Encoding.UTF8.GetBytes(str);\n            m_stream.Write(outbuf, 0, outbuf.Length);\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/IgbService/IgbTcpListener.cs",
    "content": "﻿using System;\nusing System.Net;\nusing System.Net.Sockets;\nusing System.Threading;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Common.IgbService\n{\n    /// <summary>\n    /// Listens for IGB client connections\n    /// </summary>\n    public class IgbTcpListener\n    {\n        public event EventHandler<ClientConnectedEventArgs> ClientConnected;\n\n        private readonly Object m_syncLock = new Object();\n        private readonly IPEndPoint m_listenEndpoint;\n\n        private bool m_running;\n        private TcpListener m_listener;\n\n\n        #region Constructor, Start and Stop\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"ep\"></param>\n        public IgbTcpListener(IPEndPoint ep)\n        {\n            m_listenEndpoint = ep;\n        }\n\n        /// <summary>\n        /// Start listening.\n        /// </summary>\n        public void Start()\n        {\n            lock (m_syncLock)\n            {\n                if (m_running)\n                    return;\n\n                m_running = true;\n                m_listener = new TcpListener(m_listenEndpoint);\n                try\n                {\n                    m_listener.Start();\n                    BeginAcceptTcpClient(false);\n                }\n                catch (SocketException ex)\n                {\n                    // Null out the listener then notify the trace file and the user\n                    m_listener = null;\n                    EveMonClient.Trace($\"{ex.SocketErrorCode} - {ex.Message} - {ex.ErrorCode}\", printMethod: false);\n                    EveMonClient.Notifications.NotifyIgbServiceException(m_listenEndpoint.Port);\n                    return;\n                }\n\n                EveMonClient.Notifications.InvalidateIgbServiceException();\n            }\n        }\n\n        /// <summary>\n        /// Stop listening.\n        /// </summary>\n        /// <remarks>\n        /// My wife thinks I use this function too often.\n        /// </remarks>\n        public void Stop()\n        {\n            lock (m_syncLock)\n            {\n                if (!m_running)\n                    return;\n\n                m_running = false;\n                if (m_listener == null)\n                    return;\n\n                m_listener.Stop();\n                m_listener = null;\n            }\n        }\n\n        #endregion\n\n\n        #region Client Connected\n\n        /// <summary>\n        /// Begin accepting a client connection\n        /// </summary>\n        /// <param name=\"acquireLock\">require lock on object</param>\n        private void BeginAcceptTcpClient(bool acquireLock)\n        {\n            if (acquireLock)\n                Monitor.Enter(m_syncLock);\n\n            try\n            {\n                IAsyncResult ar;\n                do\n                {\n                    ar = null;\n                    if (m_running)\n                        ar = m_listener.BeginAcceptTcpClient(EndAcceptTcpClient, null);\n                } while (ar != null && ar.CompletedSynchronously);\n            }\n            finally\n            {\n                if (acquireLock)\n                    Monitor.Exit(m_syncLock);\n            }\n        }\n\n        /// <summary>\n        /// TCP client connection acceptance has completed\n        /// </summary>\n        /// <param name=\"ar\">results</param>\n        private void EndAcceptTcpClient(IAsyncResult ar)\n        {\n            lock (m_syncLock)\n            {\n                // Has the client been stopped ?\n                if (m_listener == null)\n                    return;\n\n                try\n                {\n                    bool inLock = ar.CompletedSynchronously;\n\n                    TcpClient newClient = m_listener.EndAcceptTcpClient(ar);\n                    OnClientConnected(newClient, !inLock);\n                    if (!ar.CompletedSynchronously)\n                        BeginAcceptTcpClient(true);\n                }\n                catch (Exception ex)\n                {\n                    ExceptionHandler.LogRethrowException(ex);\n                    throw;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Triggered on client connection\n        /// </summary>\n        /// <param name=\"client\">The client.</param>\n        /// <param name=\"acquireLock\">Require lock on object</param>\n        private void OnClientConnected(TcpClient client, bool acquireLock)\n        {\n            if (acquireLock)\n                Monitor.Enter(m_syncLock);\n\n            try\n            {\n                if (m_running && ClientConnected != null)\n                    ClientConnected(this, new ClientConnectedEventArgs(client));\n                else\n                {\n                    try\n                    {\n                        client.Close();\n                    }\n                    catch (SocketException e)\n                    {\n                        ExceptionHandler.LogException(e, false);\n                    }\n                }\n            }\n            finally\n            {\n                if (acquireLock)\n                    Monitor.Exit(m_syncLock);\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/InstanceManager.cs",
    "content": "using System;\nusing System.Threading;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Common\n{\n    public sealed class InstanceManager\n    {\n        public event EventHandler<EventArgs> Signaled;\n\n        private static InstanceManager s_instanceManager;\n\n        private readonly Semaphore m_semaphore;\n        private readonly bool m_createdNew;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"InstanceManager\"/> class.\n        /// </summary>\n        private InstanceManager()\n        {\n            using (Semaphore semaphore = new Semaphore(0, 1, \"EVEMonInstance\", out m_createdNew))\n            {\n                ThreadPool.RegisterWaitForSingleObject(semaphore, SemaphoreReleased, null, -1, false);\n                m_semaphore = semaphore;\n            }\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether a new instance has been created.\n        /// </summary>\n        /// <value><c>true</c> if  a new instance has been created; otherwise, <c>false</c>.</value>\n        public bool CreatedNew => m_createdNew;\n\n        /// <summary>\n        /// Gets the instance.\n        /// </summary>\n        /// <returns></returns>\n        public static InstanceManager Instance => s_instanceManager ?? (s_instanceManager = new InstanceManager());\n\n        /// <summary>\n        /// Fires the event.\n        /// </summary>\n        /// <param name=\"o\">The o.</param>\n        /// <param name=\"b\">if set to <c>true</c> [b].</param>\n        private void SemaphoreReleased(object o, bool b)\n        {\n            Signaled?.ThreadSafeInvoke(this, new EventArgs());\n        }\n\n        /// <summary>\n        /// Releases the semaphore.\n        /// </summary>\n        public void Signal()\n        {\n            try\n            {\n                m_semaphore.Release();\n            }\n            catch (SemaphoreFullException e)\n            {\n                ExceptionHandler.LogException(e, false);\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Interfaces/ICharacterAttribute.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.Interfaces\n{\n    public interface ICharacterAttribute\n    {\n        long Base { get; }\n        long ImplantBonus { get; }\n        long EffectiveValue { get; }\n\n        /// <summary>\n        /// Gets a string representation with the provided format. The following parameters are accepted :\n        /// <list type=\"bullet\">\n        /// <item>%n for name (lower case)</item>\n        /// <item>%N for name (CamelCase)</item>\n        /// <item>%B for attribute base value</item>\n        /// <item>%b for base bonus</item>\n        /// <item>%i for implant bonus</item>\n        /// <item>%r for remapping points</item>\n        /// <item>%e for effective value</item>\n        /// </list>\n        /// </summary>\n        /// <returns>The formatted string.</returns>\n        string ToString(string format);\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Interfaces/IEveMessage.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace EVEMon.Common.Interfaces\n{\n    public interface IEveMessage\n    {\n        string Title { get; }\n\n        string SenderName { get; }\n\n        DateTime SentDate { get; }\n\n        IEnumerable<string> Recipient { get; }\n\n        string Text { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Interfaces/IListView.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Interfaces\n{\n    public interface IListView\n    {\n        /// <summary>\n        /// Gets or sets the text filter.\n        /// </summary>\n        /// <value>\n        /// The text filter.\n        /// </value>\n        string TextFilter { get; set; }\n\n        /// <summary> \n        /// Gets or sets the grouping of a listview. \n        /// </summary> \n        Enum Grouping { get; set; }\n\n        /// <summary>\n        /// Gets or sets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        IEnumerable<IColumnSettings> Columns { get; set; }\n\n        /// <summary>\n        /// Autoresizes the columns.\n        /// </summary>\n        void AutoResizeColumns();\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Interfaces/ILoadoutInfo.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Common.Interfaces\n{\n    public interface ILoadoutInfo\n    {\n        /// <summary>\n        /// Gets or sets the ship of the loadout.\n        /// </summary>\n        /// <value>\n        /// The ship.\n        /// </value>\n        Item Ship { get; set; }\n\n        /// <summary>\n        /// Gets or sets the loadouts.\n        /// </summary>\n        /// <value>\n        /// The loadouts.\n        /// </value>\n        Collection<Loadout> Loadouts { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Interfaces/IPlanOperation.cs",
    "content": "﻿using System.Collections.Generic;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Interfaces\n{\n    public interface IPlanOperation\n    {\n        /// <summary>\n        /// Gets the plan affected by this operation.\n        /// </summary>\n        Plan Plan { get; }\n\n        /// <summary>\n        /// Gets the type of operation to perform\n        /// </summary>\n        PlanOperations Type { get; }\n\n        /// <summary>\n        /// Gets the highest possible priority (lowest possible number) for new entries when an addition is performed. \n        /// This limit is due to the prerequisites, since they cannot have a lower priority than the entries to add.\n        /// </summary>\n        int HighestPriorityForAddition { get; }\n\n        /// <summary>\n        /// Gets all the entries to add when an addition is performed, including the prerequisites.\n        /// </summary>\n        IEnumerable<PlanEntry> AllEntriesToAdd { get; }\n\n        /// <summary>\n        /// Gets the skill levels the user originally wanted to add.\n        /// </summary>\n        IEnumerable<ISkillLevel> SkillsToAdd { get; }\n\n        /// <summary>\n        /// Gets all the entries to remove when a suppression is performed, including the dependencies.\n        /// </summary>\n        IEnumerable<PlanEntry> AllEntriesToRemove { get; }\n\n        /// <summary>\n        /// Gets the entries that can be optionally removed when a suppression is performed.\n        /// </summary>\n        IEnumerable<PlanEntry> RemovablePrerequisites { get; }\n\n        /// <summary>\n        /// Gets the skill levels the user originally wanted to remove.\n        /// </summary>\n        IEnumerable<ISkillLevel> SkillsToRemove { get; }\n\n        /// <summary>\n        /// Performs the operation in the simplest possible way, using default priority for insertions and not removing useless prerequisites for \n        /// suppressions (but still removing dependent entries !).\n        /// </summary>\n        void Perform();\n\n        /// <summary>\n        /// Adds the entries.\n        /// </summary>\n        /// <param name=\"priority\">The priority of the new entries.</param>\n        void PerformAddition(int priority);\n\n        /// <summary>\n        /// Suppress the entries.\n        /// </summary>\n        /// <param name=\"removePrerequisites\">When true, also remove the prerequisites that are not used anymore.</param>\n        void PerformSuppression(bool removePrerequisites);\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Interfaces/IPlanOrderPluggable.cs",
    "content": "using System;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Interfaces\n{\n    /// <summary>\n    /// Provides a way for implant calculator and attributes optimization form to add a column showing the training time difference.\n    /// </summary>\n    public interface IPlanOrderPluggable\n    {\n        /// <summary>\n        /// Occurs when [disposed].\n        /// </summary>\n        event EventHandler Disposed;\n\n        /// <summary>\n        /// Updates the statistics.\n        /// </summary>\n        /// <param name=\"plan\">The plan.</param>\n        /// <param name=\"areRemappingPointsActive\">if set to <c>true</c> [are remapping points active].</param>\n        void UpdateStatistics(BasePlan plan, out bool areRemappingPointsActive);\n\n        /// <summary>\n        /// Updates the on implant set change.\n        /// </summary>\n        /// <returns></returns>\n        Task UpdateOnImplantSetChange();\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Interfaces/IQueryMonitor.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Interfaces\n{\n    public interface IQueryMonitor\n    {\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"IQueryMonitor\"/> is enabled.\n        /// </summary>\n        /// <value><c>true</c> if enabled; otherwise, <c>false</c>.</value>\n        bool Enabled { get; set; }\n\n        /// <summary>\n        /// Gets true whether the monitor has to do a query on application startup.\n        /// </summary>\n        bool QueryOnStartup { get; }\n\n        /// <summary>\n        /// Gets the status of the query.\n        /// </summary>\n        QueryStatus Status { get; }\n\n        /// <summary>\n        /// Gets the API method monitored by this instance.\n        /// </summary>\n        Enum Method { get; }\n\n        /// <summary>\n        /// Gets the last time this instance was updated (UTC).\n        /// </summary>\n        DateTime LastUpdate { get; }\n\n        /// <summary>\n        /// Gets true when the API provider is not CCP or the cache timer has expired.\n        /// </summary>\n        bool CanForceUpdate { get; }\n\n        /// <summary>\n        /// Gets the next time this instance should be updated (UTC), based on both the CCP cache time and the user preferences.\n        /// </summary>\n        DateTime NextUpdate { get; }\n\n        /// <summary>\n        /// Gets true whether the method is curently being requeried.\n        /// </summary>\n        bool IsUpdating { get; }\n\n        /// <summary>\n        /// Gets the last API result.\n        /// </summary>\n        IAPIResult LastResult { get; }\n\n        /// <summary>\n        /// Gets true whether this monitor has access to data.\n        /// </summary>\n        bool HasAccess { get; }\n\n        /// <summary>\n        /// Releases unmanaged and - optionally - managed resources\n        /// </summary>\n        void Dispose();\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Interfaces/IQueryMonitorEx.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.Interfaces\n{\n    /// <summary>\n    /// Adds the internal methods for a query monitor.\n    /// </summary>\n    internal interface IQueryMonitorEx : IQueryMonitor\n    {\n        /// <summary>\n        /// Resets the monitor with the given last update time.\n        /// </summary>\n        /// <param name=\"lastUpdate\">The UTC time of the last update.</param>\n        void Reset(DateTime lastUpdate);\n\n        /// <summary>\n        /// Forces an update.\n        /// </summary>\n        /// <param name=\"retryOnError\">When true, the update will be reattempted until succesful.</param>\n        void ForceUpdate(bool retryOnError = false);\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Interfaces/ISkillLevel.cs",
    "content": "using System;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Interfaces\n{\n    /// <summary>\n    /// Represents a static skill and level tuple\n    /// </summary>\n    public interface ISkillLevel\n    {\n        long Level { get; }\n        StaticSkill Skill { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Interfaces/IStaticSkill.cs",
    "content": "﻿using System;\nusing System.Collections.ObjectModel;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Interfaces\n{\n    public interface IStaticSkill\n    {\n        int ID { get; }\n        int ArrayIndex { get; }\n        string Name { get; }\n\n        long Rank { get; }\n        long Cost { get; }\n        StaticSkillGroup Group { get; }\n\n        Collection<StaticSkillLevel> Prerequisites { get; }\n\n        EveAttribute PrimaryAttribute { get; }\n        EveAttribute SecondaryAttribute { get; }\n\n        Skill ToCharacter(Character character);\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Loadouts/LoadoutsProvider.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\n\nnamespace EVEMon.Common.Loadouts\n{\n    public abstract class LoadoutsProvider\n    {\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        /// <value>\n        /// The name.\n        /// </value>\n        public abstract string Name { get; }\n\n        /// <summary>\n        /// Gets a value indicating whether this <see cref=\"LoadoutsProvider\"/> is enabled.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if enabled; otherwise, <c>false</c>.\n        /// </value>\n        protected abstract bool Enabled { get; }\n\n        /// <summary>\n        /// Gets the providers.\n        /// </summary>\n        /// <value>\n        /// The providers.\n        /// </value>\n        public static IEnumerable<LoadoutsProvider> Providers => Assembly.\n            GetExecutingAssembly().GetTypes().Where(type => typeof(LoadoutsProvider).\n            IsAssignableFrom(type) && type.GetConstructor(Type.EmptyTypes) != null).Select(\n            type => Activator.CreateInstance(type) as LoadoutsProvider).Where(provider =>\n            !string.IsNullOrWhiteSpace(provider.Name) && provider.Enabled).OrderBy(provider =>\n            provider.Name);\n\n        /// <summary>\n        /// Gets the loadouts feed asynchronous.\n        /// </summary>\n        /// <param name=\"ship\">The ship.</param>\n        public abstract Task GetLoadoutsFeedAsync(Item ship);\n\n        /// <summary>\n        /// Gets the loadout by identifier asynchronous.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        public abstract Task GetLoadoutByIDAsync(long id);\n\n        /// <summary>\n        /// Deserializes the loadout.\n        /// </summary>\n        /// <param name=\"loadout\">The loadout.</param>\n        /// <param name=\"feed\">The feed.</param>\n        public abstract void DeserializeLoadout(Loadout loadout, object feed);\n\n        /// <summary>\n        /// Deserializes the loadouts feed.\n        /// </summary>\n        /// <param name=\"ship\">The ship.</param>\n        /// <param name=\"feed\">The feed.</param>\n        public abstract ILoadoutInfo DeserializeLoadoutsFeed(Item ship, object feed);\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Loadouts/Osmium/OsmiumLoadoutsProvider.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization.Osmium.Loadout;\n\nnamespace EVEMon.Common.Loadouts.Osmium\n{\n    public sealed class OsmiumLoadoutsProvider : LoadoutsProvider\n    {\n        #region Fields\n\n        private static bool s_queryFeedPending;\n        private static bool s_queryPending;\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        /// <value>\n        /// The name.\n        /// </value>\n        public override string Name => \"Osmium\";\n\n        /// <summary>\n        /// Gets a value indicating whether this <see cref=\"LoadoutsProvider\" /> is enabled.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if enabled; otherwise, <c>false</c>.\n        /// </value>\n        protected override bool Enabled => true;\n\n        #endregion\n\n\n        #region Inherited Methods\n\n        /// <summary>\n        /// Gets the loadouts feed.\n        /// </summary>\n        /// <param name=\"ship\">The ship.</param>\n        public override async Task GetLoadoutsFeedAsync(Item ship)\n        {\n            // Quit if query is pending\n            if (s_queryFeedPending)\n                return;\n\n            Uri url = new Uri(NetworkConstants.OsmiumBaseUrl + string.Format(\n                CultureConstants.InvariantCulture, NetworkConstants.OsmiumLoadoutFeed, ship.Name));\n\n            s_queryFeedPending = true;\n\n            var result = await Util.DownloadJsonAsync<List<SerializableOsmiumLoadoutFeed>>(url,\n                new RequestParams()\n                {\n                    AcceptEncoded = true\n                });\n            OnLoadoutsFeedDownloaded(result.Result, result.Exception?.Message);\n        }\n\n        /// <summary>\n        /// Gets the loadout by type ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        public override async Task GetLoadoutByIDAsync(long id)\n        {\n            // Quit if query is pending\n            if (s_queryPending)\n                return;\n\n            Uri url = new Uri(NetworkConstants.OsmiumBaseUrl + string.Format(\n                CultureConstants.InvariantCulture, NetworkConstants.OsmiumLoadoutDetails, id));\n\n            s_queryPending = true;\n\n            OnLoadoutDownloaded(await HttpWebClientService.DownloadStringAsync(url));\n        }\n\n        /// <summary>\n        /// Deserializes the loadouts feed.\n        /// </summary>\n        /// <param name=\"ship\">The ship.</param>\n        /// <param name=\"feed\">The feed.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">feed</exception>\n        public override ILoadoutInfo DeserializeLoadoutsFeed(Item ship, object feed)\n        {\n            feed.ThrowIfNull(nameof(feed));\n            var loadoutFeed = feed as List<SerializableOsmiumLoadoutFeed>;\n            return (loadoutFeed == null) ? new LoadoutInfo() : DeserializeOsmiumJsonFeedFormat(\n                ship, loadoutFeed);\n        }\n\n        /// <summary>\n        /// Deserializes the loadout.\n        /// </summary>\n        /// <param name=\"loadout\">The loadout.</param>\n        /// <param name=\"feed\">The feed.</param>\n        /// <exception cref=\"System.ArgumentNullException\">\n        /// loadout\n        /// or\n        /// feed\n        /// </exception>\n        public override void DeserializeLoadout(Loadout loadout, object feed)\n        {\n            loadout.ThrowIfNull(nameof(loadout));\n\n            feed.ThrowIfNull(nameof(feed));\n\n            loadout.Items = LoadoutHelper.DeserializeEftFormat(feed as string).Loadouts.First().Items;\n        }\n\n        /// <summary>\n        /// Occurs when we downloaded a loadouts feed from the provider.\n        /// </summary>\n        /// <param name=\"loadoutFeed\">The loadout feed.</param>\n        /// <param name=\"errorMessage\">The error message.</param>\n        private static void OnLoadoutsFeedDownloaded(object loadoutFeed, string errorMessage)\n        {\n            s_queryFeedPending = false;\n\n            EveMonClient.OnLoadoutsFeedDownloaded(loadoutFeed, errorMessage);\n        }\n\n        /// <summary>\n        /// Occurs when we downloaded a loadout from the provider.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private static void OnLoadoutDownloaded(DownloadResult<string> result)\n        {\n            s_queryPending = false;\n\n            EveMonClient.OnLoadoutDownloaded(result.Result, result.Error?.Message);\n        }\n\n        /// <summary>\n        /// Deserializes the Osmium Json feed format.\n        /// </summary>\n        /// <param name=\"ship\">The ship.</param>\n        /// <param name=\"feed\">The feed.</param>\n        /// <returns></returns>\n        private static ILoadoutInfo DeserializeOsmiumJsonFeedFormat(Item ship, IEnumerable<SerializableOsmiumLoadoutFeed> feed)\n        {\n            ILoadoutInfo loadoutInfo = new LoadoutInfo\n            {\n                Ship = ship\n            };\n\n            if (feed == null)\n                return loadoutInfo;\n\n            loadoutInfo.Loadouts\n                .AddRange(feed\n                    .Select(serialLoadout =>\n                        new Loadout\n                        {\n                            ID = serialLoadout.ID,\n                            Name = serialLoadout.Name,\n                            Description = serialLoadout.RawDescription,\n                            Author = serialLoadout.Author.Name,\n                            Rating = serialLoadout.Rating,\n                            SubmissionDate = serialLoadout.CreationDate.UnixTimeStampToDateTime(),\n                            TopicUrl = new Uri(serialLoadout.Uri),\n                            Items = Enumerable.Empty<Item>()\n                        }));\n\n            return loadoutInfo;\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/MarketPricer/EveMarketer/EMItemPricer.cs",
    "content": "﻿using EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization.EveMarketer.MarketPricer;\nusing EVEMon.Common.Service;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.Common.MarketPricer.EveMarketer\n{\n    public sealed class EMItemPricer : ItemPricer\n    {\n        #region Fields\n\n        private const string Filename = \"ec_item_prices\";\n        private const int MAX_QUERY = 60;\n\n        private static readonly Queue<int> s_queue = new Queue<int>();\n        private static readonly HashSet<int> s_requested = new HashSet<int>();\n        private static bool s_queryPending;\n\n        #endregion\n\n\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        public override string Name => \"EVEMarketer\";\n\n        /// <summary>\n        /// Gets a value indicating whether this <see cref=\"ItemPricer\" /> is enabled.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if enabled; otherwise, <c>false</c>.\n        /// </value>\n        protected override bool Enabled => true;\n\n        /// <summary>\n        /// Gets the price by type ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns></returns>\n        public override double GetPriceByTypeID(int id)\n        {\n            // Ensure list importation\n            EnsureImportation();\n\n            double result;\n            PriceByItemID.TryGetValue(id, out result);\n            lock (s_queue)\n            {\n                if (!s_requested.Contains(id))\n                {\n                    s_requested.Add(id);\n                    s_queue.Enqueue(id);\n                    if (!s_queryPending)\n                    {\n                        s_queryPending = true;\n                        Task.WhenAll(QueryIDs());\n                    }\n                }\n            }\n            return result;\n        }\n\n        /// <summary>\n        /// Ensures the importation.\n        /// </summary>\n        private void EnsureImportation()\n        {\n            // Quit if query is pending\n            if (s_queryPending)\n                return;\n\n            // Check the selected provider\n            if (!string.IsNullOrWhiteSpace(SelectedProviderName))\n            {\n                if (SelectedProviderName != Name)\n                {\n                    Loaded = false;\n                    SelectedProviderName = Name;\n                }\n            }\n            else\n                SelectedProviderName = Name;\n\n            string file = LocalXmlCache.GetFileInfo(Filename).FullName;\n\n            // Exit if we have already imported the list\n            if (Loaded)\n                return;\n            \n            if (File.Exists(file))\n                LoadFromFile(file);\n            else\n            {\n                Loaded = true;\n                PriceByItemID.Clear();\n            }\n        }\n\n        /// <summary>\n        /// Loads from file.\n        /// </summary>\n        /// <param name=\"file\">The file.</param>\n        private void LoadFromFile(string file)\n        {\n            // Deserialize the xml file\n            var result = Util.DeserializeXmlFromFile<SerializableECItemPrices>(file);\n\n            PriceByItemID.Clear();\n            Loaded = false;\n            s_requested.Clear();\n\n            // Import the data\n            Import(result.ItemPrices);\n        }\n\n        /// <summary>\n        /// Imports the specified item prices.\n        /// </summary>\n        /// <param name=\"itemPrices\">The item prices.</param>\n        private static void Import(IEnumerable<SerializableECItemPriceListItem> itemPrices)\n        {\n            foreach (SerializableECItemPriceListItem item in itemPrices)\n            {\n                PriceByItemID[item.ID] = item.Prices.Average;\n            }\n        }\n\n        /// <summary>\n        /// Queries the ids.\n        /// </summary>\n        /// <returns></returns>\n        private async Task QueryIDs()\n        {\n            var idsToQuery = new List<int>();\n            var url = new Uri(NetworkConstants.EVEMarketerBaseUrl + NetworkConstants.\n                EVEMarketerAPIItemPrices);\n\n            while (true)\n            {\n                lock (s_queue)\n                {\n                    // Cannot await inside lock, this is the cleanest way to do it\n                    if (s_queue.Count == 0)\n                        return;\n                    idsToQuery.Clear();\n                    for (int i = 0; i < MAX_QUERY && s_queue.Count > 0; i++)\n                        idsToQuery.Add(s_queue.Dequeue());\n                }\n\n                var result = await Util.DownloadXmlAsync<SerializableECItemPrices>(url,\n                    new RequestParams(GetQueryString(idsToQuery))\n                    {\n                        AcceptEncoded = true\n                    });\n                OnPricesDownloaded(result);\n            }\n        }\n\n        /// <summary>\n        /// Gets the query string.\n        /// </summary>\n        /// <param name=\"idsToQuery\">The ids to query.</param>\n        /// <returns></returns>\n        private static string GetQueryString(IReadOnlyCollection<int> idsToQuery)\n        {\n            var sb = new StringBuilder(256);\n            foreach (int i in idsToQuery)\n            {\n                sb.Append($\"typeid={i}\");\n\n                if (idsToQuery.Last() != i)\n                    sb.Append(\"&\");\n            }\n            var jitaSolarSystem = StaticGeography.GetSolarSystemByName(\"Jita\");\n            if (jitaSolarSystem != null)\n                sb.Append($\"&usesystem={jitaSolarSystem.ID}\");\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Called when prices downloaded.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private void OnPricesDownloaded(DownloadResult<SerializableECItemPrices> result)\n        {\n            if (CheckQueryStatus(result))\n                return;\n\n            if (EveMonClient.IsDebugBuild)\n                EveMonClient.Trace($\"Remaining ids: {string.Join(\", \", s_queue)}\", printMethod: false);\n\n            Loaded = true;\n\n            // Reset query pending flag\n            s_queryPending = false;\n\n            EveMonClient.Trace(\"done\");\n\n            EveMonClient.OnPricesDownloaded(null, string.Empty);\n\n            // Save the file in cache\n            SaveAsync(Filename, Util.SerializeToXmlDocument(Export())).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Checks the query status.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        /// <returns></returns>\n        private bool CheckQueryStatus(DownloadResult<SerializableECItemPrices> result)\n        {\n            if (result?.Error != null)\n            {\n                EveMonClient.Trace(result.Error.Message);\n\n                // Abort further attempts if it is a connection issue\n                if (result.Error.Status == HttpWebClientServiceExceptionStatus.Timeout ||\n                    result.Error.Status == HttpWebClientServiceExceptionStatus.ServerError)\n                {\n                    s_queue.Clear();\n\n                    // Reset query pending flag\n                    s_queryPending = false;\n                    EveMonClient.OnPricesDownloaded(null, string.Empty);\n\n                    // We return 'true' to avoid saving a file\n                    return true;\n                }\n\n                lock (s_queue)\n                {\n                    // If we are done set the proper flags\n                    if (s_queue.Count < 1)\n                    {\n                        Loaded = true;\n                        EveMonClient.Trace(\"ECItemPricer.Import - done\", printMethod: false);\n                        return false;\n                    }\n                }\n            }\n\n            // When the query succeeds import the data\n            if (result?.Result != null)\n                Import(result.Result.ItemPrices);\n\n            // If all items where queried we are done (false = save file)\n            bool hasMore;\n            lock (s_queue)\n            {\n                hasMore = s_queue.Count > 0;\n            }\n\n            return hasMore;\n        }\n\n        /// <summary>\n        /// Exports the cache list to a serializable object.\n        /// </summary>\n        /// <returns></returns>\n        private static SerializableECItemPrices Export()\n        {\n            IEnumerable<SerializableECItemPriceListItem> entitiesList = PriceByItemID\n                .OrderBy(x => x.Key)\n                .Select(\n                    item =>\n                        new SerializableECItemPriceListItem\n                        {\n                            ID = item.Key,\n                            Prices = new SerializableECItemPriceItem { Average = item.Value }\n                        });\n\n            SerializableECItemPrices serial = new SerializableECItemPrices();\n            serial.ItemPrices.AddRange(entitiesList);\n\n            return serial;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/MarketPricer/Fuzzworks/FuzzworksItemPricer.cs",
    "content": "﻿using EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.Serialization.EveMarketer.MarketPricer;\nusing EVEMon.Common.Serialization.Fuzzworks;\nusing EVEMon.Common.Service;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nusing FuzzworksResult = System.Collections.Generic.Dictionary<string, EVEMon.Common.\n    Serialization.Fuzzworks.SerializableFuzzworksPriceItem>;\n\nnamespace EVEMon.Common.MarketPricer.Fuzzworks\n{\n    public sealed class FuzzworksItemPricer : ItemPricer\n    {\n        #region Fields\n\n        private const string Filename = \"fuzzy_item_prices\";\n        private const int MAX_QUERY = 60;\n\n        private static readonly Queue<int> s_queue = new Queue<int>();\n        private static readonly HashSet<int> s_requested = new HashSet<int>();\n        private static bool s_queryPending;\n\n        #endregion\n\n\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        public override string Name => \"Fuzzworks\";\n\n        /// <summary>\n        /// Gets a value indicating whether this <see cref=\"ItemPricer\" /> is enabled.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if enabled; otherwise, <c>false</c>.\n        /// </value>\n        protected override bool Enabled => true;\n\n        /// <summary>\n        /// Gets the price by type ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns></returns>\n        public override double GetPriceByTypeID(int id)\n        {\n            // Ensure list importation\n            EnsureImportation();\n\n            double result;\n            PriceByItemID.TryGetValue(id, out result);\n            lock (s_queue)\n            {\n                if (!s_requested.Contains(id))\n                {\n                    s_requested.Add(id);\n                    s_queue.Enqueue(id);\n                    if (!s_queryPending)\n                    {\n                        s_queryPending = true;\n                        Task.WhenAll(QueryIDs());\n                    }\n                }\n            }\n            return result;\n        }\n\n        /// <summary>\n        /// Ensures the importation.\n        /// </summary>\n        private void EnsureImportation()\n        {\n            // Quit if query is pending\n            if (s_queryPending)\n                return;\n\n            // Check the selected provider\n            if (!string.IsNullOrWhiteSpace(SelectedProviderName))\n            {\n                if (SelectedProviderName != Name)\n                {\n                    Loaded = false;\n                    SelectedProviderName = Name;\n                }\n            }\n            else\n                SelectedProviderName = Name;\n\n            string file = LocalXmlCache.GetFileInfo(Filename).FullName;\n\n            // Exit if we have already imported the list\n            if (Loaded)\n                return;\n\n            if (File.Exists(file))\n                LoadFromFile(file);\n            else\n            {\n                Loaded = true;\n                PriceByItemID.Clear();\n            }\n        }\n\n        /// <summary>\n        /// Loads from file.\n        /// </summary>\n        /// <param name=\"file\">The file.</param>\n        private void LoadFromFile(string file)\n        {\n            // Deserialize the xml file\n            var result = Util.DeserializeXmlFromFile<SerializableECItemPrices>(file);\n\n            PriceByItemID.Clear();\n            Loaded = false;\n            s_requested.Clear();\n\n            // Import the data\n            Import(result.ItemPrices);\n        }\n\n        /// <summary>\n        /// Imports the specified item prices.\n        /// </summary>\n        /// <param name=\"itemPrices\">The item prices.</param>\n        private static void Import(IEnumerable<SerializableECItemPriceListItem> itemPrices)\n        {\n            foreach (SerializableECItemPriceListItem item in itemPrices)\n            {\n                PriceByItemID[item.ID] = item.Prices.Average;\n            }\n        }\n\n        /// <summary>\n        /// Imports the specified item prices.\n        /// </summary>\n        /// <param name=\"itemPrices\">The item prices.</param>\n        private static void Import(IDictionary<string, SerializableFuzzworksPriceItem> itemPrices)\n        {\n            foreach (var pair in itemPrices)\n                // IDs in JSON cannot be integers\n                if (int.TryParse(pair.Key, out int id))\n                {\n                    var item = pair.Value;\n\n                    if (item.Sell != null)\n                        // JSV Min\n                        PriceByItemID[id] = item.Sell.MinPrice;\n                    else if (item.Buy != null)\n                        // JBV Max\n                        PriceByItemID[id] = item.Buy.MaxPrice;\n                }\n        }\n\n        /// <summary>\n        /// Queries the ids.\n        /// </summary>\n        /// <returns></returns>\n        private async Task QueryIDs()\n        {\n            var idsToQuery = new List<int>();\n\n            while (true)\n            {\n                lock (s_queue)\n                {\n                    // Cannot await inside lock, this is the cleanest way to do it\n                    if (s_queue.Count == 0)\n                        return;\n                    idsToQuery.Clear();\n                    for (int i = 0; i < MAX_QUERY && s_queue.Count > 0; i++)\n                        idsToQuery.Add(s_queue.Dequeue());\n                }\n\n                var url = new Uri(NetworkConstants.FuzzworksMarketUrl + GetQueryString(\n                    idsToQuery));\n                var result = await Util.DownloadJsonAsync<FuzzworksResult>(url,\n                    new RequestParams()\n                    {\n                        AcceptEncoded = true\n                    });\n                OnPricesDownloaded(result);\n            }\n        }\n\n        /// <summary>\n        /// Gets the query string.\n        /// </summary>\n        /// <param name=\"idsToQuery\">The ids to query.</param>\n        /// <returns></returns>\n        private static string GetQueryString(IReadOnlyCollection<int> idsToQuery)\n        {\n            var sb = new StringBuilder(256);\n            foreach (int i in idsToQuery)\n            {\n                sb.Append(i);\n\n                if (idsToQuery.Last() != i)\n                    sb.Append(\",\");\n            }\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Called when prices downloaded.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private void OnPricesDownloaded(JsonResult<FuzzworksResult> result)\n        {\n            if (CheckQueryStatus(result))\n                return;\n\n            if (EveMonClient.IsDebugBuild)\n                EveMonClient.Trace($\"Remaining ids: {string.Join(\", \", s_queue)}\", printMethod: false);\n\n            Loaded = true;\n\n            // Reset query pending flag\n            s_queryPending = false;\n\n            EveMonClient.Trace(\"done\");\n\n            EveMonClient.OnPricesDownloaded(null, string.Empty);\n\n            // Save the file in cache\n            SaveAsync(Filename, Util.SerializeToXmlDocument(Export())).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Checks the query status.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        /// <returns></returns>\n        private bool CheckQueryStatus(JsonResult<FuzzworksResult> result)\n        {\n            if (result == null || result.HasError)\n            {\n                // Abort further attempts if it is a connection issue\n                if (result != null)\n                {\n                    EveMonClient.Trace(result.ErrorMessage);\n                    s_queue.Clear();\n\n                    // Reset query pending flag\n                    s_queryPending = false;\n                    EveMonClient.OnPricesDownloaded(null, string.Empty);\n\n                    // We return 'true' to avoid saving a file\n                    return true;\n                }\n\n                lock (s_queue)\n                {\n                    // If we are done set the proper flags\n                    if (s_queue.Count < 1)\n                    {\n                        Loaded = true;\n                        EveMonClient.Trace(\"ECItemPricer.Import - done\", printMethod: false);\n                        return false;\n                    }\n                }\n            }\n            else\n                // When the query succeeds import the data\n                Import(result.Result);\n\n            // If all items where queried we are done (false = save file)\n            bool hasMore;\n            lock (s_queue)\n            {\n                hasMore = s_queue.Count > 0;\n            }\n\n            return hasMore;\n        }\n\n        /// <summary>\n        /// Exports the cache list to a serializable object.\n        /// </summary>\n        /// <returns></returns>\n        private static SerializableECItemPrices Export()\n        {\n            IEnumerable<SerializableECItemPriceListItem> entitiesList = PriceByItemID\n                .OrderBy(x => x.Key)\n                .Select(\n                    item =>\n                        new SerializableECItemPriceListItem\n                        {\n                            ID = item.Key,\n                            Prices = new SerializableECItemPriceItem { Average = item.Value }\n                        });\n\n            SerializableECItemPrices serial = new SerializableECItemPrices();\n            serial.ItemPrices.AddRange(entitiesList);\n\n            return serial;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/MarketPricer/ItemPricer.cs",
    "content": "﻿using EVEMon.Common.Service;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading.Tasks;\nusing System.Xml.XPath;\n\nnamespace EVEMon.Common.MarketPricer\n{\n    public abstract class ItemPricer\n    {\n        protected static readonly Dictionary<int, double> PriceByItemID = new Dictionary<int, double>();\n\n        protected static string SelectedProviderName;\n        protected static bool Loaded;\n\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        public abstract string Name { get; }\n\n        /// <summary>\n        /// Gets a value indicating whether this <see cref=\"ItemPricer\"/> is enabled.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if enabled; otherwise, <c>false</c>.\n        /// </value>\n        protected abstract bool Enabled { get; }\n\n        /// <summary>\n        /// Gets a value indicating whether this <see cref=\"ItemPricer\"/> is queried.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if queried; otherwise, <c>false</c>.\n        /// </value>\n        public bool Queried => Loaded;\n\n        /// <summary>\n        /// Gets the providers.\n        /// </summary>\n        /// <value>\n        /// The providers.\n        /// </value>\n        public static IEnumerable<ItemPricer> Providers => Assembly.GetExecutingAssembly().\n            GetTypes().Where(type => typeof(ItemPricer).IsAssignableFrom(type) && type.\n            GetConstructor(Type.EmptyTypes) != null).Select(type => Activator.CreateInstance(\n            type) as ItemPricer).Where(provider => !string.IsNullOrWhiteSpace(provider.Name) &&\n            provider.Enabled).OrderBy(pricer => pricer.Name);\n\n        /// <summary>\n        /// Gets the price by type ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns></returns>\n        public abstract double GetPriceByTypeID(int id);\n \n        /// <summary>\n        /// Saves the xml document to the specified filename.\n        /// </summary>\n        /// <param name=\"filename\">The filename.</param>\n        /// <param name=\"xdoc\">The xdoc.</param>\n        protected static Task SaveAsync(string filename, IXPathNavigable xdoc)\n            => LocalXmlCache.SaveAsync(filename, xdoc);\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/APIMethod.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Models.Extended;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Serializable class for an API method and its path. Each APIConfiguration maintains a list of APIMethodsEnum.\n    /// </summary>\n    public class APIMethod\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"method\"></param>\n        /// <param name=\"path\"></param>\n        private APIMethod(Enum method, string path)\n        {\n            Method = method;\n            Path = path;\n        }\n\n        /// <summary>\n        /// Returns the APIMethodsEnum enumeration member for this APIMethod.\n        /// </summary>\n        public Enum Method { get; }\n\n        /// <summary>\n        /// Returns the defined URL suffix path for this APIMethod.\n        /// </summary>\n        public string Path { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/APIProvider.cs",
    "content": "using EVEMon.Common.Attributes;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Threading;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Xml.Xsl;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Serializable class abstracting an API queries provider and its configuration.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class APIProvider\n    {\n        // Called when an ESI request completes\n        public delegate void ESIRequestCallback<T>(EsiResult<T> result, object state);\n\n        private static APIProvider s_ccpProvider;\n        private static APIProvider s_ccpTestProvider;\n        private static XslCompiledTransform s_rowsetsTransform;\n\n        private readonly List<ESIMethod> m_methods;\n        private bool m_supportsCompressedResponse;\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        internal APIProvider()\n        {\n            m_methods = new List<ESIMethod>(ESIMethod.CreateDefaultSet());\n            Url = new Uri(\"http://your-custom-API-provider.com\");\n            Name = \"your provider's name\";\n        }\n\n\n        #region Properties\n\n        /// <summary>\n        /// Returns the name of this APIConfiguration.\n        /// </summary>\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Returns the server host for this APIConfiguration.\n        /// </summary>\n        public Uri Url { get; set; }\n        \n        /// <summary>\n        /// Gets or sets a value indicating whether the provider supports compressed responses.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the provider supports compressed responses; otherwise, <c>false</c>.\n        /// </value>\n        public bool SupportsCompressedResponse\n        {\n            get { return IsDefault || this == TestProvider || m_supportsCompressedResponse; }\n            set { m_supportsCompressedResponse = value; }\n        }\n\n        /// <summary>\n        /// Returns true if this APIConfiguration represents the default API service.\n        /// </summary>\n        public bool IsDefault => this == DefaultProvider;\n\n        /// <summary>\n        /// Gets the default API provider\n        /// </summary>\n        public static APIProvider DefaultProvider\n            => s_ccpProvider ??\n               (s_ccpProvider = new APIProvider\n               {\n                   Url = new Uri(NetworkConstants.ESIBase),\n                   Name = \"CCP\"\n               });\n\n        /// <summary>\n        /// Gets the test API provider (RIP SiSi ESI)\n        /// </summary>\n        public static APIProvider TestProvider\n            => s_ccpTestProvider ??\n               (s_ccpTestProvider = new APIProvider\n               {\n                   Url = new Uri(\"https://www.google.com/\"),\n                   Name = \"CCP Test API\"\n               });\n\n        #endregion\n\n\n        #region Helpers\n        \n        /// <summary>\n        /// Returns the request method.\n        /// </summary>\n        /// <param name=\"requestMethod\">An ESIMethodsEnum enumeration member specifying the\n        /// method for which the URL is required.</param>\n        private ESIMethod GetESIMethod(Enum requestMethod)\n        {\n            var esiMethod = m_methods.FirstOrDefault(method => method.Method.Equals(\n                requestMethod));\n            if (esiMethod == null)\n                throw new InvalidOperationException(\"No ESI method found for \" + requestMethod);\n            return esiMethod;\n        }\n\n        /// <summary>\n        /// Creates an ESI result to wrap a result from DownloadJsonAsync, and synchronizes\n        /// its times if necessary.\n        /// </summary>\n        /// <typeparam name=\"T\">The type of the result.</typeparam>\n        /// <param name=\"result\">The downloaded data.</param>\n        /// <returns>An ESI result wrapping the data, with errors set as necessary.</returns>\n        private EsiResult<T> GetESIResult<T>(JsonResult<T> result)\n        {\n            result.ThrowIfNull(nameof(result));\n\n            // Update ESI error count; since ESI currently throttles by minute add 90 seconds\n            var response = result.Response;\n            if (response?.ErrorCount != null && !response.IsNotModifiedResponse && !response.\n                    IsOKResponse)\n                EsiErrors.UpdateErrors((int)response.ErrorCount, DateTime.UtcNow.AddSeconds(90.0));\n\n            var esiResult = new EsiResult<T>(result);\n            // Sync clock on the answer if necessary and provided\n            var sync = esiResult.Result as ISynchronizableWithLocalClock;\n            DateTime? when = esiResult.CurrentTime;\n            if (sync != null && when != null)\n                sync.SynchronizeWithLocalClock(DateTime.UtcNow - (DateTime)when);\n            return esiResult;\n        }\n\n        /// <summary>\n        /// Returns the full canonical ESI URL for the specified APIMethod as constructed from\n        /// the Server and APIMethod properties.\n        /// </summary>\n        /// <param name=\"requestMethod\">An APIMethodsEnum enumeration member specifying the\n        /// method for which the URL is required.</param>\n        /// <param name=\"data\">The ESI parameters for this URL.</param>\n        /// <param name=\"page\">The page to fetch; 0 or 1 will fetch without requesting a page\n        /// </param>\n        /// <returns>A String representing the full URL path of the specified method.</returns>\n        private Uri GetESIUrl(Enum requestMethod, ESIParams data, int page = 1)\n        {\n            long id = data.ParamOne;\n            string paramStr = string.IsNullOrEmpty(data.GetData) ? data.ParamTwo.ToString(\n                CultureConstants.InvariantCulture) : data.GetData;\n            string path = string.Format(GetESIMethod(requestMethod).Path, id, paramStr);\n            \n            // Build the URI\n            var builder = new UriBuilder(new Uri(NetworkConstants.ESIBase));\n            builder.Path = Path.Combine(builder.Path, path);\n            if (page > 1)\n                builder.Query = \"page=\" + page.ToString(CultureConstants.InvariantCulture);\n            return builder.Uri;\n        }\n\n        /// <summary>\n        /// Creates the request parameters for ESI.\n        /// </summary>\n        /// <param name=\"data\">The ESI parameters.</param>\n        /// <returns>The required request parameters, including the ETag/Expiry (if supplied)\n        /// and POST data/token.</returns>\n        private RequestParams GetRequestParams(ESIParams data)\n        {\n            return new RequestParams(data.LastResponse, data.PostData)\n            {\n                Authentication = data.Token,\n                AcceptEncoded = SupportsCompressedResponse\n            };\n        }\n\n        #endregion\n\n\n        #region Querying\n\n        /// <summary>\n        /// Helper method for fetching paginated items.\n        /// </summary>\n        /// <typeparam name=\"T\">The subtype to deserialize (the deserialized type being\n        /// <see cref=\"CCPAPIResult{T}\" />). It must be a collection type of U!</typeparam>\n        /// <typeparam name=\"U\">The item type to deserialize.</typeparam>\n        /// <param name=\"method\">The method to query</param>\n        /// <param name=\"callback\">The callback to invoke once the query has been completed.\n        /// </param>\n        /// <param name=\"data\">The parameters to use for the request, including the token,\n        /// arguments, and POST data.</param>\n        /// <param name=\"state\">State to be passed to the callback when it is used.</param>\n        private void QueryEsiPageHelper<T, U>(Enum method, ESIRequestCallback<T> callback,\n            ESIParams data, PageInfo<T, U> state) where T : List<U> where U : class\n        {\n            int page = state.CurrentPage;\n            var first = state.FirstResult;\n            Uri pageUrl = GetESIUrl(method, data, page);\n            // Create RequestParams manually to zero out the ETag/Expiry since it was already\n            // checked\n            Util.DownloadJsonAsync<T>(pageUrl, new RequestParams(null, data.PostData)\n            {\n                Authentication = data.Token,\n                AcceptEncoded = SupportsCompressedResponse\n            }).ContinueWith(task =>\n            {\n                var esiResult = GetESIResult(task.Result);\n                object callbackState = state.State;\n                if (esiResult.HasError)\n                    // Invoke the callback if an error occurred\n                    Dispatcher.Invoke(() => callback.Invoke(esiResult, callbackState));\n                else if (!esiResult.HasData)\n                    // This should not occur\n                    Dispatcher.Invoke(() => callback.Invoke(first, callbackState));\n                else\n                {\n                    first.Result.AddRange(esiResult.Result);\n                    if (page >= state.LastPage)\n                        // All pages fetched\n                        Dispatcher.Invoke(() => callback.Invoke(first, callbackState));\n                    else\n                        // Go to the next page\n                        QueryEsiPageHelper(method, callback, data, state.NextPage());\n                }\n            });\n        }\n\n        /// <summary>\n        /// Asynchronously queries this method, fetching all pages if necessary, with the\n        /// provided request data.\n        /// </summary>\n        /// <typeparam name=\"T\">The subtype to deserialize (the deserialized type being\n        /// <see cref=\"CCPAPIResult{T}\" />). It must be a collection type of U!</typeparam>\n        /// <typeparam name=\"U\">The item type to deserialize.</typeparam>\n        /// <param name=\"method\">The method to query</param>\n        /// <param name=\"callback\">The callback to invoke once the query has been completed.\n        /// </param>\n        /// <param name=\"data\">The parameters to use for the request, including the token,\n        /// arguments, and POST data.</param>\n        /// <param name=\"state\">State to be passed to the callback when it is used.</param>\n        /// <exception cref=\"System.ArgumentNullException\">callback; The callback cannot be\n        /// null.</exception>\n        public void QueryPagedEsi<T, U>(Enum method, ESIRequestCallback<T> callback,\n            ESIParams data, object state = null) where T : List<U> where U : class\n        {\n            callback.ThrowIfNull(nameof(callback), \"The callback cannot be null.\");\n\n            Uri url = GetESIUrl(method, data);\n            Util.DownloadJsonAsync<T>(url, GetRequestParams(data)).ContinueWith(task =>\n            {\n                var esiResult = GetESIResult(task.Result);\n                // Check page count\n                int pages = esiResult.Response.Pages;\n                if (pages > 1 && esiResult.HasData && !esiResult.HasError)\n                    // Fetch the other pages\n                    QueryEsiPageHelper(method, callback, data, new PageInfo<T, U>(esiResult,\n                        pages, state));\n                else\n                    // Invokes the callback\n                    Dispatcher.Invoke(() => callback.Invoke(esiResult, state));\n            });\n        }\n\n        /// <summary>\n        /// Asynchronously queries this method with the provided request data.\n        /// </summary>\n        /// <typeparam name=\"T\">The subtype to deserialize (the deserialized type being\n        /// <see cref=\"CCPAPIResult{T}\" />).</typeparam>\n        /// <param name=\"method\">The method to query</param>\n        /// <param name=\"callback\">The callback to invoke once the query has been completed.\n        /// </param>\n        /// <param name=\"data\">The parameters to use for the request, including the token,\n        /// arguments, and POST data.</param>\n        /// <param name=\"state\">State to be passed to the callback when it is used.</param>\n        /// <exception cref=\"System.ArgumentNullException\">callback; The callback cannot be\n        /// null.</exception>\n        public void QueryEsi<T>(Enum method, ESIRequestCallback<T> callback, ESIParams\n            data, object state = null) where T : class\n        {\n            callback.ThrowIfNull(nameof(callback), \"The callback cannot be null.\");\n\n            Uri url = GetESIUrl(method, data);\n            Util.DownloadJsonAsync<T>(url, GetRequestParams(data)).ContinueWith(task =>\n            {\n                // Invokes the callback\n                Dispatcher.Invoke(() => callback.Invoke(GetESIResult(task.Result), state));\n            });\n        }\n        \n        /// <summary>\n        /// Gets the XSLT used for transforming rowsets into something deserializable by\n        /// <see cref=\"System.Xml.Serialization.XmlSerializer\"/>\n        /// </summary>\n        internal static XslCompiledTransform RowsetsTransform => s_rowsetsTransform ??\n            (s_rowsetsTransform = Util.LoadXslt(Properties.Resources.RowsetsXSLT));\n\n        #endregion\n\n\n        /// <summary>\n        /// Returns the configuration name as a String.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => Name;\n\n\n        #region Helper classes\n\n        /// <summary>\n        /// Tracks the state of a multi-paged request.\n        /// </summary>\n        private sealed class PageInfo<T, U> where T : List<U> where U : class\n        {\n            /// <summary>\n            /// The current page which was just fetched.\n            /// </summary>\n            public int CurrentPage { get; }\n\n            /// <summary>\n            /// The result from fetching the first page.\n            /// </summary>\n            public EsiResult<T> FirstResult { get; }\n\n            /// <summary>\n            /// The last page to fetch.\n            /// </summary>\n            public int LastPage { get; }\n\n            /// <summary>\n            /// The state object to be passed to the callback.\n            /// </summary>\n            public object State { get; }\n\n            /// <summary>\n            /// Creates the information for fetching the second page.\n            /// </summary>\n            /// <param name=\"first\">The result from the first page.</param>\n            /// <param name=\"count\">The number of total pages.</param>\n            /// <param name=\"state\">The state to be passed to the callback.</param>\n            public PageInfo(EsiResult<T> first, int count, object state)\n            {\n                first.ThrowIfNull(nameof(first));\n                if (count < 2)\n                    throw new ArgumentOutOfRangeException(\"count\");\n                CurrentPage = 2;\n                FirstResult = first;\n                LastPage = count;\n                State = state;\n            }\n\n            /// <summary>\n            /// Creates a page info from the previous page.\n            /// </summary>\n            /// <param name=\"previous\">The information for the previous page fetched.</param>\n            private PageInfo(PageInfo<T, U> previous)\n            {\n                previous.ThrowIfNull(nameof(previous));\n\n                CurrentPage = previous.CurrentPage + 1;\n                FirstResult = previous.FirstResult;\n                LastPage = previous.LastPage;\n                State = previous.State;\n            }\n\n            /// <summary>\n            /// Creates a page info from the previous page.\n            /// </summary>\n            /// <returns>The state for the next page to fetch.</returns>\n            public PageInfo<T, U> NextPage()\n            {\n                return new PageInfo<T, U>(this);\n            }\n\n            public override string ToString()\n            {\n                return string.Format(\"Page {0:D}/{1:D}\", CurrentPage, LastPage);\n            }\n        }\n\n        #endregion\n\n    }\n\n    #region Helper classes\n\n    /// <summary>\n    /// Simplifies ESI request building by allowing parameters to be flexibly included.\n    /// </summary>\n    public struct ESIParams\n    {\n        /// <summary>\n        /// The first parameter, usually used for the ID of the target object in public\n        /// requests and for the character/corporation ID in private requests.\n        /// </summary>\n        public long ParamOne;\n        /// <summary>\n        /// The second parameter, usually used for the ID of the target object in private\n        /// requests.\n        /// </summary>\n        public long ParamTwo;\n        /// <summary>\n        /// The GET data to be passed in as a string.\n        /// </summary>\n        public string GetData;\n        /// <summary>\n        /// The POST data to be passed in as a string.\n        /// </summary>\n        public string PostData;\n        /// <summary>\n        /// The last response from the server.\n        /// </summary>\n        public ResponseParams LastResponse;\n        /// <summary>\n        /// The token to use for authentication.\n        /// </summary>\n        public string Token;\n\n        public ESIParams(ResponseParams lastResponse, string token = null)\n        {\n            ParamOne = 0L;\n            ParamTwo = 0L;\n            GetData = null;\n            LastResponse = lastResponse ?? new ResponseParams(0);\n            PostData = null;\n            Token = token;\n        }\n    }\n\n    #endregion\n\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/AccountStatus.cs",
    "content": "﻿namespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Stores the automatically determined account status of a character - Omega or Alpha.\n    /// </summary>\n    public enum AccountStatus\n    {\n        Unknown, Alpha, Omega\n    }\n\n    /// <summary>\n    /// Stores the manually set account status of a character.\n    /// </summary>\n    public enum AccountStatusMode\n    {\n        Auto, Alpha, Omega\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Asset.cs",
    "content": "using EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Service;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class Asset\n    {\n        private static readonly EveProperty m_volumeProperty = StaticProperties.\n            GetPropertyByID(DBConstants.VolumePropertyID);\n\n        private readonly CCPCharacter m_character;\n        private long m_locationID;\n        private string m_flag;\n        private string m_fullLocation;\n        private SolarSystem m_solarSystem;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"Asset\" /> class.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"character\">The owning character.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        internal Asset(EsiAssetListItem src, CCPCharacter character)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            int flagID = EveFlag.GetFlagID(src.EVEFlag);\n            LocationID = src.LocationID;\n            Quantity = src.Quantity;\n            Item = StaticItems.GetItemByID(src.TypeID);\n            FlagID = (short)flagID;\n            m_character = character;\n            m_flag = EveFlag.GetFlagText(flagID);\n            TypeOfBlueprint = GetTypeOfBlueprint(src.IsBPC);\n            Container = string.Empty;\n            Volume = GetVolume();\n            TotalVolume = Quantity * Volume;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the location ID.\n        /// </summary>\n        internal long LocationID\n        {\n            get { return m_locationID; }\n            set\n            {\n                if (m_locationID == value)\n                    return;\n\n                m_locationID = value;\n                // Force update the full location, solar system, station\n                m_solarSystem = null;\n                m_fullLocation = string.Empty;\n            }\n        }\n\n        /// <summary>\n        /// Gets the full celestial path of the item's location.\n        /// </summary>\n        public string FullLocation {\n            get\n            {\n                UpdateLocation();\n                return m_fullLocation;\n            }\n        }\n\n        /// <summary>\n        /// Gets the solar system.\n        /// </summary>\n        public SolarSystem SolarSystem\n        {\n            get\n            {\n                UpdateLocation();\n                return m_solarSystem;\n            }\n        }\n\n        /// <summary>\n        /// Gets the item.\n        /// </summary>\n        public Item Item { get; }\n\n        /// <summary>\n        /// Gets the container.\n        /// </summary>\n        public string Container { get; internal set; }\n\n        /// <summary>\n        /// Gets the quantity.\n        /// </summary>\n        public long Quantity { get; }\n\n        /// <summary>\n        /// Gets the eve flag identifier.\n        /// </summary>\n        private short FlagID { get; }\n\n        /// <summary>\n        /// Gets the flag.\n        /// </summary>\n        public string Flag\n        {\n            get\n            {\n                if (m_flag.IsEmptyOrUnknown())\n                    m_flag = EveFlag.GetFlagText(FlagID);\n\n                return m_flag;\n            }\n        }\n\n        /// <summary>\n        /// Gets the type of the blueprint.\n        /// </summary>\n        public string TypeOfBlueprint { get; }\n\n        /// <summary>\n        /// Gets the location.\n        /// </summary>\n        public string Location { get; private set; }\n\n        /// <summary>\n        /// Gets the jumps count.\n        /// </summary>\n        public int Jumps { get; internal set; }\n\n        /// <summary>\n        /// Gets the jumps text.\n        /// </summary>\n        public string JumpsText => Jumps == -1 ? string.Empty :\n            $\"{Jumps} jump{(Jumps != 1 ? \"s\" : string.Empty)}\";\n\n        /// <summary>\n        /// Gets the volume.\n        /// </summary>\n        public double Volume { get; }\n\n        /// <summary>\n        /// Gets the total volume.\n        /// </summary>\n        public double TotalVolume { get; }\n\n        /// <summary>\n        /// Gets the price.\n        /// </summary>\n        public double Price => (TypeOfBlueprint != BlueprintType.Copy.ToString()) ?\n            (Settings.MarketPricer.Pricer != null ? Settings.MarketPricer.Pricer.\n            GetPriceByTypeID(Item.ID) : 0.0) : 0.0;\n\n        /// <summary>\n        /// Gets the cost.\n        /// </summary>\n        public double Cost => Price * Quantity;\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the type of the blueprint.\n        /// </summary>\n        /// <param name=\"isBPC\">Whether ESI reported it as a BPC.</param>\n        /// <returns></returns>\n        private string GetTypeOfBlueprint(bool isBPC) => (Item != null &&\n            StaticBlueprints.GetBlueprintByID(Item.ID) != null && !Item.MarketGroup.BelongsIn(\n            DBConstants.AncientRelicsMarketGroupID)) ? (isBPC ?\n            BlueprintType.Copy.ToString() : BlueprintType.Original.ToString()) : string.Empty;\n\n        /// <summary>\n        /// Gets the volume.\n        /// </summary>\n        /// <returns></returns>\n        private double GetVolume() => (Item != null && m_volumeProperty != null) ?\n            m_volumeProperty.GetNumericValue(Item) : 0d;\n\n        /// <summary>\n        /// Updates the location.\n        /// </summary>\n        /// <returns></returns>\n        public void UpdateLocation()\n        {\n            // If location not already determined\n            if (m_locationID != 0L && (m_solarSystem == null || m_solarSystem.ID == 0 ||\n                m_fullLocation.IsEmptyOrUnknown()))\n            {\n                var station = EveIDToStation.GetIDToStation(m_locationID, m_character);\n                // If station is not known\n                if (station == null || station.SolarSystem == null || station.\n                    SolarSystem.ID == 0)\n                {\n                    SolarSystem sys;\n                    if (m_locationID < int.MaxValue && (sys = StaticGeography.\n                        GetSolarSystemByID((int)m_locationID)) != null)\n                    {\n                        // In space\n                        m_solarSystem = sys;\n                        m_fullLocation = sys.FullLocation;\n                    }\n                    else\n                    {\n                        // In an inaccessible citadel, or one that is not yet loaded\n                        m_solarSystem = SolarSystem.UNKNOWN;\n                        m_fullLocation = EveMonConstants.UnknownText;\n                    }\n                }\n                else\n                {\n                    // Station known\n                    m_solarSystem = station.SolarSystem;\n                    m_fullLocation = station.FullLocation;\n                }\n                string locationStr = m_locationID.ToString(CultureConstants.InvariantCulture);\n                Location = (station == null ? (m_solarSystem == null ? locationStr :\n                    m_solarSystem.Name) : station.Name);\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/BaseCharacter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\n\nnamespace EVEMon.Common.Models\n{\n    public abstract class BaseCharacter\n    {\n        private const long SKILL_INJECTOR_MULTIPLIER = 100000;\n        private const long SKILL_INJECTOR_SMALL_DIVIDER = 5;\n\n        /// <summary>\n        /// Overrides the automatically determined clone state if set to Alpha or Omega.\n        /// </summary>\n        protected AccountStatusMode m_cloneStateSetting;\n\n        public BaseCharacter()\n        {\n            CharacterStatus = AccountStatus.Unknown;\n            m_cloneStateSetting = AccountStatusMode.Auto;\n        }\n\n        #region Abstract methods and properties\n\n        protected abstract long TotalSkillPoints { get; }\n        protected abstract ICharacterAttribute GetAttribute(EveAttribute attribute);\n\n        internal abstract void Dispose();\n\n        public abstract long GetSkillLevel(StaticSkill skill);\n        public abstract long GetSkillPoints(StaticSkill skill);\n\n        #endregion\n\n\n        #region Account status\n\n        /// <summary>\n        /// Gets Alpha/Omega status for this character.\n        /// </summary>\n        public virtual AccountStatus CharacterStatus { get; protected set; }\n\n        /// <summary>\n        /// Retrieves whether this character is effectively Alpha, Omega, or unknown. If auto\n        /// status is set (the default), EVEMon tries to determine this value from the known\n        /// character information. Otherwise, the user override is used.\n        /// </summary>\n        public AccountStatus EffectiveCharacterStatus\n        {\n            get\n            {\n                AccountStatus cloneState;\n                switch (AccountStatusSettings)\n                {\n                case AccountStatusMode.Alpha:\n                    cloneState = AccountStatus.Alpha;\n                    break;\n                case AccountStatusMode.Omega:\n                    cloneState = AccountStatus.Omega;\n                    break;\n                case AccountStatusMode.Auto:\n                default:\n                    cloneState = CharacterStatus;\n                    break;\n                }\n                return cloneState;\n            }\n        }\n\n        /// <summary>\n        /// The method used to determine the character's clone state (or the override).\n        /// </summary>\n        public virtual AccountStatusMode AccountStatusSettings {\n            get\n            {\n                return m_cloneStateSetting;\n            }\n            set\n            {\n                m_cloneStateSetting = value;\n            }\n        }\n\n        #endregion\n\n\n        #region Computation methods\n\n        /// <summary>\n        /// Gets the total skill points for this character.\n        /// </summary>\n        public long SkillPoints => TotalSkillPoints;\n\n        /// <summary>\n        /// Computes the SP per hour for the given skill, without factoring in the newbies bonus.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <returns>SP earned per hour.</returns>\n        /// <exception cref=\"System.ArgumentNullException\">skill</exception>\n        public virtual float GetBaseSPPerHour(StaticSkill skill)\n        {\n            return GetOmegaSPPerHour(skill) * EffectiveCharacterStatus.GetTrainingRate();\n        }\n\n        /// <summary>\n        /// Computes the SP per hour for the given skill for an Omega clone, without factoring\n        /// in the newbies bonus.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <returns>SP earned per hour.</returns>\n        /// <exception cref=\"System.ArgumentNullException\">skill</exception>\n        protected float GetOmegaSPPerHour(StaticSkill skill)\n        {\n            skill.ThrowIfNull(nameof(skill));\n\n            if (skill.PrimaryAttribute == EveAttribute.None || skill.SecondaryAttribute == EveAttribute.None)\n                return 0.0f;\n\n            float primAttr = GetAttribute(skill.PrimaryAttribute).EffectiveValue;\n            float secondaryAttr = GetAttribute(skill.SecondaryAttribute).EffectiveValue;\n            return primAttr * 60.0f + secondaryAttr * 30.0f;\n        }\n\n        /// <summary>\n        /// Gets a character scratchpad representing this character after the provided skill levels trainings.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"trainings\"></param>\n        /// <returns></returns>\n        public CharacterScratchpad After<T>(IEnumerable<T> trainings)\n            where T : ISkillLevel\n        {\n            CharacterScratchpad scratchpad = new CharacterScratchpad(this);\n            scratchpad.Train(trainings);\n            return scratchpad;\n        }\n\n        /// <summary>\n        /// Gets a character scratchpad representing this character after a switch to the provided implant set.\n        /// </summary>\n        /// <param name=\"set\">The set.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">set</exception>\n        public CharacterScratchpad After(ImplantSet set)\n        {\n            set.ThrowIfNull(nameof(set));\n\n            CharacterScratchpad scratchpad = new CharacterScratchpad(this);\n            for (int i = 0; i < 5; i++)\n            {\n                EveAttribute attribute = (EveAttribute)i;\n                scratchpad[attribute].ImplantBonus = set[attribute].Bonus;\n            }\n            return scratchpad;\n        }\n\n        /// <summary>\n        /// Gets the time span for a specific number of skill points.\n        /// </summary>\n        /// <param name=\"points\">The points to calculate points.</param>\n        /// <param name=\"skill\">The skill to train.</param>\n        /// <returns></returns>\n        public TimeSpan GetTimeSpanForPoints(StaticSkill skill, long points) \n            => GetTrainingTime(points, GetBaseSPPerHour(skill));\n\n        /// <summary>\n        /// Gets the required skill injectors for the specified skill points.\n        /// </summary>\n        /// <param name=\"skillPoints\">The skill points.</param>\n        /// <returns></returns>\n        public SkillInjectorsRequired GetRequiredSkillInjectorsForSkillPoints(long skillPoints)\n        {\n            long remainingSkillPoints = skillPoints, targetSP = SkillPoints + skillPoints;\n            int injectorsLarge = 0, injectorsSmall = 0;\n\n            while (remainingSkillPoints > 0)\n            {\n                long projectedSkillPoints = targetSP - remainingSkillPoints;\n                long nextInjector = GetSkillPointsGainedFromLargeInjector(projectedSkillPoints);\n                // Can we use smalls instead?\n                if (remainingSkillPoints < nextInjector)\n                {\n                    long nextSmallInjector = nextInjector / SKILL_INJECTOR_SMALL_DIVIDER;\n                    remainingSkillPoints -= nextSmallInjector;\n                    injectorsSmall++;\n                }\n                else\n                {\n                    remainingSkillPoints -= nextInjector;\n                    injectorsLarge++;\n                }\n            }\n\n            return new SkillInjectorsRequired(injectorsLarge, injectorsSmall);\n        }\n\n        /// <summary>\n        /// Gets the skill points gained from a large injector.\n        /// </summary>\n        /// <param name=\"skillPoints\">The start skill points.</param>\n        /// <returns></returns>\n        private static long GetSkillPointsGainedFromLargeInjector(long skillPoints)\n        {\n            double sp = skillPoints / 1000000d;\n            if (sp < 5.0)\n                return 5 * SKILL_INJECTOR_MULTIPLIER;\n            if (sp < 50.0)\n                return 4 * SKILL_INJECTOR_MULTIPLIER;\n            if (sp < 80.0)\n                return 3 * SKILL_INJECTOR_MULTIPLIER;\n            return (long)(1.5 * SKILL_INJECTOR_MULTIPLIER);\n        }\n        \n        #endregion\n\n\n        #region GetSPToTrain\n\n        /// <summary>\n        /// Computes the number of SP to train.\n        /// </summary>\n        /// <param name=\"skillLevel\">The skill level.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">skillLevel</exception>\n        public long GetSPToTrain(ISkillLevel skillLevel)\n        {\n            skillLevel.ThrowIfNull(nameof(skillLevel));\n\n            return GetSPToTrain(skillLevel.Skill, skillLevel.Level);\n        }\n\n        /// <summary>\n        /// Computes the number of SP to train.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"level\"></param>\n        /// <param name=\"origin\"></param>\n        /// <returns></returns>\n        private long GetSPToTrain(StaticSkill skill, long level, TrainingOrigin origin = TrainingOrigin.FromCurrent)\n        {\n            if (level == 0)\n                return 0;\n            long sp = skill.GetPointsRequiredForLevel(level);\n\n            // Deals with the origin\n            long result;\n            switch (origin)\n            {\n                // Include current SP\n                case TrainingOrigin.FromCurrent:\n                    result = sp - GetSkillPoints(skill);\n                    break;\n\n                // This level only (previous are known)\n                case TrainingOrigin.FromPreviousLevel:\n                    result = sp - skill.GetPointsRequiredForLevel(level - 1);\n                    break;\n\n                case TrainingOrigin.FromPreviousLevelOrCurrent:\n                    result = sp - Math.Max(GetSkillPoints(skill), skill.GetPointsRequiredForLevel(level - 1));\n                    break;\n\n                // Include nothing\n                default:\n                    result = sp;\n                    break;\n            }\n\n            // Returns result\n            return result < 0 ? 0 : result;\n        }\n\n        #endregion\n\n\n        #region GetTrainingTime & GetTrainingTimeToMultipleSkills\n\n        /// <summary>\n        /// Computes the training time for the given skill.\n        /// </summary>\n        /// <param name=\"skillLevel\">The skill level.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">skillLevel</exception>\n        public TimeSpan GetTrainingTime(ISkillLevel skillLevel)\n        {\n            skillLevel.ThrowIfNull(nameof(skillLevel));\n\n            return GetTrainingTime(skillLevel.Skill, skillLevel.Level);\n        }\n\n        /// <summary>\n        /// Computes the training time for the given skill.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"level\"></param>\n        /// <param name=\"origin\"></param>\n        /// <returns></returns>\n        public TimeSpan GetTrainingTime(StaticSkill skill, long level, TrainingOrigin origin = TrainingOrigin.FromCurrent)\n        {\n            float spPerHour = GetBaseSPPerHour(skill);\n            long sp = GetSPToTrain(skill, level, origin);\n            return GetTrainingTime(sp, spPerHour);\n        }\n\n        /// <summary>\n        /// Gets the time to train the given SP at the provided speed.\n        /// </summary>\n        /// <param name=\"sp\"></param>\n        /// <param name=\"spPerHour\"></param>\n        /// <returns></returns>\n        private static TimeSpan GetTrainingTime(long sp, float spPerHour)\n            => Math.Abs(spPerHour) < float.Epsilon ? TimeSpan.FromDays(999.0) : TimeSpan.FromHours(sp / spPerHour);\n\n        /// <summary>\n        /// Gets the time require to train the given skills and their prerequisites.\n        /// </summary>\n        /// <param name=\"trainings\">A sequence of pairs of skills and the target levels.</param>\n        /// <returns></returns>\n        public TimeSpan GetTrainingTimeToMultipleSkills(IEnumerable<ISkillLevel> trainings)\n            => After(trainings).TrainingTime;\n\n        #endregion\n\n\n        #region ICharacter non-abstract explicit members\n\n        /// <summary>\n        /// Gets the <see cref=\"ICharacterAttribute\"/> with the specified attribute.\n        /// </summary>\n        /// <value></value>\n        public ICharacterAttribute this[EveAttribute attribute] => GetAttribute(attribute);\n\n        /// <summary>\n        /// Gets the intelligence.\n        /// </summary>\n        /// <value>The intelligence.</value>\n        public ICharacterAttribute Intelligence => GetAttribute(EveAttribute.Intelligence);\n\n        /// <summary>\n        /// Gets the perception.\n        /// </summary>\n        /// <value>The perception.</value>\n        public ICharacterAttribute Perception => GetAttribute(EveAttribute.Perception);\n\n        /// <summary>\n        /// Gets the willpower.\n        /// </summary>\n        /// <value>The willpower.</value>\n        public ICharacterAttribute Willpower => GetAttribute(EveAttribute.Willpower);\n\n        /// <summary>\n        /// Gets the charisma.\n        /// </summary>\n        /// <value>The charisma.</value>\n        public ICharacterAttribute Charisma => GetAttribute(EveAttribute.Charisma);\n\n        /// <summary>\n        /// Gets the memory.\n        /// </summary>\n        /// <value>The memory.</value>\n        public ICharacterAttribute Memory => GetAttribute(EveAttribute.Memory);\n\n        #endregion\n\n        /// <summary>\n        /// Reports how many skill injectors are required to receive the expected SP.\n        /// </summary>\n        public struct SkillInjectorsRequired\n        {\n            public int Large { get; }\n\n            public int Small { get; }\n\n            public int Total\n            {\n                get\n                {\n                    return Large + Small;\n                }\n            }\n\n            internal SkillInjectorsRequired(int large, int small)\n            {\n                Large = large;\n                Small = small;\n            }\n\n            public override string ToString()\n            {\n                string display;\n                if (Large > 0)\n                {\n                    if (Small == 1 && Large == 1)\n                        display = \"1 Large and 1 Small Skill Injector\";\n                    else if (Small > 0)\n                        // 2 Large and 2 Small Skill Injectors\n                        display = string.Format(\"{0:D} Large and {1:D} Small Skill Injectors\",\n                            Large, Small);\n                    else\n                        // 1 Large Skill Injector(s)\n                        display = string.Format(\"{0:D} Large Skill Injector{1}\", Large,\n                            Large.S());\n                }\n                else\n                    // 3 Small Skill Injector(s)\n                    display = string.Format(\"{0:D} Small Skill Injector{1}\", Small, Small.S());\n                return display;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/BasePlan.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a character's plan\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public abstract class BasePlan : ReadonlyCollection<PlanEntry>\n    {\n        private readonly PlanEntry[] m_lookup;\n        private string m_name;\n        private string m_description;\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        protected BasePlan(BaseCharacter character)\n        {\n            m_lookup = new PlanEntry[StaticSkills.ArrayIndicesCount * 5];\n            Character = character;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the plan's name.\n        /// </summary>\n        public string Name\n        {\n            get { return m_name; }\n            set\n            {\n                m_name = value;\n                if (IsConnected)\n                    EveMonClient.OnPlanNameChanged((Plan)this);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the plan's description.\n        /// </summary>\n        public string Description\n        {\n            get { return m_description; }\n            set\n            {\n                m_description = value;\n                if (IsConnected)\n                    EveMonClient.OnPlanNameChanged((Plan)this);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets true if the plan is connected to a character and will send notifications.\n        /// When false, it's just a computing helper.\n        /// </summary>\n        internal bool IsConnected { get; set; }\n        \n        /// <summary>\n        /// Gets or sets the implant set chosen by the user.\n        /// </summary>\n        public ImplantSet ChosenImplantSet { get; set; }\n\n        /// <summary>\n        /// Gets the owner of this plan.\n        /// </summary>\n        public BaseCharacter Character { get; }\n\n        /// <summary>\n        /// Does the plan contain obsolete entries.\n        /// </summary>\n        public bool ContainsObsoleteEntries\n        {\n            get\n            {\n                using (SuspendingEvents())\n                {\n                    if (Items.Any(pe => Character.GetSkillLevel(pe.Skill) >= pe.Level))\n                        return true;\n                }\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// List of Obsolete Entires.\n        /// </summary>\n        public IEnumerable<PlanEntry> ObsoleteEntries\n        {\n            get\n            {\n                using (SuspendingEvents())\n                {\n                    foreach (PlanEntry pe in Items.Where(pe => Character.GetSkillLevel(pe.Skill) >= pe.Level))\n                    {\n                        yield return pe;\n                    }\n                }\n            }\n        }\n\n        #endregion\n\n\n        #region Event firing and suppression\n\n        /// <summary>\n        /// Returns an <see cref=\"IDisposable\"/> object which suspends events notification and will resume them once disposed.\n        /// </summary>\n        /// <returns></returns>\n        public abstract IDisposable SuspendingEvents();\n\n        /// <summary>\n        /// Notify changes happened in the entries\n        /// </summary>\n        internal abstract void OnChanged(PlanChange change);\n\n        #endregion\n\n\n        #region Statistics\n\n        /// <summary>\n        /// Gets the total training time for this plan\n        /// </summary>\n        public TimeSpan TotalTrainingTime => GetTotalTime(null, true);\n\n        /// <summary>\n        /// Gets the total training time for this plan, using the given scratchpad.\n        /// </summary>\n        /// <param name=\"scratchpad\">The scratchpad to use for the computation, may be null.</param>\n        /// <param name=\"applyRemappingPoints\"></param>\n        /// <returns></returns>\n        public TimeSpan GetTotalTime(CharacterScratchpad scratchpad, bool applyRemappingPoints)\n        {\n            // No scratchpad ? Let's create one\n            if (scratchpad == null)\n                scratchpad = new CharacterScratchpad(Character);\n\n            // Train entries\n            TimeSpan time = TimeSpan.Zero;\n            scratchpad.TrainEntries(Items, applyRemappingPoints);\n            return scratchpad.TrainingTime - time;\n        }\n\n        /// <summary>\n        /// Gets the total number of unique skills (two levels of same skill counts for one unique skill).\n        /// </summary>\n        public int UniqueSkillsCount => Items.GetUniqueSkillsCount();\n\n        /// <summary>\n        /// Gets the number of not known skills selected (two levels of same skill counts for one unique skill).\n        /// </summary>\n        public int NotKnownSkillsCount => Items.GetNotKnownSkillsCount();\n\n        /// <summary>\n        /// Gets the total cost of the skill books, in ISK\n        /// </summary>\n        public long TotalBooksCost => Items.GetTotalBooksCost();\n\n        /// <summary>\n        /// Gets the cost of the not known skill books, in ISK\n        /// </summary>\n        public long NotKnownSkillBooksCost => Items.GetNotKnownSkillBooksCost();\n\n        /// <summary>\n        /// Gets the skill points of the planned skill levels\n        /// </summary>\n        public long TotalSkillPoints => Items.GetTotalSkillPoints();\n\n        #endregion\n\n\n        #region General purpose methods\n\n        /// <summary>\n        /// Gets the entry matching the given parameters.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"level\">The level.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">skill</exception>\n        public PlanEntry GetEntry(StaticSkill skill, long level)\n        {\n            skill.ThrowIfNull(nameof(skill));\n\n            long index = skill.ArrayIndex * 5 + level - 1;\n\n            return level == 0 || index > m_lookup.LongLength ? null : m_lookup[index];\n        }\n\n        /// <summary>\n        /// Adds the given entry into the items list and the lookup.\n        /// </summary>\n        /// <param name=\"entry\">The entry.</param>\n        /// <exception cref=\"System.ArgumentNullException\">entry</exception>\n        protected void AddCore(PlanEntry entry)\n        {\n            entry.ThrowIfNull(nameof(entry));\n\n            Items.Add(entry);\n            m_lookup[entry.Skill.ArrayIndex * 5 + entry.Level - 1] = entry;\n            OnChanged(PlanChange.All);\n        }\n\n        /// <summary>\n        /// Inserts the given entry into the items list and the lookup.\n        /// </summary>\n        /// <param name=\"index\">The index.</param>\n        /// <param name=\"entry\">The entry.</param>\n        /// <exception cref=\"System.ArgumentNullException\">entry</exception>\n        protected void InsertCore(int index, PlanEntry entry)\n        {\n            entry.ThrowIfNull(nameof(entry));\n\n            Items.Insert(index, entry);\n            m_lookup[entry.Skill.ArrayIndex * 5 + entry.Level - 1] = entry;\n            OnChanged(PlanChange.All);\n        }\n\n        /// <summary>\n        /// Inserts the given entry into the items list and the lookup.\n        /// </summary>\n        /// <param name=\"index\"></param>\n        protected void RemoveCore(int index)\n        {\n            PlanEntry entry = Items[index];\n            Items.RemoveAt(index);\n            m_lookup[entry.Skill.ArrayIndex * 5 + entry.Level - 1] = null;\n            OnChanged(PlanChange.All);\n        }\n\n        /// <summary>\n        /// Move the given entry from the specified index to the provided target index.\n        /// </summary>\n        /// <param name=\"startIndex\"></param>\n        /// <param name=\"targetIndex\"></param>\n        protected void MoveCore(int startIndex, int targetIndex)\n        {\n            PlanEntry entry = Items[startIndex];\n            Items.RemoveAt(startIndex);\n            Items.Insert(targetIndex, entry);\n            OnChanged(PlanChange.All);\n        }\n\n        /// <summary>\n        /// Gets the index of the matching entry.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"level\"></param>\n        /// <returns>The index of the matching entry when found, -1 otherwise.</returns>\n        protected int IndexOf(StaticSkill skill, long level)\n        {\n            PlanEntry entry = GetEntry(skill, level);\n            if (entry == null)\n                return -1;\n            return Items.IndexOf(entry);\n        }\n\n        /// <summary>\n        /// Gets true if the given skill is planned.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <returns></returns>\n        public bool IsPlanned(StaticSkill skill)\n        {\n            for (int i = 0; i <= 5; i++)\n            {\n                if (IsPlanned(skill, i))\n                    return true;\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// Gets true if the skill is planned at the given level.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"level\">The level.</param>\n        /// <returns></returns>\n        public bool IsPlanned(StaticSkill skill, long level) => GetEntry(skill, level) != null;\n\n        /// <summary>\n        /// Gets the highest planned level of the given skill.\n        /// </summary>\n        /// <param name=\"staticSkill\"></param>\n        /// <returns>The highest planned level, or 0 if the skill is not planned.</returns>\n        public int GetPlannedLevel(StaticSkill staticSkill)\n        {\n            for (int i = 5; i > 0; i--)\n            {\n                if (IsPlanned(staticSkill, i))\n                    return i;\n            }\n            return 0;\n        }\n\n        /// <summary>\n        /// Checks whether the given skill level can be planned. Used to enable or disable the \"Plan To N\" and \"Remove\" menu options.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"level\">A integer between 0 (remove all entries for this skill) and 5.</param>\n        /// <returns></returns>\n        internal bool EnablePlanTo(Skill skill, int level)\n        {\n            // The entry actually wants to remove the item\n            if (level == 0)\n                return IsPlanned(skill);\n\n            // The entry is already known\n            if (skill.Level >= level)\n                return false;\n\n            // The entry is already planned at this very level ?\n            return GetPlannedLevel(skill) != level;\n        }\n\n        #endregion\n\n\n        #region Core methods for dealing with prerequisites and priorities\n\n        /// <summary>\n        /// Adds the missing prerequisites and fix the prerequisites order\n        /// </summary>\n        /// <remarks>Complexity is O(n²) on the average and O(n^3) on the worst-case.</remarks>\n        public void FixPrerequisites()\n        {\n            if (!Items.Any() || (Items.Last().CharacterSkill != null && Items.Last().CharacterSkill.IsKnown))\n                return;\n\n            // Scroll through entries\n            for (int i = 0; i < Items.Count; i++)\n            {\n                PlanEntry entry = Items[i];\n                bool jumpBack = false;\n\n                // Scroll through prerequisites\n                if (entry.Skill.Prerequisites.Any(\n                    prereq => !EnsurePrerequisiteExistBefore(prereq.Skill, prereq.Level, i, entry.Priority)))\n                {\n                    jumpBack = true;\n                    i--;\n                }\n\n                // We went through all the prerequisites, we're now left with the previous level of this skill.\n                if (jumpBack)\n                    continue;\n\n                // Did we have to insert or move an entry for this previous level ?\n                if (!EnsurePrerequisiteExistBefore(entry.Skill, entry.Level - 1, i, entry.Priority))\n                {\n                    // Then, we jump back to this new entry\n                    i--;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Checks whether a matching entry exists between before the provided <c>insertionIndex</c>.\n        /// If the entry exist and is trained, remove it.\n        /// If the entry exist later, it is moved to this <c>insertionIndex</c>.\n        /// If the entry does not exit, it is inserted at <c>insertionIndex</c>.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"level\"></param>\n        /// <param name=\"insertionIndex\"></param>\n        /// <param name=\"newEntriesPriority\"></param>\n        /// <returns>True if the searched entry existed or is already trained; false if an insertion or a move was required.</returns>\n        private bool EnsurePrerequisiteExistBefore(StaticSkill skill, long level, int insertionIndex, int newEntriesPriority)\n        {\n            int skillIndex = IndexOf(skill, level);\n\n            // Is the level already trained by the character ?\n            if (Character.GetSkillLevel(skill) >= level)\n            {\n                // If the level is planned, remove it\n                if (skillIndex != -1)\n                    RemoveCore(skillIndex);\n\n                return true;\n            }\n\n            // Is the prerequisite already planned before this very entry ?\n            // Then we continue the foreach loop to the next prereq\n            if (skillIndex != -1 && skillIndex < insertionIndex)\n                return true;\n\n            // The prerequisite is not planned yet, we insert it just before this very entry\n            if (skillIndex == -1)\n            {\n                PlanEntry newEntry = new PlanEntry(this, skill, level)\n                { Type = PlanEntryType.Prerequisite, Priority = newEntriesPriority };\n\n                InsertCore(insertionIndex, newEntry);\n                return false;\n            }\n\n            // The prerequisite exists but it's located later in the plan\n            // So we move it at the insertion index\n            MoveCore(skillIndex, insertionIndex);\n            return false;\n        }\n\n        /// <summary>\n        /// Check that the plan has a consistant set of priorities (i.e. pre-reqs have a higher priority\n        /// than dependant skills\n        /// </summary>\n        /// <remarks>This methods relies on the assumption that prerequisites order is correct.</remarks>\n        /// <param name=\"fixConflicts\">When true, conflicts will be fixed.</param>\n        /// <param name=\"loweringPriorities\">When true, conflicts are solved by setting all dependant skills to the priority of their prerequisites.\n        /// <para>When false, conflicts are solved by setting the priority of the prerequisites to the same as the highest priority of any dependant skill.</para></param>\n        /// <returns>True whether the priorities were ok, false otherwise</returns>\n        protected bool FixPrioritiesOrder(bool fixConflicts, bool loweringPriorities)\n        {\n            bool planOK = true;\n\n            // Check all plan entries\n            for (int i = 0; i < Items.Count; i++)\n            {\n                PlanEntry pe = Items[i];\n                int highestDepPriority = GetHighestDependencyPriority(i);\n\n                // Find all dependants on this skill and get the highest priority\n                if (pe.Priority <= highestDepPriority)\n                    continue;\n\n                if (!fixConflicts)\n                    return false;\n\n                if (loweringPriorities)\n                    LowerDependenciesPriorities(i);\n                else\n                    pe.Priority = highestDepPriority;\n\n                planOK = false;\n            }\n            return planOK;\n        }\n\n        /// <summary>\n        /// Gets the highest priority of all dependants of a skill (skills who has the given parameter as a prerequisite).\n        /// </summary>\n        /// <remarks>This methods relies on the assumption that prerequisites order is correct.</remarks>\n        /// <param name=\"posSkillToCheck\">Position of the prerequisite skill</param>\n        private int GetHighestDependencyPriority(int posSkillToCheck)\n        {\n            int highestDepPriority = 99;\n            PlanEntry pEntry = Items[posSkillToCheck];\n\n            // Scroll through successive skills\n            for (int j = posSkillToCheck + 1; j < Items.Count; j++)\n            {\n                PlanEntry entry = Items[j];\n\n                // Is it either a prerequisite or a previous level ?\n                if (entry.IsDependentOf(pEntry))\n                    highestDepPriority = Math.Min(entry.Priority, highestDepPriority);\n            }\n\n            return highestDepPriority;\n        }\n\n        /// <summary>\n        /// Lower priorities of all dependant skills to match parent skill\n        /// </summary>\n        /// <remarks>This methods relies on the assumption that prerequisites order is correct.</remarks>\n        /// <param name=\"posSkill\">Position of parent skill</param>\n        private void LowerDependenciesPriorities(int posSkill)\n        {\n            PlanEntry entry = Items[posSkill];\n\n            // Scroll through successive skills\n            for (int j = posSkill + 1; j < Items.Count; ++j)\n            {\n                PlanEntry pEntry = Items[j];\n\n                // Is it either a prerequisite or a previous level ?\n                if (pEntry.IsDependentOf(entry))\n                    pEntry.Priority = Math.Max(pEntry.Priority, entry.Priority);\n            }\n        }\n\n        /// <summary>\n        /// Gets the minimum level the given skill is required by other entries.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <returns>The minimum required level, between 0 and 5.</returns>\n        public long GetMinimumLevel(IStaticSkill skill)\n        {\n            // Search the minimum level this skill is required by other entries\n            long minNeeded = 0;\n            foreach (PlanEntry pe in Items)\n            {\n                long required;\n                StaticSkill tSkill = pe.Skill;\n\n                if (!tSkill.HasAsPrerequisite(skill, out required) || tSkill == skill)\n                    continue;\n\n                // All 5 levels are needed, fail now\n                if (required == 5)\n                    return 5;\n                minNeeded = Math.Max(minNeeded, required);\n            }\n            return minNeeded;\n        }\n\n        #endregion\n\n\n        #region Insertion and removal\n\n        /// <summary>\n        /// Gets true whether a skill set is already planned\n        /// </summary>\n        /// <param name=\"skillsToAdd\"></param>\n        /// <returns></returns>\n        public bool AreSkillsPlanned(IEnumerable<StaticSkillLevel> skillsToAdd)\n            => skillsToAdd.All(item => IsPlanned(item.Skill, item.Level));\n\n        /// <summary>\n        /// Rebuild the plan from the given entries enumeration.\n        /// </summary>\n        /// <remarks>Entries from another plan will be cloned.</remarks>\n        /// <param name=\"entries\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">entries</exception>\n        public void RebuildPlanFrom(IEnumerable<PlanEntry> entries)\n        {\n            entries.ThrowIfNull(nameof(entries));\n\n            using (SuspendingEvents())\n            {\n                Items.Clear();\n                for (int i = 0; i < m_lookup.Length; i++)\n                {\n                    m_lookup[i] = null;\n                }\n\n                foreach (PlanEntry entry in entries)\n                {\n                    AddCore(entry.Plan != this ? entry.Clone(this) : entry);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Rebuild the plan from the given entries enumeration.\n        /// </summary>\n        /// <param name=\"entries\">The entries.</param>\n        /// <param name=\"preserveOldEntries\">When true, old entries will be reused as often as possible, preserving their statistics.</param>\n        /// <exception cref=\"System.ArgumentNullException\">entries</exception>\n        /// <remarks>\n        /// Entries from another plan will be cloned.\n        /// </remarks>\n        public void RebuildPlanFrom(IEnumerable<PlanEntry> entries, bool preserveOldEntries)\n        {\n            entries.ThrowIfNull(nameof(entries));\n\n            if (!preserveOldEntries)\n            {\n                RebuildPlanFrom(entries);\n                return;\n            }\n\n            using (SuspendingEvents())\n            {\n                // Save the old entries\n                SkillLevelSet<PlanEntry> set = new SkillLevelSet<PlanEntry>();\n                foreach (PlanEntry entry in Items)\n                {\n                    set[entry.Skill, entry.Level] = entry;\n                }\n\n                // Clear items\n                Items.Clear();\n                for (int i = 0; i < m_lookup.Length; i++)\n                {\n                    m_lookup[i] = null;\n                }\n\n                // Add the new entries\n                foreach (PlanEntry entry in entries)\n                {\n                    PlanEntry oldEntry = set[entry.Skill, entry.Level];\n\n                    PlanEntry entryToAdd;\n                    if (entry.Plan != this)\n                        entryToAdd = entry.Clone(this);\n                    else if (oldEntry != null)\n                        entryToAdd = oldEntry;\n                    else\n                        entryToAdd = entry;\n\n                    AddCore(entryToAdd);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Given a list of skill to remove, we return a list of entries also including all dependencies. No entry is removed by this method.\n        /// </summary>\n        /// <returns>A list of all the entries to remove.</returns>\n        protected IEnumerable<PlanEntry> GetAllEntriesToRemove<T>(IEnumerable<T> skillsToRemove)\n            where T : ISkillLevel\n        {\n            SkillLevelSet<PlanEntry> entriesSet = new SkillLevelSet<PlanEntry>();\n            List<PlanEntry> planEntries = new List<PlanEntry>();\n\n            // For every items to add\n            foreach (T itemToRemove in skillsToRemove.Where(\n                itemToRemove => IsPlanned(itemToRemove.Skill, itemToRemove.Level)).Where(\n                    itemToRemove => !entriesSet.Contains(itemToRemove)))\n            {\n                // Let's first gather dependencies\n                foreach (PlanEntry dependencyEntry in Items.Where(\n                    dependencyEntry => !entriesSet.Contains(dependencyEntry)).Where(\n                        dependencyEntry => dependencyEntry.IsDependentOf(itemToRemove)))\n                {\n                    // Gather this entry\n                    planEntries.Add(dependencyEntry);\n                    entriesSet.Set(dependencyEntry);\n                }\n\n                // Then add the item itself\n                PlanEntry entryToRemove = GetEntry(itemToRemove.Skill, itemToRemove.Level);\n                planEntries.Add(entryToRemove);\n                entriesSet.Set(entryToRemove);\n            }\n\n            return planEntries;\n        }\n\n        /// <summary>\n        /// Given a list of skill to add, we return a list of all entries to add, also including all dependencies. No entry is added by this method.\n        /// </summary>\n        /// <param name=\"skillsToAdd\">The enumerations of skills to add.</param>\n        /// <param name=\"note\">The note for new entries.</param>\n        /// <param name=\"lowestPrereqPriority\">The lowest priority (highest number) among all the prerequisites.</param>\n        /// <returns>A list of all the entries to add.</returns>\n        protected IEnumerable<PlanEntry> GetAllEntriesToAdd<T>(IEnumerable<T> skillsToAdd, string note,\n            out int lowestPrereqPriority)\n            where T : ISkillLevel\n        {\n            SkillLevelSet<PlanEntry> entriesSet = new SkillLevelSet<PlanEntry>();\n            List<PlanEntry> planEntries = new List<PlanEntry>();\n            lowestPrereqPriority = 1;\n\n            // For every items to add\n            foreach (T itemToAdd in skillsToAdd.Where(\n                itemToAdd => Character.GetSkillLevel(itemToAdd.Skill) < itemToAdd.Level))\n            {\n                // Already planned ? We update the lowestPrereqPriority and skip it.\n                if (IsPlanned(itemToAdd.Skill, itemToAdd.Level))\n                {\n                    lowestPrereqPriority = Math.Max(GetEntry(itemToAdd.Skill, itemToAdd.Level).Priority, lowestPrereqPriority);\n                    continue;\n                }\n\n                // Let's first add dependencies excluding those that the dependent skill is already trained\n                StaticSkillLevel item = new StaticSkillLevel(itemToAdd);\n\n                if (Character.GetSkillLevel(itemToAdd.Skill) < 1)\n                {\n                    foreach (StaticSkillLevel dependency in item.AllDependencies.Where(\n                        dependency => !entriesSet.Contains(dependency) && dependency.Skill != item.Skill &&\n                                      Character.GetSkillLevel(dependency.Skill) < dependency.Level)\n                        .Select(dependency => new\n                        {\n                            dependency,\n                            depItems = item.AllDependencies.Where(\n                                dep => item.Skill != dep.Skill &&\n                                       dep.Skill.Prerequisites.Any(\n                                           prereq => prereq.Skill == dependency.Skill))\n                        })\n                        .Where(dep => !dep.depItems.Any() ||\n                                      !dep.depItems.All(depItem => Character.GetSkillLevel(depItem.Skill) >= depItem.Level))\n                        .Select(dep => dep.dependency))\n                    {\n                        // Create an entry (even for existing ones, we will update them later from those new entries)\n                        PlanEntry dependencyEntry = CreateEntryToAdd(dependency.Skill, dependency.Level,\n                            PlanEntryType.Prerequisite, note, ref lowestPrereqPriority);\n                        planEntries.Add(dependencyEntry);\n                        entriesSet.Set(dependencyEntry);\n                    }\n\n                    // Already in the \"entries to add\" list ? We skip it (done at this point only because of recursive prereqs)\n                    if (entriesSet.Contains(itemToAdd))\n                        continue;\n                }\n\n                // Then add the item itself\n                PlanEntry entry = CreateEntryToAdd(itemToAdd.Skill, itemToAdd.Level,\n                    PlanEntryType.Planned, note, ref lowestPrereqPriority);\n                planEntries.Add(entry);\n                entriesSet.Set(entry);\n            }\n\n            return planEntries;\n        }\n\n        /// <summary>\n        /// Creates an entry that should be later added\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"level\"></param>\n        /// <param name=\"type\"></param>\n        /// <param name=\"note\"></param>\n        /// <param name=\"lowestPrereqPriority\"></param>\n        /// <returns></returns>\n        private PlanEntry CreateEntryToAdd(StaticSkill skill, long level, PlanEntryType type, string note,\n            ref int lowestPrereqPriority)\n        {\n            PlanEntry entry = GetEntry(skill, level);\n\n            // So we have to create a new entry. We first check it's not already learned or something\n            if (entry == null)\n            {\n                return new PlanEntry(null, skill, level)\n                {\n                    Type = type,\n                    Notes = note\n                };\n            }\n\n            // If the entry is already in the plan, we create an entry that will never be added to the plan.\n            // However, the existing entry's notes and priotity will be updated from this new entry\n\n            // Is the priority the lowest so far (higher numbers = lower priority) ?\n            int priority = entry.Priority;\n            lowestPrereqPriority = Math.Max(priority, lowestPrereqPriority);\n\n            //Skill at this level is planned - just update the Note.\n            entry = new PlanEntry(null, skill, level) { Priority = priority, Type = type, Notes = note };\n            return entry;\n        }\n\n        #endregion\n\n\n        #region Priorities changes\n\n        /// <summary>\n        /// Set the priorities by force, fixing conflicts when required.\n        /// </summary>\n        /// <param name=\"displayPlan\">The display plan.</param>\n        /// <param name=\"entries\">The list of entries to change priority of</param>\n        /// <param name=\"priority\">The new priority to set</param>\n        /// <exception cref=\"System.ArgumentNullException\">entries</exception>\n        public void SetPriority(IEnumerable<PlanEntry> displayPlan, IEnumerable<PlanEntry> entries, int priority)\n        {\n            entries.ThrowIfNull(nameof(entries));\n\n            // Change priorities and determine how conflicts are going to be fixed\n            bool loweringPriorities = true;\n            foreach (PlanEntry entry in entries)\n            {\n                loweringPriorities &= priority > entry.Priority;\n                entry.Priority = priority;\n            }\n\n            // We are rebuilding the plan with the new priorities\n            RebuildPlanFrom(displayPlan, true);\n\n            // Fix things up\n            FixPrioritiesOrder(true, loweringPriorities);\n            OnChanged(PlanChange.Notification);\n        }\n\n        /// <summary>\n        /// Removes completed skills\n        /// </summary>\n        public void CleanObsoleteEntries(ObsoleteRemovalPolicy policy)\n        {\n            using (SuspendingEvents())\n            {\n                for (int i = 0; i < Items.Count; i++)\n                {\n                    PlanEntry pe = Items[i];\n                    if (Character.GetSkillLevel(pe.Skill) < pe.Level)\n                        continue;\n\n                    // Confirmed by API?\n                    if (policy == ObsoleteRemovalPolicy.ConfirmedOnly &&\n                        pe.CharacterSkill.LastConfirmedLvl < pe.Level)\n                        continue;\n\n                    Items.RemoveAt(i);\n                    m_lookup[pe.Skill.ArrayIndex * 5 + pe.Level - 1] = null;\n\n                    i--;\n                }\n            }\n        }\n\n        #endregion\n\n\n        #region Certificates\n\n        /// <summary>\n        /// Checks whether, after this plan, the owner will be eligible to the provided certificate\n        /// </summary>\n        /// <param name=\"certLevel\">The cert level.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">certLevel</exception>\n        public bool WillGrantEligibilityFor(CertificateLevel certLevel)\n        {\n            certLevel.ThrowIfNull(nameof(certLevel));\n\n            if (certLevel.IsTrained)\n                return true;\n\n            // We check every prerequisite is trained\n            return !certLevel.PrerequisiteSkills.Select(\n                skillToTrain => new { skillToTrain, skill = skillToTrain.Skill }).Where(\n                    skillToTrain => skillToTrain.skill.Level < skillToTrain.skillToTrain.Level).Where(\n                        skillToTrain => !IsPlanned(skillToTrain.skill, skillToTrain.skillToTrain.Level)).Select(\n                            skill => skill.skillToTrain).Any();\n        }\n\n        #endregion\n\n\n        #region Masteries\n\n        /// <summary>\n        /// Checks whether, after this plan, the owner will be eligible to the provided mastery\n        /// </summary>\n        /// <param name=\"masteryLevel\">The mastery level.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">masteryLevel</exception>\n        public bool WillGrantEligibilityFor(Mastery masteryLevel)\n        {\n            masteryLevel.ThrowIfNull(nameof(masteryLevel));\n\n            if (masteryLevel.IsTrained)\n                return true;\n\n            Character character = Character as Character;\n\n            // We check every prerequisite is trained\n            return !masteryLevel.Select(mcert => mcert.ToCharacter(character).GetCertificateLevel(masteryLevel.Level))\n                .SelectMany(cert => cert.PrerequisiteSkills)\n                .Select(skillToTrain => new { skillToTrain, skill = skillToTrain.Skill })\n                .Where(skillToTrain => skillToTrain.skill.Level < skillToTrain.skillToTrain.Level)\n                .Where(skillToTrain => !IsPlanned(skillToTrain.skill, skillToTrain.skillToTrain.Level))\n                .Select(skill => skill.skillToTrain)\n                .Any();\n        }\n\n        #endregion\n\n\n        #region Sort\n\n        /// <summary>\n        /// Sort this plan\n        /// </summary>\n        /// <param name=\"sort\"></param>\n        /// <param name=\"reverseOrder\"></param>\n        /// <param name=\"groupByPriority\"></param>\n        private void Sort(PlanEntrySort sort, bool reverseOrder, bool groupByPriority)\n        {\n            // Perform the sort\n            IEnumerable<PlanEntry> entries = new PlanEntrySorter(Character, Items, sort, reverseOrder, groupByPriority).Sort();\n\n            // Update plan\n            RebuildPlanFrom(entries);\n        }\n\n        /// <summary>\n        /// Sorts a plan according to the given settings.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        /// <exception cref=\"System.ArgumentNullException\">settings</exception>\n        public void Sort(PlanSorting settings)\n        {\n            settings.ThrowIfNull(nameof(settings));\n\n            PlanEntrySort criteria = settings.Order == ThreeStateSortOrder.None ? PlanEntrySort.None : settings.Criteria;\n            Sort(criteria, settings.Order == ThreeStateSortOrder.Descending, settings.GroupByPriority);\n        }\n\n        #endregion\n\n\n        #region UpdateTrainingTimes\n\n        /// <summary>\n        /// Updates the statistics of the entries in the same way this character would train this plan.\n        /// </summary>\n        public void UpdateStatistics()\n        {\n            UpdateStatistics(new CharacterScratchpad(Character), true, true);\n        }\n\n        /// <summary>\n        /// Updates the statistics of the entries in the same way the given character would train this plan.\n        /// </summary>\n        /// <param name=\"scratchpad\">The scratchpad.</param>\n        /// <param name=\"applyRemappingPoints\">if set to <c>true</c> [apply remapping points].</param>\n        /// <param name=\"trainSkills\">When true, the character will train every skill, increasing SP, etc.</param>\n        /// <exception cref=\"System.ArgumentNullException\">scratchpad</exception>\n        public void UpdateStatistics(CharacterScratchpad scratchpad, bool applyRemappingPoints, bool trainSkills)\n        {\n            scratchpad.ThrowIfNull(nameof(scratchpad));\n\n            CharacterScratchpad scratchpadWithoutImplants = scratchpad.Clone();\n            scratchpadWithoutImplants.ClearImplants();\n            DateTime time = DateTime.Now;\n\n            // Update the statistics\n            foreach (PlanEntry entry in Items)\n            {\n                // Apply the remapping\n                if (applyRemappingPoints && entry.Remapping != null &&\n                    entry.Remapping.Status == RemappingPointStatus.UpToDate)\n                {\n                    scratchpad.Remap(entry.Remapping);\n                    scratchpadWithoutImplants.Remap(entry.Remapping);\n                }\n\n                // Update entry's statistics\n                entry.UpdateStatistics(scratchpad, scratchpadWithoutImplants, ref time);\n\n                // Update the scratchpad\n                if (!trainSkills)\n                    continue;\n\n                scratchpad.Train(entry.Skill, entry.Level);\n                scratchpadWithoutImplants.Train(entry.Skill, entry.Level);\n            }\n        }\n\n        /// <summary>\n        /// Updates the statistics of the entries in the same way this character would train this plan.\n        /// </summary>\n        public void UpdateOldTrainingTimes()\n        {\n            UpdateOldTrainingTimes(new CharacterScratchpad(Character.After(ChosenImplantSet)), true, true);\n        }\n\n        /// <summary>\n        /// Updates the statistics of the entries in the same way the given character would train this plan.\n        /// </summary>\n        /// <param name=\"scratchpad\">The scratchpad.</param>\n        /// <param name=\"applyRemappingPoints\">if set to <c>true</c> [apply remapping points].</param>\n        /// <param name=\"trainSkills\">When true, the character will train every skill, increasing SP, etc.</param>\n        /// <exception cref=\"System.ArgumentNullException\">scratchpad</exception>\n        public void UpdateOldTrainingTimes(CharacterScratchpad scratchpad, bool applyRemappingPoints, bool trainSkills)\n        {\n            scratchpad.ThrowIfNull(nameof(scratchpad));\n\n            // Update the statistics\n            foreach (PlanEntry entry in Items)\n            {\n                // Apply the remapping\n                if (applyRemappingPoints && entry.Remapping != null &&\n                    entry.Remapping.Status == RemappingPointStatus.UpToDate)\n                    scratchpad.Remap(entry.Remapping);\n\n                // Update entry's statistics\n                entry.UpdateOldTrainingTime(scratchpad);\n\n                // Update the scratchpad\n                if (trainSkills)\n                    scratchpad.Train(entry.Skill, entry.Level);\n            }\n        }\n\n        #endregion\n\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/BuyOrder.cs",
    "content": "using EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// This class represents a buy order.\n    /// </summary>\n    public sealed class BuyOrder : MarketOrder\n    {\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"issuedFor\">Whether the order was issued for a corporation or a\n        /// character.</param>\n        internal BuyOrder(EsiOrderListItem src, IssuedFor issuedFor, CCPCharacter character)\n            : base(src, issuedFor, character)\n        {\n            Escrow = src.Escrow;\n            Range = src.Range;\n        }\n\n        /// <summary>\n        /// Constructor from an object deserialized from the settings file.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        internal BuyOrder(SerializableOrderBase src, CCPCharacter character)\n            : base(src, character)\n        {\n        }\n\n        /// <summary>\n        /// Gets the amount currently invested in escrow.\n        /// </summary>\n        public decimal Escrow { get; internal set; }\n\n        /// <summary>\n        /// Gets the range of this order.\n        /// </summary>\n        public int Range { get; internal set; }\n\n        /// <summary>\n        /// Gets the description of the range.\n        /// </summary>\n        public string RangeDescription\n        {\n            get\n            {\n                switch (Range)\n                {\n                    case -1:\n                        return \"Station\";\n                    case 0:\n                        return \"Solar System\";\n                    case 1:\n                        return $\"{Range} jump\";\n                    case EveConstants.RegionRange:\n                        return \"Region\";\n                    default:\n                        return $\"{Range} jumps\";\n                }\n            }\n        }\n\n        /// <summary>\n        /// Exports the given object to a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        public override SerializableOrderBase Export() => Export(new SerializableBuyOrder());\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/CCPCharacter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models.Collections;\nusing EVEMon.Common.Models.Extended;\nusing EVEMon.Common.QueryMonitor;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a character from CCP, with additional capacities for training and such.\n    /// </summary>\n    public sealed class CCPCharacter : Character\n    {\n        #region Fields\n\n        private readonly List<MarketOrder> m_endedOrdersForCharacter;\n        private readonly List<MarketOrder> m_endedOrdersForCorporation;\n        private readonly List<Contract> m_endedContractsForCharacter;\n        private readonly List<Contract> m_endedContractsForCorporation;\n        private readonly List<IndustryJob> m_jobsCompletedForCharacter;\n\n        private CharacterDataQuerying m_characterDataQuerying;\n        private CorporationDataQuerying m_corporationDataQuerying;\n        private List<SerializableAPIUpdate> m_lastAPIUpdates;\n\n        private Enum m_errorNotifiedMethod = CCPAPIMethodsEnum.None;\n        private bool m_isFwEnlisted;\n\n        private string m_allianceName;\n        private string m_corporationName;\n\n        #endregion\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Base constructor.\n        /// </summary>\n        /// <param name=\"identity\"></param>\n        /// <param name=\"guid\"></param>\n        private CCPCharacter(CharacterIdentity identity, Guid guid)\n            : base(identity, guid)\n        {\n            QueryMonitors = new QueryMonitorCollection();\n            SkillQueue = new SkillQueue(this);\n            Standings = new StandingCollection(this);\n            Assets = new AssetCollection(this);\n            WalletJournal = new WalletJournalCollection(this);\n            WalletTransactions = new WalletTransactionsCollection(this);\n            CharacterMarketOrders = new MarketOrderCollection(this);\n            CorporationMarketOrders = new MarketOrderCollection(this);\n            CharacterContracts = new ContractCollection(this);\n            CorporationContracts = new ContractCollection(this);\n            CharacterIndustryJobs = new IndustryJobCollection(this);\n            CorporationIndustryJobs = new IndustryJobCollection(this);\n            ResearchPoints = new ResearchPointCollection(this);\n            EVEMailMessages = new EveMailMessageCollection(this);\n            EVEMailingLists = new EveMailingListCollection(this);\n            EVENotifications = new EveNotificationCollection(this);\n            Contacts = new ContactCollection(this);\n            CharacterMedals = new MedalCollection(this);\n            CorporationMedals = new MedalCollection(this);\n            UpcomingCalendarEvents = new UpcomingCalendarEventCollection(this);\n            KillLog = new KillLogCollection(this);\n            PlanetaryColonies = new PlanetaryColonyCollection(this);\n            LoyaltyPoints = new LoyaltyCollection(this);\n\n            m_endedOrdersForCharacter = new List<MarketOrder>();\n            m_endedOrdersForCorporation = new List<MarketOrder>();\n\n            m_endedContractsForCharacter = new List<Contract>();\n            m_endedContractsForCorporation = new List<Contract>();\n\n            m_jobsCompletedForCharacter = new List<IndustryJob>();\n            m_allianceName = EveIDToName.GetIDToName(AllianceID);\n            m_corporationName = EveIDToName.GetIDToName(CorporationID);\n\n            EveMonClient.CharacterAssetsUpdated += EveMonClient_CharacterAssetsUpdated;\n            EveMonClient.CharacterMarketOrdersUpdated += EveMonClient_CharacterMarketOrdersUpdated;\n            EveMonClient.CorporationMarketOrdersUpdated += EveMonClient_CorporationMarketOrdersUpdated;\n            EveMonClient.CharacterContractsUpdated += EveMonClient_CharacterContractsUpdated;\n            EveMonClient.CorporationContractsUpdated += EveMonClient_CorporationContractsUpdated;\n            EveMonClient.CharacterIndustryJobsUpdated += EveMonClient_CharacterIndustryJobsUpdated;\n            EveMonClient.CorporationIndustryJobsUpdated += EveMonClient_CorporationIndustryJobsUpdated;\n            EveMonClient.CharacterIndustryJobsCompleted += EveMonClient_CharacterIndustryJobsCompleted;\n            EveMonClient.CorporationIndustryJobsCompleted += EveMonClient_CorporationIndustryJobsCompleted;\n            EveMonClient.CharacterPlaneteryPinsCompleted += EveMonClient_CharacterPlaneteryPinsCompleted;\n            EveMonClient.ESIKeyInfoUpdated += EveMonClient_ESIKeyInfoUpdated;\n            EveMonClient.EveIDToNameUpdated += EveMonClient_EveIDToNameUpdated;\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n        }\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"identity\">The identity for this character</param>\n        /// <param name=\"serial\">A deserialization object for characters</param>\n        internal CCPCharacter(CharacterIdentity identity, SerializableCCPCharacter serial)\n            : this(identity, serial.Guid)\n        {\n            Import(serial);\n            m_lastAPIUpdates = serial.LastUpdates.ToList();\n        }\n\n        /// <summary>\n        /// Constructor for a new CCP character on a new identity.\n        /// </summary>\n        /// <param name=\"identity\"></param>\n        internal CCPCharacter(CharacterIdentity identity)\n            : this(identity, Guid.NewGuid())\n        {\n            ForceUpdateBasicFeatures = true;\n            m_lastAPIUpdates = new List<SerializableAPIUpdate>();\n        }\n\n        #endregion\n\n\n        #region Public Properties\n        \n        /// <summary>\n        /// Gets an adorned name, with (file), (url) or (cached) labels.\n        /// </summary>\n        public override string AdornedName => !Identity.ESIKeys.Any() || Identity.ESIKeys.All(\n            apiKey => !apiKey.Monitored) || (m_characterDataQuerying != null &&\n            m_characterDataQuerying.CharacterSheetMonitor.HasError) ? $\"{Name} (cached)\" : Name;\n\n        /// <summary>\n        /// Gets the skill queue for this character.\n        /// </summary>\n        public SkillQueue SkillQueue { get; }\n\n        /// <summary>\n        /// Gets the standings for this character.\n        /// </summary>\n        public StandingCollection Standings { get; }\n\n        /// <summary>\n        /// Gets the assets for this character.\n        /// </summary>\n        public AssetCollection Assets { get; }\n\n        /// <summary>\n        /// Gets the factional warfare stats for this character.\n        /// </summary>\n        public FactionalWarfareStats FactionalWarfareStats { get; internal set; }\n\n        /// <summary>\n        /// Gets the wallet journal for this character.\n        /// </summary>\n        public WalletJournalCollection WalletJournal { get; }\n\n        /// <summary>\n        /// Gets the wallet transactions for this character.\n        /// </summary>\n        public WalletTransactionsCollection WalletTransactions { get; }\n\n        /// <summary>\n        /// Gets the collection of market orders.\n        /// </summary>\n        public IEnumerable<MarketOrder> MarketOrders => CharacterMarketOrders.Concat(\n            CorporationMarketOrders.Where(order => order.OwnerID == CharacterID));\n\n        /// <summary>\n        /// Gets or sets the character market orders.\n        /// </summary>\n        /// <value>The character market orders.</value>\n        public MarketOrderCollection CharacterMarketOrders { get; }\n\n        /// <summary>\n        /// Gets or sets the corporation market orders.\n        /// </summary>\n        /// <value>The corporation market orders.</value>\n        public MarketOrderCollection CorporationMarketOrders { get; }\n\n        /// <summary>\n        /// Gets the collection of contracts.\n        /// </summary>\n        /// <remarks>Excludes contracts that appear in both collections</remarks>\n        public IEnumerable<Contract> Contracts => CharacterContracts.Where(charContract =>\n            CorporationContracts.All(corpContract => corpContract.ID != charContract.ID)).\n            Concat(CorporationContracts.Where(contract => contract.IssuerID == CharacterID));\n\n        /// <summary>\n        /// Gets or sets the character contracts.\n        /// </summary>\n        /// <value>The character contracts.</value>\n        public ContractCollection CharacterContracts { get; }\n\n        /// <summary>\n        /// Gets or sets the corporation contracts.\n        /// </summary>\n        /// <value>The character contracts.</value>\n        public ContractCollection CorporationContracts { get; }\n        \n        /// <summary>\n        /// Gets the collection of industry jobs.\n        /// </summary>\n        public IEnumerable<IndustryJob> IndustryJobs => CharacterIndustryJobs.Concat(\n            CorporationIndustryJobs.Where(job => job.InstallerID == CharacterID));\n\n        /// <summary>\n        /// Gets or sets the character industry jobs.\n        /// </summary>\n        /// <value>The character industry jobs.</value>\n        public IndustryJobCollection CharacterIndustryJobs { get; }\n\n        /// <summary>\n        /// Gets or sets the corporation industry jobs.\n        /// </summary>\n        /// <value>The corporation industry jobs.</value>\n        public IndustryJobCollection CorporationIndustryJobs { get; }\n\n        /// <summary>\n        /// Gets the collection of research points.\n        /// </summary>\n        public ResearchPointCollection ResearchPoints { get; }\n\n        /// <summary>\n        /// Gets the collection of EVE mail messages.\n        /// </summary>\n        public EveMailMessageCollection EVEMailMessages { get; }\n\n        /// <summary>\n        /// Gets the collection of EVE mail messages.\n        /// </summary>\n        public EveMailingListCollection EVEMailingLists { get; }\n\n        /// <summary>\n        /// Gets the collection of EVE notifications.\n        /// </summary>\n        public EveNotificationCollection EVENotifications { get; }\n\n        /// <summary>\n        /// Gets the collection of contacts.\n        /// </summary>\n        public ContactCollection Contacts { get; }\n\n        /// <summary>\n        /// Gets the collection of character medals.\n        /// </summary>\n        public MedalCollection CharacterMedals { get; }\n\n        /// <summary>\n        /// Gets the collection of corporation medals.\n        /// </summary>\n        public MedalCollection CorporationMedals { get; }\n\n        /// <summary>\n        /// Gets the collection of upcoming calendar events.\n        /// </summary>\n        public UpcomingCalendarEventCollection UpcomingCalendarEvents { get; }\n\n        /// <summary>\n        /// Gets the collection of kill logs.\n        /// </summary>\n        public KillLogCollection KillLog { get; }\n\n        /// <summary>\n        /// Gets the collection of planetary colonies.\n        /// </summary>\n        public PlanetaryColonyCollection PlanetaryColonies { get; }\n\n        /// <summary>\n        /// Gets the collection of loyalty points.\n        /// </summary>\n        public LoyaltyCollection LoyaltyPoints { get; }\n\n        /// <summary>\n        /// Gets the query monitors enumeration.\n        /// </summary>\n        public QueryMonitorCollection QueryMonitors { get; }\n\n        /// <summary>\n        /// Gets true when the character is currently actively training, false otherwise.\n        /// </summary>\n        public override bool IsTraining => SkillQueue.IsTraining;\n\n        /// <summary>\n        /// Gets the skill currently in training, even when it is paused.\n        /// </summary>\n        public override QueuedSkill CurrentlyTrainingSkill => SkillQueue?.CurrentlyTraining;\n\n        /// <summary>\n        /// Gets a value indicating whether the character has insufficient balance to complete its buy orders.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the character has sufficient balance; otherwise, <c>false</c>.\n        /// </value>\n        public bool HasSufficientBalance\n        {\n            get\n            {\n                var activeBuyOrders = MarketOrders.OfType<BuyOrder>().Where(order =>\n                    (order.State == OrderState.Active || order.State == OrderState.Modified) &&\n                    order.IssuedFor == IssuedFor.Character).ToList();\n\n                decimal additionalToCover = activeBuyOrders.Sum(x => x.TotalPrice) -\n                    activeBuyOrders.Sum(order => order.Escrow);\n\n                return Balance >= additionalToCover;\n            }\n\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether the character is enlisted in factional warfare.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if character is not enlisted in factional warfare; otherwise, <c>false</c>.\n        /// </value>\n        public bool IsFactionalWarfareNotEnlisted\n        {\n            get { return FactionID == 0 || m_isFwEnlisted; }\n            internal set { m_isFwEnlisted = value; }\n        }\n\n        /// <summary>\n        /// Gets true when a new character is created.\n        /// </summary>\n        public bool ForceUpdateBasicFeatures { get; }\n\n        #endregion\n\n\n        #region Importing & Exporting\n\n        /// <summary>\n        /// Create a serializable character sheet for this character.\n        /// </summary>\n        /// <returns></returns>\n        public override SerializableSettingsCharacter Export()\n        {\n            SerializableCCPCharacter serial = new SerializableCCPCharacter();\n            Export(serial);\n\n            // Skill queue\n            serial.SkillQueue.AddRange(SkillQueue.Export());\n\n            // Market orders\n            serial.MarketOrders.AddRange(MarketOrdersExport());\n\n            // Contracts\n            serial.Contracts.AddRange(ContractsExport());\n            \n            // Industry jobs\n            serial.IndustryJobs.AddRange(IndustryJobsExport());\n\n            // Eve mail messages IDs\n            serial.EveMailMessagesIDs = EVEMailMessages.Export();\n\n            // Eve notifications IDs\n            serial.EveNotificationsIDs = EVENotifications.Export();\n\n            // Last API updates\n            if (QueryMonitors.Any())\n            {\n                m_lastAPIUpdates = QueryMonitors.Select(\n                    monitor => new SerializableAPIUpdate\n                                   {\n                                       Method = monitor.Method.ToString(),\n                                       Time = monitor.LastUpdate\n                                   }).ToList();\n            }\n\n            serial.LastUpdates.AddRange(m_lastAPIUpdates);\n\n            return serial;\n        }\n\n        /// <summary>\n        /// Exports the market orders.\n        /// </summary>\n        /// <returns></returns>\n        private IEnumerable<SerializableOrderBase> MarketOrdersExport()\n        {\n            // Until we can determine what data the character's API keys can query,\n            // we have to keep the data unprocessed. Once we know, we filter them\n\n            IEnumerable<SerializableOrderBase> corporationMarketOrdersExport =\n                EveMonClient.ESIKeys.Any(apiKey => !apiKey.IsProcessed) || m_corporationDataQuerying != null\n                    ? CorporationMarketOrders.ExportOnlyIssuedByCharacter()\n                    : new List<SerializableOrderBase>();\n\n            IEnumerable<SerializableOrderBase> characterMarketOrdersExport =\n                EveMonClient.ESIKeys.Any(apiKey => !apiKey.IsProcessed) || m_characterDataQuerying != null\n                    ? CharacterMarketOrders.Export()\n                    : new List<SerializableOrderBase>();\n\n            return characterMarketOrdersExport.Concat(corporationMarketOrdersExport);\n        }\n\n        /// <summary>\n        /// Exports the contracts.\n        /// </summary>\n        /// <returns></returns>\n        /// <remarks>Excludes contracts that appear in both collections.</remarks>\n        private IEnumerable<SerializableContract> ContractsExport()\n        {\n            // Until we can determine what data the character's API keys can query,\n            // we have to keep the data unprocessed. Once we know, we filter them\n\n            IEnumerable<SerializableContract> corporationContractsExport =\n                EveMonClient.ESIKeys.Any(apiKey => !apiKey.IsProcessed) || m_corporationDataQuerying != null\n                    ? CorporationContracts.ExportOnlyIssuedByCharacter()\n                    : new List<SerializableContract>();\n\n            IEnumerable<SerializableContract> characterContractsExport =\n                EveMonClient.ESIKeys.Any(apiKey => !apiKey.IsProcessed) || m_characterDataQuerying != null\n                    ? CharacterContracts.Export().Where(charContract => corporationContractsExport.All(\n                        corpContract => corpContract.ContractID != charContract.ContractID))\n                    : new List<SerializableContract>();\n\n            return characterContractsExport.Concat(corporationContractsExport);\n        }\n\n        /// <summary>\n        /// Exports the industry jobs.\n        /// </summary>\n        /// <returns></returns>\n        private IEnumerable<SerializableJob> IndustryJobsExport()\n        {\n            // Until we can determine what data the character's API keys can query,\n            // we have to keep the data unprocessed. Once we know, we filter them\n\n            IEnumerable<SerializableJob> corporationIndustryJobsExport =\n                EveMonClient.ESIKeys.Any(apiKey => !apiKey.IsProcessed) || m_corporationDataQuerying != null\n                    ? CorporationIndustryJobs.ExportOnlyIssuedByCharacter()\n                    : new List<SerializableJob>();\n\n            IEnumerable<SerializableJob> characterIndustryJobsExport =\n                EveMonClient.ESIKeys.Any(apiKey => !apiKey.IsProcessed) || m_characterDataQuerying != null\n                    ? CharacterIndustryJobs.Export()\n                    : new List<SerializableJob>();\n\n            return characterIndustryJobsExport.Concat(corporationIndustryJobsExport);\n        }\n\n        /// <summary>\n        /// Imports data from a serialization object.\n        /// </summary>\n        /// <param name=\"serial\"></param>\n        private void Import(SerializableCCPCharacter serial)\n        {\n            Import((SerializableSettingsCharacter)serial);\n\n            // Skill queue\n            SkillQueue.Import(serial.SkillQueue);\n\n            // Market orders\n            MarketOrdersImport(serial.MarketOrders);\n\n            // Contracts\n            ContractsImport(serial.Contracts);\n            \n            // Industry jobs\n            IndustryJobsImport(serial.IndustryJobs);\n\n            // EVE mail messages IDs\n            EVEMailMessages.Import(serial.EveMailMessagesIDs);\n\n            // EVE notifications IDs\n            EVENotifications.Import(serial.EveNotificationsIDs);\n\n            // Kill Logs\n            KillLog.ImportFromCacheFile();\n\n            // Fire the global event\n            EveMonClient.OnCharacterUpdated(this);\n        }\n\n        /// <summary>\n        /// Imports the market orders.\n        /// </summary>\n        /// <param name=\"marketOrders\">The market orders.</param>\n        private void MarketOrdersImport(IList<SerializableOrderBase> marketOrders)\n        {\n            CharacterMarketOrders.Import(marketOrders.Where(order => order.IssuedFor == IssuedFor.Character));\n            CorporationMarketOrders.Import(marketOrders.Where(order => order.IssuedFor == IssuedFor.Corporation));\n        }\n\n        /// <summary>\n        /// Imports the contracts.\n        /// </summary>\n        /// <param name=\"contracts\">The contracts.</param>\n        private void ContractsImport(IList<SerializableContract> contracts)\n        {\n            CharacterContracts.Import(contracts.Where(contract => contract.IssuedFor == IssuedFor.Character));\n            CorporationContracts.Import(contracts.Where(contract => contract.IssuedFor == IssuedFor.Corporation));\n        }\n\n        /// <summary>\n        /// Imports the industry jobs.\n        /// </summary>\n        /// <param name=\"industryJobs\">The industry jobs.</param>\n        private void IndustryJobsImport(IList<SerializableJob> industryJobs)\n        {\n            CharacterIndustryJobs.Import(industryJobs.Where(job => job.IssuedFor == IssuedFor.Character));\n            CorporationIndustryJobs.Import(industryJobs.Where(job => job.IssuedFor == IssuedFor.Corporation));\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Called when the object gets disposed.\n        /// </summary>\n        internal override void Dispose()\n        {\n            // Unsubscribe events\n            EveMonClient.CharacterAssetsUpdated -= EveMonClient_CharacterAssetsUpdated;\n            EveMonClient.CharacterMarketOrdersUpdated -= EveMonClient_CharacterMarketOrdersUpdated;\n            EveMonClient.CorporationMarketOrdersUpdated -= EveMonClient_CorporationMarketOrdersUpdated;\n            EveMonClient.CharacterContractsUpdated -= EveMonClient_CharacterContractsUpdated;\n            EveMonClient.CorporationContractsUpdated -= EveMonClient_CorporationContractsUpdated;\n            EveMonClient.CharacterIndustryJobsUpdated -= EveMonClient_CharacterIndustryJobsUpdated;\n            EveMonClient.CorporationIndustryJobsUpdated -= EveMonClient_CorporationIndustryJobsUpdated;\n            EveMonClient.CharacterIndustryJobsCompleted -= EveMonClient_CharacterIndustryJobsCompleted;\n            EveMonClient.CorporationIndustryJobsCompleted -= EveMonClient_CorporationIndustryJobsCompleted;\n            EveMonClient.CharacterPlaneteryPinsCompleted -= EveMonClient_CharacterPlaneteryPinsCompleted;\n            EveMonClient.ESIKeyInfoUpdated -= EveMonClient_ESIKeyInfoUpdated;\n            EveMonClient.EveIDToNameUpdated -= EveMonClient_EveIDToNameUpdated;\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n\n            // Unsubscribe events\n            SkillQueue.Dispose();\n            CharacterIndustryJobs.Dispose();\n            CorporationIndustryJobs.Dispose();\n            PlanetaryColonies.Dispose();\n\n            // Unsubscribe events\n            if (m_characterDataQuerying != null)\n            {\n                m_characterDataQuerying.Dispose();\n                m_characterDataQuerying = null;\n            }\n\n            if (m_corporationDataQuerying != null)\n            {\n                m_corporationDataQuerying.Dispose();\n                m_corporationDataQuerying = null;\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Checks whether we should notify an error.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        /// <param name=\"method\"></param>\n        /// <returns></returns>\n        internal bool ShouldNotifyError(IAPIResult result, Enum method)\n        {\n            if (result.HasError)\n            {\n                if (!m_errorNotifiedMethod.Equals(CCPAPIMethodsEnum.None))\n                    return false;\n                m_errorNotifiedMethod = method;\n                return true;\n            }\n            // Removes the previous error notification\n            if (!m_errorNotifiedMethod.Equals(method))\n                return false;\n            EveMonClient.Notifications.InvalidateCharacterAPIError(this);\n            m_errorNotifiedMethod = CCPAPIMethodsEnum.None;\n            return false;\n        }\n\n        /// <summary>\n        /// Notifies for market orders related events.\n        /// </summary>\n        private void NotifyForMarketOrdersRelatedEvents()\n        {\n            // Notify for ended orders\n            NotifyEndedOrders();\n\n            // Notify for insufficient balance\n            NotifyInsufficientBalance();\n\n            // Reset helper lists\n            m_endedOrdersForCharacter.Clear();\n            m_endedOrdersForCorporation.Clear();\n\n            // Fires the event regarding market orders update\n            EveMonClient.OnMarketOrdersUpdated(this);\n        }\n\n        /// <summary>\n        /// Notifies for ended orders.\n        /// </summary>\n        private void NotifyEndedOrders()\n        {\n            // Notify ended orders issued by the character\n            if (m_endedOrdersForCharacter.Any())\n                EveMonClient.Notifications.NotifyCharacterMarketOrdersEnded(this, m_endedOrdersForCharacter);\n\n            // Uncomment upon implementing an exclusive corporation monitor\n            // Notify ended orders issued for the corporation\n            //if (m_endedOrdersForCorporation.Any())\n            //    EveMonClient.Notifications.NotifyCorporationMarketOrdersEnded(Corporation, m_endedOrdersForCorporation);\n        }\n\n        /// <summary>\n        /// Notifies for contracts related events.\n        /// </summary>\n        private void NotifyForContractsRelatedEvents()\n        {\n            // Notify for ended contracts\n            NotifyEndedContracts();\n\n            // Notify for assigned contracts\n            NotifyAssignedContracts();\n\n            // Reset helper lists\n            // Note: Special condition logic is applied due to the fact that CCP\n            // includes corporation related contracts in character API feed\n            if (m_characterDataQuerying != null && m_corporationDataQuerying != null &&\n                m_corporationDataQuerying.CorporationContractsQueried)\n            {\n                m_endedContractsForCharacter.Clear();\n            }\n\n            if (m_corporationDataQuerying != null && m_characterDataQuerying != null &&\n                m_characterDataQuerying.CharacterContractsQueried)\n            {\n                m_endedContractsForCorporation.Clear();\n            }\n\n            // Fires the event regarding contracts update\n            EveMonClient.OnContractsUpdated(this);\n        }\n\n        /// <summary>\n        /// Notifies for ended contracts.\n        /// </summary>\n        private void NotifyEndedContracts()\n        {\n            // Notify ended contracts issued by the character\n            if (m_endedContractsForCharacter.Any(x => !x.NotificationSend))\n            {\n                EveMonClient.Notifications.NotifyCharacterContractsEnded(this, m_endedContractsForCharacter);\n                m_endedContractsForCharacter.ForEach(x => x.NotificationSend = true);\n            }\n\n            // Uncomment upon implementing an exclusive corporation monitor\n            // Notify ended contracts issued for the corporation\n            //if (m_endedContractsForCorporation.All(x => x.NotificationSend))\n            //    return;\n\n            //EveMonClient.Notifications.NotifyCorporationContractsEnded(Corporation, m_endedContractsForCorporation);\n            //m_endedContractsForCorporation.ForEach(x => x.NotificationSend = true);\n        }\n\n        /// <summary>\n        /// Notifies for assigned contracts.\n        /// </summary>\n        private void NotifyAssignedContracts()\n        {\n            if (Contracts.Any(contract => contract.State == ContractState.Assigned))\n            {\n                int assignedContracts = Contracts.Count(contracts => contracts.State == ContractState.Assigned);\n                EveMonClient.Notifications.NotifyCharacterContractsAssigned(this, assignedContracts);\n                return;\n            }\n\n            EveMonClient.Notifications.InvalidateCharacterContractsAssigned(this);\n        }\n\n        /// <summary>\n        /// Notifies for insufficient balance.\n        /// </summary>\n        internal void NotifyInsufficientBalance()\n        {\n            // Check the character has sufficient balance\n            // for its buying orders and send a notification if not\n            if (!HasSufficientBalance)\n            {\n                EveMonClient.Notifications.NotifyInsufficientBalance(this);\n                return;\n            }\n\n            EveMonClient.Notifications.InvalidateInsufficientBalance(this);\n        }\n\n        /// <summary>\n        /// Notifies for industry jobs related events.\n        /// </summary>\n        private void NotifyForIndustryJobsRelatedEvents()\n        {\n            // Fires the event regarding industry jobs update\n            EveMonClient.OnIndustryJobsUpdated(this);\n        }\n\n        /// <summary>\n        /// Resets the last API updates.\n        /// </summary>\n        /// <param name=\"lastUpdates\">The last updates.</param>\n        private void ResetLastAPIUpdates(IEnumerable<SerializableAPIUpdate> lastUpdates)\n        {\n            foreach (SerializableAPIUpdate lastUpdate in lastUpdates)\n            {\n                Enum method = ESIMethods.Methods.FirstOrDefault(apiMethod => apiMethod.ToString() == lastUpdate.Method);\n                if (method == null)\n                    continue;\n\n                IQueryMonitorEx monitor = QueryMonitors[method] as IQueryMonitorEx;\n                monitor?.Reset(lastUpdate.Time);\n            }\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            // Force update a monitor if the last update exceed the current datetime\n            foreach (var monitor in QueryMonitors.Where(monitor => !monitor.IsUpdating &&\n                monitor.LastUpdate > DateTime.UtcNow))\n            {\n                (monitor as IQueryMonitorEx)?.ForceUpdate(true);\n            }\n        }\n\n        /// <summary>\n        /// Handles the ESIKeyInfoUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_ESIKeyInfoUpdated(object sender, EventArgs e)\n        {\n            if (EveMonClient.ESIKeys.Any(apiKey => !apiKey.IsProcessed))\n                return;\n\n            if (!Identity.ESIKeys.Any())\n                return;\n\n            if (m_characterDataQuerying == null && Identity.ESIKeys.Any())\n            {\n                m_characterDataQuerying = new CharacterDataQuerying(this);\n                ResetLastAPIUpdates(m_lastAPIUpdates.Where(lastUpdate => Enum.IsDefined(\n                    typeof(ESIAPICharacterMethods), lastUpdate.Method)));\n            }\n\n            if (m_corporationDataQuerying == null && Identity.ESIKeys.Any())\n            {\n                m_corporationDataQuerying = new CorporationDataQuerying(this);\n                ResetLastAPIUpdates(m_lastAPIUpdates.Where(lastUpdate => Enum.IsDefined(\n                    typeof(ESIAPICorporationMethods), lastUpdate.Method)));\n            }\n        }\n\n        /// <summary>\n        /// Handles the CharacterAssetsUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        /// <remarks>Triggering a settings exportation to update the character owned skillbooks found in Assets</remarks>\n        private void EveMonClient_CharacterAssetsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character == this)\n                Export();\n        }\n\n        /// <summary>\n        /// Handles the CharacterMarketOrdersUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.MarketOrdersEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterMarketOrdersUpdated(object sender, MarketOrdersEventArgs e)\n        {\n            if (e.Character == this)\n            {\n                m_endedOrdersForCharacter.AddRange(e.EndedOrders);\n\n                if (m_corporationDataQuerying?.CorporationMarketOrdersQueried ?? true)\n                    NotifyForMarketOrdersRelatedEvents();\n            }\n        }\n\n        /// <summary>\n        /// Handles the CorporationMarketOrdersUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.MarketOrdersEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CorporationMarketOrdersUpdated(object sender, MarketOrdersEventArgs e)\n        {\n            if (e.Character == this)\n            {\n                m_endedOrdersForCorporation.AddRange(e.EndedOrders);\n                m_endedOrdersForCharacter.AddRange(e.EndedOrders.Where(order => order.OwnerID == CharacterID));\n\n                if (m_characterDataQuerying?.CharacterMarketOrdersQueried ?? true)\n                    NotifyForMarketOrdersRelatedEvents();\n            }\n        }\n\n        /// <summary>\n        /// Handles the CharacterContractsUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.ContractsEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterContractsUpdated(object sender, ContractsEventArgs e)\n        {\n            if (e.Character == this)\n            {\n                m_endedContractsForCharacter.AddRange(e.EndedContracts.Where(\n                    charEndedContract => m_endedContractsForCorporation.All(\n                    corpEndedContract => corpEndedContract.ID != charEndedContract.ID)));\n\n                if (m_corporationDataQuerying?.CorporationContractsQueried ?? true)\n                    NotifyForContractsRelatedEvents();\n            }\n        }\n\n        /// <summary>\n        /// Handles the CorporationContractsUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.ContractsEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CorporationContractsUpdated(object sender, ContractsEventArgs e)\n        {\n            if (e.Character == this)\n            {\n                m_endedContractsForCorporation.AddRange(e.EndedContracts);\n                m_endedContractsForCharacter.AddRange(e.EndedContracts.Where(contract =>\n                    contract.IssuerID == CharacterID).Where(corpEndedContract =>\n                    m_endedContractsForCharacter.All(charEndedContract => charEndedContract.\n                    ID != corpEndedContract.ID)));\n\n                if (m_characterDataQuerying?.CharacterContractsQueried ?? true)\n                    NotifyForContractsRelatedEvents();\n            }\n        }\n\n        /// <summary>\n        /// Handles the CharacterIndustryJobsUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterIndustryJobsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character == this && (m_corporationDataQuerying?.\n                    CorporationIndustryJobsQueried ?? true))\n                NotifyForIndustryJobsRelatedEvents();\n        }\n\n        /// <summary>\n        /// Handles the CorporationIndustryJobsUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.CharacterChangedEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CorporationIndustryJobsUpdated(object sender, CharacterChangedEventArgs e)\n        {\n            if (e.Character == this && (m_characterDataQuerying?.\n                    CharacterIndustryJobsQueried ?? true))\n                NotifyForIndustryJobsRelatedEvents();\n        }\n\n        /// <summary>\n        /// Handles the CharacterIndustryJobsCompleted event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.IndustryJobsEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterIndustryJobsCompleted(object sender, IndustryJobsEventArgs e)\n        {\n            if (e.Character == this)\n            {\n                m_jobsCompletedForCharacter.AddRange(e.CompletedJobs);\n\n                // If character has completed corporation issued jobs, wait until those are gathered too\n                if (!CorporationIndustryJobs.Any(job => job.ActiveJobState ==\n                        ActiveJobState.Ready && !job.NotificationSend))\n                {\n                    EveMonClient.Notifications.NotifyCharacterIndustryJobCompletion(this,\n                        m_jobsCompletedForCharacter);\n\n                    // Now that we have send the notification clear the list\n                    m_jobsCompletedForCharacter.Clear();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Handles the CorporationIndustryJobsCompleted event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"EVEMon.Common.CustomEventArgs.IndustryJobsEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CorporationIndustryJobsCompleted(object sender, IndustryJobsEventArgs e)\n        {\n            // Uncomment upon implementing an exclusive corporation monitor\n            // Notify completed jobs issued for the corporation\n            //EveMonClient.Notifications.NotifyCorporationIndustryJobCompletion(Corporation, e.CompletedJobs);\n        }\n\n        /// <summary>\n        /// Handles the CharacterPlaneteryPinsCompleted event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"PlanetaryPinsEventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_CharacterPlaneteryPinsCompleted(object sender, PlanetaryPinsEventArgs e)\n        {\n            if (e.Character == this)\n                EveMonClient.Notifications.NotifyCharacterPlanetaryPinCompleted(this,\n                    e.CompletedPins);\n        }\n\n        /// <summary>\n        /// Handles the EveIDToNameUpdated event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_EveIDToNameUpdated(object sender, EventArgs e)\n        {\n            bool updated = false;\n            string cname = CorporationName, aname = AllianceName, fname = FactionName;\n\n            // If the corp, alliance, or faction was unknown, update it\n            if (cname.IsEmptyOrUnknown())\n            {\n                CorporationName = EveIDToName.GetIDToName(CorporationID);\n                if (CorporationName != cname)\n                    updated = true;\n            }\n            if (aname.IsEmptyOrUnknown())\n            {\n                AllianceName = EveIDToName.GetIDToName(AllianceID);\n                if (AllianceName != aname)\n                    updated = true;\n            }\n            if (fname.IsEmptyOrUnknown())\n            {\n                FactionName = EveIDToName.GetIDToName(FactionID);\n                if (FactionName != fname)\n                    updated = true;\n            }\n\n            // Only fire update if the new names changed\n            if (updated)\n                EveMonClient.OnCharacterInfoUpdated(this);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/CalendarEventAttendee.cs",
    "content": "using EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Service;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class CalendarEventAttendee\n    {\n        private string m_characterName;\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CalendarEventAttendee\"/> class.\n        /// </summary>\n        /// <param name=\"src\">The SRC.</param>\n        internal CalendarEventAttendee(EsiCalendarEventAttendeeListItem src)\n        {\n            CharacterID = src.CharacterID;\n            m_characterName = EveIDToName.GetIDToName(src.CharacterID);\n            Response = src.Response;\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the character ID.\n        /// </summary>\n        public long CharacterID { get; }\n\n        /// <summary>\n        /// Gets the name of the character.\n        /// </summary>\n        public string CharacterName => (m_characterName.IsEmptyOrUnknown()) ?\n            (m_characterName = EveIDToName.GetIDToName(CharacterID)) : m_characterName;\n\n        /// <summary>\n        /// Gets the response.\n        /// </summary>\n        public string Response { get; }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Character.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models.Collections;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a base class for character\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public abstract class Character : BaseCharacter\n    {\n        // Character name\n        private string m_name;\n        private string m_label;\n\n        // Home station\n        private long homeStation;\n\n        // Attributes\n        private readonly CharacterAttribute[] m_attributes = new CharacterAttribute[5];\n\n        // Skill Point Caching\n        private DateTime m_skillPointTotalUpdated = DateTime.MinValue;\n        private long m_lastSkillPointTotal;\n\n        #region Initialization\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        /// <param name=\"identity\">The identity for this character</param>\n        /// <param name=\"guid\">The unique identifier.</param>\n        /// <exception cref=\"System.ArgumentNullException\">identity</exception>\n        protected Character(CharacterIdentity identity, Guid guid)\n        {\n            identity.ThrowIfNull(nameof(identity));\n\n            CharacterID = identity.CharacterID;\n            m_name = identity.CharacterName;\n\n            Identity = identity;\n            Guid = guid;\n            m_label = string.Empty;\n\n            Corporation = new Corporation(this);\n\n            SkillGroups = new SkillGroupCollection(this);\n            Skills = new SkillCollection(this);\n\n            UpdateAccountStatus();\n\n            EmploymentHistory = new EmploymentRecordCollection(this);\n            ImplantSets = new ImplantSetCollection(this);\n            Plans = new PlanCollection(this);\n            CertificateCategories = new CertificateCategoryCollection(this);\n            CertificateClasses = new CertificateClassCollection(this);\n            Certificates = new CertificateCollection(this);\n            MasteryShips = new MasteryShipCollection(this);\n\n            for (int i = 0; i < m_attributes.Length; i++)\n            {\n                m_attributes[i] = new CharacterAttribute(this, (EveAttribute)i);\n            }\n\n            UISettings = new CharacterUISettings();\n        }\n\n        /// <summary>\n        /// Updates the character's account status based on the last known status and the\n        /// current skill queue / training times.\n        /// </summary>\n        /// <param name=\"status\">The current account status</param>\n        public void UpdateAccountStatus(AccountStatus status = AccountStatus.Unknown)\n        {\n            var skill = CurrentlyTrainingSkill;\n            var skillIsTraining = (skill != null) && skill.IsTraining;\n\n            if (skillIsTraining && SkillPoints > EveConstants.MaxAlphaSkillTraining)\n            {\n                status = AccountStatus.Omega;\n            }\n            else\n            {\n                bool likelyAlpha = false;\n                foreach (var sk in Skills)\n                {\n                    // Is the skill level being limited by alpha status?\n                    if (sk.ActiveLevel < sk.Level)\n                    {\n                        // Active level is being limited by alpha status.\n                        likelyAlpha = true;\n                    }\n                    // Has the skill alpha limit been exceeded?\n                    if (sk.ActiveLevel > sk.StaticData.AlphaLimit)\n                    {\n                        // Active level is greater than alpha limit, only on Omega.\n                        status = AccountStatus.Omega;\n                        break;\n                    }\n                }\n                if (status == AccountStatus.Unknown)\n                {\n                    if (likelyAlpha)\n                        // This was false triggering in some circumstances, give \"active level\n                        // > alpha limit\" higher priority\n                        status = AccountStatus.Alpha;\n                    else if (skillIsTraining)\n                    {\n                        // Try to determine account status based on training time\n                        var hoursToTrain = (skill.EndTime - skill.StartTime).TotalHours;\n                        var secondsToTrain = (skill.EndTime - skill.StartTime).TotalSeconds;\n                        var spToTrain = skill.EndSP - skill.StartSP;\n                        // training time formula requirenment: 6 seconds.\n                        // jitter for EndTime and StartTime: 2 seconds. Total 8 seconds.\n                        if (secondsToTrain > 8 && spToTrain > 0)\n                        {\n                            // spPerHour must be greater than zero since numerator and denominator are\n                            var spPerHour = spToTrain / hoursToTrain;\n                            double rate = GetOmegaSPPerHour(skill.Skill) / spPerHour;\n                            // Allow for small margin of error, important on skills nearing completion.\n                            if (rate < 1.2 && rate > 0.8)\n                                status = AccountStatus.Omega;\n                            else if (rate > 1.1)\n                                status = AccountStatus.Alpha;\n                        }\n                    }\n                }\n            }\n            \n            CharacterStatus = status;\n        }\n\n        #endregion\n\n\n        #region Bio\n\n        /// <summary>\n        /// Gets a global identifier for this character.\n        /// </summary>\n        public Guid Guid { get; }\n\n        /// <summary>\n        /// Gets the identity for this character.\n        /// </summary>\n        public CharacterIdentity Identity { get; protected set; }\n\n        /// <summary>\n        /// Gets or sets true if the character is monitored and displayed on the main window.\n        /// </summary>\n        public bool Monitored\n        {\n            get { return EveMonClient.MonitoredCharacters.Contains(this); }\n            set { EveMonClient.MonitoredCharacters.OnCharacterMonitoringChanged(this, value); }\n        }\n\n        /// <summary>\n        /// Gets the ID for this character.\n        /// </summary>\n        public long CharacterID { get; protected set; }\n\n        /// <summary>\n        /// Gets or sets the source's name.\n        /// By default, it's the character's name but it may be overriden to help distinct tabs on the main window.\n        /// </summary>\n        public string Name\n        {\n            get { return m_name; }\n            set\n            {\n                if (m_name == value)\n                    return;\n\n                m_name = value;\n                EveMonClient.OnCharacterUpdated(this);\n            }\n        }\n\n        /// <summary>\n        /// Gets the home station identifier.\n        /// </summary>\n        public Station HomeStation\n        {\n            get\n            {\n                return EveIDToStation.GetIDToStation(homeStation, this as CCPCharacter);\n            }\n        }\n\n        /// <summary>\n        /// Gets an adorned name, with (file), (url) or (cached) labels.\n        /// </summary>\n        public virtual string AdornedName => m_name;\n\n        /// <summary>\n        /// Gets the character's birthday.\n        /// </summary>\n        public DateTime Birthday { get; private set; }\n\n        /// <summary>\n        /// Gets the character's race.\n        /// </summary>\n        public string Race { get; private set; }\n\n        /// <summary>\n        /// Gets the character's bloodline.\n        /// </summary>\n        public string Bloodline { get; private set; }\n\n        /// <summary>\n        /// Gets the character's ancestry.\n        /// </summary>\n        public string Ancestry { get; private set; }\n\n        /// <summary>\n        /// Gets the character's gender.\n        /// </summary>\n        public string Gender { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the corporation.\n        /// </summary>\n        /// <value>The corporation.</value>\n        public Corporation Corporation { get; }\n\n        /// <summary>\n        /// Gets the id of the character's corporation.\n        /// </summary>\n        public long CorporationID { get; internal set; }\n\n        /// <summary>\n        /// Gets the name of the character's corporation.\n        /// </summary>\n        public string CorporationName { get; internal set; }\n\n        /// <summary>\n        /// Gets the name of the character's alliance.\n        /// </summary>\n        public string AllianceName { get; internal set; }\n\n        /// <summary>\n        /// Gets the id of the character's alliance.\n        /// </summary>\n        public long AllianceID { get; internal set; }\n\n        /// <summary>\n        /// Gets the name of the character's warfare faction.\n        /// </summary>\n        public string FactionName { get; internal set; }\n\n        /// <summary>\n        /// Gets the id of the character's warfare faction.\n        /// </summary>\n        public int FactionID { get; internal set; }\n\n        /// <summary>\n        /// Gets the free skill points.\n        /// </summary>\n        public int FreeSkillPoints { get; private set; }\n\n        /// <summary>\n        /// Gets the jump clone creation date.\n        /// </summary>\n        public DateTime JumpCloneLastJumpDate { get; private set; }\n\n        /// <summary>\n        /// Gets the available remaps.\n        /// </summary>\n        public short AvailableReMaps { get; private set; }\n\n        /// <summary>\n        /// Gets the last remap date.\n        /// </summary>\n        public DateTime LastReMapDate { get; private set; }\n\n        /// <summary>\n        /// Gets the last remap timed.\n        /// </summary>\n        public DateTime LastReMapTimed { get; private set; }\n\n        /// <summary>\n        /// Gets the remote station date.\n        /// </summary>\n        public DateTime RemoteStationDate { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the jump activation date.\n        /// </summary>\n        public DateTime JumpActivationDate { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the jump fatigue date.\n        /// </summary>\n        public DateTime JumpFatigueDate { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the jump last update date.\n        /// </summary>\n        public DateTime JumpLastUpdateDate { get; private set; }\n\n        /// <summary>\n        /// Gets the current character's wallet balance.\n        /// </summary>\n        public decimal Balance { get; private set; }\n\n        /// <summary>\n        /// Gets true when the character is in a NPC corporation, false otherwise.\n        /// </summary>\n        public bool IsInNPCCorporation => CorporationID < int.MaxValue &&\n            StaticGeography.GetCorporationByID((int)CorporationID) != null;\n\n        #endregion\n\n\n        #region Info\n\n        /// <summary>\n        /// Gets or sets the character's custom label. This is used for display only.\n        /// </summary>\n        public string Label\n        {\n            get\n            {\n                return m_label;\n            }\n            set\n            {\n                m_label = value ?? string.Empty;\n                EveMonClient.OnCharacterLabelChanged(this);\n            }\n        }\n\n        /// <summary>\n        /// The method used to determine the character's clone state (or the override).\n        /// </summary>\n        public override AccountStatusMode AccountStatusSettings\n        {\n            get\n            {\n                return m_cloneStateSetting;\n            }\n            set\n            {\n                m_cloneStateSetting = value;\n                EveMonClient.OnCharacterUpdated(this);\n            }\n        }\n\n        /// <summary>\n        /// Generates a prefix to be used on the character's name in the overview and tab list\n        /// when the character has a custom label.\n        /// </summary>\n        public string LabelPrefix => m_label.IsEmptyOrUnknown() ? string.Empty : \"[\" + m_label + \"] \";\n\n        /// <summary>\n        /// Gets the character's ship name.\n        /// </summary>\n        public string ShipName { get; private set; }\n\n        /// <summary>\n        /// Gets the character's ship type name.\n        /// </summary>\n        public string ShipTypeName { get; private set; }\n\n        /// <summary>\n        /// Gets the character's last known location.\n        /// </summary>\n        public SerializableLocation LastKnownLocation { get; private set; }\n\n        /// <summary>\n        /// Gets the character's security status.\n        /// </summary>\n        public double SecurityStatus { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the character's employment history.\n        /// </summary>\n        public EmploymentRecordCollection EmploymentHistory { get; }\n\n        /// <summary>\n        /// Gets the character's last known station location.\n        /// </summary>\n        public Station LastKnownStation\n        {\n            get\n            {\n                var loc = LastKnownLocation;\n                if (loc == null)\n                    return null;\n                int id = loc.StationID;\n                // If this is a CCP character, allow usage of ESI key to find citadel info\n                return EveIDToStation.GetIDToStation(id != 0 ? id : loc.StructureID, this as\n                    CCPCharacter);\n            }\n        }\n\n        /// <summary>\n        /// Gets the character's last known solar system location.\n        /// </summary>\n        public SolarSystem LastKnownSolarSystem => StaticGeography.GetSolarSystemByID(\n            LastKnownLocation?.SolarSystemID ?? 0);\n\n        #endregion\n\n\n        #region Certificates\n\n        /// <summary>\n        /// Gets the collection of certificate categories.\n        /// </summary>\n        public CertificateCategoryCollection CertificateCategories { get; }\n\n        /// <summary>\n        /// Gets the collection of certificate classes.\n        /// </summary>\n        public CertificateClassCollection CertificateClasses { get; }\n\n        /// <summary>\n        /// Gets the collection of certificates.\n        /// </summary>\n        public CertificateCollection Certificates { get; }\n\n        #endregion\n\n\n        #region Masteries\n\n        /// <summary>\n        /// Gets the collection of mastery ships.\n        /// </summary>\n        public MasteryShipCollection MasteryShips { get; }\n\n        #endregion\n\n\n        #region Attributes\n\n        /// <summary>\n        /// Gets the base attribute value for the given attribute.\n        /// </summary>\n        /// <param name=\"attribute\">The attribute to retrieve.</param>\n        /// <returns></returns>\n        protected override ICharacterAttribute GetAttribute(EveAttribute attribute) => m_attributes[(int)attribute];\n\n        #endregion\n\n\n        #region Implants\n\n        /// <summary>\n        /// Gets the implants sets of the character and its clones.\n        /// </summary>\n        public ImplantSetCollection ImplantSets { get; }\n\n        /// <summary>\n        /// Gets the current implants' bonuses.\n        /// </summary>\n        public ImplantSet CurrentImplants => ImplantSets.Current;\n\n        #endregion\n\n\n        #region Skills\n\n        /// <summary>\n        /// Gets the collection of skills.\n        /// </summary>\n        public SkillCollection Skills { get; }\n\n        /// <summary>\n        /// Gets the collection of skill groups.\n        /// </summary>\n        public SkillGroupCollection SkillGroups { get; }\n\n        /// <summary>\n        /// Gets the total skill points for this character.\n        /// </summary>\n        /// <returns></returns>\n        protected override long TotalSkillPoints\n        {\n            get\n            {\n                // We only do the calculation once every second to avoid\n                // excessive CPU utilization.\n                if (m_skillPointTotalUpdated > DateTime.UtcNow.AddSeconds(-1))\n                    return m_lastSkillPointTotal;\n\n                m_lastSkillPointTotal = Skills.Sum(skill => skill.SkillPoints);\n                m_skillPointTotalUpdated = DateTime.UtcNow;\n\n                return m_lastSkillPointTotal;\n            }\n        }\n\n        /// <summary>\n        /// Reports the last confirmed skill level of the specified skill known by this\n        /// character.\n        /// </summary>\n        /// <param name=\"skillID\">The skillbook type ID.</param>\n        /// <returns>The last known level of that skill confirmed via the API, or 0 if the\n        /// skill is not known or the value could not be retrieved.</returns>\n        public int LastConfirmedSkillLevel(int skillID)\n        {\n            return (int)(Skills[skillID]?.ActiveLevel ?? 0L);\n        }\n\n        /// <summary>\n        /// Gets the number of skills this character knows.\n        /// </summary>\n        public int KnownSkillCount => Skills.Count(skill => skill.IsKnown);\n\n        /// <summary>\n        /// Gets the number of skills currently known at the same level than the one specified.\n        /// </summary>\n        /// <param name=\"level\">The level.</param>\n        /// <returns></returns>\n        public int GetSkillCountAtLevel(int level) => Skills.Count(skill => skill.IsKnown &&\n            skill.LastConfirmedLvl == level);\n\n        /// <summary>\n        /// Gets the level of the given skill.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <returns></returns>\n        public override long GetSkillLevel(StaticSkill skill)\n        {\n            skill.ThrowIfNull(nameof(skill));\n\n            return Skills[skill.ID].Level;\n        }\n\n        /// <summary>\n        /// Gets the level of the given skill.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">skill</exception>\n        public override long GetSkillPoints(StaticSkill skill)\n        {\n            skill.ThrowIfNull(nameof(skill));\n\n            return Skills[skill.ID].SkillPoints;\n        }\n\n        /// <summary>\n        /// Gets the adjusted base skill points per hour\n        /// based upon skill, attributes, and account status.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <returns>Skill points earned per hour when training this skill</returns>\n        public override float GetBaseSPPerHour(StaticSkill skill)\n        {\n            return EffectiveCharacterStatus.GetTrainingRate() * GetOmegaSPPerHour(skill);\n        }\n\n        #endregion\n\n\n        #region Plans\n\n        /// <summary>\n        /// Gets the collection of plans.\n        /// </summary>\n        public PlanCollection Plans { get; }\n\n        #endregion\n\n\n        #region Training\n\n        /// <summary>\n        /// Gets true when the character is currently training, false otherwise.\n        /// </summary>\n        public virtual bool IsTraining => false;\n\n        /// <summary>\n        /// Gets the skill currently in training.\n        /// </summary>\n        public virtual QueuedSkill CurrentlyTrainingSkill => null;\n\n        #endregion\n\n\n        #region Location Info\n\n        /// <summary>\n        /// Gets the active ship description.\n        /// </summary>\n        /// <returns></returns>\n        public string GetActiveShipText()\n        {\n            string shipText = !string.IsNullOrEmpty(ShipTypeName) && !string.IsNullOrEmpty(ShipName)\n                ? $\"{ShipTypeName} [{ShipName}]\" : EveMonConstants.UnknownText;\n            return $\"Active Ship: {shipText}\";\n        }\n\n        /// <summary>\n        /// Gets the last known location description.\n        /// </summary>\n        /// <returns></returns>\n        public string GetLastKnownLocationText()\n        {\n            if (LastKnownLocation == null)\n                return EveMonConstants.UnknownText;\n\n            // Show the tooltip on when the user provides api key\n            ESIKey apiKey = Identity.FindAPIKeyWithAccess(ESIAPICharacterMethods.Location);\n            if (apiKey == null)\n                return EveMonConstants.UnknownText;\n\n            // Check if in an NPC station or in an outpost\n            var system = (LastKnownStation?.SolarSystem) ?? LastKnownSolarSystem;\n\n            // Not in a solar system ??? Then show default location\n            return system != null ? $\"{system.FullLocation} ({system.SecurityLevel:N1})\"\n                : \"Lost in space\";\n        }\n\n        /// <summary>\n        /// Gets the last known docked description.\n        /// </summary>\n        /// <returns></returns>\n        public string GetLastKnownDockedText()\n        {\n            if (LastKnownLocation == null)\n                return EveMonConstants.UnknownText;\n            \n            // Show the tooltip on when the user provides api key\n            ESIKey apiKey = Identity.FindAPIKeyWithAccess(ESIAPICharacterMethods.Location);\n            if (apiKey == null)\n                return EveMonConstants.UnknownText;\n\n            Station station = LastKnownStation;\n            \n            // Not in any station ?\n            if (station == null)\n                return string.Empty;\n\n            return station.Name;\n        }\n\n        #endregion\n\n\n        #region Importation / exportation\n\n        /// <summary>\n        /// Create a serializable character sheet for this character.\n        /// </summary>\n        /// <returns></returns>\n        public abstract SerializableSettingsCharacter Export();\n\n        /// <summary>\n        /// Fetches the data to the given serialization object, used by inheritors.\n        /// </summary>\n        /// <param name=\"serial\">The serial.</param>\n        /// <exception cref=\"System.ArgumentNullException\">serial</exception>\n        protected void Export(SerializableSettingsCharacter serial)\n        {\n            serial.ThrowIfNull(nameof(serial));\n\n            serial.Guid = Guid;\n            serial.ID = Identity.CharacterID;\n            serial.Name = m_name;\n            serial.HomeStationID = homeStation;\n            serial.Birthday = Birthday;\n            serial.Race = Race;\n            serial.BloodLine = Bloodline;\n            serial.Ancestry = Ancestry;\n            serial.Gender = Gender;\n            serial.CorporationName = CorporationName;\n            serial.CorporationID = CorporationID;\n            serial.AllianceName = AllianceName;\n            serial.AllianceID = AllianceID;\n            serial.FreeSkillPoints = FreeSkillPoints;\n            serial.FreeRespecs = AvailableReMaps;\n            serial.CloneState = AccountStatusSettings.ToString();\n            serial.CloneJumpDate = JumpCloneLastJumpDate;\n            serial.LastRespecDate = LastReMapDate;\n            serial.LastTimedRespec = LastReMapTimed;\n            serial.RemoteStationDate = RemoteStationDate;\n            serial.JumpActivationDate = JumpActivationDate;\n            serial.JumpFatigueDate = JumpFatigueDate;\n            serial.JumpLastUpdateDate = JumpLastUpdateDate;\n            serial.Balance = Balance;\n\n            // Info\n            serial.Label = m_label;\n            serial.ShipName = ShipName;\n            serial.ShipTypeName = ShipTypeName;\n            serial.SecurityStatus = SecurityStatus;\n            serial.LastKnownLocation = LastKnownLocation;\n\n            // Employment History\n            serial.EmploymentHistory.AddRange(EmploymentHistory.Export());\n\n            // Attributes\n            serial.Attributes.Intelligence = Intelligence.Base;\n            serial.Attributes.Perception = Perception.Base;\n            serial.Attributes.Willpower = Willpower.Base;\n            serial.Attributes.Charisma = Charisma.Base;\n            serial.Attributes.Memory = Memory.Base;\n\n            // Implants sets\n            serial.ImplantSets = ImplantSets.Export();\n\n            // Skills\n            serial.Skills.AddRange(Skills.Export());\n        }\n\n        /// <summary>\n        /// Imports data from the given character sheet informations.\n        /// </summary>\n        /// <param name=\"serial\">The serialized character sheet</param>\n        internal void Import(CCPAPIResult<SerializableAPICharacterSheet> serial)\n        {\n            Import(serial.Result);\n            EveMonClient.OnCharacterUpdated(this);\n        }\n\n        /// <summary>\n        /// Imports data from the given character sheet informations.\n        /// </summary>\n        /// <param name=\"serial\">The serialized character sheet</param>\n        internal void Import(EsiAPICharacterSheet serial)\n        {\n            // Import from ESI\n            m_name = serial.Name;\n            Birthday = serial.Birthday;\n            Race = serial.Race.ToString().UnderscoresToDashes();\n            Bloodline = serial.BloodLine.ToString().UnderscoresToDashes();\n            Ancestry = serial.Ancestry.ToString().UnderscoresToSpaces();\n            Gender = serial.Gender.ToTitleCase();\n            CorporationID = serial.CorporationID;\n            AllianceID = serial.AllianceID;\n            FactionID = serial.FactionID;\n            SecurityStatus = serial.SecurityStatus;\n            // Enable bypass since we would have a circular loop otherwise\n            CorporationName = EveIDToName.GetIDToName(CorporationID, true);\n            AllianceName = EveIDToName.GetIDToName(AllianceID, true);\n            FactionName = EveIDToName.GetIDToName(FactionID);\n        }\n\n        /// <summary>\n        /// Imports data from the given character sheet informations.\n        /// </summary>\n        /// <param name=\"serial\">The serialized character sheet</param>\n        /// <exception cref=\"System.ArgumentNullException\">serial</exception>\n        protected void Import(SerializableSettingsCharacter serial)\n        {\n            serial.ThrowIfNull(nameof(serial));\n\n            Import((SerializableCharacterSheetBase)serial);\n\n            // Implants\n            ImplantSets.Import(serial.ImplantSets);\n        }\n\n        /// <summary>\n        /// Imports data from the given character sheet informations.\n        /// </summary>\n        /// <param name=\"serial\">The serialized character sheet</param>\n        private void Import(SerializableAPICharacterSheet serial)\n        {\n            Import((SerializableCharacterSheetBase)serial);\n            // Implants\n            if (serial.Implants.Any() || serial.JumpClones.Any())\n                ImplantSets.Import(serial);\n        }\n\n        /// <summary>\n        /// Imports data from the given character account balance.\n        /// </summary>\n        /// <param name=\"result\">The serialized character account balance</param>\n        internal void Import(string result)\n        {\n            decimal balance;\n            if (result.TryParseInv(out balance))\n                Balance = balance;\n        }\n\n        /// <summary>\n        /// Imports data from the given character location.\n        /// </summary>\n        /// <param name=\"location\">The serialized character location</param>\n        internal void Import(EsiAPILocation location)\n        {\n            LastKnownLocation = location.ToXMLItem();\n        }\n\n        /// <summary>\n        /// Imports data from the given character ship information.\n        /// </summary>\n        /// <param name=\"ship\">The serialized character ship information</param>\n        internal void Import(EsiAPIShip ship)\n        {\n            ShipName = ship.ShipName;\n            ShipTypeName = StaticItems.GetItemName(ship.ShipTypeID);\n        }\n\n        /// <summary>\n        /// Imports data from the given character jump fatigue.\n        /// </summary>\n        /// <param name=\"fatigue\">The serialized character jump fatigue</param>\n        internal void Import(EsiAPIJumpFatigue fatigue)\n        {\n            JumpLastUpdateDate = fatigue.LastUpdate;\n            JumpFatigueDate = fatigue.FatigueExpires;\n            JumpActivationDate = fatigue.LastJump;\n        }\n\n        /// <summary>\n        /// Imports data from the given character clone information.\n        /// </summary>\n        /// <param name=\"clones\">The serialized character clone information</param>\n        internal void Import(EsiAPIClones clones)\n        {\n            // Information about clone jumping and clone moving\n            JumpCloneLastJumpDate = clones.LastCloneJump;\n            RemoteStationDate = clones.LastStationChange;\n            homeStation = clones.HomeLocation.LocationID;\n            ImplantSets.Import(clones);\n        }\n\n        /// <summary>\n        /// Imports data from the given character attribute information.\n        /// </summary>\n        /// <param name=\"attribs\">The serialized character attribute information</param>\n        internal void Import(EsiAPIAttributes attribs)\n        {\n            // Remap info\n            DateTime lastRespec = DateTime.MinValue, nextRespec = attribs.RemapCooldownDate;\n            if (nextRespec > DateTime.MinValue)\n                lastRespec = nextRespec.Subtract(TimeSpan.FromDays(365.0));\n            LastReMapTimed = lastRespec;\n            AvailableReMaps = attribs.BonusRemaps;\n            LastReMapDate = attribs.LastRemap;\n\n            SetAttribute(EveAttribute.Intelligence, attribs.Intelligence);\n            SetAttribute(EveAttribute.Perception, attribs.Perception);\n            SetAttribute(EveAttribute.Willpower, attribs.Willpower);\n            SetAttribute(EveAttribute.Charisma, attribs.Charisma);\n            SetAttribute(EveAttribute.Memory, attribs.Memory);\n        }\n\n        /// <summary>\n        /// Attributes include current implants! Therefore, subtract the information\n        /// about current implants since those were fetched with Implants beforehand.\n        /// </summary>\n        /// <param name=\"attribute\">The attribute to set.</param>\n        /// <param name=\"value\">The value reported by Attributes ESI call.</param>\n        private void SetAttribute(EveAttribute attribute, int value)\n        {\n            m_attributes[(int)attribute].Base = value - CurrentImplants[attribute]?.Bonus ?? 0;\n        }\n\n        /// <summary>\n        /// Imports data from the given skills information.\n        /// </summary>\n        /// <param name=\"skills\">The serialized character skill information</param>\n        internal void Import(EsiAPISkills skills, EsiAPISkillQueue queue)\n        {\n            var newSkills = new LinkedList<SerializableCharacterSkill>();\n            DateTime uselessDate = DateTime.UtcNow;\n            FreeSkillPoints = skills.UnallocatedSP;\n\n            // Keep track of the current skill queue's completed skills, as ESI does not\n            // transfer them to the skills list until you login\n            var dict = new Dictionary<long, SerializableQueuedSkill>();\n            if (queue != null)\n                foreach (var queuedSkill in queue.CreateSkillQueue())\n                {\n                    // If the skill is completed or currently training, we need it later to\n                    // copy the progress over to the imported skills\n                    if (queuedSkill.IsCompleted || queuedSkill.IsTraining)\n                    {\n                        if (!dict.ContainsKey(queuedSkill.ID))\n                            dict.Add(queuedSkill.ID, queuedSkill);\n                        else\n                            dict[queuedSkill.ID] = queuedSkill;\n                    }\n                }\n            // Convert skills to EVE format\n            foreach (var skill in skills.Skills)\n            {\n                // Check if the skill is in the queue, and completed at a higher level or has\n                // higher current SP\n                if (dict.ContainsKey(skill.ID))\n                {\n                    var queuedSkill = dict[skill.ID];\n                    if (queuedSkill.IsCompleted)\n                    {\n                        // The active level could be less than the skill level if the character\n                        // finished an omega skill level (e.g. Repair Systems V) and then went\n                        // alpha without logging in. However, the alternative is to leave\n                        // ActiveLevel too low which breaks omega detection 100%\n                        skill.ActiveLevel = Math.Max(skill.ActiveLevel, queuedSkill.Level);\n                        // Queued skill is completed, so make sure the imported skill is\n                        // updated\n                        skill.Level = Math.Max(skill.Level, queuedSkill.Level);\n                        skill.Skillpoints = Math.Max(skill.Skillpoints, queuedSkill.EndSP);\n                    }\n                    else if (queuedSkill.IsTraining)\n                    {\n                        // Queued skill is currently training - use QueuedSkill class to\n                        // calculate the CurrentSP of the skill\n                        var tempSkill = new QueuedSkill(this, queuedSkill, ref uselessDate);\n                        skill.Skillpoints = Math.Max(skill.Skillpoints, tempSkill.CurrentSP);\n                    }\n                }\n                newSkills.AddLast(skill.ToXMLItem());\n            }\n            Skills.Import(newSkills, true);\n\n            UpdateMasteries();\n        }\n\n        /// <summary>\n        /// Imports data from the given implants information.\n        /// </summary>\n        /// <param name=\"implants\">The serialized implant information</param>\n        internal void Import(List<int> implants)\n        {\n            // Implants\n            var newImplants = new LinkedList<SerializableNewImplant>();\n            foreach (int implant in implants)\n                newImplants.AddLast(new SerializableNewImplant()\n                {\n                    ID = implant,\n                    Name = StaticItems.GetItemName(implant)\n                });\n            CurrentImplants.Import(newImplants);\n        }\n\n        /// <summary>\n        /// Imports data from the given employment history information.\n        /// </summary>\n        /// <param name=\"history\">The serialized employment history information</param>\n        internal void Import(EsiAPIEmploymentHistory history)\n        {\n            EmploymentHistory.Import(history.ToXMLItem());\n        }\n\n        /// <summary>\n        /// Imports data from the given character sheet informations.\n        /// </summary>\n        /// <param name=\"serial\">The serialized character sheet</param>\n        private void Import(SerializableCharacterSheetBase serial)\n        {\n            // Bio\n            m_name = serial.Name;\n            homeStation = serial.HomeStationID;\n            Birthday = serial.Birthday;\n            Race = serial.Race;\n            Bloodline = serial.BloodLine;\n            Ancestry = serial.Ancestry;\n            Gender = serial.Gender;\n            CorporationName = serial.CorporationName;\n            CorporationID = serial.CorporationID;\n            AllianceName = serial.AllianceName;\n            AllianceID = serial.AllianceID;\n            FreeSkillPoints = serial.FreeSkillPoints;\n            AvailableReMaps = serial.FreeRespecs;\n            JumpCloneLastJumpDate = serial.CloneJumpDate;\n            LastReMapDate = serial.LastRespecDate;\n            LastReMapTimed = serial.LastTimedRespec;\n            RemoteStationDate = serial.RemoteStationDate;\n            JumpActivationDate = serial.JumpActivationDate;\n            JumpFatigueDate = serial.JumpFatigueDate;\n            JumpLastUpdateDate = serial.JumpLastUpdateDate;\n            Balance = serial.Balance;\n\n            // Read clone status override, or \"Auto\"\n            AccountStatusMode cloneState;\n            if (Enum.TryParse(serial.CloneState ?? \"\", out cloneState))\n                AccountStatusSettings = cloneState;\n\n            var settingsChar = serial as SerializableSettingsCharacter;\n            if (settingsChar != null)\n            {\n                // Info\n                m_label = settingsChar.Label ?? string.Empty;\n                ShipName = settingsChar.ShipName;\n                ShipTypeName = settingsChar.ShipTypeName;\n                SecurityStatus = settingsChar.SecurityStatus;\n                LastKnownLocation = settingsChar.LastKnownLocation;\n\n                // Employment History\n                EmploymentHistory.Import(settingsChar.EmploymentHistory);\n            }\n\n            // Attributes\n            m_attributes[(int)EveAttribute.Intelligence].Base = serial.Attributes.Intelligence;\n            m_attributes[(int)EveAttribute.Perception].Base = serial.Attributes.Perception;\n            m_attributes[(int)EveAttribute.Willpower].Base = serial.Attributes.Willpower;\n            m_attributes[(int)EveAttribute.Charisma].Base = serial.Attributes.Charisma;\n            m_attributes[(int)EveAttribute.Memory].Base = serial.Attributes.Memory;\n\n            // Skills\n            Skills.Import(serial.Skills, serial is SerializableAPICharacterSheet);\n\n            UpdateMasteries();\n        }\n\n        /// <summary>\n        /// Updates the character masteries and certificates, such as after a skill level change.\n        /// </summary>\n        private void UpdateMasteries()\n        {\n            TaskHelper.RunCPUBoundTaskAsync(() =>\n            {\n                // Certificates and masteries\n                Certificates.Initialize();\n                MasteryShips.Initialize();\n            });\n        }\n\n        /// <summary>\n        /// Imports the given plans.\n        /// </summary>\n        /// <param name=\"plans\"></param>\n        internal void ImportPlans(IEnumerable<SerializablePlan> plans)\n        {\n            Plans.Import(plans);\n        }\n\n        /// <summary>\n        /// Export the plans to the given list.\n        /// </summary>\n        /// <param name=\"list\"></param>\n        internal void ExportPlans(List<SerializablePlan> list)\n        {\n            list.AddRange(Plans.Select(plan => plan.Export()));\n        }\n\n        #endregion\n\n\n        /// <summary>\n        /// Gets the UI settings for this character.\n        /// </summary>\n        public CharacterUISettings UISettings { get; internal set; }\n\n        /// <summary>\n        /// Gets a unique hashcode for this character.\n        /// </summary>\n        /// <returns></returns>\n        public override int GetHashCode() => Guid.GetHashCode();\n\n        /// <summary>\n        /// Gets the name of the character.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => m_name;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/CharacterAttribute.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents an attribute for a character scratchpad\n    /// </summary>\n    public sealed class CharacterAttribute : ICharacterAttribute\n    {\n        private readonly EveAttribute m_attrib;\n        private readonly Character m_character;\n\n        /// <summary>\n        /// Constructor from a character attribute.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"attrib\"></param>\n        internal CharacterAttribute(Character character, EveAttribute attrib)\n        {\n            Base = EveConstants.CharacterBaseAttributePoints;\n            m_attrib = attrib;\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Gets the base attribute.\n        /// </summary>\n        public long Base { get; internal set; }\n\n        /// <summary>\n        /// Gets the bonus granted by the implant.\n        /// </summary>\n        public long ImplantBonus => m_character.CurrentImplants[m_attrib].Bonus;\n\n        /// <summary>\n        /// Gets the effective attribute value.\n        /// </summary>\n        public long EffectiveValue => Base + ImplantBonus;\n\n        /// <summary>\n        /// Gets a string representation with the provided format. The following parameters are accepted :\n        /// <list type=\"bullet\"><item>%n for name (lower case)</item><item>%N for name (CamelCase)</item><item>%B for attribute base value</item><item>%b for base bonus</item><item>%i for implant bonus</item><item>%r for remapping points</item><item>%e for effective value</item></list>\n        /// </summary>\n        /// <param name=\"format\">The format.</param>\n        /// <returns>\n        /// The formatted string.\n        /// </returns>\n        /// <exception cref=\"System.ArgumentNullException\">format</exception>\n        public string ToString(string format)\n        {\n            format.ThrowIfNull(nameof(format));\n\n            format = format.Replace(\"%n\", m_attrib.ToString().ToLower(CultureConstants.DefaultCulture));\n            format = format.Replace(\"%N\", m_attrib.ToString());\n            format = format.Replace(\"%B\", EveConstants.CharacterBaseAttributePoints.ToString(CultureConstants.DefaultCulture));\n            format = format.Replace(\"%b\", Base.ToString(CultureConstants.DefaultCulture));\n            format = format.Replace(\"%i\", ImplantBonus.ToString(CultureConstants.DefaultCulture));\n            format = format.Replace(\"%r\",\n                (Base - EveConstants.CharacterBaseAttributePoints).ToString(CultureConstants.DefaultCulture));\n            format = format.Replace(\"%e\", EffectiveValue.ToString(\"0\", CultureConstants.DefaultCulture));\n            return format;\n        }\n\n        /// <summary>\n        /// Gets a string representation with the following format : \"<c>Intelligence : 15</c>\"\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => $\"{m_attrib} : {EffectiveValue}\";\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/CharacterIdentity.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing EVEMon.Common.Enumerations.CCPAPI;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a character's identity, defined by its sole ID. \n    /// Character identities to ensure \n    /// </summary>\n    public sealed class CharacterIdentity\n    {\n        private readonly Collection<ESIKey> m_apiKeys;\n\n        /// <summary>\n        /// Constructor from an id and a name.\n        /// </summary>\n        /// <param name=\"id\">The id for this identity</param>\n        /// <param name=\"name\">The name.</param>\n        internal CharacterIdentity(long id, string name)\n        {\n            CharacterID = id;\n            CharacterName = name;\n\n            m_apiKeys = new Collection<ESIKey>();\n        }\n\n        /// <summary>\n        /// Gets the character ID.\n        /// </summary>\n        /// <value>The character ID.</value>\n        public long CharacterID { get; }\n\n        /// <summary>\n        /// Gets the character's name.\n        /// </summary>\n        /// <value>The name of the character.</value>\n        public string CharacterName { get; internal set; }\n        \n        /// <summary>\n        /// Gets the API keys this identity is associated with.\n        /// </summary>\n        public Collection<ESIKey> ESIKeys => m_apiKeys;\n\n        /// <summary>\n        /// Gets the character type API keys.\n        /// </summary>\n        /// <value>The character type API keys.</value>\n        public IEnumerable<ESIKey> CharacterTypeAPIKeys => ESIKeys;\n        \n        /// <summary>\n        /// Gets the CCP character representing this identity, or null when there is none.\n        /// </summary>\n        public CCPCharacter CCPCharacter => EveMonClient.Characters.OfType<CCPCharacter>()\n                .FirstOrDefault(character => character.CharacterID == CharacterID);\n\n        /// <summary>\n        /// Finds the API key with access to the specified API method.\n        /// </summary>\n        /// <param name=\"method\">The method.</param>\n        /// <returns>The API key with access to the specified method or null if non found.</returns>\n        public ESIKey FindAPIKeyWithAccess(ESIAPICharacterMethods method)\n            => ESIKeys.FirstOrDefault(apiKey => apiKey.Monitored && (ulong)method == (apiKey.AccessMask & (ulong)method));\n\n        /// <summary>\n        /// Finds the API key with access to the specified API method.\n        /// </summary>\n        /// <param name=\"method\">The method.</param>\n        /// <returns>The API key with access to the specified method or null if non found.</returns>\n        public ESIKey FindAPIKeyWithAccess(ESIAPICorporationMethods method)\n            => ESIKeys.FirstOrDefault(apiKey => apiKey.Monitored && (ulong)method == (apiKey.AccessMask & (ulong)method));\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/AssetCollection.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class AssetCollection : ReadonlyCollection<Asset>\n    {\n        private readonly CCPCharacter m_character;\n        private readonly Dictionary<SolarSystem, int> m_jumps = new Dictionary<SolarSystem, int>();\n\n        private SolarSystem m_lastStoredCharacterKnownSolarSystem;\n        private bool m_isImporting;\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal AssetCollection(CCPCharacter character)\n        {\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable assets from the API.</param>\n        internal void Import(IEnumerable<EsiAssetListItem> src)\n        {\n            var newAssets = src.Select((asset) => new Asset(asset, m_character)).ToList();\n            // Create a lookup table to find asset containers by ID\n            var lookup = new Dictionary<long, Asset>(newAssets.Count);\n            foreach (var asset in src)\n            {\n                long id = asset.ItemID;\n                if (!lookup.ContainsKey(id))\n                    // Create asset objects, this can be done outside of the importing process\n                    lookup.Add(id, new Asset(asset, m_character));\n            }\n            // Step 2: Match the items to their containers\n            Asset root, container;\n            int levels;\n            foreach (Asset asset in newAssets)\n            {\n                // Try to find the parent in the assets list\n                root = asset;\n                for (levels = 0; levels < 2 && lookup.TryGetValue(root.LocationID, out\n                    container); levels++)\n                {\n                    root = container;\n                }\n                if (levels > 0)\n                {\n                    // If it succeeded at least once, put root location ID as the location\n                    asset.Container = root.Item.Name;\n                    asset.LocationID = root.LocationID;\n                }\n                asset.UpdateLocation();\n            }\n            // Step 3: Initial jump totals\n            foreach (Asset asset in newAssets)\n                asset.Jumps = GetJumps(asset);\n\n            m_isImporting = true;\n            Items.Clear();\n            foreach (Asset asset in newAssets)\n                Items.Add(asset);\n            m_isImporting = false;\n        }\n\n        /// <summary>\n        /// Updates the location.\n        /// </summary>\n        public void UpdateLocation()\n        {\n            foreach (Asset asset in Items.TakeWhile(asset => !m_isImporting))\n            {\n                asset.UpdateLocation();\n                asset.Jumps = GetJumps(asset);\n            }\n        }\n\n        /// <summary>\n        /// Gets the jumps.\n        /// </summary>\n        /// <param name=\"asset\">The asset.</param>\n        /// <returns></returns>\n        private int GetJumps(Asset asset)\n        {\n            SolarSystem lastKnownSolarSystem = m_character.LastKnownSolarSystem ??\n                (m_character.LastKnownStation?.SolarSystem);\n\n            // When data to calculate jumps are insufficient return a default value\n            if (lastKnownSolarSystem == null || asset.SolarSystem == null)\n                return -1;\n\n            // Reset everything if the character changed solar system\n            if (m_lastStoredCharacterKnownSolarSystem != lastKnownSolarSystem)\n            {\n                m_jumps.Clear();\n                m_lastStoredCharacterKnownSolarSystem = lastKnownSolarSystem;\n            }\n\n            // If the asset's solar sytem is known return the stored jumps\n            if (m_jumps.ContainsKey(asset.SolarSystem))\n                return m_jumps[asset.SolarSystem];\n\n            // Calculate the jumps between the character and the asset\n            int jumps = lastKnownSolarSystem.GetFastestPathTo(asset.SolarSystem,\n                PathSearchCriteria.FewerJumps).Count(system => system != lastKnownSolarSystem);\n\n            // Store the calculated jumps\n            m_jumps[asset.SolarSystem] = jumps;\n\n            // Return value\n            return jumps;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/CharacterIdentityIgnoreList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class CharacterIdentityIgnoreList : ReadonlyCollection<CharacterIdentity>\n    {\n        private readonly ESIKey m_owner;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"apiKey\"></param>\n        internal CharacterIdentityIgnoreList(ESIKey apiKey)\n        {\n            m_owner = apiKey;\n        }\n\n        /// <summary>\n        /// Checks whether the given character's associated identity is contained in this list.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">character</exception>\n        public bool Contains(Character character)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            return Contains(character.Identity);\n        }\n\n        /// <summary>\n        /// Removes this character and attempts to return a CCP character.\n        /// The resulting character will be the existing one matching this id, or if it does not exist, a new character.\n        /// If the identity was not in the collection, the method won't attempt to create a new character and will return either the existing one or null.\n        /// </summary>\n        /// <param name=\"identity\">The identity.</param>\n        /// <exception cref=\"System.ArgumentNullException\">id</exception>\n        public void Remove(CharacterIdentity identity)\n        {\n            identity.ThrowIfNull(nameof(identity));\n\n            // If the id was not in list, returns the existing character or null if it does not exist\n            if (!Items.Remove(identity))\n                return;\n\n            // If character exists, returns it\n            if (identity.CCPCharacter != null)\n                return;\n\n            // Create a new CCP character\n            EveMonClient.Characters.Add(new CCPCharacter(identity));\n        }\n\n        /// <summary>\n        /// Adds a character to the ignore list and, if it belonged to this API key, removes it from the global collection\n        /// (all associated data and plans won't be written on next serialization !).\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <exception cref=\"System.ArgumentNullException\">character</exception>\n        public void Add(Character character)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            CharacterIdentity id = character.Identity;\n            if (Items.Contains(id))\n                return;\n\n            Items.Add(id);\n\n            // If the identity was belonging to this API key, remove the character (won't be serialized anymore !)\n            if (id.ESIKeys.Contains(m_owner))\n                EveMonClient.Characters.Remove(character);\n        }\n\n        /// <summary>\n        /// Imports the deserialization objects.\n        /// </summary>\n        /// <param name=\"serialIDList\"></param>\n        internal void Import(IEnumerable<SerializableCharacterIdentity> serialIDList)\n        {\n            Items.Clear();\n            foreach (CharacterIdentity id in serialIDList.Select(\n                serialID => EveMonClient.CharacterIdentities[serialID.ID] ??\n                            EveMonClient.CharacterIdentities.Add(serialID.ID, serialID.Name)))\n            {\n                Items.Add(id);\n            }\n        }\n\n        /// <summary>\n        /// Create serialization objects.\n        /// </summary>\n        /// <returns></returns>\n        internal IEnumerable<SerializableCharacterIdentity> Export()\n            => Items.Select(id => new SerializableCharacterIdentity\n            {\n                ID = id.CharacterID,\n                Name = id.CharacterName,\n            });\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/ContactCollection.cs",
    "content": "﻿using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class ContactCollection : ReadonlyCollection<Contact>\n    {\n        private readonly CCPCharacter m_character;\n        \n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal ContactCollection(CCPCharacter character)\n        {\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable contacts from the API.</param>\n        internal void Import(IEnumerable<EsiContactListItem> src)\n        {\n            Items.Clear();\n\n            // Import the contacts from the API\n            foreach (EsiContactListItem srcContact in src)\n                Items.Add(new Contact(srcContact));\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/ContractCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public class ContractCollection : ReadonlyCollection<Contract>\n    {\n        private readonly CCPCharacter m_character;\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal ContractCollection(CCPCharacter character)\n        {\n            m_character = character;\n        }\n\n\n        #region Importation/Exportation Methods\n\n        /// <summary>\n        /// Imports an enumeration of serialization objects.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        internal void Import(IEnumerable<SerializableContract> src)\n        {\n            Items.Clear();\n            foreach (SerializableContract srcContract in src)\n            {\n                Items.Add(new Contract(m_character, srcContract));\n            }\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable contracts from the API.</param>\n        /// <param name=\"endedContracts\">The ended contracts.</param>\n        internal void Import(IEnumerable<EsiContractListItem> src,\n            ICollection<Contract> endedContracts)\n        {\n            // Mark all contracts for deletion\n            // If they are found again on the API feed, they won't be deleted\n            // and those set as ignored will be left as ignored\n            foreach (Contract contract in Items)\n                contract.MarkedForDeletion = true;\n            // Import the contracts from the API, excluding the expired assigned ones\n            var newContracts = new LinkedList<Contract>();\n            DateTime now = DateTime.UtcNow;\n            foreach (var contract in src)\n            {\n                var status = contract.Status;\n                // For contracts issued to/by us, or finished, or outstanding and unexpired\n                if (contract.IssuerID == m_character.CharacterID || status ==\n                    CCPContractStatus.Completed.ToString() || status == CCPContractStatus.\n                    CompletedByContractor.ToString() || status == CCPContractStatus.\n                    CompletedByIssuer.ToString() || (status == CCPContractStatus.Outstanding.\n                    ToString() && contract.DateExpired >= now) || contract.AcceptorID ==\n                    m_character.CharacterID)\n                {\n                    // Exclude contracts which expired or were completed too long ago\n                    var limit = contract.DateExpired.AddDays(Contract.MaxEndedDays);\n                    if ((limit >= now || status == CCPContractStatus.Outstanding.ToString()) &&\n                            !Items.Any(x => x.TryImport(contract, endedContracts)))\n                        // Exclude contracts which matched an existing contract\n                        newContracts.AddLast(new Contract(m_character, contract));\n                }\n            }\n            // Add the new contracts that need attention to be notified to the user\n            endedContracts.AddRange(newContracts.Where(newContract => newContract.NeedsAttention));\n            // Add the items that are no longer marked for deletion\n            newContracts.AddRange(Items.Where(x => !x.MarkedForDeletion));\n            Items.Clear();\n            Items.AddRange(newContracts);\n        }\n\n        /// <summary>\n        /// Exports only the character issued contracts to a serialization object for the settings file.\n        /// </summary>\n        /// <returns></returns>\n        /// <remarks>Used to export only the corporation contracts issued by a character.</remarks>\n        internal IEnumerable<SerializableContract> ExportOnlyIssuedByCharacter()\n            => Items.Where(contract => contract.IssuerID == m_character.CharacterID).Select(contract => contract.Export());\n\n        /// <summary>\n        /// Exports the contracts to a serialization object for the settings file.\n        /// </summary>\n        /// <returns></returns>\n        internal IEnumerable<SerializableContract> Export() => Items.Select(contract => contract.Export());\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/EmploymentRecordCollection.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class EmploymentRecordCollection : ReadonlyCollection<EmploymentRecord>\n    {\n        private readonly Character m_character;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal EmploymentRecordCollection(Character character)\n        {\n            m_character = character;\n        }\n\n        #endregion\n\n\n        #region Import & Export Methods\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable objects from the API.</param>\n        internal void Import(IEnumerable<SerializableEmploymentHistoryListItem> src)\n        {\n            Items.Clear();\n\n            // Import the employment history from the API\n            foreach (SerializableEmploymentHistoryListItem srcEmploymentRecord in src)\n            {\n                Items.Add(new EmploymentRecord(m_character, srcEmploymentRecord));\n            }\n        }\n\n        /// <summary>\n        /// Imports an enumeration of serialization objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable objects from the settings file.</param>\n        internal void Import(IEnumerable<SerializableEmploymentHistory> src)\n        {\n            Items.Clear();\n\n            foreach (SerializableEmploymentHistory srcEmploymentRecord in src)\n            {\n                Items.Add(new EmploymentRecord(m_character, srcEmploymentRecord));\n            }\n        }\n\n        /// <summary>\n        /// Exports the serialization object for the settings file.\n        /// </summary>\n        /// <returns>List of serializable employment records.</returns>\n        internal IEnumerable<SerializableEmploymentHistory> Export()\n            => Items.Select(employmentRecord => employmentRecord.Export());\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/EveFactionWarfareStatsCollection.cs",
    "content": "using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public class EveFactionWarfareStatsCollection : ReadonlyCollection<EveFactionWarfareStats>\n    {\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        internal void Import(IEnumerable<SerializableEveFactionalWarfareStatsListItem> src)\n        {\n            Items.Clear();\n\n            foreach (SerializableEveFactionalWarfareStatsListItem item in src)\n            {\n                Items.Add(new EveFactionWarfareStats(item));\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/EveFactionWarsCollection.cs",
    "content": "using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public class EveFactionWarsCollection : ReadonlyCollection<EveFactionWar>\n    {\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        internal void Import(IEnumerable<SerializableEveFactionWarsListItem> src)\n        {\n            Items.Clear();\n\n            foreach (SerializableEveFactionWarsListItem item in src)\n            {\n                Items.Add(new EveFactionWar(item));\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/EveMailMessageCollection.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class EveMailMessageCollection : ReadonlyCollection<EveMailMessage>\n    {\n        private readonly CCPCharacter m_ccpCharacter;\n        private long m_highestID;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"ccpCharacter\">The CCP character.</param>\n        internal EveMailMessageCollection(CCPCharacter ccpCharacter)\n        {\n            m_ccpCharacter = ccpCharacter;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the number of new messages.\n        /// </summary>\n        /// <value>The new messages.</value>\n        internal int NewMessages { get; private set; }\n\n        #endregion\n\n\n        #region Importation & Exportation\n\n        /// <summary>\n        /// Imports the eve mail messages IDs from a serializable object.\n        /// </summary>\n        /// <param name=\"eveMailMessagesIDs\">The eve mail messages IDs.</param>\n        internal void Import(string eveMailMessagesIDs)\n        {\n            if (string.IsNullOrEmpty(eveMailMessagesIDs))\n                return;\n\n            Items.Clear();\n            List<string> ids = eveMailMessagesIDs.Split(',').ToList();\n            foreach (long id in ids.Select(long.Parse))\n            {\n                Items.Add(new EveMailMessage(m_ccpCharacter,\n                    new SerializableMailMessagesListItem\n                    {\n                        MessageID = id\n                    }));\n            }\n\n            // Set the last received ID \n            m_highestID = Items.Any() ? Items.Max(item => item.MessageID) : 0;\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable mail messages from the API.</param>\n        internal void Import(IEnumerable<SerializableMailMessagesListItem> src)\n        {\n            NewMessages = 0;\n            List<EveMailMessage> newMessages = new List<EveMailMessage>();\n\n            // Import the mail messages from the API\n            // To distinguish new EVE mails from old EVE mails that have been added to the API list\n            // due to deletion of some EVE mails in-game, we need to sort the received data \n            foreach (SerializableMailMessagesListItem srcEVEMailMessage in src.OrderBy(x => x.MessageID))\n            {\n                // Is it an Inbox message ?\n                if (m_ccpCharacter.CharacterID != srcEVEMailMessage.SenderID)\n                {\n                    // If it's a newly mail message and not an old mail message added to the API list, increase the counter\n                    EveMailMessage message = Items.FirstOrDefault(x => x.MessageID == srcEVEMailMessage.MessageID);\n                    if (message == null && srcEVEMailMessage.MessageID > m_highestID)\n                    {\n                        NewMessages++;\n                        m_highestID = srcEVEMailMessage.MessageID;\n                    }\n                }\n\n                newMessages.Add(new EveMailMessage(m_ccpCharacter, srcEVEMailMessage));\n            }\n\n            Items.Clear();\n            Items.AddRange(newMessages);\n\n            // Set the last received ID \n            m_highestID = Items.Any() ? Items.Max(item => item.MessageID) : 0;\n\n            // Fires the event regarding EVE mail messages update\n            EveMonClient.OnCharacterEVEMailMessagesUpdated(m_ccpCharacter);\n        }\n\n        /// <summary>\n        /// Exports the eve mail messages IDs to a serializable object.\n        /// </summary>\n        /// <returns></returns>\n        // Store only the mail messages IDs from the inbox in a descending order\n        internal string Export() => string.Join(\",\", Items.Where(x => x.SenderName != m_ccpCharacter.Name).OrderByDescending(\n            x => x.MessageID).Select(message => message.MessageID.ToString(CultureConstants.InvariantCulture)));\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/EveMailingListCollection.cs",
    "content": "﻿using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class EveMailingListCollection : ReadonlyCollection<EveMailingList>\n    {\n        private readonly CCPCharacter m_ccpCharacter;\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"ccpCharacter\">The CCP character.</param>\n        internal EveMailingListCollection(CCPCharacter ccpCharacter)\n        {\n            m_ccpCharacter = ccpCharacter;\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        internal void Import(IEnumerable<EsiMailingListsListItem> src)\n        {\n            Items.Clear();\n\n            // Import the mail messages from the API\n            foreach (EsiMailingListsListItem srcEVEMailingList in src)\n            {\n                Items.Add(new EveMailingList(srcEVEMailingList));\n            }\n\n            // Fires the event regarding EVE mailing lists update\n            EveMonClient.OnCharacterEVEMailingListsUpdated(m_ccpCharacter);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/EveNotificationCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class EveNotificationCollection : ReadonlyCollection<EveNotification>\n    {\n        private readonly CCPCharacter m_ccpCharacter;\n        private long m_highestID;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"ccpCharacter\">The CCP character.</param>\n        internal EveNotificationCollection(CCPCharacter ccpCharacter)\n        {\n            m_ccpCharacter = ccpCharacter;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the number of new notifications.\n        /// </summary>\n        /// <value>The new notifications.</value>\n        public int NewNotifications { get; private set; }\n\n        #endregion\n\n\n        #region Importation & Exportation\n\n        /// <summary>\n        /// Imports the eve notifications IDs from a serializable object.\n        /// </summary>\n        /// <param name=\"eveNotificationsIDs\">The eve notifications IDs.</param>\n        internal void Import(string eveNotificationsIDs)\n        {\n            if (string.IsNullOrEmpty(eveNotificationsIDs))\n                return;\n\n            Items.Clear();\n            List<string> ids = eveNotificationsIDs.Split(',').ToList();\n            foreach (long id in ids.Select(long.Parse))\n            {\n                Items.Add(new EveNotification(m_ccpCharacter, new EsiNotificationsListItem\n                {\n                    NotificationID = id\n                }));\n            }\n\n            // Set the last received ID \n            m_highestID = Items.Any() ? Items.Max(item => item.NotificationID) : 0;\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable notifications from the API.</param>\n        internal void Import(IEnumerable<EsiNotificationsListItem> src)\n        {\n            NewNotifications = 0;\n\n            List<EveNotification> newNotifications = new List<EveNotification>();\n\n            // Import the notifications from the API\n            foreach (EsiNotificationsListItem srcEVENotification in src.OrderBy(x => x.NotificationID))\n            {\n                // If it's a new notification and not an old notification added to the API list, increase the counter\n                EveNotification notification = Items.FirstOrDefault(x => x.NotificationID == srcEVENotification.NotificationID);\n                if (notification == null && !srcEVENotification.Read && srcEVENotification.NotificationID > m_highestID)\n                {\n                    NewNotifications++;\n                    m_highestID = srcEVENotification.NotificationID;\n                }\n\n                newNotifications.Add(new EveNotification(m_ccpCharacter, srcEVENotification));\n            }\n\n            Items.Clear();\n            Items.AddRange(newNotifications);\n\n            // Set the last received ID \n            m_highestID = Items.Any() ? Items.Max(item => item.NotificationID) : 0;\n\n            // Fires the event regarding EVE mail messages update\n            EveMonClient.OnCharacterEVENotificationsUpdated(m_ccpCharacter);\n        }\n\n        /// <summary>\n        /// Exports the eve notifications IDs to a serializable object.\n        /// </summary>\n        /// <returns></returns>\n        internal string Export() => string.Join(\",\", Items.Select(notification =>\n            notification.NotificationID.ToString(CultureConstants.InvariantCulture)));\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/ImplantSetCollection.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Service;\nusing System.Globalization;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    /// <summary>\n    /// Represents a collection of implants sets.\n    /// </summary>\n    public sealed class ImplantSetCollection : ReadonlyVirtualCollection<ImplantSet>\n    {\n        private readonly Character m_character;\n        private readonly List<ImplantSet> m_cloneSets;\n        private readonly List<ImplantSet> m_customSets;\n        private ImplantSet m_current;\n\n        /// <summary>\n        /// Internal constructor\n        /// </summary>\n        /// <param name=\"character\"></param>\n        internal ImplantSetCollection(Character character)\n        {\n            m_character = character;\n            m_customSets = new List<ImplantSet>();\n            m_cloneSets = new List<ImplantSet>();\n            ActiveClone = new ImplantSet(character, \"Active Clone\");\n            None = new ImplantSet(character, \"None\");\n            m_current = ActiveClone;\n        }\n\n        /// <summary>\n        /// Gets the implant set by its index.\n        /// First items are <see cref=\"ActiveClone\"/> then the jump clones then the custom sets.\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        public ImplantSet this[int index] => Enumerate().ElementAt(index);\n\n        /// <summary>\n        /// Gets the none implant.\n        /// </summary>\n        public ImplantSet None { get; }\n\n        /// <summary>\n        /// Gets the implants retrieved from the API.\n        /// </summary>\n        public ImplantSet ActiveClone { get; }\n\n        /// <summary>\n        /// Gets or sets the current implant set.\n        /// </summary>\n        public ImplantSet Current\n        {\n            get { return m_current; }\n            set\n            {\n                if (m_current == value)\n                    return;\n\n                m_current = value;\n                EveMonClient.OnCharacterUpdated(m_character);\n            }\n        }\n\n        /// <summary>\n        /// Adds a new implant set.\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        public ImplantSet Add(string name)\n        {\n            ImplantSet set = new ImplantSet(m_character, name);\n            m_customSets.Add(set);\n            EveMonClient.OnCharacterUpdated(m_character);\n            return set;\n        }\n\n        /// <summary>\n        /// Removes the given set.\n        /// </summary>\n        /// <param name=\"set\"></param>\n        public void Remove(ImplantSet set)\n        {\n            m_customSets.Remove(set);\n            EveMonClient.OnCharacterUpdated(m_character);\n        }\n\n        /// <summary>\n        /// Core method on which everything else relies.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<ImplantSet> Enumerate()\n        {\n            yield return ActiveClone;\n\n            foreach (ImplantSet set in m_cloneSets)\n            {\n                yield return set;\n            }\n\n            foreach (ImplantSet set in m_customSets)\n            {\n                yield return set;\n            }\n        }\n\n        /// <summary>\n        /// Imports data from an ESI deserialization object.\n        /// </summary>\n        public void Import(EsiAPIClones serial)\n        {\n            if (serial == null)\n                return;\n\n            m_cloneSets.Clear();\n            // Jump clones\n            foreach (var clone in serial.JumpClones)\n            {\n                int cloneID = clone.JumpCloneID;\n                var set = new ImplantSet(m_character, GetCloneName(clone.Name, clone.\n                    LocationID));\n                // Jump clone implants\n                var jcImplants = new LinkedList<SerializableNewImplant>();\n                foreach (int implant in clone.Implants)\n                    jcImplants.AddLast(new SerializableNewImplant()\n                    {\n                        ID = implant,\n                        Name = StaticItems.GetItemName(implant)\n                    });\n                set.Import(jcImplants);\n                m_cloneSets.Add(set);\n            }\n\n            EveMonClient.OnCharacterImplantSetCollectionChanged(m_character);\n        }\n\n        /// <summary>\n        /// Imports data from a deserialization object.\n        /// </summary>\n        public void Import(SerializableImplantSetCollection serial)\n        {\n            if (serial == null)\n                return;\n\n            ActiveClone.Import(serial.ActiveClone);\n\n            m_cloneSets.Clear();\n            foreach (SerializableSettingsImplantSet serialSet in serial.JumpClones)\n            {\n                ImplantSet set = new ImplantSet(m_character, serialSet.Name);\n                set.Import(serialSet);\n                m_cloneSets.Add(set);\n            }\n\n            m_customSets.Clear();\n            foreach (SerializableSettingsImplantSet serialSet in serial.CustomSets)\n            {\n                ImplantSet set = new ImplantSet(m_character, serialSet.Name);\n                set.Import(serialSet);\n                m_customSets.Add(set);\n            }\n\n            // Imports selection\n            m_current = this[serial.SelectedIndex];\n\n            EveMonClient.OnCharacterImplantSetCollectionChanged(m_character);\n        }\n\n        /// <summary>\n        /// Imports data from an API serialization object provided by CCP.\n        /// </summary>\n        /// <param name=\"serial\"></param>\n        internal void Import(SerializableAPICharacterSheet serial)\n        {\n            if (serial == null)\n                return;\n\n            // Import the active clone implants\n            ActiveClone.Import(serial.Implants);\n\n            m_cloneSets.Clear();\n            foreach (SerializableCharacterJumpClone jumpClone in serial.JumpClones)\n            {\n                var cloneImplants = serial.JumpCloneImplants.Where(x => x.JumpCloneID ==\n                    jumpClone.JumpCloneID).Select(cloneImplant => new SerializableNewImplant\n                    {\n                        ID = cloneImplant.TypeID,\n                        Name = cloneImplant.TypeName\n                    });\n                ImplantSet set = new ImplantSet(m_character, GetCloneName(jumpClone.CloneName,\n                    jumpClone.LocationID));\n                set.Import(cloneImplants);\n                m_cloneSets.Add(set);\n            }\n\n            EveMonClient.OnCharacterImplantSetCollectionChanged(m_character);\n        }\n\n        /// <summary>\n        /// Creates a clone name if it is blank.\n        /// </summary>\n        /// <param name=\"name\">The current clone name</param>\n        /// <param name=\"locationID\">The clone location</param>\n        /// <returns>A name for this clone, using a default if none is given</returns>\n        private string GetCloneName(string name, long locationID)\n        {\n            // Try to pick a sane name if it is null\n            if (string.IsNullOrEmpty(name))\n            {\n                var location = EveIDToStation.GetIDToStation(locationID, m_character as\n                    CCPCharacter);\n                if (location == null)\n                    name = \"Clone at location #\" + locationID.ToString(CultureInfo.\n                        InvariantCulture);\n                else\n                    name = \"Clone in \" + location.Name;\n            }\n            return name;\n        }\n\n        /// <summary>\n        /// Exports this collection to a serialization object.\n        /// </summary>\n        public SerializableImplantSetCollection Export()\n        {\n            SerializableImplantSetCollection serial = new SerializableImplantSetCollection {\n                ActiveClone = ActiveClone.Export()\n            };\n            serial.JumpClones.AddRange(m_cloneSets.Select(x => x.Export()));\n            serial.CustomSets.AddRange(m_customSets.Select(x => x.Export()));\n            serial.SelectedIndex = Enumerate().IndexOf(m_current);\n            return serial;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/IndustryJobCollection.cs",
    "content": "using EVEMon.Common.Collections;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Settings;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    /// <summary>\n    /// A collection of industry jobs.\n    /// </summary>\n    public sealed class IndustryJobCollection : ReadonlyCollection<IndustryJob>\n    {\n        private readonly CCPCharacter m_ccpCharacter;\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal IndustryJobCollection(CCPCharacter character)\n        {\n            m_ccpCharacter = character;\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n        }\n\n        /// <summary>\n        /// Called when the object gets disposed.\n        /// </summary>\n        internal void Dispose()\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n        }\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            IQueryMonitor charIndustryJobsMonitor = m_ccpCharacter.QueryMonitors.Any(x =>\n                (ESIAPICharacterMethods)x.Method == ESIAPICharacterMethods.IndustryJobs) ?\n                m_ccpCharacter.QueryMonitors[ESIAPICharacterMethods.IndustryJobs] : null;\n            IQueryMonitor corpIndustryJobsMonitor = m_ccpCharacter.QueryMonitors.Any(x =>\n                (ESIAPICorporationMethods)x.Method == ESIAPICorporationMethods.\n                CorporationIndustryJobs) ? m_ccpCharacter.QueryMonitors[\n                ESIAPICorporationMethods.CorporationIndustryJobs] : null;\n\n            if ((charIndustryJobsMonitor != null && charIndustryJobsMonitor.Enabled) ||\n                (corpIndustryJobsMonitor != null && corpIndustryJobsMonitor.Enabled))\n                UpdateOnTimerTick();\n        }\n\n        /// <summary>\n        /// Imports an enumeration of serialization objects.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        internal void Import(IEnumerable<SerializableJob> src)\n        {\n            Items.Clear();\n            foreach (SerializableJob srcJob in src)\n                Items.Add(new IndustryJob(srcJob) { InstallerID = m_ccpCharacter.CharacterID });\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable jobs from the API.</param>\n        /// <param name=\"issuedFor\">Whether these jobs were issued for the corporation or\n        /// character.</param>\n        internal void Import(IEnumerable<EsiJobListItem> src, IssuedFor issuedFor)\n        {\n            // Mark all jobs for deletion, jobs found in the API will be unmarked\n            foreach (IndustryJob job in Items)\n                job.MarkedForDeletion = true;\n            var newJobs = new LinkedList<IndustryJob>();\n            var now = DateTime.UtcNow;\n            // Import the jobs from the API\n            foreach (EsiJobListItem job in src)\n            {\n                DateTime limit = job.EndDate.AddDays(IndustryJob.MaxEndedDays);\n                // For jobs which are not yet ended, or are active and not ready (active is\n                // defined as having an empty completion date)\n                if (limit >= now || (job.CompletedDate == DateTime.MinValue && job.Status !=\n                    CCPJobCompletedStatus.Ready))\n                {\n                    // Where the job isn't already in the list\n                    if (!Items.Any(x => x.TryImport(job, issuedFor, m_ccpCharacter)))\n                    {\n                        // Only add jobs with valid items\n                        var ij = new IndustryJob(job, issuedFor);\n                        if (ij.InstalledItem != null && ij.OutputItem != null)\n                            newJobs.AddLast(ij);\n                    }\n                }\n            }\n            // Add the items that are no longer marked for deletion\n            newJobs.AddRange(Items.Where(x => !x.MarkedForDeletion));\n            // Replace the old list with the new one\n            Items.Clear();\n            Items.AddRange(newJobs);\n        }\n\n        /// <summary>\n        /// Exports only the character issued jobs to a serialization object for the settings file.\n        /// </summary>\n        /// <returns></returns>\n        /// <remarks>Used to export only the corporation jobs issued by the character.</remarks>\n        internal IEnumerable<SerializableJob> ExportOnlyIssuedByCharacter() => Items.Where(\n            job => job.InstallerID == m_ccpCharacter.CharacterID).Select(job => job.Export());\n\n        /// <summary>\n        /// Exports the jobs to a serialization object for the settings file.\n        /// </summary>\n        /// <returns>List of serializable jobs.</returns>\n        /// <remarks>Used to export all jobs of the collection.</remarks>\n        internal IEnumerable<SerializableJob> Export() => Items.Select(job => job.Export());\n\n        /// <summary>\n        /// Notify the user on a job completion.\n        /// </summary>\n        private void UpdateOnTimerTick()\n        {\n            bool isCorporateMonitor = true;\n            if (Items.Count > 0)\n            {\n                // Add the not notified \"Ready\" jobs to the completed list\n                var jobsCompleted = new LinkedList<IndustryJob>();\n                var characterJobs = new LinkedList<IndustryJob>();\n                foreach (IndustryJob job in Items)\n                {\n                    if (job.IsActive && job.TTC.Length == 0 && !job.NotificationSend)\n                    {\n                        job.NotificationSend = true;\n                        jobsCompleted.AddLast(job);\n                        // Track if \"jobs on behalf of character\" needs to also be displayed\n                        if (job.InstallerID == m_ccpCharacter.CharacterID)\n                            characterJobs.AddLast(job);\n                    }\n                    // If this job was not issued for corp, ensure notification is for that\n                    // character only\n                    if (job.IssuedFor != IssuedFor.Corporation)\n                        isCorporateMonitor = false;\n                }\n                // Only notify if jobs have been completed\n                if (jobsCompleted.Count > 0)\n                {\n                    // Sends a notification\n                    if (isCorporateMonitor)\n                    {\n                        if (characterJobs.Count > 0)\n                            // Fire event for corporation job completion on behalf of character\n                            EveMonClient.OnCharacterIndustryJobsCompleted(m_ccpCharacter,\n                                characterJobs);\n                        // Fire event for corporation job completion\n                        EveMonClient.OnCorporationIndustryJobsCompleted(m_ccpCharacter,\n                            jobsCompleted);\n                    }\n                    else\n                        // Fire event for character job completion\n                        EveMonClient.OnCharacterIndustryJobsCompleted(m_ccpCharacter,\n                            jobsCompleted);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/KillLogCollection.cs",
    "content": "using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Constants;\nusing System;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class KillLogCollection : ReadonlyCollection<KillLog>\n    {\n        private readonly CCPCharacter m_ccpCharacter;\n        private int m_killMailCounter;\n        private readonly List<KillLog> m_pendingItems;\n\n        #region Constructor\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"ccpCharacter\">The CCP character.</param>\n        internal KillLogCollection(CCPCharacter ccpCharacter)\n        {\n            m_ccpCharacter = ccpCharacter;\n            m_killMailCounter = 0;\n            m_pendingItems = new List<KillLog>(32);\n        }\n\n        #endregion\n\n\n        #region Importation\n\n        /// <summary>\n        /// Exports the kill logs to the cached file.\n        /// </summary>\n        public void ExportToCacheFile()\n        {\n            // Save the file to the cache\n            string filename = m_ccpCharacter.Name + \"-\" + ESIAPICharacterMethods.KillLog;\n            var exported = new SerializableAPIKillLog();\n            foreach (KillLog killMail in Items)\n                exported.Kills.Add(killMail.Export());\n            LocalXmlCache.SaveAsync(filename, Util.SerializeToXmlDocument(exported)).\n                ConfigureAwait(false);\n            // Fire event to update the UI\n            EveMonClient.OnCharacterKillLogUpdated(m_ccpCharacter);\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable kill log from the API.</param>\n        internal void Import(IEnumerable<SerializableKillLogListItem> src)\n        {\n            Items.Clear();\n            foreach (SerializableKillLogListItem srcKillLog in src)\n                Items.Add(new KillLog(m_ccpCharacter, srcKillLog));\n        }\n\n        /// <summary>\n        /// Imports an enumeration of ESI objects.\n        /// </summary>\n        /// <param name=\"kills\">The enumeration of serializable kill data from ESI.</param>\n        internal void Import(EsiAPIKillLog kills)\n        {\n            bool startRequest = false;\n            lock (m_pendingItems)\n            {\n                // If no request currently running, start a new one\n                if (m_killMailCounter == 0)\n                {\n                    m_killMailCounter = kills.Count;\n                    m_pendingItems.Clear();\n                    m_pendingItems.Capacity = m_killMailCounter;\n                    startRequest = true;\n                }\n            }\n            if (startRequest)\n            {\n                EveMonClient.Notifications.InvalidateAPIError();\n                foreach (EsiKillLogListItem srcKillLog in kills)\n                {\n                    if (EsiErrors.IsErrorCountExceeded)\n                        break;\n                    // Query each individual mail; while the etag would be nice storing it in\n                    // the legacy XML architecture is not really worth the trouble\n                    string hash = srcKillLog.Hash;\n                    EveMonClient.APIProviders.CurrentProvider.QueryEsi<EsiAPIKillMail>(\n                        ESIAPIGenericMethods.KillMail, OnKillMailDownloaded, new ESIParams()\n                        {\n                            ParamOne = srcKillLog.KillID,\n                            GetData = hash\n                        }, hash);\n                }\n            }\n        }\n\n        private void OnKillMailDownloaded(EsiResult<EsiAPIKillMail> result, object hashValue)\n        {\n            var target = m_ccpCharacter;\n            string hash = hashValue?.ToString() ?? EveMonConstants.UnknownText;\n            // Synchronization is required here since multiple requests can finish at once\n            lock (m_pendingItems)\n            {\n                // If character is still around and monitored\n                if (target != null && target.Monitored)\n                {\n                    if (target.ShouldNotifyError(result, ESIAPICharacterMethods.KillLog))\n                        EveMonClient.Notifications.NotifyKillMailError(result, hash);\n                    if (!result.HasError && result.HasData)\n                        // Add data inside synchronization\n                        m_pendingItems.Add(new KillLog(target, result.Result.ToXMLItem()));\n                }\n                m_killMailCounter = Math.Max(0, m_killMailCounter - 1);\n                if (m_killMailCounter == 0)\n                {\n                    // All kills fetched\n                    Items.Clear();\n                    Items.AddRange(m_pendingItems);\n                    m_pendingItems.Clear();\n                    ExportToCacheFile();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Imports the kill logs from a cached file.\n        /// </summary>\n        public void ImportFromCacheFile()\n        {\n            var result = LocalXmlCache.Load<SerializableAPIKillLog>(m_ccpCharacter.Name + \"-\" +\n                ESIAPICharacterMethods.KillLog);\n            if (result != null)\n                Import(result.Kills);\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/LoyaltyCollection.cs",
    "content": "﻿using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class LoyaltyCollection : ReadonlyCollection<Loyalty>\n    {\n        private readonly CCPCharacter m_character;\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal LoyaltyCollection(CCPCharacter character)\n        {\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable loyalty point info from the API.</param>\n        internal void Import(IEnumerable<EsiLoyaltyListItem> src)\n        {\n            Items.Clear();\n\n            // Import the loyalty point info from the API\n            foreach (EsiLoyaltyListItem srcloyalty in src)\n            {\n                Items.Add(new Loyalty(m_character, srcloyalty));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/MarketOrderCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    /// <summary>\n    /// A collection of market orders.\n    /// </summary>\n    public sealed class MarketOrderCollection : ReadonlyCollection<MarketOrder>\n    {\n        private readonly CCPCharacter m_character;\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal MarketOrderCollection(CCPCharacter character)\n        {\n            m_character = character;\n        }\n\n        private IssuedFor AdjustIssuer(IssuedFor issuedFor, EsiOrderListItem srcOrder)\n        {\n            var orderFor = issuedFor;\n            const ulong MARKET_ORDER_MASK = (ulong)ESIAPICharacterMethods.MarketOrders;\n            // Orders in corporation endpoint are unconditionally for corp, the character\n            // endpoint has a special field since *some* are for corp, why...\n            if (srcOrder.IsCorporation)\n                orderFor = IssuedFor.Corporation;\n            // Exclude corporation orders made by a monitored character with ESI market\n            // order tracking turned on\n            if (issuedFor == IssuedFor.Corporation)\n            {\n                // Find matching character identity, if any\n                var issuer = EveMonClient.CharacterIdentities.FirstOrDefault(character =>\n                    character.CharacterID == srcOrder.IssuedBy);\n                // If the character is monitored and has access mask to market\n                if (issuer != null && (issuer.CCPCharacter?.Monitored ?? false) && issuer.\n                        ESIKeys.Any(key => (key.AccessMask & MARKET_ORDER_MASK) != 0UL))\n                    orderFor = IssuedFor.None;\n            }\n            return orderFor;\n        }\n\n        /// <summary>\n        /// Imports an enumeration of serialization objects.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        internal void Import(IEnumerable<SerializableOrderBase> src)\n        {\n            long id = m_character.CharacterID;\n            Items.Clear();\n            foreach (SerializableOrderBase srcOrder in src)\n            {\n                if (srcOrder is SerializableBuyOrder)\n                    Items.Add(new BuyOrder(srcOrder, m_character) { OwnerID = id });\n                else\n                    Items.Add(new SellOrder(srcOrder, m_character) { OwnerID = id });\n            }\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The orders to import.</param>\n        /// <param name=\"issuedFor\">Whether the orders were issued for a character or\n        /// corporation.</param>\n        /// <param name=\"ended\">The location to place ended orders.</param>\n        /// <returns>The list of expired orders.</returns>\n        internal void Import(IEnumerable<EsiOrderListItem> src, IssuedFor issuedFor,\n            ICollection<MarketOrder> ended)\n        {\n            var now = DateTime.UtcNow;\n            // Mark all orders for deletion\n            // If they are found again on the API feed, they will not be deleted and those set\n            // as ignored will be left as ignored\n            foreach (var order in Items)\n                order.MarkedForDeletion = true;\n            var newOrders = new List<MarketOrder>(Items.Count);\n            foreach (var srcOrder in src)\n            {\n                var limit = srcOrder.Issued.AddDays(srcOrder.Duration + MarketOrder.\n                    MaxExpirationDays);\n                var orderFor = AdjustIssuer(issuedFor, srcOrder);\n                if (limit >= now && orderFor != IssuedFor.None && !Items.Any(x => x.TryImport(\n                    srcOrder, orderFor, ended)))\n                {\n                    // New order\n                    if (srcOrder.IsBuyOrder)\n                    {\n                        var order = new BuyOrder(srcOrder, orderFor, m_character);\n                        if (order.Item != null)\n                            newOrders.Add(order);\n                    }\n                    else\n                    {\n                        var order = new SellOrder(srcOrder, orderFor, m_character);\n                        if (order.Item != null)\n                            newOrders.Add(order);\n                    }\n                }\n            }\n            // Add the items that are no longer marked for deletion\n            foreach (var order in Items)\n                if (order.MarkedForDeletion)\n                    ended.Add(order);\n                else\n                    newOrders.Add(order);\n            Items.Clear();\n            Items.AddRange(newOrders);\n        }\n\n        /// <summary>\n        /// Exports only the character issued orders to a serialization object for the settings file.\n        /// </summary>\n        /// <returns></returns>\n        /// <remarks>Used to export only the corporation orders issued by a character.</remarks>\n        internal IEnumerable<SerializableOrderBase> ExportOnlyIssuedByCharacter() => Items.\n            Where(order => order.OwnerID == m_character.CharacterID).Select(order => order.Export());\n\n        /// <summary>\n        /// Exports the orders to a serialization object for the settings file.\n        /// </summary>\n        /// <returns></returns>\n        /// <remarks>Used to export all orders of the collection.</remarks>\n        internal IEnumerable<SerializableOrderBase> Export() => Items.Select(order => order.Export());\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/MedalCollection.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class MedalCollection : ReadonlyCollection<Medal>\n    {\n        private readonly CCPCharacter m_character;\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal MedalCollection(CCPCharacter character)\n        {\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable medals from the API.</param>\n        /// <param name=\"isCharMedal\">If true, the medals are for a character (and will be\n        /// assigned to group CurrentCorporation or OtherCorporation); if false, the medals are\n        /// for a corporation and will all be assigned group Corporation.</param>\n        internal void Import(IEnumerable<EsiMedalsListItem> src, bool isCharMedal)\n        {\n            Items.Clear();\n\n            // Import the medals from the API\n            foreach (EsiMedalsListItem srcMedal in src)\n            {\n                MedalGroup group;\n                if (!isCharMedal)\n                    group = MedalGroup.Corporation;\n                else if (m_character.CorporationID == srcMedal.CorporationID)\n                    group = MedalGroup.CurrentCorporation;\n                else\n                    group = MedalGroup.OtherCorporation;\n                Items.Add(new Medal(m_character, srcMedal, group));\n            }\n\n            // Assign the 'number of times awarded'\n            foreach (Medal medal in Items.ToList())\n                medal.TimesAwarded = Items.Count(x => x.ID == medal.ID);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/PlanCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    /// <summary>\n    /// Represents the character's list of plans.\n    /// </summary>\n    public sealed class PlanCollection : BaseList<Plan>\n    {\n        private readonly Character m_owner;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        internal PlanCollection(Character owner)\n        {\n            m_owner = owner;\n        }\n\n        /// <summary>\n        /// Gets the plan with the given name, null when not found.\n        /// </summary>\n        /// <value>\n        /// The <see cref=\"Plan\" />.\n        /// </value>\n        /// <param name=\"name\">The name.</param>\n        /// <returns></returns>\n        public Plan this[string name] => Items.FirstOrDefault(plan => plan.Name == name);\n\n        /// <summary>\n        /// When we add a plan, we may have to clone it (and maybe changed the character it is bound to) and connects it.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">item</exception>\n        protected override void OnAdding(ref Plan item)\n        {\n            item.ThrowIfNull(nameof(item));\n\n            if (item.Character != m_owner)\n                item = item.Clone(m_owner);\n            else if (Contains(item))\n                item = item.Clone();\n\n            item.IsConnected = true;\n        }\n\n        /// <summary>\n        /// When removing a plan, we need to disconnect it.\n        /// </summary>\n        /// <param name=\"oldItem\"></param>\n        /// <exception cref=\"System.ArgumentNullException\">oldItem</exception>\n        protected override void OnRemoving(Plan oldItem)\n        {\n            oldItem.ThrowIfNull(nameof(oldItem));\n\n            oldItem.IsConnected = false;\n        }\n\n        /// <summary>\n        /// When the collection changed, the global event is fired.\n        /// </summary>\n        protected override void OnChanged()\n        {\n            EveMonClient.OnCharacterPlanCollectionChanged(m_owner);\n        }\n\n        /// <summary>\n        /// Imports data from the given deserialization object.\n        /// </summary>\n        /// <param name=\"plans\"></param>\n        internal void Import(IEnumerable<SerializablePlan> plans)\n        {\n            // Filter plans which belong to this owner\n            List<Plan> newPlanList = plans.Where(plan => plan.Owner == m_owner.Guid).Select(\n                serialPlan => new Plan(m_owner, serialPlan) { IsConnected = true }).ToList();\n\n            // We now add the plans\n            SetItems(newPlanList);\n\n            // Fire the global event\n            EveMonClient.OnCharacterPlanCollectionChanged(m_owner);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/PlanetaryColonyCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class PlanetaryColonyCollection : ReadonlyCollection<PlanetaryColony>\n    {\n        private readonly CCPCharacter m_ccpCharacter;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"ccpCharacter\">The CCP character.</param>\n        internal PlanetaryColonyCollection(CCPCharacter ccpCharacter)\n        {\n            m_ccpCharacter = ccpCharacter;\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n        }\n\n        #endregion\n\n\n        #region Inherited Events\n\n        /// <summary>\n        /// Called when the object gets disposed.\n        /// </summary>\n        internal void Dispose()\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n        }\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            IQueryMonitor charPlanetaryColoniesMonitor = m_ccpCharacter.QueryMonitors[ESIAPICharacterMethods.PlanetaryColonies];\n\n            if (charPlanetaryColoniesMonitor == null || !charPlanetaryColoniesMonitor.Enabled)\n                return;\n\n            UpdateOnTimerTick();\n        }\n\n        #endregion\n\n\n        #region Importation\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable planetary colony log from the API.</param>\n        internal void Import(IEnumerable<EsiPlanetaryColonyListItem> src)\n        {\n            Items.Clear();\n\n            // Import the palnetary colony from the API\n            foreach (EsiPlanetaryColonyListItem srcColony in src)\n            {\n                Items.Add(new PlanetaryColony(m_ccpCharacter, srcColony));\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Notify the user on a pin completion.\n        /// </summary>\n        private void UpdateOnTimerTick()\n        {\n            // We exit if there are no pins\n            if (!Items.Any())\n                return;\n\n            // Add the not notified idle pins to the completed list\n            var pinsCompleted = Items.SelectMany(x => x.Pins).Where(pin => pin.State !=\n                PlanetaryPinState.None && pin.TTC.Length == 0 && !pin.NotificationSend).ToList();\n\n            pinsCompleted.ForEach(pin => pin.NotificationSend = true);\n\n            // We exit if no pins have finished\n            if (!pinsCompleted.Any())\n                return;\n\n            // Fires the event regarding the character's pins finished\n            EveMonClient.OnCharacterPlanetaryPinsCompleted(m_ccpCharacter, pinsCompleted);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/ResearchPointCollection.cs",
    "content": "using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class ResearchPointCollection : ReadonlyCollection<ResearchPoint>\n    {\n        private readonly CCPCharacter m_character;\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal ResearchPointCollection(CCPCharacter character)\n        {\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable research points from the API.</param>\n        internal void Import(IEnumerable<EsiResearchListItem> src)\n        {\n            Items.Clear();\n\n            // Import the research points from the API\n            foreach (EsiResearchListItem srcResearchPoint in src)\n            {\n                Items.Add(new ResearchPoint(srcResearchPoint, m_character));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/SkillCollection.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    /// <summary>\n    /// Represents a collection of skills.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class SkillCollection : ReadonlyKeyedCollection<int, Skill>\n    {\n        private readonly Skill[] m_itemsArray = new Skill[StaticSkills.ArrayIndicesCount];\n        private static SkillCollection s_skillCollection;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SkillCollection\"/> class.\n        /// Used to build a non-character associated skill collection.\n        /// </summary>\n        public SkillCollection()\n            : this(null)\n        {\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SkillCollection\"/> class.\n        /// Used to build a character associated skill collection.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal SkillCollection(Character character)\n        {\n            IEnumerable<Skill> skills = character?.SkillGroups.SelectMany(group => group) ??\n                              StaticSkills.AllGroups.SelectMany(group => new SkillGroup(group));\n\n            foreach (Skill skill in skills)\n            {\n                Items[skill.ID] = skill;\n                m_itemsArray[skill.ArrayIndex] = skill;\n            }\n\n            // Build prerequisites list\n            foreach (Skill skill in m_itemsArray)\n            {\n                skill.CompleteInitialization(m_itemsArray);\n            }\n        }\n\n        /// <summary>\n        /// Gets a collection of non-character assosiated skills.\n        /// </summary>\n        /// <value>\n        /// The skills.\n        /// </value>\n        public static SkillCollection Skills => s_skillCollection ?? (s_skillCollection = new SkillCollection());\n\n        /// <summary>\n        /// Gets the skill with the provided id.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public Skill this[int id] => GetByKey(id) ?? Skill.UnknownSkill;\n\n        /// <summary>\n        /// Gets the skill with the provided array index (see <see cref=\"StaticSkill.ArrayIndex\"/>).\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        public Skill GetByArrayIndex(int index) => m_itemsArray[index];\n\n        /// <summary>\n        /// Exports this collection to a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        internal IEnumerable<SerializableCharacterSkill> Export()\n            => Items.Values.Where(x => x.IsKnown || x.IsOwned).Select(skill => skill.Export());\n\n        /// Imports data from a serialization object.\n        internal void Import(IEnumerable<SerializableCharacterSkill> skills, bool fromCCP)\n        {\n            // Skills : reset all > update all\n            foreach (Skill skill in Items.Values)\n            {\n                skill.Reset(fromCCP);\n            }\n\n            // Take care of the new skills not in our datafiles yet\n            // Update if it exists\n            foreach (SerializableCharacterSkill serialSkill in skills.Where(x => this[x.ID] != null && Items.ContainsKey(x.ID)))\n            {\n                Items[serialSkill.ID].Import(serialSkill, fromCCP);\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/SkillGroupCollection.cs",
    "content": "﻿using System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    /// <summary>\n    /// Represents a collection of a character's skills groups\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class SkillGroupCollection : ReadonlyKeyedCollection<int, SkillGroup>\n    {\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"character\"></param>\n        internal SkillGroupCollection(Character character)\n        {\n            foreach (SkillGroup group in StaticSkills.AllGroups\n                .Select(srcGroup => new SkillGroup(character, srcGroup)))\n            {\n                Items[group.ID] = group;\n            }\n        }\n\n        /// <summary>\n        /// Gets the skill group with the provided name\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public SkillGroup this[int id] => GetByKey(id);\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/StandingCollection.cs",
    "content": "using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class StandingCollection : ReadonlyCollection<Standing>\n    {\n        private readonly CCPCharacter m_character;\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal StandingCollection(CCPCharacter character)\n        {\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable standings from the API.</param>\n        internal void Import(IEnumerable<EsiStandingsListItem> src)\n        {\n            Items.Clear();\n\n            // Import the standings from the API\n            foreach (EsiStandingsListItem srcStanding in src)\n            {\n                Items.Add(new Standing(m_character, srcStanding));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/UpcomingCalendarEventCollection.cs",
    "content": "﻿using EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class UpcomingCalendarEventCollection : ReadonlyCollection<UpcomingCalendarEvent>\n    {\n        private readonly CCPCharacter m_character;\n        private readonly object m_counterLock;\n        private int m_eventCounter;\n\n        #region Constructor\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal UpcomingCalendarEventCollection(CCPCharacter character)\n        {\n            m_character = character;\n            m_eventCounter = 0;\n            m_counterLock = new object();\n        }\n\n        #endregion\n\n\n        #region Importation\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"events\">The serializable calendar events from the API.</param>\n        internal void Import(EsiAPICalendarEvents events)\n        {\n            if (m_eventCounter == 0)\n            {\n                Items.Clear();\n                EveMonClient.Notifications.InvalidateAPIError();\n                lock (m_counterLock)\n                {\n                    m_eventCounter = events.Count;\n                }\n                // Import the events from the API; note that a request must be made for details\n                // for every event!\n                foreach (EsiAPICalendarEvent srcEvent in events)\n                {\n                    long id = srcEvent.EventID;\n                    if (EsiErrors.IsErrorCountExceeded)\n                        break;\n                    // Query each individual event; maintaining etags/expiration for all of\n                    // them is not really worth it\n                    EveMonClient.APIProviders.CurrentProvider.QueryEsi<EsiAPICalendarEvent>(\n                        ESIAPICharacterMethods.UpcomingCalendarEventDetails,\n                        OnCalendarEventDownloaded, new ESIParams()\n                        {\n                            ParamOne = id\n                        }, id);\n                }\n            }\n        }\n\n        private void OnCalendarEventDownloaded(EsiResult<EsiAPICalendarEvent> result, object forID)\n        {\n            var target = m_character;\n            long id = (forID as long?) ?? 0L;\n\n            // If character is still around and monitored\n            if (target != null && target.Monitored)\n            {\n                if (target.ShouldNotifyError(result, ESIAPICharacterMethods.\n                        UpcomingCalendarEventDetails))\n                    EveMonClient.Notifications.NotifyCharacterUpcomingCalendarEventDetailsError(\n                        m_character, result);\n                if (!result.HasError && result.HasData)\n                    Items.Add(new UpcomingCalendarEvent(target, result.Result));\n            }\n            // Synchronization is required here since multiple requests can finish at once\n            lock (m_counterLock)\n            {\n                m_eventCounter = Math.Max(0, m_eventCounter - 1);\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/WalletJournalCollection.cs",
    "content": "using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class WalletJournalCollection : ReadonlyCollection<WalletJournal>\n    {\n        private readonly CCPCharacter m_character;\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal WalletJournalCollection(CCPCharacter character)\n        {\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable wallet journal from the API.</param>\n        internal void Import(IEnumerable<SerializableWalletJournalListItem> src)\n        {\n            Items.Clear();\n\n            // Import the wallet journal from the API\n            foreach (SerializableWalletJournalListItem srcWalletJournal in src)\n            {\n                Items.Add(new WalletJournal(srcWalletJournal));\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/Collections/WalletTransactionsCollection.cs",
    "content": "using System.Collections.Generic;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Models.Collections\n{\n    public sealed class WalletTransactionsCollection : ReadonlyCollection<WalletTransaction>\n    {\n        private readonly CCPCharacter m_character;\n\n        /// <summary>\n        /// Internal constructor.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        internal WalletTransactionsCollection(CCPCharacter character)\n        {\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Imports an enumeration of API objects.\n        /// </summary>\n        /// <param name=\"src\">The enumeration of serializable wallet transactions from the API.</param>\n        internal void Import(IEnumerable<SerializableWalletTransactionsListItem> src)\n        {\n            Items.Clear();\n\n            // Import the wallet transactions from the API\n            foreach (SerializableWalletTransactionsListItem srcWalletTransaction in src)\n            {\n                Items.Add(new WalletTransaction(srcWalletTransaction, m_character));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/AssetComparer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    public sealed class AssetComparer : Comparer<Asset>\n    {\n        private readonly AssetColumn m_column;\n        private readonly bool m_isAscending;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"AssetComparer\"/> class.\n        /// </summary>\n        /// <param name=\"column\">The column.</param>\n        /// <param name=\"isAscending\">Is ascending flag.</param>\n        public AssetComparer(AssetColumn column, bool isAscending)\n        {\n            m_column = column;\n            m_isAscending = isAscending;\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"Asset\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        public override int Compare(Asset x, Asset y)\n        {\n            if (m_isAscending)\n                return CompareCore(x, y);\n\n            return -CompareCore(x, y);\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"Asset\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        private int CompareCore(Asset x, Asset y)\n        {\n            switch (m_column)\n            {\n                case AssetColumn.ItemName:\n                    return string.Compare(x.Item.Name, y.Item.Name, StringComparison.CurrentCulture);\n                case AssetColumn.Quantity:\n                    return x.Quantity.CompareTo(y.Quantity);\n                case AssetColumn.UnitaryPrice:\n                    return x.Price.CompareTo(y.Price);\n                case AssetColumn.TotalPrice:\n                    return x.Cost.CompareTo(y.Cost);\n                case AssetColumn.Volume:\n                    return x.TotalVolume.CompareTo(y.TotalVolume);\n                case AssetColumn.BlueprintType:\n                    return string.Compare(x.TypeOfBlueprint, y.TypeOfBlueprint, StringComparison.CurrentCulture);\n                case AssetColumn.Group:\n                    return string.Compare(x.Item.GroupName, y.Item.GroupName, StringComparison.CurrentCulture);\n                case AssetColumn.Category:\n                    return string.Compare(x.Item.CategoryName, y.Item.CategoryName, StringComparison.CurrentCulture);\n                case AssetColumn.Container:\n                    return string.Compare(x.Container, y.Container, StringComparison.CurrentCulture);\n                case AssetColumn.Flag:\n                    return string.Compare(x.Flag, y.Flag, StringComparison.CurrentCulture);\n                case AssetColumn.Location:\n                    return string.Compare(x.Location, y.Location, StringComparison.CurrentCulture);\n                case AssetColumn.FullLocation:\n                    return x.SolarSystem.CompareTo(y.SolarSystem);\n                case AssetColumn.Region:\n                    return x.SolarSystem.Constellation.Region.CompareTo(y.SolarSystem.Constellation.Region);\n                case AssetColumn.SolarSystem:\n                    return x.SolarSystem.CompareTo(y.SolarSystem);\n                case AssetColumn.Jumps:\n                    return x.Jumps.CompareTo(y.Jumps);\n                default:\n                    return 0;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/CharacterComparer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    /// <summary>\n    /// Represents a customizable characters comparer\n    /// </summary>\n    public struct CharacterComparer : IComparer<Character>\n    {\n        #region Constructors\n\n        /// <summary>\n        /// Constructor for an ascending sort along the given criteria.\n        /// </summary>\n        public CharacterComparer(CharacterSortCriteria criteria)\n            : this()\n        {\n            Criteria = criteria;\n            Order = SortOrder.Ascending;\n        }\n\n        /// <summary>\n        /// Constructor with custom parameters.\n        /// </summary>\n        public CharacterComparer(CharacterSortCriteria criteria, SortOrder order)\n            : this()\n        {\n            Criteria = criteria;\n            Order = order;\n        }\n\n        /// <summary>\n        /// Constructor from a tray popup setting\n        /// </summary>\n        /// <param name=\"criteria\"></param>\n        public CharacterComparer(TrayPopupSort criteria)\n            : this()\n        {\n            switch (criteria)\n            {\n                case TrayPopupSort.NameASC:\n                    Criteria = CharacterSortCriteria.Name;\n                    Order = SortOrder.Ascending;\n                    break;\n                case TrayPopupSort.NameDESC:\n                    Criteria = CharacterSortCriteria.Name;\n                    Order = SortOrder.Descending;\n                    break;\n                case TrayPopupSort.TrainingCompletionTimeASC:\n                    Criteria = CharacterSortCriteria.TrainingCompletion;\n                    Order = SortOrder.Ascending;\n                    break;\n                case TrayPopupSort.TrainingCompletionTimeDESC:\n                    Criteria = CharacterSortCriteria.TrainingCompletion;\n                    Order = SortOrder.Descending;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the sort order\n        /// </summary>\n        public SortOrder Order { get; }\n\n        /// <summary>\n        /// Gets or sets the sort criteria\n        /// </summary>\n        public CharacterSortCriteria Criteria { get; }\n\n        #endregion\n\n\n        #region Compare Methods\n\n        /// <summary>\n        /// Performs the comparison\n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <returns></returns>\n        public int Compare(Character x, Character y)\n        {\n            // Exchange items when descending sort\n            if (Order == SortOrder.Descending)\n            {\n                Character temp = x;\n                x = y;\n                y = temp;\n            }\n\n            // Deal with the criteria\n            switch (Criteria)\n            {\n                case CharacterSortCriteria.TrainingCompletion:\n                    return CompareByCompletionTime(x, y);\n                case CharacterSortCriteria.Name:\n                    return CompareByName(x, y);\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Compares the two characters by their training completion time or, when not in training their names\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">\n        /// x\n        /// or\n        /// y\n        /// </exception>\n        public static int CompareByCompletionTime(Character x, Character y)\n        {\n            x.ThrowIfNull(nameof(x));\n\n            y.ThrowIfNull(nameof(y));\n\n            // Get their training skills\n            QueuedSkill skillX = x.CurrentlyTrainingSkill;\n            QueuedSkill skillY = y.CurrentlyTrainingSkill;\n            if (skillX == null && skillY == null)\n                return string.Compare(x.Name, y.Name, StringComparison.CurrentCulture);\n            if (skillX == null || skillY == null)\n                return -1;\n\n            // Compare end time\n            return DateTime.Compare(skillX.EndTime, skillY.EndTime);\n        }\n\n        /// <summary>\n        /// Compare the given characters by their names\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">\n        /// x\n        /// or\n        /// y\n        /// </exception>\n        public static int CompareByName(Character x, Character y)\n        {\n            x.ThrowIfNull(nameof(x));\n\n            y.ThrowIfNull(nameof(y));\n\n            return string.Compare(x.Name, y.Name, StringComparison.CurrentCulture);\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/ContractComparer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.SettingsObjects;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    /// <summary>\n    /// Performs a comparison between two <see cref=\"Contract\"/> types.\n    /// </summary>\n    public sealed class ContractComparer : Comparer<Contract>\n    {\n        private readonly ContractColumn m_column;\n        private readonly bool m_isAscending;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ContractComparer\"/> class.\n        /// </summary>\n        /// <param name=\"column\">The column.</param>\n        /// <param name=\"isAscending\">Is ascending flag.</param>\n        public ContractComparer(ContractColumn column, bool isAscending)\n        {\n            m_column = column;\n            m_isAscending = isAscending;\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"Contract\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        public override int Compare(Contract x, Contract y)\n        {\n            if (m_isAscending)\n                return CompareCore(x, y);\n\n            return -CompareCore(x, y);\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"Contract\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        private int CompareCore(Contract x, Contract y)\n        {\n            Station xStart = x?.StartStation, yStart = y?.StartStation, xEnd = x?.EndStation,\n                yEnd = y?.EndStation;\n            switch (m_column)\n            {\n            case ContractColumn.Status:\n                return x.Status.CompareTo(y.Status);\n            case ContractColumn.ContractText:\n                return string.Compare(x.ContractText, y.ContractText, StringComparison.CurrentCulture);\n            case ContractColumn.ContractType:\n                return x.ContractType.CompareTo(y.ContractType);\n            case ContractColumn.Issuer:\n                return string.Compare(x.Issuer, y.Issuer, StringComparison.CurrentCulture);\n            case ContractColumn.Assignee:\n                return string.Compare(x.Assignee, y.Assignee, StringComparison.CurrentCulture);\n            case ContractColumn.Issued:\n                return x.Issued.CompareTo(y.Issued);\n            case ContractColumn.Expiration:\n                return x.Expiration.CompareTo(y.Expiration);\n            case ContractColumn.Title:\n                return string.Compare(x.Description, y.Description, StringComparison.CurrentCulture);\n            case ContractColumn.Acceptor:\n                return string.Compare(x.Acceptor, y.Acceptor, StringComparison.CurrentCulture);\n            case ContractColumn.Availability:\n                return x.Availability.CompareTo(y.Availability);\n            case ContractColumn.Price:\n                return x.Price.CompareTo(y.Price);\n            case ContractColumn.Buyout:\n                return x.Buyout.CompareTo(y.Buyout);\n            case ContractColumn.Reward:\n                return x.Reward.CompareTo(y.Reward);\n            case ContractColumn.Collateral:\n                return x.Collateral.CompareTo(y.Collateral);\n            case ContractColumn.Volume:\n                return x.Volume.CompareTo(y.Volume);\n            case ContractColumn.StartLocation:\n                return xStart.CompareTo(yStart);\n            case ContractColumn.StartRegion:\n                return xStart.SolarSystemChecked.Constellation.Region.CompareTo(yStart.\n                    SolarSystemChecked.Constellation.Region);\n            case ContractColumn.StartSolarSystem:\n                return xStart.SolarSystemChecked.CompareTo(yStart.SolarSystemChecked);\n            case ContractColumn.StartStation:\n                return xStart.CompareTo(yStart);\n            case ContractColumn.EndLocation:\n                return xEnd.CompareTo(yEnd);\n            case ContractColumn.EndRegion:\n                return xEnd.SolarSystemChecked.Constellation.Region.CompareTo(yEnd.\n                    SolarSystemChecked.Constellation.Region);\n            case ContractColumn.EndSolarSystem:\n                return xEnd.SolarSystemChecked.CompareTo(yEnd.SolarSystemChecked);\n            case ContractColumn.EndStation:\n                return xEnd.CompareTo(yEnd);\n            case ContractColumn.Accepted:\n                return x.Accepted.CompareTo(y.Accepted);\n            case ContractColumn.Completed:\n                return x.Completed.CompareTo(y.Completed);\n            case ContractColumn.Duration:\n                return x.Duration.CompareTo(y.Duration);\n            case ContractColumn.DaysToComplete:\n                return x.DaysToComplete.CompareTo(y.DaysToComplete);\n            case ContractColumn.IssuedFor:\n                return x.IssuedFor.CompareTo(y.IssuedFor);\n            default:\n                return 0;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/ContractItemComparer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    /// <summary>\n    /// Performs a comparison between two <see cref=\"ContractItem\"/> types.\n    /// </summary>\n    public sealed class ContractItemComparer : Comparer<ContractItem>\n    {\n        private readonly ColumnHeader m_column;\n        private readonly bool m_isAscending;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ContractItemComparer\"/> class.\n        /// </summary>\n        /// <param name=\"column\">The column.</param>\n        /// <param name=\"isAscending\">Is ascending flag.</param>\n        public ContractItemComparer(ColumnHeader column, bool isAscending)\n        {\n            m_column = column;\n            m_isAscending = isAscending;\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"ContractItem\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        public override int Compare(ContractItem x, ContractItem y)\n        {\n            if (m_isAscending)\n                return CompareCore(x, y);\n\n            return -CompareCore(x, y);\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"ContractItem\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        private int CompareCore(ContractItem x, ContractItem y)\n        {\n            switch (m_column.Index)\n            {\n                case 0:\n                    return string.Compare(x.Item.Name, y.Item.Name, StringComparison.CurrentCulture);\n                case 1:\n                    return x.Quantity.CompareTo(y.Quantity);\n                case 2:\n                    return string.Compare(x.Item.GroupName, y.Item.GroupName, StringComparison.CurrentCulture);\n                default:\n                    return 0;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/EveMailMessageComparer.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    /// <summary>\n    /// Performs a comparison between two <see cref=\"EveMailMessage\"/> types.\n    /// </summary>\n    public sealed class EveMailMessageComparer : Comparer<EveMailMessage>\n    {\n        private readonly EveMailMessageColumn m_column;\n        private readonly bool m_isAscending;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveMailMessageComparer\"/> class.\n        /// </summary>\n        /// <param name=\"column\">The column.</param>\n        /// <param name=\"isAscending\">Is ascending flag.</param>\n        public EveMailMessageComparer(EveMailMessageColumn column, bool isAscending)\n        {\n            m_column = column;\n            m_isAscending = isAscending;\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"EveMailMessage\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        public override int Compare(EveMailMessage x, EveMailMessage y)\n        {\n            if (m_isAscending)\n                return CompareCore(x, y);\n\n            return -CompareCore(x, y);\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"EveMailMessage\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        private int CompareCore(EveMailMessage x, EveMailMessage y)\n        {\n            switch (m_column)\n            {\n                case EveMailMessageColumn.SenderName:\n                    return string.Compare(x.SenderName, y.SenderName, StringComparison.CurrentCulture);\n                case EveMailMessageColumn.Title:\n                    return string.Compare(x.Title, y.Title, StringComparison.CurrentCulture);\n                case EveMailMessageColumn.SentDate:\n                    return x.SentDate.CompareTo(y.SentDate);\n                case EveMailMessageColumn.ToCharacters:\n                    return string.Compare(x.ToCharacters.First(), y.ToCharacters.First(), StringComparison.CurrentCulture);\n                case EveMailMessageColumn.ToCorpOrAlliance:\n                    return string.Compare(x.ToCorpOrAlliance, y.ToCorpOrAlliance, StringComparison.CurrentCulture);\n                case EveMailMessageColumn.ToMailingList:\n                    return string.Compare(x.ToMailingLists.First(), y.ToMailingLists.First(), StringComparison.CurrentCulture);\n                default:\n                    return 0;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/EveNotificationComparer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    /// <summary>\n    /// Performs a comparison between two <see cref=\"EveNotification\"/> types.\n    /// </summary>\n    public sealed class EveNotificationComparer : Comparer<EveNotification>\n    {\n        private readonly EveNotificationColumn m_column;\n        private readonly bool m_isAscending;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveNotificationComparer\"/> class.\n        /// </summary>\n        /// <param name=\"column\">The column.</param>\n        /// <param name=\"isAscending\">Is ascending flag.</param>\n        public EveNotificationComparer(EveNotificationColumn column, bool isAscending)\n        {\n            m_column = column;\n            m_isAscending = isAscending;\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"EveNotification\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        public override int Compare(EveNotification x, EveNotification y)\n        {\n            if (m_isAscending)\n                return CompareCore(x, y);\n\n            return -CompareCore(x, y);\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"EveNotification\"/> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        private int CompareCore(EveNotification x, EveNotification y)\n        {\n            switch (m_column)\n            {\n                case EveNotificationColumn.SenderName:\n                    return string.Compare(x.SenderName, y.SenderName, StringComparison.CurrentCulture);\n                case EveNotificationColumn.Type:\n                    return string.Compare(x.Title, y.Title, StringComparison.CurrentCulture);\n                case EveNotificationColumn.SentDate:\n                    return x.SentDate.CompareTo(y.SentDate);\n                default:\n                    return 0;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/IndustryJobComparer.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    /// <summary>\n    /// Performs a comparison between two <see cref=\"IndustryJob\" /> types.\n    /// </summary>\n    public sealed class IndustryJobComparer : Comparer<IndustryJob>\n    {\n        private readonly IndustryJobColumn m_column;\n        private readonly bool m_isAscending;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"IndustryJobComparer\"/> class.\n        /// </summary>\n        /// <param name=\"column\">The column.</param>\n        /// <param name=\"isAscending\">Is ascending flag.</param>\n        public IndustryJobComparer(IndustryJobColumn column, bool isAscending)\n        {\n            m_column = column;\n            m_isAscending = isAscending;\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"IndustryJob\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        public override int Compare(IndustryJob x, IndustryJob y)\n        {\n            if (m_isAscending)\n                return CompareCore(x, y);\n\n            return -CompareCore(x, y);\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"IndustryJob\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        private int CompareCore(IndustryJob x, IndustryJob y)\n        {\n            switch (m_column)\n            {\n                case IndustryJobColumn.State:\n                    return x.State == JobState.Active ? x.ActiveJobState.CompareTo(y.ActiveJobState) : x.State.CompareTo(y.State);\n                case IndustryJobColumn.TTC:\n                    return x.EndDate.CompareTo(y.EndDate);\n                case IndustryJobColumn.InstalledItem:\n                    return string.Compare(x.InstalledItem.Name, y.InstalledItem.Name, StringComparison.CurrentCulture);\n                case IndustryJobColumn.InstalledItemType:\n                    return string.Compare(x.InstalledItem.MarketGroup.Name, y.InstalledItem.MarketGroup.Name,\n                                          StringComparison.CurrentCulture);\n                case IndustryJobColumn.OutputItem:\n                    return string.Compare(x.OutputItem.Name, y.OutputItem.Name, StringComparison.CurrentCulture);\n                case IndustryJobColumn.OutputItemType:\n                    return string.Compare(x.OutputItem.MarketGroup.Name, y.OutputItem.MarketGroup.Name,\n                                          StringComparison.CurrentCulture);\n                case IndustryJobColumn.Activity:\n                    return x.Activity.CompareTo(y.Activity);\n                case IndustryJobColumn.InstallTime:\n                    return x.InstalledTime.CompareTo(y.InstalledTime);\n                case IndustryJobColumn.EndTime:\n                    return x.EndDate.CompareTo(y.EndDate);\n                case IndustryJobColumn.Location:\n                    // null is allowed here\n                    return string.Compare(x.FullLocation, y.FullLocation, StringComparison.CurrentCulture);\n                case IndustryJobColumn.Region:\n                    return x.SolarSystem.Constellation.Region.CompareTo(y.SolarSystem.Constellation.Region);\n                case IndustryJobColumn.SolarSystem:\n                    // SolarSystem is not null even if location is unknown\n                    return x.SolarSystem.CompareTo(y.SolarSystem);\n                case IndustryJobColumn.Installation:\n                    return string.Compare(x.Installation, y.Installation, StringComparison.CurrentCulture);\n                case IndustryJobColumn.IssuedFor:\n                    return x.IssuedFor.CompareTo(y.IssuedFor);\n                case IndustryJobColumn.LastStateChange:\n                    return x.LastStateChange.CompareTo(y.LastStateChange);\n                case IndustryJobColumn.Cost:\n                    return x.Cost.CompareTo(y.Cost);\n                case IndustryJobColumn.Probability:\n                    return x.Probability.CompareTo(y.Probability);\n                default:\n                    return 0;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/KillLogComparer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    /// <summary>\n    /// Performs a comparison between two <see cref=\"KillLog\"/> types.\n    /// </summary>\n    public sealed class KillLogComparer : Comparer<KillLog>\n    {\n        private readonly ColumnHeader m_column;\n        private readonly bool m_isAscending;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"KillLogComparer\"/> class.\n        /// </summary>\n        /// <param name=\"column\">The column.</param>\n        /// <param name=\"isAscending\">Is ascending flag.</param>\n        public KillLogComparer(ColumnHeader column, bool isAscending)\n        {\n            m_column = column;\n            m_isAscending = isAscending;\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"KillLog\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        public override int Compare(KillLog x, KillLog y)\n        {\n            if (m_isAscending)\n                return CompareCore(x, y);\n\n            return -CompareCore(x, y);\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"KillLog\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        private int CompareCore(KillLog x, KillLog y)\n        {\n            switch (m_column.Index)\n            {\n                case 0:\n                    return x.KillTime.CompareTo(y.KillTime);\n                case 1:\n                    return string.Compare(x.Victim.ShipTypeName, y.Victim.ShipTypeName, StringComparison.CurrentCulture);\n                case 2:\n                    return string.Compare(x.Victim.Name, y.Victim.Name, StringComparison.CurrentCulture);\n                case 3:\n                    return string.Compare(x.Victim.CorporationName, y.Victim.CorporationName, StringComparison.CurrentCulture);\n                case 4:\n                    return string.Compare(x.Victim.AllianceName, y.Victim.AllianceName, StringComparison.CurrentCulture);\n                case 5:\n                    return string.Compare(x.Victim.FactionName, y.Victim.FactionName, StringComparison.CurrentCulture);\n                default:\n                    return 0;\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/MarketOrderComparer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    /// <summary>\n    /// Performs a comparison between two <see cref=\"MarketOrder\" /> types.\n    /// </summary>\n    public sealed class MarketOrderComparer : Comparer<MarketOrder>\n    {\n        private readonly MarketOrderColumn m_column;\n        private readonly bool m_isAscending;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MarketOrderComparer\"/> class.\n        /// </summary>\n        /// <param name=\"column\">The column.</param>\n        /// <param name=\"isAscending\">Is ascending flag.</param>\n        public MarketOrderComparer(MarketOrderColumn column, bool isAscending)\n        {\n            m_column = column;\n            m_isAscending = isAscending;\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"MarketOrder\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        public override int Compare(MarketOrder x, MarketOrder y)\n        {\n            if (m_isAscending)\n                return CompareCore(x, y);\n\n            return -CompareCore(x, y);\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"MarketOrder\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        private int CompareCore(MarketOrder x, MarketOrder y)\n        {\n            BuyOrder buyOrderX = x as BuyOrder;\n            BuyOrder buyOrderY = y as BuyOrder;\n\n            switch (m_column)\n            {\n            case MarketOrderColumn.Duration:\n                return x.Duration.CompareTo(y.Duration);\n            case MarketOrderColumn.Expiration:\n                return x.Expiration.CompareTo(y.Expiration);\n            case MarketOrderColumn.InitialVolume:\n                return x.InitialVolume.CompareTo(y.InitialVolume);\n            case MarketOrderColumn.Issued:\n                return x.Issued.CompareTo(y.Issued);\n            case MarketOrderColumn.IssuedFor:\n                return x.IssuedFor.CompareTo(y.IssuedFor);\n            case MarketOrderColumn.Item:\n                return string.Compare(x.Item.Name, y.Item.Name,\n                    StringComparison.CurrentCulture);\n            case MarketOrderColumn.ItemType:\n                return string.Compare(x.Item.MarketGroup.Name, y.Item.MarketGroup.Name,\n                    StringComparison.CurrentCulture);\n            case MarketOrderColumn.Location:\n                return x.Station.CompareTo(y.Station);\n            case MarketOrderColumn.MinimumVolume:\n                return x.MinVolume.CompareTo(y.MinVolume);\n            case MarketOrderColumn.Region:\n                return x.Station.SolarSystemChecked.Constellation.Region.CompareTo(y.Station.\n                    SolarSystemChecked.Constellation.Region);\n            case MarketOrderColumn.RemainingVolume:\n                return x.RemainingVolume.CompareTo(y.RemainingVolume);\n            case MarketOrderColumn.SolarSystem:\n                return x.Station.SolarSystemChecked.CompareTo(y.Station.SolarSystemChecked);\n            case MarketOrderColumn.Station:\n                return x.Station.CompareTo(y.Station);\n            case MarketOrderColumn.TotalPrice:\n                return x.TotalPrice.CompareTo(y.TotalPrice);\n            case MarketOrderColumn.UnitaryPrice:\n                return x.UnitaryPrice.CompareTo(y.UnitaryPrice);\n            case MarketOrderColumn.Volume:\n                // Compare the percent left\n                return ((double)x.RemainingVolume / x.InitialVolume).CompareTo((double)y.\n                    RemainingVolume / y.InitialVolume);\n            case MarketOrderColumn.LastStateChange:\n                return x.LastStateChange.CompareTo(y.LastStateChange);\n            case MarketOrderColumn.OrderRange:\n                // Compare applies only to BuyOrder \n                return buyOrderX?.Range.CompareTo(buyOrderY?.Range) ?? 0;\n            case MarketOrderColumn.Escrow:\n                // Compare applies only to BuyOrder \n                return buyOrderX?.Escrow.CompareTo(buyOrderY?.Escrow) ?? 0;\n            default:\n                return 0;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/MedalComparer.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    public sealed class MedalComparer : IEqualityComparer<Medal>\n    {\n        /// <summary>\n        /// Returns an indication whether the specified medals are equal.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public bool Equals(Medal x, Medal y)\n        {\n            // Check whether the compared objects reference the same data\n            if (ReferenceEquals(x, y))\n                return true;\n\n            // Check whether any of the compared objects is null\n            if (ReferenceEquals(x, null) || ReferenceEquals(y, null))\n                return false;\n\n            // Check whether the medals' ids are equal\n            return x.ID == y.ID;\n        }\n\n        /// <summary>\n        /// Returns a hash code for this medal.\n        /// </summary>\n        /// <param name=\"obj\">The medal.</param>\n        /// <returns>\n        /// A hash code for this medal, suitable for use in hashing algorithms and data structures like a hash table. \n        /// </returns>\n        // Get hash code\n        public int GetHashCode(Medal obj) => ReferenceEquals(obj, null) ? 0 : obj.ID.GetHashCode();\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/PlanComparer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    /// <summary>\n    /// Implements a plan comparer.\n    /// </summary>\n    public sealed class PlanComparer : Comparer<Plan>\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"sort\"></param>\n        public PlanComparer(PlanSort sort)\n        {\n            Sort = sort;\n        }\n\n        /// <summary>\n        /// Sort order (ascending, descending).\n        /// </summary>\n        public SortOrder Order { get; set; }\n\n        /// <summary>\n        /// Sort criteria.\n        /// </summary>\n        public PlanSort Sort { get; set; }\n\n        /// <summary>\n        /// Comparison function.\n        /// </summary>\n        /// <param name=\"x\"></param>\n        /// <param name=\"y\"></param>\n        /// <returns></returns>\n        public override int Compare(Plan x, Plan y)\n        {\n            // Swap variables for descending order\n            if (Order == SortOrder.Descending)\n            {\n                Plan tmp = y;\n                y = x;\n                x = tmp;\n            }\n\n            // Compare plans\n            switch (Sort)\n            {\n                case PlanSort.Description:\n                    if (x != null && y != null)\n                        return string.Compare(x.Description, y.Description,\n                            StringComparison.CurrentCulture);\n                    break;\n                case PlanSort.Name:\n                    if (x != null && y != null)\n                        return string.Compare(x.Name, y.Name, StringComparison.CurrentCulture);\n                    break;\n                case PlanSort.Time:\n                    if (x != null && y != null)\n                    {\n                        TimeSpan xtime = x.TotalTrainingTime;\n                        TimeSpan ytime = y.TotalTrainingTime;\n                        return TimeSpan.Compare(xtime, ytime);\n                    }\n                    break;\n                case PlanSort.SkillsCount:\n                    if (x != null && y != null)\n                        return x.UniqueSkillsCount - y.UniqueSkillsCount;\n                    break;\n                default:\n                    throw new NotImplementedException();\n            }\n            return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/PlanEntryComparer.cs",
    "content": "using System.Collections.Generic;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    public sealed class PlanEntryComparer : IEqualityComparer<PlanEntry>\n    {\n        /// <summary>\n        /// Returns an indication whether the specified entries are equal.\n        /// </summary>\n        /// <param name=\"x\">The x.</param>\n        /// <param name=\"y\">The y.</param>\n        /// <returns></returns>\n        public bool Equals(PlanEntry x, PlanEntry y)\n        {\n            // Check whether the compared objects reference the same data\n            if (ReferenceEquals(x, y))\n                return true;\n\n            // Check whether any of the compared objects is null\n            if (ReferenceEquals(x, null) || ReferenceEquals(y, null))\n                return false;\n\n            // Check whether the entries' properties are equal\n            return x.Skill == y.Skill;\n        }\n\n        /// <summary>\n        /// Returns a hash code for this entry.\n        /// </summary>\n        /// <param name=\"obj\">The entry.</param>\n        /// <returns>\n        /// A hash code for this entry, suitable for use in hashing algorithms and data structures like a hash table. \n        /// </returns>\n        public int GetHashCode(PlanEntry obj)\n        {\n            // Check whether the entry is null\n            if (ReferenceEquals(obj, null))\n                return 0;\n\n            // Get hash code for the entry's skill, if it is not null\n            return obj.Skill?.GetHashCode() ?? 0;\n        }\n\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/PlanetaryPinComparer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    /// <summary>\n    /// Performs a comparison between two <see cref=\"IndustryJob\" /> types.\n    /// </summary>\n    public sealed class PlanetaryPinComparer : Comparer<PlanetaryPin>\n    {\n        private readonly PlanetaryColumn m_column;\n        private readonly bool m_isAscending;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanetaryPinComparer\"/> class.\n        /// </summary>\n        /// <param name=\"column\">The column.</param>\n        /// <param name=\"isAscending\">Is ascending flag.</param>\n        public PlanetaryPinComparer(PlanetaryColumn column, bool isAscending)\n        {\n            m_column = column;\n            m_isAscending = isAscending;\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"PlanetaryColony\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        public override int Compare(PlanetaryPin x, PlanetaryPin y)\n        {\n            if (m_isAscending)\n                return CompareCore(x, y);\n\n            return -CompareCore(x, y);\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"PlanetaryColony\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        private int CompareCore(PlanetaryPin x, PlanetaryPin y)\n        {\n            switch (m_column)\n            {\n                case PlanetaryColumn.State:\n                    return x.State.CompareTo(y.State);\n                case PlanetaryColumn.TTC:\n                    return x.ExpiryTime.CompareTo(y.ExpiryTime);\n                case PlanetaryColumn.TypeName:\n                    return string.Compare(x.TypeName, y.TypeName, StringComparison.CurrentCulture);\n                case PlanetaryColumn.ContentTypeName:\n                    return string.Compare(x.ContentTypeName, y.ContentTypeName, StringComparison.CurrentCulture);\n                case PlanetaryColumn.InstallTime:\n                    return x.InstallTime.CompareTo(y.InstallTime);\n                case PlanetaryColumn.EndTime:\n                    return x.ExpiryTime.CompareTo(y.ExpiryTime);\n                case PlanetaryColumn.PlanetName:\n                    return string.Compare(x.Colony.PlanetName, y.Colony.PlanetName, StringComparison.CurrentCulture);\n                case PlanetaryColumn.PlanetTypeName:\n                    return string.Compare(x.Colony.PlanetTypeName, y.Colony.PlanetTypeName, StringComparison.CurrentCulture);\n                case PlanetaryColumn.SolarSystem:\n                    return x.Colony.SolarSystem.CompareTo(y.Colony.SolarSystem);\n                case PlanetaryColumn.Location:\n                    return string.Compare(x.Colony.FullLocation, y.Colony.FullLocation, StringComparison.CurrentCulture);\n                case PlanetaryColumn.Region:\n                    return x.Colony.SolarSystem.Constellation.Region.CompareTo(y.Colony.SolarSystem.Constellation.Region);\n                case PlanetaryColumn.Quantity:\n                    return x.ContentQuantity.CompareTo(y.ContentQuantity);\n                case PlanetaryColumn.QuantityPerCycle:\n                    return x.QuantityPerCycle.CompareTo(y.QuantityPerCycle);\n                case PlanetaryColumn.CycleTime:\n                    return x.CycleTime.CompareTo(y.CycleTime);\n                case PlanetaryColumn.Volume:\n                    return x.ContentVolume.CompareTo(y.ContentVolume);\n                case PlanetaryColumn.LinkedTo:\n                    return string.Compare(string.Join(\", \", x.LinkedTo.Select(z => z.TypeName).Distinct()),\n                        string.Join(\", \", y.LinkedTo.Select(z => z.TypeName).Distinct()), StringComparison.CurrentCulture);\n                case PlanetaryColumn.RoutedTo:\n                    return string.Compare(string.Join(\", \", x.RoutedTo.Select(z => z.TypeName).Distinct()),\n                        string.Join(\", \", y.RoutedTo.Select(z => z.TypeName).Distinct()), StringComparison.CurrentCulture);\n                case PlanetaryColumn.GroupName:\n                    return string.Compare(x.GroupName, y.GroupName, StringComparison.CurrentCulture);\n                default:\n                    return 0;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/ResearchPointComparer.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    /// <summary>\n    /// Performs a comparison between two <see cref=\"ResearchPoint\"/> types.\n    /// </summary>\n    public sealed class ResearchPointComparer : Comparer<ResearchPoint>\n    {\n        private readonly ResearchColumn m_column;\n        private readonly bool m_isAscending;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ResearchPointComparer\"/> class.\n        /// </summary>\n        /// <param name=\"column\">The column.</param>\n        /// <param name=\"isAscending\">Is ascending flag.</param>\n        public ResearchPointComparer(ResearchColumn column, bool isAscending)\n        {\n            m_column = column;\n            m_isAscending = isAscending;\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"ResearchPoint\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        public override int Compare(ResearchPoint x, ResearchPoint y)\n        {\n            if (m_isAscending)\n                return CompareCore(x, y);\n\n            return -CompareCore(x, y);\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"ResearchPoint\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        private int CompareCore(ResearchPoint x, ResearchPoint y)\n        {\n            switch (m_column)\n            {\n            case ResearchColumn.Agent:\n                return string.Compare(x.AgentName, y.AgentName,\n                    StringComparison.CurrentCulture);\n            case ResearchColumn.Field:\n                return string.Compare(x.Field, y.Field, StringComparison.CurrentCulture);\n            case ResearchColumn.Level:\n                return x.AgentLevel.CompareTo(y.AgentLevel);\n            case ResearchColumn.CurrentRP:\n                return x.CurrentRP.CompareTo(y.CurrentRP);\n            case ResearchColumn.PointsPerDay:\n                return x.PointsPerDay.CompareTo(y.PointsPerDay);\n            case ResearchColumn.StartDate:\n                return x.StartDate.CompareTo(y.StartDate);\n            case ResearchColumn.Location:\n                return x.Station.CompareTo(y.Station);\n            case ResearchColumn.Region:\n                return x.Station.SolarSystemChecked.Constellation.Region.CompareTo(y.Station.\n                    SolarSystemChecked.Constellation.Region);\n            case ResearchColumn.SolarSystem:\n                return x.Station.SolarSystemChecked.CompareTo(y.Station.SolarSystemChecked);\n            case ResearchColumn.Station:\n                return x.Station.CompareTo(y.Station);\n            default:\n                return 0;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/SerializableSettingsComparer.cs",
    "content": "using System.Collections.Generic;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    /// <summary>\n    /// Performs a comparison between two <see cref=\"EVEMon.Common.Serialization.Settings.SerializableSettings\"/> types.\n    /// </summary>\n    public sealed class SerializableSettingsComparer : IEqualityComparer<SerializableSettings>\n    {\n        /// <summary>\n        /// Determines whether the specified objects are equal.\n        /// </summary>\n        /// <param name=\"x\">The first object of type <see cref=\"EVEMon.Common.Serialization.Settings.SerializableSettings\" /> to compare.</param>\n        /// <param name=\"y\">The second object of type <see cref=\"EVEMon.Common.Serialization.Settings.SerializableSettings\" /> to compare.</param>\n        /// <returns>\n        /// true if the specified objects are equal; otherwise, false.\n        /// </returns>\n        public bool Equals(SerializableSettings x, SerializableSettings y)\n        {\n            if (ReferenceEquals(x, y))\n                return true;\n            if (ReferenceEquals(x, null))\n                return false;\n            if (ReferenceEquals(y, null))\n                return false;\n            if (x.GetType() != y.GetType())\n                return false;\n            return x.Revision == y.Revision &&\n                   x.Compatibility == y.Compatibility &&\n                   Equals(x.Updates, y.Updates) &&\n                   Equals(x.Notifications, y.Notifications) &&\n                   Equals(x.Scheduler, y.Scheduler) &&\n                   Equals(x.Calendar, y.Calendar) &&\n                   Equals(x.Exportation, y.Exportation) &&\n                   Equals(x.MarketPricer, y.MarketPricer) &&\n                   Equals(x.LoadoutsProvider, y.LoadoutsProvider) &&\n                   Equals(x.CloudStorageServiceProvider, y.CloudStorageServiceProvider) &&\n                   Equals(x.PortableEveInstallations, y.PortableEveInstallations) &&\n                   Equals(x.G15, y.G15) &&\n                   Equals(x.UI, y.UI) &&\n                   Equals(x.Proxy, y.Proxy);\n        }\n\n        /// <summary>\n        /// Returns a hash code for this instance.\n        /// </summary>\n        /// <param name=\"obj\">The object.</param>\n        /// <returns>\n        /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. \n        /// </returns>\n        public int GetHashCode(SerializableSettings obj)\n        {\n            unchecked\n            {\n                var hashCode = obj.Revision;\n                hashCode = (hashCode * 397) ^ (int)obj.Compatibility;\n                hashCode = (hashCode * 397) ^ (obj.Updates?.GetHashCode() ?? 0);\n                hashCode = (hashCode * 397) ^ (obj.Notifications?.GetHashCode() ?? 0);\n                hashCode = (hashCode * 397) ^ (obj.Scheduler?.GetHashCode() ?? 0);\n                hashCode = (hashCode * 397) ^ (obj.Calendar?.GetHashCode() ?? 0);\n                hashCode = (hashCode * 397) ^ (obj.Exportation?.GetHashCode() ?? 0);\n                hashCode = (hashCode * 397) ^ (obj.MarketPricer?.GetHashCode() ?? 0);\n                hashCode = (hashCode * 397) ^ (obj.LoadoutsProvider?.GetHashCode() ?? 0);\n                hashCode = (hashCode * 397) ^ (obj.CloudStorageServiceProvider?.GetHashCode() ?? 0);\n                hashCode = (hashCode * 397) ^ (obj.PortableEveInstallations?.GetHashCode() ?? 0);\n                hashCode = (hashCode * 397) ^ (obj.G15?.GetHashCode() ?? 0);\n                hashCode = (hashCode * 397) ^ (obj.UI?.GetHashCode() ?? 0);\n                hashCode = (hashCode * 397) ^ (obj.Proxy?.GetHashCode() ?? 0);\n                return hashCode;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/WalletJournalComparer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    public sealed class WalletJournalComparer : Comparer<WalletJournal>\n    {\n        private readonly WalletJournalColumn m_column;\n        private readonly bool m_isAscending;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"WalletJournalComparer\"/> class.\n        /// </summary>\n        /// <param name=\"column\">The column.</param>\n        /// <param name=\"isAscending\">Is ascending flag.</param>\n        public WalletJournalComparer(WalletJournalColumn column, bool isAscending)\n        {\n            m_column = column;\n            m_isAscending = isAscending;\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"WalletJournal\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        public override int Compare(WalletJournal x, WalletJournal y)\n        {\n            if (m_isAscending)\n                return CompareCore(x, y);\n\n            return -CompareCore(x, y);\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"WalletJournal\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        private int CompareCore(WalletJournal x, WalletJournal y)\n        {\n            switch (m_column)\n            {\n                case WalletJournalColumn.Date:\n                    return x.Date.CompareTo(y.Date);\n                case WalletJournalColumn.Type:\n                    return string.Compare(x.Type, y.Type, StringComparison.CurrentCulture);\n                case WalletJournalColumn.Amount:\n                    return x.Amount.CompareTo(y.Amount);\n                case WalletJournalColumn.Balance:\n                    return x.Balance.CompareTo(y.Balance);\n                case WalletJournalColumn.Reason:\n                    return string.Compare(x.Reason, y.Reason, StringComparison.CurrentCulture);\n                case WalletJournalColumn.Issuer:\n                    return string.Compare(x.Issuer, y.Issuer, StringComparison.CurrentCulture);\n                case WalletJournalColumn.Recipient:\n                    return string.Compare(x.Recipient, y.Recipient, StringComparison.CurrentCulture);\n                case WalletJournalColumn.TaxReceiver:\n                    return string.Compare(x.TaxReceiver, y.TaxReceiver, StringComparison.CurrentCulture);\n                case WalletJournalColumn.TaxAmount:\n                    return x.TaxAmount.CompareTo(y.TaxAmount);\n                case WalletJournalColumn.ID:\n                    return x.ID.CompareTo(y.ID);\n                default:\n                    return 0;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Comparers/WalletTransactionComparer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Models.Comparers\n{\n    public sealed class WalletTransactionComparer : Comparer<WalletTransaction>\n    {\n        private readonly WalletTransactionColumn m_column;\n        private readonly bool m_isAscending;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"WalletTransactionComparer\"/> class.\n        /// </summary>\n        /// <param name=\"column\">The column.</param>\n        /// <param name=\"isAscending\">Is ascending flag.</param>\n        public WalletTransactionComparer(WalletTransactionColumn column, bool isAscending)\n        {\n            m_column = column;\n            m_isAscending = isAscending;\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"WalletTransaction\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        public override int Compare(WalletTransaction x, WalletTransaction y)\n        {\n            if (m_isAscending)\n                return CompareCore(x, y);\n\n            return -CompareCore(x, y);\n        }\n\n        /// <summary>\n        /// Performs a comparison of two objects of the <see cref=\"WalletTransaction\" /> type and returns a value\n        /// indicating whether one object is less than, equal to, or greater than the other.\n        /// </summary>\n        /// <param name=\"x\">The first object to compare.</param>\n        /// <param name=\"y\">The second object to compare.</param>\n        /// <returns>\n        /// Less than zero\n        /// <paramref name=\"x\"/> is less than <paramref name=\"y\"/>.\n        /// Zero\n        /// <paramref name=\"x\"/> equals <paramref name=\"y\"/>.\n        /// Greater than zero\n        /// <paramref name=\"x\"/> is greater than <paramref name=\"y\"/>.\n        /// </returns>\n        private int CompareCore(WalletTransaction x, WalletTransaction y)\n        {\n            switch (m_column)\n            {\n            case WalletTransactionColumn.Date:\n                return x.Date.CompareTo(y.Date);\n            case WalletTransactionColumn.ItemName:\n                return string.Compare(x.ItemName, y.ItemName, StringComparison.CurrentCulture);\n            case WalletTransactionColumn.Price:\n                return x.Price.CompareTo(y.Price);\n            case WalletTransactionColumn.Quantity:\n                return x.Quantity.CompareTo(y.Quantity);\n            case WalletTransactionColumn.Credit:\n                return x.Credit.CompareTo(y.Credit);\n            case WalletTransactionColumn.Client:\n                return string.Compare(x.ClientName, y.ClientName,\n                    StringComparison.CurrentCulture);\n            case WalletTransactionColumn.Location:\n                return x.Station.CompareTo(y.Station);\n            case WalletTransactionColumn.Region:\n                return x.Station.SolarSystemChecked.Constellation.Region.CompareTo(y.\n                    Station.SolarSystemChecked.Constellation.Region);\n            case WalletTransactionColumn.SolarSystem:\n                return x.Station.SolarSystemChecked.CompareTo(y.Station.SolarSystemChecked);\n            case WalletTransactionColumn.Station:\n                return x.Station.CompareTo(y.Station);\n            case WalletTransactionColumn.TransactionFor:\n                return x.TransactionFor.CompareTo(y.TransactionFor);\n            case WalletTransactionColumn.JournalID:\n                return x.JournalID.CompareTo(y.JournalID);\n            default:\n                return 0;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Contact.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class Contact\n    {\n        public event EventHandler ContactImageUpdated;\n\n\n        #region Fields\n\n        private readonly long m_contactID;\n        private readonly ContactType m_contactType;\n        private Image m_image;\n        private string m_contactName;\n\n        #endregion\n\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        internal Contact(EsiContactListItem src)\n        {\n            m_contactID = src.ContactID;\n            m_contactName = EveIDToName.GetIDToName(m_contactID);\n            IsInWatchlist = src.InWatchlist;\n            Standing = src.Standing;\n            Group = src.Group == ContactGroup.Personal && StaticGeography.AllAgents.Any(\n                x => x.ID == m_contactID) ? ContactGroup.Agent : src.Group;\n\n            switch (src.Group)\n            {\n            case ContactGroup.Corporate:\n                m_contactType = ContactType.Corporation;\n                break;\n            case ContactGroup.Alliance:\n                m_contactType = ContactType.Alliance;\n                break;\n            default:\n                m_contactType = ContactType.Character;\n                break;\n            }\n        }\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the name of the contact.\n        /// </summary>\n        /// <value>\n        /// The name of the contact.\n        /// </value>\n        public string Name => (m_contactName.IsEmptyOrUnknown()) ? (m_contactName =\n            EveIDToName.GetIDToName(m_contactID)) : m_contactName;\n\n        /// <summary>\n        /// Gets a value indicating whether the contact is in the watchlist.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if the contact is in the watchlist; otherwise, <c>false</c>.\n        /// </value>\n        public bool IsInWatchlist { get; }\n\n        /// <summary>\n        /// Gets the standing.\n        /// </summary>\n        public double Standing { get; }\n\n        /// <summary>\n        /// Gets the group.\n        /// </summary>\n        public ContactGroup Group { get; }\n\n\n        /// <summary>\n        /// Gets the entity image.\n        /// </summary>\n        public Image EntityImage\n        {\n            get\n            {\n                if (m_image != null)\n                    return m_image;\n\n                GetImageAsync().ConfigureAwait(false);\n\n                return m_image ?? (m_image = GetDefaultImage());\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the entity image.\n        /// </summary>\n        private async Task GetImageAsync()\n        {\n            Image img = await ImageService.GetImageAsync(GetImageUrl()).ConfigureAwait(false);\n            if (img != null)\n            {\n                m_image = img;\n                ContactImageUpdated?.ThreadSafeInvoke(this, EventArgs.Empty);\n            }\n        }\n\n        /// <summary>\n        /// Gets the default image.\n        /// </summary>\n        /// <returns></returns>\n        private Image GetDefaultImage()\n        {\n            switch (m_contactType)\n            {\n                case ContactType.Character:\n                    return Properties.Resources.DefaultCharacterImage32;\n                case ContactType.Corporation:\n                    return Properties.Resources.DefaultCorporationImage32;\n                case ContactType.Alliance:\n                    return Properties.Resources.DefaultAllianceImage32;\n            }\n            return new Bitmap(32, 32);\n        }\n\n        /// <summary>\n        /// Gets the image URL.\n        /// </summary>\n        /// <returns></returns>\n        private Uri GetImageUrl()\n        {\n            Uri uri;\n            switch (m_contactType) {\n            case ContactType.Corporation:\n                uri = ImageHelper.GetCorporationImageURL(m_contactID);\n                break;\n            case ContactType.Alliance:\n                uri = ImageHelper.GetAllianceImageURL(m_contactID);\n                break;\n            case ContactType.Character:\n            default:\n                uri = ImageHelper.GetPortraitUrl(m_contactID);\n                break;\n            }\n            return uri;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Contract.cs",
    "content": "﻿using EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.Service;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class Contract\n    {\n        private readonly List<ContractItem> m_contractItems = new List<ContractItem>();\n        private ContractState m_state;\n        private Enum m_method;\n\n        private string m_acceptor;\n        private string m_assignee;\n        private ICollection<ContractBid> m_bids;\n        private ResponseParams m_bidsResponse;\n        private bool m_bidsPending;\n        private long m_endStationID;\n        private string m_issuer;\n        private bool m_itemsPending;\n        private ResponseParams m_itemsResponse;\n        private long m_startStationID;\n\n        /// <summary>\n        /// The maximum number of days after contract expires. Beyond this limit, we do not\n        /// import contracts anymore.\n        /// </summary>\n        public const int MaxEndedDays = 7;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"ccpCharacter\">The CCP character.</param>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        internal Contract(CCPCharacter ccpCharacter, EsiContractListItem src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            m_bidsResponse = m_itemsResponse = null;\n            Character = ccpCharacter;\n            PopulateContractInfo(src);\n            m_state = GetState(src);\n            m_bids = new LinkedList<ContractBid>();\n        }\n\n        /// <summary>\n        /// Constructor from an object deserialized from the settings file.\n        /// </summary>\n        /// <param name=\"ccpCharacter\">The CCP character.</param>\n        /// <param name=\"src\">The source.</param>\n        internal Contract(CCPCharacter ccpCharacter, SerializableContract src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            m_bidsResponse = m_itemsResponse = null;\n            Character = ccpCharacter;\n            ContractType = src.ContractType;\n            ID = src.ContractID;\n            IssuedFor = src.IssuedFor;\n            if (IssuedFor == IssuedFor.Corporation)\n                IssuerID = Character.CharacterID;\n            m_state = src.ContractState;\n            m_bids = new LinkedList<ContractBid>();\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character.\n        /// </summary>\n        public CCPCharacter Character { get; }\n\n        /// <summary>\n        /// Gets the ID.\n        /// </summary>\n        public long ID { get; private set; }\n\n        /// <summary>\n        /// Gets the issuer ID.\n        /// </summary>\n        public long IssuerID { get; private set; }\n\n        /// <summary>\n        /// Gets the assignee ID.\n        /// </summary>\n        public long AssigneeID { get; private set; }\n\n        /// <summary>\n        /// Gets the acceptor ID.\n        /// </summary>\n        public long AcceptorID { get; private set; }\n\n        /// <summary>\n        /// Gets the start station.\n        /// </summary>\n        public Station StartStation { get; private set; }\n\n        /// <summary>\n        /// Gets the end station.\n        /// </summary>\n        public Station EndStation { get; private set; }\n\n        /// <summary>\n        /// Gets the type of the contract.\n        /// </summary>\n        /// <value>\n        /// The type of the contract.\n        /// </value>\n        public ContractType ContractType { get; private set; }\n\n        /// <summary>\n        /// Gets the status.\n        /// </summary>\n        public CCPContractStatus Status { get; private set; }\n\n        /// <summary>\n        /// Gets the description.\n        /// </summary>\n        public string Description { get; private set; }\n\n        /// <summary>\n        /// Gets the issued for.\n        /// </summary>\n        public IssuedFor IssuedFor { get; private set; }\n\n        /// <summary>\n        /// Gets the availability.\n        /// </summary>\n        public ContractAvailability Availability { get; private set; }\n\n        /// <summary>\n        /// Gets the issued.\n        /// </summary>\n        public DateTime Issued { get; private set; }\n\n        /// <summary>\n        /// Gets the expiration.\n        /// </summary>\n        public DateTime Expiration { get; private set; }\n\n        /// <summary>\n        /// Gets the accepted.\n        /// </summary>\n        public DateTime Accepted { get; private set; }\n\n        /// <summary>\n        /// Gets the duration.\n        /// </summary>\n        public int Duration { get; private set; }\n\n        /// <summary>\n        /// Gets the days to complete.\n        /// </summary>\n        public int DaysToComplete { get; private set; }\n\n        /// <summary>\n        /// Gets the completed.\n        /// </summary>\n        public DateTime Completed { get; private set; }\n\n        /// <summary>\n        /// Gets the price.\n        /// </summary>\n        public decimal Price { get; private set; }\n\n        /// <summary>\n        /// Gets the reward.\n        /// </summary>\n        public decimal Reward { get; private set; }\n\n        /// <summary>\n        /// Gets the collateral.\n        /// </summary>\n        public decimal Collateral { get; private set; }\n\n        /// <summary>\n        /// Gets the buyout.\n        /// </summary>\n        public decimal Buyout { get; private set; }\n\n        /// <summary>\n        /// Gets the volume.\n        /// </summary>\n        public decimal Volume { get; private set; }\n\n        /// <summary>\n        /// Gets the issuer.\n        /// </summary>\n        public string Issuer => m_issuer.IsEmptyOrUnknown() ? (m_issuer = EveIDToName.\n            GetIDToName(IssuerID)) : m_issuer;\n\n        /// <summary>\n        /// Gets the assignee.\n        /// </summary>\n        public string Assignee => m_assignee.IsEmptyOrUnknown() ? (m_assignee = EveIDToName.\n            GetIDToName(AssigneeID)) : m_assignee;\n\n        /// <summary>\n        /// Gets the acceptor.\n        /// </summary>\n        public string Acceptor => m_acceptor.IsEmptyOrUnknown() ? (m_acceptor = EveIDToName.\n            GetIDToName(AcceptorID)) : m_acceptor;\n\n        /// <summary>\n        /// Gets the contract items.\n        /// </summary>\n        public IEnumerable<ContractItem> ContractItems => m_contractItems.Where(x => x.Item != null);\n\n        /// <summary>\n        /// Gets the contract bids.\n        /// </summary>\n        public IEnumerable<ContractBid> ContractBids => m_bids;\n\n        /// <summary>\n        /// Gets the contract text.\n        /// </summary>\n        /// <remarks>Keep this order of checking.</remarks>\n        public string ContractText\n        {\n            get\n            {\n                if (ContractType == ContractType.Courier)\n                {\n                    string startName = StartStation.SolarSystemChecked?.Name ??\n                        EveMonConstants.UnknownText;\n                    string endName = EndStation.SolarSystemChecked?.Name ??\n                        EveMonConstants.UnknownText;\n                    return $\"{startName} >> {endName} ({Math.Round(Volume)} m³)\";\n                }\n\n                if (!m_contractItems.Any() || !ContractItems.Any())\n                    return EveMonConstants.UnknownText;\n\n                if (IsTrading)\n                    return \"[Want To Trade]\";\n\n                if (IsMultipleItems)\n                    return \"[Multiple Items]\";\n\n                if (IsBuyOnly)\n                    return Reward == 0 ? \"[Want A Gift]\" : \"[Want To Buy]\";\n\n                return m_contractItems.First().Item.Name + ((m_contractItems.First().\n                    Quantity > 1) ? $\" x {m_contractItems.First().Quantity}\" : string.Empty);\n            }\n        }\n\n        /// <summary>\n        /// When true, the contract will be deleted unless it was found on the API feed.\n        /// </summary>\n        internal bool MarkedForDeletion { get; set; }\n\n        /// <summary>\n        /// Gets the contract state.\n        /// </summary>\n        public ContractState State\n        {\n            get\n            {\n                if (IsExpired && (m_state == ContractState.Created || m_state == ContractState.Assigned))\n                    return ContractState.Expired;\n\n                return m_state;\n            }\n        }\n\n        /// <summary>\n        /// Gets true if the contract is of \"buy only\" type.\n        /// </summary>\n        public bool IsBuyOnly => m_contractItems.All(x => !x.Included);\n\n        /// <summary>\n        /// Gets true if the contract is of \"multiple items\" type.\n        /// </summary>\n        public bool IsMultipleItems => m_contractItems.Count > 1 && m_contractItems.All(x => x.Included);\n\n        /// <summary>\n        /// Gets true if the contract is of \"trading\" type.\n        /// </summary>\n        public bool IsTrading\n            => m_contractItems.Count > 1 && m_contractItems.Any(x => x.Included) && m_contractItems.Any(x => !x.Included);\n\n        /// <summary>\n        /// Gets true if the contract is not finished, canceled, expired, etc.\n        /// </summary>\n        public bool IsAvailable => (m_state == ContractState.Created || m_state == ContractState.Assigned) && !IsExpired;\n\n        /// <summary>\n        /// Gets true if the contract is expired or rejected but not yet deleted (needs attention).\n        /// </summary>\n        public bool NeedsAttention => m_state == ContractState.Expired || m_state == ContractState.Rejected || Overdue;\n\n        /// <summary>\n        /// Gets true if contract completion is ovedue.\n        /// </summary>\n        public bool Overdue => Status == CCPContractStatus.Overdue || (Status ==\n            CCPContractStatus.InProgress && Accepted.AddDays(DaysToComplete) < DateTime.UtcNow);\n\n        /// <summary>\n        /// Gets true if contract naturally expired because of its duration.\n        /// </summary>\n        public bool IsExpired => Expiration < DateTime.UtcNow;\n\n        /// <summary>\n        /// Gets or sets a value indicating whether a notification for this contract have been send.\n        /// </summary>\n        /// <value><c>true</c> if a notification for this contract have been send; otherwise, <c>false</c>.</value>\n        public bool NotificationSend { get; set; }\n\n        #endregion\n\n\n        #region Importation, Exportation\n\n        /// <summary>\n        /// Try to update this contract with a serialization object from the API.\n        /// </summary>\n        /// <param name=\"src\">The serializable source.</param>\n        /// <param name=\"endedContracts\">The ended contracts.</param>\n        /// <returns>True if import successful otherwise, false.</returns>\n        internal bool TryImport(EsiContractListItem src, ICollection<Contract> endedContracts)\n        {\n            // Note that, before a match is found, all contracts have been marked for deletion:\n            // m_markedForDeletion == true\n            bool matches = MatchesWith(src);\n            if (matches)\n            {\n                // Prevent deletion\n                MarkedForDeletion = false;\n                // Contract is from a serialized object, so populate the missing info\n                if (IssuerID == 0L || Issuer.IsEmptyOrUnknown())\n                    PopulateContractInfo(src);\n                // Update if modified\n                ContractState state = GetState(src);\n                if (state != m_state || NeedsAttention)\n                {\n                    if (state != m_state || Overdue)\n                    {\n                        m_state = state;\n                        UpdateContractInfo(src);\n                    }\n                    // If the contract has just finished or expired, add it to the ended list\n                    if (NeedsAttention || state == ContractState.Finished)\n                        endedContracts.Add(this);\n                }\n            }\n            return matches;\n        }\n\n        /// <summary>\n        /// Populates the serialization object contract with the info from the API.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        private void PopulateContractInfo(EsiContractListItem src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            m_method = src.APIMethod;\n            ID = src.ContractID;\n            IssuerID = src.IssuerID;\n            AssigneeID = src.AssigneeID;\n            Description = src.Title.IsEmptyOrUnknown() ? \"(None)\" : src.Title;\n            IssuedFor = src.ForCorp ? IssuedFor.Corporation : IssuedFor.Character;\n            Issued = src.DateIssued;\n            Expiration = src.DateExpired;\n            Duration = (int)Math.Round(src.DateExpired.Subtract(src.DateIssued).TotalDays);\n            DaysToComplete = src.NumDays;\n            Price = src.Price;\n            Reward = src.Reward;\n            Collateral = src.Collateral;\n            Buyout = src.Buyout;\n            Volume = src.Volume;\n            m_startStationID = src.StartStationID;\n            m_endStationID = src.EndStationID;\n            UpdateStation();\n            UpdateContractInfo(src);\n\n            Availability = src.Availability;\n            ContractType = src.ContractType;\n            // Issuer and assignee\n            m_issuer = src.ForCorp ? Character.Corporation.Name : EveIDToName.GetIDToName(\n                src.IssuerID);\n            m_assignee = EveIDToName.GetIDToName(src.AssigneeID);\n        }\n\n        /// <summary>\n        /// Updates the contract info.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        private void UpdateContractInfo(EsiContractListItem src)\n        {\n            Accepted = src.DateAccepted;\n            Completed = src.DateCompleted;\n            AcceptorID = src.AcceptorID;\n            m_acceptor = EveIDToName.GetIDToName(src.AcceptorID);\n            Status = src.ContractStatus;\n            if (Overdue)\n                Status = CCPContractStatus.Overdue;\n        }\n\n        /// <summary>\n        /// Imports the contract items to a list.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        private void Import(IEnumerable<EsiContractItemsListItem> src)\n        {\n            foreach (EsiContractItemsListItem item in src)\n                m_contractItems.Add(new ContractItem(item));\n        }\n\n        /// <summary>\n        /// Imports the contract bids to a list.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        internal void Import(IEnumerable<EsiContractBidsListItem> src)\n        {\n            m_bids.Clear();\n            // Add new bids to collection\n            foreach (EsiContractBidsListItem item in src)\n                m_bids.Add(new ContractBid(item));\n        }\n\n        /// <summary>\n        /// Exports the given object to a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        internal SerializableContract Export() => new SerializableContract\n        {\n            ContractID = ID,\n            ContractState = m_state,\n            ContractType = ContractType,\n            IssuedFor = IssuedFor\n        };\n\n        #endregion\n\n\n        #region Querying Methods\n\n        /// <summary>\n        /// Gets the contract items or bids.\n        /// </summary>\n        private void GetContractData<T, U>(APIProvider.ESIRequestCallback<T> callback,\n            ESIAPICorporationMethods methodCorp, ESIAPICharacterMethods methodPersonal,\n            ResponseParams response) where T : List<U> where U : class\n        {\n            var cid = Character.Identity;\n            ESIKey key;\n            Enum method;\n            long owner;\n            // Special condition to identify corporation contracts in character query\n            if (IssuedFor == IssuedFor.Corporation && ESIAPICorporationMethods.\n                CorporationContracts.Equals(m_method))\n            {\n                key = cid.FindAPIKeyWithAccess(methodCorp);\n                method = methodCorp;\n                owner = Character.CorporationID;\n            }\n            else\n            {\n                key = cid.FindAPIKeyWithAccess(methodPersonal);\n                method = methodPersonal;\n                owner = Character.CharacterID;\n            }\n            // Only query if the error count has not been exceeded\n            if (key != null && !EsiErrors.IsErrorCountExceeded)\n                EveMonClient.APIProviders.CurrentProvider.QueryPagedEsi<T, U>(method, callback,\n                    new ESIParams(response, key.AccessToken)\n                    {\n                        ParamOne = owner,\n                        ParamTwo = ID\n                    }, method);\n        }\n\n        /// <summary>\n        /// Processes the contract items.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private void OnContractItemsDownloaded(EsiResult<EsiAPIContractItems> result,\n            object apiMethod)\n        {\n            var methodEnum = (apiMethod as Enum) ?? ESIAPICharacterMethods.ContractItems;\n            var target = Character;\n            m_itemsResponse = result.Response;\n            // Notify if an error occured\n            if (target.ShouldNotifyError(result, methodEnum))\n                EveMonClient.Notifications.NotifyContractItemsError(target, result);\n            if (!result.HasError && result.HasData)\n            {\n                EveMonClient.Notifications.InvalidateCharacterAPIError(target);\n                Import(result.Result);\n                // Fire correct event type\n                if (methodEnum is ESIAPICharacterMethods)\n                    EveMonClient.OnCharacterContractItemsDownloaded(target);\n                else\n                    EveMonClient.OnCorporationContractItemsDownloaded(target);\n            }\n            m_itemsPending = false;\n        }\n\n        /// <summary>\n        /// Processes the contract bids.\n        /// </summary>\n        private void OnContractBidsUpdated(EsiResult<EsiAPIContractBids> result, object\n            apiMethod)\n        {\n            var methodEnum = (apiMethod as Enum) ?? ESIAPICharacterMethods.ContractBids;\n            var target = Character;\n            m_bidsResponse = result.Response;\n            // Notify if an error occured\n            if (target.ShouldNotifyError(result, methodEnum))\n                EveMonClient.Notifications.NotifyContractBidsError(Character, result);\n            if (!result.HasError)\n            {\n                EveMonClient.Notifications.InvalidateCharacterAPIError(target);\n                Import(result.Result);\n                // Fire correct event type\n                if (methodEnum is ESIAPICharacterMethods)\n                    EveMonClient.OnCharacterContractBidsDownloaded(target);\n                else\n                    EveMonClient.OnCorporationContractBidsDownloaded(target);\n            }\n            m_bidsPending = false;\n        }\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Updates the station.\n        /// </summary>\n        public void UpdateStation()\n        {\n            StartStation = EveIDToStation.GetIDToStation(m_startStationID, Character);\n            EndStation = EveIDToStation.GetIDToStation(m_endStationID, Character);\n        }\n\n        /// <summary>\n        /// Fetches the contract's items and bids.\n        /// </summary>\n        public void UpdateContractItems()\n        {\n            // Retrieve items\n            if (ContractType != ContractType.Courier && m_contractItems.Count < 1 &&\n                !m_itemsPending)\n            {\n                m_itemsPending = true;\n                GetContractData<EsiAPIContractItems, EsiContractItemsListItem>(\n                    OnContractItemsDownloaded, ESIAPICorporationMethods.\n                    CorporationContractItems, ESIAPICharacterMethods.ContractItems,\n                    m_itemsResponse);\n            }\n            if (ContractType == ContractType.Auction && !m_bidsPending)\n            {\n                m_bidsPending = true;\n                GetContractData<EsiAPIContractBids, EsiContractBidsListItem>(\n                    OnContractBidsUpdated, ESIAPICorporationMethods.CorporationContractBids,\n                    ESIAPICharacterMethods.ContractBids, m_bidsResponse);\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Checks whether the given API object matches with this contract.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <returns></returns>\n        private bool MatchesWith(EsiContractListItem src) => src.ContractID == ID;\n\n        /// <summary>\n        /// Gets the state of a contract.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <returns></returns>\n        private ContractState GetState(EsiContractListItem src)\n        {\n            CCPContractStatus status = src.ContractStatus;\n\n            if (status == CCPContractStatus.Outstanding && IsExpired)\n                return ContractState.Expired;\n\n            switch (status)\n            {\n            case CCPContractStatus.Failed:\n                return ContractState.Failed;\n            case CCPContractStatus.Canceled:\n                return ContractState.Canceled;\n            case CCPContractStatus.Overdue:\n            case CCPContractStatus.Outstanding:\n            case CCPContractStatus.InProgress:\n                return IssuerID != Character.CharacterID ? ContractState.Assigned :\n                    ContractState.Created;\n            case CCPContractStatus.Completed:\n            case CCPContractStatus.CompletedByContractor:\n            case CCPContractStatus.CompletedByIssuer:\n                return ContractState.Finished;\n            case CCPContractStatus.Rejected:\n                return ContractState.Rejected;\n            case CCPContractStatus.Deleted:\n                return ContractState.Deleted;\n            default:\n                throw new NotImplementedException();\n            }\n        }\n        \n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/ContractBid.cs",
    "content": "using System;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class ContractBid\n    {\n        private readonly long m_bidderId;\n        private string m_bidder;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        internal ContractBid(EsiContractBidsListItem src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            ID = src.ID;\n            m_bidderId = src.BidderID;\n            m_bidder = EveIDToName.GetIDToName(src.BidderID);\n            BidDate = src.DateBid;\n            Amount = src.Amount;\n        }\n        \n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the ID.\n        /// </summary>\n        public long ID { get; }\n        \n        /// <summary>\n        /// Gets the bidder.\n        /// </summary>\n        public string Bidder => m_bidder.IsEmptyOrUnknown() ? (m_bidder = EveIDToName.\n            GetIDToName(m_bidderId)) : m_bidder;\n\n        /// <summary>\n        /// Gets the bid date.\n        /// </summary>\n        public DateTime BidDate { get; }\n\n        /// <summary>\n        /// Gets the amount.\n        /// </summary>\n        public decimal Amount { get; }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/ContractItem.cs",
    "content": "using EVEMon.Common.Data;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    public class ContractItem\n    {\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        internal ContractItem(EsiContractItemsListItem src)\n        {\n            RecordID = src.RecordID;\n            Item = StaticItems.GetItemByID(src.TypeID);\n            Quantity = src.Quantity;\n            RawQuantity = src.RawQuantity;\n            Singleton = src.Singleton;\n            Included = src.Included;\n        }\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the record ID.\n        /// </summary>\n        /// <value>The record ID.</value>\n        public long RecordID { get; }\n\n        /// <summary>\n        /// Gets or sets the item.\n        /// </summary>\n        /// <value>The item.</value>\n        public Item Item { get; }\n\n        /// <summary>\n        /// Gets or sets the quantity.\n        /// </summary>\n        /// <value>The quantity.</value>\n        public long Quantity { get; }\n\n        /// <summary>\n        /// Gets or sets the raw quantity.\n        /// </summary>\n        /// <value>The raw quantity.</value>\n        public int RawQuantity { get; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"ContractItem\"/> is a singleton.\n        /// </summary>\n        /// <value><c>true</c> if singleton; otherwise, <c>false</c>.</value>\n        public bool Singleton { get; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"ContractItem\"/> is included.\n        /// </summary>\n        /// <value><c>true</c> if included; otherwise, <c>false</c>.</value>\n        public bool Included { get; }\n\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Corporation.cs",
    "content": "﻿namespace EVEMon.Common.Models\n{\n    public sealed class Corporation\n    {\n        private readonly Character m_character;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"Corporation\"/> class.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        public Corporation(Character character)\n        {\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Gets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        public long ID => m_character.CorporationID;\n\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name => m_character.CorporationName;\n\n        /// <summary>\n        /// Gets the name of the corporation.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => Name;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/ESIKey.cs",
    "content": "﻿using EVEMon.Common.Attributes;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.QueryMonitor;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.Service;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a player ESI key.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class ESIKey\n    {\n        #region Fields\n\n        // When account status returns...\n        //private readonly APIKeyQueryMonitor<SerializableAPIAccountStatus> m_accountStatusMonitor;\n\n        private bool m_monitored;\n        private bool m_queried;\n        private bool m_queryPending;\n        private DateTime m_keyExpires;\n\n        #endregion\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Common constructor base.\n        /// </summary>\n        private ESIKey()\n        {\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n            m_keyExpires = DateTime.MinValue;\n            m_queried = false;\n            m_queryPending = false;\n        }\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"serial\">The serialized key.</param>\n        internal ESIKey(SerializableESIKey serial)\n            : this()\n        {\n            ID = serial.ID;\n            RefreshToken = serial.RefreshToken;\n            AccessMask = serial.AccessMask;\n            m_monitored = serial.Monitored;\n        }\n\n        /// <summary>\n        /// Constructor from the provided informations.\n        /// </summary>\n        /// <param name=\"id\">The ESI key ID (not too terribly meaningful).</param>\n        public ESIKey(long id)\n            : this()\n        {\n            ID = id;\n            RefreshToken = string.Empty;\n            m_monitored = true;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        public long ID { get; }\n\n        /// <summary>\n        /// Gets or sets the access token.\n        /// </summary>\n        /// <value>The access token.</value>\n        [XmlIgnore]\n        public string AccessToken { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the refresh token.\n        /// </summary>\n        /// <value>The refresh token.</value>\n        [XmlIgnore]\n        public string RefreshToken { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the access mask.\n        /// </summary>\n        /// <value>The access mask.</value>\n        [XmlIgnore]\n        public ulong AccessMask { get; private set; }\n\n        /// <summary>\n        /// Returns true if an error occurred while last trying to refresh this key.\n        /// </summary>\n        [XmlIgnore]\n        public bool HasError { get; private set; }\n\n#if false\n        /// <summary>\n        /// Gets the account expiration date and time. RIP Account status API.\n        /// </summary>\n        public DateTime AccountExpires { get; set; }\n#endif\n\n        /// <summary>\n        /// Gets the character identities for this API key.\n        /// </summary>\n        public IEnumerable<CharacterIdentity> CharacterIdentities => EveMonClient.\n            CharacterIdentities.Where(characterID => characterID.ESIKeys.Contains(this));\n        \n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"ESIKey\"/> is monitored.\n        /// </summary>\n        /// <value><c>true</c> if monitored; otherwise, <c>false</c>.</value>\n        public bool Monitored\n        {\n            get { return m_monitored; }\n            set\n            {\n                m_monitored = value;\n                EveMonClient.OnESIKeyMonitoredChanged();\n            }\n        }\n\n        /// <summary>\n        /// Gets true if at least one of the CCP characters is monitored.\n        /// </summary>\n        public bool HasMonitoredCharacters => CharacterIdentities.Select(id => id.CCPCharacter)\n            .Any(ccpCharacter => ccpCharacter != null && ccpCharacter.Monitored);\n\n        /// <summary>\n        /// Gets the character in training on this API key, or null if none are in training.\n        /// </summary>\n        /// <remarks>Returns null if the character is in the ignored list.</remarks>\n        // Scroll through owned identities\n        public CCPCharacter TrainingCharacter => CharacterIdentities.Select(id => id.CCPCharacter)\n            .FirstOrDefault(ccpCharacter => ccpCharacter != null && ccpCharacter.IsTraining);\n\n        /// <summary>\n        /// Gets true if this API key has a character in training.\n        /// </summary>\n        public bool HasCharacterInTraining => TrainingCharacter != null;\n        \n        /// <summary>\n        /// Gets true if this API key got queried or is not monitored.\n        /// </summary>\n        public bool IsProcessed => m_queried || !m_monitored;\n\n        #endregion\n\n\n        #region Internal Methods\n        \n        /// <summary>\n        /// Starts obtaining an access token from the refresh token, because either the access\n        /// token expired or was never obtained.\n        /// </summary>\n        internal void CheckAccessToken()\n        {\n            var rt = RefreshToken;\n            if (m_keyExpires < DateTime.UtcNow && !string.IsNullOrEmpty(rt) && !m_queryPending)\n            {\n                var auth = SSOAuthenticationService.GetInstance();\n                if (auth == null)\n                    // User removed the client ID / secret\n                    HasError = true;\n                else\n                {\n                    auth.GetNewToken(rt, OnAccessToken);\n                    m_queryPending = true;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Updates the access token, or sets an error flag if the token could no longer be\n        /// obtained.\n        /// </summary>\n        /// <param name=\"response\">The token response received from the server.</param>\n        private void OnAccessToken(AccessResponse response)\n        {\n            m_queried = true;\n\n            if (response == null)\n            {\n                // If it errors out, avoid checking again for another 5 minutes\n                m_keyExpires = DateTime.UtcNow.AddMinutes(5.0);\n                EveMonClient.Notifications.NotifySSOError();\n                HasError = true;\n                m_queryPending = false;\n                EveMonClient.OnESIKeyInfoUpdated(this);\n            }\n            else\n            {\n                AccessToken = response.AccessToken;\n                // PKCE routinely updates refresh tokens\n                RefreshToken = response.RefreshToken;\n                m_keyExpires = response.ExpiryUTC;\n                // Have to make a second request for the character information!\n                SSOAuthenticationService.GetTokenInfo(AccessToken, OnTokenInfo);\n            }\n        }\n\n        /// <summary>\n        /// Updates the token character list, or sets an error flag if it could not be\n        /// obtained.\n        /// </summary>\n        private void OnTokenInfo(JsonResult<EsiAPITokenInfo> result)\n        {\n            EsiAPITokenInfo tokenInfo = result.Result;\n            if (result.HasError)\n            {\n                HasError = true;\n                EveMonClient.Notifications.NotifyCharacterListError(this, result);\n            }\n            else\n            {\n                HasError = false;\n                ImportIdentities(tokenInfo);\n                EveMonClient.Notifications.InvalidateAPIError();\n            }\n            m_queryPending = false;\n            EveMonClient.OnESIKeyInfoUpdated(this);\n        }\n\n        #endregion\n\n\n        #region Inherited events\n\n        /// <summary>\n        /// Called when the object gets disposed.\n        /// </summary>\n        internal void Dispose()\n        {\n            // Unsubscribe events\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n        }\n\n        #endregion\n\n\n        #region Global Events\n\n        /// <summary>\n        /// Updates the API key info and account status on a timer tick.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            CheckAccessToken();\n        }\n\n        #endregion\n\n\n        #region Queries response\n\n#if false\n        /// <summary>\n        /// Called when the account status has been updated.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private void OnAccountStatusUpdated(JsonResult<SerializableAPIAccountStatus> result)\n        {\n            // Quit if the API key was deleted while it was updating\n            if (!EveMonClient.ESIKeys.Contains(this))\n                return;\n            \n            // Return on error\n            if (result.HasError)\n            {\n                EveMonClient.Notifications.NotifyAccountStatusError(this, result);\n                return;\n            }\n\n            EveMonClient.Notifications.InvalidateAccountStatusError(this);\n\n            // Notifies for the account expiration\n            NotifyAccountExpiration();\n\n            // Fires the event regarding the account status update\n            EveMonClient.OnAccountStatusUpdated(this);\n        }\n#endif\n        \n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Forces the update.\n        /// </summary>\n        public void ForceUpdate()\n        {\n            CheckAccessToken();\n        }\n        \n        /// <summary>\n        /// Notifies for the account expiration.\n        /// </summary>\n        private void NotifyAccountExpiration()\n        {\n            // No Account Status API in ESI\n#if false\n            DateTime AccountExpires = DateTime.MaxValue;\n\n            // Is it to expire within 7 days? Send an informative notification\n            TimeSpan daysToExpire = AccountExpires.Subtract(DateTime.UtcNow);\n            if (daysToExpire < TimeSpan.FromDays(7) && daysToExpire > TimeSpan.FromDays(1))\n            {\n                EveMonClient.Notifications.NotifyAccountExpiration(this, AccountExpires, NotificationPriority.Information);\n                return;\n            }\n\n            // Is it to expire within the day? Send a warning notification\n            if (daysToExpire <= TimeSpan.FromDays(1) && daysToExpire > TimeSpan.Zero)\n            {\n                EveMonClient.Notifications.NotifyAccountExpiration(this, AccountExpires, NotificationPriority.Warning);\n                return;\n            }\n#endif\n            EveMonClient.Notifications.InvalidateAccountExpiration(this);\n        }\n        \n        #endregion\n\n\n        #region Static Methods\n\n        /// <summary>\n        /// Tries to add or update the ESI key.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <param name=\"accessResponse\">The access and refresh token.</param>\n        /// <param name=\"callback\">The callback.</param>\n        public static void TryAddOrUpdateAsync(long id, AccessResponse accessResponse,\n                                               EventHandler<ESIKeyCreationEventArgs> callback)\n        {\n            accessResponse.ThrowIfNull(nameof(accessResponse));\n            SSOAuthenticationService.GetTokenInfo(accessResponse.AccessToken,\n                (result) => callback(null, new ESIKeyCreationEventArgs(id, accessResponse.\n                RefreshToken, result)));\n        }\n        \n        /// <summary>\n        /// Check whether some accounts are not in training.\n        /// </summary>\n        /// <param name=\"message\">Message describing the accounts not in training.</param>\n        /// <returns>True if one or more accounts is not in training, otherwise false.</returns>\n        /// <remarks>This condition applied only to those API keys of type 'Account'</remarks>\n        public static bool HasCharactersNotTraining(out string message)\n        {\n            message = string.Empty;\n\n            List<ESIKey> accountsNotTraining = EveMonClient.ESIKeys.Where(\n                esiKey => esiKey.CharacterIdentities.Any() && !esiKey.HasCharacterInTraining)\n                .ToList();\n\n            // All accounts are training ?\n            if (!accountsNotTraining.Any())\n                return false;\n\n            // Creates the string, scrolling through every not training account\n            StringBuilder builder = new StringBuilder();\n            builder.Append(accountsNotTraining.Count == 1\n                ? $\"{(EveMonClient.ESIKeys.Count == 1 ? \"The account\" : \"One of the accounts\")} is not in training\"\n                : \"Some of the accounts are not in training.\");\n\n            foreach (ESIKey esiKey in accountsNotTraining)\n            {\n                builder.AppendLine().Append($\"ESI key : {esiKey}\");\n            }\n\n            message = builder.ToString();\n            return true;\n        }\n\n        #endregion\n\n\n        #region Importation / Exportation\n        \n        /// <summary>\n        /// Updates the characters list with the given CCP data.\n        /// </summary>\n        /// <param name=\"tokenInfo\">The ESI token info from CCP.</param>\n        private void ImportIdentities(EsiAPITokenInfo tokenInfo)\n        {\n            var chars = EveMonClient.CharacterIdentities.Where(id => id.ESIKeys.Contains(this));\n            long charID = tokenInfo.CharacterID;\n            // Clear the API key on this character\n            foreach (CharacterIdentity id in chars)\n                id.ESIKeys.Remove(this);\n\n            // Find characters who own this ESI key\n            // Can match at most one character\n            CharacterIdentity cid = EveMonClient.CharacterIdentities[charID] ??\n                EveMonClient.CharacterIdentities.Add(charID, tokenInfo.CharacterName);\n            // Add the ESI key to the identity\n            cid.ESIKeys.Add(this);\n            if (cid.CCPCharacter != null)\n                // Notify subscribers\n                EveMonClient.OnCharacterUpdated(cid.CCPCharacter);\n\n            // Fires the event regarding the character list update\n            EveMonClient.OnCharacterListUpdated(this);\n            EveMonClient.OnESIKeyCollectionChanged();\n        }\n\n        /// <summary>\n        /// Exports the data to a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        internal SerializableESIKey Export()\n        {\n            SerializableESIKey serial = new SerializableESIKey\n            {\n                ID = ID,\n                RefreshToken = RefreshToken,\n                AccessMask = AccessMask,\n                Monitored = m_monitored,\n            };\n\n            return serial;\n        }\n\n        #endregion\n\n\n        #region Update Methods\n\n        /// <summary>\n        /// Asynchronously updates this ESI key through a <see cref=\"ESIKeyCreationEventArgs\"/>.\n        /// </summary>\n        /// <param name=\"accessResponse\">The access and refresh token.</param>\n        /// <param name=\"callback\">A callback invoked on the UI thread (whatever the result, success or failure)</param>\n        /// <returns></returns>\n        public void TryUpdateAsync(AccessResponse accessResponse, EventHandler<ESIKeyCreationEventArgs> callback)\n        {\n            TryAddOrUpdateAsync(ID, accessResponse, callback);\n        }\n\n        /// <summary>\n        /// Updates the ESI key.\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"ESIKeyCreationEventArgs\" /> instance containing the event data.</param>\n        /// <exception cref=\"System.ArgumentNullException\">e</exception>\n        public void Update(ESIKeyCreationEventArgs e)\n        {\n            e.ThrowIfNull(nameof(e));\n\n            RefreshToken = e.RefreshToken;\n            AccessMask = e.AccessMask;\n            // Throw out old access token\n            AccessToken = string.Empty;\n            m_keyExpires = DateTime.MinValue;\n            CheckAccessToken();\n\n            // Clear the ESI key for the currently associated identities\n            foreach (CharacterIdentity id in EveMonClient.CharacterIdentities.Where(id => id.ESIKeys.Contains(this)))\n                id.ESIKeys.Remove(this);\n\n            // Assign this API key to the new identities and create CCP characters\n            var cid = e.Identity;\n            cid.ESIKeys.Add(this);\n\n            // Retrieves the ccp character and create one if none\n            if (cid.CCPCharacter != null)\n                // Notify subscribers\n                EveMonClient.OnCharacterUpdated(cid.CCPCharacter);\n            else\n                EveMonClient.Characters.Add(new CCPCharacter(cid));\n        }\n\n        #endregion\n\n\n        #region Overridden Methods\n\n        public override bool Equals(object obj)\n        {\n            var other = obj as ESIKey;\n            return other != null && other.ID == ID;\n        }\n\n        public override int GetHashCode()\n        {\n            return (int)(ID & 0x7FFFFFFFL);\n        }\n\n        /// <summary>\n        /// Gets a string representation of this API key, under the given format : 123456 (John Doe, Jane Doe).\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            // If no characters on this API key, return only the API key ID\n            if (!CharacterIdentities.Any())\n                return ID.ToString(CultureConstants.DefaultCulture);\n\n            // Otherwise, return the chars' names into parenthesis\n            StringBuilder names = new StringBuilder();\n            foreach (CharacterIdentity id in CharacterIdentities)\n            {\n                names.Append(id.CharacterName);\n                if (id != CharacterIdentities.Last())\n                    names.Append(\", \");\n            }\n            return $\"{ID} ({names})\";\n        }\n\n        #endregion\n\n\n        #region Helper Class\n\n\n        #region Nested type: ResponseState\n\n        private enum ResponseState\n        {\n            Unknown,\n            InError,\n            Training,\n            NotTraining\n        }\n\n        #endregion\n\n\n        #region Nested type: SkillInTrainingResponse\n\n        private class SkillInTrainingResponse\n        {\n            /// <summary>\n            /// Initializes a new instance of the <see cref=\"SkillInTrainingResponse\"/> class.\n            /// </summary>\n            public SkillInTrainingResponse()\n            {\n                State = ResponseState.Unknown;\n            }\n\n            /// <summary>\n            /// Gets or sets the state.\n            /// </summary>\n            /// <value>The state.</value>\n            public ResponseState State { get; set; }\n        }\n\n        #endregion\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/ESIMethod.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Models.Extended;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Serializable class for an ESI method and its path. Each APIConfiguration maintains a list of APIMethodsEnum.\n    /// </summary>\n    public class ESIMethod\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"method\"></param>\n        /// <param name=\"path\"></param>\n        private ESIMethod(Enum method, string path)\n        {\n            Method = method;\n            Path = path;\n        }\n\n        /// <summary>\n        /// Returns the APIMethodsEnum enumeration member for this APIMethod.\n        /// </summary>\n        public Enum Method { get; }\n\n        /// <summary>\n        /// Returns the defined URL suffix path for this APIMethod.\n        /// </summary>\n        public string Path { get; set; }\n\n        /// <summary>\n        /// Creates a set of API methods with their default urls.\n        /// </summary>\n        /// <returns></returns>\n        public static IEnumerable<ESIMethod> CreateDefaultSet() =>\n            ESIMethods.Methods.Where(method => method.ToString() != \"None\").Select(methodName =>\n                new\n                {\n                    methodName,\n                    methodURL = NetworkConstants.ResourceManager.GetString($\"ESI{methodName}\")\n                }).Where(method => method.methodURL != null)\n                .Select(method => new ESIMethod(method.methodName, method.methodURL));\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/EmploymentRecord.cs",
    "content": "using EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Service;\nusing System;\nusing System.Drawing;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class EmploymentRecord\n    {\n        public event EventHandler EmploymentRecordImageUpdated;\n\n\n        #region Fields\n\n        private readonly Character m_character;\n        private readonly long m_corporationId;\n\n        private string m_corporationName;\n        private Image m_image;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public EmploymentRecord(Character character, SerializableEmploymentHistoryListItem src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            m_character = character;\n            m_corporationId = src.CorporationID;\n            m_corporationName = string.IsNullOrWhiteSpace(src.CorporationName)\n                ? EveIDToName.GetIDToName(src.CorporationID) : src.CorporationName;\n            StartDate = src.StartDate;\n        }\n\n        /// <summary>\n        /// Constructor from the settings.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public EmploymentRecord(Character character, SerializableEmploymentHistory src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            m_character = character;\n            m_corporationId = src.CorporationID;\n            m_corporationName = src.CorporationName;\n            StartDate = src.StartDate;\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the name of the corporation.\n        /// </summary>\n        /// <value>The name of the corporation.</value>\n        public string CorporationName => m_corporationName.IsEmptyOrUnknown() ?\n            (m_corporationName = EveIDToName.GetIDToName(m_corporationId)) : m_corporationName;\n\n        /// <summary>\n        /// Gets or sets the start date.\n        /// </summary>\n        /// <value>The start date.</value>\n        public DateTime StartDate { get; }\n\n        /// <summary>\n        /// Gets the corporation image.\n        /// </summary>\n        /// <value>The corporation image.</value>\n        public Image CorporationImage\n        {\n            get\n            {\n                if (m_image != null)\n                    return m_image;\n\n                GetImageAsync().ConfigureAwait(false);\n\n                return m_image ?? (m_image = Properties.Resources.DefaultCorporationImage32);\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the corporation image.\n        /// </summary>\n        private async Task GetImageAsync()\n        {\n            Uri uri = ImageHelper.GetCorporationImageURL(m_corporationId);\n            Image img = await ImageService.GetImageAsync(uri).ConfigureAwait(false);\n            if (img != null)\n            {\n                m_image = img;\n                EmploymentRecordImageUpdated?.ThreadSafeInvoke(this, EventArgs.Empty);\n            }\n        }\n\n        #endregion\n\n\n        #region Export Method\n\n        /// <summary>\n        /// Exports the given object to a serialization object.\n        /// </summary>\n        public SerializableEmploymentHistory Export()\n        {\n            SerializableEmploymentHistory serial = new SerializableEmploymentHistory\n            {\n                CorporationID = m_corporationId,\n                CorporationName = CorporationName,\n                StartDate = StartDate\n            };\n            return serial;\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/EveFactionWar.cs",
    "content": "using System;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Models\n{\n    public class EveFactionWar\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveFactionWar\"/> class.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        internal EveFactionWar(SerializableEveFactionWarsListItem src)\n        {\n            FactionID = src.FactionID;\n            FactionName = src.FactionName;\n            AgainstID = src.AgainstID;\n            AgainstName = src.AgainstName;\n            PrimeAgainstID = SetPrimeEnemy(src.FactionID);\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        public int PrimeAgainstID { get; }\n\n        /// <summary>\n        /// Gets or sets the faction ID.\n        /// </summary>\n        public int FactionID { get; }\n\n        /// <summary>\n        /// Gets or sets the name of the faction.\n        /// </summary>\n        public string FactionName { get; }\n\n        /// <summary>\n        /// Gets or sets the against ID.\n        /// </summary>\n        public int AgainstID { get; }\n\n        /// <summary>\n        /// Gets or sets the name of the against.\n        /// </summary>\n        public string AgainstName { get; }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Sets the prime enemy of a faction.\n        /// </summary>\n        /// <param name=\"factionID\"></param>\n        private static int SetPrimeEnemy(int factionID)\n        {\n            switch (factionID)\n            {\n                case DBConstants.AmarrFactionID:\n                    return DBConstants.MinmatarFactionID;\n                case DBConstants.CaldariFactionID:\n                    return DBConstants.GallenteFactionID;\n                case DBConstants.GallenteFactionID:\n                    return DBConstants.CaldariFactionID;\n                case DBConstants.MinmatarFactionID:\n                    return DBConstants.AmarrFactionID;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/EveFactionWarfareStats.cs",
    "content": "using EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Models\n{\n    public class EveFactionWarfareStats\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveFactionWarfareStats\"/> class.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        internal EveFactionWarfareStats(SerializableEveFactionalWarfareStatsListItem src)\n        {\n            FactionID = src.FactionID;\n            FactionName = src.FactionName;\n            Pilots = src.Pilots;\n            SystemsControlled = src.SystemsControlled;\n            KillsYesterday = src.KillsYesterday;\n            KillsLastWeek = src.KillsLastWeek;\n            KillsTotal = src.KillsTotal;\n            VictoryPointsYesterday = src.VictoryPointsYesterday;\n            VictoryPointsLastWeek = src.VictoryPointsLastWeek;\n            VictoryPointsTotal = src.VictoryPointsTotal;\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the faction ID.\n        /// </summary>\n        public int FactionID { get; }\n\n        /// <summary>\n        /// Gets or sets the name of the faction.\n        /// </summary>\n        public string FactionName { get; set; }\n\n        /// <summary>\n        /// Gets or sets the pilots.\n        /// </summary>\n        public int Pilots { get; }\n\n        /// <summary>\n        /// Gets or sets the systems controlled.\n        /// </summary>\n        public int SystemsControlled { get; }\n\n        /// <summary>\n        /// Gets or sets the kills yesterday.\n        /// </summary>\n        public int KillsYesterday { get; }\n\n        /// <summary>\n        /// Gets or sets the kills last week.\n        /// </summary>\n        public int KillsLastWeek { get; }\n\n        /// <summary>\n        /// Gets or sets the kills total.\n        /// </summary>\n        public int KillsTotal { get; }\n\n        /// <summary>\n        /// Gets or sets the victory points yesterday.\n        /// </summary>\n        public int VictoryPointsYesterday { get; }\n\n        /// <summary>\n        /// Gets or sets the victory points last week.\n        /// </summary>\n        public int VictoryPointsLastWeek { get; }\n\n        /// <summary>\n        /// Gets or sets the victory points total.\n        /// </summary>\n        public int VictoryPointsTotal { get; }\n\n        #endregion\n\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/EveFactionalWarfareStats.cs",
    "content": "﻿using EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Models.Collections;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Service;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents the factional warfare statistics of the EVE universe.\n    /// </summary>\n    public static class EveFactionalWarfareStats\n    {\n        #region Fields\n\n        private static readonly EveFactionWarfareStatsCollection s_eveFactionalWarfareStats =\n            new EveFactionWarfareStatsCollection();\n\n        private static readonly EveFactionWarsCollection s_eveFactionWars = new EveFactionWarsCollection();\n        private const string Filename = \"FacWarStats\";\n\n        private static bool s_isImporting;\n        private static bool s_loaded;\n        private static bool s_queryPending;\n        private static ResponseParams s_statsResponse = null;\n        private static ResponseParams s_warsResponse = null;\n\n        private static int s_totalsKillsYesterday;\n        private static int s_totalsKillsLastWeek;\n        private static int s_totalsKillsTotal;\n        private static int s_totalsVictoryPointsYesterday;\n        private static int s_totalsVictoryPointsLastWeek;\n        private static int s_totalsVictoryPointsTotal;\n        private static DateTime s_nextCheckTime = DateTime.MinValue;\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the totals kills yesterday.\n        /// </summary>\n        public static int TotalsKillsYesterday\n        {\n            get\n            {\n                // Ensure list importation\n                EnsureImportation();\n\n                return s_isImporting ? 0 : s_totalsKillsYesterday;\n            }\n        }\n\n        /// <summary>\n        /// Gets the totals kills last week.\n        /// </summary>\n        public static int TotalsKillsLastWeek\n        {\n            get\n            {\n                // Ensure list importation\n                EnsureImportation();\n\n                return s_isImporting ? 0 : s_totalsKillsLastWeek;\n            }\n        }\n\n        /// <summary>\n        /// Gets the totals kills total.\n        /// </summary>\n        public static int TotalsKillsTotal\n        {\n            get\n            {\n                // Ensure list importation\n                EnsureImportation();\n\n                return s_isImporting ? 0 : s_totalsKillsTotal;\n            }\n        }\n\n        /// <summary>\n        /// Gets the totals victory points yesterday.\n        /// </summary>\n        public static int TotalsVictoryPointsYesterday\n        {\n            get\n            {\n                // Ensure list importation\n                EnsureImportation();\n\n                return s_isImporting ? 0 : s_totalsVictoryPointsYesterday;\n            }\n        }\n\n        /// <summary>\n        /// Gets the totals victory points last week.\n        /// </summary>\n        public static int TotalsVictoryPointsLastWeek\n        {\n            get\n            {\n                // Ensure list importation\n                EnsureImportation();\n\n                return s_isImporting ? 0 : s_totalsVictoryPointsLastWeek;\n            }\n        }\n\n        /// <summary>\n        /// Gets the totals victory points total.\n        /// </summary>\n        public static int TotalsVictoryPointsTotal\n        {\n            get\n            {\n                // Ensure list importation\n                EnsureImportation();\n\n                return s_isImporting ? 0 : s_totalsVictoryPointsTotal;\n            }\n        }\n\n        /// <summary>\n        /// Gets the factional warfare stats.\n        /// </summary>\n        public static IEnumerable<EveFactionWarfareStats> FactionalWarfareStats\n        {\n            get\n            {\n                // Ensure list importation\n                EnsureImportation();\n\n                return s_isImporting\n                    ? Enumerable.Empty<EveFactionWarfareStats>()\n                    : s_eveFactionalWarfareStats;\n            }\n        }\n\n        #endregion\n\n\n        #region File Updating\n\n        /// <summary>\n        /// Downloads the faction warfare statistics.\n        /// </summary>\n        private static void UpdateList()\n        {\n            var now = DateTime.UtcNow;\n\n            // Quit if the data is fresh\n            if ((!s_loaded || now > s_nextCheckTime) && !s_queryPending && !EsiErrors.\n                IsErrorCountExceeded)\n            {\n                // If the request fails, it will only be retried after the next minute\n                s_nextCheckTime = now.AddMinutes(1.0);\n                s_queryPending = true;\n\n                EveMonClient.APIProviders.CurrentProvider.QueryEsi<EsiAPIEveFactionWars>(\n                    ESIAPIGenericMethods.FactionWars, OnFactionWarsUpdated, new ESIParams(\n                    s_warsResponse));\n            }\n        }\n\n        /// <summary>\n        /// Processes the faction war list.\n        /// </summary>\n        private static void OnFactionWarsUpdated(EsiResult<EsiAPIEveFactionWars> result,\n            object ignore)\n        {\n            s_warsResponse = result.Response;\n            if (result.HasError)\n            {\n                // Was there an error ?\n                s_queryPending = false;\n                EveMonClient.Notifications.NotifyEveFactionWarsError(result);\n            }\n            if (EsiErrors.IsErrorCountExceeded)\n            {\n                s_queryPending = false;\n                // If error count is exceeded (success or fail), retry when it resets\n                s_nextCheckTime = EsiErrors.ErrorCountResetTime;\n            }\n            else if (!result.HasError)\n            {\n                // Stage two request for factional warfare stats\n                EveMonClient.Notifications.InvalidateAPIError();\n                EveMonClient.APIProviders.CurrentProvider.QueryEsi\n                    <EsiAPIEveFactionalWarfareStats>(ESIAPIGenericMethods.\n                    EVEFactionalWarfareStats, OnWarStatsUpdated, new ESIParams(\n                    s_statsResponse), result.HasData ? result.Result : null);\n            }\n        }\n\n        /// <summary>\n        /// Processes the faction war statistics list.\n        /// </summary>\n        private static void OnWarStatsUpdated(EsiResult<EsiAPIEveFactionalWarfareStats> result,\n            object wars)\n        {\n            var factionWars = wars as EsiAPIEveFactionWars;\n            s_statsResponse = result.Response;\n            // Was there an error ?\n            if (result.HasError)\n            {\n                s_queryPending = false;\n                EveMonClient.Notifications.NotifyEveFactionalWarfareStatsError(result);\n            }\n            else\n            {\n                // Set the next update to be after downtime\n                s_nextCheckTime = DateTime.Today.AddHours(EveConstants.DowntimeHour).\n                    AddMinutes(EveConstants.DowntimeDuration);\n                s_queryPending = false;\n                EveMonClient.Notifications.InvalidateAPIError();\n                if (result.HasData)\n                {\n                    var fwStats = result.Result.ToXMLItem(factionWars);\n                    Import(fwStats);\n                    EveMonClient.OnEveFactionalWarfareStatsUpdated();\n                    // Save the file to our cache\n                    LocalXmlCache.SaveAsync(Filename, Util.SerializeToXmlDocument(fwStats)).\n                        ConfigureAwait(false);\n                }\n            }\n        }\n\n        #endregion\n\n\n        #region Importation\n\n        /// <summary>\n        /// Ensures the list has been imported.\n        /// </summary>\n        private static void EnsureImportation()\n        {\n            UpdateList();\n            Import();\n        }\n\n        /// <summary>\n        /// Deserialize the file and import the stats.\n        /// </summary>\n        private static void Import()\n        {\n            // Exit if we have already imported or are in the process of importing the list\n            if (!s_loaded && !s_queryPending && !s_isImporting)\n            {\n                var result = LocalXmlCache.Load<SerializableAPIEveFactionalWarfareStats>(\n                    Filename, true);\n                if (result == null)\n                    s_nextCheckTime = DateTime.UtcNow;\n                else\n                    // Deserialize the result\n                    Import(result);\n            }\n        }\n\n        /// <summary>\n        /// Import the query result list.\n        /// </summary>\n        private static void Import(SerializableAPIEveFactionalWarfareStats src)\n        {\n            s_isImporting = true;\n\n            s_totalsKillsYesterday = src.Totals.KillsYesterday;\n            s_totalsKillsLastWeek = src.Totals.KillsLastWeek;\n            s_totalsKillsTotal = src.Totals.KillsTotal;\n            s_totalsVictoryPointsYesterday = src.Totals.VictoryPointsYesterday;\n            s_totalsVictoryPointsLastWeek = src.Totals.VictoryPointsLastWeek;\n            s_totalsVictoryPointsTotal = src.Totals.VictoryPointsTotal;\n\n            s_eveFactionalWarfareStats.Import(src.FactionalWarfareStats);\n            s_eveFactionWars.Import(src.FactionWars);\n\n            s_loaded = true;\n            s_isImporting = false;\n        }\n\n        #endregion\n\n\n        #region Public Finders\n\n        /// <summary>\n        /// Gets the against faction IDs.\n        /// </summary>\n        /// <param name=\"factionID\">The faction ID.</param>\n        /// <returns></returns>\n        public static IEnumerable<int> GetAgainstFactionIDs(long factionID)\n        {\n            // Ensure list importation\n            EnsureImportation();\n\n            if (s_isImporting)\n                return Enumerable.Empty<int>();\n\n            List<int> againstIDs = new List<int>();\n            foreach (EveFactionWar factionWar in s_eveFactionWars.Where(faction => faction.FactionID == factionID))\n            {\n                if (factionWar.AgainstID == factionWar.PrimeAgainstID)\n                {\n                    againstIDs.Insert(0, factionWar.AgainstID);\n                    continue;\n                }\n                againstIDs.Add(factionWar.AgainstID);\n            }\n            return againstIDs;\n        }\n\n        /// <summary>\n        /// Gets the factional warfare stats for faction.\n        /// </summary>\n        /// <param name=\"factionID\">The faction ID.</param>\n        /// <returns></returns>\n        public static EveFactionWarfareStats GetFactionalWarfareStatsForFaction(int factionID)\n        {\n            // Ensure list importation\n            EnsureImportation();\n\n            return s_isImporting\n                ? null\n                : s_eveFactionalWarfareStats.FirstOrDefault(factionStats => factionStats.FactionID == factionID);\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/EveMailBody.cs",
    "content": "using EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class EveMailBody\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveMailBody\"/> class.\n        /// </summary>\n        /// <param name=\"src\">The SRC.</param>\n        internal EveMailBody(long id, EsiAPIMailBody src)\n        {\n            MessageID = id;\n            BodyText = src.Body;\n        }\n\n        /// <summary>\n        /// Gets or sets the message ID.\n        /// </summary>\n        /// <value>The message ID.</value>\n        public long MessageID { get; }\n\n        /// <summary>\n        /// Gets or sets the body text.\n        /// </summary>\n        /// <value>The body text.</value>\n        public string BodyText { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/EveMailMessage.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Net;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class EveMailMessage : IEveMessage\n    {\n        // Returned if the message somehow has no sender, since returning an empty list throws\n        private static readonly string[] NO_SENDER = { \"\" };\n\n        private readonly SerializableMailMessagesListItem m_source;\n        private readonly CCPCharacter m_ccpCharacter;\n\n        private ResponseParams m_bodyResponse;\n        private bool m_queryPending;\n        private string m_senderName;\n        private IEnumerable<string> m_toMailingLists;\n        private IEnumerable<string> m_toCharacters;\n        private string m_toCorpOrAlliance;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"ccpCharacter\"></param>\n        /// <param name=\"src\"></param>\n        internal EveMailMessage(CCPCharacter ccpCharacter, SerializableMailMessagesListItem src)\n        {\n            if (ccpCharacter == null)\n                throw new ArgumentNullException(\"ccpCharacter\");\n\n            m_ccpCharacter = ccpCharacter;\n            m_source = src;\n            m_bodyResponse = null;\n\n            long senderID = src.SenderID;\n            State = (senderID != ccpCharacter.CharacterID) ? EveMailState.Inbox :\n                EveMailState.SentItem;\n            MessageID = src.MessageID;\n            SentDate = src.SentDate;\n            Title = src.Title.HtmlDecode();\n\n            // Was it sent from a mailing list?\n            if (src.ToListID.Contains(senderID))\n                m_senderName = ccpCharacter.EVEMailingLists.FirstOrDefault(x => x.ID ==\n                    senderID)?.Name ?? EveMonConstants.UnknownText;\n            else if (senderID == 0L)\n                m_senderName = EveMonConstants.UnknownText;\n            else\n                m_senderName = EveIDToName.GetIDToName(senderID);\n            m_toCharacters = GetIDsToNames(src.ToCharacterIDs);\n            m_toMailingLists = GetMailingListIDsToNames(src.ToListID);\n            m_toCorpOrAlliance = EveIDToName.GetIDToName(src.ToCorpOrAllianceID);\n\n            EVEMailBody = new EveMailBody(0L, new EsiAPIMailBody() { Body = \"\" });\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets the EVE mail state.\n        /// </summary>\n        /// <value>The state.</value>\n        public EveMailState State { get; }\n\n        /// <summary>\n        /// Gets or sets the EVE mail message ID.\n        /// </summary>\n        /// <value>The message ID.</value>\n        public long MessageID { get; }\n\n        /// <summary>\n        /// Gets or sets the EVE mail sender name.\n        /// </summary>\n        /// <value>The sender.</value>\n        public string SenderName => m_senderName.IsEmptyOrUnknown() ? (m_senderName =\n            EveIDToName.GetIDToName(m_source.SenderID)) : m_senderName;\n\n        /// <summary>\n        /// Gets or sets the sent date of the EVE mail.\n        /// </summary>\n        /// <value>The sent date.</value>\n        public DateTime SentDate { get; }\n\n        /// <summary>\n        /// Gets or sets the EVE mail title.\n        /// </summary>\n        /// <value>The title.</value>\n        public string Title { get; }\n\n        /// <summary>\n        /// Gets or sets the EVE mail recipient (corp/alliance).\n        /// \n        /// If it did not parse in the first place, m_toCorpOrAlliance != EveMonConstants.UnknownText,\n        /// so this parse cannot fail\n        /// </summary>\n        public string ToCorpOrAlliance => m_toCorpOrAlliance.IsEmptyOrUnknown() ?\n            (m_toCorpOrAlliance = EveIDToName.GetIDToName(m_source.ToCorpOrAllianceID)) :\n            m_toCorpOrAlliance;\n\n        /// <summary>\n        /// Gets or sets the EVE mail recipient(s) (characters).\n        /// </summary>\n        public IEnumerable<string> ToCharacters => m_toCharacters.Contains(EveMonConstants.UnknownText)\n            ? m_toCharacters = GetIDsToNames(m_source.ToCharacterIDs) : m_toCharacters;\n\n        /// <summary>\n        /// Gets or sets the EVE mail recipient (mailing lists).\n        /// </summary>\n        public IEnumerable<string> ToMailingLists => m_toMailingLists.Contains(EveMonConstants.UnknownText)\n            ? m_toMailingLists = GetMailingListIDsToNames(m_source.ToListID) : m_toMailingLists;\n\n        /// <summary>\n        /// Gets the recipient.\n        /// </summary>\n        /// <returns></returns>\n        public IEnumerable<string> Recipient => !string.IsNullOrEmpty(ToCharacters.FirstOrDefault())\n            ? ToCharacters : (!string.IsNullOrEmpty(ToCorpOrAlliance) ? new List<string>\n            {\n                ToCorpOrAlliance\n            } : (!string.IsNullOrEmpty(ToMailingLists.FirstOrDefault()) ? ToMailingLists :\n            Enumerable.Empty<string>()));\n\n        /// <summary>\n        /// Gets or sets the EVE mail body.\n        /// </summary>\n        /// <value>The EVE mail body.</value>\n        public EveMailBody EVEMailBody { get; private set; }\n\n        /// <summary>\n        /// Gets the EVE mail body text.\n        /// </summary>\n        /// <value>The text.</value>\n        public string Text => EVEMailBody.BodyText.Normalize();\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the names of the IDs.\n        /// </summary>\n        /// <param name=\"src\">A list of IDs.</param>\n        /// <returns>A list of names</returns>\n        private IEnumerable<string> GetIDsToNames(ICollection<long> src)\n        {\n            // If there are no IDs to query return an empty list\n            if (!src.Any())\n                return NO_SENDER;\n            \n            return EveIDToName.GetIDsToNames(src).Select(x => x ?? EveMonConstants.UnknownText);\n        }\n\n        /// <summary>\n        /// Gets the mailing list IDs to names.\n        /// </summary>\n        /// <param name=\"mailingListIDs\">The mailing list IDs.</param>\n        /// <returns></returns>\n        private IEnumerable<string> GetMailingListIDsToNames(ICollection<long> mailingListIDs)\n        {\n            // If there are no IDs to query return a list with an empty entry\n            if (!mailingListIDs.Any())\n                return NO_SENDER;\n\n            List<string> listOfNames = mailingListIDs.Select(listID => m_ccpCharacter.\n                EVEMailingLists.FirstOrDefault(x => x.ID == listID)).Select(mailingList =>\n                mailingList?.Name ?? EveMonConstants.UnknownText).ToList();\n            // In case the list returned from the API is empty, add an \"Unknown\" entry\n            if (!listOfNames.Any())\n                listOfNames.Add(EveMonConstants.UnknownText);\n            return listOfNames;\n        }\n\n        #endregion\n\n\n        #region Querying\n\n        /// <summary>\n        /// Gets the EVE mail body.\n        /// </summary>\n        public void GetMailBody()\n        {\n            // Exit if we are already trying to download the mail message body text\n            if (!m_queryPending && !EsiErrors.IsErrorCountExceeded)\n            {\n                var apiKey = m_ccpCharacter.Identity.FindAPIKeyWithAccess(\n                    ESIAPICharacterMethods.MailBodies);\n                m_queryPending = true;\n                if (apiKey != null)\n                    EveMonClient.APIProviders.CurrentProvider.QueryEsi<EsiAPIMailBody>(\n                        ESIAPICharacterMethods.MailBodies, OnEVEMailBodyDownloaded,\n                        new ESIParams(m_bodyResponse, apiKey.AccessToken)\n                        {\n                            ParamOne = m_ccpCharacter.CharacterID,\n                            ParamTwo = MessageID\n                        }, MessageID);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried EVE mail message mail body.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private void OnEVEMailBodyDownloaded(EsiResult<EsiAPIMailBody> result, object forMessage)\n        {\n            long messageID = (forMessage as long?) ?? 0L;\n            m_queryPending = false;\n            m_bodyResponse = result.Response;\n            // Notify if an error occured\n            if (m_ccpCharacter.ShouldNotifyError(result, ESIAPICharacterMethods.MailBodies))\n                EveMonClient.Notifications.NotifyEVEMailBodiesError(m_ccpCharacter, result);\n            if (result.HasData && !result.HasError && messageID != 0L && !string.IsNullOrEmpty(\n                result.Result.Body))\n            {\n                EVEMailBody = new EveMailBody(messageID, result.Result);\n                EveMonClient.OnCharacterEVEMailBodyDownloaded(m_ccpCharacter);\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/EveMailingList.cs",
    "content": "﻿using EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class EveMailingList\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveMailingList\"/> class.\n        /// </summary>\n        /// <param name=\"src\">The SRC.</param>\n        internal EveMailingList(EsiMailingListsListItem src)\n        {\n            ID = src.ID;\n            Name = src.DisplayName;\n        }\n\n        /// <summary>\n        /// Gets the ID.\n        /// </summary>\n        /// <value>\n        /// The ID.\n        /// </value>\n        internal long ID { get; }\n\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        /// <value>\n        /// The name.\n        /// </value>\n        internal string Name { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/EveNotification.cs",
    "content": "﻿using EVEMon.Common.Constants;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Service;\nusing System;\nusing System.Collections.Generic;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class EveNotification : IEveMessage\n    {\n        private readonly long m_senderID;\n\n        private string m_senderName;\n        private string m_title;\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"ccpCharacter\">The CCP character.</param>\n        /// <param name=\"src\">The source.</param>\n        internal EveNotification(CCPCharacter ccpCharacter, EsiNotificationsListItem src)\n        {\n            string typeCode = src.Type;\n            CCPCharacter = ccpCharacter;\n            NotificationID = src.NotificationID;\n            TypeID = EveNotificationType.GetID(typeCode);\n            TypeName = EveNotificationType.GetName(TypeID);\n            m_senderID = src.SenderID;\n            m_title = string.Empty;\n            m_senderName = (m_senderID == 0L) ? \"EVE System\" : EveIDToName.GetIDToName(m_senderID);\n            SentDate = src.SentDate;\n            Recipient = new List<string> { ccpCharacter.Name };\n            EVENotificationText = new EveNotificationText(this, TypeID, src.NotificationText);\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the CCP character.\n        /// </summary>\n        /// <value>\n        /// The CCP character.\n        /// </value>\n        public CCPCharacter CCPCharacter { get; }\n\n        /// <summary>\n        /// Gets the EVE notification ID.\n        /// </summary>\n        /// <value>The notification ID.</value>\n        public long NotificationID { get; }\n\n        /// <summary>\n        /// Gets the EVE notification type.\n        /// </summary>\n        /// <value>The type.</value>\n        public int TypeID { get; }\n\n        /// <summary>\n        /// Gets the EVE notification type name.\n        /// </summary>\n        /// <value>The type name.</value>\n        public string TypeName { get; }\n\n        /// <summary>\n        /// Gets the EVE notification sender name. If the ID was zero, it was already\n        /// prepopulated with \"EVE System\" so it will never be unknowntext.\n        /// </summary>\n        public string SenderName => m_senderName.IsEmptyOrUnknown() ?\n            (m_senderName = EveIDToName.GetIDToName(m_senderID)) : m_senderName;\n\n        /// <summary>\n        /// Gets the sent date of the EVE notification.\n        /// </summary>\n        /// <value>The sent date.</value>\n        public DateTime SentDate { get; }\n\n        /// <summary>\n        /// Gets the EVE notification recipient.\n        /// </summary>\n        /// <value>The recipient.</value>\n        public IEnumerable<string> Recipient { get; }\n\n        /// <summary>\n        /// Gets the EVE notification text.\n        /// </summary>\n        /// <value>The EVE notification text.</value>\n        public EveNotificationText EVENotificationText { get; private set; }\n\n        /// <summary>\n        /// Gets the EVE notification title.\n        /// </summary>\n        /// <value>The title.</value>\n        public string Title\n        {\n            get\n            {\n                int type = TypeID;\n                if (string.IsNullOrWhiteSpace(m_title) || m_title.Contains(EveMonConstants.\n                    UnknownText))\n                {\n                    // Determine subject layout, if applicable\n                    string subjectLayout = EveNotificationType.GetSubjectLayout(type);\n                    m_title = string.IsNullOrWhiteSpace(subjectLayout) ? EveNotificationType.\n                        GetName(type) : EVENotificationText.Parse(subjectLayout);\n                    // If the title was not properly parsed, leave it blank\n                    if (m_title.Contains(\"{\") || m_title == EVENotificationText.\n                            NotificationText)\n                        m_title = EveMonConstants.UnknownText;\n                }\n                return m_title;\n            }\n        }\n\n        /// <summary>\n        /// Gets the EVE notification text.\n        /// </summary>\n        /// <value>The text.</value>\n        public string Text => EVENotificationText.ParsedText;\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/EveNotificationText.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models.Extended;\nusing EVEMon.Common.Service;\nusing YamlDotNet.RepresentationModel;\nusing EVEMon.Common.Constants;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class EveNotificationText\n    {\n        // Regular expression used for matching YAML placeholders\n        private static readonly Regex PLACEHOLDER = new Regex(\"{(?<placeholder>\\\\w+)}\",\n            RegexOptions.Compiled | RegexOptions.IgnoreCase);\n        // Field used to encode the sender name\n        private static readonly string SENDER_NAME = \"senderName\";\n\n        /// <summary>\n        /// Converts a YAML node to a key-value dictionary, where the keys are the node names\n        /// and the values are the node contents.\n        /// </summary>\n        /// <param name=\"pairs\">The YAML nodes to convert</param>\n        /// <returns>The nodes in a dictionary form</returns>\n        private static Dictionary<string, string> GetNodes(YamlMappingNode pairs) => pairs.\n            Children.ToDictionary(pair => pair.Key.ToString(), pair => pair.Value.ToString());\n\n        private readonly EveNotification m_notification;\n        private readonly EveNotificationTextParser m_parser;\n        private string m_parsedText;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveNotificationText\" /> class.\n        /// </summary>\n        /// <param name=\"notification\">The notification.</param>\n        /// <param name=\"typeID\">The notification type ID.</param>\n        /// <param name=\"text\">The notification text.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public EveNotificationText(EveNotification notification, int typeID, string text)\n        {\n            NotificationID = typeID;\n            NotificationText = text;\n            m_notification = notification;\n            m_parser = EveNotificationTextParser.GetParser();\n        }\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the notification ID.\n        /// </summary>\n        /// <value>The notification ID.</value>\n        public long NotificationID { get; }\n\n        /// <summary>\n        /// Gets the notification text.\n        /// </summary>\n        /// <value>\n        /// The notification text.\n        /// </value>\n        internal string NotificationText { get; }\n\n        /// <summary>\n        /// Gets or sets the notification text.\n        /// </summary>\n        /// <value>The notification text.</value>\n        internal string ParsedText => m_parsedText = (string.IsNullOrEmpty(m_parsedText) ||\n            m_parsedText.Contains(EveMonConstants.UnknownText)) ? Parse(\n            EveNotificationType.GetTextLayout(m_notification.TypeID)).NewLinesToBreakLines().\n            DecodeUnicodeCharacters().Normalize() : m_parsedText;\n\n        #endregion\n\n\n        /// <summary>\n        /// Parses the specified notification text.\n        /// </summary>\n        /// <param name=\"textLayout\">The text layout.</param>\n        /// <returns></returns>\n        internal string Parse(string textLayout = null)\n        {\n            string text = NotificationText;\n            if (!string.IsNullOrWhiteSpace(textLayout))\n            {\n                if (!textLayout.Contains(\"{\") || NotificationID == 0)\n                    // If nothing to substitute, leave it alone\n                    text = textLayout;\n                else\n                {\n                    var pairs = Util.ParseYaml(NotificationText) as YamlMappingNode;\n                    if (pairs != null)\n                    {\n                        // Substitute the {} placeholders with YAML text\n                        var parsedDict = GetParsedDictionary(textLayout, pairs);\n                        foreach (var pair in pairs)\n                            m_parser.Parse(m_notification, pair, parsedDict);\n                        string parsedText = parsedDict.Aggregate(textLayout, (current, pair) =>\n                            current.Replace(\"{\" + pair.Key + \"}\", pair.Value.Trim('\\'')));\n                        text = parsedText.Contains(\"{\") ? NotificationText : parsedText;\n                    }\n                }\n            }\n            return text;\n        }\n\n        /// <summary>\n        /// Gets the parsed dictionary.\n        /// </summary>\n        /// <param name=\"textLayout\">The text layout.</param>\n        /// <param name=\"pairs\">The text pairs.</param>\n        /// <returns></returns>\n        private IDictionary<string, string> GetParsedDictionary(string textLayout,\n            YamlMappingNode pairs)\n        {\n            var parsedDict = GetNodes(pairs);\n            var textLayoutDict = PLACEHOLDER.Matches(textLayout).Cast<Match>().Select(x =>\n                x.Groups[\"placeholder\"].Value).ToDictionary(key => key, value => string.Empty);\n            parsedDict.AddRange(textLayoutDict.Keys.Except(parsedDict.Keys).ToDictionary(\n                key => key, value => string.Empty));\n            // Fill in the sender name\n            if (parsedDict.ContainsKey(SENDER_NAME) && string.IsNullOrWhiteSpace(parsedDict[\n                    SENDER_NAME]))\n                parsedDict[SENDER_NAME] = m_notification.SenderName;\n            return parsedDict;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/EveServer.cs",
    "content": "using System;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.QueryMonitor;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents the status of a server\n    /// </summary>\n    public sealed class EveServer\n    {\n        private int m_users;\n        private ServerStatus m_status;\n        private readonly QueryMonitor<EsiAPIServerStatus> m_serverStatusMonitor;\n        private DateTime m_serverDateTime = DateTime.UtcNow;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        internal EveServer()\n        {\n            m_status = ServerStatus.Online;\n\n            m_serverStatusMonitor = new QueryMonitor<EsiAPIServerStatus>(ESIAPIGenericMethods.ServerStatus,\n                 OnServerStatusMonitorUpdated) { Enabled = true };\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n        }\n\n        /// <summary>\n        /// Gets the server's name.\n        /// </summary>\n        private static string Name => EveMonClient.APIProviders.CurrentProvider.Url.Host !=\n            APIProvider.TestProvider.Url.Host ? \"Tranquility\" : \"Singularity\";\n\n        /// <summary>\n        /// Gets the server status message.\n        /// </summary>\n        public string StatusText\n        {\n            get\n            {\n                switch (m_status)\n                {\n                    case ServerStatus.Online:\n                        return $\"{Name} Server Online ({m_users:N0} Pilots)\";\n                    case ServerStatus.Offline:\n                        return $\"{Name} Server Offline\";\n                    case ServerStatus.CheckDisabled:\n                        return $\"{Name} Server Status Check Disabled\";\n                    default:\n                        return $\"{Name} Server Status Unknown\";\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets the server date time.\n        /// </summary>\n        public DateTime ServerDateTime => m_serverDateTime;\n\n        /// <summary>\n        /// Forces an update of the server status.\n        /// </summary>\n        public void ForceUpdate()\n        {\n            ((IQueryMonitorEx)m_serverStatusMonitor).ForceUpdate();\n        }\n\n        /// <summary>\n        /// Occurs when CCP returns new data.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnServerStatusMonitorUpdated(EsiResult<EsiAPIServerStatus> result)\n        {\n            ServerStatus lastStatus = m_status;\n            DateTime? serverTime = result.CurrentTime;\n            // Update the server date and time (in case of ESI server failure, use local UTC\n            // time)\n            m_serverDateTime = (serverTime != null && serverTime != DateTime.MinValue) ?\n                (DateTime)serverTime : DateTime.UtcNow;\n            if (result.HasError)\n            {\n                m_status = ServerStatus.Unknown;\n                EveMonClient.Notifications.NotifyServerStatusError(result);\n                EveMonClient.OnServerStatusUpdated(this, lastStatus, m_status);\n            }\n            else\n            {\n                // Invalidate ESI error notifications\n                EveMonClient.Notifications.InvalidateAPIError();\n                if (result.HasData)\n                {\n                    // Update status and users\n                    m_users = result.Result.Players;\n                    m_status = (m_users < 1 || result.Result.VIP) ? ServerStatus.Offline :\n                        ServerStatus.Online;\n                    // Notify subscribers about update\n                    EveMonClient.OnServerStatusUpdated(this, lastStatus, m_status);\n                }\n                // Send a notification if the server went up/down\n                if (lastStatus != m_status)\n                    EveMonClient.Notifications.NotifyServerStatusChanged(Name, m_status);\n                else\n                    EveMonClient.Notifications.InvalidateServerStatusChange();\n            }\n        }\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            m_serverDateTime = m_serverDateTime.AddSeconds(1);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Extended/ESIMethods.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Models.Extended\n{\n    public static class ESIMethods\n    {\n        private static readonly List<Enum> s_items = new List<Enum>();\n\n        /// <summary>\n        /// Initializes this instance.\n        /// </summary>\n        internal static void Initialize()\n        {\n            s_items.AddRange(EnumExtensions.GetValues<ESIAPIGenericMethods>().Cast<Enum>());\n            s_items.AddRange(EnumExtensions.GetValues<ESIAPICharacterMethods>().Cast<Enum>());\n            s_items.AddRange(EnumExtensions.GetValues<ESIAPICorporationMethods>().Cast<Enum>());\n        }\n\n        /// <summary>\n        /// Gets the methods.\n        /// </summary>\n        /// <value>The methods.</value>\n        public static IEnumerable<Enum> Methods => s_items;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Extended/EveNotificationTextParser.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Service;\nusing YamlDotNet.RepresentationModel;\n\nnamespace EVEMon.Common.Models.Extended\n{\n    public abstract class EveNotificationTextParser\n    {\n        public static event EventHandler<EventArgs> NotificationTextParserUpdated;\n        \n        private static EveNotificationTextParser s_parser;\n        private static DateTime s_cachedUntil;\n        private static bool s_queryPending;\n\n        /// <summary>\n        /// Parses the notification text.\n        /// </summary>\n        /// <param name=\"notification\">The notification.</param>\n        /// <param name=\"pair\">The pair.</param>\n        /// <param name=\"parsedDict\">The parsed dictionary.</param>\n        public abstract void Parse(EveNotification notification, KeyValuePair<YamlNode, YamlNode> pair,\n            IDictionary<string, string> parsedDict);\n\n        /// <summary>\n        /// Gets the parser.\n        /// </summary>\n        /// <returns></returns>\n        internal static EveNotificationTextParser GetParser()\n        {\n            if (s_parser != null && s_cachedUntil > DateTime.UtcNow)\n                return s_parser;\n\n            // GetExternalParserAsync();\n            // The external parser is very out of date\n            return (s_parser = new InternalEveNotificationTextParser());\n        }\n\n        /// <summary>\n        /// Asynchronously gets the external parser.\n        /// </summary>\n        private static void GetExternalParserAsync()\n        {\n            if (s_queryPending)\n                return;\n\n            Uri url = new Uri(NetworkConstants.BitBucketWikiBase + NetworkConstants.\n                ExternalEveNotificationTextParser);\n\n            s_queryPending = true;\n            HttpWebClientService.DownloadStringAsync(url).ContinueWith(task =>\n            {\n                OnDownloaded(task.Result);\n            });\n        }\n\n        /// <summary>\n        /// Processes the queried notification text parser.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private static void OnDownloaded(DownloadResult<string> result)\n        {\n            if (result.Error != null)\n            {\n                // Reset query pending flag\n                s_queryPending = false;\n\n                EveMonClient.Trace(result.Error.Message);\n                return;\n            }\n            \n            string[] referenceAssemblies =\n            {\n                typeof(Enumerable).Assembly.Location,\n                typeof(YamlNode).Assembly.Location,\n            };\n\n            // Revert to internal parser if the compilation fails for any reason\n            s_parser = CodeCompiler.GenerateAssembly<EveNotificationTextParser>(\n                referenceAssemblies, result.Result) ?? new InternalEveNotificationTextParser();\n\n            // Reset query pending flag\n            // after we compiled the parser\n            s_queryPending = false;\n            s_cachedUntil = DateTime.UtcNow.AddHours(12);\n\n            // Notify the subscribers\n            NotificationTextParserUpdated?.ThreadSafeInvoke(null, EventArgs.Empty);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Extended/InternalEveNotificationTextParser.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Service;\nusing YamlDotNet.RepresentationModel;\n\nnamespace EVEMon.Common.Models.Extended\n{\n    /// <summary>\n    /// A class for the internal parser of the EVE notification text.\n    /// </summary>\n    /// <remarks>\n    /// This class is called when the fetching of the external parser fails for any reason.\n    /// </remarks>\n    internal class InternalEveNotificationTextParser : EveNotificationTextParser\n    {\n        /// <summary>\n        /// Parses the implant list from a lost clone.\n        /// </summary>\n        /// <param name=\"typeIDs\">The type IDs of lost implants</param>\n        /// <returns>A string representation of the implants</returns>\n        private static string BuildImplantList(YamlSequenceNode typeIDs)\n        {\n            string implants;\n            if (!typeIDs.Any())\n                implants = \"None were in the clone\";\n            else\n            {\n                int type;\n                var sb = new StringBuilder(256);\n                // Add all valid implants to the string\n                foreach (var typeID in typeIDs)\n                    if (typeID.ToString().TryParseInv(out type))\n                        sb.AppendLine().AppendLine(\"Type: \" + StaticItems.GetItemName(type));\n                implants = sb.ToString();\n            }\n            return implants;\n        }\n\n        /// <summary>\n        /// Parses the item list from a delivery. The format is an array of 2-element arrays,\n        /// where element 0 is the quantity and element 1 is the type ID.\n        /// </summary>\n        /// <param name=\"typeIDs\">The type IDs and quantities of delivered items</param>\n        /// <returns></returns>\n        private static string BuildItemList(YamlSequenceNode typeIDs)\n        {\n            string items;\n            if (!typeIDs.Any())\n                items = \"No items were delivered\";\n            else\n            {\n                int type, qty;\n                var sb = new StringBuilder(512);\n                // Add all valid types to the string\n                foreach (var typeAndQty in typeIDs)\n                {\n                    // Convert to array, proceed only if successful and has 2 elements\n                    var array = (typeAndQty as YamlSequenceNode)?.Children;\n                    if (array?.Count == 2 && array[0].ToString().TryParseInv(out qty) &&\n                            qty > 0 && array[1].ToString().TryParseInv(out type) && type > 0)\n                        sb.AppendLine(string.Format(\"{0}x {1}\", qty.ToNumericString(0),\n                            StaticItems.GetItemName(type)));\n                }\n                items = sb.ToString();\n            }\n            return items;\n        }\n\n        /// <summary>\n        /// Parses the notification text.\n        /// </summary>\n        /// <param name=\"notification\">The notification.</param>\n        /// <param name=\"pair\">The pair.</param>\n        /// <param name=\"parsedDict\">The parsed dictionary.</param>\n        public override void Parse(EveNotification notification, KeyValuePair<YamlNode,\n            YamlNode> pair, IDictionary<string, string> parsedDict)\n        {\n            string key = pair.Key.ToString(), value = pair.Value.ToString();\n            long valueAsLong;\n            decimal amount;\n            double valueAsDouble;\n            int typeID = notification.TypeID;\n            DateTime timestamp = notification.SentDate;\n            YamlSequenceNode typeIDs;\n            // The value is often used as an int64 in the list below, simplify calculation\n            if (!value.TryParseInv(out valueAsLong))\n                valueAsLong = 0L;\n            switch (key.ToUpperInvariant())\n            {\n            case \"CHARID\":\n            case \"SENDERCHARID\":\n            case \"RECEIVERCHARID\":\n            case \"OWNERID\":\n            case \"LOCATIONOWNERID\":\n            case \"DESTROYERID\":\n            case \"INVOKINGCHARID\":\n            case \"PODKILLERID\":\n            case \"NEWCEOID\":\n            case \"OLDCEOID\":\n            case \"CORPID\":\n            case \"VICTIMID\":\n            case \"DECLAREDBYID\":\n            case \"AGAINSTID\":\n            case \"CREDITORID\":\n            case \"FACTIONID\":\n            case \"DEFENDERID\":\n            case \"ENEMYID\":\n            case \"AGGRESSORID\":\n            case \"ALLYID\":\n            case \"MERCID\":\n            case \"AGGRESSORCORPID\":\n            case \"AGGRESSORALLIANCEID\":\n                parsedDict[key] = EveIDToName.GetIDToName(valueAsLong);\n                break;\n            case \"CLONESTATIONID\":\n            case \"CORPSTATIONID\":\n            case \"LOCATIONID\":\n            case \"STRUCTUREID\":\n            case \"EXTERNALID2\":\n                parsedDict[key] = EveIDToStation.GetIDToStation(valueAsLong)?.Name ??\n                    EveMonConstants.UnknownText;\n                break;\n            case \"SOLARSYSTEMID\":\n                // If it overflows the result will be invalid anyways\n                parsedDict[key] = StaticGeography.GetSolarSystemName((int)valueAsLong);\n                break;\n            case \"SHIPTYPEID\":\n            case \"TYPEID\":\n            case \"STRUCTURETYPEID\":\n            case \"VICTIMSHIPTYPEID\":\n                // If it overflows the result will be invalid anyways\n                parsedDict[key] = StaticItems.GetItemName((int)valueAsLong);\n                break;\n            case \"MEDALID\":\n                var medal = notification.CCPCharacter.CharacterMedals.FirstOrDefault(x =>\n                    (x.ID.ToString() == value));\n                parsedDict[key] = medal?.Title ?? EveMonConstants.UnknownText;\n                parsedDict.Add(\"medalDescription\", medal?.Description ??\n                    EveMonConstants.UnknownText);\n                break;\n            case \"AMOUNT\":\n            case \"ISKVALUE\":\n                // Format as ISK amount\n                if (value.TryParseInv(out amount))\n                    parsedDict[key] = amount.ToString(\"N2\");\n                break;\n            case \"ENDDATE\":\n            case \"STARTDATE\":\n            case \"DECLOAKTIME\":\n            case \"DESTRUCTTIME\":\n            case \"TIMEFINISHED\":\n                parsedDict[key] = string.Format(CultureConstants.InvariantCulture,\n                    \"{0:dddd, MMMM d, yyyy HH:mm} (EVE Time)\", valueAsLong.\n                    WinTimeStampToDateTime());\n                break;\n            case \"NOTIFICATION_CREATED\":\n                parsedDict[key] = string.Format(CultureConstants.InvariantCulture,\n                    \"{0:dddd, MMMM d, yyyy HH:mm} (EVE Time)\", timestamp);\n                break;\n            case \"DUEDATE\":\n            case \"ISSUEDATE\":\n                parsedDict[key] = string.Format(CultureConstants.InvariantCulture,\n                    \"{0:dddd, MMMM d, yyyy} (EVE Time)\", valueAsLong.WinTimeStampToDateTime());\n                break;\n            case \"CAMPAIGNEVENTTYPE\":\n                switch (value)\n                {\n                case \"1\":\n                    parsedDict[key] = \"Territorial Claim Unit\";\n                    break;\n                case \"2\":\n                    parsedDict[key] = \"Infrastructure Hub\";\n                    break;\n                case \"3\":\n                    parsedDict[key] = \"Station\";\n                    break;\n                default:\n                    parsedDict[key] = EveMonConstants.UnknownText;\n                    break;\n                }\n                break;\n            case \"TYPEIDS\":\n                typeIDs = pair.Value as YamlSequenceNode;\n                if (typeIDs != null && (typeID == 56 || typeID == 57))\n                    parsedDict[key] = BuildImplantList(typeIDs);\n                break;\n            case \"LISTOFTYPESANDQTY\":\n                typeIDs = pair.Value as YamlSequenceNode;\n                if (typeIDs != null)\n                    parsedDict[key] = BuildItemList(typeIDs);\n                break;\n            case \"ISHOUSEWARMINGGIFT\":\n                // Tritanium\n                parsedDict[key] = StaticItems.GetItemName(typeID);\n                break;\n            case \"LEVEL\":\n                if (value.TryParseInv(out valueAsDouble))\n                    parsedDict[key] = Standing.Status(valueAsDouble) + \" Standing\";\n                break;\n            case \"SHIELDVALUE\":\n            case \"ARMORVALUE\":\n            case \"HULLVALUE\":\n                if (value.TryParseInv(out valueAsDouble))\n                    parsedDict[key] = (valueAsDouble * 100.0).ToString(\"N0\");\n                break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/FactionalWarfareStats.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class FactionalWarfareStats\n    {\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        internal FactionalWarfareStats(EsiAPIFactionalWarfareStats src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            FactionID = src.FactionID;\n            FactionName = EveIDToName.GetIDToName(FactionID);\n            EnlistedDate = src.EnlistedDate;\n            CurrentRank = src.CurrentRank;\n            HighestRank = src.HighestRank;\n            KillsYesterday = src.Kills?.Yesterday ?? 0;\n            KillsLastWeek = src.Kills?.LastWeek ?? 0;\n            KillsTotal = src.Kills?.Total ?? 0;\n            VictoryPointsYesterday = src.VictoryPoints?.Yesterday ?? 0;\n            VictoryPointsLastWeek = src.VictoryPoints?.LastWeek ?? 0;\n            VictoryPointsTotal = src.VictoryPoints?.Total ?? 0;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the faction ID.\n        /// </summary>\n        public int FactionID { get; }\n\n        /// <summary>\n        /// Gets the name of the faction.\n        /// </summary>\n        public string FactionName { get; }\n\n        /// <summary>\n        /// Gets the enlisted date.\n        /// </summary>\n        public DateTime EnlistedDate { get; }\n\n        /// <summary>\n        /// Gets the current rank.\n        /// </summary>\n        public int CurrentRank { get; }\n\n        /// <summary>\n        /// Gets the highest rank.\n        /// </summary>\n        public int HighestRank { get; }\n\n        /// <summary>\n        /// Gets the kills yesterday.\n        /// </summary>\n        public int KillsYesterday { get; }\n\n        /// <summary>\n        /// Gets the kills last week.\n        /// </summary>\n        public int KillsLastWeek { get; }\n\n        /// <summary>\n        /// Gets the kills total.\n        /// </summary>\n        public int KillsTotal { get; }\n\n        /// <summary>\n        /// Gets the victory points yesterday.\n        /// </summary>\n        public int VictoryPointsYesterday { get; }\n\n        /// <summary>\n        /// Gets the victory points last week.\n        /// </summary>\n        public int VictoryPointsLastWeek { get; }\n\n        /// <summary>\n        /// Gets the victory points total.\n        /// </summary>\n        public int VictoryPointsTotal { get; }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/ImplantSet.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.Constants;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents one of the implant sets this character have (one per clone).\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class ImplantSet : ReadonlyVirtualCollection<Implant>\n    {\n        private string m_name;\n        private readonly Character m_owner;\n        private readonly Implant[] m_values;\n        private const int SlotNumbers = 10;\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        /// <param name=\"owner\"></param>\n        /// <param name=\"name\"></param>\n        internal ImplantSet(Character owner, string name)\n        {\n            SetName(name);\n            m_owner = owner;\n\n            m_values = new Implant[SlotNumbers];\n            for (int i = 0; i < SlotNumbers; i++)\n            {\n                m_values[i] = new Implant((ImplantSlots)i);\n            }\n        }\n\n        /// <summary>\n        /// Gets the set's name.\n        /// </summary>\n        public string Name\n        {\n            get { return m_name; }\n            set\n            {\n                if (m_name == value)\n                    return;\n\n                m_name = value;\n\n                EveMonClient.OnCharacterUpdated(m_owner);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the implant for the given slot.\n        /// </summary>\n        /// <param name=\"slot\">The slot for the implant to retrieve</param>\n        /// <returns>The requested implant when found; null otherwise.</returns>\n        private Implant this[ImplantSlots slot]\n        {\n            get { return slot == ImplantSlots.None ? new Implant(slot) : m_values[(int)slot]; }\n            set\n            {\n                if (slot == ImplantSlots.None)\n                    throw new InvalidOperationException(\"Cannot assign 'none' slot\");\n\n                if (value != null && value.Slot != slot)\n                    throw new InvalidOperationException(\"Slot mismatch\");\n\n                m_values[(int)slot] = value ?? new Implant(slot);\n\n                EveMonClient.OnCharacterUpdated(m_owner);\n            }\n        }\n\n        /// <summary>\n        /// Gets / sets the implant for the given slot.\n        /// </summary>\n        /// <param name=\"attrib\">The attribute for the implant to retrieve</param>\n        /// <returns>The requested implant when found; null otherwise.</returns>\n        public Implant this[EveAttribute attrib]\n        {\n            get { return this[Implant.AttribToSlot(attrib)]; }\n            set { this[Implant.AttribToSlot(attrib)] = value; }\n        }\n\n        /// <summary>\n        /// Core method on which everything else relies.\n        /// </summary>\n        /// <returns></returns>\n        protected override IEnumerable<Implant> Enumerate() => m_values;\n\n        /// <summary>\n        /// Generates a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        internal SerializableSettingsImplantSet Export() => new SerializableSettingsImplantSet\n        {\n            Intelligence = Export(ImplantSlots.Intelligence),\n            Perception = Export(ImplantSlots.Perception),\n            Willpower = Export(ImplantSlots.Willpower),\n            Charisma = Export(ImplantSlots.Charisma),\n            Memory = Export(ImplantSlots.Memory),\n            Slot6 = Export(ImplantSlots.Slot6),\n            Slot7 = Export(ImplantSlots.Slot7),\n            Slot8 = Export(ImplantSlots.Slot8),\n            Slot9 = Export(ImplantSlots.Slot9),\n            Slot10 = Export(ImplantSlots.Slot10),\n            Name = m_name\n        };\n\n        /// <summary>\n        /// Exports an implant as a serialization object.\n        /// </summary>\n        /// <param name=\"slot\"></param>\n        /// <returns></returns>\n        private string Export(ImplantSlots slot) => m_values[(int)slot].Name;\n\n        /// <summary>\n        /// Imports data from a settings serialization object.\n        /// </summary>\n        /// <param name=\"serial\"></param>\n        internal void Import(SerializableSettingsImplantSet serial)\n        {\n            SetName(serial.Name);\n            Import(ImplantSlots.Intelligence, serial.Intelligence);\n            Import(ImplantSlots.Perception, serial.Perception);\n            Import(ImplantSlots.Willpower, serial.Willpower);\n            Import(ImplantSlots.Charisma, serial.Charisma);\n            Import(ImplantSlots.Memory, serial.Memory);\n            Import(ImplantSlots.Slot6, serial.Slot6);\n            Import(ImplantSlots.Slot7, serial.Slot7);\n            Import(ImplantSlots.Slot8, serial.Slot8);\n            Import(ImplantSlots.Slot9, serial.Slot9);\n            Import(ImplantSlots.Slot10, serial.Slot10);\n        }\n\n        /// <summary>\n        /// Updates the given slot with the provided serialization object.\n        /// </summary>\n        /// <param name=\"slot\"></param>\n        /// <param name=\"name\"></param>\n        private void Import(ImplantSlots slot, string name)\n        {\n            // Backwards compatibility for older versions\n            name = name.Replace(\"<\", string.Empty).Replace(\">\", string.Empty);\n\n            m_values[(int)slot] = StaticItems.GetImplants(slot)[name] ?? new Implant(slot);\n        }\n\n        /// <summary>\n        /// Imports data from an API serialization object.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        internal void Import(IEnumerable<SerializableNewImplant> src)\n        {\n            for (int i = 0; i < SlotNumbers; i++)\n            {\n                m_values[i] = StaticItems.GetImplants((ImplantSlots)i).FirstOrDefault(x => src.Any(y => y.ID == x.ID)) ??\n                              new Implant((ImplantSlots)i);\n            }\n        }\n\n        /// <summary>\n        /// Sets the clone name. If it is invalid, it will be replaced with \"Unknown\".\n        /// </summary>\n        /// <param name=\"name\">The clone name.</param>\n        private void SetName(string name)\n        {\n            if (string.IsNullOrEmpty(name))\n                m_name = EveMonConstants.UnknownText;\n            else\n                m_name = name;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/IndustryJob.cs",
    "content": "using EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.Service;\nusing System;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class IndustryJob\n    {\n        #region Static Helpers\n\n        /// <summary>\n        /// Gets the maximum number of active manufacturing jobs allowed by a character's\n        /// skills.\n        /// </summary>\n        /// <param name=\"character\">The character to query.</param>\n        /// <returns>The number of concurrent manufacturing jobs which can be run based on\n        /// the last confirmed skill levels of that character.</returns>\n        public static int MaxManufacturingJobsFor(Character character)\n        {\n            return 1 + character.LastConfirmedSkillLevel(DBConstants.MassProductionSkillID) +\n                character.LastConfirmedSkillLevel(DBConstants.AdvancedMassProductionSkillID);\n        }\n\n        /// <summary>\n        /// Gets the maximum number of active research jobs allowed by a character's skills.\n        /// </summary>\n        /// <param name=\"character\">The character to query.</param>\n        /// <returns>The number of concurrent research jobs which can be run based on the last\n        /// confirmed skill levels of that character.</returns>\n        public static int MaxResearchJobsFor(Character character)\n        {\n            return character.LastConfirmedSkillLevel(DBConstants.LaboratoryOperationSkillID) +\n                1 + character.LastConfirmedSkillLevel(DBConstants.\n                AdvancedLaboratoryOperationSkillID);\n        }\n\n        /// <summary>\n        /// Gets the maximum number of active reaction jobs allowed by a character's skills.\n        /// </summary>\n        /// <param name=\"character\">The character to query.</param>\n        /// <returns>The number of concurrent reaction jobs which can be run based on the last\n        /// confirmed skill levels of that character.</returns>\n        public static int MaxReactionJobsFor(Character character)\n        {\n            return 1 + character.LastConfirmedSkillLevel(DBConstants.MassReactionsSkillID) +\n                character.LastConfirmedSkillLevel(DBConstants.AdvancedMassReactionsSkillID);\n        }\n\n        #endregion\n\n        /// <summary>\n        /// The maximum number of days after job ended. Beyond this limit, we do not import\n        /// jobs anymore.\n        /// </summary>\n        internal const int MaxEndedDays = 7;\n\n        private long m_installedItemLocationID;\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"issuedFor\">Whether this jobs was issued for the corporation or\n        /// character.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        internal IndustryJob(EsiJobListItem src, IssuedFor issuedFor)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            PopulateJobInfo(src, issuedFor);\n            State = GetState(src);\n            LastStateChange = DateTime.UtcNow;\n            ActiveJobState = GetActiveJobState();\n        }\n\n        /// <summary>\n        /// Constructor from an object deserialized from the settings file.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        internal IndustryJob(SerializableJob src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            ID = src.JobID;\n            State = src.State;\n            StartDate = src.StartDate;\n            EndDate = src.EndDate;\n            PauseDate = src.PauseDate;\n            LastStateChange = src.LastStateChange;\n            IssuedFor = src.IssuedFor == IssuedFor.None ? IssuedFor.Character : src.IssuedFor;\n            ActiveJobState = GetActiveJobState();\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets true if we have notified the user.\n        /// </summary>\n        public bool NotificationSend { get; set; }\n\n        /// <summary>\n        /// When true, the job will be deleted unless it was found on the API feed.\n        /// </summary>\n        internal bool MarkedForDeletion { get; set; }\n\n        /// <summary>\n        /// Gets or sets the jobs state.\n        /// </summary>\n        public JobState State { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the active jobs state.\n        /// </summary>\n        public ActiveJobState ActiveJobState { get; set; }\n\n        /// <summary>\n        /// Gets the last state change.\n        /// </summary>\n        public DateTime LastStateChange { get; private set; }\n\n        /// <summary>\n        /// Gets the estimated time to completion.\n        /// </summary>\n        public string TTC\n        {\n            get\n            {\n                if (State == JobState.Paused)\n                    return new DateTime(EndDate.Subtract(PauseDate).Ticks).\n                        ToRemainingTimeDigitalDescription(DateTimeKind.Utc);\n                if (State == JobState.Active && EndDate > DateTime.UtcNow)\n                    return EndDate.ToRemainingTimeDigitalDescription(DateTimeKind.Utc);\n                return string.Empty;\n            }\n        }\n\n        /// <summary>\n        /// Gets the job ID.\n        /// </summary>\n        public long ID { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the installer ID.\n        /// </summary>\n        /// <value>The installer ID.</value>\n        public long InstallerID { get; set; }\n\n        /// <summary>\n        /// Gets the installed item (can only be a blueprint).\n        /// </summary>\n        public Blueprint InstalledItem { get; private set; }\n\n        /// <summary>\n        /// Gets the output item (can be a blueprint or item).\n        /// </summary>\n        public Item OutputItem { get; private set; }\n\n        /// <summary>\n        /// Gets the job runs.\n        /// </summary>\n        public int Runs { get; private set; }\n\n        /// <summary>\n        /// Gets the job runs.\n        /// </summary>\n        public double Cost { get; private set; }\n\n        /// <summary>\n        /// Gets the job runs.\n        /// </summary>\n        public double Probability { get; private set; }\n\n        /// <summary>\n        /// Gets the successful runs.\n        /// </summary>\n        public int SuccessfulRuns { get; private set; }\n\n        /// <summary>\n        /// Gets the job activity.\n        /// </summary>\n        public BlueprintActivity Activity { get; private set; }\n\n        /// <summary>\n        /// Get the blueprint's type.\n        /// </summary>\n        public BlueprintType BlueprintType { get; private set; }\n\n        /// <summary>\n        /// Gets the job installed material efficiency level.\n        /// </summary>\n        public int InstalledME { get; private set; }\n\n        /// <summary>\n        /// Gets the job installed productivity level.\n        /// </summary>\n        public int InstalledTE { get; private set; }\n\n        /// <summary>\n        /// Gets the time the job was installed.\n        /// </summary>\n        public DateTime InstalledTime => StartDate;\n\n        /// <summary>\n        /// Gets the time the job begins.\n        /// </summary>\n        public DateTime StartDate { get; private set; }\n\n        /// <summary>\n        /// Gets the time the job ends.\n        /// </summary>\n        public DateTime EndDate { get; private set; }\n\n        /// <summary>\n        /// Gets the time the job was paused.\n        /// </summary>\n        public DateTime PauseDate { get; private set; }\n\n        /// <summary>\n        /// Gets where this job is installed.\n        /// </summary>\n        public string Installation { get; private set; }\n\n        /// <summary>\n        /// Gets the solar system where this job is located.\n        /// </summary>\n        public SolarSystem SolarSystem { get; private set; }\n\n        /// <summary>\n        /// Gets the job installation full celestrial path.\n        /// </summary>\n        public string FullLocation => $\"{SolarSystem.FullLocation} > {Installation}\";\n\n        /// <summary>\n        /// Gets for which the job was issued.\n        /// </summary>\n        public IssuedFor IssuedFor { get; private set; }\n\n        /// <summary>\n        /// Gets true if the job is active.\n        /// </summary>\n        public bool IsActive => State == JobState.Active;\n\n        /// <summary>\n        /// Checks whether the given API object matches with this job.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <returns></returns>\n        private bool MatchesWith(EsiJobListItem src) => src.JobID == ID;\n\n        /// <summary>\n        /// Checks whether the given API object has been modified.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <returns></returns>\n        private bool IsModified(EsiJobListItem src) => src.EndDate != EndDate ||\n            src.PauseDate != PauseDate;\n\n        #endregion\n\n\n        #region Importation, Exportation\n\n        /// <summary>\n        /// Exports the given object to a serialization object.\n        /// </summary>\n        internal SerializableJob Export() => new SerializableJob\n        {\n            JobID = ID,\n            State = State,\n            StartDate = StartDate,\n            EndDate = EndDate,\n            PauseDate = PauseDate,\n            IssuedFor = IssuedFor,\n            LastStateChange = LastStateChange,\n        };\n\n        /// <summary>\n        /// Try to update this job with a serialization object from the API.\n        /// </summary>\n        /// <param name=\"src\">The serializable source.</param>\n        /// <param name=\"issuedFor\">Whether this jobs was issued for the corporation or\n        /// character.</param>\n        /// <param name=\"character\">The character owning this job.</param>\n        /// <returns>True if import sucessful otherwise, false.</returns>\n        internal bool TryImport(EsiJobListItem src, IssuedFor issuedFor, CCPCharacter character)\n        {\n            bool matches = MatchesWith(src);\n            // Note that, before a match is found, all jobs have been marked for deletion:\n            // m_markedForDeletion == true\n            if (matches)\n            {\n                MarkedForDeletion = false;\n                // Update information (if ID is the same it may have been modified)\n                if (IsModified(src))\n                {\n                    // Job is from a serialized object, so populate the missing info\n                    if (InstalledItem == null)\n                        PopulateJobInfo(src, issuedFor);\n                    else\n                    {\n                        EndDate = src.EndDate;\n                        PauseDate = src.PauseDate;\n                    }\n                    State = (PauseDate == DateTime.MinValue) ? JobState.Active : JobState.\n                        Paused;\n                    ActiveJobState = GetActiveJobState();\n                    LastStateChange = DateTime.UtcNow;\n                }\n                // Job is from a serialized object, so populate the missing info\n                if (InstalledItem == null)\n                    PopulateJobInfo(src, issuedFor, character);\n                var state = GetState(src);\n                if (state != State)\n                {\n                    State = state;\n                    LastStateChange = DateTime.UtcNow;\n                }\n            }\n            return matches;\n        }\n\n        /// <summary>\n        /// Populates the serialization object job with the info from the API.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"issuedFor\">Whether this jobs was issued for the corporation or\n        /// character.</param>\n        /// <param name=\"character\">The character owning this job.</param>\n        private void PopulateJobInfo(EsiJobListItem src, IssuedFor issuedFor,\n            CCPCharacter character = null)\n        {\n            ID = src.JobID;\n            InstallerID = src.InstallerID;\n            InstalledItem = StaticBlueprints.GetBlueprintByID(src.BlueprintTypeID);\n            Runs = src.Runs;\n            Cost = src.Cost;\n            Probability = src.Probability;\n            SuccessfulRuns = src.SuccessfulRuns;\n            StartDate = src.StartDate;\n            EndDate = src.EndDate;\n            PauseDate = src.PauseDate;\n            IssuedFor = issuedFor;\n            m_installedItemLocationID = src.FacilityID;\n\n            UpdateLocation(character);\n            UpdateInstallation(character);\n\n            if (Enum.IsDefined(typeof(BlueprintActivity), src.ActivityID))\n                Activity = (BlueprintActivity)Enum.ToObject(typeof(BlueprintActivity),\n                    src.ActivityID);\n\n            OutputItem = GetOutputItem(src.ProductTypeID);\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the output item by its ID (can be a blueprint or an item).\n        /// </summary>\n        /// <param name=\"id\">The itemID of the blueprint.</param>\n        /// <returns>The output item from the bluperint.</returns>\n        private Item GetOutputItem(int id)\n        {\n            switch (Activity)\n            {\n                case BlueprintActivity.Manufacturing:\n                    return StaticBlueprints.GetBlueprintByID(InstalledItem.ID).ProducesItem ??\n                        StaticItems.GetItemByID(0);\n                case BlueprintActivity.ResearchingMaterialEfficiency:\n                case BlueprintActivity.ResearchingTimeEfficiency:\n                case BlueprintActivity.Copying:\n                    return InstalledItem;\n                case BlueprintActivity.Invention:\n                case BlueprintActivity.ReverseEngineering:\n                    return StaticBlueprints.GetBlueprintByID(id) ?? StaticItems.GetItemByID(0);\n                case BlueprintActivity.SimpleReactions:\n                case BlueprintActivity.Reactions:\n                    return StaticItems.GetItemByID(InstalledItem?.ReactionOutcome?.Item?.ID ?? 0);\n                default:\n                    return StaticItems.GetItemByID(0);\n            }\n        }\n\n        /// <summary>\n        /// Gets the station.\n        /// </summary>\n        /// <param name=\"id\">The ID of the installation.</param>\n        /// <returns>Name of the installation.</returns>\n        private string GetInstallation(long id, CCPCharacter character)\n        {\n            return EveIDToStation.GetIDToStation(id, character)?.Name ?? EveMonConstants.\n                UnknownText;\n        }\n\n        /// <summary>\n        /// Gets the state of a job.\n        /// </summary>\n        /// <param name=\"src\">The serializable source.</param>\n        /// <returns>State of the seriallzable job.</returns>\n        private static JobState GetState(EsiJobListItem src)\n        {\n            switch (src.Status)\n            {\n                // Active States\n                case CCPJobCompletedStatus.Active:\n                    return JobState.Active;\n                // Cancelled States\n                case CCPJobCompletedStatus.Cancelled:\n                    return JobState.Canceled;\n                // Failed States\n                case CCPJobCompletedStatus.Reverted:\n                    return JobState.Failed;\n                // Delivered States\n                case CCPJobCompletedStatus.Delivered:\n                    return JobState.Delivered;\n                // Paused States\n                case CCPJobCompletedStatus.Paused:\n                    return JobState.Paused;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Gets the state of an active job.\n        /// </summary>\n        /// <returns>State of an active job.</returns>\n        private ActiveJobState GetActiveJobState()\n        {\n            if (State != JobState.Active)\n                return ActiveJobState.None;\n\n            if (StartDate > DateTime.UtcNow)\n                return ActiveJobState.Pending;\n\n            return EndDate > DateTime.UtcNow ? ActiveJobState.InProgress : ActiveJobState.Ready;\n        }\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Updates the installation.\n        /// </summary>\n        public void UpdateInstallation(CCPCharacter character)\n        {\n            Installation = GetInstallation(m_installedItemLocationID, character);\n        }\n\n        /// <summary>\n        /// Updates the location.\n        /// </summary>\n        /// <returns></returns>\n        public void UpdateLocation(CCPCharacter character)\n        {\n            // If location not already determined\n            if (m_installedItemLocationID != 0L && (SolarSystem == null || SolarSystem.ID == 0))\n            {\n                var station = EveIDToStation.GetIDToStation(m_installedItemLocationID,\n                    character);\n                SolarSystem = station?.SolarSystem ?? SolarSystem.UNKNOWN;\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/InvalidPlanEntry.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a plan's invalid entry.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class InvalidPlanEntry\n    {\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        public InvalidPlanEntry()\n        {\n            Acknowledged = false;\n        }\n\n        /// <summary>\n        /// Name of the skill that can not be identified.\n        /// </summary>\n        public string SkillName { get; set; }\n\n        /// <summary>\n        /// Planned level.\n        /// </summary>\n        public long PlannedLevel { get; set; }\n\n        /// <summary>\n        /// Has the user been notified that this entry has been marked as invalid.\n        /// </summary>\n        public bool Acknowledged { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/KillLog.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class KillLog : IComparable<KillLog>\n    {\n        /// <summary>\n        /// Occurs when kill log victim ship image updated.\n        /// </summary>\n        public event EventHandler KillLogVictimShipImageUpdated;\n\n\n        #region Fields\n\n        private readonly List<KillLogItem> m_items = new List<KillLogItem>();\n        private Image m_image;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"src\">The source.</param>\n        internal KillLog(Character character, SerializableKillLogListItem src)\n        {\n            Character = character;\n            KillTime = src.KillTime;\n            TimeSinceKill = DateTime.UtcNow.Subtract(src.KillTime);\n            MoonID = src.MoonID;\n            Victim = src.Victim;\n            Attackers = src.Attackers;\n            SolarSystem = StaticGeography.GetSolarSystemByID(src.SolarSystemID);\n\n            m_items.AddRange(src.Items.Select(item => new KillLogItem(item)));\n\n            Group = src.Victim.ID == character.CharacterID ? KillGroup.Losses : KillGroup.Kills;\n\n            UpdateCharacterNames();\n        }\n        \n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the character.\n        /// </summary>\n        /// <value>\n        /// The character.\n        /// </value>\n        public Character Character { get; }\n\n        /// <summary>\n        /// Gets the solar system.\n        /// </summary>\n        public SolarSystem SolarSystem { get; }\n\n        /// <summary>\n        /// Gets the kill time.\n        /// </summary>\n        public DateTime KillTime { get; }\n\n        /// <summary>\n        /// Gets the time since kill.\n        /// </summary>\n        public TimeSpan TimeSinceKill { get; }\n\n        /// <summary>\n        /// Gets the moon ID.\n        /// </summary>\n        public int MoonID { get; }\n\n        /// <summary>\n        /// Gets the victim.\n        /// </summary>\n        public SerializableKillLogVictim Victim { get; }\n\n        /// <summary>\n        /// Gets the attackers.\n        /// </summary>\n        public IEnumerable<SerializableKillLogAttackersListItem> Attackers { get; }\n\n        /// <summary>\n        /// Gets the final blow attacker.\n        /// </summary>\n        public SerializableKillLogAttackersListItem FinalBlowAttacker => Attackers.Single(x => x.FinalBlow);\n\n        /// <summary>\n        /// Gets or sets the group.\n        /// </summary>\n        public KillGroup Group { get; }\n\n        /// <summary>\n        /// Gets the items.\n        /// </summary>\n        public IEnumerable<KillLogItem> Items => m_items;\n\n        /// <summary>\n        /// Gets the victim image.\n        /// </summary>\n        public Image VictimShipImage\n        {\n            get\n            {\n                if (m_image != null)\n                    return m_image;\n\n                GetVictimShipImageAsync().ConfigureAwait(false);\n\n                return m_image ?? (m_image = GetDefaultImage());\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Exports this object to a serializable form.\n        /// </summary>\n        /// <returns>The SerializableKillLogListItem representing this object.</returns>\n        public SerializableKillLogListItem Export()\n        {\n            var exported = new SerializableKillLogListItem()\n            {\n                KillTime = KillTime,\n                MoonID = MoonID,\n                SolarSystemID = SolarSystem?.ID ?? 0,\n                Victim = Victim\n            };\n            // Export items\n            foreach (var item in m_items)\n                exported.Items.Add(item.Export());\n            // Export attackers\n            foreach (var attacker in Attackers)\n                exported.Attackers.Add(attacker);\n            return exported;\n        }\n\n        /// <summary>\n        /// Gets the victim's ship image.\n        /// </summary>\n        private async Task GetVictimShipImageAsync()\n        {\n            Uri uri = ImageHelper.GetTypeImageURL(Victim.ShipTypeID);\n            Image img = await ImageService.GetImageAsync(uri).ConfigureAwait(false);\n            if (img != null) {\n                m_image = img;\n                // Notify the subscriber that we got the image\n                KillLogVictimShipImageUpdated?.ThreadSafeInvoke(this, EventArgs.Empty);\n            }\n        }\n\n        /// <summary>\n        /// Updates the names and corporations/alliances of victims and attackers.\n        /// </summary>\n        public void UpdateCharacterNames()\n        {\n            if (Victim != null)\n            {\n                // Update victim's info\n                Victim.AllianceName = EveIDToName.GetIDToName(Victim.AllianceID);\n                Victim.CorporationName = EveIDToName.GetIDToName(Victim.CorporationID);\n                Victim.FactionName = EveIDToName.GetIDToName(Victim.FactionID);\n                Victim.Name = EveIDToName.GetIDToName(Victim.ID);\n            }\n            if (Attackers != null)\n                foreach (var attacker in Attackers)\n                {\n                    // Update attacker's info\n                    attacker.AllianceName = EveIDToName.GetIDToName(attacker.AllianceID);\n                    attacker.CorporationName = EveIDToName.GetIDToName(attacker.CorporationID);\n                    attacker.FactionName = EveIDToName.GetIDToName(attacker.FactionID);\n                    attacker.Name = EveIDToName.GetIDToName(attacker.ID);\n                }\n        }\n\n        /// <summary>\n        /// Gets the default image.\n        /// </summary>\n        /// <returns></returns>\n        private static Bitmap GetDefaultImage() => new Bitmap(32, 32);\n\n        #endregion\n\n\n        #region Inherited Methods\n\n        public int CompareTo(KillLog other)\n        {\n            // Default order should be recent first\n            return -KillTime.CompareTo(other.KillTime);\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/KillLogItem.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Service;\n\nnamespace EVEMon.Common.Models\n{\n    public class KillLogItem\n    {\n        /// <summary>\n        /// Occurs when kill log item image updated.\n        /// </summary>\n        public event EventHandler KillLogItemImageUpdated;\n\n\n        #region Fields\n\n        private readonly List<KillLogItem> m_items = new List<KillLogItem>();\n        private readonly int m_typeID;\n        private Image m_image;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"KillLogItem\"/> class.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"isInContainer\">if set to <c>true</c> item is in container.</param>\n        internal KillLogItem(SerializableKillLogItemListItem src, bool isInContainer = false)\n        {\n            m_typeID = src.TypeID;\n            EVEFlag = src.EVEFlag;\n            QtyDestroyed = src.QtyDestroyed;\n            QtyDropped = src.QtyDropped;\n            Singleton = src.Singleton;\n            Item = StaticItems.GetItemByID(src.TypeID);\n\n            FittingContentGroup = GetFittingContentGroup();\n            IsInContainer = isInContainer;\n\n            m_items.AddRange(src.Items.Select(item => new KillLogItem(item, true)));\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the EVE flag.\n        /// </summary>\n        public short EVEFlag { get; }\n\n        /// <summary>\n        /// Gets the qty dropped.\n        /// </summary>\n        public int QtyDropped { get; }\n\n        /// <summary>\n        /// Gets the qty destroyed.\n        /// </summary>\n        public int QtyDestroyed { get; }\n\n        /// <summary>\n        /// Gets the singleton.\n        /// </summary>\n        public byte Singleton { get; }\n\n        /// <summary>\n        /// Gets a value indicating whether the item is in a container.\n        /// </summary>\n        public bool IsInContainer { get; }\n\n        /// <summary>\n        /// Gets the fitting content group.\n        /// </summary>\n        public KillLogFittingContentGroup FittingContentGroup { get; }\n\n        /// <summary>\n        /// Gets the items.\n        /// </summary>\n        public IEnumerable<KillLogItem> Items => m_items;\n\n        /// <summary>\n        /// Gets the price.\n        /// </summary>\n        public double Price => Settings.MarketPricer.Pricer != null\n            ? Settings.MarketPricer.Pricer.GetPriceByTypeID(m_typeID)\n            : 0;\n\n        /// <summary>\n        /// Gets the inventory text.\n        /// </summary>\n        public string InventoryText\n        {\n            get\n            {\n                switch (FittingContentGroup)\n                {\n                    case KillLogFittingContentGroup.Implant:\n                    case KillLogFittingContentGroup.DroneBay:\n                    case KillLogFittingContentGroup.Cargo:\n                        return EveFlag.GetFlagText(EVEFlag);\n                    default:\n                        return string.Empty;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        public Item Item { get; }\n\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        public string Name => Item?.Name ?? EveMonConstants.UnknownText;\n\n        /// <summary>\n        /// Gets the victim image.\n        /// </summary>\n        public Image ItemImage\n        {\n            get\n            {\n                if (m_image != null)\n                    return m_image;\n\n                GetItemImageAsync().ConfigureAwait(false);\n\n                return m_image ?? (m_image = GetDefaultImage());\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Exports this object to a serializable form.\n        /// </summary>\n        /// <returns>The SerializableKillLogItemListItem representing this object.</returns>\n        public SerializableKillLogItemListItem Export()\n        {\n            var exported = new SerializableKillLogItemListItem()\n            {\n                EVEFlag = EVEFlag,\n                QtyDestroyed = QtyDestroyed,\n                QtyDropped = QtyDropped,\n                Singleton = Singleton,\n                TypeID = m_typeID\n            };\n            // Recursively export contained items\n            foreach (var item in m_items)\n                exported.Items.Add(item.Export());\n            return exported;\n        }\n\n        /// <summary>\n        /// Gets the fiiting and content group.\n        /// </summary>\n        /// <returns></returns>\n        private KillLogFittingContentGroup GetFittingContentGroup()\n        {\n            switch (EVEFlag)\n            {\n                case 0:\n                    return KillLogFittingContentGroup.Other;\n                case 5:\n                    return KillLogFittingContentGroup.Cargo;\n                case 11:\n                case 12:\n                case 13:\n                case 14:\n                case 15:\n                case 16:\n                case 17:\n                case 18:\n                    return KillLogFittingContentGroup.LowSlot;\n                case 19:\n                case 20:\n                case 21:\n                case 22:\n                case 23:\n                case 24:\n                case 25:\n                case 26:\n                    return KillLogFittingContentGroup.MediumSlot;\n                case 27:\n                case 28:\n                case 29:\n                case 30:\n                case 31:\n                case 32:\n                case 33:\n                case 34:\n                    return KillLogFittingContentGroup.HighSlot;\n                case 87:\n                    return KillLogFittingContentGroup.DroneBay;\n                case 88:\n                    return KillLogFittingContentGroup.Booster;\n                case 89:\n                    return KillLogFittingContentGroup.Implant;\n                case 92:\n                case 93:\n                case 94:\n                case 95:\n                case 96:\n                case 97:\n                case 98:\n                case 99:\n                    return KillLogFittingContentGroup.RigSlot;\n                case 125:\n                case 126:\n                case 127:\n                case 128:\n                case 129:\n                case 130:\n                case 131:\n                case 132:\n                    return KillLogFittingContentGroup.SubsystemSlot;\n                default:\n                    return KillLogFittingContentGroup.None;\n            }\n        }\n\n        /// <summary>\n        /// Gets the item image.\n        /// </summary>\n        private async Task GetItemImageAsync()\n        {\n            Uri uri = ImageHelper.GetTypeImageURL(m_typeID);\n            Image img = await ImageService.GetImageAsync(uri).ConfigureAwait(false);\n            if (img != null) {\n                m_image = img;\n                // Notify the subscriber that we got the image\n                KillLogItemImageUpdated?.ThreadSafeInvoke(this, EventArgs.Empty);\n            }\n        }\n\n        /// <summary>\n        /// Gets the default image.\n        /// </summary>\n        /// <returns></returns>\n        private static Bitmap GetDefaultImage() => new Bitmap(24, 24);\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Loyalty.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Service;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class Loyalty : IComparable<Loyalty>\n    {\n        public event EventHandler LoyaltyCorpImageUpdated;\n\n        #region Fields\n\n        private readonly Character m_character;\n\n        private string m_corporationName;\n        private Image m_image;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <param name=\"src\">The source.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        internal Loyalty(Character character, EsiLoyaltyListItem src)\n        {\n            m_character = character;\n\n            LoyaltyPoints = src.LoyaltyPoints;\n            CorpId = src.CorpID;\n            m_corporationName = EveIDToName.GetIDToName(src.CorpID);\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the name of the corporation.\n        /// </summary>\n        /// <value>The name of the corporation.</value>\n        public string CorporationName => m_corporationName.IsEmptyOrUnknown() ?\n            (m_corporationName = EveIDToName.GetIDToName(CorpId)) : m_corporationName;\n\n        /// <summary>\n        /// Gets or sets the loyalty point value.\n        /// </summary>\n        /// <value>The loyalty point value.</value>\n        public int LoyaltyPoints { get; }\n\n        /// <summary>\n        /// Gets or sets the corp ID.\n        /// </summary>\n        /// <value>The corp ID.</value>\n        public int CorpId { get; }\n\n        /// <summary>\n        /// Gets the corporation image.\n        /// </summary>\n        /// <value>The corporation image.</value>\n        public Image CorporationImage\n        {\n            get\n            {\n                if (m_image != null)\n                    return m_image;\n\n                GetImageAsync().ConfigureAwait(false);\n\n                return m_image ?? (m_image = Properties.Resources.DefaultCorporationImage32);\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the corporation image.\n        /// </summary>\n        private async Task GetImageAsync()\n        {\n            Uri uri = ImageHelper.GetCorporationImageURL(CorpId);\n            Image img = await ImageService.GetImageAsync(uri).ConfigureAwait(false);\n            if (img != null) {\n                m_image = img;\n                LoyaltyCorpImageUpdated?.ThreadSafeInvoke(this, EventArgs.Empty);\n            }\n        }\n\n        public int CompareTo(Loyalty other)\n        {\n            // Descending order of LP earned\n            return other.LoyaltyPoints.CompareTo(LoyaltyPoints);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/MarketOrder.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// A base class for market orders.\n    /// </summary>\n    public abstract class MarketOrder\n    {\n        /// <summary>\n        /// The maximum number of days after expiration. Beyond this limit, we do not import\n        /// orders anymore.\n        /// </summary>\n        public const int MaxExpirationDays = 7;\n\n        private readonly CCPCharacter m_character;\n        private OrderState m_state;\n        private long m_stationID;\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"issuedFor\">Whether the order was issued for a corporation or a\n        /// character.</param>\n        /// <param name=\"character\">The owning character.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        protected MarketOrder(EsiOrderListItem src, IssuedFor issuedFor,\n            CCPCharacter character)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            PopulateOrderInfo(src, issuedFor);\n            LastStateChange = DateTime.UtcNow;\n            m_character = character;\n            m_state = GetState(src);\n        }\n\n        /// <summary>\n        /// Constructor from an object deserialized from the settings file.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"character\">The owning character.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        protected MarketOrder(SerializableOrderBase src, CCPCharacter character)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            ID = src.OrderID;\n            UnitaryPrice = src.UnitaryPrice;\n            RemainingVolume = src.RemainingVolume;\n            Issued = src.Issued;\n            IssuedFor = src.IssuedFor == IssuedFor.None ? IssuedFor.Character : src.IssuedFor;\n            LastStateChange = src.LastStateChange;\n            m_character = character;\n            m_state = src.State;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// When true, the order will be deleted unless it was found on the API feed.\n        /// </summary>\n        internal bool MarkedForDeletion { get; set; }\n\n        /// <summary>\n        /// Gets the order state.\n        /// </summary>\n        public OrderState State\n        {\n            get\n            {\n                if (IsExpired && (m_state == OrderState.Active || m_state == OrderState.Modified))\n                    return OrderState.Expired;\n\n                return m_state;\n            }\n        }\n\n        /// <summary>\n        /// Gets the order ID.\n        /// </summary>\n        public long ID { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the owner ID.\n        /// </summary>\n        /// <value>The owner ID.</value>\n        public long OwnerID { get; internal set; }\n\n        /// <summary>\n        /// Gets the item.\n        /// </summary>\n        public Item Item { get; private set; }\n\n        /// <summary>\n        /// Gets the station where this order is located.\n        /// </summary>\n        public Station Station { get; private set; }\n\n        /// <summary>\n        /// Gets the intial volume.\n        /// </summary>\n        public int InitialVolume { get; private set; }\n\n        /// <summary>\n        /// Gets the remaining volume.\n        /// </summary>\n        public int RemainingVolume { get; private set; }\n\n        /// <summary>\n        /// Gets the minimum sell/buy threshold volume.\n        /// </summary>\n        public int MinVolume { get; private set; }\n\n        /// <summary>\n        /// Gets the duration, in days, of the order.\n        /// </summary>\n        public int Duration { get; private set; }\n\n        /// <summary>\n        /// Gets the unitary price.\n        /// </summary>\n        public decimal UnitaryPrice { get; private set; }\n\n        /// <summary>\n        /// Gets the total price.\n        /// </summary>\n        public decimal TotalPrice => UnitaryPrice * RemainingVolume;\n\n        /// <summary>\n        /// Gets the time (UTC) this order was expired.\n        /// </summary>\n        public DateTime Issued { get; private set; }\n\n        /// <summary>\n        /// Gets for which the order was issued.\n        /// </summary>\n        public IssuedFor IssuedFor { get; private set; }\n\n        /// <summary>\n        /// Gets the estimated expiration time.\n        /// </summary>\n        public DateTime Expiration => Issued.AddDays(Duration);\n\n        /// <summary>\n        /// Gets the last state change.\n        /// </summary>\n        public DateTime LastStateChange { get; private set; }\n\n        /// <summary>\n        /// Gets true if order naturally expired because of its duration.\n        /// </summary>\n        public bool IsExpired => Expiration < DateTime.UtcNow;\n\n        /// <summary>\n        /// Gets true if the order is not fulfilled, canceled, expired, etc.\n        /// </summary>\n        public bool IsAvailable => (m_state == OrderState.Active || m_state == OrderState.Modified) && !IsExpired;\n\n        #endregion\n\n\n        #region Importation, Exportation\n\n        /// <summary>\n        /// Exports the given object to a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        public abstract SerializableOrderBase Export();\n\n        /// <summary>\n        /// Fetches the data to the given source.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        protected SerializableOrderBase Export(SerializableOrderBase src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            src.OrderID = ID;\n            src.State = m_state;\n            src.UnitaryPrice = UnitaryPrice;\n            src.RemainingVolume = RemainingVolume;\n            src.Issued = Issued;\n            src.IssuedFor = IssuedFor;\n            src.LastStateChange = LastStateChange;\n\n            return src;\n        }\n\n        /// <summary>\n        /// Try to update this order with a serialization object from the API.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <param name=\"issuedFor\">Whether the order was issued for a corporation or a\n        /// character.</param>\n        /// <param name=\"endedOrders\"></param>\n        /// <returns></returns>\n        internal bool TryImport(EsiOrderListItem src, IssuedFor issuedFor,\n            ICollection<MarketOrder> endedOrders)\n        {\n            // Note that, before a match is found, all orders have been marked for deletion:\n            // m_markedForDeletion == true\n            // Checks whether ID is the same (IDs can be recycled ?)\n            if (!MatchesWith(src))\n                return false;\n            // Prevent deletion\n            MarkedForDeletion = false;\n            // Update infos (if ID is the same it may have been modified either by the market \n            // or by the user [modify order] so we update the orders info that are changeable)\n            if (IsModified(src))\n            {\n                if (Item != null)\n                {\n                    // If it is a buy order, escrow may have changed\n                    var buyOrder = this as BuyOrder;\n                    if (src.IsBuyOrder && buyOrder != null)\n                        buyOrder.Escrow = src.Escrow;\n                    UnitaryPrice = src.UnitaryPrice;\n                    RemainingVolume = src.RemainingVolume;\n                    Issued = src.Issued;\n                }\n                LastStateChange = DateTime.UtcNow;\n                m_state = OrderState.Modified;\n            }\n            else if (m_state == OrderState.Modified)\n            {\n                LastStateChange = DateTime.UtcNow;\n                m_state = OrderState.Active;\n            }\n            // Order is from a serialized object, so populate the missing info\n            if (Item == null)\n                PopulateOrderInfo(src, issuedFor);\n            OrderState state = GetState(src);\n            if (m_state == OrderState.Modified || state == m_state)\n                return true;\n            // It has either expired or fulfilled\n            m_state = state;\n            LastStateChange = DateTime.UtcNow;\n            // Should we notify it to the user?\n#if false\n            // CCP does not actually report any orders with this status any longer\n            if (state == OrderState.Expired || state == OrderState.Fulfilled)\n                endedOrders.Add(this);\n#endif\n            return true;\n        }\n\n        /// <summary>\n        /// Populates the serialization object order with the info from the API.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"ownerID\">The owner of this order.</param>\n        /// <param name=\"issuedFor\">Whether the order was issued for a corporation or a\n        /// character.</param>\n        private void PopulateOrderInfo(EsiOrderListItem src, IssuedFor issuedFor)\n        {\n            OwnerID = src.IssuedBy;\n            ID = src.OrderID;\n            Item = StaticItems.GetItemByID(src.ItemID);\n            UnitaryPrice = src.UnitaryPrice;\n            InitialVolume = src.InitialVolume;\n            RemainingVolume = src.RemainingVolume;\n            MinVolume = src.MinVolume;\n            Duration = src.Duration;\n            Issued = src.Issued;\n            IssuedFor = issuedFor;\n            m_stationID = src.StationID;\n            UpdateStation();\n\n            var buyOrder = this as BuyOrder;\n            if (src.IsBuyOrder && buyOrder != null)\n            {\n                buyOrder.Escrow = src.Escrow;\n                buyOrder.Range = src.Range;\n            }\n        }\n\n#endregion\n\n\n#region Public Methods\n\n        /// <summary>\n        /// Updates the station.\n        /// </summary>\n        public void UpdateStation()\n        {\n            Station = EveIDToStation.GetIDToStation(m_stationID, m_character);\n        }\n\n#endregion\n\n\n#region Helper Methods\n\n        /// <summary>\n        /// Gets the state of an order.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <returns></returns>\n        private static OrderState GetState(EsiOrderListItem src)\n        {\n            switch ((CCPOrderState)src.State)\n            {\n                case CCPOrderState.Closed:\n                case CCPOrderState.Canceled:\n                case CCPOrderState.CharacterDeleted:\n                    return OrderState.Canceled;\n                case CCPOrderState.Pending:\n                case CCPOrderState.Opened:\n                    return OrderState.Active;\n                case CCPOrderState.ExpiredOrFulfilled:\n                    return src.RemainingVolume == 0 ? OrderState.Fulfilled : OrderState.Expired;\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n\n        /// <summary>\n        /// Checks whether the given API object matches with this order.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <returns></returns>\n        private bool MatchesWith(EsiOrderListItem src) => src.OrderID == ID;\n\n        /// <summary>\n        /// Checks whether the given API object has been modified.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <returns></returns>\n        private bool IsModified(EsiOrderListItem src) => src.RemainingVolume != 0 &&\n            ((src.UnitaryPrice != UnitaryPrice && src.Issued != Issued) || src.\n            RemainingVolume != RemainingVolume);\n\n#endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Medal.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class Medal\n    {\n        #region Fields\n\n        private CCPCharacter m_ccpCharacter;\n\n        private string m_issuer;\n        private string m_corporationName;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"ccpCharacter\">The CCP character.</param>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"group\">The medal group to assign.</param>\n        internal Medal(CCPCharacter ccpCharacter, EsiMedalsListItem src, MedalGroup group)\n        {\n            m_ccpCharacter = ccpCharacter;\n\n            ID = src.MedalID;\n            Reason = src.Reason;\n            Status = src.Status;\n            IssuerID = src.IssuerID;\n            CorporationID = src.CorporationID;\n            Description = src.Description;\n            Title = src.Title;\n            Issued = src.Issued;\n            Group = group;\n\n            m_issuer = EveIDToName.GetIDToName(src.IssuerID);\n            m_corporationName = EveIDToName.GetIDToName(CorporationID);\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the reason.\n        /// </summary>\n        public long ID { get; }\n\n        /// <summary>\n        /// Gets the reason.\n        /// </summary>\n        public string Reason { get; }\n\n        /// <summary>\n        /// Gets the status.\n        /// </summary>\n        public string Status { get; }\n\n        /// <summary>\n        /// Gets the issuer ID.\n        /// </summary>\n        public long IssuerID { get; }\n\n        /// <summary>\n        /// Gets the corporation ID.\n        /// </summary>\n        public long CorporationID { get; }\n\n        /// <summary>\n        /// Gets the description.\n        /// </summary>\n        public string Description { get; private set; }\n\n        /// <summary>\n        /// Gets the title.\n        /// </summary>\n        public string Title { get; private set; }\n\n        /// <summary>\n        /// Gets the issued.\n        /// </summary>\n        public DateTime Issued { get; }\n\n        /// <summary>\n        /// Gets the group.\n        /// </summary>\n        public MedalGroup Group { get; }\n\n        /// <summary>\n        /// Gets or sets the number of times this medal was awarded.\n        /// </summary>\n        public int TimesAwarded { get; set; }\n\n        /// <summary>\n        /// Gets the issuer.\n        /// </summary>\n        public string Issuer => m_issuer.IsEmptyOrUnknown() ? (m_issuer =\n            EveIDToName.GetIDToName(IssuerID)) : m_issuer;\n\n        /// <summary>\n        /// Gets the corporation name.\n        /// </summary>\n        public string CorporationName => m_corporationName.IsEmptyOrUnknown() ?\n            (m_corporationName = EveIDToName.GetIDToName(IssuerID)) : m_corporationName;\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Tries the assign missing title and description.\n        /// </summary>\n        /// <returns></returns>\n        public bool TryAssignMissingTitleAndDescription()\n        {\n            if (!string.IsNullOrEmpty(Title) && !string.IsNullOrEmpty(Description))\n                return true;\n\n            // Find the related medal in the corporation's medals\n            Medal corporationMedal = m_ccpCharacter.CorporationMedals.SingleOrDefault(corpMedal => corpMedal.ID == ID);\n\n            if (corporationMedal == null)\n                return false;\n\n            if (string.IsNullOrEmpty(Title))\n                Title = corporationMedal.Title;\n\n            if (string.IsNullOrEmpty(Description))\n                Description = corporationMedal.Description;\n\n            return true;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Plan.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a character's plan.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class Plan : BasePlan\n    {\n        private int m_changedNotificationSuppressions;\n        private PlanChange m_change;\n        private InvalidPlanEntry[] m_invalidEntries;\n\n\n        #region Construction, importation, exportation\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        public Plan(BaseCharacter character)\n            : base(character)\n        {\n            SortingPreferences = new PlanSorting();\n            m_invalidEntries = new InvalidPlanEntry[0];\n        }\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"serial\"></param>\n        public Plan(BaseCharacter character, SerializablePlan serial)\n            : this(character)\n        {\n            Import(serial);\n        }\n\n        /// <summary>\n        /// Imports data from a serialization object.\n        /// </summary>\n        /// <param name=\"serial\">The serial.</param>\n        /// <exception cref=\"System.ArgumentNullException\">serial</exception>\n        public void Import(SerializablePlan serial)\n        {\n            serial.ThrowIfNull(nameof(serial));\n\n            // Update name\n            Name = serial.Name;\n            Description = serial.Description ?? string.Empty;\n            SortingPreferences = serial.SortingPreferences;\n\n            // Update entries\n            List<PlanEntry> entries = new List<PlanEntry>();\n            List<InvalidPlanEntry> invalidEntries = new List<InvalidPlanEntry>();\n            foreach (SerializablePlanEntry serialEntry in serial.Entries)\n            {\n                PlanEntry entry = new PlanEntry(this, serialEntry);\n\n                // There are buggy entries in the plan\n                if (entry.Skill == null)\n                {\n                    InvalidPlanEntry invalidEntry = new InvalidPlanEntry\n                    {\n                        SkillName = serialEntry.SkillName,\n                        PlannedLevel = serialEntry.Level\n                    };\n\n                    invalidEntries.Add(invalidEntry);\n                    continue;\n                }\n\n                entries.Add(entry);\n            }\n\n            RebuildPlanFrom(entries);\n            FixPrerequisites();\n\n            invalidEntries.AddRange(serial.InvalidEntries.Select(\n                serialInvalidEntry => new InvalidPlanEntry\n                {\n                    SkillName = serialInvalidEntry.SkillName,\n                    PlannedLevel = serialInvalidEntry.PlannedLevel,\n                    Acknowledged = serialInvalidEntry.Acknowledged\n                }));\n\n            m_invalidEntries = invalidEntries.ToArray();\n\n            // Notify name or decription change\n            if (IsConnected)\n                EveMonClient.OnPlanNameChanged(this);\n        }\n\n        /// <summary>\n        /// Generates a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        public SerializablePlan Export()\n        {\n            // Create serialization object\n            SerializablePlan serial = new SerializablePlan\n            {\n                Name = Name,\n                Description = Description,\n                SortingPreferences = SortingPreferences\n            };\n\n            Character character = Character as Character;\n            if (character != null)\n                serial.Owner = character.Guid;\n\n            // Add entries\n            foreach (PlanEntry entry in Items)\n            {\n                SerializablePlanEntry serialEntry = new SerializablePlanEntry\n                {\n                    ID = entry.Skill.ID,\n                    SkillName = entry.Skill.Name,\n                    Level = entry.Level,\n                    Type = entry.Type,\n                    Notes = entry.Notes,\n                    Priority = entry.Priority\n                };\n\n                // Add groups\n                foreach (string group in entry.PlanGroups)\n                {\n                    serialEntry.PlanGroups.Add(group);\n                }\n\n                // Remapping point\n                if (entry.Remapping != null)\n                    serialEntry.Remapping = entry.Remapping.Export();\n\n                serial.Entries.Add(serialEntry);\n            }\n\n            foreach (SerializableInvalidPlanEntry serialEntry in m_invalidEntries.Select(\n                entry => new SerializableInvalidPlanEntry\n                {\n                    SkillName = entry.SkillName,\n                    PlannedLevel = entry.PlannedLevel,\n                    Acknowledged = entry.Acknowledged\n                }))\n            {\n                serial.InvalidEntries.Add(serialEntry);\n            }\n\n            return serial;\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// List of invalid entries in the plan.\n        /// </summary>\n        public IEnumerable<InvalidPlanEntry> InvalidEntries => m_invalidEntries.Where(x => !x.Acknowledged);\n\n        /// <summary>\n        /// Does the plan contain one or more invalid entries.\n        /// </summary>\n        public bool ContainsInvalidEntries => m_invalidEntries.Any(x => !x.Acknowledged);\n\n        /// <summary>\n        /// Gets sorting preferences for this plan.\n        /// Those are only preferences, it does not change the plan.\n        /// </summary>\n        public PlanSorting SortingPreferences { get; private set; }\n\n        #endregion\n\n\n        #region Event firing and suppression\n\n        /// <summary>\n        /// Returns an <see cref=\"IDisposable\"/> object which suspends events notification and will resume them once disposed.\n        /// </summary>\n        /// <remarks>Use the returned object in a <c>using</c> block to ensure the disposal of the object even when exceptions are thrown.</remarks>\n        /// <returns></returns>\n        public override IDisposable SuspendingEvents()\n        {\n            Interlocked.Increment(ref m_changedNotificationSuppressions);\n\n            return new DisposableWithCallback(\n                () =>\n                {\n                    if (Interlocked.Decrement(ref m_changedNotificationSuppressions) == 0 && m_change != PlanChange.None)\n                    {\n                        OnChanged(m_change);\n                    }\n                });\n        }\n\n        /// <summary>\n        /// Notify changes happened in the entries.\n        /// </summary>\n        internal override void OnChanged(PlanChange change)\n        {\n            // Updates and notifications have been suspended\n            if (m_changedNotificationSuppressions > 0)\n            {\n                m_change |= change;\n                return;\n            }\n\n            // Changes are about to be fired\n            change |= m_change;\n            m_change = PlanChange.None;\n\n            // Add missing prerequisites\n            if ((change & PlanChange.Prerequisites) != PlanChange.None)\n                FixPrerequisites();\n\n            // Notify changes\n            if ((change & PlanChange.Notification) != PlanChange.None && IsConnected)\n                EveMonClient.OnPlanChanged(this);\n        }\n\n        #endregion\n\n\n        #region Insertion and removal\n\n        /// <summary>\n        /// Set the planned level to the given one, lowering it if it's higher than the targetted one.\n        /// When the skill is not planned already, the prerequisites are automatically added.\n        /// </summary>\n        /// <param name=\"skill\">The skill we want to plan</param>\n        /// <param name=\"level\">The level we want to train to</param>\n        /// <exception cref=\"System.ArgumentNullException\">skill</exception>\n        public void PlanTo(StaticSkill skill, long level)\n        {\n            skill.ThrowIfNull(nameof(skill));\n\n            PlanTo(skill, level, PlanEntry.DefaultPriority, skill.Name);\n        }\n\n        /// <summary>\n        /// Set the planned level to the given one, lowering it if it's higher than the targetted one.\n        /// When the skill is not planned already, the prerequisites are automatically added.\n        /// Note this method won't remove entries other entries depend of.\n        /// </summary>\n        /// <param name=\"skill\">The skill we want to plan</param>\n        /// <param name=\"level\">The level we want to train to</param>\n        /// <param name=\"priority\">The priority.</param>\n        /// <param name=\"noteForNewEntries\">The reason we want to train this skill</param>\n        public void PlanTo(StaticSkill skill, long level, int priority, string noteForNewEntries)\n        {\n            int plannedLevel = GetPlannedLevel(skill);\n            if (level == plannedLevel)\n                return;\n\n            using (SuspendingEvents())\n            {\n                // We may either have to add or remove entries. First, we assume we have to add ones\n                if (level > plannedLevel)\n                {\n                    List<StaticSkillLevel> skillsToAdd = new List<StaticSkillLevel> { new StaticSkillLevel(skill, level) };\n\n                    // None added ? Then return\n                    IPlanOperation operation = TryAddSet(skillsToAdd, noteForNewEntries);\n                    operation.PerformAddition(priority);\n                }\n                else\n                {\n                    level = Math.Max(level, GetMinimumLevel(skill));\n\n                    // If we reach this point, then we have to remove entries\n                    for (int i = 5; i > level; i--)\n                    {\n                        PlanEntry entry = GetEntry(skill, i);\n                        if (entry == null)\n                            continue;\n\n                        RemoveCore(Items.IndexOf(entry));\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Returns an operation to set the planned level to the given one, lowering it if it's higher than the targetted one.\n        /// The returned object allows an extended control, to automatically remove dependencies and prerequisites.\n        /// </summary>\n        /// <param name=\"skill\">The skill we want to plan</param>\n        /// <param name=\"level\">The level we want to train to</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">skill</exception>\n        public IPlanOperation TryPlanTo(Skill skill, long level)\n        {\n            skill.ThrowIfNull(nameof(skill));\n\n            return TryPlanTo(skill, level, skill.Name);\n        }\n\n        /// <summary>\n        /// Returns an operation to set the planned level to the given one, lowering it if it's higher than the targetted one. \n        /// The returned object allows an extended control, to automatically remove dependencies and prerequisites. \n        /// </summary>\n        /// <param name=\"skill\">The skill we want to plan</param>\n        /// <param name=\"level\">The level we want to train to</param>\n        /// <param name=\"noteForNewEntries\">The reason we want to train this skill</param>\n        /// <returns></returns>\n        private IPlanOperation TryPlanTo(Skill skill, long level, string noteForNewEntries)\n        {\n            int plannedLevel = GetPlannedLevel(skill);\n            if (level == plannedLevel)\n                return new PlanOperation(this);\n\n            // Addition\n            if (level > plannedLevel)\n            {\n                // Get skill levels to add\n                List<StaticSkillLevel> skillsToAdd = new List<StaticSkillLevel>();\n                for (int i = plannedLevel + 1; i <= level; i++)\n                {\n                    skillsToAdd.Add(new StaticSkillLevel(skill, i));\n                }\n\n                // Create the operation\n                return TryAddSet(skillsToAdd, noteForNewEntries);\n            }\n\n            // Suppression\n            // Get skill levels to remove\n            List<StaticSkillLevel> skillsToRemove = new List<StaticSkillLevel>();\n            for (int i = plannedLevel; i > level && i > skill.Level; i--)\n            {\n                skillsToRemove.Add(new StaticSkillLevel(skill, i));\n            }\n\n            // Create the operation\n            return TryRemoveSet(skillsToRemove);\n        }\n\n        /// <summary>\n        /// Adds a set of skills to this plan.\n        /// </summary>\n        /// <param name=\"skillsToAdd\">The skill levels to add.</param>\n        /// <param name=\"note\">The note for the new entries.</param>\n        /// <returns>An object allowing to perform and control the addition.</returns>\n        public IPlanOperation TryAddSet<T>(IEnumerable<T> skillsToAdd, string note)\n            where T : ISkillLevel\n        {\n            int lowestPrereqPriority;\n            IEnumerable<PlanEntry> allEntriesToAdd = GetAllEntriesToAdd(skillsToAdd, note, out lowestPrereqPriority);\n\n            return new PlanOperation(this, skillsToAdd.Cast<ISkillLevel>(), allEntriesToAdd, lowestPrereqPriority);\n        }\n\n        /// <summary>\n        /// Removes a set of skill levels from this plan.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"skillsToRemove\">The skill levels to remove.</param>\n        /// <returns>\n        /// An object allowing to perform and control the removal.\n        /// </returns>\n        public IPlanOperation TryRemoveSet<T>(IEnumerable<T> skillsToRemove)\n            where T : ISkillLevel\n        {\n            IEnumerable<PlanEntry> allEntriesToRemove = GetAllEntriesToRemove(skillsToRemove);\n\n            // Creates a plan where the entries and their dependencies have been removed\n            PlanScratchpad freePlan = new PlanScratchpad(Character);\n            freePlan.RebuildPlanFrom(Items);\n            foreach (PlanEntry entry in allEntriesToRemove)\n            {\n                freePlan.Remove(entry);\n            }\n\n            // Gather removables prerequisites now useless\n            List<PlanEntry> removablePrerequisites = new List<PlanEntry>();\n            foreach (PlanEntry prereqEntry in allEntriesToRemove.SelectMany(\n                entryToRemove => Items.Where(entryToRemove.IsDependentOf).Where(\n                    prereq => freePlan.GetMinimumLevel(prereq.Skill) == 0).Select(\n                        prereq => freePlan.GetEntry(prereq.Skill, prereq.Level)).Where(\n                            prereqEntry => prereqEntry != null && prereqEntry.Type == PlanEntryType.Prerequisite)))\n            {\n                removablePrerequisites.Add(prereqEntry);\n                freePlan.Remove(prereqEntry);\n            }\n\n            // Create the operation\n            return new PlanOperation(this, skillsToRemove.Cast<ISkillLevel>(), allEntriesToRemove,\n                removablePrerequisites);\n        }\n\n        #endregion\n\n\n        #region Certificates\n\n        /// <summary>\n        /// Adds the provided certificate's prerequisites to the plan.\n        /// </summary>\n        /// <param name=\"certificateLevel\">The certificate level.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">certificateLevel</exception>\n        public IPlanOperation TryPlanTo(CertificateLevel certificateLevel)\n        {\n            certificateLevel.ThrowIfNull(nameof(certificateLevel));\n\n            List<StaticSkillLevel> skillsToAdd = new List<StaticSkillLevel>();\n            foreach (SkillLevel skillLevel in certificateLevel.PrerequisiteSkills)\n            {\n                int plannedLevel = GetPlannedLevel(skillLevel.Skill);\n                if ((skillLevel.Level == plannedLevel) || (skillLevel.Level <= plannedLevel))\n                    continue;\n\n                // Get skill levels to add\n                for (int i = plannedLevel + 1; i <= skillLevel.Level; i++)\n                {\n                    skillsToAdd.Add(new StaticSkillLevel(skillLevel.Skill, i));\n                }\n            }\n\n            return TryAddSet(skillsToAdd, $\"{certificateLevel.Certificate.Name} {certificateLevel}\");\n        }\n\n        #endregion\n\n\n        #region Masteries\n\n        /// <summary>\n        /// Adds the provided mastery's prerequisites to the plan.\n        /// </summary>\n        /// <param name=\"masteryLevel\">The mastery level.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">masteryLevel</exception>\n        public IPlanOperation TryPlanTo(Mastery masteryLevel)\n        {\n            masteryLevel.ThrowIfNull(nameof(masteryLevel));\n\n            List<StaticSkillLevel> skillsToAdd = new List<StaticSkillLevel>();\n            Character character = Character as Character;\n            foreach (SkillLevel skillLevel in masteryLevel\n                .Select(mcert => mcert.ToCharacter(character).GetCertificateLevel(masteryLevel.Level))\n                .SelectMany(x => x.PrerequisiteSkills))\n            {\n                int plannedLevel = GetPlannedLevel(skillLevel.Skill);\n                if ((skillLevel.Level == plannedLevel) || (skillLevel.Level <= plannedLevel))\n                    continue;\n\n                // Get skill levels to add\n                for (int i = plannedLevel + 1; i <= skillLevel.Level; i++)\n                {\n                    skillsToAdd.Add(new StaticSkillLevel(skillLevel.Skill, i));\n                }\n            }\n\n            return TryAddSet(skillsToAdd, $\"{masteryLevel.MasteryShip.Ship.Name} Mastery {masteryLevel}\");\n        }\n\n        #endregion\n\n\n        #region Priorities changes\n\n        /// <summary>\n        /// Try to set the priority of the given entries and cancel if a conflict arises.\n        /// </summary>\n        /// <param name=\"displayPlan\">The m_display plan.</param>\n        /// <param name=\"entries\">The list of entries to change priority of</param>\n        /// <param name=\"priority\">The new priority to set</param>\n        /// <returns>\n        /// True when successful, false when a conflict arised.\n        /// </returns>\n        /// <exception cref=\"System.ArgumentNullException\">entries</exception>\n        public bool TrySetPriority(PlanScratchpad displayPlan, IEnumerable<PlanEntry> entries, int priority)\n        {\n            entries.ThrowIfNull(nameof(entries));\n\n            // Change priorities and make a backup\n            Queue<int> oldPriorities = new Queue<int>();\n            foreach (PlanEntry entry in entries)\n            {\n                oldPriorities.Enqueue(entry.Priority);\n                entry.Priority = priority;\n            }\n\n            // We are rebuilding the plan with the new priorities in order to check them\n            RebuildPlanFrom(displayPlan, true);\n\n            // Check priorities\n            if (FixPrioritiesOrder(false, false))\n            {\n                // Priorities are OK we save them and return\n                OnChanged(PlanChange.Notification);\n                return true;\n            }\n\n            // Failure, restore the priorities\n            foreach (PlanEntry entry in entries)\n            {\n                entry.Priority = oldPriorities.Dequeue();\n            }\n\n            // We are rebuilding the plan from the old priorities\n            RebuildPlanFrom(displayPlan, true);\n\n            return false;\n        }\n\n        #endregion\n\n\n        #region Plan Cloning\n\n        /// <summary>\n        /// Creates a clone for another character.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <returns></returns>\n        public Plan Clone(BaseCharacter character)\n        {\n            Plan plan = new Plan(character) { Name = Name };\n            plan.RebuildPlanFrom(this);\n            return plan;\n        }\n\n        /// <summary>\n        /// Creates a clone.\n        /// </summary>\n        /// <returns></returns>\n        public Plan Clone() => Clone(Character);\n\n        #endregion\n\n\n        #region InvalidEntries Helper Methods\n\n        /// <summary>\n        /// Marks all Invalid Entries in the plan as Acknowledged.\n        /// </summary>\n        public void AcknoledgeInvalidEntries()\n        {\n            foreach (InvalidPlanEntry entry in m_invalidEntries)\n            {\n                entry.Acknowledged = true;\n            }\n        }\n\n        /// <summary>\n        /// Removes all Invalid Entries that have yet to be Acknowledged.\n        /// </summary>\n        public void ClearInvalidEntries()\n        {\n            m_invalidEntries = m_invalidEntries.Where(x => x.Acknowledged).ToArray();\n        }\n\n        #endregion\n\n\n        #region Plan & Character Skill Merging\n\n        /// <summary>\n        /// Merges the characters skills with the plan entries.\n        /// </summary>\n        public void Merge(SerializableCharacterSkill skill)\n        {\n            foreach (PlanEntry entry in Items.Where(entry => entry.Skill.ID == skill.ID))\n            {\n                skill.Level = entry.Level;\n                skill.Skillpoints = entry.Skill.GetPointsRequiredForLevel(entry.Level);\n                skill.IsKnown = true;\n            }\n        }\n\n        #endregion\n\n\n        #region Private Class \"PlanOperation\"\n\n        /// <summary>\n        /// This class is used to add entries.\n        /// It enumerates the prerequisites to add, their lowest prioties, etc.\n        /// </summary>\n        private sealed class PlanOperation : IPlanOperation\n        {\n            private readonly Plan m_plan;\n            private readonly PlanOperations m_type;\n\n            // Addition\n            private readonly int m_highestPriorityForAddition;\n            private readonly List<ISkillLevel> m_skillsToAdd = new List<ISkillLevel>();\n            private readonly List<PlanEntry> m_allEntriesToAdd = new List<PlanEntry>();\n\n            // Suppression\n            private readonly List<ISkillLevel> m_skillsToRemove = new List<ISkillLevel>();\n            private readonly List<PlanEntry> m_allEntriesToRemove = new List<PlanEntry>();\n            private readonly List<PlanEntry> m_removablePrerequisites = new List<PlanEntry>();\n\n            /// <summary>\n            /// Constructor for an empty operation.\n            /// </summary>\n            /// <param name=\"plan\"></param>\n            public PlanOperation(Plan plan)\n            {\n                m_plan = plan;\n            }\n\n            /// <summary>\n            /// Constructor for entries addition.\n            /// </summary>\n            /// <param name=\"plan\">The plan.</param>\n            /// <param name=\"skillsToAdd\">The skills to add.</param>\n            /// <param name=\"allEntriesToAdd\">All entries to add.</param>\n            /// <param name=\"lowestPrerequisitesPriority\">The lowest prerequisites priority.</param>\n            public PlanOperation(Plan plan, IEnumerable<ISkillLevel> skillsToAdd, IEnumerable<PlanEntry> allEntriesToAdd,\n                int lowestPrerequisitesPriority)\n            {\n                m_plan = plan;\n                m_type = !skillsToAdd.Any() ? PlanOperations.None : PlanOperations.Addition;\n\n                m_skillsToAdd.AddRange(skillsToAdd);\n                m_allEntriesToAdd.AddRange(allEntriesToAdd);\n                m_highestPriorityForAddition = lowestPrerequisitesPriority;\n            }\n\n            /// <summary>\n            /// Constructor for entries suppression.\n            /// </summary>\n            /// <param name=\"plan\">The plan.</param>\n            /// <param name=\"skillsToRemove\">The skills to remove.</param>\n            /// <param name=\"allEntriesToRemove\">All entries to remove.</param>\n            /// <param name=\"removablePrerequisites\">The removable prerequisites.</param>\n            public PlanOperation(Plan plan, IEnumerable<ISkillLevel> skillsToRemove,\n                IEnumerable<PlanEntry> allEntriesToRemove,\n                IEnumerable<PlanEntry> removablePrerequisites)\n            {\n                m_plan = plan;\n                m_type = !skillsToRemove.Any() ? PlanOperations.None : PlanOperations.Suppression;\n\n                m_skillsToRemove.AddRange(skillsToRemove);\n                m_allEntriesToRemove.AddRange(allEntriesToRemove);\n                m_removablePrerequisites.AddRange(removablePrerequisites);\n            }\n\n            /// <summary>\n            /// Gets the type of operation to perform.\n            /// </summary>\n            public PlanOperations Type => m_type;\n\n            /// <summary>\n            /// Gets the plan affected by this operation.\n            /// </summary>\n            public Plan Plan => m_plan;\n\n            /// <summary>\n            /// Gets the skill levels the user originally wanted to add.\n            /// </summary>\n            public IEnumerable<ISkillLevel> SkillsToAdd => m_skillsToAdd.AsReadOnly();\n\n            /// <summary>\n            /// Gets all the entries to add when an addition is performed, including the prerequisites.\n            /// </summary>\n            public IEnumerable<PlanEntry> AllEntriesToAdd => m_allEntriesToAdd.AsReadOnly();\n\n            /// <summary>\n            /// Gets the skill levels the user originally wanted to remove.\n            /// </summary>\n            public IEnumerable<ISkillLevel> SkillsToRemove => m_skillsToRemove.AsReadOnly();\n\n            /// <summary>\n            /// Gets all the entries to remove when a suppression is performed, including the dependencies.\n            /// </summary>\n            public IEnumerable<PlanEntry> AllEntriesToRemove => m_allEntriesToRemove.AsReadOnly();\n\n            /// <summary>\n            /// Gets the entries that can be optionally removed when a suppression is performed.\n            /// </summary>\n            public IEnumerable<PlanEntry> RemovablePrerequisites => m_removablePrerequisites.AsReadOnly();\n\n            /// <summary>\n            /// Gets the highest possible priority (lowest possible number) for new entries when an addition is performed. \n            /// This limit is due to the prerequisites, since they cannot have a lower priority than the entries to add.\n            /// </summary>\n            public int HighestPriorityForAddition => m_highestPriorityForAddition;\n\n            /// <summary>\n            /// Performs the operation in the simplest possible way, using default priority for insertions\n            /// and not removing useless prerequisites for suppressions (but still removing dependent entries !).\n            /// </summary>\n            public void Perform()\n            {\n                switch (m_type)\n                {\n                    case PlanOperations.Suppression:\n                        PerformSuppression(false);\n                        break;\n                    case PlanOperations.Addition:\n                        PerformAddition(PlanEntry.DefaultPriority);\n                        break;\n                    default:\n                        return;\n                }\n            }\n\n            /// <summary>\n            /// Suppress the entries.\n            /// </summary>\n            /// <param name=\"removePrerequisites\">When true, also remove the prerequisites that are not used anymore.</param>\n            public void PerformSuppression(bool removePrerequisites)\n            {\n                // Checks this operation is an addition\n                if (m_type == PlanOperations.Addition)\n                    throw new InvalidOperationException(\"The represented operation is an addition.\");\n\n                // No entries ? Quit\n                if (m_skillsToRemove.Count == 0)\n                    return;\n\n\n                using (m_plan.SuspendingEvents())\n                {\n                    // Remove the entries\n                    foreach (PlanEntry existingEntry in m_allEntriesToRemove\n                        .Select(entry => m_plan.GetEntry(entry.Skill, entry.Level))\n                        .Where(existingEntry => existingEntry != null))\n                    {\n                        m_plan.RemoveCore(m_plan.IndexOf(existingEntry));\n                    }\n\n                    // Also remove the prerequisites if the caller requested it\n                    if (!removePrerequisites)\n                        return;\n\n                    foreach (PlanEntry existingEntry in m_removablePrerequisites\n                        .Select(entry => m_plan.GetEntry(entry.Skill, entry.Level))\n                        .Where(existingEntry => existingEntry != null))\n                    {\n                        m_plan.RemoveCore(m_plan.IndexOf(existingEntry));\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Adds the entries.\n            /// </summary>\n            /// <param name=\"priority\">The desired priority for the new entries,\n            /// it is automatically adjusted to match the <see cref=\"HighestPriorityForAddition\"/> property.</param>\n            public void PerformAddition(int priority)\n            {\n                // Checks this operation is an addition\n                if (m_type == PlanOperations.Suppression)\n                    throw new InvalidOperationException(\"The represented operation is a suppression.\");\n\n                // No entries ? Quit\n                if (m_allEntriesToAdd.Count == 0)\n                    return;\n\n                // Fixes priority\n                priority = Math.Max(priority, m_highestPriorityForAddition);\n\n                using (m_plan.SuspendingEvents())\n                {\n                    foreach (PlanEntry entry in m_allEntriesToAdd)\n                    {\n                        PlanEntry existingEntry = m_plan.GetEntry(entry.Skill, entry.Level);\n\n                        // Are we updating an existing entry ? Then just change the note\n                        if (existingEntry != null)\n                        {\n                            // If existing entry's notes is null, we replace it\n                            // else we catch the distinct notes                           \n                            existingEntry.Notes = existingEntry.Notes != null\n                                ? string.Join(\", \", existingEntry.Notes.Split(',')\n                                    .Select(note => note.Trim())\n                                    .Distinct())\n                                : string.Empty;\n\n                            // If entry's notes is null, we replace it\n                            entry.Notes = entry.Notes ?? string.Empty;\n\n                            // We concatenate the notes\n                            foreach (string note in entry.Notes.Split(',').Select(note => note.Trim()).Distinct()\n                                .Where(note => !existingEntry.Notes.Contains(note)))\n                            {\n                                existingEntry.Notes = string.Join(\", \", existingEntry.Notes, note);\n                            }\n\n                            // Update the priority\n                            if (existingEntry.Priority > priority)\n                                existingEntry.Priority = priority;\n                        }\n                        else\n                        {\n                            entry.Priority = priority;\n                            m_plan.AddCore(entry.Clone(m_plan));\n                        }\n                    }\n                }\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/PlanEntry.cs",
    "content": "﻿using System;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a plan's entry.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class PlanEntry : ISkillLevel\n    {\n        public const int DefaultPriority = 3;\n\n        private readonly Collection<string> m_planGroups = new Collection<string>();\n        private readonly StaticSkill m_skill;\n        private readonly BasePlan m_owner;\n        private readonly long m_level;\n\n        private RemappingPoint m_remapping;\n        private PlanEntryType m_entryType;\n        private int m_priority;\n        private string m_notes;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"owner\">The owner.</param>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"level\">The level.</param>\n        public PlanEntry(BasePlan owner, StaticSkill skill, long level)\n        {\n            m_owner = owner;\n            m_skill = skill;\n            m_level = level;\n\n            m_priority = DefaultPriority;\n            m_notes = string.Empty;\n\n            OldTrainingTime = TimeSpan.Zero;\n            TrainingTime = TimeSpan.Zero;\n        }\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"skill\">The skill.</param>\n        /// <param name=\"level\">The level.</param>\n        public PlanEntry(StaticSkill skill, long level)\n            : this(null, skill, level)\n        {\n        }\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"owner\">The owner.</param>\n        /// <param name=\"serial\">The serial.</param>\n        internal PlanEntry(BasePlan owner, SerializablePlanEntry serial)\n        {\n            m_owner = owner;\n            m_entryType = serial.Type;\n            m_skill = GetSkill(serial);\n            m_level = serial.Level;\n            m_notes = serial.Notes;\n            m_priority = serial.Priority;\n\n            m_planGroups.AddRange(serial.PlanGroups);\n\n            if (serial.Remapping != null)\n                m_remapping = new RemappingPoint(serial.Remapping);\n        }\n\n        /// <summary>\n        /// Gets the character this entry is bound to.\n        /// </summary>\n        public BaseCharacter Character => m_owner.Character;\n\n        /// <summary>\n        /// Gets the owner.\n        /// </summary>\n        public BasePlan Plan => m_owner;\n\n        /// <summary>\n        /// Gets the skill of this entry.\n        /// </summary>\n        public StaticSkill Skill => m_skill;\n\n        /// <summary>\n        /// Gets the character's skill of this entry.\n        /// </summary>\n        public Skill CharacterSkill\n        {\n            get\n            {\n                Character character = m_owner.Character as Character;\n                return character == null ? null : m_skill.ToCharacter(character);\n            }\n        }\n\n        /// <summary>\n        /// Gets the skill level of this plan entry.\n        /// </summary>\n        public long Level => m_level;\n\n        /// <summary>\n        /// Gets the entry's priority.\n        /// </summary>\n        public int Priority\n        {\n            get { return m_priority; }\n            internal set { m_priority = value; }\n        }\n\n        /// <summary>\n        /// Gets the entry type.\n        /// </summary>\n        public PlanEntryType Type\n        {\n            get { return m_entryType; }\n            internal set { m_entryType = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets the notes\n        /// </summary>\n        public string Notes\n        {\n            get { return m_notes; }\n            set\n            {\n                m_notes = value;\n                m_owner?.OnChanged(PlanChange.Notification);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the remapping point to apply before that skill is trained.\n        /// </summary>\n        public RemappingPoint Remapping\n        {\n            get { return m_remapping; }\n            set\n            {\n                m_remapping = value;\n                m_owner?.OnChanged(PlanChange.Notification);\n            }\n        }\n\n        /// <summary>\n        /// Gets the names of the plans this entry was taken from when those plans were merged.\n        /// </summary>\n        public Collection<string> PlanGroups => m_planGroups;\n\n        /// <summary>\n        /// Gets a description of the plans groups (\"none\", \"multiple (2)\" or the plan's name).\n        /// </summary>\n        public string PlanGroupsDescription\n        {\n            get\n            {\n                if (m_planGroups == null || m_planGroups.Count == 0)\n                    return \"None\";\n\n                return m_planGroups.Count == 1\n                    ? m_planGroups[0]\n                    : $\"Multiple ({m_planGroups.Count})\";\n            }\n        }\n\n        /// <summary>\n        /// Gets true if the character already know all the prerequisites.\n        /// </summary>\n        public bool CanTrainNow\n        {\n            get\n            {\n                BaseCharacter character = Character;\n\n                // Checks all the prerequisites are trained\n                bool prereqMet = m_skill.Prerequisites.All(x => character.GetSkillLevel(x.Skill) >= x.Level);\n\n                // Checks the skill has the previous level\n                return prereqMet && m_level != 0 && character.GetSkillLevel(m_skill) >= m_level - 1;\n            }\n        }\n\n        /// <summary>\n        /// Gets a skill by its ID or its name.\n        /// </summary>\n        /// <param name=\"serial\">The serial.</param>\n        /// <returns></returns>\n        private static StaticSkill GetSkill(SerializablePlanEntry serial)\n        {\n            // Try get skill by its ID\n            StaticSkill skill = StaticSkills.GetSkillByID(serial.ID) ?? StaticSkills.GetSkillByName(serial.SkillName);\n\n            // We failed? Try get skill by its name\n\n            return skill;\n        }\n\n        /// <summary>\n        /// Gets true if this skill level is, in any way, dependent of the provided skill level.\n        /// Checks prerequisites but also same skill's lower levels.\n        /// </summary>\n        /// <param name=\"level\"></param>\n        /// <returns>True if the given item's skill is a prerequisite of this one or if it is a lower level of the same skill.</returns>\n        public bool IsDependentOf(ISkillLevel level) => ((StaticSkillLevel)this).IsDependentOf(level);\n\n        public bool OmegaRequired\n        {\n            get\n            {\n                return m_level > m_skill.AlphaLimit;\n            }\n        }\n\n        #region Computations done when UpdateTrainingTime is called\n\n        /// <summary>\n        /// Gets the training time computed the last time the <see cref=\"PlanEntry.UpdateStatistics\"/> was called.\n        /// </summary>\n        public TimeSpan TrainingTime { get; private set; }\n\n        /// <summary>\n        /// Gets the backup of the training time made just before <see cref=\"PlanEntry.UpdateStatistics\"/> was called.\n        /// </summary>\n        public TimeSpan OldTrainingTime { get; private set; }\n\n        /// <summary>\n        /// Gets the training time without implants, as computed the last time <see cref=\"PlanEntry.UpdateStatistics\"/> was called.\n        /// </summary>\n        public TimeSpan NaturalTrainingTime { get; private set; }\n\n        /// <summary>\n        /// Gets the skill points total at the end of the training, as computed the last time <see cref=\"PlanEntry.UpdateStatistics\"/> was called.\n        /// </summary>\n        public long EstimatedTotalSkillPoints { get; private set; }\n\n        /// <summary>\n        /// Gets the SP/Hour, as computed the last time <see cref=\"PlanEntry.UpdateStatistics\"/> was called.\n        /// </summary>\n        public int SpPerHour { get; private set; }\n\n        /// <summary>\n        /// Gets the training start time, as computed the last time <see cref=\"PlanEntry.UpdateStatistics\"/> was called.\n        /// </summary>\n        public DateTime StartTime { get; private set; }\n\n        /// <summary>\n        /// Gets the training end time, as computed the last time <see cref=\"PlanEntry.UpdateStatistics\"/> was called.\n        /// </summary>\n        public DateTime EndTime { get; private set; }\n\n        /// <summary>\n        /// Represents the progress towards completion.\n        /// </summary>\n        public float FractionCompleted => m_level == CharacterSkill.Level + 1\n            ? CharacterSkill.FractionCompleted\n            : m_level == CharacterSkill.Level\n                ? 1f\n                : 0f;\n\n        /// <summary>\n        /// How many skill points are required to train this skill.\n        /// </summary>\n        public long SkillPointsRequired { get; private set; }\n\n        /// <summary>\n        /// Updates the column statistics (with the exception of the <see cref=\"UpdateOldTrainingTime\"/>) from the given scratchpad.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"characterWithoutImplants\"></param>\n        /// <param name=\"time\"></param>\n        internal void UpdateStatistics(BaseCharacter character, BaseCharacter characterWithoutImplants, ref DateTime time)\n        {\n            SkillPointsRequired = m_skill.GetPointsRequiredForLevel(m_level) - character.GetSkillPoints(m_skill);\n            EstimatedTotalSkillPoints = character.SkillPoints + SkillPointsRequired;\n            TrainingTime = character.GetTrainingTime(m_skill, m_level);\n            NaturalTrainingTime = characterWithoutImplants.GetTrainingTime(m_skill, m_level);\n            SpPerHour = (int)Math.Round(character.GetBaseSPPerHour(m_skill));\n            EndTime = time + TrainingTime;\n            StartTime = time;\n            time = EndTime;\n        }\n\n        /// <summary>\n        /// Updates the <see cref=\"OldTrainingTime\"/> statistic.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        internal void UpdateOldTrainingTime(BaseCharacter character)\n        {\n            OldTrainingTime = character.GetTrainingTime(m_skill, m_level);\n        }\n\n        #endregion\n\n\n        /// <summary>\n        /// Gets a hash code from the level and skill ID.\n        /// </summary>\n        /// <returns></returns>\n        // After the switch to 64-bit integers this line was throwing a\n        // warning. GetHashCode can't possibly be unique for every object\n        // there is, additionally GetHashCode() should not be used for\n        // equality only grouping; or at least Google says so...\n        public override int GetHashCode() => m_skill.ID << 3 | Convert.ToInt32(m_level);\n\n        /// <summary>\n        /// Returns a string representation of entry - eases debugging.\n        /// </summary>\n        /// <returns>Hull Upgrades IV</returns>\n        public override string ToString()\n            => $\"{m_skill.Name} {Models.Skill.GetRomanFromInt(m_level)}\";\n\n        /// <summary>\n        /// Creates a clone of this entry for the given plan.\n        /// </summary>\n        /// <param name=\"plan\"></param>\n        /// <returns></returns>\n        internal PlanEntry Clone(BasePlan plan)\n        {\n            // We need a skill for the plan's character\n            PlanEntry clone = new PlanEntry(plan, m_skill, m_level)\n            {\n                m_entryType = m_entryType,\n                m_priority = m_priority,\n                m_notes = m_notes,\n                m_remapping = m_remapping?.Clone(),\n                OldTrainingTime = OldTrainingTime,\n                TrainingTime = TrainingTime\n            };\n            clone.m_planGroups.AddRange(m_planGroups);\n\n            return clone;\n        }\n\n        /// <summary>\n        /// Implicit conversion operator.\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        /// <returns></returns>\n        public static implicit operator StaticSkillLevel(PlanEntry entry)\n            => entry == null ? null : new StaticSkillLevel(entry.Skill, entry.Level);\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/PlanetaryColony.cs",
    "content": "﻿using EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Collections.Generic;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class PlanetaryColony : IComparable, IComparable<PlanetaryColony>\n    {\n        private readonly List<PlanetaryPin> m_planetaryPins = new List<PlanetaryPin>();\n        private readonly List<PlanetaryRoute> m_planetaryRoutes = new List<PlanetaryRoute>();\n        private readonly List<PlanetaryLink> m_planetaryLinks = new List<PlanetaryLink>();\n\n        private bool m_queryPinsPending;\n        private ResponseParams m_layoutResponse;\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanetaryColony\"/> class.\n        /// </summary>\n        /// <param name=\"ccpCharacter\">The CCP character.</param>\n        /// <param name=\"src\">The source.</param>\n        internal PlanetaryColony(CCPCharacter ccpCharacter, EsiPlanetaryColonyListItem src)\n        {\n            Character = ccpCharacter;\n            SolarSystem = StaticGeography.GetSolarSystemByID(src.SolarSystemID);\n            PlanetID = src.PlanetID;\n            PlanetTypeID = src.PlanetType;\n            PlanetTypeName = StaticItems.GetItemName(PlanetTypeID);\n            PlanetName = SolarSystem.FindPlanetByID(PlanetID)?.Name ?? EveMonConstants.\n                UnknownText;\n            LastUpdate = src.LastUpdate;\n            UpgradeLevel = src.UpgradeLevel;\n            NumberOfPins = src.NumberOfPins;\n            m_layoutResponse = null;\n\n            GetColonyLayout();\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the character.\n        /// </summary>\n        public CCPCharacter Character { get; }\n\n        /// <summary>\n        /// Gets the planet identifier.\n        /// </summary>\n        /// <value>\n        /// The planet identifier.\n        /// </value>\n        public int PlanetID { get; }\n\n        /// <summary>\n        /// Gets the name of the planet.\n        /// </summary>\n        /// <value>\n        /// The name of the planet.\n        /// </value>\n        public string PlanetName { get; private set; }\n\n        /// <summary>\n        /// Gets the planet type identifier.\n        /// </summary>\n        /// <value>\n        /// The planet identifier.\n        /// </value>\n        public int PlanetTypeID { get; }\n\n        /// <summary>\n        /// Gets the name of the planet type.\n        /// </summary>\n        /// <value>\n        /// The name of the planet type.\n        /// </value>\n        public string PlanetTypeName { get; }\n\n        /// <summary>\n        /// Gets the solar system where this job is located.\n        /// </summary>\n        /// <value>\n        /// The solar system.\n        /// </value>\n        public SolarSystem SolarSystem { get; }\n\n        /// <summary>\n        /// Gets the installation full celestrial path.\n        /// </summary>\n        /// <value>\n        /// The full location.\n        /// </value>\n        public string FullLocation => $\"{SolarSystem.FullLocation} > {PlanetName}\";\n\n        /// <summary>\n        /// Gets the last update.\n        /// </summary>\n        /// <value>\n        /// The last update.\n        /// </value>\n        public DateTime LastUpdate { get; }\n\n        /// <summary>\n        /// Gets the upgrade level.\n        /// </summary>\n        /// <value>\n        /// The upgrade level.\n        /// </value>\n        public int UpgradeLevel { get; }\n\n        /// <summary>\n        /// Gets the number of pins.\n        /// </summary>\n        /// <value>\n        /// The number of pins.\n        /// </value>\n        public int NumberOfPins { get; }\n\n        /// <summary>\n        /// Gets the pins.\n        /// </summary>\n        /// <value>\n        /// The pins.\n        /// </value>\n        public IEnumerable<PlanetaryPin> Pins => m_planetaryPins;\n\n        /// <summary>\n        /// Gets the routes.\n        /// </summary>\n        /// <value>\n        /// The routes.\n        /// </value>\n        public IEnumerable<PlanetaryRoute> Routes => m_planetaryRoutes;\n\n        /// <summary>\n        /// Gets the links.\n        /// </summary>\n        /// <value>\n        /// The links.\n        /// </value>\n        public IEnumerable<PlanetaryLink> Links => m_planetaryLinks;\n\n        #endregion\n\n\n        #region Helper Methods\n        \n        /// <summary>\n        /// Gets the colony pins.\n        /// </summary>\n        private void GetColonyLayout()\n        {\n            if (!m_queryPinsPending && !EsiErrors.IsErrorCountExceeded)\n            {\n                // Find the API key associated with planetary pins\n                ESIKey apiKey = Character.Identity.FindAPIKeyWithAccess(ESIAPICharacterMethods.\n                    PlanetaryLayout);\n                m_queryPinsPending = true;\n                if (apiKey != null)\n                    EveMonClient.APIProviders.CurrentProvider.QueryEsi<EsiAPIPlanetaryColony>(\n                        ESIAPICharacterMethods.PlanetaryLayout, OnPlanetaryPinsUpdated,\n                        new ESIParams(m_layoutResponse, apiKey.AccessToken) {\n                            ParamOne = Character.CharacterID,\n                            ParamTwo = PlanetID\n                        });\n            }\n        }\n        \n        /// <summary>\n        /// Called when planetary pins updated.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private void OnPlanetaryPinsUpdated(EsiResult<EsiAPIPlanetaryColony> result, object\n            ignore)\n        {\n            m_queryPinsPending = false;\n            m_layoutResponse = result.Response;\n            // Notify if an error occured\n            if (Character.ShouldNotifyError(result, ESIAPICharacterMethods.PlanetaryLayout))\n                EveMonClient.Notifications.NotifyCharacterPlanetaryLayoutError(Character,\n                    result);\n            if (!result.HasError)\n            {\n                EveMonClient.Notifications.InvalidateCharacterAPIError(Character);\n                if (result.HasData)\n                {\n                    Import(result.Result);\n                    EveMonClient.OnCharacterPlanetaryLayoutUpdated(Character);\n                }\n            }\n        }\n        \n        #endregion\n\n\n        #region Importation\n\n        /// <summary>\n        /// Imports the planeatry layout.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        private void Import(EsiAPIPlanetaryColony src)\n        {\n            foreach (var item in src.Pins)\n                m_planetaryPins.Add(new PlanetaryPin(this, item));\n            foreach (var item in src.Links)\n                m_planetaryLinks.Add(new PlanetaryLink(this, item));\n            foreach (var item in src.Routes)\n                m_planetaryRoutes.Add(new PlanetaryRoute(this, item));\n        }\n        \n        #endregion\n\n\n        /// <summary>\n        /// Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object.\n        /// </summary>\n        /// <param name=\"obj\">An object to compare with this instance.</param>\n        /// <returns>\n        /// A value that indicates the relative order of the objects being compared. The return value has these meanings: Value Meaning Less than zero This instance is less than <paramref name=\"obj\" />. Zero This instance is equal to <paramref name=\"obj\" />. Greater than zero This instance is greater than <paramref name=\"obj\" />.\n        /// </returns>\n        public int CompareTo(object obj) => CompareTo((PlanetaryColony)obj);\n\n        /// <summary>\n        /// Compares the current object with another object of the same type.\n        /// </summary>\n        /// <param name=\"other\">An object to compare with this object.</param>\n        /// <returns>\n        /// A value that indicates the relative order of the objects being compared. The return value has the following meanings: Value Meaning Less than zero This object is less than the <paramref name=\"other\" /> parameter.Zero This object is equal to <paramref name=\"other\" />. Greater than zero This object is greater than <paramref name=\"other\" />.\n        /// </returns>\n        public int CompareTo(PlanetaryColony other) => this == other ? 1 : -1;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/PlanetaryLink.cs",
    "content": "﻿using EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class PlanetaryLink\n    {\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanetaryLink\"/> class.\n        /// </summary>\n        /// <param name=\"colony\">The colony.</param>\n        /// <param name=\"src\">The source.</param>\n        internal PlanetaryLink(PlanetaryColony colony, EsiPlanetaryLink src)\n        {\n            Colony = colony;\n            SourcePinID = src.SourcePinID;\n            DestinationPinID = src.DestinationPinID;\n            LinkLevel = src.LinkLevel;\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the colony.\n        /// </summary>\n        /// <value>\n        /// The colony.\n        /// </value>\n        public PlanetaryColony Colony { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the source pin identifier.\n        /// </summary>\n        /// <value>\n        /// The source pin identifier.\n        /// </value>\n        public long SourcePinID { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the destination pin identifier.\n        /// </summary>\n        /// <value>\n        /// The destination pin identifier.\n        /// </value>\n        public long DestinationPinID { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the link level.\n        /// </summary>\n        /// <value>\n        /// The link level.\n        /// </value>\n        public short LinkLevel { get; private set; }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/PlanetaryPin.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class PlanetaryPin\n    {\n        private readonly EveProperty m_volumeProperty = StaticProperties.GetPropertyByID(DBConstants.VolumePropertyID);\n        private readonly char[] m_baseString = \"123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\".ToCharArray();\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanetaryPin\"/> class.\n        /// </summary>\n        /// <param name=\"colony\">The colony.</param>\n        /// <param name=\"src\">The source.</param>\n        internal PlanetaryPin(PlanetaryColony colony, EsiPlanetaryPin src)\n        {\n            var type = StaticItems.GetItemByID(src.TypeID);\n            var extractor = src.ExtractorDetails;\n            var contents = src.Contents;\n            type.ThrowIfNull(nameof(type));\n\n            Colony = colony;\n            ID = src.PinID;\n            TypeID = src.TypeID;\n            TypeName = type.Name;\n            SchematicID = src.SchematicID;\n            InstallTime = src.InstallTime;\n            ExpiryTime = src.ExpiryTime;\n            State = GetState();\n\n            if (extractor != null)\n            {\n                CycleTime = (short)extractor.CycleTime;\n                QuantityPerCycle = extractor.QuantityPerCycle;\n            }\n\n            // Old EVEMon could only handle one item in contents\n            if (contents != null && contents.Count > 0)\n            {\n                var firstItem = contents[0];\n                int typeID = firstItem.TypeID;\n                ContentQuantity = firstItem.Amount;\n                ContentTypeID = typeID;\n                ContentTypeName = StaticItems.GetItemName(typeID);\n            }\n            else\n            {\n                ContentQuantity = 0;\n                ContentTypeID = 0;\n                ContentTypeName = string.Empty;\n            }\n            LastLaunchTime = src.LastCycleStart;\n            ContentVolume = GetVolume();\n\n            GroupName = type.GroupName;\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the colony.\n        /// </summary>\n        /// <value>\n        /// The colony.\n        /// </value>\n        public PlanetaryColony Colony { get; }\n\n        /// <summary>\n        /// Gets the pin identifier.\n        /// </summary>\n        /// <value>\n        /// The pin identifier.\n        /// </value>\n        public long ID { get; }\n\n        /// <summary>\n        /// Gets the type identifier.\n        /// </summary>\n        /// <value>\n        /// The type identifier.\n        /// </value>\n        public int TypeID { get; }\n\n        /// <summary>\n        /// Gets or sets the name of the type.\n        /// </summary>\n        /// <value>\n        /// The name of the type.\n        /// </value>\n        public string TypeName { get; }\n\n        /// <summary>\n        /// Gets or sets the schematic identifier.\n        /// </summary>\n        /// <value>\n        /// The schematic identifier.\n        /// </value>\n        public long SchematicID { get; }\n\n        /// <summary>\n        /// Gets or sets the cycle time.\n        /// </summary>\n        /// <value>\n        /// The cycle time.\n        /// </value>\n        public short CycleTime { get; }\n\n        /// <summary>\n        /// Gets or sets the quantity per cycle.\n        /// </summary>\n        /// <value>\n        /// The quantity per cycle.\n        /// </value>\n        public int QuantityPerCycle { get; }\n\n        /// <summary>\n        /// Gets the content type identifier.\n        /// </summary>\n        /// <value>\n        /// The content type identifier.\n        /// </value>\n        public int ContentTypeID { get; }\n\n        /// <summary>\n        /// Gets or sets the name of the content type.\n        /// </summary>\n        /// <value>\n        /// The name of the content type.\n        /// </value>\n        public string ContentTypeName { get; }\n\n        /// <summary>\n        /// Gets the content volume.\n        /// </summary>\n        /// <value>\n        /// The content.\n        /// </value>\n        public double ContentVolume { get; }\n\n        /// <summary>\n        /// Gets or sets the content quantity.\n        /// </summary>\n        /// <value>\n        /// The content quantity.\n        /// </value>\n        public int ContentQuantity { get; }\n\n        /// <summary>\n        /// Gets or sets the last launch time.\n        /// </summary>\n        /// <value>\n        /// The last launch time.\n        /// </value>\n        public DateTime LastLaunchTime { get; }\n\n        /// <summary>\n        /// Gets or sets the install time.\n        /// </summary>\n        /// <value>\n        /// The install time.\n        /// </value>\n        public DateTime InstallTime { get; }\n\n        /// <summary>\n        /// Gets or sets the expiry time.\n        /// </summary>\n        /// <value>\n        /// The expiry time.\n        /// </value>\n        public DateTime ExpiryTime { get; }\n\n        /// <summary>\n        /// Gets or sets the jobs state.\n        /// </summary>\n        public PlanetaryPinState State { get; set; }\n\n        /// <summary>\n        /// Gets the estimated time to completion.\n        /// </summary>\n        public string TTC => State == PlanetaryPinState.Extracting ? ExpiryTime.\n            ToRemainingTimeDigitalDescription(DateTimeKind.Utc) : string.Empty;\n\n        /// <summary>\n        /// Gets the linked to.\n        /// </summary>\n        /// <value>\n        /// The linked to.\n        /// </value>\n        public IEnumerable<PlanetaryPin> LinkedTo => Colony.Links.Where(\n            link => link.SourcePinID == ID || link.DestinationPinID == ID).SelectMany(\n            link => Colony.Pins.Where(pin => pin.ID != ID && (pin.ID == link.SourcePinID ||\n            pin.ID == link.DestinationPinID)));\n\n        /// <summary>\n        /// Gets the routed to.\n        /// </summary>\n        /// <value>\n        /// The routed to.\n        /// </value>\n        public IEnumerable<PlanetaryPin> RoutedTo => Colony.Routes.Where(\n            route => route.SourcePinID == ID || route.DestinationPinID == ID).SelectMany(\n            route => Colony.Pins.Where(pin => pin.ID != ID && (pin.ID == route.SourcePinID ||\n            pin.ID == route.DestinationPinID)));\n\n        /// <summary>\n        /// Gets the name of the group.\n        /// </summary>\n        /// <value>\n        /// The name of the group.\n        /// </value>\n        public string GroupName { get; }\n\n        /// <summary>\n        /// Gets true if we have notified the user.\n        /// </summary>\n        public bool NotificationSend { get; set; }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the name of the pin.\n        /// </summary>\n        /// <param name=\"typeName\">Name of the type.</param>\n        /// <returns></returns>\n        private string GetPinName(string typeName)\n        {\n            int lenght = m_baseString.Length - 1;\n            string pinNameID = string.Empty;\n\n            for (int i = 0; i < 5; i++)\n            {\n                pinNameID += m_baseString[(int)(ID / Math.Pow(lenght, i) % lenght)];\n            }\n\n            return $\"{typeName} {pinNameID.Substring(0, 2)}-{pinNameID.Substring(2, 3)}\";\n        }\n\n        /// <summary>\n        /// Gets the state.\n        /// </summary>\n        /// <returns></returns>\n        private PlanetaryPinState GetState()\n        {\n            if (DBConstants.EcuTypeIDs.Contains(TypeID))\n                return ExpiryTime > DateTime.UtcNow ? PlanetaryPinState.Extracting :\n                    PlanetaryPinState.Idle;\n\n            return PlanetaryPinState.None;\n        }\n\n        /// <summary>\n        /// Gets the volume.\n        /// </summary>\n        /// <returns></returns>\n        private double GetVolume()\n        {\n            Item item = StaticItems.GetItemByID(ContentTypeID);\n            return item != null && m_volumeProperty != null ? m_volumeProperty.\n                GetNumericValue(item) * ContentQuantity : 0.0;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/PlanetaryRoute.cs",
    "content": "﻿using EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class PlanetaryRoute\n    {\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanetaryRoute\"/> class.\n        /// </summary>\n        /// <param name=\"colony\">The colony.</param>\n        /// <param name=\"src\">The source.</param>\n        internal PlanetaryRoute(PlanetaryColony colony, EsiPlanetaryRoute src)\n        {\n            Colony = colony;\n            ID = src.RouteID;\n            SourcePinID = src.SourcePinID;\n            DestinationPinID = src.DestinationPinID;\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the colony.\n        /// </summary>\n        /// <value>\n        /// The colony.\n        /// </value>\n        public PlanetaryColony Colony { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the route identifier.\n        /// </summary>\n        /// <value>\n        /// The route identifier.\n        /// </value>\n        public long ID { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the source pin identifier.\n        /// </summary>\n        /// <value>\n        /// The source pin identifier.\n        /// </value>\n        public long SourcePinID { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the destination pin identifier.\n        /// </summary>\n        /// <value>\n        /// The destination pin identifier.\n        /// </value>\n        public long DestinationPinID { get; private set; }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/QueuedSkill.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a skill training.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class QueuedSkill\n    {\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"character\">The character for this training</param>\n        /// <param name=\"serial\">The serialization object for this training</param>\n        /// <param name=\"startTimeWhenPaused\">Training starttime when the queue is actually paused.\n        /// Indeed, in such case, CCP returns empty start and end time, so we compute a \"what if we start now\" scenario.</param>\n        internal QueuedSkill(Character character, SerializableQueuedSkill serial,\n            ref DateTime startTimeWhenPaused)\n        {\n            Owner = character;\n            StartSP = serial.StartSP;\n            EndSP = serial.EndSP;\n            Level = serial.Level;\n            Skill = character.Skills[serial.ID];\n\n            if (!serial.IsPaused)\n            {\n                // Not paused, we should trust CCP\n                StartTime = serial.StartTime;\n                EndTime = serial.EndTime;\n            }\n            else\n            {\n                // StartTime and EndTime were empty on the serialization object if the skill was paused\n                // So we compute a \"what if we start now\" scenario\n                StartTime = startTimeWhenPaused;\n                if (Skill != null)\n                {\n                    if (serial.Level <= Skill.Level + 1)\n                        Skill.SkillPoints = StartSP;\n                    startTimeWhenPaused += Skill.GetLeftTrainingTimeForLevelOnly(Level);\n                }\n                EndTime = startTimeWhenPaused;\n            }\n        }\n\n        /// <summary>\n        /// Gets the character training this.\n        /// </summary>\n        public Character Owner { get; }\n\n        /// <summary>\n        /// Gets the trained level.\n        /// </summary>\n        public int Level { get; }\n\n        /// <summary>\n        /// Gets the trained skill. May be null if the skill is not in our datafiles.\n        /// </summary>\n        public Skill Skill { get; }\n\n        /// <summary>\n        /// Gets the skill name, or \"Unknown Skill\" if the skill was not in our datafiles.\n        /// </summary>\n        public string SkillName => (Skill ?? Skill.UnknownSkill).Name;\n\n        /// <summary>\n        /// Gets the training start time (UTC).\n        /// </summary>\n        public DateTime StartTime { get; }\n\n        /// <summary>\n        /// Gets the time this training will be completed (UTC).\n        /// </summary>\n        public DateTime EndTime { get; }\n\n        /// <summary>\n        /// Gets the number of SP this skill had when the training started.\n        /// </summary>\n        public int StartSP { get; }\n\n        /// <summary>\n        /// Gets the number of SP this skill will have once the training is over.\n        /// </summary>\n        public int EndSP { get; }\n\n        /// <summary>\n        /// Gets the fraction completed, between 0 and 1.\n        /// </summary>\n        public float FractionCompleted\n        {\n            get\n            {\n                float fraction = 0.0f;\n                if (Skill != null)\n                {\n                    if (Skill == Skill.UnknownSkill)\n                    {\n                        // Based on estimated end time - start time\n                        double time = EndTime.Subtract(StartTime).TotalMilliseconds;\n                        if (time > 0.0)\n                            fraction = (float)(1.0 - EndTime.Subtract(DateTime.UtcNow).\n                                TotalMilliseconds / time);\n                    }\n                    else\n                        fraction = Skill.FractionCompleted;\n                }\n                return fraction;\n            }\n        }\n\n        /// <summary>\n        /// Computes an estimation of the current SP.\n        /// </summary>\n        public int CurrentSP\n        {\n            get\n            {\n                int estimatedSP = (int)(EndSP - EndTime.Subtract(DateTime.UtcNow).TotalHours *\n                    SkillPointsPerHour);\n                return IsTraining ? Math.Max(estimatedSP, StartSP) : StartSP;\n            }\n        }\n\n        /// <summary>\n        /// Gets the rank.\n        /// </summary>\n        /// <value>\n        /// The rank.\n        /// </value>\n        public long Rank\n        {\n            get\n            {\n                if (Skill != Skill.UnknownSkill)\n                    return Skill.Rank;\n\n                switch (Level)\n                {\n                    case 0:\n                        return 0;\n                    case 1:\n                        return EndSP / 250;\n                    case 2:\n                        return EndSP / 1414;\n                    case 3:\n                        return EndSP / 8000;\n                    case 4:\n                        return EndSP / 45255;\n                    case 5:\n                        return EndSP / 256000;\n                }\n                return Skill.Rank;\n            }\n        }\n\n        /// <summary>\n        /// Gets the training speed.\n        /// </summary>\n        /// <returns></returns>\n        public double SkillPointsPerHour\n        {\n            get\n            {\n                double rate;\n                if (Skill == Skill.UnknownSkill)\n                {\n                    // Based on estimated end time - start time\n                    double time = EndTime.Subtract(StartTime).TotalHours;\n                    if (time <= 0.0)\n                        // Do not divide by zero\n                        rate = 0.0;\n                    else\n                        rate = Math.Ceiling((EndSP - StartSP) / time);\n                }\n                else\n                    rate = Skill.SkillPointsPerHour;\n                return rate;\n            }\n        }\n\n        /// <summary>\n        /// Computes the remaining time.\n        /// </summary>\n        /// <value>The remaining time.</value>\n        /// <returns> Returns <see cref=\"TimeSpan.Zero\"/> if already completed.</returns>\n        public TimeSpan RemainingTime\n        {\n            get\n            {\n                TimeSpan left = EndTime.Subtract(DateTime.UtcNow);\n                return left < TimeSpan.Zero ? TimeSpan.Zero : left;\n            }\n        }\n\n        /// <summary>\n        /// Gets true if the skill is currently in training.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if the skill is training; otherwise, <c>false</c>.\n        /// </value>\n        public bool IsTraining\n        {\n            get\n            {\n                var ccpCharacter = Owner as CCPCharacter;\n                return Skill.IsTraining || (ccpCharacter != null && ccpCharacter.SkillQueue.\n                    IsTraining && ccpCharacter.SkillQueue.First() == this);\n            }\n        }\n\n        /// <summary>\n        /// Gets true if the training has been completed, false otherwise.\n        /// </summary>\n        public bool IsCompleted => EndTime <= DateTime.UtcNow;\n\n        public override bool Equals(object obj)\n        {\n            var other = obj as QueuedSkill;\n            string otherName = other?.SkillName;\n            return otherName != null && otherName.Equals(SkillName, StringComparison.\n                InvariantCulture) && StartSP == other.StartSP && EndSP == other.EndSP;\n        }\n\n        public override int GetHashCode()\n        {\n            return SkillName?.GetHashCode() ?? 0;\n        }\n\n        /// <summary>\n        /// Generates a deserialization object.\n        /// </summary>\n        /// <returns></returns>\n        internal SerializableQueuedSkill Export()\n        {\n            SerializableQueuedSkill skill = new SerializableQueuedSkill\n            {\n                ID = Skill?.ID ?? 0,\n                Level = Level,\n                StartSP = StartSP,\n                EndSP = EndSP,\n            };\n\n            // CCP's API indicates paused training skill with missing start and end times\n            // Mimicing them is ugly but necessary\n            if (!Owner.IsTraining)\n                return skill;\n\n            skill.StartTime = StartTime;\n            skill.EndTime = EndTime;\n\n            return skill;\n        }\n\n        /// <summary>\n        /// Gets a string representation of this skill.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => $\"{SkillName} {Skill.GetRomanFromInt(Level)}\";\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/RemappingPoint.cs",
    "content": "﻿using System;\nusing System.Text;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a remapping operation attached to a plan entry\n    /// </summary>\n    public sealed class RemappingPoint\n    {\n        private readonly long[] m_attributes = new long[5];\n        private string m_description = string.Empty;\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public RemappingPoint()\n        {\n            Guid = Guid.NewGuid();\n        }\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"serial\">The serial.</param>\n        /// <exception cref=\"System.ArgumentNullException\">serial</exception>\n        public RemappingPoint(SerializableRemappingPoint serial)\n        {\n            serial.ThrowIfNull(nameof(serial));\n\n            Guid = Guid.NewGuid();\n            m_attributes[(int)EveAttribute.Intelligence] = serial.Intelligence;\n            m_attributes[(int)EveAttribute.Perception] = serial.Perception;\n            m_attributes[(int)EveAttribute.Willpower] = serial.Willpower;\n            m_attributes[(int)EveAttribute.Charisma] = serial.Charisma;\n            m_attributes[(int)EveAttribute.Memory] = serial.Memory;\n            m_description = serial.Description;\n            Status = serial.Status;\n        }\n\n        /// <summary>\n        /// Gets a global identified of this remapping point.\n        /// </summary>\n        [XmlIgnore]\n        public Guid Guid { get; private set; }\n\n        /// <summary>\n        /// Gets the point's status (whether is has been initialized/computed or not).\n        /// </summary>\n        [XmlIgnore]\n        public RemappingPointStatus Status { get; private set; }\n\n        /// <summary>\n        /// Gets the new base value for the given attribute.\n        /// </summary>\n        /// <param name=\"attrib\"></param>\n        /// <returns></returns>\n        public long this[EveAttribute attrib] => m_attributes[(int)attrib];\n\n        /// <summary>\n        /// Gets a short string representation of the point (\"i5 p7 c8 w9 m5\").\n        /// </summary>\n        /// <returns></returns>\n        private string ToShortString()\n        {\n            StringBuilder builder = new StringBuilder();\n            builder.Append(\"i\").Append(m_attributes[(int)EveAttribute.Intelligence].ToString(CultureConstants.DefaultCulture)).\n                Append(\" p\").Append(m_attributes[(int)EveAttribute.Perception].ToString(CultureConstants.DefaultCulture)).\n                Append(\" c\").Append(m_attributes[(int)EveAttribute.Charisma].ToString(CultureConstants.DefaultCulture)).\n                Append(\" w\").Append(m_attributes[(int)EveAttribute.Willpower].ToString(CultureConstants.DefaultCulture)).\n                Append(\" m\").Append(m_attributes[(int)EveAttribute.Memory].ToString(CultureConstants.DefaultCulture));\n\n            return builder.ToString();\n        }\n\n        /// <summary>\n        /// Gets a long string representation of this point. Two possible formats : \n        /// <list type=\"\">\n        /// <item>\"Remapping (not computed, use the attributes optimizer)\"</item>\n        /// <item>\"Remapping (active) : &lt;description&gt;</item>\n        /// </list>\n        /// </summary>\n        /// <returns></returns>\n        public string ToLongString()\n        {\n            switch (Status)\n            {\n                case RemappingPointStatus.NotComputed:\n                    return \"Remapping (not computed, use the attributes optimizer)\";\n                case RemappingPointStatus.UpToDate:\n                    return $\"Remapping : {m_description}\";\n                default:\n                    return string.Empty;\n            }\n        }\n\n        /// <summary>\n        /// Gets a string representation of this point. Two possible formats : \n        /// <list type=\"\">\n        /// <item>\"Remapping (not computed, use the attributes optimizer)\"</item>\n        /// <item>\"Remapping (active) : i5 p7 c8 w9 m5\"</item>\n        /// </list>\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            switch (Status)\n            {\n                case RemappingPointStatus.NotComputed:\n                    return \"Remapping (not computed, use the attributes optimizer)\";\n                case RemappingPointStatus.UpToDate:\n                    return $\"Remapping (active) : {ToShortString()}\";\n                default:\n                    return string.Empty;\n            }\n        }\n\n        /// <summary>\n        /// Will set the provided character scratchpad's base attributes as the target values to remap.\n        /// </summary>\n        /// <param name=\"newScratchpad\">The scratchpad with the target base values to assign to this point</param>\n        /// <param name=\"oldScratchpad\">The scratchpad before we remapped</param>\n        internal void SetBaseAttributes(CharacterScratchpad newScratchpad, CharacterScratchpad oldScratchpad)\n        {\n            // Update the status\n            Status = RemappingPointStatus.UpToDate;\n\n            // Initialize the string\n            StringBuilder builder = new StringBuilder();\n\n            // Scroll through attributes\n            for (int i = 0; i < 5; i++)\n            {\n                // Compute the new base attribute\n                EveAttribute attrib = (EveAttribute)i;\n                m_attributes[i] = newScratchpad[attrib].Base;\n\n                // Update description\n                builder.AppendLine().Append(GetStringForAttribute(attrib, oldScratchpad, newScratchpad));\n            }\n\n            // Return the final string\n            m_description = builder.ToString();\n        }\n\n        /// <summary>\n        /// Gets a string representation of the attribute.\n        /// </summary>\n        /// <param name=\"attrib\">The attribute.</param>\n        /// <param name=\"oldScratchpad\">The old scratchpad.</param>\n        /// <param name=\"newScratchpad\">The new scratchpad.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">\n        /// oldScratchpad\n        /// or\n        /// newScratchpad\n        /// </exception>\n        public static string GetStringForAttribute(EveAttribute attrib, CharacterScratchpad oldScratchpad,\n            CharacterScratchpad newScratchpad)\n        {\n            oldScratchpad.ThrowIfNull(nameof(oldScratchpad));\n\n            newScratchpad.ThrowIfNull(nameof(newScratchpad));\n\n            long bonusDifference = newScratchpad[attrib].Base - oldScratchpad[attrib].Base;\n\n            if (bonusDifference == 0)\n                return newScratchpad[attrib].ToString(\"%N (0) = %e = (%B + %r + %i)\");\n\n            return newScratchpad[attrib].ToString(bonusDifference > 0\n                ? $\"%N (+{bonusDifference}) = %e = (%B + %r + %i)\"\n                : $\"%N ({bonusDifference}) = %e = (%B + %r + %i)\");\n        }\n\n        /// <summary>\n        /// Gets a hash code from the GUID.\n        /// </summary>\n        /// <returns></returns>\n        public override int GetHashCode() => Guid.GetHashCode();\n\n        /// <summary>\n        /// Clones the remapping point.\n        /// </summary>\n        /// <returns></returns>\n        public RemappingPoint Clone()\n        {\n            RemappingPoint clone = new RemappingPoint();\n            Array.Copy(m_attributes, clone.m_attributes, 5);\n            clone.Status = Status;\n            clone.Guid = Guid;\n            return clone;\n        }\n\n        /// <summary>\n        /// Creates a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        internal SerializableRemappingPoint Export() => new SerializableRemappingPoint\n        {\n            Intelligence = m_attributes[(int)EveAttribute.Intelligence],\n            Perception = m_attributes[(int)EveAttribute.Perception],\n            Willpower = m_attributes[(int)EveAttribute.Willpower],\n            Charisma = m_attributes[(int)EveAttribute.Charisma],\n            Memory = m_attributes[(int)EveAttribute.Memory],\n            Description = m_description,\n            Status = Status\n        };\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/RemappingResult.cs",
    "content": "using System;\nusing System.Collections.ObjectModel;\nusing System.Text;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents the result of a remapping.\n    /// </summary>\n    public sealed class RemappingResult\n    {\n        /// <summary>\n        /// Constructor without any remapping point associated.\n        /// </summary>\n        /// <param name=\"baseScratchpad\">The base scratchpad.</param>\n        /// <exception cref=\"System.ArgumentNullException\">baseScratchpad</exception>\n        public RemappingResult(CharacterScratchpad baseScratchpad)\n        {\n            baseScratchpad.ThrowIfNull(nameof(baseScratchpad));\n\n            Skills = new Collection<ISkillLevel>();\n            BaseScratchpad = baseScratchpad;\n            StartTime = BaseScratchpad.TrainingTime;\n        }\n\n        /// <summary>\n        /// Constructor for a result bound to a remapping point.\n        /// </summary>\n        /// <param name=\"point\">Associated remapping point, may be null.</param>\n        /// <param name=\"baseScratchpad\"></param>\n        public RemappingResult(RemappingPoint point, CharacterScratchpad baseScratchpad)\n            : this(baseScratchpad)\n        {\n            if (point == null)\n                return;\n\n            Point = point;\n        }\n\n        /// <summary>\n        /// Constructor for a manually edited result from a base result.\n        /// </summary>\n        /// <param name=\"result\">Associated remapping point, may be null.</param>\n        /// <param name=\"bestScratchpad\">The best scratchpad.</param>\n        /// <exception cref=\"System.ArgumentNullException\">result</exception>\n        public RemappingResult(RemappingResult result, CharacterScratchpad bestScratchpad)\n            : this(result?.Point, result?.BaseScratchpad)\n        {\n            result.ThrowIfNull(nameof(result));\n\n            Skills.AddRange(result.Skills);\n            BestScratchpad = bestScratchpad;\n        }\n\n        /// <summary>\n        /// Gets the optimized plan.\n        /// </summary>\n        public Collection<ISkillLevel> Skills { get; }\n\n        /// <summary>\n        /// Gets the remapping point associated with that remapping.\n        /// May be null if a remapping was automatically added at the beginning of the training.\n        /// </summary>\n        public RemappingPoint Point { get; }\n\n        /// <summary>\n        /// Gets the best scratchpad after the remapping.\n        /// </summary>\n        public CharacterScratchpad BaseScratchpad { get; }\n\n        /// <summary>\n        /// Gets the best scratchpad after the remapping.\n        /// </summary>\n        public CharacterScratchpad BestScratchpad { get; private set; }\n\n        /// <summary>\n        /// Gets the training duration with the best remapping.\n        /// </summary>\n        public TimeSpan BestDuration { get; private set; }\n\n        /// <summary>\n        /// Gets the base training duration before the remapping.\n        /// </summary>\n        public TimeSpan BaseDuration { get; private set; }\n\n        /// <summary>\n        /// Gets the time when this remapping was done.\n        /// </summary>\n        public TimeSpan StartTime { get; }\n\n        /// <summary>\n        /// Computes an optimized scratchpad, then call <see cref=\"Update\"/>.\n        /// </summary>\n        /// <param name=\"maxDuration\">The max duration to take into account for optimization.</param>\n        /// <returns></returns>\n        public void Optimize(TimeSpan maxDuration)\n        {\n            BestScratchpad = AttributesOptimizer.Optimize(Skills, BaseScratchpad, maxDuration);\n            Update();\n        }\n\n        /// <summary>\n        /// Updates the times and, when any, the associated remapping point.\n        /// </summary>\n        /// <returns></returns>\n        public void Update()\n        {\n            // Optimize\n            BaseDuration = BaseScratchpad.After(Skills).TrainingTime.Subtract(StartTime);\n            BestDuration = BestScratchpad.After(Skills).TrainingTime.Subtract(StartTime);\n\n            // Update the underlying remapping point\n            Point?.SetBaseAttributes(BestScratchpad, BaseScratchpad);\n        }\n\n        /// <summary>\n        /// Gets a string representation of this object.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            StringBuilder builder = new StringBuilder().\n                Append(\"i\").Append(BestScratchpad.Intelligence.Base.ToString(CultureConstants.DefaultCulture)).\n                Append(\" p\").Append(BestScratchpad.Perception.Base.ToString(CultureConstants.DefaultCulture)).\n                Append(\" c\").Append(BestScratchpad.Charisma.Base.ToString(CultureConstants.DefaultCulture)).\n                Append(\" w\").Append(BestScratchpad.Willpower.Base.ToString(CultureConstants.DefaultCulture)).\n                Append(\" m\").Append(BestScratchpad.Memory.Base.ToString(CultureConstants.DefaultCulture));\n\n            return builder.ToString();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/ResearchPoint.cs",
    "content": "using System;\nusing System.Linq;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class ResearchPoint\n    {\n        #region Fields\n\n        private readonly CCPCharacter m_character;\n        private readonly float m_remainderPoints;\n        private long m_stationID;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"src\">The source item</param>\n        /// <param name=\"character\">The owning character</param>\n        internal ResearchPoint(EsiResearchListItem src, CCPCharacter character)\n        {\n            GetAgentInfoByID(src.AgentID);\n\n            AgentID = src.AgentID;\n            Skill = StaticSkills.GetSkillByID(src.SkillID);\n            StartDate = src.ResearchStartDate;\n            PointsPerDay = src.PointsPerDay;\n            m_character = character;\n            m_remainderPoints = src.RemainderPoints;\n            ResearchedItem = GetDatacore();\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the agents ID.\n        /// </summary>\n        public int AgentID { get; }\n\n        /// <summary>\n        /// Gets the agents name.\n        /// </summary>\n        public string AgentName { get; private set; }\n\n        /// <summary>\n        /// Gets the agents level.\n        /// </summary>\n        public int AgentLevel { get; private set; }\n\n        /// <summary>\n        /// Gets the skill of research.\n        /// </summary>\n        public StaticSkill Skill { get; }\n\n        /// <summary>\n        /// Gets the agents field of research.\n        /// </summary>\n        public string Field => Skill.Name;\n\n        /// <summary>\n        /// Gets the research points per day.\n        /// </summary>\n        public double PointsPerDay { get; }\n\n        /// <summary>\n        /// Cets the current accumulated research points.\n        /// </summary>\n        public double CurrentRP => m_remainderPoints + PointsPerDay * DateTime.UtcNow.Subtract(StartDate).TotalDays;\n\n        /// <summary>\n        /// Gets the date the research was started.\n        /// </summary>\n        public DateTime StartDate { get; }\n\n        /// <summary>\n        /// Gets the station where the agent is.\n        /// </summary>\n        public Station Station { get; private set; }\n\n        /// <summary>\n        /// Gets the researched item.\n        /// </summary>\n        public Item ResearchedItem { get; }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Assigns the supplemental info of an agent by its ID.\n        /// </summary>\n        /// <param name=\"id\"></param>\n        private void GetAgentInfoByID(int id)\n        {\n            Agent agent = StaticGeography.AllAgents.FirstOrDefault(x => x.ID == id);\n            if (agent == null)\n                return;\n\n            AgentName = agent.Name;\n            AgentLevel = agent.Level;\n\n            if (agent.Station == null)\n                return;\n\n            m_stationID = agent.Station.ID;\n            UpdateStation();\n        }\n\n        /// <summary>\n        /// Gets the datacore this agent field researches.\n        /// </summary>\n        /// <returns></returns>\n        private Item GetDatacore() => StaticItems.AllItems.FirstOrDefault(item =>\n            item.MarketGroup.BelongsIn(DBConstants.DatacoresMarketGroupID) && item.\n            Prerequisites.Any(prereq => prereq.Skill != null && prereq.Skill == Skill));\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Updates the station.\n        /// </summary>\n        public void UpdateStation()\n        {\n            Station = EveIDToStation.GetIDToStation(m_stationID, m_character);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/SellOrder.cs",
    "content": "using EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// This class represents a sell order.\n    /// </summary>\n    public sealed class SellOrder : MarketOrder\n    {\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        /// <param name=\"issuedFor\">Whether the order was issued for a corporation or a\n        /// character.</param>\n        internal SellOrder(EsiOrderListItem src, IssuedFor issuedFor, CCPCharacter character)\n            : base(src, issuedFor, character)\n        {\n        }\n\n        /// <summary>\n        /// Constructor from an object deserialized from the settings file.\n        /// </summary>\n        /// <param name=\"src\"></param>\n        internal SellOrder(SerializableOrderBase src, CCPCharacter character)\n            : base(src, character)\n        {\n        }\n\n        /// <summary>\n        /// Exports the given object to a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        public override SerializableOrderBase Export() => Export(new SerializableSellOrder());\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Skill.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a skill bound to a character, not only including the skill static data (represented by <see cref=\"StaticSkill\" />)\n    /// but also the number of SP and level the character has. \n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class Skill : IStaticSkill\n    {\n        private const long s_maxLevel = 5L;\n\n        private readonly List<SkillLevel> m_prereqs = new List<SkillLevel>();\n        private long m_currentSkillPoints;\n        // Previous dev of EVEMon made these longs, when patently unnecessary\n        private long m_skillLevel;\n        private long m_level;\n        private bool m_owned;\n        private bool m_known;\n\n        private static Skill s_unknownSkill;\n\n\n        #region Construction, initialization, exportation, updates\n\n        /// <summary>\n        /// Constructor for an unknown skill.\n        /// </summary>\n        private Skill()\n        {\n            StaticData = StaticSkill.UnknownStaticSkill;\n            Group = SkillGroup.UnknownSkillGroup;\n        }\n\n        /// <summary>\n        /// Internal constructor, only used for character creation and updates\n        /// </summary>\n        /// <param name=\"owner\"></param>\n        /// <param name=\"group\"></param>\n        /// <param name=\"skill\"></param>\n        internal Skill(Character owner, SkillGroup group, StaticSkill skill)\n        {\n            Character = owner;\n            StaticData = skill;\n            Group = group;\n        }\n\n        /// <summary>\n        /// Completes the initialization once all the character's skills have been initialized\n        /// </summary>\n        /// <param name=\"skills\">The array of the character's skills.</param>\n        public void CompleteInitialization(Skill[] skills)\n        {\n            m_prereqs.AddRange(StaticData.Prerequisites.Select(staticSkillLevel =>\n                new SkillLevel(skills[staticSkillLevel.Skill.ArrayIndex], staticSkillLevel.Level)));\n        }\n\n        /// <summary>\n        /// Imports and updates from the provided deserialization object\n        /// </summary>\n        /// <param name=\"src\"></param>\n        /// <param name=\"fromCCP\"></param>\n        internal void Import(SerializableCharacterSkill src, bool fromCCP)\n        {\n            m_owned = src.OwnsBook;\n            m_known = fromCCP | src.IsKnown;\n            SkillPoints = src.Skillpoints;\n            LastConfirmedLvl = src.Level;\n            m_level = Math.Min(s_maxLevel, src.Level);\n            ActiveLevel = Math.Min(s_maxLevel, src.ActiveLevel);\n        }\n\n        /// <summary>\n        /// Resets the skill before we reimport data\n        /// </summary>\n        /// <param name=\"importFromCCP\">When true, we will update it with up-to-date data from CCP</param>\n        internal void Reset(bool importFromCCP)\n        {\n            m_known = false;\n            SkillPoints = 0;\n            LastConfirmedLvl = 0;\n            m_level = 0;\n            ActiveLevel = 0;\n\n            // Are we reloading the settings ?\n            if (!importFromCCP)\n                m_owned = false;\n        }\n\n        /// <summary>\n        /// Check if the input level is higher than the current level\n        /// </summary>\n        /// <param name=\"newLevel\"></param>\n        /// <returns></returns>\n        internal bool HasBeenCompleted(QueuedSkill queuedSkill)\n        {\n            return Math.Min(queuedSkill.Level, s_maxLevel) > m_level;\n        }\n\n        /// <summary>\n        /// Updates the skill to match the one from the queue\n        /// </summary>\n        internal void UpdateSkillProgress(QueuedSkill queuedSkill)\n        {\n            m_known = true;\n            if (queuedSkill.IsCompleted)\n            {\n                m_level = Math.Min(queuedSkill.Level, s_maxLevel);\n                SkillPoints = queuedSkill.EndSP;\n            }\n            else\n            {\n                m_level = queuedSkill.Level - 1;\n                SkillPoints = queuedSkill.CurrentSP;\n            }\n        }\n\n        /// <summary>\n        /// Exports the skill to a serialization object\n        /// </summary>\n        /// <returns></returns>\n        internal SerializableCharacterSkill Export()\n        {\n            SerializableCharacterSkill dest = new SerializableCharacterSkill\n            {\n                ID = StaticData.ID,\n                Name = StaticData.Name,\n                Level = m_level,\n                ActiveLevel = ActiveLevel,\n                Skillpoints = m_currentSkillPoints,\n                OwnsBook = IsOwned,\n                IsKnown = m_known\n            };\n\n            return dest;\n        }\n\n        /// <summary>\n        /// Gets or sets true if the skill is owned.\n        /// </summary>\n        public bool IsOwned\n        {\n            get { return m_owned | (HasBookInAssets && !m_known); }\n            set\n            {\n                m_owned = value;\n                EveMonClient.OnCharacterUpdated(Character);\n            }\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether this instance has book in assets.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if this instance has book in assets; otherwise, <c>false</c>.\n        /// </value>\n        public bool HasBookInAssets\n        {\n            get\n            {\n                CCPCharacter ccpCharacter = Character as CCPCharacter;\n                return (ccpCharacter != null) && ccpCharacter.Assets.Any(asset => asset.Item != null && asset.Item.ID == ID);\n            }\n        }\n\n        #endregion\n\n\n        #region Core properties\n\n        /// <summary>\n        /// Gets the character this skill is bound to.\n        /// </summary>\n        public Character Character { get; }\n\n        /// <summary>\n        /// Gets the underlying static data.\n        /// </summary>\n        public StaticSkill StaticData { get; }\n\n        /// <summary>\n        /// Gets this skill's id.\n        /// </summary>\n        public int ID => StaticData.ID;\n\n        /// <summary>\n        /// Gets a zero-based index for skills (allow the use of arrays to optimize computations).\n        /// </summary>\n        public int ArrayIndex => StaticData.ArrayIndex;\n\n        /// <summary>\n        /// Gets this skill's name.\n        /// </summary>\n        public string Name => StaticData.Name;\n\n        /// <summary>\n        /// Gets this skill's description.\n        /// </summary>\n        public string Description => StaticData.Description;\n\n        /// <summary>\n        /// Gets whether this skill is known.\n        /// </summary>\n        public bool IsKnown => m_known || IsTraining;\n\n        /// <summary>\n        /// Gets the skill group this skill is part of.\n        /// </summary>\n        public SkillGroup Group { get; }\n\n        /// <summary>\n        /// Gets true if this is a public skill.\n        /// </summary>\n        public bool IsPublic => StaticData.IsPublic;\n\n        /// <summary>\n        /// Gets the skill cost in ISK.\n        /// </summary>\n        public long Cost => StaticData.Cost;\n\n        /// <summary>\n        /// Gets a formatted display of the ISK cost.\n        /// </summary>\n        public string FormattedCost => StaticData.FormattedCost;\n\n        /// <summary>\n        /// Gets the primary attribute of this skill.\n        /// </summary>\n        public EveAttribute PrimaryAttribute => StaticData.PrimaryAttribute;\n\n        /// <summary>\n        /// Gets the secondary attribute of this skill.\n        /// </summary>\n        public EveAttribute SecondaryAttribute => StaticData.SecondaryAttribute;\n\n        /// <summary>\n        /// Gets the rank of this skill.\n        /// </summary>\n        public long Rank => StaticData.Rank;\n\n        /// <summary>\n        /// Gets the current level of this skill, as gotten from CCP or possibly estimated by EVEMon according to training informations.\n        /// </summary>\n        public long Level\n        {\n            get\n            {\n                m_skillLevel = LastConfirmedLvl;\n                long skillPointsToNextLevel = StaticData.GetPointsRequiredForLevel(Math.Min(LastConfirmedLvl + 1, 5));\n\n                while (skillPointsToNextLevel > 0 && m_currentSkillPoints >= skillPointsToNextLevel && m_skillLevel < 5)\n                {\n                    m_skillLevel++;\n                    skillPointsToNextLevel = StaticData.GetPointsRequiredForLevel(Math.Min(m_skillLevel + 1, 5));\n                }\n\n                return m_skillLevel;\n            }\n        }\n\n\t\t/// <summary>\n\t\t/// Get the last reported active level.\n\t\t/// </summary>\n\t\tpublic long ActiveLevel { get; private set; }\n\n\t\t/// <summary>\n\t\t/// Gets the level gotten from CCP during the last update.\n\t\t/// </summary>\n\t\tpublic long LastConfirmedLvl { get; private set; }\n\n        /// <summary>\n        /// Gets the skill's prerequisites\n        /// </summary>\n        public IEnumerable<SkillLevel> Prerequisites => m_prereqs;\n\n        /// <summary>\n        /// Gets all the prerequisites. I.e, for eidetic memory, it will return <c>{ instant recall IV }</c>.\n        /// The order matches the hierarchy.\n        /// </summary>\n        /// <remarks>Please notice, they may be redundancies.</remarks>\n        public IEnumerable<SkillLevel> AllPrerequisites => StaticData.AllPrerequisites.ToCharacter(Character);\n\n        /// <summary>\n        /// Gets the training speed.\n        /// </summary>\n        public int SkillPointsPerHour => (int)Math.Round(Character?.GetBaseSPPerHour(this) ?? 0);\n\n        #endregion\n\n\n        #region Helper properties and methods\n\n        /// <summary>\n        /// Gets the unknown skill.\n        /// </summary>\n        /// <value>\n        /// The unknown skill.\n        /// </value>\n        public static Skill UnknownSkill => s_unknownSkill ?? (s_unknownSkill = new Skill());\n\n        /// <summary>\n        /// Return current Level in Roman.\n        /// </summary>\n        public string RomanLevel => GetRomanFromInt(Level);\n\n        /// <summary>\n        /// Gets true if the skill is queued.\n        /// </summary>\n        public bool IsQueued\n        {\n            get\n            {\n                CCPCharacter ccpCharacter = Character as CCPCharacter;\n\n                // Current character isn't a CCP character, so can't have a Queue.\n                if (ccpCharacter == null)\n                    return false;\n\n                SkillQueue skillQueue = ccpCharacter.SkillQueue;\n                return skillQueue.Where(x => x.Skill != null).Any(skill => StaticData.ID == skill.Skill.ID);\n            }\n        }\n\n        /// <summary>\n        /// Gets true if the skill is currently in training.\n        /// </summary>\n        public bool IsTraining\n        {\n            get\n            {\n                CCPCharacter ccpCharacter = Character as CCPCharacter;\n                return ccpCharacter != null && ccpCharacter.IsTraining && ccpCharacter.CurrentlyTrainingSkill != null &&\n                       ccpCharacter.CurrentlyTrainingSkill.Skill == this;\n            }\n        }\n\n        /// <summary>\n        /// Gets the current skill points of this skill (possibly estimated for skills in training).\n        /// </summary>\n        public long SkillPoints\n        {\n            get\n            {\n                // Is it in training ? Then we estimate the current SP\n                if (!IsTraining)\n                    return m_currentSkillPoints;\n\n                CCPCharacter ccpCharacter = Character as CCPCharacter;\n                return ccpCharacter?.CurrentlyTrainingSkill.CurrentSP ?? m_currentSkillPoints;\n            }\n            internal set { m_currentSkillPoints = value; }\n        }\n\n        /// <summary>\n        /// Gets the completed fraction (between 0.0 and 1.0).\n        /// </summary>\n        public float FractionCompleted\n        {\n            get\n            {\n                // Lv 5 ? \n                if (m_level == 5)\n                    return 1.0f;\n\n                // Not partially trained ? Then it's 1.0\n                long levelSp = StaticData.GetPointsRequiredForLevel(m_level);\n                if (SkillPoints <= levelSp)\n                    return 0.0f;\n\n                // Partially trained, let's compute the difference with the previous level\n                float nextLevelSp = StaticData.GetPointsRequiredForLevel(m_level + 1);\n                float fraction = (SkillPoints - levelSp) / (nextLevelSp - levelSp);\n\n                return fraction <= 1 ? fraction : fraction % 1;\n            }\n        }\n\n        /// <summary>\n        /// Gets the percentage completion (between 0.0 and 100.0).\n        /// </summary>\n        public double PercentCompleted => FractionCompleted * 100;\n\n        /// <summary>\n        /// Gets whether this skill is partially trained (true) or fully trained (false).\n        /// </summary>\n        public bool IsPartiallyTrained\n        {\n            get\n            {\n                if (Level == 5)\n                    return false;\n\n                bool partialLevel = SkillPoints > StaticData.GetPointsRequiredForLevel(Level),\n                    isNotFullyTrained = GetLeftPointsRequiredToLevel(Level + 1) != 0,\n                    isPartiallyTrained = partialLevel && isNotFullyTrained;\n                return isPartiallyTrained;\n            }\n        }\n\n        /// <summary>\n        /// Gets true if all the prerequisites are met.\n        /// </summary>\n        public bool ArePrerequisitesMet => m_prereqs.AreTrained();\n\n        /// <summary>\n        /// Converts an integer into a roman number.\n        /// </summary>\n        /// <param name=\"number\">Number from 1 to 5.</param>\n        /// <returns>Roman number string.</returns>\n        public static string GetRomanFromInt(long number)\n        {\n            switch (number)\n            {\n                case 1:\n                    return \"I\";\n                case 2:\n                    return \"II\";\n                case 3:\n                    return \"III\";\n                case 4:\n                    return \"IV\";\n                case 5:\n                    return \"V\";\n                default:\n                    return \"(nulla)\";\n            }\n        }\n\n        /// <summary>\n        /// Converts a roman number into an integer.\n        /// </summary>\n        /// <param name=\"r\">Roman number from I to V.</param>\n        /// <returns>Integer number.</returns>\n        public static int GetIntFromRoman(string r)\n        {\n            switch (r)\n            {\n                case \"I\":\n                    return 1;\n                case \"II\":\n                    return 2;\n                case \"III\":\n                    return 3;\n                case \"IV\":\n                    return 4;\n                case \"V\":\n                    return 5;\n                default:\n                    return 0;\n            }\n        }\n\n        /// <summary>\n        /// Calculate the time to train this skill to the next level including prerequisites.\n        /// </summary>\n        /// <returns>Time it will take</returns>\n        public TimeSpan GetLeftTrainingTimeToNextLevel => Level == 5 ? TimeSpan.Zero : GetLeftTrainingTimeToLevel(Level + 1);\n\n        /// <summary>\n        /// Returns the string representation of this skill (the name).\n        /// </summary>\n        /// <returns>\n        /// The name of the skill.\n        /// </returns>\n        public override string ToString() => Name;\n\n        /// <summary>\n        /// Gets this skill's representation for the provided character.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <returns></returns>\n        public Skill ToCharacter(Character character)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            return character.Skills[StaticData.ArrayIndex];\n        }\n\n        #endregion\n\n\n        #region Computations\n\n        /// <summary>\n        /// Calculate the time it will take to train a certain amount of skill points.\n        /// </summary>\n        /// <param name=\"points\">The amount of skill points.</param>\n        /// <returns>Time it will take.</returns>\n        public TimeSpan GetTimeSpanForPoints(long points)\n            => Character?.GetTimeSpanForPoints(this, points) ?? TimeSpan.Zero;\n\n        /// <summary>\n        /// Calculates the cumulative points required to reach the given level of this skill, starting from the current SP.\n        /// </summary>\n        /// <remarks>For a result starting from 0 SP, use the equivalent method on <see cref=\"StaticSkill\"/>.</remarks>\n        /// <param name=\"level\">The level.</param>\n        /// <returns>The required nr. of points.</returns>\n        public long GetLeftPointsRequiredToLevel(long level)\n        {\n            long result = StaticData.GetPointsRequiredForLevel(level) - SkillPoints;\n\n            return result < 0 ? 0 : result;\n        }\n\n        /// <summary>\n        /// Calculates the cumulative points required for the only level of this skill, including the current SP if the level is partially trained.\n        /// </summary>\n        /// <remarks>For a result not including the current SP, use the equivalent method on <see cref=\"StaticSkill\"/>.</remarks>\n        /// <param name=\"level\">The level.</param>\n        /// <returns>The required nr. of points.</returns>\n        private long GetLeftPointsRequiredForLevelOnly(int level)\n        {\n            if (level == 0)\n                return 0;\n\n            long startSP = Math.Max(SkillPoints, StaticData.GetPointsRequiredForLevel(level - 1));\n            long result = StaticData.GetPointsRequiredForLevel(level) - startSP;\n\n            return result < 0 ? 0 : result;\n        }\n\n        /// <summary>\n        /// Calculates the time required to reach the given level of this skill, starting from the current SP.\n        /// </summary>\n        /// <remarks>For a result starting from 0 SP, use the equivalent method on <see cref=\"StaticSkill\"/>.</remarks>\n        /// <param name=\"level\">The level.</param>\n        /// <returns>The required time span.</returns>\n        public TimeSpan GetLeftTrainingTimeToLevel(long level) => GetTimeSpanForPoints(GetLeftPointsRequiredToLevel(level));\n\n        /// <summary>\n        /// Calculates the time required for the only level of this skill, including the current SP if the level is partially trained.\n        /// </summary>\n        /// <remarks>For a result not including the current SP, use the equivalent method on <see cref=\"StaticSkill\"/>.</remarks>\n        /// <param name=\"level\">The level.</param>\n        /// <returns>The required time span.</returns>\n        public TimeSpan GetLeftTrainingTimeForLevelOnly(int level)\n            => GetTimeSpanForPoints(GetLeftPointsRequiredForLevelOnly(level));\n\n        #endregion\n\n\n        #region Conversion operators\n\n        /// <summary>\n        /// Returns the static skill the provided skill is based on.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <returns></returns>\n        public static implicit operator StaticSkill(Skill skill) => skill?.StaticData;\n\n        #endregion\n\n\n        #region IStaticSkill Members\n\n        Collection<StaticSkillLevel> IStaticSkill.Prerequisites => StaticData.Prerequisites;\n\n        StaticSkillGroup IStaticSkill.Group => StaticData.Group;\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/SkillGroup.cs",
    "content": "using System;\nusing System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a skills group\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class SkillGroup : ReadonlyKeyedCollection<string, Skill>\n    {\n        private static SkillGroup s_unknownSkillGroup;\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Constructor for an unknown skill group.\n        /// </summary>\n        private SkillGroup()\n        {\n            StaticData = StaticSkillGroup.UnknownStaticSkillGroup;\n        }\n\n        /// <summary>\n        /// Constructor, only used by SkillCollection.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"src\"></param>\n        internal SkillGroup(Character character, StaticSkillGroup src)\n        {\n            StaticData = src;\n\n            foreach (StaticSkill srcSkill in src)\n            {\n                Items[srcSkill.Name] = new Skill(character, this, srcSkill);\n            }\n        }\n\n        /// <summary>\n        /// Constructor, used to build an non-character SkillGroup, only used by SkillCollection.\n        /// </summary>\n        /// <param name=\"src\">The source.</param>\n        internal SkillGroup(StaticSkillGroup src)\n            : this(null, src)\n        {\n        }\n        \n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the unknown skill group.\n        /// </summary>\n        /// <value>\n        /// The unknown skill group.\n        /// </value>\n        public static SkillGroup UnknownSkillGroup => s_unknownSkillGroup ?? (s_unknownSkillGroup = new SkillGroup());\n\n        /// <summary>\n        /// Gets the static data associated with this group\n        /// </summary>\n        public StaticSkillGroup StaticData { get; }\n\n        /// <summary>\n        /// Gets the group's ID\n        /// </summary>\n        public int ID => StaticData.ID;\n\n        /// <summary>\n        /// Gets the group's name\n        /// </summary>\n        public string Name => StaticData.Name;\n\n        /// <summary>\n        /// Gets the skill with the provided name\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        public Skill this[string name] => GetByKey(name);\n\n        /// <summary>\n        /// Gets a skill by its name\n        /// </summary>\n        /// <param name=\"skillName\"></param>\n        /// <returns></returns>\n        public bool Contains(string skillName) => Items.ContainsKey(skillName);\n\n        /// <summary>\n        /// Gets the total number of SP in this group\n        /// </summary>\n        public long TotalSP => Items.Values.Sum(gs => gs.SkillPoints);\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/SkillLevel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a skill and level tuple.\n    /// </summary>\n    public class SkillLevel : ISkillLevel\n    {\n        /// <summary>\n        /// The skill level bound to only the static skill.\n        /// </summary>\n        private readonly StaticSkillLevel ssl;\n\n        /// <summary>\n        /// Constructor from the skill object.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"level\"></param>\n        public SkillLevel(Skill skill, long level)\n        {\n            Skill = skill;\n            Level = level;\n            ssl = new StaticSkillLevel(this);\n        }\n\n        /// <summary>\n        /// Gets the static skill.\n        /// </summary>\n        StaticSkill ISkillLevel.Skill => Skill;\n\n        /// <summary>\n        /// Gets or sets the skill.\n        /// </summary>\n        public Skill Skill { get; }\n\n        /// <summary>\n        /// Gets or sets the skill level.\n        /// </summary>\n        public long Level { get; }\n\n        /// <summary>\n        /// Gets true if this skill level is already trained.\n        /// </summary>\n        public bool IsTrained => Skill.Level >= Level;\n\n        /// <summary>\n        /// Gets true if this skill level is, in any way, dependent of the provided skill\n        /// level. Checks prerequisites but also same skill's lower levels.\n        /// </summary>\n        /// <param name=\"level\"></param>\n        /// <returns>True if the given item's skill is a prerequisite of this one or if it is a\n        /// lower level of the same skill.</returns>\n        public bool IsDependentOf(ISkillLevel level) => ssl.IsDependentOf(level);\n\n        /// <summary>\n        /// Gets all the dependencies, in a way matching the hierarchical order and without\n        /// redundancies.\n        /// I.e, for eidetic memory II, it will return <c>{ instant recall I,\n        /// instant recall II, instant recall III, instant recall IV,  eidetic memory I,\n        /// eidetic memory II }</c>.\n        /// </summary>\n        public IEnumerable<SkillLevel> AllDependencies => ssl.AllDependencies.ToCharacter(\n            Skill.Character);\n\n        /// <summary>\n        /// Gets a hash code for this object.\n        /// </summary>\n        /// <returns></returns>\n        // 3 bits for level (0 - 5) and the rest are for the skill name\n        public override int GetHashCode() => (Skill.Name.GetHashCode() << 3) | (int)Level;\n\n        /// <summary>\n        /// Implicitly converts from a non-static training.\n        /// </summary>\n        /// <param name=\"training\"></param>\n        /// <returns></returns>\n        public static implicit operator StaticSkillLevel(SkillLevel training) => (training ==\n            null) ? null : new StaticSkillLevel(training.Skill.StaticData, training.Level);\n\n        /// <summary>\n        /// Gets a string representation of this prerequisite.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => $\"{Skill.Name} {Skill.GetRomanFromInt(Level)}\";\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/SkillLevelSet.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Interfaces;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a lisht and fast dictionary for skilllevels, focused on \n    /// </summary>\n    internal sealed class SkillLevelSet<T> : IReadonlyCollection<T>\n        where T : class, ISkillLevel\n    {\n        private readonly T[] m_items;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        public SkillLevelSet()\n        {\n            m_items = new T[StaticSkills.ArrayIndicesCount * 5];\n        }\n\n        /// <summary>\n        /// Gets the number of items in the set\n        /// </summary>\n        public int Count { get; private set; }\n\n        /// <summary>\n        /// Adds the given item in the list\n        /// </summary>\n        /// <param name=\"item\"></param>\n        public void Set(T item)\n        {\n            this[item.Skill.ArrayIndex, item.Level] = item;\n        }\n\n\n        #region Indexors\n\n        /// <summary>\n        /// Gets or sets the item for the given skill array index and level\n        /// </summary>\n        /// <param name=\"skillArrayIndex\"></param>\n        /// <param name=\"level\"></param>\n        /// <returns></returns>\n        public T this[long skillArrayIndex, long level]\n        {\n            get\n            {\n                if (level <= 0 || level > 5)\n                    throw new ArgumentOutOfRangeException(nameof(level), @\"Level must be greater than 0 and lesser or equal than 5.\");\n\n                return m_items[skillArrayIndex * 5 + level - 1];\n            }\n            set\n            {\n                if (level <= 0 || level > 5)\n                    throw new ArgumentOutOfRangeException(nameof(level), @\"Level must be greater than 0 and lesser or equal than 5.\");\n\n                T oldValue = m_items[skillArrayIndex * 5 + level - 1];\n\n                if (value == null || value.Skill == null)\n                    Count--;\n                else if (oldValue == null || oldValue.Skill == null)\n                    Count++;\n                m_items[skillArrayIndex * 5 + level - 1] = value;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the item for the given skill and level\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"level\"></param>\n        /// <returns></returns>\n        public T this[StaticSkill skill, long level]\n        {\n            get { return this[skill.ArrayIndex, level]; }\n            set { this[skill.ArrayIndex, level] = value; }\n        }\n\n        #endregion\n\n\n        #region Contains overloads\n\n        /// <summary>\n        /// Gets true if a matching item is already contained.\n        /// </summary>\n        /// <param name=\"skillArrayindex\"></param>\n        /// <param name=\"level\"></param>\n        /// <returns></returns>\n        public bool Contains(int skillArrayindex, int level)\n        {\n            if (skillArrayindex > m_items.Length)\n                return true;\n\n            T result = this[skillArrayindex, level];\n            return result != null && result.Skill != null;\n        }\n\n        /// <summary>\n        /// Gets true if a matching item is already contained.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"level\"></param>\n        /// <returns></returns>\n        public bool Contains(StaticSkill skill, int level)\n        {\n            if (skill.ArrayIndex > m_items.Length)\n                return true;\n\n            T result = this[skill.ArrayIndex, level];\n            return result != null && result.Skill != null;\n        }\n\n        /// <summary>\n        /// Gets true if a matching item is already contained.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"level\"></param>\n        /// <returns></returns>\n        public bool Contains(Skill skill, int level)\n        {\n            if (skill.ArrayIndex > m_items.Length)\n                return true;\n\n            T result = this[skill.ArrayIndex, level];\n            return result != null && result.Skill != null;\n        }\n\n        /// <summary>\n        /// Gets true if a matching item is already contained.\n        /// </summary>\n        /// <remarks>The comparison is only based on skill array index and level, the two objects may be actually different references</remarks>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        public bool Contains(ISkillLevel item)\n        {\n            if (item.Skill.ArrayIndex > m_items.Length)\n                return true;\n\n            T result = this[item.Skill.ArrayIndex, item.Level];\n            return result != null && result.Skill != null;\n        }\n\n        #endregion\n\n\n        #region Remove overloads\n\n        /// <summary>\n        /// Gets true if a matching item is already contained.\n        /// </summary>\n        /// <param name=\"skillArrayindex\"></param>\n        /// <param name=\"level\"></param>\n        /// <returns></returns>\n        public void Remove(int skillArrayindex, int level)\n        {\n            this[skillArrayindex, level] = default(T);\n        }\n\n        /// <summary>\n        /// Gets true if a matching item is already contained.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <param name=\"level\"></param>\n        /// <returns></returns>\n        public void Remove(StaticSkill skill, int level)\n        {\n            this[skill.ArrayIndex, level] = default(T);\n        }\n\n        /// <summary>\n        /// Remove the matching item\n        /// </summary>\n        /// <remarks>The comparison is only based on skill array index and level, the two objects may be actually different references</remarks>\n        /// <param name=\"item\"></param>\n        /// <returns></returns>\n        public void Remove(ISkillLevel item)\n        {\n            this[item.Skill.ArrayIndex, item.Level] = default(T);\n        }\n\n        #endregion\n\n\n        #region GetLevelsOf() overloads\n\n        /// <summary>\n        /// Gets the levels of the given skill.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <returns></returns>\n        public IEnumerable<T> GetLevelsOf(Skill skill) => GetLevelsOf(skill.ArrayIndex);\n\n        /// <summary>\n        /// Gets the levels of the given skill.\n        /// </summary>\n        /// <param name=\"skill\"></param>\n        /// <returns></returns>\n        public IEnumerable<T> GetLevelsOf(StaticSkill skill) => GetLevelsOf(skill.ArrayIndex);\n\n        /// <summary>\n        /// Gets the levels of the skill represented by the given index.\n        /// </summary>\n        /// <param name=\"skillArrayIndex\"></param>\n        /// <returns></returns>\n        public IEnumerable<T> GetLevelsOf(int skillArrayIndex)\n        {\n            for (int i = 0; i < 5; i++)\n            {\n                T item = m_items[skillArrayIndex * 5 + i];\n                if (item != null && item.Skill != null)\n                    yield return item;\n            }\n        }\n\n        #endregion\n\n\n        #region IEnumerable<T> Members\n\n        private IEnumerable<T> Enumerate() => m_items.Where(item => item != null);\n\n        public IEnumerator<T> GetEnumerator() => Enumerate().GetEnumerator();\n\n        IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)Enumerate()).GetEnumerator();\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/SkillQueue.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Service;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a character's skills queue.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class SkillQueue : ReadonlyCollection<QueuedSkill>\n    {\n        private readonly CCPCharacter m_character;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Default constructor, only used by <see cref=\"Character\"/>\n        /// </summary>\n        /// <param name=\"character\">The character this collection is bound to.</param>\n        internal SkillQueue(CCPCharacter character)\n        {\n            m_character = character;\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n        }\n\n        #endregion\n\n\n        /// <summary>\n        /// Called when the object gets disposed.\n        /// </summary>\n        internal void Dispose()\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n        }\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets true when the character is currently training (non-empty and non-paused skill queue), false otherwise.\n        /// </summary>\n        public bool IsTraining => !IsPaused && Items.Any();\n\n        /// <summary>\n        /// Gets the last completed skill.\n        /// </summary>\n        public QueuedSkill LastCompleted { get; private set; }\n\n        /// <summary>\n        /// Gets the training end time (UTC).\n        /// </summary>\n        public DateTime EndTime => !Items.Any() ? DateTime.UtcNow : Items.Last().EndTime;\n\n        /// <summary>\n        /// Gets the skill currently in training.\n        /// </summary>\n        public QueuedSkill CurrentlyTraining => Items.FirstOrDefault();\n\n        /// <summary>\n        /// Gets true whether the skill queue is currently paused.\n        /// </summary>\n        public bool IsPaused { get; private set; }\n\n        /// <summary>\n        /// Gets a value indicating whether the skill queue has less than the warning threshold worth of training.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if the skill queue has less than the warning threshold worth of training; otherwise, <c>false</c>.\n        /// </value>\n        public bool LessThanWarningThreshold => EndTime <= DateTime.UtcNow.AddDays(Settings.UI.MainWindow.SkillQueueWarningThresholdDays);\n\n        /// <summary>\n        /// Gets the warning threshold time span.\n        /// </summary>\n        /// <value>\n        /// The warning threshold time span.\n        /// </value>\n        public static TimeSpan WarningThresholdTimeSpan => TimeSpan.FromDays(Settings.UI.MainWindow.SkillQueueWarningThresholdDays);\n\n        #endregion\n\n\n        #region Update\n\n        /// <summary>\n        /// When the timer ticks, on every second, we update the skill.\n        /// </summary>\n        private void UpdateOnTimerTick()\n        {\n            if (!IsPaused)\n            {\n                var skillsCompleted = new LinkedList<QueuedSkill>();\n                // Remove all of the completed skills\n                while (Items.Count > 0)\n                {\n                    QueuedSkill skill = Items[0];\n                    Skill skillTrained = skill.Skill;\n                    if (!skill.IsCompleted)\n                    {\n                        // Still training, stop loop and update the skill (ESI does not move skills\n                        // from skill queue to skill list until login)\n                        skillTrained?.UpdateSkillProgress(skill);\n                        break;\n                    }\n                    // Check that it is in fact completed\n                    if (skill.IsCompleted && skillTrained != null && skillTrained.\n                        HasBeenCompleted(skill))\n                    {\n                        // The skill has been completed\n                        skillTrained.UpdateSkillProgress(skill);\n                        skillsCompleted.AddLast(skill);\n                        LastCompleted = skill;\n                        // Send an email alert if configured\n                        if (!Settings.IsRestoring && Settings.Notifications.SendMailAlert)\n                            Emailer.SendSkillCompletionMail(Items, skill, m_character);\n                    }\n                    Items.RemoveAt(0);\n                }\n\n                if (skillsCompleted.Any() && !Settings.IsRestoring)\n                {\n                    // Send a notification if skills were completed\n                    EveMonClient.Notifications.NotifySkillCompletion(m_character,\n                        skillsCompleted);\n                    EveMonClient.OnCharacterQueuedSkillsCompleted(m_character, skillsCompleted);\n                }\n            }\n        }\n\n        #endregion\n\n\n        #region Global Event Handlers\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event\n        /// data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            if (m_character.Monitored)\n                UpdateOnTimerTick();\n        }\n\n        #endregion\n\n\n        #region Importation/Exportation\n\n        /// <summary>\n        /// Generates a deserialization object.\n        /// </summary>\n        /// <returns></returns>\n        internal IEnumerable<SerializableQueuedSkill> Export() => Items.Select(skill => skill.\n            Export());\n\n        /// <summary>\n        /// Imports data from a serialization object.\n        /// </summary>\n        /// <param name=\"serial\"></param>\n        internal void Import(IEnumerable<SerializableQueuedSkill> serial)\n        {\n            IsPaused = false;\n\n            // If the queue is paused, CCP sends empty start and end time\n            // So we base the start time on when the skill queue was started\n            DateTime startTimeWhenPaused = DateTime.UtcNow;\n\n            // Imports the queued skills and checks whether they are paused\n            Items.Clear();\n            foreach (SerializableQueuedSkill serialSkill in serial)\n            {\n                if (serialSkill.IsPaused)\n                    IsPaused = true;\n\n                // Creates the skill queue\n                Items.Add(new QueuedSkill(m_character, serialSkill, ref startTimeWhenPaused));\n            }\n\n            // Update skills with the imported data\n            UpdateOnTimerTick();\n\n            // Skills may have been removed from the queue by the timer tick method - if it is\n            // empty, it is not paused\n            if (!Items.Any())\n                IsPaused = false;\n\n            // Fires the event regarding the character skill queue update\n            EveMonClient.OnCharacterSkillQueueUpdated(m_character);\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets an enumeration of rectangles a skill renders in within a specified rectangle.\n        /// </summary>\n        /// <param name=\"skill\">Skill that exists within the queue</param>\n        /// <param name=\"width\">Width of the canvas</param>\n        /// <param name=\"height\">Height of the canvas</param>\n        /// <returns>\n        /// Rectangle representing the area within the visual\n        /// queue the skill occupies.\n        /// </returns>\n        /// <exception cref=\"System.ArgumentNullException\">skill</exception>\n        public IEnumerable<RectangleF> GetSkillRects(QueuedSkill skill, int width, int height)\n        {\n            skill.ThrowIfNull(nameof(skill));\n\n            List<RectangleF> skillRects = new List<RectangleF>();\n\n            TimeSpan endTimeSpan = EndTime.Subtract(DateTime.UtcNow);\n            double totalSeconds = (endTimeSpan < WarningThresholdTimeSpan\n                ? WarningThresholdTimeSpan\n                : endTimeSpan).TotalSeconds;\n\n            TimeSpan relativeStart = skill.StartTime.Subtract(DateTime.UtcNow);\n            TimeSpan relativeFinish = skill.EndTime.Subtract(DateTime.UtcNow);\n            double start = Math.Floor(relativeStart.TotalSeconds / totalSeconds * width);\n            double afterOneDayFinish = Math.Floor(WarningThresholdTimeSpan.TotalSeconds / totalSeconds * width);\n            double finish = Math.Floor(relativeFinish.TotalSeconds / totalSeconds * width);\n\n            // If the start time is before now set it to zero\n            if (start < 0)\n                start = 0;\n\n            // If the after one day finish time is after finish time set it to finish\n            if (afterOneDayFinish > finish)\n                afterOneDayFinish = finish;\n\n            skillRects.Add(new RectangleF((float)start, 0, (float)(finish - start), height));\n            skillRects.Add(new RectangleF((float)start, 0, (float)(afterOneDayFinish - start), height));\n            skillRects.Add(new RectangleF((float)afterOneDayFinish, 0, (float)(finish - afterOneDayFinish), height));\n\n            return skillRects;\n        }\n\n        /// <summary>\n        /// Gets the width of a one day skill queue.\n        /// </summary>\n        /// <param name=\"width\">The width.</param>\n        /// <returns></returns>\n        public double GetOneDaySkillQueueWidth(int width)\n        {\n            double totalSeconds = EndTime.Subtract(DateTime.UtcNow).TotalSeconds;\n            return  Math.Floor(WarningThresholdTimeSpan.TotalSeconds / totalSeconds * width);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/Standing.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class Standing\n    {\n        public event EventHandler StandingImageUpdated;\n\n\n        #region Fields\n\n        private readonly long m_entityID;\n        private readonly Character m_character;\n        private string m_entityName;\n        private Image m_image;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"src\"></param>\n        internal Standing(Character character, EsiStandingsListItem src)\n        {\n            m_character = character;\n\n            m_entityID = src.ID;\n            m_entityName = EveMonConstants.UnknownText;\n            StandingValue = src.StandingValue;\n            Group = src.Group;\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        public string EntityName => m_entityName.IsEmptyOrUnknown() ?\n            (m_entityName = EveIDToName.GetIDToName(m_entityID)) : m_entityName;\n\n        /// <summary>\n        /// Gets or sets the standing value.\n        /// </summary>\n        /// <value>The standing value.</value>\n        public double StandingValue { get; }\n\n        /// <summary>\n        /// Gets or sets the group.\n        /// </summary>\n        /// <value>The group.</value>\n        public StandingGroup Group { get; }\n\n        /// <summary>\n        /// Gets or sets the entity image.\n        /// </summary>\n        /// <value>The entity image.</value>\n        public Image EntityImage\n        {\n            get\n            {\n                if (m_image != null)\n                    return m_image;\n\n                GetImageAsync().ConfigureAwait(false);\n\n                return m_image ?? (m_image = GetDefaultImage());\n            }\n        }\n\n        /// <summary>\n        /// Gets the effective standing.\n        /// </summary>\n        /// <value>The effective standing.</value>\n        public double EffectiveStanding\n        {\n            get\n            {\n                int skillLevel = m_character.LastConfirmedSkillLevel((StandingValue < 0) ?\n                    DBConstants.DiplomacySkillID : DBConstants.ConnectionsSkillID);\n                return StandingValue + (10.0 - StandingValue) * (skillLevel * 0.04);\n            }\n        }\n\n        /// <summary>\n        /// Gets the standing status.\n        /// </summary>\n        /// <value>The status.</value>\n        public static StandingStatus Status(double standing)\n        {\n            if (standing <= -5.5)\n                return StandingStatus.Terrible;\n\n            if (standing <= -0.5)\n                return StandingStatus.Bad;\n\n            if (standing < 0.5)\n                return StandingStatus.Neutral;\n\n            return standing < 5.5 ? StandingStatus.Good : StandingStatus.Excellent;\n        }\n\n        /// <summary>\n        /// Gets the standing image.\n        /// </summary>\n        /// <param name=\"standing\">The standing.</param>\n        /// <returns></returns>\n        public static Image GetStandingImage(int standing)\n        {\n            if (standing <= -5.5)\n                return Properties.Resources.TerribleStanding;\n\n            if (standing <= -0.5)\n                return Properties.Resources.BadStanding;\n\n            if (standing < 0.5)\n                return Properties.Resources.NeutralStanding;\n\n            return standing < 5.5 ? Properties.Resources.GoodStanding : Properties.Resources.ExcellentStanding;\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the entity image.\n        /// </summary>\n        private async Task GetImageAsync()\n        {\n            Image img = await ImageService.GetImageAsync(GetImageUrl()).ConfigureAwait(false);\n            if (img != null)\n            {\n                m_image = img;\n\n                // Notify the subscriber that we got the image\n                StandingImageUpdated?.ThreadSafeInvoke(this, EventArgs.Empty);\n            }\n        }\n\n        /// <summary>\n        /// Gets the default image.\n        /// </summary>\n        /// <returns></returns>\n        private Image GetDefaultImage()\n        {\n            switch (Group)\n            {\n                case StandingGroup.Agents:\n                    return Properties.Resources.DefaultCharacterImage32;\n                case StandingGroup.NPCCorporations:\n                    return Properties.Resources.DefaultCorporationImage32;\n                case StandingGroup.Factions:\n                    return Properties.Resources.DefaultAllianceImage32;\n            }\n            return new Bitmap(32, 32);\n        }\n\n        /// <summary>\n        /// Gets the image URL.\n        /// </summary>\n        private Uri GetImageUrl()\n        {\n            Uri uri;\n            switch (Group)\n            {\n            case StandingGroup.NPCCorporations:\n                uri = ImageHelper.GetCorporationImageURL(m_entityID);\n                break;\n            case StandingGroup.Factions:\n                uri = ImageHelper.GetAllianceImageURL(m_entityID);\n                break;\n            case StandingGroup.Agents:\n            default:\n                uri = ImageHelper.GetPortraitUrl(m_entityID);\n                break;\n            }\n            return uri;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/UpcomingCalendarEvent.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Net;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class UpcomingCalendarEvent\n    {\n        #region Fields\n\n        private ResponseParams m_attendResponse;\n        private readonly CCPCharacter m_ccpCharacter;\n        private readonly List<CalendarEventAttendee> m_eventAttendees;\n        private readonly long m_eventID;\n        private string m_ownerName;\n        private bool m_queryPending;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor from the API.\n        /// </summary>\n        /// <param name=\"ccpCharacter\">The CCP character.</param>\n        /// <param name=\"src\">The source.</param>\n        internal UpcomingCalendarEvent(CCPCharacter ccpCharacter, EsiAPICalendarEvent src)\n        {\n            m_ccpCharacter = ccpCharacter;\n\n            m_attendResponse = null;\n            m_eventID = src.EventID;\n            OwnerID = src.OwnerID;\n            m_ownerName = EveIDToName.GetIDToName(OwnerID);\n            EventTitle = src.EventTitle;\n            EventText = src.EventText;\n            Duration = src.Duration;\n            Importance = src.Importance != 0;\n            Response = src.Response;\n            EventDate = src.EventDate;\n            m_eventAttendees = new List<CalendarEventAttendee>();\n        }\n\n        #endregion\n\n\n        #region Public Properties\n\n        /// <summary>\n        /// Gets the owner ID.\n        /// </summary>\n        public long OwnerID { get; }\n\n        /// <summary>\n        /// Gets the name of the owner.\n        /// </summary>\n        public string OwnerName => m_ownerName.IsEmptyOrUnknown() ? (m_ownerName =\n            EveIDToName.GetIDToName(OwnerID)) : m_ownerName;\n\n        /// <summary>\n        /// Gets the event title.\n        /// </summary>\n        public string EventTitle { get; }\n\n        /// <summary>\n        /// Gets the event text.\n        /// </summary>\n        public string EventText { get; }\n\n        /// <summary>\n        /// Gets the duration.\n        /// </summary>\n        public int Duration { get; }\n\n        /// <summary>\n        /// Gets a value indicating whether this <see cref=\"UpcomingCalendarEvent\"/> is important.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if this <see cref=\"UpcomingCalendarEvent\"/> is important; otherwise, <c>false</c>.\n        /// </value>\n        public bool Importance { get; }\n\n        /// <summary>\n        /// Gets the response.\n        /// </summary>\n        public string Response { get; }\n\n        /// <summary>\n        /// Gets the event date.\n        /// </summary>\n        public DateTime EventDate { get; }\n\n        /// <summary>\n        /// Gets the event attendees.\n        /// </summary>\n        public IEnumerable<CalendarEventAttendee> Attendees => m_eventAttendees;\n\n        #endregion\n\n\n        #region Querying\n\n        /// <summary>\n        /// Gets the attendees.\n        /// </summary>\n        public void GetEventAttendees()\n        {\n            if (!m_queryPending && !EsiErrors.IsErrorCountExceeded)\n            {\n                var apiKey = m_ccpCharacter.Identity.FindAPIKeyWithAccess(\n                    ESIAPICharacterMethods.CalendarEventAttendees);\n                m_queryPending = true;\n                if (apiKey != null)\n                    EveMonClient.APIProviders.CurrentProvider.QueryEsi\n                        <EsiAPICalendarEventAttendees>(ESIAPICharacterMethods.\n                        CalendarEventAttendees, OnCalendarEventAttendeesDownloaded,\n                        new ESIParams(m_attendResponse, apiKey.AccessToken)\n                        {\n                            ParamOne = m_ccpCharacter.CharacterID,\n                            ParamTwo = m_eventID\n                        });\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried calendar event attendees.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private void OnCalendarEventAttendeesDownloaded(EsiResult<EsiAPICalendarEventAttendees>\n            result, object ignore)\n        {\n            m_queryPending = false;\n            m_attendResponse = result.Response;\n            // Notify if an error occured\n            if (m_ccpCharacter.ShouldNotifyError(result, ESIAPICharacterMethods.\n                    CalendarEventAttendees))\n                EveMonClient.Notifications.NotifyCharacterCalendarEventAttendeesError(\n                    m_ccpCharacter, result);\n            if (result.HasData && !result.HasError && result.Result.Count > 0)\n            {\n                var attendees = result.Result.Select(attendee => new CalendarEventAttendee(\n                    attendee));\n                m_eventAttendees.Clear();\n                m_eventAttendees.AddRange(attendees);\n                EveMonClient.OnCharacterCalendarEventAttendeesDownloaded(m_ccpCharacter);\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/UriCharacter.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Models\n{\n    /// <summary>\n    /// Represents a character bound to an uri (pointing at a character sheet) rather than CCP API.\n    /// </summary>\n    public sealed class UriCharacter : Character\n    {\n        public const int BlankCharacterID = 9999999;\n        private Uri m_uri;\n\n        /// <summary>\n        /// Default constructor for new uri characters.\n        /// </summary>\n        /// <param name=\"identity\">The identitiy for this character</param>\n        /// <param name=\"uri\">The uri the provided deserialization object was acquired from</param>\n        /// <param name=\"source\">A deserialization object for characters</param>\n        internal UriCharacter(CharacterIdentity identity, Uri uri, CCPAPIResult<SerializableAPICharacterSheet> source)\n            : base(identity, Guid.NewGuid())\n        {\n            m_uri = uri;\n            Import(source);\n        }\n\n        /// <summary>\n        /// Exported character constructor.\n        /// </summary>\n        /// <param name=\"identity\">The identitiy for this character</param>\n        /// <param name=\"uri\">The uri the provided deserialization object was acquired from</param>\n        /// <param name=\"serial\">The serial.</param>\n        internal UriCharacter(CharacterIdentity identity, Uri uri, SerializableSettingsCharacter serial)\n            : base(identity, Guid.NewGuid())\n        {\n            m_uri = uri;\n            Import(serial);\n        }\n\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        /// <param name=\"identity\"></param>\n        /// <param name=\"serial\"></param>\n        internal UriCharacter(CharacterIdentity identity, SerializableUriCharacter serial)\n            : base(identity, serial.Guid)\n        {\n            Import(serial);\n        }\n\n        /// <summary>\n        /// Releases unmanaged and - optionally - managed resources\n        /// </summary>\n        internal override void Dispose()\n        {\n        }\n\n        /// <summary>\n        /// Gets an adorned name, with (file), (url) or (cached) labels.\n        /// </summary>\n        public override string AdornedName => $\"{Name} {(m_uri.IsFile ? \"(file)\" : \"(url)\")}\";\n\n        /// <summary>\n        /// Gets or sets the source's name.\n        /// By default, it's the character's name\n        /// but it may be overriden to help distinct tabs on the main window.\n        /// </summary>\n        public Uri Uri\n        {\n            get { return m_uri; }\n            set\n            {\n                if (m_uri == value)\n                    return;\n\n                m_uri = value;\n                EveMonClient.OnCharacterUpdated(this);\n            }\n        }\n\n        /// <summary>\n        /// Create a serializable character sheet for this character.\n        /// </summary>\n        /// <returns></returns>\n        public override SerializableSettingsCharacter Export()\n        {\n            SerializableUriCharacter serial = new SerializableUriCharacter();\n            Export(serial);\n\n            serial.Address = m_uri.AbsoluteUri;\n            return serial;\n        }\n\n        /// <summary>\n        /// Imports data from a serialization object.\n        /// </summary>\n        /// <param name=\"serial\">The serial.</param>\n        /// <exception cref=\"System.ArgumentNullException\">serial</exception>\n        public void Import(SerializableUriCharacter serial)\n        {\n            serial.ThrowIfNull(nameof(serial));\n\n            Import((SerializableSettingsCharacter)serial);\n\n            m_uri = new Uri(serial.Address);\n\n            EveMonClient.OnCharacterUpdated(this);\n        }\n\n        /// <summary>\n        /// Updates this character with the given informations\n        /// </summary>\n        /// <param name=\"identity\"></param>\n        /// <param name=\"uri\"></param>\n        /// <param name=\"result\"></param>\n        internal void Update(CharacterIdentity identity, Uri uri, CCPAPIResult<SerializableAPICharacterSheet> result)\n        {\n            CharacterID = identity.CharacterID;\n            Identity = identity;\n            m_uri = uri;\n            Import(result);\n        }\n\n        /// <summary>\n        /// Updates this character with the given informations.\n        /// </summary>\n        /// <param name=\"identity\"></param>\n        /// <param name=\"uri\"></param>\n        /// <param name=\"result\"></param>\n        internal void Update(CharacterIdentity identity, Uri uri, SerializableCCPCharacter result)\n        {\n            CharacterID = identity.CharacterID;\n            Identity = identity;\n            m_uri = uri;\n            Import(result);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Models/WalletJournal.cs",
    "content": "using System;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Service;\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class WalletJournal\n    {\n        private readonly long m_taxReceiverID;\n        private readonly long m_ownerID1;\n        private readonly long m_ownerID2;\n        private readonly int m_refTypeID;\n        private string m_taxReceiver;\n        private string m_ownerName1;\n        private string m_ownerName2;\n        private string m_refType;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"WalletJournal\" /> class.\n        /// </summary>\n        /// <param name=\"src\">The SRC.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        internal WalletJournal(SerializableWalletJournalListItem src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            m_refTypeID = src.RefTypeID;\n            m_taxReceiverID = src.TaxReceiverID;\n\n            ID = src.ID;\n            Date = src.Date;\n            Amount = src.Amount;\n            Balance = src.Balance;\n            m_ownerID1 = src.OwnerID1;\n            m_ownerName1 = EveIDToName.GetIDToName(m_ownerID1);\n            m_ownerID2 = src.OwnerID2;\n            m_ownerName2 = EveIDToName.GetIDToName(m_ownerID2);\n            TaxAmount = src.TaxAmount;\n\n            Reason = ParseReason(src.Reason ?? string.Empty);\n            m_refType = EveRefType.GetRefTypeIDToName(src.RefTypeID);\n            m_taxReceiver = GetTaxReceiver();\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the ID.\n        /// </summary>\n        public long ID { get; private set; }\n\n        /// <summary>\n        /// Gets the date.\n        /// </summary>\n        public DateTime Date { get; private set; }\n\n        /// <summary>\n        /// Gets the amount.\n        /// </summary>\n        public decimal Amount { get; private set; }\n\n        /// <summary>\n        /// Gets the balance.\n        /// </summary>\n        public decimal Balance { get; private set; }\n\n        /// <summary>\n        /// Gets the reason.\n        /// </summary>\n        public string Reason { get; private set; }\n\n        /// <summary>\n        /// Gets the issuer.\n        /// </summary>\n        public string Issuer => m_ownerName1.IsEmptyOrUnknown() ?\n            (m_ownerName1 = EveIDToName.GetIDToName(m_ownerID1)) : m_ownerName1;\n\n        /// <summary>\n        /// Gets the recipient.\n        /// </summary>\n        public string Recipient => m_ownerName2.IsEmptyOrUnknown() ?\n            (m_ownerName2 = EveIDToName.GetIDToName(m_ownerID2)) : m_ownerName2;\n\n        /// <summary>\n        /// Gets the tax amount.\n        /// </summary>\n        public decimal TaxAmount { get; private set; }\n\n        /// <summary>\n        /// Gets the type.\n        /// </summary>\n        public string Type => m_refType.IsEmptyOrUnknown() ? (m_refType = EveRefType.\n            GetRefTypeIDToName(m_refTypeID)) : m_refType;\n\n        /// <summary>\n        /// Gets the tax receiver.\n        /// </summary>\n        public string TaxReceiver => m_taxReceiver.IsEmptyOrUnknown() ? (m_taxReceiver =\n            GetTaxReceiver()) : m_taxReceiver;\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the tax receiver.\n        /// </summary>\n        /// <returns></returns>\n        private string GetTaxReceiver() => (m_taxReceiverID == 0) ? string.Empty :\n            EveIDToName.GetIDToName(m_taxReceiverID);\n\n        /// <summary>\n        /// Parses the reason text.\n        /// </summary>\n        /// <param name=\"reasonText\">The reason text.</param>\n        /// <returns></returns>\n        // If RefType is of type \"Bounty Prizes\" return a generic message,\n        // otherwise clean the header of a player entered text if it exists\n        private string ParseReason(string reasonText) => m_refTypeID == 85 ?\n            \"Killing NPC entities\" : reasonText.Replace(\"DESC: \", string.Empty);\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Models/WalletTransaction.cs",
    "content": "using System;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Service;\n\n\nnamespace EVEMon.Common.Models\n{\n    public sealed class WalletTransaction\n    {\n        private readonly CCPCharacter m_character;\n        private readonly long m_stationID;\n        private readonly long m_clientID;\n        private string m_clientName;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"WalletTransaction\" /> class.\n        /// </summary>\n        /// <param name=\"src\">The source wallet transaction.</param>\n        /// <param name=\"m_character\">The owning character.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        internal WalletTransaction(SerializableWalletTransactionsListItem src,\n            CCPCharacter character)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            ID = src.ID;\n            JournalID = src.JournalTransactionID;\n            Date = src.TransactionDate;\n            ItemName = src.TypeName;\n            Quantity = src.Quantity;\n            Price = src.Price;\n            m_clientID = src.ClientID;\n            m_clientName = EveIDToName.GetIDToName(m_clientID);\n            TransactionType = src.TransactionType == \"buy\" ? TransactionType.Buy : TransactionType.Sell;\n            TransactionFor = src.TransactionFor == \"personal\" ? IssuedFor.Character : IssuedFor.Corporation;\n            m_stationID = src.StationID;\n            m_character = character;\n            UpdateStation();\n\n            Credit = GetCredit();\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the ID.\n        /// </summary>\n        public long ID { get; }\n\n        /// <summary>\n        /// Gets the journal ID.\n        /// </summary>\n        public long JournalID { get; }\n\n        /// <summary>\n        /// Gets the date.\n        /// </summary>\n        public DateTime Date { get; }\n\n        /// <summary>\n        /// Gets the name of the item.\n        /// </summary>\n        /// <value>\n        /// The name of the item.\n        /// </value>\n        public string ItemName { get; }\n\n        /// <summary>\n        /// Gets the quantity.\n        /// </summary>\n        public long Quantity { get; }\n\n        /// <summary>\n        /// Gets the price.\n        /// </summary>\n        public decimal Price { get; }\n\n        /// <summary>\n        /// Gets the name of the client.\n        /// </summary>\n        /// <value>\n        /// The name of the client.\n        /// </value>\n        public string ClientName => m_clientName.IsEmptyOrUnknown() ?\n            (m_clientName = EveIDToName.GetIDToName(m_clientID)) : m_clientName;\n\n        /// <summary>\n        /// Gets the station.\n        /// </summary>\n        public Station Station { get; private set; }\n\n        /// <summary>\n        /// Gets the type of the transaction.\n        /// </summary>\n        /// <value>\n        /// The type of the transaction.\n        /// </value>\n        public TransactionType TransactionType { get; }\n\n        /// <summary>\n        /// Gets the transaction for.\n        /// </summary>\n        public IssuedFor TransactionFor { get; }\n\n        /// <summary>\n        /// Gets the credit.\n        /// </summary>\n        public decimal Credit { get; }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        private decimal GetCredit()\n        {\n\n            decimal credit = Quantity * Price;\n            return TransactionType == TransactionType.Buy ? -credit : credit;\n        }\n\n        #endregion\n\n\n        #region Public Methods\n\n        /// <summary>\n        /// Updates the station.\n        /// </summary>\n        public void UpdateStation()\n        {\n            Station = EveIDToStation.GetIDToStation(m_stationID, m_character);\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Net/DownloadResult.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.Net\n{\n    /// <summary>\n    /// Container class to return the result of an asynchronous string download\n    /// </summary>\n    public class DownloadResult<T>\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"DownloadResult{T}\"/> class.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        /// <param name=\"error\">The error.</param>\n        /// <param name=\"response\">The server response data.</param>\n        public DownloadResult(T result, HttpWebClientServiceException error,\n            ResponseParams response = null)\n        {\n            Error = error;\n            Result = result;\n            Response = response ?? new ResponseParams(0);\n        }\n\n        /// <summary>\n        /// Gets the response data.\n        /// </summary>\n        /// <value>The response data.</value>\n        public ResponseParams Response { get; }\n\n        /// <summary>\n        /// Gets or sets the result.\n        /// </summary>\n        /// <value>The result.</value>\n        public T Result { get; }\n\n        /// <summary>\n        /// Gets or sets the error.\n        /// </summary>\n        /// <value>The error.</value>\n        public HttpWebClientServiceException Error { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Net/ExceptionMessages.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Common.Net {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class ExceptionMessages {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal ExceptionMessages() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Common.Net.ExceptionMessages\", typeof(ExceptionMessages).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A request to {0} failed because EVEMon was unable to connect to the server. Please check your network and/or firewall settings..\n        /// </summary>\n        internal static string ConnectFailure {\n            get {\n                return ResourceManager.GetString(\"ConnectFailure\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A file request to {0} failed because the file could not be written..\n        /// </summary>\n        internal static string FileException {\n            get {\n                return ResourceManager.GetString(\"FileException\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A request to {0} was not permitted..\n        /// </summary>\n        internal static string Forbidden {\n            get {\n                return ResourceManager.GetString(\"Forbidden\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to An Image request  to {0} failed because the server did not return a valid image..\n        /// </summary>\n        internal static string ImageException {\n            get {\n                return ResourceManager.GetString(\"ImageException\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A request to {0} failed because the name resolver service could not resolve the host name. Please check your network settings..\n        /// </summary>\n        internal static string NameResolutionFailure {\n            get {\n                return ResourceManager.GetString(\"NameResolutionFailure\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The proxy server at {0} rejected a request to {1}. Please verify that you have specified the correct user name and password..\n        /// </summary>\n        internal static string ProxyAuthenticationFailure {\n            get {\n                return ResourceManager.GetString(\"ProxyAuthenticationFailure\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The proxy server at {0} rejected a request to {1}. Please verify that you have specified the correct user name and password. Requests have been temporarily disabled until your proxy settings have been updated..\n        /// </summary>\n        internal static string ProxyAuthenticationFailureDisabledRequests {\n            get {\n                return ResourceManager.GetString(\"ProxyAuthenticationFailureDisabledRequests\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The name resolver service could not resolve the proxy host name &quot;{0}&quot;. Please verify that you have specified the correct proxy server, or check your network settings..\n        /// </summary>\n        internal static string ProxyNameResolutionFailure {\n            get {\n                return ResourceManager.GetString(\"ProxyNameResolutionFailure\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The maximum number of redirects was exceeded while attempting to retrieve data from {0}..\n        /// </summary>\n        internal static string RedirectsExceeded {\n            get {\n                return ResourceManager.GetString(\"RedirectsExceeded\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A request to {0} was not permitted by the proxy at {1}..\n        /// </summary>\n        internal static string RequestProhibitedByProxy {\n            get {\n                return ResourceManager.GetString(\"RequestProhibitedByProxy\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A request to {0} failed because requests have been temporarily disabled..\n        /// </summary>\n        internal static string RequestsDisabled {\n            get {\n                return ResourceManager.GetString(\"RequestsDisabled\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The server at {0} returned an error. The full response returned by the server was: .\n        /// </summary>\n        internal static string ServerError {\n            get {\n                return ResourceManager.GetString(\"ServerError\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A request to {0} failed because no response was received during the timeout period..\n        /// </summary>\n        internal static string Timeout {\n            get {\n                return ResourceManager.GetString(\"Timeout\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to A request to {0} failed with status: {1}..\n        /// </summary>\n        internal static string UnknownException {\n            get {\n                return ResourceManager.GetString(\"UnknownException\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to An Xml request to {0} failed because the server did not return a valid Xml document.\n        /// </summary>\n        internal static string XmlException {\n            get {\n                return ResourceManager.GetString(\"XmlException\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Net/ExceptionMessages.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ConnectFailure\" xml:space=\"preserve\">\n    <value>A request to {0} failed because EVEMon was unable to connect to the server. Please check your network and/or firewall settings.</value>\n    <comment>{0} - the host name of the request.</comment>\n  </data>\n  <data name=\"FileException\" xml:space=\"preserve\">\n    <value>A file request to {0} failed because the file could not be written.</value>\n    <comment>{0} - the host name of the request</comment>\n  </data>\n  <data name=\"Forbidden\" xml:space=\"preserve\">\n    <value>A request to {0} was not permitted.</value>\n    <comment>{0} - the host name of the request</comment>\n  </data>\n  <data name=\"ImageException\" xml:space=\"preserve\">\n    <value>An Image request  to {0} failed because the server did not return a valid image.</value>\n    <comment>{0} - the host name of the request</comment>\n  </data>\n  <data name=\"NameResolutionFailure\" xml:space=\"preserve\">\n    <value>A request to {0} failed because the name resolver service could not resolve the host name. Please check your network settings.</value>\n    <comment>{0} - the host name of the request.</comment>\n  </data>\n  <data name=\"ProxyAuthenticationFailure\" xml:space=\"preserve\">\n    <value>The proxy server at {0} rejected a request to {1}. Please verify that you have specified the correct user name and password.</value>\n    <comment>{0} - the custom proxy server specified in Settings. {1} - the host name of the request</comment>\n  </data>\n  <data name=\"ProxyAuthenticationFailureDisabledRequests\" xml:space=\"preserve\">\n    <value>The proxy server at {0} rejected a request to {1}. Please verify that you have specified the correct user name and password. Requests have been temporarily disabled until your proxy settings have been updated.</value>\n    <comment>{0} - the custom proxy server specified in Settings. {1} - the host name of the request</comment>\n  </data>\n  <data name=\"ProxyNameResolutionFailure\" xml:space=\"preserve\">\n    <value>The name resolver service could not resolve the proxy host name \"{0}\". Please verify that you have specified the correct proxy server, or check your network settings.</value>\n    <comment>{0} - the custom proxy server specified in Settings.</comment>\n  </data>\n  <data name=\"RedirectsExceeded\" xml:space=\"preserve\">\n    <value>The maximum number of redirects was exceeded while attempting to retrieve data from {0}.</value>\n    <comment>{0} - the host name of the request</comment>\n  </data>\n  <data name=\"RequestProhibitedByProxy\" xml:space=\"preserve\">\n    <value>A request to {0} was not permitted by the proxy at {1}.</value>\n    <comment>{0} - the host name of the request. {1} - the proxy server specified in Settings.</comment>\n  </data>\n  <data name=\"RequestsDisabled\" xml:space=\"preserve\">\n    <value>A request to {0} failed because requests have been temporarily disabled.</value>\n    <comment>{0} - the host name of the request.</comment>\n  </data>\n  <data name=\"ServerError\" xml:space=\"preserve\">\n    <value>The server at {0} returned an error. The full response returned by the server was: </value>\n    <comment>{0} - the host name of the request. </comment>\n  </data>\n  <data name=\"Timeout\" xml:space=\"preserve\">\n    <value>A request to {0} failed because no response was received during the timeout period.</value>\n    <comment>{0} - the host name of the request.</comment>\n  </data>\n  <data name=\"UnknownException\" xml:space=\"preserve\">\n    <value>A request to {0} failed with status: {1}.</value>\n    <comment>{0} - the host name of the request. {1} - the Exception Status returned.</comment>\n  </data>\n  <data name=\"XmlException\" xml:space=\"preserve\">\n    <value>An Xml request to {0} failed because the server did not return a valid Xml document</value>\n    <comment>{0} - the host name of the request</comment>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Net/HttpClientServiceRequest.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Http;\nusing System.Net.Http.Headers;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Net\n{\n    internal class HttpClientServiceRequest\n    {\n        private static TimeSpan s_timeout;\n        private Uri m_url;\n        private Uri m_referrer;\n        private string m_accept;\n        private int m_redirectsRemaining;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"HttpClientServiceRequest\"/> class.\n        /// </summary>\n        public HttpClientServiceRequest()\n        {\n            m_redirectsRemaining = HttpWebClientServiceState.MaxRedirects;\n\n            // Pull the timeout from the settings\n            TimeSpan timeoutSetting = TimeSpan.FromSeconds(Settings.Updates.HttpTimeout);\n            s_timeout = (timeoutSetting < TimeSpan.FromSeconds(1) || timeoutSetting >\n                TimeSpan.FromMinutes(5)) ? TimeSpan.FromSeconds(20) : timeoutSetting;\n        }\n\n        /// <summary>\n        /// Gets the base URL.\n        /// </summary>\n        /// <value>\n        /// The base URL.\n        /// </value>\n        public Uri BaseUrl => m_url;\n\n        /// <summary>\n        /// Asynchronously sends a request to the specified url.\n        /// </summary>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"param\">The request parameters.</param>\n        /// <param name=\"accept\">The content types to accept.</param>\n        /// <returns></returns>\n        public async Task<HttpResponseMessage> SendAsync(Uri url, RequestParams param,\n            string accept)\n        {\n            var newParams = param ?? new RequestParams();\n            while (true)\n            {\n                // Store params\n                m_url = url;\n                m_accept = accept;\n                HttpResponseMessage response = null;\n                try\n                {\n                    var request = GetHttpRequest(newParams);\n                    response = await GetHttpResponseAsync(GetHttpClientHandler(), request).\n                        ConfigureAwait(false);\n                    EnsureSuccessStatusCode(response);\n                }\n                catch (HttpWebClientServiceException)\n                {\n                    // Seems pointless but prevents the exception from getting wrapped again\n                    throw;\n                }\n                catch (HttpRequestException ex)\n                {\n                    // Strip a layer of exceptions if a web exception occurred\n                    if (ex.InnerException is WebException)\n                        throw HttpWebClientServiceException.HttpWebClientException(url,\n                            ex.InnerException);\n                    // Throw default exception if no response\n                    if (response == null)\n                        throw HttpWebClientServiceException.Exception(url, ex);\n                    // Throw for 404, 500, etc.\n                    if (response.StatusCode != HttpStatusCode.Redirect && response.\n                            StatusCode != HttpStatusCode.MovedPermanently)\n                        throw HttpWebClientServiceException.HttpWebClientException(url, ex,\n                            response.StatusCode);\n                }\n                catch (TaskCanceledException ex)\n                {\n                    // We throw a request timeout if the task gets cancelled due to the\n                    // timeout setting\n                    throw HttpWebClientServiceException.HttpWebClientException(url,\n                        new HttpRequestException(ex.Message), HttpStatusCode.RequestTimeout);\n                }\n                catch (Exception ex)\n                {\n                    throw HttpWebClientServiceException.Exception(url, ex);\n                }\n                if (response.StatusCode != HttpStatusCode.Redirect && response.StatusCode !=\n                        HttpStatusCode.MovedPermanently)\n                    return response;\n\n                // When the address has been redirected, connects to the redirection\n                Uri target = response.Headers.Location;\n                response.Dispose();\n                if (m_redirectsRemaining-- <= 0)\n                    throw HttpWebClientServiceException.RedirectsExceededException(m_url);\n                m_referrer = m_url;\n                m_url = new Uri(m_url, target);\n                url = m_url;\n            }\n        }\n\n        private static void EnsureSuccessStatusCode(HttpResponseMessage response)\n        {\n            var code = response.StatusCode;\n            if ((int)code < 100)\n            {\n                response.StatusCode = HttpStatusCode.OK;\n                response.ReasonPhrase = \"OK\";\n            } else if (code != HttpStatusCode.NotModified)\n                // Allow \"not modified\" so that it will be detected by the front end\n                response.EnsureSuccessStatusCode();\n        }\n\n        /// <summary>\n        /// Gets the HTTP client handler.\n        /// </summary>\n        /// <returns></returns>\n        private static HttpClientHandler GetHttpClientHandler() => new HttpClientHandler\n        {\n            AllowAutoRedirect = false,\n            MaxAutomaticRedirections = HttpWebClientServiceState.MaxRedirects,\n            Proxy = GetWebProxy()\n        };\n\n        /// <summary>\n        /// Gets the web proxy.\n        /// </summary>\n        /// <returns></returns>\n        internal static IWebProxy GetWebProxy()\n        {\n            var proxy = HttpWebClientServiceState.Proxy;\n            if (!proxy.Enabled)\n                return WebRequest.DefaultWebProxy;\n            // Required for HttpClientHandler even though \"null\" is accepted elsewhere:\n            // https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.proxy?view=netframework-4.8\n            if (string.IsNullOrEmpty(proxy.Host))\n#pragma warning disable CS0618 // Type or member is obsolete\n                return GlobalProxySelection.GetEmptyWebProxy();\n#pragma warning restore CS0618 // Type or member is obsolete\n\n            var wp = new WebProxy(proxy.Host, proxy.Port);\n            switch (proxy.Authentication)\n            {\n                case ProxyAuthentication.None:\n                    wp.UseDefaultCredentials = false;\n                    wp.Credentials = null;\n                    break;\n                case ProxyAuthentication.SystemDefault:\n                    wp.UseDefaultCredentials = true;\n                    break;\n                case ProxyAuthentication.Specified:\n                    wp.UseDefaultCredentials = false;\n                    wp.Credentials = new NetworkCredential(proxy.Username, Util.Decrypt(\n                        proxy.Password, proxy.Username));\n                    break;\n            }\n            return wp;\n        }\n\n        /// <summary>\n        /// Gets the HTTP response.\n        /// </summary>\n        /// <param name=\"httpClientHandler\">The HTTP client handler.</param>\n        /// <param name=\"request\">The request.</param>\n        /// <returns></returns>\n        private static async Task<HttpResponseMessage> GetHttpResponseAsync(\n            HttpClientHandler httpClientHandler, HttpRequestMessage request)\n        {\n            using (var client = HttpWebClientService.GetHttpClient(httpClientHandler))\n            {\n                client.Timeout = s_timeout;\n                return await client.SendAsync(request).ConfigureAwait(false);\n            }\n        }\n\n        /// <summary>\n        /// Gets the HTTP request.\n        /// </summary>\n        /// <param name=\"token\">If not null, adds the specified ESI token to the headers.</param>\n        /// <param name=\"dataContentType\">The content type of the input data.</param>\n        /// <returns>The HTTP request.</returns>\n        private HttpRequestMessage GetHttpRequest(RequestParams param)\n        {\n            var method = param.MethodChecked;\n            // GET has content in the URL\n            if (method == HttpMethod.Get && param.Content != null)\n                m_url = new Uri(m_url.AbsoluteUri + param.Content);\n            var request = new HttpRequestMessage\n            {\n                RequestUri = m_url,\n                Method = method,\n            };\n            var headers = request.Headers;\n            // Authorization\n            var token = param.AuthHeader;\n            if (token != null)\n                headers.Authorization = token;\n            // Accept type, character set, language\n            headers.Accept.ParseAdd(m_accept);\n            headers.AcceptCharset.TryParseAdd(\"ISO-8859-1,utf-8;q=0.8,*;q=0.7\");\n            headers.AcceptLanguage.TryParseAdd(\"en-us,en;q=0.5\");\n            headers.Host = m_url.Host;\n            // E-Tag (must have quotes)\n            if (!string.IsNullOrWhiteSpace(param.ETag))\n                headers.IfNoneMatch.Add(new EntityTagHeaderValue(param.ETag, false));\n            // Expiration\n            if (param.IfModifiedSince != null)\n                headers.IfModifiedSince = param.IfModifiedSince;\n            headers.Pragma.TryParseAdd(\"no-cache\");\n            headers.UserAgent.TryParseAdd(HttpWebClientServiceState.UserAgent);\n            // Encoding support\n            if (param.AcceptEncoded)\n                headers.AcceptEncoding.ParseAdd(\"gzip,deflate;q=0.8\");\n            // Referrer from previous URL\n            if (m_referrer != null)\n                headers.Referrer = m_referrer;\n            var postData = param.GetEncodedContent();\n            if (postData != null && method != HttpMethod.Get)\n            {\n                // Data with encoding\n                string dataContentType = param.ContentType;\n                var content = new ByteArrayContent(postData.ToArray());\n                if (!string.IsNullOrEmpty(dataContentType))\n                    content.Headers.ContentType = MediaTypeHeaderValue.Parse(dataContentType);\n                // If we are going to send a compressed request set the appropriate header\n                var compression = param.Compression;\n                if (compression != DataCompression.None)\n                    content.Headers.ContentEncoding.Add(compression.ToString().\n                        ToLowerInvariant());\n                request.Content = content;\n            }\n            return request;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Net/HttpWebClientService.ImageDownload.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.IO;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Net\n{\n    static partial class HttpWebClientService\n    {\n        private const string ImageAccept = \"image/*,*/*;q=0.5\";\n\n        /// <summary>\n        /// Synchronously downloads an image from the specified url.\n        /// </summary>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"param\">The request parameters. If null, defaults will be used.</param>\n        public static DownloadResult<Image> DownloadImage(Uri url, RequestParams param = null)\n            => DownloadImageAsync(url, param).Result;\n\n        /// <summary>\n        /// Asynchronously downloads an image from the specified url.\n        /// </summary>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"param\">The request parameters. If null, defaults will be used.</param>\n        public static async Task<DownloadResult<Image>> DownloadImageAsync(Uri url,\n            RequestParams param = null)\n        {\n            string urlValidationError;\n            if (!IsValidURL(url, out urlValidationError))\n                throw new ArgumentException(urlValidationError);\n            var request = new HttpClientServiceRequest();\n            try\n            {\n                var response = await request.SendAsync(url, param, ImageAccept).\n                    ConfigureAwait(false);\n                using (response)\n                {\n                    Stream stream = await response.Content.ReadAsStreamAsync().\n                        ConfigureAwait(false);\n                    return GetImage(request.BaseUrl, stream, response);\n                }\n            }\n            catch (HttpWebClientServiceException ex)\n            {\n                return new DownloadResult<Image>(null, ex);\n            }\n        }\n\n        /// <summary>\n        /// Gets the result.\n        /// </summary>\n        /// <param name=\"requestBaseUrl\">The request base URL.</param>\n        /// <param name=\"stream\">The stream.</param>\n        /// <param name=\"response\">The response from the server.</param>\n        /// <returns></returns>\n        private static DownloadResult<Image> GetImage(Uri requestBaseUrl, Stream stream,\n            HttpResponseMessage response)\n        {\n            Image image = null;\n            HttpWebClientServiceException error = null;\n            var param = new ResponseParams(response);\n            if (stream == null)\n            {\n                error = HttpWebClientServiceException.Exception(requestBaseUrl,\n                    new ArgumentNullException(nameof(stream)));\n                return new DownloadResult<Image>(null, error, param);\n            }\n            try\n            {\n                image = Image.FromStream(Util.ZlibUncompress(stream), true);\n            }\n            catch (ArgumentException ex)\n            {\n                error = HttpWebClientServiceException.ImageException(requestBaseUrl, ex);\n            }\n            return new DownloadResult<Image>(image, error, param);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Net/HttpWebClientService.StreamDownload.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.Common.Net\n{\n    static partial class HttpWebClientService\n    {\n        private const string StreamAccept = \"application/json;q=0.9,text/plain;q=0.8,*/*;q=0.5\";\n\n        /// <summary>\n        /// Passed to DownloadStreamAsync to process the stream into actual data.\n        /// </summary>\n        /// <typeparam name=\"T\">The type to decode.</typeparam>\n        /// <param name=\"stream\">The input stream to read.</param>\n        /// <param name=\"response\">The HTTP response returned by the server.</param>\n        /// <returns>The decoded value, or default(T) if none could be parsed.</returns>\n        public delegate T ParseDataDelegate<T>(Stream stream, ResponseParams response);\n\n        /// <summary>\n        /// Asynchronously downloads an object (streaming) from the specified url.\n        /// </summary>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"parser\">The function which will parse the stream.</param>\n        /// <param name=\"param\">The request parameters. If null, defaults will be used.</param>\n        public static async Task<DownloadResult<T>> DownloadStreamAsync<T>(Uri url,\n            ParseDataDelegate<T> parser, RequestParams param)\n        {\n            string urlValidationError;\n            if (!IsValidURL(url, out urlValidationError))\n                throw new ArgumentException(urlValidationError);\n            var request = new HttpClientServiceRequest();\n            try\n            {\n                var response = await request.SendAsync(url, param, StreamAccept).\n                    ConfigureAwait(false);\n                using (response)\n                {\n                    var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(\n                        false);\n                    return GetResult(url, stream, parser, response);\n                }\n            }\n            catch (HttpWebClientServiceException ex)\n            {\n                return new DownloadResult<T>(default(T), ex);\n            }\n        }\n\n        /// <summary>\n        /// Helper method to return an object from the completed request stream.\n        /// </summary>\n        /// <param name=\"requestBaseUrl\">The request base URL.</param>\n        /// <param name=\"stream\">The stream.</param>\n        /// <param name=\"parser\">The function which will parse the stream.</param>\n        /// <param name=\"response\">The response from the server.</param>\n        /// <returns>The parsed object.</returns>\n        private static DownloadResult<T> GetResult<T>(Uri requestBaseUrl, Stream stream,\n            ParseDataDelegate<T> parser, HttpResponseMessage response)\n        {\n            T result = default(T);\n            HttpWebClientServiceException error = null;\n            var param = new ResponseParams(response);\n            if (stream == null)\n                // No stream (can this happen)?\n                error = HttpWebClientServiceException.Exception(requestBaseUrl,\n                    new ArgumentNullException(nameof(stream)));\n            else\n                // Attempt to invoke parser\n                result = parser.Invoke(Util.ZlibUncompress(stream), param);\n            return new DownloadResult<T>(result, error, param);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Net/HttpWebClientService.StringDownload.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Net\n{\n    static partial class HttpWebClientService\n    {\n        private const string StringAccept = \"text/html;q=0.9,text/plain;q=0.8,*/*;q=0.5\";\n\n        /// <summary>\n        /// Synchronously downloads a string from the specified url.\n        /// </summary>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"param\">The request parameters. If null, defaults will be used.</param>\n        /// <returns></returns>\n        public static DownloadResult<string> DownloadString(Uri url, RequestParams param = null)\n            => DownloadStringAsync(url, param).Result;\n\n        /// <summary>\n        /// Asynchronously downloads a string from the specified url.\n        /// </summary>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"param\">The request parameters. If null, defaults will be used.</param>\n        public static async Task<DownloadResult<string>> DownloadStringAsync(Uri url,\n            RequestParams param = null)\n        {\n            string urlValidationError;\n            if (!IsValidURL(url, out urlValidationError))\n                throw new ArgumentException(urlValidationError);\n            var request = new HttpClientServiceRequest();\n            try\n            {\n                var response = await request.SendAsync(url, param, StringAccept).\n                    ConfigureAwait(false);\n                using (response)\n                {\n                    Stream stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(\n                        false);\n                    return GetString(request.BaseUrl, stream, response);\n                }\n            }\n            catch (HttpWebClientServiceException ex)\n            {\n                return new DownloadResult<string>(string.Empty, ex);\n            }\n        }\n\n        /// <summary>\n        /// Helper method to return a string from the completed request.\n        /// </summary>\n        /// <param name=\"requestBaseUrl\">The request base URL.</param>\n        /// <param name=\"stream\">The stream.</param>\n        /// <param name=\"response\">The response from the server.</param>\n        private static DownloadResult<string> GetString(Uri requestBaseUrl, Stream stream,\n            HttpResponseMessage response)\n        {\n            string text = string.Empty;\n            HttpWebClientServiceException error = null;\n            var param = new ResponseParams(response);\n            if (stream == null)\n            {\n                error = HttpWebClientServiceException.Exception(requestBaseUrl, new\n                    ArgumentNullException(nameof(stream)));\n                return new DownloadResult<string>(text, error, param);\n            }\n            try\n            {\n                using (StreamReader reader = new StreamReader(Util.ZlibUncompress(stream)))\n                    text = reader.ReadToEnd();\n            }\n            catch (ArgumentException ex)\n            {\n                error = HttpWebClientServiceException.Exception(requestBaseUrl, ex);\n            }\n            return new DownloadResult<string>(text, error, param);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Net/HttpWebClientService.XmlDownload.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.Xml;\nusing System.Xml.XPath;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Net\n{\n    static partial class HttpWebClientService\n    {\n        private const string XmlAccept = \"text/xml,application/xml,application/xhtml+xml;q=0.8,*/*;q=0.5\";\n\n        /// <summary>\n        /// Downloads an Xml document from the specified url using the specified POST data.\n        /// </summary>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"param\">The request parameters. If null, defaults will be used.</param>\n        /// <returns></returns>\n        public static DownloadResult<IXPathNavigable> DownloadXml(Uri url,\n            RequestParams param = null) => DownloadXmlAsync(url, param).Result;\n\n        /// <summary>\n        /// Asynchronously downloads an xml file from the specified url.\n        /// </summary>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"param\">The request parameters. If null, defaults will be used.</param>\n        public static async Task<DownloadResult<IXPathNavigable>> DownloadXmlAsync(Uri url,\n            RequestParams param = null)\n        {\n            string urlValidationError;\n            if (!IsValidURL(url, out urlValidationError))\n                throw new ArgumentException(urlValidationError);\n            var request = new HttpClientServiceRequest();\n            try\n            {\n                var response = await request.SendAsync(url, param, XmlAccept).\n                    ConfigureAwait(false);\n                using (response)\n                {\n                    Stream stream = await response.Content.ReadAsStreamAsync().\n                        ConfigureAwait(false);\n                    return GetXmlDocument(request.BaseUrl, stream, response);\n                }\n            }\n            catch (HttpWebClientServiceException ex)\n            {\n                return new DownloadResult<IXPathNavigable>(new XmlDocument(), ex);\n            }\n        }\n\n        /// <summary>\n        /// Helper method to return an Xml document from the completed request.\n        /// </summary>\n        /// <param name=\"requestBaseUrl\">The request base URL.</param>\n        /// <param name=\"stream\">The stream.</param>\n        /// <param name=\"response\">The response from the server.</param>\n        private static DownloadResult<IXPathNavigable> GetXmlDocument(Uri requestBaseUrl,\n            Stream stream, HttpResponseMessage response)\n        {\n            XmlDocument xmlDoc = new XmlDocument();\n            HttpWebClientServiceException error = null;\n            var param = new ResponseParams(response);\n            if (stream == null)\n            {\n                error = HttpWebClientServiceException.Exception(requestBaseUrl,\n                    new ArgumentNullException(nameof(stream)));\n                return new DownloadResult<IXPathNavigable>(xmlDoc, error, param);\n            }\n            try\n            {\n                xmlDoc.Load(Util.ZlibUncompress(stream));\n            }\n            catch (XmlException ex)\n            {\n                error = HttpWebClientServiceException.XmlException(requestBaseUrl, ex);\n            }\n            return new DownloadResult<IXPathNavigable>(xmlDoc, error, param);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Net/HttpWebClientService.cs",
    "content": "using System;\nusing System.Net;\nusing System.Net.Http;\nusing System.Net.Security;\nusing System.Security.Cryptography.X509Certificates;\n\nnamespace EVEMon.Common.Net\n{\n    public static partial class HttpWebClientService\n    {\n        /// <summary>\n        /// Initializes the <see cref=\"HttpWebClientService\"/> class.\n        /// </summary>\n        static HttpWebClientService()\n        {\n            ServicePointManager.Expect100Continue = false;\n            ServicePointManager.DefaultConnectionLimit = 10;\n#if false\n            // To debug trust failure issues\n            if (EveMonClient.IsDebugBuild)\n                ServicePointManager.ServerCertificateValidationCallback = DummyCertificateValidationCallback;\n#endif\n        }\n\n        /// <summary>\n        /// A dummy certificate validation callback.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"certificate\">The certificate.</param>\n        /// <param name=\"chain\">The chain.</param>\n        /// <param name=\"sslpolicyerrors\">The sslpolicyerrors.</param>\n        /// <returns></returns>\n        internal static bool DummyCertificateValidationCallback(object sender, X509Certificate\n            certificate, X509Chain chain, SslPolicyErrors sslpolicyerrors) => true;\n\n        /// <summary>\n        /// Gets the web client.\n        /// </summary>\n        /// <returns></returns>\n        public static WebClient GetWebClient() => new WebClient\n        {\n            Proxy = HttpClientServiceRequest.GetWebProxy()\n        };\n\n        /// <summary>\n        /// Gets the HTTP client.\n        /// </summary>\n        /// <param name=\"httpClientHandler\">The HTTP client handler.</param>\n        /// <returns></returns>\n        public static HttpClient GetHttpClient(HttpClientHandler httpClientHandler = null) =>\n            httpClientHandler == null ? new HttpClient() : new HttpClient(httpClientHandler);\n\n        /// <summary>\n        /// Validates a Url as acceptable for an HttpWebServiceRequest.\n        /// </summary>\n        /// <param name=\"url\">A url <see cref=\"string\"/> for the request. The string must specify HTTP or HTTPS as its scheme.</param>\n        /// <param name=\"errorMsg\">Is url is invalid, contains a descriptive message of the reason</param>\n        public static bool IsValidURL(Uri url, out string errorMsg)\n        {\n            if (string.IsNullOrWhiteSpace(url.AbsoluteUri))\n            {\n                errorMsg = \"Url may not be null or an empty string.\";\n                return false;\n            }\n\n            if (!Uri.IsWellFormedUriString(url.AbsoluteUri, UriKind.Absolute))\n            {\n                errorMsg = $\"\\\"{url}\\\" is not a well-formed URL.\";\n\n                return false;\n            }\n\n            try\n            {\n                if (url.Scheme != Uri.UriSchemeHttp && url.Scheme != Uri.UriSchemeHttps)\n                {\n                    errorMsg = $\"The specified scheme ({url.Scheme}) is not supported.\";\n\n                    return false;\n                }\n            }\n            catch (UriFormatException)\n            {\n                errorMsg = $\"\\\"{url}\\\" is not a valid URL for an HTTP or HTTPS request.\";\n\n                return false;\n            }\n\n            errorMsg = string.Empty;\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Net/HttpWebClientServiceException.cs",
    "content": "using System;\nusing System.Net;\nusing System.Net.Http;\nusing System.Runtime.Serialization;\nusing System.Text;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Net\n{\n    /// <summary>\n    /// Exception class for all exceptions thrown by HttpWebService requests.\n    /// </summary>\n    [Serializable]\n    public sealed class HttpWebClientServiceException : Exception\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"HttpWebClientServiceException\"/> class.\n        /// </summary>\n        public HttpWebClientServiceException()\n        {\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"HttpWebClientServiceException\"/> class.\n        /// </summary>\n        /// <param name=\"message\">The message.</param>\n        public HttpWebClientServiceException(string message)\n            : base(message)\n        {\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"HttpWebClientServiceException\" /> class.\n        /// </summary>\n        /// <param name=\"message\">The message.</param>\n        /// <param name=\"ex\">The ex.</param>\n        public HttpWebClientServiceException(string message, Exception ex)\n            : base(message, ex)\n        {\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"HttpWebClientServiceException\" /> class.\n        /// </summary>\n        /// <param name=\"info\">The <see cref=\"T:System.Runtime.Serialization.SerializationInfo\" />\n        /// that holds the serialized object data about the exception being thrown.</param>\n        /// <param name=\"context\">The <see cref=\"T:System.Runtime.Serialization.StreamingContext\" />\n        /// that contains contextual information about the source or destination.</param>\n        /// <exception cref=\"T:System.ArgumentNullException\">The <paramref name=\"info\" /> parameter is null.</exception>\n        /// <exception cref=\"T:System.Runtime.Serialization.SerializationException\">The class name is null or\n        /// <see cref=\"P:System.Exception.HResult\" /> is zero (0).</exception>\n        private HttpWebClientServiceException(SerializationInfo info, StreamingContext context)\n            : base(info, context)\n        {\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"HttpWebClientServiceException\"/> class.\n        /// </summary>\n        /// <param name=\"status\">The status.</param>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"message\">The message.</param>\n        private HttpWebClientServiceException(HttpWebClientServiceExceptionStatus status, Uri url, string message)\n            : base(message)\n        {\n            Status = status;\n            Url = url;\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"HttpWebClientServiceException\"/> class.\n        /// </summary>\n        /// <param name=\"status\">The status.</param>\n        /// <param name=\"ex\">The ex.</param>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"message\">The message.</param>\n        private HttpWebClientServiceException(HttpWebClientServiceExceptionStatus status, Exception ex, Uri url, string message)\n            : base(message, ex)\n        {\n            Status = status;\n            Url = url;\n        }\n\n        /// <summary>\n        /// Gets the status.\n        /// </summary>\n        /// <value>The status.</value>\n        public HttpWebClientServiceExceptionStatus Status { get; }\n\n        /// <summary>\n        /// Gets the status code.\n        /// </summary>\n        public HttpStatusCode StatusCode { get; set; }\n\n        /// <summary>\n        /// Gets the URL.\n        /// </summary>\n        /// <value>The URL.</value>\n        public Uri Url { get; }\n\n        /// <summary>\n        /// Gets the name of the host.\n        /// </summary>\n        /// <value>The name of the host.</value>\n        public string HostName => Url.Host;\n\n        /// <summary>\n        /// Factory method to create an HttpWebServiceException resulting from a WebException.\n        /// Various different HttpWebServiceExceptionStatus types are applied, with appropriate messages, depending on the\n        /// nature of the WebException.\n        /// </summary>\n        /// <param name=\"url\">The url of the request that failed</param>\n        /// <param name=\"ex\">The Exception that was thrown</param>\n        /// <param name=\"httpStatusCode\">The HTTP status code.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.InvalidOperationException\">Only WebException and HttpRequestException allowed</exception>\n        public static HttpWebClientServiceException HttpWebClientException(Uri url, Exception ex, HttpStatusCode httpStatusCode = HttpStatusCode.OK)\n        {\n            var webException = ex as WebException;\n            var httpRequestException = ex as HttpRequestException;\n\n            if (webException == null && httpRequestException == null)\n                throw new InvalidOperationException(\"Only WebException and HttpRequestException allowed\");\n\n            HttpWebClientServiceExceptionStatus status;\n            string msg = webException != null\n                ? ParseWebRequestException(webException, url, GetProxyHost(url), out status)\n                : ParseHttpRequestException(httpRequestException, httpStatusCode, url, GetProxyHost(url), out status);\n\n            return new HttpWebClientServiceException(status, ex, url, msg)\n            {\n                StatusCode = httpStatusCode\n            };\n        }\n\n        /// <summary>\n        /// Gets the proxy host.\n        /// </summary>\n        /// <param name=\"url\">The URL.</param>\n        /// <returns></returns>\n        private static string GetProxyHost(Uri url)\n            => HttpWebClientServiceState.Proxy.Enabled\n                ? HttpWebClientServiceState.Proxy.Host\n                : WebRequest.DefaultWebProxy.GetProxy(url).Host;\n\n        /// <summary>\n        /// Parses a web exception to get an error message and a <see cref=\"HttpWebClientServiceExceptionStatus\"/> status code.\n        /// </summary>\n        /// <param name=\"webException\">The web exception.</param>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"proxyHost\">The proxy host.</param>\n        /// <param name=\"status\">The status.</param>\n        /// <returns></returns>\n        private static string ParseWebRequestException(WebException webException, Uri url, string proxyHost,\n            out HttpWebClientServiceExceptionStatus status)\n        {\n            StringBuilder messageBuilder = new StringBuilder();\n            switch (webException.Status)\n            {\n                case WebExceptionStatus.ProtocolError:\n                    HttpWebResponse response = (HttpWebResponse)webException.Response;\n                    switch (response.StatusCode)\n                    {\n                        case HttpStatusCode.ProxyAuthenticationRequired:\n                            status = HttpWebClientServiceExceptionStatus.ProxyError;\n                            messageBuilder.AppendFormat(\n                                ExceptionMessages.ProxyAuthenticationFailure, proxyHost, url.Host);\n                            break;\n\n                        default:\n                            status = HttpWebClientServiceExceptionStatus.ServerError;\n                            messageBuilder\n                                .AppendFormat(ExceptionMessages.ServerError, url.Host)\n                                .Append(response.StatusDescription);\n                            break;\n                    }\n                    break;\n                case WebExceptionStatus.ProxyNameResolutionFailure:\n                    status = HttpWebClientServiceExceptionStatus.ProxyError;\n                    messageBuilder.AppendFormat(ExceptionMessages.ProxyNameResolutionFailure, proxyHost);\n                    break;\n                case WebExceptionStatus.RequestProhibitedByProxy:\n                    status = HttpWebClientServiceExceptionStatus.ProxyError;\n                    messageBuilder.AppendFormat(ExceptionMessages.RequestProhibitedByProxy, url.Host, proxyHost);\n                    break;\n                case WebExceptionStatus.NameResolutionFailure:\n                    status = HttpWebClientServiceExceptionStatus.NameResolutionFailure;\n                    messageBuilder.AppendFormat(ExceptionMessages.NameResolutionFailure, proxyHost);\n                    break;\n                case WebExceptionStatus.ConnectFailure:\n                    status = HttpWebClientServiceExceptionStatus.ConnectFailure;\n                    messageBuilder.AppendFormat(ExceptionMessages.ConnectFailure, url.Host);\n                    break;\n                case WebExceptionStatus.Timeout:\n                    status = HttpWebClientServiceExceptionStatus.Timeout;\n                    messageBuilder.AppendFormat(ExceptionMessages.Timeout, url.Host);\n                    break;\n                default:\n                    status = HttpWebClientServiceExceptionStatus.WebException;\n                    messageBuilder.AppendFormat(ExceptionMessages.UnknownException, url.Host, webException.Status);\n                    break;\n            }\n\n            return messageBuilder.ToString();\n        }\n\n        /// <summary>\n        /// Parses an HTTP request exception to get an error message and a <see cref=\"HttpWebClientServiceExceptionStatus\" /> status code.\n        /// </summary>\n        /// <param name=\"httpRequestException\">The HTTP request exception.</param>\n        /// <param name=\"httpStatusCode\">The HTTP status code.</param>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"proxyHost\">The proxy host.</param>\n        /// <param name=\"status\">The status.</param>\n        /// <returns></returns>\n        private static string ParseHttpRequestException(HttpRequestException httpRequestException, HttpStatusCode httpStatusCode,\n            Uri url, string proxyHost, out HttpWebClientServiceExceptionStatus status)\n        {\n            StringBuilder messageBuilder = new StringBuilder();\n            switch (httpStatusCode)\n            {\n                // Informational\n                case HttpStatusCode.Continue:\n                    goto default;\n                case HttpStatusCode.SwitchingProtocols:\n                    goto default;\n\n                    // Redirection\n                case HttpStatusCode.MultipleChoices:\n                    goto default;\n                case HttpStatusCode.MovedPermanently:\n                    goto default;\n                case HttpStatusCode.Redirect:\n                    goto default;\n                case HttpStatusCode.RedirectMethod:\n                    goto default;\n                case HttpStatusCode.NotModified:\n                    goto default;\n                case HttpStatusCode.UseProxy:\n                    status = HttpWebClientServiceExceptionStatus.ProxyError;\n                    messageBuilder.AppendFormat(\n                        ExceptionMessages.ProxyNameResolutionFailure, proxyHost);\n                    break;\n                case HttpStatusCode.Unused:\n                    goto default;\n                case HttpStatusCode.TemporaryRedirect:\n                    goto default;\n\n                    // Client Error\n                case HttpStatusCode.BadRequest:\n                    goto default;\n                case HttpStatusCode.Unauthorized:\n                case HttpStatusCode.PaymentRequired:\n                case HttpStatusCode.Forbidden:\n                    status = HttpWebClientServiceExceptionStatus.Forbidden;\n                    messageBuilder.AppendFormat(ExceptionMessages.Forbidden, url.Host);\n                    break;\n                case HttpStatusCode.NotFound:\n                    goto default;\n                case HttpStatusCode.MethodNotAllowed:\n                    goto default;\n                case HttpStatusCode.NotAcceptable:\n                    goto default;\n                case HttpStatusCode.ProxyAuthenticationRequired:\n                    status = HttpWebClientServiceExceptionStatus.ProxyError;\n                    messageBuilder.AppendFormat(\n                        ExceptionMessages.ProxyAuthenticationFailure, proxyHost, url.Host);\n                    break;\n                case HttpStatusCode.RequestTimeout:\n                    status = HttpWebClientServiceExceptionStatus.Timeout;\n                    messageBuilder.AppendFormat(ExceptionMessages.Timeout, url.Host);\n                    break;\n                case HttpStatusCode.Conflict:\n                    goto default;\n                case HttpStatusCode.Gone:\n                    goto default;\n                case HttpStatusCode.LengthRequired:\n                    goto default;\n                case HttpStatusCode.PreconditionFailed:\n                    goto default;\n                case HttpStatusCode.RequestEntityTooLarge:\n                    goto default;\n                case HttpStatusCode.RequestUriTooLong:\n                    goto default;\n                case HttpStatusCode.UnsupportedMediaType:\n                    goto default;\n                case HttpStatusCode.RequestedRangeNotSatisfiable:\n                    goto default;\n                case HttpStatusCode.ExpectationFailed:\n                    goto default;\n                case HttpStatusCode.UpgradeRequired:\n                    goto default;\n\n                    // Server Error\n                case HttpStatusCode.InternalServerError:\n                case HttpStatusCode.NotImplemented:\n                case HttpStatusCode.BadGateway:\n                case HttpStatusCode.ServiceUnavailable:\n                case HttpStatusCode.GatewayTimeout:\n                case HttpStatusCode.HttpVersionNotSupported:\n                    status = HttpWebClientServiceExceptionStatus.ServerError;\n                    messageBuilder\n                        .AppendFormat(ExceptionMessages.ServerError, url.Host)\n                        .Append($\"{(int)httpStatusCode} ({httpStatusCode.ToString().ConvertUpperCamelCaseToString()})\");\n                    break;\n\n                default:\n                    status = HttpWebClientServiceExceptionStatus.Exception;\n                    messageBuilder.AppendFormat(ExceptionMessages.UnknownException, url.Host,\n                        $\"{(int)httpStatusCode} ({httpStatusCode.ToString().ConvertUpperCamelCaseToString()})\");\n                    break;\n            }\n\n            return messageBuilder.ToString();\n        }\n\n        /// <summary>\n        /// Factory method to create an HttpWebServiceException of type 'Exception'\n        /// </summary>\n        /// <param name=\"url\">The url of the request that failed</param>\n        /// <param name=\"ex\">The exception that was thrown</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static HttpWebClientServiceException Exception(Uri url, Exception ex)\n        {\n            url.ThrowIfNull(nameof(url));\n\n            return new HttpWebClientServiceException(HttpWebClientServiceExceptionStatus.Exception, ex, url,\n                \"An Exception occurred.\");\n        }\n\n        /// <summary>\n        /// Factory method to create an HttpWebServiceException of type 'RedirectsExceeded'\n        /// </summary>\n        /// <param name=\"url\">The url of the request that failed</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static HttpWebClientServiceException RedirectsExceededException(Uri url)\n        {\n            url.ThrowIfNull(nameof(url));\n\n            return new HttpWebClientServiceException(HttpWebClientServiceExceptionStatus.RedirectsExceeded, url,\n                string.Format(CultureConstants.DefaultCulture, ExceptionMessages.RedirectsExceeded, url.Host));\n        }\n\n        /// <summary>\n        /// Factory method to create an HttpWebServiceException of type 'RequestsDisabled'\n        /// </summary>\n        /// <param name=\"url\">The url of the request that failed</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static HttpWebClientServiceException RequestsDisabledException(Uri url)\n        {\n            url.ThrowIfNull(nameof(url));\n\n            return new HttpWebClientServiceException(HttpWebClientServiceExceptionStatus.RequestsDisabled, url,\n                string.Format(CultureConstants.DefaultCulture, ExceptionMessages.RequestsDisabled, url.Host));\n        }\n\n        /// <summary>\n        /// Factory method to create an HttpWebServiceException for Xml download requests that fail due to an XmlException\n        /// </summary>\n        /// <param name=\"url\">The url of the request that failed</param>\n        /// <param name=\"ex\">The XmlException that was thrown</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static HttpWebClientServiceException XmlException(Uri url, Exception ex)\n        {\n            url.ThrowIfNull(nameof(url));\n\n            return new HttpWebClientServiceException(HttpWebClientServiceExceptionStatus.XmlException, ex, url,\n                string.Format(CultureConstants.DefaultCulture, ExceptionMessages.XmlException, url.Host));\n        }\n\n        /// <summary>\n        /// Factory method to create an HttpWebServiceException for Image download requests that fail because a valid image was not returned\n        /// </summary>\n        /// <param name=\"url\">The url of the request that failed</param>\n        /// <param name=\"ex\">The exception that was thrown loading the image</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static HttpWebClientServiceException ImageException(Uri url, Exception ex)\n        {\n            url.ThrowIfNull(nameof(url));\n\n            return new HttpWebClientServiceException(HttpWebClientServiceExceptionStatus.ImageException, ex, url,\n                string.Format(CultureConstants.DefaultCulture, ExceptionMessages.ImageException, url.Host));\n        }\n\n        /// <summary>\n        /// Factory method to create an HttpWebServiceException for File download requests that fail because the file could not be written\n        /// </summary>\n        /// <param name=\"url\">The url of the request that failed</param>\n        /// <param name=\"ex\">The exception that was thrown creating the file</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static HttpWebClientServiceException FileError(Uri url, Exception ex)\n        {\n            url.ThrowIfNull(nameof(url));\n\n            return new HttpWebClientServiceException(HttpWebClientServiceExceptionStatus.FileError, ex, url,\n                string.Format(CultureConstants.DefaultCulture, ExceptionMessages.FileException, url.Host));\n        }\n\n        /// <summary>\n        /// When overridden in a derived class, sets the <see cref=\"T:System.Runtime.Serialization.SerializationInfo\" /> with information about the exception.\n        /// </summary>\n        /// <param name=\"info\">The <see cref=\"T:System.Runtime.Serialization.SerializationInfo\" /> that holds the serialized object data about the exception being thrown.</param>\n        /// <param name=\"context\">The <see cref=\"T:System.Runtime.Serialization.StreamingContext\" /> that contains contextual information about the source or destination.</param>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        /// <exception cref=\"T:System.ArgumentNullException\">The <paramref name=\"info\" /> parameter is a null reference (Nothing in Visual Basic).</exception>\n        /// <PermissionSet>\n        ///   <IPermission class=\"System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" version=\"1\" Read=\"*AllFiles*\" PathDiscovery=\"*AllFiles*\" />\n        ///   <IPermission class=\"System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" version=\"1\" Flags=\"SerializationFormatter\" />\n        /// </PermissionSet>\n        public override void GetObjectData(SerializationInfo info, StreamingContext context)\n        {\n            info.ThrowIfNull(nameof(info));\n\n            info.AddValue(\"Status\", Status);\n            info.AddValue(\"Url\", Url);\n            info.AddValue(\"HostName\", HostName);\n\n            base.GetObjectData(info, context);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Net/HttpWebClientServiceExceptionStatus.cs",
    "content": "namespace EVEMon.Common.Net\n{\n    /// <summary>\n    /// Status types for an HttpWebServiceException\n    /// </summary>\n    public enum HttpWebClientServiceExceptionStatus\n    {\n        Exception,\n        WebException,\n        RedirectsExceeded,\n        RequestsDisabled,\n        ServerError,\n        ProxyError,\n        NameResolutionFailure,\n        ConnectFailure,\n        Timeout,\n        XmlException,\n        ImageException,\n        FileError,\n        Forbidden\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Net/HttpWebClientServiceState.cs",
    "content": "using System;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Net\n{\n    /// <summary>\n    /// Conainer class for HttpWebService settings and state\n    /// </summary>\n    public static class HttpWebClientServiceState\n    {\n        private static readonly object s_syncLock = new object();\n        private static ProxySettings s_proxy = new ProxySettings();\n\n        /// <summary>\n        /// The maximum size of a download section.\n        /// </summary>\n        public static int MaxBufferSize => 8192;\n\n        /// <summary>\n        /// The minimum size if a download section.\n        /// </summary>\n        public static int MinBufferSize => 1024;\n\n        /// <summary>\n        /// The user agent string for requests.\n        /// </summary>\n        public static string UserAgent\n        {\n            get\n            {\n                var architecture = Environment.Is64BitOperatingSystem\n                    ? \"x64\"\n                    : \"x86\";\n\n                return $\"{EveMonClient.FileVersionInfo.ProductName}/{EveMonClient.FileVersionInfo.FileVersion}\" +\n                       $\" ({Environment.OSVersion.VersionString}; {architecture})\";\n            }\n        }\n\n        /// <summary>\n        /// The maximum redirects allowed for a request.\n        /// </summary>\n        public static int MaxRedirects => 5;\n\n        /// <summary>\n        /// A ProxySetting instance for the custom proxy to be used.\n        /// </summary>\n        public static ProxySettings Proxy\n        {\n            get\n            {\n                lock (s_syncLock)\n                {\n                    return s_proxy;\n                }\n            }\n            set\n            {\n                lock (s_syncLock)\n                {\n                    s_proxy = value;\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Net/INetworkChangeSubscriber.cs",
    "content": "namespace EVEMon.Common.Net\n{\n    /// <summary>\n    /// This interface allows implementers to register to the <see cref=\"NetworkMonitor\"/> class to track network availability changes.\n    /// </summary>\n    public interface INetworkChangeSubscriber\n    {\n        /// <summary>\n        /// Notifies the network availability changed.\n        /// </summary>\n        bool SetNetworkStatus { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Net/NetworkMonitor.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Net.NetworkInformation;\nusing System.Text;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Common.Net\n{\n    /// <summary>\n    /// This class notifies subscribers about the change and the status of an network interface\n    /// </summary>\n    public static class NetworkMonitor\n    {\n        private static readonly object s_syncLock = new object();\n\n        private static List<WeakReference<INetworkChangeSubscriber>> s_subscribers;\n        private static bool s_networkAvailable;\n        private static bool s_manualTestRequired;\n\n        /// <summary>\n        /// Initializer.\n        /// </summary>\n        public static void Initialize()\n        {\n            if (s_subscribers != null)\n                return;\n\n            // Subscribe to network changes\n            s_subscribers = new List<WeakReference<INetworkChangeSubscriber>>();\n\n            try\n            {\n                s_networkAvailable = NetworkInterface.GetIsNetworkAvailable();\n                NetworkChange.NetworkAvailabilityChanged += OnNetworkAvailabilityChanged;\n            }\n            catch (Exception ex)\n            {\n                // GetIsNetworkAvailable doesn't seem to work on every system (f.ex. Mac OSX/Darwine)\n                ExceptionHandler.LogException(ex, true);\n\n                // Check the network manually and set the manual flag to true\n                s_networkAvailable = IsNetworkAvailableManual();\n                s_manualTestRequired = true;\n            }\n        }\n\n        /// <summary>\n        /// Tests to see if the network is available \n        /// </summary>\n        /// <returns>true if ping is sucessfull, otherwise false</returns>\n        private static bool IsNetworkAvailableManual()\n        {\n            // Send a ping to www.google.com\n            using (Ping pingSender = new Ping())\n            {\n                PingOptions options = new PingOptions(50, false);\n                byte[] buffer = Encoding.ASCII.GetBytes(\"EVEMon Network Status Ping\");\n                const int Timeout = 120;\n                const string Host = \"www.google.com\";\n                PingReply reply = pingSender.Send(Host, Timeout, buffer, options);\n\n                return reply != null && (reply.Status == IPStatus.Success);\n            }\n        }\n\n        /// <summary>\n        /// Gets true when a TCP/IP connection is available.\n        /// </summary>\n        public static bool IsNetworkAvailable\n        {\n            get\n            {\n                // Edge case: Wine/Darwine user with broken .NET Networking Stack\n                if (Settings.Updates.IgnoreNetworkStatus)\n                    return true;\n\n                return !s_manualTestRequired ? s_networkAvailable : IsNetworkAvailableManual();\n            }\n        }\n\n        /// <summary>\n        /// Registers the given object for notifications about a network availability change.\n        /// </summary>\n        /// <param name=\"monitor\"></param>\n        public static void Register(INetworkChangeSubscriber monitor)\n        {\n            lock (s_syncLock)\n                s_subscribers?.Add(new WeakReference<INetworkChangeSubscriber>(monitor, false));\n        }\n\n        /// <summary>\n        /// When the networks connection is opened or closed, we notify the subscribers.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private static void OnNetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)\n        {\n            lock (s_syncLock)\n            {\n                s_networkAvailable = e.IsAvailable;\n\n                if (s_subscribers == null)\n                    return;\n\n                // Scroll through the monitors and remove them when they're no longer available\n                int index = 0;\n                while (index < s_subscribers.Count)\n                {\n                    INetworkChangeSubscriber target;\n                    if (s_subscribers[index].TryGetTarget(out target))\n                    {\n                        target.SetNetworkStatus = e.IsAvailable;\n                        index++;\n                    }\n                    else\n                        s_subscribers.RemoveAt(index);\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Net/RequestParams.cs",
    "content": "﻿using EVEMon.Common.Enumerations;\nusing System;\nusing System.Collections.Generic;\nusing System.Net.Http;\nusing System.Net.Http.Headers;\nusing System.Text;\n\nnamespace EVEMon.Common.Net\n{\n    /// <summary>\n    /// Represents the parameters used for a HTTP request.\n    /// </summary>\n    public sealed class RequestParams\n    {\n        /// <summary>\n        /// The content type used if none is specified. Defaults to\n        /// \"application/x-www-form-urlencoded\".\n        /// </summary>\n        public const string DEFAULT_CONTENT_TYPE = \"application/x-www-form-urlencoded\";\n\n        /// <summary>\n        /// Whether encoded responses are accepted. If true, the response may need to be\n        /// unzipped/inflated.\n        /// </summary>\n        public bool AcceptEncoded { get; set; }\n\n        /// <summary>\n        /// The authentication information to send. If it does not have a type, it will be\n        /// sent as Bearer authentication. If null, no header will be sent.\n        /// </summary>\n        public string Authentication { get; set; }\n\n        /// <summary>\n        /// Retrieves the header to be sent for the Authorization header based on the token,\n        /// or null if none should be sent.\n        /// </summary>\n        internal AuthenticationHeaderValue AuthHeader\n        {\n            get\n            {\n                string token = Authentication;\n                AuthenticationHeaderValue header = null;\n                if (token != null)\n                {\n                    // If the token has a space, use that type of auth header\n                    string type = \"Bearer\";\n                    int index = token.IndexOf(' ');\n                    if (index > 0)\n                    {\n                        type = token.Substring(0, index);\n                        token = token.Substring(index + 1).TrimStart();\n                    }\n                    header = new AuthenticationHeaderValue(type, token);\n                }\n                return header;\n            }\n        }\n\n        /// <summary>\n        /// The data compression type to permit, if any.\n        /// </summary>\n        public DataCompression Compression { get; set; }\n\n        /// <summary>\n        /// The GET/POST data to send. This needs to be URL encoded.\n        /// </summary>\n        public string Content { get; set; }\n\n        /// <summary>\n        /// The content type of the POST data. If unset, defaults to DEFAULT_CONTENT_TYPE.\n        /// </summary>\n        public string ContentType { get; set; }\n\n        /// <summary>\n        /// The E-Tag to send to the server. If it matches the content on the server, the\n        /// response will be \"No Content\", saving bandwidth. If it is null, no e-tag will be\n        /// sent.\n        /// </summary>\n        public string ETag { get; set; }\n\n        /// <summary>\n        /// The date/time to report to the server to potentially save on returning new data if\n        /// the data has not been modified since then.\n        /// </summary>\n        public DateTimeOffset? IfModifiedSince { get; set; }\n\n        /// <summary>\n        /// The HTTP method, defaulting to GET.\n        /// </summary>\n        public HttpMethod Method { get; set; }\n\n        /// <summary>\n        /// The HTTP method to be used based on the requested method and content. If there is\n        /// no content, GET will be used rather than sending a pointless empty POST request.\n        /// </summary>\n        internal HttpMethod MethodChecked\n        {\n            get\n            {\n                return (Content == null || Method == null) ? HttpMethod.Get : Method;\n            }\n        }\n\n        /// <summary>\n        /// Creates a default set of request parameters.\n        /// </summary>\n        public RequestParams()\n        {\n            AcceptEncoded = false;\n            Authentication = null;\n            Compression = DataCompression.None;\n            Content = null;\n            ContentType = DEFAULT_CONTENT_TYPE;\n            ETag = null;\n            IfModifiedSince = null;\n            Method = HttpMethod.Get;\n        }\n\n        /// <summary>\n        /// Creates a request parameter with POST data.\n        /// </summary>\n        /// <param name=\"content\">The POST data to include, URL encoded.</param>\n        public RequestParams(string content) : this()\n        {\n            if (!string.IsNullOrEmpty(content))\n            {\n                Content = content;\n                Method = HttpMethod.Post;\n            }\n        }\n\n        /// <summary>\n        /// Creates a request parameter based on the data from the last request.\n        /// </summary>\n        /// <param name=\"response\">The previous response.</param>\n        /// <param name=\"content\">The optional POST data to include, URL encoded.</param>\n        public RequestParams(ResponseParams response, string content = null) : this(content)\n        {\n            if (response != null)\n            {\n                ETag = response.ETag;\n                IfModifiedSince = response.Expires;\n            }\n        }\n\n        /// <summary>\n        /// Retrieves the encoded content of this request.\n        /// </summary>\n        /// <returns>The GET/POST data encoded and compressed as necessary.</returns>\n        internal IEnumerable<byte> GetEncodedContent()\n        {\n            IEnumerable<byte> content = null;\n            if (Content != null)\n            {\n                // Only if there is content to encode\n                byte[] encoded = Encoding.UTF8.GetBytes(Content);\n                switch (Compression)\n                {\n                case DataCompression.Gzip:\n                    content = Util.GZipCompress(encoded);\n                    break;\n                case DataCompression.Deflate:\n                    content = Util.DeflateCompress(encoded);\n                    break;\n                case DataCompression.None:\n                    content = encoded;\n                    break;\n                default:\n                    throw new NotImplementedException(\"Encoding type \" + Compression);\n                }\n            }\n            return content;\n        }\n\n        public override string ToString()\n        {\n            return string.Format(\"RequestParams[encoded={0},content-type={1},method={2}]\",\n                AcceptEncoded, ContentType, Method);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Net/ResponseParams.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing System;\nusing System.Net;\nusing System.Net.Http;\n\nnamespace EVEMon.Common.Net\n{\n    /// <summary>\n    /// Groups together response parameters from HTTP requests. Included are the status code,\n    /// ETag (if present), expiration date (if present), and encoding.\n    /// </summary>\n    public sealed class ResponseParams\n    {\n        /// <summary>\n        /// The error count reported from ESI to avoid running into backoff. This represents\n        /// the number of errors remaining in the current period.\n        /// </summary>\n        public int? ErrorCount { get; set; }\n\n        /// <summary>\n        /// The E-Tag received from the server. Null if no e-tag was sent.\n        /// </summary>\n        public string ETag { get; set; }\n\n        /// <summary>\n        /// The time when this data expires. Null if no expiry was sent.\n        /// </summary>\n        public DateTimeOffset? Expires { get; set; }\n\n        /// <summary>\n        /// Reports true if the response indicates that data was not modified. Reports false\n        /// for all other status codes.\n        /// </summary>\n        public bool IsNotModifiedResponse\n        {\n            get\n            {\n                return ResponseCode == (int)HttpStatusCode.NotModified;\n            }\n        }\n\n        /// <summary>\n        /// Reports true if the response indicates that it was successful (HTTP response code).\n        /// Reports false for all other status codes.\n        /// </summary>\n        public bool IsOKResponse\n        {\n            get\n            {\n                return ResponseCode == (int)HttpStatusCode.OK;\n            }\n        }\n\n        /// <summary>\n        /// The maximum number of pages required. Will be 0 if no paging is required, 1 if\n        /// there is only one page.\n        /// </summary>\n        public int Pages { get; }\n\n        /// <summary>\n        /// The response code from the server.\n        /// </summary>\n        public int ResponseCode { get; }\n\n        /// <summary>\n        /// The date and time reported by the server in UTC.\n        /// </summary>\n        public DateTime? Time { get; set; }\n\n        /// <summary>\n        /// Creates a new set of response parameters.\n        /// </summary>\n        /// <param name=\"code\">The response returned by the server</param>\n        public ResponseParams(HttpResponseMessage response) : this((int)response.StatusCode)\n        {\n            // Fill in header data\n            var headers = response.Headers;\n            ErrorCount = headers.ErrorCount();\n            Pages = headers.PageCount();\n            // ETag has quotes on it, keep them to reuse on output tag\n            ETag = headers.ETag?.Tag;\n            Expires = response.Content?.Headers?.Expires;\n            Time = headers.Date?.UtcDateTime ?? DateTime.UtcNow;\n        }\n\n        /// <summary>\n        /// Creates a new set of response parameters.\n        /// </summary>\n        /// <param name=\"code\">The status code returned by the server</param>\n        public ResponseParams(int responseCode)\n        {\n            ErrorCount = null;\n            ETag = null;\n            Expires = null;\n            ResponseCode = responseCode;\n            Time = null;\n        }\n\n        public override string ToString()\n        {\n            return string.Format(\"ResponseParams[code={0:D},expires={1}]\", ResponseCode,\n                Expires);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Notifications/APIErrorNotificationEventArgs.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Notifications\n{\n    public sealed class APIErrorNotificationEventArgs : NotificationEventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"result\">The result.</param>\n        public APIErrorNotificationEventArgs(object sender, IAPIResult result)\n            : base(sender, NotificationCategory.QueryingError)\n        {\n            Result = result;\n        }\n\n        /// <summary>\n        /// Gets the associated API result.\n        /// </summary>\n        public IAPIResult Result { get; private set; }\n\n        /// <summary>\n        /// Gets true if the notification has details.\n        /// </summary>\n        public override bool HasDetails => true;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Notifications/ContractsNotificationEventArgs.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Notifications\n{\n    public sealed class ContractsNotificationEventArgs : NotificationEventArgs\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"contracts\">The contracts.</param>\n        /// <exception cref=\"System.ArgumentNullException\">contracts</exception>\n        public ContractsNotificationEventArgs(object sender, IEnumerable<Contract> contracts)\n            : base(sender, NotificationCategory.ContractsEnded)\n        {\n            contracts.ThrowIfNull(nameof(contracts));\n\n            Contracts = new Collection<Contract>();\n            foreach (Contract contract in contracts)\n            {\n                Contracts.Add(contract);\n            }\n            UpdateDescription();\n        }\n\n        /// <summary>\n        /// Gets the associated API result.\n        /// </summary>\n        public Collection<Contract> Contracts { get; }\n\n        /// <summary>\n        /// Gets true if the notification has details.\n        /// </summary>\n        public override bool HasDetails => true;\n\n        /// <summary>\n        /// Enqueue the contracts from the given notification at the end of this notification.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        public override void Append(NotificationEventArgs other)\n        {\n            foreach (Contract contract in ((ContractsNotificationEventArgs)other).Contracts.Where(x => !x.NotificationSend))\n            {\n                Contracts.Add(contract);\n            }\n\n            UpdateDescription();\n        }\n\n        /// <summary>\n        /// Updates the description.\n        /// </summary>\n        private void UpdateDescription()\n        {\n            Description = $\"{Contracts.Count} contract{(Contracts.Count > 1 ? \"s\" : string.Empty)} finished or needs attention.\";\n        }\n    }\n}\n\n"
  },
  {
    "path": "src/EVEMon.Common/Notifications/EveMailMessageNotificationEventArgs.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.Notifications\n{\n    public sealed class EveMailMessageNotificationEventArgs : NotificationEventArgs\n    {\n        private int m_newMailMessagesCount;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveMailMessageNotificationEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"newMessages\">The new messages.</param>\n        public EveMailMessageNotificationEventArgs(object sender, int newMessages)\n            : base(sender, NotificationCategory.NewEveMailMessage)\n        {\n            m_newMailMessagesCount = newMessages;\n            UpdateDescription();\n        }\n\n        /// <summary>\n        /// Gets true if the notification has details.\n        /// </summary>\n        public override bool HasDetails => false;\n\n        /// <summary>\n        /// Adds the number of new mail messages from the given notification to this notification.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        public override void Append(NotificationEventArgs other)\n        {\n            m_newMailMessagesCount += ((EveMailMessageNotificationEventArgs)other).m_newMailMessagesCount;\n            UpdateDescription();\n        }\n\n        /// <summary>\n        /// Updates the description.\n        /// </summary>\n        private void UpdateDescription()\n        {\n            Description = $\"{m_newMailMessagesCount} new EVE mail message{(m_newMailMessagesCount > 1 ? \"s\" : string.Empty)}.\";\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Notifications/EveNotificationNotificationEventArgs.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.Notifications\n{\n    public sealed class EveNotificationEventArgs : NotificationEventArgs\n    {\n        private int m_newNotificationsCount;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveNotificationEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"newNotifications\">The new notifications.</param>\n        public EveNotificationEventArgs(object sender, int newNotifications)\n            : base(sender, NotificationCategory.NewEveNotification)\n        {\n            m_newNotificationsCount = newNotifications;\n            UpdateDescription();\n        }\n\n        /// <summary>\n        /// Gets true if the notification has details.\n        /// </summary>\n        public override bool HasDetails => false;\n\n        /// <summary>\n        /// Adds the number of new mail messages from the given notification to this notification.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        public override void Append(NotificationEventArgs other)\n        {\n            m_newNotificationsCount += ((EveNotificationEventArgs)other).m_newNotificationsCount;\n            UpdateDescription();\n        }\n\n        /// <summary>\n        /// Updates the description.\n        /// </summary>\n        private void UpdateDescription()\n        {\n            Description = $\"{m_newNotificationsCount} new EVE notification{(m_newNotificationsCount > 1 ? \"s\" : string.Empty)}.\";\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Notifications/IndustryJobsNotificationEventArgs.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Notifications\n{\n    /// <summary>\n    /// Provides notification services for IndustryJobs.\n    /// </summary>\n    public sealed class IndustryJobsNotificationEventArgs : NotificationEventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"IndustryJobsNotificationEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"jobs\">The jobs.</param>\n        /// <exception cref=\"System.ArgumentNullException\">jobs</exception>\n        public IndustryJobsNotificationEventArgs(object sender, IEnumerable<IndustryJob> jobs)\n            : base(sender, NotificationCategory.IndustryJobsCompletion)\n        {\n            jobs.ThrowIfNull(nameof(jobs));\n\n            Jobs = new Collection<IndustryJob>();\n            foreach (IndustryJob job in jobs)\n            {\n                Jobs.Add(job);\n            }\n            UpdateDescription();\n        }\n\n        /// <summary>\n        /// Gets the associated API result.\n        /// </summary>\n        public Collection<IndustryJob> Jobs { get; }\n\n        /// <summary>\n        /// Gets true if the notification has details.\n        /// </summary>\n        public override bool HasDetails => true;\n\n        /// <summary>\n        /// Enqueue the jobs from the given notification at the end of this notification.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        public override void Append(NotificationEventArgs other)\n        {\n            foreach (IndustryJob job in ((IndustryJobsNotificationEventArgs)other).Jobs)\n            {\n                Jobs.Add(job);\n            }\n\n            UpdateDescription();\n        }\n\n        /// <summary>\n        /// Updates the description.\n        /// </summary>\n        private void UpdateDescription()\n        {\n            Description = $\"{Jobs.Count} industry job{(Jobs.Count > 1 ? \"s\" : string.Empty)} completed.\";\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Notifications/MarketOrdersNotificationEventArgs.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Notifications\n{\n    public sealed class MarketOrdersNotificationEventArgs : NotificationEventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MarketOrdersNotificationEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"orders\">The orders.</param>\n        /// <exception cref=\"System.ArgumentNullException\">orders</exception>\n        public MarketOrdersNotificationEventArgs(object sender, IEnumerable<MarketOrder> orders)\n            : base(sender, NotificationCategory.MarketOrdersEnding)\n        {\n            orders.ThrowIfNull(nameof(orders));\n\n            Orders = new Collection<MarketOrder>();\n            foreach (MarketOrder order in orders)\n            {\n                Orders.Add(order);\n            }\n            UpdateDescription();\n        }\n\n        /// <summary>\n        /// Gets the associated API result.\n        /// </summary>\n        public Collection<MarketOrder> Orders { get; }\n\n        /// <summary>\n        /// Gets true if the notification has details.\n        /// </summary>\n        public override bool HasDetails => true;\n\n        /// <summary>\n        /// Enqueue the orders from the given notification at the end of this notification.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        public override void Append(NotificationEventArgs other)\n        {\n            foreach (MarketOrder order in ((MarketOrdersNotificationEventArgs)other).Orders)\n            {\n                Orders.Add(order);\n            }\n\n            UpdateDescription();\n        }\n\n        /// <summary>\n        /// Updates the description.\n        /// </summary>\n        private void UpdateDescription()\n        {\n            Description = $\"{Orders.Count} market order{(Orders.Count > 1 ? \"s\" : string.Empty)} expired or fulfilled.\";\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Notifications/NotificationBehaviour.cs",
    "content": "﻿namespace EVEMon.Common.Notifications\n{\n    /// <summary>\n    /// How the notification interacts with the ones which share the same <see cref=\"NotificationEventArgs.InvalidationKey\"/>.\n    /// </summary>\n    public enum NotificationBehaviour\n    {\n        /// <summary>\n        /// All the notifications with the same invalidation key will cohabit together as distinct notifications.\n        /// </summary>\n        Cohabitate,\n\n        /// <summary>\n        /// Replaces all the previous notifications with the same invalidation key.\n        /// </summary>\n        Overwrite,\n\n        /// <summary>\n        /// All the notifications with this invalidation key will be merged with this one, through their details merging.\n        /// </summary>\n        Merge\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Notifications/NotificationCategory.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.Notifications\n{\n    /// <summary>\n    /// Represents the categories a <see cref=\"NotificationEventArgs\"/> can have.\n    /// </summary>\n    public enum NotificationCategory\n    {\n        /// <summary>\n        /// An API key is to expire.\n        /// </summary>\n        [Header(\"API key expiration\")]\n        APIKeyExpiration,\n        \n        /// <summary>\n        /// An account is to expire.\n        /// </summary>\n        [Header(\"Account expiration\")]\n        AccountExpiration,\n\n        /// <summary>\n        /// None of the characters are currently in training.\n        /// </summary>\n        [Header(\"Account is not training\")]\n        AccountNotInTraining,\n\n        /// <summary>\n        /// A skill training has been completed.\n        /// </summary>\n        [Header(\"Skill completion\")]\n        SkillCompletion,\n\n        /// <summary>\n        /// Skill queue has room for more skills.\n        /// </summary>\n        [Header(\"Skill queue room availability\")]\n        SkillQueueRoomAvailable,\n\n        /// <summary>\n        /// A certificate is claimable.\n        /// </summary>\n        [Obsolete]\n        ClaimableCertificate,\n\n        /// <summary>\n        /// A character has not enough balance to fulfill its buy orders.\n        /// </summary>\n        [Header(\"Insufficient balance\")]\n        InsufficientBalance,\n\n        /// <summary>\n        /// A character has not enough skill points on his clone.\n        /// </summary>\n        [Obsolete]\n        InsufficientClone,\n\n        /// <summary>\n        /// An error occurred while the querying of the API.\n        /// </summary>\n        [Header(\"API problem\")]\n        QueryingError,\n\n        /// <summary>\n        /// The status of EVE server changed.\n        /// </summary>\n        [Header(\"EVE server status change\")]\n        ServerStatusChange,\n\n        /// <summary>\n        /// The IGB service has a problem.\n        /// </summary>\n        [Obsolete]\n        IgbServiceException,\n\n        /// <summary>\n        /// Some orders expired since the last time.\n        /// </summary>\n        [Header(\"Market orders expired/fulfilled\")]\n        MarketOrdersEnding,\n\n        /// <summary>\n        /// Some contracts expired since the last time.\n        /// </summary>\n        [Header(\"Contracts expired/fulfilled\")]\n        ContractsEnded,\n\n        /// <summary>\n        /// Some contracts are assigned to the character.\n        /// </summary>\n        [Header(\"Contracts assigned\")]\n        ContractsAssigned,\n\n        /// <summary>\n        /// An industry job has been completed.\n        /// </summary>\n        [Header(\"Industry jobs completion\")]\n        IndustryJobsCompletion,\n\n        /// <summary>\n        /// An planetary pin work has been completed.\n        /// </summary>\n        [Header(\"Planetary pins completed\")]\n        PlanetaryPinsCompleted,\n\n        /// <summary>\n        /// A new EVE mail message is available.\n        /// </summary>\n        [Header(\"New EVE mail message\")]\n        NewEveMailMessage,\n\n        /// <summary>\n        /// A new EVE notification is available.\n        /// </summary>\n        [Header(\"New EVE notification\")]\n        NewEveNotification,\n\n        /// <summary>\n        /// Testing notification.\n        /// </summary>\n        [Header(\"Test Notification\")]\n        TestNofitication,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Notifications/NotificationEventArgs.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Threading;\n\nnamespace EVEMon.Common.Notifications\n{\n    /// <summary>\n    /// Represents an argument for a notification invalidation.\n    /// </summary>\n    public class NotificationEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"category\"></param>\n        /// <param name=\"sender\"></param>\n        public NotificationEventArgs(object sender, NotificationCategory category)\n        {\n            Sender = sender;\n            Category = category;\n        }\n\n        /// <summary>\n        /// Gets this category's notification.\n        /// </summary>\n        public NotificationCategory Category { get; }\n\n        /// <summary>\n        /// Gets the sender of this notification.\n        /// </summary>\n        public object Sender { get; }\n\n        /// <summary>\n        /// Gets the API key that sent this notification, or null if the sender was not an account.\n        /// </summary>\n        public ESIKey SenderAPIKey => Sender as ESIKey;\n\n        /// <summary>\n        /// Gets the character that sent this notification, or null if the sender was not a character.\n        /// </summary>\n        public Character SenderCharacter => Sender as Character;\n\n        /// <summary>\n        /// Gets the corporation that sent this notification, or null if the sender was not a corporation.\n        /// </summary>\n        public Corporation SenderCorporation => Sender as Corporation;\n\n        /// <summary>\n        /// Gets or sets the description.\n        /// </summary>\n        public string Description { get; set; }\n\n        /// <summary>\n        /// Gets or sets the priority for this notification.\n        /// </summary>\n        public NotificationPriority Priority { get; set; }\n\n        /// <summary>\n        /// Gets or sets the behaviour of this notification regarding other notifications with the same validation key.\n        /// </summary>\n        public NotificationBehaviour Behaviour { get; set; }\n\n        /// <summary>\n        /// Gets true if the notification has details.\n        /// </summary>\n        public virtual bool HasDetails => false;\n\n        /// <summary>\n        /// Gets a key, identifying a category/sender pair, that will be used for invalidation.\n        /// </summary>\n        public long InvalidationKey => GetKey(Sender, Category);\n\n        /// <summary>\n        /// Gets the key for the given sender and category.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"category\"></param>\n        /// <returns></returns>\n        public static long GetKey(object sender, NotificationCategory category)\n        {\n            long left = (long)category << 32;\n            int right = sender?.GetHashCode() ?? 0;\n            return left | unchecked((uint)right);\n        }\n\n        /// <summary>\n        /// Appends a given notification to this one.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        public virtual void Append(NotificationEventArgs other)\n        {\n            // Must have to be implemented by inheritors\n            throw new NotImplementedException();\n        }\n\n        /// <summary>\n        /// Schedules an action on this notification.\n        /// </summary>\n        /// <param name=\"time\">The time.</param>\n        /// <param name=\"callback\">The callback.</param>\n        public static void ScheduleAction(TimeSpan time, Action callback)\n        {\n            Dispatcher.Schedule(time, callback.Invoke);\n        }\n\n        /// <summary>\n        /// Gets the description for this notification.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => Description;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Notifications/NotificationInvalidationEventArgs.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Notifications\n{\n    /// <summary>\n    /// A class for the arguments of notifications invalidation.\n    /// </summary>\n    public sealed class NotificationInvalidationEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Constructor with a key identifying a sender/category pair.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"category\"></param>\n        public NotificationInvalidationEventArgs(object sender, NotificationCategory category)\n        {\n            Key = NotificationEventArgs.GetKey(sender, category);\n        }\n\n        /// <summary>\n        /// Constructor with a key gotten from a notification.\n        /// </summary>\n        /// <param name=\"notification\">The notification.</param>\n        /// <exception cref=\"System.ArgumentNullException\">notification</exception>\n        public NotificationInvalidationEventArgs(NotificationEventArgs notification)\n        {\n            notification.ThrowIfNull(nameof(notification));\n\n            Key = notification.InvalidationKey;\n        }\n\n        /// <summary>\n        /// Gets a key identifying the notifications to invalidate.\n        /// </summary>\n        public long Key { get; private set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Notifications/NotificationPriority.cs",
    "content": "﻿namespace EVEMon.Common.Notifications\n{\n    /// <summary>\n    /// Represents the priority of a <see cref=\"NotificationEventArgs\"/>.\n    /// </summary>\n    public enum NotificationPriority\n    {\n        /// <summary>\n        /// This notification is a mere information.\n        /// </summary>\n        Information = 0,\n\n        /// <summary>\n        /// The notification is a warnining.\n        /// </summary>\n        Warning = 1,\n\n        /// <summary>\n        /// The notification is an error.\n        /// </summary>\n        Error = 2\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Notifications/PlanetaryPinsNotificationEventArgs.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Notifications\n{\n    /// <summary>\n    /// Provides notification services for PlanetaryPins.\n    /// </summary>\n    public sealed class PlanetaryPinsNotificationEventArgs: NotificationEventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanetaryPinsNotificationEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"pins\">The pins.</param>\n        /// <exception cref=\"System.ArgumentNullException\">pins</exception>\n        public PlanetaryPinsNotificationEventArgs(object sender, IEnumerable<PlanetaryPin> pins)\n            : base(sender, NotificationCategory.PlanetaryPinsCompleted)\n        {\n            pins.ThrowIfNull(nameof(pins));\n\n            PlanetaryPins = new Collection<PlanetaryPin>();\n            foreach (PlanetaryPin pin in pins)\n            {\n                PlanetaryPins.Add(pin);\n            }\n            UpdateDescription();\n        }\n   \n        /// <summary>\n        /// Gets the associated API result.\n        /// </summary>\n        public Collection<PlanetaryPin> PlanetaryPins { get; }\n\n        /// <summary>\n        /// Gets true if the notification has details.\n        /// </summary>\n        public override bool HasDetails => true;\n\n        /// <summary>\n        /// Enqueue the jobs from the given notification at the end of this notification.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        public override void Append(NotificationEventArgs other)\n        {\n            foreach (PlanetaryPin pin in ((PlanetaryPinsNotificationEventArgs)other).PlanetaryPins)\n            {\n                PlanetaryPins.Add(pin);\n            }\n\n            UpdateDescription();\n        }\n\n        /// <summary>\n        /// Updates the description.\n        /// </summary>\n        private void UpdateDescription()\n        {\n            Description = $\"{PlanetaryPins.Count} planetary colon{(PlanetaryPins.Count == 1 ? \"y\" : \"ies\")} are idle.\";\n        }\n    }\n }\n"
  },
  {
    "path": "src/EVEMon.Common/Notifications/SkillCompletionNotificationEventArgs.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.Notifications\n{\n    public sealed class SkillCompletionNotificationEventArgs : NotificationEventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SkillCompletionNotificationEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"skills\">The skills.</param>\n        /// <exception cref=\"System.ArgumentNullException\">skills</exception>\n        public SkillCompletionNotificationEventArgs(object sender, IEnumerable<QueuedSkill> skills)\n            : base(sender, NotificationCategory.SkillCompletion)\n        {\n            skills.ThrowIfNull(nameof(skills));\n\n            Skills = new Collection<QueuedSkill>();\n            foreach (QueuedSkill skill in skills)\n                Skills.Add(skill);\n            UpdateDescription();\n        }\n\n        /// <summary>\n        /// Gets the associated API result.\n        /// </summary>\n        public Collection<QueuedSkill> Skills { get; }\n\n        /// <summary>\n        /// Gets true if the notification has details.\n        /// </summary>\n        public override bool HasDetails => Skills.Count != 1;\n\n        /// <summary>\n        /// Enqueue the skills from the given notification at the end of this notification.\n        /// </summary>\n        /// <param name=\"other\"></param>\n        public override void Append(NotificationEventArgs other)\n        {\n            var skills = ((SkillCompletionNotificationEventArgs)other).Skills;\n            foreach (QueuedSkill skill in skills)\n                if (!Skills.Contains(skill))\n                    Skills.Add(skill);\n            UpdateDescription();\n        }\n\n        /// <summary>\n        /// Updates the description.\n        /// </summary>\n        private void UpdateDescription()\n        {\n            Description = Skills.Count == 1 ? $\"{Skills.First().SkillName} {Skill.GetRomanFromInt(Skills.First().Level)} completed.\" :\n                $\"{Skills.Count} skills completed.\";\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// Note: Shared assembly information is specified in SharedAssemblyInfo.cs\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"EVEMon.Common\")]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"6c038062-ce9e-48bc-905a-b1a98479ef23\")]\n"
  },
  {
    "path": "src/EVEMon.Common/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Common.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Common.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap AccountWide32 {\n            get {\n                object obj = ResourceManager.GetObject(\"AccountWide32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap BadStanding {\n            get {\n                object obj = ResourceManager.GetObject(\"BadStanding\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Bug {\n            get {\n                object obj = ResourceManager.GetObject(\"Bug\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;!DOCTYPE html&gt;\n        ///&lt;html lang=&quot;en&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;\n        ///&lt;head&gt;\n        ///    &lt;meta charset=&quot;utf-8&quot; /&gt;\n        ///    &lt;title&gt;Error&lt;/title&gt;\n        ///    &lt;style&gt;\n        ///        p, body { color: #FFFFFF; font-family: ProximaNova-Regular, Arial }\n        ///\t\th2 { text-align: center; margin-bottom: 10px; text-shadow: 1px 1px 2px #7F7F7F; font-size: 30px; font-family: &quot;ProximaNova-SemiBold&quot;,Arial }\n        ///        body { background: #000000 url(https://login.eveonline.com/Images/site-bg.jpg) no-repeat center center fixed }\n        ///        #content { bac [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string CallbackFail {\n            get {\n                return ResourceManager.GetString(\"CallbackFail\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;!DOCTYPE html&gt;\n        ///&lt;html lang=&quot;en&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;\n        ///&lt;head&gt;\n        ///    &lt;meta charset=&quot;utf-8&quot; /&gt;\n        ///    &lt;title&gt;Authentication Successful&lt;/title&gt;\n        ///    &lt;style&gt;\n        ///        p, body { color: #FFFFFF; font-family: ProximaNova-Regular, Arial }\n        ///\t\th2 { text-align: center; margin-bottom: 10px; text-shadow: 1px 1px 2px #7F7F7F; font-size: 30px; font-family: &quot;ProximaNova-SemiBold&quot;,Arial }\n        ///        body { background: #000000 url(https://login.eveonline.com/Images/site-bg.jpg) no-repeat center center fixed }\n        ///   [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string CallbackOK {\n            get {\n                return ResourceManager.GetString(\"CallbackOK\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to factionID,factionName,description,raceIDs,solarSystemID,corporationID,sizeFactor,stationCount,stationSystemCount,militiaCorporationID,iconID\n        ///500001,Caldari State,&quot;The Caldari State is ruled by several mega-corporations. There is no central government to speak of - all territories within the State are owned and ruled by corporations. Duty and discipline are required traits in Caldari citizens, plus unquestioning loyalty to the corporation they live to serve. The corporations compete aggressively amongst the [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string chrFactions {\n            get {\n                return ResourceManager.GetString(\"chrFactions\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Collapse {\n            get {\n                object obj = ResourceManager.GetObject(\"Collapse\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Byte[].\n        /// </summary>\n        public static byte[] ContextMenuPointer {\n            get {\n                object obj = ResourceManager.GetObject(\"ContextMenuPointer\", resourceCulture);\n                return ((byte[])(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Copy {\n            get {\n                object obj = ResourceManager.GetObject(\"Copy\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap CrossBlack {\n            get {\n                object obj = ResourceManager.GetObject(\"CrossBlack\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap CrossGray {\n            get {\n                object obj = ResourceManager.GetObject(\"CrossGray\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n        ///\n        ///&lt;xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;\n        ///                xmlns:msxsl=&quot;urn:schemas-microsoft-com:xslt&quot; exclude-result-prefixes=&quot;msxsl&quot;&gt;\n        ///  &lt;xsl:strip-space elements=&quot;*&quot; /&gt;\n        ///  &lt;xsl:output method=&quot;xml&quot; indent=&quot;yes&quot;/&gt;\n        ///\n        ///  &lt;xsl:template match=&quot;@* | node()&quot;&gt;\n        ///    &lt;xsl:copy&gt;\n        ///      &lt;xsl:apply-templates select=&quot;@* | node()&quot;/&gt;\n        ///    &lt;/xsl:copy&gt;\n        ///  &lt;/xsl:template&gt;\n        ///\n        ///  &lt;!-- Renaming root name &apos;blueprints&apos; in blueprints datafile to &apos;bluep [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string DatafilesXSLT {\n            get {\n                return ResourceManager.GetString(\"DatafilesXSLT\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Deadspace {\n            get {\n                object obj = ResourceManager.GetObject(\"Deadspace\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap DefaultAllianceImage32 {\n            get {\n                object obj = ResourceManager.GetObject(\"DefaultAllianceImage32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap DefaultCharacterImage32 {\n            get {\n                object obj = ResourceManager.GetObject(\"DefaultCharacterImage32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap DefaultCorporationImage32 {\n            get {\n                object obj = ResourceManager.GetObject(\"DefaultCorporationImage32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Error16 {\n            get {\n                object obj = ResourceManager.GetObject(\"Error16\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the wallet balance for {0}..\n        /// </summary>\n        public static string ErrorAccountBalance {\n            get {\n                return ResourceManager.GetString(\"ErrorAccountBalance\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the account status for API key {0}..\n        /// </summary>\n        public static string ErrorAccountStatus {\n            get {\n                return ResourceManager.GetString(\"ErrorAccountStatus\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the assets of {0}..\n        /// </summary>\n        public static string ErrorAssets {\n            get {\n                return ResourceManager.GetString(\"ErrorAssets\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the learning attributes of {0}..\n        /// </summary>\n        public static string ErrorAttributes {\n            get {\n                return ResourceManager.GetString(\"ErrorAttributes\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error obtaining calendar event attendees for {0}..\n        /// </summary>\n        public static string ErrorCalendarAttendees {\n            get {\n                return ResourceManager.GetString(\"ErrorCalendarAttendees\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error obtaining calendar event details for {0}..\n        /// </summary>\n        public static string ErrorCalendarDetails {\n            get {\n                return ResourceManager.GetString(\"ErrorCalendarDetails\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying calendar events for {0}..\n        /// </summary>\n        public static string ErrorCalendarEvents {\n            get {\n                return ResourceManager.GetString(\"ErrorCalendarEvents\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error retrieving character list for {0:D}.\n        ///If you changed your password, you must log in again using File &gt; Add Character..\n        /// </summary>\n        public static string ErrorCharacterList {\n            get {\n                return ResourceManager.GetString(\"ErrorCharacterList\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the character sheet for {0}..\n        /// </summary>\n        public static string ErrorCharacterSheet {\n            get {\n                return ResourceManager.GetString(\"ErrorCharacterSheet\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying contacts for {0}..\n        /// </summary>\n        public static string ErrorContacts {\n            get {\n                return ResourceManager.GetString(\"ErrorContacts\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error obtaining contract bids for {0}..\n        /// </summary>\n        public static string ErrorContractBids {\n            get {\n                return ResourceManager.GetString(\"ErrorContractBids\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error obtaining contract items for {0}..\n        /// </summary>\n        public static string ErrorContractItems {\n            get {\n                return ResourceManager.GetString(\"ErrorContractItems\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the contracts of {0}..\n        /// </summary>\n        public static string ErrorContracts {\n            get {\n                return ResourceManager.GetString(\"ErrorContracts\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the employment history of {0}..\n        /// </summary>\n        public static string ErrorEmploymentHistory {\n            get {\n                return ResourceManager.GetString(\"ErrorEmploymentHistory\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the EVE faction war list..\n        /// </summary>\n        public static string ErrorEVEFacWarList {\n            get {\n                return ResourceManager.GetString(\"ErrorEVEFacWarList\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying EVE factional warfare statistics..\n        /// </summary>\n        public static string ErrorEVEFacWarStat {\n            get {\n                return ResourceManager.GetString(\"ErrorEVEFacWarStat\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying mail messages for {0}..\n        /// </summary>\n        public static string ErrorEVEMail {\n            get {\n                return ResourceManager.GetString(\"ErrorEVEMail\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error obtaining mail contents for {0}..\n        /// </summary>\n        public static string ErrorEVEMailBody {\n            get {\n                return ResourceManager.GetString(\"ErrorEVEMailBody\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying mailing lists for {0}..\n        /// </summary>\n        public static string ErrorEVEMailLists {\n            get {\n                return ResourceManager.GetString(\"ErrorEVEMailLists\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the faction warfare statistics of {0}..\n        /// </summary>\n        public static string ErrorFacWarStat {\n            get {\n                return ResourceManager.GetString(\"ErrorFacWarStat\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error looking up character identities..\n        /// </summary>\n        public static string ErrorIDToName {\n            get {\n                return ResourceManager.GetString(\"ErrorIDToName\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the implants of {0}..\n        /// </summary>\n        public static string ErrorImplants {\n            get {\n                return ResourceManager.GetString(\"ErrorImplants\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying industry jobs for {0}..\n        /// </summary>\n        public static string ErrorIndustryJobs {\n            get {\n                return ResourceManager.GetString(\"ErrorIndustryJobs\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the jump clones of {0}..\n        /// </summary>\n        public static string ErrorJumpClones {\n            get {\n                return ResourceManager.GetString(\"ErrorJumpClones\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the jump fatigue of {0}..\n        /// </summary>\n        public static string ErrorJumpFatigue {\n            get {\n                return ResourceManager.GetString(\"ErrorJumpFatigue\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying kill log for {0}..\n        /// </summary>\n        public static string ErrorKillLog {\n            get {\n                return ResourceManager.GetString(\"ErrorKillLog\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error obtaining kill mail {0} from the server..\n        /// </summary>\n        public static string ErrorKillMail {\n            get {\n                return ResourceManager.GetString(\"ErrorKillMail\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the location of {0}..\n        /// </summary>\n        public static string ErrorLocation {\n            get {\n                return ResourceManager.GetString(\"ErrorLocation\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying loyalty point balance of {0}..\n        /// </summary>\n        public static string ErrorLoyalty {\n            get {\n                return ResourceManager.GetString(\"ErrorLoyalty\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the market orders of {0}..\n        /// </summary>\n        public static string ErrorMarketOrders {\n            get {\n                return ResourceManager.GetString(\"ErrorMarketOrders\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying medals for {0}..\n        /// </summary>\n        public static string ErrorMedals {\n            get {\n                return ResourceManager.GetString(\"ErrorMedals\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying EVE notifications for {0}..\n        /// </summary>\n        public static string ErrorNotifications {\n            get {\n                return ResourceManager.GetString(\"ErrorNotifications\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error obtaining planetary production layout for {0}..\n        /// </summary>\n        public static string ErrorPlanetLayout {\n            get {\n                return ResourceManager.GetString(\"ErrorPlanetLayout\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying planetary production information..\n        /// </summary>\n        public static string ErrorPlanets {\n            get {\n                return ResourceManager.GetString(\"ErrorPlanets\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying research points for {0}..\n        /// </summary>\n        public static string ErrorResearchPoints {\n            get {\n                return ResourceManager.GetString(\"ErrorResearchPoints\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the current ship of {0}..\n        /// </summary>\n        public static string ErrorShip {\n            get {\n                return ResourceManager.GetString(\"ErrorShip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Erorr querying the skill queue of {0}..\n        /// </summary>\n        public static string ErrorSkillQueue {\n            get {\n                return ResourceManager.GetString(\"ErrorSkillQueue\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the known skills of {0}..\n        /// </summary>\n        public static string ErrorSkills {\n            get {\n                return ResourceManager.GetString(\"ErrorSkills\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error logging in to EVE SSO.\n        ///If you changed your password, you must log in again using File &gt; Add Character..\n        /// </summary>\n        public static string ErrorSSO {\n            get {\n                return ResourceManager.GetString(\"ErrorSSO\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the standings of {0}..\n        /// </summary>\n        public static string ErrorStandings {\n            get {\n                return ResourceManager.GetString(\"ErrorStandings\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error looking up station information..\n        /// </summary>\n        public static string ErrorStation {\n            get {\n                return ResourceManager.GetString(\"ErrorStation\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying the EVE server status. Check EVE server uptime on http://eve-offline.net/.\n        /// </summary>\n        public static string ErrorStatus {\n            get {\n                return ResourceManager.GetString(\"ErrorStatus\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error looking up citadel information..\n        /// </summary>\n        public static string ErrorStructure {\n            get {\n                return ResourceManager.GetString(\"ErrorStructure\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying wallet journal for {0}..\n        /// </summary>\n        public static string ErrorWalletJournal {\n            get {\n                return ResourceManager.GetString(\"ErrorWalletJournal\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error querying wallet transactions for {0}..\n        /// </summary>\n        public static string ErrorWalletTransactions {\n            get {\n                return ResourceManager.GetString(\"ErrorWalletTransactions\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).\n        /// </summary>\n        public static System.Drawing.Icon EVEMon {\n            get {\n                object obj = ResourceManager.GetObject(\"EVEMon\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap ExcellentStanding {\n            get {\n                object obj = ResourceManager.GetObject(\"ExcellentStanding\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Expand {\n            get {\n                object obj = ResourceManager.GetObject(\"Expand\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Faction {\n            get {\n                object obj = ResourceManager.GetObject(\"Faction\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot;?&gt;\n        ///&lt;invFlags xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;\n        ///  &lt;rowset name=&quot;flags&quot; key=&quot;flagID&quot; columns=&quot;flagID,flagName,flagText&quot;&gt;\n        ///    &lt;row flagID=&quot;0&quot; flagName=&quot;None&quot; flagText=&quot;None&quot; /&gt;\n        ///    &lt;row flagID=&quot;1&quot; flagName=&quot;Wallet&quot; flagText=&quot;Wallet&quot; /&gt;\n        ///    &lt;row flagID=&quot;2&quot; flagName=&quot;Offices&quot; flagText=&quot;OfficeFolder&quot; /&gt;\n        ///    &lt;row flagID=&quot;3&quot; flagName=&quot;Wardrobe&quot; flagText=&quot;Wardrobe&quot; /&gt;\n        ///    &lt;row flagID=&quot;4&quot; flagName=&quot;Hangar&quot; flagText=&quot;Hangar&quot; /&gt; [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string Flags {\n            get {\n                return ResourceManager.GetString(\"Flags\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap GoodStanding {\n            get {\n                object obj = ResourceManager.GetObject(\"GoodStanding\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Information16 {\n            get {\n                object obj = ResourceManager.GetObject(\"Information16\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap KeyGold16 {\n            get {\n                object obj = ResourceManager.GetObject(\"KeyGold16\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap KeyGrey16 {\n            get {\n                object obj = ResourceManager.GetObject(\"KeyGrey16\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap KeyWrong32 {\n            get {\n                object obj = ResourceManager.GetObject(\"KeyWrong32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Magnifier {\n            get {\n                object obj = ResourceManager.GetObject(\"Magnifier\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Medal32 {\n            get {\n                object obj = ResourceManager.GetObject(\"Medal32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This account expires in {0}: {1}..\n        /// </summary>\n        public static string MessageExpiration {\n            get {\n                return ResourceManager.GetString(\"MessageExpiration\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Character {0} has less than {1} day{2} of skills queued..\n        /// </summary>\n        public static string MessageLessThanDay {\n            get {\n                return ResourceManager.GetString(\"MessageLessThanDay\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Character {0} has insufficient funds to fulfill all of its buy orders..\n        /// </summary>\n        public static string MessageMarginTrading {\n            get {\n                return ResourceManager.GetString(\"MessageMarginTrading\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to {0} assigned contract{1}..\n        /// </summary>\n        public static string MessageNewContracts {\n            get {\n                return ResourceManager.GetString(\"MessageNewContracts\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap NeutralStanding {\n            get {\n                object obj = ResourceManager.GetObject(\"NeutralStanding\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot;?&gt;\n        ///&lt;eveapi version=&quot;2&quot;&gt;\n        ///  &lt;currentTime&gt;&lt;/currentTime&gt;\n        ///  &lt;result&gt;\n        ///    &lt;rowset name=&quot;refTypes&quot; key=&quot;refTypeID&quot; columns=&quot;refTypeID,refTypeCode,refTypeName,subjectLayout,textLayout&quot;&gt;\n        ///      &lt;row refTypeID=&quot;1&quot; refTypeCode=&quot;OldLscMessages&quot; refTypeName=&quot;Old Notifications&quot; subjectLayout=&quot;{subject}&quot; textLayout=&quot;{body}&quot;/&gt;\n        ///      &lt;row refTypeID=&quot;2&quot; refTypeCode=&quot;CharTerminationMsg&quot; refTypeName=&quot;Member Biomassed&quot; subjectLayout=&quot;RIP Corporation member {charID}&quot; textLayout=&quot;The untimely death of fel [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string NotificationRefTypes {\n            get {\n                return ResourceManager.GetString(\"NotificationRefTypes\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Officer {\n            get {\n                object obj = ResourceManager.GetObject(\"Officer\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;?xml version=&apos;1.0&apos; encoding=&apos;UTF-8&apos;?&gt;\n        ///&lt;eveapi version=&quot;2&quot;&gt;\n        ///  &lt;currentTime&gt;2018-03-27 00:53:15&lt;/currentTime&gt;\n        ///  &lt;result&gt;\n        ///    &lt;rowset name=&quot;refTypes&quot; key=&quot;refTypeID&quot; columns=&quot;refTypeID,refTypeName&quot;&gt;\n        ///      &lt;row refTypeID=&quot;0&quot; refTypeName=&quot;Undefined&quot; /&gt;\n        ///      &lt;row refTypeID=&quot;1&quot; refTypeName=&quot;Player Trading&quot; /&gt;\n        ///      &lt;row refTypeID=&quot;2&quot; refTypeName=&quot;Market Transaction&quot; /&gt;\n        ///      &lt;row refTypeID=&quot;3&quot; refTypeName=&quot;GM Cash Transfer&quot; /&gt;\n        ///      &lt;row refTypeID=&quot;4&quot; refTypeName=&quot;ATM Withdraw&quot; /&gt;\n        ///      &lt;row refTypeID= [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string RefTypes {\n            get {\n                return ResourceManager.GetString(\"RefTypes\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n        ///\n        ///&lt;xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;\n        ///                xmlns:msxsl=&quot;urn:schemas-microsoft-com:xslt&quot; exclude-result-prefixes=&quot;msxsl&quot;&gt;\n        ///  &lt;xsl:strip-space elements=&quot;*&quot; /&gt;\n        ///  &lt;xsl:output method=&quot;xml&quot; indent=&quot;yes&quot; /&gt;\n        ///\n        ///  &lt;xsl:template match=&quot;@* | node()&quot;&gt;\n        ///    &lt;xsl:copy&gt;\n        ///      &lt;xsl:apply-templates select=&quot;@* | node()&quot; /&gt;\n        ///    &lt;/xsl:copy&gt;\n        ///  &lt;/xsl:template&gt;\n        ///\n        ///  &lt;!-- Rowsets are transformed into something else--&gt;\n        ///  &lt;xsl:templat [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string RowsetsXSLT {\n            get {\n                return ResourceManager.GetString(\"RowsetsXSLT\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n        ///&lt;xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;\n        ///    xmlns:msxsl=&quot;urn:schemas-microsoft-com:xslt&quot; exclude-result-prefixes=&quot;msxsl&quot;&gt;\n        ///  &lt;xsl:strip-space elements=&quot;*&quot; /&gt;\n        ///  &lt;xsl:output method=&quot;xml&quot; indent=&quot;yes&quot;/&gt;\n        ///\n        ///  &lt;xsl:template match=&quot;@* | node()&quot;&gt;\n        ///    &lt;xsl:copy&gt;\n        ///      &lt;xsl:apply-templates select=&quot;@* | node()&quot;/&gt;\n        ///    &lt;/xsl:copy&gt;\n        ///  &lt;/xsl:template&gt;\n        ///\n        ///  &lt;!--Transforms the SerializableDictionary to its Modified version--&gt;\n        ///  &lt;xsl:templa [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string SettingsXSLT {\n            get {\n                return ResourceManager.GetString(\"SettingsXSLT\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.IO.UnmanagedMemoryStream similar to System.IO.MemoryStream.\n        /// </summary>\n        public static System.IO.UnmanagedMemoryStream SkillTrained {\n            get {\n                return ResourceManager.GetStream(\"SkillTrained\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Storyline {\n            get {\n                object obj = ResourceManager.GetObject(\"Storyline\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap T2 {\n            get {\n                object obj = ResourceManager.GetObject(\"T2\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap T3 {\n            get {\n                object obj = ResourceManager.GetObject(\"T3\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap TerribleStanding {\n            get {\n                object obj = ResourceManager.GetObject(\"TerribleStanding\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Throbber {\n            get {\n                object obj = ResourceManager.GetObject(\"Throbber\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Warning16 {\n            get {\n                object obj = ResourceManager.GetObject(\"Warning16\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Watch {\n            get {\n                object obj = ResourceManager.GetObject(\"Watch\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n        ///\n        ///&lt;xsl:stylesheet xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot; version=&quot;1.0&quot;&gt;\n        ///  &lt;xsl:template match=&quot;outputCharacter&quot;&gt;\n        ///    &lt;html&gt;\n        ///      &lt;head&gt;\n        ///        &lt;title&gt;\n        ///          Character Sheet ::\n        ///          &lt;xsl:value-of select=&quot;@name&quot; /&gt;\n        ///        &lt;/title&gt;\n        ///      &lt;/head&gt;\n        ///      &lt;body&gt;\n        ///        &lt;table&gt;\n        ///          &lt;tr&gt;\n        ///            &lt;td&gt;\n        ///              &lt;xsl:element name=&quot;img&quot;&gt;\n        ///                &lt;xsl:attribute name=&quot;src&quot;&gt;http://image.eveonline.com/character/&lt;xsl:value-of  [rest of string was truncated]&quot;;.\n        /// </summary>\n        public static string XmlToHtmlXslt {\n            get {\n                return ResourceManager.GetString(\"XmlToHtmlXslt\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"RowsetsXSLT\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Serialization\\Eve\\rowsets-transform.xslt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>\n  </data>\n  <data name=\"SkillTrained\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Audio\\SkillTrained.wav;System.IO.MemoryStream, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"XmlToHtmlXslt\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Serialization\\Exportation\\output-html.xslt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>\n  </data>\n  <data name=\"KeyGold16\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\APIKeyFull16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"KeyGrey16\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\APIKeyLimited16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"KeyWrong32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\APIKeyWrong.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Bug\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\bee.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Collapse\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\Collapse_large.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"CrossBlack\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\cross-black.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"CrossGray\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\cross-gray.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Deadspace\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Overlay icons\\Deadspace.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Error16\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\Error16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Expand\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\Expand_large.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Faction\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Overlay icons\\Faction.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Information16\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\Information16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Magnifier\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\Magnifier.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Officer\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Overlay icons\\Officer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Storyline\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Overlay icons\\Storyline.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"T2\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Overlay icons\\T2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"T3\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Overlay icons\\T3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Throbber\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\Throbber.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Warning16\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\Warning16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"NotificationRefTypes\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Serialization\\NotificationRefTypes.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;windows-1253</value>\n  </data>\n  <data name=\"DefaultAllianceImage32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\DefaultAllianceImage32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"DefaultCharacterImage32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\DefaultCharacterImage32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"DefaultCorporationImage32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\DefaultCorporationImage32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"DatafilesXSLT\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Serialization\\Datafiles\\datafile-transform.xslt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>\n  </data>\n  <data name=\"AccountWide32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\AccountWide32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"SettingsXSLT\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Serialization\\Settings\\settings-transform.xslt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>\n  </data>\n  <data name=\"Flags\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Serialization\\Flags.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;windows-1253</value>\n  </data>\n  <data name=\"EVEMon\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Icons\\EVEMon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"BadStanding\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\standingIconBad.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"ExcellentStanding\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\standingIconExcelent.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"GoodStanding\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\standingIconGood.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"NeutralStanding\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\standingIconNeutral.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"TerribleStanding\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\standingIconTerrible.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Watch\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\Watch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Medal32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\Medal32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"Copy\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Images\\Copy.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"ContextMenuPointer\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Cursors\\ContextMenuPointer.cur;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"RefTypes\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Serialization\\RefTypes.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>\n  </data>\n  <data name=\"CallbackFail\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\callback_fail.htm;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>\n  </data>\n  <data name=\"CallbackOK\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\callback_ok.htm;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>\n  </data>\n  <data name=\"chrFactions\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\chrFactions.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>\n  </data>\n  <data name=\"ErrorAccountBalance\" xml:space=\"preserve\">\n    <value>Error querying the wallet balance for {0}.</value>\n  </data>\n  <data name=\"ErrorAccountStatus\" xml:space=\"preserve\">\n    <value>Error querying the account status for API key {0}.</value>\n  </data>\n  <data name=\"ErrorAssets\" xml:space=\"preserve\">\n    <value>Error querying the assets of {0}.</value>\n  </data>\n  <data name=\"ErrorAttributes\" xml:space=\"preserve\">\n    <value>Error querying the learning attributes of {0}.</value>\n  </data>\n  <data name=\"ErrorCalendarAttendees\" xml:space=\"preserve\">\n    <value>Error obtaining calendar event attendees for {0}.</value>\n  </data>\n  <data name=\"ErrorCalendarDetails\" xml:space=\"preserve\">\n    <value>Error obtaining calendar event details for {0}.</value>\n  </data>\n  <data name=\"ErrorCalendarEvents\" xml:space=\"preserve\">\n    <value>Error querying calendar events for {0}.</value>\n  </data>\n  <data name=\"ErrorCharacterList\" xml:space=\"preserve\">\n    <value>Error retrieving character list for {0:D}.\nIf you changed your password, you must log in again using File &gt; Add Character.</value>\n  </data>\n  <data name=\"ErrorCharacterSheet\" xml:space=\"preserve\">\n    <value>Error querying the character sheet for {0}.</value>\n  </data>\n  <data name=\"ErrorContacts\" xml:space=\"preserve\">\n    <value>Error querying contacts for {0}.</value>\n  </data>\n  <data name=\"ErrorContractBids\" xml:space=\"preserve\">\n    <value>Error obtaining contract bids for {0}.</value>\n  </data>\n  <data name=\"ErrorContractItems\" xml:space=\"preserve\">\n    <value>Error obtaining contract items for {0}.</value>\n  </data>\n  <data name=\"ErrorContracts\" xml:space=\"preserve\">\n    <value>Error querying the contracts of {0}.</value>\n  </data>\n  <data name=\"ErrorEmploymentHistory\" xml:space=\"preserve\">\n    <value>Error querying the employment history of {0}.</value>\n  </data>\n  <data name=\"ErrorEVEFacWarList\" xml:space=\"preserve\">\n    <value>Error querying the EVE faction war list.</value>\n  </data>\n  <data name=\"ErrorEVEFacWarStat\" xml:space=\"preserve\">\n    <value>Error querying EVE factional warfare statistics.</value>\n  </data>\n  <data name=\"ErrorEVEMail\" xml:space=\"preserve\">\n    <value>Error querying mail messages for {0}.</value>\n  </data>\n  <data name=\"ErrorEVEMailBody\" xml:space=\"preserve\">\n    <value>Error obtaining mail contents for {0}.</value>\n  </data>\n  <data name=\"ErrorEVEMailLists\" xml:space=\"preserve\">\n    <value>Error querying mailing lists for {0}.</value>\n  </data>\n  <data name=\"ErrorFacWarStat\" xml:space=\"preserve\">\n    <value>Error querying the faction warfare statistics of {0}.</value>\n  </data>\n  <data name=\"ErrorIDToName\" xml:space=\"preserve\">\n    <value>Error looking up character identities.</value>\n  </data>\n  <data name=\"ErrorImplants\" xml:space=\"preserve\">\n    <value>Error querying the implants of {0}.</value>\n  </data>\n  <data name=\"ErrorIndustryJobs\" xml:space=\"preserve\">\n    <value>Error querying industry jobs for {0}.</value>\n  </data>\n  <data name=\"ErrorJumpClones\" xml:space=\"preserve\">\n    <value>Error querying the jump clones of {0}.</value>\n  </data>\n  <data name=\"ErrorJumpFatigue\" xml:space=\"preserve\">\n    <value>Error querying the jump fatigue of {0}.</value>\n  </data>\n  <data name=\"ErrorKillLog\" xml:space=\"preserve\">\n    <value>Error querying kill log for {0}.</value>\n  </data>\n  <data name=\"ErrorKillMail\" xml:space=\"preserve\">\n    <value>Error obtaining kill mail {0} from the server.</value>\n  </data>\n  <data name=\"ErrorLocation\" xml:space=\"preserve\">\n    <value>Error querying the location of {0}.</value>\n  </data>\n  <data name=\"ErrorMarketOrders\" xml:space=\"preserve\">\n    <value>Error querying the market orders of {0}.</value>\n  </data>\n  <data name=\"ErrorMedals\" xml:space=\"preserve\">\n    <value>Error querying medals for {0}.</value>\n  </data>\n  <data name=\"ErrorNotifications\" xml:space=\"preserve\">\n    <value>Error querying EVE notifications for {0}.</value>\n  </data>\n  <data name=\"ErrorPlanetLayout\" xml:space=\"preserve\">\n    <value>Error obtaining planetary production layout for {0}.</value>\n  </data>\n  <data name=\"ErrorPlanets\" xml:space=\"preserve\">\n    <value>Error querying planetary production information.</value>\n  </data>\n  <data name=\"ErrorResearchPoints\" xml:space=\"preserve\">\n    <value>Error querying research points for {0}.</value>\n  </data>\n  <data name=\"ErrorShip\" xml:space=\"preserve\">\n    <value>Error querying the current ship of {0}.</value>\n  </data>\n  <data name=\"ErrorSkillQueue\" xml:space=\"preserve\">\n    <value>Erorr querying the skill queue of {0}.</value>\n  </data>\n  <data name=\"ErrorSkills\" xml:space=\"preserve\">\n    <value>Error querying the known skills of {0}.</value>\n  </data>\n  <data name=\"ErrorSSO\" xml:space=\"preserve\">\n    <value>Error logging in to EVE SSO.\nIf you changed your password, you must log in again using File &gt; Add Character.</value>\n  </data>\n  <data name=\"ErrorStandings\" xml:space=\"preserve\">\n    <value>Error querying the standings of {0}.</value>\n  </data>\n  <data name=\"ErrorStation\" xml:space=\"preserve\">\n    <value>Error looking up station information.</value>\n  </data>\n  <data name=\"ErrorStatus\" xml:space=\"preserve\">\n    <value>Error querying the EVE server status. Check EVE server uptime on http://eve-offline.net/</value>\n  </data>\n  <data name=\"ErrorStructure\" xml:space=\"preserve\">\n    <value>Error looking up citadel information.</value>\n  </data>\n  <data name=\"ErrorWalletJournal\" xml:space=\"preserve\">\n    <value>Error querying wallet journal for {0}.</value>\n  </data>\n  <data name=\"ErrorWalletTransactions\" xml:space=\"preserve\">\n    <value>Error querying wallet transactions for {0}.</value>\n  </data>\n  <data name=\"MessageExpiration\" xml:space=\"preserve\">\n    <value>This account expires in {0}: {1}.</value>\n  </data>\n  <data name=\"MessageLessThanDay\" xml:space=\"preserve\">\n    <value>Character {0} has less than {1} day{2} of skills queued.</value>\n  </data>\n  <data name=\"MessageMarginTrading\" xml:space=\"preserve\">\n    <value>Character {0} has insufficient funds to fulfill all of its buy orders.</value>\n  </data>\n  <data name=\"MessageNewContracts\" xml:space=\"preserve\">\n    <value>{0} assigned contract{1}.</value>\n  </data>\n  <data name=\"ErrorLoyalty\" xml:space=\"preserve\">\n    <value>Error querying loyalty point balance of {0}.</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/QueryMonitor/CCPQueryMonitorBase.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.QueryMonitor\n{\n    /// <summary>\n    /// Represents a monitor for all queries related to characters and their corporations.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public abstract class CCPQueryMonitorBase<T> : QueryMonitor<T> where T : class\n    {\n        protected readonly CCPCharacter m_character;\n        protected ESIKey m_apiKey;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\">The character to monitor.</param>\n        /// <param name=\"method\">The method to use.</param>\n        /// <param name=\"onSuccess\">The callback to use on success or failure.</param>\n        internal CCPQueryMonitorBase(CCPCharacter character, Enum method,\n            Action<EsiResult<T>> callback) : base(method, callback)\n        {\n            m_character = character;\n        }\n\n        /// <summary>\n        /// Retrieves the parameters required for the ESI request.\n        /// </summary>\n        /// <returns>The ESI request parameters.</returns>\n        internal abstract ESIParams GetESIParams();\n\n        /// <summary>\n        /// Gets the required API key information are known.\n        /// </summary>\n        /// <returns>False if an API key was required and not found.</returns>\n        internal override bool HasESIKey => m_character.Identity.ESIKeys.Any();\n        \n        /// <summary>\n        /// Performs the query to the provider, passing the required arguments.\n        /// </summary>\n        /// <param name=\"provider\">The API provider to use.</param>\n        /// <param name=\"callback\">The callback invoked on the UI thread after a result has\n        /// been queried.</param>\n        /// <exception cref=\"System.ArgumentNullException\">provider</exception>\n        protected override void QueryAsyncCore(APIProvider provider, APIProvider.\n            ESIRequestCallback<T> callback)\n        {\n            provider.ThrowIfNull(nameof(provider));\n\n            provider.QueryEsi(Method, callback, GetESIParams());\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/QueryMonitor/CharacterDataQuerying.cs",
    "content": "using System;\nusing System.Linq;\nusing System.Collections.Generic;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Service;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Net;\n\nnamespace EVEMon.Common.QueryMonitor\n{\n    internal sealed class CharacterDataQuerying\n    {\n        #region Fields\n\n        private readonly CharacterQueryMonitor<EsiAPISkillQueue> m_charSkillQueueMonitor;\n        private readonly CharacterQueryMonitor<EsiAPISkills> m_charSkillsMonitor;\n        private readonly CharacterQueryMonitor<EsiAPIMarketOrders> m_charMarketOrdersMonitor;\n        private readonly QueryMonitor<EsiAPIContracts> m_charContractsMonitor;\n        private readonly CharacterQueryMonitor<EsiAPIIndustryJobs> m_charIndustryJobsMonitor;\n        private readonly List<IQueryMonitorEx> m_characterQueryMonitors;\n        private readonly List<IQueryMonitorEx> m_basicFeaturesMonitors;\n        private readonly CCPCharacter m_ccpCharacter;\n        private bool m_characterSheetUpdating = false;\n\n        // Responses from the attribute results since we handle it manually\n        private ResponseParams m_attrResponse;\n        // Result from the character skill queue to handle a pathological case where skill\n        // queues were not-modified but need to be re-imported due to a skills list change\n        private EsiAPISkillQueue m_lastQueue;\n        // Responses from the market order history results since we handle it manually\n        private ResponseParams m_orderHistoryResponse;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CharacterDataQuerying\"/> class.\n        /// </summary>\n        /// <param name=\"ccpCharacter\">The CCP character.</param>\n        internal CharacterDataQuerying(CCPCharacter ccpCharacter)\n        {\n            var notifiers = EveMonClient.Notifications;\n            m_ccpCharacter = ccpCharacter;\n            m_characterQueryMonitors = new List<IQueryMonitorEx>();\n            m_attrResponse = null;\n            m_orderHistoryResponse = null;\n            m_lastQueue = null;\n\n            // Add the monitors in an order as they will appear in the throbber menu\n            CharacterSheetMonitor = new CharacterQueryMonitor<EsiAPICharacterSheet>(\n                ccpCharacter, ESIAPICharacterMethods.CharacterSheet, OnCharacterSheetUpdated,\n                notifiers.NotifyCharacterSheetError);\n            m_characterQueryMonitors.Add(CharacterSheetMonitor);\n            // Location\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<EsiAPILocation>(\n                ccpCharacter, ESIAPICharacterMethods.Location, OnCharacterLocationUpdated,\n                notifiers.NotifyCharacterLocationError));\n            // Clones\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<EsiAPIClones>(\n                ccpCharacter, ESIAPICharacterMethods.Clones, OnCharacterClonesUpdated,\n                notifiers.NotifyCharacterClonesError));\n            // Implants\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<List<int>>(\n                ccpCharacter, ESIAPICharacterMethods.Implants, OnCharacterImplantsUpdated,\n                OnCharacterImplantsFailed, true));\n            // Ship\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<EsiAPIShip>(\n                ccpCharacter, ESIAPICharacterMethods.Ship, OnCharacterShipUpdated,\n                notifiers.NotifyCharacterShipError));\n            // Skills\n            m_charSkillsMonitor = new CharacterQueryMonitor<EsiAPISkills>(\n                ccpCharacter, ESIAPICharacterMethods.Skills, OnCharacterSkillsUpdated,\n                notifiers.NotifyCharacterSkillsError);\n            m_characterQueryMonitors.Add(m_charSkillsMonitor);\n            // Skill queue\n            m_charSkillQueueMonitor = new CharacterQueryMonitor<EsiAPISkillQueue>(\n                ccpCharacter, ESIAPICharacterMethods.SkillQueue, OnSkillQueueUpdated,\n                notifiers.NotifySkillQueueError);\n            m_characterQueryMonitors.Add(m_charSkillQueueMonitor);\n            // Employment history\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<EsiAPIEmploymentHistory>(\n                ccpCharacter, ESIAPICharacterMethods.EmploymentHistory,\n                OnCharacterEmploymentUpdated, notifiers.NotifyCharacterEmploymentError));\n            // Standings\n            m_characterQueryMonitors.Add(new PagedQueryMonitor<EsiAPIStandings,\n                EsiStandingsListItem>(new CharacterQueryMonitor<EsiAPIStandings>(\n                ccpCharacter, ESIAPICharacterMethods.Standings, OnStandingsUpdated,\n                notifiers.NotifyCharacterStandingsError) { QueryOnStartup = true }));\n            // Contacts\n            m_characterQueryMonitors.Add(new PagedQueryMonitor<EsiAPIContactsList,\n                EsiContactListItem>(new CharacterQueryMonitor<EsiAPIContactsList>(ccpCharacter,\n                ESIAPICharacterMethods.ContactList, OnContactsUpdated,\n                notifiers.NotifyCharacterContactsError) { QueryOnStartup = true }));\n            // Factional warfare\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<EsiAPIFactionalWarfareStats>(\n                ccpCharacter, ESIAPICharacterMethods.FactionalWarfareStats,\n                OnFactionalWarfareStatsUpdated, notifiers.\n                NotifyCharacterFactionalWarfareStatsError) { QueryOnStartup = true });\n            // Medals\n            m_characterQueryMonitors.Add(new PagedQueryMonitor<EsiAPIMedals,\n                EsiMedalsListItem>(new CharacterQueryMonitor<EsiAPIMedals>(ccpCharacter,\n                ESIAPICharacterMethods.Medals, OnMedalsUpdated,\n                notifiers.NotifyCharacterMedalsError) { QueryOnStartup = true }));\n            // Kill log\n            m_characterQueryMonitors.Add(new PagedQueryMonitor<EsiAPIKillLog,\n                EsiKillLogListItem>(new CharacterQueryMonitor<EsiAPIKillLog>(ccpCharacter,\n                ESIAPICharacterMethods.KillLog, OnKillLogUpdated,\n                notifiers.NotifyCharacterKillLogError) { QueryOnStartup = true }));\n            // Assets\n            m_characterQueryMonitors.Add(new PagedQueryMonitor<EsiAPIAssetList,\n                EsiAssetListItem>(new CharacterQueryMonitor<EsiAPIAssetList>(ccpCharacter,\n                ESIAPICharacterMethods.AssetList, OnAssetsUpdated,\n                notifiers.NotifyCharacterAssetsError) { QueryOnStartup = true }));\n            // Market orders\n            m_charMarketOrdersMonitor = new CharacterQueryMonitor<EsiAPIMarketOrders>(\n                ccpCharacter, ESIAPICharacterMethods.MarketOrders, OnMarketOrdersUpdated,\n                notifiers.NotifyCharacterMarketOrdersError) { QueryOnStartup = true };\n            m_characterQueryMonitors.Add(m_charMarketOrdersMonitor);\n            // Contracts\n            m_charContractsMonitor = new PagedQueryMonitor<EsiAPIContracts,\n                EsiContractListItem>(new CharacterQueryMonitor<EsiAPIContracts>(ccpCharacter,\n                ESIAPICharacterMethods.Contracts, OnContractsUpdated,\n                notifiers.NotifyCharacterContractsError) { QueryOnStartup = true });\n            m_characterQueryMonitors.Add(m_charContractsMonitor);\n            // Wallet journal\n            m_characterQueryMonitors.Add(new PagedQueryMonitor<EsiAPIWalletJournal,\n                EsiWalletJournalListItem>(new CharacterQueryMonitor<EsiAPIWalletJournal>(\n                ccpCharacter, ESIAPICharacterMethods.WalletJournal, OnWalletJournalUpdated,\n                notifiers.NotifyCharacterWalletJournalError) { QueryOnStartup = true }));\n            // Wallet balance\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<string>(\n                ccpCharacter, ESIAPICharacterMethods.AccountBalance, OnWalletBalanceUpdated,\n                notifiers.NotifyCharacterBalanceError));\n            // Wallet transactions\n            m_characterQueryMonitors.Add(new PagedQueryMonitor<EsiAPIWalletTransactions,\n                EsiWalletTransactionsListItem>(new CharacterQueryMonitor<\n                EsiAPIWalletTransactions>(ccpCharacter, ESIAPICharacterMethods.\n                WalletTransactions, OnWalletTransactionsUpdated, notifiers.\n                NotifyCharacterWalletTransactionsError) { QueryOnStartup = true }));\n            // Industry\n            m_charIndustryJobsMonitor = new CharacterQueryMonitor<EsiAPIIndustryJobs>(\n                ccpCharacter, ESIAPICharacterMethods.IndustryJobs, OnIndustryJobsUpdated,\n                notifiers.NotifyCharacterIndustryJobsError) { QueryOnStartup = true };\n            m_characterQueryMonitors.Add(m_charIndustryJobsMonitor);\n            // Research points\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<EsiAPIResearchPoints>(\n                ccpCharacter, ESIAPICharacterMethods.ResearchPoints, OnResearchPointsUpdated,\n                notifiers.NotifyCharacterResearchPointsError) { QueryOnStartup = true });\n            // Mail\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<EsiAPIMailMessages>(\n                ccpCharacter, ESIAPICharacterMethods.MailMessages, OnEVEMailMessagesUpdated,\n                notifiers.NotifyEVEMailMessagesError) { QueryOnStartup = true });\n            // Mailing lists\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<EsiAPIMailingLists>(\n                ccpCharacter, ESIAPICharacterMethods.MailingLists, OnEveMailingListsUpdated,\n                    notifiers.NotifyMailingListsError));\n            // Notifications\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<EsiAPINotifications>(\n                ccpCharacter, ESIAPICharacterMethods.Notifications, OnEVENotificationsUpdated,\n                notifiers.NotifyEVENotificationsError) { QueryOnStartup = true });\n            // Calendar\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<EsiAPICalendarEvents>(\n                ccpCharacter, ESIAPICharacterMethods.UpcomingCalendarEvents,\n                OnUpcomingCalendarEventsUpdated, notifiers.\n                NotifyCharacterUpcomingCalendarEventsError) { QueryOnStartup = true });\n            // PI\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<EsiAPIPlanetaryColoniesList>(\n                ccpCharacter, ESIAPICharacterMethods.PlanetaryColonies,\n                OnPlanetaryColoniesUpdated, notifiers.\n                NotifyCharacterPlanetaryColoniesError) { QueryOnStartup = true });\n            // LP\n            m_characterQueryMonitors.Add(new CharacterQueryMonitor<EsiAPILoyality>(\n                ccpCharacter, ESIAPICharacterMethods.LoyaltyPoints,\n                OnLoyaltyPointsUpdated, notifiers.\n                NotifyCharacterLoyaltyPointsError) { QueryOnStartup = true });\n            m_characterQueryMonitors.ForEach(monitor => ccpCharacter.QueryMonitors.Add(monitor));\n\n            // Enumerate the basic feature monitors into a separate list\n            m_basicFeaturesMonitors = new List<IQueryMonitorEx>(m_characterQueryMonitors.Count);\n            long basicFeatures = (long)CCPAPIMethodsEnum.BasicCharacterFeatures;\n            foreach (var monitor in m_characterQueryMonitors)\n            {\n                long method = (long)(ESIAPICharacterMethods)monitor.Method;\n                if (method == (method & basicFeatures))\n                {\n                    m_basicFeaturesMonitors.Add(monitor);\n                    // If force update is selected, update basic features only\n                    if (ccpCharacter.ForceUpdateBasicFeatures)\n                        monitor.ForceUpdate(true);\n                }\n            }\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the character sheet monitor.\n        /// </summary>\n        /// <value>The character sheet monitor.</value>\n        internal CharacterQueryMonitor<EsiAPICharacterSheet> CharacterSheetMonitor { get; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the character market orders have been queried.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the character market orders have been queried; otherwise, <c>false</c>.\n        /// </value>\n        internal bool CharacterMarketOrdersQueried => !m_charMarketOrdersMonitor.IsUpdating;\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the character contracts have been queried.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the character contracts have been queried; otherwise, <c>false</c>.\n        /// </value>\n        internal bool CharacterContractsQueried => !m_charContractsMonitor.IsUpdating;\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the character industry jobs have been queried.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the character industry jobs have been queried; otherwise, <c>false</c>.\n        /// </value>\n        internal bool CharacterIndustryJobsQueried => !m_charIndustryJobsMonitor.IsUpdating;\n\n        #endregion\n\n\n        #region Dispose\n\n        /// <summary>\n        /// Called when the object gets disposed.\n        /// </summary>\n        internal void Dispose()\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n\n            // Unsubscribe events in monitors\n            foreach (var monitor in m_characterQueryMonitors)\n                monitor.Dispose();\n        }\n\n        #endregion\n\n\n        #region Querying\n        \n        /// <summary>\n        /// Check if any character sheet related query monitors are still running, and trigger\n        /// events if they are all completed.\n        /// </summary>\n        private void FinishCharacterSheetUpdated()\n        {\n            // Check if all CharacterSheet related query monitors have completed\n            if (!m_characterQueryMonitors.Any(monitor => (ESIAPICharacterMethods.\n                CharacterSheet.Equals(monitor.Method) || monitor.Method.HasParent(\n                ESIAPICharacterMethods.CharacterSheet)) && monitor.Status == QueryStatus.\n                Updating))\n            {\n                m_characterSheetUpdating = false;\n                var target = m_ccpCharacter;\n                // Character may have been deleted since we queried\n                if (target != null)\n                {\n                    // Finally all done!\n                    EveMonClient.Notifications.InvalidateCharacterAPIError(target);\n                    EveMonClient.OnCharacterUpdated(target);\n                    EveMonClient.OnCharacterInfoUpdated(target);\n                    EveMonClient.OnCharacterImplantSetCollectionChanged(target);\n                    // Save character information locally\n                    var doc = Util.SerializeToXmlDocument(target.Export());\n                    LocalXmlCache.SaveAsync(target.Name, doc).ConfigureAwait(false);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's character sheet information.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnCharacterSheetUpdated(EsiAPICharacterSheet result)\n        {\n            // Flag that we are waiting for character sheet operations to finish\n            if (!m_characterSheetUpdating)\n                m_characterSheetUpdating = true;\n\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n                target.Import(result);\n        }\n\n        /// <summary>\n        /// Processes the queried character's location.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnCharacterLocationUpdated(EsiAPILocation result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n                target.Import(result);\n        }\n\n        /// <summary>\n        /// Processes the queried character's clones.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnCharacterClonesUpdated(EsiAPIClones result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n                target.Import(result);\n        }\n\n        /// <summary>\n        /// Processes the queried character's implants.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnCharacterImplantsUpdated(List<int> result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                if (result != null)\n                    target.Import(result);\n                QueryAttributesAsync(target);\n            }\n        }\n\n        /// <summary>\n        /// Notifies the user if character implants could not be queried, but continues to\n        /// query the attributes even if this occurs.\n        /// </summary>\n        /// <param name=\"character\"></param>\n        /// <param name=\"result\"></param>\n        private void OnCharacterImplantsFailed(CCPCharacter character, EsiResult<List<int>>\n            result)\n        {\n            EveMonClient.Notifications.NotifyCharacterImplantsError(character, result);\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n                QueryAttributesAsync(target);\n        }\n\n        /// <summary>\n        /// Queries the character's attributes. Called on success or failure of implant\n        /// import as attributes must be done second.\n        /// </summary>\n        private void QueryAttributesAsync(CCPCharacter target)\n        {\n            // This is only invoked where the character has already been checked against null\n            ESIKey esiKey = target.Identity.FindAPIKeyWithAccess(ESIAPICharacterMethods.\n                Attributes);\n            if (esiKey != null && !EsiErrors.IsErrorCountExceeded)\n                EveMonClient.APIProviders.CurrentProvider.QueryEsi<EsiAPIAttributes>(\n                    ESIAPICharacterMethods.Attributes, OnCharacterAttributesUpdated,\n                    new ESIParams(m_attrResponse, esiKey.AccessToken)\n                    {\n                        ParamOne = target.CharacterID\n                    });\n        }\n\n        /// <summary>\n        /// Processes the queried character's attributes.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        /// <param name=\"ignore\"></param>\n        private void OnCharacterAttributesUpdated(EsiResult<EsiAPIAttributes> result,\n            object ignore)\n        {\n            var target = m_ccpCharacter;\n            m_attrResponse = result.Response;\n            // Character may have been deleted since we queried\n            if (target != null && target.Monitored)\n            {\n                if (target.ShouldNotifyError(result, ESIAPICharacterMethods.Attributes))\n                    EveMonClient.Notifications.NotifyCharacterAttributesError(target, result);\n                if (!result.HasError && result.HasData)\n                    target.Import(result.Result);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's ship.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnCharacterShipUpdated(EsiAPIShip result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n                target.Import(result);\n        }\n\n        /// <summary>\n        /// Processes the queried character's skills.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnCharacterSkillsUpdated(EsiAPISkills result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n                target.Import(result, m_lastQueue);\n        }\n\n        /// <summary>\n        /// Processes the queried character's employment history.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnCharacterEmploymentUpdated(EsiAPIEmploymentHistory result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n                target.Import(result);\n        }\n        \n        /// <summary>\n        /// Processes the queried character's skill queue information.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnSkillQueueUpdated(EsiAPISkillQueue result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                m_lastQueue = result;\n                target.SkillQueue.Import(result.CreateSkillQueue());\n                // Check if the character has less than the threshold queue length\n                if (target.IsTraining && target.SkillQueue.LessThanWarningThreshold)\n                    EveMonClient.Notifications.NotifySkillQueueThreshold(target,\n                        Settings.UI.MainWindow.SkillQueueWarningThresholdDays);\n                else\n                    EveMonClient.Notifications.InvalidateSkillQueueThreshold(target);\n            }\n            else\n                m_lastQueue = null;\n        }\n\n        /// <summary>\n        /// Processes the queried character's standings information.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnStandingsUpdated(EsiAPIStandings result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                // Import the data\n                target.Standings.Import(result);\n                // Fires the event regarding standings update\n                EveMonClient.OnCharacterStandingsUpdated(target);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's factional warfare statistic information.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnFactionalWarfareStatsUpdated(EsiAPIFactionalWarfareStats result)\n        {\n            var target = m_ccpCharacter;\n            int factionID = result.FactionID;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                // Update the enlisted in factional warfare flag\n                if (factionID != 0)\n                {\n                    target.IsFactionalWarfareNotEnlisted = false;\n                    target.FactionalWarfareStats = new FactionalWarfareStats(result);\n                }\n                else\n                    target.IsFactionalWarfareNotEnlisted = true;\n                // Fires the event regarding factional warfare stats update\n                EveMonClient.OnCharacterFactionalWarfareStatsUpdated(target);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's assets information.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnAssetsUpdated(EsiAPIAssetList result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n                TaskHelper.RunCPUBoundTaskAsync(() => target.Assets.Import(result)).\n                    ContinueWith(_ =>\n                    {\n                        EveMonClient.OnCharacterAssetsUpdated(target);\n                    }, EveMonClient.CurrentSynchronizationContext);\n        }\n\n        /// <summary>\n        /// Processes the queried character's market orders. Called from the history fetch on\n        /// success or failure, but merges the original orders too.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        /// <remarks>This method is sensitive to which \"issued for\" orders gets queried first</remarks>\n        private void OnMarketOrdersCompleted(EsiResult<EsiAPIMarketOrders> result,\n            object regularOrders)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null && regularOrders is EsiAPIMarketOrders orders)\n            {\n                var endedOrders = new LinkedList<MarketOrder>();\n                var allOrders = new EsiAPIMarketOrders();\n                m_orderHistoryResponse = result.Response;\n                // Ignore the If-Modified-Since and cache timer on order history to ensure\n                // that old orders are not wiped out\n                if (m_orderHistoryResponse != null)\n                {\n                    m_orderHistoryResponse.Expires = null;\n                    m_orderHistoryResponse.ETag = null;\n                }\n                // Add normal orders first\n                if (orders != null)\n                    allOrders.AddRange(orders);\n                // Add result second\n                if (result != null && !result.HasError && result.Result != null)\n                    allOrders.AddRange(result.Result);\n                allOrders.SetAllIssuedBy(target.CharacterID);\n                target.CharacterMarketOrders.Import(allOrders, IssuedFor.Character,\n                    endedOrders);\n                EveMonClient.OnCharacterMarketOrdersUpdated(target, endedOrders);\n                allOrders.Clear();\n                // Notify if either one failed\n                if (result != null && result.HasError)\n                    EveMonClient.Notifications.NotifyCharacterMarketOrdersError(target,\n                        result);\n            }\n        }\n\n        /// <summary>\n        /// Queries the character's historical market orders. The orders get imported even if\n        /// fetching the historical orders fail.\n        /// </summary>\n        private void OnMarketOrdersUpdated(EsiAPIMarketOrders result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                var esiKey = target.Identity.FindAPIKeyWithAccess(ESIAPICharacterMethods.\n                    MarketOrders);\n                if (esiKey != null && !EsiErrors.IsErrorCountExceeded)\n                    EveMonClient.APIProviders.CurrentProvider.QueryEsi<EsiAPIMarketOrders>(\n                        ESIAPICharacterMethods.MarketOrdersHistory, OnMarketOrdersCompleted,\n                        new ESIParams(m_orderHistoryResponse, esiKey.AccessToken)\n                        {\n                            ParamOne = target.CharacterID\n                        }, result);\n                else\n                    OnMarketOrdersCompleted(null, result);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's contracts.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        /// <remarks>This method is sensitive to which \"issued for\" contracts gets queried first</remarks>\n        private void OnContractsUpdated(EsiAPIContracts result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                foreach (var contract in result)\n                    contract.APIMethod = ESIAPICharacterMethods.Contracts;\n                var endedContracts = new List<Contract>();\n                target.CharacterContracts.Import(result, endedContracts);\n                EveMonClient.OnCharacterContractsUpdated(target, endedContracts);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's wallet balance.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnWalletBalanceUpdated(string result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                target.Import(result);\n                // Notify for insufficient balance\n                target.NotifyInsufficientBalance();\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's wallet journal information.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnWalletJournalUpdated(EsiAPIWalletJournal result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                target.WalletJournal.Import(result.ToXMLItem().WalletJournal);\n                EveMonClient.OnCharacterWalletJournalUpdated(target);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's wallet transactions information.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnWalletTransactionsUpdated(EsiAPIWalletTransactions result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                target.WalletTransactions.Import(result.ToXMLItem().WalletTransactions);\n                EveMonClient.OnCharacterWalletTransactionsUpdated(target);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's personal industry jobs.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        /// <remarks>This method is sensitive to which \"issued for\" jobs gets queried first</remarks>\n        private void OnIndustryJobsUpdated(EsiAPIIndustryJobs result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                target.CharacterIndustryJobs.Import(result, IssuedFor.Character);\n                EveMonClient.OnCharacterIndustryJobsUpdated(target);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's research points.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnResearchPointsUpdated(EsiAPIResearchPoints result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                target.ResearchPoints.Import(result);\n                EveMonClient.OnCharacterResearchPointsUpdated(target);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's EVE mail messages.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnEVEMailMessagesUpdated(EsiAPIMailMessages result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                target.EVEMailMessages.Import(result.ToXMLItem().Messages);\n                // Notify on new messages\n                int newMessages = target.EVEMailMessages.NewMessages;\n                if (newMessages != 0)\n                    EveMonClient.Notifications.NotifyNewEVEMailMessages(target, newMessages);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's EVE mailing lists\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnEveMailingListsUpdated(EsiAPIMailingLists result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                target.EVEMailingLists.Import(result);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's EVE notifications.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnEVENotificationsUpdated(EsiAPINotifications result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                target.EVENotifications.Import(result);\n                // Notify on new notifications\n                int newNotify = target.EVENotifications.NewNotifications;\n                if (newNotify != 0)\n                    EveMonClient.Notifications.NotifyNewEVENotifications(target, newNotify);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's contact list.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnContactsUpdated(EsiAPIContactsList result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                // TODO Corp and alliance contacts\n                target.Contacts.Import(result);\n                EveMonClient.OnCharacterContactsUpdated(target);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's medals.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnMedalsUpdated(EsiAPIMedals result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                target.CharacterMedals.Import(result, true);\n                EveMonClient.OnCharacterMedalsUpdated(target);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's kill log.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnKillLogUpdated(EsiAPIKillLog result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                target.KillLog.Import(result);\n                EveMonClient.OnCharacterKillLogUpdated(m_ccpCharacter);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's upcoming calendar events.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnUpcomingCalendarEventsUpdated(EsiAPICalendarEvents result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                target.UpcomingCalendarEvents.Import(result);\n                EveMonClient.OnCharacterUpcomingCalendarEventsUpdated(target);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's planetary colonies.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnPlanetaryColoniesUpdated(EsiAPIPlanetaryColoniesList result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                // Invalidate previous notifications\n                EveMonClient.Notifications.InvalidateCharacterPlanetaryPinCompleted(target);\n\n                target.PlanetaryColonies.Import(result);\n                EveMonClient.OnCharacterPlanetaryColoniesUpdated(target);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's loyalty point information.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnLoyaltyPointsUpdated(EsiAPILoyality result)\n        {\n            var target = m_ccpCharacter;\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                // Import the data\n                target.LoyaltyPoints.Import(result);\n                // Fires the event regarding standings update\n                EveMonClient.OnCharacterLoyaltyPointsUpdated(target);\n            }\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            // If character is monitored enable the basic feature monitoring\n            foreach (var monitor in m_basicFeaturesMonitors)\n                monitor.Enabled = m_ccpCharacter.Monitored;\n            if (m_characterSheetUpdating)\n                FinishCharacterSheetUpdated();\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/QueryMonitor/CharacterQueryMonitor.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.QueryMonitor\n{\n    /// <summary>\n    /// Represents a monitor for all queries related to characters.\n    /// </summary>\n    /// <typeparam name=\"T\">The result type.</typeparam>\n    public sealed class CharacterQueryMonitor<T> : CCPQueryMonitorBase<T> where T : class\n    {\n        /// <summary>\n        /// Handles the response from an ESI query.\n        /// </summary>\n        /// <param name=\"character\">The character to monitor.</param>\n        /// <param name=\"method\">The method to use.</param>\n        /// <param name=\"ifNoData\">Whether to invoke the success callback on a \"No Data\"\n        /// response.</param>\n        /// <param name=\"result\">The result of the query.</param>\n        /// <param name=\"onSuccess\">An action to call on success.</param>\n        /// <param name=\"onFailure\">The callback to use upon failure.</param>\n        private static void HandleQuery(CCPCharacter character, Enum method, bool ifNoData,\n            EsiResult<T> result, Action<T> onSuccess, NotifyErrorCallback onFailure)\n        {\n            // Character may have been set to not be monitored\n            if (character.Monitored)\n            {\n                bool hasData = result.HasData;\n                if (character.ShouldNotifyError(result, method))\n                    onFailure.Invoke(character, result);\n                if (!result.HasError && (ifNoData || hasData))\n                    onSuccess.Invoke(hasData ? result.Result : null);\n            }\n            foreach (var monitor in character.QueryMonitors)\n                if (monitor.Method.HasParent(method))\n                    character.QueryMonitors.Query(monitor.Method);\n        }\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\">The character to monitor.</param>\n        /// <param name=\"method\">The method to use.</param>\n        /// <param name=\"onSuccess\">An action to call on success.</param>\n        /// <param name=\"onFailure\">The callback to use upon failure.</param>\n        /// <param name=\"ifNoData\">If true, the success callback is invoked even if the\n        /// response returned \"Not Modified\" or \"No Data\"; if false (default), no action is\n        /// called if the response is empty</param>\n        internal CharacterQueryMonitor(CCPCharacter character, Enum method, Action<T>\n            onSuccess, NotifyErrorCallback onFailure, bool ifNoData = false) : base(character,\n            method, (result) => {\n                HandleQuery(character, method, ifNoData, result, onSuccess, onFailure);\n            })\n        {\n        }\n\n        /// <summary>\n        /// Retrieves the parameters required for the ESI request.\n        /// </summary>\n        /// <returns>The ESI request parameters.</returns>\n        internal override ESIParams GetESIParams()\n        {\n            return new ESIParams(LastResult?.Response, m_apiKey.AccessToken)\n            {\n                ParamOne = m_character.CharacterID\n            };\n        }\n        \n        /// <summary>\n        /// Gets a value indicating whether this monitor has access to data.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if this monitor has access; otherwise, <c>false</c>.\n        /// </value>\n        public override bool HasAccess\n        {\n            get\n            {\n                m_apiKey = m_character.Identity.FindAPIKeyWithAccess((ESIAPICharacterMethods)\n                    Method);\n                return m_apiKey != null;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/QueryMonitor/CorporationDataQuerying.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Serialization.Esi;\n\nnamespace EVEMon.Common.QueryMonitor\n{\n    internal sealed class CorporationDataQuerying\n    {\n        #region Fields\n\n        private readonly QueryMonitor<EsiAPIMedals> m_corpMedalsMonitor;\n        private readonly QueryMonitor<EsiAPIMarketOrders> m_corpMarketOrdersMonitor;\n        private readonly QueryMonitor<EsiAPIContracts> m_corpContractsMonitor;\n        private readonly QueryMonitor<EsiAPIIndustryJobs> m_corpIndustryJobsMonitor;\n        private readonly List<IQueryMonitorEx> m_corporationQueryMonitors;\n        private readonly CCPCharacter m_ccpCharacter;\n\n        #endregion\n\n\n        #region Constructor\n\n        internal CorporationDataQuerying(CCPCharacter ccpCharacter)\n        {\n            m_ccpCharacter = ccpCharacter;\n            m_corporationQueryMonitors = new List<IQueryMonitorEx>(4);\n\n            // Initializes the query monitors \n            m_corpMedalsMonitor = new PagedQueryMonitor<EsiAPIMedals, EsiMedalsListItem>(\n                new CorporationQueryMonitor<EsiAPIMedals>(ccpCharacter,\n                ESIAPICorporationMethods.CorporationMedals, OnMedalsUpdated,\n                EveMonClient.Notifications.NotifyCorporationMedalsError)\n                { QueryOnStartup = true });\n            // Add the monitors in an order as they will appear in the throbber menu\n            m_corporationQueryMonitors.Add(m_corpMedalsMonitor);\n            m_corpMarketOrdersMonitor = new PagedQueryMonitor<EsiAPIMarketOrders,\n                EsiOrderListItem>(new CorporationQueryMonitor<EsiAPIMarketOrders>(ccpCharacter,\n                ESIAPICorporationMethods.CorporationMarketOrders, OnMarketOrdersUpdated,\n                EveMonClient.Notifications.NotifyCorporationMarketOrdersError)\n                { QueryOnStartup = true });\n            m_corporationQueryMonitors.Add(m_corpMarketOrdersMonitor);\n            m_corpContractsMonitor = new PagedQueryMonitor<EsiAPIContracts,\n                EsiContractListItem>(new CorporationQueryMonitor<EsiAPIContracts>(ccpCharacter,\n                ESIAPICorporationMethods.CorporationContracts, OnContractsUpdated,\n                EveMonClient.Notifications.NotifyCorporationContractsError)\n                { QueryOnStartup = true });\n            m_corporationQueryMonitors.Add(m_corpContractsMonitor);\n            m_corpIndustryJobsMonitor = new PagedQueryMonitor<EsiAPIIndustryJobs,\n                EsiJobListItem>(new CorporationQueryMonitor<EsiAPIIndustryJobs>(\n                ccpCharacter, ESIAPICorporationMethods.CorporationIndustryJobs,\n                OnIndustryJobsUpdated, EveMonClient.Notifications.\n                NotifyCorporationIndustryJobsError) { QueryOnStartup = true });\n            m_corporationQueryMonitors.Add(m_corpIndustryJobsMonitor);\n\n            foreach (var monitor in m_corporationQueryMonitors)\n                ccpCharacter.QueryMonitors.Add(monitor);\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the corporation market orders have been queried.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the corporation market orders have been queried; otherwise, <c>false</c>.\n        /// </value>\n        internal bool CorporationMarketOrdersQueried => !m_corpMarketOrdersMonitor.IsUpdating;\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the corporation contracts have been queried.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the corporation contracts have been queried; otherwise, <c>false</c>.\n        /// </value>\n        internal bool CorporationContractsQueried => !m_corpContractsMonitor.IsUpdating;\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the corporation industry jobs have been queried.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the corporation industry jobs have been queried; otherwise, <c>false</c>.\n        /// </value>\n        internal bool CorporationIndustryJobsQueried => !m_corpIndustryJobsMonitor.IsUpdating;\n\n        #endregion\n\n\n        #region Dispose\n\n        /// <summary>\n        /// Called when the object gets disposed.\n        /// </summary>\n        internal void Dispose()\n        {\n            // Unsubscribe events in monitors\n            foreach (IQueryMonitorEx monitor in m_corporationQueryMonitors)\n            {\n                monitor.Dispose();\n            }\n        }\n\n        #endregion\n\n\n        #region Querying\n        \n        /// <summary>\n        /// Processes the queried character's corporation medals.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        private void OnMedalsUpdated(EsiAPIMedals result)\n        {\n            var target = m_ccpCharacter;\n\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                target.CorporationMedals.Import(result, false);\n                EveMonClient.OnCorporationMedalsUpdated(target);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's corporation market orders.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        /// <remarks>This method is sensitive to which market orders gets queried first</remarks>\n        private void OnMarketOrdersUpdated(EsiAPIMarketOrders result)\n        {\n            var target = m_ccpCharacter;\n\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                var endedOrders = new LinkedList<MarketOrder>();\n                target.CorporationMarketOrders.Import(result, IssuedFor.Corporation,\n                    endedOrders);\n                EveMonClient.OnCorporationMarketOrdersUpdated(target, endedOrders);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's corporation contracts.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        /// <remarks>This method is sensitive to which contracts gets queried first</remarks>\n        private void OnContractsUpdated(EsiAPIContracts result)\n        {\n            var target = m_ccpCharacter;\n\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                // Mark all contracts as corporation issued\n                foreach (var contract in result)\n                    contract.APIMethod = ESIAPICorporationMethods.CorporationContracts;\n                var endedContracts = new List<Contract>();\n                target.CorporationContracts.Import(result, endedContracts);\n                EveMonClient.OnCorporationContractsUpdated(target, endedContracts);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried character's corporation industry jobs.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        /// <remarks>This method is sensitive to which \"issued for\" jobs gets queried first</remarks>\n        private void OnIndustryJobsUpdated(EsiAPIIndustryJobs result)\n        {\n            var target = m_ccpCharacter;\n\n            // Character may have been deleted since we queried\n            if (target != null)\n            {\n                // Mark all jobs as corporation issued\n                target.CorporationIndustryJobs.Import(result, IssuedFor.Corporation);\n                EveMonClient.OnCorporationIndustryJobsUpdated(target);\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/QueryMonitor/CorporationQueryMonitor.cs",
    "content": "using System;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.QueryMonitor\n{\n    /// <summary>\n    /// Represents a monitor for all queries related to corporations.\n    /// </summary>\n    /// <typeparam name=\"T\">The result type.</typeparam>\n    public sealed class CorporationQueryMonitor<T> : CCPQueryMonitorBase<T> where T : class\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"character\">The character to monitor.</param>\n        /// <param name=\"method\">The method to use.</param>\n        /// <param name=\"onSuccess\">An action to call on success.</param>\n        /// <param name=\"onFailure\">The callback to use upon failure.</param>\n        internal CorporationQueryMonitor(CCPCharacter character, Enum method, Action<T>\n            onSuccess, NotifyErrorCallback onFailure) : base(character, method, (result) =>\n            {\n                if (character.Monitored)\n                {\n                    // \"No corp role(s)\" = 403\n                    if (result.HasError)\n                    {\n                        // Do not invoke onFailure on corp roles error since we cannot actually\n                        // determine whether the key had the roles until we try\n                        if (result.ErrorCode != 403 && character.ShouldNotifyError(result,\n                                method))\n                            onFailure.Invoke(character, result);\n                    }\n                    else if (result.HasData)\n                        onSuccess.Invoke(result.Result);\n                }\n            })\n        {\n        }\n\n        /// <summary>\n        /// Retrieves the parameters required for the ESI request.\n        /// </summary>\n        /// <returns>The ESI request parameters.</returns>\n        internal override ESIParams GetESIParams()\n        {\n            return new ESIParams(LastResult?.Response, m_apiKey.AccessToken)\n            {\n                ParamOne = m_character.CorporationID\n            };\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether this monitor has access to data.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if this monitor has access; otherwise, <c>false</c>.\n        /// </value>\n        public override bool HasAccess\n        {\n            get\n            {\n                m_apiKey = m_character.Identity.FindAPIKeyWithAccess((ESIAPICorporationMethods)\n                    Method);\n                return !m_character.IsInNPCCorporation && m_apiKey != null;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/QueryMonitor/ESIKeyQueryMonitor.cs",
    "content": "using System;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.QueryMonitor\n{\n    public sealed class ESIKeyQueryMonitor<T> : QueryMonitor<T> where T : class\n    {\n        private readonly ESIKey m_esiKey;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"apiKey\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"onUpdated\"></param>\n        internal ESIKeyQueryMonitor(ESIKey apiKey, Enum method, Action<EsiResult<T>> onUpdated)\n            : base(method, onUpdated)\n        {\n            m_esiKey = apiKey;\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether this monitor has access to data.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if this monitor has access; otherwise, <c>false</c>.\n        /// </value>\n        public override bool HasAccess\n        {\n            get\n            {\n                if (Method is ESIAPIGenericMethods)\n                    return true;\n\n                ulong method = (ulong)(ESIAPICharacterMethods)Method;\n                return method == (m_esiKey.AccessMask & method);\n            }\n        }\n\n        /// <summary>\n        /// Performs the query to the provider, passing the required arguments.\n        /// </summary>\n        /// <param name=\"provider\">The API provider to use.</param>\n        /// <param name=\"callback\">The callback invoked on the UI thread after a result has\n        /// been queried.</param>\n        /// <exception cref=\"System.ArgumentNullException\">provider</exception>\n        protected override void QueryAsyncCore(APIProvider provider, APIProvider.\n            ESIRequestCallback<T> callback)\n        {\n            provider.ThrowIfNull(nameof(provider));\n\n            provider.QueryEsi(Method, callback, new ESIParams(LastResult?.Response, m_esiKey.\n                AccessToken));\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/QueryMonitor/PagedQueryMonitor.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing System.Collections.Generic;\n\nnamespace EVEMon.Common.QueryMonitor\n{\n    /// <summary>\n    /// Represents a monitor for all queries related to characters and their corporations,\n    /// supporting paged requests.\n    /// </summary>\n    /// <typeparam name=\"T\">The outer container type.</typeparam>\n    /// <typeparam name=\"U\">The inner result type.</typeparam>\n    public sealed class PagedQueryMonitor<T, U> : QueryMonitor<T> where T : List<U>\n        where U : class\n    {\n        private readonly CCPQueryMonitorBase<T> wrapped;\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"wrapped\">The query monitor to wrap.</param>\n        internal PagedQueryMonitor(CCPQueryMonitorBase<T> wrapped) : base(wrapped.Method,\n            wrapped.Callback)\n        {\n            this.wrapped = wrapped;\n        }\n\n        /// <summary>\n        /// Gets the required API key information are known.\n        /// </summary>\n        /// <returns>False if an API key was required and not found.</returns>\n        internal override bool HasESIKey => wrapped.HasESIKey;\n\n        /// <summary>\n        /// Gets a value indicating whether this monitor has access to data.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if this monitor has access; otherwise, <c>false</c>.\n        /// </value>\n        public override bool HasAccess => wrapped.HasAccess;\n\n        /// <summary>\n        /// Performs the query to the provider, passing the required arguments.\n        /// </summary>\n        /// <param name=\"provider\">The API provider to use.</param>\n        /// <param name=\"callback\">The callback invoked on the UI thread after a result has\n        /// been queried.</param>\n        /// <exception cref=\"System.ArgumentNullException\">provider</exception>\n        protected override void QueryAsyncCore(APIProvider provider, APIProvider.\n            ESIRequestCallback<T> callback)\n        {\n            provider.ThrowIfNull(nameof(provider));\n\n            provider.QueryPagedEsi<T, U>(Method, callback, wrapped.GetESIParams());\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/QueryMonitor/QueryMonitor.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.QueryMonitor\n{\n    /// <summary>\n    /// This class monitors a querying process. It provides services for autoupdating, update\n    /// notification, and querying character data.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public class QueryMonitor<T> : IQueryMonitorEx, INetworkChangeSubscriber where T : class\n    {\n        // Matches the error reporting methods in GlobalNotificationCollection\n        internal delegate void NotifyErrorCallback(CCPCharacter character, EsiResult<T> result);\n\n        private bool m_forceUpdate;\n        private bool m_isCanceled;\n        private bool m_retryOnForceUpdateError;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        /// <param name=\"method\">The method.</param>\n        /// <param name=\"callback\">The callback.</param>\n        /// <exception cref=\"System.ArgumentNullException\">callback;@The callback cannot be null.</exception>\n        internal QueryMonitor(Enum method, Action<EsiResult<T>> callback)\n        {\n            // Check callback not null\n            callback.ThrowIfNull(nameof(callback), \"The callback cannot be null.\");\n\n            LastUpdate = DateTime.MinValue;\n            m_forceUpdate = true;\n            Callback = callback;\n            Method = method;\n            Enabled = false;\n            QueryOnStartup = false;\n\n            NetworkMonitor.Register(this);\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets true if the query is enabled.\n        /// </summary>\n        public bool Enabled { get; set; }\n\n        /// <summary>\n        /// Gets true whether the monitor has to do a query on application startup.\n        /// </summary>\n        public bool QueryOnStartup { get; set; }\n\n        /// <summary>\n        /// Gets the API method monitored by this instance.\n        /// </summary>\n        public Enum Method { get; }\n\n\t\t/// <summary>\n\t\t/// Gets the callback used for this query monitor.\n\t\t/// </summary>\n\t\tinternal Action<EsiResult<T>> Callback { get; }\n\n\t\t/// <summary>\n\t\t/// Gets the last time this instance was updated (UTC).\n\t\t/// </summary>\n\t\tpublic DateTime LastUpdate { get; private set; }\n\n        /// <summary>\n        /// Gets the status of the query.\n        /// </summary>\n        public QueryStatus Status { get; private set; }\n\n        /// <summary>\n        /// Gets true when the API provider is not CCP or the cache timer has expired.\n        /// </summary>\n        public bool CanForceUpdate\n        {\n            get\n            {\n                if (EveMonClient.APIProviders.CurrentProvider != APIProvider.DefaultProvider &&\n                    EveMonClient.APIProviders.CurrentProvider != APIProvider.TestProvider)\n                    return true;\n\n                return DateTime.UtcNow > (LastResult?.CachedUntil ?? NextUpdate);\n            }\n        }\n\n        /// <summary>\n        /// Gets the next time this instance should be updated (UTC), based on both the CCP cache time and the user preferences.\n        /// </summary>\n        public DateTime NextUpdate\n        {\n            get\n            {\n                DateTime nextUpdate;\n                // If there was an error on last try, we use the cached time\n                if (LastResult != null && LastResult.HasError)\n                    return LastResult.CachedUntil;\n                // No error ? Then we compute the next update according to the settings\n                var period = UpdatePeriod.Never;\n                string method = Method.ToString();\n                if (Settings.Updates.Periods.ContainsKey(method))\n                    period = Settings.Updates.Periods[method];\n                if (period == UpdatePeriod.Never)\n                    nextUpdate = DateTime.MaxValue;\n                else\n                {\n                    nextUpdate = LastUpdate.Add(period.ToDuration());\n                    // If CCP \"cached until\" is greater than what we computed, return CCP cached time\n                    if (LastResult != null && LastResult.CachedUntil > nextUpdate)\n                        return LastResult.CachedUntil;\n\n                }\n                return nextUpdate;\n            }\n        }\n\n        /// <summary>\n        /// Gets the parameters from the last ESI response.\n        /// </summary>\n        public EsiResult<T> LastResult { get; private set; }\n\n        /// <summary>\n        /// Gets true whether the method is curently being requeried.\n        /// </summary>\n        public bool IsUpdating { get; private set; }\n\n        /// <summary>\n        /// Gets true when the monitor encountered an error on last try.\n        /// </summary>\n        public bool HasError => LastResult != null && LastResult.HasError;\n\n        /// <summary>\n        /// Gets true if this monitor has access to data.\n        /// </summary>\n        public virtual bool HasAccess => true;\n\n        /// <summary>\n        /// Gets the required API key information are known.\n        /// </summary>\n        /// <returns>False if an API key was required and not found.</returns>\n        internal virtual bool HasESIKey => true;\n\n        #endregion\n\n\n        #region  Event Handlers\n\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            UpdateOnOneSecondTick();\n        }\n\n        #endregion\n\n\n        /// <summary>\n        /// Called when the object gets disposed.\n        /// </summary>\n        public void Dispose()\n        {\n            EveMonClient.TimerTick -= EveMonClient_TimerTick;\n        }\n\n        /// <summary>\n        /// Manually updates this monitor with the provided data, like if it has just been\n        /// updated from CCP.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        /// <remarks>\n        /// This method does not fire any event.\n        /// </remarks>\n        internal void UpdateWith(EsiResult<T> result)\n        {\n            LastResult = result;\n            LastUpdate = DateTime.UtcNow;\n        }\n\n        /// <summary>\n        /// Forces an update.\n        /// </summary>\n        internal void ForceUpdate(bool retryOnError)\n        {\n            m_forceUpdate = true;\n            m_retryOnForceUpdateError |= retryOnError;\n        }\n\n        /// <summary>\n        /// Updates on every second.\n        /// </summary>\n        private void UpdateOnOneSecondTick()\n        {\n            // Are we already updating?\n            if (!IsUpdating)\n            {\n                m_isCanceled = false;\n                if (!Enabled)\n                    // Monitor is disabled\n                    Status = QueryStatus.Disabled;\n                else if (!NetworkMonitor.IsNetworkAvailable)\n                    // No network connection\n                    Status = QueryStatus.NoNetwork;\n                else if (!HasESIKey)\n                    // No valid ESI key\n                    Status = QueryStatus.NoESIKey;\n                else if (!HasAccess)\n                    // This ESI key does not have access\n                    Status = QueryStatus.NoAccess;\n                else if (EsiErrors.IsErrorCountExceeded || (!m_forceUpdate && NextUpdate >\n                        DateTime.UtcNow))\n                    // Is it an auto-update test?\n                    // If not due time yet, quits\n                    Status = QueryStatus.Pending;\n                else\n                {\n                    // Start the update\n                    IsUpdating = true;\n                    Status = QueryStatus.Updating;\n                    QueryAsyncCore(EveMonClient.APIProviders.CurrentProvider, OnQueried);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Performs the query to the provider, passing the required arguments.\n        /// </summary>\n        /// <param name=\"provider\">The API provider to use.</param>\n        /// <param name=\"callback\">The callback invoked on the UI thread after a result has\n        /// been queried.</param>\n        /// <exception cref=\"System.ArgumentNullException\">provider</exception>\n        protected virtual void QueryAsyncCore(APIProvider provider, APIProvider.\n            ESIRequestCallback<T> callback)\n        {\n            provider.ThrowIfNull(nameof(provider));\n\n            provider.QueryEsi(Method, callback, new ESIParams(LastResult?.Response));\n        }\n\n        /// <summary>\n        /// Occurs when a new result has been queried.\n        /// </summary>\n        /// <param name=\"result\">The downloaded result</param>\n        private void OnQueried(EsiResult<T> result, object state)\n        {\n            IsUpdating = false;\n            Status = QueryStatus.Pending;\n\n            // Do we need to retry the force update ?\n            m_forceUpdate = m_retryOnForceUpdateError && result.HasError;\n\n            if (!m_isCanceled)\n            {\n                // Updates the stored data\n                m_retryOnForceUpdateError = false;\n                LastUpdate = DateTime.UtcNow;\n                LastResult = result;\n                // Notify subscribers\n                Callback?.Invoke(result);\n            }\n        }\n\n        /// <summary>\n        /// Resets the monitor with the given last update time.\n        /// </summary>\n        /// <param name=\"lastUpdate\">The UTC time of the last update.</param>\n        private void Reset(DateTime lastUpdate)\n        {\n            Cancel();\n            LastUpdate = lastUpdate;\n            LastResult = null;\n        }\n\n        /// <summary>\n        /// Cancels the running update.\n        /// </summary>\n        private void Cancel()\n        {\n            m_isCanceled = true;\n            m_forceUpdate = false;\n        }\n\n        /// <summary>\n        /// Set the network availability.\n        /// </summary>\n        protected bool SetNetworkStatus { get; set; }\n\n\n        #region Overridden Methods\n\n        /// <summary>\n        /// Gets the bound method header.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => Method.HasHeader() ? Method.GetHeader() : Method.\n            ToString();\n\n        #endregion\n\n\n        #region Interfaces implementations\n\n        bool INetworkChangeSubscriber.SetNetworkStatus\n        {\n            get { return SetNetworkStatus; }\n            set { SetNetworkStatus = value; }\n        }\n\n        void IQueryMonitorEx.Reset(DateTime lastUpdate)\n        {\n            Reset(lastUpdate);\n        }\n\n        void IQueryMonitorEx.ForceUpdate(bool retryOnError)\n        {\n            ForceUpdate(retryOnError);\n        }\n\n        IAPIResult IQueryMonitor.LastResult => LastResult;\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/QueryMonitor/QueryMonitorCollection.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Interfaces;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.QueryMonitor\n{\n    public sealed class QueryMonitorCollection : ReadonlyCollection<IQueryMonitor>\n    {\n        /// <summary>\n        /// Gets the monitor for the given query.\n        /// </summary>\n        /// <param name=\"method\"></param>\n        /// <returns></returns>\n        public IQueryMonitor this[Enum method] => Items.FirstOrDefault(monitor => method.Equals(monitor.Method));\n\n        /// <summary>\n        /// Gets true when at least one of the monitors encountered an error on last try.\n        /// </summary>\n        public bool HasErrors => Items.Any(x => x.LastResult != null && x.LastResult.HasError);\n\n        /// <summary>\n        /// Gets the last API results gotten.\n        /// </summary>\n        public IEnumerable<IAPIResult> APIResults => Items.Where(x => x.LastResult != null).Select(x => x.LastResult);\n\n        /// <summary>\n        /// Gets the list of monitors to be auto-updated, ordered from the earliest to the latest.\n        /// </summary>\n        public IEnumerable<IQueryMonitor> OrderedByUpdateTime\n        {\n            get\n            {\n                IOrderedEnumerable<IQueryMonitor> monitors = Items.OrderBy(x => x.NextUpdate);\n\n                // Returns the monitors which are planned for an autoupdate\n                foreach (IQueryMonitorEx monitor in monitors.Select(monitor => (IQueryMonitorEx)monitor).Where(\n                    monitor => monitor.Status == QueryStatus.Pending || monitor.Status == QueryStatus.Updating))\n                {\n                    yield return monitor;\n                }\n\n                // Returns the monitors which won't autoupdate\n                foreach (IQueryMonitorEx monitor in monitors.Select(monitor => (IQueryMonitorEx)monitor).Where(\n                    monitor => monitor.Status != QueryStatus.Pending && monitor.Status != QueryStatus.Updating))\n                {\n                    yield return monitor;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets the next query to be auto-updated, or null.\n        /// </summary>\n        public IQueryMonitor NextMonitorToBeUpdated\n        {\n            get\n            {\n                DateTime nextTime = DateTime.MaxValue;\n                IQueryMonitor nextMonitor = null;\n                foreach (IQueryMonitorEx monitor in Items.Cast<IQueryMonitorEx>())\n                {\n                    if (monitor.Status != QueryStatus.Pending && monitor.Status != QueryStatus.Updating)\n                        continue;\n\n                    DateTime monitorNextTime = monitor.NextUpdate;\n                    if (monitorNextTime >= nextTime)\n                        continue;\n\n                    nextMonitor = monitor;\n                    nextTime = monitorNextTime;\n                }\n                return nextMonitor;\n            }\n        }\n\n        /// <summary>\n        /// Requests an update for the given method.\n        /// </summary>\n        /// <param name=\"method\">The method.</param>\n        /// <exception cref=\"System.ArgumentNullException\">method</exception>\n        public void Query(Enum method)\n        {\n            method.ThrowIfNull(nameof(method));\n\n            IQueryMonitorEx monitor = this[method] as IQueryMonitorEx;\n            if (monitor != null && monitor.HasAccess)\n                monitor.ForceUpdate();\n        }\n\n        /// <summary>\n        /// Requests an update for the specified methods.\n        /// </summary>\n        /// <param name=\"methods\">The methods.</param>\n        public void Query(IEnumerable<Enum> methods)\n        {\n            IEnumerable<IQueryMonitorEx> monitors = methods.Select(apiMethod => this[apiMethod]).Cast<IQueryMonitorEx>();\n            foreach (IQueryMonitorEx monitor in monitors.Where(monitor => monitor.HasAccess))\n            {\n                monitor.ForceUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Requests an update for all monitor.\n        /// </summary>\n        public void QueryEverything()\n        {\n            foreach (IQueryMonitorEx monitor in Items.Where(monitor => monitor.HasAccess).Cast<IQueryMonitorEx>())\n            {\n                monitor.ForceUpdate();\n            }\n        }\n\n        /// <summary>\n        /// Adds this monitor to the collection.\n        /// </summary>\n        /// <param name=\"monitor\"></param>\n        internal void Add(IQueryMonitorEx monitor)\n        {\n            Items.Add(monitor);\n        }\n\n        /// <summary>\n        /// Removes this monitor from the collection.\n        /// </summary>\n        /// <param name=\"monitor\"></param>\n        internal void Remove(IQueryMonitorEx monitor)\n        {\n            Items.Remove(monitor);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Resources/License/gpl.txt",
    "content": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\n\t    How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "src/EVEMon.Common/Resources/MD5Sums.txt",
    "content": "df91ac86ac9954dfaff13ab77681a1cc *eve-blueprints-en-US.xml.gzip\n540000f7c111354769a54fa31e57d411 *eve-certificates-en-US.xml.gzip\n3077e700023d84a267b744a6ee44acc7 *eve-geography-en-US.xml.gzip\n4c9cb667e22421fad8ca08777be7fd8a *eve-items-en-US.xml.gzip\n3668b50996fc40a0c0853fec427b5712 *eve-masteries-en-US.xml.gzip\n1f6ae9f613fd26b08d5ec206d0958d79 *eve-properties-en-US.xml.gzip\nadb83f4fc55f61a58548dcb924a91cfe *eve-reprocessing-en-US.xml.gzip\n727a781211b138cf331afed346692962 *eve-skills-en-US.xml.gzip\n"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group0/Default.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:2.0.50727.42\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Resources.icons.Skill_Select.Group0 {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"2.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Default {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Default() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Resources.icons.Skill_Select.Group0.Default\", typeof(Default).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        internal static System.Drawing.Icon book {\n            get {\n                object obj = ResourceManager.GetObject(\"book\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon book_old {\n            get {\n                object obj = ResourceManager.GetObject(\"book_old\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl0 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl0\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl0CanLearn {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl0CanLearn\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon Not_own {\n            get {\n                object obj = ResourceManager.GetObject(\"Not_own\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group0/Default.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"book\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgAwAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAD+/v7/+/v7//f39//29vb/+Pj4//z8/P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAA/v7+//b29v/h4eH/0NDQ/8vLy//T09P/6urq//r6+v8AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD6+vr/4ODg/6CipP95fYL/bnN3/4aIiv+9vb3/6Ojo//r6\n        +v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPf39/+fpKn/fIqX/z5Wbv8TLUb/L0JV/4iJ\n        iv+/v7//6urq//z8/P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9PT0/15wgf+2wcr/SmZ//xUz\n        Uf8wUG//WmBn/4+Pj//FxcX/7u7u//z8/P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADi4+T/ZHeI/7K/\n        y/8zUm//IUlt/052m/9EXHL/cnNz/5eXl//Ozs7/8/Pz//39/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi9\n        wP9neo3/tcXU/y1QcP8TQGf/cqHO/2uIov9gZWz/e3t7/6Ojo//W1tb/9fX1//7+/v8AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAmJ+m/6e0wf+pvtD/JEhr/yFQfv+Qw/D/jKvH/219jP93d3f/hoaG/66urv/f39//+fn5/wAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAACLmKT/x9Pa/5arwf8dQmT/JVaD/6Lc/f+qzOr/jaO4/3Z6fv+AgID/k5OT/8PD\n        w//w8PD//v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGh7jf/k6vD/f5mw/xg9YP84bZ7/vfr//7fd+f+vxdn/fY2a/4eH\n        h/+Ojo7/r6+v/+Xl5f/8/Pz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f3/YHeL//j8/v96lrD/JU5z/1KMwv/b////rtbs/6vF\n        3f+Sp7n/h4uO/5SUlP+pqan/2tra//n5+f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDy9P95kKX/5PD8/1p6l/8jSm7/Z6XW/+L/\n        ///J7vr/iazM/6K5zf+Fi5H/np6e/6mpqf/Q0ND/9fX1//7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2d7j/46ovv/d8P3/Z4mn/ylQ\n        dP9mos7/qdTr/6zZ9/+83fn/sMrh/4uUnP+qqqr/r6+v/8rKyv/v7+///f39/wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfrbr/or7P/97x\n        /v9LcpX/DjRY/3Wz0P+k0un/ZprK/7rc+/+/3PD/j5ef/7a2tv+4uLj/ycnJ/+np6f/8/Pz/AAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHuP\n        ov/z+fz/1ub1/0hukf8aRGz/ksjl/4G12f+Rwt//bprC/7XU7f+Voaz/wsLC/8PDw//MzMz/5eXl//n5\n        +f/+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAa4Sb///////U5PT/P2GB/yZRef+z3PX/QXyx/6bU7v97q9P/gKTG/5mlsP/Ozs7/zs7O/9LS\n        0v/j4+P/9/f3//7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAP7+/v9qhqD/5+71/6TJ5f9Mc5j/OGSN/6XO4/+/3PX/V42//5vH7v+Kr9H/o7PB/9ra\n        2v/a2tr/3Nzc/+Xl5f/19fX//f39/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAA+fr7/09wj//M4fL/8Pr+/+Do8P+6zNn/cJq8//D///+t2PL/YJG//6LF\n        5f+pusn/5eXl/+bm5v/o6Oj/7Ozs//b29v/9/f3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v//eZGm/4apxP/u/P/////////////i7fX/rsfc/9v1\n        //+YwOP/d53B/6S3yf/x8fH/9PT0//b29v/39/f/+vr6//7+/v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2+Pn/c4ug/5Kzyf/y/f///v//////\n        ///P4/P/sdj1/7bX9P+QsM//ma7D//v7+//8/Pz//v7+//7+/v/+/v7/AAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD6+/z/hJir/566\n        z//y+////v////////++2O7/ptDv/5Gzzf+Vqr7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAD7+/z/kKOz/5qzyf/k8vz//P7///////+0yt7/nNXo/4Wes/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAD7/P3/hJWm/5Wqvv/V4u7/+vz9//7///+TsMP/iKjF/wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/f3/hZam/4yfsv/f5+z//P3+//f5+/+otcH/AAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/P3/rbjD//v8/P/+/v7//v////7+\n        /v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAA//////////////////A////gH///4A///+AH///gA///4AH//+AA///g\n        AP//4AB//+AAf//AAH//wAA//8AAP//AAD//wAAf/8AAH/+AAB//gAAf/4AAH//AAD//4Af///AH///4\n        B////Af///4H//////////////////////8=\n</value>\n  </data>\n  <data name=\"book_old\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAUFAAUFAAc3MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFCx//8AUFCx//8A\n        c3MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFCx//8AUFCx//8Ac3Ox//8AlpYAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAUFCx//8AUFCx//+x//+x//8Ac3Ox//8AlpYAAAAAAAAAAAAAAAAAAAAA\n        AAAAUFCx//8AUFCx//+x//+x//+x//+x//8Alpax//8AAAAAAAAAAAAAAAAAAAAAUFCx//8AUFCx//+x\n        //+x//+x//+x//+x//+x//8AlpYAAAAAAAAAAAAAAAAAUFCx//8AUFCx//+x//+x//+x//+x//+x//+x\n        //+x//8AlpYAAAAAAAAAAAAAAAAAUFAAUFCx//+x//+x//+x//+x//+x//+x//+x//8AlpYAAAAAAAAA\n        AAAAAAAAAAAAAAAAc3Ox//+x//+x//+x//+x//+x//+x//8AlpYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAc3Ox//+x//+x//+x//+x//8AlpYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlpax//+x\n        //+x//8AlpYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlpYAlpYAlpYAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP8f\n        AAD+DwAA/AcAAPgDAADwAwAA4AMAAMADAADABwAA4A8AAPAfAAD4PwAA/H8AAP//AAD//wAA\n</value>\n  </data>\n  <data name=\"lvl0\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABX/yVX\n        /yUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABX/yVX/yVX/yVX/yUAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABX/yVX/yVX/yVX/yVX/yUAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAABX/yVX/yVX/yVX/yUAAABX/yVX/yVX/yUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABX/yVX\n        /yVX/yUAAAAAAAAAAABX/yVX/yUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AABX/yVX/yVX/yUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABX/yVX/yUA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABX/yVX/yVX/yUAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABX/yVX/yUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAABX/yVX/yVX/yUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAABX/yVX/yVX/yUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AABX/yVX/yUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAPz/\n        AAD4fwAA8H8AAMI/AADHPwAA/x8AAP+fAAD/jwAA/88AAP/HAAD/4wAA//MAAP//AAD//wAA\n</value>\n  </data>\n  <data name=\"PrereqsMet\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJ\n        3ABJ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJ3ABJ3AAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJ3AA9uQA9uQBJ3AAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAABJ3AA9uQA9uQBJ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AABJ3ABJ3AA9uQAxlgAxlgA9uQBJ3ABJ3AAAAAAAAAAAAAAAAAAAAAAAAABJ3ABJ3AA9uQA9uQAxlgAx\n        lgAxlgAxlgA9uQA9uQBJ3ABJ3AAAAAAAAAAAAAAAAABJ3ABJ3AA9uQA9uQAxlgAxlgAxlgAxlgA9uQA9\n        uQBJ3ABJ3AAAAAAAAAAAAAAAAAAAAAAAAABJ3ABJ3AA9uQAxlgAxlgA9uQBJ3ABJ3AAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAABJ3AA9uQA9uQBJ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAABJ3AA9uQA9uQBJ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJ\n        3ABJ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJ3ABJ3AAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP5/\n        AAD+fwAA/D8AAPw/AADwDwAAwAMAAMADAADwDwAA/D8AAPw/AAD+fwAA/n8AAP//AAD//wAA\n</value>\n  </data>\n  <data name=\"PrereqsNOTMet\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPj+kAAP8AAP+Pj+kAAAAA\n        AAAAAAAAAACPj+kAAP8AAP+Pj+kAAAAAAAAAAAAAAAAAAABvb+0AAP8AAP8AAAAAAAAAAAAAAAAAAP8A\n        AP9vb+0AAAAAAAAAAAAAAAAAAAAAAAAAAABQUPIAAP8AAP8AAAAAAAAAAP8AAP9QUPIAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAP8AAP9QUPJQUPIAAP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAP8AAP8AAP8AAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbW+8A\n        AP8AAP9bW+8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP8AAP8AAP8AAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP9QUPJQUPIAAP8AAP8AAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAABQUPIAAP8AAP8AAAAAAAAAAP8AAP9QUPIAAAAAAAAAAAAAAAAAAAAAAAAAAABv\n        b+0AAP8AAP8AAAAAAAAAAAAAAAAAAP8AAP9vb+0AAAAAAAAAAAAAAAAAAACPj+kAAP8AAP+Pj+kAAAAA\n        AAAAAAAAAACPj+kAAP8AAP+Pj+kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAMPD\n        AADjxwAA8Y8AAPgfAAD8PwAA/D8AAPw/AAD4HwAA8Y8AAOPHAADDwwAA//8AAP//AAD//wAA\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group1/Dice_Spots.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:2.0.50727.42\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Resources.icons.Skill_Select.Group1 {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"2.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Dice_Spots {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Dice_Spots() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Resources.icons.Skill_Select.Group1.Dice_Spots\", typeof(Dice_Spots).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl1 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl1\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl2 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl2\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl3 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl3\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl4 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl4\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl5 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl5\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group1/Dice_Spots.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"lvl1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/sbH/sbEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/sbH/\n        a2v/a2v/sbEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/sbH/a2v/a2v/sbEAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/sbH/sbEAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//\n        AAD//wAA//8AAP//AAD+fwAA/D8AAPw/AAD+fwAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n</value>\n  </data>\n  <data name=\"lvl2\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/a2v/a2sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAD/a2v/JSX/JSX/a2sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAD/a2v/JSX/JSX/a2sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/a2v/a2sA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/a2v/a2sA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/a2v/JSX/JSX/a2sAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/a2v/JSX/JSX/a2sAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAD/a2v/a2sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//\n        AAD//wAA+f8AAPD/AADw/wAA+f8AAP+fAAD/DwAA/w8AAP+fAAD//wAA//8AAP//AAD//wAA\n</value>\n  </data>\n  <data name=\"lvl3\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/JSX/JSUAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/JSXcAADcAAD/JSUAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAD/JSXcAADcAAD/JSUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/JSX/JSUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/JSX/JSUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/JSXc\n        AADcAAD/JSUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/JSXcAADcAAD/JSUAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/JSX/JSUAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/JSX/JSUAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAD/JSXcAADcAAD/JSUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAD/JSXcAADcAAD/JSUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/\n        JSX/JSUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAOf/\n        AADD/wAAw/8AAOf/AAD+fwAA/D8AAPw/AAD+fwAA/+cAAP/DAAD/wwAA/+cAAP//AAD//wAA\n</value>\n  </data>\n  <data name=\"lvl4\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcAADcAAAAAAAAAAAAAAAAAADcAADc\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcAACWAACWAADcAAAAAAAAAADcAACWAACWAADcAAAAAAAAAAAA\n        AAAAAAAAAAAAAADcAACWAACWAADcAAAAAAAAAADcAACWAACWAADcAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AADcAADcAAAAAAAAAAAAAAAAAADcAADcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcAADcAAAAAAAAAAAAAAAAAADcAADcAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAADcAACWAACWAADcAAAAAAAAAADcAACWAACWAADcAAAAAAAAAAAAAAAAAAAAAAAAAADc\n        AACWAACWAADcAAAAAAAAAADcAACWAACWAADcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcAADcAAAAAAAA\n        AAAAAAAAAADcAADcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//\n        AADzzwAA4YcAAOGHAADzzwAA//8AAP//AADzzwAA4YcAAOGHAADzzwAA//8AAP//AAD//wAA\n</value>\n  </data>\n  <data name=\"lvl5\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAACWAAAAAAAAAAAA\n        AAAAAAAAAAAAAACWAACWAAAAAAAAAAAAAAAAAAAAAACWAABQAABQAACWAAAAAAAAAAAAAAAAAACWAABQ\n        AABQAACWAAAAAAAAAAAAAAAAAACWAABQAABQAACWAAAAAAAAAAAAAAAAAACWAABQAABQAACWAAAAAAAA\n        AAAAAAAAAAAAAACWAACWAAAAAAAAAAAAAAAAAAAAAAAAAACWAACWAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAACWAACWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAABQ\n        AABQAACWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAABQAABQAACWAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAACWAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAACWAACWAAAAAAAAAAAAAAAAAAAAAAAAAACWAACWAAAAAAAAAAAAAAAAAAAAAACWAABQ\n        AABQAACWAAAAAAAAAAAAAAAAAACWAABQAABQAACWAAAAAAAAAAAAAAAAAACWAABQAABQAACWAAAAAAAA\n        AAAAAAAAAACWAABQAABQAACWAAAAAAAAAAAAAAAAAAAAAACWAACWAAAAAAAAAAAAAAAAAAAAAAAAAACW\n        AACWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAOfn\n        AADDwwAAw8MAAOfnAAD+fwAA/D8AAPw/AAD+fwAA5+cAAMPDAADDwwAA5+cAAP//AAD//wAA\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group2/Slashes.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:2.0.50727.42\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Resources.icons.Skill_Select.Group2 {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"2.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Slashes {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Slashes() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Resources.icons.Skill_Select.Group2.Slashes\", typeof(Slashes).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl1 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl1\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl2 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl2\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl3 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl3\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl4 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl4\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl5 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl5\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group2/Slashes.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"lvl1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoa\n        GhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa\n        GhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAPz/\n        AAD8/wAA/P8AAP5/AAD+fwAA/n8AAP5/AAD+fwAA/n8AAP8/AAD/PwAA/z8AAP//AAD//wAA\n</value>\n  </data>\n  <data name=\"lvl2\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAA\n        AAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoA\n        AAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoa\n        GhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoa\n        GhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAPM/\n        AADzPwAA8z8AAPmfAAD5nwAA+Z8AAPmfAAD5nwAA+Z8AAPzPAAD8zwAA/M8AAP//AAD//wAA\n</value>\n  </data>\n  <data name=\"lvl3\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoa\n        GhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoa\n        GhoAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAa\n        GhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAa\n        GhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAa\n        GhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAA\n        AAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAA\n        AAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAA\n        AAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAMzP\n        AADMzwAAzM8AAOZnAADmZwAA5mcAAOZnAADmZwAA5mcAAPMzAADzMwAA8zMAAP//AAD//wAA\n</value>\n  </data>\n  <data name=\"lvl4\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAA\n        AAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAA\n        AAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAA\n        AAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoA\n        AAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoA\n        AAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoA\n        AAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoA\n        AAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAaGhoa\n        GhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoa\n        GhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoa\n        GhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AADMz\n        AAAzMwAAMzMAAJmZAACZmQAAmZkAAJmZAACZmQAAmZkAAMzMAADMzAAAzMwAAP//AAD//wAA\n</value>\n  </data>\n  <data name=\"lvl5\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAA\n        AAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAA\n        AAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAA\n        AAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoA\n        AAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAaGhoaGhoaGhoaGhoAAAAaGhoaGhoAAAAaGhoaGhoaGhoa\n        GhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoa\n        GhoAAAAaGhoaGhoAAAAaGhoaGhoaGhoaGhoAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoA\n        AAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAaGhoa\n        GhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoa\n        GhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoaGhoAAAAAAAAaGhoa\n        GhoAAAAAAAAaGhoaGhoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AADMz\n        AAAzMwAAMzMAAJmZAACZkAAAkAAAAAAJAAAJmQAAmZkAAMzMAADMzAAAzMwAAP//AAD//wAA\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group3/Pie_Slices.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:2.0.50727.42\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Resources.icons.Skill_Select.Group3 {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"2.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Pie_Slices {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Pie_Slices() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Resources.icons.Skill_Select.Group3.Pie_Slices\", typeof(Pie_Slices).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl0 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl0\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl1 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl1\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl2 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl2\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl3 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl3\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl4 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl4\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl5 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl5\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group3/Pie_Slices.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"lvl0\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA\n        AAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA\n        AAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD/AAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA+B8AAPfv\n        AADv9wAA3/sAAL/7AAC//QAAv/0AAL/9AAC//QAAv/sAAN/7AADv9wAA9+8AAPgfAAD//wAA\n</value>\n  </data>\n  <data name=\"lvl1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAAAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA\n        AAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/\n        AAD/AAD/AAD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAA\n        AAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAD/AAAA\n        AAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA\n        AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAD/AAD/AAD/\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA+B8AAPfv\n        AADv9wAA3/sAAL/7AAC//QAAv/0AAL8BAAC/AQAAvwMAAN8DAADvBwAA9w8AAPgfAAD//wAA\n</value>\n  </data>\n  <data name=\"lvl2\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAAAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/\n        AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAA\n        AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA\n        AAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAD/AAD/\n        AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/\n        AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/\n        AAD/AAD/AAD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAA\n        AAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAD/AAAA\n        AAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA\n        AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAD/AAD/AAD/\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA+B8AAPDv\n        AADg9wAAwPsAAID7AACA/QAAgP0AAL8BAAC/AQAAvwMAAN8DAADvBwAA9w8AAPgfAAD//wAA\n</value>\n  </data>\n  <data name=\"lvl3\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAAAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/\n        AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAA\n        AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAD/AAAAAAAA\n        AAAAAAD/AAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAD/AAAAAAAA\n        AAAAAAAAAAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAD/\n        AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/\n        AAD/AAD/AAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAA\n        AAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAD/AAD/\n        AAD/AAD/AAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAAAAAAA\n        AAAAAAAAAAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAAAAAAAAAAAAAAAAAD/AAD/\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA+B8AAPAP\n        AADoFwAA2BsAALw7AAC8PQAAvn0AAIABAACAAQAAgYMAAMGDAADjxwAA888AAPgfAAD//wAA\n</value>\n  </data>\n  <data name=\"lvl4\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAAAAABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAAAAAAA\n        AAAAAAAAAAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAAAAAAAAAAAAAAAAAD/AAD/\n        AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAAAAAAA\n        AAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAD/AAAAAAAA\n        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD/AAD/\n        AAD/AAD/AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAD/AAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAAAAAAA\n        AAAAAAAAAAD/AAAAAAAAAAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAD/AAAA\n        AAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAD/AAD/\n        AAD/AAD/AAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAAAAAAA\n        AAAAAAAAAAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAAAAAAAAAAAAAAAAAD/AAD/\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA+B8AAPPP\n        AADjxwAAwYMAAIGDAACwDQAAvD0AALw9AACwDQAAgYMAAMGDAADjxwAA888AAPgfAAD//wAA\n</value>\n  </data>\n  <data name=\"lvl5\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAAAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/\n        AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/\n        AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAA\n        AAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAD/AAD/AAD/\n        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/\n        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/\n        AAD/AAD/AAD/AAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAA\n        AAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAD/AAD/\n        AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/\n        AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD/AAD/AAD/AAD/AAD/AAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA+B8AAPAP\n        AADgBwAAwAMAAIADAACAAQAAgAEAAIABAACAAQAAgAMAAMADAADgBwAA8A8AAPgfAAD//wAA\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group4/Pentagons.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:2.0.50727.42\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Resources.icons.Skill_Select.Group4 {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"2.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Pentagons {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Pentagons() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Resources.icons.Skill_Select.Group4.Pentagons\", typeof(Pentagons).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl0 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl0\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl1 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl1\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl2 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl2\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl3 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl3\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl4 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl4\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl5 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl5\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group4/Pentagons.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"lvl0\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgAwAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJMAAAC/AAAAvwAA\n        AL8AAAC/AAAAqwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAgwAAAH8AAAB/AAAAfwAA\n        AHsAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AIMAAAD/AAAAhwAAAB8AAAAfAAAAHwAAADMAAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAA\n        AFsAAABfAAAAXwAAAGcAAAD/AAAA4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAA2wAAAP8AAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMcAAAD/AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAADcAAAD/AAAAzwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAewAAAP8AAACDAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAjwAAAP8AAABvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnAAAA/wAAAM8AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADjAAAA/wAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAA/wAA\n        AB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAP8AAADDAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AIsAAAD/AAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbAAAA/wAAAGcAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAOwAAAP8AAAC/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAOsAAAD7AAAAEwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAA6wAAAPsAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHAAAA/wAA\n        ALsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbAAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AKMAAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAD/AAAArwAAAAAAAAAAAAAAAAAA\n        AAAAAAAHAAAA8wAAAPcAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAPMAAADzAAAABwAA\n        AAAAAAAAAAAAAAAAAE8AAAD/AAAArwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArwAA\n        AP8AAABPAAAAAAAAAAAAAAAAAAAArwAAAP8AAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAABbAAAA/wAAAJsAAAAAAAAAAAAAAAsAAAD3AAAA8wAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAABMAAAD7AAAA6wAAAAMAAAAAAAAAWwAAAP8AAACjAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKMAAAD/AAAAWwAAAAAAAACvAAAA/wAAAI8AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjwAAAP8AAACvAAAAAAAAAGcAAAD7AAAA/wAA\n        AKcAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAKcAAAD/AAAA+wAAAGcAAAAAAAAAAAAA\n        AEMAAADnAAAA/wAAANsAAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAADbAAAA/wAAAOcAAABDAAAAAAAA\n        AAAAAAAAAAAAAAAAABcAAAC7AAAA/wAAAPcAAABnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnAAAA9wAAAP8AAAC7AAAAFwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAB/AAAA+wAAAP8AAACnAAAACwAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAApwAAAP8AAAD7AAAAfwAA\n        AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDAAAA5wAAAP8AAADXAAAAKwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKwAAANcAAAD/AAAA5wAA\n        AEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAvwAA\n        AP8AAADzAAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAADzAAAA/wAA\n        AL8AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAADAAAAhwAAAP8AAAD/AAAAnwAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAACfAAAA/wAA\n        AP8AAACHAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAARwAAAOsAAAD/AAAA0wAAACsAAAAAAAAAAAAAAAAAAAArAAAA0wAA\n        AP8AAADrAAAARwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAMMAAAD/AAAA8wAAAF8AAAAAAAAAXwAA\n        APMAAAD/AAAAwwAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAIcAAAD/AAAA/wAA\n        AOsAAAD/AAAA/wAAAIcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AEcAAADrAAAA/wAAAOsAAABHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAABcAAABPAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAA///////////+AAAf/AAAH/wAAB/8f/+P+P//j/j//4/4///H8f//x/H/\n        /8fh///j4///4+P//+PD///hx///8cf///GH///wj///+I////iD///gwf//weD//4PwP/4H/B/8H/4P\n        +D//A+B//8HB///gg///8Af///wf///+P/8=\n</value>\n  </data>\n  <data name=\"lvl1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJMAAAC/AAAAvwAA\n        AL8AAAC/AAAAqwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAgwAAAH8AAAB/AAAAfwAA\n        AHsAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AIMAAAD/AAAAhwAAAB8AAAAfAAAAHwAAADMAAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAA\n        AFsAAABfAAAAXwAAAGcAAAD/AAAA4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAA2wAAAP8AAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMcAAAD/AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAADcAAAD/AAAAzwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAewAAAP8AAACDAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAjwAAAP8AAABvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnAAAA/wAAAM8AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADjAAAA/wAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbAAAA/wAA\n        AB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAP8AAADDAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AIsAAAD/AAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbAAAA/wAAAGcAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAOwAAAP8AAAC/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAOsAAAD7AAAAEwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAA6wAAAPsAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHAAAA/wAA\n        ALsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbAAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AKMAAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAD/AAAArwAAAAAAAAAAAAAAAAAA\n        AAAAAAAHAAAA8wAAAPcAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/\n        AFoA/wAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAPMAAADzAAAABwAA\n        AAAAAAAAAAAAAAAAAE8AAAD/AAAArwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAP8A/wD/AM0A/wCWAP8AWgD/AB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArwAA\n        AP8AAABPAAAAAAAAAAAAAAAAAAAArwAAAP8AAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/AP8A/wD/AP8AzQD/AJYA/wBaAP8AHgAAAAAAAAAAAAAAAAAA\n        AAAAAABbAAAA/wAAAJsAAAAAAAAAAAAAAAsAAAD3AAAA8wAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wDNAP8AlgD/\n        AFoA/wAeAAAAAAAAABMAAAD7AAAA6wAAAAMAAAAAAAAAWwAAAP8AAACjAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AM0A/wCWAP8AWgAAALsAAAD/AAAAOwAAAAAAAACvAAAA/wAAAI8AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AM0A/wD/AAAAcwAAAP8AAACLAAAAAAAAAGcAAAD7AAAA/wAA\n        AKcAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAADfAAAA/wAAAK8AAAAAAAAAAAAA\n        AEMAAADnAAAA/wAAANsAAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAACLAAAA+wAAAP8AAACzAAAAEwAA\n        AAAAAAAAAAAAAAAAABcAAAC7AAAA/wAAAPcAAABnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAAzwAAAP8AAADzAAAAZwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAB/AAAA+wAAAP8AAACnAAAACwAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAPcAAAD/AAAAxwAA\n        ACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDAAAA5wAAAP8AAADXAAAAKwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAAD/AAAA+wAA\n        AHsAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAvwAA\n        AP8AAADzAAAAXwAAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAADvAAAA/wAA\n        ANcAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAADAAAAhwAAAP8AAAD/AAAAnwAAAAsAAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAA\n        AP8AAACTAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAARwAAAOsAAAD/AAAA0wAAACsAAAAAAP8A/wD/AP8A/wD/AAAA4wAA\n        AP8AAADnAAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAMMAAAD/AAAA8wAAAF8A/wD/AP8A/wAA\n        AP8AAAD/AAAAqwAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAIcAAAD/AAAA/wAA\n        AOsAAAD/AAAA8wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AEcAAADrAAAA/wAAAMMAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAABcAAABPAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAA///////////+AAAf/AAAH/wAAB/8f/+P+P//j/j//4/4///H8f//x/H/\n        /8fh///j4///4+P//+PD/z/hx/8H8cf/APGH/wAQj/8AAI//AACD/wAAwf8AAOD/AAPwPwAH/B8AD/4P\n        AD//AwB//8EB///gA///8A////wf///+P/8=\n</value>\n  </data>\n  <data name=\"lvl2\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJMAAAC/AAAAvwAA\n        AL8AAAC/AAAAqwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAgwAAAH8AAAB/AAAAfwAA\n        AHsAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AIMAAAD/AAAAhwAAAB8AAAAfAAAAHwAAADMAAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAA\n        AFsAAABfAAAAXwAAAGcAAAD/AAAA4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAA2wAAAP8AAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAA/wBaAP8A/wBoANsAAAD/AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAADcAAAD/AAAAzwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAP8ANgD/AOEA/wD/AAAAewAAAP8AAACDAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAjwAAAP8AAABvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ABIA/wDDAP8A/wD/AP8A/wD/AAAA/wAAAM8AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADjAAAA/wAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AogD/AMMA/wD/AP8A/wD/AP8AAADbAAAA/wAA\n        AB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAP8AAADDAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AH4A/wDhAP8A/wD/AP8A/wD/AP8A/wAA\n        AIsAAAD/AAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbAAAA/wAAAGcAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wBaAP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AAAAOwAAAP8AAAC/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAOsAAAD7AAAAEwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8ANgD/AOEA/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AAAA6wAAAPsAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHAAAA/wAA\n        ALsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ABIA/wDDAP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAACbAAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AKMAAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AogD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAEsAAAD/AAAArwAAAAAAAAAAAAAAAAAA\n        AAAAAAAHAAAA8wAAAPcAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+\n        AKwA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAPMAAADzAAAABwAA\n        AAAAAAAAAAAAAAAAAE8AAAD/AAAArwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAArwAA\n        AP8AAABPAAAAAAAAAAAAAAAAAAAArwAAAP8AAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8AAABbAAAA/wAAAJsAAAAAAAAAAAAAAAsAAAD3AAAA8wAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8AAAD7AAAA6wAAAAMAAAAAAAAAWwAAAP8AAACjAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAALsAAAD/AAAAOwAAAAAAAACvAAAA/wAAAI8AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAAcwAAAP8AAACLAAAAAAAAAGcAAAD7AAAA/wAA\n        AKcAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAADfAAAA/wAAAK8AAAAAAAAAAAAA\n        AEMAAADnAAAA/wAAANsAAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAACLAAAA+wAAAP8AAACzAAAAEwAA\n        AAAAAAAAAAAAAAAAABcAAAC7AAAA/wAAAPcAAABnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAAzwAAAP8AAADzAAAAZwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAB/AAAA+wAAAP8AAACnAAAACwAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAPcAAAD/AAAAxwAA\n        ACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDAAAA5wAAAP8AAADXAAAAKwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAAD/AAAA+wAA\n        AHsAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAvwAA\n        AP8AAADzAAAAXwAAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAADvAAAA/wAA\n        ANcAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAADAAAAhwAAAP8AAAD/AAAAnwAAAAsAAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAA\n        AP8AAACTAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAARwAAAOsAAAD/AAAA0wAAACsAAAAAAP8A/wD/AP8A/wD/AAAA4wAA\n        AP8AAADnAAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAMMAAAD/AAAA8wAAAF8A/wD/AP8A/wAA\n        AP8AAAD/AAAAqwAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAIcAAAD/AAAA/wAA\n        AOsAAAD/AAAA8wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AEcAAADrAAAA/wAAAMMAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAABcAAABPAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAA///////////+AAAf/AAAH/wAAB/8f/4P+P/8D/j/+A/4//gH8f/wB/H/\n        4Afh/8AD4/+AA+P/gAPD/wABx/8AAcf/AAGH/wAAj/8AAI//AACD/wAAwf8AAOD/AAPwPwAH/B8AD/4P\n        AD//AwB//8EB///gA///8A////wf///+P/8=\n</value>\n  </data>\n  <data name=\"lvl3\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJMAAAC/AAAAvwAA\n        AL8AAAC/AAAAqwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAgwAAAH8AAAB/AAAAfwAA\n        AHsAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AIMAWgD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wAAAGcAAAD/AAAA4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAA2wAAAP8A5ACbAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAIsAAAD/AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAADcAAAD/AAAAzwD/AAgA/wC6AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAAewAAAP8AAACDAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAjwAAAP8AAABvAAAAAAD/ADkA/wDkAP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAAAM8AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADjAAAA/wAAABsAAAAAAAAAAAD/AGoA/wDyAP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAADbAAAA/wAA\n        AB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAP8AAADDAAAAAAAAAAAAAAAAAAAAAAD/\n        AJsA/wDJAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAA\n        AIsAAAD/AAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbAAAA/wAAAGcAAAAAAAAAAAAA\n        AAAAAAAAAP8AGAD/AMgA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AAAAOwAAAP8AAAC/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAOsAAAD7AAAAEwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAP8ASQD/APEA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AAAA6wAAAPsAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHAAAA/wAA\n        ALsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AegD/AOQA/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAACbAAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AKMAAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AqwD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAEsAAAD/AAAArwAAAAAAAAAAAAAAAAAA\n        AAAAAAAHAAAA8wAAAPcAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAoAP8A1QD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAPMAAADzAAAABwAA\n        AAAAAAAAAAAAAAAAAE8AAAD/AAAArwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAA/wBaAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAArwAA\n        AP8AAABPAAAAAAAAAAAAAAAAAAAArwAAAP8AAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8AAABbAAAA/wAAAJsAAAAAAAAAAAAAAAsAAAD3AAAA8wAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8AAAD7AAAA6wAAAAMAAAAAAAAAWwAAAP8AAACjAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAALsAAAD/AAAAOwAAAAAAAACvAAAA/wAAAI8AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAAcwAAAP8AAACLAAAAAAAAAGcAAAD7AAAA/wAA\n        AKcAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAADfAAAA/wAAAK8AAAAAAAAAAAAA\n        AEMAAADnAAAA/wAAANsAAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAACLAAAA+wAAAP8AAACzAAAAEwAA\n        AAAAAAAAAAAAAAAAABcAAAC7AAAA/wAAAPcAAABnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAAzwAAAP8AAADzAAAAZwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAB/AAAA+wAAAP8AAACnAAAACwAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAPcAAAD/AAAAxwAA\n        ACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDAAAA5wAAAP8AAADXAAAAKwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAAD/AAAA+wAA\n        AHsAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAvwAA\n        AP8AAADzAAAAXwAAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAADvAAAA/wAA\n        ANcAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAADAAAAhwAAAP8AAAD/AAAAnwAAAAsAAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAA\n        AP8AAACTAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAARwAAAOsAAAD/AAAA0wAAACsAAAAAAP8A/wD/AP8A/wD/AAAA4wAA\n        AP8AAADnAAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAMMAAAD/AAAA8wAAAF8A/wD/AP8A/wAA\n        AP8AAAD/AAAAqwAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAIcAAAD/AAAA/wAA\n        AOsAAAD/AAAA8wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AEcAAADrAAAA/wAAAMMAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAABcAAABPAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAA///////////+AAAf/AAAH/wAAB/8AAAP+AAAD/iAAA/4wAAH8eAAB/Hg\n        AAfh8AAD4/gAA+P8AAPD/AABx/4AAcf/AAGH/wAAj/8AAI//AACD/wAAwf8AAOD/AAPwPwAH/B8AD/4P\n        AD//AwB//8EB///gA///8A////wf///+P/8=\n</value>\n  </data>\n  <data name=\"lvl4\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJMAAAC/AAAAvwAA\n        AL8AAAC/AAAAqwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAgwAAAH8AAAB/AAAAfwAA\n        AHsAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AIMAWgD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wAAAGcAAAD/AAAA4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAA2wAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wBoANsAAAD/AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAADcAAAD/AAAAzwD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAAewAAAP8AAACDAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAjwAAAP8AAABvAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAAAM8AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADjAAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAADbAAAA/wAA\n        AB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAP8AAADDAP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAA\n        AIsAAAD/AAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbAAAA/wAAAGcA/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AAAAOwAAAP8AAAC/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAOsAAAD7AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AAAA6wAAAPsAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHAAAA/wAA\n        ALsA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAACbAAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AKMAAAD/AAAAXwD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAEsAAAD/AAAArwAAAAAAAAAAAAAAAAAA\n        AAAAAAAHAAAA8wAAAPcA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAPMAAADzAAAABwAA\n        AAAAAAAAAAAAAAAAAE8AAAD/AAAArwD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAArwAA\n        AP8AAABPAAAAAAAAAAAAAAAAAAAArwAAAP8AAABXAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AN0A/wD0AP8AxAD/AJEA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8AAABbAAAA/wAAAJsAAAAAAAAAAAAAAAsAAAD3AAAA8wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A6QD/\n        AOgA/wC5AP8AgwD/AEwA/wAUAAAAAAD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8AAAD7AAAA6wAAAAMAAAAAAAAAWwAAAP8AdQDEAP8A/wD/AP8A/wD/AP8A3AD/\n        AK0A/wB1AP8APgD/AAYAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAALsAAAD/AAAAOwAAAAAAAACvAAAA/wD/AP8A/wDQAP8AnwD/\n        AGcA/wAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAAcwAAAP8AAACLAAAAAAAAAGcAAAD7AFoA/wAw\n        ALMAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAADfAAAA/wAAAK8AAAAAAAAAAAAA\n        AEMAAADnAAAA/wAAANsAAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAACLAAAA+wAAAP8AAACzAAAAEwAA\n        AAAAAAAAAAAAAAAAABcAAAC7AAAA/wAAAPcAAABnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAAzwAAAP8AAADzAAAAZwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAB/AAAA+wAAAP8AAACnAAAACwAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAPcAAAD/AAAAxwAA\n        ACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDAAAA5wAAAP8AAADXAAAAKwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAAD/AAAA+wAA\n        AHsAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAvwAA\n        AP8AAADzAAAAXwAAAAAAAAAAAAAAAAAAAAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAADvAAAA/wAA\n        ANcAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAADAAAAhwAAAP8AAAD/AAAAnwAAAAsAAAAAAAAAAAD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAA\n        AP8AAACTAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAARwAAAOsAAAD/AAAA0wAAACsAAAAAAP8A/wD/AP8A/wD/AAAA4wAA\n        AP8AAADnAAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAMMAAAD/AAAA8wAAAF8A/wD/AP8A/wAA\n        AP8AAAD/AAAAqwAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAIcAAAD/AAAA/wAA\n        AOsAAAD/AAAA8wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AEcAAADrAAAA/wAAAMMAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAABcAAABPAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAA///////////+AAAf/AAAH/wAAB/8AAAP+AAAD/gAAA/4AAAH8AAAB/AA\n        AAfgAAAD4AAAA+AAAAPAAAABwAAAAcAAAAGAAQAAgA8AAID/AACD/wAAwf8AAOD/AAPwPwAH/B8AD/4P\n        AD//AwB//8EB///gA///8A////wf///+P/8=\n</value>\n  </data>\n  <data name=\"lvl5\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJMAAAC/AAAAvwAA\n        AL8AAAC/AAAAqwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAnwAAAJ8AAACfAAAAgwAAAH8AAAB/AAAAfwAA\n        AHsAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AIMAWgD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wAAAGcAAAD/AAAA4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAA2wAAAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wBoANsAAAD/AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAADcAAAD/AAAAzwD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAAewAAAP8AAACDAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAjwAAAP8AAABvAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAAAM8AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADjAAAA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAADbAAAA/wAA\n        AB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAP8AAADDAP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAA\n        AIsAAAD/AAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbAAAA/wAAAGcA/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AAAAOwAAAP8AAAC/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAOsAAAD7AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AAAA6wAAAPsAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHAAAA/wAA\n        ALsA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAACbAAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AKMAAAD/AAAAXwD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAEsAAAD/AAAArwAAAAAAAAAAAAAAAAAA\n        AAAAAAAHAAAA8wAAAPcA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAPMAAADzAAAABwAA\n        AAAAAAAAAAAAAAAAAE8AAAD/AAAArwD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAArwAA\n        AP8AAABPAAAAAAAAAAAAAAAAAAAArwAAAP8AAABXAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8AAABbAAAA/wAAAJsAAAAAAAAAAAAAAAsAAAD3AAAA8wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8AAAD7AAAA6wAAAAMAAAAAAAAAWwAAAP8AdQDEAP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAALsAAAD/AAAAOwAAAAAAAACvAAAA/wD/AP8A/wDQAP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAAcwAAAP8AAACLAAAAAAAAAGcAAAD7AFoA/wAw\n        ALMA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAADfAAAA/wAAAK8AAAAAAAAAAAAA\n        AEMAAADnAAAA/wAAANsA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAACLAAAA+wAAAP8AAACzAAAAEwAA\n        AAAAAAAAAAAAAAAAABcAAAC7AAAA/wAAAPcAAABnAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAAzwAAAP8AAADzAAAAZwAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAB/AAAA+wAAAP8AAACnAP8A/wD/AP8A/wD/AP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAAAPcAAAD/AAAAxwAA\n        ACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDAAAA5wAAAP8AAADXAP8A/wD/\n        AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAAD/AAAA+wAA\n        AHsAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAvwAA\n        AP8AAADzAAAAXwD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AAADvAAAA/wAA\n        ANcAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAADAAAAhwAAAP8AAAD/AAAAnwD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA/wAA\n        AP8AAACTAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAARwAAAOsAAAD/AAAA0wD/AP8A/wD/AP8A/wD/AP8A/wD/AAAA4wAA\n        AP8AAADnAAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAMMAAAD/AAAA8wAAAF8A/wD/AP8A/wAA\n        AP8AAAD/AAAAqwAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAIcAAAD/AAAA/wAA\n        AOsAAAD/AAAA8wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AEcAAADrAAAA/wAAAMMAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAABcAAABPAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAA///////////+AAAf/AAAH/wAAB/8AAAP+AAAD/gAAA/4AAAH8AAAB/AA\n        AAfgAAAD4AAAA+AAAAPAAAABwAAAAcAAAAGAAAAAgAAAAIAAAACAAAAAwAAAAOAAAAPwAAAH/AAAD/4A\n        AD//AAB//8AB///gA///8A////wf///+P/8=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group5/Pentagrams.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:2.0.50727.42\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Resources.icons.Skill_Select.Group5 {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"2.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Pentagrams {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Pentagrams() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Resources.icons.Skill_Select.Group5.Pentagrams\", typeof(Pentagrams).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl0 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl0\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl1 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl1\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl2 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl2\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl3 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl3\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl4 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl4\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl5 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl5\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon Not_own {\n            get {\n                object obj = ResourceManager.GetObject(\"Not_own\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group5/Pentagrams.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"lvl0\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3NwA3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAA3NwA3NwA3NwA3NwA3NwA3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3NwA3NwA\n        3NwA3NwA3NwA3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3NwA3NwA3NwA3NwAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3NwA3NwA3NwA3NwAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADP8wAA1+sAAOmX\n        AADudwAA7ncAAPAPAADwDwAA4AcAAJgZAAB4HgAAAAAAAP2/AAD9vwAA/b8AAP5/AAD+fwAA\n</value>\n  </data>\n  <data name=\"lvl1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAD/qiX/qiX/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/\n        qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiUAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/\n        qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiUAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADP8wAA1+sAAOmX\n        AADudwAA7ncAAPAPAADwDwAA4AcAAJgZAAB4HgAAAAAAAPw/AAD8PwAA/D8AAP5/AAD+fwAA\n</value>\n  </data>\n  <data name=\"lvl2\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAD/qiX/qiX/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/\n        qiX/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiX/qiX/\n        qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiUA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/\n        qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiUAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADP8wAA1+sAAOmX\n        AADudwAA7ncAAPAPAADwDwAA4AcAAJgBAAB4AAAAAAAAAPw/AAD8PwAA/D8AAP5/AAD+fwAA\n</value>\n  </data>\n  <data name=\"lvl3\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/\n        qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiUAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAD/qiX/qiX/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/\n        qiX/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiX/qiX/\n        qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiUA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/\n        qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiUAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADP8wAA1+MAAOmH\n        AADuBwAA7gcAAPAPAADwDwAA4AcAAJgBAAB4AAAAAAAAAPw/AAD8PwAA/D8AAP5/AAD+fwAA\n</value>\n  </data>\n  <data name=\"lvl4\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/\n        qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiUAAAAAAAAA\n        AAAAAAAAAAAAAAD/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiUAAAAAAAD/qiX/qiX/\n        qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiUAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAD/qiX/qiX/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/\n        qiX/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiX/qiX/\n        qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiUA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/\n        qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiUAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADP8wAAx+MAAOGH\n        AADgBwAA4AcAAPAPAADwDwAA4AcAAJgBAAB4AAAAAAAAAPw/AAD8PwAA/D8AAP5/AAD+fwAA\n</value>\n  </data>\n  <data name=\"lvl5\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/\n        qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiUAAAAAAAAA\n        AAAAAAAAAAAAAAD/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiUAAAAAAAD/qiX/qiX/\n        qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiUAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAD/qiX/qiX/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/\n        qiX/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiX/\n        qiX/qiUAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiX/qiUA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiX/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAD/qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/\n        qiX/qiUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qiX/qiUAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADP8wAAx+MAAOGH\n        AADgBwAA4AcAAPAPAADwDwAA4AcAAIABAAAAAAAAAAAAAPw/AAD8PwAA/D8AAP5/AAD+fwAA\n</value>\n  </data>\n  <data name=\"PrereqsMet\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        uT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAuT0AAAAAAAAA\n        AAAAAAAAAAAAAAAAuT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuT0AuT0AuT0AAAAAAAAAuT0AuT0A\n        uT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuT0AuT0AuT0AuT0AuT0AuT0AuT0AuT0AAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAuT0AuT0AuT0AuT0AuT0AuT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAuT0AuT0AuT0AuT0AuT0AuT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuT0AuT0A\n        uT0AuT0AuT0AuT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuT0AuT0AuT0AuT0AuT0AuT0AuT0AuT0A\n        uT0AuT0AAAAAAAAAAAAAAAAAuT0AuT0AuT0AuT0AuT0AuT0AuT0AuT0AuT0AuT0AuT0AuT0AuT0AuT0A\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuT0AuT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAuT0AuT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        uT0AuT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuT0AuT0AAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADP8wAAx+MAAOGH\n        AADgBwAA4AcAAPAPAADwDwAA4AcAAIABAAAAAAAAAAAAAPw/AAD8PwAA/D8AAP5/AAD+fwAA\n</value>\n  </data>\n  <data name=\"PrereqsNOTMet\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        ANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAAAAAAAA\n        AAAAAAAAAAAAAAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAANwAANwAAAAAAAAAANwAANwA\n        ANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAANwAANwAANwAANwAANwAANwAANwAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAANwAANwAANwAANwAANwAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAANwAANwAANwAANwAANwAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAANwA\n        ANwAANwAANwAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAANwAANwAANwAANwAANwAANwAANwA\n        ANwAANwAAAAAAAAAAAAAAAAAANwAANwAANwAANwAANwAANwAANwAANwAANwAANwAANwAANwAANwAANwA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAANwAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        ANwAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAANwAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADP8wAAx+MAAOGH\n        AADgBwAA4AcAAPAPAADwDwAA4AcAAIABAAAAAAAAAAAAAPw/AAD8PwAA/D8AAP5/AAD+fwAA\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group6/Black_Dice.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"lvl0\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA\n        AAD/////////////////////////////////////////////////////////////////////////////\n        //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////\n        ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAA==\n</value>\n  </data>\n  <data name=\"lvl1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA\n        AAD/////////////////////////////////////////////////////////////////////////////\n        //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////\n        ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////\n        ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAA==\n</value>\n  </data>\n  <data name=\"lvl2\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA\n        AAD/////////////////////////////////////////////////////////////////////////////\n        //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA////////////AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA////////////AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP///////////wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////\n        ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAA==\n</value>\n  </data>\n  <data name=\"lvl3\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA\n        AAD/////////////////////////////////////////////////////////////////////////////\n        //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA////////////AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////\n        ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA////////////AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP///////////wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////\n        ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAA==\n</value>\n  </data>\n  <data name=\"lvl4\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA\n        AAD/////////////////////////////////////////////////////////////////////////////\n        //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA////////////AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////\n        ////////AAAA/wAAAP///////////wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP///////////wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA////\n        ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA////////////AAAA/wAA\n        AP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP///////////wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////\n        ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAA==\n</value>\n  </data>\n  <data name=\"lvl5\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA\n        AAD/////////////////////////////////////////////////////////////////////////////\n        //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA////////////AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////\n        ////////AAAA/wAAAP///////////wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP///////////wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////\n        ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA\n        AP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA////\n        ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA////////////AAAA/wAA\n        AP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP///////////wAA\n        AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////\n        ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAA==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group7/Red_Dice.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"lvl0\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA\n        AAD/////////////////////////////////////////////////////////////////////////////\n        //////////////////8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg\n        3/////////////////8gIN//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg\n        3/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN//////////\n        ////////ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAA==\n</value>\n  </data>\n  <data name=\"lvl1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA\n        AAD/////////////////////////////////////////////////////////////////////////////\n        //////////////////8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg\n        3/////////////////8gIN//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA//8AAP//AAD/////\n        ////////AAD//wAA//8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA//8AAP//AAD//wAA\n        /////////////wAA//8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg\n        3/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN//////////\n        ////////ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAA==\n</value>\n  </data>\n  <data name=\"lvl2\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA\n        AAD/////////////////////////////////////////////////////////////////////////////\n        //////////////////8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg\n        3/////////////////8gIN//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//ICDf////////////ICDf/wAA/////////////wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//yAg3////////////yAg3/8AAP////////////8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP////////////8AAP//ICDf////////////ICDf/wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/////////////AAD//yAg3////////////yAg\n        3/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN//////////\n        ////////ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAA==\n</value>\n  </data>\n  <data name=\"lvl3\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA\n        AAD/////////////////////////////////////////////////////////////////////////////\n        //////////////////8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg\n        3/////////////////8gIN//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//ICDf////////////ICDf/wAA/////////////wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//yAg3////////////yAg3/8AAP////////////8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA//8AAP//AAD/////\n        ////////AAD//wAA//8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA//8AAP//AAD//wAA\n        /////////////wAA//8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP////////////8AAP//ICDf////////////ICDf/wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/////////////AAD//yAg3////////////yAg\n        3/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN//////////\n        ////////ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAA==\n</value>\n  </data>\n  <data name=\"lvl4\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA\n        AAD/////////////////////////////////////////////////////////////////////////////\n        //////////////////8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg\n        3/////////////////8gIN//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//ICDf////////////ICDf/wAA/////////////wAA//8AAP//AAD//wAA//8AAP//AAD/////\n        ////////AAD//yAg3////////////yAg3/8AAP////////////8AAP//AAD//wAA//8AAP//AAD//wAA\n        /////////////wAA//8gIN////////////8gIN//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN////////////8gIN//AAD/////\n        ////////AAD//wAA//8AAP//AAD//wAA//8AAP////////////8AAP//ICDf////////////ICDf/wAA\n        /////////////wAA//8AAP//AAD//wAA//8AAP//AAD/////////////AAD//yAg3////////////yAg\n        3/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN//////////\n        ////////ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAA==\n</value>\n  </data>\n  <data name=\"lvl5\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA\n        AAD/////////////////////////////////////////////////////////////////////////////\n        //////////////////8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg\n        3/////////////////8gIN//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//ICDf////////////ICDf/wAA/////////////wAA//8AAP//AAD//wAA//8AAP//AAD/////\n        ////////AAD//yAg3////////////yAg3/8AAP////////////8AAP//AAD//wAA//8AAP//AAD//wAA\n        /////////////wAA//8gIN////////////8gIN//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA//8AAP//AAD/////\n        ////////AAD//wAA//8AAP//AAD//wAA//8gIN////////////8gIN//AAD//wAA//8AAP//AAD//wAA\n        /////////////wAA//8AAP//AAD//wAA//8AAP//ICDf////////////ICDf/wAA//8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//yAg3////////////yAg3/8AAP//AAD//wAA\n        //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN////////////8gIN//AAD/////\n        ////////AAD//wAA//8AAP//AAD//wAA//8AAP////////////8AAP//ICDf////////////ICDf/wAA\n        /////////////wAA//8AAP//AAD//wAA//8AAP//AAD/////////////AAD//yAg3////////////yAg\n        3/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8gIN//////////\n        ////////ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//ICDf/yAg3/8gIN//////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAA==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group8/Bars.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:2.0.50727.42\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Resources.icons.Skill_Select.Group8 {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"2.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Bars {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Bars() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Resources.icons.Skill_Select.Group8.Bars\", typeof(Bars).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl0 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl0\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl1 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl1\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl2 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl2\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl3 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl3\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl4 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl4\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon lvl5 {\n            get {\n                object obj = ResourceManager.GetObject(\"lvl5\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon PrereqsMet {\n            get {\n                object obj = ResourceManager.GetObject(\"PrereqsMet\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        internal static System.Drawing.Icon PrereqsNOTMet {\n            get {\n                object obj = ResourceManager.GetObject(\"PrereqsNOTMet\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/Group8/Bars.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"lvl0\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+\n        /v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+\n        /v4AAAD+/v7+/v4AAAAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4A\n        AAAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAD+/v7+/v4A\n        AAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+\n        /v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+\n        /v4AAAD+/v7+/v4AAAAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4A\n        AAAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAD+/v7+/v4A\n        AAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+\n        /v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+\n        /v4AAAD+/v7+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA\n</value>\n  </data>\n  <data name=\"lvl1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+\n        /v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+\n        /v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4A\n        AAAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAA\n        AAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+\n        /v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+\n        /v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4A\n        AAAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAA\n        AAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+\n        /v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+\n        /v4AAAD+/v7+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA\n</value>\n  </data>\n  <data name=\"lvl2\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAD+\n        /v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+\n        /v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4A\n        AAAAAAAA/wAA/wAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAA\n        AAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAD+\n        /v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+\n        /v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4A\n        AAAAAAAA/wAA/wAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAA\n        AAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAD+\n        /v7+/v4AAAD+/v7+/v4AAAD+/v7+/v4AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAD+/v7+/v4AAAD+/v7+\n        /v4AAAD+/v7+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA\n</value>\n  </data>\n  <data name=\"lvl3\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA\n        /wAA/wAAAAD///////8AAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAD/////\n        //8AAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAD///////8AAAD///////8A\n        AAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAD///////8AAAD///////8AAAAAAAAA/wAA/wAA\n        AAAA/wAA/wAAAAAA/wAA/wAAAAD///////8AAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA\n        /wAA/wAAAAD///////8AAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAD/////\n        //8AAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAD///////8AAAD///////8A\n        AAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAD///////8AAAD///////8AAAAAAAAA/wAA/wAA\n        AAAA/wAA/wAAAAAA/wAA/wAAAAD///////8AAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA\n        /wAA/wAAAAD///////8AAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAD/////\n        //8AAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA\n</value>\n  </data>\n  <data name=\"lvl4\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA\n        /wAA/wAAAAAA/wAA/wAAAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA\n        /wAAAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAD///////8A\n        AAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAD///////8AAAAAAAAA/wAA/wAA\n        AAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA\n        /wAA/wAAAAAA/wAA/wAAAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA\n        /wAAAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAD///////8A\n        AAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAD///////8AAAAAAAAA/wAA/wAA\n        AAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA\n        /wAA/wAAAAAA/wAA/wAAAAD///////8AAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA\n        /wAAAAD///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA\n</value>\n  </data>\n  <data name=\"lvl5\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA\n        /wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA\n        /wAAAAAA/wAA/wAAAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAA\n        AAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAAAAAA/wAA/wAA\n        AAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA\n        /wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA\n        /wAAAAAA/wAA/wAAAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAA\n        AAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAAAAAA/wAA/wAA\n        AAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA\n        /wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA/wAAAAAA/wAA\n        /wAAAAAA/wAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA\n</value>\n  </data>\n  <data name=\"PrereqsMet\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NDQ0NDQ0NDQ\n        0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+\n        /v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0NDQ0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+\n        /v7Q0ND+/v7+/v7Q0NDQ0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q\n        0NDQ0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0NDQ0ND+/v7+/v7Q\n        0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0NDQ0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+\n        /v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0NDQ0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+\n        /v7Q0ND+/v7+/v7Q0NDQ0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q\n        0NDQ0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0NDQ0ND+/v7+/v7Q\n        0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0NDQ0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+\n        /v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0NDQ0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+/v7Q0ND+/v7+\n        /v7Q0ND+/v7+/v7Q0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ\n        0NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA\n</value>\n  </data>\n  <data name=\"PrereqsNOTMet\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAQP///wAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP8AAP8A\n        AP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP/+/v7+/v4AAP/+/v7+/v4AAP/+\n        /v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP8AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+\n        /v4AAP/+/v7+/v4AAP8AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4A\n        AP8AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP8AAP/+/v7+/v4A\n        AP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP8AAP/+/v7+/v4AAP/+/v7+/v4AAP/+\n        /v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP8AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+\n        /v4AAP/+/v7+/v4AAP8AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4A\n        AP8AAP/+/v7+/v4AAP/+/v7+/v4AAP/6/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP8AAP/+/v7+/v4A\n        AP/+/v7+/v4AAP/6/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP8AAP/+/v7+/v4AAP/+/v7+/v4AAP/6\n        /v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP8AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+/v4AAP/+/v7+\n        /v4AAP/+/v7+/v4AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8AAP8A\n        AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA\n</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/IconSettings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Common.Resources.Skill_Select {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"14.0.0.0\")]\n    public sealed partial class IconSettings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static IconSettings defaultInstance = ((IconSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new IconSettings())));\n        \n        public static IconSettings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n        \n        [global::System.Configuration.ApplicationScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"Default\")]\n        public string Group0 {\n            get {\n                return ((string)(this[\"Group0\"]));\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"Dice_Spots\")]\n        public string Group1 {\n            get {\n                return ((string)(this[\"Group1\"]));\n            }\n            set {\n                this[\"Group1\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"Slashes\")]\n        public string Group2 {\n            get {\n                return ((string)(this[\"Group2\"]));\n            }\n            set {\n                this[\"Group2\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"Pie_Slices\")]\n        public string Group3 {\n            get {\n                return ((string)(this[\"Group3\"]));\n            }\n            set {\n                this[\"Group3\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"Pentagons\")]\n        public string Group4 {\n            get {\n                return ((string)(this[\"Group4\"]));\n            }\n            set {\n                this[\"Group4\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"Pentagrams\")]\n        public string Group5 {\n            get {\n                return ((string)(this[\"Group5\"]));\n            }\n            set {\n                this[\"Group5\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"Black_Dice\")]\n        public string Group6 {\n            get {\n                return ((string)(this[\"Group6\"]));\n            }\n            set {\n                this[\"Group6\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"Red_Dice\")]\n        public string Group7 {\n            get {\n                return ((string)(this[\"Group7\"]));\n            }\n            set {\n                this[\"Group7\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"Bars\")]\n        public string Group8 {\n            get {\n                return ((string)(this[\"Group8\"]));\n            }\n            set {\n                this[\"Group8\"] = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Resources/Skill_Select/IconSettings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\"\n              GeneratedClassNamespace=\"EVEMon.Resources.icons.Skill_Select\" GeneratedClassName=\"IconSettings\">\n  <Profiles />\n  <Settings>\n    <Setting Name=\"Group0\" Type=\"System.String\" Scope=\"Application\">\n      <Value Profile=\"(Default)\">Default</Value>\n    </Setting>\n    <Setting Name=\"Group1\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">Dice_Spots</Value>\n    </Setting>\n    <Setting Name=\"Group2\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">Slashes</Value>\n    </Setting>\n    <Setting Name=\"Group3\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">Pie_Slices</Value>\n    </Setting>\n    <Setting Name=\"Group4\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">Pentagons</Value>\n    </Setting>\n    <Setting Name=\"Group5\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">Pentagrams</Value>\n    </Setting>\n    <Setting Name=\"Group6\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">Black_Dice</Value>\n    </Setting>\n    <Setting Name=\"Group7\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">Red_Dice</Value>\n    </Setting>\n    <Setting Name=\"Group8\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">Bars</Value>\n    </Setting>\n  </Settings>\n</SettingsFile>"
  },
  {
    "path": "src/EVEMon.Common/Resources/callback_fail.htm",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Error</title>\n    <style>\n        p, body { color: #FFFFFF; font-family: ProximaNova-Regular, Arial }\n\t\th2 { text-align: center; margin-bottom: 10px; text-shadow: 1px 1px 2px #7F7F7F; font-size: 30px; font-family: \"ProximaNova-SemiBold\",Arial }\n        body { background: #000000 url(https://login.eveonline.com/Images/site-bg.jpg) no-repeat center center fixed }\n        #content { background-color: rgba(0, 0, 0, 0.7); padding: 30px; width: 400px; margin: auto }\n    </style>\n</head>\n<body>\n<div id=\"content\">\n<h2>OH NO!</h2>\n<p>Something went wrong, and authentication failed.</p>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "src/EVEMon.Common/Resources/callback_ok.htm",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Authentication Successful</title>\n    <style>\n        p, body { color: #FFFFFF; font-family: ProximaNova-Regular, Arial }\n\t\th2 { text-align: center; margin-bottom: 10px; text-shadow: 1px 1px 2px #7F7F7F; font-size: 30px; font-family: \"ProximaNova-SemiBold\",Arial }\n        body { background: #000000 url(https://login.eveonline.com/Images/site-bg.jpg) no-repeat center center fixed }\n        #content { background-color: rgba(0, 0, 0, 0.7); padding: 30px; width: 400px; margin: auto }\n    </style>\n</head>\n<body>\n<div id=\"content\">\n<h2>AUTHENTICATION SUCCESSFUL</h2>\n<p>This browser window can now be closed.</p>\n<script type=\"text/javascript\" language=\"JavaScript\"><!--\nwindow.close();\n// -->\n</script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "src/EVEMon.Common/Resources/chrFactions.txt",
    "content": "factionID,factionName,description,raceIDs,solarSystemID,corporationID,sizeFactor,stationCount,stationSystemCount,militiaCorporationID,iconID\n500001,Caldari State,\"The Caldari State is ruled by several mega-corporations. There is no central government to speak of - all territories within the State are owned and ruled by corporations. Duty and discipline are required traits in Caldari citizens, plus unquestioning loyalty to the corporation they live to serve. The corporations compete aggressively amongst themselves and with companies outside the State, resulting in a highly capitalistic society.\",1,30000145,1000035,5.0,1503,503,1000180,1439\n500002,Minmatar Republic,\"The Minmatar Republic was formed over a century ago when the Minmatar threw out their Amarrian overlords in what is now known as the Minmatar Rebellion. In this the Minmatar had the support of the Gallente Federation, and to this day the two nations remain close allies. Yet, only a quarter of the Minmatar people reside within the Republic. The rest are scattered around the star cluster, including a large portion who are still enslaved within the Amarr Empire. Minmatar individuals are independent and proud, possessing a strong will and a multitude of tribal traditions.\",2,30002544,1000051,5.0,570,291,1000182,1440\n500003,Amarr Empire,\"The largest of the five main empires, the Amarr Empire is a sprawling patch-work of feudal-like provinces held together by the might of the emperor. Religion has always played a big part in Amarrian politics and the Amarrians believe they are the rightful masters of the world, souring their relations with their neighbours. Another source of ill-feelings on part of the other empires is the fact that the Amarrians embrace slavery.\",4,30002187,1000084,5.0,998,484,1000179,1442\n500004,Gallente Federation,\"The Gallente Federation encompasses several races, the Gallenteans the largest by far. The Federation is democratic and very liberal in a world full of dictators and oligarchies. The Caldari State was once part of the Federation, but a severe dispute resulted in their departure and a long war between the Gallente Federation and the Caldari State. The Gallenteans are the masters of pleasure and entertainment and their rich trade empire has given the world many of its most glorious and extravagant sights.  \",8,30004993,1000120,5.0,1051,507,1000181,1441\n500005,Jove Empire,\"The Jove Empire is isolated from the rest of the world to all but a selected few. The Jovians are a mystery to the other races, fueled not only by their elusiveness, but also their highly advanced technology, eons ahead of the other races. The Jovians have been civilized longer than any other race in the world of EVE and have gone through several golden ages, now long-since shrouded in the past. The current Jovian Empire is only a pale shadow of its former self, mainly because of the Jovian Disease - a psychological disorder that is always fatal.\",16,30001642,1000149,5.0,267,164,None,2195\n500006,CONCORD Assembly,\"CONCORD is an independent organization founded a century ago to facilitate negotiations between the races to improve relations, as well as to foster inter-stellar trade through policing and regulations. Starting as a fledgling meeting ground for diplomats CONCORD has in the decades since it was founded slowly increased its power and influence. It has become an entity independent of the races, as it is able to largely fund its own operation through customs, confiscation of contraband goods, and other means.\",15,30005204,1000137,5.0,138,94,None,1434\n500007,Ammatar Mandate,\"The Ammatars are part of the Amarr Empire, but are of Minmatar origin. During the time the Amarrians occupied the Minmatar home worlds one of the Minmatar tribes, the Nefantars, collaborated heavily with the Amarrians. The Nefantars fled Minmatar space during the Minmatar Rebellion and the Amarr Emperor set them up in Amarr controlled areas close to Minmatar space. Soon everyone had started calling them Ammatars. Today, the Ammatars enjoy a semi-autonomy in their own space and are still embroiled in war with their former Minmatar brethren.\",2,30000001,1000123,4.0,34,30,None,10172\n500008,Khanid Kingdom,\"The Khanid Kingdom, also known as the Dark Amarr, was founded a few centuries ago when the last Amarr Emperor was chosen. Khanid was one of the royal heirs at the time and, in accordance with tradition, should have killed himself after failing to become emperor. This Khanid refused to do and split his vast domains from the Amarr Empire. The empire retaliated, but only managed to conquer some of the vulnerable outer regions from Khanid. The Kingdom still upholds many of the traditions of Amarr society, but has also wholeheartedly embraced the customs of others, mainly the Caldari. Many visitors to the Kingdom feel like it is a surreal mix of the Amarr and Caldari empires. \",4,30003863,1000156,4.0,32,23,None,10173\n500009,The Syndicate,\"Formed by Intaki exiles from the Gallente Federation during the Caldari-Gallente War. The Syndicate has slowly grown in stature and influence and now serves as an important link between the empires and the illegal elements in the outer regions. Syndicate space is a pirate haven, but still retains enough civility to allow pretty much anyone to travel there to do business. The Syndicate markets are always chockfull of contraband goods and illegal wares that are hard or impossible to come by elsewhere. Each Syndicate station is an autonomous entity, but they cooperate on security and information issues. The unofficial leader of the Syndicate is Silphy en Diabel, a former Sister of EVE that returned to Syndicate space to save her family's fortune. Since then she's turned out to be just as resourceful and ruthless as her late father.\",8,30003271,1000146,4.0,66,46,None,1437\n500010,Guristas Pirates,\"Formed by two former members of the Caldari Navy, the pair go by the names Fatal and the Rabbit, the Guristas are a constant thorn in the side of the Caldari State. The Guristas are traditional pirates in the sense that their operation is not based around some creed or ideology, but rather a plain and simple greed. The Guristas have bases close to Caldari space and from them they embark on daring raids, often into the State itself. Though the Guristas are considered more honorable than many of their counterparts, they are still extremely dangerous and not to be tampered with.\",9,30001290,1000127,4.0,9,7,None,1630\n500011,Angel Cartel,\"Operating from the heart of the Curse region, the Angel Cartel is today the largest and best organized of the space-based criminal factions. The Angels are divided into several groups, each with a very special function. It is commanded by the Dominations and in the century they've been lurking in deep space they have stolen, plundered or sabotaged countless number of ships and kidnapped, molested or murdered thousands of people. The Angels recruit members from all the races, and are thus not bound to any one zone of operation, which spans almost the entire known world. Many believe that the Angels got their power by uncovering Jovian technologies hidden in their ancient homes, now infested by the Angel Cartel.  \",15,30001045,1000138,4.0,64,38,None,10174\n500012,Blood Raider Covenant,\"The Amarr Empire has had its share of religious cults and fanatics in the past, but few have been as successful, or been feared as much, as the Blood Raiders. The Blood Raiders are a sect of an ancient cult called Sani Sabik, which uses blood in their rituals. The Blood Raiders believe that cloned bodies have 'purer' blood than other bodies and this explains why they operate mainly in space, attacking unwary space farers and draining their bodies of blood. The Blood Raiders are led by the fearsome Omir Sarikusa, who has remained on top of the DED most wanted list for many years now. Under his leadership the Blood Raiders have become more organized and they have established several bases in the Bleak Lands region.\",4,30003088,1000134,3.0,2,2,None,1441\n500013,The InterBus,\"The InterBus is one of the more successful joint ventures the empires have undertaken. It was formed some 30 years ago to act as a neutral passenger transportation company that would span the entire known world. Since then it has evolved a bit, especially when it started to ferry goods too. The InterBus is used by the SCC to ferry goods between stations, as they are reliable and operate in every station in the world. As InterBus has to operate not only in empire stations, but also in pirate havens and other stations associated with organized crime, the company has to uphold a very strict policy regarding neutrality and secrecy. Even if the company is owned by the empires, no information regarding to shipments or station locations is ever given out. The strict adherence to these rules has allowed InterBus to operate without harassment in every corner of the world of EVE, making them one of the pillars of the inter-stellar community.\",15,30005203,1000148,3.0,0,0,None,96\n500014,ORE,\"Outer Ring Excavations, or ORE, is the largest independent mining corporation around. ORE was originally a fledgling Gallentean company, but struck gold when they found extremely rich Nocxium asteroid belts in the Outer Ring region. When the Gallente Federation tried to force ORE to reveal the location of the asteroid fields the company left Gallentean space and set up base in the Outer Ring region. They used their massive wealth to buy protection for their bases and keep their operation secret. Several pirate factions have tried to muscle in on the ORE territories, but with little success.\",8,30004504,1000129,3.0,4,2,None,1720\n500015,Thukker Tribe,\"The Thukker tribe is one of the seven original Minmatar tribes. After the Minmatar Rebellion the Thukkers left Minmatar space and took up the nomadic lifestyles of their ancestors, only this time in space. The closest thing they've got to home is the Great Wildlands region, where they are very numerous, but the Thukkers like to be on the move, constantly going from one solar system to another in their huge caravans, trading and scavenging. Respectable citizens of EVE frown upon the Thukkers, considering them to be nothing but scoundrels and thieves. Indeed, the Thukkers often operate on the shadier side of the law, but their resourcefulness and diligence count a lot more for their success than their criminal activities.\",2,30000905,1000163,3.0,60,53,None,10175\n500016,Servant Sisters of EVE,\"The Sisters of EVE are mainly known for their humanitarian aid efforts to those suffering because of war, famine or even just being lost in space. But the Sisters of EVE base their existence on strong religious beliefs, which they have coupled with scientific facts. They believe that the EVE gate is a gateway to heaven - that god resides on the other side of the gate. As well as dedicating themselves to aiding those in need they are also busy with scientific experiments around the EVE gate, hoping to gain a better understanding of the forces at work there.\",15,30001978,1000130,3.0,48,38,None,1004\n500017,The Society of Conscious Thought,\"The Society of Conscious Thought is three centuries old and was founded by a Jovian named Ior Labron, who was in search of spiritual enlightenment. The Society has since then taken many guises and been anything from a religious sect full of hermits to a political institute playing the power game. Today, the Society is mainly known for their scholastic achievements, their schools are widely regarded as the best ones in the world of EVE and rich and influential parents everywhere fight to get their kids admitted. Offering large sums of money is, however, no guarantee for admittance, as the Society has its own peculiar selection process that seems to have little rhyme or reason to outsiders. The Society operates in remote areas, where they build strongholds called kitz. Not all kitz are schools, some are still devoted to spiritual enlightenment or scientific pursuits. \",16,30002423,1000131,3.0,2,1,None,10176\n500018,Mordu's Legion Command,\"The origin of Mordu's Legion lies in the Gallente-Caldari War when a group of Intaki military personnel sided with the Caldari. The Intakis were put into a separate unit with a Caldari officer named Mordu. After the war the Intakis settled in Caldari space, but unwillingly became entangled with Caldari locals in the Waschi Uprising. Mordu's Legion was formed at that time as a mercenary fighting force and after the uprising it continued its existence. The Legion is loosely associated with the Caldari Navy, but is for the most part totally independent. Mordu's Legion is commonly hired by companies to protect valuable assets outside empire space, for instance Outer Ring Excavations pays them handsomely to patrol the Outer Ring region.\",9,30002005,1000128,3.0,1,1,None,1722\n500019,Sansha's Nation,\"Sansha's Nation was founded more than a century ago, shortly after all the empires had come into contact, just when space exploration and colonization was taking off. Sansha was a Caldari tycoon that carved out a sizeable piece of space for himself. There, he set out to create an utopian state. His vision and charm attracted thousands of people and for some time the Nation flourished. But Sansha became ever more warped as his success increased. He started experiments, combining capsule technology with the human mind, creating zombie-like creatures that had the cold, calculating mind of a computer, but the ingenuity of humans. When this became public knowledge Sansha was condemned and the other empires joined forces to bring him down. His forces were decimated and scattered to the winds. Remnants still remain far in the outer regions, but the once glorious Nation has been reduced to pirates and pillagers.\",15,30001868,1000162,4.0,75,49,None,10177\n500020,Serpentis,\"The Serpentis Corporation was founded a few decades ago by V.Salvador Sarpati. At first it was engaged in hi-tech research, but with time its ties with the underworld grew and the Serpentis research stations, scattered around in remote areas, became infamous pirate havens. Sarpati made a deal with the Angel Cartel early on to provide protection for his stations and the duty was taken on by the Guardian Angels. Both sides have prospered enormously for this deal - Serpentis can operate in peace and the Angel Cartel gets access to the illegal research efforts of the Serpentis. It is strongly believed that Serpentis is the main developer and manufacturer of illegal neural boosters, especially since Sarpati's father was a renown specialist in that field. The home of Serpentis is in the Phoenix constellation in the Fountain region.\",1,30004623,1000135,4.0,25,16,None,10178\n500024,Drifters,\"Emerging from the ruins of the Sleeper civilization spread throughout Anoikis – otherwise known as 'W-space' – the Drifters represent a tremendous challenge and perhaps a dire threat to the empires and capsuleers alike. Seemingly the inheritors of a legacy left behind by some of the most ancient Jove, the Drifters are unafraid to wield tremendous power in response to any who get in their way. In this regard, the Drifters are a very different conundrum than the relatively benign presence that was the Jove Empire.\",16,30001642,1000274,0.0,0,0,0,21404\n"
  },
  {
    "path": "src/EVEMon.Common/Scheduling/Enumerations.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.Scheduling\n{\n    /// <summary>\n    /// Describes the frequency at which a schedule entry occurs.\n    /// </summary>\n    public enum RecurringFrequency\n    {\n        Daily,\n        Weekdays,\n        Weekends,\n        Weekly,\n        Monthly\n    }\n\n    /// <summary>\n    /// Describes the options of a schedule entry.\n    /// </summary>\n    [Flags]\n    public enum ScheduleEntryOptions\n    {\n        None = 0,\n\n        /// <summary>\n        /// Blocks skills training starting\n        /// </summary>\n        Blocking = 1,\n\n        /// <summary>\n        /// No tooltip notifications.\n        /// </summary>\n        Quiet = 2,\n\n        /// <summary>\n        /// Uses EVETime\n        /// </summary>\n        EVETime = 4\n    }\n\n    /// <summary>\n    /// Describes the behaviour when a month is overflowed.\n    /// </summary>\n    public enum MonthlyOverflowResolution\n    {\n        /// <summary>\n        /// April 31 becomes April 30\n        /// </summary>\n        ClipBack,\n\n        /// <summary>\n        /// April 31 is ignored\n        /// </summary>\n        Drop,\n\n        /// <summary>\n        /// April 31 becomes May 1\n        /// </summary>\n        OverlapForward\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Scheduling/RecurringScheduleEntry.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Scheduling\n{\n    /// <summary>\n    /// Represents a recurring schedule entry\n    /// </summary>\n    public sealed class RecurringScheduleEntry : ScheduleEntry\n    {\n        public const int SecondsPerDay = 60 * 60 * 24;\n\n        /// <summary>\n        /// Default constructor\n        /// </summary>\n        public RecurringScheduleEntry()\n        {\n            OverflowResolution = MonthlyOverflowResolution.ClipBack;\n            DayOfMonth = 1;\n            DayOfWeek = DayOfWeek.Monday;\n            WeeksPeriod = 1;\n            Frequency = RecurringFrequency.Daily;\n            EndDate = DateTime.MaxValue;\n        }\n\n        /// <summary>\n        /// Deserialization constructor\n        /// </summary>\n        internal RecurringScheduleEntry(SerializableRecurringScheduleEntry serial)\n        {\n            StartDate = serial.StartDate;\n            EndDate = serial.EndDate;\n            Title = serial.Title.Substring(0, TitleMaxLength);\n            Options = serial.Options;\n            DayOfMonth = serial.DayOfMonth;\n            DayOfWeek = serial.DayOfWeek;\n            StartTimeInSeconds = serial.StartTimeInSeconds;\n            EndTimeInSeconds = serial.EndTimeInSeconds;\n            Frequency = serial.Frequency;\n            WeeksPeriod = serial.WeeksPeriod;\n            OverflowResolution = serial.OverflowResolution;\n        }\n\n        /// <summary>\n        /// Gets or sets the scheduling frequency (monthly, weekly, etc).\n        /// </summary>\n        public RecurringFrequency Frequency { get; set; }\n\n        /// <summary>\n        /// Gets or sets the weeks period (for weekly frequency). <c>1</c> for every week, <c>2</c> for every two weeks, etc...\n        /// </summary>\n        public int WeeksPeriod { get; set; }\n\n        /// <summary>\n        /// Gets or sets the day of week (for weekly frequency)\n        /// </summary>\n        public DayOfWeek DayOfWeek { get; set; }\n\n        /// <summary>\n        /// Gets or sets the day of month (for monthly frequency)\n        /// </summary>\n        public int DayOfMonth { get; set; }\n\n        /// <summary>\n        /// Gets or sets how overflow are dealt with (for monthly frequency).\n        /// </summary>\n        public MonthlyOverflowResolution OverflowResolution { get; set; }\n\n        /// <summary>\n        /// Gets or sets the start time, in seconds, of an occurence of this entry\n        /// </summary>\n        public int StartTimeInSeconds { get; set; }\n\n        /// <summary>\n        /// Gets or sets the end time, in seconds, of an occurence of this entry\n        /// </summary>\n        public int EndTimeInSeconds { get; set; }\n\n        /// <summary>\n        /// Checks whether the given time is contained within this entry\n        /// </summary>\n        /// <param name=\"checkDateTime\"></param>\n        /// <returns></returns>\n        public override bool Contains(DateTime checkDateTime)\n        {\n            IEnumerable<ScheduleDateTimeRange> ranges = GetRangesInPeriod(checkDateTime, checkDateTime);\n            return ranges.Any(sdtr => checkDateTime >= sdtr.From && checkDateTime < sdtr.To);\n        }\n\n        /// <summary>\n        /// Gets an enumeration of the occurences ranges of this entry within the given interval.\n        /// </summary>\n        /// <param name=\"fromDt\"></param>\n        /// <param name=\"toDt\"></param>\n        /// <returns></returns>\n        public override IEnumerable<ScheduleDateTimeRange> GetRangesInPeriod(DateTime fromDt, DateTime toDt)\n        {\n            DateTime startDt = fromDt.Date;\n            DateTime endDt = toDt.Date + TimeSpan.FromDays(1);\n\n            if (EndTimeInSeconds > SecondsPerDay)\n                startDt -= TimeSpan.FromDays(1);\n\n            DateTime wrkDt = startDt;\n            for (; wrkDt < endDt; wrkDt += TimeSpan.FromDays(1))\n            {\n                ScheduleDateTimeRange range = GetRangeForDay(wrkDt);\n                if (range != null)\n                    yield return range;\n            }\n        }\n\n        /// <summary>\n        /// Gets the occurence of this entry for the given day.\n        /// </summary>\n        /// <param name=\"day\"></param>\n        /// <returns>The found occurence, or null when this entry does not occur on that day</returns>\n        private ScheduleDateTimeRange GetRangeForDay(DateTime day)\n        {\n            switch (Frequency)\n            {\n                default:\n                    throw new NotImplementedException();\n\n                case RecurringFrequency.Daily:\n                    break;\n\n                case RecurringFrequency.Weekdays:\n                    if (day.DayOfWeek < DayOfWeek.Monday || day.DayOfWeek > DayOfWeek.Friday)\n                        return null;\n                    break;\n\n                case RecurringFrequency.Weekends:\n                    if (day.DayOfWeek != DayOfWeek.Saturday && day.DayOfWeek != DayOfWeek.Sunday)\n                        return null;\n                    break;\n\n                case RecurringFrequency.Weekly:\n                    DateTime firstInstance = StartDate.AddDays((DayOfWeek - StartDate.DayOfWeek + 7) % 7);\n                    if (day.DayOfWeek != DayOfWeek || day.Subtract(firstInstance).Days % (7 * WeeksPeriod) != 0)\n                        return null;\n                    break;\n\n                case RecurringFrequency.Monthly:\n                    if (day.Day != DayOfMonth)\n                    {\n                        if (day.Day <= 3 && DayOfMonth >= 29)\n                        {\n                            if (!IsOverflowDate(day))\n                                return null;\n                        }\n                        else if (day.Day >= 28 && DayOfMonth >= 29)\n                        {\n                            if (!IsOverflowDate(day))\n                                return null;\n                        }\n                        else\n                            return null;\n                    }\n                    break;\n            }\n\n            return new ScheduleDateTimeRange(day.Add(TimeSpan.FromSeconds(StartTimeInSeconds)),\n                day.Add(TimeSpan.FromSeconds(EndTimeInSeconds)));\n        }\n\n        /// <summary>\n        /// Checks whether the given day matches the specified day of month according to the overflow options\n        /// </summary>\n        /// <param name=\"day\"></param>\n        /// <returns></returns>\n        private bool IsOverflowDate(DateTime day)\n        {\n            switch (OverflowResolution)\n            {\n                default:\n                    throw new NotImplementedException();\n\n                case MonthlyOverflowResolution.Drop:\n                    return false;\n\n                case MonthlyOverflowResolution.OverlapForward:\n                    DateTime lastDayOfPreviousMonthDt = day - TimeSpan.FromDays(day.Day);\n                    int lastDayOfPreviousMonth = lastDayOfPreviousMonthDt.Day;\n                    int dayOfThisMonth = day.Day;\n                    return DayOfMonth - lastDayOfPreviousMonth == dayOfThisMonth;\n\n                case MonthlyOverflowResolution.ClipBack:\n                    DateTime searchForward = day + TimeSpan.FromDays(1);\n                    if (day.Month == searchForward.Month)\n                        return false;\n                    return DayOfMonth > day.Day;\n            }\n        }\n\n        /// <summary>\n        /// Checks whether the given time intersects with this entry.\n        /// </summary>\n        /// <param name=\"timeToTest\"></param>\n        /// <returns></returns>\n        protected override bool Clash(DateTime timeToTest)\n        {\n            DateTime testTime = (Options & ScheduleEntryOptions.EVETime) != 0 ? timeToTest.ToUniversalTime() : timeToTest;\n\n            ScheduleDateTimeRange range = GetRangeForDay(testTime.Date);\n            if (range == null)\n                return false;\n\n            DateTime startDate = StartDate.Add(range.From.TimeOfDay);\n\n            // in the event m_endDate is set to Forever (DateTime.MaxValue) we can't add anything to it\n            DateTime endDate = EndDate == DateTime.MaxValue ? EndDate : EndDate.Add(range.From.TimeOfDay);\n\n            if (startDate < testTime && testTime < endDate)\n                return range.From < testTime && testTime < range.To;\n\n            return false;\n        }\n\n        /// <summary>\n        /// Checks whether this entry occurs on the given day.\n        /// </summary>\n        /// <param name=\"timeToTest\"></param>\n        /// <returns></returns>\n        public override bool IsToday(DateTime timeToTest)\n        {\n            if (timeToTest >= StartDate && timeToTest <= EndDate)\n                return GetRangeForDay(timeToTest.Date) != null;\n\n            return false;\n        }\n\n        /// <summary>\n        /// Exports the data to a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        internal override SerializableScheduleEntry Export()\n            => new SerializableRecurringScheduleEntry\n            {\n                StartDate = StartDate,\n                EndDate = EndDate,\n                Title = Title,\n                Options = Options,\n                DayOfMonth = DayOfMonth,\n                DayOfWeek = DayOfWeek,\n                StartTimeInSeconds = StartTimeInSeconds,\n                EndTimeInSeconds = EndTimeInSeconds,\n                Frequency = Frequency,\n                WeeksPeriod = WeeksPeriod,\n                OverflowResolution = OverflowResolution\n            };\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Scheduling/ScheduleDateTimeRange.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.Scheduling\n{\n    public class ScheduleDateTimeRange\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ScheduleDateTimeRange\"/> class.\n        /// </summary>\n        /// <param name=\"start\">The start.</param>\n        /// <param name=\"end\">The end.</param>\n        public ScheduleDateTimeRange(DateTime start, DateTime end)\n        {\n            From = start;\n            To = end;\n        }\n\n        /// <summary>\n        /// Gets or sets from.\n        /// </summary>\n        /// <value>From.</value>\n        public DateTime From { get; private set; }\n\n        /// <summary>\n        /// Gets or sets to.\n        /// </summary>\n        /// <value>To.</value>\n        public DateTime To { get; private set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Scheduling/ScheduleEntry.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Scheduling\n{\n    /// <summary>\n    /// Represents a schedule entry.\n    /// </summary>\n    public abstract class ScheduleEntry\n    {\n        public const int TitleMaxLength = 56;\n\n        protected ScheduleEntry()\n        {\n            Title = string.Empty;\n            Options = ScheduleEntryOptions.None;\n            EndDate = DateTime.MinValue;\n            StartDate = DateTime.MinValue;\n        }\n\n        /// <summary>\n        /// Gets or sets the start date for the validity of this schedule entry\n        /// </summary>\n        public DateTime StartDate { get; set; }\n\n        /// <summary>\n        /// Gets or sets the end date for the validity of this schedule entry\n        /// </summary>\n        public DateTime EndDate { get; set; }\n\n        /// <summary>\n        /// Gets or sets this entry's options\n        /// </summary>\n        public ScheduleEntryOptions Options { get; set; }\n\n        /// <summary>\n        /// Gets or sets this entry's title\n        /// </summary>\n        public string Title { get; set; }\n\n        /// <summary>\n        /// Gets true if it is expired.\n        /// </summary>\n        public bool Expired => DateTime.UtcNow > EndDate.ToUniversalTime();\n\n        /// <summary>\n        /// Checks whether this entry forces EVEMon to run in silent mode (no tray tooltips nor sounds).\n        /// </summary>\n        /// <param name=\"timeToTest\"></param>\n        /// <returns></returns>\n        public bool Silent(DateTime timeToTest) => (Options & ScheduleEntryOptions.Quiet) != 0 && Clash(timeToTest);\n\n        /// <summary>\n        /// Checks whether this entry intersects with a blocking option with the given time while its options.\n        /// </summary>\n        /// <param name=\"timeToTest\"></param>\n        /// <returns></returns>\n        public bool Blocking(DateTime timeToTest) => (Options & ScheduleEntryOptions.Blocking) != 0 && Clash(timeToTest);\n\n        /// <summary>\n        /// Checks whether the given time is contained within this entry\n        /// </summary>\n        /// <param name=\"checkDateTime\"></param>\n        /// <returns></returns>\n        public abstract bool Contains(DateTime checkDateTime);\n\n        /// <summary>\n        /// Gets an enumeration of ranges for this entry within the given interval.\n        /// </summary>\n        /// <param name=\"fromDt\"></param>\n        /// <param name=\"toDt\"></param>\n        /// <returns></returns>\n        public abstract IEnumerable<ScheduleDateTimeRange> GetRangesInPeriod(DateTime fromDt, DateTime toDt);\n\n        /// <summary>\n        /// Checks whether the given time intersects with this entry.\n        /// </summary>\n        /// <param name=\"timeToTest\"></param>\n        /// <returns></returns>\n        protected abstract bool Clash(DateTime timeToTest);\n\n        /// <summary>\n        /// Checks whether this entry occurs on the given day.\n        /// </summary>\n        /// <param name=\"timeToTest\"></param>\n        /// <returns></returns>\n        public abstract bool IsToday(DateTime timeToTest);\n\n        /// <summary>\n        /// Exports the data to a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        internal abstract SerializableScheduleEntry Export();\n\n        /// <summary>\n        /// Gets the entry's title.\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString() => Title;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Scheduling/ScheduleEntryTitleComparer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace EVEMon.Common.Scheduling\n{\n    public class ScheduleEntryTitleComparer : Comparer<ScheduleEntry>\n    {\n        public override int Compare(ScheduleEntry e1, ScheduleEntry e2)\n        {\n            if (e1 != null && e2 != null)\n                return string.Compare(e1.Title, e2.Title, StringComparison.CurrentCulture);\n\n            return 0;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Scheduling/Scheduler.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Scheduling\n{\n    /// <summary>\n    /// Holds the scheduling entries\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public static class Scheduler\n    {\n        private static readonly List<ScheduleEntry> s_schedule = new List<ScheduleEntry>();\n\n        /// <summary>\n        /// Gets the scheduled entries\n        /// </summary>\n        public static IEnumerable<ScheduleEntry> Entries => s_schedule.Where(entry => !entry.Expired);\n\n        /// <summary>\n        /// Checks whether EVEMon is currently running in silent mode (no tooltips nor sounds).\n        /// </summary>\n        /// <returns></returns>\n        public static bool SilentMode => s_schedule.Any(x => x.Silent(DateTime.Now));\n\n        /// <summary>\n        /// Add the given entry\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        public static void Add(ScheduleEntry entry)\n        {\n            s_schedule.Add(entry);\n\n            // Notify to subscribers\n            EveMonClient.OnSchedulerChanged();\n        }\n\n        /// <summary>\n        /// Add the given entry\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        public static void Remove(ScheduleEntry entry)\n        {\n            s_schedule.Remove(entry);\n\n            // Notify to subscribers\n            EveMonClient.OnSchedulerChanged();\n        }\n\n        /// <summary>\n        /// Checks whether a certain datetime will fall on a time where the user won't be able to log in.\n        /// </summary>\n        /// <remarks>Checks both scheduling entries and downtimes.</remarks>\n        /// <param name=\"time\"></param>\n        /// <param name=\"blockingEntry\"></param>\n        /// <param name=\"isAutoBlocking\"></param>\n        /// <returns></returns>\n        public static bool SkillIsBlockedAt(DateTime time, out string blockingEntry, out bool isAutoBlocking)\n        {\n            blockingEntry = string.Empty;\n            isAutoBlocking = false;\n\n            // Checks schedule entries to see if they overlap the input time\n            foreach (ScheduleEntry entry in s_schedule.Where(entry => entry.Blocking(time)))\n            {\n                blockingEntry = entry.Title;\n                return true;\n            }\n\n            // Checks whether it will be on downtime\n            if (time.ToUniversalTime().Hour != EveConstants.DowntimeHour ||\n                time.ToUniversalTime().Minute >= EveConstants.DowntimeDuration)\n            {\n                return false;\n            }\n\n            blockingEntry = EveMonConstants.DowntimeText;\n            isAutoBlocking = true;\n            return true;\n        }\n\n        /// <summary>\n        /// Imports data from the given serialization object.\n        /// </summary>\n        /// <param name=\"serial\"></param>\n        internal static void Import(SchedulerSettings serial)\n        {\n            s_schedule.Clear();\n            foreach (SerializableScheduleEntry serialEntry in serial.Entries)\n            {\n                SerializableRecurringScheduleEntry serialReccuringEntry= serialEntry as SerializableRecurringScheduleEntry;\n                if (serialReccuringEntry != null)\n                    s_schedule.Add(new RecurringScheduleEntry(serialReccuringEntry));\n                else\n                    s_schedule.Add(new SimpleScheduleEntry(serialEntry));\n            }\n\n            // Notify to subscribers\n            EveMonClient.OnSchedulerChanged();\n        }\n\n        /// <summary>\n        /// Exports data to a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        internal static SchedulerSettings Export()\n        {\n            SchedulerSettings serial = new SchedulerSettings();\n            foreach (ScheduleEntry entry in s_schedule.Where(entry => !entry.Expired))\n            {\n                serial.Entries.Add(entry.Export());\n            }\n            return serial;\n        }\n\n        /// <summary>\n        /// Clears all the expired entries.\n        /// </summary>\n        public static void ClearExpired()\n        {\n            // Removed the expired entries\n            int i = 0;\n            while (i < s_schedule.Count)\n            {\n                ScheduleEntry entry = s_schedule[i];\n                if (entry.Expired)\n                    s_schedule.RemoveAt(i);\n                else\n                    i++;\n            }\n\n            // Notify to subscribers\n            EveMonClient.OnSchedulerChanged();\n        }\n\n        /// <summary>\n        /// Tries the parse time.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"seconds\">The seconds.</param>\n        /// <returns></returns>\n        public static bool TryParseTime(string text, out int seconds)\n        {\n            try\n            {\n                DateTimeFormatInfo dtfi = CultureConstants.DefaultCulture.DateTimeFormat;\n                DateTime res = DateTime.ParseExact(text, dtfi.ShortTimePattern, dtfi);\n                seconds = Convert.ToInt32(Math.Round(res.Subtract(DateTime.Today).TotalSeconds));\n                return true;\n            }\n            catch (FormatException)\n            {\n                seconds = 0;\n                return false;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Scheduling/SimpleScheduleEntry.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Scheduling\n{\n    /// <summary>\n    /// Represents a schedule entry which occurs once only.\n    /// </summary>\n    public class SimpleScheduleEntry : ScheduleEntry\n    {\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public SimpleScheduleEntry()\n        {\n        }\n\n        /// <summary>\n        /// Deserialization constructor\n        /// </summary>\n        /// <param name=\"serial\"></param>\n        internal SimpleScheduleEntry(SerializableScheduleEntry serial)\n        {\n            StartDate = serial.StartDate;\n            EndDate = serial.EndDate;\n            Title = serial.Title.Substring(0, TitleMaxLength);\n            Options = serial.Options;\n        }\n\n        /// <summary>\n        /// Checks whether the given time is contained within this entry\n        /// </summary>\n        /// <param name=\"checkDateTime\"></param>\n        /// <returns></returns>\n        public override bool Contains(DateTime checkDateTime) => checkDateTime >= StartDate && checkDateTime < EndDate;\n\n        /// <summary>\n        /// Gets an enumeration of ranges for this entry within the given interval. It will return at most one range.\n        /// </summary>\n        /// <param name=\"fromDt\"></param>\n        /// <param name=\"toDt\"></param>\n        /// <returns></returns>\n        public override IEnumerable<ScheduleDateTimeRange> GetRangesInPeriod(DateTime fromDt, DateTime toDt)\n        {\n            if ((StartDate < fromDt && EndDate > fromDt) || (StartDate >= fromDt && StartDate <= toDt))\n                yield return new ScheduleDateTimeRange(StartDate, EndDate);\n        }\n\n        /// <summary>\n        /// Checks whether the given time intersects with this entry.\n        /// </summary>\n        /// <param name=\"timeToTest\"></param>\n        /// <returns></returns>\n        protected override bool Clash(DateTime timeToTest)\n        {\n            DateTime testTime = (Options & ScheduleEntryOptions.EVETime) != 0 ? timeToTest.ToUniversalTime() : timeToTest;\n            return StartDate <= testTime && testTime <= EndDate;\n        }\n\n        /// <summary>\n        /// Checks whether this entry occurs on the given day.\n        /// </summary>\n        /// <param name=\"timeToTest\"></param>\n        /// <returns></returns>\n        public override bool IsToday(DateTime timeToTest) => StartDate.DayOfYear <= timeToTest.DayOfYear && EndDate.DayOfYear >= timeToTest.DayOfYear &&\n       StartDate.Year <= timeToTest.Year && EndDate.Year >= timeToTest.Year;\n\n        /// <summary>\n        /// Exports the data to a serialization object.\n        /// </summary>\n        /// <returns></returns>\n        internal override SerializableScheduleEntry Export() => new SerializableScheduleEntry\n        {\n            StartDate = StartDate,\n            EndDate = EndDate,\n            Title = Title,\n            Options = Options\n        };\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/BlueprintsDatafile.cs",
    "content": "using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents our blueprints datafile.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    [XmlRoot(\"blueprintsDatafile\")]\n    public sealed class BlueprintsDatafile\n    {\n        private readonly Collection<SerializableBlueprintMarketGroup> m_marketGroups;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BlueprintsDatafile\"/> class.\n        /// </summary>\n        public BlueprintsDatafile()\n        {\n            m_marketGroups = new Collection<SerializableBlueprintMarketGroup>();\n        }\n\n        /// <summary>\n        /// Gets the market groups.\n        /// </summary>\n        /// <value>The market groups.</value>\n        [XmlElement(\"group\")]\n        public Collection<SerializableBlueprintMarketGroup> MarketGroups => m_marketGroups;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/CertificatesDatafile.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents our certificates datafile\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    [XmlRoot(\"certificatesDatafile\")]\n    public sealed class CertificatesDatafile\n    {\n        private readonly Collection<SerializableCertificateGroup> m_groups;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CertificatesDatafile\"/> class.\n        /// </summary>\n        public CertificatesDatafile()\n        {\n            m_groups = new Collection<SerializableCertificateGroup>();\n        }\n\n        /// <summary>\n        /// Gets the certificates groups.\n        /// </summary>\n        /// <value>The groups.</value>\n        [XmlElement(\"certificateGroup\")]\n        public Collection<SerializableCertificateGroup> Groups => m_groups;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/DatafileConstants.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Common.Serialization.Datafiles {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public class DatafileConstants {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal DatafileConstants() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Common.Serialization.Datafiles.DatafileConstants\", typeof(DatafileConstants).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to eve-blueprints-en-US.xml.gzip.\n        /// </summary>\n        public static string BlueprintsDatafile {\n            get {\n                return ResourceManager.GetString(\"BlueprintsDatafile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to eve-certificates-en-US.xml.gzip.\n        /// </summary>\n        public static string CertificatesDatafile {\n            get {\n                return ResourceManager.GetString(\"CertificatesDatafile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to eve-geography-en-US.xml.gzip.\n        /// </summary>\n        public static string GeographyDatafile {\n            get {\n                return ResourceManager.GetString(\"GeographyDatafile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to eve-items-en-US.xml.gzip.\n        /// </summary>\n        public static string ItemsDatafile {\n            get {\n                return ResourceManager.GetString(\"ItemsDatafile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to eve-masteries-en-US.xml.gzip.\n        /// </summary>\n        public static string MasteriesDatafile {\n            get {\n                return ResourceManager.GetString(\"MasteriesDatafile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to eve-properties-en-US.xml.gzip.\n        /// </summary>\n        public static string PropertiesDatafile {\n            get {\n                return ResourceManager.GetString(\"PropertiesDatafile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to eve-reprocessing-en-US.xml.gzip.\n        /// </summary>\n        public static string ReprocessingDatafile {\n            get {\n                return ResourceManager.GetString(\"ReprocessingDatafile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to eve-skills-en-US.xml.gzip.\n        /// </summary>\n        public static string SkillsDatafile {\n            get {\n                return ResourceManager.GetString(\"SkillsDatafile\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/DatafileConstants.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"BlueprintsDatafile\" xml:space=\"preserve\">\n    <value>eve-blueprints-en-US.xml.gzip</value>\n  </data>\n  <data name=\"CertificatesDatafile\" xml:space=\"preserve\">\n    <value>eve-certificates-en-US.xml.gzip</value>\n  </data>\n  <data name=\"GeographyDatafile\" xml:space=\"preserve\">\n    <value>eve-geography-en-US.xml.gzip</value>\n  </data>\n  <data name=\"ItemsDatafile\" xml:space=\"preserve\">\n    <value>eve-items-en-US.xml.gzip</value>\n  </data>\n  <data name=\"MasteriesDatafile\" xml:space=\"preserve\">\n    <value>eve-masteries-en-US.xml.gzip</value>\n  </data>\n  <data name=\"PropertiesDatafile\" xml:space=\"preserve\">\n    <value>eve-properties-en-US.xml.gzip</value>\n  </data>\n  <data name=\"ReprocessingDatafile\" xml:space=\"preserve\">\n    <value>eve-reprocessing-en-US.xml.gzip</value>\n  </data>\n  <data name=\"SkillsDatafile\" xml:space=\"preserve\">\n    <value>eve-skills-en-US.xml.gzip</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/GeoDatafile.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents our EVE geography datafile.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    [XmlRoot(\"geographyDatafile\")]\n    public sealed class GeoDatafile\n    {\n        private readonly Collection<SerializableRegion> m_regions;\n        private readonly Collection<SerializableJump> m_jumps;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"GeoDatafile\"/> class.\n        /// </summary>\n        public GeoDatafile()\n        {\n            m_regions = new Collection<SerializableRegion>();\n            m_jumps = new Collection<SerializableJump>();\n        }\n\n        /// <summary>\n        /// Gets the regions.\n        /// </summary>\n        /// <value>The regions.</value>\n        [XmlArray(\"regions\")]\n        [XmlArrayItem(\"region\")]\n        public Collection<SerializableRegion> Regions => m_regions;\n\n        /// <summary>\n        /// Gets the jumps.\n        /// </summary>\n        /// <value>The jumps.</value>\n        [XmlArray(\"jumps\")]\n        [XmlArrayItem(\"jump\")]\n        public Collection<SerializableJump> Jumps => m_jumps;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/ItemsDatafile.cs",
    "content": "using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents our items datafile.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    [XmlRoot(\"itemsDatafile\")]\n    public sealed class ItemsDatafile\n    {\n        private readonly Collection<SerializableMarketGroup> m_marketGroups;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ItemsDatafile\"/> class.\n        /// </summary>\n        public ItemsDatafile()\n        {\n            m_marketGroups = new Collection<SerializableMarketGroup>();\n        }\n\n        /// <summary>\n        /// Gets the market groups.\n        /// </summary>\n        /// <value>The market groups.</value>\n        [XmlElement(\"marketGroup\")]\n        public Collection<SerializableMarketGroup> MarketGroups => m_marketGroups;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/MasteriesDatafile.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents our masteries datafile\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    [XmlRoot(\"masteriesDatafile\")]\n    public sealed class MasteriesDatafile\n    {\n        private readonly Collection<SerializableMasteryShip> m_masteryShips;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MasteriesDatafile\"/> class.\n        /// </summary>\n        public MasteriesDatafile()\n        {\n            m_masteryShips = new Collection<SerializableMasteryShip>();\n        }\n\n        /// <summary>\n        /// Gets the masteries groups.\n        /// </summary>\n        /// <value>The groups.</value>\n        [XmlElement(\"ship\")]\n        public Collection<SerializableMasteryShip> MasteryShips => m_masteryShips;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/PropertiesDatafile.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents our properties datafile.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    [XmlRoot(\"propertiesDatafile\")]\n    public sealed class PropertiesDatafile\n    {\n        private readonly Collection<SerializablePropertyCategory> m_categories;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PropertiesDatafile\"/> class.\n        /// </summary>\n        public PropertiesDatafile()\n        {\n            m_categories = new Collection<SerializablePropertyCategory>();\n        }\n\n        /// <summary>\n        /// Gets the categories.\n        /// </summary>\n        /// <value>The categories.</value>\n        [XmlElement(\"category\")]\n        public Collection<SerializablePropertyCategory> Categories => m_categories;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/ReprocessingDatafile.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents our reprocessing datafile.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    [XmlRoot(\"reprocessingDatafile\")]\n    public sealed class ReprocessingDatafile\n    {\n        private readonly Collection<SerializableItemMaterials> m_items;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ReprocessingDatafile\"/> class.\n        /// </summary>\n        public ReprocessingDatafile()\n        {\n            m_items = new Collection<SerializableItemMaterials>();\n        }\n\n        /// <summary>\n        /// Gets the items.\n        /// </summary>\n        /// <value>The items.</value>\n        [XmlElement(\"item\")]\n        public Collection<SerializableItemMaterials> Items => m_items;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableAgent.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents an eve agent.\n    /// </summary>\n    public sealed class SerializableAgent\n    {\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"agentID\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"agentName\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name of the division.\n        /// </summary>\n        /// <value>The name of the division.</value>\n        [XmlAttribute(\"divisionName\")]\n        public string DivisionName { get; set; }\n\n        /// <summary>\n        /// Gets or sets the level.\n        /// </summary>\n        /// <value>The level.</value>\n        [XmlAttribute(\"level\")]\n        public int Level { get; set; }\n\n        /// <summary>\n        /// Gets or sets the quality.\n        /// </summary>\n        /// <value>The quality.</value>\n        [XmlAttribute(\"quality\")]\n        public int Quality { get; set; }\n\n        /// <summary>\n        /// Gets or sets the type of the agent.\n        /// </summary>\n        /// <value>The type of the agent.</value>\n        [XmlAttribute(\"agentType\")]\n        public string AgentType { get; set; }\n\n        /// <summary>\n        /// Gets or sets the research skill ID.\n        /// </summary>\n        /// <value>The research skill ID.</value>\n        [XmlAttribute(\"researchSkillID\")]\n        public int ResearchSkillID { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the agent offers locator service.\n        /// </summary>\n        /// <value><c>true</c> if the agent offers locator service; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"locatorService\")]\n        public bool LocatorService { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableBlueprint.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a blueprint in our datafile\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableBlueprint\n    {\n        private readonly Collection<SerializablePrereqSkill> m_prereqSkills;\n        private readonly Collection<SerializableRequiredMaterial> m_requiredMaterials;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableBlueprint\"/> class.\n        /// </summary>\n        public SerializableBlueprint()\n        {\n            InventionTypeIDs = new ModifiedSerializableDictionary<int, decimal>();\n            m_prereqSkills = new Collection<SerializablePrereqSkill>();\n            m_requiredMaterials = new Collection<SerializableRequiredMaterial>();\n        }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the icon.\n        /// </summary>\n        /// <value>The icon.</value>\n        [XmlAttribute(\"icon\")]\n        public string Icon { get; set; }\n\n        /// <summary>\n        /// Gets or sets the meta group.\n        /// </summary>\n        /// <value>The meta group.</value>\n        [XmlAttribute(\"metaGroup\")]\n        public ItemMetaGroup MetaGroup { get; set; }\n\n        /// <summary>\n        /// Gets or sets the produce item ID.\n        /// </summary>\n        /// <value>The produce item ID.</value>\n        [XmlAttribute(\"productTypeID\")]\n        public int ProduceItemID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the production time.\n        /// </summary>\n        /// <value>The production time.</value>\n        [XmlAttribute(\"productionTime\")]\n        public int ProductionTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets the research productivity time.\n        /// </summary>\n        /// <value>The research productivity time.</value>\n        [XmlAttribute(\"researchProductivityTime\")]\n        public int ResearchProductivityTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets the research material time.\n        /// </summary>\n        /// <value>The research material time.</value>\n        [XmlAttribute(\"researchMaterialTime\")]\n        public int ResearchMaterialTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets the research copy time.\n        /// </summary>\n        /// <value>The research copy time.</value>\n        [XmlAttribute(\"researchCopyTime\")]\n        public int ResearchCopyTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets the reverse engineering time.\n        /// </summary>\n        /// <value>The reverse engineering time.</value>\n        [XmlAttribute(\"reverseEngineeringTime\")]\n        public int ReverseEngineeringTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets the invention time.\n        /// </summary>\n        /// <value>The invention time.</value>\n        [XmlAttribute(\"inventionTime\")]\n        public int InventionTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets the reaction time.\n        /// </summary>\n        /// <value>The reaction time.</value>\n        [XmlAttribute(\"reactionTime\")]\n        public int ReactionTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets the max production limit.\n        /// </summary>\n        /// <value>The max production limit.</value>\n        [XmlAttribute(\"maxProductionLimit\")]\n        public int MaxProductionLimit { get; set; }\n\n        /// <summary>\n        /// Gets or sets the invention type ID.\n        /// </summary>\n        /// <value>The invention type ID.</value>\n        [XmlElement(\"inventTypeIDs\")]\n        public ModifiedSerializableDictionary<int, decimal> InventionTypeIDs { get; set; }\n\n        /// <summary>\n        /// Gets or sets the reaction outcome.\n        /// </summary>\n        /// <value>The reaction outcome.</value>\n        [XmlElement(\"reactionOutcome\")]\n        public SerializableMaterialQuantity ReactionOutcome { get; set; }\n\n        /// <summary>\n        /// Gets the prereq skill.\n        /// </summary>\n        /// <value>The prereq skill.</value>\n        [XmlElement(\"s\")]\n        public Collection<SerializablePrereqSkill> PrereqSkill => m_prereqSkills;\n\n        /// <summary>\n        /// Gets the req material.\n        /// </summary>\n        /// <value>The req material.</value>\n        [XmlElement(\"m\")]\n        public Collection<SerializableRequiredMaterial> ReqMaterial => m_requiredMaterials;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableBlueprintMarketGroup.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a blueprint group in our datafile.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableBlueprintMarketGroup\n    {\n        private readonly Collection<SerializableBlueprint> m_blueprints;\n        private readonly Collection<SerializableBlueprintMarketGroup> m_subGroups;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableBlueprintMarketGroup\"/> class.\n        /// </summary>\n        public SerializableBlueprintMarketGroup()\n        {\n            m_blueprints = new Collection<SerializableBlueprint>();\n            m_subGroups = new Collection<SerializableBlueprintMarketGroup>();\n        }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets the blueprints.\n        /// </summary>\n        /// <value>The blueprints.</value>\n        [XmlElement(\"blueprint\")]\n        public Collection<SerializableBlueprint> Blueprints => m_blueprints;\n\n        /// <summary>\n        /// Gets the sub groups.\n        /// </summary>\n        /// <value>The sub groups.</value>\n        [XmlArray(\"subGroups\")]\n        [XmlArrayItem(\"subGroup\")]\n        public Collection<SerializableBlueprintMarketGroup> SubGroups => m_subGroups;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableCertificate.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a certificate from our datafiles\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableCertificate\n    {\n        private readonly Collection<SerializableCertificatePrerequisite> m_prerequisites;\n        private readonly Collection<SerializableCertificateRecommendation> m_recommendations;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableCertificate\"/> class.\n        /// </summary>\n        public SerializableCertificate()\n        {\n            m_prerequisites = new Collection<SerializableCertificatePrerequisite>();\n            m_recommendations = new Collection<SerializableCertificateRecommendation>();\n        }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the description.\n        /// </summary>\n        /// <value>The description.</value>\n        [XmlAttribute(\"description\")]\n        public string Description { get; set; }\n\n        /// <summary>\n        /// Gets the prerequisites.\n        /// </summary>\n        /// <value>The prerequisites.</value>\n        [XmlElement(\"requires\")]\n        public Collection<SerializableCertificatePrerequisite> Prerequisites => m_prerequisites;\n\n        /// <summary>\n        /// Gets the recommendations.\n        /// </summary>\n        /// <value>The recommendations.</value>\n        [XmlElement(\"recommendation\")]\n        public Collection<SerializableCertificateRecommendation> Recommendations => m_recommendations;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableCertificateClass.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a certificate class from our datafiles\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableCertificateClass\n    {\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the description.\n        /// </summary>\n        /// <value>The description.</value>\n        [XmlAttribute(\"description\")]\n        public string Description { get; set; }\n\n        /// <summary>\n        /// Gets the certificates.\n        /// </summary>\n        [XmlElement(\"certificate\")]\n        public SerializableCertificate Certificate { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableCertificateGroup.cs",
    "content": "﻿﻿using System.Collections.ObjectModel;\n﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a certificate group from our datafiles\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableCertificateGroup\n    {\n        private readonly Collection<SerializableCertificateClass> m_classes;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableCertificateGroup\"/> class.\n        /// </summary>\n        public SerializableCertificateGroup()\n        {\n            m_classes = new Collection<SerializableCertificateClass>();\n        }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the description.\n        /// </summary>\n        /// <value>The description.</value>\n        [XmlAttribute(\"description\")]\n        public string Description { get; set; }\n\n        /// <summary>\n        /// Gets the classes.\n        /// </summary>\n        /// <value>The classes.</value>\n        [XmlElement(\"certificateClass\")]\n        public Collection<SerializableCertificateClass> Classes => m_classes;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableCertificatePrerequisite.cs",
    "content": "﻿﻿using System.Xml.Serialization;\n﻿using EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a skill prerequisite for a certificate\n    /// </summary>\n    public sealed class SerializableCertificatePrerequisite\n    {\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the skill.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"skill\")]\n        public string Skill { get; set; }\n\n        /// <summary>\n        /// Gets or sets the level.\n        /// </summary>\n        /// <value>The level.</value>\n        [XmlAttribute(\"level\")]\n        public string Level { get; set; }\n\n        /// <summary>\n        /// Gets or sets the grade.\n        /// </summary>\n        /// <value>The grade.</value>\n        [XmlAttribute(\"grade\")]\n        public CertificateGrade Grade { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableCertificateRecommendation.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a recommendation for a ship\n    /// </summary>\n    public sealed class SerializableCertificateRecommendation\n    {\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the ship.\n        /// </summary>\n        /// <value>The ship.</value>\n        [XmlAttribute(\"name\")]\n        public string ShipName { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableConstellation.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a constellation in the EVE universe.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableConstellation\n    {\n        private readonly Collection<SerializableSolarSystem> m_systems;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableConstellation\"/> class.\n        /// </summary>\n        public SerializableConstellation()\n        {\n            m_systems = new Collection<SerializableSolarSystem>();\n        }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets the systems.\n        /// </summary>\n        /// <value>The systems.</value>\n        [XmlElement(\"systems\")]\n        public Collection<SerializableSolarSystem> Systems => m_systems;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableControlTowerFuel.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    public sealed class SerializableControlTowerFuel : SerializableMaterialQuantity\n    {\n        /// <summary>\n        /// Gets or sets the purpose.\n        /// </summary>\n        /// <value>\n        /// The purpose.\n        /// </value>\n        [XmlAttribute(\"purpose\")]\n        public string Purpose { get; set; }\n\n        /// <summary>\n        /// Gets or sets the min security level.\n        /// </summary>\n        /// <value>\n        /// The min security level.\n        /// </value>\n        [XmlAttribute(\"minSecurityLevel\")]\n        public string MinSecurityLevel { get; set; }\n\n        /// <summary>\n        /// Gets or sets the faction ID.\n        /// </summary>\n        /// <value>\n        /// The faction ID.\n        /// </value>\n        [XmlAttribute(\"factionID\")]\n        public string FactionID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the faction name.\n        /// </summary>\n        /// <value>\n        /// The faction name.\n        /// </value>\n        [XmlAttribute(\"factionName\")]\n        public string FactionName { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableItem.cs",
    "content": "﻿using System;\nusing System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Base serializable class for items, ships and implants.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableItem\n    {\n        private readonly Collection<SerializablePrerequisiteSkill> m_prerequisiteSkills;\n        private readonly Collection<SerializablePropertyValue> m_properties;\n        private readonly Collection<SerializableReactionInfo> m_reactions;\n        private readonly Collection<SerializableControlTowerFuel> m_controlTowerFuel;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableItem\"/> class.\n        /// </summary>\n        public SerializableItem()\n        {\n            m_prerequisiteSkills = new Collection<SerializablePrerequisiteSkill>();\n            m_properties = new Collection<SerializablePropertyValue>();\n            m_reactions = new Collection<SerializableReactionInfo>();\n            m_controlTowerFuel = new Collection<SerializableControlTowerFuel>();\n        }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>\n        /// The ID.\n        /// </value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>\n        /// The name.\n        /// </value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the description.\n        /// </summary>\n        /// <value>\n        /// The description.\n        /// </value>\n        [XmlAttribute(\"description\")]\n        public string Description { get; set; }\n\n        /// <summary>\n        /// Gets or sets the category.\n        /// </summary>\n        /// <value>\n        /// The category.\n        /// </value>\n        [XmlAttribute(\"category\")]\n        public string Category { get; set; }\n\n        /// <summary>\n        /// Gets or sets the group.\n        /// </summary>\n        /// <value>\n        /// The group.\n        /// </value>\n        [XmlAttribute(\"group\")]\n        public string Group { get; set; }\n\n        /// <summary>\n        /// Gets or sets the icon.\n        /// </summary>\n        /// <value>\n        /// The icon.\n        /// </value>\n        [XmlAttribute(\"icon\")]\n        public string Icon { get; set; }\n\n        /// <summary>\n        /// Gets or sets the race.\n        /// </summary>\n        /// <value>\n        /// The race.\n        /// </value>\n        [XmlAttribute(\"race\")]\n        public Race Race { get; set; }\n\n        /// <summary>\n        /// Gets or sets the meta level.\n        /// </summary>\n        /// <value>\n        /// The meta level.\n        /// </value>\n        [XmlAttribute(\"metaLevel\")]\n        public long MetaLevel { get; set; }\n\n        /// <summary>\n        /// Gets or sets the meta group.\n        /// </summary>\n        /// <value>\n        /// The meta group.\n        /// </value>\n        [XmlAttribute(\"metaGroup\")]\n        public ItemMetaGroup MetaGroup { get; set; }\n\n        /// <summary>\n        /// Gets or sets the slot.\n        /// </summary>\n        /// <value>\n        /// The slot.\n        /// </value>\n        [XmlAttribute(\"slot\")]\n        public ItemSlot Slot { get; set; }\n\n        /// <summary>\n        /// Gets or sets the family.\n        /// </summary>\n        /// <value>The family.</value>\n        [XmlAttribute(\"family\")]\n        public ItemFamily Family { get; set; }\n\n        /// <summary>\n        /// Gets or sets the size of the portion.\n        /// </summary>\n        /// <value>\n        /// The size of the portion.\n        /// </value>\n        [XmlAttribute(\"portionSize\")]\n        public int PortionSize { get; set; }\n\n        /// <summary>\n        /// Gets the prerequisite skills.\n        /// </summary>\n        [XmlElement(\"s\")]\n        public Collection<SerializablePrerequisiteSkill> PrerequisiteSkills => m_prerequisiteSkills;\n\n        /// <summary>\n        /// Gets the properties.\n        /// </summary>\n        [XmlElement(\"p\")]\n        public Collection<SerializablePropertyValue> Properties => m_properties;\n\n        /// <summary>\n        /// Gets the reaction info.\n        /// </summary>\n        [XmlElement(\"r\")]\n        public Collection<SerializableReactionInfo> ReactionInfo => m_reactions;\n\n        /// <summary>\n        /// Gets the control tower fuel info.\n        /// </summary>\n        [XmlElement(\"ctf\")]\n        public Collection<SerializableControlTowerFuel> ControlTowerFuelInfo => m_controlTowerFuel;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableItemMaterials.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableItemMaterials\n    {\n        private readonly Collection<SerializableMaterialQuantity> m_materials;\n\n        public SerializableItemMaterials()\n        {\n            m_materials = new Collection<SerializableMaterialQuantity>();\n        }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets the materials.\n        /// </summary>\n        /// <value>The materials.</value>\n        [XmlElement(\"material\")]\n        public Collection<SerializableMaterialQuantity> Materials => m_materials;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableJump.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a connection between two jump gates.\n    /// </summary>\n    public sealed class SerializableJump\n    {\n        /// <summary>\n        /// Gets or sets the first system ID.\n        /// </summary>\n        /// <value>The first system ID.</value>\n        [XmlAttribute(\"id1\")]\n        public int FirstSystemID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the second system ID.\n        /// </summary>\n        /// <value>The second system ID.</value>\n        [XmlAttribute(\"id2\")]\n        public int SecondSystemID { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableMarketGroup.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents an items category (standard item categories, not market groups) from our datafile.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableMarketGroup\n    {\n        private readonly Collection<SerializableItem> m_items;\n        private readonly Collection<SerializableMarketGroup> m_subGroups;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableMarketGroup\"/> class.\n        /// </summary>\n        public SerializableMarketGroup()\n        {\n            m_items = new Collection<SerializableItem>();\n            m_subGroups = new Collection<SerializableMarketGroup>();\n        }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets the items.\n        /// </summary>\n        /// <value>The items.</value>\n        [XmlArray(\"items\")]\n        [XmlArrayItem(\"item\")]\n        public Collection<SerializableItem> Items => m_items;\n\n        /// <summary>\n        /// Gets the sub groups.\n        /// </summary>\n        /// <value>The sub groups.</value>\n        [XmlArray(\"marketGroups\")]\n        [XmlArrayItem(\"marketGroup\")]\n        public Collection<SerializableMarketGroup> SubGroups => m_subGroups;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableMastery.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a mastery from our datafiles\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public class SerializableMastery\n    {\n        private readonly Collection<SerializableMasteryCertificate> m_certificates;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableMasteryShip\"/> class.\n        /// </summary>\n        public SerializableMastery()\n        {\n            m_certificates = new Collection<SerializableMasteryCertificate>();\n        }\n\n        /// <summary>\n        /// Gets or sets the grade.\n        /// </summary>\n        /// <value>\n        /// The grade.\n        /// </value>\n        [XmlAttribute(\"grade\")]\n        public int Grade { get; set; }\n\n        /// <summary>\n        /// Gets the certificates.\n        /// </summary>\n        /// <value>\n        /// The certificates.\n        /// </value>\n        [XmlElement(\"certificate\")]\n        public Collection<SerializableMasteryCertificate> Certificates => m_certificates;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableMasteryCertificate.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a mastery certificate from our datafiles\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public class SerializableMasteryCertificate\n    {\n        /// <summary>\n        /// Gets or sets the identifier.\n        /// </summary>\n        /// <value>\n        /// The identifier.\n        /// </value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name of the class.\n        /// </summary>\n        /// <value>\n        /// The name of the class.\n        /// </value>\n        [XmlAttribute(\"className\")]\n        public string ClassName { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableMasteryShip.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a mastery ship from our datafiles\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public class SerializableMasteryShip\n    {\n        private readonly Collection<SerializableMastery> m_masteries;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableMasteryShip\"/> class.\n        /// </summary>\n        public SerializableMasteryShip()\n        {\n            m_masteries = new Collection<SerializableMastery>();\n        }\n        \n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets the masteries.\n        /// </summary>\n        /// <value>\n        /// The masteries.\n        /// </value>\n        [XmlElement(\"mastery\")]\n        public Collection<SerializableMastery> Masteries => m_masteries;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableMaterialQuantity.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    public class SerializableMaterialQuantity\n    {\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the quantity.\n        /// </summary>\n        /// <value>The quantity.</value>\n        [XmlAttribute(\"quantity\")]\n        public long Quantity { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializablePlanet.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a planet in the EVE universe.\n    /// </summary>\n    public class SerializablePlanet\n    {\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"typeID\")]\n        public int TypeID { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializablePrereqSkill.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a prerequisite skill for a blueprint.\n    /// </summary>\n    public sealed class SerializablePrereqSkill\n    {\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public long ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the level.\n        /// </summary>\n        /// <value>The level.</value>\n        [XmlAttribute(\"lv\")]\n        public long Level { get; set; }\n\n        /// <summary>\n        /// Gets or sets the activity.\n        /// </summary>\n        /// <value>The activity.</value>\n        [XmlAttribute(\"activity\")]\n        public int Activity { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializablePrerequisiteSkill.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a prerequisite skill for ships, items, implants.\n    /// </summary>\n    public sealed class SerializablePrerequisiteSkill\n    {\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public long ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the level.\n        /// </summary>\n        /// <value>The level.</value>\n        [XmlAttribute(\"lv\")]\n        public long Level { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableProperty.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    public sealed class SerializableProperty\n    {\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlElement(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlElement(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the description.\n        /// </summary>\n        /// <value>The description.</value>\n        [XmlElement(\"description\")]\n        public string Description { get; set; }\n\n        /// <summary>\n        /// Gets or sets the default value.\n        /// </summary>\n        /// <value>The default value.</value>\n        [XmlElement(\"defaultValue\")]\n        public string DefaultValue { get; set; }\n\n        /// <summary>\n        /// Gets or sets the icon.\n        /// </summary>\n        /// <value>The icon.</value>\n        [XmlElement(\"icon\")]\n        public string Icon { get; set; }\n\n        /// <summary>\n        /// Gets or sets the unit.\n        /// </summary>\n        /// <value>The unit.</value>\n        [XmlElement(\"unit\")]\n        public string Unit { get; set; }\n\n        /// <summary>\n        /// Gets or sets the unit ID.\n        /// </summary>\n        /// <value>The unit ID.</value>\n        [XmlElement(\"unitID\")]\n        public long UnitID { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [higher is better].\n        /// </summary>\n        /// <value><c>true</c> if [higher is better]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"higherIsBetter\")]\n        public bool HigherIsBetter { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializablePropertyCategory.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializablePropertyCategory\n    {\n        private readonly Collection<SerializableProperty> m_properties;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializablePropertyCategory\"/> class.\n        /// </summary>\n        public SerializablePropertyCategory()\n        {\n            m_properties = new Collection<SerializableProperty>();\n        }\n\n        /// <summary>\n        /// Gets or sets the id.\n        /// </summary>\n        /// <value>The id.</value>\n        [XmlElement(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlElement(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the description.\n        /// </summary>\n        /// <value>The description.</value>\n        [XmlElement(\"description\")]\n        public string Description { get; set; }\n\n        /// <summary>\n        /// Gets the properties.\n        /// </summary>\n        /// <value>The properties.</value>\n        [XmlArray(\"properties\")]\n        [XmlArrayItem(\"property\")]\n        public Collection<SerializableProperty> Properties => m_properties;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializablePropertyValue.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents an Eve property for ships, items and implants.\n    /// </summary>\n    public sealed class SerializablePropertyValue\n    {\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the value.\n        /// </summary>\n        /// <value>The value.</value>\n        [XmlAttribute(\"value\")]\n        public string Value { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableReactionInfo.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    public sealed class SerializableReactionInfo : SerializableMaterialQuantity\n    {\n        /// <summary>\n        /// Gets or sets a value indicating whether this instance is input.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if this instance is input; otherwise, <c>false</c>.\n        /// </value>\n        [XmlAttribute(\"input\")]\n        public bool IsInput { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableRegion.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a region of the EVE universe.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableRegion\n    {\n        private readonly Collection<SerializableConstellation> m_constellations;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableRegion\"/> class.\n        /// </summary>\n        public SerializableRegion()\n        {\n            m_constellations = new Collection<SerializableConstellation>();\n        }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets the constellations.\n        /// </summary>\n        /// <value>The constellations.</value>\n        [XmlElement(\"constellations\")]\n        public Collection<SerializableConstellation> Constellations => m_constellations;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableRequiredMaterial.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a prerequisite material for a blueprint.\n    /// </summary>\n    public sealed class SerializableRequiredMaterial\n    {\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the quantity.\n        /// </summary>\n        /// <value>The quantity.</value>\n        [XmlAttribute(\"quantity\")]\n        public long Quantity { get; set; }\n\n        /// <summary>\n        /// Gets or sets the activity.\n        /// </summary>\n        /// <value>The activity.</value>\n        [XmlAttribute(\"activityId\")]\n        public int Activity { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableSkill.cs",
    "content": "﻿using System;\nusing System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a skill in our datafile\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableSkill\n    {\n        private readonly Collection<SerializableSkillPrerequisite> m_skillPrereqs;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableSkill\"/> class.\n        /// </summary>\n        public SerializableSkill()\n        {\n            m_skillPrereqs = new Collection<SerializableSkillPrerequisite>();\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"SerializableSkill\"/> is public.\n        /// </summary>\n        /// <value><c>true</c> if public; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"public\")]\n        public bool Public { get; set; }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the description.\n        /// </summary>\n        /// <value>The description.</value>\n        [XmlAttribute(\"description\")]\n        public string Description { get; set; }\n\n        /// <summary>\n        /// Gets or sets the primary attribute.\n        /// </summary>\n        /// <value>The primary attribute.</value>\n        [XmlAttribute(\"primaryAttr\")]\n        public EveAttribute PrimaryAttribute { get; set; }\n\n        /// <summary>\n        /// Gets or sets the secondary attribute.\n        /// </summary>\n        /// <value>The secondary attribute.</value>\n        [XmlAttribute(\"secondaryAttr\")]\n        public EveAttribute SecondaryAttribute { get; set; }\n\n        /// <summary>\n        /// Gets or sets the rank.\n        /// </summary>\n        /// <value>The rank.</value>\n        [XmlAttribute(\"rank\")]\n        public long Rank { get; set; }\n\n        /// <summary>\n        /// Gets or sets the cost.\n        /// </summary>\n        /// <value>The cost.</value>\n        [XmlAttribute(\"cost\")]\n        public long Cost { get; set; }\n\n        /// <summary>\n        /// Gets the skill prerequisites.\n        /// </summary>\n        /// <value>The skill prerequisites.</value>\n        [XmlElement(\"prereq\")]\n        public Collection<SerializableSkillPrerequisite> SkillPrerequisites => m_skillPrereqs;\n\n        /// <summary>\n        /// The highest level the skill can be trained on an alpha clone.\n        /// </summary>\n        /// <value>The level.</value>\n        public int AlphaLimit { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableSkillGroup.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a skill group in our datafile\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableSkillGroup\n    {\n        private readonly Collection<SerializableSkill> m_skills;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableSkillGroup\"/> class.\n        /// </summary>\n        public SerializableSkillGroup()\n        {\n            m_skills = new Collection<SerializableSkill>();\n        }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets the skills.\n        /// </summary>\n        /// <value>The skills.</value>\n        [XmlElement(\"skill\")]\n        public Collection<SerializableSkill> Skills => m_skills;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableSkillPrerequisite.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a skill prerequisite for a skill\n    /// </summary>\n    public sealed class SerializableSkillPrerequisite\n    {\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the level.\n        /// </summary>\n        /// <value>The level.</value>\n        [XmlAttribute(\"level\")]\n        public long Level { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableSolarSystem.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a solar system in the EVE universe.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableSolarSystem\n    {\n        private readonly Collection<SerializablePlanet> m_planets;\n        private readonly Collection<SerializableStation> m_stations;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableSolarSystem\"/> class.\n        /// </summary>\n        public SerializableSolarSystem()\n        {\n            m_planets = new Collection<SerializablePlanet>();\n            m_stations = new Collection<SerializableStation>();\n        }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the X.\n        /// </summary>\n        /// <value>The X.</value>\n        [XmlAttribute(\"x\")]\n        public int X { get; set; }\n\n        /// <summary>\n        /// Gets or sets the Y.\n        /// </summary>\n        /// <value>The Y.</value>\n        [XmlAttribute(\"y\")]\n        public int Y { get; set; }\n\n        /// <summary>\n        /// Gets or sets the Z.\n        /// </summary>\n        /// <value>The Z.</value>\n        [XmlAttribute(\"z\")]\n        public int Z { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the security level.\n        /// </summary>\n        /// <value>The security level.</value>\n        [XmlAttribute(\"securityLevel\")]\n        public float SecurityLevel { get; set; }\n\n        /// <summary>\n        /// Gets the planets.\n        /// </summary>\n        /// <value>The planets.</value>\n        [XmlElement(\"planets\")]\n        public Collection<SerializablePlanet> Planets => m_planets;\n\n        /// <summary>\n        /// Gets the stations.\n        /// </summary>\n        /// <value>The stations.</value>\n        [XmlElement(\"stations\")]\n        public Collection<SerializableStation> Stations => m_stations;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableStation.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a station in the EVE universe.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class SerializableStation\n    {\n        private readonly Collection<SerializableAgent> m_agents;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableStation\"/> class.\n        /// </summary>\n        public SerializableStation()\n        {\n            m_agents = new Collection<SerializableAgent>();\n        }\n\n        /// <summary>\n        /// Gets or sets the ID.\n        /// </summary>\n        /// <value>The ID.</value>\n        [XmlAttribute(\"id\")]\n        public long ID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the corporation ID.\n        /// </summary>\n        /// <value>The corporation ID.</value>\n        [XmlAttribute(\"corporationID\")]\n        public int CorporationID { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name of the corporation.\n        /// </summary>\n        /// <value>The name of the corporation.</value>\n        [XmlAttribute(\"corporationName\")]\n        public string CorporationName { get; set; }\n\n        /// <summary>\n        /// Gets or sets the reprocessing efficiency.\n        /// </summary>\n        /// <value>The reprocessing efficiency.</value>\n        [XmlElement(\"reprocessingEfficiency\")]\n        public float ReprocessingEfficiency { get; set; }\n\n        /// <summary>\n        /// Gets or sets the reprocessing stations take.\n        /// </summary>\n        /// <value>The reprocessing stations take.</value>\n        [XmlElement(\"reprocessingStationsTake\")]\n        public float ReprocessingStationsTake { get; set; }\n\n        /// <summary>\n        /// Gets the agents.\n        /// </summary>\n        /// <value>The agents.</value>\n        [XmlArray(\"agents\")]\n        [XmlArrayItem(\"agent\")]\n        public Collection<SerializableAgent> Agents => m_agents;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SerializableStationList.cs",
    "content": "using EVEMon.Common.Serialization.Eve;\nusing System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Represents a serializable version of the stations list. Used for data files only.\n    /// </summary>\n    public sealed class SerializableStationList\n    {\n        private readonly Collection<SerializableOutpost> m_stations;\n\n        public SerializableStationList()\n        {\n            m_stations = new Collection<SerializableOutpost>();\n        }\n\n        [XmlArray(\"stations\")]\n        [XmlArrayItem(\"station\")]\n        public Collection<SerializableOutpost> Stations => m_stations;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/SkillsDatafile.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Datafiles\n{\n    /// <summary>\n    /// Root SkillsDatafile Serialization Class\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    [XmlRoot(\"skills\")]\n    public sealed class SkillsDatafile\n    {\n        private readonly Collection<SerializableSkillGroup> m_skillGroups;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SkillsDatafile\"/> class.\n        /// </summary>\n        public SkillsDatafile()\n        {\n            m_skillGroups = new Collection<SerializableSkillGroup>();\n        }\n\n        /// <summary>\n        /// Gets the skill groups.\n        /// </summary>\n        /// <value>The skill groups.</value>\n        [XmlElement(\"group\")]\n        public Collection<SerializableSkillGroup> SkillGroups => m_skillGroups;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Datafiles/datafile-transform.xslt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n                xmlns:msxsl=\"urn:schemas-microsoft-com:xslt\" exclude-result-prefixes=\"msxsl\">\n  <xsl:strip-space elements=\"*\" />\n  <xsl:output method=\"xml\" indent=\"yes\"/>\n\n  <xsl:template match=\"@* | node()\">\n    <xsl:copy>\n      <xsl:apply-templates select=\"@* | node()\"/>\n    </xsl:copy>\n  </xsl:template>\n\n  <!-- Renaming root name 'blueprints' in blueprints datafile to 'blueprintsDatafile' -->\n  <xsl:template match=\"blueprints\">\n    <xsl:element name=\"blueprintsDatafile\">\n      <xsl:copy-of select=\"namespace::*\"/>\n      <xsl:apply-templates/>\n    </xsl:element>\n  </xsl:template>\n\n  <!-- Renaming attribute 'Name' in items datafile to 'name' -->\n  <xsl:template match=\"@Name\">\n    <xsl:attribute name=\"name\">\n      <xsl:value-of select=\".\"/>\n    </xsl:attribute>\n  </xsl:template>\n\n  <!-- Renaming attribute value 'Bpo' in items datafile to 'Blueprint' -->\n  <xsl:template match=\"@family\">\n    <xsl:choose>\n      <xsl:when test=\".='Bpo'\">\n        <xsl:attribute name=\"family\">\n          <xsl:value-of select=\"'Blueprint'\"/>\n        </xsl:attribute>\n      </xsl:when>\n      <xsl:otherwise>\n        <xsl:copy/>\n      </xsl:otherwise>\n    </xsl:choose>\n  </xsl:template>\n\n</xsl:stylesheet>\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIAssetList.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIAssetList : List<EsiAssetListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIAttributes.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Represents the character's attributes\n    /// </summary>\n    [DataContract]\n    public sealed class EsiAPIAttributes\n    {\n        private DateTime lastRemap;\n        private DateTime remapCooldownDate;\n\n        public EsiAPIAttributes()\n        {\n            Intelligence = Memory = Perception = Charisma = Willpower = 1;\n            lastRemap = DateTime.MinValue;\n            remapCooldownDate = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"intelligence\")]\n        public int Intelligence { get; set; }\n\n        [DataMember(Name = \"memory\")]\n        public int Memory { get; set; }\n\n        [DataMember(Name = \"perception\")]\n        public int Perception { get; set; }\n\n        [DataMember(Name = \"willpower\")]\n        public int Willpower { get; set; }\n\n        [DataMember(Name = \"charisma\")]\n        public int Charisma { get; set; }\n\n        [DataMember(Name = \"bonus_remaps\", IsRequired = false)]\n        public short BonusRemaps { get; set; }\n\n        [DataMember(Name = \"last_remap_date\", EmitDefaultValue = false, IsRequired = false)]\n        private string LastRemapJson\n        {\n            get\n            {\n                return lastRemap.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    lastRemap = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"accrued_remap_cooldown_date\", EmitDefaultValue = false, IsRequired = false)]\n        private string RemapCooldownDateJson\n        {\n            get\n            {\n                return remapCooldownDate.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    remapCooldownDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime LastRemap\n        {\n            get\n            {\n                return lastRemap;\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime RemapCooldownDate\n        {\n            get\n            {\n                return remapCooldownDate;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPICalendarEvent.cs",
    "content": "﻿using EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiAPICalendarEvent : EsiCalendarEventListItem\n    {\n        private CCPAPIContactType ownerType;\n\n        public EsiAPICalendarEvent()\n        {\n            ownerType = CCPAPIContactType.Other;\n        }\n\n        [DataMember(Name = \"owner_id\")]\n        public long OwnerID { get; set; }\n\n        [DataMember(Name = \"owner_name\")]\n        public string OwnerName { get; set; }\n\n        [DataMember(Name = \"text\")]\n        public string EventText { get; set; }\n\n        [DataMember(Name = \"owner_type\")]\n        private string OwnerTypeJson\n        {\n            get\n            {\n                return ownerType.ToString().ToLower();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    Enum.TryParse(value, true, out ownerType);\n            }\n        }\n\n        [IgnoreDataMember]\n        public CCPAPIContactType OwnerType\n        {\n            get\n            {\n                return ownerType;\n            }\n        }\n\n        // in minutes\n        [DataMember(Name = \"duration\")]\n        public int Duration { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPICalendarEventAttendees.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiAPICalendarEventAttendees : List<EsiCalendarEventAttendeeListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPICalendarEvents.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPICalendarEvents : List<EsiCalendarEventListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPICharacterNames.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPICharacterNames : List<EsiCharacterNameListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPICharacterSheet.cs",
    "content": "using EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Base class for the ESI character sheet.\n    /// </summary>\n    [DataContract]\n    public sealed class EsiAPICharacterSheet\n    {\n        private DateTime birthday;\n\n        public EsiAPICharacterSheet()\n        {\n            birthday = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"name\")]\n        public string Name { get; set; }\n\n        [DataMember(Name = \"description\", EmitDefaultValue = false, IsRequired = false)]\n        public string Description { get; set; }\n\n        [DataMember(Name = \"birthday\")]\n        private string BirthdayJson\n        {\n            get { return birthday.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    birthday = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"race_id\")]\n        private int RaceID { get; set; }\n\n        public Race Race\n        {\n            get\n            {\n                return (Race)RaceID;\n            }\n        }\n\n        [DataMember(Name = \"bloodline_id\")]\n        private int BloodLineID { get; set; }\n\n        public Bloodline BloodLine\n        {\n            get\n            {\n                return (Bloodline)BloodLineID;\n            }\n        }\n\n        [DataMember(Name = \"ancestry_id\", EmitDefaultValue = false, IsRequired = false)]\n        private int AncestryID { get; set; }\n\n        public Ancestry Ancestry\n        {\n            get\n            {\n                return (Ancestry)AncestryID;\n            }\n        }\n\n        // One of: female, male\n        [DataMember(Name = \"gender\")]\n        public string Gender { get; set; }\n\n        [DataMember(Name = \"corporation_id\")]\n        public long CorporationID { get; set; }\n\n        [DataMember(Name = \"alliance_id\", EmitDefaultValue = false, IsRequired = false)]\n        public long AllianceID { get; set; }\n\n        [DataMember(Name = \"faction_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int FactionID { get; set; }\n\n        [DataMember(Name = \"security_status\")]\n        public double SecurityStatus { get; set; }\n\n        /// <summary>\n        /// The date and time the character was created.\n        /// </summary>\n        [IgnoreDataMember]\n        public DateTime Birthday\n        {\n            get\n            {\n                return birthday;\n            }\n            set\n            {\n                if (value > DateTime.MinValue)\n                    birthday = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIClones.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{     \n    /// <summary>\n    /// Represents a serializable version of a character's clones. Used for querying CCP.\n    /// </summary>\n    [DataContract]\n    public sealed class EsiAPIClones\n    {\n        private DateTime lastCloneJump;\n        private DateTime lastStationChange;\n\n        public EsiAPIClones()\n        {\n            lastCloneJump = DateTime.MinValue;\n            lastStationChange = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"home_location\")]\n        public EsiLocationBase HomeLocation { get; set; }\n\n        // Returns the last date the character used a jump clone, in UTC\n        [IgnoreDataMember]\n        public DateTime LastCloneJump\n        {\n            get\n            {\n                return lastCloneJump;\n            }\n        }\n\n        [DataMember(Name = \"last_clone_jump_date\", EmitDefaultValue = false, IsRequired = false)]\n        private string LastCloneJumpJson\n        {\n            get\n            {\n                return lastCloneJump.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    lastCloneJump = value.TimeStringToDateTime();\n            }\n        }\n\n        // Returns the last date the home station was changed, in UTC\n        [IgnoreDataMember]\n        public DateTime LastStationChange\n        {\n            get\n            {\n                return lastStationChange;\n            }\n        }\n\n        [DataMember(Name = \"last_station_change_date\", EmitDefaultValue = false, IsRequired = false)]\n        private string LastStationChangeJson\n        {\n            get\n            {\n                return lastStationChange.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    lastStationChange = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"jump_clones\")]\n        public List<EsiJumpCloneListItem> JumpClones { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIContactNotifications.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIContactNotifications : List<EsiContactNotifyListItem>\n    {\n        // Not used in EVEMon\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIContactsList.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIContactsList : List<EsiContactListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIContractBids.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIContractBids : List<EsiContractBidsListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIContractItems.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIContractItems : List<EsiContractItemsListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIContracts.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIContracts : List<EsiContractListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPICorpAccountBalance.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPICorpAccountBalance : List<EsiAccountBalanceListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPICorporationSheet.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Represents a serializable version of a corporation's sheet. Used for querying CCP.\n    /// </summary>\n    [DataContract]\n    public sealed class EsiAPICorporationSheet\n    {\n        private DateTime founded;\n\n        public EsiAPICorporationSheet()\n        {\n            founded = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"name\")]\n        public string Name { get; set; }\n\n        [DataMember(Name = \"ticker\")]\n        public string Ticker { get; set; }\n\n        [DataMember(Name = \"ceo_id\")]\n        public long CeoID { get; set; }\n\n        [DataMember(Name = \"creator_id\")]\n        public long CreatorID { get; set; }\n\n        [DataMember(Name = \"home_station_id\")]\n        public int HQStationID { get; set; }\n\n        [DataMember(Name = \"date_founded\", EmitDefaultValue = false, IsRequired = false)]\n        private string DateFoundedJson\n        {\n            get\n            {\n                return founded.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    founded = value.TimeStringToDateTime();\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime DateFounded\n        {\n            get\n            {\n                return founded;\n            }\n        }\n\n        [DataMember(Name = \"description\", EmitDefaultValue = false, IsRequired = false)]\n        public string Description { get; set; }\n\n        [DataMember(Name = \"url\", EmitDefaultValue = false, IsRequired = false)]\n        public string WebUrl { get; set; }\n\n        [DataMember(Name = \"alliance_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int AllianceID { get; set; }\n        \n        [DataMember(Name = \"faction_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int FactionID { get; set; }\n        \n        [DataMember(Name = \"tax_rate\")]\n        public float TaxRate { get; set; }\n\n        [DataMember(Name = \"member_count\")]\n        public int MemberCount { get; set; }\n\n        [DataMember(Name = \"shares\", EmitDefaultValue = false, IsRequired = false)]\n        public int Shares { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIDivisions.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiAPIDivisions\n    {\n        [DataMember(Name = \"hangar\", EmitDefaultValue = false, IsRequired = false)]\n        public List<EsiDivisionListItem> Hangar { get; set; }\n\n        [DataMember(Name = \"wallet\", EmitDefaultValue = false, IsRequired = false)]\n        public List<EsiDivisionListItem> Wallet { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIEmploymentHistory.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIEmploymentHistory : List<EsiEmploymentHistoryListItem>\n    {\n        public IEnumerable<SerializableEmploymentHistoryListItem> ToXMLItem()\n        {\n            var ret = new LinkedList<SerializableEmploymentHistoryListItem>();\n            foreach (var history in this)\n                ret.AddLast(history.ToXMLItem());\n            return ret;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIError.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Matches the ESI server response when an error occurs.\n    /// </summary>\n    [DataContract]\n    public class EsiAPIError\n    {\n        [DataMember(Name = \"error\", IsRequired = false)]\n        public string Error { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIEveFactionWars.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIEveFactionWars : List<EsiEveFactionWarsListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIEveFactionalWarfareStats.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIEveFactionalWarfareStats : List<EsiEveFactionalWarfareStatsListItem>\n    {\n        public SerializableAPIEveFactionalWarfareStats ToXMLItem(EsiAPIEveFactionWars wars)\n        {\n            var totals = new SerializableEveFacWarfareTotals();\n            var ret = new SerializableAPIEveFactionalWarfareStats()\n            {\n                Totals = totals\n            };\n\n            // Manually compute the totals and convert individual war counts\n            foreach (var warStats in this)\n            {\n                var kills = warStats.Kills;\n                var vp = warStats.VictoryPoints;\n\n                totals.KillsLastWeek += kills.LastWeek;\n                totals.KillsTotal += kills.Total;\n                totals.KillsYesterday += kills.Yesterday;\n\n                totals.VictoryPointsLastWeek += vp.LastWeek;\n                totals.VictoryPointsTotal += vp.Total;\n                totals.VictoryPointsYesterday += vp.Yesterday;\n\n                ret.FactionalWarfareStats.Add(warStats.ToXMLItem());\n            }\n\n            // Add the war declarations\n            foreach (var war in wars)\n                ret.FactionWars.Add(war.ToXMLItem());\n\n            return ret;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIFactionalWarfareStats.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Represents a serializable version of factional warfare stats. Used for querying CCP.\n    /// </summary>\n    [DataContract]\n    public sealed class EsiAPIFactionalWarfareStats\n    {\n        private DateTime enlisted;\n\n        public EsiAPIFactionalWarfareStats()\n        {\n            enlisted = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"faction_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int FactionID { get; set; }\n        \n        [DataMember(Name = \"enlisted_on\", EmitDefaultValue = false, IsRequired = false)]\n        private string EnlistedDateJson\n        {\n            get { return enlisted.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    enlisted = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"current_rank\", EmitDefaultValue = false, IsRequired = false)]\n        public int CurrentRank { get; set; }\n\n        [DataMember(Name = \"highest_rank\", EmitDefaultValue = false, IsRequired = false)]\n        public int HighestRank { get; set; }\n\n        [DataMember(Name = \"kills\")]\n        public EsiEveFactionWarfareTotals Kills { get; set; }\n\n        [DataMember(Name = \"victory_points\")]\n        public EsiEveFactionWarfareTotals VictoryPoints { get; set; }\n\n        [IgnoreDataMember]\n        public DateTime EnlistedDate\n        {\n            get\n            {\n                return enlisted;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIIndustryJobs.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIIndustryJobs : List<EsiJobListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIJumpFatigue.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Jump fatigue now has its own API call!\n    /// </summary>\n    [DataContract]\n    public sealed class EsiAPIJumpFatigue\n    {\n        private DateTime fatigueExpires;\n        private DateTime lastJump;\n        private DateTime lastUpdate;\n\n        public EsiAPIJumpFatigue()\n        {\n            fatigueExpires = DateTime.MinValue;\n            lastJump = DateTime.MinValue;\n            lastUpdate = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"last_jump_date\", EmitDefaultValue = false, IsRequired = false)]\n        private string LastJumpJson\n        {\n            get\n            {\n                return lastJump.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    lastJump = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"jump_fatigue_expire_date\", EmitDefaultValue = false, IsRequired = false)]\n        private string FatigueExpiresJson\n        {\n            get\n            {\n                return fatigueExpires.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    fatigueExpires = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"last_update_date\", EmitDefaultValue = false, IsRequired = false)]\n        private string LastUpdateJson\n        {\n            get\n            {\n                return lastUpdate.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    lastUpdate = value.TimeStringToDateTime();\n            }\n        }\n\n        public DateTime LastJump\n        {\n            get\n            {\n                return lastJump;\n            }\n        }\n\n        public DateTime FatigueExpires\n        {\n            get\n            {\n                return fatigueExpires;\n            }\n        }\n\n        public DateTime LastUpdate\n        {\n            get\n            {\n                return lastUpdate;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIKillLog.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIKillLog : List<EsiKillLogListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIKillMail.cs",
    "content": "using EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Collections.ObjectModel;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiAPIKillMail\n    {\n        private DateTime killTime;\n\n        public EsiAPIKillMail()\n        {\n            killTime = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"killmail_id\")]\n        public int KillID { get; set; }\n\n        [DataMember(Name = \"killmail_time\")]\n        private string KillTimeJson\n        {\n            get\n            {\n                return killTime.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    killTime = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"solar_system_id\")]\n        public int SolarSystemID { get; set; }\n\n        [DataMember(Name = \"moon_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int MoonID { get; set; }\n\n        [DataMember(Name = \"war_id\", EmitDefaultValue = false, IsRequired = false)]\n        public long WarID { get; set; }\n\n        [DataMember(Name = \"victim\")]\n        public EsiKillLogVictim Victim { get; set; }\n\n        [DataMember(Name = \"attackers\")]\n        public Collection<EsiKillLogAttackersListItem> Attackers { get; set; }\n\n        [IgnoreDataMember]\n        public DateTime KillTime\n        {\n            get\n            {\n                return killTime;\n            }\n        }\n\n        public SerializableKillLogListItem ToXMLItem()\n        {\n            var ret = new SerializableKillLogListItem()\n            {\n                KillID = KillID,\n                KillTime = KillTime,\n                MoonID = MoonID,\n                SolarSystemID = SolarSystemID,\n                Victim = Victim?.ToXMLItem()\n            };\n\n            // Attackers\n            if (Attackers != null)\n                foreach (var attacker in Attackers)\n                    ret.Attackers.Add(attacker.ToXMLItem());\n\n            // Items\n            if (Victim != null)\n            {\n                var items = Victim.Items;\n                if (items != null)\n                {\n                    foreach (var item in items)\n                        ret.Items.Add(item.ToXMLItem());\n                }\n            }\n\n            return ret;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPILocation.cs",
    "content": "﻿using EVEMon.Common.Data;\nusing EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Represents a serializable version of a character's location.\n    /// </summary>\n    [DataContract]\n    public sealed class EsiAPILocation\n    {\n        [DataMember(Name = \"solar_system_id\")]\n        public int SolarSystemID { get; set; }\n\n        [IgnoreDataMember]\n        public string SolarSystemName\n        {\n            get\n            {\n                return StaticGeography.GetSolarSystemName(SolarSystemID);\n            }\n        }\n\n        [DataMember(Name = \"station_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int StationID { get; set; }\n\n        [DataMember(Name = \"structure_id\", EmitDefaultValue = false, IsRequired = false)]\n        public long StructureID { get; set; }\n\n        public SerializableLocation ToXMLItem()\n        {\n            return new SerializableLocation()\n            {\n                SolarSystemID = SolarSystemID,\n                StationID = StationID,\n                StructureID = StructureID\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPILoyalty.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPILoyality : List<EsiLoyaltyListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIMailBody.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Would inherit from SerializableMailMessagesListItem, but 'is_read' is changed to\n    /// 'read'. CCPls, had to make an intermediate base instead\n    /// </summary>\n    [DataContract]\n    public sealed class EsiAPIMailBody : EsiMailBase\n    {\n        [DataMember(Name = \"body\", EmitDefaultValue = false, IsRequired = false)]\n        public string Body { get; set; }\n\n        [DataMember(Name = \"read\", IsRequired = false)]\n        public bool Read { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIMailMessages.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIMailMessages : List<EsiMailMessagesListItem>\n    {\n        public SerializableAPIMailMessages ToXMLItem()\n        {\n            var ret = new SerializableAPIMailMessages();\n            foreach (var mail in this)\n                ret.Messages.Add(mail.ToXMLItem());\n            return ret;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIMailingLists.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIMailingLists : List<EsiMailingListsListItem>\n    {\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIMarketOrders.cs",
    "content": "﻿using EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Settings;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIMarketOrders : List<EsiOrderListItem>\n    {\n        /// <summary>\n        /// Sets all market orders in this collection to be issued by the specified character\n        /// ID. Used to apply the right ID to character market orders (corp market orders\n        /// already have an IssuedBy field)\n        /// </summary>\n        /// <param name=\"id\">The issuing character ID.</param>\n        public void SetAllIssuedBy(long id)\n        {\n            foreach (EsiOrderListItem item in this)\n                item.IssuedBy = id;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIMedals.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIMedals : List<EsiMedalsListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPINotifications.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPINotifications : List<EsiNotificationsListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIPlanet.cs",
    "content": "﻿using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Represents planet information.\n    /// </summary>\n    [DataContract]\n    public class EsiAPIPlanet\n    {\n        [DataMember(Name = \"name\")]\n        public string Name { get; set; }\n\n        [DataMember(Name = \"planet_id\")]\n        public int PlanetID { get; set; }\n\n        [DataMember(Name = \"position\")]\n        public EsiPosition Position { get; set; }\n\n        [DataMember(Name = \"system_id\")]\n        public int SystemID { get; set; }\n\n        [DataMember(Name = \"type_id\")]\n        public int TypeID { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIPlanetaryColoniesList.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIPlanetaryColoniesList : List<EsiPlanetaryColonyListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIPlanetaryColony.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Represents a serializable version of a planetary colony. Used for querying CCP.\n    /// </summary>\n    [DataContract]\n    public sealed class EsiAPIPlanetaryColony\n    {\n        [DataMember(Name = \"links\")]\n        public List<EsiPlanetaryLink> Links { get; set; }\n\n        [DataMember(Name = \"pins\")]\n        public List<EsiPlanetaryPin> Pins { get; set; }\n\n        [DataMember(Name = \"routes\")]\n        public List<EsiPlanetaryRoute> Routes { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIResearchPoints.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIResearchPoints : List<EsiResearchListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIServerStatus.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Represents a serializable version of a server status. Used for querying CCP.\n    /// </summary>\n    [DataContract]\n    public sealed class EsiAPIServerStatus\n    {\n        private DateTime startDate;\n\n        public EsiAPIServerStatus()\n        {\n            startDate = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"players\")]\n        public int Players { get; set; }\n\n        [DataMember(Name = \"start_time\")]\n        private string StartTimeJson\n        {\n            get { return startDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    startDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime StartTime\n        {\n            get\n            {\n                return startDate;\n            }\n        }\n\n        [DataMember(Name = \"server_version\")]\n        public string Version { get; set; }\n\n        [DataMember(Name = \"vip\", IsRequired = false)]\n        public bool VIP { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIShip.cs",
    "content": "﻿using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Represents a serializable version of a character's current ship.\n    /// </summary>\n    [DataContract]\n    public sealed class EsiAPIShip\n    {\n        [DataMember(Name = \"ship_type_id\")]\n        public int ShipTypeID { get; set; }\n\n        // Unique to a particular ship until repackaged\n        [DataMember(Name = \"ship_item_id\")]\n        public long ShipItemID { get; set; }\n\n        [DataMember(Name = \"ship_name\")]\n        public string ShipName { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPISkillQueue.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPISkillQueue : List<EsiSkillQueueListItem>, ISynchronizableWithLocalClock\n    {\n        public ICollection<SerializableQueuedSkill> CreateSkillQueue()\n        {\n            var queue = new List<SerializableQueuedSkill>(Count);\n            foreach (var queueItem in this)\n                queue.Add(queueItem.ToXMLItem());\n            return queue;\n        }\n\n        #region ISynchronizableWithLocalClock Members\n\n        /// <summary>\n        /// Synchronizes the stored times with local clock\n        /// </summary>\n        /// <param name=\"drift\"></param>\n        void ISynchronizableWithLocalClock.SynchronizeWithLocalClock(TimeSpan drift)\n        {\n            foreach (ISynchronizableWithLocalClock queueItem in this)\n                queueItem.SynchronizeWithLocalClock(drift);\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPISkills.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public class EsiAPISkills\n    {\n        public EsiAPISkills()\n        {\n            UnallocatedSP = 0;\n        }\n\n        [DataMember(Name = \"total_sp\")]\n        public int TotalSP { get; set; }\n\n        [DataMember(Name = \"unallocated_sp\")]\n        public int UnallocatedSP { get; set; }\n\n        [DataMember(Name = \"skills\")]\n        public List<EsiSkillListItem> Skills { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPISovStructures.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPISovStructures : List<EsiSovStructureListItem>\n    {\n        // No equivalent in XML API, this is used to determine conquerable station info\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIStandings.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIStandings : List<EsiStandingsListItem>\n    {\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIStation.cs",
    "content": "﻿using EVEMon.Common.Serialization.Datafiles;\nusing EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiAPIStation\n    {\n        [DataMember(Name = \"station_id\")]\n        public long ID { get; set; }\n\n        [DataMember(Name = \"name\")]\n        public string Name { get; set; }\n\n        [DataMember(Name = \"owner\", EmitDefaultValue = false, IsRequired = false)]\n        public int CorporationID { get; set; }\n\n        [DataMember(Name = \"system_id\")]\n        public int SolarSystemID { get; set; }\n\n        [DataMember(Name = \"type_id\")]\n        public int TypeID { get; set; }\n\n        [DataMember(Name = \"race_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int RaceID { get; set; }\n\n        [DataMember(Name = \"position\")]\n        public EsiPosition Position { get; set; }\n\n        [DataMember(Name = \"reprocessing_efficiency\")]\n        public float ReprocessingEfficiency { get; set; }\n\n        [DataMember(Name = \"reprocessing_stations_take\")]\n        public float ReprocessingStationsTake { get; set; }\n\n        [DataMember(Name = \"max_dockable_ship_volume\")]\n        public float MaxDockableShipVolume { get; set; }\n\n        [DataMember(Name = \"office_rental_cost\")]\n        public decimal OfficeRentalCost { get; set; }\n\n        public SerializableStation ToSerializableStation()\n        {\n            return new SerializableStation()\n            {\n                CorporationID = CorporationID,\n                ID = ID,\n                Name = Name,\n                ReprocessingEfficiency = ReprocessingEfficiency,\n                ReprocessingStationsTake = ReprocessingStationsTake\n            };\n        }\n\n        public SerializableOutpost ToSerializableOutpost()\n        {\n            return new SerializableOutpost()\n            {\n                CorporationID = CorporationID,\n                SolarSystemID = SolarSystemID,\n                StationID = ID,\n                StationTypeID = TypeID,\n                StationName = Name\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIStructure.cs",
    "content": "using EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiAPIStructure\n    {\n        [DataMember(Name = \"name\")]\n        public string StationName { get; set; }\n\n        [DataMember(Name = \"type_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int StationTypeID { get; set; }\n\n        [DataMember(Name = \"solar_system_id\")]\n        public int SolarSystemID { get; set; }\n        \n        [DataMember(Name = \"position\", EmitDefaultValue = false, IsRequired = false)]\n        public EsiPosition Position { get; set; }\n\n        [DataMember(Name = \"owner_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int OwnerID { get; set; }\n\n        public SerializableOutpost ToXMLItem(long id)\n        {\n            return new SerializableOutpost()\n            {\n                CorporationID = OwnerID,\n                StationID = id,\n                SolarSystemID = SolarSystemID,\n                StationTypeID = StationTypeID,\n                StationName = StationName\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPITokenInfo.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Template class for an ESI character response.\n    /// </summary>\n    [DataContract]\n    public sealed class EsiAPITokenInfo : IComparable<EsiAPITokenInfo>\n    {\n        // Character ID #\n        [DataMember(Name = \"CharacterID\")]\n        public long CharacterID { get; set; }\n        // Character name\n        [DataMember(Name = \"CharacterName\")]\n        public string CharacterName { get; set; }\n        // Date the token expires (JSON format)\n        [DataMember(Name = \"ExpiresOn\")]\n        public string ExpiresOnString\n        {\n            get\n            {\n                // Report as \"2016-05-31T04:02:16Z\"\n                return expires.DateTimeToTimeString();\n            }\n            set\n            {\n                // Parse from \"2016-05-31T04:02:16Z\"\n                if (!string.IsNullOrEmpty(value))\n                    expires = value.TimeStringToDateTime();\n            }\n        }\n        // Scopes authorized\n        [DataMember(Name = \"Scopes\")]\n        private string Scopes { get; set; }\n\n        // When this token expires\n        private DateTime expires;\n\n        public EsiAPITokenInfo()\n        {\n            expires = DateTime.UtcNow;\n        }\n        public int CompareTo(EsiAPITokenInfo other)\n        {\n            if (other == null)\n                throw new ArgumentNullException(\"other\");\n            return CharacterID.CompareTo(other.CharacterID);\n        }\n        public override bool Equals(object obj)\n        {\n            var other = obj as EsiAPITokenInfo;\n            return other != null && CompareTo(other) == 0;\n        }\n        public override int GetHashCode()\n        {\n            return CharacterID.GetHashCode();\n        }\n        public override string ToString()\n        {\n            return CharacterName;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIType.cs",
    "content": "using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiAPIType\n    {\n        [DataMember(Name = \"type_id\")]\n        public int ID { get; set; }\n\n        [DataMember(Name = \"name\")]\n        public string Name { get; set; }\n\n        [DataMember(Name = \"description\")]\n        public string Description { get; set; }\n\n        [DataMember(Name = \"published\")]\n        public bool Published { get; set; }\n\n        [DataMember(Name = \"group_id\")]\n        public int GroupID { get; set; }\n\n        [DataMember(Name = \"market_group_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int MarketGroupID { get; set; }\n\n        [DataMember(Name = \"radius\", EmitDefaultValue = false, IsRequired = false)]\n        public double Radius { get; set; }\n\n        [DataMember(Name = \"volume\", EmitDefaultValue = false, IsRequired = false)]\n        public double Volume { get; set; }\n\n        [DataMember(Name = \"packaged_volume\", EmitDefaultValue = false, IsRequired = false)]\n        public double PackagedVolume { get; set; }\n\n        [DataMember(Name = \"icon_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int IconID { get; set; }\n\n        [DataMember(Name = \"capacity\", EmitDefaultValue = false, IsRequired = false)]\n        public double Capacity { get; set; }\n\n        [DataMember(Name = \"portion_size\", EmitDefaultValue = false, IsRequired = false)]\n        public int PortionSize { get; set; }\n\n        [DataMember(Name = \"mass\", EmitDefaultValue = false, IsRequired = false)]\n        public double Mass { get; set; }\n\n        [DataMember(Name = \"graphic_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int GraphicID { get; set; }\n\n        // DOGMA information is also returned here, but there is no need for it in EVEMon\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIWalletJournal.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIWalletJournal : List<EsiWalletJournalListItem>\n    {\n        public SerializableAPIWalletJournal ToXMLItem()\n        {\n            var ret = new SerializableAPIWalletJournal();\n            foreach (var entry in this)\n                ret.WalletJournal.Add(entry.ToXMLItem());\n            return ret;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAPIWalletTransactions.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [CollectionDataContract]\n    public sealed class EsiAPIWalletTransactions : List<EsiWalletTransactionsListItem>\n    {\n        public SerializableAPIWalletTransactions ToXMLItem()\n        {\n            var ret = new SerializableAPIWalletTransactions();\n            foreach (var entry in this)\n                ret.WalletTransactions.Add(entry.ToXMLItem());\n            return ret;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAccountBalanceListItem.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Represents the balance of a wallet in a corporation; individual wallet balances are\n    /// returned as doubles.\n    /// </summary>\n    [DataContract]\n    public sealed class EsiAccountBalanceListItem\n    {\n        [DataMember(Name = \"division\")]\n        public int AccountID { get; set; }\n\n        [DataMember(Name = \"balance\")]\n        public decimal Balance { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiAssetListItem.cs",
    "content": "using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiAssetListItem : EsiLocationBase\n    {\n        [DataMember(Name = \"item_id\")]\n        public long ItemID { get; set; }\n\n        [DataMember(Name = \"type_id\")]\n        public int TypeID { get; set; }\n\n        // Maximum stack size is int32\n        [DataMember(Name = \"quantity\")]\n        public int Quantity { get; set; }\n\n        [DataMember(Name = \"location_flag\")]\n        public string EVEFlag { get; set; }\n\n        [DataMember(Name = \"is_singleton\")]\n        public bool Singleton { get; set; }\n\n        [DataMember(Name = \"is_blueprint_copy\", IsRequired = false, EmitDefaultValue = false)]\n        public bool IsBPC { get; set; }\n        \n        // LocationID:\n        // <60 000 000 = solar system in space\n        // 60 014 861..60 014 928 = immensea\n        // 61 000 000..66 000 000 = outpost\n        // 66 000 000..67 000 000 = station, subtract 6 000 001 for station ID\n        // 67 000 000..68 000 000 = outpost, subtract 6 000 000 for station ID\n        // >68 000 000 = citadel\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiCalendarEventAttendeeListItem.cs",
    "content": "using EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiCalendarEventAttendeeListItem\n    {\n        [DataMember(Name = \"character_id\", EmitDefaultValue = false, IsRequired = false)]\n        public long CharacterID { get; set; }\n        \n        // One of: declined, not_responded, accepted, tentative\n        [DataMember(Name = \"event_response\", EmitDefaultValue = false, IsRequired = false)]\n        public string Response { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiCalendarEventListItem.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public class EsiCalendarEventListItem\n    {\n        private DateTime eventDate;\n\n        public EsiCalendarEventListItem()\n        {\n            eventDate = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"event_id\")]\n        public long EventID { get; set; }\n\n        [DataMember(Name = \"title\", EmitDefaultValue = false, IsRequired = false)]\n        public string EventTitle { get; set; }\n\n        [DataMember(Name = \"importance\", EmitDefaultValue = false, IsRequired = false)]\n        public int Importance { get; set; }\n\n        [DataMember(Name = \"event_date\", EmitDefaultValue = false, IsRequired = false)]\n        private string EventDateJson\n        {\n            get { return eventDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    eventDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime EventDate\n        {\n            get\n            {\n                return eventDate;\n            }\n        }\n\n        // One of: declined, not_responded, accepted, tentative\n        [DataMember(Name = \"event_response\", EmitDefaultValue = false, IsRequired = false)]\n        public string Response { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiCharacterBase.cs",
    "content": "using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Represents a reference to a character used in kill mails and other character lists.\n    /// </summary>\n    [DataContract]\n    public abstract class EsiCharacterBase\n    {\n        [DataMember(Name = \"character_id\")]\n        public long ID { get; set; }\n        \n        [DataMember(Name = \"corporation_id\")]\n        public long CorporationID { get; set; }\n        \n        [DataMember(Name = \"alliance_id\")]\n        public long AllianceID { get; set; }\n        \n        [DataMember(Name = \"faction_id\")]\n        public int FactionID { get; set; }\n        \n        [DataMember(Name = \"ship_type_id\")]\n        public int ShipTypeID { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiCharacterNameListItem.cs",
    "content": "using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiCharacterNameListItem\n    {\n        [DataMember(Name = \"id\")]\n        public long ID { get; set; }\n\n        [DataMember(Name = \"name\")]\n        public string Name { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiContactListItem.cs",
    "content": "using EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi {\n    [DataContract]\n    public sealed class EsiContactListItem\n    {\n        [DataMember(Name = \"contact_id\")]\n        public long ContactID { get; set; }\n        \n        [DataMember(Name = \"is_watched\")]\n        public bool InWatchlist { get; set; }\n\n        [DataMember(Name = \"is_blocked\")]\n        public bool IsBlocked { get; set; }\n\n        [DataMember(Name = \"standing\")]\n        public float Standing { get; set; }\n\n        // One of: character, corporation, alliance, faction\n        [DataMember(Name = \"contact_type\")]\n        private string ContactTypeJson\n        {\n            get\n            {\n                switch (Group)\n                {\n                case ContactGroup.Corporate:\n                    return \"corporation\";\n                case ContactGroup.Agent:\n                    return \"faction\";\n                case ContactGroup.Alliance:\n                    return \"alliance\";\n                default:\n                    return \"character\";\n                }\n            }\n            set\n            {\n                switch (value)\n                {\n                case \"corporation\":\n                    Group = ContactGroup.Corporate;\n                    break;\n                case \"faction\":\n                    Group = ContactGroup.Agent;\n                    break;\n                case \"alliance\":\n                    Group = ContactGroup.Alliance;\n                    break;\n                case \"character\":\n                    Group = ContactGroup.Personal;\n                    break;\n                default:\n                    break;\n                }\n            }\n        }\n        \n        // Custom label of the contact\n        [DataMember(Name = \"label_id\")]\n        public long LabelID { get; set; }\n\n        [IgnoreDataMember]\n        public ContactGroup Group { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiContactNotifyListItem.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiContactNotifyListItem\n    {\n        private DateTime sentDate;\n\n        public EsiContactNotifyListItem()\n        {\n            sentDate = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"notification_id\")]\n        public long NotificationID { get; set; }\n\n        [DataMember(Name = \"message\", EmitDefaultValue = true, IsRequired = false)]\n        public string Message { get; set; }\n\n        [DataMember(Name = \"standing_level\")]\n        public double StandingLevel { get; set; }\n\n        [DataMember(Name = \"sender_character_id\")]\n        public long SenderID { get; set; }\n        \n        [DataMember(Name = \"send_date\")]\n        private string SentDateJson\n        {\n            get { return sentDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    sentDate = value.TimeStringToDateTime();\n            }\n        }\n        \n        [IgnoreDataMember]\n        public DateTime SentDate\n        {\n            get\n            {\n                return sentDate;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiContractBidsListItem.cs",
    "content": "using System;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiContractBidsListItem\n    {\n        private DateTime bidDate;\n\n        public EsiContractBidsListItem()\n        {\n            bidDate = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"bid_id\")]\n        public int ID { get; set; }\n\n        [DataMember(Name = \"bidder_id\")]\n        public long BidderID { get; set; }\n\n        [DataMember(Name = \"date_bid\")]\n        private string DateBidJson\n        {\n            get\n            {\n                return bidDate.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    bidDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"amount\")]\n        public decimal Amount { get; set; }\n\n        [IgnoreDataMember]\n        public DateTime DateBid\n        {\n            get\n            {\n                return bidDate;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiContractItemsListItem.cs",
    "content": "using EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiContractItemsListItem\n    {\n        [DataMember(Name = \"record_id\")]\n        public long RecordID { get; set; }\n\n        [DataMember(Name = \"type_id\")]\n        public int TypeID { get; set; }\n\n        // Max stack size is int32\n        [DataMember(Name = \"quantity\")]\n        public int Quantity { get; set; }\n\n        // -1 is singleton or BPO, -2 is blueprint copy\n        [DataMember(Name = \"raw_quantity\")]\n        public int RawQuantity { get; set; }\n\n        [DataMember(Name = \"is_singleton\")]\n        public bool Singleton { get; set; }\n\n        [DataMember(Name = \"is_included\")]\n        public bool Included { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiContractListItem.cs",
    "content": "using System;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Enumerations.CCPAPI;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiContractListItem\n    {\n        // Auto property causes error when deserializing\n#pragma warning disable IDE0032\n        private DateTime dateAccepted;\n        private DateTime dateCompleted;\n        private DateTime dateExpired;\n        private DateTime dateIssued;\n        private ContractAvailability availability;\n#pragma warning restore IDE0032\n\n        public EsiContractListItem()\n        {\n            dateAccepted = DateTime.MinValue;\n            dateCompleted = DateTime.MinValue;\n            dateExpired = DateTime.MinValue;\n            dateIssued = DateTime.MinValue;\n            availability = ContractAvailability.None;\n        }\n\n        [DataMember(Name = \"contract_id\")]\n        public long ContractID { get; set; }\n\n        [DataMember(Name = \"issuer_id\")]\n        public long IssuerID { get; set; }\n\n        [DataMember(Name = \"issuer_corporation_id\")]\n        public long IssuerCorpID { get; set; }\n\n        [DataMember(Name = \"assignee_id\")]\n        public long AssigneeID { get; set; }\n\n        [DataMember(Name = \"acceptor_id\")]\n        public long AcceptorID { get; set; }\n\n        [DataMember(Name = \"start_location_id\")]\n        public long StartStationID { get; set; }\n\n        [DataMember(Name = \"end_location_id\")]\n        public long EndStationID { get; set; }\n\n        // One of: unknown, item_exchange, auction, courier, loan\n        [DataMember(Name = \"type\")]\n        public string Type { get; set; }\n\n        // One of: outstanding, in_progress, finished_issuer, finished_contractor, finished,\n        // cancelled, rejected, failed, deleted, reversed\n        [DataMember(Name = \"status\")]\n        public string Status { get; set; }\n\n        [DataMember(Name = \"title\")]\n        public string Title { get; set; }\n\n        [DataMember(Name = \"for_corporation\")]\n        public bool ForCorp { get; set; }\n\n        // One of: public, personal, corporation, alliance\n        [DataMember(Name = \"availability\")]\n        private string AvailabilityJson\n        {\n            get\n            {\n                return availability.ToString();\n            }\n            set\n            {\n                switch (value)\n                {\n                case \"public\":\n                    availability = ContractAvailability.Public;\n                    break;\n                case \"corporation\":\n                case \"personal\":\n                case \"alliance\":\n                    availability = ContractAvailability.Private;\n                    break;\n                default:\n                    availability = ContractAvailability.None;\n                    break;\n                }\n            }\n        }\n\n        [DataMember(Name = \"date_issued\")]\n        private string DateIssuedJson\n        {\n            get { return DateIssued.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    dateIssued = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"date_expired\")]\n        private string DateExpiredJson\n        {\n            get { return DateExpired.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    dateExpired = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"date_accepted\")]\n        private string DateAcceptedJson\n        {\n            get { return DateAccepted.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    dateAccepted = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"days_to_complete\")]\n        public int NumDays { get; set; }\n\n        [DataMember(Name = \"date_completed\")]\n        private string DateCompletedJson\n        {\n            get { return DateCompleted.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    dateCompleted = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"price\")]\n        public decimal Price { get; set; }\n\n        [DataMember(Name = \"reward\")]\n        public decimal Reward { get; set; }\n\n        [DataMember(Name = \"collateral\")]\n        public decimal Collateral { get; set; }\n\n        [DataMember(Name = \"buyout\")]\n        public decimal Buyout { get; set; }\n\n        [DataMember(Name = \"volume\")]\n        public decimal Volume { get; set; }\n\n        [IgnoreDataMember]\n        public DateTime DateIssued\n        {\n            get\n            {\n                return dateIssued;\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime DateExpired\n        {\n            get\n            {\n                return dateExpired;\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime DateAccepted\n        {\n            get\n            {\n                return dateAccepted;\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime DateCompleted\n        {\n            get\n            {\n                return dateCompleted;\n            }\n        }\n\n        [IgnoreDataMember]\n        public ContractAvailability Availability\n        {\n            get\n            {\n                return availability;\n            }\n        }\n        \n        // Converts ESI status to the old XML status\n        [IgnoreDataMember]\n        public CCPContractStatus ContractStatus\n        {\n            get\n            {\n                CCPContractStatus ccpStatus;\n                switch (Status)\n                {\n                case \"outstanding\":\n                    ccpStatus = CCPContractStatus.Outstanding;\n                    break;\n                case \"in_progress\":\n                    ccpStatus = CCPContractStatus.InProgress;\n                    break;\n                case \"finished_issuer\":\n                    ccpStatus = CCPContractStatus.CompletedByIssuer;\n                    break;\n                case \"finished_contractor\":\n                    ccpStatus = CCPContractStatus.CompletedByContractor;\n                    break;\n                case \"finished\":\n                    ccpStatus = CCPContractStatus.Completed;\n                    break;\n                case \"cancelled\":\n                    ccpStatus = CCPContractStatus.Canceled;\n                    break;\n                case \"rejected\":\n                    ccpStatus = CCPContractStatus.Rejected;\n                    break;\n                case \"failed\":\n                    ccpStatus = CCPContractStatus.Failed;\n                    break;\n                case \"deleted\":\n                    ccpStatus = CCPContractStatus.Deleted;\n                    break;\n                case \"reversed\":\n                    ccpStatus = CCPContractStatus.Reversed;\n                    break;\n                default:\n                    ccpStatus = CCPContractStatus.None;\n                    break;\n                }\n                return ccpStatus;\n            }\n        }\n\n        // Converts ESI contract types to the old XML type\n        [IgnoreDataMember]\n        public ContractType ContractType\n        {\n            get\n            {\n                ContractType type;\n                switch (Type)\n                {\n                case \"item_exchange\":\n                    type = ContractType.ItemExchange;\n                    break;\n                case \"auction\":\n                    type = ContractType.Auction;\n                    break;\n                case \"courier\":\n                    type = ContractType.Courier;\n                    break;\n                case \"loan\":\n                    type = ContractType.Loan;\n                    break;\n                default:\n                    type = ContractType.None;\n                    break;\n                }\n                return type;\n            }\n        }\n\n        // Filled in by client to indicate where these contracts came from\n        [IgnoreDataMember]\n        public Enum APIMethod { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiDivisionListItem.cs",
    "content": "using EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Used for both wallet and hangar divisions.\n    /// </summary>\n    [DataContract]\n    public class EsiDivisionListItem\n    {\n        // 1 through 7 inclusive\n        [DataMember(Name = \"division\")]\n        public int Division { get; set; }\n        \n        [DataMember(Name = \"name\", EmitDefaultValue = false, IsRequired = false)]\n        public string Description { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiEmploymentHistoryListItem.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiEmploymentHistoryListItem\n    {\n        private DateTime startDate;\n\n        public EsiEmploymentHistoryListItem()\n        {\n            startDate = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"record_id\")]\n        public int RecordID { get; set; }\n\n        [DataMember(Name = \"corporation_id\")]\n        public long CorporationID { get; set; }\n\n        [DataMember(Name = \"is_deleted\", IsRequired = false)]\n        public bool Closed { get; set; }\n\n        [DataMember(Name = \"start_date\")]\n        public string StartDateJson\n        {\n            get { return startDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    startDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime StartDate\n        {\n            get\n            {\n                return startDate;\n            }\n            set\n            {\n                startDate = value;\n            }\n        }\n\n        public SerializableEmploymentHistoryListItem ToXMLItem()\n        {\n            return new SerializableEmploymentHistoryListItem()\n            {\n                RecordID = RecordID,\n                CorporationID = (int)CorporationID,\n                StartDate = StartDate\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiErrors.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Avoid saturating ESI with failed requests by refusing new requests if the error count\n    /// approaches the limit.\n    /// </summary>\n    public static class EsiErrors\n    {\n        // How many errors remaining to allow as a \"buffer\" before refusing requests\n        private const int ERROR_THRESHOLD = 10;\n\n        // The number of errors remaining until throttling kicks in\n        private static int s_errorCount;\n        // Locks synchronous access to the error count / time\n        private static object s_errorLock = new object();\n        // When the error count resets\n        private static DateTime s_errorReset = DateTime.MinValue;\n\n        /// <summary>\n        /// Returns the time when the error count will reset; delayed requests can be\n        /// rescheduled on or after this time.\n        /// </summary>\n        public static DateTime ErrorCountResetTime\n        {\n            get\n            {\n                // No need to lock as it reads once and does not write\n                DateTime when = DateTime.UtcNow, reset = s_errorReset;\n                if (reset > when)\n                    when = reset;\n                return when;\n            }\n        }\n\n        /// <summary>\n        /// Returns true if no ESI requests should be issued due to error count problems.\n        /// </summary>\n        public static bool IsErrorCountExceeded\n        {\n            get\n            {\n                bool error;\n                lock (s_errorLock)\n                {\n                    error = s_errorCount <= ERROR_THRESHOLD && DateTime.UtcNow < s_errorReset;\n                }\n                return error;\n            }\n        }\n\n        /// <summary>\n        /// Updates the error count when it is reported by ESI.\n        /// </summary>\n        /// <param name=\"errorCount\">The number of errors remaining until throttling.</param>\n        /// <param name=\"errorReset\">The time when the error count resets.</param>\n        /// <returns>true if throttling is in effect, or false otherwise</returns>\n        public static bool UpdateErrors(int errorCount, DateTime errorReset)\n        {\n            if (errorCount <= ERROR_THRESHOLD)\n            {\n                var maxErrorReset = DateTime.UtcNow.AddMinutes(5.0);\n                // Error reset will occur after at most 5 minutes\n                if (errorReset > maxErrorReset)\n                    errorReset = maxErrorReset;\n                lock (s_errorLock)\n                {\n                    s_errorCount = Math.Min(errorCount, s_errorCount);\n                    if (s_errorReset < errorReset)\n                        s_errorReset = errorReset;\n                }\n            }\n            return errorCount > ERROR_THRESHOLD;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiEveFactionWarfareTotals.cs",
    "content": "using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Repurposed to serve in two places for stat counters about FW kill statistics.\n    /// </summary>\n    [DataContract]\n    public sealed class EsiEveFactionWarfareTotals\n    {\n        [DataMember(Name = \"yesterday\")]\n        public int Yesterday { get; set; }\n\n        [DataMember(Name = \"last_week\")]\n        public int LastWeek { get; set; }\n\n        [DataMember(Name = \"total\")]\n        public int Total { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiEveFactionWarsListItem.cs",
    "content": "using EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiEveFactionWarsListItem\n    {\n        [DataMember(Name = \"faction_id\")]\n        public int FactionID { get; set; }\n        \n        [DataMember(Name = \"against_id\")]\n        public int AgainstID { get; set; }\n\n        public SerializableEveFactionWarsListItem ToXMLItem()\n        {\n            return new SerializableEveFactionWarsListItem()\n            {\n                FactionID = FactionID,\n                AgainstID = AgainstID\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiEveFactionalWarfareStatsListItem.cs",
    "content": "using EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiEveFactionalWarfareStatsListItem\n    {\n        [DataMember(Name = \"faction_id\")]\n        public int FactionID { get; set; }\n        \n        [DataMember(Name = \"pilots\")]\n        public int Pilots { get; set; }\n\n        [DataMember(Name = \"systems_controlled\")]\n        public int SystemsControlled { get; set; }\n\n        [DataMember(Name = \"kills\")]\n        public EsiEveFactionWarfareTotals Kills { get; set; }\n        \n        [DataMember(Name = \"victory_points\")]\n        public EsiEveFactionWarfareTotals VictoryPoints { get; set; }\n\n        public SerializableEveFactionalWarfareStatsListItem ToXMLItem()\n        {\n            return new SerializableEveFactionalWarfareStatsListItem()\n            {\n                FactionID = FactionID,\n                Pilots = Pilots,\n                SystemsControlled = SystemsControlled,\n                KillsLastWeek = Kills?.LastWeek ?? 0,\n                KillsTotal = Kills?.Total ?? 0,\n                KillsYesterday = Kills?.Yesterday ?? 0,\n                VictoryPointsLastWeek = VictoryPoints?.LastWeek ?? 0,\n                VictoryPointsTotal = VictoryPoints?.Total ?? 0,\n                VictoryPointsYesterday = VictoryPoints?.Yesterday ?? 0\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiJobListItem.cs",
    "content": "using System;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiJobListItem\n    {\n        private DateTime completedDate;\n        private DateTime endDate;\n        private DateTime pauseDate;\n        private CCPJobCompletedStatus status;\n        private DateTime startDate;\n\n        public EsiJobListItem()\n        {\n            completedDate = DateTime.MinValue;\n            endDate = DateTime.MaxValue;\n            startDate = DateTime.MinValue;\n            pauseDate = DateTime.MinValue;\n            status = CCPJobCompletedStatus.Ready;\n        }\n\n        [DataMember(Name = \"job_id\")]\n        public int JobID { get; set; }\n\n        [DataMember(Name = \"installer_id\")]\n        public long InstallerID { get; set; }\n\n        [DataMember(Name = \"facility_id\")]\n        public long FacilityID { get; set; }\n\n        [DataMember(Name = \"activity_id\")]\n        public int ActivityID { get; set; }\n\n        [DataMember(Name = \"blueprint_id\")]\n        public long BlueprintID { get; set; }\n\n        [DataMember(Name = \"blueprint_type_id\")]\n        public int BlueprintTypeID { get; set; }\n\n        [DataMember(Name = \"blueprint_location_id\")]\n        public long BlueprintLocationID { get; set; }\n\n        [DataMember(Name = \"output_location_id\")]\n        public long OutputLocationID { get; set; }\n\n        [DataMember(Name = \"runs\")]\n        public int Runs { get; set; }\n\n        [DataMember(Name = \"cost\")]\n        public double Cost { get; set; }\n\n        [DataMember(Name = \"licensed_runs\")]\n        public int LicensedRuns { get; set; }\n\n        [DataMember(Name = \"probability\")]\n        public double Probability { get; set; }\n\n        [DataMember(Name = \"product_type_id\")]\n        public int ProductTypeID { get; set; }\n\n        // One of: active, cancelled, delivered, paused, ready, reverted\n        [DataMember(Name = \"status\")]\n        private string StatusJson\n        {\n            get\n            {\n                return status.ToString().ToLower();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    Enum.TryParse(value, true, out status);\n            }\n        }\n\n        [DataMember(Name = \"duration\")]\n        public int TimeInSeconds { get; set; }\n\n        [DataMember(Name = \"completed_character_id\")]\n        public long CompletedCharacterID { get; set; }\n\n        [DataMember(Name = \"successful_runs\")]\n        public int SuccessfulRuns { get; set; }\n\n        [DataMember(Name = \"start_date\")]\n        private string StartDateJson\n        {\n            get { return startDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    startDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"end_date\")]\n        private string EndDateJson\n        {\n            get { return endDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    endDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"pause_date\")]\n        private string PauseProductionTimeJson\n        {\n            get { return pauseDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    pauseDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"completed_date\")]\n        private string CompletedDateJson\n        {\n            get { return completedDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    completedDate = value.TimeStringToDateTime();\n            }\n        }\n\n        /// <summary>\n        /// The time this job was installed.\n        /// </summary>\n        [IgnoreDataMember]\n        public DateTime StartDate\n        {\n            get\n            {\n                return startDate;\n            }\n        }\n\n        /// <summary>\n        /// The time this job will finish.\n        /// </summary>\n        [IgnoreDataMember]\n        public DateTime EndDate\n        {\n            get\n            {\n                return endDate;\n            }\n        }\n\n        /// <summary>\n        /// The time this job was paused.\n        /// </summary>\n        [IgnoreDataMember]\n        public DateTime PauseDate\n        {\n            get\n            {\n                return pauseDate;\n            }\n        }\n\n        /// <summary>\n        /// The time this job was completed.\n        /// </summary>\n        [IgnoreDataMember]\n        public DateTime CompletedDate\n        {\n            get\n            {\n                return completedDate;\n            }\n        }\n\n        [IgnoreDataMember]\n        public CCPJobCompletedStatus Status\n        {\n            get\n            {\n                return status;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiJumpCloneListItem.cs",
    "content": "using System.Runtime.Serialization;\nusing System.Collections.Generic;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiJumpCloneListItem : EsiLocationBase\n    {\n        [DataMember(Name = \"jump_clone_id\")]\n        public int JumpCloneID { get; set; }\n\n        [DataMember(Name = \"name\", EmitDefaultValue = false, IsRequired = false)]\n        public string Name { get; set; }\n        \n        [DataMember(Name = \"implants\")]\n        public List<int> Implants { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiKillLogAttackersListItem.cs",
    "content": "using EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiKillLogAttackersListItem : EsiCharacterBase\n    {\n        [DataMember(Name = \"damage_done\")]\n        public int DamageDone { get; set; }\n\n        [DataMember(Name = \"final_blow\")]\n        public bool FinalBlow { get; set; }\n\n        [DataMember(Name = \"security_status\")]\n        public double SecurityStatus { get; set; }\n\n        [DataMember(Name = \"weapon_type_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int WeaponTypeID { get; set; }\n\n        public SerializableKillLogAttackersListItem ToXMLItem()\n        {\n            return new SerializableKillLogAttackersListItem()\n            {\n                AllianceID = AllianceID,\n                CorporationID = CorporationID,\n                DamageDone = DamageDone,\n                FactionID = FactionID,\n                FinalBlow = FinalBlow,\n                ID = ID,\n                SecurityStatus = SecurityStatus,\n                ShipTypeID = ShipTypeID,\n                WeaponTypeID = WeaponTypeID\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiKillLogItemListItem.cs",
    "content": "using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiKillLogItemListItem\n    {\n        [DataMember(Name = \"item_type_id\")]\n        public int TypeID { get; set; }\n\n        [DataMember(Name = \"flag\")]\n        public short EVEFlag { get; set; }\n\n        [DataMember(Name = \"quantity_dropped\", EmitDefaultValue = true, IsRequired = false)]\n        public int QtyDropped { get; set; }\n\n        [DataMember(Name = \"quantity_destroyed\", EmitDefaultValue = true, IsRequired = false)]\n        public int QtyDestroyed { get; set; }\n\n        [DataMember(Name = \"singleton\")]\n        public byte Singleton { get; set; }\n\n        // Items inside containers etc, can only be nested one deep\n        [DataMember(Name = \"items\", EmitDefaultValue = false, IsRequired = false)]\n        public List<EsiKillLogItemListItem> Items { get; set; }\n\n        public SerializableKillLogItemListItem ToXMLItem()\n        {\n            var ret = new SerializableKillLogItemListItem()\n            {\n                TypeID = TypeID,\n                QtyDestroyed = QtyDestroyed,\n                QtyDropped = QtyDropped,\n                Singleton = Singleton,\n                EVEFlag = EVEFlag\n            };\n\n            // Nested items\n            if (Items != null)\n                foreach (var item in Items)\n                    ret.Items.Add(item.ToXMLItem());\n\n            return ret;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiKillLogListItem.cs",
    "content": "using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiKillLogListItem\n    {\n        [DataMember(Name = \"killmail_id\")]\n        public int KillID { get; set; }\n\n        [DataMember(Name = \"killmail_hash\")]\n        public string Hash { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiKillLogVictim.cs",
    "content": "using EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public class EsiKillLogVictim : EsiCharacterBase\n    {\n        public EsiKillLogVictim()\n        {\n            Position = EsiPosition.ORIGIN;\n        }\n\n        [DataMember(Name = \"damage_taken\")]\n        public int DamageTaken { get; set; }\n\n        [DataMember(Name = \"items\", EmitDefaultValue = false, IsRequired = false)]\n        public List<EsiKillLogItemListItem> Items { get; set; }\n\n        [DataMember(Name = \"position\", IsRequired = false)]\n        public EsiPosition Position { get; set; }\n\n        public SerializableKillLogVictim ToXMLItem()\n        {\n            // This object has more data, which is handled by EsiAPIKillMail\n            return new SerializableKillLogVictim()\n            {\n                AllianceID = AllianceID,\n                CorporationID = CorporationID,\n                DamageTaken = DamageTaken,\n                FactionID = FactionID,\n                ID = ID,\n                ShipTypeID = ShipTypeID\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiLocationBase.cs",
    "content": "﻿using EVEMon.Common.Enumerations.CCPAPI;\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Base for classes which have a location and location type. Can be instantiated on its\n    /// own or inherited.\n    /// </summary>\n    [DataContract]\n    public class EsiLocationBase\n    {\n        private CCPAPILocationType locationType;\n\n        public EsiLocationBase()\n        {\n            locationType = CCPAPILocationType.Other;\n        }\n\n        [DataMember(Name = \"location_id\")]\n        public long LocationID { get; set; }\n\n        // One of \"station\", \"solar_system\", \"other\"\n        [DataMember(Name = \"location_type\")]\n        private string LocationTypeJson\n        {\n            get\n            {\n                return locationType.ToString().ToLower();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    Enum.TryParse(value, true, out locationType);\n            }\n        }\n\n        [IgnoreDataMember]\n        public CCPAPILocationType LocationType\n        {\n            get\n            {\n                return locationType;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiLoyaltyListItem.cs",
    "content": "﻿using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiLoyaltyListItem\n    {\n        [DataMember(Name = \"corporation_id\")]\n        public int CorpID { get; set; }\n\n        [DataMember(Name = \"loyalty_points\")]\n        public int LoyaltyPoints { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiMailBase.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// The base class of MailBody and MailMessages which has their shared parameters.\n    /// </summary>\n    [DataContract]\n    public abstract class EsiMailBase\n    {\n        private DateTime sentDate;\n\n        public EsiMailBase()\n        {\n            sentDate = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"from\")]\n        public long SenderID { get; set; }\n\n        [DataMember(Name = \"timestamp\")]\n        private string SentDateJson\n        {\n            get { return sentDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    sentDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"subject\", EmitDefaultValue = false, IsRequired = false)]\n        public string Title { get; set; }\n\n        [DataMember(Name = \"labels\", EmitDefaultValue = false, IsRequired = false)]\n        public List<long> Labels { get; set; }\n\n        [DataMember(Name = \"recipients\")]\n        public List<EsiMailRecipientListItem> Recipients { get; set; }\n\n        [IgnoreDataMember]\n        public DateTime SentDate\n        {\n            get\n            {\n                return sentDate;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiMailMessagesListItem.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiMailMessagesListItem : EsiMailBase\n    {\n        [DataMember(Name = \"mail_id\")]\n        public long MessageID { get; set; }\n\n        [DataMember(Name = \"is_read\", IsRequired = false)]\n        public bool Read { get; set; }\n\n        public SerializableMailMessagesListItem ToXMLItem()\n        {\n            var ret = new SerializableMailMessagesListItem()\n            {\n                MessageID = MessageID,\n                SenderID = SenderID,\n                SentDate = SentDate,\n                Title = Title,\n            };\n\n            // Split up the recipients by type\n            if (Recipients != null)\n                foreach (var recipient in Recipients)\n                {\n                    long id = recipient.RecipientID;\n                    switch (recipient.RecipientType)\n                    {\n                    case \"corporation\":\n                    case \"alliance\":\n                        // Alliance\n                        ret.ToCorpOrAllianceID = id;\n                        break;\n                    case \"mailing_list\":\n                        // List\n                        ret.ToListID.Add(id);\n                        break;\n                    case \"character\":\n                        // Character\n                        ret.ToCharacterIDs.Add(id);\n                        break;\n                    default:\n                        // Ignore\n                        break;\n                    }\n                }\n\n            return ret;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiMailRecipientListItem.cs",
    "content": "﻿using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiMailRecipientListItem\n    {\n        [DataMember(Name = \"recipient_id\")]\n        public long RecipientID { get; set; }\n\n        // One of: alliance, character, corporation, mailing_list\n        [DataMember(Name = \"recipient_type\")]\n        public string RecipientType { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiMailingListsListItem.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiMailingListsListItem\n    {\n        [DataMember(Name = \"mailing_list_id\")]\n        public long ID { get; set; }\n\n        [DataMember(Name = \"name\")]\n        public string DisplayName { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiMedalsListItem.cs",
    "content": "using System;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiMedalsListItem\n    {\n        private DateTime issued;\n\n        public EsiMedalsListItem()\n        {\n            issued = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"medal_id\")]\n        public int MedalID { get; set; }\n\n        [DataMember(Name = \"reason\")]\n        public string Reason { get; set; }\n\n        // One of: public, private\n        [DataMember(Name = \"status\")]\n        public string Status { get; set; }\n\n        [DataMember(Name = \"issuer_id\")]\n        public int IssuerID { get; set; }\n\n        [DataMember(Name = \"date\")]\n        public string IssuedJson\n        {\n            get { return issued.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    issued = value.TimeStringToDateTime();\n            }\n        }\n        \n        [DataMember(Name = \"corporation_id\")]\n        public int CorporationID { get; set; }\n\n        [DataMember(Name = \"title\")]\n        public string Title { get; set; }\n\n        [DataMember(Name = \"description\")]\n        public string Description { get; set; }\n\n        // Medal graphics are not used in EVEMon\n\n        [IgnoreDataMember]\n        public DateTime Issued\n        {\n            get\n            {\n                return issued;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiNotificationsListItem.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Service;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiNotificationsListItem\n    {\n        private CCPAPIContactType senderType;\n        private DateTime sentDate;\n\n        public EsiNotificationsListItem()\n        {\n            senderType = CCPAPIContactType.Other;\n            sentDate = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"notification_id\")]\n        public long NotificationID { get; set; }\n\n        [DataMember(Name = \"type\")]\n        public string Type { get; set; }\n\n        [DataMember(Name = \"sender_id\")]\n        public int SenderID { get; set; }\n\n        [DataMember(Name = \"is_read\", IsRequired = false)]\n        public bool Read { get; set; }\n\n        [DataMember(Name = \"text\", EmitDefaultValue = false, IsRequired = false)]\n        public string NotificationText { get; set; }\n\n        [DataMember(Name = \"sender_type\")]\n        private string SenderTypeJson\n        {\n            get\n            {\n                return senderType.ToString().ToLower();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    Enum.TryParse(value, true, out senderType);\n            }\n        }\n\n        [IgnoreDataMember]\n        public CCPAPIContactType SenderType\n        {\n            get\n            {\n                return senderType;\n            }\n        }\n        \n        [DataMember(Name = \"timestamp\")]\n        private string SentDateJson\n        {\n            get { return sentDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    sentDate = value.TimeStringToDateTime();\n            }\n        }\n        \n        [IgnoreDataMember]\n        public DateTime SentDate\n        {\n            get\n            {\n                return sentDate;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiOrderListItem.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\nusing EVEMon.Common.Constants;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Represents a market order\n    /// </summary>\n    [DataContract]\n    public sealed class EsiOrderListItem\n    {\n        private DateTime issued;\n\n        public EsiOrderListItem()\n        {\n            issued = DateTime.MinValue;\n        }\n\n        /// <summary>\n        /// Unique order ID for this order. Note that these are not guaranteed to be unique forever, they can recycle. \n        /// But they are unique for the purpose of one data pull. \n        /// </summary>\n        [DataMember(Name = \"order_id\")]\n        public long OrderID { get; set; }\n\n        /// <summary>\n        /// The item ID.\n        /// </summary>\n        [DataMember(Name = \"type_id\")]\n        public int ItemID { get; set; }\n\n        /// <summary>\n        /// The location ID.\n        /// </summary>\n        [DataMember(Name = \"location_id\")]\n        public long StationID { get; set; }\n\n        /// <summary>\n        /// The initial volume of the order.\n        /// </summary>\n        [DataMember(Name = \"volume_total\")]\n        public int InitialVolume { get; set; }\n\n        /// <summary>\n        /// The remaining volume of the order.\n        /// </summary>\n        [DataMember(Name = \"volume_remain\")]\n        public int RemainingVolume { get; set; }\n\n        /// <summary>\n        /// The minimum volume a buyer can buy.\n        /// </summary>\n        [DataMember(Name = \"min_volume\")]\n        public int MinVolume { get; set; }\n\n        /// <summary>\n        /// 0 = open/active, 1 = closed, 2 = expired (or fulfilled), 3 = cancelled, 4 = pending, 5 = character deleted.\n        /// </summary>\n        public int State { get; set; }\n\n        [DataMember(Name = \"state\", EmitDefaultValue = false, IsRequired = false)]\n        private string StateJson\n        {\n            get\n            {\n                switch (State)\n                {\n                case 1:\n                    return \"closed\";\n                case 2:\n                    return \"expired\";\n                case 3:\n                    return \"cancelled\";\n                default:\n                    // Active in ESI is simply not shown\n                    return default(string);\n                }\n            }\n            set\n            {\n                switch (value)\n                {\n                case \"active\":\n                case \"\":\n                case null:\n                    State = 0;\n                    break;\n                case \"closed\":\n                    State = 1;\n                    break;\n                case \"expired\":\n                    State = 2;\n                    break;\n                case \"cancelled\":\n                    State = 3;\n                    break;\n                default:\n                    break;\n                }\n            }\n        }\n\n        /// <summary>\n        /// The range this order is good for. For sell orders, this is always 32767. \n        /// For buy orders, allowed values are: -1 = station, 0 = solar system, 1 = 1 jump, 2 = 2 jumps, ..., 32767 = region.\n        /// </summary>\n        [DataMember(Name = \"range\")]\n        private string RangeJson\n        {\n            get\n            {\n                int jumps = Range;\n                if (jumps <= -1)\n                    return \"station\";\n                if (jumps == 0)\n                    return \"solarsystem\";\n                if (jumps >= 41)\n                    return \"region\";\n                return jumps.ToString();\n            }\n            set\n            {\n                int jumps;\n                // Converts to legacy XML value\n                switch (value)\n                {\n                case \"station\":\n                    Range = -1;\n                    break;\n                case \"solarsystem\":\n                    Range = 0;\n                    break;\n                case \"region\":\n                    Range = EveConstants.RegionRange;\n                    break;\n                default:\n                    // Cannot actually fail, but the exception would suck\n                    if (value.TryParseInv(out jumps) && jumps > 0 && jumps < EveConstants.\n                            RegionRange)\n                        Range = jumps;\n                    break;\n                }\n            }\n        }\n\n        [IgnoreDataMember]\n        public int Range { get; set; }\n\n        /// <summary>\n        /// Which division this order is using as its account. \n        /// Always 0 for characters, within 1 to 7 for corporations.\n        /// </summary>\n        [DataMember(Name = \"wallet_division\", EmitDefaultValue = false, IsRequired = false)]\n        public int Division { get; set; }\n\n        /// <summary>\n        /// How many days this order is good for. Expiration is issued + duration in days. \n        /// </summary>\n        [DataMember(Name = \"duration\")]\n        public int Duration { get; set; }\n\n        /// <summary>\n        /// How much ISK is in escrow, for buy orders.\n        /// </summary>\n        [DataMember(Name = \"escrow\", EmitDefaultValue = false, IsRequired = false)]\n        public decimal Escrow { get; set; }\n\n        /// <summary>\n        /// The cost per unit for this order.\n        /// </summary>\n        [DataMember(Name = \"price\")]\n        public decimal UnitaryPrice { get; set; }\n\n        /// <summary>\n        /// True if this is a buy order, false otherwise.\n        /// </summary>\n        [DataMember(Name = \"is_buy_order\")]\n        public bool IsBuyOrder { get; set; }\n\n        /// <summary>\n        /// The character ID who issued this order.\n        /// </summary>\n        [DataMember(Name = \"issued_by\", EmitDefaultValue = false, IsRequired = false)]\n        public long IssuedBy { get; set; }\n\n        /// <summary>\n        /// Whether this order is for a corporation, made on behalf of a player.\n        /// This is slightly different from contract and industry job behavior (CCP why?)\n        ///  [I can tell that these endpoints were written by different people with slightly\n        ///  different specs]\n        /// </summary>\n        [DataMember(Name = \"is_corporation\", EmitDefaultValue = false, IsRequired = false)]\n        public bool IsCorporation { get; set; }\n\n        /// <summary>\n        /// The time this order was issued.\n        /// </summary>\n        [IgnoreDataMember]\n        public DateTime Issued\n        {\n            get\n            {\n                return issued;\n            }\n        }\n        \n        [DataMember(Name = \"issued\")]\n        private string IssuedJson\n        {\n            get { return issued.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    issued = value.TimeStringToDateTime();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiPlanetaryColonyListItem.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations.CCPAPI;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiPlanetaryColonyListItem\n    {\n        public EsiPlanetaryColonyListItem()\n        {\n            LastUpdate = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"planet_id\")]\n        public int PlanetID { get; set; }\n\n        // One of: temperate, barren, oceanic, ice, gas, lava, storm, plasma\n        [DataMember(Name = \"planet_type\")]\n        private string PlanetTypeJson { get; set; }\n\n        [IgnoreDataMember]\n        public int PlanetType\n        {\n            get\n            {\n                // Determine planet type from type name\n                // Planet type is a type ID\n                CCPAPIPlanetTypes type = CCPAPIPlanetTypes.Unknown;\n                if (!string.IsNullOrEmpty(PlanetTypeJson))\n                    Enum.TryParse(PlanetTypeJson, true, out type);\n                return (int)type;\n            }\n        }\n\n        [DataMember(Name = \"solar_system_id\")]\n        public int SolarSystemID { get; set; }\n\n        [DataMember(Name = \"owner_id\")]\n        public long OwnerID { get; set; }\n\n        [DataMember(Name = \"last_update\")]\n        public string LastUpdateJson\n        {\n            get { return LastUpdate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    LastUpdate = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"upgrade_level\")]\n        public int UpgradeLevel { get; set; }\n\n        [DataMember(Name = \"num_pins\")]\n        public int NumberOfPins { get; set; }\n\n\t\t[IgnoreDataMember]\n\t\tpublic DateTime LastUpdate { get; set; }\n\t}\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiPlanetaryContentsListItem.cs",
    "content": "﻿using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiPlanetaryContentsListItem\n    {\n        [DataMember(Name = \"type_id\")]\n        public int TypeID { get; set; }\n\n        [DataMember(Name = \"amount\")]\n        public int Amount { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiPlanetaryExtractorDetails.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiPlanetaryExtractorDetails\n    {\n        [DataMember(Name = \"product_type_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int ProductTypeID { get; set; }\n\n        [DataMember(Name = \"heads\")]\n        public List<EsiPlanetaryExtractorHead> Heads { get; set; }\n\n        // in seconds\n        [DataMember(Name = \"cycle_time\", EmitDefaultValue = false, IsRequired = false)]\n        public int CycleTime { get; set; }\n\n        [DataMember(Name = \"head_radius\", EmitDefaultValue = false, IsRequired = false)]\n        public double HeadRadius { get; set; }\n\n        [DataMember(Name = \"qty_per_cycle\", EmitDefaultValue = false, IsRequired = false)]\n        public int QuantityPerCycle { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiPlanetaryExtractorHead.cs",
    "content": "﻿using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiPlanetaryExtractorHead\n    {\n        [DataMember(Name = \"head_id\")]\n        public int HeadID { get; set; }\n\n        [DataMember(Name = \"longitude\")]\n        public double Longitude { get; set; }\n\n        [DataMember(Name = \"latitude\")]\n        public double Latitude { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiPlanetaryFactoryDetails.cs",
    "content": "﻿using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiPlanetaryFactoryDetails\n    {\n        [DataMember(Name = \"schematic_id\")]\n        public int SchematicID { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiPlanetaryLink.cs",
    "content": "﻿using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiPlanetaryLink\n    {\n        [DataMember(Name = \"source_pin_id\")]\n        public long SourcePinID { get; set; }\n\n        [DataMember(Name = \"destination_pin_id\")]\n        public long DestinationPinID { get; set; }\n\n        [DataMember(Name = \"link_level\")]\n        public short LinkLevel { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiPlanetaryPin.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\nusing System.Collections.Generic;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiPlanetaryPin\n    {\n        private DateTime expiryTime;\n        private DateTime installTime;\n        private DateTime lastCycleStart;\n\n        public EsiPlanetaryPin()\n        {\n            expiryTime = DateTime.MinValue;\n            installTime = DateTime.MinValue;\n            lastCycleStart = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"pin_id\")]\n        public long PinID { get; set; }\n\n        [DataMember(Name = \"longitude\")]\n        public double Longitude { get; set; }\n\n        [DataMember(Name = \"latitude\")]\n        public double Latitude { get; set; }\n\n        [DataMember(Name = \"type_id\")]\n        public int TypeID { get; set; }\n        \n        [DataMember(Name = \"schematic_id\", EmitDefaultValue = false, IsRequired = false)]\n        public int SchematicID { get; set; }\n\n        [DataMember(Name = \"extractor_details\", EmitDefaultValue = false, IsRequired = false)]\n        public EsiPlanetaryExtractorDetails ExtractorDetails { get; set; }\n\n        [DataMember(Name = \"factory_details\", EmitDefaultValue = false, IsRequired = false)]\n        public EsiPlanetaryFactoryDetails FactoryDetails { get; set; }\n\n        [DataMember(Name = \"contents\", EmitDefaultValue = false, IsRequired = false)]\n        public List<EsiPlanetaryContentsListItem> Contents { get; set; }\n\n        [DataMember(Name = \"last_cycle_start\", EmitDefaultValue = false, IsRequired = false)]\n        public string LastCycleStartJson\n        {\n            get { return lastCycleStart.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    lastCycleStart = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"install_time\", EmitDefaultValue = false, IsRequired = false)]\n        private string InstallTimeJson\n        {\n            get { return installTime.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    installTime = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"expiry_time\", EmitDefaultValue = false, IsRequired = false)]\n        private string ExpiryTimeJson\n        {\n            get { return expiryTime.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    expiryTime = value.TimeStringToDateTime();\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime LastCycleStart\n        {\n            get\n            {\n                return lastCycleStart;\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime InstallTime\n        {\n            get\n            {\n                return installTime;\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime ExpiryTime\n        {\n            get\n            {\n                return expiryTime;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiPlanetaryRoute.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiPlanetaryRoute\n    {\n        [DataMember(Name = \"route_id\")]\n        public long RouteID { get; set; }\n\n        [DataMember(Name = \"source_pin_id\")]\n        public long SourcePinID { get; set; }\n\n        [DataMember(Name = \"destination_pin_id\")]\n        public long DestinationPinID { get; set; }\n\n        [DataMember(Name = \"content_type_id\")]\n        public long ContentTypeID { get; set; }\n\n        [DataMember(Name = \"quantity\")]\n        public int Quantity { get; set; }\n\n        [DataMember(Name = \"waypoints\", EmitDefaultValue = false, IsRequired = false)]\n        public List<long> Waypoints { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiPosition.cs",
    "content": "﻿using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Refers to an x/y/z coordinate within a system.\n    /// </summary>\n    [DataContract]\n    public sealed class EsiPosition\n    {\n        [IgnoreDataMember]\n        public static readonly EsiPosition ORIGIN = new EsiPosition();\n\n        public EsiPosition() : this(0.0, 0.0, 0.0) { }\n        public EsiPosition(double x, double y, double z)\n        {\n            X = x;\n            Y = y;\n            Z = z;\n        }\n\n        [DataMember(Name = \"x\")]\n        public double X { get; set; }\n\n        [DataMember(Name = \"y\")]\n        public double Y { get; set; }\n\n        [DataMember(Name = \"z\")]\n        public double Z { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiRefTypeString.cs",
    "content": "﻿namespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Used to convert string ref types for wallet transactions to the old integer format.\n    /// </summary>\n    public enum EsiRefTypeString\n    {\n        none = 0,\n        player_trading = 1,\n        market_transaction = 2,\n        gm_cash_transfer = 3,\n        mission_reward = 7,\n        clone_activation = 8,\n        inheritance = 9,\n        player_donation = 10,\n        corporation_payment = 11,\n        docking_fee = 12,\n        office_rental_fee = 13,\n        factory_slot_rental_fee = 14,\n        repair_bill = 15,\n        bounty = 16,\n        bounty_prize = 17,\n        insurance = 19,\n        mission_expiration = 20,\n        mission_completion = 21,\n        shares = 22,\n        courier_mission_escrow = 23,\n        mission_cost = 24,\n        agent_miscellaneous = 25,\n        lp_store = 26,\n        agent_location_services = 27,\n        agent_donation = 28,\n        agent_security_services = 29,\n        agent_mission_collateral_paid = 30,\n        agent_mission_collateral_refunded = 31,\n        agents_preward = 32,\n        agent_mission_reward = 33,\n        agent_mission_time_bonus_reward = 34,\n        cspa = 35,\n        cspaofflinerefund = 36,\n        corporation_account_withdrawal = 37,\n        corporation_dividend_payment = 38,\n        corporation_registration_fee = 39,\n        corporation_logo_change_cost = 40,\n        release_of_impounded_property = 41,\n        market_escrow = 42,\n        agent_services_rendered = 43,\n        market_fine_paid = 44,\n        corporation_liquidation = 45,\n        brokers_fee = 46,\n        corporation_bulk_payment = 47,\n        alliance_registration_fee = 48,\n        war_fee = 49,\n        alliance_maintainance_fee = 50,\n        contraband_fine = 51,\n        clone_transfer = 52,\n        acceleration_gate_fee = 53,\n        transaction_tax = 54,\n        jump_clone_installation_fee = 55,\n        manufacturing = 56,\n        researching_technology = 57,\n        researching_time_productivity = 58,\n        researching_material_productivity = 59,\n        copying = 60,\n        reverse_engineering = 62,\n        contract_auction_bid = 63,\n        contract_auction_bid_refund = 64,\n        contract_collateral = 65,\n        contract_reward_refund = 66,\n        contract_auction_sold = 67,\n        contract_reward = 68,\n        contract_collateral_refund = 69,\n        contract_collateral_payout = 70,\n        contract_price = 71,\n        contract_brokers_fee = 72,\n        contract_sales_tax = 73,\n        contract_deposit = 74,\n        contract_deposit_sales_tax = 75,\n        contract_auction_bid_corp = 77,\n        contract_collateral_deposited_corp = 78,\n        contract_price_payment_corp = 79,\n        contract_brokers_fee_corp = 80,\n        contract_deposit_corp = 81,\n        contract_deposit_refund = 82,\n        contract_reward_deposited = 83,\n        contract_reward_deposited_corp = 84,\n        bounty_prizes = 85,\n        advertisement_listing_fee = 86,\n        medal_creation = 87,\n        medal_issued = 88,\n        dna_modification_fee = 90,\n        sovereignity_bill = 91,\n        bounty_prize_corporation_tax = 92,\n        agent_mission_reward_corporation_tax = 93,\n        agent_mission_time_bonus_reward_corporation_tax = 94,\n        upkeep_adjustment_fee = 95,\n        planetary_import_tax = 96,\n        planetary_export_tax = 97,\n        planetary_construction = 98,\n        corporate_reward_payout = 99,\n        bounty_surcharge = 101,\n        contract_reversal = 102,\n        corporate_reward_tax = 103,\n        store_purchase = 106,\n        store_purchase_refund = 107,\n        structure_gate_jump = 139,\n        datacore_fee = 112,\n        war_fee_surrender = 113,\n        war_ally_contract = 114,\n        bounty_reimbursement = 115,\n        kill_right_fee = 116,\n        security_processing_fee = 117,\n        industry_job_tax = 120,\n        infrastructure_hub_maintenance = 122,\n        asset_safety_recovery_tax = 123,\n        opportunity_reward = 124,\n        project_discovery_reward = 125,\n        project_discovery_tax = 126,\n        reprocessing_tax = 127,\n        jump_clone_activation_fee = 128,\n        operation_bonus = 129,\n        resource_wars_reward = 131,\n        duel_wager_escrow = 132,\n        duel_wager_payment = 133,\n        duel_wager_refund = 134,\n        reaction = 135,\n        skill_purchase = 136,\n        item_trader_payment = 137\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiResearchListItem.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiResearchListItem\n    {\n        private DateTime researchStart;\n\n        public EsiResearchListItem()\n        {\n            researchStart = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"agent_id\")]\n        public int AgentID { get; set; }\n\n        [DataMember(Name = \"skill_type_id\")]\n        public int SkillID { get; set; }\n\n        [DataMember(Name = \"started_at\")]\n        public string ResearchStartDateJson\n        {\n            get { return researchStart.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    researchStart = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"points_per_day\")]\n        public double PointsPerDay { get; set; }\n\n        [DataMember(Name = \"remainder_points\")]\n        public float RemainderPoints { get; set; }\n\n        /// <summary>\n        /// The time this research was started.\n        /// </summary>\n        [IgnoreDataMember]\n        public DateTime ResearchStartDate\n        {\n            get\n            {\n                return researchStart;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiResult.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Net;\nusing System.Net;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Wraps the results returned from an ESI request.\n    /// </summary>\n    public sealed class EsiResult<T> : JsonResult<T>, IAPIResult\n    {\n        /// <summary>\n        /// An interval intended to compensate for clock drift and network latency by allowing\n        /// a few additional seconds for ESI data expiry. Measured in seconds.\n        /// </summary>\n        private static readonly double CACHE_JITTER = 5.0;\n\n        #region Helpers\n\n        /// <summary>\n        /// Calculates the cached until time based on the response parameters. Uses the expires\n        /// date if provided and in the future; otherwise calculates a default expiration to\n        /// avoid spamming the server.\n        /// </summary>\n        /// <param name=\"response\">The server response.</param>\n        private static DateTime GetCacheTimerFromResponse(ResponseParams response)\n        {\n            DateTime cachedUntil;\n            DateTimeOffset? expires = response.Expires;\n            // If there was an error or no cache timer provided, retry after error cache time\n            if (expires == null)\n                cachedUntil = GetErrorCacheTime();\n            else\n            {\n                DateTimeOffset ccpCacheTime = ((DateTimeOffset)expires), serverTime =\n                    response.Time ?? DateTimeOffset.UtcNow;\n                // Ensure that cache date is not in the past\n                if (ccpCacheTime < serverTime)\n                    ccpCacheTime = serverTime.AddSeconds(CACHE_JITTER);\n                else\n                    ccpCacheTime = ccpCacheTime.AddSeconds(CACHE_JITTER);\n                cachedUntil = ccpCacheTime.UtcDateTime;\n            }\n            return cachedUntil;\n        }\n\n        /// <summary>\n        /// Reports the time to be used for caching if an error occurs. This prevents spamming\n        /// CCP on error requests and running out the error limit.\n        /// </summary>\n        /// <returns>The time when an error request expires and should be retried</returns>\n        private static DateTime GetErrorCacheTime() => DateTime.UtcNow.AddMinutes(2.0);\n\n        #endregion\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Constructor from a response and result.\n        /// </summary>\n        public EsiResult(ResponseParams response, T result = default(T)) : base(response,\n            result)\n        {\n            CachedUntil = GetCacheTimerFromResponse(response);\n            HasData = response.ResponseCode != (int)HttpStatusCode.NotModified;\n        }\n        \n        /// <summary>\n        /// Constructor from an http exception\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        public EsiResult(HttpWebClientServiceException exception) : base(exception)\n        {\n            CachedUntil = GetErrorCacheTime();\n            HasData = false;\n        }\n        \n        /// <summary>\n        /// Constructor from wrapping a JSON result.\n        /// </summary>\n        /// <param name=\"wrapped\">The result to wrap.</param>\n        public EsiResult(JsonResult<T> wrapped) : base(wrapped)\n        {\n            CachedUntil = GetCacheTimerFromResponse(wrapped.Response);\n            HasData = wrapped.ResponseCode != (int)HttpStatusCode.NotModified;\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        public DateTime CachedUntil { get; }\n\n        public int ErrorCode => ResponseCode;\n\n        public bool HasData { get; }\n\n        #endregion\n        \n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiSkillListItem.cs",
    "content": "﻿using EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    /// <summary>\n    /// Represents a skill\n    /// </summary>\n    [DataContract]\n    public sealed class EsiSkillListItem\n    {\n        [DataMember(Name = \"skill_id\")]\n        public int ID { get; set; }\n\n        [DataMember(Name = \"trained_skill_level\")]\n        public int Level { get; set; }\n\n        [DataMember(Name = \"active_skill_level\")]\n        public int ActiveLevel { get; set; }\n\n        [DataMember(Name = \"skillpoints_in_skill\")]\n        public long Skillpoints { get; set; }\n\n        public SerializableCharacterSkill ToXMLItem()\n        {\n            return new SerializableCharacterSkill()\n            {\n                ID = ID,\n                Level = Level,\n                ActiveLevel = ActiveLevel,\n                Skillpoints = Skillpoints,\n                OwnsBook = true,\n                IsKnown = true\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiSkillQueueListItem.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiSkillQueueListItem : ISynchronizableWithLocalClock\n    {\n        private DateTime endTime;\n        private DateTime startTime;\n\n        public EsiSkillQueueListItem()\n        {\n            endTime = DateTime.MaxValue;\n            startTime = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"skill_id\")]\n        public int ID { get; set; }\n\n        [DataMember(Name = \"finished_level\")]\n        public int Level { get; set; }\n\n        [DataMember(Name = \"training_start_sp\")]\n        public int StartSP { get; set; }\n\n        [DataMember(Name = \"level_start_sp\")]\n        public int LevelStartSP { get; set; }\n\n        [DataMember(Name = \"level_end_sp\")]\n        public int EndSP { get; set; }\n\n        [DataMember(Name = \"queue_position\")]\n        public int QueuePosition { get; set; }\n\n        [DataMember(Name = \"start_date\")]\n        private string CCPStartTime\n        {\n            get\n            {\n                return startTime.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    startTime = value.TimeStringToDateTime();\n            }\n        }\n\n        [DataMember(Name = \"finish_date\")]\n        private string CCPEndTime\n        {\n            get\n            {\n                return endTime.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    endTime = value.TimeStringToDateTime();\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime StartTime\n        {\n            get\n            {\n                return startTime;\n            }\n            set\n            {\n                if (value > DateTime.MinValue)\n                    startTime = value;\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime EndTime\n        {\n            get\n            {\n                return endTime;\n            }\n            set\n            {\n                if (value > DateTime.MinValue)\n                    endTime = value;\n            }\n        }\n\n        public SerializableQueuedSkill ToXMLItem()\n        {\n            return new SerializableQueuedSkill()\n            {\n                EndTime = EndTime,\n                StartTime = StartTime,\n                EndSP = EndSP,\n                StartSP = StartSP,\n                ID = ID,\n                Level = Level\n            };\n        }\n\n        #region ISynchronizableWithLocalClock Members\n\n        /// <summary>\n        /// Synchronizes the stored times with local clock\n        /// </summary>\n        /// <param name=\"drift\"></param>\n        void ISynchronizableWithLocalClock.SynchronizeWithLocalClock(TimeSpan drift)\n        {\n            if (startTime > DateTime.MinValue)\n                startTime -= drift;\n\n            if (endTime > DateTime.MinValue)\n                endTime -= drift;\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiSovStructureListItem.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiSovStructureListItem\n    {\n        private DateTime vulnEnd;\n        private DateTime vulnStart;\n\n        public EsiSovStructureListItem()\n        {\n            vulnEnd = DateTime.MinValue;\n            vulnStart = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"alliance_id\")]\n        public long AllianceID { get; set; }\n\n        [DataMember(Name = \"solar_system_id\")]\n        public int SolarSystemID { get; set; }\n\n        [DataMember(Name = \"structure_id\")]\n        public long ID { get; set; }\n\n        [DataMember(Name = \"structure_type_id\")]\n        public int StructureTypeID { get; set; }\n\n        [DataMember(Name = \"vulnerability_occupancy_level\", EmitDefaultValue = false, IsRequired = false)]\n        public double ADM { get; set; }\n\n        [DataMember(Name = \"vulnerable_start_time\", EmitDefaultValue = false, IsRequired = false)]\n        private string VulnStartJson\n        {\n            get\n            {\n                return vulnStart.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    vulnStart = value.TimeStringToDateTime();\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime VulnStart\n        {\n            get\n            {\n                return vulnStart;\n            }\n        }\n\n        [DataMember(Name = \"vulnerable_end_time\", EmitDefaultValue = false, IsRequired = false)]\n        private string VulnEndJson\n        {\n            get\n            {\n                return vulnEnd.DateTimeToTimeString();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    vulnEnd = value.TimeStringToDateTime();\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime VulnEnd\n        {\n            get\n            {\n                return vulnEnd;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiStandingsListItem.cs",
    "content": "using EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiStandingsListItem\n    {\n        [DataMember(Name = \"from_id\")]\n        public int ID { get; set; }\n\n        // One of: agent, npc_corp, faction\n        [DataMember(Name = \"from_type\")]\n        private string GroupJson\n        {\n            get\n            {\n                // Convert from EVEmon enumeration\n                switch (Group)\n                {\n                case StandingGroup.NPCCorporations:\n                    return \"npc_corp\";\n                case StandingGroup.Agents:\n                    return \"agent\";\n                case StandingGroup.Factions:\n                    return \"faction\";\n                default:\n                    return string.Empty;\n                }\n            }\n            set\n            {\n                // Convert to EVEmon enumeration\n                switch (value)\n                {\n                case \"npc_corp\":\n                    Group = StandingGroup.NPCCorporations;\n                    break;\n                case \"agent\":\n                    Group = StandingGroup.Agents;\n                    break;\n                case \"faction\":\n                    Group = StandingGroup.Factions;\n                    break;\n                default:\n                    break;\n                }\n            }\n        }\n\n        [DataMember(Name = \"standing\")]\n        public double StandingValue { get; set; }\n\n        [IgnoreDataMember]\n        public StandingGroup Group { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiWalletJournalListItem.cs",
    "content": "using System;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\nusing EVEMon.Common.Serialization.Eve;\nusing System.Globalization;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Constants;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiWalletJournalListItem\n    {\n        private DateTime date;\n        private EsiRefTypeString refType;\n\n        public EsiWalletJournalListItem()\n        {\n            date = DateTime.MinValue;\n            refType = EsiRefTypeString.none;\n        }\n\n        [DataMember(Name = \"id\")]\n        public long ID { get; set; }\n\n        // Can be one of 117 items, see https://gist.github.com/ccp-zoetrope/c03db66d90c2148724c06171bc52e0ec\n        // to convert to integer\n        [DataMember(Name = \"ref_type\")]\n        private string RefTypeJson\n        {\n            get\n            {\n                return refType.ToString().ToLower();\n            }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    Enum.TryParse(value, true, out refType);\n            }\n        }\n\n        [IgnoreDataMember]\n        public int RefTypeID\n        {\n            get\n            {\n                return (int)refType;\n            }\n        }\n\n        [DataMember(Name = \"context_id\", EmitDefaultValue = false, IsRequired = false)]\n        public long ContextID { get; set; }\n\n        // One of: structure_id, station_id, market_transaction_id, character_id, type_id,\n        // corporation_id, alliance_id, eve_system, industry_job_id, contract_id, planet_id,\n        // system_id\n        [DataMember(Name = \"context_id_type\", EmitDefaultValue = false, IsRequired = false)]\n        private string ContextIDType { get; set; }\n\n        [DataMember(Name = \"first_party_id\", EmitDefaultValue = false, IsRequired = false)]\n        public long OwnerID1 { get; set; }\n        \n        [DataMember(Name = \"second_party_id\", EmitDefaultValue = false, IsRequired = false)]\n        public long OwnerID2 { get; set; }\n        \n        [DataMember(Name = \"amount\", IsRequired = false)]\n        public decimal Amount { get; set; }\n\n        [DataMember(Name = \"balance\", IsRequired = false)]\n        public decimal Balance { get; set; }\n\n        [DataMember(Name = \"description\", EmitDefaultValue = false, IsRequired = false)]\n        public string Description { get; set; }\n\n        [DataMember(Name = \"reason\", EmitDefaultValue = false, IsRequired = false)]\n        public string Reason { get; set; }\n\n        [DataMember(Name = \"tax_receiver_id\", EmitDefaultValue = false, IsRequired = false)]\n        public long TaxReceiverID { get; set; }\n\n        [DataMember(Name = \"tax\", EmitDefaultValue = false, IsRequired = false)]\n        public decimal TaxAmount { get; set; }\n        \n        [DataMember(Name = \"date\")]\n        private string DateJson\n        {\n            get { return date.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    date = value.TimeStringToDateTime();\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime Date\n        {\n            get\n            {\n                return date;\n            }\n        }\n        \n        public SerializableWalletJournalListItem ToXMLItem()\n        {\n            // This is never actually used in EveMon!\n            string argName1 = string.Empty;\n            long argId1 = 0L;\n            \n            // Populate arguments from the extra data based on the ref type\n            // See http://eveonline-third-party-documentation.readthedocs.io/en/latest/xmlapi/constants.html#reference-type\n            switch (refType)\n            {\n            case EsiRefTypeString.player_trading:\n                argId1 = ContextID;\n                break;\n            case EsiRefTypeString.market_transaction:\n                argName1 = ContextID.ToString(CultureInfo.InvariantCulture);\n                break;\n            case EsiRefTypeString.office_rental_fee:\n            case EsiRefTypeString.brokers_fee:\n            case EsiRefTypeString.jump_clone_installation_fee:\n            case EsiRefTypeString.jump_clone_activation_fee:\n            case EsiRefTypeString.reprocessing_tax:\n                argName1 = \"EVE System\";\n                argId1 = 1L;\n                break;\n            case EsiRefTypeString.bounty_prize:\n                argId1 = ContextID;\n                break;\n            case EsiRefTypeString.insurance:\n                argName1 = ContextID.ToString(CultureInfo.InvariantCulture);\n                break;\n            case EsiRefTypeString.agent_mission_reward:\n            case EsiRefTypeString.agent_mission_time_bonus_reward:\n            case EsiRefTypeString.cspa:\n            case EsiRefTypeString.corporation_account_withdrawal:\n            case EsiRefTypeString.medal_creation:\n            case EsiRefTypeString.medal_issued:\n                argId1 = ContextID;\n                break;\n            case EsiRefTypeString.corporation_logo_change_cost:\n                argId1 = ContextID;\n                break;\n            case EsiRefTypeString.alliance_maintainance_fee:\n                argId1 = ContextID;\n                break;\n            case EsiRefTypeString.manufacturing:\n                argName1 = ContextID.ToString(CultureInfo.InvariantCulture);\n                break;\n            case EsiRefTypeString.contract_auction_bid:\n            case EsiRefTypeString.contract_auction_bid_refund:\n            case EsiRefTypeString.contract_price:\n            case EsiRefTypeString.contract_brokers_fee:\n            case EsiRefTypeString.contract_sales_tax:\n            case EsiRefTypeString.contract_deposit:\n            case EsiRefTypeString.contract_price_payment_corp:\n            case EsiRefTypeString.contract_brokers_fee_corp:\n            case EsiRefTypeString.contract_deposit_corp:\n            case EsiRefTypeString.contract_deposit_refund:\n                argName1 = ContextID.ToString(CultureInfo.InvariantCulture);\n                break;\n            case EsiRefTypeString.bounty_prizes:\n                argId1 = ContextID;\n                break;\n            case EsiRefTypeString.planetary_import_tax:\n            case EsiRefTypeString.planetary_export_tax:\n                argId1 = ContextID;\n                // Planet name available from geography\n                argName1 = StaticGeography.GetPlanetByID((int)ContextID)?.Name ??\n                    EveMonConstants.UnknownText;\n                break;\n            case EsiRefTypeString.industry_job_tax:\n                argId1 = ContextID;\n                break;\n            default:\n                // Empty\n                break;\n            }\n\n            return new SerializableWalletJournalListItem()\n            {\n                Amount = Amount,\n                ArgID1 = argId1,\n                ArgName1 = argName1,\n                Balance = Balance,\n                Date = Date,\n                ID = ID,\n                Reason = Reason,\n                OwnerID1 = OwnerID1,\n                OwnerID2 = OwnerID2,\n                RefTypeID = RefTypeID,\n                TaxAmount = TaxAmount,\n                TaxReceiverID = TaxReceiverID\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Esi/EsiWalletTransactionsListItem.cs",
    "content": "using System;\nusing EVEMon.Common.Extensions;\nusing System.Runtime.Serialization;\nusing EVEMon.Common.Serialization.Eve;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Serialization.Esi\n{\n    [DataContract]\n    public sealed class EsiWalletTransactionsListItem\n    {\n        private DateTime transactionDate;\n\n        public EsiWalletTransactionsListItem()\n        {\n            transactionDate = DateTime.MinValue;\n        }\n\n        [DataMember(Name = \"transaction_id\")]\n        public long ID { get; set; }\n\n        [DataMember(Name = \"journal_ref_id\")]\n        public long JournalTransactionID { get; set; }\n\n        [DataMember(Name = \"quantity\")]\n        public int Quantity { get; set; }\n\n        [DataMember(Name = \"type_id\")]\n        public int TypeID { get; set; }\n\n        [DataMember(Name = \"unit_price\")]\n        public decimal Price { get; set; }\n\n        [DataMember(Name = \"client_id\")]\n        public int ClientID { get; set; }\n\n        [DataMember(Name = \"location_id\")]\n        public long StationID { get; set; }\n        \n        [DataMember(Name = \"is_buy\")]\n        public bool Buy { get; set; }\n\n        [DataMember(Name = \"is_personal\")]\n        public bool Personal { get; set; }\n\n        [DataMember(Name = \"date\")]\n        private string TransactionDateJson\n        {\n            get { return transactionDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    transactionDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [IgnoreDataMember]\n        public DateTime TransactionDate\n        {\n            get\n            {\n                return transactionDate;\n            }\n        }\n\n        public SerializableWalletTransactionsListItem ToXMLItem()\n        {\n            return new SerializableWalletTransactionsListItem()\n            {\n                ClientID = ClientID,\n                ID = ID,\n                JournalTransactionID = JournalTransactionID,\n                Price = Price,\n                Quantity = Quantity,\n                StationID = StationID,\n                TransactionDate = TransactionDate,\n                TransactionType = Buy ? \"buy\" : \"sell\",\n                TransactionFor = Personal ? \"personal\" : \"corporate\",\n                TypeID = TypeID,\n                TypeName = StaticItems.GetItemName(TypeID)\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/CCPAPIError.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// CCP API error message handling - for application error messages within the xml.\n    /// </summary>\n    [XmlRoot(\"error\")]\n    public sealed class CCPAPIError\n    {\n        /// <summary>\n        /// If this is non 0 then an error has occurred\n        /// </summary>\n        /// <value>105</value> Invalid character id\n        /// <value>201</value> Character does not belong to account\n        /// <value>202</value> Invalid API key\n        /// <value>\"\"</value> or <value>null</value> when the operation was successful (will be one of 5 values - \"characterID\", \"TryAgainIn\", \"currentTimeTQOffset\" and \"currentTime\"\n        /// This is the variable that needs checking to see if the thing has worked.\n        [XmlAttribute(\"code\")]\n        public int ErrorCode { get; set; }\n\n        /// <summary>\n        /// If this is non 0 length or not null then an error has occurred and will this will be the only value in the entire class other than \"current time\n        /// </summary>\n        /// <value>\"Invalid characterID.\"</value>\n        /// <value>\"Authentication Failure.\"</value>\n        /// <value>\"Cached API key authentication failure\"</value>\n        /// <value>\"Character does not belong to account\"</value>\n        /// <value>\"\"</value> or <value>null</value> when the operation was successful (will be one of 5 values - \"characterID\", \"TryAgainIn\", \"currentTimeTQOffset\" and \"currentTime\"\n        [XmlText]\n        public string ErrorMessage { get; set; }\n\n        /// <summary>\n        /// Gets true when character has no corporation roles.\n        /// </summary>\n        [XmlIgnore]\n        public bool IsCorpRolesError => (ErrorCode >= 206 && ErrorCode <= 209) || ErrorCode == 213;\n\n        /// <summary>\n        /// Gets true when character has exhausted kill log.\n        /// </summary>\n        [XmlIgnore]\n        public bool IsKillLogExhaustedError => ErrorCode == 119;\n\n        /// <summary>\n        /// Gets true when character is not enlisted in factional warfare.\n        /// </summary>\n        [XmlIgnore]\n        public bool IsFactionalWarfareEnlistedError => ErrorCode == 124;\n\n        /// <summary>\n        /// Gets true when there is an unexpected failure accessing the database.\n        /// </summary>\n        [XmlIgnore]\n        public bool IsUnexpectedDatabaseFailure => ErrorCode == 520;\n\n        /// <summary>\n        /// Gets true when EVE backend database is temporarily disabled.\n        /// </summary>\n        [XmlIgnore]\n        public bool IsEVEBackendDatabaseDisabled => ErrorCode == 901;\n\n        /// <summary>\n        /// Gets true when web site database is temporarily disabled.\n        /// </summary>\n        [XmlIgnore]\n        public bool IsWebSiteDatabaseDisabled => ErrorCode == 902;\n\n        /// <summary>\n        /// Gets true when the API credentials are wrong.\n        /// </summary>\n        [XmlIgnore]\n        public bool IsAuthenticationFailure => ErrorCode == 203;\n\n        /// <summary>\n        /// Gets true when the account subscription has expired.\n        /// </summary>\n        [XmlIgnore]\n        public bool IsLoginDeniedByAccountStatus => ErrorCode == 211;\n\n        /// <summary>\n        /// Gets true when the API key has expired.\n        /// </summary>\n        [XmlIgnore]\n        public bool IsAPIKeyExpired => ErrorCode == 222;\n\n        /// <summary>\n        /// Gets true when getting character information fails.\n        /// </summary>\n        [XmlIgnore]\n        public bool IsCharacterInfoFailure => ErrorCode == 522;\n\n        /// <summary>\n        /// Gets true when getting corporation information fails.\n        /// </summary>\n        [XmlIgnore]\n        public bool IsCorporationInfoFailure => ErrorCode == 523;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/CCPAPIResult.cs",
    "content": "﻿using System;\nusing System.Xml;\nusing System.Xml.Serialization;\nusing System.Xml.XPath;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Net;\nusing System.Xml.Xsl;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    [XmlRoot(\"eveapi\")]\n    public sealed class CCPAPIResult<T> : IAPIResult\n    {\n        private readonly APIErrorType m_error;\n        private readonly string m_errorMessage;\n        private readonly Exception m_exception;\n\n\n        #region Constructors\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public CCPAPIResult()\n        {\n            m_error = APIErrorType.None;\n            m_errorMessage = string.Empty;\n            m_exception = null;\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CCPAPIResult{T}\" /> class.\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        /// <exception cref=\"System.ArgumentNullException\">exception</exception>\n        private CCPAPIResult(Exception exception)\n        {\n            exception.ThrowIfNull(nameof(exception));\n\n            m_errorMessage = exception.Message;\n            m_exception = exception;\n        }\n\n        /// <summary>\n        /// Constructor from an http exception\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        public CCPAPIResult(HttpWebClientServiceException exception)\n            : this(exception as Exception)\n        {\n            m_error = APIErrorType.Http;\n        }\n\n        /// <summary>\n        /// Constructor from an XML exception\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        public CCPAPIResult(XmlException exception)\n            : this((Exception)exception)\n        {\n            m_error = APIErrorType.Xml;\n        }\n\n        /// <summary>\n        /// Constructor from an XSLT exception\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        public CCPAPIResult(XsltException exception)\n            : this(exception as Exception)\n        {\n            m_error = APIErrorType.Xml;\n        }\n\n        /// <summary>\n        /// Constructor from an XML serialization exception wrapped into an InvalidOperationException\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        public CCPAPIResult(InvalidOperationException exception)\n            : this(exception as Exception)\n        {\n            m_error = APIErrorType.Xml;\n        }\n\n        /// <summary>\n        /// Constructor from a custom exception.\n        /// </summary>\n        /// <param name=\"error\">The error.</param>\n        /// <param name=\"message\">The message.</param>\n        public CCPAPIResult(APIErrorType error, string message)\n        {\n            m_error = error;\n            m_errorMessage = message;\n            m_exception = null;\n        }\n\n        #endregion\n\n\n        #region Errors handling\n\n        /// <summary>\n        /// Gets true if the information is outdated.\n        /// </summary>\n        public bool IsOutdated => DateTime.UtcNow > CachedUntil;\n\n        /// <summary>\n        /// Gets true if there is an error.\n        /// </summary>\n        public bool HasError => CCPError != null || m_error != APIErrorType.None || Result == null;\n        \n        /// <summary>\n        /// Gets the type of the error or <see cref=\"APIErrorType.None\"/> when there was no error.\n        /// </summary>\n        public APIErrorType ErrorType => CCPError != null ? APIErrorType.CCP : m_error;\n\n        /// <summary>\n        /// Gets the exception.\n        /// </summary>\n        /// <value>The exception.</value>\n        public Exception Exception => m_exception;\n\n        /// <summary>\n        /// Gets the error message without bothering about its nature.\n        /// </summary>\n        public string ErrorMessage => CCPError?.ErrorMessage ?? m_errorMessage;\n\n        /// <summary>\n        /// Gets / sets the XML document when there's no HTTP error.\n        /// </summary>\n        [XmlIgnore]\n        public IXPathNavigable XmlDocument { get; set; }\n\n        #endregion\n\n\n        #region CCP Mapping\n\n        [XmlAttribute(\"version\")]\n        public int APIVersion { get; set; }\n\n        [XmlElement(\"currentTime\")]\n        public string CurrentTimeXml\n        {\n            get { return CurrentTime.DateTimeToTimeString(); }\n            set\n            {\n                if (string.IsNullOrEmpty(value))\n                    return;\n\n                CurrentTime = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlElement(\"cachedUntil\")]\n        public string CachedUntilXml\n        {\n            get { return CachedUntil.DateTimeToTimeString(); }\n            set\n            {\n                if (string.IsNullOrEmpty(value))\n                    return;\n\n                CachedUntil = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlIgnore]\n        public DateTime CurrentTime { get; set; }\n\n        [XmlIgnore]\n        public DateTime CachedUntil { get; set; }\n\n        [XmlElement(\"error\")]\n        public CCPAPIError CCPError { get; set; }\n\n        [XmlElement(\"result\")]\n        public T Result { get; set; }\n\n        [XmlIgnore]\n        public int ErrorCode => CCPError?.ErrorCode ?? 0;\n\n        #endregion\n\n\n        #region Time fixing\n\n        /// <summary>\n        /// Fixup the result time to match the user's clock.\n        /// This should ONLY be called when the xml is first received from CCP.\n        /// </summary>\n        /// <param name=\"millisecondsDrift\"></param>\n        public void SynchronizeWithLocalClock(double millisecondsDrift)\n        {\n            // Convert the drift between webserver time and local time\n            // to a timespan. It is possible for millisecondsDrift to\n            // be erroniously outside of the range of an int thus we \n            // need to catch an overflow exception and reset to 0.\n            TimeSpan drift;\n            try\n            {\n                drift = new TimeSpan(0, 0, 0, 0, Convert.ToInt32(millisecondsDrift));\n            }\n            catch (OverflowException)\n            {\n                drift = new TimeSpan(0, 0, 0, 0);\n            }\n\n            // Fix the start/end times for the results implementing synchronization\n            ISynchronizableWithLocalClock synchronizable = Result as ISynchronizableWithLocalClock;\n\n            synchronizable?.SynchronizeWithLocalClock(drift);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/IAPIResult.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Enumerations.CCPAPI;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents the result of an API operation.\n    /// </summary>\n    public interface IAPIResult\n    {\n        /// <summary>\n        /// Gets true if there is an error.\n        /// </summary>\n        /// <value><c>true</c> if this instance has error; otherwise, <c>false</c>.</value>\n        bool HasError { get; }\n        \n        /// <summary>\n        /// Gets the type of the error or <see cref=\"APIErrorType.None\"/> when there was no error.\n        /// </summary>\n        /// <value>The type of the error.</value>\n        APIErrorType ErrorType { get; }\n\n        /// <summary>\n        /// Gets the error message without bothering about its nature.\n        /// </summary>\n        /// <value>The error message.</value>\n        string ErrorMessage { get; }\n\n        /// <summary>\n        /// Gets the error code. The meaning of this code varies depending on the source, and\n        /// is invalid if there was no error.\n        /// </summary>\n        int ErrorCode { get; }\n\n        /// <summary>\n        /// Gets the exception.\n        /// </summary>\n        /// <value>The exception.</value>\n        Exception Exception { get; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/ISerializableCharacterIdentity.cs",
    "content": "namespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents a set of informations required to create an identity.\n    /// </summary>\n    public interface ISerializableCharacterIdentity\n    {\n        long ID { get; }\n        string Name { get; }\n        long CorporationID { get; }\n        string CorporationName { get; }\n        long AllianceID { get; }\n        string AllianceName { get; }\n        int FactionID { get; }\n        string FactionName { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/ISerializableWithLocalClock.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// An interface for serializable classes which contains datetimes\n    /// </summary>\n    internal interface ISynchronizableWithLocalClock\n    {\n        /// <summary>\n        /// Fixup the currentTime and cachedUntil time to match the user's clock.\n        /// This should ONLY be called when the xml is first recieved from CCP\n        /// </summary>\n        /// <param name=\"drift\">The time span the stored times should be susbtracted with</param>\n        void SynchronizeWithLocalClock(TimeSpan drift);\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableAPICharacterSheet.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{     \n\n    /// <summary>\n    /// Represents a serializable version of a character's sheet. Used for querying CCP.\n    /// </summary>\n    public sealed class SerializableAPICharacterSheet : SerializableCharacterSheetBase\n    {\n        private readonly Collection<SerializableNewImplant> m_implants;\n        private readonly Collection<SerializableCharacterJumpClone> m_jumpClones;\n        private readonly Collection<SerializableCharacterJumpCloneImplant> m_jumpCloneImplants;\n\n        public SerializableAPICharacterSheet()\n        {\n            m_implants = new Collection<SerializableNewImplant>();\n            m_jumpClones = new Collection<SerializableCharacterJumpClone>();\n            m_jumpCloneImplants = new Collection<SerializableCharacterJumpCloneImplant>();\n        }\n\n        [XmlArray(\"implants\")]\n        [XmlArrayItem(\"implant\")]\n        public Collection<SerializableNewImplant> Implants => m_implants;\n\n        [XmlArray(\"jumpClones\")]\n        [XmlArrayItem(\"jumpClone\")]\n        public Collection<SerializableCharacterJumpClone> JumpClones => m_jumpClones;\n\n        [XmlArray(\"jumpCloneImplants\")]\n        [XmlArrayItem(\"jumpCloneImplant\")]\n        public Collection<SerializableCharacterJumpCloneImplant> JumpCloneImplants => m_jumpCloneImplants;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableAPIContracts.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableAPIContracts\n    {\n        private readonly Collection<SerializableContractListItem> m_contracts;\n\n        public SerializableAPIContracts()\n        {\n            m_contracts = new Collection<SerializableContractListItem>();\n        }\n\n        [XmlArray(\"contracts\")]\n        [XmlArrayItem(\"contract\")]\n        public Collection<SerializableContractListItem> Contracts => m_contracts;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableAPIEveFactionalWarfareStats.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableAPIEveFactionalWarfareStats\n    {\n        private readonly Collection<SerializableEveFactionalWarfareStatsListItem> m_factionalWarfareStats;\n        private readonly Collection<SerializableEveFactionWarsListItem> m_factionsWars;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableAPIEveFactionalWarfareStats\"/> class.\n        /// </summary>\n        public SerializableAPIEveFactionalWarfareStats()\n        {\n            m_factionalWarfareStats = new Collection<SerializableEveFactionalWarfareStatsListItem>();\n            m_factionsWars = new Collection<SerializableEveFactionWarsListItem>();\n        }\n\n        [XmlElement(\"totals\")]\n        public SerializableEveFacWarfareTotals Totals { get; set; }\n\n        [XmlArray(\"factions\")]\n        [XmlArrayItem(\"faction\")]\n        public Collection<SerializableEveFactionalWarfareStatsListItem> FactionalWarfareStats => m_factionalWarfareStats;\n\n        [XmlArray(\"factionWars\")]\n        [XmlArrayItem(\"factionWar\")]\n        public Collection<SerializableEveFactionWarsListItem> FactionWars => m_factionsWars;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableAPIKillLog.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents a serializable version of a kill log. Used for querying CCP.\n    /// </summary>\n    public sealed class SerializableAPIKillLog\n    {\n        private readonly Collection<SerializableKillLogListItem> m_kills;\n\n        public SerializableAPIKillLog()\n        {\n            m_kills = new Collection<SerializableKillLogListItem>();\n        }\n\n        [XmlArray(\"ArrayOfEsiKillLogListItem\")]\n        [XmlArrayItem(\"EsiKillLogListItem\")]\n        public Collection<SerializableKillLogListItem> Kills => m_kills;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableAPIMailBodies.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents a serializable version of a characters' eve mail messages bodies. Used for querying CCP.\n    /// </summary>\n    public sealed class SerializableAPIMailBodies\n    {\n        private readonly Collection<SerializableMailBodiesListItem> m_bodies;\n\n        public SerializableAPIMailBodies()\n        {\n            m_bodies = new Collection<SerializableMailBodiesListItem>();\n        }\n\n        [XmlArray(\"messages\")]\n        [XmlArrayItem(\"message\")]\n        public Collection<SerializableMailBodiesListItem> Bodies => m_bodies;\n\n        [XmlElement(\"missingMessageIDs\")]\n        public string MissingMessageIDs { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableAPIMailMessages.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents a serializable version of a characters' eve mail messages headers. Used for querying CCP.\n    /// </summary>\n    public sealed class SerializableAPIMailMessages\n    {\n        private readonly Collection<SerializableMailMessagesListItem> m_messages;\n\n        public SerializableAPIMailMessages()\n        {\n            m_messages = new Collection<SerializableMailMessagesListItem>();\n        }\n\n        [XmlArray(\"messages\")]\n        [XmlArrayItem(\"message\")]\n        public Collection<SerializableMailMessagesListItem> Messages => m_messages;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableAPIRefTypes.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableAPIRefTypes\n    {\n        private readonly Collection<SerializableRefTypesListItem> m_refTypes;\n\n        public SerializableAPIRefTypes()\n        {\n            m_refTypes = new Collection<SerializableRefTypesListItem>();\n        }\n\n        [XmlArray(\"refTypes\")]\n        [XmlArrayItem(\"refType\")]\n        public Collection<SerializableRefTypesListItem> RefTypes => m_refTypes;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableAPIUpcomingCalendarEvents.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents a serializable version of upcoming calendar events. Used for querying CCP.\n    /// </summary>\n    public sealed class SerializableAPIUpcomingCalendarEvents\n    {\n        private readonly Collection<SerializableUpcomingCalendarEventsListItem> m_upcomingEvents;\n\n        public SerializableAPIUpcomingCalendarEvents()\n        {\n            m_upcomingEvents = new Collection<SerializableUpcomingCalendarEventsListItem>();\n        }\n\n        [XmlArray(\"upcomingEvents\")]\n        [XmlArrayItem(\"upcomingEvent\")]\n        public Collection<SerializableUpcomingCalendarEventsListItem> UpcomingEvents => m_upcomingEvents;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableAPIWalletJournal.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents a serializable version of wallet journal. Used for querying CCP.\n    /// </summary>\n    public sealed class SerializableAPIWalletJournal\n    {\n        private readonly Collection<SerializableWalletJournalListItem> m_walletJournal;\n\n        public SerializableAPIWalletJournal()\n        {\n            m_walletJournal = new Collection<SerializableWalletJournalListItem>();\n        }\n\n        [XmlArray(\"transactions\")]\n        [XmlArrayItem(\"transaction\")]\n        public Collection<SerializableWalletJournalListItem> WalletJournal => m_walletJournal;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableAPIWalletTransactions.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents a serializable version of wallet transactions. Used for querying CCP.\n    /// </summary>\n    public sealed class SerializableAPIWalletTransactions\n    {\n        private readonly Collection<SerializableWalletTransactionsListItem> m_walletTransactions;\n\n        public SerializableAPIWalletTransactions()\n        {\n            m_walletTransactions = new Collection<SerializableWalletTransactionsListItem>();\n        }\n\n        [XmlArray(\"transactions\")]\n        [XmlArrayItem(\"transaction\")]\n        public Collection<SerializableWalletTransactionsListItem> WalletTransactions => m_walletTransactions;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableCalendarEventAttendeeListItem.cs",
    "content": "using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableCalendarEventAttendeeListItem\n    {\n        [XmlAttribute(\"characterID\")]\n        public long CharacterID { get; set; }\n\n        [XmlAttribute(\"name\")]\n        public string CharacterNameXml\n        {\n            get { return CharacterName; }\n            set { CharacterName = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlAttribute(\"response\")]\n        public string ResponseXml\n        {\n            get { return Response; }\n            set { Response = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlIgnore]\n        public string CharacterName { get; set; }\n\n        [XmlIgnore]\n        public string Response { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableCharacterAttributes.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents the character's attributes\n    /// </summary>\n    public sealed class SerializableCharacterAttributes\n    {\n        public SerializableCharacterAttributes()\n        {\n            Intelligence = Memory = Perception = Charisma = Willpower = 1;\n        }\n\n        [XmlElement(\"intelligence\")]\n        public long Intelligence { get; set; }\n\n        [XmlElement(\"memory\")]\n        public long Memory { get; set; }\n\n        [XmlElement(\"perception\")]\n        public long Perception { get; set; }\n\n        [XmlElement(\"willpower\")]\n        public long Willpower { get; set; }\n\n        [XmlElement(\"charisma\")]\n        public long Charisma { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableCharacterCertificate.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents a certificate\n    /// </summary>\n    public sealed class SerializableCharacterCertificate\n    {\n        [XmlAttribute(\"certificateID\")]\n        public int CertificateID { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableCharacterJumpClone.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableCharacterJumpClone\n    {\n        [XmlAttribute(\"jumpCloneID\")]\n        public long JumpCloneID { get; set; }\n\n        [XmlAttribute(\"typeID\")]\n        public int TypeID { get; set; }\n\n        [XmlAttribute(\"locationID\")]\n        public long LocationID { get; set; }\n\n        [XmlAttribute(\"cloneName\")]\n        public string CloneNameXml\n        {\n            get { return CloneName; }\n            set\n            {\n                CloneName = value;\n            }\n        }\n\n        [XmlIgnore]\n        public string CloneName { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableCharacterJumpCloneImplant.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableCharacterJumpCloneImplant\n    {\n        [XmlAttribute(\"jumpCloneID\")]\n        public long JumpCloneID { get; set; }\n\n        [XmlAttribute(\"typeID\")]\n        public int TypeID { get; set; }\n\n        [XmlAttribute(\"typeName\")]\n        public string TypeName { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableCharacterListItem.cs",
    "content": "using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents a reference to a character in the charactersList API\n    /// </summary>\n    public class SerializableCharacterListItem : ISerializableCharacterIdentity\n    {\n        [XmlAttribute(\"characterID\")]\n        public long ID { get; set; }\n\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        [XmlAttribute(\"corporationID\")]\n        public long CorporationID { get; set; }\n\n        [XmlAttribute(\"corporationName\")]\n        public string CorporationNameXml\n        {\n            get { return CorporationName; }\n            set { CorporationName = string.IsNullOrEmpty(value) ? EveMonConstants.UnknownText : value.HtmlDecode(); }\n        }\n\n        [XmlAttribute(\"allianceID\")]\n        public long AllianceID { get; set; }\n\n        [XmlAttribute(\"allianceName\")]\n        public string AllianceNameXml\n        {\n            get { return AllianceName; }\n            set { AllianceName = string.IsNullOrEmpty(value) ? EveMonConstants.UnknownText : value.HtmlDecode(); }\n        }\n\n        [XmlAttribute(\"factionID\")]\n        public int FactionID { get; set; }\n\n        [XmlAttribute(\"factionName\")]\n        public string FactionNameXml\n        {\n            get { return FactionName; }\n            set { FactionName = string.IsNullOrEmpty(value) ? EveMonConstants.UnknownText : value; }\n        }\n\n        [XmlAttribute(\"shipTypeID\")]\n        public int ShipTypeID { get; set; }\n\n        [XmlIgnore]\n        public string CorporationName { get; set; }\n\n        [XmlIgnore]\n        public string AllianceName { get; set; }\n\n        [XmlIgnore]\n        public string FactionName { get; set; }\n\n        [XmlIgnore]\n        public string ShipTypeName\n        {\n            get\n            {\n                Item ship = StaticItems.GetItemByID(ShipTypeID);\n                return ship == null || ShipTypeID == 0 ? EveMonConstants.UnknownText : ship.Name;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableCharacterNameListItem.cs",
    "content": "using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableCharacterNameListItem\n    {\n        [XmlAttribute(\"characterID\")]\n        public long ID { get; set; }\n\n        [XmlAttribute(\"name\")]\n        public string NameXml\n        {\n            get { return Name; }\n            set { Name = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlIgnore]\n        public string Name { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableCharacterSheetBase.cs",
    "content": "using System;\nusing System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents a serializable version of a character sheet. Used for settings.xml serialization and CCP querying\n    /// </summary>\n    public class SerializableCharacterSheetBase : ISerializableCharacterIdentity\n    {\n        protected SerializableCharacterSheetBase()\n        {\n            Attributes = new SerializableCharacterAttributes();\n            Skills = new Collection<SerializableCharacterSkill>();\n            Certificates = new Collection<SerializableCharacterCertificate>();\n            EmploymentHistory = new Collection<SerializableEmploymentHistory>();\n        }\n\n        [XmlElement(\"characterID\")]\n        public long ID { get; set; }\n\n        [XmlElement(\"name\")]\n        public string NameXml\n        {\n            get { return Name; }\n            set { Name = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlElement(\"homeStationID\")]\n        public long HomeStationID { get; set; }\n\n        [XmlElement(\"DoB\")]\n        public string BirthdayXml\n        {\n            get { return Birthday.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    Birthday = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlElement(\"race\")]\n        public string Race { get; set; }\n\n        [XmlElement(\"bloodLine\")]\n        public string BloodLine { get; set; }\n\n        [XmlElement(\"ancestry\")]\n        public string Ancestry { get; set; }\n\n        [XmlElement(\"gender\")]\n        public string Gender { get; set; }\n\n        [XmlElement(\"corporationName\")]\n        public string CorporationNameXml\n        {\n            get { return CorporationName; }\n            set { CorporationName = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlElement(\"corporationID\")]\n        public long CorporationID { get; set; }\n\n        [XmlElement(\"allianceName\")]\n        public string AllianceNameXml\n        {\n            get { return AllianceName; }\n            set { AllianceName = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlElement(\"allianceID\")]\n        public long AllianceID { get; set; }\n\n        [XmlElement(\"factionName\")]\n        public string FactionName { get; set; }\n\n        [XmlElement(\"factionID\")]\n        public int FactionID { get; set; }\n\n        [XmlElement(\"freeSkillPoints\")]\n        public int FreeSkillPoints { get; set; }\n\n        [XmlElement(\"freeRespecs\")]\n        public short FreeRespecs { get; set; }\n\n        [XmlElement(\"cloneJumpDate\")]\n        public string CloneJumpDateXml\n        {\n            get { return CloneJumpDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    CloneJumpDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlElement(\"lastRespecDate\")]\n        public string LastRespecDateXml\n        {\n            get { return LastRespecDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    LastRespecDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlElement(\"lastTimedRespec\")]\n        public string LastTimedRespecXml\n        {\n            get { return LastTimedRespec.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    LastTimedRespec = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlElement(\"remoteStationDate\")]\n        public string RemoteStationDateXml\n        {\n            get { return RemoteStationDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    RemoteStationDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlElement(\"jumpActivation\")]\n        public string JumpActivationDateXml\n        {\n            get { return JumpActivationDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    JumpActivationDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlElement(\"jumpFatigue\")]\n        public string JumpFatigueDateXml\n        {\n            get { return JumpFatigueDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    JumpFatigueDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlElement(\"jumpLastUpdate\")]\n        public string JumpLastUpdateDateXml\n        {\n            get { return JumpLastUpdateDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    JumpLastUpdateDate = value.TimeStringToDateTime();\n            }\n        }\n\n\t\t[XmlArray(\"certificates\")]\n\t\t[XmlArrayItem(\"certificate\")]\n\t\tpublic Collection<SerializableCharacterCertificate> Certificates { get; }\n\n\t\t[XmlElement(\"balance\")]\n        public decimal Balance { get; set; }\n\n        [XmlElement(\"shipName\")]\n        public string ShipName { get; set; }\n\n        [XmlElement(\"shipTypeName\")]\n        public string ShipTypeName { get; set; }\n\n        [XmlElement(\"lastKnownLocation\")]\n        public SerializableLocation LastKnownLocation { get; set; }\n\n        [XmlElement(\"securityStatus\")]\n        public double SecurityStatus { get; set; }\n\n        [XmlElement(\"cloneStateOverride\")]\n        public string CloneState { get; set; }\n\n        [XmlArray(\"employmentHistory\")]\n\t\t[XmlArrayItem(\"record\")]\n\t\tpublic Collection<SerializableEmploymentHistory> EmploymentHistory { get; }\n\n\t\t[XmlElement(\"attributes\")]\n        public SerializableCharacterAttributes Attributes { get; set; }\n\n\t\t[XmlArray(\"skills\")]\n\t\t[XmlArrayItem(\"skill\")]\n\t\tpublic Collection<SerializableCharacterSkill> Skills { get; }\n\n\t\t/// <summary>\n\t\t/// Gets or sets the name.\n\t\t/// </summary>\n\t\t[XmlIgnore]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name of the corporation.\n        /// </summary>\n        [XmlIgnore]\n        public string CorporationName { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name of the alliance.\n        /// </summary>\n        [XmlIgnore]\n        public string AllianceName { get; set; }\n\n        /// <summary>\n        /// The date and time the character was created.\n        /// </summary>\n        [XmlIgnore]\n        public DateTime Birthday { get; set; }\n\n        /// <summary>\n        /// The date and time the jump clone was created.\n        /// </summary>\n        [XmlIgnore]\n        public DateTime CloneJumpDate { get; set; }\n\n        /// <summary>\n        /// The date and time of the last remap.\n        /// </summary>\n        [XmlIgnore]\n        public DateTime LastRespecDate { get; set; }\n\n        /// <summary>\n        /// The date and time of the last timed remap.\n        /// </summary>\n        [XmlIgnore]\n        public DateTime LastTimedRespec { get; set; }\n\n        /// <summary>\n        /// The date and time of the last remap.\n        /// </summary>\n        [XmlIgnore]\n        public DateTime RemoteStationDate { get; set; }\n\n        /// <summary>\n        /// Gets or sets the jump activation date.\n        /// </summary>\n        [XmlIgnore]\n        public DateTime JumpActivationDate { get; set; }\n\n        /// <summary>\n        /// Gets or sets the jump fatigue date.\n        /// </summary>\n        [XmlIgnore]\n        public DateTime JumpFatigueDate { get; set; }\n\n        /// <summary>\n        /// Gets or sets the jump last update date.\n        /// </summary>\n        [XmlIgnore]\n        public DateTime JumpLastUpdateDate { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableCharacterSkill.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents a skill\n    /// </summary>\n    public sealed class SerializableCharacterSkill\n    {\n        [XmlAttribute(\"typeID\")]\n        public int ID { get; set; }\n\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        [XmlAttribute(\"level\")]\n        public long Level { get; set; }\n\n        [XmlAttribute(\"activelevel\")]\n        public long ActiveLevel { get; set; }\n\n        [XmlAttribute(\"skillpoints\")]\n        public long Skillpoints { get; set; }\n\n        [XmlAttribute(\"ownsBook\")]\n        public bool OwnsBook { get; set; }\n\n        [XmlAttribute(\"isKnown\")]\n        public bool IsKnown { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableContractListItem.cs",
    "content": "using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableContractListItem\n    {\n        [XmlAttribute(\"contractID\")]\n        public long ContractID { get; set; }\n\n        [XmlAttribute(\"issuerID\")]\n        public long IssuerID { get; set; }\n\n        [XmlAttribute(\"issuerCorpID\")]\n        public long IssuerCorpID { get; set; }\n\n        [XmlAttribute(\"assigneeID\")]\n        public long AssigneeID { get; set; }\n\n        [XmlAttribute(\"acceptorID\")]\n        public long AcceptorID { get; set; }\n\n        [XmlAttribute(\"startStationID\")]\n        public long StartStationID { get; set; }\n\n        [XmlAttribute(\"endStationID\")]\n        public long EndStationID { get; set; }\n\n        [XmlAttribute(\"type\")]\n        public string Type { get; set; }\n\n        [XmlAttribute(\"status\")]\n        public string Status { get; set; }\n\n        [XmlAttribute(\"title\")]\n        public string TitleXml\n        {\n            get { return Title; }\n            set { Title = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlAttribute(\"forCorp\")]\n        public bool ForCorp { get; set; }\n\n        [XmlAttribute(\"availability\")]\n        public string Availability { get; set; }\n\n        [XmlAttribute(\"dateIssued\")]\n        public string DateIssuedXml\n        {\n            get { return DateIssued.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    DateIssued = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlAttribute(\"dateExpired\")]\n        public string DateExpiredXml\n        {\n            get { return DateExpired.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    DateExpired = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlAttribute(\"dateAccepted\")]\n        public string DateAcceptedXml\n        {\n            get { return DateAccepted.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    DateAccepted = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlAttribute(\"numDays\")]\n        public int NumDays { get; set; }\n\n        [XmlAttribute(\"dateCompleted\")]\n        public string DateCompletedXml\n        {\n            get { return DateCompleted.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    DateCompleted = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlAttribute(\"price\")]\n        public decimal Price { get; set; }\n\n        [XmlAttribute(\"reward\")]\n        public decimal Reward { get; set; }\n\n        [XmlAttribute(\"collateral\")]\n        public decimal Collateral { get; set; }\n\n        [XmlAttribute(\"buyout\")]\n        public decimal Buyout { get; set; }\n\n        [XmlAttribute(\"volume\")]\n        public decimal Volume { get; set; }\n\n        [XmlIgnore]\n        public string Title { get; set; }\n\n        [XmlIgnore]\n        public DateTime DateIssued { get; set; }\n\n        [XmlIgnore]\n        public DateTime DateExpired { get; set; }\n\n        [XmlIgnore]\n        public DateTime DateAccepted { get; set; }\n\n        [XmlIgnore]\n        public DateTime DateCompleted { get; set; }\n\n        /// <summary>\n        /// Which this contract was issued for.\n        /// </summary>\n        [XmlIgnore]\n        public IssuedFor IssuedFor { get; set; }\n\n        [XmlIgnore]\n        public Enum APIMethod { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableEmploymentHistory.cs",
    "content": "using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableEmploymentHistory\n    {\n        [XmlAttribute(\"corporationID\")]\n        public long CorporationID { get; set; }\n\n        [XmlAttribute(\"corporationName\")]\n        public string CorporationNameXml\n        {\n            get { return CorporationName; }\n            set { CorporationName = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlAttribute(\"startDate\")]\n        public string StartDateXml\n        {\n            get { return StartDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    StartDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlIgnore]\n        public string CorporationName { get; set; }\n\n        [XmlIgnore]\n        public DateTime StartDate { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableEmploymentHistoryListItem.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableEmploymentHistoryListItem\n    {\n        [XmlAttribute(\"recordID\")]\n        public long RecordID { get; set; }\n\n        [XmlAttribute(\"corporationID\")]\n        public int CorporationID { get; set; }\n\n        [XmlAttribute(\"corporationName\")]\n        public string CorporationName { get; set; }\n\n        [XmlAttribute(\"startDate\")]\n        public string StartDateXml\n        {\n            get { return StartDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    StartDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlIgnore]\n        public DateTime StartDate { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableEveFacWarfareTotals.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableEveFacWarfareTotals\n    {\n        [XmlElement(\"killsYesterday\")]\n        public int KillsYesterday { get; set; }\n\n        [XmlElement(\"killsLastWeek\")]\n        public int KillsLastWeek { get; set; }\n\n        [XmlElement(\"killsTotal\")]\n        public int KillsTotal { get; set; }\n\n        [XmlElement(\"victoryPointsYesterday\")]\n        public int VictoryPointsYesterday { get; set; }\n\n        [XmlElement(\"victoryPointsLastWeek\")]\n        public int VictoryPointsLastWeek { get; set; }\n\n        [XmlElement(\"victoryPointsTotal\")]\n        public int VictoryPointsTotal { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableEveFactionWarsListItem.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableEveFactionWarsListItem\n    {\n        [XmlAttribute(\"factionID\")]\n        public int FactionID { get; set; }\n\n        [XmlAttribute(\"factionName\")]\n        public string FactionName { get; set; }\n\n        [XmlAttribute(\"againstID\")]\n        public int AgainstID { get; set; }\n\n        [XmlAttribute(\"againstName\")]\n        public string AgainstName { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableEveFactionalWarfareStatsListItem.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableEveFactionalWarfareStatsListItem\n    {\n        [XmlAttribute(\"factionID\")]\n        public int FactionID { get; set; }\n\n        [XmlAttribute(\"factionName\")]\n        public string FactionName { get; set; }\n\n        [XmlAttribute(\"pilots\")]\n        public int Pilots { get; set; }\n\n        [XmlAttribute(\"systemsControlled\")]\n        public int SystemsControlled { get; set; }\n\n        [XmlAttribute(\"killsYesterday\")]\n        public int KillsYesterday { get; set; }\n\n        [XmlAttribute(\"killsLastWeek\")]\n        public int KillsLastWeek { get; set; }\n\n        [XmlAttribute(\"killsTotal\")]\n        public int KillsTotal { get; set; }\n\n        [XmlAttribute(\"victoryPointsYesterday\")]\n        public int VictoryPointsYesterday { get; set; }\n\n        [XmlAttribute(\"victoryPointsLastWeek\")]\n        public int VictoryPointsLastWeek { get; set; }\n\n        [XmlAttribute(\"victoryPointsTotal\")]\n        public int VictoryPointsTotal { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableKillLogAttackersListItem.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableKillLogAttackersListItem : SerializableCharacterListItem\n    {\n        [XmlAttribute(\"damageDone\")]\n        public int DamageDone { get; set; }\n\n        [XmlAttribute(\"finalBlow\")]\n        public bool FinalBlow { get; set; }\n\n        [XmlAttribute(\"securityStatus\")]\n        public double SecurityStatus { get; set; }\n\n        [XmlAttribute(\"weaponTypeID\")]\n        public int WeaponTypeID { get; set; }\n\n\n        [XmlIgnore]\n        public string WeaponTypeName\n        {\n            get\n            {\n                if (WeaponTypeID == 0)\n                    return string.Empty;\n\n                Item weapon = StaticItems.GetItemByID(WeaponTypeID);\n                return weapon?.Name ?? EveMonConstants.UnknownText;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableKillLogItemListItem.cs",
    "content": "using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableKillLogItemListItem\n    {\n        private readonly Collection<SerializableKillLogItemListItem> m_items;\n\n        public SerializableKillLogItemListItem()\n        {\n            m_items = new Collection<SerializableKillLogItemListItem>();\n        }\n\n        [XmlAttribute(\"typeID\")]\n        public int TypeID { get; set; }\n\n        [XmlAttribute(\"flag\")]\n        public short EVEFlag { get; set; }\n\n        [XmlAttribute(\"qtyDropped\")]\n        public int QtyDropped { get; set; }\n\n        [XmlAttribute(\"qtyDestroyed\")]\n        public int QtyDestroyed { get; set; }\n\n        [XmlAttribute(\"singleton\")]\n        public byte Singleton { get; set; }\n\n        [XmlArray(\"items\")]\n        [XmlArrayItem(\"item\")]\n        public Collection<SerializableKillLogItemListItem> Items => m_items;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableKillLogListItem.cs",
    "content": "using System;\nusing System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableKillLogListItem\n    {\n        private readonly Collection<SerializableKillLogAttackersListItem> m_attackers;\n        private readonly Collection<SerializableKillLogItemListItem> m_items;\n\n        public SerializableKillLogListItem()\n        {\n            m_attackers = new Collection<SerializableKillLogAttackersListItem>();\n            m_items = new Collection<SerializableKillLogItemListItem>();\n        }\n\n        [XmlAttribute(\"killID\")]\n        public long KillID { get; set; }\n\n        [XmlAttribute(\"solarSystemID\")]\n        public int SolarSystemID { get; set; }\n\n        [XmlAttribute(\"killTime\")]\n        public string KillTimeXml\n        {\n            get { return KillTime.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    KillTime = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlAttribute(\"moonID\")]\n        public int MoonID { get; set; }\n\n        [XmlElement(\"victim\")]\n        public SerializableKillLogVictim Victim { get; set; }\n\n        [XmlArray(\"attackers\")]\n        [XmlArrayItem(\"attacker\")]\n        public Collection<SerializableKillLogAttackersListItem> Attackers => m_attackers;\n\n        [XmlArray(\"items\")]\n        [XmlArrayItem(\"item\")]\n        public Collection<SerializableKillLogItemListItem> Items => m_items;\n\n        [XmlIgnore]\n        public DateTime KillTime { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableKillLogVictim.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public class SerializableKillLogVictim : SerializableCharacterListItem\n    {\n        [XmlAttribute(\"damageTaken\")]\n        public int DamageTaken { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableLocation.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    /// <summary>\n    /// Represents a serializable location containing a solar system and station / structure.\n    /// </summary>\n    public sealed class SerializableLocation\n    {\n        [XmlElement(\"solarSystemID\")]\n        public int SolarSystemID { get; set; }\n\n        [XmlElement(\"stationID\")]\n        public int StationID { get; set; }\n\n        [XmlElement(\"structureID\")]\n        public long StructureID { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableMailBodiesListItem.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableMailBodiesListItem\n    {\n        [XmlAttribute(\"messageID\")]\n        public long MessageID { get; set; }\n\n        [XmlText]\n        public string MessageText { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableMailMessagesListItem.cs",
    "content": "﻿using System;\nusing System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableMailMessagesListItem\n    {\n        private readonly Collection<long> m_toCharacterIDs;\n        private readonly Collection<long> m_toListID;\n\n        public SerializableMailMessagesListItem()\n        {\n            m_toCharacterIDs = new Collection<long>();\n            m_toListID = new Collection<long>();\n        }\n\n        [XmlAttribute(\"messageID\")]\n        public long MessageID { get; set; }\n\n        [XmlAttribute(\"senderID\")]\n        public long SenderID { get; set; }\n\n        [XmlAttribute(\"senderName\")]\n        public string SenderName { get; set; }\n\n        [XmlAttribute(\"sentDate\")]\n        public string SentDateXml\n        {\n            get { return SentDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    SentDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlAttribute(\"title\")]\n        public string TitleXml\n        {\n            get { return Title; }\n            set { Title = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlAttribute(\"toCorpOrAllianceID\")]\n        public long ToCorpOrAllianceID { get; set; }\n        \n        [XmlAttribute(\"toCharacterIDs\")]\n        public string ToCharacterIDsXml\n        {\n            get { return string.Join(\",\", m_toCharacterIDs); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                {\n                    // Parse one by one into IDs\n                    long id;\n                    foreach (string idStr in value.Split(','))\n                        if (idStr.TryParseInv(out id))\n                            m_toCharacterIDs.Add(id);\n                }\n            }\n        }\n\n        [XmlAttribute(\"toListID\")]\n        public string ToListIDXml\n        {\n            get { return string.Join(\",\", m_toListID); }\n            set\n            {\n                // Parse one by one into IDs\n                long id;\n                foreach (string idStr in value.Split(','))\n                    if (idStr.TryParseInv(out id))\n                        m_toListID.Add(id);\n            }\n        }\n\n        [XmlIgnore]\n        public string Title { get; set; }\n\n        [XmlIgnore]\n        public DateTime SentDate { get; set; }\n\n        [XmlIgnore]\n        public Collection<long> ToCharacterIDs => m_toCharacterIDs;\n\n        [XmlIgnore]\n        public Collection<long> ToListID => m_toListID;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableNewImplant.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableNewImplant\n    {\n        [XmlAttribute(\"typeID\")]\n        public int ID { get; set; }\n\n        [XmlAttribute(\"typeName\")]\n        public string Name { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableOutpost.cs",
    "content": "using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableOutpost\n    {\n        [XmlAttribute(\"stationID\")]\n        public long StationID { get; set; }\n\n        [XmlAttribute(\"stationName\")]\n        public string StationNameXml\n        {\n            get { return StationName; }\n            set { StationName = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlAttribute(\"stationTypeID\")]\n        public int StationTypeID { get; set; }\n\n        [XmlAttribute(\"solarSystemID\")]\n        public int SolarSystemID { get; set; }\n\n        [XmlAttribute(\"corporationID\")]\n        public int CorporationID { get; set; }\n\n        [XmlAttribute(\"corporationName\")]\n        public string CorporationNameXml\n        {\n            get { return CorporationName; }\n            set { CorporationName = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlIgnore]\n        public string StationName { get; set; }\n\n        [XmlIgnore]\n        public string CorporationName { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableQueuedSkill.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableQueuedSkill : ISynchronizableWithLocalClock\n    {\n        [XmlAttribute(\"typeID\")]\n        public int ID { get; set; }\n\n        [XmlAttribute(\"level\")]\n        public int Level { get; set; }\n\n        [XmlAttribute(\"startSP\")]\n        public int StartSP { get; set; }\n\n        [XmlAttribute(\"endSP\")]\n        public int EndSP { get; set; }\n\n        [XmlAttribute(\"startTime\")]\n        public string CCPStartTime { get; set; }\n\n        [XmlAttribute(\"endTime\")]\n        public string CCPEndTime { get; set; }\n\n        [XmlIgnore]\n        public DateTime StartTime\n        {\n            get { return CCPStartTime.TimeStringToDateTime(); }\n            set { CCPStartTime = value.DateTimeToTimeString(); }\n        }\n\n        [XmlIgnore]\n        public DateTime EndTime\n        {\n            get { return CCPEndTime.TimeStringToDateTime(); }\n            set { CCPEndTime = value.DateTimeToTimeString(); }\n        }\n\n        // When the skill queue is paused, startTime and endTime are empty in the XML document\n        // As a result, the serialization leaves the DateTime with its default value\n        [XmlIgnore]\n        public bool IsPaused\n        {\n            get { return EndTime == DateTime.MinValue; }\n        }\n\n        [XmlIgnore]\n        public bool IsCompleted\n        {\n            get { return !IsPaused && EndTime <= DateTime.UtcNow; }\n        }\n\n        [XmlIgnore]\n        public bool IsTraining\n        {\n            get { return !IsPaused && StartTime <= DateTime.UtcNow && DateTime.UtcNow <= EndTime; }\n        }\n\n        #region ISynchronizableWithLocalClock Members\n\n        /// <summary>\n        /// Synchronizes the stored times with local clock\n        /// </summary>\n        /// <param name=\"drift\"></param>\n        void ISynchronizableWithLocalClock.SynchronizeWithLocalClock(TimeSpan drift)\n        {\n            if (!string.IsNullOrEmpty(CCPStartTime))\n                StartTime -= drift;\n\n            if (!string.IsNullOrEmpty(CCPEndTime))\n                EndTime -= drift;\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableRefTypesListItem.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableRefTypesListItem\n    {\n        [XmlAttribute(\"refTypeID\")]\n        public int ID { get; set; }\n\n        [XmlAttribute(\"refTypeName\")]\n        public string Name { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableUpcomingCalendarEventsListItem.cs",
    "content": "using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableUpcomingCalendarEventsListItem\n    {\n        [XmlAttribute(\"eventID\")]\n        public long EventID { get; set; }\n\n        [XmlAttribute(\"ownerID\")]\n        public long OwnerID { get; set; }\n\n        [XmlAttribute(\"ownerName\")]\n        public string OwnerNameXml\n        {\n            get { return OwnerName; }\n            set { OwnerName = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlAttribute(\"eventTitle\")]\n        public string EventTitleXml\n        {\n            get { return EventTitle; }\n            set { EventTitle = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlAttribute(\"eventText\")]\n        public string EventTextXml\n        {\n            get { return EventText; }\n            set { EventText = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlAttribute(\"duration\")]\n        public int Duration { get; set; }\n\n        [XmlAttribute(\"importance\")]\n        public bool Importance { get; set; }\n\n        [XmlAttribute(\"response\")]\n        public string ResponseXml\n        {\n            get { return Response; }\n            set { Response = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlAttribute(\"eventDate\")]\n        public string EventDateXml\n        {\n            get { return EventDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    EventDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlIgnore]\n        public string OwnerName { get; set; }\n\n        [XmlIgnore]\n        public string EventTitle { get; set; }\n\n        [XmlIgnore]\n        public string EventText { get; set; }\n\n        [XmlIgnore]\n        public string Response { get; set; }\n\n        [XmlIgnore]\n        public DateTime EventDate { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableWalletJournalListItem.cs",
    "content": "using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableWalletJournalListItem\n    {\n        [XmlAttribute(\"refID\")]\n        public long ID { get; set; }\n\n        [XmlAttribute(\"refTypeID\")]\n        public int RefTypeID { get; set; }\n\n        [XmlAttribute(\"ownerID1\")]\n        public long OwnerID1 { get; set; }\n\n        [XmlAttribute(\"ownerName1\")]\n        public string OwnerName1Xml\n        {\n            get { return OwnerName1; }\n            set { OwnerName1 = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlAttribute(\"ownerID2\")]\n        public long OwnerID2 { get; set; }\n\n        [XmlAttribute(\"ownerName2\")]\n        public string OwnerName2Xml\n        {\n            get { return OwnerName2; }\n            set { OwnerName2 = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlAttribute(\"argID1\")]\n        public long ArgID1 { get; set; }\n\n        [XmlAttribute(\"argName1\")]\n        public string ArgName1 { get; set; }\n\n        [XmlAttribute(\"amount\")]\n        public decimal Amount { get; set; }\n\n        [XmlAttribute(\"balance\")]\n        public decimal Balance { get; set; }\n\n        [XmlAttribute(\"reason\")]\n        public string Reason { get; set; }\n\n        [XmlAttribute(\"taxReceiverID\")]\n        public string TaxReceiverIDXml\n        {\n            get { return TaxReceiverID.ToString(CultureConstants.InvariantCulture); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    TaxReceiverID = Convert.ToInt64(value, CultureConstants.InvariantCulture);\n            }\n        }\n\n        [XmlAttribute(\"taxAmount\")]\n        public string TaxAmountXml\n        {\n            get { return TaxAmount.ToString(CultureConstants.InvariantCulture); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    TaxAmount = Convert.ToDecimal(value, CultureConstants.InvariantCulture);\n            }\n        }\n\n        [XmlAttribute(\"date\")]\n        public string DateXml\n        {\n            get { return Date.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    Date = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlIgnore]\n        public string OwnerName1 { get; set; }\n\n        [XmlIgnore]\n        public string OwnerName2 { get; set; }\n\n        [XmlIgnore]\n        public DateTime Date { get; set; }\n\n        [XmlIgnore]\n        public long TaxReceiverID { get; set; }\n\n        [XmlIgnore]\n        public decimal TaxAmount { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/SerializableWalletTransactionsListItem.cs",
    "content": "using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.Eve\n{\n    public sealed class SerializableWalletTransactionsListItem\n    {\n        [XmlAttribute(\"transactionID\")]\n        public long ID { get; set; }\n\n        [XmlAttribute(\"journalTransactionID\")]\n        public long JournalTransactionID { get; set; }\n\n        [XmlAttribute(\"quantity\")]\n        public long Quantity { get; set; }\n\n        [XmlAttribute(\"typeID\")]\n        public int TypeID { get; set; }\n\n        [XmlAttribute(\"typeName\")]\n        public string TypeName { get; set; }\n\n        [XmlAttribute(\"price\")]\n        public decimal Price { get; set; }\n\n        [XmlAttribute(\"clientID\")]\n        public long ClientID { get; set; }\n\n        [XmlAttribute(\"clientName\")]\n        public string ClientNameXml\n        {\n            get { return ClientName; }\n            set { ClientName = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlAttribute(\"stationID\")]\n        public long StationID { get; set; }\n\n        [XmlAttribute(\"stationName\")]\n        public string StationNameXml\n        {\n            get { return StationName; }\n            set { StationName = value?.HtmlDecode() ?? string.Empty; }\n        }\n\n        [XmlAttribute(\"transactionType\")]\n        public string TransactionType { get; set; }\n\n        [XmlAttribute(\"transactionFor\")]\n        public string TransactionFor { get; set; }\n\n        [XmlAttribute(\"transactionDateTime\")]\n        public string TransactionDateXml\n        {\n            get { return TransactionDate.DateTimeToTimeString(); }\n            set\n            {\n                if (!string.IsNullOrEmpty(value))\n                    TransactionDate = value.TimeStringToDateTime();\n            }\n        }\n\n        [XmlIgnore]\n        public string ClientName { get; set; }\n\n        [XmlIgnore]\n        public string StationName { get; set; }\n\n        [XmlIgnore]\n        public DateTime TransactionDate { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Eve/rowsets-transform.xslt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n                xmlns:msxsl=\"urn:schemas-microsoft-com:xslt\" exclude-result-prefixes=\"msxsl\">\n  <xsl:strip-space elements=\"*\" />\n  <xsl:output method=\"xml\" indent=\"yes\" />\n\n  <xsl:template match=\"@* | node()\">\n    <xsl:copy>\n      <xsl:apply-templates select=\"@* | node()\" />\n    </xsl:copy>\n  </xsl:template>\n\n  <!-- Rowsets are transformed into something else-->\n  <xsl:template match=\"rowset\">\n    <!-- Select the set and row names. -->\n    <xsl:choose>\n      <!-- (skillqueue, row) are transformed into (queue, skill) -->\n      <xsl:when test=\"@name='skillqueue'\">\n        <xsl:call-template name=\"rowsets\">\n          <xsl:with-param name=\"setName\" select=\"'queue'\" />\n          <xsl:with-param name=\"rowName\" select=\"'skill'\" />\n        </xsl:call-template>\n      </xsl:when>\n      <!-- (research, row) are transformed into (research, points) -->\n      <xsl:when test=\"@name='research'\">\n        <xsl:call-template name=\"rowsets\">\n          <xsl:with-param name=\"setName\" select=\"'research'\" />\n          <xsl:with-param name=\"rowName\" select=\"'points'\" />\n        </xsl:call-template>\n      </xsl:when>\n      <!-- (employmentHistory, row) are transformed into (employmentHistory, record) -->\n      <xsl:when test=\"@name='employmentHistory'\">\n        <xsl:call-template name=\"rowsets\">\n          <xsl:with-param name=\"setName\" select=\"@name\" />\n          <xsl:with-param name=\"rowName\" select=\"'record'\" />\n        </xsl:call-template>\n      </xsl:when>\n      <!-- (contractList, row) are transformed into (contracts, contract) -->\n      <xsl:when test=\"@name='contractList'\">\n        <xsl:call-template name=\"rowsets\">\n          <xsl:with-param name=\"setName\" select=\"'contracts'\" />\n          <xsl:with-param name=\"rowName\" select=\"'contract'\" />\n        </xsl:call-template>\n      </xsl:when>\n      <!-- (itemList, row) are transformed into (contractItems, contractItem) -->\n      <xsl:when test=\"@name='itemList'\">\n        <xsl:call-template name=\"rowsets\">\n          <xsl:with-param name=\"setName\" select=\"'contractItems'\" />\n          <xsl:with-param name=\"rowName\" select=\"'contractItem'\" />\n        </xsl:call-template>\n      </xsl:when>\n      <!-- (bidList, row) are transformed into (bids, bid) -->\n      <xsl:when test=\"@name='bidList'\">\n        <xsl:call-template name=\"rowsets\">\n          <xsl:with-param name=\"setName\" select=\"'bids'\" />\n          <xsl:with-param name=\"rowName\" select=\"'bid'\" />\n        </xsl:call-template>\n      </xsl:when>\n      <!-- (contactList, row) are transformed into (contacts, contact) -->\n      <xsl:when test=\"@name='contactList'\">\n        <xsl:call-template name=\"rowsets\">\n          <xsl:with-param name=\"setName\" select=\"'contacts'\" />\n          <xsl:with-param name=\"rowName\" select=\"'contact'\" />\n        </xsl:call-template>\n      </xsl:when>\n      <!-- (corporateContactList, row) are transformed into (corporateContacts, corporateContact) -->\n      <xsl:when test=\"@name='corporateContactList'\">\n        <xsl:call-template name=\"rowsets\">\n          <xsl:with-param name=\"setName\" select=\"'corporateContacts'\" />\n          <xsl:with-param name=\"rowName\" select=\"'corporateContact'\" />\n        </xsl:call-template>\n      </xsl:when>\n      <!-- (allianceContactList, row) are transformed into (allianceContacts, allianceContact) -->\n      <xsl:when test=\"@name='allianceContactList'\">\n        <xsl:call-template name=\"rowsets\">\n          <xsl:with-param name=\"setName\" select=\"'allianceContacts'\" />\n          <xsl:with-param name=\"rowName\" select=\"'allianceContact'\" />\n        </xsl:call-template>\n      </xsl:when>\n      <!-- (currentCorporation, row) are transformed into (currentCorporation, medal) -->\n      <xsl:when test=\"@name='currentCorporation'\">\n        <xsl:call-template name=\"rowsets\">\n          <xsl:with-param name=\"setName\" select=\"@name\" />\n          <xsl:with-param name=\"rowName\" select=\"'medal'\" />\n        </xsl:call-template>\n      </xsl:when>\n      <!-- (otherCorporations, row) are transformed into (otherCorporations, medal) -->\n      <xsl:when test=\"@name='otherCorporations'\">\n        <xsl:call-template name=\"rowsets\">\n          <xsl:with-param name=\"setName\" select=\"@name\" />\n          <xsl:with-param name=\"rowName\" select=\"'medal'\" />\n        </xsl:call-template>\n      </xsl:when>\n      <!-- (colonies, row) are transformed into (colonies, colony) -->\n      <xsl:when test=\"@name='colonies'\">\n        <xsl:call-template name=\"rowsets\">\n          <xsl:with-param name=\"setName\" select=\"@name\" />\n          <xsl:with-param name=\"rowName\" select=\"'colony'\" />\n        </xsl:call-template>\n      </xsl:when>\n      <!-- By default behaviour, the rowset is a plural so we just remove the last character to get the row name-->\n      <xsl:otherwise>\n        <xsl:call-template name=\"rowsets\">\n          <xsl:with-param name=\"setName\" select=\"@name\" />\n          <xsl:with-param name=\"rowName\" select=\"substring(@name, 1, string-length(@name) - 1)\" />\n        </xsl:call-template>\n      </xsl:otherwise>\n    </xsl:choose>\n  </xsl:template>\n\n  <!-- Transform 'characterName' to 'name'-->\n  <xsl:template match=\"@characterName\">\n    <xsl:attribute name=\"name\">\n      <xsl:value-of select=\".\" />\n    </xsl:attribute>\n  </xsl:template>\n\n  <!-- Template applied to rowsets-->\n  <xsl:template name=\"rowsets\">\n    <xsl:param name=\"setName\">rowset</xsl:param>\n    <xsl:param name=\"rowName\">row</xsl:param>\n    <xsl:element name=\"{$setName}\">\n      <xsl:for-each select=\"row\">\n        <xsl:element name=\"{$rowName}\">\n          <xsl:for-each select=\"@* | node()\">\n            <xsl:apply-templates select=\".\" />\n          </xsl:for-each>\n        </xsl:element>\n      </xsl:for-each>\n    </xsl:element>\n  </xsl:template>\n\n</xsl:stylesheet>"
  },
  {
    "path": "src/EVEMon.Common/Serialization/EveMarketData/MarketPricer/SerializableEMDItemPriceList.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.EveMarketData.MarketPricer\n{\n    public sealed class SerializableEMDItemPriceList\n    {\n        private readonly Collection<SerializableEMDItemPriceListItem> m_itemPrices;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableEMDItemPriceList\"/> class.\n        /// </summary>\n        public SerializableEMDItemPriceList()\n        {\n            m_itemPrices = new Collection<SerializableEMDItemPriceListItem>();\n        }\n\n        [XmlArray(\"rowset\")]\n        [XmlArrayItem(\"row\")]\n        public Collection<SerializableEMDItemPriceListItem> ItemPrices => m_itemPrices;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/EveMarketData/MarketPricer/SerializableEMDItemPriceListItem.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.EveMarketData.MarketPricer\n{\n    public sealed class SerializableEMDItemPriceListItem\n    {\n        [XmlAttribute(\"typeID\")]\n        public int ID { get; set; }\n\n        [XmlAttribute(\"buysell\")]\n        public string BuySell { get; set; }\n\n        [XmlAttribute(\"price\")]\n        public double Price { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/EveMarketData/MarketPricer/SerializableEMDItemPrices.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.EveMarketData.MarketPricer\n{\n    [XmlRoot(\"emd\")]\n    public sealed class SerializableEMDItemPrices\n    {\n        [XmlElement(\"result\")]\n        public SerializableEMDItemPriceList Result { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/EveMarketer/MarketPricer/SerializableECItemPriceItem.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.EveMarketer.MarketPricer\n{\n    public sealed class SerializableECItemPriceItem\n    {\n        [XmlElement(\"avg\")]\n        public double Average { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/EveMarketer/MarketPricer/SerializableECItemPriceListItem.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.EveMarketer.MarketPricer\n{\n    public sealed class SerializableECItemPriceListItem\n    {\n        [XmlAttribute(\"id\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"sell\")]\n        public SerializableECItemPriceItem Prices { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/EveMarketer/MarketPricer/SerializableECItemPrices.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.EveMarketer.MarketPricer\n{\n    [XmlRoot(\"exec_api\")]\n    public sealed class SerializableECItemPrices\n    {\n        private readonly Collection<SerializableECItemPriceListItem> m_itemPrices;\n\n        public SerializableECItemPrices()\n        {\n            m_itemPrices = new Collection<SerializableECItemPriceListItem>();\n        }\n\n        [XmlArray(\"marketstat\")]\n        [XmlArrayItem(\"type\")]\n        public Collection<SerializableECItemPriceListItem> ItemPrices => m_itemPrices;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Exportation/OutputAttributeEnhancer.cs",
    "content": "using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Serialization.Exportation\n{\n    /// <summary>\n    /// A serialization class designed for HTML exportation.\n    /// </summary>\n    public sealed class OutputAttributeEnhancer\n    {\n        [XmlAttribute(\"attribute\")]\n        public ImplantSlots Attribute { get; set; }\n\n        [XmlAttribute(\"description\")]\n        public string Description { get; set; }\n\n        [XmlAttribute(\"bonus\")]\n        public long Bonus { get; set; }\n\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Exportation/OutputCharacter.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Exportation\n{\n    /// <summary>\n    /// A serialization class designed for HTML exportation.\n    /// </summary>\n    [XmlRoot(\"outputCharacter\")]\n    public sealed class OutputCharacter\n    {\n        private readonly Collection<OutputAttributeEnhancer> m_attributeEnhancers;\n        private readonly Collection<OutputSkillGroup> m_skillGroups;\n\n        public OutputCharacter()\n        {\n            m_attributeEnhancers = new Collection<OutputAttributeEnhancer>();\n            m_skillGroups = new Collection<OutputSkillGroup>();\n        }\n\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        [XmlAttribute(\"characterID\")]\n        public long CharacterID { get; set; }\n\n        [XmlElement(\"race\")]\n        public string Race { get; set; }\n\n        [XmlElement(\"bloodLine\")]\n        public string BloodLine { get; set; }\n        \n        [XmlElement(\"ancestry\")]\n        public string Ancestry { get; set; }\n\n        [XmlElement(\"gender\")]\n        public string Gender { get; set; }\n\n        [XmlElement(\"corporationName\")]\n        public string CorporationName { get; set; }\n\n        [XmlElement(\"balance\")]\n        public string Balance { get; set; }\n\n        [XmlElement(\"birthday\")]\n        public string Birthday { get; set; }\n\n        [XmlElement(\"intelligence\")]\n        public float Intelligence { get; set; }\n\n        [XmlElement(\"charisma\")]\n        public float Charisma { get; set; }\n\n        [XmlElement(\"perception\")]\n        public float Perception { get; set; }\n\n        [XmlElement(\"memory\")]\n        public float Memory { get; set; }\n\n        [XmlElement(\"willpower\")]\n        public float Willpower { get; set; }\n\n        [XmlArray(\"attributeEnhancers\")]\n        [XmlArrayItem(\"implant\")]\n        public Collection<OutputAttributeEnhancer> AttributeEnhancers => m_attributeEnhancers;\n\n        [XmlArray(\"skills\")]\n        [XmlArrayItem(\"skillGroup\")]\n        public Collection<OutputSkillGroup> SkillGroups => m_skillGroups;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Exportation/OutputPlan.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Serialization.Exportation\n{\n    [XmlRoot(\"plan\")]\n    public sealed class OutputPlan : SerializablePlan\n    {\n        [XmlAttribute(\"revision\")]\n        public int Revision { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Exportation/OutputPlans.cs",
    "content": "using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.Serialization.Exportation\n{\n    [XmlRoot(\"plans\")]\n    public sealed class OutputPlans\n    {\n        private readonly Collection<SerializablePlan> m_plans;\n\n        public OutputPlans()\n        {\n            m_plans = new Collection<SerializablePlan>();\n        }\n\n        [XmlAttribute(\"revision\")]\n        public int Revision { get; set; }\n\n        [XmlElement(\"plan\")]\n        public Collection<SerializablePlan> Plans => m_plans;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Exportation/OutputSkill.cs",
    "content": "using System;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Exportation\n{\n    /// <summary>\n    /// A serialization class designed for HTML exportation.\n    /// </summary>\n    public sealed class OutputSkill\n    {\n        [XmlAttribute(\"typeName\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"rank\")]\n        public long Rank { get; set; }\n\n        [XmlElement(\"level\")]\n        public long Level { get; set; }\n\n        [XmlElement(\"romanLevel\")]\n        public string RomanLevel { get; set; }\n\n        [XmlElement(\"SP\")]\n        public string SkillPoints { get; set; }\n\n        [XmlElement(\"maxSP\")]\n        public string MaxSkillPoints { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Exportation/OutputSkillGroup.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Exportation\n{\n    /// <summary>\n    /// A serialization class designed for HTML exportation.\n    /// </summary>\n    public sealed class OutputSkillGroup\n    {\n        private readonly Collection<OutputSkill> m_skills;\n\n        public OutputSkillGroup()\n        {\n            m_skills = new Collection<OutputSkill>();\n        }\n\n        [XmlAttribute(\"groupName\")]\n        public string Name { get; set; }\n\n        [XmlAttribute(\"skillsCount\")]\n        public int SkillsCount { get; set; }\n\n        [XmlAttribute(\"totalSP\")]\n        public string TotalSP { get; set; }\n\n        [XmlElement(\"skill\")]\n        public Collection<OutputSkill> Skills => m_skills;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Exportation/output-html.xslt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n  <xsl:template match=\"outputCharacter\">\n    <html>\n      <head>\n        <title>\n          Character Sheet ::\n          <xsl:value-of select=\"@name\" />\n        </title>\n      </head>\n      <body>\n        <table>\n          <tr>\n            <td>\n              <xsl:element name=\"img\">\n                <xsl:attribute name=\"src\">http://image.eveonline.com/character/<xsl:value-of select=\"@characterID\" />_256.jpg</xsl:attribute>\n                <xsl:attribute name=\"style\">width:256px;height:256px;</xsl:attribute>\n              </xsl:element>\n            </td>\n            <td>\n              <p>\n              <div class=\"characterName\">\n                <font size =\"5\">\n                  <b>\n                    <xsl:value-of select=\"@name\" />\n                  </b>\n                </font>\n              </div>\n              <div class=\"characterBio\">\n                <span class=\"gender\">\n                  <xsl:value-of select=\"gender/child::text()\" /> - \n                </span>\n                <span class=\"race\">\n                  <xsl:value-of select=\"race/child::text()\" /> - \n                </span>\n                <span class=\"bloodline\">\n                  <xsl:value-of select=\"bloodLine/child::text()\" /> - \n                </span>\n                <span class=\"ancestry\">\n                  <xsl:value-of select=\"ancestry/child::text()\" />\n                </span>\n              </div>\n              <div class=\"balanceInfo\">\n                Balance:\n                <span class=\"balance\">\n                  <xsl:value-of select=\"balance/child::text()\" /> ISK\n                </span>\n              </div>\n              <div class=\"BirthInfo\">\n                Birthday:\n                <span class=\"birtdayDateTime\">\n                  <xsl:value-of select=\"birthday/child::text()\" /> UTC\n                </span>\n              </div>\n              <div class=\"corpInfo\">\n                Corporation:\n                <span class=\"corpName\">\n                  <xsl:value-of select=\"corporationName/child::text()\" />\n                </span>\n              </div>\n              </p>\n              <table class=\"attributes\">\n                <tr>\n                  <td class=\"attributeTitle intelligenceTitle\">Intelligence:</td>\n                  <td class=\"attributeValue intelligenceValue\">\n                    <xsl:value-of select=\"intelligence/child::text()\" />\n                  </td>\n                </tr>\n                <tr>\n                  <td class=\"attributeTitle perceptionTitle\">Perception:</td>\n                  <td class=\"attributeValue perceptionValue\">\n                    <xsl:value-of select=\"perception/child::text()\" />\n                  </td>\n                </tr>\n                <tr>\n                  <td class=\"attributeTitle charismaTitle\">Charisma:</td>\n                  <td class=\"attributeValue charismaValue\">\n                    <xsl:value-of select=\"charisma/child::text()\" />\n                  </td>\n                </tr>\n                <tr>\n                  <td class=\"attributeTitle willpowerTitle\">Willpower:</td>\n                  <td class=\"attributeValue willpowerValue\">\n                    <xsl:value-of select=\"willpower/child::text()\" />\n                  </td>\n                </tr>\n                <tr>\n                  <td class=\"attributeTitle memoryTitle\">Memory:</td>\n                  <td class=\"attributeValue memoryValue\">\n                    <xsl:value-of select=\"memory/child::text()\" />\n                  </td>\n                </tr>\n              </table>\n              <xsl:if test=\"attributeEnhancers/*\">\n                <table class=\"implantTable\">\n                  <xsl:apply-templates select=\"attributeEnhancers/*\" />\n                </table>\n              </xsl:if>\n            </td>\n          </tr>\n        </table>\n        <table class=\"skills\">\n          <xsl:apply-templates select=\"skills/skillGroup\" />\n        </table>\n      </body>\n    </html>\n  </xsl:template>\n\n  <xsl:template match=\"implant\">\n    <tr>\n      <p>\n        <xsl:element name=\"td\">\n          <xsl:attribute name=\"class\">implantSlot<xsl:value-of select=\"@attribute\" />ImplantSlot</xsl:attribute><xsl:value-of select=\"@description\" />\n        </xsl:element>\n        <xsl:element name=\"td\">\n          <xsl:attribute name=\"class\">implantBonus<xsl:value-of select=\"@attribute\" />ImplantBonus</xsl:attribute> : + <xsl:value-of select=\"@bonus\" />\n        </xsl:element>\n        <xsl:element name=\"td\">\n          <xsl:attribute name=\"class\">implantName<xsl:value-of select=\"@attribute\" />ImplantName</xsl:attribute>(<xsl:value-of select=\"@name\" />)\n        </xsl:element>\n      </p>\n    </tr>\n  </xsl:template>\n\n  <xsl:template match=\"skillGroup\">\n    <tr class=\"spacer\">\n      <td>\n        <br />\n      </td>\n    </tr> \n    <tr class=\"skillGroupHeader\">\n      <td colspan=\"4\">\n        <b>\n          <xsl:value-of select=\"@groupName\" /> - <xsl:value-of select=\"@skillsCount\" /> Skill<xsl:if test=\"count(skill)>1\">s</xsl:if>, <xsl:value-of select=\"@totalSP\" /> Points\n        </b>\n      </td>\n    </tr>\n    <tr class=\"skillGroupColumnHeaders\">\n      <td class=\"spacer\"></td>\n      <td class=\"name\">\n        <b>Name</b>\n      </td>\n      <td class=\"level\">\n        <b>Level</b>\n      </td>\n      <td class=\"skillpoints\">\n        <b>Points</b>\n      </td>\n    </tr>\n    <xsl:apply-templates select=\"skill\" />\n  </xsl:template>\n\n  <xsl:template match=\"skill\">\n    <tr class=\"skillRow\">\n      <td class=\"spacer\"></td>\n      <td class=\"name\">\n        <xsl:value-of select=\"@typeName\" /> (Rank <xsl:value-of select=\"rank/child::text()\" />)\n      </td>\n      <td class=\"level\">\n        Level <xsl:value-of select=\"romanLevel/child::text()\" />\n      </td>\n      <td class=\"skillpoints\">\n        (<xsl:value-of select=\"SP/child::text()\" /> / <xsl:value-of select=\"maxSP/child::text()\" /> SP)\n      </td>\n    </tr>\n    <!-- Skill training detection -->\n    <!--xsl:if test=\"ancestor::character/skillInTraining/SkillName/child::text() = @typeName\">\n      <tr class=\"skillInTraining\">\n        <td colspan=\"4\">\n          Currently training to level\n          <xsl:choose>\n            <xsl:when test=\"number(ancestor::character/skillInTraining/TrainingToLevel/child::text())=1\">I</xsl:when>\n            <xsl:when test=\"number(ancestor::character/skillInTraining/TrainingToLevel/child::text())=2\">II</xsl:when>\n            <xsl:when test=\"number(ancestor::character/skillInTraining/TrainingToLevel/child::text())=3\">III</xsl:when>\n            <xsl:when test=\"number(ancestor::character/skillInTraining/TrainingToLevel/child::text())=4\">IV</xsl:when>\n            <xsl:when test=\"number(ancestor::character/skillInTraining/TrainingToLevel/child::text())=5\">V</xsl:when>\n          </xsl:choose>, will complete <xsl:value-of select=\"ancestor::character/skillInTraining/EstimatedCompletion/child::text()\"/>.\n        </td>\n      </tr>\n    </xsl:if-->\n  </xsl:template>\n</xsl:stylesheet>"
  },
  {
    "path": "src/EVEMon.Common/Serialization/FittingClf/SerializableClfFitting.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.FittingClf\n{\n    [DataContract]\n    public sealed class SerializableClfFitting\n    {\n        private Collection<SerializableClfFittingPreset> m_presets;\n        private Collection<SerializableClfFittingDroneSet> m_drones;\n\n        [DataMember(Name = \"clf-version\")]\n        public string ClfVersion { get; set; }\n\n        [DataMember(Name = \"metadata\")]\n        public SerializableClfFittingMetaData MetaData { get; set; }\n\n        [DataMember(Name = \"ship\")]\n        public SerializableClfFittingShipType Ship { get; set; }\n\n        [DataMember(Name = \"presets\")]\n        public Collection<SerializableClfFittingPreset> Presets => m_presets ?? (m_presets = new Collection<SerializableClfFittingPreset>());\n\n        [DataMember(Name = \"drones\")]\n        public Collection<SerializableClfFittingDroneSet> Drones => m_drones ?? (m_drones = new Collection<SerializableClfFittingDroneSet>());\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/FittingClf/SerializableClfFittingChargeType.cs",
    "content": "﻿using System.Runtime.Serialization;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Serialization.FittingClf\n{\n    [DataContract]\n    public sealed class SerializableClfFittingChargeType\n    {\n        [DataMember(Name = \"typeid\")]\n        public int TypeID\n        {\n            get { return Item.ID; }\n            set\n            {\n                Item = StaticItems.GetItemByID(value) ?? Item.UnknownItem;\n            }\n        }\n\n        public Item Item { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/FittingClf/SerializableClfFittingDroneSet.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.FittingClf\n{\n    [DataContract]\n    public sealed class SerializableClfFittingDroneSet\n    {\n        private Collection<SerializableClfFittingDroneType> m_inBayDrones;\n        private Collection<SerializableClfFittingDroneType> m_inSpaceDrones;\n\n        [DataMember(Name = \"presetname\")]\n        public string Name { get; set; }\n\n        [DataMember(Name = \"inbay\")]\n        public Collection<SerializableClfFittingDroneType> InBay => m_inBayDrones ?? (m_inBayDrones = new Collection<SerializableClfFittingDroneType>());\n\n        [DataMember(Name = \"inspace\")]\n        public Collection<SerializableClfFittingDroneType> InSpace => m_inSpaceDrones ?? (m_inSpaceDrones = new Collection<SerializableClfFittingDroneType>());\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/FittingClf/SerializableClfFittingDroneType.cs",
    "content": "﻿using System.Runtime.Serialization;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Serialization.FittingClf\n{\n    [DataContract]\n    public sealed class SerializableClfFittingDroneType\n    {\n        [DataMember(Name = \"typeid\")]\n        public int TypeID\n        {\n            get { return Item.ID; }\n            set\n            {\n                Item = StaticItems.GetItemByID(value) ?? Item.UnknownItem;\n            }\n        }\n\n        [DataMember(Name = \"quantity\")]\n        public int Quantity { get; set; }\n\n        public Item Item { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/FittingClf/SerializableClfFittingMetaData.cs",
    "content": "using System;\nusing System.Runtime.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.FittingClf\n{\n    [DataContract]\n    public sealed class SerializableClfFittingMetaData\n    {\n        [DataMember(Name = \"title\")]\n        public string Title { get; set; }\n\n        [DataMember(Name = \"description\")]\n        public string Description { get; set; }\n\n        [DataMember(Name = \"creationdate\")]\n        public string CreationDateJson\n        {\n            get { return CreationDate.DateTimeToTimeString(\"ddd, dd MMM yyyy HH:mm:ss +0000\"); }\n            set\n            {\n                if (!string.IsNullOrWhiteSpace(value))\n                    CreationDate = value.TimeStringToDateTime();\n            }\n        }\n\n        public DateTime CreationDate { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/FittingClf/SerializableClfFittingModule.cs",
    "content": "using System.Collections.ObjectModel;\nusing System.Runtime.Serialization;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Serialization.FittingClf\n{\n    [DataContract]\n    public sealed class SerializableClfFittingModule\n    {\n        private Collection<SerializableClfFittingChargeType> m_charges;\n\n        [DataMember(Name = \"typeid\")]\n        public int TypeID\n        {\n            get { return Item.ID; }\n            set\n            {\n                Item = StaticItems.GetItemByID(value) ?? Item.UnknownItem;\n            }\n        }\n\n        [DataMember(Name = \"charges\")]\n        public Collection<SerializableClfFittingChargeType> Charges => m_charges ?? (m_charges = new Collection<SerializableClfFittingChargeType>());\n\n        public Item Item { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/FittingClf/SerializableClfFittingPreset.cs",
    "content": "using System.Collections.ObjectModel;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.FittingClf\n{\n    [DataContract]\n    public sealed class SerializableClfFittingPreset\n    {\n        private Collection<SerializableClfFittingModule> m_modules;\n\n        [DataMember(Name = \"presetname\")]\n        public string Name { get; set; }\n\n        [DataMember(Name = \"modules\")]\n        public Collection<SerializableClfFittingModule> Modules => m_modules ?? (m_modules = new Collection<SerializableClfFittingModule>());\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/FittingClf/SerializableClfFittingShipType.cs",
    "content": "﻿using System.Runtime.Serialization;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Serialization.FittingClf\n{\n    [DataContract]\n    public sealed class SerializableClfFittingShipType\n    {\n        [DataMember(Name = \"typeid\")]\n        public int TypeID\n        {\n            get { return Item.ID; }\n            set { Item = StaticItems.GetItemByID(value) ?? Item.UnknownItem; }\n        }\n\n        public Item Item { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/FittingXml/SerializableXmlFitting.cs",
    "content": "using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.FittingXml\n{\n    public sealed class SerializableXmlFitting\n    {\n        private readonly Collection<SerializableXmlFittingHardware> m_fittingHardwares;\n\n        public SerializableXmlFitting()\n        {\n            m_fittingHardwares = new Collection<SerializableXmlFittingHardware>();\n        }\n\n        [XmlElement(\"hardware\")]\n        public Collection<SerializableXmlFittingHardware> FittingHardware => m_fittingHardwares;\n\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"description\")]\n        public SerializableXmlFittingDescription Description { get; set; }\n\n        [XmlElement(\"shipType\")]\n        public SerializableXmlFittingShipType ShipType { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/FittingXml/SerializableXmlFittingDescription.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.FittingXml\n{\n    public sealed class SerializableXmlFittingDescription\n    {\n        [XmlAttribute(\"value\")]\n        public string Text { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/FittingXml/SerializableXmlFittingHardware.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Serialization.FittingXml\n{\n    public sealed class SerializableXmlFittingHardware\n    {\n        [XmlAttribute(\"qty\")]\n        public int Quantity { get; set; }\n\n        [XmlAttribute(\"slot\")]\n        public string Slot { get; set; }\n\n        [XmlAttribute(\"type\")]\n        public string ItemXml\n        {\n            get { return Item.Name; }\n            set\n            {\n                Item = StaticItems.GetItemByName(value) ?? Item.UnknownItem;\n            }\n        }\n\n        [XmlIgnore]\n        public Item Item { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/FittingXml/SerializableXmlFittingShipType.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.FittingXml\n{\n    public sealed class SerializableXmlFittingShipType\n    {\n        [XmlAttribute(\"value\")]\n        public string Name { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/FittingXml/SerializableXmlFittings.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.FittingXml\n{\n    [XmlRoot(\"fittings\")]\n    public sealed class SerializableXmlFittings\n    {\n        [XmlElement(\"fitting\")]\n        public SerializableXmlFitting Fitting { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Flags.xml",
    "content": "<?xml version=\"1.0\"?>\n<invFlags xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <rowset name=\"flags\" key=\"flagID\" columns=\"flagID,flagName,flagText\">\n    <row flagID=\"0\" flagName=\"None\" flagText=\"None\" />\n    <row flagID=\"1\" flagName=\"Wallet\" flagText=\"Wallet\" />\n    <row flagID=\"2\" flagName=\"Offices\" flagText=\"OfficeFolder\" />\n    <row flagID=\"3\" flagName=\"Wardrobe\" flagText=\"Wardrobe\" />\n    <row flagID=\"4\" flagName=\"Hangar\" flagText=\"Hangar\" />\n    <row flagID=\"5\" flagName=\"Cargo\" flagText=\"Cargo\" />\n    <row flagID=\"6\" flagName=\"OfficeImpound\" flagText=\"Impounded Offices\" />\n    <row flagID=\"7\" flagName=\"Skill\" flagText=\"Skill\" />\n    <row flagID=\"8\" flagName=\"Reward\" flagText=\"Reward\" />\n    <row flagID=\"11\" flagName=\"LoSlot0\" flagText=\"Low power slot 1\" />\n    <row flagID=\"12\" flagName=\"LoSlot1\" flagText=\"Low power slot 2\" />\n    <row flagID=\"13\" flagName=\"LoSlot2\" flagText=\"Low power slot 3\" />\n    <row flagID=\"14\" flagName=\"LoSlot3\" flagText=\"Low power slot 4\" />\n    <row flagID=\"15\" flagName=\"LoSlot4\" flagText=\"Low power slot 5\" />\n    <row flagID=\"16\" flagName=\"LoSlot5\" flagText=\"Low power slot 6\" />\n    <row flagID=\"17\" flagName=\"LoSlot6\" flagText=\"Low power slot 7\" />\n    <row flagID=\"18\" flagName=\"LoSlot7\" flagText=\"Low power slot 8\" />\n    <row flagID=\"19\" flagName=\"MedSlot0\" flagText=\"Medium power slot 1\" />\n    <row flagID=\"20\" flagName=\"MedSlot1\" flagText=\"Medium power slot 2\" />\n    <row flagID=\"21\" flagName=\"MedSlot2\" flagText=\"Medium power slot 3\" />\n    <row flagID=\"22\" flagName=\"MedSlot3\" flagText=\"Medium power slot 4\" />\n    <row flagID=\"23\" flagName=\"MedSlot4\" flagText=\"Medium power slot 5\" />\n    <row flagID=\"24\" flagName=\"MedSlot5\" flagText=\"Medium power slot 6\" />\n    <row flagID=\"25\" flagName=\"MedSlot6\" flagText=\"Medium power slot 7\" />\n    <row flagID=\"26\" flagName=\"MedSlot7\" flagText=\"Medium power slot 8\" />\n    <row flagID=\"27\" flagName=\"HiSlot0\" flagText=\"High power slot 1\" />\n    <row flagID=\"28\" flagName=\"HiSlot1\" flagText=\"High power slot 2\" />\n    <row flagID=\"29\" flagName=\"HiSlot2\" flagText=\"High power slot 3\" />\n    <row flagID=\"30\" flagName=\"HiSlot3\" flagText=\"High power slot 4\" />\n    <row flagID=\"31\" flagName=\"HiSlot4\" flagText=\"High power slot 5\" />\n    <row flagID=\"32\" flagName=\"HiSlot5\" flagText=\"High power slot 6\" />\n    <row flagID=\"33\" flagName=\"HiSlot6\" flagText=\"High power slot 7\" />\n    <row flagID=\"34\" flagName=\"HiSlot7\" flagText=\"High power slot 8\" />\n    <row flagID=\"35\" flagName=\"Fixed Slot\" flagText=\"Fixed Slot\" />\n    <row flagID=\"36\" flagName=\"AssetSafety\" flagText=\"Asset Safety\" />\n    <row flagID=\"56\" flagName=\"Capsule\" flagText=\"Capsule\" />\n    <row flagID=\"57\" flagName=\"Pilot\" flagText=\"Pilot\" />\n    <row flagID=\"61\" flagName=\"Skill In Training\" flagText=\"Skill in training\" />\n    <row flagID=\"62\" flagName=\"CorpMarket\" flagText=\"Corporation Market Deliveries / Returns\" />\n    <row flagID=\"63\" flagName=\"Locked\" flagText=\"Locked item, can not be moved unless unlocked\" />\n    <row flagID=\"64\" flagName=\"Unlocked\" flagText=\"Unlocked item, can be moved\" />\n    <row flagID=\"70\" flagName=\"Office Slot 1\" flagText=\"Office slot 1\" />\n    <row flagID=\"71\" flagName=\"Office Slot 2\" flagText=\"Office slot 2\" />\n    <row flagID=\"72\" flagName=\"Office Slot 3\" flagText=\"Office slot 3\" />\n    <row flagID=\"73\" flagName=\"Office Slot 4\" flagText=\"Office slot 4\" />\n    <row flagID=\"74\" flagName=\"Office Slot 5\" flagText=\"Office slot 5\" />\n    <row flagID=\"75\" flagName=\"Office Slot 6\" flagText=\"Office slot 6\" />\n    <row flagID=\"76\" flagName=\"Office Slot 7\" flagText=\"Office slot 7\" />\n    <row flagID=\"77\" flagName=\"Office Slot 8\" flagText=\"Office slot 8\" />\n    <row flagID=\"78\" flagName=\"Office Slot 9\" flagText=\"Office slot 9\" />\n    <row flagID=\"79\" flagName=\"Office Slot 10\" flagText=\"Office slot 10\" />\n    <row flagID=\"80\" flagName=\"Office Slot 11\" flagText=\"Office slot 11\" />\n    <row flagID=\"81\" flagName=\"Office Slot 12\" flagText=\"Office slot 12\" />\n    <row flagID=\"82\" flagName=\"Office Slot 13\" flagText=\"Office slot 13\" />\n    <row flagID=\"83\" flagName=\"Office Slot 14\" flagText=\"Office slot 14\" />\n    <row flagID=\"84\" flagName=\"Office Slot 15\" flagText=\"Office slot 15\" />\n    <row flagID=\"85\" flagName=\"Office Slot 16\" flagText=\"Office slot 16\" />\n    <row flagID=\"86\" flagName=\"Bonus\" flagText=\"Bonus\" />\n    <row flagID=\"87\" flagName=\"DroneBay\" flagText=\"Drone Bay\" />\n    <row flagID=\"88\" flagName=\"Booster\" flagText=\"Booster\" />\n    <row flagID=\"89\" flagName=\"Implant\" flagText=\"Implant\" />\n    <row flagID=\"90\" flagName=\"ShipHangar\" flagText=\"Ship Hangar\" />\n    <row flagID=\"91\" flagName=\"ShipOffline\" flagText=\"Ship Offline\" />\n    <row flagID=\"92\" flagName=\"RigSlot0\" flagText=\"Rig power slot 1\" />\n    <row flagID=\"93\" flagName=\"RigSlot1\" flagText=\"Rig power slot 2\" />\n    <row flagID=\"94\" flagName=\"RigSlot2\" flagText=\"Rig power slot 3\" />\n    <row flagID=\"95\" flagName=\"RigSlot3\" flagText=\"Rig power slot 4\" />\n    <row flagID=\"96\" flagName=\"RigSlot4\" flagText=\"Rig power slot 5\" />\n    <row flagID=\"97\" flagName=\"RigSlot5\" flagText=\"Rig power slot 6\" />\n    <row flagID=\"98\" flagName=\"RigSlot6\" flagText=\"Rig power slot 7\" />\n    <row flagID=\"99\" flagName=\"RigSlot7\" flagText=\"Rig power slot 8\" />\n    <row flagID=\"115\" flagName=\"CorpSAG1\" flagText=\"Corp Security Access Group 1\" />\n    <row flagID=\"116\" flagName=\"CorpSAG2\" flagText=\"Corp Security Access Group 2\" />\n    <row flagID=\"117\" flagName=\"CorpSAG3\" flagText=\"Corp Security Access Group 3\" />\n    <row flagID=\"118\" flagName=\"CorpSAG4\" flagText=\"Corp Security Access Group 4\" />\n    <row flagID=\"119\" flagName=\"CorpSAG5\" flagText=\"Corp Security Access Group 5\" />\n    <row flagID=\"120\" flagName=\"CorpSAG6\" flagText=\"Corp Security Access Group 6\" />\n    <row flagID=\"121\" flagName=\"CorpSAG7\" flagText=\"Corp Security Access Group 7\" />\n    <row flagID=\"122\" flagName=\"SecondaryStorage\" flagText=\"Secondary Storage\" />\n    <row flagID=\"125\" flagName=\"SubSystem0\" flagText=\"Sub system slot 0\" />\n    <row flagID=\"126\" flagName=\"SubSystem1\" flagText=\"Sub system slot 1\" />\n    <row flagID=\"127\" flagName=\"SubSystem2\" flagText=\"Sub system slot 2\" />\n    <row flagID=\"128\" flagName=\"SubSystem3\" flagText=\"Sub system slot 3\" />\n    <row flagID=\"129\" flagName=\"SubSystem4\" flagText=\"Sub system slot 4\" />\n    <row flagID=\"130\" flagName=\"SubSystem5\" flagText=\"Sub system slot 5\" />\n    <row flagID=\"131\" flagName=\"SubSystem6\" flagText=\"Sub system slot 6\" />\n    <row flagID=\"132\" flagName=\"SubSystem7\" flagText=\"Sub system slot 7\" />\n    <row flagID=\"133\" flagName=\"SpecializedFuelBay\" flagText=\"Specialized Fuel Bay\" />\n    <row flagID=\"134\" flagName=\"SpecializedOreHold\" flagText=\"Specialized Ore Hold\" />\n    <row flagID=\"135\" flagName=\"SpecializedGasHold\" flagText=\"Specialized Gas Hold\" />\n    <row flagID=\"136\" flagName=\"SpecializedMineralHold\" flagText=\"Specialized Mineral Hold\" />\n    <row flagID=\"137\" flagName=\"SpecializedSalvageHold\" flagText=\"Specialized Salvage Hold\" />\n    <row flagID=\"138\" flagName=\"SpecializedShipHold\" flagText=\"Specialized Ship Hold\" />\n    <row flagID=\"139\" flagName=\"SpecializedSmallShipHold\" flagText=\"Specialized Small Ship Hold\" />\n    <row flagID=\"140\" flagName=\"SpecializedMediumShipHold\" flagText=\"Specialized Medium Ship Hold\" />\n    <row flagID=\"141\" flagName=\"SpecializedLargeShipHold\" flagText=\"Specialized Large Ship Hold\" />\n    <row flagID=\"142\" flagName=\"SpecializedIndustrialShipHold\" flagText=\"Specialized Industrial Ship Hold\" />\n    <row flagID=\"143\" flagName=\"SpecializedAmmoHold\" flagText=\"Specialized Ammo Hold\" />\n    <row flagID=\"144\" flagName=\"StructureActive\" flagText=\"Structure Active\" />\n    <row flagID=\"145\" flagName=\"StructureInactive\" flagText=\"Structure Inactive\" />\n    <row flagID=\"146\" flagName=\"JunkyardReprocessed\" flagText=\"This item was put into a junkyard through reprocession.\" />\n    <row flagID=\"147\" flagName=\"JunkyardTrashed\" flagText=\"This item was put into a junkyard through being trashed by its owner.\" />\n    <row flagID=\"148\" flagName=\"SpecializedCommandCenterHold\" flagText=\"Specialized Command Center Hold\" />\n    <row flagID=\"149\" flagName=\"SpecializedPlanetaryCommoditiesHold\" flagText=\"Specialized Planetary Commodities Hold\" />\n    <row flagID=\"150\" flagName=\"PlanetSurface\" flagText=\"Planet Surface\" />\n    <row flagID=\"151\" flagName=\"SpecializedMaterialBay\" flagText=\"Specialized Material Bay\" />\n    <row flagID=\"152\" flagName=\"DustCharacterDatabank\" flagText=\"Dust Character Databank\" />\n    <row flagID=\"153\" flagName=\"DustCharacterBattle\" flagText=\"Dust Character Battle\" />\n    <row flagID=\"154\" flagName=\"QuafeBay\" flagText=\"Quafe Bay\" />\n    <row flagID=\"155\" flagName=\"FleetHangar\" flagText=\"Fleet Hangar\" />\n    <row flagID=\"156\" flagName=\"HiddenModifiers\" flagText=\"Hidden Modifiers\" />\n    <row flagID=\"157\" flagName=\"StructureOffline\" flagText=\"Structure Offline\" />\n    <row flagID=\"158\" flagName=\"FighterBay\" flagText=\"Fighter Bay\" />\n    <row flagID=\"159\" flagName=\"FighterTube0\" flagText=\"Fighter Tube 0\" />\n    <row flagID=\"160\" flagName=\"FighterTube1\" flagText=\"Fighter Tube 1\" />\n    <row flagID=\"161\" flagName=\"FighterTube2\" flagText=\"Fighter Tube 2\" />\n    <row flagID=\"162\" flagName=\"FighterTube3\" flagText=\"Fighter Tube 3\" />\n    <row flagID=\"163\" flagName=\"FighterTube4\" flagText=\"Fighter Tube 4\" />\n    <row flagID=\"164\" flagName=\"StructureServiceSlot0\" flagText=\"Structure service slot 1\" />\n    <row flagID=\"165\" flagName=\"StructureServiceSlot1\" flagText=\"Structure service slot 2\" />\n    <row flagID=\"166\" flagName=\"StructureServiceSlot2\" flagText=\"Structure service slot 3\" />\n    <row flagID=\"167\" flagName=\"StructureServiceSlot3\" flagText=\"Structure service slot 4\" />\n    <row flagID=\"168\" flagName=\"StructureServiceSlot4\" flagText=\"Structure service slot 5\" />\n    <row flagID=\"169\" flagName=\"StructureServiceSlot5\" flagText=\"Structure service slot 6\" />\n    <row flagID=\"170\" flagName=\"StructureServiceSlot6\" flagText=\"Structure service slot 7\" />\n    <row flagID=\"171\" flagName=\"StructureServiceSlot7\" flagText=\"Structure service slot 8\" />\n    <row flagID=\"172\" flagName=\"StructureFuel\" flagText=\"Structure Fuel\" />\n    <row flagID=\"173\" flagName=\"Deliveries\" flagText=\"Deliveries\" />\n    <row flagID=\"174\" flagName=\"CrateLoot\" flagText=\"Crate Loot\" />\n    <row flagID=\"176\" flagName=\"BoosterBay\" flagText=\"Booster Hold\" />\n    <row flagID=\"177\" flagName=\"SubsystemBay\" flagText=\"Subsystem Hold\" />\n    <row flagID=\"178\" flagName=\"Raffles\" flagText=\"Raffles Hangar\" />\n    <row flagID=\"179\" flagName=\"FrigateEscapeBay\" flagText=\"Frigate escape bay Hangar\" />\n    <row flagID=\"180\" flagName=\"StructureDeedBay\" flagText=\"Structure Deed Bay\" />\n  </rowset>\n</invFlags>"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Fuzzworks/SerializableFuzzworksPriceItem.cs",
    "content": "﻿using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Fuzzworks\n{\n    [DataContract]\n    public sealed class SerializableFuzzworksPriceItem\n    {\n        [DataMember(Name = \"buy\")]\n        public SerializableFuzzworksPriceListItem Buy { get; set; }\n\n        [DataMember(Name = \"sell\")]\n        public SerializableFuzzworksPriceListItem Sell { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Fuzzworks/SerializableFuzzworksPriceListItem.cs",
    "content": "﻿using System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Fuzzworks\n{\n    [DataContract]\n    public sealed class SerializableFuzzworksPriceListItem\n    {\n        [DataMember(Name = \"weightedAverage\")]\n        public double AveragePrice { get; set; }\n\n        [DataMember(Name = \"max\")]\n        public double MaxPrice { get; set; }\n\n        [DataMember(Name = \"min\")]\n        public double MinPrice { get; set; }\n\n        [DataMember(Name = \"median\")]\n        public double MedianPrice { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Hammertime/HammertimeStructure.cs",
    "content": "using EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Eve;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization.Hammertime\n{\n    [DataContract]\n    public sealed class HammertimeStructure\n    {\n        [DataMember(Name = \"name\")]\n        public string StationName { get; set; }\n\n        [DataMember(Name = \"regionId\", EmitDefaultValue = false, IsRequired = false)]\n        public int RegionID { get; set; }\n\n        [DataMember(Name = \"systemId\")]\n        public int SolarSystemID { get; set; }\n        \n        [DataMember(Name = \"location\", EmitDefaultValue = false, IsRequired = false)]\n        public EsiPosition Position { get; set; }\n\n        [DataMember(Name = \"public\", IsRequired = false)]\n        public bool IsPublic { get; set; }\n\n        public SerializableOutpost ToXMLItem(long id)\n        {\n            return new SerializableOutpost()\n            {\n                // Not available from HammerTime\n                CorporationID = 0,\n                StationID = id,\n                SolarSystemID = SolarSystemID,\n                StationTypeID = 0,\n                StationName = StationName\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/JsonResult.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Net;\nusing System.Runtime.Serialization;\n\nnamespace EVEMon.Common.Serialization\n{\n    /// <summary>\n    /// Wraps the results returned from a JSON request.\n    /// </summary>\n    public class JsonResult<T>\n    {\n        #region Constructors\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public JsonResult(ResponseParams response, T result = default(T))\n        {\n            ErrorType = APIErrorType.None;\n            Exception = null;\n            ErrorMessage = string.Empty;\n            Response = response;\n            Result = result;\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CCPAPIResult{T}\" /> class.\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        /// <exception cref=\"System.ArgumentNullException\">exception</exception>\n        protected JsonResult(Exception exception)\n        {\n            exception.ThrowIfNull(nameof(exception));\n            Exception = exception;\n            ErrorMessage = exception?.Message ?? string.Empty;\n            Response = new ResponseParams(0);\n            Result = default(T);\n        }\n\n        /// <summary>\n        /// Creates a JSON result wrapped from another JSON result.\n        /// </summary>\n        /// <param name=\"wrapped\">The JSON result to wrap.</param>\n        protected JsonResult(JsonResult<T> wrapped)\n        {\n            Exception = wrapped.Exception;\n            ErrorMessage = wrapped.ErrorMessage;\n            ErrorType = wrapped.ErrorType;\n            Response = wrapped.Response;\n            Result = wrapped.Result;\n        }\n\n        /// <summary>\n        /// Constructor from an http exception\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        public JsonResult(HttpWebClientServiceException exception)\n            : this(exception as Exception)\n        {\n            ErrorType = APIErrorType.Http;\n            Response = new ResponseParams((int)exception.StatusCode);\n        }\n\n        /// <summary>\n        /// Constructor from a JSON exception\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        public JsonResult(InvalidDataContractException exception)\n            : this(exception as Exception)\n        {\n            ErrorType = APIErrorType.Json;\n        }\n        \n        /// <summary>\n        /// Constructor from a JSON serialization exception wrapped into an InvalidOperationException\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        public JsonResult(InvalidOperationException exception)\n            : this(exception as Exception)\n        {\n            ErrorType = APIErrorType.Json;\n        }\n\n        /// <summary>\n        /// Constructor from a JSON serialization exception wrapped into a SerializationException\n        /// </summary>\n        /// <param name=\"exception\">The exception.</param>\n        public JsonResult(SerializationException exception)\n            : this(exception as Exception)\n        {\n            ErrorType = APIErrorType.Json;\n        }\n\n        /// <summary>\n        /// Constructor from a CCP API internal error\n        /// </summary>\n        /// <param name=\"response\">The response parameters including the error code.</param>\n        /// <param name=\"message\">The CCP error message.</param>\n        public JsonResult(ResponseParams response, string message)\n        {\n            ErrorType = APIErrorType.CCP;\n            Exception = null;\n            ErrorMessage = message ?? string.Empty;\n            Response = response;\n            Result = default(T);\n        }\n\n        #endregion\n\n\n        #region Errors handling\n\n        /// <summary>\n        /// Gets the exception.\n        /// </summary>\n        /// <value>The exception.</value>\n        public Exception Exception { get; }\n\n        public bool HasError => Exception != null || ErrorType != APIErrorType.None;\n\n        /// <summary>\n        /// Gets the response code from the server.\n        /// </summary>\n        public int ResponseCode => Response.ResponseCode;\n\n        #endregion\n\n\n        #region Properties\n\n        public string ErrorMessage { get; }\n\n        public APIErrorType ErrorType { get; }\n\n        public T Result { get; set; }\n\n        public DateTime? CurrentTime => Response.Time;\n\n        public ResponseParams Response { get; }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/NotificationRefTypes.xml",
    "content": "<?xml version=\"1.0\"?>\n<eveapi version=\"2\">\n  <currentTime></currentTime>\n  <result>\n    <rowset name=\"refTypes\" key=\"refTypeID\" columns=\"refTypeID,refTypeCode,refTypeName,subjectLayout,textLayout\">\n      <row refTypeID=\"1\" refTypeCode=\"OldLscMessages\" refTypeName=\"Old Notifications\" subjectLayout=\"{subject}\" textLayout=\"{body}\"/>\n      <row refTypeID=\"2\" refTypeCode=\"CharTerminationMsg\" refTypeName=\"Member Biomassed\" subjectLayout=\"RIP Corporation member {charID}\" textLayout=\"The untimely death of fellow {corpID} member {charID}, on {notification_created}, is a source of sorrow to me and their many friends in the corporation. Please accept our deepest sympathies in your bereavement. This character was being reanimated at the cloning facility at the time when the fatal accident occurred.\\n\\nLiked by some, and trusted by close friends occasionally, the character was a fine person and was admired by their fellow corporation members. We will all miss them. I realize that words can do little to console you at a time like this, but I want you to know that we share your sorrow.\"/>\n      <row refTypeID=\"3\" refTypeCode=\"CharMedalMsg\" refTypeName=\"Medal Awarded\" subjectLayout=\"You have been awarded the {medalID}\" textLayout=\"The {medalID} decoration has been awarded to you by {corpID} for {reason}. This decoration has the following description:\\n\\n\\n\\n{medalDescription}\\n\\n\\n\\nIf you wish to show off this decoration publicly or trash it, you can do so in the decorations tab of your character sheet.\"/>\n      <row refTypeID=\"4\" refTypeCode=\"AllMaintenanceBillMsg\" refTypeName=\"Alliance Maintenance Bill\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"5\" refTypeCode=\"AllWarDeclaredMsg\" refTypeName=\"Alliance War Declared\" subjectLayout=\"{declaredByID} Declares War Against {againstID}\" textLayout=\"{declaredByID} has declared war on {againstID}. Within {delayHours} hours fighting can legally occur between those involved. If war is due to a corporation at war joining an alliance, then the war starts immediately instead.\"/>\n      <row refTypeID=\"6\" refTypeCode=\"AllWarSurrenderMsg\" refTypeName=\"Alliance War Surrender\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"7\" refTypeCode=\"AllWarRetractedMsg\" refTypeName=\"Alliance War Retracted\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"8\" refTypeCode=\"AllWarInvalidatedMsg\" refTypeName=\"Alliance War Invalidated\" subjectLayout=\"CONCORD Invalidates War Declared By {declaredByID} Against {againstID}\" textLayout=\"CONCORD has declared this war invalid as it breaches one or more articles in the Yulai Convention. The war will be declared as being over after approximately {delayHours} hours.\"/>\n      <row refTypeID=\"10\" refTypeCode=\"CorpAllBillMsg\" refTypeName=\"Organization Billed\" subjectLayout=\"Bill issued\" textLayout=\"This is an automatic message. A bill of {amount} ISK, due {dueDate} owed by you to {creditorID} was issued {issueDate}. This bill is for extending the lease on your Office at {externalID2}.\"/>\n      <row refTypeID=\"11\" refTypeCode=\"BillOutOfMoneyMsg\" refTypeName=\"Insufficient Funds To Pay Bill\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"13\" refTypeCode=\"BillPaidCorpAllMsg\" refTypeName=\"Bill Paid By Organization\" subjectLayout=\"Bill paid\" textLayout=\"This is an automatic message. A debt of {amount} ISK owed to you by the sender of this message, due {dueDate} has been paid on {notification_created}.\"/>\n      <row refTypeID=\"14\" refTypeCode=\"BountyClaimMsg\" refTypeName=\"Capsuleer Bounty Payment\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"15\" refTypeCode=\"CloneActivationMsg\" refTypeName=\"Unknown\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"16\" refTypeCode=\"CorpAppNewMsg\" refTypeName=\"New Application To Join Corporation\" subjectLayout=\"New application from {charID}\" textLayout=\"{applicationText}\"/>\n      <row refTypeID=\"17\" refTypeCode=\"CorpAppRejectMsg\" refTypeName=\"Your Corporate Application Rejected\" subjectLayout=\"Rejected application to join {corpID}\" textLayout=\"Dear {charID},\\nyour application to join {corpID} has been processed and rejected.\"/>\n      <row refTypeID=\"18\" refTypeCode=\"CorpAppAcceptMsg\" refTypeName=\"Your Corporate Application Accepted\" subjectLayout=\"Invited to join {corpID}\" textLayout=\"Dear {charID},\\n\\nYour application to {corpID} has been reviewed and an invitation to join the corporation has been sent to you. You may now choose to Accept the invitation which will move you to the corporation or alternatively you may Withdraw the application.\\n\\nThe invitation can be found in the Corporation window under the Recruitment \\u201cMy Applications\\u201d tab.\"/>\n      <row refTypeID=\"19\" refTypeCode=\"CorpTaxChangeMsg\" refTypeName=\"Corporation Tax Change\" subjectLayout=\"Tax Rate Changed To {newTaxRate}%\" textLayout=\"This is an automated message: The tax rate for {corpID} members has been changed from {oldTaxRate}% to {newTaxRate}%.\"/>\n      <row refTypeID=\"20\" refTypeCode=\"CorpNewsMsg\" refTypeName=\"Corporation News\" subjectLayout=\"{corpID} creates {parameter} shares\" textLayout=\"{body}\"/>\n      <row refTypeID=\"21\" refTypeCode=\"CharLeftCorpMsg\" refTypeName=\"Pilot Left Corporation\" subjectLayout=\"{charID} has left {corpID}\" textLayout=\"{charID} is no longer a member of {corpID}.\"/>\n      <row refTypeID=\"22\" refTypeCode=\"CorpNewCEOMsg\" refTypeName=\"New Corporation CEO\" subjectLayout=\"{newCeoID} is the new CEO of {corpID}\" textLayout=\"{oldCeoID} has resigned from the position of CEO with {corpID}. As their last move they appointed {newCeoID} as CEO.\"/>\n      <row refTypeID=\"23\" refTypeCode=\"CorpDividendMsg\" refTypeName=\"Corporate Dividend Payout\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"25\" refTypeCode=\"CorpVoteMsg\" refTypeName=\"Corporate Vote Notification\" subjectLayout=\"{subject}\" textLayout=\"{body}\"/>\n      <row refTypeID=\"26\" refTypeCode=\"CorpVoteCEORevokedMsg\" refTypeName=\"CEO Roles Revoked During Vote\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"27\" refTypeCode=\"CorpWarDeclaredMsg\" refTypeName=\"Corporation War Declared\" subjectLayout=\"{declaredByID} Declares War Against {againstID}\" textLayout=\"{declaredByID} has declared war on {againstID}. Within {delayHours} hours fighting can legally occur between those involved.\"/>\n      <row refTypeID=\"28\" refTypeCode=\"CorpWarFightingLegalMsg\" refTypeName=\"Corporation War Fighting\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"29\" refTypeCode=\"CorpWarSurrenderMsg\" refTypeName=\"Corporation War Surrender\" subjectLayout=\"{againstID} surrenders to {declaredByID}\" textLayout=\"The war declared by {declaredByID} is coming to an end. {againstID} has surrendered to hold our beer. The war will be declared as being over after approximately {delayHours} hours and these entities may not declare war again for the next 2 weeks.\"/>\n      <row refTypeID=\"30\" refTypeCode=\"CorpWarRetractedMsg\" refTypeName=\"Corporation War Retracted\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"31\" refTypeCode=\"CorpWarInvalidatedMsg\" refTypeName=\"Corporation War Invalidated\" subjectLayout=\"{senderName} Invalidates War Declared By {declaredByID} Against {againstID}\" textLayout=\"{senderName} has declared this war invalid as it breaches one or more articles in the Yulai Convention. The war will be declared as being over after approximately {delayHours} hours.\"/>\n      <row refTypeID=\"32\" refTypeCode=\"ContainerPasswordMsg\" refTypeName=\"Container Password\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"33\" refTypeCode=\"CustomsMsg\" refTypeName=\"Customs Notification\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"34\" refTypeCode=\"InsuranceFirstShipMsg\" refTypeName=\"Rookie Ship Replacement\" subjectLayout=\"Pend Insurance Inc.\" textLayout=\"We from the friendly insurance company Pend Insurance regret your temporary lack of spacecraft. According to the agreement between Pend Insurance and SCC, we hereby grant you a brand new {shipTypeID}, fully fitted. Also included is a gratuity gift of {isHouseWarmingGift}.\"/>\n      <row refTypeID=\"35\" refTypeCode=\"InsurancePayoutMsg\" refTypeName=\"Insurance Payment\" subjectLayout=\"Insurance\" textLayout=\"RefID: {itemID} Your friendly insurance company has transferred {payout} ISK into your account for the recent loss of your ship.  This payout is the default payout for an uninsured ship. If you are interested in better insurance then please visit a station with an Insurance Service for further details.\"/>\n      <row refTypeID=\"36\" refTypeCode=\"InsuranceInvalidatedMsg\" refTypeName=\"Insurance Invalidated\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"38\" refTypeCode=\"SovCorpClaimFailMsg\" refTypeName=\"Corporate Sovereignty Claim Failed\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"40\" refTypeCode=\"SovCorpBillLateMsg\" refTypeName=\"Corporate Alliance Bill Due\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"41\" refTypeCode=\"SovAllClaimLostMsg\" refTypeName=\"Alliance Sovereignty Claim Lost\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"43\" refTypeCode=\"SovAllClaimAquiredMsg\" refTypeName=\"Alliance Sovereignty Claim Acquired\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"45\" refTypeCode=\"AllAnchoringMsg\" refTypeName=\"Structure Anchoring\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"46\" refTypeCode=\"AllStructVulnerableMsg\" refTypeName=\"Sovereignty Structures Vulnerable\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"47\" refTypeCode=\"AllStrucInvulnerableMsg\" refTypeName=\"Sovereignty Structures Invulnerable\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"48\" refTypeCode=\"SovDisruptorMsg\" refTypeName=\"Sovereignty Blockade Unit Active\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"49\" refTypeCode=\"CorpStructLostMsg\" refTypeName=\"Structure Lost\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"50\" refTypeCode=\"CorpOfficeExpirationMsg\" refTypeName=\"Office Lease Expiration\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"51\" refTypeCode=\"CloneRevokedMsg1\" refTypeName=\"Clone Contract Revoked 1\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"52\" refTypeCode=\"CloneMovedMsg\" refTypeName=\"Clone Moved\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"53\" refTypeCode=\"CloneRevokedMsg2\" refTypeName=\"Clone Contract Revoked 2\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"54\" refTypeCode=\"InsuranceExpirationMsg\" refTypeName=\"Insurance Expired\" subjectLayout=\"Insurance Contract Expired\" textLayout=\"Dear valued customer,\\n\\n\\nThe insurance contract between yourself and SCC for the insurance of the ship {shipName} issued at {startDate} has expired. Please purchase a new insurance as quickly as possible to protect your investment.\\n\\n\\nBest,\\n\\nThe Secure Commerce Commission,\\n\\nReference ID: {itemID}\"/>\n      <row refTypeID=\"55\" refTypeCode=\"InsuranceIssuedMsg\" refTypeName=\"Insurance Issued\" subjectLayout=\"Insurance Contract Issued\" textLayout=\"Dear valued customer,\\n\\n\\n\\nCongratulations on the insurance on your ship. A very wise choice indeed.\\n\\nThis letter is to confirm that we have issued an insurance contract for your ship, {shipName} ({typeID}) at a level of {level}%.\\n\\nThis contract will expire at {endDate}, after {numWeeks} weeks.\\n\\n\\n\\nBest,\\n\\nThe Secure Commerce Commission,\\n\\nReference ID: {itemID}\"/>\n      <row refTypeID=\"56\" refTypeCode=\"JumpCloneDeletedMsg1\" refTypeName=\"Jump Clone Deleted\" subjectLayout=\"Jump clone destruction\" textLayout=\"Dear {ownerID},\\nA jump clone you had installed has been destroyed.\\n\\nLocation: {locationID}\\n\\nLocation Owner: {locationOwnerID}\\n\\nResponsible party for the destruction: {destroyerID}\\n\\nLost implants: {typeIDs}\"/>\n      <row refTypeID=\"57\" refTypeCode=\"JumpCloneDeletedMsg2\" refTypeName=\"Jump Clone Destruction\" subjectLayout=\"Jump clone destruction\" textLayout=\"Dear {ownerID},\\nA jump clone you had installed has been destroyed.\\n\\nLocation: {locationID}\\n\\nLocation Owner: {locationOwnerID}\\n\\nResponsible party for the destruction: {destroyerID}\\n\\nLost implants: {typeIDs}\"/>\n      <row refTypeID=\"58\" refTypeCode=\"FWCorpJoinMsg\" refTypeName=\"Corporation Has Joined Faction\" subjectLayout=\"{corpID} has joined {factionID}\" textLayout=\"{corpID} has joined the {factionID} at war. Fighting may begin.\"/>\n      <row refTypeID=\"59\" refTypeCode=\"FWCorpLeaveMsg\" refTypeName=\"Corporation Has Left Faction\" subjectLayout=\"{corpID} has left {factionID}\" textLayout=\"{corpID} has left the {factionID} faction and may no longer legally fight on its behalf.\"/>\n      <row refTypeID=\"60\" refTypeCode=\"FWCorpKickMsg\" refTypeName=\"Corporation Expelled From Faction\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"61\" refTypeCode=\"FWCharKickMsg\" refTypeName=\"Pilot Expelled From Faction\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"62\" refTypeCode=\"FWCorpWarningMsg\" refTypeName=\"Corporation Faction Standing Warning\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"63\" refTypeCode=\"FWCharWarningMsg\" refTypeName=\"Pilot Faction Standing Warning\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"64\" refTypeCode=\"FWCharRankLossMsg\" refTypeName=\"Pilot Loses Faction Rank\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"65\" refTypeCode=\"FWCharRankGainMsg\" refTypeName=\"Pilot Gains Faction Rank\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"67\" refTypeCode=\"TransactionReversalMsg\" refTypeName=\"Transaction Reversal\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"68\" refTypeCode=\"ReimbursementMsg\" refTypeName=\"Reimbursement\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"69\" refTypeCode=\"LocateCharMsg\" refTypeName=\"Pilot Located\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"70\" refTypeCode=\"ResearchMissionAvailableMsg\" refTypeName=\"Research Mission Available\" subjectLayout=\"I've encountered a problem\" textLayout=\"Our research has been fruitful, but I've encountered a snag and our research has been halted. Please contact me as soon as possible.\"/>\n      <row refTypeID=\"71\" refTypeCode=\"MissionOfferExpirationMsg\" refTypeName=\"Mission Offer Expiration\" subjectLayout=\"Mission Offer Expired\" textLayout=\"I can no longer await your response to my offer. I am displeased by your indecisiveness.\"/>\n      <row refTypeID=\"72\" refTypeCode=\"MissionTimeoutMsg\" refTypeName=\"Mission Failure\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"73\" refTypeCode=\"StoryLineMissionAvailableMsg\" refTypeName=\"Special Mission Available\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"74\" refTypeCode=\"TutorialMsg\" refTypeName=\"Tutorial Program\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"75\" refTypeCode=\"TowerAlertMsg\" refTypeName=\"Tower Under Attack Alert\" subjectLayout=\"Report: Starbase in {solarSystemID} is under attack\" textLayout=\"Solar System: {solarSystemID}\\nMoon: {moonID}\\nAttacked object: {typeID}\\n\\nCurrent Shield Level: {shieldValue} %\\nCurrent Armor Integrity: {armorValue} %\\nCurrent Hull Integrity: {hullValue} %\\n\\nAggressing Pilot: {aggressorID}\\nAggressing Pilot's Corporation: {aggressorCorpID}\\nAggressing Pilot's Alliance: {aggressorAllianceID}\"/>\n      <row refTypeID=\"76\" refTypeCode=\"TowerResourceAlertMsg\" refTypeName=\"Tower Resource Alert\" subjectLayout=\"Report: Starbase low on resources in {solarSystemID}\" textLayout=\"This notification is to advise you that there are not enough resources present to last a day of full Starbase activity.\\n\\nSolar System: {solarSystemID}\\nMoon: {moonID}, Type: {typeID}\\nCorp: {corpID}\"/>\n      <row refTypeID=\"77\" refTypeCode=\"StationAggressionMsg1\" refTypeName=\"Station Under Attack\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"78\" refTypeCode=\"StationStateChangeMsg\" refTypeName=\"Station Changed\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"79\" refTypeCode=\"StationConquerMsg\" refTypeName=\"Station Conquered\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"80\" refTypeCode=\"StationAggressionMsg2\" refTypeName=\"Station Aggression\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"81\" refTypeCode=\"FacWarCorpJoinRequestMsg\" refTypeName=\"Corporation Joining Faction\" subjectLayout=\"{corpID} is joining {factionID}\" textLayout=\"{corpID} is joining the {factionID} faction by enlisting into Factional Warfare. Fighting may begin within 24 hours. At that time, this corporation will be at war with all enemies of this faction.\"/>\n      <row refTypeID=\"82\" refTypeCode=\"FacWarCorpLeaveRequestMsg\" refTypeName=\"Corporation Leaving Faction\" subjectLayout=\"{corpID} is leaving {factionID}\" textLayout=\"{corpID} is leaving the {factionID} faction within 24 hours. After that time they may no longer fight on this faction's behalf.\"/>\n      <row refTypeID=\"83\" refTypeCode=\"FacWarCorpJoinWithdrawMsg\" refTypeName=\"Corporation Join Faction Withdrawn\" subjectLayout=\"{corpID} has withdrawn request to join {factionID}\" textLayout=\"{corpID} has withdrawn its request to join the {factionID} faction at war.\"/>\n      <row refTypeID=\"84\" refTypeCode=\"FacWarCorpLeaveWithdrawMsg\" refTypeName=\"Corporation Leave Faction Withdrawn\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"85\" refTypeCode=\"CorpLiquidationMsg\" refTypeName=\"Corporate Liquidation Settlement\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"86\" refTypeCode=\"SovereigntyTCUDamageMsg\" refTypeName=\"Sovereignty TCU Damage\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"87\" refTypeCode=\"SovereigntySBUDamageMsg\" refTypeName=\"Sovereignty SBU Damage\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"88\" refTypeCode=\"SovereigntyIHDamageMsg\" refTypeName=\"Sovereignty IHUB Damage\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"89\" refTypeCode=\"ContactAdd\" refTypeName=\"Added As Contact\" subjectLayout=\"You have been added as a contact\" textLayout=\"{senderName} has added you as a contact with {level}\\n\\n{message}\"/>\n      <row refTypeID=\"90\" refTypeCode=\"ContactEdit\" refTypeName=\"Contact Level Modified\" subjectLayout=\"Your contact level has been modified\" textLayout=\"{senderName} has changed your contact level to {level}\\n\\n{message}\"/>\n      <row refTypeID=\"91\" refTypeCode=\"IncursionCompletedMsg\" refTypeName=\"Incursion Completed\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"92\" refTypeCode=\"CorpKicked\" refTypeName=\"Kicked From Corporation\" subjectLayout=\"Kicked from {corpID}\" textLayout=\"{corpID} hereby informs you that your services are no longer needed.\\n\\nThank you for your time at our corporation and best of luck to you in the future.\"/>\n      <row refTypeID=\"93\" refTypeCode=\"OrbitalAttacked\" refTypeName=\"Orbital Structure Attacked\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"94\" refTypeCode=\"OrbitalReinforced\" refTypeName=\"Orbital Structure Reinforced\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"95\" refTypeCode=\"OwnershipTransferred\" refTypeName=\"Structure Ownership Transferred\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"96\" refTypeCode=\"FWAllianceWarningMsg\" refTypeName=\"Alliance Faction Standing Warning\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"97\" refTypeCode=\"FWAllianceKickMsg\" refTypeName=\"Alliance Expelled From Faction\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"98\" refTypeCode=\"AllWarCorpJoinedAllianceMsg\" refTypeName=\"Corporation Joined Alliance At War\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"99\" refTypeCode=\"AllyJoinedWarDefenderMsg\" refTypeName=\"Defender Ally Joins War\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"100\" refTypeCode=\"AllyJoinedWarAggressorMsg\" refTypeName=\"Aggressor Ally Joins War\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"101\" refTypeCode=\"AllyJoinedWarAllyMsg\" refTypeName=\"Corporation Joins War As Ally\" subjectLayout=\"Ally Has Joined a War\" textLayout=\"{allyID} has joined {defenderID} in a war against {aggressorID}. Their participation in the war will start at {startTime}\"/>\n      <row refTypeID=\"102\" refTypeCode=\"MercOfferedNegotiationMsg\" refTypeName=\"War Ally Offer Received\" subjectLayout=\"{mercID} has offered its services in one of your wars\" textLayout=\"{mercID} has offered {defenderID} its services in its war against {aggressorID} for {iskValue} ISK\"/>\n      <row refTypeID=\"103\" refTypeCode=\"WarSurrenderOfferMsg\" refTypeName=\"Surrender Offer Received\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"104\" refTypeCode=\"WarSurrenderDeclinedMsg\" refTypeName=\"Surrender Declined\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"105\" refTypeCode=\"FacWarLPPayoutKill\" refTypeName=\"Faction Kill Event LP\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"106\" refTypeCode=\"FacWarLPPayoutEvent\" refTypeName=\"Faction Strategic Event LP\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"107\" refTypeCode=\"FacWarLPDisqualifiedEvent\" refTypeName=\"Strategic Event LP Disqualification\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"108\" refTypeCode=\"FacWarLPDisqualifiedKill\" refTypeName=\"Kill Event LP Disqualification\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"109\" refTypeCode=\"AllyContractCancelled\" refTypeName=\"War Ally Agreement Cancelled\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"110\" refTypeCode=\"WarAllyOfferDeclinedMsg\" refTypeName=\"War Ally Offer Declined\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"111\" refTypeCode=\"BountyYourBountyClaimed\" refTypeName=\"Bounty From You Claimed\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"112\" refTypeCode=\"BountyPlacedChar\" refTypeName=\"Bounty Placed On You\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"113\" refTypeCode=\"BountyPlacedCorp\" refTypeName=\"Bounty Placed On Corporation\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"114\" refTypeCode=\"BountyPlacedAlliance\" refTypeName=\"Bounty Placed On Alliance\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"115\" refTypeCode=\"KillRightAvailable\" refTypeName=\"Kill Right Available\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"116\" refTypeCode=\"KillRightAvailableOpen\" refTypeName=\"Kill Right Available To All\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"117\" refTypeCode=\"KillRightEarned\" refTypeName=\"Kill Right Earned\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"118\" refTypeCode=\"KillRightUsed\" refTypeName=\"Kill Right Used\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"119\" refTypeCode=\"KillRightUnavailable\" refTypeName=\"Kill Right Unavailable\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"120\" refTypeCode=\"KillRightUnavailableOpen\" refTypeName=\"Kill Right Unavailable To All\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"121\" refTypeCode=\"DeclareWar\" refTypeName=\"War Declaration\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"122\" refTypeCode=\"OfferedSurrender\" refTypeName=\"Surrender Offered\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"123\" refTypeCode=\"AcceptedSurrender\" refTypeName=\"Surrender Accepted\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"124\" refTypeCode=\"MadeWarMutual\" refTypeName=\"War Made Mutual\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"125\" refTypeCode=\"RetractsWar\" refTypeName=\"War Retracted\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"126\" refTypeCode=\"OfferedToAlly\" refTypeName=\"You Offered War Ally\" subjectLayout=\"You have offered to ally with {defenderID}\" textLayout=\"{charID} has offered to ally to {defenderID} in their war against {enemyID}. The offer asked for {iskValue} ISK as payment.\"/>\n      <row refTypeID=\"127\" refTypeCode=\"AcceptedAlly\" refTypeName=\"You Accepted War Ally\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"128\" refTypeCode=\"CharAppAcceptMsg\" refTypeName=\"Character Invitation Accepted\" subjectLayout=\"{charID} joins {corpID}\" textLayout=\"Your membership invitation to {charID} has been accepted.\\n\\n{applicationText}\"/>\n      <row refTypeID=\"129\" refTypeCode=\"CharAppRejectMsg\" refTypeName=\"Character Invitation Rejected\" subjectLayout=\"{charID} rejects invitation\" textLayout=\"Your membership invitation to {charID} has been rejected.\"/>\n      <row refTypeID=\"130\" refTypeCode=\"CharAppWithdrawMsg\" refTypeName=\"Character Application Withdrawn\" subjectLayout=\"{charID} withdraws application\" textLayout=\"{charID} has withdrawn his membership application.\\n\\n\\n\\n\\n{applicationText}\"/>\n      <row refTypeID=\"131\" refTypeCode=\"DustAppAcceptedMsg\" refTypeName=\"Mercenary Application Accepted\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"132\" refTypeCode=\"DistrictAttacked\" refTypeName=\"Corporation District Attacked\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"133\" refTypeCode=\"BattlePunishFriendlyFire\" refTypeName=\"Friendly Fire Standings Loss\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"134\" refTypeCode=\"BountyESSTaken\" refTypeName=\"ESS Pool Taken\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"135\" refTypeCode=\"BountyESSShared\" refTypeName=\"ESS Pool Shared\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"136\" refTypeCode=\"IndustryTeamAuctionWon\" refTypeName=\"Unknown\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"137\" refTypeCode=\"IndustryTeamAuctionLost\" refTypeName=\"Unknown\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"138\" refTypeCode=\"CloneActivationMsg2\" refTypeName=\"Clone Activation\" subjectLayout=\"Clone activated\" textLayout=\"Your previous clone was catastrophically terminated. Your consciousness will be transferred to a new clone at {cloneStationID}.\\n\\nTransfer completed. We wish you good fortune.\"/>\n      <row refTypeID=\"139\" refTypeCode=\"CorpAppInvitedMsg\" refTypeName=\"You have been invited to join a Corporation\" subjectLayout=\"Invited to join {corpID}\" textLayout=\"Dear {charID},\\n\\nMy name is {invokingCharID} and I would like you to join my corporation {corpID}. You may choose to Accept the invitation which will move you to the corporation or alternatively you may Decline the application.\\n\\nThe invitation can be found in the Corporation window under the Recruitment \\u201cMy Applications\\u201d tab.\"/>\n      <row refTypeID=\"140\" refTypeCode=\"KillReportVictim\" refTypeName=\"Kill report - Victim\" subjectLayout=\"Loss report available\" textLayout=\"Loss report for {victimID} ({victimShipTypeID}) is available.\"/>\n      <row refTypeID=\"141\" refTypeCode=\"KillReportFinalBlow\" refTypeName=\"Kill report - Final blow\" subjectLayout=\"Kill report available\" textLayout=\"Kill report for {victimID} ({victimShipTypeID}) is available.\"/>\n      <row refTypeID=\"142\" refTypeCode=\"CorpAppRejectCustomMsg\" refTypeName=\"Your Corporate Application Rejected\" subjectLayout=\"Rejected application to join {corpID}\" textLayout=\"Dear {charID},\\nyour application to join {corpID} has been processed and rejected.\\n\\n{customMessage}\"/>\n      <row refTypeID=\"143\" refTypeCode=\"CorpFriendlyFireEnableTimerStarted\" refTypeName=\"Corp Friendly-fire Enable-timer started\" subjectLayout=\"Corporation friendly-fire is becoming a legal act\" textLayout=\"{charID} is changing the 'friendly-fire' aggression policy within {corpID}. After 24 hours, aggressive actions between corporation members will be considered as legal, and as such will not be subject to any CONCORD penalties.\\nThe new rules will come in to effect at {timeFinished}, after which corporation members may freely attack each other.\"/>\n      <row refTypeID=\"144\" refTypeCode=\"CorpFriendlyFireDisableTimerStarted\" refTypeName=\"Corp Friendly-fire Disable-timer started\" subjectLayout=\"Corporation friendly-fire is becoming an illegal act\" textLayout=\"{charID} is changing the 'friendly-fire' aggression policy within {corpID}. After 24 hours, aggressive actions between corporation members will be considered an illegal action, subject to standard CONCORD penalty protocols.\\nThe new rules will come in to effect at {timeFinished}, after which corporation members will receive Criminal or Suspect flags for attacking others in Empire-controlled space.\"/>\n      <row refTypeID=\"145\" refTypeCode=\"CorpFriendlyFireEnableTimerCompleted\" refTypeName=\"Corp Friendly-fire Enable-timer completed\" subjectLayout=\"Corporation friendly-fire is now a legal act\" textLayout=\"The 'friendly-fire' aggression policy within {corpID} has now changed. Aggressive actions between corporation members are now considered as legal, and as such will not be subject to any CONCORD penalties.\\nCorporation members may now freely attack each other.\"/>\n      <row refTypeID=\"146\" refTypeCode=\"CorpFriendlyFireDisableTimerCompleted\" refTypeName=\"Corp Friendly-fire Disable-timer completed\" subjectLayout=\"Corporation friendly-fire is now an illegal act\" textLayout=\"The 'friendly-fire' aggression policy within {corpID} has now changed. Aggressive actions between corporation members are now considered an illegal action, subject to standard CONCORD penalty protocols.\\nCorporation members will now receive Criminal or Suspect flags for attacking others in Empire-controlled space.\"/>\n      <row refTypeID=\"1032\" refTypeCode=\"SovStructureSelfDestructRequested\" refTypeName=\"Sovereignty Structure Self-Destruct Started\" subjectLayout=\"{structureTypeID} in {solarSystemID} has initiated self-destruct\" textLayout=\"{charID} has started the self-destruct sequence for the {structureTypeID} in {solarSystemID}. Unless the sequence is aborted, this structure will explode at {destructTime}.\\n\\nAny director of Dreddit may abort the self-destruct sequence by flying to the structure and rescinding the self-destruct command before that time.\"/>\n      <row refTypeID=\"1033\" refTypeCode=\"SovStructureSelfDestructFinished\" refTypeName=\"Sovereignty Structure Self-Destruct Finished\" subjectLayout=\"{structureTypeID} in {solarSystemID} has self-destructed\" textLayout=\"The {structureTypeID} in {solarSystemID} has self-destructed after the completion of a manual self-destruct sequence.\"/>\n      <row refTypeID=\"147\" refTypeCode=\"EntosisCaptureStarted\" refTypeName=\"Sovereignty Structure Capture Started\" subjectLayout=\"{structureTypeID} in {solarSystemID} is being captured\" textLayout=\"A capsuleer has started to influence this structure with an Entosis Link.\\n\\nNo further Entosis alerts for this structure will be sent until 60 minutes have passed or the structure has been secured by your alliance.\"/>\n      <row refTypeID=\"148\" refTypeCode=\"StationServiceEnabled\" refTypeName=\"Sovereignty Service Enabled\" subjectLayout=\"{structureTypeID} in {solarSystemID} has been enabled\" textLayout=\"This station service has been successfully re-enabled by your alliance and normal operation can now resume.\"/>\n      <row refTypeID=\"149\" refTypeCode=\"StationServiceDisabled\" refTypeName=\"Sovereignty Service Disabled\" subjectLayout=\"{structureTypeID} in {solarSystemID} has been disabled\" textLayout=\"This station service has been disabled by hostile forces and must be reactivated with an Entosis Link before normal operation can resume.\"/>\n      <row refTypeID=\"152\" refTypeCode=\"InfrastructureHubBillAboutToExpire\" refTypeName=\"IHub Bill Expiring\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"160\" refTypeCode=\"SovStructureReinforced\" refTypeName=\"Sovereignty Structures Reinforced\" subjectLayout=\"{campaignEventType} in {solarSystemID} has entered reinforced mode\" textLayout=\"This structure has been reinforced by hostile forces and command nodes will begin decloaking at {decloakTime}.\"/>\n      <row refTypeID=\"161\" refTypeCode=\"SovCommandNodeEventStarted\" refTypeName=\"Command Nodes Decloaking\" subjectLayout=\"Command nodes for the {campaignEventType} in {solarSystemID} have begun to decloak\" textLayout=\"Command nodes for this structure can now be found throughout its constellation and capsuleers can use the Entosis Link to capture them.\"/>\n      <row refTypeID=\"162\" refTypeCode=\"SovStructureDestroyed\" refTypeName=\"Sovereignty Structure Destroyed\" subjectLayout=\"{campaignEventType} in {solarSystemID} has self-destructed\" textLayout=\"This structure has been captured by hostile forces and has automatically self-destructed.\"/>\n      <row refTypeID=\"163\" refTypeCode=\"SovStationEnteredFreeport\" refTypeName=\"Station Entered Freeport\" subjectLayout=\"Station in {solarSystemID} has entered freeport mode\" textLayout=\"This structure has been captured by hostile forces and has entered Freeport Mode. Command nodes will begin decloaking at {decloakTime}.\"/>\n      <row refTypeID=\"164\" refTypeCode=\"IHubDestroyedByBillFailure\" refTypeName=\"IHub Destroyed - Bill\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"165\" refTypeCode=\"AllianceCapitalChanged\" refTypeName=\"Alliance Capital Changed\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"1030\" refTypeCode=\"GameTimeReceived\" refTypeName=\"Game Time Received\" subjectLayout=\"Plex Donation\" textLayout=\"{senderCharID} has donated 30 days of game time to you.\"/>\n      <row refTypeID=\"1031\" refTypeCode=\"GameTimeSent\" refTypeName=\"Game Time Sent\" subjectLayout=\"Plex Donation\" textLayout=\"You have donated 30 days of game time to {receiverCharID}.\"/>\n      <row refTypeID=\"1034\" refTypeCode=\"StructureItemsDelivered\" refTypeName=\"Items Delivered\" subjectLayout=\"Items delivered\" textLayout=\"{charID} has delivered the following items to {structureID} in {solarsystemID}:\\n\\n{listOfTypesAndQty}\"/>\n      <row refTypeID=\"1035\" refTypeCode=\"NPCStandingsLost\" refTypeName=\"NPC Standings Changed\" subjectLayout=\"Standing changed\" textLayout=\"{senderName} has changed standings towards you by {amount}\"/>\n      <row refTypeID=\"1036\" refTypeCode=\"SeasonalChallengeCompleted\" refTypeName=\"Agency Event Points Rewarded\" subjectLayout=\"The Agency: {points_awarded} Points Achieved\" textLayout=\"\"/>\n      <row refTypeID=\"1037\" refTypeCode=\"OwnershipTransferred\" refTypeName=\"Structure Transferred\" subjectLayout=\"Ownership of {structureName} has been transferred\" textLayout=\"Ownership of {structureName} has been transferred by {characterName} from {fromCorporationName} to {toCorporationName}.\"/>\n      <row refTypeID=\"1038\" refTypeCode=\"CombatOperationFinished\" refTypeName=\"Combat Operation Finished\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"1039\" refTypeCode=\"IndustryOperationFinished\" refTypeName=\"Industry Operation Completed\" subjectLayout=\"Industry job has been completed\" textLayout=\"An industry job has completed.\"/>\n      <row refTypeID=\"1040\" refTypeCode=\"WarEndedHqSecurityDrop\" refTypeName=\"War Ended Due to War HQ Invasion\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"1041\" refTypeCode=\"WarHQRemovedFromSpace\" refTypeName=\"War Ended Due to War HQ Removal\" subjectLayout=\"\" textLayout=\"\"/>\n      <row refTypeID=\"1042\" refTypeCode=\"WarRetractedByConcord\" refTypeName=\"War Retracted by CONCORD\" subjectLayout=\"CONCORD Invalidates War Declared By {declaredByID} Against {againstID}\" textLayout=\"{senderName} has declared this war invalid as it breaches one or more articles in the Yulai Convention. The war will be declared as being over on {endDate}.\"/>\n    </rowset>\n  </result>\n  <cachedUntil></cachedUntil>\n</eveapi>\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Osmium/Loadout/SerializableOsmiumLoadoutAuthor.cs",
    "content": "﻿namespace EVEMon.Common.Serialization.Osmium.Loadout\n{\n    public sealed class SerializableOsmiumLoadoutAuthor\n    {\n        public string Type { get; set; }\n\n        public string Name { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Osmium/Loadout/SerializableOsmiumLoadoutFeed.cs",
    "content": "using System;\nusing EVEMon.Common.Constants;\n\nnamespace EVEMon.Common.Serialization.Osmium.Loadout\n{\n    public sealed class SerializableOsmiumLoadoutFeed\n    {\n        public long ID => long.Parse(Uri.Replace($\"{NetworkConstants.OsmiumBaseUrl}/loadout/\", string.Empty),\n            CultureConstants.InvariantCulture);\n\n        public string Uri { get; set; }\n\n        public string Name { get; set; }\n\n        public int ShipTypeID { get; set; }\n\n        public string ShipTypeName { get; set; }\n\n        public SerializableOsmiumLoadoutAuthor Author { get; set; }\n\n        public long CreationDate { get; set; }\n\n        public string RawDescription { get; set; }\n\n        public int UpVotes { get; set; }\n\n        public int DownVotes { get; set; }\n\n        public int Rating => UpVotes - DownVotes;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/PatchXml/SerializableDatafile.cs",
    "content": "using System.Xml;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.PatchXml\n{\n    public sealed class SerializableDatafile\n    {\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>\n        /// The name.\n        /// </value>\n        [XmlElement(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the date.\n        /// </summary>\n        /// <value>\n        /// The date.\n        /// </value>\n        [XmlElement(\"date\")]\n        public string Date { get; set; }\n\n        /// <summary>\n        /// Gets or sets the md5 sum.\n        /// </summary>\n        /// <value>\n        /// The md5 sum.\n        /// </value>\n        [XmlElement(\"md5\")]\n        public string MD5Sum { get; set; }\n\n        /// <summary>\n        /// Gets or sets the address.\n        /// </summary>\n        /// <value>\n        /// The address.\n        /// </value>\n        [XmlElement(\"url\")]\n        public string Address { get; set; }\n\n        /// <summary>\n        /// Gets or sets the message XML.\n        /// </summary>\n        /// <value>\n        /// The message XML.\n        /// </value>\n        /// <exception cref=\"System.ArgumentNullException\">value</exception>\n        [XmlElement(\"message\")]\n        public XmlCDataSection MessageXml\n        {\n            get { return new XmlDocument().CreateCDataSection(Message); }\n            set\n            {\n                value.ThrowIfNull(nameof(value));\n\n                Message = value.Data;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the message.\n        /// </summary>\n        /// <value>\n        /// The message.\n        /// </value>\n        [XmlIgnore]\n        public string Message { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this instance is downloaded.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if this instance is downloaded; otherwise, <c>false</c>.\n        /// </value>\n        [XmlIgnore]\n        public bool IsDownloaded { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/PatchXml/SerializablePatch.cs",
    "content": "using System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.Common.Serialization.PatchXml\n{\n    [XmlRoot(\"evemon\")]\n    public sealed class SerializablePatch\n    {\n        private readonly Collection<SerializableRelease> m_releases;\n        private readonly Collection<SerializableDatafile> m_datafiles;\n        private readonly Collection<SerializableDatafile> m_changedDatafiles;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializablePatch\"/> class.\n        /// </summary>\n        public SerializablePatch()\n        {\n            Release = new SerializableRelease();\n            m_releases = new Collection<SerializableRelease>();\n            m_datafiles = new Collection<SerializableDatafile>();\n            m_changedDatafiles = new Collection<SerializableDatafile>();\n        }\n\n        /// <summary>\n        /// Gets or sets the release.\n        /// </summary>\n        /// <value>\n        /// The release.\n        /// </value>\n        /// <remarks> This xml element is to be used only for version 2</remarks>>\n        [XmlElement(\"newest\")]\n        public SerializableRelease Release { get; set; }\n\n        /// <summary>\n        /// Gets or sets the releases.\n        /// </summary>\n        /// <value>\n        /// The releases.\n        /// </value>\n        /// <remarks> This xml element is used for version 3+</remarks>>\n        [XmlArray(\"releases\")]\n        [XmlArrayItem(\"release\")]\n        public Collection<SerializableRelease> Releases => m_releases;\n\n        /// <summary>\n        /// Gets the datafiles.\n        /// </summary>\n        /// <value>\n        /// The datafiles.\n        /// </value>\n        [XmlArray(\"datafiles\")]\n        [XmlArrayItem(\"datafile\")]\n        public Collection<SerializableDatafile> Datafiles => m_datafiles;\n\n        /// <summary>\n        /// Gets the changed datafiles.\n        /// </summary>\n        /// <value>\n        /// The changed datafiles.\n        /// </value>\n        [XmlIgnore]\n        internal Collection<SerializableDatafile> ChangedDatafiles => m_changedDatafiles;\n\n        /// <summary>\n        /// Gets a value indicating whether files have changed.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if files have changed; otherwise, <c>false</c>.\n        /// </value>\n        [XmlIgnore]\n        internal bool FilesHaveChanged\n        {\n            get\n            {\n                m_changedDatafiles.Clear();\n\n                foreach (Datafile datafile in EveMonClient.Datafiles)\n                {\n                    foreach (SerializableDatafile dfv in Datafiles.Where(dfv => dfv.Name == datafile.Filename))\n                    {\n                        if (datafile.MD5Sum != dfv.MD5Sum)\n                            m_changedDatafiles.Add(dfv);\n\n                        break;\n                    }\n                }\n\n                return ChangedDatafiles.Count > 0;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/PatchXml/SerializableRelease.cs",
    "content": "using System.Xml;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.Serialization.PatchXml\n{\n    public sealed class SerializableRelease\n    {\n        /// <summary>\n        /// Gets or sets the date.\n        /// </summary>\n        /// <value>\n        /// The date.\n        /// </value>\n        [XmlElement(\"date\")]\n        public string Date { get; set; }\n\n        /// <summary>\n        /// Gets or sets the version.\n        /// </summary>\n        /// <value>\n        /// The version.\n        /// </value>\n        [XmlElement(\"version\")]\n        public string Version { get; set; }\n\n        /// <summary>\n        /// Gets or sets the md5 sum.\n        /// </summary>\n        /// <value>\n        /// The md5 sum.\n        /// </value>\n        [XmlElement(\"md5\")]\n        public string MD5Sum { get; set; }\n\n        /// <summary>\n        /// Gets or sets the topic address.\n        /// </summary>\n        /// <value>\n        /// The topic address.\n        /// </value>\n        [XmlElement(\"url\")]\n        public string TopicAddress { get; set; }\n\n        /// <summary>\n        /// Gets or sets the patch address.\n        /// </summary>\n        /// <value>\n        /// The patch address.\n        /// </value>\n        [XmlElement(\"autopatchurl\")]\n        public string PatchAddress { get; set; }\n\n        /// <summary>\n        /// Gets or sets the installer arguments.\n        /// </summary>\n        /// <value>\n        /// The installer arguments.\n        /// </value>\n        [XmlElement(\"autopatchargs\")]\n        public string InstallerArgs { get; set; }\n\n        /// <summary>\n        /// Gets or sets the additional arguments.\n        /// </summary>\n        /// <value>\n        /// The additional arguments.\n        /// </value>\n        [XmlElement(\"additionalargs\")]\n        public string AdditionalArgs { get; set; }\n\n        /// <summary>\n        /// Gets or sets the message XML.\n        /// </summary>\n        /// <value>\n        /// The message XML.\n        /// </value>\n        /// <exception cref=\"System.ArgumentNullException\">value</exception>\n        [XmlElement(\"message\")]\n        public XmlCDataSection MessageXml\n        {\n            get { return new XmlDocument().CreateCDataSection(Message); }\n            set\n            {\n                value.ThrowIfNull(nameof(value));\n\n                Message = value.Data;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the message.\n        /// </summary>\n        /// <value>\n        /// The message.\n        /// </value>\n        [XmlIgnore]\n        public string Message { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/RefTypes.xml",
    "content": "<?xml version='1.0' encoding='UTF-8'?>\n<eveapi version=\"2\">\n  <currentTime>2018-03-27 00:53:15</currentTime>\n  <result>\n    <rowset name=\"refTypes\" key=\"refTypeID\" columns=\"refTypeID,refTypeName\">\n      <row refTypeID=\"0\" refTypeName=\"Undefined\" />\n      <row refTypeID=\"1\" refTypeName=\"Player Trading\" />\n      <row refTypeID=\"2\" refTypeName=\"Market Transaction\" />\n      <row refTypeID=\"3\" refTypeName=\"GM Cash Transfer\" />\n      <row refTypeID=\"4\" refTypeName=\"ATM Withdraw\" />\n      <row refTypeID=\"5\" refTypeName=\"ATM Deposit\" />\n      <row refTypeID=\"6\" refTypeName=\"Backward Compatible\" />\n      <row refTypeID=\"7\" refTypeName=\"Mission Reward\" />\n      <row refTypeID=\"8\" refTypeName=\"Clone Activation\" />\n      <row refTypeID=\"9\" refTypeName=\"Inheritance\" />\n      <row refTypeID=\"10\" refTypeName=\"Player Donation\" />\n      <row refTypeID=\"11\" refTypeName=\"Corporation Payment\" />\n      <row refTypeID=\"12\" refTypeName=\"Docking Fee\" />\n      <row refTypeID=\"13\" refTypeName=\"Office Rental Fee\" />\n      <row refTypeID=\"14\" refTypeName=\"Factory Slot Rental Fee\" />\n      <row refTypeID=\"15\" refTypeName=\"Repair Bill\" />\n      <row refTypeID=\"16\" refTypeName=\"Bounty\" />\n      <row refTypeID=\"17\" refTypeName=\"Bounty Prize\" />\n      <row refTypeID=\"18\" refTypeName=\"Agents_temporary\" />\n      <row refTypeID=\"19\" refTypeName=\"Insurance\" />\n      <row refTypeID=\"20\" refTypeName=\"Mission Expiration\" />\n      <row refTypeID=\"21\" refTypeName=\"Mission Completion\" />\n      <row refTypeID=\"22\" refTypeName=\"Shares\" />\n      <row refTypeID=\"23\" refTypeName=\"Courier Mission Escrow\" />\n      <row refTypeID=\"24\" refTypeName=\"Mission Cost\" />\n      <row refTypeID=\"25\" refTypeName=\"Agent Miscellaneous\" />\n      <row refTypeID=\"26\" refTypeName=\"LP Store\" />\n      <row refTypeID=\"27\" refTypeName=\"Agent Location Services\" />\n      <row refTypeID=\"28\" refTypeName=\"Agent Donation\" />\n      <row refTypeID=\"29\" refTypeName=\"Agent Security Services\" />\n      <row refTypeID=\"30\" refTypeName=\"Agent Mission Collateral Paid\" />\n      <row refTypeID=\"31\" refTypeName=\"Agent Mission Collateral Refunded\" />\n      <row refTypeID=\"32\" refTypeName=\"Agents_preward\" />\n      <row refTypeID=\"33\" refTypeName=\"Agent Mission Reward\" />\n      <row refTypeID=\"34\" refTypeName=\"Agent Mission Time Bonus Reward\" />\n      <row refTypeID=\"35\" refTypeName=\"CSPA\" />\n      <row refTypeID=\"36\" refTypeName=\"CSPAOfflineRefund\" />\n      <row refTypeID=\"37\" refTypeName=\"Corporation Account Withdrawal\" />\n      <row refTypeID=\"38\" refTypeName=\"Corporation Dividend Payment\" />\n      <row refTypeID=\"39\" refTypeName=\"Corporation Registration Fee\" />\n      <row refTypeID=\"40\" refTypeName=\"Corporation Logo Change Cost\" />\n      <row refTypeID=\"41\" refTypeName=\"Release Of Impounded Property\" />\n      <row refTypeID=\"42\" refTypeName=\"Market Escrow\" />\n      <row refTypeID=\"43\" refTypeName=\"Agent Services Rendered\" />\n      <row refTypeID=\"44\" refTypeName=\"Market Fine Paid\" />\n      <row refTypeID=\"45\" refTypeName=\"Corporation Liquidation\" />\n      <row refTypeID=\"46\" refTypeName=\"Brokers Fee\" />\n      <row refTypeID=\"47\" refTypeName=\"Corporation Bulk Payment\" />\n      <row refTypeID=\"48\" refTypeName=\"Alliance Registration Fee\" />\n      <row refTypeID=\"49\" refTypeName=\"War Fee\" />\n      <row refTypeID=\"50\" refTypeName=\"Alliance Maintainance Fee\" />\n      <row refTypeID=\"51\" refTypeName=\"Contraband Fine\" />\n      <row refTypeID=\"52\" refTypeName=\"Clone Transfer\" />\n      <row refTypeID=\"53\" refTypeName=\"Acceleration Gate Fee\" />\n      <row refTypeID=\"54\" refTypeName=\"Transaction Tax\" />\n      <row refTypeID=\"55\" refTypeName=\"Jump Clone Installation Fee\" />\n      <row refTypeID=\"56\" refTypeName=\"Manufacturing\" />\n      <row refTypeID=\"57\" refTypeName=\"Researching Technology\" />\n      <row refTypeID=\"58\" refTypeName=\"Researching Time Productivity\" />\n      <row refTypeID=\"59\" refTypeName=\"Researching Material Productivity\" />\n      <row refTypeID=\"60\" refTypeName=\"Copying\" />\n      <row refTypeID=\"61\" refTypeName=\"Duplicating\" />\n      <row refTypeID=\"62\" refTypeName=\"Reverse Engineering\" />\n      <row refTypeID=\"63\" refTypeName=\"Contract Auction Bid\" />\n      <row refTypeID=\"64\" refTypeName=\"Contract Auction Bid Refund\" />\n      <row refTypeID=\"65\" refTypeName=\"Contract Collateral\" />\n      <row refTypeID=\"66\" refTypeName=\"Contract Reward Refund\" />\n      <row refTypeID=\"67\" refTypeName=\"Contract Auction Sold\" />\n      <row refTypeID=\"68\" refTypeName=\"Contract Reward\" />\n      <row refTypeID=\"69\" refTypeName=\"Contract Collateral Refund\" />\n      <row refTypeID=\"70\" refTypeName=\"Contract Collateral Payout\" />\n      <row refTypeID=\"71\" refTypeName=\"Contract Price\" />\n      <row refTypeID=\"72\" refTypeName=\"Contract Brokers Fee\" />\n      <row refTypeID=\"73\" refTypeName=\"Contract Sales Tax\" />\n      <row refTypeID=\"74\" refTypeName=\"Contract Deposit\" />\n      <row refTypeID=\"75\" refTypeName=\"Contract Deposit Sales Tax\" />\n      <row refTypeID=\"76\" refTypeName=\"Secure EVE Time Code Exchange\" />\n      <row refTypeID=\"77\" refTypeName=\"Contract Auction Bid (corp)\" />\n      <row refTypeID=\"78\" refTypeName=\"Contract Collateral Deposited (corp)\" />\n      <row refTypeID=\"79\" refTypeName=\"Contract Price Payment (corp)\" />\n      <row refTypeID=\"80\" refTypeName=\"Contract Brokers Fee (corp)\" />\n      <row refTypeID=\"81\" refTypeName=\"Contract Deposit (corp)\" />\n      <row refTypeID=\"82\" refTypeName=\"Contract Deposit Refund\" />\n      <row refTypeID=\"83\" refTypeName=\"Contract Reward Deposited\" />\n      <row refTypeID=\"84\" refTypeName=\"Contract Reward Deposited (corp)\" />\n      <row refTypeID=\"85\" refTypeName=\"Bounty Prizes\" />\n      <row refTypeID=\"86\" refTypeName=\"Advertisement Listing Fee\" />\n      <row refTypeID=\"87\" refTypeName=\"Medal Creation\" />\n      <row refTypeID=\"88\" refTypeName=\"Medal Issued\" />\n      <row refTypeID=\"89\" refTypeName=\"Betting\" />\n      <row refTypeID=\"90\" refTypeName=\"DNA Modification Fee\" />\n      <row refTypeID=\"91\" refTypeName=\"Sovereignity bill\" />\n      <row refTypeID=\"92\" refTypeName=\"Bounty Prize Corporation Tax\" />\n      <row refTypeID=\"93\" refTypeName=\"Agent Mission Reward Corporation Tax\" />\n      <row refTypeID=\"94\" refTypeName=\"Agent Mission Time Bonus Reward Corporation Tax\" />\n      <row refTypeID=\"95\" refTypeName=\"Upkeep adjustment fee\" />\n      <row refTypeID=\"96\" refTypeName=\"Planetary Import Tax\" />\n      <row refTypeID=\"97\" refTypeName=\"Planetary Export Tax\" />\n      <row refTypeID=\"98\" refTypeName=\"Planetary Construction\" />\n      <row refTypeID=\"99\" refTypeName=\"Corporate Reward Payout\" />\n      <row refTypeID=\"101\" refTypeName=\"Bounty Surcharge\" />\n      <row refTypeID=\"102\" refTypeName=\"Contract Reversal\" />\n      <row refTypeID=\"103\" refTypeName=\"Corporate Reward Tax\" />\n      <row refTypeID=\"106\" refTypeName=\"Store Purchase\" />\n      <row refTypeID=\"107\" refTypeName=\"Store Purchase Refund\" />\n      <row refTypeID=\"108\" refTypeName=\"PLEX sold for Aurum\" />\n      <row refTypeID=\"109\" refTypeName=\"Lottery Give Away\" />\n      <row refTypeID=\"111\" refTypeName=\"Aurum Token exchanged for Aur\" />\n      <row refTypeID=\"112\" refTypeName=\"Datacore Fee\" />\n      <row refTypeID=\"113\" refTypeName=\"War fee surrender\" />\n      <row refTypeID=\"114\" refTypeName=\"War ally contract\" />\n      <row refTypeID=\"115\" refTypeName=\"Bounty Reimbursement\" />\n      <row refTypeID=\"116\" refTypeName=\"Kill Right Fee\" />\n      <row refTypeID=\"117\" refTypeName=\"Security Processing Fee\" />\n      <row refTypeID=\"118\" refTypeName=\"Escrow for Industry Team Auction\" />\n      <row refTypeID=\"119\" refTypeName=\"Reimbursement of escrow\" />\n      <row refTypeID=\"120\" refTypeName=\"Industry Job Tax\" />\n      <row refTypeID=\"122\" refTypeName=\"Infrastructure Hub maintenance\" />\n      <row refTypeID=\"123\" refTypeName=\"Asset Safety recovery Tax\" />\n      <row refTypeID=\"124\" refTypeName=\"Opportunity reward\" />\n      <row refTypeID=\"125\" refTypeName=\"Project Discovery reward\" />\n      <row refTypeID=\"126\" refTypeName=\"Project Discovery Tax\" />\n      <row refTypeID=\"127\" refTypeName=\"Reprocessing Tax\" />\n      <row refTypeID=\"128\" refTypeName=\"Jump Clone Activation Fee\" />\n      <row refTypeID=\"129\" refTypeName=\"Operation Bonus\" />\n      <row refTypeID=\"131\" refTypeName=\"Resource Wars Site Completion\" />\n      <row refTypeID=\"132\" refTypeName=\"Duel Wager Escrow\" />\n      <row refTypeID=\"133\" refTypeName=\"Duel Wager Payment\" />\n      <row refTypeID=\"134\" refTypeName=\"Duel Wager Refund\" />\n      <row refTypeID=\"135\" refTypeName=\"Reactions\" />\n      <row refTypeID=\"136\" refTypeName=\"External Trade Freeze\" />\n      <row refTypeID=\"137\" refTypeName=\"External Trade Thaw\" />\n      <row refTypeID=\"138\" refTypeName=\"External Trade Delivery\" />\n      <row refTypeID=\"10001\" refTypeName=\"Modify ISK\" />\n      <row refTypeID=\"10002\" refTypeName=\"Primary Marketplace Purchase\" />\n      <row refTypeID=\"10003\" refTypeName=\"Battle Reward\" />\n      <row refTypeID=\"10004\" refTypeName=\"New Character Starting Funds\" />\n      <row refTypeID=\"10005\" refTypeName=\"Corporation Account Withdrawal\" />\n      <row refTypeID=\"10006\" refTypeName=\"Corporation Account Deposit\" />\n      <row refTypeID=\"10007\" refTypeName=\"Battle WP Win Reward\" />\n      <row refTypeID=\"10008\" refTypeName=\"Battle WP Loss Reward\" />\n      <row refTypeID=\"10009\" refTypeName=\"Battle Win Reward\" />\n      <row refTypeID=\"10010\" refTypeName=\"Battle Loss Reward\" />\n      <row refTypeID=\"10011\" refTypeName=\"Reset ISK for Character Reset\" />\n      <row refTypeID=\"10012\" refTypeName=\"District Contract Deposit\" />\n      <row refTypeID=\"10013\" refTypeName=\"District Contract Deposit Refund\" />\n      <row refTypeID=\"10014\" refTypeName=\"District Contract Collateral\" />\n      <row refTypeID=\"10015\" refTypeName=\"District Contract Collateral Refund\" />\n      <row refTypeID=\"10016\" refTypeName=\"District Contract Reward\" />\n      <row refTypeID=\"10017\" refTypeName=\"District Clone Transportation\" />\n      <row refTypeID=\"10018\" refTypeName=\"District Clone Transportation Refund\" />\n      <row refTypeID=\"10019\" refTypeName=\"District Infrastructure\" />\n      <row refTypeID=\"10020\" refTypeName=\"District Clone Sales\" />\n      <row refTypeID=\"10021\" refTypeName=\"District Clone Purchase\" />\n      <row refTypeID=\"10022\" refTypeName=\"Biomass Reward\" />\n      <row refTypeID=\"10023\" refTypeName=\"ISK Swap Reward\" />\n      <row refTypeID=\"11001\" refTypeName=\"Modify AUR\" />\n      <row refTypeID=\"11002\" refTypeName=\"Respec payment\" />\n      <row refTypeID=\"11003\" refTypeName=\"Entitlement\" />\n      <row refTypeID=\"11004\" refTypeName=\"Reset Reimbursement\" />\n      <row refTypeID=\"11005\" refTypeName=\"Reset AUR for Character Reset\" />\n      <row refTypeID=\"12001\" refTypeName=\"Daily mission CP\" />\n      <row refTypeID=\"12002\" refTypeName=\"Warbarge CP\" />\n      <row refTypeID=\"12003\" refTypeName=\"Donate CP\" />\n      <row refTypeID=\"12004\" refTypeName=\"Use CP for clone packs\" />\n      <row refTypeID=\"12005\" refTypeName=\"Use CP for moving clones\" />\n      <row refTypeID=\"12006\" refTypeName=\"Use CP for selling clones\" />\n      <row refTypeID=\"12007\" refTypeName=\"Use CP for changing reinforcement\" />\n      <row refTypeID=\"12008\" refTypeName=\"Use CP for changing surface infrastructure\" />\n      <row refTypeID=\"13001\" refTypeName=\"Daily mission DK\" />\n      <row refTypeID=\"13002\" refTypeName=\"Planetary conquest DK\" />\n      <row refTypeID=\"13003\" refTypeName=\"Use DK for purchasing items\" />\n      <row refTypeID=\"13004\" refTypeName=\"Use DK for rerolling market\" />\n      <row refTypeID=\"13005\" refTypeName=\"Selling Clones DK\" />\n      <row refTypeID=\"139\" refTypeName=\"Gate Jump Fee\" />\n    </rowset>\n  </result>\n  <cachedUntil>2018-03-28 00:53:15</cachedUntil>\n</eveapi>\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Samples/Charactersheet.out.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<eveapi version=\"2\">\n  <currentTime>2007-06-18 22:49:01</currentTime>\n  <result>\n    <characterID>150337897</characterID>\n    <name>corpslave</name>\n    <race>Minmatar</race>\n    <bloodLine>Brutor</bloodLine>\n    <gender>Female</gender>\n    <corporationName>corpexport Corp</corporationName>\n    <corporationID>150337746</corporationID>\n    <cloneName>Clone Grade Pi</cloneName>\n    <cloneSkillPoints>54600000</cloneSkillPoints>\n    <balance>190210393.87</balance>\n    <attributeEnhancers>\n      <intelligenceBonus>\n        <augmentatorName>Snake Delta</augmentatorName>\n        <augmentatorValue>3</augmentatorValue>\n      </intelligenceBonus>\n      <memoryBonus>\n        <augmentatorName>Halo Beta</augmentatorName>\n        <augmentatorValue>3</augmentatorValue>\n      </memoryBonus>\n    </attributeEnhancers>\n    <attributes>\n      <intelligence>6</intelligence>\n      <memory>4</memory>\n      <charisma>7</charisma>\n      <perception>12</perception>\n      <willpower>10</willpower>\n    </attributes>\n    <skill>\n      <skills typeID=\"3431\" skillpoints=\"8000\" level=\"3\" />\n      <skills typeID=\"3413\" skillpoints=\"8000\" level=\"3\" />\n      <skills typeID=\"21059\" skillpoints=\"500\" level=\"1\" />\n      <skills typeID=\"3416\" skillpoints=\"8000\" level=\"3\" />\n      <skills typeID=\"3445\" skillpoints=\"277578\" unpublished=\"1\" />\n    </skill>\n    <certificate>\n      <certificates certificateID=\"1\" />\n      <certificates certificateID=\"5\" />\n      <certificates certificateID=\"19\" />\n      <certificates certificateID=\"239\" />\n      <certificates certificateID=\"282\" />\n      <certificates certificateID=\"32\" />\n      <certificates certificateID=\"258\" />\n    </certificate>\n    <corporationRole>\n      <corporationRoles roleID=\"1\" roleName=\"roleDirector\" />\n    </corporationRole>\n    <corporationRolesAtH>\n      <corporationRolesAtHQ roleID=\"1\" roleName=\"roleDirector\" />\n    </corporationRolesAtH>\n    <corporationRolesAtBas>\n      <corporationRolesAtBase roleID=\"1\" roleName=\"roleDirector\" />\n    </corporationRolesAtBas>\n    <corporationRolesAtOthe>\n      <corporationRolesAtOther roleID=\"1\" roleName=\"roleDirector\" />\n    </corporationRolesAtOthe>\n    <corporationTitle>\n      <corporationTitles titleID=\"1\" titleName=\"Member\" />\n    </corporationTitle>\n  </result>\n  <cachedUntil>2007-06-18 23:49:01</cachedUntil>\n</eveapi>"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Samples/Charactersheet.xml",
    "content": "<?xml version='1.0' encoding='UTF-8'?>\n<eveapi version=\"2\">\n  <currentTime>2007-06-18 22:49:01</currentTime>\n  <result>\n    <characterID>150337897</characterID>\n    <name>corpslave</name>\n    <race>Minmatar</race>\n    <bloodLine>Brutor</bloodLine>\n    <gender>Female</gender>\n    <corporationName>corpexport Corp</corporationName>\n    <corporationID>150337746</corporationID>\n    <cloneName>Clone Grade Pi</cloneName>\n    <cloneSkillPoints>54600000</cloneSkillPoints>\n    <balance>190210393.87</balance>\n    <attributeEnhancers>\n      <intelligenceBonus>\n        <augmentatorName>Snake Delta</augmentatorName>\n        <augmentatorValue>3</augmentatorValue>\n      </intelligenceBonus>\n      <memoryBonus>\n        <augmentatorName>Halo Beta</augmentatorName>\n        <augmentatorValue>3</augmentatorValue>\n      </memoryBonus>\n    </attributeEnhancers>\n    <attributes>\n      <intelligence>6</intelligence>\n      <memory>4</memory>\n      <charisma>7</charisma>\n      <perception>12</perception>\n      <willpower>10</willpower>\n    </attributes>\n    <rowset name=\"skills\" key=\"typeID\">\n      <row typeID=\"3431\" skillpoints=\"8000\" level=\"3\"/>\n      <row typeID=\"3413\" skillpoints=\"8000\" level=\"3\"/>\n      <row typeID=\"21059\" skillpoints=\"500\" level=\"1\"/>\n      <row typeID=\"3416\" skillpoints=\"8000\" level=\"3\"/>\n      <row typeID=\"3445\" skillpoints=\"277578\" unpublished=\"1\"/>\n    </rowset>\n    <rowset name=\"certificates\" key=\"certificateID\" columns=\"certificateID\">\n      <row certificateID=\"1\"/>\n      <row certificateID=\"5\"/>\n      <row certificateID=\"19\"/>\n      <row certificateID=\"239\"/>\n      <row certificateID=\"282\"/>\n      <row certificateID=\"32\"/>\n      <row certificateID=\"258\"/>\n    </rowset>\n    <rowset name=\"corporationRoles\" key=\"roleID\" columns=\"roleID,roleName\">\n      <row roleID=\"1\" roleName=\"roleDirector\" />\n    </rowset>\n    <rowset name=\"corporationRolesAtHQ\" key=\"roleID\" columns=\"roleID,roleName\">\n      <row roleID=\"1\" roleName=\"roleDirector\" />\n    </rowset>\n    <rowset name=\"corporationRolesAtBase\" key=\"roleID\" columns=\"roleID,roleName\">\n      <row roleID=\"1\" roleName=\"roleDirector\" />\n    </rowset>\n    <rowset name=\"corporationRolesAtOther\" key=\"roleID\" columns=\"roleID,roleName\">\n      <row roleID=\"1\" roleName=\"roleDirector\" />\n    </rowset>\n    <rowset name=\"corporationTitles\" key=\"titleID\" columns=\"titleID,titleName\">\n      <row titleID=\"1\" titleName=\"Member\" />\n    </rowset>\n  </result>\n  <cachedUntil>2007-06-18 23:49:01</cachedUntil>\n</eveapi>\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Samples/HtmlExport.xml",
    "content": "<?xml version=\"1.0\"?>\n<character xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" name=\"John Doe\" characterID=\"1077267502\">\n  <race>Minmatar</race>\n  <bloodLine>Sebiestor</bloodLine>\n  <gender>Male</gender>\n  <corporationName>Republic Military School</corporationName>\n  <balance>63955550.24</balance>\n  <intelligence>20.9</intelligence>\n  <charisma>17.6</charisma>\n  <perception>31.9000015</perception>\n  <memory>25.3000011</memory>\n  <willpower>20.9</willpower>\n  <attributeEnhancers>\n    <implant attribute=\"intelligence\" bonus=\"5\" name=\"Ocular Filter - Improved\" />\n    <implant attribute=\"perception\" bonus=\"5\" name=\"Memory Augmentation - Improved\" />\n    <implant attribute=\"charisma\" bonus=\"5\" name=\"Neural Boost - Improved\" />\n    <implant attribute=\"willpower\" bonus=\"5\" name=\"Cybernetic Subprocessor - Improved\" />\n    <implant attribute=\"memory\" bonus=\"4\" name=\"Social Adaptation Chip - Standard\" />\n  </attributeEnhancers>\n  <skills>\n    <skillGroup groupName=\"Corporation Management\" skillsCount=\"15\" totalSP=\"0\">\n      <skill typeName=\"Anchoring\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"CFO Training\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Chief Science Officer\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Corporation Management\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Empire Control\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Ethnic Relations\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Factory Management\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Intelligence Analyst\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Megacorp Management\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Public Relations\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Refinery Management\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Sovereignty\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Starbase Defense Management\">\n        <rank>7</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1792000</maxSP>\n      </skill>\n      <skill typeName=\"Starbase Management\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Station Management\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Drones\" skillsCount=\"22\" totalSP=\"877622\">\n      <skill typeName=\"Advanced Drone Interfacing\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Drone Specialization\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Drone Specialization\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Combat Drone Operation\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Drone Durability\">\n        <rank>5</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>40000</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Drone Interfacing\">\n        <rank>5</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>226275</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Drone Navigation\">\n        <rank>1</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>45255</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Drone Sharpshooting\">\n        <rank>1</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>45255</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Drones\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Electronic Warfare Drone Interfacing\">\n        <rank>5</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>40000</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Fighters\">\n        <rank>12</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3072000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Drone Specialization\">\n        <rank>5</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>40000</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Heavy Drone Operation\">\n        <rank>5</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>40000</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Mining Drone Operation\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Mining Drone Specialization\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Drone Specialization\">\n        <rank>5</rank>\n        <level>1</level>\n        <romanLevel>I</romanLevel>\n        <SP>1250</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Propulsion Jamming Drone Interfacing\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Repair Drone Operation\">\n        <rank>3</rank>\n        <level>1</level>\n        <romanLevel>I</romanLevel>\n        <SP>750</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Salvage Drone Operation\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Scout Drone Operation\">\n        <rank>1</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>45255</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Sentry Drone Interfacing\">\n        <rank>5</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>7072</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"TEST Drone Skill\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Electronics\" skillsCount=\"29\" totalSP=\"668470\">\n      <skill typeName=\"Advanced Sensor Upgrades\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Navy Security Clearance\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Cloaking\">\n        <rank>6</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>8486</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Cynosural Field Theory\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Electronic Warfare\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Electronics\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Electronics Upgrades\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Frequency Modulation\">\n        <rank>3</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>4243</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Hypereuclidean Navigation\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Long Distance Jamming\">\n        <rank>4</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>5657</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Long Range Targeting\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Multitasking\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Projected Electronic Counter Measures\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Propulsion Fall Off\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Propulsion Jamming\">\n        <rank>3</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>4243</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Propulsion Optimal Range\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Propulsion Stasis Strength\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Propulsion WS Strength\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Sensor Linking\">\n        <rank>3</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>4243</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Signal Dispersion\">\n        <rank>5</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>7072</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Signal Suppression\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Signature Analysis\">\n        <rank>1</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>45255</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Signature Focusing\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Survey\">\n        <rank>1</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>8000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Target Painting\">\n        <rank>3</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>4243</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Targeting\">\n        <rank>1</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>45255</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Tournament Observation\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Turret Destabilization\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Weapon Disruption\">\n        <rank>3</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>4243</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Engineering\" skillsCount=\"21\" totalSP=\"2762040\">\n      <skill typeName=\"Advanced Energy Grid Upgrades\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Advanced Shield Upgrades\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Capital Energy Emission Systems\">\n        <rank>10</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2560000</maxSP>\n      </skill>\n      <skill typeName=\"Capital Shield Emission Systems\">\n        <rank>10</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2560000</maxSP>\n      </skill>\n      <skill typeName=\"Capital Shield Operation\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"EM Shield Compensation\">\n        <rank>2</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>16000</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Energy Emission Systems\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Energy Grid Upgrades\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Energy Management\">\n        <rank>3</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>768000</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Energy Pulse Weapons\">\n        <rank>2</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>16000</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Energy Systems Operation\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Engineering\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Explosive Shield Compensation\">\n        <rank>2</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>16000</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Kinetic Shield Compensation\">\n        <rank>2</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>16000</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Shield Compensation\">\n        <rank>2</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>16000</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Shield Emission Systems\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Shield Management\">\n        <rank>3</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>768000</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Shield Operation\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Shield Upgrades\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Tactical Shield Manipulation\">\n        <rank>4</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>181020</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Thermic Shield Compensation\">\n        <rank>2</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>16000</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Gunnery\" skillsCount=\"42\" totalSP=\"1631031\">\n      <skill typeName=\"Advanced Weapon Upgrades\">\n        <rank>6</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>48000</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Armor Breaching\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Capital Energy Turret\">\n        <rank>7</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1792000</maxSP>\n      </skill>\n      <skill typeName=\"Capital Hybrid Turret\">\n        <rank>7</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1792000</maxSP>\n      </skill>\n      <skill typeName=\"Capital Projectile Turret\">\n        <rank>7</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1792000</maxSP>\n      </skill>\n      <skill typeName=\"Controlled Bursts\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Gunnery\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Large Artillery Specialization\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Large Autocannon Specialization\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Large Beam Laser Specialization\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Large Blaster Specialization\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Large Energy Turret\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Large Hybrid Turret\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Large Projectile Turret\">\n        <rank>5</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>40000</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Large Pulse Laser Specialization\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Large Railgun Specialization\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Medium Artillery Specialization\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Medium Autocannon Specialization\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Medium Beam Laser Specialization\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Medium Blaster Specialization\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Medium Energy Turret\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Medium Hybrid Turret\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Medium Projectile Turret\">\n        <rank>3</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>135765</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Medium Pulse Laser Specialization\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Medium Railgun Specialization\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Motion Prediction\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Rapid Firing\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Sharpshooter\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Shield Piercing\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Small Artillery Specialization\">\n        <rank>3</rank>\n        <level>1</level>\n        <romanLevel>I</romanLevel>\n        <SP>750</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Small Autocannon Specialization\">\n        <rank>3</rank>\n        <level>1</level>\n        <romanLevel>I</romanLevel>\n        <SP>750</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Small Beam Laser Specialization\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Small Blaster Specialization\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Small Energy Turret\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Small Hybrid Turret\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Small Projectile Turret\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Small Pulse Laser Specialization\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Small Railgun Specialization\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Surgical Strike\">\n        <rank>4</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>70236</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Tactical Weapon Reconfiguration\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Trajectory Analysis\">\n        <rank>5</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>40000</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Weapon Upgrades\">\n        <rank>2</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>512000</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Industry\" skillsCount=\"40\" totalSP=\"8500\">\n      <skill typeName=\"Advanced Mass Production\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Tech\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Arkonor Processing\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Bistot Processing\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Tech\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Crokite Processing\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Dark Ochre Processing\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Deep Core Mining\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Drug Manufacturing\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Tech\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Gas Cloud Harvesting\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Gas Harvesting\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Gneiss Processing\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Hedbergite Processing\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Hemorphite Processing\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Ice Harvesting\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Ice Processing\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Industrial Reconfiguration\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Industry\">\n        <rank>1</rank>\n        <level>1</level>\n        <romanLevel>I</romanLevel>\n        <SP>250</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Jaspet Processing\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Kernite Processing\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Mass Production\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Mercoxit Processing\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Mining\">\n        <rank>1</rank>\n        <level>1</level>\n        <romanLevel>I</romanLevel>\n        <SP>250</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Mining Upgrades\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Tech\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Mobile Factory Operation\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Mobile Refinery Operation\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Omber Processing\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Ore Compression\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Plagioclase Processing\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Production Efficiency\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Pyroxeres Processing\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Refinery Efficiency\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Refining\">\n        <rank>1</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>8000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Scordite Processing\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Scrapmetal Processing\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Spodumain Processing\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Supply Chain Management\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Veldspar Processing\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Leadership\" skillsCount=\"18\" totalSP=\"0\">\n      <skill typeName=\"Amarr Navy Doctrine\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Armored Warfare\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Armored Warfare Specialist\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Navy Doctrine\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Fleet Command\">\n        <rank>12</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3072000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Navy Doctrine\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Information Warfare\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Information Warfare Specialist\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Leadership\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Mining Director\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Mining Foreman\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Navy Doctrine\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Siege Warfare\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Siege Warfare Specialist\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Skirmish Warfare\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Skirmish Warfare Specialist\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Warfare Link Specialist\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Wing Command\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Learning\" skillsCount=\"11\" totalSP=\"1892315\">\n      <skill typeName=\"Analytical Mind\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Clarity\">\n        <rank>3</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>135765</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Eidetic Memory\">\n        <rank>3</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>135765</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Empathy\">\n        <rank>1</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>45255</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Focus\">\n        <rank>3</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>135765</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Instant Recall\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Iron Will\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Learning\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Logic\">\n        <rank>3</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>135765</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Presence\">\n        <rank>3</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>24000</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Spatial Awareness\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Mechanic\" skillsCount=\"36\" totalSP=\"443361\">\n      <skill typeName=\"Advanced Hull Upgrades\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Armor Rigging\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Astronautics Rigging\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Battleship Construction\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Capital Remote Armor Repair Systems\">\n        <rank>10</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2560000</maxSP>\n      </skill>\n      <skill typeName=\"Capital Remote Hull Repair Systems\">\n        <rank>10</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2560000</maxSP>\n      </skill>\n      <skill typeName=\"Capital Repair Systems\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Capital Ship Construction\">\n        <rank>14</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3584000</maxSP>\n      </skill>\n      <skill typeName=\"Cruiser Construction\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Drones Rigging\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"EM Armor Compensation\">\n        <rank>2</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>2829</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Electronic Superiority Rigging\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Energy Weapon Rigging\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Explosive Armor Compensation\">\n        <rank>2</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>2829</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Frigate Construction\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Hull Upgrades\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Hybrid Weapon Rigging\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Industrial Construction\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Jury Rigging\">\n        <rank>2</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>16000</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Kinetic Armor Compensation\">\n        <rank>2</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>2829</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Launcher Rigging\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Mechanic\">\n        <rank>1</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>45255</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Mobile Repair Bay Operation\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Nanite Interfacing\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Nanite Operation\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Outpost Construction\">\n        <rank>16</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>4096000</maxSP>\n      </skill>\n      <skill typeName=\"Projectile Weapon Rigging\">\n        <rank>3</rank>\n        <level>1</level>\n        <romanLevel>I</romanLevel>\n        <SP>750</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Remote Armor Repair Systems\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Remote Hull Repair Systems\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Repair Systems\">\n        <rank>1</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>8000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Salvaging\">\n        <rank>3</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>135765</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Shield Rigging\">\n        <rank>3</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>135765</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Structural Analyzis\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Tactical Logistics Reconfiguration\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Thermic Armor Compensation\">\n        <rank>2</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>2829</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Titan Construction\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Missile Launcher Operation\" skillsCount=\"24\" totalSP=\"723945\">\n      <skill typeName=\"Bomb Deployment\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Citadel Torpedoes\">\n        <rank>7</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1792000</maxSP>\n      </skill>\n      <skill typeName=\"Cruise Missile Specialization\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Cruise Missiles\">\n        <rank>5</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>40000</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Defender Missiles\">\n        <rank>2</rank>\n        <level>1</level>\n        <romanLevel>I</romanLevel>\n        <SP>500</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"FoF Missiles\">\n        <rank>3</rank>\n        <level>1</level>\n        <romanLevel>I</romanLevel>\n        <SP>750</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Guided Missile Precision\">\n        <rank>5</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>40000</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Heavy Assault Missile Specialization\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Heavy Assault Missiles\">\n        <rank>3</rank>\n        <level>1</level>\n        <romanLevel>I</romanLevel>\n        <SP>750</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Heavy Missile Specialization\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Heavy Missiles\">\n        <rank>3</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>24000</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Missile Bombardment\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Missile Guidance\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Missile Launcher Operation\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Missile Projection\">\n        <rank>4</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>32000</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Rapid Launch\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Rocket Specialization\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Rockets\">\n        <rank>1</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>1415</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Standard Missile Specialization\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Standard Missiles\">\n        <rank>2</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>16000</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Target Navigation Prediction\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Torpedo Specialization\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Torpedoes\">\n        <rank>4</rank>\n        <level>1</level>\n        <romanLevel>I</romanLevel>\n        <SP>1000</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Warhead Upgrades\">\n        <rank>5</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>40000</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Navigation\" skillsCount=\"11\" totalSP=\"1137112\">\n      <skill typeName=\"Acceleration Control\">\n        <rank>4</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>181020</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Afterburner\">\n        <rank>1</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>45255</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Evasive Maneuvering\">\n        <rank>2</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>512000</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Fuel Conservation\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"High Speed Maneuvering\">\n        <rank>5</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>7072</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Jump Drive Calibration\">\n        <rank>9</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2304000</maxSP>\n      </skill>\n      <skill typeName=\"Jump Drive Operation\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Jump Fuel Conservation\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Navigation\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Warp Drive Operation\">\n        <rank>1</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>45255</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Warp Navigation\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Science\" skillsCount=\"62\" totalSP=\"2209531\">\n      <skill typeName=\"Advanced Laboratory Operation\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Encryption Methods\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Amarrian Starship Engineering\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Archaeology\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Astrogeology\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Astrometric Acquisition\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Astrometric Pinpointing\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Astrometric Rangefinding\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Astrometrics\">\n        <rank>3</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>4243</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Astronautic Engineering\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Biology\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Encryption Methods\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Starship Engineering\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Cloning Facility Operation\">\n        <rank>10</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2560000</maxSP>\n      </skill>\n      <skill typeName=\"Cybernetics\">\n        <rank>3</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>768000</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Defensive Subsystem Technology\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Diagnostics Interfaces\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Doomsday Operation\">\n        <rank>14</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3584000</maxSP>\n      </skill>\n      <skill typeName=\"Duplicating\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Electromagnetic Physics\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Electronic Engineering\">\n        <rank>5</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>226275</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Electronic Subsystem Technology\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Engineering Subsystem Technology\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Encryption Methods\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Gallentean Starship Engineering\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Genetic Engineering\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Graviton Physics\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Gunnery Interfaces\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Hacking\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"High Energy Physics\">\n        <rank>5</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>7072</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Hydromagnetic Physics\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Hypernet Science\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Infomorph Psychology\">\n        <rank>1</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>1415</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Jump Portal Generation\">\n        <rank>14</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3584000</maxSP>\n      </skill>\n      <skill typeName=\"Laboratory Operation\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Laser Physics\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Mechanical Engineering\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Metallurgy\">\n        <rank>3</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>4243</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Encryption Methods\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Starship Engineering\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Mnemonics\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Molecular Engineering\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Nanite Control\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Nanite Engineering\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Neurotoxin Recovery\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Nuclear Physics\">\n        <rank>5</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>226275</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Offensive Subsystem Technology\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Plasma Physics\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Propulsion Subsystem Technology\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Quantum Physics\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Remote Interfaces\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Research\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Research Project Management\">\n        <rank>8</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>64000</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Reverse Engineering\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Rocket Science\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Science\">\n        <rank>1</rank>\n        <level>5</level>\n        <romanLevel>V</romanLevel>\n        <SP>256000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Scientific Networking\">\n        <rank>3</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>4243</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Sleeper Technology\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Takmahl Technology\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Talocan Technology\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Thermodynamics\">\n        <rank>3</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>135765</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Yan Jung Technology\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Social\" skillsCount=\"16\" totalSP=\"273695\">\n      <skill typeName=\"Bounty Hunting\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Bureaucratic Connections\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Connections\">\n        <rank>3</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>135765</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Criminal Connections\">\n        <rank>3</rank>\n        <level>1</level>\n        <romanLevel>I</romanLevel>\n        <SP>750</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"DED Connections\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Diplomacy\">\n        <rank>1</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>1415</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Fast Talk\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Financial Connections\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"High Tech Connections\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Labor Connections\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Media\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Military Connections\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Negotiation\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Political Connections\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Social\">\n        <rank>1</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>45255</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Trade Connections\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Spaceship Command\" skillsCount=\"69\" totalSP=\"482526\">\n      <skill typeName=\"Advanced Spaceship Command\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Battleship\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Carrier\">\n        <rank>14</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3584000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Cruiser\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Dreadnought\">\n        <rank>12</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3072000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Freighter\">\n        <rank>10</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2560000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Frigate\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Industrial\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Strategic Cruiser\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Titan\">\n        <rank>16</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>4096000</maxSP>\n      </skill>\n      <skill typeName=\"Assault Ships\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Battlecruisers\">\n        <rank>6</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>48000</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Black Ops\">\n        <rank>10</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2560000</maxSP>\n      </skill>\n      <skill typeName=\"Bombers\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Battleship\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Carrier\">\n        <rank>14</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3584000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Cruiser\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Dreadnought\">\n        <rank>12</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3072000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Freighter\">\n        <rank>10</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2560000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Frigate\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Industrial\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Strategic Cruiser\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Titan\">\n        <rank>16</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>4096000</maxSP>\n      </skill>\n      <skill typeName=\"Capital Industrial Ships\">\n        <rank>12</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3072000</maxSP>\n      </skill>\n      <skill typeName=\"Capital Ships\">\n        <rank>14</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3584000</maxSP>\n      </skill>\n      <skill typeName=\"Carriers\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Command Ships\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Concord\">\n        <rank>12</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3072000</maxSP>\n      </skill>\n      <skill typeName=\"Covert Ops\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Destroyers\">\n        <rank>2</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>2829</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Electronic Attack Ships\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Exhumers\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Flagships\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Battleship\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Carrier\">\n        <rank>14</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3584000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Cruiser\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Dreadnought\">\n        <rank>12</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3072000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Freighter\">\n        <rank>10</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2560000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Frigate\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Industrial\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Strategic Cruiser\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Titan\">\n        <rank>16</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>4096000</maxSP>\n      </skill>\n      <skill typeName=\"Heavy Assault Ships\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Heavy Interdictors\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Industrial Command Ships\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Interceptors\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Interdictors\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Jove Battleship\">\n        <rank>8</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Jove Cruiser\">\n        <rank>12</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3072000</maxSP>\n      </skill>\n      <skill typeName=\"Jove Frigate\">\n        <rank>12</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3072000</maxSP>\n      </skill>\n      <skill typeName=\"Jove Industrial\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Jump Freighters\">\n        <rank>14</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3584000</maxSP>\n      </skill>\n      <skill typeName=\"Logistics\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Marauders\">\n        <rank>10</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2560000</maxSP>\n      </skill>\n      <skill typeName=\"Mining Barge\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Battleship\">\n        <rank>8</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>64000</SP>\n        <maxSP>2048000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Carrier\">\n        <rank>14</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3584000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Cruiser\">\n        <rank>5</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>226275</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Dreadnought\">\n        <rank>12</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>3072000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Freighter\">\n        <rank>10</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>2560000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Frigate\">\n        <rank>2</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>90510</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Industrial\">\n        <rank>4</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>5657</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Strategic Cruiser\">\n        <rank>5</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1280000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Titan\">\n        <rank>16</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>4096000</maxSP>\n      </skill>\n      <skill typeName=\"Omnipotent\">\n        <rank>42</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>10752000</maxSP>\n      </skill>\n      <skill typeName=\"Polaris\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Recon Ships\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Spaceship Command\">\n        <rank>1</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>45255</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Transport Ships\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Subsystems\" skillsCount=\"20\" totalSP=\"0\">\n      <skill typeName=\"Amarr Defensive Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Electronic Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Engineering Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Offensive Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Amarr Propulsion Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Defensive Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Electronic Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Engineering Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Offensive Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Caldari Propulsion Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Defensive Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Electronic Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Engineering Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Offensive Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Gallente Propulsion Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Defensive Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Electronic Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Engineering Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Offensive Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Minmatar Propulsion Systems\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n    </skillGroup>\n    <skillGroup groupName=\"Trade\" skillsCount=\"26\" totalSP=\"87906\">\n      <skill typeName=\"Accounting\">\n        <rank>3</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>24000</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Black Market Trading\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Broker Relations\">\n        <rank>2</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>2829</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Consumable Freight\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Contracting\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Corporation Contracting\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Daytrading\">\n        <rank>1</rank>\n        <level>3</level>\n        <romanLevel>III</romanLevel>\n        <SP>8000</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Drone Freight\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"General Freight\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Hazardous Material Freight\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Margin Trading\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Marketing\">\n        <rank>3</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>4243</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Mineral Freight\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Munitions Freight\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Procurement\">\n        <rank>3</rank>\n        <level>1</level>\n        <romanLevel>I</romanLevel>\n        <SP>750</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Raw Material Freight\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Retail\">\n        <rank>2</rank>\n        <level>2</level>\n        <romanLevel>II</romanLevel>\n        <SP>2829</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Smuggling\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"Starship Freight\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n      <skill typeName=\"TEST TRADE SKILL\">\n        <rank>1</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Tax Evasion\">\n        <rank>2</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>512000</maxSP>\n      </skill>\n      <skill typeName=\"Test\">\n        <rank>0</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>0</maxSP>\n      </skill>\n      <skill typeName=\"Trade\">\n        <rank>1</rank>\n        <level>4</level>\n        <romanLevel>IV</romanLevel>\n        <SP>45255</SP>\n        <maxSP>256000</maxSP>\n      </skill>\n      <skill typeName=\"Tycoon\">\n        <rank>6</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1536000</maxSP>\n      </skill>\n      <skill typeName=\"Visibility\">\n        <rank>3</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>768000</maxSP>\n      </skill>\n      <skill typeName=\"Wholesale\">\n        <rank>4</rank>\n        <level>0</level>\n        <romanLevel>(none)</romanLevel>\n        <SP>0</SP>\n        <maxSP>1024000</maxSP>\n      </skill>\n    </skillGroup>\n  </skills>\n  <certificates>\n    <certificate name=\"Research Manager\" grade=\"Basic\" />\n    <certificate name=\"Field Technician\" grade=\"Basic\" />\n    <certificate name=\"Business Mogul\" grade=\"Basic\" />\n    <certificate name=\"Core Fitting\" grade=\"Standard\" />\n    <certificate name=\"Core Capacitor\" grade=\"Elite\" />\n    <certificate name=\"Core Targeting\" grade=\"Basic\" />\n    <certificate name=\"Core Navigation\" grade=\"Standard\" />\n    <certificate name=\"Core Competency\" grade=\"Basic\" />\n    <certificate name=\"Core Integrity\" grade=\"Standard\" />\n    <certificate name=\"Armor Tanking\" grade=\"Basic\" />\n    <certificate name=\"Armor Reinforcement\" grade=\"Basic\" />\n    <certificate name=\"Active Shield Tanking\" grade=\"Standard\" />\n    <certificate name=\"Passive Shield Tanking\" grade=\"Improved\" />\n    <certificate name=\"Shield Reinforcement\" grade=\"Standard\" />\n    <certificate name=\"Drone Control\" grade=\"Basic\" />\n    <certificate name=\"Combat Drone Control\" grade=\"Standard\" />\n    <certificate name=\"Heavy Drone Control\" grade=\"Basic\" />\n    <certificate name=\"EWAR Operator\" grade=\"Basic\" />\n    <certificate name=\"Cloak Operator\" grade=\"Basic\" />\n    <certificate name=\"Target Painter Operator\" grade=\"Basic\" />\n    <certificate name=\"ECM Operator\" grade=\"Basic\" />\n    <certificate name=\"Sensor Dampener Operator\" grade=\"Basic\" />\n    <certificate name=\"Tracking Disruptor Operator\" grade=\"Basic\" />\n    <certificate name=\"Propulsion Jammer Operator\" grade=\"Basic\" />\n    <certificate name=\"Turret Control\" grade=\"Standard\" />\n    <certificate name=\"Frigate Projectile Turrets\" grade=\"Basic\" />\n    <certificate name=\"Cruiser Projectile Turrets\" grade=\"Basic\" />\n    <certificate name=\"Battleship Projectile Turrets\" grade=\"Basic\" />\n    <certificate name=\"Refinery Foreman\" grade=\"Basic\" />\n    <certificate name=\"Missile Control\" grade=\"Standard\" />\n    <certificate name=\"Frigate Launcher Control\" grade=\"Basic\" />\n    <certificate name=\"High-Velocity Helmsman\" grade=\"Standard\" />\n    <certificate name=\"Minmatar Military - Soldier\" grade=\"Standard\" />\n  </certificates>\n</character>"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Samples/OldPlan.xml",
    "content": "<?xml version=\"1.0\"?>\n<plan xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n  <Entries>\n    <entry>\n      <SkillName>Standard Missiles</SkillName>\n      <Level>4</Level>\n\t  <PlanGroups>\n\t\t<anyType xsi:type=\"xsd:string\">zzz</anyType>\n\t\t<anyType xsi:type=\"xsd:string\">yyy</anyType>\n\t  </PlanGroups>\n      <EntryType>Planned</EntryType>\n      <Notes>Standard Missiles</Notes>\n      <Priority>3</Priority>\n      <Remapping>\n\t\t<Status>UpToDate</Status>\n\t\t<BaseAttributes>\n\t\t\t<int>15</int>\n\t\t\t<int>6</int>\n\t\t\t<int>8</int>\n\t\t\t<int>5</int>\n\t\t\t<int>5</int>\n\t\t</BaseAttributes>\n\t\t<AttributesDescription>\nPerception (0) = 30,80 = (15 + 9 + 4) * 1,10 ; old was 15 / 30,8\nMemory (-3) = 22,00 = (6 + 9 + 5) * 1,10 ; old was 9 / 25,3\nWillpower (+3) = 23,10 = (8 + 9 + 4) * 1,10 ; old was 5 / 19,8\nIntelligence (0) = 20,90 = (5 + 9 + 5) * 1,10 ; old was 5 / 20,9\nCharisma (0) = 17,60 = (5 + 7 + 4) * 1,10 ; old was 5 / 17,6</AttributesDescription>\n\t  </Remapping>\t  \n    </entry>\n    <entry>\n      <SkillName>Surgical Strike</SkillName>\n      <Level>4</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Surgical Strike</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Missile Projection</SkillName>\n      <Level>4</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Missile Projection</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Guided Missile Precision</SkillName>\n      <Level>4</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Guided Missile Precision</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Trajectory Analysis</SkillName>\n      <Level>4</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Trajectory Analysis</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Warhead Upgrades</SkillName>\n      <Level>4</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Warhead Upgrades</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Cruise Missiles</SkillName>\n      <Level>4</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Cruise Missiles</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Large Projectile Turret</SkillName>\n      <Level>4</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Large Projectile Turret</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Gallente Drone Specialization</SkillName>\n      <Level>4</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Gallente Drone Specialization</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Heavy Drone Operation</SkillName>\n      <Level>4</Level>\n      <PlanGroups />\n      <EntryType>Prerequisite</EntryType>\n      <Notes>Heavy Drone Operation</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Scout Drone Operation</SkillName>\n      <Level>5</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Scout Drone Operation</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Battlecruisers</SkillName>\n      <Level>4</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Battlecruisers</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Minmatar Battleship</SkillName>\n      <Level>4</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Minmatar Battleship</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Rapid Firing</SkillName>\n      <Level>5</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Rapid Firing</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Sharpshooter</SkillName>\n      <Level>5</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Sharpshooter</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Missile Bombardment</SkillName>\n      <Level>5</Level>\n      <PlanGroups />\n      <EntryType>Prerequisite</EntryType>\n      <Notes>Bomb Deployment</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Bomb Deployment</SkillName>\n      <Level>1</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Bomb Deployment</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Target Navigation Prediction</SkillName>\n      <Level>5</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Target Navigation Prediction</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Rapid Launch</SkillName>\n      <Level>5</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Rapid Launch</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Motion Prediction</SkillName>\n      <Level>5</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Motion Prediction</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Surgical Strike</SkillName>\n      <Level>5</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Surgical Strike</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Trajectory Analysis</SkillName>\n      <Level>5</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Trajectory Analysis</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Warhead Upgrades</SkillName>\n      <Level>5</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Warhead Upgrades</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Drone Interfacing</SkillName>\n      <Level>5</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Drone Interfacing</Notes>\n      <Priority>3</Priority>\n    </entry>\n    <entry>\n      <SkillName>Heavy Drone Operation</SkillName>\n      <Level>5</Level>\n      <PlanGroups />\n      <EntryType>Planned</EntryType>\n      <Notes>Heavy Drone Operation</Notes>\n      <Priority>3</Priority>\n    </entry>\n  </Entries>\n  <ColumnPreference column_order=\"SkillName,TrainingTime,SkillRank,PrimaryAttribute,SecondaryAttribute,SkillGroup,SPPerHour,Priority,SPTotal\" SkillName=\"true\" PlanGroup=\"false\" TrainingTime=\"true\" TrainingTimeNatural=\"false\" EarliestStart=\"false\" EarliestEnd=\"false\" Conflicts=\"false\" PercentComplete=\"false\" SkillRank=\"true\" PrimaryAttribute=\"true\" SecondaryAttribute=\"true\" SkillGroup=\"true\" Notes=\"false\" PlanType=\"false\" SPTotal=\"true\" SPPerHour=\"true\" Priority=\"true\" Owned=\"false\" />\n  <LastSortKey>Training Time</LastSortKey>\n  <LastSortWasReversed>false</LastSortWasReversed>\n  <SortWithLearningSkillsOnTop>false</SortWithLearningSkillsOnTop>\n  <SortWithPrioritiesGrouping>true</SortWithPrioritiesGrouping>\n</plan>"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Samples/OldSettings.xml",
    "content": "<?xml version=\"1.0\"?>\n<logindata2 xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n  <VersionNumber>1.2.8.1379</VersionNumber>\n  <Accounts>\n    <AccountDetails>\n      <UserId>3156565</UserId>\n      <ApiKey>CC27D0AF7490444886CB7172E0C564F991F352A27C754186835EBD74054828B6</ApiKey>\n      <CachedUntil>2009-07-15T21:58:38.671875Z</CachedUntil>\n      <StoredCharacterList>\n        <PairOfStringInt32>\n          <A>Testestestestest</A>\n          <B>194920538</B>\n        </PairOfStringInt32>\n        <PairOfStringInt32>\n          <A>Crazy Pulsar</A>\n          <B>1077267502</B>\n        </PairOfStringInt32>\n      </StoredCharacterList>\n    </AccountDetails>\n  </Accounts>\n  <CharacterList>\n    <CharLoginInfo>\n      <IneveSync>false</IneveSync>\n      <CharacterName>Crazy Pulsar</CharacterName>\n    </CharLoginInfo>\n  </CharacterList>\n  <CharFileList />\n  <CachedCharacterInfo>\n    <SerializableCharacterSheet>\n      <currentTime>2009-07-15 21:22:01</currentTime>\n      <result>\n        <characterID>1077267502</characterID>\n        <name>Crazy Pulsar</name>\n        <race>Minmatar</race>\n        <bloodLine>Vherokior</bloodLine>\n        <gender>Male</gender>\n        <corporationName>Republic University</corporationName>\n        <corporationID />\n        <cloneName>Clone Grade Alpha</cloneName>\n        <cloneSkillPoints>900000</cloneSkillPoints>\n        <balance>48367.40</balance>\n        <attributeEnhancers />\n        <attributes>\n          <intelligence>12</intelligence>\n          <charisma>8</charisma>\n          <perception>6</perception>\n          <memory>10</memory>\n          <willpower>3</willpower>\n        </attributes>\n        <rowset name=\"skills\">\n          <row typeID=\"12365\" skillpoints=\"2829\" level=\"2\" lastconfirmedlevel=\"2\" />\n          <row typeID=\"3413\" skillpoints=\"256000\" level=\"5\" lastconfirmedlevel=\"5\" />\n          <row typeID=\"12366\" skillpoints=\"16524\" level=\"3\" lastconfirmedlevel=\"3\" />\n          <row typeID=\"21059\" skillpoints=\"16000\" level=\"3\" lastconfirmedlevel=\"3\" />\n          <row typeID=\"3416\" skillpoints=\"45255\" level=\"4\" lastconfirmedlevel=\"4\" />\n          <row typeID=\"3425\" skillpoints=\"16000\" level=\"3\" lastconfirmedlevel=\"3\" />\n          <row typeID=\"11566\" skillpoints=\"2829\" level=\"2\" lastconfirmedlevel=\"2\" />\n          <row typeID=\"3300\" skillpoints=\"250\" level=\"1\" lastconfirmedlevel=\"1\" />\n          <row typeID=\"3310\" skillpoints=\"16000\" level=\"3\" lastconfirmedlevel=\"3\" />\n          <row typeID=\"3302\" skillpoints=\"250\" level=\"1\" lastconfirmedlevel=\"1\" />\n          <row typeID=\"3380\" skillpoints=\"256000\" level=\"5\" lastconfirmedlevel=\"5\" />\n          <row typeID=\"3387\" skillpoints=\"16000\" level=\"3\" lastconfirmedlevel=\"3\" />\n          <row typeID=\"3386\" skillpoints=\"1415\" level=\"2\" lastconfirmedlevel=\"2\" />\n          <row typeID=\"3385\" skillpoints=\"1415\" level=\"2\" lastconfirmedlevel=\"2\" />\n          <row typeID=\"12195\" skillpoints=\"250\" level=\"1\" lastconfirmedlevel=\"1\" />\n          <row typeID=\"3377\" skillpoints=\"45255\" level=\"4\" lastconfirmedlevel=\"4\" />\n          <row typeID=\"3378\" skillpoints=\"1415\" level=\"2\" lastconfirmedlevel=\"2\" />\n          <row typeID=\"3374\" skillpoints=\"250\" level=\"1\" lastconfirmedlevel=\"1\" />\n          <row typeID=\"3392\" skillpoints=\"8000\" level=\"3\" lastconfirmedlevel=\"3\" />\n          <row typeID=\"3319\" skillpoints=\"1415\" level=\"2\" lastconfirmedlevel=\"2\" />\n          <row typeID=\"3320\" skillpoints=\"250\" level=\"1\" lastconfirmedlevel=\"1\" />\n          <row typeID=\"3321\" skillpoints=\"500\" level=\"1\" lastconfirmedlevel=\"1\" />\n          <row typeID=\"3406\" skillpoints=\"8000\" level=\"3\" lastconfirmedlevel=\"3\" />\n          <row typeID=\"3403\" skillpoints=\"45255\" level=\"4\" lastconfirmedlevel=\"4\" />\n          <row typeID=\"3402\" skillpoints=\"45255\" level=\"4\" lastconfirmedlevel=\"4\" />\n          <row typeID=\"3329\" skillpoints=\"500\" level=\"1\" lastconfirmedlevel=\"1\" />\n          <row typeID=\"3327\" skillpoints=\"250\" level=\"1\" lastconfirmedlevel=\"1\" />\n          <row typeID=\"3443\" skillpoints=\"1415\" level=\"2\" lastconfirmedlevel=\"2\" />\n        </rowset>\n        <certificatesID />\n      </result>\n      <cachedUntil>2009-07-15 22:21:48</cachedUntil>\n      <XMLExpires>2009-07-15T22:21:48Z</XMLExpires>\n      <skillTraining>\n        <error code=\"0\" />\n        <currentTime>2009-07-15 17:51:53</currentTime>\n        <result>\n          <currentTQTime>0001-01-01 00:00:00</currentTQTime>\n          <trainingEndTime>0001-01-01 00:00:00</trainingEndTime>\n          <trainingStartTime>0001-01-01 00:00:00</trainingStartTime>\n          <trainingTypeID>0</trainingTypeID>\n          <trainingStartSP>0</trainingStartSP>\n          <trainingDestinationSP>0</trainingDestinationSP>\n          <trainingToLevel>0</trainingToLevel>\n          <skillInTraining>0</skillInTraining>\n        </result>\n        <cachedUntil>2009-07-15 18:51:53</cachedUntil>\n        <PreWarningGive>false</PreWarningGive>\n        <AlertRaisedAlready>false</AlertRaisedAlready>\n      </skillTraining>\n      <ImplantSets />\n    </SerializableCharacterSheet>\n  </CachedCharacterInfo>\n  <OldSAPIkillsDict>\n    <dictionary />\n  </OldSAPIkillsDict>\n  <OwnedBooks>\n    <PairOfStringString>\n      <A>Bom Bommer</A>\n      <B>Biology</B>\n    </PairOfStringString>\n  </OwnedBooks>\n  <SystemTrayOptions>Minimized</SystemTrayOptions>\n  <CloseToTray>true</CloseToTray>\n  <RelocateEveWindow>false</RelocateEveWindow>\n  <RelocateTargetScreen>0</RelocateTargetScreen>\n  <UseLogitechG15Display>false</UseLogitechG15Display>\n  <G15ACycle>false</G15ACycle>\n  <G15ACycleint>20</G15ACycleint>\n  <G15ShowTime>false</G15ShowTime>\n  <G15ACycleTimes>false</G15ACycleTimes>\n  <G15ACycleTimesint>10</G15ACycleTimesint>\n  <ShowAllPublicSkills>false</ShowAllPublicSkills>\n  <ShowNonPublicSkills>false</ShowNonPublicSkills>\n  <HideOverviewTab>false</HideOverviewTab>\n  <Compatibility>Default</Compatibility>\n  <WorksafeMode>false</WorksafeMode>\n  <ShowCharacterInfoInWindowTitle>true</ShowCharacterInfoInWindowTitle>\n  <TitleToTimeLayout>1</TitleToTimeLayout>\n  <TitleToTimeSkill>false</TitleToTimeSkill>\n  <TrayPopupStyle>PopupForm</TrayPopupStyle>\n  <TrayPopupConfig>\n    <HideCharNotTraining>true</HideCharNotTraining>\n    <GroupBy>None</GroupBy>\n    <SortOrder1>EarliestAtBottom</SortOrder1>\n    <SortOrder2>EarliestAtBottom</SortOrder2>\n    <ShowSkill>true</ShowSkill>\n    <ShowTimeToCompletion>true</ShowTimeToCompletion>\n    <ShowCompletionTime>false</ShowCompletionTime>\n    <HighlightConflicts>true</HighlightConflicts>\n    <ShowWallet>false</ShowWallet>\n    <ShowPortrait>true</ShowPortrait>\n    <PortraitSize>x48</PortraitSize>\n    <ShowWarning>true</ShowWarning>\n    <ShowTQStatus>true</ShowTQStatus>\n    <ShowEveTime>true</ShowEveTime>\n  </TrayPopupConfig>\n  <TooltipString>%n - %s %tr - %r</TooltipString>\n  <SkillPlannerHighlightPlannedSkills>false</SkillPlannerHighlightPlannedSkills>\n  <SkillPlannerHighlightPrerequisites>false</SkillPlannerHighlightPrerequisites>\n  <SkillPlannerDimUntrainable>true</SkillPlannerDimUntrainable>\n  <SkillPlannerHighlightConflicts>false</SkillPlannerHighlightConflicts>\n  <SkillPlannerHighlightPartialSkills>true</SkillPlannerHighlightPartialSkills>\n  <SkillIconGroup>1</SkillIconGroup>\n  <UseCustomProxySettings>false</UseCustomProxySettings>\n  <HttpProxy>\n    <Host />\n    <Port>0</Port>\n    <AuthType>None</AuthType>\n    <Username />\n    <Password />\n  </HttpProxy>\n  <DisableRequestsOnAuthenticationFailure>false</DisableRequestsOnAuthenticationFailure>\n  <IGBServerPublic>false</IGBServerPublic>\n  <IGBServerPort>80</IGBServerPort>\n  <RunIGBServer>false</RunIGBServer>\n  <UseEveProxy>false</UseEveProxy>\n  <EveProxyURL>http://api.eve-online.com</EveProxyURL>\n  <EnableBalloonTips>true</EnableBalloonTips>\n  <PlaySoundOnSkillComplete>false</PlaySoundOnSkillComplete>\n  <NotificationOffset>0</NotificationOffset>\n  <EnableEmailAlert>false</EnableEmailAlert>\n  <EmailServer />\n  <EmailServerRequiresSsl>false</EmailServerRequiresSsl>\n  <EmailAuthRequired>false</EmailAuthRequired>\n  <EmailAuthUsername />\n  <EmailAuthPassword />\n  <EmailFromAddress />\n  <EmailToAddress />\n  <PortNumber>0</PortNumber>\n  <EmailUseShortFormat>false</EmailUseShortFormat>\n  <DisableEVEMonVersionCheck>false</DisableEVEMonVersionCheck>\n  <CheckTimeOnStartup>true</CheckTimeOnStartup>\n  <DisableXMLAutoUpdate>false</DisableXMLAutoUpdate>\n  <KeepCharacterPlans>false</KeepCharacterPlans>\n  <APIUpdateDelay>600</APIUpdateDelay>\n  <EnableSkillCompleteDialog>false</EnableSkillCompleteDialog>\n  <CustomTQAddress>87.237.38.200</CustomTQAddress>\n  <CustomTQPort>26000</CustomTQPort>\n  <UseCustomTQCheckSettings>false</UseCustomTQCheckSettings>\n  <CheckTranquilityStatus>true</CheckTranquilityStatus>\n  <ShowTQBalloon>false</ShowTQBalloon>\n  <StatusUpdateInterval>5</StatusUpdateInterval>\n  <ConnectivityURL>http://www.google.com</ConnectivityURL>\n  <CalendarTextColor>NamedColor:White</CalendarTextColor>\n  <CalendarBlockingColor>NamedColor:Red</CalendarBlockingColor>\n  <CalendarSingle1>NamedColor:Blue</CalendarSingle1>\n  <CalendarCalendarSingle2>NamedColor:LightBlue</CalendarCalendarSingle2>\n  <CalendarRecurring1>NamedColor:Green</CalendarRecurring1>\n  <CalendarRecurring2>NamedColor:LightGreen</CalendarRecurring2>\n  <UseExternalCalendar>false</UseExternalCalendar>\n  <CalendarOption>0</CalendarOption>\n  <GoogleEmail />\n  <GooglePassword />\n  <GoogleURI>http://www.google.com/calendar/feeds/default/private/full</GoogleURI>\n  <GoogleReminder>2</GoogleReminder>\n  <SetReminder>true</SetReminder>\n  <ReminderMinutes>10</ReminderMinutes>\n  <UseAlternateReminder>true</UseAlternateReminder>\n  <EarlyReminder>2008-12-18T08:00:00</EarlyReminder>\n  <LateReminder>2008-12-18T20:00:00</LateReminder>\n  <ColumnPreferences column_order=\"\" SkillName=\"true\" PlanGroup=\"false\" TrainingTime=\"true\" TrainingTimeNatural=\"false\" EarliestStart=\"false\" EarliestEnd=\"false\" Conflicts=\"false\" PercentComplete=\"false\" SkillRank=\"false\" PrimaryAttribute=\"true\" SecondaryAttribute=\"true\" SkillGroup=\"true\" Notes=\"false\" PlanType=\"false\" SPTotal=\"false\" SPPerHour=\"false\" Priority=\"true\" Owned=\"false\" />\n  <Plans>\n    <PairOfStringPlan>\n      <A>Crazy Pulsar::abc</A>\n      <B>\n        <Entries>\n          <entry>\n            <SkillName>Drones</SkillName>\n            <Level>1</Level>\n            <PlanGroups>\n              <anyType xsi:type=\"xsd:string\">zzz</anyType>\n              <anyType xsi:type=\"xsd:string\">yyy</anyType>\n            </PlanGroups>\n            <EntryType>Prerequisite</EntryType>\n            <Notes>Scout Drone Operation, Drones, Drone Interfacing, Heavy Drone Operation</Notes>\n            <Priority>3</Priority>\n\t\t\t<Remapping>\n              <Status>UpToDate</Status>\n              <BaseAttributes>\n                <int>15</int>\n                <int>6</int>\n                <int>8</int>\n                <int>5</int>\n                <int>5</int>\n              </BaseAttributes>\n              <AttributesDescription>\nPerception (0) = 30,80 = (15 + 9 + 4) * 1,10 ; old was 15 / 30,8\nMemory (-3) = 22,00 = (6 + 9 + 5) * 1,10 ; old was 9 / 25,3\nWillpower (+3) = 23,10 = (8 + 9 + 4) * 1,10 ; old was 5 / 19,8\nIntelligence (0) = 20,90 = (5 + 9 + 5) * 1,10 ; old was 5 / 20,9\nCharisma (0) = 17,60 = (5 + 7 + 4) * 1,10 ; old was 5 / 17,6</AttributesDescription>\n            </Remapping>\n          </entry>\n          <entry>\n            <SkillName>Scout Drone Operation</SkillName>\n            <Level>1</Level>\n            <PlanGroups />\n            <EntryType>Prerequisite</EntryType>\n            <Notes>Scout Drone Operation</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Scout Drone Operation</SkillName>\n            <Level>2</Level>\n            <PlanGroups />\n            <EntryType>Planned</EntryType>\n            <Notes>Scout Drone Operation</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Drones</SkillName>\n            <Level>2</Level>\n            <PlanGroups />\n            <EntryType>Prerequisite</EntryType>\n            <Notes>Drones, Drone Interfacing, Heavy Drone Operation</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Drones</SkillName>\n            <Level>3</Level>\n            <PlanGroups />\n            <EntryType>Planned</EntryType>\n            <Notes>Drones, Drone Interfacing, Heavy Drone Operation</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Scout Drone Operation</SkillName>\n            <Level>3</Level>\n            <PlanGroups />\n            <EntryType>Prerequisite</EntryType>\n            <Notes>Scout Drone Operation</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Scout Drone Operation</SkillName>\n            <Level>4</Level>\n            <PlanGroups />\n            <EntryType>Planned</EntryType>\n            <Notes>Scout Drone Operation</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Drones</SkillName>\n            <Level>4</Level>\n            <PlanGroups />\n            <EntryType>Planned</EntryType>\n            <Notes>Drones, Drone Interfacing, Heavy Drone Operation</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Drones</SkillName>\n            <Level>5</Level>\n            <PlanGroups />\n            <EntryType>Prerequisite</EntryType>\n            <Notes>Drone Interfacing, Heavy Drone Operation</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Drone Interfacing</SkillName>\n            <Level>1</Level>\n            <PlanGroups />\n            <EntryType>Prerequisite</EntryType>\n            <Notes>Drone Interfacing</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Drone Interfacing</SkillName>\n            <Level>2</Level>\n            <PlanGroups />\n            <EntryType>Prerequisite</EntryType>\n            <Notes>Drone Interfacing</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Drone Interfacing</SkillName>\n            <Level>3</Level>\n            <PlanGroups />\n            <EntryType>Prerequisite</EntryType>\n            <Notes>Drone Interfacing</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Drone Interfacing</SkillName>\n            <Level>4</Level>\n            <PlanGroups />\n            <EntryType>Planned</EntryType>\n            <Notes>Drone Interfacing</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Heavy Drone Operation</SkillName>\n            <Level>1</Level>\n            <PlanGroups />\n            <EntryType>Prerequisite</EntryType>\n            <Notes>Heavy Drone Operation</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Heavy Drone Operation</SkillName>\n            <Level>2</Level>\n            <PlanGroups />\n            <EntryType>Prerequisite</EntryType>\n            <Notes>Heavy Drone Operation</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Heavy Drone Operation</SkillName>\n            <Level>3</Level>\n            <PlanGroups />\n            <EntryType>Prerequisite</EntryType>\n            <Notes>Heavy Drone Operation</Notes>\n            <Priority>3</Priority>\n          </entry>\n          <entry>\n            <SkillName>Heavy Drone Operation</SkillName>\n            <Level>4</Level>\n            <PlanGroups />\n            <EntryType>Planned</EntryType>\n            <Notes>Heavy Drone Operation</Notes>\n            <Priority>3</Priority>\n          </entry>\n        </Entries>\n        <ColumnPreference column_order=\"\" SkillName=\"true\" PlanGroup=\"false\" TrainingTime=\"true\" TrainingTimeNatural=\"false\" EarliestStart=\"false\" EarliestEnd=\"false\" Conflicts=\"false\" PercentComplete=\"false\" SkillRank=\"false\" PrimaryAttribute=\"true\" SecondaryAttribute=\"true\" SkillGroup=\"true\" Notes=\"false\" PlanType=\"false\" SPTotal=\"false\" SPPerHour=\"false\" Priority=\"true\" Owned=\"false\" />\n        <LastSortKey>Training Time</LastSortKey>\n        <LastSortWasReversed>false</LastSortWasReversed>\n        <SortWithLearningSkillsOnTop>false</SortWithLearningSkillsOnTop>\n        <SortWithPrioritiesGrouping>false</SortWithPrioritiesGrouping>\n      </B>\n    </PairOfStringPlan>\n  </Plans>\n  <DefaultCopyOptions IncludeHeader=\"true\" EntryNumber=\"true\" EntryTrainingTimes=\"true\" EntryStartDate=\"false\" EntryFinishDate=\"false\" FooterCount=\"false\" FooterTotalTime=\"false\" FooterDate=\"false\" FooterCost=\"false\">\n    <EntryCost>false</EntryCost>\n    <Markup>Undefined</Markup>\n    <ShoppingList>false</ShoppingList>\n  </DefaultCopyOptions>\n  <DefaultSaveOptions IncludeHeader=\"true\" EntryNumber=\"true\" EntryTrainingTimes=\"true\" EntryStartDate=\"false\" EntryFinishDate=\"false\" FooterCount=\"false\" FooterTotalTime=\"false\" FooterDate=\"false\" FooterCost=\"false\">\n    <EntryCost>false</EntryCost>\n    <Markup>Undefined</Markup>\n    <ShoppingList>false</ShoppingList>\n  </DefaultSaveOptions>\n  <SkillPieChartColors>\n    <SerializableColor A=\"125\" R=\"255\" G=\"0\" B=\"0\" />\n    <SerializableColor A=\"125\" R=\"0\" G=\"128\" B=\"0\" />\n    <SerializableColor A=\"125\" R=\"0\" G=\"0\" B=\"255\" />\n    <SerializableColor A=\"125\" R=\"255\" G=\"0\" B=\"0\" />\n    <SerializableColor A=\"125\" R=\"192\" G=\"192\" B=\"192\" />\n    <SerializableColor A=\"125\" R=\"0\" G=\"0\" B=\"255\" />\n    <SerializableColor A=\"125\" R=\"255\" G=\"0\" B=\"0\" />\n    <SerializableColor A=\"125\" R=\"0\" G=\"128\" B=\"0\" />\n    <SerializableColor A=\"125\" R=\"0\" G=\"0\" B=\"255\" />\n    <SerializableColor A=\"125\" R=\"255\" G=\"0\" B=\"0\" />\n    <SerializableColor A=\"125\" R=\"0\" G=\"128\" B=\"0\" />\n    <SerializableColor A=\"125\" R=\"0\" G=\"0\" B=\"255\" />\n    <SerializableColor A=\"125\" R=\"255\" G=\"0\" B=\"0\" />\n    <SerializableColor A=\"125\" R=\"0\" G=\"128\" B=\"0\" />\n    <SerializableColor A=\"125\" R=\"0\" G=\"0\" B=\"255\" />\n    <SerializableColor A=\"125\" R=\"255\" G=\"0\" B=\"0\" />\n    <SerializableColor A=\"125\" R=\"0\" G=\"128\" B=\"0\" />\n    <SerializableColor A=\"125\" R=\"0\" G=\"0\" B=\"255\" />\n  </SkillPieChartColors>\n  <SkillPieChartInitialAngle>0</SkillPieChartInitialAngle>\n  <SkillPieChartSliceRelativeHeight>0</SkillPieChartSliceRelativeHeight>\n  <SkillPieChartSortBySize>true</SkillPieChartSortBySize>\n  <SkillPieChartMergeMinorGroups>true</SkillPieChartMergeMinorGroups>\n  <IgnoreUpdateVersion>0.0.0.0</IgnoreUpdateVersion>\n  <Schedule>\n    <simple>\n      <ScheduleEntryOptions>None</ScheduleEntryOptions>\n      <Title>aaa</Title>\n      <StartDateTime>2009-06-06T00:00:00</StartDateTime>\n      <EndDateTime>2009-06-06T23:59:00</EndDateTime>\n    </simple>\n    <simple>\n      <ScheduleEntryOptions>None</ScheduleEntryOptions>\n      <Title>bc</Title>\n      <StartDateTime>2009-06-07T00:00:00</StartDateTime>\n      <EndDateTime>2009-07-10T23:59:00</EndDateTime>\n    </simple>\n  </Schedule>\n  <DatafileChecksums>\n    <PairOfStringString>\n      <A>eve-implants2.xml.gz</A>\n      <B>fd37870f4c5cfa519d2d27fc4f28f8c6</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>eve-items2.xml.gz</A>\n      <B>120f10d29a0b4121da66c1ab2ab7bdd0</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>eve-ships2.xml.gz</A>\n      <B>a369bcccb83ac4fadb429c1e853e40e1</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>eve-skills2.xml.gz</A>\n      <B>c6ff7b8c1f696f64ae73a95f4b33837f</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>eve-certificates.xml.gz</A>\n      <B>698bbe48e2718f4fcd75e903bd7dab48</B>\n    </PairOfStringString>\n  </DatafileChecksums>\n  <ShowT1Items>true</ShowT1Items>\n  <ShowT2Items>true</ShowT2Items>\n  <ShowT3Items>true</ShowT3Items>\n  <ShowNamedItems>true</ShowNamedItems>\n  <ShowOfficerItems>true</ShowOfficerItems>\n  <ShowFactionItems>true</ShowFactionItems>\n  <ShowDeadspaceItems>true</ShowDeadspaceItems>\n  <ShowAmarrShips>true</ShowAmarrShips>\n  <ShowCaldariShips>true</ShowCaldariShips>\n  <ShowGallenteShips>true</ShowGallenteShips>\n  <ShowMinmatarShips>true</ShowMinmatarShips>\n  <ShowFactionShips>true</ShowFactionShips>\n  <ShowOreShips>true</ShowOreShips>\n  <ItemSkillFilter>0</ItemSkillFilter>\n  <ItemSlotFilter>0</ItemSlotFilter>\n  <ItemBrowserSearch />\n  <PlannerTab>1</PlannerTab>\n  <SkillBrowserFilter>0</SkillBrowserFilter>\n  <StoreBrowserFilters>false</StoreBrowserFilters>\n  <SkillBrowserSort>0</SkillBrowserSort>\n  <CertificateBrowserFilter>0</CertificateBrowserFilter>\n  <CertificateBrowserSort>0</CertificateBrowserSort>\n  <SkillBrowserSearch />\n  <ShowPrivateSkills>false</ShowPrivateSkills>\n  <ShipBrowserFilter>0</ShipBrowserFilter>\n  <ShipBrowserSearch />\n  <MainWindowMenuBarVisible>true</MainWindowMenuBarVisible>\n  <MainWindowToolBarVisible>false</MainWindowToolBarVisible>\n  <TabOrderName>\n    <string>Bom Bommer</string>\n    <string>Crazy Pulsar</string>\n  </TabOrderName>\n  <CollapsedGroups>\n    <PairOfStringString>\n      <A>Bom Bommer</A>\n      <B>Navigation</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>Bom Bommer</A>\n      <B>Electronics</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>Bom Bommer</A>\n      <B>Trade</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>Bom Bommer</A>\n      <B>Spaceship Command</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>Bom Bommer</A>\n      <B>Engineering</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>Bom Bommer</A>\n      <B>Industry</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>Bom Bommer</A>\n      <B>Learning</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>Bom Bommer</A>\n      <B>Mechanic</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>Bom Bommer</A>\n      <B>Social</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>Bom Bommer</A>\n      <B>Missile Launcher Operation</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>Bom Bommer</A>\n      <B>Science</B>\n    </PairOfStringString>\n    <PairOfStringString>\n      <A>Bom Bommer</A>\n      <B>Drones</B>\n    </PairOfStringString>\n  </CollapsedGroups>\n  <SavedSplitterDistances>\n    <dictionary>\n      <item>\n        <key>\n          <string>SkillBrowser</string>\n        </key>\n        <value>\n          <int>263</int>\n        </value>\n      </item>\n      <item>\n        <key>\n          <string>SkillBrowserInfo</string>\n        </key>\n        <value>\n          <int>108</int>\n        </value>\n      </item>\n      <item>\n        <key>\n          <string>ShipBrowser</string>\n        </key>\n        <value>\n          <int>163</int>\n        </value>\n      </item>\n      <item>\n        <key>\n          <string>ItemBrowser</string>\n        </key>\n        <value>\n          <int>292</int>\n        </value>\n      </item>\n    </dictionary>\n  </SavedSplitterDistances>\n  <SavedWindowLocations>\n    <dictionary>\n      <item>\n        <key>\n          <string>MainWindow</string>\n        </key>\n        <value>\n          <Rectangle>\n            <Location>\n              <X>697</X>\n              <Y>177</Y>\n            </Location>\n            <Size>\n              <Width>540</Width>\n              <Height>665</Height>\n            </Size>\n            <X>697</X>\n            <Y>177</Y>\n            <Width>540</Width>\n            <Height>665</Height>\n          </Rectangle>\n        </value>\n      </item>\n      <item>\n        <key>\n          <string>SkillPlannerWindow</string>\n        </key>\n        <value>\n          <Rectangle>\n            <Location>\n              <X>517</X>\n              <Y>251</Y>\n            </Location>\n            <Size>\n              <Width>1059</Width>\n              <Height>673</Height>\n            </Size>\n            <X>517</X>\n            <Y>251</Y>\n            <Width>1059</Width>\n            <Height>673</Height>\n          </Rectangle>\n        </value>\n      </item>\n      <item>\n        <key>\n          <string>SkillsPieChart</string>\n        </key>\n        <value>\n          <Rectangle>\n            <Location>\n              <X>1</X>\n              <Y>34</Y>\n            </Location>\n            <Size>\n              <Width>686</Width>\n              <Height>541</Height>\n            </Size>\n            <X>1</X>\n            <Y>34</Y>\n            <Width>686</Width>\n            <Height>541</Height>\n          </Rectangle>\n        </value>\n      </item>\n    </dictionary>\n  </SavedWindowLocations>\n  <LoadoutSortColumn>2</LoadoutSortColumn>\n  <LoadoutSortAscending>false</LoadoutSortAscending>\n  <ConfirmedTips>\n    <string>startup</string>\n    <string>planner</string>\n    <string>suggestion</string>\n  </ConfirmedTips>\n  <CustomAPIConfiguration>Default</CustomAPIConfiguration>\n  <APIConfigurations />\n</logindata2>"
  },
  {
    "path": "src/EVEMon.Common/Serialization/SerializableAPICredentials.cs",
    "content": "namespace EVEMon.Common.Serialization\n{\n    public sealed class SerializableAPICredentials\n    {\n        /// <summary>\n        /// Gets or sets the user identifier.\n        /// </summary>\n        /// <value>\n        /// The user identifier.\n        /// </value>\n        public uint UserID { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/SerializableAPIError.cs",
    "content": "namespace EVEMon.Common.Serialization\n{\n    public sealed class SerializableAPIError\n    {\n        /// <summary>\n        /// Gets or sets the error code.\n        /// </summary>\n        /// <value>\n        /// The error code.\n        /// </value>\n        public string ErrorCode { get; set; }\n\n        /// <summary>\n        /// Gets or sets the error message.\n        /// </summary>\n        /// <value>\n        /// The error message.\n        /// </value>\n        public string ErrorMessage { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/SerializableAPIResult.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.Serialization\n{\n    public sealed class SerializableAPIResult<T>\n    {\n        /// <summary>\n        /// Gets or sets the result.\n        /// </summary>\n        /// <value>\n        /// The result.\n        /// </value>\n        public T Result { get; set; }\n\n        /// <summary>\n        /// Gets or sets the error.\n        /// </summary>\n        /// <value>\n        /// The error.\n        /// </value>\n        public SerializableAPIError Error { get; set; }\n\n        /// <summary>\n        /// Gets or sets the cache expires.\n        /// </summary>\n        /// <value>\n        /// The cache expires.\n        /// </value>\n        public DateTime CacheExpires { get; set; }\n\n        /// <summary>\n        /// Gets a value indicating whether this instance has error.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if this instance has error; otherwise, <c>false</c>.\n        /// </value>\n        public bool HasError => Error != null;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/SerializableEveFlags.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization\n{\n    [XmlRoot(\"invFlags\")]\n    public sealed class SerializableEveFlags\n    {\n        private readonly Collection<SerializableEveFlagsListItem> m_eveFlags;\n\n        public SerializableEveFlags()\n        {\n            m_eveFlags = new Collection<SerializableEveFlagsListItem>();\n        }\n\n        [XmlArray(\"flags\")]\n        [XmlArrayItem(\"flag\")]\n        public Collection<SerializableEveFlagsListItem> EVEFlags => m_eveFlags;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/SerializableEveFlagsListItem.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization\n{\n    public sealed class SerializableEveFlagsListItem\n    {\n        [XmlAttribute(\"flagID\")]\n        public int ID { get; set; }\n\n        [XmlAttribute(\"flagName\")]\n        public string Name { get; set; }\n\n        [XmlAttribute(\"flagText\")]\n        public string Text { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/SerializableEveIDToName.cs",
    "content": "using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization\n{\n    [XmlRoot(\"EveIDToName\")]\n    public sealed class SerializableEveIDToName\n    {\n        private readonly Collection<SerializableEveIDToNameListItem> m_entities;\n\n        public SerializableEveIDToName()\n        {\n            m_entities = new Collection<SerializableEveIDToNameListItem>();\n        }\n\n        [XmlArray(\"entities\")]\n        [XmlArrayItem(\"entity\")]\n        public Collection<SerializableEveIDToNameListItem> Entities => m_entities;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/SerializableEveIDToNameListItem.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization\n{\n    public sealed class SerializableEveIDToNameListItem\n    {\n        [XmlAttribute(\"ID\")]\n        public long ID { get; set; }\n\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/SerializableNotificationRefTypes.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization\n{\n    [XmlRoot(\"NotificationRefTypes\")]\n    public sealed class SerializableNotificationRefTypes\n    {\n        private readonly Collection<SerializableNotificationRefTypesListItem> m_types;\n\n        public SerializableNotificationRefTypes()\n        {\n            m_types = new Collection<SerializableNotificationRefTypesListItem>();\n        }\n\n        [XmlArray(\"refTypes\")]\n        [XmlArrayItem(\"refType\")]\n        public Collection<SerializableNotificationRefTypesListItem> Types => m_types;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/SerializableNotificationRefTypesListItem.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization\n{\n    public sealed class SerializableNotificationRefTypesListItem\n    {\n        [XmlAttribute(\"refTypeID\")]\n        public int TypeID { get; set; }\n\n        [XmlAttribute(\"refTypeCode\")]\n        public string TypeCode { get; set; }\n\n        [XmlAttribute(\"refTypeName\")]\n        public string TypeName { get; set; }\n\n        [XmlAttribute(\"subjectLayout\")]\n        public string SubjectLayout { get; set; }\n\n        [XmlAttribute(\"textLayout\")]\n        public string TextLayout { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableAPIKey.cs",
    "content": "﻿using System;\nusing System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    public sealed class SerializableESIKey\n    {\n        private readonly Collection<SerializableCharacterIdentity> m_ignoreList;\n\n        public SerializableESIKey()\n        {\n            m_ignoreList = new Collection<SerializableCharacterIdentity>();\n        }\n\n        [XmlAttribute(\"id\")]\n        public long ID { get; set; }\n\n        [XmlAttribute(\"refreshToken\")]\n        public string RefreshToken { get; set; }\n\n        [XmlAttribute(\"accessMask\")]\n        public ulong AccessMask { get; set; }\n\n        [XmlAttribute(\"monitored\")]\n        public bool Monitored { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableAPIMethod.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a serializable version of an API method. Used for settings persistence.\n    /// </summary>\n    public sealed class SerializableAPIMethod\n    {\n        [XmlAttribute(\"name\")]\n        public string MethodName { get; set; }\n\n        [XmlAttribute(\"path\")]\n        public string Path { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableAPIProvider.cs",
    "content": "using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Constants;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a serializable version of an API provider. Used for settings persistence.\n    /// </summary>\n    public sealed class SerializableAPIProvider\n    {\n        private readonly Collection<SerializableAPIMethod> m_methods;\n\n        public SerializableAPIProvider()\n        {\n            Name = \"New provider\";\n            Address = NetworkConstants.ESIBase;\n            SupportsCompressedResponse = false;\n            m_methods = new Collection<SerializableAPIMethod>();\n        }\n\n        [XmlAttribute(\"supportsCompressedResponses\")]\n        public bool SupportsCompressedResponse { get; set; }\n\n        [XmlElement(\"name\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"url\")]\n        public string Address { get; set; }\n\n        [XmlArray(\"methods\")]\n        [XmlArrayItem(\"method\")]\n        public Collection<SerializableAPIMethod> Methods => m_methods;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableAPIUpdate.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents an API method and the last time we updated it from CCP.\n    /// </summary>\n    public sealed class SerializableAPIUpdate\n    {\n        [XmlAttribute(\"method\")]\n        public string Method { get; set; }\n\n        [XmlAttribute(\"time\")]\n        public DateTime Time { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableAccount.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    public sealed class SerializableAccount\n    {\n        public SerializableAccount()\n        {\n            IgnoreList = new List<SerializableCharacterIdentity>();\n        }\n\n        [XmlAttribute(\"id\")]\n        public long ID { get; set; }\n\n        [XmlAttribute(\"key\")]\n        public string Key { get; set; }\n\n        [XmlAttribute(\"keyLevel\")]\n        public CredentialsLevel KeyLevel { get; set; }\n\n        [XmlElement(\"paidUntil\")]\n        public DateTime PaidUntil { get; set; }\n\n        [XmlElement(\"createDate\")]\n        public DateTime CreateDate { get; set; }\n\n        [XmlElement(\"lastAccountStatusUpdate\")]\n        public DateTime LastAccountStatusUpdate { get; set; }\n\n        [XmlElement(\"lastCharacterListUpdate\")]\n        public DateTime LastCharacterListUpdate { get; set; }\n\n        [XmlElement(\"ignored\")]\n        public List<SerializableCharacterIdentity> IgnoreList { get; set; }\n\n        /// <summary>\n        /// Clones this instance.\n        /// </summary>\n        /// <returns></returns>\n        internal SerializableAccount Clone()\n        {\n            SerializableAccount clone = new SerializableAccount\n                                            {\n                                                ID = ID,\n                                                Key = Key,\n                                                KeyLevel = KeyLevel,\n                                                PaidUntil = PaidUntil,\n                                                CreateDate = CreateDate,\n                                                LastAccountStatusUpdate = LastAccountStatusUpdate,\n                                                LastCharacterListUpdate = LastCharacterListUpdate\n                                            };\n            clone.IgnoreList.AddRange(IgnoreList.Select(x => x.Clone()));\n            return clone;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableBuyOrder.cs",
    "content": "﻿namespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a buy order.\n    /// </summary>\n    public sealed class SerializableBuyOrder : SerializableOrderBase\n    {\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableCCPCharacter.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a serializable character defined from the API\n    /// </summary>\n    public sealed class SerializableCCPCharacter : SerializableSettingsCharacter\n    {\n        public SerializableCCPCharacter()\n        {\n            SkillQueue = new Collection<SerializableQueuedSkill>();\n            LastUpdates = new Collection<SerializableAPIUpdate>();\n            MarketOrders = new Collection<SerializableOrderBase>();\n            Contracts = new Collection<SerializableContract>();\n            IndustryJobs = new Collection<SerializableJob>();\n        }\n\n\t\t[XmlArray(\"queue\")]\n\t\t[XmlArrayItem(\"skill\")]\n\t\tpublic Collection<SerializableQueuedSkill> SkillQueue { get; }\n\n\t\t[XmlArray(\"marketOrders\")]\n\t\t[XmlArrayItem(\"buy\", typeof(SerializableBuyOrder))]\n\t\t[XmlArrayItem(\"sell\", typeof(SerializableSellOrder))]\n\t\tpublic Collection<SerializableOrderBase> MarketOrders { get; }\n\n\t\t[XmlArray(\"contracts\")]\n\t\t[XmlArrayItem(\"contract\")]\n\t\tpublic Collection<SerializableContract> Contracts { get; }\n\n\t\t[XmlArray(\"industryJobs\")]\n\t\t[XmlArrayItem(\"job\")]\n\t\tpublic Collection<SerializableJob> IndustryJobs { get; }\n\n\t\t[XmlElement(\"eveMailMessages\")]\n        public string EveMailMessagesIDs { get; set; }\n\n        [XmlElement(\"eveNotifications\")]\n        public string EveNotificationsIDs { get; set; }\n\n\t\t[XmlArray(\"lastUpdates\")]\n\t\t[XmlArrayItem(\"apiUpdate\")]\n\t\tpublic Collection<SerializableAPIUpdate> LastUpdates { get; }\n\t}\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableCharacterIdentity.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a character identity in our settings file\n    /// </summary>\n    public sealed class SerializableCharacterIdentity\n    {\n        [XmlAttribute(\"id\")]\n        public long ID { get; set; }\n\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableContract.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    public sealed class SerializableContract\n    {\n        public SerializableContract()\n        {\n            ContractType = ContractType.None;\n        }\n\n        [XmlAttribute(\"contractID\")]\n        public long ContractID { get; set; }\n\n        [XmlAttribute(\"contractState\")]\n        public ContractState ContractState { get; set; }\n\n        [XmlAttribute(\"contractType\")]\n        public ContractType ContractType { get; set; }\n\n        [XmlAttribute(\"issuedFor\")]\n        public IssuedFor IssuedFor { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableEndPoint.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    public class SerializableEndPoint\n    {\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        [XmlAttribute(\"enabled\")]\n        public bool Enabled { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableImplantSetCollection.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a collection of implants sets.\n    /// </summary>\n    public sealed class SerializableImplantSetCollection\n    {\n        private readonly Collection<SerializableSettingsImplantSet> m_customSets;\n\n        public SerializableImplantSetCollection()\n        {\n            ActiveClone = new SerializableSettingsImplantSet();\n            JumpClones = new Collection<SerializableSettingsImplantSet>();\n            m_customSets = new Collection<SerializableSettingsImplantSet>();\n        }\n\n        [XmlElement(\"activeCloneSet\")]\n        public SerializableSettingsImplantSet ActiveClone { get; set; }\n\n        [XmlElement(\"jumpCloneSet\")]\n        public Collection<SerializableSettingsImplantSet> JumpClones { get; set; }\n\n        [XmlElement(\"customSet\")]\n        public Collection<SerializableSettingsImplantSet> CustomSets => m_customSets;\n\n        [XmlElement(\"selectedIndex\")]\n        public int SelectedIndex { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableInvalidPlanEntry.cs",
    "content": "using System;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a plan entry\n    /// </summary>\n    public sealed class SerializableInvalidPlanEntry\n    {\n        [XmlAttribute(\"skill\")]\n        public string SkillName { get; set; }\n\n        [XmlAttribute(\"level\")]\n        public long PlannedLevel { get; set; }\n\n        [XmlAttribute(\"acknowledged\")]\n        public bool Acknowledged { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableJob.cs",
    "content": "using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents an industry job.\n    /// </summary>\n    public class SerializableJob\n    {\n        /// <summary>\n        /// Unique job ID for this job. Note that these are not guaranteed to be unique forever, they can recycle. \n        /// But they are unique for the purpose of one data pull. \n        /// </summary>\n        [XmlAttribute(\"jobID\")]\n        public long JobID { get; set; }\n\n        [XmlAttribute(\"jobState\")]\n        public JobState State { get; set; }\n\n        [XmlAttribute(\"startDate\")]\n        public DateTime StartDate { get; set; }\n\n        [XmlAttribute(\"endDate\")]\n        public DateTime EndDate { get; set; }\n\n        [XmlAttribute(\"pauseDate\")]\n        public DateTime PauseDate { get; set; }\n\n        /// <summary>\n        /// Which this job was issued for.\n        /// </summary>\n        [XmlAttribute(\"issuedFor\")]\n        public IssuedFor IssuedFor { get; set; }\n\n        /// <summary>\n        /// The time this job state was last changed.\n        /// </summary>\n        [XmlAttribute(\"lastStateChange\")]\n        public DateTime LastStateChange { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableOrderBase.cs",
    "content": "using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a market sell order.\n    /// </summary>\n    public class SerializableOrderBase\n    {\n        /// <summary>\n        /// Unique order ID for this order. Note that these are not guaranteed to be unique forever, they can recycle. \n        /// But they are unique for the purpose of one data pull. \n        /// </summary>\n        [XmlAttribute(\"orderID\")]\n        public long OrderID { get; set; }\n\n        /// <summary>\n        /// The state of the order.\n        /// </summary>\n        [XmlAttribute(\"orderState\")]\n        public OrderState State { get; set; }\n\n        /// <summary>\n        /// The cost per unit for this order.\n        /// </summary>\n        [XmlAttribute(\"price\")]\n        public decimal UnitaryPrice { get; set; }\n\n        /// <summary>\n        /// The remaining volume of the order.\n        /// </summary>\n        [XmlAttribute(\"volRemaining\")]\n        public int RemainingVolume { get; set; }\n\n        /// <summary>\n        /// The time this order was issued.\n        /// </summary>\n        [XmlAttribute(\"issued\")]\n        public DateTime Issued { get; set; }\n\n        /// <summary>\n        /// Which this order was issued for.\n        /// </summary>\n        [XmlAttribute(\"issuedFor\")]\n        public IssuedFor IssuedFor { get; set; }\n\n        /// <summary>\n        /// The time this order state was last changed.\n        /// </summary>\n        [XmlAttribute(\"lastStateChange\")]\n        public DateTime LastStateChange { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializablePlan.cs",
    "content": "﻿using System;\nusing System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a plan\n    /// </summary>\n    public class SerializablePlan\n    {\n        private readonly Collection<SerializablePlanEntry> m_entries;\n        private readonly Collection<SerializableInvalidPlanEntry> m_invalidEntries;\n\n        public SerializablePlan()\n        {\n            SortingPreferences = new PlanSorting();\n            m_entries = new Collection<SerializablePlanEntry>();\n            m_invalidEntries = new Collection<SerializableInvalidPlanEntry>();\n        }\n\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        [XmlAttribute(\"owner\")]\n        public Guid Owner { get; set; }\n\n        [XmlAttribute(\"description\")]\n        public string Description { get; set; }\n\n        [XmlElement(\"sorting\")]\n        public PlanSorting SortingPreferences { get; set; }\n\n        [XmlElement(\"entry\")]\n        public Collection<SerializablePlanEntry> Entries => m_entries;\n\n        [XmlElement(\"invalidEntry\")]\n        public Collection<SerializableInvalidPlanEntry> InvalidEntries => m_invalidEntries;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializablePlanEntry.cs",
    "content": "using System;\nusing System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a plan entry\n    /// </summary>\n    public sealed class SerializablePlanEntry\n    {\n        private readonly Collection<string> m_planGroups;\n\n        public SerializablePlanEntry()\n        {\n            m_planGroups = new Collection<string>();\n            Priority = 3;\n        }\n\n        [XmlAttribute(\"skillID\")]\n        public int ID { get; set; }\n\n        [XmlAttribute(\"skill\")]\n        public string SkillName { get; set; }\n\n        [XmlAttribute(\"level\")]\n        public long Level { get; set; }\n\n        [XmlAttribute(\"priority\")]\n        public int Priority { get; set; }\n\n        [XmlAttribute(\"type\")]\n        public PlanEntryType Type { get; set; }\n\n        [XmlElement(\"notes\")]\n        public string Notes { get; set; }\n\n        [XmlElement(\"group\")]\n        public Collection<string> PlanGroups => m_planGroups;\n\n        [XmlElement(\"remapping\")]\n        public SerializableRemappingPoint Remapping { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializablePortableEveInstallation.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    public sealed class SerializablePortableEveInstallation\n    {\n        [XmlAttribute(\"path\")]\n        public string Path { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableRecurringScheduleEntry.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Scheduling;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    public sealed class SerializableRecurringScheduleEntry : SerializableScheduleEntry\n    {\n        [XmlElement(\"frequency\")]\n        public RecurringFrequency Frequency { get; set; }\n\n        [XmlElement(\"weeksPeriod\")]\n        public int WeeksPeriod { get; set; }\n\n        [XmlElement(\"dayOfWeek\")]\n        public DayOfWeek DayOfWeek { get; set; }\n\n        [XmlElement(\"dayOfMonth\")]\n        public int DayOfMonth { get; set; }\n\n        [XmlElement(\"overflowResolution\")]\n        public MonthlyOverflowResolution OverflowResolution { get; set; }\n\n        [XmlElement(\"startTimeInSeconds\")]\n        public int StartTimeInSeconds { get; set; }\n\n        [XmlElement(\"endTimeInSeconds\")]\n        public int EndTimeInSeconds { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableRemappingPoint.cs",
    "content": "using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a remapping point.\n    /// </summary>\n    public sealed class SerializableRemappingPoint\n    {\n        [XmlAttribute(\"status\")]\n        public RemappingPointStatus Status { get; set; }\n\n        [XmlAttribute(\"per\")]\n        public long Perception { get; set; }\n\n        [XmlAttribute(\"int\")]\n        public long Intelligence { get; set; }\n\n        [XmlAttribute(\"mem\")]\n        public long Memory { get; set; }\n\n        [XmlAttribute(\"wil\")]\n        public long Willpower { get; set; }\n\n        [XmlAttribute(\"cha\")]\n        public long Charisma { get; set; }\n\n        [XmlAttribute(\"description\")]\n        public string Description { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableResearchPoint.cs",
    "content": "using System;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    public sealed class SerializableResearchPoint\n    {\n        [XmlAttribute(\"agentID\")]\n        public int AgentID { get; set; }\n\n        [XmlAttribute(\"agentName\")]\n        public string AgentName { get; set; }\n\n        [XmlAttribute(\"skillID\")]\n        public int SkillID { get; set; }\n\n        [XmlAttribute(\"skillName\")]\n        public string SkillName { get; set; }\n\n        [XmlAttribute(\"startDate\")]\n        public DateTime StartDate { get; set; }\n\n        [XmlAttribute(\"pointsPerDay\")]\n        public double PointsPerDay { get; set; }\n\n        [XmlAttribute(\"remainderPoints\")]\n        public float RemainderPoints { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableScheduleEntry.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Scheduling;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    public class SerializableScheduleEntry\n    {\n        [XmlAttribute(\"startDate\")]\n        public DateTime StartDate { get; set; }\n\n        [XmlAttribute(\"endDate\")]\n        public DateTime EndDate { get; set; }\n\n        [XmlElement(\"title\")]\n        public string Title { get; set; }\n\n        [XmlElement(\"options\")]\n        public ScheduleEntryOptions Options { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableSellOrder.cs",
    "content": "namespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a sell order.\n    /// </summary>\n    public sealed class SerializableSellOrder : SerializableOrderBase\n    {\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableSettings.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// This class is a temporary representation of the <see cref=\"EVEMon.Common.Settings\" /> class for serialization purposes through automatic serialization\n    /// </summary>\n    [XmlRoot(\"Settings\")]\n    public sealed class SerializableSettings\n    {\n        private readonly Collection<SerializablePlan> m_plans;\n        private readonly Collection<SerializableESIKey> m_esiKeys;\n        private readonly Collection<SerializableSettingsCharacter> m_characters;\n        private readonly Collection<MonitoredCharacterSettings> m_monitoredCharacters;\n\n        public SerializableSettings()\n        {\n            m_plans = new Collection<SerializablePlan>();\n            m_esiKeys = new Collection<SerializableESIKey>();\n            m_characters = new Collection<SerializableSettingsCharacter>();\n            m_monitoredCharacters = new Collection<MonitoredCharacterSettings>();\n            SSOClientID = string.Empty;\n            SSOClientSecret = string.Empty;\n            CloudStorageServiceProvider = new CloudStorageServiceProviderSettings();\n            PortableEveInstallations = new PortableEveInstallationsSettings();\n            Notifications = new NotificationSettings();\n            LoadoutsProvider = new LoadoutsProviderSettings();\n            MarketPricer = new MarketPricerSettings();\n            Exportation = new ExportationSettings();\n            Scheduler = new SchedulerSettings();\n            Calendar = new CalendarSettings();\n            Updates = new UpdateSettings();\n            Proxy = new ProxySettings();\n            G15 = new G15Settings();\n            UI = new UISettings();\n        }\n\n        [XmlAttribute(\"clientID\")]\n        public string SSOClientID { get; set; }\n        [XmlAttribute(\"clientSecret\")]\n        public string SSOClientSecret { get; set; }\n\n        [XmlAttribute(\"revision\")]\n        public int Revision { get; set; }\n\n        [XmlElement(\"compatibility\")]\n        public CompatibilityMode Compatibility { get; set; }\n\n        [XmlArray(\"esiKeys\")]\n        [XmlArrayItem(\"esikey\")]\n        public Collection<SerializableESIKey> ESIKeys => m_esiKeys;\n\n        [XmlArray(\"characters\")]\n        [XmlArrayItem(\"ccp\", typeof(SerializableCCPCharacter))]\n        [XmlArrayItem(\"uri\", typeof(SerializableUriCharacter))]\n        public Collection<SerializableSettingsCharacter> Characters => m_characters;\n\n        [XmlArray(\"plans\")]\n        [XmlArrayItem(\"plan\")]\n        public Collection<SerializablePlan> Plans => m_plans;\n\n        [XmlArray(\"monitoredCharacters\")]\n        [XmlArrayItem(\"character\")]\n        public Collection<MonitoredCharacterSettings> MonitoredCharacters => m_monitoredCharacters;\n        \n        [XmlElement(\"updates\")]\n        public UpdateSettings Updates { get; set; }\n\n        [XmlElement(\"notifications\")]\n        public NotificationSettings Notifications { get; set; }\n\n        [XmlElement(\"scheduler\")]\n        public SchedulerSettings Scheduler { get; set; }\n\n        [XmlElement(\"calendar\")]\n        public CalendarSettings Calendar { get; set; }\n\n        [XmlElement(\"exportation\")]\n        public ExportationSettings Exportation { get; set; }\n\n        [XmlElement(\"marketPricer\")]\n        public MarketPricerSettings MarketPricer { get; set; }\n\n        [XmlElement(\"loadoutsProvider\")]\n        public LoadoutsProviderSettings LoadoutsProvider { get; set; }\n\n        [XmlElement(\"cloudStorageServiceProvider\")]\n        public CloudStorageServiceProviderSettings CloudStorageServiceProvider { get; set; }\n\n        [XmlElement(\"portableEveInstallations\")]\n        public PortableEveInstallationsSettings PortableEveInstallations { get; set; }\n\n        [XmlElement(\"G15\")]\n        public G15Settings G15 { get; set; }\n\n        [XmlElement(\"UI\")]\n        public UISettings UI { get; set; }\n\n        [XmlElement(\"proxy\")]\n        public ProxySettings Proxy { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableSettingsCharacter.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Serialization.Eve;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a base for character serialization in the settings.\n    /// </summary>\n    public class SerializableSettingsCharacter : SerializableCharacterSheetBase\n    {\n        [XmlAttribute(\"guid\")]\n        public Guid Guid { get; set; }\n\n        [XmlAttribute(\"label\")]\n        public string Label { get; set; }\n\n        [XmlElement(\"implants\")]\n        public SerializableImplantSetCollection ImplantSets { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableSettingsImplantSet.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents the set of attributes enhancers\n    /// </summary>\n    public sealed class SerializableSettingsImplantSet\n    {\n        public SerializableSettingsImplantSet()\n        {\n            Name = \"Custom\";\n            Intelligence = ImplantSlots.None.ToString();\n            Perception = ImplantSlots.None.ToString();\n            Willpower = ImplantSlots.None.ToString();\n            Charisma = ImplantSlots.None.ToString();\n            Memory = ImplantSlots.None.ToString();\n            Slot6 = ImplantSlots.None.ToString();\n            Slot7 = ImplantSlots.None.ToString();\n            Slot8 = ImplantSlots.None.ToString();\n            Slot9 = ImplantSlots.None.ToString();\n            Slot10 = ImplantSlots.None.ToString();\n        }\n\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"intelligence\")]\n        public string Intelligence { get; set; }\n\n        [XmlElement(\"memory\")]\n        public string Memory { get; set; }\n\n        [XmlElement(\"willpower\")]\n        public string Willpower { get; set; }\n\n        [XmlElement(\"perception\")]\n        public string Perception { get; set; }\n\n        [XmlElement(\"charisma\")]\n        public string Charisma { get; set; }\n\n        [XmlElement(\"slot6\")]\n        public string Slot6 { get; set; }\n\n        [XmlElement(\"slot7\")]\n        public string Slot7 { get; set; }\n\n        [XmlElement(\"slot8\")]\n        public string Slot8 { get; set; }\n\n        [XmlElement(\"slot9\")]\n        public string Slot9 { get; set; }\n\n        [XmlElement(\"slot10\")]\n        public string Slot10 { get; set; }\n\n        public override string ToString() => Name;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableStanding.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    public sealed class SerializableStanding\n    {\n        [XmlAttribute(\"entityID\")]\n        public int EntityID { get; set; }\n\n        [XmlAttribute(\"entityName\")]\n        public string EntityName { get; set; }\n\n        [XmlAttribute(\"standing\")]\n        public double StandingValue { get; set; }\n\n        [XmlAttribute(\"group\")]\n        public string Group { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/SerializableUriCharacter.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.Serialization.Settings\n{\n    /// <summary>\n    /// Represents a serializable character defined from an uri file\n    /// </summary>\n    public sealed class SerializableUriCharacter : SerializableSettingsCharacter\n    {\n        [XmlElement(\"uri\")]\n        public string Address { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Serialization/Settings/settings-transform.xslt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n    xmlns:msxsl=\"urn:schemas-microsoft-com:xslt\" exclude-result-prefixes=\"msxsl\">\n  <xsl:strip-space elements=\"*\" />\n  <xsl:output method=\"xml\" indent=\"yes\"/>\n\n  <xsl:template match=\"@* | node()\">\n    <xsl:copy>\n      <xsl:apply-templates select=\"@* | node()\"/>\n    </xsl:copy>\n  </xsl:template>\n\n  <!--Transforms the SerializableDictionary to its Modified version-->\n  <xsl:template match=\"periods/dictionary\">\n    <xsl:for-each select =\"item\">\n      <xsl:variable name=\"apiMethod\" select=\"key/string\"/>\n      <!--As of version 1.5.2 the element name was renamed, so we try to catch that name too-->\n      <xsl:variable name=\"apiMethodPre-Renamed\" select=\"key/APIMethodsEnum\"/>\n      <xsl:variable name=\"updatePeriod\" select=\"value/UpdatePeriod\"/>\n      <period updatePeriod =\"{$updatePeriod}\">\n        <xsl:value-of select=\"$apiMethod|$apiMethodPre-Renamed\"/>\n      </period>\n    </xsl:for-each>\n  </xsl:template>\n\n  <!--Transforms the SerializableDictionary to its Modified version-->\n  <xsl:template match=\"categories/dictionary\">\n    <xsl:for-each select =\"item\">\n      <xsl:variable name=\"notificationCategory\" select=\"key/NotificationCategory\"/>\n      <xsl:variable name=\"toolTipBehaviour\" select=\"value/NotificationCategorySettings/@toolTipBehaviour\"/>\n      <xsl:variable name=\"showOnMainWindow\" select=\"value/NotificationCategorySettings/@showOnMainWindow\"/>\n      <!--As of version 1.3.3 the spelling of enumeration 'RepeatUntiClicked' was corrected and double supported since 1.6.1,\n      though we need to catch that too for all those that haven't updated since-->\n      <xsl:choose>\n        <xsl:when test=\"$toolTipBehaviour='RepeatUntiClicked'\">\n          <category toolTipBehaviour =\"RepeatUntilClicked\" showOnMainWindow =\"{$showOnMainWindow}\">\n            <xsl:value-of select=\"$notificationCategory\"/>\n          </category>\n        </xsl:when>\n        <xsl:otherwise>\n          <category toolTipBehaviour =\"{$toolTipBehaviour}\" showOnMainWindow =\"{$showOnMainWindow}\">\n            <xsl:value-of select=\"$notificationCategory\"/>\n          </category>\n        </xsl:otherwise>\n      </xsl:choose>\n    </xsl:for-each>\n  </xsl:template>\n\n  <!--Transforms the SerializableDictionary to its Modified version-->\n  <xsl:template match=\"locations/dictionary\">\n    <xsl:for-each select =\"item\">\n      <xsl:variable name=\"window\" select=\"key/string\"/>\n      <xsl:variable name=\"left\" select=\"value/SerializableRectangle/@left\"/>\n      <xsl:variable name=\"top\" select=\"value/SerializableRectangle/@top\"/>\n      <xsl:variable name=\"width\" select=\"value/SerializableRectangle/@width\"/>\n      <xsl:variable name=\"height\" select=\"value/SerializableRectangle/@height\"/>\n      <location left=\"{$left}\" top=\"{$top}\" width=\"{$width}\" height=\"{$height}\">\n        <xsl:value-of select=\"$window\"/>\n      </location>\n    </xsl:for-each>\n  </xsl:template>\n\n  <!--Transforms the SerializableDictionary to its Modified version-->\n  <xsl:template match=\"splitters/dictionary\">\n    <xsl:for-each select =\"item\">\n      <xsl:variable name=\"splitter\" select=\"key/string\"/>\n      <xsl:variable name=\"int\" select=\"value/int\"/>\n      <int int=\"{$int}\">\n        <xsl:value-of select=\"$splitter\"/>\n      </int>\n    </xsl:for-each>\n  </xsl:template>\n\n  <!-- Renaming element value 'None' to 'NoSlot' in item browser slot filtering -->\n  <xsl:template match=\"slotFilter\">\n    <xsl:choose>\n      <xsl:when test=\"text()='None'\">\n        <xsl:copy>\n          <xsl:value-of select=\"'NoSlot'\"/>\n        </xsl:copy>\n      </xsl:when>\n      <xsl:otherwise>\n        <xsl:copy-of select=\".\"/>\n      </xsl:otherwise>\n    </xsl:choose>\n  </xsl:template>\n\n  <!-- Replacing element value 'Named' and 'Other' in item browser metaGroup filtering -->\n  <xsl:template match=\"metaGroupFilter\">\n    <xsl:choose>\n      <xsl:when test=\"contains(text(), 'Named') or contains(text(), 'Other')\">\n        <xsl:copy>\n          <xsl:value-of select=\"'All'\"/>\n        </xsl:copy>\n      </xsl:when>\n      <xsl:otherwise>\n        <xsl:copy-of select=\".\"/>\n      </xsl:otherwise>\n    </xsl:choose>\n  </xsl:template>\n  \n  <!-- Renaming element value 'Name' to 'None' in certificate browser sort filtering -->\n  <xsl:template match=\"certificateBrowser/sort\">\n    <xsl:choose>\n      <xsl:when test=\"text()='Name'\">\n        <xsl:copy>\n          <xsl:value-of select=\"'None'\"/>\n        </xsl:copy>\n      </xsl:when>\n      <xsl:otherwise>\n        <xsl:copy-of select=\".\"/>\n      </xsl:otherwise>\n    </xsl:choose>\n  </xsl:template>\n\n</xsl:stylesheet>\n"
  },
  {
    "path": "src/EVEMon.Common/Service/AutoShrink.cs",
    "content": "// (C) 2007 Jay Beavers (mailto:Jay@HikingHomeschoolers.Org), All Rights Reserved.\n// Submitted by Jay Beavers to EVEMon as an enhancement, permission to include in EVEMon and use appropriately.\n// Submission does not constitute release of Copyright Ownership.\n\nusing System;\nusing System.Diagnostics;\nusing System.Threading;\nusing EVEMon.Common.Controls;\n\nnamespace EVEMon.Common.Service\n{\n    /// <summary>\n    /// The purpose of AutoShrink is to provide a simple way for long running applications to reduce their memory footprint when idle.\n    /// This is especially useful for applications that run out of the system tray and occasionally make/receive network connections\n    /// as part of their functionality.\n    /// </summary>\n    /// <example>\n    /// DoSomeNetworkOperation();\n    /// AutoShrink.Dirty();\n    /// GoIdle();\n    /// </example>\n    /// <see cref=\"http://www.hikinghomeschoolers.org/Jay/Wiki/AutoShrink.aspx\"/>\n    public static class AutoShrink\n    {\n        /// <summary>\n        /// 65 seconds not work for you?  Change it here.\n        /// </summary>\n        /// <remarks>\n        /// Typically this should not be too short.  You want the .NET classes you call, which may be using ThreadPool threads\n        /// or timers themselves, to have a chance to \"run out\" before the cleanup occurs.  If you leave this value long, you\n        /// can also call Dirty() early on and be assured that the cleanup won't take place until your operation is completed.\n        /// \n        /// A good reason to change this value would be to lengthen it to handle longer running operations.  For instance, if your\n        /// app takes 5 minutes to service incoming network calls typically then you might want to increase this timer to say 7-10\n        /// minutes.\n        /// \n        /// A default value of 65 seconds was chosen because Windows Communications Foundation times out network connections after 60\n        /// seconds.  By calling Dirty() at the start of a network operation, we're most likely going to clean up after WCF has\n        /// completed processing either the successful call or the timeout.\n        /// </remarks>\n        private static readonly int s_idleMillisecondsBeforeClean = TimeSpan.FromSeconds(65).Milliseconds;\n\n        private static readonly Timer s_dirtyTimer = new Timer(DirtyCallback);\n\n        /// <summary>\n        /// Call this method after an operation has occurred that might have increased the working set of the application\n        /// temporarily (e.g. making or servicing a network call).  Calling this after an operation that allocates and holds\n        /// onto memory (e.g. loading an ADO.NET Table from SQL) will not have much effect as that memory isn't available\n        /// to be Collected/Released.\n        /// </summary>\n        /// <remarks>\n        /// This method has a built-in timer to \"dampen\" multiple rapid calls to this method. This means that you can safely\n        /// place the call inside a \"frequently called\" submethod (like Connection.Close) and memory clean will not occur until\n        /// calls to Dirty() stop coming in. The timer is also by default set to a large value (65 seconds) so you don't have\n        /// to be terribly precise about when you call it. For instance, if your operation completes within 65 seconds you\n        /// could simply call Dirty() at Operation.Start() and then the cleanup wouldn't occur until 65 seconds later after the\n        /// operation had finished.\n        /// </remarks>\n        public static void Dirty()\n        {\n            s_dirtyTimer.Change(s_idleMillisecondsBeforeClean, Timeout.Infinite);\n        }\n\n        /// <summary>\n        /// Call this method after an operation has occurred that might have increased the working set of the application\n        /// temporarily (e.g. making or servicing a network call).  Calling this after an operation that allocates and holds\n        /// onto memory (e.g. loading an ADO.NET Table from SQL) will not have much effect as that memory isn't available\n        /// to be Collected/Released.\n        /// </summary>\n        /// <remarks>\n        /// This method has a built-in timer to \"dampen\" multiple rapid calls to this method. This means that you can safely\n        /// place the call inside a \"frequently called\" submethod (like Connection.Close) and memory clean will not occur until\n        /// calls to Dirty() stop coming in.\n        ///\n        /// This overload allows you to specify timeout so you can use a shorter or longer timeout for \"well known behavior\"\n        /// situations like minimizing the window to systray.\n        /// </remarks>\n        /// <param name=\"idleMillisecondsBeforeClean\">\n        /// TimeSpan to wait for Dirty calls to dampen (e.g. time to pass without another call to dirty) before cleaning memory.\n        /// </param>\n        public static void Dirty(int idleMillisecondsBeforeClean)\n        {\n            s_dirtyTimer.Change(idleMillisecondsBeforeClean, Timeout.Infinite);\n        }\n\n        /// <summary>\n        /// Forces an immediate cleanup.\n        /// </summary>\n        public static void DirtyImmediate()\n        {\n            DirtyCallback(null);\n            s_dirtyTimer.Change(Timeout.Infinite, Timeout.Infinite);\n        }\n\n        /// <summary>\n        /// The callback.\n        /// </summary>\n        /// <param name=\"state\">The state.</param>\n        private static void DirtyCallback(object state)\n        {\n            // Note by Jimi (03-2012): Reading several posts about GC.Collect usage being a bad practice and monitoring EVEMon behavior\n            // I have disabled the use of it. Left though the code that empties the working set memory.\n\n            // These operations are very expensive and should be performed rarely.  One of the ironies of GC.Collect is that it touches\n            // the memory of *every single* managed object in a program as part of it's \"can I get rid of you now?\" algorithm.\n            // Ergo, if a piece of memory in a managed app was paged out into disk, GC.Collect will force it to be reloaded.\n            // This is why if you want to manually \"trim\" your memory using GC.Collect, afterwards you should call\n            // SetProcessWorkingSetSize to trim the memory pages that were brought in only for the GC interrogation.\n            //GC.Collect();\n\n            // Not only collect, also wait for the finalizers routines to be run so that all the memory churn is finished before we\n            // trim the working set.\n            //GC.WaitForPendingFinalizers();\n\n            // Performs the same operation that Windows does upon \"minimize window\". This releases all memory pages not currently in use\n            // which greatly reduces the amount of RAM that a managed application take up when idle.\n            // Note by Jimi: Using 'EmptyWorkingSet' in favor of 'SetProcessWorkingSetSize' as proposed in\n            // http://msdn.microsoft.com/en-us/library/windows/desktop/ms686234.aspx and\n            // http://msdn.microsoft.com/en-us/library/windows/desktop/ms682606.aspx\n            if (Environment.OSVersion.Platform == PlatformID.Win32NT)\n                NativeMethods.EmptyWorkingSet(Process.GetCurrentProcess().Handle);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Service/CodeCompiler.cs",
    "content": "using System;\nusing System.CodeDom.Compiler;\nusing System.Linq;\nusing System.Reflection;\nusing Microsoft.CSharp;\n\nnamespace EVEMon.Common.Service\n{\n    internal class CodeCompiler\n    {\n        private readonly CompilerParameters m_compilerParameters = new CompilerParameters();\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CodeCompiler\"/> class.\n        /// </summary>\n        /// <param name=\"referenceAssemblies\">The reference assemblies.</param>\n        private CodeCompiler(string[] referenceAssemblies)\n        {\n            m_compilerParameters.GenerateInMemory = true;\n            m_compilerParameters.GenerateExecutable = false;\n            m_compilerParameters.OutputAssembly = null;\n            m_compilerParameters.ReferencedAssemblies.Add(GetType().Assembly.Location);\n            m_compilerParameters.ReferencedAssemblies.AddRange(referenceAssemblies);\n        }\n\n        /// <summary>\n        /// Generates the assembly.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"referenceAssemblies\">The reference assemblies.</param>\n        /// <param name=\"codeText\">The code text.</param>\n        /// <returns></returns>\n        internal static T GenerateAssembly<T>(string[] referenceAssemblies, string codeText) where T : class\n        {\n            var compiler = new CodeCompiler(referenceAssemblies);\n            return compiler.CreateInstanceFrom<T>(codeText);\n        }\n\n        /// <summary>\n        /// Creates the instance from the specified code text.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"codeText\">The code text.</param>\n        /// <returns></returns>\n        private T CreateInstanceFrom<T>(string codeText) where T : class\n        {\n            Type type = Compile(codeText)?.GetExportedTypes()\n                .FirstOrDefault(exportedType => exportedType.IsSubclassOf(typeof(T)));\n\n            if (type == null)\n                return null;\n\n            return Activator.CreateInstance(type) as T;\n        }\n\n        /// <summary>\n        /// Compiles the specified code text.\n        /// </summary>\n        /// <param name=\"codeText\">The code text.</param>\n        /// <returns></returns>\n        private Assembly Compile(string codeText)\n        {\n            try\n            {\n                CompilerResults results;\n                using (CodeDomProvider csProvider = new CSharpCodeProvider())\n                {\n                    results = csProvider.CompileAssemblyFromSource(m_compilerParameters, codeText);\n                }\n\n                if (!results.Errors.HasErrors)\n                {\n                    EveMonClient.Trace(\"Success\");\n                    return results.CompiledAssembly;\n                }\n\n                results.Errors.OfType<CompilerError>().ToList().ForEach(error => EveMonClient.Trace(error.ErrorText));\n            }\n            catch (Exception exc)\n            {\n                EveMonClient.Trace(\"Failed\");\n                Helpers.ExceptionHandler.LogException(exc, true);\n            }\n\n            return null;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Service/Emailer.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Mail;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common.Service\n{\n    /// <summary>\n    /// Provides SMTP based e-mail services taylored to Skill Completion.\n    /// </summary>\n    public static class Emailer\n    {\n        private static SmtpClient s_smtpClient;\n        private static MailMessage s_mailMessage;\n        private static bool s_isTestMail;\n\n        /// <summary>\n        /// Sends a test mail\n        /// </summary>\n        /// <param name=\"settings\">NotificationSettings object</param>\n        /// <remarks>\n        /// A notification settings object is required, as this function\n        /// is called from the Settings Window, and assumibly the user\n        /// is changing settings.\n        /// </remarks>\n        /// <returns>False if an exception was thrown, otherwise True.</returns>\n        public static void SendTestMail(NotificationSettings settings)\n        {\n            s_isTestMail = true;\n            SendMail(settings, \"EVEMon Test Mail\", \"This is a test email sent by EVEMon\");\n        }\n\n        /// <summary>\n        /// Sends a mail alert for a skill completion\n        /// </summary>\n        /// <param name=\"queueList\">Current Skill Queue</param>\n        /// <param name=\"skill\">Skill that has just completed</param>\n        /// <param name=\"character\">Character affected</param>\n        /// <exception cref=\"System.ArgumentNullException\">\n        /// </exception>\n        public static void SendSkillCompletionMail(IList<QueuedSkill> queueList, QueuedSkill skill, Character character)\n        {\n            s_isTestMail = false;\n\n            queueList.ThrowIfNull(nameof(queueList));\n\n            skill.ThrowIfNull(nameof(skill));\n\n            CCPCharacter ccpCharacter = character as CCPCharacter;\n\n            // Current character isn't a CCP character, so can't have a Queue.\n            if (ccpCharacter == null)\n                return;\n\n            string skillLevelText = $\"{skill.SkillName} {Skill.GetRomanFromInt(skill.Level)}\";\n            string subjectText = $\"{character.Name} has finished training {skillLevelText}.\";\n\n            // Message's first line\n            StringBuilder body = new StringBuilder();\n            body\n                .AppendLine(subjectText)\n                .AppendLine();\n\n            // Next skills in queue\n            if (queueList[0] != null)\n            {\n                string plural = queueList.Count > 1 ? \"s\" : string.Empty;\n                body.AppendLine($\"Next skill{plural} in queue:\");\n\n                foreach (QueuedSkill qskill in queueList)\n                {\n                    body.AppendLine($\"- {qskill}\");\n                }\n                body.AppendLine();\n            }\n            else\n                body\n                    .AppendLine(\"Character is not training.\")\n                    .AppendLine();\n\n            // Skill queue less than a day\n            if (ccpCharacter.SkillQueue.LessThanWarningThreshold)\n            {\n                TimeSpan skillQueueEndTime = ccpCharacter.SkillQueue.EndTime.Subtract(DateTime.UtcNow);\n                TimeSpan timeLeft = SkillQueue.WarningThresholdTimeSpan.Subtract(skillQueueEndTime);\n\n                // Skill queue empty?\n                if (timeLeft > SkillQueue.WarningThresholdTimeSpan)\n                    body.AppendLine(\"Skill queue is empty.\");\n                else\n                {\n                    string timeLeftText = skillQueueEndTime < TimeSpan.FromMinutes(1)\n                        ? skillQueueEndTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas)\n                        : skillQueueEndTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas, false);\n\n                    body.AppendLine($\"Queue ends in {timeLeftText}.\");\n                }\n            }\n\n            // Short format (also for SMS)\n            if (Settings.Notifications.UseEmailShortFormat)\n            {\n                SendMail(Settings.Notifications,\n                    $\"[STC] {character.Name} :: {skillLevelText}\",\n                    body.ToString());\n\n                return;\n            }\n\n            // Long format\n            if (character.Plans.Count > 0)\n            {\n                body.AppendLine(\"Next skills listed in plans:\")\n                    .AppendLine();\n            }\n\n            foreach (Plan plan in character.Plans)\n            {\n                if (plan.Count <= 0)\n                    continue;\n\n                // Print plan name\n                CharacterScratchpad scratchpad = new CharacterScratchpad(character);\n                body.AppendLine($\"{plan.Name}:\");\n\n                // Scroll through entries\n                int i = 0;\n                int minDays = 1;\n                foreach (PlanEntry entry in plan)\n                {\n                    TimeSpan trainTime = scratchpad.GetTrainingTime(entry.Skill, entry.Level,\n                        TrainingOrigin.FromPreviousLevelOrCurrent);\n\n                    // Only print the first three skills, and the very long skills\n                    // (first limit is one day, then we add skills duration)\n                    if (++i > 3 && trainTime.Days <= minDays)\n                        continue;\n\n                    if (i > 3)\n                    {\n                        // Print long message once\n                        if (minDays == 1)\n                            body.AppendLine().Append($\"Longer skills from {plan.Name}:\").AppendLine();\n\n                        minDays = trainTime.Days + minDays;\n                    }\n                    body.Append($\"\\t{entry}\");\n\n                    // Notes\n                    if (!string.IsNullOrEmpty(entry.Notes))\n                        body.Append($\" ({entry.Notes})\");\n\n                    // Training time\n                    body\n                        .Append(trainTime.Days > 0 ? $\" - {trainTime.Days}d, {trainTime}\" : $\" - {trainTime}\")\n                        .AppendLine();\n                }\n                body.AppendLine();\n            }\n\n            SendMail(Settings.Notifications, subjectText, body.ToString());\n        }\n\n        /// <summary>\n        /// Triggers on when a SMTP client has finished (success or failure)\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private static void SendCompleted(object sender, AsyncCompletedEventArgs e)\n        {\n            if (e.Cancelled)\n            {\n                EveMonClient.Trace(\"The last message was cancelled\");\n            }\n            else if (e.Error != null)\n            {\n                EveMonClient.Trace(\"An error occurred\");\n                ExceptionHandler.LogException(e.Error, true);\n                MessageBox.Show(e.Error.Message, @\"EVEMon Emailer Error\", MessageBoxButtons.OK, MessageBoxIcon.Error);\n            }\n            else\n            {\n                if (s_isTestMail)\n                {\n                    MessageBox.Show(@\"The message sent successfully. Please verify that the message was received.\",\n                        @\"EVEMon Emailer Success\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n                }\n\n                EveMonClient.Trace(\"Message sent.\");\n            }\n\n            s_mailMessage.Dispose();\n            s_smtpClient.Dispose();\n        }\n\n        /// <summary>\n        /// Performs the sending of the mail\n        /// </summary>\n        /// <param name=\"settings\">Settings object to use when sending</param>\n        /// <param name=\"subject\">Subject of the message</param>\n        /// <param name=\"body\">Body of the message</param>\n        /// <returns>True if no exceptions thrown, otherwise false</returns>\n        /// <remarks>\n        /// NotificationSettings object is required to support\n        /// alternative settings from Tools -> Options. Use\n        /// Settings.Notifications unless using an alternative\n        /// configuration.\n        /// </remarks>\n        private static void SendMail(NotificationSettings settings, string subject, string body)\n        {\n            // Trace something to the logs so we can identify the time the message was sent\n            EveMonClient.Trace($\"(Subject - {subject}; Server - {settings.EmailSmtpServerAddress}:{settings.EmailPortNumber})\");\n\n            string sender = string.IsNullOrEmpty(settings.EmailFromAddress)\n                ? \"no-reply@evemon.net\"\n                : settings.EmailFromAddress;\n\n            List<string> toAddresses = settings.EmailToAddress.Split(\n                new[] { ';', ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();\n\n            try\n            {\n                // Set up message\n                s_mailMessage = new MailMessage();\n                toAddresses.ForEach(address => s_mailMessage.To.Add(address.Trim()));\n                s_mailMessage.From = new MailAddress(sender);\n                s_mailMessage.Subject = subject;\n                s_mailMessage.Body = body;\n\n                // Set up client\n                s_smtpClient = GetClient(settings);\n\n                // Send message\n                s_smtpClient.SendAsync(s_mailMessage, null);\n            }\n            catch (Exception e)\n            {\n                ExceptionHandler.LogException(e, true);\n                MessageBox.Show(@\"The message failed to send.\", @\"EVEMon Emailer Failure\", MessageBoxButtons.OK,\n                    MessageBoxIcon.Warning);\n            }\n        }\n\n        /// <summary>\n        /// Gets the client.\n        /// </summary>\n        /// <param name=\"settings\">The settings.</param>\n        /// <returns></returns>\n        private static SmtpClient GetClient(NotificationSettings settings)\n        {\n            SmtpClient client = new SmtpClient\n            {\n                DeliveryMethod = SmtpDeliveryMethod.Network,\n                Timeout = (int)TimeSpan.FromSeconds(Settings.Updates.HttpTimeout).TotalMilliseconds,\n\n                // Host and port\n                Host = settings.EmailSmtpServerAddress,\n                Port = settings.EmailPortNumber,\n\n                // SSL\n                EnableSsl = settings.EmailServerRequiresSsl\n            };\n\n            ServicePointManager.ServerCertificateValidationCallback = (s, certificate, chain, sslPolicyErrors) => true;\n\n            client.SendCompleted += SendCompleted;\n\n            if (!settings.EmailAuthenticationRequired)\n                return client;\n\n            // Credentials\n            client.UseDefaultCredentials = false;\n            client.Credentials = new NetworkCredential(settings.EmailAuthenticationUserName,\n                Util.Decrypt(settings.EmailAuthenticationPassword,\n                    settings.EmailAuthenticationUserName));\n\n            return client;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Service/EveFlag.cs",
    "content": "﻿using EVEMon.Common.Constants;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.Common.Service\n{\n    public static class EveFlag\n    {\n        private static Dictionary<int, SerializableEveFlagsListItem> s_eveFlags =\n            new Dictionary<int, SerializableEveFlagsListItem>();\n        private static bool s_isLoaded;\n        private static bool s_queryPending;\n        private static DateTime s_nextCheckTime;\n\n        public const string Filename = \"Flags\";\n\n        /// <summary>\n        /// Gets the description of the flag.\n        /// </summary>\n        /// <param name=\"id\">The flag id.</param>\n        internal static string GetFlagText(int id)\n        {\n            if (EveMonClient.IsDebugBuild)\n                EnsureInitialized();\n            else\n                EnsureImportation();\n\n            SerializableEveFlagsListItem flag = null;\n            // Some flags have been introduced that are not in the SDE\n            if (s_eveFlags != null && !s_eveFlags.TryGetValue(id, out flag))\n                flag = null;\n\n            return flag?.Text ?? EveMonConstants.UnknownText;\n        }\n\n        /// <summary>\n        /// Gets the description of the flag.\n        /// </summary>\n        /// <param name=\"name\">The flag name.</param>\n        internal static int GetFlagID(string name)\n        {\n            if (EveMonClient.IsDebugBuild)\n                EnsureInitialized();\n            else\n                EnsureImportation();\n\n            SerializableEveFlagsListItem flag = null;\n            if (s_eveFlags != null)\n                flag = s_eveFlags.Values.FirstOrDefault(x => x.Name.Equals(name,\n                    StringComparison.InvariantCultureIgnoreCase));\n            \n            return flag?.ID ?? 0;\n        }\n\n        /// <summary>\n        /// Ensures the eve flags data have been intialized.\n        /// </summary>\n        private static void EnsureInitialized()\n        {\n            if (s_isLoaded)\n                return;\n\n            SerializableEveFlags result = Util.DeserializeXmlFromString<SerializableEveFlags>(\n                Properties.Resources.Flags, APIProvider.RowsetsTransform);\n\n            Import(result);\n        }\n\n        /// <summary>\n        /// Ensures the importation.\n        /// </summary>\n        private static void EnsureImportation()\n        {\n            // Quit if we already checked a minute ago or query is pending\n            if (s_nextCheckTime > DateTime.UtcNow || s_queryPending || s_isLoaded)\n                return;\n\n            s_nextCheckTime = DateTime.UtcNow.AddMinutes(1);\n\n            // Deserialize the xml file\n            var result = LocalXmlCache.Load<SerializableEveFlags>(Filename, true);\n            if (result == null)\n            {\n                Task.WhenAll(UpdateFileAsync());\n                s_nextCheckTime = DateTime.UtcNow;\n            }\n            else\n                // Import the data\n                Import(result);\n        }\n\n        /// <summary>\n        /// Imports the specified result.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private static void Import(SerializableEveFlags result)\n        {\n            if (result == null)\n            {\n                EveMonClient.Trace(\"failed\");\n                return;\n            }\n\n            EveMonClient.Trace(\"begin\");\n\n            s_eveFlags.Clear();\n            // This is way faster to look up flags\n            foreach (var flag in result.EVEFlags)\n                s_eveFlags.Add(flag.ID, flag);\n\n            s_isLoaded = true;\n\n            EveMonClient.Trace(\"done\");\n        }\n\n        /// <summary>\n        /// Updates the file.\n        /// </summary>\n        private static async Task UpdateFileAsync()\n        {\n            // Quit if query is pending\n            if (s_queryPending)\n                return;\n\n            var url = new Uri(NetworkConstants.BitBucketWikiBase + NetworkConstants.EveFlags);\n\n            s_queryPending = true;\n\n            var result = await Util.DownloadXmlAsync<SerializableEveFlags>(url,\n                new RequestParams()\n                {\n                    AcceptEncoded = true\n                }, APIProvider.RowsetsTransform);\n            OnDownloaded(result);\n        }\n\n        /// <summary>\n        /// Processes the queried eve flags.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private static void OnDownloaded(DownloadResult<SerializableEveFlags> result)\n        {\n            if (result.Error != null)\n            {\n                // Reset query pending flag\n                s_queryPending = false;\n\n                EveMonClient.Trace(result.Error.Message);\n\n                // Fallback\n                EnsureInitialized();\n                return;\n            }\n\n            // Import the list\n            Import(result.Result);\n\n            // Reset query pending flag\n            s_queryPending = false;\n\n            // Notify the subscribers\n            EveMonClient.OnEveFlagsUpdated();\n\n            // Save the file in cache\n            LocalXmlCache.SaveAsync(Filename, Util.SerializeToXmlDocument(result.Result)).\n                ConfigureAwait(false);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Service/EveIDToName.cs",
    "content": "using EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nusing StringIDInfo = EVEMon.Common.Service.IDInformation<string, string>;\n\nnamespace EVEMon.Common.Service\n{\n    public static class EveIDToName\n    {\n        private const string Filename = \"EveIDToName\";\n\n        // Cache used to return all data, this is saved and loaded into the file\n        private static readonly Dictionary<long, StringIDInfo> s_cacheList =\n            new Dictionary<long, StringIDInfo>();\n\n        // Provider for characters, corps, and alliances\n        // Thank goodness for the consolidated names endpoint\n        private static readonly GenericIDToNameProvider s_lookup =\n            new GenericIDToNameProvider(s_cacheList);\n\n        private static bool s_savePending;\n        private static DateTime s_lastSaveTime;\n\n        /// <summary>\n        /// Static Constructor.\n        /// </summary>\n        static EveIDToName()\n        {\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n        }\n\n        #region Helpers\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private static async void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            await UpdateOnOneSecondTickAsync();\n        }\n        \n        /// <summary>\n        /// Gets the character, corporation, or alliance name from its ID.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <param name=\"bypass\">false (default) to allow local lookup optimizations, true\n        /// to force a query to ESI API (depending on local cache)</param>\n        /// <returns>The entity name, or EveMonConstants.UnknownText if it is being queried.</returns>\n        internal static string GetIDToName(long id, bool bypass = false)\n        {\n            return s_lookup.LookupID(id, bypass) ?? EveMonConstants.UnknownText;\n        }\n\n        /// <summary>\n        /// Gets character, corporation, or alliance names from their IDs.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns>The entity names, or null for each entry being queried.</returns>\n        internal static IEnumerable<string> GetIDsToNames(IEnumerable<long> ids)\n        {\n            return s_lookup.LookupAllID(ids);\n        }\n\n        #endregion\n\n\n        #region Importation/Exportation\n\n        /// <summary>\n        /// Initializes the cache from file.\n        /// </summary>\n        public static void InitializeFromFile()\n        {\n            // Quit if the client has been shut down\n            if (EveMonClient.Closed || s_cacheList.Any())\n                return;\n            // Deserialize the file\n            var cache = LocalXmlCache.Load<SerializableEveIDToName>(Filename, true);\n            if (cache != null)\n                // Add the data to the cache\n                Import(cache.Entities.Select(entity => new SerializableCharacterNameListItem {\n                    ID = entity.ID,\n                    Name = entity.Name\n                }));\n            // For blank corporations and alliances\n            s_lookup.Prefill(0L, \"(None)\");\n        }\n        \n        /// <summary>\n        /// Imports the data from the query result.\n        /// </summary>\n        /// <param name=\"entities\">The entities.</param>\n        private static void Import(IEnumerable<SerializableCharacterNameListItem> entities)\n        {\n            foreach (var entity in entities)\n                s_lookup.Prefill(entity.ID, entity.Name);\n        }\n\n        /// <summary>\n        /// Every timer tick, checks whether we should save the list every 10s.\n        /// </summary>\n        private static Task UpdateOnOneSecondTickAsync()\n        {\n            // Is a save requested and is the last save older than 10s ?\n            if (s_savePending && DateTime.UtcNow > s_lastSaveTime.AddSeconds(10))\n                return SaveImmediateAsync();\n\n            return Task.CompletedTask;\n        }\n        \n        /// <summary>\n        /// Saves this cache list to a file.\n        /// </summary>\n        public static async Task SaveImmediateAsync()\n        {\n            // Save in file\n            await LocalXmlCache.SaveAsync(Filename, Util.SerializeToXmlDocument(Export()));\n\n            // Reset savePending flag\n            s_lastSaveTime = DateTime.UtcNow;\n            s_savePending = false;\n        }\n\n        /// <summary>\n        /// Exports the cache list to a serializable object.\n        /// </summary>\n        /// <returns></returns>\n        private static SerializableEveIDToName Export()\n        {\n            var serial = new SerializableEveIDToName();\n\n            lock (s_cacheList)\n            {\n                serial.Entities.AddRange(s_cacheList.Select(item =>\n                    new SerializableEveIDToNameListItem\n                    {\n                        ID = item.Key,\n                        // Should never be null, but better than crashing...\n                        Name = item.Value?.Value ?? EveMonConstants.UnknownText,\n                    }));\n            }\n\n            return serial;\n        }\n\n        #endregion\n\n\n        /// <summary>\n        /// Provides character, corp, or alliance ID to name conversion. Uses the combined\n        /// names endpoint.\n        /// </summary>\n        private sealed class GenericIDToNameProvider : IDToObjectProvider<string, string>\n        {\n            // Only this many IDs can be requested in one attempt\n            private const int MAX_IDS = 250;\n\n            public GenericIDToNameProvider(IDictionary<long, StringIDInfo> cacheList) :\n                base(cacheList) { }\n\n            protected override StringIDInfo CreateIDInfo(long id, string value)\n            {\n                return new GenericIDInformation(id, value);\n            }\n\n            protected override void FetchIDs()\n            {\n                var toDo = new LinkedList<long>();\n                lock (m_pendingIDs)\n                {\n                    // Take up to MAX_IDS of them, in sorted order\n                    var enumerator = m_pendingIDs.GetEnumerator();\n                    for (int i = 0; i < MAX_IDS && enumerator.MoveNext(); i++)\n                        toDo.AddLast(enumerator.Current.Key);\n                    foreach (long key in toDo)\n                    {\n                        m_pendingIDs.Remove(key);\n                        m_cache.TryGetValue(key, out StringIDInfo info);\n                        info?.OnRequestStart(null);\n                    }\n                }\n                string ids = \"[ \" + string.Join(\",\", toDo) + \" ]\";\n                // Given the number of IDs we are requesting, it is very unlikely that the\n                // eTag or expiration will be useful\n                EveMonClient.APIProviders.CurrentProvider.QueryEsi<EsiAPICharacterNames>(\n                    ESIAPIGenericMethods.CharacterName, OnQueryAPICharacterNameUpdated,\n                    new ESIParams()\n                    {\n                        PostData = ids\n                    });\n            }\n\n            private void OnQueryAPICharacterNameUpdated(EsiResult<EsiAPICharacterNames> result,\n                object ignore)\n            {\n                // Bail if there is an error\n                if (result.HasError)\n                    EveMonClient.Notifications.NotifyCharacterNameError(result);\n                else\n                {\n                    EveMonClient.Notifications.InvalidateAPIError();\n                    // This probably will never be false since we did not provide an etag\n                    if (result.HasData)\n                        lock (m_cache)\n                        {\n                            // Add resulting names to the cache; duplicates should not occur,\n                            // but guard against them defensively\n                            foreach (var namePair in result.Result)\n                            {\n                                m_cache.TryGetValue(namePair.ID, out StringIDInfo info);\n                                info?.OnRequestComplete(namePair.Name);\n                            }\n                        }\n                }\n                OnLookupComplete();\n            }\n\n            protected override string Prefetch(long id)\n            {\n                string name = null;\n\n                if (id == 0L)\n                    // Empty IDs are always \"unknown\"\n                    name = EveMonConstants.UnknownText;\n                else if (id < int.MaxValue && id > int.MinValue)\n                {\n                    int intId = (int)id;\n\n                    // Check NPC corporations\n                    var npcCorp = StaticGeography.GetCorporationByID(intId);\n                    if (npcCorp != null)\n                        name = npcCorp.Name;\n                    else\n                    {\n                        // Check NPC factions\n                        var npcFaction = StaticGeography.GetFactionByID(intId);\n                        if (npcFaction != null)\n                            name = npcFaction.Name;\n                    }\n                }\n                // Try filling with a current character identity or corporation/alliance\n                if (string.IsNullOrEmpty(name))\n                    foreach (var character in EveMonClient.Characters)\n                    {\n                        string corpName = character.CorporationName, allianceName = character.\n                            AllianceName;\n                        if (character.CharacterID == id)\n                        {\n                            name = character.Name;\n                            break;\n                        }\n                        if (character.CorporationID == id && !corpName.IsEmptyOrUnknown())\n                        {\n                            name = corpName;\n                            break;\n                        }\n                        if (character.AllianceID == id && !allianceName.IsEmptyOrUnknown())\n                        {\n                            name = allianceName;\n                            break;\n                        }\n                    }\n                return name;\n            }\n\n            protected override void TriggerEvent()\n            {\n                EveMonClient.OnEveIDToNameUpdated();\n                s_savePending = true;\n            }\n        }\n\n        /// <summary>\n        /// A simple implementation of IDInformation for maintaining ID state.\n        /// </summary>\n        private sealed class GenericIDInformation : IDInformation<string, string>\n        {\n            public long ID { get; }\n\n            public string Value { get; private set; }\n\n            /// <summary>\n            /// True if a request has been attempted, or false otherwise.\n            /// </summary>\n            private bool requested;\n\n            public GenericIDInformation(long id, string value)\n            {\n                ID = id;\n                Value = value;\n                requested = false;\n            }\n\n            public void OnRequestComplete(string result)\n            {\n                bool isBlank = string.IsNullOrWhiteSpace(result);\n                if (Value == null || !isBlank)\n                    // Avoid overwriting cached result with failed result\n                    Value = isBlank ? null : result;\n            }\n\n            public void OnRequestStart(string extra)\n            {\n                requested = true;\n            }\n\n            public bool RequestAttempted(string extra)\n            {\n                return requested;\n            }\n\n            public override string ToString()\n            {\n                return string.Format(\"{0:D} => {1}\", ID, Value);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Service/EveIDToStation.cs",
    "content": "#define HAMMERTIME\n\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.Serialization.Datafiles;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nusing HammertimeStructureList = System.Collections.Generic.Dictionary<string, EVEMon.Common.\n    Serialization.Hammertime.HammertimeStructure>;\nusing CitadelIDInfo = EVEMon.Common.Service.IDInformation<EVEMon.Common.Serialization.Eve.\n    SerializableOutpost, EVEMon.Common.Models.ESIKey>;\nusing System.Net;\n\nnamespace EVEMon.Common.Service\n{\n    /// <summary>\n    /// Converts citadel and NPC station IDs to the correct information (including names).\n    /// </summary>\n    public static class EveIDToStation\n    {\n        private const string Filename = \"ConquerableStationList\";\n\n        // Cache used to return all data, this is saved and loaded into the file\n        private static readonly Dictionary<long, CitadelIDInfo> s_cacheList =\n            new Dictionary<long, CitadelIDInfo>();\n        \n        // Provider for citadels\n        private static readonly CitadelStationProvider s_cita = new CitadelStationProvider(\n            s_cacheList);\n\n        private static bool s_savePending;\n        private static DateTime s_lastSaveTime;\n\n        /// <summary>\n        /// Static Constructor.\n        /// </summary>\n        static EveIDToStation()\n        {\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n        }\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event\n        /// data.</param>\n        private static async void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            await UpdateOnOneSecondTickAsync();\n        }\n        \n        /// <summary>\n        /// Gets the station information from its ID. Works on NPC stations and citadels.\n        /// Since conquerable stations were converted, no attempt is made to check the ESI\n        /// station endpoint online as all stations should (TM) be in the SDE...\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns>The station information</returns>\n        internal static Station GetIDToStation(long id, CCPCharacter character = null)\n        {\n            var station = StaticGeography.GetStationByID(id);\n            if (station == null && id > int.MaxValue)\n            {\n                // Citadels have ID over maximum int value\n                var serStation = s_cita.LookupIDESI(id, character);\n                if (serStation != null)\n                    station = new Station(serStation);\n                else\n                    station = Station.CreateInaccessible(id);\n            }\n            return station;\n        }\n        \n        /// <summary>\n        /// Initializes the cache from file.\n        /// </summary>\n        public static void InitializeFromFile()\n        {\n            // Quit if the client has been shut down\n            if (EveMonClient.Closed || s_cacheList.Any())\n                return;\n            var cache = LocalXmlCache.Load<SerializableStationList>(Filename, true);\n            // Add the data to the cache\n            if (cache != null)\n                Import(cache.Stations);\n        }\n        \n        /// <summary>\n        /// Imports the data from the query result.\n        /// </summary>\n        /// <param name=\"entities\">The entities.</param>\n        private static void Import(IEnumerable<SerializableOutpost> entities)\n        {\n            foreach (SerializableOutpost entity in entities)\n                s_cita.Prefill(entity.StationID, entity);\n        }\n\n        /// <summary>\n        /// Every timer tick, checks whether we should save the list every 10s.\n        /// \n        /// While this looks similar to EveIDToName.UpdateOnOneSecondTickAsync, the methods\n        /// are static, so there is little to gain by inheriting from an abstract superclass.\n        /// </summary>\n        private static Task UpdateOnOneSecondTickAsync()\n        {\n            // Is a save requested and is the last save older than 10s ?\n            if (s_savePending && DateTime.UtcNow > s_lastSaveTime.AddSeconds(10))\n                return SaveImmediateAsync();\n\n            return Task.CompletedTask;\n        }\n        \n        /// <summary>\n        /// Saves this cache list to a file.\n        /// </summary>\n        public static async Task SaveImmediateAsync()\n        {\n            // Save in file\n            await LocalXmlCache.SaveAsync(Filename, Util.SerializeToXmlDocument(Export()));\n\n            // Reset savePending flag\n            s_lastSaveTime = DateTime.UtcNow;\n            s_savePending = false;\n        }\n\n        /// <summary>\n        /// Exports the cache list to a serializable object.\n        /// </summary>\n        /// <returns></returns>\n        private static SerializableStationList Export()\n        {\n            var serial = new SerializableStationList();\n\n            lock (s_cacheList)\n            {\n                foreach (var station in s_cacheList.Values)\n                {\n                    var result = station.Value;\n                    // Only add stations which have been successfully fetched\n                    if (result != null)\n                        serial.Stations.Add(result);\n                }\n            }\n\n            return serial;\n        }\n        \n        /// <summary>\n        /// Provides citadel ID lookups. Uses the citadel info endpoint.\n        /// </summary>\n        private class CitadelStationProvider : IDToObjectProvider<SerializableOutpost, ESIKey>\n        {\n            public CitadelStationProvider(IDictionary<long, CitadelIDInfo> cacheList) :\n                base(cacheList)\n            {\n            }\n\n            protected override CitadelIDInfo CreateIDInfo(long id, SerializableOutpost value)\n            {\n                return new CitadelInfo(id, value);\n            }\n\n            protected override void FetchIDs()\n            {\n                long id = 0L;\n                ESIKey esiKey = null;\n\n                lock (m_pendingIDs)\n                {\n                    using (var it = m_pendingIDs.GetEnumerator())\n                    {\n                        // Fetch the next ID if it is available\n                        if (it.MoveNext())\n                        {\n                            id = it.Current.Key;\n                            esiKey = it.Current.Value;\n                            m_pendingIDs.Remove(id);\n                        }\n                    }\n                }\n                if (id != 0L)\n                {\n                    CitadelIDInfo info;\n                    lock (m_cache)\n                    {\n                        m_cache.TryGetValue(id, out info);\n                    }\n                    // info should never be null at this stage\n                    if (esiKey != null)\n                    {\n                        info.OnRequestStart(esiKey);\n                        // Query ESI for the citadel information\n                        // No response is given because requests are only made to ESI once per\n                        // key per session\n                        EveMonClient.APIProviders.CurrentProvider.QueryEsi<EsiAPIStructure>(\n                            ESIAPIGenericMethods.CitadelInfo, OnQueryStationUpdatedEsi,\n                            new ESIParams(null, esiKey.AccessToken)\n                            {\n                                ParamOne = id\n                            }, info);\n                        EveMonClient.Trace(\"ESI lookup for {0:D} using {1}\", id, esiKey);\n                    }\n#if HAMMERTIME\n                    else\n                        // Only run hammer if we did not try it already\n                        LoadCitadelInformationFromHammertimeAPI(info);\n#endif\n                }\n            }\n            \n#if HAMMERTIME\n            /// <summary>\n            /// Downloads citadel data from the Hammertime Citadel Hunt project.\n            /// Avoids some access and API key problems on private citadels.\n            /// </summary>\n            /// <param name=\"info\">The citadel ID information</param>\n            private void LoadCitadelInformationFromHammertimeAPI(CitadelIDInfo info)\n            {\n                var url = new Uri(string.Format(NetworkConstants.HammertimeCitadel, info.ID));\n                info.OnRequestStart(null);\n                Util.DownloadJsonAsync<HammertimeStructureList>(url).ContinueWith((task) =>\n                {\n                    OnQueryStationUpdated(task, info);\n                });\n            }\n\n            private void OnQueryStationUpdated(Task<JsonResult<HammertimeStructureList>>\n                result, CitadelIDInfo info)\n            {\n                JsonResult<HammertimeStructureList> jsonResult;\n                if (result.IsFaulted || (jsonResult = result.Result) == null)\n                    // Bail if there is an error\n                    EveMonClient.Notifications.NotifyCitadelQueryError(null);\n                else if (jsonResult.ResponseCode == (int)HttpStatusCode.NotFound)\n                    // \"Not Found\" = citadel destroyed\n                    info.OnRequestComplete(null);\n                else if (jsonResult.HasError)\n                {\n                    // Provide some more debugging info with the actual failed response\n                    var fakeResult = new EsiResult<EsiAPIStructure>(jsonResult.Response);\n                    EveMonClient.Notifications.NotifyCitadelQueryError(fakeResult);\n                }\n                else\n                {\n                    EveMonClient.Notifications.InvalidateAPIError();\n                    // Should only have one result, with an integer key\n                    var hammerData = jsonResult.Result;\n                    if (hammerData.Count == 1)\n                        info.OnRequestComplete(hammerData.Values.First().ToXMLItem(info.ID));\n                    else\n                    {\n                        EveMonClient.Trace(\"Citadel Hunt failed for {0:D}\", info.ID);\n                        info.OnRequestComplete(null);\n                    }\n                }\n                OnLookupComplete();\n            }\n#endif\n\n            private void OnQueryStationUpdatedEsi(EsiResult<EsiAPIStructure> result,\n                object reqInfo)\n            {\n                var info = reqInfo as CitadelIDInfo;\n                if (info == null)\n                    throw new ArgumentException(\"Invalid argument for citadel ID info\");\n                // Try hammertime if there is an error\n                if (result.HasError)\n                {\n#if HAMMERTIME\n                    LoadCitadelInformationFromHammertimeAPI(info);\n#else\n                    if (result.ResponseCode != (int)HttpStatusCode.NotFound)\n                        EveMonClient.Notifications.NotifyCitadelQueryError(result);\n                    info.OnRequestComplete(null);\n#endif\n                }\n                else\n                {\n                    EveMonClient.Notifications.InvalidateAPIError();\n                    info.OnRequestComplete(result.Result.ToXMLItem(info.ID));\n                }\n                OnLookupComplete();\n            }\n\n            /// <summary>\n            /// Convert the ID to an object.\n            /// </summary>\n            /// <param name=\"id\">The ID</param>\n            /// <param name=\"character\">The character making the request</param>\n            /// <param name=\"bypass\">true to bypass the Prefetch filter, or false (default) to\n            /// use it (recommended in most cases)</param>\n            /// <returns>The object, or null if no item with this ID exists</returns>\n            public SerializableOutpost LookupIDESI(long id, CCPCharacter character, bool\n                bypass = false)\n            {\n                var key = character?.Identity?.FindAPIKeyWithAccess(ESIAPICharacterMethods.\n                    CitadelInfo);\n                return LookupID(id, bypass, key);\n            }\n            \n            protected override void TriggerEvent()\n            {\n                EveMonClient.OnConquerableStationListUpdated();\n                s_savePending = true;\n            }\n        }\n\n        /// <summary>\n        /// A class storing the state of an ESI/Hammertime station request, and if it failed,\n        /// the methods which have been tried so far.\n        /// </summary>\n        private sealed class CitadelInfo : IDInformation<SerializableOutpost, ESIKey>\n        {\n            public long ID { get; }\n\n            /// <summary>\n            /// The station result if successful.\n            /// </summary>\n            public SerializableOutpost Value { get; private set; }\n\n            /// <summary>\n            /// The ESI keys which have already been tried.\n            /// </summary>\n            private readonly ISet<ESIKey> esiAttempts;\n\n            /// <summary>\n            /// True if hammertime was tried.\n            /// </summary>\n            private bool hammerAttempt;\n\n            /// <summary>\n            /// Constructor around an existing citadel result.\n            /// </summary>\n            /// <param name=\"id\">The citadel ID.</param>\n            /// <param name=\"station\">The citadel value fetched.</param>\n            public CitadelInfo(long id, SerializableOutpost station)\n            {\n                esiAttempts = new HashSet<ESIKey>();\n                hammerAttempt = false;\n                ID = id;\n                Value = station;\n            }\n\n            public void OnRequestComplete(SerializableOutpost result)\n            {\n                if (Value == null || result != null)\n                    // Avoid overwriting cached result with failed result\n                    Value = result;\n            }\n\n            public void OnRequestStart(ESIKey extra)\n            {\n                if (extra == null)\n                    hammerAttempt = true;\n                else\n                    esiAttempts.Add(extra);\n            }\n\n            public bool RequestAttempted(ESIKey extra)\n            {\n                if (extra == null)\n                    return hammerAttempt;\n                else\n                    return esiAttempts.Contains(extra);\n            }\n\n            public override string ToString()\n            {\n                return string.Format(\"{0:D} => {1}\", ID, Value);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Service/EveNotificationType.cs",
    "content": "﻿using EVEMon.Common.Constants;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.Serialization.Eve;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.Common.Service\n{\n    public static class EveNotificationType\n    {\n        private static Dictionary<int, SerializableNotificationRefTypesListItem> s_notificationRefTypes =\n            new Dictionary<int, SerializableNotificationRefTypesListItem>(128);\n        private static DateTime s_cachedUntil;\n        private static DateTime s_nextCheckTime;\n        private static bool s_queryPending;\n        private static bool s_loaded;\n\n        private const string Filename = \"NotificationRefTypes\";\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the description of the notification type.\n        /// </summary>\n        /// <param name=\"typeID\">The type ID.</param>\n        /// <returns></returns>\n        internal static string GetName(int typeID)\n        {\n            EnsureLoaded();\n            SerializableNotificationRefTypesListItem type;\n            s_notificationRefTypes.TryGetValue(typeID, out type);\n            return type?.TypeName ?? EveMonConstants.UnknownText;\n        }\n\n        /// <summary>\n        /// Gets the ID of the notification.\n        /// </summary>\n        /// <param name=\"typeID\">The type name.</param>\n        /// <returns>The type ID.</returns>\n        internal static int GetID(string name)\n        {\n            int id;\n            EnsureLoaded();\n            var type = s_notificationRefTypes.Values.FirstOrDefault(x => x.TypeCode?.Equals(\n                name, StringComparison.InvariantCultureIgnoreCase) ?? false);\n            if (type != null)\n                // Found in ref types XML\n                id = type.TypeID;\n            else if (name == null)\n                // Invalid\n                id = 0;\n            else\n            {\n                // Create a template notification type; this will probably be disabled once all\n                // of the unknown notifications are coded\n                int newkey = s_notificationRefTypes.Keys.Max() + 1;\n                string subject = Regex.Replace(name, \"([A-Z]*)([A-Z][^A-Z$])\", \"$1 $2\").Trim();\n\n                s_notificationRefTypes.Add(newkey, new SerializableNotificationRefTypesListItem()\n                {\n                    SubjectLayout = subject,\n                    TypeID = newkey,\n                    TypeCode = name,\n                    TextLayout = \"\",\n                    TypeName = name\n                });\n                id = newkey;\n            }\n            return id;\n        }\n\n        /// <summary>\n        /// Gets the subject layout.\n        /// </summary>\n        /// <param name=\"typeID\">The type identifier.</param>\n        /// <returns></returns>\n        internal static string GetSubjectLayout(int typeID)\n        {\n            EnsureLoaded();\n\n            SerializableNotificationRefTypesListItem type;\n            s_notificationRefTypes.TryGetValue(typeID, out type);\n            return type?.SubjectLayout ?? EveMonConstants.UnknownText;\n        }\n\n        /// <summary>\n        /// Gets the text layout.\n        /// </summary>\n        /// <param name=\"typeID\">The type identifier.</param>\n        /// <returns></returns>\n        internal static string GetTextLayout(int typeID)\n        {\n            if (EveMonClient.IsDebugBuild)\n                EnsureInitialized();\n            else\n                EnsureImportation();\n\n            SerializableNotificationRefTypesListItem type;\n            s_notificationRefTypes.TryGetValue(typeID, out type);\n            return type?.TextLayout ?? string.Empty;\n        }\n\n        #endregion\n\n\n        #region Importation\n\n        /// <summary>\n        /// Ensrues the notification types data has been loaded from the proper source.\n        /// </summary>\n        private static void EnsureLoaded()\n        {\n            /*if (EveMonClient.IsDebugBuild)\n                EnsureInitialized();\n            else\n                EnsureImportation();*/\n            // Unable to find notification ref types in the SDE, and ESI has swapped from the\n            // old ints to a new naming scheme. Updated the definition of the ref types XML\n            // and use only the local version...\n            EnsureInitialized();\n        }\n\n        /// <summary>\n        /// Ensures the notification types data have been intialized.\n        /// </summary>\n        private static void EnsureInitialized()\n        {\n            if (s_loaded)\n                return;\n\n            var result = Util.DeserializeAPIResultFromString<SerializableNotificationRefTypes>(\n                Properties.Resources.NotificationRefTypes, APIProvider.RowsetsTransform);\n\n            Import(result.Result);\n        }\n\n        /// <summary>\n        /// Ensures the importation.\n        /// </summary>\n        private static void EnsureImportation()\n        {\n            // Quit if we already checked a minute ago or query is pending\n            if (s_nextCheckTime > DateTime.UtcNow || s_queryPending)\n                return;\n            s_nextCheckTime = DateTime.UtcNow.AddMinutes(1);\n            var info = LocalXmlCache.GetFileInfo(Filename);\n            var result = LocalXmlCache.Load<SerializableNotificationRefTypes>(Filename, true);\n            // Update the file if we don't have it or the data have expired\n            if (result == null || (s_loaded && s_cachedUntil < DateTime.UtcNow))\n                Task.WhenAll(UpdateFileAsync());\n            else if (!s_loaded)\n            {\n                s_cachedUntil = info.Exists ? info.LastWriteTimeUtc.AddDays(1) : DateTime.\n                    MinValue;\n                if (result == null)\n                    s_nextCheckTime = DateTime.UtcNow;\n                else\n                    // Import the data\n                    Import(result);\n            }\n        }\n\n        /// <summary>\n        /// Imports the specified result.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private static void Import(SerializableNotificationRefTypes result)\n        {\n            if (result == null)\n                EveMonClient.Trace(\"Could not load notification types\");\n            else\n            {\n                foreach (var refType in result.Types)\n                {\n                    int id = refType.TypeID;\n                    if (!s_notificationRefTypes.ContainsKey(id))\n                        s_notificationRefTypes.Add(id, refType);\n                }\n                s_loaded = true;\n            }\n        }\n\n        /// <summary>\n        /// Updates the file.\n        /// </summary>\n        private static async Task UpdateFileAsync()\n        {\n            // Quit if query is pending\n            if (!s_queryPending)\n            {\n                var url = new Uri(NetworkConstants.BitBucketWikiBase +\n                    NetworkConstants.NotificationRefTypes);\n                s_queryPending = true;\n\n                var result = await Util.DownloadAPIResultAsync<SerializableNotificationRefTypes>(\n                    url, new RequestParams()\n                    {\n                        AcceptEncoded = true\n                    }, transform: APIProvider.RowsetsTransform);\n                OnDownloaded(result);\n            }\n        }\n\n        /// <summary>\n        /// Processes the queried notification ref type.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private static void OnDownloaded(CCPAPIResult<SerializableNotificationRefTypes> result)\n        {\n            s_queryPending = false;\n            if (!string.IsNullOrEmpty(result.ErrorMessage))\n            {\n                EveMonClient.Trace(\"Error loading notification types: \" + result.ErrorMessage);\n                // Fallback\n                EnsureInitialized();\n            }\n            else\n            {\n                s_cachedUntil = DateTime.UtcNow.AddDays(1);\n                Import(result.Result);\n                EveMonClient.OnNotificationRefTypesUpdated();\n                // Save the file in cache\n                LocalXmlCache.SaveAsync(Filename, result.XmlDocument).ConfigureAwait(false);\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Service/EveRefType.cs",
    "content": "using EVEMon.Common.Constants;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.Serialization.Eve;\nusing System.Collections.Generic;\n\nnamespace EVEMon.Common.Service\n{\n    public static class EveRefType\n    {\n        private static Dictionary<int, SerializableRefTypesListItem> s_refTypes =\n            new Dictionary<int, SerializableRefTypesListItem>(128);\n        private static bool s_loaded;\n\n        #region Importation\n\n        /// <summary>\n        /// Ensures the list has been imported.\n        /// </summary>\n        private static void EnsureImportation()\n        {\n            // Exit if we have already imported the list or are currently querying\n            if (s_loaded)\n                return;\n\n            CCPAPIResult<SerializableAPIRefTypes> result =\n                Util.DeserializeAPIResultFromString<SerializableAPIRefTypes>(Properties.Resources.RefTypes,\n                APIProvider.RowsetsTransform);\n\n            foreach (var type in result.Result.RefTypes)\n            {\n                int id = type.ID;\n                if (!s_refTypes.ContainsKey(id))\n                    s_refTypes.Add(id, type);\n            }\n\n            s_loaded = true;\n        }\n        \n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the name of the provided refTypeID.\n        /// </summary>\n        /// <param name=\"refTypeID\">The ref type ID.</param>\n        /// <returns></returns>\n        public static string GetRefTypeIDToName(int refTypeID)\n        {\n            EnsureImportation();\n\n            SerializableRefTypesListItem refType;\n            s_refTypes.TryGetValue(refTypeID, out refType);\n            return refType?.Name ?? EveMonConstants.UnknownText;\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Service/IDToObjectProvider.cs",
    "content": "﻿using EVEMon.Common.Extensions;\nusing EVEMon.Common.Serialization.Esi;\nusing System.Collections.Generic;\n\nnamespace EVEMon.Common.Service\n{\n    /// <summary>\n    /// A class used to provide ID lookup services.\n    /// </summary>\n    internal abstract class IDToObjectProvider<T, X> where T : class where X : class\n    {\n        /// <summary>\n        /// Reference to the master cache list.\n        /// </summary>\n        protected readonly IDictionary<long, IDInformation<T, X>> m_cache;\n\n        /// <summary>\n        /// List of IDs awaiting query. No duplicates allowed, and in ascending order for\n        /// the picky API calls that need it that way.\n        /// </summary>\n        protected readonly SortedDictionary<long, X> m_pendingIDs;\n\n        /// <summary>\n        /// Is a query currently running?\n        /// </summary>\n        protected volatile bool m_queryPending;\n\n        protected IDToObjectProvider(IDictionary<long, IDInformation<T, X>> cache)\n        {\n            cache.ThrowIfNull(nameof(cache));\n\n            m_cache = cache;\n            m_pendingIDs = new SortedDictionary<long, X>();\n            m_queryPending = false;\n        }\n\n        /// <summary>\n        /// Creates a new IDInformation object for this provider.\n        /// </summary>\n        /// <param name=\"id\">The ID which needs information.</param>\n        /// <param name=\"value\">The prefilled/prefetched value, or default(T) if it is not\n        /// yet known</param>\n        /// <returns>A new instance of ID information for the specified ID.</returns>\n        protected abstract IDInformation<T, X> CreateIDInfo(long id, T value);\n\n        /// <summary>\n        /// Evict as many IDs as can be handled at once from m_pendingIDs and update\n        /// m_cache with the new mappings. Call OnLookupComplete in callback.\n        /// </summary>\n        protected abstract void FetchIDs();\n\n        /// <summary>\n        /// Checks (without locking) to see if the ID needs to be queried. Inserts a new\n        /// record into the table if needed with blank information.\n        /// </summary>\n        /// <param name=\"id\">The ID to check.</param>\n        /// <param name=\"extra\">The data to use while making the request.</param>\n        /// <param name=\"value\">The result which is currently known for this ID.</param>\n        /// <returns>true if the ID needs to be queried, or false otherwise</returns>\n        private bool IsNeeded(long id, X extra, out T value)\n        {\n            bool needsUpdate;\n            IDInformation<T, X> currentInfo;\n            m_cache.TryGetValue(id, out currentInfo);\n            if (currentInfo != null)\n            {\n                // Check if request was attempted\n                needsUpdate = !currentInfo.RequestAttempted(extra);\n                value = currentInfo.Value;\n            }\n            else\n            {\n                // Never seen before, force an update\n                needsUpdate = true;\n                value = default(T);\n                m_cache.Add(id, CreateIDInfo(id, value));\n            }\n            return needsUpdate;\n        }\n\n        /// <summary>\n        /// Convert the ID to an object.\n        /// </summary>\n        /// <param name=\"id\">The ID (type depends on implementation)</param>\n        /// <param name=\"bypass\">true to bypass the Prefetch filter, or false (default) to\n        /// use it (recommended in most cases)</param>\n        /// <returns>The object, or null if no item with this ID exists</returns>\n        public T LookupID(long id, bool bypass = false)\n        {\n            return LookupID(id, bypass, default(X));\n        }\n\n        /// <summary>\n        /// Convert the ID to an object. This is the raw version of LookupID which accepts the\n        /// value of X provided by a subclass that uses the parameter.\n        /// </summary>\n        /// <param name=\"id\">The ID (type depends on implementation)</param>\n        /// <param name=\"bypass\">true to bypass the Prefetch filter, or false to use it\n        /// (recommended in most cases)</param>\n        /// <param name=\"extra\">The extra data to associate with this request</param>\n        /// <returns>The object, or null if no item with this ID exists</returns>\n        protected T LookupID(long id, bool bypass, X extra)\n        {\n            T value;\n            bool needsUpdate;\n            // Thread safety\n            lock (m_cache)\n            {\n                // Queue update if necessary\n                needsUpdate = (bypass || (value = Prefetch(id)) == default(T)) && IsNeeded(id,\n                    extra, out value) && QueueID(id, extra);\n            }\n            if (needsUpdate)\n                // No query running and a new one needs to be started; note that new queries\n                // will be started even for IDs in the cache if they need to be updated\n                TryFetchIDs();\n            return value;\n        }\n\n        /// <summary>\n        /// Convert the IDs to objects.\n        /// </summary>\n        /// <param name=\"id\">The ID (type depends on implementation)</param>\n        /// <returns>The objects, with null for each item where no match exists</returns>\n        public IEnumerable<T> LookupAllID(IEnumerable<long> ids)\n        {\n            T value;\n            bool start = false;\n            var ret = new LinkedList<T>();\n            // Thread safety\n            lock (m_cache)\n            {\n                foreach (var id in ids)\n                {\n                    // Queue update if necessary\n                    if ((value = Prefetch(id)) == default(T) && IsNeeded(id, default(X),\n                        out value) && QueueID(id)) start = true;\n                    ret.AddLast(value);\n                }\n            }\n            // One query for many IDs\n            if (start)\n                TryFetchIDs();\n            return ret;\n        }\n\n        /// <summary>\n        /// Called by subclasses when an ID lookup completes, whether entries remain or not.\n        /// </summary>\n        protected void OnLookupComplete()\n        {\n            bool done = false;\n\n            // No more?\n            lock (m_pendingIDs)\n            {\n                done = m_pendingIDs.Count <= 0;\n                if (done)\n                    m_queryPending = false;\n            }\n\n            if (done)\n                // Tell everyone we have updates\n                TriggerEvent();\n            else\n                // Go again\n                TryFetchIDs();\n        }\n\n        /// <summary>\n        /// Called before any item is added to the queue; if the item can be resolved locally\n        /// with no cache lookup cheaply, this method should do it.\n        /// </summary>\n        /// <param name=\"id\">The ID.</param>\n        /// <returns>The value that should be returned for this ID, or null if no local match\n        /// is found.</returns>\n        protected virtual T Prefetch(long id)\n        {\n            return default(T);\n        }\n\n        /// <summary>\n        /// Adds a predefined ID and object to this provider. It will add the entry to the\n        /// cache and mark it as requested so that this ID will not be sent upstream.\n        /// </summary>\n        /// <param name=\"id\">The ID.</param>\n        /// <param name=\"value\">The value that should be returned for this ID.</param>\n        public void Prefill(long id, T value)\n        {\n            var info = CreateIDInfo(id, value);\n            // Overwrite if it exists\n            if (m_cache.ContainsKey(id))\n                m_cache[id] = info;\n            else\n                m_cache.Add(id, info);\n        }\n\n        /// <summary>\n        /// Starts querying for an ID lookup with whatever is in the list.\n        /// </summary>\n        private bool QueueID(long id, X extra = null)\n        {\n            // Need to add to the requirements list\n            bool startQuery = false;\n\n            lock (m_pendingIDs)\n            {\n                if (m_pendingIDs.ContainsKey(id))\n                {\n                    // If there is an entry without a value, add the extra value\n                    if (extra != null && m_pendingIDs[id] == null)\n                        m_pendingIDs[id] = extra;\n                }\n                else\n                    m_pendingIDs.Add(id, extra);\n\n                if (!m_queryPending)\n                {\n                    m_queryPending = true;\n                    startQuery = true;\n                }\n            }\n\n            return startQuery;\n        }\n\n        /// <summary>\n        /// Triggers the proper EVEMon event when updates are completed.\n        /// </summary>\n        protected abstract void TriggerEvent();\n\n        /// <summary>\n        /// Only fetches IDs from the server if there are not too many ESI errors.\n        /// </summary>\n        private void TryFetchIDs()\n        {\n            if (EsiErrors.IsErrorCountExceeded)\n                OnLookupComplete();\n            else\n                FetchIDs();\n        }\n    }\n\n    /// <summary>\n    /// Describes an object with information about an ID and what has been done to attempt it.\n    /// </summary>\n    internal interface IDInformation<T, X> where T : class where X : class\n    {\n        /// <summary>\n        /// The ID which was used to fetch this information.\n        /// </summary>\n        long ID { get; }\n\n        /// <summary>\n        /// The information retrieved, or default(T) if the request has failed or not yet\n        /// been attempted.\n        /// </summary>\n        T Value { get; }\n\n        /// <summary>\n        /// Called when a request completes or fails.\n        /// </summary>\n        /// <param name=\"result\">The request result, or default(T) if it failed.</param>\n        void OnRequestComplete(T result);\n\n        /// <summary>\n        /// Called when a request begins for the specified ID.\n        /// </summary>\n        /// <param name=\"extra\">The extra data to be used on the request.</param>\n        void OnRequestStart(X extra);\n\n        /// <summary>\n        /// Returns true if a request was already attempted using this information. If true,\n        /// another request will not be attempted (unless the request is currently in the\n        /// queue).\n        /// \n        /// Should return false if the ID was loaded from a cache.\n        /// </summary>\n        /// <param name=\"extra\">The extra information to use for the request.</param>\n        /// <returns>Whether a request was attempted already in this session.</returns>\n        bool RequestAttempted(X extra);\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Service/ISSOWebServer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.Common.Service\n{\n    /// <summary>\n    /// The parent of both implementations for SSOWebServer.\n    /// \n    /// SSO was really meant for web apps so this is the best we can do...\n    /// </summary>\n    interface ISSOWebServer : IDisposable\n    {\n        /// <summary>\n        /// Asynchronously waits for an auth code in the background.\n        /// </summary>\n        /// <param name=\"state\">The SSO state used.</param>\n        /// <param name=\"callback\">The callback which will be invoked when the code is\n        /// received, reception fails, or the server is stopped.</param>\n        void BeginWaitForCode(string state, Action<Task<string>> callback);\n\n        /// <summary>\n        /// Starts the web server.\n        /// </summary>\n        void Start();\n\n        /// <summary>\n        /// Stops the web server.\n        /// </summary>\n        void Stop();\n\n        /// <summary>\n        /// Waits for the auth code asynchronously; the reported state must match the argument.\n        /// </summary>\n        /// <param name=\"state\">The SSO state.</param>\n        /// <returns>The token received, or null if none was received.</returns>\n        Task<string> WaitForCodeAsync(string state);\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Service/ImageService.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Drawing.Imaging;\nusing System.IO;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Net;\n\nnamespace EVEMon.Common.Service\n{\n    public static class ImageService\n    {\n        /// <summary>\n        /// Gets the image server base URI.\n        /// </summary>\n        /// <param name=\"path\">The path.</param>\n        /// <returns></returns>\n        public static Uri GetImageServerBaseUri(string path) => new Uri(\n            NetworkConstants.EVEImageServerBase + path);\n\n        /// <summary>\n        /// Asynchronously downloads a character portrait from its ID.\n        /// </summary>\n        /// <param name=\"charId\"></param>\n        internal static async Task<Image> GetCharacterImageAsync(long charId)\n        {\n            string path = string.Format(CultureConstants.InvariantCulture,\n                NetworkConstants.CCPPortraits, charId, (int)EveImageSize.x128);\n\n            return await GetImageAsync(GetImageServerBaseUri(path), false).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Asynchronously downloads an alliance image.\n        /// </summary>\n        /// <param name=\"pictureBox\">The picture box.</param>\n        /// <param name=\"allianceID\">The alliance ID.</param>\n        public static Task GetAllianceImageAsync(PictureBox pictureBox, long allianceID)\n        {\n            string path = string.Format(CultureConstants.InvariantCulture, NetworkConstants.\n                CCPAllianceLogo, allianceID, pictureBox.Width);\n            return GetImageAsync(pictureBox, path);\n        }\n\n        /// <summary>\n        /// Asynchronously downloads a corporation image.\n        /// </summary>\n        /// <param name=\"pictureBox\">The picture box.</param>\n        /// <param name=\"corporationID\">The corporation ID.</param>\n        public static Task GetCorporationImageAsync(PictureBox pictureBox, long corporationID)\n        {\n            string path = string.Format(CultureConstants.InvariantCulture, NetworkConstants.\n                CCPCorporationLogo, corporationID, pictureBox.Width);\n            return GetImageAsync(pictureBox, path);\n        }\n\n        /// <summary>\n        /// Called when image gets downloaded.\n        /// </summary>\n        /// <param name=\"pictureBox\">The picture box.</param>\n        /// <param name=\"path\">The path.</param>\n        private static async Task GetImageAsync(PictureBox pictureBox, string path)\n        {\n            Image image = await GetImageAsync(GetImageServerBaseUri(path)).ConfigureAwait(false);\n            pictureBox.Image = image ?? pictureBox.InitialImage;\n            pictureBox.Update();\n        }\n\n        /// <summary>\n        /// Asynchronously downloads an image from the provided url.\n        /// </summary>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"useCache\">if set to <c>true</c> [use cache].</param>\n        public static async Task<Image> GetImageAsync(Uri url, bool useCache = true)\n        {\n            DownloadResult<Image> result;\n\n            // Cache not to be used ?\n            if (!useCache)\n            {\n                result = await HttpWebClientService.DownloadImageAsync(url).ConfigureAwait(false);\n                return GetImage(result);\n            }\n\n            Image image = GetImageFromCache(GetCacheName(url));\n            if (image != null)\n                return image;\n\n            // Downloads the image and adds it to cache\n            result = await HttpWebClientService.DownloadImageAsync(url).ConfigureAwait(false);\n            image = GetImage(result);\n\n            if (image != null)\n                await AddImageToCacheAsync(image, GetCacheName(url)).ConfigureAwait(false);\n\n            return image;\n        }\n\n        /// <summary>\n        /// Asynchronously gets the character image from cache.\n        /// </summary>\n        /// <param name=\"filename\">The filename.</param>\n        /// <param name=\"directory\">The directory.</param>\n        /// <returns></returns>\n        internal static Image GetImageFromCache(string filename, string directory = null)\n        {\n            // First check whether the image exists in cache\n            EveMonClient.EnsureCacheDirInit();\n            string cacheFileName = Path.Combine(directory ?? EveMonClient.EVEMonImageCacheDir,\n                filename);\n\n            if (!File.Exists(cacheFileName))\n                return null;\n\n            try\n            {\n                // Load the data into a MemoryStream before returning the image to avoid file\n                // locking\n                Image image;\n                byte[] imageBytes = File.ReadAllBytes(cacheFileName);\n                using (MemoryStream stream = new MemoryStream(imageBytes))\n                {\n                    image = Image.FromStream(stream);\n                }\n                return image;\n            }\n            catch (ArgumentException e)\n            {\n                ExceptionHandler.LogException(e, false);\n                FileHelper.DeleteFile(cacheFileName);\n            }\n            catch (IOException e)\n            {\n                ExceptionHandler.LogException(e, false);\n            }\n            catch (UnauthorizedAccessException e)\n            {\n                ExceptionHandler.LogException(e, false);\n            }\n\n            return null;\n        }\n\n        /// <summary>\n        /// Callback used when images are downloaded.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private static Image GetImage(DownloadResult<Image> result)\n        {\n            if (result.Error == null)\n                return result.Result;\n\n            if (result.Error.Status == HttpWebClientServiceExceptionStatus.Timeout)\n                EveMonClient.Trace(result.Error.Message);\n            else\n                ExceptionHandler.LogException(result.Error, true);\n\n            return null;\n        }\n\n        /// <summary>\n        /// Adds the image to the cache.\n        /// </summary>\n        /// <param name=\"image\">The image.</param>\n        /// <param name=\"filename\">The filename.</param>\n        /// <param name=\"directory\">The directory.</param>\n        /// <returns></returns>\n        internal static async Task AddImageToCacheAsync(Image image, string filename,\n            string directory = null)\n        {\n            // Saves the image file\n            try\n            {\n                // Write this image to the cache file\n                EveMonClient.EnsureCacheDirInit();\n                string cacheFileName = Path.Combine(directory ?? EveMonClient.\n                    EVEMonImageCacheDir, filename);\n                await FileHelper.OverwriteOrWarnTheUserAsync(cacheFileName,\n                    async fs =>\n                    {\n                        ((Image)image.Clone()).Save(fs, ImageFormat.Png);\n                        await fs.FlushAsync();\n                        return true;\n                    }).ConfigureAwait(false);\n            }\n            catch (IOException ex)\n            {\n                // Anything but \"file in use\"\n                if (ex.HResult != -2147024864)\n                    ExceptionHandler.LogException(ex, true);\n            }\n            catch (Exception ex)\n            {\n                ExceptionHandler.LogRethrowException(ex);\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// From a given url, computes a cache file name.\n        /// </summary>\n        private static string GetCacheName(Uri url)\n        {\n            Stream stream = Util.GetMemoryStream(Encoding.UTF8.GetBytes(url.AbsoluteUri));\n            string md5Sum = Util.CreateMD5(stream);\n            // Extensions are no longer part of the requested URLs\n            return string.Concat(md5Sum, \".png\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Service/LocalXmlCache.cs",
    "content": "using EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing System;\nusing System.IO;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Xml;\nusing System.Xml.XPath;\n\nnamespace EVEMon.Common.Service\n{\n    /// <summary>\n    /// Represents the cache for the XML files downloaded from CCP. \n    /// </summary>\n    public static class LocalXmlCache\n    {\n        private static readonly object s_syncLock = new object();\n\n        /// <summary>\n        /// Gets the <see cref=\"System.IO.FileInfo\" /> for the specified filename.\n        /// </summary>\n        /// <param name=\"filename\">The filename.</param>\n        /// <returns></returns>\n        public static FileInfo GetFileInfo(string filename)\n        {\n            lock (s_syncLock)\n            {\n                EveMonClient.EnsureCacheDirInit();\n\n                return new FileInfo(Path.Combine(EveMonClient.EVEMonXmlCacheDir, $\"{filename}.xml\"));\n            }\n        }\n\n        /// <summary>\n        /// Gets the character XML.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static IXPathNavigable GetCharacterXml(Character character)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            EveMonClient.EnsureCacheDirInit();\n\n            XmlDocument doc = new XmlDocument();\n            doc.Load(Path.Combine(EveMonClient.EVEMonXmlCacheDir, $\"{character.Name}.xml\"));\n            return doc;\n        }\n\n        /// <summary>\n        /// Gets the URI for the cached xml for the given character.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        [Obsolete]\n        internal static Uri GetCharacterUri(Character character)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            EveMonClient.EnsureCacheDirInit();\n\n            return new Uri(Path.Combine(EveMonClient.EVEMonXmlCacheDir, $\"{character.Name}.xml\"));\n        }\n\n        /// <summary>\n        /// Loads CCP API XML data from a file.\n        /// </summary>\n        /// <typeparam name=\"T\">The type of data to parse</typeparam>\n        /// <param name=\"filename\">The filename.</param>\n        /// <param name=\"deleteOnFail\">If true, the file will be deleted automatically if\n        /// the parsing failed.</param>\n        /// <returns>The parsed object, or null if the file could not be opened.</returns>\n        public static T Load<T>(string filename, bool deleteOnFail = false) where T : class\n        {\n            string fileName;\n            var info = GetFileInfo(filename);\n            T parsed = null;\n            if (info != null && File.Exists(fileName = info.FullName))\n            {\n                parsed = Util.DeserializeXmlFromFile<T>(info.FullName, APIProvider.\n                    RowsetsTransform);\n                // Delete file if parsing failed\n                if (parsed == null && deleteOnFail)\n                {\n                    EveMonClient.Trace(\"Failed to load data from file \" + filename +\n                        \"; deleting file\");\n                    File.Delete(fileName);\n                }\n            }\n            return parsed;\n        }\n\n        /// <summary>\n        /// The preferred way to save - this should be a <see cref=\"System.Xml.XmlDocument\" /> straight from CCP.\n        /// </summary>\n        /// <param name=\"filename\">The filename.</param>\n        /// <param name=\"xdoc\">The xml to save.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static async Task SaveAsync(string filename, IXPathNavigable xdoc)\n        {\n            xdoc.ThrowIfNull(nameof(xdoc));\n\n            EveMonClient.EnsureCacheDirInit();\n\n            XmlDocument xmlDoc = (XmlDocument)xdoc;\n            XmlNode characterNode = xmlDoc.SelectSingleNode(\"//name\");\n            filename = characterNode?.InnerText ?? filename;\n\n            // Writes in the target file\n            string fileName = Path.Combine(EveMonClient.EVEMonXmlCacheDir, $\"{filename}.xml\");\n            string content = Util.GetXmlStringRepresentation(xdoc);\n            await FileHelper.OverwriteOrWarnTheUserAsync(fileName,\n                async fs =>\n                {\n                    using (StreamWriter writer = new StreamWriter(fs, Encoding.UTF8))\n                    {\n                        await writer.WriteAsync(content);\n                        await writer.FlushAsync();\n                        await fs.FlushAsync();\n                    }\n                    return true;\n                });\n        }\n\n        /// <summary>\n        /// Deletes the given filename.\n        /// </summary>\n        ///\n        /// <param name=\"filename\"> The filename. </param>\n        public static void Delete(string filename)\n        {\n            EveMonClient.EnsureCacheDirInit();\n\n            // Writes in the target file\n            string fileName = Path.Combine(EveMonClient.EVEMonXmlCacheDir, $\"{filename}.xml\");\n            FileHelper.DeleteFile(fileName);\n        }\n\n        /// <summary>\n        /// Check if file is downloaded and up to date.\n        /// </summary>\n        /// <param name=\"filename\">The filename.</param>\n        /// <param name=\"updateTime\">The update time.</param>\n        /// <param name=\"period\">The period.</param>\n        /// <returns>\n        /// True if file is up to date, False otherwise\n        /// </returns>\n        internal static bool CheckFileUpToDate(string filename, DateTime updateTime,\n            TimeSpan period)\n        {\n            FileInfo file = GetFileInfo(filename);\n            DateTime previousUpdateTime = updateTime.Subtract(period);\n\n            // File is already downloaded ?\n            if (!File.Exists(file.FullName))\n                return false;\n\n            var lastMod = file.LastWriteTimeUtc;\n            // Is it up to date ?\n            // (file is updated after the update time or was updated between the previous day\n            // update time and today's update time and its not time to update yet) ?\n            return lastMod > updateTime || (lastMod > previousUpdateTime && lastMod <\n                updateTime && DateTime.UtcNow < updateTime);\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Service/SSOAuthenticationService.cs",
    "content": "﻿using EVEMon.Common.Constants;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Threading;\nusing System;\nusing System.IdentityModel.Tokens.Jwt;\nusing System.Net;\nusing System.Net.Http;\nusing System.Runtime.Serialization;\nusing System.Security.Cryptography;\nusing System.Text;\n\nnamespace EVEMon.Common.Service\n{\n    /// <summary>\n    /// Uses the built-in TcpListener class to create a server to receive responses for SSO\n    /// authentication.\n    /// </summary>\n    public sealed class SSOAuthenticationService\n    {\n        /// <summary>\n        /// Creates an instance of SSOAuthenticationService with the current settings.\n        /// </summary>\n        /// <returns>an instance of SSOAuthenticationService, or null if the settings are\n        /// blank</returns>\n        public static SSOAuthenticationService GetInstance()\n        {\n            string id = Settings.SSOClientID, secret = Settings.SSOClientSecret;\n            SSOAuthenticationService authService;\n\n            if (string.IsNullOrEmpty(id) || string.IsNullOrEmpty(secret))\n                authService = new SSOAuthenticationService(NetworkConstants.SSODefaultAppID,\n                    null, NetworkConstants.SSOScopes);\n            else\n                authService = new SSOAuthenticationService(id, secret, NetworkConstants.\n                    SSOScopes);\n            return authService;\n        }\n\n        /// <summary>\n        /// Starts obtaining information about the character used to authenticate the specified\n        /// token.\n        /// </summary>\n        /// <param name=\"token\">The auth token used.</param>\n        /// <param name=\"callback\">A callback to receive the token info.</param>\n        public static void GetTokenInfo(string token, Action<JsonResult<EsiAPITokenInfo>>\n            callback)\n        {\n            var url = new Uri(NetworkConstants.SSOBase + NetworkConstants.SSOCharID);\n            Util.DownloadJsonAsync<EsiAPITokenInfo>(url, new RequestParams()\n            {\n                Authentication = token\n            }).ContinueWith((result) => Dispatcher.Invoke(() =>\n            {\n                // Run the callback on the dispatcher thread\n                callback?.Invoke(result.Result);\n            }));\n        }\n\n        /// <summary>\n        /// The SSO client ID.\n        /// </summary>\n        private readonly string m_clientID;\n\n        /// <summary>\n        /// The Base-64 encoded challenge string for PKCE authentication.\n        /// </summary>\n        private readonly string m_codeChallenge;\n\n        /// <summary>\n        /// List of scopes that are to be used.\n        /// </summary>\n        private readonly string m_scopes;\n\n        /// <summary>\n        /// The SSO client secret.\n        /// </summary>\n        private readonly string m_secret;\n\n        public SSOAuthenticationService(string clientID, string secret, string scopes)\n        {\n            if (string.IsNullOrEmpty(clientID))\n                throw new ArgumentNullException(\"clientID\");\n            if (string.IsNullOrEmpty(scopes))\n                throw new ArgumentNullException(\"scopes\");\n            m_clientID = clientID;\n            var rnd = new RNGCryptoServiceProvider();\n            byte[] cc = new byte[32];\n            rnd.GetBytes(cc);\n            m_codeChallenge = Util.URLSafeBase64(cc);\n            m_scopes = scopes;\n            m_secret = secret;\n        }\n\n        /// <summary>\n        /// Retrieves a token from the server with the specified authentication data.\n        /// </summary>\n        /// <param name=\"data\">The POST data, either an auth code or a refresh token.</param>\n        /// <param name=\"callback\">A callback to receive the new token.</param>\n        /// <param name=\"isJWT\">true if a JWT response is expected, or false if a straight JSON response is expected.</param>\n        private void FetchToken(string data, Action<AccessResponse> callback, bool isJWT)\n        {\n            var obtained = DateTime.UtcNow;\n            var url = new Uri(NetworkConstants.SSOBaseV2 + NetworkConstants.SSOToken);\n            var rp = new RequestParams()\n            {\n                Content = data,\n                Method = HttpMethod.Post\n            };\n            if (!string.IsNullOrEmpty(m_secret))\n                // Non-PKCE\n                rp.Authentication = GetBasicAuthHeader();\n            HttpWebClientService.DownloadStringAsync(url, rp).ContinueWith((result) =>\n            {\n                AccessResponse response = null;\n                DownloadResult<string> taskResult;\n                string encodedToken;\n                // It must be completed or failed if ContinueWith is reached\n                if (result.IsFaulted)\n                    ExceptionHandler.LogException(result.Exception, true);\n                else if ((taskResult = result.Result) != null)\n                {\n                    // Log HTTP error if it occurred\n                    if (taskResult.Error != null)\n                        ExceptionHandler.LogException(taskResult.Error, true);\n                    else if (!string.IsNullOrEmpty(encodedToken = taskResult.Result))\n                        // For some reason the JWT token is not returned according to the ESI\n                        // spec\n                        response = TokenFromString(encodedToken, false, obtained);\n                }\n                Dispatcher.Invoke(() => callback?.Invoke(response));\n            });\n        }\n\n        /// <summary>\n        /// Creates a URL to the login page; the port is the location of the local\n        /// web server which receives the response, the state is used to stop XSRF\n        /// (make it random!)\n        /// </summary>\n        /// <param name=\"state\">The random state parameter used to stop cross-site forgery.</param>\n        /// <param name=\"port\">The port used for the response.</param>\n        /// <returns>The URL to be passed to a browser for login.</returns>\n        public Uri GetAuthenticationURL(string state, int port)\n        {\n            string redirect = string.Format(NetworkConstants.SSORedirect, port);\n            string url;\n            if (string.IsNullOrEmpty(m_secret))\n                // PKCE\n                url = string.Format(NetworkConstants.SSOLoginPKCE, WebUtility.UrlEncode(\n                    redirect), state, m_scopes, m_clientID, Util.SHA256Base64(Encoding.ASCII.\n                    GetBytes(m_codeChallenge)));\n            else\n                url = string.Format(NetworkConstants.SSOLogin, WebUtility.UrlEncode(redirect),\n                    state, m_scopes, m_clientID);\n            return new Uri(NetworkConstants.SSOBaseV2 + url);\n        }\n\n        /// <summary>\n        /// Retrieves the \"basic\" authentication header used when retrieving tokens.\n        /// </summary>\n        /// <returns>The correct Basic authentication header with client ID/secret.</returns>\n        private string GetBasicAuthHeader()\n        {\n            return \"Basic \" + Convert.ToBase64String(Encoding.UTF8.GetBytes(m_clientID +\n                \":\" + m_secret));\n        }\n\n        /// <summary>\n        /// Starts obtaining a new access token from the refresh token.\n        /// </summary>\n        /// <param name=\"refreshToken\">The refresh token.</param>\n        /// <param name=\"callback\">A callback to receive the new token.</param>\n        public void GetNewToken(string refreshToken, Action<AccessResponse> callback)\n        {\n            refreshToken.ThrowIfNull(nameof(refreshToken));\n            string data;\n            if (string.IsNullOrEmpty(m_secret))\n                // PKCE\n                data = string.Format(NetworkConstants.PostDataRefreshPKCE, WebUtility.\n                    UrlEncode(refreshToken), m_clientID);\n            else\n                data = string.Format(NetworkConstants.PostDataRefreshToken, WebUtility.\n                    UrlEncode(refreshToken));\n            FetchToken(data, callback, false);\n        }\n\n        /// <summary>\n        /// Starts verifying the authentication code.\n        /// </summary>\n        /// <param name=\"authCode\">The code to verify.</param>\n        /// <param name=\"callback\">A callback to receive the tokens.</param>\n        public void VerifyAuthCode(string authCode, Action<AccessResponse> callback)\n        {\n            authCode.ThrowIfNull(nameof(authCode));\n            bool isPKCE = string.IsNullOrEmpty(m_secret);\n            string data;\n            if (isPKCE)\n                // PKCE\n                data = string.Format(NetworkConstants.PostDataAuthPKCE, WebUtility.UrlEncode(\n                    authCode), m_clientID, m_codeChallenge);\n            else\n                data = string.Format(NetworkConstants.PostDataAuthToken, WebUtility.\n                    UrlEncode(authCode));\n            FetchToken(data, callback, isPKCE);\n        }\n\n        /// <summary>\n        /// Spawns a browser for the user to log in; the port is the location of the local\n        /// web server which receives the response, the state is used to stop XSRF\n        /// (make it random!)\n        /// </summary>\n        /// <param name=\"state\">The random state parameter used to stop cross-site forgery.</param>\n        /// <param name=\"port\">The port used for the response.</param>\n        public void SpawnBrowserForLogin(string state, int port)\n        {\n            Util.OpenURL(GetAuthenticationURL(state, port));\n        }\n\n        /// <summary>\n        /// Creates a token from a JWT or regular access response.\n        /// </summary>\n        /// <param name=\"data\">The token data from the server.</param>\n        /// <param name=\"isJWT\">true if a JWT response is expected, or false if a straight JSON response is expected.</param>\n        /// <param name=\"obtained\">The time when this token was first obtained</param>\n        /// <returns>The token, or null if none could be parsed.</returns>\n        private AccessResponse TokenFromString(string data, bool isJWT, DateTime obtained)\n        {\n            AccessResponse response = null;\n            if (isJWT)\n            {\n                JwtSecurityToken token;\n                try\n                {\n                    token = new JwtSecurityToken(data);\n                }\n                catch (ArgumentException e)\n                {\n                    // JwtSecurityToken constructor throws this exception if the token is\n                    // invalid\n                    ExceptionHandler.LogException(e, true);\n                    token = null;\n                }\n                if (token != null)\n                {\n                    var intendedURI = new Uri(NetworkConstants.SSOBaseV2);\n                    string issuer = token.Issuer;\n                    // Validate ISSuer\n                    if (issuer == intendedURI.Host || issuer == intendedURI.GetLeftPart(\n                            UriPartial.Authority))\n                        response = Util.DeserializeJson<AccessResponse>(token.RawPayload);\n                    else\n                        EveMonClient.Trace(\"Rejecting invalid SSO token issuer: \" + issuer);\n                }\n            }\n            else\n                response = Util.DeserializeJson<AccessResponse>(data);\n            if (response != null)\n                // Initialize time since deserializer does not call the constructor\n                response.Obtained = obtained;\n            return response;\n        }\n    }\n\n    /// <summary>\n    /// Template class for verification responses from SSO authentication.\n    /// </summary>\n    [DataContract]\n    public sealed class AccessResponse\n    {\n        [DataMember(Name = \"access_token\")]\n        public string AccessToken { get; set; }\n\n        [DataMember(Name = \"refresh_token\")]\n        public string RefreshToken { get; set; }\n\n        [DataMember(Name = \"expires_in\")]\n        private int ExpiresIn { get; set; }\n\n        [IgnoreDataMember]\n        public DateTime ExpiryUTC\n        {\n            get\n            {\n                return Obtained + TimeSpan.FromSeconds(ExpiresIn);\n            }\n        }\n\n        // This is apparently not set when deserialized, added a method to initialize it\n        [IgnoreDataMember]\n        public DateTime Obtained { get; set; }\n\n        public AccessResponse()\n        {\n            AccessToken = string.Empty;\n            RefreshToken = string.Empty;\n            Obtained = DateTime.UtcNow;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Service/SSOWebServerHttpListener.cs",
    "content": "﻿using EVEMon.Common.Constants;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Threading;\nusing System;\nusing System.Collections.Specialized;\nusing System.IO;\nusing System.Net;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Web;\n\nnamespace EVEMon.Common.Service\n{\n    /// <summary>\n    /// A simple web server that is used to receive callback information from SSO using\n    /// HttpListener.\n    /// \n    /// SSO was really meant for web apps so this is the best we can do...\n    /// </summary>\n    public class SSOWebServerHttpListener : ISSOWebServer\n    {\n        // A random port would be nice, but the API requires a fixed callback URL\n        public const int PORT = 4916;\n        // Used for initializing the responses properly\n        private static readonly object RESPONSE_LOCK = new object();\n        // Time before idle HTTP connections are closed\n        private static readonly TimeSpan TIMEOUT_IDLE = TimeSpan.FromSeconds(10.0);\n        // Time before connections are closed while waiting for read data\n        private static readonly TimeSpan TIMEOUT_READ = TimeSpan.FromSeconds(3.0);\n        // Time before connections are closed while waiting for write data\n        private static readonly TimeSpan TIMEOUT_WRITE = TimeSpan.FromSeconds(2.0);\n\n        // Encoded responses for client requests\n        private static byte[] responseOK = null;\n        private static byte[] response404 = null;\n\n        // Initializes the text responses sent to the client\n        private static void InitResponses()\n        {\n            lock (RESPONSE_LOCK)\n            {\n                if (response404 == null || responseOK == null)\n                {\n                    response404 = Encoding.UTF8.GetBytes(Properties.Resources.CallbackFail);\n                    responseOK = Encoding.UTF8.GetBytes(Properties.Resources.CallbackOK);\n                }\n            }\n        }\n\n        // The TCP listener used to receive requests\n        // We expect few requests, so we can get away with a single thread\n        private readonly HttpListener listener;\n\n        public SSOWebServerHttpListener()\n        {\n            if (!HttpListener.IsSupported)\n                throw new InvalidOperationException(\"HTTP listener not supported\");\n            listener = new HttpListener();\n            // Calculate prefix, must end with slash according to HttpListener documentation\n            string prefix = string.Format(NetworkConstants.SSORedirect, PORT);\n            if (!prefix.EndsWith(\"/\"))\n                prefix += \"/\";\n            listener.Prefixes.Add(prefix);\n            // Where would the exception go otherwise?\n            listener.IgnoreWriteExceptions = true;\n            // Set up the desired timeouts\n            listener.TimeoutManager.IdleConnection = TIMEOUT_IDLE;\n            listener.TimeoutManager.DrainEntityBody = TIMEOUT_WRITE;\n            listener.TimeoutManager.EntityBody = TIMEOUT_READ;\n            listener.TimeoutManager.HeaderWait = TIMEOUT_READ;\n            listener.TimeoutManager.RequestQueue = TIMEOUT_WRITE;\n            InitResponses();\n        }\n\n        /// <summary>\n        /// Asynchronously waits for an auth code in the background.\n        /// </summary>\n        /// <param name=\"state\">The SSO state used.</param>\n        /// <param name=\"callback\">The callback which will be invoked when the code is\n        /// received, reception fails, or the server is stopped.</param>\n        public void BeginWaitForCode(string state, Action<Task<string>> callback)\n        {\n            if (string.IsNullOrEmpty(state))\n                throw new ArgumentNullException(\"state\");\n            WaitForCodeAsync(state).ContinueWith((result) => Dispatcher.Invoke(() =>\n                callback?.Invoke(result)));\n        }\n\n        public void Dispose()\n        {\n            listener.Stop();\n            listener.Close();\n        }\n\n        /// <summary>\n        /// Responds to the client which requests the specified URL.\n        /// </summary>\n        /// <param name=\"state\">The SSO state used.</param>\n        /// <param name=\"output\">The response where the output will be sent.</param>\n        /// <param name=\"queryParams\">The arguments from the query.</param>\n        /// <returns></returns>\n        private async Task<string> SendReponseAsync(string state, HttpListenerResponse output,\n            NameValueCollection queryParams)\n        {\n            string code = \"\";\n            byte[] response;\n            HttpStatusCode responseCode;\n            // Check for matching state in response\n            var stateParams = queryParams.GetValues(\"state\");\n            if (stateParams != null && stateParams.Length == 1 && stateParams[0] == state)\n            {\n                var codeParams = queryParams.GetValues(\"code\");\n                // Take the first one, only should be one\n                if (codeParams != null && codeParams.Length > 0)\n                    code = codeParams[0];\n            }\n            // Choose the right response\n            if (string.IsNullOrEmpty(code))\n            {\n                response = response404;\n                responseCode = HttpStatusCode.NotFound;\n            }\n            else\n            {\n                response = responseOK;\n                responseCode = HttpStatusCode.OK;\n            }\n            // Send the response\n            using (var stream = output.OutputStream)\n            {\n                int len = response.Length;\n                // HTTP response code\n                output.StatusCode = (int)responseCode;\n                // Supply the length\n                output.ContentLength64 = len;\n                // Supply content type and encoding\n                output.ContentType = \"text/html\";\n                output.ContentEncoding = Encoding.UTF8;\n                await stream.WriteAsync(response, 0, len);\n                await stream.FlushAsync();\n            }\n            return code;\n        }\n\n        /// <summary>\n        /// Starts the web server.\n        /// </summary>\n        public void Start()\n        {\n            try\n            {\n                listener.Start();\n            }\n            catch (HttpListenerException e)\n            {\n                ExceptionHandler.LogException(e, true);\n                throw new IOException(\"Error when starting server\", e);\n            }\n        }\n\n        /// <summary>\n        /// Stops the web server.\n        /// </summary>\n        public void Stop()\n        {\n            try\n            {\n                listener.Stop();\n            }\n            catch (HttpListenerException e)\n            {\n                ExceptionHandler.LogException(e, true);\n            }\n        }\n\n        /// <summary>\n        /// Waits for the auth code asynchronously; the reported state must match the argument.\n        /// </summary>\n        /// <param name=\"state\">The SSO state.</param>\n        /// <returns>The token received, or null if none was received.</returns>\n        public async Task<string> WaitForCodeAsync(string state)\n        {\n            // Blank states are bad\n            if (string.IsNullOrEmpty(state))\n                throw new ArgumentNullException(\"state\");\n            string code = string.Empty;\n            try\n            {\n                do\n                {\n                    // Accept client\n                    var context = await listener.GetContextAsync().ConfigureAwait(false);\n                    using (var output = context.Response)\n                    {\n                        // Check for state in the URL\n                        string query = context.Request.Url.Query;\n                        if (query == null)\n                            query = \"\";\n                        var queryParams = HttpUtility.ParseQueryString(query);\n                        code = await SendReponseAsync(state, output, queryParams);\n                    }\n                } while (string.IsNullOrEmpty(code));\n            }\n            catch (ObjectDisposedException)\n            {\n                // Happens normally while shutting down\n            }\n            catch (HttpListenerException e)\n            {\n                throw new IOException(\"Error when waiting for auth code\", e);\n            }\n            return code;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Settings.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing System.Xml.Serialization;\nusing System.Xml.Xsl;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.CloudStorageServices;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models.Extended;\nusing EVEMon.Common.Notifications;\nusing EVEMon.Common.Scheduling;\nusing EVEMon.Common.Serialization.Settings;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.Common\n{\n    /// <summary>\n    /// Stores EVEMon's current settings and writes them to the settings file when necessary.\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public static class Settings\n    {\n        private static bool s_savePending;\n        private static DateTime s_nextSaveTime;\n        private static XslCompiledTransform s_settingsTransform;\n        private static SerializableSettings s_settings;\n\n        /// <summary>\n        /// Static constructor.\n        /// </summary>\n        static Settings()\n        {\n            SSOClientID = string.Empty;\n            SSOClientSecret = string.Empty;\n            UI = new UISettings();\n            G15 = new G15Settings();\n            Proxy = new ProxySettings();\n            Updates = new UpdateSettings();\n            Calendar = new CalendarSettings();\n            Exportation = new ExportationSettings();\n            MarketPricer = new MarketPricerSettings();\n            Notifications = new NotificationSettings();\n            LoadoutsProvider = new LoadoutsProviderSettings();\n            PortableEveInstallations = new PortableEveInstallationsSettings();\n            CloudStorageServiceProvider = new CloudStorageServiceProviderSettings();\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n        }\n\n        /// <summary>\n        /// Handles the TimerTick event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private static async void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            await UpdateOnOneSecondTickAsync();\n        }\n\n        /// <summary>\n        /// Gets true if we're currently restoring the settings.\n        /// </summary>\n        public static bool IsRestoring { get; private set; }\n\n\n        #region The very settings\n\n        /// <summary>\n        /// Gets or sets the SSO client ID.\n        /// </summary>\n        public static string SSOClientID { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the SSO secret key.\n        /// </summary>\n        public static string SSOClientSecret { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the compatibility mode.\n        /// </summary>\n        public static CompatibilityMode Compatibility { get; private set; }\n\n        /// <summary>\n        /// Gets the settings for updates.\n        /// </summary>\n        public static UpdateSettings Updates { get; private set; }\n\n        /// <summary>\n        /// Gets the settings for UI (look'n feel)\n        /// </summary>\n        public static UISettings UI { get; private set; }\n\n        /// <summary>\n        /// Gets the settings for the G15 keyboard.\n        /// </summary>\n        public static G15Settings G15 { get; private set; }\n\n        /// <summary>\n        /// Gets the settings for the notifications (alerts).\n        /// </summary>\n        public static NotificationSettings Notifications { get; private set; }\n\n        /// <summary>\n        /// Gets the settings for the portable EVE installations.\n        /// </summary>\n        public static PortableEveInstallationsSettings PortableEveInstallations { get; private set; }\n\n        /// <summary>\n        /// Gets the calendar settings.\n        /// </summary>\n        public static CalendarSettings Calendar { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the exportation settings.\n        /// </summary>\n        public static ExportationSettings Exportation { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the custom proxy settings.\n        /// </summary>\n        public static ProxySettings Proxy { get; private set; }\n\n        /// <summary>\n        /// Gets the market pricer settings.\n        /// </summary>\n        public static MarketPricerSettings MarketPricer { get; private set; }\n\n        /// <summary>\n        /// Gets the loadouts provider settings.\n        /// </summary>\n        public static LoadoutsProviderSettings LoadoutsProvider { get; private set; }\n\n        /// <summary>\n        /// Gets the cloud storage service provider settings.\n        /// </summary>\n        public static CloudStorageServiceProviderSettings CloudStorageServiceProvider { get; private set; }\n\n        #endregion\n\n\n        #region Serialization - Core - Methods to update to add a property\n\n        /// <summary>\n        /// Creates new empty Settings file, overwriting the existing file.\n        /// </summary>\n        public static async Task ResetAsync()\n        {\n            s_settings = new SerializableSettings();\n\n            IsRestoring = true;\n            Import();\n            await ImportDataAsync();\n            IsRestoring = false;\n        }\n\n        /// <summary>\n        /// Asynchronously imports the settings.\n        /// </summary>\n        /// <param name=\"serial\">The serial.</param>\n        /// <param name=\"saveImmediate\">if set to <c>true</c> [save immediate].</param>\n        /// <returns></returns>\n        public static async Task ImportAsync(SerializableSettings serial, bool saveImmediate = false)\n        {\n            s_settings = serial;\n\n            Import();\n            IsRestoring = true;\n            if (saveImmediate)\n                await SaveImmediateAsync();\n            IsRestoring = false;\n        }\n\n        /// <summary>\n        /// Imports the provided serialization object.\n        /// </summary>\n        private static void Import()\n        {\n            EveMonClient.Trace(\"begin\");\n\n            // When null, we just reset\n            if (s_settings == null)\n                s_settings = new SerializableSettings();\n\n            try\n            {\n                // API settings\n                SSOClientID = s_settings.SSOClientID ?? string.Empty;\n                SSOClientSecret = s_settings.SSOClientSecret ?? string.Empty;\n\n                // User settings\n                UI = s_settings.UI;\n                G15 = s_settings.G15;\n                Proxy = s_settings.Proxy;\n                Updates = s_settings.Updates;\n                Calendar = s_settings.Calendar;\n                Exportation = s_settings.Exportation;\n                MarketPricer = s_settings.MarketPricer;\n                Notifications = s_settings.Notifications;\n                Compatibility = s_settings.Compatibility;\n                LoadoutsProvider = s_settings.LoadoutsProvider;\n                PortableEveInstallations = s_settings.PortableEveInstallations;\n                CloudStorageServiceProvider = s_settings.CloudStorageServiceProvider;\n\n                // Scheduler\n                Scheduler.Import(s_settings.Scheduler);\n            }\n            finally\n            {\n                EveMonClient.Trace(\"done\");\n\n                // Notify the subscribers\n                EveMonClient.OnSettingsChanged();\n            }\n        }\n\n        /// <summary>\n        /// Asynchronously imports the data.\n        /// </summary>\n        /// <returns></returns>\n        public static async Task ImportDataAsync()\n        {\n            // Quit if the client has been shut down\n            if (EveMonClient.Closed)\n                return;\n\n            IsRestoring = true;\n            await TaskHelper.RunCPUBoundTaskAsync(() => ImportData());\n            await SaveImmediateAsync();\n            IsRestoring = false;\n        }\n\n        /// <summary>\n        /// Imports the data.\n        /// </summary>\n        private static void ImportData()\n        {\n            EveMonClient.Trace(\"begin\");\n\n            if (s_settings == null)\n                s_settings = new SerializableSettings();\n\n            EveMonClient.ResetCollections();\n            EveMonClient.Characters.Import(s_settings.Characters);\n            EveMonClient.ESIKeys.Import(s_settings.ESIKeys);\n            EveMonClient.Characters.ImportPlans(s_settings.Plans);\n            EveMonClient.MonitoredCharacters.Import(s_settings.MonitoredCharacters);\n\n            OnImportCompleted();\n\n            EveMonClient.Trace(\"done\");\n\n            // Notify the subscribers\n            EveMonClient.OnSettingsChanged();\n        }\n\n        /// <summary>\n        /// Corrects the imported data and add missing stuff.\n        /// </summary>\n        private static void OnImportCompleted()\n        {\n            // Add missing notification behaviours\n            foreach (NotificationCategory category in EnumExtensions.GetValues<NotificationCategory>()\n                .Where(category => !Notifications.Categories.ContainsKey(category) && category.HasHeader()))\n            {\n                Notifications.Categories[category] = new NotificationCategorySettings();\n            }\n\n            // Add missing ESI methods update periods\n            foreach (Enum method in ESIMethods.Methods.Where(method => method.GetUpdatePeriod() != null)\n                .Where(method => !Updates.Periods.ContainsKey(method.ToString())))\n                Updates.Periods.Add(method.ToString(), method.GetUpdatePeriod().DefaultPeriod);\n\n            // Initialize or add missing columns\n            InitializeOrAddMissingColumns();\n\n            // Removes redundant notification behaviours\n            List<KeyValuePair<NotificationCategory, NotificationCategorySettings>> notifications =\n                Notifications.Categories.ToList();\n            foreach (KeyValuePair<NotificationCategory, NotificationCategorySettings> notification in notifications\n                .Where(notification => !notification.Key.HasHeader()))\n            {\n                Notifications.Categories.Remove(notification.Key);\n            }\n\n            // Removes redundant windows locations\n            List<KeyValuePair<string, WindowLocationSettings>> locations = UI.WindowLocations.ToList();\n            foreach (KeyValuePair<string, WindowLocationSettings> windowLocation in locations\n                .Where(windowLocation => windowLocation.Key == \"FeaturesWindow\"))\n            {\n                UI.WindowLocations.Remove(windowLocation.Key);\n            }\n\n            // Removes redundant splitters\n            List<KeyValuePair<string, int>> splitters = UI.Splitters.ToList();\n            foreach (KeyValuePair<string, int> splitter in splitters\n                .Where(splitter => splitter.Key == \"EFTLoadoutImportationForm\"))\n            {\n                UI.Splitters.Remove(splitter.Key);\n            }\n        }\n\n        /// <summary>\n        /// Initializes or adds missing columns.\n        /// </summary>\n        private static void InitializeOrAddMissingColumns()\n        {\n            // Initializes the plan columns or adds missing ones\n            UI.PlanWindow.Columns.AddRange(UI.PlanWindow.DefaultColumns);\n\n            // Initializes the asset columns or adds missing ones\n            UI.MainWindow.Assets.Columns.AddRange(UI.MainWindow.Assets.DefaultColumns);\n\n            // Initializes the market order columns or adds missing ones\n            UI.MainWindow.MarketOrders.Columns.AddRange(UI.MainWindow.MarketOrders.DefaultColumns);\n\n            // Initializes the contracts columns or adds missing ones\n            UI.MainWindow.Contracts.Columns.AddRange(UI.MainWindow.Contracts.DefaultColumns);\n\n            // Initializes the wallet journal columns or adds missing ones\n            UI.MainWindow.WalletJournal.Columns.AddRange(UI.MainWindow.WalletJournal.DefaultColumns);\n\n            // Initializes the wallet transactions columns or adds missing ones\n            UI.MainWindow.WalletTransactions.Columns.AddRange(UI.MainWindow.WalletTransactions.DefaultColumns);\n\n            // Initializes the industry jobs columns or adds missing ones\n            UI.MainWindow.IndustryJobs.Columns.AddRange(UI.MainWindow.IndustryJobs.DefaultColumns);\n\n            // Initializes the planetary colonies columns or adds missing ones\n            UI.MainWindow.Planetary.Columns.AddRange(UI.MainWindow.Planetary.DefaultColumns);\n\n            // Initializes the research points columns or adds missing ones\n            UI.MainWindow.Research.Columns.AddRange(UI.MainWindow.Research.DefaultColumns);\n\n            // Initializes the EVE mail messages columns or adds missing ones\n            UI.MainWindow.EVEMailMessages.Columns.AddRange(UI.MainWindow.EVEMailMessages.DefaultColumns);\n\n            // Initializes the EVE notifications columns or adds missing ones\n            UI.MainWindow.EVENotifications.Columns.AddRange(UI.MainWindow.EVENotifications.DefaultColumns);\n        }\n\n        /// <summary>\n        /// Creates a serializable version of the settings.\n        /// </summary>\n        /// <returns></returns>\n        public static SerializableSettings Export()\n        {\n            SerializableSettings serial = new SerializableSettings\n            {\n                SSOClientID = SSOClientID,\n                SSOClientSecret = SSOClientSecret,\n                Revision = Revision,\n                Compatibility = Compatibility,\n                Scheduler = Scheduler.Export(),\n                Calendar = Calendar,\n                CloudStorageServiceProvider = CloudStorageServiceProvider,\n                PortableEveInstallations = PortableEveInstallations,\n                LoadoutsProvider = LoadoutsProvider,\n                MarketPricer = MarketPricer,\n                Notifications = Notifications,\n                Exportation = Exportation,\n                Updates = Updates,\n                Proxy = Proxy,\n                G15 = G15,\n                UI = UI\n            };\n\n            serial.Characters.AddRange(EveMonClient.Characters.Export());\n            serial.ESIKeys.AddRange(EveMonClient.ESIKeys.Export());\n            serial.Plans.AddRange(EveMonClient.Characters.ExportPlans());\n            serial.MonitoredCharacters.AddRange(EveMonClient.MonitoredCharacters.Export());\n\n            return serial;\n        }\n\n        #endregion\n\n\n        #region Initialization and loading\n\n        /// <summary>\n        /// Gets the current assembly's revision, which is also used for files versioning.\n        /// </summary>\n        internal static int Revision => Version.Parse(EveMonClient.FileVersionInfo.FileVersion).Revision;\n\n        /// <summary>\n        /// Initialization for the EVEMon client settings.\n        /// </summary>\n        /// <remarks>\n        /// Will attempt to fetch and initialize settings from a storage server, if user has specified so.\n        /// Otherwise attempts to initialize from a locally stored file.\n        /// </remarks>\n        public static void Initialize()\n        {\n            // Deserialize the local settings file to determine\n            // which cloud storage service provider should be used\n            s_settings = TryDeserializeFromFile();\n\n            // Try to download the settings file from the cloud\n            CloudStorageServiceAPIFile settingsFile = s_settings?.CloudStorageServiceProvider?.Provider?.DownloadSettingsFile();\n\n            // If a settings file was downloaded try to deserialize it\n            s_settings = settingsFile != null\n                ? TryDeserializeFromFileContent(settingsFile.FileContent)\n                : s_settings;\n\n            // Loading settings\n            // If there are none, we create them from scratch\n            IsRestoring = true;\n            Import();\n            IsRestoring = false;\n        }\n\n        /// <summary>\n        /// Try to deserialize the settings from a storage server file, prompting the user for errors.\n        /// </summary>\n        /// <param name=\"fileContent\">Content of the file.</param>\n        /// <returns>\n        ///   <c>Null</c> if we have been unable to deserialize anything, the generated settings otherwise\n        /// </returns>\n        private static SerializableSettings TryDeserializeFromFileContent(string fileContent)\n        {\n            if (string.IsNullOrWhiteSpace(fileContent))\n                return null;\n\n            EveMonClient.Trace(\"begin\");\n\n            // Gets the revision number of the assembly which generated this file\n            int revision = Util.GetRevisionNumber(fileContent);\n\n            // Try to load from a file (when no revision found then it's a pre 1.3.0 version file)\n            SerializableSettings settings = revision == 0\n                ? (SerializableSettings)UIHelper.ShowNoSupportMessage()\n                : Util.DeserializeXmlFromString<SerializableSettings>(fileContent,\n                    SettingsTransform);\n\n            if (settings != null)\n            {\n                EveMonClient.Trace(\"done\");\n                return settings;\n            }\n\n            const string Caption = \"Corrupt Settings\";\n\n            DialogResult dr = MessageBox.Show($\"Loading settings from {CloudStorageServiceProvider.ProviderName} failed.\" +\n                                              $\"{Environment.NewLine}Do you want to use the local settings file?\",\n                Caption, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);\n\n            if (dr != DialogResult.No)\n                return TryDeserializeFromFile();\n\n            MessageBox.Show($\"A new settings file will be created.{Environment.NewLine}\"\n                            + @\"You may wish then to restore a saved copy of the file.\", Caption,\n                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n\n            return null;\n        }\n\n        /// <summary>\n        /// Asynchronously restores the settings from the specified file.\n        /// </summary>\n        /// <param name=\"filename\">The fully qualified filename of the settings file to load</param>\n        /// <returns>The Settings object loaded</returns>\n        public static async Task RestoreAsync(string filename)\n        {\n            // Try deserialize\n            s_settings = TryDeserializeFromBackupFile(filename, false);\n\n            // Loading from file failed, we abort and keep our current settings\n            if (s_settings == null)\n                return;\n\n            IsRestoring = true;\n            Import();\n            await ImportDataAsync();\n            IsRestoring = false;\n        }\n\n        /// <summary>\n        /// Try to deserialize the settings from a file, prompting the user for errors.\n        /// </summary>\n        /// <returns><c>Null</c> if we have been unable to load anything from files, the generated settings otherwise</returns>\n        private static SerializableSettings TryDeserializeFromFile()\n        {\n            string settingsFile = EveMonClient.SettingsFileNameFullPath;\n            string backupFile = settingsFile + \".bak\";\n\n            // If settings file doesn't exists\n            // try to recover from the backup\n            if (!File.Exists(settingsFile))\n                return TryDeserializeFromBackupFile(backupFile);\n\n            EveMonClient.Trace(\"begin\");\n\n            // Check settings file length\n            FileInfo settingsInfo = new FileInfo(settingsFile);\n            if (settingsInfo.Length == 0)\n                return TryDeserializeFromBackupFile(backupFile);\n\n            // Get the revision number of the assembly which generated this file\n            // Try to load from a file (when no revision found then it's a pre 1.3.0 version file)\n            SerializableSettings settings = Util.GetRevisionNumber(settingsFile) == 0\n                ? (SerializableSettings)UIHelper.ShowNoSupportMessage()\n                : Util.DeserializeXmlFromFile<SerializableSettings>(settingsFile,\n                    SettingsTransform);\n\n            // If the settings loaded OK, make a backup as 'last good settings' and return\n            if (settings == null)\n                return TryDeserializeFromBackupFile(backupFile);\n\n            CheckSettingsVersion(settings);\n            FileHelper.CopyOrWarnTheUser(settingsFile, backupFile);\n\n            EveMonClient.Trace(\"done\");\n            return settings;\n        }\n\n        /// <summary>\n        /// Try to deserialize from the backup file.\n        /// </summary>\n        /// <param name=\"backupFile\">The backup file.</param>\n        /// <param name=\"recover\">if set to <c>true</c> do a settings recover attempt.</param>\n        /// <returns>\n        /// \t<c>Null</c> if we have been unable to load anything from files, the generated settings otherwise\n        /// </returns>\n        private static SerializableSettings TryDeserializeFromBackupFile(string backupFile, bool recover = true)\n        {\n            // Backup file doesn't exist\n            if (!File.Exists(backupFile))\n                return null;\n\n            EveMonClient.Trace(\"begin\");\n\n            // Check backup settings file length\n            FileInfo backupInfo = new FileInfo(backupFile);\n            if (backupInfo.Length == 0)\n                return null;\n\n            string settingsFile = EveMonClient.SettingsFileNameFullPath;\n\n            const string Caption = \"Corrupt Settings\";\n            if (recover)\n            {\n                // Prompts the user to use the backup\n                string fileDate =\n                    $\"{backupInfo.LastWriteTime.ToLocalTime().ToShortDateString()} \" +\n                    $\"at {backupInfo.LastWriteTime.ToLocalTime().ToShortTimeString()}\";\n                DialogResult dialogResult = MessageBox.Show(\n                    $\"The settings file is missing or corrupt. There is a backup available from {fileDate}.{Environment.NewLine}\" +\n                    @\"Do you want to use the backup file?\", Caption, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);\n\n                if (dialogResult == DialogResult.No)\n                {\n                    MessageBox.Show($\"A new settings file will be created.{Environment.NewLine}\"\n                                    + @\"You may wish then to restore a saved copy of the file.\", Caption,\n                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n\n                    // Save a copy of the corrupt file just in case\n                    FileHelper.CopyOrWarnTheUser(backupFile, settingsFile + \".corrupt\");\n\n                    return null;\n                }\n            }\n\n            // Get the revision number of the assembly which generated this file\n            // Try to load from a file (when no revision found then it's a pre 1.3.0 version file)\n            SerializableSettings settings = Util.GetRevisionNumber(backupFile) == 0\n                ? (SerializableSettings)UIHelper.ShowNoSupportMessage()\n                : Util.DeserializeXmlFromFile<SerializableSettings>(backupFile,\n                    SettingsTransform);\n\n            // If the settings loaded OK, copy to the main settings file, then copy back to stamp date\n            if (settings != null)\n            {\n                CheckSettingsVersion(settings);\n                FileHelper.CopyOrWarnTheUser(backupFile, settingsFile);\n                FileHelper.CopyOrWarnTheUser(settingsFile, backupFile);\n\n                EveMonClient.Trace(\"done\");\n                return settings;\n            }\n\n            if (recover)\n            {\n                // Backup failed too, notify the user we have a problem\n                MessageBox.Show($\"Loading from backup failed.\\nA new settings file will be created.{Environment.NewLine}\"\n                                + @\"You may wish then to restore a saved copy of the file.\",\n                    Caption, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\n\n                // Save a copy of the corrupt file just in case\n                FileHelper.CopyOrWarnTheUser(backupFile, settingsFile + \".corrupt\");\n            }\n            else\n            {\n                // Restoring from file failed\n                MessageBox.Show($\"Restoring settings from {backupFile} failed, the file is corrupted.\",\n                    Caption, MessageBoxButtons.OK, MessageBoxIcon.Warning);\n            }\n\n            return null;\n        }\n\n        /// <summary>\n        /// Compare the settings version with this version and, when different, update and prompt the user for a backup.\n        /// </summary>\n        /// <param name=\"settings\"></param>\n        private static void CheckSettingsVersion(SerializableSettings settings)\n        {\n            if (EveMonClient.IsDebugBuild)\n                return;\n\n            if (Revision == settings.Revision)\n                return;\n\n            DialogResult backupSettings =\n                MessageBox.Show($\"The current EVEMon settings file is from a previous version.{Environment.NewLine}\" +\n                                @\"Backup the current file before proceeding (recommended)?\",\n                    @\"EVEMon version changed\", MessageBoxButtons.YesNo, MessageBoxIcon.Question,\n                    MessageBoxDefaultButton.Button1);\n\n            if (backupSettings != DialogResult.Yes)\n                return;\n\n            using (SaveFileDialog fileDialog = new SaveFileDialog())\n            {\n                fileDialog.Title = @\"Settings file backup\";\n                fileDialog.Filter = @\"Settings Backup Files (*.bak)|*.bak\";\n                fileDialog.FileName = $\"EVEMon_Settings_{settings.Revision}.xml.bak\";\n                fileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);\n\n                if (fileDialog.ShowDialog() != DialogResult.OK)\n                    return;\n\n                FileHelper.CopyOrWarnTheUser(EveMonClient.SettingsFileNameFullPath, fileDialog.FileName);\n            }\n        }\n\n        /// <summary>\n        /// Gets the XSLT used for transforming rowsets into something deserializable by <see cref=\"XmlSerializer\"/>\n        /// </summary>\n        private static XslCompiledTransform SettingsTransform\n            => s_settingsTransform ?? (s_settingsTransform = Util.LoadXslt(Properties.Resources.SettingsXSLT));\n\n        #endregion\n\n\n        #region Save\n\n        /// <summary>\n        /// Every timer tick, checks whether we should save the settings every 10s.\n        /// </summary>\n        private static async Task UpdateOnOneSecondTickAsync()\n        {\n            // Is a save requested and is the last save older than 10s ?\n            if (s_savePending && DateTime.UtcNow > s_nextSaveTime)\n                await SaveImmediateAsync();\n        }\n\n        /// <summary>\n        /// Saves settings to disk.\n        /// </summary>\n        /// <remarks>\n        /// Saves will be cached for 10 seconds to avoid thrashing the disk when this method is called very rapidly\n        /// such as at startup. If a save is currently pending, no action is needed. \n        /// </remarks>\n        public static void Save()\n        {\n            if (!IsRestoring)\n                s_savePending = true;\n        }\n\n        /// <summary>\n        /// Saves settings immediately.\n        /// </summary>\n        public static async Task SaveImmediateAsync()\n        {\n            // Prevents the saving if we are restoring the settings at that time\n            if (IsRestoring)\n                return;\n\n            // Reset flags\n            s_savePending = false;\n            s_nextSaveTime = DateTime.UtcNow.AddSeconds(10);\n\n            try\n            {\n                SerializableSettings settings = Export();\n\n                // Save in settings file\n                await FileHelper.OverwriteOrWarnTheUserAsync(EveMonClient.SettingsFileNameFullPath,\n                    async fs =>\n                    {\n                        XmlSerializer xs = new XmlSerializer(typeof(SerializableSettings));\n                        xs.Serialize(fs, settings);\n                        await fs.FlushAsync();\n                        return true;\n                    });\n            }\n            catch (Exception exception)\n            {\n                ExceptionHandler.LogException(exception, true);\n            }\n        }\n\n        /// <summary>\n        /// Copies the current Settings file to the specified location.\n        /// </summary>\n        /// <param name=\"copyFileName\">The fully qualified filename of the destination file</param>\n        public static async Task CopySettingsAsync(string copyFileName)\n        {\n            // Ensure we have the latest settings saved\n            await SaveImmediateAsync();\n            FileHelper.CopyOrWarnTheUser(EveMonClient.SettingsFileNameFullPath, copyFileName);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/AssetColumn.cs",
    "content": "using System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public enum AssetColumn\n    {\n        None = -1,\n\n        [Header(\"Item\")]\n        [Description(\"Item (Name)\")]\n        ItemName = 0,\n\n        [Header(\"Quantity\")]\n        [Description(\"Quantity\")]\n        Quantity = 1,\n\n        [Header(\"Unit Price\")]\n        [Description(\"Unit Price (ISK)\")]\n        UnitaryPrice = 2,\n\n        [Header(\"Total Price\")]\n        [Description(\"Total Price (ISK)\")]\n        TotalPrice = 3,\n\n        [Header(\"Volume\")]\n        [Description(\"Total Volume (m)\")]\n        Volume = 4,\n\n        [Header(\"Blueprint type\")]\n        [Description(\"Blueprint Type (Original or Copy)\")]\n        BlueprintType = 5,\n\n        [Header(\"Group\")]\n        [Description(\"Item Group\")]\n        Group = 6,\n\n        [Header(\"Category\")]\n        [Description(\"Item Category\")]\n        Category = 7,\n\n        [Header(\"Container\")]\n        [Description(\"Container (Containing the item)\")]\n        Container = 8,\n\n        [Header(\"Flag\")]\n        [Description(\"Item Flag\")]\n        Flag = 9,\n\n        [Header(\"Location\")]\n        [Description(\"Location (Station or Solar System)\")]\n        Location = 10,\n\n        [Header(\"Region\")]\n        [Description(\"Location (Region)\")]\n        Region = 11,\n\n        [Header(\"System\")]\n        [Description(\"Location (Solar System)\")]\n        SolarSystem = 12,\n\n        [Header(\"Path\")]\n        [Description(\"Location (Full)\")]\n        FullLocation = 13,\n\n        [Header(\"Jumps\")]\n        [Description(\"Jumps (From character's last known location)\")]\n        Jumps = 14\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/AssetColumnSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class AssetColumnSettings : IColumnSettings\n    {\n        /// <summary>\n        /// Gets or sets the column.\n        /// </summary>\n        /// <value>The column.</value>\n        [XmlAttribute(\"column\")]\n        public AssetColumn Column { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"AssetColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"visible\")]\n        public bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int IColumnSettings.Key => (int)Column;\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents this instance.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents this instance.\n        /// </returns>\n        public override string ToString() => Column.GetHeader();\n\n        /// <summary>\n        /// Creates a new object that is a copy of the current instance.\n        /// </summary>\n        /// <returns>\n        /// A new object that is a copy of this instance.\n        /// </returns>\n        public object Clone() => MemberwiseClone();\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/AssetSettings.cs",
    "content": "using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for Assets.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class AssetSettings\n    {\n        private readonly Collection<AssetColumnSettings> m_columns;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"AssetSettings\"/> class.\n        /// </summary>\n        public AssetSettings()\n        {\n            m_columns = new Collection<AssetColumnSettings>();\n        }\n\n        /// <summary>\n        /// Gets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        [XmlArray(\"columns\")]\n        [XmlArrayItem(\"column\")]\n        public Collection<AssetColumnSettings> Columns => m_columns;\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [number abs format].\n        /// </summary>\n        /// <value><c>true</c> if [number abs format]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"numberAbsFormat\")]\n        public bool NumberAbsFormat { get; set; }\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <value>The default columns.</value>\n        public IEnumerable<AssetColumnSettings> DefaultColumns\n        {\n            get\n            {\n                AssetColumn[] defaultColumns = new[]\n                                                   {\n                                                       AssetColumn.ItemName,\n                                                       AssetColumn.Quantity,\n                                                       AssetColumn.Container, \n                                                       AssetColumn.Location,\n                                                       AssetColumn.Jumps\n                                                   };\n\n                return EnumExtensions.GetValues<AssetColumn>().Where(\n                    column => column != AssetColumn.None).Where(\n                        column => Columns.All(columnSetting => columnSetting.Column != column)).Select(\n                            column => new AssetColumnSettings\n                                          {\n                                              Column = column,\n                                              Visible = defaultColumns.Contains(column),\n                                              Width = -2\n                                          });\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/BlueprintBrowserSettings.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Root Blueprint Browser Settings Class\n    /// </summary>\n    public sealed class BlueprintBrowserSettings\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public BlueprintBrowserSettings()\n        {\n            UsabilityFilter = ObjectUsabilityFilter.All;\n            MetagroupFilter = ItemMetaGroup.All;\n            ActivityFilter = ObjectActivityFilter.Any;\n        }\n\n        /// <summary>\n        /// Gets or sets the text search.\n        /// </summary>\n        /// <value>The text search.</value>\n        [XmlElement(\"textSearch\")]\n        public string TextSearch { get; set; }\n\n        /// <summary>\n        /// Gets or sets the usability filter.\n        /// </summary>\n        /// <value>The usability filter.</value>\n        [XmlElement(\"usabilityFilter\")]\n        public ObjectUsabilityFilter UsabilityFilter { get; set; }\n\n        /// <summary>\n        /// Gets or sets the activity filter.\n        /// </summary>\n        /// <value>The activity filter.</value>\n        [XmlElement(\"activityFilter\")]\n        public ObjectActivityFilter ActivityFilter { get; set; }\n\n        /// <summary>\n        /// Gets or sets the metagroup filter.\n        /// </summary>\n        /// <value>The metagroup filter.</value>\n        [XmlElement(\"metaGroupFilter\")]\n        public ItemMetaGroup MetagroupFilter { get; set; }\n\n        /// <summary>\n        /// Gets or sets the index of the production facility.\n        /// </summary>\n        /// <value>The index of the production facility.</value>\n        [XmlElement(\"productionFacilityIndex\")]\n        public int ProductionFacilityIndex { get; set; }\n\n        /// <summary>\n        /// Gets or sets the index of the research facility.\n        /// </summary>\n        /// <value>The index of the research facility.</value>\n        [XmlElement(\"researchFacilityIndex\")]\n        public int ResearchFacilityIndex { get; set; }\n\n        /// <summary>\n        /// Gets or sets the index of the implant set.\n        /// </summary>\n        /// <value>The index of the implant set.</value>\n        [XmlElement(\"implantSetIndex\")]\n        public int ImplantSetIndex { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/CalendarSettings.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class CalendarSettings\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CalendarSettings\"/> class.\n        /// </summary>\n        public CalendarSettings()\n        {\n            UseOutlookDefaultCalendar = true;\n            GoogleEventReminder = GoogleCalendarReminder.Email;\n            RemindingInterval = 10;\n\n            EarlyReminding = DateTime.Now.Date.AddHours(8);\n            LateReminding = DateTime.Now.Date.AddHours(20);\n            LastQueuedSkillOnly = true;\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"CalendarSettings\"/> is enabled.\n        /// </summary>\n        /// <value><c>true</c> if enabled; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"enabled\")]\n        public bool Enabled { get; set; }\n\n        /// <summary>\n        /// Gets or sets the provider.\n        /// </summary>\n        /// <value>The provider.</value>\n        [XmlElement(\"provider\")]\n        public CalendarProvider Provider { get; set; }\n\n        /// <summary>\n        /// Gets or sets the usage of the MSOutlook default calendar.\n        /// </summary>\n        /// <value><c>true</c> if use default calendar; otherwise, <c>false</c>.</value>\n        [XmlElement(\"useOutlookDefaultCalendar\")]\n        public bool UseOutlookDefaultCalendar { get; set; }\n\n        /// <summary>\n        /// Gets or sets the MSOutlook custom calendar path.\n        /// </summary>\n        /// <value>The custom calendar path.</value>\n        [XmlElement(\"outlookCustomCalendarPath\")]\n        public string OutlookCustomCalendarPath { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether to use reminding.\n        /// </summary>\n        /// <value><c>true</c> if [use reminding]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"useReminding\")]\n        public bool UseReminding { get; set; }\n\n        /// <summary>\n        /// Interval between remindings, in minutes\n        /// </summary>\n        [XmlElement(\"remindingInterval\")]\n        public int RemindingInterval { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether to use alternate reminding.\n        /// </summary>\n        /// <value>\n        /// <c>true</c> if to use alternate reminding; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"useAlternateReminding\")]\n        public bool UseAlternateReminding { get; set; }\n\n        /// <summary>\n        /// Gets or sets the early reminding.\n        /// </summary>\n        /// <value>The early reminding.</value>\n        [XmlElement(\"earlyReminding\")]\n        public DateTime EarlyReminding { get; set; }\n\n        /// <summary>\n        /// Gets or sets the late reminding.\n        /// </summary>\n        /// <value>The late reminding.</value>\n        [XmlElement(\"lateReminding\")]\n        public DateTime LateReminding { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name of the google calendar.\n        /// </summary>\n        /// <value>\n        /// The name of the google calendar.\n        /// </value>\n        [XmlElement(\"googleCalendarName\")]\n        public string GoogleCalendarName { get; set; }\n\n        /// <summary>\n        /// Gets or sets the google reminder.\n        /// </summary>\n        /// <value>The google reminder.</value>\n        [XmlElement(\"googleEventReminder\")]\n        public GoogleCalendarReminder GoogleEventReminder { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [last queued skill only].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [last queued skill only]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"lastQueuedSkillOnly\")]\n        public bool LastQueuedSkillOnly { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/CertificateBrowserSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class CertificateBrowserSettings\n    {\n        /// <summary>\n        /// Gets or sets the text search.\n        /// </summary>\n        /// <value>The text search.</value>\n        [XmlElement(\"textSearch\")]\n        public string TextSearch { get; set; }\n\n        /// <summary>\n        /// Gets or sets the filter.\n        /// </summary>\n        /// <value>The filter.</value>\n        [XmlElement(\"filter\")]\n        public CertificateFilter Filter { get; set; }\n\n        /// <summary>\n        /// Gets or sets the sort.\n        /// </summary>\n        /// <value>The sort.</value>\n        [XmlElement(\"sort\")]\n        public CertificateSort Sort { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/CharacterUISettings.cs",
    "content": "﻿using System;\nusing System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents the settings for a character.\n    /// </summary>\n    public sealed class CharacterUISettings\n    {\n        private readonly Collection<string> m_collapsedGroups;\n        private readonly Collection<string> m_advancedFeaturesEnabledPages;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CharacterUISettings\"/> class.\n        /// </summary>\n        public CharacterUISettings()\n        {\n            SelectedPage = string.Empty;\n            m_collapsedGroups = new Collection<string>();\n            m_advancedFeaturesEnabledPages = new Collection<string>();\n        }\n\n        /// <summary>\n        /// Gets or sets the selected page.\n        /// </summary>\n        /// <value>The selected page.</value>\n        [XmlElement(\"selectedPage\")]\n        public string SelectedPage { get; set; }\n\n        /// <summary>\n        /// Gets or sets the collapsed groups.\n        /// </summary>\n        /// <value>The collapsed groups.</value>\n        [XmlElement(\"collapsedGroup\")]\n        public Collection<string> CollapsedGroups => m_collapsedGroups;\n\n        /// <summary>\n        /// Gets or sets the assets group by.\n        /// </summary>\n        /// <value>The assets group by.</value>\n        [XmlElement(\"assetsGroupBy\")]\n        public AssetGrouping AssetsGroupBy { get; set; }\n\n        /// <summary>\n        /// Gets or sets the orders group by.\n        /// </summary>\n        /// <value>The orders group by.</value>\n        [XmlElement(\"ordersGroupBy\")]\n        public MarketOrderGrouping OrdersGroupBy { get; set; }\n\n        /// <summary>\n        /// Gets or sets the contracts group by.\n        /// </summary>\n        /// <value>The contracts group by.</value>\n        [XmlElement(\"contractsGroupBy\")]\n        public ContractGrouping ContractsGroupBy { get; set; }\n\n        /// <summary>\n        /// Gets or sets the wallet journal group by.\n        /// </summary>\n        /// <value>The wallet journal group by.</value>\n        [XmlElement(\"walletJournalGroupBy\")]\n        public WalletJournalGrouping WalletJournalGroupBy { get; set; }\n\n        /// <summary>\n        /// Gets or sets the wallet transactions group by.\n        /// </summary>\n        /// <value>The wallet transactions group by.</value>\n        [XmlElement(\"walletTransactionsGroupBy\")]\n        public WalletTransactionGrouping WalletTransactionsGroupBy { get; set; }\n\n        /// <summary>\n        /// Gets or sets the jobs group by.\n        /// </summary>\n        /// <value>The jobs group by.</value>\n        [XmlElement(\"jobsGroupBy\")]\n        public IndustryJobGrouping JobsGroupBy { get; set; }\n\n        /// <summary>\n        /// Gets or sets the planetary group by.\n        /// </summary>\n        /// <value>The planetary group by.</value>\n        [XmlElement(\"planetaryGroupBy\")]\n        public PlanetaryGrouping PlanetaryGroupBy { get; set; }\n\n        /// <summary>\n        /// Gets or sets the EVE mail messages group by.\n        /// </summary>\n        /// <value>The EVE mail messages group by.</value>\n        [XmlElement(\"mailMessagesGroupBy\")]\n        public EVEMailMessagesGrouping EVEMailMessagesGroupBy { get; set; }\n\n        /// <summary>\n        /// Gets or sets the EVE notifications group by.\n        /// </summary>\n        /// <value>The EVE notifications group by.</value>\n        [XmlElement(\"eveNotificationsGroupBy\")]\n        public EVENotificationsGrouping EVENotificationsGroupBy { get; set; }\n\n        /// <summary>\n        /// Gets or sets the advanced features enabled pages.\n        /// </summary>\n        /// <value>The advanced features enabled pages.</value>\n        [XmlElement(\"advancedFeaturesEnabledPages\")]\n        public Collection<string> AdvancedFeaturesEnabledPages => m_advancedFeaturesEnabledPages;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/CloudStorageServiceProviderSettings.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.CloudStorageServices;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n\n    public sealed class CloudStorageServiceProviderSettings\n    {\n        private static readonly Dictionary<string, CloudStorageServiceProvider> s_cloudStorageServiceProviders = new Dictionary<string, CloudStorageServiceProvider>();\n\n        public CloudStorageServiceProviderSettings()\n        {\n            foreach (CloudStorageServiceProvider provider in CloudStorageServiceProvider.Providers)\n            {\n                s_cloudStorageServiceProviders[provider.Name] = provider;\n            }\n\n            ProviderName = s_cloudStorageServiceProviders.FirstOrDefault().Key ?? string.Empty;\n        }\n\n        /// <summary>\n        /// Gets or sets the provider name.\n        /// </summary>\n        /// <value>\n        /// The name of the provider.\n        /// </value>\n        [XmlAttribute(\"provider\")]\n        public string ProviderName { get; set; }\n\n        /// <summary>\n        /// Gets the provider.\n        /// </summary>\n        /// <value>\n        /// The provider.\n        /// </value>\n        [XmlIgnore]\n        public CloudStorageServiceProvider Provider\n        {\n            get\n            {\n                if (s_cloudStorageServiceProviders.ContainsKey(ProviderName))\n                    return s_cloudStorageServiceProviders[ProviderName];\n\n                ProviderName = s_cloudStorageServiceProviders.FirstOrDefault().Key ?? string.Empty;\n\n                return s_cloudStorageServiceProviders.FirstOrDefault().Value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/CombatLogSettings.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for Combat Log.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class CombatLogSettings\n    {\n        /// <summary>\n        /// Gets or sets a value indicating whether to show condensed combat log.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if to show condensed combat log; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showCondensedLogs\")]\n        public bool ShowCondensedLogs { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/ContractColumn.cs",
    "content": "﻿using System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents the available column types.\n    /// </summary>\n    public enum ContractColumn\n    {\n        None = -1,\n\n        [Header(\"Contract\")]\n        [Description(\"Contract\")]\n        ContractText = 0,\n\n        [Header(\"Title\")]\n        [Description(\"Description of Contract\")]\n        Title = 1,\n\n        [Header(\"Type\")]\n        [Description(\"Contract Type\")]\n        ContractType = 2,\n\n        [Header(\"Status\")]\n        [Description(\"Contract Status\")]\n        Status = 3,\n\n        [Header(\"From\")]\n        [Description(\"Issuer\")]\n        Issuer = 4,\n\n        [Header(\"To\")]\n        [Description(\"Assigned to (Recipient)\")]\n        Assignee = 5,\n\n        [Header(\"Accepted by\")]\n        [Description(\"Accepted by (Recipient)\")]\n        Acceptor = 6,\n\n        [Header(\"Availability\")]\n        [Description(\"Availability\")]\n        Availability = 7,\n\n        [Header(\"Price\")]\n        [Description(\"Price\")]\n        Price = 8,\n\n        [Header(\"Buyout\")]\n        [Description(\"Buyout\")]\n        Buyout = 9,\n\n        [Header(\"Reward\")]\n        [Description(\"Reward\")]\n        Reward = 10,\n\n        [Header(\"Collateral\")]\n        [Description(\"Collateral\")]\n        Collateral = 11,\n\n        [Header(\"Volume\")]\n        [Description(\"Volume (m³)\")]\n        Volume = 12,\n\n        [Header(\"Starting Location\")]\n        [Description(\"Starting Location (Full)\")]\n        StartLocation = 13,\n\n        [Header(\"Starting Region\")]\n        [Description(\"Starting Location (Region)\")]\n        StartRegion = 14,\n\n        [Header(\"Starting System\")]\n        [Description(\"Starting Location (Solar System)\")]\n        StartSolarSystem = 15,\n\n        [Header(\"Starting Station\")]\n        [Description(\"Starting Location (Station)\")]\n        StartStation = 16,\n\n        [Header(\"Ending Location\")]\n        [Description(\"Ending Location (Full)\")]\n        EndLocation = 17,\n\n        [Header(\"Ending Region\")]\n        [Description(\"Ending Location (Region)\")]\n        EndRegion = 18,\n\n        [Header(\"Ending System\")]\n        [Description(\"Ending Location (Solar System)\")]\n        EndSolarSystem = 19,\n\n        [Header(\"Ending Station\")]\n        [Description(\"Ending Location (Station)\")]\n        EndStation = 20,\n\n        [Header(\"Issued\")]\n        [Description(\"Issue Date\")]\n        Issued = 21,\n\n        [Header(\"Accepted\")]\n        [Description(\"Accept Date\")]\n        Accepted = 22,\n\n        [Header(\"Completed\")]\n        [Description(\"Complete Date\")]\n        Completed = 23,\n\n        [Header(\"Duration\")]\n        [Description(\"Duration\")]\n        Duration = 24,\n\n        [Header(\"Days To Complete\")]\n        [Description(\"Days To Complete\")]\n        DaysToComplete = 25,\n\n        [Header(\"Expires In\")]\n        [Description(\"Expires In\")]\n        Expiration = 26,\n\n        [Header(\"Issued For\")]\n        [Description(\"Issued For\")]\n        IssuedFor = 27\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/ContractColumnSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class ContractColumnSettings : IColumnSettings\n    {\n        /// <summary>\n        /// Gets or sets the column.\n        /// </summary>\n        /// <value>The column.</value>\n        [XmlAttribute(\"column\")]\n        public ContractColumn Column { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"ContractColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"visible\")]\n        public bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int IColumnSettings.Key => (int)Column;\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents this instance.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents this instance.\n        /// </returns>\n        public override string ToString() => Column.GetHeader();\n\n        /// <summary>\n        /// Creates a new object that is a copy of the current instance.\n        /// </summary>\n        /// <returns>\n        /// A new object that is a copy of this instance.\n        /// </returns>\n        public object Clone() => MemberwiseClone();\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/ContractSettings.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class ContractSettings\n    {\n        private readonly Collection<ContractColumnSettings> m_columns;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ContractSettings\"/> class.\n        /// </summary>\n        public ContractSettings()\n        {\n            m_columns = new Collection<ContractColumnSettings>();\n\n            HideInactiveContracts = true;\n        }\n\n        /// <summary>\n        /// Gets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        [XmlArray(\"columns\")]\n        [XmlArrayItem(\"column\")]\n        public Collection<ContractColumnSettings> Columns => m_columns;\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [hide inactive orders].\n        /// </summary>\n        /// <value><c>true</c> if [hide inactive orders]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"hideInactiveContracts\")]\n        public bool HideInactiveContracts { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [number abs format].\n        /// </summary>\n        /// <value><c>true</c> if [number abs format]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"numberAbsFormat\")]\n        public bool NumberAbsFormat { get; set; }\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <value>The default columns.</value>\n        public IEnumerable<ContractColumnSettings> DefaultColumns\n        {\n            get\n            {\n                ContractColumn[] defaultColumns = new[]\n                                                         {\n                                                             ContractColumn.Status,\n                                                             ContractColumn.ContractText,\n                                                             ContractColumn.ContractType,\n                                                             ContractColumn.Issuer,\n                                                             ContractColumn.Assignee,\n                                                             ContractColumn.Issued,\n                                                             ContractColumn.Expiration\n                                                         };\n\n                return EnumExtensions.GetValues<ContractColumn>().Where(\n                    column => column != ContractColumn.None).Where(\n                        column => Columns.All(columnSetting => columnSetting.Column != column)).Select(\n                            column => new ContractColumnSettings\n                                              {\n                                                  Column = column,\n                                                  Visible = defaultColumns.Contains(column),\n                                                  Width = -2\n                                              });\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/CustomMsgBoxSettings.cs",
    "content": "using System.Windows.Forms;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class CustomMsgBoxSettings\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CustomMsgBoxSettings\"/> class.\n        /// </summary>\n        public CustomMsgBoxSettings()\n        {\n            ShowDialogBox = true;\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show dialog box].\n        /// </summary>\n        /// <value><c>true</c> if [show dialog box]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"showDialogBox\")]\n        public bool ShowDialogBox { get; set; }\n\n        /// <summary>\n        /// Gets or sets the dialog result.\n        /// </summary>\n        /// <value>The dialog result.</value>\n        [XmlAttribute(\"dialogResult\")]\n        public DialogResult DialogResult { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/EVEMailMessagesColumn.cs",
    "content": "using System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents the available column types\n    /// </summary>\n    public enum EveMailMessagesColumn\n    {\n        None = -1,\n\n        [Header(\"Received\")]\n        [Description(\"Received Date\")]\n        SentDate = 0,\n\n        [Header(\"From\")]\n        [Description(\"From ( Sender )\")]\n        SenderName = 1,\n\n        [Header(\"Subject\")]\n        [Description(\"Subject\")]\n        Title = 2,\n\n        [Header(\"To\")]\n        [Description(\"To ( Recipient(s) )\")]\n        ToCharacters = 3,\n\n        [Header(\"To Corp Or Alliance\")]\n        [Description(\"To Corp Or Alliance\")]\n        ToCorpOrAlliance = 4,\n\n        [Header(\"To Mailing List\")]\n        [Description(\"To Mailing List(s)\")]\n        ToMailingList = 5,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/EVEMailMessagesColumnSettings.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class EveMailMessagesColumnSettings : IColumnSettings\n    {\n        /// <summary>\n        /// Gets or sets the column.\n        /// </summary>\n        /// <value>The column.</value>\n        [XmlAttribute(\"column\")]\n        public EveMailMessagesColumn Column { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"EveMailMessagesColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"visible\")]\n        public bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int IColumnSettings.Key\n        {\n            get { return (int)Column; }\n        }\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents this instance.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents this instance.\n        /// </returns>\n        public override string ToString()\n        {\n            return Column.GetHeader();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/EVEMailMessagesSettings.cs",
    "content": "using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for EVE Mail Messages.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class EveMailMessagesSettings\n    {\n        private readonly Collection<EveMailMessagesColumnSettings> m_columns;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveMailMessagesSettings\"/> class.\n        /// </summary>\n        public EveMailMessagesSettings()\n        {\n            m_columns = new Collection<EveMailMessagesColumnSettings>();\n\n            ReadingPanePosition = ReadingPanePositioning.Off;\n        }\n\n        /// <summary>\n        /// Gets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        [XmlArray(\"columns\")]\n        [XmlArrayItem(\"column\")]\n        public Collection<EveMailMessagesColumnSettings> Columns\n        {\n            get { return m_columns; }\n        }\n\n        /// <summary>\n        /// Gets or sets the reading pane position.\n        /// </summary>\n        /// <value>The reading pane position.</value>\n        [XmlElement(\"readingPanePosition\")]\n        public ReadingPanePositioning ReadingPanePosition { get; set; }\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <value>The default columns.</value>\n        public IEnumerable<EveMailMessagesColumnSettings> DefaultColumns\n        {\n            get\n            {\n                EveMailMessagesColumn[] defaultColumns = new[]\n                                                             {\n                                                                 EveMailMessagesColumn.SenderName,\n                                                                 EveMailMessagesColumn.Title,\n                                                                 EveMailMessagesColumn.SentDate,\n                                                                 EveMailMessagesColumn.ToCharacters\n                                                             };\n\n                return EnumExtensions.GetValues<EveMailMessagesColumn>().Where(\n                    planColumn => planColumn != EveMailMessagesColumn.None).Where(\n                        planColumn => Columns.All(columnSetting => columnSetting.Column != planColumn)).Select(\n                            planColumn => new EveMailMessagesColumnSettings\n                                              {\n                                                  Column = planColumn,\n                                                  Visible = defaultColumns.Contains(planColumn),\n                                                  Width = -2\n                                              });\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/EveMailMessageColumn.cs",
    "content": "using System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents the available column types.\n    /// </summary>\n    public enum EveMailMessageColumn\n    {\n        None = -1,\n\n        [Header(\"Received\")]\n        [Description(\"Received Date\")]\n        SentDate = 0,\n\n        [Header(\"From\")]\n        [Description(\"From ( Sender )\")]\n        SenderName = 1,\n\n        [Header(\"Subject\")]\n        [Description(\"Subject\")]\n        Title = 2,\n\n        [Header(\"To\")]\n        [Description(\"To ( Recipient(s) )\")]\n        ToCharacters = 3,\n\n        [Header(\"To Corp Or Alliance\")]\n        [Description(\"To Corp Or Alliance\")]\n        ToCorpOrAlliance = 4,\n\n        [Header(\"To Mailing List\")]\n        [Description(\"To Mailing List(s)\")]\n        ToMailingList = 5,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/EveMailMessageColumnSettings.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class EveMailMessageColumnSettings : IColumnSettings\n    {\n        /// <summary>\n        /// Gets or sets the column.\n        /// </summary>\n        /// <value>The column.</value>\n        [XmlAttribute(\"column\")]\n        public EveMailMessageColumn Column { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"EveMailMessageColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"visible\")]\n        public bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int IColumnSettings.Key => (int)Column;\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents this instance.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents this instance.\n        /// </returns>\n        public override string ToString() => Column.GetHeader();\n\n        /// <summary>\n        /// Creates a new object that is a copy of the current instance.\n        /// </summary>\n        /// <returns>\n        /// A new object that is a copy of this instance.\n        /// </returns>\n        public object Clone() => MemberwiseClone();\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/EveMailMessageSettings.cs",
    "content": "using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for EVE Mail Messages.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class EveMailMessageSettings\n    {\n        private readonly Collection<EveMailMessageColumnSettings> m_columns;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveMailMessageSettings\"/> class.\n        /// </summary>\n        public EveMailMessageSettings()\n        {\n            m_columns = new Collection<EveMailMessageColumnSettings>();\n\n            ReadingPanePosition = ReadingPanePositioning.Off;\n        }\n\n        /// <summary>\n        /// Gets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        [XmlArray(\"columns\")]\n        [XmlArrayItem(\"column\")]\n        public Collection<EveMailMessageColumnSettings> Columns => m_columns;\n\n        /// <summary>\n        /// Gets or sets the reading pane position.\n        /// </summary>\n        /// <value>The reading pane position.</value>\n        [XmlElement(\"readingPanePosition\")]\n        public ReadingPanePositioning ReadingPanePosition { get; set; }\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <value>The default columns.</value>\n        public IEnumerable<EveMailMessageColumnSettings> DefaultColumns\n        {\n            get\n            {\n                EveMailMessageColumn[] defaultColumns =\n                {\n                    EveMailMessageColumn.SenderName,\n                    EveMailMessageColumn.Title,\n                    EveMailMessageColumn.SentDate,\n                    EveMailMessageColumn.ToCharacters\n                };\n\n                return EnumExtensions.GetValues<EveMailMessageColumn>().Where(\n                    column => column != EveMailMessageColumn.None).Where(\n                        column => Columns.All(columnSetting => columnSetting.Column != column)).Select(\n                            column => new EveMailMessageColumnSettings\n                                      {\n                                          Column = column,\n                                          Visible = defaultColumns.Contains(column),\n                                          Width = -2\n                                      });\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/EveNotificationColumn.cs",
    "content": "﻿using System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents the available column types.\n    /// </summary>\n    public enum EveNotificationColumn\n    {\n        None = -1,\n\n        [Header(\"Received\")]\n        [Description(\"Received Date\")]\n        SentDate = 0,\n\n        [Header(\"From\")]\n        [Description(\"From ( Sender )\")]\n        SenderName = 1,\n\n        [Header(\"Subject\")]\n        [Description(\"Subject\")]\n        Type = 2,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/EveNotificationColumnSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class EveNotificationColumnSettings : IColumnSettings\n    {\n        /// <summary>\n        /// Gets or sets the column.\n        /// </summary>\n        /// <value>The column.</value>\n        [XmlAttribute(\"column\")]\n        public EveNotificationColumn Column { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"EveNotificationColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"visible\")]\n        public bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int IColumnSettings.Key => (int)Column;\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents the column's header text.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents the column's header text.\n        /// </returns>\n        public override string ToString() => Column.GetHeader();\n\n        /// <summary>\n        /// Creates a new object that is a copy of the current instance.\n        /// </summary>\n        /// <returns>\n        /// A new object that is a copy of this instance.\n        /// </returns>\n        public object Clone() => MemberwiseClone();\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/EveNotificationSettings.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for EVE Notifications.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class EveNotificationSettings\n    {\n        private readonly Collection<EveNotificationColumnSettings> m_columns;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveNotificationSettings\"/> class.\n        /// </summary>\n        public EveNotificationSettings()\n        {\n            m_columns = new Collection<EveNotificationColumnSettings>();\n\n            ReadingPanePosition = ReadingPanePositioning.Off;\n        }\n\n        /// <summary>\n        /// Gets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        [XmlArray(\"columns\")]\n        [XmlArrayItem(\"column\")]\n        public Collection<EveNotificationColumnSettings> Columns => m_columns;\n\n        /// <summary>\n        /// Gets or sets the reading pane position.\n        /// </summary>\n        /// <value>The reading pane position.</value>\n        [XmlElement(\"readingPanePosition\")]\n        public ReadingPanePositioning ReadingPanePosition { get; set; }\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <value>The default columns.</value>\n        public IEnumerable<EveNotificationColumnSettings> DefaultColumns\n        {\n            get\n            {\n                EveNotificationColumn[] defaultColumns = new[]\n                                                              {\n                                                                  EveNotificationColumn.SenderName,\n                                                                  EveNotificationColumn.Type,\n                                                                  EveNotificationColumn.SentDate\n                                                              };\n\n                return EnumExtensions.GetValues<EveNotificationColumn>().Where(\n                    column => column != EveNotificationColumn.None).Where(\n                        column => Columns.All(columnSetting => columnSetting.Column != column)).Select(\n                            column => new EveNotificationColumnSettings\n                                              {\n                                                  Column = column,\n                                                  Visible = defaultColumns.Contains(column),\n                                                  Width = -2\n                                              });\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/EveNotificationsColumn.cs",
    "content": "﻿using System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents the available column types.\n    /// </summary>\n    public enum EveNotificationsColumn\n    {\n        None = -1,\n\n        [Header(\"Received\")]\n        [Description(\"Received Date\")]\n        SentDate = 0,\n\n        [Header(\"From\")]\n        [Description(\"From ( Sender )\")]\n        SenderName = 1,\n\n        [Header(\"Type\")]\n        [Description(\"Type\")]\n        Type = 2,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/EveNotificationsColumnSettings.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class EveNotificationsColumnSettings : IColumnSettings\n    {\n        /// <summary>\n        /// Gets or sets the column.\n        /// </summary>\n        /// <value>The column.</value>\n        [XmlAttribute(\"column\")]\n        public EveNotificationsColumn Column { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"EveNotificationsColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"visible\")]\n        public bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int IColumnSettings.Key\n        {\n            get { return (int)Column; }\n        }\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents the column's header text.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents the column's header text.\n        /// </returns>\n        public override string ToString()\n        {\n            return Column.GetHeader();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/EveNotificationsSettings.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for EVE Notifications.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class EveNotificationsSettings\n    {\n        private readonly Collection<EveNotificationsColumnSettings> m_columns;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EveNotificationsSettings\"/> class.\n        /// </summary>\n        public EveNotificationsSettings()\n        {\n            m_columns = new Collection<EveNotificationsColumnSettings>();\n\n            ReadingPanePosition = ReadingPanePositioning.Off;\n        }\n\n        /// <summary>\n        /// Gets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        [XmlArray(\"columns\")]\n        [XmlArrayItem(\"column\")]\n        public Collection<EveNotificationsColumnSettings> Columns\n        {\n            get { return m_columns; }\n        }\n\n        /// <summary>\n        /// Gets or sets the reading pane position.\n        /// </summary>\n        /// <value>The reading pane position.</value>\n        [XmlElement(\"readingPanePosition\")]\n        public ReadingPanePositioning ReadingPanePosition { get; set; }\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <value>The default columns.</value>\n        public IEnumerable<EveNotificationsColumnSettings> DefaultColumns\n        {\n            get\n            {\n                EveNotificationsColumn[] defaultColumns = new[]\n                                                              {\n                                                                  EveNotificationsColumn.SenderName,\n                                                                  EveNotificationsColumn.Type,\n                                                                  EveNotificationsColumn.SentDate\n                                                              };\n\n                return EnumExtensions.GetValues<EveNotificationsColumn>().Where(\n                    planColumn => planColumn != EveNotificationsColumn.None).Where(\n                        planColumn => Columns.All(columnSetting => columnSetting.Column != planColumn)).Select(\n                            planColumn => new EveNotificationsColumnSettings\n                                              {\n                                                  Column = planColumn,\n                                                  Visible = defaultColumns.Contains(planColumn),\n                                                  Width = -2\n                                              });\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/ExportationSettings.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class ExportationSettings\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ExportationSettings\"/> class.\n        /// </summary>\n        public ExportationSettings()\n        {\n            PlanToText = new PlanExportSettings();\n        }\n\n        /// <summary>\n        /// Gets or sets the plan to text.\n        /// </summary>\n        /// <value>The plan to text.</value>\n        [XmlElement(\"planToText\")]\n        public PlanExportSettings PlanToText { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/G15Settings.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class G15Settings\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"G15Settings\"/> class.\n        /// </summary>\n        public G15Settings()\n        {\n            CharactersCycleInterval = 20;\n            TimeFormatsCycleInterval = 10;\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"G15Settings\"/> is enabled.\n        /// </summary>\n        /// <value><c>true</c> if enabled; otherwise, <c>false</c>.</value>\n        [XmlElement(\"enabled\")]\n        public bool Enabled { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [use characters cycle].\n        /// </summary>\n        /// <value><c>true</c> if [use characters cycle]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"useCharsCycle\")]\n        public bool UseCharactersCycle { get; set; }\n\n        /// <summary>\n        /// Gets or sets the characters cycle interval.\n        /// </summary>\n        /// <value>The characters cycle interval.</value>\n        [XmlElement(\"charsCycleInterval\")]\n        public int CharactersCycleInterval { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [use time formats cycle].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [use time formats cycle]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"useTimeFormatsCycle\")]\n        public bool UseTimeFormatsCycle { get; set; }\n\n        /// <summary>\n        /// Gets or sets the time formats cycle interval.\n        /// </summary>\n        /// <value>The time formats cycle interval.</value>\n        [XmlElement(\"timeFormatsCycleInterval\")]\n        public int TimeFormatsCycleInterval { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show system time].\n        /// </summary>\n        /// <value><c>true</c> if [show system time]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showSystemTime\")]\n        public bool ShowSystemTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show EVE time].\n        /// </summary>\n        /// <value><c>true</c> if [show EVE time]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showEVETime\")]\n        public bool ShowEVETime { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/IColumnSettings.cs",
    "content": "using System;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public interface IColumnSettings : ICloneable\n    {\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"IColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int Key { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/IgbSettings.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class IgbSettings\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"IgbSettings\"/> class.\n        /// </summary>\n        public IgbSettings()\n        {\n            IgbServerPort = 80;\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [IGB server enabled].\n        /// </summary>\n        /// <value><c>true</c> if [IGB server enabled]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"igbServerEnabled\")]\n        public bool IgbServerEnabled { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [IGB server public].\n        /// </summary>\n        /// <value><c>true</c> if [IGB server public]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"igbServerPublic\")]\n        public bool IgbServerPublic { get; set; }\n\n        /// <summary>\n        /// Gets or sets the IGB server port.\n        /// </summary>\n        /// <value>The IGB server port.</value>\n        [XmlElement(\"igbServerPort\")]\n        public int IgbServerPort { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/IndustryJobColumn.cs",
    "content": "using System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents the available column types.\n    /// </summary>\n    public enum IndustryJobColumn\n    {\n        None = -1,\n\n        [Header(\"State\")]\n        [Description(\"Job State\")]\n        State = 0,\n\n        [Header(\"TTC\")]\n        [Description(\"Time To Completion (TTC)\")]\n        TTC = 1,\n\n        [Header(\"Installed Item\")]\n        [Description(\"Installed Item (Blueprint)\")]\n        InstalledItem = 2,\n\n        [Header(\"Installed Group\")]\n        [Description(\"Installed Item Group\")]\n        InstalledItemType = 3,\n\n        [Header(\"Output Item\")]\n        [Description(\"Output Item\")]\n        OutputItem = 4,\n\n        [Header(\"Output Group\")]\n        [Description(\"Output Item Group\")]\n        OutputItemType = 5,\n\n        [Header(\"Install Date\")]\n        [Description(\"Installed Time\")]\n        InstallTime = 6,\n\n        [Header(\"End Date\")]\n        [Description(\"Estimated End Time\")]\n        EndTime = 7,\n\n        [Header(\"Location\")]\n        [Description(\"Location (Full)\")]\n        Location = 8,\n\n        [Header(\"Region\")]\n        [Description(\"Location (Region)\")]\n        Region = 9,\n\n        [Header(\"System\")]\n        [Description(\"Location (Solar System)\")]\n        SolarSystem = 10,\n\n        [Header(\"Installation\")]\n        [Description(\"Location (Installation)\")]\n        Installation = 11,\n\n        [Header(\"Activity\")]\n        [Description(\"Activity\")]\n        Activity = 12,\n\n        [Header(\"Issued For\")]\n        [Description(\"Issued For\")]\n        IssuedFor = 13,\n\n        [Header(\"Installed Item Type\")]\n        [Description(\"Installed Item Type (Original or Copy)\")]\n        OriginalOrCopy = 14,\n\n        [Header(\"Last Change\")]\n        [Description(\"Last Job State Change\")]\n        LastStateChange = 15,\n\n        [Header(\"Installed ME\")]\n        [Description(\"Installed Material Efficiency Level\")]\n        InstalledME = 16,\n\n        [Header(\"End ME\")]\n        [Description(\"End Material Efficiency Level\")]\n        EndME = 17,\n\n        [Header(\"Installed TE\")]\n        [Description(\"Installed Time Efficiency Level\")]\n        InstalledPE = 18,\n\n        [Header(\"End TE\")]\n        [Description(\"End Time Efficiency Level\")]\n        EndPE = 19,\n\n        [Header(\"Cost\")]\n        [Description(\"Cost (ISK)\")]\n        Cost = 20,\n\n        [Header(\"Probability\")]\n        [Description(\"Probability (%)\")]\n        Probability = 21,\n\n        [Header(\"Runs\")]\n        [Description(\"Runs\")]\n        Runs = 22,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/IndustryJobColumnSettings.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class IndustryJobColumnSettings : IColumnSettings\n    {\n        /// <summary>\n        /// Gets or sets the column.\n        /// </summary>\n        /// <value>The column.</value>\n        [XmlAttribute(\"column\")]\n        public IndustryJobColumn Column { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"IndustryJobColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"visible\")]\n        public bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int IColumnSettings.Key => (int)Column;\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents the column's header text.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents the column's header text.\n        /// </returns>\n        public override string ToString() => Column.GetHeader();\n\n        /// <summary>\n        /// Creates a new object that is a copy of the current instance.\n        /// </summary>\n        /// <returns>\n        /// A new object that is a copy of this instance.\n        /// </returns>\n        public object Clone() => MemberwiseClone();\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/IndustryJobSettings.cs",
    "content": "using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for Industry Jobs.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class IndustryJobSettings\n    {\n        private readonly Collection<IndustryJobColumnSettings> m_columns;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"IndustryJobSettings\"/> class.\n        /// </summary>\n        public IndustryJobSettings()\n        {\n            m_columns = new Collection<IndustryJobColumnSettings>();\n\n            HideInactiveJobs = true;\n        }\n\n        /// <summary>\n        /// Gets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        [XmlArray(\"columns\")]\n        [XmlArrayItem(\"column\")]\n        public Collection<IndustryJobColumnSettings> Columns => m_columns;\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [hide inactive jobs].\n        /// </summary>\n        /// <value><c>true</c> if [hide inactive jobs]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"hideInactiveJobs\")]\n        public bool HideInactiveJobs { get; set; }\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <value>The default columns.</value>\n        public IEnumerable<IndustryJobColumnSettings> DefaultColumns\n        {\n            get\n            {\n                IndustryJobColumn[] defaultColumns =\n                {\n                    IndustryJobColumn.State,\n                    IndustryJobColumn.TTC,\n                    IndustryJobColumn.InstalledItem,\n                    IndustryJobColumn.OutputItem\n                };\n\n                return EnumExtensions.GetValues<IndustryJobColumn>().Where(\n                    column => column != IndustryJobColumn.None).Where(\n                        column => Columns.All(columnSetting => columnSetting.Column != column)).Select(\n                            column => new IndustryJobColumnSettings\n                            {\n                                Column = column,\n                                Visible = defaultColumns.Contains(column),\n                                Width = -2\n                            });\n\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/ItemBrowserSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class ItemBrowserSettings\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ItemBrowserSettings\"/> class.\n        /// </summary>\n        public ItemBrowserSettings()\n        {\n            UsabilityFilter = ObjectUsabilityFilter.All;\n            MetagroupFilter = ItemMetaGroup.All;\n            SlotFilter = ItemSlot.All;\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show all groups].\n        /// </summary>\n        /// <value><c>true</c> if [show all groups]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showAllGroups\")]\n        public bool ShowAllGroups { get; set; }\n\n        /// <summary>\n        /// Gets or sets the text search.\n        /// </summary>\n        /// <value>The text search.</value>\n        [XmlElement(\"textSearch\")]\n        public string TextSearch { get; set; }\n\n        /// <summary>\n        /// Gets or sets the usability filter.\n        /// </summary>\n        /// <value>The usability filter.</value>\n        [XmlElement(\"usabilityFilter\")]\n        public ObjectUsabilityFilter UsabilityFilter { get; set; }\n\n        /// <summary>\n        /// Gets or sets the slot filter.\n        /// </summary>\n        /// <value>The slot filter.</value>\n        [XmlElement(\"slotFilter\")]\n        public ItemSlot SlotFilter { get; set; }\n\n        /// <summary>\n        /// Gets or sets the metagroup filter.\n        /// </summary>\n        /// <value>The metagroup filter.</value>\n        [XmlElement(\"metaGroupFilter\")]\n        public ItemMetaGroup MetagroupFilter { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/LoadoutsProviderSettings.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Loadouts;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class LoadoutsProviderSettings\n    {\n        private static readonly Dictionary<string, LoadoutsProvider> s_loadoutsProviders = new Dictionary<string, LoadoutsProvider>();\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"LoadoutsProviderSettings\"/> class.\n        /// </summary>\n        public LoadoutsProviderSettings()\n        {\n            foreach (LoadoutsProvider provider in LoadoutsProvider.Providers)\n            {\n                s_loadoutsProviders[provider.Name] = provider;\n            }\n\n            ProviderName = s_loadoutsProviders.FirstOrDefault().Key ?? string.Empty;\n        }\n\n        /// <summary>\n        /// Gets or sets the provider name.\n        /// </summary>\n        /// <value>\n        /// The name of the provider.\n        /// </value>\n        [XmlAttribute(\"provider\")]\n        public string ProviderName { get; set; }\n\n        /// <summary>\n        /// Gets the provider.\n        /// </summary>\n        /// <value>\n        /// The provider.\n        /// </value>\n        [XmlIgnore]\n        public LoadoutsProvider Provider\n        {\n            get\n            {\n                if (s_loadoutsProviders.ContainsKey(ProviderName))\n                    return s_loadoutsProviders[ProviderName];\n\n                ProviderName = s_loadoutsProviders.FirstOrDefault().Key ?? string.Empty;\n\n                return s_loadoutsProviders.FirstOrDefault().Value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/MainWindowSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class MainWindowSettings\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MainWindowSettings\"/> class.\n        /// </summary>\n        public MainWindowSettings()\n        {\n            ShowOverview = true;\n            ShowMenuBar = true;\n            CombatLog = new CombatLogSettings();\n            Assets = new AssetSettings();\n            WalletJournal = new WalletJournalSettings();\n            WalletTransactions = new WalletTransactionSettings();\n            MarketOrders = new MarketOrderSettings();\n            Contracts = new ContractSettings();\n            IndustryJobs = new IndustryJobSettings();\n            Planetary = new PlanetarySettings();\n            Research = new ResearchSettings();\n            EVEMailMessages = new EveMailMessageSettings();\n            EVENotifications = new EveNotificationSettings();\n            OverviewItemSize = PortraitSizes.x96;\n            TitleFormat = MainWindowTitleFormat.NextCharToFinish;\n            ShowOverviewSkillQueueTrainingTime = true;\n            ShowOverviewPortrait = true;\n            ShowOverviewWallet = true;\n            ShowOverviewTotalSkillpoints = true;\n            PutTrainingSkillsFirstOnOverview = true;\n            SkillQueueWarningThresholdDays = 1;\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show character info in title bar].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [show character info in title bar]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showCharacterInfoInTitleBar\")]\n        public bool ShowCharacterInfoInTitleBar { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show overview].\n        /// </summary>\n        /// <value><c>true</c> if [show overview]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showOverview\")]\n        public bool ShowOverview { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show menu bar].\n        /// </summary>\n        /// <value><c>true</c> if [show menu bar]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showMenuBar\")]\n        public bool ShowMenuBar { get; set; }\n\n        /// <summary>\n        /// Gets or sets the title format.\n        /// </summary>\n        /// <value>The title format.</value>\n        [XmlElement(\"titleFormat\")]\n        public MainWindowTitleFormat TitleFormat { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show skill name in window title].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [show skill name in window title]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showSkillNameInWindowTitle\")]\n        public bool ShowSkillNameInWindowTitle { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show all public skills].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [show all public skills]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showAllPublicSkills\")]\n        public bool ShowAllPublicSkills { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show non public skills].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [show non public skills]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showNonPublicSkills\")]\n        public bool ShowNonPublicSkills { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show prereq met skills].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [show prereq met skills]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showPrereqMetSkills\")]\n        public bool ShowPrereqMetSkills { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [highlight partial skills].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [highlight partial skills]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"highlightPartialSkills\")]\n        public bool HighlightPartialSkills { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [highlight queued skills].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [highlight queued skills]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"highlightQueuedSkills\")]\n        public bool HighlightQueuedSkills { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [always show skill queue time].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [always show skill queue time]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"alwaysShowSkillQueueTime\")]\n        public bool AlwaysShowSkillQueueTime { get; set; }\n        \n        /// <summary>\n        /// Gets or sets the skill queue warning threshold days.\n        /// </summary>\n        /// <value>\n        /// The skill queue warning threshold days.\n        /// </value>\n        [XmlElement(\"skillQueueWarningThresholdDays\")]\n        public int SkillQueueWarningThresholdDays { get; set; }\n\n        /// <summary>\n        /// Gets or sets the index of the overview.\n        /// </summary>\n        /// <value>The index of the overview.</value>\n        [XmlElement(\"overviewIndex\")]\n        public int OverviewIndex { get; set; }\n\n        /// <summary>\n        /// Gets or sets the size of the overview item.\n        /// </summary>\n        /// <value>The size of the overview item.</value>\n        [XmlElement(\"overviewItemSize\")]\n        public PortraitSizes OverviewItemSize { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show overview wallet].\n        /// </summary>\n        /// <value><c>true</c> if [show overview wallet]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showWalletOnOverview\")]\n        public bool ShowOverviewWallet { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show overview skillpoints].\n        /// </summary>\n        /// <value><c>true</c> if [show overview skillpoints]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showSkillpointsOnOverview\")]\n        public bool ShowOverviewTotalSkillpoints { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show overview portrait].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [show overview portrait]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showPortraitOnOverview\")]\n        public bool ShowOverviewPortrait { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show overview skill queue training time].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [show overview skill queue training time]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showOverviewSkillQueueTrainingTime\")]\n        public bool ShowOverviewSkillQueueTrainingTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show overview location].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [show overview location]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showOverviewLocation\")]\n        public bool ShowOverviewLocation { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show overview jobs]. If both this\n        /// value and ShowOverviewLocation are <c>true</c>, then ShowOverviewLocation will\n        /// take precedence.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [show overview jobs]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showOverviewJobs\")]\n        public bool ShowOverviewJobs { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [put training skills first on overview].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [put training skills first on overview]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"putTrainingSkillsFirstOnOverview\")]\n        public bool PutTrainingSkillsFirstOnOverview { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [use increased contrast on overview].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [use increased contrast on overview]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"useIncreasedContrastOnOverview\")]\n        public bool UseIncreasedContrastOnOverview { get; set; }\n\n        /// <summary>\n        /// Gets or sets the combat log.\n        /// </summary>\n        /// <value>The combat log.</value>\n        [XmlElement(\"combatLog\")]\n        public CombatLogSettings CombatLog { get; set; }\n\n        /// <summary>\n        /// Gets or sets the assets.\n        /// </summary>\n        /// <value>The assets.</value>\n        [XmlElement(\"assets\")]\n        public AssetSettings Assets { get; set; }\n\n        /// <summary>\n        /// Gets or sets the market orders.\n        /// </summary>\n        /// <value>The market orders.</value>\n        [XmlElement(\"marketOrders\")]\n        public MarketOrderSettings MarketOrders { get; set; }\n\n        /// <summary>\n        /// Gets or sets the contracts.\n        /// </summary>\n        /// <value>The contracts.</value>\n        [XmlElement(\"contracts\")]\n        public ContractSettings Contracts { get; set; }\n\n        /// <summary>\n        /// Gets or sets the wallet journal.\n        /// </summary>\n        /// <value>The wallet journal.</value>\n        [XmlElement(\"walletJournal\")]\n        public WalletJournalSettings WalletJournal { get; set; }\n\n        /// <summary>\n        /// Gets or sets the wallet transactions.\n        /// </summary>\n        /// <value>The wallet transactions.</value>\n        [XmlElement(\"walletTransactions\")]\n        public WalletTransactionSettings WalletTransactions { get; set; }\n\n        /// <summary>\n        /// Gets or sets the industry jobs.\n        /// </summary>\n        /// <value>The industry jobs.</value>\n        [XmlElement(\"industryJobs\")]\n        public IndustryJobSettings IndustryJobs { get; set; }\n\n        /// <summary>\n        /// Gets or sets the planetary.\n        /// </summary>\n        [XmlElement(\"planetary\")]\n        public PlanetarySettings Planetary { get; set; }\n\n        /// <summary>\n        /// Gets or sets the research.\n        /// </summary>\n        /// <value>The research.</value>\n        [XmlElement(\"research\")]\n        public ResearchSettings Research { get; set; }\n\n        /// <summary>\n        /// Gets or sets the EVE mail messages.\n        /// </summary>\n        /// <value>The EVE mail messages.</value>\n        [XmlElement(\"eveMailMessages\")]\n        public EveMailMessageSettings EVEMailMessages { get; set; }\n\n        /// <summary>\n        /// Gets or sets the EVE notifications.\n        /// </summary>\n        /// <value>The EVE notifications.</value>\n        [XmlElement(\"eveNotifications\")]\n        public EveNotificationSettings EVENotifications { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/MarketOrderColumn.cs",
    "content": "﻿using System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents the available column types.\n    /// </summary>\n    public enum MarketOrderColumn\n    {\n        None = -1,\n\n        [Header(\"Item\")]\n        [Description(\"Item\")]\n        Item = 0,\n\n        [Header(\"Type\")]\n        [Description(\"Item Type\")]\n        ItemType = 1,\n\n        [Header(\"Location\")]\n        [Description(\"Location (Full)\")]\n        Location = 2,\n\n        [Header(\"Region\")]\n        [Description(\"Location (Region)\")]\n        Region = 3,\n\n        [Header(\"System\")]\n        [Description(\"Location (Solar System)\")]\n        SolarSystem = 4,\n\n        [Header(\"Station\")]\n        [Description(\"Location (Station)\")]\n        Station = 5,\n\n        [Header(\"Unit Price\")]\n        [Description(\"Unit Price (ISK)\")]\n        UnitaryPrice = 6,\n\n        [Header(\"Total Price\")]\n        [Description(\"Total Price (ISK)\")]\n        TotalPrice = 7,\n\n        [Header(\"Issued\")]\n        [Description(\"Issue Date\")]\n        Issued = 8,\n\n        [Header(\"Issued For\")]\n        [Description(\"Issued For\")]\n        IssuedFor = 9,\n\n        [Header(\"Expires In\")]\n        [Description(\"Expires In\")]\n        Expiration = 10,\n\n        [Header(\"Duration\")]\n        [Description(\"Duration\")]\n        Duration = 11,\n\n        [Header(\"Quantity\")]\n        [Description(\"Quantity (Remaining / Initial)\")]\n        Volume = 12,\n\n        [Header(\"Min\")]\n        [Description(\"Quantity (Minimum)\")]\n        MinimumVolume = 13,\n\n        [Header(\"Remaining\")]\n        [Description(\"Quantity (Remaining)\")]\n        RemainingVolume = 14,\n\n        [Header(\"Initial\")]\n        [Description(\"Quantity (Initial)\")]\n        InitialVolume = 15,\n\n        [Header(\"Last Change\")]\n        [Description(\"Last Order State Change\")]\n        LastStateChange = 16,\n\n        [Header(\"Range\")]\n        [Description(\"Order Range\")]\n        OrderRange = 17,\n\n        [Header(\"Escrow\")]\n        [Description(\"Escrow (ISK)\")]\n        Escrow = 18\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/MarketOrderColumnSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class MarketOrderColumnSettings : IColumnSettings\n    {\n        /// <summary>\n        /// Gets or sets the column.\n        /// </summary>\n        /// <value>The column.</value>\n        [XmlAttribute(\"column\")]\n        public MarketOrderColumn Column { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"MarketOrderColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"visible\")]\n        public bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int IColumnSettings.Key => (int)Column;\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents this instance.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents this instance.\n        /// </returns>\n        public override string ToString() => Column.GetHeader();\n\n        /// <summary>\n        /// Creates a new object that is a copy of the current instance.\n        /// </summary>\n        /// <returns>\n        /// A new object that is a copy of this instance.\n        /// </returns>\n        public object Clone() => MemberwiseClone();\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/MarketOrderSettings.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for Market Orders.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class MarketOrderSettings\n    {\n        private readonly Collection<MarketOrderColumnSettings> m_columns;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MarketOrderSettings\"/> class.\n        /// </summary>\n        public MarketOrderSettings()\n        {\n            m_columns = new Collection<MarketOrderColumnSettings>();\n\n            HideInactiveOrders = true;\n        }\n\n        /// <summary>\n        /// Gets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        [XmlArray(\"columns\")]\n        [XmlArrayItem(\"column\")]\n        public Collection<MarketOrderColumnSettings> Columns => m_columns;\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [hide inactive orders].\n        /// </summary>\n        /// <value><c>true</c> if [hide inactive orders]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"hideInactiveOrders\")]\n        public bool HideInactiveOrders { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [number abs format].\n        /// </summary>\n        /// <value><c>true</c> if [number abs format]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"numberAbsFormat\")]\n        public bool NumberAbsFormat { get; set; }\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <value>The default columns.</value>\n        public IEnumerable<MarketOrderColumnSettings> DefaultColumns\n        {\n            get\n            {\n                MarketOrderColumn[] defaultColumns = new[]\n                                                         {\n                                                             MarketOrderColumn.Item,\n                                                             MarketOrderColumn.SolarSystem,\n                                                             MarketOrderColumn.UnitaryPrice,\n                                                             MarketOrderColumn.Volume\n                                                         };\n\n                return EnumExtensions.GetValues<MarketOrderColumn>().Where(\n                    column => column != MarketOrderColumn.None).Where(\n                        column => Columns.All(columnSetting => columnSetting.Column != column)).Select(\n                            column => new MarketOrderColumnSettings\n                                              {\n                                                  Column = column,\n                                                  Visible = defaultColumns.Contains(column),\n                                                  Width = -2\n                                              });\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/MarketPricerSettings.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.MarketPricer;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class MarketPricerSettings\n    {\n        private static readonly Dictionary<string, ItemPricer> s_pricer = new Dictionary<string, ItemPricer>();\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MarketPricerSettings\"/> class.\n        /// </summary>\n        public MarketPricerSettings()\n        {\n            try\n            {\n                foreach (ItemPricer pricer in ItemPricer.Providers)\n                {\n                    s_pricer[pricer.Name] = pricer;\n                }\n\n                ProviderName = s_pricer.FirstOrDefault().Key ?? string.Empty;\n            }\n            catch (System.Reflection.ReflectionTypeLoadException e)\n            {\n                // Dump the loader exceptions for more debug information\n                EveMonClient.Trace(\"Error loading market price providers:\");\n                foreach (var exception in e.LoaderExceptions)\n                    if (exception != null)\n                        EveMonClient.Trace(exception.ToString(), false);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the provider name.\n        /// </summary>\n        /// <value>\n        /// The name of the provider.\n        /// </value>\n        [XmlAttribute(\"provider\")]\n        public string ProviderName { get; set; }\n\n        /// <summary>\n        /// Gets the pricer.\n        /// </summary>\n        /// <value>\n        /// The pricer.\n        /// </value>\n        [XmlIgnore]\n        public ItemPricer Pricer\n        {\n            get\n            {\n                if (s_pricer.ContainsKey(ProviderName))\n                    return s_pricer[ProviderName];\n\n                ProviderName = s_pricer.FirstOrDefault().Key ?? string.Empty;\n\n                return s_pricer.FirstOrDefault().Value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/ModifiedSerializableDictionary.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.Serialization;\nusing System.Xml;\nusing System.Xml.Schema;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    [Serializable]\n    public sealed class ModifiedSerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EVEMon.Common.SettingsObjects.SerializableDictionary{TKey,TValue}\"/> class.\n        /// </summary>\n        /// <param name=\"info\">The info.</param>\n        /// <param name=\"context\">The context.</param>\n        /// <remarks>Implemented to satisfy rule CA2229</remarks>\n        private ModifiedSerializableDictionary(SerializationInfo info, StreamingContext context)\n            : base(info, context)\n        {\n        }\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public ModifiedSerializableDictionary()\n        {\n        }\n\n        /// <summary>\n        /// Copy constructor.\n        /// </summary>\n        /// <param name=\"source\"></param>\n        public ModifiedSerializableDictionary(IDictionary<TKey, TValue> source)\n            : base(source)\n        {\n        }\n\n        /// <summary>\n        /// This method is reserved and should not be used.\n        /// When implementing the IXmlSerializable interface,\n        /// you should return null (Nothing in Visual Basic) from this method,\n        /// and instead, if specifying a custom schema is required,\n        /// apply the <see cref=\"T:System.Xml.Serialization.XmlSchemaProviderAttribute\"/> to the class.\n        /// </summary>\n        /// <returns>\n        /// An <see cref=\"T:System.Xml.Schema.XmlSchema\"/> that describes the XML representation of the object\n        /// that is produced by the <see cref=\"M:System.Xml.Serialization.IXmlSerializable.WriteXml(System.Xml.XmlWriter)\"/> method\n        /// and consumed by the <see cref=\"M:System.Xml.Serialization.IXmlSerializable.ReadXml(System.Xml.XmlReader)\"/> method.\n        /// </returns>\n        public XmlSchema GetSchema() => null;\n\n        /// <summary>\n        /// Generates an object from its XML representation.\n        /// </summary>\n        /// <param name=\"reader\">The <see cref=\"T:System.Xml.XmlReader\"/> stream from which the object is deserialized.</param>\n        /// <exception cref=\"System.ArgumentNullException\">reader</exception>\n        public void ReadXml(XmlReader reader)\n        {\n            reader.ThrowIfNull(nameof(reader));\n\n            if (reader.IsEmptyElement)\n                return;\n\n            reader.Read();\n            while (reader.NodeType != XmlNodeType.EndElement)\n            {\n                TValue value = default(TValue);\n\n                // Does the element have attributes?\n                if (reader.HasAttributes)\n                {\n                    Type valueType = typeof(TValue);\n\n                    // Does type have properties ?\n                    if (valueType.GetProperties().Length == 0)\n                    {\n                        TypeConverter converter = TypeDescriptor.GetConverter(valueType);\n\n                        string attribute = reader.GetAttribute(0);\n\n                        if (string.IsNullOrEmpty(attribute))\n                            break;\n\n                        // Assign the value\n                        value = (TValue)converter.ConvertFromInvariantString(attribute);\n                    }\n                    else\n                    {\n                        // Assign the value\n                        value = Activator.CreateInstance<TValue>();\n\n                        // Assign values to the properties\n                        foreach (PropertyInfo property in valueType.GetProperties().Where(\n                            property => !Attribute.IsDefined(property, typeof(XmlIgnoreAttribute))))\n                        {\n                            string propertyName =\n                                property.GetCustomAttributesData().First().ConstructorArguments.First().Value.ToString();\n\n                            TypeConverter converter = TypeDescriptor.GetConverter(property.PropertyType);\n\n                            string attribute = reader.GetAttribute(propertyName);\n\n                            if (string.IsNullOrEmpty(attribute))\n                                break;\n\n                            object propertyValue = converter.ConvertFromInvariantString(attribute);\n\n                            property.SetValue(value, propertyValue, null);\n                        }\n                    }\n                }\n\n                reader.Read();\n\n                TypeConverter typeConverter = TypeDescriptor.GetConverter(typeof(TKey));\n\n                TKey key = default(TKey);\n\n                // Assign the key\n                object keyValue = typeConverter.ConvertFrom(reader.Value);\n                if (keyValue != null)\n                    key = (TKey)keyValue;\n\n                Add(key, value);\n\n                reader.Read();\n                reader.ReadEndElement();\n            }\n\n            reader.ReadEndElement();\n        }\n\n        /// <summary>\n        /// Converts an object into its XML representation.\n        /// </summary>\n        /// <param name=\"writer\">The <see cref=\"T:System.Xml.XmlWriter\" /> stream to which the object is serialized.</param>\n        /// <exception cref=\"System.ArgumentNullException\">writer</exception>\n        /// <exception cref=\"System.ArgumentException\">\n        /// </exception>\n        public void WriteXml(XmlWriter writer)\n        {\n            writer.ThrowIfNull(nameof(writer));\n\n            Type keyType = typeof(TKey);\n            Type valueType = typeof(TValue);\n\n            // Check that each type we use is serializable\n            if (!keyType.IsSerializable)\n                throw new ArgumentException($\"{keyType} is not serializable\", keyType.ToString());\n\n            if (!valueType.IsSerializable)\n                throw new ArgumentException($\"{valueType} is not serializable\", valueType.ToString());\n\n            // Serialize each dictionary element as Xml\n            foreach (TKey key in Keys)\n            {\n                XmlRootAttribute rootAttribute =\n                    valueType.GetCustomAttributes(typeof(XmlRootAttribute), false).Cast<XmlRootAttribute>().FirstOrDefault();\n\n                // Get the name specified in XmlRootAttribute or use the type name\n                string elementName = rootAttribute != null && !string.IsNullOrWhiteSpace(rootAttribute.ElementName)\n                    ? rootAttribute.ElementName\n                    : TypeName;\n\n                // Write as XmlElement\n                writer.WriteStartElement(elementName);\n\n                // Do we have properties ?\n                if (valueType.GetProperties().Length == 0)\n                {\n                    string attributeName = TypeName;\n\n                    // Write the value as XmlAttribute\n                    writer.WriteAttributeString(attributeName, this[key].ToString());\n                }\n                else\n                {\n                    // Note: Best practice is to serialize properties instead of fields;\n                    // however if you have to serialize fields use the 'GetFields()' method\n                    // and adjust the code accordingly using the 'NonSerializedAttribute' \n\n                    // Write each property value as XmlAttribute excluding those that have the 'XmlIgnoreAttribute'\n                    foreach (PropertyInfo property in valueType.GetProperties().Where(\n                        property => !Attribute.IsDefined(property, typeof(XmlIgnoreAttribute))))\n                    {\n                        Attribute attribute = property.GetCustomAttributes(false).Where(\n                            x => x is XmlElementAttribute || x is XmlAttributeAttribute).Cast<Attribute>().FirstOrDefault();\n\n                        XmlElementAttribute xmlElement = attribute as XmlElementAttribute;\n                        XmlAttributeAttribute xmlAttribute = attribute as XmlAttributeAttribute;\n\n                        // Get the name specified in XmlElement/XmlAttribute or use the property name\n                        string attributeName;\n                        if (xmlElement != null && !string.IsNullOrWhiteSpace(xmlElement.ElementName))\n                            attributeName = xmlElement.ElementName;\n                        else if (xmlAttribute != null && !string.IsNullOrWhiteSpace(xmlAttribute.AttributeName))\n                            attributeName = xmlAttribute.AttributeName;\n                        else\n                            attributeName = property.Name;\n\n                        object propertyValue = property.GetValue(this[key], null);\n\n                        // Special condition for Boolean type (because \"Boolean.ToString()\" returns \"True\"/\"False\")\n                        string propertyValueString = propertyValue is bool\n                            ? XmlConvert.ToString((bool)propertyValue)\n                            : propertyValue.ToString();\n\n                        writer.WriteAttributeString(attributeName, propertyValueString);\n                    }\n                }\n\n                // Write the key as XmlText\n                writer.WriteValue(key.ToString());\n\n                writer.WriteEndElement();\n            }\n        }\n\n        /// <summary>\n        /// Gets the name of the type.\n        /// </summary>\n        /// <value>The name of the type.</value>\n        private static string TypeName\n        {\n            get\n            {\n                Type type = typeof(TValue);\n                if (type.Namespace != \"System\")\n                    return type.Name.ConvertUpperToLowerCamelCase();\n\n                switch (type.Name)\n                {\n                    case \"Int16\":\n                        return \"short\";\n                    case \"Int32\":\n                        return \"int\";\n                    case \"Int64\":\n                        return \"long\";\n                    case \"UInt16\":\n                        return \"unsignedShort\";\n                    case \"UInt32\":\n                        return \"unsignedInt\";\n                    case \"UInt64\":\n                        return \"unsignedLong\";\n                    case \"Single\":\n                        return \"float\";\n                    case \"DateTime\":\n                        return \"dateTime\";\n                }\n                return type.Name.ToLower(CultureConstants.InvariantCulture);\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/MonitoredCharacterSettings.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class MonitoredCharacterSettings\n    {\n        /// <summary>\n        /// Deserialization constructor.\n        /// </summary>\n        public MonitoredCharacterSettings()\n        {\n            Settings = new CharacterUISettings();\n        }\n\n        /// <summary>\n        /// Creation for new settings for this character.\n        /// </summary>\n        /// <param name=\"character\">The character.</param>\n        /// <exception cref=\"System.ArgumentNullException\">character</exception>\n        public MonitoredCharacterSettings(Character character)\n        {\n            character.ThrowIfNull(nameof(character));\n\n            CharacterGuid = character.Guid;\n            Name = character.Name;\n            Settings = character.UISettings;\n        }\n\n        /// <summary>\n        /// Gets or sets the character GUID.\n        /// </summary>\n        /// <value>The character GUID.</value>\n        [XmlAttribute(\"characterGuid\")]\n        public Guid CharacterGuid { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings.\n        /// </summary>\n        /// <value>The settings.</value>\n        [XmlElement(\"settings\")]\n        public CharacterUISettings Settings { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/NotificationCategorySettings.cs",
    "content": "using System;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Category settings for notifications\n    /// </summary>\n    [Serializable]\n    [XmlRoot(\"category\")]\n    public sealed class NotificationCategorySettings\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"NotificationCategorySettings\"/> class.\n        /// </summary>\n        public NotificationCategorySettings()\n        {\n            ToolTipBehaviour = ToolTipNotificationBehaviour.Once;\n            ShowOnMainWindow = true;\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"NotificationCategorySettings\"/> class.\n        /// </summary>\n        /// <param name=\"toolTipBehaviour\">The tool tip behaviour.</param>\n        public NotificationCategorySettings(ToolTipNotificationBehaviour toolTipBehaviour)\n        {\n            ToolTipBehaviour = toolTipBehaviour;\n            ShowOnMainWindow = true;\n        }\n\n        /// <summary>\n        /// Gets or sets the tool tip behaviour.\n        /// </summary>\n        /// <value>The tool tip behaviour.</value>\n        [XmlAttribute(\"toolTipBehaviour\")]\n        public ToolTipNotificationBehaviour ToolTipBehaviour { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show on main window].\n        /// </summary>\n        /// <value><c>true</c> if [show on main window]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"showOnMainWindow\")]\n        public bool ShowOnMainWindow { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/NotificationSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Notifications;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class NotificationSettings\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"NotificationSettings\"/> class.\n        /// </summary>\n        public NotificationSettings()\n        {\n            Categories = new ModifiedSerializableDictionary<NotificationCategory, NotificationCategorySettings>();\n            Categories[NotificationCategory.AccountNotInTraining] =\n                new NotificationCategorySettings(ToolTipNotificationBehaviour.RepeatUntilClicked);\n            EmailPortNumber = 25;\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [play sound on skill completion].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [play sound on skill completion]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"playSoundOnSkillCompletion\")]\n        public bool PlaySoundOnSkillCompletion { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [send mail alert].\n        /// </summary>\n        /// <value><c>true</c> if [send mail alert]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"sendMailAlert\")]\n        public bool SendMailAlert { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [use email short format].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [use email short format]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"useEmailShortFormat\")]\n        public bool UseEmailShortFormat { get; set; }\n\n        /// <summary>\n        /// Gets or sets the email SMTP server provider.\n        /// </summary>\n        /// <value>The email SMTP server provider.</value>\n        [XmlElement(\"emailSmtpServerProvider\")]\n        public string EmailSmtpServerProvider { get; set; }\n\n        /// <summary>\n        /// Gets or sets the email SMTP server.\n        /// </summary>\n        /// <value>The email SMTP server.</value>\n        [XmlElement(\"emailSmtpServer\")]\n        public string EmailSmtpServerAddress { get; set; }\n\n        /// <summary>\n        /// Gets or sets the email port number.\n        /// </summary>\n        /// <value>The email port number.</value>\n        [XmlElement(\"emailPortNumber\")]\n        public int EmailPortNumber { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [email server requires SSL].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [email server requires SSL]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"emailServerRequiresSSL\")]\n        public bool EmailServerRequiresSsl { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [email authentication required].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [email authentication required]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"emailAuthenticationRequired\")]\n        public bool EmailAuthenticationRequired { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name of the email authentication user.\n        /// </summary>\n        /// <value>The name of the email authentication user.</value>\n        [XmlElement(\"emailAuthenticationUserName\")]\n        public string EmailAuthenticationUserName { get; set; }\n\n        /// <summary>\n        /// Gets or sets the email authentication password.\n        /// </summary>\n        /// <value>The email authentication password.</value>\n        [XmlElement(\"emailAuthenticationPassword\")]\n        public string EmailAuthenticationPassword { get; set; }\n\n        /// <summary>\n        /// Gets or sets the email from address.\n        /// </summary>\n        /// <value>The email from address.</value>\n        [XmlElement(\"emailFromAddress\")]\n        public string EmailFromAddress { get; set; }\n\n        /// <summary>\n        /// Gets or sets the email to address.\n        /// </summary>\n        /// <value>The email to address.</value>\n        [XmlElement(\"emailToAddress\")]\n        public string EmailToAddress { get; set; }\n\n        /// <summary>\n        /// Gets or sets the categories.\n        /// </summary>\n        /// <value>The categories.</value>\n        [XmlElement(\"categories\")]\n        public ModifiedSerializableDictionary<NotificationCategory, NotificationCategorySettings> Categories { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/PlanColumn.cs",
    "content": "﻿using System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents the available column types\n    /// </summary>\n    public enum PlanColumn\n    {\n        None = -1,\n\n        [Header(\"Skill Name\")]\n        [Description(\"Skill Name\")]\n        SkillName = 0,\n\n        [Header(\"Plan Group\")]\n        [Description(\"Plan Group\")]\n        PlanGroup = 1,\n\n        [Header(\"Training Time\")]\n        [Description(\"Training Time\")]\n        TrainingTime = 2,\n\n        [Header(\"Training Time (no implants)\")]\n        [Description(\"Training Time (no implants)\")]\n        TrainingTimeNatural = 3,\n\n        [Header(\"Earliest Start\")]\n        [Description(\"Earliest Start\")]\n        EarliestStart = 4,\n\n        [Header(\"Earliest End\")]\n        [Description(\"Earliest End\")]\n        EarliestEnd = 5,\n\n        [Header(\"Conflicts\")]\n        [Description(\"Conflicts\")]\n        Conflicts = 6,\n\n        [Header(\"%\")]\n        [Description(\"Percent Complete\")]\n        PercentComplete = 7,\n\n        [Header(\"Rank\")]\n        [Description(\"Skill Rank\")]\n        SkillRank = 8,\n\n        [Header(\"Primary\")]\n        [Description(\"Primary Attribute\")]\n        PrimaryAttribute = 9,\n\n        [Header(\"Secondary\")]\n        [Description(\"Secondary Attribute\")]\n        SecondaryAttribute = 10,\n\n        [Header(\"Group\")]\n        [Description(\"Skill Group\")]\n        SkillGroup = 11,\n\n        [Header(\"Notes\")]\n        [Description(\"Notes\")]\n        Notes = 12,\n\n        [Header(\"Type\")]\n        [Description(\"Plan Type (Planned/Prerequisite)\")]\n        PlanType = 13,\n\n        [Header(\"Est. SP Total\")]\n        [Description(\"Estimated Skill Point Total\")]\n        SPTotal = 14,\n\n        [Header(\"SP/Hour\")]\n        [Description(\"SP/Hour\")]\n        SPPerHour = 15,\n\n        [Header(\"Priority\")]\n        [Description(\"Priority\")]\n        Priority = 16,\n\n        [Header(\"Cost\")]\n        [Description(\"Cost\")]\n        Cost = 17,\n\n        [Header(\"Skill Points Required\")]\n        [Description(\"Skill Points Required\")]\n        SkillPointsRequired = 18,\n\n        [Header(\"Omega Clone Required\")]\n        [Description(\"Omega Clone Required\")]\n        OmegaRequired = 19\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/PlanColumnSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class PlanColumnSettings : IColumnSettings\n    {\n        /// <summary>\n        /// Gets or sets the column.\n        /// </summary>\n        /// <value>The column.</value>\n        [XmlAttribute(\"column\")]\n        public PlanColumn Column { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"PlanColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"visible\")]\n        public bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int IColumnSettings.Key => (int)Column;\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents this instance.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents this instance.\n        /// </returns>\n        public override string ToString() => Column.GetHeader();\n\n        /// <summary>\n        /// Creates a new object that is a copy of the current instance.\n        /// </summary>\n        /// <returns>\n        /// A new object that is a copy of this instance.\n        /// </returns>\n        public object Clone() => MemberwiseClone();\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/PlanExportSettings.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents the set of options for plan exporting\n    /// </summary>\n    public class PlanExportSettings\n    {\n        /// <summary>\n        /// Gets or sets a value indicating whether [include header].\n        /// </summary>\n        /// <value><c>true</c> if [include header]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"includeHeader\")]\n        public bool IncludeHeader { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [entry number].\n        /// </summary>\n        /// <value><c>true</c> if [entry number]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"entryNumber\")]\n        public bool EntryNumber { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [entry training times].\n        /// </summary>\n        /// <value><c>true</c> if [entry training times]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"entryTrainingTimes\")]\n        public bool EntryTrainingTimes { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [entry start date].\n        /// </summary>\n        /// <value><c>true</c> if [entry start date]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"entryStartDate\")]\n        public bool EntryStartDate { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [entry finish date].\n        /// </summary>\n        /// <value><c>true</c> if [entry finish date]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"entryFinishDate\")]\n        public bool EntryFinishDate { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [entry notes].\n        /// </summary>\n        /// <value><c>true</c> if [entry notes]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"entryNotes\")]\n        public bool EntryNotes { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [entry cost].\n        /// </summary>\n        /// <value><c>true</c> if [entry cost]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"entryCost\")]\n        public bool EntryCost { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [remapping points].\n        /// </summary>\n        /// <value><c>true</c> if [remapping points]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"remappingPoints\")]\n        public bool RemappingPoints { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [footer count].\n        /// </summary>\n        /// <value><c>true</c> if [footer count]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"footerCount\")]\n        public bool FooterCount { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [footer total time].\n        /// </summary>\n        /// <value><c>true</c> if [footer total time]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"footerTotalTime\")]\n        public bool FooterTotalTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [footer date].\n        /// </summary>\n        /// <value><c>true</c> if [footer date]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"footerDate\")]\n        public bool FooterDate { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [footer cost].\n        /// </summary>\n        /// <value><c>true</c> if [footer cost]; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"footerCost\")]\n        public bool FooterCost { get; set; }\n\n        /// <summary>\n        /// Output markup type.\n        /// </summary>\n        [XmlElement(\"markup\")]\n        public MarkupType Markup { get; set; }\n\n        /// <summary>\n        /// If <code>true</code>, known skills are filtered out.\n        /// </summary>\n        [XmlElement(\"shoppingList\")]\n        public bool ShoppingList { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/PlanSorting.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class PlanSorting\n    {\n        public PlanSorting()\n        {\n            Criteria = PlanEntrySort.None;\n            Order = ThreeStateSortOrder.None;\n        }\n\n        [XmlAttribute(\"criteria\")]\n        public PlanEntrySort Criteria { get; set; }\n\n        [XmlAttribute(\"order\")]\n        public ThreeStateSortOrder Order { get; set; }\n\n        [XmlAttribute(\"groupByPriority\")]\n        public bool GroupByPriority { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/PlanWindowSettings.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations.UISettings;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for Plan Window.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class PlanWindowSettings\n    {\n        private readonly Collection<PlanColumnSettings> m_columns;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanWindowSettings\"/> class.\n        /// </summary>\n        public PlanWindowSettings()\n        {\n            DimUntrainable = true;\n            OnlyShowSelectionSummaryOnMultiSelect = true;\n\n            PrioritiesMsgBox = new CustomMsgBoxSettings();\n            ObsoleteEntryRemovalBehaviour = ObsoleteEntryRemovalBehaviour.RemoveConfirmed;\n\n            m_columns = new Collection<PlanColumnSettings>();\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [highlight planned skills].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [highlight planned skills]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"highlightPlannedSkills\")]\n        public bool HighlightPlannedSkills { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [highlight prerequisites].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [highlight prerequisites]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"highlightPrerequisites\")]\n        public bool HighlightPrerequisites { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [highlight conflicts].\n        /// </summary>\n        /// <value><c>true</c> if [highlight conflicts]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"highlightConflicts\")]\n        public bool HighlightConflicts { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [highlight partial skills].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [highlight partial skills]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"highlightPartialSkills\")]\n        public bool HighlightPartialSkills { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [highlight queued skills].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [highlight queued skills]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"highlightQueuedSkills\")]\n        public bool HighlightQueuedSkills { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [only show selection summary on multi select].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [only show selection summary on multi select]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"onlyShowSelectionSummaryOnMultiSelect\")]\n        public bool OnlyShowSelectionSummaryOnMultiSelect { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [use advance entry addition].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [use advance entry addition]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"useAdvanceEntryAddition\")]\n        public bool UseAdvanceEntryAddition { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [dim untrainable].\n        /// </summary>\n        /// <value><c>true</c> if [dim untrainable]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"dimUntrainable\")]\n        public bool DimUntrainable { get; set; }\n\n        /// <summary>\n        /// Gets or sets the priorities message box settings.\n        /// </summary>\n        /// <value>The priorities message box settings.</value>\n        [XmlElement(\"prioritiesMsgBox\")]\n        public CustomMsgBoxSettings PrioritiesMsgBox { get; set; }\n\n        /// <summary>\n        /// Gets or sets the obsolete entry removal behaviour.\n        /// </summary>\n        /// <value>The obsolete entry removal behaviour.</value>\n        [XmlElement(\"obsoleteEntryRemovalBehaviour\")]\n        public ObsoleteEntryRemovalBehaviour ObsoleteEntryRemovalBehaviour { get; set; }\n\n        /// <summary>\n        /// Gets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        [XmlArray(\"columns\")]\n        [XmlArrayItem(\"column\")]\n        public Collection<PlanColumnSettings> Columns => m_columns;\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <value>The default columns.</value>\n        public IEnumerable<PlanColumnSettings> DefaultColumns\n        {\n            get\n            {\n                PlanColumn[] defaultColumns = new[]\n                                                  {\n                                                      PlanColumn.Priority,\n                                                      PlanColumn.SkillName,\n                                                      PlanColumn.TrainingTime,\n                                                      PlanColumn.SkillRank,\n                                                      PlanColumn.PrimaryAttribute,\n                                                      PlanColumn.SecondaryAttribute,\n                                                      PlanColumn.SkillGroup,\n                                                      PlanColumn.SPPerHour\n                                                  };\n\n                return EnumExtensions.GetValues<PlanColumn>().Where(\n                    planColumn => planColumn != PlanColumn.None).Where(\n                        planColumn => Columns.All(columnSetting => columnSetting.Column != planColumn)).Select(\n                            planColumn => new PlanColumnSettings\n                                              {\n                                                  Column = planColumn,\n                                                  Visible = defaultColumns.Contains(planColumn),\n                                                  Width = -2\n                                              });\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/PlanetaryColumn.cs",
    "content": "﻿using System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public enum PlanetaryColumn\n    {\n        None = -1,\n\n        [Header(\"State\")]\n        [Description(\"Installation State\")]\n        State = 0,\n\n        [Header(\"TTC\")]\n        [Description(\"Time To Completion (TTC)\")]\n        TTC = 1,\n\n        [Header(\"Installation\")]\n        [Description(\"Installation Name\")]\n        TypeName = 2,\n\n        [Header(\"Install Date\")]\n        [Description(\"Installed Time\")]\n        InstallTime = 3,\n\n        [Header(\"End Date\")]\n        [Description(\"Estimated End Time\")]\n        EndTime = 4,\n\n        [Header(\"Planet Type\")]\n        [Description(\"Planet Type\")]\n        PlanetTypeName = 5,\n\n        [Header(\"Planet\")]\n        [Description(\"Planet Name\")]\n        PlanetName = 6,\n\n        [Header(\"Location\")]\n        [Description(\"Location (Full)\")]\n        Location = 7,\n\n        [Header(\"Region\")]\n        [Description(\"Location (Region)\")]\n        Region = 8,\n\n        [Header(\"System\")]\n        [Description(\"Location (Solar System)\")]\n        SolarSystem = 9,\n\n        [Header(\"Commodity\")]\n        [Description(\"Commodity Name\")]\n        ContentTypeName = 10,\n\n        [Header(\"Cycle Time\")]\n        [Description(\"Cycle Time\")]\n        CycleTime = 11,\n\n        [Header(\"Quantity / Cycle\")]\n        [Description(\"Quantity Per Cycle\")]\n        QuantityPerCycle = 12,\n\n        [Header(\"Quantity\")]\n        [Description(\"Quantity\")]\n        Quantity = 13,\n\n        [Header(\"Volume\")]\n        [Description(\"Volume (m³)\")]\n        Volume = 14,\n\n        [Header(\"Linked to\")]\n        [Description(\"Linked to\")]\n        LinkedTo = 15,\n\n        [Header(\"Routed to\")]\n        [Description(\"Routed to\")]\n        RoutedTo = 16,\n\n        [Header(\"Type Group\")]\n        [Description(\"Type Group Name\")]\n        GroupName = 17\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/PlanetaryColumnSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class PlanetaryColumnSettings : IColumnSettings\n    {\n        /// <summary>\n        /// Gets or sets the column.\n        /// </summary>\n        /// <value>The column.</value>\n        [XmlAttribute(\"column\")]\n        public PlanetaryColumn Column { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"PlanetaryColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"visible\")]\n        public bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int IColumnSettings.Key => (int)Column;\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents the column's header text.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents the column's header text.\n        /// </returns>\n        public override string ToString() => Column.GetHeader();\n\n        /// <summary>\n        /// Creates a new object that is a copy of the current instance.\n        /// </summary>\n        /// <returns>\n        /// A new object that is a copy of this instance.\n        /// </returns>\n        public object Clone() => MemberwiseClone();\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/PlanetarySettings.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for Planetary Colonies.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class PlanetarySettings\n    {\n        private readonly Collection<PlanetaryColumnSettings> m_columns;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PlanetarySettings\"/> class.\n        /// </summary>\n        public PlanetarySettings()\n        {\n            m_columns = new Collection<PlanetaryColumnSettings>();\n        }\n        \n        /// <summary>\n        /// Gets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        [XmlArray(\"columns\")]\n        [XmlArrayItem(\"column\")]\n        public Collection<PlanetaryColumnSettings> Columns => m_columns;\n\n        /// <summary>\n        /// Gets or sets a value indicating whether to show only the ECU.\n        /// </summary>\n        /// <value>\n        ///   <c>true</c> if to show only the ECU; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showEcuOnly\")]\n        public bool ShowEcuOnly { get; set; }\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <value>The default columns.</value>\n        public IEnumerable<PlanetaryColumnSettings> DefaultColumns\n        {\n            get\n            {\n                PlanetaryColumn[] defaultColumns =\n                {\n                    PlanetaryColumn.State,\n                    PlanetaryColumn.TTC,\n                    PlanetaryColumn.TypeName,\n                    PlanetaryColumn.ContentTypeName,\n                    PlanetaryColumn.QuantityPerCycle,\n                    PlanetaryColumn.Quantity,\n                    PlanetaryColumn.Volume,\n                };\n\n                return EnumExtensions.GetValues<PlanetaryColumn>().Where(\n                    column => column != PlanetaryColumn.None).Where(\n                        column => Columns.All(columnSetting => columnSetting.Column != column)).Select(\n                            column => new PlanetaryColumnSettings\n                            {\n                                Column = column,\n                                Visible = defaultColumns.Contains(column),\n                                Width = -2\n                            });\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/PortableEveInstallationsSettings.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class PortableEveInstallationsSettings\n    {\n        private readonly Collection<SerializablePortableEveInstallation> m_eveClients;\n\n        public PortableEveInstallationsSettings()\n        {\n            m_eveClients = new Collection<SerializablePortableEveInstallation>(); \n        }\n\n        /// <summary>\n        /// Gets the portable eve client installations.\n        /// </summary>\n        [XmlArray(\"eveClientInstallations\")]\n        [XmlArrayItem(\"eveClientInstallation\")]\n        public Collection<SerializablePortableEveInstallation> EVEClients => m_eveClients;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/ProxyAuthentication.cs",
    "content": "namespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Enum for the type of proxy in use\n    /// </summary>\n    public enum ProxyAuthentication\n    {\n        None,\n        SystemDefault,\n        Specified\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/ProxySettings.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class ProxySettings\n    {\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"ProxySettings\"/> is enabled.\n        /// </summary>\n        /// <value><c>true</c> if enabled; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"enabled\")]\n        public bool Enabled { get; set; }\n\n        /// <summary>\n        /// Gets or sets the host.\n        /// </summary>\n        /// <value>The host.</value>\n        [XmlElement(\"host\")]\n        public string Host { get; set; }\n\n        /// <summary>\n        /// Gets or sets the port.\n        /// </summary>\n        /// <value>The port.</value>\n        [XmlElement(\"port\")]\n        public int Port { get; set; }\n\n        /// <summary>\n        /// Gets or sets the authentication.\n        /// </summary>\n        /// <value>The authentication.</value>\n        [XmlElement(\"authenticationType\")]\n        public ProxyAuthentication Authentication { get; set; }\n\n        /// <summary>\n        /// Gets or sets the username.\n        /// </summary>\n        /// <value>The username.</value>\n        [XmlElement(\"username\")]\n        public string Username { get; set; }\n\n        /// <summary>\n        /// Gets or sets the password.\n        /// </summary>\n        /// <value>The password.</value>\n        [XmlElement(\"password\")]\n        public string Password { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [disable requests on authentication failure].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [disable requests on authentication failure]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"disableRequestsOnAuthenticationFailure\")]\n        public bool DisableRequestsOnAuthenticationFailure { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/ResearchColumn.cs",
    "content": "using System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents the available column types.\n    /// </summary>\n    public enum ResearchColumn\n    {\n        None = -1,\n\n        [Header(\"Agent\")]\n        [Description(\"Research Agent Name\")]\n        Agent = 0,\n\n        [Header(\"Level\")]\n        [Description(\"Research Agent Level\")]\n        Level = 1,\n\n        [Header(\"Quality\")]\n        [Description(\"Research Agent Quality\")]\n        Quality = 2,\n\n        [Header(\"Field\")]\n        [Description(\"Research Field Skill\")]\n        Field = 3,\n\n        [Header(\"Current RP\")]\n        [Description(\"Current Research Points\")]\n        CurrentRP = 4,\n\n        [Header(\"RP/Day\")]\n        [Description(\"Research Points Per Day\")]\n        PointsPerDay = 5,\n\n        [Header(\"Start Date\")]\n        [Description(\"Research Start Date\")]\n        StartDate = 6,\n\n        [Header(\"Location\")]\n        [Description(\"Location (Full)\")]\n        Location = 7,\n\n        [Header(\"Region\")]\n        [Description(\"Location (Region)\")]\n        Region = 8,\n\n        [Header(\"System\")]\n        [Description(\"Location (Solar System)\")]\n        SolarSystem = 9,\n\n        [Header(\"Station\")]\n        [Description(\"Location (Station)\")]\n        Station = 10,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/ResearchColumnSettings.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class ResearchColumnSettings : IColumnSettings\n    {\n        /// <summary>\n        /// Gets or sets the column.\n        /// </summary>\n        /// <value>The column.</value>\n        [XmlAttribute(\"column\")]\n        public ResearchColumn Column { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"ResearchColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"visible\")]\n        public bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int IColumnSettings.Key => (int)Column;\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents this instance.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents this instance.\n        /// </returns>\n        public override string ToString() => Column.GetHeader();\n\n        /// <summary>\n        /// Creates a new object that is a copy of the current instance.\n        /// </summary>\n        /// <returns>\n        /// A new object that is a copy of this instance.\n        /// </returns>\n        public object Clone() => MemberwiseClone();\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/ResearchSettings.cs",
    "content": "using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for Research.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class ResearchSettings\n    {\n        private readonly Collection<ResearchColumnSettings> m_columns;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ResearchSettings\"/> class.\n        /// </summary>\n        public ResearchSettings()\n        {\n            m_columns = new Collection<ResearchColumnSettings>();\n        }\n\n        /// <summary>\n        /// Gets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        [XmlArray(\"columns\")]\n        [XmlArrayItem(\"column\")]\n        public Collection<ResearchColumnSettings> Columns => m_columns;\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <value>The default columns.</value>\n        public IEnumerable<ResearchColumnSettings> DefaultColumns\n        {\n            get\n            {\n                ResearchColumn[] defaultColumns = new[]\n                                                      {\n                                                          ResearchColumn.Agent,\n                                                          ResearchColumn.Field,\n                                                          ResearchColumn.CurrentRP,\n                                                          ResearchColumn.PointsPerDay,\n                                                          ResearchColumn.Station\n                                                      };\n\n                return EnumExtensions.GetValues<ResearchColumn>().Where(\n                    column => column != ResearchColumn.None).Where(\n                        column => Columns.All(columnSetting => columnSetting.Column != column)).Select(\n                            column => new ResearchColumnSettings\n                                              {\n                                                  Column = column,\n                                                  Visible = defaultColumns.Contains(column),\n                                                  Width = -2\n                                              });\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/SchedulerSettings.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Serialization.Settings;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class SchedulerSettings\n    {\n        private readonly Collection<SerializableScheduleEntry> m_entries;\n\n        public SchedulerSettings()\n        {\n            m_entries = new Collection<SerializableScheduleEntry>();\n        }\n\n        [XmlArray(\"entries\")]\n        [XmlArrayItem(\"simple\", typeof(SerializableScheduleEntry))]\n        [XmlArrayItem(\"recurring\", typeof(SerializableRecurringScheduleEntry))]\n        public Collection<SerializableScheduleEntry> Entries => m_entries;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/SchedulerUISettings.cs",
    "content": "﻿using System.Drawing;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class SchedulerUISettings\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SchedulerUISettings\"/> class.\n        /// </summary>\n        public SchedulerUISettings()\n        {\n            TextColor = (SerializableColor)Color.White;\n            BlockingColor = (SerializableColor)Color.Red;\n            SimpleEventGradientStart = (SerializableColor)Color.Blue;\n            SimpleEventGradientEnd = (SerializableColor)Color.LightBlue;\n            RecurringEventGradientStart = (SerializableColor)Color.Green;\n            RecurringEventGradientEnd = (SerializableColor)Color.LightGreen;\n        }\n\n        /// <summary>\n        /// Gets or sets the color of the text.\n        /// </summary>\n        /// <value>The color of the text.</value>\n        [XmlElement(\"textColor\")]\n        public SerializableColor TextColor { get; set; }\n\n        /// <summary>\n        /// Gets or sets the color of the blocking.\n        /// </summary>\n        /// <value>The color of the blocking.</value>\n        [XmlElement(\"blockColor\")]\n        public SerializableColor BlockingColor { get; set; }\n\n        /// <summary>\n        /// Gets or sets the recurring event gradient start.\n        /// </summary>\n        /// <value>The recurring event gradient start.</value>\n        [XmlElement(\"recurringEventGradientStart\")]\n        public SerializableColor RecurringEventGradientStart { get; set; }\n\n        /// <summary>\n        /// Gets or sets the recurring event gradient end.\n        /// </summary>\n        /// <value>The recurring event gradient end.</value>\n        [XmlElement(\"recurringEventGradientEnd\")]\n        public SerializableColor RecurringEventGradientEnd { get; set; }\n\n        /// <summary>\n        /// Gets or sets the simple event gradient start.\n        /// </summary>\n        /// <value>The simple event gradient start.</value>\n        [XmlElement(\"simpleEventGradientStart\")]\n        public SerializableColor SimpleEventGradientStart { get; set; }\n\n        /// <summary>\n        /// Gets or sets the simple event gradient end.\n        /// </summary>\n        /// <value>The simple event gradient end.</value>\n        [XmlElement(\"simpleEventGradientEnd\")]\n        public SerializableColor SimpleEventGradientEnd { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/SerializableColor.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents a color in the settings\n    /// </summary>\n    public sealed class SerializableColor\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableColor\"/> class.\n        /// </summary>\n        public SerializableColor()\n        {\n            A = 255;\n        }\n\n        /// <summary>\n        /// Gets or sets a.\n        /// </summary>\n        /// <value>\n        /// a.\n        /// </value>\n        [XmlAttribute]\n        public byte A { get; set; }\n\n        /// <summary>\n        /// </summary>\n        /// <value>\n        /// The r.\n        /// </value>\n        [XmlAttribute]\n        public byte R { get; set; }\n\n        /// <summary>\n        /// </summary>\n        /// <value>\n        /// The g.\n        /// </value>\n        [XmlAttribute]\n        public byte G { get; set; }\n\n        /// <summary>\n        /// </summary>\n        /// <value>\n        /// The b.\n        /// </value>\n        [XmlAttribute]\n        public byte B { get; set; }\n\n\n        #region Explicit conversion operators with System.Drawing.Color\n\n        /// <summary>\n        /// Performs an explicit conversion from <see cref=\"EVEMon.Common.SettingsObjects.SerializableColor\" /> to <see cref=\"System.Drawing.Color\" />.\n        /// </summary>\n        /// <param name=\"src\">The SRC.</param>\n        /// <returns>\n        /// The result of the conversion.\n        /// </returns>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        /// <remarks>\n        /// Do not make the conversion operators implicit, there is a bug with XML serialization\n        /// </remarks>\n        public static explicit operator Color(SerializableColor src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            return Color.FromArgb(src.A, src.R, src.G, src.B);\n        }\n\n        /// <summary>\n        /// Performs an explicit conversion from <see cref=\"System.Drawing.Color\"/> to <see cref=\"EVEMon.Common.SettingsObjects.SerializableColor\"/>.\n        /// </summary>\n        /// <param name=\"src\">The SRC.</param>\n        /// <returns>The result of the conversion.</returns>\n        /// <remarks>Do not make the conversion operators implicit, there is a bug with XML serialization</remarks>\n        public static explicit operator SerializableColor(Color src)\n            => new SerializableColor { A = src.A, R = src.R, G = src.G, B = src.B };\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/SerializableDictionary.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\nusing System.Xml;\nusing System.Xml.Schema;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    [Serializable]\n    public sealed class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SerializableDictionary&lt;TKey, TValue&gt;\"/> class.\n        /// </summary>\n        /// <param name=\"info\">The info.</param>\n        /// <param name=\"context\">The context.</param>\n        /// <remarks>Implemented to satisfy rule CA2229</remarks>\n        private SerializableDictionary(SerializationInfo info, StreamingContext context)\n            : base(info, context)\n        {\n        }\n\n        /// <summary>\n        /// Default constructor.\n        /// </summary>\n        public SerializableDictionary()\n        {\n        }\n\n        /// <summary>\n        /// Copy constructor.\n        /// </summary>\n        /// <param name=\"source\"></param>\n        public SerializableDictionary(IDictionary<TKey, TValue> source)\n            : base(source)\n        {\n        }\n\n        /// <summary>\n        /// This method is reserved and should not be used.\n        /// When implementing the IXmlSerializable interface,\n        /// you should return null (Nothing in Visual Basic) from this method,\n        /// and instead, if specifying a custom schema is required,\n        /// apply the <see cref=\"T:System.Xml.Serialization.XmlSchemaProviderAttribute\"/> to the class.\n        /// </summary>\n        /// <returns>\n        /// An <see cref=\"T:System.Xml.Schema.XmlSchema\"/> that describes the XML representation of the object\n        /// that is produced by the <see cref=\"M:System.Xml.Serialization.IXmlSerializable.WriteXml(System.Xml.XmlWriter)\"/> method\n        /// and consumed by the <see cref=\"M:System.Xml.Serialization.IXmlSerializable.ReadXml(System.Xml.XmlReader)\"/> method.\n        /// </returns>\n        public XmlSchema GetSchema() => null;\n\n        /// <summary>\n        /// Generates an object from its XML representation.\n        /// </summary>\n        /// <param name=\"reader\">The <see cref=\"T:System.Xml.XmlReader\"/> stream from which the object is deserialized.</param>\n        /// <exception cref=\"System.ArgumentNullException\">reader</exception>\n        public void ReadXml(XmlReader reader)\n        {\n            reader.ThrowIfNull(nameof(reader));\n\n            XmlSerializer keySer = new XmlSerializer(typeof(TKey));\n            XmlSerializer valueSer = new XmlSerializer(typeof(TValue));\n\n            reader.Read();\n            reader.ReadStartElement(\"dictionary\");\n            while (reader.NodeType != XmlNodeType.EndElement)\n            {\n                reader.ReadStartElement(\"item\");\n\n                reader.ReadStartElement(\"key\");\n                TKey key = (TKey)keySer.Deserialize(reader);\n                reader.ReadEndElement();\n\n                reader.ReadStartElement(\"value\");\n                TValue value = (TValue)valueSer.Deserialize(reader);\n                reader.ReadEndElement();\n\n                Add(key, value);\n\n                reader.ReadEndElement();\n                reader.MoveToContent();\n            }\n\n            if (Count != 0)\n                reader.ReadEndElement();\n            reader.ReadEndElement();\n        }\n\n        /// <summary>\n        /// Converts an object into its XML representation.\n        /// </summary>\n        /// <param name=\"writer\">The <see cref=\"T:System.Xml.XmlWriter\" /> stream to which the object is serialized.</param>\n        /// <exception cref=\"System.ArgumentNullException\">writer</exception>\n        public void WriteXml(XmlWriter writer)\n        {\n            writer.ThrowIfNull(nameof(writer));\n\n            XmlSerializer keySer = new XmlSerializer(typeof(TKey));\n            XmlSerializer valueSer = new XmlSerializer(typeof(TValue));\n\n            writer.WriteStartElement(\"dictionary\");\n            foreach (TKey key in Keys)\n            {\n                writer.WriteStartElement(\"item\");\n\n                writer.WriteStartElement(\"key\");\n                keySer.Serialize(writer, key);\n                writer.WriteEndElement();\n\n                writer.WriteStartElement(\"value\");\n                valueSer.Serialize(writer, this[key]);\n                writer.WriteEndElement();\n\n                writer.WriteEndElement();\n            }\n            writer.WriteEndElement();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/SerializableRectangle.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents a serializable version of a rectangle\n    /// </summary>\n    public sealed class SerializableRectangle\n    {\n        [XmlAttribute(\"left\")]\n        public int Left { get; set; }\n\n        [XmlAttribute(\"top\")]\n        public int Top { get; set; }\n\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        [XmlAttribute(\"height\")]\n        public int Height { get; set; }\n\n        /// <summary>\n        /// Performs an explicit conversion from <see cref=\"EVEMon.Common.SettingsObjects.SerializableRectangle\"/> to <see cref=\"System.Drawing.Rectangle\"/>.\n        /// </summary>\n        /// <param name=\"rect\">The rect.</param>\n        /// <returns>The result of the conversion.</returns>\n        /// <remarks>Do not make the conversion operators implicit, there is a bug with XML serialization</remarks>\n        public static explicit operator Rectangle(SerializableRectangle rect)\n        {\n            if (rect == null)\n                throw new ArgumentNullException(\"rect\");\n\n            return new Rectangle(rect.Left, rect.Top, rect.Width, rect.Height);\n        }\n\n        /// <summary>\n        /// Performs an explicit conversion from <see cref=\"System.Drawing.Rectangle\"/> to <see cref=\"EVEMon.Common.SettingsObjects.SerializableRectangle\"/>.\n        /// </summary>\n        /// <param name=\"rect\">The rect.</param>\n        /// <returns>The result of the conversion.</returns>\n        /// <remarks>Do not make the conversion operators implicit, there is a bug with XML serialization</remarks>\n        public static explicit operator SerializableRectangle(Rectangle rect)\n        {\n            return new SerializableRectangle { Left = rect.Left, Top = rect.Top, Width = rect.Width, Height = rect.Height };\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/ShipBrowserSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class ShipBrowserSettings\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ShipBrowserSettings\"/> class.\n        /// </summary>\n        public ShipBrowserSettings()\n        {\n            UsabilityFilter = ObjectUsabilityFilter.All;\n            RacesFilter = Race.All;\n        }\n\n        /// <summary>\n        /// Gets or sets the usability filter.\n        /// </summary>\n        /// <value>The usability filter.</value>\n        [XmlElement(\"usabilityFilter\")]\n        public ObjectUsabilityFilter UsabilityFilter { get; set; }\n\n        /// <summary>\n        /// Gets or sets the races filter.\n        /// </summary>\n        /// <value>The races filter.</value>\n        [XmlElement(\"racesFilter\")]\n        public Race RacesFilter { get; set; }\n\n        /// <summary>\n        /// Gets or sets the text search.\n        /// </summary>\n        /// <value>The text search.</value>\n        [XmlElement(\"textSearch\")]\n        public string TextSearch { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/SkillBrowserSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Enumerations;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class SkillBrowserSettings\n    {\n        /// <summary>\n        /// Gets or sets the filter.\n        /// </summary>\n        /// <value>The filter.</value>\n        [XmlElement(\"filter\")]\n        public SkillFilter Filter { get; set; }\n\n        /// <summary>\n        /// Gets or sets the filter by attributes.\n        /// </summary>\n        /// <value>The filter by attributes.</value>\n        [XmlElement(\"filterByAttributesIndex\")]\n        public int FilterByAttributesIndex { get; set; }\n\n        /// <summary>\n        /// Gets or sets the sort.\n        /// </summary>\n        /// <value>The sort.</value>\n        [XmlElement(\"sort\")]\n        public SkillSort Sort { get; set; }\n\n        /// <summary>\n        /// Gets or sets the text search.\n        /// </summary>\n        /// <value>The text search.</value>\n        [XmlElement(\"textSearch\")]\n        public string TextSearch { get; set; }\n\n        /// <summary>\n        /// Gets or sets the index of the icons group.\n        /// </summary>\n        /// <value>The index of the icons group.</value>\n        [XmlElement(\"iconsGroupIndex\")]\n        public int IconsGroupIndex { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show non public skills].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [show non public skills]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showNonPublicSkills\")]\n        public bool ShowNonPublicSkills { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/SkillPieChartSettings.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class SkillPieChartSettings\n    {\n        private readonly Collection<SerializableColor> m_colors; \n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SkillPieChartSettings\"/> class.\n        /// </summary>\n        public SkillPieChartSettings()\n        {\n            m_colors = new Collection<SerializableColor>();\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [sort by size].\n        /// </summary>\n        /// <value><c>true</c> if [sort by size]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"sortBySize\")]\n        public bool SortBySize { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [merge minor groups].\n        /// </summary>\n        /// <value><c>true</c> if [merge minor groups]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"mergeMinorGroups\")]\n        public bool MergeMinorGroups { get; set; }\n\n        /// <summary>\n        /// Gets or sets the height of the slice.\n        /// </summary>\n        /// <value>The height of the slice.</value>\n        [XmlElement(\"sliceHeight\")]\n        public float SliceHeight { get; set; }\n\n        /// <summary>\n        /// Gets or sets the initial angle.\n        /// </summary>\n        /// <value>The initial angle.</value>\n        [XmlElement(\"initialAngle\")]\n        public float InitialAngle { get; set; }\n\n        /// <summary>\n        /// Gets or sets the colors.\n        /// </summary>\n        /// <value>The colors.</value>\n        [XmlElement(\"colors\")]\n        public Collection<SerializableColor> Colors => m_colors;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/ToolTipNotificationBehaviour.cs",
    "content": "\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents the behavior of the tool tip notifications (alerts for skills completion, etc)\n    /// </summary>\n    public enum ToolTipNotificationBehaviour\n    {\n        /// <summary>\n        /// Never notify\n        /// </summary>\n        Never = 0,\n\n        /// <summary>\n        /// Notify only once\n        /// </summary>\n        Once = 1,\n\n        /// <summary>\n        /// Every minute, the warning is repeated until the user clicks the tooltip\n        /// </summary>\n        RepeatUntilClicked = 2,\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/TrayPopupSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Configuration settings for the tray icon popup window\n    /// </summary>\n    public sealed class TrayPopupSettings\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TrayPopupSettings\"/> class.\n        /// </summary>\n        public TrayPopupSettings()\n        {\n            PortraitSize = PortraitSizes.x48;\n            HighlightConflicts = true;\n            ShowSkillQueueTrainingTime = true;\n            ShowSkillInTraining = true;\n            ShowRemainingTime = true;\n            ShowPortrait = true;\n            ShowServerStatus = true;\n            ShowEveTime = true;\n            ShowWarning = true;\n            IndentGroupedAccounts = true;\n        }\n\n        /// <summary>\n        /// Gets or sets the style.\n        /// </summary>\n        /// <value>The style.</value>\n        [XmlElement(\"style\")]\n        public TrayPopupStyles Style { get; set; }\n\n        /// <summary>\n        /// Gets or sets the group by.\n        /// </summary>\n        /// <value>The group by.</value>\n        [XmlElement(\"groupBy\")]\n        public TrayPopupGrouping GroupBy { get; set; }\n\n        /// <summary>\n        /// Gets or sets the primary sort order.\n        /// </summary>\n        /// <value>The primary sort order.</value>\n        [XmlElement(\"primarySortOrder\")]\n        public TrayPopupSort PrimarySortOrder { get; set; }\n\n        /// <summary>\n        /// Gets or sets the secondary sort order.\n        /// </summary>\n        /// <value>The secondary sort order.</value>\n        [XmlElement(\"secondarySortOrder\")]\n        public TrayPopupSort SecondarySortOrder { get; set; }\n\n        /// <summary>\n        /// Gets or sets the size of the portrait.\n        /// </summary>\n        /// <value>The size of the portrait.</value>\n        [XmlElement(\"portraitSize\")]\n        public PortraitSizes PortraitSize { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show char not training].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [show char not training]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showCharNotTraining\")]\n        public bool ShowCharNotTraining { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show skill in training].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [show skill in training]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showSkillInTraining\")]\n        public bool ShowSkillInTraining { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show remaining time].\n        /// </summary>\n        /// <value><c>true</c> if [show remaining time]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showRemainingTime\")]\n        public bool ShowRemainingTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show completion time].\n        /// </summary>\n        /// <value><c>true</c> if [show completion time]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showTimeToCompletion\")]\n        public bool ShowCompletionTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show wallet].\n        /// </summary>\n        /// <value><c>true</c> if [show wallet]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showWallet\")]\n        public bool ShowWallet { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show portrait].\n        /// </summary>\n        /// <value><c>true</c> if [show portrait]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showPortrait\")]\n        public bool ShowPortrait { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show skill queue training time].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [show skill queue training time]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"showSkillQueueTrainingTime\")]\n        public bool ShowSkillQueueTrainingTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show warning].\n        /// </summary>\n        /// <value><c>true</c> if [show warning]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showWarning\")]\n        public bool ShowWarning { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show server status].\n        /// </summary>\n        /// <value><c>true</c> if [show server status]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showServerStatus\")]\n        public bool ShowServerStatus { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [show eve time].\n        /// </summary>\n        /// <value><c>true</c> if [show eve time]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"showEveTime\")]\n        public bool ShowEveTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [highlight conflicts].\n        /// </summary>\n        /// <value><c>true</c> if [highlight conflicts]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"highlightConflicts\")]\n        public bool HighlightConflicts { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [indent grouped accounts].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [indent grouped accounts]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"indentGroupedAccounts\")]\n        public bool IndentGroupedAccounts { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [use increased contrast].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [use increased contrast]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"useIncreasedContrast\")]\n        public bool UseIncreasedContrast { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/TrayTooltipSettings.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class TrayTooltipSettings\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TrayTooltipSettings\"/> class.\n        /// </summary>\n        public TrayTooltipSettings()\n        {\n            Format = \"%n - %s %tr - %r\";\n        }\n\n        /// <summary>\n        /// Gets or sets the format.\n        /// </summary>\n        /// <value>The format.</value>\n        [XmlElement(\"format\")]\n        public string Format { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [display order].\n        /// </summary>\n        /// <value><c>true</c> if [display order]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"displayOrder\")]\n        public bool DisplayOrder { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/UISettings.cs",
    "content": "﻿using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Root UI Settings Class\n    /// </summary>\n    public sealed class UISettings\n    {\n        private readonly Collection<string> m_confirmedTips;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"UISettings\"/> class.\n        /// </summary>\n        public UISettings()\n        {\n            MainWindowCloseBehaviour = CloseBehaviour.Exit;\n\n            WindowLocations = new ModifiedSerializableDictionary<string, WindowLocationSettings>();\n            Splitters = new ModifiedSerializableDictionary<string, int>();\n            m_confirmedTips = new Collection<string>();\n            \n            CertificateDataBrowser = new CertificateBrowserSettings();\n            BlueprintDataBrowser = new BlueprintBrowserSettings();\n            SkillDataBrowser = new SkillBrowserSettings();\n            ShipDataBrowser = new ShipBrowserSettings();\n            ItemDataBrowser = new ItemBrowserSettings();\n\n            CertificateCharacterDataBrowser = new CertificateBrowserSettings();\n            BlueprintCharacterDataBrowser = new BlueprintBrowserSettings();\n            SkillCharacterDataBrowser = new SkillBrowserSettings();\n            ShipCharacterDataBrowser = new ShipBrowserSettings();\n            ItemCharacterDataBrowser = new ItemBrowserSettings();\n\n            CertificateBrowser = new CertificateBrowserSettings();\n            BlueprintBrowser = new BlueprintBrowserSettings();\n            SkillBrowser = new SkillBrowserSettings();\n            ShipBrowser = new ShipBrowserSettings();\n            ItemBrowser = new ItemBrowserSettings();\n\n            SystemTrayTooltip = new TrayTooltipSettings();\n            SkillPieChart = new SkillPieChartSettings();\n            SystemTrayPopup = new TrayPopupSettings();\n            MainWindow = new MainWindowSettings();\n            PlanWindow = new PlanWindowSettings();\n            Scheduler = new SchedulerUISettings();\n\n            UseStoredSearchFilters = true;\n        }\n\n        /// <summary>\n        /// When true, removes images and colours to make EVEMon looks like some boring business application.\n        /// </summary>\n        [XmlElement(\"safeForWork\")]\n        public bool SafeForWork { get; set; }\n\n        /// <summary>\n        /// Gets or sets the main window close behaviour.\n        /// </summary>\n        /// <value>The main window close behaviour.</value>\n        [XmlElement(\"closeBehaviour\")]\n        public CloseBehaviour MainWindowCloseBehaviour { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [use stored search filters].\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if [use stored search filters]; otherwise, <c>false</c>.\n        /// </value>\n        [XmlElement(\"useStoredSearchFilters\")]\n        public bool UseStoredSearchFilters { get; set; }\n\n        /// <summary>\n        /// Gets or sets the main window.\n        /// </summary>\n        /// <value>\n        /// The main window settings.\n        /// </value>\n        [XmlElement(\"mainWindow\")]\n        public MainWindowSettings MainWindow { get; set; }\n\n        /// <summary>\n        /// Gets or sets the plan window.\n        /// </summary>\n        /// <value>\n        /// The plan window settings.\n        /// </value>\n        [XmlElement(\"planWindow\")]\n        public PlanWindowSettings PlanWindow { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the planner skill browser.\n        /// </summary>\n        /// <value>\n        /// The skill browser settings.\n        /// </value>\n        [XmlElement(\"skillBrowser\")]\n        public SkillBrowserSettings SkillBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the planner certificate browser.\n        /// </summary>\n        /// <value>\n        /// The certificate browser settings.\n        /// </value>\n        [XmlElement(\"certificateBrowser\")]\n        public CertificateBrowserSettings CertificateBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the planner ship browser.\n        /// </summary>\n        /// <value>\n        /// The ship browser settings.\n        /// </value>\n        [XmlElement(\"shipBrowser\")]\n        public ShipBrowserSettings ShipBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the planner item browser.\n        /// </summary>\n        /// <value>\n        /// The item browser settings.\n        /// </value>\n        [XmlElement(\"itemBrowser\")]\n        public ItemBrowserSettings ItemBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the planner blueprint browser.\n        /// </summary>\n        /// <value>\n        /// The blueprint browser settings.\n        /// </value>\n        [XmlElement(\"blueprintBrowser\")]\n        public BlueprintBrowserSettings BlueprintBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the data skill browser of a character.\n        /// </summary>\n        /// <value>\n        /// The skill character data browser settings.\n        /// </value>\n        [XmlElement(\"skillCharacterDataBrowser\")]\n        public SkillBrowserSettings SkillCharacterDataBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the data certificate browser of a character.\n        /// </summary>\n        /// <value>\n        /// The certificate character data browser settings.\n        /// </value>\n        [XmlElement(\"certificateCharacterDataBrowser\")]\n        public CertificateBrowserSettings CertificateCharacterDataBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the data ship browser of a character.\n        /// </summary>\n        /// <value>\n        /// The ship character data browser settings.\n        /// </value>\n        [XmlElement(\"shipCharacterDataBrowser\")]\n        public ShipBrowserSettings ShipCharacterDataBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the settings for the data item browser of a character.\n        /// </summary>\n        /// <value>\n        /// The item character data browser settings.\n        /// </value>\n        [XmlElement(\"itemCharacterDataBrowser\")]\n        public ItemBrowserSettings ItemCharacterDataBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the data blueprint browser of a character.\n        /// </summary>\n        /// <value>\n        /// The blueprint character data browser settings.\n        /// </value>\n        [XmlElement(\"blueprintCharacterDataBrowser\")]\n        public BlueprintBrowserSettings BlueprintCharacterDataBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the data skill browser.\n        /// </summary>\n        /// <value>\n        /// The skill data browser settings.\n        /// </value>\n        [XmlElement(\"skillDataBrowser\")]\n        public SkillBrowserSettings SkillDataBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the data certificate browser.\n        /// </summary>\n        /// <value>\n        /// The certificate data browser settings.\n        /// </value>\n        [XmlElement(\"certificateDataBrowser\")]\n        public CertificateBrowserSettings CertificateDataBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the data ship browser.\n        /// </summary>\n        /// <value>\n        /// The ship data browser settings.\n        /// </value>\n        [XmlElement(\"shipDataBrowser\")]\n        public ShipBrowserSettings ShipDataBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the settings for the data item browser.\n        /// </summary>\n        /// <value>\n        /// The item data browser settings.\n        /// </value>\n        [XmlElement(\"itemDataBrowser\")]\n        public ItemBrowserSettings ItemDataBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the settings for the data blueprint browser.\n        /// </summary>\n        /// <value>\n        /// The blueprint data browser settings.\n        /// </value>\n        [XmlElement(\"blueprintDataBrowser\")]\n        public BlueprintBrowserSettings BlueprintDataBrowser { get; set; }\n\n        /// <summary>\n        /// Gets or sets the system tray icon.\n        /// </summary>\n        /// <value>\n        /// The system tray icon settings.\n        /// </value>\n        [XmlElement(\"systemTrayIcon\")]\n        public SystemTrayBehaviour SystemTrayIcon { get; set; }\n\n        /// <summary>\n        /// Gets or sets the system tray popup.\n        /// </summary>\n        /// <value>\n        /// The system tray popup settings.\n        /// </value>\n        [XmlElement(\"systemTrayPopup\")]\n        public TrayPopupSettings SystemTrayPopup { get; set; }\n\n        /// <summary>\n        /// Gets or sets the scheduler.\n        /// </summary>\n        /// <value>\n        /// The scheduler settings.\n        /// </value>\n        [XmlElement(\"calendar\")]\n        public SchedulerUISettings Scheduler { get; set; }\n\n        /// <summary>\n        /// Gets or sets the system tray tooltip.\n        /// </summary>\n        /// <value>\n        /// The system tray tooltip settings.\n        /// </value>\n        [XmlElement(\"systemTrayTooltip\")]\n        public TrayTooltipSettings SystemTrayTooltip { get; set; }\n\n        /// <summary>\n        /// Gets or sets the skill pie chart.\n        /// </summary>\n        /// <value>\n        /// The skill pie chart settings.\n        /// </value>\n        [XmlElement(\"skillPieChart\")]\n        public SkillPieChartSettings SkillPieChart { get; set; }\n\n        /// <summary>\n        /// Gets or sets the window locations.\n        /// </summary>\n        /// <value>\n        /// The window locations.\n        /// </value>\n        [XmlElement(\"locations\")]\n        public ModifiedSerializableDictionary<string, WindowLocationSettings> WindowLocations { get; set; }\n\n        /// <summary>\n        /// Gets or sets the splitters.\n        /// </summary>\n        /// <value>\n        /// The splitters.\n        /// </value>\n        [XmlElement(\"splitters\")]\n        public ModifiedSerializableDictionary<string, int> Splitters { get; set; }\n\n        /// <summary>\n        /// Gets or sets the confirmed tips.\n        /// </summary>\n        /// <value>\n        /// The confirmed tips.\n        /// </value>\n        [XmlArray(\"confirmedTips\")]\n        [XmlArrayItem(\"tip\")]\n        public Collection<string> ConfirmedTips => m_confirmedTips;\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/UpdatePeriodExtensions.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Provides conversions to durations.\n    /// </summary>\n    public static class UpdatePeriodExtensions\n    {\n        public static TimeSpan ToDuration(this UpdatePeriod period)\n        {\n            switch (period)\n            {\n                case UpdatePeriod.Never:\n                    return TimeSpan.MaxValue;\n                case UpdatePeriod.Minutes5:\n                    return TimeSpan.FromMinutes(5);\n                case UpdatePeriod.Minutes15:\n                    return TimeSpan.FromMinutes(15);\n                case UpdatePeriod.Minutes30:\n                    return TimeSpan.FromMinutes(30);\n                case UpdatePeriod.Hours1:\n                    return TimeSpan.FromHours(1);\n                case UpdatePeriod.Hours2:\n                    return TimeSpan.FromHours(2);\n                case UpdatePeriod.Hours3:\n                    return TimeSpan.FromHours(3);\n                case UpdatePeriod.Hours6:\n                    return TimeSpan.FromHours(6);\n                case UpdatePeriod.Hours12:\n                    return TimeSpan.FromHours(12);\n                case UpdatePeriod.Day:\n                    return TimeSpan.FromDays(1);\n                case UpdatePeriod.Week:\n                    return TimeSpan.FromDays(7);\n                default:\n                    throw new NotImplementedException();\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/UpdateSettings.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Attributes;\nusing EVEMon.Common.Enumerations.UISettings;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for the updates from CCP and others\n    /// </summary>\n    [EnforceUIThreadAffinity]\n    public sealed class UpdateSettings\n    {\n        private int m_updateFrequency;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"UpdateSettings\"/> class.\n        /// </summary>\n        public UpdateSettings()\n        {\n            CheckTimeOnStartup = true;\n            CheckEVEMonVersion = true;\n            HttpTimeout = 20;\n            Periods = new ModifiedSerializableDictionary<string, UpdatePeriod>();\n            IgnoreNetworkStatus = false;\n            UpdateFrequency = 720;\n        }\n\n        /// <summary>\n        /// When true, EVEMon will check its version from repo\n        /// </summary>\n        [XmlElement(\"checkEVEMonVersion\")]\n        public bool CheckEVEMonVersion { get; set; }\n\n        /// <summary>\n        /// When true, EVEMon will check its time from NIST\n        /// </summary>\n        [XmlElement(\"checkTimeOnStartup\")]\n        public bool CheckTimeOnStartup { get; set; }\n\n        /// <summary>\n        /// Gets or sets the latest upgrade version the user choose to reject.\n        /// </summary>\n        [XmlElement(\"mostRecentDeniedUpdgrade\")]\n        public string MostRecentDeniedUpgrade { get; set; }\n\n        /// <summary>\n        /// Gets or sets the latest upgrade major version the user choose to reject.\n        /// </summary>\n        [XmlElement(\"mostRecentDeniedMajorUpdgrade\")]\n        public string MostRecentDeniedMajorUpgrade { get; set; }\n\n        /// <summary>\n        /// Gets or sets the length of time between updates in minutes.\n        /// </summary>\n        /// <remarks>\n        /// Hidden Setting. The value of this setting must be equal to or higher than 720 minutes, the default is 720 minutes (12 hours).\n        /// </remarks>\n        [XmlElement(\"updateFrequency\")]\n        public int UpdateFrequency\n        {\n            get { return m_updateFrequency < 720 ? 720 : m_updateFrequency; }\n            set { m_updateFrequency = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets the HTTP timeout.\n        /// </summary>\n        /// <value>The HTTP timeout.</value>\n        [XmlElement(\"httpTimeout\")]\n        public int HttpTimeout { get; set; }\n\n        /// <summary>\n        /// Short circuit the check for network connectivity and try and connect anyway.\n        /// </summary>\n        /// <value><c>true</c> if [ignore network status]; otherwise, <c>false</c>.</value>\n        /// <remarks>\n        /// Hidden setting, no UI. Used for the hand full of people using Wine/Darwine with a broken .NET Network Stack.\n        /// </remarks>\n        [XmlElement(\"ignoreNetworkStatus\")]\n        public bool IgnoreNetworkStatus { get; set; }\n\n        /// <summary>\n        /// Gets or sets the periods.\n        /// </summary>\n        /// <value>The periods.</value>\n        [XmlElement(\"periods\")]\n        public ModifiedSerializableDictionary<string, UpdatePeriod> Periods { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/WalletJournalColumn.cs",
    "content": "﻿using System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public enum WalletJournalColumn\n    {\n        None = -1,\n\n        [Header(\"Date\")]\n        [Description(\"Date\")]\n        Date = 0,\n\n        [Header(\"Type\")]\n        [Description(\"Type (of transaction)\")]\n        Type = 1,\n\n        [Header(\"Amount\")]\n        [Description(\"Amount\")]\n        Amount = 2,\n\n        [Header(\"Balance\")]\n        [Description(\"Balance (ISK)\")]\n        Balance = 3,\n\n        [Header(\"Reason\")]\n        [Description(\"Reason\")]\n        Reason = 4,\n\n        [Header(\"From\")]\n        [Description(\"From (Issuer)\")]\n        Issuer = 5,\n\n        [Header(\"To\")]\n        [Description(\"To (Recipient)\")]\n        Recipient = 6,\n\n        [Header(\"Tax Receiver\")]\n        [Description(\"Tax Receiver\")]\n        TaxReceiver = 7,\n\n        [Header(\"Tax Amount\")]\n        [Description(\"Tax Amount (ISK)\")]\n        TaxAmount = 8,\n\n        [Header(\"ID\")]\n        [Description(\"ID (of transaction)\")]\n        ID = 9\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/WalletJournalColumnSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class WalletJournalColumnSettings : IColumnSettings\n    {\n        /// <summary>\n        /// Gets or sets the column.\n        /// </summary>\n        /// <value>The column.</value>\n        [XmlAttribute(\"column\")]\n        public WalletJournalColumn Column { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"WalletTransactionColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"visible\")]\n        public bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int IColumnSettings.Key => (int)Column;\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents this instance.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents this instance.\n        /// </returns>\n        public override string ToString() => Column.GetHeader();\n\n        /// <summary>\n        /// Creates a new object that is a copy of the current instance.\n        /// </summary>\n        /// <returns>\n        /// A new object that is a copy of this instance.\n        /// </returns>\n        public object Clone() => MemberwiseClone();\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/WalletJournalSettings.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for Wallet Transactions.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class WalletJournalSettings\n    {\n        private readonly Collection<WalletJournalColumnSettings> m_columns;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"WalletJournalSettings\"/> class.\n        /// </summary>\n        public WalletJournalSettings()\n        {\n            m_columns = new Collection<WalletJournalColumnSettings>();\n        }\n\n        /// <summary>\n        /// Gets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        [XmlArray(\"columns\")]\n        [XmlArrayItem(\"column\")]\n        public Collection<WalletJournalColumnSettings> Columns => m_columns;\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [number abs format].\n        /// </summary>\n        /// <value><c>true</c> if [number abs format]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"numberAbsFormat\")]\n        public bool NumberAbsFormat { get; set; }\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <value>The default columns.</value>\n        public IEnumerable<WalletJournalColumnSettings> DefaultColumns\n        {\n            get\n            {\n                WalletJournalColumn[] defaultColumns = new[]\n                                                           {\n                                                               WalletJournalColumn.Date,\n                                                               WalletJournalColumn.Type,\n                                                               WalletJournalColumn.Amount,\n                                                               WalletJournalColumn.Balance,\n                                                           };\n\n                return EnumExtensions.GetValues<WalletJournalColumn>().Where(\n                    column => column != WalletJournalColumn.None).Where(\n                        column => Columns.All(columnSetting => columnSetting.Column != column)).Select(\n                            column => new WalletJournalColumnSettings\n                                          {\n                                              Column = column,\n                                              Visible = defaultColumns.Contains(column),\n                                              Width = -2\n                                          });\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/WalletTransactionColumn.cs",
    "content": "﻿using System.ComponentModel;\nusing EVEMon.Common.Attributes;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public enum WalletTransactionColumn\n    {\n        None = -1,\n\n        [Header(\"Date\")]\n        [Description(\"Date\")]\n        Date = 0,\n\n        [Header(\"Item\")]\n        [Description(\"Item (Name)\")]\n        ItemName = 1,\n\n        [Header(\"Price\")]\n        [Description(\"Price (ISK)\")]\n        Price = 2,\n\n        [Header(\"Quantity\")]\n        [Description(\"Quantity\")]\n        Quantity = 3,\n\n        [Header(\"Credit\")]\n        [Description(\"Credit (ISK)\")]\n        Credit = 4,\n\n        [Header(\"Client\")]\n        [Description(\"Client\")]\n        Client = 5,\n\n        [Header(\"Location\")]\n        [Description(\"Location (Full)\")]\n        Location = 6,\n\n        [Header(\"Region\")]\n        [Description(\"Location (Region)\")]\n        Region = 7,\n\n        [Header(\"System\")]\n        [Description(\"Location (Solar System)\")]\n        SolarSystem = 8,\n\n        [Header(\"Station\")]\n        [Description(\"Location (Station)\")]\n        Station = 9,\n\n        [Header(\"Transaction For\")]\n        [Description(\"Transaction For\")]\n        TransactionFor = 10,\n       \n        [Header(\"Journal ID\")]\n        [Description(\"Journal ID (of transaction)\")]\n        JournalID = 11\n}\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/WalletTransactionColumnSettings.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    public sealed class WalletTransactionColumnSettings : IColumnSettings\n    {\n        /// <summary>\n        /// Gets or sets the column.\n        /// </summary>\n        /// <value>The column.</value>\n        [XmlAttribute(\"column\")]\n        public WalletTransactionColumn Column { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"WalletTransactionColumnSettings\"/> is visible.\n        /// </summary>\n        /// <value><c>true</c> if visible; otherwise, <c>false</c>.</value>\n        [XmlAttribute(\"visible\")]\n        public bool Visible { get; set; }\n\n        /// <summary>\n        /// Gets or sets the width.\n        /// </summary>\n        /// <value>The width.</value>\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <value>The key.</value>\n        int IColumnSettings.Key => (int)Column;\n\n        /// <summary>\n        /// Returns a <see cref=\"System.String\"/> that represents this instance.\n        /// </summary>\n        /// <returns>\n        /// A <see cref=\"System.String\"/> that represents this instance.\n        /// </returns>\n        public override string ToString() => Column.GetHeader();\n\n        /// <summary>\n        /// Creates a new object that is a copy of the current instance.\n        /// </summary>\n        /// <returns>\n        /// A new object that is a copy of this instance.\n        /// </returns>\n        public object Clone() => MemberwiseClone();\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/WalletTransactionSettings.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Settings for Wallet Transactions.\n    /// </summary>\n    /// <remarks>\n    /// This is the optimized way to implement the object as serializable and satisfy all FxCop rules.\n    /// Don't use auto-property with private setter for the collections as it does not work with XmlSerializer.\n    /// </remarks>\n    public sealed class WalletTransactionSettings\n    {\n        private readonly Collection<WalletTransactionColumnSettings> m_columns;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"WalletTransactionSettings\"/> class.\n        /// </summary>\n        public WalletTransactionSettings()\n        {\n            m_columns = new Collection<WalletTransactionColumnSettings>();\n        }\n\n        /// <summary>\n        /// Gets the columns.\n        /// </summary>\n        /// <value>The columns.</value>\n        [XmlArray(\"columns\")]\n        [XmlArrayItem(\"column\")]\n        public Collection<WalletTransactionColumnSettings> Columns => m_columns;\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [number abs format].\n        /// </summary>\n        /// <value><c>true</c> if [number abs format]; otherwise, <c>false</c>.</value>\n        [XmlElement(\"numberAbsFormat\")]\n        public bool NumberAbsFormat { get; set; }\n\n        /// <summary>\n        /// Gets the default columns.\n        /// </summary>\n        /// <value>The default columns.</value>\n        public IEnumerable<WalletTransactionColumnSettings> DefaultColumns\n        {\n            get\n            {\n                WalletTransactionColumn[] defaultColumns = new[]\n                                                               {\n                                                                   WalletTransactionColumn.Date,\n                                                                   WalletTransactionColumn.ItemName,\n                                                                   WalletTransactionColumn.Price,\n                                                                   WalletTransactionColumn.Quantity,\n                                                                   WalletTransactionColumn.Credit,\n                                                                   WalletTransactionColumn.Client,\n                                                                   WalletTransactionColumn.Station\n                                                               };\n\n                return EnumExtensions.GetValues<WalletTransactionColumn>().Where(\n                    column => column != WalletTransactionColumn.None).Where(\n                        column => Columns.All(columnSetting => columnSetting.Column != column)).Select(\n                            column => new WalletTransactionColumnSettings\n                                          {\n                                              Column = column,\n                                              Visible = defaultColumns.Contains(column),\n                                              Width = -2\n                                          });\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/SettingsObjects/WindowLocationSettings.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.Common.SettingsObjects\n{\n    /// <summary>\n    /// Represents a serializable version of a rectangle.\n    /// </summary>\n    [Serializable]\n    [XmlRoot(\"location\")]\n    public sealed class WindowLocationSettings\n    {\n        [XmlAttribute(\"left\")]\n        public int Left { get; set; }\n\n        [XmlAttribute(\"top\")]\n        public int Top { get; set; }\n\n        [XmlAttribute(\"width\")]\n        public int Width { get; set; }\n\n        [XmlAttribute(\"height\")]\n        public int Height { get; set; }\n\n        /// <summary>\n        /// Performs an explicit conversion from <see cref=\"WindowLocationSettings\" /> to <see cref=\"System.Drawing.Rectangle\" />.\n        /// </summary>\n        /// <param name=\"rect\">The rect.</param>\n        /// <returns>\n        /// The result of the conversion.\n        /// </returns>\n        /// <exception cref=\"System.ArgumentNullException\">rect</exception>\n        /// <remarks>\n        /// Do not make the conversion operators implicit, there is a bug with XML serialization\n        /// </remarks>\n        public static explicit operator Rectangle(WindowLocationSettings rect)\n        {\n            rect.ThrowIfNull(nameof(rect));\n\n            return new Rectangle(rect.Left, rect.Top, rect.Width, rect.Height);\n        }\n\n        /// <summary>\n        /// Performs an explicit conversion from <see cref=\"System.Drawing.Rectangle\"/> to <see cref=\"WindowLocationSettings\"/>.\n        /// </summary>\n        /// <param name=\"rect\">The rect.</param>\n        /// <returns>The result of the conversion.</returns>\n        /// <remarks>Do not make the conversion operators implicit, there is a bug with XML serialization</remarks>\n        public static explicit operator WindowLocationSettings(Rectangle rect)\n            => new WindowLocationSettings { Left = rect.Left, Top = rect.Top, Width = rect.Width, Height = rect.Height };\n    }\n}"
  },
  {
    "path": "src/EVEMon.Common/Threading/Dispatcher.cs",
    "content": "﻿using System;\nusing System.Threading;\nusing System.Windows.Threading;\nusing ThreadDispatcher = System.Windows.Threading.Dispatcher;\n\nnamespace EVEMon.Common.Threading\n{\n    public static class Dispatcher\n    {\n        private static ThreadDispatcher s_mainThreadDispather;\n        private static DispatcherTimer s_oneSecondTimer;\n\n        /// <summary>\n        /// Starts the dispatcher on the main thread.\n        /// </summary>\n        /// <param name=\"thread\">The thread.</param>\n        /// <remarks>\n        /// If the method has already been called previously, this new call will silently fail.\n        /// </remarks>\n        internal static void Run(Thread thread)\n        {\n            if (s_mainThreadDispather != null)\n                return;\n\n            s_mainThreadDispather = ThreadDispatcher.FromThread(thread) ?? ThreadDispatcher.CurrentDispatcher;\n\n            s_oneSecondTimer = new DispatcherTimer(TimeSpan.FromSeconds(1),\n                DispatcherPriority.Background,\n                OneSecondTickTimer_Tick,\n                s_mainThreadDispather);\n        }\n\n        /// <summary>\n        /// Shutdowns the dispatcher.\n        /// </summary>\n        internal static void Shutdown()\n        {\n            if (s_oneSecondTimer == null)\n                return;\n\n            s_oneSecondTimer.Stop();\n            s_oneSecondTimer = null;\n        }\n\n        /// <summary>\n        /// Invoke the provided delegate on the underlying actor and wait for completion.\n        /// </summary>\n        /// <param name=\"action\">The action to invoke</param>\n        public static void Invoke(Action action)\n        {\n            if (s_mainThreadDispather == null || s_mainThreadDispather.CheckAccess())\n                action.Invoke();\n            else\n                s_mainThreadDispather.Invoke(action);\n        }\n\n        /// <summary>\n        /// Schedule an action to invoke on the actor, by specifying the time it will be executed.\n        /// </summary>\n        /// <param name=\"time\">The time at which the action will be executed.</param>\n        /// <param name=\"action\">The action to execute.</param>\n        public static void Schedule(TimeSpan time, Action action)\n        {\n            DispatcherTimer timer = new DispatcherTimer { Interval = time };\n            timer.Tick += (sender, args) =>\n            {\n                timer.Stop();\n                Invoke(action);\n            };\n            timer.Start();\n        }\n\n        /// <summary>\n        /// Occurs on every second, when the timer ticks.\n        /// </summary>\n        private static void OneSecondTickTimer_Tick(object sender, EventArgs e)\n        {\n            EveMonClient.UpdateOnOneSecondTick();\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/UpdateManager.cs",
    "content": "using System;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization.PatchXml;\nusing EVEMon.Common.Threading;\n\nnamespace EVEMon.Common\n{\n    /// <summary>\n    /// Takes care of looking for new versions of EVEMon and its datafiles.\n    /// </summary>\n    public static class UpdateManager\n    {\n        private static readonly TimeSpan s_frequency = TimeSpan.FromMinutes(Settings.Updates.\n            UpdateFrequency);\n\n        private static bool s_checkScheduled;\n        private static bool s_enabled;\n\n        /// <summary>\n        /// Gets or sets whether the autoupdater is enabled.\n        /// </summary>\n        public static bool Enabled\n        {\n            get { return s_enabled; }\n            set\n            {\n                s_enabled = value;\n\n                if (!s_enabled)\n                    return;\n\n                if (s_checkScheduled)\n                    return;\n\n                // Schedule a check in 10 seconds\n                ScheduleCheck(TimeSpan.FromSeconds(10));\n            }\n        }\n\n        /// <summary>\n        /// Deletes the installation files.\n        /// </summary>\n        public static void DeleteInstallationFiles()\n        {\n            foreach (string file in Directory.GetFiles(EveMonClient.EVEMonDataDir,\n                \"EVEMon-install-*.exe\", SearchOption.TopDirectoryOnly))\n            {\n                try\n                {\n                    FileInfo installationFile = new FileInfo(file);\n                    if (!installationFile.Exists)\n                        continue;\n\n                    FileHelper.DeleteFile(installationFile.FullName);\n                }\n                catch (UnauthorizedAccessException e)\n                {\n                    ExceptionHandler.LogException(e, false);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Deletes the data files.\n        /// </summary>\n        public static void DeleteDataFiles()\n        {\n            foreach (string file in Datafile.GetFilesFrom(EveMonClient.EVEMonDataDir,\n                Datafile.DatafilesExtension).Concat(Datafile.GetFilesFrom(EveMonClient.\n                EVEMonDataDir, Datafile.OldDatafileExtension)))\n            {\n                try\n                {\n                    FileInfo dataFile = new FileInfo(file);\n                    if (dataFile.Exists)\n                        FileHelper.DeleteFile(dataFile.FullName);\n                }\n                catch (UnauthorizedAccessException e)\n                {\n                    ExceptionHandler.LogException(e, false);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Schedules a check a specified time period in the future.\n        /// </summary>\n        /// <param name=\"time\">Time period in the future to start check.</param>\n        private static void ScheduleCheck(TimeSpan time)\n        {\n            s_checkScheduled = true;\n            Dispatcher.Schedule(time, () => BeginCheckAsync().ConfigureAwait(false));\n            EveMonClient.Trace(\"in \" + time);\n        }\n\n        /// <summary>\n        /// Performs the check asynchronously.\n        /// </summary>\n        /// <remarks>\n        /// Invoked on the UI thread the first time and on some background thread the rest of the time.\n        /// </remarks>\n        private static async Task BeginCheckAsync()\n        {\n            // If update manager has been disabled since the last\n            // update was triggered quit out here\n            if (!s_enabled)\n                s_checkScheduled = false;\n            // No connection ? Recheck in one minute\n            else if (!NetworkMonitor.IsNetworkAvailable)\n                ScheduleCheck(TimeSpan.FromMinutes(1));\n            else\n            {\n                string updateAddress = NetworkConstants.GitHubBase + NetworkConstants.\n                    EVEMonUpdates;\n                string emergAddress = updateAddress.Replace(\".xml\", string.Empty) +\n                    \"-emergency.xml\";\n                // Otherwise, query for the patch file\n                // First look up for an emergency patch\n                await Util.DownloadXmlAsync<SerializablePatch>(new Uri(emergAddress)).\n                    ContinueWith(async task =>\n                    {\n                        var result = task.Result;\n                        // If no emergency patch found proceed with the regular\n                        if (result.Error != null)\n                            result = await Util.DownloadXmlAsync<SerializablePatch>(new Uri(\n                                updateAddress));\n                        // Proccess the result\n                        OnCheckCompleted(result);\n                    }, EveMonClient.CurrentSynchronizationContext).ConfigureAwait(false);\n            }\n        }\n\n        /// <summary>\n        /// Called when patch file check completed.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private static void OnCheckCompleted(DownloadResult<SerializablePatch> result)\n        {\n            // If update manager has been disabled since the last\n            // update was triggered quit out here\n            if (!s_enabled)\n            {\n                s_checkScheduled = false;\n                return;\n            }\n\n            // Was there an error ?\n            if (result.Error != null)\n            {\n                // Logs the error and reschedule\n                EveMonClient.Trace($\"UpdateManager - {result.Error.Message}\",\n                    printMethod: false);\n                ScheduleCheck(TimeSpan.FromMinutes(1));\n                return;\n            }\n\n            try\n            {\n                // No error, let's try to deserialize\n                ScanUpdateFeed(result.Result);\n            }\n            catch (InvalidOperationException exc)\n            {\n                // An error occurred during the deserialization\n                ExceptionHandler.LogException(exc, true);\n            }\n            finally\n            {\n                EveMonClient.Trace();\n\n                // Reschedule\n                ScheduleCheck(s_frequency);\n            }\n        }\n\n        /// <summary>\n        /// Scans the update feed.\n        /// </summary>\n        /// <param name=\"result\">The result.</param>\n        private static void ScanUpdateFeed(SerializablePatch result)\n        {\n            Version currentVersion = Version.Parse(EveMonClient.FileVersionInfo.FileVersion);\n            SerializableRelease newestRelease = result.Releases?.FirstOrDefault(\n                release => Version.Parse(release.Version).Major == currentVersion.Major);\n\n            Version newestVersion = (newestRelease != null) ? Version.Parse(newestRelease.\n                Version) : currentVersion;\n            Version mostRecentDeniedVersion = !string.IsNullOrEmpty(Settings.Updates.\n                MostRecentDeniedUpgrade) ? new Version(Settings.Updates.\n                MostRecentDeniedUpgrade) : new Version();\n\n            // Is the program out of date and user has not previously denied this version?\n            if (currentVersion < newestVersion & mostRecentDeniedVersion < newestVersion)\n            {\n                // Quit if newest release is null\n                // (Shouldn't happen but it's nice to be prepared)\n                if (newestRelease == null)\n                    return;\n                // Reset the most recent denied version\n                Settings.Updates.MostRecentDeniedUpgrade = string.Empty;\n\n                Uri forumUrl = new Uri(newestRelease.TopicAddress);\n                Uri installerUrl = new Uri(newestRelease.PatchAddress);\n                string updateMessage = newestRelease.Message;\n                string installArgs = newestRelease.InstallerArgs;\n                string md5Sum = newestRelease.MD5Sum;\n                string additionalArgs = newestRelease.AdditionalArgs;\n                bool canAutoInstall = !string.IsNullOrEmpty(installerUrl.AbsoluteUri) &&\n                    !string.IsNullOrEmpty(installArgs);\n\n                if (!string.IsNullOrEmpty(additionalArgs) && additionalArgs.Contains(\n                    \"%EVEMON_EXECUTABLE_PATH%\"))\n                {\n                    string appPath = Path.GetDirectoryName(Application.ExecutablePath);\n                    installArgs = $\"{installArgs} {additionalArgs}\";\n                    installArgs = installArgs.Replace(\"%EVEMON_EXECUTABLE_PATH%\", appPath);\n                }\n\n                // Requests a notification to subscribers and quit\n                EveMonClient.OnUpdateAvailable(forumUrl, installerUrl, updateMessage,\n                    currentVersion, newestVersion, md5Sum, canAutoInstall, installArgs);\n                return;\n            }\n\n            // New data files released?\n            if (result.FilesHaveChanged)\n            {\n                // Requests a notification to subscribers\n                EveMonClient.OnDataUpdateAvailable(result.ChangedDatafiles);\n                return;\n            }\n\n            // Notify about a new major version\n            Version newestMajorVersion = result.Releases?.Max(release => Version.Parse(\n                release.Version)) ?? new Version();\n            SerializableRelease newestMajorRelease = result.Releases?.FirstOrDefault(release =>\n                Version.Parse(release.Version) == newestMajorVersion);\n            if (newestMajorRelease == null)\n                return;\n            newestVersion = Version.Parse(newestMajorRelease.Version);\n            Version mostRecentDeniedMajorUpgrade = !string.IsNullOrEmpty(Settings.Updates.\n                MostRecentDeniedMajorUpgrade)\n                ? new Version(Settings.Updates.MostRecentDeniedMajorUpgrade)\n                : new Version();\n\n            // Is there is a new major version and the user has not previously denied it?\n            if (currentVersion >= newestVersion | mostRecentDeniedMajorUpgrade >= newestVersion)\n                return;\n            // Reset the most recent denied version\n            Settings.Updates.MostRecentDeniedMajorUpgrade = string.Empty;\n            EveMonClient.OnUpdateAvailable(null, null, null, currentVersion, newestVersion,\n                null, false, null);\n        }\n\n        /// <summary>\n        /// Replaces the datafile.\n        /// </summary>\n        /// <param name=\"oldFilename\">The old filename.</param>\n        /// <param name=\"newFilename\">The new filename.</param>\n        public static void ReplaceDatafile(string oldFilename, string newFilename)\n        {\n            try\n            {\n                FileHelper.DeleteFile($\"{oldFilename}.bak\");\n                File.Copy(oldFilename, $\"{oldFilename}.bak\");\n                FileHelper.DeleteFile(oldFilename);\n                File.Move(newFilename, oldFilename);\n            }\n            catch (ArgumentException ex)\n            {\n                ExceptionHandler.LogException(ex, false);\n            }\n            catch (IOException ex)\n            {\n                ExceptionHandler.LogException(ex, false);\n            }\n            catch (UnauthorizedAccessException ex)\n            {\n                ExceptionHandler.LogException(ex, false);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/Util.cs",
    "content": "using EVEMon.Common.Data;\nusing EVEMon.Common.Exceptions;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Net;\nusing EVEMon.Common.Serialization;\nusing EVEMon.Common.Serialization.Esi;\nusing EVEMon.Common.Serialization.Eve;\nusing ICSharpCode.SharpZipLib.GZip;\nusing ICSharpCode.SharpZipLib.Zip.Compression.Streams;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing System.Net.NetworkInformation;\nusing System.Runtime.Serialization;\nusing System.Runtime.Serialization.Json;\nusing System.Security.Cryptography;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing System.Xml;\nusing System.Xml.Serialization;\nusing System.Xml.XPath;\nusing System.Xml.Xsl;\nusing YamlDotNet.RepresentationModel;\n\nnamespace EVEMon.Common\n{\n    /// <summary>\n    /// A collection of helper methods for downloads and deserialization.\n    /// </summary>\n    public static class Util\n    {\n        /// <summary>\n        /// Opens the provided url in a new process.\n        /// </summary>\n        /// <param name=\"url\">The URL.</param>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static void OpenURL(Uri url)\n        {\n            url.ThrowIfNull(nameof(url));\n\n            try\n            {\n                Process.Start(url.AbsoluteUri);\n            }\n            catch (FileNotFoundException ex)\n            {\n                ExceptionHandler.LogException(ex, false);\n            }\n        }\n\n        /// <summary>\n        /// Loads an XSL transform with the provided name from the resources.\n        /// </summary>\n        /// <param name=\"content\"></param>\n        /// <returns></returns>\n        public static XslCompiledTransform LoadXslt(string content)\n        {\n            using (StringReader stringReader = new StringReader(content))\n            {\n                XmlTextReader reader = new XmlTextReader(stringReader);\n                XslCompiledTransform xslt = new XslCompiledTransform();\n\n                xslt.Load(reader);\n                return xslt;\n            }\n        }\n\n        /// <summary>\n        /// Deserializes an XML document from a file.\n        /// </summary>\n        /// <typeparam name=\"T\">The type to deserialize from the document</typeparam>\n        /// <param name=\"filename\">The XML document to deserialize from.</param>\n        /// <param name=\"transform\">The XSL transformation to apply. May be <c>null</c>.</param>\n        /// <returns>The result of the deserialization.</returns>\n        public static T DeserializeXmlFromFile<T>(string filename, XslCompiledTransform transform = null)\n            where T : class\n        {\n            try\n            {\n                XmlSerializer xs = new XmlSerializer(typeof(T));\n\n                if (transform != null)\n                {\n                    MemoryStream stream = GetMemoryStream();\n                    using (XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8))\n                    {\n                        // Apply the XSL transform\n                        writer.Formatting = Formatting.Indented;\n                        transform.Transform(filename, writer);\n                        writer.Flush();\n\n                        // Deserialize from the given stream\n                        stream.Seek(0, SeekOrigin.Begin);\n                        return (T)xs.Deserialize(stream);\n                    }\n                }\n\n                // Deserialization without transform\n                using (Stream stream = FileHelper.OpenRead(filename, false))\n                {\n                    return (T)xs.Deserialize(stream);\n                }\n            }\n            catch (XsltException exc)\n            {\n                // An error occurred during the XSL transform\n                ExceptionHandler.LogException(exc, true);\n                return null;\n            }\n            catch (InvalidOperationException exc)\n            {\n                // An error occurred during the deserialization\n                ExceptionHandler.LogException(exc, true);\n                return null;\n            }\n            catch (XmlException exc)\n            {\n                ExceptionHandler.LogException(exc, true);\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Deserializes an XML document from a string.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"transform\">The transform.</param>\n        /// <returns>The result of the deserialization.</returns>\n        public static T DeserializeXmlFromString<T>(string text, XslCompiledTransform transform = null)\n            where T : class\n        {\n            try\n            {\n                if (transform != null)\n                {\n                    MemoryStream stream = GetMemoryStream();\n                    using (TextReader textReader = new StringReader(text))\n                    using (XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8))\n                    {\n                        XmlReader reader = new XmlTextReader(textReader);\n\n                        // Apply the XSL transform\n                        writer.Formatting = Formatting.Indented;\n                        transform.Transform(reader, writer);\n                        writer.Flush();\n\n                        // Deserialize from the given stream\n                        XmlSerializer xs = new XmlSerializer(typeof(T));\n                        stream.Seek(0, SeekOrigin.Begin);\n                        return (T)xs.Deserialize(stream);\n                    }\n                }\n\n                using (TextReader textReader = new StringReader(text))\n                {\n                    XmlSerializer xs = new XmlSerializer(typeof(T));\n                    return (T)xs.Deserialize(textReader);\n                }\n            }\n                // An error occurred during the XSL transform\n            catch (XsltException exc)\n            {\n                ExceptionHandler.LogException(exc, true);\n                return null;\n            }\n                // An error occurred during the deserialization\n            catch (InvalidOperationException exc)\n            {\n                ExceptionHandler.LogException(exc, true);\n                return null;\n            }\n            catch (XmlException exc)\n            {\n                ExceptionHandler.LogException(exc, true);\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Deserializes a datafile.\n        /// </summary>\n        /// <typeparam name=\"T\">The type to deserialize from the datafile</typeparam>\n        /// <param name=\"filename\">The datafile name</param>\n        /// <param name=\"transform\"></param>\n        /// <returns></returns>\n        internal static T DeserializeDatafile<T>(string filename, XslCompiledTransform transform = null)\n        {\n            // Gets the full path\n            string path = Datafile.GetFullPath(filename);\n            try\n            {\n                using (Stream stream = FileHelper.OpenRead(path, false))\n                {\n                    GZipStream gZipStream = new GZipStream(stream, CompressionMode.Decompress);\n                    XmlSerializer xs = new XmlSerializer(typeof(T));\n\n                    // Deserialization without transform\n                    if (transform == null)\n                        return (T)xs.Deserialize(gZipStream);\n\n                    // Deserialization with transform\n                    MemoryStream memoryStream = GetMemoryStream();\n                    XmlTextWriter writer = new XmlTextWriter(memoryStream, Encoding.UTF8);\n                    XmlTextReader reader = new XmlTextReader(gZipStream);\n\n                    // Apply the XSL transform\n                    writer.Formatting = Formatting.Indented;\n                    transform.Transform(reader, writer);\n                    writer.Flush();\n\n                    // Deserialize from the given stream\n                    memoryStream.Seek(0, SeekOrigin.Begin);\n                    return (T)xs.Deserialize(memoryStream);\n                }\n            }\n            catch (InvalidOperationException ex)\n            {\n                string message = $\"An error occurred decompressing {filename}, the error message was '{ex.Message}' from '{ex.Source}'. \" +\n                    $\"Try deleting all of the {Datafile.DatafilesExtension} files in %APPDATA%\\\\EVEMon.\";\n                throw new InvalidOperationException(message, ex);\n            }\n            catch (XmlException ex)\n            {\n                string message = $\"An error occurred reading the XML from {filename}, the error message was '{ex.Message}' from '{ex.Source}'. \" +\n                    $\"Try deleting all of the {Datafile.DatafilesExtension} files in %APPDATA%\\\\EVEMon.\";\n                throw new XmlException(message, ex);\n            }\n        }\n\n        /// <summary>\n        /// Deserializes an XML from a text.\n        /// </summary>\n        /// <typeparam name=\"T\">The inner type to deserialize</typeparam>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"transform\">The XSL transform to apply, may be null.</param>\n        /// <returns>The deserialized result</returns>\n        internal static CCPAPIResult<T> DeserializeAPIResultFromString<T>(string text, XslCompiledTransform transform = null)\n        {\n            try\n            {\n                XmlDocument doc = new XmlDocument();\n                doc.LoadXml(text);\n                return DeserializeAPIResultCore<T>(doc, transform);\n            }\n            catch (XmlException exc)\n            {\n                ExceptionHandler.LogException(exc, true);\n                return new CCPAPIResult<T>(exc);\n            }\n        }\n\n        /// <summary>\n        /// Deserialize an XML from a file.\n        /// </summary>\n        /// <typeparam name=\"T\">The inner type to deserialize</typeparam>\n        /// <param name=\"filename\">The filename.</param>\n        /// <param name=\"transform\">The XSL transform to apply, may be null.</param>\n        /// <returns>The deserialized result</returns>\n        internal static CCPAPIResult<T> DeserializeAPIResultFromFile<T>(string filename, XslCompiledTransform transform = null)\n        {\n            try\n            {\n                XmlDocument doc = new XmlDocument();\n                doc.Load(filename);\n                return DeserializeAPIResultCore<T>(doc, transform);\n            }\n            catch (XmlException exc)\n            {\n                ExceptionHandler.LogException(exc, true);\n                return new CCPAPIResult<T>(exc);\n            }\n        }\n\n        /// <summary>\n        /// Asynchronously download an XML and deserializes it into the specified type.\n        /// </summary>\n        /// <typeparam name=\"T\">The inner type to deserialize</typeparam>\n        /// <param name=\"url\">The url to query</param>\n        /// <param name=\"param\">The request parameters. If null, defaults will be used.</param>\n        /// <param name=\"transform\">The XSL transform to apply, may be null.</param>\n        internal static async Task<CCPAPIResult<T>> DownloadAPIResultAsync<T>(Uri url,\n            RequestParams param = null, XslCompiledTransform transform = null)\n        {\n            var asyncResult = await HttpWebClientService.DownloadXmlAsync(url, param);\n\n            CCPAPIResult<T> result;\n            try\n            {\n                // Was there an HTTP error ?\n                result = (asyncResult.Error != null) ? new CCPAPIResult<T>(asyncResult.Error) :\n                    DeserializeAPIResultCore<T>(asyncResult.Result, transform);\n                // We got the result\n                return result;\n            }\n            catch (Exception e)\n            {\n                result = new CCPAPIResult<T>(HttpWebClientServiceException.Exception(url, e));\n\n                ExceptionHandler.LogException(e, false);\n                EveMonClient.Trace($\"Method: DownloadAPIResultAsync, url: {url.AbsoluteUri}, postdata: {param?.Content}, type: {typeof(T).Name}\",\n                    false);\n            }\n\n            return result;\n        }\n        \n        /// <summary>\n        /// Process XML document.\n        /// </summary>\n        /// <typeparam name=\"T\">The type to deserialize from the document</typeparam>\n        /// <param name=\"transform\">The XSL transformation to apply. May be <c>null</c>.</param>\n        /// <param name=\"doc\">The XML document to deserialize from.</param>\n        /// <returns>The result of the deserialization.</returns>\n        private static CCPAPIResult<T> DeserializeAPIResultCore<T>(IXPathNavigable doc, XslCompiledTransform transform = null)\n        {\n            CCPAPIResult<T> result;\n\n            try\n            {\n                // Deserialization with a transform\n                using (XmlNodeReader reader = new XmlNodeReader((XmlDocument)doc))\n                {\n                    XmlSerializer xs = new XmlSerializer(typeof(CCPAPIResult<T>));\n\n                    if (transform != null)\n                    {\n                        MemoryStream stream = GetMemoryStream();\n                        using (XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8))\n                        {\n                            // Apply the XSL transform\n                            writer.Formatting = Formatting.Indented;\n                            transform.Transform(reader, writer);\n                            writer.Flush();\n\n                            // Deserialize from the given stream\n                            stream.Seek(0, SeekOrigin.Begin);\n                            result = (CCPAPIResult<T>)xs.Deserialize(stream);\n                        }\n                    }\n                    // Deserialization without transform\n                    else\n                        result = (CCPAPIResult<T>)xs.Deserialize(reader);\n                }\n\n                // Fix times\n                if (result.Result is ISynchronizableWithLocalClock)\n                {\n                    DateTime requestTime = DateTime.UtcNow;\n                    double offsetCCP = result.CurrentTime.Subtract(requestTime).TotalMilliseconds;\n                    result.SynchronizeWithLocalClock(offsetCCP);\n                }\n            }\n                // An error occurred during the XSL transform\n            catch (XsltException exc)\n            {\n                ExceptionHandler.LogException(exc, true);\n                result = new CCPAPIResult<T>(exc);\n            }\n                // An error occurred during the deserialization\n            catch (InvalidOperationException exc)\n            {\n                ExceptionHandler.LogException(exc, true);\n                result = new CCPAPIResult<T>(exc);\n            }\n            catch (XmlException exc)\n            {\n                ExceptionHandler.LogException(exc, true);\n                result = new CCPAPIResult<T>(exc);\n            }\n\n            // Stores XMLDocument\n            result.XmlDocument = doc;\n            return result;\n        }\n\n        /// <summary>\n        /// Asynchronously download an object from an XML stream.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"url\">The url to download from</param>\n        /// <param name=\"param\">The request parameters. If null, defaults will be used.</param>\n        /// <param name=\"transform\">The transform.</param>\n        /// <returns></returns>\n        public static async Task<DownloadResult<T>> DownloadXmlAsync<T>(Uri url,\n            RequestParams param = null, XslCompiledTransform transform = null) where T : class\n        {\n            var asyncResult = await HttpWebClientService.DownloadXmlAsync(url, param);\n            T result = null;\n            HttpWebClientServiceException error = null;\n            // Was there an HTTP error ??\n            if (asyncResult.Error != null)\n                error = asyncResult.Error;\n            else\n            {\n                // No http error, let's try to deserialize\n                try\n                {\n                    // Deserialize\n                    using (XmlNodeReader reader = new XmlNodeReader((XmlDocument)asyncResult.Result))\n                    {\n                        XmlSerializer xs = new XmlSerializer(typeof(T));\n                        if (transform != null)\n                        {\n                            MemoryStream stream = GetMemoryStream();\n                            using (XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8))\n                            {\n                                // Apply the XSL transform\n                                writer.Formatting = Formatting.Indented;\n                                transform.Transform(reader, writer);\n                                writer.Flush();\n\n                                // Deserialize from the given stream\n                                stream.Seek(0, SeekOrigin.Begin);\n                                result = (T)xs.Deserialize(stream);\n                            }\n                        }\n                        // Deserialization without transform\n                        else\n                            result = (T)xs.Deserialize(reader);\n                    }\n                }\n                // An error occurred during the XSL transform\n                catch (XsltException exc)\n                {\n                    ExceptionHandler.LogException(exc, true);\n                    error = new HttpWebClientServiceException(exc.GetBaseException().Message);\n                }\n                catch (InvalidOperationException exc)\n                {\n                    // An error occurred during the deserialization\n                    ExceptionHandler.LogException(exc, true);\n                    error = new HttpWebClientServiceException(exc.GetBaseException().Message);\n                }\n                catch (XmlException exc)\n                {\n                    ExceptionHandler.LogException(exc, true);\n                    error = new HttpWebClientServiceException(exc.GetBaseException().Message);\n                }\n            }\n            return new DownloadResult<T>(result, error, asyncResult.Response);\n        }\n\n        /// <summary>\n        /// Asynchronously downloads a JSON object from a JSON stream.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"url\">The URL.</param>\n        /// <param name=\"param\">The request parameters. If null, defaults will be used.</param>\n        /// <returns></returns>\n        public static async Task<JsonResult<T>> DownloadJsonAsync<T>(Uri url,\n            RequestParams param = null) where T : class\n        {\n            JsonResult<T> result;\n            try\n            {\n                var asyncResult = await HttpWebClientService.DownloadStreamAsync<T>(url,\n                    ParseJSONObject<T>, param);\n                var error = asyncResult.Error;\n                T data;\n                // Was there an HTTP error?\n                if (error != null)\n                    result = new JsonResult<T>(error);\n                else if ((data = asyncResult.Result) == default(T) && !asyncResult.Response.\n                        IsNotModifiedResponse)\n                    // This will become a json error\n                    result = new JsonResult<T>(new InvalidOperationException(\n                        \"null JSON response\"));\n                else\n                    result = new JsonResult<T>(asyncResult.Response, data);\n            }\n            catch (InvalidOperationException e)\n            {\n                result = new JsonResult<T>(e);\n                ExceptionHandler.LogException(e, true);\n            }\n            catch (InvalidDataContractException e)\n            {\n                result = new JsonResult<T>(e);\n                ExceptionHandler.LogException(e, true);\n            }\n            catch (SerializationException e)\n            {\n                // For deserializing non-errors\n                result = new JsonResult<T>(e);\n                ExceptionHandler.LogException(e, true);\n            }\n            catch (APIException e)\n            {\n                int code;\n                // Error code was converted to a string to match APIException\n                if (!e.ErrorCode.TryParseInv(out code))\n                    code = 0;\n                result = new JsonResult<T>(new ResponseParams(code), e.Message);\n                ExceptionHandler.LogException(e, true);\n            }\n            return result;\n        }\n\n        /// <summary>\n        /// Gets a nicely formatted string representation of a XML document.\n        /// </summary>\n        /// <param name=\"doc\">The document.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static string GetXmlStringRepresentation(IXPathNavigable doc)\n        {\n            doc.ThrowIfNull(nameof(doc));\n\n            // Creates the settings for the text writer\n            var settings = new XmlWriterSettings {\n                Indent = true,\n                NewLineHandling = NewLineHandling.Replace\n            };\n\n            // Writes to a string builder\n            StringBuilder xmlBuilder = new StringBuilder();\n            using (XmlWriter xmlWriter = XmlWriter.Create(xmlBuilder, settings))\n            {\n                XmlDocument xmlDoc = (XmlDocument)doc;\n                xmlDoc.WriteContentTo(xmlWriter);\n                xmlWriter.Flush();\n            }\n            return xmlBuilder.ToString();\n        }\n\n        /// <summary>\n        /// Serializes the given object to a XML document, dealt as the provided type.\n        /// </summary>\n        /// <param name=\"data\">The object to serialize.</param>\n        /// <returns>The Xml document representing the given object.</returns>\n        public static IXPathNavigable SerializeToXmlDocument(object data)\n        {\n            using (MemoryStream memStream = GetMemoryStream())\n            {\n                // Serializes to the stream\n                XmlSerializer serializer = new XmlSerializer(data.GetType());\n                serializer.Serialize(memStream, data);\n\n                // Creates a XML doc from the stream\n                memStream.Seek(0, SeekOrigin.Begin);\n                XmlDocument doc = new XmlDocument();\n                doc.Load(memStream);\n\n                return doc;\n            }\n        }\n\n        /// <summary>\n        /// Applies a XSLT to a <see cref=\"XmlDocument\" /> and returns another <see cref=\"XmlDocument\" />.\n        /// </summary>\n        /// <param name=\"doc\">The source <see cref=\"XmlDocument\" /></param>\n        /// <param name=\"xslt\">The XSLT to apply.</param>\n        /// <returns>\n        /// The transformed <see cref=\"XmlDocument\" />.\n        /// </returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static IXPathNavigable Transform(IXPathNavigable doc, XslCompiledTransform xslt)\n        {\n            doc.ThrowIfNull(nameof(doc));\n\n            xslt.ThrowIfNull(nameof(xslt));\n\n            MemoryStream stream = GetMemoryStream();\n            using (XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8))\n            {\n                // Apply the XSL transform\n                writer.Formatting = Formatting.Indented;\n                xslt.Transform(doc, writer);\n                writer.Flush();\n\n                // Reads the XML document from the given stream.\n                stream.Seek(0, SeekOrigin.Begin);\n                XmlDocument outDoc = new XmlDocument();\n                outDoc.Load(stream);\n                return outDoc;\n            }\n        }\n\n        /// <summary>\n        /// Opens a file or search the given string and look for a \"revision\" attribute and return its value.\n        /// </summary>\n        /// <param name=\"filename\"></param>\n        /// <returns>The revision number of the assembly which generated this file,\n        /// or <c>0</c> if no such file was found (old format, before the introduction of the revision numbers).</returns>\n        public static int GetRevisionNumber(string filename)\n        {\n            // Uses a regex to retrieve the revision number\n            string content = File.Exists(filename) ? File.ReadAllText(filename) : filename;\n\n            Match match = Regex.Match(content, \"revision=\\\"([0-9]+)\\\"\",\n                RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);\n\n            // No match ? Then there was no \"revision\" attribute, this is an old format\n            if (!match.Success || match.Groups.Count < 2)\n                return 0;\n\n            // Returns the revision number (first group is the whole match, the second one the capture)\n            int revision;\n            return match.Groups[1].Value.TryParseInv(out revision) ? revision : default(int);\n        }\n\n        /// <summary>\n        /// Uncompress the given gzipped file to a temporary file and returns its filename.\n        /// </summary>\n        /// <param name=\"filename\"></param>\n        /// <returns>The temporary file's name.</returns>\n        public static string UncompressToTempFile(string filename)\n        {\n            string tempFile = Path.GetTempFileName();\n\n            // We decompress the gzipped stream and writes it to a temporary file\n            FileStream stream = null;\n            try\n            {\n                stream = File.OpenRead(filename);\n                var gzipStream = new GZipStream(stream, CompressionMode.Decompress);\n\n                using (var outStream = File.OpenWrite(tempFile))\n                {\n                    byte[] bytes = new byte[4096];\n\n                    // Since we're reading a compressed stream, the total number of bytes to decompress cannot be foreseen\n                    // So we just continue reading while there are bytes to decompress\n                    while (true)\n                    {\n                        int count = gzipStream.Read(bytes, 0, bytes.Length);\n                        if (count == 0)\n                            break;\n\n                        outStream.Write(bytes, 0, count);\n                    }\n\n                    // Done, we flush and recall this method with the temp file name\n                    outStream.Flush();\n                }\n            }\n            finally\n            {\n                stream?.Dispose();\n            }\n            return tempFile;\n        }\n\n        /// <summary>\n        /// Gets the XML Root Element for the specified XML File.\n        /// </summary>\n        /// <param name=\"filename\">Filename of an XmlDocument</param>\n        /// <returns>\n        /// Text representation of the root node\n        /// </returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        /// <exception cref=\"System.IO.FileNotFoundException\">Document not found</exception>\n        /// <remarks>\n        /// After doing some testing, this is the fastest robust\n        /// mechanism for getting the root node. This takes 480 ticks\n        /// as opposed to &gt; 900 for XmlDocument methods.\n        /// </remarks>\n        public static string GetXmlRootElement(Uri filename)\n        {\n            filename.ThrowIfNull(nameof(filename));\n\n            if (!File.Exists(filename.LocalPath))\n                throw new FileNotFoundException(\"Document not found\", filename.LocalPath);\n\n            using (var reader = new XmlTextReader(filename.LocalPath))\n            {\n                reader.XmlResolver = null;\n                while (reader.Read())\n                {\n                    if (reader.NodeType == XmlNodeType.Element)\n                        return reader.Name;\n                }\n            }\n\n            return null;\n        }\n\n        /// <summary>\n        /// Gets the XML root element if the specified input is valid XML.\n        /// </summary>\n        /// <param name=\"input\">The input.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static string GetXmlRootElement(TextReader input)\n        {\n            input.ThrowIfNull(nameof(input));\n\n            try\n            {\n                var xmlDoc = new XmlDocument();\n                xmlDoc.Load(input);\n                return xmlDoc.DocumentElement?.Name;\n            }\n            catch (XmlException)\n            {\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Creates an MD5Sum of the file.\n        /// </summary>\n        /// <param name=\"filename\">The filename.</param>\n        /// <returns></returns>\n        public static string CreateMD5From(string filename)\n        {\n            if (!File.Exists(filename))\n                throw new FileNotFoundException($\"{filename} not found!\");\n\n            return CreateMD5(GetFileStream(filename, FileMode.Open, FileAccess.Read));\n        }\n\n        /// <summary>\n        /// Creates an MD5Sum from a stream.\n        /// </summary>\n        /// <param name=\"stream\">The stream.</param>\n        /// <returns></returns>\n        public static string CreateMD5(Stream stream)\n        {\n            using (stream)\n            using (var md5 = MD5.Create())\n            {\n                byte[] hash = md5.ComputeHash(stream);\n                return BitConverter.ToString(hash).Replace(\"-\", string.Empty).ToLowerInvariant();\n            }\n        }\n\n        /// <summary>\n        /// Creates an SHA1Sum from the mac address of the first operational network interface.\n        /// </summary>\n        /// <returns></returns>\n        public static string CreateSHA1SumFromMacAddress()\n        {\n            var ni = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(nic =>\n                nic.OperationalStatus == OperationalStatus.Up);\n\n            if (ni == null)\n                return string.Empty;\n\n            var stream = GetMemoryStream(ni.GetPhysicalAddress().GetAddressBytes());\n            return CreateSHA1(stream);\n        }\n\n        /// <summary>\n        /// Creates an SHA1Sum from a stream.\n        /// </summary>\n        /// <param name=\"stream\">The stream.</param>\n        /// <returns></returns>\n        public static string CreateSHA1(Stream stream)\n        {\n            using (stream)\n            using (var sha1 = SHA1.Create())\n            {\n                byte[] hash = sha1.ComputeHash(stream);\n                return BitConverter.ToString(hash).Replace(\"-\", string.Empty).ToLowerInvariant();\n            }\n        }\n\n        /// <summary>\n        /// Gets a memory stream.\n        /// </summary>\n        /// <param name=\"buffer\">The buffer.</param>\n        /// <returns>\n        /// A new memory stream\n        /// </returns>\n        public static MemoryStream GetMemoryStream(byte[] buffer = null)\n            => buffer == null ? new MemoryStream() : new MemoryStream(buffer);\n\n        /// <summary>\n        /// Gets a memory stream from the specified stream.\n        /// </summary>\n        /// <param name=\"inputStream\">The input stream.</param>\n        /// <returns></returns>\n        public static MemoryStream GetMemoryStream(Stream inputStream)\n        {\n            using (var outputStream = GetMemoryStream())\n            {\n                inputStream.CopyTo(outputStream);\n                return outputStream;\n            }\n        }\n\n        /// <summary>\n        /// Gets a file stream.\n        /// </summary>\n        /// <param name=\"filePath\">The file path.</param>\n        /// <param name=\"mode\">The mode.</param>\n        /// <param name=\"access\">The access.</param>\n        /// <param name=\"share\">The share.</param>\n        /// <returns>A new file stream</returns>\n        public static FileStream GetFileStream(string filePath, FileMode mode = FileMode.OpenOrCreate,\n            FileAccess access = FileAccess.ReadWrite, FileShare share = FileShare.None)\n            => new FileStream(filePath, mode, access, share, bufferSize: 4096, useAsync: true);\n\n        /// <summary>\n        /// Compresses the provided input data using zlib gzip.\n        /// </summary>\n        /// <param name=\"inputData\">The input data.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static IEnumerable<byte> GZipCompress(byte[] inputData)\n        {\n            inputData.ThrowIfNull(nameof(inputData));\n\n            using (var outputStream = GetMemoryStream())\n            {\n                var gZipOutputStream = new GZipOutputStream(outputStream);\n                gZipOutputStream.Write(inputData, 0, inputData.Length);\n                gZipOutputStream.Finish();\n\n                return outputStream.ToArray();\n            }\n        }\n\n        /// <summary>\n        /// Uncompresses the provided input data using zlib gzip.\n        /// </summary>\n        /// <param name=\"inputData\">The input data.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static IEnumerable<byte> GZipUncompress(byte[] inputData)\n        {\n            inputData.ThrowIfNull(nameof(inputData));\n\n            using (var inputStream = GetMemoryStream(inputData))\n            using (var outputStream = GetMemoryStream())\n            {\n                var gZipOutputStream = new GZipInputStream(inputStream);\n                gZipOutputStream.CopyTo(outputStream);\n                gZipOutputStream.Flush();\n\n                return outputStream.ToArray();\n            }\n        }\n\n        /// <summary>\n        /// Compresses the provided input data using zlib deflater.\n        /// </summary>\n        /// <param name=\"inputData\">The input data.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static IEnumerable<byte> DeflateCompress(byte[] inputData)\n        {\n            inputData.ThrowIfNull(nameof(inputData));\n\n            using (var outputStream = GetMemoryStream())\n            {\n                var deflaterOutputStream = new DeflaterOutputStream(outputStream);\n                deflaterOutputStream.Write(inputData, 0, inputData.Length);\n                deflaterOutputStream.Finish();\n\n                return outputStream.ToArray();\n            }\n        }\n\n        /// <summary>\n        /// Uncompresses the provided input data using zlib inflater.\n        /// </summary>\n        /// <param name=\"inputData\">The input data.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static IEnumerable<byte> InflateUncompress(byte[] inputData)\n        {\n            inputData.ThrowIfNull(nameof(inputData));\n\n            using (var inputStream = GetMemoryStream(inputData))\n            using (var outputStream = GetMemoryStream())\n            {\n                var deflaterOutputStream = new InflaterInputStream(inputStream);\n                deflaterOutputStream.CopyTo(outputStream);\n                deflaterOutputStream.Flush();\n\n                return outputStream.ToArray();\n            }\n        }\n\n        /// <summary>\n        /// Uncompress using zlib.\n        /// </summary>\n        /// <param name=\"inputData\">The input data.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static IEnumerable<byte> ZlibUncompress(byte[] inputData)\n        {\n            inputData.ThrowIfNull(nameof(inputData));\n\n            if (!inputData.Any())\n                return null;\n\n            if (inputData[0] == 31 && inputData[1] == 139)\n                return GZipUncompress(inputData);\n\n            if (inputData[0] == 120 && inputData[1] == 156)\n                return InflateUncompress(inputData);\n\n            return inputData;\n        }\n\n        /// <summary>\n        /// Uncompress using zlib.\n        /// </summary>\n        /// <param name=\"inputStream\">The input stream.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        public static Stream ZlibUncompress(Stream inputStream)\n        {\n            inputStream.ThrowIfNull(nameof(inputStream));\n\n            // If it's not a MemoryStream copy it to one\n            var stream = (inputStream as MemoryStream) ?? GetMemoryStream(inputStream);\n\n            if (stream == null)\n                return inputStream;\n\n            byte[] data = ZlibUncompress(stream.ToArray()) as byte[];\n\n            return data == null ? inputStream : new MemoryStream(data);\n        }\n\n        /// <summary>\n        /// Deserializes a JSON string to the passed object.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"json\">The json.</param>\n        /// <returns></returns>\n        public static T DeserializeJson<T>(string json) where T : class\n        {\n            try\n            {\n                using (var stream = GetMemoryStream(Encoding.Unicode.GetBytes(json)))\n                {\n                    var settings = new DataContractJsonSerializerSettings()\n                    {\n                        UseSimpleDictionaryFormat = true\n                    };\n                    var js = new DataContractJsonSerializer(typeof(T), settings);\n                    return (T)js.ReadObject(stream);\n                }\n            }\n            catch (InvalidOperationException exc)\n            {\n                // An error occurred during the deserialization\n                ExceptionHandler.LogException(exc, true);\n                return null;\n            }\n            catch (InvalidDataContractException exc)\n            {\n                ExceptionHandler.LogException(exc, true);\n                return null;\n            }\n        }\n        \n        /// <summary>\n        /// Encrypts the specified text using the provided password.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"password\">The password.</param>\n        /// <returns></returns>\n        public static string Encrypt(string text, string password)\n        {\n            // If no password is provided return the text unencrypted\n            if (string.IsNullOrWhiteSpace(password))\n                return text;\n\n            // Ensure that salt is of the correct size\n            while (password.Length < sizeof (long))\n            {\n                password += password;\n            }\n\n            byte[] encrypted;\n            using (var pdb = new Rfc2898DeriveBytes(password, Encoding.Unicode.GetBytes(password)))\n            {\n                using (var aes = new AesCryptoServiceProvider())\n                {\n                    var encryptor = aes.CreateEncryptor(pdb.GetBytes(32), pdb.GetBytes(16));\n                    var msEncrypt = GetMemoryStream();\n                    var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);\n                    using (var swEncrypt = new StreamWriter(csEncrypt))\n                    {\n                        // Write all data to the stream\n                        swEncrypt.Write(text);\n                        swEncrypt.Flush();\n                    }\n                    encrypted = msEncrypt.ToArray();\n                }\n            }\n            return Convert.ToBase64String(encrypted);\n        }\n\n        /// <summary>\n        /// Decrypts the specified ciphered text using the provided password.\n        /// </summary>\n        /// <param name=\"cipheredText\">The ciphered text.</param>\n        /// <param name=\"password\">The password.</param>\n        /// <returns></returns>\n        public static string Decrypt(string cipheredText, string password)\n        {\n            // If no password is provided return the text undecrypted\n            if (string.IsNullOrWhiteSpace(password))\n                return cipheredText;\n\n            byte[] text;\n            try\n            {\n                text = Convert.FromBase64String(cipheredText);\n            }\n                // If text is not encrypted return it undecrypted\n            catch (FormatException)\n            {\n                return cipheredText;\n            }\n\n            // Ensure that salt is of the correct size\n            while (password.Length < sizeof (long))\n            {\n                password += password;\n            }\n\n            string decrypted;\n            using (var pdb = new Rfc2898DeriveBytes(password, Encoding.Unicode.GetBytes(password)))\n            {\n                using (var aes = new AesCryptoServiceProvider())\n                {\n                    try\n                    {\n                        var decryptor = aes.CreateDecryptor(pdb.GetBytes(32), pdb.GetBytes(16));\n                        var msDecrypt = GetMemoryStream(text);\n                        var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);\n                        using (var srDecrypt = new StreamReader(csDecrypt))\n                        {\n                            // Read the decrypted bytes from the decrypting stream and place them in a string\n                            decrypted = srDecrypt.ReadToEnd();\n                        }\n                    }\n                    catch (CryptographicException)\n                    {\n                        // In same rare cases the ciphered text may not be a ciphered one\n                        // but still pass the Base64 convertion; In those cases the decryptor\n                        // throws an exception, so we return the text as is\n                        // Note: If anyone knows a better way to validate a string as base64 converted, please refactore the code\n                        return cipheredText;\n                    }\n                }\n            }\n            return decrypted;\n        }\n\n        /// <summary>\n        /// Parsing delegate for JSON objects.\n        /// </summary>\n        /// <typeparam name=\"T\">The type to decode.</typeparam>\n        /// <param name=\"stream\">The stream to read.</param>\n        /// <param name=\"response\">The response from the server.</param>\n        /// <returns>The parsed object; or an EsiAPIError if that is relevant; or otherwise\n        /// null</returns>\n        private static T ParseJSONObject<T>(Stream stream, ResponseParams response)\n            where T : class\n        {\n            T value = default(T);\n            if (!response.IsNotModifiedResponse)\n            {\n                if (!response.IsOKResponse)\n                    ThrowJSONError(stream, response);\n                // Deserialize\n                var settings = new DataContractJsonSerializerSettings()\n                {\n                    UseSimpleDictionaryFormat = true\n                };\n                // If an invalid operation exception or data contract exception occurs, the\n                // message will be passed up the stack and wrapped in a\n                // HttpWebClientServiceException\n                value = new DataContractJsonSerializer(typeof(T), settings).ReadObject(\n                    stream) as T;\n            }\n            return value;\n        }\n\n        /// <summary>\n        /// Throws an appropriate exception when a JSON error is parsed.\n        /// </summary>\n        /// <param name=\"stream\">The stream which has the failure details.</param>\n        /// <param name=\"response\">The response from the server.</param>\n        private static void ThrowJSONError(Stream stream, ResponseParams response)\n        {\n            // Initialize parser to attempt and parse error details\n            var settings = new DataContractJsonSerializerSettings();\n            var serializer = new DataContractJsonSerializer(typeof(EsiAPIError), settings);\n            int code = response.ResponseCode;\n            string responseCode = code.ToString(CultureInfo.InvariantCulture);\n            try\n            {\n                var esiError = serializer.ReadObject(stream) as EsiAPIError;\n                if (esiError != null)\n                    // Create a serializable error for an API exception\n                    throw new APIException(new SerializableAPIError()\n                    {\n                        ErrorMessage = esiError.Error,\n                        ErrorCode = responseCode\n                    });\n            }\n            catch (InvalidOperationException e)\n            {\n                ExceptionHandler.LogException(e, true);\n            }\n            catch (InvalidDataContractException e)\n            {\n                ExceptionHandler.LogException(e, true);\n            }\n            catch (SerializationException e)\n            {\n                // For deserializing errors\n                ExceptionHandler.LogException(e, true);\n            }\n            // Throw with what we have\n            throw new HttpWebClientServiceException(responseCode)\n            {\n                StatusCode = (System.Net.HttpStatusCode)code\n            };\n        }\n\n        /// <summary>\n        /// Parses the specified yaml text.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <returns></returns>\n        internal static YamlNode ParseYaml(string text)\n        {\n            using (var sr = new StringReader(text))\n            {\n                YamlStream yStream = new YamlStream();\n                yStream.Load(sr);\n                return yStream.Documents.First().RootNode;\n            }\n        }\n\n        /// <summary>\n        /// Converts the binary data to URL-safe Base 64 encoding.\n        /// </summary>\n        /// <param name=\"data\">The byte data to convert.</param>\n        /// <returns>The URL safe encoded version.</returns>\n        public static string URLSafeBase64(byte[] data)\n        {\n            return Convert.ToBase64String(data).Replace('+', '-').Replace('/', '_').\n                Replace(\"=\", \"\");\n        }\n\n        /// <summary>\n        /// Computes the Base-64 URL safe SHA-256 hash of the data.\n        /// </summary>\n        /// <param name=\"data\">The encoded data to hash.</param>\n        /// <returns>The URL safe encoded SHA-256 hash of that data.</returns>\n        public static string SHA256Base64(byte[] data)\n        {\n            string hash;\n            using (var sha = new SHA256Managed())\n            {\n                hash = URLSafeBase64(sha.ComputeHash(data));\n            }\n            return hash;\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Common/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Dropbox.Api\" version=\"4.9.4\" targetFramework=\"net461\" />\n  <package id=\"Google.Apis\" version=\"1.42.0\" targetFramework=\"net461\" />\n  <package id=\"Google.Apis.Auth\" version=\"1.42.0\" targetFramework=\"net461\" />\n  <package id=\"Google.Apis.Calendar.v3\" version=\"1.42.0.1795\" targetFramework=\"net461\" />\n  <package id=\"Google.Apis.Core\" version=\"1.42.0\" targetFramework=\"net461\" />\n  <package id=\"Google.Apis.Drive.v3\" version=\"1.42.0.1778\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Bcl\" version=\"1.1.10\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Bcl.Async\" version=\"1.0.168\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Bcl.Build\" version=\"1.0.21\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.IdentityModel.JsonWebTokens\" version=\"5.6.0\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.IdentityModel.Logging\" version=\"5.6.0\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.IdentityModel.Tokens\" version=\"5.6.0\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Net.Http\" version=\"2.2.29\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.OneDriveSDK\" version=\"1.1.29\" targetFramework=\"net461\" />\n  <package id=\"Nancy\" version=\"2.0.0\" targetFramework=\"net461\" />\n  <package id=\"NetOffice.Core.Net40\" version=\"1.7.4.4\" targetFramework=\"net461\" />\n  <package id=\"NetOffice.Outlook.Net40\" version=\"1.7.4.4\" targetFramework=\"net461\" />\n  <package id=\"Newtonsoft.Json\" version=\"10.0.3\" targetFramework=\"net461\" />\n  <package id=\"SharpZipLib\" version=\"1.2.0\" targetFramework=\"net461\" />\n  <package id=\"System.IdentityModel.Tokens.Jwt\" version=\"5.6.0\" targetFramework=\"net461\" />\n  <package id=\"YamlDotNet\" version=\"8.0.0\" targetFramework=\"net461\" />\n  <package id=\"Zlib.Portable.Signed\" version=\"1.11.0\" targetFramework=\"net461\" />\n</packages>"
  },
  {
    "path": "src/EVEMon.LogitechG15/CycleEventArgs.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.LogitechG15\n{\n    internal sealed class CycleEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CycleEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"cycle\">if set to <c>true</c> [cycle].</param>\n        internal CycleEventArgs(bool cycle)\n        {\n            Cycle = cycle;\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether this <see cref=\"CycleEventArgs\"/> is cycle.\n        /// </summary>\n        /// <value><c>true</c> if cycle; otherwise, <c>false</c>.</value>\n        internal bool Cycle { get; private set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.LogitechG15/EVEMon.LogitechG15.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{3067BDFB-C02D-4CAF-96AA-4D8F9F986180}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>EVEMon.LogitechG15</RootNamespace>\n    <AssemblyName>EVEMon.LogitechG15</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\n    <DebugType>full</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <Optimize>true</Optimize>\n    <DebugType>none</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"LogitechLcd.NET, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <SpecificVersion>False</SpecificVersion>\n      <HintPath>.\\LogitechLcd.NET.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Drawing\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\..\\SharedAssemblyInfo.cs\">\n      <Link>Properties\\SharedAssemblyInfo.cs</Link>\n    </Compile>\n    <Compile Include=\"CycleEventArgs.cs\" />\n    <Compile Include=\"G15Handler.cs\" />\n    <Compile Include=\"GlobalSuppressions.cs\" />\n    <Compile Include=\"LcdInterface.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"LcdDisplay.cs\" />\n    <Compile Include=\"LcdState.cs\" />\n    <Compile Include=\"LcdLine.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\EVEMon.Common\\EVEMon.Common.csproj\">\n      <Project>{C0665275-3E0B-4117-81B0-751206ED03CD}</Project>\n      <Name>EVEMon.Common</Name>\n      <Private>False</Private>\n      <Properties>SkipValidatePackageReferences=true</Properties>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"Resources\\LCDSplash.bmp\" />\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"LogitechLcd.x64.dll\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"LogitechLcd.x86.dll\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"app.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "src/EVEMon.LogitechG15/G15Handler.cs",
    "content": "using System;\nusing System.Linq;\nusing EVEMon.Common;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations.CCPAPI;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\n\nnamespace EVEMon.LogitechG15\n{\n    /// <summary>\n    /// This class takes care to drive the <see cref=\"LcdDisplay\"/> according to the settings, the characters, the global events, etc. \n    /// <para>It malaxes and fetches data to the <see cref=\"LcdDisplay\"/> while this last one holds the responsibility to cycle between chars, \n    /// format the display, and update to the device.</para>\n    /// </summary>\n    public static class G15Handler\n    {\n        private static LcdDisplay s_lcd;\n        private static bool s_startupError;\n\n\n        #region Initialize\n\n        /// <summary>\n        /// Initialises the G15 event handles.\n        /// </summary>\n        public static void Initialize()\n        {\n            // Quit if the client has been shut down\n            if (EveMonClient.Closed)\n                return;\n\n            EveMonClient.TimerTick += EveMonClient_TimerTick;\n        }\n\n        #endregion\n\n\n        /// <summary>\n        /// Gets a value indicating whether the LcdDisplay is running.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the LcdDisplay is running; otherwise, <c>false</c>.\n        /// </value>\n        private static bool IsRunning => s_lcd != null;\n\n\n        #region LCD Updater\n\n        /// <summary>\n        /// Update on every second (and when some of the G15 buttons are pressed).\n        /// </summary>\n        private static void UpdateOnTimerTick()\n        {\n            // No G15 keyboard connected\n            if (s_startupError)\n                return;\n\n            // Did the state changed ?\n            if (Settings.G15.Enabled != IsRunning)\n            {\n                if (!IsRunning)\n                {\n                    Start();\n                    if (s_startupError)\n                        return;\n                }\n                else\n                    Stop();\n            }\n\n            // Run\n            if (!IsRunning)\n                return;\n\n            UpdateG15Data();\n            s_lcd.Paint();\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Starts the LCD display.\n        /// </summary>\n        private static void Start()\n        {\n            try\n            {\n                s_lcd = LcdDisplay.Instance();\n\n                if (s_lcd == null)\n                    return;\n\n                s_lcd.SwitchState(LcdState.SplashScreen);\n\n                // Initialize the current character\n                s_lcd.CurrentCharacter = EveMonClient.MonitoredCharacters.OfType<CCPCharacter>().FirstOrDefault();\n\n                UpdateFromSettings();\n\n                // Subscribe to events of the EVEMon client\n                EveMonClient.QueuedSkillsCompleted += EveMonClient_QueuedSkillsCompleted;\n                EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n\n                // Subscribe to events which occur of G15 buttons pressed\n                LcdDisplay.ApiUpdateRequested += LcdDisplay_APIUpdateRequested;\n                LcdDisplay.AutoCycleChanged += LcdDisplay_AutoCycleChanged;\n                LcdDisplay.CurrentCharacterChanged += LcdDisplay_CurrentCharacterChanged;\n            }\n            catch (Exception ex)\n            {\n                ExceptionHandler.LogException(ex, true);\n                s_lcd = null;\n                s_startupError = true;\n            }\n        }\n\n        /// <summary>\n        /// Stop the LCD display.\n        /// </summary>\n        private static void Stop()\n        {\n            try\n            {\n                s_lcd.Dispose();\n            }\n            catch (Exception ex)\n            {\n                EveMonClient.Trace(\"failed\");\n                ExceptionHandler.LogException(ex, true);\n            }\n            finally\n            {\n                s_lcd = null;\n\n                // Unsubscribe to events of the EVEMon client\n                EveMonClient.QueuedSkillsCompleted -= EveMonClient_QueuedSkillsCompleted;\n                EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n\n                // Unsubscribe to events which occur of G15 buttons pressed\n                LcdDisplay.ApiUpdateRequested -= LcdDisplay_APIUpdateRequested;\n                LcdDisplay.AutoCycleChanged -= LcdDisplay_AutoCycleChanged;\n                LcdDisplay.CurrentCharacterChanged -= LcdDisplay_CurrentCharacterChanged;\n            }\n        }\n\n        /// <summary>\n        /// Updates preferences from settings.\n        /// </summary>\n        private static void UpdateFromSettings()\n        {\n            s_lcd.Cycle = Settings.G15.UseCharactersCycle;\n            s_lcd.CycleInterval = Settings.G15.CharactersCycleInterval;\n            s_lcd.CycleSkillQueueTime = Settings.G15.UseTimeFormatsCycle;\n            s_lcd.CycleCompletionInterval = Settings.G15.TimeFormatsCycleInterval;\n            s_lcd.ShowSystemTime = Settings.G15.ShowSystemTime;\n            s_lcd.ShowEVETime = Settings.G15.ShowEVETime;\n        }\n\n        /// <summary>\n        /// Update the display once every second.\n        /// </summary>\n        private static void UpdateG15Data()\n        {\n            // First character to complete a skill\n            CCPCharacter nextChar = EveMonClient.MonitoredCharacters.OfType<CCPCharacter>().Where(\n                x => x.IsTraining).OrderBy(x => x.CurrentlyTrainingSkill.EndTime).FirstOrDefault();\n\n            if (nextChar != null)\n                s_lcd.FirstCharacterToCompleteSkill = nextChar;\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// On every second, we check whether we should start ot stop the LCD display, updated its data, etc.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private static void EveMonClient_TimerTick(object sender, EventArgs e)\n        {\n            UpdateOnTimerTick();\n        }\n\n        /// <summary>\n        /// When skills are completed, we display a special message.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private static void EveMonClient_QueuedSkillsCompleted(object sender, QueuedSkillsEventArgs e)\n        {\n            s_lcd.SkillCompleted(e.Character, e.CompletedSkills.Count);\n        }\n\n        /// <summary>\n        /// Update the preferences when the settings change.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private static void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateFromSettings();\n        }\n\n        #endregion\n\n\n        #region Events triggered by the G15 buttons\n\n        /// <summary>\n        /// Occurs whenever the current character changed (because of a button press or cycling).\n        /// </summary>\n        private static void LcdDisplay_CurrentCharacterChanged(object sender, CharacterChangedEventArgs e)\n        {\n            UpdateOnTimerTick();\n        }\n\n        /// <summary>\n        /// Occurs whenever a G15 button has been pressed which requires EVEMon to requery the API for the specified character.\n        /// </summary>\n        private static void LcdDisplay_APIUpdateRequested(object sender, CharacterChangedEventArgs e)\n        {\n            CCPCharacter ccpCharacter = e.Character as CCPCharacter;\n            ccpCharacter?.QueryMonitors.Query(new Enum[]\n            {\n                ESIAPICharacterMethods.CharacterSheet,\n                ESIAPICharacterMethods.SkillQueue\n            });\n        }\n\n        /// <summary>\n        /// Occurs whenever the auto cycle should change (because of a button press).\n        /// </summary>\n        private static void LcdDisplay_AutoCycleChanged(object sender, CycleEventArgs e)\n        {\n            Settings.G15.UseCharactersCycle = e.Cycle;\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.LogitechG15/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage \n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given \n// a specific target and scoped to a namespace, type, member, etc.\n//\n// To add a suppression to this file, right-click the message in the \n// Error List, point to \"Suppress Message(s)\", and click \n// \"In Project Suppression File\".\n// You do not need to add suppressions to this file manually.\n\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1014:MarkAssembliesWithClsCompliant\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1020:AvoidNamespacesWithFewTypes\", Scope = \"namespace\", Target = \"lgLcdClassLibrary\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"EVEMon.LogitechG15.G15Handler.#Start()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"EVEMon.LogitechG15.G15Handler.#Stop()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"lgLcdClassLibrary.LCDInterface.#Close()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"lgLcdClassLibrary.LCDInterface.#DisplayBitmap(System.Byte[]&,System.UInt32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"lgLcdClassLibrary.LCDInterface.#Open(System.String,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"lgLcdClassLibrary.LCDInterface.#ReadSoftButton(System.Int32&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1045:DoNotPassTypesByReference\", MessageId = \"0#\", Scope = \"member\", Target = \"lgLcdClassLibrary.LCDInterface.#ReadSoftButton(System.Int32&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1045:DoNotPassTypesByReference\", MessageId = \"0#\", Scope = \"member\", Target = \"lgLcdClassLibrary.LCDInterface.#DisplayBitmap(System.Byte[]&,System.UInt32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#AbbreviationFormat(System.Decimal,System.Single)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.LogitechG15.LineProcess.#ctor(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#PaintCharactersList()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.LogitechG15.LineProcess.#ctor(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#PaintCycleSettings()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.LogitechG15.LineProcess.#ctor(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#PaintRefreshingMessage()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.LogitechG15.LineProcess.#ctor(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#PaintsCharacter()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.LogitechG15.LineProcess.#ctor(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#PaintSkillCompletionMessage()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#RenderCompletionTime()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#RenderWalletBalance()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#UpdateSkillQueueFreeRoom()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.Write(System.String)\", Scope = \"member\", Target = \"lgLcdClassLibrary.LCDInterface.#Close()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.Write(System.String)\", Scope = \"member\", Target = \"lgLcdClassLibrary.LCDInterface.#DisplayBitmap(System.Byte[]&,System.UInt32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.Write(System.String)\", Scope = \"member\", Target = \"lgLcdClassLibrary.LCDInterface.#Open(System.String,System.Boolean)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.Write(System.String)\", Scope = \"member\", Target = \"lgLcdClassLibrary.LCDInterface.#ReadSoftButton(System.Int32&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Interoperability\", \"CA1400:PInvokeEntryPointsShouldExist\", Scope = \"member\", Target = \"lgLcdClassLibrary.NativeMethods.#lgLcdSetAsLCDForegroundApp(System.Int32,System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1704:IdentifiersShouldBeSpelledCorrectly\", MessageId = \"lg\", Scope = \"namespace\", Target = \"lgLcdClassLibrary\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"EVE\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"EVE\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#ShowEVETime\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"EVE\", Scope = \"namespace\", Target = \"EVEMon.LogitechG15\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"LCD\", Scope = \"type\", Target = \"lgLcdClassLibrary.LCDInterface\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"lg\", Scope = \"namespace\", Target = \"lgLcdClassLibrary\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1711:IdentifiersShouldNotHaveIncorrectSuffix\", Scope = \"type\", Target = \"lgLcdClassLibrary.ButtonDelegate\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1711:IdentifiersShouldNotHaveIncorrectSuffix\", Scope = \"type\", Target = \"lgLcdClassLibrary.ConfigureDelegate\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\", Scope = \"member\", Target = \"lgLcdClassLibrary.NativeMethods.#lgLcdSetAsLCDForegroundApp(System.Int32,System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Security\", \"CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#UpdateLcdDisplay(System.UInt32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Autocycle\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#PaintCycleSettings()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"DisplayBitmap\", Scope = \"member\", Target = \"lgLcdClassLibrary.LCDInterface.#DisplayBitmap(System.Byte[]&,System.UInt32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"ReadSoftButton\", Scope = \"member\", Target = \"lgLcdClassLibrary.LCDInterface.#ReadSoftButton(System.Int32&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA2210:AssembliesShouldHaveValidStrongNames\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1020:AvoidNamespacesWithFewTypes\", Scope = \"namespace\", Target = \"EVEMon.LogitechG15\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdInterface.#Open(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdInterface.#Close()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdInterface.#DisplayBitmap(System.Byte[]&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdInterface.#ReadSoftButton(System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.LogitechG15.LcdLine.#ctor(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#PaintsCharacter()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.LogitechG15.LcdLine.#ctor(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#PaintSkillCompletionMessage()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.LogitechG15.LcdLine.#ctor(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#PaintCharactersList()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.LogitechG15.LcdLine.#ctor(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#PaintCycleSettings()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.LogitechG15.LcdLine.#ctor(System.String,System.Drawing.Font)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#PaintRefreshingMessage()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.Write(System.String)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdInterface.#Open(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.Write(System.String)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdInterface.#Close()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.Write(System.String)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdInterface.#DisplayBitmap(System.Byte[]&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.Write(System.String)\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdInterface.#ReadSoftButton(System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"ReadSoftButton\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdInterface.#ReadSoftButton(System.Int32)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"DisplayBitmap\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdInterface.#DisplayBitmap(System.Byte[]&)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#ShowEVETime\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#ShowSystemTime\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Mobility\", \"CA1601:DoNotUseTimersThatPreventPowerStateChanges\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#.ctor()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"EVEMon.LogitechG15.LcdDisplay.#.ctor()\")]\n"
  },
  {
    "path": "src/EVEMon.LogitechG15/LcdDisplay.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Drawing.Imaging;\nusing System.Drawing.Text;\nusing System.Linq;\nusing System.Timers;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.CustomEventArgs;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Models;\nusing LogitechLcd.NET;\n\nnamespace EVEMon.LogitechG15\n{\n    internal sealed class LcdDisplay : IDisposable\n    {\n        internal const int G15Width = LogitechLcdConstants.LogiLCDMonoWidth;\n        private const int G15Height = LogitechLcdConstants.LogiLCDMonoHeight;\n        private const float G15DpiX = 46;\n        private const float G15DpiY = 46;\n\n        private static LcdDisplay s_singleInstance;\n\n        private readonly Font m_defaultFont;\n        private readonly Bitmap m_bmpLCD;\n        private readonly Bitmap m_bmpLCDX;\n        private readonly Graphics m_lcdCanvas;\n        private readonly Graphics m_lcdOverlay;\n        private readonly List<LcdLine> m_lcdLines = new List<LcdLine>();\n        private readonly object m_lock = new object();\n        private readonly Timer m_buttonPressedCheckTimer;\n        private readonly float m_defaultOffset;\n\n        private CCPCharacter m_currentCharacter;\n        private CCPCharacter m_refreshCharacter;\n        private int m_oldButtonState;\n        private DateTime m_buttonStateHld;\n        private DateTime m_paintTime;\n        private DateTime m_holdTime;\n        private LcdState m_state;\n        private DateTime m_cycleTime;\n        private DateTime m_cycleQueueInfoTime;\n        private bool m_showingCycledQueueInfo;\n        private int m_completedSkills;\n        private bool m_disposed;\n\n\n        #region Events\n\n        /// <summary>\n        /// Fired whenever a button has been pressed which require EVEMon to requery the API for the specified character.\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> ApiUpdateRequested;\n\n        /// <summary>\n        /// Fired whenever the current character changed (because of a button press).\n        /// </summary>\n        public static event EventHandler<CharacterChangedEventArgs> CurrentCharacterChanged;\n\n        /// <summary>\n        /// Fired whenever the auto cycle should change (because of a button press).\n        /// </summary>\n        public static event EventHandler<CycleEventArgs> AutoCycleChanged;\n\n        #endregion\n\n\n        #region Instantiation\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"LcdDisplay\"/> class.\n        /// </summary>\n        private LcdDisplay()\n        {\n            m_defaultFont = FontFactory.GetFont(\"Microsoft Sans Serif\", 13.5f);\n\n            m_bmpLCD = new Bitmap(G15Width, G15Height, PixelFormat.Format24bppRgb);\n            m_bmpLCD.SetResolution(G15DpiX, G15DpiY);\n            m_lcdCanvas = Graphics.FromImage(m_bmpLCD);\n            m_lcdCanvas.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;\n\n            m_bmpLCDX = new Bitmap(G15Width, G15Height, PixelFormat.Format24bppRgb);\n            m_bmpLCDX.SetResolution(G15DpiX, G15DpiY);\n            m_lcdOverlay = Graphics.FromImage(m_bmpLCDX);\n            m_lcdOverlay.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;\n\n            m_buttonStateHld = DateTime.Now;\n            m_cycleTime = DateTime.Now.AddSeconds(10);\n            m_cycleQueueInfoTime = DateTime.Now.AddSeconds(5);\n            m_showingCycledQueueInfo = false;\n\n            m_defaultOffset = Environment.Is64BitProcess ? -2f : 0f;\n\n            Cycle = false;\n            ShowSystemTime = false;\n            CycleSkillQueueTime = false;\n\n            m_buttonPressedCheckTimer = new Timer { Interval = 100 };\n            m_buttonPressedCheckTimer.Elapsed += ButtonPressedCheckTimerOnElapsed;\n            m_buttonPressedCheckTimer.Start();\n\n            LcdInterface.Open(\"EVEMon\");\n        }\n\n        /// <summary>\n        /// Instances this instance.\n        /// </summary>\n        /// <returns></returns>\n        internal static LcdDisplay Instance() => s_singleInstance ?? (s_singleInstance = new LcdDisplay());\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets or sets a value indicating whether to cycle the displayed info.\n        /// </summary>\n        /// <value><c>true</c> if set to cycle; otherwise, <c>false</c>.</value>\n        internal bool Cycle { private get; set; }\n\n        /// <summary>\n        /// Gets or sets the cycle interval.\n        /// </summary>\n        /// <value>The cycle interval.</value>\n        internal int CycleInterval { private get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether to show the system's time.\n        /// </summary>\n        /// <value><c>true</c> if set to show the system's time; otherwise, <c>false</c>.</value>\n        internal bool ShowSystemTime { private get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether to show the EVE's time.\n        /// </summary>\n        /// <value><c>true</c> if set to show the EVE's time; otherwise, <c>false</c>.</value>\n        internal bool ShowEVETime { private get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether to cycle the skill queue time.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if set to cycle skill queue time; otherwise, <c>false</c>.\n        /// </value>\n        internal bool CycleSkillQueueTime { private get; set; }\n\n        /// <summary>\n        /// Gets or sets the cycle completion interval.\n        /// </summary>\n        /// <value>The cycle completion interval.</value>\n        internal int CycleCompletionInterval { private get; set; }\n\n        /// <summary>\n        /// Gets or sets the first character to complete skill.\n        /// </summary>\n        /// <value>The first character to complete skill.</value>\n        internal CCPCharacter FirstCharacterToCompleteSkill { private get; set; }\n\n        /// <summary>\n        /// Gets or sets the current character.\n        /// </summary>\n        /// <value>The current character.</value>\n        internal CCPCharacter CurrentCharacter\n        {\n            private get { return MonitoredCharacters.Contains(m_currentCharacter) ? m_currentCharacter : null; }\n            set { m_currentCharacter = value; }\n        }\n\n        /// <summary>\n        /// Gets the monitored characters.\n        /// </summary>\n        /// <value>The characters.</value>\n        private static IEnumerable<CCPCharacter> MonitoredCharacters => EveMonClient.MonitoredCharacters.OfType<CCPCharacter>();\n\n        #endregion\n\n\n        #region Cleanup\n\n        /// <summary>\n        /// Releases unmanaged resources and performs other cleanup operations before the\n        /// <see cref=\"LcdDisplay\"/> is reclaimed by garbage collection.\n        /// </summary>\n        ~LcdDisplay()\n        {\n            Dispose(false);\n        }\n\n        /// <summary>\n        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.\n        /// </summary>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// Releases unmanaged and - optionally - managed resources\n        /// </summary>\n        /// <param name=\"isDisposing\">\n        /// <c>true</c> to release both managed and unmanaged resources;\n        /// <c>false</c> to release only unmanaged resources.\n        /// </param>\n        private void Dispose(bool isDisposing)\n        {\n            if (!m_disposed)\n            {\n                if (isDisposing || s_singleInstance != null)\n                    LcdInterface.Close();\n\n                m_buttonPressedCheckTimer.Stop();\n                m_buttonPressedCheckTimer.Dispose();\n                m_bmpLCD.Dispose();\n                m_bmpLCDX.Dispose();\n                s_singleInstance = null;\n            }\n            m_disposed = true;\n        }\n\n        #endregion\n\n\n        #region Painting\n\n        /// <summary>\n        /// Performs the repainting of the screen.\n        /// </summary>\n        internal void Paint()\n        {\n            TimeSpan test = TimeSpan.FromTicks(m_paintTime.Ticks - DateTime.Now.Ticks);\n            if (test.TotalMilliseconds > 0)\n                return;\n\n            TimeSpan now = TimeSpan.FromTicks(DateTime.Now.Ticks - m_holdTime.Ticks);\n            if (m_state == LcdState.SplashScreen && now.TotalSeconds > 4)\n                SwitchState(LcdState.Character);\n\n            if (m_state == LcdState.CharacterList && now.TotalMilliseconds > 2000)\n                SwitchState(LcdState.Character);\n\n            if (m_state == LcdState.SkillComplete && now.TotalSeconds > 14)\n                SwitchState(LcdState.Character);\n\n            if ((m_state == LcdState.CycleSettings || m_state == LcdState.Refreshing) && now.TotalSeconds > 2)\n                SwitchState(LcdState.Character);\n\n            switch (m_state)\n            {\n                case LcdState.SplashScreen:\n                    m_paintTime = m_paintTime.AddSeconds(2);\n                    PaintSplash();\n                    return;\n                case LcdState.Character:\n                    if (Cycle)\n                    {\n                        if (TimeSpan.FromTicks(DateTime.Now.Ticks - m_cycleTime.Ticks).TotalSeconds > CycleInterval)\n                        {\n                            m_cycleTime = DateTime.Now;\n                            MoveToNextChar();\n\n                            // When moving to next character\n                            // we reset the queue info timer\n                            m_cycleQueueInfoTime = DateTime.Now;\n                            m_showingCycledQueueInfo = false;\n                        }\n                    }\n                    m_paintTime = m_paintTime.AddSeconds(1);\n                    PaintsCharacter();\n                    return;\n                case LcdState.CharacterList:\n                    m_paintTime = m_paintTime.AddSeconds(2);\n                    PaintCharactersList();\n                    return;\n                case LcdState.SkillComplete:\n                    m_paintTime = m_paintTime.AddMilliseconds(800);\n                    PaintSkillCompletionMessage();\n                    return;\n                case LcdState.CycleSettings:\n                    m_paintTime = m_paintTime.AddSeconds(2);\n                    PaintCycleSettings();\n                    return;\n                case LcdState.Refreshing:\n                    if (m_refreshCharacter != null)\n                    {\n                        m_paintTime = m_paintTime.AddSeconds(2);\n                        PaintRefreshingMessage();\n                    }\n                    return;\n                default:\n                    return;\n            }\n        }\n\n        /// <summary>\n        /// Paints the current character's training informations, this is the regular painting operation.\n        /// </summary>\n        private void PaintsCharacter()\n        {\n            m_lcdLines.Clear();\n\n            if (!MonitoredCharacters.Any())\n            {\n                m_lcdLines.Add(new LcdLine(\"No CCP Characters To Display\", m_defaultFont));\n                RenderLines();\n                UpdateLcdDisplay();\n                return;\n            }\n\n            if (CycleSkillQueueTime)\n            {\n                if (TimeSpan.FromTicks(DateTime.Now.Ticks - m_cycleQueueInfoTime.Ticks).TotalSeconds > CycleCompletionInterval)\n                {\n                    m_cycleQueueInfoTime = DateTime.Now;\n                    m_showingCycledQueueInfo = !m_showingCycledQueueInfo;\n                }\n            }\n\n            if (CurrentCharacter == null)\n                return;\n\n            m_lcdLines.Add(new LcdLine(CurrentCharacter.AdornedName, m_defaultFont));\n\n            QueuedSkill queuedSkill = CurrentCharacter.SkillQueue.CurrentlyTraining;\n            if (CurrentCharacter.SkillQueue.IsTraining)\n            {\n                if (m_showingCycledQueueInfo)\n                {\n                    if (CurrentCharacter.SkillQueue.LessThanWarningThreshold)\n                    {\n                        // Place holder for skill queue training time rendering\n                        m_lcdLines.Add(new LcdLine(\" \", m_defaultFont));\n                    }\n                    else if (CurrentCharacter.SkillQueue.Count > 1)\n                    {\n                        // If more then one skill is in queue, show queue finish time\n                        string endTimeText = CurrentCharacter.SkillQueue.EndTime\n                            .Subtract(DateTime.UtcNow).ToDescriptiveText(DescriptiveTextOptions.SpaceBetween);\n                        m_lcdLines.Add(new LcdLine($\"Queue ends in {endTimeText}\", m_defaultFont));\n                    }\n                    else\n                    {\n                        // Show the skill in training\n                        m_lcdLines.Add(new LcdLine($\"{queuedSkill}\", m_defaultFont));\n                    }\n                }\n                else\n                {\n                    // Show the skill in training\n                    m_lcdLines.Add(new LcdLine($\"{queuedSkill}\", m_defaultFont));\n                }\n\n                m_lcdLines.Add(new LcdLine(queuedSkill.EndTime.Subtract(DateTime.UtcNow).ToDescriptiveText(\n                    DescriptiveTextOptions.SpaceBetween), m_defaultFont));\n            }\n            else\n            {\n                if (CurrentCharacter.SkillQueue.IsPaused)\n                {\n                    m_lcdLines.Add(new LcdLine($\"{queuedSkill}\", m_defaultFont));\n                    m_lcdLines.Add(new LcdLine(\"Skill Training Is Paused\", m_defaultFont));\n                }\n                else\n                {\n                    m_lcdLines.Add(new LcdLine(\"No Skill In Training\", m_defaultFont));\n                    m_lcdLines.Add(new LcdLine(\"Skill Queue Is Empty\", m_defaultFont));\n                }\n            }\n\n            m_lcdLines.Add(new LcdLine($\"{queuedSkill?.FractionCompleted ?? 0}\", m_defaultFont));\n\n            RenderLines();\n            RenderWalletBalance();\n            RenderSkillQueueInfo();\n            RenderCompletionTime();\n\n            UpdateLcdDisplay();\n        }\n\n        /// <summary>\n        /// Renders the lines.\n        /// </summary>\n        private void RenderLines()\n        {\n            ClearGraphics();\n\n            float offset = m_defaultOffset;\n\n            foreach (LcdLine lcdLine in m_lcdLines)\n            {\n                lcdLine.Render(m_lcdCanvas, m_lcdOverlay, offset, m_defaultOffset);\n                offset += lcdLine.Height;\n            }\n        }\n\n        /// <summary>\n        /// Renders the wallet balance.\n        /// </summary>\n        private void RenderWalletBalance()\n        {\n            decimal balance = CurrentCharacter.Balance;\n            string walletBalance = $\"{balance:N2} ISK\";\n            SizeF balanceSize = m_lcdCanvas.MeasureString(walletBalance, m_defaultFont);\n            SizeF charNameSize = m_lcdCanvas.MeasureString(CurrentCharacter.AdornedName, m_defaultFont);\n            float availableWidth = G15Width - charNameSize.Width;\n\n            if (availableWidth < balanceSize.Width)\n            {\n                walletBalance = AbbreviationFormat(balance, availableWidth);\n                balanceSize = m_lcdCanvas.MeasureString(walletBalance, m_defaultFont);\n            }\n\n            RectangleF line = new RectangleF(new PointF(G15Width - balanceSize.Width, 0f + m_defaultOffset), balanceSize);\n            using (Brush brush = new SolidBrush(Color.Black))\n            {\n                m_lcdCanvas.DrawString(walletBalance, m_defaultFont, brush, line);\n            }\n        }\n\n        /// <summary>\n        /// Renders the skill queue info.\n        /// </summary>\n        private void RenderSkillQueueInfo()\n        {\n            if (CurrentCharacter.IsTraining &&\n                CurrentCharacter.SkillQueue.LessThanWarningThreshold &&\n                m_showingCycledQueueInfo)\n            {\n                UpdateSkillQueueTrainingTime();\n            }\n        }\n\n        /// <summary>\n        /// Renders the completion time.\n        /// </summary>\n        private void RenderCompletionTime()\n        {\n            if (!CurrentCharacter.IsTraining)\n                return;\n\n            DateTime completionDateTime = CurrentCharacter.CurrentlyTrainingSkill.EndTime.ToLocalTime();\n            string completionDateTimeText = $\"{completionDateTime.ToShortDateString()}  {completionDateTime.ToShortTimeString()}\";\n            SizeF completionDateTimeSize = m_lcdCanvas.MeasureString(completionDateTimeText, m_defaultFont);\n            RectangleF timeLine = new RectangleF(new PointF(G15Width - completionDateTimeSize.Width, 22f + m_defaultOffset),\n                completionDateTimeSize);\n            using (Brush brush = new SolidBrush(Color.Black))\n            {\n                m_lcdCanvas.DrawString(completionDateTimeText, m_defaultFont, brush, timeLine);\n            }\n        }\n\n        /// <summary>\n        /// Paints a message for skill completion.\n        /// </summary>\n        private void PaintSkillCompletionMessage()\n        {\n            m_lcdLines.Clear();\n\n            if (!MonitoredCharacters.Any())\n            {\n                m_lcdLines.Add(new LcdLine(\"No CCP Characters To Display\", m_defaultFont));\n                RenderLines();\n                UpdateLcdDisplay();\n                return;\n            }\n\n            if (CurrentCharacter == null || CurrentCharacter.SkillQueue.LastCompleted == null)\n                return;\n\n            m_lcdLines.Add(new LcdLine(CurrentCharacter.AdornedName, m_defaultFont));\n            m_lcdLines.Add(new LcdLine(\"has finished training\", m_defaultFont));\n\n            m_lcdLines.Add(m_completedSkills > 1\n                ? new LcdLine($\"{m_completedSkills} skills\",\n                    m_defaultFont)\n                : new LcdLine(CurrentCharacter.SkillQueue.LastCompleted.ToString(), m_defaultFont));\n\n            int skillCount = CurrentCharacter.SkillQueue.Count;\n\n            m_lcdLines.Add(skillCount == 0\n                ? new LcdLine(\"NO SKILLS IN QUEUE\", m_defaultFont)\n                : new LcdLine($\"{skillCount} more skill{(skillCount == 1 ? string.Empty : \"s\")} in queue\", m_defaultFont));\n\n            RenderLines();\n            UpdateLcdDisplay();\n        }\n\n        /// <summary>\n        /// Paints the characters list.\n        /// </summary>\n        private void PaintCharactersList()\n        {\n            m_lcdLines.Clear();\n\n            if (!MonitoredCharacters.Any())\n            {\n                m_lcdLines.Add(new LcdLine(\"No CCP Characters To Display\", m_defaultFont));\n                RenderLines();\n                UpdateLcdDisplay();\n                return;\n            }\n\n            // Creates a reordered list with the selected character on top\n            List<CCPCharacter> charList = new List<CCPCharacter>();\n\n            int currentCharacterIndex = Math.Max(0, MonitoredCharacters.IndexOf(CurrentCharacter));\n            for (int i = currentCharacterIndex; i < MonitoredCharacters.Count(); i++)\n            {\n                charList.Add(MonitoredCharacters.ElementAt(i));\n            }\n\n            for (int i = 0; i < currentCharacterIndex; i++)\n            {\n                charList.Add(MonitoredCharacters.ElementAt(i));\n            }\n\n            // Perform the painting\n            ClearGraphics();\n\n            foreach (CCPCharacter character in charList)\n            {\n                m_lcdLines.Add(new LcdLine(character.AdornedName, m_defaultFont));\n            }\n\n            RenderLines();\n            RenderSelector();\n            UpdateLcdDisplay();\n        }\n\n        /// <summary>\n        /// Renders the selector.\n        /// </summary>\n        private void RenderSelector()\n        {\n            using (Brush brush = new SolidBrush(Color.Black))\n            {\n                m_lcdOverlay.FillRectangle(brush, 0, 0, G15Width, 11);\n            }\n        }\n\n        /// <summary>\n        /// Paints the cycling settings on the screen.\n        /// </summary>\n        private void PaintCycleSettings()\n        {\n            ClearGraphics();\n            m_lcdLines.Clear();\n\n            string status = Cycle ? \"on\" : \"off\";\n            string statusMsg = $\"Autocycle is now {status}\";\n            m_lcdLines.Add(new LcdLine(statusMsg, m_defaultFont));\n\n            string cycleMsg = $\"Cycle Time is: {CycleInterval}s\";\n            m_lcdLines.Add(new LcdLine(cycleMsg, m_defaultFont));\n\n            RenderLines();\n            UpdateLcdDisplay();\n        }\n\n        /// <summary>\n        /// Paints a waiting message while we're updating the characters.\n        /// </summary>\n        private void PaintRefreshingMessage()\n        {\n            ClearGraphics();\n            m_lcdLines.Clear();\n\n            m_lcdLines.Add(new LcdLine(\"Refreshing Character Information\", m_defaultFont));\n            m_lcdLines.Add(new LcdLine(\"of\", m_defaultFont));\n            m_lcdLines.Add(new LcdLine(m_refreshCharacter.AdornedName, m_defaultFont));\n\n            RenderLines();\n            UpdateLcdDisplay();\n        }\n\n        /// <summary>\n        /// Paints the EVEMon icon at the initialization of the LCD screen.\n        /// </summary>\n        private void PaintSplash()\n        {\n            // Clear the graphics\n            ClearGraphics();\n\n            // Load the icon\n            using (Bitmap splashLogo = new Bitmap(Properties.Resources.LCDSplash))\n            {\n                // Display the splash logo\n                int left = G15Width / 2 - splashLogo.Width / 2;\n                int top = G15Height / 2 - splashLogo.Height / 2;\n                m_lcdCanvas.DrawImage(splashLogo, new Rectangle(left, top, splashLogo.Width, splashLogo.Height));\n                UpdateLcdDisplay();\n            }\n        }\n\n        /// <summary>\n        /// Clears the graphics.\n        /// </summary>\n        private void ClearGraphics()\n        {\n            m_lcdCanvas.Clear(Color.White);\n            m_lcdOverlay.Clear(Color.White);\n        }\n\n        /// <summary>\n        /// Updates the skill queue training time info.\n        /// </summary>\n        private void UpdateSkillQueueTrainingTime()\n        {\n            TimeSpan skillQueueEndTime = CurrentCharacter.SkillQueue.EndTime.Subtract(DateTime.UtcNow);\n            TimeSpan timeLeft = SkillQueue.WarningThresholdTimeSpan.Subtract(skillQueueEndTime);\n\n            // Prevents the \"(none)\" text from being displayed\n            if (timeLeft < TimeSpan.FromSeconds(1))\n                return;\n\n            // Less than minute ? Display seconds\n            string endTimeText = skillQueueEndTime < TimeSpan.FromMinutes(1)\n                ? skillQueueEndTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas)\n                : skillQueueEndTime.ToDescriptiveText(DescriptiveTextOptions.IncludeCommas, includeSeconds: false);\n\n            string skillQueueEndTimeText = $\"Queue ends in {endTimeText}\";\n            SizeF size = m_lcdCanvas.MeasureString(skillQueueEndTimeText, m_defaultFont);\n            RectangleF line = new RectangleF(new PointF(0f, 11f + m_defaultOffset), size);\n            using (Brush brush = new SolidBrush(Color.Black))\n            {\n                m_lcdCanvas.FillRectangle(brush, line.Left, line.Top + (Environment.Is64BitProcess ? 2 : 0),\n                    G15Width, size.Height - 1);\n                m_lcdOverlay.DrawString(skillQueueEndTimeText, m_defaultFont, brush, line);\n            }\n        }\n\n        /// <summary>\n        /// Fetches the content of the <see cref=\"Graphics\"/> object to the G15 screen.\n        /// </summary>\n        private unsafe void UpdateLcdDisplay()\n        {\n            // Locking should not be necessary but i'll keep it here\n            lock (m_lock)\n            {\n                byte[] buffer = new byte[m_bmpLCD.Width * m_bmpLCD.Height];\n                Rectangle rect = new Rectangle(0, 0, m_bmpLCD.Width, m_bmpLCD.Height);\n\n                BitmapData bmData = m_bmpLCD.LockBits(rect, ImageLockMode.ReadOnly, m_bmpLCD.PixelFormat);\n                try\n                {\n                    BitmapData bmDataX = m_bmpLCDX.LockBits(rect, ImageLockMode.ReadOnly, m_bmpLCDX.PixelFormat);\n                    try\n                    {\n                        // Extract bits per pixel and length infos\n                        int bpp = bmData.Stride / m_bmpLCD.Width;\n\n                        // Copy the content of the bitmap to our buffers \n                        // Unsafe code removes the boundaries checks - a lot faster.\n                        fixed (byte* buffer0 = buffer)\n                        {\n                            byte* output = buffer0;\n                            byte* inputX = (byte*)bmDataX.Scan0.ToPointer();\n                            byte* input = (byte*)bmData.Scan0.ToPointer();\n\n                            for (int i = 0; i < m_bmpLCD.Height; i++)\n                            {\n                                for (int j = 0; j < m_bmpLCD.Width; j++)\n                                {\n                                    *output = (byte)(*input ^ *inputX);\n                                    inputX += bpp;\n                                    input += bpp;\n                                    output++;\n                                }\n                            }\n                        }\n                    }\n                    finally\n                    {\n                        m_bmpLCDX.UnlockBits(bmDataX);\n                    }\n                }\n                finally\n                {\n                    m_bmpLCD.UnlockBits(bmData);\n                }\n\n                // Fetches the buffer to the LCD screen\n                LcdInterface.DisplayBitmap(buffer);\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Formats the wallet balance value in an abbreviation form.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"width\"></param>\n        /// <returns>Abbreviated balance value</returns>\n        private string AbbreviationFormat(decimal value, float width)\n        {\n            string balance;\n            int suffixIndex = 0;\n            float newWidth;\n\n            do\n            {\n                value /= 1000M;\n                suffixIndex++;\n\n                switch (suffixIndex)\n                {\n                    case 1:\n                        balance = $\"{value:N2} K ISK\";\n                        break;\n                    case 2:\n                        balance = $\"{value:N2} M ISK\";\n                        break;\n                    case 3:\n                        balance = $\"{value:N2} B ISK\";\n                        break;\n                    // We have no room to show the wallet balance\n                    default:\n                        balance = string.Empty;\n                        break;\n                }\n\n                SizeF size = m_lcdCanvas.MeasureString(balance, m_defaultFont);\n                newWidth = size.Width;\n            } while (newWidth > width);\n\n            return balance;\n        }\n\n        #endregion\n\n\n        #region Controlling logic\n\n        /// <summary>\n        /// Occurs when some of the G15 screen buttons are pressed.\n        /// </summary>\n        /// <returns></returns>\n        private void ButtonPressedCheckTimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs)\n        {\n            var pressedButtons = 0;\n\n            if (LcdInterface.ReadSoftButton((int)LogitechLcdConstants.LogiLcdMonoButton.Button0))\n                pressedButtons |= (int)LogitechLcdConstants.LogiLcdMonoButton.Button0;\n\n            if (LcdInterface.ReadSoftButton((int)LogitechLcdConstants.LogiLcdMonoButton.Button1))\n                pressedButtons |= (int)LogitechLcdConstants.LogiLcdMonoButton.Button1;\n\n            if (LcdInterface.ReadSoftButton((int)LogitechLcdConstants.LogiLcdMonoButton.Button2))\n                pressedButtons |= (int)LogitechLcdConstants.LogiLcdMonoButton.Button2;\n\n            if (LcdInterface.ReadSoftButton((int)LogitechLcdConstants.LogiLcdMonoButton.Button3))\n                pressedButtons |= (int)LogitechLcdConstants.LogiLcdMonoButton.Button3;\n\n            if (m_oldButtonState == pressedButtons)\n                return;\n\n            // Gets all buttons who haven't been pressed last time\n            int press = (m_oldButtonState ^ pressedButtons) & pressedButtons;\n\n            // Displays the characters' list or move to the next char if the list is already displayed.\n            if ((press & (int)LogitechLcdConstants.LogiLcdMonoButton.Button0) != 0)\n                DisplayCharactersList();\n\n            // Move to the first character to complete his training\n            if ((press & (int)LogitechLcdConstants.LogiLcdMonoButton.Button1) != 0)\n            {\n                // Select next skill ready char\n                if (!MonitoredCharacters.Any())\n                    return;\n\n                CurrentCharacter = FirstCharacterToCompleteSkill;\n\n                AutoCycleChanged?.ThreadSafeInvoke(this, new CycleEventArgs(false));\n\n                SwitchState(LcdState.Character);\n            }\n\n            // Forces a refresh from CCP\n            if ((press & (int)LogitechLcdConstants.LogiLcdMonoButton.Button2) != 0)\n            {\n                if (m_state == LcdState.Character || m_state == LcdState.CharacterList)\n                {\n                    m_refreshCharacter = CurrentCharacter;\n                    ApiUpdateRequested?.ThreadSafeInvoke(this, new CharacterChangedEventArgs(m_refreshCharacter));\n\n                    SwitchState(LcdState.Refreshing);\n                }\n            }\n\n            // Switch autocycle ON/OFF\n            if ((press & (int)LogitechLcdConstants.LogiLcdMonoButton.Button3) != 0)\n            {\n                // Switch autocycle on/off\n                SwitchCycle();\n\n                AutoCycleChanged?.ThreadSafeInvoke(this, new CycleEventArgs(Cycle));\n\n                SwitchState(LcdState.CycleSettings);\n                m_cycleTime = DateTime.Now;\n            }\n\n            m_oldButtonState = pressedButtons;\n        }\n\n        /// <summary>\n        /// Moves the selection to the next character.\n        /// </summary>\n        private void MoveToNextChar()\n        {\n            if (!MonitoredCharacters.Any())\n                return;\n\n            // Move to next char\n            int index = MonitoredCharacters.IndexOf(CurrentCharacter);\n            if (++index >= MonitoredCharacters.Count())\n                index = 0;\n\n            CurrentCharacter = MonitoredCharacters.ElementAt(index);\n\n            // Requests new data\n            CurrentCharacterChanged?.ThreadSafeInvoke(this, new CharacterChangedEventArgs(CurrentCharacter));\n        }\n\n        /// <summary>\n        /// Switches the state and updates some of the internal times variables.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        internal void SwitchState(LcdState state)\n        {\n            m_state = state;\n            m_paintTime = DateTime.Now;\n            m_holdTime = DateTime.Now;\n        }\n\n        /// <summary>\n        /// Updates the characters' list.\n        /// First call displays the list, the second one moves the selection\n        /// </summary>\n        private void DisplayCharactersList()\n        {\n            TimeSpan now = TimeSpan.FromTicks(DateTime.Now.Ticks - m_buttonStateHld.Ticks);\n            m_buttonStateHld = DateTime.Now;\n\n            if (now.TotalMilliseconds < 2000)\n            {\n                Cycle = false;\n                MoveToNextChar();\n            }\n\n            SwitchState(LcdState.CharacterList);\n        }\n\n        /// <summary>\n        /// On skill completion, switch to the display of the proper message.\n        /// </summary>\n        internal void SkillCompleted(Character character, int skillCount)\n        {\n            CurrentCharacter = character as CCPCharacter;\n            m_completedSkills = skillCount;\n            SwitchState(LcdState.SkillComplete);\n        }\n\n        /// <summary>\n        /// Switches the cycling setting.\n        /// </summary>\n        private void SwitchCycle()\n        {\n            Cycle = !Cycle;\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.LogitechG15/LcdInterface.cs",
    "content": "using System;\nusing LogitechLcd.NET;\n\nnamespace EVEMon.LogitechG15\n{\n    internal static class LcdInterface\n    {\n        private static bool s_isAvailable;\n        private static bool s_lcdInterfaceInitialized;\n        private static bool s_result;\n        private static string s_appName;\n\n        private static readonly ILogitechLcd s_lgLcd = LogitechLcd.NET.LogitechLcd.Instance;\n\n\n        #region Internal Methods\n\n        /// <summary>\n        /// Opens the LCD with the specified application name.\n        /// </summary>\n        /// <param name=\"appName\">Name of the app.</param>\n        /// <returns></returns>\n        internal static void Open(string appName)\n        {\n            s_appName = appName;\n            Open();\n        }\n\n        /// <summary>\n        /// Opens the LCD.\n        /// </summary>\n        private static void Open()\n        {\n            try\n            {\n                if (s_isAvailable)\n                    return;\n\n                // Initialize interface to LCD library if needed\n                if (!s_lcdInterfaceInitialized)\n                {\n                    // Initialize the library\n                    s_result = s_lgLcd.Init(s_appName, (int)LogitechLcdConstants.LogiLcdType.LogiLCDTypeMono);\n\n                    // Is an LCD available?\n                    if (!s_result)\n                        return;\n\n                    s_lcdInterfaceInitialized = true;\n                }\n\n                s_result = s_lgLcd.IsConnected((int)LogitechLcdConstants.LogiLcdType.LogiLCDTypeMono);\n\n                if (s_result)\n                    s_isAvailable = true;\n                else\n                    s_lgLcd.Shutdown();\n            }\n            catch (Exception ex)\n            {\n                // This might happen for a number of reasons .. most likely missing the lgLcd library (LogitechLcd.x##.dll)\n                Console.Write(@\"Open Caught Exception: \");\n                Console.WriteLine(ex.Message);\n                s_lgLcd.Shutdown();\n            }\n        }\n\n        /// <summary>\n        /// Closes the LCD.\n        /// </summary>\n        /// <returns></returns>\n        internal static void Close()\n        {\n            try\n            {\n                s_isAvailable = false;\n                s_lcdInterfaceInitialized = false;\n                s_lgLcd.Shutdown();\n            }\n            catch (Exception ex)\n            {\n                // This might happen for a number of reasons .. most likely missing the lgLcd library (LogitechLcd.x##.dll)\n                Console.Write(@\"Close Caught Exception: \");\n                Console.WriteLine(ex.Message);\n            }\n        }\n\n        /// <summary>\n        /// Displays the bitmap on the LCD screen.\n        /// </summary>\n        /// <param name=\"sampleBitmap\">The sampleBitmap.</param>\n        /// <returns></returns>\n        internal static void DisplayBitmap(byte[] sampleBitmap)\n        {\n            try\n            {\n                // Initialize if not done yet\n                if (!s_lcdInterfaceInitialized || !s_isAvailable)\n                    Open(s_appName);\n\n                // Is an LCD available?\n                if (!s_lcdInterfaceInitialized)\n                    return;\n\n                // Is an LCD available?\n                if (!s_isAvailable)\n                {\n                    Close();\n                    return;\n                }\n\n                // Display bitmap if LCD is found\n                s_lgLcd.MonoSetBackground(sampleBitmap);\n                s_lgLcd.Update();\n            }\n            catch (Exception ex)\n            {\n                // This might happen for a number of reasons .. most likely missing the lgLcd library (LogitechLcd.x##.dll)\n                Console.Write(@\"DisplayBitmap Caught Exception: \");\n                Console.WriteLine(ex.Message);\n                Close();\n            }\n        }\n\n        /// <summary>\n        /// Reads the soft button.\n        /// </summary>\n        /// <param name=\"button\">The button.</param>\n        /// <returns></returns>\n        internal static bool ReadSoftButton(int button)\n        {\n            try\n            {\n                // Has the LCD been disconnected?\n                if (!s_isAvailable)\n                    return false;\n\n                s_result = s_lgLcd.IsButtonPressed(button);\n            }\n            catch (Exception ex)\n            {\n                // This might happen for a number of reasons .. most likely missing the lgLcd library (LogitechLcd.x##.dll)\n                Console.Write(@\"ReadSoftButton Caught Exception: \");\n                Console.WriteLine(ex.Message);\n                Close();\n            }\n            return s_result;\n        }\n\n        #endregion\n\n    }\n}"
  },
  {
    "path": "src/EVEMon.LogitechG15/LcdLine.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing EVEMon.Common;\nusing EVEMon.Common.Factories;\n\nnamespace EVEMon.LogitechG15\n{\n    internal sealed class LcdLine\n    {\n        private readonly string m_text;\n        private readonly Font m_font;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"LcdLine\"/> class.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        /// <param name=\"font\">The font.</param>\n        internal LcdLine(string text, Font font)\n        {\n            m_text = text;\n            m_font = font;\n        }\n\n        #endregion\n\n\n        #region Methods\n\n        /// <summary>\n        /// Gets or sets the height.\n        /// </summary>\n        /// <value>The height.</value>\n        internal float Height { get; private set; }\n\n        /// <summary>\n        /// Renders the specified canvas.\n        /// </summary>\n        /// <param name=\"canvas\">The canvas.</param>\n        /// <param name=\"overlay\">The overlay.</param>\n        /// <param name=\"offset\">The offset.</param>\n        /// <param name=\"defaultOffset\">The default offset.</param>\n        internal void Render(Graphics canvas, Graphics overlay, float offset, float defaultOffset)\n        {\n            double percentage;\n            // Values are serialized using current culture so should be parsed using current\n            // culture\n            if (double.TryParse(m_text, out percentage))\n                RenderProgressLine(canvas, overlay, offset, defaultOffset, percentage);\n            else\n                RenderTextLine(canvas, offset);\n        }\n\n        /// <summary>\n        /// Renders the text line.\n        /// </summary>\n        /// <param name=\"canvas\">The canvas.</param>\n        /// <param name=\"offset\">The offset.</param>\n        private void RenderTextLine(Graphics canvas, float offset)\n        {\n            RectangleF lineRect = new RectangleF(new PointF(0f, offset), canvas.MeasureString(m_text, m_font));\n            using (Brush brush = new SolidBrush(Color.Black))\n            {\n                canvas.DrawString(m_text, m_font, brush, lineRect);\n            }\n\n            Height = lineRect.Height;\n        }\n\n        /// <summary>\n        /// Renders the progress line.\n        /// </summary>\n        /// <param name=\"canvas\">The canvas.</param>\n        /// <param name=\"overlay\">The overlay.</param>\n        /// <param name=\"offset\">The offset.</param>\n        /// <param name=\"defaultOffset\">The default offset.</param>\n        /// <param name=\"percentage\">The percentage.</param>\n        private void RenderProgressLine(Graphics canvas, Graphics overlay, float offset, float defaultOffset, double percentage)\n        {\n            int left = 0;\n            int width = LcdDisplay.G15Width - 1;\n            const int Pad = 2;\n\n            if (Settings.G15.ShowEVETime)\n            {\n                string eveTime = EveMonClient.EVEServer.ServerDateTime.ToShortTimeString();\n                SizeF eveTimeSize = canvas.MeasureString(eveTime, m_font);\n                RectangleF eveTimeRect = new RectangleF(new PointF(left, offset), eveTimeSize);\n                left = (int)eveTimeSize.Width + Pad;\n                width -= left;\n                using (Brush brush = new SolidBrush(Color.Black))\n                {\n                    canvas.DrawString(eveTime, m_font, brush, eveTimeRect);\n                }\n            }\n\n            if (Settings.G15.ShowSystemTime)\n            {\n                string systemTime = DateTime.Now.ToShortTimeString();\n                SizeF systemTimeSize = canvas.MeasureString(systemTime, m_font);\n                RectangleF systemTimeRect = new RectangleF(new PointF(LcdDisplay.G15Width + 1 - systemTimeSize.Width, offset),\n                    systemTimeSize);\n                width -= (int)systemTimeSize.Width + Pad;\n                using (Brush brush = new SolidBrush(Color.Black))\n                {\n                    canvas.DrawString(systemTime, m_font, brush, systemTimeRect);\n                }\n            }\n\n            string text = $\"{percentage:P2}\";\n            SizeF textSize = canvas.MeasureString(text, m_font);\n            RectangleF barRect = new RectangleF(left, offset - defaultOffset - (Environment.Is64BitProcess ? 0 : 1),\n                width, textSize.Height - 1);\n            float textLeft = (barRect.Width - textSize.Width) / 2;\n            RectangleF textRect = new RectangleF(new PointF(left + textLeft, offset), textSize);\n\n            int barFill = Convert.ToInt16(percentage * width - Pad);\n\n            using (Pen pen = new Pen(Color.Black))\n            {\n                canvas.DrawRectangle(pen, barRect.Left, barRect.Top, barRect.Width, barRect.Height);\n            }\n\n            using (Brush brush = new SolidBrush(Color.Black))\n            {\n                var progressFont = FontFactory.GetFont(m_font.FontFamily, m_font.Size);\n                canvas.FillRectangle(brush, barRect.Left + 1, barRect.Top + 1, barFill, barRect.Height - Pad);\n                overlay.DrawString(text, progressFont, brush, textRect);\n            }\n\n            Height = barRect.Height + 1;\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.LogitechG15/LcdState.cs",
    "content": "﻿namespace EVEMon.LogitechG15\n{\n    internal enum LcdState\n    {\n        SplashScreen = 0,\n        CharacterList = 1,\n        SkillComplete = 2,\n        Character = 3,\n        CycleSettings = 4,\n        Refreshing = 5\n    }\n}"
  },
  {
    "path": "src/EVEMon.LogitechG15/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// Note: Shared assembly information is specified in SharedAssemblyInfo.cs\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"EVEMon.LogitechG15\")]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"e910b4d6-3a95-4484-8084-bee973f2ef89\")]\n"
  },
  {
    "path": "src/EVEMon.LogitechG15/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.LogitechG15.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.LogitechG15.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap LCDSplash {\n            get {\n                object obj = ResourceManager.GetObject(\"LCDSplash\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.LogitechG15/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"LCDSplash\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\LCDSplash.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.LogitechG15/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-10.0.0.0\" newVersion=\"10.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.36.0.0\" newVersion=\"1.36.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis.Core\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.42.0.0\" newVersion=\"1.42.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n<startup><supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\" /></startup></configuration>\n"
  },
  {
    "path": "src/EVEMon.PieChart/AngleChangeEventArgs.cs",
    "content": "using System;\n\nnamespace EVEMon.PieChart\n{\n    public class AngleChangeEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"AngleChangeEventArgs\"/> class.\n        /// </summary>\n        /// <param name=\"oldValue\">The old value.</param>\n        /// <param name=\"newValue\">The new value.</param>\n        public AngleChangeEventArgs(float oldValue, float newValue)\n        {\n            OldAngle = oldValue;\n            NewAngle = newValue;\n        }\n\n        /// <summary>\n        /// Gets the new angle.\n        /// </summary>\n        /// <value>\n        /// The new angle.\n        /// </value>\n        public float NewAngle { get; private set; }\n\n        /// <summary>\n        /// Gets the old angle.\n        /// </summary>\n        /// <value>\n        /// The old angle.\n        /// </value>\n        public float OldAngle { get; private set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.PieChart/ColorUtil.cs",
    "content": "using System;\nusing System.Diagnostics;\nusing System.Drawing;\n\nnamespace EVEMon.PieChart\n{\n    /// <summary>\n    ///   Color utility structure.\n    /// </summary>\n    public struct ColorUtil\n    {\n        /// <summary>\n        ///   Small brightness change factor.\n        /// </summary>\n        public const float BrightnessEnhancementFactor1 = 0.3F;\n\n        /// <summary>\n        ///   Large brightness change factor.\n        /// </summary>\n        public const float BrightnessEnhancementFactor2 = 0.5F;\n\n        /// <summary>\n        ///   Creates color with corrected lightness.\n        /// </summary>\n        /// <param name=\"color\">\n        ///   Color to correct.\n        /// </param>\n        /// <param name=\"correctionFactor\">\n        ///   Correction factor, with a value between -1 and 1. Negative values\n        ///   create darker color, positive values lighter color. Zero value\n        ///   returns the current color.\n        /// </param>\n        /// <returns>\n        ///   Corrected <c>Color</c> structure.\n        /// </returns>\n        public static Color CreateColorWithCorrectedLightness(Color color, float correctionFactor)\n        {\n            Debug.Assert(correctionFactor <= 1 && correctionFactor >= -1);\n            if (Math.Abs(correctionFactor) < float.Epsilon)\n                return color;\n            float red = color.R;\n            float green = color.G;\n            float blue = color.B;\n            if (correctionFactor < 0)\n            {\n                correctionFactor = 1 + correctionFactor;\n                red *= correctionFactor;\n                green *= correctionFactor;\n                blue *= correctionFactor;\n            }\n            else\n            {\n                red = (255 - red) * correctionFactor + red;\n                green = (255 - green) * correctionFactor + green;\n                blue = (255 - blue) * correctionFactor + blue;\n            }\n            return Color.FromArgb(color.A, (int)red, (int)green, (int)blue);\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.PieChart/EVEMon.PieChart.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{696E929A-6A4A-4C6D-A8B2-C4F25F781940}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>EVEMon.PieChart</RootNamespace>\n    <AssemblyName>EVEMon.PieChart</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\n    <DebugType>full</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <DefineConstants>DEBUG</DefineConstants>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>none</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\">\n      <Name>System</Name>\n    </Reference>\n    <Reference Include=\"System.Drawing\">\n      <Name>System.Drawing</Name>\n    </Reference>\n    <Reference Include=\"System.Windows.Forms\">\n      <Name>System.Windows.Forms</Name>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\..\\SharedAssemblyInfo.cs\">\n      <Link>Properties\\SharedAssemblyInfo.cs</Link>\n    </Compile>\n    <Compile Include=\"AngleChangeEventArgs.cs\" />\n    <Compile Include=\"ColorUtil.cs\" />\n    <Compile Include=\"EdgeColor.cs\" />\n    <Compile Include=\"GlobalSuppressions.cs\" />\n    <Compile Include=\"GraphicsUtil.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"PieChart.cs\" />\n    <Compile Include=\"PieChartControl.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"PieSlice.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Quadrilateral.cs\" />\n    <Compile Include=\"SkillsPieChart.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"SkillsPieChart.Designer.cs\">\n      <DependentUpon>SkillsPieChart.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Enumerations.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"SkillsPieChart.resx\">\n      <DependentUpon>SkillsPieChart.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\EVEMon.Common\\EVEMon.Common.csproj\">\n      <Project>{C0665275-3E0B-4117-81B0-751206ED03CD}</Project>\n      <Name>EVEMon.Common</Name>\n      <Private>False</Private>\n      <Properties>SkipValidatePackageReferences=true</Properties>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"app.config\">\n      <SubType>Designer</SubType>\n    </None>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "src/EVEMon.PieChart/EdgeColor.cs",
    "content": "using System.Diagnostics;\nusing System.Drawing;\n\nnamespace EVEMon.PieChart\n{\n    /// <summary>\n    ///   Structure representing edge color used for rendering.\n    /// </summary>\n    public struct EdgeColor\n    {\n        /// <summary>\n        ///   Gets the actual color used for rendering.\n        /// </summary>\n        public static Color GetRenderingColor(EdgeColorType edgeColorType, Color color)\n        {\n            Debug.Assert(color != Color.Empty);\n            if (edgeColorType == EdgeColorType.Contrast || edgeColorType == EdgeColorType.EnhancedContrast)\n                edgeColorType = GetContrastColorType(color, edgeColorType);\n            float correctionFactor = 0;\n            switch (edgeColorType)\n            {\n                case EdgeColorType.SystemColor:\n                    return SystemColors.WindowText;\n                case EdgeColorType.SurfaceColor:\n                    return color;\n                case EdgeColorType.FullContrast:\n                    return GetFullContrastColor(color);\n                case EdgeColorType.DarkerThanSurface:\n                    correctionFactor = -ColorUtil.BrightnessEnhancementFactor1;\n                    break;\n                case EdgeColorType.DarkerDarkerThanSurface:\n                    correctionFactor = -ColorUtil.BrightnessEnhancementFactor2;\n                    break;\n                case EdgeColorType.LighterThanSurface:\n                    correctionFactor = +ColorUtil.BrightnessEnhancementFactor1;\n                    break;\n                case EdgeColorType.LighterLighterThanSurface:\n                    correctionFactor = +ColorUtil.BrightnessEnhancementFactor2;\n                    break;\n                case EdgeColorType.NoEdge:\n                    return Color.Transparent;\n            }\n            return ColorUtil.CreateColorWithCorrectedLightness(color, correctionFactor);\n        }\n\n        /// <summary>\n        /// Gets the type of the contrast color.\n        /// </summary>\n        /// <param name=\"color\">The color.</param>\n        /// <param name=\"colorType\">Type of the color.</param>\n        /// <returns></returns>\n        private static EdgeColorType GetContrastColorType(Color color, EdgeColorType colorType)\n        {\n            Debug.Assert(colorType == EdgeColorType.Contrast || colorType == EdgeColorType.EnhancedContrast);\n            if (color.GetBrightness() > BrightnessThreshold)\n            {\n                return colorType == EdgeColorType.Contrast\n                    ? EdgeColorType.DarkerThanSurface\n                    : EdgeColorType.DarkerDarkerThanSurface;\n            }\n\n            return colorType == EdgeColorType.Contrast\n                ? EdgeColorType.LighterThanSurface\n                : EdgeColorType.LighterLighterThanSurface;\n        }\n\n        /// <summary>\n        /// Gets the full color of the contrast.\n        /// </summary>\n        /// <param name=\"color\">The color.</param>\n        /// <returns></returns>\n        private static Color GetFullContrastColor(Color color)\n            => color.GetBrightness() > BrightnessThreshold ? Color.Black : Color.White;\n\n        private const float BrightnessThreshold = 0.4F;\n    }\n}"
  },
  {
    "path": "src/EVEMon.PieChart/Enumerations.cs",
    "content": "namespace EVEMon.PieChart\n{\n    /// <summary>\n    ///   Enumeration for different shadow styles\n    /// </summary>\n    public enum ShadowStyle\n    {\n        /// <summary>\n        ///   No shadow. Sides are drawn in the same color as the top od the \n        ///   pie.\n        /// </summary>\n        NoShadow,\n\n        /// <summary>\n        ///   Uniform shadow. Sides are drawn somewhat darker.\n        /// </summary>\n        UniformShadow,\n\n        /// <summary>\n        ///   Gradual shadow is used to fully simulate 3-D shadow.\n        /// </summary>\n        GradualShadow\n    }\n\n    /// <summary>\n    ///   Enumeration for edge color types.\n    /// </summary>\n    public enum EdgeColorType\n    {\n        /// <summary>\n        ///   Edges are not drawn at all.\n        /// </summary>\n        NoEdge,\n\n        /// <summary>\n        ///   System (window text) color is used to draw edges.\n        /// </summary>\n        SystemColor,\n\n        /// <summary>\n        ///   Surface color is used for edges.\n        /// </summary>\n        SurfaceColor,\n\n        /// <summary>\n        ///   A color that is little darker than surface color is used for\n        ///   edges.\n        /// </summary>\n        DarkerThanSurface,\n\n        /// <summary>\n        ///   A color that is significantly darker than surface color is used \n        ///   for edges.\n        /// </summary>\n        DarkerDarkerThanSurface,\n\n        /// <summary>\n        ///   A color that is little lighter than surface color is used for\n        ///   edges.\n        /// </summary>\n        LighterThanSurface,\n\n        /// <summary>\n        ///   A color that is significantly lighter than surface color is used \n        ///   for edges.\n        /// </summary>\n        LighterLighterThanSurface,\n\n        /// <summary>\n        ///   Contrast color is used for edges.\n        /// </summary>\n        Contrast,\n\n        /// <summary>\n        ///   Enhanced contrast color is used for edges.\n        /// </summary>\n        EnhancedContrast,\n\n        /// <summary>\n        ///   Black color is used for light surfaces and white for dark \n        ///   surfaces.\n        /// </summary>\n        FullContrast\n    }\n}"
  },
  {
    "path": "src/EVEMon.PieChart/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage \n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given \n// a specific target and scoped to a namespace, type, member, etc.\n//\n// To add a suppression to this file, right-click the message in the \n// Error List, point to \"Suppress Message(s)\", and click \n// \"In Project Suppression File\".\n// You do not need to add suppressions to this file manually.\n\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1014:MarkAssembliesWithClsCompliant\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.PieChart.SkillsPieChart.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.FileDialog.set_Filter(System.String)\", Scope = \"member\", Target = \"EVEMon.PieChart.SkillsPieChart.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.PieChart.SkillsPieChart.#OnLoad(System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1704:IdentifiersShouldBeSpelledCorrectly\", MessageId = \"Util\", Scope = \"type\", Target = \"EVEMon.PieChart.ColorUtil\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1704:IdentifiersShouldBeSpelledCorrectly\", MessageId = \"Util\", Scope = \"type\", Target = \"EVEMon.PieChart.GraphicsUtil\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"EVE\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"EVE\", Scope = \"namespace\", Target = \"EVEMon.PieChart\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1815:OverrideEqualsAndOperatorEqualsOnValueTypes\", Scope = \"type\", Target = \"EVEMon.PieChart.ColorUtil\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1815:OverrideEqualsAndOperatorEqualsOnValueTypes\", Scope = \"type\", Target = \"EVEMon.PieChart.EdgeColor\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\", \"CA1815:OverrideEqualsAndOperatorEqualsOnValueTypes\", Scope = \"type\", Target = \"EVEMon.PieChart.GraphicsUtil\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"png\", Scope = \"member\", Target = \"EVEMon.PieChart.SkillsPieChart.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Skillgroup\", Scope = \"member\", Target = \"EVEMon.PieChart.SkillsPieChart.#OnLoad(System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Skillpoints\", Scope = \"member\", Target = \"EVEMon.PieChart.SkillsPieChart.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"SkillsPieChart\", Scope = \"member\", Target = \"EVEMon.PieChart.SkillsPieChart.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA2210:AssembliesShouldHaveValidStrongNames\")]\n"
  },
  {
    "path": "src/EVEMon.PieChart/GraphicsUtil.cs",
    "content": "using System.Drawing;\n\nnamespace EVEMon.PieChart\n{\n    /// <summary>\n    ///   Structure with graphics utility methods.\n    /// </summary>\n    public struct GraphicsUtil\n    {\n        /// <summary>\n        ///   Checks if point is contained within <c>RectangleF</c> structure \n        ///   and extends rectangle bounds if neccessary to include the point.\n        /// </summary>\n        /// <param name=\"rect\">\n        ///   Reference to <c>RectangleF</c> to check.\n        /// </param>\n        /// <param name=\"pointToInclude\">\n        ///   <c>PontF</c> object to include.\n        /// </param>\n        public static RectangleF IncludePoint(RectangleF rect, PointF pointToInclude)\n        {\n            rect = IncludePointX(rect, pointToInclude.X);\n            rect = IncludePointY(rect, pointToInclude.Y);\n            return rect;\n        }\n\n        /// <summary>\n        ///   Checks if x-coordinate is contained within the <c>RectangleF</c> \n        ///   structure and extends rectangle bounds if neccessary to include \n        ///   the point.\n        /// </summary>\n        /// <param name=\"rect\">\n        ///   <c>RectangleF</c> to check.\n        /// </param>\n        /// <param name=\"pointXToInclude\">\n        ///   x-coordinate to include.\n        /// </param>\n        public static RectangleF IncludePointX(RectangleF rect, float pointXToInclude)\n        {\n            if (pointXToInclude < rect.X)\n            {\n                rect.Width = rect.Right - pointXToInclude;\n                rect.X = pointXToInclude;\n            }\n            else if (pointXToInclude > rect.Right)\n                rect.Width = pointXToInclude - rect.X;\n\n            return rect;\n        }\n\n        /// <summary>\n        ///   Checks if y-coordinate is contained within the <c>RectangleF</c> \n        ///   structure and extends rectangle bounds if neccessary to include \n        ///   the point.\n        /// </summary>\n        /// <param name=\"rect\">\n        ///   <c>RectangleF</c> to check.\n        /// </param>\n        /// <param name=\"pointYToInclude\">\n        ///   y-coordinate to include.\n        /// </param>\n        public static RectangleF IncludePointY(RectangleF rect, float pointYToInclude)\n        {\n            if (pointYToInclude < rect.Y)\n            {\n                rect.Height = rect.Bottom - pointYToInclude;\n                rect.Y = pointYToInclude;\n            }\n            else if (pointYToInclude > rect.Bottom)\n                rect.Height = pointYToInclude - rect.Y;\n\n            return rect;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.PieChart/PieChart.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.Linq;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.PieChart\n{\n    /// <summary>\n    ///   Object representing a pie chart.\n    /// </summary>\n    public sealed class PieChart3D : IDisposable\n    {\n        /// <summary>\n        ///   Slice relative height.\n        /// </summary>\n        private float m_sliceRelativeHeight;\n\n        /// <summary>\n        ///   Initial angle from which chart is drawn.\n        /// </summary>\n        private float m_initialAngle;\n\n        /// <summary>\n        ///   Array of ordered pie slices constituting the chart, starting from \n        ///   270 degrees axis.\n        /// </summary>\n        private PieSlice[] m_pieSlices;\n\n        /// <summary>\n        ///   Collection of reordered pie slices mapped to original order.\n        /// </summary>\n        private readonly ArrayList m_pieSlicesMapping = new ArrayList();\n\n        /// <summary>\n        ///   Array of values to be presented by the chart.\n        /// </summary>\n        private decimal[] m_values;\n\n        /// <summary>\n        ///   Array of colors used for individual pie slices.\n        /// </summary>\n        private readonly Color[] m_colors;\n\n        /// <summary>\n        ///   Array of texts displayed by slices.\n        /// </summary>\n        private readonly string[] m_texts;\n\n        /// <summary>\n        ///  Font used by the chart.\n        /// </summary>\n        private Font m_font;\n\n        /// <summary>\n        ///  ForeColor used by the chart.\n        /// </summary>\n        private Color m_foreColor;\n\n        /// <summary>\n        /// \n        /// </summary>\n        private EdgeColorType m_edgeColorType;\n\n        /// <summary>\n        /// \n        /// </summary>\n        private ShadowStyle m_shadowStyle;\n\n        /// <summary>\n        /// \n        /// </summary>\n        private float m_edgeLineWidth;\n\n        /// <summary>\n        ///   Array of relative displacements from the common center.\n        /// </summary>\n        private float[] m_sliceRelativeDisplacements;\n\n        /// <summary>\n        ///   Index of the currently highlighted pie slice.\n        /// </summary>\n        private int m_highlightedIndex = -1;\n\n        /// <summary>\n        ///    \n        /// </summary>\n        private bool m_fitToBoundingRectangle;\n\n        /// <summary>\n        ///   The width of the bounding rectangle.\n        /// </summary>\n        private float m_width;\n\n        /// <summary>\n        ///   The height of the bounding rectangle.\n        /// </summary>\n        private float m_height;\n\n        /// <summary>\n        ///   The y-coordinate of the bounding rectangle top edge.\n        /// </summary>\n        private float m_top;\n\n        /// <summary>\n        ///  The x-coordinate of the bounding rectangle left edge.\n        /// </summary>\n        private float m_left;\n\n        /// <summary>\n        ///   Flag indicating if object has been disposed.\n        /// </summary>\n        private bool m_disposed;\n\n        /// <summary>\n        ///   Initializes an empty instance of <c>PieChart3D</c>.\n        /// </summary>\n        private PieChart3D()\n        {\n            m_fitToBoundingRectangle = true;\n            m_shadowStyle = ShadowStyle.NoShadow;\n            m_colors = new[]\n            {\n                Color.Red,\n                Color.Green,\n                Color.Blue,\n                Color.Yellow,\n                Color.Purple,\n                Color.Olive,\n                Color.Navy,\n                Color.Aqua,\n                Color.Lime,\n                Color.Maroon,\n                Color.Teal,\n                Color.Fuchsia\n            };\n            m_font = System.Windows.Forms.Control.DefaultFont;\n            m_foreColor = SystemColors.WindowText;\n            m_edgeColorType = EdgeColorType.SystemColor;\n            m_edgeLineWidth = 1F;\n        }\n\n        /// <summary>\n        ///   Initializes an instance of a flat <c>PieChart3D</c> with \n        ///   specified bounds, values to chart and relative thickness.\n        /// </summary>\n        /// <param name=\"boundingRectX\">\n        ///   x-coordinate of the upper-left corner of the rectangle that \n        ///   bounds the chart.\n        /// </param>\n        /// <param name=\"boundingRectY\">\n        ///   y-coordinate of the upper-left corner of the rectangle that \n        ///   bounds the chart.\n        /// </param>\n        /// <param name=\"boundingRectWidth\">\n        ///   Width of the rectangle that bounds the chart.\n        /// </param>\n        /// <param name=\"boundingRectHeight\">\n        ///   Height of the rectangle that bounds the chart.\n        /// </param>\n        /// <param name=\"values\">\n        ///   An array of <c>decimal</c> values to chart.\n        /// </param>\n        public PieChart3D(float boundingRectX, float boundingRectY, float boundingRectWidth, float boundingRectHeight,\n            decimal[] values)\n            : this()\n        {\n            m_left = boundingRectX;\n            m_top = boundingRectY;\n            m_width = boundingRectWidth;\n            m_height = boundingRectHeight;\n            Values(values);\n        }\n\n        /// <summary>\n        ///   Initializes an instance of <c>PieChart3D</c> with specified \n        ///   bounds, values to chart and relative thickness.\n        /// </summary>\n        /// <param name=\"boundingRectX\">\n        ///   x-coordinate of the upper-left corner of the rectangle bounding \n        ///   the chart.\n        /// </param>\n        /// <param name=\"boundingRectY\">\n        ///   y-coordinate of the upper-left corner of the rectangle bounding\n        ///   the chart.\n        /// </param>\n        /// <param name=\"width\">\n        ///   Width of the rectangle bounding the chart.\n        /// </param>\n        /// <param name=\"height\">\n        ///   Height of the rectangle bounding the chart.\n        /// </param>\n        /// <param name=\"values\">\n        ///   An array of <c>decimal</c> values to chart.\n        /// </param>\n        /// <param name=\"sliceRelativeHeight\">\n        ///   Thickness of the pie slice to chart relative to the height of the\n        ///   bounding rectangle.\n        /// </param>\n        public PieChart3D(float boundingRectX, float boundingRectY, float width, float height,\n            decimal[] values, float sliceRelativeHeight)\n            : this(boundingRectX, boundingRectY, width, height, values)\n        {\n            m_sliceRelativeHeight = sliceRelativeHeight;\n        }\n\n        /// <summary>\n        ///   Initializes a new instance of <c>PieChart3D</c> with given bounds, \n        ///   array of values and pie slice thickness.\n        /// </summary>\n        /// <param name=\"boundingRectangle\">\n        ///   Bounding rectangle.\n        /// </param>\n        /// <param name=\"values\">\n        ///   Array of values to initialize with.\n        /// </param>\n        /// <param name=\"sliceRelativeHeight\"></param>\n        public PieChart3D(RectangleF boundingRectangle, decimal[] values, float sliceRelativeHeight)\n            : this(\n                boundingRectangle.X, boundingRectangle.Y, boundingRectangle.Width, boundingRectangle.Height, values,\n                sliceRelativeHeight)\n        {\n        }\n\n        /// <summary>\n        ///   Initializes a new instance of <c>PieChart3D</c> with given bounds,\n        ///   array of values and relative pie slice height.\n        /// </summary>\n        /// <param name=\"boundingRectX\">\n        ///   x-coordinate of the upper-left corner of the rectangle bounding \n        ///   the chart.\n        /// </param>\n        /// <param name=\"boundingRectY\">\n        ///   y-coordinate of the upper-left corner of the rectangle bounding\n        ///   the chart.\n        /// </param>\n        /// <param name=\"width\">\n        ///   Width of the rectangle bounding the chart.\n        /// </param>\n        /// <param name=\"height\">\n        ///   Height of the rectangle bounding the chart.\n        /// </param>\n        /// <param name=\"values\">\n        ///   An array of <c>decimal</c> values to chart.\n        /// </param>\n        /// <param name=\"sliceColors\">\n        ///   An array of colors used to render slices.\n        /// </param>\n        /// <param name=\"sliceRelativeHeight\">\n        ///   Thickness of the slice to chart relative to the height of the\n        ///   bounding rectangle.\n        /// </param>\n        public PieChart3D(float boundingRectX, float boundingRectY, float width, float height,\n            decimal[] values, Color[] sliceColors, float sliceRelativeHeight)\n            : this(boundingRectX, boundingRectY, width, height, values, sliceRelativeHeight)\n        {\n            m_colors = sliceColors;\n        }\n\n        /// <summary>\n        ///   Initializes a new instance of <c>PieChart3D</c> with given bounds,\n        ///   array of values and corresponding colors.\n        /// </summary>\n        /// <param name=\"boundingRectangle\">\n        ///   Bounding rectangle.\n        /// </param>\n        /// <param name=\"values\">\n        ///   Array of values to chart.\n        /// </param>\n        /// <param name=\"sliceColors\">\n        ///   Colors used for rendering individual slices.\n        /// </param>\n        /// <param name=\"sliceRelativeHeight\">\n        ///   Pie slice relative height.\n        /// </param>\n        public PieChart3D(RectangleF boundingRectangle, decimal[] values, Color[] sliceColors, float sliceRelativeHeight)\n            : this(boundingRectangle, values, sliceRelativeHeight)\n        {\n            m_colors = sliceColors;\n        }\n\n        /// <summary>\n        ///   Initializes a new instance of <c>PieChart3D</c> with given bounds,\n        ///   array of values and relative pie slice height.\n        /// </summary>\n        /// <param name=\"boundingRectX\">\n        ///   x-coordinate of the upper-left corner of the rectangle bounding \n        ///   the chart.\n        /// </param>\n        /// <param name=\"boundingRectY\">\n        ///   y-coordinate of the upper-left corner of the rectangle bounding\n        ///   the chart.\n        /// </param>\n        /// <param name=\"width\">\n        ///   Width of the rectangle bounding the chart.\n        /// </param>\n        /// <param name=\"height\">\n        ///   Height of the rectangle bounding the chart.\n        /// </param>\n        /// <param name=\"values\">\n        ///   An array of <c>decimal</c> values to chart.\n        /// </param>\n        /// <param name=\"sliceColors\">\n        ///   An array of colors used to render slices.\n        /// </param>\n        /// <param name=\"sliceRelativeHeight\">\n        ///   Thickness of the slice to chart relative to the height of the\n        ///   bounding rectangle.\n        /// </param>\n        /// <param name=\"texts\">\n        ///   An array of strings that are displayed on corresponding slice.\n        /// </param>\n        public PieChart3D(float boundingRectX, float boundingRectY, float width, float height,\n            decimal[] values, Color[] sliceColors, float sliceRelativeHeight, string[] texts)\n            : this(boundingRectX, boundingRectY, width, height, values, sliceColors, sliceRelativeHeight)\n        {\n            m_texts = texts;\n        }\n\n        /// <summary>\n        ///   Initializes a new instance of <c>PieChart3D</c> with given bounds,\n        ///   array of values and relative pie slice height.\n        /// </summary>\n        /// <param name=\"boundingRectX\">\n        ///   x-coordinate of the upper-left corner of the rectangle bounding \n        ///   the chart.\n        /// </param>\n        /// <param name=\"boundingRectY\">\n        ///   y-coordinate of the upper-left corner of the rectangle bounding\n        ///   the chart.\n        /// </param>\n        /// <param name=\"width\">\n        ///   Width of the rectangle bounding the chart.\n        /// </param>\n        /// <param name=\"height\">\n        ///   Height of the rectangle bounding the chart.\n        /// </param>\n        /// <param name=\"values\">\n        ///   An array of <c>decimal</c> values to chart.\n        /// </param>\n        /// <param name=\"sliceRelativeHeight\">\n        ///   Thickness of the slice to chart relative to the height of the\n        ///   bounding rectangle.\n        /// </param>\n        /// <param name=\"texts\">\n        ///   An array of strings that are displayed on corresponding slice.\n        /// </param>\n        public PieChart3D(float boundingRectX, float boundingRectY, float width, float height,\n            decimal[] values, float sliceRelativeHeight, string[] texts)\n            : this(boundingRectX, boundingRectY, width, height, values, sliceRelativeHeight)\n        {\n            m_texts = texts;\n        }\n\n        /// <summary>\n        ///   <c>Finalize</c> method.\n        /// </summary>\n        ~PieChart3D()\n        {\n            Dispose(false);\n        }\n\n        /// <summary>\n        ///   Implementation of <c>IDisposable</c> interface.\n        /// </summary>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        ///   Disposes of all pie slices.\n        /// </summary>\n        private void Dispose(bool disposing)\n        {\n            if (m_disposed)\n                return;\n\n            if (disposing)\n            {\n                foreach (PieSlice slice in m_pieSlices)\n                {\n                    slice.Dispose();\n                }\n            }\n            m_disposed = true;\n        }\n\n        /// <summary>\n        ///   Sets values to be displayed on the chart.\n        /// </summary>\n        private void Values(decimal[] chartValues)\n        {\n            Debug.Assert(chartValues != null && chartValues.Length > 0);\n            m_values = chartValues;\n        }\n\n        /// <summary>\n        ///   Sets the font of the text displayed by the control.\n        /// </summary>\n        public void Font(Font textFont)\n        {\n            m_font = textFont;\n        }\n\n        /// <summary>\n        ///   Sets the foreground color of the control used to draw text.\n        /// </summary>\n        public void ForeColor(Color color)\n        {\n            m_foreColor = color;\n        }\n\n        /// <summary>\n        ///   Sets slice edge color mode. If set to <c>PenColor</c> (default),\n        ///   then value set by <c>EdgeColor</c> property is used.\n        /// </summary>\n        public void ColorTypeOfEdge(EdgeColorType edgeColorType)\n        {\n            m_edgeColorType = edgeColorType;\n        }\n\n        /// <summary>\n        ///   Sets slice edge line width. If not set, default value is 1.\n        /// </summary>\n        public void EdgeLineWidth(float lineWidth)\n        {\n            m_edgeLineWidth = lineWidth;\n        }\n\n        /// <summary>\n        ///   Sets slice height, relative to the top ellipse semi-axis. Must be\n        ///   less than or equal to 0.5.\n        /// </summary>\n        public void SliceRelativeHeight(float relativeHeight)\n        {\n            Debug.Assert(relativeHeight <= 0.5F);\n            m_sliceRelativeHeight = relativeHeight;\n        }\n\n        /// <summary>\n        ///   Sets the slice displacement relative to the ellipse semi-axis.\n        ///   Must be less than 1.\n        /// </summary>\n        public void SliceRelativeDisplacement(float relativeDisplacement)\n        {\n            Debug.Assert(IsDisplacementValid(relativeDisplacement));\n            m_sliceRelativeDisplacements = new[] { relativeDisplacement };\n        }\n\n        /// <summary>\n        ///   Sets the slice displacement relative to the ellipse semi-axis.\n        ///   Must be less than 1.\n        /// </summary>\n        public void SliceRelativeDisplacements(float[] relativeDisplacements)\n        {\n            Debug.Assert(AreDisplacementsValid(relativeDisplacements));\n            m_sliceRelativeDisplacements = relativeDisplacements;\n        }\n\n        /// <summary>\n        ///   Gets or sets the size of the entire pie chart.\n        /// </summary>\n        public void ChartSize(SizeF size)\n        {\n            m_width = size.Width;\n            m_height = size.Height;\n        }\n\n        /// <summary>\n        ///   Gets the y-coordinate of the bounding rectangle bottom edge.\n        /// </summary>\n        public float Bottom => m_top + m_height;\n\n        /// <summary>\n        ///   Gets the x-coordinate of the bounding rectangle right edge.\n        /// </summary>\n        public float Right => m_left + m_width;\n\n        /// <summary>\n        ///   Gets or sets the x-coordinate of the upper-left corner of the \n        ///   bounding rectangle.\n        /// </summary>\n        public float PointX\n        {\n            get { return m_left; }\n            set { m_left = value; }\n        }\n\n        /// <summary>\n        ///   Gets or sets the y-coordinate of the upper-left corner of the bounding rectangle.\n        /// </summary>\n        public float PointY\n        {\n            get { return m_top; }\n            set { m_top = value; }\n        }\n\n        /// <summary>\n        ///   Sets the shadowing style used.\n        /// </summary>\n        public void StyleOfShadow(ShadowStyle shadowStyle)\n        {\n            m_shadowStyle = shadowStyle;\n        }\n\n        /// <summary>\n        ///   Sets the flag that controls if chart is fit to bounding rectangle exactly.\n        /// </summary>\n        public void FitToBoundingRectangle(bool fitToBoundingRect)\n        {\n            m_fitToBoundingRectangle = fitToBoundingRect;\n        }\n\n        /// <summary>\n        ///   Sets the initial angle from which pies are placed.\n        /// </summary>\n        public void InitialAngle(float angle)\n        {\n            m_initialAngle = angle % 360;\n            if (m_initialAngle < 0)\n                m_initialAngle += 360;\n        }\n\n        /// <summary>\n        ///   Sets the index of the highlighted pie.\n        /// </summary>\n        public void HighlightedIndex(int index)\n        {\n            m_highlightedIndex = index;\n        }\n\n        /// <summary>\n        ///   Draws the chart.\n        /// </summary>\n        /// <param name=\"graphics\">\n        ///   <c>Graphics</c> object used for drawing.\n        /// </param>\n        public void Draw(Graphics graphics)\n        {\n            Debug.Assert(m_values != null && m_values.Length > 0);\n            InitializePieSlices();\n            if (m_fitToBoundingRectangle)\n            {\n                RectangleF newBoundingRectangle = GetFittingRectangle();\n                ReadjustSlices(newBoundingRectangle);\n            }\n            DrawBottoms(graphics);\n            if (m_sliceRelativeHeight > 0F)\n                DrawSliceSides(graphics);\n            DrawTops(graphics);\n        }\n\n        /// <summary>\n        /// Draws strings by individual slices. Position of the text is\n        /// calculated by overridable <c>GetTextPosition</c> method of the\n        /// <c>PieSlice</c> type.\n        /// </summary>\n        /// <param name=\"graphics\"><c>Graphics</c> object.</param>\n        /// <exception cref=\"System.ArgumentNullException\">graphics</exception>\n        public void PlaceTexts(Graphics graphics)\n        {\n            Debug.Assert(m_font != null);\n            Debug.Assert(m_foreColor != Color.Empty);\n\n            graphics.ThrowIfNull(nameof(graphics));\n\n            using (StringFormat drawFormat = new StringFormat())\n            {\n                drawFormat.Alignment = StringAlignment.Center;\n                drawFormat.LineAlignment = StringAlignment.Center;\n\n                using (Brush fontBrush = new SolidBrush(m_foreColor))\n                {\n                    int num = 0;\n                    PointF[] points = new PointF[m_pieSlices.Length];\n                    foreach (PieSlice slice in m_pieSlices)\n                    {\n                        if (!string.IsNullOrEmpty(slice.Text))\n                        {\n                            PointF point = slice.GetTextPosition;\n\n                            foreach (PointF oldpoint in points)\n                            {\n                                for (int x = 0; x <= 1; x++)\n                                {\n                                    float diffy = oldpoint.Y - point.Y;\n                                    float diffx = oldpoint.X - point.X;\n\n                                    if (diffy < 0)\n                                        diffy *= -1;\n                                    if (diffx < 0)\n                                        diffx *= -1;\n\n                                    if (diffx < 70 && diffy < 16)\n                                        point = slice.GetTextPositionOut(x == 0 ? 4.5f : 2.2f);\n                                }\n                            }\n\n                            points[num] = point;\n                            graphics.DrawString(slice.Text, m_font, fontBrush, point, drawFormat);\n                        }\n\n                        num++;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        ///   Searches the chart to find the index of the pie slice which \n        ///   contains point given. Search order goes in the direction opposite\n        ///   to drawing order.\n        /// </summary>\n        /// <param name=\"point\">\n        ///   <c>PointF</c> point for which pie slice is searched for.\n        /// </param>\n        /// <returns>\n        ///   Index of the corresponding pie slice, or -1 if none is found.\n        /// </returns>\n        public int FindPieSliceUnderPoint(PointF point)\n        {\n            // first check tops\n            for (int i = 0; i < m_pieSlices.Length; ++i)\n            {\n                PieSlice slice = m_pieSlices[i];\n                if (slice.PieSliceContainsPoint(point))\n                    return (int)m_pieSlicesMapping[i];\n            }\n            // split the backmost (at 270 degrees) pie slice\n            ArrayList pieSlicesList = new ArrayList(m_pieSlices);\n            PieSlice[] splitSlices = m_pieSlices[0].Split(270F);\n            if (splitSlices.Length > 1)\n            {\n                pieSlicesList[0] = splitSlices[1];\n                if (splitSlices[0].SweepAngle > 0F)\n                    pieSlicesList.Add(splitSlices[0]);\n            }\n            PieSlice[] pieSlices = (PieSlice[])pieSlicesList.ToArray(typeof(PieSlice));\n            int indexFound = -1;\n            // if not found yet, then check for periferies\n            int incrementIndex = 0;\n            int decrementIndex = pieSlices.Length - 1;\n            while (incrementIndex <= decrementIndex)\n            {\n                PieSlice sliceLeft = pieSlices[decrementIndex];\n                float angle1 = 270 - sliceLeft.StartAngle;\n                PieSlice sliceRight = pieSlices[incrementIndex];\n                float angle2 = (sliceRight.EndAngle + 90) % 360;\n                Debug.Assert(angle2 >= 0);\n                if (angle2 < angle1)\n                {\n                    if (sliceRight.PeripheryContainsPoint(point))\n                        indexFound = incrementIndex;\n                    ++incrementIndex;\n                }\n                else\n                {\n                    if (sliceLeft.PeripheryContainsPoint(point))\n                        indexFound = decrementIndex;\n                    --decrementIndex;\n                }\n            }\n            // check for start/stop sides, starting from the foremost\n            if (indexFound < 0)\n            {\n                int foremostPieIndex = GetForemostPieSlice(pieSlices);\n                if (foremostPieIndex == -1)\n                    Debug.Assert(false, \"Foremost pie slice not found\");\n\n                // check for start sides from the foremost slice to the left \n                // side\n                int i = foremostPieIndex;\n                while (i < pieSlices.Length)\n                {\n                    PieSlice sliceLeft = pieSlices[i];\n                    if (sliceLeft.StartSideContainsPoint(point))\n                    {\n                        indexFound = i;\n                        break;\n                    }\n                    ++i;\n                }\n                // if not found yet, check end sides from the foremost to the right\n                // side\n                if (indexFound < 0)\n                {\n                    i = foremostPieIndex;\n                    while (i >= 0)\n                    {\n                        PieSlice sliceLeft = pieSlices[i];\n                        if (sliceLeft.EndSideContainsPoint(point))\n                        {\n                            indexFound = i;\n                            break;\n                        }\n                        --i;\n                    }\n                }\n            }\n            // finally search for bottom sides\n            if (indexFound < 0)\n            {\n                for (int i = 0; i < m_pieSlices.Length; ++i)\n                {\n                    PieSlice slice = m_pieSlices[i];\n                    if (slice.BottomSurfaceSectionContainsPoint(point))\n                        return (int)m_pieSlicesMapping[i];\n                }\n            }\n            if (indexFound <= -1)\n                return -1;\n\n            indexFound %= m_pieSlicesMapping.Count;\n            return (int)m_pieSlicesMapping[indexFound];\n        }\n\n        /// <summary>\n        ///   Return the index of the foremost pie slice i.e. the one crossing\n        ///   90 degrees boundary.\n        /// </summary>\n        /// <param name=\"pieSlices\">\n        ///   Array of <c>PieSlice</c> objects to examine.\n        /// </param>\n        /// <returns>\n        ///   Index of the foremost pie slice.\n        /// </returns>\n        private static int GetForemostPieSlice(IList<PieSlice> pieSlices)\n        {\n            if (pieSlices == null || pieSlices.Count <= 0)\n                return -1;\n\n            for (int i = 0; i < pieSlices.Count; ++i)\n            {\n                PieSlice pieSlice = pieSlices[i];\n                if (((pieSlice.StartAngle <= 90) && (pieSlice.StartAngle + pieSlice.SweepAngle >= 90)) ||\n                    ((pieSlice.StartAngle + pieSlice.SweepAngle > 360) && (pieSlice.StartAngle <= 450) &&\n                     pieSlice.StartAngle + pieSlice.SweepAngle >= 450))\n                    return i;\n            }\n\n            return -1;\n        }\n\n        /// <summary>\n        ///   Finds the smallest rectangle int which chart fits entirely.\n        /// </summary>\n        /// <returns>\n        ///   <c>RectangleF</c> into which all member slices fit.\n        /// </returns>\n        private RectangleF GetFittingRectangle()\n        {\n            RectangleF boundingRectangle = m_pieSlices[0].GetFittingRectangle();\n            for (int i = 1; i < m_pieSlices.Length; ++i)\n            {\n                boundingRectangle = RectangleF.Union(boundingRectangle, m_pieSlices[i].GetFittingRectangle());\n            }\n            return boundingRectangle;\n        }\n\n        /// <summary>\n        ///   Readjusts each slice for new bounding rectangle. \n        /// </summary>\n        /// <param name=\"newBoundingRectangle\">\n        ///   <c>RectangleF</c> representing new boundary.\n        /// </param>\n        private void ReadjustSlices(RectangleF newBoundingRectangle)\n        {\n            float xResizeFactor = m_width / newBoundingRectangle.Width;\n            float yResizeFactor = m_height / newBoundingRectangle.Height;\n            float xOffset = newBoundingRectangle.X - m_left;\n            float yOffset = newBoundingRectangle.Y - m_top;\n            foreach (PieSlice slice in m_pieSlices)\n            {\n                float x = slice.BoundingRectangle.X - xOffset;\n                float y = slice.BoundingRectangle.Y - yOffset;\n                float width = slice.BoundingRectangle.Width * xResizeFactor;\n                float height = slice.BoundingRectangle.Height * yResizeFactor;\n                float sliceHeight = slice.SliceHeight * yResizeFactor;\n                slice.Readjust(x, y, width, height, sliceHeight);\n            }\n        }\n\n        /// <summary>\n        ///   Finds the largest displacement.\n        /// </summary>\n        private float LargestDisplacement\n        {\n            get\n            {\n                float value = 0F;\n                for (int i = 0; i < m_sliceRelativeDisplacements.Length && i < m_values.Length; ++i)\n                {\n                    if (m_sliceRelativeDisplacements[i] > value)\n                        value = m_sliceRelativeDisplacements[i];\n                }\n                return value;\n            }\n        }\n\n        /// <summary>\n        ///   Gets the top ellipse size.\n        /// </summary>\n        private SizeF TopEllipseSize\n        {\n            get\n            {\n                float factor = 1 + LargestDisplacement;\n                float widthTopEllipse = m_width / factor;\n                float heightTopEllipse = m_height / factor * (1 - m_sliceRelativeHeight);\n                return new SizeF(widthTopEllipse, heightTopEllipse);\n            }\n        }\n\n        /// <summary>\n        ///   Gets the ellipse defined by largest displacement.\n        /// </summary>\n        private SizeF LargestDisplacementEllipseSize\n        {\n            get\n            {\n                float factor = LargestDisplacement;\n                float widthDisplacementEllipse = TopEllipseSize.Width * factor;\n                float heightDisplacementEllipse = TopEllipseSize.Height * factor;\n                return new SizeF(widthDisplacementEllipse, heightDisplacementEllipse);\n            }\n        }\n\n        /// <summary>\n        ///   Calculates the pie height.\n        /// </summary>\n        private float PieHeight => m_height / (1 + LargestDisplacement) * m_sliceRelativeHeight;\n\n        /// <summary>\n        ///   Initializes pies.\n        /// </summary>\n        /// Creates a list of pies, starting with the pie that is crossing the \n        /// 270 degrees boundary, i.e. \"backmost\" pie that always has to be \n        /// drawn first to ensure correct surface overlapping.\n        private void InitializePieSlices()\n        {\n            // calculates the sum of values required to evaluate sweep angles \n            // for individual pies\n            double sum = m_values.Sum(itemValue => (double)itemValue);\n\n            // some values and indices that will be used in the loop\n            SizeF topEllipeSize = TopEllipseSize;\n            SizeF largestDisplacementEllipseSize = LargestDisplacementEllipseSize;\n            int maxDisplacementIndex = m_sliceRelativeDisplacements.Length - 1;\n            float largestDisplacement = LargestDisplacement;\n            ArrayList listPieSlices = new ArrayList();\n            m_pieSlicesMapping.Clear();\n            int colorIndex = 0;\n            int backPieIndex = -1;\n            int displacementIndex = 0;\n            double startAngle = m_initialAngle;\n            for (int i = 0; i < m_values.Length; ++i)\n            {\n                decimal itemValue = m_values[i];\n                double sweepAngle = (double)itemValue / sum * 360;\n                // displacement from the center of the ellipse\n                float xDisplacement = m_sliceRelativeDisplacements[displacementIndex];\n                float yDisplacement = m_sliceRelativeDisplacements[displacementIndex];\n                if (xDisplacement > 0F)\n                {\n                    Debug.Assert(largestDisplacement > 0F);\n                    SizeF pieDisplacement = GetSliceDisplacement((float)(startAngle + sweepAngle / 2),\n                        m_sliceRelativeDisplacements[displacementIndex]);\n                    xDisplacement = pieDisplacement.Width;\n                    yDisplacement = pieDisplacement.Height;\n                }\n                PieSlice slice;\n                if (i == m_highlightedIndex)\n                {\n                    using (PieSlice pieSlice =\n                        CreatePieSliceHighlighted(m_left + largestDisplacementEllipseSize.Width / 2 + xDisplacement,\n                            m_top + largestDisplacementEllipseSize.Height / 2 + yDisplacement,\n                            topEllipeSize.Width, topEllipeSize.Height, PieHeight,\n                            (float)startAngle, (float)sweepAngle, m_colors[colorIndex],\n                            m_shadowStyle, m_edgeColorType, m_edgeLineWidth))\n                    {\n                        slice = (PieSlice)pieSlice.Clone();\n                    }\n                }\n                else\n                {\n                    using (PieSlice pieSlice = CreatePieSlice(m_left + largestDisplacementEllipseSize.Width / 2 + xDisplacement,\n                        m_top + largestDisplacementEllipseSize.Height / 2 + yDisplacement,\n                        topEllipeSize.Width, topEllipeSize.Height, PieHeight,\n                        (float)startAngle, (float)sweepAngle, m_colors[colorIndex],\n                        m_shadowStyle, m_edgeColorType, m_edgeLineWidth))\n                    {\n                        slice = (PieSlice)pieSlice.Clone();\n                    }\n                }\n                slice.Text = m_texts[i];\n                // the backmost pie is inserted to the front of the list for correct drawing\n                if (backPieIndex > -1 || ((startAngle <= 270) && (startAngle + sweepAngle > 270)) ||\n                    ((startAngle >= 270) && (startAngle + sweepAngle > 630)))\n                {\n                    ++backPieIndex;\n                    listPieSlices.Insert(backPieIndex, slice);\n                    m_pieSlicesMapping.Insert(backPieIndex, i);\n                }\n                else\n                {\n                    listPieSlices.Add(slice);\n                    m_pieSlicesMapping.Add(i);\n                }\n                // increment displacementIndex only if there are more displacements available\n                if (displacementIndex < maxDisplacementIndex)\n                    ++displacementIndex;\n                ++colorIndex;\n                // if all colors have been exhausted, reset color index\n                if (colorIndex >= m_colors.Length)\n                    colorIndex = 0;\n                // prepare for the next pie slice\n                startAngle += sweepAngle;\n                if (startAngle > 360)\n                    startAngle -= 360;\n            }\n            m_pieSlices = (PieSlice[])listPieSlices.ToArray(typeof(PieSlice));\n        }\n\n        /// <summary>\n        ///   Creates a <c>PieSlice</c> object.\n        /// </summary>\n        /// <param name=\"boundingRectLeft\">\n        ///   x-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the slice.\n        /// </param>\n        /// <param name=\"boundingRectTop\">\n        ///   y-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the slice.\n        /// </param>\n        /// <param name=\"boundingRectWidth\">\n        ///   Width of the rectangle that is used to draw the top surface of \n        ///   the slice.\n        /// </param>\n        /// <param name=\"boundingRectHeight\">\n        ///   Height of the rectangle that is used to draw the top surface of \n        ///   the slice.\n        /// </param>\n        /// <param name=\"sliceHeight\">\n        ///   Slice height.\n        /// </param>\n        /// <param name=\"startAngle\">\n        ///   Starting angle.\n        /// </param>\n        /// <param name=\"sweepAngle\">\n        ///   Sweep angle.\n        /// </param>\n        /// <param name=\"color\">\n        ///   Color used for slice rendering.\n        /// </param>\n        /// <param name=\"shadowStyle\">\n        ///   Shadow style used for slice rendering.\n        /// </param>\n        /// <param name=\"edgeColorType\">\n        ///   Edge lines color type.\n        /// </param>\n        /// <param name=\"edgeLineWidth\">\n        ///   Edge lines width.\n        /// </param>\n        /// <returns>\n        ///   <c>PieSlice</c> object with given values.\n        /// </returns>\n        private static PieSlice CreatePieSlice(float boundingRectLeft, float boundingRectTop, float boundingRectWidth,\n            float boundingRectHeight, float sliceHeight, float startAngle, float sweepAngle,\n            Color color, ShadowStyle shadowStyle, EdgeColorType edgeColorType,\n            float edgeLineWidth)\n            => new PieSlice(boundingRectLeft, boundingRectTop, boundingRectWidth, boundingRectHeight, sliceHeight,\n                startAngle, sweepAngle, color, shadowStyle, edgeColorType, edgeLineWidth);\n\n        /// <summary>\n        ///   Creates highlighted <c>PieSlice</c> object.\n        /// </summary>\n        /// <param name=\"boundingRectLeft\">\n        ///   x-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the slice.\n        /// </param>\n        /// <param name=\"boundingRectTop\">\n        ///   y-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the slice.\n        /// </param>\n        /// <param name=\"boundingRectWidth\">\n        ///   Width of the rectangle that is used to draw the top surface of \n        ///   the slice.\n        /// </param>\n        /// <param name=\"boundingRectHeight\">\n        ///   Height of the rectangle that is used to draw the top surface of \n        ///   the slice.\n        /// </param>\n        /// <param name=\"sliceHeight\">\n        ///   Slice height.\n        /// </param>\n        /// <param name=\"startAngle\">\n        ///   Starting angle.\n        /// </param>\n        /// <param name=\"sweepAngle\">\n        ///   Sweep angle.\n        /// </param>\n        /// <param name=\"color\">\n        ///   Color used for slice rendering.\n        /// </param>\n        /// <param name=\"shadowStyle\">\n        ///   Shadow style used for slice rendering.\n        /// </param>\n        /// <param name=\"edgeColorType\">\n        ///   Edge lines color type.\n        /// </param>\n        /// <param name=\"edgeLineWidth\">\n        ///   Edge lines width.\n        /// </param>\n        /// <returns>\n        ///   <c>PieSlice</c> object with given values.\n        /// </returns>\n        private static PieSlice CreatePieSliceHighlighted(float boundingRectLeft, float boundingRectTop,\n            float boundingRectWidth, float boundingRectHeight, float sliceHeight,\n            float startAngle, float sweepAngle, Color color,\n            ShadowStyle shadowStyle, EdgeColorType edgeColorType,\n            float edgeLineWidth)\n        {\n            Color highLightedColor = ColorUtil.CreateColorWithCorrectedLightness(color, ColorUtil.BrightnessEnhancementFactor1);\n\n            return new PieSlice(boundingRectLeft, boundingRectTop, boundingRectWidth, boundingRectHeight, sliceHeight,\n                startAngle, sweepAngle, highLightedColor, shadowStyle, edgeColorType,\n                edgeLineWidth);\n        }\n\n        /// <summary>\n        ///   Calculates the displacement for given angle.\n        /// </summary>\n        /// <param name=\"angle\">\n        ///   Angle (in degrees).\n        /// </param>\n        /// <param name=\"displacementFactor\">\n        ///   Displacement factor.\n        /// </param>\n        /// <returns>\n        ///   <c>SizeF</c> representing displacement.\n        /// </returns>\n        private SizeF GetSliceDisplacement(float angle, float displacementFactor)\n        {\n            Debug.Assert(displacementFactor > 0F && displacementFactor <= 1F);\n            if (Math.Abs(displacementFactor) < float.Epsilon)\n                return SizeF.Empty;\n            float xDisplacement = (float)(TopEllipseSize.Width * displacementFactor / 2 * Math.Cos(angle * Math.PI / 180));\n            float yDisplacement = (float)(TopEllipseSize.Height * displacementFactor / 2 * Math.Sin(angle * Math.PI / 180));\n            return new SizeF(xDisplacement, yDisplacement);\n        }\n\n        /// <summary>\n        ///   Draws outer peripheries of all slices.\n        /// </summary>\n        /// <param name=\"graphics\">\n        ///   <c>Graphics</c> used for drawing.\n        /// </param>\n        private void DrawSliceSides(Graphics graphics)\n        {\n            ArrayList pieSlicesList = new ArrayList(m_pieSlices);\n            PieSlice ps;\n            // if the first pie slice (crossing 270 i.e. back) is crossing 90 \n            // (front) axis too, we have to split it\n            if ((m_pieSlices[0].StartAngle > 90) && (m_pieSlices[0].StartAngle <= 270) &&\n                (m_pieSlices[0].StartAngle + m_pieSlices[0].SweepAngle > 450))\n            {\n                ps = (PieSlice)pieSlicesList[0];\n                // this one is split at 0 deg to avoid line of split to be\n                // visible on the periphery\n                PieSlice[] splitSlices = ps.Split(0F);\n                pieSlicesList[0] = splitSlices[0];\n                if (splitSlices[1].SweepAngle > 0F)\n                    pieSlicesList.Insert(1, splitSlices[1]);\n            }\n            else if (((m_pieSlices[0].StartAngle > 270) && (m_pieSlices[0].StartAngle + m_pieSlices[0].SweepAngle > 450)) ||\n                     ((m_pieSlices[0].StartAngle < 90) && (m_pieSlices[0].StartAngle + m_pieSlices[0].SweepAngle > 270)))\n            {\n                ps = (PieSlice)pieSlicesList[0];\n                // this one is split at 180 deg to avoid line of split to be\n                // visible on the periphery\n                PieSlice[] splitSlices = ps.Split(180F);\n                pieSlicesList[0] = splitSlices[1];\n                if (splitSlices[1].SweepAngle > 0F)\n                    pieSlicesList.Add(splitSlices[0]);\n            }\n            // first draw the backmost pie slice\n            ps = (PieSlice)pieSlicesList[0];\n            ps.DrawSides(graphics);\n            // draw pie slices from the backmost to forward\n            int incrementIndex = 1;\n            int decrementIndex = pieSlicesList.Count - 1;\n            while (incrementIndex < decrementIndex)\n            {\n                PieSlice sliceLeft = (PieSlice)pieSlicesList[decrementIndex];\n                float angle1 = sliceLeft.StartAngle - 90;\n                if (angle1 > 180 || angle1 < 0)\n                    angle1 = 0;\n                PieSlice sliceRight = (PieSlice)pieSlicesList[incrementIndex];\n                float angle2 = (450 - sliceRight.EndAngle) % 360;\n                if (angle2 > 180 || angle2 < 0)\n                    angle2 = 0;\n                Debug.Assert(angle1 >= 0);\n                Debug.Assert(angle2 >= 0);\n                if (angle2 >= angle1)\n                {\n                    sliceRight.DrawSides(graphics);\n                    ++incrementIndex;\n                }\n                else if (angle2 < angle1)\n                {\n                    sliceLeft.DrawSides(graphics);\n                    --decrementIndex;\n                }\n            }\n            ps = (PieSlice)pieSlicesList[decrementIndex];\n            ps.DrawSides(graphics);\n        }\n\n        /// <summary>\n        ///   Draws bottom sides of all pie slices.\n        /// </summary>\n        /// <param name=\"graphics\">\n        ///   <c>Graphics</c> used for drawing.\n        /// </param>\n        private void DrawBottoms(Graphics graphics)\n        {\n            foreach (PieSlice slice in m_pieSlices)\n            {\n                slice.DrawBottom(graphics);\n            }\n        }\n\n        /// <summary>\n        ///   Draws top sides of all pie slices.\n        /// </summary>\n        /// <param name=\"graphics\">\n        ///   <c>Graphics</c> used for drawing.\n        /// </param>\n        private void DrawTops(Graphics graphics)\n        {\n            foreach (PieSlice slice in m_pieSlices)\n            {\n                slice.DrawTop(graphics);\n            }\n        }\n\n        /// <summary>\n        ///   Helper function used in assertions. Checks the validity of \n        ///   slice displacements.\n        /// </summary>\n        /// <param name=\"displacements\">\n        ///   Array of displacements to check.\n        /// </param>\n        /// <returns>\n        ///   <c>true</c> if all displacements have a valid value; otherwise \n        ///   <c>false</c>.\n        /// </returns>\n        private static bool AreDisplacementsValid(IEnumerable<float> displacements)\n            => displacements.All(IsDisplacementValid);\n\n        /// <summary>\n        ///   Helper function used in assertions. Checks the validity of \n        ///   a slice displacement.\n        /// </summary>\n        /// <param name=\"value\">\n        ///   Displacement value to check.\n        /// </param>\n        /// <returns>\n        ///   <c>true</c> if displacement has a valid value; otherwise \n        ///   <c>false</c>.\n        /// </returns>\n        private static bool IsDisplacementValid(float value) => value >= 0F && value <= 1F;\n    }\n}"
  },
  {
    "path": "src/EVEMon.PieChart/PieChartControl.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Globalization;\nusing System.Linq;\nusing System.Windows.Forms;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.PieChart\n{\n    /// <summary>\n    /// Summary description for PieChartControl.\n    /// </summary>\n    public class PieChartControl : Panel\n    {\n        private float m_leftMargin;\n        private float m_topMargin;\n        private float m_rightMargin;\n        private float m_bottomMargin;\n        private bool m_fitChart;\n\n        private decimal[] m_values;\n        private Color[] m_colors;\n        private float m_sliceRelativeHeight;\n        private float[] m_relativeSliceDisplacements = new[] { 0F };\n        private string[] m_texts;\n        private string[] m_tootips;\n        private ShadowStyle m_shadowStyle = ShadowStyle.GradualShadow;\n        private EdgeColorType m_edgeColorType = EdgeColorType.SystemColor;\n        private float m_edgeLineWidth = 1F;\n        private float m_initialAngle;\n        private int m_highlightedIndex = -1;\n        private readonly ToolTip m_toolTip;\n\n        private int m_lastX = -1;\n        private int m_lastY = -1;\n\n        // These are used for the actual drawing. They are modified depending\n        // on wether sorting by size is on or off\n        private decimal[] m_drawValues;\n        private Color[] m_drawColors;\n        private float[] m_drawRelativeSliceDisplacements = new[] { 0F };\n        private string[] m_drawToolTipTexts;\n        private string[] m_drawTexts;\n        private int[] m_sortOrder;\n\n        /// <summary>\n        /// Default AutoPopDelay of the ToolTip control.\n        /// </summary>\n        private int m_defaultToolTipAutoPopDelay;\n\n        /// <summary>\n        /// Flag indicating that object has been disposed.\n        /// </summary>\n        private bool m_disposed;\n\n        private bool m_mouseDown;\n\n        /// <summary>\n        /// Initializes the <c>PieChartControl</c>.\n        /// </summary>\n        public PieChartControl()\n        {\n            m_texts = null;\n            m_tootips = null;\n            PieChart = null;\n            SetStyle(ControlStyles.OptimizedDoubleBuffer |\n                     ControlStyles.DoubleBuffer |\n                     ControlStyles.UserPaint |\n                     ControlStyles.ResizeRedraw |\n                     ControlStyles.AllPaintingInWmPaint, true);\n            UpdateStyles();\n            m_toolTip = new ToolTip();\n        }\n\n        /// <summary>\n        /// Gets or sets the pie chart.\n        /// </summary>\n        /// <value>\n        /// The pie chart.\n        /// </value>\n        public PieChart3D PieChart { get; private set; }\n\n        /// <summary>\n        /// Gets or sets colors to be used for rendering pie slices.\n        /// </summary>\n        /// <value>\n        /// The colors.\n        /// </value>\n        [Browsable(false)]\n        public IEnumerable<Color> Colors\n        {\n            get { return m_colors; }\n            set\n            {\n                if (value == null)\n                    return;\n\n                m_colors = value.ToArray();\n                Invalidate();\n            }\n        }\n\n        /// <summary>\n        /// Sets the left margin for the chart.\n        /// </summary>\n        /// <param name=\"left\">The left.</param>\n        public void LeftMargin(float left)\n        {\n            Debug.Assert(left >= 0);\n            m_leftMargin = left;\n            Invalidate();\n        }\n\n        /// <summary>\n        ///   Sets the right margin for the chart.\n        /// </summary>\n        public void RightMargin(float right)\n        {\n            Debug.Assert(right >= 0);\n            m_rightMargin = right;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Sets the top margin for the chart.\n        /// </summary>\n        /// <param name=\"top\">The top.</param>\n        public void TopMargin(float top)\n        {\n            Debug.Assert(top >= 0);\n            m_topMargin = top;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Sets the bottom margin for the chart.\n        /// </summary>\n        /// <param name=\"bottom\">The bottom.</param>\n        public void BottomMargin(float bottom)\n        {\n            Debug.Assert(bottom >= 0);\n            m_bottomMargin = bottom;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Sets the indicator if chart should fit the bounding rectangle\n        /// exactly.\n        /// </summary>\n        /// <param name=\"fit\">if set to <c>true</c> [fit].</param>\n        public void FitChart(bool fit)\n        {\n            m_fitChart = fit;\n            Invalidate();\n        }\n\n\n        /// <summary>\n        /// Sets values to be represented by the chart.\n        /// </summary>\n        /// <param name=\"chartValues\">The chart values.</param>\n        public void Values(decimal[] chartValues)\n        {\n            m_values = chartValues;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Sets values for slice displacements.\n        /// </summary>\n        /// <param name=\"relativeDisplacements\">The relative displacements.</param>\n        public void SliceRelativeDisplacements(float[] relativeDisplacements)\n        {\n            m_relativeSliceDisplacements = relativeDisplacements;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Gets or sets tooltip texts.\n        /// </summary>\n        /// <param name=\"sliceTooltips\">The slice tooltips.</param>\n        public void ToolTips(string[] sliceTooltips)\n        {\n            m_tootips = sliceTooltips;\n        }\n\n        /// <summary>\n        /// Sets texts appearing by each pie slice.\n        /// </summary>\n        /// <param name=\"sliceTexts\">The slice texts.</param>\n        public void Texts(string[] sliceTexts)\n        {\n            m_texts = sliceTexts;\n        }\n\n        /// <summary>\n        /// Sets pie slice reative height.\n        /// </summary>\n        /// <param name=\"relativeHeight\">Height of the relative.</param>\n        public void SliceRelativeHeight(float relativeHeight)\n        {\n            m_sliceRelativeHeight = relativeHeight;\n            Invalidate();\n        }\n\n        /// <summary>\n        ///   Sets the shadow style.\n        /// </summary>\n        public void StyleOfShadow(ShadowStyle shadowStyle)\n        {\n            m_shadowStyle = shadowStyle;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Sets the edge color type.\n        /// </summary>\n        /// <param name=\"edgeColorType\">Type of the edge color.</param>\n        public void ColorTypeOfEdge(EdgeColorType edgeColorType)\n        {\n            m_edgeColorType = edgeColorType;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Sets the edge lines width.\n        /// </summary>\n        /// <param name=\"lineWidth\">Width of the line.</param>\n        public void EdgeLineWidth(float lineWidth)\n        {\n            m_edgeLineWidth = lineWidth;\n            Invalidate();\n        }\n\n        /// <summary>\n        ///   Sets the initial angle from which pies are drawn.\n        /// </summary>\n        public void InitialAngle(float angle)\n        {\n            float newAngle = angle;\n\n            if (newAngle > 360.0f)\n                newAngle -= 360.0f;\n\n            if (newAngle < 0.0f)\n                newAngle += 360.0f;\n\n            OnAngleChange(new AngleChangeEventArgs(m_initialAngle, newAngle));\n\n            m_initialAngle = newAngle;\n            Invalidate();\n        }\n\n        /// <summary>\n        /// Handles <c>OnPaint</c> event.\n        /// </summary>\n        /// <param name=\"e\"><c>PaintEventArgs</c> object.</param>\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            if (HasAnyValue)\n                DoDraw(e.Graphics);\n        }\n\n        /// <summary>\n        /// Sets values for the chart and draws them.\n        /// </summary>\n        /// <param name=\"graphics\">Graphics object used for drawing.</param>\n        private void DoDraw(Graphics graphics)\n        {\n            if (m_drawValues == null || m_drawValues.Length <= 0)\n                return;\n\n            graphics.SmoothingMode = SmoothingMode.AntiAlias;\n            float width = ClientSize.Width - m_leftMargin - m_rightMargin;\n            float height = ClientSize.Height - m_topMargin - m_bottomMargin;\n\n            // If the width or height if <=0 an exception would be thrown -> exit method..\n            if (width <= 0 || height <= 0)\n                return;\n\n            PieChart?.Dispose();\n\n            if (m_drawColors != null && m_drawColors.Length > 0)\n            {\n                PieChart = new PieChart3D(m_leftMargin, m_topMargin, width, height, m_drawValues, m_drawColors,\n                    m_sliceRelativeHeight, m_drawTexts);\n            }\n            else\n            {\n                PieChart = new PieChart3D(m_leftMargin, m_topMargin, width, height, m_drawValues, m_sliceRelativeHeight,\n                    m_drawTexts);\n            }\n\n            PieChart.FitToBoundingRectangle(m_fitChart);\n            PieChart.InitialAngle(m_initialAngle);\n            PieChart.SliceRelativeDisplacements(m_drawRelativeSliceDisplacements);\n            PieChart.ColorTypeOfEdge(m_edgeColorType);\n            PieChart.EdgeLineWidth(m_edgeLineWidth);\n            PieChart.StyleOfShadow(m_shadowStyle);\n            PieChart.HighlightedIndex(m_highlightedIndex);\n            PieChart.Draw(graphics);\n            PieChart.Font(Font);\n            PieChart.ForeColor(ForeColor);\n            PieChart.PlaceTexts(graphics);\n        }\n\n        /// <summary>\n        /// Handles <c>MouseEnter</c> event to activate the tooltip.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseEnter(EventArgs e)\n        {\n            base.OnMouseEnter(e);\n\n            m_defaultToolTipAutoPopDelay = m_toolTip.AutoPopDelay;\n            m_toolTip.AutoPopDelay = short.MaxValue;\n        }\n\n        /// <summary>\n        /// Handles <c>MouseLeave</c> event to disable tooltip.\n        /// </summary>\n        /// <param name=\"e\">An <see cref=\"T:System.EventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseLeave(EventArgs e)\n        {\n            base.OnMouseLeave(e);\n\n            m_toolTip.RemoveAll();\n            m_toolTip.AutoPopDelay = m_defaultToolTipAutoPopDelay;\n            m_highlightedIndex = -1;\n            Refresh();\n        }\n\n        /// <summary>\n        /// Handles <c>MouseDown</c> event\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.MouseEventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseDown(MouseEventArgs e)\n        {\n            base.OnMouseDown(e);\n\n            m_mouseDown = true;\n        }\n\n        /// <summary>\n        /// Handles <c>MouseUp</c> event\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnMouseUp(MouseEventArgs e)\n        {\n            base.OnMouseUp(e);\n\n            m_mouseDown = false;\n        }\n\n        /// <summary>\n        /// Handles <c>MouseMove</c> event to display tooltip for the pie\n        /// slice under pointer and to display slice in highlighted color.\n        /// </summary>\n        /// <param name=\"e\">A <see cref=\"T:System.Windows.Forms.MouseEventArgs\"/> that contains the event data.</param>\n        protected override void OnMouseMove(MouseEventArgs e)\n        {\n            base.OnMouseMove(e);\n\n            if (PieChart == null || m_values == null || m_values.Length <= 0)\n                return;\n\n            if (e.X == m_lastX && e.Y == m_lastY)\n                return;\n\n            if (m_mouseDown)\n            {\n                float newAngle = m_initialAngle - (e.X - m_lastX);\n                InitialAngle(newAngle);\n            }\n            else\n            {\n                int index = PieChart.FindPieSliceUnderPoint(new PointF(e.X, e.Y));\n\n                if (index != m_highlightedIndex)\n                {\n                    m_highlightedIndex = index;\n                    Refresh();\n                }\n\n                if (m_highlightedIndex != -1)\n                {\n                    if (m_drawToolTipTexts == null || m_drawToolTipTexts.Length <= m_highlightedIndex ||\n                        m_drawToolTipTexts[m_highlightedIndex].Length == 0)\n                    {\n                        m_toolTip.SetToolTip(this, m_values[m_highlightedIndex].ToString(CultureInfo.CurrentCulture));\n                    }\n                    else\n                        m_toolTip.SetToolTip(this, m_drawToolTipTexts[m_highlightedIndex]);\n                }\n                else\n                    m_toolTip.RemoveAll();\n            }\n\n            m_lastX = e.X;\n            m_lastY = e.Y;\n        }\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true to release both managed and unmanaged resources;\n        ///  false to release only unmanaged resources.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (m_disposed)\n                return;\n\n            try\n            {\n                if (disposing)\n                {\n                    PieChart?.Dispose();\n\n                    m_toolTip.Dispose();\n                }\n                m_disposed = true;\n            }\n            finally\n            {\n                base.Dispose(disposing);\n            }\n        }\n\n        /// <summary>\n        /// Gets a flag indicating if at least one value is nonzero.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if this instance has any value; otherwise, <c>false</c>.\n        /// </value>\n        private bool HasAnyValue => m_values != null && m_values.Any(angle => angle != 0);\n\n        /// <summary>\n        /// Gets the index.\n        /// </summary>\n        /// <param name=\"sliceIndex\">Index of the slice.</param>\n        /// <returns></returns>\n        public int GetIndex(int sliceIndex) => m_sortOrder[sliceIndex];\n\n        /// <summary>\n        /// Event for when the graph angle changes.\n        /// </summary>\n        public event EventHandler AngleChange;\n\n        /// <summary>\n        /// Event for when the graph angle changes\n        /// </summary>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnAngleChange(EventArgs e)\n        {\n            AngleChange?.ThreadSafeInvoke(this, e);\n        }\n\n        /// <summary>\n        /// Will copy the original data to the vars used for drawing.\n        /// The original is needed to use for ordering.\n        /// </summary>\n        private void CopyDataToDrawVars()\n        {\n            m_drawValues = (decimal[])m_values.Clone();\n            m_drawColors = (Color[])m_colors.Clone();\n            m_drawRelativeSliceDisplacements = (float[])m_relativeSliceDisplacements.Clone();\n            m_drawToolTipTexts = (string[])m_tootips.Clone();\n            m_drawTexts = (string[])m_texts.Clone();\n\n\n            // fill the sort order to default:\n            m_sortOrder = new int[m_values.Length];\n            for (int i = 0; i < m_values.Length; i++)\n            {\n                m_sortOrder[i] = i;\n            }\n        }\n\n        /// <summary>\n        /// Orders the slices.\n        /// </summary>\n        /// <param name=\"orderBySize\">if set to <c>true</c> [order by size].</param>\n        public void OrderSlices(bool orderBySize)\n        {\n            if (orderBySize && m_values != null)\n            {\n                // prefill the draw vars\n                CopyDataToDrawVars();\n\n                // take a copy of the original values\n                // then use it to do the calculations\n                decimal[] values = (decimal[])m_values.Clone();\n                Color[] colours = (Color[])m_colors.Clone();\n                float[] displacements = (float[])m_relativeSliceDisplacements.Clone();\n                string[] tooltips = (string[])m_tootips.Clone();\n                string[] texts = (string[])m_texts.Clone();\n\n                // reordering the slices\n                for (int num = 0; num < values.Length; num++)\n                {\n                    decimal tempsp = decimal.MinValue;\n                    int biggest = -1;\n                    for (int y = 0; y < values.Length; y++)\n                    {\n                        if (biggest == -1)\n                        {\n                            tempsp = values[y];\n                            biggest = y;\n                        }\n                        if (values[y] <= tempsp || values[y] <= 0)\n                            continue;\n\n                        tempsp = values[y];\n                        biggest = y;\n                    }\n\n                    m_drawValues[num] = values[biggest];\n                    m_drawTexts[num] = texts[biggest];\n                    m_drawRelativeSliceDisplacements[num] = displacements[biggest];\n                    m_drawToolTipTexts[num] = tooltips[biggest];\n                    m_drawColors[num] = colours[biggest];\n                    m_sortOrder[num] = biggest;\n                    values[biggest] = 0;\n                }\n            }\n            else\n            {\n                if (m_values != null)\n                    CopyDataToDrawVars();\n            }\n\n            Refresh();\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.PieChart/PieSlice.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Linq;\n\nnamespace EVEMon.PieChart\n{\n    /// <summary>\n    ///   Object representing 3D pie.\n    /// </summary>\n    public sealed class PieSlice : IDisposable, ICloneable\n    {\n        /// <summary>\n        ///   Actual start angle.\n        /// </summary>\n        private readonly float m_actualStartAngle;\n\n        /// <summary>\n        ///   Actual sweep angle.\n        /// </summary>\n        private readonly float m_actualSweepAngle;\n\n        /// <summary>\n        ///   Color of the surface.\n        /// </summary>\n        private readonly Color m_surfaceColor = Color.Empty;\n\n        /// <summary>\n        ///   Style used for shadow.\n        /// </summary>\n        private readonly ShadowStyle m_shadowStyle = ShadowStyle.NoShadow;\n\n        /// <summary>\n        ///   <c>EdgeColorType</c> used to draw pie sliece edges.\n        /// </summary>\n        private readonly EdgeColorType m_edgeColorType = EdgeColorType.NoEdge;\n\n        /// <summary>\n        ///   <c>Brush</c> used to render slice top surface.\n        /// </summary>\n        private Brush m_brushSurface;\n\n        /// <summary>\n        ///   <c>Brush</c> used to render slice top surface when highlighted.\n        /// </summary>\n        private Brush m_brushSurfaceHighlighted;\n\n        /// <summary>\n        ///   <c>Brush</c> used to render slice starting cut side.\n        /// </summary>\n        private Brush m_brushStartSide;\n\n        /// <summary>\n        ///   <c>Brush</c> used to render slice ending cut side.\n        /// </summary>\n        private Brush m_brushEndSide;\n\n        /// <summary>\n        ///   <c>Brush</c> used to render pie slice periphery (cylinder outer surface).\n        /// </summary>\n        private Brush m_brushPeripherySurface;\n\n        /// <summary>\n        ///   <c>Pen</c> object used to draw pie slice edges.\n        /// </summary>\n        private readonly Pen m_pen;\n\n        /// <summary>\n        ///   <c>PointF</c> corresponding to pie slice center.\n        /// </summary>\n        private PointF m_center;\n\n        /// <summary>\n        ///   <c>PointF</c> corresponding to the lower pie slice center.\n        /// </summary>\n        private PointF m_centerBelow;\n\n        /// <summary>\n        ///   <c>PointF</c> on the periphery corresponding to the start cut \n        ///   side.\n        /// </summary>\n        private PointF m_pointStart;\n\n        /// <summary>\n        ///   <c>PointF</c> on the periphery corresponding to the start cut \n        ///   side.\n        /// </summary>\n        private PointF m_pointStartBelow;\n\n        /// <summary>\n        ///   <c>PointF</c> on the periphery corresponding to the end cut \n        ///   side.\n        /// </summary>\n        private PointF m_pointEnd;\n\n        /// <summary>\n        ///   <c>PointF</c> on the periphery corresponding to the end cut \n        ///   side.\n        /// </summary>\n        private PointF m_pointEndBelow;\n\n        /// <summary>\n        ///   <c>Quadrilateral</c> representing the start side.\n        /// </summary>\n        private Quadrilateral m_startSide = new Quadrilateral();\n\n        /// <summary>\n        ///   <c>Quadrilateral</c> representing the end side.\n        /// </summary>\n        private Quadrilateral m_endSide = new Quadrilateral();\n\n        /// <summary>\n        ///   Flag indicating if object has been disposed.\n        /// </summary>\n        private bool m_disposed;\n\n        /// <summary>\n        ///   Angle offset used to define reference angle for gradual shadow.\n        /// </summary>\n        private const float ShadowAngle = 20F;\n\n        /// <summary>\n        ///   Initializes an empty instance of <c>PieSlice</c>.\n        /// </summary>\n        private PieSlice()\n        {\n        }\n\n        /// <summary>\n        ///   Initializes a new instance of flat <c>PieSlice</c> class with given \n        ///   bounds and visual style.\n        /// </summary>\n        /// <param name=\"boundingRectX\">\n        ///   x-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectY\">\n        ///   y-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectWidth\">\n        ///   Width of the rectangle that is used to draw the top surface of \n        ///   the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectHeight\">\n        ///   Height of the rectangle that is used to draw the top surface of \n        ///   the pie slice.\n        /// </param>\n        /// <param name=\"startAngle\">\n        ///   Starting angle (in degrees) of the pie slice.\n        /// </param>\n        /// <param name=\"sweepAngle\">\n        ///   Sweep angle (in degrees) of the pie slice.\n        /// </param>\n        /// <param name=\"surfaceColor\">\n        ///   Color used to paint the pie slice.\n        /// </param>\n        public PieSlice(float boundingRectX, float boundingRectY, float boundingRectWidth, float boundingRectHeight,\n            float startAngle, float sweepAngle, Color surfaceColor)\n            : this(\n                boundingRectX, boundingRectY, boundingRectWidth, boundingRectHeight, 0F, startAngle, sweepAngle, surfaceColor,\n                ShadowStyle.NoShadow, EdgeColorType.NoEdge)\n        {\n        }\n\n        /// <summary>\n        ///   Initializes a new instance of <c>PieSlice</c> class with given \n        ///   bounds and visual style.\n        /// </summary>\n        /// <param name=\"boundingRectX\">\n        ///   x-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectY\">\n        ///   y-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectWidth\">\n        ///   Width of the rectangle that is used to draw the top surface of \n        ///   the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectHeight\">\n        ///   Height of the rectangle that is used to draw the top surface of \n        ///   the pie slice.\n        /// </param>\n        /// <param name=\"sliceHeight\">\n        ///   Height of the pie slice.\n        /// </param>\n        /// <param name=\"startAngle\">\n        ///   Starting angle (in degrees) of the pie slice.\n        /// </param>\n        /// <param name=\"sweepAngle\">\n        ///   Sweep angle (in degrees) of the pie slice.\n        /// </param>\n        /// <param name=\"surfaceColor\">\n        ///   Color used to paint the pie slice.\n        /// </param>\n        /// <param name=\"shadowStyle\">\n        ///   Shadow style used for slice rendering.\n        /// </param>\n        /// <param name=\"edgeColorType\">\n        ///   Edge color style used for slice rendering.\n        /// </param>\n        public PieSlice(float boundingRectX, float boundingRectY, float boundingRectWidth, float boundingRectHeight,\n            float sliceHeight, float startAngle, float sweepAngle, Color surfaceColor, ShadowStyle shadowStyle,\n            EdgeColorType edgeColorType)\n            : this()\n        {\n            // set some persistent values\n            m_actualStartAngle = startAngle;\n            m_actualSweepAngle = sweepAngle;\n            m_surfaceColor = surfaceColor;\n            m_shadowStyle = shadowStyle;\n            m_edgeColorType = edgeColorType;\n            // create pens for rendering\n            Color edgeLineColor = EdgeColor.GetRenderingColor(edgeColorType, surfaceColor);\n            using (Pen pen = new Pen(edgeLineColor))\n            {\n                pen.LineJoin = LineJoin.Round;\n                m_pen = (Pen)pen.Clone();\n            }\n            InitializePieSlice(boundingRectX, boundingRectY, boundingRectWidth, boundingRectHeight, sliceHeight);\n        }\n\n        /// <summary>\n        ///   Initializes a new instance of <c>PieSlice</c> class with given \n        ///   bounds and visual style.\n        /// </summary>\n        /// <param name=\"boundingRect\">\n        ///   Bounding rectangle used to draw the top surface of the slice.\n        /// </param>\n        /// <param name=\"sliceHeight\">\n        ///   Pie slice height.\n        /// </param>\n        /// <param name=\"startAngle\">\n        ///   Starting angle (in degrees) of the pie slice.\n        /// </param>\n        /// <param name=\"sweepAngle\">\n        ///   Sweep angle (in degrees) of the pie slice.\n        /// </param>\n        /// <param name=\"surfaceColor\">\n        ///   Color used to render pie slice surface.\n        /// </param>\n        /// <param name=\"shadowStyle\">\n        ///   Shadow style used in rendering.\n        /// </param>\n        /// <param name=\"edgeColorType\">\n        ///   Edge color type used for rendering.\n        /// </param>\n        public PieSlice(RectangleF boundingRect, float sliceHeight, float startAngle, float sweepAngle, Color surfaceColor,\n            ShadowStyle shadowStyle, EdgeColorType edgeColorType)\n            : this(\n                boundingRect.X, boundingRect.Y, boundingRect.Width, boundingRect.Height, sliceHeight, startAngle, sweepAngle,\n                surfaceColor, shadowStyle, edgeColorType)\n        {\n        }\n\n        /// <summary>\n        ///   Initializes a new instance of <c>PieSlice</c> class with given \n        ///   bounds and visual style.\n        /// </summary>\n        /// <param name=\"boundingRectX\">\n        ///   x-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectY\">\n        ///   y-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectWidth\">\n        ///   Width of the rectangle that is used to draw the top surface of \n        ///   the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectHeight\">\n        ///   Height of the rectangle that is used to draw the top surface of \n        ///   the pie slice.\n        /// </param>\n        /// <param name=\"sliceHeight\">\n        ///   Height of the pie slice.\n        /// </param>\n        /// <param name=\"startAngle\">\n        ///   Starting angle (in degrees) of the pie slice.\n        /// </param>\n        /// <param name=\"sweepAngle\">\n        ///   Sweep angle (in degrees) of the pie slice.\n        /// </param>\n        /// <param name=\"surfaceColor\">\n        ///   Color used to render pie slice surface.\n        /// </param>\n        /// <param name=\"shadowStyle\">\n        ///   Shadow style used in rendering.\n        /// </param>\n        /// <param name=\"edgeColorType\">\n        ///   Edge color type used for rendering.\n        /// </param>\n        /// <param name=\"edgeLineWidth\">\n        ///   Edge line width.\n        /// </param>\n        public PieSlice(float boundingRectX, float boundingRectY, float boundingRectWidth, float boundingRectHeight,\n            float sliceHeight, float startAngle, float sweepAngle, Color surfaceColor, ShadowStyle shadowStyle,\n            EdgeColorType edgeColorType, float edgeLineWidth)\n            : this(\n                boundingRectX, boundingRectY, boundingRectWidth, boundingRectHeight, sliceHeight, startAngle, sweepAngle,\n                surfaceColor, shadowStyle, edgeColorType)\n        {\n            m_pen.Width = edgeLineWidth;\n        }\n\n        /// <summary>\n        ///   Initializes a new instance of <c>PieSlice</c> class with given \n        ///   bounds and visual style.\n        /// </summary>\n        /// <param name=\"boundingRect\">\n        ///   Bounding rectangle used to draw the top surface of the pie slice.\n        /// </param>\n        /// <param name=\"sliceHeight\">\n        ///   Pie slice height.\n        /// </param>\n        /// <param name=\"startAngle\">\n        ///   Starting angle (in degrees) of the pie slice.\n        /// </param>\n        /// <param name=\"sweepAngle\">\n        ///   Sweep angle (in degrees) of the pie slice.\n        /// </param>\n        /// <param name=\"surfaceColor\">\n        ///   Color used to render pie slice surface.\n        /// </param>\n        /// <param name=\"shadowStyle\">\n        ///   Shadow style used in rendering.\n        /// </param>\n        /// <param name=\"edgeColorType\">\n        ///   Edge color type used for rendering.\n        /// </param>\n        /// <param name=\"edgeLineWidth\">\n        ///   Edge line width.\n        /// </param>\n        public PieSlice(Rectangle boundingRect, float sliceHeight, float startAngle, float sweepAngle, Color surfaceColor,\n            ShadowStyle shadowStyle, EdgeColorType edgeColorType, float edgeLineWidth)\n            : this(\n                boundingRect.X, boundingRect.Y, boundingRect.Width, boundingRect.Height, sliceHeight, startAngle, sweepAngle,\n                surfaceColor, shadowStyle, edgeColorType, edgeLineWidth)\n        {\n        }\n\n        /// <summary>\n        ///   <c>Finalize</c> implementation\n        /// </summary>\n        ~PieSlice()\n        {\n            Dispose(false);\n        }\n\n        /// <summary>\n        ///   Implementation of <c>IDisposable</c> interface.\n        /// </summary>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        ///   Disposes of all resources used by <c>PieSlice</c> object.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        private void Dispose(bool disposing)\n        {\n            if (m_disposed)\n                return;\n\n            if (disposing)\n            {\n                Debug.Assert(m_pen != null);\n                m_pen.Dispose();\n                DisposeBrushes();\n                Debug.Assert(m_startSide != null);\n                m_startSide.Dispose();\n                Debug.Assert(m_endSide != null);\n                m_endSide.Dispose();\n            }\n            m_disposed = true;\n        }\n\n        /// <summary>\n        ///   Implementation of ICloneable interface.\n        /// </summary>\n        /// <returns>\n        ///   A deep copy of this object.\n        /// </returns>\n        public object Clone()\n            => new PieSlice(BoundingRectangle, SliceHeight, m_actualStartAngle, m_actualSweepAngle, m_surfaceColor, m_shadowStyle,\n                m_edgeColorType);\n\n        /// <summary>\n        ///   Gets starting angle (in degrees) of the pie slice.\n        /// </summary>\n        public float StartAngle { get; private set; }\n\n        /// <summary>\n        ///   Gets sweep angle (in degrees) of the pie slice.\n        /// </summary>\n        public float SweepAngle { get; private set; }\n\n        /// <summary>\n        ///   Gets ending angle (in degrees) of the pie slice.\n        /// </summary>\n        public float EndAngle => (StartAngle + SweepAngle) % 360;\n\n        /// <summary>\n        /// Gets or sets the text.\n        /// </summary>\n        /// <value>The text.</value>\n        public string Text { get; set; }\n\n        /// <summary>\n        ///   Gets or sets the bounding rectangle.\n        /// </summary>\n        internal RectangleF BoundingRectangle { get; private set; }\n\n        /// <summary>\n        ///   Gets or sets the slice height.\n        /// </summary>\n        internal float SliceHeight { get; private set; }\n\n        /// <summary>\n        ///   Draws the pie slice.\n        /// </summary>\n        /// <param name=\"graphics\">\n        ///   <c>Graphics</c> used to draw the pie slice.\n        /// </param>\n        public void Draw(Graphics graphics)\n        {\n            DrawBottom(graphics);\n            DrawSides(graphics);\n            DrawTop(graphics);\n        }\n\n        /// <summary>\n        ///   Checks if given pie slice contains given point.\n        /// </summary>\n        /// <param name=\"point\">\n        ///   <c>PointF</c> to check.\n        /// </param>\n        /// <returns>\n        ///   <c>true</c> if point given is contained within the slice.\n        /// </returns>\n        public bool Contains(PointF point) => PieSliceContainsPoint(point)\n                                              || PeripheryContainsPoint(point)\n                                              || m_startSide.Contains(point)\n                                              || m_endSide.Contains(point);\n\n        /// <summary>\n        ///   Evaluates the point in the middle of the slice.\n        /// </summary>\n        /// <returns>\n        ///   <c>PointF</c> in the middle of the pie top.\n        /// </returns>\n        public PointF GetTextPosition\n        {\n            get\n            {\n                if (SweepAngle >= 180)\n                {\n                    return PeripheralPoint(m_center.X, m_center.Y, BoundingRectangle.Width / 3, BoundingRectangle.Height / 3,\n                        GetActualAngle(StartAngle) + SweepAngle / 2);\n                }\n\n                float x = (m_pointStart.X + m_pointEnd.X) / 2;\n                float y = (m_pointStart.Y + m_pointEnd.Y) / 2;\n                float angle = (float)(Math.Atan2(y - m_center.Y, x - m_center.X) * 180 / Math.PI);\n                return PeripheralPoint(m_center.X, m_center.Y, BoundingRectangle.Width / 3, BoundingRectangle.Height / 3,\n                    GetActualAngle(angle));\n            }\n        }\n\n        /// <summary>\n        ///   Evaluates the point in the middle of the slice.\n        /// </summary>\n        /// <returns>\n        ///   <c>PointF</c> in the middle of the pie top.\n        /// </returns>\n        public PointF GetTextPositionOut(float div)\n        {\n            if (SweepAngle >= 180)\n            {\n                return PeripheralPoint(m_center.X, m_center.Y, BoundingRectangle.Width / div, BoundingRectangle.Height / div,\n                    GetActualAngle(StartAngle) + SweepAngle / 2);\n            }\n\n            float x = (m_pointStart.X + m_pointEnd.X) / 2;\n            float y = (m_pointStart.Y + m_pointEnd.Y) / 2;\n            float angle = (float)(Math.Atan2(y - m_center.Y, x - m_center.X) * 180 / Math.PI);\n            return PeripheralPoint(m_center.X, m_center.Y, BoundingRectangle.Width / div, BoundingRectangle.Height / div,\n                GetActualAngle(angle));\n        }\n\n        /// <summary>\n        ///   Draws pie slice sides.\n        /// </summary>\n        /// <param name=\"graphics\">\n        ///   <c>Graphics</c> used to draw the pie slice.\n        /// </param>\n        internal void DrawSides(Graphics graphics)\n        {\n            DrawHiddenPeriphery(graphics);\n            // draw wegde sides\n            if (StartAngle > 90 && StartAngle < 270)\n            {\n                DrawEndSide(graphics);\n                DrawStartSide(graphics);\n            }\n            else\n            {\n                DrawStartSide(graphics);\n                DrawEndSide(graphics);\n            }\n            DrawVisiblePeriphery(graphics);\n        }\n\n        /// <summary>\n        ///   Splits a pie slice into two on the split angle.\n        /// </summary>\n        /// <param name=\"splitAngle\">\n        ///   Angle at which splitting is performed.\n        /// </param>\n        /// <returns>\n        ///   An array of two pie  slices.\n        /// </returns>\n        internal PieSlice[] Split(float splitAngle)\n        {\n            // if split angle equals one of bounding angles, then nothing to split\n            if (Math.Abs(StartAngle - splitAngle) < float.Epsilon || Math.Abs(EndAngle - splitAngle) < float.Epsilon)\n                return new[] { (PieSlice)Clone() };\n\n            float actualStartAngle = GetActualAngle(StartAngle);\n            float newSweepAngle = (splitAngle - actualStartAngle + 360) % 360;\n            using (PieSlice pieSlice1 = new PieSlice(BoundingRectangle, SliceHeight, actualStartAngle,\n                newSweepAngle, m_surfaceColor, m_shadowStyle, m_edgeColorType))\n            {\n                pieSlice1.InitializeSides(true, false);\n\n                newSweepAngle = GetActualAngle(EndAngle) - splitAngle;\n                using (PieSlice pieSlice2 = new PieSlice(BoundingRectangle, SliceHeight, splitAngle, newSweepAngle,\n                    m_surfaceColor, m_shadowStyle, m_edgeColorType))\n                {\n                    pieSlice2.InitializeSides(false);\n                    return new[] { (PieSlice)pieSlice1.Clone(), (PieSlice)pieSlice2.Clone() };\n                }\n            }\n        }\n\n        /// <summary>\n        ///   Readjusts the pie slice to fit new bounding rectangle provided.\n        /// </summary>\n        /// <param name=\"boundingRectX\">\n        ///   x-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectY\">\n        ///   y-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectWidth\">\n        ///   Width of the rectangle that is used to draw the top surface of \n        ///   the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectHeight\">\n        ///   Height of the rectangle that is used to draw the top surface of \n        ///   the pie slice.\n        /// </param>\n        /// <param name=\"sliceHeight\">\n        ///   Height of the pie slice.\n        /// </param>\n        internal void Readjust(float boundingRectX, float boundingRectY, float boundingRectWidth, float boundingRectHeight,\n            float sliceHeight)\n        {\n            InitializePieSlice(boundingRectX, boundingRectY, boundingRectWidth, boundingRectHeight, sliceHeight);\n        }\n\n        /// <summary>\n        ///   Draws visible start side.\n        /// </summary>\n        /// <param name=\"graphics\">\n        ///   <c>Graphics</c> used to draw the pie slice.\n        /// </param>\n        private void DrawStartSide(Graphics graphics)\n        {\n            if (m_startSide == null)\n                return;\n\n            // checks if the side is visible \n            if (StartAngle > 90 && StartAngle < 270)\n                m_startSide.Draw(graphics, m_pen, m_brushStartSide);\n            else\n                m_startSide.Draw(graphics, m_pen, m_brushSurface);\n        }\n\n        /// <summary>\n        ///   Draws visible end side.\n        /// </summary>\n        /// <param name=\"graphics\">\n        ///   <c>Graphics</c> used to draw the pie slice.\n        /// </param>\n        private void DrawEndSide(Graphics graphics)\n        {\n            if (m_endSide == null)\n                return;\n\n            // checks if the side is visible \n            if (EndAngle > 90 && EndAngle < 270)\n                m_endSide.Draw(graphics, m_pen, m_brushSurface);\n            else\n                m_endSide.Draw(graphics, m_pen, m_brushEndSide);\n        }\n\n        /// <summary>\n        ///   Draws visible outer periphery of the pie slice.\n        /// </summary>\n        /// <param name=\"graphics\">\n        ///   <c>Graphics</c> used to draw the pie slice.\n        /// </param>\n        private void DrawVisiblePeriphery(Graphics graphics)\n        {\n            IEnumerable<PeripherySurfaceBounds> peripherySurfaceBounds = GetVisiblePeripherySurfaceBounds();\n            foreach (PeripherySurfaceBounds surfaceBounds in peripherySurfaceBounds)\n            {\n                DrawCylinderSurfaceSection(graphics, m_pen, m_brushPeripherySurface, surfaceBounds.StartAngle,\n                    surfaceBounds.EndAngle, surfaceBounds.StartPoint, surfaceBounds.EndPoint);\n            }\n        }\n\n        /// <summary>\n        ///   Draws hidden outer periphery of the pie slice.\n        /// </summary>\n        /// <param name=\"graphics\">\n        ///   <c>Graphics</c> used to draw the pie slice.\n        /// </param>\n        private void DrawHiddenPeriphery(Graphics graphics)\n        {\n            IEnumerable<PeripherySurfaceBounds> peripherySurfaceBounds = GetHiddenPeripherySurfaceBounds();\n            foreach (PeripherySurfaceBounds surfaceBounds in peripherySurfaceBounds)\n            {\n                DrawCylinderSurfaceSection(graphics, m_pen, m_brushSurface, surfaceBounds.StartAngle, surfaceBounds.EndAngle,\n                    surfaceBounds.StartPoint, surfaceBounds.EndPoint);\n            }\n        }\n\n        /// <summary>\n        ///   Draws the bottom of the pie slice.\n        /// </summary>\n        /// <param name=\"graphics\">\n        ///   <c>Graphics</c> used to draw the pie slice.\n        /// </param>\n        internal void DrawBottom(Graphics graphics)\n        {\n            graphics.FillPie(m_brushSurface, BoundingRectangle.X, BoundingRectangle.Y + SliceHeight,\n                BoundingRectangle.Width, BoundingRectangle.Height, StartAngle, SweepAngle);\n            graphics.DrawPie(m_pen, BoundingRectangle.X, BoundingRectangle.Y + SliceHeight, BoundingRectangle.Width,\n                BoundingRectangle.Height, StartAngle, SweepAngle);\n        }\n\n        /// <summary>\n        ///   Draws the top of the pie slice.\n        /// </summary>\n        /// <param name=\"graphics\">\n        ///   <c>Graphics</c> used to draw the pie slice.\n        /// </param>\n        internal void DrawTop(Graphics graphics)\n        {\n            graphics.FillPie(m_brushSurface, BoundingRectangle.X, BoundingRectangle.Y, BoundingRectangle.Width,\n                BoundingRectangle.Height, StartAngle, SweepAngle);\n            graphics.DrawPie(m_pen, BoundingRectangle, StartAngle, SweepAngle);\n        }\n\n        /// <summary>\n        ///   Calculates the smallest rectangle into which this pie slice fits.\n        /// </summary>\n        /// <returns>\n        ///   <c>RectangleF</c> into which this pie slice fits exactly.\n        /// </returns>\n        internal RectangleF GetFittingRectangle()\n        {\n            RectangleF boundingRectangle = new RectangleF(m_pointStart.X, m_pointStart.Y, 0, 0);\n            if ((Math.Abs(StartAngle) < float.Epsilon) || (StartAngle + SweepAngle >= 360))\n                boundingRectangle = GraphicsUtil.IncludePointX(boundingRectangle, BoundingRectangle.Right);\n\n            if ((StartAngle <= 90) && (StartAngle + SweepAngle >= 90) || (StartAngle + SweepAngle >= 450))\n                boundingRectangle = GraphicsUtil.IncludePointY(boundingRectangle, BoundingRectangle.Bottom + SliceHeight);\n\n            if ((StartAngle <= 180) && (StartAngle + SweepAngle >= 180) || (StartAngle + SweepAngle >= 540))\n                boundingRectangle = GraphicsUtil.IncludePointX(boundingRectangle, BoundingRectangle.Left);\n\n            if ((StartAngle <= 270) && (StartAngle + SweepAngle >= 270) || (StartAngle + SweepAngle >= 630))\n                boundingRectangle = GraphicsUtil.IncludePointY(boundingRectangle, BoundingRectangle.Top);\n\n            boundingRectangle = GraphicsUtil.IncludePoint(boundingRectangle, m_center);\n            boundingRectangle = GraphicsUtil.IncludePoint(boundingRectangle, m_centerBelow);\n            boundingRectangle = GraphicsUtil.IncludePoint(boundingRectangle, m_pointStart);\n            boundingRectangle = GraphicsUtil.IncludePoint(boundingRectangle, m_pointStartBelow);\n            boundingRectangle = GraphicsUtil.IncludePoint(boundingRectangle, m_pointEnd);\n            boundingRectangle = GraphicsUtil.IncludePoint(boundingRectangle, m_pointEndBelow);\n\n            return boundingRectangle;\n        }\n\n        /// <summary>\n        ///   Checks if given point is contained inside the pie slice.\n        /// </summary>\n        /// <param name=\"point\">\n        ///   <c>PointF</c> to check for.\n        /// </param>\n        /// <returns>\n        ///   <c>true</c> if given point is inside the pie slice.\n        /// </returns>\n        internal bool PieSliceContainsPoint(PointF point)\n            => PieSliceContainsPoint(point, BoundingRectangle.X, BoundingRectangle.Y, BoundingRectangle.Width,\n                BoundingRectangle.Height, StartAngle, SweepAngle);\n\n        /// <summary>\n        ///   Checks if given point is contained by cylinder periphery.\n        /// </summary>\n        /// <param name=\"point\">\n        ///   <c>PointF</c> to check for.\n        /// </param>\n        /// <returns>\n        ///   <c>true</c> if given point is inside the cylinder periphery.\n        /// </returns>\n        internal bool PeripheryContainsPoint(PointF point)\n        {\n            IEnumerable<PeripherySurfaceBounds> peripherySurfaceBounds = GetVisiblePeripherySurfaceBounds();\n            return\n                peripherySurfaceBounds.Any(\n                    surfaceBounds => CylinderSurfaceSectionContainsPoint(point, surfaceBounds.StartPoint, surfaceBounds.EndPoint));\n        }\n\n        /// <summary>\n        ///   Checks if point provided is inside pie slice start cut side.\n        /// </summary>\n        /// <param name=\"point\">\n        ///   <c>PointF</c> to check.\n        /// </param>\n        /// <returns>\n        ///   <c>true</c> if point is inside the start side.\n        /// </returns>\n        internal bool StartSideContainsPoint(PointF point) => SliceHeight > 0 && m_startSide.Contains(point);\n\n        /// <summary>\n        ///   Checks if point provided is inside pie slice end cut side.\n        /// </summary>\n        /// <param name=\"point\">\n        ///   <c>PointF</c> to check.\n        /// </param>\n        /// <returns>\n        ///   <c>true</c> if point is inside the end side.\n        /// </returns>\n        internal bool EndSideContainsPoint(PointF point) => SliceHeight > 0 && m_endSide.Contains(point);\n\n        /// <summary>\n        ///   Checks if bottom side of the pie slice contains the point.\n        /// </summary>\n        /// <param name=\"point\">\n        ///   <c>PointF</c> to check.\n        /// </param>\n        /// <returns>\n        ///   <c>true</c> if point is inside the bottom of the pie slice.\n        /// </returns>\n        internal bool BottomSurfaceSectionContainsPoint(PointF point)\n        {\n            if (SliceHeight > 0)\n            {\n                return\n                    PieSliceContainsPoint(point, BoundingRectangle.X, BoundingRectangle.Y + SliceHeight,\n                        BoundingRectangle.Width, BoundingRectangle.Height, StartAngle, SweepAngle);\n            }\n            return false;\n        }\n\n        /// <summary>\n        ///   Creates brushes used to render the pie slice.\n        /// </summary>\n        /// <param name=\"surfaceColor\">\n        ///   Color used for rendering.\n        /// </param>\n        /// <param name=\"shadowStyle\">\n        ///   Shadow style used for rendering.\n        /// </param>\n        private void CreateSurfaceBrushes(Color surfaceColor, ShadowStyle shadowStyle)\n        {\n            m_brushSurface = new SolidBrush(surfaceColor);\n            m_brushSurfaceHighlighted =\n                new SolidBrush(ColorUtil.CreateColorWithCorrectedLightness(surfaceColor, ColorUtil.BrightnessEnhancementFactor1));\n            switch (shadowStyle)\n            {\n                case ShadowStyle.NoShadow:\n                    m_brushStartSide = m_brushEndSide = m_brushPeripherySurface = new SolidBrush(surfaceColor);\n                    break;\n                case ShadowStyle.UniformShadow:\n                    m_brushStartSide =\n                        m_brushEndSide =\n                            m_brushPeripherySurface =\n                                new SolidBrush(ColorUtil.CreateColorWithCorrectedLightness(surfaceColor,\n                                    -ColorUtil.BrightnessEnhancementFactor1));\n                    break;\n                case ShadowStyle.GradualShadow:\n                    double angle = StartAngle - 180 - ShadowAngle;\n                    if (angle < 0)\n                        angle += 360;\n                    m_brushStartSide = CreateBrushForSide(surfaceColor, angle);\n                    angle = StartAngle + SweepAngle - ShadowAngle;\n                    if (angle < 0)\n                        angle += 360;\n                    m_brushEndSide = CreateBrushForSide(surfaceColor, angle);\n                    m_brushPeripherySurface = CreateBrushForPeriphery(surfaceColor);\n                    break;\n            }\n        }\n\n        /// <summary>\n        ///   Disposes brush objects.\n        /// </summary>\n        private void DisposeBrushes()\n        {\n            Debug.Assert(m_brushSurface != null);\n            Debug.Assert(m_brushStartSide != null);\n            Debug.Assert(m_brushEndSide != null);\n            Debug.Assert(m_brushPeripherySurface != null);\n            Debug.Assert(m_brushSurfaceHighlighted != null);\n\n            m_brushSurface.Dispose();\n            m_brushStartSide.Dispose();\n            m_brushEndSide.Dispose();\n            m_brushPeripherySurface.Dispose();\n            m_brushSurfaceHighlighted.Dispose();\n        }\n\n        /// <summary>\n        ///   Creates a brush for start and end sides of the pie slice for \n        ///   gradual  shade.\n        /// </summary>\n        /// <param name=\"color\">\n        ///   Color used for pie slice rendering.\n        /// </param>\n        /// <param name=\"angle\">\n        ///   Angle of the surface.\n        /// </param>\n        /// <returns>\n        ///   <c>Brush</c> object.\n        /// </returns>\n        private static Brush CreateBrushForSide(Color color, double angle)\n            => new SolidBrush(ColorUtil.CreateColorWithCorrectedLightness(color,\n                -(float)\n                    (ColorUtil.BrightnessEnhancementFactor1 *\n                     (1 - 0.8 * Math.Cos(angle * Math.PI / 180)))));\n\n        /// <summary>\n        ///   Creates a brush for outer periphery of the pie slice used for \n        ///   gradual shadow.\n        /// </summary>\n        /// <param name=\"color\">\n        ///   Color used for pie slice rendering.\n        /// </param>\n        /// <returns>\n        ///   <c>Brush</c> object.\n        /// </returns>\n        private Brush CreateBrushForPeriphery(Color color)\n        {\n            ColorBlend colorBlend = new ColorBlend\n            {\n                Colors = new[]\n                {\n                    ColorUtil.CreateColorWithCorrectedLightness(color,\n                        -ColorUtil.\n                            BrightnessEnhancementFactor1 /\n                        2),\n                    color,\n                    ColorUtil.CreateColorWithCorrectedLightness(color,\n                        -ColorUtil.\n                            BrightnessEnhancementFactor1)\n                },\n                Positions = new[] { 0F, 0.1F, 1.0F }\n            };\n\n            using (LinearGradientBrush brush = new LinearGradientBrush(BoundingRectangle, Color.Blue, Color.White,\n                LinearGradientMode.Horizontal))\n            {\n                brush.InterpolationColors = colorBlend;\n                return (LinearGradientBrush)brush.Clone();\n            }\n        }\n\n        /// <summary>\n        ///   Draws the outer periphery of the pie slice.\n        /// </summary>\n        /// <param name=\"graphics\">\n        ///   <c>Graphics</c> object used to draw the surface.\n        /// </param>\n        /// <param name=\"pen\">\n        ///   <c>Pen</c> used to draw outline.\n        /// </param>\n        /// <param name=\"brush\">\n        ///   <c>Brush</c> used to fill the quadrilateral.\n        /// </param>\n        /// <param name=\"startAngle\">\n        ///   Start angle (in degrees) of the periphery section.\n        /// </param>\n        /// <param name=\"endAngle\">\n        ///   End angle (in degrees) of the periphery section.\n        /// </param>\n        /// <param name=\"pointStart\">\n        ///   Point representing the start of the periphery.\n        /// </param>\n        /// <param name=\"pointEnd\">\n        ///   Point representing the end of the periphery.\n        /// </param>\n        private void DrawCylinderSurfaceSection(Graphics graphics, Pen pen, Brush brush, float startAngle, float endAngle,\n            PointF pointStart, PointF pointEnd)\n        {\n            GraphicsPath path = CreatePathForCylinderSurfaceSection(startAngle, endAngle, pointStart, pointEnd);\n            graphics.FillPath(brush, path);\n            graphics.DrawPath(pen, path);\n        }\n\n        /// <summary>\n        ///   Transforms actual angle to angle used for rendering. They are \n        ///   different because of perspective.\n        /// </summary>\n        /// <param name=\"angle\">\n        ///   Actual angle.\n        /// </param>\n        /// <returns>\n        ///   Rendering angle.\n        /// </returns>\n        private float TransformAngle(float angle)\n        {\n            double x = BoundingRectangle.Width * Math.Cos(angle * Math.PI / 180);\n            double y = BoundingRectangle.Height * Math.Sin(angle * Math.PI / 180);\n            float result = (float)(Math.Atan2(y, x) * 180 / Math.PI);\n            if (result < 0)\n                return result + 360;\n            return result;\n        }\n\n        /// <summary>\n        ///   Gets the actual angle from the rendering angle.\n        /// </summary>\n        /// <param name=\"transformedAngle\">\n        ///   Transformed angle for which actual angle has to be evaluated.\n        /// </param>\n        /// <returns>\n        ///   Actual angle.\n        /// </returns>\n        private float GetActualAngle(float transformedAngle)\n        {\n            double x = BoundingRectangle.Height * Math.Cos(transformedAngle * Math.PI / 180);\n            double y = BoundingRectangle.Width * Math.Sin(transformedAngle * Math.PI / 180);\n            float result = (float)(Math.Atan2(y, x) * 180 / Math.PI);\n            if (result < 0)\n                return result + 360;\n            return result;\n        }\n\n        /// <summary>\n        ///   Calculates the point on ellipse periphery for angle.\n        /// </summary>\n        /// <param name=\"xCenter\">\n        ///   x-coordinate of the center of the ellipse.\n        /// </param>\n        /// <param name=\"yCenter\">\n        ///   y-coordinate of the center of the ellipse.\n        /// </param>\n        /// <param name=\"semiMajor\">\n        ///   Horizontal semi-axis.\n        /// </param>\n        /// <param name=\"semiMinor\">\n        ///   Vertical semi-axis.\n        /// </param>\n        /// <param name=\"angleDegrees\">\n        ///   Angle (in degrees) for which corresponding periphery point has to \n        ///   be obtained.\n        /// </param>\n        /// <returns>\n        ///   <c>PointF</c> on the ellipse.\n        /// </returns>\n        private static PointF PeripheralPoint(float xCenter, float yCenter, float semiMajor, float semiMinor, float angleDegrees)\n        {\n            double angleRadians = angleDegrees * Math.PI / 180;\n            return new PointF(xCenter + (float)(semiMajor * Math.Cos(angleRadians)),\n                yCenter + (float)(semiMinor * Math.Sin(angleRadians)));\n        }\n\n        /// <summary>\n        ///   Initializes pie bounding rectangle, pie height, corners \n        ///   coordinates and brushes used for rendering.\n        /// </summary>\n        /// <param name=\"boundingRectX\">\n        ///   x-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectY\">\n        ///   y-coordinate of the upper-left corner of the rectangle that is \n        ///   used to draw the top surface of the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectWidth\">\n        ///   Width of the rectangle that is used to draw the top surface of \n        ///   the pie slice.\n        /// </param>\n        /// <param name=\"boundingRectHeight\">\n        ///   Height of the rectangle that is used to draw the top surface of \n        ///   the pie slice.\n        /// </param>\n        /// <param name=\"sliceHeight\">\n        ///   Height of the pie slice.\n        /// </param>\n        private void InitializePieSlice(float boundingRectX, float boundingRectY, float boundingRectWidth,\n            float boundingRectHeight, float sliceHeight)\n        {\n            // stores bounding rectangle and pie slice height\n            BoundingRectangle = new RectangleF(boundingRectX, boundingRectY, boundingRectWidth, boundingRectHeight);\n            SliceHeight = sliceHeight;\n            // recalculates start and sweep angle used for rendering\n            StartAngle = TransformAngle(m_actualStartAngle);\n            SweepAngle = m_actualSweepAngle;\n            if (Math.Abs(SweepAngle % 180) > float.Epsilon)\n                SweepAngle = TransformAngle(m_actualStartAngle + m_actualSweepAngle) - StartAngle;\n            if (SweepAngle < 0)\n                SweepAngle += 360;\n            // creates brushes\n            CreateSurfaceBrushes(m_surfaceColor, m_shadowStyle);\n            // calculates center and end points on periphery\n            float xCenter = boundingRectX + boundingRectWidth / 2;\n            float yCenter = boundingRectY + boundingRectHeight / 2;\n            m_center = new PointF(xCenter, yCenter);\n            m_centerBelow = new PointF(xCenter, yCenter + sliceHeight);\n            m_pointStart = PeripheralPoint(xCenter, yCenter, boundingRectWidth / 2, boundingRectHeight / 2, m_actualStartAngle);\n            m_pointStartBelow = new PointF(m_pointStart.X, m_pointStart.Y + sliceHeight);\n            m_pointEnd = PeripheralPoint(xCenter, yCenter, boundingRectWidth / 2, boundingRectHeight / 2,\n                m_actualStartAngle + m_actualSweepAngle);\n            m_pointEndBelow = new PointF(m_pointEnd.X, m_pointEnd.Y + sliceHeight);\n            InitializeSides();\n        }\n\n        /// <summary>\n        ///   Initializes start and end pie slice sides.\n        /// </summary>\n        /// <param name=\"startSideExists\">\n        ///   Does start side exists.\n        /// </param>\n        /// <param name=\"endSideExists\">\n        ///   Does end side exists.\n        /// </param>\n        private void InitializeSides(bool startSideExists = true, bool endSideExists = true)\n        {\n            m_startSide = startSideExists\n                ? new Quadrilateral(m_center, m_pointStart, m_pointStartBelow, m_centerBelow,\n                    Math.Abs(SweepAngle - 180) > float.Epsilon)\n                : new Quadrilateral();\n            m_endSide = endSideExists\n                ? new Quadrilateral(m_center, m_pointEnd, m_pointEndBelow, m_centerBelow,\n                    Math.Abs(SweepAngle - 180) > float.Epsilon)\n                : new Quadrilateral();\n        }\n\n        /// <summary>\n        ///   Gets an array of visible periphery bounds.\n        /// </summary>\n        /// <returns>\n        ///   Array of <c>PeripherySurfaceBounds</c> objects.\n        /// </returns>\n        private IEnumerable<PeripherySurfaceBounds> GetVisiblePeripherySurfaceBounds()\n        {\n            ArrayList peripherySurfaceBounds = new ArrayList();\n            // outer periphery side is visible only when startAngle or endAngle \n            // is between 0 and 180 degrees\n            if (Math.Abs(SweepAngle) < float.Epsilon || (StartAngle >= 180 && StartAngle + SweepAngle <= 360))\n                return (PeripherySurfaceBounds[])peripherySurfaceBounds.ToArray(typeof(PeripherySurfaceBounds));\n\n            // draws the periphery from start angle to the end angle or left\n            // edge, whichever comes first\n            PointF x1 = new PointF(m_pointStart.X, m_pointStart.Y);\n            float fi2 = EndAngle;\n            PointF x2 = new PointF(m_pointEnd.X, m_pointEnd.Y);\n            if (StartAngle < 180)\n            {\n                if (StartAngle + SweepAngle > 180)\n                {\n                    fi2 = 180;\n                    x2.X = BoundingRectangle.X;\n                    x2.Y = m_center.Y;\n                }\n                peripherySurfaceBounds.Add(new PeripherySurfaceBounds(StartAngle, fi2, x1, x2));\n            }\n\n            // if lateral surface is visible from the right edge \n            if (!(StartAngle + SweepAngle > 360))\n                return (PeripherySurfaceBounds[])peripherySurfaceBounds.ToArray(typeof(PeripherySurfaceBounds));\n\n            x1 = new PointF(BoundingRectangle.Right, m_center.Y);\n            fi2 = EndAngle;\n            x2 = new PointF(m_pointEnd.X, m_pointEnd.Y);\n            if (fi2 > 180)\n            {\n                fi2 = 180;\n                x2.X = BoundingRectangle.Left;\n                x2.Y = m_center.Y;\n            }\n            peripherySurfaceBounds.Add(new PeripherySurfaceBounds(0, fi2, x1, x2));\n            return (PeripherySurfaceBounds[])peripherySurfaceBounds.ToArray(typeof(PeripherySurfaceBounds));\n        }\n\n        /// <summary>\n        ///   Gets an array of hidden periphery bounds.\n        /// </summary>\n        /// <returns>\n        ///   Array of <c>PeripherySurfaceBounds</c> objects.\n        /// </returns>\n        private IEnumerable<PeripherySurfaceBounds> GetHiddenPeripherySurfaceBounds()\n        {\n            ArrayList peripherySurfaceBounds = new ArrayList();\n            // outer periphery side is not visible when startAngle or endAngle \n            // is between 180 and 360 degrees\n            if (Math.Abs(SweepAngle) < float.Epsilon || (StartAngle >= 0 && StartAngle + SweepAngle <= 180))\n                return (PeripherySurfaceBounds[])peripherySurfaceBounds.ToArray(typeof(PeripherySurfaceBounds));\n\n            // draws the periphery from start angle to the end angle or right\n            // edge, whichever comes first\n            if (!(StartAngle + SweepAngle > 180))\n                return (PeripherySurfaceBounds[])peripherySurfaceBounds.ToArray(typeof(PeripherySurfaceBounds));\n\n            float fi1 = StartAngle;\n            PointF x1 = new PointF(m_pointStart.X, m_pointStart.Y);\n            float fi2 = StartAngle + SweepAngle;\n            PointF x2 = new PointF(m_pointEnd.X, m_pointEnd.Y);\n            if (fi1 < 180)\n            {\n                fi1 = 180;\n                x1.X = BoundingRectangle.Left;\n                x1.Y = m_center.Y;\n            }\n            if (fi2 > 360)\n            {\n                fi2 = 360;\n                x2.X = BoundingRectangle.Right;\n                x2.Y = m_center.Y;\n            }\n            peripherySurfaceBounds.Add(new PeripherySurfaceBounds(fi1, fi2, x1, x2));\n\n            // if pie is crossing 360 & 180 deg. boundary, we have to \n            // invisible peripheries\n            if (!(StartAngle < 360) || !(StartAngle + SweepAngle > 540))\n                return (PeripherySurfaceBounds[])peripherySurfaceBounds.ToArray(typeof(PeripherySurfaceBounds));\n\n            fi1 = 180;\n            x1 = new PointF(BoundingRectangle.Left, m_center.Y);\n            fi2 = EndAngle;\n            x2 = new PointF(m_pointEnd.X, m_pointEnd.Y);\n            peripherySurfaceBounds.Add(new PeripherySurfaceBounds(fi1, fi2, x1, x2));\n            return (PeripherySurfaceBounds[])peripherySurfaceBounds.ToArray(typeof(PeripherySurfaceBounds));\n        }\n\n        /// <summary>\n        ///   Creates <c>GraphicsPath</c> for cylinder surface section. This \n        ///   path consists of two arcs and two vertical lines.\n        /// </summary>\n        /// <param name=\"startAngle\">\n        ///   Starting angle of the surface.\n        /// </param>\n        /// <param name=\"endAngle\">\n        ///   Ending angle of the surface.\n        /// </param>\n        /// <param name=\"pointStart\">\n        ///   Starting point on the cylinder surface.\n        /// </param>\n        /// <param name=\"pointEnd\">\n        ///   Ending point on the cylinder surface.\n        /// </param>\n        /// <returns>\n        ///   <c>GraphicsPath</c> object representing the cylinder surface.\n        /// </returns>\n        private GraphicsPath CreatePathForCylinderSurfaceSection(float startAngle, float endAngle, PointF pointStart,\n            PointF pointEnd)\n        {\n            using (GraphicsPath path = new GraphicsPath())\n            {\n                path.AddArc(BoundingRectangle, startAngle, endAngle - startAngle);\n                path.AddLine(pointEnd.X, pointEnd.Y, pointEnd.X, pointEnd.Y + SliceHeight);\n                path.AddArc(BoundingRectangle.X, BoundingRectangle.Y + SliceHeight, BoundingRectangle.Width,\n                    BoundingRectangle.Height, endAngle, startAngle - endAngle);\n                path.AddLine(pointStart.X, pointStart.Y + SliceHeight, pointStart.X, pointStart.Y);\n                return (GraphicsPath)path.Clone();\n            }\n        }\n\n        /// <summary>\n        ///   Checks if given point is contained within upper and lower pie \n        ///   slice surfaces or within the outer slice brink.\n        /// </summary>\n        /// <param name=\"point\">\n        ///   <c>PointF</c> structure to check for.\n        /// </param>\n        /// <param name=\"point1\">\n        ///   Starting point on the periphery.\n        /// </param>\n        /// <param name=\"point2\">\n        ///   Ending point on the periphery.\n        /// </param>\n        /// <returns>\n        ///   <c>true</c> if point given is contained.\n        /// </returns>\n        private bool CylinderSurfaceSectionContainsPoint(PointF point, PointF point1, PointF point2)\n        {\n            if (SliceHeight > 0)\n            {\n                return Quadrilateral.Contains(point,\n                    new[]\n                    {\n                        point1, new PointF(point1.X, point1.Y + SliceHeight),\n                        new PointF(point2.X, point2.Y + SliceHeight), point2\n                    });\n            }\n            return false;\n        }\n\n        /// <summary>\n        ///   Checks if point given is contained within the pie slice.\n        /// </summary>\n        /// <param name=\"point\">\n        ///   <c>PointF</c> to check for.\n        /// </param>\n        /// <param name=\"boundingRectXangle\">\n        ///   x-coordinate of the rectangle that bounds the ellipse from which\n        ///   slice is cut.\n        /// </param>\n        /// <param name=\"boundingRectYangle\">\n        ///   y-coordinate of the rectangle that bounds the ellipse from which\n        ///   slice is cut.\n        /// </param>\n        /// <param name=\"boundingRectWidthangle\"> \n        ///   Width of the rectangle that bounds the ellipse from which\n        ///   slice is cut.\n        /// </param>\n        /// <param name=\"boundingRectHeightangle\">\n        ///   Height of the rectangle that bounds the ellipse from which\n        ///   slice is cut.\n        /// </param>\n        /// <param name=\"startAngle\">\n        ///   Start angle of the slice.\n        /// </param>\n        /// <param name=\"sweepAngle\">\n        ///   Sweep angle of the slice.\n        /// </param>\n        /// <returns>\n        ///   <c>true</c> if point is contained within the slice.\n        /// </returns>\n        private bool PieSliceContainsPoint(PointF point, float boundingRectXangle, float boundingRectYangle,\n            float boundingRectWidthangle, float boundingRectHeightangle, float startAngle,\n            float sweepAngle)\n        {\n            double x = point.X - boundingRectXangle - boundingRectWidthangle / 2;\n            double y = point.Y - boundingRectYangle - boundingRectHeightangle / 2;\n            double angle = Math.Atan2(y, x);\n            if (angle < 0)\n                angle += 2 * Math.PI;\n            double angleDegrees = angle * 180 / Math.PI;\n            // point is inside the pie slice only if between start and end angle\n            if ((!(angleDegrees >= startAngle) || !(angleDegrees <= startAngle + sweepAngle)) &&\n                (!(startAngle + sweepAngle > 360) || !(angleDegrees + 360 <= startAngle + sweepAngle)))\n                return false;\n\n            // distance of the point from the ellipse centre\n            double r = Math.Sqrt(y * y + x * x);\n            return GetEllipseRadius(angle) > r;\n        }\n\n        /// <summary>\n        ///   Evaluates the distance of an ellipse perimeter point for a\n        ///   given angle.\n        /// </summary>\n        /// <param name=\"angle\">\n        ///   Angle for which distance has to be evaluated.\n        /// </param>\n        /// <returns>\n        ///   Distance of the point from the ellipse centre.\n        /// </returns>\n        private double GetEllipseRadius(double angle)\n        {\n            double a = BoundingRectangle.Width / 2;\n            double b = BoundingRectangle.Height / 2;\n            double a2 = a * a;\n            double b2 = b * b;\n            double cosFi = Math.Cos(angle);\n            double sinFi = Math.Sin(angle);\n            // distance of the ellipse perimeter point\n            return a * b / Math.Sqrt(b2 * cosFi * cosFi + a2 * sinFi * sinFi);\n        }\n\n        /// <summary>\n        ///   Internal structure used to store periphery bounds data.\n        /// </summary>\n        private struct PeripherySurfaceBounds\n        {\n            /// <summary>\n            /// Initializes a new instance of the <see cref=\"PeripherySurfaceBounds\"/> struct.\n            /// </summary>\n            /// <param name=\"startAngle\">The start angle.</param>\n            /// <param name=\"endAngle\">The end angle.</param>\n            /// <param name=\"startPoint\">The start point.</param>\n            /// <param name=\"endPoint\">The end point.</param>\n            public PeripherySurfaceBounds(float startAngle, float endAngle, PointF startPoint, PointF endPoint)\n                : this()\n            {\n                StartAngle = startAngle;\n                EndAngle = endAngle;\n                StartPoint = startPoint;\n                EndPoint = endPoint;\n            }\n\n            /// <summary>\n            /// Gets or sets the start angle.\n            /// </summary>\n            /// <value>\n            /// The start angle.\n            /// </value>\n            public float StartAngle { get; }\n\n            /// <summary>\n            /// Gets or sets the end angle.\n            /// </summary>\n            /// <value>\n            /// The end angle.\n            /// </value>\n            public float EndAngle { get; }\n\n            /// <summary>\n            /// Gets or sets the start point.\n            /// </summary>\n            /// <value>\n            /// The start point.\n            /// </value>\n            public PointF StartPoint { get; }\n\n            /// <summary>\n            /// Gets or sets the end point.\n            /// </summary>\n            /// <value>\n            /// The end point.\n            /// </value>\n            public PointF EndPoint { get; }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.PieChart/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// Note: Shared assembly information is specified in SharedAssemblyInfo.cs\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"EVEMon.PieChart\")]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"713a5105-adc8-46b8-9a7a-054013b07c3a\")]\n"
  },
  {
    "path": "src/EVEMon.PieChart/Quadrilateral.cs",
    "content": "using System;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing EVEMon.Common.Extensions;\n\nnamespace EVEMon.PieChart\n{\n    /// <summary>\n    ///  Quadrilateral object.\n    /// </summary>\n    public class Quadrilateral : IDisposable\n    {\n        /// <summary>\n        ///   <c>GraphicsPath</c> representing the quadrilateral.\n        /// </summary>\n        private readonly GraphicsPath m_path = new GraphicsPath();\n\n        private bool m_disposed;\n\n        /// <summary>\n        ///   <c>PathPointType</c>s decribing the <c>GraphicsPath</c> points.\n        /// </summary>\n        private static readonly byte[] s_quadrilateralPointTypes = new byte[]\n                                                                       {\n                                                                           (byte)PathPointType.Start,\n                                                                           (byte)PathPointType.Line,\n                                                                           (byte)PathPointType.Line,\n                                                                           (byte)PathPointType.Line |\n                                                                           (byte)PathPointType.CloseSubpath\n                                                                       };\n\n        /// <summary>\n        ///   Creates empty <c>Quadrilateral</c> object\n        /// </summary>\n        internal Quadrilateral()\n        {\n        }\n\n        /// <summary>\n        ///   Initilizes <c>Quadrilateral</c> object with given corner points.\n        /// </summary>\n        /// <param name=\"point1\">\n        ///   First <c>PointF</c>.\n        /// </param>\n        /// <param name=\"point2\">\n        ///   Second <c>PointF</c>.\n        /// </param>\n        /// <param name=\"point3\">\n        ///   Third <c>PointF</c>.\n        /// </param>\n        /// <param name=\"point4\">\n        ///   Fourth <c>PointF</c>.\n        /// </param>\n        /// <param name=\"toClose\">\n        ///   Indicator should the quadrilateral be closed by the line.\n        /// </param>\n        public Quadrilateral(PointF point1, PointF point2, PointF point3, PointF point4, bool toClose)\n        {\n            byte[] pointTypes = (byte[])s_quadrilateralPointTypes.Clone();\n            if (toClose)\n                pointTypes[3] |= (byte)PathPointType.CloseSubpath;\n            m_path = new GraphicsPath(new[] { point1, point2, point3, point4 }, pointTypes);\n        }\n\n        /// <summary>\n        ///   <c>Finalize</c> method.\n        /// </summary>\n        ~Quadrilateral()\n        {\n            Dispose(false);\n        }\n\n        /// <summary>\n        ///   Implementation of <c>IDisposable</c> interface.\n        /// </summary>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        ///   Disposes of all pie slices.\n        /// </summary>\n        private void Dispose(bool disposing)\n        {\n            if (m_disposed)\n                return;\n\n            if (disposing)\n                m_path.Dispose();\n            m_disposed = true;\n        }\n\n        /// <summary>\n        /// Draws the <c>Quadrilateral</c> with <c>Graphics</c> provided.\n        /// </summary>\n        /// <param name=\"graphics\"><c>Graphics</c> used to draw.</param>\n        /// <param name=\"pen\"><c>Pen</c> used to draw outline.</param>\n        /// <param name=\"brush\"><c>Brush</c> used to fill the inside.</param>\n        /// <exception cref=\"System.ArgumentNullException\">graphics</exception>\n        public void Draw(Graphics graphics, Pen pen, Brush brush)\n        {\n            graphics.ThrowIfNull(nameof(graphics));\n\n            graphics.FillPath(brush, m_path);\n            graphics.DrawPath(pen, m_path);\n        }\n\n        /// <summary>\n        ///   Checks if the given <c>PointF</c> is contained within the \n        ///   quadrilateral.\n        /// </summary>\n        /// <param name=\"point\">\n        ///   <c>PointF</c> structure to check for.\n        /// </param>\n        /// <returns>\n        ///   <c>true</c> if the point is contained within the quadrilateral.\n        /// </returns>\n        public bool Contains(PointF point)\n        {\n            if (m_path.PointCount == 0 || m_path.PathPoints.Length == 0)\n                return false;\n            return Contains(point, m_path.PathPoints);\n        }\n\n        /// <summary>\n        /// Checks if given <c>PointF</c> is contained within quadrilateral\n        /// defined by <c>cornerPoints</c> provided.\n        /// </summary>\n        /// <param name=\"point\"><c>PointF</c> to check.</param>\n        /// <param name=\"cornerPoints\">Array of <c>PointF</c> structures defining corners of the\n        /// quadrilateral.</param>\n        /// <returns>\n        ///   <c>true</c> if the point is contained within the quadrilateral.\n        /// </returns>\n        /// <exception cref=\"System.ArgumentNullException\">point or cornerPoints</exception>\n        public static bool Contains(PointF point, PointF[] cornerPoints)\n        {\n            point.ThrowIfNull(nameof(point));\n\n            cornerPoints.ThrowIfNull(nameof(cornerPoints));\n\n            int intersections = 0;\n            for (int i = 1; i < cornerPoints.Length; ++i)\n            {\n                if (DoesIntersect(point, cornerPoints[i], cornerPoints[i - 1]))\n                    ++intersections;\n            }\n            if (DoesIntersect(point, cornerPoints[cornerPoints.Length - 1], cornerPoints[0]))\n                ++intersections;\n            return intersections % 2 != 0;\n        }\n\n        /// <summary>\n        ///   Checks if the line coming out of the <c>point</c> downwards \n        ///   intersects with a line through <c>point1</c> and <c>point2</c>.\n        /// </summary>\n        /// <param name=\"point\">\n        ///   <c>PointF</c> from which vertical line is drawn downwards.\n        /// </param>\n        /// <param name=\"point1\">\n        ///   First <c>PointF</c> through which line is drawn.\n        /// </param>\n        /// <param name=\"point2\">\n        ///   Second <c>PointF</c> through which line is drawn.\n        /// </param>\n        /// <returns>\n        ///   <c>true</c> if lines intersect.\n        /// </returns>\n        private static bool DoesIntersect(PointF point, PointF point1, PointF point2)\n        {\n            float x2 = point2.X;\n            float y2 = point2.Y;\n            float x1 = point1.X;\n            float y1 = point1.Y;\n            if ((!(x2 < point.X) || !(x1 >= point.X)) && (!(x2 >= point.X) || !(x1 < point.X)))\n                return false;\n\n            float y = (y2 - y1) / (x2 - x1) * (point.X - x1) + y1;\n            return y > point.Y;\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.PieChart/SkillsPieChart.Designer.cs",
    "content": "namespace EVEMon.PieChart\n{\n    partial class SkillsPieChart\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.skillPieChartControl = new EVEMon.PieChart.PieChartControl();\n            this.pieControlPanel = new System.Windows.Forms.Panel();\n            this.mergeMinorCheck = new System.Windows.Forms.CheckBox();\n            this.saveButton = new System.Windows.Forms.Button();\n            this.closeButton = new System.Windows.Forms.Button();\n            this.pieAngle = new System.Windows.Forms.NumericUpDown();\n            this.pieHeight = new System.Windows.Forms.NumericUpDown();\n            this.pieAngleLabel = new System.Windows.Forms.Label();\n            this.pieHeightLabel = new System.Windows.Forms.Label();\n            this.sortBySizeCheck = new System.Windows.Forms.CheckBox();\n            this.m_colorDialog = new System.Windows.Forms.ColorDialog();\n            this.savePieDialog = new System.Windows.Forms.SaveFileDialog();\n            this.planSelector = new System.Windows.Forms.ComboBox();\n            this.label1 = new System.Windows.Forms.Label();\n            this.pieControlPanel.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pieAngle)).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pieHeight)).BeginInit();\n            this.SuspendLayout();\n            // \n            // skillPieChartControl\n            // \n            this.skillPieChartControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n                        | System.Windows.Forms.AnchorStyles.Left)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.skillPieChartControl.BackColor = System.Drawing.Color.White;\n            this.skillPieChartControl.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n            this.skillPieChartControl.Colors = null;\n            this.skillPieChartControl.Location = new System.Drawing.Point(12, 12);\n            this.skillPieChartControl.Name = \"skillPieChartControl\";\n            this.skillPieChartControl.Size = new System.Drawing.Size(642, 377);\n            this.skillPieChartControl.TabIndex = 0;\n            this.skillPieChartControl.DoubleClick += new System.EventHandler(this.skillPieChartControl_DoubleClick);\n            // \n            // pieControlPanel\n            // \n            this.pieControlPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.pieControlPanel.Controls.Add(this.mergeMinorCheck);\n            this.pieControlPanel.Controls.Add(this.saveButton);\n            this.pieControlPanel.Controls.Add(this.closeButton);\n            this.pieControlPanel.Controls.Add(this.pieAngle);\n            this.pieControlPanel.Controls.Add(this.pieHeight);\n            this.pieControlPanel.Controls.Add(this.pieAngleLabel);\n            this.pieControlPanel.Controls.Add(this.pieHeightLabel);\n            this.pieControlPanel.Controls.Add(this.sortBySizeCheck);\n            this.pieControlPanel.Location = new System.Drawing.Point(12, 418);\n            this.pieControlPanel.Name = \"pieControlPanel\";\n            this.pieControlPanel.Size = new System.Drawing.Size(642, 26);\n            this.pieControlPanel.TabIndex = 1;\n            // \n            // mergeMinorCheck\n            // \n            this.mergeMinorCheck.AutoSize = true;\n            this.mergeMinorCheck.Location = new System.Drawing.Point(352, 5);\n            this.mergeMinorCheck.Name = \"mergeMinorCheck\";\n            this.mergeMinorCheck.Size = new System.Drawing.Size(121, 17);\n            this.mergeMinorCheck.TabIndex = 7;\n            this.mergeMinorCheck.Text = \"Merge minor groups\";\n            this.mergeMinorCheck.CheckedChanged += new System.EventHandler(this.mergeMinorCheck_CheckedChanged);\n            // \n            // saveButton\n            // \n            this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.saveButton.Location = new System.Drawing.Point(482, 2);\n            this.saveButton.Name = \"saveButton\";\n            this.saveButton.Size = new System.Drawing.Size(75, 23);\n            this.saveButton.TabIndex = 5;\n            this.saveButton.Text = \"Save\";\n            this.saveButton.UseVisualStyleBackColor = true;\n            this.saveButton.Click += new System.EventHandler(this.saveButton_Click);\n            // \n            // closeButton\n            // \n            this.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.closeButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n            this.closeButton.Location = new System.Drawing.Point(564, 2);\n            this.closeButton.Name = \"closeButton\";\n            this.closeButton.Size = new System.Drawing.Size(75, 23);\n            this.closeButton.TabIndex = 4;\n            this.closeButton.Text = \"Close\";\n            this.closeButton.UseVisualStyleBackColor = true;\n            this.closeButton.Click += new System.EventHandler(this.closeButton_Click);\n            // \n            // pieAngle\n            // \n            this.pieAngle.Increment = new decimal(new int[] {\n            10,\n            0,\n            0,\n            0});\n            this.pieAngle.Location = new System.Drawing.Point(198, 3);\n            this.pieAngle.Maximum = new decimal(new int[] {\n            360,\n            0,\n            0,\n            0});\n            this.pieAngle.Minimum = new decimal(new int[] {\n            360,\n            0,\n            0,\n            -2147483648});\n            this.pieAngle.Name = \"pieAngle\";\n            this.pieAngle.Size = new System.Drawing.Size(52, 21);\n            this.pieAngle.TabIndex = 3;\n            this.pieAngle.Value = new decimal(new int[] {\n            30,\n            0,\n            0,\n            -2147483648});\n            this.pieAngle.ValueChanged += new System.EventHandler(this.pieAngle_ValueChanged);\n            // \n            // pieHeight\n            // \n            this.pieHeight.DecimalPlaces = 2;\n            this.pieHeight.Increment = new decimal(new int[] {\n            5,\n            0,\n            0,\n            131072});\n            this.pieHeight.Location = new System.Drawing.Point(64, 3);\n            this.pieHeight.Maximum = new decimal(new int[] {\n            5,\n            0,\n            0,\n            65536});\n            this.pieHeight.Name = \"pieHeight\";\n            this.pieHeight.Size = new System.Drawing.Size(54, 21);\n            this.pieHeight.TabIndex = 2;\n            this.pieHeight.Value = new decimal(new int[] {\n            15,\n            0,\n            0,\n            131072});\n            this.pieHeight.ValueChanged += new System.EventHandler(this.pieHeight_ValueChanged);\n            // \n            // pieAngleLabel\n            // \n            this.pieAngleLabel.AutoSize = true;\n            this.pieAngleLabel.Location = new System.Drawing.Point(129, 5);\n            this.pieAngleLabel.Name = \"pieAngleLabel\";\n            this.pieAngleLabel.Size = new System.Drawing.Size(66, 13);\n            this.pieAngleLabel.TabIndex = 1;\n            this.pieAngleLabel.Text = \"Initial angle:\";\n            // \n            // pieHeightLabel\n            // \n            this.pieHeightLabel.AutoSize = true;\n            this.pieHeightLabel.Location = new System.Drawing.Point(1, 5);\n            this.pieHeightLabel.Name = \"pieHeightLabel\";\n            this.pieHeightLabel.Size = new System.Drawing.Size(58, 13);\n            this.pieHeightLabel.TabIndex = 0;\n            this.pieHeightLabel.Text = \"Pie height:\";\n            // \n            // sortBySizeCheck\n            // \n            this.sortBySizeCheck.AutoSize = true;\n            this.sortBySizeCheck.Location = new System.Drawing.Point(264, 5);\n            this.sortBySizeCheck.Name = \"sortBySizeCheck\";\n            this.sortBySizeCheck.Size = new System.Drawing.Size(82, 17);\n            this.sortBySizeCheck.TabIndex = 6;\n            this.sortBySizeCheck.Text = \"Sort by size\";\n            this.sortBySizeCheck.CheckedChanged += new System.EventHandler(this.sortBySizeCheck_CheckedChanged);\n            // \n            // savePieDialog\n            // \n            this.savePieDialog.DefaultExt = \"png\";\n            this.savePieDialog.Filter = \"PNG Image|*.png\";\n            // \n            // planSelector\n            // \n            this.planSelector.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.planSelector.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n            this.planSelector.FormattingEnabled = true;\n            this.planSelector.Items.AddRange(new object[] {\n            \"<Current Skillpoints>\"});\n            this.planSelector.Location = new System.Drawing.Point(175, 391);\n            this.planSelector.Name = \"planSelector\";\n            this.planSelector.Size = new System.Drawing.Size(183, 21);\n            this.planSelector.TabIndex = 2;\n            this.planSelector.SelectedIndexChanged += new System.EventHandler(this.planSelector_SelectedIndexChanged);\n            // \n            // label1\n            // \n            this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(12, 394);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(157, 13);\n            this.label1.TabIndex = 3;\n            this.label1.Text = \"Projected Skillpoints using Plan:\";\n            // \n            // SkillsPieChart\n            // \n            this.AcceptButton = this.saveButton;\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.CancelButton = this.closeButton;\n            this.ClientSize = new System.Drawing.Size(666, 456);\n            this.Controls.Add(this.label1);\n            this.Controls.Add(this.planSelector);\n            this.Controls.Add(this.pieControlPanel);\n            this.Controls.Add(this.skillPieChartControl);\n            this.MinimumSize = new System.Drawing.Size(674, 490);\n            this.Name = \"SkillsPieChart\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"SkillsPieChart\";\n            this.pieControlPanel.ResumeLayout(false);\n            this.pieControlPanel.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.pieAngle)).EndInit();\n            ((System.ComponentModel.ISupportInitialize)(this.pieHeight)).EndInit();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private EVEMon.PieChart.PieChartControl skillPieChartControl;\n        private System.Windows.Forms.Panel pieControlPanel;\n        private System.Windows.Forms.Label pieAngleLabel;\n        private System.Windows.Forms.Label pieHeightLabel;\n        private System.Windows.Forms.NumericUpDown pieAngle;\n        private System.Windows.Forms.NumericUpDown pieHeight;\n        private System.Windows.Forms.Button closeButton;\n        private System.Windows.Forms.ColorDialog m_colorDialog;\n        private System.Windows.Forms.Button saveButton;\n        private System.Windows.Forms.SaveFileDialog savePieDialog;\n        private System.Windows.Forms.CheckBox sortBySizeCheck;\n        private System.Windows.Forms.ComboBox planSelector;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.CheckBox mergeMinorCheck;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.PieChart/SkillsPieChart.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Drawing.Imaging;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Models;\nusing EVEMon.Common.SettingsObjects;\n\nnamespace EVEMon.PieChart\n{\n    public partial class SkillsPieChart : EVEMonForm\n    {\n        private readonly Character m_character;\n        private const int Alpha = 125;\n\n\n        #region Construction, loading, closing\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"character\"></param>\n        public SkillsPieChart(Character character)\n        {\n            InitializeComponent();\n            RememberPositionKey = \"SkillsPieChart\";\n\n            // Fields\n            m_character = character;\n        }\n\n        /// <summary>\n        /// On loading\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            if (DesignMode)\n                return;\n\n            // Layout\n            skillPieChartControl.LeftMargin(20F);\n            skillPieChartControl.TopMargin(15F);\n            skillPieChartControl.RightMargin(20F);\n            skillPieChartControl.BottomMargin(15F);\n            skillPieChartControl.FitChart(true);\n            skillPieChartControl.SliceRelativeHeight(Settings.UI.SkillPieChart.SliceHeight);\n            skillPieChartControl.InitialAngle(Settings.UI.SkillPieChart.InitialAngle);\n            skillPieChartControl.StyleOfShadow(ShadowStyle.GradualShadow);\n            skillPieChartControl.ColorTypeOfEdge(EdgeColorType.DarkerThanSurface);\n            skillPieChartControl.EdgeLineWidth(1F);\n\n            Text = string.Format(CultureInfo.CurrentCulture, \"Skillgroup chart for {0}\", m_character.Name);\n\n            // Events\n            skillPieChartControl.AngleChange += skillPieChartControl_AngleChange;\n\n            // Read settings\n            sortBySizeCheck.Checked = Settings.UI.SkillPieChart.SortBySize;\n            mergeMinorCheck.Checked = Settings.UI.SkillPieChart.MergeMinorGroups;\n            pieHeight.Value = (decimal)Settings.UI.SkillPieChart.SliceHeight;\n            pieAngle.Value = (decimal)Settings.UI.SkillPieChart.InitialAngle;\n\n            // Check there are enough colors or create them\n            if (Settings.UI.SkillPieChart.Colors.Count < m_character.SkillGroups.Count)\n            {\n                List<Color> newColors = new List<Color>();\n                while (newColors.Count < m_character.SkillGroups.Count)\n                {\n                    newColors.Add(Color.FromArgb(Alpha, Color.Red));\n                    newColors.Add(Color.FromArgb(Alpha, Color.Green));\n                    newColors.Add(Color.FromArgb(Alpha, Color.Blue));\n                }\n                skillPieChartControl.Colors = newColors;\n            }\n            else\n                skillPieChartControl.Colors = Settings.UI.SkillPieChart.Colors.Select(color => (Color)color);\n\n            // Initialize plans combox Box                        \n            planSelector.SelectedIndex = 0;\n            foreach (Plan plan in m_character.Plans)\n            {\n                planSelector.Items.Add(plan.Name);\n            }\n\n            // Update the display\n            UpdatePieChart();\n        }\n\n        /// <summary>\n        /// On closing, store settings and unsubscribe events\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnFormClosing(FormClosingEventArgs e)\n        {\n            base.OnFormClosing(e);\n\n            // Store colors to settings\n            Settings.UI.SkillPieChart.Colors.Clear();\n            foreach (Color c in skillPieChartControl.Colors)\n            {\n                Settings.UI.SkillPieChart.Colors.Add((SerializableColor)c);\n            }\n\n            // Store other settings\n            Settings.UI.SkillPieChart.SliceHeight = (float)pieHeight.Value;\n            Settings.UI.SkillPieChart.InitialAngle = (float)pieAngle.Value;\n            Settings.UI.SkillPieChart.MergeMinorGroups = mergeMinorCheck.Checked;\n            Settings.UI.SkillPieChart.SortBySize = sortBySizeCheck.Checked;\n\n            // Events\n            skillPieChartControl.AngleChange -= skillPieChartControl_AngleChange;\n        }\n\n        #endregion\n\n\n        #region Fetching data to the pie chart\n\n        /// <summary>\n        /// Updates the pie chart display\n        /// </summary>\n        private void UpdatePieChart()\n        {\n            // Prevents updating before OnLoad() completed.\n            if (planSelector.SelectedIndex < 0)\n                return;\n\n            int groupCount = StaticSkills.AllGroups.Count();\n            CharacterScratchpad scratchpad = new CharacterScratchpad(m_character);\n\n            // Retrieve the selected Plan\n            if (planSelector.SelectedIndex > 0)\n            {\n                Plan plan = m_character.Plans[planSelector.SelectedIndex - 1];\n\n                // Updates the scratchpad\n                foreach (PlanEntry entry in plan)\n                {\n                    scratchpad.Train(entry);\n                }\n            }\n\n\n            // Get group to index map and groups list\n            List<SkillGroup> groups = new List<SkillGroup>();\n            Dictionary<StaticSkillGroup, int> indices = new Dictionary<StaticSkillGroup, int>();\n            foreach (StaticSkillGroup group in StaticSkills.AllGroups)\n            {\n                indices[group] = groups.Count;\n                groups.Add(m_character.SkillGroups[group.ID]);\n            }\n\n            // Get start SP, before plan\n            decimal[] srcSkillPoints = new decimal[groupCount];\n            foreach (SkillGroup skillGroup in groups)\n            {\n                int groupIndex = indices[skillGroup.StaticData];\n                srcSkillPoints[groupIndex] = skillGroup.TotalSP;\n            }\n\n            // Get target SP and skills count, after plan\n            int[] skillCounts = new int[groupCount];\n            decimal[] targetSkillPoints = new decimal[groupCount];\n            foreach (StaticSkill skill in StaticSkills.AllSkills)\n            {\n                long sp = scratchpad.GetSkillPoints(skill);\n                int groupIndex = indices[skill.Group];\n\n                targetSkillPoints[groupIndex] += sp;\n                if (sp != 0)\n                    skillCounts[groupIndex]++;\n            }\n\n            // Get groups names and descriptions\n            string[] names = new string[groupCount];\n            string[] descriptions = new string[groupCount];\n            for (int i = 0; i < srcSkillPoints.Length; i++)\n            {\n                names[i] = groups[i].Name;\n                descriptions[i] = groups[i].Name;\n\n                decimal srcSP = srcSkillPoints[i];\n                decimal destSP = targetSkillPoints[i];\n\n                StringBuilder description = new StringBuilder();\n                description.Append($\"{names[i]} ({skillCounts[i]} skills, {srcSP:N0} skillpoints\");\n                if (srcSP != destSP)\n                    description.Append($\" / {destSP:N0} after plan completion\");\n\n                description.Append(\")\");\n                descriptions[i] = description.ToString();\n            }\n\n            // Merge minor groups\n            if (mergeMinorCheck.Checked)\n                Merge(ref targetSkillPoints, ref names, ref descriptions);\n\n            // Compute the slices displacements\n            int tinyGroups = 0;\n            float[] slicesDiscplacements = new float[targetSkillPoints.Length];\n            for (int i = 0; i < targetSkillPoints.Length; i++)\n            {\n                slicesDiscplacements[i] = targetSkillPoints[i] < 100000 ? 0.06F + 0.008F * ++tinyGroups : 0.05F;\n            }\n\n            // Assign and sort\n            skillPieChartControl.Values(targetSkillPoints);\n            skillPieChartControl.Texts(names);\n            skillPieChartControl.ToolTips(descriptions);\n            skillPieChartControl.SliceRelativeDisplacements(slicesDiscplacements);\n            skillPieChartControl.OrderSlices(sortBySizeCheck.Checked);\n        }\n\n        /// <summary>\n        /// Performs the merge\n        /// </summary>\n        /// <param name=\"targetSkillPoints\"></param>\n        /// <param name=\"names\"></param>\n        /// <param name=\"descriptions\"></param>\n        private static void Merge(ref decimal[] targetSkillPoints, ref string[] names, ref string[] descriptions)\n        {\n            // Gets total SP and threshold (1% of total SP)\n            decimal totalSP = targetSkillPoints.Sum();\n            decimal threshold = totalSP / 100;\n\n            // Gathers group indices to merge\n            List<int> mergedGroupIndices = new List<int>();\n            for (int i = 0; i < targetSkillPoints.Length; i++)\n            {\n                if (targetSkillPoints[i] < threshold)\n                    mergedGroupIndices.Add(i);\n            }\n\n            // Prepare the merging lists\n            List<decimal> newTargetSkillPoints = new List<decimal>();\n            List<string> newDescriptions = new List<string>();\n            List<string> newNames = new List<string>();\n\n            if (mergedGroupIndices.Count != 0)\n            {\n                newTargetSkillPoints.Add(0);\n                newDescriptions.Add(\"\");\n                newNames.Add(\"Other\");\n            }\n\n            // Merge\n            bool isFirstMerged = true;\n            for (int i = 0; i < targetSkillPoints.Length; i++)\n            {\n                // Is Merged ?\n                if (mergedGroupIndices.Contains(i))\n                {\n                    if (!isFirstMerged)\n                        newDescriptions[0] += \"\\n\";\n                    isFirstMerged = false;\n\n                    newTargetSkillPoints[0] += targetSkillPoints[i];\n                    newDescriptions[0] += descriptions[i];\n                }\n                    // Not merged\n                else\n                {\n                    newTargetSkillPoints.Add(targetSkillPoints[i]);\n                    newDescriptions.Add(descriptions[i]);\n                    newNames.Add(names[i]);\n                }\n            }\n\n            // Replace the old arrays\n            targetSkillPoints = newTargetSkillPoints.ToArray();\n            descriptions = newDescriptions.ToArray();\n            names = newNames.ToArray();\n        }\n\n        #endregion\n\n\n        #region Events for the controls\n\n        /// <summary>\n        /// When the user rotates the pie chart, we update the numeric box\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void skillPieChartControl_AngleChange(object sender, EventArgs e)\n        {\n            AngleChangeEventArgs angleChangeEventArgs = e as AngleChangeEventArgs;\n            if (angleChangeEventArgs != null)\n                pieAngle.Value = (decimal)angleChangeEventArgs.NewAngle;\n        }\n\n        /// <summary>\n        /// When the user changes the numeric box for the pie height, we update the pie chart control.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void pieHeight_ValueChanged(object sender, EventArgs e)\n        {\n            skillPieChartControl.SliceRelativeHeight((float)pieHeight.Value);\n        }\n\n        /// <summary>\n        /// When the user changes the numeric box for the angle, we update the pie chart control.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void pieAngle_ValueChanged(object sender, EventArgs e)\n        {\n            skillPieChartControl.InitialAngle((float)pieAngle.Value);\n        }\n\n        /// <summary>\n        /// Close button click. Close.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void closeButton_Click(object sender, EventArgs e)\n        {\n            Close();\n        }\n\n        /// <summary>\n        /// When the user double click the control, we allow him to change the clicked group's color\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void skillPieChartControl_DoubleClick(object sender, EventArgs e)\n        {\n            // Retrieve the clicked segment\n            MouseEventArgs ev = (MouseEventArgs)e;\n            PieChart3D pieChart3D = skillPieChartControl.PieChart;\n            int index = pieChart3D.FindPieSliceUnderPoint(new PointF(ev.X, ev.Y));\n\n            // If none clicked, we return. Otherwise we open the color picker.\n            if (index == -1)\n                return;\n\n            if (m_colorDialog.ShowDialog() != DialogResult.OK)\n                return;\n\n            // The user picked a new color, we update our colors list.\n            if (sortBySizeCheck.Checked)\n            {\n                int realIndex = skillPieChartControl.GetIndex(index);\n                Color[] colors = skillPieChartControl.Colors.ToArray();\n                colors[realIndex] = Color.FromArgb(Alpha, m_colorDialog.Color);\n                skillPieChartControl.Colors = colors;\n            }\n            else\n            {\n                Color[] colors = skillPieChartControl.Colors.ToArray();\n                colors[index] = Color.FromArgb(Alpha, m_colorDialog.Color);\n                skillPieChartControl.Colors = colors;\n            }\n\n            // Forces an update of the control\n            skillPieChartControl.OrderSlices(sortBySizeCheck.Checked);\n        }\n\n        /// <summary>\n        /// Save button. Export to PNG.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void saveButton_Click(object sender, EventArgs e)\n        {\n            using (Bitmap pie = new Bitmap(skillPieChartControl.Width, skillPieChartControl.Height))\n            {\n                Rectangle bounds = new Rectangle(0, 0, skillPieChartControl.Width, skillPieChartControl.Height);\n                skillPieChartControl.DrawToBitmap(pie, bounds);\n\n                DialogResult savePieResult = savePieDialog.ShowDialog();\n                if (savePieResult == DialogResult.OK)\n                    pie.Save(savePieDialog.FileName, ImageFormat.Png);\n            }\n        }\n\n        /// <summary>\n        /// Forces an update when the sort by size combo box state changes.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void sortBySizeCheck_CheckedChanged(object sender, EventArgs e)\n        {\n            UpdatePieChart();\n        }\n\n        /// <summary>\n        /// When the selected plan change, we refresh all the data.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void planSelector_SelectedIndexChanged(object sender, EventArgs e)\n        {\n            UpdatePieChart();\n        }\n\n        /// <summary>\n        /// When the merge minor option changes, we refresh all the data.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void mergeMinorCheck_CheckedChanged(object sender, EventArgs e)\n        {\n            UpdatePieChart();\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.PieChart/SkillsPieChart.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"m_colorDialog.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"savePieDialog.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>139, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon.PieChart/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-10.0.0.0\" newVersion=\"10.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.36.0.0\" newVersion=\"1.36.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis.Core\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.42.0.0\" newVersion=\"1.42.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n<startup><supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\" /></startup></configuration>\n"
  },
  {
    "path": "src/EVEMon.Sales/CXIParser.cs",
    "content": "using System;\nusing System.Text.RegularExpressions;\n\nnamespace EVEMon.Sales\n{\n    public class CXIParser : IMineralParser\n    {\n        /// <summary>\n        /// Gets  the name.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name => \"cxi\";\n\n        /// <summary>\n        /// Gets the title.\n        /// </summary>\n        /// <value>The title.</value>\n        public string Title => \"CompleXion Industries\";\n\n        /// <summary>\n        /// Gets the courtesy URL.\n        /// </summary>\n        /// <value>The courtesy URL.</value>\n        public Uri CourtesyUrl => new Uri(\"http://cxa.supreme-eve.com/wiki/\");\n\n        /// <summary>\n        /// Gets the courtesy text.\n        /// </summary>\n        /// <value>The courtesy text.</value>\n        public string CourtesyText => \"CompleXion Industries\";\n\n        /// <summary>\n        /// Gets the tokenizer.\n        /// </summary>\n        /// <value>The tokenizer.</value>\n        public Regex Tokenizer => new Regex(@\"<name>(?<name>.+?)</name>\\s*<price>(?<price>.+?)</price>\",\n            RegexOptions.Compiled\n            | RegexOptions.IgnorePatternWhitespace\n            | RegexOptions.Singleline\n            | RegexOptions.Multiline\n            | RegexOptions.IgnoreCase\n            | RegexOptions.CultureInvariant);\n\n        /// <summary>\n        /// Gets the URL.\n        /// </summary>\n        /// <value>The URL.</value>\n        public Uri URL => new Uri(\"http://www.c-l-o-t.com/cxi/orecalc/evemon.php\");\n    }\n}"
  },
  {
    "path": "src/EVEMon.Sales/EVEMon.Sales.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{097C8821-39BB-446D-87E1-5D24E9115CFB}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>EVEMon.Sales</RootNamespace>\n    <AssemblyName>EVEMon.Sales</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\n    <DebugType>full</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Windows.Forms\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\..\\SharedAssemblyInfo.cs\">\n      <Link>Properties\\SharedAssemblyInfo.cs</Link>\n    </Compile>\n    <Compile Include=\"CXIParser.cs\" />\n    <Compile Include=\"EveCentralParser.cs\" />\n    <Compile Include=\"GlobalSuppressions.cs\" />\n    <Compile Include=\"IMineralParser.cs\" />\n    <Compile Include=\"MineralDataRequest.cs\" />\n    <Compile Include=\"MineralPrice.cs\" />\n    <Compile Include=\"MineralTile.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"MineralTile.Designer.cs\">\n      <DependentUpon>MineralTile.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"MineralWorksheet.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"MineralWorksheet.Designer.cs\">\n      <DependentUpon>MineralWorksheet.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <EmbeddedResource Include=\"MineralTile.resx\">\n      <DependentUpon>MineralTile.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"MineralWorksheet.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>MineralWorksheet.cs</DependentUpon>\n    </EmbeddedResource>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\EVEMon.Common\\EVEMon.Common.csproj\">\n      <Project>{C0665275-3E0B-4117-81B0-751206ED03CD}</Project>\n      <Name>EVEMon.Common</Name>\n      <Private>False</Private>\n      <Properties>SkipValidatePackageReferences=true</Properties>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "src/EVEMon.Sales/EveCentralParser.cs",
    "content": "using System;\nusing System.Text.RegularExpressions;\n\nnamespace EVEMon.Sales\n{\n    public class EveCentralParser : IMineralParser\n    {\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name => \"evecentral\";\n\n        /// <summary>\n        /// Gets the title.\n        /// </summary>\n        /// <value>The title.</value>\n        public string Title => \"EVE-Central Mineral Feed\";\n\n        /// <summary>\n        /// Gets the courtesy URL.\n        /// </summary>\n        /// <value>The courtesy URL.</value>\n        public Uri CourtesyUrl => new Uri(\"http://eve-central.com\");\n\n        /// <summary>\n        /// Gets the courtesy text.\n        /// </summary>\n        /// <value>The courtesy text.</value>\n        public string CourtesyText => \"Eve-Central\";\n\n        /// <summary>\n        /// Gets the tokenizer.\n        /// </summary>\n        /// <value>The tokenizer.</value>\n        public Regex Tokenizer => new Regex(@\"<name>(?<name>.+?)</name>\\s*<price>(?<price>.+?)</price>\",\n            RegexOptions.Compiled\n            | RegexOptions.IgnorePatternWhitespace\n            | RegexOptions.Singleline\n            | RegexOptions.Multiline\n            | RegexOptions.IgnoreCase);\n\n        /// <summary>\n        /// Gets the URL.\n        /// </summary>\n        /// <value>The URL.</value>\n        public Uri URL => new Uri(\"http://api.eve-central.com/api/evemon\");\n    }\n}"
  },
  {
    "path": "src/EVEMon.Sales/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage \n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given \n// a specific target and scoped to a namespace, type, member, etc.\n//\n// To add a suppression to this file, right-click the message in the \n// Error List, point to \"Suppress Message(s)\", and click \n// \"In Project Suppression File\".\n// You do not need to add suppressions to this file manually.\n\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1014:MarkAssembliesWithClsCompliant\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Sales.MineralTile.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon,System.Windows.Forms.MessageBoxDefaultButton,System.Windows.Forms.MessageBoxOptions)\", Scope = \"member\", Target = \"EVEMon.Sales.MineralWorksheet.#bckgrndWrkrGetPrices_RunWorkerCompleted(System.Object,System.ComponentModel.RunWorkerCompletedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Sales.MineralWorksheet.#bckgrndWrkrGetPrices_RunWorkerCompleted(System.Object,System.ComponentModel.RunWorkerCompletedEventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Sales.MineralWorksheet.#btnLockPrices_Click(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Sales.MineralWorksheet.#copyTotalDropDownButton_DropDownOpening(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Sales.MineralWorksheet.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Sales.MineralWorksheet.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.ToolStripItem.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Sales.MineralWorksheet.#TileSubtotal_Changed(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1704:IdentifiersShouldBeSpelledCorrectly\", MessageId = \"Battleclinic\", Scope = \"type\", Target = \"EVEMon.Sales.BattleclinicParser\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1704:IdentifiersShouldBeSpelledCorrectly\", MessageId = \"Matari\", Scope = \"type\", Target = \"EVEMon.Sales.MatariParser\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1704:IdentifiersShouldBeSpelledCorrectly\", MessageId = \"Tokenizer\", Scope = \"member\", Target = \"EVEMon.Sales.IMineralParser.#Tokenizer\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"CXI\", Scope = \"type\", Target = \"EVEMon.Sales.CXIParser\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"EVE\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"EVE\", Scope = \"namespace\", Target = \"EVEMon.Sales\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"URL\", Scope = \"member\", Target = \"EVEMon.Sales.IMineralParser.#URL\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA2210:AssembliesShouldHaveValidStrongNames\")]\n"
  },
  {
    "path": "src/EVEMon.Sales/IMineralParser.cs",
    "content": "using System;\nusing System.Text.RegularExpressions;\n\nnamespace EVEMon.Sales\n{\n    /// <summary>\n    /// Defines an interface to a Mineral Parser.\n    /// </summary>\n    public interface IMineralParser\n    {\n        /// <summary>\n        /// Gets the name.\n        /// </summary>\n        /// <value>The name.</value>\n        string Name { get; }\n\n        /// <summary>\n        /// Gets the title.\n        /// </summary>\n        /// <value>The title.</value>\n        string Title { get; }\n\n        /// <summary>\n        /// Gets the courtesy URL.\n        /// </summary>\n        /// <value>The courtesy URL.</value>\n        Uri CourtesyUrl { get; }\n\n        /// <summary>\n        /// Gets the courtesy text.\n        /// </summary>\n        /// <value>The courtesy text.</value>\n        string CourtesyText { get; }\n\n        /// <summary>\n        /// Gets the tokenizer.\n        /// </summary>\n        /// <value>The tokenizer.</value>\n        Regex Tokenizer { get; }\n\n        /// <summary>\n        /// Gets the URL.\n        /// </summary>\n        /// <value>The URL.</value>\n        Uri URL { get; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Sales/MineralDataRequest.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text.RegularExpressions;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Net;\n\nnamespace EVEMon.Sales\n{\n    /// <summary>\n    /// Gets mineral data from parsers.\n    /// </summary>\n    public static class MineralDataRequest\n    {\n        private static readonly Dictionary<string, IMineralParser> s_parsers = new Dictionary<string, IMineralParser>();\n\n        /// <summary>\n        /// Initializes the data source.\n        /// </summary>\n        internal static void Initialize()\n        {\n            foreach (IMineralParser parser in Assembly.GetExecutingAssembly().GetTypes().Where(\n                type => typeof(IMineralParser).IsAssignableFrom(type) && type.GetConstructor(Type.EmptyTypes) != null).Select(\n                    type => Activator.CreateInstance(type) as IMineralParser).OrderBy(parser => parser.Name))\n            {\n                s_parsers[parser.Name] = parser;\n            }\n        }\n\n        /// <summary>\n        /// Gets the parsers.\n        /// </summary>\n        /// <value>The parsers.</value>\n        public static IEnumerable<IMineralParser> Parsers => s_parsers.Values;\n\n        /// <summary>\n        /// The prices of mineral from the given source.\n        /// </summary>\n        /// <param name=\"source\">The source.</param>\n        /// <returns>An enumerable collection of Minerals and Prices.</returns>\n        public static IEnumerable<MineralPrice> Prices(string source)\n        {\n            if (!s_parsers.ContainsKey(source))\n                throw new ArgumentException(@\"That is not a registered mineral datasource.\", nameof(source));\n\n            IMineralParser parser = s_parsers[source];\n            return GetPrices(parser);\n        }\n\n        /// <summary>\n        /// Gets the courtesy text.\n        /// </summary>\n        /// <param name=\"source\">The source.</param>\n        /// <returns>The courtesy text.</returns>\n        public static string GetCourtesyText(string source)\n        {\n            if (!s_parsers.ContainsKey(source))\n                throw new ArgumentException(@\"That is not a registered mineral datasource.\", nameof(source));\n\n            IMineralParser p = s_parsers[source];\n            return p.CourtesyText;\n        }\n\n        /// <summary>\n        /// Gets the courtesy URL.\n        /// </summary>\n        /// <param name=\"source\">The source.</param>\n        /// <returns>The courtesy URL.</returns>\n        public static Uri GetCourtesyUrl(string source)\n        {\n            if (!s_parsers.ContainsKey(source))\n                throw new ArgumentException(@\"That is not a registered mineral datasource.\", nameof(source));\n\n            IMineralParser p = s_parsers[source];\n            return p.CourtesyUrl;\n        }\n\n        /// <summary>\n        /// Scans for prices.\n        /// </summary>\n        /// <returns></returns>\n        private static IEnumerable<MineralPrice> GetPrices(IMineralParser parser)\n        {\n            string content = String.Empty;\n            try\n            {\n                content = HttpWebClientService.DownloadString(parser.URL).Result;\n            }\n            catch (HttpWebClientServiceException ex)\n            {\n                ExceptionHandler.LogException(ex, false);\n            }\n\n            // Scan for prices\n            MatchCollection mc = parser.Tokenizer.Matches(content);\n\n            return mc.Cast<Match>().Select(match =>\n            {\n                int typeID;\n                string name = Int32.TryParse(match.Groups[\"name\"].Value, out typeID)\n                    ? StaticItems.GetItemByID(typeID).Name\n                    : match.Groups[\"name\"].Value;\n\n                return new MineralPrice\n                {\n                    Name = name,\n                    Price = Decimal.Parse(match.Groups[\"price\"].Value,\n                        NumberStyles.Currency,\n                        CultureInfo.InvariantCulture)\n                };\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Sales/MineralParserException.cs",
    "content": "using System;\n\nnamespace EVEMon.Sales\n{\n    /// <summary>\n    /// Thrown when something goes wrong with the mineral parser.\n    /// </summary>\n    [Serializable]\n    public class MineralParserException : Exception\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MineralParserException\"/> class.\n        /// </summary>\n        /// <param name=\"message\">The message.</param>\n        public MineralParserException(string message)\n            : base(message)\n        {\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Sales/MineralPrice.cs",
    "content": "namespace EVEMon.Sales\n{\n    public sealed class MineralPrice\n    {\n        /// <summary>\n        /// Gets or sets the name of the mineral.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the price of the mineral.\n        /// </summary>\n        /// <value>The price.</value>\n        public decimal Price { get; set; }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Sales/MineralTile.Designer.cs",
    "content": "namespace EVEMon.Sales\n{\n    partial class MineralTile\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.txtStock = new System.Windows.Forms.TextBox();\n            this.txtLastSell = new System.Windows.Forms.TextBox();\n            this.lblQuantity = new System.Windows.Forms.Label();\n            this.lblLastPrice = new System.Windows.Forms.Label();\n            this.icon = new System.Windows.Forms.PictureBox();\n            this.groupBox = new System.Windows.Forms.GroupBox();\n            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\n            this.label1 = new System.Windows.Forms.Label();\n            this.tbSubtotal = new System.Windows.Forms.TextBox();\n            ((System.ComponentModel.ISupportInitialize)(this.icon)).BeginInit();\n            this.groupBox.SuspendLayout();\n            this.tableLayoutPanel1.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // txtStock\n            // \n            this.txtStock.Location = new System.Drawing.Point(144, 34);\n            this.txtStock.Name = \"txtStock\";\n            this.txtStock.Size = new System.Drawing.Size(61, 20);\n            this.txtStock.TabIndex = 3;\n            this.txtStock.Text = \"0\";\n            this.txtStock.TextChanged += new System.EventHandler(this.txtStock_TextChanged);\n            // \n            // txtLastSell\n            // \n            this.txtLastSell.Location = new System.Drawing.Point(144, 8);\n            this.txtLastSell.Name = \"txtLastSell\";\n            this.txtLastSell.Size = new System.Drawing.Size(61, 20);\n            this.txtLastSell.TabIndex = 2;\n            this.txtLastSell.Text = \"0\";\n            this.txtLastSell.TextChanged += new System.EventHandler(this.txtLastSell_TextChanged);\n            // \n            // lblQuantity\n            // \n            this.lblQuantity.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblQuantity.AutoSize = true;\n            this.lblQuantity.Location = new System.Drawing.Point(89, 31);\n            this.lblQuantity.Name = \"lblQuantity\";\n            this.lblQuantity.Size = new System.Drawing.Size(49, 26);\n            this.lblQuantity.TabIndex = 2;\n            this.lblQuantity.Text = \"Quantity:\";\n            this.lblQuantity.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // lblLastPrice\n            // \n            this.lblLastPrice.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblLastPrice.AutoSize = true;\n            this.lblLastPrice.Location = new System.Drawing.Point(85, 5);\n            this.lblLastPrice.Name = \"lblLastPrice\";\n            this.lblLastPrice.Size = new System.Drawing.Size(53, 26);\n            this.lblLastPrice.TabIndex = 2;\n            this.lblLastPrice.Text = \"Price Per:\";\n            this.lblLastPrice.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // icon\n            // \n            this.icon.InitialImage = null;\n            this.icon.Location = new System.Drawing.Point(14, 9);\n            this.icon.Margin = new System.Windows.Forms.Padding(4);\n            this.icon.Name = \"icon\";\n            this.tableLayoutPanel1.SetRowSpan(this.icon, 3);\n            this.icon.Size = new System.Drawing.Size(64, 64);\n            this.icon.TabIndex = 2;\n            this.icon.TabStop = false;\n            // \n            // groupBox\n            // \n            this.groupBox.AutoSize = true;\n            this.groupBox.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.groupBox.Controls.Add(this.tableLayoutPanel1);\n            this.groupBox.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.groupBox.Location = new System.Drawing.Point(0, 0);\n            this.groupBox.Margin = new System.Windows.Forms.Padding(2);\n            this.groupBox.Name = \"groupBox\";\n            this.groupBox.Padding = new System.Windows.Forms.Padding(2);\n            this.groupBox.Size = new System.Drawing.Size(261, 105);\n            this.groupBox.TabIndex = 2;\n            this.groupBox.TabStop = false;\n            this.groupBox.Text = \"Mineral Name\";\n            // \n            // tableLayoutPanel1\n            // \n            this.tableLayoutPanel1.AutoSize = true;\n            this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.tableLayoutPanel1.ColumnCount = 3;\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tableLayoutPanel1.Controls.Add(this.txtStock, 2, 1);\n            this.tableLayoutPanel1.Controls.Add(this.icon, 0, 0);\n            this.tableLayoutPanel1.Controls.Add(this.lblLastPrice, 1, 0);\n            this.tableLayoutPanel1.Controls.Add(this.lblQuantity, 1, 1);\n            this.tableLayoutPanel1.Controls.Add(this.txtLastSell, 2, 0);\n            this.tableLayoutPanel1.Controls.Add(this.label1, 1, 2);\n            this.tableLayoutPanel1.Controls.Add(this.tbSubtotal, 2, 2);\n            this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.tableLayoutPanel1.Location = new System.Drawing.Point(2, 15);\n            this.tableLayoutPanel1.Name = \"tableLayoutPanel1\";\n            this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(10, 5, 10, 5);\n            this.tableLayoutPanel1.RowCount = 3;\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.Size = new System.Drawing.Size(257, 88);\n            this.tableLayoutPanel1.TabIndex = 3;\n            // \n            // label1\n            // \n            this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(89, 57);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(49, 26);\n            this.label1.TabIndex = 4;\n            this.label1.Text = \"Subtotal:\";\n            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // tbSubtotal\n            // \n            this.tbSubtotal.Location = new System.Drawing.Point(144, 60);\n            this.tbSubtotal.Name = \"tbSubtotal\";\n            this.tbSubtotal.ReadOnly = true;\n            this.tbSubtotal.Size = new System.Drawing.Size(100, 20);\n            this.tbSubtotal.TabIndex = 5;\n            this.tbSubtotal.TabStop = false;\n            // \n            // MineralTile\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.Controls.Add(this.groupBox);\n            this.Name = \"MineralTile\";\n            this.Size = new System.Drawing.Size(261, 105);\n            ((System.ComponentModel.ISupportInitialize)(this.icon)).EndInit();\n            this.groupBox.ResumeLayout(false);\n            this.groupBox.PerformLayout();\n            this.tableLayoutPanel1.ResumeLayout(false);\n            this.tableLayoutPanel1.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label lblQuantity;\n        private System.Windows.Forms.Label lblLastPrice;\n        private System.Windows.Forms.TextBox txtLastSell;\n        private System.Windows.Forms.TextBox txtStock;\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.TextBox tbSubtotal;\n        private System.Windows.Forms.GroupBox groupBox;\n        internal System.Windows.Forms.PictureBox icon;\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Sales/MineralTile.cs",
    "content": "using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Extensions;\nusing EVEMon.Common.Service;\n\nnamespace EVEMon.Sales\n{\n    public partial class MineralTile : UserControl\n    {\n        public event EventHandler<EventArgs> SubtotalChanged;\n        public event EventHandler<EventArgs> MineralPriceChanged;\n\n        private Item m_mineral;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MineralTile\"/> class.\n        /// </summary>\n        public MineralTile()\n        {\n            InitializeComponent();\n        }\n\n        #endregion\n\n        \n        #region Public Properties\n\n        /// <summary>\n        /// Gets or sets the name of the mineral.\n        /// </summary>\n        /// <value>The name of the mineral.</value>\n        public String MineralName\n        {\n            get { return m_mineral?.Name ?? groupBox.Text; }\n            set\n            {\n                groupBox.Text = value;\n\n                if (DesignMode || this.IsDesignModeHosted())\n                    return;\n\n                m_mineral = StaticItems.GetItemByName(value);\n                GetImageFromCCPAsync().ConfigureAwait(false);\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the quantity.\n        /// </summary>\n        /// <value>The quantity.</value>\n        [Browsable(false)]\n        public long Quantity\n        {\n            get { return Int64.Parse(txtStock.Text, CultureConstants.DefaultCulture); }\n            set { txtStock.Text = value.ToString(CultureConstants.DefaultCulture); }\n        }\n\n        /// <summary>\n        /// Gets or sets the price per unit.\n        /// </summary>\n        /// <value>The price per unit.</value>\n        [Browsable(false)]\n        public Decimal PricePerUnit\n        {\n            get { return Decimal.Parse(txtLastSell.Text, CultureConstants.DefaultCulture); }\n            set { txtLastSell.Text = value.ToString(\"N\", CultureConstants.DefaultCulture); }\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether [price locked].\n        /// </summary>\n        /// <value><c>true</c> if [price locked]; otherwise, <c>false</c>.</value>\n        [Browsable(false)]\n        public bool PriceLocked\n        {\n            get { return txtLastSell.ReadOnly; }\n            set\n            {\n                txtLastSell.TabStop = !value;\n                txtLastSell.ReadOnly = value;\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets the subtotal.\n        /// </summary>\n        /// <value>The subtotal.</value>\n        [Browsable(false)]\n        public decimal Subtotal { get; private set; }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the image from CCP's image server.\n        /// </summary>\n        /// <param name=\"useFallbackUri\">if set to <c>true</c> [use fallback URI].</param>\n        private async Task GetImageFromCCPAsync(bool useFallbackUri = false)\n        {\n            while (true)\n            {\n                Image img = await ImageService.GetImageAsync(GetImageUrl(useFallbackUri)).ConfigureAwait(false);\n\n                if (img == null && !useFallbackUri)\n                {\n                    useFallbackUri = true;\n                    continue;\n                }\n\n                GotImage(m_mineral.ID, img);\n                break;\n            }\n        }\n\n        /// <summary>\n        /// Gets the image URL.\n        /// </summary>\n        /// <param name=\"useFallbackUri\">if set to <c>true</c> [use fallback URI].</param>\n        /// <returns></returns>\n        private Uri GetImageUrl(bool useFallbackUri)\n        {\n            string path = String.Format(CultureConstants.InvariantCulture,\n                NetworkConstants.CCPIconsFromImageServer,\n                \"type\", m_mineral.ID, (int)EveImageSize.x64);\n\n            return useFallbackUri\n                ? ImageService.GetImageServerBaseUri(path)\n                : ImageService.GetImageServerCdnUri(path);\n        }\n\n        /// <summary>\n        /// Callback method for asynchronous web requests.\n        /// </summary>\n        /// <param name=\"id\">EveObject id for retrieved image</param>\n        /// <param name=\"image\">Image object retrieved</param>\n        private void GotImage(long id, Image image)\n        {\n            // Only display the image if the id matches the current EveObject\n            if (image != null && m_mineral.ID == id)\n                icon.Image = image;\n            else\n                ShowBlankImage();\n        }\n\n        /// <summary>\n        /// Renders a BackColor square as a placeholder for the image.\n        /// </summary>\n        private void ShowBlankImage()\n        {\n            Bitmap bmp;\n            using (Bitmap tempBitmap = new Bitmap(icon.ClientSize.Width, icon.ClientSize.Height))\n            {\n                bmp = (Bitmap)tempBitmap.Clone();\n            }\n\n            using (Graphics g = Graphics.FromImage(bmp))\n            using (SolidBrush brush = new SolidBrush(BackColor))\n            {\n                g.FillRectangle(brush, new Rectangle(0, 0, bmp.Width, bmp.Height));\n            }\n\n            icon.Image = bmp;\n        }\n\n        /// <summary>\n        /// Updates the subtotal.\n        /// </summary>\n        private void UpdateSubtotal()\n        {\n            decimal pricePerUnit;\n            long quantity;\n            if (!Decimal.TryParse(txtLastSell.Text, out pricePerUnit))\n                pricePerUnit = 0;\n\n            if (!Int64.TryParse(txtStock.Text, out quantity))\n                quantity = 0;\n\n            Subtotal = pricePerUnit * quantity;\n\n            tbSubtotal.Text = Subtotal.ToString(\"N\", CultureConstants.DefaultCulture);\n\n            SubtotalChanged?.ThreadSafeInvoke(this, EventArgs.Empty);\n        }\n\n        #endregion\n\n\n        #region Event Handlers\n\n        /// <summary>\n        /// Handles the TextChanged event of the txtLastSell control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void txtLastSell_TextChanged(object sender, EventArgs e)\n        {\n            UpdateSubtotal();\n            MineralPriceChanged?.ThreadSafeInvoke(this, EventArgs.Empty);\n        }\n\n        /// <summary>\n        /// Handles the TextChanged event of the txtStock control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void txtStock_TextChanged(object sender, EventArgs e)\n        {\n            UpdateSubtotal();\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Sales/MineralTile.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "src/EVEMon.Sales/MineralWorksheet.Designer.cs",
    "content": "namespace EVEMon.Sales\n{\n    partial class MineralWorksheet\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MineralWorksheet));\n            this.MineralWorksheetToolStrip = new System.Windows.Forms.ToolStrip();\n            this.btnLockPrices = new System.Windows.Forms.ToolStripButton();\n            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\n            this.tsddFetch = new System.Windows.Forms.ToolStripDropDownButton();\n            this.btnReset = new System.Windows.Forms.ToolStripButton();\n            this.copyTotalDropDownButton = new System.Windows.Forms.ToolStripDropDownButton();\n            this.copyFormattedTotalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.copyUnformattedTotalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.MineralWorksheetStatusStrip = new System.Windows.Forms.StatusStrip();\n            this.TotalValueToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();\n            this.tslTotal = new System.Windows.Forms.ToolStripStatusLabel();\n            this.tslCourtesy = new System.Windows.Forms.ToolStripStatusLabel();\n            this.mt_mexallon = new EVEMon.Sales.MineralTile();\n            this.mt_pyerite = new EVEMon.Sales.MineralTile();\n            this.mt_megacyte = new EVEMon.Sales.MineralTile();\n            this.mt_isogen = new EVEMon.Sales.MineralTile();\n            this.mt_zydrine = new EVEMon.Sales.MineralTile();\n            this.mt_morphite = new EVEMon.Sales.MineralTile();\n            this.mt_nocxium = new EVEMon.Sales.MineralTile();\n            this.mt_tritanium = new EVEMon.Sales.MineralTile();\n            this.MineralTileTableLayout = new System.Windows.Forms.TableLayoutPanel();\n            this.bckgrndWrkrGetPrices = new System.ComponentModel.BackgroundWorker();\n            this.MineralWorksheetToolStrip.SuspendLayout();\n            this.MineralWorksheetStatusStrip.SuspendLayout();\n            this.MineralTileTableLayout.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // MineralWorksheetToolStrip\n            // \n            this.MineralWorksheetToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\n            this.MineralWorksheetToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.btnLockPrices,\n            this.toolStripSeparator1,\n            this.tsddFetch,\n            this.btnReset,\n            this.copyTotalDropDownButton});\n            this.MineralWorksheetToolStrip.Location = new System.Drawing.Point(0, 0);\n            this.MineralWorksheetToolStrip.Name = \"MineralWorksheetToolStrip\";\n            this.MineralWorksheetToolStrip.Size = new System.Drawing.Size(538, 25);\n            this.MineralWorksheetToolStrip.TabIndex = 0;\n            // \n            // btnLockPrices\n            // \n            this.btnLockPrices.Image = ((System.Drawing.Image)(resources.GetObject(\"btnLockPrices.Image\")));\n            this.btnLockPrices.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.btnLockPrices.Name = \"btnLockPrices\";\n            this.btnLockPrices.Size = new System.Drawing.Size(86, 22);\n            this.btnLockPrices.Text = \"Lock Prices\";\n            this.btnLockPrices.Click += new System.EventHandler(this.btnLockPrices_Click);\n            // \n            // toolStripSeparator1\n            // \n            this.toolStripSeparator1.Name = \"toolStripSeparator1\";\n            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);\n            // \n            // tsddFetch\n            // \n            this.tsddFetch.Image = ((System.Drawing.Image)(resources.GetObject(\"tsddFetch.Image\")));\n            this.tsddFetch.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.tsddFetch.Name = \"tsddFetch\";\n            this.tsddFetch.Size = new System.Drawing.Size(137, 22);\n            this.tsddFetch.Text = \"Fetch Online Prices\";\n            // \n            // btnReset\n            // \n            this.btnReset.Image = ((System.Drawing.Image)(resources.GetObject(\"btnReset.Image\")));\n            this.btnReset.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.btnReset.Name = \"btnReset\";\n            this.btnReset.Size = new System.Drawing.Size(112, 22);\n            this.btnReset.Text = \"Reset Quantities\";\n            this.btnReset.Click += new System.EventHandler(this.btnReset_Click);\n            // \n            // copyTotalDropDownButton\n            // \n            this.copyTotalDropDownButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.copyFormattedTotalToolStripMenuItem,\n            this.copyUnformattedTotalToolStripMenuItem});\n            this.copyTotalDropDownButton.Image = ((System.Drawing.Image)(resources.GetObject(\"copyTotalDropDownButton.Image\")));\n            this.copyTotalDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta;\n            this.copyTotalDropDownButton.Name = \"copyTotalDropDownButton\";\n            this.copyTotalDropDownButton.Size = new System.Drawing.Size(93, 22);\n            this.copyTotalDropDownButton.Text = \"Copy Total\";\n            this.copyTotalDropDownButton.DropDownOpening += new System.EventHandler(this.copyTotalDropDownButton_DropDownOpening);\n            // \n            // copyFormattedTotalToolStripMenuItem\n            // \n            this.copyFormattedTotalToolStripMenuItem.Name = \"copyFormattedTotalToolStripMenuItem\";\n            this.copyFormattedTotalToolStripMenuItem.Size = new System.Drawing.Size(142, 22);\n            this.copyFormattedTotalToolStripMenuItem.Text = \"Formatted\";\n            this.copyFormattedTotalToolStripMenuItem.Click += new System.EventHandler(this.copyFormattedTotalToolStripMenuItem_Click);\n            // \n            // copyUnformattedTotalToolStripMenuItem\n            // \n            this.copyUnformattedTotalToolStripMenuItem.Name = \"copyUnformattedTotalToolStripMenuItem\";\n            this.copyUnformattedTotalToolStripMenuItem.Size = new System.Drawing.Size(142, 22);\n            this.copyUnformattedTotalToolStripMenuItem.Text = \"Unformatted\";\n            this.copyUnformattedTotalToolStripMenuItem.Click += new System.EventHandler(this.copyUnformattedTotalToolStripMenuItem_Click);\n            // \n            // MineralWorksheetStatusStrip\n            // \n            this.MineralWorksheetStatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.TotalValueToolStripStatusLabel,\n            this.tslTotal,\n            this.tslCourtesy});\n            this.MineralWorksheetStatusStrip.Location = new System.Drawing.Point(0, 510);\n            this.MineralWorksheetStatusStrip.Name = \"MineralWorksheetStatusStrip\";\n            this.MineralWorksheetStatusStrip.Size = new System.Drawing.Size(538, 22);\n            this.MineralWorksheetStatusStrip.SizingGrip = false;\n            this.MineralWorksheetStatusStrip.TabIndex = 10;\n            this.MineralWorksheetStatusStrip.Text = \"statusStrip1\";\n            // \n            // TotalValueToolStripStatusLabel\n            // \n            this.TotalValueToolStripStatusLabel.Name = \"TotalValueToolStripStatusLabel\";\n            this.TotalValueToolStripStatusLabel.Size = new System.Drawing.Size(67, 17);\n            this.TotalValueToolStripStatusLabel.Text = \"Total Value:\";\n            // \n            // tslTotal\n            // \n            this.tslTotal.Image = ((System.Drawing.Image)(resources.GetObject(\"tslTotal.Image\")));\n            this.tslTotal.Margin = new System.Windows.Forms.Padding(5, 3, 0, 2);\n            this.tslTotal.Name = \"tslTotal\";\n            this.tslTotal.Size = new System.Drawing.Size(63, 17);\n            this.tslTotal.Text = \"0.00 ISK\";\n            // \n            // tslCourtesy\n            // \n            this.tslCourtesy.Image = ((System.Drawing.Image)(resources.GetObject(\"tslCourtesy.Image\")));\n            this.tslCourtesy.IsLink = true;\n            this.tslCourtesy.Margin = new System.Windows.Forms.Padding(15, 3, 0, 2);\n            this.tslCourtesy.Name = \"tslCourtesy\";\n            this.tslCourtesy.Size = new System.Drawing.Size(179, 17);\n            this.tslCourtesy.Text = \"Mineral Prices Courtesy of ---\";\n            this.tslCourtesy.Visible = false;\n            this.tslCourtesy.Click += new System.EventHandler(this.tslCourtesy_Click);\n            // \n            // mt_mexallon\n            // \n            this.mt_mexallon.AutoSize = true;\n            this.mt_mexallon.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.mt_mexallon.Location = new System.Drawing.Point(4, 230);\n            this.mt_mexallon.Margin = new System.Windows.Forms.Padding(4);\n            this.mt_mexallon.MineralName = \"Mexallon\";\n            this.mt_mexallon.Name = \"mt_mexallon\";\n            this.mt_mexallon.PriceLocked = false;\n            this.mt_mexallon.PricePerUnit = new decimal(new int[] {\n            0,\n            0,\n            0,\n            131072});\n            this.mt_mexallon.Quantity = ((long)(0));\n            this.mt_mexallon.Size = new System.Drawing.Size(261, 105);\n            this.mt_mexallon.TabIndex = 3;\n            this.mt_mexallon.MineralPriceChanged += new System.EventHandler<System.EventArgs>(this.mt_MineralPriceChanged);\n            // \n            // mt_pyerite\n            // \n            this.mt_pyerite.AutoSize = true;\n            this.mt_pyerite.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.mt_pyerite.Location = new System.Drawing.Point(4, 117);\n            this.mt_pyerite.Margin = new System.Windows.Forms.Padding(4);\n            this.mt_pyerite.MineralName = \"Pyerite\";\n            this.mt_pyerite.Name = \"mt_pyerite\";\n            this.mt_pyerite.PriceLocked = false;\n            this.mt_pyerite.PricePerUnit = new decimal(new int[] {\n            0,\n            0,\n            0,\n            131072});\n            this.mt_pyerite.Quantity = ((long)(0));\n            this.mt_pyerite.Size = new System.Drawing.Size(261, 105);\n            this.mt_pyerite.TabIndex = 2;\n            this.mt_pyerite.MineralPriceChanged += new System.EventHandler<System.EventArgs>(this.mt_MineralPriceChanged);\n            // \n            // mt_megacyte\n            // \n            this.mt_megacyte.AutoSize = true;\n            this.mt_megacyte.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.mt_megacyte.Location = new System.Drawing.Point(273, 230);\n            this.mt_megacyte.Margin = new System.Windows.Forms.Padding(4);\n            this.mt_megacyte.MineralName = \"Megacyte\";\n            this.mt_megacyte.Name = \"mt_megacyte\";\n            this.mt_megacyte.PriceLocked = false;\n            this.mt_megacyte.PricePerUnit = new decimal(new int[] {\n            0,\n            0,\n            0,\n            131072});\n            this.mt_megacyte.Quantity = ((long)(0));\n            this.mt_megacyte.Size = new System.Drawing.Size(261, 105);\n            this.mt_megacyte.TabIndex = 7;\n            this.mt_megacyte.MineralPriceChanged += new System.EventHandler<System.EventArgs>(this.mt_MineralPriceChanged);\n            // \n            // mt_isogen\n            // \n            this.mt_isogen.AutoSize = true;\n            this.mt_isogen.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.mt_isogen.Location = new System.Drawing.Point(4, 343);\n            this.mt_isogen.Margin = new System.Windows.Forms.Padding(4);\n            this.mt_isogen.MineralName = \"Isogen\";\n            this.mt_isogen.Name = \"mt_isogen\";\n            this.mt_isogen.PriceLocked = false;\n            this.mt_isogen.PricePerUnit = new decimal(new int[] {\n            0,\n            0,\n            0,\n            131072});\n            this.mt_isogen.Quantity = ((long)(0));\n            this.mt_isogen.Size = new System.Drawing.Size(261, 105);\n            this.mt_isogen.TabIndex = 4;\n            this.mt_isogen.MineralPriceChanged += new System.EventHandler<System.EventArgs>(this.mt_MineralPriceChanged);\n            // \n            // mt_zydrine\n            // \n            this.mt_zydrine.AutoSize = true;\n            this.mt_zydrine.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.mt_zydrine.Location = new System.Drawing.Point(273, 117);\n            this.mt_zydrine.Margin = new System.Windows.Forms.Padding(4);\n            this.mt_zydrine.MineralName = \"Zydrine\";\n            this.mt_zydrine.Name = \"mt_zydrine\";\n            this.mt_zydrine.PriceLocked = false;\n            this.mt_zydrine.PricePerUnit = new decimal(new int[] {\n            0,\n            0,\n            0,\n            131072});\n            this.mt_zydrine.Quantity = ((long)(0));\n            this.mt_zydrine.Size = new System.Drawing.Size(261, 105);\n            this.mt_zydrine.TabIndex = 6;\n            this.mt_zydrine.MineralPriceChanged += new System.EventHandler<System.EventArgs>(this.mt_MineralPriceChanged);\n            // \n            // mt_morphite\n            // \n            this.mt_morphite.AutoSize = true;\n            this.mt_morphite.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.mt_morphite.Location = new System.Drawing.Point(273, 343);\n            this.mt_morphite.Margin = new System.Windows.Forms.Padding(4);\n            this.mt_morphite.MineralName = \"Morphite\";\n            this.mt_morphite.Name = \"mt_morphite\";\n            this.mt_morphite.PriceLocked = false;\n            this.mt_morphite.PricePerUnit = new decimal(new int[] {\n            0,\n            0,\n            0,\n            131072});\n            this.mt_morphite.Quantity = ((long)(0));\n            this.mt_morphite.Size = new System.Drawing.Size(261, 105);\n            this.mt_morphite.TabIndex = 8;\n            this.mt_morphite.MineralPriceChanged += new System.EventHandler<System.EventArgs>(this.mt_MineralPriceChanged);\n            // \n            // mt_nocxium\n            // \n            this.mt_nocxium.AutoSize = true;\n            this.mt_nocxium.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.mt_nocxium.Location = new System.Drawing.Point(273, 4);\n            this.mt_nocxium.Margin = new System.Windows.Forms.Padding(4);\n            this.mt_nocxium.MineralName = \"Nocxium\";\n            this.mt_nocxium.Name = \"mt_nocxium\";\n            this.mt_nocxium.PriceLocked = false;\n            this.mt_nocxium.PricePerUnit = new decimal(new int[] {\n            0,\n            0,\n            0,\n            131072});\n            this.mt_nocxium.Quantity = ((long)(0));\n            this.mt_nocxium.Size = new System.Drawing.Size(261, 105);\n            this.mt_nocxium.TabIndex = 5;\n            this.mt_nocxium.MineralPriceChanged += new System.EventHandler<System.EventArgs>(this.mt_MineralPriceChanged);\n            // \n            // mt_tritanium\n            // \n            this.mt_tritanium.AutoSize = true;\n            this.mt_tritanium.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.mt_tritanium.Location = new System.Drawing.Point(4, 4);\n            this.mt_tritanium.Margin = new System.Windows.Forms.Padding(4);\n            this.mt_tritanium.MineralName = \"Tritanium\";\n            this.mt_tritanium.Name = \"mt_tritanium\";\n            this.mt_tritanium.PriceLocked = false;\n            this.mt_tritanium.PricePerUnit = new decimal(new int[] {\n            0,\n            0,\n            0,\n            131072});\n            this.mt_tritanium.Quantity = ((long)(0));\n            this.mt_tritanium.Size = new System.Drawing.Size(261, 105);\n            this.mt_tritanium.TabIndex = 1;\n            this.mt_tritanium.MineralPriceChanged += new System.EventHandler<System.EventArgs>(this.mt_MineralPriceChanged);\n            // \n            // MineralTileTableLayout\n            // \n            this.MineralTileTableLayout.AutoSize = true;\n            this.MineralTileTableLayout.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.MineralTileTableLayout.ColumnCount = 2;\n            this.MineralTileTableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.MineralTileTableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.MineralTileTableLayout.Controls.Add(this.mt_tritanium, 0, 0);\n            this.MineralTileTableLayout.Controls.Add(this.mt_nocxium, 1, 0);\n            this.MineralTileTableLayout.Controls.Add(this.mt_morphite, 1, 3);\n            this.MineralTileTableLayout.Controls.Add(this.mt_zydrine, 1, 1);\n            this.MineralTileTableLayout.Controls.Add(this.mt_isogen, 0, 3);\n            this.MineralTileTableLayout.Controls.Add(this.mt_megacyte, 1, 2);\n            this.MineralTileTableLayout.Controls.Add(this.mt_pyerite, 0, 1);\n            this.MineralTileTableLayout.Controls.Add(this.mt_mexallon, 0, 2);\n            this.MineralTileTableLayout.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.MineralTileTableLayout.Location = new System.Drawing.Point(0, 25);\n            this.MineralTileTableLayout.Name = \"MineralTileTableLayout\";\n            this.MineralTileTableLayout.RowCount = 4;\n            this.MineralTileTableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MineralTileTableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MineralTileTableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MineralTileTableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.MineralTileTableLayout.Size = new System.Drawing.Size(538, 485);\n            this.MineralTileTableLayout.TabIndex = 9;\n            // \n            // bckgrndWrkrGetPrices\n            // \n            this.bckgrndWrkrGetPrices.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bckgrndWrkrGetPrices_DoWork);\n            this.bckgrndWrkrGetPrices.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.bckgrndWrkrGetPrices_RunWorkerCompleted);\n            // \n            // MineralWorksheet\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.ClientSize = new System.Drawing.Size(538, 532);\n            this.Controls.Add(this.MineralTileTableLayout);\n            this.Controls.Add(this.MineralWorksheetStatusStrip);\n            this.Controls.Add(this.MineralWorksheetToolStrip);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\n            this.MaximizeBox = false;\n            this.Name = \"MineralWorksheet\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Mineral Worksheet\";\n            this.Load += new System.EventHandler(this.MineralWorksheet_Load);\n            this.MineralWorksheetToolStrip.ResumeLayout(false);\n            this.MineralWorksheetToolStrip.PerformLayout();\n            this.MineralWorksheetStatusStrip.ResumeLayout(false);\n            this.MineralWorksheetStatusStrip.PerformLayout();\n            this.MineralTileTableLayout.ResumeLayout(false);\n            this.MineralTileTableLayout.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.ToolStrip MineralWorksheetToolStrip;\n        private System.Windows.Forms.ToolStripButton btnLockPrices;\n        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\n        private System.Windows.Forms.ToolStripDropDownButton tsddFetch;\n        private System.Windows.Forms.StatusStrip MineralWorksheetStatusStrip;\n        private System.Windows.Forms.ToolStripStatusLabel TotalValueToolStripStatusLabel;\n        private System.Windows.Forms.ToolStripStatusLabel tslTotal;\n        private System.Windows.Forms.ToolStripStatusLabel tslCourtesy;\n        private System.Windows.Forms.ToolStripButton btnReset;\n        private System.Windows.Forms.ToolStripDropDownButton copyTotalDropDownButton;\n        private System.Windows.Forms.ToolStripMenuItem copyFormattedTotalToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem copyUnformattedTotalToolStripMenuItem;\n        private MineralTile mt_mexallon;\n        private MineralTile mt_pyerite;\n        private MineralTile mt_megacyte;\n        private MineralTile mt_isogen;\n        private MineralTile mt_zydrine;\n        private MineralTile mt_morphite;\n        private MineralTile mt_nocxium;\n        private MineralTile mt_tritanium;\n        private System.Windows.Forms.TableLayoutPanel MineralTileTableLayout;\n\t\tprivate System.ComponentModel.BackgroundWorker bckgrndWrkrGetPrices;\n\n    }\n}\n\n\n\n\n"
  },
  {
    "path": "src/EVEMon.Sales/MineralWorksheet.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Windows.Forms;\nusing EVEMon.Common;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Helpers;\n\nnamespace EVEMon.Sales\n{\n    public partial class MineralWorksheet : EVEMonForm\n    {\n        private Decimal m_total;\n        private string m_courtesyUrl;\n        private string m_source;\n        private bool m_pricesLocked;\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MineralWorksheet\"/> class.\n        /// </summary>\n        public MineralWorksheet()\n        {\n            InitializeComponent();\n        }\n\n        #endregion\n\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the tiles.\n        /// </summary>\n        /// <value>The tiles.</value>\n        private IEnumerable<MineralTile> Tiles\n            => MineralTileTableLayout.Controls.OfType<MineralTile>().Select(control => control);\n\n        /// <summary>\n        /// Sets a value indicating whether [prices locked].\n        /// </summary>\n        /// <value><c>true</c> if [prices locked]; otherwise, <c>false</c>.</value>\n        private bool PricesLocked\n        {\n            set\n            {\n                m_pricesLocked = value;\n                foreach (MineralTile mt in Tiles)\n                {\n                    mt.PriceLocked = value;\n                }\n            }\n        }\n\n        #endregion\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Updates the visuals.\n        /// </summary>\n        private void UpdateVisuals()\n        {\n            foreach (ToolStripItem item in MineralWorksheetToolStrip.Items)\n            {\n                item.DisplayStyle = Settings.UI.SafeForWork\n                    ? ToolStripItemDisplayStyle.Text\n                    : ToolStripItemDisplayStyle.ImageAndText;\n            }\n\n            foreach (ToolStripStatusLabel item in MineralWorksheetStatusStrip.Items)\n            {\n                item.DisplayStyle = Settings.UI.SafeForWork\n                    ? ToolStripItemDisplayStyle.Text\n                    : ToolStripItemDisplayStyle.ImageAndText;\n            }\n\n            foreach (MineralTile tile in Tiles)\n            {\n                tile.icon.Visible = !Settings.UI.SafeForWork;\n            }\n        }\n\n        #endregion\n\n\n        #region Local Events Handlers\n\n        /// <summary>\n        /// Handles the Load event of the MineralWorksheet control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void MineralWorksheet_Load(object sender, EventArgs e)\n        {\n            if (DesignMode || this.IsDesignModeHosted())\n                return;\n\n            MineralDataRequest.Initialize();\n\n            EveMonClient.SettingsChanged += EveMonClient_SettingsChanged;\n            Disposed += OnDiposed;\n\n            UpdateVisuals();\n\n            foreach (MineralTile mineralTile in Tiles)\n            {\n                mineralTile.SubtotalChanged += TileSubtotal_Changed;\n            }\n\n            foreach (IMineralParser parser in MineralDataRequest.Parsers)\n            {\n                ToolStripMenuItem menuItem;\n                using (ToolStripMenuItem item = new ToolStripMenuItem())\n                {\n                    item.Text = parser.Title;\n                    item.Tag = parser.Name;\n                    item.Click += menuItem_Click;\n                    menuItem = item;\n                }\n                tsddFetch.DropDownItems.Add(menuItem);\n            }\n        }\n\n        /// <summary>\n        /// Called when diposed.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void OnDiposed(object sender, EventArgs e)\n        {\n            EveMonClient.SettingsChanged -= EveMonClient_SettingsChanged;\n            Disposed -= OnDiposed;\n        }\n\n        /// <summary>\n        /// Handles the Changed event of the TileSubtotal control.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void TileSubtotal_Changed(object sender, EventArgs e)\n        {\n            m_total = 0;\n            foreach (MineralTile mt in Tiles)\n            {\n                m_total += mt.Subtotal;\n            }\n\n            tslTotal.Text = $\"{m_total:N} ISK\";\n        }\n\n        #endregion\n\n\n        #region Global Event Handlers\n\n        /// <summary>\n        /// Handles the SettingsChanged event of the EveMonClient control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void EveMonClient_SettingsChanged(object sender, EventArgs e)\n        {\n            UpdateVisuals();\n        }\n\n        #endregion\n\n\n        #region Control Event Handlers\n\n        /// <summary>\n        /// Handles the Click event of the mi control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void menuItem_Click(object sender, EventArgs e)\n        {\n            if (bckgrndWrkrGetPrices.IsBusy)\n                return;\n\n            ToolStripMenuItem mi = sender as ToolStripMenuItem;\n            if (mi == null || !(mi.Tag is string))\n                return;\n\n            m_source = mi.Tag as string;\n            bckgrndWrkrGetPrices.RunWorkerAsync(m_source);\n        }\n\n        /// <summary>\n        /// Handles the DoWork event of the bckgrndWrkrGetPrices control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.DoWorkEventArgs\"/> instance containing the event data.</param>\n        private void bckgrndWrkrGetPrices_DoWork(object sender, DoWorkEventArgs e)\n        {\n            IDictionary<string, Decimal> prices = new Dictionary<string, decimal>();\n            string source = e.Argument as string;\n            if (source != null)\n            {\n                foreach (MineralPrice mineralPrice in MineralDataRequest.Prices(source))\n                {\n                    prices[mineralPrice.Name] = mineralPrice.Price;\n                }\n            }\n\n            e.Result = prices;\n        }\n\n        /// <summary>\n        /// Handles the RunWorkerCompleted event of the bckgrndWrkrGetPrices control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.ComponentModel.RunWorkerCompletedEventArgs\"/> instance containing the event data.</param>\n        private void bckgrndWrkrGetPrices_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)\n        {\n            if (e.Error != null)\n            {\n                ExceptionHandler.LogException(e.Error, true);\n                MessageBox.Show($\"Failed to retrieve mineral pricing data:\\n{e.Error.Message}\",\n                    @\"Failed to Retrieve Data\", MessageBoxButtons.OK, MessageBoxIcon.Error,\n                    MessageBoxDefaultButton.Button1, 0);\n            }\n            else\n            {\n                IDictionary<string, Decimal> prices = e.Result as IDictionary<string, Decimal>;\n                if (prices == null)\n                    return;\n\n                foreach (MineralTile mt in Tiles)\n                {\n                    mt.PricePerUnit = prices.ContainsKey(mt.MineralName) ? prices[mt.MineralName] : 0m;\n                }\n\n                tslCourtesy.Text = $\"Mineral Prices Courtesy of {MineralDataRequest.GetCourtesyText(m_source)}\";\n                m_courtesyUrl = MineralDataRequest.GetCourtesyUrl(m_source).AbsoluteUri;\n                tslCourtesy.Visible = true;\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnLockPrices control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnLockPrices_Click(object sender, EventArgs e)\n        {\n            if (m_pricesLocked)\n            {\n                PricesLocked = false;\n                btnLockPrices.Text = @\"Lock Prices\";\n            }\n            else\n            {\n                PricesLocked = true;\n                btnLockPrices.Text = @\"Unlock Prices\";\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the tslCourtesy control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void tslCourtesy_Click(object sender, EventArgs e)\n        {\n            Util.OpenURL(new Uri(m_courtesyUrl));\n        }\n\n        /// <summary>\n        /// Handles the MineralPriceChanged event of the mt control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void mt_MineralPriceChanged(object sender, EventArgs e)\n        {\n            tslCourtesy.Visible = false;\n        }\n\n        /// <summary>\n        /// Handles the Click event of the btnReset control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void btnReset_Click(object sender, EventArgs e)\n        {\n            foreach (MineralTile mt in Tiles)\n            {\n                mt.Quantity = 0;\n            }\n        }\n\n        /// <summary>\n        /// Handles the DropDownOpening event of the copyTotalDropDownButton control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void copyTotalDropDownButton_DropDownOpening(object sender, EventArgs e)\n        {\n            copyFormattedTotalToolStripMenuItem.Text = $\"Formatted ({m_total:N} ISK)\";\n            copyUnformattedTotalToolStripMenuItem.Text = $\"Unformatted ({m_total})\";\n        }\n\n        /// <summary>\n        /// Handles the Click event of the copyFormattedTotalToolStripMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void copyFormattedTotalToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            try\n            {\n                Clipboard.Clear();\n                Clipboard.SetText(tslTotal.Text);\n            }\n            catch (ExternalException ex)\n            {\n                // An exception is thrown when the clipboard is in use by another procedure\n                ExceptionHandler.LogException(ex, true);\n            }\n        }\n\n        /// <summary>\n        /// Handles the Click event of the copyUnformattedTotalToolStripMenuItem control.\n        /// </summary>\n        /// <param name=\"sender\">The source of the event.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private void copyUnformattedTotalToolStripMenuItem_Click(object sender, EventArgs e)\n        {\n            try\n            {\n                Clipboard.Clear();\n                Clipboard.SetText(m_total.ToString(CultureConstants.DefaultCulture));\n            }\n            catch (ExternalException ex)\n            {\n                // An exception is thrown when the clipboard is in use by another procedure\n                ExceptionHandler.LogException(ex, true);\n            }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "src/EVEMon.Sales/MineralWorksheet.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"MineralWorksheetToolStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"btnLockPrices.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKISURBVDhPtZJfSJNRGMZ30R9rpjVzDQkR25YmttVUUGfT\n        Ly8KagttJspqmM10zmClJgxp03TMJjo3dGmagbGlM82my5gjcjaQMhJ20dy9ePFdCYIgT9/kwxhGN9EP\n        Hjg8531/F4fD+C9IJJIDOp1OEAwGy9fW1soNBoMg0tHXf0elUp2cnJzsCgQCG6urq9vhcHh7fX19Y3Fx\n        sStyR4/9GZFIdHB4eNjgcrk27Xa7w2Qyybq7u2XTMzOOUCi06fF4DJEZenw/HR0dXIvFEtbr9W6NRhNH\n        14zI2WazuaempsJms5lL1/uxWq1irVa71dLSoqGrPdRqtYYSb/l8PjFd7ae6WkkoFIqd0dHRKrraQyqV\n        VlHsOF1Ogq6i6aw4m/mw7KLjtkyM/kbp7HdHkzH8occY9g4aQ59fG+fGrLNDtmdY9s87lt4OZNJrv6kl\n        EuU1BBtERjxUBAfPVRmYeyKBz3wT/sF6fHXqEfJPILTyCd7xPjm9tguTCkd24URNRV4CcnmxUF5iw1R5\n        BhONWfC0XcFCrwJfRrQIel/i5/JHeMfMUYIUKvzrwvi7ZTksCJOPojSbhUfXTmPgXgbGm8VwP70BX18V\n        Vt71ILg0g/lX7VECDhVhYfqxhoggPSkGxLk4VOYlorU0BQP3hXA0F8HdLkNgrBU/fG8wZ38cJUimkpvP\n        i9Up8hPA58QglxuLq4LjqC1OgrGSj8E6EZxNBVjor8M3zwje9z2IEkR+1vk8HtOgKmLvCnJSmSimHvNO\n        ARutJSnoVaZhqFaA6c5b8Lt6Md6pjBJEOCRJi6uXZ7NIHvswmZV6hJTwmWRJFotUXz5FUhKyTc4lLQ0E\n        +cKgIk01hTJ6719hMH4BWnwlxcvRxw0AAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"tsddFetch.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAMDSURBVDhPY0ACjEDMDMSsQMwC5RMNGAUFBfn19PTUfAJC\n        LHPq612impqM1f38eEFyECW4AaOQkBBfWFSU4/HTZ9d9+vL16/vff/4d/v79Z//Zc2ej+ydFGvv4cEHV\n        YgXM6vr6Cqdv3z74+8fvv39+/Pn3/cevP0c+fPjQuPfoYc/q5gbL/PwAqFqsgLl9/Za0O9++/fj+69ef\n        Hz9//n76+fOXLY8ePSrdtHmld0dHpW54eKhBSIgWVD0GYOo9cnHtng+fv1z+/PnrhY8fP8w9f+Fi8bot\n        G+2y8vOsCkoL9VNSooGGOAPVYg0Ploa9V/ZPvPDk+fQbT17MefjkWfWBg6dzdu0+6N7WMcmyqq5T0tza\n        xjw5OZFBXp4DqgcFsGQv3rKk+cCNh0WbT9xPWrThrkFk1iHjjNLt4lYuM40y85d75Ob3dG7aulJWX1+b\n        QUaGE6oPDliDWicVp87fdjl2/tbXIcs3f7HpmPzRafrC99p55feCZi16Et3de7Fr+YrDFl5eufzy8oaS\n        amoiUL1gwCaub6rt2zJjv0vthA9mJW0/hex9f6rHp/9Q9Q/9mDVr9sfcif1vHENDHlm7Om7RtjBr4pGQ\n        EIXqBQNQ6uOSMLGJMSuqf2LT0PPTr6XzT9Wq5X8rZkz9Uz6h+3d2ReFnrwCvG14BTo+sXKxX8/PzKwD1\n        MIF1AwHIAGDSZdXlllXrtoxIuzdvy8p/02d0/m9rr/pfV535vygv7n9hfuT/trbc/11dhf99fe03AbWY\n        QrRDTAJhQaCg+ZKFC09du3ry/5Ej2/6vXbvg/6qVM/4vWtj+f8vmmf8PH1j4f/uWmf8PHVz/z9nZfiNQ\n        DxvIABAAxS8LLy+v8I4dW15v3bby//KVs//PmtX/f+bMnv8zZnT/XzS/7/+iOV3/Z09t+7904bT/uTmp\n        V4B6BMC6oQBsiI6hhqWUlHiYuLhIsoSEWIa4uGiumJhIPh8fdy4/D1cqNzdHhIAArx8XF5c3UD3WPAIy\n        CBQuIOexQ2lkDPIuNEUyMAAArUc9DacBdXoAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"btnReset.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIaSURBVDhPtVK7qlpREFVCEkgXUuRFUuUP/IMovhWVCL6w\n        EeIV8VEoYgjGQhEJCKKIWNhYxEIRRIuIYmMTEAR/wT/wdTXnsbPmuC9cCSRNsmDY58zMWnvNnKP6L9Bq\n        tc+MRmPGZDJ9MxgMXUTaYrE85eW/A8RKIpE4DYdDYTKZCLlc7kQ5Xv4zcHPM4/Ecu90um06n7A5er/cA\n        kSjqj3nr7yCbZrN51263pcFgwCKRiAAhgQRWq5WUzWZPGGeLVvWFcQ01BF6TQKPRkPr9PrNarXuI3CoW\n        gHQ6TaNEef8V1KQMgV0wGDw4nc494kA5WD/WarWfi8VCojwEPtlstuecdwGS70Oh0HG9Xkt0UzQaVawi\n        v7s7Ib5PpVIn1M54/8qpF2AxbizuIEkKn/V6PfE+mcLv959msxkbj8fM4XDsMaqR0xUH31EUiYxTCgQC\n        NOuN2+1+BHE/7YUcVCoVZTeZTEZAvsfpisBmu93KoiiyfD4v0G0+n+8IB59dLtdhPp+L8Xj8XCqVxNFo\n        xKrVqgTOD05XRvhSLBbPy+WStVotBgLrdDqy3W7fbzYbWZnrHsLh8C04HzldpdLpdK/IZiwWEwuFglyv\n        1+VyuSyRbXxSQZZlhgXLFM1mU6DdYLwHnH4BFD/QsiBEn4qClndDZzKZPNM/Qc9ERug47RpoeoJ4q9fr\n        39BPRTk0v6RdIPcO4i80Gs1DpfnfQKX6BcgwWaUjjeHsAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <data name=\"copyTotalDropDownButton.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\n        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJKSURBVDhPjZHdT1JhAMYP113kRX+BdVHXddHWyrnVZmur\n        lqINrbCCFI87TAFlCEfyA5UExcM5og1UTNFUWAovYSWIbTUvEqdt1UKri+qC9bGuunl6Te/kbD7bs/dc\n        /PbsfX+H4XlL+6TUlgzw2nhvfVncoDoX15ediRsqiuPm2xcXO/SqGWdj1SFGLr5+WyLxwoN58gCzkU5M\n        hHiMBC14GDBDGGzEk0nnz4+L04f38P0R7TXEN2KFobUOdaY70Ju1MPI6cPQ0tNYiERNyW2/CBXv4/nQZ\n        VaSnrwEa7iaqNNdRXVuJBosWal0l6ps1WHhszW0t8fIDpntXyGjIDl+wFaK/BWLACmnEBqe7BeND7Rht\n        0/11ccpnsm7MNaXE/4hH/1Az3JIJDjcHl2jEoNCCA7mxcuUkFHFgItyF8TkHgrMUpt/D9FkHcmNmSwlZ\n        8mBhaQCxlBdkebfeHhYHcnNXdZ4srw4jmhLwdEXE81c+kLSATpsa+dzsVByzY8zD5sLuWwVMXXUJWc9O\n        YX17GhtfZpBe82M+6UH3fQ3yuekbbIJER/0uXS7M0wFb/bXE529hZL/O4dP3MDY/BPFuexJCL4t8biYi\n        3ZgiboS8XI7+RAVTcvp4X+ON4vdceVFGrzybYa+eymgunMiYNJd+53MTTQqIpiVIndU7A/9zhPYYbSHt\n        0b0WqiuKUvnczBAnYisSBuwVPygnHzk38/RW8dc++Hu1vyim2KXzRM7N2tsANrMhvCTiH4rJD8i5YS+f\n        zHSwyg17U+0qwzCKf5d8BSQiyZlqAAAAAElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"MineralWorksheetStatusStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>268, 17</value>\n  </metadata>\n  <data name=\"tslTotal.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL\n        EwAACxMBAJqcGAAAAAd0SU1FB9kMERABNPA5XDgAAANCSURBVDhPY8AFmJiYoCwGRiCbG0RDuAjQ2NgI\n        ZaEBRkaIWqBGRgUFRdnZs2e2TZrQGbJv52yNg7tnaxzdM0dj+8bpxiClYIUgoBEdBKaNWssZM1bNYdZM\n        i2YGcpmUlNQMdu7Y9M7NzfU4KwvzSg4O9lWzW7O/e7pYfQXKQzQhAa6MY9veN587+D1lzYKv5t213UAx\n        Nk115cWsrKxSQDbT+tWz6qP8bf8C2YeAmA+IESCwpSZ74o0T/wtWLvh//sG9/8svnfkIFGYHYlAYsC6Y\n        Pzlo+cTC/0D2fSBWAWII4JWSANO2E5ujPGd1/U/bs/r/roc3//cc2v0OJL5pzcT4LRtmLL95ZuuvztbC\n        v5XlKVfVVKRBYcDA8P8/0EB3axavOT3OYfMmrXCf1f3fsrvxf9OmNf8zNy37AFQSBsLzJ1XeCfJ3+y0o\n        KLQYyA8BYhcghoAVh/fNSdix6n/jnk3/Ozes/le+Z+P/w28e/Y+cP/ULEzNz4Z5dy09EB9iD/L0XiFlB\n        erZuXdFuZmoqC2IzOExtW9b24Nj/Q1+e/f/068f/6WeP/I9fv/B/wsH1/w49ufv1zuWtIH/fAWJxsAYg\n        uHph7Xkg5c3AwsAk7jix5YRZS8X/yA0L/m86e/pf2MyJ/6J3LP+k313/3y0z8b+RofY/Uwv91/q6qteM\n        DdRPmRlrn9HRUrwLNCCGgU9KQkInLqLNqLros35V0c/cGZOf8OlolDh21GyPXjf7f+7mZf/3Xr7w3zw7\n        +SILN1cwUJMIEItCMQcQMzCxcnMJy+mo61sumngg/+SO/7Und/+Xrcr7ZF5T9Npr8ZQ3plVFj2Vd7JO0\n        kiM1IqZ1Opj11OgB9QmBNMMAo6SRnlnplT1fTDuq/3m1Nvw/9OTef04p8UlC8jLqzGxsMrad1TmJR7b+\n        bzi5579ZQ/l/xXD/HUB9ihDtQCCoIK9smp81XyY9+bNKfsZHy4ria6xcnKDUBwJMLu1VfdVX9/6s37fx\n        36uvn//71pSDwgBhACjL8ctIisqZGKrJmRmrqLg6iAHF4JmFTVRUVinEv1MzI/mgR2/zdYOEyDSQMFiS\n        EaEOE0BzJhAwAjM4B7+YsDCQDQpIdiYmZgYAFMk3wFl326oAAAAASUVORK5CYII=\n</value>\n  </data>\n  <data name=\"tslCourtesy.Image\" type=\"System.Drawing.Bitmap, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO\n        wwAADsMBx2+oZAAAAB90RVh0U29mdHdhcmUAUGFpbnQuTkVUID8/Pz8/PyAzLjUuMeCnx3gAAAMlSURB\n        VDhPY4ABZmZmRk5OTmZeXl5WHh4eFlZWVkaoFGHAzs7OKCEhwW9oYKjmFxRsmd3Q4BLZ1GSs5+fPCzIY\n        qgw7ANkkIiLCFx4V5Xj8zNl1n759//rx779/R3/+/Nl/9tzZ2P6JkboREVxQ5ZiAg4ODWVtXV+Hs7dsH\n        //76+/ffr3//fv768+fYhw8fmvcfPexZ09xgmZcfAFWOCYDOZ+7YsDXtzo8fP37++fPn1+/fv59//fpl\n        25Mnj8o2bVnp3dlVqRMeEWocEa4F1YIK2Dk4mXqPXFq758OXL5e/fv164ePHD/POX7pYvGHLRrus/Dyr\n        wrJC/ZSUaL3ICGc2QUHM8ODg42dp2H9l/+RLT5/PvPXsxZyHT55VHzh8OnfXnoMe7V2TrKrrOiUtrGws\n        UlISecXFOaDaEICVg5Mle/HWJc2Hbj4s2nziftKSTXcNorMPmWSVbpewcZ1plFmw3DOvsKdr09aV8nqG\n        2hz8ApxQrTDAyBrUMqk4fcH2y7ELtr4OW771i03H5I9OMxe+180rvxcya9GT6O6+iz0rVx229PHOFVJQ\n        NBRRVhaBagYDNik9Y23/lhn7XWonfTAra/sp5OD/Uz0x84eqf/jHnNlzP+ZOnvjGOTzskbWr4xZtS/Mm\n        PkkpUaheMGAGuoJL0sQmxqKo8YlNQ8/PgLbuPzWrlv+tmDX9T+WE7t/ZVYWfvQK8bngHuDyycrFZzc/H\n        owDUxwTRDjaAgQXoE11uWfVuy6i0ewu2rf43fUbn/7b2qv911Zn/i/Li/hfmR/5va8v939VV+N/f134T\n        UIspRDvEJCBmEgQKmi9ZtOjUtasn/x85su3/2rUL/q9aOeP/ooXt/7dsnvn/8IGF/7dvmfn/yOGN/5yd\n        7TcC9bGBTQACUPyy8PMLCu/ateX11m0r/y9fOfv/rFn9/2fO7Pk/Y0b3/0Xz+/4vmtP1f/bUtv9LF077\n        n5eTegWoRwCsGwqAhjCy6OprWEpJiYeJi4skS0iKZkiIi+YCcT7Q37l8vNypPNycEfz8vH7c3FzeQD1Y\n        8wjIIFDAAp3HyA6lkTDYy9AUycAAAEEzP7Hvr145AAAAAElFTkSuQmCC\n</value>\n  </data>\n  <metadata name=\"bckgrndWrkrGetPrices.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>478, 17</value>\n  </metadata>\n  <metadata name=\"$this.TrayHeight\" type=\"System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>45</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon.Sales/Program.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Sales\n{\n    static class Program\n    {\n        /// <summary>\n        /// The main entry point for the application.\n        /// </summary>\n        [STAThread]\n        static void Main()\n        {\n            Application.EnableVisualStyles();\n            Application.SetCompatibleTextRenderingDefault(false);\n            Application.Run(new MineralWorksheet());\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Sales/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// Note: Shared assembly information is specified in SharedAssemblyInfo.cs\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"EVEMon.Sales\")]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"dd0d5f0c-6de4-46d5-889e-0386ee699b13\")]\n"
  },
  {
    "path": "src/EVEMon.Watchdog/EVEMon.Watchdog.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{8C4A87A0-780E-4765-ADD0-146091FE26F4}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>EVEMon.Watchdog</RootNamespace>\n    <AssemblyName>EVEMon.Watchdog</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\n    <DebugSymbols>false</DebugSymbols>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\n    <DebugType>none</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Windows.Forms\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\..\\SharedAssemblyInfo.cs\">\n      <Link>Properties\\SharedAssemblyInfo.cs</Link>\n    </Compile>\n    <Compile Include=\"GlobalSuppressions.cs\" />\n    <Compile Include=\"WatchdogWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"WatchdogWindow.Designer.cs\">\n      <DependentUpon>WatchdogWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <EmbeddedResource Include=\"WatchdogWindow.resx\">\n      <DependentUpon>WatchdogWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Resources.resx</DependentUpon>\n      <DesignTime>True</DesignTime>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"app.config\">\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"Resources\\time.png\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "src/EVEMon.Watchdog/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage \n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given \n// a specific target and scoped to a namespace, type, member, etc.\n//\n// To add a suppression to this file, right-click the message in the \n// Error List, point to \"Suppress Message(s)\", and click \n// \"In Project Suppression File\".\n// You do not need to add suppressions to this file manually.\n\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1014:MarkAssembliesWithClsCompliant\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Watchdog.WatchdogWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Watchdog.WatchdogWindow.#WaitTimer_Tick(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.Watchdog.WatchdogWindow.#WatchdogWindow_Load(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"EVE\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"EVE\", Scope = \"namespace\", Target = \"EVEMon.Watchdog\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Watchdog.WatchdogWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Watchdog.WatchdogWindow.#WaitTimer_Tick(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.Watchdog.WatchdogWindow.#WatchdogWindow_Load(System.Object,System.EventArgs)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA2210:AssembliesShouldHaveValidStrongNames\")]\n"
  },
  {
    "path": "src/EVEMon.Watchdog/Program.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Watchdog\n{\n    internal static class Program\n    {\n        /// <summary>\n        /// The main entry point for the application.\n        /// </summary>\n        [STAThread]\n        private static void Main(string[] args)\n        {\n            Application.EnableVisualStyles();\n            Application.SetCompatibleTextRenderingDefault(false);\n            Application.Run(new WatchdogWindow(args));\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Watchdog/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// Note: Shared assembly information is specified in SharedAssemblyInfo.cs\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"EVEMon.Watchdog\")]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"5c04496c-2b65-449d-8293-4eb234f5f679\")]\n"
  },
  {
    "path": "src/EVEMon.Watchdog/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Watchdog.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"EVEMon.Watchdog.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap TimeIcon {\n            get {\n                object obj = ResourceManager.GetObject(\"TimeIcon\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Watchdog/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"TimeIcon\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\time.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n</root>"
  },
  {
    "path": "src/EVEMon.Watchdog/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.1\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace EVEMon.Watchdog.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"10.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/EVEMon.Watchdog/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "src/EVEMon.Watchdog/WatchdogWindow.Designer.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.IO;\nusing System.Reflection;\nusing System.Windows.Forms;\nusing EVEMon.Watchdog.Properties;\n\nnamespace EVEMon.Watchdog\n{\n    partial class WatchdogWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.components = new Container();\n            this.TimerPictureBox = new PictureBox();\n            this.StatusLabel = new Label();\n            this.WaitTimer = new Timer(this.components);\n            ((ISupportInitialize)(this.TimerPictureBox)).BeginInit();\n            this.SuspendLayout();\n            // \n            // TimerPictureBox\n            // \n            this.TimerPictureBox.Image = Resources.TimeIcon;\n            this.TimerPictureBox.Location = new Point(12, 12);\n            this.TimerPictureBox.Name = \"TimerPictureBox\";\n            this.TimerPictureBox.Size = new Size(16, 16);\n            this.TimerPictureBox.SizeMode = PictureBoxSizeMode.AutoSize;\n            this.TimerPictureBox.TabIndex = 0;\n            this.TimerPictureBox.TabStop = false;\n            // \n            // StatusLabel\n            // \n            this.StatusLabel.AutoSize = true;\n            this.StatusLabel.Location = new Point(35, 14);\n            this.StatusLabel.Name = \"StatusLabel\";\n            this.StatusLabel.Size = new Size(146, 13);\n            this.StatusLabel.TabIndex = 1;\n            this.StatusLabel.Text = \"Waiting for EVEMon to close.\";\n            // \n            // WaitTimer\n            // \n            this.WaitTimer.Interval = 1000;\n            this.WaitTimer.Tick += new EventHandler(this.WaitTimer_Tick);\n            // \n            // WatchdogWindow\n            // \n            this.AutoScaleDimensions = new SizeF(6F, 13F);\n            this.AutoScaleMode = AutoScaleMode.Font;\n            this.ClientSize = new Size(286, 41);\n            this.Controls.Add(this.StatusLabel);\n            this.Controls.Add(this.TimerPictureBox);\n            this.FormBorderStyle = FormBorderStyle.FixedToolWindow;\n            this.Name = \"WatchdogWindow\";\n            this.StartPosition = FormStartPosition.CenterScreen;\n            this.Text = \"EVEMon Watchdog\";\n            this.Load += new EventHandler(this.WatchdogWindow_Load);\n            ((ISupportInitialize)(this.TimerPictureBox)).EndInit();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private PictureBox TimerPictureBox;\n        private Label StatusLabel;\n        private Timer WaitTimer;\n    }\n}\n\n"
  },
  {
    "path": "src/EVEMon.Watchdog/WatchdogWindow.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Reflection;\nusing System.Windows.Forms;\n\nnamespace EVEMon.Watchdog\n{\n    /// <summary>\n    /// Window that monitors the EVEMon process, restarting it when it has closed.\n    /// </summary>\n    public partial class WatchdogWindow : Form\n    {\n        private readonly string[] m_args;\n        private bool m_executableLaunched;\n\n        /// <summary>\n        /// Creates the Watchdog Window.\n        /// </summary>\n        /// <param name=\"args\"></param>\n        public WatchdogWindow(string[] args)\n        {\n            InitializeComponent();\n            m_args = args;\n        }\n\n        /// <summary>\n        /// Load event.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void WatchdogWindow_Load(object sender, EventArgs e)\n        {\n            WaitTimer.Start();\n            StatusLabel.Text = \"Waiting for EVEMon to close.\";\n        }\n\n        /// <summary>\n        /// Returns true EVEMon process currently executing.\n        /// </summary>\n        private static bool IsEVEMonRunning\n        {\n            get\n            {\n                Process[] processes = Process.GetProcessesByName(\"EVEMon\");\n                return processes.Length != 0;\n            }\n        }\n\n        /// <summary>\n        /// Timer triggered every 1000msec (1 second)\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void WaitTimer_Tick(object sender, EventArgs e)\n        {\n            // First time through after 'EVEMon' has closed\n            if (!m_executableLaunched && !IsEVEMonRunning)\n            {\n                m_executableLaunched = true;\n                StartEVEMonProcess();\n                StatusLabel.Text = \"Restarting EVEMon.\";\n                return;\n            }\n\n            // 'EVEMon' has been restarted and is running\n            if (m_executableLaunched && IsEVEMonRunning)\n                Application.Exit();\n        }\n\n        /// <summary>\n        /// Starts the new EVEMon process.\n        /// </summary>\n        private void StartEVEMonProcess()\n        {\n            // Find the expected path for 'EVEMon.exe'\n            string path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);\n            if (path == null)\n                return;\n\n            string executable = Path.Combine(path, \"EVEMon.exe\");\n\n            // If 'EVEMon.exe' doesn't exist we don't have anything to do\n            if (!File.Exists(executable))\n            {\n                Application.Exit();\n                return;\n            }\n\n            StartProcess(executable, m_args);\n        }\n\n        /// <summary>\n        /// Starts a process with arguments.\n        /// </summary>\n        /// <param name=\"executable\">Executable to start (i.e. EVEMon.exe).</param>\n        /// <param name=\"arguments\">Arguments to pass to the executable.</param>\n        private static void StartProcess(string executable, string[] arguments)\n        {\n            ProcessStartInfo startInfo = new ProcessStartInfo\n                                             {\n                                                 FileName = executable,\n                                                 Arguments = string.Join(\" \", arguments),\n                                                 UseShellExecute = false\n                                             };\n\n            using (Process process = new Process())\n            {\n                process.StartInfo = startInfo;\n                process.Start();\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.Watchdog/WatchdogWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"WaitTimer.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "src/EVEMon.Watchdog/app.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n<startup><supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\"/></startup></configuration>\n"
  },
  {
    "path": "src/EVEMon.WindowsApi/EVEMon.WindowsApi.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{D942D976-6185-4ECD-A83B-60260100D12E}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>EVEMon.WindowsApi</RootNamespace>\n    <AssemblyName>EVEMon.WindowsApi</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\n    <DebugType>full</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>none</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\..\\SharedAssemblyInfo.cs\">\n      <Link>Properties\\SharedAssemblyInfo.cs</Link>\n    </Compile>\n    <Compile Include=\"GlobalSuppressions.cs\" />\n    <Compile Include=\"OSFeatureCheck.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"SafeNativeMethods.cs\" />\n    <Compile Include=\"Windows7.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "src/EVEMon.WindowsApi/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage \n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given \n// a specific target and scoped to a namespace, type, member, etc.\n//\n// To add a suppression to this file, right-click the message in the \n// Error List, point to \"Suppress Message(s)\", and click \n// \"In Project Suppression File\".\n// You do not need to add suppressions to this file manually.\n\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1014:MarkAssembliesWithClsCompliant\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"EVE\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"EVE\", Scope = \"namespace\", Target = \"EVEMon.WindowsApi\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA2210:AssembliesShouldHaveValidStrongNames\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1704:IdentifiersShouldBeSpelledCorrectly\", MessageId = \"Api\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1704:IdentifiersShouldBeSpelledCorrectly\", MessageId = \"Api\", Scope = \"namespace\", Target = \"EVEMon.WindowsApi\")]\n"
  },
  {
    "path": "src/EVEMon.WindowsApi/OSFeatureCheck.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.WindowsApi\n{\n    /// <summary>\n    /// Allows for quick checks for support of various opperating system features\n    /// </summary>\n    public static class OSFeatureCheck\n    {\n        /// <summary>\n        /// Checks to see if the current operating system is Windows\n        /// </summary>\n        public static bool IsWindows => Environment.OSVersion.Platform == PlatformID.Win32Windows ||\n                                        Environment.OSVersion.Platform == PlatformID.Win32S ||\n                                        IsWindowsNT;\n\n        /// <summary>\n        /// Checks to see if the current operating system is Windows NT\n        /// </summary>\n        public static bool IsWindowsNT => Environment.OSVersion.Platform == PlatformID.Win32NT;\n\n        /// <summary>\n        /// Checks to see if the Windows 7 Taskbar is supported in the\n        /// current operating system.\n        /// </summary>\n        public static bool TaskbarSupported\n        {\n            get\n            {\n                if (!IsWindowsNT)\n                    return false;\n\n                Version winVer = Environment.OSVersion.Version;\n\n                if (winVer.Major < 6)\n                    return false;\n\n                return winVer.Major != 6 || winVer.Minor >= 1;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/EVEMon.WindowsApi/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// Note: Shared assembly information is specified in SharedAssemblyInfo.cs\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"EVEMon.WindowsApi\")]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"6c038062-ce9e-48bc-905a-b1a98479ef23\")]\n"
  },
  {
    "path": "src/EVEMon.WindowsApi/SafeNativeMethods.cs",
    "content": "﻿using System.Runtime.InteropServices;\nusing System.Security;\n\nnamespace EVEMon.WindowsApi\n{\n    [SuppressUnmanagedCodeSecurity]\n    internal static class SafeNativeMethods\n    {\n        /// <summary>\n        /// http://msdn.microsoft.com/en-us/library/dd378422%28VS.85%29.aspx\n        /// </summary>\n        /// <param name=\"appID\">appID string</param>\n        [DllImport(\"shell32.dll\")]\n        internal static extern void SetCurrentProcessExplicitAppUserModelID([MarshalAs(UnmanagedType.LPWStr)] string appID);\n    }\n}"
  },
  {
    "path": "src/EVEMon.WindowsApi/Windows7.cs",
    "content": "﻿using System;\n\nnamespace EVEMon.WindowsApi\n{\n    /// <summary>\n    /// Windows 7 Specific API Calls\n    /// </summary>\n    public static class Windows7\n    {\n        /// <summary>\n        /// Calls SetCurrentProcessExplicitAppUserModelID() to set the current process AppID.\n        /// </summary>\n        /// <param name=\"appId\">128 character or smaller Application ID.</param>\n        public static void SetProcessAppId(string appId)\n        {\n            if (!OSFeatureCheck.TaskbarSupported)\n                return;\n\n            if (string.IsNullOrWhiteSpace(appId) || appId.Length > 128)\n                throw new ArgumentException(\"AppID must be 128 characters or less\", nameof(appId));\n\n            SafeNativeMethods.SetCurrentProcessExplicitAppUserModelID(appId);\n        }\n    }\n}"
  },
  {
    "path": "tests/Tests.EVEMon/AsyncVoidMethodsTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing EVEMon;\nusing Tests.Helpers;\nusing Xunit;\n\nnamespace Tests.EVEMon\n{\n    public static class AsyncVoidMethodsTests\n    {\n        /// <summary>\n        /// Ensures that no method is marked asynchronous void.\n        /// </summary>\n        [Fact]\n        public static void EnsureNoAsyncVoidMethods()\n        {\n            IEnumerable<MethodInfo> asyncVoidMethods = typeof(MainWindow).Assembly.GetAsyncVoidMethods();\n\n            List<string> messages = asyncVoidMethods.Select(method =>\n                $\"'{method.DeclaringType?.Name}.{method.Name}' is an async void method.\")\n                .ToList();\n\n            Assert.False(messages.Any(),\n                $\"Async void methods found!{Environment.NewLine}{string.Join(Environment.NewLine, messages)}\");\n        }\n    }\n}\n"
  },
  {
    "path": "tests/Tests.EVEMon/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"EVEMon Unit Tests\")]\n[assembly: AssemblyDescription(\"Unit Tests for EVEMon\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"EVEMon Developement Team\")]\n[assembly: AssemblyProduct(\"EVEMon\")]\n[assembly: AssemblyCopyright(\"Copyright © 2016, EVEMon Development Team\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"fd639bf6-3414-4fb2-8325-61744d44f028\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n[assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: AssemblyInformationalVersion(\"1.0.0\")]\n\n// Neutral Language\n[assembly: NeutralResourcesLanguage(\"en-US\")]"
  },
  {
    "path": "tests/Tests.EVEMon/Tests.EVEMon.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"..\\..\\packages\\xunit.runner.visualstudio.2.1.0\\build\\net20\\xunit.runner.visualstudio.props\" Condition=\"Exists('..\\..\\packages\\xunit.runner.visualstudio.2.1.0\\build\\net20\\xunit.runner.visualstudio.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{FD639BF6-3414-4FB2-8325-61744D44F028}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Tests.EVEMon</RootNamespace>\n    <AssemblyName>Tests.EVEMon</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Snapshot\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Moq, Version=4.2.1510.2205, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Moq.4.2.1510.2205\\lib\\net40\\Moq.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\xunit.abstractions.2.0.0\\lib\\net35\\xunit.abstractions.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"xunit.assert, Version=2.1.0.3179, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\xunit.assert.2.1.0\\lib\\dotnet\\xunit.assert.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"xunit.core, Version=2.1.0.3179, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\xunit.extensibility.core.2.1.0\\lib\\dotnet\\xunit.core.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"xunit.execution.desktop, Version=2.1.0.3179, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\xunit.extensibility.execution.2.1.0\\lib\\net45\\xunit.execution.desktop.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise />\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"AsyncVoidMethodsTests.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"app.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\EVEMon.Common\\EVEMon.Common.csproj\">\n      <Project>{c0665275-3e0b-4117-81b0-751206ed03cd}</Project>\n      <Name>EVEMon.Common</Name>\n      <Private>True</Private>\n      <Properties>SkipValidatePackageReferences=true</Properties>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\src\\EVEMon\\EVEMon.csproj\">\n      <Project>{a2e5efe0-614a-4567-95e5-92a4d94169ac}</Project>\n      <Name>EVEMon</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\Tests.Helpers\\Tests.Helpers.csproj\">\n      <Project>{1917e258-0979-4333-8b20-5d66e8986e1c}</Project>\n      <Name>Tests.Helpers</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\..\\packages\\xunit.runner.visualstudio.2.1.0\\build\\net20\\xunit.runner.visualstudio.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\packages\\xunit.runner.visualstudio.2.1.0\\build\\net20\\xunit.runner.visualstudio.props'))\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "tests/Tests.EVEMon/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.1.0\" newVersion=\"4.1.1.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-10.0.0.0\" newVersion=\"10.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Owin\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-3.0.1.0\" newVersion=\"3.0.1.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.36.0.0\" newVersion=\"1.36.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis.Core\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.42.0.0\" newVersion=\"1.42.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n<startup><supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\" /></startup></configuration>\n"
  },
  {
    "path": "tests/Tests.EVEMon/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Moq\" version=\"4.2.1510.2205\" targetFramework=\"net461\" />\n  <package id=\"xunit\" version=\"2.1.0\" targetFramework=\"net461\" />\n  <package id=\"xunit.abstractions\" version=\"2.0.0\" targetFramework=\"net461\" />\n  <package id=\"xunit.assert\" version=\"2.1.0\" targetFramework=\"net461\" />\n  <package id=\"xunit.core\" version=\"2.1.0\" targetFramework=\"net461\" />\n  <package id=\"xunit.extensibility.core\" version=\"2.1.0\" targetFramework=\"net461\" />\n  <package id=\"xunit.extensibility.execution\" version=\"2.1.0\" targetFramework=\"net461\" />\n  <package id=\"xunit.runner.visualstudio\" version=\"2.1.0\" targetFramework=\"net461\" />\n</packages>"
  },
  {
    "path": "tests/Tests.EVEMon.Common/AsyncVoidMethodsTests.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing EVEMon.Common;\nusing Tests.Helpers;\nusing Xunit;\n\nnamespace Tests.EVEMon.Common\n{\n    public static class AsyncVoidMethodsTests\n    {\n        /// <summary>\n        /// Ensures that no method is marked asynchronous void.\n        /// </summary>\n        [Fact]\n        public static void EnsureNoAsyncVoidMethods()\n        {\n            IEnumerable<MethodInfo> asyncVoidMethods = typeof(EveMonClient).Assembly.GetAsyncVoidMethods();\n\n            List<string> messages = asyncVoidMethods.Select(method =>\n                $\"'{method.DeclaringType?.Name}.{method.Name}' is an async void method.\")\n                .ToList();\n\n            Assert.False(messages.Any(),\n                $\"Async void methods found!{Environment.NewLine}{string.Join(Environment.NewLine, messages)}\");\n        }\n    }\n}\n"
  },
  {
    "path": "tests/Tests.EVEMon.Common/CompressionUncompressionTests.cs",
    "content": "﻿using System.IO;\nusing System.Linq;\nusing System.Text;\nusing EVEMon.Common;\nusing Xunit;\n\nnamespace Tests.EVEMon.Common\n{\n    public static class CompressionUncompressionTests\n    {\n        private static readonly byte[] s_data = Encoding.UTF8.GetBytes(\"Data to compress and uncompress.\");\n\n\n        #region Tests\n\n        /// <summary>\n        /// Compress and uncompress using zlib gzip.\n        /// </summary>\n        [Fact]\n        public static void GzipCompressAndUncompress()\n        {\n            var compressed = Util.GZipCompress(s_data);\n            var uncompressed = Util.GZipUncompress(compressed.ToArray());\n\n            Assert.Equal(uncompressed, s_data);\n        }\n\n        /// <summary>\n        /// Compress and uncompress using zlib deflate-inflate.\n        /// </summary>\n        [Fact]\n        public static void DeflateCompressAndInflateUncompress()\n        {\n            var compressed = Util.DeflateCompress(s_data);\n            var uncompressed = Util.InflateUncompress(compressed.ToArray());\n\n            Assert.Equal(uncompressed, s_data);\n        }\n\n        /// <summary>\n        /// Compress using zlib gzip and uncompress using zlib uncompress automation.\n        /// </summary>\n        [Fact]\n        public static void GzipCompressAndZlibUncompress()\n        {\n            var compressed = Util.GZipCompress(s_data);\n            var uncompressed = Util.ZlibUncompress(compressed.ToArray());\n\n            Assert.Equal(uncompressed, s_data);\n        }\n\n        /// <summary>\n        /// Compress using zlib deflate and uncompress using zlib uncompress automation.\n        /// </summary>\n        [Fact]\n        public static void DeflateCompressAndZlibUncompress()\n        {\n            var compressed = Util.DeflateCompress(s_data);\n            var uncompressed = Util.ZlibUncompress(compressed.ToArray());\n\n            Assert.Equal(uncompressed, s_data);\n        }\n\n        /// <summary>\n        /// Compress using zlib gzip and uncompress using zlib uncompress automation with stream.\n        /// </summary>\n        [Fact]\n        public static void GzipCompressAndZlibUncompressUsingStream()\n        {\n            var compressed = (byte[])Util.GZipCompress(s_data);\n            var uncompressed = (MemoryStream)Util.ZlibUncompress(new MemoryStream(compressed));\n\n            Assert.Equal(uncompressed.ToArray(), s_data);\n        }\n\n        /// <summary>\n        /// Compress using zlib deflate and uncompress using zlib uncompress automation with stream.\n        /// </summary>\n        [Fact]\n        public static void DeflateCompressAndZlibUncompressUsingStream()\n        {\n            var compressed = (byte[])Util.DeflateCompress(s_data);\n            var uncompressed = (MemoryStream)Util.ZlibUncompress(new MemoryStream(compressed));\n\n            Assert.Equal(uncompressed.ToArray(), s_data);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "tests/Tests.EVEMon.Common/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage \n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given \n// a specific target and scoped to a namespace, type, member, etc.\n//\n// To add a suppression to this file, right-click the message in the \n// Error List, point to \"Suppress Message(s)\", and click \n// \"In Project Suppression File\".\n// You do not need to add suppressions to this file manually.\n\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1014:MarkAssembliesWithClsCompliant\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String,System.Object)\", Scope = \"member\", Target = \"Tests.EVEMon.Program.#Main()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String)\", Scope = \"member\", Target = \"Tests.EVEMon.Program.#Main()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1704:IdentifiersShouldBeSpelledCorrectly\", MessageId = \"Util\", Scope = \"type\", Target = \"Tests.EVEMon.Common.TimeUtilTests\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"CCP\", Scope = \"member\", Target = \"Tests.EVEMon.Common.TimeUtilTests.#ConvertDateTimeToCCPDateTime()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"CCP\", Scope = \"member\", Target = \"Tests.EVEMon.Common.TimeUtilTests.#ConvertEmptyCCPDateTimeToDateTime()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"CCP\", Scope = \"member\", Target = \"Tests.EVEMon.Common.TimeUtilTests.#ConvertInvalidCCPDateTimeToDateTime()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"CCP\", Scope = \"member\", Target = \"Tests.EVEMon.Common.TimeUtilTests.#ConvertValidCCPDateTimeToDateTime()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"EVE\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA1709:IdentifiersShouldBeCasedCorrectly\", MessageId = \"EVE\", Scope = \"namespace\", Target = \"Tests.EVEMon.Common\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA2210:AssembliesShouldHaveValidStrongNames\")]\n"
  },
  {
    "path": "tests/Tests.EVEMon.Common/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"EVEMon.Common Unit Tests\")]\n[assembly: AssemblyDescription(\"Unit Tests for EVEMon.Common\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"EVEMon Developement Team\")]\n[assembly: AssemblyProduct(\"EVEMon\")]\n[assembly: AssemblyCopyright(\"Copyright © 2010-2016, EVEMon Development Team\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"f99bf852-fee8-4117-af4c-ada2957c429c\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n[assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: AssemblyInformationalVersion(\"1.0.0\")]\n\n// Neutral Language\n[assembly: NeutralResourcesLanguage(\"en-US\")]"
  },
  {
    "path": "tests/Tests.EVEMon.Common/Tests.EVEMon.Common.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"..\\..\\packages\\xunit.runner.visualstudio.2.1.0\\build\\net20\\xunit.runner.visualstudio.props\" Condition=\"Exists('..\\..\\packages\\xunit.runner.visualstudio.2.1.0\\build\\net20\\xunit.runner.visualstudio.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{C61CB94F-31DF-48BE-8053-FCE7DC6ECD7F}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Tests.EVEMon.Common</RootNamespace>\n    <AssemblyName>Tests.EVEMon.Common</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <SolutionDir Condition=\"$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'\">..\\..\\</SolutionDir>\n    <RestorePackages>true</RestorePackages>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\n    <DebugType>full</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Moq, Version=4.2.1510.2205, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Moq.4.2.1510.2205\\lib\\net40\\Moq.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\">\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\xunit.abstractions.2.0.0\\lib\\net35\\xunit.abstractions.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"xunit.assert, Version=2.1.0.3179, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\xunit.assert.2.1.0\\lib\\dotnet\\xunit.assert.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"xunit.core, Version=2.1.0.3179, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\xunit.extensibility.core.2.1.0\\lib\\dotnet\\xunit.core.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"xunit.execution.desktop, Version=2.1.0.3179, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\xunit.extensibility.execution.2.1.0\\lib\\net45\\xunit.execution.desktop.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise />\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"AsyncVoidMethodsTests.cs\" />\n    <Compile Include=\"CompressionUncompressionTests.cs\" />\n    <Compile Include=\"TimeExtensionsTests.cs\" />\n    <Compile Include=\"GlobalSuppressions.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\EVEMon.Common\\EVEMon.Common.csproj\">\n      <Project>{C0665275-3E0B-4117-81B0-751206ED03CD}</Project>\n      <Name>EVEMon.Common</Name>\n      <Private>True</Private>\n      <Properties>SkipValidatePackageReferences=true</Properties>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\Tests.Helpers\\Tests.Helpers.csproj\">\n      <Project>{1917e258-0979-4333-8b20-5d66e8986e1c}</Project>\n      <Name>Tests.Helpers</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"app.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PostBuildEvent>rd /s /q \"$(TargetDir)\"Resources\ndel \"$(TargetDir)\"*office*\ndel \"$(TargetDir)\"*outlook*\ndel \"$(TargetDir)\"YamlDotNet*\nif exist \"$(TargetDir)\"stdole.dll del \"$(TargetDir)\"stdole.dll</PostBuildEvent>\n  </PropertyGroup>\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\..\\packages\\xunit.runner.visualstudio.2.1.0\\build\\net20\\xunit.runner.visualstudio.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\packages\\xunit.runner.visualstudio.2.1.0\\build\\net20\\xunit.runner.visualstudio.props'))\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "tests/Tests.EVEMon.Common/TimeExtensionsTests.cs",
    "content": "﻿using System;\nusing EVEMon.Common.Extensions;\nusing Xunit;\n\nnamespace Tests.EVEMon.Common\n{\n    public static class TimeExtensionsTests\n    {\n        #region Helper Variables\n\n        /// <summary>\n        /// Valid time as returned by CCP.\n        /// </summary>\n        private static string ValidCcpDateTime => \"2010-05-07 18:23:32\";\n\n        /// <summary>\n        /// Invalid time, wrong format.\n        /// </summary>\n        private static string InvalidCcpDateTime => \"18-23-32 2010:05:07\";\n\n        /// <summary>\n        /// A point in time.\n        /// </summary>\n        private static DateTime PointInTime => new DateTime(2010, 05, 07, 18, 23, 32);\n\n        /// <summary>\n        /// Valid dot formated date/time string.\n        /// </summary>\n        private static string ValidDotFormattedDateTimeString => \"2010.05.07 18:23:32\";\n\n        #endregion\n\n\n        #region Tests\n\n        /// <summary>\n        /// Able to convert a <c>DateTime</c> to a CCPTime.\n        /// </summary>\n        [Fact]\n        public static void ConvertDateTimeToCCPDateTime()\n        {\n            string result = PointInTime.DateTimeToTimeString();\n            Assert.Equal(ValidCcpDateTime, result);\n        }\n\n        /// <summary>\n        /// Able to convert a correctly formatted CCPDateTime to <c>DateTime</c>.\n        /// </summary>\n        [Fact]\n        public static void ConvertValidCCPDateTimeToDateTime()\n        {\n            DateTime result = ValidCcpDateTime.TimeStringToDateTime();\n            Assert.Equal(PointInTime, result);\n        }\n\n        /// <summary>\n        /// Handles an incorrect input string appropiately.\n        /// </summary>\n        [Fact]\n        public static void ConvertInvalidCCPDateTimeToDateTime()\n        {\n            DateTime result = InvalidCcpDateTime.TimeStringToDateTime();\n            Assert.Equal(default(DateTime), result);\n        }\n\n        /// <summary>\n        /// Handles an empty string by returning DateTime.MinValue.\n        /// </summary>\n        [Fact]\n        public static void ConvertEmptyCCPDateTimeToDateTime()\n        {\n            DateTime result = string.Empty.TimeStringToDateTime();\n            Assert.Equal(DateTime.MinValue, result);\n        }\n\n        /// <summary>\n        /// Able to convert a <c>DateTime</c> to a dot formatted date/time string.\n        /// </summary>\n        [Fact]\n        public static void ConvertDateTimeToDotFormattedString()\n        {\n            string result = PointInTime.DateTimeToDotFormattedString();\n            Assert.Equal(ValidDotFormattedDateTimeString, result);\n        }\n\n        /// <summary>\n        /// If the time being tested is in the past expect \"Done\" to be returned.\n        /// </summary>\n        [Fact]\n        public static void ToRemainingTimeShortDescriptionReturnsDone()\n        {\n            string result = DateTime.Now.AddHours(-1).ToRemainingTimeShortDescription(DateTimeKind.Local);\n            Assert.Equal(\"Done\", result);\n        }\n\n        /// <summary>\n        /// Fact 1s is returned when there is 1 minute to go.\n        /// </summary>\n        [Fact]\n        public static void ToRemainingTimeShortDescriptionReturnsSecond()\n        {\n            DateTime future = DateTime.Now.AddSeconds(1);\n            string result = future.ToRemainingTimeShortDescription(DateTimeKind.Local);\n            Assert.Equal(\"1s\", result);\n        }\n\n        /// <summary>\n        /// Fact 1m is returned when there is 1 minute to go.\n        /// </summary>\n        [Fact]\n        public static void ToRemainingTimeShortDescriptionReturnsMinute()\n        {\n            DateTime future = DateTime.Now.AddMinutes(1);\n            string result = future.ToRemainingTimeShortDescription(DateTimeKind.Local);\n            Assert.Equal(\"1m\", result);\n        }\n\n        /// <summary>\n        /// Fact 1h is returned when there is 1 hour to go.\n        /// </summary>\n        [Fact]\n        public static void ToRemainingTimeShortDescriptionReturnsHour()\n        {\n            DateTime future = DateTime.Now.AddHours(1);\n            string result = future.ToRemainingTimeShortDescription(DateTimeKind.Local);\n            Assert.Equal(\"1h\", result);\n        }\n\n        /// <summary>\n        /// Fact 1d is returned when there is 1 day to go.\n        /// </summary>\n        [Fact]\n        public static void ToRemainingTimeShortDescriptionReturnsDay()\n        {\n            DateTime future = DateTime.Now.AddDays(1);\n            string result = future.ToRemainingTimeShortDescription(DateTimeKind.Local);\n            Assert.Equal(\"1d\", result);\n        }\n\n        /// <summary>\n        /// Fact 1m 1s is returned when there is 1 minute, 1 second to go.\n        /// </summary>\n        [Fact]\n        public static void ToRemainingTimeShortDescriptionReturnsMinuteSecond()\n        {\n            DateTime future = DateTime.Now.AddMinutes(1).AddSeconds(1);\n            string result = future.ToRemainingTimeShortDescription(DateTimeKind.Local);\n            Assert.Equal(\"1m 1s\", result);\n        }\n\n        /// <summary>\n        /// Fact 1h 1m 1s is returned when there is 1 hour, 1 minute, 1 second to go.\n        /// </summary>\n        [Fact]\n        public static void ToRemainingTimeShortDescriptionReturnsHourMinuteSecond()\n        {\n            DateTime future = DateTime.Now.AddHours(1).AddMinutes(1).AddSeconds(1);\n            string result = future.ToRemainingTimeShortDescription(DateTimeKind.Local);\n            Assert.Equal(\"1h 1m 1s\", result);\n        }\n\n        /// <summary>\n        /// Fact 1d 1h 1m 1s is returned when there is 1 day, 1 hour, 1 minute, 1 second to go.\n        /// </summary>\n        [Fact]\n        public static void ToRemainingTimeShortDescriptionReturnsDayHourMinuteSecond()\n        {\n            DateTime future = DateTime.Now.AddDays(1).AddHours(1).AddMinutes(1).AddSeconds(1);\n            string result = future.ToRemainingTimeShortDescription(DateTimeKind.Local);\n            Assert.Equal(\"1d 1h 1m 1s\", result);\n        }\n\n        /// <summary>\n        /// Fact 1d 1m 1s is returned when there is 1 hour, 1 minute, 1 second to go.\n        /// </summary>\n        [Fact]\n        public static void ToRemainingTimeShortDescriptionReturnsDayMinuteSecond()\n        {\n            DateTime future = DateTime.Now.AddDays(1).AddMinutes(1).AddSeconds(1);\n            string result = future.ToRemainingTimeShortDescription(DateTimeKind.Local);\n            Assert.Equal(\"1d 1m 1s\", result);\n        }\n\n        /// <summary>\n        /// Fact 1d 1m is returned when there is 1 hour, 1 minute to go.\n        /// </summary>\n        [Fact]\n        public static void ToRemainingTimeShortDescriptionReturnsDayMinute()\n        {\n            DateTime future = DateTime.Now.AddDays(1).AddMinutes(1);\n            string result = future.ToRemainingTimeShortDescription(DateTimeKind.Local);\n            Assert.Equal(\"1d 1m\", result);\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "tests/Tests.EVEMon.Common/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-10.0.0.0\" newVersion=\"10.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.36.0.0\" newVersion=\"1.36.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis.Core\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.42.0.0\" newVersion=\"1.42.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n<startup><supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\" /></startup></configuration>\n"
  },
  {
    "path": "tests/Tests.EVEMon.Common/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Moq\" version=\"4.2.1510.2205\" targetFramework=\"net461\" />\n  <package id=\"xunit\" version=\"2.1.0\" targetFramework=\"net461\" />\n  <package id=\"xunit.abstractions\" version=\"2.0.0\" targetFramework=\"net461\" />\n  <package id=\"xunit.assert\" version=\"2.1.0\" targetFramework=\"net461\" />\n  <package id=\"xunit.core\" version=\"2.1.0\" targetFramework=\"net461\" />\n  <package id=\"xunit.extensibility.core\" version=\"2.1.0\" targetFramework=\"net461\" />\n  <package id=\"xunit.extensibility.execution\" version=\"2.1.0\" targetFramework=\"net461\" />\n  <package id=\"xunit.runner.visualstudio\" version=\"2.1.0\" targetFramework=\"net461\" />\n</packages>"
  },
  {
    "path": "tests/Tests.Helpers/AsyncVoidMethodsHelper.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\n\nnamespace Tests.Helpers\n{\n    public static class AsyncVoidMethodsHelper\n    {\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the asynchronous void methods.\n        /// </summary>\n        /// <param name=\"assembly\">The assembly.</param>\n        /// <returns></returns>\n        public static IEnumerable<MethodInfo> GetAsyncVoidMethods(this Assembly assembly)\n            => assembly.GetLoadableTypes()\n                .SelectMany(type => type.GetMethods(\n                    BindingFlags.NonPublic\n                    | BindingFlags.Public\n                    | BindingFlags.Instance\n                    | BindingFlags.Static\n                    | BindingFlags.DeclaredOnly))\n                .Where(method => method.HasAttribute<AsyncStateMachineAttribute>())\n                .Where(method =>\n                    !method.GetParameters()\n                        .Select(param => param.ParameterType)\n                        .SequenceEqual(new[] { typeof(object), typeof(EventArgs) }) &&\n                    !method.GetParameters()\n                        .Select(param => param.ParameterType)\n                        .SequenceEqual(new[] { typeof(EventArgs) }))\n                .Where(method =>\n                    !method.GetParameters()\n                        .Any(param => param.ParameterType.IsSubclassOf(typeof(EventArgs))))\n                .Where(method => method.ReturnType == typeof(void));\n\n        /// <summary>\n        /// Gets the loadable types.\n        /// </summary>\n        /// <param name=\"assembly\">The assembly.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\"></exception>\n        private static IEnumerable<Type> GetLoadableTypes(this Assembly assembly)\n        {\n            if (assembly == null)\n                throw new ArgumentNullException(nameof(assembly));\n\n            try\n            {\n                return assembly.GetTypes();\n            }\n            catch (ReflectionTypeLoadException e)\n            {\n                return e.Types.Where(t => t != null);\n            }\n        }\n\n        /// <summary>\n        /// Determines whether this instance has attribute.\n        /// </summary>\n        /// <typeparam name=\"TAttribute\">The type of the attribute.</typeparam>\n        /// <param name=\"method\">The method.</param>\n        /// <returns></returns>\n        private static bool HasAttribute<TAttribute>(this MethodInfo method)\n            where TAttribute : Attribute\n            => method.GetCustomAttributes(typeof(TAttribute), false).Any();\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "tests/Tests.Helpers/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Unit Tests Helpers\")]\n[assembly: AssemblyDescription(\"Helper Classes for Unit Tests\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"EVEMon Developement Team\")]\n[assembly: AssemblyProduct(\"EVEMon\")]\n[assembly: AssemblyCopyright(\"Copyright © 2016, EVEMon Development Team\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"1917e258-0979-4333-8b20-5d66e8986e1c\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n[assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: AssemblyInformationalVersion(\"1.0.0\")]\n\n// Neutral Language\n[assembly: NeutralResourcesLanguage(\"en-US\")]"
  },
  {
    "path": "tests/Tests.Helpers/Tests.Helpers.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{1917E258-0979-4333-8B20-5D66E8986E1C}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Tests.Helpers</RootNamespace>\n    <AssemblyName>Tests.Helpers</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Snapshot\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"AsyncVoidMethodsHelper.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "tools/EVESDEToSQL/EVESDEToSQL.exe.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <startup>\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.0\" />\n  </startup>\n  <connectionStrings>\n    <clear />\n    <add name=\"EveStaticData\" connectionString=\"Data Source=.\\SQLEXPRESS;Initial Catalog=EveStaticData;Integrated Security=True;MultipleActiveResultSets=True;Connection Timeout=60\" providerName=\"System.Data.SqlClient\" />\n  </connectionStrings>\n</configuration>"
  },
  {
    "path": "tools/EVESDEToSQL/SDEFiles/Put SDE zip or individual files here",
    "content": ""
  },
  {
    "path": "tools/EVESDEToSQL/System.Data.SQLite.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>System.Data.SQLite</name>\n    </assembly>\n    <members>\n        <member name=\"T:System.Data.SQLite.AssemblySourceIdAttribute\">\n            <summary>\n            Defines a source code identifier custom attribute for an assembly\n            manifest.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.AssemblySourceIdAttribute.#ctor(System.String)\">\n            <summary>\n            Constructs an instance of this attribute class using the specified\n            source code identifier value.\n            </summary>\n            <param name=\"value\">\n            The source code identifier value to use.\n            </param>\n        </member>\n        <member name=\"P:System.Data.SQLite.AssemblySourceIdAttribute.SourceId\">\n            <summary>\n            Gets the source code identifier value.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.AssemblySourceTimeStampAttribute\">\n            <summary>\n            Defines a source code time-stamp custom attribute for an assembly\n            manifest.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.AssemblySourceTimeStampAttribute.#ctor(System.String)\">\n            <summary>\n            Constructs an instance of this attribute class using the specified\n            source code time-stamp value.\n            </summary>\n            <param name=\"value\">\n            The source code time-stamp value to use.\n            </param>\n        </member>\n        <member name=\"P:System.Data.SQLite.AssemblySourceTimeStampAttribute.SourceTimeStamp\">\n            <summary>\n            Gets the source code time-stamp value.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteLogCallback\">\n             <summary>\n             This is the method signature for the SQLite core library logging callback\n             function for use with sqlite3_log() and the SQLITE_CONFIG_LOG.\n            \n             WARNING: This delegate is used more-or-less directly by native code, do\n                      not modify its type signature.\n             </summary>\n             <param name=\"pUserData\">\n             The extra data associated with this message, if any.\n             </param>\n             <param name=\"errorCode\">\n             The error code associated with this message.\n             </param>\n             <param name=\"pMessage\">\n             The message string to be logged.\n             </param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLite3\">\n            <summary>\n            This class implements SQLiteBase completely, and is the guts of the code that interop's SQLite with .NET\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteBase\">\n            <summary>\n            This internal class provides the foundation of SQLite support.  It defines all the abstract members needed to implement\n            a SQLite data provider, and inherits from SQLiteConvert which allows for simple translations of string to and from SQLite.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteConvert\">\n            <summary>\n            This base class provides datatype conversion services for the SQLite provider.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert.FallbackDefaultDbType\">\n            <summary>\n            The fallback default database type when one cannot be obtained from an\n            existing connection instance.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert.FullFormat\">\n            <summary>\n            The format string for DateTime values when using the InvariantCulture or CurrentCulture formats.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert.FallbackDefaultTypeName\">\n            <summary>\n            The fallback default database type name when one cannot be obtained from\n            an existing connection instance.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert.UnixEpoch\">\n            <summary>\n            The value for the Unix epoch (e.g. January 1, 1970 at midnight, in UTC).\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert.OleAutomationEpochAsJulianDay\">\n            <summary>\n            The value of the OLE Automation epoch represented as a Julian day.  This\n            field cannot be removed as the test suite relies upon it.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert.MinimumJd\">\n            <summary>\n            This is the minimum Julian Day value supported by this library\n            (148731163200000).\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert.MaximumJd\">\n            <summary>\n            This is the maximum Julian Day value supported by this library\n            (464269060799000).\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert._datetimeFormats\">\n            <summary>\n            An array of ISO-8601 DateTime formats that we support parsing.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert._datetimeFormatUtc\">\n            <summary>\n            The internal default format for UTC DateTime values when converting\n            to a string.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert._datetimeFormatLocal\">\n            <summary>\n            The internal default format for local DateTime values when converting\n            to a string.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert._utf8\">\n            <summary>\n            An UTF-8 Encoding instance, so we can convert strings to and from UTF-8\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert._datetimeFormat\">\n            <summary>\n            The default DateTime format for this instance.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert._datetimeKind\">\n            <summary>\n            The default DateTimeKind for this instance.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConvert._datetimeFormatString\">\n            <summary>\n            The default DateTime format string for this instance.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String)\">\n            <summary>\n            Initializes the conversion class\n            </summary>\n            <param name=\"fmt\">The default date/time format to use for this instance</param>\n            <param name=\"kind\">The DateTimeKind to use.</param>\n            <param name=\"fmtString\">The DateTime format string to use.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToUTF8(System.String)\">\n            <summary>\n            Converts a string to a UTF-8 encoded byte array sized to include a null-terminating character.\n            </summary>\n            <param name=\"sourceText\">The string to convert to UTF-8</param>\n            <returns>A byte array containing the converted string plus an extra 0 terminating byte at the end of the array.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToUTF8(System.DateTime)\">\n            <summary>\n            Convert a DateTime to a UTF-8 encoded, zero-terminated byte array.\n            </summary>\n            <remarks>\n            This function is a convenience function, which first calls ToString() on the DateTime, and then calls ToUTF8() with the\n            string result.\n            </remarks>\n            <param name=\"dateTimeValue\">The DateTime to convert.</param>\n            <returns>The UTF-8 encoded string, including a 0 terminating byte at the end of the array.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToString(System.IntPtr,System.Int32)\">\n            <summary>\n            Converts a UTF-8 encoded IntPtr of the specified length into a .NET string\n            </summary>\n            <param name=\"nativestring\">The pointer to the memory where the UTF-8 string is encoded</param>\n            <param name=\"nativestringlen\">The number of bytes to decode</param>\n            <returns>A string containing the translated character(s)</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.UTF8ToString(System.IntPtr,System.Int32)\">\n            <summary>\n            Converts a UTF-8 encoded IntPtr of the specified length into a .NET string\n            </summary>\n            <param name=\"nativestring\">The pointer to the memory where the UTF-8 string is encoded</param>\n            <param name=\"nativestringlen\">The number of bytes to decode</param>\n            <returns>A string containing the translated character(s)</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.isValidJd(System.Int64)\">\n            <summary>\n            Checks if the specified <see cref=\"T:System.Int64\"/> is within the\n            supported range for a Julian Day value.\n            </summary>\n            <param name=\"jd\">\n            The Julian Day value to check.\n            </param>\n            <returns>\n            Non-zero if the specified Julian Day value is in the supported\n            range; otherwise, zero.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.DoubleToJd(System.Double)\">\n            <summary>\n            Converts a Julian Day value from a <see cref=\"T:System.Double\"/> to an\n            <see cref=\"T:System.Int64\"/>.\n            </summary>\n            <param name=\"julianDay\">\n            The Julian Day <see cref=\"T:System.Double\"/> value to convert.\n            </param>\n            <returns>\n            The resulting Julian Day <see cref=\"T:System.Int64\"/> value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.JdToDouble(System.Int64)\">\n            <summary>\n            Converts a Julian Day value from an <see cref=\"T:System.Int64\"/> to a\n            <see cref=\"T:System.Double\"/>.\n            </summary>\n            <param name=\"jd\">\n            The Julian Day <see cref=\"T:System.Int64\"/> value to convert.\n            </param>\n            <returns>\n            The resulting Julian Day <see cref=\"T:System.Double\"/> value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.computeYMD(System.Int64,System.Nullable{System.DateTime})\">\n            <summary>\n            Converts a Julian Day value to a <see cref=\"T:System.DateTime\"/>.\n            This method was translated from the \"computeYMD\" function in the\n            \"date.c\" file belonging to the SQLite core library.\n            </summary>\n            <param name=\"jd\">\n            The Julian Day value to convert.\n            </param>\n            <param name=\"badValue\">\n            The <see cref=\"T:System.DateTime\"/> value to return in the event that the\n            Julian Day is out of the supported range.  If this value is null,\n            an exception will be thrown instead.\n            </param>\n            <returns>\n            A <see cref=\"T:System.DateTime\"/> value that contains the year, month, and\n            day values that are closest to the specified Julian Day value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.computeHMS(System.Int64,System.Nullable{System.DateTime})\">\n            <summary>\n            Converts a Julian Day value to a <see cref=\"T:System.DateTime\"/>.\n            This method was translated from the \"computeHMS\" function in the\n            \"date.c\" file belonging to the SQLite core library.\n            </summary>\n            <param name=\"jd\">\n            The Julian Day value to convert.\n            </param>\n            <param name=\"badValue\">\n            The <see cref=\"T:System.DateTime\"/> value to return in the event that the\n            Julian Day value is out of the supported range.  If this value is\n            null, an exception will be thrown instead.\n            </param>\n            <returns>\n            A <see cref=\"T:System.DateTime\"/> value that contains the hour, minute, and\n            second, and millisecond values that are closest to the specified\n            Julian Day value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.computeJD(System.DateTime)\">\n            <summary>\n            Converts a <see cref=\"T:System.DateTime\"/> to a Julian Day value.\n            This method was translated from the \"computeJD\" function in\n            the \"date.c\" file belonging to the SQLite core library.\n            Since the range of Julian Day values supported by this method\n            includes all possible (valid) values of a <see cref=\"T:System.DateTime\"/>\n            value, it should be extremely difficult for this method to\n            raise an exception or return an undefined result.\n            </summary>\n            <param name=\"dateTime\">\n            The <see cref=\"T:System.DateTime\"/> value to convert.  This value\n            will be within the range of <see cref=\"F:System.DateTime.MinValue\"/>\n            (00:00:00.0000000, January 1, 0001) to\n            <see cref=\"F:System.DateTime.MaxValue\"/> (23:59:59.9999999, December\n            31, 9999).\n            </param>\n            <returns>\n            The nearest Julian Day value corresponding to the specified\n            <see cref=\"T:System.DateTime\"/> value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.String)\">\n            <summary>\n            Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind,\n            and DateTimeFormatString specified for the connection when it was opened.\n            </summary>\n            <remarks>\n            Acceptable ISO8601 DateTime formats are:\n            <list type=\"bullet\">\n            <item><description>THHmmssK</description></item>\n            <item><description>THHmmK</description></item>\n            <item><description>HH:mm:ss.FFFFFFFK</description></item>\n            <item><description>HH:mm:ssK</description></item>\n            <item><description>HH:mmK</description></item>\n            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFFK</description></item>\n            <item><description>yyyy-MM-dd HH:mm:ssK</description></item>\n            <item><description>yyyy-MM-dd HH:mmK</description></item>\n            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFFK</description></item>\n            <item><description>yyyy-MM-ddTHH:mmK</description></item>\n            <item><description>yyyy-MM-ddTHH:mm:ssK</description></item>\n            <item><description>yyyyMMddHHmmssK</description></item>\n            <item><description>yyyyMMddHHmmK</description></item>\n            <item><description>yyyyMMddTHHmmssFFFFFFFK</description></item>\n            <item><description>THHmmss</description></item>\n            <item><description>THHmm</description></item>\n            <item><description>HH:mm:ss.FFFFFFF</description></item>\n            <item><description>HH:mm:ss</description></item>\n            <item><description>HH:mm</description></item>\n            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFF</description></item>\n            <item><description>yyyy-MM-dd HH:mm:ss</description></item>\n            <item><description>yyyy-MM-dd HH:mm</description></item>\n            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFF</description></item>\n            <item><description>yyyy-MM-ddTHH:mm</description></item>\n            <item><description>yyyy-MM-ddTHH:mm:ss</description></item>\n            <item><description>yyyyMMddHHmmss</description></item>\n            <item><description>yyyyMMddHHmm</description></item>\n            <item><description>yyyyMMddTHHmmssFFFFFFF</description></item>\n            <item><description>yyyy-MM-dd</description></item>\n            <item><description>yyyyMMdd</description></item>\n            <item><description>yy-MM-dd</description></item>\n            </list>\n            If the string cannot be matched to one of the above formats -OR-\n            the DateTimeFormatString if one was provided, an exception will\n            be thrown.\n            </remarks>\n            <param name=\"dateText\">The string containing either a long integer number of 100-nanosecond units since\n            System.DateTime.MinValue, a Julian day double, an integer number of seconds since the Unix epoch, a\n            culture-independent formatted date and time string, a formatted date and time string in the current\n            culture, or an ISO8601-format string.</param>\n            <returns>A DateTime value</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.String,System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String)\">\n            <summary>\n            Converts a string into a DateTime, using the specified DateTimeFormat,\n            DateTimeKind and DateTimeFormatString.\n            </summary>\n            <remarks>\n            Acceptable ISO8601 DateTime formats are:\n            <list type=\"bullet\">\n            <item><description>THHmmssK</description></item>\n            <item><description>THHmmK</description></item>\n            <item><description>HH:mm:ss.FFFFFFFK</description></item>\n            <item><description>HH:mm:ssK</description></item>\n            <item><description>HH:mmK</description></item>\n            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFFK</description></item>\n            <item><description>yyyy-MM-dd HH:mm:ssK</description></item>\n            <item><description>yyyy-MM-dd HH:mmK</description></item>\n            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFFK</description></item>\n            <item><description>yyyy-MM-ddTHH:mmK</description></item>\n            <item><description>yyyy-MM-ddTHH:mm:ssK</description></item>\n            <item><description>yyyyMMddHHmmssK</description></item>\n            <item><description>yyyyMMddHHmmK</description></item>\n            <item><description>yyyyMMddTHHmmssFFFFFFFK</description></item>\n            <item><description>THHmmss</description></item>\n            <item><description>THHmm</description></item>\n            <item><description>HH:mm:ss.FFFFFFF</description></item>\n            <item><description>HH:mm:ss</description></item>\n            <item><description>HH:mm</description></item>\n            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFF</description></item>\n            <item><description>yyyy-MM-dd HH:mm:ss</description></item>\n            <item><description>yyyy-MM-dd HH:mm</description></item>\n            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFF</description></item>\n            <item><description>yyyy-MM-ddTHH:mm</description></item>\n            <item><description>yyyy-MM-ddTHH:mm:ss</description></item>\n            <item><description>yyyyMMddHHmmss</description></item>\n            <item><description>yyyyMMddHHmm</description></item>\n            <item><description>yyyyMMddTHHmmssFFFFFFF</description></item>\n            <item><description>yyyy-MM-dd</description></item>\n            <item><description>yyyyMMdd</description></item>\n            <item><description>yy-MM-dd</description></item>\n            </list>\n            If the string cannot be matched to one of the above formats -OR-\n            the DateTimeFormatString if one was provided, an exception will\n            be thrown.\n            </remarks>\n            <param name=\"dateText\">The string containing either a long integer number of 100-nanosecond units since\n            System.DateTime.MinValue, a Julian day double, an integer number of seconds since the Unix epoch, a\n            culture-independent formatted date and time string, a formatted date and time string in the current\n            culture, or an ISO8601-format string.</param>\n            <param name=\"format\">The SQLiteDateFormats to use.</param>\n            <param name=\"kind\">The DateTimeKind to use.</param>\n            <param name=\"formatString\">The DateTime format string to use.</param>\n            <returns>A DateTime value</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Double)\">\n            <summary>\n            Converts a julianday value into a DateTime\n            </summary>\n            <param name=\"julianDay\">The value to convert</param>\n            <returns>A .NET DateTime</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Double,System.DateTimeKind)\">\n            <summary>\n            Converts a julianday value into a DateTime\n            </summary>\n            <param name=\"julianDay\">The value to convert</param>\n            <param name=\"kind\">The DateTimeKind to use.</param>\n            <returns>A .NET DateTime</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.UnixEpochToDateTime(System.Int64,System.DateTimeKind)\">\n            <summary>\n            Converts the specified number of seconds from the Unix epoch into a\n            <see cref=\"T:System.DateTime\"/> value.\n            </summary>\n            <param name=\"seconds\">\n            The number of whole seconds since the Unix epoch.\n            </param>\n            <param name=\"kind\">\n            Either Utc or Local time.\n            </param>\n            <returns>\n            The new <see cref=\"T:System.DateTime\"/> value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.TicksToDateTime(System.Int64,System.DateTimeKind)\">\n            <summary>\n            Converts the specified number of ticks since the epoch into a\n            <see cref=\"T:System.DateTime\"/> value.\n            </summary>\n            <param name=\"ticks\">\n            The number of whole ticks since the epoch.\n            </param>\n            <param name=\"kind\">\n            Either Utc or Local time.\n            </param>\n            <returns>\n            The new <see cref=\"T:System.DateTime\"/> value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToJulianDay(System.DateTime)\">\n            <summary>\n            Converts a DateTime struct to a JulianDay double\n            </summary>\n            <param name=\"value\">The DateTime to convert</param>\n            <returns>The JulianDay value the Datetime represents</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToUnixEpoch(System.DateTime)\">\n            <summary>\n            Converts a DateTime struct to the whole number of seconds since the\n            Unix epoch.\n            </summary>\n            <param name=\"value\">The DateTime to convert</param>\n            <returns>The whole number of seconds since the Unix epoch</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.GetDateTimeKindFormat(System.DateTimeKind,System.String)\">\n            <summary>\n            Returns the DateTime format string to use for the specified DateTimeKind.\n            If <paramref name=\"formatString\" /> is not null, it will be returned verbatim.\n            </summary>\n            <param name=\"kind\">The DateTimeKind to use.</param>\n            <param name=\"formatString\">The DateTime format string to use.</param>\n            <returns>\n            The DateTime format string to use for the specified DateTimeKind.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToString(System.DateTime)\">\n            <summary>\n            Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind,\n            and DateTimeFormatString specified for the connection when it was opened.\n            </summary>\n            <param name=\"dateValue\">The DateTime value to convert</param>\n            <returns>Either a string containing the long integer number of 100-nanosecond units since System.DateTime.MinValue, a\n            Julian day double, an integer number of seconds since the Unix epoch, a culture-independent formatted date and time\n            string, a formatted date and time string in the current culture, or an ISO8601-format date/time string.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToString(System.DateTime,System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String)\">\n            <summary>\n            Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind,\n            and DateTimeFormatString specified for the connection when it was opened.\n            </summary>\n            <param name=\"dateValue\">The DateTime value to convert</param>\n            <param name=\"format\">The SQLiteDateFormats to use.</param>\n            <param name=\"kind\">The DateTimeKind to use.</param>\n            <param name=\"formatString\">The DateTime format string to use.</param>\n            <returns>Either a string containing the long integer number of 100-nanosecond units since System.DateTime.MinValue, a\n            Julian day double, an integer number of seconds since the Unix epoch, a culture-independent formatted date and time\n            string, a formatted date and time string in the current culture, or an ISO8601-format date/time string.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.IntPtr,System.Int32)\">\n            <summary>\n            Internal function to convert a UTF-8 encoded IntPtr of the specified length to a DateTime.\n            </summary>\n            <remarks>\n            This is a convenience function, which first calls ToString() on the IntPtr to convert it to a string, then calls\n            ToDateTime() on the string to return a DateTime.\n            </remarks>\n            <param name=\"ptr\">A pointer to the UTF-8 encoded string</param>\n            <param name=\"len\">The length in bytes of the string</param>\n            <returns>The parsed DateTime value</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.Split(System.String,System.Char)\">\n            <summary>\n            Smart method of splitting a string.  Skips quoted elements, removes the quotes.\n            </summary>\n            <remarks>\n            This split function works somewhat like the String.Split() function in that it breaks apart a string into\n            pieces and returns the pieces as an array.  The primary differences are:\n            <list type=\"bullet\">\n            <item><description>Only one character can be provided as a separator character</description></item>\n            <item><description>Quoted text inside the string is skipped over when searching for the separator, and the quotes are removed.</description></item>\n            </list>\n            Thus, if splitting the following string looking for a comma:<br/>\n            One,Two, \"Three, Four\", Five<br/>\n            <br/>\n            The resulting array would contain<br/>\n            [0] One<br/>\n            [1] Two<br/>\n            [2] Three, Four<br/>\n            [3] Five<br/>\n            <br/>\n            Note that the leading and trailing spaces were removed from each item during the split.\n            </remarks>\n            <param name=\"source\">Source string to split apart</param>\n            <param name=\"separator\">Separator character</param>\n            <returns>A string array of the split up elements</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.NewSplit(System.String,System.Char,System.Boolean,System.String@)\">\n            <summary>\n            Splits the specified string into multiple strings based on a separator\n            and returns the result as an array of strings.\n            </summary>\n            <param name=\"value\">\n            The string to split into pieces based on the separator character.  If\n            this string is null, null will always be returned.  If this string is\n            empty, an array of zero strings will always be returned.\n            </param>\n            <param name=\"separator\">\n            The character used to divide the original string into sub-strings.\n            This character cannot be a backslash or a double-quote; otherwise, no\n            work will be performed and null will be returned.\n            </param>\n            <param name=\"keepQuote\">\n            If this parameter is non-zero, all double-quote characters will be\n            retained in the returned list of strings; otherwise, they will be\n            dropped.\n            </param>\n            <param name=\"error\">\n            Upon failure, this parameter will be modified to contain an appropriate\n            error message.\n            </param>\n            <returns>\n            The new array of strings or null if the input string is null -OR- the\n            separator character is a backslash or a double-quote -OR- the string\n            contains an unbalanced backslash or double-quote character.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToStringWithProvider(System.Object,System.IFormatProvider)\">\n            <summary>\n            Queries and returns the string representation for an object, using the\n            specified (or current) format provider.\n            </summary>\n            <param name=\"obj\">\n            The object instance to return the string representation for.\n            </param>\n            <param name=\"provider\">\n            The format provider to use -OR- null if the current format provider for\n            the thread should be used instead.\n            </param>\n            <returns>\n            The string representation for the object instance -OR- null if the\n            object instance is also null.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToBoolean(System.Object,System.IFormatProvider,System.Boolean)\">\n            <summary>\n            Attempts to convert an arbitrary object to the Boolean data type.\n            Null object values are converted to false.  Throws an exception\n            upon failure.\n            </summary>\n            <param name=\"obj\">\n            The object value to convert.\n            </param>\n            <param name=\"provider\">\n            The format provider to use.\n            </param>\n            <param name=\"viaFramework\">\n            If non-zero, a string value will be converted using the\n            <see cref=\"M:System.Convert.ToBoolean(System.Object,System.IFormatProvider)\"/>\n            method; otherwise, the <see cref=\"M:System.Data.SQLite.SQLiteConvert.ToBoolean(System.String)\"/>\n            method will be used.\n            </param>\n            <returns>\n            The converted boolean value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToBoolean(System.Object)\">\n            <summary>\n            Convert a value to true or false.\n            </summary>\n            <param name=\"source\">A string or number representing true or false</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.ToBoolean(System.String)\">\n            <summary>\n            Attempts to convert a <see cref=\"T:System.String\"/> into a <see cref=\"T:System.Boolean\"/>.\n            </summary>\n            <param name=\"source\">\n            The <see cref=\"T:System.String\"/> to convert, cannot be null.\n            </param>\n            <returns>\n            The converted <see cref=\"T:System.Boolean\"/> value.\n            </returns>\n            <remarks>\n            The supported strings are \"yes\", \"no\", \"y\", \"n\", \"on\", \"off\", \"0\", \"1\",\n            as well as any prefix of the strings <see cref=\"F:System.Boolean.FalseString\"/>\n            and <see cref=\"F:System.Boolean.TrueString\"/>.  All strings are treated in a\n            case-insensitive manner.\n            </remarks>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.SQLiteTypeToType(System.Data.SQLite.SQLiteType)\">\n            <summary>\n            Converts a SQLiteType to a .NET Type object\n            </summary>\n            <param name=\"t\">The SQLiteType to convert</param>\n            <returns>Returns a .NET Type object</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.TypeToDbType(System.Type)\">\n            <summary>\n            For a given intrinsic type, return a DbType\n            </summary>\n            <param name=\"typ\">The native type to convert</param>\n            <returns>The corresponding (closest match) DbType</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.DbTypeToColumnSize(System.Data.DbType)\">\n            <summary>\n            Returns the ColumnSize for the given DbType\n            </summary>\n            <param name=\"typ\">The DbType to get the size of</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.GetDefaultTypeName(System.Data.SQLite.SQLiteConnection)\">\n            <summary>\n            Determines the default database type name to be used when a\n            per-connection value is not available.\n            </summary>\n            <param name=\"connection\">\n            The connection context for type mappings, if any.\n            </param>\n            <returns>\n            The default database type name to use.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.DefaultTypeNameWarning(System.Data.DbType,System.Data.SQLite.SQLiteConnectionFlags,System.String)\">\n            <summary>\n            If applicable, issues a trace log message warning about falling back to\n            the default database type name.\n            </summary>\n            <param name=\"dbType\">\n            The database value type.\n            </param>\n            <param name=\"flags\">\n            The flags associated with the parent connection object.\n            </param>\n            <param name=\"typeName\">\n            The textual name of the database type.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.DefaultDbTypeWarning(System.String,System.Data.SQLite.SQLiteConnectionFlags,System.Nullable{System.Data.DbType})\">\n            <summary>\n            If applicable, issues a trace log message warning about falling back to\n            the default database value type.\n            </summary>\n            <param name=\"typeName\">\n            The textual name of the database type.\n            </param>\n            <param name=\"flags\">\n            The flags associated with the parent connection object.\n            </param>\n            <param name=\"dbType\">\n            The database value type.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.DbTypeToTypeName(System.Data.SQLite.SQLiteConnection,System.Data.DbType,System.Data.SQLite.SQLiteConnectionFlags)\">\n            <summary>\n            For a given database value type, return the \"closest-match\" textual database type name.\n            </summary>\n            <param name=\"connection\">The connection context for custom type mappings, if any.</param>\n            <param name=\"dbType\">The database value type.</param>\n            <param name=\"flags\">The flags associated with the parent connection object.</param>\n            <returns>The type name or an empty string if it cannot be determined.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.DbTypeToType(System.Data.DbType)\">\n            <summary>\n            Convert a DbType to a Type\n            </summary>\n            <param name=\"typ\">The DbType to convert from</param>\n            <returns>The closest-match .NET type</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.TypeToAffinity(System.Type)\">\n            <summary>\n            For a given type, return the closest-match SQLite TypeAffinity, which only understands a very limited subset of types.\n            </summary>\n            <param name=\"typ\">The type to evaluate</param>\n            <returns>The SQLite type affinity for that type.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.GetSQLiteDbTypeMap\">\n            <summary>\n            Builds and returns a map containing the database column types\n            recognized by this provider.\n            </summary>\n            <returns>\n            A map containing the database column types recognized by this\n            provider.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.IsStringDbType(System.Data.DbType)\">\n            <summary>\n            Determines if a database type is considered to be a string.\n            </summary>\n            <param name=\"type\">\n            The database type to check.\n            </param>\n            <returns>\n            Non-zero if the database type is considered to be a string, zero\n            otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.SettingValueToString(System.Object)\">\n            <summary>\n            Determines and returns the runtime configuration setting string that\n            should be used in place of the specified object value.\n            </summary>\n            <param name=\"value\">\n            The object value to convert to a string.\n            </param>\n            <returns>\n            Either the string to use in place of the object value -OR- null if it\n            cannot be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.GetDefaultDbType(System.Data.SQLite.SQLiteConnection)\">\n            <summary>\n            Determines the default <see cref=\"T:System.Data.DbType\"/> value to be used when a\n            per-connection value is not available.\n            </summary>\n            <param name=\"connection\">\n            The connection context for type mappings, if any.\n            </param>\n            <returns>\n            The default <see cref=\"T:System.Data.DbType\"/> value to use.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.GetStringOrNull(System.Object)\">\n            <summary>\n            Converts the object value, which is assumed to have originated\n            from a <see cref=\"T:System.Data.DataRow\"/>, to a string value.\n            </summary>\n            <param name=\"value\">\n            The value to be converted to a string.\n            </param>\n            <returns>\n            A null value will be returned if the original value is null -OR-\n            the original value is <see cref=\"F:System.DBNull.Value\"/>.  Otherwise,\n            the original value will be converted to a string, using its\n            (possibly overridden) <see cref=\"M:System.Object.ToString\"/> method and\n            then returned.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.LooksLikeNull(System.String)\">\n            <summary>\n            Determines if the specified textual value appears to be a\n            <see cref=\"T:System.DBNull\"/> value.\n            </summary>\n            <param name=\"text\">\n            The textual value to inspect.\n            </param>\n            <returns>\n            Non-zero if the text looks like a <see cref=\"T:System.DBNull\"/> value,\n            zero otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.LooksLikeInt64(System.String)\">\n            <summary>\n            Determines if the specified textual value appears to be an\n            <see cref=\"T:System.Int64\"/> value.\n            </summary>\n            <param name=\"text\">\n            The textual value to inspect.\n            </param>\n            <returns>\n            Non-zero if the text looks like an <see cref=\"T:System.Int64\"/> value,\n            zero otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.LooksLikeDouble(System.String)\">\n            <summary>\n            Determines if the specified textual value appears to be a\n            <see cref=\"T:System.Double\"/> value.\n            </summary>\n            <param name=\"text\">\n            The textual value to inspect.\n            </param>\n            <returns>\n            Non-zero if the text looks like a <see cref=\"T:System.Double\"/> value,\n            zero otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.LooksLikeDateTime(System.Data.SQLite.SQLiteConvert,System.String)\">\n            <summary>\n            Determines if the specified textual value appears to be a\n            <see cref=\"T:System.DateTime\"/> value.\n            </summary>\n            <param name=\"convert\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteConvert\"/> object instance configured with\n            the chosen <see cref=\"T:System.DateTime\"/> format.\n            </param>\n            <param name=\"text\">\n            The textual value to inspect.\n            </param>\n            <returns>\n            Non-zero if the text looks like a <see cref=\"T:System.DateTime\"/> in the\n            configured format, zero otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConvert.TypeNameToDbType(System.Data.SQLite.SQLiteConnection,System.String,System.Data.SQLite.SQLiteConnectionFlags)\">\n            <summary>\n            For a given textual database type name, return the \"closest-match\" database type.\n            This method is called during query result processing; therefore, its performance\n            is critical.\n            </summary>\n            <param name=\"connection\">The connection context for custom type mappings, if any.</param>\n            <param name=\"typeName\">The textual name of the database type to match.</param>\n            <param name=\"flags\">The flags associated with the parent connection object.</param>\n            <returns>The .NET DBType the text evaluates to.</returns>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteBase.COR_E_EXCEPTION\">\n            <summary>\n            The error code used for logging exceptions caught in user-provided\n            code.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.SetMemoryStatus(System.Boolean)\">\n            <summary>\n            Sets the status of the memory usage tracking subsystem in the SQLite core library.  By default, this is enabled.\n            If this is disabled, memory usage tracking will not be performed.  This is not really a per-connection value, it is\n            global to the process.\n            </summary>\n            <param name=\"value\">Non-zero to enable memory usage tracking, zero otherwise.</param>\n            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.ReleaseMemory\">\n            <summary>\n            Attempts to free as much heap memory as possible for the database connection.\n            </summary>\n            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.Shutdown\">\n            <summary>\n            Shutdown the SQLite engine so that it can be restarted with different config options.\n            We depend on auto initialization to recover.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.IsOpen\">\n            <summary>\n            Determines if the associated native connection handle is open.\n            </summary>\n            <returns>\n            Non-zero if a database connection is open.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.GetFileName(System.String)\">\n            <summary>\n            Returns the fully qualified path and file name for the currently open\n            database, if any.\n            </summary>\n            <param name=\"dbName\">\n            The name of the attached database to query.\n            </param>\n            <returns>\n            The fully qualified path and file name for the currently open database,\n            if any.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.Open(System.String,System.String,System.Data.SQLite.SQLiteConnectionFlags,System.Data.SQLite.SQLiteOpenFlagsEnum,System.Int32,System.Boolean)\">\n            <summary>\n            Opens a database.\n            </summary>\n            <remarks>\n            Implementers should call SQLiteFunction.BindFunctions() and save the array after opening a connection\n            to bind all attributed user-defined functions and collating sequences to the new connection.\n            </remarks>\n            <param name=\"strFilename\">The filename of the database to open.  SQLite automatically creates it if it doesn't exist.</param>\n            <param name=\"vfsName\">The name of the VFS to use -OR- null to use the default VFS.</param>\n            <param name=\"connectionFlags\">The flags associated with the parent connection object</param>\n            <param name=\"openFlags\">The open flags to use when creating the connection</param>\n            <param name=\"maxPoolSize\">The maximum size of the pool for the given filename</param>\n            <param name=\"usePool\">If true, the connection can be pulled from the connection pool</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.Close(System.Boolean)\">\n            <summary>\n            Closes the currently-open database.\n            </summary>\n            <remarks>\n            After the database has been closed implemeters should call SQLiteFunction.UnbindFunctions() to deallocate all interop allocated\n            memory associated with the user-defined functions and collating sequences tied to the closed connection.\n            </remarks>\n            <param name=\"canThrow\">Non-zero if the operation is allowed to throw exceptions, zero otherwise.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.SetTimeout(System.Int32)\">\n            <summary>\n            Sets the busy timeout on the connection.  SQLiteCommand will call this before executing any command.\n            </summary>\n            <param name=\"nTimeoutMS\">The number of milliseconds to wait before returning SQLITE_BUSY</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.GetLastError\">\n            <summary>\n            Returns the text of the last error issued by SQLite\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.GetLastError(System.String)\">\n            <summary>\n            Returns the text of the last error issued by SQLite -OR- the specified default error text if\n            none is available from the SQLite core library.\n            </summary>\n            <param name=\"defValue\">\n            The error text to return in the event that one is not available from the SQLite core library.\n            </param>\n            <returns>\n            The error text.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.ClearPool\">\n            <summary>\n            When pooling is enabled, force this connection to be disposed rather than returned to the pool\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.CountPool\">\n            <summary>\n            When pooling is enabled, returns the number of pool entries matching the current file name.\n            </summary>\n            <returns>The number of pool entries matching the current file name.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.Prepare(System.Data.SQLite.SQLiteConnection,System.String,System.Data.SQLite.SQLiteStatement,System.UInt32,System.String@)\">\n            <summary>\n            Prepares a SQL statement for execution.\n            </summary>\n            <param name=\"cnn\">The source connection preparing the command.  Can be null for any caller except LINQ</param>\n            <param name=\"strSql\">The SQL command text to prepare</param>\n            <param name=\"previous\">The previous statement in a multi-statement command, or null if no previous statement exists</param>\n            <param name=\"timeoutMS\">The timeout to wait before aborting the prepare</param>\n            <param name=\"strRemain\">The remainder of the statement that was not processed.  Each call to prepare parses the\n            SQL up to to either the end of the text or to the first semi-colon delimiter.  The remaining text is returned\n            here for a subsequent call to Prepare() until all the text has been processed.</param>\n            <returns>Returns an initialized SQLiteStatement.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.Step(System.Data.SQLite.SQLiteStatement)\">\n            <summary>\n            Steps through a prepared statement.\n            </summary>\n            <param name=\"stmt\">The SQLiteStatement to step through</param>\n            <returns>True if a row was returned, False if not.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.IsReadOnly(System.Data.SQLite.SQLiteStatement)\">\n            <summary>\n            Returns non-zero if the specified statement is read-only in nature.\n            </summary>\n            <param name=\"stmt\">The statement to check.</param>\n            <returns>True if the outer query is read-only.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.Reset(System.Data.SQLite.SQLiteStatement)\">\n            <summary>\n            Resets a prepared statement so it can be executed again.  If the error returned is SQLITE_SCHEMA,\n            transparently attempt to rebuild the SQL statement and throw an error if that was not possible.\n            </summary>\n            <param name=\"stmt\">The statement to reset</param>\n            <returns>Returns -1 if the schema changed while resetting, 0 if the reset was sucessful or 6 (SQLITE_LOCKED) if the reset failed due to a lock</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.Cancel\">\n            <summary>\n            Attempts to interrupt the query currently executing on the associated\n            native database connection.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)\">\n            <summary>\n            This function binds a user-defined function to the connection.\n            </summary>\n            <param name=\"functionAttribute\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunctionAttribute\"/> object instance containing\n            the metadata for the function to be bound.\n            </param>\n            <param name=\"function\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> object instance that implements the\n            function to be bound.\n            </param>\n            <param name=\"flags\">\n            The flags associated with the parent connection object.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.UnbindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteConnectionFlags)\">\n            <summary>\n            This function unbinds a user-defined function from the connection.\n            </summary>\n            <param name=\"functionAttribute\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunctionAttribute\"/> object instance containing\n            the metadata for the function to be unbound.\n            </param>\n            <param name=\"flags\">\n            The flags associated with the parent connection object.\n            </param>\n            <returns>Non-zero if the function was unbound.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)\">\n            <summary>\n            Calls the native SQLite core library in order to create a disposable\n            module containing the implementation of a virtual table.\n            </summary>\n            <param name=\"module\">\n            The module object to be used when creating the native disposable module.\n            </param>\n            <param name=\"flags\">\n            The flags for the associated <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> object instance.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.DisposeModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)\">\n            <summary>\n            Calls the native SQLite core library in order to cleanup the resources\n            associated with a module containing the implementation of a virtual table.\n            </summary>\n            <param name=\"module\">\n            The module object previously passed to the <see cref=\"M:System.Data.SQLite.SQLiteBase.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)\"/>\n            method.\n            </param>\n            <param name=\"flags\">\n            The flags for the associated <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> object instance.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.DeclareVirtualTable(System.Data.SQLite.SQLiteModule,System.String,System.String@)\">\n            <summary>\n            Calls the native SQLite core library in order to declare a virtual table\n            in response to a call into the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/>\n            or <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> virtual table methods.\n            </summary>\n            <param name=\"module\">\n            The virtual table module that is to be responsible for the virtual table\n            being declared.\n            </param>\n            <param name=\"strSql\">\n            The string containing the SQL statement describing the virtual table to\n            be declared.\n            </param>\n            <param name=\"error\">\n            Upon success, the contents of this parameter are undefined.  Upon failure,\n            it should contain an appropriate error message.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.DeclareVirtualFunction(System.Data.SQLite.SQLiteModule,System.Int32,System.String,System.String@)\">\n            <summary>\n            Calls the native SQLite core library in order to declare a virtual table\n            function in response to a call into the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/>\n            or <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> virtual table methods.\n            </summary>\n            <param name=\"module\">\n            The virtual table module that is to be responsible for the virtual table\n            function being declared.\n            </param>\n            <param name=\"argumentCount\">\n            The number of arguments to the function being declared.\n            </param>\n            <param name=\"name\">\n            The name of the function being declared.\n            </param>\n            <param name=\"error\">\n            Upon success, the contents of this parameter are undefined.  Upon failure,\n            it should contain an appropriate error message.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.SetLoadExtension(System.Boolean)\">\n            <summary>\n            Enables or disabled extension loading by SQLite.\n            </summary>\n            <param name=\"bOnOff\">\n            True to enable loading of extensions, false to disable.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.LoadExtension(System.String,System.String)\">\n            <summary>\n            Loads a SQLite extension library from the named file.\n            </summary>\n            <param name=\"fileName\">\n            The name of the dynamic link library file containing the extension.\n            </param>\n            <param name=\"procName\">\n            The name of the exported function used to initialize the extension.\n            If null, the default \"sqlite3_extension_init\" will be used.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.SetExtendedResultCodes(System.Boolean)\">\n            <summary>\n            Enables or disabled extened result codes returned by SQLite\n            </summary>\n            <param name=\"bOnOff\">true to enable extended result codes, false to disable.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.ResultCode\">\n            <summary>\n            Returns the numeric result code for the most recent failed SQLite API call\n            associated with the database connection.\n            </summary>\n            <returns>Result code</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.ExtendedResultCode\">\n            <summary>\n            Returns the extended numeric result code for the most recent failed SQLite API call\n            associated with the database connection.\n            </summary>\n            <returns>Extended result code</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)\">\n            <summary>\n            Add a log message via the SQLite sqlite3_log interface.\n            </summary>\n            <param name=\"iErrCode\">Error code to be logged with the message.</param>\n            <param name=\"zMessage\">String to be logged.  Unlike the SQLite sqlite3_log()\n            interface, this should be pre-formatted.  Consider using the\n            String.Format() function.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.IsInitialized\">\n            <summary>\n            Checks if the SQLite core library has been initialized in the current process.\n            </summary>\n            <returns>\n            Non-zero if the SQLite core library has been initialized in the current process,\n            zero otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.InitializeBackup(System.Data.SQLite.SQLiteConnection,System.String,System.String)\">\n            <summary>\n            Creates a new SQLite backup object based on the provided destination\n            database connection.  The source database connection is the one\n            associated with this object.  The source and destination database\n            connections cannot be the same.\n            </summary>\n            <param name=\"destCnn\">The destination database connection.</param>\n            <param name=\"destName\">The destination database name.</param>\n            <param name=\"sourceName\">The source database name.</param>\n            <returns>The newly created backup object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.StepBackup(System.Data.SQLite.SQLiteBackup,System.Int32,System.Boolean@)\">\n            <summary>\n            Copies up to N pages from the source database to the destination\n            database associated with the specified backup object.\n            </summary>\n            <param name=\"backup\">The backup object to use.</param>\n            <param name=\"nPage\">\n            The number of pages to copy or negative to copy all remaining pages.\n            </param>\n            <param name=\"retry\">\n            Set to true if the operation needs to be retried due to database\n            locking issues.\n            </param>\n            <returns>\n            True if there are more pages to be copied, false otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.RemainingBackup(System.Data.SQLite.SQLiteBackup)\">\n            <summary>\n            Returns the number of pages remaining to be copied from the source\n            database to the destination database associated with the specified\n            backup object.\n            </summary>\n            <param name=\"backup\">The backup object to check.</param>\n            <returns>The number of pages remaining to be copied.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.PageCountBackup(System.Data.SQLite.SQLiteBackup)\">\n            <summary>\n            Returns the total number of pages in the source database associated\n            with the specified backup object.\n            </summary>\n            <param name=\"backup\">The backup object to check.</param>\n            <returns>The total number of pages in the source database.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.FinishBackup(System.Data.SQLite.SQLiteBackup)\">\n            <summary>\n            Destroys the backup object, rolling back any backup that may be in\n            progess.\n            </summary>\n            <param name=\"backup\">The backup object to destroy.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBase.FallbackGetErrorString(System.Data.SQLite.SQLiteErrorCode)\">\n            <summary>\n            Returns the error message for the specified SQLite return code using\n            the internal static lookup table.\n            </summary>\n            <param name=\"rc\">The SQLite return code.</param>\n            <returns>The error message or null if it cannot be found.</returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteBase.Version\">\n            <summary>\n            Returns a string representing the active version of SQLite\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteBase.VersionNumber\">\n            <summary>\n            Returns an integer representing the active version of SQLite\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteBase.LastInsertRowId\">\n            <summary>\n            Returns the rowid of the most recent successful INSERT into the database from this connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteBase.Changes\">\n            <summary>\n            Returns the number of changes the last executing insert/update caused.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteBase.MemoryUsed\">\n            <summary>\n            Returns the amount of memory (in bytes) currently in use by the SQLite core library.  This is not really a per-connection\n            value, it is global to the process.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteBase.MemoryHighwater\">\n            <summary>\n            Returns the maximum amount of memory (in bytes) used by the SQLite core library since the high-water mark was last reset.\n            This is not really a per-connection value, it is global to the process.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteBase.OwnHandle\">\n            <summary>\n            Returns non-zero if the underlying native connection handle is owned by this instance.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteBase.Functions\">\n            <summary>\n            Returns the logical list of functions associated with this connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteBase.AutoCommit\">\n            <summary>\n            Returns non-zero if the given database connection is in autocommit mode.\n            Autocommit mode is on by default.  Autocommit mode is disabled by a BEGIN\n            statement.  Autocommit mode is re-enabled by a COMMIT or ROLLBACK.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLite3._sql\">\n            <summary>\n            The opaque pointer returned to us by the sqlite provider\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLite3._functions\">\n            <summary>\n            The user-defined functions registered on this connection\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLite3._shimExtensionFileName\">\n            <summary>\n            This is the name of the native library file that contains the\n            \"vtshim\" extension [wrapper].\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLite3._shimIsLoadNeeded\">\n            <summary>\n            This is the flag indicate whether the native library file that\n            contains the \"vtshim\" extension must be dynamically loaded by\n            this class prior to use.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLite3._shimExtensionProcName\">\n            <summary>\n            This is the name of the native entry point for the \"vtshim\"\n            extension [wrapper].\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLite3._modules\">\n            <summary>\n            The modules created using this connection.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.IntPtr,System.String,System.Boolean)\">\n            <summary>\n            Constructs the object used to interact with the SQLite core library\n            using the UTF-8 text encoding.\n            </summary>\n            <param name=\"fmt\">\n            The DateTime format to be used when converting string values to a\n            DateTime and binding DateTime parameters.\n            </param>\n            <param name=\"kind\">\n            The <see cref=\"T:System.DateTimeKind\"/> to be used when creating DateTime\n            values.\n            </param>\n            <param name=\"fmtString\">\n            The format string to be used when parsing and formatting DateTime\n            values.\n            </param>\n            <param name=\"db\">\n            The native handle to be associated with the database connection.\n            </param>\n            <param name=\"fileName\">\n            The fully qualified file name associated with <paramref name=\"db \"/>.\n            </param>\n            <param name=\"ownHandle\">\n            Non-zero if the newly created object instance will need to dispose\n            of <paramref name=\"db\"/> when it is no longer needed.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.DisposeModules\">\n            <summary>\n            This method attempts to dispose of all the <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> derived\n            object instances currently associated with the native database connection.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.GetCancelCount\">\n            <summary>\n            Returns the number of times the <see cref=\"M:System.Data.SQLite.SQLite3.Cancel\"/> method has been\n            called.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.ShouldThrowForCancel\">\n            <summary>\n            This method determines whether or not a <see cref=\"T:System.Data.SQLite.SQLiteException\"/>\n            with a return code of <see cref=\"F:System.Data.SQLite.SQLiteErrorCode.Interrupt\"/> should\n            be thrown after making a call into the SQLite core library.\n            </summary>\n            <returns>\n            Non-zero if a <see cref=\"T:System.Data.SQLite.SQLiteException\"/> to be thrown.  This method\n            will only return non-zero if the <see cref=\"M:System.Data.SQLite.SQLite3.Cancel\"/> method was called\n            one or more times during a call into the SQLite core library (e.g. when\n            the sqlite3_prepare*() or sqlite3_step() APIs are used).\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.ResetCancelCount\">\n            <summary>\n            Resets the value of the <see cref=\"F:System.Data.SQLite.SQLite3._cancelCount\"/> field.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.Cancel\">\n            <summary>\n            Attempts to interrupt the query currently executing on the associated\n            native database connection.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)\">\n            <summary>\n            This function binds a user-defined function to the connection.\n            </summary>\n            <param name=\"functionAttribute\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunctionAttribute\"/> object instance containing\n            the metadata for the function to be bound.\n            </param>\n            <param name=\"function\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> object instance that implements the\n            function to be bound.\n            </param>\n            <param name=\"flags\">\n            The flags associated with the parent connection object.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.UnbindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteConnectionFlags)\">\n            <summary>\n            This function binds a user-defined function to the connection.\n            </summary>\n            <param name=\"functionAttribute\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunctionAttribute\"/> object instance containing\n            the metadata for the function to be unbound.\n            </param>\n            <param name=\"flags\">\n            The flags associated with the parent connection object.\n            </param>\n            <returns>Non-zero if the function was unbound and removed.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.ReleaseMemory\">\n            <summary>\n            Attempts to free as much heap memory as possible for the database connection.\n            </summary>\n            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.StaticReleaseMemory(System.Int32,System.Boolean,System.Boolean,System.Int32@,System.Boolean@,System.UInt32@)\">\n            <summary>\n            Attempts to free N bytes of heap memory by deallocating non-essential memory\n            allocations held by the database library. Memory used to cache database pages\n            to improve performance is an example of non-essential memory.  This is a no-op\n            returning zero if the SQLite core library was not compiled with the compile-time\n            option SQLITE_ENABLE_MEMORY_MANAGEMENT.  Optionally, attempts to reset and/or\n            compact the Win32 native heap, if applicable.\n            </summary>\n            <param name=\"nBytes\">\n            The requested number of bytes to free.\n            </param>\n            <param name=\"reset\">\n            Non-zero to attempt a heap reset.\n            </param>\n            <param name=\"compact\">\n            Non-zero to attempt heap compaction.\n            </param>\n            <param name=\"nFree\">\n            The number of bytes actually freed.  This value may be zero.\n            </param>\n            <param name=\"resetOk\">\n            This value will be non-zero if the heap reset was successful.\n            </param>\n            <param name=\"nLargest\">\n            The size of the largest committed free block in the heap, in bytes.\n            This value will be zero unless heap compaction is enabled.\n            </param>\n            <returns>\n            A standard SQLite return code (i.e. zero for success and non-zero\n            for failure).\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.Shutdown\">\n            <summary>\n            Shutdown the SQLite engine so that it can be restarted with different\n            configuration options.  We depend on auto initialization to recover.\n            </summary>\n            <returns>Returns a standard SQLite result code.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.StaticShutdown(System.Boolean)\">\n            <summary>\n            Shutdown the SQLite engine so that it can be restarted with different\n            configuration options.  We depend on auto initialization to recover.\n            </summary>\n            <param name=\"directories\">\n            Non-zero to reset the database and temporary directories to their\n            default values, which should be null for both.  This parameter has no\n            effect on non-Windows operating systems.\n            </param>\n            <returns>Returns a standard SQLite result code.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.IsOpen\">\n            <summary>\n            Determines if the associated native connection handle is open.\n            </summary>\n            <returns>\n            Non-zero if the associated native connection handle is open.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.GetFileName(System.String)\">\n            <summary>\n            Returns the fully qualified path and file name for the currently open\n            database, if any.\n            </summary>\n            <param name=\"dbName\">\n            The name of the attached database to query.\n            </param>\n            <returns>\n            The fully qualified path and file name for the currently open database,\n            if any.\n            </returns>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLite3.have_errstr\">\n            <summary>\n            Has the sqlite3_errstr() core library API been checked for yet?\n            If so, is it present?\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.GetErrorString(System.Data.SQLite.SQLiteErrorCode)\">\n            <summary>\n            Returns the error message for the specified SQLite return code using\n            the sqlite3_errstr() function, falling back to the internal lookup\n            table if necessary.\n            </summary>\n            <param name=\"rc\">The SQLite return code.</param>\n            <returns>The error message or null if it cannot be found.</returns>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLite3.have_stmt_readonly\">\n            <summary>\n            Has the sqlite3_stmt_readonly() core library API been checked for yet?\n            If so, is it present?\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.IsReadOnly(System.Data.SQLite.SQLiteStatement)\">\n            <summary>\n            Returns non-zero if the specified statement is read-only in nature.\n            </summary>\n            <param name=\"stmt\">The statement to check.</param>\n            <returns>True if the outer query is read-only.</returns>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLite3.forceLogPrepare\">\n            <summary>\n            This field is used to keep track of whether or not the\n            \"SQLite_ForceLogPrepare\" environment variable has been queried.  If so,\n            it will only be non-zero if the environment variable was present.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.ForceLogPrepare\">\n            <summary>\n            Determines if all calls to prepare a SQL query will be logged,\n            regardless of the flags for the associated connection.\n            </summary>\n            <returns>\n            Non-zero to log all calls to prepare a SQL query.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.GetShimExtensionFileName(System.Boolean@)\">\n            <summary>\n            Determines the file name of the native library containing the native\n            \"vtshim\" extension -AND- whether it should be dynamically loaded by\n            this class.\n            </summary>\n            <param name=\"isLoadNeeded\">\n            This output parameter will be set to non-zero if the returned native\n            library file name should be dynamically loaded prior to attempting\n            the creation of native disposable extension modules.\n            </param>\n            <returns>\n            The file name of the native library containing the native \"vtshim\"\n            extension -OR- null if it cannot be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)\">\n            <summary>\n            Calls the native SQLite core library in order to create a disposable\n            module containing the implementation of a virtual table.\n            </summary>\n            <param name=\"module\">\n            The module object to be used when creating the native disposable module.\n            </param>\n            <param name=\"flags\">\n            The flags for the associated <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> object instance.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.DisposeModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)\">\n            <summary>\n            Calls the native SQLite core library in order to cleanup the resources\n            associated with a module containing the implementation of a virtual table.\n            </summary>\n            <param name=\"module\">\n            The module object previously passed to the <see cref=\"M:System.Data.SQLite.SQLite3.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)\"/>\n            method.\n            </param>\n            <param name=\"flags\">\n            The flags for the associated <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> object instance.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.DeclareVirtualTable(System.Data.SQLite.SQLiteModule,System.String,System.String@)\">\n            <summary>\n            Calls the native SQLite core library in order to declare a virtual table\n            in response to a call into the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/>\n            or <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> virtual table methods.\n            </summary>\n            <param name=\"module\">\n            The virtual table module that is to be responsible for the virtual table\n            being declared.\n            </param>\n            <param name=\"strSql\">\n            The string containing the SQL statement describing the virtual table to\n            be declared.\n            </param>\n            <param name=\"error\">\n            Upon success, the contents of this parameter are undefined.  Upon failure,\n            it should contain an appropriate error message.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.DeclareVirtualFunction(System.Data.SQLite.SQLiteModule,System.Int32,System.String,System.String@)\">\n            <summary>\n            Calls the native SQLite core library in order to declare a virtual table\n            function in response to a call into the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/>\n            or <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> virtual table methods.\n            </summary>\n            <param name=\"module\">\n            The virtual table module that is to be responsible for the virtual table\n            function being declared.\n            </param>\n            <param name=\"argumentCount\">\n            The number of arguments to the function being declared.\n            </param>\n            <param name=\"name\">\n            The name of the function being declared.\n            </param>\n            <param name=\"error\">\n            Upon success, the contents of this parameter are undefined.  Upon failure,\n            it should contain an appropriate error message.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.SetLoadExtension(System.Boolean)\">\n            <summary>\n            Enables or disabled extension loading by SQLite.\n            </summary>\n            <param name=\"bOnOff\">\n            True to enable loading of extensions, false to disable.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.LoadExtension(System.String,System.String)\">\n            <summary>\n            Loads a SQLite extension library from the named file.\n            </summary>\n            <param name=\"fileName\">\n            The name of the dynamic link library file containing the extension.\n            </param>\n            <param name=\"procName\">\n            The name of the exported function used to initialize the extension.\n            If null, the default \"sqlite3_extension_init\" will be used.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.SetExtendedResultCodes(System.Boolean)\">\n            Enables or disabled extended result codes returned by SQLite\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.ResultCode\">\n            Gets the last SQLite error code\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.ExtendedResultCode\">\n            Gets the last SQLite extended error code\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)\">\n            Add a log message via the SQLite sqlite3_log interface.\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.StaticLogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)\">\n            Add a log message via the SQLite sqlite3_log interface.\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.SetLogCallback(System.Data.SQLite.SQLiteLogCallback)\">\n            <summary>\n            Allows the setting of a logging callback invoked by SQLite when a\n            log event occurs.  Only one callback may be set.  If NULL is passed,\n            the logging callback is unregistered.\n            </summary>\n            <param name=\"func\">The callback function to invoke.</param>\n            <returns>Returns a result code</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.InitializeBackup(System.Data.SQLite.SQLiteConnection,System.String,System.String)\">\n            <summary>\n            Creates a new SQLite backup object based on the provided destination\n            database connection.  The source database connection is the one\n            associated with this object.  The source and destination database\n            connections cannot be the same.\n            </summary>\n            <param name=\"destCnn\">The destination database connection.</param>\n            <param name=\"destName\">The destination database name.</param>\n            <param name=\"sourceName\">The source database name.</param>\n            <returns>The newly created backup object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.StepBackup(System.Data.SQLite.SQLiteBackup,System.Int32,System.Boolean@)\">\n            <summary>\n            Copies up to N pages from the source database to the destination\n            database associated with the specified backup object.\n            </summary>\n            <param name=\"backup\">The backup object to use.</param>\n            <param name=\"nPage\">\n            The number of pages to copy, negative to copy all remaining pages.\n            </param>\n            <param name=\"retry\">\n            Set to true if the operation needs to be retried due to database\n            locking issues; otherwise, set to false.\n            </param>\n            <returns>\n            True if there are more pages to be copied, false otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.RemainingBackup(System.Data.SQLite.SQLiteBackup)\">\n            <summary>\n            Returns the number of pages remaining to be copied from the source\n            database to the destination database associated with the specified\n            backup object.\n            </summary>\n            <param name=\"backup\">The backup object to check.</param>\n            <returns>The number of pages remaining to be copied.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.PageCountBackup(System.Data.SQLite.SQLiteBackup)\">\n            <summary>\n            Returns the total number of pages in the source database associated\n            with the specified backup object.\n            </summary>\n            <param name=\"backup\">The backup object to check.</param>\n            <returns>The total number of pages in the source database.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.FinishBackup(System.Data.SQLite.SQLiteBackup)\">\n            <summary>\n            Destroys the backup object, rolling back any backup that may be in\n            progess.\n            </summary>\n            <param name=\"backup\">The backup object to destroy.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.IsInitialized\">\n            <summary>\n            Determines if the SQLite core library has been initialized for the\n            current process.\n            </summary>\n            <returns>\n            A boolean indicating whether or not the SQLite core library has been\n            initialized for the current process.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.StaticIsInitialized\">\n            <summary>\n            Determines if the SQLite core library has been initialized for the\n            current process.\n            </summary>\n            <returns>\n            A boolean indicating whether or not the SQLite core library has been\n            initialized for the current process.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3.GetValue(System.Data.SQLite.SQLiteStatement,System.Data.SQLite.SQLiteConnectionFlags,System.Int32,System.Data.SQLite.SQLiteType)\">\n            <summary>\n            Helper function to retrieve a column of data from an active statement.\n            </summary>\n            <param name=\"stmt\">The statement being step()'d through</param>\n            <param name=\"flags\">The flags associated with the connection.</param>\n            <param name=\"index\">The column index to retrieve</param>\n            <param name=\"typ\">The type of data contained in the column.  If Uninitialized, this function will retrieve the datatype information.</param>\n            <returns>Returns the data in the column</returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLite3.OwnHandle\">\n            <summary>\n            Returns non-zero if the underlying native connection handle is owned\n            by this instance.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLite3.Functions\">\n            <summary>\n            Returns the logical list of functions associated with this connection.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLite3_UTF16\">\n            <summary>\n            Alternate SQLite3 object, overriding many text behaviors to support UTF-16 (Unicode)\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3_UTF16.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.IntPtr,System.String,System.Boolean)\">\n            <summary>\n            Constructs the object used to interact with the SQLite core library\n            using the UTF-8 text encoding.\n            </summary>\n            <param name=\"fmt\">\n            The DateTime format to be used when converting string values to a\n            DateTime and binding DateTime parameters.\n            </param>\n            <param name=\"kind\">\n            The <see cref=\"T:System.DateTimeKind\"/> to be used when creating DateTime\n            values.\n            </param>\n            <param name=\"fmtString\">\n            The format string to be used when parsing and formatting DateTime\n            values.\n            </param>\n            <param name=\"db\">\n            The native handle to be associated with the database connection.\n            </param>\n            <param name=\"fileName\">\n            The fully qualified file name associated with <paramref name=\"db\"/>.\n            </param>\n            <param name=\"ownHandle\">\n            Non-zero if the newly created object instance will need to dispose\n            of <paramref name=\"db\"/> when it is no longer needed.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLite3_UTF16.ToString(System.IntPtr,System.Int32)\">\n            <summary>\n            Overrides SQLiteConvert.ToString() to marshal UTF-16 strings instead of UTF-8\n            </summary>\n            <param name=\"b\">A pointer to a UTF-16 string</param>\n            <param name=\"nbytelen\">The length (IN BYTES) of the string</param>\n            <returns>A .NET string</returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteBackup\">\n            <summary>\n            Represents a single SQL backup in SQLite.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteBackup._sql\">\n            <summary>\n            The underlying SQLite object this backup is bound to.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteBackup._sqlite_backup\">\n            <summary>\n            The actual backup handle.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteBackup._destDb\">\n            <summary>\n            The destination database for the backup.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteBackup._zDestName\">\n            <summary>\n            The destination database name for the backup.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteBackup._sourceDb\">\n            <summary>\n            The source database for the backup.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteBackup._zSourceName\">\n            <summary>\n            The source database name for the backup.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteBackup._stepResult\">\n            <summary>\n            The last result from the StepBackup method of the SQLite3 class.\n            This is used to determine if the call to the FinishBackup method of\n            the SQLite3 class should throw an exception when it receives a non-Ok\n            return code from the core SQLite library.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBackup.#ctor(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteBackupHandle,System.IntPtr,System.Byte[],System.IntPtr,System.Byte[])\">\n            <summary>\n            Initializes the backup.\n            </summary>\n            <param name=\"sqlbase\">The base SQLite object.</param>\n            <param name=\"backup\">The backup handle.</param>\n            <param name=\"destDb\">The destination database for the backup.</param>\n            <param name=\"zDestName\">The destination database name for the backup.</param>\n            <param name=\"sourceDb\">The source database for the backup.</param>\n            <param name=\"zSourceName\">The source database name for the backup.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBackup.Dispose\">\n            <summary>\n            Disposes and finalizes the backup.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.ISQLiteSchemaExtensions\">\n             <summary>\n            \n             </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteSchemaExtensions.BuildTempSchema(System.Data.SQLite.SQLiteConnection)\">\n            <summary>\n            Creates temporary tables on the connection so schema information can be queried.\n            </summary>\n            <param name=\"connection\">\n            The connection upon which to build the schema tables.\n            </param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteConnectionFlags\">\n            <summary>\n            The extra behavioral flags that can be applied to a connection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.None\">\n            <summary>\n            No extra flags.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.LogPrepare\">\n            <summary>\n            Enable logging of all SQL statements to be prepared.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.LogPreBind\">\n            <summary>\n            Enable logging of all bound parameter types and raw values.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.LogBind\">\n            <summary>\n            Enable logging of all bound parameter strongly typed values.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.LogCallbackException\">\n            <summary>\n            Enable logging of all exceptions caught from user-provided\n            managed code called from native code via delegates.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.LogBackup\">\n            <summary>\n            Enable logging of backup API errors.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.NoExtensionFunctions\">\n            <summary>\n            Skip adding the extension functions provided by the native\n            interop assembly.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.BindUInt32AsInt64\">\n            <summary>\n            When binding parameter values with the <see cref=\"T:System.UInt32\"/>\n            type, use the interop method that accepts an <see cref=\"T:System.Int64\"/>\n            value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.BindAllAsText\">\n            <summary>\n            When binding parameter values, always bind them as though they were\n            plain text (i.e. no numeric, date/time, or other conversions should\n            be attempted).\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.GetAllAsText\">\n            <summary>\n            When returning column values, always return them as though they were\n            plain text (i.e. no numeric, date/time, or other conversions should\n            be attempted).\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.NoLoadExtension\">\n            <summary>\n            Prevent this <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> object instance from\n            loading extensions.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.NoCreateModule\">\n            <summary>\n            Prevent this <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> object instance from\n            creating virtual table modules.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.NoBindFunctions\">\n            <summary>\n            Skip binding any functions provided by other managed assemblies when\n            opening the connection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.NoLogModule\">\n            <summary>\n            Skip setting the logging related properties of the\n            <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> object instance that was passed to\n            the <see cref=\"M:System.Data.SQLite.SQLiteConnection.CreateModule(System.Data.SQLite.SQLiteModule)\"/> method.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.LogModuleError\">\n            <summary>\n            Enable logging of all virtual table module errors seen by the\n            <see cref=\"M:System.Data.SQLite.SQLiteModule.SetTableError(System.IntPtr,System.String)\"/> method.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.LogModuleException\">\n            <summary>\n            Enable logging of certain virtual table module exceptions that cannot\n            be easily discovered via other means.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.TraceWarning\">\n            <summary>\n            Enable tracing of potentially important [non-fatal] error conditions\n            that cannot be easily reported through other means.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.ConvertInvariantText\">\n            <summary>\n            When binding parameter values, always use the invariant culture when\n            converting their values from strings.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.BindInvariantText\">\n            <summary>\n            When binding parameter values, always use the invariant culture when\n            converting their values to strings.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.NoConnectionPool\">\n            <summary>\n            Disable using the connection pool by default.  If the \"Pooling\"\n            connection string property is specified, its value will override\n            this flag.  The precise outcome of combining this flag with the\n            <see cref=\"F:System.Data.SQLite.SQLiteConnectionFlags.UseConnectionPool\"/> flag is unspecified; however,\n            one of the flags will be in effect.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.UseConnectionPool\">\n            <summary>\n            Enable using the connection pool by default.  If the \"Pooling\"\n            connection string property is specified, its value will override\n            this flag.  The precise outcome of combining this flag with the\n            <see cref=\"F:System.Data.SQLite.SQLiteConnectionFlags.NoConnectionPool\"/> flag is unspecified; however,\n            one of the flags will be in effect.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.UseConnectionTypes\">\n            <summary>\n            Enable using per-connection mappings between type names and\n            <see cref=\"T:System.Data.DbType\"/> values.  Also see the\n            <see cref=\"M:System.Data.SQLite.SQLiteConnection.ClearTypeMappings\"/>,\n            <see cref=\"M:System.Data.SQLite.SQLiteConnection.GetTypeMappings\"/>, and\n            <see cref=\"M:System.Data.SQLite.SQLiteConnection.AddTypeMapping(System.String,System.Data.DbType,System.Boolean)\"/> methods.  These\n            per-connection mappings, when present, override the corresponding\n            global mappings.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.NoGlobalTypes\">\n            <summary>\n            Disable using global mappings between type names and\n            <see cref=\"T:System.Data.DbType\"/> values.  This may be useful in some very narrow\n            cases; however, if there are no per-connection type mappings, the\n            fallback defaults will be used for both type names and their\n            associated <see cref=\"T:System.Data.DbType\"/> values.  Therefore, use of this flag\n            is not recommended.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.StickyHasRows\">\n            <summary>\n            When the <see cref=\"P:System.Data.SQLite.SQLiteDataReader.HasRows\"/> property is used, it\n            should return non-zero if there were ever any rows in the associated\n            result sets.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.StrictEnlistment\">\n            <summary>\n            Enable \"strict\" transaction enlistment semantics.  Setting this flag\n            will cause an exception to be thrown if an attempt is made to enlist\n            in a transaction with an unavailable or unsupported isolation level.\n            In the future, more extensive checks may be enabled by this flag as\n            well.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.MapIsolationLevels\">\n            <summary>\n            Enable mapping of unsupported transaction isolation levels to the\n            closest supported transaction isolation level.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.DetectTextAffinity\">\n            <summary>\n            When returning column values, attempt to detect the affinity of\n            textual values by checking if they fully conform to those of the\n            <see cref=\"F:System.Data.SQLite.TypeAffinity.Null\"/>,\n            <see cref=\"F:System.Data.SQLite.TypeAffinity.Int64\"/>,\n            <see cref=\"F:System.Data.SQLite.TypeAffinity.Double\"/>,\n            or <see cref=\"F:System.Data.SQLite.TypeAffinity.DateTime\"/> types.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.DetectStringType\">\n            <summary>\n            When returning column values, attempt to detect the type of\n            string values by checking if they fully conform to those of\n            the <see cref=\"F:System.Data.SQLite.TypeAffinity.Null\"/>,\n            <see cref=\"F:System.Data.SQLite.TypeAffinity.Int64\"/>,\n            <see cref=\"F:System.Data.SQLite.TypeAffinity.Double\"/>,\n            or <see cref=\"F:System.Data.SQLite.TypeAffinity.DateTime\"/> types.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.NoConvertSettings\">\n            <summary>\n            Skip querying runtime configuration settings for use by the\n            <see cref=\"T:System.Data.SQLite.SQLiteConvert\"/> class, including the default\n            <see cref=\"T:System.Data.DbType\"/> value and default database type name.\n            <b>NOTE: If the <see cref=\"P:System.Data.SQLite.SQLiteConnection.DefaultDbType\"/>\n            and/or <see cref=\"P:System.Data.SQLite.SQLiteConnection.DefaultTypeName\"/>\n            properties are not set explicitly nor set via their connection\n            string properties and repeated calls to determine these runtime\n            configuration settings are seen to be a problem, this flag\n            should be set.</b>\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.BindDateTimeWithKind\">\n            <summary>\n            When binding parameter values with the <see cref=\"T:System.DateTime\"/>\n            type, take their <see cref=\"T:System.DateTimeKind\"/> into account as\n            well as that of the associated <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/>.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.RollbackOnException\">\n            <summary>\n            If an exception is caught when raising the\n            <see cref=\"E:System.Data.SQLite.SQLiteConnection.Commit\"/> event, the transaction\n            should be rolled back.  If this is not specified, the transaction\n            will continue the commit process instead.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.DenyOnException\">\n            <summary>\n            If an exception is caught when raising the\n            <see cref=\"E:System.Data.SQLite.SQLiteConnection.Authorize\"/> event, the action should\n            should be denied.  If this is not specified, the action will be\n            allowed instead.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.InterruptOnException\">\n            <summary>\n            If an exception is caught when raising the\n            <see cref=\"E:System.Data.SQLite.SQLiteConnection.Progress\"/> event, the operation\n            should be interrupted.  If this is not specified, the operation\n            will simply continue.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.UnbindFunctionsOnClose\">\n            <summary>\n            Attempt to unbind all functions provided by other managed assemblies\n            when closing the connection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.NoVerifyTextAffinity\">\n            <summary>\n            When returning column values as a <see cref=\"T:System.String\"/>, skip\n            verifying their affinity.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.BindAndGetAllAsText\">\n            <summary>\n            When binding parameter values or returning column values, always\n            treat them as though they were plain text (i.e. no numeric,\n            date/time, or other conversions should be attempted).\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.ConvertAndBindInvariantText\">\n            <summary>\n            When binding parameter values, always use the invariant culture when\n            converting their values to strings or from strings.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.BindAndGetAllAsInvariantText\">\n            <summary>\n            When binding parameter values or returning column values, always\n            treat them as though they were plain text (i.e. no numeric,\n            date/time, or other conversions should be attempted) and always\n            use the invariant culture when converting their values to strings.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.ConvertAndBindAndGetAllAsInvariantText\">\n            <summary>\n            When binding parameter values or returning column values, always\n            treat them as though they were plain text (i.e. no numeric,\n            date/time, or other conversions should be attempted) and always\n            use the invariant culture when converting their values to strings\n            or from strings.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.LogAll\">\n            <summary>\n            Enable all logging.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.Default\">\n            <summary>\n            The default extra flags for new connections.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionFlags.DefaultAndLogAll\">\n            <summary>\n            The default extra flags for new connections with all logging enabled.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteCommand\">\n            <summary>\n            SQLite implementation of DbCommand.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteCommand.DefaultConnectionString\">\n            <summary>\n            The default connection string to be used when creating a temporary\n            connection to execute a command via the static\n            <see cref=\"M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.String,System.Object[])\"/> or\n            <see cref=\"M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.Data.CommandBehavior,System.String,System.Object[])\"/>\n            methods.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteCommand._commandText\">\n            <summary>\n            The command text this command is based on\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteCommand._cnn\">\n            <summary>\n            The connection the command is associated with\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteCommand._version\">\n            <summary>\n            The version of the connection the command is associated with\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteCommand._activeReader\">\n            <summary>\n            Indicates whether or not a DataReader is active on the command.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteCommand._commandTimeout\">\n            <summary>\n            The timeout for the command, kludged because SQLite doesn't support per-command timeout values\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteCommand._designTimeVisible\">\n            <summary>\n            Designer support\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteCommand._updateRowSource\">\n            <summary>\n            Used by DbDataAdapter to determine updating behavior\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteCommand._parameterCollection\">\n            <summary>\n            The collection of parameters for the command\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteCommand._statementList\">\n            <summary>\n            The SQL command text, broken into individual SQL statements as they are executed\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteCommand._remainingText\">\n            <summary>\n            Unprocessed SQL text that has not been executed\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteCommand._transaction\">\n            <summary>\n            Transaction associated with this command\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.#ctor\">\n            <overloads>\n             Constructs a new SQLiteCommand\n             </overloads>\n             <summary>\n             Default constructor\n             </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.#ctor(System.String)\">\n            <summary>\n            Initializes the command with the given command text\n            </summary>\n            <param name=\"commandText\">The SQL command text</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.#ctor(System.String,System.Data.SQLite.SQLiteConnection)\">\n            <summary>\n            Initializes the command with the given SQL command text and attach the command to the specified\n            connection.\n            </summary>\n            <param name=\"commandText\">The SQL command text</param>\n            <param name=\"connection\">The connection to associate with the command</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.#ctor(System.Data.SQLite.SQLiteConnection)\">\n            <summary>\n            Initializes the command and associates it with the specified connection.\n            </summary>\n            <param name=\"connection\">The connection to associate with the command</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.#ctor(System.String,System.Data.SQLite.SQLiteConnection,System.Data.SQLite.SQLiteTransaction)\">\n            <summary>\n            Initializes a command with the given SQL, connection and transaction\n            </summary>\n            <param name=\"commandText\">The SQL command text</param>\n            <param name=\"connection\">The connection to associate with the command</param>\n            <param name=\"transaction\">The transaction the command should be associated with</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.Dispose(System.Boolean)\">\n            <summary>\n            Disposes of the command and clears all member variables\n            </summary>\n            <param name=\"disposing\">Whether or not the class is being explicitly or implicitly disposed</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.GetFlags(System.Data.SQLite.SQLiteCommand)\">\n            <summary>\n            This method attempts to query the flags associated with the database\n            connection in use.  If the database connection is disposed, the default\n            flags will be returned.\n            </summary>\n            <param name=\"command\">\n            The command containing the databse connection to query the flags from.\n            </param>\n            <returns>\n            The connection flags value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.ClearCommands\">\n            <summary>\n            Clears and destroys all statements currently prepared\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.BuildNextCommand\">\n            <summary>\n            Builds an array of prepared statements for each complete SQL statement in the command text\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.Cancel\">\n            <summary>\n            Not implemented\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.CreateDbParameter\">\n            <summary>\n            Forwards to the local CreateParameter() function\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.CreateParameter\">\n            <summary>\n            Create a new parameter\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.InitializeForReader\">\n            <summary>\n            This function ensures there are no active readers, that we have a valid connection,\n            that the connection is open, that all statements are prepared and all parameters are assigned\n            in preparation for allocating a data reader.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.ExecuteDbDataReader(System.Data.CommandBehavior)\">\n            <summary>\n            Creates a new SQLiteDataReader to execute/iterate the array of SQLite prepared statements\n            </summary>\n            <param name=\"behavior\">The behavior the data reader should adopt</param>\n            <returns>Returns a SQLiteDataReader object</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.String,System.Object[])\">\n            <summary>\n            This method creates a new connection, executes the query using the given\n            execution type, closes the connection, and returns the results.  If the\n            connection string is null, a temporary in-memory database connection will\n            be used.\n            </summary>\n            <param name=\"commandText\">\n            The text of the command to be executed.\n            </param>\n            <param name=\"executeType\">\n            The execution type for the command.  This is used to determine which method\n            of the command object to call, which then determines the type of results\n            returned, if any.\n            </param>\n            <param name=\"connectionString\">\n            The connection string to the database to be opened, used, and closed.  If\n            this parameter is null, a temporary in-memory databse will be used.\n            </param>\n            <param name=\"args\">\n            The SQL parameter values to be used when building the command object to be\n            executed, if any.\n            </param>\n            <returns>\n            The results of the query -OR- null if no results were produced from the\n            given execution type.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.Data.CommandBehavior,System.String,System.Object[])\">\n            <summary>\n            This method creates a new connection, executes the query using the given\n            execution type and command behavior, closes the connection unless a data\n            reader is created, and returns the results.  If the connection string is\n            null, a temporary in-memory database connection will be used.\n            </summary>\n            <param name=\"commandText\">\n            The text of the command to be executed.\n            </param>\n            <param name=\"executeType\">\n            The execution type for the command.  This is used to determine which method\n            of the command object to call, which then determines the type of results\n            returned, if any.\n            </param>\n            <param name=\"commandBehavior\">\n            The command behavior flags for the command.\n            </param>\n            <param name=\"connectionString\">\n            The connection string to the database to be opened, used, and closed.  If\n            this parameter is null, a temporary in-memory databse will be used.\n            </param>\n            <param name=\"args\">\n            The SQL parameter values to be used when building the command object to be\n            executed, if any.\n            </param>\n            <returns>\n            The results of the query -OR- null if no results were produced from the\n            given execution type.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.ExecuteReader(System.Data.CommandBehavior)\">\n            <summary>\n            Overrides the default behavior to return a SQLiteDataReader specialization class\n            </summary>\n            <param name=\"behavior\">The flags to be associated with the reader.</param>\n            <returns>A SQLiteDataReader</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.ExecuteReader\">\n            <summary>\n            Overrides the default behavior of DbDataReader to return a specialized SQLiteDataReader class\n            </summary>\n            <returns>A SQLiteDataReader</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.ResetDataReader\">\n            <summary>\n            Called by the SQLiteDataReader when the data reader is closed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery\">\n            <summary>\n            Execute the command and return the number of rows inserted/updated affected by it.\n            </summary>\n            <returns>The number of rows inserted/updated affected by it.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(System.Data.CommandBehavior)\">\n            <summary>\n            Execute the command and return the number of rows inserted/updated affected by it.\n            </summary>\n            <param name=\"behavior\">The flags to be associated with the reader.</param>\n            <returns>The number of rows inserted/updated affected by it.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.ExecuteScalar\">\n            <summary>\n            Execute the command and return the first column of the first row of the resultset\n            (if present), or null if no resultset was returned.\n            </summary>\n            <returns>The first column of the first row of the first resultset from the query.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.ExecuteScalar(System.Data.CommandBehavior)\">\n            <summary>\n            Execute the command and return the first column of the first row of the resultset\n            (if present), or null if no resultset was returned.\n            </summary>\n            <param name=\"behavior\">The flags to be associated with the reader.</param>\n            <returns>The first column of the first row of the first resultset from the query.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.Reset\">\n            <summary>\n            This method resets all the prepared statements held by this instance\n            back to their initial states, ready to be re-executed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.Reset(System.Boolean,System.Boolean)\">\n            <summary>\n            This method resets all the prepared statements held by this instance\n            back to their initial states, ready to be re-executed.\n            </summary>\n            <param name=\"clearBindings\">\n            Non-zero if the parameter bindings should be cleared as well.\n            </param>\n            <param name=\"ignoreErrors\">\n            If this is zero, a <see cref=\"T:System.Data.SQLite.SQLiteException\"/> may be thrown for\n            any unsuccessful return codes from the native library; otherwise, a\n            <see cref=\"T:System.Data.SQLite.SQLiteException\"/> will only be thrown if the connection\n            or its state is invalid.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.Prepare\">\n            <summary>\n            Does nothing.  Commands are prepared as they are executed the first time, and kept in prepared state afterwards.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommand.Clone\">\n            <summary>\n            Clones a command, including all its parameters\n            </summary>\n            <returns>A new SQLiteCommand with the same commandtext, connection and parameters</returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommand.CommandText\">\n            <summary>\n            The SQL command text associated with the command\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommand.CommandTimeout\">\n            <summary>\n            The amount of time to wait for the connection to become available before erroring out\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommand.CommandType\">\n            <summary>\n            The type of the command.  SQLite only supports CommandType.Text\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommand.Connection\">\n            <summary>\n            The connection associated with this command\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommand.DbConnection\">\n            <summary>\n            Forwards to the local Connection property\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommand.Parameters\">\n            <summary>\n            Returns the SQLiteParameterCollection for the given command\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommand.DbParameterCollection\">\n            <summary>\n            Forwards to the local Parameters property\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommand.Transaction\">\n            <summary>\n            The transaction associated with this command.  SQLite only supports one transaction per connection, so this property forwards to the\n            command's underlying connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommand.DbTransaction\">\n            <summary>\n            Forwards to the local Transaction property\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommand.UpdatedRowSource\">\n            <summary>\n            Sets the method the SQLiteCommandBuilder uses to determine how to update inserted or updated rows in a DataTable.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommand.DesignTimeVisible\">\n            <summary>\n            Determines if the command is visible at design time.  Defaults to True.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteCommandBuilder\">\n            <summary>\n            SQLite implementation of DbCommandBuilder.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.#ctor\">\n            <summary>\n            Default constructor\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.#ctor(System.Data.SQLite.SQLiteDataAdapter)\">\n            <summary>\n            Initializes the command builder and associates it with the specified data adapter.\n            </summary>\n            <param name=\"adp\"></param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.Dispose(System.Boolean)\">\n            <summary>\n            Cleans up resources (native and managed) associated with the current instance.\n            </summary>\n            <param name=\"disposing\">\n            Zero when being disposed via garbage collection; otherwise, non-zero.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.ApplyParameterInfo(System.Data.Common.DbParameter,System.Data.DataRow,System.Data.StatementType,System.Boolean)\">\n            <summary>\n            Minimal amount of parameter processing.  Primarily sets the DbType for the parameter equal to the provider type in the schema\n            </summary>\n            <param name=\"parameter\">The parameter to use in applying custom behaviors to a row</param>\n            <param name=\"row\">The row to apply the parameter to</param>\n            <param name=\"statementType\">The type of statement</param>\n            <param name=\"whereClause\">Whether the application of the parameter is part of a WHERE clause</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterName(System.String)\">\n            <summary>\n            Returns a valid named parameter\n            </summary>\n            <param name=\"parameterName\">The name of the parameter</param>\n            <returns>Error</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterName(System.Int32)\">\n            <summary>\n            Returns a named parameter for the given ordinal\n            </summary>\n            <param name=\"parameterOrdinal\">The i of the parameter</param>\n            <returns>Error</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterPlaceholder(System.Int32)\">\n            <summary>\n            Returns a placeholder character for the specified parameter i.\n            </summary>\n            <param name=\"parameterOrdinal\">The index of the parameter to provide a placeholder for</param>\n            <returns>Returns a named parameter</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.SetRowUpdatingHandler(System.Data.Common.DbDataAdapter)\">\n            <summary>\n            Sets the handler for receiving row updating events.  Used by the DbCommandBuilder to autogenerate SQL\n            statements that may not have previously been generated.\n            </summary>\n            <param name=\"adapter\">A data adapter to receive events on.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.GetDeleteCommand\">\n            <summary>\n            Returns the automatically-generated SQLite command to delete rows from the database\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.GetDeleteCommand(System.Boolean)\">\n            <summary>\n            Returns the automatically-generated SQLite command to delete rows from the database\n            </summary>\n            <param name=\"useColumnsForParameterNames\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.GetUpdateCommand\">\n            <summary>\n            Returns the automatically-generated SQLite command to update rows in the database\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.GetUpdateCommand(System.Boolean)\">\n            <summary>\n            Returns the automatically-generated SQLite command to update rows in the database\n            </summary>\n            <param name=\"useColumnsForParameterNames\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.GetInsertCommand\">\n            <summary>\n            Returns the automatically-generated SQLite command to insert rows into the database\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.GetInsertCommand(System.Boolean)\">\n            <summary>\n            Returns the automatically-generated SQLite command to insert rows into the database\n            </summary>\n            <param name=\"useColumnsForParameterNames\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.QuoteIdentifier(System.String)\">\n            <summary>\n            Places brackets around an identifier\n            </summary>\n            <param name=\"unquotedIdentifier\">The identifier to quote</param>\n            <returns>The bracketed identifier</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.UnquoteIdentifier(System.String)\">\n            <summary>\n            Removes brackets around an identifier\n            </summary>\n            <param name=\"quotedIdentifier\">The quoted (bracketed) identifier</param>\n            <returns>The undecorated identifier</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteCommandBuilder.GetSchemaTable(System.Data.Common.DbCommand)\">\n            <summary>\n            Override helper, which can help the base command builder choose the right keys for the given query\n            </summary>\n            <param name=\"sourceCommand\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommandBuilder.DataAdapter\">\n            <summary>\n            Gets/sets the DataAdapter for this CommandBuilder\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommandBuilder.CatalogLocation\">\n            <summary>\n            Overridden to hide its property from the designer\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommandBuilder.CatalogSeparator\">\n            <summary>\n            Overridden to hide its property from the designer\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommandBuilder.QuotePrefix\">\n            <summary>\n            Overridden to hide its property from the designer\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommandBuilder.QuoteSuffix\">\n            <summary>\n            Overridden to hide its property from the designer\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteCommandBuilder.SchemaSeparator\">\n            <summary>\n            Overridden to hide its property from the designer\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.ConnectionEventArgs\">\n            <summary>\n            Event data for connection event handlers.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.ConnectionEventArgs.EventType\">\n            <summary>\n            The type of event being raised.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.ConnectionEventArgs.EventArgs\">\n            <summary>\n            The <see cref=\"T:System.Data.StateChangeEventArgs\"/> associated with this event, if any.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.ConnectionEventArgs.Transaction\">\n            <summary>\n            The transaction associated with this event, if any.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.ConnectionEventArgs.Command\">\n            <summary>\n            The command associated with this event, if any.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.ConnectionEventArgs.DataReader\">\n            <summary>\n            The data reader associated with this event, if any.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.ConnectionEventArgs.CriticalHandle\">\n            <summary>\n            The critical handle associated with this event, if any.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.ConnectionEventArgs.Text\">\n            <summary>\n            Command or message text associated with this event, if any.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.ConnectionEventArgs.Data\">\n            <summary>\n            Extra data associated with this event, if any.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.ConnectionEventArgs.#ctor(System.Data.SQLite.SQLiteConnectionEventType,System.Data.StateChangeEventArgs,System.Data.IDbTransaction,System.Data.IDbCommand,System.Data.IDataReader,System.Runtime.InteropServices.CriticalHandle,System.String,System.Object)\">\n            <summary>\n            Constructs the object.\n            </summary>\n            <param name=\"eventType\">The type of event being raised.</param>\n            <param name=\"eventArgs\">The base <see cref=\"F:System.Data.SQLite.ConnectionEventArgs.EventArgs\"/> associated\n            with this event, if any.</param>\n            <param name=\"transaction\">The transaction associated with this event, if any.</param>\n            <param name=\"command\">The command associated with this event, if any.</param>\n            <param name=\"dataReader\">The data reader associated with this event, if any.</param>\n            <param name=\"criticalHandle\">The critical handle associated with this event, if any.</param>\n            <param name=\"text\">The command or message text, if any.</param>\n            <param name=\"data\">The extra data, if any.</param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteConnectionEventHandler\">\n            <summary>\n            Raised when an event pertaining to a connection occurs.\n            </summary>\n            <param name=\"sender\">The connection involved.</param>\n            <param name=\"e\">Extra information about the event.</param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteConnection\">\n            <summary>\n            SQLite implentation of DbConnection.\n            </summary>\n            <remarks>\n            The <see cref=\"P:System.Data.SQLite.SQLiteConnection.ConnectionString\"/> property can contain the following parameter(s), delimited with a semi-colon:\n            <list type=\"table\">\n            <listheader>\n            <term>Parameter</term>\n            <term>Values</term>\n            <term>Required</term>\n            <term>Default</term>\n            </listheader>\n            <item>\n            <description>Data Source</description>\n            <description>\n            This may be a file name, the string \":memory:\", or any supported URI (starting with SQLite 3.7.7).\n            Starting with release 1.0.86.0, in order to use more than one consecutive backslash (e.g. for a\n            UNC path), each of the adjoining backslash characters must be doubled (e.g. \"\\\\Network\\Share\\test.db\"\n            would become \"\\\\\\\\Network\\Share\\test.db\").\n            </description>\n            <description>Y</description>\n            <description></description>\n            </item>\n            <item>\n            <description>Uri</description>\n            <description>\n            If specified, this must be a file name that starts with \"file://\", \"file:\", or \"/\".  Any leading\n            \"file://\" or \"file:\" prefix will be stripped off and the resulting file name will be used to open\n            the database.\n            </description>\n            <description>N</description>\n            <description>null</description>\n            </item>\n            <item>\n            <description>FullUri</description>\n            <description>\n            If specified, this must be a URI in a format recognized by the SQLite core library (starting with\n            SQLite 3.7.7).  It will be passed verbatim to the SQLite core library.\n            </description>\n            <description>N</description>\n            <description>null</description>\n            </item>\n            <item>\n            <description>Version</description>\n            <description>3</description>\n            <description>N</description>\n            <description>3</description>\n            </item>\n            <item>\n            <description>UseUTF16Encoding</description>\n            <description>\n            <b>True</b> - The UTF-16 encoding should be used.\n            <br/>\n            <b>False</b> - The UTF-8 encoding should be used.\n            </description>\n            <description>N</description>\n            <description>False</description>\n            </item>\n            <item>\n            <description>DefaultDbType</description>\n            <description>\n            This is the default <see cref=\"T:System.Data.DbType\"/> to use when one cannot be determined based on the\n            column metadata and the configured type mappings.\n            </description>\n            <description>N</description>\n            <description>null</description>\n            </item>\n            <item>\n            <description>DefaultTypeName</description>\n            <description>\n            This is the default type name to use when one cannot be determined based on the column metadata\n            and the configured type mappings.\n            </description>\n            <description>N</description>\n            <description>null</description>\n            </item>\n            <item>\n            <description>NoDefaultFlags</description>\n            <description>\n            <b>True</b> - Do not combine the specified (or existing) connection flags with the value of the\n            <see cref=\"P:System.Data.SQLite.SQLiteConnection.DefaultFlags\"/> property.\n            <br/>\n            <b>False</b> - Combine the specified (or existing) connection flags with the value of the\n            <see cref=\"P:System.Data.SQLite.SQLiteConnection.DefaultFlags\"/> property.\n            </description>\n            <description>N</description>\n            <description>False</description>\n            </item>\n            <item>\n            <description>NoSharedFlags</description>\n            <description>\n            <b>True</b> - Do not combine the specified (or existing) connection flags with the value of the\n            <see cref=\"P:System.Data.SQLite.SQLiteConnection.SharedFlags\"/> property.\n            <br/>\n            <b>False</b> - Combine the specified (or existing) connection flags with the value of the\n            <see cref=\"P:System.Data.SQLite.SQLiteConnection.SharedFlags\"/> property.\n            </description>\n            <description>N</description>\n            <description>False</description>\n            </item>\n            <item>\n            <description>VfsName</description>\n            <description>\n            The name of the VFS to use when opening the database connection.\n            If this is not specified, the default VFS will be used.\n            </description>\n            <description>N</description>\n            <description>null</description>\n            </item>\n            <item>\n            <description>ZipVfsVersion</description>\n            <description>\n            If non-null, this is the \"version\" of ZipVFS to use.  This requires\n            the System.Data.SQLite interop assembly -AND- primary managed assembly\n            to be compiled with the INTEROP_INCLUDE_ZIPVFS option; otherwise, this\n            property does nothing.  The valid values are \"v2\" and \"v3\".  Using\n            anyother value will cause an exception to be thrown.  Please see the\n            ZipVFS documentation for more information on how to use this parameter.\n            </description>\n            <description>N</description>\n            <description>null</description>\n            </item>\n            <item>\n            <description>DateTimeFormat</description>\n            <description>\n            <b>Ticks</b> - Use the value of DateTime.Ticks.<br/>\n            <b>ISO8601</b> - Use the ISO-8601 format.  Uses the \"yyyy-MM-dd HH:mm:ss.FFFFFFFK\" format for UTC\n            DateTime values and \"yyyy-MM-dd HH:mm:ss.FFFFFFF\" format for local DateTime values).<br/>\n            <b>JulianDay</b> - The interval of time in days and fractions of a day since January 1, 4713 BC.<br/>\n            <b>UnixEpoch</b> - The whole number of seconds since the Unix epoch (January 1, 1970).<br/>\n            <b>InvariantCulture</b> - Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.<br/>\n            <b>CurrentCulture</b> - Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.</description>\n            <description>N</description>\n            <description>ISO8601</description>\n            </item>\n            <item>\n            <description>DateTimeKind</description>\n            <description>\n            <b>Unspecified</b> - Not specified as either UTC or local time.\n            <br/>\n            <b>Utc</b> - The time represented is UTC.\n            <br/>\n            <b>Local</b> - The time represented is local time.\n            </description>\n            <description>N</description>\n            <description>Unspecified</description>\n            </item>\n            <item>\n            <description>DateTimeFormatString</description>\n            <description>\n            The exact DateTime format string to use for all formatting and parsing of all DateTime\n            values for this connection.\n            </description>\n            <description>N</description>\n            <description>null</description>\n            </item>\n            <item>\n            <description>BaseSchemaName</description>\n            <description>\n            Some base data classes in the framework (e.g. those that build SQL queries dynamically)\n            assume that an ADO.NET provider cannot support an alternate catalog (i.e. database) without supporting\n            alternate schemas as well; however, SQLite does not fit into this model.  Therefore, this value is used\n            as a placeholder and removed prior to preparing any SQL statements that may contain it.\n            </description>\n            <description>N</description>\n            <description>sqlite_default_schema</description>\n            </item>\n            <item>\n            <description>BinaryGUID</description>\n            <description>\n            <b>True</b> - Store GUID columns in binary form\n            <br/>\n            <b>False</b> - Store GUID columns as text\n            </description>\n            <description>N</description>\n            <description>True</description>\n            </item>\n            <item>\n            <description>Cache Size</description>\n            <description>\n            If the argument N is positive then the suggested cache size is set to N.\n            If the argument N is negative, then the number of cache pages is adjusted\n            to use approximately abs(N*4096) bytes of memory. Backwards compatibility\n            note: The behavior of cache_size with a negative N was different in SQLite\n            versions prior to 3.7.10. In version 3.7.9 and earlier, the number of\n            pages in the cache was set to the absolute value of N.\n            </description>\n            <description>N</description>\n            <description>-2000</description>\n            </item>\n            <item>\n            <description>Synchronous</description>\n            <description>\n            <b>Normal</b> - Normal file flushing behavior\n            <br/>\n            <b>Full</b> - Full flushing after all writes\n            <br/>\n            <b>Off</b> - Underlying OS flushes I/O's\n            </description>\n            <description>N</description>\n            <description>Full</description>\n            </item>\n            <item>\n            <description>Page Size</description>\n            <description>{size in bytes}</description>\n            <description>N</description>\n            <description>4096</description>\n            </item>\n            <item>\n            <description>Password</description>\n            <description>\n            {password} - Using this parameter requires that the CryptoAPI based codec\n            be enabled at compile-time for both the native interop assembly and the\n            core managed assemblies; otherwise, using this parameter may result in an\n            exception being thrown when attempting to open the connection.\n            </description>\n            <description>N</description>\n            <description></description>\n            </item>\n            <item>\n            <description>HexPassword</description>\n            <description>\n            {hexPassword} - Must contain a sequence of zero or more hexadecimal encoded\n            byte values without a leading \"0x\" prefix.  Using this parameter requires\n            that the CryptoAPI based codec be enabled at compile-time for both the native\n            interop assembly and the core managed assemblies; otherwise, using this\n            parameter may result in an exception being thrown when attempting to open\n            the connection.\n            </description>\n            <description>N</description>\n            <description></description>\n            </item>\n            <item>\n            <description>Enlist</description>\n            <description>\n            <b>Y</b> - Automatically enlist in distributed transactions\n            <br/>\n            <b>N</b> - No automatic enlistment\n            </description>\n            <description>N</description>\n            <description>Y</description>\n            </item>\n            <item>\n            <description>Pooling</description>\n            <description>\n            <b>True</b> - Use connection pooling.<br/>\n            <b>False</b> - Do not use connection pooling.<br/><br/>\n            <b>WARNING:</b> When using the default connection pool implementation,\n            setting this property to True should be avoided by applications that make\n            use of COM (either directly or indirectly) due to possible deadlocks that\n            can occur during the finalization of some COM objects.\n            </description>\n            <description>N</description>\n            <description>False</description>\n            </item>\n            <item>\n            <description>FailIfMissing</description>\n            <description>\n            <b>True</b> - Don't create the database if it does not exist, throw an error instead\n            <br/>\n            <b>False</b> - Automatically create the database if it does not exist\n            </description>\n            <description>N</description>\n            <description>False</description>\n            </item>\n            <item>\n            <description>Max Page Count</description>\n            <description>{size in pages} - Limits the maximum number of pages (limits the size) of the database</description>\n            <description>N</description>\n            <description>0</description>\n            </item>\n            <item>\n            <description>Legacy Format</description>\n            <description>\n            <b>True</b> - Use the more compatible legacy 3.x database format\n            <br/>\n            <b>False</b> - Use the newer 3.3x database format which compresses numbers more effectively\n            </description>\n            <description>N</description>\n            <description>False</description>\n            </item>\n            <item>\n            <description>Default Timeout</description>\n            <description>{time in seconds}<br/>The default command timeout</description>\n            <description>N</description>\n            <description>30</description>\n            </item>\n            <item>\n            <description>BusyTimeout</description>\n            <description>{time in milliseconds}<br/>Sets the busy timeout for the core library.</description>\n            <description>N</description>\n            <description>0</description>\n            </item>\n            <item>\n            <description>Journal Mode</description>\n            <description>\n            <b>Delete</b> - Delete the journal file after a commit.\n            <br/>\n            <b>Persist</b> - Zero out and leave the journal file on disk after a\n            commit.\n            <br/>\n            <b>Off</b> - Disable the rollback journal entirely.  This saves disk I/O\n            but at the expense of database safety and integrity.  If the application\n            using SQLite crashes in the middle of a transaction when this journaling\n            mode is set, then the database file will very likely go corrupt.\n            <br/>\n            <b>Truncate</b> - Truncate the journal file to zero-length instead of\n            deleting it.\n            <br/>\n            <b>Memory</b> - Store the journal in volatile RAM.  This saves disk I/O\n            but at the expense of database safety and integrity.  If the application\n            using SQLite crashes in the middle of a transaction when this journaling\n            mode is set, then the database file will very likely go corrupt.\n            <br/>\n            <b>Wal</b> - Use a write-ahead log instead of a rollback journal.\n            </description>\n            <description>N</description>\n            <description>Delete</description>\n            </item>\n            <item>\n            <description>Read Only</description>\n            <description>\n            <b>True</b> - Open the database for read only access\n            <br/>\n            <b>False</b> - Open the database for normal read/write access\n            </description>\n            <description>N</description>\n            <description>False</description>\n            </item>\n            <item>\n            <description>Max Pool Size</description>\n            <description>The maximum number of connections for the given connection string that can be in the connection pool</description>\n            <description>N</description>\n            <description>100</description>\n            </item>\n            <item>\n            <description>Default IsolationLevel</description>\n            <description>The default transaciton isolation level</description>\n            <description>N</description>\n            <description>Serializable</description>\n            </item>\n            <item>\n            <description>Foreign Keys</description>\n            <description>Enable foreign key constraints</description>\n            <description>N</description>\n            <description>False</description>\n            </item>\n            <item>\n            <description>Flags</description>\n            <description>Extra behavioral flags for the connection.  See the <see cref=\"T:System.Data.SQLite.SQLiteConnectionFlags\"/> enumeration for possible values.</description>\n            <description>N</description>\n            <description>Default</description>\n            </item>\n            <item>\n            <description>SetDefaults</description>\n            <description>\n            <b>True</b> - Apply the default connection settings to the opened database.<br/>\n            <b>False</b> - Skip applying the default connection settings to the opened database.\n            </description>\n            <description>N</description>\n            <description>True</description>\n            </item>\n            <item>\n            <description>ToFullPath</description>\n            <description>\n            <b>True</b> - Attempt to expand the data source file name to a fully qualified path before opening.\n            <br/>\n            <b>False</b> - Skip attempting to expand the data source file name to a fully qualified path before opening.\n            </description>\n            <description>N</description>\n            <description>True</description>\n            </item>\n            <item>\n            <description>PrepareRetries</description>\n            <description>\n            The maximum number of retries when preparing SQL to be executed.  This\n            normally only applies to preparation errors resulting from the database\n            schema being changed.\n            </description>\n            <description>N</description>\n            <description>3</description>\n            </item>\n            <item>\n            <description>ProgressOps</description>\n            <description>\n            The approximate number of virtual machine instructions between progress\n            events.  In order for progress events to actually fire, the event handler\n            must be added to the <see cref=\"E:System.Data.SQLite.SQLiteConnection.Progress\"/> event as well.\n            </description>\n            <description>N</description>\n            <description>0</description>\n            </item>\n            <item>\n            <description>Recursive Triggers</description>\n            <description>\n            <b>True</b> - Enable the recursive trigger capability.\n            <b>False</b> - Disable the recursive trigger capability.\n            </description>\n            <description>N</description>\n            <description>False</description>\n            </item>\n            </list>\n            </remarks>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection.BadDbType\">\n            <summary>\n            The \"invalid value\" for the <see cref=\"T:System.Data.DbType\"/> enumeration used\n            by the <see cref=\"P:System.Data.SQLite.SQLiteConnection.DefaultDbType\"/> property.  This constant is shared\n            by this class and the SQLiteConnectionStringBuilder class.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection.DefaultBaseSchemaName\">\n            <summary>\n            The default \"stub\" (i.e. placeholder) base schema name to use when\n            returning column schema information.  Used as the initial value of\n            the BaseSchemaName property.  This should start with \"sqlite_*\"\n            because those names are reserved for use by SQLite (i.e. they cannot\n            be confused with the names of user objects).\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._assembly\">\n            <summary>\n            The managed assembly containing this type.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._syncRoot\">\n            <summary>\n            Object used to synchronize access to the static instance data\n            for this class.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._sharedFlags\">\n            <summary>\n            The extra connection flags to be used for all opened connections.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._connectionState\">\n            <summary>\n            State of the current connection\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._connectionString\">\n            <summary>\n            The connection string\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._transactionLevel\">\n            <summary>\n            Nesting level of the transactions open on the connection\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._noDispose\">\n            <summary>\n            If this flag is non-zero, the <see cref=\"M:System.Data.SQLite.SQLiteConnection.Dispose\"/> method will have\n            no effect; however, the <see cref=\"M:System.Data.SQLite.SQLiteConnection.Close\"/> method will continue to\n            behave as normal.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._disposing\">\n            <summary>\n            If set, then the connection is currently being disposed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._defaultIsolation\">\n            <summary>\n            The default isolation level for new transactions\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._enlistment\">\n            <summary>\n            Whether or not the connection is enlisted in a distrubuted transaction\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._typeNames\">\n            <summary>\n            The per-connection mappings between type names and <see cref=\"T:System.Data.DbType\"/>\n            values.  These mappings override the corresponding global mappings.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._sql\">\n            <summary>\n            The base SQLite object to interop with\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._dataSource\">\n            <summary>\n            The database filename minus path and extension\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._password\">\n            <summary>\n            Temporary password storage, emptied after the database has been opened\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._baseSchemaName\">\n            <summary>\n            The \"stub\" (i.e. placeholder) base schema name to use when returning\n            column schema information.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._flags\">\n            <summary>\n            The extra behavioral flags for this connection, if any.  See the\n            <see cref=\"T:System.Data.SQLite.SQLiteConnectionFlags\"/> enumeration for a list of\n            possible values.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._cachedSettings\">\n            <summary>\n            The cached values for all settings that have been fetched on behalf\n            of this connection.  This cache may be cleared by calling the\n            <see cref=\"M:System.Data.SQLite.SQLiteConnection.ClearCachedSettings\"/> method.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._defaultDbType\">\n            <summary>\n            The default databse type for this connection.  This value will only\n            be used if the <see cref=\"F:System.Data.SQLite.SQLiteConnectionFlags.UseConnectionTypes\"/>\n            flag is set.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._defaultTypeName\">\n            <summary>\n            The default databse type name for this connection.  This value will only\n            be used if the <see cref=\"F:System.Data.SQLite.SQLiteConnectionFlags.UseConnectionTypes\"/>\n            flag is set.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._vfsName\">\n            <summary>\n            The name of the VFS to be used when opening the database connection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._defaultTimeout\">\n            <summary>\n            Default command timeout\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._busyTimeout\">\n            <summary>\n            The default busy timeout to use with the SQLite core library.  This is\n            only used when opening a connection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._prepareRetries\">\n            <summary>\n            The maximum number of retries when preparing SQL to be executed.  This\n            normally only applies to preparation errors resulting from the database\n            schema being changed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._progressOps\">\n            <summary>\n            The approximate number of virtual machine instructions between progress\n            events.  In order for progress events to actually fire, the event handler\n            must be added to the <see cref=\"E:System.Data.SQLite.SQLiteConnection.Progress\"/> event as\n            well.  This value will only be used when opening the database.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnection._parseViaFramework\">\n            <summary>\n            Non-zero if the built-in (i.e. framework provided) connection string\n            parser should be used when opening the connection.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.#ctor\">\n            <overloads>\n             Constructs a new SQLiteConnection object\n             </overloads>\n             <summary>\n             Default constructor\n             </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.#ctor(System.String)\">\n            <summary>\n            Initializes the connection with the specified connection string.\n            </summary>\n            <param name=\"connectionString\">The connection string to use.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.#ctor(System.IntPtr,System.String,System.Boolean)\">\n            <summary>\n            Initializes the connection with a pre-existing native connection handle.\n            This constructor overload is intended to be used only by the private\n            <see cref=\"M:System.Data.SQLite.SQLiteModule.CreateOrConnect(System.Boolean,System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"db\">\n            The native connection handle to use.\n            </param>\n            <param name=\"fileName\">\n            The file name corresponding to the native connection handle.\n            </param>\n            <param name=\"ownHandle\">\n            Non-zero if this instance owns the native connection handle and\n            should dispose of it when it is no longer needed.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.#ctor(System.String,System.Boolean)\">\n            <summary>\n            Initializes the connection with the specified connection string.\n            </summary>\n            <param name=\"connectionString\">\n            The connection string to use.\n            </param>\n            <param name=\"parseViaFramework\">\n            Non-zero to parse the connection string using the built-in (i.e.\n            framework provided) parser when opening the connection.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.#ctor(System.Data.SQLite.SQLiteConnection)\">\n            <summary>\n            Clones the settings and connection string from an existing connection.  If the existing connection is already open, this\n            function will open its own connection, enumerate any attached databases of the original connection, and automatically\n            attach to them.\n            </summary>\n            <param name=\"connection\">The connection to copy the settings from.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.OnChanged(System.Data.SQLite.SQLiteConnection,System.Data.SQLite.ConnectionEventArgs)\">\n            <summary>\n            Raises the <see cref=\"E:System.Data.SQLite.SQLiteConnection.Changed\"/> event.\n            </summary>\n            <param name=\"connection\">\n            The connection associated with this event.  If this parameter is not\n            null and the specified connection cannot raise events, then the\n            registered event handlers will not be invoked.\n            </param>\n            <param name=\"e\">\n            A <see cref=\"T:System.Data.SQLite.ConnectionEventArgs\"/> that contains the event data.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.CreateHandle(System.IntPtr)\">\n            <summary>\n            Creates and returns a new managed database connection handle.  This\n            method is intended to be used by implementations of the\n            <see cref=\"T:System.Data.SQLite.ISQLiteConnectionPool\"/> interface only.  In theory, it\n            could be used by other classes; however, that usage is not supported.\n            </summary>\n            <param name=\"nativeHandle\">\n            This must be a native database connection handle returned by the\n            SQLite core library and it must remain valid and open during the\n            entire duration of the calling method.\n            </param>\n            <returns>\n            The new managed database connection handle or null if it cannot be\n            created.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.BackupDatabase(System.Data.SQLite.SQLiteConnection,System.String,System.String,System.Int32,System.Data.SQLite.SQLiteBackupCallback,System.Int32)\">\n            <summary>\n            Backs up the database, using the specified database connection as the\n            destination.\n            </summary>\n            <param name=\"destination\">The destination database connection.</param>\n            <param name=\"destinationName\">The destination database name.</param>\n            <param name=\"sourceName\">The source database name.</param>\n            <param name=\"pages\">\n            The number of pages to copy or negative to copy all remaining pages.\n            </param>\n            <param name=\"callback\">\n            The method to invoke between each step of the backup process.  This\n            parameter may be null (i.e. no callbacks will be performed).\n            </param>\n            <param name=\"retryMilliseconds\">\n            The number of milliseconds to sleep after encountering a locking error\n            during the backup process.  A value less than zero means that no sleep\n            should be performed.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ClearCachedSettings\">\n            <summary>\n            Clears the per-connection cached settings.\n            </summary>\n            <returns>\n            The total number of per-connection settings cleared.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.TryGetCachedSetting(System.String,System.String,System.Object@)\">\n            <summary>\n            Queries and returns the value of the specified setting, using the\n            cached setting names and values for this connection, when available.\n            </summary>\n            <param name=\"name\">\n            The name of the setting.\n            </param>\n            <param name=\"default\">\n            The value to be returned if the setting has not been set explicitly\n            or cannot be determined.\n            </param>\n            <param name=\"value\">\n            The value of the cached setting is stored here if found; otherwise,\n            the value of <paramref name=\"default\" /> is stored here.\n            </param>\n            <returns>\n            Non-zero if the cached setting was found; otherwise, zero.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.SetCachedSetting(System.String,System.Object)\">\n            <summary>\n            Adds or sets the cached setting specified by <paramref name=\"name\" />\n            to the value specified by <paramref name=\"value\" />.\n            </summary>\n            <param name=\"name\">\n            The name of the cached setting to add or replace.\n            </param>\n            <param name=\"value\">\n            The new value of the cached setting.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ClearTypeMappings\">\n            <summary>\n            Clears the per-connection type mappings.\n            </summary>\n            <returns>\n            The total number of per-connection type mappings cleared.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.GetTypeMappings\">\n            <summary>\n            Returns the per-connection type mappings.\n            </summary>\n            <returns>\n            The per-connection type mappings -OR- null if they are unavailable.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.AddTypeMapping(System.String,System.Data.DbType,System.Boolean)\">\n            <summary>\n            Adds a per-connection type mapping, possibly replacing one or more\n            that already exist.\n            </summary>\n            <param name=\"typeName\">\n            The case-insensitive database type name (e.g. \"MYDATE\").  The value\n            of this parameter cannot be null.  Using an empty string value (or\n            a string value consisting entirely of whitespace) for this parameter\n            is not recommended.\n            </param>\n            <param name=\"dataType\">\n            The <see cref=\"T:System.Data.DbType\"/> value that should be associated with the\n            specified type name.\n            </param>\n            <param name=\"primary\">\n            Non-zero if this mapping should be considered to be the primary one\n            for the specified <see cref=\"T:System.Data.DbType\"/>.\n            </param>\n            <returns>\n            A negative value if nothing was done.  Zero if no per-connection type\n            mappings were replaced (i.e. it was a pure add operation).  More than\n            zero if some per-connection type mappings were replaced.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction)\">\n            <summary>\n            Attempts to bind the specified <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> object\n            instance to this connection.\n            </summary>\n            <param name=\"functionAttribute\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunctionAttribute\"/> object instance containing\n            the metadata for the function to be bound.\n            </param>\n            <param name=\"function\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> object instance that implements the\n            function to be bound.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Delegate,System.Delegate)\">\n            <summary>\n            Attempts to bind the specified <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> object\n            instance to this connection.\n            </summary>\n            <param name=\"functionAttribute\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunctionAttribute\"/> object instance containing\n            the metadata for the function to be bound.\n            </param>\n            <param name=\"callback1\">\n            A <see cref=\"T:System.Delegate\"/> object instance that helps implement the\n            function to be bound.  For scalar functions, this corresponds to the\n            <see cref=\"T:System.Data.SQLite.SQLiteInvokeDelegate\"/> type.  For aggregate functions,\n            this corresponds to the <see cref=\"T:System.Data.SQLite.SQLiteStepDelegate\"/> type.  For\n            collation functions, this corresponds to the\n            <see cref=\"T:System.Data.SQLite.SQLiteCompareDelegate\"/> type.\n            </param>\n            <param name=\"callback2\">\n            A <see cref=\"T:System.Delegate\"/> object instance that helps implement the\n            function to be bound.  For aggregate functions, this corresponds to the\n            <see cref=\"T:System.Data.SQLite.SQLiteFinalDelegate\"/> type.  For other callback types, it\n            is not used and must be null.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.UnbindFunction(System.Data.SQLite.SQLiteFunctionAttribute)\">\n            <summary>\n            Attempts to unbind the specified <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> object\n            instance to this connection.\n            </summary>\n            <param name=\"functionAttribute\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunctionAttribute\"/> object instance containing\n            the metadata for the function to be unbound.\n            </param>\n            <returns>Non-zero if the function was unbound.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.UnbindAllFunctions(System.Boolean)\">\n            <summary>\n            This method unbinds all registered (known) functions -OR- all previously\n            bound user-defined functions from this connection.\n            </summary>\n            <param name=\"registered\">\n            Non-zero to unbind all registered (known) functions -OR- zero to unbind\n            all functions currently bound to the connection.\n            </param>\n            <returns>\n            Non-zero if all the specified user-defined functions were unbound.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ParseConnectionString(System.String,System.Boolean,System.Boolean)\">\n            <summary>\n            Parses a connection string into component parts using the custom\n            connection string parser.  An exception may be thrown if the syntax\n            of the connection string is incorrect.\n            </summary>\n            <param name=\"connectionString\">\n            The connection string to parse.\n            </param>\n            <param name=\"parseViaFramework\">\n            Non-zero to parse the connection string using the algorithm provided\n            by the framework itself.  This is not applicable when running on the\n            .NET Compact Framework.\n            </param>\n            <param name=\"allowNameOnly\">\n            Non-zero if names are allowed without values.\n            </param>\n            <returns>\n            The list of key/value pairs corresponding to the parameters specified\n            within the connection string.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Dispose\">\n            <summary>\n            Disposes and finalizes the connection, if applicable.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Dispose(System.Boolean)\">\n            <summary>\n            Cleans up resources (native and managed) associated with the current instance.\n            </summary>\n            <param name=\"disposing\">\n            Zero when being disposed via garbage collection; otherwise, non-zero.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Clone\">\n            <summary>\n            Creates a clone of the connection.  All attached databases and user-defined functions are cloned.  If the existing connection is open, the cloned connection\n            will also be opened.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.CreateFile(System.String)\">\n            <summary>\n            Creates a database file.  This just creates a zero-byte file which SQLite\n            will turn into a database when the file is opened properly.\n            </summary>\n            <param name=\"databaseFileName\">The file to create</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.OnStateChange(System.Data.ConnectionState,System.Data.StateChangeEventArgs@)\">\n            <summary>\n            Raises the state change event when the state of the connection changes\n            </summary>\n            <param name=\"newState\">The new connection state.  If this is different\n            from the previous state, the <see cref=\"E:System.Data.SQLite.SQLiteConnection.StateChange\"/> event is\n            raised.</param>\n            <param name=\"eventArgs\">The event data created for the raised event, if\n            it was actually raised.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.GetFallbackDefaultIsolationLevel\">\n            <summary>\n            Determines and returns the fallback default isolation level when one cannot be\n            obtained from an existing connection instance.\n            </summary>\n            <returns>\n            The fallback default isolation level for this connection instance -OR-\n            <see cref=\"F:System.Data.IsolationLevel.Unspecified\"/> if it cannot be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.GetDefaultIsolationLevel\">\n            <summary>\n            Determines and returns the default isolation level for this connection instance.\n            </summary>\n            <returns>\n            The default isolation level for this connection instance -OR-\n            <see cref=\"F:System.Data.IsolationLevel.Unspecified\"/> if it cannot be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel,System.Boolean)\">\n            <summary>\n            OBSOLETE.  Creates a new SQLiteTransaction if one isn't already active on the connection.\n            </summary>\n            <param name=\"isolationLevel\">This parameter is ignored.</param>\n            <param name=\"deferredLock\">When TRUE, SQLite defers obtaining a write lock until a write operation is requested.\n            When FALSE, a writelock is obtained immediately.  The default is TRUE, but in a multi-threaded multi-writer\n            environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock.</param>\n            <returns>Returns a SQLiteTransaction object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Boolean)\">\n            <summary>\n            OBSOLETE.  Creates a new SQLiteTransaction if one isn't already active on the connection.\n            </summary>\n            <param name=\"deferredLock\">When TRUE, SQLite defers obtaining a write lock until a write operation is requested.\n            When FALSE, a writelock is obtained immediately.  The default is false, but in a multi-threaded multi-writer\n            environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock.</param>\n            <returns>Returns a SQLiteTransaction object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel)\">\n            <summary>\n            Creates a new <see cref=\"T:System.Data.SQLite.SQLiteTransaction\"/> if one isn't already active on the connection.\n            </summary>\n            <param name=\"isolationLevel\">Supported isolation levels are Serializable, ReadCommitted and Unspecified.</param>\n            <remarks>\n            Unspecified will use the default isolation level specified in the connection string.  If no isolation level is specified in the\n            connection string, Serializable is used.\n            Serializable transactions are the default.  In this mode, the engine gets an immediate lock on the database, and no other threads\n            may begin a transaction.  Other threads may read from the database, but not write.\n            With a ReadCommitted isolation level, locks are deferred and elevated as needed.  It is possible for multiple threads to start\n            a transaction in ReadCommitted mode, but if a thread attempts to commit a transaction while another thread\n            has a ReadCommitted lock, it may timeout or cause a deadlock on both threads until both threads' CommandTimeout's are reached.\n            </remarks>\n            <returns>Returns a SQLiteTransaction object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.BeginTransaction\">\n            <summary>\n            Creates a new <see cref=\"T:System.Data.SQLite.SQLiteTransaction\"/> if one isn't already\n            active on the connection.\n            </summary>\n            <returns>Returns the new transaction object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.BeginDbTransaction(System.Data.IsolationLevel)\">\n            <summary>\n            Forwards to the local <see cref=\"M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel)\"/> function\n            </summary>\n            <param name=\"isolationLevel\">Supported isolation levels are Unspecified, Serializable, and ReadCommitted</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ChangeDatabase(System.String)\">\n            <summary>\n            This method is not implemented; however, the <see cref=\"E:System.Data.SQLite.SQLiteConnection.Changed\"/>\n            event will still be raised.\n            </summary>\n            <param name=\"databaseName\"></param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Close\">\n            <summary>\n            When the database connection is closed, all commands linked to this connection are automatically reset.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ClearPool(System.Data.SQLite.SQLiteConnection)\">\n            <summary>\n            Clears the connection pool associated with the connection.  Any other active connections using the same database file\n            will be discarded instead of returned to the pool when they are closed.\n            </summary>\n            <param name=\"connection\"></param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ClearAllPools\">\n            <summary>\n            Clears all connection pools.  Any active connections will be discarded instead of sent to the pool when they are closed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.CreateCommand\">\n            <summary>\n            Create a new <see cref=\"T:System.Data.SQLite.SQLiteCommand\"/> and associate it with this connection.\n            </summary>\n            <returns>Returns a new command object already assigned to this connection.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.CreateDbCommand\">\n            <summary>\n            Forwards to the local <see cref=\"M:System.Data.SQLite.SQLiteConnection.CreateCommand\"/> function.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ParseConnectionString(System.String,System.Boolean)\">\n            <summary>\n            Parses a connection string into component parts using the custom\n            connection string parser.  An exception may be thrown if the syntax\n            of the connection string is incorrect.\n            </summary>\n            <param name=\"connectionString\">\n            The connection string to parse.\n            </param>\n            <param name=\"allowNameOnly\">\n            Non-zero if names are allowed without values.\n            </param>\n            <returns>\n            The list of key/value pairs corresponding to the parameters specified\n            within the connection string.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ParseConnectionStringViaFramework(System.String,System.Boolean)\">\n            <summary>\n            Parses a connection string using the built-in (i.e. framework provided)\n            connection string parser class and returns the key/value pairs.  An\n            exception may be thrown if the connection string is invalid or cannot be\n            parsed.  When compiled for the .NET Compact Framework, the custom\n            connection string parser is always used instead because the framework\n            provided one is unavailable there.\n            </summary>\n            <param name=\"connectionString\">\n            The connection string to parse.\n            </param>\n            <param name=\"strict\">\n            Non-zero to throw an exception if any connection string values are not of\n            the <see cref=\"T:System.String\"/> type.  This is not applicable when running on\n            the .NET Compact Framework.\n            </param>\n            <returns>The list of key/value pairs.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.EnlistTransaction(System.Transactions.Transaction)\">\n            <summary>\n            Manual distributed transaction enlistment support\n            </summary>\n            <param name=\"transaction\">The distributed transaction to enlist in</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.FindKey(System.Collections.Generic.SortedList{System.String,System.String},System.String,System.String)\">\n            <summary>\n            Looks for a key in the array of key/values of the parameter string.  If not found, return the specified default value\n            </summary>\n            <param name=\"items\">The list to look in</param>\n            <param name=\"key\">The key to find</param>\n            <param name=\"defValue\">The default value to return if the key is not found</param>\n            <returns>The value corresponding to the specified key, or the default value if not found.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.TryParseEnum(System.Type,System.String,System.Boolean)\">\n            <summary>\n            Attempts to convert the string value to an enumerated value of the specified type.\n            </summary>\n            <param name=\"type\">The enumerated type to convert the string value to.</param>\n            <param name=\"value\">The string value to be converted.</param>\n            <param name=\"ignoreCase\">Non-zero to make the conversion case-insensitive.</param>\n            <returns>The enumerated value upon success or null upon error.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.TryParseByte(System.String,System.Globalization.NumberStyles,System.Byte@)\">\n            <summary>\n            Attempts to convert an input string into a byte value.\n            </summary>\n            <param name=\"value\">\n            The string value to be converted.\n            </param>\n            <param name=\"style\">\n            The number styles to use for the conversion.\n            </param>\n            <param name=\"result\">\n            Upon sucess, this will contain the parsed byte value.\n            Upon failure, the value of this parameter is undefined.\n            </param>\n            <returns>\n            Non-zero upon success; zero on failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.EnableExtensions(System.Boolean)\">\n            <summary>\n            Enables or disabled extension loading.\n            </summary>\n            <param name=\"enable\">\n            True to enable loading of extensions, false to disable.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.LoadExtension(System.String)\">\n            <summary>\n            Loads a SQLite extension library from the named dynamic link library file.\n            </summary>\n            <param name=\"fileName\">\n            The name of the dynamic link library file containing the extension.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.LoadExtension(System.String,System.String)\">\n            <summary>\n            Loads a SQLite extension library from the named dynamic link library file.\n            </summary>\n            <param name=\"fileName\">\n            The name of the dynamic link library file containing the extension.\n            </param>\n            <param name=\"procName\">\n            The name of the exported function used to initialize the extension.\n            If null, the default \"sqlite3_extension_init\" will be used.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.CreateModule(System.Data.SQLite.SQLiteModule)\">\n            <summary>\n            Creates a disposable module containing the implementation of a virtual\n            table.\n            </summary>\n            <param name=\"module\">\n            The module object to be used when creating the disposable module.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.FromHexString(System.String)\">\n            <summary>\n            Parses a string containing a sequence of zero or more hexadecimal\n            encoded byte values and returns the resulting byte array.  The\n            \"0x\" prefix is not allowed on the input string.\n            </summary>\n            <param name=\"text\">\n            The input string containing zero or more hexadecimal encoded byte\n            values.\n            </param>\n            <returns>\n            A byte array containing the parsed byte values or null if an error\n            was encountered.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ToHexString(System.Byte[])\">\n            <summary>\n            Creates and returns a string containing the hexadecimal encoded byte\n            values from the input array.\n            </summary>\n            <param name=\"array\">\n            The input array of bytes.\n            </param>\n            <returns>\n            The resulting string or null upon failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.FromHexString(System.String,System.String@)\">\n            <summary>\n            Parses a string containing a sequence of zero or more hexadecimal\n            encoded byte values and returns the resulting byte array.  The\n            \"0x\" prefix is not allowed on the input string.\n            </summary>\n            <param name=\"text\">\n            The input string containing zero or more hexadecimal encoded byte\n            values.\n            </param>\n            <param name=\"error\">\n            Upon failure, this will contain an appropriate error message.\n            </param>\n            <returns>\n            A byte array containing the parsed byte values or null if an error\n            was encountered.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.GetDefaultPooling\">\n            <summary>\n            This method figures out what the default connection pool setting should\n            be based on the connection flags.  When present, the \"Pooling\" connection\n            string property value always overrides the value returned by this method.\n            </summary>\n            <returns>\n            Non-zero if the connection pool should be enabled by default; otherwise,\n            zero.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.GetEffectiveIsolationLevel(System.Data.IsolationLevel)\">\n            <summary>\n            Determines the transaction isolation level that should be used by\n            the caller, primarily based upon the one specified by the caller.\n            If mapping of transaction isolation levels is enabled, the returned\n            transaction isolation level may be significantly different than the\n            originally specified one.\n            </summary>\n            <param name=\"isolationLevel\">\n            The originally specified transaction isolation level.\n            </param>\n            <returns>\n            The transaction isolation level that should be used.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Open\">\n            <summary>\n            Opens the connection using the parameters found in the <see cref=\"P:System.Data.SQLite.SQLiteConnection.ConnectionString\"/>.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.OpenAndReturn\">\n            <summary>\n            Opens the connection using the parameters found in the <see cref=\"P:System.Data.SQLite.SQLiteConnection.ConnectionString\"/> and then returns it.\n            </summary>\n            <returns>The current connection object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Cancel\">\n            <summary>\n            This method causes any pending database operation to abort and return at\n            its earliest opportunity.  This routine is typically called in response\n            to a user action such as pressing \"Cancel\" or Ctrl-C where the user wants\n            a long query operation to halt immediately.  It is safe to call this\n            routine from any thread.  However, it is not safe to call this routine\n            with a database connection that is closed or might close before this method\n            returns.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.GetMemoryStatistics(System.Collections.Generic.IDictionary{System.String,System.Int64}@)\">\n            <summary>\n            Returns various global memory statistics for the SQLite core library via\n            a dictionary of key/value pairs.  Currently, only the \"MemoryUsed\" and\n            \"MemoryHighwater\" keys are returned and they have values that correspond\n            to the values that could be obtained via the <see cref=\"P:System.Data.SQLite.SQLiteConnection.MemoryUsed\"/>\n            and <see cref=\"P:System.Data.SQLite.SQLiteConnection.MemoryHighwater\"/> connection properties.\n            </summary>\n            <param name=\"statistics\">\n            This dictionary will be populated with the global memory statistics.  It\n            will be created if necessary.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ReleaseMemory\">\n            <summary>\n            Attempts to free as much heap memory as possible for this database connection.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ReleaseMemory(System.Int32,System.Boolean,System.Boolean,System.Int32@,System.Boolean@,System.UInt32@)\">\n            <summary>\n            Attempts to free N bytes of heap memory by deallocating non-essential memory\n            allocations held by the database library. Memory used to cache database pages\n            to improve performance is an example of non-essential memory.  This is a no-op\n            returning zero if the SQLite core library was not compiled with the compile-time\n            option SQLITE_ENABLE_MEMORY_MANAGEMENT.  Optionally, attempts to reset and/or\n            compact the Win32 native heap, if applicable.\n            </summary>\n            <param name=\"nBytes\">\n            The requested number of bytes to free.\n            </param>\n            <param name=\"reset\">\n            Non-zero to attempt a heap reset.\n            </param>\n            <param name=\"compact\">\n            Non-zero to attempt heap compaction.\n            </param>\n            <param name=\"nFree\">\n            The number of bytes actually freed.  This value may be zero.\n            </param>\n            <param name=\"resetOk\">\n            This value will be non-zero if the heap reset was successful.\n            </param>\n            <param name=\"nLargest\">\n            The size of the largest committed free block in the heap, in bytes.\n            This value will be zero unless heap compaction is enabled.\n            </param>\n            <returns>\n            A standard SQLite return code (i.e. zero for success and non-zero\n            for failure).\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.SetMemoryStatus(System.Boolean)\">\n            <summary>\n            Sets the status of the memory usage tracking subsystem in the SQLite core library.  By default, this is enabled.\n            If this is disabled, memory usage tracking will not be performed.  This is not really a per-connection value, it is\n            global to the process.\n            </summary>\n            <param name=\"value\">Non-zero to enable memory usage tracking, zero otherwise.</param>\n            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Shutdown\">\n            <summary>\n            Passes a shutdown request to the SQLite core library.  Does not throw\n            an exception if the shutdown request fails.\n            </summary>\n            <returns>\n            A standard SQLite return code (i.e. zero for success and non-zero for\n            failure).\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Shutdown(System.Boolean,System.Boolean)\">\n            <summary>\n            Passes a shutdown request to the SQLite core library.  Throws an\n            exception if the shutdown request fails and the no-throw parameter\n            is non-zero.\n            </summary>\n            <param name=\"directories\">\n            Non-zero to reset the database and temporary directories to their\n            default values, which should be null for both.\n            </param>\n            <param name=\"noThrow\">\n            When non-zero, throw an exception if the shutdown request fails.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.SetExtendedResultCodes(System.Boolean)\">\n            Enables or disabled extended result codes returned by SQLite\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ResultCode\">\n            Enables or disabled extended result codes returned by SQLite\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ExtendedResultCode\">\n            Enables or disabled extended result codes returned by SQLite\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)\">\n            Add a log message via the SQLite sqlite3_log interface.\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.LogMessage(System.Int32,System.String)\">\n            Add a log message via the SQLite sqlite3_log interface.\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ChangePassword(System.String)\">\n            <summary>\n            Change the password (or assign a password) to an open database.\n            </summary>\n            <remarks>\n            No readers or writers may be active for this process.  The database must already be open\n            and if it already was password protected, the existing password must already have been supplied.\n            </remarks>\n            <param name=\"newPassword\">The new password to assign to the database</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ChangePassword(System.Byte[])\">\n            <summary>\n            Change the password (or assign a password) to an open database.\n            </summary>\n            <remarks>\n            No readers or writers may be active for this process.  The database must already be open\n            and if it already was password protected, the existing password must already have been supplied.\n            </remarks>\n            <param name=\"newPassword\">The new password to assign to the database</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.SetPassword(System.String)\">\n            <summary>\n            Sets the password for a password-protected database.  A password-protected database is\n            unusable for any operation until the password has been set.\n            </summary>\n            <param name=\"databasePassword\">The password for the database</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.SetPassword(System.Byte[])\">\n            <summary>\n            Sets the password for a password-protected database.  A password-protected database is\n            unusable for any operation until the password has been set.\n            </summary>\n            <param name=\"databasePassword\">The password for the database</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.SetAvRetry(System.Int32@,System.Int32@)\">\n            <summary>\n            Queries or modifies the number of retries or the retry interval (in milliseconds) for\n            certain I/O operations that may fail due to anti-virus software.\n            </summary>\n            <param name=\"count\">The number of times to retry the I/O operation.  A negative value\n            will cause the current count to be queried and replace that negative value.</param>\n            <param name=\"interval\">The number of milliseconds to wait before retrying the I/O\n            operation.  This number is multiplied by the number of retry attempts so far to come\n            up with the final number of milliseconds to wait.  A negative value will cause the\n            current interval to be queried and replace that negative value.</param>\n            <returns>Zero for success, non-zero for error.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.SetChunkSize(System.Int32)\">\n            <summary>\n            Sets the chunk size for the primary file associated with this database\n            connection.\n            </summary>\n            <param name=\"size\">\n            The new chunk size for the main database, in bytes.\n            </param>\n            <returns>\n            Zero for success, non-zero for error.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.UnwrapString(System.String)\">\n            <summary>\n            Removes one set of surrounding single -OR- double quotes from the string\n            value and returns the resulting string value.  If the string is null, empty,\n            or contains quotes that are not balanced, nothing is done and the original\n            string value will be returned.\n            </summary>\n            <param name=\"value\">The string value to process.</param>\n            <returns>\n            The string value, modified to remove one set of surrounding single -OR-\n            double quotes, if applicable.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.GetDataDirectory\">\n            <summary>\n            Determines the directory to be used when dealing with the \"|DataDirectory|\"\n            macro in a database file name.\n            </summary>\n            <returns>\n            The directory to use in place of the \"|DataDirectory|\" macro -OR- null if it\n            cannot be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.ExpandFileName(System.String,System.Boolean)\">\n            <summary>\n            Expand the filename of the data source, resolving the |DataDirectory|\n            macro as appropriate.\n            </summary>\n            <param name=\"sourceFile\">The database filename to expand</param>\n            <param name=\"toFullPath\">\n            Non-zero if the returned file name should be converted to a full path\n            (except when using the .NET Compact Framework).\n            </param>\n            <returns>The expanded path and filename of the filename</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.GetSchema\">\n            <overloads>\n             The following commands are used to extract schema information out of the database.  Valid schema types are:\n             <list type=\"bullet\">\n             <item>\n             <description>MetaDataCollections</description>\n             </item>\n             <item>\n             <description>DataSourceInformation</description>\n             </item>\n             <item>\n             <description>Catalogs</description>\n             </item>\n             <item>\n             <description>Columns</description>\n             </item>\n             <item>\n             <description>ForeignKeys</description>\n             </item>\n             <item>\n             <description>Indexes</description>\n             </item>\n             <item>\n             <description>IndexColumns</description>\n             </item>\n             <item>\n             <description>Tables</description>\n             </item>\n             <item>\n             <description>Views</description>\n             </item>\n             <item>\n             <description>ViewColumns</description>\n             </item>\n             </list>\n             </overloads>\n             <summary>\n             Returns the MetaDataCollections schema\n             </summary>\n             <returns>A DataTable of the MetaDataCollections schema</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.GetSchema(System.String)\">\n            <summary>\n            Returns schema information of the specified collection\n            </summary>\n            <param name=\"collectionName\">The schema collection to retrieve</param>\n            <returns>A DataTable of the specified collection</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.GetSchema(System.String,System.String[])\">\n            <summary>\n            Retrieves schema information using the specified constraint(s) for the specified collection\n            </summary>\n            <param name=\"collectionName\">The collection to retrieve.</param>\n            <param name=\"restrictionValues\">\n            The restrictions to impose.  Typically, this may include:\n            <list type=\"table\">\n            <listheader>\n            <term>restrictionValues element index</term>\n            <term>usage</term>\n            </listheader>\n            <item>\n            <description>0</description>\n            <description>The database (or catalog) name, if applicable.</description>\n            </item>\n            <item>\n            <description>1</description>\n            <description>The schema name.  This is not used by this provider.</description>\n            </item>\n            <item>\n            <description>2</description>\n            <description>The table name, if applicable.</description>\n            </item>\n            <item>\n            <description>3</description>\n            <description>\n            Depends on <paramref name=\"collectionName\" />.\n            When \"IndexColumns\", it is the index name; otherwise, it is the column name.\n            </description>\n            </item>\n            <item>\n            <description>4</description>\n            <description>\n            Depends on <paramref name=\"collectionName\" />.\n            When \"IndexColumns\", it is the column name; otherwise, it is not used.\n            </description>\n            </item>\n            </list>\n            </param>\n            <returns>A DataTable of the specified collection</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Schema_MetaDataCollections\">\n            <summary>\n            Builds a MetaDataCollections schema datatable\n            </summary>\n            <returns>DataTable</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Schema_DataSourceInformation\">\n            <summary>\n            Builds a DataSourceInformation datatable\n            </summary>\n            <returns>DataTable</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Schema_Columns(System.String,System.String,System.String)\">\n            <summary>\n            Build a Columns schema\n            </summary>\n            <param name=\"strCatalog\">The catalog (attached database) to query, can be null</param>\n            <param name=\"strTable\">The table to retrieve schema information for, must not be null</param>\n            <param name=\"strColumn\">The column to retrieve schema information for, can be null</param>\n            <returns>DataTable</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Schema_Indexes(System.String,System.String,System.String)\">\n            <summary>\n            Returns index information for the given database and catalog\n            </summary>\n            <param name=\"strCatalog\">The catalog (attached database) to query, can be null</param>\n            <param name=\"strIndex\">The name of the index to retrieve information for, can be null</param>\n            <param name=\"strTable\">The table to retrieve index information for, can be null</param>\n            <returns>DataTable</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Schema_Tables(System.String,System.String,System.String)\">\n            <summary>\n            Retrieves table schema information for the database and catalog\n            </summary>\n            <param name=\"strCatalog\">The catalog (attached database) to retrieve tables on</param>\n            <param name=\"strTable\">The table to retrieve, can be null</param>\n            <param name=\"strType\">The table type, can be null</param>\n            <returns>DataTable</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Schema_Views(System.String,System.String)\">\n            <summary>\n            Retrieves view schema information for the database\n            </summary>\n            <param name=\"strCatalog\">The catalog (attached database) to retrieve views on</param>\n            <param name=\"strView\">The view name, can be null</param>\n            <returns>DataTable</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Schema_Catalogs(System.String)\">\n            <summary>\n            Retrieves catalog (attached databases) schema information for the database\n            </summary>\n            <param name=\"strCatalog\">The catalog to retrieve, can be null</param>\n            <returns>DataTable</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Schema_IndexColumns(System.String,System.String,System.String,System.String)\">\n            <summary>\n            Returns the base column information for indexes in a database\n            </summary>\n            <param name=\"strCatalog\">The catalog to retrieve indexes for (can be null)</param>\n            <param name=\"strTable\">The table to restrict index information by (can be null)</param>\n            <param name=\"strIndex\">The index to restrict index information by (can be null)</param>\n            <param name=\"strColumn\">The source column to restrict index information by (can be null)</param>\n            <returns>A DataTable containing the results</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Schema_ViewColumns(System.String,System.String,System.String)\">\n            <summary>\n            Returns detailed column information for a specified view\n            </summary>\n            <param name=\"strCatalog\">The catalog to retrieve columns for (can be null)</param>\n            <param name=\"strView\">The view to restrict column information by (can be null)</param>\n            <param name=\"strColumn\">The source column to restrict column information by (can be null)</param>\n            <returns>A DataTable containing the results</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnection.Schema_ForeignKeys(System.String,System.String,System.String)\">\n            <summary>\n            Retrieves foreign key information from the specified set of filters\n            </summary>\n            <param name=\"strCatalog\">An optional catalog to restrict results on</param>\n            <param name=\"strTable\">An optional table to restrict results on</param>\n            <param name=\"strKeyName\">An optional foreign key name to restrict results on</param>\n            <returns>A DataTable with the results of the query</returns>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteConnection._handlers\">\n            <summary>\n            Static variable to store the connection event handlers to call.\n            </summary>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteConnection.StateChange\">\n            <summary>\n            This event is raised whenever the database is opened or closed.\n            </summary>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteConnection.Changed\">\n            <summary>\n            This event is raised when events related to the lifecycle of a\n            SQLiteConnection object occur.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.ConnectionPool\">\n            <summary>\n            This property is used to obtain or set the custom connection pool\n            implementation to use, if any.  Setting this property to null will\n            cause the default connection pool implementation to be used.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.PoolCount\">\n            <summary>\n            Returns the number of pool entries for the file name associated with this connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.ConnectionString\">\n            <summary>\n            The connection string containing the parameters for the connection\n            </summary>\n            <remarks>\n            For the complete list of supported connection string properties,\n            please see <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/>.\n            </remarks>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.DataSource\">\n            <summary>\n            Returns the data source file name without extension or path.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.FileName\">\n            <summary>\n            Returns the fully qualified path and file name for the currently open\n            database, if any.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.Database\">\n            <summary>\n            Returns the string \"main\".\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.DefaultTimeout\">\n            <summary>\n            Gets/sets the default command timeout for newly-created commands.  This is especially useful for\n            commands used internally such as inside a SQLiteTransaction, where setting the timeout is not possible.\n            This can also be set in the ConnectionString with \"Default Timeout\"\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.BusyTimeout\">\n            <summary>\n            Gets/sets the default busy timeout to use with the SQLite core library.  This is only used when\n            opening a connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.PrepareRetries\">\n            <summary>\n            The maximum number of retries when preparing SQL to be executed.  This\n            normally only applies to preparation errors resulting from the database\n            schema being changed.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.ProgressOps\">\n            <summary>\n            The approximate number of virtual machine instructions between progress\n            events.  In order for progress events to actually fire, the event handler\n            must be added to the <see cref=\"E:System.Data.SQLite.SQLiteConnection.Progress\"/> event as\n            well.  This value will only be used when the underlying native progress\n            callback needs to be changed.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.ParseViaFramework\">\n            <summary>\n            Non-zero if the built-in (i.e. framework provided) connection string\n            parser should be used when opening the connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.Flags\">\n            <summary>\n            Gets/sets the extra behavioral flags for this connection.  See the\n            <see cref=\"T:System.Data.SQLite.SQLiteConnectionFlags\"/> enumeration for a list of\n            possible values.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.DefaultDbType\">\n            <summary>\n            Gets/sets the default database type for this connection.  This value\n            will only be used when not null.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.DefaultTypeName\">\n            <summary>\n            Gets/sets the default database type name for this connection.  This\n            value will only be used when not null.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.VfsName\">\n            <summary>\n            Gets/sets the VFS name for this connection.  This value will only be\n            used when opening the database.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.OwnHandle\">\n            <summary>\n            Returns non-zero if the underlying native connection handle is\n            owned by this instance.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.ServerVersion\">\n            <summary>\n            Returns the version of the underlying SQLite database engine\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.LastInsertRowId\">\n            <summary>\n            Returns the rowid of the most recent successful INSERT into the database from this connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.Changes\">\n            <summary>\n            Returns the number of rows changed by the last INSERT, UPDATE, or DELETE statement executed on\n            this connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.AutoCommit\">\n            <summary>\n            Returns non-zero if the given database connection is in autocommit mode.\n            Autocommit mode is on by default.  Autocommit mode is disabled by a BEGIN\n            statement.  Autocommit mode is re-enabled by a COMMIT or ROLLBACK.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.MemoryUsed\">\n            <summary>\n            Returns the amount of memory (in bytes) currently in use by the SQLite core library.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.MemoryHighwater\">\n            <summary>\n            Returns the maximum amount of memory (in bytes) used by the SQLite core library since the high-water mark was last reset.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.DefineConstants\">\n            <summary>\n            Returns a string containing the define constants (i.e. compile-time\n            options) used to compile the core managed assembly, delimited with\n            spaces.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.SQLiteVersion\">\n            <summary>\n            Returns the version of the underlying SQLite core library.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.SQLiteSourceId\">\n            <summary>\n            This method returns the string whose value is the same as the\n            SQLITE_SOURCE_ID C preprocessor macro used when compiling the\n            SQLite core library.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.SQLiteCompileOptions\">\n            <summary>\n            Returns a string containing the compile-time options used to\n            compile the SQLite core native library, delimited with spaces.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.InteropVersion\">\n            <summary>\n            This method returns the version of the interop SQLite assembly\n            used.  If the SQLite interop assembly is not in use or the\n            necessary information cannot be obtained for any reason, a null\n            value may be returned.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.InteropSourceId\">\n            <summary>\n            This method returns the string whose value contains the unique\n            identifier for the source checkout used to build the interop\n            assembly.  If the SQLite interop assembly is not in use or the\n            necessary information cannot be obtained for any reason, a null\n            value may be returned.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.InteropCompileOptions\">\n            <summary>\n            Returns a string containing the compile-time options used to\n            compile the SQLite interop assembly, delimited with spaces.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.ProviderVersion\">\n            <summary>\n            This method returns the version of the managed components used\n            to interact with the SQLite core library.  If the necessary\n            information cannot be obtained for any reason, a null value may\n            be returned.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.ProviderSourceId\">\n            <summary>\n            This method returns the string whose value contains the unique\n            identifier for the source checkout used to build the managed\n            components currently executing.  If the necessary information\n            cannot be obtained for any reason, a null value may be returned.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.DefaultFlags\">\n            <summary>\n            The default connection flags to be used for all opened connections\n            when they are not present in the connection string.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.SharedFlags\">\n            <summary>\n            The extra connection flags to be used for all opened connections.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.State\">\n            <summary>\n            Returns the state of the connection.\n            </summary>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteConnection.Progress\">\n            <summary>\n            This event is raised periodically during long running queries.  Changing\n            the value of the <see cref=\"F:System.Data.SQLite.ProgressEventArgs.ReturnCode\"/> property will\n            determine if the operation in progress will continue or be interrupted.\n            For the entire duration of the event, the associated connection and\n            statement objects must not be modified, either directly or indirectly, by\n            the called code.\n            </summary>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteConnection.Authorize\">\n            <summary>\n            This event is raised whenever SQLite encounters an action covered by the\n            authorizer during query preparation.  Changing the value of the\n            <see cref=\"F:System.Data.SQLite.AuthorizerEventArgs.ReturnCode\"/> property will determine if\n            the specific action will be allowed, ignored, or denied.  For the entire\n            duration of the event, the associated connection and statement objects\n            must not be modified, either directly or indirectly, by the called code.\n            </summary>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteConnection.Update\">\n            <summary>\n            This event is raised whenever SQLite makes an update/delete/insert into the database on\n            this connection.  It only applies to the given connection.\n            </summary>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteConnection.Commit\">\n            <summary>\n            This event is raised whenever SQLite is committing a transaction.\n            Return non-zero to trigger a rollback.\n            </summary>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteConnection.Trace\">\n            <summary>\n            This event is raised whenever SQLite statement first begins executing on\n            this connection.  It only applies to the given connection.\n            </summary>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteConnection.RollBack\">\n            <summary>\n            This event is raised whenever SQLite is rolling back a transaction.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnection.DbProviderFactory\">\n            <summary>\n            Returns the <see cref=\"T:System.Data.SQLite.SQLiteFactory\"/> instance.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SynchronizationModes\">\n            <summary>\n            The I/O file cache flushing behavior for the connection\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SynchronizationModes.Normal\">\n            <summary>\n            Normal file flushing at critical sections of the code\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SynchronizationModes.Full\">\n            <summary>\n            Full file flushing after every write operation\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SynchronizationModes.Off\">\n            <summary>\n            Use the default operating system's file flushing, SQLite does not explicitly flush the file buffers after writing\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteProgressEventHandler\">\n            <summary>\n            Raised each time the number of virtual machine instructions is\n            approximately equal to the value of the\n            <see cref=\"P:System.Data.SQLite.SQLiteConnection.ProgressOps\"/> property.\n            </summary>\n            <param name=\"sender\">The connection performing the operation.</param>\n            <param name=\"e\">A <see cref=\"T:System.Data.SQLite.ProgressEventArgs\"/> that contains the\n            event data.</param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteAuthorizerEventHandler\">\n            <summary>\n            Raised when authorization is required to perform an action contained\n            within a SQL query.\n            </summary>\n            <param name=\"sender\">The connection performing the action.</param>\n            <param name=\"e\">A <see cref=\"T:System.Data.SQLite.AuthorizerEventArgs\"/> that contains the\n            event data.</param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteCommitHandler\">\n            <summary>\n            Raised when a transaction is about to be committed.  To roll back a transaction, set the\n            rollbackTrans boolean value to true.\n            </summary>\n            <param name=\"sender\">The connection committing the transaction</param>\n            <param name=\"e\">Event arguments on the transaction</param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteUpdateEventHandler\">\n            <summary>\n            Raised when data is inserted, updated and deleted on a given connection\n            </summary>\n            <param name=\"sender\">The connection committing the transaction</param>\n            <param name=\"e\">The event parameters which triggered the event</param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteTraceEventHandler\">\n            <summary>\n            Raised when a statement first begins executing on a given connection\n            </summary>\n            <param name=\"sender\">The connection executing the statement</param>\n            <param name=\"e\">Event arguments of the trace</param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteBackupCallback\">\n            <summary>\n            Raised between each backup step.\n            </summary>\n            <param name=\"source\">\n            The source database connection.\n            </param>\n            <param name=\"sourceName\">\n            The source database name.\n            </param>\n            <param name=\"destination\">\n            The destination database connection.\n            </param>\n            <param name=\"destinationName\">\n            The destination database name.\n            </param>\n            <param name=\"pages\">\n            The number of pages copied with each step.\n            </param>\n            <param name=\"remainingPages\">\n            The number of pages remaining to be copied.\n            </param>\n            <param name=\"totalPages\">\n            The total number of pages in the source database.\n            </param>\n            <param name=\"retry\">\n            Set to true if the operation needs to be retried due to database\n            locking issues; otherwise, set to false.\n            </param>\n            <returns>\n            True to continue with the backup process or false to halt the backup\n            process, rolling back any changes that have been made so far.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.ProgressEventArgs\">\n            <summary>\n            The event data associated with progress reporting events.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.ProgressEventArgs.UserData\">\n            <summary>\n            The user-defined native data associated with this event.  Currently,\n            this will always contain the value of <see cref=\"F:System.IntPtr.Zero\"/>.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.ProgressEventArgs.ReturnCode\">\n            <summary>\n            The return code for the current call into the progress callback.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.ProgressEventArgs.#ctor\">\n            <summary>\n            Constructs an instance of this class with default property values.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.ProgressEventArgs.#ctor(System.IntPtr,System.Data.SQLite.SQLiteProgressReturnCode)\">\n            <summary>\n            Constructs an instance of this class with specific property values.\n            </summary>\n            <param name=\"pUserData\">\n            The user-defined native data associated with this event.\n            </param>\n            <param name=\"returnCode\">\n            The progress return code.\n            </param>\n        </member>\n        <member name=\"T:System.Data.SQLite.AuthorizerEventArgs\">\n            <summary>\n            The data associated with a call into the authorizer.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.AuthorizerEventArgs.UserData\">\n            <summary>\n            The user-defined native data associated with this event.  Currently,\n            this will always contain the value of <see cref=\"F:System.IntPtr.Zero\"/>.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.AuthorizerEventArgs.ActionCode\">\n            <summary>\n            The action code responsible for the current call into the authorizer.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.AuthorizerEventArgs.Argument1\">\n            <summary>\n            The first string argument for the current call into the authorizer.\n            The exact value will vary based on the action code, see the\n            <see cref=\"T:System.Data.SQLite.SQLiteAuthorizerActionCode\"/> enumeration for possible\n            values.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.AuthorizerEventArgs.Argument2\">\n            <summary>\n            The second string argument for the current call into the authorizer.\n            The exact value will vary based on the action code, see the\n            <see cref=\"T:System.Data.SQLite.SQLiteAuthorizerActionCode\"/> enumeration for possible\n            values.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.AuthorizerEventArgs.Database\">\n            <summary>\n            The database name for the current call into the authorizer, if\n            applicable.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.AuthorizerEventArgs.Context\">\n            <summary>\n            The name of the inner-most trigger or view that is responsible for\n            the access attempt or a null value if this access attempt is directly\n            from top-level SQL code.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.AuthorizerEventArgs.ReturnCode\">\n            <summary>\n            The return code for the current call into the authorizer.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.AuthorizerEventArgs.#ctor\">\n            <summary>\n            Constructs an instance of this class with default property values.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.AuthorizerEventArgs.#ctor(System.IntPtr,System.Data.SQLite.SQLiteAuthorizerActionCode,System.String,System.String,System.String,System.String,System.Data.SQLite.SQLiteAuthorizerReturnCode)\">\n            <summary>\n            Constructs an instance of this class with specific property values.\n            </summary>\n            <param name=\"pUserData\">\n            The user-defined native data associated with this event.\n            </param>\n            <param name=\"actionCode\">\n            The authorizer action code.\n            </param>\n            <param name=\"argument1\">\n            The first authorizer argument.\n            </param>\n            <param name=\"argument2\">\n            The second authorizer argument.\n            </param>\n            <param name=\"database\">\n            The database name, if applicable.\n            </param>\n            <param name=\"context\">\n            The name of the inner-most trigger or view that is responsible for\n            the access attempt or a null value if this access attempt is directly\n            from top-level SQL code.\n            </param>\n            <param name=\"returnCode\">\n            The authorizer return code.\n            </param>\n        </member>\n        <member name=\"T:System.Data.SQLite.UpdateEventType\">\n            <summary>\n            Whenever an update event is triggered on a connection, this enum will indicate\n            exactly what type of operation is being performed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UpdateEventType.Delete\">\n            <summary>\n            A row is being deleted from the given database and table\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UpdateEventType.Insert\">\n            <summary>\n            A row is being inserted into the table.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UpdateEventType.Update\">\n            <summary>\n            A row is being updated in the table.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.UpdateEventArgs\">\n            <summary>\n            Passed during an Update callback, these event arguments detail the type of update operation being performed\n            on the given connection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UpdateEventArgs.Database\">\n            <summary>\n            The name of the database being updated (usually \"main\" but can be any attached or temporary database)\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UpdateEventArgs.Table\">\n            <summary>\n            The name of the table being updated\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UpdateEventArgs.Event\">\n            <summary>\n            The type of update being performed (insert/update/delete)\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UpdateEventArgs.RowId\">\n            <summary>\n            The RowId affected by this update.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.CommitEventArgs\">\n            <summary>\n            Event arguments raised when a transaction is being committed\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.CommitEventArgs.AbortTransaction\">\n            <summary>\n            Set to true to abort the transaction and trigger a rollback\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.TraceEventArgs\">\n            <summary>\n            Passed during an Trace callback, these event arguments contain the UTF-8 rendering of the SQL statement text\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.TraceEventArgs.Statement\">\n            <summary>\n            SQL statement text as the statement first begins executing\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.ISQLiteConnectionPool\">\n            <summary>\n            This interface represents a custom connection pool implementation\n            usable by System.Data.SQLite.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteConnectionPool.GetCounts(System.String,System.Collections.Generic.Dictionary{System.String,System.Int32}@,System.Int32@,System.Int32@,System.Int32@)\">\n            <summary>\n            Counts the number of pool entries matching the specified file name.\n            </summary>\n            <param name=\"fileName\">\n            The file name to match or null to match all files.\n            </param>\n            <param name=\"counts\">\n            The pool entry counts for each matching file.\n            </param>\n            <param name=\"openCount\">\n            The total number of connections successfully opened from any pool.\n            </param>\n            <param name=\"closeCount\">\n            The total number of connections successfully closed from any pool.\n            </param>\n            <param name=\"totalCount\">\n            The total number of pool entries for all matching files.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteConnectionPool.ClearPool(System.String)\">\n            <summary>\n            Disposes of all pooled connections associated with the specified\n            database file name.\n            </summary>\n            <param name=\"fileName\">\n            The database file name.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteConnectionPool.ClearAllPools\">\n            <summary>\n            Disposes of all pooled connections.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteConnectionPool.Add(System.String,System.Object,System.Int32)\">\n            <summary>\n            Adds a connection to the pool of those associated with the\n            specified database file name.\n            </summary>\n            <param name=\"fileName\">\n            The database file name.\n            </param>\n            <param name=\"handle\">\n            The database connection handle.\n            </param>\n            <param name=\"version\">\n            The connection pool version at the point the database connection\n            handle was received from the connection pool.  This is also the\n            connection pool version that the database connection handle was\n            created under.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteConnectionPool.Remove(System.String,System.Int32,System.Int32@)\">\n            <summary>\n            Removes a connection from the pool of those associated with the\n            specified database file name with the intent of using it to\n            interact with the database.\n            </summary>\n            <param name=\"fileName\">\n            The database file name.\n            </param>\n            <param name=\"maxPoolSize\">\n            The new maximum size of the connection pool for the specified\n            database file name.\n            </param>\n            <param name=\"version\">\n            The connection pool version associated with the returned database\n            connection handle, if any.\n            </param>\n            <returns>\n            The database connection handle associated with the specified\n            database file name or null if it cannot be obtained.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteConnectionPool\">\n            <summary>\n            This default method implementations in this class should not be used by\n            applications that make use of COM (either directly or indirectly) due\n            to possible deadlocks that can occur during finalization of some COM\n            objects.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionPool._syncRoot\">\n            <summary>\n            This field is used to synchronize access to the private static data\n            in this class.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionPool._connectionPool\">\n            <summary>\n            When this field is non-null, it will be used to provide the\n            implementation of all the connection pool methods; otherwise,\n            the default method implementations will be used.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionPool._queueList\">\n            <summary>\n            The dictionary of connection pools, based on the normalized file\n            name of the SQLite database.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionPool._poolVersion\">\n            <summary>\n            The default version number new pools will get.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionPool._poolOpened\">\n            <summary>\n            The number of connections successfully opened from any pool.\n            This value is incremented by the Remove method.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionPool._poolClosed\">\n            <summary>\n            The number of connections successfully closed from any pool.\n            This value is incremented by the Add method.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionPool.GetCounts(System.String,System.Collections.Generic.Dictionary{System.String,System.Int32}@,System.Int32@,System.Int32@,System.Int32@)\">\n            <summary>\n            Counts the number of pool entries matching the specified file name.\n            </summary>\n            <param name=\"fileName\">\n            The file name to match or null to match all files.\n            </param>\n            <param name=\"counts\">\n            The pool entry counts for each matching file.\n            </param>\n            <param name=\"openCount\">\n            The total number of connections successfully opened from any pool.\n            </param>\n            <param name=\"closeCount\">\n            The total number of connections successfully closed from any pool.\n            </param>\n            <param name=\"totalCount\">\n            The total number of pool entries for all matching files.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionPool.ClearPool(System.String)\">\n            <summary>\n            Disposes of all pooled connections associated with the specified\n            database file name.\n            </summary>\n            <param name=\"fileName\">\n            The database file name.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionPool.ClearAllPools\">\n            <summary>\n            Disposes of all pooled connections.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionPool.Add(System.String,System.Data.SQLite.SQLiteConnectionHandle,System.Int32)\">\n            <summary>\n            Adds a connection to the pool of those associated with the\n            specified database file name.\n            </summary>\n            <param name=\"fileName\">\n            The database file name.\n            </param>\n            <param name=\"handle\">\n            The database connection handle.\n            </param>\n            <param name=\"version\">\n            The connection pool version at the point the database connection\n            handle was received from the connection pool.  This is also the\n            connection pool version that the database connection handle was\n            created under.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionPool.Remove(System.String,System.Int32,System.Int32@)\">\n            <summary>\n            Removes a connection from the pool of those associated with the\n            specified database file name with the intent of using it to\n            interact with the database.\n            </summary>\n            <param name=\"fileName\">\n            The database file name.\n            </param>\n            <param name=\"maxPoolSize\">\n            The new maximum size of the connection pool for the specified\n            database file name.\n            </param>\n            <param name=\"version\">\n            The connection pool version associated with the returned database\n            connection handle, if any.\n            </param>\n            <returns>\n            The database connection handle associated with the specified\n            database file name or null if it cannot be obtained.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionPool.GetConnectionPool\">\n            <summary>\n            This method is used to obtain a reference to the custom connection\n            pool implementation currently in use, if any.\n            </summary>\n            <returns>\n            The custom connection pool implementation or null if the default\n            connection pool implementation should be used.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionPool.SetConnectionPool(System.Data.SQLite.ISQLiteConnectionPool)\">\n            <summary>\n            This method is used to set the reference to the custom connection\n            pool implementation to use, if any.\n            </summary>\n            <param name=\"connectionPool\">\n            The custom connection pool implementation to use or null if the\n            default connection pool implementation should be used.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionPool.ResizePool(System.Data.SQLite.SQLiteConnectionPool.PoolQueue,System.Boolean)\">\n            <summary>\n            We do not have to thread-lock anything in this function, because it\n            is only called by other functions above which already take the lock.\n            </summary>\n            <param name=\"queue\">\n            The pool queue to resize.\n            </param>\n            <param name=\"add\">\n            If a function intends to add to the pool, this is true, which\n            forces the resize to take one more than it needs from the pool.\n            </param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteConnectionPool.PoolQueue\">\n            <summary>\n            Keeps track of connections made on a specified file.  The PoolVersion\n            dictates whether old objects get returned to the pool or discarded\n            when no longer in use.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.Queue\">\n            <summary>\n            The queue of weak references to the actual database connection\n            handles.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.PoolVersion\">\n            <summary>\n            This pool version associated with the database connection\n            handles in this pool queue.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.MaxPoolSize\">\n            <summary>\n            The maximum size of this pool queue.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            Constructs a connection pool queue using the specified version\n            and maximum size.  Normally, all the database connection\n            handles in this pool are associated with a single database file\n            name.\n            </summary>\n            <param name=\"version\">\n            The initial pool version for this connection pool queue.\n            </param>\n            <param name=\"maxSize\">\n            The initial maximum size for this connection pool queue.\n            </param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteConnectionStringBuilder\">\n            <summary>\n            SQLite implementation of DbConnectionStringBuilder.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionStringBuilder._properties\">\n            <summary>\n            Properties of this class\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionStringBuilder.#ctor\">\n            <overloads>\n            Constructs a new instance of the class\n            </overloads>\n            <summary>\n            Default constructor\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionStringBuilder.#ctor(System.String)\">\n            <summary>\n            Constructs a new instance of the class using the specified connection string.\n            </summary>\n            <param name=\"connectionString\">The connection string to parse</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionStringBuilder.Initialize(System.String)\">\n            <summary>\n            Private initializer, which assigns the connection string and resets the builder\n            </summary>\n            <param name=\"cnnString\">The connection string to assign</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionStringBuilder.TryGetValue(System.String,System.Object@)\">\n            <summary>\n            Helper function for retrieving values from the connectionstring\n            </summary>\n            <param name=\"keyword\">The keyword to retrieve settings for</param>\n            <param name=\"value\">The resulting parameter value</param>\n            <returns>Returns true if the value was found and returned</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteConnectionStringBuilder.FallbackGetProperties(System.Collections.Hashtable)\">\n            <summary>\n            Fallback method for MONO, which doesn't implement DbConnectionStringBuilder.GetProperties()\n            </summary>\n            <param name=\"propertyList\">The hashtable to fill with property descriptors</param>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.Version\">\n            <summary>\n            Gets/Sets the default version of the SQLite engine to instantiate.  Currently the only valid value is 3, indicating version 3 of the sqlite library.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.SyncMode\">\n            <summary>\n            Gets/Sets the synchronization mode (file flushing) of the connection string.  Default is \"Normal\".\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.UseUTF16Encoding\">\n            <summary>\n            Gets/Sets the encoding for the connection string.  The default is \"False\" which indicates UTF-8 encoding.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.Pooling\">\n            <summary>\n            Gets/Sets whether or not to use connection pooling.  The default is \"False\"\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.BinaryGUID\">\n            <summary>\n            Gets/Sets whethor not to store GUID's in binary format.  The default is True\n            which saves space in the database.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.DataSource\">\n            <summary>\n            Gets/Sets the filename to open on the connection string.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.Uri\">\n            <summary>\n            An alternate to the data source property\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.FullUri\">\n            <summary>\n            An alternate to the data source property that uses the SQLite URI syntax.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.DefaultTimeout\">\n            <summary>\n            Gets/sets the default command timeout for newly-created commands.  This is especially useful for\n            commands used internally such as inside a SQLiteTransaction, where setting the timeout is not possible.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.BusyTimeout\">\n            <summary>\n            Gets/sets the busy timeout to use with the SQLite core library.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.PrepareRetries\">\n            <summary>\n            Gets/sets the maximum number of retries when preparing SQL to be executed.\n            This normally only applies to preparation errors resulting from the database\n            schema being changed.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.ProgressOps\">\n            <summary>\n            Gets/sets the approximate number of virtual machine instructions between\n            progress events.  In order for progress events to actually fire, the event\n            handler must be added to the <see cref=\"E:System.Data.SQLite.SQLiteConnection.Progress\"/> event\n            as well.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.Enlist\">\n            <summary>\n            Determines whether or not the connection will automatically participate\n            in the current distributed transaction (if one exists)\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.FailIfMissing\">\n            <summary>\n            If set to true, will throw an exception if the database specified in the connection\n            string does not exist.  If false, the database will be created automatically.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.LegacyFormat\">\n            <summary>\n            If enabled, uses the legacy 3.xx format for maximum compatibility, but results in larger\n            database sizes.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.ReadOnly\">\n            <summary>\n            When enabled, the database will be opened for read-only access and writing will be disabled.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.Password\">\n            <summary>\n            Gets/sets the database encryption password\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.HexPassword\">\n            <summary>\n            Gets/sets the database encryption hexadecimal password\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.PageSize\">\n            <summary>\n            Gets/Sets the page size for the connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.MaxPageCount\">\n            <summary>\n            Gets/Sets the maximum number of pages the database may hold\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.CacheSize\">\n            <summary>\n            Gets/Sets the cache size for the connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeFormat\">\n            <summary>\n            Gets/Sets the DateTime format for the connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeKind\">\n            <summary>\n            Gets/Sets the DateTime kind for the connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeFormatString\">\n            <summary>\n            Gets/sets the DateTime format string used for formatting\n            and parsing purposes.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.BaseSchemaName\">\n            <summary>\n            Gets/Sets the placeholder base schema name used for\n            .NET Framework compatibility purposes.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.JournalMode\">\n            <summary>\n            Determines how SQLite handles the transaction journal file.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.DefaultIsolationLevel\">\n            <summary>\n            Sets the default isolation level for transactions on the connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.DefaultDbType\">\n            <summary>\n            Gets/sets the default database type for the connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.DefaultTypeName\">\n            <summary>\n            Gets/sets the default type name for the connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.VfsName\">\n            <summary>\n            Gets/sets the VFS name for the connection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.ForeignKeys\">\n            <summary>\n            If enabled, use foreign key constraints\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.RecursiveTriggers\">\n            <summary>\n            Enable or disable the recursive trigger capability.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.ZipVfsVersion\">\n            <summary>\n            If non-null, this is the version of ZipVFS to use.  This requires the\n            System.Data.SQLite interop assembly -AND- primary managed assembly to\n            be compiled with the INTEROP_INCLUDE_ZIPVFS option; otherwise, this\n            property does nothing.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.Flags\">\n            <summary>\n            Gets/Sets the extra behavioral flags.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.SetDefaults\">\n            <summary>\n            If enabled, apply the default connection settings to opened databases.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.ToFullPath\">\n            <summary>\n            If enabled, attempt to resolve the provided data source file name to a\n            full path before opening.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.NoDefaultFlags\">\n            <summary>\n            If enabled, skip using the configured default connection flags.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteConnectionStringBuilder.NoSharedFlags\">\n            <summary>\n            If enabled, skip using the configured shared connection flags.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.TypeAffinity\">\n            <summary>\n            SQLite has very limited types, and is inherently text-based.  The first 5 types below represent the sum of all types SQLite\n            understands.  The DateTime extension to the spec is for internal use only.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.TypeAffinity.Uninitialized\">\n            <summary>\n            Not used\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.TypeAffinity.Int64\">\n            <summary>\n            All integers in SQLite default to Int64\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.TypeAffinity.Double\">\n            <summary>\n            All floating point numbers in SQLite default to double\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.TypeAffinity.Text\">\n            <summary>\n            The default data type of SQLite is text\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.TypeAffinity.Blob\">\n            <summary>\n            Typically blob types are only seen when returned from a function\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.TypeAffinity.Null\">\n            <summary>\n            Null types can be returned from functions\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.TypeAffinity.DateTime\">\n            <summary>\n            Used internally by this provider\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.TypeAffinity.None\">\n            <summary>\n            Used internally by this provider\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteConnectionEventType\">\n            <summary>\n            These are the event types associated with the\n            <see cref=\"T:System.Data.SQLite.SQLiteConnectionEventHandler\"/>\n            delegate (and its corresponding event) and the\n            <see cref=\"T:System.Data.SQLite.ConnectionEventArgs\"/> class.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.Invalid\">\n            <summary>\n            Not used.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.Unknown\">\n            <summary>\n            Not used.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.Opening\">\n            <summary>\n            The connection is being opened.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.ConnectionString\">\n            <summary>\n            The connection string has been parsed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.Opened\">\n            <summary>\n            The connection was opened.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.ChangeDatabase\">\n            <summary>\n            The <see cref=\"F:System.Data.SQLite.SQLiteConnectionEventType.ChangeDatabase\"/> method was called on the\n            connection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.NewTransaction\">\n            <summary>\n            A transaction was created using the connection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.EnlistTransaction\">\n            <summary>\n            The connection was enlisted into a transaction.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.NewCommand\">\n            <summary>\n            A command was created using the connection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.NewDataReader\">\n            <summary>\n            A data reader was created using the connection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.NewCriticalHandle\">\n            <summary>\n            An instance of a <see cref=\"T:System.Runtime.InteropServices.CriticalHandle\"/> derived class has\n            been created to wrap a native resource.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.Closing\">\n            <summary>\n            The connection is being closed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.Closed\">\n            <summary>\n            The connection was closed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.DisposingCommand\">\n            <summary>\n            A command is being disposed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.DisposingDataReader\">\n            <summary>\n            A data reader is being disposed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.ClosingDataReader\">\n            <summary>\n            A data reader is being closed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.OpenedFromPool\">\n            <summary>\n            A native resource was opened (i.e. obtained) from the pool.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteConnectionEventType.ClosedToPool\">\n            <summary>\n            A native resource was closed (i.e. released) to the pool.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteDateFormats\">\n             <summary>\n             This implementation of SQLite for ADO.NET can process date/time fields in\n             databases in one of six formats.\n             </summary>\n             <remarks>\n             ISO8601 format is more compatible, readable, fully-processable, but less\n             accurate as it does not provide time down to fractions of a second.\n             JulianDay is the numeric format the SQLite uses internally and is arguably\n             the most compatible with 3rd party tools.  It is not readable as text\n             without post-processing.  Ticks less compatible with 3rd party tools that\n             query the database, and renders the DateTime field unreadable as text\n             without post-processing.  UnixEpoch is more compatible with Unix systems.\n             InvariantCulture allows the configured format for the invariant culture\n             format to be used and is human readable.  CurrentCulture allows the\n             configured format for the current culture to be used and is also human\n             readable.\n            \n             The preferred order of choosing a DateTime format is JulianDay, ISO8601,\n             and then Ticks.  Ticks is mainly present for legacy code support.\n             </remarks>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDateFormats.Ticks\">\n            <summary>\n            Use the value of DateTime.Ticks.  This value is not recommended and is not well supported with LINQ.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDateFormats.ISO8601\">\n            <summary>\n            Use the ISO-8601 format.  Uses the \"yyyy-MM-dd HH:mm:ss.FFFFFFFK\" format for UTC DateTime values and\n            \"yyyy-MM-dd HH:mm:ss.FFFFFFF\" format for local DateTime values).\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDateFormats.JulianDay\">\n            <summary>\n            The interval of time in days and fractions of a day since January 1, 4713 BC.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDateFormats.UnixEpoch\">\n            <summary>\n            The whole number of seconds since the Unix epoch (January 1, 1970).\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDateFormats.InvariantCulture\">\n            <summary>\n            Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDateFormats.CurrentCulture\">\n            <summary>\n            Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDateFormats.Default\">\n            <summary>\n            The default format for this provider.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteJournalModeEnum\">\n             <summary>\n             This enum determines how SQLite treats its journal file.\n             </summary>\n             <remarks>\n             By default SQLite will create and delete the journal file when needed during a transaction.\n             However, for some computers running certain filesystem monitoring tools, the rapid\n             creation and deletion of the journal file can cause those programs to fail, or to interfere with SQLite.\n            \n             If a program or virus scanner is interfering with SQLite's journal file, you may receive errors like \"unable to open database file\"\n             when starting a transaction.  If this is happening, you may want to change the default journal mode to Persist.\n             </remarks>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteJournalModeEnum.Default\">\n            <summary>\n            The default mode, this causes SQLite to use the existing journaling mode for the database.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteJournalModeEnum.Delete\">\n            <summary>\n            SQLite will create and destroy the journal file as-needed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteJournalModeEnum.Persist\">\n            <summary>\n            When this is set, SQLite will keep the journal file even after a transaction has completed.  It's contents will be erased,\n            and the journal re-used as often as needed.  If it is deleted, it will be recreated the next time it is needed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteJournalModeEnum.Off\">\n            <summary>\n            This option disables the rollback journal entirely.  Interrupted transactions or a program crash can cause database\n            corruption in this mode!\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteJournalModeEnum.Truncate\">\n            <summary>\n            SQLite will truncate the journal file to zero-length instead of deleting it.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteJournalModeEnum.Memory\">\n            <summary>\n            SQLite will store the journal in volatile RAM.  This saves disk I/O but at the expense of database safety and integrity.\n            If the application using SQLite crashes in the middle of a transaction when the MEMORY journaling mode is set, then the\n            database file will very likely go corrupt.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteJournalModeEnum.Wal\">\n            <summary>\n            SQLite uses a write-ahead log instead of a rollback journal to implement transactions.  The WAL journaling mode is persistent;\n            after being set it stays in effect across multiple database connections and after closing and reopening the database. A database\n            in WAL journaling mode can only be accessed by SQLite version 3.7.0 or later.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteSynchronousEnum\">\n            <summary>\n            Possible values for the \"synchronous\" database setting.  This setting determines\n            how often the database engine calls the xSync method of the VFS.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteSynchronousEnum.Default\">\n            <summary>\n            Use the default \"synchronous\" database setting.  Currently, this should be\n            the same as using the FULL mode.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteSynchronousEnum.Off\">\n            <summary>\n            The database engine continues without syncing as soon as it has handed\n            data off to the operating system.  If the application running SQLite\n            crashes, the data will be safe, but the database might become corrupted\n            if the operating system crashes or the computer loses power before that\n            data has been written to the disk surface.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteSynchronousEnum.Normal\">\n            <summary>\n            The database engine will still sync at the most critical moments, but\n            less often than in FULL mode.  There is a very small (though non-zero)\n            chance that a power failure at just the wrong time could corrupt the\n            database in NORMAL mode.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteSynchronousEnum.Full\">\n            <summary>\n            The database engine will use the xSync method of the VFS to ensure that\n            all content is safely written to the disk surface prior to continuing.\n            This ensures that an operating system crash or power failure will not\n            corrupt the database.  FULL synchronous is very safe, but it is also\n            slower.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteExecuteType\">\n            <summary>\n            The requested command execution type.  This controls which method of the\n            <see cref=\"T:System.Data.SQLite.SQLiteCommand\"/> object will be called.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteExecuteType.None\">\n            <summary>\n            Do nothing.  No method will be called.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteExecuteType.NonQuery\">\n            <summary>\n            The command is not expected to return a result -OR- the result is not\n            needed.  The <see cref=\"M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery\"/> or\n            <see cref=\"M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(System.Data.CommandBehavior)\"/>  method\n            will be called.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteExecuteType.Scalar\">\n            <summary>\n            The command is expected to return a scalar result -OR- the result should\n            be limited to a scalar result.  The <see cref=\"M:System.Data.SQLite.SQLiteCommand.ExecuteScalar\"/>\n            or <see cref=\"M:System.Data.SQLite.SQLiteCommand.ExecuteScalar(System.Data.CommandBehavior)\"/> method will\n            be called.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteExecuteType.Reader\">\n            <summary>\n            The command is expected to return <see cref=\"T:System.Data.SQLite.SQLiteDataReader\"/> result.\n            The <see cref=\"M:System.Data.SQLite.SQLiteCommand.ExecuteReader\"/> or\n            <see cref=\"M:System.Data.SQLite.SQLiteCommand.ExecuteReader(System.Data.CommandBehavior)\"/> method will\n            be called.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteExecuteType.Default\">\n            <summary>\n            Use the default command execution type.  Using this value is the same\n            as using the <see cref=\"F:System.Data.SQLite.SQLiteExecuteType.NonQuery\"/> value.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteAuthorizerActionCode\">\n            <summary>\n            The action code responsible for the current call into the authorizer.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.None\">\n            <summary>\n            No action is being performed.  This value should not be used from\n            external code.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Copy\">\n            <summary>\n            No longer used.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateIndex\">\n             <summary>\n             An index will be created.  The action-specific arguments are the\n             index name and the table name.\n            \n             </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTable\">\n            <summary>\n            A table will be created.  The action-specific arguments are the\n            table name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempIndex\">\n            <summary>\n            A temporary index will be created.  The action-specific arguments\n            are the index name and the table name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempTable\">\n            <summary>\n            A temporary table will be created.  The action-specific arguments\n            are the table name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempTrigger\">\n            <summary>\n            A temporary trigger will be created.  The action-specific arguments\n            are the trigger name and the table name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempView\">\n            <summary>\n            A temporary view will be created.  The action-specific arguments are\n            the view name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTrigger\">\n            <summary>\n            A trigger will be created.  The action-specific arguments are the\n            trigger name and the table name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateView\">\n            <summary>\n            A view will be created.  The action-specific arguments are the view\n            name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Delete\">\n            <summary>\n            A DELETE statement will be executed.  The action-specific arguments\n            are the table name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropIndex\">\n            <summary>\n            An index will be dropped.  The action-specific arguments are the\n            index name and the table name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTable\">\n            <summary>\n            A table will be dropped.  The action-specific arguments are the tables\n            name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempIndex\">\n            <summary>\n            A temporary index will be dropped.  The action-specific arguments are\n            the index name and the table name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempTable\">\n            <summary>\n            A temporary table will be dropped.  The action-specific arguments are\n            the table name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempTrigger\">\n            <summary>\n            A temporary trigger will be dropped.  The action-specific arguments\n            are the trigger name and the table name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempView\">\n            <summary>\n            A temporary view will be dropped.  The action-specific arguments are\n            the view name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTrigger\">\n            <summary>\n            A trigger will be dropped.  The action-specific arguments are the\n            trigger name and the table name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropView\">\n            <summary>\n            A view will be dropped.  The action-specific arguments are the view\n            name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Insert\">\n            <summary>\n            An INSERT statement will be executed.  The action-specific arguments\n            are the table name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Pragma\">\n            <summary>\n            A PRAGMA statement will be executed.  The action-specific arguments\n            are the name of the PRAGMA and the new value or a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Read\">\n            <summary>\n            A table column will be read.  The action-specific arguments are the\n            table name and the column name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Select\">\n            <summary>\n            A SELECT statement will be executed.  The action-specific arguments\n            are both null values.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Transaction\">\n            <summary>\n            A transaction will be started, committed, or rolled back.  The\n            action-specific arguments are the name of the operation (BEGIN,\n            COMMIT, or ROLLBACK) and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Update\">\n            <summary>\n            An UPDATE statement will be executed.  The action-specific arguments\n            are the table name and the column name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Attach\">\n            <summary>\n            A database will be attached to the connection.  The action-specific\n            arguments are the database file name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Detach\">\n            <summary>\n            A database will be detached from the connection.  The action-specific\n            arguments are the database name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.AlterTable\">\n            <summary>\n            The schema of a table will be altered.  The action-specific arguments\n            are the database name and the table name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Reindex\">\n            <summary>\n            An index will be deleted and then recreated.  The action-specific\n            arguments are the index name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Analyze\">\n            <summary>\n            A table will be analyzed to gathers statistics about it.  The\n            action-specific arguments are the table name and a null value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateVtable\">\n            <summary>\n            A virtual table will be created.  The action-specific arguments are\n            the table name and the module name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropVtable\">\n            <summary>\n            A virtual table will be dropped.  The action-specific arguments are\n            the table name and the module name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Function\">\n            <summary>\n            A SQL function will be called.  The action-specific arguments are a\n            null value and the function name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Savepoint\">\n            <summary>\n            A savepoint will be created, released, or rolled back.  The\n            action-specific arguments are the name of the operation (BEGIN,\n            RELEASE, or ROLLBACK) and the savepoint name.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerActionCode.Recursive\">\n            <summary>\n            A recursive query will be executed.  The action-specific arguments\n            are two null values.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteProgressReturnCode\">\n            <summary>\n            The possible return codes for the progress callback.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteProgressReturnCode.Continue\">\n            <summary>\n            The operation should continue.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteProgressReturnCode.Interrupt\">\n            <summary>\n            The operation should be interrupted.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteAuthorizerReturnCode\">\n            <summary>\n            The return code for the current call into the authorizer.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Ok\">\n            <summary>\n            The action will be allowed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Deny\">\n            <summary>\n            The overall action will be disallowed and an error message will be\n            returned from the query preparation method.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Ignore\">\n            <summary>\n            The specific action will be disallowed; however, the overall action\n            will continue.  The exact effects of this return code vary depending\n            on the specific action, please refer to the SQLite core library\n            documentation for futher details.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteType\">\n            <summary>\n            Class used internally to determine the datatype of a column in a resultset\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteType.Type\">\n            <summary>\n            The DbType of the column, or DbType.Object if it cannot be determined\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteType.Affinity\">\n            <summary>\n            The affinity of a column, used for expressions or when Type is DbType.Object\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteType.#ctor\">\n            <summary>\n            Constructs a default instance of this type.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteType.#ctor(System.Data.SQLite.TypeAffinity,System.Data.DbType)\">\n            <summary>\n            Constructs an instance of this type with the specified field values.\n            </summary>\n            <param name=\"affinity\">\n            The type affinity to use for the new instance.\n            </param>\n            <param name=\"type\">\n            The database type to use for the new instance.\n            </param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteDataAdapter\">\n            <summary>\n            SQLite implementation of DbDataAdapter.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataAdapter.#ctor\">\n            <overloads>\n            This class is just a shell around the DbDataAdapter.  Nothing from\n            DbDataAdapter is overridden here, just a few constructors are defined.\n            </overloads>\n            <summary>\n            Default constructor.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.Data.SQLite.SQLiteCommand)\">\n            <summary>\n            Constructs a data adapter using the specified select command.\n            </summary>\n            <param name=\"cmd\">\n            The select command to associate with the adapter.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.Data.SQLite.SQLiteConnection)\">\n            <summary>\n            Constructs a data adapter with the supplied select command text and\n            associated with the specified connection.\n            </summary>\n            <param name=\"commandText\">\n            The select command text to associate with the data adapter.\n            </param>\n            <param name=\"connection\">\n            The connection to associate with the select command.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.String)\">\n            <summary>\n            Constructs a data adapter with the specified select command text,\n            and using the specified database connection string.\n            </summary>\n            <param name=\"commandText\">\n            The select command text to use to construct a select command.\n            </param>\n            <param name=\"connectionString\">\n            A connection string suitable for passing to a new SQLiteConnection,\n            which is associated with the select command.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.String,System.Boolean)\">\n            <summary>\n            Constructs a data adapter with the specified select command text,\n            and using the specified database connection string.\n            </summary>\n            <param name=\"commandText\">\n            The select command text to use to construct a select command.\n            </param>\n            <param name=\"connectionString\">\n            A connection string suitable for passing to a new SQLiteConnection,\n            which is associated with the select command.\n            </param>\n            <param name=\"parseViaFramework\">\n            Non-zero to parse the connection string using the built-in (i.e.\n            framework provided) parser when opening the connection.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataAdapter.Dispose(System.Boolean)\">\n            <summary>\n            Cleans up resources (native and managed) associated with the current instance.\n            </summary>\n            <param name=\"disposing\">\n            Zero when being disposed via garbage collection; otherwise, non-zero.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataAdapter.OnRowUpdating(System.Data.Common.RowUpdatingEventArgs)\">\n            <summary>\n            Raised by the underlying DbDataAdapter when a row is being updated\n            </summary>\n            <param name=\"value\">The event's specifics</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataAdapter.OnRowUpdated(System.Data.Common.RowUpdatedEventArgs)\">\n            <summary>\n            Raised by DbDataAdapter after a row is updated\n            </summary>\n            <param name=\"value\">The event's specifics</param>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteDataAdapter.RowUpdating\">\n            <summary>\n            Row updating event handler\n            </summary>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteDataAdapter.RowUpdated\">\n            <summary>\n            Row updated event handler\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDataAdapter.SelectCommand\">\n            <summary>\n            Gets/sets the select command for this DataAdapter\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDataAdapter.InsertCommand\">\n            <summary>\n            Gets/sets the insert command for this DataAdapter\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDataAdapter.UpdateCommand\">\n            <summary>\n            Gets/sets the update command for this DataAdapter\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDataAdapter.DeleteCommand\">\n            <summary>\n            Gets/sets the delete command for this DataAdapter\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteDataReader\">\n            <summary>\n            SQLite implementation of DbDataReader.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._command\">\n            <summary>\n            Underlying command this reader is attached to\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._flags\">\n            <summary>\n            The flags pertaining to the associated connection (via the command).\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._activeStatementIndex\">\n            <summary>\n            Index of the current statement in the command being processed\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._activeStatement\">\n            <summary>\n            Current statement being Read()\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._readingState\">\n            <summary>\n            State of the current statement being processed.\n            -1 = First Step() executed, so the first Read() will be ignored\n             0 = Actively reading\n             1 = Finished reading\n             2 = Non-row-returning statement, no records\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._rowsAffected\">\n            <summary>\n            Number of records affected by the insert/update statements executed on the command\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._fieldCount\">\n            <summary>\n            Count of fields (columns) in the row-returning statement currently being processed\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._stepCount\">\n            <summary>\n            The number of calls to Step() that have returned true (i.e. the number of rows that\n            have been read in the current result set).\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._fieldIndexes\">\n            <summary>\n            Maps the field (column) names to their corresponding indexes within the results.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._fieldTypeArray\">\n            <summary>\n            Datatypes of active fields (columns) in the current statement, used for type-restricting data\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._commandBehavior\">\n            <summary>\n            The behavior of the datareader\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._disposeCommand\">\n            <summary>\n            If set, then dispose of the command object when the reader is finished\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._throwOnDisposed\">\n            <summary>\n            If set, then raise an exception when the object is accessed after being disposed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._keyInfo\">\n            <summary>\n            An array of rowid's for the active statement if CommandBehavior.KeyInfo is specified\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._version\">\n            <summary>\n            Matches the version of the connection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDataReader._baseSchemaName\">\n            <summary>\n            The \"stub\" (i.e. placeholder) base schema name to use when returning\n            column schema information.  Matches the base schema name used by the\n            associated connection.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.#ctor(System.Data.SQLite.SQLiteCommand,System.Data.CommandBehavior)\">\n            <summary>\n            Internal constructor, initializes the datareader and sets up to begin executing statements\n            </summary>\n            <param name=\"cmd\">The SQLiteCommand this data reader is for</param>\n            <param name=\"behave\">The expected behavior of the data reader</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.Dispose(System.Boolean)\">\n            <summary>\n            Dispose of all resources used by this datareader.\n            </summary>\n            <param name=\"disposing\"></param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.Close\">\n            <summary>\n            Closes the datareader, potentially closing the connection as well if CommandBehavior.CloseConnection was specified.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.CheckClosed\">\n            <summary>\n            Throw an error if the datareader is closed\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.CheckValidRow\">\n            <summary>\n            Throw an error if a row is not loaded\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetEnumerator\">\n            <summary>\n            Enumerator support\n            </summary>\n            <returns>Returns a DbEnumerator object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.RefreshFlags\">\n            <summary>\n            Forces the connection flags cached by this data reader to be refreshed\n            from the underlying connection.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.VerifyForGet\">\n            <summary>\n            This method is used to make sure the result set is open and a row is currently available.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.VerifyType(System.Int32,System.Data.DbType)\">\n             <summary>\n             SQLite is inherently un-typed.  All datatypes in SQLite are natively strings.  The definition of the columns of a table\n             and the affinity of returned types are all we have to go on to type-restrict data in the reader.\n            \n             This function attempts to verify that the type of data being requested of a column matches the datatype of the column.  In\n             the case of columns that are not backed into a table definition, we attempt to match up the affinity of a column (int, double, string or blob)\n             to a set of known types that closely match that affinity.  It's not an exact science, but its the best we can do.\n             </summary>\n             <returns>\n             This function throws an InvalidTypeCast() exception if the requested type doesn't match the column's definition or affinity.\n             </returns>\n             <param name=\"i\">The index of the column to type-check</param>\n             <param name=\"typ\">The type we want to get out of the column</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetBoolean(System.Int32)\">\n            <summary>\n            Retrieves the column as a boolean value\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>bool</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetByte(System.Int32)\">\n            <summary>\n            Retrieves the column as a single byte value\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>byte</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetBytes(System.Int32,System.Int64,System.Byte[],System.Int32,System.Int32)\">\n            <summary>\n            Retrieves a column as an array of bytes (blob)\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <param name=\"fieldOffset\">The zero-based index of where to begin reading the data</param>\n            <param name=\"buffer\">The buffer to write the bytes into</param>\n            <param name=\"bufferoffset\">The zero-based index of where to begin writing into the array</param>\n            <param name=\"length\">The number of bytes to retrieve</param>\n            <returns>The actual number of bytes written into the array</returns>\n            <remarks>\n            To determine the number of bytes in the column, pass a null value for the buffer.  The total length will be returned.\n            </remarks>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetChar(System.Int32)\">\n            <summary>\n            Returns the column as a single character\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>char</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetChars(System.Int32,System.Int64,System.Char[],System.Int32,System.Int32)\">\n            <summary>\n            Retrieves a column as an array of chars (blob)\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <param name=\"fieldoffset\">The zero-based index of where to begin reading the data</param>\n            <param name=\"buffer\">The buffer to write the characters into</param>\n            <param name=\"bufferoffset\">The zero-based index of where to begin writing into the array</param>\n            <param name=\"length\">The number of bytes to retrieve</param>\n            <returns>The actual number of characters written into the array</returns>\n            <remarks>\n            To determine the number of characters in the column, pass a null value for the buffer.  The total length will be returned.\n            </remarks>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetDataTypeName(System.Int32)\">\n            <summary>\n            Retrieves the name of the back-end datatype of the column\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>string</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetDateTime(System.Int32)\">\n            <summary>\n            Retrieve the column as a date/time value\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>DateTime</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetDecimal(System.Int32)\">\n            <summary>\n            Retrieve the column as a decimal value\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>decimal</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetDouble(System.Int32)\">\n            <summary>\n            Returns the column as a double\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>double</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetFieldType(System.Int32)\">\n            <summary>\n            Returns the .NET type of a given column\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>Type</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetFloat(System.Int32)\">\n            <summary>\n            Returns a column as a float value\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>float</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetGuid(System.Int32)\">\n            <summary>\n            Returns the column as a Guid\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>Guid</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetInt16(System.Int32)\">\n            <summary>\n            Returns the column as a short\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>Int16</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetInt32(System.Int32)\">\n            <summary>\n            Retrieves the column as an int\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>Int32</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetInt64(System.Int32)\">\n            <summary>\n            Retrieves the column as a long\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>Int64</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetName(System.Int32)\">\n            <summary>\n            Retrieves the name of the column\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>string</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetDatabaseName(System.Int32)\">\n            <summary>\n            Returns the name of the database associated with the specified column.\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>string</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetTableName(System.Int32)\">\n            <summary>\n            Returns the name of the table associated with the specified column.\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>string</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetOriginalName(System.Int32)\">\n            <summary>\n            Returns the original name of the specified column.\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>string</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetOrdinal(System.String)\">\n            <summary>\n            Retrieves the i of a column, given its name\n            </summary>\n            <param name=\"name\">The name of the column to retrieve</param>\n            <returns>The int i of the column</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetSchemaTable\">\n            <summary>\n            Schema information in SQLite is difficult to map into .NET conventions, so a lot of work must be done\n            to gather the necessary information so it can be represented in an ADO.NET manner.\n            </summary>\n            <returns>Returns a DataTable containing the schema information for the active SELECT statement being processed.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetString(System.Int32)\">\n            <summary>\n            Retrieves the column as a string\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>string</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetValue(System.Int32)\">\n            <summary>\n            Retrieves the column as an object corresponding to the underlying datatype of the column\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>object</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetValues(System.Object[])\">\n            <summary>\n            Retreives the values of multiple columns, up to the size of the supplied array\n            </summary>\n            <param name=\"values\">The array to fill with values from the columns in the current resultset</param>\n            <returns>The number of columns retrieved</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetValues\">\n            <summary>\n            Returns a collection containing all the column names and values for the\n            current row of data in the current resultset, if any.  If there is no\n            current row or no current resultset, an exception may be thrown.\n            </summary>\n            <returns>\n            The collection containing the column name and value information for the\n            current row of data in the current resultset or null if this information\n            cannot be obtained.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.IsDBNull(System.Int32)\">\n            <summary>\n            Returns True if the specified column is null\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>True or False</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.NextResult\">\n            <summary>\n            Moves to the next resultset in multiple row-returning SQL command.\n            </summary>\n            <returns>True if the command was successful and a new resultset is available, False otherwise.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetConnection(System.Data.SQLite.SQLiteDataReader)\">\n            <summary>\n            This method attempts to query the database connection associated with\n            the data reader in use.  If the underlying command or connection is\n            unavailable, a null value will be returned.\n            </summary>\n            <returns>\n            The connection object -OR- null if it is unavailable.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetSQLiteType(System.Data.SQLite.SQLiteType,System.String)\">\n            <summary>\n            Retrieves the SQLiteType for a given column and row value.\n            </summary>\n            <param name=\"oldType\">\n            The original SQLiteType structure, based only on the column.\n            </param>\n            <param name=\"text\">\n            The textual value of the column for a given row.\n            </param>\n            <returns>\n            The SQLiteType structure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.GetSQLiteType(System.Data.SQLite.SQLiteConnectionFlags,System.Int32)\">\n            <summary>\n            Retrieves the SQLiteType for a given column, and caches it to avoid repetetive interop calls.\n            </summary>\n            <param name=\"flags\">The flags associated with the parent connection object.</param>\n            <param name=\"i\">The index of the column.</param>\n            <returns>A SQLiteType structure</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDataReader.Read\">\n            <summary>\n            Reads the next row from the resultset\n            </summary>\n            <returns>True if a new row was successfully loaded and is ready for processing</returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDataReader.Depth\">\n            <summary>\n            Not implemented.  Returns 0\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDataReader.FieldCount\">\n            <summary>\n            Returns the number of columns in the current resultset\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDataReader.StepCount\">\n            <summary>\n            Returns the number of rows seen so far in the current result set.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDataReader.VisibleFieldCount\">\n            <summary>\n            Returns the number of visible fields in the current resultset\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDataReader.HasRows\">\n            <summary>\n            Returns True if the resultset has rows that can be fetched\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDataReader.IsClosed\">\n            <summary>\n            Returns True if the data reader is closed\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDataReader.RecordsAffected\">\n            <summary>\n            Returns the number of rows affected by the statement being executed.\n            The value returned may not be accurate for DDL statements.  Also, it\n            will be -1 for any statement that does not modify the database (e.g.\n            SELECT).  If an otherwise read-only statement modifies the database\n            indirectly (e.g. via a virtual table or user-defined function), the\n            value returned is undefined.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDataReader.Item(System.String)\">\n            <summary>\n            Indexer to retrieve data from a column given its name\n            </summary>\n            <param name=\"name\">The name of the column to retrieve data for</param>\n            <returns>The value contained in the column</returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDataReader.Item(System.Int32)\">\n            <summary>\n            Indexer to retrieve data from a column given its i\n            </summary>\n            <param name=\"i\">The index of the column.</param>\n            <returns>The value contained in the column</returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteException\">\n            <summary>\n            SQLite exception class.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Private constructor for use with serialization.\n            </summary>\n            <param name=\"info\">\n            Holds the serialized object data about the exception being thrown.\n            </param>\n            <param name=\"context\">\n            Contains contextual information about the source or destination.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteException.#ctor(System.Data.SQLite.SQLiteErrorCode,System.String)\">\n            <summary>\n            Public constructor for generating a SQLite exception given the error\n            code and message.\n            </summary>\n            <param name=\"errorCode\">\n            The SQLite return code to report.\n            </param>\n            <param name=\"message\">\n            Message text to go along with the return code message text.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteException.#ctor(System.String)\">\n            <summary>\n            Public constructor that uses the base class constructor for the error\n            message.\n            </summary>\n            <param name=\"message\">Error message text.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteException.#ctor\">\n            <summary>\n            Public constructor that uses the default base class constructor.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Public constructor that uses the base class constructor for the error\n            message and inner exception.\n            </summary>\n            <param name=\"message\">Error message text.</param>\n            <param name=\"innerException\">The original (inner) exception.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteException.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)\">\n            <summary>\n            Adds extra information to the serialized object data specific to this\n            class type.  This is only used for serialization.\n            </summary>\n            <param name=\"info\">\n            Holds the serialized object data about the exception being thrown.\n            </param>\n            <param name=\"context\">\n            Contains contextual information about the source or destination.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteException.GetErrorString(System.Data.SQLite.SQLiteErrorCode)\">\n            <summary>\n            Returns the error message for the specified SQLite return code.\n            </summary>\n            <param name=\"errorCode\">The SQLite return code.</param>\n            <returns>The error message or null if it cannot be found.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteException.GetStockErrorMessage(System.Data.SQLite.SQLiteErrorCode,System.String)\">\n            <summary>\n            Returns the composite error message based on the SQLite return code\n            and the optional detailed error message.\n            </summary>\n            <param name=\"errorCode\">The SQLite return code.</param>\n            <param name=\"message\">Optional detailed error message.</param>\n            <returns>Error message text for the return code.</returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteException.ResultCode\">\n            <summary>\n            Gets the associated SQLite result code for this exception as a\n            <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/>.  This property returns the same\n            underlying value as the <see cref=\"P:System.Data.SQLite.SQLiteException.ErrorCode\"/> property.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteException.ErrorCode\">\n            <summary>\n            Gets the associated SQLite return code for this exception as an\n            <see cref=\"T:System.Int32\"/>.  For desktop versions of the .NET Framework,\n            this property overrides the property of the same name within the\n            <see cref=\"T:System.Runtime.InteropServices.ExternalException\"/>\n            class.  This property returns the same underlying value as the\n            <see cref=\"P:System.Data.SQLite.SQLiteException.ResultCode\"/> property.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteErrorCode\">\n            <summary>\n            SQLite error codes.  Actually, this enumeration represents a return code,\n            which may also indicate success in one of several ways (e.g. SQLITE_OK,\n            SQLITE_ROW, and SQLITE_DONE).  Therefore, the name of this enumeration is\n            something of a misnomer.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Unknown\">\n            <summary>\n            The error code is unknown.  This error code\n            is only used by the managed wrapper itself.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Ok\">\n            <summary>\n            Successful result\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Error\">\n            <summary>\n            SQL error or missing database\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Internal\">\n            <summary>\n            Internal logic error in SQLite\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Perm\">\n            <summary>\n            Access permission denied\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Abort\">\n            <summary>\n            Callback routine requested an abort\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Busy\">\n            <summary>\n            The database file is locked\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Locked\">\n            <summary>\n            A table in the database is locked\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.NoMem\">\n            <summary>\n            A malloc() failed\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.ReadOnly\">\n            <summary>\n            Attempt to write a readonly database\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Interrupt\">\n            <summary>\n            Operation terminated by sqlite3_interrupt()\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr\">\n            <summary>\n            Some kind of disk I/O error occurred\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Corrupt\">\n            <summary>\n            The database disk image is malformed\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.NotFound\">\n            <summary>\n            Unknown opcode in sqlite3_file_control()\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Full\">\n            <summary>\n            Insertion failed because database is full\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.CantOpen\">\n            <summary>\n            Unable to open the database file\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Protocol\">\n            <summary>\n            Database lock protocol error\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Empty\">\n            <summary>\n            Database is empty\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Schema\">\n            <summary>\n            The database schema changed\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.TooBig\">\n            <summary>\n            String or BLOB exceeds size limit\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Constraint\">\n            <summary>\n            Abort due to constraint violation\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Mismatch\">\n            <summary>\n            Data type mismatch\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Misuse\">\n            <summary>\n            Library used incorrectly\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.NoLfs\">\n            <summary>\n            Uses OS features not supported on host\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Auth\">\n            <summary>\n            Authorization denied\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Format\">\n            <summary>\n            Auxiliary database format error\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Range\">\n            <summary>\n            2nd parameter to sqlite3_bind out of range\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.NotADb\">\n            <summary>\n            File opened that is not a database file\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Notice\">\n            <summary>\n            Notifications from sqlite3_log()\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Warning\">\n            <summary>\n            Warnings from sqlite3_log()\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Row\">\n            <summary>\n            sqlite3_step() has another row ready\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Done\">\n            <summary>\n            sqlite3_step() has finished executing\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.NonExtendedMask\">\n            <summary>\n            Used to mask off extended result codes\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Read\">\n            <summary>\n            A file read operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Short_Read\">\n            <summary>\n            A file read operation returned less data than requested.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Write\">\n            <summary>\n            A file write operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Fsync\">\n            <summary>\n            A file synchronization operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Dir_Fsync\">\n            <summary>\n            A directory synchronization operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Truncate\">\n            <summary>\n            A file truncate operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Fstat\">\n            <summary>\n            A file metadata operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Unlock\">\n            <summary>\n            A file unlock operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_RdLock\">\n            <summary>\n            A file lock operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Delete\">\n            <summary>\n            A file delete operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Blocked\">\n            <summary>\n            Not currently used.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_NoMem\">\n            <summary>\n            Out-of-memory during a file operation.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Access\">\n            <summary>\n            A file existence/status operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_CheckReservedLock\">\n            <summary>\n            A check for a reserved lock failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Lock\">\n            <summary>\n            A file lock operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Close\">\n            <summary>\n            A file close operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Dir_Close\">\n            <summary>\n            A directory close operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_ShmOpen\">\n            <summary>\n            A shared memory open operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_ShmSize\">\n            <summary>\n            A shared memory size operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_ShmLock\">\n            <summary>\n            A shared memory lock operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_ShmMap\">\n            <summary>\n            A shared memory map operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Seek\">\n            <summary>\n            A file seek operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Delete_NoEnt\">\n            <summary>\n            A file delete operation failed because it does not exist.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Mmap\">\n            <summary>\n            A file memory mapping operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_GetTempPath\">\n            <summary>\n            The temporary directory path could not be obtained.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_ConvPath\">\n            <summary>\n            A path string conversion operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_VNode\">\n            <summary>\n            Reserved.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.IoErr_Auth\">\n            <summary>\n            An attempt to authenticate failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Locked_SharedCache\">\n            <summary>\n            A database table is locked in shared-cache mode.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Busy_Recovery\">\n            <summary>\n            A database file is locked due to a recovery operation.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Busy_Snapshot\">\n            <summary>\n            A database file is locked due to snapshot semantics.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.CantOpen_NoTempDir\">\n            <summary>\n            A database file cannot be opened because no temporary directory is available.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.CantOpen_IsDir\">\n            <summary>\n            A database file cannot be opened because its path represents a directory.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.CantOpen_FullPath\">\n            <summary>\n            A database file cannot be opened because its full path could not be obtained.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.CantOpen_ConvPath\">\n            <summary>\n            A database file cannot be opened because a path string conversion operation failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Corrupt_Vtab\">\n            <summary>\n            A virtual table is malformed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.ReadOnly_Recovery\">\n            <summary>\n            A database file is read-only due to a recovery operation.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.ReadOnly_CantLock\">\n            <summary>\n            A database file is read-only because a lock could not be obtained.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.ReadOnly_Rollback\">\n            <summary>\n            A database file is read-only because it needs rollback processing.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.ReadOnly_DbMoved\">\n            <summary>\n            A database file is read-only because it was moved while open.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Abort_Rollback\">\n            <summary>\n            An operation is being aborted due to rollback processing.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Constraint_Check\">\n            <summary>\n            A CHECK constraint failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Constraint_CommitHook\">\n            <summary>\n            A commit hook produced a unsuccessful return code.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Constraint_ForeignKey\">\n            <summary>\n            A FOREIGN KEY constraint failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Constraint_Function\">\n            <summary>\n            Not currently used.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Constraint_NotNull\">\n            <summary>\n            A NOT NULL constraint failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Constraint_PrimaryKey\">\n            <summary>\n            A PRIMARY KEY constraint failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Constraint_Trigger\">\n            <summary>\n            The RAISE function was used by a trigger-program.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Constraint_Unique\">\n            <summary>\n            A UNIQUE constraint failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Constraint_Vtab\">\n            <summary>\n            Not currently used.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Constraint_RowId\">\n            <summary>\n            A ROWID constraint failed.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Notice_Recover_Wal\">\n            <summary>\n            Frames were recovered from the WAL log file.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Notice_Recover_Rollback\">\n            <summary>\n            Pages were recovered from the journal file.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Warning_AutoIndex\">\n            <summary>\n            An automatic index was created to process a query.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteErrorCode.Auth_User\">\n            <summary>\n            User authentication failed.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteFactory\">\n            <summary>\n            SQLite implementation of <see cref=\"T:System.Data.Common.DbProviderFactory\"/>.\n            </summary>\n            <summary>\n            SQLite implementation of <see cref=\"T:System.IServiceProvider\"/>.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFactory.#ctor\">\n            <summary>\n            Constructs a new instance.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFactory.Dispose\">\n            <summary>\n            Cleans up resources (native and managed) associated with the current instance.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFactory.Finalize\">\n            <summary>\n            Cleans up resources associated with the current instance.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteFactory.Instance\">\n            <summary>\n            Static instance member which returns an instanced <see cref=\"T:System.Data.SQLite.SQLiteFactory\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFactory.CreateCommand\">\n            <summary>\n            Creates and returns a new <see cref=\"T:System.Data.SQLite.SQLiteCommand\"/> object.\n            </summary>\n            <returns>The new object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFactory.CreateCommandBuilder\">\n            <summary>\n            Creates and returns a new <see cref=\"T:System.Data.SQLite.SQLiteCommandBuilder\"/> object.\n            </summary>\n            <returns>The new object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFactory.CreateConnection\">\n            <summary>\n            Creates and returns a new <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> object.\n            </summary>\n            <returns>The new object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFactory.CreateConnectionStringBuilder\">\n            <summary>\n            Creates and returns a new <see cref=\"T:System.Data.SQLite.SQLiteConnectionStringBuilder\"/> object.\n            </summary>\n            <returns>The new object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFactory.CreateDataAdapter\">\n            <summary>\n            Creates and returns a new <see cref=\"T:System.Data.SQLite.SQLiteDataAdapter\"/> object.\n            </summary>\n            <returns>The new object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFactory.CreateParameter\">\n            <summary>\n            Creates and returns a new <see cref=\"T:System.Data.SQLite.SQLiteParameter\"/> object.\n            </summary>\n            <returns>The new object.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFactory.System#IServiceProvider#GetService(System.Type)\">\n            <summary>\n            Will provide a <see cref=\"T:System.IServiceProvider\"/> object in .NET 3.5.\n            </summary>\n            <param name=\"serviceType\">The class or interface type to query for.</param>\n            <returns></returns>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteFactory.Log\">\n            <summary>\n            This event is raised whenever SQLite raises a logging event.\n            Note that this should be set as one of the first things in the\n            application.  This event is provided for backward compatibility only.\n            New code should use the <see cref=\"T:System.Data.SQLite.SQLiteLog\"/> class instead.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteFunction\">\n             <summary>\n             This abstract class is designed to handle user-defined functions easily.  An instance of the derived class is made for each\n             connection to the database.\n             </summary>\n             <remarks>\n             Although there is one instance of a class derived from SQLiteFunction per database connection, the derived class has no access\n             to the underlying connection.  This is necessary to deter implementers from thinking it would be a good idea to make database\n             calls during processing.\n            \n             It is important to distinguish between a per-connection instance, and a per-SQL statement context.  One instance of this class\n             services all SQL statements being stepped through on that connection, and there can be many.  One should never store per-statement\n             information in member variables of user-defined function classes.\n            \n             For aggregate functions, always create and store your per-statement data in the contextData object on the 1st step.  This data will\n             be automatically freed for you (and Dispose() called if the item supports IDisposable) when the statement completes.\n             </remarks>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteFunction._base\">\n            <summary>\n            The base connection this function is attached to\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteFunction._contextDataList\">\n            <summary>\n            Internal array used to keep track of aggregate function context data\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteFunction._flags\">\n            <summary>\n            The connection flags associated with this object (this should be the\n            same value as the flags associated with the parent connection object).\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteFunction._InvokeFunc\">\n            <summary>\n            Holds a reference to the callback function for user functions\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteFunction._StepFunc\">\n            <summary>\n            Holds a reference to the callbakc function for stepping in an aggregate function\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteFunction._FinalFunc\">\n            <summary>\n            Holds a reference to the callback function for finalizing an aggregate function\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteFunction._CompareFunc\">\n            <summary>\n            Holds a reference to the callback function for collating sequences\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteFunction._context\">\n            <summary>\n            Current context of the current callback.  Only valid during a callback\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteFunction._registeredFunctions\">\n            <summary>\n            This static dictionary contains all the registered (known) user-defined\n            functions declared using the proper attributes.  The contained dictionary\n            values are always null and are not currently used.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.#ctor\">\n            <summary>\n            Internal constructor, initializes the function's internal variables.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.Boolean)\">\n            <summary>\n            Constructs an instance of this class using the specified data-type\n            conversion parameters.\n            </summary>\n            <param name=\"format\">\n            The DateTime format to be used when converting string values to a\n            DateTime and binding DateTime parameters.\n            </param>\n            <param name=\"kind\">\n            The <see cref=\"T:System.DateTimeKind\"/> to be used when creating DateTime\n            values.\n            </param>\n            <param name=\"formatString\">\n            The format string to be used when parsing and formatting DateTime\n            values.\n            </param>\n            <param name=\"utf16\">\n            Non-zero to create a UTF-16 data-type conversion context; otherwise,\n            a UTF-8 data-type conversion context will be created.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.Dispose\">\n            <summary>\n            Disposes of any active contextData variables that were not automatically cleaned up.  Sometimes this can happen if\n            someone closes the connection while a DataReader is open.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.Dispose(System.Boolean)\">\n            <summary>\n            Placeholder for a user-defined disposal routine\n            </summary>\n            <param name=\"disposing\">True if the object is being disposed explicitly</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.Finalize\">\n            <summary>\n            Cleans up resources associated with the current instance.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.Invoke(System.Object[])\">\n            <summary>\n            Scalar functions override this method to do their magic.\n            </summary>\n            <remarks>\n            Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available\n            to force them into a certain type.  Therefore the only types you will ever see as parameters are\n            DBNull.Value, Int64, Double, String or byte[] array.\n            </remarks>\n            <param name=\"args\">The arguments for the command to process</param>\n            <returns>You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or\n            you may return an Exception-derived class if you wish to return an error to SQLite.  Do not actually throw the error,\n            just return it!</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.Step(System.Object[],System.Int32,System.Object@)\">\n            <summary>\n            Aggregate functions override this method to do their magic.\n            </summary>\n            <remarks>\n            Typically you'll be updating whatever you've placed in the contextData field and returning as quickly as possible.\n            </remarks>\n            <param name=\"args\">The arguments for the command to process</param>\n            <param name=\"stepNumber\">The 1-based step number.  This is incrememted each time the step method is called.</param>\n            <param name=\"contextData\">A placeholder for implementers to store contextual data pertaining to the current context.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.Final(System.Object)\">\n            <summary>\n            Aggregate functions override this method to finish their aggregate processing.\n            </summary>\n            <remarks>\n            If you implemented your aggregate function properly,\n            you've been recording and keeping track of your data in the contextData object provided, and now at this stage you should have\n            all the information you need in there to figure out what to return.\n            NOTE:  It is possible to arrive here without receiving a previous call to Step(), in which case the contextData will\n            be null.  This can happen when no rows were returned.  You can either return null, or 0 or some other custom return value\n            if that is the case.\n            </remarks>\n            <param name=\"contextData\">Your own assigned contextData, provided for you so you can return your final results.</param>\n            <returns>You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or\n            you may return an Exception-derived class if you wish to return an error to SQLite.  Do not actually throw the error,\n            just return it!\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.Compare(System.String,System.String)\">\n            <summary>\n            User-defined collating sequences override this method to provide a custom string sorting algorithm.\n            </summary>\n            <param name=\"param1\">The first string to compare.</param>\n            <param name=\"param2\">The second strnig to compare.</param>\n            <returns>1 if param1 is greater than param2, 0 if they are equal, or -1 if param1 is less than param2.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.ConvertParams(System.Int32,System.IntPtr)\">\n            <summary>\n            Converts an IntPtr array of context arguments to an object array containing the resolved parameters the pointers point to.\n            </summary>\n            <remarks>\n            Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available\n            to force them into a certain type.  Therefore the only types you will ever see as parameters are\n            DBNull.Value, Int64, Double, String or byte[] array.\n            </remarks>\n            <param name=\"nArgs\">The number of arguments</param>\n            <param name=\"argsptr\">A pointer to the array of arguments</param>\n            <returns>An object array of the arguments once they've been converted to .NET values</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.SetReturnValue(System.IntPtr,System.Object)\">\n            <summary>\n            Takes the return value from Invoke() and Final() and figures out how to return it to SQLite's context.\n            </summary>\n            <param name=\"context\">The context the return value applies to</param>\n            <param name=\"returnValue\">The parameter to return to SQLite</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.ScalarCallback(System.IntPtr,System.Int32,System.IntPtr)\">\n            <summary>\n            Internal scalar callback function, which wraps the raw context pointer and calls the virtual Invoke() method.\n            WARNING: Must not throw exceptions.\n            </summary>\n            <param name=\"context\">A raw context pointer</param>\n            <param name=\"nArgs\">Number of arguments passed in</param>\n            <param name=\"argsptr\">A pointer to the array of arguments</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.CompareCallback(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\">\n            <summary>\n            Internal collating sequence function, which wraps up the raw string pointers and executes the Compare() virtual function.\n            WARNING: Must not throw exceptions.\n            </summary>\n            <param name=\"ptr\">Not used</param>\n            <param name=\"len1\">Length of the string pv1</param>\n            <param name=\"ptr1\">Pointer to the first string to compare</param>\n            <param name=\"len2\">Length of the string pv2</param>\n            <param name=\"ptr2\">Pointer to the second string to compare</param>\n            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater\n            than the second.  Returns 0 if an exception is caught.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.CompareCallback16(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\">\n            <summary>\n            Internal collating sequence function, which wraps up the raw string pointers and executes the Compare() virtual function.\n            WARNING: Must not throw exceptions.\n            </summary>\n            <param name=\"ptr\">Not used</param>\n            <param name=\"len1\">Length of the string pv1</param>\n            <param name=\"ptr1\">Pointer to the first string to compare</param>\n            <param name=\"len2\">Length of the string pv2</param>\n            <param name=\"ptr2\">Pointer to the second string to compare</param>\n            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater\n            than the second.  Returns 0 if an exception is caught.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.StepCallback(System.IntPtr,System.Int32,System.IntPtr)\">\n            <summary>\n            The internal aggregate Step function callback, which wraps the raw context pointer and calls the virtual Step() method.\n            WARNING: Must not throw exceptions.\n            </summary>\n            <remarks>\n            This function takes care of doing the lookups and getting the important information put together to call the Step() function.\n            That includes pulling out the user's contextData and updating it after the call is made.  We use a sorted list for this so\n            binary searches can be done to find the data.\n            </remarks>\n            <param name=\"context\">A raw context pointer</param>\n            <param name=\"nArgs\">Number of arguments passed in</param>\n            <param name=\"argsptr\">A pointer to the array of arguments</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.FinalCallback(System.IntPtr)\">\n            <summary>\n            An internal aggregate Final function callback, which wraps the context pointer and calls the virtual Final() method.\n            WARNING: Must not throw exceptions.\n            </summary>\n            <param name=\"context\">A raw context pointer</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.#cctor\">\n            <summary>\n            Using reflection, enumerate all assemblies in the current appdomain looking for classes that\n            have a SQLiteFunctionAttribute attribute, and registering them accordingly.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.RegisterFunction(System.Type)\">\n            <summary>\n            Manual method of registering a function.  The type must still have the SQLiteFunctionAttributes in order to work\n            properly, but this is a workaround for the Compact Framework where enumerating assemblies is not currently supported.\n            </summary>\n            <param name=\"typ\">The type of the function to register</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.RegisterFunction(System.String,System.Int32,System.Data.SQLite.FunctionType,System.Type,System.Delegate,System.Delegate)\">\n            <summary>\n            Alternative method of registering a function.  This method\n            does not require the specified type to be annotated with\n            <see cref=\"T:System.Data.SQLite.SQLiteFunctionAttribute\"/>.\n            </summary>\n            <param name=\"name\">\n            The name of the function to register.\n            </param>\n            <param name=\"argumentCount\">\n            The number of arguments accepted by the function.\n            </param>\n            <param name=\"functionType\">\n            The type of SQLite function being resitered (e.g. scalar,\n            aggregate, or collating sequence).\n            </param>\n            <param name=\"instanceType\">\n            The <see cref=\"T:System.Type\"/> that actually implements the function.\n            This will only be used if the <paramref name=\"callback1\"/>\n            and <paramref name=\"callback2\"/> parameters are null.\n            </param>\n            <param name=\"callback1\">\n            The <see cref=\"T:System.Delegate\"/> to be used for all calls into the\n            <see cref=\"M:System.Data.SQLite.SQLiteFunction.Invoke(System.Object[])\"/>,\n            <see cref=\"M:System.Data.SQLite.SQLiteFunction.Step(System.Object[],System.Int32,System.Object@)\"/>,\n            and <see cref=\"M:System.Data.SQLite.SQLiteFunction.Compare(System.String,System.String)\"/> virtual methods.\n            </param>\n            <param name=\"callback2\">\n            The <see cref=\"T:System.Delegate\"/> to be used for all calls into the\n            <see cref=\"M:System.Data.SQLite.SQLiteFunction.Final(System.Object)\"/> virtual method.  This\n            parameter is only necessary for aggregate functions.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.ReplaceFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Object)\">\n            <summary>\n            Replaces a registered function, disposing of the associated (old)\n            value if necessary.\n            </summary>\n            <param name=\"at\">\n            The attribute that describes the function to replace.\n            </param>\n            <param name=\"newValue\">\n            The new value to use.\n            </param>\n            <returns>\n            Non-zero if an existing registered function was replaced; otherwise,\n            zero.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.CreateFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction@)\">\n            <summary>\n            Creates a <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> instance based on the specified\n            <see cref=\"T:System.Data.SQLite.SQLiteFunctionAttribute\"/>.\n            </summary>\n            <param name=\"functionAttribute\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunctionAttribute\"/> containing the metadata about\n            the function to create.\n            </param>\n            <param name=\"function\">\n            The created function -OR- null if the function could not be created.\n            </param>\n            <returns>\n            Non-zero if the function was created; otherwise, zero.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.BindFunctions(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteConnectionFlags)\">\n            <summary>\n            Called by the SQLiteBase derived classes, this method binds all registered (known) user-defined functions to a connection.\n            It is done this way so that all user-defined functions will access the database using the same encoding scheme\n            as the connection (UTF-8 or UTF-16).\n            </summary>\n            <remarks>\n            The wrapper functions that interop with SQLite will create a unique cookie value, which internally is a pointer to\n            all the wrapped callback functions.  The interop function uses it to map CDecl callbacks to StdCall callbacks.\n            </remarks>\n            <param name=\"sqlbase\">The base object on which the functions are to bind.</param>\n            <param name=\"flags\">The flags associated with the parent connection object.</param>\n            <returns>Returns a logical list of functions which the connection should retain until it is closed.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.UnbindAllFunctions(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteConnectionFlags,System.Boolean)\">\n            <summary>\n            Called by the SQLiteBase derived classes, this method unbinds all registered (known)\n            functions -OR- all previously bound user-defined functions from a connection.\n            </summary>\n            <param name=\"sqlbase\">The base object from which the functions are to be unbound.</param>\n            <param name=\"flags\">The flags associated with the parent connection object.</param>\n            <param name=\"registered\">\n            Non-zero to unbind all registered (known) functions -OR- zero to unbind all functions\n            currently bound to the connection.\n            </param>\n            <returns>Non-zero if all the specified user-defined functions were unbound.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.BindFunction(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)\">\n            <summary>\n            This function binds a user-defined function to a connection.\n            </summary>\n            <param name=\"sqliteBase\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteBase\"/> object instance associated with the\n            <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> that the function should be bound to.\n            </param>\n            <param name=\"functionAttribute\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunctionAttribute\"/> object instance containing\n            the metadata for the function to be bound.\n            </param>\n            <param name=\"function\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> object instance that implements the\n            function to be bound.\n            </param>\n            <param name=\"flags\">\n            The flags associated with the parent connection object.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunction.UnbindFunction(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)\">\n            <summary>\n            This function unbinds a user-defined functions from a connection.\n            </summary>\n            <param name=\"sqliteBase\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteBase\"/> object instance associated with the\n            <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> that the function should be bound to.\n            </param>\n            <param name=\"functionAttribute\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunctionAttribute\"/> object instance containing\n            the metadata for the function to be bound.\n            </param>\n            <param name=\"function\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> object instance that implements the\n            function to be bound.\n            </param>\n            <param name=\"flags\">\n            The flags associated with the parent connection object.\n            </param>\n            <returns>Non-zero if the function was unbound.</returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteFunction.SQLiteConvert\">\n            <summary>\n            Returns a reference to the underlying connection's SQLiteConvert class, which can be used to convert\n            strings and DateTime's into the current connection's encoding schema.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteInvokeDelegate\">\n            <summary>\n            This <see cref=\"T:System.Delegate\"/> type is used with the\n            <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Invoke(System.Object[])\"/> method.\n            </summary>\n            <param name=\"param0\">\n            This is always the string literal \"Invoke\".\n            </param>\n            <param name=\"args\">\n            The arguments for the scalar function.\n            </param>\n            <returns>\n            The result of the scalar function.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteStepDelegate\">\n            <summary>\n            This <see cref=\"T:System.Delegate\"/> type is used with the\n            <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Step(System.Object[],System.Int32,System.Object@)\"/> method.\n            </summary>\n            <param name=\"param0\">\n            This is always the string literal \"Step\".\n            </param>\n            <param name=\"args\">\n            The arguments for the aggregate function.\n            </param>\n            <param name=\"stepNumber\">\n            The step number (one based).  This is incrememted each time the\n            <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Step(System.Object[],System.Int32,System.Object@)\"/> method is called.\n            </param>\n            <param name=\"contextData\">\n            A placeholder for implementers to store contextual data pertaining\n            to the current context.\n            </param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteFinalDelegate\">\n            <summary>\n            This <see cref=\"T:System.Delegate\"/> type is used with the\n            <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Final(System.Object)\"/> method.\n            </summary>\n            <param name=\"param0\">\n            This is always the string literal \"Final\".\n            </param>\n            <param name=\"contextData\">\n            A placeholder for implementers to store contextual data pertaining\n            to the current context.\n            </param>\n            <returns>\n            The result of the aggregate function.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteCompareDelegate\">\n            <summary>\n            This <see cref=\"T:System.Delegate\"/> type is used with the\n            <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Compare(System.String,System.String)\"/> method.\n            </summary>\n            <param name=\"param0\">\n            This is always the string literal \"Compare\".\n            </param>\n            <param name=\"param1\">\n            The first string to compare.\n            </param>\n            <param name=\"param2\">\n            The second strnig to compare.\n            </param>\n            <returns>\n            A positive integer if the <paramref name=\"param1\"/> parameter is\n            greater than the <paramref name=\"param2\"/> parameter, a negative\n            integer if the <paramref name=\"param1\"/> parameter is less than\n            the <paramref name=\"param2\"/> parameter, or zero if they are\n            equal.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteDelegateFunction\">\n            <summary>\n            This class implements a SQLite function using a <see cref=\"T:System.Delegate\"/>.\n            All the virtual methods of the <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> class are\n            implemented using calls to the <see cref=\"T:System.Data.SQLite.SQLiteInvokeDelegate\"/>,\n            <see cref=\"T:System.Data.SQLite.SQLiteStepDelegate\"/>, <see cref=\"T:System.Data.SQLite.SQLiteFinalDelegate\"/>,\n            and <see cref=\"T:System.Data.SQLite.SQLiteCompareDelegate\"/> strongly typed delegate types\n            or via the <see cref=\"M:System.Delegate.DynamicInvoke(System.Object[])\"/> method.\n            The arguments are presented in the same order they appear in\n            the associated <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> methods with one exception:\n            the first argument is the name of the virtual method being implemented.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDelegateFunction.NoCallbackError\">\n            <summary>\n            This error message is used by the overridden virtual methods when\n            a required <see cref=\"T:System.Delegate\"/> property (e.g.\n            <see cref=\"P:System.Data.SQLite.SQLiteDelegateFunction.Callback1\"/> or <see cref=\"P:System.Data.SQLite.SQLiteDelegateFunction.Callback2\"/>) has not been\n            set.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteDelegateFunction.ResultInt32Error\">\n            <summary>\n            This error message is used by the overridden <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Compare(System.String,System.String)\"/>\n            method when the result does not have a type of <see cref=\"T:System.Int32\"/>.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDelegateFunction.#ctor\">\n            <summary>\n            Constructs an empty instance of this class.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDelegateFunction.#ctor(System.Delegate,System.Delegate)\">\n            <summary>\n            Constructs an instance of this class using the specified\n            <see cref=\"T:System.Delegate\"/> as the <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/>\n            implementation.\n            </summary>\n            <param name=\"callback1\">\n            The <see cref=\"T:System.Delegate\"/> to be used for all calls into the\n            <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Invoke(System.Object[])\"/>, <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Step(System.Object[],System.Int32,System.Object@)\"/>, and\n            <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Compare(System.String,System.String)\"/> virtual methods needed by the\n            <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> base class.\n            </param>\n            <param name=\"callback2\">\n            The <see cref=\"T:System.Delegate\"/> to be used for all calls into the\n            <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Final(System.Object)\"/> virtual methods needed by the\n            <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> base class.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDelegateFunction.GetInvokeArgs(System.Object[],System.Boolean)\">\n            <summary>\n            Returns the list of arguments for the <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Invoke(System.Object[])\"/> method,\n            as an <see cref=\"T:System.Array\"/> of <see cref=\"T:System.Object\"/>.  The first\n            argument is always the literal string \"Invoke\".\n            </summary>\n            <param name=\"args\">\n            The original arguments received by the <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Invoke(System.Object[])\"/> method.\n            </param>\n            <param name=\"earlyBound\">\n            Non-zero if the returned arguments are going to be used with the\n            <see cref=\"T:System.Data.SQLite.SQLiteInvokeDelegate\"/> type; otherwise, zero.\n            </param>\n            <returns>\n            The arguments to pass to the configured <see cref=\"T:System.Delegate\"/>.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDelegateFunction.GetStepArgs(System.Object[],System.Int32,System.Object,System.Boolean)\">\n            <summary>\n            Returns the list of arguments for the <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Step(System.Object[],System.Int32,System.Object@)\"/> method,\n            as an <see cref=\"T:System.Array\"/> of <see cref=\"T:System.Object\"/>.  The first\n            argument is always the literal string \"Step\".\n            </summary>\n            <param name=\"args\">\n            The original arguments received by the <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Step(System.Object[],System.Int32,System.Object@)\"/> method.\n            </param>\n            <param name=\"stepNumber\">\n            The step number (one based).  This is incrememted each time the\n            <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Step(System.Object[],System.Int32,System.Object@)\"/> method is called.\n            </param>\n            <param name=\"contextData\">\n            A placeholder for implementers to store contextual data pertaining\n            to the current context.\n            </param>\n            <param name=\"earlyBound\">\n            Non-zero if the returned arguments are going to be used with the\n            <see cref=\"T:System.Data.SQLite.SQLiteStepDelegate\"/> type; otherwise, zero.\n            </param>\n            <returns>\n            The arguments to pass to the configured <see cref=\"T:System.Delegate\"/>.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDelegateFunction.UpdateStepArgs(System.Object[],System.Object@,System.Boolean)\">\n            <summary>\n            Updates the output arguments for the <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Step(System.Object[],System.Int32,System.Object@)\"/> method,\n            using an <see cref=\"T:System.Array\"/> of <see cref=\"T:System.Object\"/>.  The first\n            argument is always the literal string \"Step\".  Currently, only the\n            <paramref name=\"contextData\"/> parameter is updated.\n            </summary>\n            <param name=\"args\">\n            The original arguments received by the <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Step(System.Object[],System.Int32,System.Object@)\"/> method.\n            </param>\n            <param name=\"contextData\">\n            A placeholder for implementers to store contextual data pertaining\n            to the current context.\n            </param>\n            <param name=\"earlyBound\">\n            Non-zero if the returned arguments are going to be used with the\n            <see cref=\"T:System.Data.SQLite.SQLiteStepDelegate\"/> type; otherwise, zero.\n            </param>\n            <returns>\n            The arguments to pass to the configured <see cref=\"T:System.Delegate\"/>.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDelegateFunction.GetFinalArgs(System.Object,System.Boolean)\">\n            <summary>\n            Returns the list of arguments for the <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Final(System.Object)\"/> method,\n            as an <see cref=\"T:System.Array\"/> of <see cref=\"T:System.Object\"/>.  The first\n            argument is always the literal string \"Final\".\n            </summary>\n            <param name=\"contextData\">\n            A placeholder for implementers to store contextual data pertaining\n            to the current context.\n            </param>\n            <param name=\"earlyBound\">\n            Non-zero if the returned arguments are going to be used with the\n            <see cref=\"T:System.Data.SQLite.SQLiteFinalDelegate\"/> type; otherwise, zero.\n            </param>\n            <returns>\n            The arguments to pass to the configured <see cref=\"T:System.Delegate\"/>.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDelegateFunction.GetCompareArgs(System.String,System.String,System.Boolean)\">\n            <summary>\n            Returns the list of arguments for the <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Compare(System.String,System.String)\"/> method,\n            as an <see cref=\"T:System.Array\"/> of <see cref=\"T:System.Object\"/>.  The first\n            argument is always the literal string \"Compare\".\n            </summary>\n            <param name=\"param1\">\n            The first string to compare.\n            </param>\n            <param name=\"param2\">\n            The second strnig to compare.\n            </param>\n            <param name=\"earlyBound\">\n            Non-zero if the returned arguments are going to be used with the\n            <see cref=\"T:System.Data.SQLite.SQLiteCompareDelegate\"/> type; otherwise, zero.\n            </param>\n            <returns>\n            The arguments to pass to the configured <see cref=\"T:System.Delegate\"/>.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDelegateFunction.Invoke(System.Object[])\">\n            <summary>\n            This virtual method is the implementation for scalar functions.\n            See the <see cref=\"M:System.Data.SQLite.SQLiteFunction.Invoke(System.Object[])\"/> method for more\n            details.\n            </summary>\n            <param name=\"args\">\n            The arguments for the scalar function.\n            </param>\n            <returns>\n            The result of the scalar function.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDelegateFunction.Step(System.Object[],System.Int32,System.Object@)\">\n            <summary>\n            This virtual method is part of the implementation for aggregate\n            functions.  See the <see cref=\"M:System.Data.SQLite.SQLiteFunction.Step(System.Object[],System.Int32,System.Object@)\"/> method\n            for more details.\n            </summary>\n            <param name=\"args\">\n            The arguments for the aggregate function.\n            </param>\n            <param name=\"stepNumber\">\n            The step number (one based).  This is incrememted each time the\n            <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Step(System.Object[],System.Int32,System.Object@)\"/> method is called.\n            </param>\n            <param name=\"contextData\">\n            A placeholder for implementers to store contextual data pertaining\n            to the current context.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDelegateFunction.Final(System.Object)\">\n            <summary>\n            This virtual method is part of the implementation for aggregate\n            functions.  See the <see cref=\"M:System.Data.SQLite.SQLiteFunction.Final(System.Object)\"/> method\n            for more details.\n            </summary>\n            <param name=\"contextData\">\n            A placeholder for implementers to store contextual data pertaining\n            to the current context.\n            </param>\n            <returns>\n            The result of the aggregate function.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteDelegateFunction.Compare(System.String,System.String)\">\n            <summary>\n            This virtual method is part of the implementation for collating\n            sequences.  See the <see cref=\"M:System.Data.SQLite.SQLiteFunction.Compare(System.String,System.String)\"/> method\n            for more details.\n            </summary>\n            <param name=\"param1\">\n            The first string to compare.\n            </param>\n            <param name=\"param2\">\n            The second strnig to compare.\n            </param>\n            <returns>\n            A positive integer if the <paramref name=\"param1\"/> parameter is\n            greater than the <paramref name=\"param2\"/> parameter, a negative\n            integer if the <paramref name=\"param1\"/> parameter is less than\n            the <paramref name=\"param2\"/> parameter, or zero if they are\n            equal.\n            </returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDelegateFunction.Callback1\">\n            <summary>\n            The <see cref=\"T:System.Delegate\"/> to be used for all calls into the\n            <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Invoke(System.Object[])\"/>, <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Step(System.Object[],System.Int32,System.Object@)\"/>, and\n            <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Compare(System.String,System.String)\"/> virtual methods needed by the\n            <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> base class.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteDelegateFunction.Callback2\">\n            <summary>\n            The <see cref=\"T:System.Delegate\"/> to be used for all calls into the\n            <see cref=\"M:System.Data.SQLite.SQLiteDelegateFunction.Final(System.Object)\"/> virtual methods needed by the\n            <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> base class.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteFunctionEx\">\n            <summary>\n            Extends SQLiteFunction and allows an inherited class to obtain the collating sequence associated with a function call.\n            </summary>\n            <remarks>\n            User-defined functions can call the GetCollationSequence() method in this class and use it to compare strings and char arrays.\n            </remarks>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunctionEx.GetCollationSequence\">\n            <summary>\n            Obtains the collating sequence in effect for the given function.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunctionEx.Dispose(System.Boolean)\">\n            <summary>\n            Cleans up resources (native and managed) associated with the current instance.\n            </summary>\n            <param name=\"disposing\">\n            Zero when being disposed via garbage collection; otherwise, non-zero.\n            </param>\n        </member>\n        <member name=\"T:System.Data.SQLite.FunctionType\">\n            <summary>\n            The type of user-defined function to declare\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.FunctionType.Scalar\">\n            <summary>\n            Scalar functions are designed to be called and return a result immediately.  Examples include ABS(), Upper(), Lower(), etc.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.FunctionType.Aggregate\">\n            <summary>\n            Aggregate functions are designed to accumulate data until the end of a call and then return a result gleaned from the accumulated data.\n            Examples include SUM(), COUNT(), AVG(), etc.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.FunctionType.Collation\">\n            <summary>\n            Collating sequences are used to sort textual data in a custom manner, and appear in an ORDER BY clause.  Typically text in an ORDER BY is\n            sorted using a straight case-insensitive comparison function.  Custom collating sequences can be used to alter the behavior of text sorting\n            in a user-defined manner.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteCallback\">\n            <summary>\n            An internal callback delegate declaration.\n            </summary>\n            <param name=\"context\">Raw native context pointer for the user function.</param>\n            <param name=\"argc\">Total number of arguments to the user function.</param>\n            <param name=\"argv\">Raw native pointer to the array of raw native argument pointers.</param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteFinalCallback\">\n            <summary>\n            An internal final callback delegate declaration.\n            </summary>\n            <param name=\"context\">Raw context pointer for the user function</param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteCollation\">\n            <summary>\n            Internal callback delegate for implementing collating sequences\n            </summary>\n            <param name=\"puser\">Not used</param>\n            <param name=\"len1\">Length of the string pv1</param>\n            <param name=\"pv1\">Pointer to the first string to compare</param>\n            <param name=\"len2\">Length of the string pv2</param>\n            <param name=\"pv2\">Pointer to the second string to compare</param>\n            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater\n            than the second.</returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.CollationTypeEnum\">\n            <summary>\n            The type of collating sequence\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.CollationTypeEnum.Binary\">\n            <summary>\n            The built-in BINARY collating sequence\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.CollationTypeEnum.NoCase\">\n            <summary>\n            The built-in NOCASE collating sequence\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.CollationTypeEnum.Reverse\">\n            <summary>\n            The built-in REVERSE collating sequence\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.CollationTypeEnum.Custom\">\n            <summary>\n            A custom user-defined collating sequence\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.CollationEncodingEnum\">\n            <summary>\n            The encoding type the collation sequence uses\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.CollationEncodingEnum.UTF8\">\n            <summary>\n            The collation sequence is UTF8\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.CollationEncodingEnum.UTF16LE\">\n            <summary>\n            The collation sequence is UTF16 little-endian\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.CollationEncodingEnum.UTF16BE\">\n            <summary>\n            The collation sequence is UTF16 big-endian\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.CollationSequence\">\n            <summary>\n            A struct describing the collating sequence a function is executing in\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.CollationSequence.Name\">\n            <summary>\n            The name of the collating sequence\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.CollationSequence.Type\">\n            <summary>\n            The type of collating sequence\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.CollationSequence.Encoding\">\n            <summary>\n            The text encoding of the collation sequence\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.CollationSequence._func\">\n            <summary>\n            Context of the function that requested the collating sequence\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.CollationSequence.Compare(System.String,System.String)\">\n            <summary>\n            Calls the base collating sequence to compare two strings\n            </summary>\n            <param name=\"s1\">The first string to compare</param>\n            <param name=\"s2\">The second string to compare</param>\n            <returns>-1 if s1 is less than s2, 0 if s1 is equal to s2, and 1 if s1 is greater than s2</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.CollationSequence.Compare(System.Char[],System.Char[])\">\n            <summary>\n            Calls the base collating sequence to compare two character arrays\n            </summary>\n            <param name=\"c1\">The first array to compare</param>\n            <param name=\"c2\">The second array to compare</param>\n            <returns>-1 if c1 is less than c2, 0 if c1 is equal to c2, and 1 if c1 is greater than c2</returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteFunctionAttribute\">\n            <summary>\n            A simple custom attribute to enable us to easily find user-defined functions in\n            the loaded assemblies and initialize them in SQLite as connections are made.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunctionAttribute.#ctor\">\n            <summary>\n            Default constructor, initializes the internal variables for the function.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteFunctionAttribute.#ctor(System.String,System.Int32,System.Data.SQLite.FunctionType)\">\n            <summary>\n            Constructs an instance of this class.  This sets the initial\n            <see cref=\"P:System.Data.SQLite.SQLiteFunctionAttribute.InstanceType\"/>, <see cref=\"P:System.Data.SQLite.SQLiteFunctionAttribute.Callback1\"/>, and\n            <see cref=\"P:System.Data.SQLite.SQLiteFunctionAttribute.Callback2\"/> properties to null.\n            </summary>\n            <param name=\"name\">\n            The name of the function, as seen by the SQLite core library.\n            </param>\n            <param name=\"argumentCount\">\n            The number of arguments that the function will accept.\n            </param>\n            <param name=\"functionType\">\n            The type of function being declared.  This will either be Scalar,\n            Aggregate, or Collation.\n            </param>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteFunctionAttribute.Name\">\n            <summary>\n            The function's name as it will be used in SQLite command text.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteFunctionAttribute.Arguments\">\n            <summary>\n            The number of arguments this function expects.  -1 if the number of arguments is variable.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteFunctionAttribute.FuncType\">\n            <summary>\n            The type of function this implementation will be.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteFunctionAttribute.InstanceType\">\n            <summary>\n            The <see cref=\"T:System.Type\"/> object instance that describes the class\n            containing the implementation for the associated function.  The value of\n            this property will not be used if either the <see cref=\"P:System.Data.SQLite.SQLiteFunctionAttribute.Callback1\"/> or\n            <see cref=\"P:System.Data.SQLite.SQLiteFunctionAttribute.Callback2\"/> property values are set to non-null.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteFunctionAttribute.Callback1\">\n            <summary>\n            The <see cref=\"T:System.Delegate\"/> that refers to the implementation for the\n            associated function.  If this property value is set to non-null, it will\n            be used instead of the <see cref=\"P:System.Data.SQLite.SQLiteFunctionAttribute.InstanceType\"/> property value.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteFunctionAttribute.Callback2\">\n            <summary>\n            The <see cref=\"T:System.Delegate\"/> that refers to the implementation for the\n            associated function.  If this property value is set to non-null, it will\n            be used instead of the <see cref=\"P:System.Data.SQLite.SQLiteFunctionAttribute.InstanceType\"/> property value.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteKeyReader\">\n            <summary>\n            This class provides key info for a given SQLite statement.\n            <remarks>\n            Providing key information for a given statement is non-trivial :(\n            </remarks>\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteKeyReader.#ctor(System.Data.SQLite.SQLiteConnection,System.Data.SQLite.SQLiteDataReader,System.Data.SQLite.SQLiteStatement)\">\n            <summary>\n            This function does all the nasty work at determining what keys need to be returned for\n            a given statement.\n            </summary>\n            <param name=\"cnn\"></param>\n            <param name=\"reader\"></param>\n            <param name=\"stmt\"></param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteKeyReader.Sync\">\n            <summary>\n            Make sure all the subqueries are open and ready and sync'd with the current rowid\n            of the table they're supporting\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteKeyReader.Reset\">\n            <summary>\n            Release any readers on any subqueries\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteKeyReader.AppendSchemaTable(System.Data.DataTable)\">\n            <summary>\n            Append all the columns we've added to the original query to the schema\n            </summary>\n            <param name=\"tbl\"></param>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteKeyReader.Count\">\n            <summary>\n            How many additional columns of keyinfo we're holding\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteKeyReader.KeyInfo\">\n            <summary>\n            Used to support CommandBehavior.KeyInfo\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteKeyReader.KeyQuery\">\n            <summary>\n            A single sub-query for a given table/database.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.LogEventArgs\">\n            <summary>\n            Event data for logging event handlers.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.LogEventArgs.ErrorCode\">\n            <summary>\n            The error code.  The type of this object value should be\n            <see cref=\"T:System.Int32\"/> or <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/>.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.LogEventArgs.Message\">\n            <summary>\n            SQL statement text as the statement first begins executing\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.LogEventArgs.Data\">\n            <summary>\n            Extra data associated with this event, if any.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.LogEventArgs.#ctor(System.IntPtr,System.Object,System.String,System.Object)\">\n            <summary>\n            Constructs the object.\n            </summary>\n            <param name=\"pUserData\">Should be null.</param>\n            <param name=\"errorCode\">\n            The error code.  The type of this object value should be\n            <see cref=\"T:System.Int32\"/> or <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/>.\n            </param>\n            <param name=\"message\">The error message, if any.</param>\n            <param name=\"data\">The extra data, if any.</param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteLogEventHandler\">\n            <summary>\n            Raised when a log event occurs.\n            </summary>\n            <param name=\"sender\">The current connection</param>\n            <param name=\"e\">Event arguments of the trace</param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteLog\">\n            <summary>\n            Manages the SQLite custom logging functionality and the associated\n            callback for the whole process.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteLog.syncRoot\">\n            <summary>\n            Object used to synchronize access to the static instance data\n            for this class.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteLog._domainUnload\">\n            <summary>\n            Member variable to store the AppDomain.DomainUnload event handler.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteLog._defaultHandler\">\n            <summary>\n            The default log event handler.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteLog._callback\">\n            <summary>\n            The log callback passed to native SQLite engine.  This must live\n            as long as the SQLite library has a pointer to it.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteLog._sql\">\n            <summary>\n            The base SQLite object to interop with.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteLog._enabled\">\n            <summary>\n            This will be non-zero if logging is currently enabled.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteLog.Initialize\">\n            <summary>\n            Initializes the SQLite logging facilities.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteLog.DomainUnload(System.Object,System.EventArgs)\">\n            <summary>\n            Handles the AppDomain being unloaded.\n            </summary>\n            <param name=\"sender\">Should be null.</param>\n            <param name=\"e\">The data associated with this event.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteLog.LogMessage(System.String)\">\n            <summary>\n            Log a message to all the registered log event handlers without going\n            through the SQLite library.\n            </summary>\n            <param name=\"message\">The message to be logged.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteLog.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)\">\n            <summary>\n            Log a message to all the registered log event handlers without going\n            through the SQLite library.\n            </summary>\n            <param name=\"errorCode\">The SQLite error code.</param>\n            <param name=\"message\">The message to be logged.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteLog.LogMessage(System.Int32,System.String)\">\n            <summary>\n            Log a message to all the registered log event handlers without going\n            through the SQLite library.\n            </summary>\n            <param name=\"errorCode\">The integer error code.</param>\n            <param name=\"message\">The message to be logged.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteLog.LogMessage(System.Object,System.String)\">\n            <summary>\n            Log a message to all the registered log event handlers without going\n            through the SQLite library.\n            </summary>\n            <param name=\"errorCode\">\n            The error code.  The type of this object value should be\n            System.Int32 or SQLiteErrorCode.\n            </param>\n            <param name=\"message\">The message to be logged.</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteLog.InitializeDefaultHandler\">\n            <summary>\n            Creates and initializes the default log event handler.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteLog.AddDefaultHandler\">\n            <summary>\n            Adds the default log event handler to the list of handlers.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteLog.RemoveDefaultHandler\">\n            <summary>\n            Removes the default log event handler from the list of handlers.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteLog.LogCallback(System.IntPtr,System.Int32,System.IntPtr)\">\n             <summary>\n             Internal proxy function that calls any registered application log\n             event handlers.\n            \n             WARNING: This method is used more-or-less directly by native code,\n                      do not modify its type signature.\n             </summary>\n             <param name=\"pUserData\">\n             The extra data associated with this message, if any.\n             </param>\n             <param name=\"errorCode\">\n             The error code associated with this message.\n             </param>\n             <param name=\"pMessage\">\n             The message string to be logged.\n             </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteLog.LogEventHandler(System.Object,System.Data.SQLite.LogEventArgs)\">\n            <summary>\n            Default logger.  Currently, uses the Trace class (i.e. sends events\n            to the current trace listeners, if any).\n            </summary>\n            <param name=\"sender\">Should be null.</param>\n            <param name=\"e\">The data associated with this event.</param>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteLog._handlers\">\n            <summary>\n            Member variable to store the application log handler to call.\n            </summary>\n        </member>\n        <member name=\"E:System.Data.SQLite.SQLiteLog.Log\">\n            <summary>\n            This event is raised whenever SQLite raises a logging event.\n            Note that this should be set as one of the first things in the\n            application.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteLog.Enabled\">\n            <summary>\n            If this property is true, logging is enabled; otherwise, logging is\n            disabled.  When logging is disabled, no logging events will fire.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteMetaDataCollectionNames\">\n            <summary>\n            MetaDataCollections specific to SQLite\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Catalogs\">\n            <summary>\n            Returns a list of databases attached to the connection\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Columns\">\n            <summary>\n            Returns column information for the specified table\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Indexes\">\n            <summary>\n            Returns index information for the optionally-specified table\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteMetaDataCollectionNames.IndexColumns\">\n            <summary>\n            Returns base columns for the given index\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Tables\">\n            <summary>\n            Returns the tables in the given catalog\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Views\">\n            <summary>\n            Returns user-defined views in the given catalog\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteMetaDataCollectionNames.ViewColumns\">\n            <summary>\n            Returns underlying column information on the given view\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteMetaDataCollectionNames.ForeignKeys\">\n            <summary>\n            Returns foreign key information for the given catalog\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Triggers\">\n            <summary>\n            Returns the triggers on the database\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteParameter\">\n            <summary>\n            SQLite implementation of DbParameter.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteParameter.UnknownDbType\">\n            <summary>\n            This value represents an \"unknown\" <see cref=\"P:System.Data.SQLite.SQLiteParameter.DbType\"/>.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteParameter._command\">\n            <summary>\n            The command associated with this parameter.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteParameter._dbType\">\n            <summary>\n            The data type of the parameter\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteParameter._rowVersion\">\n            <summary>\n            The version information for mapping the parameter\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteParameter._objValue\">\n            <summary>\n            The value of the data in the parameter\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteParameter._sourceColumn\">\n            <summary>\n            The source column for the parameter\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteParameter._parameterName\">\n            <summary>\n            The column name\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteParameter._dataSize\">\n            <summary>\n            The data size, unused by SQLite\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.IDbCommand)\">\n            <summary>\n            Constructor used when creating for use with a specific command.\n            </summary>\n            <param name=\"command\">\n            The command associated with this parameter.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor\">\n            <summary>\n            Default constructor\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.String)\">\n            <summary>\n            Constructs a named parameter given the specified parameter name\n            </summary>\n            <param name=\"parameterName\">The parameter name</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Object)\">\n            <summary>\n            Constructs a named parameter given the specified parameter name and initial value\n            </summary>\n            <param name=\"parameterName\">The parameter name</param>\n            <param name=\"value\">The initial value of the parameter</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType)\">\n            <summary>\n            Constructs a named parameter of the specified type\n            </summary>\n            <param name=\"parameterName\">The parameter name</param>\n            <param name=\"dbType\">The datatype of the parameter</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.String)\">\n            <summary>\n            Constructs a named parameter of the specified type and source column reference\n            </summary>\n            <param name=\"parameterName\">The parameter name</param>\n            <param name=\"dbType\">The data type</param>\n            <param name=\"sourceColumn\">The source column</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.String,System.Data.DataRowVersion)\">\n            <summary>\n            Constructs a named parameter of the specified type, source column and row version\n            </summary>\n            <param name=\"parameterName\">The parameter name</param>\n            <param name=\"dbType\">The data type</param>\n            <param name=\"sourceColumn\">The source column</param>\n            <param name=\"rowVersion\">The row version information</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType)\">\n            <summary>\n            Constructs an unnamed parameter of the specified data type\n            </summary>\n            <param name=\"dbType\">The datatype of the parameter</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Object)\">\n            <summary>\n            Constructs an unnamed parameter of the specified data type and sets the initial value\n            </summary>\n            <param name=\"dbType\">The datatype of the parameter</param>\n            <param name=\"value\">The initial value of the parameter</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.String)\">\n            <summary>\n            Constructs an unnamed parameter of the specified data type and source column\n            </summary>\n            <param name=\"dbType\">The datatype of the parameter</param>\n            <param name=\"sourceColumn\">The source column</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.String,System.Data.DataRowVersion)\">\n            <summary>\n            Constructs an unnamed parameter of the specified data type, source column and row version\n            </summary>\n            <param name=\"dbType\">The data type</param>\n            <param name=\"sourceColumn\">The source column</param>\n            <param name=\"rowVersion\">The row version information</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32)\">\n            <summary>\n            Constructs a named parameter of the specified type and size\n            </summary>\n            <param name=\"parameterName\">The parameter name</param>\n            <param name=\"parameterType\">The data type</param>\n            <param name=\"parameterSize\">The size of the parameter</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.String)\">\n            <summary>\n            Constructs a named parameter of the specified type, size and source column\n            </summary>\n            <param name=\"parameterName\">The name of the parameter</param>\n            <param name=\"parameterType\">The data type</param>\n            <param name=\"parameterSize\">The size of the parameter</param>\n            <param name=\"sourceColumn\">The source column</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.String,System.Data.DataRowVersion)\">\n            <summary>\n            Constructs a named parameter of the specified type, size, source column and row version\n            </summary>\n            <param name=\"parameterName\">The name of the parameter</param>\n            <param name=\"parameterType\">The data type</param>\n            <param name=\"parameterSize\">The size of the parameter</param>\n            <param name=\"sourceColumn\">The source column</param>\n            <param name=\"rowVersion\">The row version information</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.Data.ParameterDirection,System.Boolean,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Object)\">\n            <summary>\n            Constructs a named parameter of the specified type, size, source column and row version\n            </summary>\n            <param name=\"parameterName\">The name of the parameter</param>\n            <param name=\"parameterType\">The data type</param>\n            <param name=\"parameterSize\">The size of the parameter</param>\n            <param name=\"direction\">Only input parameters are supported in SQLite</param>\n            <param name=\"isNullable\">Ignored</param>\n            <param name=\"precision\">Ignored</param>\n            <param name=\"scale\">Ignored</param>\n            <param name=\"sourceColumn\">The source column</param>\n            <param name=\"rowVersion\">The row version information</param>\n            <param name=\"value\">The initial value to assign the parameter</param>   \n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.Data.ParameterDirection,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Boolean,System.Object)\">\n            <summary>\n            Constructs a named parameter, yet another flavor\n            </summary>\n            <param name=\"parameterName\">The name of the parameter</param>\n            <param name=\"parameterType\">The data type</param>\n            <param name=\"parameterSize\">The size of the parameter</param>\n            <param name=\"direction\">Only input parameters are supported in SQLite</param>\n            <param name=\"precision\">Ignored</param>\n            <param name=\"scale\">Ignored</param>\n            <param name=\"sourceColumn\">The source column</param>\n            <param name=\"rowVersion\">The row version information</param>\n            <param name=\"sourceColumnNullMapping\">Whether or not this parameter is for comparing NULL's</param>\n            <param name=\"value\">The intial value to assign the parameter</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32)\">\n            <summary>\n            Constructs an unnamed parameter of the specified type and size\n            </summary>\n            <param name=\"parameterType\">The data type</param>\n            <param name=\"parameterSize\">The size of the parameter</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32,System.String)\">\n            <summary>\n            Constructs an unnamed parameter of the specified type, size, and source column\n            </summary>\n            <param name=\"parameterType\">The data type</param>\n            <param name=\"parameterSize\">The size of the parameter</param>\n            <param name=\"sourceColumn\">The source column</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32,System.String,System.Data.DataRowVersion)\">\n            <summary>\n            Constructs an unnamed parameter of the specified type, size, source column and row version\n            </summary>\n            <param name=\"parameterType\">The data type</param>\n            <param name=\"parameterSize\">The size of the parameter</param>\n            <param name=\"sourceColumn\">The source column</param>\n            <param name=\"rowVersion\">The row version information</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.ResetDbType\">\n            <summary>\n            Resets the DbType of the parameter so it can be inferred from the value\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameter.Clone\">\n            <summary>\n            Clones a parameter\n            </summary>\n            <returns>A new, unassociated SQLiteParameter</returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameter.Command\">\n            <summary>\n            The command associated with this parameter.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameter.IsNullable\">\n            <summary>\n            Whether or not the parameter can contain a null value\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameter.DbType\">\n            <summary>\n            Returns the datatype of the parameter\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameter.Direction\">\n            <summary>\n            Supports only input parameters\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameter.ParameterName\">\n            <summary>\n            Returns the parameter name\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameter.Size\">\n            <summary>\n            Returns the size of the parameter\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameter.SourceColumn\">\n            <summary>\n            Gets/sets the source column\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameter.SourceColumnNullMapping\">\n            <summary>\n            Used by DbCommandBuilder to determine the mapping for nullable fields\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameter.SourceVersion\">\n            <summary>\n            Gets and sets the row version\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameter.Value\">\n            <summary>\n            Gets and sets the parameter value.  If no datatype was specified, the datatype will assume the type from the value given.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteParameterCollection\">\n            <summary>\n            SQLite implementation of DbParameterCollection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteParameterCollection._command\">\n            <summary>\n            The underlying command to which this collection belongs\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteParameterCollection._parameterList\">\n            <summary>\n            The internal array of parameters in this collection\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteParameterCollection._unboundFlag\">\n            <summary>\n            Determines whether or not all parameters have been bound to their statement(s)\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.#ctor(System.Data.SQLite.SQLiteCommand)\">\n            <summary>\n            Initializes the collection\n            </summary>\n            <param name=\"cmd\">The command to which the collection belongs</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.GetEnumerator\">\n            <summary>\n            Retrieves an enumerator for the collection\n            </summary>\n            <returns>An enumerator for the underlying array</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType,System.Int32,System.String)\">\n            <summary>\n            Adds a parameter to the collection\n            </summary>\n            <param name=\"parameterName\">The parameter name</param>\n            <param name=\"parameterType\">The data type</param>\n            <param name=\"parameterSize\">The size of the value</param>\n            <param name=\"sourceColumn\">The source column</param>\n            <returns>A SQLiteParameter object</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType,System.Int32)\">\n            <summary>\n            Adds a parameter to the collection\n            </summary>\n            <param name=\"parameterName\">The parameter name</param>\n            <param name=\"parameterType\">The data type</param>\n            <param name=\"parameterSize\">The size of the value</param>\n            <returns>A SQLiteParameter object</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType)\">\n            <summary>\n            Adds a parameter to the collection\n            </summary>\n            <param name=\"parameterName\">The parameter name</param>\n            <param name=\"parameterType\">The data type</param>\n            <returns>A SQLiteParameter object</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.Add(System.Data.SQLite.SQLiteParameter)\">\n            <summary>\n            Adds a parameter to the collection\n            </summary>\n            <param name=\"parameter\">The parameter to add</param>\n            <returns>A zero-based index of where the parameter is located in the array</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.Add(System.Object)\">\n            <summary>\n            Adds a parameter to the collection\n            </summary>\n            <param name=\"value\">The parameter to add</param>\n            <returns>A zero-based index of where the parameter is located in the array</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.AddWithValue(System.String,System.Object)\">\n            <summary>\n            Adds a named/unnamed parameter and its value to the parameter collection.\n            </summary>\n            <param name=\"parameterName\">Name of the parameter, or null to indicate an unnamed parameter</param>\n            <param name=\"value\">The initial value of the parameter</param>\n            <returns>Returns the SQLiteParameter object created during the call.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.AddRange(System.Data.SQLite.SQLiteParameter[])\">\n            <summary>\n            Adds an array of parameters to the collection\n            </summary>\n            <param name=\"values\">The array of parameters to add</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.AddRange(System.Array)\">\n            <summary>\n            Adds an array of parameters to the collection\n            </summary>\n            <param name=\"values\">The array of parameters to add</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.Clear\">\n            <summary>\n            Clears the array and resets the collection\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.Contains(System.String)\">\n            <summary>\n            Determines if the named parameter exists in the collection\n            </summary>\n            <param name=\"parameterName\">The name of the parameter to check</param>\n            <returns>True if the parameter is in the collection</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.Contains(System.Object)\">\n            <summary>\n            Determines if the parameter exists in the collection\n            </summary>\n            <param name=\"value\">The SQLiteParameter to check</param>\n            <returns>True if the parameter is in the collection</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.CopyTo(System.Array,System.Int32)\">\n            <summary>\n            Not implemented\n            </summary>\n            <param name=\"array\"></param>\n            <param name=\"index\"></param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.GetParameter(System.String)\">\n            <summary>\n            Retrieve a parameter by name from the collection\n            </summary>\n            <param name=\"parameterName\">The name of the parameter to fetch</param>\n            <returns>A DbParameter object</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.GetParameter(System.Int32)\">\n            <summary>\n            Retrieves a parameter by its index in the collection\n            </summary>\n            <param name=\"index\">The index of the parameter to retrieve</param>\n            <returns>A DbParameter object</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.IndexOf(System.String)\">\n            <summary>\n            Returns the index of a parameter given its name\n            </summary>\n            <param name=\"parameterName\">The name of the parameter to find</param>\n            <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.IndexOf(System.Object)\">\n            <summary>\n            Returns the index of a parameter\n            </summary>\n            <param name=\"value\">The parameter to find</param>\n            <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.Insert(System.Int32,System.Object)\">\n            <summary>\n            Inserts a parameter into the array at the specified location\n            </summary>\n            <param name=\"index\">The zero-based index to insert the parameter at</param>\n            <param name=\"value\">The parameter to insert</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.Remove(System.Object)\">\n            <summary>\n            Removes a parameter from the collection\n            </summary>\n            <param name=\"value\">The parameter to remove</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.RemoveAt(System.String)\">\n            <summary>\n            Removes a parameter from the collection given its name\n            </summary>\n            <param name=\"parameterName\">The name of the parameter to remove</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.RemoveAt(System.Int32)\">\n            <summary>\n            Removes a parameter from the collection given its index\n            </summary>\n            <param name=\"index\">The zero-based parameter index to remove</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.SetParameter(System.String,System.Data.Common.DbParameter)\">\n            <summary>\n            Re-assign the named parameter to a new parameter object\n            </summary>\n            <param name=\"parameterName\">The name of the parameter to replace</param>\n            <param name=\"value\">The new parameter</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.SetParameter(System.Int32,System.Data.Common.DbParameter)\">\n            <summary>\n            Re-assign a parameter at the specified index\n            </summary>\n            <param name=\"index\">The zero-based index of the parameter to replace</param>\n            <param name=\"value\">The new parameter</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.Unbind\">\n            <summary>\n            Un-binds all parameters from their statements\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteParameterCollection.MapParameters(System.Data.SQLite.SQLiteStatement)\">\n            <summary>\n            This function attempts to map all parameters in the collection to all statements in a Command.\n            Since named parameters may span multiple statements, this function makes sure all statements are bound\n            to the same named parameter.  Unnamed parameters are bound in sequence.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameterCollection.IsSynchronized\">\n            <summary>\n            Returns false\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameterCollection.IsFixedSize\">\n            <summary>\n            Returns false\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameterCollection.IsReadOnly\">\n            <summary>\n            Returns false\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameterCollection.SyncRoot\">\n            <summary>\n            Returns null\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameterCollection.Count\">\n            <summary>\n            Returns a count of parameters in the collection\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameterCollection.Item(System.String)\">\n            <summary>\n            Overloaded to specialize the return value of the default indexer\n            </summary>\n            <param name=\"parameterName\">Name of the parameter to get/set</param>\n            <returns>The specified named SQLite parameter</returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteParameterCollection.Item(System.Int32)\">\n            <summary>\n            Overloaded to specialize the return value of the default indexer\n            </summary>\n            <param name=\"index\">The index of the parameter to get/set</param>\n            <returns>The specified SQLite parameter</returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteStatement\">\n            <summary>\n            Represents a single SQL statement in SQLite.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteStatement._sql\">\n            <summary>\n            The underlying SQLite object this statement is bound to\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteStatement._sqlStatement\">\n            <summary>\n            The command text of this SQL statement\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteStatement._sqlite_stmt\">\n            <summary>\n            The actual statement pointer\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteStatement._unnamedParameters\">\n            <summary>\n            An index from which unnamed parameters begin\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteStatement._paramNames\">\n            <summary>\n            Names of the parameters as SQLite understands them to be\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteStatement._paramValues\">\n            <summary>\n            Parameters for this statement\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteStatement._command\">\n            <summary>\n            Command this statement belongs to (if any)\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteStatement._flags\">\n            <summary>\n            The flags associated with the parent connection object.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteStatement.#ctor(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteConnectionFlags,System.Data.SQLite.SQLiteStatementHandle,System.String,System.Data.SQLite.SQLiteStatement)\">\n            <summary>\n            Initializes the statement and attempts to get all information about parameters in the statement\n            </summary>\n            <param name=\"sqlbase\">The base SQLite object</param>\n            <param name=\"flags\">The flags associated with the parent connection object</param>\n            <param name=\"stmt\">The statement</param>\n            <param name=\"strCommand\">The command text for this statement</param>\n            <param name=\"previous\">The previous command in a multi-statement command</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteStatement.Dispose\">\n            <summary>\n            Disposes and finalizes the statement\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteStatement.TryGetChanges(System.Int32@,System.Boolean@)\">\n            <summary>\n            If the underlying database connection is open, fetches the number of changed rows\n            resulting from the most recent query; otherwise, does nothing.\n            </summary>\n            <param name=\"changes\">\n            The number of changes when true is returned.\n            Undefined if false is returned.\n            </param>\n            <param name=\"readOnly\">\n            The read-only flag when true is returned.\n            Undefined if false is returned.\n            </param>\n            <returns>Non-zero if the number of changed rows was fetched.</returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteStatement.MapParameter(System.String,System.Data.SQLite.SQLiteParameter)\">\n            <summary>\n            Called by SQLiteParameterCollection, this function determines if the specified parameter name belongs to\n            this statement, and if so, keeps a reference to the parameter so it can be bound later.\n            </summary>\n            <param name=\"s\">The parameter name to map</param>\n            <param name=\"p\">The parameter to assign it</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteStatement.BindParameters\">\n            <summary>\n             Bind all parameters, making sure the caller didn't miss any\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteStatement.BindParameter(System.Int32,System.Data.SQLite.SQLiteParameter)\">\n            <summary>\n            Perform the bind operation for an individual parameter\n            </summary>\n            <param name=\"index\">The index of the parameter to bind</param>\n            <param name=\"param\">The parameter we're binding</param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteTransaction\">\n            <summary>\n            SQLite implementation of DbTransaction.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteTransaction._cnn\">\n            <summary>\n            The connection to which this transaction is bound\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteTransaction.#ctor(System.Data.SQLite.SQLiteConnection,System.Boolean)\">\n            <summary>\n            Constructs the transaction object, binding it to the supplied connection\n            </summary>\n            <param name=\"connection\">The connection to open a transaction on</param>\n            <param name=\"deferredLock\">TRUE to defer the writelock, or FALSE to lock immediately</param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteTransaction.Dispose(System.Boolean)\">\n            <summary>\n            Disposes the transaction.  If it is currently active, any changes are rolled back.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteTransaction.Commit\">\n            <summary>\n            Commits the current transaction.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteTransaction.Rollback\">\n            <summary>\n            Rolls back the active transaction.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteTransaction.Connection\">\n            <summary>\n            Returns the underlying connection to which this transaction applies.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteTransaction.DbConnection\">\n            <summary>\n            Forwards to the local Connection property\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteTransaction.IsolationLevel\">\n            <summary>\n            Gets the isolation level of the transaction.  SQLite only supports Serializable transactions.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.HelperMethods\">\n            <summary>\n            This static class provides some methods that are shared between the\n            native library pre-loader and other classes.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.HelperMethods.staticSyncRoot\">\n            <summary>\n            This lock is used to protect the static <see cref=\"F:System.Data.SQLite.HelperMethods.isMono\"/> field.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.HelperMethods.MonoRuntimeType\">\n            <summary>\n            This type is only present when running on Mono.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.HelperMethods.isMono\">\n            <summary>\n            Keeps track of whether we are running on Mono.  Initially null, it is\n            set by the <see cref=\"M:System.Data.SQLite.HelperMethods.IsMono\"/> method on its first call.  Later, it\n            is returned verbatim by the <see cref=\"M:System.Data.SQLite.HelperMethods.IsMono\"/> method.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.HelperMethods.IsMono\">\n            <summary>\n            Determines whether or not this assembly is running on Mono.\n            </summary>\n            <returns>\n            Non-zero if this assembly is running on Mono.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.HelperMethods.IsWindows\">\n            <summary>\n            Determines if the current process is running on one of the Windows\n            [sub-]platforms.\n            </summary>\n            <returns>\n            Non-zero when running on Windows; otherwise, zero.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.HelperMethods.StringFormat(System.IFormatProvider,System.String,System.Object[])\">\n            <summary>\n            This is a wrapper around the\n            <see cref=\"M:System.String.Format(System.IFormatProvider,System.String,System.Object[])\"/> method.\n            On Mono, it has to call the method overload without the\n            <see cref=\"T:System.IFormatProvider\"/> parameter, due to a bug in Mono.\n            </summary>\n            <param name=\"provider\">\n            This is used for culture-specific formatting.\n            </param>\n            <param name=\"format\">\n            The format string.\n            </param>\n            <param name=\"args\">\n            An array the objects to format.\n            </param>\n            <returns>\n            The resulting string.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.NativeLibraryHelper\">\n            <summary>\n            This static class provides a thin wrapper around the native library\n            loading features of the underlying platform.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.NativeLibraryHelper.LoadLibraryWin32(System.String)\">\n            <summary>\n            Attempts to load the specified native library file using the Win32\n            API.\n            </summary>\n            <param name=\"fileName\">\n            The file name of the native library to load.\n            </param>\n            <returns>\n            The native module handle upon success -OR- IntPtr.Zero on failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.NativeLibraryHelper.LoadLibraryPosix(System.String)\">\n            <summary>\n            Attempts to load the specified native library file using the POSIX\n            API.\n            </summary>\n            <param name=\"fileName\">\n            The file name of the native library to load.\n            </param>\n            <returns>\n            The native module handle upon success -OR- IntPtr.Zero on failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.NativeLibraryHelper.LoadLibrary(System.String)\">\n            <summary>\n            Attempts to load the specified native library file.\n            </summary>\n            <param name=\"fileName\">\n            The file name of the native library to load.\n            </param>\n            <returns>\n            The native module handle upon success -OR- IntPtr.Zero on failure.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.NativeLibraryHelper.LoadLibraryCallback\">\n            <summary>\n            This delegate is used to wrap the concept of loading a native\n            library, based on a file name, and returning the loaded module\n            handle.\n            </summary>\n            <param name=\"fileName\">\n            The file name of the native library to load.\n            </param>\n            <returns>\n            The native module handle upon success -OR- IntPtr.Zero on failure.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.UnsafeNativeMethodsPosix\">\n            <summary>\n            This class declares P/Invoke methods to call native POSIX APIs.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UnsafeNativeMethodsPosix.RTLD_LAZY\">\n            <summary>\n            For use with dlopen(), bind function calls lazily.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UnsafeNativeMethodsPosix.RTLD_NOW\">\n            <summary>\n            For use with dlopen(), bind function calls immediately.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UnsafeNativeMethodsPosix.RTLD_GLOBAL\">\n            <summary>\n            For use with dlopen(), make symbols globally available.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UnsafeNativeMethodsPosix.RTLD_LOCAL\">\n            <summary>\n            For use with dlopen(), opposite of RTLD_GLOBAL, and the default.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UnsafeNativeMethodsPosix.RTLD_DEFAULT\">\n            <summary>\n            For use with dlopen(), the defaults used by this class.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethodsPosix.dlopen(System.String,System.Int32)\">\n            <summary>\n            This is the P/Invoke method that wraps the native Unix dlopen\n            function.  See the POSIX documentation for full details on what it\n            does.\n            </summary>\n            <param name=\"fileName\">\n            The name of the executable library.\n            </param>\n            <param name=\"mode\">\n            This must be a combination of the individual bit flags RTLD_LAZY,\n            RTLD_NOW, RTLD_GLOBAL, and/or RTLD_LOCAL.\n            </param>\n            <returns>\n            The native module handle upon success -OR- IntPtr.Zero on failure.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.UnsafeNativeMethodsWin32\">\n            <summary>\n            This class declares P/Invoke methods to call native Win32 APIs.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethodsWin32.LoadLibrary(System.String)\">\n            <summary>\n            This is the P/Invoke method that wraps the native Win32 LoadLibrary\n            function.  See the MSDN documentation for full details on what it\n            does.\n            </summary>\n            <param name=\"fileName\">\n            The name of the executable library.\n            </param>\n            <returns>\n            The native module handle upon success -OR- IntPtr.Zero on failure.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.UnsafeNativeMethods\">\n            <summary>\n            This class declares P/Invoke methods to call native SQLite APIs.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UnsafeNativeMethods.DllFileExtension\">\n            <summary>\n            The file extension used for dynamic link libraries.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UnsafeNativeMethods.ConfigFileExtension\">\n            <summary>\n            The file extension used for the XML configuration file.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UnsafeNativeMethods.XmlConfigFileName\">\n            <summary>\n            This is the name of the XML configuration file specific to the\n            System.Data.SQLite assembly.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UnsafeNativeMethods.staticSyncRoot\">\n            <summary>\n            This lock is used to protect the static _SQLiteNativeModuleFileName,\n            _SQLiteNativeModuleHandle, and processorArchitecturePlatforms fields.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UnsafeNativeMethods.processorArchitecturePlatforms\">\n            <summary>\n            This dictionary stores the mappings between processor architecture\n            names and platform names.  These mappings are now used for two\n            purposes.  First, they are used to determine if the assembly code\n            base should be used instead of the location, based upon whether one\n            or more of the named sub-directories exist within the assembly code\n            base.  Second, they are used to assist in loading the appropriate\n            SQLite interop assembly into the current process.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethods.#cctor\">\n            <summary>\n            For now, this method simply calls the Initialize method.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethods.Initialize\">\n            <summary>\n            Attempts to initialize this class by pre-loading the native SQLite\n            library for the processor architecture of the current process.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethods.MaybeCombinePath(System.String,System.String)\">\n            <summary>\n            Combines two path strings.\n            </summary>\n            <param name=\"path1\">\n            The first path -OR- null.\n            </param>\n            <param name=\"path2\">\n            The second path -OR- null.\n            </param>\n            <returns>\n            The combined path string -OR- null if both of the original path\n            strings are null.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethods.GetXmlConfigFileName\">\n            <summary>\n            Queries and returns the XML configuration file name for the assembly\n            containing the managed System.Data.SQLite components.\n            </summary>\n            <returns>\n            The XML configuration file name -OR- null if it cannot be determined\n            or does not exist.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethods.GetSettingValue(System.String,System.String)\">\n            <summary>\n            Queries and returns the value of the specified setting, using the XML\n            configuration file and/or the environment variables for the current\n            process and/or the current system, when available.\n            </summary>\n            <param name=\"name\">\n            The name of the setting.\n            </param>\n            <param name=\"default\">\n            The value to be returned if the setting has not been set explicitly\n            or cannot be determined.\n            </param>\n            <returns>\n            The value of the setting -OR- the default value specified by\n            <paramref name=\"default\" /> if it has not been set explicitly or\n            cannot be determined.  By default, all references to existing\n            environment variables will be expanded to their corresponding values\n            within the value to be returned unless either the \"No_Expand\" or\n            \"No_Expand_<paramref name=\"name\" />\" environment variable is set [to\n            anything].\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethods.GetAssemblyDirectory\">\n            <summary>\n            Queries and returns the directory for the assembly currently being\n            executed.\n            </summary>\n            <returns>\n            The directory for the assembly currently being executed -OR- null if\n            it cannot be determined.\n            </returns>\n        </member>\n        <member name=\"F:System.Data.SQLite.UnsafeNativeMethods.PROCESSOR_ARCHITECTURE\">\n            <summary>\n            The name of the environment variable containing the processor\n            architecture of the current process.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UnsafeNativeMethods._SQLiteNativeModuleFileName\">\n            <summary>\n            The native module file name for the native SQLite library or null.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.UnsafeNativeMethods._SQLiteNativeModuleHandle\">\n            <summary>\n            The native module handle for the native SQLite library or the value\n            IntPtr.Zero.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethods.GetNativeLibraryFileNameOnly\">\n            <summary>\n            Determines the base file name (without any directory information)\n            for the native SQLite library to be pre-loaded by this class.\n            </summary>\n            <returns>\n            The base file name for the native SQLite library to be pre-loaded by\n            this class -OR- null if its value cannot be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethods.SearchForDirectory(System.String@,System.String@)\">\n            <summary>\n            Searches for the native SQLite library in the directory containing\n            the assembly currently being executed as well as the base directory\n            for the current application domain.\n            </summary>\n            <param name=\"baseDirectory\">\n            Upon success, this parameter will be modified to refer to the base\n            directory containing the native SQLite library.\n            </param>\n            <param name=\"processorArchitecture\">\n            Upon success, this parameter will be modified to refer to the name\n            of the immediate directory (i.e. the offset from the base directory)\n            containing the native SQLite library.\n            </param>\n            <returns>\n            Non-zero (success) if the native SQLite library was found; otherwise,\n            zero (failure).\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethods.GetBaseDirectory\">\n            <summary>\n            Queries and returns the base directory of the current application\n            domain.\n            </summary>\n            <returns>\n            The base directory for the current application domain -OR- null if it\n            cannot be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethods.FixUpDllFileName(System.String)\">\n            <summary>\n            Determines if the dynamic link library file name requires a suffix\n            and adds it if necessary.\n            </summary>\n            <param name=\"fileName\">\n            The original dynamic link library file name to inspect.\n            </param>\n            <returns>\n            The dynamic link library file name, possibly modified to include an\n            extension.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethods.GetProcessorArchitecture\">\n            <summary>\n            Queries and returns the processor architecture of the current\n            process.\n            </summary>\n            <returns>\n            The processor architecture of the current process -OR- null if it\n            cannot be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethods.GetPlatformName(System.String)\">\n            <summary>\n            Given the processor architecture, returns the name of the platform.\n            </summary>\n            <param name=\"processorArchitecture\">\n            The processor architecture to be translated to a platform name.\n            </param>\n            <returns>\n            The platform name for the specified processor architecture -OR- null\n            if it cannot be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.UnsafeNativeMethods.PreLoadSQLiteDll(System.String,System.String,System.String@,System.IntPtr@)\">\n            <summary>\n            Attempts to load the native SQLite library based on the specified\n            directory and processor architecture.\n            </summary>\n            <param name=\"baseDirectory\">\n            The base directory to use, null for default (the base directory of\n            the current application domain).  This directory should contain the\n            processor architecture specific sub-directories.\n            </param>\n            <param name=\"processorArchitecture\">\n            The requested processor architecture, null for default (the\n            processor architecture of the current process).  This caller should\n            almost always specify null for this parameter.\n            </param>\n            <param name=\"nativeModuleFileName\">\n            The candidate native module file name to load will be stored here,\n            if necessary.\n            </param>\n            <param name=\"nativeModuleHandle\">\n            The native module handle as returned by LoadLibrary will be stored\n            here, if necessary.  This value will be IntPtr.Zero if the call to\n            LoadLibrary fails.\n            </param>\n            <returns>\n            Non-zero if the native module was loaded successfully; otherwise,\n            zero.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.SR\">\n            <summary>\n              A strongly-typed resource class, for looking up localized strings, etc.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SR.ResourceManager\">\n            <summary>\n              Returns the cached ResourceManager instance used by this class.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SR.Culture\">\n            <summary>\n              Overrides the current thread's CurrentUICulture property for all\n              resource lookups using this strongly typed resource class.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SR.DataTypes\">\n             <summary>\n               Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; standalone=&quot;yes&quot;?&gt;\n            &lt;DocumentElement&gt;\n              &lt;DataTypes&gt;\n                &lt;TypeName&gt;smallint&lt;/TypeName&gt;\n                &lt;ProviderDbType&gt;10&lt;/ProviderDbType&gt;\n                &lt;ColumnSize&gt;5&lt;/ColumnSize&gt;\n                &lt;DataType&gt;System.Int16&lt;/DataType&gt;\n                &lt;CreateFormat&gt;smallint&lt;/CreateFormat&gt;\n                &lt;IsAutoIncrementable&gt;false&lt;/IsAutoIncrementable&gt;\n                &lt;IsCaseSensitive&gt;false&lt;/IsCaseSensitive&gt;\n                &lt;IsFixedLength&gt;true&lt;/IsFixedLength&gt;\n                &lt;IsFixedPrecisionScale&gt;true&lt;/IsFixedPrecisionScale&gt;\n                &lt;IsLong&gt;false&lt;/IsLong&gt;\n                &lt;IsNullable&gt;true&lt;/ [rest of string was truncated]&quot;;.\n             </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SR.Keywords\">\n            <summary>\n              Looks up a localized string similar to ALL,ALTER,AND,AS,AUTOINCREMENT,BETWEEN,BY,CASE,CHECK,COLLATE,COMMIT,CONSTRAINT,CREATE,CROSS,DEFAULT,DEFERRABLE,DELETE,DISTINCT,DROP,ELSE,ESCAPE,EXCEPT,FOREIGN,FROM,FULL,GROUP,HAVING,IN,INDEX,INNER,INSERT,INTERSECT,INTO,IS,ISNULL,JOIN,LEFT,LIMIT,NATURAL,NOT,NOTNULL,NULL,ON,OR,ORDER,OUTER,PRIMARY,REFERENCES,RIGHT,ROLLBACK,SELECT,SET,TABLE,THEN,TO,TRANSACTION,UNION,UNIQUE,UPDATE,USING,VALUES,WHEN,WHERE.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SR.MetaDataCollections\">\n             <summary>\n               Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;\n            &lt;DocumentElement&gt;\n              &lt;MetaDataCollections&gt;\n                &lt;CollectionName&gt;MetaDataCollections&lt;/CollectionName&gt;\n                &lt;NumberOfRestrictions&gt;0&lt;/NumberOfRestrictions&gt;\n                &lt;NumberOfIdentifierParts&gt;0&lt;/NumberOfIdentifierParts&gt;\n              &lt;/MetaDataCollections&gt;\n              &lt;MetaDataCollections&gt;\n                &lt;CollectionName&gt;DataSourceInformation&lt;/CollectionName&gt;\n                &lt;NumberOfRestrictions&gt;0&lt;/NumberOfRestrictions&gt;\n                &lt;NumberOfIdentifierParts&gt;0&lt;/NumberOfIdentifierParts&gt;\n              &lt;/MetaDataCollections&gt;\n              &lt;MetaDataC [rest of string was truncated]&quot;;.\n             </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.ISQLiteNativeModule\">\n            <summary>\n            This interface represents a virtual table implementation written in\n            native code.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\">\n            <summary>\n            <para><code>\n              int (*xCreate)(sqlite3 *db, void *pAux,\n                           int argc, char **argv,\n                           sqlite3_vtab **ppVTab,\n                           char **pzErr);\n            </code></para>\n            <para>\n            This method is called to create a new instance of a virtual table \n            in response to a CREATE VIRTUAL TABLE statement. \n            The db parameter is a pointer to the SQLite database connection that \n            is executing the CREATE VIRTUAL TABLE statement. \n            The pAux argument is the copy of the client data pointer that was the \n            fourth argument to the sqlite3_create_module() or\n            sqlite3_create_module_v2() call that registered the \n            virtual table module. \n            The argv parameter is an array of argc pointers to null terminated strings. \n            The first string, argv[0], is the name of the module being invoked.   The\n            module name is the name provided as the second argument to \n            sqlite3_create_module() and as the argument to the USING clause of the\n            CREATE VIRTUAL TABLE statement that is running.\n            The second, argv[1], is the name of the database in which the new virtual table is being created. The database name is \"main\" for the primary database, or\n            \"temp\" for TEMP database, or the name given at the end of the ATTACH\n            statement for attached databases.  The third element of the array, argv[2], \n            is the name of the new virtual table, as specified following the TABLE\n            keyword in the CREATE VIRTUAL TABLE statement.\n            If present, the fourth and subsequent strings in the argv[] array report \n            the arguments to the module name in the CREATE VIRTUAL TABLE statement.\n            </para>\n            <para>\n            The job of this method is to construct the new virtual table object\n            (an sqlite3_vtab object) and return a pointer to it in *ppVTab.\n            </para>\n            <para>\n            As part of the task of creating a new sqlite3_vtab structure, this \n            method <u>must</u> invoke sqlite3_declare_vtab() to tell the SQLite \n            core about the columns and datatypes in the virtual table. \n            The sqlite3_declare_vtab() API has the following prototype:\n            </para>\n            <para><code>\n                int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable)\n            </code></para>\n            <para>\n            The first argument to sqlite3_declare_vtab() must be the same \n            database connection pointer as the first parameter to this method.\n            The second argument to sqlite3_declare_vtab() must a zero-terminated \n            UTF-8 string that contains a well-formed CREATE TABLE statement that \n            defines the columns in the virtual table and their data types. \n            The name of the table in this CREATE TABLE statement is ignored, \n            as are all constraints. Only the column names and datatypes matter.\n            The CREATE TABLE statement string need not to be \n            held in persistent memory.  The string can be\n            deallocated and/or reused as soon as the sqlite3_declare_vtab()\n            routine returns.\n            </para>\n            <para>\n            The xCreate method need not initialize the pModule, nRef, and zErrMsg\n            fields of the sqlite3_vtab object.  The SQLite core will take care of \n            that chore.\n            </para>\n            <para>\n            The xCreate should return SQLITE_OK if it is successful in \n            creating the new virtual table, or SQLITE_ERROR if it is not successful.\n            If not successful, the sqlite3_vtab structure must not be allocated. \n            An error message may optionally be returned in *pzErr if unsuccessful.\n            Space to hold the error message string must be allocated using\n            an SQLite memory allocation function like \n            sqlite3_malloc() or sqlite3_mprintf() as the SQLite core will\n            attempt to free the space using sqlite3_free() after the error has\n            been reported up to the application.\n            </para>\n            <para>\n            If the xCreate method is omitted (left as a NULL pointer) then the\n            virtual table is an eponymous-only virtual table.  New instances of\n            the virtual table cannot be created using CREATE VIRTUAL TABLE and the\n            virtual table can only be used via its module name.\n            Note that SQLite versions prior to 3.9.0 do not understand\n            eponymous-only virtual tables and will segfault if an attempt is made\n            to CREATE VIRTUAL TABLE on an eponymous-only virtual table because\n            the xCreate method was not checked for null.\n            </para>\n            <para>\n            If the xCreate method is the exact same pointer as the xConnect method,\n            that indicates that the virtual table does not need to initialize backing\n            store.  Such a virtual table can be used as an eponymous virtual table\n            or as a named virtual table using CREATE VIRTUAL TABLE or both.\n            </para>\n            <para>\n            If a column datatype contains the special keyword \"HIDDEN\"\n            (in any combination of upper and lower case letters) then that keyword\n            it is omitted from the column datatype name and the column is marked \n            as a hidden column internally. \n            A hidden column differs from a normal column in three respects:\n            </para>\n            <para>\n            <![CDATA[<ul>]]>\n            <![CDATA[<li>]]> Hidden columns are not listed in the dataset returned by \n                 \"PRAGMA table_info\",\n            <![CDATA[<li>]]> Hidden columns are not included in the expansion of a \"*\"\n                 expression in the result set of a SELECT, and\n            <![CDATA[<li>]]> Hidden columns are not included in the implicit column-list \n                 used by an INSERT statement that lacks an explicit column-list. \n            <![CDATA[</ul>]]>\n            </para>\n            <para>\n            For example, if the following SQL is passed to sqlite3_declare_vtab():\n            </para>\n            <para><code>\n               CREATE TABLE x(a HIDDEN VARCHAR(12), b INTEGER, c INTEGER Hidden);\n            </code></para>\n            <para>\n            Then the virtual table would be created with two hidden columns,\n            and with datatypes of \"VARCHAR(12)\" and \"INTEGER\".\n            </para>\n            <para>\n            An example use of hidden columns can be seen in the FTS3 virtual \n            table implementation, where every FTS virtual table\n            contains an FTS hidden column that is used to pass information from the\n            virtual table into FTS auxiliary functions and to the FTS MATCH operator.\n            </para>\n            <para>\n            A virtual table that contains hidden columns can be used like\n            a table-valued function in the FROM clause of a SELECT statement.\n            The arguments to the table-valued function become constraints on \n            the HIDDEN columns of the virtual table.\n            </para>\n            <para>\n            For example, the \"generate_series\" extension (located in the\n            ext/misc/series.c\n            file in the source tree)\n            implements an eponymous virtual table with the following schema:\n            </para>\n            <para><code>\n            CREATE TABLE generate_series(\n              value,\n              start HIDDEN,\n              stop HIDDEN,\n              step HIDDEN\n            );\n            </code></para>\n            <para>\n            The sqlite3_module.xBestIndex method in the implementation of this\n            table checks for equality constraints against the HIDDEN columns, and uses\n            those as input parameters to determine the range of integer \"value\" outputs\n            to generate.  Reasonable defaults are used for any unconstrained columns.\n            For example, to list all integers between 5 and 50:\n            </para>\n            <para><code>\n            SELECT value FROM generate_series(5,50);\n            </code></para>\n            <para>\n            The previous query is equivalent to the following:\n            </para>\n            <para><code>\n            SELECT value FROM generate_series WHERE start=5 AND stop=50;\n            </code></para>\n            <para>\n            Arguments on the virtual table name are matched to hidden columns\n            in order.  The number of arguments can be less than the\n            number of hidden columns, in which case the latter hidden columns are\n            unconstrained.  However, an error results if there are more arguments\n            than there are hidden columns in the virtual table.\n            </para>\n            </summary>\n            <param name=\"pDb\">\n            The native database connection handle.\n            </param>\n            <param name=\"pAux\">\n            The original native pointer value that was provided to the\n            sqlite3_create_module(), sqlite3_create_module_v2() or\n            sqlite3_create_disposable_module() functions.\n            </param>\n            <param name=\"argc\">\n            The number of arguments from the CREATE VIRTUAL TABLE statement.\n            </param>\n            <param name=\"argv\">\n            The array of string arguments from the CREATE VIRTUAL TABLE\n            statement.\n            </param>\n            <param name=\"pVtab\">\n            Upon success, this parameter must be modified to point to the newly\n            created native sqlite3_vtab derived structure.\n            </param>\n            <param name=\"pError\">\n            Upon failure, this parameter must be modified to point to the error\n            message, with the underlying memory having been obtained from the\n            sqlite3_malloc() function.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\">\n            <summary>\n            <para><code>\n              int (*xConnect)(sqlite3*, void *pAux,\n                           int argc, char **argv,\n                           sqlite3_vtab **ppVTab,\n                           char **pzErr);\n            </code></para>\n            <para>\n            The xConnect method is very similar to xCreate. \n            It has the same parameters and constructs a new sqlite3_vtab structure \n            just like xCreate. \n            And it must also call sqlite3_declare_vtab() like xCreate.\n            </para>\n            <para>\n            The difference is that xConnect is called to establish a new \n            connection to an existing virtual table whereas xCreate is called \n            to create a new virtual table from scratch.\n            </para>\n            <para>\n            The xCreate and xConnect methods are only different when the\n            virtual table has some kind of backing store that must be initialized \n            the first time the virtual table is created. The xCreate method creates \n            and initializes the backing store. The xConnect method just connects \n            to an existing backing store.  When xCreate and xConnect are the same,\n            the table is an eponymous virtual table.\n            </para>\n            <para>\n            As an example, consider a virtual table implementation that \n            provides read-only access to existing comma-separated-value (CSV)\n            files on disk. There is no backing store that needs to be created \n            or initialized for such a virtual table (since the CSV files already \n            exist on disk) so the xCreate and xConnect methods will be identical \n            for that module.\n            </para>\n            <para>\n            Another example is a virtual table that implements a full-text index. \n            The xCreate method must create and initialize data structures to hold \n            the dictionary and posting lists for that index. The xConnect method,\n            on the other hand, only has to locate and use an existing dictionary \n            and posting lists that were created by a prior xCreate call.\n            </para>\n            <para>\n            The xConnect method must return SQLITE_OK if it is successful \n            in creating the new virtual table, or SQLITE_ERROR if it is not \n            successful. If not successful, the sqlite3_vtab structure must not be \n            allocated. An error message may optionally be returned in *pzErr if \n            unsuccessful. \n            Space to hold the error message string must be allocated using\n            an SQLite memory allocation function like \n            sqlite3_malloc() or sqlite3_mprintf() as the SQLite core will\n            attempt to free the space using sqlite3_free() after the error has\n            been reported up to the application.\n            </para>\n            <para>\n            The xConnect method is required for every virtual table implementation, \n            though the xCreate and xConnect pointers of the sqlite3_module object\n            may point to the same function if the virtual table does not need to\n            initialize backing store.\n            </para>\n            </summary>\n            <param name=\"pDb\">\n            The native database connection handle.\n            </param>\n            <param name=\"pAux\">\n            The original native pointer value that was provided to the\n            sqlite3_create_module(), sqlite3_create_module_v2() or\n            sqlite3_create_disposable_module() functions.\n            </param>\n            <param name=\"argc\">\n            The number of arguments from the CREATE VIRTUAL TABLE statement.\n            </param>\n            <param name=\"argv\">\n            The array of string arguments from the CREATE VIRTUAL TABLE\n            statement.\n            </param>\n            <param name=\"pVtab\">\n            Upon success, this parameter must be modified to point to the newly\n            created native sqlite3_vtab derived structure.\n            </param>\n            <param name=\"pError\">\n            Upon failure, this parameter must be modified to point to the error\n            message, with the underlying memory having been obtained from the\n            sqlite3_malloc() function.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)\">\n            <summary>\n            <para>\n            SQLite uses the xBestIndex method of a virtual table module to determine\n            the best way to access the virtual table. \n            The xBestIndex method has a prototype like this:\n            </para>\n            <para><code>\n              int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*);\n            </code></para>\n            <para>\n            The SQLite core communicates with the xBestIndex method by filling \n            in certain fields of the sqlite3_index_info structure and passing a \n            pointer to that structure into xBestIndex as the second parameter. \n            The xBestIndex method fills out other fields of this structure which\n            forms the reply. The sqlite3_index_info structure looks like this:\n            </para>\n            <para><code>\n              struct sqlite3_index_info {\n                /* Inputs */\n                const int nConstraint;     /* Number of entries in aConstraint */\n                const struct sqlite3_index_constraint {\n                   int iColumn;              /* Column constrained.  -1 for ROWID */\n                   unsigned char op;         /* Constraint operator */\n                   unsigned char usable;     /* True if this constraint is usable */\n                   int iTermOffset;          /* Used internally - xBestIndex should ignore */\n                } *const aConstraint;      /* Table of WHERE clause constraints */\n                const int nOrderBy;        /* Number of terms in the ORDER BY clause */\n                const struct sqlite3_index_orderby {\n                   int iColumn;              /* Column number */\n                   unsigned char desc;       /* True for DESC.  False for ASC. */\n                } *const aOrderBy;         /* The ORDER BY clause */\n                /* Outputs */\n                struct sqlite3_index_constraint_usage {\n                  int argvIndex;           /* if &gt;0, constraint is part of argv to xFilter */\n                  unsigned char omit;      /* Do not code a test for this constraint */\n                } *const aConstraintUsage;\n                int idxNum;                /* Number used to identify the index */\n                char *idxStr;              /* String, possibly obtained from sqlite3_malloc */\n                int needToFreeIdxStr;      /* Free idxStr using sqlite3_free() if true */\n                int orderByConsumed;       /* True if output is already ordered */\n                double estimatedCost;      /* Estimated cost of using this index */\n                <![CDATA[<b>]]>/* Fields below are only available in SQLite 3.8.2 and later */<![CDATA[</b>]]>\n                sqlite3_int64 estimatedRows;    /* Estimated number of rows returned */\n                <![CDATA[<b>]]>/* Fields below are only available in SQLite 3.9.0 and later */<![CDATA[</b>]]>\n                int idxFlags;              /* Mask of SQLITE_INDEX_SCAN_* flags */\n                <![CDATA[<b>]]>/* Fields below are only available in SQLite 3.10.0 and later */<![CDATA[</b>]]>\n                sqlite3_uint64 colUsed;    /* Input: Mask of columns used by statement */\n              };\n            </code></para>\n            <para>\n            Note the warnings on the \"estimatedRows\", \"idxFlags\", and colUsed fields.\n            These fields were added with SQLite versions 3.8.2, 3.9.0, and 3.10.0, respectively. \n            Any extension that reads or writes these fields must first check that the \n            version of the SQLite library in use is greater than or equal to appropriate\n            version - perhaps comparing the value returned from sqlite3_libversion_number()\n            against constants 3008002, 3009000, and/or 3010000. The result of attempting \n            to access these fields in an sqlite3_index_info structure created by an \n            older version of SQLite are undefined.\n            </para>\n            <para>\n            In addition, there are some defined constants:\n            </para>\n            <para><code>\n              #define SQLITE_INDEX_CONSTRAINT_EQ      2\n              #define SQLITE_INDEX_CONSTRAINT_GT      4\n              #define SQLITE_INDEX_CONSTRAINT_LE      8\n              #define SQLITE_INDEX_CONSTRAINT_LT     16\n              #define SQLITE_INDEX_CONSTRAINT_GE     32\n              #define SQLITE_INDEX_CONSTRAINT_MATCH  64\n              #define SQLITE_INDEX_CONSTRAINT_LIKE   65     /* 3.10.0 and later only */\n              #define SQLITE_INDEX_CONSTRAINT_GLOB   66     /* 3.10.0 and later only */\n              #define SQLITE_INDEX_CONSTRAINT_REGEXP 67     /* 3.10.0 and later only */\n              #define SQLITE_INDEX_SCAN_UNIQUE        1     /* Scan visits at most 1 row */\n            </code></para>\n            <para>\n            The SQLite core calls the xBestIndex method when it is compiling a query\n            that involves a virtual table. In other words, SQLite calls this method \n            when it is running sqlite3_prepare() or the equivalent. \n            By calling this method, the \n            SQLite core is saying to the virtual table that it needs to access \n            some subset of the rows in the virtual table and it wants to know the\n            most efficient way to do that access. The xBestIndex method replies \n            with information that the SQLite core can then use to conduct an \n            efficient search of the virtual table.\n            </para>\n            <para>\n            While compiling a single SQL query, the SQLite core might call \n            xBestIndex multiple times with different settings in sqlite3_index_info.\n            The SQLite core will then select the combination that appears to \n            give the best performance.\n            </para>\n            <para>\n            Before calling this method, the SQLite core initializes an instance \n            of the sqlite3_index_info structure with information about the\n            query that it is currently trying to process. This information \n            derives mainly from the WHERE clause and ORDER BY or GROUP BY clauses \n            of the query, but also from any ON or USING clauses if the query is a \n            join. The information that the SQLite core provides to the xBestIndex \n            method is held in the part of the structure that is marked as \"Inputs\". \n            The \"Outputs\" section is initialized to zero.\n            </para>\n            <para>\n            The information in the sqlite3_index_info structure is ephemeral\n            and may be overwritten or deallocated as soon as the xBestIndex method\n            returns.  If the xBestIndex method needs to remember any part of the\n            sqlite3_index_info structure, it should make a copy.  Care must be\n            take to store the copy in a place where it will be deallocated, such\n            as in the idxStr field with needToFreeIdxStr set to 1.\n            </para>\n            <para>\n            Note that xBestIndex will always be called before xFilter, since\n            the idxNum and idxStr outputs from xBestIndex are required inputs to\n            xFilter.  However, there is no guarantee that xFilter will be called\n            following a successful xBestIndex.  \n            </para>\n            <para>\n            The xBestIndex method is required for every virtual table implementation.\n            </para>\n            <para>\n            The main thing that the SQLite core is trying to communicate to \n            the virtual table is the constraints that are available to limit \n            the number of rows that need to be searched. The aConstraint[] array \n            contains one entry for each constraint. There will be exactly \n            nConstraint entries in that array.\n            </para>\n            <para>\n            Each constraint will correspond to a term in the WHERE clause\n            or in a USING or ON clause that is of the form\n            </para>\n            <para><code>\n                 column  OP  EXPR\n            </code></para>\n            <para>\n            Where \"column\" is a column in the virtual table, OP is an operator \n            like \"=\" or \"&lt;\", and EXPR is an arbitrary expression. So, for example,\n            if the WHERE clause contained a term like this:\n            </para>\n            <para><code>\n                 a = 5\n            </code></para>\n            <para>\n            Then one of the constraints would be on the \"a\" column with \n            operator \"=\" and an expression of \"5\". Constraints need not have a\n            literal representation of the WHERE clause. The query optimizer might\n            make transformations to the \n            WHERE clause in order to extract as many constraints \n            as it can. So, for example, if the WHERE clause contained something \n            like this:\n            </para>\n            <para><code>\n                 x BETWEEN 10 AND 100 AND 999&gt;y\n            </code></para>\n            <para>\n            The query optimizer might translate this into three separate constraints:\n            </para>\n            <para><code>\n                 x &gt;= 10\n                 x &lt;= 100\n                 y &lt; 999\n            </code></para>\n            <para>\n            For each constraint, the aConstraint[].iColumn field indicates which \n            column appears on the left-hand side of the constraint.\n            The first column of the virtual table is column 0. \n            The rowid of the virtual table is column -1. \n            The aConstraint[].op field indicates which operator is used. \n            The SQLITE_INDEX_CONSTRAINT_* constants map integer constants \n            into operator values.\n            Columns occur in the order they were defined by the call to\n            sqlite3_declare_vtab() in the xCreate or xConnect method.\n            Hidden columns are counted when determining the column index.\n            </para>\n            <para>\n            The aConstraint[] array contains information about all constraints \n            that apply to the virtual table. But some of the constraints might\n            not be usable because of the way tables are ordered in a join. \n            The xBestIndex method must therefore only consider constraints \n            that have an aConstraint[].usable flag which is true.\n            </para>\n            <para>\n            In addition to WHERE clause constraints, the SQLite core also \n            tells the xBestIndex method about the ORDER BY clause. \n            (In an aggregate query, the SQLite core might put in GROUP BY clause \n            information in place of the ORDER BY clause information, but this fact\n            should not make any difference to the xBestIndex method.) \n            If all terms of the ORDER BY clause are columns in the virtual table, \n            then nOrderBy will be the number of terms in the ORDER BY clause \n            and the aOrderBy[] array will identify the column for each term \n            in the order by clause and whether or not that column is ASC or DESC.\n            </para>\n            <para>\n            In SQLite version 3.10.0 and later, the colUsed field is available\n            to indicate which fields of the virtual table are actually used by the\n            statement being prepared.  If the lowest bit of colUsed is set, that\n            means that the first column is used.  The second lowest bit corresponds\n            to the second column.  And so forth.  If the most significant bit of\n            colUsed is set, that means that one or more columns other than the \n            first 63 columns are used.  If column usage information is needed by the\n            xFilter method, then the required bits must be encoded into either\n            the idxNum or idxStr output fields.\n            </para>\n            <para>\n            Given all of the information above, the job of the xBestIndex \n            method it to figure out the best way to search the virtual table.\n            </para>\n            <para>\n            The xBestIndex method fills the idxNum and idxStr fields with \n            information that communicates an indexing strategy to the xFilter \n            method. The information in idxNum and idxStr is arbitrary as far \n            as the SQLite core is concerned. The SQLite core just copies the \n            information through to the xFilter method. Any desired meaning can \n            be assigned to idxNum and idxStr as long as xBestIndex and xFilter \n            agree on what that meaning is.\n            </para>\n            <para>\n            The idxStr value may be a string obtained from an SQLite\n            memory allocation function such as sqlite3_mprintf(). \n            If this is the case, then the needToFreeIdxStr flag must be set to \n            true so that the SQLite core will know to call sqlite3_free() on \n            that string when it has finished with it, and thus avoid a memory leak.\n            </para>\n            <para>\n            If the virtual table will output rows in the order specified by \n            the ORDER BY clause, then the orderByConsumed flag may be set to \n            true. If the output is not automatically in the correct order \n            then orderByConsumed must be left in its default false setting. \n            This will indicate to the SQLite core that it will need to do a \n            separate sorting pass over the data after it comes out of the virtual table.\n            </para>\n            <para>\n            The estimatedCost field should be set to the estimated number\n            of disk access operations required to execute this query against \n            the virtual table. The SQLite core will often call xBestIndex \n            multiple times with different constraints, obtain multiple cost\n            estimates, then choose the query plan that gives the lowest estimate.\n            </para>\n            <para>\n            If the current version of SQLite is 3.8.2 or greater, the estimatedRows\n            field may be set to an estimate of the number of rows returned by the\n            proposed query plan. If this value is not explicitly set, the default \n            estimate of 25 rows is used.\n            </para>\n            <para>\n            If the current version of SQLite is 3.9.0 or greater, the idxFlags field\n            may be set to SQLITE_INDEX_SCAN_UNIQUE to indicate that the virtual table\n            will return only zero or one rows given the input constraints.  Additional\n            bits of the idxFlags field might be understood in later versions of SQLite.\n            </para>\n            <para>\n            The aConstraintUsage[] array contains one element for each of \n            the nConstraint constraints in the inputs section of the \n            sqlite3_index_info structure. \n            The aConstraintUsage[] array is used by xBestIndex to tell the \n            core how it is using the constraints.\n            </para>\n            <para>\n            The xBestIndex method may set aConstraintUsage[].argvIndex \n            entries to values greater than zero. \n            Exactly one entry should be set to 1, another to 2, another to 3, \n            and so forth up to as many or as few as the xBestIndex method wants. \n            The EXPR of the corresponding constraints will then be passed \n            in as the argv[] parameters to xFilter.\n            </para>\n            <para>\n            For example, if the aConstraint[3].argvIndex is set to 1, then \n            when xFilter is called, the argv[0] passed to xFilter will have \n            the EXPR value of the aConstraint[3] constraint.\n            </para>\n            <para>\n            By default, the SQLite core double checks all constraints on \n            each row of the virtual table that it receives. If such a check \n            is redundant, the xBestFilter method can suppress that double-check by \n            setting aConstraintUsage[].omit.\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"pIndex\">\n            The native pointer to the sqlite3_index_info structure.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)\">\n            <summary>\n            <para><code>\n              int (*xDisconnect)(sqlite3_vtab *pVTab);\n            </code></para>\n            <para>\n            This method releases a connection to a virtual table. \n            Only the sqlite3_vtab object is destroyed.\n            The virtual table is not destroyed and any backing store \n            associated with the virtual table persists. \n            </para>\n            This method undoes the work of xConnect.\n            <para>\n            This method is a destructor for a connection to the virtual table.\n            Contrast this method with xDestroy.  The xDestroy is a destructor\n            for the entire virtual table.\n            </para>\n            <para>\n            The xDisconnect method is required for every virtual table implementation,\n            though it is acceptable for the xDisconnect and xDestroy methods to be\n            the same function if that makes sense for the particular virtual table.\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)\">\n            <summary>\n            <para><code>\n              int (*xDestroy)(sqlite3_vtab *pVTab);\n            </code></para>\n            <para>\n            This method releases a connection to a virtual table, just like \n            the xDisconnect method, and it also destroys the underlying \n            table implementation. This method undoes the work of xCreate.\n            </para>\n            <para>\n            The xDisconnect method is called whenever a database connection\n            that uses a virtual table is closed. The xDestroy method is only \n            called when a DROP TABLE statement is executed against the virtual table.\n            </para>\n            <para>\n            The xDestroy method is required for every virtual table implementation,\n            though it is acceptable for the xDisconnect and xDestroy methods to be\n            the same function if that makes sense for the particular virtual table.\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)\">\n            <summary>\n            <para><code>\n              int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor);\n            </code></para>\n            <para>\n            The xOpen method creates a new cursor used for accessing (read and/or\n            writing) a virtual table.  A successful invocation of this method \n            will allocate the memory for the sqlite3_vtab_cursor (or a subclass),\n            initialize the new object, and make *ppCursor point to the new object.\n            The successful call then returns SQLITE_OK.\n            </para>\n            <para>\n            For every successful call to this method, the SQLite core will\n            later invoke the xClose method to destroy \n            the allocated cursor.\n            </para>\n            <para>\n            The xOpen method need not initialize the pVtab field of the\n            sqlite3_vtab_cursor structure.  The SQLite core will take care\n            of that chore automatically.\n            </para>\n            <para>\n            A virtual table implementation must be able to support an arbitrary\n            number of simultaneously open cursors.\n            </para>\n            <para>\n            When initially opened, the cursor is in an undefined state.\n            The SQLite core will invoke the xFilter method\n            on the cursor prior to any attempt to position or read from the cursor.\n            </para>\n            <para>\n            The xOpen method is required for every virtual table implementation.\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"pCursor\">\n            Upon success, this parameter must be modified to point to the newly\n            created native sqlite3_vtab_cursor derived structure.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)\">\n            <summary>\n            <para><code>\n              int (*xClose)(sqlite3_vtab_cursor*);\n            </code></para>\n            <para>\n            The xClose method closes a cursor previously opened by \n            xOpen. \n            The SQLite core will always call xClose once for each cursor opened \n            using xOpen.\n            </para>\n            <para>\n            This method must release all resources allocated by the\n            corresponding xOpen call. The routine will not be called again even if it\n            returns an error.  The SQLite core will not use the\n            sqlite3_vtab_cursor again after it has been closed.\n            </para>\n            <para>\n            The xClose method is required for every virtual table implementation.\n            </para>\n            </summary>\n            <param name=\"pCursor\">\n            The native pointer to the sqlite3_vtab_cursor derived structure.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\">\n            <summary>\n            <para><code>\n              int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr,\n                            int argc, sqlite3_value **argv);\n            </code></para>\n            <para>\n            This method begins a search of a virtual table. \n            The first argument is a cursor opened by xOpen. \n            The next two arguments define a particular search index previously \n            chosen by xBestIndex. The specific meanings of idxNum and idxStr \n            are unimportant as long as xFilter and xBestIndex agree on what \n            that meaning is.\n            </para>\n            <para>\n            The xBestIndex function may have requested the values of \n            certain expressions using the aConstraintUsage[].argvIndex values \n            of the sqlite3_index_info structure. \n            Those values are passed to xFilter using the argc and argv parameters.\n            </para>\n            <para>\n            If the virtual table contains one or more rows that match the\n            search criteria, then the cursor must be left point at the first row.\n            Subsequent calls to xEof must return false (zero).\n            If there are no rows match, then the cursor must be left in a state \n            that will cause the xEof to return true (non-zero).\n            The SQLite engine will use\n            the xColumn and xRowid methods to access that row content.\n            The xNext method will be used to advance to the next row.\n            </para>\n            <para>\n            This method must return SQLITE_OK if successful, or an sqlite \n            error code if an error occurs.\n            </para>\n            <para>\n            The xFilter method is required for every virtual table implementation.\n            </para>\n            </summary>\n            <param name=\"pCursor\">\n            The native pointer to the sqlite3_vtab_cursor derived structure.\n            </param>\n            <param name=\"idxNum\">\n            Number used to help identify the selected index.\n            </param>\n            <param name=\"idxStr\">\n            The native pointer to the UTF-8 encoded string containing the\n            string used to help identify the selected index.\n            </param>\n            <param name=\"argc\">\n            The number of native pointers to sqlite3_value structures specified\n            in <paramref name=\"argv\" />.\n            </param>\n            <param name=\"argv\">\n            An array of native pointers to sqlite3_value structures containing\n            filtering criteria for the selected index.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)\">\n            <summary>\n            <para><code>\n              int (*xNext)(sqlite3_vtab_cursor*);\n            </code></para>\n            <para>\n            The xNext method advances a virtual table cursor\n            to the next row of a result set initiated by xFilter. \n            If the cursor is already pointing at the last row when this \n            routine is called, then the cursor no longer points to valid \n            data and a subsequent call to the xEof method must return true (non-zero). \n            If the cursor is successfully advanced to another row of content, then\n            subsequent calls to xEof must return false (zero).\n            </para>\n            <para>\n            This method must return SQLITE_OK if successful, or an sqlite \n            error code if an error occurs.\n            </para>\n            <para>\n            The xNext method is required for every virtual table implementation.\n            </para>\n            </summary>\n            <param name=\"pCursor\">\n            The native pointer to the sqlite3_vtab_cursor derived structure.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)\">\n            <summary>\n            <para><code>\n              int (*xEof)(sqlite3_vtab_cursor*);\n            </code></para>\n            <para>\n            The xEof method must return false (zero) if the specified cursor \n            currently points to a valid row of data, or true (non-zero) otherwise. \n            This method is called by the SQL engine immediately after each \n            xFilter and xNext invocation.\n            </para>\n            <para>\n            The xEof method is required for every virtual table implementation.\n            </para>\n            </summary>\n            <param name=\"pCursor\">\n            The native pointer to the sqlite3_vtab_cursor derived structure.\n            </param>\n            <returns>\n            Non-zero if no more rows are available; zero otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\">\n            <summary>\n            <para><code>\n              int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int N);\n            </code></para>\n            <para>\n            The SQLite core invokes this method in order to find the value for \n            the N-th column of the current row. N is zero-based so the first column \n            is numbered 0. \n            The xColumn method may return its result back to SQLite using one of the\n            following interface:\n            </para>\n            <para>\n            <![CDATA[<ul>]]>\n            <![CDATA[<li>]]> sqlite3_result_blob()\n            <![CDATA[<li>]]> sqlite3_result_double()\n            <![CDATA[<li>]]> sqlite3_result_int()\n            <![CDATA[<li>]]> sqlite3_result_int64()\n            <![CDATA[<li>]]> sqlite3_result_null()\n            <![CDATA[<li>]]> sqlite3_result_text()\n            <![CDATA[<li>]]> sqlite3_result_text16()\n            <![CDATA[<li>]]> sqlite3_result_text16le()\n            <![CDATA[<li>]]> sqlite3_result_text16be()\n            <![CDATA[<li>]]> sqlite3_result_zeroblob()\n            <![CDATA[</ul>]]>\n            </para>\n            <para>\n            If the xColumn method implementation calls none of the functions above,\n            then the value of the column defaults to an SQL NULL.\n            </para>\n            <para>\n            To raise an error, the xColumn method should use one of the result_text() \n            methods to set the error message text, then return an appropriate\n            error code.  The xColumn method must return SQLITE_OK on success.\n            </para>\n            <para>\n            The xColumn method is required for every virtual table implementation.\n            </para>\n            </summary>\n            <param name=\"pCursor\">\n            The native pointer to the sqlite3_vtab_cursor derived structure.\n            </param>\n            <param name=\"pContext\">\n            The native pointer to the sqlite3_context structure to be used\n            for returning the specified column value to the SQLite core\n            library.\n            </param>\n            <param name=\"index\">\n            The zero-based index corresponding to the column containing the\n            value to be returned.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)\">\n            <summary>\n            <para><code>\n              int (*xRowid)(sqlite3_vtab_cursor *pCur, sqlite_int64 *pRowid);\n            </code></para>\n            <para>\n            A successful invocation of this method will cause *pRowid to be\n            filled with the rowid of row that the\n            virtual table cursor pCur is currently pointing at.\n            This method returns SQLITE_OK on success.\n            It returns an appropriate error code on failure.\n            </para>\n            <para>\n            The xRowid method is required for every virtual table implementation.\n            </para>\n            </summary>\n            <param name=\"pCursor\">\n            The native pointer to the sqlite3_vtab_cursor derived structure.\n            </param>\n            <param name=\"rowId\">\n            Upon success, this parameter must be modified to contain the unique\n            integer row identifier for the current row for the specified cursor.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\">\n            <summary>\n            <para><code>\n              int (*xUpdate)(\n                sqlite3_vtab *pVTab,\n                int argc,\n                sqlite3_value **argv,\n                sqlite_int64 *pRowid\n              );\n            </code></para>\n            <para>\n            All changes to a virtual table are made using the xUpdate method.\n            This one method can be used to insert, delete, or update.\n            </para>\n            <para>\n            The argc parameter specifies the number of entries in the argv array. \n            The value of argc will be 1 for a pure delete operation or N+2 for an insert\n            or replace or update where N is the number of columns in the table.  \n            In the previous sentence, N includes any hidden columns.\n            </para>\n            <para>\n            Every argv entry will have a non-NULL value in C but may contain the \n            SQL value NULL.  In other words, it is always true that\n            <![CDATA[<tt>]]>argv[i]!=0<![CDATA[</tt>]]> for <![CDATA[<b>]]>i<![CDATA[</b>]]> between 0 and <![CDATA[<tt>]]>argc-1<![CDATA[</tt>]]>.\n            However, it might be the case that\n            <![CDATA[<tt>]]>sqlite3_value_type(argv[i])==SQLITE_NULL<![CDATA[</tt>]]>.\n            </para>\n            <para>\n            The argv[0] parameter is the rowid of a row in the virtual table \n            to be deleted. If argv[0] is an SQL NULL, then no deletion occurs.\n            </para>\n            <para>\n            The argv[1] parameter is the rowid of a new row to be inserted \n            into the virtual table. If argv[1] is an SQL NULL, then the implementation \n            must choose a rowid for the newly inserted row. Subsequent argv[] \n            entries contain values of the columns of the virtual table, in the \n            order that the columns were declared. The number of columns will\n            match the table declaration that the xConnect or xCreate method made \n            using the sqlite3_declare_vtab() call.  All hidden columns are included.\n            </para>\n            <para>\n            When doing an insert without a rowid (argc>1, argv[1] is an SQL NULL), the \n            implementation must set *pRowid to the rowid of the newly inserted row; \n            this will become the value returned by the sqlite3_last_insert_rowid()\n            function. Setting this value in all the other cases is a harmless no-op;\n            the SQLite engine ignores the *pRowid return value if argc==1 or \n            argv[1] is not an SQL NULL.\n            </para>\n            <para>\n            Each call to xUpdate will fall into one of cases shown below.\n            Not that references to <![CDATA[<b>]]>argv[i]<![CDATA[</b>]]> mean the SQL value\n            held within the argv[i] object, not the argv[i]\n            object itself.\n            </para>\n            <para><code>\n            <![CDATA[<dl>]]>\n            <![CDATA[<dt>]]><![CDATA[<b>]]>argc = 1<![CDATA[</b>]]>\n            <![CDATA[<dd>]]>The single row with rowid equal to argv[0] is deleted. No insert occurs.\n            <![CDATA[<dt>]]><![CDATA[<b>]]>argc &gt; 1 <![CDATA[<br>]]> argv[0] = NULL<![CDATA[</b>]]>\n            <![CDATA[<dd>]]>A new row is inserted with a rowid argv[1] and column values in\n                   argv[2] and following.  If argv[1] is an SQL NULL,\n                   the a new unique rowid is generated automatically.\n            <![CDATA[<dt>]]><![CDATA[<b>]]>argc &gt; 1 <![CDATA[<br>]]> argv[0] &#8800; NULL <![CDATA[<br>]]> argv[0] = argv[1]<![CDATA[</b>]]>\n            <![CDATA[<dd>]]>The row with rowid argv[0] is updated with new values \n                   in argv[2] and following parameters.\n            <![CDATA[<dt>]]><![CDATA[<b>]]>argc &gt; 1 <![CDATA[<br>]]> argv[0] &#8800; NULL <![CDATA[<br>]]> argv[0] &#8800; argv[1]<![CDATA[</b>]]>\n            <![CDATA[<dd>]]> The row with rowid argv[0] is updated with rowid argv[1] \n            and new values in argv[2] and following parameters. This will occur \n            when an SQL statement updates a rowid, as in the statement:\n            <para><code>\n               UPDATE table SET rowid=rowid+1 WHERE ...; \n            </code></para>\n            <![CDATA[</dl>]]>\n            </code></para>\n            <para>\n            The xUpdate method must return SQLITE_OK if and only if it is\n            successful.  If a failure occurs, the xUpdate must return an appropriate\n            error code.  On a failure, the pVTab->zErrMsg element may optionally\n            be replaced with error message text stored in memory allocated from SQLite \n            using functions such as sqlite3_mprintf() or sqlite3_malloc().\n            </para>\n            <para>\n            If the xUpdate method violates some constraint of the virtual table\n            (including, but not limited to, attempting to store a value of the wrong \n            datatype, attempting to store a value that is too\n            large or too small, or attempting to change a read-only value) then the\n            xUpdate must fail with an appropriate error code.\n            </para>\n            <para>\n            There might be one or more sqlite3_vtab_cursor objects open and in use \n            on the virtual table instance and perhaps even on the row of the virtual\n            table when the xUpdate method is invoked.  The implementation of\n            xUpdate must be prepared for attempts to delete or modify rows of the table\n            out from other existing cursors.  If the virtual table cannot accommodate\n            such changes, the xUpdate method must return an error code.\n            </para>\n            <para>\n            The xUpdate method is optional.\n            If the xUpdate pointer in the sqlite3_module for a virtual table\n            is a NULL pointer, then the virtual table is read-only.\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"argc\">\n            The number of new or modified column values contained in\n            <paramref name=\"argv\" />.\n            </param>\n            <param name=\"argv\">\n            The array of native pointers to sqlite3_value structures containing\n            the new or modified column values, if any.\n            </param>\n            <param name=\"rowId\">\n            Upon success, this parameter must be modified to contain the unique\n            integer row identifier for the row that was inserted, if any.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)\">\n            <summary>\n            <para><code>\n              int (*xBegin)(sqlite3_vtab *pVTab);\n            </code></para>\n            <para>\n            This method begins a transaction on a virtual table.\n            This is method is optional.  The xBegin pointer of sqlite3_module\n            may be NULL.\n            </para>\n            <para>\n            This method is always followed by one call to either the\n            xCommit or xRollback method.  Virtual table transactions do\n            not nest, so the xBegin method will not be invoked more than once\n            on a single virtual table\n            without an intervening call to either xCommit or xRollback.\n            Multiple calls to other methods can and likely will occur in between\n            the xBegin and the corresponding xCommit or xRollback.\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)\">\n            <summary>\n            <para><code>\n              int (*xSync)(sqlite3_vtab *pVTab);\n            </code></para>\n            <para>\n            This method signals the start of a two-phase commit on a virtual\n            table.\n            This is method is optional.  The xSync pointer of sqlite3_module\n            may be NULL.\n            </para>\n            <para>\n            This method is only invoked after call to the xBegin method and\n            prior to an xCommit or xRollback.  In order to implement two-phase\n            commit, the xSync method on all virtual tables is invoked prior to\n            invoking the xCommit method on any virtual table.  If any of the \n            xSync methods fail, the entire transaction is rolled back.\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)\">\n            <summary>\n            <para><code>\n              int (*xCommit)(sqlite3_vtab *pVTab);\n            </code></para>\n            <para>\n            This method causes a virtual table transaction to commit.\n            This is method is optional.  The xCommit pointer of sqlite3_module\n            may be NULL.\n            </para>\n            <para>\n            A call to this method always follows a prior call to xBegin and\n            xSync.\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)\">\n            <summary>\n            <para><code>\n              int (*xRollback)(sqlite3_vtab *pVTab);\n            </code></para>\n            <para>\n            This method causes a virtual table transaction to rollback.\n            This is method is optional.  The xRollback pointer of sqlite3_module\n            may be NULL.\n            </para>\n            <para>\n            A call to this method always follows a prior call to xBegin.\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\">\n            <summary>\n            <para><code>\n              int (*xFindFunction)(\n                sqlite3_vtab *pVtab,\n                int nArg,\n                const char *zName,\n                void (**pxFunc)(sqlite3_context*,int,sqlite3_value**),\n                void **ppArg\n              );\n            </code></para>\n            <para>\n            This method is called during sqlite3_prepare() to give the virtual\n            table implementation an opportunity to overload functions. \n            This method may be set to NULL in which case no overloading occurs.\n            </para>\n            <para>\n            When a function uses a column from a virtual table as its first \n            argument, this method is called to see if the virtual table would \n            like to overload the function. The first three parameters are inputs: \n            the virtual table, the number of arguments to the function, and the \n            name of the function. If no overloading is desired, this method\n            returns 0. To overload the function, this method writes the new \n            function implementation into *pxFunc and writes user data into *ppArg \n            and returns 1.\n            </para>\n            <para>\n            Note that infix functions (LIKE, GLOB, REGEXP, and MATCH) reverse \n            the order of their arguments. So \"like(A,B)\" is equivalent to \"B like A\". \n            For the form \"B like A\" the B term is considered the first argument \n            to the function. But for \"like(A,B)\" the A term is considered the \n            first argument.\n            </para>\n            <para>\n            The function pointer returned by this routine must be valid for\n            the lifetime of the sqlite3_vtab object given in the first parameter.\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"nArg\">\n            The number of arguments to the function being sought.\n            </param>\n            <param name=\"zName\">\n            The name of the function being sought.\n            </param>\n            <param name=\"callback\">\n            Upon success, this parameter must be modified to contain the\n            delegate responsible for implementing the specified function.\n            </param>\n            <param name=\"pClientData\">\n            Upon success, this parameter must be modified to contain the\n            native user-data pointer associated with\n            <paramref name=\"callback\" />.\n            </param>\n            <returns>\n            Non-zero if the specified function was found; zero otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)\">\n            <summary>\n            <para><code>\n              int (*xRename)(sqlite3_vtab *pVtab, const char *zNew);\n            </code></para>\n            <para>\n            This method provides notification that the virtual table implementation\n            that the virtual table will be given a new name. \n            If this method returns SQLITE_OK then SQLite renames the table.\n            If this method returns an error code then the renaming is prevented.\n            </para>\n            <para>\n            The xRename method is required for every virtual table implementation.\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"zNew\">\n            The native pointer to the UTF-8 encoded string containing the new\n            name for the virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)\">\n            <summary>\n            <para><code>\n              int (*xSavepoint)(sqlite3_vtab *pVtab, int);\n              int (*xRelease)(sqlite3_vtab *pVtab, int);\n              int (*xRollbackTo)(sqlite3_vtab *pVtab, int);\n            </code></para>\n            <para>\n            These methods provide the virtual table implementation an opportunity to\n            implement nested transactions.  They are always optional and will only be\n            called in SQLite version 3.7.7 and later.\n            </para>\n            <para>\n            When xSavepoint(X,N) is invoked, that is a signal to the virtual table X\n            that it should save its current state as savepoint N.  \n            A subsequent call\n            to xRollbackTo(X,R) means that the state of the virtual table should return\n            to what it was when xSavepoint(X,R) was last called.  \n            The call\n            to xRollbackTo(X,R) will invalidate all savepoints with N>R; none of the\n            invalided savepoints will be rolled back or released without first\n            being reinitialized by a call to xSavepoint().  \n            A call to xRelease(X,M) invalidates all savepoints where N>=M.\n            </para>\n            <para>\n            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will ever\n            be called except in between calls to xBegin() and \n            either xCommit() or xRollback().\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"iSavepoint\">\n            This is an integer identifier under which the the current state of\n            the virtual table should be saved.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)\">\n            <summary>\n            <para><code>\n              int (*xSavepoint)(sqlite3_vtab *pVtab, int);\n              int (*xRelease)(sqlite3_vtab *pVtab, int);\n              int (*xRollbackTo)(sqlite3_vtab *pVtab, int);\n            </code></para>\n            <para>\n            These methods provide the virtual table implementation an opportunity to\n            implement nested transactions.  They are always optional and will only be\n            called in SQLite version 3.7.7 and later.\n            </para>\n            <para>\n            When xSavepoint(X,N) is invoked, that is a signal to the virtual table X\n            that it should save its current state as savepoint N.  \n            A subsequent call\n            to xRollbackTo(X,R) means that the state of the virtual table should return\n            to what it was when xSavepoint(X,R) was last called.  \n            The call\n            to xRollbackTo(X,R) will invalidate all savepoints with N>R; none of the\n            invalided savepoints will be rolled back or released without first\n            being reinitialized by a call to xSavepoint().  \n            A call to xRelease(X,M) invalidates all savepoints where N>=M.\n            </para>\n            <para>\n            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will ever\n            be called except in between calls to xBegin() and \n            either xCommit() or xRollback().\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"iSavepoint\">\n            This is an integer used to indicate that any saved states with an\n            identifier greater than or equal to this should be deleted by the\n            virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)\">\n            <summary>\n            <para><code>\n              int (*xSavepoint)(sqlite3_vtab *pVtab, int);\n              int (*xRelease)(sqlite3_vtab *pVtab, int);\n              int (*xRollbackTo)(sqlite3_vtab *pVtab, int);\n            </code></para>\n            <para>\n            These methods provide the virtual table implementation an opportunity to\n            implement nested transactions.  They are always optional and will only be\n            called in SQLite version 3.7.7 and later.\n            </para>\n            <para>\n            When xSavepoint(X,N) is invoked, that is a signal to the virtual table X\n            that it should save its current state as savepoint N.  \n            A subsequent call\n            to xRollbackTo(X,R) means that the state of the virtual table should return\n            to what it was when xSavepoint(X,R) was last called.  \n            The call\n            to xRollbackTo(X,R) will invalidate all savepoints with N>R; none of the\n            invalided savepoints will be rolled back or released without first\n            being reinitialized by a call to xSavepoint().  \n            A call to xRelease(X,M) invalidates all savepoints where N>=M.\n            </para>\n            <para>\n            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will ever\n            be called except in between calls to xBegin() and \n            either xCommit() or xRollback().\n            </para>\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"iSavepoint\">\n            This is an integer identifier used to specify a specific saved\n            state for the virtual table for it to restore itself back to, which\n            should also have the effect of deleting all saved states with an\n            integer identifier greater than this one.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteContext\">\n            <summary>\n            This class represents a context from the SQLite core library that can\n            be passed to the sqlite3_result_*() and associated functions.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.ISQLiteNativeHandle\">\n            <summary>\n            This interface represents a native handle provided by the SQLite core\n            library.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.ISQLiteNativeHandle.NativeHandle\">\n            <summary>\n            The native handle value.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteContext.pContext\">\n            <summary>\n            The native context handle.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteContext.#ctor(System.IntPtr)\">\n            <summary>\n            Constructs an instance of this class using the specified native\n            context handle.\n            </summary>\n            <param name=\"pContext\">\n            The native context handle to use.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteContext.SetNull\">\n            <summary>\n            Sets the context result to NULL.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteContext.SetDouble(System.Double)\">\n            <summary>\n            Sets the context result to the specified <see cref=\"T:System.Double\"/>\n            value.\n            </summary>\n            <param name=\"value\">\n            The <see cref=\"T:System.Double\"/> value to use.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteContext.SetInt(System.Int32)\">\n            <summary>\n            Sets the context result to the specified <see cref=\"T:System.Int32\"/>\n            value.\n            </summary>\n            <param name=\"value\">\n            The <see cref=\"T:System.Int32\"/> value to use.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteContext.SetInt64(System.Int64)\">\n            <summary>\n            Sets the context result to the specified <see cref=\"T:System.Int64\"/>\n            value.\n            </summary>\n            <param name=\"value\">\n            The <see cref=\"T:System.Int64\"/> value to use.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteContext.SetString(System.String)\">\n            <summary>\n            Sets the context result to the specified <see cref=\"T:System.String\"/>\n            value.\n            </summary>\n            <param name=\"value\">\n            The <see cref=\"T:System.String\"/> value to use.  This value will be\n            converted to the UTF-8 encoding prior to being used.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteContext.SetError(System.String)\">\n            <summary>\n            Sets the context result to the specified <see cref=\"T:System.String\"/>\n            value containing an error message.\n            </summary>\n            <param name=\"value\">\n            The <see cref=\"T:System.String\"/> value containing the error message text.\n            This value will be converted to the UTF-8 encoding prior to being\n            used.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteContext.SetErrorCode(System.Data.SQLite.SQLiteErrorCode)\">\n            <summary>\n            Sets the context result to the specified <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/>\n            value.\n            </summary>\n            <param name=\"value\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/> value to use.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteContext.SetErrorTooBig\">\n            <summary>\n            Sets the context result to contain the error code SQLITE_TOOBIG.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteContext.SetErrorNoMemory\">\n            <summary>\n            Sets the context result to contain the error code SQLITE_NOMEM.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteContext.SetBlob(System.Byte[])\">\n            <summary>\n            Sets the context result to the specified <see cref=\"T:System.Byte\"/> array\n            value.\n            </summary>\n            <param name=\"value\">\n            The <see cref=\"T:System.Byte\"/> array value to use.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteContext.SetZeroBlob(System.Int32)\">\n            <summary>\n            Sets the context result to a BLOB of zeros of the specified size.\n            </summary>\n            <param name=\"value\">\n            The number of zero bytes to use for the BLOB context result.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteContext.SetValue(System.Data.SQLite.SQLiteValue)\">\n            <summary>\n            Sets the context result to the specified <see cref=\"T:System.Data.SQLite.SQLiteValue\"/>.\n            </summary>\n            <param name=\"value\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteValue\"/> to use.\n            </param>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteContext.NativeHandle\">\n            <summary>\n            Returns the underlying SQLite native handle associated with this\n            object instance.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteValue\">\n            <summary>\n            This class represents a value from the SQLite core library that can be\n            passed to the sqlite3_value_*() and associated functions.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteValue.pValue\">\n            <summary>\n            The native value handle.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteValue.#ctor(System.IntPtr)\">\n            <summary>\n            Constructs an instance of this class using the specified native\n            value handle.\n            </summary>\n            <param name=\"pValue\">\n            The native value handle to use.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteValue.PreventNativeAccess\">\n            <summary>\n            Invalidates the native value handle, thereby preventing further\n            access to it from this object instance.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteValue.ArrayFromSizeAndIntPtr(System.Int32,System.IntPtr)\">\n            <summary>\n            Converts a logical array of native pointers to native sqlite3_value\n            structures into a managed array of <see cref=\"T:System.Data.SQLite.SQLiteValue\"/>\n            object instances.\n            </summary>\n            <param name=\"argc\">\n            The number of elements in the logical array of native sqlite3_value\n            structures.\n            </param>\n            <param name=\"argv\">\n            The native pointer to the logical array of native sqlite3_value\n            structures to convert.\n            </param>\n            <returns>\n            The managed array of <see cref=\"T:System.Data.SQLite.SQLiteValue\"/> object instances or\n            null upon failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteValue.GetTypeAffinity\">\n            <summary>\n            Gets and returns the type affinity associated with this value.\n            </summary>\n            <returns>\n            The type affinity associated with this value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteValue.GetBytes\">\n            <summary>\n            Gets and returns the number of bytes associated with this value, if\n            it refers to a UTF-8 encoded string.\n            </summary>\n            <returns>\n            The number of bytes associated with this value.  The returned value\n            may be zero.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteValue.GetInt\">\n            <summary>\n            Gets and returns the <see cref=\"T:System.Int32\"/> associated with this\n            value.\n            </summary>\n            <returns>\n            The <see cref=\"T:System.Int32\"/> associated with this value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteValue.GetInt64\">\n            <summary>\n            Gets and returns the <see cref=\"T:System.Int64\"/> associated with\n            this value.\n            </summary>\n            <returns>\n            The <see cref=\"T:System.Int64\"/> associated with this value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteValue.GetDouble\">\n            <summary>\n            Gets and returns the <see cref=\"T:System.Double\"/> associated with this\n            value.\n            </summary>\n            <returns>\n            The <see cref=\"T:System.Double\"/> associated with this value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteValue.GetString\">\n            <summary>\n            Gets and returns the <see cref=\"T:System.String\"/> associated with this\n            value.\n            </summary>\n            <returns>\n            The <see cref=\"T:System.String\"/> associated with this value.  The value is\n            converted from the UTF-8 encoding prior to being returned.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteValue.GetBlob\">\n            <summary>\n            Gets and returns the <see cref=\"T:System.Byte\"/> array associated with this\n            value.\n            </summary>\n            <returns>\n            The <see cref=\"T:System.Byte\"/> array associated with this value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteValue.Persist\">\n            <summary>\n            Uses the native value handle to obtain and store the managed value\n            for this object instance, thus saving it for later use.  The type\n            of the managed value is determined by the type affinity of the\n            native value.  If the type affinity is not recognized by this\n            method, no work is done and false is returned.\n            </summary>\n            <returns>\n            Non-zero if the native value was persisted successfully.\n            </returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteValue.NativeHandle\">\n            <summary>\n            Returns the underlying SQLite native handle associated with this\n            object instance.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteValue.Persisted\">\n            <summary>\n            Returns non-zero if the native SQLite value has been successfully\n            persisted as a managed value within this object instance (i.e. the\n            <see cref=\"P:System.Data.SQLite.SQLiteValue.Value\"/> property may then be read successfully).\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteValue.Value\">\n            <summary>\n            If the managed value for this object instance is available (i.e. it\n            has been previously persisted via the <see cref=\"M:System.Data.SQLite.SQLiteValue.Persist\"/>) method,\n            that value is returned; otherwise, an exception is thrown.  The\n            returned value may be null.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteIndexConstraintOp\">\n            <summary>\n            These are the allowed values for the operators that are part of a\n            constraint term in the WHERE clause of a query that uses a virtual\n            table.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexConstraintOp.EqualTo\">\n            <summary>\n            This value represents the equality operator.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexConstraintOp.GreaterThan\">\n            <summary>\n            This value represents the greater than operator.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexConstraintOp.LessThanOrEqualTo\">\n            <summary>\n            This value represents the less than or equal to operator.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexConstraintOp.LessThan\">\n            <summary>\n            This value represents the less than operator.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexConstraintOp.GreaterThanOrEqualTo\">\n            <summary>\n            This value represents the greater than or equal to operator.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexConstraintOp.Match\">\n            <summary>\n            This value represents the MATCH operator.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteIndexFlags\">\n            <summary>\n            These are the allowed values for the index flags from the\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/> method.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexFlags.None\">\n            <summary>\n            No special handling.  This is the default.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexFlags.ScanUnique\">\n            <summary>\n            This value indicates that the scan of the index will visit at\n            most one row.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteIndexConstraint\">\n            <summary>\n            This class represents the native sqlite3_index_constraint structure\n            from the SQLite core library.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndexConstraint.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_constraint)\">\n            <summary>\n            Constructs an instance of this class using the specified native\n            sqlite3_index_constraint structure.\n            </summary>\n            <param name=\"constraint\">\n            The native sqlite3_index_constraint structure to use.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndexConstraint.#ctor(System.Int32,System.Data.SQLite.SQLiteIndexConstraintOp,System.Byte,System.Int32)\">\n            <summary>\n            Constructs an instance of this class using the specified field\n            values.\n            </summary>\n            <param name=\"iColumn\">\n            Column on left-hand side of constraint.\n            </param>\n            <param name=\"op\">\n            Constraint operator (<see cref=\"T:System.Data.SQLite.SQLiteIndexConstraintOp\"/>).\n            </param>\n            <param name=\"usable\">\n            True if this constraint is usable.\n            </param>\n            <param name=\"iTermOffset\">\n            Used internally - <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/>\n            should ignore.\n            </param>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexConstraint.iColumn\">\n            <summary>\n            Column on left-hand side of constraint.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexConstraint.op\">\n            <summary>\n            Constraint operator (<see cref=\"T:System.Data.SQLite.SQLiteIndexConstraintOp\"/>).\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexConstraint.usable\">\n            <summary>\n            True if this constraint is usable.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexConstraint.iTermOffset\">\n            <summary>\n            Used internally - <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/>\n            should ignore.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteIndexOrderBy\">\n            <summary>\n            This class represents the native sqlite3_index_orderby structure from\n            the SQLite core library.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndexOrderBy.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_orderby)\">\n            <summary>\n            Constructs an instance of this class using the specified native\n            sqlite3_index_orderby structure.\n            </summary>\n            <param name=\"orderBy\">\n            The native sqlite3_index_orderby structure to use.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndexOrderBy.#ctor(System.Int32,System.Byte)\">\n            <summary>\n            Constructs an instance of this class using the specified field\n            values.\n            </summary>\n            <param name=\"iColumn\">\n            Column number.\n            </param>\n            <param name=\"desc\">\n            True for DESC.  False for ASC.\n            </param>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexOrderBy.iColumn\">\n            <summary>\n            Column number.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexOrderBy.desc\">\n            <summary>\n            True for DESC.  False for ASC.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteIndexConstraintUsage\">\n            <summary>\n            This class represents the native sqlite3_index_constraint_usage\n            structure from the SQLite core library.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndexConstraintUsage.#ctor\">\n            <summary>\n            Constructs a default instance of this class.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndexConstraintUsage.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_constraint_usage)\">\n            <summary>\n            Constructs an instance of this class using the specified native\n            sqlite3_index_constraint_usage structure.\n            </summary>\n            <param name=\"constraintUsage\">\n            The native sqlite3_index_constraint_usage structure to use.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndexConstraintUsage.#ctor(System.Int32,System.Byte)\">\n            <summary>\n            Constructs an instance of this class using the specified field\n            values.\n            </summary>\n            <param name=\"argvIndex\">\n            If greater than 0, constraint is part of argv to xFilter.\n            </param>\n            <param name=\"omit\">\n            Do not code a test for this constraint.\n            </param>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexConstraintUsage.argvIndex\">\n            <summary>\n            If greater than 0, constraint is part of argv to xFilter.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteIndexConstraintUsage.omit\">\n            <summary>\n            Do not code a test for this constraint.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteIndexInputs\">\n            <summary>\n            This class represents the various inputs provided by the SQLite core\n            library to the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/> method.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndexInputs.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"nConstraint\">\n            The number of <see cref=\"T:System.Data.SQLite.SQLiteIndexConstraint\"/> instances to\n            pre-allocate space for.\n            </param>\n            <param name=\"nOrderBy\">\n            The number of <see cref=\"T:System.Data.SQLite.SQLiteIndexOrderBy\"/> instances to\n            pre-allocate space for.\n            </param>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteIndexInputs.Constraints\">\n            <summary>\n            An array of <see cref=\"T:System.Data.SQLite.SQLiteIndexConstraint\"/> object instances,\n            each containing information supplied by the SQLite core library.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteIndexInputs.OrderBys\">\n            <summary>\n            An array of <see cref=\"T:System.Data.SQLite.SQLiteIndexOrderBy\"/> object instances,\n            each containing information supplied by the SQLite core library.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteIndexOutputs\">\n            <summary>\n            This class represents the various outputs provided to the SQLite core\n            library by the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/> method.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndexOutputs.#ctor(System.Int32)\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"nConstraint\">\n            The number of <see cref=\"T:System.Data.SQLite.SQLiteIndexConstraintUsage\"/> instances\n            to pre-allocate space for.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndexOutputs.CanUseEstimatedRows\">\n            <summary>\n            Determines if the native estimatedRows field can be used, based on\n            the available version of the SQLite core library.\n            </summary>\n            <returns>\n            Non-zero if the <see cref=\"P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedRows\"/> property is supported\n            by the SQLite core library.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndexOutputs.CanUseIndexFlags\">\n            <summary>\n            Determines if the native flags field can be used, based on the\n            available version of the SQLite core library.\n            </summary>\n            <returns>\n            Non-zero if the <see cref=\"P:System.Data.SQLite.SQLiteIndexOutputs.IndexFlags\"/> property is supported by\n            the SQLite core library.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndexOutputs.CanUseColumnsUsed\">\n            <summary>\n            Determines if the native flags field can be used, based on the\n            available version of the SQLite core library.\n            </summary>\n            <returns>\n            Non-zero if the <see cref=\"P:System.Data.SQLite.SQLiteIndexOutputs.ColumnsUsed\"/> property is supported by\n            the SQLite core library.\n            </returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteIndexOutputs.ConstraintUsages\">\n            <summary>\n            An array of <see cref=\"T:System.Data.SQLite.SQLiteIndexConstraintUsage\"/> object\n            instances, each containing information to be supplied to the SQLite\n            core library.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteIndexOutputs.IndexNumber\">\n            <summary>\n            Number used to help identify the selected index.  This value will\n            later be provided to the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/>\n            method.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteIndexOutputs.IndexString\">\n            <summary>\n            String used to help identify the selected index.  This value will\n            later be provided to the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/>\n            method.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteIndexOutputs.NeedToFreeIndexString\">\n            <summary>\n            Non-zero if the index string must be freed by the SQLite core\n            library.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteIndexOutputs.OrderByConsumed\">\n            <summary>\n            True if output is already ordered.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedCost\">\n            <summary>\n            Estimated cost of using this index.  Using a null value here\n            indicates that a default estimated cost value should be used.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedRows\">\n            <summary>\n            Estimated number of rows returned.  Using a null value here\n            indicates that a default estimated rows value should be used.\n            This property has no effect if the SQLite core library is not at\n            least version 3.8.2.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteIndexOutputs.IndexFlags\">\n            <summary>\n            The flags that should be used with this index.  Using a null value\n            here indicates that a default flags value should be used.  This\n            property has no effect if the SQLite core library is not at least\n            version 3.9.0.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteIndexOutputs.ColumnsUsed\">\n            <summary>\n            <para>\n            Indicates which columns of the virtual table may be required by the\n            current scan.  Virtual table columns are numbered from zero in the\n            order in which they appear within the CREATE TABLE statement passed\n            to sqlite3_declare_vtab().  For the first 63 columns (columns 0-62),\n            the corresponding bit is set within the bit mask if the column may\n            be required by SQLite.  If the table has at least 64 columns and\n            any column to the right of the first 63 is required, then bit 63 of\n            colUsed is also set.  In other words, column iCol may be required\n            if the expression\n            </para>\n            <para><code>\n            (colUsed &amp; ((sqlite3_uint64)1 &lt;&lt; (iCol&gt;=63 ? 63 : iCol)))\n            </code></para>\n            <para>\n            evaluates to non-zero.  Using a null value here indicates that a\n            default flags value should be used.  This property has no effect if\n            the SQLite core library is not at least version 3.10.0.\n            </para>\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteIndex\">\n            <summary>\n            This class represents the various inputs and outputs used with the\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/> method.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndex.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"nConstraint\">\n            The number of <see cref=\"T:System.Data.SQLite.SQLiteIndexConstraint\"/> (and\n            <see cref=\"T:System.Data.SQLite.SQLiteIndexConstraintUsage\"/>) instances to\n            pre-allocate space for.\n            </param>\n            <param name=\"nOrderBy\">\n            The number of <see cref=\"T:System.Data.SQLite.SQLiteIndexOrderBy\"/> instances to\n            pre-allocate space for.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndex.SizeOfNative(System.Int32@,System.Int32@,System.Int32@,System.Int32@)\">\n            <summary>\n            Attempts to determine the structure sizes needed to create and\n            populate a native\n            <see cref=\"T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_info\"/>\n            structure.\n            </summary>\n            <param name=\"sizeOfInfoType\">\n            The size of the native\n            <see cref=\"T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_info\"/>\n            structure is stored here.\n            </param>\n            <param name=\"sizeOfConstraintType\">\n            The size of the native\n            <see cref=\"T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_constraint\"/>\n            structure is stored here.\n            </param>\n            <param name=\"sizeOfOrderByType\">\n            The size of the native\n            <see cref=\"T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_orderby\"/>\n            structure is stored here.\n            </param>\n            <param name=\"sizeOfConstraintUsageType\">\n            The size of the native\n            <see cref=\"T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_constraint_usage\"/>\n            structure is stored here.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndex.AllocateAndInitializeNative(System.Int32,System.Int32)\">\n            <summary>\n            Attempts to allocate and initialize a native\n            <see cref=\"T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_info\"/>\n            structure.\n            </summary>\n            <param name=\"nConstraint\">\n            The number of <see cref=\"T:System.Data.SQLite.SQLiteIndexConstraint\"/> instances to\n            pre-allocate space for.\n            </param>\n            <param name=\"nOrderBy\">\n            The number of <see cref=\"T:System.Data.SQLite.SQLiteIndexOrderBy\"/> instances to\n            pre-allocate space for.\n            </param>\n            <returns>\n            The newly allocated native\n            <see cref=\"T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_info\"/> structure\n            -OR- <see cref=\"F:System.IntPtr.Zero\"/> if it could not be fully allocated.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndex.FreeNative(System.IntPtr)\">\n            <summary>\n            Frees all the memory associated with a native\n            <see cref=\"T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_info\"/>\n            structure.\n            </summary>\n            <param name=\"pIndex\">\n            The native pointer to the native sqlite3_index_info structure to\n            free.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndex.FromIntPtr(System.IntPtr,System.Boolean,System.Data.SQLite.SQLiteIndex@)\">\n            <summary>\n            Converts a native pointer to a native sqlite3_index_info structure\n            into a new <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance.\n            </summary>\n            <param name=\"pIndex\">\n            The native pointer to the native sqlite3_index_info structure to\n            convert.\n            </param>\n            <param name=\"includeOutput\">\n            Non-zero to include fields from the outputs portion of the native\n            structure; otherwise, the \"output\" fields will not be read.\n            </param>\n            <param name=\"index\">\n            Upon success, this parameter will be modified to contain the newly\n            created <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteIndex.ToIntPtr(System.Data.SQLite.SQLiteIndex,System.IntPtr,System.Boolean)\">\n            <summary>\n            Populates the outputs of a pre-allocated native sqlite3_index_info\n            structure using an existing <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object\n            instance.\n            </summary>\n            <param name=\"index\">\n            The existing <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance containing\n            the output data to use.\n            </param>\n            <param name=\"pIndex\">\n            The native pointer to the pre-allocated native sqlite3_index_info\n            structure.\n            </param>\n            <param name=\"includeInput\">\n            Non-zero to include fields from the inputs portion of the native\n            structure; otherwise, the \"input\" fields will not be written.\n            </param>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteIndex.Inputs\">\n            <summary>\n            The <see cref=\"T:System.Data.SQLite.SQLiteIndexInputs\"/> object instance containing\n            the inputs to the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/>\n            method.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteIndex.Outputs\">\n            <summary>\n            The <see cref=\"T:System.Data.SQLite.SQLiteIndexOutputs\"/> object instance containing\n            the outputs from the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/>\n            method.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteVirtualTable\">\n            <summary>\n            This class represents a managed virtual table implementation.  It is\n            not sealed and should be used as the base class for any user-defined\n            virtual table classes implemented in managed code.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteVirtualTable.ModuleNameIndex\">\n            <summary>\n            The index within the array of strings provided to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> and\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> methods containing the\n            name of the module implementing this virtual table.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteVirtualTable.DatabaseNameIndex\">\n            <summary>\n            The index within the array of strings provided to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> and\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> methods containing the\n            name of the database containing this virtual table.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteVirtualTable.TableNameIndex\">\n            <summary>\n            The index within the array of strings provided to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> and\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> methods containing the\n            name of the virtual table.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTable.#ctor(System.String[])\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"arguments\">\n            The original array of strings provided to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> and\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> methods.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTable.BestIndex(System.Data.SQLite.SQLiteIndex)\">\n            <summary>\n            This method should normally be used by the\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/> method in order to\n            perform index selection based on the constraints provided by the\n            SQLite core library.\n            </summary>\n            <param name=\"index\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance containing all the\n            data for the inputs and outputs relating to index selection.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTable.Rename(System.String)\">\n            <summary>\n            Attempts to record the renaming of the virtual table associated\n            with this object instance.\n            </summary>\n            <param name=\"name\">\n            The new name for the virtual table.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTable.Dispose\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTable.CheckDisposed\">\n            <summary>\n            Throws an <see cref=\"T:System.ObjectDisposedException\"/> if this object\n            instance has been disposed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTable.Dispose(System.Boolean)\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n            <param name=\"disposing\">\n            Non-zero if this method is being called from the\n            <see cref=\"M:System.Data.SQLite.SQLiteVirtualTable.Dispose\"/> method.  Zero if this method is being called\n            from the finalizer.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTable.Finalize\">\n            <summary>\n            Finalizes this object instance.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTable.Arguments\">\n            <summary>\n            The original array of strings provided to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> and\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> methods.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTable.ModuleName\">\n            <summary>\n            The name of the module implementing this virtual table.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTable.DatabaseName\">\n            <summary>\n            The name of the database containing this virtual table.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTable.TableName\">\n            <summary>\n            The name of the virtual table.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTable.Index\">\n            <summary>\n            The <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance containing all the\n            data for the inputs and outputs relating to the most recent index\n            selection.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTable.NativeHandle\">\n            <summary>\n            Returns the underlying SQLite native handle associated with this\n            object instance.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\">\n            <summary>\n            This class represents a managed virtual table cursor implementation.\n            It is not sealed and should be used as the base class for any\n            user-defined virtual table cursor classes implemented in managed code.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteVirtualTableCursor.InvalidRowIndex\">\n            <summary>\n            This value represents an invalid integer row sequence number.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteVirtualTableCursor.rowIndex\">\n            <summary>\n            The field holds the integer row sequence number for the current row\n            pointed to by this cursor object instance.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.#ctor(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this object instance.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.#ctor\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.TryPersistValues(System.Data.SQLite.SQLiteValue[])\">\n            <summary>\n            Attempts to persist the specified <see cref=\"T:System.Data.SQLite.SQLiteValue\"/> object\n            instances in order to make them available after the\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method returns.\n            </summary>\n            <param name=\"values\">\n            The array of <see cref=\"T:System.Data.SQLite.SQLiteValue\"/> object instances to be\n            persisted.\n            </param>\n            <returns>\n            The number of <see cref=\"T:System.Data.SQLite.SQLiteValue\"/> object instances that were\n            successfully persisted.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\">\n            <summary>\n            This method should normally be used by the\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method in order to\n            perform filtering of the result rows and/or to record the filtering\n            criteria provided by the SQLite core library.\n            </summary>\n            <param name=\"indexNumber\">\n            Number used to help identify the selected index.\n            </param>\n            <param name=\"indexString\">\n            String used to help identify the selected index.\n            </param>\n            <param name=\"values\">\n            The values corresponding to each column in the selected index.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.GetRowIndex\">\n            <summary>\n            Determines the integer row sequence number for the current row.\n            </summary>\n            <returns>\n            The integer row sequence number for the current row -OR- zero if\n            it cannot be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.NextRowIndex\">\n            <summary>\n            Adjusts the integer row sequence number so that it refers to the\n            next row.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.CheckDisposed\">\n            <summary>\n            Throws an <see cref=\"T:System.ObjectDisposedException\"/> if this object\n            instance has been disposed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose(System.Boolean)\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n            <param name=\"disposing\">\n            Non-zero if this method is being called from the\n            <see cref=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose\"/> method.  Zero if this method is being called\n            from the finalizer.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.Finalize\">\n            <summary>\n            Finalizes this object instance.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTableCursor.Table\">\n            <summary>\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this object instance.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTableCursor.IndexNumber\">\n            <summary>\n            Number used to help identify the selected index.  This value will\n            be set via the <see cref=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTableCursor.IndexString\">\n            <summary>\n            String used to help identify the selected index.  This value will\n            be set via the <see cref=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTableCursor.Values\">\n            <summary>\n            The values used to filter the rows returned via this cursor object\n            instance.  This value will be set via the <see cref=\"M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/>\n            method.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTableCursor.NativeHandle\">\n            <summary>\n            Returns the underlying SQLite native handle associated with this\n            object instance.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.ISQLiteManagedModule\">\n            <summary>\n            This interface represents a virtual table implementation written in\n            managed code.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"connection\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> object instance associated with\n            the virtual table.\n            </param>\n            <param name=\"pClientData\">\n            The native user-data pointer associated with this module, as it was\n            provided to the SQLite core library when the native module instance\n            was created.\n            </param>\n            <param name=\"arguments\">\n            The module name, database name, virtual table name, and all other\n            arguments passed to the CREATE VIRTUAL TABLE statement.\n            </param>\n            <param name=\"table\">\n            Upon success, this parameter must be modified to contain the\n            <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated with\n            the virtual table.\n            </param>\n            <param name=\"error\">\n            Upon failure, this parameter must be modified to contain an error\n            message.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"connection\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> object instance associated with\n            the virtual table.\n            </param>\n            <param name=\"pClientData\">\n            The native user-data pointer associated with this module, as it was\n            provided to the SQLite core library when the native module instance\n            was created.\n            </param>\n            <param name=\"arguments\">\n            The module name, database name, virtual table name, and all other\n            arguments passed to the CREATE VIRTUAL TABLE statement.\n            </param>\n            <param name=\"table\">\n            Upon success, this parameter must be modified to contain the\n            <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated with\n            the virtual table.\n            </param>\n            <param name=\"error\">\n            Upon failure, this parameter must be modified to contain an error\n            message.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"index\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance containing all the\n            data for the inputs and outputs relating to index selection.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"cursor\">\n            Upon success, this parameter must be modified to contain the\n            <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance associated\n            with the newly opened virtual table cursor.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <param name=\"indexNumber\">\n            Number used to help identify the selected index.\n            </param>\n            <param name=\"indexString\">\n            String used to help identify the selected index.\n            </param>\n            <param name=\"values\">\n            The values corresponding to each column in the selected index.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <returns>\n            Non-zero if no more rows are available; zero otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <param name=\"context\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteContext\"/> object instance to be used for\n            returning the specified column value to the SQLite core library.\n            </param>\n            <param name=\"index\">\n            The zero-based index corresponding to the column containing the\n            value to be returned.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <param name=\"rowId\">\n            Upon success, this parameter must be modified to contain the unique\n            integer row identifier for the current row for the specified cursor.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"values\">\n            The array of <see cref=\"T:System.Data.SQLite.SQLiteValue\"/> object instances containing\n            the new or modified column values, if any.\n            </param>\n            <param name=\"rowId\">\n            Upon success, this parameter must be modified to contain the unique\n            integer row identifier for the row that was inserted, if any.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"argumentCount\">\n            The number of arguments to the function being sought.\n            </param>\n            <param name=\"name\">\n            The name of the function being sought.\n            </param>\n            <param name=\"function\">\n            Upon success, this parameter must be modified to contain the\n            <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> object instance responsible for\n            implementing the specified function.\n            </param>\n            <param name=\"pClientData\">\n            Upon success, this parameter must be modified to contain the\n            native user-data pointer associated with\n            <paramref name=\"function\"/>.\n            </param>\n            <returns>\n            Non-zero if the specified function was found; zero otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"newName\">\n            The new name for the virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"savepoint\">\n            This is an integer identifier under which the the current state of\n            the virtual table should be saved.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"savepoint\">\n            This is an integer used to indicate that any saved states with an\n            identifier greater than or equal to this should be deleted by the\n            virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"savepoint\">\n            This is an integer identifier used to specify a specific saved\n            state for the virtual table for it to restore itself back to, which\n            should also have the effect of deleting all saved states with an\n            integer identifier greater than this one.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"P:System.Data.SQLite.ISQLiteManagedModule.Declared\">\n            <summary>\n            Returns non-zero if the schema for the virtual table has been\n            declared.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.ISQLiteManagedModule.Name\">\n            <summary>\n            Returns the name of the module as it was registered with the SQLite\n            core library.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteMemory\">\n            <summary>\n            This class contains static methods that are used to allocate,\n            manipulate, and free native memory provided by the SQLite core library.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)\">\n            <summary>\n            Allocates at least the specified number of bytes of native memory\n            via the SQLite core library sqlite3_malloc() function and returns\n            the resulting native pointer.\n            </summary>\n            <param name=\"size\">\n            The number of bytes to allocate.\n            </param>\n            <returns>\n            The native pointer that points to a block of memory of at least the\n            specified size -OR- <see cref=\"F:System.IntPtr.Zero\"/> if the memory could\n            not be allocated.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMemory.Size(System.IntPtr)\">\n            <summary>\n            Gets and returns the actual size of the specified memory block that\n            was previously obtained from the <see cref=\"M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)\"/> method.\n            </summary>\n            <param name=\"pMemory\">\n            The native pointer to the memory block previously obtained from the\n            <see cref=\"M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)\"/> method.\n            </param>\n            <returns>\n            The actual size, in bytes, of the memory block specified via the\n            native pointer.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMemory.Free(System.IntPtr)\">\n            <summary>\n            Frees a memory block previously obtained from the\n            <see cref=\"M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)\"/> method.\n            </summary>\n            <param name=\"pMemory\">\n            The native pointer to the memory block previously obtained from the\n            <see cref=\"M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)\"/> method.\n            </param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteString\">\n            <summary>\n            This class contains static methods that are used to deal with native\n            UTF-8 string pointers to be used with the SQLite core library.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteString.ThirtyBits\">\n            <summary>\n            This is the maximum possible length for the native UTF-8 encoded\n            strings used with the SQLite core library.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteString.Utf8Encoding\">\n            <summary>\n            This is the <see cref=\"T:System.Text.Encoding\"/> object instance used to handle\n            conversions from/to UTF-8.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteString.GetUtf8BytesFromString(System.String)\">\n            <summary>\n            Converts the specified managed string into the UTF-8 encoding and\n            returns the array of bytes containing its representation in that\n            encoding.\n            </summary>\n            <param name=\"value\">\n            The managed string to convert.\n            </param>\n            <returns>\n            The array of bytes containing the representation of the managed\n            string in the UTF-8 encoding or null upon failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteString.GetStringFromUtf8Bytes(System.Byte[])\">\n            <summary>\n            Converts the specified array of bytes representing a string in the\n            UTF-8 encoding and returns a managed string.\n            </summary>\n            <param name=\"bytes\">\n            The array of bytes to convert.\n            </param>\n            <returns>\n            The managed string or null upon failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteString.ProbeForUtf8ByteLength(System.IntPtr,System.Int32)\">\n            <summary>\n            Probes a native pointer to a string in the UTF-8 encoding for its\n            terminating NUL character, within the specified length limit.\n            </summary>\n            <param name=\"pValue\">\n            The native NUL-terminated string pointer.\n            </param>\n            <param name=\"limit\">\n            The maximum length of the native string, in bytes.\n            </param>\n            <returns>\n            The length of the native string, in bytes -OR- zero if the length\n            could not be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteString.StringFromUtf8IntPtr(System.IntPtr)\">\n            <summary>\n            Converts the specified native NUL-terminated UTF-8 string pointer\n            into a managed string.\n            </summary>\n            <param name=\"pValue\">\n            The native NUL-terminated UTF-8 string pointer.\n            </param>\n            <returns>\n            The managed string or null upon failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteString.StringFromUtf8IntPtr(System.IntPtr,System.Int32)\">\n            <summary>\n            Converts the specified native UTF-8 string pointer of the specified\n            length into a managed string.\n            </summary>\n            <param name=\"pValue\">\n            The native UTF-8 string pointer.\n            </param>\n            <param name=\"length\">\n            The length of the native string, in bytes.\n            </param>\n            <returns>\n            The managed string or null upon failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteString.Utf8IntPtrFromString(System.String)\">\n            <summary>\n            Converts the specified managed string into a native NUL-terminated\n            UTF-8 string pointer using memory obtained from the SQLite core\n            library.\n            </summary>\n            <param name=\"value\">\n            The managed string to convert.\n            </param>\n            <returns>\n            The native NUL-terminated UTF-8 string pointer or\n            <see cref=\"F:System.IntPtr.Zero\"/> upon failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteString.StringArrayFromUtf8SizeAndIntPtr(System.Int32,System.IntPtr)\">\n            <summary>\n            Converts a logical array of native NUL-terminated UTF-8 string\n            pointers into an array of managed strings.\n            </summary>\n            <param name=\"argc\">\n            The number of elements in the logical array of native\n            NUL-terminated UTF-8 string pointers.\n            </param>\n            <param name=\"argv\">\n            The native pointer to the logical array of native NUL-terminated\n            UTF-8 string pointers to convert.\n            </param>\n            <returns>\n            The array of managed strings or null upon failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteString.Utf8IntPtrArrayFromStringArray(System.String[])\">\n            <summary>\n            Converts an array of managed strings into an array of native\n            NUL-terminated UTF-8 string pointers.\n            </summary>\n            <param name=\"values\">\n            The array of managed strings to convert.\n            </param>\n            <returns>\n            The array of native NUL-terminated UTF-8 string pointers or null\n            upon failure.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteBytes\">\n            <summary>\n            This class contains static methods that are used to deal with native\n            pointers to memory blocks that logically contain arrays of bytes to be\n            used with the SQLite core library.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBytes.FromIntPtr(System.IntPtr,System.Int32)\">\n            <summary>\n            Converts a native pointer to a logical array of bytes of the\n            specified length into a managed byte array.\n            </summary>\n            <param name=\"pValue\">\n            The native pointer to the logical array of bytes to convert.\n            </param>\n            <param name=\"length\">\n            The length, in bytes, of the logical array of bytes to convert.\n            </param>\n            <returns>\n            The managed byte array or null upon failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteBytes.ToIntPtr(System.Byte[])\">\n            <summary>\n            Converts a managed byte array into a native pointer to a logical\n            array of bytes.\n            </summary>\n            <param name=\"value\">\n            The managed byte array to convert.\n            </param>\n            <returns>\n            The native pointer to a logical byte array or null upon failure.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteMarshal\">\n            <summary>\n            This class contains static methods that are used to perform several\n            low-level data marshalling tasks between native and managed code.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMarshal.IntPtrForOffset(System.IntPtr,System.Int32)\">\n            <summary>\n            Returns a new <see cref=\"T:System.IntPtr\"/> object instance based on the\n            specified <see cref=\"T:System.IntPtr\"/> object instance and an integer\n            offset.\n            </summary>\n            <param name=\"pointer\">\n            The <see cref=\"T:System.IntPtr\"/> object instance representing the base\n            memory location.\n            </param>\n            <param name=\"offset\">\n            The integer offset from the base memory location that the new\n            <see cref=\"T:System.IntPtr\"/> object instance should point to.\n            </param>\n            <returns>\n            The new <see cref=\"T:System.IntPtr\"/> object instance.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMarshal.RoundUp(System.Int32,System.Int32)\">\n            <summary>\n            Rounds up an integer size to the next multiple of the alignment.\n            </summary>\n            <param name=\"size\">\n            The size, in bytes, to be rounded up.\n            </param>\n            <param name=\"alignment\">\n            The required alignment for the return value.\n            </param>\n            <returns>\n            The size, in bytes, rounded up to the next multiple of the\n            alignment.  This value may end up being the same as the original\n            size.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMarshal.NextOffsetOf(System.Int32,System.Int32,System.Int32)\">\n            <summary>\n            Determines the offset, in bytes, of the next structure member.\n            </summary>\n            <param name=\"offset\">\n            The offset, in bytes, of the current structure member.\n            </param>\n            <param name=\"size\">\n            The size, in bytes, of the current structure member.\n            </param>\n            <param name=\"alignment\">\n            The alignment, in bytes, of the next structure member.\n            </param>\n            <returns>\n            The offset, in bytes, of the next structure member.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMarshal.ReadInt32(System.IntPtr,System.Int32)\">\n            <summary>\n            Reads a <see cref=\"T:System.Int32\"/> value from the specified memory\n            location.\n            </summary>\n            <param name=\"pointer\">\n            The <see cref=\"T:System.IntPtr\"/> object instance representing the base\n            memory location.\n            </param>\n            <param name=\"offset\">\n            The integer offset from the base memory location where the\n            <see cref=\"T:System.Int32\"/> value to be read is located.\n            </param>\n            <returns>\n            The <see cref=\"T:System.Int32\"/> value at the specified memory location.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMarshal.ReadInt64(System.IntPtr,System.Int32)\">\n            <summary>\n            Reads a <see cref=\"T:System.Int64\"/> value from the specified memory\n            location.\n            </summary>\n            <param name=\"pointer\">\n            The <see cref=\"T:System.IntPtr\"/> object instance representing the base\n            memory location.\n            </param>\n            <param name=\"offset\">\n            The integer offset from the base memory location where the\n            <see cref=\"T:System.Int64\"/> value to be read is located.\n            </param>\n            <returns>\n            The <see cref=\"T:System.Int64\"/> value at the specified memory location.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMarshal.ReadDouble(System.IntPtr,System.Int32)\">\n            <summary>\n            Reads a <see cref=\"T:System.Double\"/> value from the specified memory\n            location.\n            </summary>\n            <param name=\"pointer\">\n            The <see cref=\"T:System.IntPtr\"/> object instance representing the base\n            memory location.\n            </param>\n            <param name=\"offset\">\n            The integer offset from the base memory location where the\n            <see cref=\"T:System.Double\"/> to be read is located.\n            </param>\n            <returns>\n            The <see cref=\"T:System.Double\"/> value at the specified memory location.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMarshal.ReadIntPtr(System.IntPtr,System.Int32)\">\n            <summary>\n            Reads an <see cref=\"T:System.IntPtr\"/> value from the specified memory\n            location.\n            </summary>\n            <param name=\"pointer\">\n            The <see cref=\"T:System.IntPtr\"/> object instance representing the base\n            memory location.\n            </param>\n            <param name=\"offset\">\n            The integer offset from the base memory location where the\n            <see cref=\"T:System.IntPtr\"/> value to be read is located.\n            </param>\n            <returns>\n            The <see cref=\"T:System.IntPtr\"/> value at the specified memory location.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMarshal.WriteInt32(System.IntPtr,System.Int32,System.Int32)\">\n            <summary>\n            Writes an <see cref=\"T:System.Int32\"/> value to the specified memory\n            location.\n            </summary>\n            <param name=\"pointer\">\n            The <see cref=\"T:System.IntPtr\"/> object instance representing the base\n            memory location.\n            </param>\n            <param name=\"offset\">\n            The integer offset from the base memory location where the\n            <see cref=\"T:System.Int32\"/> value to be written is located.\n            </param>\n            <param name=\"value\">\n            The <see cref=\"T:System.Int32\"/> value to write.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMarshal.WriteInt64(System.IntPtr,System.Int32,System.Int64)\">\n            <summary>\n            Writes an <see cref=\"T:System.Int64\"/> value to the specified memory\n            location.\n            </summary>\n            <param name=\"pointer\">\n            The <see cref=\"T:System.IntPtr\"/> object instance representing the base\n            memory location.\n            </param>\n            <param name=\"offset\">\n            The integer offset from the base memory location where the\n            <see cref=\"T:System.Int64\"/> value to be written is located.\n            </param>\n            <param name=\"value\">\n            The <see cref=\"T:System.Int64\"/> value to write.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMarshal.WriteDouble(System.IntPtr,System.Int32,System.Double)\">\n            <summary>\n            Writes a <see cref=\"T:System.Double\"/> value to the specified memory\n            location.\n            </summary>\n            <param name=\"pointer\">\n            The <see cref=\"T:System.IntPtr\"/> object instance representing the base\n            memory location.\n            </param>\n            <param name=\"offset\">\n            The integer offset from the base memory location where the\n            <see cref=\"T:System.Double\"/> value to be written is located.\n            </param>\n            <param name=\"value\">\n            The <see cref=\"T:System.Double\"/> value to write.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMarshal.WriteIntPtr(System.IntPtr,System.Int32,System.IntPtr)\">\n            <summary>\n            Writes a <see cref=\"T:System.IntPtr\"/> value to the specified memory\n            location.\n            </summary>\n            <param name=\"pointer\">\n            The <see cref=\"T:System.IntPtr\"/> object instance representing the base\n            memory location.\n            </param>\n            <param name=\"offset\">\n            The integer offset from the base memory location where the\n            <see cref=\"T:System.IntPtr\"/> value to be written is located.\n            </param>\n            <param name=\"value\">\n            The <see cref=\"T:System.IntPtr\"/> value to write.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteMarshal.GetHashCode(System.Object,System.Boolean)\">\n            <summary>\n            Generates a hash code value for the object.\n            </summary>\n            <param name=\"value\">\n            The object instance used to calculate the hash code.\n            </param>\n            <param name=\"identity\">\n            Non-zero if different object instances with the same value should\n            generate different hash codes, where applicable.  This parameter\n            has no effect on the .NET Compact Framework.\n            </param>\n            <returns>\n            The hash code value -OR- zero if the object is null.\n            </returns>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteModule\">\n            <summary>\n            This class represents a managed virtual table module implementation.\n            It is not sealed and must be used as the base class for any\n            user-defined virtual table module classes implemented in managed code.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModule.DefaultModuleVersion\">\n            <summary>\n            The default version of the native sqlite3_module structure in use.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModule.nativeModule\">\n            <summary>\n            This field is used to store the native sqlite3_module structure\n            associated with this object instance.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModule.destroyModule\">\n            <summary>\n            This field is used to store the destructor delegate to be passed to\n            the SQLite core library via the sqlite3_create_disposable_module()\n            function.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModule.disposableModule\">\n            <summary>\n            This field is used to store a pointer to the native sqlite3_module\n            structure returned by the sqlite3_create_disposable_module\n            function.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModule.tables\">\n            <summary>\n            This field is used to store the virtual table instances associated\n            with this module.  The native pointer to the sqlite3_vtab derived\n            structure is used to key into this collection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModule.cursors\">\n            <summary>\n            This field is used to store the virtual table cursor instances\n            associated with this module.  The native pointer to the\n            sqlite3_vtab_cursor derived structure is used to key into this\n            collection.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModule.functions\">\n            <summary>\n            This field is used to store the virtual table function instances\n            associated with this module.  The case-insensitive function name\n            and the number of arguments (with -1 meaning \"any\") are used to\n            construct the string that is used to key into this collection.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.#ctor(System.String)\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"name\">\n            The name of the module.  This parameter cannot be null.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.CreateDisposableModule(System.IntPtr)\">\n            <summary>\n            Calls the native SQLite core library in order to create a new\n            disposable module containing the implementation of a virtual table.\n            </summary>\n            <param name=\"pDb\">\n            The native database connection pointer to use.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xDestroyModule(System.IntPtr)\">\n            <summary>\n            This method is called by the SQLite core library when the native\n            module associated with this object instance is being destroyed due\n            to its parent connection being closed.  It may also be called by\n            the \"vtshim\" module if/when the sqlite3_dispose_module() function\n            is called.\n            </summary>\n            <param name=\"pClientData\">\n            The native user-data pointer associated with this module, as it was\n            provided to the SQLite core library when the native module instance\n            was created.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.AllocateNativeModule\">\n            <summary>\n            Creates and returns the native sqlite_module structure using the\n            configured (or default) <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/>\n            interface implementation.\n            </summary>\n            <returns>\n            The native sqlite_module structure using the configured (or\n            default) <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/> interface\n            implementation.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.AllocateNativeModule(System.Data.SQLite.ISQLiteNativeModule)\">\n            <summary>\n            Creates and returns the native sqlite_module structure using the\n            specified <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/> interface\n            implementation.\n            </summary>\n            <param name=\"module\">\n            The <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/> interface implementation to\n            use.\n            </param>\n            <returns>\n            The native sqlite_module structure using the specified\n            <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/> interface implementation.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.CopyNativeModule(System.Data.SQLite.UnsafeNativeMethods.sqlite3_module)\">\n            <summary>\n            Creates a copy of the specified\n            <see cref=\"T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module\"/> object instance,\n            using default implementations for the contained delegates when\n            necessary.\n            </summary>\n            <param name=\"module\">\n            The <see cref=\"T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module\"/> object\n            instance to copy.\n            </param>\n            <returns>\n            The new <see cref=\"T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module\"/> object\n            instance.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.CreateOrConnect(System.Boolean,System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\">\n            <summary>\n            Calls one of the virtual table initialization methods.\n            </summary>\n            <param name=\"create\">\n            Non-zero to call the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/>\n            method; otherwise, the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/>\n            method will be called.\n            </param>\n            <param name=\"pDb\">\n            The native database connection handle.\n            </param>\n            <param name=\"pAux\">\n            The original native pointer value that was provided to the\n            sqlite3_create_module(), sqlite3_create_module_v2() or\n            sqlite3_create_disposable_module() functions.\n            </param>\n            <param name=\"argc\">\n            The number of arguments from the CREATE VIRTUAL TABLE statement.\n            </param>\n            <param name=\"argv\">\n            The array of string arguments from the CREATE VIRTUAL TABLE\n            statement.\n            </param>\n            <param name=\"pVtab\">\n            Upon success, this parameter must be modified to point to the newly\n            created native sqlite3_vtab derived structure.\n            </param>\n            <param name=\"pError\">\n            Upon failure, this parameter must be modified to point to the error\n            message, with the underlying memory having been obtained from the\n            sqlite3_malloc() function.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.DestroyOrDisconnect(System.Boolean,System.IntPtr)\">\n            <summary>\n            Calls one of the virtual table finalization methods.\n            </summary>\n            <param name=\"destroy\">\n            Non-zero to call the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)\"/>\n            method; otherwise, the\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)\"/> method will be\n            called.\n            </param>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteModule,System.IntPtr,System.Boolean,System.Boolean,System.String)\">\n            <summary>\n            Arranges for the specified error message to be placed into the\n            zErrMsg field of a sqlite3_vtab derived structure, freeing the\n            existing error message, if any.\n            </summary>\n            <param name=\"module\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> object instance to be used.\n            </param>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"logErrors\">\n            Non-zero if this error message should also be logged using the\n            <see cref=\"T:System.Data.SQLite.SQLiteLog\"/> class.\n            </param>\n            <param name=\"logExceptions\">\n            Non-zero if caught exceptions should be logged using the\n            <see cref=\"T:System.Data.SQLite.SQLiteLog\"/> class.\n            </param>\n            <param name=\"error\">\n            The error message.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteVirtualTable,System.Boolean,System.Boolean,System.String)\">\n            <summary>\n            Arranges for the specified error message to be placed into the\n            zErrMsg field of a sqlite3_vtab derived structure, freeing the\n            existing error message, if any.\n            </summary>\n            <param name=\"module\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> object instance to be used.\n            </param>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance used to\n            lookup the native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"logErrors\">\n            Non-zero if this error message should also be logged using the\n            <see cref=\"T:System.Data.SQLite.SQLiteLog\"/> class.\n            </param>\n            <param name=\"logExceptions\">\n            Non-zero if caught exceptions should be logged using the\n            <see cref=\"T:System.Data.SQLite.SQLiteLog\"/> class.\n            </param>\n            <param name=\"error\">\n            The error message.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteModule,System.IntPtr,System.Boolean,System.Boolean,System.String)\">\n            <summary>\n            Arranges for the specified error message to be placed into the\n            zErrMsg field of a sqlite3_vtab derived structure, freeing the\n            existing error message, if any.\n            </summary>\n            <param name=\"module\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> object instance to be used.\n            </param>\n            <param name=\"pCursor\">\n            The native pointer to the sqlite3_vtab_cursor derived structure\n            used to get the native pointer to the sqlite3_vtab derived\n            structure.\n            </param>\n            <param name=\"logErrors\">\n            Non-zero if this error message should also be logged using the\n            <see cref=\"T:System.Data.SQLite.SQLiteLog\"/> class.\n            </param>\n            <param name=\"logExceptions\">\n            Non-zero if caught exceptions should be logged using the\n            <see cref=\"T:System.Data.SQLite.SQLiteLog\"/> class.\n            </param>\n            <param name=\"error\">\n            The error message.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteVirtualTableCursor,System.Boolean,System.Boolean,System.String)\">\n            <summary>\n            Arranges for the specified error message to be placed into the\n            zErrMsg field of a sqlite3_vtab derived structure, freeing the\n            existing error message, if any.\n            </summary>\n            <param name=\"module\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> object instance to be used.\n            </param>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance used to\n            lookup the native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"logErrors\">\n            Non-zero if this error message should also be logged using the\n            <see cref=\"T:System.Data.SQLite.SQLiteLog\"/> class.\n            </param>\n            <param name=\"logExceptions\">\n            Non-zero if caught exceptions should be logged using the\n            <see cref=\"T:System.Data.SQLite.SQLiteLog\"/> class.\n            </param>\n            <param name=\"error\">\n            The error message.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.GetNativeModuleImpl\">\n            <summary>\n            Gets and returns the <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/> interface\n            implementation to be used when creating the native sqlite3_module\n            structure.  Derived classes may override this method to supply an\n            alternate implementation for the <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/>\n            interface.\n            </summary>\n            <returns>\n            The <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/> interface implementation to\n            be used when populating the native sqlite3_module structure.  If\n            the returned value is null, the private methods provided by the\n            <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> class and relating to the\n            <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/> interface  will be used to\n            create the necessary delegates.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.CreateNativeModuleImpl\">\n            <summary>\n            Creates and returns the <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/>\n            interface implementation corresponding to the current\n            <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> object instance.\n            </summary>\n            <returns>\n            The <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/> interface implementation\n            corresponding to the current <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> object\n            instance.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.AllocateTable\">\n            <summary>\n            Allocates a native sqlite3_vtab derived structure and returns a\n            native pointer to it.\n            </summary>\n            <returns>\n            A native pointer to a native sqlite3_vtab derived structure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.ZeroTable(System.IntPtr)\">\n            <summary>\n            Zeros out the fields of a native sqlite3_vtab derived structure.\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the native sqlite3_vtab derived structure to\n            zero.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.FreeTable(System.IntPtr)\">\n            <summary>\n            Frees a native sqlite3_vtab structure using the provided native\n            pointer to it.\n            </summary>\n            <param name=\"pVtab\">\n            A native pointer to a native sqlite3_vtab derived structure.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.AllocateCursor\">\n            <summary>\n            Allocates a native sqlite3_vtab_cursor derived structure and\n            returns a native pointer to it.\n            </summary>\n            <returns>\n            A native pointer to a native sqlite3_vtab_cursor derived structure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.FreeCursor(System.IntPtr)\">\n            <summary>\n            Frees a native sqlite3_vtab_cursor structure using the provided\n            native pointer to it.\n            </summary>\n            <param name=\"pCursor\">\n            A native pointer to a native sqlite3_vtab_cursor derived structure.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.TableFromCursor(System.Data.SQLite.SQLiteModule,System.IntPtr)\">\n            <summary>\n            Reads and returns the native pointer to the sqlite3_vtab derived\n            structure based on the native pointer to the sqlite3_vtab_cursor\n            derived structure.\n            </summary>\n            <param name=\"module\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> object instance to be used.\n            </param>\n            <param name=\"pCursor\">\n            The native pointer to the sqlite3_vtab_cursor derived structure\n            from which to read the native pointer to the sqlite3_vtab derived\n            structure.\n            </param>\n            <returns>\n            The native pointer to the sqlite3_vtab derived structure -OR-\n            <see cref=\"F:System.IntPtr.Zero\"/> if it cannot be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.TableFromCursor(System.IntPtr)\">\n            <summary>\n            Reads and returns the native pointer to the sqlite3_vtab derived\n            structure based on the native pointer to the sqlite3_vtab_cursor\n            derived structure.\n            </summary>\n            <param name=\"pCursor\">\n            The native pointer to the sqlite3_vtab_cursor derived structure\n            from which to read the native pointer to the sqlite3_vtab derived\n            structure.\n            </param>\n            <returns>\n            The native pointer to the sqlite3_vtab derived structure -OR-\n            <see cref=\"F:System.IntPtr.Zero\"/> if it cannot be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.TableFromIntPtr(System.IntPtr)\">\n            <summary>\n            Looks up and returns the <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object\n            instance based on the native pointer to the sqlite3_vtab derived\n            structure.\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <returns>\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance or null if\n            the corresponding one cannot be found.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.TableToIntPtr(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            Allocates and returns a native pointer to a sqlite3_vtab derived\n            structure and creates an association between it and the specified\n            <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance to be used\n            when creating the association.\n            </param>\n            <returns>\n            The native pointer to a sqlite3_vtab derived structure or\n            <see cref=\"F:System.IntPtr.Zero\"/> if the method fails for any reason.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.CursorFromIntPtr(System.IntPtr,System.IntPtr)\">\n            <summary>\n            Looks up and returns the <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/>\n            object instance based on the native pointer to the\n            sqlite3_vtab_cursor derived structure.\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"pCursor\">\n            The native pointer to the sqlite3_vtab_cursor derived structure.\n            </param>\n            <returns>\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance or null\n            if the corresponding one cannot be found.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.CursorToIntPtr(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            Allocates and returns a native pointer to a sqlite3_vtab_cursor\n            derived structure and creates an association between it and the\n            specified <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance to be\n            used when creating the association.\n            </param>\n            <returns>\n            The native pointer to a sqlite3_vtab_cursor derived structure or\n            <see cref=\"F:System.IntPtr.Zero\"/> if the method fails for any reason.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.GetFunctionKey(System.Int32,System.String,System.Data.SQLite.SQLiteFunction)\">\n            <summary>\n            Deterimines the key that should be used to identify and store the\n            <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> object instance for the virtual table\n            (i.e. to be returned via the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method).\n            </summary>\n            <param name=\"argumentCount\">\n            The number of arguments to the virtual table function.\n            </param>\n            <param name=\"name\">\n            The name of the virtual table function.\n            </param>\n            <param name=\"function\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> object instance associated with\n            this virtual table function.\n            </param>\n            <returns>\n            The string that should be used to identify and store the virtual\n            table function instance.  This method cannot return null.  If null\n            is returned from this method, the behavior is undefined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.DeclareTable(System.Data.SQLite.SQLiteConnection,System.String,System.String@)\">\n            <summary>\n            Attempts to declare the schema for the virtual table using the\n            specified database connection.\n            </summary>\n            <param name=\"connection\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> object instance to use when\n            declaring the schema of the virtual table.  This parameter may not\n            be null.\n            </param>\n            <param name=\"sql\">\n            The string containing the CREATE TABLE statement that completely\n            describes the schema for the virtual table.  This parameter may not\n            be null.\n            </param>\n            <param name=\"error\">\n            Upon failure, this parameter must be modified to contain an error\n            message.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.DeclareFunction(System.Data.SQLite.SQLiteConnection,System.Int32,System.String,System.String@)\">\n            <summary>\n            Calls the native SQLite core library in order to declare a virtual\n            table function in response to a call into the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/>\n            or <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> virtual table\n            methods.\n            </summary>\n            <param name=\"connection\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> object instance to use when\n            declaring the schema of the virtual table.\n            </param>\n            <param name=\"argumentCount\">\n            The number of arguments to the function being declared.\n            </param>\n            <param name=\"name\">\n            The name of the function being declared.\n            </param>\n            <param name=\"error\">\n            Upon success, the contents of this parameter are undefined.  Upon\n            failure, it should contain an appropriate error message.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SetTableError(System.IntPtr,System.String)\">\n            <summary>\n            Arranges for the specified error message to be placed into the\n            zErrMsg field of a sqlite3_vtab derived structure, freeing the\n            existing error message, if any.\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"error\">\n            The error message.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteVirtualTable,System.String)\">\n            <summary>\n            Arranges for the specified error message to be placed into the\n            zErrMsg field of a sqlite3_vtab derived structure, freeing the\n            existing error message, if any.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance used to\n            lookup the native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"error\">\n            The error message.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteVirtualTableCursor,System.String)\">\n            <summary>\n            Arranges for the specified error message to be placed into the\n            zErrMsg field of a sqlite3_vtab derived structure, freeing the\n            existing error message, if any.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance used to\n            lookup the native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <param name=\"error\">\n            The error message.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SetEstimatedCost(System.Data.SQLite.SQLiteIndex,System.Nullable{System.Double})\">\n            <summary>\n            Modifies the specified <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance\n            to contain the specified estimated cost.\n            </summary>\n            <param name=\"index\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance to modify.\n            </param>\n            <param name=\"estimatedCost\">\n            The estimated cost value to use.  Using a null value means that the\n            default value provided by the SQLite core library should be used.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SetEstimatedCost(System.Data.SQLite.SQLiteIndex)\">\n            <summary>\n            Modifies the specified <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance\n            to contain the default estimated cost.\n            </summary>\n            <param name=\"index\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance to modify.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SetEstimatedRows(System.Data.SQLite.SQLiteIndex,System.Nullable{System.Int64})\">\n            <summary>\n            Modifies the specified <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance\n            to contain the specified estimated rows.\n            </summary>\n            <param name=\"index\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance to modify.\n            </param>\n            <param name=\"estimatedRows\">\n            The estimated rows value to use.  Using a null value means that the\n            default value provided by the SQLite core library should be used.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SetEstimatedRows(System.Data.SQLite.SQLiteIndex)\">\n            <summary>\n            Modifies the specified <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance\n            to contain the default estimated rows.\n            </summary>\n            <param name=\"index\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance to modify.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SetIndexFlags(System.Data.SQLite.SQLiteIndex,System.Nullable{System.Data.SQLite.SQLiteIndexFlags})\">\n            <summary>\n            Modifies the specified <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance\n            to contain the specified flags.\n            </summary>\n            <param name=\"index\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance to modify.\n            </param>\n            <param name=\"indexFlags\">\n            The index flags value to use.  Using a null value means that the\n            default value provided by the SQLite core library should be used.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SetIndexFlags(System.Data.SQLite.SQLiteIndex)\">\n            <summary>\n            Modifies the specified <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance\n            to contain the default index flags.\n            </summary>\n            <param name=\"index\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance to modify.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"pDb\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pAux\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"argc\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"argv\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pError\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"pDb\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pAux\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"argc\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"argv\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pError\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xBestIndex(System.IntPtr,System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)\"/> method.\n            </param>\n            <param name=\"pIndex\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xDisconnect(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xDestroy(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xOpen(System.IntPtr,System.IntPtr@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xClose(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </param>\n            <param name=\"idxNum\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </param>\n            <param name=\"idxStr\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </param>\n            <param name=\"argc\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </param>\n            <param name=\"argv\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xNext(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xEof(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <param name=\"pContext\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <param name=\"index\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xRowId(System.IntPtr,System.Int64@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)\"/> method.\n            </summary>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)\"/> method.\n            </param>\n            <param name=\"rowId\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </param>\n            <param name=\"argc\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </param>\n            <param name=\"argv\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </param>\n            <param name=\"rowId\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xBegin(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xSync(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xCommit(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xRollback(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"nArg\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"zName\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"callback\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pClientData\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xRename(System.IntPtr,System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)\"/> method.\n            </param>\n            <param name=\"zNew\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xSavepoint(System.IntPtr,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <param name=\"iSavepoint\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xRelease(System.IntPtr,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <param name=\"iSavepoint\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.xRollbackTo(System.IntPtr,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <param name=\"iSavepoint\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"connection\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> object instance associated with\n            the virtual table.\n            </param>\n            <param name=\"pClientData\">\n            The native user-data pointer associated with this module, as it was\n            provided to the SQLite core library when the native module instance\n            was created.\n            </param>\n            <param name=\"arguments\">\n            The module name, database name, virtual table name, and all other\n            arguments passed to the CREATE VIRTUAL TABLE statement.\n            </param>\n            <param name=\"table\">\n            Upon success, this parameter must be modified to contain the\n            <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated with\n            the virtual table.\n            </param>\n            <param name=\"error\">\n            Upon failure, this parameter must be modified to contain an error\n            message.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"connection\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteConnection\"/> object instance associated with\n            the virtual table.\n            </param>\n            <param name=\"pClientData\">\n            The native user-data pointer associated with this module, as it was\n            provided to the SQLite core library when the native module instance\n            was created.\n            </param>\n            <param name=\"arguments\">\n            The module name, database name, virtual table name, and all other\n            arguments passed to the CREATE VIRTUAL TABLE statement.\n            </param>\n            <param name=\"table\">\n            Upon success, this parameter must be modified to contain the\n            <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated with\n            the virtual table.\n            </param>\n            <param name=\"error\">\n            Upon failure, this parameter must be modified to contain an error\n            message.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"index\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteIndex\"/> object instance containing all the\n            data for the inputs and outputs relating to index selection.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"cursor\">\n            Upon success, this parameter must be modified to contain the\n            <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance associated\n            with the newly opened virtual table cursor.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <param name=\"indexNumber\">\n            Number used to help identify the selected index.\n            </param>\n            <param name=\"indexString\">\n            String used to help identify the selected index.\n            </param>\n            <param name=\"values\">\n            The values corresponding to each column in the selected index.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <returns>\n            Non-zero if no more rows are available; zero otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <param name=\"context\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteContext\"/> object instance to be used for\n            returning the specified column value to the SQLite core library.\n            </param>\n            <param name=\"index\">\n            The zero-based index corresponding to the column containing the\n            value to be returned.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <param name=\"rowId\">\n            Upon success, this parameter must be modified to contain the unique\n            integer row identifier for the current row for the specified cursor.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"values\">\n            The array of <see cref=\"T:System.Data.SQLite.SQLiteValue\"/> object instances containing\n            the new or modified column values, if any.\n            </param>\n            <param name=\"rowId\">\n            Upon success, this parameter must be modified to contain the unique\n            integer row identifier for the row that was inserted, if any.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Begin(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Sync(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Commit(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"argumentCount\">\n            The number of arguments to the function being sought.\n            </param>\n            <param name=\"name\">\n            The name of the function being sought.\n            </param>\n            <param name=\"function\">\n            Upon success, this parameter must be modified to contain the\n            <see cref=\"T:System.Data.SQLite.SQLiteFunction\"/> object instance responsible for\n            implementing the specified function.\n            </param>\n            <param name=\"pClientData\">\n            Upon success, this parameter must be modified to contain the\n            native user-data pointer associated with\n            <paramref name=\"function\"/>.\n            </param>\n            <returns>\n            Non-zero if the specified function was found; zero otherwise.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"newName\">\n            The new name for the virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"savepoint\">\n            This is an integer identifier under which the the current state of\n            the virtual table should be saved.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"savepoint\">\n            This is an integer used to indicate that any saved states with an\n            identifier greater than or equal to this should be deleted by the\n            virtual table.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\">\n            <summary>\n            This method is called in response to the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this virtual table.\n            </param>\n            <param name=\"savepoint\">\n            This is an integer identifier used to specify a specific saved\n            state for the virtual table for it to restore itself back to, which\n            should also have the effect of deleting all saved states with an\n            integer identifier greater than this one.\n            </param>\n            <returns>\n            A standard SQLite return code.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Dispose\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.CheckDisposed\">\n            <summary>\n            Throws an <see cref=\"T:System.ObjectDisposedException\"/> if this object\n            instance has been disposed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Dispose(System.Boolean)\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n            <param name=\"disposing\">\n            Non-zero if this method is being called from the\n            <see cref=\"M:System.Data.SQLite.SQLiteModule.Dispose\"/> method.  Zero if this method is being\n            called from the finalizer.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.Finalize\">\n            <summary>\n            Finalizes this object instance.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteModule.LogErrorsNoThrow\">\n            <summary>\n            Returns or sets a boolean value indicating whether virtual table\n            errors should be logged using the <see cref=\"T:System.Data.SQLite.SQLiteLog\"/> class.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteModule.LogExceptionsNoThrow\">\n            <summary>\n            Returns or sets a boolean value indicating whether exceptions\n            caught in the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)\"/> method,\n            the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)\"/> method,\n            the <see cref=\"M:System.Data.SQLite.SQLiteModule.SetTableError(System.IntPtr,System.String)\"/> method,\n            the <see cref=\"M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteVirtualTable,System.String)\"/> method,\n            and the <see cref=\"M:System.Data.SQLite.SQLiteModule.Dispose\"/> method should be logged using the\n            <see cref=\"T:System.Data.SQLite.SQLiteLog\"/> class.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteModule.LogErrors\">\n            <summary>\n            Returns or sets a boolean value indicating whether virtual table\n            errors should be logged using the <see cref=\"T:System.Data.SQLite.SQLiteLog\"/> class.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteModule.LogExceptions\">\n            <summary>\n            Returns or sets a boolean value indicating whether exceptions\n            caught in the\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)\"/> method,\n            <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)\"/> method, and the\n            <see cref=\"M:System.Data.SQLite.SQLiteModule.Dispose\"/> method should be logged using the\n            <see cref=\"T:System.Data.SQLite.SQLiteLog\"/> class.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteModule.Declared\">\n            <summary>\n            Returns non-zero if the schema for the virtual table has been\n            declared.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteModule.Name\">\n            <summary>\n            Returns the name of the module as it was registered with the SQLite\n            core library.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteModule.SQLiteNativeModule\">\n            <summary>\n            This class implements the <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/>\n            interface by forwarding those method calls to the\n            <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> object instance it contains.  If the\n            contained <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> object instance is null, all\n            the <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/> methods simply generate an\n            error.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.DefaultLogErrors\">\n            <summary>\n            This is the value that is always used for the \"logErrors\"\n            parameter to the various static error handling methods provided\n            by the <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> class.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.DefaultLogExceptions\">\n            <summary>\n            This is the value that is always used for the \"logExceptions\"\n            parameter to the various static error handling methods provided\n            by the <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> class.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableErrorMessage\">\n            <summary>\n            This is the error message text used when the contained\n            <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> object instance is not available\n            for any reason.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.module\">\n            <summary>\n            The <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> object instance used to provide\n            an implementation of the <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/>\n            interface.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.#ctor(System.Data.SQLite.SQLiteModule)\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"module\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteModule\"/> object instance used to provide\n            an implementation of the <see cref=\"T:System.Data.SQLite.ISQLiteNativeModule\"/>\n            interface.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableTableError(System.IntPtr)\">\n            <summary>\n            Sets the table error message to one that indicates the native\n            module implementation is not available.\n            </summary>\n            <param name=\"pVtab\">\n            The native pointer to the sqlite3_vtab derived structure.\n            </param>\n            <returns>\n            The value of <see cref=\"F:System.Data.SQLite.SQLiteErrorCode.Error\"/>.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableCursorError(System.IntPtr)\">\n            <summary>\n            Sets the table error message to one that indicates the native\n            module implementation is not available.\n            </summary>\n            <param name=\"pCursor\">\n            The native pointer to the sqlite3_vtab_cursor derived\n            structure.\n            </param>\n            <returns>\n            The value of <see cref=\"F:System.Data.SQLite.SQLiteErrorCode.Error\"/>.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"pDb\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pAux\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"argc\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"argv\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pError\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"pDb\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pAux\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"argc\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"argv\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pError\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)\"/> method.\n            </param>\n            <param name=\"pIndex\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xDisconnect(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xDestroy(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xClose(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </param>\n            <param name=\"idxNum\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </param>\n            <param name=\"idxStr\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </param>\n            <param name=\"argc\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </param>\n            <param name=\"argv\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xNext(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xEof(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <param name=\"pContext\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <param name=\"index\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)\"/> method.\n            </summary>\n            <param name=\"pCursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)\"/> method.\n            </param>\n            <param name=\"rowId\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </param>\n            <param name=\"argc\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </param>\n            <param name=\"argv\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </param>\n            <param name=\"rowId\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xBegin(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xSync(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xCommit(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRollback(System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"nArg\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"zName\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"callback\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pClientData\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)\"/> method.\n            </param>\n            <param name=\"zNew\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <param name=\"iSavepoint\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRelease(System.IntPtr,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <param name=\"iSavepoint\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)\"/> method.\n            </summary>\n            <param name=\"pVtab\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <param name=\"iSavepoint\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.CheckDisposed\">\n            <summary>\n            Throws an <see cref=\"T:System.ObjectDisposedException\"/> if this object\n            instance has been disposed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose(System.Boolean)\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n            <param name=\"disposing\">\n            Non-zero if this method is being called from the\n            <see cref=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose\"/> method.  Zero if this method is being\n            called from the finalizer.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Finalize\">\n            <summary>\n            Finalizes this object instance.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteModuleCommon\">\n            <summary>\n            This class contains some virtual methods that may be useful for other\n            virtual table classes.  It specifically does NOT implement any of the\n            <see cref=\"T:System.Data.SQLite.ISQLiteManagedModule\"/> interface methods.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteModuleNoop\">\n            <summary>\n            This class implements a virtual table module that does nothing by\n            providing \"empty\" implementations for all of the\n            <see cref=\"T:System.Data.SQLite.ISQLiteManagedModule\"/> interface methods.  The result\n            codes returned by these \"empty\" method implementations may be\n            controlled on a per-method basis by using and/or overriding the\n            <see cref=\"M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode\"/>,\n            <see cref=\"M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToEofResult(System.Data.SQLite.SQLiteErrorCode)\"/>,\n            <see cref=\"M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToFindFunctionResult(System.Data.SQLite.SQLiteErrorCode)\"/>,\n            <see cref=\"M:System.Data.SQLite.SQLiteModuleNoop.GetMethodResultCode(System.String)\"/>, and\n            <see cref=\"M:System.Data.SQLite.SQLiteModuleNoop.SetMethodResultCode(System.String,System.Data.SQLite.SQLiteErrorCode)\"/> methods from within derived classes.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModuleNoop.resultCodes\">\n            <summary>\n            This field is used to store the <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/>\n            values to return, on a per-method basis, for all methods that are\n            part of the <see cref=\"T:System.Data.SQLite.ISQLiteManagedModule\"/> interface.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.#ctor(System.String)\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"name\">\n            The name of the module.  This parameter cannot be null.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode\">\n            <summary>\n            Determines the default <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/> value to be\n            returned by methods of the <see cref=\"T:System.Data.SQLite.ISQLiteManagedModule\"/>\n            interface that lack an overridden implementation in all classes\n            derived from the <see cref=\"T:System.Data.SQLite.SQLiteModuleNoop\"/> class.\n            </summary>\n            <returns>\n            The <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/> value that should be returned\n            by all <see cref=\"T:System.Data.SQLite.ISQLiteManagedModule\"/> interface methods unless\n            a more specific result code has been set for that interface method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToEofResult(System.Data.SQLite.SQLiteErrorCode)\">\n            <summary>\n            Converts a <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/> value into a boolean\n            return value for use with the\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </summary>\n            <param name=\"resultCode\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/> value to convert.\n            </param>\n            <returns>\n            The <see cref=\"T:System.Boolean\"/> value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToFindFunctionResult(System.Data.SQLite.SQLiteErrorCode)\">\n            <summary>\n            Converts a <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/> value into a boolean\n            return value for use with the\n            <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"resultCode\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/> value to convert.\n            </param>\n            <returns>\n            The <see cref=\"T:System.Boolean\"/> value.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.GetMethodResultCode(System.String)\">\n            <summary>\n            Determines the <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/> value that should be\n            returned by the specified <see cref=\"T:System.Data.SQLite.ISQLiteManagedModule\"/>\n            interface method if it lack an overridden implementation.  If no\n            specific <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/> value is available (or set)\n            for the specified method, the <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/> value\n            returned by the <see cref=\"M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode\"/> method will be\n            returned instead.\n            </summary>\n            <param name=\"methodName\">\n            The name of the method.  Currently, this method must be part of\n            the <see cref=\"T:System.Data.SQLite.ISQLiteManagedModule\"/> interface.\n            </param>\n            <returns>\n            The <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/> value that should be returned\n            by the <see cref=\"T:System.Data.SQLite.ISQLiteManagedModule\"/> interface method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.SetMethodResultCode(System.String,System.Data.SQLite.SQLiteErrorCode)\">\n            <summary>\n            Sets the <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/> value that should be\n            returned by the specified <see cref=\"T:System.Data.SQLite.ISQLiteManagedModule\"/>\n            interface method if it lack an overridden implementation.\n            </summary>\n            <param name=\"methodName\">\n            The name of the method.  Currently, this method must be part of\n            the <see cref=\"T:System.Data.SQLite.ISQLiteManagedModule\"/> interface.\n            </param>\n            <param name=\"resultCode\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteErrorCode\"/> value that should be returned\n            by the <see cref=\"T:System.Data.SQLite.ISQLiteManagedModule\"/> interface method.\n            </param>\n            <returns>\n            Non-zero upon success.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </summary>\n            <param name=\"connection\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"pClientData\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"arguments\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"error\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </summary>\n            <param name=\"connection\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"pClientData\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"arguments\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"error\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/> method.\n            </param>\n            <param name=\"index\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Disconnect(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Destroy(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\"/> method.\n            </param>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Close(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </param>\n            <param name=\"indexNumber\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </param>\n            <param name=\"indexString\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </param>\n            <param name=\"values\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Next(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </param>\n            <param name=\"context\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </param>\n            <param name=\"index\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)\"/> method.\n            </param>\n            <param name=\"rowId\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\"/> method.\n            </param>\n            <param name=\"values\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\"/> method.\n            </param>\n            <param name=\"rowId\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Begin(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Sync(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Commit(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Rollback(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"argumentCount\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"name\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"function\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)\"/> method.\n            </param>\n            <param name=\"pClientData\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)\"/> method.\n            </param>\n            <param name=\"newName\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\"/> method.\n            </param>\n            <param name=\"savepoint\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\"/> method.\n            </param>\n            <param name=\"savepoint\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\"/> method.\n            </param>\n            <param name=\"savepoint\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.CheckDisposed\">\n            <summary>\n            Throws an <see cref=\"T:System.ObjectDisposedException\"/> if this object\n            instance has been disposed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleNoop.Dispose(System.Boolean)\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n            <param name=\"disposing\">\n            Non-zero if this method is being called from the\n            <see cref=\"M:System.IDisposable.Dispose\"/> method.  Zero if this method is\n            being called from the finalizer.\n            </param>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModuleCommon.declareSql\">\n            <summary>\n            The CREATE TABLE statement used to declare the schema for the\n            virtual table.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModuleCommon.objectIdentity\">\n            <summary>\n            Non-zero if different object instances with the same value should\n            generate different row identifiers, where applicable.  This has no\n            effect on the .NET Compact Framework.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleCommon.#ctor(System.String)\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"name\">\n            The name of the module.  This parameter cannot be null.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleCommon.#ctor(System.String,System.Boolean)\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"name\">\n            The name of the module.  This parameter cannot be null.\n            </param>\n            <param name=\"objectIdentity\">\n            Non-zero if different object instances with the same value should\n            generate different row identifiers, where applicable.  This\n            parameter has no effect on the .NET Compact Framework.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleCommon.GetSqlForDeclareTable\">\n            <summary>\n            Determines the SQL statement used to declare the virtual table.\n            This method should be overridden in derived classes if they require\n            a custom virtual table schema.\n            </summary>\n            <returns>\n            The SQL statement used to declare the virtual table -OR- null if it\n            cannot be determined.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleCommon.CursorTypeMismatchError(System.Data.SQLite.SQLiteVirtualTableCursor,System.Type)\">\n            <summary>\n            Sets the table error message to one that indicates the virtual\n            table cursor is of the wrong type.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance.\n            </param>\n            <param name=\"type\">\n            The <see cref=\"T:System.Type\"/> that the virtual table cursor should be.\n            </param>\n            <returns>\n            The value of <see cref=\"F:System.Data.SQLite.SQLiteErrorCode.Error\"/>.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleCommon.GetStringFromObject(System.Data.SQLite.SQLiteVirtualTableCursor,System.Object)\">\n            <summary>\n            Determines the string to return as the column value for the object\n            instance value.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <param name=\"value\">\n            The object instance to return a string representation for.\n            </param>\n            <returns>\n            The string representation of the specified object instance or null\n            upon failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleCommon.MakeRowId(System.Int32,System.Int32)\">\n            <summary>\n            Constructs an <see cref=\"T:System.Int64\"/> unique row identifier from two\n            <see cref=\"T:System.Int32\"/> values.  The first <see cref=\"T:System.Int32\"/> value\n            must contain the row sequence number for the current row and the\n            second value must contain the hash code of the key column value\n            for the current row.\n            </summary>\n            <param name=\"rowIndex\">\n            The integer row sequence number for the current row.\n            </param>\n            <param name=\"hashCode\">\n            The hash code of the key column value for the current row.\n            </param>\n            <returns>\n            The unique row identifier or zero upon failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleCommon.GetRowIdFromObject(System.Data.SQLite.SQLiteVirtualTableCursor,System.Object)\">\n            <summary>\n            Determines the unique row identifier for the current row.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance\n            associated with the previously opened virtual table cursor to be\n            used.\n            </param>\n            <param name=\"value\">\n            The object instance to return a unique row identifier for.\n            </param>\n            <returns>\n            The unique row identifier or zero upon failure.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleCommon.CheckDisposed\">\n            <summary>\n            Throws an <see cref=\"T:System.ObjectDisposedException\"/> if this object\n            instance has been disposed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleCommon.Dispose(System.Boolean)\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n            <param name=\"disposing\">\n            Non-zero if this method is being called from the\n            <see cref=\"M:System.IDisposable.Dispose\"/> method.  Zero if this method is\n            being called from the finalizer.\n            </param>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator\">\n            <summary>\n            This class represents a virtual table cursor to be used with the\n            <see cref=\"T:System.Data.SQLite.SQLiteModuleEnumerable\"/> class.  It is not sealed and may\n            be used as the base class for any user-defined virtual table cursor\n            class that wraps an <see cref=\"T:System.Collections.IEnumerator\"/> object instance.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.enumerator\">\n            <summary>\n            The <see cref=\"T:System.Collections.IEnumerator\"/> instance provided when this cursor\n            was created.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.endOfEnumerator\">\n            <summary>\n            This value will be non-zero if false has been returned from the\n            <see cref=\"M:System.Collections.IEnumerator.MoveNext\"/> method.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.#ctor(System.Data.SQLite.SQLiteVirtualTable,System.Collections.IEnumerator)\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this object instance.\n            </param>\n            <param name=\"enumerator\">\n            The <see cref=\"T:System.Collections.IEnumerator\"/> instance to expose as a virtual\n            table cursor.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.MoveNext\">\n            <summary>\n            Advances to the next row of the virtual table cursor using the\n            <see cref=\"M:System.Collections.IEnumerator.MoveNext\"/> method of the\n            <see cref=\"T:System.Collections.IEnumerator\"/> object instance.\n            </summary>\n            <returns>\n            Non-zero if the current row is valid; zero otherwise.  If zero is\n            returned, no further rows are available.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Reset\">\n            <summary>\n            Resets the virtual table cursor position, also invalidating the\n            current row, using the <see cref=\"M:System.Collections.IEnumerator.Reset\"/> method of\n            the <see cref=\"T:System.Collections.IEnumerator\"/> object instance.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Close\">\n            <summary>\n            Closes the virtual table cursor.  This method must not throw any\n            exceptions.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.CheckClosed\">\n            <summary>\n            Throws an <see cref=\"T:System.InvalidOperationException\"/> if the virtual\n            table cursor has been closed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.CheckDisposed\">\n            <summary>\n            Throws an <see cref=\"T:System.ObjectDisposedException\"/> if this object\n            instance has been disposed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Dispose(System.Boolean)\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n            <param name=\"disposing\">\n            Non-zero if this method is being called from the\n            <see cref=\"M:System.IDisposable.Dispose\"/> method.  Zero if this method is\n            being called from the finalizer.\n            </param>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Current\">\n            <summary>\n            Returns the value for the current row of the virtual table cursor\n            using the <see cref=\"P:System.Collections.IEnumerator.Current\"/> property of the\n            <see cref=\"T:System.Collections.IEnumerator\"/> object instance.\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.EndOfEnumerator\">\n            <summary>\n            Returns non-zero if the end of the virtual table cursor has been\n            seen (i.e. no more rows are available, including the current one).\n            </summary>\n        </member>\n        <member name=\"P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.IsOpen\">\n            <summary>\n            Returns non-zero if the virtual table cursor is open.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.SQLiteModuleEnumerable\">\n             <summary>\n             This class implements a virtual table module that exposes an\n             <see cref=\"T:System.Collections.IEnumerable\"/> object instance as a read-only virtual\n             table.  It is not sealed and may be used as the base class for any\n             user-defined virtual table class that wraps an\n             <see cref=\"T:System.Collections.IEnumerable\"/> object instance.  The following short\n             example shows it being used to treat an array of strings as a table\n             data source:\n             <code>\n               public static class Sample\n               {\n                 public static void Main()\n                 {\n                   using (SQLiteConnection connection = new SQLiteConnection(\n                       \"Data Source=:memory:;\"))\n                   {\n                     connection.Open();\n            \n                     connection.CreateModule(new SQLiteModuleEnumerable(\n                       \"sampleModule\", new string[] { \"one\", \"two\", \"three\" }));\n            \n                     using (SQLiteCommand command = connection.CreateCommand())\n                     {\n                       command.CommandText =\n                           \"CREATE VIRTUAL TABLE t1 USING sampleModule;\";\n            \n                       command.ExecuteNonQuery();\n                     }\n            \n                     using (SQLiteCommand command = connection.CreateCommand())\n                     {\n                       command.CommandText = \"SELECT * FROM t1;\";\n            \n                       using (SQLiteDataReader dataReader = command.ExecuteReader())\n                       {\n                         while (dataReader.Read())\n                           Console.WriteLine(dataReader[0].ToString());\n                       }\n                     }\n            \n                     connection.Close();\n                   }\n                 }\n               }\n             </code>\n             </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModuleEnumerable.enumerable\">\n            <summary>\n            The <see cref=\"T:System.Collections.IEnumerable\"/> instance containing the backing data\n            for the virtual table.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.SQLiteModuleEnumerable.objectIdentity\">\n            <summary>\n            Non-zero if different object instances with the same value should\n            generate different row identifiers, where applicable.  This has no\n            effect on the .NET Compact Framework.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.#ctor(System.String,System.Collections.IEnumerable)\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"name\">\n            The name of the module.  This parameter cannot be null.\n            </param>\n            <param name=\"enumerable\">\n            The <see cref=\"T:System.Collections.IEnumerable\"/> instance to expose as a virtual\n            table.  This parameter cannot be null.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.#ctor(System.String,System.Collections.IEnumerable,System.Boolean)\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"name\">\n            The name of the module.  This parameter cannot be null.\n            </param>\n            <param name=\"enumerable\">\n            The <see cref=\"T:System.Collections.IEnumerable\"/> instance to expose as a virtual\n            table.  This parameter cannot be null.\n            </param>\n            <param name=\"objectIdentity\">\n            Non-zero if different object instances with the same value should\n            generate different row identifiers, where applicable.  This\n            parameter has no effect on the .NET Compact Framework.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.CursorEndOfEnumeratorError(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            Sets the table error message to one that indicates the virtual\n            table cursor has no current row.\n            </summary>\n            <param name=\"cursor\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTableCursor\"/> object instance.\n            </param>\n            <returns>\n            The value of <see cref=\"F:System.Data.SQLite.SQLiteErrorCode.Error\"/>.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </summary>\n            <param name=\"connection\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"pClientData\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"arguments\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"error\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </summary>\n            <param name=\"connection\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"pClientData\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"arguments\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <param name=\"error\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/> method.\n            </param>\n            <param name=\"index\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.Disconnect(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.Destroy(System.Data.SQLite.SQLiteVirtualTable)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\"/> method.\n            </param>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.Close(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </param>\n            <param name=\"indexNumber\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </param>\n            <param name=\"indexString\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </param>\n            <param name=\"values\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.Next(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </param>\n            <param name=\"context\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </param>\n            <param name=\"index\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)\"/> method.\n            </param>\n            <param name=\"rowId\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\"/> method.\n            </param>\n            <param name=\"values\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\"/> method.\n            </param>\n            <param name=\"rowId\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)\"/> method.\n            </param>\n            <param name=\"newName\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.CheckDisposed\">\n            <summary>\n            Throws an <see cref=\"T:System.ObjectDisposedException\"/> if this object\n            instance has been disposed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.SQLiteModuleEnumerable.Dispose(System.Boolean)\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n            <param name=\"disposing\">\n            Non-zero if this method is being called from the\n            <see cref=\"M:System.IDisposable.Dispose\"/> method.  Zero if this method is\n            being called from the finalizer.\n            </param>\n        </member>\n        <member name=\"T:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1\">\n            <summary>\n            This class represents a virtual table cursor to be used with the\n            <see cref=\"T:System.Data.SQLite.SQLiteModuleEnumerable\"/> class.  It is not sealed and may\n            be used as the base class for any user-defined virtual table cursor\n            class that wraps an <see cref=\"T:System.Collections.Generic.IEnumerator`1\"/> object instance.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.enumerator\">\n            <summary>\n            The <see cref=\"T:System.Collections.Generic.IEnumerator`1\"/> instance provided when this\n            cursor was created.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.#ctor(System.Data.SQLite.SQLiteVirtualTable,System.Collections.Generic.IEnumerator{`0})\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"table\">\n            The <see cref=\"T:System.Data.SQLite.SQLiteVirtualTable\"/> object instance associated\n            with this object instance.\n            </param>\n            <param name=\"enumerator\">\n            The <see cref=\"T:System.Collections.Generic.IEnumerator`1\"/> instance to expose as a virtual\n            table cursor.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.Close\">\n            <summary>\n            Closes the virtual table cursor.  This method must not throw any\n            exceptions.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.CheckDisposed\">\n            <summary>\n            Throws an <see cref=\"T:System.ObjectDisposedException\"/> if this object\n            instance has been disposed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.Dispose(System.Boolean)\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n            <param name=\"disposing\">\n            Non-zero if this method is being called from the\n            <see cref=\"M:System.IDisposable.Dispose\"/> method.  Zero if this method is\n            being called from the finalizer.\n            </param>\n        </member>\n        <member name=\"P:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.System#Collections#Generic#IEnumerator{T}#Current\">\n            <summary>\n            Returns the value for the current row of the virtual table cursor\n            using the <see cref=\"P:System.Collections.Generic.IEnumerator`1.Current\"/> property of the\n            <see cref=\"T:System.Collections.Generic.IEnumerator`1\"/> object instance.\n            </summary>\n        </member>\n        <member name=\"T:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1\">\n            <summary>\n            This class implements a virtual table module that exposes an\n            <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> object instance as a read-only virtual\n            table.  It is not sealed and may be used as the base class for any\n            user-defined virtual table class that wraps an\n            <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> object instance.\n            </summary>\n        </member>\n        <member name=\"F:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.enumerable\">\n            <summary>\n            The <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> instance containing the backing\n            data for the virtual table.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.#ctor(System.String,System.Collections.Generic.IEnumerable{`0})\">\n            <summary>\n            Constructs an instance of this class.\n            </summary>\n            <param name=\"name\">\n            The name of the module.  This parameter cannot be null.\n            </param>\n            <param name=\"enumerable\">\n            The <see cref=\"T:System.Collections.Generic.IEnumerable`1\"/> instance to expose as a virtual\n            table.  This parameter cannot be null.\n            </param>\n        </member>\n        <member name=\"M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\"/> method.\n            </summary>\n            <param name=\"table\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\"/> method.\n            </param>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\">\n            <summary>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </summary>\n            <param name=\"cursor\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </param>\n            <param name=\"context\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </param>\n            <param name=\"index\">\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </param>\n            <returns>\n            See the <see cref=\"M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)\"/> method.\n            </returns>\n        </member>\n        <member name=\"M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.CheckDisposed\">\n            <summary>\n            Throws an <see cref=\"T:System.ObjectDisposedException\"/> if this object\n            instance has been disposed.\n            </summary>\n        </member>\n        <member name=\"M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Dispose(System.Boolean)\">\n            <summary>\n            Disposes of this object instance.\n            </summary>\n            <param name=\"disposing\">\n            Non-zero if this method is being called from the\n            <see cref=\"M:System.IDisposable.Dispose\"/> method.  Zero if this method is\n            being called from the finalizer.\n            </param>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "tools/EVESDEToSQL/YamlDotNet.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>YamlDotNet</name>\n    </assembly>\n    <members>\n        <member name=\"T:YamlDotNet.Core.AnchorNotFoundException\">\n            <summary>\n            The exception that is thrown when an alias references an anchor that does not exist.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.AnchorNotFoundException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.AnchorNotFoundException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.AnchorNotFoundException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.AnchorNotFoundException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.AnchorNotFoundException.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.AnchorNotFoundException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.AnchorNotFoundException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.AnchorNotFoundException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"inner\">The inner.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Constants\">\n            <summary>\n            Defines constants thar relate to the YAML specification.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.DuplicateAnchorException\">\n            <summary>\n            The exception that is thrown when a duplicate anchor is detected.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.DuplicateAnchorException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.DuplicateAnchorException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.DuplicateAnchorException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.DuplicateAnchorException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.DuplicateAnchorException.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.DuplicateAnchorException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.DuplicateAnchorException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.DuplicateAnchorException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"inner\">The inner.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Emitter\">\n            <summary>\n            Emits YAML streams.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.#ctor(System.IO.TextWriter)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Emitter\"/> class.\n            </summary>\n            <param name=\"output\">The <see cref=\"T:System.IO.TextWriter\"/> where the emitter will write.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.#ctor(System.IO.TextWriter,System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Emitter\"/> class.\n            </summary>\n            <param name=\"output\">The <see cref=\"T:System.IO.TextWriter\"/> where the emitter will write.</param>\n            <param name=\"bestIndent\">The preferred indentation.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.#ctor(System.IO.TextWriter,System.Int32,System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Emitter\"/> class.\n            </summary>\n            <param name=\"output\">The <see cref=\"T:System.IO.TextWriter\"/> where the emitter will write.</param>\n            <param name=\"bestIndent\">The preferred indentation.</param>\n            <param name=\"bestWidth\">The preferred text width.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.#ctor(System.IO.TextWriter,System.Int32,System.Int32,System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Emitter\"/> class.\n            </summary>\n            <param name=\"output\">The <see cref=\"T:System.IO.TextWriter\"/> where the emitter will write.</param>\n            <param name=\"bestIndent\">The preferred indentation.</param>\n            <param name=\"bestWidth\">The preferred text width.</param>\n            <param name=\"isCanonical\">If true, write the output in canonical form.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.Emit(YamlDotNet.Core.Events.ParsingEvent)\">\n            <summary>\n            Emit an evt.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.NeedMoreEvents\">\n            <summary>\n            Check if we need to accumulate more events before emitting.\n            \n            We accumulate extra\n             - 1 event for DOCUMENT-START\n             - 2 events for SEQUENCE-START\n             - 3 events for MAPPING-START\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitStreamStart(YamlDotNet.Core.Events.ParsingEvent)\">\n            <summary>\n            Expect STREAM-START.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitDocumentStart(YamlDotNet.Core.Events.ParsingEvent,System.Boolean)\">\n            <summary>\n            Expect DOCUMENT-START or STREAM-END.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitDocumentContent(YamlDotNet.Core.Events.ParsingEvent)\">\n            <summary>\n            Expect the root node.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitNode(YamlDotNet.Core.Events.ParsingEvent,System.Boolean,System.Boolean,System.Boolean)\">\n            <summary>\n            Expect a node.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitAlias\">\n            <summary>\n            Expect ALIAS.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitScalar(YamlDotNet.Core.Events.ParsingEvent)\">\n            <summary>\n            Expect SCALAR.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitSequenceStart(YamlDotNet.Core.Events.ParsingEvent)\">\n            <summary>\n            Expect SEQUENCE-START.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitMappingStart(YamlDotNet.Core.Events.ParsingEvent)\">\n            <summary>\n            Expect MAPPING-START.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitDocumentEnd(YamlDotNet.Core.Events.ParsingEvent)\">\n            <summary>\n            Expect DOCUMENT-END.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitFlowSequenceItem(YamlDotNet.Core.Events.ParsingEvent,System.Boolean)\">\n            <summary>\n            Expect a flow item node.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitFlowMappingKey(YamlDotNet.Core.Events.ParsingEvent,System.Boolean)\">\n            <summary>\n            Expect a flow key node.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitFlowMappingValue(YamlDotNet.Core.Events.ParsingEvent,System.Boolean)\">\n            <summary>\n            Expect a flow value node.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitBlockSequenceItem(YamlDotNet.Core.Events.ParsingEvent,System.Boolean)\">\n            <summary>\n            Expect a block item node.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitBlockMappingKey(YamlDotNet.Core.Events.ParsingEvent,System.Boolean)\">\n            <summary>\n            Expect a block key node.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.EmitBlockMappingValue(YamlDotNet.Core.Events.ParsingEvent,System.Boolean)\">\n            <summary>\n            Expect a block value node.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.CheckEmptyDocument\">\n            <summary>\n            Check if the document content is an empty scalar.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Emitter.CheckSimpleKey\">\n            <summary>\n            Check if the next node can be expressed as a simple key.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.EventReader\">\n            <summary>\n            Reads events from a sequence of <see cref=\"T:YamlDotNet.Core.Events.ParsingEvent\" />.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.EventReader.#ctor(YamlDotNet.Core.IParser)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.EventReader\"/> class.\n            </summary>\n            <param name=\"parser\">The parser that provides the events.</param>\n        </member>\n        <member name=\"P:YamlDotNet.Core.EventReader.Parser\">\n            <summary>\n            Gets the underlying parser.\n            </summary>\n            <value>The parser.</value>\n        </member>\n        <member name=\"M:YamlDotNet.Core.EventReader.Expect``1\">\n            <summary>\n            Ensures that the current event is of the specified type, returns it and moves to the next event.\n            </summary>\n            <typeparam name=\"T\">Type of the <see cref=\"T:YamlDotNet.Core.Events.ParsingEvent\"/>.</typeparam>\n            <returns>Returns the current event.</returns>\n            <exception cref=\"T:YamlDotNet.Core.YamlException\">If the current event is not of the specified type.</exception>\n        </member>\n        <member name=\"M:YamlDotNet.Core.EventReader.Accept``1\">\n            <summary>\n            Checks whether the current event is of the specified type.\n            </summary>\n            <typeparam name=\"T\">Type of the event.</typeparam>\n            <returns>Returns true if the current event is of type <typeparamref name=\"T\"/>. Otherwise returns false.</returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.EventReader.Allow``1\">\n            <summary>\n            Checks whether the current event is of the specified type.\n            If the event is of the specified type, returns it and moves to the next event.\n            Otherwise retruns null.\n            </summary>\n            <typeparam name=\"T\">Type of the <see cref=\"T:YamlDotNet.Core.Events.ParsingEvent\"/>.</typeparam>\n            <returns>Returns the current event if it is of type T; otherwise returns null.</returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.EventReader.Peek``1\">\n            <summary>\n            Gets the next event without consuming it.\n            </summary>\n            <typeparam name=\"T\">Type of the <see cref=\"T:YamlDotNet.Core.Events.ParsingEvent\"/>.</typeparam>\n            <returns>Returns the current event if it is of type T; otherwise returns null.</returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.EventReader.SkipThisAndNestedEvents\">\n            <summary>\n            Skips the current event and any nested event.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.AnchorAlias\">\n            <summary>\n            Represents an alias event.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.AnchorAlias.Type\">\n            <summary>\n            Gets the event type, which allows for simpler type comparisons.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.AnchorAlias.Value\">\n            <summary>\n            Gets the value of the alias.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.AnchorAlias.#ctor(System.String,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.AnchorAlias\"/> class.\n            </summary>\n            <param name=\"value\">The value of the alias.</param>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.AnchorAlias.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.AnchorAlias\"/> class.\n            </summary>\n            <param name=\"value\">The value of the alias.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.AnchorAlias.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.AnchorAlias.Accept(YamlDotNet.Core.Events.IParsingEventVisitor)\">\n            <summary>\n            Invokes run-time type specific Visit() method of the specified visitor.\n            </summary>\n            <param name=\"visitor\">visitor, may not be null.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.DocumentEnd\">\n            <summary>\n            Represents a document end event.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.DocumentEnd.NestingIncrease\">\n            <summary>\n            Gets a value indicating the variation of depth caused by this event.\n            The value can be either -1, 0 or 1. For start events, it will be 1,\n            for end events, it will be -1, and for the remaining events, it will be 0.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.DocumentEnd.Type\">\n            <summary>\n            Gets the event type, which allows for simpler type comparisons.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.DocumentEnd.IsImplicit\">\n            <summary>\n            Gets a value indicating whether this instance is implicit.\n            </summary>\n            <value>\n                <c>true</c> if this instance is implicit; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.DocumentEnd.#ctor(System.Boolean,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.DocumentEnd\"/> class.\n            </summary>\n            <param name=\"isImplicit\">Indicates whether the event is implicit.</param>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.DocumentEnd.#ctor(System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.DocumentEnd\"/> class.\n            </summary>\n            <param name=\"isImplicit\">Indicates whether the event is implicit.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.DocumentEnd.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.DocumentEnd.Accept(YamlDotNet.Core.Events.IParsingEventVisitor)\">\n            <summary>\n            Invokes run-time type specific Visit() method of the specified visitor.\n            </summary>\n            <param name=\"visitor\">visitor, may not be null.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.DocumentStart\">\n            <summary>\n            Represents a document start event.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.DocumentStart.NestingIncrease\">\n            <summary>\n            Gets a value indicating the variation of depth caused by this event.\n            The value can be either -1, 0 or 1. For start events, it will be 1,\n            for end events, it will be -1, and for the remaining events, it will be 0.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.DocumentStart.Type\">\n            <summary>\n            Gets the event type, which allows for simpler type comparisons.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.DocumentStart.Tags\">\n            <summary>\n            Gets the tags.\n            </summary>\n            <value>The tags.</value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.DocumentStart.Version\">\n            <summary>\n            Gets the version.\n            </summary>\n            <value>The version.</value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.DocumentStart.IsImplicit\">\n            <summary>\n            Gets a value indicating whether this instance is implicit.\n            </summary>\n            <value>\n                <c>true</c> if this instance is implicit; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.DocumentStart.#ctor(YamlDotNet.Core.Tokens.VersionDirective,YamlDotNet.Core.TagDirectiveCollection,System.Boolean,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.DocumentStart\"/> class.\n            </summary>\n            <param name=\"version\">The version.</param>\n            <param name=\"tags\">The tags.</param>\n            <param name=\"isImplicit\">Indicates whether the event is implicit.</param>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.DocumentStart.#ctor(YamlDotNet.Core.Tokens.VersionDirective,YamlDotNet.Core.TagDirectiveCollection,System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.DocumentStart\"/> class.\n            </summary>\n            <param name=\"version\">The version.</param>\n            <param name=\"tags\">The tags.</param>\n            <param name=\"isImplicit\">Indicates whether the event is implicit.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.DocumentStart.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.DocumentStart\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.DocumentStart.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.DocumentStart\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.DocumentStart.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.DocumentStart.Accept(YamlDotNet.Core.Events.IParsingEventVisitor)\">\n            <summary>\n            Invokes run-time type specific Visit() method of the specified visitor.\n            </summary>\n            <param name=\"visitor\">visitor, may not be null.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.IParsingEventVisitor\">\n            <summary>\n            Callback interface for external event Visitor.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.MappingStyle\">\n            <summary>\n            Specifies the style of a mapping.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Core.Events.MappingStyle.Any\">\n            <summary>\n            Let the emitter choose the style.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Core.Events.MappingStyle.Block\">\n            <summary>\n            The block mapping style.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Core.Events.MappingStyle.Flow\">\n            <summary>\n            The flow mapping style.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.NodeEvent\">\n            <summary>\n            Contains the behavior that is common between node events.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.NodeEvent.Anchor\">\n            <summary>\n            Gets the anchor.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.NodeEvent.Tag\">\n            <summary>\n            Gets the tag.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.NodeEvent.IsCanonical\">\n            <summary>\n            Gets a value indicating whether this instance is canonical.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.NodeEvent.#ctor(System.String,System.String,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.NodeEvent\"/> class.\n            </summary>\n            <param name=\"anchor\">The anchor.</param>\n            <param name=\"tag\">The tag.</param>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.NodeEvent.#ctor(System.String,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.NodeEvent\"/> class.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.ParsingEvent\">\n            <summary>\n            Base class for parsing events.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.ParsingEvent.NestingIncrease\">\n            <summary>\n            Gets a value indicating the variation of depth caused by this event.\n            The value can be either -1, 0 or 1. For start events, it will be 1,\n            for end events, it will be -1, and for the remaining events, it will be 0.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.ParsingEvent.Type\">\n            <summary>\n            Gets the event type, which allows for simpler type comparisons.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.ParsingEvent.Start\">\n            <summary>\n            Gets the position in the input stream where the event starts.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.ParsingEvent.End\">\n            <summary>\n            Gets the position in the input stream where the event ends.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.ParsingEvent.Accept(YamlDotNet.Core.Events.IParsingEventVisitor)\">\n            <summary>\n            Accepts the specified visitor.\n            </summary>\n            <param name=\"visitor\">Visitor to accept, may not be null</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.ParsingEvent.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.ParsingEvent\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.MappingEnd\">\n            <summary>\n            Represents a mapping end event.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.MappingEnd.NestingIncrease\">\n            <summary>\n            Gets a value indicating the variation of depth caused by this event.\n            The value can be either -1, 0 or 1. For start events, it will be 1,\n            for end events, it will be -1, and for the remaining events, it will be 0.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.MappingEnd.Type\">\n            <summary>\n            Gets the event type, which allows for simpler type comparisons.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.MappingEnd.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.MappingEnd\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.MappingEnd.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.MappingEnd\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.MappingEnd.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.MappingEnd.Accept(YamlDotNet.Core.Events.IParsingEventVisitor)\">\n            <summary>\n            Invokes run-time type specific Visit() method of the specified visitor.\n            </summary>\n            <param name=\"visitor\">visitor, may not be null.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.MappingStart\">\n            <summary>\n            Represents a mapping start event.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.MappingStart.NestingIncrease\">\n            <summary>\n            Gets a value indicating the variation of depth caused by this event.\n            The value can be either -1, 0 or 1. For start events, it will be 1,\n            for end events, it will be -1, and for the remaining events, it will be 0.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.MappingStart.Type\">\n            <summary>\n            Gets the event type, which allows for simpler type comparisons.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.MappingStart.IsImplicit\">\n            <summary>\n            Gets a value indicating whether this instance is implicit.\n            </summary>\n            <value>\n                <c>true</c> if this instance is implicit; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.MappingStart.IsCanonical\">\n            <summary>\n            Gets a value indicating whether this instance is canonical.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.MappingStart.Style\">\n            <summary>\n            Gets the style of the mapping.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.MappingStart.#ctor(System.String,System.String,System.Boolean,YamlDotNet.Core.Events.MappingStyle,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.MappingStart\"/> class.\n            </summary>\n            <param name=\"anchor\">The anchor.</param>\n            <param name=\"tag\">The tag.</param>\n            <param name=\"isImplicit\">Indicates whether the event is implicit.</param>\n            <param name=\"style\">The style of the mapping.</param>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.MappingStart.#ctor(System.String,System.String,System.Boolean,YamlDotNet.Core.Events.MappingStyle)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.MappingStart\"/> class.\n            </summary>\n            <param name=\"anchor\">The anchor.</param>\n            <param name=\"tag\">The tag.</param>\n            <param name=\"isImplicit\">Indicates whether the event is implicit.</param>\n            <param name=\"style\">The style of the mapping.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.MappingStart.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.MappingStart\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.MappingStart.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.MappingStart.Accept(YamlDotNet.Core.Events.IParsingEventVisitor)\">\n            <summary>\n            Invokes run-time type specific Visit() method of the specified visitor.\n            </summary>\n            <param name=\"visitor\">visitor, may not be null.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.Scalar\">\n            <summary>\n            Represents a scalar event.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.Scalar.Type\">\n            <summary>\n            Gets the event type, which allows for simpler type comparisons.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.Scalar.Value\">\n            <summary>\n            Gets the value.\n            </summary>\n            <value>The value.</value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.Scalar.Style\">\n            <summary>\n            Gets the style of the scalar.\n            </summary>\n            <value>The style.</value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.Scalar.IsPlainImplicit\">\n            <summary>\n            Gets a value indicating whether the tag is optional for the plain style.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.Scalar.IsQuotedImplicit\">\n            <summary>\n            Gets a value indicating whether the tag is optional for any non-plain style.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.Scalar.IsCanonical\">\n            <summary>\n            Gets a value indicating whether this instance is canonical.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.Scalar.#ctor(System.String,System.String,System.String,YamlDotNet.Core.ScalarStyle,System.Boolean,System.Boolean,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.Scalar\"/> class.\n            </summary>\n            <param name=\"anchor\">The anchor.</param>\n            <param name=\"tag\">The tag.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"style\">The style.</param>\n            <param name=\"isPlainImplicit\">.</param>\n            <param name=\"isQuotedImplicit\">.</param>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.Scalar.#ctor(System.String,System.String,System.String,YamlDotNet.Core.ScalarStyle,System.Boolean,System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.Scalar\"/> class.\n            </summary>\n            <param name=\"anchor\">The anchor.</param>\n            <param name=\"tag\">The tag.</param>\n            <param name=\"value\">The value.</param>\n            <param name=\"style\">The style.</param>\n            <param name=\"isPlainImplicit\">.</param>\n            <param name=\"isQuotedImplicit\">.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.Scalar.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.Scalar\"/> class.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.Scalar.#ctor(System.String,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.Scalar\"/> class.\n            </summary>\n            <param name=\"tag\">The tag.</param>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.Scalar.#ctor(System.String,System.String,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.Scalar\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.Scalar.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.Scalar.Accept(YamlDotNet.Core.Events.IParsingEventVisitor)\">\n            <summary>\n            Invokes run-time type specific Visit() method of the specified visitor.\n            </summary>\n            <param name=\"visitor\">visitor, may not be null.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.SequenceEnd\">\n            <summary>\n            Represents a sequence end event.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.SequenceEnd.NestingIncrease\">\n            <summary>\n            Gets a value indicating the variation of depth caused by this event.\n            The value can be either -1, 0 or 1. For start events, it will be 1,\n            for end events, it will be -1, and for the remaining events, it will be 0.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.SequenceEnd.Type\">\n            <summary>\n            Gets the event type, which allows for simpler type comparisons.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.SequenceEnd.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.SequenceEnd\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.SequenceEnd.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.SequenceEnd\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.SequenceEnd.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.SequenceEnd.Accept(YamlDotNet.Core.Events.IParsingEventVisitor)\">\n            <summary>\n            Invokes run-time type specific Visit() method of the specified visitor.\n            </summary>\n            <param name=\"visitor\">visitor, may not be null.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.SequenceStart\">\n            <summary>\n            Represents a sequence start event.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.SequenceStart.NestingIncrease\">\n            <summary>\n            Gets a value indicating the variation of depth caused by this event.\n            The value can be either -1, 0 or 1. For start events, it will be 1,\n            for end events, it will be -1, and for the remaining events, it will be 0.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.SequenceStart.Type\">\n            <summary>\n            Gets the event type, which allows for simpler type comparisons.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.SequenceStart.IsImplicit\">\n            <summary>\n            Gets a value indicating whether this instance is implicit.\n            </summary>\n            <value>\n                <c>true</c> if this instance is implicit; otherwise, <c>false</c>.\n            </value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.SequenceStart.IsCanonical\">\n            <summary>\n            Gets a value indicating whether this instance is canonical.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.SequenceStart.Style\">\n            <summary>\n            Gets the style.\n            </summary>\n            <value>The style.</value>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.SequenceStart.#ctor(System.String,System.String,System.Boolean,YamlDotNet.Core.Events.SequenceStyle,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.SequenceStart\"/> class.\n            </summary>\n            <param name=\"anchor\">The anchor.</param>\n            <param name=\"tag\">The tag.</param>\n            <param name=\"isImplicit\">if set to <c>true</c> [is implicit].</param>\n            <param name=\"style\">The style.</param>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.SequenceStart.#ctor(System.String,System.String,System.Boolean,YamlDotNet.Core.Events.SequenceStyle)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.SequenceStart\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.SequenceStart.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.SequenceStart.Accept(YamlDotNet.Core.Events.IParsingEventVisitor)\">\n            <summary>\n            Invokes run-time type specific Visit() method of the specified visitor.\n            </summary>\n            <param name=\"visitor\">visitor, may not be null.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.SequenceStyle\">\n            <summary>\n            Specifies the style of a sequence.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Core.Events.SequenceStyle.Any\">\n            <summary>\n            Let the emitter choose the style.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Core.Events.SequenceStyle.Block\">\n            <summary>\n            The block sequence style.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Core.Events.SequenceStyle.Flow\">\n            <summary>\n            The flow sequence style.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.StreamEnd\">\n            <summary>\n            Represents a stream end event.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.StreamEnd.NestingIncrease\">\n            <summary>\n            Gets a value indicating the variation of depth caused by this event.\n            The value can be either -1, 0 or 1. For start events, it will be 1,\n            for end events, it will be -1, and for the remaining events, it will be 0.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.StreamEnd.Type\">\n            <summary>\n            Gets the event type, which allows for simpler type comparisons.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.StreamEnd.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.StreamEnd\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.StreamEnd.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.StreamEnd\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.StreamEnd.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.StreamEnd.Accept(YamlDotNet.Core.Events.IParsingEventVisitor)\">\n            <summary>\n            Invokes run-time type specific Visit() method of the specified visitor.\n            </summary>\n            <param name=\"visitor\">visitor, may not be null.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Events.StreamStart\">\n            <summary>\n            Represents a stream start event.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.StreamStart.NestingIncrease\">\n            <summary>\n            Gets a value indicating the variation of depth caused by this event.\n            The value can be either -1, 0 or 1. For start events, it will be 1,\n            for end events, it will be -1, and for the remaining events, it will be 0.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Events.StreamStart.Type\">\n            <summary>\n            Gets the event type, which allows for simpler type comparisons.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.StreamStart.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.StreamStart\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.StreamStart.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Events.StreamStart\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.StreamStart.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Events.StreamStart.Accept(YamlDotNet.Core.Events.IParsingEventVisitor)\">\n            <summary>\n            Invokes run-time type specific Visit() method of the specified visitor.\n            </summary>\n            <param name=\"visitor\">visitor, may not be null.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.FakeList`1\">\n            <summary>\n            Implements an indexer through an IEnumerator&lt;T&gt;.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.FakeList`1.#ctor(System.Collections.Generic.IEnumerator{`0})\">\n            <summary>\n            Initializes a new instance of FakeList&lt;T&gt;.\n            </summary>\n            <param name=\"collection\">The enumerator to use to implement the indexer.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.FakeList`1.#ctor(System.Collections.Generic.IEnumerable{`0})\">\n            <summary>\n            Initializes a new instance of FakeList&lt;T&gt;.\n            </summary>\n            <param name=\"collection\">The collection to use to implement the indexer.</param>\n        </member>\n        <member name=\"P:YamlDotNet.Core.FakeList`1.Item(System.Int32)\">\n            <summary>\n            Gets the element at the specified index. \n            </summary>\n            <remarks>\n            If index is greater or equal than the last used index, this operation is O(index - lastIndex),\n            else this operation is O(index).\n            </remarks>\n        </member>\n        <member name=\"T:YamlDotNet.Core.ForwardAnchorNotSupportedException\">\n            <summary>\n            The exception that is thrown when an alias references an anchor\n            that has not yet been defined in a context that does not support forward references.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.ForwardAnchorNotSupportedException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.AnchorNotFoundException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.ForwardAnchorNotSupportedException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.AnchorNotFoundException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.ForwardAnchorNotSupportedException.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.AnchorNotFoundException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.ForwardAnchorNotSupportedException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.AnchorNotFoundException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"inner\">The inner.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.HashCode\">\n            <summary>\n            Supports implementations of <see cref=\"M:System.Object.GetHashCode\"/> by providing methods to combine two hash codes.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.HashCode.CombineHashCodes(System.Int32,System.Int32)\">\n            <summary>\n            Combines two hash codes.\n            </summary>\n            <param name=\"h1\">The first hash code.</param>\n            <param name=\"h2\">The second hash code.</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:YamlDotNet.Core.IEmitter\">\n            <summary>\n            Represents a YAML stream emitter.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.IEmitter.Emit(YamlDotNet.Core.Events.ParsingEvent)\">\n            <summary>\n            Emits an event.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.ILookAheadBuffer.EndOfInput\">\n            <summary>\n            Gets a value indicating whether the end of the input reader has been reached.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.ILookAheadBuffer.Peek(System.Int32)\">\n            <summary>\n            Gets the character at thhe specified offset.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.ILookAheadBuffer.Skip(System.Int32)\">\n            <summary>\n            Skips the next <paramref name=\"length\"/> characters. Those characters must have been\n            obtained first by calling the <see cref=\"M:YamlDotNet.Core.ILookAheadBuffer.Peek(System.Int32)\"/> method.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.InsertionQueue`1\">\n            <summary>\n            Generic queue on which items may be inserted\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.InsertionQueue`1.Count\">\n            <summary>\n            Gets the number of items that are contained by the queue.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.InsertionQueue`1.Enqueue(`0)\">\n            <summary>\n            Enqueues the specified item.\n            </summary>\n            <param name=\"item\">The item to be enqueued.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.InsertionQueue`1.Dequeue\">\n            <summary>\n            Dequeues an item.\n            </summary>\n            <returns>Returns the item that been dequeued.</returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.InsertionQueue`1.Insert(System.Int32,`0)\">\n            <summary>\n            Inserts an item at the specified index.\n            </summary>\n            <param name=\"index\">The index where to insert the item.</param>\n            <param name=\"item\">The item to be inserted.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.IParser\">\n            <summary>\n            Represents a YAML stream paser.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.IParser.Current\">\n            <summary>\n            Gets the current event.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.IParser.MoveNext\">\n            <summary>\n            Moves to the next event.\n            </summary>\n            <returns>Returns true if there are more events available, otherwise returns false.</returns>\n        </member>\n        <member name=\"T:YamlDotNet.Core.IScanner\">\n            <summary>\n            Defines the interface for a stand-alone YAML scanner that\n            converts a sequence of characters into a sequence of YAML tokens.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.IScanner.CurrentPosition\">\n            <summary>\n            Gets the current position inside the input stream.\n            </summary>\n            <value>The current position.</value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.IScanner.Current\">\n            <summary>\n            Gets the current token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.IScanner.MoveNext\">\n            <summary>\n            Moves to the next token and consumes the current token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.IScanner.MoveNextWithoutConsuming\">\n            <summary>\n            Moves to the next token without consuming the current token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.IScanner.ConsumeCurrent\">\n            <summary>\n            Consumes the current token.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.LookAheadBuffer\">\n            <summary>\n            Provides access to a stream and allows to peek at the next characters,\n            up to the buffer's capacity.\n            </summary>\n            <remarks>\n            This class implements a circular buffer with a fixed capacity.\n            </remarks>\n        </member>\n        <member name=\"M:YamlDotNet.Core.LookAheadBuffer.#ctor(System.IO.TextReader,System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.LookAheadBuffer\"/> class.\n            </summary>\n            <param name=\"input\">The input.</param>\n            <param name=\"capacity\">The capacity.</param>\n        </member>\n        <member name=\"P:YamlDotNet.Core.LookAheadBuffer.EndOfInput\">\n            <summary>\n            Gets a value indicating whether the end of the input reader has been reached.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.LookAheadBuffer.GetIndexForOffset(System.Int32)\">\n            <summary>\n            Gets the index of the character for the specified offset.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.LookAheadBuffer.Peek(System.Int32)\">\n            <summary>\n            Gets the character at thhe specified offset.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.LookAheadBuffer.Cache(System.Int32)\">\n            <summary>\n            Reads characters until at least <paramref name=\"length\"/> characters are in the buffer.\n            </summary>\n            <param name=\"length\">\n            Number of characters to cache.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.LookAheadBuffer.Skip(System.Int32)\">\n            <summary>\n            Skips the next <paramref name=\"length\"/> characters. Those characters must have been\n            obtained first by calling the <see cref=\"M:YamlDotNet.Core.LookAheadBuffer.Peek(System.Int32)\"/> or <see cref=\"M:YamlDotNet.Core.LookAheadBuffer.Cache(System.Int32)\"/> methods.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Mark\">\n            <summary>\n            Represents a location inside a file\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Core.Mark.Empty\">\n            <summary>\n            Gets a <see cref=\"T:YamlDotNet.Core.Mark\"/> with empty values.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Mark.Index\">\n            <summary>\n            Gets / sets the absolute offset in the file\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Mark.Line\">\n            <summary>\n            Gets / sets the number of the line\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Mark.Column\">\n            <summary>\n            Gets / sets the index of the column\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Mark.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents this instance.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents this instance.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Mark.Equals(System.Object)\">\n            <summary />\n        </member>\n        <member name=\"M:YamlDotNet.Core.Mark.Equals(YamlDotNet.Core.Mark)\">\n            <summary />\n        </member>\n        <member name=\"M:YamlDotNet.Core.Mark.GetHashCode\">\n            <summary />\n        </member>\n        <member name=\"M:YamlDotNet.Core.Mark.CompareTo(System.Object)\">\n            <summary />\n        </member>\n        <member name=\"M:YamlDotNet.Core.Mark.CompareTo(YamlDotNet.Core.Mark)\">\n            <summary />\n        </member>\n        <member name=\"T:YamlDotNet.Core.MergingParser\">\n            <summary>\n            Simple implementation of <see cref=\"T:YamlDotNet.Core.IParser\"/> that implements merging: http://yaml.org/type/merge.html\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Parser\">\n            <summary>\n            Parses YAML streams.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.#ctor(System.IO.TextReader)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Parser\"/> class.\n            </summary>\n            <param name=\"input\">The input where the YAML stream is to be read.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.#ctor(YamlDotNet.Core.IScanner)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Parser\"/> class.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Parser.Current\">\n            <summary>\n            Gets the current event.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.MoveNext\">\n            <summary>\n            Moves to the next event.\n            </summary>\n            <returns>Returns true if there are more events available, otherwise returns false.</returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseStreamStart\">\n            <summary>\n            Parse the production:\n            stream   ::= STREAM-START implicit_document? explicit_document* STREAM-END\n                         ************\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseDocumentStart(System.Boolean)\">\n            <summary>\n            Parse the productions:\n            implicit_document    ::= block_node DOCUMENT-END*\n                                     *\n            explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*\n                                     *************************\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ProcessDirectives(YamlDotNet.Core.TagDirectiveCollection)\">\n            <summary>\n            Parse directives.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseDocumentContent\">\n            <summary>\n            Parse the productions:\n            explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*\n                                                               ***********\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ProcessEmptyScalar(YamlDotNet.Core.Mark)\">\n            <summary>\n            Generate an empty scalar event.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseNode(System.Boolean,System.Boolean)\">\n            <summary>\n            Parse the productions:\n            block_node_or_indentless_sequence    ::=\n                                     ALIAS\n                                     *****\n                                     | properties (block_content | indentless_block_sequence)?\n                                       **********  *\n                                     | block_content | indentless_block_sequence\n                                       *\n            block_node           ::= ALIAS\n                                     *****\n                                     | properties block_content?\n                                       ********** *\n                                     | block_content\n                                       *\n            flow_node            ::= ALIAS\n                                     *****\n                                     | properties flow_content?\n                                       ********** *\n                                     | flow_content\n                                       *\n            properties           ::= TAG ANCHOR? | ANCHOR TAG?\n                                     *************************\n            block_content        ::= block_collection | flow_collection | SCALAR\n                                                                          ******\n            flow_content         ::= flow_collection | SCALAR\n                                                       ******\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseDocumentEnd\">\n            <summary>\n            Parse the productions:\n            implicit_document    ::= block_node DOCUMENT-END*\n                                                *************\n            explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*\n                                                                           *************\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseBlockSequenceEntry(System.Boolean)\">\n            <summary>\n            Parse the productions:\n            block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END\n                               ********************  *********** *             *********\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseIndentlessSequenceEntry\">\n            <summary>\n            Parse the productions:\n            indentless_sequence  ::= (BLOCK-ENTRY block_node?)+\n                                      *********** *\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseBlockMappingKey(System.Boolean)\">\n             <summary>\n             Parse the productions:\n             block_mapping        ::= BLOCK-MAPPING_START\n                                      *******************\n                                      ((KEY block_node_or_indentless_sequence?)?\n                                        *** *\n                                      (VALUE block_node_or_indentless_sequence?)?)*\n            \n                                      BLOCK-END\n                                      *********\n             </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseBlockMappingValue\">\n             <summary>\n             Parse the productions:\n             block_mapping        ::= BLOCK-MAPPING_START\n            \n                                      ((KEY block_node_or_indentless_sequence?)?\n            \n                                      (VALUE block_node_or_indentless_sequence?)?)*\n                                       ***** *\n                                      BLOCK-END\n            \n             </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseFlowSequenceEntry(System.Boolean)\">\n            <summary>\n            Parse the productions:\n            flow_sequence        ::= FLOW-SEQUENCE-START\n                                     *******************\n                                     (flow_sequence_entry FLOW-ENTRY)*\n                                      *                   **********\n                                     flow_sequence_entry?\n                                     *\n                                     FLOW-SEQUENCE-END\n                                     *****************\n            flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?\n                                     *\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseFlowSequenceEntryMappingKey\">\n            <summary>\n            Parse the productions:\n            flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?\n                                                 *** *\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseFlowSequenceEntryMappingValue\">\n            <summary>\n            Parse the productions:\n            flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?\n                                                                 ***** *\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseFlowSequenceEntryMappingEnd\">\n            <summary>\n            Parse the productions:\n            flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?\n                                                                                 *\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseFlowMappingKey(System.Boolean)\">\n            <summary>\n            Parse the productions:\n            flow_mapping         ::= FLOW-MAPPING-START\n                                     ******************\n                                     (flow_mapping_entry FLOW-ENTRY)*\n                                      *                  **********\n                                     flow_mapping_entry?\n                                     ******************\n                                     FLOW-MAPPING-END\n                                     ****************\n            flow_mapping_entry   ::= flow_node | KEY flow_node? (VALUE flow_node?)?\n                                     *           *** *\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Parser.ParseFlowMappingValue(System.Boolean)\">\n            <summary>\n            Parse the productions:\n            flow_mapping_entry   ::= flow_node | KEY flow_node? (VALUE flow_node?)?\n                                              *                  ***** *\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.Comment\">\n            <summary>\n            Represents a comment\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Tokens.Comment.Value\">\n            <summary>\n            Gets the value of the comment\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Tokens.Comment.IsInline\">\n            <summary>\n            Gets a value indicating whether the comment appears other tokens on that line.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Comment.#ctor(System.String,System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Comment\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Comment.#ctor(System.String,System.Boolean,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Comment\"/> class.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.AnchorAlias\">\n            <summary>\n            Represents an alias token.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Tokens.AnchorAlias.Value\">\n            <summary>\n            Gets the value of the alias.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.AnchorAlias.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.AnchorAlias\"/> class.\n            </summary>\n            <param name=\"value\">The value of the anchor.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.AnchorAlias.#ctor(System.String,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.AnchorAlias\"/> class.\n            </summary>\n            <param name=\"value\">The value of the anchor.</param>\n            <param name=\"start\">The start position of the event.</param>\n            <param name=\"end\">The end position of the event.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.Anchor\">\n            <summary>\n            Represents an anchor token.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Tokens.Anchor.Value\">\n            <summary>\n            Gets the value.\n            </summary>\n            <value>The value.</value>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Anchor.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Anchor\"/> class.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Anchor.#ctor(System.String,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Anchor\"/> class.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.BlockEnd\">\n            <summary>\n            Represents a block end token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.BlockEnd.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.BlockEnd\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.BlockEnd.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.BlockEnd\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.BlockEntry\">\n            <summary>\n            Represents a block entry event.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.BlockEntry.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.BlockEntry\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.BlockEntry.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.BlockEntry\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.BlockMappingStart\">\n            <summary>\n            Represents a block mapping start token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.BlockMappingStart.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.BlockMappingStart\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.BlockMappingStart.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.BlockMappingStart\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.BlockSequenceStart\">\n            <summary>\n            Represents a block sequence start token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.BlockSequenceStart.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.BlockSequenceStart\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.BlockSequenceStart.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.BlockSequenceStart\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.DocumentEnd\">\n            <summary>\n            Represents a document end token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.DocumentEnd.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.DocumentEnd\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.DocumentEnd.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.DocumentEnd\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.DocumentStart\">\n            <summary>\n            Represents a document start token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.DocumentStart.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.DocumentStart\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.DocumentStart.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.DocumentStart\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.FlowEntry\">\n            <summary>\n            Represents a flow entry event.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.FlowEntry.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.FlowEntry\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.FlowEntry.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.FlowEntry\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.FlowMappingEnd\">\n            <summary>\n            Represents a flow mapping end token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.FlowMappingEnd.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.FlowMappingEnd\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.FlowMappingEnd.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.FlowMappingEnd\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.FlowMappingStart\">\n            <summary>\n            Represents a flow mapping start token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.FlowMappingStart.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.FlowMappingStart\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.FlowMappingStart.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.FlowMappingStart\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.FlowSequenceEnd\">\n            <summary>\n            Represents a flow sequence end token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.FlowSequenceEnd.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.FlowSequenceEnd\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.FlowSequenceEnd.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.FlowSequenceEnd\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.FlowSequenceStart\">\n            <summary>\n            Represents a flow sequence start token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.FlowSequenceStart.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.FlowSequenceStart\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.FlowSequenceStart.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.FlowSequenceStart\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.Key\">\n            <summary>\n            Represents a key token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Key.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Key\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Key.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Key\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.Scalar\">\n            <summary>\n            Represents a scalar token.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Tokens.Scalar.Value\">\n            <summary>\n            Gets the value.\n            </summary>\n            <value>The value.</value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Tokens.Scalar.Style\">\n            <summary>\n            Gets the style.\n            </summary>\n            <value>The style.</value>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Scalar.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Scalar\"/> class.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Scalar.#ctor(System.String,YamlDotNet.Core.ScalarStyle)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Scalar\"/> class.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <param name=\"style\">The style.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Scalar.#ctor(System.String,YamlDotNet.Core.ScalarStyle,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Scalar\"/> class.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <param name=\"style\">The style.</param>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.StreamEnd\">\n            <summary>\n            Represents a stream end event.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.StreamEnd.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.StreamEnd\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.StreamEnd.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.StreamEnd\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.StreamStart\">\n            <summary>\n            Represents a stream start token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.StreamStart.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.StreamStart\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.StreamStart.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.StreamStart\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.Tag\">\n            <summary>\n            Represents a tag token.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Tokens.Tag.Handle\">\n            <summary>\n            Gets the handle.\n            </summary>\n            <value>The handle.</value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Tokens.Tag.Suffix\">\n            <summary>\n            Gets the suffix.\n            </summary>\n            <value>The suffix.</value>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Tag.#ctor(System.String,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Tag\"/> class.\n            </summary>\n            <param name=\"handle\">The handle.</param>\n            <param name=\"suffix\">The suffix.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Tag.#ctor(System.String,System.String,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Tag\"/> class.\n            </summary>\n            <param name=\"handle\">The handle.</param>\n            <param name=\"suffix\">The suffix.</param>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.TagDirective\">\n            <summary>\n            Represents a tag directive token.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Tokens.TagDirective.Handle\">\n            <summary>\n            Gets the handle.\n            </summary>\n            <value>The handle.</value>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Tokens.TagDirective.Prefix\">\n            <summary>\n            Gets the prefix.\n            </summary>\n            <value>The prefix.</value>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.TagDirective.#ctor(System.String,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.TagDirective\"/> class.\n            </summary>\n            <param name=\"handle\">The handle.</param>\n            <param name=\"prefix\">The prefix.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.TagDirective.#ctor(System.String,System.String,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.TagDirective\"/> class.\n            </summary>\n            <param name=\"handle\">The handle.</param>\n            <param name=\"prefix\">The prefix.</param>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.TagDirective.Equals(System.Object)\">\n            <summary>\n            Determines whether the specified System.Object is equal to the current System.Object.\n            </summary>\n            <param name=\"obj\">The System.Object to compare with the current System.Object.</param>\n            <returns>\n            true if the specified System.Object is equal to the current System.Object; otherwise, false.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.TagDirective.GetHashCode\">\n            <summary>\n            Serves as a hash function for a particular type.\n            </summary>\n            <returns>\n            A hash code for the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.TagDirective.ToString\">\n            <summary/>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.Token\">\n            <summary>\n            Base class for YAML tokens.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Tokens.Token.Start\">\n            <summary>\n            Gets the start of the token in the input stream.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Tokens.Token.End\">\n            <summary>\n            Gets the end of the token in the input stream.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Token.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Token\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.Value\">\n            <summary>\n            Represents a value token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Value.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Value\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.Value.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.Value\"/> class.\n            </summary>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Tokens.VersionDirective\">\n            <summary>\n            Represents a version directive token.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Tokens.VersionDirective.Version\">\n            <summary>\n            Gets the version.\n            </summary>\n            <value>The version.</value>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.VersionDirective.#ctor(YamlDotNet.Core.Version)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.VersionDirective\"/> class.\n            </summary>\n            <param name=\"version\">The version.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.VersionDirective.#ctor(YamlDotNet.Core.Version,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Tokens.VersionDirective\"/> class.\n            </summary>\n            <param name=\"version\">The version.</param>\n            <param name=\"start\">The start position of the token.</param>\n            <param name=\"end\">The end position of the token.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.VersionDirective.Equals(System.Object)\">\n            <summary>\n            Determines whether the specified System.Object is equal to the current System.Object.\n            </summary>\n            <param name=\"obj\">The System.Object to compare with the current System.Object.</param>\n            <returns>\n            true if the specified System.Object is equal to the current System.Object; otherwise, false.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Tokens.VersionDirective.GetHashCode\">\n            <summary>\n            Serves as a hash function for a particular type.\n            </summary>\n            <returns>\n            A hash code for the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Scanner\">\n            <summary>\n            Converts a sequence of characters into a sequence of YAML tokens.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Scanner.Current\">\n            <summary>\n            Gets the current token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.#ctor(System.IO.TextReader,System.Boolean)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Scanner\"/> class.\n            </summary>\n            <param name=\"input\">The input.</param>\n            <param name=\"skipComments\">Indicates whether comments should be ignored</param>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Scanner.CurrentPosition\">\n            <summary>\n            Gets the current position inside the input stream.\n            </summary>\n            <value>The current position.</value>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.MoveNext\">\n            <summary>\n            Moves to the next token.\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ConsumeCurrent\">\n            <summary>\n            Consumes the current token and increments the parsed token count\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.StaleSimpleKeys\">\n            <summary>\n            Check the list of potential simple keys and remove the positions that\n            cannot contain simple keys anymore.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.UnrollIndent(System.Int32)\">\n            <summary>\n            Pop indentation levels from the indents stack until the current level\n            becomes less or equal to the column.  For each intendation level, append\n            the BLOCK-END token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.FetchStreamEnd\">\n            <summary>\n            Produce the STREAM-END token and shut down the scanner.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ScanDirective\">\n             <summary>\n             Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token.\n            \n             Scope:\n                  %YAML    1.1    # a comment \\n\n                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n                  %TAG    !yaml!  tag:yaml.org,2002:  \\n\n                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n             </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.FetchDocumentIndicator(System.Boolean)\">\n            <summary>\n            Produce the DOCUMENT-START or DOCUMENT-END token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.FetchFlowCollectionStart(System.Boolean)\">\n            <summary>\n            Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.IncreaseFlowLevel\">\n            <summary>\n            Increase the flow level and resize the simple key list if needed.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.FetchFlowCollectionEnd(System.Boolean)\">\n            <summary>\n            Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.DecreaseFlowLevel\">\n            <summary>\n            Decrease the flow level.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.FetchFlowEntry\">\n            <summary>\n            Produce the FLOW-ENTRY token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.FetchBlockEntry\">\n            <summary>\n            Produce the BLOCK-ENTRY token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.FetchKey\">\n            <summary>\n            Produce the KEY token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.FetchValue\">\n            <summary>\n            Produce the VALUE token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.RollIndent(System.Int32,System.Int32,System.Boolean,YamlDotNet.Core.Mark)\">\n            <summary>\n            Push the current indentation level to the stack and set the new level\n            the current column is greater than the indentation level.  In this case,\n            append or insert the specified token into the token queue.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.FetchAnchor(System.Boolean)\">\n            <summary>\n            Produce the ALIAS or ANCHOR token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.FetchTag\">\n            <summary>\n            Produce the TAG token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ScanTag\">\n            <summary>\n            Scan a TAG token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.FetchBlockScalar(System.Boolean)\">\n            <summary>\n            Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ScanBlockScalar(System.Boolean)\">\n            <summary>\n            Scan a block scalar.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ScanBlockScalarBreaks(System.Int32,System.Text.StringBuilder,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark@)\">\n            <summary>\n            Scan intendation spaces and line breaks for a block scalar.  Determine the\n            intendation level if needed.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.FetchFlowScalar(System.Boolean)\">\n            <summary>\n            Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ScanFlowScalar(System.Boolean)\">\n            <summary>\n            Scan a quoted scalar.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.FetchPlainScalar\">\n            <summary>\n            Produce the SCALAR(...,plain) token.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ScanPlainScalar\">\n            <summary>\n            Scan a plain scalar.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.RemoveSimpleKey\">\n            <summary>\n            Remove a potential simple key at the current flow level.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ScanDirectiveName(YamlDotNet.Core.Mark)\">\n             <summary>\n             Scan the directive name.\n            \n             Scope:\n                  %YAML   1.1     # a comment \\n\n                   ^^^^\n                  %TAG    !yaml!  tag:yaml.org,2002:  \\n\n                   ^^^\n             </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ScanVersionDirectiveValue(YamlDotNet.Core.Mark)\">\n             <summary>\n             Scan the value of VERSION-DIRECTIVE.\n            \n             Scope:\n                  %YAML   1.1     # a comment \\n\n                       ^^^^^^\n             </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ScanTagDirectiveValue(YamlDotNet.Core.Mark)\">\n             <summary>\n             Scan the value of a TAG-DIRECTIVE token.\n            \n             Scope:\n                  %TAG    !yaml!  tag:yaml.org,2002:  \\n\n                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n             </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ScanTagUri(System.String,YamlDotNet.Core.Mark)\">\n            <summary>\n            Scan a tag.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ScanUriEscapes(YamlDotNet.Core.Mark)\">\n            <summary>\n            Decode an URI-escape sequence corresponding to a single UTF-8 character.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ScanTagHandle(System.Boolean,YamlDotNet.Core.Mark)\">\n            <summary>\n            Scan a tag handle.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.ScanVersionDirectiveNumber(YamlDotNet.Core.Mark)\">\n             <summary>\n             Scan the version number of VERSION-DIRECTIVE.\n            \n             Scope:\n                  %YAML   1.1     # a comment \\n\n                          ^\n                  %YAML   1.1     # a comment \\n\n                            ^\n             </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Scanner.SaveSimpleKey\">\n            <summary>\n            Check if a simple key may start at the current position and add it if\n            needed.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.SemanticErrorException\">\n            <summary>\n            Exception that is thrown when a semantic error is detected on a YAML stream.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.SemanticErrorException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.SemanticErrorException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.SemanticErrorException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.SemanticErrorException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.SemanticErrorException.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.SemanticErrorException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.SemanticErrorException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.SemanticErrorException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"inner\">The inner.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.SyntaxErrorException\">\n            <summary>\n            Exception that is thrown when a syntax error is detected on a YAML stream.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.SyntaxErrorException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.SyntaxErrorException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.SyntaxErrorException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.SyntaxErrorException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.SyntaxErrorException.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.SyntaxErrorException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.SyntaxErrorException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.SyntaxErrorException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"inner\">The inner.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Core.TagDirectiveCollection\">\n            <summary>\n            Collection of <see cref=\"T:YamlDotNet.Core.Tokens.TagDirective\"/>.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.TagDirectiveCollection.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.TagDirectiveCollection\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.TagDirectiveCollection.#ctor(System.Collections.Generic.IEnumerable{YamlDotNet.Core.Tokens.TagDirective})\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.TagDirectiveCollection\"/> class.\n            </summary>\n            <param name=\"tagDirectives\">Initial content of the collection.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.TagDirectiveCollection.GetKeyForItem(YamlDotNet.Core.Tokens.TagDirective)\">\n            <summary/>\n        </member>\n        <member name=\"M:YamlDotNet.Core.TagDirectiveCollection.Contains(YamlDotNet.Core.Tokens.TagDirective)\">\n            <summary>\n            Gets a value indicating whether the collection contains a directive with the same handle\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.ScalarStyle\">\n            <summary>\n            Specifies the style of a YAML scalar.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Core.ScalarStyle.Any\">\n            <summary>\n            Let the emitter choose the style.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Core.ScalarStyle.Plain\">\n            <summary>\n            The plain scalar style.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Core.ScalarStyle.SingleQuoted\">\n            <summary>\n            The single-quoted scalar style.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Core.ScalarStyle.DoubleQuoted\">\n            <summary>\n            The double-quoted scalar style.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Core.ScalarStyle.Literal\">\n            <summary>\n            The literal scalar style.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Core.ScalarStyle.Folded\">\n            <summary>\n            The folded scalar style.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Core.Version\">\n            <summary>\n            Specifies the version of the YAML language.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Version.Major\">\n            <summary>\n            Gets the major version number.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.Version.Minor\">\n            <summary>\n            Gets the minor version number.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Version.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.Version\"/> class.\n            </summary>\n            <param name=\"major\">The the major version number.</param>\n            <param name=\"minor\">The the minor version number.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Version.Equals(System.Object)\">\n            <summary>\n            Determines whether the specified System.Object is equal to the current System.Object.\n            </summary>\n            <param name=\"obj\">The System.Object to compare with the current System.Object.</param>\n            <returns>\n            true if the specified System.Object is equal to the current System.Object; otherwise, false.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.Core.Version.GetHashCode\">\n            <summary>\n            Serves as a hash function for a particular type.\n            </summary>\n            <returns>\n            A hash code for the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"T:YamlDotNet.Core.YamlException\">\n            <summary>\n            Base exception that is thrown when the a problem occurs in the YamlDotNet library.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.YamlException.Start\">\n            <summary>\n            Gets the position in the input stream where the event that originated the exception starts.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Core.YamlException.End\">\n            <summary>\n            Gets the position in the input stream where the event that originated the exception ends.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.YamlException.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.YamlException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.YamlException.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.YamlException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Core.YamlException.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark,System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.YamlException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.YamlException.#ctor(YamlDotNet.Core.Mark,YamlDotNet.Core.Mark,System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.YamlException\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Core.YamlException.#ctor(System.String,System.Exception)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Core.YamlException\"/> class.\n            </summary>\n            <param name=\"message\">The message.</param>\n            <param name=\"inner\">The inner.</param>\n        </member>\n        <member name=\"M:YamlDotNet.ReflectionExtensions.HasDefaultConstructor(System.Type)\">\n            <summary>\n            Determines whether the specified type has a default constructor.\n            </summary>\n            <param name=\"type\">The type.</param>\n            <returns>\n                <c>true</c> if the type has a default constructor; otherwise, <c>false</c>.\n            </returns>\n        </member>\n        <member name=\"T:YamlDotNet.RepresentationModel.DocumentLoadingState\">\n            <summary>\n            Manages the state of a <see cref=\"T:YamlDotNet.RepresentationModel.YamlDocument\" /> while it is loading.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.DocumentLoadingState.AddAnchor(YamlDotNet.RepresentationModel.YamlNode)\">\n            <summary>\n            Adds the specified node to the anchor list.\n            </summary>\n            <param name=\"node\">The node.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.DocumentLoadingState.GetNode(System.String,System.Boolean,YamlDotNet.Core.Mark,YamlDotNet.Core.Mark)\">\n            <summary>\n            Gets the node with the specified anchor.\n            </summary>\n            <param name=\"anchor\">The anchor.</param>\n            <param name=\"throwException\">if set to <c>true</c>, the method should throw an exception if there is no node with that anchor.</param>\n            <param name=\"start\">The start position.</param>\n            <param name=\"end\">The end position.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.DocumentLoadingState.AddNodeWithUnresolvedAliases(YamlDotNet.RepresentationModel.YamlNode)\">\n            <summary>\n            Adds the specified node to the collection of nodes with unresolved aliases.\n            </summary>\n            <param name=\"node\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlNode\"/> that has unresolved aliases.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.DocumentLoadingState.ResolveAliases\">\n            <summary>\n            Resolves the aliases that could not be resolved while loading the document.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.RepresentationModel.EmitterState\">\n            <summary>\n            Holds state that is used when emitting a stream.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.EmitterState.EmittedAnchors\">\n            <summary>\n            Gets the already emitted anchors.\n            </summary>\n            <value>The emitted anchors.</value>\n        </member>\n        <member name=\"T:YamlDotNet.RepresentationModel.IYamlVisitor\">\n            <summary>\n            Defines the method needed to be able to visit Yaml elements.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.IYamlVisitor.Visit(YamlDotNet.RepresentationModel.YamlStream)\">\n            <summary>\n            Visits a <see cref=\"T:YamlDotNet.RepresentationModel.YamlStream\"/>.\n            </summary>\n            <param name=\"stream\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlStream\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.IYamlVisitor.Visit(YamlDotNet.RepresentationModel.YamlDocument)\">\n            <summary>\n            Visits a <see cref=\"T:YamlDotNet.RepresentationModel.YamlDocument\"/>.\n            </summary>\n            <param name=\"document\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlDocument\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.IYamlVisitor.Visit(YamlDotNet.RepresentationModel.YamlScalarNode)\">\n            <summary>\n            Visits a <see cref=\"T:YamlDotNet.RepresentationModel.YamlScalarNode\"/>.\n            </summary>\n            <param name=\"scalar\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlScalarNode\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.IYamlVisitor.Visit(YamlDotNet.RepresentationModel.YamlSequenceNode)\">\n            <summary>\n            Visits a <see cref=\"T:YamlDotNet.RepresentationModel.YamlSequenceNode\"/>.\n            </summary>\n            <param name=\"sequence\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlSequenceNode\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.IYamlVisitor.Visit(YamlDotNet.RepresentationModel.YamlMappingNode)\">\n            <summary>\n            Visits a <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/>.\n            </summary>\n            <param name=\"mapping\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"T:YamlDotNet.RepresentationModel.YamlAliasNode\">\n            <summary>\n            Represents an alias node in the YAML document.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlAliasNode.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlAliasNode\"/> class.\n            </summary>\n            <param name=\"anchor\">The anchor.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlAliasNode.ResolveAliases(YamlDotNet.RepresentationModel.DocumentLoadingState)\">\n            <summary>\n            Resolves the aliases that could not be resolved when the node was created.\n            </summary>\n            <param name=\"state\">The state of the document.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlAliasNode.Emit(YamlDotNet.Core.IEmitter,YamlDotNet.RepresentationModel.EmitterState)\">\n            <summary>\n            Saves the current node to the specified emitter.\n            </summary>\n            <param name=\"emitter\">The emitter where the node is to be saved.</param>\n            <param name=\"state\">The state.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlAliasNode.Accept(YamlDotNet.RepresentationModel.IYamlVisitor)\">\n            <summary>\n            Accepts the specified visitor by calling the appropriate Visit method on it.\n            </summary>\n            <param name=\"visitor\">\n            A <see cref=\"T:YamlDotNet.RepresentationModel.IYamlVisitor\"/>.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlAliasNode.Equals(System.Object)\">\n            <summary />\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlAliasNode.GetHashCode\">\n            <summary>\n            Serves as a hash function for a particular type.\n            </summary>\n            <returns>\n            A hash code for the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlAliasNode.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents this instance.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents this instance.\n            </returns>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlAliasNode.AllNodes\">\n            <summary>\n            Gets all nodes from the document, starting on the current node.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.RepresentationModel.YamlDocument\">\n            <summary>\n            Represents an YAML document.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlDocument.RootNode\">\n            <summary>\n            Gets or sets the root node.\n            </summary>\n            <value>The root node.</value>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlDocument.#ctor(YamlDotNet.RepresentationModel.YamlNode)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlDocument\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlDocument.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlDocument\"/> class with a single scalar node.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlDocument.#ctor(YamlDotNet.Core.EventReader)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlDocument\"/> class.\n            </summary>\n            <param name=\"events\">The events.</param>\n        </member>\n        <member name=\"T:YamlDotNet.RepresentationModel.YamlDocument.AnchorAssigningVisitor\">\n            <summary>\n            Visitor that assigns anchors to nodes that are referenced more than once but have no anchor.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlDocument.Accept(YamlDotNet.RepresentationModel.IYamlVisitor)\">\n            <summary>\n            Accepts the specified visitor by calling the appropriate Visit method on it.\n            </summary>\n            <param name=\"visitor\">\n            A <see cref=\"T:YamlDotNet.RepresentationModel.IYamlVisitor\"/>.\n            </param>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlDocument.AllNodes\">\n            <summary>\n            Gets all nodes from the document.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\">\n            <summary>\n            Represents a mapping node in the YAML document.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlMappingNode.Children\">\n            <summary>\n            Gets the children of the current node.\n            </summary>\n            <value>The children.</value>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlMappingNode.Style\">\n            <summary>\n            Gets or sets the style of the node.\n            </summary>\n            <value>The style.</value>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.#ctor(YamlDotNet.Core.EventReader,YamlDotNet.RepresentationModel.DocumentLoadingState)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/> class.\n            </summary>\n            <param name=\"events\">The events.</param>\n            <param name=\"state\">The state.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.#ctor(System.Collections.Generic.KeyValuePair{YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode}[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.#ctor(System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode}})\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.#ctor(YamlDotNet.RepresentationModel.YamlNode[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/> class.\n            </summary>\n            <param name=\"children\">A sequence of <see cref=\"T:YamlDotNet.RepresentationModel.YamlNode\"/> where even elements are keys and odd elements are values.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.#ctor(System.Collections.Generic.IEnumerable{YamlDotNet.RepresentationModel.YamlNode})\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/> class.\n            </summary>\n            <param name=\"children\">A sequence of <see cref=\"T:YamlDotNet.RepresentationModel.YamlNode\"/> where even elements are keys and odd elements are values.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.Add(YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode)\">\n            <summary>\n            Adds the specified mapping to the <see cref=\"P:YamlDotNet.RepresentationModel.YamlMappingNode.Children\"/> collection.\n            </summary>\n            <param name=\"key\">The key node.</param>\n            <param name=\"value\">The value node.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.Add(System.String,YamlDotNet.RepresentationModel.YamlNode)\">\n            <summary>\n            Adds the specified mapping to the <see cref=\"P:YamlDotNet.RepresentationModel.YamlMappingNode.Children\"/> collection.\n            </summary>\n            <param name=\"key\">The key node.</param>\n            <param name=\"value\">The value node.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.Add(YamlDotNet.RepresentationModel.YamlNode,System.String)\">\n            <summary>\n            Adds the specified mapping to the <see cref=\"P:YamlDotNet.RepresentationModel.YamlMappingNode.Children\"/> collection.\n            </summary>\n            <param name=\"key\">The key node.</param>\n            <param name=\"value\">The value node.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.Add(System.String,System.String)\">\n            <summary>\n            Adds the specified mapping to the <see cref=\"P:YamlDotNet.RepresentationModel.YamlMappingNode.Children\"/> collection.\n            </summary>\n            <param name=\"key\">The key node.</param>\n            <param name=\"value\">The value node.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.ResolveAliases(YamlDotNet.RepresentationModel.DocumentLoadingState)\">\n            <summary>\n            Resolves the aliases that could not be resolved when the node was created.\n            </summary>\n            <param name=\"state\">The state of the document.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.Emit(YamlDotNet.Core.IEmitter,YamlDotNet.RepresentationModel.EmitterState)\">\n            <summary>\n            Saves the current node to the specified emitter.\n            </summary>\n            <param name=\"emitter\">The emitter where the node is to be saved.</param>\n            <param name=\"state\">The state.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.Accept(YamlDotNet.RepresentationModel.IYamlVisitor)\">\n            <summary>\n            Accepts the specified visitor by calling the appropriate Visit method on it.\n            </summary>\n            <param name=\"visitor\">\n            A <see cref=\"T:YamlDotNet.RepresentationModel.IYamlVisitor\"/>.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.Equals(System.Object)\">\n            <summary />\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.GetHashCode\">\n            <summary>\n            Serves as a hash function for a particular type.\n            </summary>\n            <returns>\n            A hash code for the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlMappingNode.AllNodes\">\n            <summary>\n            Gets all nodes from the document, starting on the current node.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents this instance.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents this instance.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlMappingNode.GetEnumerator\">\n            <summary />\n        </member>\n        <member name=\"T:YamlDotNet.RepresentationModel.YamlNode\">\n            <summary>\n            Represents a single node in the YAML document.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlNode.Anchor\">\n            <summary>\n            Gets or sets the anchor of the node.\n            </summary>\n            <value>The anchor.</value>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlNode.Tag\">\n            <summary>\n            Gets or sets the tag of the node.\n            </summary>\n            <value>The tag.</value>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlNode.Start\">\n            <summary>\n            Gets the position in the input stream where the event that originated the node starts.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlNode.End\">\n            <summary>\n            Gets the position in the input stream where the event that originated the node ends.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlNode.Load(YamlDotNet.Core.Events.NodeEvent,YamlDotNet.RepresentationModel.DocumentLoadingState)\">\n            <summary>\n            Loads the specified event.\n            </summary>\n            <param name=\"yamlEvent\">The event.</param>\n            <param name=\"state\">The state of the document.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlNode.ParseNode(YamlDotNet.Core.EventReader,YamlDotNet.RepresentationModel.DocumentLoadingState)\">\n            <summary>\n            Parses the node represented by the next event in <paramref name=\"events\" />.\n            </summary>\n            <param name=\"events\">The events.</param>\n            <param name=\"state\">The state.</param>\n            <returns>Returns the node that has been parsed.</returns>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlNode.ResolveAliases(YamlDotNet.RepresentationModel.DocumentLoadingState)\">\n            <summary>\n            Resolves the aliases that could not be resolved when the node was created.\n            </summary>\n            <param name=\"state\">The state of the document.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlNode.Save(YamlDotNet.Core.IEmitter,YamlDotNet.RepresentationModel.EmitterState)\">\n            <summary>\n            Saves the current node to the specified emitter.\n            </summary>\n            <param name=\"emitter\">The emitter where the node is to be saved.</param>\n            <param name=\"state\">The state.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlNode.Emit(YamlDotNet.Core.IEmitter,YamlDotNet.RepresentationModel.EmitterState)\">\n            <summary>\n            Saves the current node to the specified emitter.\n            </summary>\n            <param name=\"emitter\">The emitter where the node is to be saved.</param>\n            <param name=\"state\">The state.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlNode.Accept(YamlDotNet.RepresentationModel.IYamlVisitor)\">\n            <summary>\n            Accepts the specified visitor by calling the appropriate Visit method on it.\n            </summary>\n            <param name=\"visitor\">\n            A <see cref=\"T:YamlDotNet.RepresentationModel.IYamlVisitor\"/>.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlNode.Equals(YamlDotNet.RepresentationModel.YamlNode)\">\n            <summary>\n            Provides a basic implementation of Object.Equals \n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlNode.SafeEquals(System.Object,System.Object)\">\n            <summary>\n            Gets a value indicating whether two objects are equal.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlNode.GetHashCode\">\n            <summary>\n            Serves as a hash function for a particular type.\n            </summary>\n            <returns>\n            A hash code for the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlNode.GetHashCode(System.Object)\">\n            <summary>\n            Gets the hash code of the specified object, or zero if the object is null. \n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlNode.CombineHashCodes(System.Int32,System.Int32)\">\n            <summary>\n            Combines two hash codes into one. \n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlNode.AllNodes\">\n            <summary>\n            Gets all nodes from the document, starting on the current node.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.RepresentationModel.YamlNodeIdentityEqualityComparer\">\n            <summary>\n            Comparer that is based on identity comparisons.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlNodeIdentityEqualityComparer.Equals(YamlDotNet.RepresentationModel.YamlNode,YamlDotNet.RepresentationModel.YamlNode)\">\n            <summary />\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlNodeIdentityEqualityComparer.GetHashCode(YamlDotNet.RepresentationModel.YamlNode)\">\n            <summary />\n        </member>\n        <member name=\"T:YamlDotNet.RepresentationModel.YamlScalarNode\">\n            <summary>\n            Represents a scalar node in the YAML document.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlScalarNode.Value\">\n            <summary>\n            Gets or sets the value of the node.\n            </summary>\n            <value>The value.</value>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlScalarNode.Style\">\n            <summary>\n            Gets or sets the style of the node.\n            </summary>\n            <value>The style.</value>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlScalarNode.#ctor(YamlDotNet.Core.EventReader,YamlDotNet.RepresentationModel.DocumentLoadingState)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlScalarNode\"/> class.\n            </summary>\n            <param name=\"events\">The events.</param>\n            <param name=\"state\">The state.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlScalarNode.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlScalarNode\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlScalarNode.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlScalarNode\"/> class.\n            </summary>\n            <param name=\"value\">The value.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlScalarNode.ResolveAliases(YamlDotNet.RepresentationModel.DocumentLoadingState)\">\n            <summary>\n            Resolves the aliases that could not be resolved when the node was created.\n            </summary>\n            <param name=\"state\">The state of the document.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlScalarNode.Emit(YamlDotNet.Core.IEmitter,YamlDotNet.RepresentationModel.EmitterState)\">\n            <summary>\n            Saves the current node to the specified emitter.\n            </summary>\n            <param name=\"emitter\">The emitter where the node is to be saved.</param>\n            <param name=\"state\">The state.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlScalarNode.Accept(YamlDotNet.RepresentationModel.IYamlVisitor)\">\n            <summary>\n            Accepts the specified visitor by calling the appropriate Visit method on it.\n            </summary>\n            <param name=\"visitor\">\n            A <see cref=\"T:YamlDotNet.RepresentationModel.IYamlVisitor\"/>.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlScalarNode.Equals(System.Object)\">\n            <summary />\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlScalarNode.GetHashCode\">\n            <summary>\n            Serves as a hash function for a particular type.\n            </summary>\n            <returns>\n            A hash code for the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlScalarNode.op_Implicit(System.String)~YamlDotNet.RepresentationModel.YamlScalarNode\">\n            <summary>\n            Performs an implicit conversion from <see cref=\"T:System.String\"/> to <see cref=\"T:YamlDotNet.RepresentationModel.YamlScalarNode\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlScalarNode.op_Explicit(YamlDotNet.RepresentationModel.YamlScalarNode)~System.String\">\n            <summary>\n            Performs an explicit conversion from <see cref=\"T:YamlDotNet.RepresentationModel.YamlScalarNode\"/> to <see cref=\"T:System.String\"/>.\n            </summary>\n            <param name=\"value\">The value.</param>\n            <returns>The result of the conversion.</returns>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlScalarNode.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents this instance.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents this instance.\n            </returns>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlScalarNode.AllNodes\">\n            <summary>\n            Gets all nodes from the document, starting on the current node.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.RepresentationModel.YamlSequenceNode\">\n            <summary>\n            Represents a sequence node in the YAML document.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlSequenceNode.Children\">\n            <summary>\n            Gets the collection of child nodes.\n            </summary>\n            <value>The children.</value>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlSequenceNode.Style\">\n            <summary>\n            Gets or sets the style of the node.\n            </summary>\n            <value>The style.</value>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlSequenceNode.#ctor(YamlDotNet.Core.EventReader,YamlDotNet.RepresentationModel.DocumentLoadingState)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlSequenceNode\"/> class.\n            </summary>\n            <param name=\"events\">The events.</param>\n            <param name=\"state\">The state.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlSequenceNode.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlSequenceNode\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlSequenceNode.#ctor(YamlDotNet.RepresentationModel.YamlNode[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlSequenceNode\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlSequenceNode.#ctor(System.Collections.Generic.IEnumerable{YamlDotNet.RepresentationModel.YamlNode})\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlSequenceNode\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlSequenceNode.Add(YamlDotNet.RepresentationModel.YamlNode)\">\n            <summary>\n            Adds the specified child to the <see cref=\"P:YamlDotNet.RepresentationModel.YamlSequenceNode.Children\"/> collection.\n            </summary>\n            <param name=\"child\">The child.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlSequenceNode.Add(System.String)\">\n            <summary>\n            Adds a scalar node to the <see cref=\"P:YamlDotNet.RepresentationModel.YamlSequenceNode.Children\"/> collection.\n            </summary>\n            <param name=\"child\">The child.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlSequenceNode.ResolveAliases(YamlDotNet.RepresentationModel.DocumentLoadingState)\">\n            <summary>\n            Resolves the aliases that could not be resolved when the node was created.\n            </summary>\n            <param name=\"state\">The state of the document.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlSequenceNode.Emit(YamlDotNet.Core.IEmitter,YamlDotNet.RepresentationModel.EmitterState)\">\n            <summary>\n            Saves the current node to the specified emitter.\n            </summary>\n            <param name=\"emitter\">The emitter where the node is to be saved.</param>\n            <param name=\"state\">The state.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlSequenceNode.Accept(YamlDotNet.RepresentationModel.IYamlVisitor)\">\n            <summary>\n            Accepts the specified visitor by calling the appropriate Visit method on it.\n            </summary>\n            <param name=\"visitor\">\n            A <see cref=\"T:YamlDotNet.RepresentationModel.IYamlVisitor\"/>.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlSequenceNode.Equals(System.Object)\">\n            <summary />\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlSequenceNode.GetHashCode\">\n            <summary>\n            Serves as a hash function for a particular type.\n            </summary>\n            <returns>\n            A hash code for the current <see cref=\"T:System.Object\"/>.\n            </returns>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlSequenceNode.AllNodes\">\n            <summary>\n            Gets all nodes from the document, starting on the current node.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlSequenceNode.ToString\">\n            <summary>\n            Returns a <see cref=\"T:System.String\"/> that represents this instance.\n            </summary>\n            <returns>\n            A <see cref=\"T:System.String\"/> that represents this instance.\n            </returns>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlSequenceNode.GetEnumerator\">\n            <summary />\n        </member>\n        <member name=\"T:YamlDotNet.RepresentationModel.YamlStream\">\n            <summary>\n            Represents an YAML stream.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.RepresentationModel.YamlStream.Documents\">\n            <summary>\n            Gets the documents inside the stream.\n            </summary>\n            <value>The documents.</value>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlStream.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlStream\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlStream.#ctor(YamlDotNet.RepresentationModel.YamlDocument[])\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlStream\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlStream.#ctor(System.Collections.Generic.IEnumerable{YamlDotNet.RepresentationModel.YamlDocument})\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.RepresentationModel.YamlStream\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlStream.Add(YamlDotNet.RepresentationModel.YamlDocument)\">\n            <summary>\n            Adds the specified document to the <see cref=\"P:YamlDotNet.RepresentationModel.YamlStream.Documents\"/> collection.\n            </summary>\n            <param name=\"document\">The document.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlStream.Load(System.IO.TextReader)\">\n            <summary>\n            Loads the stream from the specified input.\n            </summary>\n            <param name=\"input\">The input.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlStream.Load(YamlDotNet.Core.EventReader)\">\n            <summary>\n            Loads the stream from the specified <see cref=\"T:YamlDotNet.Core.EventReader\"/>.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlStream.Save(System.IO.TextWriter)\">\n            <summary>\n            Saves the stream to the specified output.\n            </summary>\n            <param name=\"output\">The output.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlStream.Save(System.IO.TextWriter,System.Boolean)\">\n            <summary>\n            Saves the stream to the specified output.\n            </summary>\n            <param name=\"output\">The output.</param>\n            <param name=\"assignAnchors\">Indicates whether or not to assign node anchors.</param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlStream.Accept(YamlDotNet.RepresentationModel.IYamlVisitor)\">\n            <summary>\n            Accepts the specified visitor by calling the appropriate Visit method on it.\n            </summary>\n            <param name=\"visitor\">\n            A <see cref=\"T:YamlDotNet.RepresentationModel.IYamlVisitor\"/>.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlStream.GetEnumerator\">\n            <summary />\n        </member>\n        <member name=\"T:YamlDotNet.RepresentationModel.YamlVisitor\">\n            <summary>\n            Abstract implementation of <see cref=\"T:YamlDotNet.RepresentationModel.IYamlVisitor\"/> that knows how to walk a complete Yaml object model.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.Visit(YamlDotNet.RepresentationModel.YamlStream)\">\n            <summary>\n            Called when this object is visiting a <see cref=\"T:YamlDotNet.RepresentationModel.YamlStream\"/>.\n            </summary>\n            <param name=\"stream\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlStream\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.Visited(YamlDotNet.RepresentationModel.YamlStream)\">\n            <summary>\n            Called after this object finishes visiting a <see cref=\"T:YamlDotNet.RepresentationModel.YamlStream\"/>.\n            </summary>\n            <param name=\"stream\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlStream\"/> that has been visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.Visit(YamlDotNet.RepresentationModel.YamlDocument)\">\n            <summary>\n            Called when this object is visiting a <see cref=\"T:YamlDotNet.RepresentationModel.YamlDocument\"/>.\n            </summary>\n            <param name=\"document\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlDocument\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.Visited(YamlDotNet.RepresentationModel.YamlDocument)\">\n            <summary>\n            Called after this object finishes visiting a <see cref=\"T:YamlDotNet.RepresentationModel.YamlDocument\"/>.\n            </summary>\n            <param name=\"document\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlDocument\"/> that has been visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.Visit(YamlDotNet.RepresentationModel.YamlScalarNode)\">\n            <summary>\n            Called when this object is visiting a <see cref=\"T:YamlDotNet.RepresentationModel.YamlScalarNode\"/>.\n            </summary>\n            <param name=\"scalar\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlScalarNode\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.Visited(YamlDotNet.RepresentationModel.YamlScalarNode)\">\n            <summary>\n            Called after this object finishes visiting a <see cref=\"T:YamlDotNet.RepresentationModel.YamlScalarNode\"/>.\n            </summary>\n            <param name=\"scalar\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlScalarNode\"/> that has been visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.Visit(YamlDotNet.RepresentationModel.YamlSequenceNode)\">\n            <summary>\n            Called when this object is visiting a <see cref=\"T:YamlDotNet.RepresentationModel.YamlSequenceNode\"/>.\n            </summary>\n            <param name=\"sequence\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlSequenceNode\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.Visited(YamlDotNet.RepresentationModel.YamlSequenceNode)\">\n            <summary>\n            Called after this object finishes visiting a <see cref=\"T:YamlDotNet.RepresentationModel.YamlSequenceNode\"/>.\n            </summary>\n            <param name=\"sequence\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlSequenceNode\"/> that has been visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.Visit(YamlDotNet.RepresentationModel.YamlMappingNode)\">\n            <summary>\n            Called when this object is visiting a <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/>.\n            </summary>\n            <param name=\"mapping\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.Visited(YamlDotNet.RepresentationModel.YamlMappingNode)\">\n            <summary>\n            Called after this object finishes visiting a <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/>.\n            </summary>\n            <param name=\"mapping\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/> that has been visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.VisitChildren(YamlDotNet.RepresentationModel.YamlStream)\">\n            <summary>\n            Visits every child of a <see cref=\"T:YamlDotNet.RepresentationModel.YamlStream\"/>.\n            </summary>\n            <param name=\"stream\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlStream\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.VisitChildren(YamlDotNet.RepresentationModel.YamlDocument)\">\n            <summary>\n            Visits every child of a <see cref=\"T:YamlDotNet.RepresentationModel.YamlDocument\"/>.\n            </summary>\n            <param name=\"document\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlDocument\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.VisitChildren(YamlDotNet.RepresentationModel.YamlSequenceNode)\">\n            <summary>\n            Visits every child of a <see cref=\"T:YamlDotNet.RepresentationModel.YamlSequenceNode\"/>.\n            </summary>\n            <param name=\"sequence\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlSequenceNode\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"M:YamlDotNet.RepresentationModel.YamlVisitor.VisitChildren(YamlDotNet.RepresentationModel.YamlMappingNode)\">\n            <summary>\n            Visits every child of a <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/>.\n            </summary>\n            <param name=\"mapping\">\n            The <see cref=\"T:YamlDotNet.RepresentationModel.YamlMappingNode\"/> that is being visited.\n            </param>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.Converters.GuidConverter\">\n            <summary>\n            Converter for System.Guid.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.Deserializer\">\n            <summary>\n            A façade for the YAML library with the standard configuration.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Deserializer.Deserialize(YamlDotNet.Core.EventReader,System.Type)\">\n            <summary>\n            Deserializes an object of the specified type.\n            </summary>\n            <param name=\"reader\">The <see cref=\"T:YamlDotNet.Core.EventReader\" /> where to deserialize the object.</param>\n            <param name=\"type\">The static type of the object to deserialize.</param>\n            <returns>Returns the deserialized object.</returns>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.EventEmitters.ChainedEventEmitter\">\n            <summary>\n            Provided the base implementation for an IEventEmitter that is a\n            decorator for another IEventEmitter.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.INamingConvention\">\n            <summary>\n            Translates property names according to a specific convention.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.INodeTypeResolver.Resolve(YamlDotNet.Core.Events.NodeEvent,System.Type@)\">\n            <summary>\n            Determines the type of the specified node.\n            </summary>\n            <param name=\"nodeEvent\">The node to be deserialized.</param>\n            <param name=\"currentType\">The type that has been determined so far.</param>\n            <returns>\n            true if <paramref name=\"currentType\"/> has been resolved completely;\n            false if the next type <see cref=\"T:YamlDotNet.Serialization.INodeTypeResolver\"/> should be invoked.\n            </returns>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.IObjectDescriptor\">\n            <summary>\n            Represents an object along with its type.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Serialization.IObjectDescriptor.Value\">\n            <summary>\n            A reference to the object.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Serialization.IObjectDescriptor.Type\">\n            <summary>\n            The type that should be used when to interpret the <see cref=\"P:YamlDotNet.Serialization.IObjectDescriptor.Value\" />.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Serialization.IObjectDescriptor.StaticType\">\n            <summary>\n            The type of <see cref=\"P:YamlDotNet.Serialization.IObjectDescriptor.Value\" /> as determined by its container (e.g. a property).\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Serialization.IObjectDescriptor.ScalarStyle\">\n            <summary>\n            The style to be used for scalars.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.IObjectFactory\">\n            <summary>\n            Creates instances of types.\n            </summary>\n            <remarks>\n            This interface allows to provide a custom logic for creating instances during deserialization.\n            </remarks>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IObjectFactory.Create(System.Type)\">\n            <summary>\n            Creates an instance of the specified type.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.IObjectGraphTraversalStrategy\">\n            <summary>\n            Defines a strategy that walks through an object graph.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IObjectGraphTraversalStrategy.Traverse(YamlDotNet.Serialization.IObjectDescriptor,YamlDotNet.Serialization.IObjectGraphVisitor)\">\n            <summary>\n            Traverses the specified object graph.\n            </summary>\n            <param name=\"graph\">The graph.</param>\n            <param name=\"visitor\">An <see cref=\"T:YamlDotNet.Serialization.IObjectGraphVisitor\"/> that is to be notified during the traversal.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.IObjectGraphVisitor\">\n            <summary>\n            Defined the interface of a type that can be notified during an object graph traversal.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IObjectGraphVisitor.Enter(YamlDotNet.Serialization.IObjectDescriptor)\">\n            <summary>\n            Indicates whether the specified value should be entered. This allows the visitor to\n            override the handling of a particular object or type.\n            </summary>\n            <param name=\"value\">The value that is about to be entered.</param>\n            <returns>If the value is to be entered, returns true; otherwise returns false;</returns>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IObjectGraphVisitor.EnterMapping(YamlDotNet.Serialization.IObjectDescriptor,YamlDotNet.Serialization.IObjectDescriptor)\">\n            <summary>\n            Indicates whether the specified mapping should be entered. This allows the visitor to\n            override the handling of a particular pair.\n            </summary>\n            <param name=\"key\">The key of the mapping that is about to be entered.</param>\n            <param name=\"value\">The value of the mapping that is about to be entered.</param>\n            <returns>If the mapping is to be entered, returns true; otherwise returns false;</returns>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IObjectGraphVisitor.EnterMapping(YamlDotNet.Serialization.IPropertyDescriptor,YamlDotNet.Serialization.IObjectDescriptor)\">\n            <summary>\n            Indicates whether the specified mapping should be entered. This allows the visitor to\n            override the handling of a particular pair. This overload should be invoked when the\n            mapping is produced by an object's property.\n            </summary>\n            <param name=\"key\">The <see cref=\"T:YamlDotNet.Serialization.IPropertyDescriptor\"/> that provided access to <paramref name=\"value\"/>.</param>\n            <param name=\"value\">The value of the mapping that is about to be entered.</param>\n            <returns>If the mapping is to be entered, returns true; otherwise returns false;</returns>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IObjectGraphVisitor.VisitScalar(YamlDotNet.Serialization.IObjectDescriptor)\">\n            <summary>\n            Notifies the visitor that a scalar value has been encountered.\n            </summary>\n            <param name=\"scalar\">The value of the scalar.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IObjectGraphVisitor.VisitMappingStart(YamlDotNet.Serialization.IObjectDescriptor,System.Type,System.Type)\">\n            <summary>\n            Notifies the visitor that the traversal of a mapping is about to begin.\n            </summary>\n            <param name=\"mapping\">The value that corresponds to the mapping.</param>\n            <param name=\"keyType\">The static type of the keys of the mapping.</param>\n            <param name=\"valueType\">The static type of the values of the mapping.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IObjectGraphVisitor.VisitMappingEnd(YamlDotNet.Serialization.IObjectDescriptor)\">\n            <summary>\n            Notifies the visitor that the traversal of a mapping has ended.\n            </summary>\n            <param name=\"mapping\">The value that corresponds to the mapping.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IObjectGraphVisitor.VisitSequenceStart(YamlDotNet.Serialization.IObjectDescriptor,System.Type)\">\n            <summary>\n            Notifies the visitor that the traversal of a sequence is about to begin.\n            </summary>\n            <param name=\"sequence\">The value that corresponds to the sequence.</param>\n            <param name=\"elementType\">The static type of the elements of the sequence.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IObjectGraphVisitor.VisitSequenceEnd(YamlDotNet.Serialization.IObjectDescriptor)\">\n            <summary>\n            Notifies the visitor that the traversal of a sequence has ended.\n            </summary>\n            <param name=\"sequence\">The value that corresponds to the sequence.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.ITypeInspector\">\n            <summary>\n            Provides access to the properties of a type.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.ITypeInspector.GetProperties(System.Type,System.Object)\">\n            <summary>\n            Gets all properties of the specified type.\n            </summary>\n            <param name=\"type\">The type whose properties are to be enumerated.</param>\n            <param name=\"container\">The actual object of type <paramref name=\"type\"/> whose properties are to be enumerated. Can be null.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.ITypeInspector.GetProperty(System.Type,System.Object,System.String,System.Boolean)\">\n            <summary>\n            Gets the property of the type with the specified name.\n            </summary>\n            <param name=\"type\">The type whose properties are to be searched.</param>\n            <param name=\"container\">The actual object of type <paramref name=\"type\"/> whose properties are to be searched. Can be null.</param>\n            <param name=\"name\">The name of the property.</param>\n            <param name=\"ignoreUnmatched\">\n            Determines if an exception or null should be returned if <paramref name=\"name\"/> can't be\n            found in <paramref name=\"type\"/>\n            </param>\n            <returns></returns>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.ITypeResolver\">\n            <summary>\n            Resolves the type of values.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.IYamlSerializable\">\n            <summary>\n            Allows an object to customize how it is serialized and deserialized.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IYamlSerializable.ReadYaml(YamlDotNet.Core.IParser)\">\n            <summary>\n            Reads this object's state from a YAML parser.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IYamlSerializable.WriteYaml(YamlDotNet.Core.IEmitter)\">\n            <summary>\n            Writes this object's state to a YAML emitter.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.IYamlTypeConverter\">\n            <summary>\n            Allows to customize how a type is serialized and deserialized.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IYamlTypeConverter.Accepts(System.Type)\">\n            <summary>\n            Gets a value indicating whether the current converter supports converting the specified type.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IYamlTypeConverter.ReadYaml(YamlDotNet.Core.IParser,System.Type)\">\n            <summary>\n            Reads an object's state from a YAML parser.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.IYamlTypeConverter.WriteYaml(YamlDotNet.Core.IEmitter,System.Object,System.Type)\">\n            <summary>\n            Writes the specified object's state to a YAML emitter.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.NamingConventions.CamelCaseNamingConvention\">\n            <summary>\n            Convert the string with underscores (this_is_a_test) or hyphens (this-is-a-test) to \n            camel case (thisIsATest). Camel case is the same as Pascal case, except the first letter\n            is lowercase.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.NamingConventions.HyphenatedNamingConvention\">\n            <summary>\n            Convert the string from camelcase (thisIsATest) to a hyphenated (this-is-a-test) string\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.NamingConventions.NullNamingConvention\">\n            <summary>\n            Performs no naming conversion.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.NamingConventions.PascalCaseNamingConvention\">\n            <summary>\n            Convert the string with underscores (this_is_a_test) or hyphens (this-is-a-test) to \n            pascal case (ThisIsATest). Pascal case is the same as camel case, except the first letter\n            is uppercase.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.NamingConventions.UnderscoredNamingConvention\">\n            <summary>\n            Convert the string from camelcase (thisIsATest) to a underscored (this_is_a_test) string\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.ObjectFactories.DefaultObjectFactory\">\n            <summary>\n            Creates objects using Activator.CreateInstance.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.ObjectFactories.LambdaObjectFactory\">\n            <summary>\n            Creates objects using a Func{Type,object}\"/>.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.ObjectGraphTraversalStrategies.FullObjectGraphTraversalStrategy\">\n            <summary>\n            An implementation of <see cref=\"T:YamlDotNet.Serialization.IObjectGraphTraversalStrategy\"/> that traverses\n            readable properties, collections and dictionaries.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.ObjectGraphTraversalStrategies.RoundtripObjectGraphTraversalStrategy\">\n            <summary>\n            An implementation of <see cref=\"T:YamlDotNet.Serialization.IObjectGraphTraversalStrategy\"/> that traverses\n            properties that are read/write, collections and dictionaries, while ensuring that\n            the graph can be regenerated from the resulting document.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.SerializationOptions\">\n            <summary>\n            Options that control the serialization process.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Serialization.SerializationOptions.None\">\n            <summary>\n            Serializes using the default options\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Serialization.SerializationOptions.Roundtrip\">\n            <summary>\n            Ensures that it will be possible to deserialize the serialized objects.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Serialization.SerializationOptions.DisableAliases\">\n            <summary>\n            If this flag is specified, if the same object appears more than once in the\n            serialization graph, it will be serialized each time instead of just once.\n            </summary>\n            <remarks>\n            If the serialization graph contains circular references and this flag is set,\n            a StackOverflowException will be thrown.\n            If this flag is not set, there is a performance penalty because the entire\n            object graph must be walked twice.\n            </remarks>\n        </member>\n        <member name=\"F:YamlDotNet.Serialization.SerializationOptions.EmitDefaults\">\n            <summary>\n            Forces every value to be serialized, even if it is the default value for that type.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Serialization.SerializationOptions.JsonCompatible\">\n            <summary>\n            Ensures that the result of the serialization is valid JSON.\n            </summary>\n        </member>\n        <member name=\"F:YamlDotNet.Serialization.SerializationOptions.DefaultToStaticType\">\n            <summary>\n            Use the static type of values instead of their actual type.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.Serializer\">\n            <summary>\n            Writes objects to YAML.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Serializer.#ctor(YamlDotNet.Serialization.SerializationOptions,YamlDotNet.Serialization.INamingConvention)\">\n            <summary>\n            \n            </summary>\n            <param name=\"options\">Options that control how the serialization is to be performed.</param>\n            <param name=\"namingConvention\">Naming strategy to use for serialized property names</param>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Serializer.RegisterTypeConverter(YamlDotNet.Serialization.IYamlTypeConverter)\">\n            <summary>\n            Registers a type converter to be used to serialize and deserialize specific types.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Serializer.Serialize(System.IO.TextWriter,System.Object)\">\n            <summary>\n            Serializes the specified object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:System.IO.TextWriter\" /> where to serialize the object.</param>\n            <param name=\"graph\">The object to serialize.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Serializer.Serialize(System.IO.TextWriter,System.Object,System.Type)\">\n            <summary>\n            Serializes the specified object.\n            </summary>\n            <param name=\"writer\">The <see cref=\"T:System.IO.TextWriter\" /> where to serialize the object.</param>\n            <param name=\"graph\">The object to serialize.</param>\n            <param name=\"type\">The static type of the object to serialize.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Serializer.Serialize(YamlDotNet.Core.IEmitter,System.Object)\">\n            <summary>\n            Serializes the specified object.\n            </summary>\n            <param name=\"emitter\">The <see cref=\"T:YamlDotNet.Core.IEmitter\" /> where to serialize the object.</param>\n            <param name=\"graph\">The object to serialize.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Serializer.Serialize(YamlDotNet.Core.IEmitter,System.Object,System.Type)\">\n            <summary>\n            Serializes the specified object.\n            </summary>\n            <param name=\"emitter\">The <see cref=\"T:YamlDotNet.Core.IEmitter\" /> where to serialize the object.</param>\n            <param name=\"graph\">The object to serialize.</param>\n            <param name=\"type\">The static type of the object to serialize.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.StreamFragment\">\n            <summary>\n            An object that contains part of a YAML stream.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Serialization.StreamFragment.Events\">\n            <summary>\n            Gets or sets the events.\n            </summary>\n            <value>The events.</value>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.StreamFragment.YamlDotNet#Serialization#IYamlSerializable#ReadYaml(YamlDotNet.Core.IParser)\">\n            <summary>\n            Reads this object's state from a YAML parser.\n            </summary>\n            <param name=\"parser\"></param>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.StreamFragment.YamlDotNet#Serialization#IYamlSerializable#WriteYaml(YamlDotNet.Core.IEmitter)\">\n            <summary>\n            Writes this object's state to a YAML emitter.\n            </summary>\n            <param name=\"emitter\"></param>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.TagMappings\">\n            <summary>\n            Contains mappings between tags and types.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.TagMappings.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Serialization.TagMappings\"/> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.TagMappings.#ctor(System.Collections.Generic.IDictionary{System.String,System.Type})\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Serialization.TagMappings\"/> class.\n            </summary>\n            <param name=\"mappings\">The mappings.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.TagMappings.Add(System.String,System.Type)\">\n            <summary>\n            Adds the specified tag.\n            </summary>\n            <param name=\"tag\">The tag.</param>\n            <param name=\"mapping\">The mapping.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.TagMappings.GetMapping(System.String)\">\n            <summary>\n            Gets the mapping.\n            </summary>\n            <param name=\"tag\">The tag.</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.TypeInspectors.CachedTypeInspector\">\n            <summary>\n            Wraps another <see cref=\"T:YamlDotNet.Serialization.ITypeInspector\"/> and applies caching.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.TypeInspectors.NamingConventionTypeInspector\">\n            <summary>\n            Wraps another <see cref=\"T:YamlDotNet.Serialization.ITypeInspector\"/> and applies a\n            naming convention to the names of the properties.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.TypeInspectors.ReadableAndWritablePropertiesTypeInspector\">\n            <summary>\n            Returns the properties of a type that are both readable and writable.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.TypeInspectors.ReadablePropertiesTypeInspector\">\n            <summary>\n            Returns the properties of a type that are readable.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.TypeResolvers.DynamicTypeResolver\">\n            <summary>\n            The type returned will be the actual type of the value, if available.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.TypeResolvers.StaticTypeResolver\">\n            <summary>\n            The type returned will always be the static type.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.Utilities.IPostDeserializationCallback\">\n            <summary>\n            Indicates that a class used as deserialization state\n            needs to be notified after deserialization.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Utilities.ObjectAnchorCollection.Add(System.String,System.Object)\">\n            <summary>\n            Adds the specified anchor.\n            </summary>\n            <param name=\"anchor\">The anchor.</param>\n            <param name=\"object\">The @object.</param>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Utilities.ObjectAnchorCollection.TryGetAnchor(System.Object,System.String@)\">\n            <summary>\n            Gets the anchor for the specified object.\n            </summary>\n            <param name=\"object\">The object.</param>\n            <param name=\"anchor\">The anchor.</param>\n            <returns></returns>\n        </member>\n        <member name=\"P:YamlDotNet.Serialization.Utilities.ObjectAnchorCollection.Item(System.String)\">\n            <summary>\n            Gets the <see cref=\"T:System.Object\"/> with the specified anchor.\n            </summary>\n            <value></value>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.Utilities.SerializerState\">\n            <summary>\n            A generic container that is preserved during the entire deserialization process.\n            Any disposable object added to this collecion will be disposed when this object is disposed.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Utilities.SerializerState.OnDeserialization\">\n            <summary>\n            Invokes <see cref=\"M:YamlDotNet.Serialization.Utilities.IPostDeserializationCallback.OnDeserialization\" /> on all\n            objects added to this collection that implement <see cref=\"T:YamlDotNet.Serialization.Utilities.IPostDeserializationCallback\" />.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.Utilities.StringExtensions\">\n            <summary>\n            Various string extension methods\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Utilities.StringExtensions.ToCamelCase(System.String)\">\n            <summary>\n            Convert the string with underscores (this_is_a_test) or hyphens (this-is-a-test) to \n            camel case (thisIsATest). Camel case is the same as Pascal case, except the first letter\n            is lowercase.\n            </summary>\n            <param name=\"str\">String to convert</param>\n            <returns>Converted string</returns>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Utilities.StringExtensions.ToPascalCase(System.String)\">\n            <summary>\n            Convert the string with underscores (this_is_a_test) or hyphens (this-is-a-test) to \n            pascal case (ThisIsATest). Pascal case is the same as camel case, except the first letter\n            is uppercase.\n            </summary>\n            <param name=\"str\">String to convert</param>\n            <returns>Converted string</returns>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Utilities.StringExtensions.FromCamelCase(System.String,System.String)\">\n            <summary>\n            Convert the string from camelcase (thisIsATest) to a hyphenated (this-is-a-test) or \n            underscored (this_is_a_test) string\n            </summary>\n            <param name=\"str\">String to convert</param>\n            <param name=\"separator\">Separator to use between segments</param>\n            <returns>Converted string</returns>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.Utilities.TypeConverter\">\n            <summary>\n            Performs type conversions using every standard provided by the .NET library.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Utilities.TypeConverter.ChangeType``1(System.Object)\">\n            <summary>\n            Converts the specified value.\n            </summary>\n            <typeparam name=\"T\">The type to which the value is to be converted.</typeparam>\n            <param name=\"value\">The value to convert.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Utilities.TypeConverter.ChangeType``1(System.Object,System.IFormatProvider)\">\n            <summary>\n            Converts the specified value.\n            </summary>\n            <typeparam name=\"T\">The type to which the value is to be converted.</typeparam>\n            <param name=\"value\">The value to convert.</param>\n            <param name=\"provider\">The provider.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Utilities.TypeConverter.ChangeType``1(System.Object,System.Globalization.CultureInfo)\">\n            <summary>\n            Converts the specified value.\n            </summary>\n            <typeparam name=\"T\">The type to which the value is to be converted.</typeparam>\n            <param name=\"value\">The value to convert.</param>\n            <param name=\"culture\">The culture.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Utilities.TypeConverter.ChangeType(System.Object,System.Type)\">\n            <summary>\n            Converts the specified value using the invariant culture.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <param name=\"destinationType\">The type to which the value is to be converted.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Utilities.TypeConverter.ChangeType(System.Object,System.Type,System.IFormatProvider)\">\n            <summary>\n            Converts the specified value.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <param name=\"destinationType\">The type to which the value is to be converted.</param>\n            <param name=\"provider\">The format provider.</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.Utilities.TypeConverter.ChangeType(System.Object,System.Type,System.Globalization.CultureInfo)\">\n            <summary>\n            Converts the specified value.\n            </summary>\n            <param name=\"value\">The value to convert.</param>\n            <param name=\"destinationType\">The type to which the value is to be converted.</param>\n            <param name=\"culture\">The culture.</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.YamlAliasAttribute\">\n            <summary>\n            Instructs the <see cref=\"T:YamlDotNet.Serialization.Deserializer\"/> to use a different field name for serialization.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Serialization.YamlAliasAttribute.Alias\">\n            <summary>\n            Gets or sets the alias name.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.YamlAliasAttribute.#ctor(System.String)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Serialization.YamlAliasAttribute\" /> class.\n            </summary>\n            <param name=\"alias\">The alias to use for this field.</param>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.YamlAttributesTypeInspector\">\n            <summary>\n            Applies the Yaml* attributes to another <see cref=\"T:YamlDotNet.Serialization.ITypeInspector\"/>.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.YamlIgnoreAttribute\">\n            <summary>\n            Instructs the YamlSerializer not to serialize the public field or public read/write property value.\n            </summary>\n        </member>\n        <member name=\"T:YamlDotNet.Serialization.YamlMemberAttribute\">\n            <summary>\n            Provides special Yaml serialization instructions.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Serialization.YamlMemberAttribute.SerializeAs\">\n            <summary>\n            Specifies that this property should be serialized as the given type, rather than using the actual runtime value's type.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Serialization.YamlMemberAttribute.Order\">\n            <summary>\n            Specifies the order priority of this property.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Serialization.YamlMemberAttribute.Alias\">\n            <summary>\n            Instructs the <see cref=\"T:YamlDotNet.Serialization.Deserializer\"/> to use a different field name for serialization.\n            </summary>\n        </member>\n        <member name=\"P:YamlDotNet.Serialization.YamlMemberAttribute.ScalarStyle\">\n            <summary>\n            Specifies the scalar style of the property when serialized. This will only affect the serialization of scalar properties.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.YamlMemberAttribute.#ctor\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Serialization.YamlMemberAttribute\" /> class.\n            </summary>\n        </member>\n        <member name=\"M:YamlDotNet.Serialization.YamlMemberAttribute.#ctor(System.Type)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:YamlDotNet.Serialization.YamlMemberAttribute\" /> class.\n            </summary>\n            <param name=\"serializeAs\">Specifies that this property should be serialized as the given type, rather than using the actual runtime value's type.</param>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "tools/EVESDEToSQL/license.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Jimi C / \"Desmont McCallock\"\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "tools/InstallBuilder/EVEMonInstallerScript.nsi",
    "content": "#\n#  This is an NSIS Installer build script\n#  for NSIS 2.46 with the UAC plugin installed.\n#  Script is compatible with UAC v0.2.x.\n#  (UAC.dll must be copied to NSIS\\Plugins)\n#\n\nSetCompressor /solid lzma\n\nRequestExecutionLevel admin\n\n!include \"UAC.nsh\"\n!include \"Library.nsh\"\n!include \"FileFunc.nsh\"\n!include \"MUI.nsh\"\n!include \"NETFrameworkCheck.nsh\"\n\nName \"EVEMon\"\nOutFile \"${OUTDIR}\\EVEMon-install-${VERSION}.exe\"\nInstallDir \"$PROGRAMFILES\\EVEMon\\\"\nInstallDirRegKey HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\EVEMon\" \"UninstallString\"\n\nVIAddVersionKey \"ProductName\" \"${PRODUCTNAME}\"\nVIAddVersionKey \"CompanyName\" \"${COMPANYNAME}\"\nVIAddVersionKey \"LegalCopyright\" \"${COPYRIGHT}\"\nVIAddVersionKey \"FileDescription\" \"${DESCRIPTION}\"\nVIAddVersionKey \"ProductVersion\" \"${VERSION}\"\nVIAddVersionKey \"FileVersion\" \"${VERSION}\"\nVIProductVersion \"${FULLVERSION}\"\n\nVar STARTMENU_FOLDER\nVar MUI_TEMP\n\n!define MUI_ABORTWARNING\n!define MUI_ICON \"${RESOURCESDIR}\\Icons\\EVEMon.ico\"\n!define MUI_UNICON \"${RESOURCESDIR}\\Icons\\EVEMon.ico\"\n\n!insertmacro MUI_PAGE_WELCOME\n!insertmacro MUI_PAGE_LICENSE \"${RESOURCESDIR}\\License\\gpl.txt\"\n!insertmacro MUI_PAGE_DIRECTORY\n\n# Start menu folder page configuration\n!define MUI_STARTMENUPAGE_REGISTRY_ROOT \"HKLM\"\n!define MUI_STARTMENUPAGE_REGISTRY_KEY \"Software\\EVEMon\"\n!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME \"Start Menu Folder\"\n!insertmacro MUI_PAGE_STARTMENU \"EVEMon\" $STARTMENU_FOLDER\n#-------------------------------------\n\n!insertmacro MUI_PAGE_INSTFILES\n# Finish page configuration\n!define MUI_FINISHPAGE_RUN $INSTDIR\\EVEMon.exe\n!define MUI_FINISHPAGE_RUN_TEXT \"Run EVEMon Now\"\n!insertmacro MUI_PAGE_FINISH\n#-------------------------------------\n\n!insertmacro MUI_UNPAGE_WELCOME\n!insertmacro MUI_UNPAGE_CONFIRM\n!insertmacro MUI_UNPAGE_INSTFILES\n!insertmacro MUI_UNPAGE_FINISH\n!insertmacro MUI_LANGUAGE \"English\"\n\nFunction .onInit\n\t!insertmacro UAC_RunElevated \n\n\tStrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user?\n\tStrCmp 0 $0 0 UAC_Err ; Error?\n\tStrCmp 1 $1 0 UAC_Success ; Are we the real deal or just the wrapper?\n\tQuit\n\t\n\tUAC_Err:\n\tMessageBox mb_iconstop \"Unable to install EVEMon without Administrator permissions. (error $0)\"\n\tAbort\n\t\n\tUAC_ElevationAborted:\n\t# elevation was aborted, we still run as normal\n\t\n\tUAC_Success:\n\tCall EnsureNotRunning\n\t\n\t# fix it so it only computes the space needed for EVEMon itself if .net is not installed\n\tSectionSetSize 0 0\n\tCall GetDotNETVersion\n\tPop $0\n\tStrCmp $0 \"\" 0 .NetIsInstalled\n\tSectionSetSize 0 66095 ; The size of .NET v4.6.1 in KiB\n\n\t.NetIsInstalled:\n\tStrCmp \"$INSTDIR\" \"$PROGRAMFILES\\EVEMon\\\" checkForExeInDir\n\tStrCmp \"$INSTDIR\" \"$PROGRAMFILES\\EVEMon\" checkForExeInDir\n\tGoto done\n\n\tcheckForExeInDir:\n\tIfFileExists \"$INSTDIR\\EVEMon.exe\" 0 done\n\n    MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \\\n    \"Setup detected that another version of EVEMon is already installed.$\\n\\\n\tNote that settings must be reset if upgrading from any EVEMon version before 4.0.$\\n$\\n\\\n\tClick `OK` to remove the existing version or `Cancel` to cancel this installation.\" \\\n    IDOK uninstall\n\tAbort\n\n\t;Remove previous installation\n\tuninstall:\t\n\tDelete \"$INSTDIR\\*.*\"\n\tRMDir /R \"$INSTDIR\\Microsoft.VC90.CRT\"\n\tRMDir /R \"$INSTDIR\\Resources\"\n\tRMDir $INSTDIR\n\t\n\t!insertmacro MUI_STARTMENU_GETFOLDER EVEMon $MUI_TEMP\n\tDelete \"$SMPROGRAMS\\$MUI_TEMP\\EVEMon.lnk\"\n\tDelete \"$SMPROGRAMS\\$MUI_TEMP\\Uninstall EVEMon.lnk\"\n\n\tStrCpy $MUI_TEMP \"$SMPROGRAMS\\$MUI_TEMP\"\n\n\tstartMenuDeleteLoop:\n    ClearErrors\n\tRMDir $MUI_TEMP\n\tGetFullPathName $MUI_TEMP \"$MUI_TEMP\\..\"\n\tIfErrors startMenuDeleteLoopDone\n\tStrCmp $MUI_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop\n\t\t \n\tstartMenuDeleteLoopDone:\n\tDeleteRegKey /ifempty HKLM \"Software\\EVEMon\"\n\tDeleteRegKey HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\EVEMon\"\n\t\n\tdone:\nFunctionEnd\n\nFunction EnsureNotRunning\n\tIfFileExists \"$INSTDIR\\EVEMon.exe\" 0 lbl_Done\n\tIntOp $1 0 + 0\n\t\n\tlbl_tryAgain:\n\tClearErrors\n\tFileOpen $0 \"$INSTDIR\\EVEMon.exe\" a\n\tIfErrors lbl_failedOpen\n\tFileClose $0\n\tGoto lbl_Done\n\n\tlbl_failedOpen:\n\tIfSilent lbl_waitForIt\n\tMessageBox MB_RETRYCANCEL|MB_DEFBUTTON1|MB_ICONEXCLAMATION \\\n\t\t\t\"Please close EVEMon before continuing.\" /SD IDCANCEL IDRETRY lbl_tryAgain IDCANCEL lbl_abort\n\tGoto lbl_tryAgain\n\n\tlbl_waitForIt:\n\tIntOp $1 $1 + 1\n\tIntCmp $1 60 0 0 lbl_failedToClose\n\tSleep 1000\n\tGoto lbl_tryAgain\n\n\tlbl_failedToClose:\n\tAbort \"EVEMon failed to close.\"\n\n\tlbl_abort:\n\tAbort \"Operation cancelled by user.\"\n \n\tlbl_Done:\nFunctionEnd\n\nFunction un.onInit\n\t!insertmacro UAC_RunElevated \n\n\tStrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user?\n\tStrCmp 0 $0 0 UAC_Err ; Error?\n\tStrCmp 1 $1 0 UAC_Success ; Are we the real deal or just the wrapper?\n\tQuit\n\t\n\tUAC_Err:\n\tMessageBox mb_iconstop \"Unable to uninstall EVEMon without Administrator permissions. (error $0)\"\n\tAbort\n\t\n\tUAC_ElevationAborted:\n\t# elevation was aborted, we still run as normal\n\tUAC_Success:\n\n\tCall un.EnsureNotRunning\nFunctionEnd\n\nFunction un.EnsureNotRunning\n\tIntOp $1 0 + 0\n\tlbl_tryAgain:\n\tClearErrors\n\tFileOpen $0 \"$INSTDIR\\EVEMon.exe\" a\n\tIfErrors lbl_failedOpen\n\tFileClose $0\n\tGoto lbl_Done\n\n\tlbl_failedOpen:\n\tIfSilent lbl_waitForIt\n\tMessageBox MB_RETRYCANCEL|MB_DEFBUTTON1|MB_ICONEXCLAMATION \\\n\t\t\t\"Please close EVEMon before continuing.\" /SD IDCANCEL IDRETRY lbl_tryAgain IDCANCEL lbl_abort\n\tGoto lbl_tryAgain\n\n\tlbl_waitForIt:\n\tIntOp $1 $1 + 1\n\tIntCmp $1 10 0 0 lbl_failedToClose\n\tSleep 500\n\tGoto lbl_tryAgain\n\n\tlbl_failedToClose:\n\tAbort \"EVEMon failed to close.\"\n\n\tlbl_abort:\n\tAbort \"Operation cancelled by user.\"\n \n\tlbl_Done:\nFunctionEnd\n\n ; StrStr\n ; input, top of stack = string to search for\n ;\t\t\t\ttop of stack-1 = string to search in\n ; output, top of stack (replaces with the portion of the string remaining)\n ; modifies no other variables.\n ;\n ; Usage:\n ;\t Push \"this is a long ass string\"\n ;\t Push \"ass\"\n ;\t Call StrStr\n ;\t Pop $R0\n ;\t($R0 at this point is \"ass string\")\n\n Function StrStr\n\t Exch $R1 ; st=haystack,old$R1, $R1=needle\n\t Exch\t\t; st=old$R1,haystack\n\t Exch $R2 ; st=old$R1,old$R2, $R2=haystack\n\t Push $R3\n\t Push $R4\n\t Push $R5\n\t StrLen $R3 $R1\n\t StrCpy $R4 0\n\t ; $R1=needle\n\t ; $R2=haystack\n\t ; $R3=len(needle)\n\t ; $R4=cnt\n\t ; $R5=tmp\n\t loop:\n\t\t StrCpy $R5 $R2 $R3 $R4\n\t\t StrCmp $R5 $R1 done\n\t\t StrCmp $R5 \"\" done\n\t\t IntOp $R4 $R4 + 1\n\t\t Goto loop\n done:\n\t StrCpy $R1 $R2 \"\" $R4\n\t Pop $R5\n\t Pop $R4\n\t Pop $R3\n\t Pop $R2\n\t Exch $R1\n FunctionEnd\n\nFunction .onInstSuccess\n\n\t; skip if not in silent mode\n\tIfSilent 0 lbl_skipRun\n\n\t; search for /AUTORUN on commandline and skip if not found\n\tPush $CMDLINE\n\tPush \"/AUTORUN\"\n\tCall StrStr\n\tPop $0\n\tStrCmp $0 \"\" lbl_skipRun\n\n\t; Autorun if in silent mode and /AUTORUN is specified\n\tExec \"$INSTDIR\\EVEMon.exe\"\n\n\tlbl_skipRun:\nFunctionEnd\n\nSection \"Install EVEMon\" \n\tClearErrors\n\tReadRegStr $0 HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{B3C090CF-5539-42EA-90EB-8648A79C7F8B}\" \\\n\t\t\t\t\"UninstallString\"\n\tIfErrors lbl_NoLegacyUninstall\n\tExecWait \"MsiExec.exe /quiet /x {B3C090CF-5539-42EA-90EB-8648A79C7F8B}\"\n\n\tlbl_noLegacyUninstall:\n\tSetOutPath \"$INSTDIR\"\n\tFile /r /x *vshost* /x *.config \"${SOURCEDIR}\\*.*\" \n\n\tWriteUninstaller \"$INSTDIR\\uninstall.exe\"\n\n\t!insertmacro MUI_STARTMENU_WRITE_BEGIN EVEMon\n\t SetShellVarContext current\n\t\t CreateDirectory \"$SMPROGRAMS\\$STARTMENU_FOLDER\"\n\t\t CreateShortCut \"$SMPROGRAMS\\$STARTMENU_FOLDER\\EVEMon.lnk\" \"$INSTDIR\\EVEMon.exe\"\n\t\t CreateShortCut \"$SMPROGRAMS\\$STARTMENU_FOLDER\\Uninstall EVEMon.lnk\" \"$INSTDIR\\uninstall.exe\"\n\t!insertmacro MUI_STARTMENU_WRITE_END\n\n\t# Add entry for Add/Remove Programs\n\tWriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\EVEMon\" \\\n\t\t\t\t \"DisplayName\" \"EVEMon\"\n\tWriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\EVEMon\" \\\n\t\t\t\t \"UninstallString\" \"$INSTDIR\\uninstall.exe\"\n\tWriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\EVEMon\" \\\n\t\t\t\t \"DisplayIcon\" \"$INSTDIR\\EVEMon.exe\"\n\tWriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\EVEMon\" \\\n\t\t\t\t \"Publisher\" \"EVEMon Development Team\"\n\tWriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\EVEMon\" \\\n\t\t\t\t \"URLUpdateInfo\" \"http://\"\n\tWriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\EVEMon\" \\\n\t\t\t\t \"URLInfoAbout\" \"http://\"\n\tWriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\EVEMon\" \\\n\t\t\t\t \"DisplayVersion\" \"${VERSION}\"\n\tWriteRegDWORD HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\EVEMon\" \\\n\t\t\t\t \"NoModify\" 1\n\tWriteRegDWORD HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\EVEMon\" \\\n\t\t\t\t \"NoRepair\" 1\nSectionEnd\n\nSection \"un.Uninstall EVEMon\"\n\tSetShellVarContext current\n\tDelete \"$INSTDIR\\*.*\"\n\tDelete \"$SMPROGRAMS\\$STARTMENU_FOLDER\\EVEMon.lnk\"\n\tDelete \"$SMPROGRAMS\\$STARTMENU_FOLDER\\Uninstall EVEMon.lnk\"\n\tRMDir \"$SMPROGRAMS\\$STARTMENU_FOLDER\"\n\tRMDir /R \"$INSTDIR\\Resources\"\n\n\tIfRebootFlag rmDirWithReboot rmDirWithoutReboot\n\n\trmDirWithReboot:\n\tRMDir /REBOOTOK $INSTDIR\n\tGoto afterRmDir\n\t\n\trmDirWithoutReboot:\n\tRMDir $INSTDIR\n\tGoto afterRmDir\n\n\tafterRmDir:\n\t!insertmacro MUI_STARTMENU_GETFOLDER EVEMon $MUI_TEMP\n\tDelete \"$SMPROGRAMS\\$MUI_TEMP\\EVEMon.lnk\"\n\tDelete \"$SMPROGRAMS\\$MUI_TEMP\\Uninstall EVEMon.lnk\"\n\n\tStrCpy $MUI_TEMP \"$SMPROGRAMS\\$MUI_TEMP\"\n\n\tstartMenuDeleteLoop:\n\tClearErrors\n\tRMDir $MUI_TEMP\n\tGetFullPathName $MUI_TEMP \"$MUI_TEMP\\..\"\n\tIfErrors startMenuDeleteLoopDone\n\tStrCmp $MUI_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop\n\n    startMenuDeleteLoopDone:\n\tDeleteRegKey /ifempty HKLM \"Software\\EVEMon\"\n\tDeleteRegKey HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\EVEMon\"\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage \n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given \n// a specific target and scoped to a namespace, type, member, etc.\n//\n// To add a suppression to this file, right-click the message in the \n// Error List, point to \"Suppress Message(s)\", and click \n// \"In Project Suppression File\".\n// You do not need to add suppressions to this file manually.\n\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"InstallBuilder.Program.#BuildInstaller()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"InstallBuilder.Program.#PopulateEnvironment(System.String[])\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"InstallBuilder.Program.#BuildInstaller()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String,System.Object)\", Scope = \"member\", Target = \"InstallBuilder.Program.#BuildInstaller()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String)\", Scope = \"member\", Target = \"InstallBuilder.Program.#BuildInstaller()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String,System.Object)\", Scope = \"member\", Target = \"InstallBuilder.Program.#BuildZip()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String,System.Object,System.Object)\", Scope = \"member\", Target = \"InstallBuilder.Program.#Main(System.String[])\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String)\", Scope = \"member\", Target = \"InstallBuilder.Program.#Main(System.String[])\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String,System.Object)\", Scope = \"member\", Target = \"InstallBuilder.Program.#PopulateEnvironment(System.String[])\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String)\", Scope = \"member\", Target = \"InstallBuilder.Program.#PopulateEnvironment(System.String[])\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"MakeNSIS\", Scope = \"member\", Target = \"InstallBuilder.Program.#BuildInstaller()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA2210:AssembliesShouldHaveValidStrongNames\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#HasVersion()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#BuildZip()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#BuildInstaller()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String,System.Object)\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#Main(System.String[])\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String)\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#Main(System.String[])\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String,System.Object,System.Object)\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#Main(System.String[])\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String,System.Object)\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#CheckNsisPresent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String)\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#HasVersion()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String,System.Object)\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#BuildZip()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String,System.Object)\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#BuildInstaller()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String)\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#BuildInstaller()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Console.WriteLine(System.String,System.Object)\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#DeleteFiles(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"teamcity\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#Main(System.String[])\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"buildNumber\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#Main(System.String[])\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"MakeNSIS\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#BuildInstaller()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.InstallBuilder.Program.#DeleteFiles(System.String)\")]\n\n"
  },
  {
    "path": "tools/InstallBuilder/InstallBuilder.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>9.0.21022</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{5CE8E302-3577-41BC-A35F-C88AC625F7A7}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>EVEMon.InstallBuilder</RootNamespace>\n    <AssemblyName>EVEMonInstallBuilder</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <SolutionDir Condition=\"$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'\">..\\..\\</SolutionDir>\n    <RestorePackages>true</RestorePackages>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG</DefineConstants>\n    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\n    <DebugType>full</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>SNAPSHOT</DefineConstants>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\SharpZipLib.0.86.0\\lib\\20\\ICSharpCode.SharpZipLib.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Windows.Forms\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"GlobalSuppressions.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"app.config\" />\n    <None Include=\"EVEMonInstallerScript.nsi\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"NETFrameworkCheck.nsh\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Include=\"packages.config\" />\n    <None Include=\"UAC.nsh\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n  <PropertyGroup>\n    <PostBuildEvent>if $(ConfigurationName)==Debug exit\n$(TargetPath)</PostBuildEvent>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "tools/InstallBuilder/NETFrameworkCheck.nsh",
    "content": "!include \"LogicLib.nsh\"\n\nFunction GetWindowsVersion\n  ReadRegDWORD $0 HKLM \"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\" \"CurrentMajorVersionNumber\"\n  Push $0\nFunctionEnd\n\nFunction GetDotNETVersion\n  ReadRegDWORD $0 HKLM \"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\" \"Release\"\n  Push $0\nFunctionEnd\n\nVar DOTNET_RETURN_CODE\n\nSection \"Microsoft .NET Framework v4.6.1\"\n  SectionIn RO\n  \n  ; search for /SKIPDOTNET on commandline and skip if found\n  Push $CMDLINE\n  Push \"/SKIPDOTNET\"\n  Call StrStr\n  Pop $0\n  StrCmp $0 \"\" lbl_notSkipped\n  Goto lbl_Done\n  \n  lbl_notSkipped:\n  Call GetWindowsVersion\n  Pop $0\n  Call GetDotNETVersion\n  Pop $1\n  ; On all other OS versions\n  ${If} $0 == 0 \n  ${AndIf} $1 >= 394271 \n    Goto lbl_Done\n  ${EndIf}\n  ; On Windows 10 November Update systems\n  ${If} $0 >= 10\n  ${AndIf} $1 >= 394254\n    Goto lbl_Done\n  ${EndIf}\n  Goto lbl_DotNetVersionNotFound\n\n  lbl_DotNetVersionNotFound:\n  MessageBox MB_ICONEXCLAMATION|MB_YESNO|MB_DEFBUTTON2 \"Microsoft .NET Framework v4.6.1 is required, and does not appear to be installed.$\\nYou must \\\n                    install it before continuing.$\\nIf you choose to continue, you will need to be connected \\\n                    to the internet before proceeding.$\\nWould you like to continue with the installation?\" /SD IDNO IDYES lbl_Confirmed IDNO lbl_Cancelled\n\n  lbl_Cancelled:                  \n  Abort \"Microsoft .NET Framework v4.6.1 is required.\"\n\n  lbl_Confirmed:\n  nsisdl::download \\\n         /TIMEOUT=120000 \"https://download.microsoft.com/download/E/4/1/E4173890-A24A-4936-9FC9-AF930FE3FA40/NDP461-KB3102436-x86-x64-AllOS-ENU.exe\" \"$PLUGINSDIR\\dotnetfx.exe\"\n  Pop $0\n  StrCmp \"$0\" \"success\" lbl_continue\n  Abort \"Microsoft .NET Framework v4.6.1 download failed\"\n\n  lbl_continue:\n  Banner::show /NOUNLOAD \"Installing .NET Framework v4.6.1...\"\n  nsExec::ExecToStack '\"$PLUGINSDIR\\dotnetfx.exe\" /q /c:\"install.exe /q\"'\n  Pop $DOTNET_RETURN_CODE\n  Banner::destroy\n  SetRebootFlag true\n\n  StrCmp \"$DOTNET_RETURN_CODE\" \"\" lbl_NoError\n  StrCmp \"$DOTNET_RETURN_CODE\" \"0\" lbl_NoError\n  StrCmp \"$DOTNET_RETURN_CODE\" \"3010\" lbl_NoError\n  StrCmp \"$DOTNET_RETURN_CODE\" \"8192\" lbl_NoError\n  StrCmp \"$DOTNET_RETURN_CODE\" \"error\" lbl_Error\n  StrCmp \"$DOTNET_RETURN_CODE\" \"timeout\" lbl_TimeOut\n  Goto lbl_Error\n\n  lbl_TimeOut:\n  Abort \"The .NET Framework download timed out.\"\n\n  lbl_Error:\n  Abort \"The .NET Framework install failed (error code $DOTNET_RETURN_CODE).\"\n  \n  lbl_NoError:\n  lbl_Done:\nSectionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/COPYING",
    "content": "COPYRIGHT\n---------\n\nCopyright (C) 1995-2009 Contributors\n\nMore detailed copyright information can be found in the individual source code files.\n\nAPPLICABLE LICENSES\n-------------------\n\n* All NSIS source code, plug-ins, documentation, examples, header files and graphics, with the exception of the compression modules and where otherwise noted, are licensed under the zlib/libpng license.\n\n* The zlib compression module for NSIS is licensed under the zlib/libpng license.\n\n* The bzip2 compression module for NSIS is licensed under the bzip2 license.\n\n* The LZMA compression module for NSIS is licensed under the Common Public License version 1.0.\n\nZLIB/LIBPNG LICENSE\n-------------------\n\nThis software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:\n\n      1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n\n      2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n\n      3. This notice may not be removed or altered from any source distribution.\n\nBZIP2 LICENSE\n-------------\n\nThis program, \"bzip2\" and associated library \"libbzip2\", are copyright (C) 1996-2000 Julian R Seward. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n      1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n    \n      2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n\n      3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n\n      4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nJulian Seward, Cambridge, UK.\n\njseward@acm.org\n\nCOMMON PUBLIC LICENSE VERSION 1.0\n---------------------------------\n\nTHE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.\n\n1. DEFINITIONS\n\n\"Contribution\" means:\n\n      a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and\n      b) in the case of each subsequent Contributor:\n\n      i) changes to the Program, and\n\n      ii) additions to the Program;\n\n      where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. \n\n\"Contributor\" means any person or entity that distributes the Program.\n\n\"Licensed Patents \" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.\n\n\"Program\" means the Contributions distributed in accordance with this Agreement.\n\n\"Recipient\" means anyone who receives the Program under this Agreement, including all Contributors.\n\n2. GRANT OF RIGHTS\n\n      a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.\n\n      b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. \n\n      c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.\n\n      d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. \n\n3. REQUIREMENTS\n\nA Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:\n\n      a) it complies with the terms and conditions of this Agreement; and\n\n      b) its license agreement:\n\n      i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; \n\n      ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; \n\n      iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and\n\n      iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. \n\nWhen the Program is made available in source code form:\n\n      a) it must be made available under this Agreement; and \n\n      b) a copy of this Agreement must be included with each copy of the Program. \n\nContributors may not remove or alter any copyright notices contained within the Program.\n\nEach Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.\n\n4. COMMERCIAL DISTRIBUTION\n\nCommercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (\"Commercial Contributor\") hereby agrees to defend and indemnify every other Contributor (\"Indemnified Contributor\") against any losses, damages and costs (collectively \"Losses\") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.\n\nFor example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.\n\n5. NO WARRANTY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.\n\n6. DISCLAIMER OF LIABILITY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\n7. GENERAL\n\nIf any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.\n\nIf Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.\n\nAll Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.\n\nEveryone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.\n\nThis Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. \n\nSPECIAL EXCEPTION FOR LZMA COMPRESSION MODULE\n---------------------------------------------\n\nIgor Pavlov and Amir Szekely, the authors of the LZMA compression module for NSIS, expressly permit you to statically or dynamically link your code (or bind by name) to the files from the LZMA compression module for NSIS without subjecting your linked code to the terms of the Common Public license version 1.0. Any modifications or additions to files from the LZMA compression module for NSIS, however, are subject to the terms of the Common Public License version 1.0.\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Afrikaans.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1078\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Friedel Wolff\n# ^Branding\nNullsoft Installeerstelsel %s\n# ^SetupCaption\n$(^Name) Installasie\n# ^UninstallCaption\n$(^Name) Verwydering\n# ^LicenseSubCaption\n: Lisensie-ooreenkoms\n# ^ComponentsSubCaption\n: Installasiekeuses\n# ^DirSubCaption\n: Installasiegids\n# ^InstallingSubCaption\n: Installeer tans\n# ^CompletedSubCaption\n: Voltooid\n# ^UnComponentsSubCaption\n: Verwyderingkeuses\n# ^UnDirSubCaption\n: Verwyderinggids\n# ^ConfirmSubCaption\n: Bevestiging\n# ^UninstallingSubCaption\n: Verwyder tans\n# ^UnCompletedSubCaption\n: Voltooid\n# ^BackBtn\n< V&orige\n# ^NextBtn\n&Volgende >\n# ^AgreeBtn\n&Regso\n# ^AcceptBtn\nEk &aanvaar die ooreenkoms\n# ^DontAcceptBtn\nEk aan vaar &nie die ooreenkoms nie\n# ^InstallBtn\n&Installeer\n# ^UninstallBtn\n&Verwyder\n# ^CancelBtn\nKanselleer\n# ^CloseBtn\n&Sluit af\n# ^BrowseBtn\n&Blaai...\n# ^ShowDetailsBtn\n&Wys detail\n# ^ClickNext\nKlik op Volgende om verder te gaan.\n# ^ClickInstall\nKlik op Installeer om die installasie te begin.\n# ^ClickUninstall\nKlik op Verwyder om die verwydering te begin.\n# ^Name\nNaam\n# ^Completed\nVoltooid\n# ^LicenseText\nLees die lisensieooreenkoms voordat u $(^NameDA) installeer. Klik op Regso as u die ooreenkoms aanvaar.\n# ^LicenseTextCB\nLees die lisensieooreenkoms voordat u $(^NameDA) installeer. Merk die blokkie hieronder as u die ooreenkoms aanvaar. $_CLICK\n# ^LicenseTextRB\nLees die lisensieooreenkoms voordat u $(^NameDA) installeer. Kies die eerste keuse hieronder as u die ooreenkoms aanvaar. $_CLICK\n# ^UnLicenseText\nLees die lisensieooreenkoms voordat u $(^NameDA) verwyder. Klik op Regso als u die ooreenkoms aanvaar.\n# ^UnLicenseTextCB\nLees die lisensieooreenkoms voordat u $(^NameDA) verwyder. Merk die blokkie hieronder as u die ooreenkoms aanvaar. $_CLICK\n# ^UnLicenseTextRB\nLees die lisensieooreenkoms voordat u $(^NameDA) verwyder. KIes die eerste keuse hieronder as u die ooreenkoms aanvaar. $_CLICK\n# ^Custom\nAangepast\n# ^ComponentsText\nKies die komponente wat u wil installeer en deselekteer di wat u nie wil installeer nie. $_CLICK\n# ^ComponentsSubText1\nKies die installasietipe:\n# ^ComponentsSubText2_NoInstTypes\nKies die komponente wat genstalleer moet word:\n# ^ComponentsSubText2\nOf kies die komponente wat genstalleer moet word:\n# ^UnComponentsText\nKies die komponente wat u wil verwyder en deselekteer di wat u nie wil verwyder nie. $_CLICK\n# ^UnComponentsSubText1\nKies die verwyderingstipe:\n# ^UnComponentsSubText2_NoInstTypes\nKies die komponente wat verwyder moet word:\n# ^UnComponentsSubText2\nOf kies die komponente wat verwyder moet word:\n# ^DirText\n$(^NameDA) sal in die volgende gids genstalleer word. Om elders te installeer, klik op Blaai en kies 'n ander een. $_CLICK\n# ^DirSubText\nInstallasiegids\n# ^DirBrowseText\nKies die gids om $(^NameDA) in te installeer:\n# ^UnDirText\n$(^NameDA) gaan uit die volgende gids verwyder word. Om van elders af te verwyder, klik op Blaai en kies 'n ander gids. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nKies die gids om $(^NameDA) uit te verwyder:\n# ^SpaceAvailable\n\"Beskikbare spasie: \"\n# ^SpaceRequired\n\"Vereiste spasie: \"\n# ^UninstallingText\n$(^NameDA) sal uit die volgende gids verwyder word. $_CLICK\n# ^UninstallingSubText\nVerwydering uit:\n# ^FileError\nFout met skryf na ler: \\r\\n\\r\\n$0\\r\\n\\r\\nKlik Staak om de installasie te stop,\\r\\nProbeer weer om weer te probeer of\\r\\nIgnoreer om di ler oor te slaan.\n# ^FileError_NoIgnore\nFout met skryf na ler: \\r\\n\\r\\n$0\\r\\n\\r\\nKlik Probeer weer om op nuut te probeer, of \\r\\nKanselleer om die installasie te stop.\n# ^CantWrite\n\"Kon nie skyf nie: \"\n# ^CopyFailed\nKopiring het misluk\n# ^CopyTo\n\"Kopieer na \"\n# ^Registering\n\"Registreer tans: \"\n# ^Unregistering\n\"Deregistreer tans: \"\n# ^SymbolNotFound\n\"Kon nie simbool vind nie: \"\n# ^CouldNotLoad\n\"Kon nie laai nie: \"\n# ^CreateFolder\n\"Skep gids: \"\n# ^CreateShortcut\n\"Maak kortpad: \"\n# ^CreatedUninstaller\n\"Verwyderingsprogram gemaak: \"\n# ^Delete\n\"Verwyder ler: \"\n# ^DeleteOnReboot\n\"Verwyder na herbegin van rekenaar: \"\n# ^ErrorCreatingShortcut\n\"Fout met maak van kortpad: \"\n# ^ErrorCreating\n\"Fout met skep: \"\n# ^ErrorDecompressing\nFout met uitpak van data! Korrupte installasieler?\n# ^ErrorRegistering\nFout met registrasie van DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Voer uit: \"\n# ^Extract\n\"Pak uit: \"\n# ^ErrorWriting\n\"Uitpak: fout met skryf na ler \"\n# ^InvalidOpcode\nInstallasieprogram korrup: ongeldige opcode\n# ^NoOLE\n\"Geen OLE vir: \"\n# ^OutputFolder\n\"Afvoergids: \"\n# ^RemoveFolder\n\"Verwyder gids: \"\n# ^RenameOnReboot\n\"Hernoem na herbegin van rekenaar: \"\n# ^Rename\n\"Hernoem: \"\n# ^Skipped\n\"Oorgeslaan: \"\n# ^CopyDetails\nKopieer detail na knipbord\n# ^LogInstall\nBoekstaaf die installasieproses\n# ^Byte\nG\n# ^Kilo\nK\n# ^Mega\nM\n#  ^Giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Afrikaans.nsh",
    "content": ";Language: Afrikaans (1078)\n;By Friedel Wolff\n\n!insertmacro LANGFILE \"Afrikaans\" \"Afrikaans\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Welkom by die $(^NameDA) Installasieslimmerd\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Hierdie slimmerd lei mens deur die installasie van $(^NameDA).$\\r$\\n$\\r$\\nDit word aanbeveel dat u alle ander programme afsluit voor die begin van die installasie. Dit maak dit moontlik om die relevante stelsellers op te dateer sonder om die rekenaar te herlaai.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Welkom by die $(^NameDA) Verwyderingslimmerd\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Hierdie slimmerd lei mens deur die verwydering van $(^NameDA).$\\r$\\n$\\r$\\nVoor die verwydering begin word, maak seker dat $(^NameDA) nie loop nie.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Lisensie-ooreenkoms\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Lees die lisensie-ooreenkoms voordat u $(^NameDA) installeer.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Klik op Regso om verder te gaan as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te installeer.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Merk die blokkie hier onder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te installeer. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Kies die eerste keuse hieronder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te installeer. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Lisensie-ooreenkoms\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Lees die lisensie-ooreenkoms voordat u $(^NameDA) verwyder.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Klik op Regso om verder te gaan as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te verwyder.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Merk die kiesblokkie hieronder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te verwyder.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Kies die eerste keuse hieronder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te verwyder.\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Druk op Page Down om die res van die ooreenkoms te sien.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Kies komponente\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Kies watter komponente van $(^NameDA) genstalleer moet word.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Kies komponente\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Kies watter komponente van $(^NameDA) verwyder moet word.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Beskrywing\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Beweeg die muis oor 'n komponent om sy beskrywing te sien.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Beweeg die muis oor 'n komponent om sy beskrywing te sien.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Kies installasieplek\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Kies die gids waarin u $(^NameDA) wil installeer.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Kies verwyderinggids\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Kies die gids waaruit u $(^NameDA) wil verwyder.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Installeer tans\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Wag asb. terwyl $(^NameDA) genstalleer word.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Installasie voltooid\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Die installasie is suksesvol voltooi.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Installasie gestaak\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Die installasie is nie suksesvol voltooi nie.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Verwyder tans\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Wag asb. terwyl $(^NameDA) van u rekenaar verwyder word.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Verwydering voltooi\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Verwydering is suksesvol voltooi.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Verwydering gestaak\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Verwydering is nie suksesvol voltooi nie.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Voltooi van die $(^NameDA) Installasieslimmerd\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) is genstalleer op uw rekenaar.$\\r$\\n$\\r$\\nKlik op Voltooi om hierdie slimmerd af te sluit.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Die rekenaar moet oorbegin word om die installasie van $(^NameDA) te voltooi. Wil u nou oorbegin?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Voltooi van die $(^NameDA) Verwyderingslimmerd\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) is van u rekenaar verwyder.$\\r$\\n$\\r$\\nKlik op Voltooi om hierdie slimmerd af te sluit.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Die rekenaar moet oorbegin word om die verwydering van $(^NameDA) te voltooi. Wil u nou oorbegin?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Begin nou oor\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Ek wil later self oorbegin\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Laat loop $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Wys Leesmy-ler\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Voltooi\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Kies gids in Begin-kieslys\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Kies 'n gids in die Begin-kieslys vir $(^NameDA) se kortpaaie.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Kies die gids in die Begin-kieslys waarin die program se kortpaaie geskep moet word. U kan ook 'n nuwe naam gee om 'n nuwe gids te skep.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Moenie kortpaaie maak nie\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Verwyder $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Verwyder $(^NameDA) van u rekenaar.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Wil u definitief die installasie van $(^Name) afsluit?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Wil u definitief die verwydering van $(^Name) afsluit?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Albanian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1052\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1250\n# RTL - anything else than RTL means LTR\n-\n# Prkthimi nga Besnik Bleta, besnik@programeshqip.org\n# ^Branding\nSistemi Nullsoft pr Instalime %s\n# ^SetupCaption\nRregullimi i $(^Name)\n# ^UninstallCaption\ninstalimi i $(^Name)\n# ^LicenseSubCaption\n: Marrveshje Licence\n# ^ComponentsSubCaption\n: Mundsi Instalimi\n# ^DirSubCaption\n: Dosje Instalimi\n# ^InstallingSubCaption\n: Po instalohet\n# ^CompletedSubCaption\n: U plotsua\n# ^UnComponentsSubCaption\n: Mundsi instalimi\n# ^UnDirSubCaption\n: Dosje instalimi\n# ^ConfirmSubCaption\n: Ripohim\n# ^UninstallingSubCaption\n: Po instalohet\n# ^UnCompletedSubCaption\n: U plotsua\n# ^BackBtn\n< &Mbrapsht\n# ^NextBtn\n&Tjetri >\n# ^AgreeBtn\n&Pajtohem\n# ^AcceptBtn\n&I pranoj kushtet e Marrveshjes s Licenss\n# ^DontAcceptBtn\n&Nuk i pranoj kushtet e Marrveshjes s Licenss\n# ^InstallBtn\n&Instaloje\n# ^UninstallBtn\n&instaloje\n# ^CancelBtn\nAnuloje\n# ^CloseBtn\n&Mbylle\n# ^BrowseBtn\nSh&fletoni...\n# ^ShowDetailsBtn\nShfaq &hollsi\n# ^ClickNext\nKlikoni Tjetri pr t vazhduar.\n# ^ClickInstall\nPr t filluar instalimin klikoni Instaloje.\n# ^ClickUninstall\nPr t filluar instalimin klikoni instaloje.\n# ^Name\nEmr\n# ^Completed\nU plotsua\n# ^LicenseText\nJu lutem, para instalimit t $(^NameDA), shqyrtoni marrveshjen e licencs. Nse i pranoni tr kushtet e marrveshjes, klikoni Pajtohem.\n# ^LicenseTextCB\nJu lutem, para instalimit t $(^NameDA), shqyrtoni marrveshjen e licenss. Nse i pranoni tr kushtet e marrveshjes, klikoni kutizn m posht. $_CLICK\n# ^LicenseTextRB\nJu lutem, para instalimit t $(^NameDA), shqyrtoni marrveshjen e licenss. Nse i pranoni tr kushtet e marrveshjes, przgjidhni mundsin e par m posht. $_CLICK\n# ^UnLicenseText\nJu lutem, para instalimit t $(^NameDA), shqyrtoni marrveshjen e licenss. Nse i pranoni tr kushtet e marrveshjes, klikoni Pajtohem.\n# ^UnLicenseTextCB\nJu lutem, para instalimit t $(^NameDA), shqyrtoni marrveshjen e licenss. Nse i pranoni tr kushtet e marrveshjes, klikoni kutizn m posht. $_CLICK\n# ^UnLicenseTextRB\nJu lutem, para instalimit t $(^NameDA), shqyrtoni marrveshjen e licenss. Nse i pranoni tr kushtet e marrveshjes, przgjidhni mundsin e par m posht. $_CLICK\n# ^Custom\nVetjake\n# ^ComponentsText\nU vini shenj prbrsve q doni t instalohen dhe hiquani shenjn  prbrsvet q nuk doni t instalohen. $_CLICK\n# ^ComponentsSubText1\nPrzgjidhni llojin e instalimit:\n# ^ComponentsSubText2_NoInstTypes\nPrzgjidhni prbrsit pr instalim:\n# ^ComponentsSubText2\nOse, przgjidhni prbrsit e mundshm q doni t instalohen:\n# ^UnComponentsText\nU vini shenj prbrsve q doni t instalohen dhe hiquni shenjn prbrsve q nuk doni t instalohen. $_CLICK\n# ^UnComponentsSubText1\nPrzgjidhni llojin e instalimit:\n# ^UnComponentsSubText2_NoInstTypes\nPrzgjidhni prbrsit pr instalim:\n# ^UnComponentsSubText2\nOse, przgjidhni prbrsit e mundshm q doni t instalohen:\n# ^DirText\nRregullimi do ta instaloj $(^NameDA) n dosjen vijuese. Pr instalim n nj dosje tjetr, klikoni Shfletoni dhe przgjidhni nj tjetr dosje. $_CLICK\n# ^DirSubText\nDosje Vendmbrritje\n# ^DirBrowseText\nPrzgjidhni dosjen ku t instalohet $(^NameDA):\n# ^UnDirText\nRregullimi do t instaloj $(^NameDA) prej dosjes vijuese. Pr instalim prej nj dosjeje tjetr, klikoni Shfletoni dhe przgjidhni nj tjetr dosje. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nPrzgjidhni dosjen prej nga ku t instalohet $(^NameDA):\n# ^SpaceAvailable\n\"Hapsir e mundshme: \"\n# ^SpaceRequired\n\"Hapsir e nevojshme: \"\n# ^UninstallingText\n$(^NameDA) do t instalohet prej dosjes vijuese. $_CLICK\n# ^UninstallingSubText\nPo instalohet prej:\n# ^FileError\nGabim n hapje kartele pr shkrim: \\r\\n\\r\\n$0\\r\\n\\r\\nKlikoni Ndrprite pr t ndalur instalimin,\\r\\nRiprovo pr t provuar srish, ose\\r\\nShprfille pr t sanashkaluar kt kartel.\n# ^FileError_NoIgnore\nGabim n hapje kartele pr shkrim: \\r\\n\\r\\n$0\\r\\n\\r\\nKlikoni Riprovo pr t provuar srish, ose\\r\\nAnulo pr t ndalur instalimin.\n# ^CantWrite\n\"S'shkruaj dot: \"\n# ^CopyFailed\nKopjimi dshtoi\n# ^CopyTo\n\"Kopjo tek \"\n# ^Registering\n\"Regjistrim: \"\n# ^Unregistering\n\"regjistrim: \"\n# ^SymbolNotFound\n\"S'u gjet dot simbol: \"\n# ^CouldNotLoad\n\"S'u ngarkua dot: \"\n# ^CreateFolder\n\"Krijo dosje: \"\n# ^CreateShortcut\n\"Krijo shkurtore: \"\n# ^CreatedUninstaller\n\"Krijo instalues: \"\n# ^Delete\n\"Fshi kartel: \"\n# ^DeleteOnReboot\n\"Fshi gjat rinisjes: \"\n# ^ErrorCreatingShortcut\n\"Gabim n krijim shkurtoresh: \"\n# ^ErrorCreating\n\"Gabim n krijimin e: \"\n# ^ErrorDecompressing\nGabim n ngjeshje t dhnash! Instalues i dmtuar?\n# ^ErrorRegistering\nGabim n regjistrim DLL-je\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Ekzekuto: \"\n# ^Extract\n\"Prfto: \"\n# ^ErrorWriting\n\"Prftim: gabim n shkrim te kartela \"\n# ^InvalidOpcode\nInstalues i dmtuar: opcode i pavlefshm\n# ^NoOLE\n\"Pa OLE pr: \"\n# ^OutputFolder\n\"Dosje prfundimesh: \"\n# ^RemoveFolder\n\"Hiq dosjen: \"\n# ^RenameOnReboot\n\"Riemrtoje gjat rinisjes: \"\n# ^Rename\n\"Riemrtoje: \"\n# ^Skipped\n\"U anashkalua: \"\n# ^CopyDetails\nKopjo Hollsira Te Clipboard\n# ^LogInstall\nRegjistro procesin e instalimit\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Albanian.nsh",
    "content": ";Language: Albanian (1052)\n;Translation Besnik Bleta, besnik@programeshqip.org\n\n!insertmacro LANGFILE \"Albanian\" \"Albanian\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Mirsevini te Rregullimi i $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Ky do t'ju udhheq gjat instalimit t $(^NameDA).$\\r$\\n$\\r$\\nKshillohet q t mbyllni tr zbatimet e tjera para se t nisni Rregullimin. Kjo bn t mundur prditsimin e kartelave t rndsishme t sistemit pa u dashur t riniset kompjuteri juaj.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Mirsevini te instalimi i $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Ky do t'ju udhheq gjat instalimit t $(^NameDA).$\\r$\\n$\\r$\\nPara nisjes s instalimit, sigurohuni q $(^NameDA) nuk sht duke xhiruar.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Marrveshje Licence\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Ju lutem shqyrtoni kushtet e licencs prpara se t instaloni $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Nse i pranoni kushtet e marrveshjes, klikoni Pajtohem pr t vazhduar. Duhet ta pranoni marrveshjen pr t instaluar $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Nse pranoni kushtet e marrveshjes, klikoni kutizn m posht. Duhet t pranoni marrveshjen pr t instaluar $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Nse pranoni kushtet e marrveshjes, przgjidhni m posht mundsin e par. Duhet t pranoni marrveshjen pr t instaluar $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Marrveshje Licence\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Ju lutem shqyrtoni kushtet e licencs prpara instalimit t $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Nse i pranoni kushtet e marrveshjes, klikoni Pajtohem pr t vazhduar. Duhet t pranoni marrveshjen pr t instaluar $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Nse pranoni kushtet e marrveshjes, klikoni kutizn m posht. Duhet t pranoni marrveshjen pr t instaluar $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Nse pranoni kushtet e marrveshjes, przgjidhni mundsin e par m posht. Duhet t pranoni marrveshjen pr t instaluar $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Shtypni Page Down pr t par pjesn e mbetur t marrveshjes.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Przgjidhni Prbrs\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Zgjidhni cilat an t $(^NameDA) doni t instalohen.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Zgjidhni Prbrsa\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Zgjidhni cilat an t $(^NameDA) doni t instalohen.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Prshkrim\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Pr t par prshkrimin e nj prbrsi, vendosni miun prsipr tij.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Pr t par prshkrimin e nj prbrsi, vendosni miun prsipr tij.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Zgjidhni Vend Instalimi\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Zgjidhni dosjen tek e cila t instalohet $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Zgjidhni Vend instalimi\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Zgjidhni dosjen prej s cils t instalohet $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Po instalohet\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Ju lutem prisni ndrkoh q $(^NameDA) instalohet.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Instalim i Plotsuar\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Rregullimi u plotsua me sukses.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalimi u Ndrpre\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Rregullimi nuk u plotsua me sukses.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"instalim\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Ju lutem prisni ndrsa $(^NameDA) instalohet.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"instalim i Plot\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"instalimi u plotsua me sukses.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"instalimi u Ndrpre\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"instalimi nuk plotsua me sukses.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Po plotsoj Rregullimin e $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) u instalua n kompjuterin tuaj.$\\r$\\n$\\r$\\nPr mbylljen e procesit, klikoni Prfundoje.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Q t mund t plotsohet instalimi i $(^NameDA) kompjuteri juaj duhet t riniset. Doni ta rinisni tani?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Po plotsoj instalimin e $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) u instalua prej kompjuterit tuaj.$\\r$\\n$\\r$\\nPr mbylljen e procesit, klikoni Prfundoje.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Kompjuteri juaj duhet t riniset q t mund t plotsohet instalimi i $(^NameDA). Doni ta rinisni tani?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Rinise tani\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Dua ta rinis dorazi m von\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Nis $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Shfaq Readme\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Prfundoje\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Zgjidhni Dosje Menuje Start\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Zgjidhni nj dosje Menuje Start pr shkurtore $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Przgjidhni dosjen e Menus Start n t ciln do t donit t krijonit shkurtoret pr programin. Mundeni edhe t jepni nj emr pr t krijuar nj dosje t re.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Mos krijo shkurtore\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"instalo $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Hiqeni $(^NameDA) prej kompjuterit tuaj.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Jeni i sigurt q doni t dilni nga Rregullimi i $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Jeni i sigurt q doni t dilni nga instalimi i $(^Name)?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Zgjidhni Prdoruesa\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Zgjidhni pr cilt prdoruesa doni t instalohet $(^NameDA).\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Przgjidhni n doni t instalohet $(^NameDA) vetm pr veten tuaj apo pr tr prdoruesit e ktij kompjuteri. $(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Instaloje pr kdo n kt kompjuter\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Instaloje vetm pr mua\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Arabic.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1025\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1256\n# RTL - anything else than RTL means LTR\nRTL\n# Translation by asdfuae@msn.com, updated by Rami Kattan\n# ^Branding\n   %s\n# ^SetupCaption\n $(^Name)\n# ^UninstallCaption\n $(^Name)\n# ^LicenseSubCaption\n  :\n# ^ComponentsSubCaption\n  :\n# ^DirSubCaption\n  :\n# ^InstallingSubCaption\n :\n# ^CompletedSubCaption\n :\n# ^UnComponentsSubCaption\n  :\n# ^UnDirSubCaption\n  :\n# ^ConfirmSubCaption\n :\n# ^UninstallingSubCaption\n :\n# ^UnCompletedSubCaption\n :\n# ^BackBtn\n< &\n# ^NextBtn\n& >\n# ^AgreeBtn\n&\n# ^AcceptBtn\n&    \n# ^DontAcceptBtn\n&     \n# ^InstallBtn\n&\n# ^UninstallBtn\n&\n# ^CancelBtn\n\n# ^CloseBtn\n&\n# ^BrowseBtn\n&...\n# ^ShowDetailsBtn\n& \n# ^ClickNext\n   .\n# ^ClickInstall\n    .\n# ^ClickUninstall\n    .\n# ^Name\n\n# ^Completed\n\n# ^LicenseText\n      $(^NameDA).      ɡ  .\n# ^LicenseTextCB\n      $(^NameDA).      ɡ     . $_CLICK.\n# ^LicenseTextRB\n      $(^NameDA).      ɡ    . $_CLICK\n# ^UnLicenseText\n      $(^NameDA).      ɡ  .\n# ^UnLicenseTextCB\n      $(^NameDA).      ɡ     . $_CLICK\n# ^UnLicenseTextRB\n      $(^NameDA).      ɡ    . $_CLICK\n# ^Custom\n\n# ^ComponentsText\n          . $_CLICK\n# ^ComponentsSubText1\n  :\n# ^ComponentsSubText2_NoInstTypes\n  :\n# ^ComponentsSubText2\n      :\n# ^UnComponentsText\n          . $_CLICK\n# ^UnComponentsSubText1\n  :\n# ^UnComponentsSubText2_NoInstTypes\n  :\n# ^UnComponentsSubText2\n     :\n# ^DirText\n  $(^NameDA)   .    ѡ     . $_CLICK\n# ^DirSubText\n \n# ^DirBrowseText\n   $(^NameDA) :\n# ^UnDirText\n  $(^NameDA)   .    ѡ     . $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n   $(^NameDA) :\n# ^SpaceAvailable\n\" : \"\n# ^SpaceRequired\n\" : \"\n# ^UninstallingText\n  $(^NameDA)   . $_CLICK\n# ^UninstallingSubText\n :\n# ^FileError\n     : \\r\\n\\t\\\"$0\\\"\\r\\n   ȡ\\r\\n    ݡ\\r\\n   \n# ^FileError_NoIgnore\n     : \\r\\n\\t\\\"$0\\\"\\r\\n     ݡ \\r\\n  \n# ^CantWrite\n\"  : \"\n# ^CopyFailed\n \n# ^CopyTo\n\" \"\n# ^Registering\n\": \"\n# ^Unregistering\n\" : \"\n# ^SymbolNotFound\n\"     :\"\n# ^CouldNotLoad\n\"    :\"\n# ^CreateFolder\n\" \"\n# ^CreateShortcut\n\" : \"\n# ^CreatedUninstaller\n\" : \"\n# ^Delete\n\" : \"\n# ^DeleteOnReboot\n\"   : \"\n# ^ErrorCreatingShortcut\n\"   : \"\n# ^ErrorCreating\n\"   :\"\n# ^ErrorDecompressing\n    !  ݿ\n# ^ErrorRegistering\n   DLL\n# ^ExecShell\n\" ExecShell:\"\n# ^Exec\n\": \"\n# ^Extract\n\": \"\n# ^ErrorWriting\n\":      \"\n# ^InvalidOpcode\n :   \n# ^NoOLE\n\"  OLE : \"\n# ^OutputFolder\n\" : \"\n# ^RemoveFolder\n\" : \"\n# ^RenameOnReboot\n\"    : \"\n# ^Rename\n\" : \"\n# ^Skipped\n\": \"\n# ^CopyDetails\n   \n# ^LogInstall\n  \n# ^Byte\n\n# ^Kilo\n\n# ^Mega\n\n# ^Giga\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Arabic.nsh",
    "content": ";Language: Arabic (1025)\n;Translation by asdfuae@msn.com\n;updated by Rami Kattan\n\n!insertmacro LANGFILE \"Arabic\" \"Arabic\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"     $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"     $(^NameDA).$\\r$\\n$\\r$\\n      .           .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"     $(^NameDA) \"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"     $(^NameDA).$\\r$\\n$\\r$\\n   ɡ     $(^NameDA)  .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"      $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"       .      $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"        .      $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"    ɡ     .      $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"      $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"    ɡ   .      $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"    ɡ    .      $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"    ɡ     .      $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"      \"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"  $(^NameDA)  .\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"  $(^NameDA)  .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"      \"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"      \"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"    $(^NameDA) .\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"     $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"    $(^NameDA).\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \" \"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"   .\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"   .\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"    $(^NameDA).\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"   .\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"   .\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"   $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"   $(^NameDA)  $\\r$\\n$\\r$\\n    .\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"      $(^NameDA).     \"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"   $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"   $(^NameDA)  .$\\r$\\n$\\r$\\n    .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"      $(^NameDA).     \"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"  \"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"       \"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"& $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"& \"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"   \"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"     $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"         .       .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"  \"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \" $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \" $(^NameDA)  .\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"      $(^Name)\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"        $(^Name)\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Basque.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1069\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Iaki San Vicente\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) -ren Instalazioa\n# ^UninstallCaption\n$(^Name) -ren Ezabaketa\n# ^LicenseSubCaption\n: Lizentzia hitzarmen agiria\n# ^ComponentsSubCaption\n: Instalazio aukerak\n# ^DirSubCaption\n: Instalazio karpeta\n# ^InstallingSubCaption\n: Instalatzen\n# ^CompletedSubCaption\n: Instalazioa burututa\n# ^UnComponentsSubCaption\n: Ezabaketa aukerak\n# ^UnDirSubCaption\n: Ezabaketa direktorioa\n# ^ConfirmSubCaption\n: Berretsi ezabaketa\n# ^UninstallingSubCaption\n: Ezabatzen\n# ^UnCompletedSubCaption\n: Ezabaketa burututa\n# ^BackBtn\n< &Atzera\n# ^NextBtn\n&Aurrera >\n# ^AgreeBtn\nOnartu\n# ^AcceptBtn\nLizentzia hitzarmenaren baldintzak onartzen ditut.\n# ^DontAcceptBtn\nEz ditut lizentzia hitzarmenaren baldintzak onartzen.\n# ^InstallBtn\n&Instalatu\n# ^UninstallBtn\n&Ezabatu\n# ^CancelBtn\nEzeztatu\n# ^CloseBtn\n&Itxi\n# ^BrowseBtn\n&Arakatu...\n# ^ShowDetailsBtn\nIkusi &zehaztasunak\n# ^ClickNext\nSakatu Aurrera jarraitzeko.\n# ^ClickInstall\nSakatu Instalatu instalazioarekin hasteko.\n# ^ClickUninstall\nSakatu Ezabatu ezabaketarekin hasteko.\n# ^Name\nIzena\n# ^Completed\nOsatuta\n# ^LicenseText\nMesedez, aztertu lizentzia hitzarmena $(^NameDA) instalatu aurretik. Baldintza guztiak onartzen badituzu, sakatu Onartu.\n# ^LicenseTextCB\nMesedez, aztertu lizentzia hitzarmena $(^NameDA) instalatu aurretik. Baldintza guztiak onartzen badituzu, nabarmendu azpiko laukitxoa. $_CLICK\n# ^LicenseTextRB\nMesedez, aztertu lizentzia hitzarmena $(^NameDA) instalatu aurretik. Baldintza guztiak onartzen badituzu, hautatu azpian lehen aukera. $_CLICK\n# ^UnLicenseText\nMesedez, aztertu lizentzia hitzarmena $(^NameDA) ezabatu aurretik. Baldintza guztiak onartzen badituzu, sakatu Onartu.\n# ^UnLicenseTextCB\nMesedez, aztertu lizentzia hitzarmena $(^NameDA) ezabatu aurretik. Baldintza guztiak onartzen badituzu, nabarmendu azpiko laukitxoa. $_CLICK.\n# ^UnLicenseTextRB\nMesedez, aztertu lizentzia hitzarmena $(^NameDA) ezabatu aurretik. Baldintza guztiak onartzen badituzu, hautatu azpian lehen aukera. $_CLICK\n# ^Custom\nNorberaren nahien arabera\n# ^ComponentsText\nNabarmendu instalatu nahi diren osagaiak, eta utzi zuri instalatu nahi ez direnak. $_CLICK\n# ^ComponentsSubText1\nHautatu instalazio mota:\n# ^ComponentsSubText2_NoInstTypes\nHautatu instalatu beharreko osagaiak:\n# ^ComponentsSubText2\nEdo hautatu instalatu beharreko aukerazko osagaiak:\n# ^UnComponentsText\nNabarmendu ezabatu nahi diren osagaiak, eta utzi zuri ezabatu nahi ez direnak. $_CLICK\n# ^UnComponentsSubText1\nHautatu ezabaketa mota:\n# ^UnComponentsSubText2_NoInstTypes\nHautatu ezabatu beharreko osagaiak:\n# ^UnComponentsSubText2\nEdo hautatu ezabatu beharreko aukerazko osagaiak:\n# ^DirText\nInstalazio programak $(^NameDA) honako karpetan instalatuko du. Beste karpeta batean instalatzeko, sakatu Arakatu eta aukeratu beste bat. $_CLICK\n# ^DirSubText\nHelburu karpeta\n# ^DirBrowseText\nAukeratu $(^NameDA) instalatuko den karpeta:\n# ^UnDirText\nInstalazio programak $(^NameDA) honako karpetatik ezabatuko du. Beste karpeta batetik ezabatzeko, sakatu Arakatu eta aukeratu beste bat. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nAukeratu $(^NameDA) zein karpetatik ezabatuko den:\n# ^SpaceAvailable\nLeku erabilgarria:\n# ^SpaceRequired\nBehar den lekua:\n# ^UninstallingText\n$(^NameDA) ondorengo karpetan instalatuko da. $_CLICK\n# ^UninstallingSubTex\nEzabatzen honako karpetatik:\n# ^FileError\nHutsegitea idazteko fitxategia irekitzean: \\r\\n\\t\"$0\"\\r\\nSakatu Irten instalazioa ,\\r\\nsaiatu berriz fitxategi hau berriz idazten saiatzeko, u\\r\\njarraitu fitxategi hau alde batera utzita aurrera egiteko\n# ^FileError_NoIgnore\nHutsegitea idazteko fitxategia irekitzean: \\r\\n\\t\"$0\"\\r\\nsaiatu berriz fitxategi hau berriz idazten saiatzeko ,\\r\\nSakatu Irten instalazioa\n# ^CantWrite\n\"Ezin izan da idatzi: \"\n# ^CopyFailed\nKopiatzeak hutsegin du\n# ^CopyTo\n\"Kopiatu hona \"\n# ^Registering\n\"Erregistratzen: \"\n# ^Unregistering\n\"Erregistroa ezabatzen: \"\n# ^SymbolNotFound\n\"Ikurra ezin izan da aurkitu: \"\n# ^CouldNotLoad\n\"Ezin izan da kargatu: \"\n# ^CreateFolder\n\"Sortu karpeta: \"\n# ^CreateShortcut\n\"Sortu lasterbidea: \"\n# ^CreatedUninstaller\n\"Sortu ezabatzailea: \"\n# ^Delete\n\"Ezabatu fitxategia: \"\n# ^DeleteOnReboot\n\"Ezabatu berrabiarazitakoan: \"\n# ^ErrorCreatingShortcut\n\"Hutsegitea lasterbidea sortzerakoan: \"\n# ^ErrorCreating\n\"Hutsegitea sortzerakoan: \"\n# ^ErrorDecompressing\nHutsegitea datuak deskomprimatzean! Instalatzailea okerra?\n# ^ErrorRegistering\nHutsegitea DLL erregistratzerakoan\n# ^ExecShell\n\"Exekutatu agindua: \"\n# ^Exec\n\"Exekutatu: \"\n# ^Extract\n\"Kanporatu: \"\n# ^ErrorWriting\n\"Kanporaketa: hutsegitea fitxategira idazterakoan \"\n# ^InvalidOpcode\nInstalatzailea okerra: ekintza kodea ez da baliozkoa\n# ^NoOLE\n\"OLE-rik ez honentzako: \"\n# ^OutputFolder\n\"Irteera karpeta: \"\n# ^RemoveFolder\n\"Ezabatu karpeta: \"\n# ^RenameOnReboot\n\"Berrizendatu berrabiarazitakoan: \"\n# ^Rename\n\"Berrizendatu: \"\n# ^Skipped\n\"Alde batera utzitakoa: \"\n# ^CopyDetails\nKopiatu xehetasunak arbelera\n# ^LogInstall\nInstalazio prozesuaren erregistroa gorde\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Basque.nsh",
    "content": ";Language: Basque (1069)\n;By Iaki San Vicente\n\n!insertmacro LANGFILE \"Basque\" \"Euskera\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Ongi etorri $(^NameDA) -ren instalazio programara\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Programa honek $(^NameDA) zure ordenagailuan instalatuko du.$\\r$\\n$\\r$\\nAholkatzen da instalazioarekin hasi aurretik beste aplikazio guztiak ixtea. Honek sistemarekin erlazionatuta dauden fitxategien eguneratzea ahalbidetuko du, ordenagailua berrabiarazi beharrik izan gabe.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Ongi etorri $(^NameDA) -ren ezabaketa programara\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Laguntzaile honek $(^NameDA)-ren ezabaketa prozesuan zehar gidatuko zaitu.$\\r$\\n$\\r$\\nEzabaketa hasi aurretik, ziurtatu $(^NameDA) martxan ez dagoela .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Lizentzia hitzarmena\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Mesedez aztertu lizentziaren baldintzak $(^NameDA) instalatu aurretik.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Baldintzak onartzen badituzu, sakatu Onartu aurrera egiteko. Hitzarmena onartzea ezinbestekoa da $(^NameDA) instalatzeko.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Baldintzak onartzen badituzu, nabarmendu azpiko laukitxoa. Hitzarmena onartzea ezinbestekoa da $(^NameDA) instalatzeko. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Baldintzak onartzen badituzu, hautatu azpian lehen aukera. Hitzarmena onartzea ezinbestekoa da $(^NameDA) instalatzeko. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Lizentzia hitzarmena\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Mesedez aztertu lizentziaren baldintzak $(^NameDA) ezabatu aurretik.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Baldintzak onartzen badituzu, sakatu Onartu aurrera egiteko. Hitzarmena onartzea ezinbestekoa da $(^NameDA) ezabatzeko.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Baldintzak onartzen badituzu, nabarmendu azpiko laukitxoa. Hitzarmena onartzea ezinbestekoa da $(^NameDA) ezabatzeko. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Baldintzak onartzen badituzu, hautatu azpian lehen aukera. Hitzarmena onartzea ezinbestekoa da $(^NameDA) ezabatzeko. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Sakatu Av Pg hitzarmenaren gainontzeko atalak ikusteko.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Osagaien hautatzea\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Hautatu $(^NameDA)-ren zein ezaugarri instalatu nahi duzun.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Osagaien hautatzea\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Hautatu $(^NameDA)-ren zein ezaugarri ezabatu nahi duzun.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Azalpena\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Jarri sagua osagai baten gainean dagokion azalpena ikusteko.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Jarri sagua osagai baten gainean dagokion azalpena ikusteko.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Hautatu instalazioaren lekua\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Aukeratu $(^NameDA) instalatzeko karpeta.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Aukeratu ezabatuko den karpeta\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Aukeratu $(^NameDA) zein karpetatik ezabatuko den.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Instalatzen\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Mesedez itxoin $(^NameDA) instalatzen den bitartean.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Instalazioa burututa\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Instalazioa zuzen burutu da.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalazioa ezeztatua\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Instalazioa ez da zuzen burutu.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Ezabatzen\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Mesedez itxoin $(^NameDA) ezabatzen den bitartean.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Ezabatzea burututa\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Ezabatzea zuzen burutu da.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Ezabatzea ezeztatuta\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Ezabatzea ez da zuzen burutu.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"$(^NameDA)-ren instalazio laguntzailea osatzen\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) zure sisteman instalatu da.$\\r$\\n$\\r$\\nSakatu Amaitu laguntzaile hau ixteko.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Zure sistema berrabiarazi behar duzu $(^NameDA)-ren instalazioa osatzeko. Orain Berrabiarazi nahi duzu?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"$(^NameDA)-ren ezabaketa laguntzailea osatzen\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) zure sistematik ezabatu da.$\\r$\\n$\\r$\\nSakatu Amaitu laguntzaile hau ixteko.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Zure ordenagailuak berrabiarazia izan behar du $(^NameDA)-ren ezabaketa osatzeko. Orain Berrabiarazi nahi duzu?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Berrabiarazi orain\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Neuk berrabiarazi geroago\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Exekutatu $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Ikusi Readme.txt\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Amaitu\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Aukeratu Hasiera Menuko karpeta\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Aukeratu Hasiera Menuko karpeta bat $(^NameDA)-ren lasterbideentzako.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Aukeratu Hasiera Menuko karpeta bat, non programaren lasterbideak instalatu nahi dituzun. Karpeta berri bat sortzeko izen bat ere adierazi dezakezu.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Ez sortu lasterbiderik\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Ezabatu $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"$(^NameDA) zure sistematik ezabatzen du.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Ziur zaude $(^Name)-ren instalaziotik irten nahi duzula?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Ziur zaude $(^Name)-ren ezabaketa laguntzailetik irten nahi duzula?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Belarusian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1059\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1251\n# RTL - anything else than RTL means LTR\n-\n# Translation by Sitnikov Vjacheslav [ glory_man@tut.by ]\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n $(^Name)\n# ^UninstallCaption\n $(^Name)\n# ^LicenseSubCaption\n: ˳ \n# ^ComponentsSubCaption\n:  \n# ^DirSubCaption\n:  \n# ^InstallingSubCaption\n:  \n# ^CompletedSubCaption\n:  \n# ^UnComponentsSubCaption\n:  \n# ^UnDirSubCaption\n:  \n# ^ConfirmSubCaption\n: \n# ^UninstallingSubCaption\n:  \n# ^UnCompletedSubCaption\n:  \n# ^BackBtn\n< &\n# ^NextBtn\n& >\n# ^AgreeBtn\n&\n# ^AcceptBtn\n &  ˳ \n# ^DontAcceptBtn\n &   ˳ \n# ^InstallBtn\n&\n# ^UninstallBtn\n&\n# ^CancelBtn\n\n# ^CloseBtn\n&\n# ^BrowseBtn\n& ...\n# ^ShowDetailsBtn\n&...\n# ^ClickNext\n  \"\",    .\n# ^ClickInstall\n  \"\"     .\n# ^ClickUninstall\n  \"\"     .\n# ^Name\n\n# ^Completed\n\n# ^LicenseText\n ,   ˳     $(^NameDA).     ˳ ,   \"\".\n# ^LicenseTextCB\n ,   ˳     $(^NameDA).     ˳ ,   . $_CLICK\n# ^LicenseTextRB\n ,   ˳     $(^NameDA).     ˳ ,      i. $_CLICK\n# ^UnLicenseText\n ,   ˳     $(^NameDA).     ˳ , ii  \"\".\n# ^UnLicenseTextCB\n ,   ˳     $(^NameDA).     ˳ ,   . $_CLICK\n# ^UnLicenseTextRB\n ,   ˳     $(^NameDA).     ˳ ,      i. $_CLICK\n# ^Custom\n\n# ^ComponentsText\n  , i   i. $_CLICK\n# ^ComponentsSubText1\n  i:\n# ^ComponentsSubText2_NoInstTypes\n  ,  i i:\n# ^ComponentsSubText2\n   ,  i i   :\n# ^UnComponentsText\n , i   i, i ii ,    , i   . $_CLICK\n# ^UnComponentsSubText1\n  :\n# ^UnComponentsSubText2_NoInstTypes\n   :\n# ^UnComponentsSubText2\n     :\n# ^DirText\n  $(^NameDA)   .  i   i , ii  \"\" i   . $_CLICK\n# ^DirSubText\n i\n# ^DirBrowseText\n   i $(^NameDA):\n# ^UnDirText\n i $(^NameDA)   .     i , ii  \"\" i   . $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n ,     i $(^NameDA):\n# ^SpaceAvailable\n\"  : \"\n# ^SpaceRequired\n\"   : \"\n# ^UninstallingText\n i $(^NameDA)   . $_CLICK\n# ^UninstallingSubText\n :\n# ^FileError\n    i: \\r\\n\\r\\n$0\\r\\n\\r\\nii  \"i\",  i ;\\r\\n\"\",    i  ;\\r\\n\"\",  i  .\n# ^FileError_NoIgnore\n    i: \\r\\n\\r\\n$0\\r\\n\\r\\nii  \"\",    i  ;\\r\\n\"\",  i .\n# ^CantWrite\n\" i: \"\n# ^CopyFailed\ni \n# ^CopyTo\n\"i  \"\n# ^Registering\n\"i: \"\n# ^Unregistering\n\" ii: \"\n# ^SymbolNotFound\n\"  i: \"\n# ^CouldNotLoad\n\" i: \"\n# ^CreateFolder\n\" : \"\n# ^CreateShortcut\n\" : \"\n# ^CreatedUninstaller\n\"  : \"\n# ^Delete\n\" : \"\n# ^DeleteOnReboot\n\"  i : \"\n# ^ErrorCreatingShortcut\n\"  : \" \n# ^ErrorCreating\n\" : \"\n# ^ErrorDecompressing\n  .   .\n# ^ErrorRegistering\n   (DLL)\n# ^ExecShell\n\"  : \" \n# ^Exec\n\": \"\n# ^Extract\n\": \"\n# ^ErrorWriting\n\":  i \"\n# ^InvalidOpcode\n :  i\n# ^NoOLE\n\" OLE : \" \n# ^OutputFolder\n\" i: \"\n# ^RemoveFolder\n\" : \"\n# ^RenameOnReboot\n\"  i : \"\n# ^Rename\n\": \"\n# ^Skipped\n\": \"\n# ^CopyDetails\ni i    \n# ^LogInstall\ni    i\n# byte\n\n# kilo\n\n# mega\n\n# giga\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Belarusian.nsh",
    "content": ";Language: Belarusian (1059)\n;Translated by Sitnikov Vjacheslav [ glory_man@tut.by ]\n\n!insertmacro LANGFILE \"Belarusian\" \"Byelorussian\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \" i   $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"   $(^NameDA)   .$\\r$\\n$\\r$\\n  i    ,     .          .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \" i   $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"   $(^NameDA)   .$\\r$\\n$\\r$\\n     ,   $(^NameDA)  .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"ii \"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \" ,   ˳    i $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"i    ii ,   $\\\"$\\\".     .\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"i    ii ,   .     . $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"i    ˳ ,      .     . $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"˳ \"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \" ,   ˳     $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"    ˳ ,   $\\\"$\\\".     . $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"    ˳ ,   .     . $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"    ˳ ,      .     . $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \" i $\\\"PageUp$\\\" i $\\\"PageDown$\\\"    .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \" ,  븢\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"  $(^NameDA),    .\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"  $(^NameDA),    .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"     ,    .\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"     ,    .\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"    $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"   \"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \" ,     $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \" \"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \",  ,    $(^NameDA)   ...\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \" \"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"  .\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"  .\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \",  ,    $(^NameDA)   ...\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"   .\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"   .\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"   $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \" $(^NameDA) .$\\r$\\n$\\r$\\n  $\\\"$\\\"     .\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"   $(^NameDA),   . ֳ     ?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"    $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \" $(^NameDA)    .$\\r$\\n$\\r$\\n  $\\\"$\\\"    .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"    $(^NameDA),   . ֳ     ?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \",   \"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \",   \"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"& $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&   \"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"   $\\\"$\\\"\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"    $\\\"$\\\"    .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"    $\\\"$\\\",     .       .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"  \"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \" $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \" $(^NameDA)   .\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"     $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"     $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Bosnian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n5146\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1250\n# RTL - anything else than RTL means LTR\n-\n# Translation by Salih CAVKIC, cavkic@skynet.be\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) Instalacija\n# ^UninstallCaption\n$(^Name) Uklanjanje\n# ^LicenseSubCaption\n: Licencno pravo koritenja\n# ^ComponentsSubCaption\n: Opcije instalacije\n# ^DirSubCaption\n: Izbor mape za instalaciju\n# ^InstallingSubCaption\n: Instaliranje\n# ^CompletedSubCaption\n: Zavreno\n# ^UnComponentsSubCaption\n: Opcije uklanjanja\n# ^UnDirSubCaption\n: Mapa uklanjanja\n# ^ConfirmSubCaption\n: Potvrda\n# ^UninstallingSubCaption\n: Uklanjanje\n# ^UnCompletedSubCaption\n: Zavreno uklanjanje\n# ^BackBtn\n< &Nazad\n# ^NextBtn\n&Dalje >\n# ^AgreeBtn\n&Prihvatam\n# ^AcceptBtn\n&Prihvatam uvjete licencnog ugovora\n# ^DontAcceptBtn\n&Ne prihvatam uvjete licencnog ugovora\n# ^InstallBtn\n&Instaliraj\n# ^UninstallBtn\n&Ukloni\n# ^CancelBtn\nOdustani\n# ^CloseBtn\n&Zatvori\n# ^BrowseBtn\n&Pregledaj...\n# ^ShowDetailsBtn\nPrikai &detalje\n# ^ClickNext\nPritisnite dugme 'Dalje' za nastavak.\n# ^ClickInstall\nPritisnite dugme 'Instaliraj' za poetak instalacije.\n# ^ClickUninstall\nPritisnite dugme 'Ukloni' za poetak uklanjanja.\n# ^Name\nIme\n# ^Completed\nZavreno\n# ^LicenseText\nMolim proitajte licencu prije instaliranja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite 'Prihvatam'.\n# ^LicenseTextCB\nMolim proitajte licencu prije instaliranja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, oznaite donji kvadrati. $_CLICK\n# ^LicenseTextRB\nMolim proitajte licencu prije instaliranja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite prvu donju opciju. $_CLICK\n# ^UnLicenseText\nMolim proitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite 'Prihvatam'.\n# ^UnLicenseTextCB\nMolim proitajte licencu prije uklanjanja programa $(^NameDA). Ako prihvatate sve uvjete ugovora, obiljeite donji kvadrati. $_CLICK\n# ^UnLicenseTextRB\nMolim proitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite prvu opciju ispod. $_CLICK\n# ^Custom\nPodeavanje\n# ^ComponentsText\nOznaite komponente koje elite instalirati. Instaliraju se samo oznaene komponente. Uklonite oznaku sa onih koje ne elite instalirati. $_CLICK\n# ^ComponentsSubText1\nIzaberite tip instalacije:\n# ^ComponentsSubText2_NoInstTypes\nOdaberite komponente za instalaciju:\n# ^ComponentsSubText2\nIli po izboru oznaite komponente koje elite instalirati:\n# ^UnComponentsText\nOznaite komponente koje elite ukloniti. Uklonite oznaku sa onih koje ne elite ukloniti. $_CLICK\n# ^UnComponentsSubText1\nIzaberite tip uklanjanja:\n# ^UnComponentsSubText2_NoInstTypes\nIzaberite komponente za uklanjanje:\n# ^UnComponentsSubText2\nIli po izboru odaberite komponente koje elite da uklonite:\n# ^DirText\nProgram $(^NameDA) e biti instaliran u sljedeu mapu. Za instalaciju na neku drugu mapu odaberite 'Pregledaj...' i odaberite drugu mapu. $_CLICK\n# ^DirSubText\nOdredina mapa\n# ^DirBrowseText\nIzaberite mapu u koju elite instalirati program $(^NameDA):\n# ^UnDirText\nProgram $(^NameDA) e biti uklonjen iz navedene mape. Za uklanjanje iz druge mape odaberite 'Pregledaj...' i oznaite drugu mapu. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nIzaberite mapu iz koje ete program $(^NameDA) ukloniti:\n# ^SpaceAvailable\n\"Slobodno prostora na disku: \"\n# ^SpaceRequired\n\"Potrebno prostora na disku: \"\n# ^UninstallingText\nProgram $(^NameDA) e biti uklonjen iz sljedee mape. $_CLICK\n# ^UninstallingSubText\nUklanjanje iz:\n# ^FileError\nGreka prilikom otvaranja datoteke za upisivanje: \\r\\n\\t\"$0\"\\r\\n\\\"Odustani\\\" za prekid instalacije,\\r\\n\\\"Ponovi\\\" za ponovni pokuaj upisivanja, ili\\r\\n\\\"Ignorii\\\" za zanemarenje te datoteke\n# ^FileError_NoIgnore\nGreka prilikom otvaranja datoteke za upisivanje: \\r\\n\\t\"$0\"\\r\\n\\\"Ponovi\\\" za ponovni pokuaj zapisivanja, ili\\r\\n\\\"Odustani\\\" za prekid instalacije\n# ^CantWrite\n\"Nemogue upisati: \"\n# ^CopyFailed\nGreka prilikom kopiranja\n# ^CopyTo\n\"Kopiraj u \"\n# ^Registering\n\"Prijava: \"\n# ^Unregistering\n\"Odjava: \"\n# ^SymbolNotFound\n\"Nemogue nai simbol: \"\n# ^CouldNotLoad\n\"Nemogue uitavanje: \"\n# ^CreateFolder\n\"Napravi mapu: \"\n# ^CreateShortcut\n\"Napravi preicu: \"\n# ^CreatedUninstaller\n\"Program za uklanjanje: \"\n# ^Delete\n\"Obrii datoteku: \"\n# ^DeleteOnReboot\n\"Obrii prilikom ponovnog pokretanja: \"\n# ^ErrorCreatingShortcut\n\"Greka prilikom kreiranja preica: \"\n# ^ErrorCreating\n\"Greka prilikom kreiranja: \"\n# ^ErrorDecompressing\nGreka prilikom otpakivanja podataka! Oteen instalacijski program?\n# ^ErrorRegistering\nGreka prilikom prijavljivanja DLLa\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Izvri: \"\n# ^Extract\n\"Otpakuj: \"\n# ^ErrorWriting\n\"Otpakivanje: greka upisivanja u datoteku \"\n# ^InvalidOpcode\nOteena instalacijska datoteka: neispravna opkoda\n# ^NoOLE\n\"Nema OLE za: \"\n# ^OutputFolder\n\"Izlazna mapa: \"\n# ^RemoveFolder\n\"Obrii mapu: \"\n# ^RenameOnReboot\n\"Preimenuj prilikom ponovnog startovanja: \"\n# ^Rename\n\"Preimenuj: \"\n# ^Skipped\n\"Preskoeno: \"\n# ^CopyDetails\nKopiraj detalje na Klembord\n# ^LogInstall\nLogiraj zapisnik procesa instalacije\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG\n\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Bosnian.nsh",
    "content": ";Language: Bosnian (5146)\n;By Salih avki, cavkic@skynet.be\n\n!insertmacro LANGFILE \"Bosnian\" \"Bosanski\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Dobrodoli u program za instalaciju $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Ovaj program e instalirati $(^NameDA) na Va sistem. $\\r$\\n$\\r$\\nPreporuujemo da neizostavno zatvorite sve druge otvorene programe prije nego to definitivno zaponete sa instaliranjem. To e omoguiti bolju nadogradnju odreenih sistemskih datoteka bez potrebe da Va raunar ponovo startujete. Instaliranje programa moete prekinuti pritiskom na dugme 'Odustani'.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Dobrodoli u postupak uklanjanja programa $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Ovaj e Vas vodi provesti kroz postupak uklanjanja programa $(^NameDA).$\\r$\\n$\\r$\\nPrije samog poetka, molim zatvorite program $(^NameDA) ukoliko je sluajno otvoren.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Licencni ugovor\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Molim proitajte licencni ugovor $(^NameDA) prije instalacije programa.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Ako prihvatate uslove licence, odaberite 'Prihvatam' za nastavak. Morate prihvatiti licencu za instalaciju programa $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Ako prihvatate uslove licence, oznaite donji kvadrati. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Ako prihvatate uslove licence, odaberite prvu donju opciju. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Licencni ugovor o pravu koritenja\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Molim proitajte licencu prije uklanjanja programa $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Ako prihvatate uslove licence, odaberite 'Prihvatam' za nastavak. Morate prihvatiti licencu za uklanjanje programa $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Ako prihvatate uslove licence, oznaite donji kvadrati. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Ako prihvatate uslove licence, odaberite prvu donju opciju. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Pritisnite 'Page Down' na tastaturi za ostatak licence.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Izbor komponenti za instalaciju\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Izaberite komponente programa $(^NameDA) koje elite instalirati.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Izbor komponenti za uklanjanje\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Izaberite komponente programa $(^NameDA) koje elite ukloniti.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Opis\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Postavite kursor od mia iznad komponente da biste vidjeli njezin opis.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Postavite kursor od mia iznad komponente da biste vidjeli njezin opis.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Odaberite odredite za instalaciju\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Odaberite mapu u koju elite instalirati program $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Izaberite polazite za uklanjanje\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Selektirajte mapu iz koje elite ukloniti program $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Instaliranje\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Molim priekajte na zavretak instalacije programa $(^NameDA).\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Kraj instalacije\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Instalacija je u potpunosti uspjeno zavrila.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalacija je prekinuta\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Instalacija nije zavrila uspjeno.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Uklanjanje\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Molim Vas priekajte da vodi zavri uklanjanje $(^NameDA) programa.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Uklanjanje je zavreno\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Uklanjanje je u potpunosti zavrilo uspjeno.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Uklanjanje je prekinuto\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Uklanjanje nije zavrilo uspjeno.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Dovravanje instalacije programa $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"Program $(^NameDA) je instaliran na Vae raunar.$\\r$\\n$\\r$\\nPritisnite dugme 'Kraj' za zavretak.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Raunar treba ponovno startovati za dovravanje instalacije programa $(^NameDA). elite li to uiniti sada?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Zavretak uklanjanja programa $(^NameDA) sa Vaeg sistema.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"Program $(^NameDA) je uklonjen sa Vaeg raunara.$\\r$\\n$\\r$\\nPritisnite dugme 'Kraj' za zatvaranje ovog prozora.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Va raunar trebate ponovno startovati da dovrite uklanjanje programa $(^NameDA). elite li da odmah sad ponovo startujete raunar?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Startuj raunar odmah sad\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Ponovno u pokrenuti raunar kasnije\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Pokreni program $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Prikai datoteku &Readme\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Kraj\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Izbor mape u Start meniju\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Izaberite ime za programsku mapu unutar Start menija.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Izaberite jednu mapu u Start meniju u kojoj elite da se kreiraju preice programa. Moete takoer unijeti ime za novu mapu ili selektirati ve postojeu.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Nemojte praviti preice\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Uklanjanje programa $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Program $(^NameDA) e biti uklonjen sa Vaeg raunara.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Jeste li sigurni da elite prekinuti instalaciju programa $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Jeste li sigurni da elite prekinuti uklanjanje $(^Name) programa?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Breton.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1150\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by KAD-Korvigello an Drouizig (drouizig@drouizig.org)\n# ^Branding\nReizhiad stalia Nullsoft %s\n# ^SetupCaption\nStalia ha keflunia $(^Name)\n# ^UninstallCaption\nDistalia $(^Name)\n# ^LicenseSubCaption\n: Aotre arvera\n# ^ComponentsSubCaption\n: Dibabo stalia\n# ^DirSubCaption\n: Kavlec'h stalia\n# ^InstallingSubCaption\n: O stalia ar restro\n# ^CompletedSubCaption\n: Echu eo\n# ^UnComponentsSubCaption\n: Dibabo distalia\n# ^UnDirSubCaption\n: Kavlec'h distalia\n# ^ConfirmSubCaption\n: Kadarna\n# ^UninstallingSubCaption\n: O tistalia ar restro\n# ^UnCompletedSubCaption\n: Echu eo\n# ^BackBtn\n< &Kent\n# ^NextBtn\n&War-lerc'h >\n# ^AgreeBtn\n&A-du emaon\n# ^AcceptBtn\n&Degemer holl dermo al lavaz emglev\n# ^DontAcceptBtn\n&Chom hep degemer termo al lavaz emglev\n# ^InstallBtn\n&Stalia\n# ^UninstallBtn\n&Distalia\n# ^CancelBtn\nNulla\n# ^CloseBtn\n&Serri\n# ^BrowseBtn\nF&urchal...\n# ^ShowDetailsBtn\nMuioc'h a &ditouro\n# ^ClickNext\nKlikit war  War-lerc'h  evit mont war-raok.\n# ^ClickInstall\nKlikit war  Stalia  evit kregi gant ar staliadur.\n# ^ClickUninstall\nKlikit war  Distalia  evit kregi gant an distaliadur.\n# ^Name\nAnv\n# ^Completed\nEchu eo\n# ^LicenseText\nBezit aketus en ur lenn an aotre arvera a-raok stalia $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war  A-du emaon .\n# ^LicenseTextCB\nBezit aketus en ur lenn an aotre arvera a-raok stalia $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war al log a-zindan. $_CLICK\n# ^LicenseTextRB\nBezit aketus en ur lenn an aotre arvera a-raok stalia $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, dizuzit an dibab kenta a-zindan. $_CLICK\n# ^UnLicenseText\nBezit aketus en ur lenn an aotre arvera a-raok distalia $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war  A-du emaon .\n# ^UnLicenseTextCB\nBezit aketus en ur lenn an aotre arvera a-raok distalia $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war al log a-zindan. $_CLICK\n# ^UnLicenseTextRB\nBezit aketus en ur lenn an aotre arvera a-raok distalia $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, diuzit an dibab kenta a-zindan. $_CLICK\n# ^Custom\nDiouzh ho kiz\n# ^ComponentsText\nDibabit an elfenno a fell deoc'h stalia pe diziuzit an elfenno a fell deoc'h leuskel a-gostez. $_CLICK\n# ^ComponentsSubText1\nDibabit pe seurt stalia a vo :\n# ^ComponentsSubText2_NoInstTypes\nDibabit an elfenno da stalia :\n# ^ComponentsSubText2\nPe dibabit an elfenno diret a fell deoc'h stalia :\n# ^UnComponentsText\nDibabit an elfenno a fell deoc'h distalia pe diziuzit an elfenno a fell deoc'h mirout. $_CLICK\n# ^UnComponentsSubText1\nDibabit peseurt distalia a vo :\n# ^UnComponentsSubText2_NoInstTypes\nDibabit an elfenno da zistalia :\n# ^UnComponentsSubText2\nPe dibabit an elfenno diret a fell deoc'h distalia :\n# ^DirText\nStaliet e vo $(^NameDA) gant ar goulev-ma er c'havlec'h da-heul. Mar fell deoc'h dibab ur c'havlec'h all, klikit war  Furchal  ha dibabit ur c'havlec'h all. $_CLICK\n# ^DirSubText\nKavlec'h bukenn\n# ^DirBrowseText\nDibabit ar c'havlec'h e vo diazezet $(^NameDA) enna :\n# ^UnDirText\nDistaliet e vo $(^NameDA) gant ar goulev-ma adalek ar c'havlec'h da heul. Ma fell deoc'h distalia adalek ur c'havlec'h all, klikit war  Furchal  ha diuzit ur c'havlec'h all. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nDiuzit ar c'havlec'h evit distalia $(^NameDA) adalek :\n# ^SpaceAvailable\n\"Egor kantenn vak : \"\n# ^SpaceRequired\n\"Egor kantenn rekis : \"\n# ^UninstallingText\nDistaliet e vo $(^NameDA) adalek ar c'havelec'h da-heul. $_CLICK\n# ^UninstallingSubText\nDistalia adalek :\n# ^FileError\nFazi en ur zigeri ur restr evit skriva : \\r\\n\\r\\n$0\\r\\n\\r\\nKlikit war  Paouez  evit paouez gant ar stalia,\\r\\n Adober  evit esea en-dro, pe\\r\\n Tremen  evit leuskel a-gostez ar restr-ma.\n# ^FileError_NoIgnore\nFazi en ur zigeri ur restr a-benn skriva : \\r\\n\\r\\n$0\\r\\n\\r\\nKlikit war  Adober  evit esaea en-dro, pe\\r\\nwar  Nulla  evit paouez gant ar stalia.\n# ^CantWrite\n\"N'haller ket skriva : \"\n# ^CopyFailed\nKopia faziet\n# ^CopyTo\n\"Kopia da \"\n# ^Registering\n\"Oc'h enskriva : \"\n# ^Unregistering\n\"O tienskriva : \"\n# ^SymbolNotFound\n\"N'haller ket kavout ur simbolenn : \"\n# ^CouldNotLoad\n\"N'haller ket karga : \"\n# ^CreateFolder\n\"Kroui kavlec'h : \"\n# ^CreateShortcut\n\"Kroui berradenn : \"\n# ^CreatedUninstaller\n\"Skoazeller distalia krouet : \"\n# ^Delete\n\"Dilemel restr : \"\n# ^DeleteOnReboot\n\"Dilemel en ur adloc'ha : \"\n# ^ErrorCreatingShortcut\n\"Fazi en ur groui berradenn : \"\n# ^ErrorCreating\n\"Fazi en ur groui : \"\n# ^ErrorDecompressing\nFazi en ur ziwaska stlenn ! Skoazeller stalia gwastet ?\n# ^ErrorRegistering\nFazi en ur enskriva an DLL\n# ^ExecShell\n\"ExecShell : \"\n# ^Exec\n\"Lasa : \"\n# ^Extract\n\"Eztenna : \"\n# ^ErrorWriting\n\"Eztenna : fazi en ur skriva restr \"\n# ^InvalidOpcode\nSkoazeller stalia gwastet : opcode direizh\n# ^NoOLE\n\"OLE ebet evit : \"\n# ^OutputFolder\n\"Kavlec'h ec'hank : \"\n# ^RemoveFolder\n\"Dilemel ar c'havlec'h : \"\n# ^RenameOnReboot\n\"Adenvel pa vez adloc'het : \"\n# ^Rename\n\"Adenvel : \"\n# ^Skipped\n\"Laosket a-gostez: \"\n# ^CopyDetails\nKopia ar munudo er golver\n# ^LogInstall\nTresa an argerzh stalia\n# ^Byte\nE\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Breton.nsh",
    "content": ";Language: Breton (1150)\n;By KAD-Korvigello An Drouizig\n\n!insertmacro LANGFILE \"Breton\" \"Brezhoneg\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Degemer mat e skoazeller stalia $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Sturiet e viot gant ar skoazeller-ma evit stalia $(^NameDA).$\\r$\\n$\\r$\\nGwelloc'h eo serri pep arload oberiant er reizhiad a-raok mont pelloc'h gant ar skoazeller-ma. Evel-se e c'heller nevesaat ar restro reizhiad hep rankout adloc'ha hoc'h urzhiataer.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Degemer mat er skoazeller distalia $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Sturiet e viot gant ar skoazeller-ma a-benn distalia $(^NameDA).$\\r$\\n$\\r$\\nEn em asurit n'eo ket laset $(^NameDA) a-raok mont pelloc'h gant an distalia.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Lavaz emglev\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Bezit aketus en ur lenn pep term eus al lavaz a-raok stalia $(^NameDA), mar plij.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Mar degemerit pep term eus al lavaz, klikit war  War-lerc'h . Ret eo deoc'h degemer al lavaz evit stalia $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Mar degemerit pep term eus al lavaz, klikit war al log a-zindan. Ret eo deoc'h degemer al lavaz a-benn stalia $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Mar degemerit pep term eus al lavaz, diuzit an dibab kenta a-zindan. Ret eo deoc'h degemer al lavaz a-benn stalia $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Lavaz emglev\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Trugarez da lenn al lavaz a-raok distalia $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Mar degemerit pep term eus al lavaz, klikit war  A-du emaon  evit kenderc'hel. Ret eo deoc'h degemer al lavaz evit distalia $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Mar degemerit pep term eus al lavaz, klikit war al log a-zindan. Ret eo deoc'h degemer al lavaz evit distalia $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Mar degemerit pep term eus al lavaz, dizuit an dibab kenta a-zindan. Ret eo deoc'h degemer al lavaz evit distalia $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Pouezit war  Pajenn a-raok  evit lenn ar pajenno eus al lavaz da-heul.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Dibab elfenno\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Dibabit pe elfenn(o) $(^NameDA) a fell deoc'h stalia.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Dibabit elfenno\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Dibabit pe elfenn(o) $(^NameDA) a fell deoc'h distalia.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Deskrivadenn\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Lakait ho logodenn a-zioc'h an elfenn evit gwelout he deskrivadenn.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Lakait ho logodenn a-zioc'h an elfenn evit gwelout he deskrivadenn.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Dibabit al lec'hiadur stalia\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Dibabit ar c'havlec'h ma vo lakaet $(^NameDA) enna.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Dibabit al lec'hiadur distalia\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Dibabit ar c'havlec'h e vo dilamet $(^NameDA) diouta.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"O stalia\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Gortozit mar plij, ema $(^NameDA) o veza staliet.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Echu eo gant ar stalia\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Kaset eo bet da benn mat ar stalia.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Stalia paouezet\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"N'eo ket bet kaset da benn mat ar stalia.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"O tistalia\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Gortozit mar plij, ema $(^NameDA) o veza distaliet.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Echu eo gant an distalia\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Gant berzh eo bet kaset da benn an distalia.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Distalia paouezet\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"N'eo ket bet kaset da benn mat an distalia.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Oc'h echui stalia $(^NameDA) gant ar skoazeller\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"Staliet eo bet $(^NameDA) war hoc'h urzhiataer.$\\r$\\n$\\r$\\nKlikit war  Echui  evit serri ar skoazeller-ma.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Ret eo hoc'h urzhiataer beza adloc'het evit ma vez kaset da benn stalia $(^NameDA). Ha fellout a ra deoc'h adloc'ha diouzhtu ?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Oc'h echui distalia $(^NameDA) gant ar skoazeller\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"Distaliet eo bet $(^NameDA) diouzh hoc'h urzhiataer.$\\r$\\n$\\r$\\nKlikit war  Echui  evit serri ar skoazeller-ma.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Ret eo hoc'h urzhiataer beza adloc'het evit ma vez kaset da benn distalia $(^NameDA). Ha fellout a ra deoc'h adloc'ha diouzhtu ?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Adloc'ha diouzhtu\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Fellout a ra din adloc'ha diwezatoc'h dre zorn\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Lasa $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Diskouez ar restr Malennit\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Echui\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Diskouez kavlec'h al Laser loc'ha\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Dibabit ur c'havlec'h Laser loc'ha evit berradenno $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Diuzit ar c'havlec'h Laser loc'ha e vo savet enna berradenno ar goulevio. Gallout a rit ingal rei un anv evit sevel ur c'havlec'h nevez.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Chom hep sevel berradenno\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Distalia $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Dilemel $(^NameDA) adalek hoc'h urzhiataer.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Ha sur oc'h e fell deoc'h kuitaat stalia $(^Name) ?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Ha sur oc'h e fell deoc'h kuitaat distalia $(^Name) ?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Bulgarian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1026\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1251\n# RTL - anything else than RTL means LTR\n-\n# Translation by Asparouh Kalyandjiev <acnapyx@computers.bg>\n# Updated v2 to v6 by Plamen Penkov <plamen71@hotmail.com>\n# Updated by   (DumpeR)<dumper@data.bg>\n# \n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n  $(^Name) \n# ^UninstallCaption\n  $(^Name) \n#^LicenseSubCaption\n:  \n#^ComponentsSubCaption\n:   \n# ^DirSubCaption\n:   \n#^InstallingSubCaption\n: \n#^CompletedSubCaption\n: \n# ^UnComponentsSubCaption\n:   \n# ^UnDirSubCaption\n:   \n# ^ConfirmSubCaption\n: \n#^UninstallingSubCaption\n: \n#^UnCompletedSubCaption\n: \n# ^BackBtn\n< &\n#^NextBtn\n& >\n# ^AgreeBtn\n&\n# ^AcceptBtn\n&      .\n# ^DontAcceptBtn\n&       .\n# ^InstallBtn\n&\n#^UninstallBtn\n&\n# ^CancelBtn\n&\n#^CloseBtn\n&\n#^BrowseBtn\n&...\n#^ShowDetailsBtn\n&\n# ^ClickNext\n \"\",   .\n# ^ClickInstall\n \"\",    .\n# ^ClickUninstall\n \"\",    .\n# ^Name\n\n#^Completed\n\n# ^LicenseText\n       $(^NameDA).      ,  \"\".\n# ^LicenseTextCB\n       $(^NameDA).      ,     -. $_CLICK\n# ^LicenseTextRB\n       $(^NameDA).      ,    -. $_CLICK\n# ^UnLicenseText\n       $(^NameDA).      ,  \"\".\n# ^UnLicenseTextCB\n       $(^NameDA).      ,     -. $_CLICK\n# ^UnLicenseTextRB\n       $(^NameDA).      ,    -. $_CLICK\n# ^Custom\n  \n#^ComponentsText\n ,     . $_CLICK\n#^ComponentsSubText1\n  :\n#^ComponentsSubText2_NoInstTypes\n :\n#^ComponentsSubText2\n  ,     :\n# ^UnComponentsText\n   ,    ,          . $_CLICK\n# ^UnComponentsSubText1\n   :\n# ^UnComponentsSubText2_NoInstTypes\n   :\n# ^UnComponentsSubText2\n,     :\n# ^DirText\n   $(^NameDA)   .      ,  \"\"    . $_CLICK\n# ^DirSubText\n \n# ^DirBrowseText\n ,      $(^NameDA):\n# ^UnDirText\n   $(^NameDA)   .      ,  \"\"    . $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n       $(^NameDA):\n# ^SpaceAvailable\n\" : \"\n#^SpaceRequired\n\" : \"\n# ^UninstallingText\n$(^NameDA)      . $_CLICK\n# ^UninstallingSubText\n :\n# ^FileError\n      : \\r\\n\\t\"$0\"\\r\\n \"\",    , \"\",      \"\",     \n# ^FileError_NoIgnore\n      : \\r\\n\\t\"$0\"\\r\\n \"\",      \"\",    .\n# ^CantWrite\n\"  : \"\n#^CopyFailed\n \n# ^CopyTo\n\"  \"\n# ^Registering\n\" : \"\n# ^Unregistering\n\" : \"\n#^SymbolNotFound\n\"   : \"\n# ^CouldNotLoad\n\"  : \"\n# ^CreateFolder\n\"  : \"\n# ^CreateShortcut\n\"   : \"\n#^CreatedUninstaller\n\"    : \"\n# ^Delete\n\" : \"\n#^DeleteOnReboot\n\"  : \"\n#^ErrorCreatingShortcut\n\"     : \"\n#^ErrorCreating\n\"   : \"\n# ^ErrorDecompressing\n    !     .\n# ^ErrorRegistering\n    DLL\n#^ExecShell\n\"ExecShell: \"\n#^Exec\n\" : \"\n#^Extract\n\" : \"\n#^ErrorWriting\n\" :      \"\n#^InvalidOpcode\n  :    \n# ^NoOLE\n\" OLE : \"\n#^OutputFolder\n\"  : \"\n#^RemoveFolder\n\"  : \"\n#^RenameOnReboot\n\"  : \"\n# ^Rename\n\" : \"\n#^Skipped\n\" : \"\n# ^CopyDetails\n    \n# ^LogInstall\n    \n# ^Byte\n\n# ^Kilo\n \n# ^Mega\n \n# ^Giga\n  "
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Bulgarian.nsh",
    "content": ";Language: Bulgarian (1026)\n;Translated by Asparouh Kalyandjiev [acnapyx@sbline.net]\n;Review and update from v1.63 to v1.68 by Plamen Penkov [plamen71@hotmail.com]\n;Updated by   (DumpeR) [dumper@data.bg]\n;\n\n!insertmacro LANGFILE \"Bulgarian\" \"Bulgarian\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"       $(^NameDA)!\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"   $(^NameDA)   .$\\r$\\n$\\r$\\n      ,   .          ,     .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"       $(^NameDA)!\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"      $(^NameDA)   .$\\r$\\n$\\r$\\n  ,    $(^NameDA)     .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"       .\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"    ,  $\\\"$\\\",   .    ,    $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"    ,     -.    ,    $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"    ,    -.    ,    $(^NameDA) $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"        $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"    ,  $\\\"$\\\"   .    ,    $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"    ,     -.    ,    $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"    ,    -.    ,    $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"  $\\\"Page Down$\\\",       .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"    $(^NameDA)   .\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"    $(^NameDA)   .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"     ,     .\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"     ,     .\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"    \"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \" ,      $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"    \"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \" ,      $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \",     $(^NameDA)...\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \" .\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"  .\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \" .\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"   .\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \",     $(^NameDA)...\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"  .\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \" .\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"   .\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"      $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"  $(^NameDA)  .$\\r$\\n$\\r$\\n  $\\\"$\\\",    .\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"    ,      $(^NameDA).     ?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"      $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \" $(^NameDA)     .$\\r$\\n$\\r$\\n $\\\"$\\\"     .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"     ,       $(^NameDA).     ?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \",  \"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \",   -\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \" $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"  $\\\"ReadMe$\\\"\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"     $\\\"$\\\"\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"    $\\\"$\\\"     .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"    $\\\"$\\\",         .      ,     .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"   \"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"  $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"  $(^NameDA)   .\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"  ,       $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"  ,       $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Catalan.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1027\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by falanko\n# Corrections by Toni Hermoso Pulido\n# ^Branding\nSistema d'installaci de Nullsoft %s\n# ^SetupCaption\nInstallaci de l'aplicaci $(^Name)\n# ^UninstallCaption\nDesinstallaci de l'aplicaci $(^Name)\n# ^LicenseSubCaption\n: Acord de llicncia\n# ^ComponentsSubCaption\n: Opcions d'installaci\n# ^DirSubCaption\n: Carpeta d'installaci\n# ^InstallingSubCaption\n: S'est installant\n# ^CompletedSubCaption\n: S'ha acabat\n# ^UnComponentsSubCaption\n: Opcions de desinstallaci\n# ^UnDirSubCaption\n: Carpeta de desinstallaci\n# ^ConfirmSubCaption\n: Confirmaci\n# ^UninstallingSubCaption\n: S'est desinstallant\n# ^UnCompletedSubCaption\n: No s'ha acabat\n# ^BackBtn\n< En&rere\n# ^NextBtn\nEn&davant >\n# ^AgreeBtn\nHi estic d'a&cord\n# ^AcceptBtn\n&Accepto els termes de l'acord de llicncia\n# ^DontAcceptBtn\n&No accepto els termes de l'acord de llicncia\n# ^InstallBtn\n&Installa\n# ^UninstallBtn\n&Desinstalla\n# ^CancelBtn\n&Cancella\n# ^CloseBtn\n&Tanca\n# ^BrowseBtn\n&Navega...\n# ^ShowDetailsBtn\n&Mostra els detalls\n# ^ClickNext\nFeu clic a Endavant per a continuar.\n# ^ClickInstall\nFeu clic a Installa per a iniciar la installaci.\n# ^ClickUninstall\nFeu clic a Desinstalla per a iniciar la desinstallaci.\n# ^Name\nNom\n# ^Completed\nS'ha acabat\n# ^LicenseText\nReviseu l'acord de llicncia abans d'installar l'aplicaci $(^NameDA). Si accepteu tots els termes de l'acord, feu clic a Hi estic d'acord.\n# ^LicenseTextCB\nReviseu l'acord de llicncia abans d'installar l'aplicaci $(^NameDA). Si accepteu tots els termes de l'acord, activeu la casella de sota. $_CLICK\n# ^LicesnseTextRB\nReviseu l'acord de llicncia abans d'installar l'aplicaci $(^NameDA). Si accepteu tots els termes de l'acord, seleccioneu la primera opci de sota. $_CLICK\n# ^UnLicenseText\nReviseu l'acord de llicncia abans de desinstallar l'aplicaci $(^NameDA). Si accepteu tots els termes de l'acord, feu clic a Hi estic d'acord.\n# ^UnLicenseTextCB\nReviseu l'acord de llicncia abans de desinstallar l'aplicaci $(^NameDA). Si accepteu tots els termes de l'acord, activeu la la casella de sota. $_CLICK\n# ^UnLicesnseTextRB\nReviseu l'acord de llicncia abans de desinstallar l'aplicaci $(^NameDA). Si accepteu tots els termes de l'acord, seleccioneu la primera opci de sota. $_CLICK\n# ^Custom\nPersonalitzada\n# ^ComponentsText\nActiveu els components que voleu installar i desactiveu els que no. $_CLICK\n# ^ComponentsSubText1\nSeleccioneu el tipus d'installaci:\n# ^ComponentsSubText2_NoInstTypes\nSeleccioneu els components per installar:\n# ^ComponentsSubText2\nO b, seleccioneu els components opcionals que desitgssiu installar:\n# ^UnComponentsText\nActiveu els components que voleu desinstallar i desactiveu els que no. $_CLICK\n# ^UnComponentsSubText1\nSeleccioneu el tipus de desinstallaci:\n# ^UnComponentsSubText2_NoInstTypes\nSeleccioneu els components per desinstallar:\n# ^UnComponentsSubText2\nO b, seleccioneu els components opcionals per desinstallar:\n# ^DirText\nEl programa d'installaci installar l'aplicaci $(^NameDA) en la segent carpeta. Per a installar-lo en una carpeta diferent, feu clic a Navega i seleccioneu-ne una altra. $_CLICK\n# ^DirSubText\nCarpeta de destinaci\n# ^DirBrowseText\nSeleccioneu la carpeta on s'installar l'aplicaci $(^NameDA):\n# ^UnDirText\nEl programa d'installaci desinstallar l'aplicaci $(^NameDA) de la segent carpeta. Per a desinstallar-lo d'una carpeta diferent, feu clic a Navega i seleccioneu-ne una altra. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nSeleccioneu la carpeta des d'on es desinstallar l'aplicaci $(^NameDA):\n# ^SpaceAvailable\n\"Espai lliure: \"\n# ^SpaceRequired\n\"Espai necessari: \"\n# ^UninstallingText\nEs desinstallar l'aplicaci $(^NameDA) de la segent carpeta. $_CLICK\n# ^UninstallingSubTex\nS'est desinstallant de:\n# ^FileError\nS'ha produt un error en obrir el fitxer en mode d'escriptura: \\r\\n\\t\"$0\"\\r\\nFeu clic a Abandona per a aturar la installaci,\\r\\nReintenta per a tornar-ho a provar, o\\r\\Ignora per a ometre aquest fitxer.\n# ^FileError_NoIgnore\nS'ha produt un error en obrir el fitxer en mode d'escriptura: \\r\\n\\t\"$0\"\\r\\nFeu clic a Reintenta per a tornar-ho a provar, o\\r\\Cancella per a aturar la installaci.\n# ^CantWrite\n\"No s'ha pogut escriure: \"\n# ^CopyFailed\nHa fallat la cpia\n# ^CopyTo\n\"Copia a \"\n# ^Registering\n\"S'esta registrant:\"\n# ^Unregistering\n\"S'est suprimint el registre: \"\n# ^SymbolNotFound\n\"No s'ha trobat el smbol: \"\n# ^CouldNotLoad\n\"No s'ha pogut carregar: \"\n# ^CreateFolder\n\"Crea la carpeta: \"\n# ^CreateShortcut\n\"Crea la drecera: \"\n# ^CreatedUninstaller\n\"S'ha creat el desinstallador: \"\n# ^Delete\n\"S'ha suprimit el fitxer: \"\n# ^DeleteOnReboot\n\"Suprimeix en reiniciar: \"\n# ^ErrorCreatingShortcut\n\"S'ha produt un error en crear la drecera: \"\n# ^ErrorCreating\nS'ha produt un error en crear:\n# ^ErrorDecompressing\nS'ha produt un error en descomprimir les dades! L'installador est corrupte?\n# ^ErrorRegistering\nS'ha produt un error en registrar una DLL\n# ^ExecShell\n\"Executa l'ordre: \"\n# ^Exec\n\"Executa:\"\n# ^Extract\n\"Extreu: \"\n# ^ErrorWriting\n\"Extreu: s'ha produt un error en escriure el fitxer \"\n# ^InvalidOpcode\nL'installador est corrupte: el codi d'operaci no s vlid\n# ^NoOLE\n\"No hi ha OLE per a: \"\n# ^OutputFolder\n\"Carpeta de sortida: \"\n# ^RemoveFolder\n\"Suprimeix la carpeta: \"\n# ^RenameOnReboot\n\"Reanomena en reiniciar: \"\n# ^Rename\n\"Reanomena: \"\n# ^Skipped\n\"S'ha oms: \"\n# ^CopyDetails\nCopia els detalls al porta-retalls\n# ^LogInstall\nRegistra el procs d'installaci\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Catalan.nsh",
    "content": ";Language: Catalan (1027)\n;By falanko, corrections by Toni Hermoso Pulido\n\n!insertmacro LANGFILE \"Catalan\" \"Catal\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Benvinguts a l'auxiliar d'installaci de l'aplicaci $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Aquest auxiliar us guiar durant el procs d'installaci de l'aplicaci $(^NameDA).$\\r$\\n$\\r$\\nEs recomana tancar la resta d'aplicacions abans de comenar la installaci. Aix permetr al programa d'instalaci actualitzar fitxers del sistema rellevants sense haver de reiniciar l'ordinador.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Benvinguts a l'auxiliar de desinstallaci de l'aplicaci $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Aquest auxiliar us guiar a travs de la desinstallaci de l'aplicaci $(^NameDA).$\\r$\\n\\rAbans de comenar la desinstallaci, assegureu-vos que l'aplicaci $(^NameDA) no s'est executant.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Acord de Llicncia\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Reviseu els termes de la llicncia abans d'installar l'aplicaci $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Si accepteu tots els termes de l'acord, premeu Hi estic d'acord per a continuar. Heu d'acceptar l'acord per a poder installar l'aplicaci $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Si accepteu tots els termes de l'acord, activeu la casella de sota. Heu d'acceptar l'acord per poder installar l'aplicaci $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Si accepteu tots els termes de l'acord, seleccioneu la primera opci de sota. Heu d'acceptar l'acord per a poder installar $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Acord de llicncia\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Reviseu els termes de la llicncia abans de desinstallar l'aplicaci $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Si accepteu tots els termes de l'acord, premeu Hi estic d'Acord per a continuar. Heu d'acceptar l'acord per a poder desinstallar l'aplicaci $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Si accepteu tots els termes de l'acord, activeu la casella de sota. Heu d'acceptar l'acord per a poder desinstallar l'aplicaci $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Si accepteu tots els termes de l'acord, seleccioneu la primera opci de sota. Heu d'acceptar l'acord per a poder desinstallar l'aplicaci $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Premeu AvPg per a veure la resta de l'acord.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Selecci de components\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Seleccioneu quines caracterstiques de l'aplicaci $(^NameDA) desitgeu installar.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Selecci de components\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Seleccioneu quines caracterstiques de l'aplicaci $(^NameDA) desitgeu desinstallar.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Descripci\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Situeu el ratol damunt d'un component per a veure'n la descripci.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Situeu el ratol damunt d'un component per a veure'n la descripci.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Trieu una ubicaci d'installaci\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Trieu la carpeta on installar-hi l'aplicaci $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Trieu la ubicaci de desinstallaci\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Trieu la carpeta d'on desinstallar l'aplicaci $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"S'est installant\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Si us plau, espereu mentre l'aplicaci $(^NameDA) s'installa.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"S'ha acabat la installaci\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"La installaci ha acabat correctament.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"S'ha abandonat la installaci\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"La installaci no ha acabat correctament.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"S'est desinstallant\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Si us plau, espereu mentre l'aplicaci $(^NameDA) es desinstalla.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"S'ha acabat la desinstallaci\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"La desinstallaci s'ha realitzat correctament.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"S'ha abandonat la desinstallaci\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"La desinstallaci no ha acabat correctament.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"S'est acabant l'auxiliar d'installaci de l'aplicaci $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"L'aplicaci $(^NameDA) s'ha installat a l'ordinador.$\\r$\\n$\\r$\\nFeu clic a Finalitza per a tancar aquest auxiliar.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Cal reiniciar l'ordinador perqu pugui acabar-se la installaci de l'aplicaci $(^NameDA). Voleu reiniciar-lo ara?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"S'est acabant l'auxiliar de desinstallaci de l'aplicaci $(^NameDA).\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"L'aplicaci $(^NameDA) s'ha desinstallat de l'ordinador.$\\r$\\n$\\r$\\nFeu clic a Finalitza per a tancar aquest auxiliar.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Cal reiniciar l'ordinador perqu pugui acabar-se la desinstallaci de l'aplicaci $(^NameDA). Voleu reiniciar-lo ara?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Reinicia ara\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Reinicia ms tard manualment\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"Executa l'aplicaci $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Mostra el Llegeix-me\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Finalitza\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Tria la carpeta del men Inicia\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Tria una carpeta del men Inicia per a les dreceres de l'aplicaci $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Seleccioneu la carpeta del Men Inicia en la que hi vulgueu crear les dreceres del programa. Podeu introduir-hi un altre nom si voleu crear una carpeta nova.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"No cres les dreceres\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Desinstalla l'aplicaci $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Suprimeix l'aplicaci $(^NameDA) de l'ordinador.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Esteu segur que voleu sortir del programa d'installaci de l'aplicaci $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Esteu segur que voleu sortir del programa de desinstallaci de l'aplicaci $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Croatian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1050\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1250\n# RTL - anything else than RTL means LTR\n-\n# Translation by Igor Ostriz\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) Instalacija\n# ^UninstallCaption\n$(^Name) Uklanjanje\n# ^LicenseSubCaption\n: Licenenni uvjeti\n# ^ComponentsSubCaption\n: Instalacijske opcije\n# ^DirSubCaption\n: Instalacijska mapa\n# ^InstallingSubCaption\n: Instaliranje\n# ^CompletedSubCaption\n: Zavreno\n# ^UnComponentsSubCaption\n: Opcije uklanjanja\n# ^UnDirSubCaption\n: Mapa uklanjanja\n# ^ConfirmSubCaption\n: Potvrda\n# ^UninstallingSubCaption\n: Uklanjanje\n# ^UnCompletedSubCaption\n: Zavreno\n# ^BackBtn\n< &Nazad\n# ^NextBtn\n&Dalje >\n# ^AgreeBtn\n&Prihvaam\n# ^AcceptBtn\n&Prihvaam uvjete licennog ugovora\n# ^DontAcceptBtn\n&Ne prihvaam uvjete licennog ugovora\n# ^InstallBtn\n&Instaliraj\n# ^UninstallBtn\n&Ukloni\n# ^CancelBtn\nOdustani\n# ^CloseBtn\n&Zatvori\n# ^BrowseBtn\n&Pregledaj...\n# ^ShowDetailsBtn\nPrikai &detalje\n# ^ClickNext\nZa nastavak odaberite 'Dalje'.\n# ^ClickInstall\nZa poetak instalacije odaberite 'Instaliraj'.\n# ^ClickUninstall\nZa poetak uklanjanja odaberite 'Ukloni'.\n# ^Name\nIme\n# ^Completed\nZavreno\n# ^LicenseText\nMolim proitajte licencu prije instalacije programa $(^NameDA). Ukoliko prihvaate sve uvjete ugovora, odaberite 'Prihvaam'.\n# ^LicenseTextCB\nMolim proitajte licencu prije instalacije programa $(^NameDA). Ukoliko prihvaate sve uvjete ugovora, oznaite donji kvadrati. $_CLICK\n# ^LicenseTextRB\nMolim proitajte licencu prije instalacije programa $(^NameDA). Ukoliko prihvaate sve uvjete ugovora, odaberite prvu donju opciju. $_CLICK\n# ^UnLicenseText\nMolim proitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvaate sve uvjete ugovora, odaberite 'Prihvaam'.\n# ^UnLicenseTextCB\nMolim proitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvaate sve uvjete ugovora, oznaite donji kvadrati. $_CLICK\n# ^UnLicenseTextRB\nMolim proitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvaate sve uvjete ugovora, odaberite prvu donju opciju. $_CLICK\n# ^Custom\nPosebna\n# ^ComponentsText\nOznaite komponente koje elite instalirati i uklonite oznaku s onih koje ne elite instalirati. $_CLICK\n# ^ComponentsSubText1\nIzaberite tip instalacije:\n# ^ComponentsSubText2_NoInstTypes\nOdaberite komponente za instalaciju:\n# ^ComponentsSubText2\nIli po izboru oznaite komponente koje elite instalirati:\n# ^UnComponentsText\nOznaite komponente koje elite ukloniti i uklonite oznaku s onih koje ne elite ukloniti. $_CLICK\n# ^UnComponentsSubText1\nIzaberite tip uklanjanja:\n# ^UnComponentsSubText2_NoInstTypes\nOdaberite komponente za uklanjanje:\n# ^UnComponentsSubText2\nIli po izboru oznaite komponente koje elite ukloniti:\n# ^DirText\nProgram $(^NameDA) e biti instaliran u slijedeu mapu. Za instalaciju na drugo odredite odaberite 'Pregledaj' i oznaite drugu mapu. $_CLICK\n# ^DirSubText\nOdredina mapa\n# ^DirBrowseText\nOdaberite mapu u koju elite instalirati program $(^NameDA):\n# ^UnDirText\nProgram $(^NameDA) e biti uklonjen iz slijedee mape. Za uklanjanje s drugog mjesta odaberite 'Pregledaj' i oznaite drugu mapu. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nMapa iz koje e program $(^NameDA) biti uklonjen:\n# ^SpaceAvailable\n\"Slobodno prostora na disku: \"\n# ^SpaceRequired\n\"Potrebno prostora na disku: \"\n# ^UninstallingText\nProgram $(^NameDA) e biti uklonjen iz slijedee mape. $_CLICK\n# ^UninstallingSubText\nUklanjam iz:\n# ^FileError\nGreka prilikom otvaranja datoteke za zapisivanje: \\r\\n\\t\"$0\"\\r\\n\\\"Abort\\\" za prekid instalacije,\\r\\n\\\"Retry\\\" za ponovni pokuaj zapisivanja, ili\\r\\n\\\"Ignore\\\" za zanemarenje te datoteke\n# ^FileError_NoIgnore\nGreka prilikom otvaranja datoteke za zapisivanje: \\r\\n\\t\"$0\"\\r\\n\\\"Retry\\\" za ponovni pokuaj zapisivanja, ili\\r\\n\\\"Cancel\\\" za prekid instalacije\n# ^CantWrite\n\"Ne mogu zapisati: \"\n# ^CopyFailed\nGreka prilikom kopiranja\n# ^CopyTo\n\"Kopiraj u \"\n# ^Registering\n\"Prijava: \"\n# ^Unregistering\n\"Odjava: \"\n# ^SymbolNotFound\n\"Ne mogu nai simbol: \"\n# ^CouldNotLoad\n\"Ne mogu uitati: \"\n# ^CreateFolder\n\"Stvori mapu: \"\n# ^CreateShortcut\n\"Stvori preac: \"\n# ^CreatedUninstaller\n\"Program za uklanjanje: \"\n# ^Delete\n\"Obrii datoteku: \"\n# ^DeleteOnReboot\n\"Obrii prilikom ponovnog pokretanja: \"\n# ^ErrorCreatingShortcut\n\"Greka prilikom stvaranja preaca: \"\n# ^ErrorCreating\n\"Greka prilikom stvaranja: \"\n# ^ErrorDecompressing\nGreka dekompresije podataka! Oteena instalacijska datoteka?\n# ^ErrorRegistering\nGreka prilikom prijavljivanja DLLa\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Izvri: \"\n# ^Extract\n\"Otpakiraj: \"\n# ^ErrorWriting\n\"Otpakiranje: greka zapisivanja u datoteku \"\n# ^InvalidOpcode\nOteena instalacijska datoteka: neispravni opkod\n# ^NoOLE\n\"Nema OLE za: \"\n# ^OutputFolder\n\"Izlazna mapa: \"\n# ^RemoveFolder\n\"Obrii mapu: \"\n# ^RenameOnReboot\n\"Preimenuj prilikom ponovnog pokretanja: \"\n# ^Rename\n\"Preimenuj: \"\n# ^Skipped\n\"Preskoeno: \"\n# ^CopyDetails\nKopiraj detalje u Clipboard\n# ^LogInstall\nLogiraj instalacijski proces\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Croatian.nsh",
    "content": ";Language: Croatian (1050)\n;By Igor Ostriz\n\n!insertmacro LANGFILE \"Croatian\" \"Hrvatski\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Dobrodoli u instalaciju programa $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Instalacija programa $(^NameDA) na Vae raunalo sastoji se od nekoliko jednostavnih koraka kroz koje e Vas provesti ovaj arobnjak.$\\r$\\n$\\r$\\nPreporuamo zatvaranje svih ostalih aplikacija prije samog poetka instalacije. To e omoguiti nadogradnju nekih sistemskih datoteka bez potrebe za ponovnim pokretanjem Vaeg raunala. U svakom trenutku instalaciju moete prekinuti pritiskom na 'Odustani'.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Dobrodoli u postupak uklanjanja programa $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Ovaj e Vas arobnjak provesti kroz postupak uklanjanja programa $(^NameDA).$\\r$\\n$\\r$\\nPrije samog poetka, molim zatvorite program $(^NameDA) ukoliko je sluajno otvoren.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Licenni ugovor\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Molim proitajte licencu prije instalacije programa $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Ukoliko prihvaate uvjete licence, odaberite 'Prihvaam' za nastavak. Morate prihvatiti licencu za instalaciju programa $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Ukoliko prihvaate uvjete licence, oznaite donji kvadrati. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Ukoliko prihvaate uvjete licence, odaberite prvu donju opciju. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Licenni ugovor\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Molim proitajte licencu prije uklanjanja programa $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Ukoliko prihvaate uvjete licence, odaberite 'Prihvaam' za nastavak. Morate prihvatiti licencu za uklanjanje programa $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Ukoliko prihvaate uvjete licence, oznaite donji kvadrati. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Ukoliko prihvaate uvjete licence, odaberite prvu donju opciju. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"'Page Down' za ostatak licence.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Izbor komponenti\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Odaberite komponente programa $(^NameDA) koje elite instalirati.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Izbor komponenti\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Odaberite koje komponente programa $(^NameDA) elite ukloniti.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Opis\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Postavite pokaziva iznad komponente za njezin opis.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Postavite pokaziva iznad komponente za njezin opis.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Odaberite odredite za instalaciju\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Odaberite mapu u koju elite instalirati program $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Odaberite polazite za uklanjanje\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Odaberite mapu iz koje elite ukloniti program $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Instaliranje\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Molim priekajte na zavretak instalacije programa $(^NameDA).\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Kraj instalacije\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Instalacija je u potpunosti zavrila uspjeno.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalacija je prekinuta\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Instalacija nije zavrila uspjeno.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Uklanjanje\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Molim priekajte na zavretak uklanjanja programa $(^NameDA).\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Uklanjanje zavreno\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Uklanjanje je u potpunosti zavrilo uspjeno.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Uklanjanje je prekinuto\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Uklanjanje nije zavrilo uspjeno.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Dovrenje instalacije programa $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"Program $(^NameDA) je instaliran na Vae raunalo.$\\r$\\n$\\r$\\nOdaberite 'Kraj' za zavretak.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Vae raunalo treba ponovno pokrenuti za dovrenje instalacije programa $(^NameDA). elite li to uiniti sada?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Zavretak uklanjanja programa $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"Program $(^NameDA) je uklonjen s Vaeg raunala.$\\r$\\n$\\r$\\nOdaberite 'Kraj' za zatvaranje ovog arobnjaka.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Vae raunalo treba ponovno pokrenuti za dovrenje postupka uklanjanja programa $(^NameDA). elite li to uiniti sada?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Ponovno pokreni raunalo sada\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Ponovno u pokrenuti raunalo kasnije\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Pokreni program $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Prikai &Readme\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Kraj\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Izbor mape u Start meniju\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Odaberite ime za programsku mapu unutar Start menija.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Program e pripadati odabranoj programskoj mapi u Start meniju. Moete odrediti novo ime za mapu ili odabrati ve postojeu.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Nemoj napraviti preace\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Uklanjanje programa $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Program $(^NameDA) e biti uklonjen s Vaeg raunala.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Jeste li sigurni da elite prekinuti instalaciju programa $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Jeste li sigurni da elite prekinuti uklanjanje programa $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Czech.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1029\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1250\n# RTL - anything else than RTL means LTR\n-\n# Translation by SELiCE (ls@selice.cz - http://ls.selice.cz)\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\nInstalovat $(^Name)\n# ^UninstallCaption\nOdinstalovat $(^Name)\n# ^LicenseSubCaption\n: Licenn ujednn\n# ^ComponentsSubCaption\n: Monosti instalace\n# ^DirSubCaption\n: Umstn instalace\n# ^InstallingSubCaption\n: Instaluje se\n# ^CompletedSubCaption\n: Dokoneno\n# ^UnComponentsSubCaption\n: Monosti odinstalace\n# ^UnDirSubCaption\n: Odinstalovat adres\n# ^ConfirmSubCaption\n: Potvrzen\n# ^UninstallingSubCaption\n: Odinstalovn\n# ^UnCompletedSubCaption\n: Dokoneno\n# ^BackBtn\n< &Zpt\n# ^NextBtn\n&Dal >\n# ^AgreeBtn\nSouhl&asm\n# ^AcceptBtn\nSouhl&asm s podmnkami Licennho ujednn\n# ^DontAcceptBtn\n&Nesouhlasm s podmnkami Licennho ujednn\n# ^InstallBtn\n&Instalovat\n# ^UninstallBtn\n&Odinstalovat\n# ^CancelBtn\nStorno\n# ^CloseBtn\n&Zavt\n# ^BrowseBtn\nP&rochzet...\n# ^ShowDetailsBtn\nZobrazit &detaily\n# ^ClickNext\nPro pokraovn kliknte na 'Dal'.\n# ^ClickInstall\nKliknte na 'Instalovat' pro zahjen instalace.\n# ^ClickUninstall\nKliknte na 'Odinstalovat' pro zahjen odinstalace.\n# ^Name\nNzev\n# ^Completed\nDokoneno\n# ^LicenseText\nPed instalac $(^NameDA) si prosm pette licenn ujednn. Jestlie souhlaste se vema podmnkama ujednn, kliknte 'Souhlasm'.\n# ^LicenseTextCB\nPed instalac $(^NameDA) si prosm pette licenn ujednn. Jestlie souhlaste se vema podmnkama ujednn, zakrtnte polko dole. $_CLICK\n# ^LicenseTextRB\nPed instalac $(^NameDA) si prosm pette licenn ujednn. Jestlie souhlaste se vema podmnkama ujednn, zakrtnte ne prvn monost. $_CLICK\n# ^UnLicenseText\nPed odinstalovn $(^NameDA) si prosm pette licenn ujednn. Jestlie souhlaste se vema podmnkama ujednn, kliknte 'Souhlasm'.\n# ^UnLicenseTextCB\nPed odinstalovn $(^NameDA) si prosm pette licenn ujednn. Jestlie souhlaste se vema podmnkama ujednn, zakrtnte polko dole. $_CLICK\n# ^UnLicenseTextRB\nPed odinstalovn $(^NameDA) si prosm pette licenn ujednn. Jestlie souhlaste se vema podmnkama ujednn, zakrtnte ne prvn monost. $_CLICK\n# ^Custom\nVlastn\n# ^ComponentsText\nZvolte sousti, kter chcete nainstalovat a nezatrhnte sousti, kter instalovat nechcete. $_CLICK\n# ^ComponentsSubText1\nZvolte zpsob instalace:\n# ^ComponentsSubText2_NoInstTypes\nZvolte sousti k instalaci:\n# ^ComponentsSubText2\nNebo zvolte voliteln sousti, kter chcete nainstalovat:\n# ^UnComponentsText\nZatrhnte sousti, kter chcete odinstalovat a nezatrhnte sousti, kter odinstalovat nechcete. $_CLICK\n# ^UnComponentsSubText1\nZvolte zpsob odinstalace:\n# ^UnComponentsSubText2_NoInstTypes\nZvolte sousti pro odinstalaci:\n# ^UnComponentsSubText2\nNebo zvolte jednotliv sousti, kter chcete odinstalovat:\n# ^DirText\nSetup nyn nainstaluje program $(^NameDA) do nsledujc sloky. Pro instalaci do jin sloky zvolte 'Prochzet' a vyberte jinou sloku. $_CLICK\n# ^DirSubText\nClov sloka\n# ^DirBrowseText\nZvolte sloku kam instalovat program $(^NameDA):\n# ^UnDirText\nSetup nyn odinstaluje program $(^NameDA) z nsledujc sloky. Pro odinstalaci z jin sloky zvolte 'Prochzet' a vyberte jinou sloku. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nZvolte adres pro odinstalaci $(^NameDA) z:\n# ^SpaceAvailable\n\"Voln msto: \"\n# ^SpaceRequired\n\"Potebn msto: \"\n# ^UninstallingText\nTento prvodce z Vaeho potae odinstaluje $(^NameDA). $_CLICK\n# ^UninstallingSubText\nOdinstalovat z:\n# ^FileError\nNelze otevt soubor pro zpis: \\r\\n\\t\"$0\"\\r\\nStisknte 'Peruit' pro ukonen instalace\\r\\nnebo 'Znovu' pro dal pokus nebo\\r\\n'Ignorovat' pro peskoen souboru\n# ^FileError_NoIgnore\nNelze otevt soubor pro zpis: \\r\\n\\t\"$0\"\\r\\nStisknte 'Znovu' pro dal pokus nebo\\r\\n*Storno* pro ukonen instalace\n# ^CantWrite\n\"Nelze zapsat: \"\n# ^CopyFailed\nKoprovn selhalo\n# ^CopyTo\n\"Zkoprovat do \"\n# ^Registering\n\"Registrovn: \"\n# ^Unregistering\n\"Odregistrovn: \"\n# ^SymbolNotFound\n\"Nelze najt znak: \"\n# ^CouldNotLoad\n\"Nelze nast: \"\n# ^CreateFolder\n\"Vytvoen adres: \"\n# ^CreateShortcut\n\"Vytvoen zstupce: \"\n# ^CreatedUninstaller\n\"Vytvoen odinstaltor: \"\n# ^Delete\n\"Smazat soubor: \"\n# ^DeleteOnReboot\n\"Smazat po restartu: \"\n# ^ErrorCreatingShortcut\n\"Chyba pi vytven zstupce: \"\n# ^ErrorCreating\n\"Chyba pi vytven: \"\n# ^ErrorDecompressing\nChyba pi rozbalovn dat! Pokozen instaltor?\n# ^ErrorRegistering\nChyba pi registrovn DLL\n# ^ExecShell\n\"Spustit shell: \"\n# ^Exec\n\"Spustit: \"\n# ^Extract\n\"Rozbalit: \"\n# ^ErrorWriting\n\"Rozbalit: chyba pi zpisu do souboru \"\n# ^InvalidOpcode\nInstaltor je pokozen: nesprvn kontroln kd\n# ^NoOLE\n\"Nedostupn OLE pro: \"\n# ^OutputFolder\n\"Vstupn sloka: \"\n# ^RemoveFolder\n\"Odstranit sloku: \"\n# ^RenameOnReboot\n\"Pejmenovat pi restartu: \"\n# ^Rename\n\"Pejmenovno: \"\n# ^Skipped\n\"Peskoeno: \"\n# ^CopyDetails\nZkoprovat podrobnosti do schrnky\n# ^LogInstall\nZaznamenat prbh instalace\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Czech.nsh",
    "content": ";Language: Czech (1029)\n;By SELiCE (ls@selice.cz - http://ls.selice.cz)\n;Corrected by Ondej Vani - http://www.vanis.cz/ondra\n\n!insertmacro LANGFILE \"Czech\" \"Cesky\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Vtejte v prvodci instalace programu $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Tento prvodce Vs provede instalac $(^NameDA).$\\r$\\n$\\r$\\nPed zatkem instalace je doporueno zavt vechny ostatn aplikace. Toto umon aktualizovat dleit systmov soubory bez restartovn Vaeho potae.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Vtejte v $(^NameDA) odinstalanm prvodci\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Tento prvodce Vs provede odinstalac $(^NameDA).$\\r$\\n$\\r$\\nPed zatkem odinstalace, se pesvdte, e $(^NameDA) nen sputn.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Licenn ujednn\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Ped instalac programu $(^NameDA) si prosm prostudujte licenn podmnky.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Jestlie souhlaste se vemi podmnkami ujednn, zvolte 'Souhlasm' pro pokraovn. Pro instalaci programu $(^NameDA) je nutn souhlasit s licennm ujednnm.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Jestlie souhlaste se vemi podmnkami ujednn, zakrtnte ne uvedenou volbu. Pro instalaci programu $(^NameDA) je nutn souhlasit s licennm ujednnm. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Jestlie souhlaste se vemi podmnkami ujednn, zvolte prvn z monost uvedench ne. Pro instalaci programu $(^NameDA) je nutn souhlasit s licennm ujednnm. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Licenn ujednn\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Ped odinstalovnm programu $(^NameDA) si prosm prostudujte licenn podmnky.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Jestlie souhlaste se vemi podmnkami ujednn, zvolte 'Souhlasm' pro pokraovn. Pro odinstalovn programu $(^NameDA) je nutn souhlasit s licennm ujednnm.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Jestlie souhlaste se vemi podmnkami ujednn, zakrtnte ne uvedenou volbu. Pro odinstalovn programu $(^NameDA) je nutn souhlasit s licennm ujednnm. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Jestlie souhlaste se vemi podmnkami ujednn, zvolte prvn z ne uvedench monost. Pro odinstalovn programu $(^NameDA) je nutn souhlasit s licennm ujednnm. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Stisknutm klvesy Page Down posunete text licennho ujednn.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Volba soust\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Zvolte sousti programu $(^NameDA), kter chcete nainstalovat.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Volba soust\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Zvolte sousti programu $(^NameDA), kter chcete odinstalovat.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Popis\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Pi pohybu my nad instaltorem programu se zobraz jej popis.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Pi pohybu my nad instaltorem programu se zobraz jej popis.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Zvolte umstn instalace\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Zvolte sloku, do kter bude program $(^NameDA) nainstalovn.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Zvolte umstn odinstalace\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Zvolte sloku, ze kter bude program $(^NameDA) odinstalovn.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Instalace\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Vykejte, prosm, na dokonen instalace programu $(^NameDA).\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Instalace dokonena\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Instalace probhla v podku.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalace peruena\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Instalace nebyla dokonena.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Odinstalace\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Vykejte, prosm, na dokonen odinstalace programu $(^NameDA).\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Odinstalace dokonena\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Odinstalace probhla v podku.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Odinstalace peruena\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Odinstalace nebyla dokonena.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Dokonen prvodce programu $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"Program $(^NameDA) byl nainstalovn na V pota.$\\r$\\n$\\r$\\nKliknte 'Dokonit' pro ukonen prvodce.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Pro dokonen instalace programu $(^NameDA) je nutno restartovat pota. Chcete restatovat nyn?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Dokonuji odinstalanho prvodce $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) byl odinstalovn z Vaeho potae.$\\r$\\n$\\r$\\nKliknte na 'Dokonit' pro ukonen tohoto prvodce.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Pro dokonen odinstalace $(^NameDA) mus bt V pota restartovn. Chcete restartovat nyn?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Restartovat nyn\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Restartovat run pozdji\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Spustit program $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Zobrazit ti-mne\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Dokonit\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Zvolte sloku v Nabdce Start\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Zvolte sloku v Nabdce Start pro zstupce programu $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Zvolte sloku v Nabdce Start, ve kter chcete vytvoit zstupce programu. Mete tak zadat nov jmno pro vytvoen nov sloky.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Nevytvet zstupce\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Odinstalovat program $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Odebrat program $(^NameDA) z Vaeho potae.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Opravdu chcete ukonit instalaci programu $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Skuten chcete ukonit odinstalaci $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Danish.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1030\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Claus Futtrup\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) Installation\n# ^UninstallCaption\n$(^Name) Afinstallation\n# ^LicenseSubCaption\n: Licensaftale\n# ^ComponentsSubCaption\n: Installationsmuligheder\n# ^DirSubCaption\n: Installationsmappe\n# ^InstallingSubCaption\n: Installerer\n# ^CompletedSubCaption\n: Gennemfrt\n# ^UnComponentsSubCaption\n: Afinstallationsmuligheder\n# ^UnDirSubCaption\n: Afinstallationsmappe\n# ^ConfirmSubCaption\n: Bekrft\n# ^UninstallingSubCaption\n: Afinstallerer\n# ^UnCompletedSubCaption\n: Gennemfrt\n# ^BackBtn\n< &Tilbage\n# ^NextBtn\n&Nste >\n# ^AgreeBtn\nJeg &accepterer\n# ^AcceptBtn\nJeg &accepterer vilkrene i licensaftalen\n# ^DontAcceptBtn\nJeg &accepterer ikke vilkrene i licensaftalen\n# ^InstallBtn\n&Installer\n# ^UninstallBtn\n&Afinstaller\n# ^CancelBtn\nAfbryd\n# ^CloseBtn\n&Luk\n# ^BrowseBtn\nG&ennemse...\n# ^ShowDetailsBtn\nVis &detaljer\n# ^ClickNext\nTryk Nste for at fortstte.\n# ^ClickInstall\nTryk Installer for at starte installationen.\n# ^ClickUninstall\nTryk Afinstaller for at starte afinstallationen.\n# ^Name\nNavn\n# ^Completed\nGennemfrt\n# ^LicenseText\nLs venligst licensaftalen fr installationen af $(^NameDA). Hvis du accepterer alle betingelser i aftalen, skal du trykke 'Jeg accepterer'.\n# ^LicenseTextCB\nLs venligst licensaftalen fr installationen af $(^NameDA). Hvis du accepterer alle betingelser i aftalen, skal du markere afkrydsningsfeltet nedenfor. $_CLICK\n# ^LicenseTextRB\nLs venligst licensaftalen fr installationen af $(^NameDA). Hvis du accepterer alle betingelser i aftalen, skal du vlge den frste mulighed nedenfor. $_CLICK\n# ^UnLicenseText\nLs venligst licensaftalen fr afinstallationen af $(^NameDA). Hvis du accepterer alle betingelser i aftalen, skal du trykke 'Jeg accepterer'\n# ^UnLicenseTextCB\nLs venligst licensaftalen fr afinstallationen af $(^NameDA). Hvis du accepterer alle betingelser i aftalen, skal du markere afkrydsningsfeltet nedenfor. $_CLICK\n# ^UnLicenseTextRB\nLs venligst licensaftalen fr afinstallationen af $(^NameDA). Hvis du accepterer alle betingelser i aftalen, skal du vlge den frste mulighed nedenfor $_CLICK\n# ^Custom\nBrugerdefineret\n# ^ComponentsText\nMarker de komponenter du vil installere, og fjern markeringen af de komponenter du ikke vil installere. $_CLICK\n# ^ComponentsSubText1\nVlg installationstype:\n# ^ComponentsSubText2_NoInstTypes\nVlg de komponenter der skal installeres:\n# ^ComponentsSubText2\nEller vlg de tillgskomponenter komponenter du nsker at installere:\n# ^UnComponentsText\nMarker de komponenter du vil afinstallere, og fjern markeringen af de komponenter du ikke vil afinstallere. $_CLICK\n# ^UnComponentsSubText1\nVlg afinstallationstype:\n# ^UnComponentsSubText2_NoInstTypes\nVlg de komponenter der skal afinstalleres:\n# ^UnComponentsSubText2\nEller vlg de tillgskomponenter du nsker at afinstallere:\n# ^DirText\nInstallationsguiden vil installere $(^NameDA) i flgende mappe. For at installere i en anden mappe, tryk Gennemse og vlg en anden mappe. $_CLICK\n# ^DirSubText\nDestinationsmappe\n# ^DirBrowseText\nVlg den mappe $(^NameDA) skal installeres i:\n# ^UnDirText\nInstallationsguiden vil afinstallere $(^NameDA) fra flgende mappe. For at afinstallere fra en anden mappe, tryk Gennemse og vlg en anden mappe. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nVlg den mappe hvorfra $(^NameDA) skal afinstalleres:\n# ^SpaceAvailable\n\"Ledig plads: \"\n# ^SpaceRequired\n\"Ndvendig plads: \"\n# ^UninstallingText\n$(^NameDA) vil blive afinstalleret fra flgende mappe. $_CLICK\n# ^UninstallingSubText\nAfinstallerer fra:\n# ^FileError\nFejl ved skrivning af fil: \\r\\n\\t\"$0\"\\r\\nTryk Afbryd for at afbryde installationen,\\r\\nPrv Igen for at prve at skrive til filen, eller\\r\\nIgnorer for at springe over denne fil\n# ^FileError_NoIgnore\nFejl ved bning af fil: \\r\\n\\t\"$0\"\\r\\nTryk Prv Igen for at prve at skrive til filen, eller\\r\\nAfbryd for at afbryde installationen\n# ^CantWrite\n\"Kan ikke skrive: \"\n# ^CopyFailed\nKopiering mislykkedes\n# ^CopyTo\n\"Kopier til \"\n# ^Registering\n\"Registrerer: \"\n# ^Unregistering\n\"Afregisterer: \"\n# ^SymbolNotFound\n\"Kunne ikke finde symbol: \"\n# ^CouldNotLoad\n\"Kunne ikke hente: \"\n# ^CreateFolder\n\"Opret mappe: \"\n# ^CreateShortcut\n\"Opret genvej: \"\n# ^CreatedUninstaller\n\"Afinstallationsguide oprettet: \"\n# ^Delete\n\"Slet fil: \"\n# ^DeleteOnReboot\n\"Slet ved genstart: \"\n# ^ErrorCreatingShortcut\n\"Fejl ved oprettelse af genvej: \"\n# ^ErrorCreating\n\"Fejl ved oprettelse: \"\n# ^ErrorDecompressing\nFejl ved udpakning af data! Installationsguiden skadet?\n# ^ErrorRegistering\nFejl ved registrering af DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Kr: \"\n# ^Extract\n\"Udpak: \"\n# ^ErrorWriting\n\"Udpak: Fejl ved skrivning til fil \"\n# ^InvalidOpcode\nInstallationsguide i stykker: Ugyldig opcode\n# ^NoOLE\n\"Ingen OLE for: \"\n# ^OutputFolder\n\"Outputmappe: \"\n# ^RemoveFolder\n\"Slet mappe: \"\n# ^RenameOnReboot\n\"Omdb ved genstart: \"\n# ^Rename\n\"Omdb: \"\n# ^Skipped\n\"Sprunget over: \"\n# ^CopyDetails\nKopier detaljer til udklipsholderen\n# ^LogInstall\nLog installationsproces\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Danish.nsh",
    "content": ";Language: Danish (1030)\n;By Claus Futtrup\n\n!insertmacro LANGFILE \"Danish\" \"Dansk\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Velkommen til installationsguiden for $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Denne guide vil installere $(^NameDA) p din computer.$\\r$\\n$\\r$\\nDet anbefales, at du lukker alle krende programmer inden start af installationsguiden. Dette vil tillade guiden at opdatere de ndvendige systemfiler uden at skulle genstarte computeren.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Velkommen til $(^NameDA) afinstallationsguiden\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Denne afinstallationsguide vil hjlpe dig gennem afinstallationen af $(^NameDA).$\\r$\\n$\\r$\\nFr start af afinstallationen skal du vre sikker p at $(^NameDA) ikke krer.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Licensaftale\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Ls venligst licensaftalen fr du installerer $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Tryk 'Jeg accepterer' hvis du nsker at accepterer alle vilkrene i aftalen og forstte. Du skal acceptere vilkrene for at installere $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Hvis du accepterer alle vilkrene i aftalen, skal du markere afkrydsningsfeltet nedenfor. Du skal acceptere vilkrene for at installere $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Hvis du accepterer alle vilkrene i aftalen, skal du vlge den frste mulighed nedenfor. Du skal acceptere vilkrene for at installere $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Licensaftale\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Ls venligst licensvilkrene fr afinstalleringen af $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Hvis du accepterer vilkrene for aftalen, skal du trykke 'Jeg accepterer' for at fortstte. Du skal acceptere aftalen for at afinstallere $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Hvis du accepterer vilkrene for aftalen, skal du markere afkrydsningsfeltet nedenfor. Du skal acceptere aftalen for at afinstallere $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Hvis du accepterer vilkrene for aftalen, skal du vlge den frste mulighed nedenfor. Du skal acceptere aftalen for at afinstallere $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Tryk Page Down for at se resten af aftalen.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Vlg komponenter\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Vlg hvilke features af $(^NameDA) du vil installere.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Vlg komponenter\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Vlg hvilke features af $(^NameDA) du vil afinstallere.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Beskrivelse\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Placer musemarkren over en komponent for at se beskrivelsen af komponenten.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Placer musemarkren over en komponent for at se beskrivelsen af komponenten.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Vlg installationsmappe\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Vlg hvilken mappe du vil installere $(^NameDA) i.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Vlg afinstallationsmappe\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Vlg den mappe hvorfra du vil afinstallere $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Installerer\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Vent venligst mens $(^NameDA) bliver installeret.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Installation gennemfrt\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Installationsguiden blev gennemfrt med succes.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Installation afbrudt\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Installationsguiden blev ikke gennemfrt.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Afinstallerer\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Vent venligst mens $(^NameDA) bliver afinstalleret.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Afinstallationen er frdig\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Afinstallationen blev afsluttet med succes.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Afinstallationen er blevet afbrudt\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Afinstallationen blev ikke genmmenfrt.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Afslutter $(^NameDA) installationsguiden\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) er blevet installeret p din computer.$\\r$\\n$\\r$\\nTryk 'Afslut' for at lukke installationsguiden.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Din computer skal genstartes fr installationen af $(^NameDA) er afsluttet. Vil du genstarte nu?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Afslutter $(^NameDA) afinstallationsguiden\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) er blevet afinstalleret fra din computer.$\\r$\\n$\\r$\\nTryk 'Afslut' for at lukke denne guide.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Din computer skal genstartes for at gennemfre afinstallationen af $(^NameDA). Vil du genstarte nu?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Genstart nu\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Jeg genstarter selv p et andet tidspunkt\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Start $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Vis vigtig information\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Afslut\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Vlg Start Menu mappe\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Vlg en Start Menu mappe til programmets genveje.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Vlg Start Menu mappen hvor du vil lave programmets genveje. Du kan ogs skrive et navn for at oprette en ny mappe.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Opret ikke genveje\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Afinstaller $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Slet $(^NameDA) fra din computer.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Er du sikker p, at du vil afslutte $(^Name) installationen?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Er du sikker p at du vil afbryde $(^Name) afinstallationen?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Dutch.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1043\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Joost Verburg & Hendri Adireans, fixes by Milan Bast\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name)-installatie\n# ^UninstallCaption\n$(^Name)-denstallatie\n# ^LicenseSubCaption\n: Licentieovereenkomst\n# ^ComponentsSubCaption\n: Installatieopties\n# ^DirSubCaption\n: Installatiemap\n# ^InstallingSubCaption\n: Bezig met installeren\n# ^CompletedSubCaption\n: Voltooid\n# ^UnComponentsSubCaption\n: Verwijderingsopties\n# ^UnDirSubCaption\n: Te verwijderen map\n# ^ConfirmSubCaption\n: Bevestiging\n# ^UninstallingSubCaption\n: Bezig met verwijderen\n# ^UnCompletedSubCaption\n: Voltooid\n# ^BackBtn\n< V&orige\n# ^NextBtn\n&Volgende >\n# ^AgreeBtn\n&Akkoord\n# ^AcceptBtn\nIk &accepteer de overeenkomst\n# ^DontAcceptBtn\nIk accepteer de overeenkomst &niet\n# ^InstallBtn\n&Installeren\n# ^UninstallBtn\n&Verwijderen\n# ^CancelBtn\nAnnuleren\n# ^CloseBtn\n&Afsluiten\n# ^BrowseBtn\n&Bladeren...\n# ^ShowDetailsBtn\n&Details tonen\n# ^ClickNext\nKlik op Volgende om verder te gaan.\n# ^ClickInstall\nKlik op Installeren om de installatie te beginnen.\n# ^ClickUninstall\nKlik op Verwijderen om de denstallatie te beginnen.\n# ^Name\nNaam\n# ^Completed\nVoltooid\n# ^LicenseText\nLees de licentieovereenkomst voordat u $(^NameDA) installeert. Klik op Akkoord als u de overeenkomst accepteert.\n# ^LicenseTextCB\nLees de licentieovereenkomst voordat u $(^NameDA) installeert. Schakel het selectievakje hieronder in als u de overeenkomst accepteert. $_CLICK\n# ^LicenseTextRB\nLees de licentieovereenkomst voordat u $(^NameDA) installeert. Selecteer de eerste optie hieronder als u de overeenkomst accepteert. $_CLICK\n# ^UnLicenseText\nLees de licentieovereenkomst voordat u $(^NameDA) verwijdert. Klik op Akkoord als u de overeenkomst accepteert.\n# ^UnLicenseTextCB\nLees de licentieovereenkomst voordat u $(^NameDA) verwijdert. Schakel het selectievakje hieronder in als u de overeenkomst accepteert. $_CLICK\n# ^UnLicenseTextRB\nLees de licentieovereenkomst voordat u $(^NameDA) verwijdert. Selecteer de eerste optie hieronder als u de overeenkomst accepteert. $_CLICK\n# ^Custom\nAangepast\n# ^ComponentsText\nSelecteer de onderdelen die u wilt installeren en deselecteer welke u niet wilt installeren. $_CLICK\n# ^ComponentsSubText1\nSelecteer het installatietype:\n# ^ComponentsSubText2_NoInstTypes\nSelecteer de onderdelen die moeten worden genstalleerd:\n# ^ComponentsSubText2\nOf selecteer de optionele onderdelen die moeten worden genstalleerd:\n# ^UnComponentsText\nSelecteer de onderdelen die u wilt verwijderen en deselecteer welke u niet wilt verwijderen. $_CLICK\n# ^UnComponentsSubText1\nSelecteer het type verwijdering:\n# ^UnComponentsSubText2_NoInstTypes\nSelecteer de onderdelen die moeten worden verwijderd:\n# ^UnComponentsSubText2\nOf selecteer de optionele onderdelen die moeten worden verwijderd:\n# ^DirText\nSetup zal $(^NameDA) in de volgende map installeren. Klik op Bladeren als u $(^NameDA) in een andere map wilt installeren en selecteer deze. $_CLICK\n# ^DirSubText\nInstallatiemap\n# ^DirBrowseText\nSelecteer de map om $(^NameDA) in te installeren:\n# ^UnDirText\nSetup zal $(^NameDA) uit de volgende map verwijderen. Klik op Bladeren als u $(^NameDA) uit een andere map wilt verwijderen en selecteer deze. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nSelecteer de map om $(^NameDA) uit te verwijderen:\n# ^SpaceAvailable\n\"Beschikbare ruimte: \"\n# ^SpaceRequired\n\"Vereiste ruimte: \"\n# ^UninstallingText\n$(^NameDA) zal uit de volgende map worden verwijderd. $_CLICK\n# ^UninstallingSubText\nVerwijderen uit:\n# ^FileError\nFout bij het schrijven naar bestand: \\r\\n\\r\\n$0\\r\\n\\r\\nKlik op Afbreken om de installatie te stoppen,\\r\\nOpnieuw om het opnieuw te proberen of\\r\\nNegeren om dit bestand over te slaan.\n# ^FileError_NoIgnore\nFout bij het schrijven naar bestand: \\r\\n\\r\\n$0\\r\\n\\r\\nKlik op Opnieuw om het opnieuw te proberen of \\r\\nAnnuleren om de installatie te stoppen.\n# ^CantWrite\n\"Kon niet schrijven: \"\n# ^CopyFailed\nKopiren mislukt\n# ^CopyTo\n\"Kopiren naar \"\n# ^Registering\n\"Registreren: \"\n# ^Unregistering\n\"Deregistreren: \"\n# ^SymbolNotFound\n\"Kon symbool niet vinden: \"\n# ^CouldNotLoad\n\"Kon niet laden: \"\n# ^CreateFolder\n\"Map maken: \"\n# ^CreateShortcut\n\"Snelkoppeling maken: \"\n# ^CreatedUninstaller\n\"Denstallatieprogramma gemaakt: \"\n# ^Delete\n\"Bestand verwijderen: \"\n# ^DeleteOnReboot\n\"Verwijderen na opnieuw opstarten: \"\n# ^ErrorCreatingShortcut\n\"Fout bij maken snelkoppeling: \"\n# ^ErrorCreating\n\"Fout bij maken: \"\n# ^ErrorDecompressing\nFout bij uitpakken van gegevens! Gegevens beschadigd?\n# ^ErrorRegistering\nFout bij registreren DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Uitvoeren: \"\n# ^Extract\n\"Uitpakken: \"\n# ^ErrorWriting\n\"Uitpakken: fout bij schrijven naar bestand \"\n# ^InvalidOpcode\nInstallatieprogramma beschadigd: ongeldige opcode\n# ^NoOLE\n\"Geen OLE voor: \"\n# ^OutputFolder\n\"Uitvoermap: \"\n# ^RemoveFolder\n\"Map verwijderen: \"\n# ^RenameOnReboot\n\"Hernoemen na opnieuw opstarten: \"\n# ^Rename\n\"Hernoemen: \"\n# ^Skipped\n\"Overgeslagen: \"\n# ^CopyDetails\nDetails kopiren naar klembord\n# ^LogInstall\nGegevens over installatie bewaren\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Dutch.nsh",
    "content": ";Language: Dutch (1043)\n;By Joost Verburg\n\n!insertmacro LANGFILE \"Dutch\" \"Nederlands\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Welkom bij de $(^NameDA)-installatiewizard\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Deze wizard zal $(^NameDA) op uw systeem installeren.$\\r$\\n$\\r$\\nHet wordt aanbevolen alle overige toepassingen af te sluiten alvorens de installatie te starten. Dit maakt het mogelijk relevante systeembestanden bij te werken zonder uw systeem opnieuw op te moeten starten.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Welkom bij de $(^NameDA)-denstallatiewizard\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Deze wizard zal $(^NameDA) van uw syteem verwijderen.$\\r$\\n$\\r$\\nControleer voordat u begint met verwijderen of $(^NameDA) is afgesloten.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Licentieovereenkomst\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Lees de licentieovereenkomst voordat u $(^NameDA) installeert.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Klik op Akkoord om verder te gaan als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te installeren.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Schakel het selectievakje hieronder in als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te installeren.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Selecteer de eerste optie hieronder als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te installeren.\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Licentieovereenkomst\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Lees de licentieovereenkomst voordat u $(^NameDA) verwijdert.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Klik op Akkoord op verder te gaan als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te verwijderen.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Schakel het selectievakje hieronder in als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te verwijderen.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Selecteer de eerste optie hieronder als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te verwijderen.\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Druk op Page Down om de rest van de overeenkomst te zien.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Onderdelen kiezen\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Kies de onderdelen die u wilt installeren.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Onderdelen kiezen\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Kies de onderdelen die u wilt verwijderen.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Beschrijving\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Beweeg uw muis over een onderdeel om de beschrijving te zien.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Beweeg uw muis over een onderdeel om de beschrijving te zien.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Installatielocatie kiezen\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Kies de map waarin u $(^NameDA) wilt installeren.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Locatie kiezen\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Kies de map waaruit u $(^NameDA) wilt verwijderen.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Bezig met installeren\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Een ogenblik geduld terwijl $(^NameDA) wordt genstalleerd.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Installatie voltooid\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"De installatie is succesvol voltooid.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Installatie afgebroken\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"De installatie is niet voltooid.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Bezig met verwijderen\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Een ogenblik geduld terwijl $(^NameDA) van uw systeem wordt verwijderd.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Verwijderen gereed\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"$(^NameDA) is van uw systeem verwijderd.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Verwijderen afgebroken\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"$(^NameDA) is niet volledig van uw systeem verwijderd.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Voltooien van de $(^NameDA)-installatiewizard\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) is genstalleerd op uw systeem.$\\r$\\n$\\r$\\nKlik op Voltooien om deze wizard te sluiten.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Uw systeem moet opnieuw worden opgestart om de installatie van $(^NameDA) te voltooien. Wilt u nu herstarten?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Voltooien van de $(^NameDA)-denstallatiewizard\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) is van uw systeem verwijderd.$\\r$\\n$\\r$\\nKlik op Voltooien om deze wizard te sluiten.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Uw systeem moet opnieuw worden opgestart om het verwijderen van $(^NameDA) te voltooien. Wilt u nu herstarten?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Nu herstarten\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Ik wil later handmatig herstarten\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"$(^NameDA) &starten\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Leesmij weergeven\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Voltooien\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Startmenumap kiezen\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Kies een map in het menu Start voor de snelkoppelingen van $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Kies een map in het menu Start waarin de snelkoppelingen moeten worden aangemaakt. U kunt ook een naam invoeren om een nieuwe map te maken.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Geen snelkoppelingen aanmaken\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"$(^NameDA) verwijderen\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"$(^NameDA) van uw systeem verwijderen.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Weet u zeker dat u de $(^Name)-installatie wilt afsluiten?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Weet u zeker dat u de $(^Name)-denstallatie wilt afsluiten?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Gebruikers kiezen\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Kies voor welke gebruikers u $(^NameDA) wilt installeren.\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Selecteer of u $(^NameDA) alleen voor uzelf of voor alle gebruikers van deze computer wilt installeren. $(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Installeer voor alle gebruikers van deze computer\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Installeer alleen voor mijzelf\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/English.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1033\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n-\n# RTL - anything else than RTL means LTR\n-\n# Translation by ..... (any credits should go here)\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) Setup\n# ^UninstallCaption\n$(^Name) Uninstall\n# ^LicenseSubCaption\n: License Agreement\n# ^ComponentsSubCaption\n: Installation Options\n# ^DirSubCaption\n: Installation Folder\n# ^InstallingSubCaption\n: Installing\n# ^CompletedSubCaption\n: Completed\n# ^UnComponentsSubCaption\n: Uninstallation Options\n# ^UnDirSubCaption\n: Uninstallation Folder\n# ^ConfirmSubCaption\n: Confirmation\n# ^UninstallingSubCaption\n: Uninstalling\n# ^UnCompletedSubCaption\n: Completed\n# ^BackBtn\n< &Back\n# ^NextBtn\n&Next >\n# ^AgreeBtn\nI &Agree\n# ^AcceptBtn\nI &accept the terms of the License Agreement\n# ^DontAcceptBtn\nI &do not accept the terms of the License Agreement\n# ^InstallBtn\n&Install\n# ^UninstallBtn\n&Uninstall\n# ^CancelBtn\nCancel\n# ^CloseBtn\n&Close\n# ^BrowseBtn\nB&rowse...\n# ^ShowDetailsBtn\nShow &details\n# ^ClickNext\nClick Next to continue.\n# ^ClickInstall\nClick Install to start the installation.\n# ^ClickUninstall\nClick Uninstall to start the uninstallation.\n# ^Name\nName\n# ^Completed\nCompleted\n# ^LicenseText\nPlease review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, click I Agree.\n# ^LicenseTextCB\nPlease review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, click the check box below. $_CLICK\n# ^LicenseTextRB\nPlease review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, select the first option below. $_CLICK\n# ^UnLicenseText\nPlease review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, click I Agree.\n# ^UnLicenseTextCB\nPlease review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, click the check box below. $_CLICK\n# ^UnLicenseTextRB\nPlease review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, select the first option below. $_CLICK\n# ^Custom\nCustom\n# ^ComponentsText\nCheck the components you want to install and uncheck the components you don't want to install. $_CLICK\n# ^ComponentsSubText1\nSelect the type of install:\n# ^ComponentsSubText2_NoInstTypes\nSelect components to install:\n# ^ComponentsSubText2\nOr, select the optional components you wish to install:\n# ^UnComponentsText\nCheck the components you want to uninstall and uncheck the components you don't want to uninstall. $_CLICK\n# ^UnComponentsSubText1\nSelect the type of uninstall:\n# ^UnComponentsSubText2_NoInstTypes\nSelect components to uninstall:\n# ^UnComponentsSubText2\nOr, select the optional components you wish to uninstall:\n# ^DirText\nSetup will install $(^NameDA) in the following folder. To install in a different folder, click Browse and select another folder. $_CLICK\n# ^DirSubText\nDestination Folder\n# ^DirBrowseText\nSelect the folder to install $(^NameDA) in:\n# ^UnDirText\nSetup will uninstall $(^NameDA) from the following folder. To uninstall from a different folder, click Browse and select another folder. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nSelect the folder to uninstall $(^NameDA) from:\n# ^SpaceAvailable\n\"Space available: \"\n# ^SpaceRequired\n\"Space required: \"\n# ^UninstallingText\n$(^NameDA) will be uninstalled from the following folder. $_CLICK\n# ^UninstallingSubText\nUninstalling from:\n# ^FileError\nError opening file for writing: \\r\\n\\r\\n$0\\r\\n\\r\\nClick Abort to stop the installation,\\r\\nRetry to try again, or\\r\\nIgnore to skip this file.\n# ^FileError_NoIgnore\nError opening file for writing: \\r\\n\\r\\n$0\\r\\n\\r\\nClick Retry to try again, or\\r\\nCancel to stop the installation.\n# ^CantWrite\n\"Can't write: \"\n# ^CopyFailed\nCopy failed\n# ^CopyTo\n\"Copy to \"\n# ^Registering\n\"Registering: \"\n# ^Unregistering\n\"Unregistering: \"\n# ^SymbolNotFound\n\"Could not find symbol: \"\n# ^CouldNotLoad\n\"Could not load: \"\n# ^CreateFolder\n\"Create folder: \"\n# ^CreateShortcut\n\"Create shortcut: \"\n# ^CreatedUninstaller\n\"Created uninstaller: \"\n# ^Delete\n\"Delete file: \"\n# ^DeleteOnReboot\n\"Delete on reboot: \"\n# ^ErrorCreatingShortcut\n\"Error creating shortcut: \"\n# ^ErrorCreating\n\"Error creating: \"\n# ^ErrorDecompressing\nError decompressing data! Corrupted installer?\n# ^ErrorRegistering\nError registering DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Execute: \"\n# ^Extract\n\"Extract: \"\n# ^ErrorWriting\n\"Extract: error writing to file \"\n# ^InvalidOpcode\nInstaller corrupted: invalid opcode\n# ^NoOLE\n\"No OLE for: \"\n# ^OutputFolder\n\"Output folder: \"\n# ^RemoveFolder\n\"Remove folder: \"\n# ^RenameOnReboot\n\"Rename on reboot: \"\n# ^Rename\n\"Rename: \"\n# ^Skipped\n\"Skipped: \"\n# ^CopyDetails\nCopy Details To Clipboard\n# ^LogInstall\nLog install process\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/English.nsh",
    "content": ";Language: English (1033)\n;By Joost Verburg\n\n!insertmacro LANGFILE \"English\" \"English\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Welcome to the $(^NameDA) Setup Wizard\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"This wizard will guide you through the installation of $(^NameDA).$\\r$\\n$\\r$\\nIt is recommended that you close all other applications before starting Setup. This will make it possible to update relevant system files without having to reboot your computer.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Welcome to the $(^NameDA) Uninstall Wizard\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"This wizard will guide you through the uninstallation of $(^NameDA).$\\r$\\n$\\r$\\nBefore starting the uninstallation, make sure $(^NameDA) is not running.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"License Agreement\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Please review the license terms before installing $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"If you accept the terms of the agreement, click I Agree to continue. You must accept the agreement to install $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"If you accept the terms of the agreement, click the check box below. You must accept the agreement to install $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"If you accept the terms of the agreement, select the first option below. You must accept the agreement to install $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"License Agreement\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Please review the license terms before uninstalling $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"If you accept the terms of the agreement, click I Agree to continue. You must accept the agreement to uninstall $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"If you accept the terms of the agreement, click the check box below. You must accept the agreement to uninstall $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"If you accept the terms of the agreement, select the first option below. You must accept the agreement to uninstall $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Press Page Down to see the rest of the agreement.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Choose Components\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Choose which features of $(^NameDA) you want to install.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Choose Components\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Choose which features of $(^NameDA) you want to uninstall.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Description\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Position your mouse over a component to see its description.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Position your mouse over a component to see its description.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Choose Install Location\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Choose the folder in which to install $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Choose Uninstall Location\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Choose the folder from which to uninstall $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Installing\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Please wait while $(^NameDA) is being installed.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Installation Complete\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Setup was completed successfully.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Installation Aborted\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Setup was not completed successfully.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Uninstalling\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Please wait while $(^NameDA) is being uninstalled.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Uninstallation Complete\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Uninstall was completed successfully.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Uninstallation Aborted\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Uninstall was not completed successfully.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Completing the $(^NameDA) Setup Wizard\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) has been installed on your computer.$\\r$\\n$\\r$\\nClick Finish to close this wizard.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Your computer must be restarted in order to complete the installation of $(^NameDA). Do you want to reboot now?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Completing the $(^NameDA) Uninstall Wizard\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) has been uninstalled from your computer.$\\r$\\n$\\r$\\nClick Finish to close this wizard.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Your computer must be restarted in order to complete the uninstallation of $(^NameDA). Do you want to reboot now?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Reboot now\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"I want to manually reboot later\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Run $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Show Readme\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Finish\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Choose Start Menu Folder\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Choose a Start Menu folder for the $(^NameDA) shortcuts.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Select the Start Menu folder in which you would like to create the program's shortcuts. You can also enter a name to create a new folder.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Do not create shortcuts\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Uninstall $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Remove $(^NameDA) from your computer.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Are you sure you want to quit $(^Name) Setup?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Are you sure you want to quit $(^Name) Uninstall?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Choose Users\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Choose for which users you want to install $(^NameDA).\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Select whether you want to install $(^NameDA) for yourself only or for all users of this computer. $(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Install for anyone using this computer\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Install just for me\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Esperanto.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID (none exists for Kurdish at the moment)\n9998\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n-\n# RTL - anything else than RTL means LTR\n-\n# Translation v4.0.3 by Felipe Castro <fefcas@gmail.com>\n# ^Branding\nInstalada Sistemo de Nullsoft %s\n# ^SetupCaption\nInstalado de $(^Name)\n# ^UninstallCaption\nMalinstalado de $(^Name)\n# ^LicenseSubCaption\n: Permes-Kontrakto\n# ^ComponentsSubCaption\n: Instaladaj Opcioj\n# ^DirSubCaption\n: Instalada Dosierujo\n# ^InstallingSubCaption\n: Oni Instalas Dosierojn\n# ^CompletedSubCaption\n: Kompletite\n# ^UnComponentsSubCaption\n: Malinstaladaj Opcioj\n# ^UnDirSubCaption\n: Malinstalada Dosierujo\n# ^ConfirmSubCaption\n: Konfirmo\n# ^UninstallingSubCaption\n: Oni malinstalas\n# ^UnCompletedSubCaption\n: Kompletite\n# ^BackBtn\n< &Antauxe\n# ^NextBtn\n&Sekve >\n# ^AgreeBtn\n&Akceptite\n# ^AcceptBtn\nMi &akceptas la kondicxojn de la Permes-Kontrakto\n# ^DontAcceptBtn\nMi &ne akceptas la kondicxojn de la Permes-Kontrakto\n# ^InstallBtn\n&Instali\n# ^UninstallBtn\n&Malinstali\n# ^CancelBtn\nNuligi\n# ^CloseBtn\n&Fermi\n# ^BrowseBtn\n&Sercxi...\n# ^ShowDetailsBtn\nVidi &Detalojn\n# ^ClickNext\nMusklaku en 'Sekve' por dauxrigi.\n# ^ClickInstall\nMusklaku en 'Instali' por ekigi la instaladon.\n# ^ClickUninstall\nMusklaku en 'Malinstali' por ekigi la malinstaladon.\n# ^Name\nNomo\n# ^Completed\nKompletite\n# ^LicenseText\nBonvole revidu la permes-akordon antaux ol instali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en 'Akceptite'.\n# ^LicenseTextCB\nBonvole revidu la permes-akordon antaux ol instali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en la suba elekt-skatolo. $_CLICK\n# ^LicenseTextRB\nBonvole revidu la permes-akordon antaux ol instali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, elektu la unuan opcion sube. $_CLICK\n# ^UnLicenseText\nBonvole revidu la permes-akordon antaux ol malinstali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en 'Akceptite'.\n# ^UnLicenseTextCB\nBonvole revidu la permes-akordon antaux ol malinstali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en la suba elekt-skatolo. $_CLICK\n# ^UnLicenseTextRB\nBonvole revidu la permes-akordon antaux ol malinstali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, elektu la unuan opcion sube. $_CLICK\n# ^Custom\nPersonigite\n# ^ComponentsText\nMarku la konsisterojn, kiujn vi deziras instali kaj malmarku tiujn, kiujn vi ne deziras instali. $_CLICK\n# ^ComponentsSubText1\nElektu la tipon de instalado:\n# ^ComponentsSubText2_NoInstTypes\nElektu la konsisterojn por instali:\n# ^ComponentsSubText2\nAux, elektu la nedevigajn konsisterojn, kiujn vi deziras instali:\n# ^UnComponentsText\nMarku la konsisterojn, kiujn vi volas malinstali aux male. $_CLICK \n# ^UnComponentsSubText1\nElektu la tipon de malinstalado:\n# ^UnComponentsSubText2_NoInstTypes\nElektu la konsisterojn por malinstali:\n# ^UnComponentsSubText2\nAux, elektu la nedevigajn konsisterojn, kiujn vi deziras malinstali:\n# ^DirText\n$(^NameDA) estos instalita en la jena dosierujo. Por instali en alia dosierujo, musklaku en 'Sercxi...' kaj elektu gxin. $_CLICK\n# ^DirSubText\nCelota Dosierujo\n# ^DirBrowseText\nElektu dosierujon por instali $(^NameDA):\n# ^UnDirText\n$(^NameDA) estos malinstalita el la jena dosierujo. Por malinstali en alia dosierujo, musklaku en 'Sercxi...' kaj elektu gxin. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nElektu dosierujon el kie $(^NameDA) estos malinstalita:\n# ^SpaceAvailable\n\"Disponebla spaco: \"\n# ^SpaceRequired\n\"Postulata spaco: \"\n# ^UninstallingText\n$(^NameDA) estos malinstalita el la jena dosierujo. $_CLICK\n# ^UninstallingSubText\nMalinstalado el:\n# ^FileError\nEraro dum malfermo de dosiero por skribi: \\r\\n\\t\"$0\"\\r\\nMusklaku en Cxesigi por finigi la instaladon,\\r\\Ripeti por provi refoje skribi sur la dosiero, aux\\r\\nPreteratenti por preteratenti tiun cxi dosieron.\n# ^FileError_NoIgnore\nEraro dum malfermo de dosierujo por skribi: \\r\\n\\t\"$0\"\\r\\nMusklaku en Ripeti por provi refoje skribi sur la dosiero, aux\\r\\nNuligi por cxesigi la instaladon.\n# ^CantWrite\n\"Ne eblis skribi: \"\n# ^CopyFailed\nMalsukceso dum kopio\n# ^CopyTo\n\"Kopii al \"\n# ^Registering\n\"Oni registras: \"\n# ^Unregistering\n\"Oni malregistras: \"\n# ^SymbolNotFound\n\"Ne trovita simbolo: \"\n# ^CouldNotLoad\n\"Ne eblis sxargi: \"\n# ^CreateFolder\n\"Oni kreas subdosierujon: \"\n# ^CreateShortcut\n\"Oni kreas lancxilon: \"\n# ^CreatedUninstaller\n\"Oni kreas malinstalilon: \"\n# ^Delete\n\"Oni forigas dosieron: \"\n# ^DeleteOnReboot\n\"Forigi je restarto: \"\n# ^ErrorCreatingShortcut\n\"Eraro dum kreo de lancxilo: \"\n# ^ErrorCreating\n\"Eraro dum kreo: \"\n# ^ErrorDecompressing\nEraro dum malkompaktigo de datumaro! Cxu misrompita instalilo?\n# ^ErrorRegistering\nEraru dum registro de DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Lancxi: \"\n# ^Extract\n\"Eltiri: \"\n# ^ErrorWriting\n\"Eltirado: eraro dum skribo de dosiero \"\n# ^InvalidOpcode\nMisrompita instalilo: malvalida operaci-kodo\n# ^NoOLE\n\"Sen OLE por: \"\n# ^OutputFolder\n\"Celota dosierujo: \"\n# ^RemoveFolder\n\"Oni forigas la dosierujon: \"\n# ^RenameOnReboot\n\"Renomigi je restarto: \"\n# ^Rename\n\"Oni renomigas: \"\n# ^Skipped\n\"Preterpasita: \"\n# ^CopyDetails\nKopii detalojn al la tondejo\n# ^LogInstall\nRegistri instalad-procezo\n# ^Byte\nB\n# ^Kilo\nk\n# ^Mega\nM\n# ^Giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Esperanto.nsh",
    "content": ";Language: Esperanto (0)\n;By Felipe Castro <fefcas@gmail.com>\n\n!insertmacro LANGFILE \"Esperanto\" \"Esperanto\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Bonvenon al la Gvidilo por Instalado de $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Tiu cxi gvidilo helpos vin dum la instalado de $(^NameDA).$\\r$\\n$\\r$\\nOni rekomendas fermi cxiujn aliajn aplikajxojn antaux ol ekigi la Instaladon. Tio cxi ebligos al la Instalilo gxisdatigi la koncernajn dosierojn de la sistemo sen bezono restartigi la komputilon.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Bonvenon al la Gvidilo por Malinstalado de $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Tiu cxi gvidilo helpos vin dum la malinstalado de $(^NameDA).$\\r$\\n$\\r$\\nAntaux ol ekigi la malinstalado, certigxu ke $(^NameDA) ne estas plenumata nun.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Permes-Kontrakto\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Bonvole, kontrolu la kondicxojn de la permesilo antaux ol instali la programon $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Se vi akceptas la kondicxojn, musklaku en 'Akceptite' por dauxrigi. Vi devos akcepti la kontrakton por instali la programon $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Se vi akceptas la permes-kondicxojn, musklaku la suban elekt-skatolon. Vi devos akcepti la kontrakton por instali la programon $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Se vi akceptas la permes-kondicxojn, elektu la unuan opcion sube. Vi devas akcepti la kontrakton por instali la programon $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Permes-Kontrakto\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Bonvole, kontrolu la kondicxojn de la permesilo antaux ol malinstali la programon $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Se vi akceptas la kondicxojn, musklaku en 'Akceptite' por dauxrigi. Vi devos akcepti la kontrakton por malinstali la programon $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Se vi akceptas la permes-kondicxojn, musklaku la suban elekt-skatolon. Vi devos akcepti la kontrakton por malinstali la programon $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Se vi akceptas la permes-kondicxojn, elektu la unuan opcion sube. Vi devas akcepti la kontrakton por malinstali la programon $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Premu 'Page Down' por rigardi la reston de la permeso.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Elekto de Konsisteroj\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Elektu kiujn funkciojn de $(^NameDA) vi deziras instali.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Elekto de Konsisteroj\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Elektu kiujn funkciojn de $(^NameDA) vi deziras malinstali.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Priskribo\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Poziciu la muson sur konsistero por rigardi ties priskribon.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Poziciu la muson sur konsistero por rigardi ties priskribon.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Elekto de la Instalada Loko\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Elektu la dosierujon en kiun vi deziras instali la programon $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Elekto de la Malinstalada Loko\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Elektu la dosierujon el kiu vi deziras malinstali la programon $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Oni instalas\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Bonvole, atendu dum $(^NameDA) estas instalata.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Instalado Plenumite\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"La instalado sukcese plenumigxis.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalado Cxesigite\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"La instalado ne plenumigxis sukcese.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Oni malinstalas\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Bonvole, atendu dum $(^NameDA) estas malinstalata.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Malinstalado Plenumite\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"La malinstalado sukcese plenumigxis.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Malinstalado Cxesigxite\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"La malinstalado ne plenumigxis sukcese.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Oni finigas la Gvidilon por Instalado de $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) estas instalita en via komputilo.$\\r$\\n$\\r$\\nMusklaku en Finigi por fermi tiun cxi gvidilon.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Via komputilo devas esti restartigita por kompletigi la instaladon de $(^NameDA). Cxu restartigi nun?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Oni finigas la Gvidilon por Malinstalado de $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) estis forigita el via komputilo.$\\r$\\n$\\r$\\nMusklaku en Finigi por fermi tiun cxi gvidilon.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Via komputilo devas esti restartigita por kompletigi la malinstaladon de $(^NameDA). Cxu restartigi nun?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Restartigi Nun\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Mi volas restartigi permane poste\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Lancxi $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Montri Legumin\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Finigi\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Elektu Dosierujon de la Ek-Menuo\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Elektu dosierujon de la Ek-Menuo por la lancxiloj de la programo.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Elektu dosierujon de la Ek-Menuo en kiu vi deziras krei la lancxilojn de la programo. Vi povas ankaux tajpi nomon por krei novan ujon.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Ne krei lancxilojn\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Malinstali $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Forigi $(^NameDA) el via komputilo.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Cxu vi certe deziras nuligi la instaladon de $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Cxu vi certe deziras nuligi la malinstaladon de $(^Name)?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Elekti Uzantojn\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Elekti por kiuj uzantoj vi deziras instali $(^NameDA).\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Elektu cxu vi volas instali $(^NameDA) por vi mem aux por cxiuj uzantoj de tiu cxi komputilo. $(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Instali por iu ajn uzanto de tiu cxi komputilo\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Instali nur por mi\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Estonian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1061\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1257\n# RTL - anything else than RTL means LTR\n-\n# Translation by izzo (izzo@hot.ee)\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) Paigaldamine\n# ^UninstallCaption\n$(^Name) Eemaldamine\n# ^LicenseSubCaption\n: Litsentsileping\n# ^ComponentsSubCaption\n: Paigaldusvalikud\n# ^DirSubCaption\n: Paigalduskaust\n# ^InstallingSubCaption\n: Paigaldan\t\t\t\n# ^CompletedSubCaption\n: Valmis\n# ^UnComponentsSubCaption\n: Eemaldusvalikud\n# ^UnDirSubCaption\n: Eemalduskaust\n# ^ConfirmSubCaption\n: Kinnitus\n# ^UninstallingSubCaption\n: Eemaldan\n# ^UnCompletedSubCaption\n: Valmis\n# ^BackBtn\n< Tagasi\n# ^NextBtn\nEdasi >\n# ^AgreeBtn\nNustun\n# ^AcceptBtn\nNustun litsentsilepingu tingimustega\n# ^DontAcceptBtn\nEi nustu litsentsilepingu tingimustega\n# ^InstallBtn\nPaigalda\n# ^UninstallBtn\nEemalda\n# ^CancelBtn\nLoobu\n# ^CloseBtn\nSule\n# ^BrowseBtn\nSirvi...\n# ^ShowDetailsBtn\nDetailid\n# ^ClickNext\nJtkamiseks vajuta Edasi.\n# ^ClickInstall\nPaigaldamise alustamiseks vajuta Paigalda.\n# ^ClickUninstall\nEemaldamise alustamiseks vajuta Eemalda.\n# ^Name\nNimi\n# ^Completed\nValmis\n# ^LicenseText\nEnne $(^NameDA) paigaldamist vaata palun litsentsileping le. Kui sa nustud kigi lepingu tingimustega, vajuta Nustun.\n# ^LicenseTextCB\nEnne $(^NameDA) paigaldamist vaata palun litsentsileping le. Kui sa nustud kigi lepingu tingimustega, vali allolev mrkeruut. $_CLICK\n# ^LicenseTextRB\nEnne $(^NameDA) paigaldamist vaata palun litsentsileping le. Kui sa nustud kigi lepingu tingimustega, mrgi allpool esimene valik. $_CLICK\n# ^UnLicenseText\nEnne $(^NameDA) eemaldamist vaata palun litsentsileping le. Kui sa nustud kigi lepingu tingimustega, vajuta Nustun.\n# ^UnLicenseTextCB\nEnne $(^NameDA) eemaldamist vaata palun litsentsileping le. Kui sa nustud kigi lepingu tingimustega, vali allolev mrkeruut. $_CLICK\n# ^UnLicenseTextRB\nEnne $(^NameDA) eemaldamist vaata palun litsentsileping le. Kui sa nustud kigi lepingu tingimustega, mrgi allpool esimene valik. $_CLICK\n# ^Custom\nKohandatud\n# ^ComponentsText\nMrgista komponendid mida soovid paigaldada ja eemalda mrgistus neilt, mida ei soovi paigaldada. $_CLICK\n# ^ComponentsSubText1\nVali paigalduse tp:\n# ^ComponentsSubText2_NoInstTypes\nVali paigaldatavad komponendid:\n# ^ComponentsSubText2\nvi vali lisakomponendid mida soovid paigaldada:\n# ^UnComponentsText\nMrgista komponendid mida soovid eemaldada ja eemalda mrgistus neilt, mida ei soovi eemaldada. $_CLICK\n# ^UnComponentsSubText1\nVali eemalduse tp:\n# ^UnComponentsSubText2_NoInstTypes\nVali eemaldatavad komponendid:\n# ^UnComponentsSubText2\nvi vali lisakomponendid mida soovid eemaldada:\n# ^DirText\n$(^NameDA) paigaldatakse jrgmisse kausta. Et mujale paigaldada, vajuta sirvi ja vali teine kaust. $_CLICK\n# ^DirSubText\nSihtkaust\n# ^DirBrowseText\nVali kaust kuhu $(^NameDA) paigaldada:\n# ^UnDirText\n$(^NameDA) eemaldatakse jrgmisest kaustast. Et mujalt eemaldada, vajuta sirvi ja vali teine kaust. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nVali kaust kust $(^NameDA) eemaldada:\n# ^SpaceAvailable\n\"Vaba ruum: \"\n# ^SpaceRequired\n\"Vajalik ruum: \"\n# ^UninstallingText\n$(^NameDA) eemaldatakse jrgmisest kaustast. $_CLICK\n# ^UninstallingSubText\nEemaldan sealt:\n# ^FileError\nTrge faili avamisel kirjutamiseks: \\r\\n\\t\"$0\"\\r\\nPaigalduse katkestamiseks vajuta Katkesta,\\r\\nvajuta rita uuesti, et faili kirjutamist uuesti proovida, vi\\r\\nIgnoreeri, et see fail vahele jtta.\n# ^FileError_NoIgnore\nTrge faili avamisel kirjutamiseks: \\r\\n\\t\"$0\"\\r\\nVajuta rita uuesti, et faili kirjutamist uuesti proovida, vi\\r\\nLoobu, et paigaldamine katkestada\n# ^CantWrite\n\"Ei saa kirjutada: \"\n# ^CopyFailed\nKopeerimine ebannestus\n# ^CopyTo\n\"Kopeeri sinna \"\n# ^Registering\n\"Registreerin: \"\n# ^Unregistering\n\"Deregistreerin: \"\n# ^SymbolNotFound\n\"Ei leidnud smbolit: \"\n# ^CouldNotLoad\n\"Ei saanud laadida: \"\n# ^CreateFolder\n\"Loo kaust: \"\n# ^CreateShortcut\n\"Loo otsetee: \"\n# ^CreatedUninstaller\n\"Loodud eemaldaja: \"\n# ^Delete\n\"Kustuta fail: \"\n# ^DeleteOnReboot\n\"Kustuta taaskivitamisel: \"\n# ^ErrorCreatingShortcut\n\"Trge otsetee loomisel: \"\n# ^ErrorCreating\n\"Trge loomisel: \"\n# ^ErrorDecompressing\nTrge andmete lahtipakkimisel! Vigane paigaldaja?\n# ^ErrorRegistering\nTrge DLL-i registreerimisel\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Kivita: \"\n# ^Extract\n\"Paki lahti: \"\n# ^ErrorWriting\n\"Paki lahti: viga faili kirjutamisel \"\n# ^InvalidOpcode\nPaigaldaja klbmatu: vigane opkood\n# ^NoOLE\n\"No OLE for: \"\n# ^OutputFolder\n\"Vljastatav kaust: \"\n# ^RemoveFolder\n\"Eemalda kaust: \"\n# ^RenameOnReboot\n\"Taaskivitusel nimeta mber: \"\n# ^Rename\n\"Nimeta mber: \"\n# ^Skipped\n\"Vahele jetud: \"\n# ^CopyDetails\nKopeeri detailid likelauale\n# ^LogInstall\nLogi paigaldusprotsess\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Estonian.nsh",
    "content": ";Language: Estonian (1061)\n;Translated by johnny izzo (izzo@hot.ee)\n\n!insertmacro LANGFILE \"Estonian\" \"Eesti keel\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"$(^NameDA) paigaldamine!\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"See abiline aitab paigaldada $(^NameDA).$\\r$\\n$\\r$\\nEnne paigaldamise alustamist on soovitatav kik teised programmid sulgeda, see vimaldab teatud ssteemifaile uuendada ilma arvutit taaskivitamata.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"$(^NameDA) eemaldamine!\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"See abiline aitab eemaldada $(^NameDA).$\\r$\\n$\\r$\\nEnne eemaldamist vaata, et $(^NameDA) oleks suletud.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Litsentsileping\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Enne $(^NameDA) paigaldamist vaata palun litsentsileping le.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Kui sa oled lepingu tingimustega nus, vali jtkamiseks Nustun. $(^NameDA) paigaldamiseks pead sa lepinguga nustuma.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Kui nustud lepingu tingimustega, vali allolev mrkeruut. $(^NameDA) paigaldamiseks pead lepinguga nustuma. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Kui nustud lepingu tingimustega, mrgi allpool esimene valik. $(^NameDA) paigaldamiseks pead lepinguga nustuma. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Litsentsileping\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Enne $(^NameDA) eemaldamist vaata palun litsentsileping le.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Kui sa oled lepingu tingimustega nus, vali jtkamiseks Nustun. $(^NameDA) eemaldamiseks pead sa lepinguga nustuma.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Kui nustud lepingu tingimustega, vali allolev mrkeruut. $(^NameDA) eemaldamiseks pead lepinguga nustuma. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Kui nustud lepingu tingimustega, mrgi allpool esimene valik. $(^NameDA) eemaldamiseks pead lepinguga nustuma. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Vajuta Page Down, et nha lejnud teksti.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Vali komponendid\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Vali millised $(^NameDA) osad sa soovid paigaldada.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Vali komponendid\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Vali millised $(^NameDA) osad sa soovid eemaldada.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Kirjeldus\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Nihuta hiir komponendile, et nha selle kirjeldust.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Nihuta hiir komponendile, et nha selle kirjeldust.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Vali asukoht\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Vali kaust kuhu paigaldada $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Vali asukoht\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Vali kaust kust $(^NameDA) eemaldada.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Paigaldan...\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Palun oota kuni $(^NameDA) on paigaldatud.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Programm paigaldatud\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Paigaldus edukalt sooritatud.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Paigaldus katkestatud\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Paigaldamine ebannestus.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Eemaldan...\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Palun oota kuni $(^NameDA) on eemaldatud.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Eemaldamine lpetatud\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Eemaldamine edukalt lpule viidud.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Eemaldamine katkestatud\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Eemaldamine ebanestus.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"$(^NameDA) paigalduse lpule viimine.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) on sinu arvutisse paigaldatud.$\\r$\\n$\\r$\\nAbilise sulgemiseks vajuta Lpeta.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"$(^NameDA) tielikuks paigaldamiseks tuleb arvuti taaskivitada. Kas soovid arvuti kohe taaskivitada ?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"$(^NameDA) eemaldamise lpule viimine.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) on sinu arvutist eemaldatud.$\\r$\\n$\\r$\\nAbilise sulgemiseks vajuta Lpeta.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"$(^NameDA) tielikuks eemaldamiseks tuleb arvuti taaskivitada. Kas soovid arvuti kohe taaskivitada ?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Taaskivita kohe\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Taaskivitan hiljem ksitsi\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"Kivita $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Kuva Loemind\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"Lpeta\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Vali Start-men kaust\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Vali $(^NameDA) otseteede jaoks Start-men kaust.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Vali Start-men kaust, kuhu soovid paigutada programmi otseteed. Vid ka sisestada nime, et luua uus kaust.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"ra loo otseteid\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Eemalda $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Eemalda $(^NameDA) oma arvutist.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Oled sa kindel et soovid $(^Name) paigaldamise katkestada?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Oled sa kindel et soovid $(^Name) eemaldamise katkestada?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Farsi.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1065\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1256\n# RTL - anything else than RTL means LTR\nRTL\n# Translation By FzerorubigD - FzerorubigD@gmail.com - Thanx to all people help me in forum.persiantools.com, Elnaz Sarbar <elnaz@farsiweb.info>\n# ^Branding\n   %s\n# ^SetupCaption\n $(^Name) \n# ^UninstallCaption\n $(^Name) \n# ^LicenseSubCaption\n:  \n# ^ComponentsSubCaption\n:  \n# ^DirSubCaption\n:  \n# ^InstallingSubCaption\n:   \n# ^CompletedSubCaption\n:  \n# ^UnComponentsSubCaption\n:  \n# ^UnDirSubCaption\n:  \n# ^ConfirmSubCaption\n: \n# ^UninstallingSubCaption\n:   \n# ^UnCompletedSubCaption\n:  \n# ^BackBtn\n& \n# ^NextBtn\n&\n# ^AgreeBtn\n&\n# ^AcceptBtn\n      &\n# ^DontAcceptBtn\n     &\n# ^InstallBtn\n&\n# ^UninstallBtn\n&\n# ^CancelBtn\n\n# ^CloseBtn\n&\n# ^BrowseBtn\n&...\n# ^ShowDetailsBtn\n \n# ^ClickNext\n   Ϙ    .\n# ^ClickInstall\n    Ϙ   .\n# ^ClickUninstall\n    Ϙ   .\n# ^Name\n\n# ^Completed\n \n# ^LicenseText\n    $(^NameDA)    . ǐ        Ϙ   .\n# ^LicenseTextCB\n    $(^NameDA)    . ǐ            . $_CLICK\n# ^LicenseTextRB\n    $(^NameDA)    . ǐ           . $_CLICK\n# ^UnLicenseText\n    $(^NameDA)    . ǐ        Ϙ   .\n# ^UnLicenseTextCB\n    $(^NameDA)    . ǐ            . $_CLICK\n# ^UnLicenseTextRB\n    $(^NameDA)    . ǐ           . $_CLICK\n# ^Custom\n\n# ^ComponentsText\n ԝ         ԝ      . $_CLICK\n# ^ComponentsSubText1\n    : \n# ^ComponentsSubText2_NoInstTypes\nԝ       :\n# ^ComponentsSubText2\nǡ ԝ        : \n# ^UnComponentsText\n ԝ         ԝ      . $_CLICK\n# ^UnComponentsSubText1\n    : \n# ^UnComponentsSubText2_NoInstTypes\nԝ       :\n# ^UnComponentsSubText2\nǡ ԝ        : \n# ^DirText\n ȡ $(^NameDA)       .       Ϙ        . $_CLICK\n# ^DirSubText\n \n# ^DirBrowseText\n    $(^NameDA):\n# ^UnDirText\n ȡ $(^NameDA)       .       Ϙ        . $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n    $(^NameDA):\n# ^SpaceAvailable\n\" : \"\n# ^SpaceRequired\n\"  : \"\n# ^UninstallingText\n(^NameDA)      . $_CLICK\n# ^UninstallingSubText\n : \n# ^FileError\n      : \\r\\n\\r\\n$0\\r\\n\\n     Abort \\r\\n     Retry \\r\\n   ݝ     Ignore  .\n# ^FileError_NoIgnore\n      : \\r\\n\\r\\n$0\\r\\n\\n    Retry\\r\\n    Cancel  .\n# ^CantWrite\n\"  : \"\n# ^CopyFailed\n  .\n# ^CopyTo\n\" : \"\n# ^Registering\n\"  : \"\n# ^Unregistering\n\"   : \"\n# ^SymbolNotFound\n\"  : \"\n# ^CouldNotLoad\n\"ѐ  : \"\n# ^CreateFolder\n\" : \"\n# ^CreateShortcut\n\" : \"\n# ^CreatedUninstaller\n\"ݝ  : \"\n# ^Delete\n\" : \"\n# ^DeleteOnReboot\n\"    : \"\n# ^ErrorCreatingShortcut\n\"   : \"\n# ^ErrorCreating\n\"  : \"\n# ^ErrorDecompressing\n    ! ȝ  ʿ\n# ^ErrorRegistering\n   DLL\n# ^ExecShell\n\" : \"\n# ^Exec\n\": \"\n# ^Extract\n\": \"\n# ^ErrorWriting\n\":     \"\n# ^InvalidOpcode\nȝ  :   .\n# ^NoOLE\n\"OLE  : \"\n# ^OutputFolder\n\" : \"\n# ^RemoveFolder\n\" : \"\n# ^RenameOnReboot\n\"     : \"\n# ^Rename\n\" : \"\n# ^Skipped\n\"  : \"\n# ^CopyDetails\n   큝\n# ^LogInstall\n  \n# ^Byte\n \n# ^Kilo\n \n# ^Mega\n \n# ^Giga\n \n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Farsi.nsh",
    "content": ";Language: Farsi (1065)\n;By FzerorubigD - FzerorubigD@gmail.com - Thanx to all people help me in forum.persiantools.com\n\n!insertmacro LANGFILE \"Farsi\" \"Farsi\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"    $(^NameDA)  .\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"       $(^NameDA)  .$\\r$\\n$\\r$\\n         .                     .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"   $(^NameDA)  .\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"     $(^NameDA)    .$\\r$\\n$\\r$\\n    $(^NameDA)        .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"    $(^NameDA)     .\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"ǐ          .    $(^NameDA)       .\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"ǐ           .    $(^NameDA)       . $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"ǐ           .    $(^NameDA)       . $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"         $(^NameDA)  .\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"ǐ          .   $(^NameDA)       .\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"ǐ           .   $(^NameDA)       . $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"ǐ           .   $(^NameDA)       . $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"        Page Down  .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"   \"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"   $(^NameDA)       .\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"  $(^NameDA)       .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"              .\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"              .\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"     $(^NameDA)       .\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"    \"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"    $(^NameDA)       .\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \" \"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"     $(^NameDA)       .\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"     .\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"   .\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"       .\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"     $(^NameDA)       .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"     .\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"   \"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"       \"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"   $(^NameDA)  \"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA)      .$\\r$\\n$\\r$\\n          .\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"     $(^NameDA)     .        Ͽ\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"  $(^NameDA)  \"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA)      .$\\r$\\n$\\r$\\n          .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"    $(^NameDA)     .       Ͽ\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"  .\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"       .\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&  $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&  \"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"     \"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"      $(^NameDA)    Ȑ   .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"                .          .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \" \"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \" $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"  $(^NameDA)    .\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"       $(^Name)  Ͽ\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"        $(^Name)  Ͽ\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Finnish.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1035\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Eclipser (Jonne Lehtinen) <Eclipser at pilvikaupunki dot net>\n# Corrections by the Mozilla.fi crew\n# ^Branding\nNullsoftin asennusjrjestelm %s\n# ^SetupCaption\n$(^Name) Asennus\n# ^UninstallCaption\n$(^Name) Poisto\n# ^LicenseSubCaption\n: Lisenssisopimus\n# ^ComponentsSubCaption\n: Asennusvaihtoehdot\n# ^DirSubCaption\n: Asennuskansio\n# ^InstallingSubCaption\n: Asennetaan\n# ^CompletedSubCaption\n: Valmis\n# ^UnComponentsSubCaption\n: Poistovaihtoehdot\n# ^UnDirSubCaption\n: Poistokansio\n# ^ConfirmSubCaption\n: Varmistus\n# ^UninstallingSubCaption\n: Poistetaan\n# ^UnCompletedSubCaption\n: Valmis\n# ^BackBtn\n< &Takaisin\n# ^NextBtn\n&Seuraava >\n# ^AgreeBtn\n&Hyvksyn\n# ^AcceptBtn\nHyvksyn lisenssisopimuksen ehdot\n# ^DontAcceptBtn\nEn hyvksy sopimuksen ehtoja\n# ^InstallBtn\n&Asenna\n# ^UninstallBtn\n&Poista\n# ^CancelBtn\nPeruuta\n# ^CloseBtn\n&Sulje\n# ^BrowseBtn\nS&elaa...\n# ^ShowDetailsBtn\n&Nyt tiedot\n# ^ClickNext\nValitse Seuraava jatkaaksesi.\n# ^ClickInstall\nValitse Asenna aloittaaksesi asennuksen.\n# ^ClickUninstall\nValitse Poista poistaaksesi asennuksen.\n# ^Name\nNimi\n# ^Completed\nValmis\n# ^LicenseText\nLue lisenssisopimus ennen asentamista. Jos hyvksyt sopimuksen kaikki ehdot, valitse Hyvksyn.\n# ^LicenseTextCB\nLue lisenssisopimus ennen asentamista. Jos hyvksyt sopimuksen kaikki ehdot, laita rasti ruutuun. $_CLICK\n# ^LicenseTextRB\nLue lisenssisopimus ennen asentamista. Jos hyvksyt sopimuksen kaikki ehdot, valitse ensimminen vaihtoehto alapuolelta. $_CLICK\n# ^UnLicenseText\nLue lisenssisopimus ennen poistamista. Jos hyvksyt sopimuksen kaikki ehdot, valitse Hyvksyn.\n# ^UnLicenseTextCB\nLue lisenssisopimus ennen poistamista. Jos hyvksyt sopimuksen kaikki ehdot, laita rasti ruutuun. $_CLICK\n# ^UnLicenseTextRB\nLue lisenssisopimus ennen poistamista. Jos hyvksyt sopimuksen kaikki ehdot, valitse ensimminen vaihtoehto alapuolelta. $_CLICK\n# ^Custom\nOma\n# ^ComponentsText\nValitse komponentit, jotka haluat asentaa, ja poista valinta komponenteista, joita et halua asentaa. $_CLICK\n# ^ComponentsSubText1\nValitse asennustyyppi:\n# ^ComponentsSubText2_NoInstTypes\nValitse asennettavat komponentit:\n# ^ComponentsSubText2\nTai, valitse valinnaiset komponentit, jotka haluat asentaa:\n# ^UnComponentsText\nValitse komponentit, jotka haluat poistaa, ja poista valinta komponenteista, joita et haluat poistaa. $_CLICK\n# ^UnComponentsSubText1\nValitse poistotyyppi:\n# ^UnComponentsSubText2_NoInstTypes\nValitse poistettavat komponentit:\n# ^UnComponentsSubText2\nTai, valitse valinnaiset komponentit, jotka haluat poistaa\n# ^DirText\nAsennus asentaa ohjelman $(^NameDA) seuraavaan kansioon. Jos haluat asentaa sen johonkin muuhun kansioon, valitse Selaa, ja valitse toinen kansio. $_CLICK\n# ^DirSubText\nKohdekansio\n# ^DirBrowseText\nValitse kansio, johon haluat asentaa ohjelman $(^NameDA):\n# ^UnDirText\nAsennus poistaa ohjelman $(^NameDA) seuraavasta kansiosta. Jos haluat poistaa sen jostakin muusta kansiosta, valitse Selaa, ja valitse toinen kansio. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nValitse kansio, josta haluat poistaa ohjelman $(^NameDA):\n# ^SpaceAvailable\n\"Tilaa vapaana: \"\n# ^SpaceRequired\n\"Tarvittava tila: \"\n# ^UninstallingText\nTm ohjelma poistaa ohjelman $(^NameDA) tietokoneelta. $_CLICK\n# ^UninstallingSubText\nPoistetaan kansiosta:\n# ^FileError\nTiedostoon ei voitu kirjoittaa: \\r\\n\\t\"$0\"\\r\\nLopeta asennus valitsemalla Hylk,\\r\\nyrit uudelleen valitsemalla Uudelleen, tai\\r\\nohita tiedosto valitsemalla Ohita\n# ^FileError_NoIgnore\nTiedostoon ei voitu kirjoittaa: \\r\\n\\t\"$0\"\\r\\nYrit uudelleen valitsemalla Uudelleen, tai\\r\\nlopeta asennus valitsemalla Hylk\n# ^CantWrite\n\"Ei voi kirjoittaa: \"\n# ^CopyFailed\nKopiointi eponnistui\n# ^CopyTo\n\"Kopioidaan kohteeseen \"\n# ^Registering\n\"Rekisteridn: \"\n# ^Unregistering\n\"Poistetaan rekisterinti: \"\n# ^SymbolNotFound\n\"Symbolia ei lytynyt: \"\n# ^CouldNotLoad\n\"Ei voitu ladata: \"\n# ^CreateFolder\n\"Luo kansio: \"\n# ^CreateShortcut\n\"Luo pikakuvake: \"\n# ^CreatedUninstaller\n\"Poisto-ohjelma luotiin: \"\n# ^Delete\n\"Poista: \"\n# ^DeleteOnReboot\n\"Poista kynnistyksen yhteydess: \"\n# ^ErrorCreatingShortcut\n\"Virhe luotaessa pikakuvaketta: \"\n# ^ErrorCreating\n\"Virhe luotaessa: \"\n# ^ErrorDecompressing\nPakettia ei voitu purkaa. Korruptoitunut asennusohjelma?\n# ^ErrorRegistering\nVirhe rekisteridess DLL-tiedostoa\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Suorita: \"\n# ^Extract\n\"Pura: \"\n# ^ErrorWriting\n\"Pura: tiedostoon ei voitu kirjoittaa \"\n# ^InvalidOpcode\nAsennuspaketti on vioittunut: virheellinen opcode\n# ^NoOLE\n\"Ei OLEa: \"\n# ^OutputFolder\n\"Kansio: \"\n# ^RemoveFolder\n\"Poista kansio: \"\n# ^RenameOnReboot\n\"Muuta nimi uudelleenkynnistyksen yhteydess: \"\n# ^Rename\n\"Muuta nimi: \"\n# ^Skipped\n\"Ohitettiin: \"\n# ^CopyDetails\nKopioi tiedot leikepydlle\n# ^LogInstall\nTallenna asennusloki\n# ^Byte\nt\n# ^Kilo\nk\n# ^Mega\nM\n# ^Giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Finnish.nsh",
    "content": ";Compatible with Modern UI 1.86\n;Language: Finnish (1035)\n;By Eclipser (Jonne Lehtinen) <Eclipser at pilvikaupunki dot com>\n;Updated by Puuhis (puuhis@puuhis.net)\n\n!insertmacro LANGFILE \"Finnish\" \"Suomi\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Tervetuloa ohjelman $(^NameDA) asennukseen\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Tm avustaja ohjaa sinut ohjelman $(^NameDA) asennuksen lpi.$\\r$\\n$\\r$\\nOn suositeltavaa sulkea kaikki muut ohjelmat ennen asennuksen aloittamista, jotta asennus voisi pivitt tiettyj jrjestelmtiedostoja kynnistmtt konetta uudelleen.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Tervetuloa $(^NameDA) -ohjelmiston poisto-ohjelmaan\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Tm velho auttaa sinut lpi $(^NameDA) -ohjelmiston poistamisen.$\\r$\\n$\\r$\\nEnnen poisto-ohjelman aloitusta, varmista ettei $(^NameDA) ole kynniss.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Lisenssisopimus\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Lue lisenssiehdot tarkasti ennen ohjelman $(^NameDA) asentamista.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Jos hyvksyt ehdot, valitse Hyvksyn jatkaaksesi. Sinun pit hyvksy ehdot asentaaksesi ohjelman $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Jos hyvksyt ehdot, laita rasti alla olevaan ruutuun. Sinun pit hyvksy ehdot asentaaksesi ohjelman $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Jos hyvksyt ehdot, valitse ensimminen vaihtoehto alapuolelta. Sinun pit hyvksy ehdot asentaaksesi ohjelman $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Lisenssisopimus\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Lue huolellisesti lisenssiehdot ennen $(^NameDA) -ohjelmiston poistoa.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Jos hyvksyt snnt ja ehdot, paina Hyvksyn -nappia jatkaakseni. Sinun tytyy hyvksy ehdot poistaaksesi $(^NameDA) -ohjelmiston.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Jos hyvksyt ehdot, klikkaa valintaruutua alhaalla. Sinun tytyy hyvksy ehdot poistaaksesi $(^NameDA) -ohjelmiston. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Jos hyvksyt ehdot, valitse ensimminen vaihtoehto alhaalta. Sinun tytyy hyvksy ehdot poistaaksesi $(^NameDA) -ohjelmiston. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Paina Page Down nhdksesi loput sopimuksesta.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Valitse komponentit\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Valitse toiminnot, jotka haluat asentaa ohjelmaan $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Valitse komponentit\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Valitse $(^NameDA) toiminnot, jotka haluat poistaa.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Selitys\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Siirr hiiri komponentin nimen plle saadaksesi sen selityksen.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Siirr hiiri komponentin nimen plle saadaksesi sen selityksen.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Valitse asennuskohde\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Valitse hakemisto, johon haluat asentaa ohjelman $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Valitse paikka mist poistetaan\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Valitse kansio mist $(^NameDA) poistetaan.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Asennetaan\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Odota... $(^NameDA) asennetaan...\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Asennus valmis\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Asennus valmistui onnistuneesti.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Asennus keskeytettiin\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Asennus ei onnistunut.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Poistetaan\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Odota... Ohjelmaa $(^NameDA) poistetaan.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Poisto valmis\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Ohjelma poistettiin onnistuneesti.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Poisto lopetettu\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Ohjelmaa poisto eponnistuneesti.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Viimeistelln ohjelman $(^NameDA) asennusta\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) on asennettu koneellesi.$\\r$\\n$\\r$\\nValitse Valmis sulkeaksesi avustajan.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Tietokoneesi pit kynnist uudelleen jotta ohjelman $(^NameDA) asennus saataisiin valmiiksi. Haluatko kynnist koneen uudelleen nyt?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Viimeistelln $(^NameDA) -ohjelmiston poistamista\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) on poistettu koneeltasi.$\\r$\\n$\\r$\\nPaina Lopeta -nappia sulkeaksesi tmn velhon.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Jotta $(^NameDA) -ohjelmiston poistaminen olisi valmis, tulee tietokone kynnist uudelleen. Haluatko uudelleenkynnist nyt?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Kynnist uudelleen nyt\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Kynnistn koneen myhemmin uudelleen\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"Kynnist $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Nyt LueMinut\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Valmis\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Valitse Kynnist-valikon hakemisto\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Valitse Kynnist-valikon hakemisto ohjelman pikakuvakkeille.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Valitse Kynnist-valikon hakemisto, johon haluaisit luoda ohjelman pikakuvakkeet. Voit mys kirjoittaa uuden nimen.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"l luo pikakuvakkeita\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Poista $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Poista $(^NameDA) tietokoneestasi.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Haluatko varmasti lopettaa $(^Name) Asennuksen?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Oletko varma ett haluat poistua $(^Name) poisto-ohjelmasta?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/French.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1036\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by the French NSIS team <veekee@winampfr.com> - http://www.winampfr.com/nsis.\n# Updated to v6 by Jerome Charaoui (lavamind@inetflex.com)\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\nInstallation de $(^Name)\n# ^UninstallCaption\nDsinstallation de $(^Name)\n# ^LicenseSubCaption\n: Licence\n# ^ComponentsSubCaption\n: Options d'installation\n# ^DirSubCaption\n: Dossier d'installation\n# ^InstallingSubCaption\n: Installation des fichiers\n# ^CompletedSubCaption\n: Termin\n# ^UnComponentsSubCaption\n: Options de dsinstallation\n# ^UnDirSubCaption\n: Dossier de dsinstallation\n# ^ConfirmSubCaption\n: Confirmation\n# ^UninstallingSubCaption\n: Dsinstallation des fichiers\n# ^UnCompletedSubCaption\n: Termin\n# ^BackBtn\n< &Prcdent\n# ^NextBtn\n&Suivant >\n# ^AgreeBtn\nJ'a&ccepte\n# ^AcceptBtn\nJ'a&ccepte les termes de la licence\n# ^DontAcceptBtn\nJe &n'accepte pas les termes de la licence\n# ^InstallBtn\n&Installer\n# ^UninstallBtn\n&Dsinstaller\n# ^CancelBtn\nAnnuler\n# ^CloseBtn\n&Fermer\n# ^BrowseBtn\nP&arcourir...\n# ^ShowDetailsBtn\nP&lus d'infos\n# ^ClickNext\nCliquez sur Suivant pour continuer.\n# ^ClickInstall\nCliquez sur Installer pour dmarrer l'installation.\n# ^ClickUninstall\nCliquez sur Dsinstaller pour dmarrer la dsinstallation.\n# ^Name\nNom\n# ^Completed\nTermin\n# ^LicenseText\nVeuillez examiner le contrat de licence avant d'installer $(^NameDA). Si vous acceptez tous les termes du contrat, cliquez sur J'accepte.\n# ^LicenseTextCB\nVeuillez examiner le contrat de licence avant d'installer $(^NameDA). Si vous acceptez tous les termes du contrat, cochez la bote de contrle ci-dessous. $_CLICK\n# ^LicesnseTextRB\nVeuillez examiner le contrat de licence avant d'installer $(^NameDA). Si vous acceptez tous les termes du contrat, slectionnez la premire option ci-dessous. $_CLICK\n# ^UnLicenseText\nVeuillez examiner le contrat de licence avant de dsinstaller $(^NameDA). Si vous acceptez tous les termes du contrat, cliquez sur J'accepte.\n# ^UnLicenseTextCB\nVeuillez examiner le contrat de licence avant de dsinstaller $(^NameDA). Si vous acceptez tous les termes du contrat, cochez la bote de contrle ci-dessous. $_CLICK\n# ^UnLicesnseTextRB\nVeuillez examiner le contrat de licence avant de dsinstaller $(^NameDA). Si vous acceptez tous les termes du contrat, slectionnez la premire option ci-dessous. $_CLICK\n# ^Custom\nPersonnalise\n# ^ComponentsText\nCochez les composants que vous dsirez installer et dcochez ceux que vous ne dsirez pas installer. $_CLICK\n# ^ComponentsSubText1\nType d'installation :\n# ^ComponentsSubText2_NoInstTypes\nSlectionnez les composants  installer :\n# ^ComponentsSubText2\nOu, slectionnez les composants optionnels que vous voulez installer :\n# ^UnComponentsText\nCochez les composants que vous dsirez dsinstaller et dcochez ceux que vous ne dsirez pas dsinstaller. $_CLICK\n# ^UnComponentsSubText1\nSlectionnez le type de dsinstallation :\n# ^UnComponentsSubText2_NoInstTypes\nSlectionnez les composants  dsinstaller :\n# ^UnComponentsSubText2\nOu, slectionnez les composants optionnels que vous voulez dsinstaller :\n# ^DirText\nCeci installera $(^NameDA) dans le dossier suivant. Pour installer dans un autre dossier, cliquez sur Parcourir et choisissez un autre dossier. $_CLICK\n# ^DirSubText\nDossier d'installation\n# ^DirBrowseText\nSlectionnez le dossier d'installation pour $(^NameDA) :\n# ^UnDirText\nCeci dsinstallera $(^NameDA) du dossier suivant. Pour dsinstaller d'un autre dossier, cliquez sur Parcourir et choisissez un autre dossier. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nSlectionnez le dossier de dsinstallation pour $(^NameDA) :\n# ^SpaceAvailable\n\"Espace disponible : \"\n# ^SpaceRequired\n\"Espace requis : \"\n# ^UninstallingText\nCe programme dsinstallera $(^NameDA) de votre ordinateur. $_CLICK\n# ^UninstallingSubText\nDsinstallation  partir de :\n# ^FileError\nErreur lors de l'ouverture du fichier en criture : \\r\\n\\t\"$0\"\\r\\nAppuyez sur Abandonner pour annuler l'installation,\\r\\nRessayer pour ressayer l'criture du fichier, ou\\r\\nIgnorer pour passer ce fichier\n# ^FileError_NoIgnore\nErreur lors de l'ouverture du fichier en criture : \\r\\n\\t\"$0\"\\r\\nAppuyez sur Ressayez pour re-crire le fichier, ou\\r\\nAnnuler pour abandonner l'installation\n# ^CantWrite\n\"Impossible d'crire : \"\n# ^CopyFailed\nchec de la copie\n# ^CopyTo\n\"Copier vers \"\n# ^Registering\n\"Enregistrement : \"\n# ^Unregistering\n\"Suppression de l'enregistrement : \"\n# ^SymbolNotFound\n\"Impossible de trouver un symbole : \"\n# ^CouldNotLoad\n\"Impossible de charger : \"\n# ^CreateFolder\n\"Cration du dossier : \"\n# ^CreateShortcut\n\"Cration du raccourci : \"\n# ^CreatedUninstaller\n\"Cration de la dsinstallation : \"\n# ^Delete\n\"Suppression : \"\n# ^DeleteOnReboot\n\"Suppression au redmarrage : \"\n# ^ErrorCreatingShortcut\n\"Erreur lors de la cration du raccourci : \"\n# ^ErrorCreating\n\"Erreur de la cration : \"\n# ^ErrorDecompressing\nErreur lors de la dcompression des donnes ! Installation corrompue ?\n# ^ErrorRegistering\nErreur lors de l'enregistrement de la DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Excution : \"\n# ^Extract\n\"Extraction : \"\n# ^ErrorWriting\n\"Extraction : erreur d'criture du fichier \"\n# ^InvalidOpcode\nInstallation corrompue : opcode incorrect\n# ^NoOLE\n\"Pas de OLE pour : \"\n# ^OutputFolder\n\"Destination : \"\n# ^RemoveFolder\n\"Suppression du dossier : \"\n# ^RenameOnReboot\n\"Renommer au redmarrage : \"\n# ^Rename\n\"Renommer : \"\n# ^Skipped\n\"Pass : \"\n# ^CopyDetails\nCopier les Dtails dans le Presse-papier\n# ^LogInstall\nEnregistrer le droulement de l'installation\n# ^Byte\no\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/French.nsh",
    "content": ";Language: French (1036)\n;By Sbastien Delahaye <seb@delahaye.net>\n\n!insertmacro LANGFILE \"French\" \"French\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Bienvenue dans le programme d'installation de $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Vous tes sur le point d'installer $(^NameDA) sur votre ordinateur.$\\r$\\n$\\r$\\nAvant de dmarrer l'installation, il est recommand de fermer toutes les autres applications. Cela permettra la mise  jour de certains fichiers systme sans redmarrer votre ordinateur.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Bienvenue dans le programme de dsinstallation de $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Vous tes sur le point de dsinstaller $(^NameDA) de votre ordinateur.$\\r$\\n$\\r$\\nAvant d'amorcer la dsinstallation, assurez-vous que $(^NameDA) ne soit pas en cours d'excution.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Licence utilisateur\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Veuillez examiner les termes de la licence avant d'installer $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Si vous acceptez les conditions de la licence utilisateur, cliquez sur J'accepte pour continuer. Vous devez accepter la licence utilisateur afin d'installer $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Si vous acceptez les conditions de la licence utilisateur, cochez la case ci-dessous. Vous devez accepter la licence utilisateur afin d'installer $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Si vous acceptez les conditions de la licence utilisateur, slectionnez le premier choix ci-dessous. Vous devez accepter la licence utilisateur afin d'installer $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Licence utilisateur\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Veuillez examiner les conditions de la licence avant de dsinstaller $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Si vous acceptez les conditions de la licence utilisateur, cliquez sur J'accepte pour continuer. Vous devez accepter la licence utilisateur afin de dsinstaller $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Si vous acceptez les conditions de la licence utilisateur, cochez la case ci-dessous. Vous devez accepter la licence utilisateur afin de dsintaller $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Si vous acceptez les conditions de la licence utilisateur, slectionnez le premier choix ci-dessous. Vous devez accepter la licence utilisateur afin de dsinstaller $(^NameDA).\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Appuyez sur Page Suivante pour lire le reste de la licence utilisateur.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Choisissez les composants\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Choisissez les composants de $(^NameDA) que vous souhaitez installer.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Choisissez les composants\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Cochez les composants de $(^NameDA) que vous souhaitez dsinstaller.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Description\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Passez le curseur de votre souris sur un composant pour en voir la description.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Passez le curseur de votre souris sur un composant pour en voir la description.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Choisissez le dossier d'installation\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Choisissez le dossier dans lequel installer $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Choisissez le dossier de dsinstallation\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Choisissez le dossier  partir duquel vous voulez dsinstaller $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Installation en cours\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Veuillez patienter pendant que $(^NameDA) est en train d'tre install.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Installation termine\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"L'installation s'est termine avec succs.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Installation interrompue\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"L'installation n'a pas t termine.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Dsinstallation en cours\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Veuillez patienter pendant que $(^NameDA) est en train d'tre supprim de votre ordinateur.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Dsinstallation termine\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"La dsinstallation s'est termine avec succs.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Dsinstallation interrompue\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"La dsinstallation n'a pas t termine.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Fin de l'installation de $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) a t install sur votre ordinateur.$\\r$\\n$\\r$\\nCliquez sur Fermer pour quitter le programme d'installation.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Votre ordinateur doit tre redmarr afin de complter l'installation de $(^NameDA). Souhaitez-vous redmarrer maintenant ?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Fin de la dsinstallation de $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) a t supprim de votre ordinateur.$\\r$\\n$\\r$\\nCliquez sur Fermer pour quitter le programme d'installation.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Votre ordinateur doit tre redmarr pour terminer la dsinstallation de $(^NameDA). Souhaitez-vous redmarrer maintenant ?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Redmarrer maintenant\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Je souhaite redmarrer moi-mme plus tard\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"Lancer $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Afficher le fichier Readme\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Fermer\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Choisissez un dossier dans le menu Dmarrer\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Choisissez un dossier dans le menu Dmarrer pour les raccourcis de l'application.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Choisissez le dossier du menu Dmarrer dans lequel vous voulez placer les raccourcis du programme. Vous pouvez galement entrer un nouveau nom pour crer un nouveau dossier.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Ne pas crer de raccourcis\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Dsinstaller $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Supprimer $(^NameDA) de votre ordinateur.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"tes-vous sr de vouloir quitter l'installation de $(^Name) ?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"tes-vous sr de vouloir quitter la dsinstallation de $(^Name) ?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Choix des utilisateurs\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Slection des utilisateurs dsirant utiliser $(^NameDA).\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Choix entre installer $(^NameDA) seulement pour vous-mme  ou bien pour tous les utilisateurs du systme. $(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Installer pour tous les utilisateurs\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Installer seulement pour moi\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Galician.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1110\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation v 1.0.0 by Ramon Flores <fa2ramon@usc.es>\n# ^Branding\nSistema de Instalacin Nullsoft %s\n# ^SetupCaption\nInstalacin de $(^Name)\n# ^UninstallCaption\nDesinstalacin de $(^Name)\n# ^LicenseSubCaption\n: Contrato de licenza\n# ^ComponentsSubCaption\n: Opcins de instalacin\n# ^DirSubCaption\n: Diretria de instalacin\n# ^InstallingSubCaption\n: Instalando ficheiros\n# ^CompletedSubCaption\n: Concludo\n# ^UnComponentsSubCaption\n: Opcins de desinstalacin\n# ^UnDirSubCaption\n: Cartafol de desinstalacin\n# ^ConfirmSubCaption\n: Confirmacin\n# ^UninstallingSubCaption\n: Desinstalando\n# ^UnCompletedSubCaption\n: Concludo\n# ^BackBtn\n< &Anterior\n# ^NextBtn\n&Seguinte >\n# ^AgreeBtn\n&Aceito\n# ^AcceptBtn\nEu &aceito os termos do Contrato de licenza\n# ^DontAcceptBtn\nEu &non aceito os termos do Contrato de licenza\n# ^InstallBtn\n&Instalar\n# ^UninstallBtn\n&Desinstalar\n# ^CancelBtn\nCancelar\n# ^CloseBtn\n&Fechar\n# ^BrowseBtn\n&Procurar...\n# ^ShowDetailsBtn\nVer &Detalles\n# ^ClickNext\nClique en 'Seguinte' para continuar.\n# ^ClickInstall\nClique en 'Instalar' para iniciar a instalacin.\n# ^ClickUninstall\nClique en 'Desinstalar' para iniciar a desinstalacin.\n# ^Name\nNome\n# ^Completed\nConcludo\n# ^LicenseText\nPor favor revexa o acordo de licenza antes de instalar $(^NameDA). Se concordar con todos os termos da licenza, clique em 'Aceito'.\n# ^LicenseTextCB\nPor favor reveja o acordo de licenza antes de instalar $(^NameDA). Se concordar con todos os termos da licenza, clique na caixa de seleccin abaixo. $_CLICK\n# ^LicenseTextRB\nPor favor revexa o acordo de licenza antes de instalar $(^NameDA). Se concordar con todos os termos da licenza, escolla a primeira opcin abaixo. $_CLICK\n# ^UnLicenseText\nPor favor revexa o acordo de licenza antes de desinstalar $(^NameDA). Se concordar con todos os termos da licenza, clique em 'Aceito'.\n# ^UnLicenseTextCB\nPor favor reveja o acordo de licenza antes de desinstalar $(^NameDA). Se concordar con todos os termos da licenza, clique na caixa de seleccin abaixo. $_CLICK\n# ^UnLicenseTextRB\nPor favor revexa o acordo de licenza antes de desinstalar $(^NameDA). Se concordar con todos os termos da licenza, escolla a primeira opcin abaixo. $_CLICK\n# ^Custom\nPersonalizado\n# ^ComponentsText\nMarque os componentes que desexa instalar e desmarque os componentes que non desexa instalar. $_CLICK\n# ^ComponentsSubText1\nEscolla o tipo de instalacin:\n# ^ComponentsSubText2_NoInstTypes\nEscolla os componentes para instalar:\n# ^ComponentsSubText2\nOu, escolla os componentes opcionais que desexa instalar:\n# ^UnComponentsText\nMarque os componentes que queira desinstalar e vice versa. $_CLICK\n# ^UnComponentsSubText1\nEscolla o tipo de desinstalacin:\n# ^UnComponentsSubText2_NoInstTypes\nEscolla os componentes para desinstalar:\n# ^UnComponentsSubText2\nOu, escolla os componentes opcionais que queira desinstalar:\n# ^DirText\nO $(^NameDA) ser instalado na seguinte directria. Para instalar nunha directria diferente, clique en 'Procurar...' e escolla outra directria. $_CLICK\n# ^DirSubText\nDirectria de destino\n# ^DirBrowseText\nEscolla unha directria para instalar o $(^NameDA):\n# ^UnDirText\nO $(^NameDA) ser desinstalado da seguinte directria. Para desinstalar dunha pasta diferente, clique en 'Procurar...' e escolla outra directria. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nEscolla a directria de onde vai ser desinstalado o $(^NameDA):\n# ^SpaceAvailable\n\"Espazo disponbel: \"\n# ^SpaceRequired\n\"Espazo necesrio: \"\n# ^UninstallingText\n$(^NameDA) vai ser desinstalado da seguinte directria. $_CLICK\n# ^UninstallingSubText\nDesinstalando de:\n# ^FileError\nErro ao abrir ficheiro para escrita: \\r\\n\\t\"$0\"\\r\\nClique en Abortar para abortar a instalacin,\\r\\nRepetir para tentar novamente a escrita do ficheiro, ou\\r\\nIgnorar para ignorar este ficheiro.\n# ^FileError_NoIgnore\nErro ao abrir ficheiro para escrita: \\r\\n\\t\"$0\"\\r\\nClique en Repetir para tentar novamente a gravacin do ficheiro, ou\\r\\nCancelar para abortar a instalacin.\n# ^CantWrite\n\"Non foi posbel escreber: \"\n# ^CopyFailed\nFalla ao copiar\n# ^CopyTo\n\"Copiar para \"\n# ^Registering\n\"Rexistando: \"\n# ^Unregistering\n\"Desrexistando: \"\n# ^SymbolNotFound\n\"Smbolo non achado: \"\n# ^CouldNotLoad\n\"Non foi posbel carregar: \"\n# ^CreateFolder\n\"Criando diretria: \"\n# ^CreateShortcut\n\"Criando atallo: \"\n# ^CreatedUninstaller\n\"Criando desinstalador: \"\n# ^Delete\n\"Eliminando ficheiro: \"\n# ^DeleteOnReboot\n\"Eliminar ao reiniciar: \"\n# ^ErrorCreatingShortcut\n\"Erro ao criar atallo: \"\n# ^ErrorCreating\n\"Erro ao criar: \"\n# ^ErrorDecompressing\nErro ao descomprimir dados! Instalador corrompido?\n# ^ErrorRegistering\nErro ao rexistar DLL\n# ^ExecShell\n\"Executando polo Shell: \"\n# ^Exec\n\"Executando: \"\n# ^Extract\n\"Extraindo: \"\n# ^ErrorWriting\n\"Extraindo: erro ao escreber ficheiro \"\n# ^InvalidOpcode\nInstalador corrompido: cdigo de operacin invlido\n# ^NoOLE\n\"Sen OLE para: \"\n# ^OutputFolder\n\"Cartafol de destino: \"\n# ^RemoveFolder\n\"Removendo cartafol: \"\n# ^RenameOnReboot\n\"Renomear ao reiniciar: \"\n# ^Rename\n\"Renomeando: \"\n# ^Skipped\n\"Ignorado: \"\n# ^CopyDetails\nCopiar detalles para a rea de transfrencia\n# ^LogInstall\nRexistar proceso de instalacin\n# ^Byte\nB\n# kilo\nK\n# mega\nM\n# giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Galician.nsh",
    "content": ";Language: Galician (1110)\n;Ramon Flores <fa2ramon@usc.es>\n\n!insertmacro LANGFILE \"Galician\" \"Galego\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Benvindo ao Asistente de Instalacin do $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Este asistente vai axud-lo durante a instalacin do $(^NameDA).$\\r$\\n$\\r$\\nRecomenda-se fechar todas as outras aplicacins antes de iniciar a instalacin. Isto posibilita actualizar os ficheiros do sistema relevantes sen ter que reiniciar o computador.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Benvindo ao Asistente de desinstalacin do $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Este asistente vai axud-lo durante a desinstalacin do $(^NameDA).$\\r$\\n$\\r$\\nAntes de iniciar a desinstalacin, certifique-se de que o $(^NameDA) non est a executar-se.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Contrato de licenza\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Por favor, verifique os termos da licenza antes de instalar o $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Se aceitar os termos da licenza, clique en 'Aceito' para continuar. Cumpre aceitar o contrato para instalar o $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Se aceitar os termos da licenza, clique na caixa de seleccin abaixo. Cumpre aceitar o contrato para instalar o $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Se aceitar os termos da licenza, seleccione a primeira opcin abaixo. Cumpre aceitar o contrato para instalar o $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Contrato de licenza\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Por favor, verifique os termos da licenza antes de desinstalar o $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Se aceitar os termos da licenza, clique en 'Aceito' para continuar. Cumpre aceitar o contrato para desinstalar o $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Se aceitar os termos da licenza, clique na caixa de seleccin abaixo. Cumpre aceitar o contrato para desinstalar o $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Se aceitar os termos da licenza, seleccione a primeira opcin abaixo. Cumpre aceitar o contrato para desinstalar o $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Prema Page Down para ver o restante da licenza.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Escolla de componentes\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Escolla que caractersticas do $(^NameDA) que desexa instalar.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Escoller componentes\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Escolla que caractersticas do $(^NameDA) desexa desinstalar.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Descricin\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Posicione o rato sobre un componente para ver a sua descricin.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Posicione o rato sobre un componente para ver a sua descricin.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Escolla do local da instalacin\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Escolla a directria na cal desexa instalar o $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Escolla o Local de desinstalacin\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Escolla a directria de onde pretende desinstalar o $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Instalando\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Por favor, agarde entanto o $(^NameDA) est sendo instalado.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Instalacin completa\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"A instalacin concluiu con suceso.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalacin Abortada\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"A instalacin concluiu sen suceso.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Desinstalando\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Por favor, agarde entanto se desinstala o $(^NameDA).\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Desinstalacin completa\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"A desinstalacin concluiu con suceso.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Desinstalacin abortada\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"A desinstalacin non concluiu con suceso\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Concluindo o Asistente de instalacin do $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"Instalou-se o $(^NameDA) no seu computador.$\\r$\\n$\\r$\\nClique en Rematar para fechar este asistente.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Cumpre reiniciar o seu computador para conclur a instalacin do $(^NameDA). Desexa reiniciar agora?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Conclundo o asistente de desinstalacin do $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"Eliminou-se $(^NameDA) do seu computador.$\\r$\\n$\\r$\\nClique em Rematar para fechar este asistente.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Cumpre reiniciar o seu computador para conclur a desinstalacin do $(^NameDA). Desexa reinici-lo agora?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Reiniciar agora\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Prefiro reinicia-lo manualmente despois\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Executar $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Mostrar Leame\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Rematar\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Escolla un cartafol do Menu Iniciar\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Escolla un cartafol do Menu Iniciar para os atallos do programa.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Seleccione o cartafol do Menu Iniciar no que desexa criar os atallos do programa. Tamn  posbel dixitar un nome para criar un novo cartafol. \"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Non criar atallos\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Desinstalar $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Eliminar o $(^NameDA) do seu computador.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Realmente desexa cancelar a instalacin do $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Realmente desexa cancelar a desinstalacin do $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/German.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1031\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by L.King, changes by R. Bisswanger, Tim Kosse\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) Installation\n# ^UninstallCaption\n$(^Name) Deinstallation\n# ^LicenseSubCaption\n: Lizenzabkommen\n# ^ComponentsSubCaption\n: Installations-Optionen\n# ^DirSubCaption\n: Zielverzeichnis\n# ^InstallingSubCaption\n: Installiere\n# ^CompletedSubCaption\n: Fertig\n# ^UnComponentsSubCaption\n: Deinstallations-Optionen\n# ^UnDirSubCaption\n: Quellverzeichnis\n# ^ConfirmSubCaption\n: Besttigung\n# ^UninstallingSubCaption\n: Entferne\n# ^UnCompletedSubCaption\n: Fertig\n# ^BackBtn\n< &Zurck\n# ^NextBtn\n&Weiter >\n# ^AgreeBtn\n&Annehmen\n# ^AcceptBtn\nIch &akzeptiere das Lizenzabkommen.\n# ^DontAcceptBtn\nIch &lehne das Lizenzabkommen ab.\n# ^InstallBtn\n&Installieren\n# ^UninstallBtn\n&Deinstallieren\n# ^CancelBtn\nAbbrechen\n# ^CloseBtn\n&Beenden\n# ^BrowseBtn\n&Durchsuchen...\n# ^ShowDetailsBtn\n&Details anzeigen\n# ^ClickNext\nKlicken Sie auf Weiter, um fortzufahren.\n# ^ClickInstall\nKlicken Sie auf Installieren, um die Installation zu starten.\n# ^ClickUninstall\nKlicken Sie auf Deinstallieren, um die Deinstallation zu starten.\n# ^Name\nName\n# ^Completed\nFertig\n# ^LicenseText\nBitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) installieren. Wenn Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen.\n# ^LicenseTextCB\nBitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) installieren. Wenn Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kontrollkstchen. $_CLICK\n# ^LicenseTextRB\nBitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) installieren. Wenn Sie alle Bedingungen des Abkommens akzeptieren, whlen Sie die entsprechende Option. $_CLICK\n# ^UnLicenseText\nBitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) entfernen. Wenn Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen.\n# ^UnLicenseTextCB\nBitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) entfernen. Wenn Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kontrollkstchen. $_CLICK\n# ^UnLicenseTextRB\nBitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) entfernen. Wenn Sie alle Bedingungen des Abkommens akzeptieren, whlen Sie die entsprechende Option. $_CLICK\n# ^Custom\nBenutzerdefiniert\n# ^ComponentsText\nWhlen Sie die Komponenten aus, die Sie installieren mchten und whlen Sie diejenigen ab, die Sie nicht installieren wollen. $_CLICK\n# ^ComponentsSubText1\nInstallations-Typ bestimmen:\n# ^ComponentsSubText2_NoInstTypes\nWhlen Sie die Komponenten aus, die Sie installieren mchten:\n# ^ComponentsSubText2\noder whlen Sie zustzliche Komponenten aus, die Sie installieren mchten:\n# ^UnComponentsText\nWhlen Sie die Komponenten aus, die Sie entfernen mchten und whlen Sie diejenigen ab, die Sie nicht entfernen wollen. $_CLICK\n# ^UnComponentsSubText1\nDeinstallations-Typ bestimmen:\n# ^UnComponentsSubText2_NoInstTypes\nWhlen Sie die Komponenten aus, die Sie entfernen mchten:\n# ^UnComponentsSubText2\noder whlen Sie zustzliche Komponenten aus, die Sie entfernen mchten:\n# ^DirText\n$(^NameDA) wird in das unten angegebene Verzeichnis installiert. Falls Sie in ein anderes Verzeichnis installieren mchten, klicken Sie auf Durchsuchen und whlen Sie ein anderes Verzeichnis aus. $_CLICK\n# ^DirSubText\nZielverzeichnis\n# ^DirBrowseText\nWhlen Sie das Verzeichnis aus, in das Sie $(^NameDA) installieren mchten:\n# ^UnDirText\n$(^NameDA) wird aus dem unten angegebenen Verzeichnis entfernt. Falls sich $(^NameDA) in einem anderen Verzeichnis befindet, klicken Sie auf Durchsuchen und whlen Sie das richtige Verzeichnis aus. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nWhlen Sie das Verzeichnis aus, in dem sich $(^NameDA) befindet:\n# ^SpaceAvailable\n\"Verfgbarer Speicher: \"\n# ^SpaceRequired\n\"Bentigter Speicher: \"\n# ^UninstallingText\n$(^NameDA) wird aus dem unten angegebenen Verzeichnis entfernt. $_CLICK\n# ^UninstallingSubText\nEntferne aus:\n# ^FileError\nFehler beim berschreiben der Datei: \\r\\n\\t\"$0\"\\r\\nKlicken Sie auf Abbrechen, um abzubrechen,\\r\\nauf Wiederholen, um den Schreibvorgang erneut zu versuchen\\r\\noder auf Ignorieren, um diese Datei zu berspringen.\n# ^FileError_NoIgnore\nFehler beim berschreiben der Datei: \\r\\n\\t\"$0\"\\r\\nKlicken Sie auf Wiederholen, um den Schreibvorgang erneut zu versuchen\\r\\noder auf Abbrechen, um die Installation zu beenden.\n# ^CantWrite\n\"Fehler beim Schreiben: \"\n# ^CopyFailed\nKopieren fehlgeschlagen\n# ^CopyTo\n\"Kopiere nach \"\n# ^Registering\n\"Registriere: \"\n# ^Unregistering\n\"Deregistriere: \"\n# ^SymbolNotFound\n\"Symbol ist nicht vorhanden: \"\n# ^CouldNotLoad\n\"Fehler beim Laden von \"\n# ^CreateFolder\n\"Erstelle Verzeichnis: \"\n# ^CreateShortcut\n\"Erstelle Verknpfung: \"\n# ^CreatedUninstaller\n\"Erstelle Deinstallations-Programm: \"\n# ^Delete\n\"Lsche Datei: \"\n# ^DeleteOnReboot\n\"Lsche Datei nach Neustart: \"\n# ^ErrorCreatingShortcut\n\"Fehler beim Erstellen der Verknpfung: \"\n# ^ErrorCreating\n\"Fehler beim Erstellen: \"\n# ^ErrorDecompressing\nFehler beim Dekomprimieren. Beschdigtes Installations-Programm?\n# ^ErrorRegistering\nFehler beim Registrieren der DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Starte: \"\n# ^Extract\n\"Dekomprimiere: \"\n# ^ErrorWriting\n\"Dekomprimierung: Fehler beim Schreiben der Datei \"\n# ^InvalidOpcode\nBeschdigtes Installations-Programm: ungltiger Befehlscode\n# ^NoOLE\n\"Kein OLE fr: \"\n# ^OutputFolder\n\"Zielverzeichnis: \"\n# ^RemoveFolder\n\"Entferne Verzeichnis: \"\n# ^RenameOnReboot\n\"Umbenennen nach Neustart: \"\n# ^Rename\n\"Umbenennen: \"\n# ^Skipped\n\"bersprungen: \"\n# ^CopyDetails\nDetails in die Zwischenablage kopieren\n# ^LogInstall\nInstallationsverlauf protokollieren\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/German.nsh",
    "content": ";Language: German (1031)\n;By L.King, changes by K. Windszus & R. Bisswanger & M. Simmack & D. Wei\n\n!insertmacro LANGFILE \"German\" \"Deutsch\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Willkommen beim Installations-$\\r$\\nAssistenten fr $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Dieser Assistent wird Sie durch die Installation von $(^NameDA) begleiten.$\\r$\\n$\\r$\\nEs wird empfohlen, vor der Installation alle anderen Programme zu schlieen, damit bestimmte Systemdateien ohne Neustart ersetzt werden knnen.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Willkommen beim Deinstallations-$\\r$\\nAssistenten fr $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Dieser Assistent wird Sie durch die Deinstallation von $(^NameDA) begleiten.$\\r$\\n$\\r$\\nBitte beenden Sie $(^NameDA), bevor Sie mit der Deinstallation fortfahren.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Lizenzabkommen\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Bitte lesen Sie die Lizenzbedingungen durch, bevor Sie mit der Installation fortfahren.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Falls Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. Sie mssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu knnen.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Falls Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kstchen. Sie mssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu knnen. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Falls Sie alle Bedingungen des Abkommens akzeptieren, whlen Sie unten die entsprechende Option. Sie mssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu knnen. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Lizenzabkommen\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Bitte lesen Sie die Lizenzbedingungen durch, bevor Sie mit der Deinstallation von $(^NameDA) fortfahren.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Falls Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. Sie mssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu knnen.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Falls Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kstchen. Sie mssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu knnen. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Falls Sie alle Bedingungen des Abkommens akzeptieren, whlen Sie unten die entsprechende Option. Sie mssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu knnen. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Drcken Sie die Bild-nach-unten Taste, um den Rest des Abkommens zu sehen.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Komponenten auswhlen\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Whlen Sie die Komponenten aus, die Sie installieren mchten.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Komponenten auswhlen\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Whlen Sie die Komponenten aus, die Sie entfernen mchten.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Beschreibung\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Bewegen Sie den Mauszeiger ber eine Komponente, um ihre Beschreibung zu sehen.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Bewegen Sie den Mauszeiger ber eine Komponente, um ihre Beschreibung zu sehen.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Zielverzeichnis auswhlen\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Whlen Sie das Verzeichnis aus, in das $(^NameDA) installiert werden soll.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Verzeichnis fr Deinstallation auswhlen\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Whlen Sie das Verzeichnis aus, aus dem $(^NameDA) entfernt werden soll.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Installiere...\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Bitte warten Sie, whrend $(^NameDA) installiert wird.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Die Installation ist vollstndig\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Die Installation wurde erfolgreich abgeschlossen.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Abbruch der Installation\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Die Installation wurde nicht vollstndig abgeschlossen.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Deinstalliere...\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Bitte warten Sie, whrend $(^NameDA) entfernt wird.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Die Deinstallation ist vollstndig\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Die Deinstallation wurde erfolgreich abgeschlossen.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Abbruch der Deinstallation\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Die Deinstallation wurde nicht vollstndig abgeschlossen.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Die Installation von $(^NameDA) wird abgeschlossen\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) wurde auf Ihrem Computer installiert.$\\r$\\n$\\r$\\nKlicken Sie auf Fertig stellen, um den Installations-Assistenten zu schlieen.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Windows muss neu gestartet werden, um die Installation von $(^NameDA) zu vervollstndigen. Mchten Sie Windows jetzt neu starten?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Die Deinstallation von $(^NameDA) wird abgeschlossen\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) ist von Ihrem Computer entfernt worden.$\\r$\\n$\\r$\\nKlicken Sie auf Fertig stellen, um den Assistenten zu schlieen.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Windows muss neu gestartet werden, um die Deinstallation von $(^NameDA) zu vervollstndigen. Mchten Sie Windows jetzt neu starten?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Jetzt neu starten\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Windows spter selbst neu starten\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"$(^NameDA) ausfhren\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Liesmich anzeigen\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Fertig stellen\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Startmen-Ordner bestimmen\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Bestimmen Sie einen Startmen-Ordner fr die Programmverknpfungen.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Whlen Sie den Startmen-Ordner fr die Programmverknpfungen aus. Falls Sie einen neuen Ordner erstellen mchten, geben Sie dessen Namen ein.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Keine Verknpfungen erstellen\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Deinstallation von $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"$(^NameDA) wird von Ihrem Computer entfernt.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Sind Sie sicher, dass Sie die Installation von $(^Name) abbrechen wollen?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Sind Sie sicher, dass Sie die Deinstallation von $(^Name) abbrechen mchten?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Benutzer auswhlen\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Whlen Sie die Benutzer aus, fr die Sie $(^NameDA) installieren wollen.\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Whlen Sie aus, ob Sie $(^NameDA) nur fr den eigenen Gebrauch oder fr die Nutzung durch alle Benutzer dieses Systems installieren mchten. $(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Installation fr alle Benutzer dieses Computers\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Installation nur fr mich\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Greek.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1032\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1253\n# RTL - anything else than RTL means LTR\n-\n# Translation by Makidis N. Michael - http://dias.aueb.gr/~p3010094/\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n  '$(^Name)'\n# ^UninstallCaption\n  '$(^Name)'\n# ^LicenseSubCaption\n:   \n# ^ComponentsSubCaption\n:  \n# ^DirSubCaption\n:  \n# ^InstallingSubCaption\n:   \n# ^CompletedSubCaption\n: \n# ^UnComponentsSubCaption\n:  \n# ^UnDirSubCaption\n:  \n# ^ConfirmSubCaption\n: \n# ^UninstallingSubCaption\n:   \n# ^UnCompletedSubCaption\n: \n# ^BackBtn\n< &\n# ^NextBtn\n& >\n# ^AgreeBtn\n&\n# ^AcceptBtn\n&     \n# ^DontAcceptBtn\n&      \n# ^InstallBtn\n&\n# ^UninstallBtn\n&.\n# ^CancelBtn\n\n# ^CloseBtn\n&\n# ^BrowseBtn\n&...\n# ^ShowDetailsBtn\n&\n# ^ClickNext\n      .\n# ^ClickInstall\n        .\n# ^ClickUninstall\n        .\n# ^Name\n\n# ^Completed\n\n# ^LicenseText\n       '$(^NameDA)'.     ,    .\n# ^LicenseTextCB\n       '$(^NameDA)'.     ,     . $_CLICK\n# ^LicenseTextRB\n       '$(^NameDA)'.     ,      . $_CLICK\n# ^UnLicenseText\n       '$(^NameDA)'.     ,    .\n# ^UnLicenseTextCB\n       '$(^NameDA)'.     ,     . $_CLICK\n# ^UnLicenseTextRB\n       '$(^NameDA)'.     ,      . $_CLICK\n# ^Custom\n\n# ^ComponentsText\n               . $_CLICK\n# ^ComponentsSubText1\n  :\n# ^ComponentsSubText2_NoInstTypes\n      :\n# ^ComponentsSubText2\n,        :\n# ^UnComponentsText\n               . $_CLICK\n# ^UnComponentsSubText1\n  :\n# ^UnComponentsSubText2_NoInstTypes\n      :\n# ^UnComponentsSubText2\n,        :\n# ^DirText\n      '$(^NameDA)'   .        ,         . $_CLICK\n# ^DirSubText\n \n# ^DirBrowseText\n      '$(^NameDA)':\n# ^UnDirText\n      '$(^NameDA)'    .       ,         . $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n      '$(^NameDA)':\n# ^SpaceAvailable\n\" : \"\n# ^SpaceRequired\n\" : \"\n# ^UninstallingText\n '$(^NameDA)'      . $_CLICK\n# ^UninstallingSubText\n. :\n# ^FileError\n      : \\r\\n\\t\"$0\"\\r\\n      ,\\r\\n        , \\r\\n      .\n# ^FileError_NoIgnore\n      : \\r\\n\\t\"$0\"\\r\\n         , \\r\\n     .\n# ^CantWrite\n\" : \"\n# ^CopyFailed\n \n# ^CopyTo\n\"  \"\n# ^Registering\n\": \"\n# ^Unregistering\n\" : \"\n# ^SymbolNotFound\n\"  : \"\n# ^CouldNotLoad\n\" : \"\n# ^CreateFolder\n\" : \"\n# ^CreateShortcut\n\" : \"\n# ^CreatedUninstaller\n\"  : \"\n# ^Delete\n\" : \"\n# ^DeleteOnReboot\n\"  : \"\n# ^ErrorCreatingShortcut\n\"   : \"\n# ^ErrorCreating\n\"  : \"\n# ^ErrorDecompressing\n   !   ;\n# ^ErrorRegistering\n   DLL\n# ^ExecShell\n\" (ExecShell): \"\n# ^Exec\n\": \"\n# ^Extract\n\": \"\n# ^ErrorWriting\n\":     \"\n# ^InvalidOpcode\n : - opcode\n# ^NoOLE\n\" OLE  : \"\n# ^OutputFolder\n\" : \"\n# ^RemoveFolder\n\" : \"\n# ^RenameOnReboot\n\"  : \"\n# ^Rename\n\": \"\n# ^Skipped\n\": \"\n# ^CopyDetails\n   \n# ^LogInstall\n  \n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Greek.nsh",
    "content": ";Language: Greek (1032)\n;By Makidis N. Michael - http://dias.aueb.gr/~p3010094/\n\n!insertmacro LANGFILE \"Greek\" \"Greek\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"     '$(^NameDA)'\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"            '$(^NameDA)'.$\\r$\\n$\\r$\\n          .                 .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"    .  '$(^NameDA)'\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"            '$(^NameDA)'.$\\r$\\n$\\r$\\n   ,    '$(^NameDA)'  .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"       '$(^NameDA)'.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"      ,       .          '$(^NameDA)'.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"      ,     .          '$(^NameDA)'. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"      ,      .          '$(^NameDA)'. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"       '$(^NameDA)'.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"      ,       .          '$(^NameDA)'.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"      ,     .          '$(^NameDA)'. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"      ,      .          '$(^NameDA)'. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"  Page Down        .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"    '$(^NameDA)'    .\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"    '$(^NameDA)'    .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"              .\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"              .\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"         '$(^NameDA)'.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"         '$(^NameDA)'.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"    '$(^NameDA)' .\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"   .\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"    .\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"    '$(^NameDA)' .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"   .\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"    .\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"    '$(^NameDA)'\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \" '$(^NameDA)'    .$\\r$\\n$\\r$\\n         .\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"             '$(^NameDA)'.       ;\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"    '$(^NameDA)'\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \" '$(^NameDA)'     .$\\r$\\n$\\r$\\n         .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"             '$(^NameDA)'.       ;\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"   \"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"     \"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&  '$(^NameDA)'\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"  & Readme\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"     \"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"          '$(^NameDA)'.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"          .            .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"   \"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"  '$(^NameDA)'\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"  '$(^NameDA)'    .\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"         '$(^Name)';\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"         '$(^Name)';\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Hebrew.nlf",
    "content": "# Hebrew NSIS language file\nNLF v6\n# Language ID\n1037\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1255\n# RTL - anything else than RTL means LTR\nRTL\n# Translation by Amir Szekely (aka KiCHiK), fixed by Yaron Shahrabani\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n $(^Name)\n# ^UninstallCaption\n $(^Name)\n# ^LicenseSubCaption\n:  \n# ^ComponentsSubCaption\n:  \n# ^DirSubCaption\n:  \n# ^InstallingSubCaption\n: \n# ^CompletedSubCaption\n:  \n# ^UnComponentsSubCaption\n:  \n# ^UnDirSubCaption\n:  \n# ^ConfirmSubCaption\n:  \n# ^UninstallingSubCaption\n: \n# ^UnCompletedSubCaption\n:  \n# ^BackBtn\n< &\n# ^NextBtn\n& >\n# ^AgreeBtn\n &\n# ^AcceptBtn\n &   \n# ^DontAcceptBtn\n &    \n# ^InstallBtn\n&\n# ^UninstallBtn\n&\n# ^CancelBtn\n\n# ^CloseBtn\n&\n# ^BrowseBtn\n&...\n# ^ShowDetailsBtn\n& \n# ^ClickNext\n    .\n# ^ClickInstall\n      .\n# ^ClickUninstall\n      .\n# ^Name\n\n# ^Completed\n \n# ^LicenseText\n       $(^NameDA).       ,  ' '.\n# ^LicenseTextCB\n       $(^NameDA).       ,     . $_CLICK\n# ^LicenseTextRB\n       $(^NameDA).       ,    . $_CLICK\n# ^UnLicenseText\n       $(^NameDA).      ,  ' '.\n# ^UnLicenseTextCB\n       $(^NameDA).      ,     . $_CLICK\n# ^UnLicenseTextRB\n       $(^NameDA).      ,    . $_CLICK\n# ^Custom\n \n# ^ComponentsText\n            . $_CLICK\n# ^ComponentsSubText1\n  :\n# ^ComponentsSubText2_NoInstTypes\n  :\n# ^ComponentsSubText2\n,    :\n# ^UnComponentsText\n            . $_CLICK\n# ^UnComponentsSubText1\n  :\n# ^UnComponentsSubText2_NoInstTypes\n  :\n# ^UnComponentsSubText2\n,    :\n# ^DirText\n    $(^NameDA)  .    ,   ''   . $_CLICK\n# ^DirSubText\n \n# ^DirBrowseText\n   $(^NameDA):\n# ^UnDirText\n    $(^NameDA)  .    ,   ''   . $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n    $(^NameDA):\n# ^SpaceAvailable\n\" : \"\n# ^SpaceRequired\n\" : \"\n# ^UninstallingText\n $(^NameDA)   . $_CLICK\n# ^UninstallingSubText\n :\n# ^FileError\n     :\\r\\n\\t\"$0\"\\r\\n      ,\\r\\n       , \\r\\n    \n# ^FileError_NoIgnore\n     :\\r\\n\\t\"$0\"\\r\\n          , \\r\\n    \n# ^CantWrite\n\"  : \"\n# ^CopyFailed\n \n# ^CopyTo\n -\n# ^Registering\n\": \"\n# ^Unregistering\n\" : \"\n# ^SymbolNotFound\n\"  : \"\n# ^CouldNotLoad\n\"  : \"\n# ^CreateFolder\n\" : \"\n# ^CreateShortcut\n\"  : \"\n# ^CreatedUninstaller\n\"  : \"\n# ^Delete\n\" : \"\n# ^DeleteOnReboot\n\"  : \"\n# ^ErrorCreatingShortcut\n\"    : \"\n# ^ErrorCreating\n\"  : \"\n# ^ErrorDecompressing\n   !  ?\n# ^ErrorRegistering\n   DLL\n# ^ExecShell\n\" -: \"\n# ^Exec\n\": \"\n# ^Extract\n\": \"\n# ^ErrorWriting\n\":     \"\n# ^InvalidOpcode\n !   \n# ^NoOLE\n\" OLE : \"\n# ^OutputFolder\n\" : \"\n# ^RemoveFolder\n\" : \"\n# ^RenameOnReboot\n\"   : \"\n# ^Rename\n\" : \"\n# ^Skipped\n\": \"\n# ^CopyDetails\n  \n# ^LogInstall\n   \n# ^Byte\n\"\n# ^Kilo\n\" \"\n# ^Mega\n\" \"\n# ^Giga\n\" \""
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Hebrew.nsh",
    "content": ";Language: Hebrew (1037)\n;By Yaron Shahrabani\n\n!insertmacro LANGFILE \"Hebrew\" \"Hebrew\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"     $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"       $(^NameDA).$\\r$\\n$\\r$\\n       .          .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"     $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"       $(^NameDA).$\\r$\\n$\\r$\\n       .          .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"       $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"     ,   ' '  .          $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"     ,     .         $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"     ,    .        $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"       $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"     ,   ' '  .           $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"     ,     .         $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"     ,    .        $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"       Page Down.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"    $(^NameDA)  .\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"    $(^NameDA)  .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"        .\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"        .\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"        $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"        $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"   -$(^NameDA) .\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \" \"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"  .\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"   .\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"   -$(^NameDA)  .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"  .\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"   .\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"     $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA)  .$\\r$\\n$\\r$\\n      .\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"        $(^NameDA).    ?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"     $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA)  .$\\r$\\n$\\r$\\n      .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"        $(^NameDA).    ?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \" \"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"    \"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&  $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&  ' '\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"   \"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"         .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"           .          .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"   \"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"  $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"  $(^NameDA) .\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"      $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"      $(^Name)?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \" \"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"     $(^NameDA).\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"    $(^NameDA)      . $(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"   \"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"   \"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Hungarian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1038\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1250\n# RTL - anything else than RTL means LTR\n-\n# Translation by Soft-Trans Bt. (V2)\n# Translation by Orfanik Kft.   (V3-V6)\n# ^Branding\nNullsoft Teleptrendszer %s\n# ^SetupCaption\n$(^Name) Telept\n# ^UninstallCaption\n$(^Name) Eltvolt\n# ^LicenseSubCaption\n: Licencszerzds\n# ^ComponentsSubCaption\n: Teleptsi lehetsgek\n# ^DirSubCaption\n: Clmappa\n# ^InstallingSubCaption\n: Fjlok teleptse\n# ^CompletedSubCaption\n: Ksz\n# ^UnComponentsSubCaption\n: Eltvoltsi lehetsgek\n# ^UnDirSubCaption\n: Eltvolts mappja\n# ^ConfirmSubCaption\n: Megersts\n# ^UninstallingSubCaption\n: Fjlok eltvoltsa\n# ^UnCompletedSubCaption\n: Ksz\n# ^BackBtn\n< &Vissza\n# ^NextBtn\n&Tovbb >\n# ^AgreeBtn\n&Elfogadom\n# ^AcceptBtn\n&Elfogadom a Licencszerzds feltteleit\n# ^DontAcceptBtn\n&Nem fogadom el a Licencszerzds feltteleit\n# ^InstallBtn\n&Telepts\n# ^UninstallBtn\n&Eltvolts\n# ^CancelBtn\n&Mgse\n# ^CloseBtn\n&Bezrs\n# ^BrowseBtn\n&Tallzs...\n# ^ShowDetailsBtn\n&Rszletek\n# ^ClickNext\nKattintson a Tovbb-ra a folytatshoz.\n# ^ClickInstall\nKattintson a Teleptsre a teleptshez.\n# ^ClickUninstall\nKattintson az Eltvoltsra az eltvoltshoz.\n# ^Name\nNv\n# ^Completed\nKsz\n# ^LicenseText\nA(z) $(^NameDA) teleptse eltt tekintse t a szerzds feltteleit. Ha elfogadja a szerzds valamennyi felttelt, az Elfogadom gombbal folytathatja.\n# ^LicenseTextCB\nA(z) $(^NameDA) teleptse eltt tekintse t a szerzds feltteleit. Ha elfogadja a szerzds valamennyi felttelt, jellje be a Jellngyzeten. $_CLICK\n# ^LicenseTextRB\nA(z) $(^NameDA) teleptse eltt tekintse t a szerzds feltteleit. Ha elfogadja a szerzds valamennyi felttelt, vlassza az els lehetsget. $_CLICK\n# ^UnLicenseText\nA(z) $(^NameDA) eltvoltsa eltt tekintse t a szerzds feltteleit. Ha elfogadja a szerzds valamennyi felttelt, az Elfogadom gombbal folytathatja.\n# ^UnLicenseTextCB\nA(z) $(^NameDA) eltvoltsa eltt tekintse t a szerzds feltteleit. Ha elfogadja a szerzds valamennyi felttelt, jellje be a Jellngyzeten. $_CLICK\n# ^UnLicenseTextRB\nA(z) $(^NameDA) eltvoltsa eltt tekintse t a szerzds feltteleit. Ha elfogadja a szerzds valamennyi felttelt, vlassza az els lehetsget. $_CLICK\n# ^Custom\nEgyni\n# ^ComponentsText\nJellje be azokat az sszetevket amelyeket telepteni kvn s trlje a jellst a nem kvnt sszetevknl. $_CLICK\n# ^ComponentsSubText1\nVlassza ki a telepts tpust:\n# ^ComponentsSubText2_NoInstTypes\nVlassza ki a teleptend sszetevket:\n# ^ComponentsSubText2\nvagy, jellje ki a vlaszthat sszetevk kzl a telepteni kvnta(ka)t:\n# ^UnComponentsText\nJellje be azokat az sszetevket amelyeket el kvn tvoltani s trlje a jellst az eltvoltani nem kvnt sszetevknl. $_CLICK\n# ^UnComponentsSubText1\nVlassza ki az Eltvolts tpust:\n# ^UnComponentsSubText2_NoInstTypes\nVlassza ki az eltvoltand sszetevket:\n# ^UnComponentsSubText2\nvagy, jellje ki a vlaszthat sszetevk kzl az eltvoltani kvnta(ka)t:\n# ^DirText\nA $(^NameDA) a kvetkez mappba kerl. Msik mappa vlasztshoz kattintson a Tallzs gombra. $_CLICK\n# ^DirSubText\nTelepts helye\n# ^DirBrowseText\nA(z) $(^NameDA) teleptsi helynek kivlasztsa:\n# ^UnDirText\nA(z) $(^NameDA) eltvoltsa a kvetkez mappbl. Msik mappa vlasztshoz kattintson a Tallzs gombra. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nVlassza ki, hogy a $(^NameDA) melyik mappbl kerljn eltvoltsra:\n# ^SpaceAvailable\n\"Szabad terlet: \"\n# ^SpaceRequired\n\"Helyigny: \"\n# ^UninstallingText\nA(z) $(^NameDA) eltvoltsa kvetkezik a szmtgprl. $_CLICK\n# ^UninstallingSubText\nEltvolts helye:\n# ^FileError\nHiba trtnt a fjl rsra trtn megnyitsakor: \\r\\n\\t\"$0\"\\r\\nA Mgse gomb megnyomsval megszakthatja a teleptst,\\r\\naz Ismt gombbal megismtelheti a fjl rst,\\r\\na Kihagys gombbal kihagyhatja ezt a fjlt.\n# ^FileError_NoIgnore\nHiba trtnt a fjl rsra trtn megnyitsakor:  \\r\\n\\t\"$0\"\\r\\nAz jra gomb megnyomsval megismtelheti a mveletet, vagy \\r\\na Mgse gombbal megszakthatja a teleptst.\n# ^CantWrite\n\"Nem rhat: \"\n# ^CopyFailed\nA msols megszakadt\n# ^CopyTo\n\"Msols ide: \"\n# ^Registering\n\"Bejegyzs: \"\n# ^Unregistering\n\"Eltvolts: \"\n# ^SymbolNotFound\n\"A kvetkez szimblum nem tallhat: \"\n# ^CouldNotLoad\n\"Nem tlthet be: \"\n# ^CreateFolder\n\"Mappa ltrehozs: \"\n# ^CreateShortcut\n\"Parancsikon ltrehozsa: \"\n# ^CreatedUninstaller\n\"Ltrehozott eltvolt: \"\n# ^Delete\n\"Trlt fjl: \"\n# ^DeleteOnReboot\n\"Rendszerindtskor trlend: \"\n# ^ErrorCreatingShortcut\n\"Hiba a parancsikon ltrehozsakor: \"\n# ^ErrorCreating\n\"Hiba a ltrehozskor: \"\n# ^ErrorDecompressing\nHiba az adatok kibontsakor! Megsrlt a Telept?\n# ^ErrorRegistering\nHiba a DLL regisztrlsakor\n# ^ExecShell\n\"Vgrehajts a hozzrendelseken keresztl: \"\n# ^Exec\n\"Vgrehajts: \"\n# ^Extract\n\"Kibonts: \"\n# ^ErrorWriting\n\"Kibonts: Hiba a fjl rsakor \"\n# ^InvalidOpcode\nSrlt a telept: hibs utasts\n# ^NoOLE\n\"Nincs OLE: \"\n# ^OutputFolder\n\"Kimeneti mappa: \"\n# ^RemoveFolder\n\"Mappa eltvoltsa: \"\n# ^RenameOnReboot\n\"tnevezs rendszerindtskor: \"\n# ^Rename\n\"tnevezs: \"\n# ^Skipped\n\"Kihagyott: \"\n# ^CopyDetails\nAdatok vglapra msolsa\n# ^LogInstall\nTelept ellenrzlista\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Hungarian.nsh",
    "content": ";Language: Hungarian (1038)\n;Translation by Jozsef Tamas Herczeg ( - 1.61-ig),\n;               Lajos Molnar (Orfanik) <orfanik@axelero.hu> ( 1.62 - tl)\n\n!insertmacro LANGFILE \"Hungarian\" \"Magyar\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"dvzli a(z) $(^NameDA) Telept Varzsl\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"A(z) $(^NameDA) teleptse kvetkezik a szmtgpre.$\\r$\\n$\\r$\\nJavasoljuk, hogy indts eltt zrja be a fut alkalmazsokat. gy a telept a rendszer jraindtsa nlkl tudja frissteni a szksges rendszerfjlokat.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"dvzli a(z) $(^NameDA) Eltvolt Varzsl\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Ez a varzsl segti a(z) $(^NameDA) eltvoltsban.$\\r$\\n$\\r$\\nMieltt elkezdi az eltviltst gyzdjn meg arrl, hogy a(z) $(^NameDA) nem fut.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Licencszerzds\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"A(z) $(^NameDA) teleptse eltt tekintse t a szerzds feltteleit.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Ha elfogadja a szerzds valamennyi felttelt, az Elfogadom gombbal folytathatja. El kell fogadnia a(z) $(^NameDA) teleptshez.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Amennyiben elfogadja a feltteleket, jellje be a jellnnyzeten. A(z) $(^NameDA) teleptshez el kell fogadnia a feltteleket. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Amennyiben elfogadja a feltteleket, vlassza az els opcit. A(z) $(^NameDA) teleptshez el kell fogadnia a feltteleket. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Licencszerzds\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"A(z) $(^NameDA) eltvoltsa eltt tekintse t a szerzds feltteleit.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Ha elfogadja a szerzds valamennyi felttelt, az Elfogadom gombbal folytathatja. El kell fogadnia a(z) $(^NameDA) eltvoltshoz.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Amennyiben elfogadja a feltteleket, jellje be a jellnnyzeten. A(z) $(^NameDA) eltvoltshoz el kell fogadnia a feltteleket. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Amennyiben elfogadja a feltteleket, vlassza az els opcit. A(z) $(^NameDA) eltvoltshoz el kell fogadnia a feltteleket. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"A PageDown gombbal olvashatja el a szerzds folytatst.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"sszetevk kivlasztsa\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Vlassza ki, hogy a(z) $(^NameDA) mely funkciit kvnja telepteni.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"sszetevk kivlasztsa\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Vlassza ki, hogy a(z) $(^NameDA) mely funkciit kvnja eltvoltani.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Lers\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Vigye r az egeret az sszetevre, hogy megtekinthesse a lerst.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Vigye r az egeret az sszetevre, hogy megtekinthesse a lerst.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Teleptsi hely kivlasztsa\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Vlassza ki a(z) $(^NameDA) teleptsnek mappjt.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Teleptsi hely kivlasztsa\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Vlassza ki a(z) $(^NameDA) teleptsnek mappjt.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Teleptsi folyamat\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Kis trelmet a(z) $(^NameDA) teleptsig.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Telepts befejezdtt\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"A telepts sikeresen befejezdtt.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"A telepts megszakadt\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"A telepts sikertelen volt.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Eltvoltsi folyamat\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Kis trelmet a(z) $(^NameDA) eltvoltsig.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Az eltvolts befejezdtt\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Az eltvolts sikeresen befejezdtt.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Az eltvolts megszakadt\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Az eltvolts sikertelen volt.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"A(z) $(^NameDA) teleptse megtrtnt.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"A(z) $(^NameDA) teleptse megtrtnt.$\\r$\\n$\\r$\\nA Befejezs gomb megnyomsval zrja be a varzslt.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"A(z) $(^NameDA) teleptsnek befejezshez jra kell indtani a rendszert. Most akarja jraindtani?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"A(z) $(^NameDA) eltvolts varzsljnak befejezse.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"A(z) $(^NameDA) eltvoltsa sikeresen befejezdtt.$\\r$\\n$\\r$\\nA Finish-re kattintva bezrul ez a varzsl.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"A szmtgpet jra kell indtani, hogy a(z) $(^NameDA) eltvoltsa teljes legyen. Akarja most jraindtani a rendszert?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Most indtom jra\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Ksbb fogom jraindtani\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"$(^NameDA) futtatsa\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"OlvassEl fjl megjelentse\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Befejezs\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Start men mappa kijellse\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Start men mappa kijellse a program parancsikonjaihoz.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Jelljn ki egy mappt a Start menben, melybe a program parancsikonjait fogja elhelyezni. Berhatja j mappa nevt is.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Nincs parancsikon elhelyezs\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"A(z) $(^NameDA) Eltvoltsa.\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"A(z) $(^NameDA) eltvoltsa kvetkezik a szmtgprl.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Biztos, hogy ki akar lpni a(z) $(^Name) Teleptbl?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Biztos, hogy ki akar lpni a(z) $(^Name) Eltvoltbl?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Icelandic.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n15\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Gretar Orri Kristinsson\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) Uppsetning\n# ^UninstallCaption\n$(^Name) Fjarlging\n# ^LicenseSubCaption\n: Notandaleyfissamningur\n# ^ComponentsSubCaption\n: Uppsetningarvalmguleikar\n# ^DirSubCaption\n: Uppsetningarskrarsafn\n# ^InstallingSubCaption\n: Set upp\n# ^CompletedSubCaption\n: Loki\n# ^UnComponentsSubCaption\n: Fjarlgingarvalmguleikar\n# ^UnDirSubCaption\n: Fjarlgingarskrarsafn\n# ^ConfirmSubCaption\n: Stafesting\n# ^UninstallingSubCaption\n: Fjarlgi\n# ^UnCompletedSubCaption\n: Loki\n# ^BackBtn\n< &Til baka\n# ^NextBtn\n&fram >\n# ^AgreeBtn\ng &Samykki\n# ^AcceptBtn\ng &samykki skilmla leyfissamningsins\n# ^DontAcceptBtn\ng samykki &ekki skilmla leyfissamningsins\n# ^InstallBtn\n&Setja upp\n# ^UninstallBtn\n&Fjarlgja\n# ^CancelBtn\nHtta vi\n# ^CloseBtn\n&Loka\n# ^BrowseBtn\n&Vafra...\n# ^ShowDetailsBtn\nSna &upplsingar\n# ^ClickNext\nSmelltu  'fram' til a halda fram.\n# ^ClickInstall\nSmelltu  'Setja upp' til ess a hefja uppsetninguna.\n# ^ClickUninstall\nSmelltu  'Fjarlgja' til a hefja fjarlgingar ferli.\n# ^Name\nNafn\n# ^Completed\nLoki\n# ^LicenseText\nVinsamlegast skoau notandaleyfissamninginn vel ur en uppsetning  $(^NameDA) hefst. Ef  samykkir skilmla samningsins, smelltu   'g samykki'.\n# ^LicenseTextCB\nVinsamlegast skoau notandaleyfissamninginn vel ur en uppsetning  $(^NameDA) hefst. Ef  samykkir skilmla samningsins, hakau   kassann hr a nean. $_CLICK\n# ^LicenseTextRB\nVinsamlegast skoau notandaleyfissamninginn vel ur en uppsetning  $(^NameDA) hefst. Ef  samykkir skilmla samningsins, veldu  fyrsta valmguleikann hr a nean. $_CLICK\n# ^UnLicenseText\nVinsamlegast skoau notandaleyfissamninginn vel ur en uppsetning  $(^NameDA) hefst. Ef  samykkir skilmla samningsins, smelltu   'g samykki'.\n# ^UnLicenseTextCB\nVinsamlegast skoau notandaleyfissamninginn vel ur en uppsetning  $(^NameDA) hefst. Ef  samykkir skilmla samningsins, hakau   kassann hr a nean. $_CLICK\n# ^UnLicenseTextRB\nVinsamlegast skoau notandaleyfissamninginn vel ur en uppsetning  $(^NameDA) hefst. Ef  samykkir skilmla samningsins, veldu  fyrsta valmguleikann hr a nean. $_CLICK\n# ^Custom\nSjlfval\n# ^ComponentsText\nHakau vi  hluti sem  vilt setja upp og taktu haki af eim hlutum sem  vilt ekki setja upp. $_CLICK\n# ^ComponentsSubText1\nVeldu tegund uppsetningar:\n# ^ComponentsSubText2_NoInstTypes\nVeldu  hluti sem  a setja upp:\n# ^ComponentsSubText2\nEa, veldu valfrjlsa hluti  a setja upp:\n# ^UnComponentsText\nHakau vi  hluti sem  vilt fjarlgja og taktu haki af eim hlutum sem  vilt ekki fjarlgja. $_CLICK\n# ^UnComponentsSubText1\nVeldu tegund fjarlgingar:\n# ^UnComponentsSubText2_NoInstTypes\nVeldu hluti sem  a fjarlgja:\n# ^UnComponentsSubText2\nEa, veldu valfrjlsa hluti sem  a fjarlgja:\n# ^DirText\nUppsetningin mun setja $(^NameDA) upp  eftirfarandi skrarsafn. Til a setja forriti upp  anna skrarsafn, smelltu  'Vafra...' og veldu anna skrarsafn. $_CLICK\n# ^DirSubText\nUppsetningarskrarsafn\n# ^DirBrowseText\nVeldu a skrarsafn sem  vilt setja $(^NameDA) upp :\n# ^UnDirText\nUppsetningin mun fjarlgja $(^NameDA) r eftirfarandi skrarsafni. Til a fjarlgja forriti r ru skrarsafni, smelltu  'Vafra...' og veldu anna skrarsafn. $_CLICK\n# ^UnDirSubText\n\"Fjarlgingarskrarsafn\"\n# ^UnDirBrowseText\nVeldu a skrarsafn sem  vilt fjarlgja $(^NameDA) r:\n# ^SpaceAvailable\n\"Tiltkt rmi: \"\n# ^SpaceRequired\n\"Nausynlegt rmi: \"\n# ^UninstallingText\n$(^NameDA) verur fjarlgt r eftirfarandi skrarsafni. $_CLICK\n# ^UninstallingSubText\nFjarlgi r:\n# ^FileError\nVilla vi a skrifa  skr: \\r\\n\\r\\n$0\\r\\n\\r\\nSmelltu  'Htta vi' til a stoppa uppsetninguna,\\r\\n'Reyna aftur' til a gera ara tilraun, ea\\r\\n'Hunsa' til sleppa essari skr.\n# ^FileError_NoIgnore\nVilla vi a skrifa  skr: \\r\\n\\r\\n$0\\r\\n\\r\\nSmelltu  'Reyna aftur' til a gera ara tilraun, ea\\r\\n'Htta vi' til a stoppa uppsetninguna.\n# ^CantWrite\n\"Get ei skrifa: \"\n# ^CopyFailed\nAfritun mistkst\n# ^CopyTo\n\"Afrita til \"\n# ^Registering\n\"Skrsetja: \"\n# ^Unregistering\n\"Afskr: \"\n# ^SymbolNotFound\n\"Fann ekki tkn: \"\n# ^CouldNotLoad\n\"Gat ekki hlai inn: \"\n# ^CreateFolder\n\"Ba til skrarsafn: \"\n# ^CreateShortcut\n\"Ba til fltilei: \"\n# ^CreatedUninstaller\n\"Bj til fjarlgingarhjlp: \"\n# ^Delete\n\"Eya skr: \"\n# ^DeleteOnReboot\n\"Eya vi endurrsingu: \"\n# ^ErrorCreatingShortcut\n\"Villa vi ger fltileiar: \"\n# ^ErrorCreating\n\"Villa vi ger: \"\n# ^ErrorDecompressing\nVilla vi afjppun gagna! Bilu uppsetningarhjlp?\n# ^ErrorRegistering\nVilla vi skrsetningu DLL\n# ^ExecShell\n\"Keyrslugluggi: \"\n# ^Exec\n\"Keyra: \"\n# ^Extract\n\"Fra t: \"\n# ^ErrorWriting\n\"Fra t: villa vi a skrifa  skr \"\n# ^InvalidOpcode\nUppsetningarhjlp bilu: rangur striki\n# ^NoOLE\n\"Engin OLE fyrir: \"\n# ^OutputFolder\n\"tskrarsafn: \"\n# ^RemoveFolder\n\"Fjarlgja skrarsafn: \"\n# ^RenameOnReboot\n\"Endurskra vi endurrsingu: \"\n# ^Rename\n\"Endurskra: \"\n# ^Skipped\n\"Sleppt: \"\n# ^CopyDetails\nAfrita upplsingar til skrifbrettis\n# ^LogInstall\nSkr uppsetningarferli\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Icelandic.nsh",
    "content": ";Language: Icelandic (15)\n;By Gretar Orri Kristinsson\n\n!insertmacro LANGFILE \"Icelandic\" \"Icelandic\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Velkominn til $(^NameDA) uppsetningarhjlparinnar\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"essi hjlp mun leia ig  gegnum uppsetninguna  $(^NameDA).$\\r$\\n$\\r$\\nMlt er me v a  lokir llum rum forritum ur en uppsetningin hefst. etta mun gera uppsetningarforritinu kleyft a uppfra kerfiskrr n ess a endurrsa tlvuna.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Velkomin(n) til $(^NameDA) fjarlgingarhjlparinnar\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"essi hjlp mun leia ig  gegnum fjarlginguna  $(^NameDA).$\\r$\\n$\\r$\\nur en fjarlging hefst skal ganga r skugga um a $(^NameDA) s ekki opi.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Notandaleyfissamningur\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Vinsamlegast skoau Notandaleyfissamninginn vel ur en uppsetning  $(^NameDA) hefst.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Ef  samykkir skilmla samningsins, smelltu   'g samykki' til a halda fram.  verur a samykkja samninginn til ess a setja upp $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Ef  samykkir skilmla samningsins, hakau   kassann hr a nean.  verur a samykkja samninginn til ess a setja upp $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Ef  samykkir skilmla samningsins, veldu  fyrsta valmguleikann hr a nean.  verur a samykkja samninginn til ess a setja upp $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Leyfissamningur\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Vinsamlegast skoau leyfissamninginn vel ur en fjarlging  $(^NameDA) hefst.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Ef  samykkir skilmla samningsins, smelltu   'g samykki' til a halda fram.  verur a samykkja samninginn til ess a fjarlgja $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Ef  samykkir skilmla samningsins, hakau   kassann hr a nean.  verur a samykkja samninginn til ess a fjarlgja $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Ef  samykkir skilmla samningsins, veldu  fyrsta valmguleikann hr a nean.  verur a samykkja samninginn til ess a fjarlgja $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Smelltu  'PageDown' takkann  lyklaborinu til a sj afganginn af samningnum.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Velja hluti\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Veldu hvaa $(^NameDA) hluti  vilt setja upp.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Velja hluti\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Velja hvaa $(^NameDA) hluti  vilt fjarlgja.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Lsing\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Fru msina yfir hlut til a f lsinguna  honum.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Fru msina yfir hlut til a f lsinguna  honum.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Veldu uppsetningarskarsafn\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Veldu a skrarsafn sem  vilt setja $(^NameDA) upp .\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Velja fjarlgingarskarsafn\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Veldu a skrarsafn sem  vilt fjarlgja $(^NameDA) r.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Set upp\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Vinsamlegast dokau vi mean $(^NameDA) er sett upp.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Uppsetningu loki\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Uppsetning tkst.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Htt vi uppsetningu\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Uppsetningu lauk ekki sem skildi.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Fjarlgi\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Vinsamlegast dokau vi  mean $(^NameDA) er fjarlgt.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Fjarlgingu loki\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Fjarlging tkst.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Htt vi fjarlgingu\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Fjarlgingu lauk ekki sem skildi.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Ljka $(^NameDA) uppsetningarhjlpinni\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) er n upp sett  tlvunni inni.$\\r$\\n$\\r$\\nSmelltu  'Ljka' til a loka essari hjlp.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Til a ljka uppsetningunni  $(^NameDA) verur a endurrsa tlvuna. Viltu endurrsa nna?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Ljka $(^NameDA) fjarlgingarhjlpinni\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) hefur n veri fjarlgt r tlvunni.$\\r$\\n$\\r$\\nSmelltu  'Ljka' til a loka essari hjlp.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Til a ljka fjarlgingunni  $(^NameDA) verur a endurrsa tlvuna. Viltu endurrsa nna?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Endurrsa nna\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"g vil endurrsa seinna\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Keyra $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Skoa LestuMig\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Ljka\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Velja skrarsafn 'Start' valmyndar\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Veldu skrarsafn $(^NameDA) fltileia fyrir 'Start' valmyndina.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Veldu skrarsafn fltileia forritsins fyrir 'Start' valmyndina.  getur einnig bi til ntt skrarsafn me v a setja inn ntt nafn.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Ekki ba til fltileiir  'Start' valmyndinni\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Fjarlgja $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Fjarlgja $(^NameDA) r tlvunni.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Ertu viss um a  viljir loka $(^Name) uppsetningarhjlpinni?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Ertu viss um a  viljir loka $(^Name) fjarlgingarhjlpinni?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Indonesian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1057\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n-\n# RTL - anything else than RTL means LTR\n-\n# Translation ariel825010106@yahoo.com modified and completed by was.uthm@gmail.com in April 2009\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\nInstalasi Program $(^Name)\n# ^UninstallCaption\nPenghapusan Program $(^Name)\n# ^LicenseSubCaption\n: Perihal Lisensi\n# ^ComponentsSubCaption\n: Pilihan Instalasi\n# ^DirSubCaption\n: Lokasi Instalasi\n# ^InstallingSubCaption\n: Proses Instalasi\n# ^CompletedSubCaption\n: Selesai\n# ^UnComponentsSubCaption\n: Pilihan Penghapusan\n# ^UnDirSubCaption\n: Berkas Lokasi yang dihapus\n# ^ConfirmSubCaption\n: Konfirmasi\n# ^UninstallingSubCaption\n: Proses Penghapusan\n# ^UnCompletedSubCaption\n: Selesai\n# ^BackBtn\n< &Mundur\n# ^NextBtn\n&Lanjut >\n# ^AgreeBtn\nSaya &Setuju\n# ^AcceptBtn\nSaya s&etuju dengan Perihal Lisensi\n# ^DontAcceptBtn\nSaya &tidak setuju dengan Perihal Lisensi\n# ^InstallBtn\n&Instal\n# ^UninstallBtn\n&Hapus\n# ^CancelBtn\nBatalkan\n# ^CloseBtn\n&Tutup\n# ^BrowseBtn\nCa&ri...\n# ^ShowDetailsBtn\nLihat &perincian\n# ^ClickNext\nTekan tombol Lanjut untuk melanjutkan.\n# ^ClickInstall\nTekan tombol Instal untuk memulai instalasi.\n# ^ClickUninstall\nTekan tombol Hapus untuk memulai penghapusan.\n# ^Name\nNama\n# ^Completed\nSelesai\n# ^LicenseText\nSilahkan membaca lisensi berikut sebelum memulai instalasi $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, tekan tombol Saya Setuju.\n# ^LicenseTextCB\nSilahkan membaca lisensi berikut sebelum memulai instalasi $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, beri tanda centang. $_CLICK\n# ^LicenseTextRB\nSilahkan membaca lisensi berikut sebelum memulai instalasi $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, pilihlah salah satu item dibawah ini. $_CLICK\n# ^UnLicenseText\nSilahkan membaca lisensi berikut sebelum mulai menghapus $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, tekan tombol Saya Setuju.\n# ^UnLicenseTextCB\nSilahkan membaca lisensi berikut sebelum mulai menghapus $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, beri tanda centang. $_CLICK\n# ^UnLicenseTextRB\nSilahkan membaca lisensi berikut sebelum mulai menghapus $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, pilihlah salah satu item dibawah ini. $_CLICK\n# ^Custom\nTentukan Sendiri\n# ^ComponentsText\nBeri tanda centang pada komponen yang akan di instal and hilangkan tanda centang pada komponen yang tidak perlu di instal. $_CLICK\n# ^ComponentsSubText1\nPilih tipe instalasi:\n# ^ComponentsSubText2_NoInstTypes\nPilih komponen-komponen yang akan di instal:\n# ^ComponentsSubText2\nAtau, pilih komponen tambahan yang akan di instal:\n# ^UnComponentsText\nBeri tanda centang pada komponen yang akan dihapus and hilangkan tanda centang pada komponen yang tidak ingin dihapus. $_CLICK\n# ^UnComponentsSubText1\nPilih tipe penghapusan:\n# ^UnComponentsSubText2_NoInstTypes\nPilih komponen-komponen yang ingin dihapus:\n# ^UnComponentsSubText2\nAtau, pilih komponen tambahan yang ingin dihapus:\n# ^DirText\nProgram $(^NameDA) akan di instal pada lokasi berikut. Untuk memilih lokasi, tekan tombol Cari kemudian pilih lokasi yang anda kehendaki. $_CLICK\n# ^DirSubText\nLokasi instalasi\n# ^DirBrowseText\nPilih lokasi instalasi program $(^NameDA):\n# ^UnDirText\nProses penghapusan program $(^NameDA) dari lokasi instalasi berikut. Untuk memilih lokasi lainnya, tekan tombol Cari kemudian pilih lokasi yang anda kehendaki. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nPilih lokasi instalasi program $(^NameDA) yang akan dihapus:\n# ^SpaceAvailable\n\"Ruang yang tersedia:   \"\n# ^SpaceRequired\n\"Ruang yang dibutuhkan: \"\n# ^UninstallingText\n$(^NameDA) akan dihapus dari lokasi berikut. $_CLICK\n# ^UninstallingSubText\nProses penghapusan dari:\n# ^FileError\nTidak dapat membuka berkas untuk menulis: \\r\\n\\t\"$0\"\\r\\nTekan tombol Abort untuk membatalkan instalasi,\\r\\nRetry untuk mencoba lagi, atau\\r\\nIgnore untuk melewati file ini.\n# ^FileError_NoIgnore\nTidak dapat membuka berkas untuk menulis: \\r\\n\\t\"$0\"\\r\\nTekan tombol Retry untuk mencoba lagi, atau\\r\\nCancel untuk membatalkan instalasi.\n# ^CantWrite\n\"Tidak bisa menulis pada berkas: \"\n# ^CopyFailed\nGagal menyalin berkas\n# ^CopyTo\n\"Menyalin ke \"\n# ^Registering\n\"Memasukkan dalam daftar: \"\n# ^Unregistering\n\"Menghapus dari daftar: \"\n# ^SymbolNotFound\n\"Tidak dapat menemukan simbol: \"\n# ^CouldNotLoad\n\"Tidak dapat memuat: \"\n# ^CreateFolder\n\"Membuat tempat menyimpan berkas: \"\n# ^CreateShortcut\n\"Membuat shortcut: \"\n# ^CreatedUninstaller\n\"Program penghapusan yang dibuat: \"\n# ^Delete\n\"Menghapus berkas: \"\n# ^DeleteOnReboot\n\"Akan dihapus saat reboot: \"\n# ^ErrorCreatingShortcut\n\"Tidak dapat membuat shortcut: \"\n# ^ErrorCreating\n\"Ada kesalahan saat membuat: \"\n# ^ErrorDecompressing\nAda kesalahan saat membuka data! Program Instalasi tidak lengkap?\n# ^ErrorRegistering\nAda kesalahan ketika mendaftarkan modul DLL\n# ^ExecShell\n\"Perintah: \"\n# ^Exec\n\"Menjalankan: \"\n# ^Extract\n\"Proses ekstraksi berkas: \"\n# ^ErrorWriting\n\"Ekstraksi: ada kesalahan saat menulis ke berkas \"\n# ^InvalidOpcode\nProgram instalasi rusak: kode program tidak lengkap\n# ^NoOLE\n\"OLE tidak ditemukan: \"\n# ^OutputFolder\n\"Lokasi tujuan: \"\n# ^RemoveFolder\n\"Menghapus lokasi penyimpanan: \"\n# ^RenameOnReboot\n\"Memberi nama baru saat reboot: \"\n# ^Rename\n\"Memberi nama baru: \"\n# ^Skipped\n\"Dilewati: \"\n# ^CopyDetails\nSalin perincian ke Clipboard\n# ^LogInstall\nCatat proses instalasi\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Indonesian.nsh",
    "content": ";Language: Indonesian (1057)\n;By Ariel825010106@yahoo.com modified by was.uthm@gmail.com in April 2009\n\n!insertmacro LANGFILE \"Indonesian\" \"Indonesian\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Selamat datang di program instalasi $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Program ini akan membantu anda dalam proses instalasi $(^NameDA).$\\r$\\n$\\r$\\nAnda sangat disarankan untuk menutup program lainnya sebelum memulai proses instalasi. Hal ini diperlukan agar berkas yang terkait dapat diperbarui tanpa harus booting ulang komputer anda.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Selamat datang di program penghapusan $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Program ini akan membantu anda pada proses penghapusan $(^NameDA).$\\r$\\n$\\r$\\nSebelum memulai proses penghapusan, pastikan dulu $(^NameDA) tidak sedang digunakan.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Perihal Lisensi\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Silahkan membaca perihal lisensi sebelum memulai proses instalasi $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Jika anda setuju dan menerima semua pernyataan, tekan tombol Saya Setuju untuk melanjutkan. Anda harus setuju untuk memulai instalasi $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Jika anda setuju dan menerima semua pernyatan, beri tanda centang. Anda harus setuju untuk memulai instalasi $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Jika anda setuju dan menerima semua pernyataan, pilihlah salah satu item dibawah ini. Anda harus setuju untuk memulai instalasi $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Perihal Lisensi\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Silahkan membaca lisensi berikut sebelum melakukan penghapusan $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Jika anda setuju dan menerima semua pernyataan, tekan tombol Saya Setuju untuk melanjutkan. Anda harus setuju untuk memulai proses penghapusan $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Jika anda setuju dan menerima semua pernyataan, beri tanda centang. Anda harus setuju untuk memulai proses penghapusan $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Jika anda setuju dan menerima semua pernyataan, pilihlah salah satu item dibawah ini. Anda harus setuju untuk memulai proses penghapusan $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Tekan tombol Page Down untuk melihat pernyataan berikutnya.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Pilih Komponen\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Pilih komponen fitur tambahan dari $(^NameDA) yang ingin di instal.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Pilih Komponen\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Pilih komponen fitur tambahan dari $(^NameDA) yang ingin dihapus.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Deskripsi\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Tunjuk ke salah satu komponen untuk melihat deskripsi tentang komponen itu.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Tunjuk ke salah satu komponen untuk melihat deskripsi tentang komponen itu.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Pilih Lokasi Instalasi\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Pilih lokasi untuk instalasi program $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Pilih Lokasi berkas yang akan dihapus\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Pilih lokasi instalasi program $(^NameDA) yang akan dihapus.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Proses instalasi \"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Mohon tunggu sejenak, instalasi program $(^NameDA) sedang berlangsung.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Instalasi Selesai\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Seluruh proses instalasi sudah paripurna.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalasi Dibatalkan\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Proses instalasi tidak selesai dengan sempurna.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Proses penghapusan\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Mohon tunggu sejenak, penghapusan program $(^NameDA) sedang berlangsung.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Proses Penghapusan Selesai\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Seluruh proses penghapusan sudah paripurna.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Penghapusan Dibatalkan\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Proses penghapusa tidak selesai dengan sempurna.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Menutup Instalasi Program $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) sudah di instal di komputer anda.$\\r$\\n$\\r$\\nTekan tombol Selesai untuk menutup program.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Komputer anda memerlukan booting ulang untuk menyempurnakan proses instalasi $(^NameDA). Apakah anda akan melakukan booting ulang sekarang juga?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Menutup program penghapusan $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) sudah dihapus dari komputer anda.$\\r$\\n$\\r$\\nTekan tombol Selesai untuk menutup.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Komputer anda memerlukan booting untuk menyempurnakan proses penghapusan $(^NameDA). Apakah anda akan melakukan booting ulang sekarang juga?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Booting ulang sekarang\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Booting ulang nanti\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Jalankan $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Buka berkas Readme\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Selesai\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Pilih lokasi dari Menu Start\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Pilih lokasi dari Menu Start untuk meletakkan shortcut $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Pilih lokasi dari Menu Start untuk meletakkan shortcut program ini. Anda bisa juga membuat lokasi baru dengan cara menulis nama lokasi yang dikehendaki.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Tidak perlu membuat shortcut\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Penghapusan $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Menghapus $(^NameDA) dari komputer anda.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Apakah anda yakin ingin menghentikan proses instalasi $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Apakah anda yakin ingin menghentikan proses penghapusan $(^Name)?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Pilihan Pemakai\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Pilihlah pemakai komputer yang akan menggunakan program $(^NameDA).\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Apakah anda akan melakukan instalasi $(^NameDA) untuk anda sendiri atau untuk semua pemakai komputer ini. $(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Instalasi untuk semua pemakai komputer ini\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Instalasi hanya untuk saya sendiri\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Irish.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n2108\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Kevin P. Scannell < scannell at slu dot edu >\n# ^Branding\nCras Suitela Nullsoft %s\n# ^SetupCaption\nSocr $(^Name)\n# ^UninstallCaption\nDshuiteil $(^Name)\n# ^LicenseSubCaption\n: Comhaont um Cheadnas\n# ^ComponentsSubCaption\n: Roghanna Suitela\n# ^DirSubCaption\n: Fillten Suitela\n# ^InstallingSubCaption\n: Suiteil\n# ^CompletedSubCaption\n: Crochnaithe\n# ^UnComponentsSubCaption\n: Roghanna Dshuitela\n# ^UnDirSubCaption\n: Fillten Dshuitela\n# ^ConfirmSubCaption\n: Deimhni\n# ^UninstallingSubCaption\n: Dshuiteil\n# ^UnCompletedSubCaption\n: Crochnaithe\n# ^BackBtn\n< Ar Ai&s\n# ^NextBtn\nAr &Aghaidh >\n# ^AgreeBtn\nGl&acaim Leis\n# ^AcceptBtn\nTim toilteanach &glacadh le coinnollacha an Chomhaont um Cheadnas\n# ^DontAcceptBtn\nNlim &toilteanach glacadh le coinnollacha an Chomhaont um Cheadnas\n# ^InstallBtn\n&Suiteil\n# ^UninstallBtn\n&Dshuiteil\n# ^CancelBtn\nCealaigh\n# ^CloseBtn\n&Dn\n# ^BrowseBtn\nB&rabhsil...\n# ^ShowDetailsBtn\nTaispein &sonra\n# ^ClickNext\nCliceil \"Ar Aghaidh\" chun leanint ar aghaidh.\n# ^ClickInstall\nCliceil \"Suiteil\" chun tos.\n# ^ClickUninstall\nCliceil \"Dshuiteil\" chun tos.\n# ^Name\nAinm\n# ^Completed\nCrochnaithe\n# ^LicenseText\nDan inichadh ar an gComhaont um Cheadnas sula suitelann t $(^NameDA). M ghlacann t le gach coinnoll den chomhaont, cliceil \"Glacaim Leis\".\n# ^LicenseTextCB\nDan inichadh ar an gComhaont um Cheadnas sula suitelann t $(^NameDA). M ghlacann t le gach coinnoll den chomhaont, cliceil an ticbhosca thos. $_CLICK\n# ^LicenseTextRB\nDan inichadh ar an gComhaont um Cheadnas sula suitelann t $(^NameDA). M ghlacann t le gach coinnoll den chomhaont, roghnaigh an chad rogha thos. $_CLICK\n# ^UnLicenseText\nDan inichadh ar an gComhaont um Cheadnas sula ndshuitelann t $(^NameDA). M ghlacann t le gach coinnoll den chomhaont, cliceil \"Glacaim Leis\".\n# ^UnLicenseTextCB\nDan inichadh ar an gComhaont um Cheadnas sula ndshuitelann t $(^NameDA). M ghlacann t le gach coinnoll den chomhaont, cliceil an ticbhosca thos. $_CLICK\n# ^UnLicenseTextRB\nDan inichadh ar an gComhaont um Cheadnas sula ndshuitelann t $(^NameDA). M ghlacann t le gach coinnoll den chomhaont, roghnaigh an chad rogha thos. $_CLICK\n# ^Custom\nSaincheaptha\n# ^ComponentsText\nRoghnaigh na comhphirteanna is mian leat a shuiteil, agus droghnaigh na comhphirteanna nach mian leat a shuiteil. $_CLICK\n# ^ComponentsSubText1\nRoghnaigh cinel na suitela:\n# ^ComponentsSubText2_NoInstTypes\nRoghnaigh na comhphirteanna is mian leat a shuiteil:\n# ^ComponentsSubText2\nN, roghnaigh na comhphirteanna roghnacha is mian leat a shuiteil:\n# ^UnComponentsText\nRoghnaigh na comhphirteanna is mian leat a dhshuiteil, agus droghnaigh na comhphirteanna nach mian leat a dhshuiteil. $_CLICK\n# ^UnComponentsSubText1\nRoghnaigh cinel na dshuitela:\n# ^UnComponentsSubText2_NoInstTypes\nRoghnaigh comhphirteanna le dshuiteil:\n# ^UnComponentsSubText2\nN, roghnaigh na comhphirteanna roghnacha is mian leat a dhshuiteil:\n# ^DirText\nCuirfidh an Suitela $(^NameDA) san fhillten seo a leanas. Ms mian leat suiteil i bhfillten difriil, cliceil \"Brabhsil\" agus roghnaigh fillten eile. $_CLICK\n# ^DirSubText\nSprioc-Fhillten\n# ^DirBrowseText\nRoghnaigh an fillten inar mian leat $(^NameDA) a shuiteil:\n# ^UnDirText\nBainfidh an Suitela $(^NameDA) amach as an bhfillten seo a leanas. Ms mian leat  a dhshuiteil  fhillten difriil, cliceil \"Brabhsil\" agus roghnaigh fillten eile. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nRoghnaigh an fillten ar mian leat $(^NameDA) a dhshuiteil as:\n# ^SpaceAvailable\n\"Sps le fil: \"\n# ^SpaceRequired\n\"Sps de dhth: \"\n# ^UninstallingText\nDshuitelfar $(^NameDA) n fhillten seo a leanas. $_CLICK\n# ^UninstallingSubText\n dhshuiteil :\n# ^FileError\nEarrid agus comhad  scrobh: \\r\\n\\r\\n$0\\r\\n\\r\\nCliceil \"Abort\" chun an tsuiteil a stopadh,\\r\\n\"Retry\" chun iarracht eile a dhanamh, n\\r\\n\"Ignore\" chun neamhaird a dhanamh den chomhad seo.\n# ^FileError_NoIgnore\nEarrid agus comhad  scrobh: \\r\\n\\r\\n$0\\r\\n\\r\\nCliceil \"Retry\" chun iarracht eile a dhanamh, n\\r\\n\"Cancel\" chun an tsuiteil a stopadh.\n# ^CantWrite\n\"N fidir scrobh: \"\n# ^CopyFailed\nTheip ar an gcipeil\n# ^CopyTo\n\"Cipeil go \"\n# ^Registering\n\"Clr: \"\n# ^Unregistering\n\"Dchlr: \"\n# ^SymbolNotFound\n\"Norbh fhidir siombail a aimsi: \"\n# ^CouldNotLoad\n\"Norbh fhidir lucht: \"\n# ^CreateFolder\n\"Cruthaigh fillten: \"\n# ^CreateShortcut\n\"Cruthaigh aicearra: \"\n# ^CreatedUninstaller\n\"Cruthaodh dshuitela: \"\n# ^Delete\n\"Scrios comhad: \"\n# ^DeleteOnReboot\n\"Scrios ag am atosaithe: \"\n# ^ErrorCreatingShortcut\n\"Earrid agus aicearra  chruth: \"\n# ^ErrorCreating\n\"Earrid le linn cruthaithe: \"\n# ^ErrorDecompressing\nEarrid agus sonra  ndchomhbhr! Suitela truaillithe?\n# ^ErrorRegistering\nEarrid agus DLL  chlr\n# ^ExecShell\n\"Blaosc: \"\n# ^Exec\n\"Rith: \"\n# ^Extract\n\"Bain Amach: \"\n# ^ErrorWriting\n\"Extract: earrid le linn scrofa \"\n# ^InvalidOpcode\nDshuitela truaillithe: cd neamhbhail oibrochta\n# ^NoOLE\n\"Gan OLE le haghaidh: \"\n# ^OutputFolder\n\"Fillten aschurtha: \"\n# ^RemoveFolder\n\"Bain fillten: \"\n# ^RenameOnReboot\n\"Athainmnigh ag am atosaithe: \"\n# ^Rename\n\"Athainmnigh: \"\n# ^Skipped\n\"Neamhaird danta de: \"\n# ^CopyDetails\nCipeil Sonra go dt an Ghearrthaisce\n# ^LogInstall\nLogil an priseas suitela\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Irish.nsh",
    "content": ";Language: Irish (2108)\n;By Kevin P. Scannell < scannell at slu dot edu >\n\n!insertmacro LANGFILE \"Irish\" \"Irish\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Filte go dt Draoi Suitela $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Danfaidh an draoi seo treor duit trd an suiteil de $(^NameDA).$\\r$\\n$\\r$\\nMoltar duit gach feidhmchlr eile a dhnadh sula dtosaonn t an Suitela. Cinnteoidh s seo gur fidir na comhaid oirinacha a nuashonr gan do romhaire a atos.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Filte go dt Draoi Dshuitela $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Danfaidh an draoi seo treor duit trd an dshuiteil de $(^NameDA).$\\r$\\n$\\r$\\nB cinnte nach bhfuil $(^NameDA) ag rith sula dtosaonn t an dshuiteil.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Comhaont um Cheadnas\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Dan inichadh ar choinnollacha an cheadnais sula suitelann t $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"M ghlacann t le coinnollacha an chomhaontaithe, cliceil $\\\"Glacaim Leis$\\\" chun leanint ar aghaidh. Caithfidh t glacadh leis an gcomhaont chun $(^NameDA) a shuiteil.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"M ghlacann t le coinnollacha an chomhaontaithe, cliceil an ticbhosca thos. Caithfidh t glacadh leis an gcomhaont chun $(^NameDA) a shuiteil. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"M ghlacann t le coinnollacha an chomhaontaithe, roghnaigh an chad rogha thos. Caithfidh t glacadh leis an gcomhaont chun $(^NameDA) a dhshuiteil. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Comhaont um Cheadnas\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Dan inichadh ar choinnollacha an cheadnais sula ndshuitelann t $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"M ghlacann t le coinnollacha an chomhaontaithe, cliceil $\\\"Glacaim Leis$\\\" chun leanint ar aghaidh. Caithfidh t glacadh leis an gcomhaont chun $(^NameDA) a dhshuiteil.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"M ghlacann t le coinnollacha an chomhaontaithe, cliceil an ticbhosca thos. Caithfidh t glacadh leis an gcomhaont chun $(^NameDA) a dhshuiteil. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"M ghlacann t le coinnollacha an chomhaontaithe, roghnaigh an chad rogha thos. Caithfidh t glacadh leis an gcomhaont chun $(^NameDA) a dhshuiteil. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Brigh $\\\"Page Down$\\\" chun an chuid eile den cheadnas a lamh.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Roghnaigh Comhphirteanna\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Roghnaigh na gnithe $(^NameDA) ba mhaith leat suiteil.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Roghnaigh Comhphirteanna\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Roghnaigh na gnithe $(^NameDA) ba mhaith leat dshuiteil.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Cur Sos\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Cuir do luch os cionn comhphirte chun cur sos a fheiceil.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Cuir do luch os cionn comhphirte chun cur sos a fheiceil.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Roghnaigh Suomh na Suitela\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Roghnaigh an fillten inar mian leat $(^NameDA) a shuiteil.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Roghnaigh Suomh na Dshuitela\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Roghnaigh an fillten ar mian leat $(^NameDA) a dhshuiteil as.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \" Shuiteil\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Fan go fill; $(^NameDA)  shuiteil.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Suiteil Crochnaithe\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"D'irigh leis an tsuiteil.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Suiteil Tobscortha\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Nor irigh leis an tsuiteil.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \" Dhshuiteil\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Fan go fill; $(^NameDA)  dhshuiteil.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Dshuiteil Crochnaithe\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"D'irigh leis an dshuiteil.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Dshuiteil Tobscortha\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Nor irigh leis an dshuiteil.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Draoi Suitela $(^NameDA)  Chrochn\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"Suiteladh $(^NameDA) ar do romhaire.$\\r$\\n$\\r$\\nCliceil $\\\"Crochnaigh$\\\" chun an draoi seo a dhnadh.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"N mr duit do romhaire a atos chun suiteil $(^NameDA) a chur i gcrch. Ar mhaith leat atos anois?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Draoi Dshuitela $(^NameDA)  Chrochn\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"Dshuiteladh $(^NameDA)  do romhaire.$\\r$\\n$\\r$\\nCliceil $\\\"Crochnaigh$\\\" chun an draoi seo a dhnadh.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"N mr duit do romhaire a atos chun dshuiteil $(^NameDA) a chur i gcrch. Ar mhaith leat atos anois?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Atosaigh anois\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Atosidh m de limh nos dana\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Rith $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Tai&spein comhad README\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Crochnaigh\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Roghnaigh Fillten sa Roghchlr Tosaigh\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Roghnaigh fillten sa Roghchlr Tosaigh a gcuirfear aicearra $(^NameDA) ann.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Roghnaigh an fillten sa Roghchlr Tosaigh inar mian leat aicearra an chlir a chruth. Is fidir freisin fillten nua a chruth tr ainm nua a iontril.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"N cruthaigh aicearra\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Dshuiteil $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Bain $(^NameDA)  do romhaire.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"An bhfuil t cinnte gur mian leat Suitela $(^Name) a scor?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"An bhfuil t cinnte gur mian leat Dshuitela $(^Name) a scor?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Italian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1040\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation orginally started by Orfanik - http://www.orfanik.hu\n# Updated v2 to v6 by Alessandro Staltari < staltari (a) geocities.com >\n# corrected by < mdalco@gmail.com >\n# ^Branding\nSistema di installazione Nullsoft %s\n# ^SetupCaption\nInstallazione di $(^Name)\n# ^UninstallCaption\nDisinstallazione di $(^Name)\n# ^LicenseSubCaption\n: Licenza d'uso\n# ^ComponentsSubCaption\n: Opzioni di installazione\n# ^DirSubCaption\n: Cartella di installazione\n# ^InstallingSubCaption\n: Installazione dei file\n# ^CompletedSubCaption\n: Completata\n# ^UnComponentsSubCaption\n: Opzioni di disinstallazione\n# ^UnDirSubCaption\n: Cartella di disinstallazione\n# ^ConfirmSubCaption\n: Conferma\n# ^UninstallingSubCaption\n: Rimozione dei file\n# ^UnCompletedSubCaption\n: Completata\n# ^BackBtn\n< &Indietro\n# ^NextBtn\n&Avanti >\n# ^AgreeBtn\n&Accetto\n# ^AcceptBtn\n&Accetto le condizioni della licenza\n# ^DontAcceptBtn\n&Non accetto le condizioni della licenza\n# ^InstallBtn\nIns&talla\n# ^UninstallBtn\n&Disinstalla\n# ^CancelBtn\nAnnulla\n# ^CloseBtn\n&Fine\n# ^BrowseBtn\nS&foglia...\n# ^ShowDetailsBtn\nMostra &dettagli\n# ^ClickNext\nPer proseguire, scegliere Avanti.\n# ^ClickInstall\nPer avviare l'installazione, selezionare Installa.\n# ^ClickUninstall\nPer avviare la disinstallazione, selezionare Disinstalla.\n# ^Name\nNome\n# ^Completed\nCompletata\n# ^LicenseText\nLeggere la licenza prima di procedere con l'installazione di $(^NameDA). Se si accettano le condizioni di licenza, selezionare Accetto.\n# ^LicenseTextCB\nLeggere la licenza prima di procedere con l'installazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare la casella sottostante. $_CLICK\n# ^LicesnseTextRB\nLeggere la licenza prima di procedere con l'installazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare la prima delle opzioni sottoindicate. $_CLICK\n# ^UnLicenseText\nLeggere la licenza prima di procedere con la disinstallazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare Accetto. $_CLICK\n# ^UnLicenseTextCB\nLeggere la licenza prima di procedere con la disinstallazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare la casella sottostante. $_CLICK\n# ^UnLicesnseTextRB\nLeggere la licenza prima di procedere con la disinstallazione di $(^NameDA). Se si accettano pienamente le condizioni di licenza, selezionare la prima delle opzioni sottoindicate. $_CLICK\n# ^Custom\nPersonalizzata\n# ^ComponentsText\nSelezionare i componenti che si desidera installare.\n# ^ComponentsSubText1\nSelezionare il tipo d'installazione:\n# ^ComponentsSubText2_NoInstTypes\nSelezionare i componenti da installare:\n# ^ComponentsSubText2\nOppure, selezionare i componenti opzionali che si desidera installare:\n# ^UnComponentsText\nSelezionare i componenti che si desidera disinstallare.\n# ^UnComponentsSubText1\nSelezionare il tipo di disinstallazione:\n# ^UnComponentsSubText2_NoInstTypes\nSelezionare i componenti da disinstallare:\n# ^UnComponentsSubText2\nOppure, selezionare i componenti opzionali che si desidera disinstallare :\n# ^DirText\nQuesta procedura installer $(^NameDA) nella cartella seguente. Per installare in una cartella diversa, selezionare Sfoglia e sceglierne un'altra. $_CLICK\n# ^DirSubText\nCartella di destinazione\n# ^DirBrowseText\nSelezionare la cartella dove installare $(^NameDA):\n# ^UnDirText\nQuesta procedura disinstaller $(^NameDA) nella cartella seguente. Per disinstallare da una cartella diversa, selezionare Sfoglia e sceglierene un'altra. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nSelezionare la cartella dalla quale disinstallare $(^NameDA):\n# ^SpaceAvailable\n\"Spazio disponibile: \"\n# ^SpaceRequired\n\"Spazio richiesto: \"\n# ^UninstallingText\n$(^NameDA) verr disinstallato dalla cartella seguente. $_CLICK\n# ^UninstallingSubText\nRimozione da:\n# ^FileError\nErrore nell'apertura del file per la scrittura: \\r\\n\\t\"$0\"\\r\\nSeleziona Termina per interrompere l'installazione,\\r\\nsu Riprova per ritentare, oppure\\r\\nsu Ignora per saltare questo file.\n# ^FileError_NoIgnore\nErrore nell'apertura del file per la scrittura: \\r\\n\\t\"$0\"\\r\\nSeleziona Riprova per ritentare, oppure\\r\\nsu Termina per interrompere l'installazione\n# ^CantWrite\n\"Impossibile scrivere: \"\n# ^CopyFailed\nCopia fallita\n# ^CopyTo\n\"Copia in \"\n# ^Registering\n\"Registrazione in corso: \"\n# ^Unregistering\n\"Deregistrazione in corso: \"\n# ^SymbolNotFound\n\"Impossibile trovare il simbolo: \"\n# ^CouldNotLoad\n\"Impossibile caricare: \"\n# ^CreateFolder\n\"Crea cartella: \"\n# ^CreateShortcut\n\"Crea collegamento: \"\n# ^CreatedUninstaller\n\"Creato il programma di disinstallazione: \"\n# ^Delete\n\"Elimina file: \"\n# ^DeleteOnReboot\n\"Elimina al riavvio: \"\n# ^ErrorCreatingShortcut\n\"Errore nella creazione del collegamento: \"\n# ^ErrorCreating\n\"Errore nella creazione: \"\n# ^ErrorDecompressing\nErrore nella decompressione dei dati! Programma di installazione corrotto?\n# ^ErrorRegistering\nErrore nella registrazione della DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Esecuzione: \"\n# ^Extract\n\"Estrazione: \"\n# ^ErrorWriting\n\"Estrazione: errore nella scrittura sul file \"\n# ^InvalidOpcode\nProgramma di installazione corrotto: opcode non valido\n# ^NoOLE\n\"Nessuna OLE per: \"\n# ^OutputFolder \n\"Cartella di destinazione: \"\n# ^RemoveFolder\n\"Rimuovi cartella: \"\n# ^RenameOnReboot\n\"Rinomina al riavvio: \"\n# ^Rename\nRinomina \n# ^Skipped\n\"Saltato: \"\n# ^CopyDetails\nCopia i dettagli negli appunti\n# ^LogInstall\nLog del processo di installazione\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Italian.nsh",
    "content": ";Language: Italian (1040)\n;By SANFACE Software <sanface@sanface.com> v1.67 accents\n;Review and update from v1.65 to v1.67 by Alessandro Staltari < staltari (a) geocities.com >\n;Review and update from v1.67 to v1.68 by Lorenzo Bevilacqua < meow811@libero.it >\n\n!insertmacro LANGFILE \"Italian\" \"Italiano\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Benvenuti nel programma di installazione di $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Questo programma installer $(^NameDA) nel vostro computer.$\\r$\\n$\\r$\\nSi raccomanda di chiudere tutte le altre applicazioni prima di iniziare l'installazione. Questo permetter al programma di installazione di aggiornare i file di sistema senza dover riavviare il computer.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Benvenuti nella procedura guidata di disinstallazione di $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Questa procedura vi guider nella disinstallazione di $(^NameDA).$\\r$\\n$\\r$\\nPrima di iniziare la disinstallazione, assicuratevi che $(^Name) non sia in esecuzione.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Licenza d'uso\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Prego leggere le condizioni della licenza d'uso prima di installare $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Se si accettano i termini della licenza d'uso scegliere Accetto per continuare.  necessario accettare i termini della licenza d'uso per installare $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Se si accettano i termini della licenza d'uso, selezionare la casella sottostante.  necessario accettare i termini della licenza d'uso per installare $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Se si accettano i termini della licenza d'uso, selezionare la prima opzione sottostante.  necessario accettare i termini della licenza d'uso per installare $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Licenza d'uso\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Prego leggere le condizioni della licenza d'uso prima di disinstallare $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Se si accettano i termini della licenza d'uso scegliere Accetto per continuare.  necessario accettare i termini della licenza d'uso per disinstallare $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Se si accettano i termini della licenza d'uso, selezionare la casella sottostante.  necessario accettare i termini della licenza d'uso per disinstallare $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Se si accettano i termini della licenza d'uso, selezionare la prima opzione sottostante.  necessario accettare i termini della licenza d'uso per disinstallare $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Premere Page Down per vedere il resto della licenza d'uso.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Selezione dei componenti\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Selezionare i componenti di $(^NameDA) che si desidera installare.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Selezione componenti\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Scegliere i componenti di $(^NameDA) che si desidera disinstallare.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Descrizione\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Posizionare il puntatore del mouse sul componente per vederne la descrizione.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Posizionare il puntatore del mouse sul componente per vederne la descrizione.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Scelta della cartella di installazione\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Scegliere la cartella nella quale installare $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Scelta della cartella da cui disinstallare\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Scegliere la cartella dalla quale disinstallare $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Installazione in corso\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Prego attendere mentre $(^NameDA) viene installato.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Installazione completata\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"L'installazione  stata completata con successo.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Installazione interrotta\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"L'installazione non  stata completata correttamente.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Disinstallazione in corso\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Prego attendere mentre $(^NameDA) viene disinstallato.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Disinstallazione completata\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"La disinstallazione  stata completata con successo.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Disinstallazione interrotta\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"La disintallazione non  stata completata correttamente.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Completamento dell'installazione di $(^NameDA).\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA)  stato installato sul vostro computer.$\\r$\\n$\\r$\\nScegliere Fine per chiudere il programma di installazione.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Il computer deve essere riavviato per completare l'installazione di $(^NameDA). Vuoi riavviarlo ora?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Completamento della disinstallazione di $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA)  stato disinstallato dal computer.$\\r$\\n$\\r$\\nSelezionare Fine per terminare questa procedura.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Il computer deve essere riavviato per completare l'installazione di $(^NameDA). Vuoi riavviarlo ora?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Riavvia adesso\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Preferisco riavviarlo manualmente pi tardi\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"Esegui $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Mostra il file Readme\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Fine\"\n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Scelta della cartella del menu Start\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Scegliere una cartella del menu Start per i collegamenti del programma.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Scegliere la cartella del menu Start in cui verranno creati i collegamenti del programma.  possibile inserire un nome per creare una nuova cartella.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Non creare i collegamenti al programma.\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Disinstalla $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Rimuove $(^NameDA) dal computer.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Sei sicuro di voler interrompere l'installazione di $(^Name) ?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Sei sicuro di voler interrompere la disinstallazione di $(^Name)?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Scelta degli Utenti\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Scegliete per quali utenti volete installare $(^NameDA).\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Scegliete se volete installare $(^NameDA) solo per voi o per tutti gli utenti di questo sistema. $(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Installazione per tutti gli utenti\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Installazione personale\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Japanese.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1041\n# Font and size - dash (-) means default\nlr oSVbN\n9\n# Codepage - dash (-) means ANSI code page\n932\n# RTL - anything else than RTL means LTR\n-\n# Translation by Dnanako, updated by Takahiro Yoshimura <takahiro_y@monolithworks.co.jp>\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) ZbgAbv\n# ^UninstallCaption\n$(^Name) ACXg[\n# ^LicenseSubCaption\nFCZX_\n# ^ComponentsSubCaption\nFCXg[ IvV\n# ^DirSubCaption\nFCXg[ tH_\n# ^InstallingSubCaption\nFCXg[\n# ^CompletedSubCaption\nF\n# ^UnComponentsSubCaption\n: ACXg[ IvV\n# ^UnDirSubCaption\n: ACXg[ tH_\n# ^ComfirmSubCaption\nFmF\n# ^UninstallingSubCaption\nFACXg[\n# ^UnCompletedSubCaption\nF\n# ^BackBtn\n< ߂(&B)\n# ^NextBtn\n(&N) >\n# ^AgreeBtn\nӂ(&A)\n# ^AcceptBtn\ñCZX_񏑂ɓӂ܂(&A)\n# ^DontAcceptBtn\ñCZX_񏑂ɂ͓ӂł܂(&D)\n# ^InstallBtn\nCXg[\n# ^UninstallBtn\nݲݽİ(&U)\n# ^CancelBtn\nLZ\n# ^CloseBtn\n(&C)\n# ^BrowseBtn\nQ(&R)...\n# ^ShowDetailsBtn\nڍׂ\\(&D)\n# ^ClickNext\nɂ [] NbNĉB\n# ^ClickInstall\nCXg[n߂ɂ [CXg[] NbNĉB\n# ^ClickUninstall\nACXg[n߂ɂ [ݲݽİ] NbNĉB\n# ^Name\nAvP[V\n# ^Completed\n\n# ^LicenseText\n$(^NameDA)CXg[OɁACZX_񏑂mFĉB_񏑂̑SĂ̏ɓӂȂ΁A[ӂ] {^NbNĉB\n# ^LicenseTextCB\n$(^NameDA)CXg[OɁACZX_񏑂mFĉB_񏑂̑SĂ̏ɓӂȂ΁Ã`FbN{bNXNbNĉB $_CLICK\n# ^LicenseTextRB\n$(^NameDA)CXg[OɁACZX_񏑂mFĉB_񏑂̑SĂ̏ɓӂȂ΁Aɕ\\ĂIvV̂Aŏ̂̂IŉB $_CLICK\n# ^UnLicenseText\n$(^NameDA)ACXg[OɁACZX_񏑂mFĉB_񏑂̑SĂ̏ɓӂȂ΁A[ӂ] {^NbNĉB\n# ^UnLicenseTextCB\n$(^NameDA)ACXg[OɁACZX_񏑂mFĉB_񏑂̑SĂ̏ɓӂȂ΁Ã`FbN{bNXNbNĉB $_CLICK\n# ^UnLicenseTextRB\n$(^NameDA)ACXg[OɁACZX_񏑂mFĉB_񏑂̑SĂ̏ɓӂȂ΁Aɕ\\ĂIvV̂Aŏ̂̂IŉB $_CLICK\n# ^Custom\nJX^\n# ^ComponentsText\nCXg[R|[lgɃ`FbNtĉBsvȂ̂ɂẮA`FbNOĉB $_CLICK\n# ^ComponentsSubText1\nCXg[ ^CvIF\n# ^ComponentsSubText2_NoInstTypes\nCXg[ R|[lgIF\n# ^ComponentsSubText2\n܂́ACXg[ IvV R|[lgIF\n# ^UnComponentsText\nACXg[R|[lgɃ`FbNtĉBłȂ̂ɂẮA`FbNOĉB $_CLICK\n# ^UnComponentsSubText1\nACXg[ ^CvIF\n# ^UnComponentsSubText2_NoInstTypes\nACXg[ R|[lgIF\n# ^UnComponentsSubText2\n܂́AACXg[ IvV R|[lgIF\n# ^DirText\n$(^NameDA)ȉ̃tH_ɃCXg[܂BقȂtH_ɃCXg[ɂ́A[Q] āAʂ̃tH_IĂB $_CLICK\n# ^DirSubText\nCXg[ tH_\n# ^DirBrowseText\n$(^NameDA)CXg[tH_IĂF\n# ^UnDirText\n$(^NameDA)ȉ̃tH_ACXg[܂BقȂtH_ACXg[ɂ́A[Q] āAʂ̃tH_IĂB $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n$(^NameDA)ACXg[tH_IĂF\n# ^SpaceAvailable\np\\ȃfBXNXy[XF \n# ^SpaceRequired\nKvȃfBXNXy[XF \n# ^UninstallingText\n$(^NameDA)́Aȉ̃tH_ACXg[܂B $_CLICK\n# ^UninstallingSubText\nACXg[F\n# ^FileError\nt@C̍쐬G[F\\r\\n\\t\"$0\"\\r\\nCXg[𒆎~ɂ͒~,\\r\\nĂт̃t@C̍쐬݂ɂ͍Ďs, ܂\\r\\ñt@CXLbvđɂ͖Ă\n# ^FileError_NoIgnore\nt@C̍쐬G[: \\r\\n\\t\"$0\"\\r\\nĂт̃t@C̍쐬݂ɂ͍Ďs, ܂\\r\\nCXg[𒆎~ɂ̓LZĉ\n# ^CantWrite\n쐬ł܂F\n# ^CopyFailed\nRs[͎s܂\n# ^CopyTo\nRs[܂\n# ^Registering\no^:\n# ^Unregistering\no^:\n# ^SymbolNotFound\nV{邱Ƃł܂F\n# ^CouldNotLoad\n[h邱Ƃł܂F\n# ^CreateFolder\ntH_̍쐬F\n# ^CreateShortcut\nV[gJbg̍쐬F\n# ^CreatedUninstaller\nACXg[̍쐬F\n# ^Delete\nt@C̍폜F\n# ^DeleteOnReboot\nu[gɍ폜F\n# ^ErrorCreatingShortcut\nV[gJbg̍쐬G[F\n# ^ErrorCreating\n쐬G[F\n# ^ErrorDecompressing\nf[^̒oG[\\r\\n\\r\\nCXg[jĂ܂B\n# ^ErrorRegistering\nDLL̓o^G[\n# ^ExecShell\ngq̊֘Ats: \n# ^Execute\nsF\n# ^Extract\noF\n# ^ErrorWriting\noFt@C쐬G[\n# ^InvalidOpcode\nCXg[̕sFopcode\n# ^NoOLE\nOLE܂F\n# ^OutputFolder\no͐tH_F\n# ^RemoveFolder\ntH_̍폜F\n# ^RenameOnReboot\nu[gɖO̕ύXF\n# ^Rename\nO̕ύXF\n# ^Skipped\nXLbvF\n# ^CopyDetails\nNbv{[h֏ڍׂRs[\n# ^LogInstall\nCXg[vZXOwL^\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Japanese.nsh",
    "content": ";Language: Japanese (1041)\n;By Dnanako\n;Translation updated by Takahiro Yoshimura <takahiro_y@monolithworks.co.jp>\n\n!insertmacro LANGFILE \"Japanese\" \"Japanese\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"$(^NameDA) ZbgAbv EBU[hւ悤\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"̃EBU[h́A$(^NameDA)̃CXg[KChĂ܂B$\\r$\\n$\\r$\\nZbgAbvJnOɁÂׂẴAvP[VI邱Ƃ𐄏܂BɂăZbgAbvRs[^ċNɁAVXe t@CXV邱Ƃo悤ɂȂ܂B$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"$(^NameDA) ACXg[ EBU[hւ悤\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"̃EBU[h́A$(^NameDA)̃ACXg[KChĂ܂B$\\r$\\n$\\r$\\nACXg[JnOɁA$(^NameDA)NĂȂƂmFĉB$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"CZX_\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"$(^NameDA)CXg[OɁACZXmFĂB\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"_񏑂ׂ̂Ă̏ɓӂȂ΁A[ӂ] IŃCXg[𑱂ĂB$(^NameDA) CXg[ɂ́A_񏑂ɓӂKv܂B\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"_񏑂ׂ̂Ă̏ɓӂȂ΁Ã`FbN{bNXNbNĂB$(^NameDA) CXg[ɂ́A_񏑂ɓӂKv܂B $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"_񏑂ׂ̂Ă̏ɓӂȂ΁Aɕ\\ĂIvV̂Aŏ̂̂IŉB$(^NameDA) CXg[ɂ́A_񏑂ɓӂKv܂B $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"CZX_\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"$(^NameDA)ACXg[OɁACZXmFĂB\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"_񏑂ׂ̂Ă̏ɓӂȂ΁A[ӂ] IŃACXg[𑱂ĂB$(^NameDA) ACXg[ɂ́A_񏑂ɓӂKv܂B\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"_񏑂ׂ̂Ă̏ɓӂȂ΁Ã`FbN{bNXNbNĂB$(^NameDA) ACXg[ɂ́A_񏑂ɓӂKv܂B $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"_񏑂ׂ̂Ă̏ɓӂȂ΁Aɕ\\ĂIvV̂Aŏ̂̂IŉB$(^NameDA) ACXg[ɂ́A_񏑂ɓӂKv܂B $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"[Page Down]Č_񏑂ׂĂǂ݂B\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"R|[lgIłB\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"$(^NameDA)̃CXg[ IvVIłB\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"R|[lgIłB\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"$(^NameDA)̃ACXg[ IvVIłB\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"R|[lg̏Ƀ}EX J[\\ړƁAɐ\\܂B\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"R|[lg̏Ƀ}EX J[\\ړƁAɐ\\܂B\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"CXg[IłB\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"$(^NameDA)CXg[tH_IłB\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"ACXg[IłB\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"$(^NameDA)ACXg[tH_IłB\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"CXg[\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"$(^NameDA)CXg[Ă܂B΂炭҂B\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"CXg[̊\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"CXg[ɐ܂B\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"CXg[̒~\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"ZbgAbv͐Ɋ܂łB\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"ACXg[\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"$(^NameDA)ACXg[Ă܂B΂炭҂B\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"ACXg[̊\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"ACXg[ɐ܂B\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"ACXg[̒~\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"ACXg[͐Ɋ܂łB\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"$(^NameDA) ZbgAbv EBU[h͊܂B\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA)́ÃRs[^ɃCXg[܂B$\\r$\\n$\\r$\\nEBU[hɂ [] ĂB\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"$(^NameDA) ̃CXg[ɂ́ÃRs[^ċNKv܂BċN܂H\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"$(^NameDA) ACXg[ EBU[h͊܂B\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA)́ÃRs[^ACXg[܂B$\\r$\\n$\\r$\\nEBU[hɂ [] ĂB\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"$(^NameDA) ̃ACXg[ɂ́ÃRs[^ċNKv܂BċN܂H\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"ċN\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Ŏ蓮ōċN\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"$(^NameDA)s(&R)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Readme \\(&S)\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"(&F)\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"X^[gj[ tH_IłB\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"$(^NameDA)̃V[gJbg쐬X^[gj[ tH_IŉB\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"̃vÕV[gJbg쐬X^[gj[ tH_IĂB܂A쐬VtH_ɖO邱Ƃł܂B\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"V[gJbg쐬Ȃ\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"$(^NameDA)̃ACXg[\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"$(^NameDA)̃Rs[^폜܂B\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"$(^Name) ZbgAbv𒆎~܂H\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"$(^Name) ACXg[𒆎~܂H\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Korean.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1042\n# Font and size - dash (-) means default\n\n9\n# Codepage - dash (-) means ANSI code page\n949\n# RTL - anything else than RTL means LTR\n-\n# Translation by dTomoyo dtomoyo@empal.com ( ~V2.0 BETA2 ) / By hardkoder@gmail.com (V2.0 BETA3 ~ )\n# ^Branding\nμƮ ġ ý %s\n# ^SetupCaption\n$(^Name) ġ\n# ^UninstallCaption\n$(^Name) \n# ^LicenseSubCaption\n:   \n# ^ComponentsSubCaption\n: ġ ɼ\n# ^DirSubCaption\n:  \n# ^InstallingSubCaption\n:  ġ\n# ^CompletedSubCaption\n: ġ Ϸ\n# ^UnComponentsSubCaption\n:  ɼ\n# ^UnDirSubCaption\n:  \n# ^ConfirmSubCaption\n: Ȯ \n# ^UninstallingSubCaption\n: \n# ^UnCompletedSubCaption\n:  Ϸ\n# ^BackBtn\n< ڷ\n# ^NextBtn\n >\n# ^AgreeBtn\n\n# ^AcceptBtn\n ׿ մϴ.\n# ^DontAcceptBtn\n ʽϴ.\n# ^InstallBtn\nġ\n# ^UninstallBtn\n\n# ^CancelBtn\n\n# ^CloseBtn\n\n# ^BrowseBtn\nãƺ...\n# ^ShowDetailsBtn\nڼ \n# ^ClickNext\nϽ÷ '' ư  ּ.\n# ^ClickInstall\nġ Ͻ÷ 'ġ' ư  ּ.\n# ^ClickUninstall\n'' ư  Ű ۵˴ϴ.\n# ^Name\n̸\n# ^Completed\nϷ\n# ^LicenseText\n$(^NameDA)() ġϱ     캸ñ ٶϴ. 뿡 ϼ̴ٸ ''  ּ.\n# ^LicenseTextCB\n$(^NameDA)() ġϱ     캸ñ ٶϴ. 뿡 ϼ̴ٸ Ʒ  üũ ּ. $_CLICK\n# ^LicesnseTextRB\n$(^NameDA)() ġϱ     캸ñ ٶϴ. 뿡 ϼ̴ٸ Ʒ ɼ  ּ. $_CLICK\n# ^UnLicenseText\n$(^NameDA)() ϱ     캸ñ ٶϴ. 뿡 ϼ̴ٸ ''  ּ.\n# ^UnLicenseTextCB\n$(^NameDA)() ϱ     캸ñ ٶϴ. 뿡 ϼ̴ٸ Ʒ  üũ ּ. $_CLICK\n# ^UnLicesnseTextRB\n$(^NameDA)() ϱ     캸ñ ٶϴ. 뿡 ϼ̴ٸ Ʒ ɼ  ּ. $_CLICK\n# ^Custom\n \n# ^ComponentsText\nġ Ͻô  Ҹ Ͽ ֽñ ٶϴ. $_CLICK\n# ^ComponentsSubText1\nġ  :\n# ^ComponentsSubText2_NoInstTypes\nġϷ   :\n# ^ComponentsSubText2\n  :\n# ^UnComponentsText\nŸ ϴ  Ҹ üũ ֽñ ٶϴ. $_CLICK\n# ^UnComponentsSubText1\n  :\n# ^UnComponentsSubText2_NoInstTypes\nϷ   :\n# ^UnComponentsSubText2\nϷ   :\n# ^DirText\n$(^NameDA)()   ġ Դϴ. \\r\\nٸ  ġϰ ø 'ãƺ' ư  ٸ   ּ. $_CLICK\n# ^DirSubText\nġ \n# ^DirBrowseText\n$(^NameDA)()   ġմϴ:\n# ^UnDirText\n$(^NameDA)()    Դϴ. \\r\\nٸ  ϰ ø 'ãƺ' ư  ٸ   ּ. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n$(^NameDA)()    մϴ:\n# ^SpaceAvailable\n\" ũ : \"\n# ^SpaceRequired\n\"ʿ ũ : \"\n# ^UninstallingText\nýۿ $(^NameDA)()   Դϴ. $_CLICK\n# ^UninstallingText\n :\n# ^FileError\n    ϴ.: \\r\\n\\t\"$0\"\\r\\n'ߴ'  ġ ϰų,\\r'ٽ õ'  ٽ õ ų,\\r''    ǳ ټ.\n# ^FileError_NoIgnore\n    ϴ.: \\r\\n\\t\"$0\"\\r\\n'ٽ õ'  ٽ õ ų,\\r''  ġ ϼ.\n# ^CantWrite\n\"  : \"\n# ^CopyFailed\n \n# ^CopyTo\n\"  \"\n# ^Registering\n\": \"\n# ^Unregistering\n\" : \"\n# ^SymbolNotFound\n\"ɺ ã  : \"\n# ^CouldNotLoad\n\"ҷ  : \"\n# ^CreateFolder\n\" : \"\n# ^CreateShortcut\n\"ٷ  : \"\n# ^CreatedUninstaller\n\"ν緯 : \"\n# ^Delete\n\" : \"\n# ^DeleteOnReboot\n\"ý : \"\n# ^ErrorCreatingShortcut\n\"ٷ   : \"\n# ^ErrorCreating\n\" : \"\n# ^ErrorDecompressing\n   ߻! ġ  ջǾϴ.\n# ^ErrorRegistering\nDLL  \n# ^ExecShell\n\" : \"\n# ^Exec\n\": \"\n# ^Extract\n\" : \"\n# ^ErrorWriting\n\" :  ϴ   ߻ \"\n# ^InvalidOpcode\nν緯 ջ: ߸ ڵ\n# ^NoOLE\n\"OLE  : \"\n# ^OutputFolder\n\" : \"\n# ^RemoveFolder\n\" : \"\n# ^RenameOnReboot\n\"ý ̸ : \"\n# ^Rename\n\"̸ : \"\n# ^Skipped\n\"ǳʶ: \"\n# ^CopyDetails\nڼ  Ŭ \n# ^LogInstall\nġ α ۼ\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Korean.nsh",
    "content": ";Language: Korean (1042)\n;By linak linak@korea.com ( ~ V2.0 BETA3 ) By kippler@gmail.com(www.kipple.pe.kr) ( V2.0 BETA3 ~ ) (last update:2007/09/05)\n\n!insertmacro LANGFILE \"Korean\" \"Korean\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"$(^NameDA) ġ մϴ.\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \" α׷  ǻͿ $(^NameDA)() ġ Դϴ.$\\r$\\n$\\r$\\nġ ϱ     α׷ Ͽ ֽñ ٶϴ. ̴   ʰ ý    ְ ݴϴ.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"$(^NameDA) Ÿ մϴ.\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \" α׷  ǻͿ $(^NameDA)()  Դϴ.$\\r$\\n$\\r$\\nŸ ϱ  $(^NameDA)() Ͽ ֽñ ٶϴ.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"$(^NameDA)() ġϽñ     캸ñ ٶϴ.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"뿡 ϼ̴ٸ ''  ּ. $(^NameDA)() ġϱ ؼ ݵ 뿡 ϼž մϴ.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"뿡 ϼ̴ٸ Ʒ   ּ. $(^NameDA)() ġϱ ؼ ݵ 뿡 ϼž մϴ. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"뿡 ϼ̴ٸ ù °   ּ. $(^NameDA)() ġϱ ؼ ݵ 뿡 ϼž մϴ. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"$(^NameDA)() Ͻñ     캸ñ ٶϴ.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"뿡 ϼ̴ٸ ''  ּ. $(^NameDA)() ϱ ؼ ݵ 뿡 ϼž մϴ.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"뿡 ϼ̴ٸ Ʒ   ּ. $(^NameDA)() ϱ ؼ ݵ 뿡 ϼž մϴ. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"뿡 ϼ̴ٸ ù °   ּ. $(^NameDA)() ϱ ؼ ݵ 뿡 ϼž մϴ. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"     κ ÷ [Page Down] Ű  ּ.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"ġϰ ϴ $(^NameDA)  Ҹ  ּ.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"ϰ ϴ $(^NameDA)  Ҹ  ּ.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \" \"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"    κп 콺 ÷.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"    κп 콺 ÷.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"ġ ġ \"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"$(^NameDA)() ġ   ּ.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \" ġ \"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"$(^NameDA)()    ּ.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"ġ\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"$(^NameDA)() ġϴ   ٷ ּ.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"ġ Ϸ\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"ġ  ϷǾϴ.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"ġ \"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"α׷ ġ ҵǾϴ.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"$(^NameDA)() ϴ   ٷ ֽñ ٶϴ.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \" ħ\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"α׷  Ͽϴ.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"α׷  \"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"α׷ Ű ҵǾϴ.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"$(^NameDA) ġ Ϸ\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) ġ ϷǾϴ. ġ α׷ ġ 'ħ' ư  ּ.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"$(^NameDA) ġ Ϸϱ ؼ ý ٽ ؾ մϴ.   Ͻðڽϱ?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \" Ϸ\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) Ű Ϸ Ǿϴ.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"$(^NameDA) Ÿ Ϸϱ ؼ ý ٽ ؾ մϴ.   Ͻðڽϱ?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"  ϰڽϴ.\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"߿  ϰڽϴ.\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"$(^NameDA) ϱ(&R)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Readme  (&S)\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"ħ\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \" ޴  \"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"α׷ ٷ     ޴  .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"α׷ ٷ     ޴  ϼ. ο  Ϸ  ̸ Էϼ.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"ٷ    ʰڽϴ.\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"$(^NameDA) \"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"$(^NameDA) ϱ\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"$(^Name) ġ Ͻðڽϱ?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"$(^Name) Ÿ Ͻðڽϱ?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Kurdish.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID (none exists for Kurdish at this time)\n9999\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n-\n# RTL - anything else than RTL means LTR\n-\n# Translation by Rzan Tovjn(chagy) (retovjin@hotmail.com.com)\n# ^Branding\nNullsoft Pergala Sazkirin %s\n# ^SetupCaption\n$(^Name) Sazkirin\n# ^UninstallCaption\n$(^Name) Rakirin\n# ^LicenseSubCaption\n: Peymana Lsans\n# ^ComponentsSubCaption\n: Vebijrkn Sazkirin\n# ^DirSubCaption\n: Peldanka Sazkirin\n# ^InstallingSubCaption\n: T Sazkirin\n# ^CompletedSubCaption\n: Qediya\n# ^UnComponentsSubCaption\n: Vebijrkn Rakirin\n# ^UnDirSubCaption\n: Peldanka Rakirin\n# ^ConfirmSubCaption\n: Erkirin\n# ^UninstallingSubCaption\n: T Rakirin\n# ^UnCompletedSubCaption\n: Qediya\n# ^BackBtn\n< &Vegere\n# ^NextBtn\n&Bidomne >\n# ^AgreeBtn\n&Ez Dipejirnim\n# ^AcceptBtn\nertn Peyman &Dipejirnim\n# ^DontAcceptBtn\nertn Peyman Napejirnim\n# ^InstallBtn\n&Saz Bike\n# ^UninstallBtn\n&Rake\n# ^CancelBtn\nBetal\n# ^CloseBtn\n&Bigire\n# ^BrowseBtn\n&avlgern...\n# ^ShowDetailsBtn\nHragahiyan &Nan Bide\n# ^ClickNext\nJi bo berdewam 'Bidomne'y bitikne.\n# ^ClickInstall\nJi bo destpka sazkirin 'Saz Bike'y bitikne.\n# ^ClickUninstall\nJi bo destpka rakirin 'Rake' bitikne.\n# ^Name\nnav\n# ^Completed\nQediya\n# ^LicenseText\nJi kerema xwe re ber tu bernameya $(^NameDA) saz bik, avek li peymana lsans bigerne. Heke tu hem ertn peyman dipejirn, 'Ez Dipejirnim' bitikne.\n# ^LicenseTextCB\nJi kerema xwe re ber tu bernameya $(^NameDA) saz bik, avek li peymana lsans bigerne. Heke tu hem ertan dipejirn, zeviya erkirin ya jrn dagire. $_CLICK\n# ^LicenseTextRB\nJi kerema xwe re ber tu bernameya $(^NameDA) saz bik avek li peymana lsans bigerne. Heke tu hem ertn peyman dipejirn, zeviya vebijrk ya jrn dagire. $_CLICK\n# ^UnLicenseText\nJi kerema xwe re ber tu bernameya $(^NameDA) rak, avek li peymana lsans bigerne. Heke tu hem ertn peyman dipejirn, 'Ez Dipejirnim' bitikn.\n# ^UnLicenseTextCB\nJi kerema xwe re ber tu bernameya $(^NameDA) ji pergala xwe rak, avek li peymana lsans bigerne. Heke tu hem ertn peyman dipejirn, zeviya jrn a erkirin dagire. $_CLICK\n# ^UnLicenseTextRB\nJi kerema xwe re ber tu bernameya $(^NameDA) ji pergala xwe rak, avek li peymana lsans bigerne. Heke tu hem ertn peyman dipejirn, zeviya vebijrk ya jrn dagire. $_CLICK\n# ^Custom\nTaybet\n# ^ComponentsText\nBen tu dixwaz saz bik hilbijre  niqirn 'check' ben tu naxwaz werin sazkirin rake. $_CLICK\n# ^ComponentsSubText1\nAway sazkirin hilbijre:\n# ^ComponentsSubText2_NoInstTypes\nBen d werin sazkirin hilbijre:\n# ^ComponentsSubText2\nan j, ben ben tu dixwaz werin sazkirin hilbijre:\n# ^UnComponentsText\nBen tu dixwaz rak hilbijre, an j niqira 'check'a ber ben tu daxwaz were rakirin, rake. $_CLICK\n# ^UnComponentsSubText1\nAway rakirin hilbijre:\n# ^UnComponentsSubText2_NoInstTypes\nBen d werin rakirin hilbijre:\n# ^UnComponentsSubText2\nan j ben tu dixwaz werin rakirin hilbijre:\n# ^DirText\n$(^NameDA) d ji aliy sazkirin ve li peldanka jrn were sazkirin. Ji bo tu li peldankeke din saz bik 'avlgern' bitikne  peldankeke din hilbijre. $_CLICK\n# ^DirSubText\nPeldanka Armanckir\n# ^DirBrowseText\nPeldanka tu dixwaz bernameya $(^NameDA) l were sazkirin hilbijre:\n# ^UnDirText\n$(^NameDA) d ji aliy sazkirin ve ji peldanka jrn were rakirin. Ji bo tu ji peldankeke cuda rak 'avlgern' bitikne  peldankeke din hilbijre. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nPeldanka tu dixwaz bernameya $(^NameDA) j were rakirin hilbijre:\n# ^SpaceAvailable\n\"Herma vala ku dikare were bikarann: \"\n# ^SpaceRequired\n\"Herma vala ya pwist: \"\n# ^UninstallingText\nBernameya $(^NameDA) d ji peldanka jrn were rakirin. $_CLICK\n# ^UninstallingSubText\nt rakirin:\n# ^FileError\nDosya ji bo nivsandin veneb: \\r\\n\\t\"$0\"\\r\\nJi bo destjberdana sazkirin abort' bitikne,\\r\\nji bo ceribandina ji n ve  retry' , an j\\r\\nji bo tu dosiy tune bihesibn  berdewam bik ignore'y bitikne\n# ^FileError_NoIgnore\nDosya ji bo nivsandin vebeneb: \\r\\n\\t\"$0\"\\r\\nJi bo nivsandina ji n ve retry'y, an j\\r\\nJi bo destjberdana sazkirin abort' hilbijre\n# ^CantWrite\n\"Nehate Nivsandin: \"\n# ^CopyFailed\newtiya Jibergirtin\n# ^CopyTo\n\"Ji Ber Bigire \"\n# ^Registering\n\"T Tomarkirin: \"\n# ^Unregistering\n\"Tomar T Jbirin: \"\n# ^SymbolNotFound\n\"Dawr Nehate Dtin: \"\n# ^CouldNotLoad\n\"Nehate Barkirin: \"\n# ^CreateFolder\n\"Peldank ke: \"\n# ^CreateShortcut\n\"Kineriy ke: \"\n# ^CreatedUninstaller\n\"Srbaz Rakirin Hate kirin: \"\n# ^Delete\n\"Dosyay J Bibe: \"\n# ^DeleteOnReboot\n\"Dema ji n ve dest p kir dosiy j bibe: \"\n# ^ErrorCreatingShortcut\n\"Dema kirina kineriy ewt derket: \"\n# ^ErrorCreating\n\"ewtiya kirin: \"\n# ^ErrorDecompressing\nDi dema vekirina daneyan de ewt derket! Sazkirina ewt?\n# ^ErrorRegistering\newtiya tomariya DLL\n# ^ExecShell\n\"Qalik Xebat: \"\n# ^Exec\n\"Bixebitne: \"\n# ^Extract\n\"Veke: \"\n# ^ErrorWriting\n\"Veke: Dema li dosiy hate nivsn ewtiyek derket \"\n# ^InvalidOpcode\nSazkirina Xirabe: koda nerast pkann\n# ^NoOLE\n\"OLE nehate dtin: \"\n# ^OutputFolder\n\"Peldanka derketin: \"\n# ^RemoveFolder\n\"Peldank j bibe: \"\n# ^RenameOnReboot\n\"Dema ji n hate destpkirin ji n ve bi nav bike: \"\n# ^Rename\n\"Nav Biguhere: \"\n# ^Skipped\n\"Hate gavkirin: \"\n# ^CopyDetails\nHragahiyan li Pano'y binivse\n# ^LogInstall\nPkanna sazkirin li lnska rew binivse\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Kurdish.nsh",
    "content": ";Language: Kurdish\n;By Rzan Tovjn\n;Updated by Erdal Ronah (erdal.ronahi@gmail.com)\n\n!insertmacro LANGFILE \"Kurdish\" \"Kurd\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"$(^NameDA) Tu bi xr hat srbaziya sazkirin\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Ev srbaz d di dema sazkirina $(^NameDA) de rberiya te bike.$\\r$\\n$\\r$\\nBer tu dest bi sazkirin bik, em pniyar dikin tu hem bernameyn vekir bigir. Bi v reng bey tu komputera ji n ve vek d hinek dosiyn pergal bpirsgirk werin sazkirin.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Tu bi xr hat srbaziya rakirina bernameya $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Ev srbaz ji bo rakirina bernameya $(^NameDA) d alkariya te bike.$\\r$\\n$\\r$\\nBer tu dest bi rakirina bernamey bik, bernameyn vekir hemyan bigire. Bi v reng d re tu mecbr namn ku komputera xwe bigir  ji n ve veki.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Peymana Lsans\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Ji kerema xwe re ber tu bernameya $(^NameDA) saz bik, peymana lsans bixwne.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Heke tu ertn peyman dipejirn, 'Ez Dipejirnim' bitikne. Ji bo sazkirina bernameya $(^NameDA) div tu ertn peyman bipejirn.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Heke tu ertn peyman dipejirn, zeviya pitrastkirin ya jrn dagire. Ji bo tu bikar bernameya $(^NameDA) saz bik div tu ertn peyman bipejirn. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Heke tu ertn peyman dipejirn, bikojka erkirin ya jrn bitikne. Ji bo sazkirina bernameya $(^NameDA) div tu ertn peyman bipejirn. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Peymana Lsans\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Ber tu bernameya $(^NameDA) ji pergala xwe rak peyman bixwne.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Heke tu ertn peyman dipejirn, 'Dipejirnim' bitikne. Ji bo rakirina bernameya  $(^NameDA) div tu ertn peyman bipejirn.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Heke tu ertn peyman dipejirn, zeviya erkirin ya jrn dagire. Ji bo tu bernameya $(^NameDA) ji pergala xwe rak div tu peyman bipejirn. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Heke tu ertn peyman dipejirn, bikojka erkirin ya jrn hilbijre. Ji bo tu bernameya  $(^NameDA) ji pergala xwe rak div tu ertn peyman bipejirn. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Ji bo dmahka peyman bikojka 'page down' bitikne.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Hilbijartina pareyan\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Ji bo sazkirina $(^NameDA) pareyn tu dixwaz hilbijre.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Hilbijartina Pareyan\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Pareya bernameya $(^NameDA) ku tu dixwaz rak hilbijre.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Dazann\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Ji bo tu der bar pareyan de agahiyan bistn nanek bibe ser pareyek.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Ji bo tu der bar pareyan de agahiyan bistn nanek bibe ser pareyek.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Hilbijartina peldanka armanckir\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Peldanka tu dixwaz bernameya $(^NameDA) t de were sazkirin hilbijre.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Hilbijartina Peldanka D Were Rakirin\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Peldanka bernameya $(^NameDA) ku tudixwaz rak hilbijre.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"T sazkirin\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Ji kerema xwe re heta sazkirina $(^NameDA) biqede raweste.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Sazkirin Qediya\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Sazkirin bi serkeftin qediya.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Sazkirin hate betalkirin\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Sazkirin be tevah qediya.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"T rakirin\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Heta bernameya $(^NameDA) ji pergala te were rakirin raweste.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Rakirina Bernamey Biqedne\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Rakirina bernamey bi serkeftin pk hat.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Rakirina bernamey hate betalkirin\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Rakirina bernamey neqediya.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Srbaziya sazkirina $(^NameDA) diqede.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) li komputera te hate barkirin.$\\r$\\n$\\r$\\n'Biqedne'y bitikne  sazkirin bi daw bne.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Ji bo bidawkirina sazkirina $(^NameDA) div tu komputer ji n ve vek.Tu dixwaz komputer ji n ve vek?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Srbaziya Rakirina Bernameya $(^NameDA) T Temamkirin\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"Bernameya $(^NameDA) ji pergale hate rakirin.$\\r$\\n$\\r$\\nJi bo girtina srbaz 'biqedne'y bitikne.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Ji bo rakirina bernameya $(^NameDA) biqede div tu komputera xwe ji n ve vek. Tu dixwaz niha komputera te were girtin  ji n ve dest p bike?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Ji n ve veke\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Ez pa ji n ve vekim.\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"Bernameya $(^NameDA) bixebitne\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Dosiya min bixwne/readme &nan bide\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Biqedne\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Hilbijartina Peldanka Peka Destpk\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Peldanka peka destpk ya ku d kineriya $(^NameDA) t de were bikarann hilbijre.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Peldanka peka destpk ya ku d kineriya bernamey t de were bicihkirin hilbijre.  Tu dikar bi navek n peldankeke n ava bik.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"By kirina kineriy bidomne\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Bernameya $(^NameDA) Rake\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Rakirina bernameya $(^NameDA) ji pergala te.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Tu bawer  ku dixwaz ji sazkirina $(^Name) derkev?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Tu bawer  ku dixwaz dest ji rakirina bernameya $(^Name) berd?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Latvian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1062\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1257\n# RTL - anything else than RTL means LTR\n-\n# Translation by Valdis Griis (valmiera-9@inbox.lv)\n# Corrections by Kristaps Meelis / x-f (x-f 'AT' inbox.lv)\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n'$(^Name)' Uzstdana\n# ^UninstallCaption\n'$(^Name)' Atinstalana\n# ^LicenseSubCaption\n: Licences lgums\n# ^ComponentsSubCaption\n: Uzstdanas opcijas\n# ^DirSubCaption\n: Uzstdanas mape\n# ^InstallingSubCaption\n: Notiek uzstdana\n# ^CompletedSubCaption\n: Uzstdana pabeigta.\n# ^UnComponentsSubCaption\n: Atinstalanas opcijas\n# ^UnDirSubCaption\n: Atinstalanas mape\n# ^ConfirmSubCaption\n: Apstiprinana\n# ^UninstallingSubCaption\n: Notiek atinstalana\n# ^UnCompletedSubCaption\n: Atinstalana pabeigta\n# ^BackBtn\n< &Atpaka\n# ^NextBtn\n&Tlk >\n# ^AgreeBtn\nEs &piekrtu\n# ^AcceptBtn\nEs &piekrtu licences lguma noteikumiem\n# ^DontAcceptBtn\nEs &nepiekrtu licences lguma noteikumiem\n# ^InstallBtn\n&Uzstdt\n# ^UninstallBtn\n&Atinstalt\n# ^CancelBtn\nAtcelt\n# ^CloseBtn\nAi&zvrt\n# ^BrowseBtn\nP&rlkot...\n# ^ShowDetailsBtn\nPardt &detaas\n# ^ClickNext\nSpiediet 'Tlk', lai turpintu.\n# ^ClickInstall\nSpiediet 'Uzstdt', lai sktu uzstdanas procesu.\n# ^ClickUninstall\nSpiediet 'Atinstalt', lai sktu atinstalanas procesu.\n# ^Name\nVrds\n# ^Completed\nUzstdana pabeigta\n# ^LicenseText\nLdzu izlasiet licences lgumu pirms '$(^NameDA)' uzstdanas. Ja piekrtat licences lguma noteikumiem, tad spiediet 'Es piekrtu'.\n# ^LicenseTextCB\nLdzu izlasiet licences lgumu pirms '$(^NameDA)' uzstdanas. Ja piekrtat licences lguma noteikumiem, tad atzmjiet izvles rtiu. $_CLICK\n# ^LicenseTextRB\nLdzu izlasiet licences lgumu pirms '$(^NameDA)' uzstdanas. Ja piekrtat licences lguma noteikumiem, tad izvlieties pirmo zemkesoo opciju. $_CLICK\n# ^UnLicenseText\nLdzu izlasiet licences lgumu pirms '$(^NameDA)' atinstalanas. Ja piekrtat licences lguma noteikumiem, tad spiediet 'Es piekrtu'.\n# ^UnLicenseTextCB\nLdzu izlasiet licences lgumu pirms '$(^NameDA)' atinstalanas. Ja piekrtat licences lguma noteikumiem, tad atzmjiet izvles rtiu. $_CLICK\n# ^UnLicenseTextRB\nLdzu izlasiet licences lgumu pirms '$(^NameDA)' atinstalanas. Ja piekrtat licences lguma noteikumiem, tad izvlieties zemkesoo opciju. $_CLICK\n# ^Custom\nPielgots\n# ^ComponentsText\nIzvlieties, kurus komponentus vlaties uzstdt un neiezmjiet tos, kurus nevlaties uzstdt. $_CLICK\n# ^ComponentsSubText1\nIzvlieties uzstdanas veidu:\n# ^ComponentsSubText2_NoInstTypes\nIzvlieties uzstdmos komponentus:\n# ^ComponentsSubText2\nVai ar  izvlieties tikai nepiecieamos komponentus, kurus vlaties uzstdt:\n# ^UnComponentsText\nIzvlieties, kurus komponentus atinstalt un neiezmjiet tos, kurus nevlaties atinstalt. $_CLICK\n# ^UnComponentsSubText1\nIzvlieties atinstalanas veidu:\n# ^UnComponentsSubText2_NoInstTypes\nIzvlieties atinstaljamos komponentus:\n# ^UnComponentsSubText2\nVai ar  izvlieties tikai nepiecieamos komponentus, kurus vlaties atinstalt:\n# ^DirText\n'$(^NameDA)' tiks uzstdta aj map. Lai to uzstdtu cit map, nospiediet 'Prlkot' un izvlieties citu mapi. $_CLICK\n# ^DirSubText\nUzstdanas mape\n# ^DirBrowseText\nIzvlieties mapi, kur uzstdt '$(^NameDA)':\n# ^UnDirText\n'$(^NameDA)' tiks atinstalta no s mapes. Lai to atinstaltu no citas mapes, nospiediet 'Prlkot' un izvlieties citu mapi. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nIzvlieties mapi, no kuras atinstalt '$(^NameDA)':\n# ^SpaceAvailable\n\"Pieejamais diska apjoms: \"\n# ^SpaceRequired\n\"Nepiecieamais diska apjoms: \"\n# ^UninstallingText\n'$(^NameDA)' tiks atinstalta no s mapes. $_CLICK\n# ^UninstallingSubText\nAtinstalana no:\n# ^FileError\nKda atverot failu rakstanai: \\r\\n\\t\"$0\"\\r\\nNospiediet 'Atcelt', lai atceltu uzstdanas procesu,\\r\\n'Mint vlreiz', lai atkrtoti mintu rakstt fail vai\\r\\n'Ignort', lai izlaistu  faila uzstdanu\n# ^FileError_NoIgnore\nKda atverot failu rakstanai: \\r\\n\\t\"$0\"\\r\\nNospiediet 'Atcelt', lai prtrauktu uzstdanas procesu\n# ^CantWrite\n\"Nevar ierakstt: \"\n# ^CopyFailed\nKopana neizdevs\n# ^CopyTo\n\"Kop uz \"\n# ^Registering\n\"Reistr: \"\n# ^Unregistering\n\"Atreistr: \"\n# ^SymbolNotFound\n\"Simbols nav atrasts: \"\n# ^CouldNotLoad\n\"Nav iespjams ieldt: \"\n# ^CreateFolder\n\"Izveido mapi: \"\n# ^CreateShortcut\n\"Izveido sasni: \"\n# ^CreatedUninstaller\n\"Izveidots atinstaltjs: \"\n# ^Delete\n\"Dz failu: \"\n# ^DeleteOnReboot\n\"Dzst pc prstartanas: \"\n# ^ErrorCreatingShortcut\n\"Kda veidojot sasni: \"\n# ^ErrorCreating\n\"Kda veidojot: \"\n# ^ErrorDecompressing\nKda atkompresjot datus! Bojta instalcija?\n# ^ErrorRegistering\nKda reistrjot DLL failu\n# ^ExecShell\n\"Izpilda aul: \"\n# ^Exec\n\"Izpilda: \"\n# ^Extract\n\"Atspie: \"\n# ^ErrorWriting\n\"Atspieana: kda rakstot fail \"\n# ^InvalidOpcode\nInstalcija bojta: nedergs CRC kods\n# ^NoOLE\n\"Nav OLE priek: \"\n# ^OutputFolder\n\"Izvades mape: \"\n# ^RemoveFolder\n\"Dz mapi: \"\n# ^RenameOnReboot\n\"Prsaukt pc prstartanas: \"\n# ^Rename\n\"Prsaukt: \"\n# ^Skipped\n\"Izlaists: \"\n# ^CopyDetails\nIekopt detaas starpliktuv\n# ^LogInstall\nIerakstt urnla fail uzstdanas procesu\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Latvian.nsh",
    "content": ";Language: Latvieu [Latvian] - (1062)\n;By Valdis Griis\n;Corrections by Kristaps Meelis / x-f (x-f 'AT' inbox.lv)\n\n!insertmacro LANGFILE \"Latvian\" \"Latvieu\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Esiet sveicinti '$(^NameDA)' uzstdanas vedn\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"is uzstdanas vednis jums paldzs veikt '$(^NameDA)' uzstdanu.$\\r$\\n$\\r$\\noti ieteicams aizvrt citas programmas pirms s programmas uzstdanas veikanas. Tas aus atjaunot svargus sistmas failus bez datora prstartanas.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Esiet sveicinti '$(^NameDA)' atinstalanas vedn\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"is vednis jums paldzs veikt '$(^NameDA)' atinstalanu.$\\r$\\n$\\r$\\nPirms skt atinstalanas procesu, prliecinieties, vai '$(^NameDA)' palaik nedarbojas.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Licences lgums\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Ldzu izlasiet licences lgumu pirms '$(^NameDA)' uzstdanas.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Ja piekrtat licences lguma noteikumiem, spiediet 'Piekrtu', lai turpintu uzstdanu. Jums ir jpiekrt licences noteikumiem, lai uzstdtu '$(^NameDA)'.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Ja piekrtat licences lguma noteikumiem, tad atzmjiet izvles rtiu. Jums ir jpiekrt licences noteikumiem, lai uzstdtu '$(^NameDA)'. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Ja piekrtat licences lguma noteikumiem, tad izvlieties pirmo zemkesoo opciju. Jums ir jpiekrt licences noteikumiem, lai uzstdtu '$(^NameDA)'. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Licences lgums\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Ldzu izlasiet licences lgumu pirms '$(^NameDA)' atinstalanas.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Ja piekrtat licences noteikumiem, spiediet 'Piekrtu', lai turpintu. Jums ir jpiekrt licences noteikumiem, lai atinstaltu '$(^NameDA)'.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Ja piekrtat licences lguma noteikumiem, tad iezmjiet izvles rtiu. Jums ir jpiekrt licences noteikumiem, lai atinstaltu '$(^NameDA)'. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Ja piekrtat licences lguma noteikumiem, tad izvlieties pirmo zemkesoo opciju. Jums ir jpiekrt licences noteikumiem, lai atinstaltu '$(^NameDA)'. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Spiediet 'Page Down', lai aplkotu visu lgumu.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Izvlieties komponentus\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Izvlieties nepiecieams '$(^NameDA)' sastvdaas, kuras uzstdt.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Izvlieties komponentus\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Izvlieties nepiecieams '$(^NameDA)' sastvdaas, kuras atinstalt.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Apraksts\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Novietojiet peles kursoru uz komponenta, lai tiktu pardts t apraksts.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Novietojiet peles kursoru uz komponenta, lai tiktu pardts t apraksts.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Izvlieties uzstdanas mapi\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Izvlieties mapi, kur uzstdt '$(^NameDA)'.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Izvlieties atinstalanas mapi\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Izvlieties mapi, no kuras notiks '$(^NameDA)' atinstalana.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Notiek uzstdana\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Ldzu uzgaidiet, kamr notiek '$(^NameDA)' uzstdana.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Uzstdana pabeigta\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Uzstdana noritja veiksmgi.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Uzstdana atcelta\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Uzstdana nenoritja veiksmgi.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Notiek atinstalana\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Ldzu uzgaidiet, kamr '$(^NameDA)' tiek atinstalta.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Atinstalana pabeigta\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Atinstalana noritja veiksmgi.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Atinstalana atcelta\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Atinstalana nenoritja veiksmgi.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Tiek pabeigta '$(^NameDA)' uzstdana\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"'$(^NameDA)' tika veiksmgi uzstdta jsu dator.$\\r$\\n$\\r$\\nNospiediet 'Pabeigt', lai aizvrtu vedni.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Jsu datoru ir nepiecieams prstartt, lai pabeigtu '$(^NameDA)' uzstdanu. Vai vlaties prstartt datoru tlt?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Tiek pabeigta '$(^NameDA)' atinstalcija\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"'$(^NameDA)' tika veiksmgi izdzsta no jsu datora.$\\r$\\n$\\r$\\nNospiediet 'Pabeigt', lai aizvrtu vedni.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Jsu datoru nepiecieams prstartt, lai pabeigtu '$(^NameDA)' atinstalanu. Vai vlaties prstartt datoru tlt?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Prstartt tlt\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Es vlos prstartt pats vlk\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"P&alaist '$(^NameDA)'\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Pa&rdt LasiMani failu\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Pabeigt\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Izvlieties 'Start Menu' folderi\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Izvlieties 'Start Menu' mapi '$(^NameDA)' sasnm.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Izvlieties 'Start Menu' mapi, kur tiks izveidotas programmas sasnes. Varat ar pats izveidot jaunu mapi.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Neveidot sasnes\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"'$(^NameDA)' atinstalana\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Dzst '$(^NameDA)' no jsu datora.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Vai tiem vlaties prtraukt '$(^Name)' uzstdanu?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Vai tiem vlaties prtraukt '$(^Name)' atinstalanu?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Lithuanian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1063\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1257\n# RTL - anything else than RTL means LTR\n-\n# Translation by Vytautas Krivickas (Vytautas)\n# Updated by Danielius Scepanskis (Daan daniel@takas.lt) 2004.03.24\n# ^Branding\nNullsoft instaliavimo sistema %s\n# ^SetupCaption\n$(^Name) diegimas\n# ^UninstallCaption\n$(^Name) alinti\n# ^LicenseSubCaption\n: Naudojimo sutartis\n# ^ComponentsSubCaption\n: diegimo nustatymai\n# ^DirSubCaption\n: diegimo katalogas\n# ^InstallingSubCaption\n: diegiama\n# ^CompletedSubCaption\n: Baigta\n# ^UnComponentsSubCaption\n: Itrinimo nustatymai\n# ^UnDirSubCaption\n: Itrinimo katalogas\n# ^ConfirmSubCaption\n: Patvirtinimas\n# ^UninstallingSubCaption\n: Panaikinama\n# ^UnCompletedSubCaption\n: Baigta\n# ^BackBtn\n< &Atgal\n# ^NextBtn\n&Toliau >\n# ^AgreeBtn\nA &sutinku\n# ^AcceptBtn\nA &sutinku su naudojimo sutarties slygomis\n# ^DontAcceptBtn\nA &nesutinku su naudojimo sutarties slygomis\n# ^InstallBtn\n&diegti\n# ^UninstallBtn\n&Panaikinti\n# ^CancelBtn\nNutraukti\n# ^CloseBtn\n&Udaryti\n# ^BrowseBtn\nP&asirinkti...\n# ^ShowDetailsBtn\nParodyti &detales\n# ^ClickNext\nPaspauskite toliau\n# ^ClickInstall\nPaspauskite diegti\n# ^ClickUninstall\nPaspauskite itrinti\n# ^Name\nVardas\n# ^Completed\nBaigta\n# ^LicenseText\nPraome perskaityti sutart prie diegdami $(^NameDA). Jei js sutinkate su nurodytomis slygomis, spauskite Sutinku.\n# ^LicenseTextCB\nPraome perskaityti sutart prie diegdami $(^NameDA). Jei js sutinkate su nurodytomis slygomis, padkite varnel tam skirtame laukelyje. $_CLICK\n# ^LicenseTextRB\nPraome perskaityti sutart prie diegdami $(^NameDA). Jei js sutinkate su nurodytomis slygomis, pasirinkite pirm pasirinkim esant emiau. $_CLICK\n# ^UnLicenseText\nPraome perskaityti sutart prie itrinant $(^NameDA). Jei js sutinkate su nurodytomis slygomis, spauskite Sutinku.\n# ^UnLicenseTextCB\nPraome perskaityti sutart prie itrinant $(^NameDA). Jei js sutinkate su nurodytomis slygomis, padkite varnel tam skirtame laukelyje. $_CLICK\n# ^UnLicenseTextRB\nPraome perskaityti sutart prie itrinant $(^NameDA). Jei js sutinkate su nurodytomis slygomis, pasirinkite pirm pasirinkim esant emiau.  $_CLICK\n# ^Custom\nKitoks\n# ^ComponentsText\nPadkite varneles laukeliuose komponent kuriuos norite diegti ir nuimkite nuo kuri nenorite diegti. $_CLICK\n# ^ComponentsSubText1\nPasirinkite diegimo bd:\n# ^ComponentsSubText2_NoInstTypes\nPasirinkite komponentus, kuriuos diegti:\n# ^ComponentsSubText2\nArba, pasirinkite neprivalomus komponentus, kuriuos js norite diegti:\n# ^UnComponentsText\nPadkite varneles laukeliuose komponent kuriuos norite paalinti ir nuimkite nuo kuri nenorite paalinti. $_CLICK\n# ^UnComponentsSubText1\nPasirinkite alinimo bd:\n# ^UnComponentsSubText2_NoInstTypes\nPasirinkite komponentus, kuriuos alinti:\n# ^UnComponentsSubText2\nArba, pasirinkite neprivalomus komponentus, kuriuos js norite paalinti:\n# ^DirText\ndiegimas dabar diegs $(^NameDA) iame kataloge. Jeigu norite pakeisti  katalog, paspauskite Pasirinkti. $_CLICK\n# ^DirSubText\ndiegimo katalogas\n# ^DirBrowseText\nPasirinkite katalog, kur diegti $(^NameDA):\n# ^UnDirText\ndiegimas dabar paalins $(^NameDA) i io katalogo. Jeigu norite pakeisti  katalog paspauskite Pasirinkti. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nPasirinkite katalog i kurio paalinti $(^NameDA):\n# ^SpaceAvailable\nYra vietos: \n# ^SpaceRequired\nReikia vietos: \n# ^UninstallingText\n$(^NameDA) dabar bus paalintas i io katalogo. $_CLICK\n# ^UninstallingSubText\nTrinama i:\n# ^FileError\nKlaida atidarant fail raymui: \\r\\n\\t\"$0\"\\r\\nPaspauskite Nutraukti, jei norite nutraukti diegim,\\r\\nPakartoti, jei norite pabandyti dar kart rayti fail, ar\\r\\nIgnoruoti, jei norite praleisti  fail\n# ^FileError_NoIgnore\nKlaida atidarant fail raymui: \\r\\n\\t\"$0\"\\r\\nPaspauskite Pakartoti, jei norite pabandyti dar kart rayti fail, ar\\r\\nNutraukti, jei norite nutraukti diegim.\n# ^CantWrite\n\"Negalima rayti: \"\n# ^CopyFailed\nKopijavimas nepavyko\n# ^CopyTo\nKopijuoti  \n# ^Registering\n\"Uregistruojama: \"\n# ^Unregistering\n\"Iregistruojama: \"\n# ^SymbolNotFound\nNerastas simbolis: \n# ^CouldNotLoad\nNegaliu krauti: \n# ^CreateFolder\nSukurti katalog: \n# ^CreateShortcut\nSukurti nuorod: \n# ^CreatedUninstaller\nSukurti panaikinimo program:\n# ^Delete\nItrinti fail: \n# ^DeleteOnReboot\n\"Itrinti perkraunant: \"\n# ^ErrorCreatingShortcut\n\"Klaida kuriant nuorod: \"\n# ^ErrorCreating\n\"Klaida kuriant: \"\n# ^ErrorDecompressing\nKlaida iskleidiant duomenis! Sugadintas diegimo failas?\n# ^ErrorRegistering\nKlaida uregistruojant DLL\n# ^ExecShell\n\"VykdytiShell: \"\n# ^Exec\n\"Vykdyti: \"\n# ^Extract\n\"Iskleisti: \"\n# ^ErrorWriting\nIskleisti: klaida raant  fail\n# ^InvalidOpcode\ndiegimo failas sugadintas: neteisingas opkodas\n# ^NoOLE\n\"Nra OLE dl: \"\n# ^OutputFolder\n\"Paskirties katalogas: \"\n# ^RemoveFolder\n\"Panaikinti katalog: \"\n# ^RenameOnReboot\n\"Pervardinti perkraunant: \"\n# ^Rename\n\"Pervardinti: \"\n# ^Skipped\n\"Praleista: \"\n# ^CopyDetails\nKopijuoti detales  atmint\n# ^LogInstall\nrayti diegimo detales\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Lithuanian.nsh",
    "content": ";Language: Lithuanian (1063)\n;By Vytautas Krivickas (Vytautas). Updated by Danielius Scepanskis (Daan daniel@takas.lt) 2004.01.09\n\n!insertmacro LANGFILE \"Lithuanian\" \"Lietuviu\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Sveiki atvyk  $(^NameDA) diegimo program.\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"i programa jums pads lengvai diegti $(^NameDA).$\\r$\\n$\\r$\\nRekomenduojama ijungti visas programas, prie pradedant diegim. Tai leis atnaujinti sistemos failus neperkraunat kompiuterio.$\\r$\\n$\\r$\\n\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Sveiki atvyk  $(^NameDA) paalinimo program.\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"i programa jums pads lengvai itrinti $(^NameDA).$\\r$\\n$\\r$\\nPrie pradedant pasitikrinkite kad $(^NameDA) yra ijungta.$\\r$\\n$\\r$\\n\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Naudojimo sutartis\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Praome perskaityti sutart prie diegdami $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Jei js sutinkate su nurodytomis slygomis, spauskite Sutinku. Js privalote sutikti, jei norite diegti $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Jei js sutinkate su nurodytomis slygomis, padkite varnel tam skirtame laukelyje. Js privalote sutikti, jei norite diegti $(^NameDA). \"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Jei js sutinkate su nurodytomis slygomis, pasirinkite pirm pasirinkim esant emiau. Js privalote sutikti, jei norite diegti $(^NameDA). \"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Naudojimo sutartis\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Praome perskaityti sutart prie $(^NameDA) paalinim.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Jei js sutinkate su nurodytomis slygomis, spauskite Sutinku. Js privalote sutikti, jei norite itrinti $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"s, padkite varnel tam skirtame laukelyje. Js privalote sutikti, jei norite itrinti $(^NameDA). \"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Jei js sutinkate su nurodytomis slygomis, pasirinkite pirm pasirinkim esant emiau. Js privalote sutikti, jei norite itrinti $(^NameDA).\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Paspauskite Page Down ir perskaitykite vis sutart.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Pasirinkite\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Pasirinkite kokias $(^NameDA) galimybes js norite diegti.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Pasirinkite\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Pasirinkite kokias $(^NameDA) galimybes js norite paalinti.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Paaikinimas\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Uveskite pels ymekl ant komponento ir pamatysite jo apraym.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Uveskite pels ymekl ant komponento ir pamatysite jo apraym.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Pasirinkite diegimo viet\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Pasirinkite katalog  kri diegsite $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Pasirinkite itrinimo viet\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Pasirinkite katalog i kurio itrinsite $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Diegiama\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Praome palaukti, kol $(^NameDA) bus diegtas.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"diegimas baigtas\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"diegimas baigtas sekmingai.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"diegimas nutrauktas\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"diegimas nebuvo baigtas sekmingai.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"alinama\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Praome palaukti, kol $(^NameDA) bus paalinta.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Programos paalinimas baigtas\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Itrynimas baigtas sekmingai.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Itrynimas nutrauktas\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Itrynimas nebuvo baigtas sekmingai.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Baigiu $(^NameDA) diegimo proces\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) buvo diegtas  js kompiuter.$\\r$\\n$\\r$\\nPaspauskite Baigti.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Js kompiuteris turi bti perkrautas, kad bt baigtas $(^NameDA) diegimas. Ar js norite perkrauti dabar?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Baigiu $(^NameDA) paalinimo program.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) buvo itrinta i js kompiuterio.$\\r$\\n$\\r$\\nPaspauskite Baigti.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Js kompiuteris turi bti perkrautas, kad bt baigtas $(^NameDA) paalinimas. Ar js norite perkrauti dabar?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Perkrauti dabar\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"A noriu perkrauti veliau pats\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Leisti $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Parodyti dokumentacij\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Baigti\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Pasirinkite Start Menu katalog\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Pasirinkite Start Menu katalog, kuriame bus sukurtos programos nuorodos.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Pasirinkite Start Menu katalog, kuriame bus sukurtos programos nuorodos. Js taip pat galite sukurti nauj katalog.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Nekurti nuorod\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Panaikinti $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Itrinti $(^NameDA) i js kompiuterio.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Ar js tikrai norite ijungti $(^Name) diegimo program?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Ar js tikrai norite ijungti $(^Name) paalinimo program?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Luxembourgish.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n4103\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Jo Hoeser\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) Installatioun\n# ^UninstallCaption\n$(^Name) Desinstallatioun\n# ^LicenseSubCaption\n: Lizenzofkommes\n# ^ComponentsSubCaption\n: Installatiouns-Optiounen\n# ^DirSubCaption\n: Zielverzeechnis\n# ^InstallingSubCaption\n: Installieren\n# ^CompletedSubCaption\n: Frdeg\n# ^UnComponentsSubCaption\n: Desinstallatiuons-Optiounen\n# ^UnDirSubCaption\n: Quellverzeechnes\n# ^ConfirmSubCaption\n: Besttegung\n# ^UninstallingSubCaption\n: Lschen\n# ^UnCompletedSubCaption\n: Frdeg\n# ^BackBtn\n< &Zrck\n# ^NextBtn\n&Weider >\n# ^AgreeBtn\n&Unhuelen\n# ^AcceptBtn\nEch &huelen d'Lizenzofkommes un.\n# ^DontAcceptBtn\nEch &lehnen d'Lizenzofkommes of.\n# ^InstallBtn\n&Installieren\n# ^UninstallBtn\n&Desinstallieren\n# ^CancelBtn\nOfbriechen\n# ^CloseBtn\n&Zou maan\n# ^BrowseBtn\n&Duerchsichen...\n# ^ShowDetailsBtn\n&Details uweisen\n# ^ClickNext\nKlick op weider fir weiderzefueren\n# ^ClickInstall\nKlick op Installieren, fir d'Installatioun unzefnken.\n# ^ClickUninstall\nKlick op Desinstallieren, fir d'Desinstallatioun unzefnken.\n# ^Name\nNumm\n# ^Completed\nFrdeg\n# ^LicenseText\nW.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) installiers. Wanns de all Bedengungen vum Ofkommes akzeptiers, klick op Unhuelen.\n# ^LicenseTextCB\nW.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) installiers. Wanns de all Bedengungen vum Ofkommes akzeptiers, aktivier d'Kontrollkeschtchen. $_CLICK\n# ^LicenseTextRB\nW.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) installiers. Wanns de all Bedengungen vum Ofkommes akzeptiers, wiel d'entsprichend Optioun. $_CLICK\n# ^UnLicenseText\nW.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) desinstalliers. Wanns de all Bedengungen vum Ofkommes akzeptiers, klick op Unhuelen.\n# ^UnLicenseTextCB\nW.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) desinstalliers. Wanns de all Bedengungen vum Ofkommes akzeptiers, aktivier d'Kontrollkeschtchen. $_CLICK\n# ^UnLicenseTextRB\nW.e.g. d'Lizenzoofkommes liesen, ierts de $(^NameDA) desinstalliers. Wanns de all Bedengungen vum Oofkommes akzeptiers, wiel d'entspriechend Optioun. $_CLICK\n# ^Custom\nBenutzerdefiniert\n# ^ComponentsText\nWiel d'Komponenten aus, dis de wlls installieren an wiel dijineg of, dis de net installieren wlls. $_CLICK\n# ^ComponentsSubText1\nInstallatiouns-Typ bestmmen:\n# ^ComponentsSubText2_NoInstTypes\nWiel d'Komponenten aus, dis de installieren wlls:\n# ^ComponentsSubText2\noder wiel zoustzlech Komponenten aus dis de installieren wlls:\n# ^UnComponentsText\nWiel d'Komponenten aus dis de desinstallieren wlls an wiel dijineg of, dis de net desinstallieren wlls. $_CLICK\n# ^UnComponentsSubText1\nDeinstallatiouns-Typ bestmmen:\n# ^UnComponentsSubText2_NoInstTypes\nWiel d'Komponenten aus, dis de desinstallieren wlls:\n# ^UnComponentsSubText2\noder wiel zustzlech Komponenten aus, dis de desinstallieren wlls:\n# ^DirText\n$(^NameDA) gtt an den Dossier installiert deen fierginn gouf. Wanns de et an een aneren Dossier installieren wlls, klick op Duechsichen an wiel een aneren Dossier aus. $_CLICK\n# ^DirSubText\nZielverzeechnes\n# ^DirBrowseText\nWiel en Dossier aus wuers de $(^NameDA) installieren wlls:\n# ^UnDirText\n$(^NameDA) gtt an deem Dossier desinstalliert, deen uginn gouf. Wann $(^NameDA) an engem aneren Dossier ass, klick op Duechsichen an wiel een aneren Dossier aus. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nWiel den Dossier aus wou $(^NameDA) dran installiert ass:\n# ^SpaceAvailable\n\"Verfgbaren Spicher: \"\n# ^SpaceRequired\n\"Gebrauchten Spicher: \"\n# ^UninstallingText\n$(^NameDA) gtt aus dem ausgewielten Dossier desinstalliert. $_CLICK\n# ^UninstallingSubText\nDesinstallieren aus:\n# ^FileError\nFehler beim Iwwerschreiwen vun der Datei: \\r\\n\\t\"$0\"\\r\\nKlick op ofbriechen fir den Setup ze verloossen,\\r\\nop Widderhuelen fir den Setup nach eng Kier duechzefieren\\r\\n oder op Ignorieren fir des Datei ze iwwersprengen an weiderzefueren.\n# ^FileError_NoIgnore\nFehler beim Iwwerschreiwen vun der Datei: \\r\\n\\t\"$0\"\\r\\nKlick op Widderhuelen fir den Setup nach eng Kier duechzefieren,\\r\\noder op ofbriechen fir den Setup ze verloossen.\n# ^CantWrite\n\"Fehler beim Schreiwen: \"\n# ^CopyFailed\nKopieren fehlgeschloen\n# ^CopyTo\n\"Kopiere an \"\n# ^Registering\n\"Registrieren: \"\n# ^Unregistering\n\"Deregistrieren: \"\n# ^SymbolNotFound\n\"Symbol ass net do: \"\n# ^CouldNotLoad\n\"Fehler beim Lueden vun: \"\n# ^CreateFolder\n\"Maan Dossier: \"\n# ^CreateShortcut\n\"Maan Oofkierzung: \"\n# ^CreatedUninstaller\n\"Man Desinstallatiouns-Programm: \"\n# ^Delete\n\"Lschen Datei: \"\n# ^DeleteOnReboot\n\"Lschen Datei no engem Neistart: \"\n# ^ErrorCreatingShortcut\n\"Fehler beim man vun enger Oofkierzung: \"\n# ^ErrorCreating\n\"Fehler beim maan: \"\n# ^ErrorDecompressing\nFehler beim Dekomprimieren. Installations-Programm beschiedegt?\n# ^ErrorRegistering\nFehler beim Registrieren vun der DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Starten: \"\n# ^Extract\n\"Dekomprimieren: \"\n# ^ErrorWriting\n\"Dekomprimierung: Fehler beim Schreiwen vun der Datei \"\n# ^InvalidOpcode\nInstallations-Programm Beschiedegt: net zoulssegen Befehlscode\n# ^NoOLE\n\"Keen OLE fier: \"\n# ^OutputFolder\n\"Zieldossier: \"\n# ^RemoveFolder\n\"Lschen Dossier: \"\n# ^RenameOnReboot\n\"Gett no Neistart embenannt: \"\n# ^Rename\n\"Embenennen: \"\n# ^Skipped\n\"Iwwersprongen: \"\n# ^CopyDetails\nDetailler an d'Zwschenooflag kopieren\n# ^LogInstall\nInstallatioun protokollieren\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Luxembourgish.nsh",
    "content": ";Language: Luxembourgish (1031)\n;By Snowloard, changes by Philo\n\n!insertmacro LANGFILE \"Luxembourgish\" \"Ltzebuergesch\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Wllkomm beim Installatiouns-$\\r$\\nAssistent vun $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Dsen Assistent wrt dech duech d'Installatioun vun $(^NameDA) begleeden.$\\r$\\n$\\r$\\nEt gtt ugeroden alleguer d'Programmer di am Moment lafen zouzemaan, datt bestmmt Systemdateien ouni Neistart ersat knne ginn.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Wllkomm am Desinstallatiouns-$\\r$\\n\\Assistent fir $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Desen Assistent begleet dech duech d'Desinstallatioun vun $(^NameDA).$\\r$\\n$\\r$\\nW.e.g. maach $(^NameDA) zu, ierts de mat der Desinstallatioun ufnks.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Lizenzofkommes\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"W.e.g. d'Lizenzoofkommes liesen, ierts de mat der Installatioun weiderfiers.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Wanns de alleguer d'Bedengungen vum Ofkommes akzeptiers, klick op Unhuelen. Du muss alleguer d'Fuerderungen unerkennen, fir $(^NameDA) installieren ze knnen.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Wanns de alleguer d'Bedengungen vum Ofkommes akzeptiers, aktivier d'Kschtchen. Du muss alleguer d'Fuerderungen unerkennen, fir $(^NameDA) installieren ze knnen. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Wanns de alleguer d'Bedengungen vum Ofkommes akzeptiers, wiel nnen di entspriechend ntwert aus. Du muss alleguer d'Fuerderungen unerkennen, fir $(^NameDA) installieren ze knnen. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Lizenzofkommes\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"W.e.g. lies d'Lizenzofkommes duech ierts de mat der Desinstallatioun vun $(^NameDA) weiderfiers.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Wanns de d'Fuerderungen vum Ofkommes akzeptiers, klick op unhuelen. Du muss d'Ofkommes akzeptieren, fir $(^NameDA) knnen ze desinstallieren.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Wanns de d'Fuerderungen vum Ofkommes akzeptiers, aktivier d'Kschtchen. Du muss d'Ofkommes akzeptieren, fir $(^NameDA) knnen ze desinstallieren. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Wanns de d'Fuerderungen vum Ofkommes akzeptiers, wiel nnen di entspriechend Optioun. Du muss d'Oofkommes akzeptieren, fir $(^NameDA) kennen ze desinstallieren. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Drck d'PageDown-Tast fir den Rescht vum Ofkommes ze liesen.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Komponenten auswielen\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Wiel d'Komponenten aus, dis de wlls installieren.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Komponenten auswielen\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Wiel eng Komponent aus, dis de desinstallieren wlls.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Beschreiwung\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Hal den Mausfeil iwwer eng Komponent, fir d'Beschreiwung dervun ze gesinn.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Hal den Mausfeil iwwer eng Komponent, fir d'Beschreiwung dervun ze gesinn.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Zielverzeechnes auswielen\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Wiel den Dossier aus, an deen $(^NameDA) installiert soll ginn.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Dossier fir d'Desinstallatioun wielen\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Wiel den Dossier aus, aus dem $(^NameDA) desinstalliert soll ginn.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Installieren...\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Waard w.e.g whrend deem $(^NameDA) installiert gtt.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Installatioun frdeg\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"D'Installatioun ass feelerfri oofgeschloss ginn.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Installatioun ofgebrach\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"D'Installatioun ass net komplett ofgeschloss ginn.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Desinstallieren...\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"W.e.g. waard, whrend deems $(^NameDA) desinstalliert gtt.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Desinstallatioun ofgeschloss\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"D'Desinstallatioun ass erfollegrich ofgeschloss ginn.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Desinstallatioun oofbriechen\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Desinstallatioun ass net erfollegrich ofgeschloss ginn.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"D'Installatioun vun $(^NameDA) gtt ofgeschloss.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) ass um Computer installiert ginn.$\\r$\\n$\\r$\\nKlick op frdeg maan, fir den Installatiouns-Assistent zou ze maan..\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Den Windows muss nei gestart ginn, fir d'Installatioun vun $(^NameDA) ofzeschlissen. Wlls de Windows lo ni starten?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Desinstallatioun vun $(^NameDA) gtt ofgeschloss\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) ass vum Computer desinstalliert ginn.$\\r$\\n$\\r$\\nKlick op Ofschlissen fir den Assistent zou ze maan.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Windows muss ni gestart gin, fir d'Desinstallatioun vun $(^NameDA) ze vervollstnnegen. Wlls de Windows lo ni starten?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Lo ni starten\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Spider manuell ni starten\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"$(^NameDA) op maan\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Liesmech op maan\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Frdeg man\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Startmen-Dossier bestmmen\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Bestmm een Startman-Dossier an deen d'Programmofkierzungen kommen.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Bestmm een Startman-Dossier an deen d'Programmofkierzungen kommen. Wanns de een nien Dossier man wells, gff deem sin zuknftegen Numm an.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Keng Ofkierzungen man\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Desinstallatioun vun $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"$(^NameDA) gett vum Computer desinstalliert.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Bass de scher, dass de d'Installatioun vun $(^Name) ofbriechen wlls?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Bass de scher, dass de d'Desinstallatioun vun $(^Name) ofbriechen wlls?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Macedonian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1071\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1251\n# RTL - anything else than RTL means LTR\n-\n# Translation by Sasko Zdravkin [wingman2083@yahoo.com]\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n  $(^Name)\n# ^UninstallCaption\n  $(^Name)\n# ^LicenseSubCaption\n:  \n# ^ComponentsSubCaption\n:  \n# ^DirSubCaption\n:  \n# ^InstallingSubCaption\n: \n# ^CompletedSubCaption\n: \n# ^UnComponentsSubCaption\n:  \n# ^UnDirSubCaption\n:  \n# ^ConfirmSubCaption\n: \n# ^UninstallingSubCaption\n: \n# ^UnCompletedSubCaption\n: \n# ^BackBtn\n< &\n# ^NextBtn\n& >\n# ^AgreeBtn\n&\n# ^AcceptBtn\n&     \n# ^DontAcceptBtn\n&      \n# ^InstallBtn\n&\n# ^UninstallBtn\n&\n# ^CancelBtn\n\n# ^CloseBtn\n&\n# ^BrowseBtn\n&...\n# ^ShowDetailsBtn\n& \n# ^ClickNext\n ''   .\n# ^ClickInstall\n ''    .\n# ^ClickUninstall\n ''    .\n# ^Name\n\n# ^Completed\n\n# ^LicenseText\n          $(^NameDA).     ,  ''.\n# ^LicenseTextCB\n          $(^NameDA).     ,   Check box- . $_CLICK\n# ^LicenseTextRB\n          $(^NameDA).     ,     . $_CLICK\n# ^UnLicenseText\n          $(^NameDA).     ,  ''.\n# ^UnLicenseTextCB\n          $(^NameDA).     ,   Check box- . $_CLICK\n# ^UnLicenseTextRB\n          $(^NameDA).     ,     . $_CLICK\n# ^Custom\n\n# ^ComponentsText\n                 . $_CLICK \n# ^ComponentsSubText1\n   :\n# ^ComponentsSubText2_NoInstTypes\n      :\n# ^ComponentsSubText2\n,        :\n# ^UnComponentsText\n                 . $_CLICK\n# ^UnComponentsSubText1\n    :\n# ^UnComponentsSubText2_NoInstTypes\n      :\n# ^UnComponentsSubText2\n,        :\n# ^DirText\n     $(^NameDA)   .     ,  ''    . $_CLICK\n# ^DirSubText\n     \n# ^DirBrowseText\n     $(^NameDA):\n# ^UnDirText\n     $(^NameDA)   .     ,  ''    . $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n      $(^NameDA):\n# ^SpaceAvailable\n\" : \"\n# ^SpaceRequired\n\" : \"\n# ^UninstallingText\n$(^NameDA)      . $_CLICK\n# ^UninstallingSubText\n :\n# ^FileError\n      : \\r\\n\\t\"$0\"\\r\\n ''     ,\\r\\n''       , \\r\\n''     \n# ^FileError_NoIgnore\n      : \\r\\n\\t\"$0\"\\r\\n ''       , \\r\\n''     \n# ^CantWrite\n\"   : \"\n# ^CopyFailed\n  \n# ^CopyTo\n\"  \"\n# ^Registering\n\": \"\n# ^Unregistering\n\": \"\n# ^SymbolNotFound\n\"     : \"\n# ^CouldNotLoad\n\"   : \"\n# ^CreateFolder\n\" : \"\n# ^CreateShortcut\n\" : \"\n# ^CreatedUninstaller\n\" : \"\n# ^Delete\n\" : \"\n# ^DeleteOnReboot\n\"  : \"\n# ^ErrorCreatingShortcut\n\"    : \"\n# ^ErrorCreating\n\"  : \"\n# ^ErrorDecompressing\n    !   ?\n# ^ErrorRegistering\n    DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\": \"\n# ^Extract\n\": \"\n# ^ErrorWriting\n\":      \"\n# ^InvalidOpcode\n  :  \n# ^NoOLE\n\" OLE : \"\n# ^OutputFolder\n\" : \"\n# ^RemoveFolder\n\" : \"\n# ^RenameOnReboot\n\"  : \"\n# ^Rename\n\": \"\n# ^Skipped\n\": \"\n# ^CopyDetails\n    Clipboard-\n# ^LogInstall\n    \n# ^Byte\n\n# ^Kilo\n\n# ^Mega\n\n# ^Giga\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Macedonian.nsh",
    "content": ";Language: Macedonian (1071)\n;By Sasko Zdravkin [wingman2083@yahoo.com]\n\n!insertmacro LANGFILE \"Macedonian\" \"Macedonian\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"     $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"        $(^NameDA).$\\r$\\n$\\r$\\n         .               .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"     $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"        $(^NameDA).$\\r$\\n$\\r$\\n      $(^NameDA)     .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"          $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"     ,  ''   .          $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"     ,   check box- .         $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"     ,     .         $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"          $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"     ,  ''   .          $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"     ,   check box- .         $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"     ,     .         $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \" 'Page Down'        .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"    $(^NameDA)    .\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"    $(^NameDA)    .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"          .\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"          .\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"    \"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"         $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"    \"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"         $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"    $(^NameDA)  .\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"  .\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"    .\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"    $(^NameDA)  .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"  .\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"    .\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"   $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA)     .$\\r$\\n$\\r$\\n ''      .\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"           $(^NameDA).      ?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"   $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA)     .$\\r$\\n$\\r$\\n ''      .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"           $(^NameDA).      ?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \" \"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"     \"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&  $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"& ' '\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"    \"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"         $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"              .             .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"  \"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"  $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"  $(^NameDA)   .\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"           $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"           $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Malay.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1086\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n-\n# RTL - anything else than RTL means LTR\n-\n# Translation muhammadazwa@yahoo.com\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\nSetup $(^Name)\n# ^UninstallCaption\nUninstall $(^Name)\n# ^LicenseSubCaption\n: Perlesenan\n# ^ComponentsSubCaption\n: Pilihan kemasukan\n# ^DirSubCaption\n: Folder kemasukan\n# ^InstallingSubCaption\n: Memasang\n# ^CompletedSubCaption\n: Selesai\n# ^UnComponentsSubCaption\n: Pilihan membuang\n# ^UnDirSubCaption\n: Folder Uninstal\n# ^ConfirmSubCaption\n: Kepastian\n# ^UninstallingSubCaption\n: Membuang\n# ^UnCompletedSubCaption\n: Tidak Selesai\n# ^BackBtn\n< &Ke Belakang\n# ^NextBtn\n&Ke Depan >\n# ^AgreeBtn\nSaya &setuju\n# ^AcceptBtn\nSaya s&etuju dengan Perlesenan\n# ^DontAcceptBtn\nSaya &tidak setuju dengan Perlesenan\n# ^InstallBtn\n&Masukkan\n# ^UninstallBtn\n&Buang\n# ^CancelBtn\nBatal\n# ^CloseBtn\n&Tutup\n# ^BrowseBtn\nS&elusur...\n# ^ShowDetailsBtn\nBuka &lagi\n# ^ClickNext\nKlik Ke Depan untuk teruskan.\n# ^ClickInstall\nKlik Masukkan untuk kemasukkan.\n# ^ClickUninstall\nKlik Uninstall untuk membuang.\n# ^Name\nNama\n# ^Completed\nSelesai\n# ^LicenseText\nSila baca lesen sebelum memasukkan $(^NameDA). Jika anda terima perlesenan, klik Saya setuju.\n# ^LicenseTextCB\nSila baca lesen sebelum memasukkan $(^NameDA). Jika terima, beri tanda dicheckbox. $_CLICK\n# ^LicenseTextRB\nSila baca lesen sebelum sebelum membuang $(^NameDA). Jika anda terima perlesenan, pilihlah salah satu item dibawah ini. $_CLICK\n# ^UnLicenseText\nSila baca lesen sebelum sebelum membuang $(^NameDA). Jika anda terima perlesenan, klik Saya setuju.\n# ^UnLicenseTextCB\nSila baca lesen sebelum memasukkan $(^NameDA). Jika terima, beri tanda dicheckbox. $_CLICK\n# ^UnLicenseTextRB\nSila baca lesen sebelum sebelum membuang $(^NameDA).Jika anda terima perlesenan, pilihlah salah satu item dibawah ini. $_CLICK\n# ^Custom\nCustom\n# ^ComponentsText\nBeri tanda dicheckbox pada komponen yang ingin dimasukkan and hilangkan tanda pada komponen yang tidak perlu dimasukkan. $_CLICK\n# ^ComponentsSubText1\nPilih kemasukan:\n# ^ComponentsSubText2_NoInstTypes\nPilih komponen-komponen untuk dimasukkan:\n# ^ComponentsSubText2\nAtau, pilih komponen berikut untuk dimasukkan:\n# ^UnComponentsText\nBeri tanda dicheckbox pada komponen yang ingin dimasukkan and hilangkan tanda pada komponen yang tidak perlu dimasukkan. $_CLICK\n# ^UnComponentsSubText1\nPilih tipe un-kemasukan:\n# ^UnComponentsSubText2_NoInstTypes\nPilih komponen-komponen untuk di buang:\n# ^UnComponentsSubText2\nAtau, pilih komponen berikut untuk di buang:\n# ^DirText\nSetup akan memasukkan $(^NameDA) pada folder berikut. Untuk memilih folder lainnya, klik Selusur dan pilih folder pilihan anda. $_CLICK\n# ^DirSubText\nFolder tujuan\n# ^DirBrowseText\nPilih folder untuk memasukkan $(^NameDA):\n# ^UnDirText\nSetup akan membuang $(^NameDA) dari folder berikut. Untuk memilih folder lainnya, klik Selusur dan pilih folder pilihan anda. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nPilih folder untuk dibuang $(^NameDA):\n# ^SpaceAvailable\n\"Ruang cakera keras yang ada: \"\n# ^SpaceRequired\n\"Ruang cakera keras yang diperlukan: \"\n# ^UninstallingText\n$(^NameDA) akan buang dari folder berikut. $_CLICK\n# ^UninstallingSubText\nMembuang:\n# ^FileError\nTidak dapat menulis pada fail: \\r\\n\\t\"$0\"\\r\\nKlik abort untuk membatalkan kemasukan,\\r\\nretry untuk cuba lagi, atau\\r\\nignore untuk abaikan fail ini.\n# ^FileError_NoIgnore\nTidak dapat menulis pada fail: \\r\\n\\t\"$0\"\\r\\nKlik retry untuk cuba lagi, atau\\r\\ncancel untuk batalkan kemasukan\n# ^CantWrite\n\"Gagal menulis pada: \"\n# ^CopyFailed\nGagal menyalin\n# ^CopyTo\n\"Menyalin ke \"\n# ^Registering\n\"Mendaftarkan modul: \"\n# ^Unregistering\n\"Melepaskan modul: \"\n# ^SymbolNotFound\n\"Symbol tidak jumpa : \"\n# ^CouldNotLoad\n\"Tidak dapat membuka: \"\n# ^CreateFolder\n\"Membuat folder: \"\n# ^CreateShortcut\n\"Membuat pintasan: \"\n# ^CreatedUninstaller\n\"Membuat program unistall: \"\n# ^Delete\n\"Memadam fail: \"\n# ^DeleteOnReboot\n\"Akan dipadam ketika reboot: \"\n# ^ErrorCreatingShortcut\n\"Tidak dapat membuat pintasan: \"\n# ^ErrorCreating\n\"Ralat penciptaan: \"\n# ^ErrorDecompressing\nRalat ketika membuka data! Program Installer rosak\n# ^ErrorRegistering\nRalat mendaftarkan modul DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Menjalankan: \"\n# ^Extract\n\"Mengekstrak: \"\n# ^ErrorWriting\n\"Ekstrak: ralat ketika menulis ke fail \"\n# ^InvalidOpcode\nInstaller rosak: opcode tidak lengkap\n# ^NoOLE\n\"OLE tidak ditemukan: \"\n# ^OutputFolder\n\"Folder tujuan: \"\n# ^RemoveFolder\n\"Menghapuskan folder: \"\n# ^RenameOnReboot\n\"Menamakan semula pada reboot: \"\n# ^Rename\n\"Menamakan semula: \"\n# ^Skipped\n\"Diabaikan: \"\n# ^CopyDetails\nSalin terperinci ke clipboard\n# ^LogInstall\nCatat proses kemasukan\n# ^Byte\nBait\n# ^Kilo\nKilo\n# ^Mega\nMega\n# ^Giga\nGiga"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Malay.nsh",
    "content": ";Language: Malay (1086)\n;By muhammadazwa@yahoo.com\n\n!insertmacro LANGFILE \"Malay\" \"Malay\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Assalamualaikum, Selamat datang ke $(^NameDA) Setup Wizard\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Setup Wizard akan membantu anda untuk memasukkan $(^NameDA).$\\r$\\n$\\r$\\nSila tutup program aplikasi yang lain sebelum Setup ini dimulakan. Ini supaya tiada proses reboot komputer diperlukan.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Selamat datang ke $(^NameDA) Uninstall Wizard\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Uninstall Wizard akan membantu anda pada proses membuang $(^NameDA).$\\r$\\n$\\r$\\nSebelum membuang, pastikan dulu $(^NameDA) dimatikan.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Perlesenan\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Sila baca teks lesen berikut sebelum memasukkan $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Jika anda bersetuju, klik Saya setuju untuk teruskan. Anda mesti setuju untuk sebelum aplikasi dapat dimasukkan $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Jika anda bersetuju dengan syarat-syarat lesen, sila tanda dicheckbox. Anda mesti setuju sebelum memasukkan $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Jika anda terima semua yang ada di lesen, pilihlah salah satu item dibawah ini. Anda mesti setuju sebelum memasukkan $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Tentang Lesen\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Sila baca teks lesen sebelum membuang $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Jika anda menerima lesen, klik Saya setuju untuk teruskan. Anda mesti setuju untuk dapat membuang $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Jika anda menerima semua yang ada di lesen, beri tanda dicheckbox. Anda mesti setuju untuk dapat membuang $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Jika anda menerima semua yang ada di lesen, pilihlah salah satu item dibawah ini. Anda mesti setuju untuk dapat membuang $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Tekan Page Down untuk melihat teks selebihnya.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Pilih Komponen\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Pilih fungsi-fungsi dari $(^NameDA) yang ingin dimasukkan.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Pilih Komponen\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Pilih fungsi-fungsi $(^NameDA) yang ingin dibuang.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Penerangan\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Alihkan tetikus ke komponen untuk mengetahui penerangannya.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Alihkan tetikus ke komponen untuk mengetahui penerangannya.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Pilih Lokasi Kemasukan\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Pilih folder untuk memasukkan $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Pilih Lokasi Uninstall\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Pilih folder untuk meng-uninstall $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Pemasangan\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Sila tunggu ketika $(^NameDA) sedang dimasukkan.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Proses Selesai\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Setup sudah selesai.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Proses Dibatalkan\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Setup terbatal.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Uninstall\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Sila tunggu ketika $(^NameDA) sedang di-buang.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Proses Uninstall Selesai\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Uninstall sudah selesai.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Proses Uninstall Dibatalkan\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Uninstall belum selesai secara sempurna.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Menyelesaikan $(^NameDA) Setup Wizard\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) sudah dimasukkan di komputer anda.$\\r$\\n$\\r$\\nKlik Selesai untuk menutup Setup Wizard.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Komputer anda harus direboot untuk menyelesaikan proses memasukkan $(^NameDA). Apakah anda hendak reboot sekarang juga?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Menyelesaikan $(^NameDA) Uninstall Wizard\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) sudah dibuang dari komputer anda.$\\r$\\n$\\r$\\nKlik Selesai untuk menutup Setup Wizard.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Komputer anda harus di reboot untuk menyelesaikan proses membuang $(^NameDA). Reboot sekarang?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Reboot sekarang\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Reboot nanti\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Jalankan $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Buka fail Readme\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Selesai\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Pilih Folder Start Menu\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Pilih folder Start Menu untuk meletakkan pintasan $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Pilih folder Start Menu untuk perletakkan pintasan aplikasi ini. Boleh cipta nama folder anda sendiri.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Tidak perlu pintasan\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Buang $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Padam $(^NameDA) dari komputer anda.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Adakan anda yakin ingin membatalkan Setup $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Adakan anda yakin ingin membatalkan proses buang $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Mongolian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1104\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1251\n# RTL - anything else than RTL means LTR\n-\n# Translation by Bayarsaikhan Enkhtaivan. ebayaraa@gmail.com\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) \n# ^UninstallCaption\n$(^Name)  \n# ^LicenseSubCaption\n:  \n# ^ComponentsSubCaption\n:  \n# ^DirSubCaption\n:  \n# ^InstallingSubCaption\n: \n# ^CompletedSubCaption\n: \n# ^UnComponentsSubCaption\n:   \n# ^UnDirSubCaption\n:   \n# ^ConfirmSubCaption\n: \n# ^UninstallingSubCaption\n:   \n# ^UnCompletedSubCaption\n: \n# ^BackBtn\n< &\n# ^NextBtn\n&>\n# ^AgreeBtn\n&Ǻ뺺\n# ^AcceptBtn\n  Ǻ 뿿  & \n# ^DontAcceptBtn\n  Ǻ 뿿  & \n# ^InstallBtn\n&\n# ^UninstallBtn\n&\n# ^CancelBtn\n\n# ^CloseBtn\n&Xaax\n# ^BrowseBtn\n&...\n# ^ShowDetailsBtn\n&\n# ^ClickNext\n   .\n# ^ClickInstall\n    .\n# ^ClickUninstall\n     .\n# ^Name\n\n# ^Completed\n\n# ^LicenseText\n$(^NameDA)-    Ǻ  .    뿿  , Ǻ뺺-  .\n# ^LicenseTextCB\n$(^NameDA)-    Ǻ  .    뿿  ,    . $_CLICK\n# ^LicenseTextRB\n$(^NameDA)-    Ǻ  .    뿿  ,     . $_CLICK\n# ^UnLicenseText\n$(^NameDA)-    Ǻ  .    뿿  , Ǻ뺺-  .\n# ^UnLicenseTextCB\n$(^NameDA)-    Ǻ  .    뿿  ,    . $_CLICK\n# ^UnLicenseTextRB\n$(^NameDA)-    Ǻ  .    뿿  ,     . $_CLICK\n# ^Custom\n\n# ^ComponentsText\n   ,    ῿ . $_CLICK\n# ^ComponentsSubText1\n   :\n# ^ComponentsSubText2_NoInstTypes\n   :\n# ^ComponentsSubText2\n,    뿿 :\n# ^UnComponentsText\n   ,    ῿ . $_CLICK\n# ^UnComponentsSubText1\n   :\n# ^UnComponentsSubText2_NoInstTypes\n 뿿  l:\n# ^UnComponentsSubText2\n,    뿿 :\n# ^DirText\n$(^NameDA)    .     պ       . $_CLICK\n# ^DirSubText\n \n# ^DirBrowseText\n$(^NameDA)-   :\n# ^UnDirText\n$(^NameDA)-   .     պ       . $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n$(^NameDA)-   :\n# ^SpaceAvailable\n\" : \"\n# ^SpaceRequired\n\" : \"\n# ^UninstallingText\n$(^NameDA)    . $_CLICK\n# ^UninstallingSubText\n :\n# ^FileError\n   : \\r\\n\\t\"$0\"\\r\\n   ,\\r\\n     ,\\r\\n      \n# ^FileError_NoIgnore\n   : \\r\\n\\t\"$0\"\\r\\n     , \\r\\n    \n# ^CantWrite\n\" : \"\n# ^CopyFailed\n \n# ^CopyTo\n\"  \"\n# ^Registering\n\" : \"\n# ^Unregistering\n\"  : \"\n# ^SymbolNotFound\n\" : \"\n# ^CouldNotLoad\n\": \"\n# ^CreateFolder\n\" : \"\n# ^CreateShortcut\n\" shortcut: \"\n# ^CreatedUninstaller\n\" uninstaller: \"\n# ^Delete\n\" : \"\n# ^DeleteOnReboot\n\". : \"\n# ^ErrorCreatingShortcut\n\"Shortcut  : \"\n# ^ErrorCreating\n\" : \"\n# ^ErrorDecompressing\n  !  ?\n# ^ErrorRegistering\nDLL 㿿 \n# ^ExecShell\n\" (ExecShell): \"\n# ^Exec\n\": \"\n# ^Extract\n\": \"\n# ^ErrorWriting\n\":    \"\n# ^InvalidOpcode\n :   \n# ^NoOLE\n\"OLE : \"\n# ^OutputFolder\n\" : \"\n# ^RemoveFolder\n\" : \"\n# ^RenameOnReboot\n\".  : \"\n# ^Rename\n\" : \"\n# ^Skipped\n\": \"\n# ^CopyDetails\n Clipboard  \n# ^LogInstall\n  \n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Mongolian.nsh",
    "content": ";Language: Mongolian (1104)\n;By Bayarsaikhan Enkhtaivan\n\n!insertmacro LANGFILE \"Mongolian\" \"Mongolian\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"$(^NameDA)   \"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"$(^NameDA)      .$\\r$\\n$\\r$\\n        .        .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"$(^NameDA)     \"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"$(^NameDA)      .$\\r$\\n$\\r$\\n  $(^NameDA)    .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"$(^NameDA)-    뿿  .\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"    , Ǻ뺺   뿿 . $(^NameDA)-     .\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"    , Ǻ   뿿 . $(^NameDA)-     . $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"    ,     뿿 . $(^NameDA)-     . $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"$(^NameDA)      .\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"    , Ǻ뺺   뿿 . $(^NameDA)-     .\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"    , Ǻ   뿿 . $(^NameDA)-     . $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"    ,     뿿 . $(^NameDA)-     . $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Page Down      .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"$(^NameDA)-     .\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"$(^NameDA)-    .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"       .\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"       .\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"$(^NameDA)    .\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"  \"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"$(^NameDA)-   .\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \" \"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"$(^NameDA)-     .\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \" \"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"  .\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"  .\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"$(^NameDA) -     .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"  .\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"  .\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"$(^NameDA)   \"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA)    .$\\r$\\n$\\r$\\nҺ   .\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"$(^NameDA)-       .      ?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"$(^NameDA)   \"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA)    .$\\r$\\n$\\r$\\nҺ   .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"$(^NameDA)       .  .  ?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \".\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"  .  .\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"$(^NameDA) \"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Readme \"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Һ\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Start   \"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Start   $(^NameDA) shortcut-  .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Start   shortcut   .      .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Do not create shortcuts\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"$(^NameDA)-- \"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"$(^NameDA) -   .\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"$(^Name) -    ?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"$(^Name)    ?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Norwegian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1044\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Jonas Lindstrm (jonasc_88@hotmail.com). Reviewed and fixed by Jan Ivar Beddari <d0der at online.no>\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) installasjon\n# ^UninstallCaption\n$(^Name) avinstallasjon\n# ^LicenseSubCaption\n: Lisensavtale\n# ^ComponentsSubCaption\n: Installasjonsvalg\n# ^DirSubCaption\n: Installasjonsmappe\n# ^InstallingSubCaption\n: Installerer\n# ^CompletedSubCaption\n: Ferdig\n# ^UnComponentsSubCaption\n: Avinstallasjonsvalg\n# ^UnDirSubCaption\n: Avinstallasjonsmappe\n# ^ConfirmSubCaption\n: Bekreft\n# ^UninstallingSubCaption\n: Avinstallerer\n# ^UnCompletedSubCaption\n: Ferdig\n# ^BackBtn\n< &Tilbake\n# ^NextBtn\n&Neste >\n# ^AgreeBtn\n&Godta\n# ^AcceptBtn\nJeg &godtar vilkrene i lisensavtalen\n# ^DontAcceptBtn\nJeg godtar &ikke vilkrene i lisensavtalen\n# ^InstallBtn\n&Installer\n# ^UninstallBtn\n&Avinstaller\n# ^CancelBtn\nAvbryt\n# ^CloseBtn\n&Lukk\n# ^BrowseBtn\nBla &gjennom...\n# ^ShowDetailsBtn\nVis &detaljer\n# ^ClickNext\nTrykk Neste for  fortsette.\n# ^ClickInstall\nTrykk Installer for  starte installasjonen.\n# ^ClickUninstall\nTrykk Avinstaller for  starte avinstallasjonen.\n# ^Name\nNavn\n# ^Completed\nFerdig\n# ^LicenseText\nVennligst les gjennom lisensavtalen fr du installerer $(^Name). Hvis du godtar vilkrene i avtalen, trykk p Godta.\n# ^LicenseTextCB\nVennligst les gjennom lisensavtalen fr du installerer $(^Name). Hvis du godtar vilkrene i avtalen, merk av under. $_CLICK\n# ^LicenseTextRB\nVennligst les gjennom lisensavtalen fr du installerer $(^Name). Hvis du godtar vilkrene i avtalen, velg det frste alternativet. $_CLICK\n# ^UnLicenseText\nVennligst les gjennom lisensavtalen fr du avinstallerer $(^Name). Hvis du godtar vilkrene i avtalen, trykk p Godta.\n# ^UnLicenseTextCB\nVennligst les gjennom lisensavtalen fr du avinstallerer $(^Name). Hvis du godtar vilkrene i avtalen, merk av under. $_CLICK\n# ^UnLicenseTextRB\nVennligst les gjennom lisensavtalen fr du avinstallerer $(^Name). Hvis du godtar vilkrene i avtalen, velg det frste alternativet. $_CLICK\n# ^Custom\nEgendefinert\n# ^ComponentsText\nMerk komponentene du vil installere og fjern merkingen for de du ikke vil installere. $_CLICK\n# ^ComponentsSubText1\nVelg hvilken mte du vil installere p:\n# ^ComponentsSubText2_NoInstTypes\nMerk komponenter du vil installere:\n# ^ComponentsSubText2\nEller merk de valgfrie komponentene du nsker  installere:\n# ^UnComponentsText\nMerk komponentene du vil avinstallere og fjern merkingen for de du vil beholde. $_CLICK\n# ^UnComponentsSubText1\nVelg hvilken mte du vil avinstallere p:\n# ^UnComponentsSubText2_NoInstTypes\nMerk komponenter du vil avinstallere:\n# ^UnComponentsSubText2\nEller merk de valgfrie komponentene du nsker  avinstallere:\n# ^DirText\n$(^Name) vil bli installert i flgende mappe. For  velge en annen mappe, trykk Bla gjennom. $_CLICK\n# ^DirSubText\nMlmappe\n# ^DirBrowseText\nVelg mappe du vil installere $(^Name) i:\n# ^UnDirText\n$(^Name) i flgende mappe vil bli avinstallert. For  velge en annen mappe, trykk Bla gjennom. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nVelg mappe du vil avinstallere $(^Name) fra:\n# ^SpaceAvailable\n\"Ledig plass: \"\n# ^SpaceRequired\n\"Ndvendig plass: \"\n# ^UninstallingText\nDenne veiviseren vil avinstallere $(^Name) fra din datamaskin. $_CLICK\n# ^UninstallingSubText\nAvinstallerer fra:\n# ^FileError\nFeil under pning av fil for skriving: \\r\\n\\t\\\"$0\\\"\\r\\nTrykk Avbryt for  avbryte installasjonen,\\r\\nPrv igjen for  prve igjen, eller\\r\\nIgnorer for  hoppe over denne filen\n# ^FileError_NoIgnore\nFeil under pning av fil for skriving: \\r\\n\\t\\\"$0\\\"\\r\\nTrykk Prv igjen for  prve igjen, or\\r\\neller Avbryt for  avbryte installasjonen\n# ^CantWrite\n\"Kan ikke skrive: \"\n# ^CopyFailed\nKopiering mislyktes\n# ^CopyTo\n\"Kopier til \"\n# ^Registering\n\"Registrerer: \"\n# ^Unregistering\n\"\"Avregistrerer: \"\n# ^SymbolNotFound\n\"Kunne ikke finne symbol: \"\n# ^CouldNotLoad\n\"Kunne ikke laste: \"\n# ^CreateFolder\n\"Lag mappe: \"\n# ^CreateShortcut\n\"Lag snarvei: \"\n# ^CreatedUninstaller\n\"Avinstallasjon laget: \"\n# ^Delete\n\"Slett fil: \"\n# ^DeleteOnReboot\n\"Slett ved omstart: \"\n# ^ErrorCreatingShortcut\n\"Feil under opprettelse av snarvei: \"\n# ^ErrorCreating\n\"Feil under opprettelse av: \"\n# ^ErrorDecompressing\nFeil under utpakking av data! Installasjonsprogrammet kan vre skadet.\n# ^ErrorRegistering\nFeil under registrering av DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Kjre: \"\n# ^Extract\n\"Pakk ut: \"\n# ^ErrorWriting\n\"Pakk ut: Feil under skriving til fil \"\n# ^InvalidOpcode\nInstallasjonsprogrammet er skadet: ukjent kode\n# ^NoOLE\n\"Ingen OLE for: \"\n# ^OutputFolder\n\"Ut-mappe: \"\n# ^RemoveFolder\n\"Fjern mappe: \"\n# ^RenameOnReboot\n\"Gi nytt navn ved omstart: \"\n# ^Rename\n\"Gi nytt navn: \"\n# ^Skipped\n\"Hoppet over: \"\n# ^CopyDetails\nKopier detaljer til utklippstavlen\n# ^LogInstall\nLoggfr installasjonsprosessen\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Norwegian.nsh",
    "content": ";Language: Norwegian (2068)\n;By Jonas Lindsrm (jonasc_88@hotmail.com) Reviewed and fixed by Jan Ivar Beddari, d0der at online.no\n\n!insertmacro LANGFILE \"Norwegian\" \"Norwegian\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Velkommen til veiviseren for installasjon av $(^NameDA) \"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Denne veiviseren vil lede deg gjennom installasjonen av $(^NameDA).$\\r$\\n$\\r$\\nDet anbefales at du avslutter alle andre programmer fr du fortsetter. Dette vil la installasjonsprogrammet forandre p systemfiler uten at du m starte datamaskinen p nytt.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Velkommen til veiviseren for avinstallasjon av $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Denne veiviseren vil lede deg gjennom avinstallasjonen av $(^NameDA).$\\r$\\n$\\r$\\nFr du fortsetter m du forsikre deg om at $(^NameDA) ikke kjrer.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Lisensavtale\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Vennligst les gjennom lisensavtalen fr du starter installasjonen av $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Hvis du godtar lisensavtalen trykk Godta for  fortsette. Du m godta lisensavtalen for  installere $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Hvis du godtar lisensavtalen, kryss av p merket under. Du m godta lisensavtalen for  installere $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Hvis du godtar lisensavtalen, velg det frste alternativet ovenfor. Du m godta lisensavtalen for  installere $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Lisensavtale\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Vennligst les gjennom lisensavtalen fr du avinstallerer $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Hvis du godtar lisensavtalen trykk Godta for  fortsette.  Du m godta lisensavtalen for  avintallere $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Hvis du godtar lisensavtalen, kryss av p merket under. Du m godta lisensavtalen for  avinstallere $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Hvis du godtar lisensavtalen, velg det frste alternativet ovenfor. Du m godta lisensavtalen for  avinstallere $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Trykk Page Down knappen for  se resten av lisensavtalen.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Velg komponenter\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Velg hvilke deler av $(^NameDA) du nsker  installere.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Velg komponenter\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Velg hvilke deler av $(^NameDA) du nsker  avinstallere.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Beskrivelse\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Beveg musen over komponentene for  se beskrivelsen.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Beveg musen over komponentene for  se beskrivelsen.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Velg installasjonsmappe\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Velg hvilken mappe du vil installere $(^NameDA) i.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Velg mappe for avinstallasjon\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Velg mappen du vil avinstallere $(^NameDA) fra.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Installasjonen pgr\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Vennligst vent mens $(^NameDA) blir installert.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Installasjonen er ferdig\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Installasjonen ble fullfrt uten feil.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Installasjonen er avbrutt\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Installasjonen ble ikke fullfrt riktig.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Avinstallasjon pgr\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Vennligst vent mens $(^NameDA) blir avinstallert.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Avinstallasjon ferdig\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Avinstallasjonen ble utfrt uten feil.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Avinstallasjon avbrutt\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Avinstallasjonen ble ikke utfrt riktig.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Avslutter $(^NameDA) installasjonsveiviser\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) er klart til bruk p din datamskin.$\\r$\\n$\\r$\\nTrykk Ferdig for  avslutte installasjonsprogrammet.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Du m starte datamaskinen p nytt for  fullfre installasjonen av $(^NameDA). Vil du starte datamaskinen p nytt n?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Fullfrer avinstallasjonen av $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) har blitt avinstallert fra din datamaskin.$\\r$\\n$\\r$\\nTrykk p ferdig for  avslutte denne veiviseren.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Datamaskinen m starte p nytt for  fullfre avinstallasjonen av $(^NameDA). Vil du starte datamaskinen p nytt n?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Ja. Start datamaskinen p nytt n\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Nei. Jeg vil starte datamaskinen p nytt senere\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Kjr $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Vis Readme filen\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Ferdig\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Velg plassering p startmenyen\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Velg hvilken mappe snarveiene til $(^NameDA) skal ligge i.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Velg mappe for snarveiene til programmet. Du kan ogs skrive inn et nytt navn for  lage en ny mappe.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Ikke lag snarveier\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Avinstaller $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Fjern $(^NameDA) fra din datamaskin.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Er du sikker p at du vil avslutte installasjonen av $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Er du sikker p at du vil avbryte avinstallasjonen av $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/NorwegianNynorsk.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n2068\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Vebjrn Sture, vsture gmail com\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) installasjon\n# ^UninstallCaption\n$(^Name) avinstallasjon\n# ^LicenseSubCaption\n: Lisensavtale\n# ^ComponentsSubCaption\n: Installasjonsval\n# ^DirSubCaption\n: Installasjonsmappe\n# ^InstallingSubCaption\n: Installerer\n# ^CompletedSubCaption\n: Ferdig\n# ^UnComponentsSubCaption\n: Avinstallasjonsval\n# ^UnDirSubCaption\n: Avinstallasjonsmappe\n# ^ConfirmSubCaption\n: Stadfest\n# ^UninstallingSubCaption\n: Avinstallerer\n# ^UnCompletedSubCaption\n: Ferdig\n# ^BackBtn\n< &Attende\n# ^NextBtn\n&Neste >\n# ^AgreeBtn\n&Godta\n# ^AcceptBtn\nEg &godtek vilkra i lisensavtalen\n# ^DontAcceptBtn\nEg godtek &ikkje vilkra i lisensavtalen\n# ^InstallBtn\n&Installer\n# ^UninstallBtn\n&Avinstaller\n# ^CancelBtn\nAvbryt\n# ^CloseBtn\n&Lat att\n# ^BrowseBtn\nBla &gjennom ...\n# ^ShowDetailsBtn\nSyn &detaljar\n# ^ClickNext\nTrykk Neste for  halda fram.\n# ^ClickInstall\nTrykk Installer for  starta installasjonen.\n# ^ClickUninstall\nTrykk Avinstaller for  starta avinstallasjonen.\n# ^Name\nNamn\n# ^Completed\nFerdig\n# ^LicenseText\nVer grei og les gjennom lisensavtalen fr du installerer $(^NameDA). Dersom du godtek vilkra i avtalen, trykk p Godta.\n# ^LicenseTextCB\nVer grei og les gjennom lisensavtalen fr du installerer $(^NameDA). Dersom du godtek vilkra i avtalen, merk av under. $_CLICK\n# ^LicenseTextRB\nVer grei og les gjennom lisensavtalen fr du installerer $(^NameDA). Dersom du godtek vilkra i avtalen, vel det fyrste alternativet. $_CLICK\n# ^UnLicenseText\nVer grei og les gjennom lisensavtalen fr du avinstallerer $(^NameDA). Dersom du godtek vilkra i avtalen, trykk p Godta.\n# ^UnLicenseTextCB\nVer grei og les gjennom lisensavtalen fr du avinstallerer $(^NameDA). Dersom du godtek vilkra i avtalen, merk av under. $_CLICK\n# ^UnLicenseTextRB\nVer grei og les gjennom lisensavtalen fr du avinstallerer $(^NameDA). Dersom du godtek vilkra i avtalen, vel det fyrste alternativet. $_CLICK\n# ^Custom\nEigendefinert\n# ^ComponentsText\nMerk komponentane du vil installera og fjern merkinga for dei du ikkje vil installera. $_CLICK\n# ^ComponentsSubText1\nVel kva mte du vil installera p:\n# ^ComponentsSubText2_NoInstTypes\nMerk komponentar du vil installera:\n# ^ComponentsSubText2\nEller merk dei valfrie komponentane du ynskjer  installera:\n# ^UnComponentsText\nMerk komponentane du vil avinstallera og fjern merkinga for dei du vil ta vare p. $_CLICK\n# ^UnComponentsSubText1\nVel kva mte du vil avinstallera p:\n# ^UnComponentsSubText2_NoInstTypes\nMerk komponentar du vil avinstallera:\n# ^UnComponentsSubText2\nEller merk dei valfrie komponentane du ynskjer  avinstallera:\n# ^DirText\n$(^NameDA) vil verta installert i fylgjande mappe. For  velja ei anna mappe, trykk Bla gjennom. $_CLICK\n# ^DirSubText\nMlmappe\n# ^DirBrowseText\nVel mappe du vil installera $(^NameDA) i:\n# ^UnDirText\n$(^NameDA) i fylgjande mappe vil verta avinstallert. For  velja ei anna mappe, trykk Bla gjennom. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nVel mappe du vil avinstallera $(^NameDA) fr:\n# ^SpaceAvailable\n\"Ledig plass: \"\n# ^SpaceRequired\n\"Naudsynt plass: \"\n# ^UninstallingText\nDenne vegvisaren vil avinstallera $(^NameDA) fr din datamaskin. $_CLICK\n# ^UninstallingSubText\nAvinstallerer fr:\n# ^FileError\nFeil under opning av fil for skriving: \\r\\n\\t\\\"$0\\\"\\r\\nTrykk Avbryt for  avbryta installasjonen,\\r\\nPrv igjen for  prva igjen, eller\\r\\nIgnorer for  hoppa over denne fila\n# ^FileError_NoIgnore\nFeil under opning av fil for skriving: \\r\\n\\t\\\"$0\\\"\\r\\nTrykk Prv igjen for  prva igjen, or\\r\\neller Avbryt for  avbryta installasjonen\n# ^CantWrite\n\"Kan ikkje skriva: \"\n# ^CopyFailed\nKopiering mislukka\n# ^CopyTo\n\"Kopier til \"\n# ^Registering\n\"Registrerer: \"\n# ^Unregistering\n\"\"Avregistrerer: \"\n# ^SymbolNotFound\n\"Kunne ikkje finna symbol: \"\n# ^CouldNotLoad\n\"Kunne ikkje lasta: \"\n# ^CreateFolder\n\"Lag mappe: \"\n# ^CreateShortcut\n\"Lag snarveg: \"\n# ^CreatedUninstaller\n\"Avinstallasjon laga: \"\n# ^Delete\n\"Slett fil: \"\n# ^DeleteOnReboot\n\"Slett ved omstart: \"\n# ^ErrorCreatingShortcut\n\"Feil under oppretting av snarveg: \"\n# ^ErrorCreating\n\"Feil under oppretting av: \"\n# ^ErrorDecompressing\nFeil under utpakking av data! Installasjonsprogrammet kan vera skadd.\n# ^ErrorRegistering\nFeil under registrering av DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Kyra: \"\n# ^Extract\n\"Pakk ut: \"\n# ^ErrorWriting\n\"Pakk ut: Feil under skriving til fil \"\n# ^InvalidOpcode\nInstallasjonsprogrammet er skadd: ukjend kode\n# ^NoOLE\n\"Ingen OLE for: \"\n# ^OutputFolder\n\"Ut-mappe: \"\n# ^RemoveFolder\n\"Fjern mappe: \"\n# ^RenameOnReboot\n\"Gje nytt namn ved omstart: \"\n# ^Rename\n\"Gje nytt namn: \"\n# ^Skipped\n\"Hoppa over: \"\n# ^CopyDetails\nKopier detaljar til utklyppstavla\n# ^LogInstall\nLoggfr installasjonsprosessen\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG\n\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/NorwegianNynorsk.nsh",
    "content": ";Language: Norwegian nynorsk (2068)\n;By Vebjoern Sture and Hvard Mork (www.firefox.no)\n\n!insertmacro LANGFILE \"NorwegianNynorsk\" \"Norwegian nynorsk\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Velkommen til $(^NameDA) innstallasjonsvegvisar\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Denne vegvisaren vil leie deg gjennom installeringa av $(^NameDA).$\\n$\\nDet er tilrdd at du avsluttar alle andre program fr du held fram. Dette vil la installeringsprogrammet oppdatera systemfiler utan at du m starta datamaskinen p nytt.$\\n$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Velkommen til avinstallering av $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Denne vegvisaren vil leie deg gjennom avinstalleringen av $(^NameDA).$\\n$\\nFr du fortsetter m du forsikre deg om at $(^NameDA) ikkje er opent.$\\n$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Lisensavtale\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Les gjennom lisensavtalen fr du startar installeringa av $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Trykk p Godta dersom du godtar betingelsane i avtala. Du m godta avtala for  installere $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Trykk p avkryssingsboksen nedanfor nedanfor dersom du godtar betingelsane i avtala. Du m godta avtala for  installere $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Vel det frste alternativet nedanfor dersom du godtek vilkra i avtala. Du m godta avtala for  installera $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Lisensavtale\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Les gjennom lisensavtalen fr du startar avinstalleringa av $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Trykk p Godta dersom du godtar betingelsane i avtala. Du m godta avtala for  avinstallera $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Trykk p avkryssingsboksen nedanfor nedanfor dersom du godtar betingelsane i avtala. Du m godta avtala for  avinstallera $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Vel det frste alternativet nedanfor dersom du godtar betingelsane i avtala. Du m godta avtala for  avinstallera $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Trykk Page Down-knappen for  sj resten av lisensavtala.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Vel komponentar\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Vel kva delar av $(^NameDA) du ynskjer  installera.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Vel funksjonar\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Vel kva for funksjonar du vil avinstallera i $(^NameDA).\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Beskriving\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Beveg musa over komponentene for  sj beskrivinga.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Beveg musa over komponentene for  sj beskrivinga.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Vel installasjonsmappe\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Vel kva mappe du vil installera $(^NameDA) i.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Vel avinstalleringplassering\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Vel mappa du vil avinstallere $(^NameDA) fr.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Installerer\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Vent mens $(^NameDA) blir installert.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Installeringa er fullfrt\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Installeringa vart fullfrt.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Installeringa vart avbroten\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Installeringa vart ikkje fullfrt.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Avinstallerer\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Vent medan $(^NameDA) vert avinstallert.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Avinstallering ferdig\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Avinstallering ble utfrt uten feil.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Avinstallering broten\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Avinstallering ble ikkje utfrt riktig.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Installering fullfrt\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) er installert og klar til bruk.$\\n$\\nTrykk p Fullfr for  avslutte installeringa.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Du m starta datamaskinen p nytt for  fullfra installeringa av $(^NameDA). Vil du starta p nytt no?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Fullfrer avinstalleringa av $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) er no avinstallert fr datamaskina di.$\\n$\\nTrykk p Fullfr for  avslutta denne vegvisaren.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Datamaskinen m starta p nytt for  fullfra avinstalleringa av $(^NameDA). Vil du starta datamaskina p nytt no?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Start p nytt no\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Eg vil starta p nytt seinare\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Kyr $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Syn lesmeg\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Fullfr\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Vel mappe p startmenyen\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Vel kva mappe snarvegane til $(^NameDA) skal liggja i.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Vel mappa du vil oppretta snarvegane til programmet i. Du kan g skriva inn eit nytt namn for  laga ei ny mappe.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Ikkje opprett snarvegar\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Avinstaller $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Slett $(^NameDA) fr datamaskinen.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Er du viss p at du vil avslutta installeringa av $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Er du viss p at du vil avbryta avinstalleringa av $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Polish.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1045\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1250\n# RTL - anything else than RTL means LTR\n-\n# Translation by Piotr Murawski & Rafa Lampe\n# Updated by cube and SYSTEMsoft Group\n# Corrections by Marek Stepien <marcoos@aviary.pl> - http://www.aviary.pl/\n# Updated by Pawe Porwisz, http://www.pepesoft.tox.pl\n# Corrected by Mateusz Gola (aka Prozac) - http://www.videopedia.pl/avirecomp\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\nInstalator programu $(^Name)\n# ^UninstallCaption\nDeinstalator programu $(^Name)\n# ^LicenseSubCaption\n: Umowa licencyjna\n# ^ComponentsSubCaption\n: Opcje instalacji\n# ^DirSubCaption\n: Folder instalacyjny\n# ^InstallingSubCaption\n: Instalowanie plikw\n# ^CompletedSubCaption\n: Zakoczono\n# ^UnComponentsSubCaption\n: Opcje deinstalacji\n# ^UnDirSubCaption\n: Folder deinstalacyjny\n# ^ConfirmSubCaption\n: Potwierdzenie\n# ^UnDirSubCaption\n: Deinstalowanie plikw\n# ^UnCompletedSubCaption\n: Zakoczono\n# ^BackBtn\n< &Wstecz\n# ^NextBtn\n&Dalej >\n# ^AgreeBtn\n&Zgadzam si\n# ^AcceptBtn\n&Akceptuj warunki umowy licencyjnej\n# ^DontAcceptBtn\n&Nie akceptuj warunkw umowy licencyjnej\n# ^InstallBtn\n&Zainstaluj\n# ^UninstallBtn\n&Odinstaluj\n# ^CancelBtn\nAnuluj\n# ^CloseBtn\n&Zamknij\n# ^BrowseBtn\n&Przegldaj...\n# ^ShowDetailsBtn\nPoka &szczegy\n# ^ClickNext\nKliknij Dalej, aby kontynuowa.\n# ^ClickInstall\nKliknij Zainstaluj, aby rozpocz instalacj.\n# ^ClickUninstall\nKliknij Odinstaluj, aby rozpocz deinstalacj.\n# ^Name\nNazwa\n# ^Completed\nZakoczono\n# ^LicenseText\nPrzed zainstalowaniem $(^NameDA) przeczytaj umow licencyjn. Jeli akceptujesz wszystkie warunki umowy, kliknij Zgadzam si.\n# ^LicenseTextCB\nPrzed zainstalowaniem $(^NameDA) przeczytaj umow licencyjn. Jeli akceptujesz wszystkie warunki umowy, kliknij pole wyboru poniej. $_CLICK.\n# ^LicenseTextRB\nPrzed zainstalowaniem $(^NameDA) przeczytaj umow licencyjn. Jeli akceptujesz wszystkie warunki umowy, wybierz pierwsz opcj poniej. $_CLICK.\n# ^UnLicenseText\nPrzed odinstalowaniem $(^NameDA) przeczytaj umow licencyjn. Jeli akceptujesz wszystkie warunki umowy, kliknij Zgadzam si.\n# ^UnLicenseTextCB\nPrzed odinstalowaniem $(^NameDA) przeczytaj umow licencyjn. Jeli akceptujesz wszystkie warunki umowy, kliknij pole wyboru poniej. $_CLICK.\n# ^UnLicenseTextRB\nPrzed odinstalowaniem $(^NameDA) przeczytaj licencj. Jeli akceptujesz wszystkie warunki umowy, wybierz pierwsz opcj poniej. $_CLICK.\n# ^Custom\nUytkownika\n# ^ComponentsText\nZaznacz komponenty, ktre chcesz zainstalowa i odznacz te, ktrych nie chcesz instalowa. $_CLICK\n# ^ComponentsSubText1\nWybierz typ instalacji:\n# ^ComponentsSubText2_NoInstTypes\nWybierz komponenty do zainstalowania:\n# ^ComponentsSubText2\nAlbo wybierz opcjonalne komponenty, ktre chcesz zainstalowa:\n# ^UnComponentsText\nZaznacz komponenty, ktre chcesz odinstalowa i odznacz te, ktre nie zostan odinstalowane. $_CLICK\n# ^UnComponentsSubText1\nWybierz typ deinstalacji:\n# ^UnComponentsSubText2_NoInstTypes\nWybierz komponenty do odinstalowania:\n# ^UnComponentsSubText2\nAlbo wybierz opcjonalne komponenty, ktre chcesz odinstalowa:\n# ^DirText\nInstalator zainstaluje program $(^NameDA) w nastpujcym folderze. Aby zainstalowa w innym folderze, kliknij Przegldaj i wybierz folder. $_CLICK\n# ^DirSubText\nFolder docelowy\n# ^DirBrowseText\nWybierz folder instalacyjny $(^NameDA):\n# ^UnDirText\nDeinstalator usunie $(^NameDA) z nastpujcego folderu. Aby odinstalowa z innego folderu, kliknij Przegldaj i wybierz folder. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nWybierz folder, z ktrego zostanie odinstalowany program $(^NameDA):\n# ^SpaceAvailable\n\"Dostpne miejsce: \"\n# ^SpaceRequired\n\"Wymagane miejsce: \"\n# ^UninstallingText\nTen kreator odinstaluje $(^NameDA) z Twojego komputera. $_CLICK\n# ^UninstallingSubText\nDeinstalacja z: \n# ^FileError\nBd otwarcia pliku do zapisu: \\r\\n\\r\\n$0\\r\\n\\r\\nWybierz Anuluj, aby przerwa instalacj,\\r\\nPonw, aby ponowi zapis do pliku lub\\r\\nIgnoruj, aby pomin ten plik.\n# ^FileError_NoIgnore\nBd otwarcia pliku do zapisu: \\r\\n\\r\\n$0\\r\\n\\r\\nWybierz Ponw, aby ponowi zapis do pliku lub\\r\\nAnuluj, aby przerwa instalacj.\n# ^CantWrite\n\"Nie mona zapisa: \"\n# ^CopyFailed\nBd kopiowania\n# ^CopyTo\n\"Kopiuj do \"\n# ^Registering \n\"Rejestrowanie: \"\n# ^Unregistering\n\"Odrejestrowywanie: \"\n# ^SymbolNotFound\n\"Nie mona odnale symbolu: \"\n# ^CouldNotLoad\n\"Nie mona wczyta: \"\n#^CreateFolder\n\"Utwrz folder: \"\n# ^CreateShortcut\n\"Utwrz skrt: \"\n# ^CreatedUninstaller\n\"Utworzono deinstalator: \"\n# ^Delete\n\"Usu plik: \"\n# ^DeleteOnReboot\n\"Usu przy ponownym uruchomieniu: \"\n# ^ErrorCreatingShortcut\n\"Bd tworzenia skrtu: \"\n# ^ErrorCreating\n\"Bd tworzenia: \"\n# ^ErrorDecompressing\nBd rozpakowywania danych! Uszkodzony instalator?\n# ^ErrorRegistering\nBd rejestracji pliku DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Uruchom: \"\n# ^Extract\n\"Rozpakuj: \"\n# ^ErrorWriting\n\"Rozpakuj: bd zapisu do pliku \"\n# ^InvalidOpcode\nInstalator uszkodzony: nieprawidowy kod operacji\n# ^NoOLE\n\"Brak OLE dla: \"\n# ^OutputFolder\n\"Folder wyjciowy: \"\n# ^RemoveFolder\n\"Usu folder: \"\n# ^RenameOnReboot\n\"Zmie nazw przy ponownym uruchomieniu: \"\n# ^Rename\n\"Zmie nazw: \"\n# ^Skipped\n\"Pominite: \"\n# ^CopyDetails\nKopiuj szczegy do schowka\n# ^LogInstall\nRejestruj przebieg instalacji\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Polish.nsh",
    "content": ";Language: Polish (1045)\n;By Piotr Murawski & Rafa Lampe\n;Updated by cube and SYSTEMsoft Group\n;Updated by Pawe Porwisz, http://www.pepesoft.tox.pl\n;Corrected by Mateusz Gola (aka Prozac) - http://www.videopedia.pl/avirecomp\n\n!insertmacro LANGFILE \"Polish\" \"Polski\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Witamy w kreatorze instalacji programu $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Kreator ten pomoe Ci zainstalowa program $(^NameDA).$\\r$\\n$\\r$\\nZalecane jest zamknicie wszystkich uruchomionych programw przed rozpoczciem instalacji. Pozwoli to na uaktualnienie niezbdnych plikw systemowych bez koniecznoci ponownego uruchamiania komputera.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Witamy w kreatorze deinstalacji $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Kreator poprowadzi Ci przez proces deinstalacji $(^NameDA).$\\r$\\n$\\r$\\nPrzed rozpoczciem deinstalacji programu, upewnij si, czy $(^NameDA) NIE jest wanie uruchomiony.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Umowa licencyjna\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Przed instalacj programu $(^NameDA) zapoznaj si z warunkami licencji.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Jeeli akceptujesz warunki umowy, wybierz Zgadzam si, aby kontynuowa. Musisz zaakceptowa warunki umowy, aby zainstalowa $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Jeeli akceptujesz warunki umowy, zaznacz pole wyboru poniej, aby kontynuowa. Musisz zaakceptowa warunki umowy, aby zainstalowa $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Jeeli akceptujesz warunki umowy, wybierz pierwsz opcj poniej, aby kontynuowa. Musisz zaakceptowa warunki umowy, aby zainstalowa $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Umowa licencyjna\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Przed deinstalacj programu $(^NameDA) zapoznaj si z warunkami licencji.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Jeeli akceptujesz warunki umowy, wybierz Zgadzam si, aby kontynuowa. Musisz zaakceptowa warunki umowy, aby odinstalowa $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Jeeli akceptujesz warunki umowy, zaznacz pole wyboru poniej, aby kontynuowa. Musisz zaakceptowa warunki umowy, aby odinstalowa $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Jeeli akceptujesz warunki umowy, wybierz pierwsz opcj poniej, aby kontynuowa. Musisz zaakceptowa warunki umowy, aby odinstalowa $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Nacinij klawisz Page Down, aby zobaczy reszt umowy.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Wybierz komponenty\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Wybierz komponenty programu $(^NameDA), ktre chcesz zainstalowa.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Wybierz komponenty\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Wybierz, ktre elementy $(^NameDA) chcesz odinstalowa.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Opis\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Przesu kursor myszy nad komponent, aby zobaczy jego opis.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Przesu kursor myszy nad komponent, aby zobaczy jego opis.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Wybierz lokalizacj dla instalacji\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Wybierz folder, w ktrym ma by zainstalowany $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Wybr miejsca deinstalacji\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Wybierz folder, z ktrego chcesz odinstalowa $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Instalacja\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Prosz czeka, podczas gdy $(^NameDA) jest instalowany.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Zakoczono instalacj\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Instalacja zakoczona pomylnie.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalacja przerwana\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Instalacja nie zostaa zakoczona pomylnie.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Deinstalacja\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Prosz czeka, $(^NameDA) jest odinstalowywany.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Zakoczono odinstalowanie\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Odinstalowanie zakoczone pomylnie.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Deinstalacja przerwana\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Deinstalacja nie zostaa zakoczona pomylnie.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Koczenie pracy kreatora instalacji $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) zosta pomylnie zainstalowany na Twoim komputerze.$\\r$\\n$\\r$\\nKliknij Zakocz, aby zakoczy dziaanie kreatora.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Twj komputer musi zosta ponownie uruchomiony, aby zakoczy instalacj programu $(^NameDA). Czy chcesz zrobi to teraz?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Koczenie pracy kreatora deinstalacji $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) zosta odinstalowany z Twojego komputera.$\\r$\\n$\\r$\\nKliknij Zakocz, aby zakoczy dziaanie kreatora.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Twj komputer musi zosta ponownie uruchomiony w celu zakoczenia deinstalacji programu $(^NameDA). Czy chcesz zrobi to teraz?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Uruchom ponownie teraz\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Sam uruchomi ponownie komputer pniej\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Uruchom program $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Poka plik ReadMe\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Zakocz\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Wybierz folder w menu Start\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Wybierz folder menu Start, w ktrym zostan umieszczone skrty do programu\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Wybierz folder w menu Start, w ktrym chciaby umieci skrty do programu. Moesz take utworzy nowy folder wpisujc jego nazw.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Nie twrz skrtw\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Odinstaluj $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Usu $(^NameDA) z Twojego komputera.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Czy na pewno chcesz zakoczy dziaanie instalatora $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Czy na pewno chcesz przerwa proces deinstalacji $(^Name)?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Wybierz uytkownikw\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Wybierz, dla ktrych uytkownikw chcesz zainstalowa program $(^NameDA).\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Wybierz, czy chcesz zainstalowa program $(^NameDA) tylko dla siebie, czy dla wszystkich uytkownikw tego komputera. $(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Zainstaluj dla wszystkich uytkownikw tego komputera\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Zainstaluj tylko dla mnie\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Portuguese.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n2070\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation v4.0.3 by DragonSoull <dragonsoull@madalien.tk> with help from Dre` - Updated by Ramon\n# ^Branding\nSistema de Instalao Nullsoft %s\n# ^SetupCaption\nInstalao de $(^Name)\n# ^UninstallCaption\nDesinstalao de $(^Name)\n# ^LicenseSubCaption\n: Contrato de Licena\n# ^ComponentsSubCaption\n: Opes de instalao\n# ^DirSubCaption\n: Diretrio de instalao\n# ^InstallingSubCaption\n: Instalando Ficheiros\n# ^CompletedSubCaption\n: Concludo\n# ^UnComponentsSubCaption\n: Opes de Desinstalao\n# ^UnDirSubCaption\n: Pasta de Desinstalao\n# ^ConfirmSubCaption\n: Confirmao\n# ^UninstallingSubCaption\n: Desinstalando\n# ^UnCompletedSubCaption\n: Concludo\n# ^BackBtn\n< &Anterior\n# ^NextBtn\n&Seguinte >\n# ^AgreeBtn\n&Aceito\n# ^AcceptBtn\nEu &aceito os termos do Contrato de Licena\n# ^DontAcceptBtn\nEu &no aceito os termos do Contrato de Licena\n# ^InstallBtn\n&Instalar\n# ^UninstallBtn\n&Desinstalar\n# ^CancelBtn\nCancelar\n# ^CloseBtn\n&Fechar\n# ^BrowseBtn\n&Procurar...\n# ^ShowDetailsBtn\nVer &Detalhes\n# ^ClickNext\nClique em 'Seguinte' para continuar.\n# ^ClickInstall\nClique em 'Instalar' para iniciar a instalao.\n# ^ClickUninstall\nClique em 'Desinstalar' para iniciar a desinstalao.\n# ^Name\nNome\n# ^Completed\nConcludo\n# ^LicenseText\nPor favor reveja o acordo de licensa antes de instalar $(^NameDA). Se concorda com todos os termos da licensa, clique em 'Aceito'.\n# ^LicenseTextCB\nPor favor reveja o acordo de licensa antes de instalar $(^NameDA). Se concorda com todos os termos da licensa, clique na caixa de seleo abaixo. $_CLICK\n# ^LicenseTextRB\nPor favor reveja o acordo de licensa antes de instalar $(^NameDA). Se concorda com todos os termos da licensa, escolha a primeira opo abaixo. $_CLICK\n# ^UnLicenseText\nPor favor reveja o acordo de licensa antes de desinstalar $(^NameDA). Se concorda com todos os termos da licensa, clique em 'Aceito'.\n# ^UnLicenseTextCB\nPor favor reveja o acordo de licensa antes de desinstalar $(^NameDA). Se concorda com todos os termos da licensa, clique na caixa de seleo abaixo. $_CLICK\n# ^UnLicenseTextRB\nPor favor reveja o acordo de licensa antes de desinstalar $(^NameDA). Se concorda com todos os termos da licensa, escolha a primeira opo abaixo. $_CLICK\n# ^Custom\nPersonalizado\n# ^ComponentsText\nMarque os componentes que deseja instalar e desmarque os componentes que no deseja instalar. $_CLICK\n# ^ComponentsSubText1\nEscolha o tipo de instalao:\n# ^ComponentsSubText2_NoInstTypes\nEscolha os componentes para instalar:\n# ^ComponentsSubText2\nOu, escolha os componentes opcionais que deseja instalar:\n# ^UnComponentsText\nMarque os componentes que queira desinstalar e vice versa. $_CLICK\n# ^UnComponentsSubText1\nEscolha o tipo de desinstalao: \n# ^UnComponentsSubText2_NoInstTypes\nEscolha os componentes para desinstalar:\n# ^UnComponentsSubText2\nOu, escolha os componentes opcionais que queira desinstalar:\n# ^DirText\nO $(^NameDA) ser instalado na seguinte pasta. Para instalar numa pasta diferente, clique em 'Procurar...' e escolha outra pasta. $_CLICK\n# ^DirSubText\nPasta de Destino\n# ^DirBrowseText\nEscolha uma pasta para instalar o $(^NameDA):\n# ^UnDirText\nO $(^NameDA) ser desinstalado da seguinte pasta. Para desinstalar de uma pasta diferente, clique em 'Procurar...' e escolha outra pasta. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nEscolha uma pasta de onde ser desinstalado o $(^NameDA):\n# ^SpaceAvailable\n\"Espao disponvel: \"\n# ^SpaceRequired\n\"Espao necessrio: \"\n# ^UninstallingText\n$(^NameDA) ser desinstalado da seguinte pasta. $_CLICK\n# ^UninstallingSubText\nDesinstalando de:\n# ^FileError\nErro ao abrir ficheiro para escrita: \\r\\n\\t\"$0\"\\r\\nClique em Abortar para abortar a instalao,\\r\\nRepetir para tentar novamente a escrita do ficheiro, ou\\r\\nIgnorar para ignorar este ficheiro.\n# ^FileError_NoIgnore\nErro ao abrir ficheiro para escrita: \\r\\n\\t\"$0\"\\r\\nClique em Repetir para tentar novamente a gravao do ficheiro, ou\\r\\nCancelar para abortar a instalao.\n# ^CantWrite\n\"No foi possvel escrever: \"\n# ^CopyFailed\nFalha ao copiar\n# ^CopyTo\n\"Copiar para \"\n# ^Registering\n\"Registando: \"\n# ^Unregistering\n\"Desregistando: \"\n# ^SymbolNotFound\n\"Smbolo no encontrado: \"\n# ^CouldNotLoad\n\"No foi possvel carregar: \"\n# ^CreateFolder\n\"Criando diretrio: \"\n# ^CreateShortcut\n\"Criando atalho: \"\n# ^CreatedUninstaller\n\"Criando desinstalador: \"\n# ^Delete\n\"Apagando ficheiro: \"\n# ^DeleteOnReboot\n\"Apagar ao reiniciar: \"\n# ^ErrorCreatingShortcut\n\"Erro ao criar atalho: \"\n# ^ErrorCreating\n\"Erro ao criar: \"\n# ^ErrorDecompressing\nErro ao descomprimir dados! Instalador corrompido?\n# ^ErrorRegistering\nErro ao registar DLL\n# ^ExecShell\n\"Executando pelo Shell: \"\n# ^Exec\n\"Executando: \"\n# ^Extract\n\"Extraindo: \"\n# ^ErrorWriting\n\"Extraindo: erro ao escrever ficheiro \"\n# ^InvalidOpcode\nInstalador corrompido: cdigo de operao invlido\n# ^NoOLE\n\"Sem OLE para: \"\n# ^OutputFolder\n\"Pasta de destino: \"\n# ^RemoveFolder\n\"Removendo pasta: \"\n# ^RenameOnReboot\n\"Renomear ao reiniciar: \"\n# ^Rename\n\"Renomeando: \"\n# ^Skipped\n\"Ignorado: \"\n# ^CopyDetails\nCopiar detalhes para a rea de Transfrencia\n# ^LogInstall\nRegistar processo de instalao\n# ^Byte\nB\n# kilo\nK\n# mega\nM\n# giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Portuguese.nsh",
    "content": ";Language: Portuguese (2070)\n;By Ramon <ramon@netcabo.pt>\n\n!insertmacro LANGFILE \"Portuguese\" \"Portugus\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Bem vindo ao Assistente de Instalao do $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Este assistente ajud-lo- durante a instalao do $(^NameDA).$\\r$\\n$\\r$\\n recomendado que feche todas as outras aplicaes antes de iniciar a Instalao. Isto permitir que o Instalador actualize ficheiros relacionados com o sistema sem necessidade de reiniciar o computador.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Bem vindo ao Assistente de desinstalao do $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Este assistente ajud-lo- durante a desinstalao do $(^NameDA).$\\r$\\n$\\r$\\nAntes de iniciar a desinstalao, certifique-se de que o $(^NameDA) no est em execuo.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Contrato de Licena\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Por favor, verifique os termos da licena antes de instalar o $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Se aceitar os termos da licena, clique em 'Aceito' para continuar. Dever aceitar o contrato para instalar o $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Se aceitar os termos da licena, clique na caixa de seleo abaixo. Dever aceitar o contrato para instalar o $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Se aceitar os termos da licena, selecione a primeira opo abaixo. Voc deve aceitar o contrato para instalar o $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Contrato de Licena\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Por favor, verifique os termos da licena antes de desinstalar o $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Se aceitar os termos da licena, clique em 'Aceito' para continuar. Dever aceitar o contrato para desinstalar o $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Se aceitar os termos da licena, clique na caixa de seleo abaixo. Dever aceitar o contrato para desinstalar o $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Se aceitar os termos da licena, selecione a primeira opo abaixo. Voc deve aceitar o contrato para desinstalar o $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Tecle Page Down para ver o restante da licena.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Escolha de Componentes\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Escolha quais as caractersticas do $(^NameDA) que deseja instalar.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Escolher Componentes\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Escolha quais as caractersticas do $(^NameDA) que deseja desinstalar.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Descrio\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Posicione o rato sobre um componente para ver a sua descrio.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Posicione o rato sobre um componente para ver a sua descrio.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Escolha do Local da Instalao\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Escolha a pasta na qual deseja instalar o $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Escolha o Local de desinstalao\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Escolha a pasta de onde pretende desinstalar o $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Instalando\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Por favor, aguarde enquanto o $(^NameDA) est sendo instalado.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Instalao Completa\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"A instalao foi concluda com sucesso.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalao Abortada\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"A instalao no foi concluda com sucesso.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Desinstalando\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Por favor, aguarde enquanto o $(^NameDA) est sendo desinstalado.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Desinstalao Completa\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"A desinstalao foi concluda com sucesso.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Desinstalao Abortada\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"A desinstalao no foi concluda com sucesso\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Concluindo o Assistente de Instalao do $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) foi instalado no seu computador.$\\r$\\n$\\r$\\nClique em Terminar para fechar este assistente.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"O seu computador deve ser reiniciado para conclur a instalao do $(^NameDA). Deseja reiniciar agora?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Conclundo o assistente de desisntalao do $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) foi removido do seu computador.$\\r$\\n$\\r$\\nClique em Terminar para fechar este assistente.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"O seu computador deve ser reiniciado para conclur a desinstalao do $(^NameDA). Deseja reiniciar agora?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Reiniciar Agora\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Eu quero reiniciar manualmente depois\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Executar $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Mostrar Leiame\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Terminar\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Escolha uma Pasta do Menu Iniciar\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Escolha uma pasta do Menu Iniciar para os atalhos do programa.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Selecione uma pasta do Menu Iniciar em que deseja criar os atalhos do programa. Voc pode tambm digitar um nome para criar uma nova pasta. \"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"No criar atalhos\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Desinstalar $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Remover o $(^NameDA) do seu computador.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Deseja realmente cancelar a instalao do $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Deseja realmente cancelar a desinstalao do $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/PortugueseBR.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1046\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Diego Marcos\n# Corrections by Felipe\n# ^Branding\nSistema de Instalao Nullsoft %s\n# ^SetupCaption\nInstalao do $(^Name)\n# ^UninstallCaption\nDesinstalao do $(^Name)\n# ^LicenseSubCaption\n: Acordo da Licena\n# ^ComponentsSubCaption\n: Opes da Instalao\n# ^DirSubCaption\n: Pasta da Instalao\n# ^InstallingSubCaption\n: Instalando\n# ^CompletedSubCaption\n: Completado\n# ^UnComponentsSubCaption\n: Opes da Desinstalao\n# ^UnDirSubCaption\n: Pasta da Desinstalao\n# ^ConfirmSubCaption\n: Confirmao\n# ^UninstallingSubCaption\n: Desinstalando\n# ^UnCompletedSubCaption\n: Completado\n# ^BackBtn\n< &Voltar\n# ^NextBtn\n&Prximo >\n# ^AgreeBtn\nEu &Concordo\n# ^AcceptBtn\nEu &aceito os termos no Acordo da Licena\n# ^DontAcceptBtn\nEu &no aceito os termos no Acordo da Licena\n# ^InstallBtn\n&Instalar\n# ^UninstallBtn\n&Desinstalar\n# ^CancelBtn\nCancelar\n# ^CloseBtn\n&Fechar\n# ^BrowseBtn\nP&rocurar...\n# ^ShowDetailsBtn\nMostrar &detalhes\n# ^ClickNext\nClique em Prximo para continuar.\n# ^ClickInstall\nClique em Instalar para iniciar a instalao.\n# ^ClickUninstall\nClique em Desinstalar para iniciar a desinstalao.\n# ^Name\nNome\n# ^Completed\nCompletado\n# ^LicenseText\nPor favor reveja o acordo da licena antes de instalar o $(^NameDA). Se voc aceita todos os termos do acordo, clique em Eu Concordo.\n# ^LicenseTextCB\nPor favor reveja o acordo da licena antes de instalar o $(^NameDA). Se voc aceita todos os termos do acordo, clique na caixa de seleo abaixo. $_CLICK\n# ^LicenseTextRB\nPor favor reveja o acordo da licena antes de instalar o $(^NameDA). Se voc aceita todos os termos do acordo, selecione a primeira opo abaixo. $_CLICK\n# ^UnLicenseText\nPor favor reveja o acordo da licena antes de desinstalar o $(^NameDA). Se voc aceita todos os termos do acordo, clique em Eu Concordo.\n# ^UnLicenseTextCB\nPor favor reveja o acordo da licena antes de desinstalar o $(^NameDA). Se voc aceita todos os termos do acordo, clique na caixa de seleo abaixo. $_CLICK\n# ^UnLicenseTextRB\nPor favor reveja o acordo da licena antes de desinstalar o $(^NameDA). Se voc aceita todos os termos do acordo, selecione a primeira opo abaixo. $_CLICK\n# ^Custom\nPersonalizado\n# ^ComponentsText\nMarque os componentes que voc quer instalar e desmarque os componentes que voc no quer instalar. $_CLICK\n# ^ComponentsSubText1\nSelecione o tipo de instalao:\n# ^ComponentsSubText2_NoInstTypes\nSelecione os componentes a instalar:\n# ^ComponentsSubText2\nOu, selecione os componentes opcionais que voc deseja instalar:\n# ^UnComponentsText\nMarque os componentes que voc quer desinstalar e desmarque os componentes que voc no quer desinstalar. $_CLICK\n# ^UnComponentsSubText1\nSelecione o tipo de desinstalao:\n# ^UnComponentsSubText2_NoInstTypes\nSelecione os componentes a desinstalar:\n# ^UnComponentsSubText2\nOu, selecione os componentes opcionais que voc deseja desinstalar:\n# ^DirText\nO Instalador instalar o $(^NameDA) na seguinte pasta. Para instalar em uma pasta diferente, clique em Procurar e selecione outra pasta. $_CLICK\n# ^DirSubText\nPasta Destino\n# ^DirBrowseText\nSelecione a pasta para instalar o $(^NameDA):\n# ^UnDirText\nO Instalador desinstalar o $(^NameDA) da seguinte pasta. Para desinstalar de uma pasta diferente, clique em Procurar e selecione outra pasta. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nSelecione a pasta de onde desinstalar o $(^NameDA):\n# ^SpaceAvailable\n\"Espao disponvel: \"\n# ^SpaceRequired\n\"Espao requerido: \"\n# ^UninstallingText\nO $(^NameDA) ser desinstalado da seguinte pasta. $_CLICK\n# ^UninstallingSubText\nDesinstalando de:\n# ^FileError\nErro ao abrir o arquivo para a gravao: \\r\\n\\r\\n$0\\r\\n\\r\\nClique em Abortar para parar a instalao,\\r\\nRepetir para tentar de novo, ou\\r\\nIgnorar para pular este arquivo.\n# ^FileError_NoIgnore\nErro ao abrir o arquivo para a gravao: \\r\\n\\r\\n$0\\r\\n\\r\\nClique em Repetir para tentar de novo, ou\\r\\nCancelar para parar a instalao.\n# ^CantWrite\n\"No pode escrever: \"\n# ^CopyFailed\nFalhou em copiar\n# ^CopyTo\n\"Copiar para \"\n# ^Registering\n\"Registrando: \"\n# ^Unregistering\n\"Desfazendo o registro: \"\n# ^SymbolNotFound\n\"No pde achar o smbolo: \"\n# ^CouldNotLoad\n\"No pde carregar: \"\n# ^CreateFolder\n\"Criar pasta: \"\n# ^CreateShortcut\n\"Criar atalho: \"\n# ^CreatedUninstaller\n\"Desinstalador criado: \"\n# ^Delete\n\"Apagar o arquivo: \"\n# ^DeleteOnReboot\n\"Apagar ao reiniciar: \"\n# ^ErrorCreatingShortcut\n\"Erro ao criar o atalho: \"\n# ^ErrorCreating\n\"Erro ao criar: \"\n# ^ErrorDecompressing\nErro ao descompactar os dados! Instalador corrompido?\n# ^ErrorRegistering\nErro ao registar a DLL\n# ^ExecShell\n\"Executar pelo Shell: \"\n# ^Exec\n\"Executar: \"\n# ^Extract\n\"Extrair: \"\n# ^ErrorWriting\n\"Extrair: erro ao gravar o arquivo \"\n# ^InvalidOpcode\nInstalador corrompido: opcode invlido\n# ^NoOLE\n\"Sem OLE para: \"\n# ^OutputFolder\n\"Pasta de sada: \"\n# ^RemoveFolder\n\"Remover a pasta: \"\n# ^RenameOnReboot\n\"Renomear ao reiniciar: \"\n# ^Rename\n\"Renomear: \"\n# ^Skipped\n\"Ignorado: \"\n# ^CopyDetails\nCopiar os Detalhes para a rea de Transferncia\n# ^LogInstall\nPr no Log o processo de instalao\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/PortugueseBR.nsh",
    "content": ";Language: Brazilian Portuguese (1046)\n;By Felipe\n\n!insertmacro LANGFILE \"PortugueseBR\" \"Portugus Brasileiro\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Bem-vindo ao Assistente de Instalao do $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Este assistente guiar voc atravs da instalao do $(^NameDA).$\\r$\\n$\\r$\\n recomendado que voc feche todos os outros aplicativos antes de iniciar o Instalador. Isto tornar possvel atualizar os arquivos de sistema relevantes sem ter que reiniciar seu computador.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Bem-vindo ao Assistente de Desinstalao do $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Este assistente guiar voc atravs da desinstalao do $(^NameDA).$\\r$\\n$\\r$\\nAntes de iniciar a desinstalao, tenha certeza de que o $(^NameDA) no est em execuo.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Acordo da licena\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Por favor, reveja os termos da licena antes de instalar o $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Se voc aceita os termos do acordo, clique em Eu Concordo para continuar. Voc deve aceitar o acordo para instalar o $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Se voc aceita os termos do acordo, clique na caixa de seleo abaixo. Voc deve aceitar o acordo para instalar o $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Se voc aceita os termos do acordo, selecione a primeira opo abaixo. Voc deve aceitar o acordo para instalar o $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Acordo da licena\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Por favor, reveja os termos da licena antes de desinstalar o $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Se voc aceita os termos do acordo, clique em Eu Concordo para continuar. Voc deve aceitar o acordo para desinstalar o $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Se voc aceita os termos do acordo, clique na caixa de seleo abaixo. Voc deve aceitar o acordo para desinstalar o $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Se voc aceita os termos do acordo, selecione a primeira opo abaixo. Voc deve aceitar o acordo para desinstalar o $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Pressione Page Down para ver o resto do acordo.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Escolher Componentes\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Escolha quais funes do $(^NameDA) voc quer instalar.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Escolher Componentes\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Escolha quais funes do $(^NameDA) voc quer desinstalar.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Descrio\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Posicione seu mouse sobre um componente para ver sua descrio.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Posicione seu mouse sobre um componente para ver sua descrio.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Escolher o Local da Instalao\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Escolha a pasta na qual instalar o $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Escolher o Local da Desinstalao\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Escolha a pasta da qual desinstalar o $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Instalando\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Por favor espere enquanto o $(^NameDA) est sendo instalado.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Instalao Completa\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"O Instalador completou com sucesso.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalao Abortada\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"O Instalador no completou com sucesso.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Desinstalando\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Por favor espere enquanto o $(^NameDA) est sendo desinstalado.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Desinstalao Completa\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"A desinstalao foi completada com sucesso.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Desinstalao Abortada\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"A desinstalao no foi completada com sucesso.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Completando o Assistente de Instalao do $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"O $(^NameDA) foi instalado no seu computador.$\\r$\\n$\\r$\\nClique em Terminar para fechar este assistente.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Seu computador deve ser reiniciado para completar a instalao do $(^NameDA). Voc quer reiniciar agora?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Completando o Assistente de Desinstalao do $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) foi desinstalado do seu computador.$\\r$\\n$\\r$\\nClique em Terminar para fechar este assistente.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Seu computador tem que ser reiniciado para completar a desinstalao do $(^NameDA). Voc quer reiniciar agora?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Reiniciar agora\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Eu quero reiniciar manualmente depois\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Executar $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Mostrar o Readme\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Terminar\"\n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Escolher a Pasta do Menu Iniciar\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Escolher uma pasta do Menu Iniciar para os atalhos do $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Selecione a pasta do Menu Iniciar na qual voc gostaria de criar os atalhos do programa. Voc pode tambm inserir um nome para criar uma nova pasta.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"No criar atalhos\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Desinstalar o $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Remover o $(^NameDA) do seu computador.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Voc tem certeza de que quer sair do Instalador do $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Voc tem certeza de que quer sair da Desinstalao do $(^Name)?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Escolher Usurios\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Escolher para quais usurios voc quer instalar o $(^NameDA).\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Selecione se voc quer instalar o $(^NameDA) para si mesmo ou para todos os usurios deste computador. $(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Instalar para qualquer um usando este computador\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Instalar apenas para mim\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Romanian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1048\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1250\n# RTL - anything else than RTL means LTR\n-\n# Translation by Cristian Pirvu (pcristip@yahoo.com) v6\n# Revision by Sorin Sbarnea (sorin@intersol.ro)      v5.1\n# and Sorin Sbarnea INTERSOL SRL (sorin@intersol.ro) v4\n# New revision by George Radu (georadu@hotmail.com)\n# New revision by Iulian Dogariu (iulian@jayomega.net)\n#   - Use Romanian letters \n#   - Use imperative forms on buttons\n#   - Replace some neologisms\n# New revision by Vlad Rusu (vlad@bitattack.ro)\n#\t- \"Rasfoiete\" replaced with \"Alege\" - more appropiate\n#\t- \"Elimin\" related terms replaced with more appropiate \"Dezinstaleaz\"\n#\t- Fixed: Wrong translation in ^FileError and ^FileError_NoIgnore -> no translation\n#\t  needed Abort/Retry/Ignore, as these are not translated into local language, OS related\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\nInstalare $(^Name)\n# ^UninstallCaption\nDezinstalare $(^Name)\n# ^LicenseSubCaption\n: Contract de licen\n# ^ComponentsSubCaption\n: Opiuni instalare\n# ^DirSubCaption\n: Directorul destinaie\n# ^InstallingSubCaption\n: n curs de instalare\n# ^CompletedSubCaption\n: Instalare terminat\n# ^UnComponentsSubCaption\n: Opiuni dezinstalare\n# ^UnDirSubCaption\n: Directorul de dezinstalare\n# ^ConfirmSubCaption\n: Confirm\n# ^UninstallingSubCaption\n: n curs de dezinstalare\n# ^UnCompletedSubCaption\n: Termin\n# ^BackBtn\n< na&poi\n# ^NextBtn\nna&inte >\n# ^AgreeBtn\n&De acord\n# ^AcceptBtn\n&Accept termenii contractului de licen\n# ^DontAcceptBtn\nNu accept termenii contractului de licen\n# ^InstallBtn\n&Instaleaz\n# ^UninstallBtn\n&Dezinstaleaz\n# ^CancelBtn\n&Renun\n# ^CloseBtn\nn&chide\n# ^BrowseBtn\n&Alege...\n# ^ShowDetailsBtn\nArat &detalii\n# ^ClickNext\nApsai nainte pentru a continua.\n# ^ClickInstall\nApsai Instaleaz pentru a ncepe instalarea.\n# ^ClickUninstall\nApsai Dezinstaleaz pentru a ncepe dezinstalarea.\n# ^Name\nNume\n# ^Completed\nTerminat\n# ^LicenseText\nCitii cu atenie contractul de licen nainte de a instala $(^NameDA). Dac acceptai termenii contractului de licen, apsai butonul De acord.\n# ^LicenseTextCB\nCitii cu atenie contractul de licen nainte de a instala $(^NameDA). Dac acceptai termenii contractului de licen, bifai csua de mai jos. $_CLICK\n# ^LicenseTextRB\nCitii cu atenie contractul de licen nainte de a instala $(^NameDA). Dac acceptai termenii contractului de licen, selectai prima opiune de mai jos. $_CLICK\n# ^UnLicenseText\nCitii cu atenie contractul de licen nainte de a dezinstala $(^NameDA). Dac acceptai termenii contractului de licen, apsai butonul De acord.\n# ^UnLicenseTextCB\nCitii cu atenie contractul de licen nainte de a dezinstala $(^NameDA). Dac acceptai termenii contractului de licen, bifai csua de mai jos. $_CLICK\n# ^UnLicenseTextRB\nCitii cu atenie contractul de licen nainte de a dezinstala $(^NameDA). Dac acceptai termenii contractului de licen, selectai prima opiune de mai jos. $_CLICK\n# ^Custom\nPersonalizat\n# ^ComponentsText\nAlegei componentele pe care dorii s le instalai. $_CLICK\n# ^ComponentsSubText1\nAlegei tipul instalrii:\n# ^ComponentsSubText2_NoInstTypes\nAlegei componentele ce urmeaz a fi instalate:\n# ^ComponentsSubText2\nSau, alegei componentele opionale pe care dorii s le instalai:\n# ^UnComponentsText\nAlegei componentele pe care dorii s le dezinstalai. $_CLICK\n# ^UnComponentsSubText1\nAlegei tipul de dezinstalare:\n# ^UnComponentsSubText2_NoInstTypes\nAlegei componentele ce urmeaz a fi dezinstalate:\n# ^UnComponentsSubText2\nSau, alegei componentele opionale pe care dorii s le dezinstalai:\n# ^DirText\n$(^NameDA) se va instala n urmtorul director. Pentru a alege alt destinaie, apsai Alege i alegei alt director. $_CLICK\n# ^DirSubText\nDirector destinaie\n# ^DirBrowseText\nAlegei directorul n care dorii s instalai $(^NameDA):\n# ^UnDirText\n$(^NameDA) se va dezinstala din urmtorul director. Pentru a dezinstala din alt director, apsai Alege i alegei alt director. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nAlegei directorul de dezinstalare al $(^NameDA):\n# ^SpaceAvailable\n\"Spaiu disponibil: \"\n# ^SpaceRequired\n\"Spaiu necesar: \"\n# ^UninstallingText\nAceast aplicaie va dezinstala $(^NameDA) din computerul Dv. $_CLICK\n# ^UninstallingSubText\nDezinstalare din:\n# ^FileError\nEroare la scrierea fiierului: \\r\\n\\t\"$0\"\\r\\nApsai Abort pentru oprirea instalrii,\\r\\nRetry pentru a mai ncerca o dat scrierea fiierului, \\r\\nIgnore pentru a trece peste acest fiier.\n# ^FileError_NoIgnore\nEroare la scrierea fiierului: \\r\\n\\t\"$0\"\\r\\nApsai Retry pentru a mai ncerca o dat, sau\\r\\nAbort pentru oprirea instalrii.\n# ^CantWrite\n\"Nu am putut scrie: \"\n# ^CopyFailed\nCopierea a euat\n# ^CopyTo\n\"Copiere n \"\n# ^Registering\n\"Se nregistreaz: \"\n# ^Unregistering\n\"Se deznregistreaz din registru: \"\n# ^SymbolNotFound\n\"Simbolul nu a fost gsit: \"\n# ^CouldNotLoad\n\"Nu am putut ncrca: \"\n# ^CreateFolder\n\"Creare director: \"\n# ^CreateShortcut\n\"Creare comand rapid: \"\n# ^CreatedUninstaller\n\"S-a creat aplicaia de dezinstalare: \"\n# ^Delete\n\"tergere fiier: \"\n# ^DeleteOnReboot\n\"tergere la repornire: \"\n# ^ErrorCreatingShortcut\n\"Eroare la crearea comenzii rapide: \"\n# ^ErrorCreating\n\"Eroare la creare: \"\n# ^ErrorDecompressing\nEroare la dezarhivarea datelor! Aplicatia de instalare este defect?\n# ^ErrorRegistering\nEroare la nregistrarea DLL-ului\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Executare: \"\n# ^Extract\n\"Extragere: \"\n# ^ErrorWriting\n\"Extragere: eroare la scriere n fiier \"\n# ^InvalidOpcode\nAplicaie de instalare defect: opcode incorect\n# ^NoOLE\n\"Nu exist OLE pentru: \"\n# ^OutputFolder\n\"Directorul destinaie: \"\n# ^RemoveFolder\n\"tergere destinaie: \"\n# ^RenameOnReboot\n\"Redenumire la repornirea computerului: \"\n# ^Rename\n\"Redenumire: \"\n# ^Skipped\n\"Srite: \"\n# ^CopyDetails\nCopiere detalii n clipboard\n# ^LogInstall\nJurnal proces instalare\n# ^Byte\nO\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Romanian.nsh",
    "content": ";Language: Romanian (1048)\n;Translated by Cristian Pirvu (pcristip@yahoo.com)\n;Updates by Sorin Sbarnea - INTERSOL SRL (sbarneasorin@intersol.ro) - ROBO Design (www.robodesign.ro)\n;New revision by George Radu (georadu@hotmail.com) http://mediatae.3x.ro\n;New revision by Vlad Rusu (vlad@bitattack.ro)\n;\t- Use Romanian letters \n;\t- \".. produsului\" removed as unnecessary\n;\t- \"Elimin\" related terms replaced with more appropiate \"Dezinstaleaz\"\n;\t- Misc language tweaks\n!insertmacro LANGFILE \"Romanian\" \"Romana\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Bine ai venit la instalarea $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Aceast aplicaie va instala $(^NameDA).$\\r$\\n$\\r$\\nEste recomandat s nchidei toate aplicaiile nainte de nceperea procesului de instalare. Acest lucru v poate asigura un proces de instalare fr erori sau situaii neprevzute.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Bine ai venit la dezinstalarea $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Aceast aplicaie va dezinstala $(^NameDA).$\\r$\\n$\\r$\\nEste recomandat s nchidei toate aplicaiile nainte de nceperea procesului de dezinstalare. Acest lucru v poate asigura un proces de dezinstalare fr erori sau situaii neprevzute.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_WELCOMEPAGE | MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Terminare\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Contract de licen\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Citii cu atenie termenii contractului de licen nainte de a instala $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Dac acceptai termenii contractului de licen, apsati De Acord. Pentru a instala $(^NameDA) trebuie s acceptai termenii din contractul de licen.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Dac acceptai termenii contractului de licen, bifai csua de mai jos. Pentru a instala $(^NameDA) trebuie s acceptai termenii din contractul de licen. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Dac acceptai termenii contractului de licen, selectai prima opiune de mai jos. Pentru a instala $(^NameDA) trebuie s acceptai termenii din contractul de licen. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Contract de licen\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Citii cu atenie termenii contractului de licen nainte de a dezinstala $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Dac acceptai termenii contractului de licen, apsati De Acord. Pentru a dezinstala $(^NameDA) trebuie s acceptai termenii din contractul de licen.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Dac acceptai termenii contractului de licen, bifai csua de mai jos. Pentru a dezinstala $(^NameDA) trebuie s acceptai termenii din contractul de licen. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Dac acceptai termenii contractului de licen, selectai prima opiune de mai jos. Pentru a dezinstala $(^NameDA) trebuie s acceptai termenii din contractul de licen. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Apsai Page Down pentru a vizualiza restul contractului de licen.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Selectare componente\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Selectai componentele $(^NameDA) pe care dorii s le instalai.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Selectare componente\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Selectai componentele $(^NameDA) pe care dorii s le dezinstalai.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Descriere\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Aezai mouse-ul deasupra fiecrei componente pentru a vizualiza descrierea acesteia.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Aezai mouse-ul deasupra fiecrei componente pentru a vizualiza descrierea acesteia.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Selectare director destinaie\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Selectai directorul n care dorii s instalai $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Selectare director de dezinstalat\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Selectai directorul din care dorii s dezinstalai $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"n curs de instalare\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"V rugm s ateptai, $(^NameDA) se instaleaz.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Instalare terminat\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Instalarea s-a terminat cu succes.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalare anulat\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Instalarea a fost anulat de utilizator.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"n curs de dezinstalare\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"V rugm s ateptai, $(^NameDA) se dezinstaleaz.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Dezinstalare terminat\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Dezinstalarea s-a terminat cu succes.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Dezinstalare anulat\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Dezinstalarea fost anulat de utilizator.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Terminare instalare $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) a fost instalat.$\\r$\\n$\\r$\\nApsai Terminare pentru a ncheia instalarea.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Trebuie s repornii calculatorul pentru a termina instalarea. Dorii s-l repornii acum?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Terminare dezinstalare $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) a fost dezinstalat.$\\r$\\n$\\r$\\nApsai Terminare pentru a ncheia dezinstalarea.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Trebuie s repornii calculatorul pentru a termina dezinstalarea. Dorii s-l repornii acum?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Repornete acum\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Repornesc eu mai trziu\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"Executare $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Afiare fiier readme (citete-m).\"\n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Selectare grup Meniul Start\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Selectai un grup in Meniul Start pentru a crea comenzi rapide pentru produs.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Selectai grupul din Meniul Start n care vor fi create comenzi rapide pentru produs. Putei de asemenea s creai un grup nou.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Nu doresc comenzi rapide\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Dezinstalare $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Dezinstalare $(^NameDA) din calculatorul dumneavoastr.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Suntei sigur() c dorii s anulai instalarea $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Suntei sigur() c dorii s anulai dezinstalarea $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Russian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1049\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1251\n# RTL - anything else than RTL means LTR\n-\n# Translation by Timon [ timon@front.ru ] + 20030919\n# Translation updated by Dmitry Yerokhin [erodim@mail.ru] (050424)\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n $(^Name)\n# ^UninstallCaption\n $(^Name)\n# ^LicenseSubCaption\n:  \n# ^ComponentsSubCaption\n:  \n# ^DirSubCaption\n:  \n# ^InstallingSubCaption\n:  \n# ^CompletedSubCaption\n:  \n# ^UnComponentsSubCaption\n:  \n# ^UnDirSubCaption\n:  \n# ^ConfirmSubCaption\n: \n# ^UninstallingSubCaption\n:  \n# ^UnCompletedSubCaption\n:  \n# ^BackBtn\n< &\n# ^NextBtn\n& >\n# ^AgreeBtn\n&\n# ^AcceptBtn\n &  \n# ^DontAcceptBtn\n &   \n# ^InstallBtn\n&\n# ^UninstallBtn\n&\n# ^CancelBtn\n\n# ^CloseBtn\n&\n# ^BrowseBtn\n& ...\n# ^ShowDetailsBtn\n&...\n# ^ClickNext\n  ''  .\n# ^ClickInstall\n  '',   .\n# ^ClickUninstall\n  '',   .\n# ^Name\n\n# ^Completed\n\n# ^LicenseText\n  $(^NameDA)    .     ,   ''.\n# ^LicenseTextCB\n  $(^NameDA)    .     ,   . $_CLICK\n# ^LicenseTextRB\n  $(^NameDA)    .     ,      . $_CLICK\n# ^UnLicenseText\n  $(^NameDA)    .     ,   ''.\n# ^UnLicenseTextCB\n  $(^NameDA)    .     ,   . $_CLICK\n# ^UnLicenseTextRB\n  $(^NameDA)    .     ,      . $_CLICK\n# ^Custom\n \n# ^ComponentsText\n  ,    . $_CLICK\n# ^ComponentsSubText1\n  :\n# ^ComponentsSubText2_NoInstTypes\n    :\n# ^ComponentsSubText2\n     :\n# ^UnComponentsText\n ,    . $_CLICK\n# ^UnComponentsSubText1\n  :\n# ^UnComponentsSubText2_NoInstTypes\n   :\n# ^UnComponentsSubText2\n     :\n# ^DirText\n  $(^NameDA)   .      ,   ''   . $_CLICK\n# ^DirSubText\n \n# ^DirBrowseText\n    $(^NameDA):\n# ^UnDirText\n  $(^NameDA)   .      ,   ''   . $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n ,     $(^NameDA):\n# ^SpaceAvailable\n\"  : \"\n# ^SpaceRequired\n\"  : \"\n# ^UninstallingText\n $(^NameDA)     . $_CLICK\n# ^UninstallingSubText\n :\n# ^FileError\n    : \\r\\n\\t\"$0\"\\r\\n'':  ;\\r\\n\"\":  ;\\r\\n\"\":   .\n# ^FileError_NoIgnore\n    : \\r\\n\\t\"$0\"\\r\\n'':  ;\\r\\n'':   .\n# ^CantWrite\n\" : \"\n# ^CopyFailed\n  \n# ^CopyTo\n\"  \"\n# ^Registering\n\": \"\n# ^Unregistering\n\"-: \"\n# ^SymbolNotFound\n\"  : \"\n# ^CouldNotLoad\n\" : \"\n# ^CreateFolder\n\" : \"\n# ^CreateShortcut\n\" : \"\n# ^CreatedUninstaller\n\"  : \"\n# ^Delete\n\" : \"\n# ^DeleteOnReboot\n\"   : \"\n# ^ErrorCreatingShortcut\n\"  : \" \n# ^ErrorCreating\n\" : \"\n# ^ErrorDecompressing\n  ! ,  .\n# ^ErrorRegistering\n   (DLL)\n# ^ExecShell\n\"  : \" \n# ^Exec\n\": \"\n# ^Extract\n\": \"\n# ^ErrorWriting\n\":    \"\n# ^InvalidOpcode\n :  \n# ^NoOLE\n\" OLE : \" \n# ^OutputFolder\n\" : \"\n# ^RemoveFolder\n\" : \"\n# ^RenameOnReboot\n\"   : \"\n# ^Rename\n\": \"\n# ^Skipped\n\": \"\n# ^CopyDetails\n     \n# ^LogInstall\n  \n# byte\n\n# kilo\n \n# mega\n \n# giga\n "
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Russian.nsh",
    "content": ";Language: Russian (1049)\n;Translation updated by Dmitry Yerokhin [erodim@mail.ru] (050424)\n\n!insertmacro LANGFILE \"Russian\" \"Russian\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"    $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"   $(^NameDA)   .$\\r$\\n$\\r$\\n       .          .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"    $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"   $(^NameDA)   .$\\r$\\n$\\r$\\n   ,   $(^NameDA)  .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"  $(^NameDA)    .\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"    ,   $\\\"$\\\".   ,   .\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"    ,   .   ,   . $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"    ,      .   ,   . $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"  $(^NameDA)    .\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"    ,   $\\\"$\\\".     . $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"    ,   .     . $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"    ,      .     . $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"      $\\\"PageUp$\\\"  $\\\"PageDown$\\\".\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"  $(^NameDA),    .\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"  $(^NameDA),    .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"     ,    .\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"     ,    .\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"  \"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"    $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"   \"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \" ,     $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \" \"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \",    $(^NameDA)...\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \" \"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"  .\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"  .\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \",    $(^NameDA)...\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"   .\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"   .\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"    $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \" $(^NameDA) .$\\r$\\n$\\r$\\n  $\\\"$\\\"     .\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"   $(^NameDA)   .    ?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"    $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \" $(^NameDA)    .$\\r$\\n$\\r$\\n  $\\\"$\\\"    .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"   $(^NameDA)   .    ?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \",   \"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \",    \"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"& $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&  ReadMe\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"   $\\\"$\\\"\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"    $\\\"$\\\"    .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"    $\\\"$\\\",     .       .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"  \"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \" $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \" $(^NameDA)  .\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"     $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"     $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Serbian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n3098\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1251\n# RTL - anything else than RTL means LTR\n-\n# Translation by   <obucina@srpskijezik.edu.yu>\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) \n# ^UninstallCaption\n$(^Name) \n# ^LicenseSubCaption\n:    \n# ^ComponentsSubCaption\n:  \n# ^DirSubCaption\n:    \n# ^InstallingSubCaption\n: \n# ^CompletedSubCaption\n:  \n# ^UnComponentsSubCaption\n:  \n# ^UnDirSubCaption\n:    \n# ^ConfirmSubCaption\n: \n# ^UninstallingSubCaption\n: \n# ^UnCompletedSubCaption\n:  \n# ^BackBtn\n< \n# ^NextBtn\n >\n# ^AgreeBtn\n\n# ^AcceptBtn\n     \n# ^DontAcceptBtn\n      \n# ^InstallBtn\n\n# ^UninstallBtn\n\n# ^CancelBtn\n\n# ^CloseBtn\n\n# ^BrowseBtn\n...\n# ^ShowDetailsBtn\n\n# ^ClickNext\n    .\n# ^ClickInstall\n  ༓   .\n# ^ClickUninstall\n  ༓   .\n# ^Name\n\n# ^Completed\n\n# ^LicenseText\n         $(^NameDA).     ,   .\n# ^LicenseTextCB\n         $(^NameDA).     ,   . $_CLICK\n# ^LicenseTextRB\n         $(^NameDA).     ,    . $_CLICK\n# ^UnLicenseText\n         $(^NameDA).     ,   .\n# ^UnLicenseTextCB\n         $(^NameDA).     ,   . $_CLICK\n# ^UnLicenseTextRB\n         $(^NameDA).     ,    . $_CLICK\n# ^Custom\n\n# ^ComponentsText\n   .     . $_CLICK\n# ^ComponentsSubText1\n  :\n# ^ComponentsSubText2_NoInstTypes\n   : \n# ^ComponentsSubText2\n,       : \n# ^UnComponentsText\n   .     . $_CLICK\n# ^UnComponentsSubText1\n  : \n# ^UnComponentsSubText2_NoInstTypes\n   : \n# ^UnComponentsSubText2\n,       : \n# ^DirText\n $(^NameDA)      .        ...   . $_CLICK\n# ^DirSubText\n\n# ^DirBrowseText\n       $(^NameDA):\n# ^UnDirText\n $(^NameDA)      .        ...   . $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n       $(^NameDA):\n# ^SpaceAvailable\n\" : \"\n# ^SpaceRequired\n\" : \"\n# ^UninstallingText\n $(^NameDA)      . $_CLICK\n# ^UninstallingSubText\n : \n# ^FileError\n     : \\r\\n\\t\"$0\"\\r\\n     ,\\r\\n      , \\r\\n    .\n# ^FileError_NoIgnore\n     : \\r\\n\\t\"$0\"\\r\\n        , \\r\\n   .\n# ^CantWrite\n\" : \"\n# ^CopyFailed\n \n# ^CopyTo\n\"  \"\n# ^Registering\n\": \"\n# ^Unregistering\n\": \"\n# ^SymbolNotFound\n\"  : \"\n# ^CouldNotLoad\n\" : \"\n# ^CreateFolder\n\" : \"\n# ^CreateShortcut\n\" : \"\n# ^CreatedUninstaller\n\" : \"\n# ^Delete\n\" : \"\n# ^DeleteOnReboot\n\"  : \"\n# ^ErrorCreatingShortcut\n\"   : \"\n# ^ErrorCreating\n\"  : \"\n# ^ErrorDecompressing\n   !   ?\n# ^ErrorRegistering\n   \n# ^ExecShell\n\"  : \"\n# ^Exec\n\": \"\n# ^Extract\n\": \"\n# ^ErrorWriting\n\":      \"\n# ^InvalidOpcode\n  :   \n# ^NoOLE\n\" OLE  : \"\n# ^OutputFolder\n\" : \"\n# ^RemoveFolder\n\" : \"\n# ^RenameOnReboot\n\"  : \"\n# ^Rename\n\": \"\n# ^Skipped\n\": \"\n# ^CopyDetails\n   \n# ^LogInstall\n    \n# ^Byte\nB\n# ^Kilo\nk\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Serbian.nsh",
    "content": ";Language: Serbian (3098)\n;Translation by   <obucina@srpskijezik.edu.yu>\n\n!insertmacro LANGFILE \"Serbian\" \"Serbian Cyrillic\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"      $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"      $(^NameDA).$\\r$\\n$\\r$\\n         .            .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"    $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"      $(^NameDA).$\\r$\\n$\\r$\\n  ,      $(^NameDA) . $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"   \"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"         $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"    ,     .        $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"    ,   .        $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"    ,    .        $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"   \"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"         $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"    ,     .        $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"    ,   .        $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"    ,    .        $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \" Page Down     .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"   \"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"   .     .\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"   \"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"   .     .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"          .\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"          .\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"   \"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"       $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"   a\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"       $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"    $(^NameDA) .\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \" \"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"   .\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"      .\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"    $(^NameDA) .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"   .\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"      .\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"   $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \" $(^NameDA)    .$\\r$\\n$\\r$\\n  ༓    .\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"           $(^NameDA)  .      ?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"   $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \" $(^NameDA)    .$\\r$\\n$\\r$\\n  ༓    .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"           $(^NameDA)  .      ?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"   \"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"  \"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"  $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"  \"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"    \"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"         .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"            .        .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"  \"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"  $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"  $(^NameDA)  .\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"      $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"      $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/SerbianLatin.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n2074\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1250\n# RTL - anything else than RTL means LTR\n-\n# Translation by Sran Obuina <obucina@srpskijezik.edu.yu>\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) Instalacija\n# ^UninstallCaption\n$(^Name) Deinstalacija\n# ^LicenseSubCaption\n: Dogovor o pravu korienja\n# ^ComponentsSubCaption\n: Opcije instalacije\n# ^DirSubCaption\n: Izbor foldera za instalaciju\n# ^InstallingSubCaption\n: Instalacija\n# ^CompletedSubCaption\n: Zavrena instalacija\n# ^UnComponentsSubCaption\n: Opcije deinstalacije\n# ^UnDirSubCaption\n: Izbor foldera za deinstalaciju\n# ^ConfirmSubCaption\n: Potvrivanje\n# ^UninstallingSubCaption\n: Deinstalacija\n# ^UnCompletedSubCaption\n: Zavrena deinstalacija\n# ^BackBtn\n< Nazad\n# ^NextBtn\nNapred >\n# ^AgreeBtn\nPrihvatam\n# ^AcceptBtn\nPrihvatam uslove dogovora o pravu korienja\n# ^DontAcceptBtn\nNe prihvatam uslove dogovora o pravu korienja\n# ^InstallBtn\nInstaliraj\n# ^UninstallBtn\nDeinstaliraj\n# ^CancelBtn\nOdustani\n# ^CloseBtn\nZatvori\n# ^BrowseBtn\nIzbor...\n# ^ShowDetailsBtn\nDetalji\n# ^ClickNext\nPritisnite dugme Napred za nastavak.\n# ^ClickInstall\nPritisnite dugme Instaliraj za poetak instalacije.\n# ^ClickUninstall\nPritisnite dugme Deinstaliraj za poetak deinstalacije.\n# ^Name\nIme\n# ^Completed\nZavreno\n# ^LicenseText\nPalivo proitajte dogovor o pravu korienja pre instalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, pritisnite dugme Prihvatam.\n# ^LicenseTextCB\nPalivo proitajte dogovor o pravu korienja pre instalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, obeleite kvadrati ispod. $_CLICK\n# ^LicenseTextRB\nPalivo proitajte dogovor o pravu korienja pre instalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. $_CLICK\n# ^UnLicenseText\nPalivo proitajte dogovor o pravu korienja pre deinstalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, pritisnite dugme Prihvatam.\n# ^UnLicenseTextCB\nPalivo proitajte dogovor o pravu korienja pre deinstalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, obeleite kvadrati ispod. $_CLICK\n# ^UnLicenseTextRB\nPalivo proitajte dogovor o pravu korienja pre deinstalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. $_CLICK\n# ^Custom\nPrilagoavanje\n# ^ComponentsText\nIzaberite komponente za instalaciju. Instaliraju se samo oznaene komponente. $_CLICK\n# ^ComponentsSubText1\nIzaberite tip instalacije:\n# ^ComponentsSubText2_NoInstTypes\nIzaberite komponente za instalaciju: \n# ^ComponentsSubText2\nIli, izaberite opcione komponente koje elite da instalirate: \n# ^UnComponentsText\nIzaberite komponente za deinstalaciju. Deinstaliraju se samo oznaene komponente. $_CLICK\n# ^UnComponentsSubText1\nIzaberite tip deinstalacije: \n# ^UnComponentsSubText2_NoInstTypes\nIzaberite komponente za deinstalaciju: \n# ^UnComponentsSubText2\nIli, izaberite opcione komponente koje elite da deinstalirate: \n# ^DirText\nProgram $(^NameDA) e biti instaliran u navedeni folder. Za instalaciju u drugi folder pritisnite dugme Izbor... i izaberite folder. $_CLICK\n# ^DirSubText\nFolder\n# ^DirBrowseText\nIzaberite folder u koji ete instalirati program $(^NameDA):\n# ^UnDirText\nProgram $(^NameDA) e biti deinstaliran iz navedenog foldera. Za deinstalaciju iz drugog foldera pritisnite dugme Izbor... i izaberite folder. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nIzaberite folder iz koga ete deinstalirati program $(^NameDA):\n# ^SpaceAvailable\n\"Slobodan prostor: \"\n# ^SpaceRequired\n\"Potreban prostor: \"\n# ^UninstallingText\nProgram $(^NameDA) e biti deinstaliran iz navedenog foldera. $_CLICK\n# ^UninstallingSubText\nDeinstalacija iz: \n# ^FileError\nGreka pri otvaranju fajla za pisanje: \\r\\n\\t\"$0\"\\r\\nPritisnite dugme Odustani za prekid instalacije,\\r\\nPonovi za ponovni pokuaj pisanja u fajl, ili\\r\\nIgnorii za preskakanje ovog fajla.\n# ^FileError_NoIgnore\nGreka pri otvaranju fajla za pisanje: \\r\\n\\t\"$0\"\\r\\nPritisnite dugme Ponovi za ponovni pokuaj pisanja u fajl, ili\\r\\nOdustani za prekid instaliranja.\n# ^CantWrite\n\"Nemogue pisanje: \"\n# ^CopyFailed\nNeuspeno kopiranje\n# ^CopyTo\n\"Kopiranje u \"\n# ^Registering\n\"Registrovanje: \"\n# ^Unregistering\n\"Deregistrovanje: \"\n# ^SymbolNotFound\n\"Simbol nije naen: \"\n# ^CouldNotLoad\n\"Nemogue uitavanje: \"\n# ^CreateFolder\n\"Kreiranje foldera: \"\n# ^CreateShortcut\n\"Kreiranje preice: \"\n# ^CreatedUninstaller\n\"Kreiranje deinstalera: \"\n# ^Delete\n\"Brisanje fajla: \"\n# ^DeleteOnReboot\n\"Brisanje pri restartu: \"\n# ^ErrorCreatingShortcut\n\"Greka pri kreiranju preice: \"\n# ^ErrorCreating\n\"Greka pri kreiranju: \"\n# ^ErrorDecompressing\nGreka pri otpakivanju podataka! Oteen instalacioni program?\n# ^ErrorRegistering\nGreka pri registrovanju biblioteke\n# ^ExecShell\n\"Izvravanje u okruenju: \"\n# ^Exec\n\"Izvravanje: \"\n# ^Extract\n\"Otpakivanje: \"\n# ^ErrorWriting\n\"Otpakivanje: greka pri upisu u fajl \"\n# ^InvalidOpcode\nOteen instalacioni program: neispravna komanda \n# ^NoOLE\n\"Nema OLE podrke za: \"\n# ^OutputFolder\n\"Izlazni folder: \"\n# ^RemoveFolder\n\"Brisanje foldera: \"\n# ^RenameOnReboot\n\"Preimenovanje pri restartu: \"\n# ^Rename\n\"Preimenovan: \"\n# ^Skipped\n\"Preskoen: \"\n# ^CopyDetails\nKopiraj detalje u klipbord\n# ^LogInstall\nVodi zapisnik o procesu instalacije\n# ^Byte\nB\n# ^Kilo\nk\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/SerbianLatin.nsh",
    "content": ";Language: Serbian Latin (2074)\n;Translation by Sran Obuina <obucina@srpskijezik.edu.yu>\n\n!insertmacro LANGFILE \"SerbianLatin\" \"Serbian Latin\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Dobrodoli u vodi za instalaciju programa $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Biete voeni kroz proces instalacije programa $(^NameDA).$\\r$\\n$\\r$\\nPreporuljivo je da iskljuite sve druge programe pre poetka instalacije. Ovo moe omoguiti auriranje sistemskih fajlova bez potrebe za ponovnim pokretanjem raunara.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Dobrodoli u deinstalaciju programa $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Biete voeni kroz proces deinstalacije programa $(^NameDA).$\\r$\\n$\\r$\\nPre poetka deinstalacije, uverite se da je program $(^NameDA) iskljuen. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Dogovor o pravu korienja\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Paljivo proitajte dogovor o pravu korienja pre instalacije programa $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Ako prihvatate sve uslove dogovora, pritisnite dugme Prihvatam za nastavak. Morate prihvatiti dogovor da biste instalirali program $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Ako prihvatate sve uslove dogovora, obeleite kvadrati ispod. Morate prihvatiti dogovor da biste instalirali program $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. Morate prihvatiti dogovor da biste instalirali program $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Dogovor o pravu korienja\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Palivo proitajte dogovor o pravu korienja pre deinstalacije programa $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Ako prihvatate sve uslove dogovora, pritisnite dugme Prihvatam za nastavak. Morate prihvatiti dogovor da biste deinstalirali program $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Ako prihvatate sve uslove dogovora, obeleite kvadrati ispod. Morate prihvatiti dogovor da biste deinstalirali program $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. Morate prihvatiti dogovor da biste deinstalirali program $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Pritisnite Page Down da biste videli ostatak dogovora.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Izbor komponenti za instalaciju\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Izaberite komponente za instalaciju. Instaliraju se samo oznaene komponente.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Izbor komponenti za deinstalaciju\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Izaberite komponente za deinstalaciju. Deinstaliraju se samo oznaene komponente.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Opis\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Preite kursorom mia preko imena komponente da biste videli njen opis.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Preite kursorom mia preko imena komponente da biste videli njen opis.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Izbor foldera za instalaciju\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Izaberite folder u koji ete instalirati program $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Izbor foldera za deinstalaciju\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Izaberite folder iz koga ete deinstalirati program $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Instalacija\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Saekajte dok se program $(^NameDA) instalira.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Zavrena instalacija\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Instalacija je uspeno zavrena.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Prekinuta instalacija\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Instalacija je prekinuta i nije uspeno zavrena.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Deinstalacija\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Saekajte dok se program $(^NameDA) deinstalira.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Zavrena deinstalacija\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Deinstalacija je uspeno zavrena.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Prekinuta deinstalacija\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Deinstalacija je prekinuta i nije uspeno zavrena.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Zavrena instalacija programa $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"Program $(^NameDA) je instaliran na raunar.$\\r$\\n$\\r$\\nPritisnite dugme Kraj za zatvaranje ovog prozora.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Raunar mora biti ponovo pokrenut da bi se proces instalacije programa $(^NameDA) uspeno zavrio. elite li to odmah da uradite?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Zavrena deinstalacija programa $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"Program $(^NameDA) je deinstaliran sa raunara.$\\r$\\n$\\r$\\nPritisnite dugme Kraj za zatvaranje ovog prozora.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Raunar mora biti ponovo pokrenut da bi se proces deinstalacije programa $(^NameDA) uspeno zavrio. elite li to da uradite odmah?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Odmah ponovo pokreni raunar\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Bez ponovnog pokretanja\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"Pokreni program $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"Prikai ProitajMe fajl\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"Kraj\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Izbor foldera u Start meniju\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Izaberite folder u Start meniju u kome ete kreirati preice.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Izaberite folder u Start meniju u kome elite da budu kreirane preice programa. Moete upisati i ime za kreiranje novog foldera.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Bez kreiranja preica\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Deinstalacija programa $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Deinstalacija programa $(^NameDA) sa raunara.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Sigurno elite da prekinete instalaciju programa $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Sigurno elite da prekinete deinstalaciju programa $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/SimpChinese.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n2052\n# Font and size - dash (-) means default С\n\n9\n# Codepage - dash (-) means ANSI code page ANSI ҳ\n936\n# RTL - anything else than RTL means LTR д\n-\n# Translator: Kii Ali <kiiali@cpatch.org>;Revision date: 2004-12-15\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) װ\n# ^UninstallCaption\n$(^Name) ж\n# ^LicenseSubCaption\n: ֤Э\n# ^ComponentsSubCaption\n: װѡ\n# ^DirSubCaption\n: װļ\n# ^InstallingSubCaption\n: ڰװ\n# ^CompletedSubCaption\n: \n# ^UnComponentsSubCaption\n: жѡ\n# ^UnDirSubCaption\n: жļ\n# ^ConfirmSubCaption\n: ȷ\n# ^UninstallingSubCaption\n: ж\n# ^UnCompletedSubCaption\n: \n# ^BackBtn\n< һ(&P)\n# ^NextBtn\nһ(&N) >\n# ^AgreeBtn\nҽ(&I)\n# ^AcceptBtn\nҽܡ֤Э顱е(&A)\n# ^DontAcceptBtn\nҲܡ֤Э顱е(&N)\n# ^InstallBtn\nװ(&I)\n# ^UninstallBtn\nж(&U)\n# ^CancelBtn\nȡ(&C)\n# ^CloseBtn\nر(&L)\n# ^BrowseBtn\n(&B)...\n# ^ShowDetailsBtn\nʾϸ(&D)\n# ^ClickNext\n [һ(N)] \n# ^ClickInstall\n [װ(I)] ʼװ̡\n# ^ClickUninstall\n [ж(U)] ʼװ̡\n# ^Name\n\n# ^Completed\n\n# ^LicenseText\nڰװ $(^NameDA) ֮ǰ֤Э顣Э [ҽ(I)] \n# ^LicenseTextCB\nڰװ $(^NameDA) ֮ǰ֤Э顣Э·Ĺѡ $_CLICK\n# ^LicenseTextRB\nڰװ $(^NameDA) ֮ǰ֤Э顣Эѡ·ĵһѡ $_CLICK\n# ^UnLicenseText\nж $(^NameDA) ֮ǰ֤Э顣Э [ҽ(I)] \n# ^UnLicenseTextCB\nж $(^NameDA) ֮ǰ֤Э顣Э·Ĺѡ $_CLICK\n# ^UnLicenseTextRB\nж $(^NameDA) ֮ǰ֤Э顣Эѡ·ĵһѡ $_CLICK\n# ^Custom\nԶ\n# ^ComponentsText\nѡҪװѡ㲻ϣװ $_CLICK\n# ^ComponentsSubText1\nѡװ: \n# ^ComponentsSubText2_NoInstTypes\nѡװ: \n# ^ComponentsSubText2\nߣԶѡ밲װ: \n# ^UnComponentsText\nѡҪжصѡ㲻ϣжص $_CLICK\n# ^UnComponentsSubText1\nѡжص: \n# ^UnComponentsSubText2_NoInstTypes\nѡҪжص: \n# ^UnComponentsSubText2\nǣѡҪжصĿѡ: \n# ^DirText\nSetup װ $(^NameDA) ļСҪװͬļУ [(B)] ѡļС $_CLICK\n# ^DirSubText\nĿļ\n# ^DirBrowseText\nѡҪװ $(^NameDA) ļλ: \n# ^UnDirText\nSetup ж $(^NameDA) ļСҪжصͬļУ [(B)] ѡļС $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nѡҪж $(^NameDA) ļλ: \n# ^SpaceAvailable\n\"ÿռ: \"\n# ^SpaceRequired\n\"ռ: \"\n# ^UninstallingText\n򵼽ļж $(^NameDA)  $_CLICK\n# ^UninstallingSubText\nжĿ¼: \n# ^FileError\nܴҪдļ: \\r\\n\\t\"$0\"\\r\\n [Abort] װ\\r\\n [Retry] ³дļ\\r\\n [Ignore] ļ\n# ^FileError_NoIgnore\nܴҪдļ: \\r\\n\\t\"$0\"\\r\\n [Retry] ³дļ\\r\\n [Cancel] ȡװ\n# ^CantWrite\n\"޷д: \"\n# ^CopyFailed\n\"ʧ \"\n# ^CopyTo\n\"Ƶ: \"\n# ^Registering\n\"ע: \"\n# ^Unregistering\n\"ڽע: \"\n# ^SymbolNotFound\n\"޷ҵ: \"\n# ^CouldNotLoad\n\"޷: \"\n# ^CreateFolder\n\"ļ: \" \n# ^CreateShortcut\n\"ݷʽ: \"\n# ^CreatedUninstaller\n\"жس: \"\n# ^Delete\n\"ɾļ: \"\n# ^DeleteOnReboot\n\"ɾ: \"\n# ^ErrorCreatingShortcut\n\"ڴݷʽʱ: \"\n# ^ErrorCreating\n\"ڴʱ: \"\n# ^ErrorDecompressing\n\"ڽѹݷ𻵵İװ\"\n# ^ErrorRegistering\n\"ע DLL ʱ\"\n# ^ExecShell\n\"ⲿ: \"\n# ^Exec\n\": \"\n# ^Extract\n\"ȡ: \"\n# ^ErrorWriting\n\"ȡ: ޷дļ \"\n# ^InvalidOpcode\n\"װ: ЧĲ \"\n# ^NoOLE\n\"û OLE : \"\n# ^OutputFolder\n\"Ŀ¼: \"\n# ^RemoveFolder\n\"ƳĿ¼: \"\n# ^RenameOnReboot\n\": \"\n# ^Rename\n\": \"\n# ^Skipped\n\": \"\n# ^CopyDetails\n\"ϸڵ \"\n# ^LogInstall\n\"־װ\"\n# byte\nB\n# kilo\nK\n# mega\nM\n# giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/SimpChinese.nsh",
    "content": ";Language: 'Chinese (Simplified)' (2052)\n;Translator: Kii Ali <kiiali@cpatch.org>\n;Revision date: 2004-12-15\n;Verified by: QFox <qfox99@gmail.com>\n\n!insertmacro LANGFILE \"SimpChinese\" \"Chinese (Simplified)\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"ӭʹá$(^NameDA)װ\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"򵼽ָɡ$(^NameDA)İװ̡$\\r$\\n$\\r$\\nڿʼװ֮ǰȹرӦó⽫װ򡱸ָϵͳļҪļ$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"ӭʹá$(^NameDA)ж\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"򵼽ȫָ㡰$(^NameDA)жؽ̡$\\r$\\n$\\r$\\nڿʼж֮ǰȷϡ$(^NameDA)δеС$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"֤Э\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"ڰװ$(^NameDA)֮ǰĶȨЭ顣\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Эе [ҽ(I)] װѡ [ȡ(C)] װ򽫻رաЭܰװ$(^NameDA)\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Эе·Ĺѡ򡣱ҪЭܰװ $(^NameDA)$_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Эеѡ·һѡҪЭܰװ $(^NameDA)$_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"֤Э\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"жء$(^NameDA)֮ǰȨ\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Эе [ҽ(I)] жءѡ [ȡ(C)] װ򽫻رաҪЭжء$(^NameDA)\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Эе·Ĺѡ򡣱ҪЭж $(^NameDA)$_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Эеѡ·һѡҪЭж $(^NameDA)$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \" [PgDn] ĶȨЭ顱ಿ֡\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"ѡ\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"ѡҪװ$(^NameDA)Щܡ\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"ѡ\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"ѡ$(^NameDA)ҪжصĹܡ\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"ƶָ뵽֮ϣɼ\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"ƶָ뵽֮ϣɼ\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"ѡװλ\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"ѡ$(^NameDA)İװļС\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"ѡжλ\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"ѡ$(^NameDA)ҪжصļС\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"ڰװ\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"$(^NameDA)ڰװȺ...\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"װ\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"װѳɹɡ\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"װֹ\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"װûгɹ\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"ж\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"$(^NameDA)жأȺ...\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"ж\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"жѳɹɡ\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"жֹ\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"жسδɹɡ\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"ɡ$(^NameDA)װ\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA)Ѱװϵͳ$\\r$\\n [(F)] رմ򵼡\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"ϵͳҪԱɡ$(^NameDA)İװҪ\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"ɡ$(^NameDA)ж\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA)Ѵļжء$\\r$\\n$\\r$\\n [] ر򵼡\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"ҪԱɡ$(^NameDA)жءҪ\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"ǣ(&Y)\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Ժ(&N)\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \" $(^NameDA)(&R)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"ʾļ(&M)\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"(&F)\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"ѡ񡰿ʼ˵ļ\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"ѡ񡰿ʼ˵ļУڳĿݷʽ\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"ѡ񡰿ʼ˵ļУԱ㴴ĿݷʽҲƣļС\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Ҫݷʽ(&N)\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"ж $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"ļжء$(^NameDA)\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"ȷʵҪ˳$(^Name)װ\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"ȷʵҪ˳$(^Name)ж\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Slovak.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1051\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1250\n# RTL - anything else than RTL means LTR\n-\n#Translated by: Kypec (peter.dzugas@mahe.sk); edited by: Marin Hikank (podnety@mojepreklady.net), Ivan Masr <helix84@centrum.sk>, 2008.\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\nIntalcia programu $(^Name)\n# ^UninstallCaption\nOdintalovanie programu $(^Name)\n# ^LicenseSubCaption\n: Licenn zmluva\n# ^ComponentsSubCaption\n: Monosti intalcie\n# ^DirSubCaption\n: Intalan prieinok\n# ^InstallingSubCaption\n: Prebieha intalcia\n# ^CompletedSubCaption\n: Hotovo\n# ^UnComponentsSubCaption\n: Monosti odintalovania\n# ^UnDirSubCaption\n: Prieinok s informciami pre odintalovanie\n# ^ConfirmSubCaption\n: Potvrdenie\n# ^UninstallingSubCaption\n: Prebieha odintalcia\n# ^UnCompletedSubCaption\n: Hotovo\n# ^BackBtn\n< &Sp\n# ^NextBtn\n&alej >\n# ^AgreeBtn\n&Shlasm\n# ^AcceptBtn\n&Shlasm s podmienkami licennej zmluvy\n# ^DontAcceptBtn\nN&eshlasm s podmienkami licennej zmluvy\n# ^InstallBtn\n&Naintalova\n# ^UninstallBtn\n&Odintalova\n# ^CancelBtn\nZrui\n# ^CloseBtn\n&Zatvori\n# ^BrowseBtn\n&Prehadva...\n# ^ShowDetailsBtn\n&Podrobnosti\n# ^ClickNext\nV intalcii pokraujte kliknutm na tlaidlo alej.\n# ^ClickInstall\nPre spustenie intalcie kliknite na tlaidlo Naintalova.\n# ^ClickUninstall\nPre spustenie procesu odintalovania kliknite na tlaidlo Odintalova.\n# ^Name\nNzov\n# ^Completed\nHotovo\n# ^LicenseText\nPred intalciou programu si prosm dkladne pretajte licenn zmluvu $(^NameDA). Ak shlaste so vetkmi jej podmienkami, kliknite na tlaidlo Shlasm.\n# ^LicenseTextCB\nPred intalciou programu si prosm dkladne pretajte licenn zmluvu $(^NameDA). Ak shlaste so vetkmi jej podmienkami, zakrtnite nasledujce polko. $_CLICK\n# ^LicenseTextRB\nPred intalciou programu si prosm dkladne pretajte licenn zmluvu $(^NameDA). Ak shlaste so vetkmi jej podmienkami, oznate prv z nasledujcich monost. $_CLICK\n# ^UnLicenseText\nPred odintalovanm programu si prosm dkladne pretajte licenn zmluvu $(^NameDA). Ak shlaste so vetkmi jej podmienkami, kliknite na tlaidlo Shlasm.\n# ^UnLicenseTextCB\nPred odintalovanm programu si prosm dkladne pretajte licenn zmluvu $(^NameDA). Ak shlaste so vetkmi jej podmienkami, zakrtnite nasledujce polko. $_CLICK\n# ^UnLicenseTextRB\nPred odintalovanm programu si prosm dkladne pretajte licenn zmluvu $(^NameDA). Ak shlaste so vetkmi jej podmienkami, oznate prv z nasledujcich monost. $_CLICK\n# ^Custom\nVoliten\n# ^ComponentsText\nOznate sasti programu, ktor chcete naintalova a odznate tie, ktor naintalova nechcete. $_CLICK\n# ^ComponentsSubText1\nVyberte si typ intalcie:\n# ^ComponentsSubText2_NoInstTypes\nVyberte si tie sasti programu, ktor chcete naintalova:\n# ^ComponentsSubText2\nAlebo oznate voliten doplnky, ktor chcete naintalova:\n# ^UnComponentsText\nOznate sasti programu, ktor chcete odintalova a odznate tie, ktor chcete ponecha naintalovan. $_CLICK\n# ^UnComponentsSubText1\nZvote typ deintalcie:\n# ^UnComponentsSubText2_NoInstTypes\nVyberte sasti, ktor chcete odintalova:\n# ^UnComponentsSubText2\nAlebo oznate voliten sasti, ktor chcete odintalova:\n# ^DirText\n$(^NameDA) bude naintalovan do nasledujceho prieinka. Intalova do inho prieinka mete po kliknut na tlaidlo Prehadva a vybran inho prieinka. $_CLICK\n# ^DirSubText\nCieov prieinok\n# ^DirBrowseText\nZvote prieinok, do ktorho sa naintaluje program $(^NameDA):\n# ^UnDirText\nIntaltor odintaluje program $(^NameDA) z nasledovnho prieinka. Ak ho chcete odintalova z inho prieinka, kliknite na tlaidlo Prehadva a vyberte in prieinok. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nZvote prieinok, z ktorho sa odintaluje program $(^NameDA):\n# ^SpaceAvailable\n\"Von miesto na disku: \"\n# ^SpaceRequired\n\"Potrebn miesto na disku: \"\n# ^UninstallingText\nProgram $(^NameDA) sa odintaluje z nasledovnho prieinka. $_CLICK\n# ^UninstallingSubText\nPrebieha odintalovanie z:\n# ^FileError\nChyba pri otvran sboru na zpis: \\r\\n\\r\\n$0\\r\\n\\r\\n. Ak chcete intalciu ukoni, kliknite na tlaidlo Ukoni,\\r\\ ak chcete zpis sboru zopakova, kliknite na tlaidlo Opakova alebo kliknite na tlaidlo \\r\\nIgnorova, ak chcete intalciu tohto sboru vynecha.\n# ^FileError_NoIgnore\nChyba pri otvran sboru na zpis: \\r\\n\\r\\n$0\\r\\n\\r\\n. Ak chcete zopakova zpis sboru, kliknite na tlaidlo Opakova, alebo kliknite na tlaidlo \\r\\nZrui, v prpade, e chcete intalciu ukoni.\n# ^CantWrite\n\"Nemono zapsa sbor: \"\n# ^CopyFailed\nKoprovanie zlyhalo.\n# ^CopyTo\n\"Koprova do \"\n# ^Registering\n\"Registruje sa: \"\n# ^Unregistering\n\"Vymazva sa z registra: \"\n# ^SymbolNotFound\n\"Nemono njs symbol: \"\n# ^CouldNotLoad\n\"Nemono nata: \"\n# ^CreateFolder\n\"Vytvoren prieinok: \"\n# ^CreateShortcut\n\"Vytvoren odkaz: \"\n# ^CreatedUninstaller\n\"Program pre odintalovanie: \"\n# ^Delete\n\"Vymazan sbor: \"\n# ^DeleteOnReboot\n\"Vymaza po retartovan systmu: \"\n# ^ErrorCreatingShortcut\n\"Chyba pri vytvran odkazu: \"\n# ^ErrorCreating\n\"Chyba pri vytvran: \"\n# ^ErrorDecompressing\nChyba pri dekomprimovan dt! Intaltor je pravdepodobne pokoden...\n# ^ErrorRegistering\nChyba pri registrcii sasti\n# ^ExecShell\n\"Vykona prkaz: \"\n# ^Exec\n\"Spusti: \"\n# ^Extract\n\"Extrahuje sa: \"\n# ^ErrorWriting\n\"Chyba pri zpise do sboru \"\n# ^InvalidOpcode\nIntaltor je pravdepodobne pokoden, pretoe obsahuje neplatn operan kd.\n# ^NoOLE\n\"iadny zpis OLE pre: \"\n# ^OutputFolder\n\"Vstupn prieinok: \"\n# ^RemoveFolder\n\"Odstrni prieinok: \"\n# ^RenameOnReboot\n\"Premenova po retartovan systmu: \"\n# ^Rename\n\"Premenova: \"\n# ^Skipped\n\"Vynechan: \"\n# ^CopyDetails\nSkoprova podrobnosti do schrnky\n# ^LogInstall\nZaznamena priebeh intalcie\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Slovak.nsh",
    "content": ";Language: Slovak (1051)\n;Translated by:\n;  Kypec (peter.dzugas@mahe.sk)\n;edited by:\n;  Marin Hikank (podnety@mojepreklady.net)\n;  Ivan Masr <helix84@centrum.sk>, 2008.\n\n!insertmacro LANGFILE \"Slovak\" \"Slovensky\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Vitajte v sprievodcovi intalciou programu $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Tento sprievodca vs prevedie intalciou $(^NameDA).$\\r$\\n$\\r$\\nPred zaiatkom intalcie sa odpora ukoni vetky ostatn programy. Tm umonte aktualizovanie systmovch sborov bez potreby retartovania vho potaa.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Vitajte v sprievodcovi odintalovanm programu $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Tento sprievodca vs prevedie procesom odintalovania programu $(^NameDA).$\\r$\\n$\\r$\\nPred spustenm procesu odintalovania sa uistite, e program $(^NameDA) nie je prve aktvny.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Licenn zmluva\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Pred intalciou $(^NameDA) si prosm pretudujte licenn podmienky.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Ak shlaste s podmienkami zmluvy, kliknite na tlaidlo Shlasm a mete pokraova v intalcii. Ak chcete v intalcii pokraova, muste odshlasi podmienky licennej zmluvy $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Ak shlaste s podmienkami zmluvy, zakrtnite niie uveden polko. Ak chcete v intalcii pokraova, muste odshlasi podmienky licennej zmluvy $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Ak shlaste s podmienkami zmluvy, oznate prv z niie uvedench monost. Ak chcete v intalcii pokraova, muste odshlasi podmienky licennej zmluvy $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Licenn zmluva\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Pred odintalovanm programu $(^NameDA) si prosm pretajte licenn podmienky.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Ak shlaste s podmienkami zmluvy, zvote Shlasm. Licenn zmluvu muste odshlasi, ak chcete v odintalovan programu $(^NameDA) pokraova.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Ak shlaste s podmienkami zmluvy, zakrtnite niie uveden polko. Licenn zmluvu muste odshlasi, ak chcete pokraova v odintalovan programu $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Ak shlaste s podmienkami licennej zmluvy, oznate prv z niie uvedench monost. Licenn zmluvu muste odshlasi, ak chcete pokraova v odintalovan programu $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Stlaenm klvesu Page Down posuniete text licennej zmluvy.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Voba sast programu\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Zvote si tie sasti programu $(^NameDA), ktor chcete naintalova.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Voba sast\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Zvote sasti programu $(^NameDA), ktor chcete odintalova.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Popis\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Pri prejden kurzorom myi nad nzvom sasti sa zobraz jej popis.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Pri prejden kurzorom myi nad nzvom sasti sa zobraz jej popis.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Voba umiestnenia programu\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Vyberte si prieinok, do ktorho chcete naintalova program $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Umiestenie programu pre odintalovanie\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Vyberte si prieinok, z ktorho chcete odintalova program $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Intalcia\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Pokajte prosm, km prebehne intalcia programu $(^NameDA).\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Ukonenie intalcie\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Intalcia bola dokonen spene.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Preruenie intalcie\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Intalciu sa nepodarilo dokoni.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Odintalovanie\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"akajte prosm, km prebehne odintalovanie programu $(^NameDA).\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Ukonenie odintalovania\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Odintalovanie bolo spene dokonen.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Preruenie odintalovania\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Odintalovanie sa neukonilo spene.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Dokonenie intalcie programu $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"Program $(^NameDA) bol naintalovan do vho potaa.$\\r$\\nKliknite na tlaidlo Dokoni a tento sprievodca sa ukon.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Pre pln dokonenie intalcie programu $(^NameDA) je potrebn retartova v pota. Chcete ho retartova ihne?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Dokonenie sprievodcu odintalovanm\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"Program $(^NameDA) bol odintalovan z vho potaa.$\\r$\\n$\\r$\\nKliknite na tlaidlo Dokoni a tento sprievodca sa ukon.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Pre pln dokonenie odintalovania programu $(^NameDA) je nutn retartova v pota. Chcete ho retartova ihne?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Retartova teraz\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Retartova neskr (manulne)\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Spusti program $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Zobrazi sbor s informciami\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Dokoni\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Voba umiestnenia v ponuke tart\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Vyberte si prieinok v ponuke tart, kam sa umiestnia odkazy na program $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Vyberte si prieinok v ponuke tart, v ktorom chcete vytvori odkazy na program. Takisto mete napsa nzov novho prieinka.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Nevytvra odkazy\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Odintalovanie programu $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Odstrnenie programu $(^NameDA) z vho potaa.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Naozaj chcete ukoni intalciu programu $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Naozaj chcete ukoni proces odintalovania programu $(^Name)?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Vybra pouvateov\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Vyberte pre ktorch pouvateov chcete naintalova $(^NameDA).\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Vyberte, i chcete naintalova program $(^NameDA) iba pre seba alebo pre vetkch pouvateov tohto potaa. $(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Naintalova pre vetkch pouvateov tohto potaa\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Naintalova iba pre ma\"\n!endif"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Slovenian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1060\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1250\n# RTL - anything else than RTL means LTR\n-\n# Translation by Janez Dolinar, edited by Martin Srebotnjak - Lugos.si\n# ^Branding\nNamestitveni sistem Nullsoft %s\n# ^SetupCaption\nNamestitev $(^Name)\n# ^UninstallCaption\nOdstranitev $(^Name)\n# ^LicenseSubCaption\n: Licenna pogodba\n# ^ComponentsSubCaption\n: Monosti namestitve\n# ^DirSubCaption\n: Mapa namestitve\n# ^InstallingSubCaption\n: Nameanje poteka\n# ^CompletedSubCaption\n: Dokonano\n# ^UnComponentsSubCaption\n: Monosti odstranitve\n# ^UnDirSubCaption\n: Mapa odstranitve\n# ^ConfirmSubCaption\n: Potrditev\n# ^UninstallingSubCaption\n: Odstranjevanje poteka\n# ^UnCompletedSubCaption\n: Dokonano\n# ^BackBtn\n< &Nazaj\n# ^NextBtn\nN&aprej >\n# ^AgreeBtn\nSe &strinjam\n# ^AcceptBtn\n&Sprejmem pogoje licenne pogodbe\n# ^DontAcceptBtn\n&Ne sprejmem pogojev licenne pogodbe\n# ^InstallBtn\n&Namesti\n# ^UninstallBtn\n&Odstrani\n# ^CancelBtn\nPreklii\n# ^CloseBtn\n&Zapri\n# ^BrowseBtn\nPrebrsk&aj ...\n# ^ShowDetailsBtn\n&Podrobnosti\n# ^ClickNext\nKliknite Naprej za nadaljevanje.\n# ^ClickInstall\t\nKliknite Namesti za zaetek namestitve.\n# ^ClickUninstall\t\nKliknite Odstrani za odstranitev.\n# ^NameIme\nIme\n# ^Completed\nDokonano\n# ^LicenseText\nProsimo, da pred namestitvijo $(^NameDA) pregledate licenno pogodbo. e se z njo strinjate, pritisnite Se strinjam.\n# ^LicenseTextCB\nProsimo, da pred namestitvijo $(^NameDA) pregledate licenno pogodbo. e sprejmete vse natete pogoje, potrdite spodnje polje. $_CLICK\n# ^LicenseTextRB\nProsimo, da pred namestitvijo $(^NameDA) pregledate licenno pogodbo. e sprejmete vse natete pogoje, izberite prvo spodaj podano monost. $_CLICK\n# ^UnLicenseText\nProsimo, da pred odstranitvijo $(^NameDA) pregledate licenno pogodbo. e se z njo strinjate, pritisnite Se strinjam.\n# ^UnLicenseTextCB\nProsimo, da pred odstranitvijo $(^NameDA) pregledate licenno pogodbo. e sprejmete vse natete pogoje, potrdite spodnje polje. $_CLICK\n# ^UnLicenseTextRB\nProsimo, da pred odstranitvijo $(^NameDA) pregledate licenno pogodbo. e sprejmete vse natete pogoje, izberite prvo spodaj podano monost. $_CLICK\n# ^Custom\nPo meri ...\n# ^ComponentsText\nOznaite komponente, ki jih elite namestiti, in pustite neoznaene tiste, katerih ne elite namestiti. $_CLICK\n# ^ComponentsSubText1\nIzberite vrsto namestitve:\n# ^ComponentsSubText2_NoInstTypes\nIzberite komponente namestitve:\n# ^ComponentsSubText2\nAli pa izberite komponente, ki jih elite namestiti:\n# ^UnComponentsText\nOznaite komponente, ki jih elite odstraniti, in pustite neoznaene tiste, ki jih ne elite odstraniti. $_CLICK\n# ^UnComponentsSubText1\nIzberite vrsto odstranitve:\n# ^UnComponentsSubText2_NoInstTypes\nIzberite komponente za odstranitev:\n# ^UnComponentsSubText2\nAli pa izberite komponente namestitve, ki jih elite odstraniti:\n# ^DirText\n$(^NameDA) boste namestili v sledeo mapo. Za izbiro druge mape kliknite tipko Prebrskaj in izberite drugo mapo. $_CLICK\n# ^DirSubText\nCiljna mapa\n# ^DirBrowseText\nIzberite mapo, kamor elite namestiti $(^NameDA):\n# ^UnDirText\nOdstranili boste $(^NameDA) iz sledee mape. Za izbiro druge mape kliknite tipko Prebrskaj in izberite drugo mapo. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nIzberite mapo, od koder elite odstraniti $(^NameDA):\n# ^SpaceAvailable\n\"Prostor na disku: \"\n# ^SpaceRequired\n\"Potreben prostor: \"\n# ^UninstallingText\n$(^NameDA) bo odstranjen iz naslednje mape. $_CLICK\n# ^UninstallingSubText\nOdstranjevanje iz:\n# ^FileError\nNapaka pri odpiranju datoteke za pisanje: \\r\\n\\r\\n$0\\r\\n\\r\\nPritisnite Prekini za prekinitev namestitve,\\r\\nPonovi za ponoven poskus ali\\r\\nPrezri za izpust te datoteke.\n# ^FileError_NoIgnore\nNapaka pri odpiranju datoteke za pisanje: \\r\\n\\r\\n$0\\r\\n\\r\\nPritisnite Ponovi za ponoven poskus pisanja ali\\r\\Preklii za prekinitev namestitve.\n# ^CantWrite\n\"Ni mogoe pisati: \"\n# ^CopyFailed\nKopiranje neuspeno\n# ^CopyTo\n\"Kopiranje v \"\n# ^Registering\n\"Registracija: \"\n# ^Unregistering\n\"Preklic registracije: \"\n# ^SymbolNotFound\n\"Ni mogoe najti simbola: \"\n# ^CouldNotLoad\n\"Ni mogoe naloiti: \"\n# ^CreateFolder\n\"Ustvarjanje mape: \"\n# ^CreateShortcut\n\"Ustvarjanje blinjice: \"\n# ^CreatedUninstaller\n\"Ustvarjena odstranitev: \"\n# ^Delete\n\"Brisanje datoteke: \"\n# ^DeleteOnReboot\n\"Brisanje ob ponovnem zagonu: \"\n# ^ErrorCreatingShortcut\n\"Napaka ustvarjanja blinjice: \"\n# ^ErrorCreating\n\"Napaka ustvarjanja: \"\n# ^ErrorDecompressing\nNapaka pri razirjanju podatkov! Je namestitvena datoteka okvarjena?\n# ^ErrorRegistering\nNapaka registracije DLL\n# ^ExecShell\n\"Izvajanje v lupini: \"\n# ^Exec\n\"Izvajanje: \"\n# ^Extract\n\"Razirjanje: \"\n# ^ErrorWriting\n\"Razirjanje: napaka pri pisanju v datoteko \"\n# ^InvalidOpcode\nNamestitev neveljavna: napaen ukaz\n# ^NoOLE\n\"Neobstojei OLE za: \"\n# ^OutputFolder\n\"Ciljna mapa: \"\n# ^RemoveFolder\n\"Odstranjevanje mape: \"\n# ^RenameOnReboot\n\"Preimenovanje ob zagonu: \"\n# ^Rename\n\"Preimenovanje: \"\n# ^Skipped\n\"Izpueno: \"\n# ^CopyDetails\nKopiraj podrobnosti v odloie\n# ^LogInstall\nShrani potek namestitve\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Slovenian.nsh",
    "content": ";Language: Slovenian (1060)\n;By Janez Dolinar, edited by Martin Srebotnjak - Lugos.si\n\n!insertmacro LANGFILE \"Slovenian\" \"Slovenski jezik\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Dobrodoli v arovniku namestitve $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Ta arovnik vas vodi skozi namestitev programa $(^NameDA).$\\r$\\n$\\r$\\nPred namestitvijo je priporoeno zapreti vsa ostala okna in programe. S tem omogoite nemoteno namestitev programa in potrebnih sistemskih datotek brez ponovnega zagona raunalnika.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Dobrodoli v arovniku za odstranitev $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Ta arovnik vas bo vodil skozi odstranitev $(^NameDA).$\\r$\\n$\\r$\\nPreden prinete z odstranitvijo, se prepriajte, da program $(^NameDA) ni zagnan.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Licenna pogodba\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Prosimo, da si ogledate pogoje licenne pogodbe pred namestitvijo $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"e se strinjate s pogoji, pritisnite Se strinjam. Da bi lahko namestili $(^NameDA), se morate s pogodbo strinjati.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"e se strinjate z licennimi pogoji pogodbe, spodaj izberite ustrezno okence. Za namestitev $(^NameDA) se morate strinjati s pogoji pogodbe. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"e se strinjate z licennimi pogoji pogodbe, spodaj izberite prvo monost. Za namestitev $(^NameDA) se morate strinjati s pogoji pogodbe. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Licenna pogodba\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Prosimo, da pred odstranitvijo $(^NameDA) pregledate pogoje licenne pogodbe.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"e se strinjate s pogoji licenne pogodbe, izberite Se strinjam. Za odstranitev $(^NameDA) se morate strinjati s pogoji.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"e se strinjate s pogoji licenne pogodbe, kliknite na okence spodaj. Za odstranitev $(^NameDA) se morate strinjati s pogoji. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"e se strinjate s pogoji licenne pogodbe, spodaj izberite prvo podano monost. Za odstranitev $(^NameDA) se morate strinjati s pogoji. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Za preostali del pogodbe pritisnite tipko 'Page Down'.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Izbor komponent\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Izberite, katere komponente izdelka $(^NameDA) elite namestiti.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Izbor komponent\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Izberite komponente $(^NameDA), ki jih elite odstraniti.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Opis\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Povlecite miko nad komponento, da vidite njen opis.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Povlecite miko nad komponento, da vidite njen opis.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Izberite pot namestive\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Izberite mapo, v katero elite namestiti $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Izbor mape\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Izberite mapo, iz katere elite odstraniti $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Nameanje poteka\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Prosimo, poakajte, $(^NameDA) se namea.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Dokonana namestitev\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Namestitev je uspeno zakljuena.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Prekinjena namestitev\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Namestitev ni bila uspeno zakljuena.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Odstranjevanje poteka\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Prosimo, poakajte, dokler se program $(^NameDA) odstranjuje.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Odstranitev konana\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Odstranitev je uspeno konana.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Odstranitev prekinjena\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Odstranitev ni bila konana uspeno.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Zakljuevanje namestitve $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"Program $(^NameDA) je bil nameen na va raunalnik.$\\r$\\n$\\r$\\nPritisnite Dokonaj za zaprtje arovnika.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Za dokonanje namestitve $(^NameDA) morate ponovno zagnati raunalnik. elite zdaj ponovno zagnati raunalnik?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"arovnik za odstranitev $(^NameDA) se zakljuuje\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"Program $(^NameDA) je odstranjen z vaega raunalnika.$\\r$\\n$\\r$\\nKliknite Dokonaj, da zaprete arovnika.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Da bi se namestitev $(^NameDA) dokonala, morate ponovno zagnati raunalnik. elite zdaj znova zagnati raunalnik?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Ponovni zagon\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Raunalnik elim znova zagnati kasneje\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Zaeni $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Pokai BeriMe\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"Do&konaj\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Izberite mapo menija Start\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Izberite mapo menija Start za blinjice do $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Izberite mapo menija Start, kjer elite ustvariti blinjico do programa. e vpiete novo ime, boste ustvarili istoimensko mapo.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Ne ustvari blinjic\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Odstranitev $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Odstrani $(^NameDA) z vaega raunalnika.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Ste prepriani, da elite prekiniti namestitev $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Ste prepriani, da elite zapustiti odstranitev $(^Name)?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Izberite uporabnike\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Izberite uporabnike, za katere elite namestiti $(^NameDA).\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Izberite, ali elite namestiti $(^NameDA) le zase ali za vse uporabnike tega raunalnika. $(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Namesti za vse uporabnike tega raunalnika\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Namesti le zame\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Spanish.nlf",
    "content": "# Header, don't edit ;Espaol - Espaa (Alfabetizacin Tradicional)\nNLF v6\n# Language ID\n1034\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by MoNKi & Joel\n# Review and minor corrections Darwin Rodrigo Toledo Cceres (niwrad777@gmail.com) www.winamp-es.com\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\nInstalacin de $(^Name)\n# ^UninstallCaption\nDesinstalacin de $(^Name)\n# ^LicenseSubCaption\n: Acuerdo de Licencia\n# ^ComponentsSubCaption\n: Opciones de Instalacin\n# ^DirSubCaption\n: Directorio de Instalacin\n# ^InstallingSubCaption\n: Instalando\n# ^CompletedSubCaption\n: Completado\n# ^UnComponentsSubCaption\n: Opciones de Desinstalacin\n# ^UnDirSubCaption\n: Directorio de Desinstalacin\n# ^ConfirmSubCaption\n: Confirmacin\n# ^UninstallingSubCaption\n: Desinstalando\n# ^UnCompletedSubCaption\n: Completado\n# ^BackBtn\n< &Atrs\n# ^NextBtn\n&Siguiente >\n# ^AgreeBtn\nA&cepto\n# ^AcceptBtn\nA&cepto los trminos de la licencia\n# ^DontAcceptBtn\n&No acepto los trminos de la licencia\n# ^InstallBtn\n&Instalar\n# ^UninstallBtn\n&Desinstalar\n# ^CancelBtn\nCancelar\n# ^CloseBtn\n&Cerrar\n# ^BrowseBtn\n&Examinar...\n# ^ShowDetailsBtn\nVer &detalles\n# ^ClickNext\nPresione Siguiente para continuar.\n# ^ClickInstall\nPresione Instalar para comenzar la instalacin.\n# ^ClickUninstall\nPresione Desinstalar para comenzar la desinstalacin.\n# ^Name\nNombre\n# ^Completed\nCompletado\n# ^LicenseText\nPor favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si acepta todos los trminos del acuerdo, presione Acepto.\n# ^LicenseTextCB\nPor favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si acepta todos los trminos del acuerdo, marque abajo la casilla. $_CLICK\n# ^LicenseTextRB\nPor favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si acepta todos los trminos del acuerdo, seleccione abajo la primera opcin. $_CLICK\n# ^UnLicenseText\nPor favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si acepta todos los trminos del acuerdo, presione Acepto.\n# ^UnLicenseTextCB\nPor favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si acepta todos los trminos del acuerdo, marque abajo la casilla. $_CLICK.\n# ^UnLicenseTextRB\nPor favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si acepta todos los trminos del acuerdo, seleccione abajo la primera opcin. $_CLICK\n# ^Custom\nPersonalizada\n# ^ComponentsText\nMarque los componentes que desee instalar y desmarque los componentes que no desee instalar. $_CLICK\n# ^ComponentsSubText1\nTipos de instalacin:\n# ^ComponentsSubText2_NoInstTypes\nSeleccione los componentes a instalar:\n# ^ComponentsSubText2\nO seleccione los componentes opcionales que desee instalar:\n# ^UnComponentsText\nMarque los componentes que desee desinstalar y desmarque los componentes que no desee desinstalar. $_CLICK\n# ^UnComponentsSubText1\nTipos de desinstalacin:\n# ^UnComponentsSubText2_NoInstTypes\nSeleccione los componentes a desinstalar:\n# ^UnComponentsSubText2\nO seleccione los componentes opcionales que desee desinstalar:\n# ^DirText\nEl programa de instalacin instalar $(^NameDA) en el siguiente directorio. Para instalar en un directorio diferente, presione Examinar y seleccione otro directorio. $_CLICK\n# ^DirSubText\nDirectorio de Destino\n# ^DirBrowseText\nSeleccione el directorio en el que instalar $(^NameDA):\n# ^UnDirText\nEl programa de instalacin desinstalar $(^NameDA) del siguiente directorio. Para desinstalar de un directorio diferente, presione Examinar y seleccione otro directorio. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nSeleccione el directorio desde el cual desinstalar $(^NameDA):\n# ^SpaceAvailable\nEspacio disponible: \n# ^SpaceRequired\nEspacio requerido: \n# ^UninstallingText\n$(^NameDA) ser desinstalado del siguiente directorio. $_CLICK\n# ^UninstallingSubText\nDesinstalando desde:\n# ^FileError\nError abriendo archivo para escritura: \\r\\n\\t\"$0\"\\r\\nPresione abortar para anular la instalacin,\\r\\nreintentar para volver a intentar escribir el archivo, u\\r\\nomitir para ignorar este archivo\n# ^FileError_NoIgnore\nError abriendo archivo para escritura: \\r\\n\\t\"$0\"\\r\\nPresione reintentar para volver a intentar escribir el archivo, o\\r\\ncancelar para anular la instalacin\n# ^CantWrite\n\"No pudo escribirse: \"\n# ^CopyFailed\nFall la copia\n# ^CopyTo\n\"Copiar a \"\n# ^Registering\n\"Registrando: \"\n# ^Unregistering\n\"Eliminando registro: \"\n# ^SymbolNotFound\n\"No pudo encontrarse smbolo: \"\n# ^CouldNotLoad\n\"No pudo cargarse: \"\n# ^CreateFolder\n\"Crear directorio: \"\n# ^CreateShortcut\n\"Crear acceso directo: \"\n# ^CreatedUninstaller\n\"Crear desinstalador: \"\n# ^Delete\n\"Borrar archivo: \"\n# ^DeleteOnReboot\n\"Borrar al reinicio: \"\n# ^ErrorCreatingShortcut\n\"Error creando acceso directo: \"\n# ^ErrorCreating\n\"Error creando: \"\n# ^ErrorDecompressing\nError descomprimiendo datos! Instalador corrupto?\n# ^ErrorRegistering\nError registrando DLL\n# ^ExecShell\n\"Ejecutar comando: \"\n# ^Exec\n\"Ejecutar: \"\n# ^Extract\n\"Extraer: \"\n# ^ErrorWriting\n\"Extraer: error escribiendo al archivo \"\n# ^InvalidOpcode\nInstalador corrupto: cdigo de operacin no vlido\n# ^NoOLE\n\"Sin OLE para: \"\n# ^OutputFolder\n\"Directorio de salida: \"\n# ^RemoveFolder\n\"Eliminar directorio: \"\n# ^RenameOnReboot\n\"Renombrar al reinicio: \"\n# ^Rename\n\"Renombrar: \"\n# ^Skipped\n\"Omitido: \"\n# ^CopyDetails\nCopiar Detalles al Portapapeles\n# ^LogInstall\nRegistrar proceso de instalacin \n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Spanish.nsh",
    "content": ";Language: Spanish (1034)\n;By MoNKi & Joel\n;Updates & Review Darwin Rodrigo Toledo Cceres - www.winamp-es.com - niwrad777@gmail.com\n\n!insertmacro LANGFILE \"Spanish\" \"Espaol\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Bienvenido al Asistente de Instalacin de $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Este programa instalar $(^NameDA) en su ordenador.$\\r$\\n$\\r$\\nSe recomienda que cierre todas las dems aplicaciones antes de iniciar la instalacin. Esto har posible actualizar archivos relacionados con el sistema sin tener que reiniciar su ordenador.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Bienvenido al Asistente de Desinstalacin de $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Este asistente le guiar durante la desinstalacin de $(^NameDA).$\\r$\\n$\\r$\\nAntes de comenzar la desinstalacin, asegrese de que $(^NameDA) no se est ejecutando.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Acuerdo de licencia\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Por favor revise los trminos de la licencia antes de instalar $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Si acepta todos los trminos del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para instalar $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Si acepta los trminos del acuerdo, marque abajo la casilla. Debe aceptar los trminos para instalar $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Si acepta los trminos del acuerdo, seleccione abajo la primera opcin. Debe aceptar los trminos para instalar $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Acuerdo de licencia\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Por favor revise los trminos de la licencia antes de desinstalar $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Si acepta todos los trminos del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para desinstalar $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Si acepta los trminos del acuerdo, marque abajo la casilla. Debe aceptar los trminos para desinstalar $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Si acepta los trminos del acuerdo, seleccione abajo la primera opcin. Debe aceptar los trminos para desinstalar $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Presione Avanzar Pgina para ver el resto del acuerdo.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Seleccin de componentes\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Seleccione qu caractersticas de $(^NameDA) desea instalar.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Seleccin de componentes\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Seleccione qu caractersticas de $(^NameDA) desea desinstalar.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Descripcin\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Site el ratn encima de un componente para ver su descripcin.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Site el ratn encima de un componente para ver su descripcin.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Elegir lugar de instalacin\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Elija el directorio para instalar $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Elegir lugar de desinstalacin\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Elija el directorio desde el cual se desinstalar $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Instalando\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Por favor espere mientras $(^NameDA) se instala.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Instalacin Completada\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"La instalacin se ha completado correctamente.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalacin Anulada\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"La instalacin no se complet correctamente.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Desinstalando\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Por favor espere mientras $(^NameDA) se desinstala.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Desinstalacin Completada\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"La desinstalacin se ha completado correctamente.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Desinstalacin Anulada\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"La desinstalacin no se complet correctamente.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Completando el Asistente de Instalacin de $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) ha sido instalado en su sistema.$\\r$\\n$\\r$\\nPresione Terminar para cerrar este asistente.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Su sistema debe ser reiniciado para que pueda completarse la instalacin de $(^NameDA). Desea reiniciar ahora?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Completando el Asistente de Desinstalacin de $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) ha sido desinstalado de su sistema.$\\r$\\n$\\r$\\nPresione Terminar para cerrar este asistente.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Su ordenador debe ser reiniciado para completar la desinstalacin de $(^NameDA). Desea reiniciar ahora?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Reiniciar ahora\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Deseo reiniciar manualmente ms tarde\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Ejecutar $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Ver Lame\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Terminar\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Elegir Carpeta del Men Inicio\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Elija una Carpeta del Men Inicio para los accesos directos de $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Seleccione una carpeta del Men Inicio en la que quiera crear los accesos directos del programa. Tambin puede introducir un nombre para crear una nueva carpeta.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"No crear accesos directos\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Desinstalar $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Elimina $(^NameDA) de su sistema.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Est seguro de que desea salir de la instalacin de $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Est seguro de que desea salir de la desinstalacin de $(^Name)?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Elegir Usuarios\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Elija los usuarios para los cuales Ud. desea instalar $(^NameDA).\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Seleccione si desea instalar $(^NameDA) slo para Ud. o para todos los usuarios de este Ordenador.$(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Instacin para cualquier usuario de este ordenador\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Instalacin solo para m\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/SpanishInternational.nlf",
    "content": "# Header, don't edit ;Espaol (Alfabetizacin Internacional)\nNLF v6\n# Language ID\n3082\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Darwin Rodrigo Toledo Cceres - www.winamp-es.com - nwrad777@gmail.com\n# Base traslation by MoNKi & Joel\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\nInstalacin de $(^Name)\n# ^UninstallCaption\nDesinstalacin de $(^Name)\n# ^LicenseSubCaption\n: Acuerdo de Licencia\n# ^ComponentsSubCaption\n: Opciones de Instalacin\n# ^DirSubCaption\n: Carpeta de Instalacin\n# ^InstallingSubCaption\n: Instalando\n# ^CompletedSubCaption\n: Finalizado\n# ^UnComponentsSubCaption\n: Opciones de Desinstalacin\n# ^UnDirSubCaption\n: Carpeta de Desinstalacin\n# ^ConfirmSubCaption\n: Confirmacin\n# ^UninstallingSubCaption\n: Desinstalando\n# ^UnCompletedSubCaption\n: Finalizado\n# ^BackBtn\n< &Atrs\n# ^NextBtn\n&Siguiente >\n# ^AgreeBtn\n&Acepto\n# ^AcceptBtn\n&Acepto las condiciones del Acuerdo de Licencia\n# ^DontAcceptBtn\nNo &acepto las condiciones del Acuerdo de Licencia\n# ^InstallBtn\n&Instalar\n# ^UninstallBtn\n&Desinstalar\n# ^CancelBtn\nCancelar\n# ^CloseBtn\n&Cerrar\n# ^BrowseBtn\n&Examinar...\n# ^ShowDetailsBtn\nMostrar &detalles\n# ^ClickNext\nPresione Siguiente para continuar.\n# ^ClickInstall\nPresione Instalar para iniciar la instalacin.\n# ^ClickUninstall\nPresione Desinstalar para iniciar la desinstalacin.\n# ^Name\nNombre\n# ^Completed\nFinalizado\n# ^LicenseText\nPor favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, presione Acepto.\n# ^LicenseTextCB\nPor favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, marque abajo la casilla. $_CLICK\n# ^LicenseTextRB\nPor favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, seleccione abajo la primera opcin. $_CLICK\n# ^UnLicenseText\nPor favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, presione Acepto.\n# ^UnLicenseTextCB\nPor favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, marque abajo la casilla. $_CLICK\n# ^UnLicenseTextRB\nPor favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, seleccione abajo la primera opcin. $_CLICK\n# ^Custom\nPersonalizada\n# ^ComponentsText\nMarque los componentes que desee instalar y desmarque los componentes que no desee instalar. $_CLICK\n# ^ComponentsSubText1\nSeleccione el tipo de instalacin:\n# ^ComponentsSubText2_NoInstTypes\nSeleccione los componentes a instalar:\n# ^ComponentsSubText2\nO seleccione los componentes opcionales que desee instalar:\n# ^UnComponentsText\nMarque los componentes que desee desinstalar y desmarque los componentes que no desee desinstalar. $_CLICK\n# ^UnComponentsSubText1\nSeleccione el tipo de desinstalacin:\n# ^UnComponentsSubText2_NoInstTypes\nSeleccione los componentes a desinstalar:\n# ^UnComponentsSubText2\nO seleccione los componentes opcionales que desee desinstalar:\n# ^DirText\nEl programa de instalacin instalar $(^NameDA) en la siguiente carpeta. Para instalar en una carpeta diferente, presione Examinar y seleccione otra carpeta. $_CLICK\n# ^DirSubText\nCarpeta de Destino\n# ^DirBrowseText\nSeleccione la carpeta en la que instalar $(^NameDA):\n# ^UnDirText\nEl programa de instalacin desinstalar $(^NameDA) de la siguiente carpeta. Para desinstalar de una carpeta diferente, presione Examinar y seleccione otra carpeta. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nSeleccione la carpeta desde la que desinstalar $(^NameDA):\n# ^SpaceAvailable\nEspacio disponible:\n# ^SpaceRequired\nEspacio requerido:\n# ^UninstallingText\n$(^NameDA) ser desinstalado de la siguiente carpeta. $_CLICK\n# ^UninstallingSubText\nDesinstalando desde:\n# ^FileError\nError abriendo archivo para escribir: \\r\\n\\r\\n$0\\r\\n\\r\\nPresione Abortar para detener la instalacin,\\r\\nReintentar para probar otra vez, o\\r\\nOmitir para ignorar este archivo.\n# ^FileError_NoIgnore\nError abriendo archivo para escribir: \\r\\n\\r\\n$0\\r\\n\\r\\nPresione Reintentar para probar otra vez, o\\r\\nCancelar para detener la instalacin.\n# ^CantWrite\n\"No pudo escribirse: \"\n# ^CopyFailed\nCopia fallida\n# ^CopyTo\n\"Copiar a \"\n# ^Registering\n\"Registrando: \"\n# ^Unregistering\n\"Eliminando registro: \"\n# ^SymbolNotFound\n\"No se encontr simbolo: \"\n# ^CouldNotLoad\n\"No pudo cargarse: \"\n# ^CreateFolder\n\"Crear carpeta: \"\n# ^CreateShortcut\n\"Crear acceso directo: \"\n# ^CreatedUninstaller\n\"Crear desinstalador: \"\n# ^Delete\n\"Borrar archivo: \"\n# ^DeleteOnReboot\n\"Borrar al reinicio: \"\n# ^ErrorCreatingShortcut\n\"Error creando acceso directo: \"\n# ^ErrorCreating\n\"Error creando: \"\n# ^ErrorDecompressing\nError descomprimiendo datos! Instalador corrupto?\n# ^ErrorRegistering\nError registrando DLL\n# ^ExecShell\n\"Ejecutar comando: \"\n# ^Exec\n\"Ejecutar: \"\n# ^Extract\n\"Extraer: \"\n# ^ErrorWriting\n\"Extraer: error escribiendo al archivo \"\n# ^InvalidOpcode\nInstalador corrupto: cdigo de operacin no vlido\n# ^NoOLE\n\"Sin OLE para: \"\n# ^OutputFolder\n\"Carpeta de salida: \"\n# ^RemoveFolder\n\"Eliminar carpeta: \"\n# ^RenameOnReboot\n\"Renombrar al reinicio: \"\n# ^Rename\n\"Renombrar: \"\n# ^Skipped\n\"Omitido: \"\n# ^CopyDetails\nCopiar Detalles al Portapapeles\n# ^LogInstall\nRegistrar proceso de instalacin\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/SpanishInternational.nsh",
    "content": ";Language: Spanish International (3082)\n;By Darwin Rodrigo Toledo Cceres - www.winamp-es.com - niwrad777@gmail.com\n;Base by Monki y Joel\n\n!insertmacro LANGFILE \"SpanishInternational\" \"Espaol (Alfabetizacin Internacional)\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Bienvenido al Asistente de Instalacin de $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Este asistente le guiar a travs de la instalacin de $(^NameDA).$\\r$\\n$\\r$\\nSe recomienda que cierre todas la dems aplicaciones antes de iniciar la instalacin. Esto har posible actualizar archivos de sistema sin tener que reiniciar su computadora.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Bienvenido al Asistente de Desinstalacin de $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Este asistente le guiar durante la desinstalacin de $(^NameDA).$\\r$\\n$\\r$\\nAntes de iniciar la desinstalacin, asegrese de que $(^NameDA) no se est ejecutando.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Acuerdo de licencia\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Por favor revise el acuerdo de licencia antes de instalar $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Si acepta todas las condiciones del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para instalar $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Si acepta las condiciones del acuerdo, marque abajo la casilla. Debe aceptar las condiciones para instalar $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Si acepta las condiciones del acuerdo, seleccione abajo la primera opcin. Debe aceptar las condiciones para instalar $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Acuerdo de licencia\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Por favor revise el acuerdo de licencia antes de desinstalar $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Si acepta todas las condiciones del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para desinstalar $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Si acepta los trminos del acuerdo, marque abajo la casilla. Debe aceptar los trminos para desinstalar $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Si acepta los trminos del acuerdo, seleccione abajo la primera opcin. Debe aceptar los trminos para desinstalar $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Presione Avanzar Pgina para ver el resto del acuerdo.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Seleccin de componentes\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Seleccione qu caractersticas de $(^NameDA) desea instalar.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Seleccin de componentes\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Seleccione qu caractersticas de $(^NameDA) desea desinstalar.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Descripcin\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Site el ratn encima de un componente para ver su descripcin.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Site el ratn encima de un componente para ver su descripcin.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Elegir lugar de instalacin\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Elija la carpeta para instalar $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Elegir lugar de desinstalacin\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Elija la carpeta desde la cual desinstalar $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Instalando\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Por favor espere mientras $(^NameDA) se instala.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Instalacin Finalizada\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"La instalacin se ha finalizado correctamente.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Instalacin Abortada\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"La instalacin no se termin correctamente.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Desinstalando\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Por favor espere mientras $(^NameDA) se desinstala.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Desinstalacin Finalizada\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"La desinstalacin se ha finalizado correctamente.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Desinstalacin Abortada\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"La desinstalacin no se termin correctamente.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Finalizando el Asistente de Instalacin de $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) ha sido instalado en su sistema.$\\r$\\n$\\r$\\nPresione Terminar para cerrar este asistente.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Su sistema debe ser reiniciado para poder finalizar la instalacin de $(^NameDA). Desea reiniciar ahora?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Completando el Asistente de Desinstalacin de $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) ha sido desinstalado de su sistema.$\\r$\\n$\\r$\\nPresione Terminar para cerrar este asistente.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Su computadora debe ser reiniciada para finalizar la desinstalacin de $(^NameDA). Desea reiniciar ahora?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Reiniciar ahora\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Deseo reiniciar manualmente ms tarde\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Ejecutar $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Mostrar Lame\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Terminar\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Elegir Carpeta del Men Inicio\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Elija una Carpeta del Men Inicio para los accesos directos de $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Seleccione una carpeta del Men Inicio en la que quiera crear los accesos directos del programa. Tambin puede introducir un nombre para crear una nueva carpeta.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"No crear accesos directos\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Desinstalar $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Elimina $(^NameDA) de su sistema.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Est seguro de que desea salir de la instalacin de $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Est seguro de que desea salir de la desinstalacin de $(^Name)?\"\n!endif\n\n!ifdef MULTIUSER_INSTALLMODEPAGE\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE \"Elegir Usuarios\"\n  ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE \"Elija los usuarios para los cuales Ud. desea instalar $(^NameDA).\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP \"Elija una opcin si desea instalar $(^NameDA) para slo para Ud., o para todos los usuarios de esta computadora.$(^ClickNext)\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS \"Instacin para cualquier usuario de esta computadora\"\n  ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER \"Instalacin solo para m\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Swedish.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1053\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Magnus Bonnevier (magnus.bonnevier@telia.com)\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) Installation\n# ^UninstallCaption\n$(^Name) Avinstallation\n# ^LicenseSubCaption\n: Licensavtal\n# ^ComponentsSubCaption\n: Installationsval\n# ^DirSubCaption\n: Installationskatalog\n# ^InstallingSubCaption\n: Installerar\n# ^CompletedSubCaption\n: Slutfrd\n# ^UnComponentsSubCaption\n: Avinstallationsval\n# ^UnDirSubCaption\n: Avinstallationskatalog\n# ^ConfirmSubCaption\n: Bekrftelse\n# ^UninstallingSubCaption\n: Avinstallerar\n# ^UnCompletedSubCaption\n: Slutfrd\n# ^BackBtn\n< &Tillbaka\n# ^NextBtn\n&Nsta >\n# ^AgreeBtn\nJag &Godknner\n# ^AcceptBtn\nJag &Godknner villkoren i licensavtalet\n# ^DontAcceptBtn\nJag &Godknner inte villkoren i licensavtalet\n# ^InstallBtn\n&Installera\n# ^UninstallBtn\n&Avinstallera\n# ^CancelBtn\nAvbryt\n# ^CloseBtn\n&Stng\n# ^BrowseBtn\nB&lddra...\n# ^ShowDetailsBtn\nVisa &detaljer\n# ^ClickNext\nKlicka p Nsta fr att fortstta.\n# ^ClickInstall\nKlicka p Installera fr att starta installationen.\n# ^ClickUninstall\nKlicka p Avinstallera fr att starta avinstallationen.\n# ^Name\nNamn\n# ^Completed\nSlutfrd\n# ^LicenseText\nVar vnlig ls igenom licensvillkoren innan du installerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka Jag Godknner.\n# ^LicenseTextCB\nVar vnlig ls igenom licensvillkoren innan du installerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. $_CLICK\n# ^LicenseTextRB\nVar vnlig ls igenom licensvillkoren innan du installerar $(^NameDA). Om du accepterar villkoren i avtalet, vlj det frsta alternativet nedan. $_CLICK\n# ^UnLicenseText\nVar vnlig ls igenom licensvillkoren innan du avinstallerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka Jag Godknner.\n# ^UnLicenseTextCB\nVar vnlig ls igenom licensvillkoren innan du avinstallerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. $_CLICK\n# ^UnLicenseTextRB\nVar vnlig ls igenom licensvillkoren innan du avinstallerar $(^NameDA). Om du accepterar villkoren i avtalet, vlj det frsta alternativet nedan. $_CLICK\n# ^Custom\nValfri\n# ^ComponentsText\nMarkera de komponenter du vill installera och avmarkera de komponenter du inte vill installera. $_CLICK\n# ^ComponentsSubText1\nVlj typ av installation:\n# ^ComponentsSubText2_NoInstTypes\nVlj komponenter att installera:\n# ^ComponentsSubText2\nEller, vlj de alternativa komponenter du nskar installera:\n# ^UnComponentsText\nMarkera de komponenter du vill avinstallera och avmarkera de komponenter du inte vill avinstallera. $_CLICK\n# ^UnComponentsSubText1\nVlj typ av avinstallation:\n# ^UnComponentsSubText2_NoInstTypes\nVlj komponenter att avinstallera:\n# ^UnComponentsSubText2\nEller, vlj de alternativa komponenter du nskar avinstallera:\n# ^DirText\nGuiden kommer att installera $(^NameDA) i fljande katalog. Fr att installera i en annan katalog, klicka Blddra och vlj en alternativ katalog. $_CLICK\n# ^DirSubText\nMlkatalog\n# ^DirBrowseText\nVlj katalog att installera $(^NameDA) i:\n# ^UnDirText\nInstallationsguiden kommer att avinstallera $(^NameDA) frn fljande katalog. Fr att avinstallera frn en annan katalog, klicka Blddra och vlj en annan katalog. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nVlj katalog att avinstallera $(^NameDA) frn:\n# ^SpaceAvailable\n\"Utrymme tillgngligt: \"\n# ^SpaceRequired\n\"Utrymme som behvs: \"\n# ^UninstallingText\n$(^NameDA) kommer att avinstalleras frn fljande katalog. $_CLICK\n# ^UninstallingSubText\nAvinstallerar frn:\n# ^FileError\nFel vid ppning av fil fr skrivning: \\r\\n\\t\"$0\"\\r\\nKlicka p avbryt fr att avbryta installationen,\\r\\nfrsk igen fr att frska skriva till filen igen, eller\\r\\nIgnorera fr att skippa denna fil\n# ^FileError_NoIgnore\nFel vid ppning av fil fr skrivning: \\r\\n\\t\"$0\"\\r\\nKlicka p frsk igen fr att skriva till filen igen, eller\\r\\navbryt fr att avbryta installationen\n# ^CantWrite\n\"Kan inte skriva: \"\n# ^CopyFailed\nKopiering misslyckades\n# ^CopyTo\n\"Kopiera till \"\n# ^Registering\n\"Registrerar: \"\n# ^Unregistering\n\"Avregistrerar: \"\n# ^SymbolNotFound\n\"Kunde inte hitta symbol: \"\n# ^CouldNotLoad\n\"Kunde inte ladda: \"\n# ^CreateFolder\n\"Skapa katalog: \"\n# ^CreateShortcut\n\"Skapa genvg: \"\n# ^CreatedUninstaller\n\"Skapade avinstallationsprogram: \"\n# ^Delete\n\"Radera fil: \"\n# ^DeleteOnReboot\n\"Radera vid omstart: \"\n# ^ErrorCreatingShortcut\n\"Fel vid skapande av genvg: \"\n# ^ErrorCreating\n\"Fel vid skapande: \"\n# ^ErrorDecompressing\nFel vid uppackning av data! Skadat installationspaket?\n# ^ErrorRegistering\nFel vid registrering av DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Kr: \"\n# ^Extract\n\"Extrahera: \"\n# ^ErrorWriting\n\"Extrahera: fel vid skrivning till fil \"\n# ^InvalidOpcode\nInstallationspaket skadat: ogiltig opcode\n# ^NoOLE\n\"Ingen OLE fr: \"\n# ^OutputFolder\n\"Mlkatalog: \"\n# ^RemoveFolder\n\"Ta bort katalog: \"\n# ^RenameOnReboot\n\"Dp om vid omstart: \"\n# ^Rename\n\"Dp om: \"\n# ^Skipped\n\"Ignorerad: \"\n# ^CopyDetails\nKopiera detaljinformation till klippbordet\n# ^LogInstall\nLogga installationsfrfarandet\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Swedish.nsh",
    "content": ";Compatible with Modern UI 1.72\n;Language: Swedish (1053)\n;By Magnus Bonnevier (magnus.bonnevier@telia.com), updated by Rickard Angbratt (r.angbratt@home.se), updated by Ulf Axelsson (ulf.axelsson@gmail.com)\n\n!insertmacro LANGFILE \"Swedish\" \"Svenska\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Vlkommen till installationsguiden fr $(^NameDA).\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Denna guide tar dig igenom installationen av $(^NameDA).$\\r$\\n$\\r$\\nDet rekommenderas att du avslutar alla andra program innan du fortstter installationen. Detta tillter att installationen uppdaterar ndvndiga systemfiler utan att behva starta om din dator.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Vlkommen till avinstallationsguiden fr $(^NameDA).\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Denna guide tar dig igenom avinstallationen av $(^NameDA).$\\r$\\n$\\r$\\nInnan du startar avinstallationen, frskra dig om att $(^NameDA) inte krs.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Licensavtal\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Var vnlig ls igenom licensvillkoren innan du installerar $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Om du accepterar villkoren i avtalet, klicka Jag Godknner fr att fortstta. Du mste acceptera avtalet fr att installera $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. Du mste acceptera avtalet fr att installera $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Om du accepterar villkoren i avtalet, vlj det frsta alternativet nedan. Du mste acceptera avtalet fr att installera $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Licensavtal\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Var vnlig ls igenom licensvillkoren innan du avinstallerar $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Om du accepterar villkoren i avtalet, klicka Jag Godknner fr att fortstta. Du mste acceptera avtalet fr att avinstallera $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. Du mste acceptera avtalet fr att avinstallera $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Om du accepterar villkoren i avtalet, vlj det frsta alternativet nedan. Du mste acceptera avtalet fr att avinstallera $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Tryck Page Down fr att se resten av licensavtalet.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Vlj komponenter\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Vlj vilka alternativ av $(^NameDA) som du vill installera.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Vlj komponenter\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Vlj vilka alternativ av $(^NameDA) som du vill avinstallera.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Beskrivning\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Hll muspekaren ver ett alternativ fr att se dess beskrivning.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Hll muspekaren ver ett alternativ fr att se dess beskrivning.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Vlj installationsvg\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Vlj katalog att installera $(^NameDA) i.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Vlj avinstallationsvg\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Vlj katalog att avinstallera $(^NameDA) frn.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Installerar\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Var vnlig vnta medan $(^NameDA) installeras.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Installationen r klar\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Guiden avslutades korrekt.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Installationen avbrts\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Guiden genomfrdes inte korrekt.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Avinstallerar\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Var vnlig vnta medan $(^NameDA) avinstalleras.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Avinstallationen genomfrd\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Avinstallationen genomfrdes korrekt.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Avinstallationen avbruten\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Avinstallationen genomfrdes inte korrekt.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Avslutar installationsguiden fr $(^NameDA).\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) har installerats p din dator.$\\r$\\n$\\r$\\nKlicka p Slutfr fr att avsluta guiden.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Din dator mste startas om fr att fullborda installationen av $(^NameDA). Vill du starta om nu?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Avslutar avinstallationsguiden fr $(^NameDA).\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) komponenter har avinstallerats frn din dator.$\\r$\\n$\\r$\\nKlicka p Slutfr fr att avsluta guiden.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Din dator mste startas om fr att fullborda avinstallationen av $(^NameDA). Vill du starta om nu?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Starta om nu\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Jag vill starta om sjlv senare\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Kr $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Visa Readme-filen\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Slutfr\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Vlj Startmenykatalog\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Vlj en Startmenykatalog fr programmets genvgar.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Vlj startmenykatalog i vilken du vill skapa programmets genvgar. Du kan ange ett eget namn fr att skapa en ny katalog.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Skapa ej genvgar\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Avinstallera $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Ta bort $(^NameDA) frn din dator.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"r du sker p att du vill avbryta installationen av $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"r du sker p att du vill avbryta avinstallationen av $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Thai.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1054\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n874\n# RTL - anything else than RTL means LTR\n-\n# Translation by SoKoOLz, TuW@nNu (asdfuae)\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) Դ\n# ^UninstallCaption\n$(^Name) ¡ԡõԴ\n# ^LicenseSubCaption\n: ͵ŧͧԢԷ\n# ^ComponentsSubCaption\n: ͡õԴ\n# ^DirSubCaption\n: Դ\n# ^InstallingSubCaption\n: ѧԴ\n# ^CompletedSubCaption\n: \n# ^UnComponentsSubCaption\n: ͡¡ԡõԴ\n# ^UnDirSubCaption\n: ¡ԡõԴ\n# ^ConfirmSubCaption\n: ׹ѹ\n# ^UninstallingSubCaption\n: ѧ¡ԡõԴ\n# ^UnCompletedSubCaption\n: \n# ^BackBtn\n< &Ѻ\n# ^NextBtn\n& >\n# ^AgreeBtn\n&ŧ\n# ^AcceptBtn\n&ŧѺ͵ҧǢԢԷ \n# ^DontAcceptBtn\n&Ѻ͵ҧǢԢԷ\n# ^InstallBtn\n&Դ\n# ^UninstallBtn\n&¡ԡõԴ\n# ^CancelBtn\n¡ԡ\n# ^CloseBtn\n&Դ\n# ^BrowseBtn\n&¡...\n# ^ShowDetailsBtn\n&´\n# ^ClickNext\n  кѵѵ\n# ^ClickInstall\n  Դ ͷӡõԴ\n# ^ClickUninstall\n  ¡ԡõԴ ¡ԡõԴ\n# ^Name\n\n# ^Completed\n\n# ^LicenseText\nôҹǹͧѺԢԷ͹سзӡõԴ $(^NameDA). ҤسѺ͵ŧ㹷ءҹ,  ѹѺ\n# ^LicenseTextCB\nôҹǹͧѺԢԷ͹سзӡõԴ $(^NameDA). ҤسѺ͵ŧ㹷ءҹ, ͧ͡ҹҧ. $_CLICK\n# ^LicenseTextRB\nôҹǹͧѺԢԷ͹سзӡõԴ $(^NameDA). ҤسѺ͵ŧ㹷ءҹ, ͡͡áҧҧ. $_CLICK\n# ^UnLicenseText\nôҹǹͧѺԢԷ͹سзӡ¡ԡԴ $(^NameDA). ҤسѺ͵ŧ㹷ءҹ,  ѹѺ\n# ^UnLicenseTextCB\nôҹǹͧѺԢԷ͹سзӡ¡ԡԴ $(^NameDA). ҤسѺ͵ŧ㹷ءҹ, ͧ͡ҹҧ. $_CLICK\n# ^UnLicenseTextRB\nôҹǹͧѺԢԷ͹سзӡ¡ԡԴ $(^NameDA). ҤسѺ͵ŧ㹷ءҹ, ͡͡áҧҧ. $_CLICK\n# ^Custom\n˹ͧ\n# ^ComponentsText\n͡觷سͧõԴ͡觷سͧõԴ $_CLICK\n# ^ComponentsSubText1\n͡ԸաáõԴ:\n# ^ComponentsSubText2_NoInstTypes\n͡觷سͧõԴ:\n# ^ComponentsSubText2\n, ͡͡سͧõԴ:\n# ^UnComponentsText\n͡͡سͧè¡ԡõԴ͡觷سͧè¡ԡõԴ $_CLICK\n# ^UnComponentsSubText1\n͡Ըա¡ԡõԴ:\n# ^UnComponentsSubText2_NoInstTypes\nͧ͡͡è¡ԡõԴ:\n# ^UnComponentsSubText2\n, ͡ҡ͡سͧè¡ԡõԴ:\n# ^DirText\nǵԴ駨зӡõԴ $(^NameDA) ŧѧ仹, ҵͧõԴŧ,  ¡͡ $_CLICK\n# ^DirSubText\nͧõԴ\n# ^DirBrowseText\nͧ͡õԴ $(^NameDA) :\n# ^UnDirText\nǵԴ駨зӡ¡ԡõԴ $(^NameDA) ҡѧ仹, ҵͧ¡ԡõԴ駨ҡ,  ¡ ͡ $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nͧ͡¡ԡõԴ $(^NameDA) ҡ:\n# ^SpaceAvailable\n\"վ鹷: \"\n# ^SpaceRequired\n\"ͧþ鹷: \"\n# ^UninstallingText\n$(^NameDA) ж١¡ԡõԴ駨ҡ仹. $_CLICK\n# ^UninstallingSubText\n¡ԡõԴ駨ҡ:\n# ^FileError\nöԴѺ¹: \\r\\n\\r\\n$0\\r\\n\\r\\n ¡ԡ شõԴ,\\r\\nͧա ͧա, \\r\\nԡ ͢.\n# ^FileError_NoIgnore\nöԴѺ¹: \\r\\n\\r\\n$0\\r\\n\\r\\n ͧա ͧա, \\r\\n¡ԡشõԴ\n# ^CantWrite\n\"ö¹: \"\n# ^CopyFailed\nѴ͡ԴҴ\n# ^CopyTo\n\"Ѵ͡ѧ \"\n# ^Registering\n\"ѧŧ¹: \"\n# ^Unregistering\n\"¡ԡŧ¹: \"\n# ^SymbolNotFound\n\"öѭѡɳ: \"\n# ^CouldNotLoad\n\"öŴ: \"\n# ^CreateFolder\n\"ҧ: \"\n# ^CreateShortcut\n\"ҧ쵤ѷ: \"\n# ^CreatedUninstaller\n\"ҧ¡ԡõԴ: \"\n# ^Delete\n\"ź: \"\n# ^DeleteOnReboot\n\"ź͹պٷ: \"\n# ^ErrorCreatingShortcut\n\"ջѭҧ쵤ѷ: \"\n# ^ErrorCreating\n\"ջѭ㹡ҧ: \"\n# ^ErrorDecompressing\nջѭ㹡ä¢! ԴͼԴҴҡǵԴ?\n# ^ErrorRegistering\nջѭ㹡ŧ¹ DLL\n# ^ExecShell\n\"ѹ: \"\n# ^Exec\n\"ѹ: \"\n# ^Extract\n\"ᵡ: \"\n# ^ErrorWriting\n\"ᵡ: Դѭ㹡¹\"\n# ^InvalidOpcode\nǵԴջѭ:  opcode ԴҴ\n# ^NoOLE\n\" OLE Ѻ: \"\n# ^OutputFolder\n\"յԴ: \"\n# ^RemoveFolder\n\"ź: \"\n# ^RenameOnReboot\n\"¹͵͹պٷ: \"\n# ^Rename\n\"¹: \"\n# ^Skipped\n\": \"\n# ^CopyDetails\nѴ͡´ŧԻ\n# ^LogInstall\nѹ֡õԴ\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Thai.nsh",
    "content": ";Language: Thai (1054)\n;By SoKoOLz, TuW@nNu (asdfuae)\n\n!insertmacro LANGFILE \"Thai\" \"Thai\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Թյ͹ѺõԴ $(^NameDA) \"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"ǵԴѵѵԨйӤسõԴ駢ͧ $(^NameDA).$\\r$\\n$\\r$\\nҢйԴ͹Դ, 繡ѻഷ¢¤س繵ͧӡպٷͧس$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Թյ͹Ѻ¡ԡõԴѵѵԢͧ $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"ǵԴѵѵԹйӤس¡ԡõԴ駢ͧ $(^NameDA).$\\r$\\n$\\r$\\nè¡ԡõԴ駹, ôǨͺ $(^NameDA) $\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"͵ŧͧԢԷ\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"ôҹǹԢԷǢ͵ҧա駡͹سзӡõԴ $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"ҤسѺ͵ŧͧԢԷ,  ѹѺ ͷӵ, سͧѺ㹢͵ŧԢԷͷзӡõԴ $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"ҤسѺ͵ŧͧԢԷ, ͡㹡ͧҧҧ  سͧѺ㹢͵ŧԢԷͷзӡõԴ $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"ҤسѺ͵ŧͧԢԷ,  ͡͡áҹҧ سͧѺ㹢͵ŧԢԷͷзӡõԴ $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"͵ŧͧԢԷ\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"سҹ͵ŧҹԢԷ͹Դ $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"ҤسѺ㹢͵ŧ سҡ ѹѺ Фسеͧŧ͹¡ԡԴ $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"ҤسѺ͵ŧͧԢԷ, ͡㹡ͧҧҧ سͧѺ㹢͵ŧԢԷͷзӡõԴ $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"ҤسѺ͵ŧͧԢԷ, ͡͡áҹҧ سͧѺ㹢͵ŧԢԷͷзӡõԴ $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \" Page Down ҹ͵ŧ\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"͡ǹСͺ\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"͡觷سͧҹҡ $(^NameDA) سͧõԴ\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"͡ǹСͺ\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"͡觷سͧҹҡ $(^NameDA) سͧ¡ԡõԴ\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"´\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Ѻͧس˹ǹСͺʹ´\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Ѻͧس˹ǹСͺʹ´\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"ͧ͡õԴ\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"ͧ͡õԴ $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"ͧ͡¡ԡõԴ\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"͡سͧ¡ԡõԴ駢ͧ $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"ѧԴ\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"ô㹢з $(^NameDA) ѧ١Դ\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"õԴ\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"õԴó\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"õԴ駶١¡ԡ\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"õԴó\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"ѧ¡ԡõԴ\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"ô㹢з $(^NameDA) ѧ١¡ԡõԴ.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"¡ԡõԴ\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"¡ԡõԴó\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"¡ԡõԴ駶١¡ԡ\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"¡ԡõԴ\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"õԴѵѵԢͧ  $(^NameDA) ѧ\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) ١Դŧͧͧس$\\r$\\n$\\r$\\n ͻԴǵԴѵѵ\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"ͧͧس繵ͧʵ÷͡õԴ駢ͧ $(^NameDA) º, سͧè պٷ ǹ?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"¡ԡõԴѵѵԢͧ $(^NameDA) ѧó\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) ١¡ԡ͡ҡͧͧس $\\r$\\n$\\r$\\n  ͻԴ˹Ҩ͵Դѵѵ\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"ͧͧس繵ͧʵ㹡÷зӡ¡ԡõԴ駢ͧ $(^NameDA) , سͧèպٷǹ?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"պٷ ǹ\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"ѹͧ պٷµͧ ѧ\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&ѹ $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&ʴ´\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"͡ Start Menu\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"͡ Start Menu ҧ쵤ѷͧ $(^NameDA). \"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"͡ Start Menu سͧèҧ쵤ѷͧ, سѧö˹ҧա\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"ͧҧ 쵤ѷ\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"¡ԡõԴ $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"¡ԡõԴ $(^NameDA) ҡͧͧس\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"سҤسͧè͡ҡõԴ駢ͧ $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"سҤسͧ͡ҡ¡ԡõԴ駢ͧ $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/TradChinese.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1028\n# Font and size - dash (-) means default rWٻPjp\nsө\n9\n# Codepage - dash (-) means ANSI code page ANSI rX\n950\n# RTL - anything else than RTL means LTR ѥkܥѼg\n-\n# Translator: Kii Ali <kiiali@cpatch.org>;Revision date: 2004-12-14\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) w\n# ^UninstallCaption\n$(^Name) Ѱw\n# ^LicenseSubCaption\n: vĳ\n# ^ComponentsSubCaption\n: w˿ﶵ\n# ^DirSubCaption\n: w˸Ƨ\n# ^InstallingSubCaption\n: bw\n# ^CompletedSubCaption\n: w\n# ^UnComponentsSubCaption\n: Ѱw˿ﶵ\n# ^UnDirSubCaption\n: Ѱw˸Ƨ\n# ^ConfirmSubCaption\n: T{\n# ^UninstallingSubCaption\n: bѰw\n# ^UnCompletedSubCaption\n: \n# ^BackBtn\n< W@B(&P)\n# ^NextBtn\nU@B(&N) >\n# ^AgreeBtn\nڱ(&I)\n# ^AcceptBtn\nڱuvĳv(&A)\n# ^DontAcceptBtn\nڤuvĳv(&N)\n# ^InstallBtn\nw(&I)\n# ^UninstallBtn\n(&U)\n# ^CancelBtn\n(&C)\n# ^CloseBtn\n(&L)\n# ^BrowseBtn\ns(&B)...\n# ^ShowDetailsBtn\nܲӸ`(&D)\n# ^ClickNext\n@U [U@B(N)] ~C\n# ^ClickInstall\n@U [w(I)] }lw˶i{C\n# ^ClickUninstall\n@U [Ѱw(U)] }lѰw˶i{C\n# ^Name\nW\n# ^Completed\nw\n# ^LicenseText\nbw $(^NameDA) e˾\\vĳCpGAĳҦڡA@U [ڦPN(I)] C\n# ^LicenseTextCB\nbw $(^NameDA) e˾\\vĳCpGAĳҦڡA@UU誺ĿءC $_CLICK\n# ^LicenseTextRB\nbw $(^NameDA) e˾\\vĳCpGAĳҦڡAܤU誺Ĥ@ӿﶵC $_CLICK\n# ^UnLicenseText\nbѰw $(^NameDA) e˾\\vĳCpGAĳҦڡA@U [ڦPN(I)] C\n# ^UnLicenseTextCB\nbѰw $(^NameDA) e˾\\vĳCpGAĳҦڡA@UU誺ĿءC $_CLICK\n# ^UnLicenseTextRB\nbѰw $(^NameDA) e˾\\vĳCpGAĳҦڡAܤU誺Ĥ@ӿﶵC $_CLICK\n# ^Custom\nۭq\n# ^ComponentsText\nĿAQnw˪AøѰĿAƱw˪C $_CLICK\n# ^ComponentsSubText1\nw˪: \n# ^ComponentsSubText2_NoInstTypes\nw˪: \n# ^ComponentsSubText2\nΪ̡AۭqQw˪: \n# ^UnComponentsText\nĿAQnѰw˪AøѰĿAƱѰw˪C $_CLICK\n# ^UnComponentsSubText1\nܸѰw˪: \n# ^UnComponentsSubText2_NoInstTypes\nܭnѰw˪: \n# ^UnComponentsSubText2\nάOAܷQnѰw˪iﶵ: \n# ^DirText\nSetup Nw $(^NameDA) bUCƧCnw˨줣PƧA@U [s(B)] ÿܨLƧC $_CLICK\n# ^DirSubText\nؼиƧ\n# ^DirBrowseText\nܭnw $(^NameDA) Ƨm: \n# ^UnDirText\nSetup NѰw $(^NameDA) bUCƧCnѰw˨줣PƧA@U [s(B)] ÿܨLƧC $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nܭnѰw $(^NameDA) Ƨm: \n# ^SpaceAvailable\n\"iΪŶ: \"\n# ^SpaceRequired\n\"һݪŶ: \"\n# ^UninstallingText\noӺFNqAqѰw $(^NameDA) C $_CLICK\n# ^UninstallingSubText\nѰw˥ؿ: \n# ^FileError\nLk}ҭngJɮ: \\r\\n\\t\"$0\"\\r\\n@U [Abort] wˡA\\r\\n [Retry] sռgJɮסA\\r\\n [Ignore] oɮסC\n# ^FileError_NoIgnore\nLk}ҭngJɮ: \\r\\n\\t\"$0\"\\r\\n@U [Retry] sռgJɮסA\\r\\n [Cancel] wˡC\n# ^CantWrite\n\"LkgJ: \"\n# ^CopyFailed\n\"ƻs \"\n# ^CopyTo\n\"ƻs: \"\n# ^Registering\n\"bU: \"\n# ^Unregistering\n\"bѰU: \"\n# ^SymbolNotFound\n\"LkŸ: \"\n# ^CouldNotLoad\n\"LkJ: \"\n# ^CreateFolder\n\"إ߸Ƨ: \" \n# ^CreateShortcut\n\"إ߱|: \"\n# ^CreatedUninstaller\n\"إ߸Ѱw˵{: \"\n# ^Delete\n\"Rɮ: \"\n# ^DeleteOnReboot\n\"sҰʫR: \"\n# ^ErrorCreatingShortcut\n\"bإ߱|ɵoͿ~: \"\n# ^ErrorCreating\n\"bإ߮ɵoͿ~: \"\n# ^ErrorDecompressing\n\"bYƵoͿ~Iwlaw˵{H\"\n# ^ErrorRegistering\n\"bU DLL ɵoͿ~\"\n# ^ExecShell\n\"~{: \"\n# ^Exec\n\": \"\n# ^Extract\n\": \"\n# ^ErrorWriting\n\": LkgJɮ \"\n# ^InvalidOpcode\n\"w˷l: LĪ@~NX \"\n# ^NoOLE\n\"S OLE Ω: \"\n# ^OutputFolder\n\"Xؿ: \"\n# ^RemoveFolder\n\"ؿ: \"\n# ^RenameOnReboot\n\"sҰʫ᭫sRW: \"\n# ^Rename\n\"sRW: \"\n# ^Skipped\n\"wL: \"\n# ^CopyDetails\n\"ƻsӸ`ŶKï \"\n# ^LogInstall\n\"xw˶i{\"\n# byte\nB\n# kilo\nK\n# mega\nM\n# giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/TradChinese.nsh",
    "content": ";Language: 'Chinese (Traditional)' (1028)\n;Translator: Kii Ali <kiiali@cpatch.org>\n;Revision date: 2004-12-15\n\n!insertmacro LANGFILE \"TradChinese\" \"Chinese (Traditional)\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"wϥ $(^NameDA) w˺F\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"oӺFNާA $(^NameDA) w˶i{C$\\r$\\n$\\r$\\nb}lwˤeAĳLҦε{CoN\\\\uw˵{vswtɮסAӤݭnsҰʧAqC$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"wϥ $(^NameDA) Ѱw˺F\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"oӺFN{ާA $(^NameDA) Ѱw˶i{C$\\r$\\n$\\r$\\nb}lѰwˤeAT{ $(^NameDA) åC$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"vĳ\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"bw $(^NameDA) eA˾\\vڡC\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"pGAĳڡA@U [ڦPN(I)] ~wˡCpGA [(C)] Aw˵{N|Cnĳ~w $(^NameDA) C\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"pGAĳڡA@UU誺ĿءCnĳ~w $(^NameDA)C$_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"pGAĳڡAܤUĤ@ӿﶵCnĳ~w $(^NameDA)C$_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"vĳ\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"bѰw $(^NameDA) eA˾\\vڡC\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"pGAĳڡA@U [ڦPN(I)] ~ѰwˡCpGA [(C)] Aw˵{N|Cnĳ~Ѱw $(^NameDA) C\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"pGAĳڡA@UU誺ĿءCnĳ~Ѱw $(^NameDA)C$_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"pGAĳڡAܤUĤ@ӿﶵCnĳ~Ѱw $(^NameDA)C$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"˾\\ĳlAЫ [PgDn] UʭC\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"ܤ\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"ܧAQnw $(^NameDA) ǥ\\C\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \" $(^NameDA) AQnѰw˪\\C\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"yz\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"ʧAƹШ줸󤧤WAKi쥦yzC\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"ʧAƹШ줸󤧤WAKi쥦yzC\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"w˦m\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \" $(^NameDA) nw˪ƧC\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Ѱw˦m\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \" $(^NameDA) nѰw˪ƧC\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"bw\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"$(^NameDA) bwˡAеԡC\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"w˧\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"w˵{w\\a槹C\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"wˤv\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"w˵{å\\a槹C\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"bѰw\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"$(^NameDA) bѰwˡAеԡC\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Ѱwˤw\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Ѱw˵{w\\a槹C\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Ѱwˤw\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Ѱw˵{å\\a槹C\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"b $(^NameDA) w˺F\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA) ww˦bAtΡC$\\r$\\n@U [(F)] FC\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"AtλݭnsҰʡAHK $(^NameDA) wˡC{bnsҰʶܡH\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"b $(^NameDA) Ѱw˺F\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) wqAqѰwˡC$\\r$\\n$\\r$\\n@U [] oӺFC\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"qݭnsҰʡAHK $(^NameDA) ѰwˡC{bQnsҰʶܡH\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"OA{bsҰ(&Y)\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"_AڵyAۦ歫sҰ(&N)\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \" $(^NameDA)(&R)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"ܡuŪɮסv(&M)\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"(&F)\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"ܡu}l\\vƧ\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"ܡu}l\\vƧAΩ{|C\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"ܡu}l\\vƧAHKإߵ{|CA]iHJW١Aإ߷sƧC\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"nإ߱|(&N)\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Ѱw $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"qAqѰw $(^NameDA) C\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"ATwn} $(^Name) w˵{H\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"ATwn} $(^Name) Ѱw˶ܡH\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Turkish.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1055\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1254\n# RTL - anything else than RTL means LTR\n-\n# Translation by ?atay Dilsiz(chagy) (amigos_cagi@hotmail.com)\n# Corrections by Mozilla Trkiye Yerelletirme Topluluu tarafndan evrilmitir. http://mozilla.org.tr\n# ^Branding\nNullsoft Kurulum Sistemi %s\n# ^SetupCaption\n$(^Name) Kurulumu\n# ^UninstallCaption\n$(^Name) Kaldrma\n# ^LicenseSubCaption\n: Lisans Szlemesi\n# ^ComponentsSubCaption\n: Kurulum Seenekleri\n# ^DirSubCaption\n: Kurulum Dizini\n# ^InstallingSubCaption\n: Kuruluyor\n# ^CompletedSubCaption\n: Tamamland\n# ^UnComponentsSubCaption\n: Kaldrma Seenekleri\n# ^UnDirSubCaption\n: Kaldrlacak Dizin\n# ^ConfirmSubCaption\n: Onay\n# ^UninstallingSubCaption\n: Kaldrlyor\n# ^UnCompletedSubCaption\n: Tamamland\n# ^BackBtn\n< &Geri\n# ^NextBtn\n&leri >\n# ^AgreeBtn\n&Kabul Ediyorum\n# ^AcceptBtn\nLisans Szlemesi'nin koullarn &kabul ediyorum\n# ^DontAcceptBtn\nLisans Szlemesi'nin koullarn kabul et&miyorum\n# ^InstallBtn\n&Kur\n# ^UninstallBtn\n&Kaldr\n# ^CancelBtn\nVazge\n# ^CloseBtn\n&Kapat\n# ^BrowseBtn\n&Gzat...\n# ^ShowDetailsBtn\n&Ayrntlar gster\n# ^ClickNext\nDevam etmek iin leri dmesine basn.\n# ^ClickInstall\nKurulumu balatmak iin Kur dmesine basn.\n# ^ClickUninstall\nKaldrmay balatmak iin Kaldr dmesine basn.\n# ^Name\nAd\n# ^Completed\nTamamland\n# ^LicenseText\nLtfen $(^NameDA) uygulamasn kurmadan nce lisans szlemesini gzden geirin. Szlemedeki btn koullar kabul ediyorsanz Kabul Ediyorum dmesine basn.\n# ^LicenseTextCB\nLtfen $(^NameDA) uygulamasn kurmadan nce lisans szlemesini gzden geirin. Szlemedeki btn koullar kabul ediyorsanz aadaki kutuya iaret koyun. $_CLICK\n# ^LicenseTextRB\nLtfen $(^NameDA) uygulamasn kurmadan nce lisans szlemesini gzden geirin. Szlemedeki btn koullar kabul ediyorsanz aadaki ilk seenei sein. $_CLICK\n# ^UnLicenseText\nLtfen $(^NameDA) uygulamasn kaldrmadan nce lisans szlemesini gzden geirin. Szlemedeki btn koullar kabul ediyorsanz Kabul Ediyorum dmesine basn.\n# ^UnLicenseTextCB\nLtfen $(^NameDA) uygulamasn kaldrmadan nce lisans szlemesini gzden geirin. Szlemedeki btn koullar kabul ediyorsanz aadaki kutuya iaret koyun. $_CLICK\n# ^UnLicenseTextRB\nLtfen $(^NameDA) uygulamasn kaldrmadan nce lisans szlemesini gzden geirin. Szlemedeki btn koullar kabul ediyorsanz aadaki ilk seenei sein. $_CLICK\n# ^Custom\nzel\n# ^ComponentsText\nKurmak istediiniz bileenleri iaretleyip kurmak istemediklerinizi iaretlemeden brakn. $_CLICK\n# ^ComponentsSubText1\nKurulum trn sein:\n# ^ComponentsSubText2_NoInstTypes\nKurulacak bileenleri sein:\n# ^ComponentsSubText2\nya da istee bal olarak kurmak istediiniz bileenleri sein:\n# ^UnComponentsText\nKaldrmak istediiniz bileenleri iaretleyip kaldrmak istemediklerinizi iaretlemeden brakn. $_CLICK\n# ^UnComponentsSubText1\nKaldrma trn sein:\n# ^UnComponentsSubText2_NoInstTypes\nKaldrlacak bileenleri sein:\n# ^UnComponentsSubText2\nya da istee bal olarak kaldrmak istediiniz bileenleri sein:\n# ^DirText\n$(^NameDA) aadaki dizinde kurulacak. Farkl bir dizinde kurmak iin Gzat dmesine basp baka bir dizin sein. $_CLICK\n# ^DirSubText\nHedef Dizin\n# ^DirBrowseText\n$(^NameDA) uygulamasnn kurulaca dizini sein:\n# ^UnDirText\n$(^NameDA) aadaki dizinden kaldrlacak. Farkl bir dizinden kaldrmak iin Gzat dmesine basp baka bir dizin sein. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n$(^NameDA) uygulamasnn kaldrlaca dizini sein:\n# ^SpaceAvailable\n\"Kullanlabilir bo alan: \"\n# ^SpaceRequired\n\"Gereken bo alan: \"\n# ^UninstallingText\n$(^NameDA) aadaki dizinden kaldrlacak. $_CLICK\n# ^UninstallingSubText\nKaldrlan yer:\n# ^FileError\nDosya yazmak iin alrken hata meydana geldi: \\r\\n\\r\\n$0\\r\\n\\r\\nKurulumu durdurmak iin Dur dmesine,\\r\\nyeniden denemek iin Yeniden Dene dmesine,\\r\\nbu dosyay atlamak iin Yoksay dmesine basn.\n# ^FileError_NoIgnore\nDosya yazmak iin alrken hata meydana geldi: \\r\\n\\r\\n$0\\r\\n\\r\\nYeniden denemek iin Yeniden Dene dmesine,\\r\\nkurulumu durdurmak iin Vazge dmesine basn.\n# ^CantWrite\n\"Yazlamad: \"\n# ^CopyFailed\nKopyalama baarsz oldu\n# ^CopyTo\n\"Kayt: \"\n# ^Registering\n\"Kaydediliyor: \"\n# ^Unregistering\n\"Kayt siliniyor: \"\n# ^SymbolNotFound\n\"Simge bulunamad: \"\n# ^CouldNotLoad\n\"Yklenemedi: \"\n# ^CreateFolder\n\"Dizin olutur: \"\n# ^CreateShortcut\n\"Ksayol olutur: \"\n# ^CreatedUninstaller\n\"Kaldrma uygulamas olutur: \"\n# ^Delete\n\"Dosya sil: \"\n# ^DeleteOnReboot\n\"Alta sil: \"\n# ^ErrorCreatingShortcut\n\"Ksayol oluturulurken hata meydana geldi: \"\n# ^ErrorCreating\n\"Oluturma hatas: \"\n# ^ErrorDecompressing\nVeriyi aarken hata meydana geldi! Acaba kurulum uygulamas m bozuk?\n# ^ErrorRegistering\nDLL kaydedilirken hata meydana geldi\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"altr: \"\n# ^Extract\n\"A: \"\n# ^ErrorWriting\n\"Ama: Dosyaya yazarken hata meydana geldi \"\n# ^InvalidOpcode\nKurulum bozuk: Geersiz kod\n# ^NoOLE\n\"OLE yok: \"\n# ^OutputFolder\n\"kt dizini: \"\n# ^RemoveFolder\n\"Dizini sil: \"\n# ^RenameOnReboot\n\"Alta adn deitir: \"\n# ^Rename\n\"Ad deitir: \"\n# ^Skipped\n\"Atland: \"\n# ^CopyDetails\nAyrntlar panoya kopyala\n# ^LogInstall\nKurulum srecinin kaydn tut\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Turkish.nsh",
    "content": ";Language: Turkish (1055)\n;By agatay Dilsiz(Chagy)\n;Updated by Fatih BOY (fatih_boy@yahoo.com)\n\n!insertmacro LANGFILE \"Turkish\" \"Trke\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"$(^NameDA) Kurulum sihirbazna ho geldiniz\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Bu sihirbaz size $(^NameDA) kurulumu boyunca rehberlik edecektir.$\\r$\\n$\\r$\\nKurulumu balatmadan nce alan dier programlari kapatmanz neririz. Bylece bilgisayarnz yeniden balatmadan baz sistem dosyalar sorunsuz kurulabilir.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"$(^NameDA) Programn Kaldrma Sihirbazna Ho Geldiniz\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Bu sihirbaz size $(^NameDA) programnn kadrlm boyunca rehberlik edecektir.$\\r$\\n$\\r$\\nKaldrm ilemeni balatmadan nce alan dier programlari kapatmanz neririz. Bylece bilgisayarnz yeniden balatmadan baz sistem dosyalar sorunsuz kaldrlabilir.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Lisans Szlemesi\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Ltfen $(^NameDA) programn kurmadan nce szlemeyi okuyunuz.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Szleme koullarn kabul ediyorsanz, 'Kabul Ediyorum'a basnz. $(^NameDA) programn kurmak iin szleme koullarn kabul etmelisiniz.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Szleme koullarn kabul ediyorsanz, aadaki onay kutusunu doldurunuz. $(^NameDA) programn kurmak iin szleme koullarn kabul etmelisiniz. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Szleme koullarn kabul ediyorsanz, asagidaki onay dmesini seiniz. $(^NameDA) programn kurmak iin szleme koullarn kabul etmelisiniz. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Lisans Szlemesi\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Ltfen $(^NameDA) programn sisteminizden kaldrmadan nce szlemeyi okuyunuz.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Szleme koullarn kabul ediyorsanz, 'Kabul Ediyorum'a basnz. $(^NameDA) programn sisteminizden kaldrmak iin szleme koullarn kabul etmelisiniz.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Szleme koullarn kabul ediyorsanz, aadaki onay kutusunu doldurunuz. $(^NameDA) programn sisteminizden kaldrmak iin szleme koullarn kabul etmelisiniz. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Szleme koullarn kabul ediyorsanz, asagidaki onay dmesini seiniz. $(^NameDA) programn sisteminizden kaldrmak iin szleme koullarn kabul etmelisiniz. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Szlemenin geri kalann okumak iin 'page down' tuuna basabilirsiniz.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Bileen seimi\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Ltfen $(^NameDA) iin kurmak istediginiz bileenleri seiniz.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Bileen eimi\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Ltfen kaldrmak istediiniz $(^NameDA) program bileenini seiniz.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Aklama\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Bileenlerin aklamalarn grmek iin imleci bileen zerine gtrn.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Bileenlerin aklamalarn grmek iin imleci bileen zerine gtrn.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Hedef dizini seimi\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"$(^NameDA) programn kurmak istediiniz dizini einiz.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Kaldrlcak Dizin Seimi\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"$(^NameDA) programn kaldrmak istediginiz dizini seiniz.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Kuruluyor\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Ltfen $(^NameDA) kurulurken bekleyiniz.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Kurulum Tamamland\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Kurulum baaryla tamamland.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Kurulum ptal Edildi\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Kurulum tam olarak tamamlanmad.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Kaldrlyor\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Litfen $(^NameDA) program sisteminizden kaldrlrken bekleyiniz.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Kaldrma lemi Tamamlandr\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Kaldrma ilemi baaryla tamamland.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Kaldrma lemi ptal Edildi\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Kaldrma lemi tamamlanamad.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"$(^NameDA) Kurulum sihirbaz tamamlanyor.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA)  bilgisayariniza yklendi.$\\r$\\n$\\r$\\nLtfen 'Bitir'e basarak kurulumu sonlandrn.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"$(^NameDA) kurulumunun tamamlanmas iin bilgisayarnz yeniden balatmanz gerekiyor.Bilgisayarnz yeniden balatmak istiyor musunuz?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"$(^NameDA) Program Kaldrma Sihirbaz Tamamlanyor\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) program sisteminizden kaldrld.$\\r$\\n$\\r$\\nSihirbaz kapatmak iin 'bitir'e basnz.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"$(^NameDA) programn kaldrma ileminin tamamlanmas iin bilgisayarnzn yeniden balatlmas gerekiyor. Bilgisayarnzn imdi yeniden balatlmasn ister misiniz?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Yeniden balat\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Bilgisayarm daha sonra balatacam.\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"$(^NameDA) programn altr\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"beni oku/readme dosyasn &gster\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Bitir\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Balat Mens Klasr Seimi\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"$(^NameDA) ksayollarnn konulacag balat mens klasrn seiniz.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Programn ksayollarnn konulaca balat mens klasrn seiniz. Farkl bir isim girerek yeni bir klasr yaratabilirsiniz.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Ksayollar oluturmadan devam et\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"$(^NameDA) Programn Kaldr\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"$(^NameDA) programn sisteminizden kaldrma.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"$(^Name) kurulumundan kmak istediinize emin misiniz?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"$(^Name) Programi Kaldrma ileminden kmak istediinize emin misiniz?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Ukrainian.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1058\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1251\n# RTL - anything else than RTL means LTR\n-\n# Translation by Yuri Holubow, Nash-Soft.com <http://www.Nash-Soft.com>\n# Corrections by Dmitriy Kononchuk [http://gri3ly.kiev.ua]\n# New corrections by Osidach Vitaly\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\n$(^Name) \n# ^UninstallCaption\n$(^Name) \n# ^LicenseSubCaption\n: ˳ \n# ^ComponentsSubCaption\n:  \n# ^DirSubCaption\n:  \n# ^InstallingSubCaption\n:  \n# ^CompletedSubCaption\n: \n# ^UnComponentsSubCaption\n:  \n# ^UnDirSubCaption\n:  \n# ^ConfirmSubCaption\n: ϳ\n# ^UninstallingSubCaption\n:  \n# ^UnCompletedSubCaption\n: \n# ^BackBtn\n< &\n# ^NextBtn\n& >\n# ^AgreeBtn\n&\n# ^AcceptBtn\n &  ˳ \n# ^DontAcceptBtn\n &   ˳ \n# ^InstallBtn\n&\n# ^UninstallBtn\n\n# ^CancelBtn\n\n# ^CloseBtn\n&\n# ^BrowseBtn\n&...\n# ^ShowDetailsBtn\n\n# ^ClickNext\n   \n# ^ClickInstall\n     \n# ^ClickUninstall\n     \n# ^Name\n'\n# ^Completed\n\n# ^LicenseText\n      $(^NameDA).     ,    .\n# ^LicenseTextCB\n      $(^NameDA).     ,     . $_CLICK\n# ^LicenseTextRB\n      $(^NameDA).     ,   . $_CLICK\n# ^UnLicenseText\n      $(^NameDA).      ,    .\n# ^UnLicenseTextCB\n      $(^NameDA).     ,     . $_CLICK\n# ^UnLicenseTextRB\n      $(^NameDA).     ,   . $_CLICK\n# ^Custom\n \n# ^ComponentsText\n      . $_CLICK\n# ^ComponentsSubText1\n  :\n# ^ComponentsSubText2_NoInstTypes\n   :\n# ^ComponentsSubText2\n,   ,    :\n# ^UnComponentsText\n     . ³        ,     . $_CLICK\n# ^UnComponentsSubText1\n  :\n# ^UnComponentsSubText2_NoInstTypes\n   :\n# ^UnComponentsSubText2\n        :\n# ^DirText\n  $(^NameDA)   .  ,      ,      . $_CLICK\n# ^DirSubText\n \n# ^DirBrowseText\n    $(^NameDA):\n# ^UnDirText\n   $(^NameDA)   .  ,      ,      . $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n ,      $(^NameDA):\n# ^SpaceAvailable\n\" : \"\n# ^SpaceRequired\n\" : \"\n# ^UninstallingText\n     $(^NameDA)   '. $_CLICK\n# ^UninstallingSubText\n :\n# ^FileError\n    : \\r\\n\\t\"$0\"\\r\\n   ,   ,\\r\\n  ,      , \\r\\n  ,    \n# ^FileError_NoIgnore\n    : \\r\\n\\t\"$0\"\\r\\n   ,      , \\r\\n  ,   \n# ^CantWrite\n\" : \"\n# ^CopyFailed\n \n# ^CopyTo\n\"  \"\n# ^Registering\n\": \"\n# ^Unregistering\n\" : \"\n# ^SymbolNotFound\n\"  : \"\n# ^CouldNotLoad\n\" : \"\n# ^CreateFolder\n\" : \"\n# ^CreateShortcut\n\" : \"\n# ^CreatedUninstaller\n\"  : \"\n# ^Delete\n\" : \"\n# ^DeleteOnReboot\n\"  : \"\n# ^ErrorCreatingShortcut\n\"  : \" \n# ^ErrorCreating\n\" : \"\n# ^ErrorDecompressing\n  .   .\n# ^ErrorRegistering\n   (DLL)\n# ^ExecShell\n\"  : \" \n# ^Exec\n\": \"\n# ^Extract\n\": \"\n# ^ErrorWriting\n\":   \"\n# ^InvalidOpcode\n :   \n# ^NoOLE\n\" OLE : \" \n# ^OutputFolder\n\" : \"\n# ^RemoveFolder\n\" : \"\n# ^RenameOnReboot\n\"  : \"\n# ^Rename\n\": \"\n# ^Skipped\n\": \"\n# ^CopyDetails\n     \n# ^LogInstall\n    \n# byte\n\n# kilo\n\n# mega\n\n# giga\n\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Ukrainian.nsh",
    "content": ";Language: Ukrainian (1058)\n;By Yuri Holubow, http://www.Nash-Soft.com\n;Correct by Osidach Vitaly (Vit_Os2)\n\n!insertmacro LANGFILE \"Ukrainian\" \"Ukrainian\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"     $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"   $(^NameDA)   '.$\\r$\\n$\\r$\\n      .          .$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"     $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"    $(^NameDA).$\\r$\\n$\\r$\\n  , ,    $(^NameDA).$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"˳ \"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"-     $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"   i  , i   .  i      $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"     ,     .        $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"     ,       .        $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"˳ \"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"      $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"   i  , i   .  i      $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"     ,     .        $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"     ,     ,  .        $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"i PageDown    .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"  $(^NameDA) i   .\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"   $(^NameDA)   .\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"ii    ,    .\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"ii    ,    .\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"i  \"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"i    $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"   \"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \" ,      $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \" \"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"- ,        $(^NameDA).\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \" \"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \" i .\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"   i .\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"- ,    $(^NameDA).\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"    .\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \" \"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"    .\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"   $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA)    '.$\\r$\\n$\\r$\\n ʳ  .\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \" ,    $(^NameDA)  '  .   ?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"   $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA)    '.$\\r$\\n$\\r$\\n ,   .\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \" ,    $(^NameDA)  '  .     ?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \" \"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"    \"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"& $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&   \"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&ʳ\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"   \"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"       .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"            .      '    .\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"  \"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \" $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \" $(^NameDA)   '.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \" i,     $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"       $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Uzbek.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Language ID\n1091\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n1252\n# RTL - anything else than RTL means LTR\n-\n# Translation by Emil Garipov [emil.garipov@gmail.com]\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\nO'rnatish $(^Name)\n# ^UninstallCaption\nO'chirish $(^Name)\n# ^LicenseSubCaption\n: Lisenzion kelishuv\n# ^ComponentsSubCaption\n: O'rnatish parametrlari \n# ^DirSubCaption\n: O'rnatish papkasi\n# ^InstallingSubCaption\n: Fayllarni kopiya qilish\n# ^CompletedSubCaption\n: Operatsiya yakunlandi\n# ^UnComponentsSubCaption\n: O'chirish parametrlari\n# ^UnDirSubCaption\n: O'chirsh papkasi\n# ^ConfirmSubCaption\n: Tasdiqlash\n# ^UninstallingSubCaption\n: Fayllarni o'chirish\n# ^UnCompletedSubCaption\n: Operatsiya yakunlandi\n# ^BackBtn\n< &Orqaga\n# ^NextBtn\n&Oldinga >\n# ^AgreeBtn\n&Qabul qilaman\n# ^AcceptBtn\nMen &kelishuv shartlarini qabul qilaman\n# ^DontAcceptBtn\nMen &kelishuv shartlarini qabul qilmayman\n# ^InstallBtn\n&O'rnatish\n# ^UninstallBtn\n&O'chirish\n# ^CancelBtn\nBekor qilish\n# ^CloseBtn\n&Yopish\n# ^BrowseBtn\n&Ko'rish ...\n# ^ShowDetailsBtn\n&...\n# ^ClickNext\nDavom etish uchun 'Oldinga'tugmachasini bosing.\n# ^ClickInstall\nDasturni o'rnatish uchun'O'rnatish' tugmachasini bosing.\n# ^ClickUninstall\nDasturni o'chirish uchun 'O'chirsh' tugmachasini bosing.\n# ^Name\nIsm\n# ^Completed\nTayor\n# ^LicenseText\n$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz 'Qabul qilaman' tugmachasini bosing.\n# ^LicenseTextCB\n$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz bayroqchani joylashtiring. $_CLICK\n# ^LicenseTextRB\n$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz quyida taklif etilganlardan birinchi variantni tanlang. $_CLICK\n# ^UnLicenseText\n$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz 'Qabul qilaman' tugmachasini bosing.\n# ^UnLicenseTextCB\n$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz bayroqchani joylashtiring. $_CLICK\n# ^UnLicenseTextRB\n$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz quyida taklif etilganlardan birinchi variantni tanlang. $_CLICK\n# ^Custom\nTanlash bo'icha\n# ^ComponentsText\nO'rnatish ucun dastur komponentlarini tanlang. $_CLICK\n# ^ComponentsSubText1\nO'rnatish jarayonini tanlang:\n# ^ComponentsSubText2_NoInstTypes\nO'rnatish uchun dastur komponentlarini tanlang:\n# ^ComponentsSubText2\nYoki o'rnatish uchun qushimcha komponentlarini tanlang:\n# ^UnComponentsText\nO'chirish uchun dastur komponentlarini tanlang. $_CLICK\n# ^UnComponentsSubText1\nO'chirish jarayonini tanlang:\n# ^UnComponentsSubText2_NoInstTypes\nO'chirish uchun dastur komponentlarini tanlang:\n# ^UnComponentsSubText2\nYoki o'chirish uchun qushimcha komponentlarini tanlang:\n# ^DirText\nDastur $(^NameDA)ni ko'rsatilgan papkaga o'rnatadi. Boshqa papkaga o'rnatish uchun, 'Ko'rish'tugmachasini bosing va uni ko'rsatib bering. $_CLICK\n# ^DirSubText\nO'rnatish papkasi\n# ^DirBrowseText\nO'rnatish papkasini ko'rsating $(^NameDA):\n# ^UnDirText\nDastur $(^NameDA)ni ko'rsatilgan papkadan o'chiradi. Boshqa papkaga o'rnatish uchun, 'Ko'rish'tugmachasini bosing va uni ko'rsatib bering. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\n$(^NameDA)ni o'chirish uchun papkani ko'rsating:\n# ^SpaceAvailable\n\"Diskda joriy qilingan: \"\n# ^SpaceRequired\n\"Diskda talab qilinadigan: \"\n# ^UninstallingText\n$(^NameDA) dasturi kompyuterizdan uchiriladi. $_CLICK\n# ^UninstallingSubText\nO'chirilish:\n# ^FileError\nYozish uchun faylni ochish imkoniyati yuq: \\r\\n\\t\"$0\"\\r\\n'Tuxtashish': O'rnatishni tuxtatish;\\r\\n\"Takrorlash\":yana bir o'rinib ko'rish;\\r\\n\"Taylab ketish\": shu xarakatni taylab ketish.\n# ^FileError_NoIgnore\nYozish uchun faylni ochish imkoniyati yuq: \\r\\n\\t\"$0\"\\r\\n'Takrorlash': yana bir o'rinib ko'rish;\\r\\n'Bekor qilish': o'rnatish protsessini bekor qilish.\n# ^CantWrite\n\"Yozish uchun imkoniyat yuq: \"\n# ^CopyFailed\nKopiya qilganda xato bor\n# ^CopyTo\n\"Kopiya qilish \"\n# ^Registering\n\"Ro'yxatga olish: \"\n# ^Unregistering\n\"Ro'xatdan chiqish: \"\n# ^SymbolNotFound\n\"Simvolni topish imkoniyati yuq: \"\n# ^CouldNotLoad\n\"Zagruzka qilish imkoniyati yuq: \"\n# ^CreateFolder\n\"Papkani yaratish: \"\n# ^CreateShortcut\n\"Belgini yaratish: \"\n# ^CreatedUninstaller\n\"O'chirish dasturini yaratish: \"\n# ^Delete\n\"Faylni o'chirish: \"\n# ^DeleteOnReboot\n\"Kompyuter qayta yuklash jaraonida o'chirish: \"\n# ^ErrorCreatingShortcut\n\"Belgini yaratish jarayonida xato: \" \n# ^ErrorCreating\n\"Yaratish xatosi: \"\n# ^ErrorDecompressing\nMa'lumotlarni asilga qaytarish xatosi! Distributiv ziyonlangan bulishi mumkin.\n# ^ErrorRegistering\nKutubxonani ro'xatga olish imkoniyati yuq (DLL)\n# ^ExecShell\n\"Qoplang'ich komandasini bajarish: \" \n# ^Exec\n\"Bajarish: \"\n# ^Extract\n\"Ichidan olish: \"\n# ^ErrorWriting\n\"Ichidan olish: fayl yozish xatosi \"\n# ^InvalidOpcode\nDistributiv ziyonlangan: ruxsatlanmangan kod\n# ^NoOLE\n\"Quydagilarga OLE yuq: \" \n# ^OutputFolder\n\"Papkani o'rnatish: \"\n# ^RemoveFolder\n\"Papkani o'chirish: \"\n# ^RenameOnReboot\n\"Kompyuter qayta yuklanish jarayonida ismni qaita quyish: \"\n# ^Rename\n\"Ismni qayta quyish: \"\n# ^Skipped\n\"O'tkazib yuborish: \"\n# ^CopyDetails\nBufer obmenaga ma'lumotlarni kopiya qilish\n# ^LogInstall\nO'rnatish xisobotini chiqorish\n# byte\n\n# kilo\n \n# mega\n \n# giga\n "
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Uzbek.nsh",
    "content": ";Language: Uzbek (1091)\n;Translation updated by Emil Garipov [emil.garipov@gmail.com] \n\n!insertmacro LANGFILE \"Uzbek\" \"Uzbek\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Sizni o'rnatish dastur tabriklaydi $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Bu dastur sizning komputeringizga $(^NameDA) dasturni o'rnatadi.$\\r$\\n$\\r$\\nO'rnatishdan oldin ishlayotgan barcha ilovalarni yopish tavsiya etiladi. Bu o'rnatuvchi dasturga kompyuterni qayta yuklamasdan sistemali fayllarni yangilash imkonini beradi.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Sizni $(^NameDA)ni o'chirish dasturi tabriklaydi\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Bu dastur $(^NameDA)ni sizning kompyuteringizdan o'chiradi.$\\r$\\n$\\r$\\nO'chirishdan oldin $(^NameDA) dasturni ishlamayotganligini aniqlang.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Lisenzion kelishuv\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"$(^NameDA) dasturini o'rnatishdan oldin lisenzion kelishuv bilan tanishib chiking.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Agar kelishuv shartlariga rozi bo'lsangiz $\\\"Qabul kilaman$\\\" tugmasini bosing.Dasturni o'rnatish uchun,kelishuv shartlarini qabul qilish kerak.\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Agar siz kelishuv shartlarini qabul kilsangiz,bayroqchani joylashtiring. Dasturni o'rnatish uchun kelisuv shartlarini qabul qilish kerak. $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Kelishuv shartlarini qabul qilsangiz quida taklif etilganlardan birinchi variantni tanlang. Dasturni o'rnatish uchun kelisuv shartlarini qabul qilish kerak. $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Lisenzion kelishuv\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"$(^NameDA)ni o'chirishdan oldin lesinzion kelishuv bilan tanishing.\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Agar siz kelishuv shartlariniqabul qilsangiz $\\\"Qabul qilaman$\\\" tugmasini bosing. O'chirish uchun kelishuv shartlarini qabul qilishingiz kerak. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Agar shartlarni qabul qilsangiz, bayroqchani o'rnating.O'chirish uchun kelishuv shartlarini qabul qilishingiz kerak. $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Kelishuv shartlarini qabul qilsangiz, taklif etilganlardan birinchi variantni tanlang.O'chirish uchun kelishuv shartlarini qabul qilishingiz kerak. $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Matn bo'icha silgish uchun $\\\"PageUp$\\\" va $\\\"PageDown$\\\" tugmasidan foydalaning.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"O'rnatilayotgan dastur komponentlari\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"$(^NameDA) dasturning o'zingizga kerak bo'lgan komponentasini tanlang.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Dastur komponentlari\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"$(^NameDA)ning o'chirish kerak bo'lgan komponentlarini tanlang.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Tasvir\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Sichqonchaning kursorini komponent tasvirini o'qish uchun ustiga quying.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Sichqonchaning kursorini komponent tasvirini o'qish uchun ustiga quying.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"O'rnatish papkasini tanlash\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"$(^NameDA)ni o'rnatish uchun papka tanlang.\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"O'chiriladigan papkani tanlash\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"$(^NameDA) o'chiriladigan papkasini ko'rsating.\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Fayllarni ko'chirish\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Biror kuting, $(^NameDA) fayllari ko'chirilmoqda...\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"O'rnatish jarayoni tugadi\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"O'rnatish jarayoni muvaffaqiyat bilan tugadi.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"O'rnatish jarayoni uzildi\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"O'rnatish jarayoni tugamadi.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"O'chirish\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Biror kutib turing, $(^NameDA) fayllarini o'chirish bajarilmoqda...\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"O'chirish tuganlandi\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Dasturni o'chirish muvaffaqiyatli yakunlandi.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"O'chirish jarayoni uzildi\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"O'chirish to'la bajarilmadi.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"$(^NameDA)ni o'rnatuvci dasturi o'z ishini tugatmoqda\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"$(^NameDA)ni o'rnatish bajarildi.$\\r$\\n$\\r$\\nO'rnatuvchi dasturdan chiqish uchun $\\\"Tayor$\\\" tugmasini bosing.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"$(^NameDA) dasturini o'rnatish jarayonini tugatish uchun Kompyuterni qayta yuklash kerak.Shu ishni bajarishni xoziroq istaysizmi?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"$(^NameDA)ni o'chirish dasturi o'z ishini tugatdi.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"$(^NameDA) dasturi kompyuteringizdan o'chirildi.$\\r$\\n$\\r$\\nO'chirish dasturidan chiqish uchun $\\\"Tayor$\\\"tugmasini bosing.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"$(^NameDA) dasturini o'chirishni tugatish uchun kompyuterni qayta yuklash kerak.shu ishni xozir bajarasizmi?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Ha, kompyuter hozir qayta yuklansin\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Yo'q, bu ishni keyinroq bajaraman\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"$(^NameDA) &Ishga tushirilsin\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Readme fayli ko'rsatilsin\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Tayor\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Papka $\\\"$\\\" menyusida\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Dastur belgilarini joylashtirish uchun $\\\"$\\\" menyusidan papka tanlang.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"$\\\"$\\\" menyusidan dastur belgilari joylashadigan papka tanlang. Siz papkaning boshqa ismini kiritishingiz mumkin\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Belgilar yaratilmasin\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"$(^NameDA)ni o'chirish\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"$(^NameDA)ni kompyuterdan o'chirish.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Haqiqatdan ham siz $(^Name)ni o'rnatishni bekor qilmoqchimisiz?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"$(^Name)ni o'chirish jarayonini bekor qilmoqchisizmi?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Welsh.nlf",
    "content": "# Header, don't edit\nNLF v6\n# Start editing here\n# Language ID\n1160\n# Font and size - dash (-) means default\n-\n-\n# Codepage - dash (-) means ANSI code page\n-\n# RTL - anything else than RTL means LTR\n-\n# Translation by Rhoslyn Prys, Meddal.com\n# ^Branding\nNullsoft Install System %s\n# ^SetupCaption\nRhaglen Osod $(^Name)\n# ^UninstallCaption\nRhaglen Dadosod $(^Name)\n# ^LicenseSubCaption\n: Cytundeb Trwyddedu\n# ^ComponentsSubCaption\n: Dewisiadau Gosod\n# ^DirSubCaption\n: Ffolder Gosod\n# ^InstallingSubCaption\n: Gosod\n# ^CompletedSubCaption\n: Cwblhawyd\n# ^UnComponentsSubCaption\n: Dewisiadau Dadosod\n# ^UnDirSubCaption\n: Ffolder Dadosod\n# ^ConfirmSubCaption\n: Cadarnhad\n# ^UninstallingSubCaption\n: Dadosod\n# ^UnCompletedSubCaption\n: Cwblhawyd\n# ^BackBtn\n< &Nl\n# ^NextBtn\n&Nesaf >\n# ^AgreeBtn\n&Cytuno\n# ^AcceptBtn\nRwy'n &derbyn Amodau'r Drwydded\n# ^DontAcceptBtn\nRwy'n &gwrthod Amodau'r Drwydded\n# ^InstallBtn\n&Gosod\n# ^UninstallBtn\n&Dadosod\n# ^CancelBtn\nDiddymu\n# ^CloseBtn\nC&au\n# ^BrowseBtn\n&Pori...\n# ^ShowDetailsBtn\n&Dangos manylion\n# ^ClickNext\nCliciwch Nesaf i barhau.\n# ^ClickInstall\nCliciwch Gosod i gychwyn gosod.\n# ^ClickUninstall\nCliciwch Dadosod i gychwyn dadosod.\n# ^Name\nEnw\n# ^Completed\nCwblhawyd\n# ^LicenseText\nDarllenwch y cytundeb trwyddedu cyn gosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch Cytuno.\n# ^LicenseTextCB\nDarllenwch y cytundeb trwyddedu cyn gosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch y blwch ticio isod. $_CLICK\n# ^LicenseTextRB\nDarllenwch y cytundeb trwyddedu cyn gosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, ticiwch y dewis cyntaf isod. $_CLICK\n# ^UnLicenseText\nDarllenwch y cytundeb trwyddedu cyn dadosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch Cytuno.\n# ^UnLicenseTextCB\nDarllenwch y cytundeb trwyddedu cyn dadosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch y blwch ticio isod. $_CLICK\n# ^UnLicenseTextRB\nDarllenwch y cytundeb trwyddedu cyn dadosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, ticiwch y dewis cyntaf isod. $_CLICK\n# ^Custom\nAddasu\n# ^ComponentsText\nTiciwch y cydrannau rydych am eu gosod a dad-dicio'r cydrannau nad ydych am eu gosod. $_CLICK\n# ^ComponentsSubText1\nDewis y math o osod:\n# ^ComponentsSubText2_NoInstTypes\nDewis cydrannau i'w gosod:\n# ^ComponentsSubText2\nNeu, ddewis y cydrannau ychwanegol i'w gosod:\n# ^UnComponentsText\nTiciwch y cydrannau rydych am eu dadosod a dad-dicio'r cydrannau nad ydych am eu dadosod. $_CLICK\n# ^UnComponentsSubText1\nDewis y math o ddadosod:\n# ^UnComponentsSubText2_NoInstTypes\nDewis cydrannau i'w dadosod:\n# ^UnComponentsSubText2\nNeu, ddewis y cydrannau ychwanegol i'w dadosod:\n# ^DirText\nBydd y Rhaglen Osod yn gosod $(^NameDA) yn y ffolder canlynol. I'w osod mewn ffolder gwahanol, cliciwch Pori a dewis ffolder arall. $_CLICK\n# ^DirSubText\nFfolder Cyrchfan\n# ^DirBrowseText\nDewis y ffolder i osod $(^NameDA) ynddo:\n# ^UnDirText\nBydd y Rhegen Osod yn dadosod $(^NameDA) o'r ffolder canlynol. I ddadosod o ffolder gwahanol, cliciwch Pori a dewis ffolder arall. $_CLICK\n# ^UnDirSubText\n\"\"\n# ^UnDirBrowseText\nDewis ffolder i ddadosod $(^NameDA) ohono:\n# ^SpaceAvailable\n\"Lle ar gael: \"\n# ^SpaceRequired\n\"Lle angenrheidiol: \"\n# ^UninstallingText\nBydd $(^NameDA) yn cael ei ddadosod o'r ffolder canlynol. $_CLICK\n# ^UninstallingSubText\nDadosod o:\n# ^FileError\nGwall agor ffeil i'w hysgrifennu: \\r\\n\\r\\n$0\\r\\n\\r\\nCliciwch Atal i atal y gosod,\\r\\nEto i geisio eto, neu\\r\\nAnwybyddu i hepgor y ffeil.\n# ^FileError_NoIgnore\nGwall agor ffeil i'w hysgrifennu: \\r\\n\\r\\n$0\\r\\n\\r\\nCliciwch Eto i geisio eto, neu\\r\\nDiddymu i atal y gosod.\n# ^CantWrite\n\"Methu ysgrifennu: \"\n# ^CopyFailed\nMethu Copo\n# ^CopyTo\n\"Copo i \"\n# ^Registering\n\"Cofrestru: \"\n# ^Unregistering\n\"Dadgofrestru: \"\n# ^SymbolNotFound\n\"Methu canfod symbol: \"\n# ^CouldNotLoad\n\"Methu llwytho: \"\n# ^CreateFolder\n\"Creu ffolder: \"\n# ^CreateShortcut\n\"Creu llwybr byr: \"\n# ^CreatedUninstaller\n\"Creu dadosodwr: \"\n# ^Delete\n\"Dileu ffeil: \"\n# ^DeleteOnReboot\n\"Dileu wrth ailgychwyn: \"\n# ^ErrorCreatingShortcut\n\"Gwall wrth greu llwybr byr: \"\n# ^ErrorCreating\n\"Gwall wrth greu: \"\n# ^ErrorDecompressing\nGwall wrth ddatgywasgu data! Gosodwr llwgr?\n# ^ErrorRegistering\nGwall cofrestru DLL\n# ^ExecShell\n\"ExecShell: \"\n# ^Exec\n\"Gweithredu: \"\n# ^Extract\n\"Echdynnu: \"\n# ^ErrorWriting\n\"Echdynnu: gwall ysgrifennu i ffeil \"\n# ^InvalidOpcode\nGosodwr llwgr: opcode annilys\n# ^NoOLE\n\"Dim OLE ar gyfer: \"\n# ^OutputFolder\n\"Ffolder allbwn: \"\n# ^RemoveFolder\n\"Tynnu ffolder: \"\n# ^RenameOnReboot\n\"Ailenwi wrth ailgychwyn: \"\n# ^Rename\n\"Ailenwi: \"\n# ^Skipped\n\"Hepgor: \"\n# ^CopyDetails\nCopo Manylion i'r Clipfwrdd\n# ^LogInstall\nCofnodi'r brosed gosod\n# ^Byte\nB\n# ^Kilo\nK\n# ^Mega\nM\n# ^Giga\nG\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Language files/Welsh.nsh",
    "content": ";Language: Welsh (1106)\n;By Rhoslyn Prys, Meddal.com\n\n!insertmacro LANGFILE \"Welsh\" \"Welsh\"\n\n!ifdef MUI_WELCOMEPAGE\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE \"Croeso i Ddewin Gosod $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT \"Bydd y dewin yn eich arwain drwy osodiad $(^NameDA).$\\r$\\n$\\r$\\nCaewch pob rhaglen cyn cychwyn y rhaglen osod. Bydd hyn yn ei gwneud yn bosibl i ddiweddaru'r ffeiliau system berthnasol heb fod angen ailgychwyn eich cyfrifiadur.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_UNWELCOMEPAGE\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE \"Croeso i Ddewin Dadosod $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT \"Bydd y dewin yn eich arwain drwy ddadosod $(^NameDA).$\\r$\\n$\\r$\\nCyn cychwyn dadosod, gwnewch yn siwr nad yw $(^NameDA) yn rhedeg.$\\r$\\n$\\r$\\n$_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE\n  ${LangFileString} MUI_TEXT_LICENSE_TITLE \"Cytundeb Trwyddedu\"\n  ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE \"Darllenwch amodau'r drwydded cyn gosod $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM \"Os ydych yn derbyn amodau'r cytundeb, cliciwch Cytuno i barhau. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn gosod $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Os ydych yn derbyn amodau'r cytundeb, cliciwch y blwch ticio isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn gosod $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Os ydych yn derbyn amodau'r cytundeb, cliciwch y dewis cyntaf isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn gosod $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_UNTEXT_LICENSE_TITLE \"Cytundeb Trwyddedu\"\n  ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE \"Darllenwch amodau'r drwydded cyn dadosod $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM \"Os ydych yn derbyn amodau'r cytundeb, cliciwch Cytuno i barhau. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn dadosod  $(^NameDA).\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX \"Os ydych yn derbyn amodau'r cytundeb, cliciwch y blwch ticio isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn dadosod $(^NameDA). $_CLICK\"\n  ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS \"Os ydych yn derbyn amodau'r cytundeb, cliciwch y dewis cyntaf isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn dadosod $(^NameDA). $_CLICK\"\n!endif\n\n!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE\n  ${LangFileString} MUI_INNERTEXT_LICENSE_TOP \"Pwyswch Page Down i ddarllen gweddill y cytundeb.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE\n  ${LangFileString} MUI_TEXT_COMPONENTS_TITLE \"Dewis Cydrannau\"\n  ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE \"Dewis pa nodweddion o $(^NameDA) rydych am eu gosod.\"\n!endif\n\n!ifdef MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE \"Dewis Cydrannau\"\n  ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE \"Dewis pa nodweddion o $(^NameDA) i'w dadoso.\"\n!endif\n\n!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE\n  ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE \"Disgrifiad\"\n  !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Gosod eich llygoden dros gydran i weld ei ddisgrifiad.\"\n  !else\n    ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO \"Gosod eich llygoden dros gydran i weld ei ddisgrifiad.\"\n  !endif\n!endif\n\n!ifdef MUI_DIRECTORYPAGE\n  ${LangFileString} MUI_TEXT_DIRECTORY_TITLE \"Dewis Lleoliad Gosod\"\n  ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE \"Dewis y ffolder i osod $(^NameDA).\"\n!endif\n\n!ifdef MUI_UNDIRECTORYPAGE\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE \"Dewis Lleoliad Dadosod\"\n  ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE \"Dewis y ffolder i ddadosod $(^NameDA).\"\n!endif\n\n!ifdef MUI_INSTFILESPAGE\n  ${LangFileString} MUI_TEXT_INSTALLING_TITLE \"Gosod\"\n  ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE \"Arhoswch tra fo $(^NameDA) yn cael ei osod.\"\n  ${LangFileString} MUI_TEXT_FINISH_TITLE \"Cwblhawyd y Gosod\"\n  ${LangFileString} MUI_TEXT_FINISH_SUBTITLE \"Mae'r Gosod wedi ei gwblhau'n llwyddiannus.\"\n  ${LangFileString} MUI_TEXT_ABORT_TITLE \"Ataliwyd y Gosod\"\n  ${LangFileString} MUI_TEXT_ABORT_SUBTITLE \"Methwyd  chwblhau'r gosod yn llwyddiannus.\"\n!endif\n\n!ifdef MUI_UNINSTFILESPAGE\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE \"Dadosod\"\n  ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE \"Arhoswch tra bo $(^NameDA) yn cael ei ddadosod.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_TITLE \"Cwblhawyd y Dadosod\"\n  ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE \"Mae'r Dadosod wedi ei gwblhau'n llwyddiannus.\"\n  ${LangFileString} MUI_UNTEXT_ABORT_TITLE \"Ataliwyd y Dadosod\"\n  ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE \"Methwyd  chwblhau'r dadosod yn llwyddiannus.\"\n!endif\n\n!ifdef MUI_FINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE \"Cwblhau Dewin Gosod $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT \"Mae $(^NameDA) wedi cael ei osod ar eich cyfrifiadur.$\\r$\\n$\\r$\\nCliciwch Gorffen i gau'r dewin.\"\n  ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT \"Rhaid ailgychwyn eich cyfrifiadur i gwblhau gosod $(^NameDA). Hoffech chi ailgychwyn?\"\n!endif\n\n!ifdef MUI_UNFINISHPAGE\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE \"Cwblhau Dewin Dadosod $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT \"Mae $(^NameDA) wedi ei ddadosod oddi ar eich cyfrifiadur.$\\r$\\n$\\r$\\nCliciwch Gorffen i gau'r dewin.\"\n  ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT \"Rhaid ailgychwyn eich cyfrifiadur i gwblhau gosod $(^NameDA). Hoffech chi ailgychwyn?\"\n!endif\n\n!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW \"Ailgychwyn\"\n  ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER \"Rwyf am ailgychwyn yn hwyrach\"\n  ${LangFileString} MUI_TEXT_FINISH_RUN \"&Rhedeg $(^NameDA)\"\n  ${LangFileString} MUI_TEXT_FINISH_SHOWREADME \"&Dangos Darllenfi\"\n  ${LangFileString} MUI_BUTTONTEXT_FINISH \"&Gorffen\"  \n!endif\n\n!ifdef MUI_STARTMENUPAGE\n  ${LangFileString} MUI_TEXT_STARTMENU_TITLE \"Dewis Ffolder Dewislen Cychwyn\"\n  ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE \"Dewis ffolder Dewislen Cychwyn ar gyfer llwybrau byr $(^NameDA).\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP \"Dewis ffolder Dewislen Cychwyn i greu llwybrau byr y rhaglen. Gallwch roi enw i greu ffolder newydd.\"\n  ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX \"Peidio creu llwybrau byr\"\n!endif\n\n!ifdef MUI_UNCONFIRMPAGE\n  ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE \"Dadosod $(^NameDA)\"\n  ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE \"Tynnu $(^NameDA) oddiar eich cyfrifiadur.\"\n!endif\n\n!ifdef MUI_ABORTWARNING\n  ${LangFileString} MUI_TEXT_ABORTWARNING \"Ydych chi'n si?r eich bod am adael Rhaglen Osod $(^Name)?\"\n!endif\n\n!ifdef MUI_UNABORTWARNING\n  ${LangFileString} MUI_UNTEXT_ABORTWARNING \"Ydych chi'n siwr eich bod am adael Rhaglen Dadosod $(^Name)?\"\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI/System.nsh",
    "content": "/*\n\nNSIS Modern User Interface - Version 1.8\nCopyright 2002-2009 Joost Verburg\n\n*/\n\n!echo \"NSIS Modern User Interface version 1.8 - Copyright 2002-2009 Joost Verburg\"\n\n;--------------------------------\n\n!ifndef MUI_INCLUDED\n!define MUI_INCLUDED\n\n!define MUI_SYSVERSION \"1.8\"\n\n!verbose push\n\n!ifndef MUI_VERBOSE\n  !define MUI_VERBOSE 3\n!endif\n\n!verbose ${MUI_VERBOSE}\n\n;--------------------------------\n;HEADER FILES, DECLARATIONS\n\n!include InstallOptions.nsh\n!include LangFile.nsh\n!include WinMessages.nsh\n\nVar MUI_TEMP1\nVar MUI_TEMP2\n\n;--------------------------------\n;INSERT CODE\n\n!macro MUI_INSERT\n\n  !ifndef MUI_INSERT\n    !define MUI_INSERT\n\n    !ifdef MUI_PRODUCT | MUI_VERSION\n      !warning \"The MUI_PRODUCT and MUI_VERSION defines have been removed. Use a normal Name command now.\"\n    !endif\n\n    !insertmacro MUI_INTERFACE\n\n    !insertmacro MUI_FUNCTION_GUIINIT\n    !insertmacro MUI_FUNCTION_ABORTWARNING\n  \n    !ifdef MUI_IOCONVERT_USED\n      !insertmacro INSTALLOPTIONS_FUNCTION_WRITE_CONVERT\n    !endif\n\n    !ifdef MUI_UNINSTALLER\n      !insertmacro MUI_UNFUNCTION_GUIINIT\n      !insertmacro MUI_FUNCTION_UNABORTWARNING\n    \n      !ifdef MUI_UNIOCONVERT_USED\n        !insertmacro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT\n      !endif\n    !endif\n\n  !endif\n\n!macroend\n\n;--------------------------------\n;GENERAL\n\n!macro MUI_DEFAULT SYMBOL CONTENT\n\n  !ifndef \"${SYMBOL}\"\n    !define \"${SYMBOL}\" \"${CONTENT}\"\n  !endif\n\n!macroend\n\n!macro MUI_DEFAULT_IOCONVERT SYMBOL CONTENT\n\n  !ifndef \"${SYMBOL}\"\n    !define \"${SYMBOL}\" \"${CONTENT}\"\n    !insertmacro MUI_SET \"${SYMBOL}_DEFAULTSET\"\n    !insertmacro MUI_SET \"MUI_${MUI_PAGE_UNINSTALLER_PREFIX}IOCONVERT_USED\"\n  !else\n    !insertmacro MUI_UNSET \"${SYMBOL}_DEFAULTSET\" \n  !endif\n\n!macroend\n\n!macro MUI_SET SYMBOL\n\n  !ifndef \"${SYMBOL}\"\n    !define \"${SYMBOL}\"\n  !endif\n\n!macroend\n\n!macro MUI_UNSET SYMBOL\n\n  !ifdef \"${SYMBOL}\"\n    !undef \"${SYMBOL}\"\n  !endif\n\n!macroend\n\n;--------------------------------\n;INTERFACE - COMPILE TIME SETTINGS\n\n!macro MUI_INTERFACE\n\n  !ifndef MUI_INTERFACE\n    !define MUI_INTERFACE\n\n    !ifdef MUI_INSERT_NSISCONF\n      !insertmacro MUI_NSISCONF\n    !endif\n\n    !insertmacro MUI_DEFAULT MUI_UI \"${NSISDIR}\\Contrib\\UIs\\modern.exe\"\n    !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE \"${NSISDIR}\\Contrib\\UIs\\modern_headerbmp.exe\"\n    !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE_RIGHT \"${NSISDIR}\\Contrib\\UIs\\modern_headerbmpr.exe\"\n    !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_SMALLDESC \"${NSISDIR}\\Contrib\\UIs\\modern_smalldesc.exe\"\n    !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_NODESC \"${NSISDIR}\\Contrib\\UIs\\modern_nodesc.exe\"\n    !insertmacro MUI_DEFAULT MUI_ICON \"${NSISDIR}\\Contrib\\Graphics\\Icons\\modern-install.ico\"\n    !insertmacro MUI_DEFAULT MUI_UNICON \"${NSISDIR}\\Contrib\\Graphics\\Icons\\modern-uninstall.ico\"\n    !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_CHECKBITMAP \"${NSISDIR}\\Contrib\\Graphics\\Checks\\modern.bmp\"\n    !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BGCOLOR \"/windows\"\n    !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_COLORS \"/windows\"\n    !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_PROGRESSBAR \"smooth\"\n    !insertmacro MUI_DEFAULT MUI_BGCOLOR \"FFFFFF\"\n    !insertmacro MUI_DEFAULT MUI_WELCOMEFINISHPAGE_INI \"${NSISDIR}\\Contrib\\Modern UI\\ioSpecial.ini\"\n    !insertmacro MUI_DEFAULT MUI_UNWELCOMEFINISHPAGE_INI \"${NSISDIR}\\Contrib\\Modern UI\\ioSpecial.ini\"\n    !insertmacro MUI_DEFAULT MUI_WELCOMEFINISHPAGE_BITMAP \"${NSISDIR}\\Contrib\\Graphics\\Wizard\\win.bmp\"\n    !insertmacro MUI_DEFAULT MUI_UNWELCOMEFINISHPAGE_BITMAP \"${NSISDIR}\\Contrib\\Graphics\\Wizard\\win.bmp\"\n\n    !ifdef MUI_HEADERIMAGE\n\n      !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_BITMAP \"${NSISDIR}\\Contrib\\Graphics\\Header\\nsis.bmp\"\n\n      !ifndef MUI_HEADERIMAGE_UNBITMAP\n        !define MUI_HEADERIMAGE_UNBITMAP \"${MUI_HEADERIMAGE_BITMAP}\"\n        !ifdef MUI_HEADERIMAGE_BITMAP_NOSTRETCH\n          !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH\n        !endif\n      !endif\n\n      !ifdef MUI_HEADERIMAGE_BITMAP_RTL\n        !ifndef MUI_HEADERIMAGE_UNBITMAP_RTL\n          !define MUI_HEADERIMAGE_UNBITMAP_RTL \"${MUI_HEADERIMAGE_BITMAP_RTL}\"\n          !ifdef MUI_HEADERIMAGE_BITMAP_RTL_NOSTRETCH\n            !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_RTL_NOSTRETCH\n          !endif\n        !endif\n      !endif\n\n    !endif\n\n    XPStyle On\n\n    ChangeUI all \"${MUI_UI}\"\n    !ifdef MUI_HEADERIMAGE\n      !ifndef MUI_HEADERIMAGE_RIGHT\n        ChangeUI IDD_INST \"${MUI_UI_HEADERIMAGE}\"\n      !else\n        ChangeUI IDD_INST \"${MUI_UI_HEADERIMAGE_RIGHT}\"\n      !endif\n    !endif\n    !ifdef MUI_COMPONENTSPAGE_SMALLDESC\n      ChangeUI IDD_SELCOM \"${MUI_UI_COMPONENTSPAGE_SMALLDESC}\"\n    !else ifdef MUI_COMPONENTSPAGE_NODESC\n       ChangeUI IDD_SELCOM \"${MUI_UI_COMPONENTSPAGE_NODESC}\"\n    !endif\n\n    Icon \"${MUI_ICON}\"\n    UninstallIcon \"${MUI_UNICON}\"\n\n    CheckBitmap \"${MUI_COMPONENTSPAGE_CHECKBITMAP}\"\n    LicenseBkColor \"${MUI_LICENSEPAGE_BGCOLOR}\"\n    InstallColors ${MUI_INSTFILESPAGE_COLORS}\n    InstProgressFlags ${MUI_INSTFILESPAGE_PROGRESSBAR}\n\n    SubCaption 4 \" \"\n    UninstallSubCaption 2 \" \"\n\n    !insertmacro MUI_DEFAULT MUI_ABORTWARNING_TEXT \"$(MUI_TEXT_ABORTWARNING)\"\n    !insertmacro MUI_DEFAULT MUI_UNABORTWARNING_TEXT \"$(MUI_UNTEXT_ABORTWARNING)\"\n\n  !endif\n\n!macroend\n\n;--------------------------------\n;INTERFACE - RUN-TIME\n\n!macro MUI_INNERDIALOG_TEXT CONTROL TEXT\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  FindWindow $MUI_TEMP1 \"#32770\" \"\" $HWNDPARENT\n  GetDlgItem $MUI_TEMP1 $MUI_TEMP1 ${CONTROL}\n  SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 \"STR:${TEXT}\"\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_HEADER_TEXT_INTERNAL ID TEXT\n\n  GetDlgItem $MUI_TEMP1 $HWNDPARENT \"${ID}\"\n\n  !ifdef MUI_HEADER_TRANSPARENT_TEXT\n\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n\n  !endif\n\n  SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 \"STR:${TEXT}\"\n\n  !ifdef MUI_HEADER_TRANSPARENT_TEXT\n\n    ShowWindow $MUI_TEMP1 ${SW_SHOWNA}\n\n  !endif\n\n!macroend\n\n!macro MUI_HEADER_TEXT TEXT SUBTEXT\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !ifdef MUI_HEADER_TRANSPARENT_TEXT\n\n    LockWindow on\n\n  !endif\n\n  !insertmacro MUI_HEADER_TEXT_INTERNAL 1037 \"${TEXT}\"\n  !insertmacro MUI_HEADER_TEXT_INTERNAL 1038 \"${SUBTEXT}\"\n\n  !ifdef MUI_HEADER_TRANSPARENT_TEXT\n\n    LockWindow off\n\n  !endif\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_HEADER_TEXT_PAGE TEXT SUBTEXT\n\n  !ifdef MUI_PAGE_HEADER_TEXT & MUI_PAGE_HEADER_SUBTEXT\n    !insertmacro MUI_HEADER_TEXT \"${MUI_PAGE_HEADER_TEXT}\" \"${MUI_PAGE_HEADER_SUBTEXT}\"\n  !else ifdef MUI_PAGE_HEADER_TEXT\n    !insertmacro MUI_HEADER_TEXT \"${MUI_PAGE_HEADER_TEXT}\" \"${SUBTEXT}\"\n  !else ifdef MUI_PAGE_HEADER_SUBTEXT\n    !insertmacro MUI_HEADER_TEXT \"${TEXT}\" \"${MUI_PAGE_HEADER_SUBTEXT}\"\n  !else\n    !insertmacro MUI_HEADER_TEXT \"${TEXT}\" \"${SUBTEXT}\"\n  !endif\n\n  !insertmacro MUI_UNSET MUI_PAGE_HEADER_TEXT\n  !insertmacro MUI_UNSET MUI_PAGE_HEADER_SUBTEXT\n\n!macroend\n\n!macro MUI_DESCRIPTION_BEGIN\n\n  FindWindow $MUI_TEMP1 \"#32770\" \"\" $HWNDPARENT\n  GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043\n\n  StrCmp $0 -1 0 mui.description_begin_done\n    SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 \"STR:\"\n    EnableWindow $MUI_TEMP1 0\n    SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 \"STR:$MUI_TEXT\"\n    Goto mui.description_done\n  mui.description_begin_done:\n\n!macroend\n\n!macro MUI_DESCRIPTION_TEXT VAR TEXT\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  StrCmp $0 ${VAR} 0 mui.description_${VAR}_done\n    SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 \"STR:\"\n    EnableWindow $MUI_TEMP1 1\n    SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 \"STR:${TEXT}\"\n    Goto mui.description_done\n  mui.description_${VAR}_done:\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_DESCRIPTION_END\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  mui.description_done:\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_ENDHEADER\n\n  IfAbort mui.endheader_abort\n\n    !ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT & MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT\n      !insertmacro MUI_HEADER_TEXT \"${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}\" \"${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}\"\n    !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT\n      !insertmacro MUI_HEADER_TEXT \"${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}\" \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)\"\n    !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT\n      !insertmacro MUI_HEADER_TEXT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)\" \"${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}\"\n    !else\n      !insertmacro MUI_HEADER_TEXT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)\" \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)\"\n    !endif\n\n  Goto mui.endheader_done\n\n  mui.endheader_abort:\n\n    !ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT & MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT\n      !insertmacro MUI_HEADER_TEXT \"${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}\" \"${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}\"\n    !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT\n      !insertmacro MUI_HEADER_TEXT \"${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}\" \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)\"\n    !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT\n      !insertmacro MUI_HEADER_TEXT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)\" \"${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}\"\n    !else\n      !insertmacro MUI_HEADER_TEXT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)\" \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)\"\n    !endif\n\n  mui.endheader_done:\n\n!macroend\n\n!macro MUI_ABORTWARNING\n\n  !ifdef MUI_FINISHPAGE_ABORTWARNINGCHECK\n    StrCmp $MUI_NOABORTWARNING \"1\" mui.quit\n  !endif\n\n  !ifdef MUI_ABORTWARNING_CANCEL_DEFAULT\n    MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 \"${MUI_ABORTWARNING_TEXT}\" IDYES mui.quit\n  !else\n    MessageBox MB_YESNO|MB_ICONEXCLAMATION \"${MUI_ABORTWARNING_TEXT}\" IDYES mui.quit\n  !endif\n\n  Abort\n  mui.quit:\n\n!macroend\n\n!macro MUI_UNABORTWARNING\n\n  !ifdef MUI_UNABORTWARNING_CANCEL_DEFAULT\n    MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 \"${MUI_UNABORTWARNING_TEXT}\" IDYES mui.quit\n  !else\n    MessageBox MB_YESNO|MB_ICONEXCLAMATION \"${MUI_UNABORTWARNING_TEXT}\" IDYES mui.quit\n  !endif\n\n  Abort\n  mui.quit:\n\n!macroend\n\n!macro MUI_GUIINIT\n\n  !insertmacro MUI_WELCOMEFINISHPAGE_INIT \"\"\n  !insertmacro MUI_HEADERIMAGE_INIT \"\"\n\n  !insertmacro MUI_GUIINIT_BASIC\n\n!macroend\n\n!macro MUI_UNGUIINIT\n\n  !insertmacro MUI_WELCOMEFINISHPAGE_INIT \"UN\"\n  !insertmacro MUI_HEADERIMAGE_INIT \"UN\"\n\n  !insertmacro MUI_GUIINIT_BASIC\n\n  !ifdef MUI_UNFINISHPAGE\n    !ifndef MUI_UNFINISHPAGE_NOAUTOCLOSE\n      SetAutoClose true\n    !endif\n  !endif\n\n!macroend\n\n!macro MUI_GUIINIT_BASIC\n\n  GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037\n  CreateFont $MUI_TEMP2 \"$(^Font)\" \"$(^FontSize)\" \"700\"\n  SendMessage $MUI_TEMP1 ${WM_SETFONT} $MUI_TEMP2 0\n\n  !ifndef MUI_HEADER_TRANSPARENT_TEXT\n\n    SetCtlColors $MUI_TEMP1 \"\" \"${MUI_BGCOLOR}\"\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038\n    SetCtlColors $MUI_TEMP1 \"\" \"${MUI_BGCOLOR}\"\n\n  !else\n\n    SetCtlColors $MUI_TEMP1 \"\" \"transparent\"\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038\n    SetCtlColors $MUI_TEMP1 \"\" \"transparent\"\n\n  !endif\n\n  GetDlgItem $MUI_TEMP1 $HWNDPARENT 1034\n  SetCtlColors $MUI_TEMP1 \"\" \"${MUI_BGCOLOR}\"\n\n  GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039\n  SetCtlColors $MUI_TEMP1 \"\" \"${MUI_BGCOLOR}\"\n\n  GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028\n  SetCtlColors $MUI_TEMP1 /BRANDING\n  GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256\n  SetCtlColors $MUI_TEMP1 /BRANDING\n  SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 \"STR:$(^Branding) \"\n\n!macroend\n\n!macro MUI_WELCOMEFINISHPAGE_INIT UNINSTALLER\n\n  !ifdef MUI_${UNINSTALLER}WELCOMEPAGE | MUI_${UNINSTALLER}FINISHPAGE\n\n    !insertmacro INSTALLOPTIONS_EXTRACT_AS \"${MUI_${UNINSTALLER}WELCOMEFINISHPAGE_INI}\" \"ioSpecial.ini\"\n    File \"/oname=$PLUGINSDIR\\modern-wizard.bmp\" \"${MUI_${UNINSTALLER}WELCOMEFINISHPAGE_BITMAP}\"\n\n    !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 1\" \"Text\" \"$PLUGINSDIR\\modern-wizard.bmp\"\n\n    !ifdef MUI_${UNINSTALLER}WELCOMEFINISHPAGE_BITMAP_NOSTRETCH\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 1\" \"Flags\" \"\"\n    !endif\n\n  !endif\n\n!macroend\n\n!macro MUI_HEADERIMAGE_INIT UNINSTALLER\n\n  !ifdef MUI_HEADERIMAGE\n\n    InitPluginsDir\n\n    !ifdef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL\n\n    StrCmp $(^RTL) 0 mui.headerimageinit_nortl\n\n        File \"/oname=$PLUGINSDIR\\modern-header.bmp\" \"${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL}\"\n\n        !ifndef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL_NOSTRETCH\n          SetBrandingImage /IMGID=1046 /RESIZETOFIT \"$PLUGINSDIR\\modern-header.bmp\"\n        !else\n          SetBrandingImage /IMGID=1046 \"$PLUGINSDIR\\modern-header.bmp\"\n        !endif\n\n        Goto mui.headerimageinit_done\n\n      mui.headerimageinit_nortl:\n\n    !endif\n\n        File \"/oname=$PLUGINSDIR\\modern-header.bmp\" \"${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP}\"\n\n        !ifndef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_NOSTRETCH\n          SetBrandingImage /IMGID=1046 /RESIZETOFIT \"$PLUGINSDIR\\modern-header.bmp\"\n        !else\n          SetBrandingImage /IMGID=1046 \"$PLUGINSDIR\\modern-header.bmp\"\n        !endif\n\n    !ifdef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL\n\n    mui.headerimageinit_done:\n\n    !endif\n\n  !endif\n\n!macroend\n\n;--------------------------------\n;INTERFACE - FUNCTIONS\n\n!macro MUI_FUNCTION_GUIINIT\n\n  Function .onGUIInit\n\n    !insertmacro MUI_GUIINIT\n\n    !ifdef MUI_CUSTOMFUNCTION_GUIINIT\n      Call \"${MUI_CUSTOMFUNCTION_GUIINIT}\"\n    !endif\n\n  FunctionEnd\n\n!macroend\n\n!macro MUI_FUNCTION_DESCRIPTION_BEGIN\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !ifndef MUI_VAR_TEXT\n    Var MUI_TEXT\n    !define MUI_VAR_TEXT\n  !endif\n\n  Function .onMouseOverSection\n    !insertmacro MUI_DESCRIPTION_BEGIN\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_FUNCTION_DESCRIPTION_END\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n    !insertmacro MUI_DESCRIPTION_END\n    !ifdef MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION\n      Call \"${MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION}\"\n    !endif\n  FunctionEnd\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNFUNCTION_DESCRIPTION_BEGIN\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  Function un.onMouseOverSection\n    !insertmacro MUI_DESCRIPTION_BEGIN\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNFUNCTION_DESCRIPTION_END\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n    !insertmacro MUI_DESCRIPTION_END\n    !ifdef MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION\n      Call \"${MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION}\"\n    !endif\n  FunctionEnd\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_FUNCTION_ABORTWARNING\n\n  Function .onUserAbort\n    !ifdef MUI_ABORTWARNING\n      !insertmacro MUI_ABORTWARNING\n    !endif\n    !ifdef MUI_CUSTOMFUNCTION_ABORT\n      Call \"${MUI_CUSTOMFUNCTION_ABORT}\"\n    !endif\n  FunctionEnd\n\n!macroend\n\n!macro MUI_FUNCTION_UNABORTWARNING\n\n  Function un.onUserAbort\n    !ifdef MUI_UNABORTWARNING\n      !insertmacro MUI_UNABORTWARNING\n    !endif\n    !ifdef MUI_CUSTOMFUNCTION_UNABORT\n      Call \"${MUI_CUSTOMFUNCTION_UNABORT}\"\n    !endif\n  FunctionEnd\n\n!macroend\n\n!macro MUI_UNFUNCTION_GUIINIT\n\n  Function un.onGUIInit\n\n  !insertmacro MUI_UNGUIINIT\n\n  !ifdef MUI_CUSTOMFUNCTION_UNGUIINIT\n    Call \"${MUI_CUSTOMFUNCTION_UNGUIINIT}\"\n  !endif\n\n  FunctionEnd\n\n!macroend\n\n!macro MUI_FUNCTIONS_DESCRIPTION_BEGIN\n\n  ;1.65 compatibility\n\n  !warning \"Modern UI macro name has changed. Please change MUI_FUNCTIONS_DESCRIPTION_BEGIN to MUI_FUNCTION_DESCRIPTION_BEGIN.\"\n\n  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN\n\n!macroend\n\n!macro MUI_FUNCTIONS_DESCRIPTION_END\n\n  ;1.65 compatibility\n\n  !warning \"Modern UI macro name has changed. Please change MUI_FUNCTIONS_DESCRIPTION_END to MUI_FUNCTION_DESCRIPTION_END.\"\n\n  !insertmacro MUI_FUNCTION_DESCRIPTION_END\n\n!macroend\n\n;--------------------------------\n;START MENU FOLDER\n\n!macro MUI_STARTMENU_GETFOLDER ID VAR\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !ifdef MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME\n\n    ReadRegStr $MUI_TEMP1 \"${MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT}\" \"${MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY}\" \"${MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME}\"\n      StrCmp $MUI_TEMP1 \"\" +3\n        StrCpy \"${VAR}\" $MUI_TEMP1\n        Goto +2\n\n        StrCpy \"${VAR}\" \"${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}\"\n\n   !else\n\n     StrCpy \"${VAR}\" \"${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}\"\n\n   !endif\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_STARTMENU_WRITE_BEGIN ID\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !define MUI_STARTMENUPAGE_CURRENT_ID \"${ID}\"\n\n  StrCpy $MUI_TEMP1 \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}\" 1\n  StrCmp $MUI_TEMP1 \">\" mui.startmenu_write_${MUI_STARTMENUPAGE_CURRENT_ID}_done\n\n  StrCmp \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}\" \"\" 0 mui.startmenu_writebegin_${MUI_STARTMENUPAGE_CURRENT_ID}_notempty\n\n    !insertmacro MUI_STARTMENU_GETFOLDER \"${MUI_STARTMENUPAGE_CURRENT_ID}\" \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}\"\n\n  mui.startmenu_writebegin_${MUI_STARTMENUPAGE_CURRENT_ID}_notempty:\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_STARTMENU_WRITE_END\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !ifdef MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME\n    WriteRegStr \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT}\" \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY}\" \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME}\" \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}\"\n  !endif\n\n  mui.startmenu_write_${MUI_STARTMENUPAGE_CURRENT_ID}_done:\n\n  !undef MUI_STARTMENUPAGE_CURRENT_ID\n\n  !verbose pop\n\n!macroend\n\n;--------------------------------\n;PAGES\n\n!macro MUI_PAGE_INIT\n\n  !insertmacro MUI_INTERFACE\n\n  !insertmacro MUI_DEFAULT MUI_PAGE_UNINSTALLER_PREFIX \"\"\n  !insertmacro MUI_DEFAULT MUI_PAGE_UNINSTALLER_FUNCPREFIX \"\"\n\n  !insertmacro MUI_UNSET MUI_UNIQUEID\n\n  !define MUI_UNIQUEID ${__LINE__}\n\n!macroend\n\n!macro MUI_UNPAGE_INIT\n\n  !ifndef MUI_UNINSTALLER\n    !define MUI_UNINSTALLER\n  !endif\n\n  !define MUI_PAGE_UNINSTALLER\n\n  !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_PREFIX\n  !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_FUNCPREFIX\n\n  !define MUI_PAGE_UNINSTALLER_PREFIX \"UN\"\n  !define MUI_PAGE_UNINSTALLER_FUNCPREFIX \"un.\"\n\n!macroend\n\n!macro MUI_UNPAGE_END\n\n  !undef MUI_PAGE_UNINSTALLER\n  !undef MUI_PAGE_UNINSTALLER_PREFIX\n  !undef MUI_PAGE_UNINSTALLER_FUNCPREFIX\n\n!macroend\n\n!macro MUI_PAGE_WELCOME\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEPAGE\n\n  !insertmacro MUI_DEFAULT_IOCONVERT MUI_WELCOMEPAGE_TITLE \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TITLE)\"\n  !insertmacro MUI_DEFAULT_IOCONVERT MUI_WELCOMEPAGE_TEXT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TEXT)\"\n\n  !ifndef MUI_VAR_HWND\n    Var MUI_HWND\n    !define MUI_VAR_HWND\n  !endif\n\n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID}\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_WELCOMEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID}\n\n  !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE\n  !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_3LINES\n  !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_PAGE_LICENSE LICENSEDATA\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}LICENSEPAGE\n\n  !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_TEXT_TOP \"$(MUI_INNERTEXT_LICENSE_TOP)\"\n  !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BUTTON \"\"\n  !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_CHECKBOX_TEXT \"\"\n  !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT \"\"\n  !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE \"\"\n\n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}license\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n    LicenseData \"${LICENSEDATA}\"\n\n    !ifndef MUI_LICENSEPAGE_TEXT_BOTTOM\n      !ifndef MUI_LICENSEPAGE_CHECKBOX & MUI_LICENSEPAGE_RADIOBUTTONS\n        LicenseText \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM)\" \"${MUI_LICENSEPAGE_BUTTON}\"\n      !else ifdef MUI_LICENSEPAGE_CHECKBOX\n        LicenseText \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_CHECKBOX)\" \"${MUI_LICENSEPAGE_BUTTON}\"\n      !else\n        LicenseText \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS)\" \"${MUI_LICENSEPAGE_BUTTON}\"\n      !endif\n    !else\n      LicenseText \"${MUI_LICENSEPAGE_TEXT_BOTTOM}\" \"${MUI_LICENSEPAGE_BUTTON}\"\n    !endif\n\n    !ifdef MUI_LICENSEPAGE_CHECKBOX\n      LicenseForceSelection checkbox \"${MUI_LICENSEPAGE_CHECKBOX_TEXT}\"\n    !else ifdef MUI_LICENSEPAGE_RADIOBUTTONS\n      LicenseForceSelection radiobuttons \"${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT}\" \"${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE}\"\n    !endif\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_LICENSEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID}\n\n  !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_TOP\n  !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_BOTTOM\n  !insertmacro MUI_UNSET MUI_LICENSEPAGE_BUTTON\n  !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX\n    !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT\n  !insertmacro MUI_UNSET MUI_LICENSEPAGE_RADIOBUTTONS\n    !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_ACCEPT\n    !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_DECLINE\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_PAGE_COMPONENTS\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}COMPONENTSPAGE\n\n  !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_TOP \"\"\n  !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_COMPLIST \"\"\n  !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_INSTTYPE \"\"\n  !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE \"$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE)\"\n  !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO \"$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)\"\n\n  !ifndef MUI_VAR_TEXT\n    Var MUI_TEXT\n    !define MUI_VAR_TEXT\n  !endif\n\n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}components\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n    ComponentText \"${MUI_COMPONENTSPAGE_TEXT_TOP}\" \"${MUI_COMPONENTSPAGE_TEXT_INSTTYPE}\" \"${MUI_COMPONENTSPAGE_TEXT_COMPLIST}\"\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_COMPONENTSPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID}\n\n  !undef MUI_COMPONENTSPAGE_TEXT_TOP\n  !undef MUI_COMPONENTSPAGE_TEXT_COMPLIST\n  !undef MUI_COMPONENTSPAGE_TEXT_INSTTYPE\n  !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE\n  !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_PAGE_DIRECTORY\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}DIRECTORYPAGE\n\n  !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_TOP \"\"\n  !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_DESTINATION \"\"\n\n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}directory\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n    DirText \"${MUI_DIRECTORYPAGE_TEXT_TOP}\" \"${MUI_DIRECTORYPAGE_TEXT_DESTINATION}\"\n\n    !ifdef MUI_DIRECTORYPAGE_VARIABLE\n      DirVar \"${MUI_DIRECTORYPAGE_VARIABLE}\"\n    !endif\n\n    !ifdef MUI_DIRECTORYPAGE_VERIFYONLEAVE\n      DirVerify leave\n    !endif\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_DIRECTORYPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID}\n\n  !undef MUI_DIRECTORYPAGE_TEXT_TOP\n  !undef MUI_DIRECTORYPAGE_TEXT_DESTINATION\n  !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_BGCOLOR\n  !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VARIABLE\n  !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VERIFYONLEAVE\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_PAGE_STARTMENU ID VAR\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}STARTMENUPAGE\n\n  !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_DEFAULTFOLDER \"$(^Name)\"\n  !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_TOP \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_TOP)\"\n  !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_CHECKBOX \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_CHECKBOX)\"\n\n  !define MUI_STARTMENUPAGE_VARIABLE \"${VAR}\"\n  !define \"MUI_STARTMENUPAGE_${ID}_VARIABLE\" \"${MUI_STARTMENUPAGE_VARIABLE}\"\n  !define \"MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER\" \"${MUI_STARTMENUPAGE_DEFAULTFOLDER}\"\n  !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT\n    !define \"MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT\" \"${MUI_STARTMENUPAGE_REGISTRY_ROOT}\"\n  !endif\n  !ifdef MUI_STARTMENUPAGE_REGISTRY_KEY\n    !define \"MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY\" \"${MUI_STARTMENUPAGE_REGISTRY_KEY}\"\n  !endif\n  !ifdef MUI_STARTMENUPAGE_REGISTRY_VALUENAME\n    !define \"MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME\" \"${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}\"\n  !endif\n\n  !ifndef MUI_VAR_HWND\n    Var MUI_HWND\n    !define MUI_VAR_HWND\n  !endif\n\n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_STARTMENUPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID}\n\n  !undef MUI_STARTMENUPAGE_VARIABLE\n  !undef MUI_STARTMENUPAGE_TEXT_TOP\n  !undef MUI_STARTMENUPAGE_TEXT_CHECKBOX\n  !undef MUI_STARTMENUPAGE_DEFAULTFOLDER\n  !insertmacro MUI_UNSET MUI_STARTMENUPAGE_NODISABLE\n  !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_ROOT\n  !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_KEY\n  !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_VALUENAME\n  !insertmacro MUI_UNSET MUI_STARTMENUPAGE_BGCOLOR\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_PAGE_INSTFILES\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INSTFILESPAGE\n\n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}instfiles\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_INSTFILESPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID}\n\n  !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_TEXT\n  !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT\n  !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_TEXT\n  !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_SUBTEXT\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_PAGE_FINISH\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE\n\n  !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TITLE \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TITLE)\"\n  !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TEXT)\"\n  !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_BUTTON \"$(MUI_BUTTONTEXT_FINISH)\"\n  !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT_REBOOT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_REBOOT)\"\n  !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT_REBOOTNOW \"$(MUI_TEXT_FINISH_REBOOTNOW)\"\n  !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT_REBOOTLATER \"$(MUI_TEXT_FINISH_REBOOTLATER)\"\n  !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_RUN_TEXT \"$(MUI_TEXT_FINISH_RUN)\"\n  !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_SHOWREADME_TEXT \"$(MUI_TEXT_FINISH_SHOWREADME)\"\n  !insertmacro MUI_DEFAULT MUI_FINISHPAGE_LINK_COLOR \"000080\"\n\n  !ifndef MUI_VAR_HWND\n    Var MUI_HWND\n    !define MUI_VAR_HWND\n  !endif\n\n  !ifndef MUI_PAGE_UNINSTALLER\n    !ifndef MUI_FINISHPAGE_NOAUTOCLOSE\n      AutoCloseWindow true\n    !endif\n  !endif\n\n  !ifdef MUI_FINISHPAGE_CANCEL_ENABLED\n    !ifndef MUI_VAR_NOABORTWARNING\n      !define MUI_VAR_NOABORTWARNING\n      Var MUI_NOABORTWARNING\n    !endif\n  !endif\n\n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_FINISHPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishLeave_${MUI_UNIQUEID}\n\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE_3LINES\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_LARGE\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_BUTTON\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_CANCEL_ENABLED\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOT\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTNOW\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTLATER\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTLATER_DEFAULT\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_TEXT\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_PARAMETERS\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_NOTCHECKED\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_FUNCTION\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_TEXT\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_NOTCHECKED\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_FUNCTION\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_LOCATION\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_COLOR\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_NOREBOOTSUPPORT\n\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_TOP\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_BOTTOM\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNPAGE_WELCOME\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_UNPAGE_INIT\n\n    !insertmacro MUI_PAGE_WELCOME\n\n  !insertmacro MUI_UNPAGE_END\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNPAGE_CONFIRM\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !ifndef MUI_UNINSTALLER\n    !define MUI_UNINSTALLER\n  !endif\n\n  !insertmacro MUI_PAGE_INIT\n\n  !insertmacro MUI_SET MUI_UNCONFIRMPAGE\n\n  !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_TOP \"\"\n  !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_LOCATION \"\"\n\n  PageEx un.uninstConfirm\n\n    PageCallbacks un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n    UninstallText \"${MUI_UNCONFIRMPAGE_TEXT_TOP}\" \"${MUI_UNCONFIRMPAGE_TEXT_LOCATION}\"\n\n  PageExEnd\n\n  !insertmacro MUI_UNFUNCTION_CONFIRMPAGE un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID}\n\n  !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_TOP\n  !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_LOCATION\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNPAGE_LICENSE LICENSEDATA\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_UNPAGE_INIT\n\n    !insertmacro MUI_PAGE_LICENSE \"${LICENSEDATA}\"\n\n  !insertmacro MUI_UNPAGE_END\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNPAGE_COMPONENTS\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_UNPAGE_INIT\n\n    !insertmacro MUI_PAGE_COMPONENTS\n\n  !insertmacro MUI_UNPAGE_END\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNPAGE_DIRECTORY\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_UNPAGE_INIT\n\n    !insertmacro MUI_PAGE_DIRECTORY\n\n  !insertmacro MUI_UNPAGE_END\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNPAGE_INSTFILES\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_UNPAGE_INIT\n\n    !insertmacro MUI_PAGE_INSTFILES\n\n  !insertmacro MUI_UNPAGE_END\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNPAGE_FINISH\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_UNPAGE_INIT\n\n    !insertmacro MUI_PAGE_FINISH\n\n  !insertmacro MUI_UNPAGE_END\n\n  !verbose pop\n\n!macroend\n\n;--------------------------------\n;PAGE FUNCTIONS\n\n!macro MUI_PAGE_FUNCTION_CUSTOM TYPE\n\n  !ifdef MUI_PAGE_CUSTOMFUNCTION_${TYPE}\n    Call \"${MUI_PAGE_CUSTOMFUNCTION_${TYPE}}\"\n    !undef MUI_PAGE_CUSTOMFUNCTION_${TYPE}\n  !endif\n\n!macroend\n\n!macro MUI_WELCOMEFINISHPAGE_FUNCTION_CUSTOM\n\n  !ifdef MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT\n    Call \"${MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT}\"\n    !undef MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT\n  !endif\n\n!macroend\n\n!macro MUI_FUNCTION_WELCOMEPAGE PRE LEAVE\n\n  Function \"${PRE}\"\n\n    !insertmacro MUI_WELCOMEFINISHPAGE_FUNCTION_CUSTOM\n\n    !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Settings\" \"NumFields\" \"3\"\n    !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Settings\" \"NextButtonText\" \"\"\n    !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Settings\" \"CancelEnabled\" \"\"\n\n    !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT \"ioSpecial.ini\" \"Field 2\" \"Text\" MUI_WELCOMEPAGE_TITLE\n\n    !ifndef MUI_WELCOMEPAGE_TITLE_3LINES\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 2\" \"Bottom\" \"38\"\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Top\" \"45\"\n    !else\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 2\" \"Bottom\" \"48\"\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Top\" \"55\"\n    !endif\n\n    !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Bottom\" \"185\"\n    !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT \"ioSpecial.ini\" \"Field 3\" \"Text\" MUI_WELCOMEPAGE_TEXT\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n\n    LockWindow on\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n    LockWindow off\n\n    !insertmacro INSTALLOPTIONS_INITDIALOG \"ioSpecial.ini\"\n    Pop $MUI_HWND\n    SetCtlColors $MUI_HWND \"\" \"${MUI_BGCOLOR}\"\n\n    GetDlgItem $MUI_TEMP1 $MUI_HWND 1201\n    SetCtlColors $MUI_TEMP1 \"\" \"${MUI_BGCOLOR}\"\n\n    CreateFont $MUI_TEMP2 \"$(^Font)\" \"12\" \"700\"\n    SendMessage $MUI_TEMP1 ${WM_SETFONT} $MUI_TEMP2 0\n\n    GetDlgItem $MUI_TEMP1 $MUI_HWND 1202\n    SetCtlColors $MUI_TEMP1 \"\" \"${MUI_BGCOLOR}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n\n    !insertmacro INSTALLOPTIONS_SHOW\n\n    LockWindow on\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n    LockWindow off\n\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n  FunctionEnd\n\n!macroend\n\n!macro MUI_FUNCTION_LICENSEPAGE PRE SHOW LEAVE\n\n  Function \"${PRE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n    !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_SUBTITLE)\n\n  FunctionEnd\n\n  Function \"${SHOW}\"\n\n    !insertmacro MUI_INNERDIALOG_TEXT 1040 \"${MUI_LICENSEPAGE_TEXT_TOP}\"\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n  FunctionEnd\n\n!macroend\n\n!macro MUI_FUNCTION_COMPONENTSPAGE PRE SHOW LEAVE\n\n  Function \"${PRE}\"\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n    !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_SUBTITLE)\n  FunctionEnd\n\n  Function \"${SHOW}\"\n\n    !insertmacro MUI_INNERDIALOG_TEXT 1042 \"${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}\"\n\n    FindWindow $MUI_TEMP1 \"#32770\" \"\" $HWNDPARENT\n    GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043\n    EnableWindow $MUI_TEMP1 0\n\n    !insertmacro MUI_INNERDIALOG_TEXT 1043 \"${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}\"\n    StrCpy $MUI_TEXT \"${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}\"\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n  FunctionEnd\n\n!macroend\n\n!macro MUI_FUNCTION_DIRECTORYPAGE PRE SHOW LEAVE\n\n  Function \"${PRE}\"\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n    !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_SUBTITLE)\n  FunctionEnd\n\n  Function \"${SHOW}\"\n    !ifdef MUI_DIRECTORYPAGE_BGCOLOR\n      FindWindow $MUI_TEMP1 \"#32770\" \"\" $HWNDPARENT\n      GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1019\n      SetCtlColors $MUI_TEMP1 \"\" \"${MUI_DIRECTORYPAGE_BGCOLOR}\"\n    !endif\n    \n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n  FunctionEnd\n\n!macroend\n\n!macro MUI_FUNCTION_STARTMENUPAGE PRE LEAVE\n\n  Function \"${PRE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n\n     !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT & MUI_STARTMENUPAGE_REGISTRY_KEY & MUI_STARTMENUPAGE_REGISTRY_VALUENAME\n\n      StrCmp \"${MUI_STARTMENUPAGE_VARIABLE}\" \"\" 0 +4\n\n      ReadRegStr $MUI_TEMP1 \"${MUI_STARTMENUPAGE_REGISTRY_ROOT}\" \"${MUI_STARTMENUPAGE_REGISTRY_KEY}\" \"${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}\"\n        StrCmp $MUI_TEMP1 \"\" +2\n          StrCpy \"${MUI_STARTMENUPAGE_VARIABLE}\" $MUI_TEMP1\n\n    !endif\n\n    !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_TEXT_STARTMENU_TITLE) $(MUI_TEXT_STARTMENU_SUBTITLE)\n\n    StrCmp $(^RTL) 0 mui.startmenu_nortl\n      !ifndef MUI_STARTMENUPAGE_NODISABLE\n        StartMenu::Init /rtl /noicon /autoadd /text \"${MUI_STARTMENUPAGE_TEXT_TOP}\" /lastused \"${MUI_STARTMENUPAGE_VARIABLE}\" /checknoshortcuts \"${MUI_STARTMENUPAGE_TEXT_CHECKBOX}\" \"${MUI_STARTMENUPAGE_DEFAULTFOLDER}\"\n      !else\n        StartMenu::Init /rtl /noicon /autoadd /text \"${MUI_STARTMENUPAGE_TEXT_TOP}\" /lastused \"${MUI_STARTMENUPAGE_VARIABLE}\" \"${MUI_STARTMENUPAGE_DEFAULTFOLDER}\"\n      !endif\n      Goto mui.startmenu_initdone\n    mui.startmenu_nortl:\n      !ifndef MUI_STARTMENUPAGE_NODISABLE\n        StartMenu::Init /noicon /autoadd /text \"${MUI_STARTMENUPAGE_TEXT_TOP}\" /lastused \"${MUI_STARTMENUPAGE_VARIABLE}\" /checknoshortcuts \"${MUI_STARTMENUPAGE_TEXT_CHECKBOX}\" \"${MUI_STARTMENUPAGE_DEFAULTFOLDER}\"\n      !else\n        StartMenu::Init /noicon /autoadd /text \"${MUI_STARTMENUPAGE_TEXT_TOP}\" /lastused \"${MUI_STARTMENUPAGE_VARIABLE}\" \"${MUI_STARTMENUPAGE_DEFAULTFOLDER}\"\n      !endif\n    mui.startmenu_initdone:\n\n  Pop $MUI_HWND\n\n  !ifdef MUI_STARTMENUPAGE_BGCOLOR\n    GetDlgItem $MUI_TEMP1 $MUI_HWND 1002\n    SetCtlColors $MUI_TEMP1 \"\" \"${MUI_STARTMENUPAGE_BGCOLOR}\"\n    GetDlgItem $MUI_TEMP1 $MUI_HWND 1004\n    SetCtlColors $MUI_TEMP1 \"\" \"${MUI_STARTMENUPAGE_BGCOLOR}\"\n  !endif\n\n  !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n\n  StartMenu::Show\n\n    Pop $MUI_TEMP1\n    StrCmp $MUI_TEMP1 \"success\" 0 +2\n      Pop \"${MUI_STARTMENUPAGE_VARIABLE}\"\n\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n  FunctionEnd\n\n!macroend\n\n!macro MUI_FUNCTION_INSTFILESPAGE PRE SHOW LEAVE\n\n  Function \"${PRE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n    !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_SUBTITLE)\n\n  FunctionEnd\n\n  Function \"${SHOW}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n    !insertmacro MUI_ENDHEADER\n    !insertmacro MUI_LANGDLL_SAVELANGUAGE\n\n  FunctionEnd\n\n!macroend\n\n!macro MUI_FUNCTION_FINISHPAGE PRE LEAVE\n\n  Function \"${PRE}\"\n\n    !insertmacro MUI_WELCOMEFINISHPAGE_FUNCTION_CUSTOM\n\n    !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT \"ioSpecial.ini\" \"Settings\" \"NextButtonText\" MUI_FINISHPAGE_BUTTON\n\n    !ifdef MUI_FINISHPAGE_CANCEL_ENABLED\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Settings\" \"CancelEnabled\" \"1\"\n    !endif\n\n    !ifndef MUI_FINISHPAGE_TITLE_3LINES\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 2\" \"Bottom\" \"38\"\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Top\" \"45\"\n    !else\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 2\" \"Bottom\" \"48\"\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Top\" \"55\"\n    !endif\n\n    !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT \"ioSpecial.ini\" \"Field 2\" \"Text\" MUI_FINISHPAGE_TITLE\n\n    !ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME\n      !ifndef MUI_FINISHPAGE_TITLE_3LINES\n        !ifndef MUI_FINISHPAGE_TEXT_LARGE\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Bottom\" \"85\"\n        !else\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Bottom\" \"115\"\n        !endif\n      !else\n        !ifndef MUI_FINISHPAGE_TEXT_LARGE\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Bottom\" \"95\"\n        !else\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Bottom\" \"125\"\n        !endif\n      !endif\n    !else\n      !ifndef MUI_FINISHPAGE_LINK\n        !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Bottom\" \"185\"\n      !else\n        !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Bottom\" \"175\"\n      !endif\n    !endif\n\n    !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT\n\n      IfRebootFlag 0 mui.finish_noreboot_init\n\n        !ifndef MUI_FINISHPAGE_TITLE_3LINES\n          !ifndef MUI_FINISHPAGE_TEXT_LARGE\n            !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Bottom\" \"85\"\n          !else\n            !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Bottom\" \"115\"\n          !endif\n        !else\n          !ifndef MUI_FINISHPAGE_TEXT_LARGE\n            !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Bottom\" \"95\"\n          !else\n            !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 3\" \"Bottom\" \"125\"\n          !endif\n        !endif\n\n        !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT \"ioSpecial.ini\" \"Field 3\" \"Text\" MUI_FINISHPAGE_TEXT_REBOOT\n\n        !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Settings\" \"Numfields\" \"5\"\n\n        !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Type\" \"RadioButton\"\n        !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT \"ioSpecial.ini\" \"Field 4\" \"Text\" MUI_FINISHPAGE_TEXT_REBOOTNOW\n        !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Left\" \"120\"\n        !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Right\" \"321\"\n        !ifndef MUI_FINISHPAGE_TITLE_3LINES\n          !ifndef MUI_FINISHPAGE_TEXT_LARGE\n            !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Top\" \"90\"\n            !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Bottom\" \"100\"\n          !else\n            !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Top\" \"120\"\n            !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Bottom\" \"130\"\n          !endif\n        !else\n          !ifndef MUI_FINISHPAGE_TEXT_LARGE\n            !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Top\" \"100\"\n            !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Bottom\" \"110\"\n          !else\n            !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Top\" \"130\"\n            !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Bottom\" \"140\"\n          !endif\n        !endif\n        !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 5\" \"Type\" \"RadioButton\"\n        !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT \"ioSpecial.ini\" \"Field 5\" \"Text\" MUI_FINISHPAGE_TEXT_REBOOTLATER\n        !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 5\" \"Left\" \"120\"\n        !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 5\" \"Right\" \"321\"\n        !ifndef MUI_FINISHPAGE_TITLE_3LINES\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 5\" \"Top\" \"110\"\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 5\" \"Bottom\" \"120\"\n        !else\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 5\" \"Top\" \"110\"\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 5\" \"Bottom\" \"120\"\n        !endif\n        !ifdef MUI_FINISHPAGE_REBOOTLATER_DEFAULT\n\t\t  !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"State\" \"0\"\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 5\" \"State\" \"1\"\n        !else\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"State\" \"1\"\n\t\t  !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 5\" \"State\" \"0\"\n        !endif\n\n        Goto mui.finish_load\n\n      mui.finish_noreboot_init:\n\n    !endif\n\n    !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT \"ioSpecial.ini\" \"Field 3\" \"Text\" MUI_FINISHPAGE_TEXT\n\n    !ifdef MUI_FINISHPAGE_RUN\n\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Type\" \"CheckBox\"\n      !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT \"ioSpecial.ini\" \"Field 4\" \"Text\" MUI_FINISHPAGE_RUN_TEXT\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Left\" \"120\"\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Right\" \"315\"\n      !ifndef MUI_FINISHPAGE_TITLE_3LINES\n        !ifndef MUI_FINISHPAGE_TEXT_LARGE\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Top\" \"90\"\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Bottom\" \"100\"\n        !else\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Top\" \"120\"\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Bottom\" \"130\"\n        !endif\n      !else\n        !ifndef MUI_FINISHPAGE_TEXT_LARGE\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Top\" \"100\"\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Bottom\" \"110\"\n        !else\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Top\" \"130\"\n          !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"Bottom\" \"140\"\n        !endif\n      !endif\n      !ifndef MUI_FINISHPAGE_RUN_NOTCHECKED\n        !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field 4\" \"State\" \"1\"\n      !endif\n\n    !endif\n\n    !ifdef MUI_FINISHPAGE_SHOWREADME\n\n      !ifdef MUI_FINISHPAGE_CURFIELD_NO\n        !undef MUI_FINISHPAGE_CURFIELD_NO\n      !endif\n\n      !ifndef MUI_FINISHPAGE_RUN\n        !define MUI_FINISHPAGE_CURFIELD_NO 4\n        !ifndef MUI_FINISHPAGE_TITLE_3LINES\n          !ifndef MUI_FINISHPAGE_TEXT_LARGE\n            !define MUI_FINISHPAGE_CURFIELD_TOP 90\n            !define MUI_FINISHPAGE_CURFIELD_BOTTOM 100\n          !else\n            !define MUI_FINISHPAGE_CURFIELD_TOP 120\n            !define MUI_FINISHPAGE_CURFIELD_BOTTOM 130\n          !endif\n        !else\n          !ifndef MUI_FINISHPAGE_TEXT_LARGE\n            !define MUI_FINISHPAGE_CURFIELD_TOP 100\n            !define MUI_FINISHPAGE_CURFIELD_BOTTOM 110\n          !else\n            !define MUI_FINISHPAGE_CURFIELD_TOP 130\n            !define MUI_FINISHPAGE_CURFIELD_BOTTOM 140\n          !endif\n        !endif\n      !else\n        !define MUI_FINISHPAGE_CURFIELD_NO 5\n        !ifndef MUI_FINISHPAGE_TITLE_3LINES\n          !ifndef MUI_FINISHPAGE_TEXT_LARGE\n            !define MUI_FINISHPAGE_CURFIELD_TOP 110\n            !define MUI_FINISHPAGE_CURFIELD_BOTTOM 120\n          !else\n            !define MUI_FINISHPAGE_CURFIELD_TOP 140\n            !define MUI_FINISHPAGE_CURFIELD_BOTTOM 150\n          !endif\n        !else\n          !ifndef MUI_FINISHPAGE_TEXT_LARGE\n            !define MUI_FINISHPAGE_CURFIELD_TOP 120\n            !define MUI_FINISHPAGE_CURFIELD_BOTTOM 130\n          !else\n            !define MUI_FINISHPAGE_CURFIELD_TOP 150\n            !define MUI_FINISHPAGE_CURFIELD_BOTTOM 160\n          !endif\n        !endif\n      !endif\n\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"Type\" \"CheckBox\"\n      !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"Text\" MUI_FINISHPAGE_SHOWREADME_TEXT\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"Left\" \"120\"\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"Right\" \"315\"\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"Top\" ${MUI_FINISHPAGE_CURFIELD_TOP}\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"Bottom\" ${MUI_FINISHPAGE_CURFIELD_BOTTOM}\n      !ifndef MUI_FINISHPAGE_SHOWREADME_NOTCHECKED\n         !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"State\" \"1\"\n      !endif\n\n    !endif\n\n    !ifdef MUI_FINISHPAGE_LINK\n\n      !ifdef MUI_FINISHPAGE_CURFIELD_NO\n        !undef MUI_FINISHPAGE_CURFIELD_NO\n      !endif\n\n      !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME\n        !define MUI_FINISHPAGE_CURFIELD_NO 6\n      !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME\n        !define MUI_FINISHPAGE_CURFIELD_NO 5\n      !else\n        !define MUI_FINISHPAGE_CURFIELD_NO 4\n      !endif\n\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"Type\" \"Link\"\n      !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"Text\" MUI_FINISHPAGE_LINK\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"Left\" \"120\"\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"Right\" \"315\"\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"Top\" \"175\"\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"Bottom\" \"185\"\n      !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT \"ioSpecial.ini\" \"Field ${MUI_FINISHPAGE_CURFIELD_NO}\" \"State\" MUI_FINISHPAGE_LINK_LOCATION\n\n    !endif\n\n    !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME & MUI_FINISHPAGE_LINK\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Settings\" \"Numfields\" \"6\"\n    !else ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Settings\" \"Numfields\" \"5\"\n    !else ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_LINK\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Settings\" \"Numfields\" \"5\"\n    !else ifdef MUI_FINISHPAGE_SHOWREADME & MUI_FINISHPAGE_LINK\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Settings\" \"Numfields\" \"5\"\n    !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME | MUI_FINISHPAGE_LINK\n      !insertmacro INSTALLOPTIONS_WRITE \"ioSpecial.ini\" \"Settings\" \"Numfields\" \"4\"\n    !endif\n\n    !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT\n       mui.finish_load:\n    !endif\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n\n    LockWindow on\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n    LockWindow off\n\n    !insertmacro INSTALLOPTIONS_INITDIALOG \"ioSpecial.ini\"\n    Pop $MUI_HWND\n    SetCtlColors $MUI_HWND \"\" \"${MUI_BGCOLOR}\"\n\n    GetDlgItem $MUI_TEMP1 $MUI_HWND 1201\n    SetCtlColors $MUI_TEMP1 \"\" \"${MUI_BGCOLOR}\"\n\n    CreateFont $MUI_TEMP2 \"$(^Font)\" \"12\" \"700\"\n    SendMessage $MUI_TEMP1 ${WM_SETFONT} $MUI_TEMP2 0\n\n    GetDlgItem $MUI_TEMP1 $MUI_HWND 1202\n    SetCtlColors $MUI_TEMP1 \"\" \"${MUI_BGCOLOR}\"\n\n    !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT\n\n      IfRebootFlag 0 mui.finish_noreboot_show\n\n        GetDlgItem $MUI_TEMP1 $MUI_HWND 1203\n        SetCtlColors $MUI_TEMP1 \"\" \"${MUI_BGCOLOR}\"\n\n        GetDlgItem $MUI_TEMP1 $MUI_HWND 1204\n        SetCtlColors $MUI_TEMP1 \"\" \"${MUI_BGCOLOR}\"\n\n        Goto mui.finish_show\n\n      mui.finish_noreboot_show:\n\n    !endif\n\n    !ifdef MUI_FINISHPAGE_RUN\n      GetDlgItem $MUI_TEMP1 $MUI_HWND 1203\n      SetCtlColors $MUI_TEMP1 \"\" \"${MUI_BGCOLOR}\"\n    !endif\n\n    !ifdef MUI_FINISHPAGE_SHOWREADME\n      !ifndef MUI_FINISHPAGE_RUN\n        GetDlgItem $MUI_TEMP1 $MUI_HWND 1203\n      !else\n        GetDlgItem $MUI_TEMP1 $MUI_HWND 1204\n      !endif\n      SetCtlColors $MUI_TEMP1 \"\" \"${MUI_BGCOLOR}\"\n    !endif\n\n    !ifdef MUI_FINISHPAGE_LINK\n      !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME\n        GetDlgItem $MUI_TEMP1 $MUI_HWND 1205\n      !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME\n        GetDlgItem $MUI_TEMP1 $MUI_HWND 1204\n      !else\n        GetDlgItem $MUI_TEMP1 $MUI_HWND 1203\n      !endif\n      SetCtlColors $MUI_TEMP1 \"${MUI_FINISHPAGE_LINK_COLOR}\" \"${MUI_BGCOLOR}\"\n    !endif\n\n    !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT\n      mui.finish_show:\n    !endif\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n\n    !ifdef MUI_FINISHPAGE_CANCEL_ENABLED\n      StrCpy $MUI_NOABORTWARNING \"1\"\n    !endif\n\n    !insertmacro INSTALLOPTIONS_SHOW\n\n    !ifdef MUI_FINISHPAGE_CANCEL_ENABLED\n      StrCpy $MUI_NOABORTWARNING \"\"\n    !endif\n\n    LockWindow on\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039\n    ShowWindow $MUI_TEMP1 ${SW_NORMAL}\n\n    GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045\n    ShowWindow $MUI_TEMP1 ${SW_HIDE}\n    LockWindow off\n\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n    !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT\n\n      IfRebootFlag \"\" mui.finish_noreboot_end\n\n        !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 \"ioSpecial.ini\" \"Field 4\" \"State\"\n\n          StrCmp $MUI_TEMP1 \"1\" 0 +2\n            Reboot\n\n          Return\n\n      mui.finish_noreboot_end:\n\n    !endif\n\n    !ifdef MUI_FINISHPAGE_RUN\n\n      !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 \"ioSpecial.ini\" \"Field 4\" \"State\"\n\n      StrCmp $MUI_TEMP1 \"1\" 0 mui.finish_norun\n        !ifndef MUI_FINISHPAGE_RUN_FUNCTION\n          !ifndef MUI_FINISHPAGE_RUN_PARAMETERS\n            StrCpy $MUI_TEMP1 \"$\\\"${MUI_FINISHPAGE_RUN}$\\\"\"\n          !else\n            StrCpy $MUI_TEMP1 \"$\\\"${MUI_FINISHPAGE_RUN}$\\\" ${MUI_FINISHPAGE_RUN_PARAMETERS}\"\n          !endif\n          Exec \"$MUI_TEMP1\"\n        !else\n          Call \"${MUI_FINISHPAGE_RUN_FUNCTION}\"\n        !endif\n\n        mui.finish_norun:\n\n    !endif\n\n    !ifdef MUI_FINISHPAGE_SHOWREADME\n\n      !ifndef MUI_FINISHPAGE_RUN\n        !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 \"ioSpecial.ini\" \"Field 4\" \"State\"\n      !else\n        !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 \"ioSpecial.ini\" \"Field 5\" \"State\"\n      !endif\n\n      StrCmp $MUI_TEMP1 \"1\" 0 mui.finish_noshowreadme\n        !ifndef MUI_FINISHPAGE_SHOWREADME_FUNCTION\n           ExecShell \"open\" \"${MUI_FINISHPAGE_SHOWREADME}\"\n        !else\n          Call \"${MUI_FINISHPAGE_SHOWREADME_FUNCTION}\"\n        !endif\n\n        mui.finish_noshowreadme:\n\n    !endif\n\n  FunctionEnd\n\n!macroend\n\n!macro MUI_UNFUNCTION_CONFIRMPAGE PRE SHOW LEAVE\n\n  Function \"${PRE}\"\n\n   !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n   !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_UNTEXT_CONFIRM_TITLE) $(MUI_UNTEXT_CONFIRM_SUBTITLE)\n\n  FunctionEnd\n\n  Function \"${SHOW}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n  FunctionEnd\n\n!macroend\n\n;--------------------------------\n;INSTALL OPTIONS (CUSTOM PAGES)\n\n!macro MUI_INSTALLOPTIONS_EXTRACT FILE\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro INSTALLOPTIONS_EXTRACT \"${FILE}\"\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_EXTRACT_AS FILE FILENAME\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro INSTALLOPTIONS_EXTRACT_AS \"${FILE}\" \"${FILENAME}\"\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_DISPLAY FILE\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro INSTALLOPTIONS_DISPLAY \"${FILE}\"\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_DISPLAY_RETURN FILE\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro INSTALLOPTIONS_DISPLAY_RETURN \"${FILE}\"\n  \n  !verbose pop\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_INITDIALOG FILE\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro INSTALLOPTIONS_INITDIALOG \"${FILE}\"\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_SHOW\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro INSTALLOPTIONS_SHOW\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_SHOW_RETURN\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro INSTALLOPTIONS_SHOW_RETURN\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_READ VAR FILE SECTION KEY\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro INSTALLOPTIONS_READ \"${VAR}\" \"${FILE}\" \"${SECTION}\" \"${KEY}\"\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_WRITE FILE SECTION KEY VALUE\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro INSTALLOPTIONS_WRITE \"${FILE}\" \"${SECTION}\" \"${KEY}\" \"${VALUE}\"\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT FILE SECTION KEY SYMBOL\n\n  ;Converts default strings from language files to InstallOptions format\n  ;Only for use inside MUI\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !ifndef \"${SYMBOL}_DEFAULTSET\"\n    !insertmacro INSTALLOPTIONS_WRITE \"${FILE}\" \"${SECTION}\" \"${KEY}\" \"${${SYMBOL}}\"\n  !else\n    Push \"${${SYMBOL}}\"\n    Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}Nsis2Io\n    Pop $MUI_TEMP1\n    !insertmacro INSTALLOPTIONS_WRITE \"${FILE}\" \"${SECTION}\" \"${KEY}\" $MUI_TEMP1\n  !endif\n\n  !verbose pop\n\n!macroend\n\n;--------------------------------\n;RESERVE FILES\n\n!macro MUI_RESERVEFILE_INSTALLOPTIONS\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  ReserveFile \"${NSISDIR}\\Plugins\\InstallOptions.dll\"\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_RESERVEFILE_LANGDLL\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  ReserveFile \"${NSISDIR}\\Plugins\\LangDLL.dll\"\n\n  !verbose pop\n\n!macroend\n\n;--------------------------------\n;LANGUAGES\n\n!macro MUI_LANGUAGE LANGUAGE\n\n  ;Include a language\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_INSERT\n\n  LoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\${LANGUAGE}.nlf\"\n\n  ;Include language file\n  !insertmacro LANGFILE_INCLUDE_WITHDEFAULT \"${NSISDIR}\\Contrib\\Language files\\${LANGUAGE}.nsh\" \"${NSISDIR}\\Contrib\\Language files\\English.nsh\"\n\n  ;Add language to list of languages for selection dialog  \n  !ifndef MUI_LANGDLL_LANGUAGES\n    !define MUI_LANGDLL_LANGUAGES \"'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' \"\n    !define MUI_LANGDLL_LANGUAGES_CP \"'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' '${LANG_${LANGUAGE}_CP}' \"\n  !else\n    !ifdef MUI_LANGDLL_LANGUAGES_TEMP\n      !undef MUI_LANGDLL_LANGUAGES_TEMP\n    !endif\n    !define MUI_LANGDLL_LANGUAGES_TEMP \"${MUI_LANGDLL_LANGUAGES}\"\n    !undef MUI_LANGDLL_LANGUAGES\n\n\t!ifdef MUI_LANGDLL_LANGUAGES_CP_TEMP\n      !undef MUI_LANGDLL_LANGUAGES_CP_TEMP\n    !endif\n    !define MUI_LANGDLL_LANGUAGES_CP_TEMP \"${MUI_LANGDLL_LANGUAGES_CP}\"\n    !undef MUI_LANGDLL_LANGUAGES_CP\n\n    !define MUI_LANGDLL_LANGUAGES \"'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' ${MUI_LANGDLL_LANGUAGES_TEMP}\"\n    !define MUI_LANGDLL_LANGUAGES_CP \"'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' '${LANG_${LANGUAGE}_CP}' ${MUI_LANGDLL_LANGUAGES_CP_TEMP}\"\n  !endif\n  \n  !verbose pop\n\n!macroend\n\n;--------------------------------\n;LANGUAGE SELECTION DIALOG\n\n!macro MUI_LANGDLL_DISPLAY\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_DEFAULT MUI_LANGDLL_WINDOWTITLE \"Installer Language\"\n  !insertmacro MUI_DEFAULT MUI_LANGDLL_INFO \"Please select a language.\"\n\n  !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME\n\n    ReadRegStr $MUI_TEMP1 \"${MUI_LANGDLL_REGISTRY_ROOT}\" \"${MUI_LANGDLL_REGISTRY_KEY}\" \"${MUI_LANGDLL_REGISTRY_VALUENAME}\"\n    StrCmp $MUI_TEMP1 \"\" mui.langdll_show\n      StrCpy $LANGUAGE $MUI_TEMP1\n      !ifndef MUI_LANGDLL_ALWAYSSHOW\n        Goto mui.langdll_done\n      !endif\n    mui.langdll_show:\n\n  !endif\n  \n  !ifdef NSIS_CONFIG_SILENT_SUPPORT\n    IfSilent mui.langdll_done\n  !endif  \n\n  !ifdef MUI_LANGDLL_ALLLANGUAGES\n    LangDLL::LangDialog \"${MUI_LANGDLL_WINDOWTITLE}\" \"${MUI_LANGDLL_INFO}\" A ${MUI_LANGDLL_LANGUAGES} \"\"\n  !else\n    LangDLL::LangDialog \"${MUI_LANGDLL_WINDOWTITLE}\" \"${MUI_LANGDLL_INFO}\" AC ${MUI_LANGDLL_LANGUAGES_CP} \"\"\n  !endif\n\n  Pop $LANGUAGE\n  StrCmp $LANGUAGE \"cancel\" 0 +2\n    Abort\n\n  !ifdef NSIS_CONFIG_SILENT_SUPPORT\n    mui.langdll_done:\n  !else ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME\n    mui.langdll_done:\n  !endif\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_LANGDLL_SAVELANGUAGE\n\n  !ifndef MUI_PAGE_UNINSTALLER\n\n    IfAbort mui.langdllsavelanguage_abort\n\n    !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME\n      WriteRegStr \"${MUI_LANGDLL_REGISTRY_ROOT}\" \"${MUI_LANGDLL_REGISTRY_KEY}\" \"${MUI_LANGDLL_REGISTRY_VALUENAME}\" $LANGUAGE\n    !endif\n\n    mui.langdllsavelanguage_abort:\n\n  !endif\n\n!macroend\n\n!macro MUI_UNGETLANGUAGE\n\n  !verbose pop\n\n  !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME\n\n    ReadRegStr $MUI_TEMP1 \"${MUI_LANGDLL_REGISTRY_ROOT}\" \"${MUI_LANGDLL_REGISTRY_KEY}\" \"${MUI_LANGDLL_REGISTRY_VALUENAME}\"\n    StrCmp $MUI_TEMP1 \"\" 0 mui.ungetlanguage_setlang\n\n  !endif\n\n  !insertmacro MUI_LANGDLL_DISPLAY\n\n  !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME\n\n    Goto mui.ungetlanguage_done\n\n    mui.ungetlanguage_setlang:\n      StrCpy $LANGUAGE $MUI_TEMP1\n\n    mui.ungetlanguage_done:\n\n  !endif\n\n  !verbose pop\n\n!macroend\n\n;--------------------------------\n;END\n\n!endif\n\n!verbose pop\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI/ioSpecial.ini",
    "content": "[Settings]\nRect=1044\nNumFields=3\n[Field 1]\nType=bitmap\nLeft=0\nRight=109\nTop=0\nBottom=193\nFlags=RESIZETOFIT\n[Field 2]\nType=label\nLeft=120\nRight=315\nTop=10\n[Field 3]\nType=label\nLeft=120\nRight=315"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI 2/Deprecated.nsh",
    "content": "/*\n\nNSIS Modern User Interface\nDeprecated code - display warnings\n\n*/\n\n;--------------------------------\n;InstallOptions\n\n!define INSTALLOPTIONS_ERROR \"MUI_INSTALLOPTIONS_* macros are no longer a part of MUI2. Include InstallOptions.nsh and use INSTALLOPTIONS_* macros instead. It is also recommended to upgrade to nsDialogs.\"\n\n!macro MUI_INSTALLOPTIONS_EXTRACT FILE\n\n  !error \"${INSTALLOPTIONS_ERROR}\"\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_EXTRACT_AS FILE FILENAME\n\n  !error \"${INSTALLOPTIONS_ERROR}\"\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_DISPLAY FILE\n\n  !error \"${INSTALLOPTIONS_ERROR}\"\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_DISPLAY_RETURN FILE\n\n  !error \"${INSTALLOPTIONS_ERROR}\"\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_INITDIALOG FILE\n\n  !error \"${INSTALLOPTIONS_ERROR}\"\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_SHOW\n\n  !error \"${INSTALLOPTIONS_ERROR}\"\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_SHOW_RETURN\n\n  !error \"${INSTALLOPTIONS_ERROR}\"\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_READ VAR FILE SECTION KEY\n\n  !error \"${INSTALLOPTIONS_ERROR}\"\n\n!macroend\n\n!macro MUI_INSTALLOPTIONS_WRITE FILE SECTION KEY VALUE\n\n  !error \"${INSTALLOPTIONS_ERROR}\"\n\n!macroend\n\n!macro MUI_RESERVEFILE_INSTALLOPTIONS\n\n  !define MUI_DOLLAR \"$\"\n  !error \"MUI_RESERVEFILE_INSTALLOPTIONS is no longer supported as InstallOptions is no longer used by MUI2. Instead, use ReserveFile '${MUI_DOLLAR}{NSISDIR}\\Plugins\\InstallOptions.dll'. It is also recommended to upgrade to nsDialogs.\"\n\n!macroend\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI 2/Interface.nsh",
    "content": "/*\n\nNSIS Modern User Interface\nInterface code for all pages\n\n*/\n\n;--------------------------------\n;Variables\n\nVar mui.Header.Text\nVar mui.Header.Text.Font\nVar mui.Header.SubText\nVar mui.Header.Background\nVar mui.Header.Image\n\nVar mui.Branding.Text\nVar mui.Branding.Background\n\nVar mui.Line.Standard\nVar mui.Line.FullWindow\n\nVar mui.Button.Next\nVar mui.Button.Cancel\nVar mui.Button.Back\n\n\n;--------------------------------\n;General interface settings\n\n!macro MUI_INTERFACE\n\n  !ifndef MUI_INTERFACE\n\n    !define MUI_INTERFACE\n\n    ;These values are set after the interface settings in the script,\n    ;so the script itself can override all values.\n\n    ;Default interface settings in nsisconf.nsh\n    !ifdef MUI_INSERT_NSISCONF\n      !insertmacro MUI_NSISCONF\n    !endif\n\n    ;Default interface settings\n    !insertmacro MUI_DEFAULT MUI_UI \"${NSISDIR}\\Contrib\\UIs\\modern.exe\"\n    !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE \"${NSISDIR}\\Contrib\\UIs\\modern_headerbmp.exe\"\n    !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE_RIGHT \"${NSISDIR}\\Contrib\\UIs\\modern_headerbmpr.exe\"\n    !insertmacro MUI_DEFAULT MUI_ICON \"${NSISDIR}\\Contrib\\Graphics\\Icons\\modern-install.ico\"\n    !insertmacro MUI_DEFAULT MUI_UNICON \"${NSISDIR}\\Contrib\\Graphics\\Icons\\modern-uninstall.ico\"\n    !insertmacro MUI_DEFAULT MUI_BGCOLOR \"FFFFFF\"\n\n    ;Default header images\n    !ifdef MUI_HEADERIMAGE\n\n      !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_BITMAP \"${NSISDIR}\\Contrib\\Graphics\\Header\\nsis.bmp\"\n\n      !ifndef MUI_HEADERIMAGE_UNBITMAP\n        !define MUI_HEADERIMAGE_UNBITMAP \"${MUI_HEADERIMAGE_BITMAP}\"\n        !ifdef MUI_HEADERIMAGE_BITMAP_NOSTRETCH\n          !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH \"\"\n        !endif\n      !endif\n\n      !ifdef MUI_HEADERIMAGE_BITMAP_RTL\n        !ifndef MUI_HEADERIMAGE_UNBITMAP_RTL\n          !define MUI_HEADERIMAGE_UNBITMAP_RTL \"${MUI_HEADERIMAGE_BITMAP_RTL}\"\n          !ifdef MUI_HEADERIMAGE_BITMAP_RTL_NOSTRETCH\n            !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_RTL_NOSTRETCH \"\"\n          !endif\n        !endif\n      !endif\n\n    !endif\n\n    ;Default texts\n    !insertmacro MUI_DEFAULT MUI_ABORTWARNING_TEXT \"$(MUI_TEXT_ABORTWARNING)\"\n    !insertmacro MUI_DEFAULT MUI_UNABORTWARNING_TEXT \"$(MUI_UNTEXT_ABORTWARNING)\"  \n\n    ;Apply settings\n\n    XPStyle On ;XP style setting in manifest resource\n\n    ;Dialog resources\n    ChangeUI all \"${MUI_UI}\" \n    !ifdef MUI_HEADERIMAGE\n      !ifndef MUI_HEADERIMAGE_RIGHT\n        ChangeUI IDD_INST \"${MUI_UI_HEADERIMAGE}\"\n      !else\n        ChangeUI IDD_INST \"${MUI_UI_HEADERIMAGE_RIGHT}\"\n      !endif\n    !endif\n\n    ;Icons\n    Icon \"${MUI_ICON}\"\n    UninstallIcon \"${MUI_UNICON}\"\n\n  !endif\n\n!macroend\n\n\n;--------------------------------\n;Abort warning message box\n\n!macro MUI_ABORTWARNING\n\n  !ifdef MUI_ABORTWARNING_CANCEL_DEFAULT\n    MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 \"${MUI_ABORTWARNING_TEXT}\" IDYES mui.Quit\n  !else\n    MessageBox MB_YESNO|MB_ICONEXCLAMATION \"${MUI_ABORTWARNING_TEXT}\" IDYES mui.Quit\n  !endif\n  \n  Abort\n  mui.Quit:\n\n!macroend\n\n!macro MUI_UNABORTWARNING\n\n  !ifdef MUI_UNABORTWARNING_CANCEL_DEFAULT\n    MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 \"${MUI_UNABORTWARNING_TEXT}\" IDYES mui.Quit\n  !else\n    MessageBox MB_YESNO|MB_ICONEXCLAMATION \"${MUI_UNABORTWARNING_TEXT}\" IDYES mui.Quit\n  !endif\n\n  Abort\n  mui.Quit:\n\n!macroend\n\n\n;--------------------------------\n;Initialization of GUI\n\n!macro MUI_HEADERIMAGE_INIT UNINSTALLER\n\n  ;Load and display header image\n\n  !ifdef MUI_HEADERIMAGE\n\n    InitPluginsDir\n\n    !ifdef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL\n\n      ${if} $(^RTL) == 1\n\n        File \"/oname=$PLUGINSDIR\\modern-header.bmp\" \"${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL}\"\n\n        !ifndef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL_NOSTRETCH\n          SetBrandingImage /IMGID=1046 /RESIZETOFIT \"$PLUGINSDIR\\modern-header.bmp\"\n        !else\n          SetBrandingImage /IMGID=1046 \"$PLUGINSDIR\\modern-header.bmp\"\n        !endif\n\n      ${else}\n\n    !endif\n\n        File \"/oname=$PLUGINSDIR\\modern-header.bmp\" \"${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP}\"\n\n        !ifndef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_NOSTRETCH\n          SetBrandingImage /IMGID=1046 /RESIZETOFIT \"$PLUGINSDIR\\modern-header.bmp\"\n        !else\n          SetBrandingImage /IMGID=1046 \"$PLUGINSDIR\\modern-header.bmp\"\n        !endif\n\n    !ifdef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL\n\n      ${endif}\n\n    !endif\n\n  !endif\n\n!macroend\n\n!macro MUI_GUIINIT_OUTERDIALOG UNINSTALLER\n\n  ;Initialize outer dialog (fonts & colors)\n\n  ;Header\n  GetDlgItem $mui.Header.Text $HWNDPARENT 1037\n  CreateFont $mui.Header.Text.Font \"$(^Font)\" \"$(^FontSize)\" \"700\"\n  SendMessage $mui.Header.Text ${WM_SETFONT} $mui.Header.Text.Font 0\n  \n  GetDlgItem $mui.Header.SubText $HWNDPARENT 1038\n\n  !ifndef MUI_HEADER_TRANSPARENT_TEXT\n    SetCtlColors $mui.Header.Text \"\" \"${MUI_BGCOLOR}\"\n    SetCtlColors $mui.Header.SubText \"\" \"${MUI_BGCOLOR}\"\n  !else\n    SetCtlColors $mui.Header.Text \"\" \"transparent\"\n    SetCtlColors $mui.Header.SubText \"\" \"transparent\"\n  !endif\n  \n  ;Header image\n  !insertmacro MUI_HEADERIMAGE_INIT \"${UNINSTALLER}\"\n\n  ;Header background\n  GetDlgItem $mui.Header.Background $HWNDPARENT 1034\n  SetCtlColors $mui.Header.Background \"\" \"${MUI_BGCOLOR}\"\n\n  ;Header image background\n  GetDlgItem $mui.Header.Image $HWNDPARENT 1039\n  SetCtlColors $mui.Header.Image \"\" \"${MUI_BGCOLOR}\"\n\n  ;Branding text\n  GetDlgItem $mui.Branding.Background $HWNDPARENT 1028\n  SetCtlColors $mui.Branding.Background /BRANDING\n  GetDlgItem $mui.Branding.Text $HWNDPARENT 1256\n  SetCtlColors $mui.Branding.Text /BRANDING\n  SendMessage $mui.Branding.Text ${WM_SETTEXT} 0 \"STR:$(^Branding) \"\n  \n  ;Lines\n  GetDlgItem $mui.Line.Standard $HWNDPARENT 1035\n  GetDlgItem $mui.Line.FullWindow $HWNDPARENT 1045\n  \n  ;Buttons\n  GetDlgItem $mui.Button.Next $HWNDPARENT 1\n  GetDlgItem $mui.Button.Cancel $HWNDPARENT 2\n  GetDlgItem $mui.Button.Back $HWNDPARENT 3\n\n!macroend\n\n\n;--------------------------------\n;Interface functions\n\n!macro MUI_FUNCTION_GUIINIT\n\n  Function .onGUIInit\n\n    !insertmacro MUI_GUIINIT_OUTERDIALOG \"\"\n\n    !ifdef MUI_PAGE_FUNCTION_GUIINIT\n      Call \"${MUI_PAGE_FUNCTION_GUIINIT}\"\n    !endif  \n\n    !ifdef MUI_CUSTOMFUNCTION_GUIINIT\n      Call \"${MUI_CUSTOMFUNCTION_GUIINIT}\"\n    !endif\n\n  FunctionEnd\n\n!macroend\n\n!macro MUI_UNFUNCTION_GUIINIT\n\n  Function un.onGUIInit  \n\n    !insertmacro MUI_GUIINIT_OUTERDIALOG UN\n    \n    !ifdef MUI_UNPAGE_FUNCTION_GUIINIT\n      Call \"${MUI_UNPAGE_FUNCTION_GUIINIT}\"\n    !endif    \n\n    !ifdef MUI_CUSTOMFUNCTION_UNGUIINIT\n      Call \"${MUI_CUSTOMFUNCTION_UNGUIINIT}\"\n    !endif\n\n  FunctionEnd\n\n!macroend\n\n!macro MUI_FUNCTION_ABORTWARNING\n\n  Function .onUserAbort\n  \n    !ifdef MUI_PAGE_FUNCTION_ABORTWARNING\n      Call ${MUI_PAGE_FUNCTION_ABORTWARNING}\n    !endif\n  \n    !ifdef MUI_ABORTWARNING\n      !insertmacro MUI_ABORTWARNING\n    !endif\n    \n    !ifdef MUI_CUSTOMFUNCTION_ABORT\n      Call \"${MUI_CUSTOMFUNCTION_ABORT}\"\n    !endif\n    \n  FunctionEnd\n\n!macroend\n\n!macro MUI_FUNCTION_UNABORTWARNING\n\n  Function un.onUserAbort\n  \n    !ifdef MUI_UNPAGE_FUNCTION_ABORTWARNING\n      Call ${MUI_UNPAGE_FUNCTION_ABORTWARNING}\n    !endif  \n  \n    !ifdef MUI_UNABORTWARNING\n      !insertmacro MUI_UNABORTWARNING\n    !endif\n    \n    !ifdef MUI_CUSTOMFUNCTION_UNABORT\n      Call \"${MUI_CUSTOMFUNCTION_UNABORT}\"\n    !endif\n    \n  FunctionEnd\n\n!macroend\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI 2/Localization.nsh",
    "content": "/*\n\nNSIS Modern User Interface\nLocalization\n\n*/\n\n;--------------------------------\n;Variables\n\n!macro MUI_LANGDLL_VARIABLES\n\n  !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME\n    !ifndef MUI_LANGDLL_REGISTRY_VARAIBLES\n      !define MUI_LANGDLL_REGISTRY_VARAIBLES\n\n      ;/GLOBAL because the macros are included in a function\n      Var /GLOBAL mui.LangDLL.RegistryLanguage\n\n    !endif\n  !endif\n\n!macroend\n\n\n;--------------------------------\n;Include langauge files\n\n!macro MUI_LANGUAGE LANGUAGE\n\n  ;Include a language\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_INSERT\n\n  LoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\${LANGUAGE}.nlf\"\n\n  ;Include language file\n  !insertmacro LANGFILE_INCLUDE_WITHDEFAULT \"${NSISDIR}\\Contrib\\Language files\\${LANGUAGE}.nsh\" \"${NSISDIR}\\Contrib\\Language files\\English.nsh\"\n\n  ;Add language to list of languages for selection dialog\n  !ifndef MUI_LANGDLL_LANGUAGES\n    !define MUI_LANGDLL_LANGUAGES \"'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' \"\n    !define MUI_LANGDLL_LANGUAGES_CP \"'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' '${LANG_${LANGUAGE}_CP}' \"\n  !else\n    !ifdef MUI_LANGDLL_LANGUAGES_TEMP\n      !undef MUI_LANGDLL_LANGUAGES_TEMP\n    !endif\n    !define MUI_LANGDLL_LANGUAGES_TEMP \"${MUI_LANGDLL_LANGUAGES}\"\n    !undef MUI_LANGDLL_LANGUAGES\n\n    !ifdef MUI_LANGDLL_LANGUAGES_CP_TEMP\n      !undef MUI_LANGDLL_LANGUAGES_CP_TEMP\n    !endif\n    !define MUI_LANGDLL_LANGUAGES_CP_TEMP \"${MUI_LANGDLL_LANGUAGES_CP}\"\n    !undef MUI_LANGDLL_LANGUAGES_CP\n\n    !define MUI_LANGDLL_LANGUAGES \"'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' ${MUI_LANGDLL_LANGUAGES_TEMP}\"\n    !define MUI_LANGDLL_LANGUAGES_CP \"'${LANGFILE_${LANGUAGE}_NAME}' '${LANG_${LANGUAGE}}' '${LANG_${LANGUAGE}_CP}' ${MUI_LANGDLL_LANGUAGES_CP_TEMP}\"\n  !endif\n\n  !verbose pop\n\n!macroend\n\n\n;--------------------------------\n;Language selection\n\n!macro MUI_LANGDLL_DISPLAY\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_LANGDLL_VARIABLES\n\n  !insertmacro MUI_DEFAULT MUI_LANGDLL_WINDOWTITLE \"Installer Language\"\n  !insertmacro MUI_DEFAULT MUI_LANGDLL_INFO \"Please select a language.\"\n\n  !ifdef MUI_LANGDLL_REGISTRY_VARAIBLES\n\n    ReadRegStr $mui.LangDLL.RegistryLanguage \"${MUI_LANGDLL_REGISTRY_ROOT}\" \"${MUI_LANGDLL_REGISTRY_KEY}\" \"${MUI_LANGDLL_REGISTRY_VALUENAME}\"\n    \n    ${if} $mui.LangDLL.RegistryLanguage != \"\"\n      ;Set default langauge to registry language\n      StrCpy $LANGUAGE $mui.LangDLL.RegistryLanguage\n    ${endif}\n\n  !endif\n\n  !ifdef NSIS_CONFIG_SILENT_SUPPORT\n    ${unless} ${Silent}\n  !endif\n\n  !ifndef MUI_LANGDLL_ALWAYSSHOW\n  !ifdef MUI_LANGDLL_REGISTRY_VARAIBLES\n    ${if} $mui.LangDLL.RegistryLanguage == \"\"\n  !endif\n  !endif\n  \n  ;Show langauge selection dialog\n  !ifdef MUI_LANGDLL_ALLLANGUAGES\n    LangDLL::LangDialog \"${MUI_LANGDLL_WINDOWTITLE}\" \"${MUI_LANGDLL_INFO}\" A ${MUI_LANGDLL_LANGUAGES} \"\"\n  !else\n    LangDLL::LangDialog \"${MUI_LANGDLL_WINDOWTITLE}\" \"${MUI_LANGDLL_INFO}\" AC ${MUI_LANGDLL_LANGUAGES_CP} \"\"\n  !endif\n  \n    Pop $LANGUAGE\n    ${if} $LANGUAGE == \"cancel\"\n      Abort\n    ${endif}\n  \n  !ifndef MUI_LANGDLL_ALWAYSSHOW\n  !ifdef MUI_LANGDLL_REGISTRY_VARAIBLES\n    ${endif}\n  !endif\n  !endif\n\n\n  !ifdef NSIS_CONFIG_SILENT_SUPPORT\n    ${endif}\n  !endif\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_LANGDLL_SAVELANGUAGE\n\n  ;Save language in registry\n\n  !ifndef MUI_PAGE_UNINSTALLER\n\n    IfAbort mui.langdllsavelanguage_abort\n\n    !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME\n      WriteRegStr \"${MUI_LANGDLL_REGISTRY_ROOT}\" \"${MUI_LANGDLL_REGISTRY_KEY}\" \"${MUI_LANGDLL_REGISTRY_VALUENAME}\" $LANGUAGE\n    !endif\n\n    mui.langdllsavelanguage_abort:\n\n  !endif\n\n!macroend\n\n!macro MUI_UNGETLANGUAGE\n\n  ;Get language from registry in uninstaller\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_LANGDLL_VARIABLES\n\n  !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME\n\n    ReadRegStr $mui.LangDLL.RegistryLanguage \"${MUI_LANGDLL_REGISTRY_ROOT}\" \"${MUI_LANGDLL_REGISTRY_KEY}\" \"${MUI_LANGDLL_REGISTRY_VALUENAME}\"\n    \n    ${if} $mui.LangDLL.RegistryLanguage = \"\"\n\n  !endif\n\n  !insertmacro MUI_LANGDLL_DISPLAY\n\n  !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME\n\n    ${else}\n      StrCpy $LANGUAGE $mui.LangDLL.RegistryLanguage\n    ${endif}\n\n  !endif\n\n  !verbose pop\n\n!macroend\n\n\n;--------------------------------\n;Rerserve LangDLL file\n\n!macro MUI_RESERVEFILE_LANGDLL\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  ReserveFile \"${NSISDIR}\\Plugins\\LangDLL.dll\"\n\n  !verbose pop\n\n!macroend\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI 2/MUI2.nsh",
    "content": "/*\n\nNSIS Modern User Interface - Version 2.0\nCopyright 2002-2009 Joost Verburg\n\n*/\n\n!echo \"NSIS Modern User Interface version 2.0 - Copyright 2002-2009 Joost Verburg\"\n\n;--------------------------------\n\n!ifndef MUI_INCLUDED\n!define MUI_INCLUDED\n\n!define MUI_SYSVERSION \"2.0\"\n\n!verbose push\n\n!ifndef MUI_VERBOSE\n  !define MUI_VERBOSE 3\n!endif\n\n!verbose ${MUI_VERBOSE}\n\n!addincludedir \"${NSISDIR}\\Contrib\\Modern UI 2\"\n\n;--------------------------------\n;Header files required by MUI\n\n!include WinMessages.nsh\n!include LogicLib.nsh\n!include nsDialogs.nsh\n!include LangFile.nsh\n\n\n;--------------------------------\n;Macros for compile-time defines\n\n!macro MUI_DEFAULT SYMBOL CONTENT\n\n  ;Define symbol if not yet defined\n  ;For setting default values\n\n  !ifndef \"${SYMBOL}\"\n    !define \"${SYMBOL}\" \"${CONTENT}\"\n  !endif\n\n!macroend\n\n!macro MUI_SET SYMBOL CONTENT\n\n  ;Define symbol and undefine if neccesary\n  \n  !insertmacro MUI_UNSET \"${SYMBOL}\"\n  !define \"${SYMBOL}\" \"${CONTENT}\"\n\n!macroend\n\n!macro MUI_UNSET SYMBOL\n\n  ;Undefine symbol if defined\n\n  !ifdef \"${SYMBOL}\"\n    !undef \"${SYMBOL}\"\n  !endif\n\n!macroend\n\n\n;--------------------------------\n;MUI interface\n\n!include \"Deprecated.nsh\"\n!include \"Interface.nsh\"\n!include \"Localization.nsh\"\n!include \"Pages.nsh\"\n\n\n;--------------------------------\n;Pages\n\n!include \"Pages\\Components.nsh\"\n!include \"Pages\\Directory.nsh\"\n!include \"Pages\\Finish.nsh\"\n!include \"Pages\\InstallFiles.nsh\"\n!include \"Pages\\License.nsh\"\n!include \"Pages\\StartMenu.nsh\"\n!include \"Pages\\UninstallConfirm.nsh\"\n!include \"Pages\\Welcome.nsh\"\n\n\n;--------------------------------\n;Insert MUI code in script\n\n!macro MUI_INSERT\n\n  !ifndef MUI_INSERT\n    !define MUI_INSERT\n\n    ;This macro is included when the first language file is included,\n    ;after the pages.\n\n    ;Interface settings\n    !insertmacro MUI_INTERFACE\n\n    ;Interface functions - Installer\n    !insertmacro MUI_FUNCTION_GUIINIT\n    !insertmacro MUI_FUNCTION_ABORTWARNING\n\n    ;Interface functions - Uninstaller\n    !ifdef MUI_UNINSTALLER\n      !insertmacro MUI_UNFUNCTION_GUIINIT\n      !insertmacro MUI_FUNCTION_UNABORTWARNING\n    !endif\n\n  !endif\n\n!macroend\n\n!endif\n\n!verbose pop\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI 2/Pages/Components.nsh",
    "content": "/*\n\nNSIS Modern User Interface\nComponents page\n\n*/\n\n;--------------------------------\n;Page interface settings and variables\n\n!macro MUI_COMPONENTSPAGE_INTERFACE\n\n  !ifndef MUI_COMPONENTSPAGE_INTERFACE\n    !define MUI_COMPONENTSPAGE_INTERFACE\n    Var mui.ComponentsPage\n    \n    Var mui.ComponentsPage.Text\n    Var mui.ComponentsPage.InstTypesText\n    Var mui.ComponentsPage.ComponentsText \n\n    Var mui.ComponentsPage.InstTypes\n    Var mui.ComponentsPage.Components    \n    \n    Var mui.ComponentsPage.DescriptionTitle\n    Var mui.ComponentsPage.DescriptionText.Info\n    Var mui.ComponentsPage.DescriptionText\n    \n    Var mui.ComponentsPage.SpaceRequired\n    \n    !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_CHECKBITMAP \"${NSISDIR}\\Contrib\\Graphics\\Checks\\modern.bmp\"\n    \n    !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_SMALLDESC \"${NSISDIR}\\Contrib\\UIs\\modern_smalldesc.exe\"\n    !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_NODESC \"${NSISDIR}\\Contrib\\UIs\\modern_nodesc.exe\"\n    \n    ;Apply settings\n    \n    !ifdef MUI_COMPONENTSPAGE_SMALLDESC\n      ChangeUI IDD_SELCOM \"${MUI_UI_COMPONENTSPAGE_SMALLDESC}\"\n    !else ifdef MUI_COMPONENTSPAGE_NODESC\n      ChangeUI IDD_SELCOM \"${MUI_UI_COMPONENTSPAGE_NODESC}\"\n    !endif\n\n    CheckBitmap \"${MUI_COMPONENTSPAGE_CHECKBITMAP}\"    \n       \n  !endif\n\n!macroend\n\n\n;--------------------------------\n;Page declaration\n\n!macro MUI_PAGEDECLARATION_COMPONENTS\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}COMPONENTSPAGE \"\"\n  !insertmacro MUI_COMPONENTSPAGE_INTERFACE\n\n  !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_TOP \"\"\n  !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_COMPLIST \"\"\n  !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_INSTTYPE \"\"\n  !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE \"$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE)\"\n  !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO \"$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)\"\n  \n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}components\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n    ComponentText \"${MUI_COMPONENTSPAGE_TEXT_TOP}\" \"${MUI_COMPONENTSPAGE_TEXT_INSTTYPE}\" \"${MUI_COMPONENTSPAGE_TEXT_COMPLIST}\"\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_COMPONENTSPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID}\n\n  !undef MUI_COMPONENTSPAGE_TEXT_TOP\n  !undef MUI_COMPONENTSPAGE_TEXT_COMPLIST\n  !undef MUI_COMPONENTSPAGE_TEXT_INSTTYPE\n  !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE\n  !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO\n\n!macroend\n\n!macro MUI_PAGE_COMPONENTS\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_COMPONENTS\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNPAGE_COMPONENTS\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_UNPAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_COMPONENTS\n\n  !verbose pop\n\n!macroend\n\n\n;--------------------------------\n;Page functions\n\n!macro MUI_FUNCTION_COMPONENTSPAGE PRE SHOW LEAVE\n\n  Function \"${PRE}\"\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n    !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_SUBTITLE)\n  FunctionEnd\n\n  Function \"${SHOW}\"\n  \n    ;Get control hanldes\n    FindWindow $mui.ComponentsPage \"#32770\" \"\" $HWNDPARENT\n    GetDlgItem $mui.ComponentsPage.Text             $mui.ComponentsPage 1006\n    GetDlgItem $mui.ComponentsPage.InstTypesText    $mui.ComponentsPage 1021\n    GetDlgItem $mui.ComponentsPage.ComponentsText   $mui.ComponentsPage 1022\n    GetDlgItem $mui.ComponentsPage.InstTypes        $mui.ComponentsPage 1017\n    GetDlgItem $mui.ComponentsPage.Components       $mui.ComponentsPage 1032\n    GetDlgItem $mui.ComponentsPage.DescriptionTitle $mui.ComponentsPage 1042\n    GetDlgItem $mui.ComponentsPage.DescriptionText  $mui.ComponentsPage 1043\n    GetDlgItem $mui.ComponentsPage.SpaceRequired    $mui.ComponentsPage 1023    \n\n    ;Default text in description textbox\n    SendMessage $mui.ComponentsPage.DescriptionTitle ${WM_SETTEXT} 0 \"STR:${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}\"\n    EnableWindow $mui.ComponentsPage.DescriptionText 0\n    SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 \"STR:${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}\"\n\n    StrCpy $mui.ComponentsPage.DescriptionText.Info \"${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}\" ;Text for current components page\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n  FunctionEnd\n\n!macroend\n\n\n;--------------------------------\n;Script functions for components descriptions\n\n!macro MUI_DESCRIPTION_BEGIN\n\n  ${if} $0 == -1\n    ;No mouse hover over component in list\n    SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 \"STR:\"\n    EnableWindow $mui.ComponentsPage.DescriptionText 0\n    SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 \"STR:$mui.ComponentsPage.DescriptionText.Info\"\n\n!macroend\n\n!macro MUI_DESCRIPTION_TEXT VAR TEXT\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  ${elseif} $0 == ${VAR}\n    SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 \"STR:\"\n    EnableWindow $mui.ComponentsPage.DescriptionText 1\n    SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 \"STR:${TEXT}\"\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_DESCRIPTION_END\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  ${endif}\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_FUNCTION_DESCRIPTION_BEGIN\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  Function .onMouseOverSection\n    !insertmacro MUI_DESCRIPTION_BEGIN\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_FUNCTION_DESCRIPTION_END\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n    !insertmacro MUI_DESCRIPTION_END\n    !ifdef MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION\n      Call \"${MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION}\"\n    !endif\n  FunctionEnd\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNFUNCTION_DESCRIPTION_BEGIN\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  Function un.onMouseOverSection\n    !insertmacro MUI_DESCRIPTION_BEGIN\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNFUNCTION_DESCRIPTION_END\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n    !insertmacro MUI_DESCRIPTION_END\n    !ifdef MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION\n      Call \"${MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION}\"\n    !endif\n  FunctionEnd\n\n  !verbose pop\n\n!macroend\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI 2/Pages/Directory.nsh",
    "content": "/*\n\nNSIS Modern User Interface\nDirectory page\n\n*/\n\n;--------------------------------\n;Page interface settings and variables\n\n!macro MUI_DIRECTORYPAGE_INTERFACE\n\n  !ifndef MUI_DIRECTORYPAGE_INTERFACE\n    !define MUI_DIRECTORYPAGE_INTERFACE\n    Var mui.DirectoryPage\n    \n    Var mui.DirectoryPage.Text\n    \n    Var mui.DirectoryPage.DirectoryBox        \n    Var mui.DirectoryPage.Directory\n    Var mui.DirectoryPage.BrowseButton\n    \n    Var mui.DirectoryPage.SpaceRequired\n    Var mui.DirectoryPage.SpaceAvailable    \n  !endif\n\n!macroend\n\n\n;--------------------------------\n;Page declaration\n\n!macro MUI_PAGEDECLARATION_DIRECTORY\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}DIRECTORYPAGE \"\"\n  !insertmacro MUI_DIRECTORYPAGE_INTERFACE\n\n  !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_TOP \"\"\n  !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_DESTINATION \"\"\n\n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}directory\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n    DirText \"${MUI_DIRECTORYPAGE_TEXT_TOP}\" \"${MUI_DIRECTORYPAGE_TEXT_DESTINATION}\"\n\n    !ifdef MUI_DIRECTORYPAGE_VARIABLE\n      DirVar \"${MUI_DIRECTORYPAGE_VARIABLE}\"\n    !endif\n\n    !ifdef MUI_DIRECTORYPAGE_VERIFYONLEAVE\n      DirVerify leave\n    !endif\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_DIRECTORYPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID}\n\n  !undef MUI_DIRECTORYPAGE_TEXT_TOP\n  !undef MUI_DIRECTORYPAGE_TEXT_DESTINATION\n  !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VARIABLE\n  !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VERIFYONLEAVE\n\n!macroend\n\n!macro MUI_PAGE_DIRECTORY\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_DIRECTORY\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNPAGE_DIRECTORY\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_UNPAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_DIRECTORY\n\n  !verbose pop\n\n!macroend\n\n\n;--------------------------------\n;Page functions\n\n!macro MUI_FUNCTION_DIRECTORYPAGE PRE SHOW LEAVE\n\n  Function \"${PRE}\"\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n    !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_SUBTITLE)\n  FunctionEnd\n\n  Function \"${SHOW}\"\n  \n    ;Get control handles\n    FindWindow $mui.DirectoryPage \"#32770\" \"\" $HWNDPARENT\n    GetDlgItem $mui.DirectoryPage.Text $mui.DirectoryPage 1006\n    GetDlgItem $mui.DirectoryPage.DirectoryBox $mui.DirectoryPage 1020\n    GetDlgItem $mui.DirectoryPage.Directory $mui.DirectoryPage 1019 \n    GetDlgItem $mui.DirectoryPage.BrowseButton $mui.DirectoryPage 1001\n    GetDlgItem $mui.DirectoryPage.SpaceRequired $mui.DirectoryPage 1023    \n    GetDlgItem $mui.DirectoryPage.SpaceAvailable $mui.DirectoryPage 1024\n  \n    !ifdef MUI_DIRECTORYPAGE_BGCOLOR\n      SetCtlColors $mui.DirectoryPage.Directory \"\" \"${MUI_DIRECTORYPAGE_BGCOLOR}\"\n    !endif\n    \n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n  FunctionEnd\n\n!macroend\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI 2/Pages/Finish.nsh",
    "content": " /*\n\nNSIS Modern User Interface\nFinish page (implemented using nsDialogs)\n\n*/\n\n;--------------------------------\n;Page interface settings and variables\n\n!macro MUI_FINISHPAGE_INTERFACE\n\n  !ifndef MUI_FINISHPAGE_INTERFACE\n    !define MUI_FINISHPAGE_INTERFACE\n    Var mui.FinishPage\n        \n    Var mui.FinishPage.Image\n    Var mui.FinishPage.Image.Bitmap\n    \n    Var mui.FinishPage.Title\n    Var mui.FinishPage.Title.Font\n    \n    Var mui.FinishPage.Text\n  !endif\n\n  !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT\n    !ifndef MUI_FINISHPAGE_RETURNVALUE_VARIABLES\n      !define MUI_FINISHPAGE_RETURNVALUE_VARIABLES\n      Var mui.FinishPage.ReturnValue\n    !endif\n  !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME\n    !ifndef MUI_FINISHPAGE_RETURNVALUE_VARIABLES\n      !define MUI_FINISHPAGE_RETURNVALUE_VARIABLES\n      Var mui.FinishPage.ReturnValue\n    !endif \n  !endif\n    \n  !ifdef MUI_FINISHPAGE_CANCEL_ENABLED\n    !ifndef MUI_FINISHPAGE_CANCEL_ENABLED_VARIABLES\n      !define MUI_FINISHPAGE_CANCEL_ENABLED_VARIABLES\n      Var mui.FinishPage.DisableAbortWarning\n    !endif  \n  !endif\n  \n  !ifdef MUI_FINISHPAGE_RUN\n    !ifndef MUI_FINISHPAGE_RUN_VARIABLES\n      !define MUI_FINISHPAGE_RUN_VARIABLES\n      Var mui.FinishPage.Run\n    !endif\n  !endif\n  \n  !ifdef MUI_FINISHPAGE_SHOWREADME\n    !ifndef MUI_FINISHPAGE_SHOREADME_VARAIBLES\n      !define MUI_FINISHPAGE_SHOREADME_VARAIBLES\n      Var mui.FinishPage.ShowReadme\n    !endif\n  !endif\n  \n  !ifdef MUI_FINISHPAGE_LINK\n    !ifndef MUI_FINISHPAGE_LINK_VARIABLES\n      !define MUI_FINISHPAGE_LINK_VARIABLES\n      Var mui.FinishPage.Link\n    !endif\n  !endif\n  \n  !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT\n    !ifndef MUI_FINISHPAGE_REBOOT_VARIABLES\n      !define MUI_FINISHPAGE_REBOOT_VARIABLES\n      Var mui.FinishPage.RebootNow\n      Var mui.FinishPage.RebootLater\n    !endif\n  !endif\n\n  !insertmacro MUI_DEFAULT MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP \"${NSISDIR}\\Contrib\\Graphics\\Wizard\\win.bmp\"  \n\n!macroend\n\n\n;--------------------------------\n;Interface initialization\n\n!macro MUI_FINISHPAGE_GUIINIT\n\n  !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_GUINIT\n    !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_GUINIT\n\n    Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.GUIInit\n  \n      InitPluginsDir  \n      File \"/oname=$PLUGINSDIR\\modern-wizard.bmp\" \"${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}\"\n    \n      !ifdef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT\n        Call \"${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT}\"\n      !endif\n      \n      !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE_NOAUTOCLOSE\n        SetAutoClose true\n      !endif\n    \n    FunctionEnd\n  \n    !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.GUIInit\n    \n  !endif    \n\n!macroend\n\n\n;--------------------------------\n;Abort warning\n\n!macro MUI_FINISHPAGE_ABORTWARNING\n\n  !ifdef MUI_FINISHPAGE_CANCEL_ENABLED\n  \n    !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE_ABORTWARNING\n      !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE_ABORTWARNING\n\n      Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.AbortWarning\n\n        ${if} $mui.FinishPage.DisableAbortWarning == \"1\"\n          Quit\n        ${endif}\n      \n        !ifdef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_ABORTWARNING\n          Call ${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_ABORTWARNING}\n        !endif\n  \n      FunctionEnd\n    \n      !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_ABORTWARNING ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.AbortWarning\n    \n    !endif\n  \n  !endif\n\n!macroend\n\n\n;--------------------------------\n;Page declaration\n\n!macro MUI_PAGEDECLARATION_FINISH\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE \"\"\n  !insertmacro MUI_FINISHPAGE_INTERFACE\n  \n  !insertmacro MUI_FINISHPAGE_GUIINIT\n  !insertmacro MUI_FINISHPAGE_ABORTWARNING\n\n  !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TITLE \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TITLE)\"\n  !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TEXT)\"\n  !insertmacro MUI_DEFAULT MUI_FINISHPAGE_BUTTON \"$(MUI_BUTTONTEXT_FINISH)\"\n  !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT_REBOOT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_REBOOT)\"\n  !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT_REBOOTNOW \"$(MUI_TEXT_FINISH_REBOOTNOW)\"\n  !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT_REBOOTLATER \"$(MUI_TEXT_FINISH_REBOOTLATER)\"\n  !insertmacro MUI_DEFAULT MUI_FINISHPAGE_RUN_TEXT \"$(MUI_TEXT_FINISH_RUN)\"\n  !insertmacro MUI_DEFAULT MUI_FINISHPAGE_SHOWREADME_TEXT \"$(MUI_TEXT_FINISH_SHOWREADME)\"\n  !insertmacro MUI_DEFAULT MUI_FINISHPAGE_LINK_COLOR \"000080\"\n\n  !insertmacro MUI_PAGE_FUNCTION_FULLWINDOW\n\n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Pre_${MUI_UNIQUEID} \\\n      ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Leave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_FINISHPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Pre_${MUI_UNIQUEID} \\\n    ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Leave_${MUI_UNIQUEID} \\\n    ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Link_${MUI_UNIQUEID}\n\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE_3LINES\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_LARGE\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_BUTTON\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_CANCEL_ENABLED\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOT\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTNOW\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTLATER\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTLATER_DEFAULT\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_TEXT\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_PARAMETERS\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_NOTCHECKED\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_FUNCTION\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_TEXT\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_NOTCHECKED\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_FUNCTION\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_LOCATION\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_COLOR\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_NOREBOOTSUPPORT\n\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_ABORTWARNINGCHECK\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_TOP\n  !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_BOTTOM\n\n!macroend\n\n!macro MUI_PAGE_FINISH\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_FINISH\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNPAGE_FINISH\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_UNPAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_FINISH\n\n  !verbose pop\n\n!macroend\n\n\n;--------------------------------\n;Page functions\n\n!macro MUI_FUNCTION_FINISHPAGE PRE LEAVE LINK\n\n  !ifdef MUI_FINISHPAGE_LINK\n  \n  Function \"${LINK}\"\n  \n    ExecShell open \"${MUI_FINISHPAGE_LINK_LOCATION}\"\n  \n  FunctionEnd\n  \n  !endif\n  \n  Function \"${PRE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n\n    ;Set text on Next button\n    SendMessage $mui.Button.Next ${WM_SETTEXT} 0 \"STR:${MUI_FINISHPAGE_BUTTON}\"\n    \n    ;Enable cancel button if set in script\n    !ifdef MUI_FINISHPAGE_CANCEL_ENABLED\n      EnableWindow $mui.Button.Cancel 1\n    !endif\n    \n    ;Create dialog\n    nsDialogs::Create 1044\n    Pop $mui.FinishPage\n    nsDialogs::SetRTL $(^RTL)\n    SetCtlColors $mui.FinishPage \"\" \"${MUI_BGCOLOR}\"\n\n    ;Image control\n    ${NSD_CreateBitmap} 0u 0u 109u 193u \"\"\n    Pop $mui.FinishPage.Image\n    !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP_NOSTRETCH\n      ${NSD_SetStretchedImage} $mui.FinishPage.Image $PLUGINSDIR\\modern-wizard.bmp $mui.FinishPage.Image.Bitmap\n    !else\n      ${NSD_SetImage} $mui.FinishPage.Image $PLUGINSDIR\\modern-wizard.bmp $mui.FinishPage.Image.Bitmap\n    !endif\n    \n    ;Positiong of controls\n\n    ;Title    \n    !ifndef MUI_FINISHPAGE_TITLE_3LINES\n      !define MUI_FINISHPAGE_TITLE_HEIGHT 28\n    !else\n      !define MUI_FINISHPAGE_TITLE_HEIGHT 38\n    !endif\n    \n    ;Text\n    ;17 = 10 (top margin) + 7 (distance between texts)\n    !define /math MUI_FINISHPAGE_TEXT_TOP 17 + ${MUI_FINISHPAGE_TITLE_HEIGHT}\n    \n    ;Height if space required for radio buttons or check boxes\n    !ifndef MUI_FINISHPAGE_TEXT_LARGE\n      !define MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS 40\n    !else\n      !define MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS 60\n    !endif\n    \n    !define /math MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS ${MUI_FINISHPAGE_TEXT_TOP} + ${MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS}\n    \n    ;Positioning of radio buttons to ask for a reboot\n    !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT\n      !define /math MUI_FINISHPAGE_REBOOTNOW_TOP ${MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS} + 5 ;Distance between text and options\n      ;25 = 10 (height of first radio button) + 15 (distance between buttons)\n      !define /math MUI_FINISHPAGE_REBOOTLATER_TOP ${MUI_FINISHPAGE_REBOOTNOW_TOP} + 25\n    !endif\n    \n    ;Positioning of checkboxes\n    !ifdef MUI_FINISHPAGE_RUN\n      !define /math MUI_FINISHPAGE_RUN_TOP ${MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS} + 5 ;Distance between text and options \n    !endif\n    !ifdef MUI_FINISHPAGE_SHOWREADME\n      !ifdef MUI_FINISHPAGE_RUN\n        ;25 = 10 (height of run checkbox) + 10 (distance between checkboxes)\n        !define /math MUI_FINISHPAGE_SHOWREADME_TOP ${MUI_FINISHPAGE_RUN_TOP} + 20\n      !else\n        !define /math MUI_FINISHPAGE_SHOWREADME_TOP ${MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS} + 5 ;Distance between text and options    \n      !endif\n    !endif\n\n    !ifndef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME\n      ;Height if full space is available for text and link\n      !ifndef MUI_FINISHPAGE_LINK\n        !define MUI_FINISHPAGE_TEXT_HEIGHT 130\n      !else\n        !define MUI_FINISHPAGE_TEXT_HEIGHT 120\n      !endif\n    !endif \n    \n    !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT\n\n      ${if} ${RebootFlag}\n\n        ;Title text\n        ${NSD_CreateLabel} 120u 10u 195u ${MUI_FINISHPAGE_TITLE_HEIGHT}u \"${MUI_FINISHPAGE_TITLE}\"\n        Pop $mui.FinishPage.Title\n        SetCtlColors $mui.FinishPage.Title \"\" \"${MUI_BGCOLOR}\"\n        CreateFont $mui.FinishPage.Title.Font \"$(^Font)\" \"12\" \"700\"\n        SendMessage $mui.FinishPage.Title ${WM_SETFONT} $mui.FinishPage.Title.Font 0\n\n        ;Finish text\n        ${NSD_CreateLabel} 120u 45u 195u ${MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS}u \"${MUI_FINISHPAGE_TEXT_REBOOT}\"\n        Pop $mui.FinishPage.Text\n        SetCtlColors $mui.FinishPage.Text \"\" \"${MUI_BGCOLOR}\"\n      \n        ;Radio buttons for reboot page\n        ${NSD_CreateRadioButton} 120u ${MUI_FINISHPAGE_REBOOTNOW_TOP}u 195u 10u \"${MUI_FINISHPAGE_TEXT_REBOOTNOW}\"\n        Pop $mui.FinishPage.RebootNow\n        SetCtlColors $mui.FinishPage.RebootNow \"\" \"${MUI_BGCOLOR}\"        \n        ${NSD_CreateRadioButton} 120u ${MUI_FINISHPAGE_REBOOTLATER_TOP}u 195u 10u \"${MUI_FINISHPAGE_TEXT_REBOOTLATER}\"\n        Pop $mui.FinishPage.RebootLater\n        SetCtlColors $mui.FinishPage.RebootLater \"\" \"${MUI_BGCOLOR}\"\n        !ifndef MUI_FINISHPAGE_REBOOTLATER_DEFAULT\n          SendMessage $mui.FinishPage.RebootNow ${BM_SETCHECK} ${BST_CHECKED} 0\n        !else\n          SendMessage $mui.FinishPage.RebootLater ${BM_SETCHECK} ${BST_CHECKED} 0\n        !endif\n        ${NSD_SetFocus} $mui.FinishPage.RebootNow\n\n      ${else}\n\n    !endif\n        \n        ;Title text\n        ${NSD_CreateLabel} 120u 10u 195u ${MUI_FINISHPAGE_TITLE_HEIGHT}u \"${MUI_FINISHPAGE_TITLE}\"\n        Pop $mui.FinishPage.Title\n        SetCtlColors $mui.FinishPage.Title \"\" \"${MUI_BGCOLOR}\"\n        CreateFont $mui.FinishPage.Title.Font \"$(^Font)\" \"12\" \"700\"\n        SendMessage $mui.FinishPage.Title ${WM_SETFONT} $mui.FinishPage.Title.Font 0\n\n        ;Finish text\n        !ifndef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME\n          ${NSD_CreateLabel} 120u ${MUI_FINISHPAGE_TEXT_TOP}u 195u ${MUI_FINISHPAGE_TEXT_HEIGHT}u \"${MUI_FINISHPAGE_TEXT}\"\n        !else\n          ${NSD_CreateLabel} 120u ${MUI_FINISHPAGE_TEXT_TOP}u 195u ${MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS}u \"${MUI_FINISHPAGE_TEXT}\"\n        !endif\n        Pop $mui.FinishPage.Text\n        SetCtlColors $mui.FinishPage.Text \"\" \"${MUI_BGCOLOR}\"\n    \n        ;Checkboxes\n        !ifdef MUI_FINISHPAGE_RUN\n          ${NSD_CreateCheckbox} 120u ${MUI_FINISHPAGE_RUN_TOP}u 195u 10u \"${MUI_FINISHPAGE_RUN_TEXT}\"\n          Pop $mui.FinishPage.Run\n          SetCtlColors $mui.FinishPage.Run \"\" \"${MUI_BGCOLOR}\"\n          !ifndef MUI_FINISHPAGE_RUN_NOTCHECKED\n            SendMessage $mui.FinishPage.Run ${BM_SETCHECK} ${BST_CHECKED} 0\n          !endif\n          ${NSD_SetFocus} $mui.FinishPage.Run\n        !endif\n        !ifdef MUI_FINISHPAGE_SHOWREADME\n          ${NSD_CreateCheckbox} 120u ${MUI_FINISHPAGE_SHOWREADME_TOP}u 195u 10u \"${MUI_FINISHPAGE_SHOWREADME_TEXT}\"\n          Pop $mui.FinishPage.ShowReadme\n          SetCtlColors $mui.FinishPage.ShowReadme \"\" \"${MUI_BGCOLOR}\"\n          !ifndef MUI_FINISHPAGE_SHOWREADME_NOTCHECKED\n            SendMessage $mui.FinishPage.ShowReadme ${BM_SETCHECK} ${BST_CHECKED} 0\n          !endif\n          !ifndef MUI_FINISHPAGE_RUN\n            ${NSD_SetFocus} $mui.FinishPage.ShowReadme\n          !endif\n        !endif\n    \n        ;Link\n        !ifdef MUI_FINISHPAGE_LINK\n          ${NSD_CreateLink} 120u 175u 195u 10u \"${MUI_FINISHPAGE_LINK}\"\n          Pop $mui.FinishPage.Link\n          SetCtlColors $mui.FinishPage.Link \"${MUI_FINISHPAGE_LINK_COLOR}\" \"${MUI_BGCOLOR}\"\n          ${NSD_OnClick} $mui.FinishPage.Link \"${LINK}\"\n        !endif\n        \n    !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT        \n      ${endif}\n    !endif\n\n    !ifdef MUI_FINISHPAGE_CANCEL_ENABLED\n      StrCpy $mui.FinishPage.DisableAbortWarning \"1\"\n    !endif\n\n    ;Show page\n    Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageLoadFullWindow\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n    nsDialogs::Show\n    Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageUnloadFullWindow \n    \n    !ifdef MUI_FINISHPAGE_CANCEL_ENABLED\n      StrCpy $mui.FinishPage.DisableAbortWarning \"\"\n    !endif\n    \n    ;Delete image from memory\n    ${NSD_FreeImage} $mui.FinishPage.Image.Bitmap\n    \n    !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE_HEIGHT\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_TOP\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_HEIGHT\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTNOW_TOP\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTLATER_TOP\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_TOP\n    !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_TOP\n\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n    !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT\n\n      ;Check whether the user has chosen to reboot the computer\n      ${if} ${RebootFlag}\n        SendMessage $mui.FinishPage.RebootNow ${BM_GETCHECK} 0 0 $mui.FinishPage.ReturnValue\n        ${if} $mui.FinishPage.ReturnValue = ${BST_CHECKED}\n          Reboot\n        ${else}\n          Return\n        ${endif}\n      ${endif}\n\n    !endif\n\n    ;Run functions depending on checkbox state \n\n    !ifdef MUI_FINISHPAGE_RUN\n    \n      SendMessage $mui.FinishPage.Run ${BM_GETCHECK} 0 0 $mui.FinishPage.ReturnValue\n\n      ${if} $mui.FinishPage.ReturnValue = ${BST_CHECKED}\n        !ifndef MUI_FINISHPAGE_RUN_FUNCTION\n          !ifndef MUI_FINISHPAGE_RUN_PARAMETERS\n            Exec \"$\\\"${MUI_FINISHPAGE_RUN}$\\\"\"\n          !else\n            Exec \"$\\\"${MUI_FINISHPAGE_RUN}$\\\" ${MUI_FINISHPAGE_RUN_PARAMETERS}\"\n          !endif\n        !else\n          Call \"${MUI_FINISHPAGE_RUN_FUNCTION}\"\n        !endif\n      ${endif}\n\n    !endif\n\n    !ifdef MUI_FINISHPAGE_SHOWREADME\n\n      SendMessage $mui.FinishPage.ShowReadme ${BM_GETCHECK} 0 0 $mui.FinishPage.ReturnValue\n\n      ${if} $mui.FinishPage.ReturnValue = ${BST_CHECKED}\n        !ifndef MUI_FINISHPAGE_SHOWREADME_FUNCTION\n          ExecShell open \"${MUI_FINISHPAGE_SHOWREADME}\"\n        !else\n          Call \"${MUI_FINISHPAGE_SHOWREADME_FUNCTION}\"\n        !endif\n      ${endif}\n\n    !endif\n\n  FunctionEnd\n\n!macroend\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI 2/Pages/InstallFiles.nsh",
    "content": "/*\n\nNSIS Modern User Interface\nInstallFiles page\n\n*/\n\n;--------------------------------\n;Page interface settings and variables\n\n!macro MUI_INSTFILESPAGE_INTERFACE\n\n  !ifndef MUI_INSTFILESYPAGE_INTERFACE\n    !define MUI_INSTFILESYPAGE_INTERFACE\n    \n    !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_COLORS \"/windows\"\n    !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_PROGRESSBAR \"smooth\"    \n    \n    Var mui.InstFilesPage\n    \n    Var mui.InstFilesPage.Text\n    Var mui.InstFilesPage.ProgressBar\n    Var mui.InstFilesPage.ShowLogButton\n    Var mui.InstFilesPage.Log\n    \n    ;Apply settings\n    InstallColors ${MUI_INSTFILESPAGE_COLORS}\n    InstProgressFlags ${MUI_INSTFILESPAGE_PROGRESSBAR}\n    SubCaption 4 \" \"\n    UninstallSubCaption 2 \" \"   \n  !endif\n\n!macroend\n\n\n;--------------------------------\n;Page declaration\n\n!macro MUI_PAGEDECLARATION_INSTFILES\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INSTFILESPAGE \"\"\n  !insertmacro MUI_INSTFILESPAGE_INTERFACE\n  \n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}instfiles\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_INSTFILESPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID}\n\n  !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_TEXT\n  !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT\n  !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_TEXT\n  !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_SUBTEXT\n\n!macroend\n\n!macro MUI_PAGE_INSTFILES\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_INSTFILES\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNPAGE_INSTFILES\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_UNPAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_INSTFILES\n\n  !verbose pop\n\n!macroend\n\n\n;--------------------------------\n;Page functions\n\n!macro MUI_FUNCTION_INSTFILESPAGE PRE SHOW LEAVE\n\n  Function \"${PRE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n    !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_SUBTITLE)\n\n  FunctionEnd\n\n  Function \"${SHOW}\"\n\n    ;Get controls handles\n    FindWindow $mui.InstFilesPage \"#32770\" \"\" $HWNDPARENT\n    GetDlgItem $mui.InstFilesPage.Text $mui.InstFilesPage 1006\n    GetDlgItem $mui.InstFilesPage.ProgressBar $mui.InstFilesPage 1004\n    GetDlgItem $mui.InstFilesPage.ShowLogButton $mui.InstFilesPage 1027    \n    GetDlgItem $mui.InstFilesPage.Log $mui.InstFilesPage 1016\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n    ;Set text on completed page header\n\n    IfAbort mui.endheader_abort\n\n      !ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT & MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT\n        !insertmacro MUI_HEADER_TEXT \"${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}\" \"${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}\"\n      !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT\n        !insertmacro MUI_HEADER_TEXT \"${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}\" \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)\"\n      !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT\n        !insertmacro MUI_HEADER_TEXT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)\" \"${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}\"\n      !else\n        !insertmacro MUI_HEADER_TEXT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)\" \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)\"\n      !endif\n\n    Goto mui.endheader_done\n\n    mui.endheader_abort:\n\n      !ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT & MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT\n        !insertmacro MUI_HEADER_TEXT \"${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}\" \"${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}\"\n      !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT\n        !insertmacro MUI_HEADER_TEXT \"${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}\" \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)\"\n      !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT\n        !insertmacro MUI_HEADER_TEXT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)\" \"${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}\"\n      !else\n        !insertmacro MUI_HEADER_TEXT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)\" \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)\"\n      !endif\n\n    mui.endheader_done:\n\n      !insertmacro MUI_LANGDLL_SAVELANGUAGE\n\n  FunctionEnd\n\n!macroend\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI 2/Pages/License.nsh",
    "content": "/*\n\nNSIS Modern User Interface\nLicense page\n\n*/\n\n;--------------------------------\n;Page interface settings and variables\n\n!macro MUI_LICENSEPAGE_INTERFACE\n\n  !ifndef MUI_LICENSEPAGE_INTERFACE\n    !define MUI_LICENSEPAGE_INTERFACE\n    Var mui.LicensePage\n    \n    Var mui.Licensepage.TopText\n    Var mui.Licensepage.Text\n    Var mui.Licensepage.LicenseText\n    \n    !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BGCOLOR \"/windows\"\n    \n    ;Apply settings\n    LicenseBkColor \"${MUI_LICENSEPAGE_BGCOLOR}\"\n  !endif\n\n!macroend\n\n\n;--------------------------------\n;Page declaration\n\n!macro MUI_PAGEDECLARATION_LICENSE LICENSEDATA\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}LICENSEPAGE \"\"\n  !insertmacro MUI_LICENSEPAGE_INTERFACE  \n\n  !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_TEXT_TOP \"$(MUI_INNERTEXT_LICENSE_TOP)\"\n  !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BUTTON \"\"\n  !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_CHECKBOX_TEXT \"\"\n  !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT \"\"\n  !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE \"\"\n\n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}license\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n    LicenseData \"${LICENSEDATA}\"\n\n    !ifndef MUI_LICENSEPAGE_TEXT_BOTTOM\n      !ifndef MUI_LICENSEPAGE_CHECKBOX & MUI_LICENSEPAGE_RADIOBUTTONS\n        LicenseText \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM)\" \"${MUI_LICENSEPAGE_BUTTON}\"\n      !else ifdef MUI_LICENSEPAGE_CHECKBOX\n        LicenseText \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_CHECKBOX)\" \"${MUI_LICENSEPAGE_BUTTON}\"\n      !else\n        LicenseText \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS)\" \"${MUI_LICENSEPAGE_BUTTON}\"\n      !endif\n    !else\n      LicenseText \"${MUI_LICENSEPAGE_TEXT_BOTTOM}\" \"${MUI_LICENSEPAGE_BUTTON}\"\n    !endif\n\n    !ifdef MUI_LICENSEPAGE_CHECKBOX\n      LicenseForceSelection checkbox \"${MUI_LICENSEPAGE_CHECKBOX_TEXT}\"\n    !else ifdef MUI_LICENSEPAGE_RADIOBUTTONS\n      LicenseForceSelection radiobuttons \"${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT}\" \"${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE}\"\n    !endif\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_LICENSEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID}\n\n  !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_TOP\n  !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_BOTTOM\n  !insertmacro MUI_UNSET MUI_LICENSEPAGE_BUTTON\n  !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX\n    !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT\n  !insertmacro MUI_UNSET MUI_LICENSEPAGE_RADIOBUTTONS\n    !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_ACCEPT\n    !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_DECLINE\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_PAGE_LICENSE LICENSEDATA\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_LICENSE \"${LICENSEDATA}\"\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNPAGE_LICENSE LICENSEDATA\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_UNPAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_LICENSE \"${LICENSEDATA}\"\n\n  !verbose pop\n\n!macroend\n\n\n;--------------------------------\n;Page functions\n\n!macro MUI_FUNCTION_LICENSEPAGE PRE SHOW LEAVE\n\n  Function \"${PRE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n    !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_SUBTITLE)\n\n  FunctionEnd\n\n  Function \"${SHOW}\"\n\n    ;Get conrol handles\n    FindWindow $mui.LicensePage \"#32770\" \"\" $HWNDPARENT\n    GetDlgItem $mui.LicensePage.TopText $mui.LicensePage 1040\n    GetDlgItem $mui.LicensePage.Text $mui.LicensePage 1006\n    GetDlgItem $mui.LicensePage.LicenseText $mui.LicensePage 1000\n    \n    ;Top text\n    SendMessage $mui.LicensePage.TopText ${WM_SETTEXT} 0 \"STR:${MUI_LICENSEPAGE_TEXT_TOP}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n  FunctionEnd\n\n!macroend\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI 2/Pages/StartMenu.nsh",
    "content": "/*\n\nNSIS Modern User Interface\nStart Menu folder page\n\n*/\n\n;--------------------------------\n;Page interface settings and variables\n\n!macro MUI_STARTMENUPAGE_INTERFACE\n\n  !ifndef MUI_STARTMENUPAGE_INTERFACE\n    !define MUI_STARTMENUPAGE_INTERFACE\n    Var mui.StartMenuPage\n    Var mui.StartMenuPage.Location\n    Var mui.StartMenuPage.FolderList\n\n    Var mui.StartMenuPage.Temp\n  !endif\n\n  !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT & MUI_STARTMENUPAGE_REGISTRY_KEY & MUI_STARTMENUPAGE_REGISTRY_VALUENAME\n    !ifndef MUI_STARTMENUPAGE_REGISTRY_VARIABLES\n      !define MUI_STARTMENUPAGE_REGISTRY_VARIABLES\n        Var mui.StartMenuPage.RegistryLocation\n    !endif\n  !endif\n\n!macroend\n\n\n;--------------------------------\n;Page declaration\n\n!macro MUI_PAGEDECLARATION_STARTMENU ID VAR\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}STARTMENUPAGE \"\"\n  !insertmacro MUI_STARTMENUPAGE_INTERFACE  \n\n  !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_DEFAULTFOLDER \"$(^Name)\"\n  !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_TOP \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_TOP)\"\n  !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_CHECKBOX \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_CHECKBOX)\"\n\n  !define MUI_STARTMENUPAGE_VARIABLE \"${VAR}\"\n  !define \"MUI_STARTMENUPAGE_${ID}_VARIABLE\" \"${MUI_STARTMENUPAGE_VARIABLE}\"\n  !define \"MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER\" \"${MUI_STARTMENUPAGE_DEFAULTFOLDER}\"\n  !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT\n    !define \"MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT\" \"${MUI_STARTMENUPAGE_REGISTRY_ROOT}\"\n  !endif\n  !ifdef MUI_STARTMENUPAGE_REGISTRY_KEY\n    !define \"MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY\" \"${MUI_STARTMENUPAGE_REGISTRY_KEY}\"\n  !endif\n  !ifdef MUI_STARTMENUPAGE_REGISTRY_VALUENAME\n    !define \"MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME\" \"${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}\"\n  !endif\n\n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_STARTMENUPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID}\n\n  !undef MUI_STARTMENUPAGE_VARIABLE\n  !undef MUI_STARTMENUPAGE_TEXT_TOP\n  !undef MUI_STARTMENUPAGE_TEXT_CHECKBOX\n  !undef MUI_STARTMENUPAGE_DEFAULTFOLDER\n  !insertmacro MUI_UNSET MUI_STARTMENUPAGE_NODISABLE\n  !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_ROOT\n  !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_KEY\n  !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_VALUENAME\n\n!macroend\n\n!macro MUI_PAGE_STARTMENU ID VAR\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_STARTMENU \"${ID}\" \"${VAR}\"\n\n  !verbose pop\n\n!macroend\n\n;--------------------------------\n;Page functions\n\n!macro MUI_FUNCTION_STARTMENUPAGE PRE LEAVE\n\n  Function \"${PRE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n\n    !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT & MUI_STARTMENUPAGE_REGISTRY_KEY & MUI_STARTMENUPAGE_REGISTRY_VALUENAME\n      \n      ;Get Start Menu location from registry\n\n      ${if} \"${MUI_STARTMENUPAGE_VARIABLE}\" == \"\"\n\n        ReadRegStr $mui.StartMenuPage.RegistryLocation  \"${MUI_STARTMENUPAGE_REGISTRY_ROOT}\" \"${MUI_STARTMENUPAGE_REGISTRY_KEY}\" \"${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}\"\n        ${if} $mui.StartMenuPage.RegistryLocation != \"\"\n          StrCpy \"${MUI_STARTMENUPAGE_VARIABLE}\" $mui.StartMenuPage.RegistryLocation\n        ${endif}\n\n        ClearErrors\n\n      ${endif}\n\n    !endif\n\n    !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_TEXT_STARTMENU_TITLE) $(MUI_TEXT_STARTMENU_SUBTITLE)\n\n    ${if} $(^RTL) == \"0\"\n       !ifndef MUI_STARTMENUPAGE_NODISABLE\n        StartMenu::Init /noicon /autoadd /text \"${MUI_STARTMENUPAGE_TEXT_TOP}\" /lastused \"${MUI_STARTMENUPAGE_VARIABLE}\" /checknoshortcuts \"${MUI_STARTMENUPAGE_TEXT_CHECKBOX}\" \"${MUI_STARTMENUPAGE_DEFAULTFOLDER}\"\n      !else\n        StartMenu::Init /noicon /autoadd /text \"${MUI_STARTMENUPAGE_TEXT_TOP}\" /lastused \"${MUI_STARTMENUPAGE_VARIABLE}\" \"${MUI_STARTMENUPAGE_DEFAULTFOLDER}\"\n      !endif\n    ${else}\n      !ifndef MUI_STARTMENUPAGE_NODISABLE\n        StartMenu::Init /rtl /noicon /autoadd /text \"${MUI_STARTMENUPAGE_TEXT_TOP}\" /lastused \"${MUI_STARTMENUPAGE_VARIABLE}\" /checknoshortcuts \"${MUI_STARTMENUPAGE_TEXT_CHECKBOX}\" \"${MUI_STARTMENUPAGE_DEFAULTFOLDER}\"\n      !else\n        StartMenu::Init /rtl /noicon /autoadd /text \"${MUI_STARTMENUPAGE_TEXT_TOP}\" /lastused \"${MUI_STARTMENUPAGE_VARIABLE}\" \"${MUI_STARTMENUPAGE_DEFAULTFOLDER}\"\n      !endif\n    ${endif}\n\n    Pop $mui.StartMenuPage\n\n    ;Get control handles\n    GetDlgItem $mui.StartMenuPage.Location $mui.StartMenuPage 1002\n    GetDlgItem $mui.StartMenuPage.FolderList $mui.StartMenuPage 1004\n\n    !ifdef MUI_STARTMENUPAGE_BGCOLOR\n      SetCtlColors $mui.StartMenuPage.Location \"\" \"${MUI_STARTMENUPAGE_BGCOLOR}\"\n      SetCtlColors $mui.StartMenuMenu.FolderList \"\" \"${MUI_STARTMENUPAGE_BGCOLOR}\"\n    !endif\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n\n    StartMenu::Show\n\n    Pop $mui.StartMenuPage.Temp\n    ${if} $mui.StartMenuPage.Temp ==  \"success\"\n      Pop \"${MUI_STARTMENUPAGE_VARIABLE}\"\n    ${endif}\n\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n  FunctionEnd\n\n!macroend\n\n\n;--------------------------------\n;Script macros to get Start Menu folder\n\n!macro MUI_STARTMENU_GETFOLDER ID VAR\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  ;Get Start Menu folder from registry\n  ;Can be called from the script in the uninstaller\n\n  !ifdef MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME\n\n    ReadRegStr $mui.StartMenuPage.RegistryLocation \"${MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT}\" \"${MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY}\" \"${MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME}\"\n    \n    ${if} $mui.StartMenuPage.RegistryLocation != \"\"\n      StrCpy \"${VAR}\" $mui.StartMenuPage.RegistryLocation\n    ${else}\n      StrCpy \"${VAR}\" \"${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}\"\n    ${endif}\n\n  !else\n\n    StrCpy \"${VAR}\" \"${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}\"\n\n  !endif\n   \n  !verbose pop   \n\n!macroend\n\n!macro MUI_STARTMENU_WRITE_BEGIN ID\n\n  ;The code in the script to write the shortcuts should be put between the\n  ;MUI_STARTMENU_WRITE_BEGIN and MUI_STARTMENU_WRITE_END macros\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !define MUI_STARTMENUPAGE_CURRENT_ID \"${ID}\"\n\n  StrCpy $mui.StartMenuPage.Temp \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}\" 1\n  \n  ;If the folder start with >, the user has chosen not to create a shortcut\n  ${if} $mui.StartMenuPage.Temp != \">\"\n\n    ${if} \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}\" == \"\"\n      ;Get folder from registry if the variable doesn't contain anything\n      !insertmacro MUI_STARTMENU_GETFOLDER \"${MUI_STARTMENUPAGE_CURRENT_ID}\" \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}\"\n    ${endif}\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_STARTMENU_WRITE_END\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n    !ifdef MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME\n      ;Write folder to registry\n      WriteRegStr \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT}\" \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY}\" \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME}\" \"${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}\"\n    !endif\n\n  ${endif}\n\n  !undef MUI_STARTMENUPAGE_CURRENT_ID\n\n  !verbose pop\n\n!macroend\n\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh",
    "content": "/*\n\nNSIS Modern User Interface\nUninstall confirmation page\n\n*/\n\n;--------------------------------\n;Page interface settings and variables\n\n!macro MUI_UNCONFIRMPAGE_INTERFACE\n\n  !ifndef MUI_UNCONFIRMPAGE_INTERFACE\n    !define MUI_UNCONFIRMPAGE_INTERFACE\n    Var mui.UnConfirmPage\n    \n    Var mui.UnConfirmPage.Text\n    Var mui.UnConfirmPage.DirectoryText\n    Var mui.UnConfirmPage.Directory    \n  !endif\n\n!macroend\n\n\n;--------------------------------\n;Page declaration\n\n!macro MUI_PAGEDECLARATION_CONFIRM\n\n  !insertmacro MUI_SET MUI_UNCONFIRMPAGE \"\"\n  !insertmacro MUI_UNCONFIRMPAGE_INTERFACE  \n\n  !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_TOP \"\"\n  !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_LOCATION \"\"\n\n  PageEx un.uninstConfirm\n\n    PageCallbacks un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n    UninstallText \"${MUI_UNCONFIRMPAGE_TEXT_TOP}\" \"${MUI_UNCONFIRMPAGE_TEXT_LOCATION}\"\n\n  PageExEnd\n\n  !insertmacro MUI_UNFUNCTION_CONFIRMPAGE un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID}\n\n  !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_TOP\n  !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_LOCATION\n\n!macroend\n\n!macro MUI_UNPAGE_CONFIRM\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_UNPAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_CONFIRM\n  \n  !verbose pop\n\n!macroend\n\n\n;--------------------------------\n;Page functions\n\n!macro MUI_UNFUNCTION_CONFIRMPAGE PRE SHOW LEAVE\n\n  Function \"${PRE}\"\n\n   !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n   !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_UNTEXT_CONFIRM_TITLE) $(MUI_UNTEXT_CONFIRM_SUBTITLE)\n\n  FunctionEnd\n\n  Function \"${SHOW}\"\n\n    ;Get controls handles\n    FindWindow $mui.UnConfirmPage \"#32770\" \"\" $HWNDPARENT\n    GetDlgItem $mui.UnConfirmPage.Text $mui.UnConfirmPage 1006\n    GetDlgItem $mui.UnConfirmPage.DirectoryText $mui.UnConfirmPage 1029\n    GetDlgItem $mui.UnConfirmPage.Directory $mui.UnConfirmPage 1000\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n\n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n  FunctionEnd\n\n!macroend\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI 2/Pages/Welcome.nsh",
    "content": "/*\n\nNSIS Modern User Interface\nWelcome page (implemented using nsDialogs)\n\n*/\n\n;--------------------------------\n;Page interface settings and variables\n\n!macro MUI_WELCOMEPAGE_INTERFACE\n\n  !ifndef MUI_WELCOMEPAGE_INTERFACE\n    !define MUI_WELCOMEPAGE_INTERFACE\n    Var mui.WelcomePage\n        \n    Var mui.WelcomePage.Image\n    Var mui.WelcomePage.Image.Bitmap\n    \n    Var mui.WelcomePage.Title\n    Var mui.WelcomePage.Title.Font\n    \n    Var mui.WelcomePage.Text    \n  !endif\n  \n  !insertmacro MUI_DEFAULT MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP \"${NSISDIR}\\Contrib\\Graphics\\Wizard\\win.bmp\"  \n\n!macroend\n\n\n;--------------------------------\n;Interface initialization\n\n!macro MUI_WELCOMEPAGE_GUIINIT\n\n  !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEWELCOMEPAGE_GUINIT\n    !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEWELCOMEPAGE_GUINIT\n\n    Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePage.GUIInit\n      \n      InitPluginsDir\n      File \"/oname=$PLUGINSDIR\\modern-wizard.bmp\" \"${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}\"\n    \n      !ifdef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT\n        Call \"${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT}\"\n      !endif   \n    \n    FunctionEnd\n  \n    !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePage.GUIInit\n\n  !endif\n\n!macroend\n\n\n;--------------------------------\n;Page declaration\n\n!macro MUI_PAGEDECLARATION_WELCOME\n\n  !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEPAGE \"\"\n  !insertmacro MUI_WELCOMEPAGE_INTERFACE\n  \n  !insertmacro MUI_WELCOMEPAGE_GUIINIT\n\n  !insertmacro MUI_DEFAULT MUI_WELCOMEPAGE_TITLE \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TITLE)\"\n  !insertmacro MUI_DEFAULT MUI_WELCOMEPAGE_TEXT \"$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TEXT)\"\n  \n  !insertmacro MUI_PAGE_FUNCTION_FULLWINDOW\n\n  PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom\n\n    PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID}\n\n  PageExEnd\n\n  !insertmacro MUI_FUNCTION_WELCOMEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID}\n\n  !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE\n  !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_3LINES\n  !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT\n\n!macroend\n\n!macro MUI_PAGE_WELCOME\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_PAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_WELCOME\n\n  !verbose pop\n\n!macroend\n\n!macro MUI_UNPAGE_WELCOME\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !insertmacro MUI_UNPAGE_INIT\n  !insertmacro MUI_PAGEDECLARATION_WELCOME\n\n  !verbose pop\n\n!macroend\n\n\n;--------------------------------\n;Page functions\n\n!macro MUI_FUNCTION_WELCOMEPAGE PRE LEAVE\n\n  Function \"${PRE}\"\n  \n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE  \n\n    ;Create dialog\n    nsDialogs::Create 1044\n    Pop $mui.WelcomePage\n    nsDialogs::SetRTL $(^RTL)\n    SetCtlColors $mui.WelcomePage \"\" \"${MUI_BGCOLOR}\"    \n\n    ;Image control\n    ${NSD_CreateBitmap} 0u 0u 109u 193u \"\"\n    Pop $mui.WelcomePage.Image\n    !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP_NOSTRETCH\n      ${NSD_SetStretchedImage} $mui.WelcomePage.Image $PLUGINSDIR\\modern-wizard.bmp $mui.WelcomePage.Image.Bitmap\n    !else\n      ${NSD_SetImage} $mui.WelcomePage.Image $PLUGINSDIR\\modern-wizard.bmp $mui.WelcomePage.Image.Bitmap\n    !endif\n\n    ;Positiong of controls\n\n    ;Title    \n    !ifndef MUI_WELCOMEPAGE_TITLE_3LINES\n      !define MUI_WELCOMEPAGE_TITLE_HEIGHT 28\n    !else\n      !define MUI_WELCOMEPAGE_TITLE_HEIGHT 38\n    !endif\n    \n    ;Text\n    ;17 = 10 (top margin) + 7 (distance between texts)\n    !define /math MUI_WELCOMEPAGE_TEXT_TOP 17 + ${MUI_WELCOMEPAGE_TITLE_HEIGHT}\n\n    ;Title\n    ${NSD_CreateLabel} 120u 10u 195u ${MUI_WELCOMEPAGE_TITLE_HEIGHT}u \"${MUI_WELCOMEPAGE_TITLE}\"\n    Pop $mui.WelcomePage.Title\n    SetCtlColors $mui.WelcomePage.Title \"\" \"${MUI_BGCOLOR}\"    \n    CreateFont $mui.WelcomePage.Title.Font \"$(^Font)\" \"12\" \"700\"\n    SendMessage $mui.WelcomePage.Title ${WM_SETFONT} $mui.WelcomePage.Title.Font 0\n\n    ;Welcome text\n    ${NSD_CreateLabel} 120u ${MUI_WELCOMEPAGE_TEXT_TOP}u 195u 130u \"${MUI_WELCOMEPAGE_TEXT}\"\n    Pop $mui.WelcomePage.Text\n    SetCtlColors $mui.WelcomePage.Text \"\" \"${MUI_BGCOLOR}\"\n\n    ;Show page\n    Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageLoadFullWindow\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n    nsDialogs::Show\n    Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageUnloadFullWindow    \n\n    ;Delete image from memory\n    ${NSD_FreeImage} $mui.WelcomePage.Image.Bitmap\n\n    !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_HEIGHT\n    !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT_TOP\n    \n  FunctionEnd\n\n  Function \"${LEAVE}\"\n\n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n\n  FunctionEnd\n\n!macroend\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/Modern UI 2/Pages.nsh",
    "content": "/*\n\nNSIS Modern User Interface\nSupport code for all pages\n\n*/\n\n;--------------------------------\n;Page initialization\n\n!macro MUI_PAGE_INIT\n\n  ;Include interface settings in neccesary\n  !insertmacro MUI_INTERFACE\n\n  ;Define settings for installer page\n  !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER\n  !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_PREFIX\n  !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_FUNCPREFIX\n  \n  !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_PREFIX \"\"\n  !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_FUNCPREFIX \"\"\n\n  ;Generate unique ID\n  !insertmacro MUI_UNSET MUI_UNIQUEID\n  !define MUI_UNIQUEID ${__LINE__}\n\n!macroend\n\n!macro MUI_UNPAGE_INIT\n\n  ;Include interface settings\n  !insertmacro MUI_INTERFACE\n\n  ;Define prefixes for uninstaller page\n  !insertmacro MUI_SET MUI_UNINSTALLER \"\"\n  \n  !insertmacro MUI_SET MUI_PAGE_UNINSTALLER \"\"\n  !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_PREFIX \"UN\"\n  !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_FUNCPREFIX \"un.\"\n  \n  ;Generate unique ID\n  !insertmacro MUI_UNSET MUI_UNIQUEID\n  !define MUI_UNIQUEID ${__LINE__}  \n\n!macroend\n\n\n;--------------------------------\n;Header text for standard MUI page\n\n!macro MUI_HEADER_TEXT_PAGE TEXT SUBTEXT\n\n  !ifdef MUI_PAGE_HEADER_TEXT & MUI_PAGE_HEADER_SUBTEXT\n    !insertmacro MUI_HEADER_TEXT \"${MUI_PAGE_HEADER_TEXT}\" \"${MUI_PAGE_HEADER_SUBTEXT}\"\n  !else ifdef MUI_PAGE_HEADER_TEXT\n    !insertmacro MUI_HEADER_TEXT \"${MUI_PAGE_HEADER_TEXT}\" \"${SUBTEXT}\"\n  !else ifdef MUI_PAGE_HEADER_SUBTEXT\n    !insertmacro MUI_HEADER_TEXT \"${TEXT}\" \"${MUI_PAGE_HEADER_SUBTEXT}\"\n  !else\n    !insertmacro MUI_HEADER_TEXT \"${TEXT}\" \"${SUBTEXT}\"\n  !endif\n\n  !insertmacro MUI_UNSET MUI_PAGE_HEADER_TEXT\n  !insertmacro MUI_UNSET MUI_PAGE_HEADER_SUBTEXT\n\n!macroend\n\n\n;--------------------------------\n;Header text for custom page\n\n!macro MUI_HEADER_TEXT TEXT SUBTEXT ;Called from script\n\n  !verbose push\n  !verbose ${MUI_VERBOSE}\n\n  !ifdef MUI_HEADER_TRANSPARENT_TEXT\n    LockWindow on\n  !endif\n\n  SendMessage $mui.Header.Text ${WM_SETTEXT} 0 \"STR:${TEXT}\"\n  SendMessage $mui.Header.SubText ${WM_SETTEXT} 0 \"STR:${SUBTEXT}\"\n\n  !ifdef MUI_HEADER_TRANSPARENT_TEXT\n    LockWindow off\n  !endif\n\n  !verbose pop\n\n!macroend\n\n\n;--------------------------------\n;Custom page functions\n\n!macro MUI_PAGE_FUNCTION_CUSTOM TYPE\n\n  !ifdef MUI_PAGE_CUSTOMFUNCTION_${TYPE}\n    Call \"${MUI_PAGE_CUSTOMFUNCTION_${TYPE}}\"\n    !undef MUI_PAGE_CUSTOMFUNCTION_${TYPE}\n  !endif\n\n!macroend\n\n\n;--------------------------------\n;Support for full window pages (like welcome/finish page)\n\n!macro MUI_PAGE_FUNCTION_FULLWINDOW\n\n  !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_FULLWINDOW\n    !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_FULLWINDOW\n\n    Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageLoadFullWindow\n    \n      LockWindow on\n      \n      ;The branding text needs to be hidden because the full windows page\n      ;overlaps with it.\n      ShowWindow $mui.Branding.Background ${SW_HIDE}\n      ShowWindow $mui.Branding.Text ${SW_HIDE}      \n      \n      ;The texts need to be hidden because otherwise they may show through\n      ;the page above when the Alt key is pressed.\n      ShowWindow $mui.Header.Text ${SW_HIDE}\n      ShowWindow $mui.Header.SubText ${SW_HIDE}\n      ShowWindow $mui.Header.Image ${SW_HIDE}\n\n      ;Show line below full width of page\n      ShowWindow $mui.Line.Standard ${SW_HIDE}\n      ShowWindow $mui.Line.FullWindow ${SW_NORMAL}\n      \n      LockWindow off\n      \n    FunctionEnd\n    \n    Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageUnloadFullWindow\n    \n      ;Set everything back to normal again\n    \n      LockWindow on\n      \n      ShowWindow $mui.Branding.Background ${SW_NORMAL}\n      ShowWindow $mui.Branding.Text ${SW_NORMAL}\n      \n      ShowWindow $mui.Header.Text ${SW_NORMAL}\n      ShowWindow $mui.Header.SubText ${SW_NORMAL}\n      ShowWindow $mui.Header.Image ${SW_NORMAL}\n      \n      ShowWindow $mui.Line.Standard ${SW_NORMAL}\n      ShowWindow $mui.Line.FullWindow ${SW_HIDE}\n      \n      LockWindow off\n      \n    FunctionEnd    \n    \n  !endif\n\n!macroend\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/zip2exe/Base.nsh",
    "content": ";Change this file to customize zip2exe generated installers\n\nName \"${ZIP2EXE_NAME}\"\nOutFile \"${ZIP2EXE_OUTFILE}\"\n\nAllowRootDirInstall true\n\n\n!ifdef ZIP2EXE_COMPRESSOR_SOLID\n  !define SETCOMPRESSOR_SWITCH /SOLID\n!else\n  !define SETCOMPRESSOR_SWITCH\n!endif\n\n!ifdef ZIP2EXE_COMPRESSOR_ZLIB\n  SetCompressor ${SETCOMPRESSOR_SWITCH} zlib\n!else ifdef ZIP2EXE_COMPRESSOR_BZIP2\n  SetCompressor ${SETCOMPRESSOR_SWITCH} bzip2\n!else ifdef ZIP2EXE_COMPRESSOR_LZMA\n  SetCompressor ${SETCOMPRESSOR_SWITCH} lzma\n!endif\n\n!ifdef ZIP2EXE_INSTALLDIR\n\n  InstallDir \"${ZIP2EXE_INSTALLDIR}\"\n\n  Function zip2exe.SetOutPath\n    SetOutPath \"$INSTDIR\"\n  FunctionEnd\n\n!else ifdef ZIP2EXE_INSTALLDIR_WINAMP\n\n  InstallDir \"$PROGRAMFILES\\Winamp\"\n  InstallDirRegKey HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Winamp\" \"UninstallString\"\n\n  Function .onVerifyInstDir\n    IfFileExists $INSTDIR\\winamp.exe WinampInstalled\n      Abort\n    WinampInstalled:\n  FunctionEnd\n\n  !ifdef ZIP2EXE_INSTALLDIR_WINAMPMODE\n \n    Var ZIP2EXE_TEMP1\n    Var ZIP2EXE_TEMP2\n\n    Function zip2exe.SetOutPath\n       !ifdef ZIP2EXE_INSTALLDIR_SKINS\n         StrCpy $ZIP2EXE_TEMP1 \"$INSTDIR\\Skins\"\n       !else\n         StrCpy $ZIP2EXE_TEMP1 \"$INSTDIR\\Plugins\"\n       !endif\n       ReadINIStr $ZIP2EXE_TEMP2 \"$INSTDIR\\winamp.ini\" \"Winamp\" \"${ZIP2EXE_INSTALLDIR_WINAMPMODE}\"\n         StrCmp $ZIP2EXE_TEMP2 \"\" End\n         IfFileExists $ZIP2EXE_TEMP2 0 End\n         StrCpy $ZIP2EXE_TEMP1 $ZIP2EXE_TEMP2\n       End:\n         SetOutPath $ZIP2EXE_TEMP1\n    FunctionEnd\n\n  !else\n\n    Function zip2exe.SetOutPath\n      !ifdef ZIP2EXE_INSTALLDIR_PLUGINS\n        SetOutPath \"$INSTDIR\\Plugins\"\n      !else\n        SetOutPath \"$INSTDIR\"\n      !endif\n    FunctionEnd\n\n  !endif\n\n!endif\n\n!macro SECTION_BEGIN\n\n  Section \"\"\n  \n    Call zip2exe.SetOutPath\n  \n!macroend\n\n!macro SECTION_END\n\n  SectionEnd\n  \n!macroend"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/zip2exe/Classic.nsh",
    "content": ";Change this file to customize zip2exe generated installers with a classic interface\n\nPage directory\nPage instfiles"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Contrib/zip2exe/Modern.nsh",
    "content": ";Change this file to customize zip2exe generated installers with a modern interface\n\n!include \"MUI.nsh\"\n\n!insertmacro MUI_PAGE_DIRECTORY\n!insertmacro MUI_PAGE_INSTFILES\n\n!insertmacro MUI_LANGUAGE \"English\""
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/AdvSplash/advsplash.txt",
    "content": "AdvSplash.dll - small (5.5k), simple plugin that lets you throw \nup a splash screen in NSIS installers with cool fading effects (win2k/xp)\nand transparency.\n\nTo use:\n\nCreate a .BMP file of your splash screen.\n(optional) Create a .WAV file to play while your splash screen shows.\n\nAdd the following lines to your .NSI file:\n\nFunction .onInit\n  SetOutPath $TEMP\n  File /oname=spltmp.bmp \"my_splash.bmp\"\n\n; optional\n; File /oname=spltmp.wav \"my_splashshit.wav\"\n\n  advsplash::show 1000 600 400 -1 $TEMP\\spltmp\n\n  Pop $0 ; $0 has '1' if the user closed the splash screen early,\n         ; '0' if everything closed normally, and '-1' if some error occurred.\n\n  Delete $TEMP\\spltmp.bmp\n;  Delete $TEMP\\spltmp.wav\nFunctionEnd\n\nCalling format\n        advsplash::show Delay FadeIn FadeOut KeyColor FileName\n\nDelay - length to show the screen for (in milliseconds)\nFadeIn - length to show the fadein scene (in ms) (not included in Delay)\nFadeOut - length to show the fadeout scene (in ms) (not included in Delay)\nKeyColor - color used for transparency, could be any RGB value \n        (for ex. R=255 G=100 B=16 -> KeyColor=0xFF6410), \n        use KeyColor=-1 if there is no transparent color at your image.\nFileName - splash bitmap filename (without the .bmp). The BMP file used will be \n        this parameter.bmp, and the wave file used (if present) will be this \n        parameter.wav.\n\n(If you already have an .onInit function, put that in it)\n\nNote 1: fadein/fadeout supported only on win2k/winxp systems, all other systems\nwill show simple splash screen with Delay = Delay + FadeIn + FadeOut. Also, I've\nnoted my winXP uses no transparent color at 16 bpp, so at bpps lower than 32\nfor images with transparent color no fading effect will occur.\n\nNote 2: the return value of splash is 1 if the user closed the splash \nscreen early (pop it from the stack)\n\n-Justin\nConverted to a plugin DLL by Amir Szekely (kichik)\nFading and transparency by Nik Medved (brainsucker)"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/Banner/Readme.txt",
    "content": "BANNER PLUG-IN\n--------------\n\nThe Banner plug-in shows a banner with customizable text. It uses the IDD_VERIFY dialog of the UI.\n\nThere are three functions - show, getWindow and destroy.\n\nUsage\n-----\n\nBanner::show \"Text to show\"\n\n[optional] Banner::getWindow\n\nBanner::destroy\n\nSee Example.nsi for an example.\n\nModern UI\n---------\n\nThe Modern UI has two labels on the IDD_VERIFY dialog. To change all the texts, use:\n\nBanner::show /set 76 \"Text 1 (replaces Please wait while Setup is loading...)\" \"Normal text\"\n\nCustom UI\n---------\n\nIf you have more labels on your IDD_VERIFY dialog, you can use multiple /set parameters to change the texts.\n\nExample:\n\nBanner::show /set 76 \"bah #1\" /set 54 \"bah #2\" \"Normal text\"\n\nThe second parameter for /set is the ID of the control.\n\nSome More Tricks\n----------------\n\nIf you use /set to set the main string (IDC_STR, 1030) you can specify a different string for the window's caption and for the main string.\n\nIf you use an empty string as the main string (Banner::show \"\") the banner window will not show on the taskbar.\n\nCredits\n-------\n\nA joint effort of brainsucker and kichik in honor of the messages dropped during the battle"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/BgImage/BgImage.txt",
    "content": "BgImage.DLL - NSIS extension DLL\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nDisplays an image or a gradient with user defined texts and/or images behind the NSIS window.\nCan also play WAVs.\n\nSee Example.nsi for a usage example.\n\nUsage\n~~~~~\n\n1) Call SetBg to set the background\n2) Call AddText, or AddImage to add texts and images\n3) Call Redraw to update the background window\n4) Optional - repeat steps 2-3 to add more images\n           -or-\n   call Clear and repeat steps 1-3 for a completely new background.\n5) Call Destroy when the background is no longer required (.onGUIEnd for example)\n\nNotes\n~~~~~\n\n* This plugin requires NSIS 2.42 and above.\n\n* Do not call SetBg (which creates the window) from a section or a function called by a section.\n   BgImge must be run from the GUI thread as the installation thread is not built to handle GUI.\n\nAvailable functions\n~~~~~~~~~~~~~~\n\nSetBg [/FILLSCREEN|/TILED] path_to_bitmap\nSetBg /GRADIENT R G B R G B\n   Sets the background and creates the window if necessary\n   Use /FILLSCREEN to make the image fill the screen\n   Use /TILED to set a tiled background\n   Use /GRADIENT to set a gradient background\n\n   If SetReturn on was called returns \"success\" on the stack\n     or an error string if there was an error\n\n   Do not use in .onInit!\n\nAddImage [/TRANSPARENT R G B] path_to_bitmap X Y\n   Adds an image to the background window at (X,Y)\n     X and Y can be negative to specify distance from right/bottom\n   Use /TRANSPARENT to make BgImage draw the image transparently\n     Define the transparent color using R G B\n\n   If SetReturn on was called returns \"success\" on the stack\n     or an error string if there was an error\n\nAddText text font_handle R G B X Y X Y\n  Adds text to the background window\n  Use NSIS's CreateFont to create a font and pass it as font_handle\n  Use R G B to set the text color\n  The first X Y is for the top left corner of the text box\n  The second X Y is for the bottom right corner of the text box\n  X and Y can be negative to specify distance from right/bottoms\n\n  If SetReturn on was called returns \"success\" on the stack\n     or an error string if there was an error\n\nClear\n   Clears all of the current background, images and texts\n\nDestroy\n   Destroys the current background window\n   Destroy calls Clear automatically\n\nSound [/WAIT|/LOOP] path_to_wav\nSound /STOP\n   Plays a wave file\n   Use /WAIT to wait for the sound to finish playing\n   Use /LOOP to loop the sound\n   Use Sound /STOP to stop the loop\n\nSetReturn on|off\n   Enable return values from SetBg, AddImage and AddText\n   Default value is off because all of the possible errors\n     are either things you should handle when debugging your script\n     such as \"can't load bitmap\" or errors you can do nothing about\n     such as \"memory allocation error\"\n\nCredits\n~~~~~~~\n\nCoded by Amir Szekely, aka KiCHiK\n\nXimon Eighteen, aka Sunjammer - Fixed window title bar issues\niceman_k - Text idea and original implementation\nLajos Molnar, aka orfanik - Tile idea and original implementation\nJason Reis - Coding help"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/Dialer/Dialer.txt",
    "content": "DIALER PLUGIN\n-------------\n\nWritten by Amir Szekely aka KiCHiK\nReadme by Joost Verburg\n\nThe Dialer plugin for NSIS provides five functions related to internet connections.\n\nTo download files from the internet, use the NSISdl plugin.\n\nUSAGE\n-----\n\nExample of usage:\n\nClearErrors           ;Clear the error flag\nDialer::FunctionName  ;Call Dialer function\nIfErrors \"\" +3        ;Check for errors\n  MessageBox MB_OK \"Function not available\"\n  Quit\nPop $R0               ;Get the return value from the stack\nMessageBox MB_OK $R0  ;Display the return value\n\nEXAMPLE FUNCTION\n----------------\n\n; ConnectInternet (uses Dialer plugin)\n; Written by Joost Verburg \n;\n; This function attempts to make a connection to the internet if there is no\n; connection available. If you are not sure that a system using the installer\n; has an active internet connection, call this function before downloading\n; files with NSISdl.\n; \n; The function requires Internet Explorer 3, but asks to connect manually if\n; IE3 is not installed.\n\nFunction ConnectInternet\n\n  Push $R0\n    \n    ClearErrors\n    Dialer::AttemptConnect\n    IfErrors noie3\n    \n    Pop $R0\n    StrCmp $R0 \"online\" connected\n      MessageBox MB_OK|MB_ICONSTOP \"Cannot connect to the internet.\"\n      Quit ;Remove to make error not fatal\n    \n    noie3:\n  \n    ; IE3 not installed\n    MessageBox MB_OK|MB_ICONINFORMATION \"Please connect to the internet now.\"\n    \n    connected:\n  \n  Pop $R0\n  \nFunctionEnd\n\nFUNCTIONS\n---------\n\nIf a function is not available on the system, the error flag will be set.\n\n* AttemptConnect\n\n  Attempts to make a connection to the Internet if the system is not connected.\n  \n  online - already connected / connection successful\n  offline - connection failed\n  \n  Requires Internet Explorer 3 or later\n\n* AutodialOnline\n\n  Causes the modem to automatically dial the default Internet connection if the system\n  is not connected to the internet. If the system is not set up to automatically\n  connect, it will prompt the user.\n  \n  Return values:\n  \n  online - already connected / connection successful\n  offline - connection failed\n  \n  Requires Internet Explorer 4 or later\n\n* AutodialUnattended\n\n  Causes the modem to automatically dial the default Internet connection if the system\n  is not connected to the internet. The user will not be prompted.\n  \n  Return values:\n  \n  online - already connected / connection successful\n  offline - connection failed\n  \n  Requires Internet Explorer 4 or later\n\n* AutodialHangup\n\n  Disconnects an automatic dial-up connection.\n  \n  Return values:\n\n  success - disconnection successful\n  failure - disconnection failed\n  \n  Requires Internet Explorer 4 or later\n\n* GetConnectedState\n\n  Checks whether the system is connected to the internet.\n  \n  Return values:\n\n  online - system is online\n  offline - system is offline\n  \n  Requires Internet Explorer 4 or later"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/InstallOptions/Changelog.txt",
    "content": "DLL version 2.47 (4/27/2007)\n* Line breaks support in Link control\n* Added HLine and VLine controls\n\nDLL version 2.46 (3/31/2007)\n* Use installer's name for message boxes\n\nDLL version 2.45 (1/23/2007)\n* Added FOCUS flag for setting focus to a control other than the first\n\nDLL version 2.44 (10/11/2005)\n* Added HWND and HWND2 entries to the INI file to avoid messy calculations of the correct control id\n\nDLL version 2.43 (10/4/2005)\n* Fixed alteration of the working directory by FileRequest\n* Added WS_EX_LEFTSCROLLBAR in RTL mode\n\nDLL version 2.42 (1/21/2005)\n* Added TRANSPARENT flag for BITMAP fields (funded by Chris Morgan)\n\nDLL version 2.41 (8/5/2004)\n* Bitmaps are now automatically centered\n* Fixed a bug which prevented enabling the next button from the leave function of InstallOptions pages\n* Fixed a rare freeze\n\nDLL version 2.4 (1/4/2004)\n* Initial focus is set in \"initDialog\" making it possible to override it from NSIS prior to calling \"show\"\n* When initial focus is to a Text field InstallOptions now follows standard Windows behaviour by having the text selected\n* Label and other static fields no longer have State= written to the INI file when leaving the dialog\n* NOTIFY flag can now be used with Link fields (State should be omitted in this case)\n* Likewise, State can now be used with Button fields (behaves the same as with Link fields)\n* NOTIFY flag can also now be used with ListBox and DropList fields to have NSIS notified when the selection changes\n* Meaning of RIGHT flag is now reversed in right-to-left language mode\n* HSCROLL and VSCROLL flags are no longer restricted to Text fields\n* Various Link field fixes\n\nDLL version 2.3 (12/4/2003)\n* Added new control type \"Button\"\n* Added new flag \"NOTIFY\"\n* Added new flag \"NOWORDWRAP\" for multi-line text boxes\n* Reduced size down to 12K\n* Better RTL support\n\nDLL version 2.2 (6/10/2003)\n* Added New control type LINK\n* \\r\\n converts to newline in Multiline edit box\n* Support for multiline edit box\n* Better tab order in DirRequest and FileRequest\n* Added READONLY option to text box\n* Minor fixes\n\nDLL version 2.1 (3/15/2003)\n* \\r\\n converts to newline in both label Text and ValidateText\n* New browse dialog style (modern)\n* Word wrapping for check boxes and radio buttons\n* No ugly border for edit fields under XP\n* Scroll bar for list boxes\n* Works with SetStaticBkColor\n* DISABLED dir and file request fields now disable the browse button too\n* No more STATE value for labels\n* Minor fixes\n\nDLL version 2.0 (1/4/2003)\n* Supports custom font and DPI settings (by Joost Verburg)\n* INI files should contain dialog units now, no pixels (by Joost Verburg)\n* RESIZETOFIT flag for Bitmap control (by Amir Szekely)\n* New documentation (by Joost Verburg)\n* New GROUP/NOTABSTOP/DISABLED flags\n\nDLL version 1.7 beta (11/2/2002)\n* Added initDialog and show DLL functions\n\nDLL version 1.6 beta (9/30/2002)\n* CancelConfirmIcon becomes CancelConfirmFlags and can now take the other common MessageBox flags\n\nDLL version 1.5 beta (9/26/2002)\n* Made close [x] button behave like Cancel (thanks brainsucker)\n\nDLL version 1.4 beta (9/4/2002)\n* Added Icon and Bitmap controls (by Amir Szekely)\n\nDLL version 1.3 beta (8/15/2002)\n* Added CancelShow (by ORTIM)\n* Added pixel transformation for widgets (by ORTIM)\n\nDLL version 1.2 beta (7/31/2002)\n* Added CancelEnabled (by ORTIM)\n* Added CancelConfirmCaption and CancelConfirmIcon (by Amir Szekely)\n\nDLL version 1.1 beta (7/22/2002)\n* Font is now taken from the main NSIS window (by Amir Szekely)\n\nDLL version 1.0 beta (12/16/2001)\n* Moved to DLL, no longer need parentwnd ini writing\n* Tons of changes - no longer fully compatible (see source for a big list)\n* removed support for silent installers (it seems the old version would bring up it's own dialog)\n\nversion 1.4 (11/18/2001)\n* Added Listbox controls.\n* Added MULTISELECT flag.\n* Made the HWND list for the parent window controls dynamically allocated. This prevents a crash if NSIS ever gets more than 150 controls on it's main window.\n* The TEXT property of DirRequest control can be used to specify an initial directory. The current directory is automatically selected when clicking the browse button of the DirRequest control.\n* Added ROOT property to DirRequest which can be used to set the root directory (mostly due to felfert)\n* Edit controls will now auto scroll (thanks felfert)\n* Fixed a problem where the window wouldn't draw properly on some systems (thanks felfert)\n\nversion 1.3 (11/03/2001)\n* Got rid of the call to RedrawWindow() because it's no longer needed with the WS_CLIPCHILDREN flag for NSIS.\n* Removed a few hardcoded limits of buffer sizes\n* Added Checkbox and RadioButton controls\n* Added RIGHT and CHECKED flags\n\nversion 1.2.2 (10/30/2001)\n* Additional size reductions. Further reduced the size down to 8k.\n* The text parameter to a combobox can now be used to specify the initial value\n* Changed from InvalidateRect() to RedrawWindow() to force a redraw after a browse dialog\n* On startup, set the flags of the NSIS window to include WS_CLIPCHILDREN. Otherwise, our controls don't get drawn right.\n\nversion 1.2.1 (10/28/2001)\n* Bug fix. ControlID for the caption and the OK button were reused by the first two controls. (Thanks Schultz)\n\nversion 1.2j (10/28/2001)\n* 8.5kb from 44kb. heh. (by Justin Frankel)\n\nversion 1.2 (10/28/2001)\n* Still 44k\n* Added the \"FileRequest\" and \"DirRequest\" control types (thanks Schultz)\n* Added \"MinLen\", \"MaxLen\", and \"ValidateText\" properties to fields\n* Added \"Flags\" as a way to specify additional parameters for controls\n* Few more changes to the documentation\n* Cleaned the code in a few places...still trying to make it smaller\n\nversion 1.1 (10/27/2001)\n* Added the \"Title\" option (thanks Alex)\n* Moved the OK button so it is in the same location as the buttons on the main NSIS window (thanks Alex)\n* Pressing \"ENTER\" will now automatically select the OK button (thanks Alex)\n* Slightly improved the documentation\n\nversion 1.01 (10/25/2001)\n* Fixed the SetFocus loop so it exits after the first control like it was supposed to\n* Added the license to the documentation\n\nversion 1.0 (10/25/2001)\n* Barely qualifies as a distribution\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/InstallOptions/Readme.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <title>InstallOptions 2</title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\" />\n    <style type=\"text/css\">\n        /*<![CDATA[*/body\n        {\n            padding: 10px;\n            background-color: #F0F0F0;\n            font-family: Verdana, Arial, Helvetica, sans-serif;\n            font-size: 13px;\n            font-weight: normal;\n            text-align: left;\n        }\n        p, li\n        {\n            font-size: 13px;\n        }\n        .center\n        {\n            text-align: center;\n        }\n        table\n        {\n            margin: auto;\n            font-size: 13px;\n            background-color: #FFFFFF;\n        }\n        .maintable\n        {\n            border: 2px solid #376EAB;\n        }\n        .parameter\n        {\n            font-weight: bold;\n            color: #6586AC;\n        }\n        h1\n        {\n            font-size: 30px;\n            color: #333333;\n            font-weight: normal;\n            text-align: center;\n            margin-top: 20px;\n        }\n        h2\n        {\n            font-size: 20px;\n            color: #7A7272;\n            font-weight: normal;\n        }\n        h3\n        {\n            font-size: 17px;\n            font-weight: bold;\n            color: #303030;\n        }\n        pre\n        {\n            font-size: 13px;\n        }\n        div\n        {\n            margin: 20px;\n        }\n        a:link, a:visited, a:active\n        {\n            color: #294F75;\n            text-decoration: none;\n        }\n        a:hover\n        {\n            color: #182634;\n            text-decoration: underline;\n        }\n        .subtable\n        {\n            border: 0px;\n            margin-left: 20px;\n            margin-right: 20px;\n        }\n        .lefttable\n        {\n            background-color: #CCCCCC;\n            vertical-align: top;\n        }\n        .righttable\n        {\n            background-color: #EEEEEE;\n            vertical-align: top;\n        }\n        /*]]>*/</style>\n</head>\n<body>\n    <table width=\"750\" class=\"maintable\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n        <tr>\n            <td>\n                <h1>\n                    InstallOptions 2</h1>\n                <div>\n                    <p>\n                        The InstallOptions plug-in is deprecated. For new scripts, it is recommended to\n                        use the new nsDialogs plug-in instead.</p>\n                </div>\n                <div>\n                    <h2>\n                        Introduction</h2>\n                    <div>\n                        <p>\n                            InstallOptions is an NSIS plugin which allows you to create custom pages for NSIS\n                            installers, to prompt the user for extra information.</p>\n                        <p>\n                            The dialogs created by InstallOptions are based on INI files which define the controls\n                            on the dialog and their properties. These INI files can be modified from the script\n                            to adjust the dialogs on runtime.</p>\n                        <p>\n                            The format of INI files is described in a <a href=\"http://en.wikipedia.org/wiki/Ini_file\">\n                                Wikipedia article</a>.</p>\n                    </div>\n                    <h2>\n                        INI file structure</h2>\n                    <div>\n                        <p>\n                            The INI file has one required section. This section includes the number of controls\n                            to be created as well as general window attributes. The INI file also includes a\n                            variable number of Field sections which are used to create the controls to be displayed.</p>\n                        <p>\n                            The required section is named &quot;<em>Settings</em>&quot;. It can contain the\n                            following values:</p>\n                        <table class=\"subtable\">\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>NumFields</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(required)</em></td>\n                                <td class=\"righttable\">\n                                    The number of control elements to be displayed on the dialog window.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>Title</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    If specified, gives the text to set the titlebar to. Otherwise, the titlebar text\n                                    is not changed.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>CancelEnabled</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    If specified, overrides NSIS settings and enables or disables the cancel button.\n                                    If set to 1, the cancel button will be enabled. If set to 0, the cancel button will\n                                    be disabled.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>CancelShow</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    If specified, overrides NSIS settings and shows or hides the cancel button If set\n                                    to 1, the cancel button will be shown. If set to 0, the cancel button will be hidden.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>BackEnabled</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    If specified, overrides NSIS settings and enables or disables the back button. If\n                                    set to 1, the back button will be enabled. If set to 0, the back button will be\n                                    disabled.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>CancelButtonText</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    Overrides the text for the cancel button. If not specified, the cancel button text\n                                    will not be changed.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>NextButtonText</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    Overrides the text for the next button. If not specified, the next button text will\n                                    not be changed.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>BackButtonText</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    Overrides the text for the back button. If not specified, the back button text will\n                                    not be changed.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>Rect</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    Overrides the default rect ID to run over. This will make IO resize itself according\n                                    to a different rect than NSIS's dialogs rect.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>RTL</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    If 1 is specified the dialog will be mirrored and all texts will be aligned to the\n                                    right. The INSTALLOPTIONS_EXTRACT macros automatically set this field to the right\n                                    value for the current installer language as given by the NSIS string $(^RTL).</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>State</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(output)</em></td>\n                                <td class=\"righttable\">\n                                    This is not something you have to supply yourself but is set by InstallOptions,\n                                    before calling your custom page validation function, to the field number of the\n                                    custom Button control (or other control having the Notify flag) the user pressed,\n                                    if any.</td>\n                            </tr>\n                        </table>\n                        <p>\n                            Each field section has the heading &quot;Field #&quot; where # must be sequential\n                            numbers from 1 to NumFields. Each Field section can contain the following values:</p>\n                        <table class=\"subtable\">\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>Type</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(required)</em></td>\n                                <td class=\"righttable\">\n                                    Type of control to be created. Valid values are &quot;<em>Label</em>&quot;, &quot;<em>Text</em>&quot;,\n                                    &quot;<em>Password</em>&quot;, &quot;<em>Combobox</em>&quot;, &quot;<em>DropList</em>&quot;,\n                                    &quot;<em>Listbox</em>&quot;, &quot;<em>CheckBox</em>&quot;, &quot;<em>RadioButton</em>&quot;,\n                                    &quot;<em>FileRequest</em>&quot;, &quot;<em>DirRequest</em>&quot; &quot;<em>Icon</em>&quot;,\n                                    &quot;<em>Bitmap</em>&quot;, &quot;<em>GroupBox</em>&quot;, &quot;<em>HLine</em>&quot;,\n                                    &quot;<em>VLine</em>&quot;, &quot;<em>Link</em>&quot; or &quot;<em>Button</em>&quot;.<br />\n                                    <br />\n                                    A &quot;<em>Label</em>&quot; is used to display static text. (i.e. a caption for\n                                    a textbox)<br />\n                                    A &quot;<em>Text</em>&quot; and &quot;<em>Password</em>&quot; accept text input\n                                    from the user. &quot;<em>Password</em>&quot; masks the input with * characters.<br />\n                                    A &quot;<em>Combobox</em>&quot; allows the user to type text not in the popup list,\n                                    a &quot;<em>Droplist</em>&quot; only allows selection of items in the list.<br />\n                                    A &quot;<em>Listbox</em>&quot; shows multiple items and can optionally allow the\n                                    user to select more than one item.<br />\n                                    A &quot;<em>CheckBox</em>&quot; control displays a check box with label.<br />\n                                    A &quot;<em>RadioButton</em>&quot; control displays a radio button with label.<br />\n                                    A &quot;<em>FileRequest</em>&quot; control displays a textbox and a browse button.\n                                    Clicking the browse button will display a file requester where the user can browse\n                                    for a file.<br />\n                                    A &quot;<em>DirRequest</em>&quot; control displays a textbox and a browse button.\n                                    Clicking the browse button will display a directory requester where the user can\n                                    browse for a directory.<br />\n                                    An &quot;<em>Icon</em>&quot; control displays an icon. Use no Text to use the installer\n                                    icon.<br />\n                                    A &quot;<em>Bitmap</em>&quot; control displays a bitmap.<br />\n                                    A &quot;<em>GroupBox</em>&quot; control displays a frame to group controls.<br />\n                                    A &quot;<em>HLine</em>&quot; control displays a horizontal line to separate controls.<br />\n                                    A &quot;<em>VLine</em>&quot; control displays a vertical line to separate controls.<br />\n                                    A &quot;<em>Link</em>&quot; control displays a static hot text. When the user clicks\n                                    the control the contents of <strong>State</strong> (e.g. http://...) will be executed\n                                    using ShellExecute. Alternatively <strong>State</strong> can be omitted and the\n                                    <em>NOTIFY</em> flag used to have your NSIS script called. See the &quot;<em>NOTIFY</em>&quot;\n                                    flag below for more information.<br />\n                                    A &quot;<em>Button</em>&quot; control displays a push button that can be used in\n                                    the same way as the &quot;<em>Link</em>&quot; control above.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>Text</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    Specifies the caption of a label, checkbox, or radio button control. For DirRequest\n                                    control this specifies the title of the browse dialog. For icon and bitmaps control\n                                    this specifies the path to the image.<br />\n                                    <br />\n                                    <strong>Note:</strong> For labels, \\r\\n will be converted to a newline. To use a\n                                    back-slash in your text you have to escape it using another back-slash - \\\\. Described\n                                    <a href=\"#escaping\">below</a> are NSIS functions for converting text to/from this\n                                    format.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>State</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    Specifies the state of the control. This is updated when the user closes the window,\n                                    so you can read from it from NSIS. For edit texts and dir and file request boxes,\n                                    this is the string that is specified. For radio button and check boxes, this can\n                                    be '0' or '1' (for unchecked or checked). For list boxes, combo boxes and drop lists\n                                    this is the selected items separated by pipes ('|'). For Links and Buttons this\n                                    can specify something to be executed or opened (using ShellExecute).<br />\n                                    <br />\n                                    <strong>Note:</strong> For Text fields with the MULTILINE flag, \\r\\n will be converted\n                                    to a newline. To use a back-slash in your text you have to escape it using another\n                                    back-slash - \\\\. Described <a href=\"#escaping\">below</a> are NSIS functions for\n                                    converting text to/from this format.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>ListItems</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    A list of items to display in a combobox, droplist, or listbox.<br />\n                                    This is a single line of text with each item separated by a pipe character '|'</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>MaxLen</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    Causes validation on the selected control to limit the maximum length of text.<br />\n                                    If the user specifies more text than this, a message box will appear when they click\n                                    &quot;OK&quot; and the dialog will not be dismissed.<br />\n                                    You should not use this on a &quot;<em>combobox</em>&quot; since the user can not\n                                    control what is selected.<br />\n                                    This should be set to a maximum of 260 for &quot;<em>FileRequest</em>&quot; and\n                                    &quot;<em>DirRequest</em>&quot; controls.<br />\n                                    Ignored on &quot;<em>Label</em>&quot; controls.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>MinLen</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    Causes validation on the selected control to force the user to enter a minimum amount\n                                    of text.<br />\n                                    If the user specifies less text than this, a message box will appear when they click\n                                    &quot;OK&quot; and the dialog will not be dismissed.<br />\n                                    Unlike MaxLen, this is useful for &quot;<em>Combobox</em>&quot; controls. By setting\n                                    this to a value of &quot;1&quot; the program will force the user to select an item.<br />\n                                    Ignored on &quot;<em>Label</em>&quot; controls.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>ValidateText</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    If the field fails the test for &quot;<em>MinLen</em>&quot; or &quot;<em>MaxLen</em>&quot;,\n                                    a messagebox will be displayed with this text.<br />\n                                    <br />\n                                    <strong>Note:</strong> \\r\\n will be converted to a newline, two back-slashes will\n                                    be converted to one - \\\\. Described <a href=\"#escaping\">below</a> are NSIS functions\n                                    for converting text to/from this format.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>Left<br />\n                                        Right<br />\n                                        Top<br />\n                                        Bottom</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(required)</em></td>\n                                <td class=\"righttable\">\n                                    The position on the dialog where this control appears. All sizes should be set in\n                                    dialog units. To get the right dimensions for your controls, design your dialog\n                                    using a resource editor and copy the dimensions to the INI file.<br />\n                                    <br />\n                                    <strong>Note:</strong> You can specify negative coordinates to specify the distance\n                                    from the right or bottom edge.<br />\n                                    <br />\n                                    <strong>Note (2):</strong> For combobox or droplist, the &quot;<em>bottom</em>&quot;\n                                    value is not used in the same way.<br />\n                                    In this case, the bottom value is the maximum size of the window when the pop-up\n                                    list is being displayed. All other times, the combobox is automatically sized to\n                                    be one element tall. If you have trouble where you can not see the combobox drop-down,\n                                    then check the bottom value and ensure it is large enough. A rough guide for the\n                                    height required is the number of items in the list multiplied by 8, plus 20.<br />\n                                    <br />\n                                    <strong>Note (3):</strong> FileRequest and DirRequest controls will allocate 15\n                                    dialog units to the browse button. Make this control wide enough the contents of\n                                    the textbox can be seen.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>Filter</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    Specifies the filter to be used in the &quot;<em>FileRequest</em>&quot; control.<br />\n                                    This is constructed by putting pairs of entries together, each item separated by\n                                    a | character.<br />\n                                    The first value in each pair is the text to display for the filter.<br />\n                                    The second value is the pattern to use to match files.<br />\n                                    For example, you might specify:<br />\n                                    Filter=Text Files|*.txt|Programs|*.exe;*.com|All Files|*.*<br />\n                                    If not specified, then the filter defaults to All Files|*.*<br />\n                                    <br />\n                                    <strong>Note:</strong> you should not put any extra spaces around the | characters.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>Root</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    Used by <strong>DirRequest</strong> controls to specify the root directory of the\n                                    search. By default, this allows the user to browse any directory on the computer.\n                                    This will limit the search to a particular directory on the system.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"lefttable\">\n                                    <strong>Flags</strong></td>\n                                <td class=\"lefttable\">\n                                    <em>(optional)</em></td>\n                                <td class=\"righttable\">\n                                    This specifies additional flags for the display of different controls. Each value\n                                    should be separated by a | character, and you should be careful not to put any spaces\n                                    around the | character.<br />\n                                    <table class=\"righttable\">\n                                        <tr>\n                                            <td class=\"righttable\">\n                                                <strong>Value</strong></td>\n                                            <td class=\"righttable\">\n                                                <strong>Meaning</strong></td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"righttable\">\n                                                REQ_SAVE</td>\n                                            <td class=\"righttable\">\n                                                This causes &quot;<em>FileRequest</em>&quot; controls to display a Save As dialog.\n                                                If not specified, an Open dialog is used.</td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"righttable\">\n                                                FILE_MUST_EXIST</td>\n                                            <td class=\"righttable\">\n                                                Used by &quot;<em>FileRequest</em>&quot; to determine if the selected file must\n                                                exist.<br />\n                                                This only applies if an &quot;Open&quot; dialog is being displayed.<br />\n                                                This currently does not force the file to exist other than through the browse button.</td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"righttable\">\n                                                FILE_EXPLORER</td>\n                                            <td class=\"righttable\">\n                                                Used by &quot;<em>FileRequest</em>&quot;, enables new file request look (recommended)</td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"righttable\">\n                                                FILE_HIDEREADONLY</td>\n                                            <td class=\"righttable\">\n                                                Used by &quot;<em>FileRequest</em>&quot;, hides &quot;open read only&quot; checkbox\n                                                in open dialog.</td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"righttable\">\n                                                WARN_IF_EXIST</td>\n                                            <td class=\"righttable\">\n                                                Used by &quot;<em>FileRequest</em>&quot; to display a warning message if the selected\n                                                file already exists.<br />\n                                                The warning message is only displayed for files selected with the browse button.</td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"righttable\">\n                                                PATH_MUST_EXIST</td>\n                                            <td class=\"righttable\">\n                                                Used by &quot;<em>FileRequest</em>&quot; to force the path to exist. Prevents the\n                                                user from typing a non-existent path into the browse dialog window.<br />\n                                                This only validates path's selected with the browse button.</td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"righttable\">\n                                                PROMPT_CREATE</td>\n                                            <td class=\"righttable\">\n                                                Used by &quot;<em>FileRequest</em>&quot; to display a warning if the selected file\n                                                does not exist. However, it still allows the user to select the file.<br />\n                                                This only displays the warning for files selected with the browse button.<br />\n                                                Doesn't work along with REQ_SAVE.</td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"righttable\">\n                                                RIGHT</td>\n                                            <td class=\"righttable\">\n                                                Used by &quot;<em>Checkbox</em>&quot; and &quot;<em>Radiobutton</em>&quot; controls\n                                                to specify you want the checkbox to the right of the text instead of the left as\n                                                is the default.</td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"righttable\">\n                                                MULTISELECT</td>\n                                            <td class=\"righttable\">\n                                                Used by &quot;<em>Listbox</em>&quot; controls. Turns string selection on or off\n                                                each time the user clicks or double-clicks a string in the list box. The user can\n                                                select any number of strings. If this flag and EXTENDEDSELCT are not specified,\n                                                only one item can be selected from the list.</td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"righttable\">\n                                                EXTENDEDSELCT</td>\n                                            <td class=\"righttable\">\n                                                Used by &quot;<em>Listbox</em>&quot; controls. Allows multiple items to be selected\n                                                by using the SHIFT key and the mouse or special key combinations. If this flag and\n                                                MULTISELECT are not specified, only one item can be selected from the list.</td>\n                                        </tr>\n                                        <tr>\n                                            <td class=\"righttable\">\n                                                RESIZETOFIT</td>\n                                            <td class=\"righttable\">\n                                                This causes &quot;<em>Bitmap</em>&quot; controls to resize the image to the size\n                                                of the control. Also useful to support custom DPI settings. Without this, the image\n                                                will be centered within the specified area.</td>\n                                        </tr>\n                                        <td class=\"righttable\">\n                                            TRANSPARENT</td>\n                                        <td class=\"righttable\">\n                                            Used by &quot;<em>Bitmap</em>&quot; controls. Hides every pixel with the same color\n                                            as of the top left pixel. This allows to see-through to controls behind it. This\n                                            flag doesn't work well with a combination of the RESIZETOFIT flag and bitmaps with\n                                            more than 256 colors.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"righttable\">\n                                    GROUP</td>\n                                <td class=\"righttable\">\n                                    Add this flag to the first control of a group of controls to group them. Grouping\n                                    controls allows you to create multiple groups of radio button and makes keyboard\n                                    navigation using arrow keys easier.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"righttable\">\n                                    FOCUS</td>\n                                <td class=\"righttable\">\n                                    Sets focus on the specified control, instead of the first focusable control. If\n                                    more than one field is specified with this flag, only the first one will receive\n                                    focus.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"righttable\">\n                                    NOTABSTOP</td>\n                                <td class=\"righttable\">\n                                    Do not stop on the control when the user pressed the Tab key. Add NOTABSTOP to all\n                                    controls of a group except the first one to allow navigation between groups with\n                                    the Tab key.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"righttable\">\n                                    DISABLED</td>\n                                <td class=\"righttable\">\n                                    Causes a control to be disabled.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"righttable\">\n                                    ONLY_NUMBERS</td>\n                                <td class=\"righttable\">\n                                    Used by &quot;<em>Text</em>&quot; controls. Forces the user to enter only numbers\n                                    into the edit box.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"righttable\">\n                                    MULTILINE</td>\n                                <td class=\"righttable\">\n                                    Used by &quot;<em>Text</em>&quot; controls. Causes the control to accept multiple-lines.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"righttable\">\n                                    WANTRETURN</td>\n                                <td class=\"righttable\">\n                                    Used by &quot;<em>Text</em>&quot; controls with multiple-line. Specifies that a\n                                    carriage return be inserted when the user presses the ENTER key while entering text\n                                    into the text box.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"righttable\">\n                                    NOWORDWRAP</td>\n                                <td class=\"righttable\">\n                                    Used by &quot;<em>Text</em>&quot; controls with multiple-line. Disables the word-wrap\n                                    that occurs when long lines are entered. Long lines instead scroll off to the side.\n                                    Specifying the HSCROLL flag also has this effect.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"righttable\">\n                                    HSCROLL</td>\n                                <td class=\"righttable\">\n                                    Show a horizontal scrollbar. When used by &quot;<em>Text</em>&quot; controls with\n                                    multiple-lines this also disables word-wrap.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"righttable\">\n                                    VSCROLL</td>\n                                <td class=\"righttable\">\n                                    Show a vertical scrollbar.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"righttable\">\n                                    READONLY</td>\n                                <td class=\"righttable\">\n                                    Used by &quot;<em>Text</em>&quot; controls. Prevents the user from entering or editing\n                                    text in the edit control, but allow the user to select and copy the text.</td>\n                            </tr>\n                            <tr>\n                                <td class=\"righttable\">\n                                    NOTIFY</td>\n                                <td class=\"righttable\">\n                                    Used by &quot;<em>Button</em>&quot;, &quot;<em>Link</em>&quot;, &quot;<em>CheckBox</em>&quot;,\n                                    &quot;<em>RadioButton</em>&quot;, &quot;<em>ListBox</em>&quot; and &quot;<em>DropList</em>&quot;\n                                    controls. Causes InstallOptions to call your NSIS custom page validation/leave function\n                                    whenever the control's selection changes. Your validation/leave function can read\n                                    the &quot;<em>State</em>&quot; value from the &quot;<em>Settings</em>&quot; section\n                                    to determine which control caused the notification, if any, and perform some appropriate\n                                    action followed by an Abort instruction (to tell NSIS to return to the page). The\n                                    Examples\\InstallOptions folder contains an example script showing how this might\n                                    be used.</td>\n                            </tr>\n                        </table>\n            </td>\n        </tr>\n        <tr>\n            <td class=\"lefttable\">\n                <strong>TxtColor</strong></td>\n            <td class=\"lefttable\">\n                <em>(optional)</em></td>\n            <td class=\"righttable\">\n                Used by <strong>Link</strong> controls to specify the foreground color of the text.\n                Format: 0xBBGGRR (hexadecimal).</td>\n        </tr>\n        <tr>\n            <td class=\"lefttable\">\n                <strong>HWND<br>\n                    HWND2</strong></td>\n            <td class=\"lefttable\">\n                <em>(output)</em></td>\n            <td class=\"righttable\">\n                After initDialog returns, this will contain the HWND of the control created by this\n                field. It can be used instead of FindWindow and GetDlgItem. HWND2 contains the HWND\n                of an additional control, such as the browse button.</td>\n        </tr>\n    </table>\n    </div>\n    <h2>\n        Header file</h2>\n    <div>\n        <p>\n            The InstallOptions header files provides macros and functions to easily create custom\n            dialogs. You can include it on the top of your script as follows:\n            <pre>\n!include InstallOptions.nsh\n</pre>\n    </div>\n    <h2>\n        Creating dialogs</h2>\n    <div>\n        <h3>\n            Extracting the INI file</h3>\n        <div>\n            <p>\n                First, you have to extract your InstallOptions INI files in the .onInit function\n                (or un.onInit for the uninstaller) using the INSTALLOPTIONS_EXTRACT macro. The files\n                will be extracted to a temporary folder (the NSIS plug-ins folder) that is automatically\n                created.</p>\n            <pre>\nFunction .onInit\n  !insertmacro INSTALLOPTIONS_EXTRACT &quot;ioFile.ini&quot;\nFunctionEnd\n</pre>\n            <p>\n                If the INI file is located in another directory, use INSTALLOPTIONS_EXTRACT_AS.\n                The second parameter is the filename in the temporary folder, which is the filename\n                that should be used as input for the other macros.</p>\n            <pre>\nFunction .onInit\n  !insertmacro INSTALLOPTIONS_EXTRACT_AS &quot;..\\ioFile.ini&quot; &quot;ioFile.ini&quot;\nFunctionEnd\n</pre>\n        </div>\n        <h3>\n            Displaying the dialog</h3>\n        <div>\n            <p>\n                You can call InstallOptions in a page function defined with the Page or UninstPage\n                command. Check the NSIS documentation (Scripting Reference -&gt; Pages) for information\n                about the page system.</p>\n            <pre>\nPage custom CustomPageFunction</pre>\n            <p>\n                To display the dialog, use the INSTALLOPTIONS_DISPLAY macro:<pre>\nFunction CustomPageFunction ;Function name defined with Page command\n  !insertmacro INSTALLOPTIONS_DISPLAY &quot;ioFile.ini&quot;\nFunctionEnd\n</pre>\n        </div>\n    </div>\n    <h2>\n        User input</h2>\n    <div>\n        <p>\n            To get the input of the user, read the State value of a Field using the INSTALLOPTIONS_READ\n            macro:</p>\n        <pre>\n!insertmacro INSTALLOPTIONS_READ $VAR &quot;ioFile.ini&quot; &quot;Field #&quot; &quot;Name&quot;\n</pre>\n    </div>\n    <h2>\n        Writing to INI files</h2>\n    <div>\n        <p>\n            The INSTALLOPTIONS_WRITE macro allows you to write values to the INI file to change\n            texts or control settings on runtime:\n            <pre>\n!insertmacro INSTALLOPTIONS_WRITE &quot;ioFile.ini&quot; &quot;Field #&quot; &quot;Name&quot; &quot;Value&quot;\n</pre>\n    </div>\n    <h2>\n        Escaped values</h2>\n    <div>\n        <p>\n            Some InstallOptions values are escaped (in a similar manner to &quot;C&quot; strings)\n            to allow characters to be used that are not normally valid in INI file values. The\n            affected values are:</p>\n        <ul>\n            <li>The ValidateText field</li>\n            <li>The Text value of Label fields</li>\n            <li>The State value of Text fields that have the MULTILINE flag</li>\n        </ul>\n        <p>\n            The escape character is the back-slash character (&quot;\\&quot;) and the available\n            escape sequences are:</p>\n        <table class=\"subtable\">\n            <tr>\n                <td class=\"lefttable\">\n                    &quot;\\\\&quot;</td>\n                <td class=\"righttable\">\n                    Back-slash</td>\n            </tr>\n            <tr>\n                <td class=\"lefttable\">\n                    &quot;\\r&quot;</td>\n                <td class=\"righttable\">\n                    Carriage return (ASCII 13)</td>\n            </tr>\n            <tr>\n                <td class=\"lefttable\">\n                    &quot;\\n&quot;</td>\n                <td class=\"righttable\">\n                    Line feed (ASCII 10)</td>\n            </tr>\n            <tr>\n                <td class=\"lefttable\">\n                    &quot;\\t&quot;</td>\n                <td class=\"righttable\">\n                    Tab (ASCII 9)</td>\n            </tr>\n        </table>\n        <p>\n            The INSTALLOPTIONS_READ_CONVERT and INSTALLOPTIONS_WRITE_CONVERT macros automatically\n            convert these characters in installer code. In uninstaller code, use INSTALLOPTIONS_READ_UNCONVERT\n            and INSTALLOPTIONS_WRITE_UNCONVERT.</p>\n        <p>\n            To use these macros in your script, the conversion functions need to be included:</p>\n        <pre>\n;For INSTALLOPTIONS_READ_CONVERT\n  !insertmacro INSTALLOPTIONS_FUNCTION_READ_CONVERT\n;For INSTALLOPTIONS_WRITE_CONVERT\n  !insertmacro INSTALLOPTIONS_FUNCTION_WRITE_CONVERT\n;For INSTALLOPTIONS_READ_UNCONVERT\n  !insertmacro INSTALLOPTIONS_UNFUNCTION_READ_CONVERT\n;For INSTALLOPTIONS_WRITE_UNCONVERT\n  !insertmacro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT\n</pre>\n    </div>\n    <h2>\n        Input validation</h2>\n    <div>\n        <p>\n            To validate the user input (for example, to check whether the user has filled in\n            a textbox) use the leave function of the Page command and Abort when the validation\n            has failed:</p>\n        <pre>\nFunction ValidateCustom\n\n  !insertmacro INSTALLOPTIONS_READ $R0 \"test.ini\" \"Field 1\" \"State\"\n  StrCmp $R0 \"\" 0 +3\n    MessageBox MB_ICONEXCLAMATION|MB_OK \"Please enter your name.\"\n    Abort\n\nFunctionEnd\n</pre>\n    </div>\n    <h2>\n        Return value</h2>\n    <div>\n        After a dialog is created (using display or show), a return value is available:</p>\n        <ul>\n            <li>success - The user has pressed the Next button</li>\n            <li>back - The user has pressed the Back button</li>\n            <li>cancel - The user has pressed the Cancel button</li>\n            <li>error - An error has occurred, the dialog cannot be displayed.</li>\n        </ul>\n        <p>\n            You only have to check this value if you need something really special, such as\n            doing something when the user pressed the Back button.</p>\n        <p>\n            If you need the return value, use the INSTALLOPTIONS_DISPLAY_RETURN or INSTALLOPTIONS_SHOW_RETURN\n            macro. The return value will be added to the stack, so you can use the Pop command\n            to get it.</p>\n    </div>\n    <h2>\n        Reserve files</h2>\n    <div>\n        <p>\n            When using solid compression, it's important that files which are being extracted\n            in user interface functions are located before other files in the data block. Otherwise\n            there may be a delay before a page can be displayed.</p>\n        <p>\n            To ensure that this is the case, add ReserveFile commands for InstallOptions and\n            the INI files before all sections and functions:</p>\n        <pre>\nReserveFile &quot;test.ini&quot;\nReserveFile &quot;${NSISDIR}\\Plugins\\InstallOptions.dll&quot;\n</pre>\n    </div>\n    <h2>\n        Fonts and colors</h2>\n    <div>\n        <p>\n            To customize fonts or colors on InstallOptions dialogs, the INSTALLOPTIONS_INITDIALOG\n            and INSTALLOPTIONS_SHOW macro can be used.</p>\n        <p>\n            INSTALLOPTIONS_INITDIALOG creates the dialog in memory, but does not show it. After\n            inserting this macro, you can set the fonts and colors, and then insert INSTALLOPTIONS_SHOW\n            to show the dialog.</p>\n        <p>\n            The INSTALLOPTIONS_INITDIALOG macro also pushes the HWND of the custom dialog to\n            the stack. Control HWND's are available for each control in the HWND entry of the\n            corresponding field in the INI file.</p>\n        <p>\n            Example of using a custom font:</p>\n        <pre>\nVar HWND\nVar DLGITEM\nVar FONT\n\nFunction FunctionName ;FunctionName defined with Page command\n\n  !insertmacro INSTALLOPTIONS_INITDIALOG &quot;ioFile.ini&quot;\n  Pop $HWND ;HWND of dialog\n    \n  !insertmacro INSTALLOPTIONS_READ $DLGITEM &quot;ioFile.ini&quot; &quot;Field 1&quot; &quot;HWND&quot;\n    \n  ;$DLGITEM contains the HWND of the first field\n  CreateFont $FONT &quot;Tahoma&quot; 10 700 \n  SendMessage $DLGITEM ${WM_SETFONT} $FONT 0\n        \n  !insertmacro INSTALLOPTIONS_SHOW\n\nFunctionEnd\n</pre>\n    </div>\n    <h2>\n        Credits</h2>\n    <div>\n        <p>\n            Original version by Michael Bishop<br />\n            DLL version by Nullsoft, Inc.<br />\n            DLL version 2 by Amir Szekely, ORTIM, Joost Verburg<br />\n            New documentation by Joost Verburg</p>\n    </div>\n    <h2>\n        License</h2>\n    <div>\n        <pre>\nOriginal version Copyright &copy; 2001 Michael Bishop\nDLL version 1 Copyright &copy; 2001-2002 Nullsoft, Inc., ORTIM\nDLL version 2 Copyright &copy; 2003-2009 Amir Szekely, Joost Verburg, Dave Laundon\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented;\n   you must not claim that you wrote the original software.\n   If you use this software in a product, an acknowledgment in the\n   product documentation would be appreciated but is not required.\n2. Altered versions must be plainly marked as such,\n   and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any distribution.\n</pre>\n    </div>\n    </div> </td> </tr> </table>\n</body>\n</html>\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/Math/Math.txt",
    "content": "Math::Script NSIS plugin.\n\nC-like style scripting (operators at least).\nTip1: plugin watches the case of the letters.\nTip2: plugin makes almost no error checks. So YOU should check your script\ntwice before run :)\n\nNew HOW TO USE: run the MathTest.Exe, and try yourself. After spending \nsome minutes your should be able to write your script by yourself.\nTo include it to your NSIS script just insert that: \n        Math::Script \"YourScript1\"\n        Math::Script \"YourScript2\"\n        Math::Script \"YourScriptFinal\"\n\nHow to use it? Simple:\n        Strcpy $0 \"Brainsucker\"\n        Math::Script \"a = 'Math'; B = 'Script'; r0 += ' wants to use ' + a + '::' + b +'!'\"\n        DetailPrint \"$0\"\nThat string will fill r0 with some shit. \n\nHere are some other samples:\n        10! (factorial, r0 will contain '10! = 362880'):\n                r0 = '10! = ' + (1*2*3*4*5*6*7*8*9)\n        the same:\n                a = b = 1; #{++a <= 10, b = b*a}; r0 = (a-1) + '! = ' + b\n        Some floating point:\n                Strcpy $R0 \"1e1\"\n                Math::Script \"pi = 3.14159; R1 = 2*pi*R0; r0 = 'Length of circle with radius ' + R0 + ' is equal to ' + R1 + '.'\"\n                Detailprint \"$0\"        \n\nOk. Variables. \nNSIS: r0-r9 -> $0-$9. R0-R9 -> $R0-$R9. \nAlso CL ($CMDLINE), ID ($INSTDIR), OD ($OUTDIR), LG ($LANG), ED ($EXEDIR).\nUser definable: name starting from character, up to 28 letters long.\n\nStacks. Two stacks are supported: NSIS stack and plugin's own stack. I see no \nreasons for using plugin stack, but if you will, remember - the plugin stores\nvariables used at function to that stack before function execution, and restores\nafter execution. Even less I recommend you to use NSIS stack. You should use it\nonly for input/output.\nHow to use? It's variable styled. Plugins stack is associated with S variable,\nand NSIS stack associated with NS variable. To push to stack just do \"S=0\" or\n\"NS=0\", to pop from stack \"a=S\" or \"b=NS\". Combined operations supported too: \n\"S += 1.5\" will increment value at the top of stack by 1.5.\n\nSupported types: int (in fact that is __int64), float (double in fact),\nstring.\nInt: just numbers, may include sign.\nFloat: -123.456, 123.456e-78, 123e-45\nString: something in quotes (\"\", '', ``).\n\nThere is also an array type. It is actually a reference type, so if b is array\nand you will perform \"a=b\", the a and b will reference a single array.\nTo create a copy of array, use ca func: dest = ca(source). Btw - you couldn't\ncontrol dimensions of arrays - they are autosized.\nTo declare array:\na = {};\nTo declare array and initialize some items with values:\n{\"Hello!\", \"Use\", \"mixed types\", 1.01e23, \"like that\" ,1234};\nTo access array:\na[index] = \"Cool\";\n\nAlso [] operation could be used to strings. str[x] gives you a single char with\nindex x (zero-based) as new string. str[-x] - the same, but x counts from the\nstring end (so the last char is -1). str[x,y] gives you characters in range x-y\n(inclusive), both x and y could be <0 - in this case they counted from the end\nof the string.\n\nThe function could be useful - is conversion of arrays to strings and back.\nExample:\na = a(\"Hello\"); str = s(a);\nAfter running such script array a will contain 6 integers (chars and last zero \n- end of string), and str will contain your string back.\n\nOperators (some binary, some unary):\n>>= <<= -= += /= *= |= &= ^= %= -- ++ >> << && || <= =< >= => != ==\n= + - * / % < > & | ^ ~ !\nOnly some are applicable to float (logic & arithmetic) and string (+ and logic) \nof course. \nAdditional case: reference/de-reference operators (& and *). & will\ngive you the reference to argument which should be a variable (NSIS, user, array\nitem, stack), and * will convert it back to original variable. For example \n(a=&b; *a=10) will set b to 10. Expression (*&a) is equal to simple (a).\n\nScript is set of expressions (mathematical in general) delimited with ';'.\nProcessing is mathematically right (2+2*2 will give 6), operations are performed\nin a C like order (precedence).\n\nFlow control:\n        if-then-else like:      #[if-expression, then-expr, else-expr]\n                example:\n                        #[a==0, b=1; c=2, b *= (--c); c/=10]               \n                C eq:\n                        if (a==0) { b=1; c=2;} else { b*=(c++);c-=10; }\n        while (expr) do; like   #{expr, do}\n                example:\n                        #{(c<1.1e25)&&(b < 10), b++; c*=1.23}\n                C eq:\n                        while ((c<1.1e25)&&(b<10)) { b++; c*=1.23; }\n\nWATCH OUT! Comma (,) separates if-expr, then-expr, and else-expr from each \nother. All sub-expressions separated by (;) are the part of one expression,\nand the result of the last one of these sub-exprs gives you the result of \nexpression.\n\nAll the shit (like variables and functions) will be saved between calls.\n\nFunctions:\n        type conversions:\n                l(string)       returns the length of string or array argument\n                s(source)       converts source to string type\n                i(source)       converts source to int type\n                f(source)       converts source to float type\n                c(source)       if source is string, returns int value of first\n                        char, if source is int, returns string which consists\n                        of a single char (source) (+0 terminator).\n                a(source)       converts source to array (only string supported)\n                ff(float, format)       converts float to string, with format\n                                        options.\n                        options = precision + flags.\n                        Precision shows how many digits after decimal point\n                        will be shown. Flags:\n                                16 (or 0x10) - No Exponential View \n                                        (number will be shown as 123.123)\n                                32 (or 0x20) - Only exponential view\n                                        (number will be shown as 123.12e123)\n                                64 (or 0x40) - use 'E' character instead of 'e' \n                        By default the plugin decides itself how to show your\n                        number.\n\n        math (description of all these functions is available at MSDN, use the\n            second given name for search):\n                sin(x),         sin     Sine of argument\n                cos(x),         cos     Cosine of argument\n                cel(x),         ceil    Ceil of argument (no fract. part) \n                csh(x),         cosh    Hyperbolic Cosine of Argument        \n                exp(x),         exp     Exponential\n                abs(x),         abs     Absolute value (warning: float)\n                flr(x),         floor   Floor of argument (no fract. part) \n                asn(x),         asin    ArcSine of argument\n                acs(x),         acos    ArcCosine of argument\n                atn(x),         atan    ArcTangent of argument\n                ln(x),          log     Exponential Logarithm\n                log(x),         log10   Decimal logarithm\n                snh(x),         sinh    Hyperbolic Sine of Argument\n                sqt(x),         sqrt    Square root of argument\n                tan(x),         tan     Tangent of argument\n                tnh(x),         tanh    Hyperbolic tangent  of argument\n\n          functions taking two arguments\n                at2(x, y)       atan2    Arctangent of the value (y/x)\n                pow(x, y)       pow      power, x^y\n                fmd(x, y)       fmod     floating point remainder\n                fex(x, o)       frexp    Gets the mantissa (result = r) \n                                        and exponent (o) of floating-point \n                                        number (x): x = r*(2^o)\n                mdf(x, o)       modf    Splits a floating-point value into \n                                        fractional and integer parts.\n\nUser-defined functions.\nIt's very simple. Example:\n        test(a,b) (a+b);\nAfter that test(1,2) will give you 3. \n        test2(a,b) (a=a+b; b *= a);\nThe result of function is always the result of last expression.\nAs said before it better not to use stack (S) in between function calls.\nIt will be better to develop variable-safe functions, i.e. functions which will\nnot corrupt variables. For this you should either push/pop them to stack, or\ndeclare as additional arguments, which will never be used. Example:\n        test3(a,b,c) (c=10; #{--c > 0, a=sqrt(a*b)}; a)\nNo matter how many arguments will be passed to function, the values of all three \nvars (a,b,c) will be saved. \nSuch variable-safe functions could be recursive:\n        Math::Script 'rec(a) (#[a > 0, rec(a-1), 0]+a);'\n        Math::Script 'R1 = rec(10)'\nwill set R1 to right result 55.\nSometimes functions will need to return more than one value, in this case you\ncould declare argument as referent (b at example):\n        test4(a, &b) (*b = a*a; a*a*a)\nIn this case test4 will return a^3, and if we will call it like that test4(a,c),\nit will place a^2 to c. BUT! Note: you should use de-referencer (*) with variable,\nat example *b. CAUTION: never use the same variable as function internal reference\nvariable and external argument variable (for example test4(a,b)). It will surely \nfail. Also: if you declared argument as reference - you should never supply\na constant expression to it. It could be either array item (array[1]), NSIS\nregister R0, any of the user variables (beside the variable with the same name:), \nbut never the constant.\n\nAnother may-be-useful possibility is to redeclare the function (the usual \ndeclaration at the time when function already defined will simply call that\nfunction). For such task you could use \"#name\", like \"func()(1); #func()(2);\".\nBut beware, function declaration occurs at time of parsing, so it's not possible\nto perform flow controlled declaration. \nSUCH IS NOT POSSIBLE: \"#[a<0, #func()(1), #func()(2)]\"\nIT WILL SIMPLY DEFINE #func as (2), as the latest variant.\n        \n(c) Nik Medved (brainsucker)"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/Modern UI/Changelog.txt",
    "content": "NSIS Modern User Interface\nVersion History\n\n1.8 - August 9, 2007\n* Uses the new language files\n* Updated documentation\n* Although MUI_DIRECTORYPAGE_BGCOLOR and MUI_STARTMENUPAGE_BGCOLOR are documented as interface\n  setttings that apply to every directory page or Start Menu folder page, they were actually\n  implemented as page specific settings. They have been changed to interface settings.\n* MUI_LANGDLL_DISPLAY now also reads a previously saved language from the registry if the\n  installation is silent.\n* InstallOptions macros have been moved to a separate header file (InstallOptions.nsh).\n  The MUI_INSTALLOPTIONS_* macros are still provided for backwards compatibility and insert the\n  equalivent INSTALLOPTIONS_* macros.\n* Added MUI_CUSTOMFUNCTION_MOUSEOVERSECTION\n\n1.78 - June 8, 2007\n* Added MUI_STARTMENUPAGE_BGCOLOR\n* Added MUI_DIRECTORYPAGE_BGCOLOR\n* Added MUI_LANGDLL_ALLLANGUAGES\n\n1.77 - April 27, 2007\n* Added MUI_FINISHPAGE_CANCEL_ENABLED\n* Added MUI_FINISHPAGE_REBOOTLATER_DEFAULT\n* Block unsupported languages in the language selection dialog\n* Cancel button no longer enabled by default on the finish page\n* Reduced flicker caused by MUI_HEADER_TRANSPARENT_TEXT\n\n1.76 - September 23, 2006\n* Added MUI_ABORTWARNING_CANCEL_DEFAULT\n\n1.75 - April 1, 2006\n* Added show function for the start menu page\n* Added MUI_HEADER_TRANSPARENT_TEXT for transparent header texts\n\n1.74 - September 4, 2005\n* Fixed compile error when checkboxes are used on multiple finish page pages\n\n1.73 - August 6, 2005\n* The checkboxes to run an application or show a Readme file can now also be used on an uninstaller\n  finish pages or multiple finish pages\n\n1.72 - November 27, 2004\n* Fixed state of Finish page Cancel button when both an installer and uninstaller page is included\n\n1.71 - October 14, 2004\n* The selected language is only stored in the registry when installation was successful\n\n1.70 - February 6, 2004\n* Improved documentation\n* New Init custom function for Welcome and Finish page\n\n1.69 - January 7, 2004\n* All uninstaller pages work without installer pages\n* Fixed top text on uninstaller license page\n\n1.68 - November 24, 2003\n* New settings for extra space for title and text on Welcome and Finish page.\n* Improved handling of verbose settings. Define MUI_VERBOSE the set the Modern UI verbose level (1-4).\n* Language file string for uninstaller reboot information\n* Setting for folder validation in leave function\n* Fixed finish page text settings for multiple pages\n\n1.67 - November 18, 2003\n* Support for uninstaller Welcome pages and Finish pages\n* Improved and changed text settings\n* ID for Start Menu Folder pages, easier to use multiple pages\n* Renamed a few settings\n* Default header image\n* Support for uninstaller abort warning\n* Setting for 3 line text on Welcome and Finish page\n  (NOTE: New settings have been introduced in version 1.68)\n* Langauge file backwards compatibility: English for missing strings\n* Support for different uninstaller header image\n* Language selection dialog not displayed if installer is silent\n* Cancel button on Finish page when there are options\n* Full RTL support\n\n1.66 - October 7, 2003\n* New system for page settings and custom pages\n* Support for uninstaller components page\n* Support for multiple pages of the same type\n* New position for interface settings\n* Changed macro and setting names\n* Updated langauge system, new language files and settings\n* Removed MUI_BRANDINGTEXT. You can use the standard BrandingText instruction.\n* Removed MUI_PRODUCT and MUI VERSION. You can use the standard Name instruction.\n\n1.65 - July 16, 2003\n* New page configuration system, no different system for installers with custom pages\n* Default windows color for the license text background\n* Example script updates (new format, user variables)\n* Improved registry storage for Start Menu folder\n* ReserveFile macro for StartMenu plug-in\n* Option to always show the language selection dialog (even if a language has been stored in the registry)\n* Checkboxes on Finish page can be used to call a function\n* Support for custom leave functions for Start Menu Folder, Welcome and Finish pages\n* Support for a link on the Finish page\n* New macro to get Start Menu folder in uninstaller\n* Options to disable bitmap stretching\n* Components page description box info text: always displayed\n  when mouse is outside box, disabled style\n\n1.64 - April 27, 2003\n* Support for license page with checkbox or radiobuttons to let the user accept the agreement or not\n* Macros for finish headers don't have to be inserted anymore\n* Language preference stored when installation has completed, no problems anymore when the users selects the wrong language\n* Header text for aborted installation\n* New macros: get language for uninstaller, delete shortcuts\n* Language specific fonts\n* Welcome/Finish page INI files can be modified in pre functions\n* More texts can be customized\n\n1.63 - March 9, 2003\n* Support for a bitmap in the wizard header\n* New defines to change the components page interface\n* MUI_SYSTEM inserted automatically\n* Single macro for language selection dialog\n* Removed page description in window title\n* Easier to customize resource files\n* New system for custom functions\n* Start Menu folder registry key automatically written\n* New InstallOptions macros that do not remove the return value from the stack\n* Support for custom pages before the finish page\n* Renamed Start Menu page defines\n* 'Do not create shortcuts' checkbox can be removed\n* 'MS Shell Dlg' font for header title\n* RTL support\n* Documentation updates\n* Minor fixes\n\n1.62 - February 2, 2003\n* New language strings for Finish page\n* Possibility to let a Modern UI Function call your own function\n* No problems anymore when using both 'Run program' and 'Show Readme' on the Finish page\n* Default state of checkboxes on the finish page can be changed\n* Welcome / Finish page compatible with custom DPI settings\n* Converted Install Options INI files to use dialog units\n* More ReserveFile macros\n  (NOTE: Some of these macros have been removed in later versions)\n* Background color can be changed with a define\n* Support for multilingual branding texts\n* Start Menu / Finish page window titles also work when using custom page commands\n* Language files should be inserted after inserting the MUI_SYSTEM macro\n  (NOTE: The MUI_SYSTEM macro has been removed in version 1.63)\n* Define MUI_MANUALVERBOSE if you don't want the Modern UI to change the verbose settings during compilation\n  (NOTE: This setting has been changed in version 1.68)\n    \n1.61 - December 5, 2002\n* modern3.exe UI without description area\n  (NOTE: This setting has been changed in version 1.63)\n* Added define to show uninstall confirm page\n* Added language string for finish page title and continue to uninstall\n* Define for parameters for the application to run on the finish page\n* Minor fixes\n\n1.6 - November 18, 2002\n* Welcome / Finish page\n* Automatic ask for reboot on finish page\n* Create no shortcut option on the Start Menu Folder selection page\n* Customizing GUIInit functions easier\n* Minor font / UI changes\n\n1.5 - November 11, 2002\n* New language file format\n* Language strings can be changed in the script without editing languagefiles\n* Start Menu Folder selection page\n* 'Click Next to continue' and 'Click Install to start the installation' texts automatically change to the page order\n* Install Options macros updated. MUI_INSTALLOPTIONS_DISPLAY is the standard macro now.\n  Use MUI_INSTALLOPTIONS_INITDIALOG and MUI_INSTALLOPTIONS_SHOW if you want to customize dialog controls.\n* No more writing window titles & abort warnings to Install Options INI Files\n* Compatible with updated paging system\n* Renamed macros and defines\n* Minor fixes\n\n1.4 - November 4, 2002\n* Uses new NSIS Page command\n* Macro System updates (smaller)\n* Macro System a lot easier\n* Modern UI Language Files load NLF language files\n* Renamed macros and defines\n\n1.3 - October 27, 2002\n* Easier macro system for basic scripts\n* New MultiLanguage system using Modern UI Language Files\n* New directory structure (header/language files in Contrib\\Modern UI)\n* Small bugfixes & typo corrections\n* SetPage function should be set using defines\n* Different NextPage/PrevPage/FinishHeader macros for install/uninstall\n  (NOTE: These macros have been removed in version 1.4)\n* Interface settings can be definend (for example, MUI_ICON), no parameters for MUI_INTERFACE anymore\n* New Install Options macros to read/write IO INI file value\n\n1.21 - September 30, 2002\n* Temp vars set in Modern UI header\n* Currentpage & Install Options vars should be set using\n  parameters of the MUI_INTERFACE and * MUI_INSTALLOPTIONS macros\n  (NOTE: The MUI_INTERFACE macro has been removed in version 1.3)\n* MultiLanguage.nsi uses the new language strings\n\n1.2 - September 22, 2002\n  (NOTE: All macros mentioned here have been removed in version 1.4)\n  \n* Lots of macro system updates & fixes\n* InstallOptions support in macro system\n* Added Modern UI + InstallOptions example (InstallOptions.nsi)\n* MUI_NEXTPAGE_OUTER integrated in MUI_NEXTPAGE\n* No hard-coded function names anymore (you should give\n  MUI_PREVPAGE a parameter with the set page function name\n  (for example, MUI_PREVPAGE SetPage)\n* Examples use ReserveFile for faster startup\n\n1.19 - Semtember 19, 2002\n* Renamed some macros\n* Custom code can be used between page start/stop macros\n  (NOTE: These macros have been removed in version 1.4)\n\n1.18 - Semtember 13, 2002\n* Uses the new Sendmessage string option\n\n1.17 - Semtember 10, 2002\n* Win9x font weight bug fixed (font of title in white rect)\n\n1.16 - Semtember 6, 2002\n* Change text 'Scroll down' on license page to 'Press Page Down',\n  because the RichEdit control has focus by default now\n\n1.15 - Semtember 4, 2002\n* Multilanguage example: changed LangDialog to LangDLL::LangDialog (using the DLL name is now required)\n  (NOTE: A new macro for the language selection dialog has been introduced in version 1.63)\n\n1.14 - Semtember 3, 2002\n* Small grammar fix (thanks eccles)\n* UI files updated by Justin for better RichEdit usage\n\n1.13 - Semtember 2, 2002\n* Added 16 color icons \n\n1.12 - August 30, 2002\n* Verifying installer & Unpacking data dialog has no titlebar anymore\n\n1.11 - August 29, 2002\n* Finish header for uninstaller can also be set using MUI_FINISHHEADER\n  (NOTE: The MUI_FINISHHEADER macro has been removed in version 1.64)\n\n1.1 - August 29, 2002\n  (NOTE: All settings mentioned here do not exist anymore)\n\n* Header file with macros, it's now very easy to use the UI in your scripts\n* Added the modern2.exe UI, with an other location of the Description frame, for installers with a lot of subsections (thanks rainwater)\n* Updated example scripts\n* Added Multilanguage.nsi example (Multilanguage & LangDLL)\n* Fixed background color issue with some custom XP themes\n* Removed WS_VISIBLE from black rect for inner dialog (fixes display issues)\n* Changed size of description area\n* Example script: Added instructions for the user on the Description frame\n* Auto sizing branding text\n* Used modern.bmp for the checks (thanks rainwater)\n* Using the new NSIS version, descriptions work using the keyboard and you can give descriptions to subsections\n* Correct font size using High-DPI fonts\n\n1.0 - August 26, 2002\n* Initial release"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/Modern UI/License.txt",
    "content": "Copyright 2002-2009 Joost Verburg\n\nThis software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software.\n   If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any distribution.\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/Modern UI/Readme.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <title>NSIS Modern User Interface - Documentation</title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\" />\n    <style type=\"text/css\">\n        /*<![CDATA[*/body\n        {\n            padding: 10px;\n            background-color: #F0F0F0;\n            font-size: 13px;\n            font-family: Verdana, Arial, Helvetica, sans-serif;\n            font-weight: normal;\n            text-align: justify;\n        }\n        p, li\n        {\n            font-size: 13px;\n        }\n        table\n        {\n            margin: auto;\n            background-color: #FFFFFF;\n        }\n        .maintable\n        {\n            border: 2px solid #376EAB;\n        }\n        .parameter\n        {\n            font-weight: bold;\n            color: #6586AC;\n        }\n        h1\n        {\n            font-size: 20px;\n            color: #7A7272;\n            font-weight: normal;\n        }\n        h2\n        {\n            font-size: 17px;\n            font-weight: bold;\n            color: #303030;\n        }\n        h3\n        {\n            font-size: 14px;\n            font-weight: bold;\n            color: #2B5885;\n        }\n        pre\n        {\n            font-size: 13px;\n        }\n        div\n        {\n            margin: 20px;\n        }\n        div.settings\n        {\n            margin-right: 0;\n        }\n        a:link, a:visited, a:active\n        {\n            color: #294F75;\n            text-decoration: none;\n        }\n        a:hover\n        {\n            color: #182634;\n            text-decoration: underline;\n        }\n        .trigger\n        {\n            cursor: pointer;\n            cursor: hand;\n            height: 14px;\n        }\n        .toggle\n        {\n            display: none;\n        }\n        .options\n        {\n            text-align: center;\n            cursor: pointer;\n            cursor: hand;\n            color: #294F75;\n        }\n        /*]]>*/</style>\n\n    <script type=\"text/javascript\">\n//<![CDATA[\n\n   var image_open = new Image();\n   image_open.src = \"images/open.gif\";\n   var image_closed = new Image();\n   image_closed.src = \"images/closed.gif\";\n   \n   function toggle(image, section) {\n   \n      if(document.all) {\n        if(document.all[section].style.display == \"block\") {\n           document.all[section].style.display = \"none\";\n           document.all[image].src = image_closed.src;\n        }\n        else\n        {              \n           document.all[section].style.display = \"block\";\n           document.all[image].src = image_open.src;\n        }\n      }\n      else\n      {\n      if(document.getElementById(section).style.display == \"block\") {\n         document.getElementById(section).style.display = \"none\";\n         document.getElementById(image).src = image_closed.src;\n         }\n      else\n         {              \n         document.getElementById(section).style.display = \"block\";\n         document.getElementById(image).src = image_open.src;\n         }\n      }\n   \n   }\n\n   function expandall() {\n\n     var divNodeList = document.getElementsByTagName('div'); \n     for (i = 0; i < divNodeList.length; i++) { \n        if(divNodeList[i].id) {\n           divNodeList[i].style.display = \"block\";\n           document.getElementById('trigger_' + divNodeList[i].id.substr(7)).src = \"images/open.gif\";\n        }\n     }\n     \n   }\n\n   function collapseall() {\n\n     var divNodeList = document.getElementsByTagName('div'); \n     for (i = 0; i < divNodeList.length; i++) { \n        if(divNodeList[i].id) {\n           divNodeList[i].style.display = \"none\";\n           document.getElementById('trigger_' + divNodeList[i].id.substr(7)).src = \"images/closed.gif\";\n        }\n     }\n\n   }\n\n//]]>\n    </script>\n\n</head>\n<body>\n    <table width=\"750\" class=\"maintable\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n        <tr>\n            <td>\n                <img src=\"images/header.gif\" width=\"750\" height=\"80\" alt=\"\" />\n                <p class=\"options\">\n                    <a onclick=\"expandall()\">[Expand all]</a>&nbsp; &nbsp;<a onclick=\"collapseall()\">[Collapse\n                        all]</a></p>\n                <div>\n                    <h1>\n                        Introduction</h1>\n                    <div>\n                        <p>\n                            The Modern UI provides a user interface for NSIS installers with a modern wizard\n                            style, similar to the wizards of recent Windows versions. It is based on the basic\n                            user interface that is provided by the NSIS compiler itself and extends it with\n                            more interface features and pages.</p>\n                        <p>\n                            All standard NSIS pages (such as the pages to select components and the installation\n                            folder) are supported as well as a number of additional pages. The welcome page\n                            allows you to provide an introduction to the installation process, while the finish\n                            page provides a way to let the user decide what steps should be performed after\n                            the setup wizard is closed (for example, whether the application should be started\n                            immediately). A finish page can also be used to ask for a system restart is necessary.</p>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_scr\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_scr', 'toggle_scr');\" />\n                            Screenshots</h3>\n                        <div class=\"toggle\" id=\"toggle_scr\">\n                            <p>\n                                <img src=\"images/screen1.png\" width=\"503\" height=\"393\" alt=\"\" /></p>\n                            <p>\n                                <img src=\"images/screen2.png\" width=\"503\" height=\"393\" alt=\"\" /></p>\n                        </div>\n                    </div>\n                    <h1>\n                        Script header</h1>\n                    <div>\n                        <p>\n                            The settings for the Modern UI should be inserted in the header of the script file.\n                            It&#39;s important to follow the same order as the items below.&nbsp;For example,\n                            interface settings should be defined before you insert pages, because the pages\n                            depend on the interface configuration. It may be useful to look at the <a href=\"#examples\">\n                                example scripts</a> too see how this is done in actual script files.</p>\n                        <p>\n                            Parameters are given in this format: <span class=\"parameter\">required (option1 | option2)\n                                [optional]</span></p>\n                        <h2>\n                            1. Header file</h2>\n                        <div>\n                            <p>\n                                First of all, add this line to the top of script to include the Modern UI:</p>\n                            <pre>\n!include &quot;MUI.nsh&quot;\n</pre>\n                        </div>\n                        <h2>\n                            2. Interface configuration</h2>\n                        <div>\n                            <p>\n                                Then, you may want to use interface settings to change the look and feel of the\n                                installer. These settings apply to all pages.<p>\n                                    The interface settings provided by the NSIS compiler itself (such as LicenseText,\n                                    Icon, CheckBitmap, InstallColors) should not be used in Modern UI scripts. The Modern\n                                    UI provides equalivent or extended versions of these settings.<p>\n                                        Examples:</p>\n                                    <pre>\n!define MUI_COMPONENTSPAGE_SMALLDESC ;No value\n!define MUI_UI &quot;myUI.exe&quot; ;Value\n!define MUI_INSTFILESPAGE_COLORS &quot;FFFFFF 000000&quot; ;Two colors\n</pre>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_in\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_in', 'toggle_in');\" />\n                                        Interface settings</h3>\n                                    <div class=\"toggle\" id=\"toggle_in\">\n                                        <h3>\n                                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_ingen\" src=\"images/closed.gif\"\n                                                onclick=\"toggle('trigger_ingen', 'toggle_ingen');\" />\n                                            Page header</h3>\n                                        <div class=\"toggle\" id=\"toggle_ingen\">\n                                            <p>\n                                                <strong>MUI_ICON</strong> <span class=\"parameter\">icon_file</span><br />\n                                                The icon for the installer.<br />\n                                                <em>Default: ${NSISDIR}\\Contrib\\Graphics\\Icons\\modern-install.ico</em></p>\n                                            <p>\n                                                <strong>MUI_UNICON</strong> <span class=\"parameter\">icon_file</span><br />\n                                                The icon for the uninstaller.<br />\n                                                <em>Default: ${NSISDIR}\\Contrib\\Graphics\\Icons\\modern-uninstall.ico</em></p>\n                                            <p>\n                                                <strong>MUI_HEADERIMAGE</strong><br />\n                                                Display an image on the header of the page.</p>\n                                            <div class=\"settings\">\n                                                <p>\n                                                    <strong>MUI_HEADERIMAGE_BITMAP</strong> <span class=\"parameter\">bmp_file</span><br />\n                                                    Bitmap image to display on the header of installers pages (recommended size: 150x57\n                                                    pixels).<br />\n                                                    <em>Default: ${NSISDIR}\\Contrib\\Graphics\\Header\\nsis.bmp</em></p>\n                                                <div class=\"settings\">\n                                                    <p>\n                                                        <strong>MUI_HEADERIMAGE_BITMAP_NOSTRETCH</strong><br />\n                                                        Do not stretch the installer header bitmap to fit the size of the field. Use this\n                                                        option only if you have an image that does not use the whole space. If you have\n                                                        a full size bitmap that fits exactly, you should not use this option because the\n                                                        size of the field will be different if the user has a custom DPI setting.</p>\n                                                    <p>\n                                                        <strong>MUI_HEADERIMAGE_BITMAP_RTL</strong> <span class=\"parameter\">bmp_file</span><br />\n                                                        Bitmap image to display on the header of installers pages when using a RTL language\n                                                        (recommended size: 150x57 pixels).<br />\n                                                        <em>Default: Non-RTL bitmap</em></p>\n                                                    <div class=\"settings\">\n                                                        <p>\n                                                            <strong>MUI_HEADERIMAGE_BITMAP_RTL_NOSTRETCH</strong><br />\n                                                            Do not stretch the installer header bitmap when using a RTL language to fit the\n                                                            size of the field. Use this option only if you have an image that does not use the\n                                                            whole space. If you have a full size bitmap that fits exactly, you should not use\n                                                            this option because the size of the field will be different if the user has a custom\n                                                            DPI setting.</p>\n                                                    </div>\n                                                </div>\n                                                <p>\n                                                    <strong>MUI_HEADERIMAGE_UNBITMAP</strong> <span class=\"parameter\">bmp_file</span><br />\n                                                    Bitmap image to display on the header of uninstaller pages (recommended size: 150x57\n                                                    pixels).<br />\n                                                    <em>Default: Installer header bitmap</em></p>\n                                                <div class=\"settings\">\n                                                    <p>\n                                                        <strong>MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH</strong><br />\n                                                        Do not stretch the uninstaller header bitmap to fit the size of the field. Use this\n                                                        option only if you have an image that does not use the whole space. If you have\n                                                        a full size bitmap that fits exactly, you should not use this option because the\n                                                        size of the field will be different if the user has a custom DPI setting.</p>\n                                                    <p>\n                                                        <strong>MUI_HEADERIMAGE_UNBITMAP_RTL</strong> <span class=\"parameter\">bmp_file</span><br />\n                                                        Bitmap image to display on the header of uninstallers pages when using a RTL language\n                                                        (recommended size: 150x57 pixels).<br />\n                                                        <em>Default: Installer RTL header bitmap</em></p>\n                                                    <div class=\"settings\">\n                                                        <p>\n                                                            <strong>MUI_HEADERIMAGE_UNBITMAP_RTL_NOSTRETCH</strong><br />\n                                                            Do not stretch the uninstaller header bitmap when using a RTL language to fit the\n                                                            size of the field. Use this option only if you have an image that does not use the\n                                                            whole space. If you have a full size bitmap that fits exactly, you should not use\n                                                            this option because the size of the field will be different if the user has a custom\n                                                            DPI setting.</p>\n                                                    </div>\n                                                </div>\n                                                <p>\n                                                    <strong>MUI_HEADERIMAGE_RIGHT</strong><br />\n                                                    Display the header image on the right side instead of the left side (when using\n                                                    a RTL language it will be displayed on the left side instead of the right side).</p>\n                                            </div>\n                                            <p>\n                                                <strong>MUI_BGCOLOR</strong> <span class=\"parameter\">(color: RRGGBBR hexadecimal)</span><br />\n                                                Background color for the header, the Welcome page and the Finish page.<br />\n                                                <em>Default: FFFFFF</em></p>\n                                            <p>\n                                                <strong>MUI_HEADER_TRANSPARENT_TEXT</strong><br />\n                                                Set a transparent background for the header's label controls. Useful for custom\n                                                user interfaces that set a bigger header image.</p>\n                                        </div>\n                                        <h3>\n                                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inres\" src=\"images/closed.gif\"\n                                                onclick=\"toggle('trigger_inres', 'toggle_inres');\" />\n                                            Interface resources</h3>\n                                        <div class=\"toggle\" id=\"toggle_inres\">\n                                            <p>\n                                                <strong>MUI_UI</strong> <span class=\"parameter\">ui_file</span><br />\n                                                The interface file with the dialog resources. Change this if you have made your\n                                                own customized UI.<br />\n                                                <em>Default: ${NSISDIR}\\Contrib\\UIs\\modern.exe</em></p>\n                                            <p>\n                                                <strong>MUI_UI_HEADERIMAGE</strong> <span class=\"parameter\">ui_file</span><br />\n                                                The interface files with the dialog resource IDD_INST that contains a bitmap control\n                                                and space for the header bitmap.<br />\n                                                <em>Default: ${NSISDIR}\\Contrib\\UIs\\modern_headerbmp.exe</em></p>\n                                            <p>\n                                                <strong>MUI_UI_HEADERIMAGE_RIGHT</strong> <span class=\"parameter\">ui_file</span><br />\n                                                The interface files with the dialog resource IDD_INST that contains a bitmap control\n                                                and space for the header bitmap on the right side.<br />\n                                                <em>Default: ${NSISDIR}\\Contrib\\UIs\\modern_headerbmpr.exe</em></p>\n                                            <p>\n                                                <strong>MUI_UI_COMPONENTSPAGE_SMALLDESC</strong> <span class=\"parameter\">ui_file</span><br />\n                                                The interface files with a customized dialog resource IDD_SELCOM with a small description\n                                                area.<br />\n                                                <em>Default: ${NSISDIR}\\Contrib\\UIs\\modern_smalldesc.exe</em></p>\n                                            <p>\n                                                <strong>MUI_UI_COMPONENTSPAGE_NODESC</strong> <span class=\"parameter\">ui_file</span><br />\n                                                The interface files with a customized dialog resource IDD_SELCOM without a description\n                                                area.<br />\n                                                <em>Default: ${NSISDIR}\\Contrib\\UIs\\modern_nodesc.exe</em></p>\n                                        </div>\n                                        <h3>\n                                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inwf\" src=\"images/closed.gif\"\n                                                onclick=\"toggle('trigger_inwf', 'toggle_inwf');\" />\n                                            Installer welcome/finish page</h3>\n                                        <div class=\"toggle\" id=\"toggle_inwf\">\n                                            <p>\n                                                <strong>MUI_WELCOMEFINISHPAGE_BITMAP</strong> <span class=\"parameter\">bmp_file</span><br />\n                                                Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).<br />\n                                                <em>Default: ${NSISDIR}\\Contrib\\Graphics\\Wizard\\win.bmp</em></p>\n                                            <div class=\"settings\">\n                                                <p>\n                                                    <strong>MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH</strong><br />\n                                                    Do not stretch the bitmap for the Welcome and Finish page to fit the size of the\n                                                    field. Use this option only if you have an image that does not use the whole space.\n                                                    If you have a full size bitmap that fits exactly, you should not use this option\n                                                    because the size of the field will be different if the user has a custom DPI setting.</p>\n                                            </div>\n                                            <p>\n                                                <strong>MUI_WELCOMEFINISHPAGE_INI</strong> <span class=\"parameter\">ini_file</span><br />\n                                                InstallOptions INI file for the Welcome page and the Finish page.<br />\n                                                <em>Default: ${NSISDIR}\\Contrib\\Modern UI\\ioSpecial.ini</em></p>\n                                        </div>\n                                        <h3>\n                                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inuwf\" src=\"images/closed.gif\"\n                                                onclick=\"toggle('trigger_inuwf', 'toggle_inuwf');\" />\n                                            Uninstaller welcome/finish page</h3>\n                                        <div class=\"toggle\" id=\"toggle_inuwf\">\n                                            <p>\n                                                <strong>MUI_UNWELCOMEFINISHPAGE_BITMAP</strong> <span class=\"parameter\">bmp_file</span><br />\n                                                Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).<br />\n                                                <em>Default: ${NSISDIR}\\Contrib\\Graphics\\Wizard\\win.bmp</em></p>\n                                            <div class=\"settings\">\n                                                <p>\n                                                    <strong>MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH</strong><br />\n                                                    Do not stretch the bitmap for the Welcome and Finish page to fit the size of the\n                                                    field. Use this option only if you have an image that does not use the whole space.\n                                                    If you have a full size bitmap that fits exactly, you should not use this option\n                                                    because the size of the field will be different if the user has a custom DPI setting.</p>\n                                            </div>\n                                            <p>\n                                                <strong>MUI_UNWELCOMEFINISHPAGE_INI</strong> <span class=\"parameter\">ini_file</span><br />\n                                                InstallOptions INI file for the uninstaller Welcome page and the Finish page.<br />\n                                                <em>Default: ${NSISDIR}\\Contrib\\Modern UI\\ioSpecial.ini</em></p>\n                                        </div>\n                                        <h3>\n                                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inl\" src=\"images/closed.gif\"\n                                                onclick=\"toggle('trigger_inl', 'toggle_inl');\" />\n                                            License page</h3>\n                                        <div class=\"toggle\" id=\"toggle_inl\">\n                                            <p>\n                                                <strong>MUI_LICENSEPAGE_BGCOLOR</strong> <span class=\"parameter\">(/windows | /grey |\n                                                    (color: RRGGBB hexadecimal))</span><br />\n                                                The background color for the license textbox. Use /windows for the Windows text\n                                                background color (usually white). Use the /grey for the window background color\n                                                (usually grey).<br />\n                                                <em>Default: /windows</em></p>\n                                        </div>\n                                        <h3>\n                                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inc\" src=\"images/closed.gif\"\n                                                onclick=\"toggle('trigger_inc', 'toggle_inc');\" />\n                                            Components page</h3>\n                                        <div class=\"toggle\" id=\"toggle_inc\">\n                                            <p>\n                                                <strong>MUI_COMPONENTSPAGE_CHECKBITMAP</strong> <span class=\"parameter\">bitmap_file</span><br />\n                                                The bitmap with images for the checks of the component select treeview.<br />\n                                                <em>Default: ${NSISDIR}\\Contrib\\Graphics\\Checks\\modern.bmp</em></p>\n                                            <p>\n                                                <strong>MUI_COMPONENTSPAGE_SMALLDESC</strong><br />\n                                                A small description area on the bottom of the page. Use this layout if you have\n                                                a lot of sections and don't need large descriptions.</p>\n                                            <p>\n                                                <strong>MUI_COMPONENTSPAGE_NODESC</strong><br />\n                                                No description area.</p>\n                                        </div>\n                                        <h3>\n                                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_ind\" src=\"images/closed.gif\"\n                                                onclick=\"toggle('trigger_ind', 'toggle_ind');\" />\n                                            Directory page</h3>\n                                        <div class=\"toggle\" id=\"toggle_ind\">\n                                            <p>\n                                                <strong>MUI_DIRECTORYPAGE_BGCOLOR</strong> <span class=\"parameter\">(color: RRGGBB hexadecimal)</span><br />\n                                                The background color for the directory textbox.</p>\n                                        </div>\n                                        <h3>\n                                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_ins\" src=\"images/closed.gif\"\n                                                onclick=\"toggle('trigger_ins', 'toggle_ins');\" />\n                                            Start Menu folder page</h3>\n                                        <div class=\"toggle\" id=\"toggle_ins\">\n                                            <p>\n                                                <strong>MUI_STARTMENUPAGE_BGCOLOR</strong> <span class=\"parameter\">(color: RRGGBB hexadecimal)</span><br />\n                                                The background color for the startmenu directory list and textbox.</p>\n                                        </div>\n                                        <h3>\n                                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_ini\" src=\"images/closed.gif\"\n                                                onclick=\"toggle('trigger_ini', 'toggle_ini');\" />\n                                            Installation page</h3>\n                                        <div class=\"toggle\" id=\"toggle_ini\">\n                                            <p>\n                                                <strong>MUI_INSTFILESPAGE_COLORS</strong> <span class=\"parameter\">(/windows | &quot;(foreground\n                                                    color: RRGGBB hexadecimal) (background color: RRGGBB hexadecimal)&quot;)</span><br />\n                                                The colors of the details screen. Use /windows for the default Windows colors.<br />\n                                                <em>Default: /windows</em></p>\n                                            <p>\n                                                <strong>MUI_INSTFILESPAGE_PROGRESSBAR</strong> <span class=\"parameter\">(&quot;&quot;\n                                                    | colored | smooth)</span><br />\n                                                The style of the progress bar. Colored makes it use the MUI_INSTALLCOLORS.<br />\n                                                <em>Default: smooth</em></p>\n                                        </div>\n                                        <h3>\n                                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inf\" src=\"images/closed.gif\"\n                                                onclick=\"toggle('trigger_inf', 'toggle_inf');\" />\n                                            Installer finish page</h3>\n                                        <div class=\"toggle\" id=\"toggle_inf\">\n                                            <p>\n                                                <strong>MUI_FINISHPAGE_NOAUTOCLOSE</strong><br />\n                                                Do not automatically jump to the finish page, to allow the user to check the install\n                                                log.</p>\n                                        </div>\n                                        <h3>\n                                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_uinf\" src=\"images/closed.gif\"\n                                                onclick=\"toggle('trigger_uinf', 'toggle_uinf');\" />\n                                            Uninstaller finish page</h3>\n                                        <div class=\"toggle\" id=\"toggle_uinf\">\n                                            <p>\n                                                <strong>MUI_UNFINISHPAGE_NOAUTOCLOSE</strong><br />\n                                                Do not automatically jump to the finish page, to allow the user to check the uninstall\n                                                log.</p>\n                                        </div>\n                                        <h3>\n                                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inaw\" src=\"images/closed.gif\"\n                                                onclick=\"toggle('trigger_inaw', 'toggle_inaw');\" />\n                                            Abort warning</h3>\n                                        <div class=\"toggle\" id=\"toggle_inaw\">\n                                            <p>\n                                                <strong>MUI_ABORTWARNING</strong><br />\n                                                Show a message box with a warning when the user wants to close the installer.</p>\n                                            <div class=\"settings\">\n                                                <p>\n                                                    <strong>MUI_ABORTWARNING_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                                    Text to display on the abort warning message box.</p>\n                                                <p>\n                                                    <strong>MUI_ABORTWARNING_CANCEL_DEFAULT</strong><br />\n                                                    Set the Cancel button as the default button on the message box.</p>\n                                            </div>\n                                        </div>\n                                        <h3>\n                                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inuaw\" src=\"images/closed.gif\"\n                                                onclick=\"toggle('trigger_inuaw', 'toggle_inuaw');\" />\n                                            Uninstaller abort warning</h3>\n                                        <div class=\"toggle\" id=\"toggle_inuaw\">\n                                            <p>\n                                                <strong>MUI_UNABORTWARNING</strong><br />\n                                                Show a message box with a warning when the user wants to close the uninstaller.</p>\n                                            <div class=\"settings\">\n                                                <p>\n                                                    <strong>MUI_UNABORTWARNING_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                                    Text to display on the abort warning message box.</p>\n                                                <p>\n                                                    <strong>MUI_UNABORTWARNING_CANCEL_DEFAULT</strong><br />\n                                                    Set the Cancel button as the default button on the message box.</p>\n                                            </div>\n                                        </div>\n                                    </div>\n                        </div>\n                        <h2>\n                            3. Pages</h2>\n                        <div>\n                            <p>\n                                Insert the following macros to set the pages you want to use. The pages will appear\n                                in the order in which you insert them in the script. You can also insert custom\n                                Page commands between the macros to add custom pages.</p>\n                            <p>\n                                You can add multiple pages of certain types (for example, if you want the user to\n                                specify multiple folders).</p>\n                            <p>\n                                Examples:</p>\n                            <pre>\n!insertmacro MUI_PAGE_LICENSE &quot;License.rtf&quot;\n!insertmacro MUI_PAGE_COMPONENTS\n\nVar StartMenuFolder\n!insertmacro MUI_PAGE_STARTMENU &quot;Application&quot; $StartMenuFolder\n</pre>\n                            <p>\n                                You will need the page ID for the Start Menu folder page when using the Start Menu\n                                folder macros. The folder will be stored in the specified variable.</p>\n                            <p>\n                                <strong>Installer pages</strong><br />\n                                MUI_PAGE_WELCOME<br />\n                                MUI_PAGE_LICENSE <span class=\"parameter\">textfile</span><br />\n                                MUI_PAGE_COMPONENTS<br />\n                                MUI_PAGE_DIRECTORY<br />\n                                MUI_PAGE_STARTMENU <span class=\"parameter\">pageid variable</span><br />\n                                MUI_PAGE_INSTFILES<br />\n                                MUI_PAGE_FINISH</p>\n                            <p>\n                                <strong>Uninstaller pages</strong><br />\n                                MUI_UNPAGE_WELCOME<br />\n                                MUI_UNPAGE_CONFIRM<br />\n                                MUI_UNPAGE_LICENSE <span class=\"parameter\">textfile</span><br />\n                                MUI_UNPAGE_COMPONENTS<br />\n                                MUI_UNPAGE_DIRECTORY<br />\n                                MUI_UNPAGE_INSTFILES<br />\n                                MUI_UNPAGE_FINISH</p>\n                            <h3>\n                                <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pg\" src=\"images/closed.gif\"\n                                    onclick=\"toggle('trigger_pg', 'toggle_pg');\" />\n                                Page settings</h3>\n                            <div class=\"toggle\" id=\"toggle_pg\">\n                                <p>\n                                    Page settings apply to a single page and should be set before inserting a page macro.\n                                    The same settings can be used for installer and uninstaller pages. You have to repeat\n                                    the setting if you want it to apply to multiple pages. Example:</p>\n                                <pre>\n;Add a directory page to let the user specify a plug-ins folder\n;Store the folder in $PluginsFolder\n\nVar PLUGINS_FOLDER\n!define MUI_DIRECTORYPAGE_VARIABLE $PluginsFolder\n!insertmacro MUI_PAGE_DIRECTORY\n</pre>\n                                <p>\n                                    <p>\n                                        All standard texts in the user interface are loaded from language files, which are\n                                        available for all languages supported by NSIS. So you only need to define these\n                                        texts if you want to change the default.</p>\n                                    <p>\n                                        If the parameter is a text that should be different for each language, define a\n                                        language string using LangString and use $(LangStringName) as value. For a license\n                                        text in multiple languages, LicenseLangString can be used. Refer the NSIS Users\n                                        Manual for more information about installers with multiple languages.</p>\n                                    <p>\n                                        In all text settings, the doublequote character (&quot;) should be escaped in the\n                                        following form: $\\&quot;</p>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgg\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_pgg', 'toggle_pgg');\" />\n                                        General page settings</h3>\n                                    <div class=\"toggle\" id=\"toggle_pgg\">\n                                        <p>\n                                            <strong>MUI_PAGE_HEADER_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the header of the page.</p>\n                                        <p>\n                                            <strong>MUI_PAGE_HEADER_SUBTEXT</strong> <span class=\"parameter\">text</span><br />\n                                            Subtext to display on the header of the page.</p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgw\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_pgw', 'toggle_pgw');\" />\n                                        Welcome page settings</h3>\n                                    <div class=\"toggle\" id=\"toggle_pgw\">\n                                        <p>\n                                            To add a newline to any of these texts, use \\r\\n instead of $\\r$\\n.</p>\n                                        <p>\n                                            <strong>MUI_WELCOMEPAGE_TITLE</strong> <span class=\"parameter\">title</span><br />\n                                            Title to display on the top of the page.</p>\n                                        <p>\n                                            <strong>MUI_WELCOMEPAGE_TITLE_3LINES</strong><br />\n                                            Extra space for the title area.</p>\n                                        <p>\n                                            <strong>MUI_WELCOMEPAGE_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the page.</p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgl\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_pgl', 'toggle_pgl');\" />\n                                        License page settings</h3>\n                                    <div class=\"toggle\" id=\"toggle_pgl\">\n                                        <p>\n                                            <strong>MUI_LICENSEPAGE_TEXT_TOP</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the top of the page.</p>\n                                        <p>\n                                            <strong>MUI_LICENSEPAGE_TEXT_BOTTOM</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the bottom of the page.</p>\n                                        <p>\n                                            <strong>MUI_LICENSEPAGE_BUTTON</strong> <span class=\"parameter\">button_text</span><br />\n                                            Text to display on the 'I Agree' button.</p>\n                                        <p>\n                                            <strong>MUI_LICENSEPAGE_CHECKBOX</strong><br />\n                                            Display a checkbox the user has to check to agree with the license terms.</p>\n                                        <div class=\"settings\">\n                                            <p>\n                                                <strong>MUI_LICENSEPAGE_CHECKBOX_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                                Text to display next to the checkbox to agree with the license terms.</p>\n                                        </div>\n                                        <p>\n                                            <strong>MUI_LICENSEPAGE_RADIOBUTTONS</strong><br />\n                                            Display two radio buttons to allow the user to choose between accepting the license\n                                            terms or not.</p>\n                                        <div class=\"settings\">\n                                            <p>\n                                                <strong>MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT</strong> <span class=\"parameter\">text</span><br />\n                                                Text to display next to the checkbox to accept the license terms.</p>\n                                            <p>\n                                                <strong>MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE</strong> <span class=\"parameter\">text</span><br />\n                                                Text to display next to the checkbox to decline the license terms.</p>\n                                        </div>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgc\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_pgc', 'toggle_pgc');\" />\n                                        Components page settings</h3>\n                                    <div class=\"toggle\" id=\"toggle_pgc\">\n                                        <p>\n                                            <strong>MUI_COMPONENTSPAGE_TEXT_TOP</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the top of the page.</p>\n                                        <p>\n                                            <strong>MUI_COMPONENTSPAGE_TEXT_COMPLIST</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on next to the components list.</p>\n                                        <p>\n                                            <strong>MUI_COMPONENTSPAGE_TEXT_INSTTYPE</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on next to the installation type combo box.</p>\n                                        <p>\n                                            <strong>MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the of the top of the description box.</p>\n                                        <p>\n                                            <strong>MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display inside the description box when no section is selected.</p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgd\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_pgd', 'toggle_pgd');\" />\n                                        Directory page settings</h3>\n                                    <div class=\"toggle\" id=\"toggle_pgd\">\n                                        <p>\n                                            <strong>MUI_DIRECTORYPAGE_TEXT_TOP</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on top of the page.</p>\n                                        <p>\n                                            <strong>MUI_DIRECTORYPAGE_TEXT_DESTINATION</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the destination folder frame.</p>\n                                        <p>\n                                            <strong>MUI_DIRECTORYPAGE_VARIABLE</strong> <span class=\"parameter\">variable</span><br />\n                                            Variable in which to store the selected folder.<br />\n                                            <em>Default: $INSTDIR</em></p>\n                                        <p>\n                                            <strong>MUI_DIRECTORYPAGE_VERIFYONLEAVE</strong><br />\n                                            Does not disable the Next button when a folder is invalid but allows you to use\n                                            GetInstDirError in the leave function to handle an invalid folder.</p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgs\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_pgs', 'toggle_pgs');\" />\n                                        Start Menu folder page settings</h3>\n                                    <div class=\"toggle\" id=\"toggle_pgs\">\n                                        <p>\n                                            <strong>MUI_STARTMENUPAGE_TEXT_TOP</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the top of the page.</p>\n                                        <p>\n                                            <strong>MUI_STARTMENUPAGE_TEXT_CHECKBOX</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display next to the checkbox to disable the Start Menu folder creation.</p>\n                                        <p>\n                                            <strong>MUI_STARTMENUPAGE_DEFAULTFOLDER</strong> <span class=\"parameter\">folder</span><br />\n                                            The default Start Menu Folder.</p>\n                                        <p>\n                                            <strong>MUI_STARTMENUPAGE_NODISABLE</strong><br />\n                                            Do not display the checkbox to disable the creation of Start Menu shortcuts.</p>\n                                        <p>\n                                            <strong>MUI_STARTMENUPAGE_REGISTRY_ROOT</strong> <span class=\"parameter\">root</span><br />\n                                            <strong>MUI_STARTMENUPAGE_REGISTRY_KEY</strong> <span class=\"parameter\">key</span><br />\n                                            <strong>MUI_STARTMENUPAGE_REGISTRY_VALUENAME</strong> <span class=\"parameter\">value_name</span><br />\n                                            The registry key to store the Start Menu folder. The page will use it to remember\n                                            the users preference. You should also use for the uninstaller to remove the Start\n                                            Menu folders. Don't forget to remove this key during uninstallation.</p>\n                                        <p>\n                                            For the uninstaller, use the MUI_STARTMENU_GETFOLDER macro to get the Start Menu\n                                            folder:</p>\n                                        <pre>\n!insertmacro MUI_STARTMENU_GETFOLDER page_id $R0\n  Delete &quot;$SMPROGRAMS\\$R0\\Your Shortcut.lnk&quot;\n</pre>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgi\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_pgi', 'toggle_pgi');\" />\n                                        Installation page settings</h3>\n                                    <div class=\"toggle\" id=\"toggle_pgi\">\n                                        <p>\n                                            <strong>MUI_INSTFILESPAGE_FINISHHEADER_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the header of the installation page when the installation has\n                                            been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).</p>\n                                        <p>\n                                            <strong>MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT</strong> <span class=\"parameter\">text</span><br />\n                                            Subtext to display on the header of the installation page when the installation\n                                            has been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).</p>\n                                        <p>\n                                            <strong>MUI_INSTFILESPAGE_ABORTHEADER_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the header of the installation page when the installation has\n                                            been aborted.</p>\n                                        <p>\n                                            <strong>MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT</strong> <span class=\"parameter\">text</span><br />\n                                            Subext to display on the header of the installation page when the installation has\n                                            been aborted.</p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgf\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_pgf', 'toggle_pgf');\" />\n                                        Finish page settings</h3>\n                                    <div class=\"toggle\" id=\"toggle_pgf\">\n                                        <p>\n                                            To add a newline to any of these texts, use \\r\\n instead of $\\r$\\n.</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_TITLE</strong> <span class=\"parameter\">title</span><br />\n                                            Title to display on the top of the page.</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_TITLE_3LINES</strong><br />\n                                            Extra space for the title area.</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the page.</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_TEXT_LARGE</strong><br />\n                                            Extra space for the text area (if using checkboxes).</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_BUTTON</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the Finish button.</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_CANCEL_ENABLED</strong><br />\n                                            Enable the Cancel button so the user can skip any options displayed on the finish\n                                            page.</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_TEXT_REBOOT</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the finish page when asking for a system reboot.</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_TEXT_REBOOTNOW</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display next to the 'Reboot now' option button.</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_TEXT_REBOOTLATER</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display next to the 'Reboot later' option button.</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_REBOOTLATER_DEFAULT</strong><br />\n                                            Sets the 'Reboot later' option as the default option.</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_RUN</strong> <span class=\"parameter\">exe_file</span><br />\n                                            Application which the user can select to run using a checkbox. You don't need to\n                                            put quotes around the filename when it contains spaces.</p>\n                                        <div class=\"settings\">\n                                            <p>\n                                                <strong>MUI_FINISHPAGE_RUN_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                                Texts to display next to the 'Run program' checkbox.</p>\n                                            <p>\n                                                <strong>MUI_FINISHPAGE_RUN_PARAMETERS</strong> <span class=\"parameter\">parameters</span><br />\n                                                Parameters for the application to run. Don't forget to escape double quotes in the\n                                                value (use $\\&quot;).</p>\n                                            <p>\n                                                <strong>MUI_FINISHPAGE_RUN_NOTCHECKED</strong><br />\n                                                Do not check the 'Run program' checkbox by default</p>\n                                            <p>\n                                                <strong>MUI_FINISHPAGE_RUN_FUNCTION</strong> <span class=\"parameter\">function</span><br />\n                                                Call a function instead of executing an application (define MUI_FINISHPAGE_RUN without\n                                                parameters). You can use the function to execute multiple applications or you can\n                                                change the checkbox name and use it for other things.</p>\n                                        </div>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_SHOWREADME</strong> <span class=\"parameter\">file/url</span><br />\n                                            File or website which the user can select to view using a checkbox. You don't need\n                                            to put quotes around the filename when it contains spaces.</p>\n                                        <div class=\"settings\">\n                                            <p>\n                                                <strong>MUI_FINISHPAGE_SHOWREADME_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                                Texts to display next to the 'Show Readme' checkbox.</p>\n                                            <p>\n                                                <strong>MUI_FINISHPAGE_SHOWREADME_NOTCHECKED</strong><br />\n                                                Do not check the 'Show Readme' checkbox by default</p>\n                                            <p>\n                                                <strong>MUI_FINISHPAGE_SHOWREADME_FUNCTION</strong> <span class=\"parameter\">function</span><br />\n                                                Call a function instead of showing a file (define MUI_FINISHPAGE_SHOWREADME without\n                                                parameters). You can use the function to show multiple files or you can change the\n                                                checkbox name and use it for other things.</p>\n                                        </div>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_LINK</strong> <span class=\"parameter\">link_text</span><br />\n                                            Text for a link on the which the user can click to view a website or file.</p>\n                                        <div class=\"settings\">\n                                            <p>\n                                                <strong>MUI_FINISHPAGE_LINK_LOCATION</strong> <span class=\"parameter\">file/url</span><br />\n                                                Website or file which the user can select to view using the link. You don't need\n                                                to put quotes around the filename when it contains spaces.</p>\n                                            <p>\n                                                <strong>MUI_FINISHPAGE_LINK_COLOR</strong> <span class=\"parameter\">(color: RRGGBB hexadecimal)</span><br />\n                                                Text color for the link on the Finish page.<br />\n                                                <em>Default: 000080</em></p>\n                                        </div>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_NOREBOOTSUPPORT</strong><br />\n                                            Disables support for the page that allows the user to reboot the system. Define\n                                            this option to save some space if you are not using the /REBOOTOK flag or SetRebootFlag.</p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgu\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_pgu', 'toggle_pgu');\" />\n                                        Uninstall confirm page settings</h3>\n                                    <div class=\"toggle\" id=\"toggle_pgu\">\n                                        <p>\n                                            <strong>MUI_UNCONFIRMPAGE_TEXT_TOP</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display on the top of the page.</p>\n                                        <p>\n                                            <strong>MUI_UNCONFIRMPAGE_TEXT_LOCATION</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display next to the uninstall location text box.</p>\n                                    </div>\n                            </div>\n                        </div>\n                        <h2>\n                            4. Language files</h2>\n                        <div>\n                            <p>\n                                Insert the Modern UI language files for the languages to want to include.</p>\n                            <pre>\n!insertmacro MUI_LANGUAGE &quot;English&quot;\n</pre>\n                            <p>\n                                The standard NSIS language files are loaded automatically, there is no need to use\n                                LoadLanguageFile.</p>\n                        </div>\n                        <h2>\n                            5. Reserve files</h2>\n                        <div>\n                            <p>\n                                If you are using solid compression, files that are required before the actual installation\n                                should be stored first in the data block, because this will make your installer\n                                start faster. Include reserve file commands for such files before your sections\n                                and functions:</p>\n                            <pre>\nReserveFile &quot;ioFile.ini&quot; ;Your own InstallOptions INI files\n!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ;InstallOptions plug-in\n!insertmacro MUI_RESERVEFILE_LANGDLL ;Language selection dialog\n</pre>\n                        </div>\n                    </div>\n                    <h1>\n                        Script code for pages</h1>\n                    <div>\n                        <p>\n                            Some pages allow you to show additional information or can be used to get user input.\n                            Here you can find the script code to use these features.</p>\n                        <h2>\n                            Components page descriptions</h2>\n                        <div>\n                            <p>\n                                The Modern UI components page has a text box in which a description can be shown\n                                when the user hovers the mouse over a component. If you don't want to use these\n                                descriptions, insert the MUI_COMPONENTSPAGE_NODESC interface setting.</p>\n                            <p>\n                                To set a description for a section, an additional parameter needs to be added to\n                                Section commmand with a unique identifier for the section. This name can later be\n                                used to set the description for this section.</p>\n                            <pre>\nSection &quot;Section Name 1&quot; Section1\n   ...\nSectionEnd\n</pre>\n                            <p>\n                                After the sections, use these macros to set the descriptions:</p>\n                            <pre>\nLangString DESC_Section1 ${LANG_ENGLISH} &quot;Description of section 1.&quot;\nLangString DESC_Section2 ${LANG_ENGLISH} &quot;Description of section 2.&quot;\n\n!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN\n  !insertmacro MUI_DESCRIPTION_TEXT ${Section1} $(DESC_Section1)\n  !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2)\n!insertmacro MUI_FUNCTION_DESCRIPTION_END\n</pre>\n                            <p>\n                                For the uninstaller, use the MUI_UNFUNCTION_DESCRIPTION_BEGIN and MUI_UNFUNCTION_DESCRIPTION_END\n                                macros.</p>\n                        </div>\n                        <h2>\n                            Start Menu folder</h2>\n                        <div>\n                            <p>\n                                Put the code to write the shortcuts (using CreateShortcut) between the MUI_STARTMENU_WRITE_BEGIN\n                                and MUI_STARTMENU_WRITE_END macros:</p>\n                            <pre>\n!insertmacro MUI_STARTMENU_WRITE_BEGIN pageid\n  ...create shortcuts...\n!insertmacro MUI_STARTMENU_WRITE_END\n</pre>\n                            <p>\n                                The page ID should be the ID of the page on which the user has selected the folder\n                                for the shortcuts you want to write.</p>\n                            <p>\n                                The variable which contains the folder and the page ID are set as parameters of\n                                the page macro.</p>\n                        </div>\n                    </div>\n                    <h1>\n                        Language selection dialog</h1>\n                    <div>\n                        <p>\n                            If you want the installer to display a language selection dialog (see the the <a\n                                href=\"../../Examples/Modern%20UI/MultiLanguage.nsi\">MultiLanguage.nsi</a> example),\n                            insert the MUI_LANGDLL_DISPLAY macro in the .onInit function:</p>\n                        <pre>\nFunction .onInit\n\n  !insertmacro MUI_LANGDLL_DISPLAY\n\nFunctionEnd\n</pre>\n                        <p>\n                            This macro can also be used in the un.onInit function.</p>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_lss\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_lss', 'toggle_lss');\" />\n                            Settings for registry storage of selected language</h3>\n                        <div class=\"toggle\" id=\"toggle_lss\">\n                            <p>\n                                To remember the user's preference, you can define a registry key. These defines\n                                should be set before inserting the installation page macro.</p>\n                            <p>\n                                <strong>MUI_LANGDLL_REGISTRY_ROOT</strong> <span class=\"parameter\">root</span><br />\n                                <strong>MUI_LANGDLL_REGISTRY_KEY</strong> <span class=\"parameter\">key</span><br />\n                                <strong>MUI_LANGDLL_REGISTRY_VALUENAME</strong> <span class=\"parameter\">value_name</span><br />\n                                The registry key to store the language. The users preference will be remembered.\n                                You can also use it for the uninstaller to display the right language. Don't forget\n                                to remove this key in the uninstaller.</p>\n                            <p>\n                                For the uninstaller, insert the MUI_UNGETLANGUAGE macro in un.onInit to get the\n                                stored language preference:</p>\n                            <pre>\nFunction un.onInit\n\n  !insertmacro MUI_UNGETLANGUAGE\n\nFunctionEnd\n</pre>\n                        </div>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_lsin\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_lsin', 'toggle_lsin');\" />\n                            Interface settings for selection dialog</h3>\n                        <div class=\"toggle\" id=\"toggle_lsin\">\n                            <p>\n                                To customize the language selection dialog interface, use these defines before inserting\n                                the MUI_LANGDLL_DISPLAY macro.</p>\n                            <p>\n                                <strong>MUI_LANGDLL_WINDOWTITLE</strong> <span class=\"parameter\">text</span><br />\n                                The window title of the language selection dialog.</p>\n                            <p>\n                                <strong>MUI_LANGDLL_INFO</strong> <span class=\"parameter\">text</span><br />\n                                The text to display on the language selection dialog.</p>\n                            <p>\n                                <strong>MUI_LANGDLL_ALWAYSSHOW</strong><br />\n                                Always show the language selection dialog, even if a language has been stored in\n                                the registry. The language stored in the registry will be selected by default.</p>\n                            <p>\n                                <strong>MUI_LANGDLL_ALLLANGUAGES</strong><br />\n                                Always show all available languages and don't filter according to their codepage.</p>\n                        </div>\n                    </div>\n                    <h1>\n                        Custom pages</h1>\n                    <div>\n                        <p>\n                            If you want add your custom pages to your installer, you can insert your own page\n                            commands between the page macros. The <a href=\"../InstallOptions/Readme.html\">InstallOptions\n                                documentation</a> provides information about creating custom pages using InstallOptions.</p>\n                        <pre>\n!insertmacro MUI_PAGE_WELCOME\nPage custom FunctionName ;Custom page\n!insertmacro MUI_PAGE_COMPONENTS\n \n;Uninstaller\n!insertmacro MUI_UNPAGE_CONFIRM\nUninstPage custom un.FunctionName ;Custom page\n!insertmacro MUI_UNPAGE_INSTFILES\n</pre>\n                        <p>\n                            Use the MUI_HEADER_TEXT macro to set the text on the page header in a page function:</p>\n                        <pre>\nLangString PAGE_TITLE ${LANG_ENGLISH} &quot;Title&quot;\nLangString PAGE_SUBTITLE ${LANG_ENGLISH} &quot;Subtitle&quot;\n\nFunction CustomPageFunction\n  !insertmacro MUI_HEADER_TEXT $(PAGE_TITLE) $(PAGE_SUBTITLE)\n  !insertmacro MUI_INSTALLOPTIONS_DISPLAY &quot;ioFile.ini&quot;\nFuctionEnd\n</pre>\n                    </div>\n                    <h1>\n                        Custom functions</h1>\n                    <div>\n                        <p>\n                            Interface functions provided by NSIS, like the .onGUIInit function and the page\n                            functions are automatically included by the Modern UI and filled with code to support\n                            new interface features. If you want to add additional code to these function, create\n                            a function with the custom script code in the script use the Modern UI functions\n                            call them.</p>\n                        <p>\n                            Example:</p>\n                        <pre class=\"text\">\n!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit\n\nFunction myGUIInit\n  ...your own code...\nFunctionEnd\n</pre>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_cfg\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_cfg', 'toggle_cfg');\" />\n                            General Custom Functions</h3>\n                        <div class=\"toggle\" id=\"toggle_cfg\">\n                            <p>\n                                These defines should be set before inserting the language macros.</p>\n                            <p>\n                                <strong>MUI_CUSTOMFUNCTION_GUIINIT</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_CUSTOMFUNCTION_UNGUIINIT</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_CUSTOMFUNCTION_ABORT</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_CUSTOMFUNCTION_UNABORT</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION</strong> <span class=\"parameter\">function</span></p>\n\t\t\t\t\t\t\t<p>\n                                Mouse over functions are only available when the description macros\n\t\t\t\t\t\t\t\t(MUI_FUNCTION_DESCRIPTION_BEGIN) are used. When component page descriptions are not\n\t\t\t\t\t\t\t\tused, regular .onMouseOverSection and un.onMouseOverSection must be used.</p>\n                        </div>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_cfpg\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_cfpg', 'toggle_cfpg');\" />\n                            Page Custom Functions</h3>\n                        <div class=\"toggle\" id=\"toggle_cfpg\">\n                            <p>\n                                These defines should be set before inserting a page macro.</p>\n                            <p>\n                                <strong>MUI_PAGE_CUSTOMFUNCTION_PRE</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_PAGE_CUSTOMFUNCTION_SHOW</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_PAGE_CUSTOMFUNCTION_LEAVE</strong> <span class=\"parameter\">function</span></p>\n                            <p>\n                                <strong>Notes:</strong></p>\n                            <ul>\n                                <li>In the Pre function of the Welcome page and the Finish page, you can write to the\n                                    InstallOptions INI file of the page (ioSpecial.ini)</li>\n                                <li>In the Show function of the Welcome, Finish and StartMenu pages, $MUI_HWND contains\n                                    the HWND of the inner dialog</li>\n                            </ul>\n                        </div>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_cfwf\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_cfwf', 'toggle_cfwf');\" />\n                            Welcome/Finish Page Custom Functions</h3>\n                        <div class=\"toggle\" id=\"toggle_cfwf\">\n                            <p>\n                                This define should be inserted before a single Welcome or Finish page.</p>\n                            <p>\n                                <strong>MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT</strong> <span class=\"parameter\">function</span></p>\n                            <p>\n                                This Init function is called before the InstallOptions INI file for the page is\n                                written, so you can use it to initialize any variables used in the page settings.</p>\n                        </div>\n                    </div>\n                    <h1>\n                        <a name=\"examples\" id=\"examples\">Example scripts</a></h1>\n                    <div>\n                        <p>\n                            Basic: <a href=\"../../Examples/Modern%20UI/Basic.nsi\">Basic.nsi</a><br />\n                            Welcome/Finish page: <a href=\"../../Examples/Modern%20UI/WelcomeFinish.nsi\">WelcomeFinish.nsi</a><br />\n                            Multiple languages: <a href=\"../../Examples/Modern%20UI/MultiLanguage.nsi\">MultiLanguage.nsi</a><br />\n                            Header image: <a href=\"../../Examples/Modern%20UI/HeaderBitmap.nsi\">HeaderBitmap.nsi</a><br />\n                            Custom pages: <a href=\"../../Examples/Modern%20UI/InstallOptions.nsi\">InstallOptions.nsi</a><br />\n                            Start Menu Folder page: <a href=\"../../Examples/Modern%20UI/StartMenu.nsi\">StartMenu.nsi</a></p>\n                    </div>\n                    <h1>\n                        Credits</h1>\n                    <div>\n                        <p>\n                            Written by Joost Verburg.<br />\n                            Icons designed by Nikos Adamamas, aka adni18.<br />\n                            Thanks to Amir Szekely, aka KiCHiK, for his work on NSIS to make this possible.</p>\n                    </div>\n                    <h1>\n                        License</h1>\n                    <div>\n                        <p>\n                            The zlib/libpng license applies to the Modern UI.</p>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_lic\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_lic', 'toggle_lic');\" />\n                            License Terms</h3>\n                        <div class=\"toggle\" id=\"toggle_lic\">\n                            <pre>\nCopyright &copy; 2002-2009 Joost Verburg\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; \n   you must not claim that you wrote the original software.\n   If you use this software in a product, an acknowledgment in the\n   product documentation would be appreciated but is not required.\n2. Altered versions must be plainly marked as such,\n   and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any distribution.\n</pre>\n                        </div>\n                    </div>\n                </div>\n            </td>\n        </tr>\n    </table>\n</body>\n</html>\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/Modern UI 2/License.txt",
    "content": "Copyright  2002-2009 Joost Verburg\n\nThis software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software.\n   If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any distribution."
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/Modern UI 2/Readme.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <title>NSIS Modern User Interface - Documentation</title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\" />\n    <style type=\"text/css\">\n        /*<![CDATA[*/body\n        {\n            padding: 10px;\n            background-color: #F0F0F0;\n            font-size: 13px;\n            font-family: Verdana, Arial, Helvetica, sans-serif;\n            font-weight: normal;\n            text-align: justify;\n        }\n        p, li\n        {\n            font-size: 13px;\n        }\n        table\n        {\n            margin: auto;\n            background-color: #FFFFFF;\n        }\n        .maintable\n        {\n            border: 2px solid #376EAB;\n        }\n        .parameter\n        {\n            font-weight: bold;\n            color: #6586AC;\n        }\n        h1\n        {\n            font-size: 20px;\n            color: #7A7272;\n            font-weight: normal;\n        }\n        h2\n        {\n            font-size: 17px;\n            font-weight: bold;\n            color: #303030;\n        }\n        h3\n        {\n            font-size: 14px;\n            font-weight: bold;\n            color: #2B5885;\n        }\n        pre\n        {\n            font-size: 13px;\n        }\n        div\n        {\n            margin: 20px;\n        }\n        div.settings\n        {\n            margin-right: 0;\n        }\n        a:link, a:visited, a:active\n        {\n            color: #294F75;\n            text-decoration: none;\n        }\n        a:hover\n        {\n            color: #182634;\n            text-decoration: underline;\n        }\n        .trigger\n        {\n            cursor: pointer;\n            cursor: hand;\n            height: 14px;\n        }\n        .toggle\n        {\n            display: none;\n        }\n        .options\n        {\n            text-align: center;\n            cursor: pointer;\n            cursor: hand;\n            color: #294F75;\n        }\n        /*]]>*/</style>\n\n    <script type=\"text/javascript\">\n//<![CDATA[\n\n   var image_open = new Image();\n   image_open.src = \"images/open.gif\";\n   var image_closed = new Image();\n   image_closed.src = \"images/closed.gif\";\n   \n   function toggle(image, section) {\n   \n      if(document.all) {\n        if(document.all[section].style.display == \"block\") {\n           document.all[section].style.display = \"none\";\n           document.all[image].src = image_closed.src;\n        }\n        else\n        {              \n           document.all[section].style.display = \"block\";\n           document.all[image].src = image_open.src;\n        }\n      }\n      else\n      {\n      if(document.getElementById(section).style.display == \"block\") {\n         document.getElementById(section).style.display = \"none\";\n         document.getElementById(image).src = image_closed.src;\n         }\n      else\n         {              \n         document.getElementById(section).style.display = \"block\";\n         document.getElementById(image).src = image_open.src;\n         }\n      }\n   \n   }\n\n   function expandall() {\n\n     var divNodeList = document.getElementsByTagName('div'); \n     for (i = 0; i < divNodeList.length; i++) { \n        if(divNodeList[i].id) {\n           divNodeList[i].style.display = \"block\";\n           document.getElementById('trigger_' + divNodeList[i].id.substr(7)).src = \"images/open.gif\";\n        }\n     }\n     \n   }\n\n   function collapseall() {\n\n     var divNodeList = document.getElementsByTagName('div'); \n     for (i = 0; i < divNodeList.length; i++) { \n        if(divNodeList[i].id) {\n           divNodeList[i].style.display = \"none\";\n           document.getElementById('trigger_' + divNodeList[i].id.substr(7)).src = \"images/closed.gif\";\n        }\n     }\n\n   }\n\n//]]>\n    </script>\n\n</head>\n<body>\n    <table width=\"750\" class=\"maintable\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n        <tr>\n            <td>\n                <img src=\"images/header.gif\" width=\"750\" height=\"80\" alt=\"\" />\n                <p class=\"options\">\n                    <a onclick=\"expandall()\">[Expand all]</a>&nbsp; &nbsp;<a onclick=\"collapseall()\">[Collapse\n                        all]</a></p>\n                <div>\n                    <h1>\n                        Introduction</h1>\n                    <div>\n                        <p>\n                            The Modern UI provides a user interface for NSIS installers with a modern wizard\n                            style, similar to the wizards of recent Windows versions. It is based on the basic\n                            user interface that is provided by the NSIS compiler itself and extends it with\n                            more interface features and pages.</p>\n                        <p>\n                            All standard NSIS pages (such as the pages to select components and the installation\n                            folder) are supported as well as a number of additional pages. The welcome page\n                            allows you to provide an introduction to the installation process, while the finish\n                            page provides a way to let the user decide what steps should be performed after\n                            the setup wizard is closed (for example, whether the application should be started\n                            immediately). A finish page can also be used to ask for a system restart is necessary.</p>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_scr\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_scr', 'toggle_scr');\" />\n                            Screenshots</h3>\n                        <div class=\"toggle\" id=\"toggle_scr\">\n                            <p>\n                                <img src=\"images/screen1.png\" width=\"503\" height=\"393\" alt=\"\" /></p>\n                            <p>\n                                <img src=\"images/screen2.png\" width=\"503\" height=\"393\" alt=\"\" /></p>\n                        </div>\n                    </div>\n                    <h1>\n                        Modern UI 2.0</h1>\n                    <div>\n                        <p>\n                            This new version makes it easier to customize pages, because the same method can\n                            be used to&nbsp; change standard NSIS pages as well as additional pages provided\n                            by the Modern UI. It is now also possible for other NSIS plug-ins to add new pages\n                            to the Modern UI. You can expect to see examples of this soon.</p>\n                        <p>\n                            The welcome and finish page are no longer implemented using InstallOptions. Instead,\n                            the new nsDialogs plug-in is used. nsDialogs allows you to create custom pages or\n                            customize existing pages directly from the script.</p>\n                        <p>\n                            To upgrade a Modern UI 1.8 script, you should:</p>\n                        <ul>\n                            <li>Insert the MUI2.nsh header file instead of MUI.nsh.</li>\n                            <li>The macros for InstallOptions have been moved to a separate header file unrelated\n                                to the Modern UI. If you are still using InstallOptions for custom pages, insert\n                                InstallOptions.nsh and use the INSTALLOPTIONS_* macros instead of the MUI_INSTALLOPTIONS_*\n                                macros. The macros themselves have remained the same.</li>\n                            <li>Rewrite customization code for the Modern UI 1.8 welcome and finish pages in which\n                                the InstallOptions INI file is used. nsDialogs commands should be used instead.</li>\n                            <li>Use the standard NSIS method to escape special characters in all texts. For example,\n                                $\\r$\\n creates newline.</li>\n                        </ul>\n                    </div>\n                    <h1>\n                        Script header</h1>\n                    <div>\n                        <p>\n                            The settings for the Modern UI should be inserted in the header of the script file.\n                            It&#39;s important to follow the same order as the items below.&nbsp;For example,\n                            interface settings should be defined before you insert pages, because the pages\n                            depend on the interface configuration. It may be useful to look at the <a href=\"#examples\">\n                                example scripts</a> too see how this is done in actual script files.</p>\n                        <p>\n                            Parameters are given in this format: <span class=\"parameter\">required (option1 | option2)\n                                [optional]</span></p>\n                    </div>\n                    <h2>\n                        1. Header file</h2>\n                    <div>\n                        <p>\n                            First of all, add this line to the top of script to include the Modern UI:</p>\n                        <pre>\n!include MUI2.nsh\n</pre>\n                    </div>\n                    <h2>\n                        2. Interface configuration</h2>\n                    <div>\n                        <p>\n                            Then, you may want to use interface settings to change the look and feel of the\n                            installer. These settings apply to all pages.<p>\n                                The interface settings provided by the NSIS compiler itself (such as LicenseText,\n                                Icon, CheckBitmap, InstallColors) should not be used in Modern UI scripts. The Modern\n                                UI provides equalivent or extended versions of these settings.<p>\n                                    Examples:</p>\n                                <pre>\n!define MUI_COMPONENTSPAGE_SMALLDESC ;No value\n!define MUI_UI &quot;myUI.exe&quot; ;Value\n!define MUI_INSTFILESPAGE_COLORS &quot;FFFFFF 000000&quot; ;Two colors\n</pre>\n                                <h3>\n                                    <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_in\" src=\"images/closed.gif\"\n                                        onclick=\"toggle('trigger_in', 'toggle_in');\" />\n                                    Interface settings</h3>\n                                <div class=\"toggle\" id=\"toggle_in\">\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_ingen\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_ingen', 'toggle_ingen');\" />\n                                        Page header</h3>\n                                    <div class=\"toggle\" id=\"toggle_ingen\">\n                                        <p>\n                                            <strong>MUI_ICON</strong> <span class=\"parameter\">icon_file</span><br />\n                                            The icon for the installer.<br />\n                                            <em>Default: ${NSISDIR}\\Contrib\\Graphics\\Icons\\modern-install.ico</em></p>\n                                        <p>\n                                            <strong>MUI_UNICON</strong> <span class=\"parameter\">icon_file</span><br />\n                                            The icon for the uninstaller.<br />\n                                            <em>Default: ${NSISDIR}\\Contrib\\Graphics\\Icons\\modern-uninstall.ico</em></p>\n                                        <p>\n                                            <strong>MUI_HEADERIMAGE</strong><br />\n                                            Display an image on the header of the page.</p>\n                                        <div class=\"settings\">\n                                            <p>\n                                                <strong>MUI_HEADERIMAGE_BITMAP</strong> <span class=\"parameter\">bmp_file</span><br />\n                                                Bitmap image to display on the header of installers pages (recommended size: 150x57\n                                                pixels).<br />\n                                                <em>Default: ${NSISDIR}\\Contrib\\Graphics\\Header\\nsis.bmp</em></p>\n                                            <div class=\"settings\">\n                                                <p>\n                                                    <strong>MUI_HEADERIMAGE_BITMAP_NOSTRETCH</strong><br />\n                                                    Do not stretch the installer header bitmap to fit the size of the field. Use this\n                                                    option only if you have an image that does not use the whole space. If you have\n                                                    a full size bitmap that fits exactly, you should not use this option because the\n                                                    size of the field will be different if the user has a custom DPI setting.</p>\n                                                <p>\n                                                    <strong>MUI_HEADERIMAGE_BITMAP_RTL</strong> <span class=\"parameter\">bmp_file</span><br />\n                                                    Bitmap image to display on the header of installers pages when using a RTL language\n                                                    (recommended size: 150x57 pixels).<br />\n                                                    <em>Default: Non-RTL bitmap</em></p>\n                                                <div class=\"settings\">\n                                                    <p>\n                                                        <strong>MUI_HEADERIMAGE_BITMAP_RTL_NOSTRETCH</strong><br />\n                                                        Do not stretch the installer header bitmap when using a RTL language to fit the\n                                                        size of the field. Use this option only if you have an image that does not use the\n                                                        whole space. If you have a full size bitmap that fits exactly, you should not use\n                                                        this option because the size of the field will be different if the user has a custom\n                                                        DPI setting.</p>\n                                                </div>\n                                            </div>\n                                            <p>\n                                                <strong>MUI_HEADERIMAGE_UNBITMAP</strong> <span class=\"parameter\">bmp_file</span><br />\n                                                Bitmap image to display on the header of uninstaller pages (recommended size: 150x57\n                                                pixels).<br />\n                                                <em>Default: Installer header bitmap</em></p>\n                                            <div class=\"settings\">\n                                                <p>\n                                                    <strong>MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH</strong><br />\n                                                    Do not stretch the uninstaller header bitmap to fit the size of the field. Use this\n                                                    option only if you have an image that does not use the whole space. If you have\n                                                    a full size bitmap that fits exactly, you should not use this option because the\n                                                    size of the field will be different if the user has a custom DPI setting.</p>\n                                                <p>\n                                                    <strong>MUI_HEADERIMAGE_UNBITMAP_RTL</strong> <span class=\"parameter\">bmp_file</span><br />\n                                                    Bitmap image to display on the header of uninstallers pages when using a RTL language\n                                                    (recommended size: 150x57 pixels).<br />\n                                                    <em>Default: Installer RTL header bitmap</em></p>\n                                                <div class=\"settings\">\n                                                    <p>\n                                                        <strong>MUI_HEADERIMAGE_UNBITMAP_RTL_NOSTRETCH</strong><br />\n                                                        Do not stretch the uninstaller header bitmap when using a RTL language to fit the\n                                                        size of the field. Use this option only if you have an image that does not use the\n                                                        whole space. If you have a full size bitmap that fits exactly, you should not use\n                                                        this option because the size of the field will be different if the user has a custom\n                                                        DPI setting.</p>\n                                                </div>\n                                            </div>\n                                            <p>\n                                                <strong>MUI_HEADERIMAGE_RIGHT</strong><br />\n                                                Display the header image on the right side instead of the left side (when using\n                                                a RTL language it will be displayed on the left side instead of the right side).</p>\n                                        </div>\n                                        <p>\n                                            <strong>MUI_BGCOLOR</strong> <span class=\"parameter\">(color: RRGGBBR hexadecimal)</span><br />\n                                            Background color for the header, the Welcome page and the Finish page.<br />\n                                            <em>Default: FFFFFF</em></p>\n                                        <p>\n                                            <strong>MUI_HEADER_TRANSPARENT_TEXT</strong><br />\n                                            Set a transparent background for the header's label controls. Useful for custom\n                                            user interfaces that set a bigger header image.</p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inres\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_inres', 'toggle_inres');\" />\n                                        Interface resources</h3>\n                                    <div class=\"toggle\" id=\"toggle_inres\">\n                                        <p>\n                                            <strong>MUI_UI</strong> <span class=\"parameter\">ui_file</span><br />\n                                            The interface file with the dialog resources. Change this if you have made your\n                                            own customized UI.<br />\n                                            <em>Default: ${NSISDIR}\\Contrib\\UIs\\modern.exe</em></p>\n                                        <p>\n                                            <strong>MUI_UI_HEADERIMAGE</strong> <span class=\"parameter\">ui_file</span><br />\n                                            The interface files with the dialog resource IDD_INST that contains a bitmap control\n                                            and space for the header bitmap.<br />\n                                            <em>Default: ${NSISDIR}\\Contrib\\UIs\\modern_headerbmp.exe</em></p>\n                                        <p>\n                                            <strong>MUI_UI_HEADERIMAGE_RIGHT</strong> <span class=\"parameter\">ui_file</span><br />\n                                            The interface files with the dialog resource IDD_INST that contains a bitmap control\n                                            and space for the header bitmap on the right side.<br />\n                                            <em>Default: ${NSISDIR}\\Contrib\\UIs\\modern_headerbmpr.exe</em></p>\n                                        <p>\n                                            <strong>MUI_UI_COMPONENTSPAGE_SMALLDESC</strong> <span class=\"parameter\">ui_file</span><br />\n                                            The interface files with a customized dialog resource IDD_SELCOM with a small description\n                                            area.<br />\n                                            <em>Default: ${NSISDIR}\\Contrib\\UIs\\modern_smalldesc.exe</em></p>\n                                        <p>\n                                            <strong>MUI_UI_COMPONENTSPAGE_NODESC</strong> <span class=\"parameter\">ui_file</span><br />\n                                            The interface files with a customized dialog resource IDD_SELCOM without a description\n                                            area.<br />\n                                            <em>Default: ${NSISDIR}\\Contrib\\UIs\\modern_nodesc.exe</em></p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inwf\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_inwf', 'toggle_inwf');\" />\n                                        Installer welcome/finish page</h3>\n                                    <div class=\"toggle\" id=\"toggle_inwf\">\n                                        <p>\n                                            <strong>MUI_WELCOMEFINISHPAGE_BITMAP</strong> <span class=\"parameter\">bmp_file</span><br />\n                                            Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).<br />\n                                            <em>Default: ${NSISDIR}\\Contrib\\Graphics\\Wizard\\win.bmp</em></p>\n                                        <div class=\"settings\">\n                                            <p>\n                                                <strong>MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH</strong><br />\n                                                Do not stretch the bitmap for the Welcome and Finish page to fit the size of the\n                                                field. Use this option only if you have an image that does not use the whole space.\n                                                If you have a full size bitmap that fits exactly, you should not use this option\n                                                because the size of the field will be different if the user has a custom DPI setting.</p>\n                                        </div>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inuwf\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_inuwf', 'toggle_inuwf');\" />\n                                        Uninstaller welcome/finish page</h3>\n                                    <div class=\"toggle\" id=\"toggle_inuwf\">\n                                        <p>\n                                            <strong>MUI_UNWELCOMEFINISHPAGE_BITMAP</strong> <span class=\"parameter\">bmp_file</span><br />\n                                            Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).<br />\n                                            <em>Default: ${NSISDIR}\\Contrib\\Graphics\\Wizard\\win.bmp</em></p>\n                                        <div class=\"settings\">\n                                            <p>\n                                                <strong>MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH</strong><br />\n                                                Do not stretch the bitmap for the Welcome and Finish page to fit the size of the\n                                                field. Use this option only if you have an image that does not use the whole space.\n                                                If you have a full size bitmap that fits exactly, you should not use this option\n                                                because the size of the field will be different if the user has a custom DPI setting.</p>\n                                        </div>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inl\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_inl', 'toggle_inl');\" />\n                                        License page</h3>\n                                    <div class=\"toggle\" id=\"toggle_inl\">\n                                        <p>\n                                            <strong>MUI_LICENSEPAGE_BGCOLOR</strong> <span class=\"parameter\">(/windows | /grey |\n                                                (color: RRGGBB hexadecimal))</span><br />\n                                            The background color for the license textbox. Use /windows for the Windows text\n                                            background color (usually white). Use the /grey for the window background color\n                                            (usually grey).<br />\n                                            <em>Default: /windows</em></p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inc\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_inc', 'toggle_inc');\" />\n                                        Components page</h3>\n                                    <div class=\"toggle\" id=\"toggle_inc\">\n                                        <p>\n                                            <strong>MUI_COMPONENTSPAGE_CHECKBITMAP</strong> <span class=\"parameter\">bitmap_file</span><br />\n                                            The bitmap with images for the checks of the component select treeview.<br />\n                                            <em>Default: ${NSISDIR}\\Contrib\\Graphics\\Checks\\modern.bmp</em></p>\n                                        <p>\n                                            <strong>MUI_COMPONENTSPAGE_SMALLDESC</strong><br />\n                                            A small description area on the bottom of the page. Use this layout if you have\n                                            a lot of sections and don't need large descriptions.</p>\n                                        <p>\n                                            <strong>MUI_COMPONENTSPAGE_NODESC</strong><br />\n                                            No description area.</p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_ind\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_ind', 'toggle_ind');\" />\n                                        Directory page</h3>\n                                    <div class=\"toggle\" id=\"toggle_ind\">\n                                        <p>\n                                            <strong>MUI_DIRECTORYPAGE_BGCOLOR</strong> <span class=\"parameter\">(color: RRGGBB hexadecimal)</span><br />\n                                            The background color for the directory textbox.</p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_ins\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_ins', 'toggle_ins');\" />\n                                        Start Menu folder page</h3>\n                                    <div class=\"toggle\" id=\"toggle_ins\">\n                                        <p>\n                                            <strong>MUI_STARTMENUPAGE_BGCOLOR</strong> <span class=\"parameter\">(color: RRGGBB hexadecimal)</span><br />\n                                            The background color for the startmenu directory list and textbox.</p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_ini\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_ini', 'toggle_ini');\" />\n                                        Installation page</h3>\n                                    <div class=\"toggle\" id=\"toggle_ini\">\n                                        <p>\n                                            <strong>MUI_INSTFILESPAGE_COLORS</strong> <span class=\"parameter\">(/windows | &quot;(foreground\n                                                color: RRGGBB hexadecimal) (background color: RRGGBB hexadecimal)&quot;)</span><br />\n                                            The colors of the details screen. Use /windows for the default Windows colors.<br />\n                                            <em>Default: /windows</em></p>\n                                        <p>\n                                            <strong>MUI_INSTFILESPAGE_PROGRESSBAR</strong> <span class=\"parameter\">(&quot;&quot;\n                                                | colored | smooth)</span><br />\n                                            The style of the progress bar. Colored makes it use the MUI_INSTALLCOLORS.<br />\n                                            <em>Default: smooth</em></p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inf\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_inf', 'toggle_inf');\" />\n                                        Installer finish page</h3>\n                                    <div class=\"toggle\" id=\"toggle_inf\">\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_NOAUTOCLOSE</strong><br />\n                                            Do not automatically jump to the finish page, to allow the user to check the install\n                                            log.</p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_uinf\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_uinf', 'toggle_uinf');\" />\n                                        Uninstaller finish page</h3>\n                                    <div class=\"toggle\" id=\"toggle_uinf\">\n                                        <p>\n                                            <strong>MUI_UNFINISHPAGE_NOAUTOCLOSE</strong><br />\n                                            Do not automatically jump to the finish page, to allow the user to check the uninstall\n                                            log.</p>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inaw\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_inaw', 'toggle_inaw');\" />\n                                        Abort warning</h3>\n                                    <div class=\"toggle\" id=\"toggle_inaw\">\n                                        <p>\n                                            <strong>MUI_ABORTWARNING</strong><br />\n                                            Show a message box with a warning when the user wants to close the installer.</p>\n                                        <div class=\"settings\">\n                                            <p>\n                                                <strong>MUI_ABORTWARNING_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                                Text to display on the abort warning message box.</p>\n                                            <p>\n                                                <strong>MUI_ABORTWARNING_CANCEL_DEFAULT</strong><br />\n                                                Set the Cancel button as the default button on the message box.</p>\n                                        </div>\n                                    </div>\n                                    <h3>\n                                        <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_inuaw\" src=\"images/closed.gif\"\n                                            onclick=\"toggle('trigger_inuaw', 'toggle_inuaw');\" />\n                                        Uninstaller abort warning</h3>\n                                    <div class=\"toggle\" id=\"toggle_inuaw\">\n                                        <p>\n                                            <strong>MUI_UNABORTWARNING</strong><br />\n                                            Show a message box with a warning when the user wants to close the uninstaller.</p>\n                                        <div class=\"settings\">\n                                            <p>\n                                                <strong>MUI_UNABORTWARNING_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                                Text to display on the abort warning message box.</p>\n                                            <p>\n                                                <strong>MUI_UNABORTWARNING_CANCEL_DEFAULT</strong><br />\n                                                Set the Cancel button as the default button on the message box.</p>\n                                        </div>\n                                    </div>\n                                </div>\n                    </div>\n                    <h2>\n                        3. Pages</h2>\n                    <div>\n                        <p>\n                            Insert the following macros to set the pages you want to use. The pages will appear\n                            in the order in which you insert them in the script. You can also insert custom\n                            Page commands between the macros to add custom pages.</p>\n                        <p>\n                            You can add multiple pages of certain types (for example, if you want the user to\n                            specify multiple folders).</p>\n                        <p>\n                            Examples:</p>\n                        <pre>\n!insertmacro MUI_PAGE_LICENSE &quot;License.rtf&quot;\n!insertmacro MUI_PAGE_COMPONENTS\n\nVar StartMenuFolder\n!insertmacro MUI_PAGE_STARTMENU &quot;Application&quot; $StartMenuFolder\n</pre>\n                        <p>\n                            You will need the page ID for the Start Menu folder page when using the Start Menu\n                            folder macros. The folder will be stored in the specified variable.</p>\n                        <p>\n                            <strong>Installer pages</strong><br />\n                            MUI_PAGE_WELCOME<br />\n                            MUI_PAGE_LICENSE <span class=\"parameter\">textfile</span><br />\n                            MUI_PAGE_COMPONENTS<br />\n                            MUI_PAGE_DIRECTORY<br />\n                            MUI_PAGE_STARTMENU <span class=\"parameter\">pageid variable</span><br />\n                            MUI_PAGE_INSTFILES<br />\n                            MUI_PAGE_FINISH</p>\n                        <p>\n                            <strong>Uninstaller pages</strong><br />\n                            MUI_UNPAGE_WELCOME<br />\n                            MUI_UNPAGE_CONFIRM<br />\n                            MUI_UNPAGE_LICENSE <span class=\"parameter\">textfile</span><br />\n                            MUI_UNPAGE_COMPONENTS<br />\n                            MUI_UNPAGE_DIRECTORY<br />\n                            MUI_UNPAGE_INSTFILES<br />\n                            MUI_UNPAGE_FINISH</p>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pg\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_pg', 'toggle_pg');\" />\n                            Page settings</h3>\n                        <div class=\"toggle\" id=\"toggle_pg\">\n                            <p>\n                                Page settings apply to a single page and should be set before inserting a page macro.\n                                The same settings can be used for installer and uninstaller pages. You have to repeat\n                                the setting if you want it to apply to multiple pages. Example:</p>\n                            <pre>\n;Add a directory page to let the user specify a plug-ins folder\n;Store the folder in $PluginsFolder\n\nVar PLUGINS_FOLDER\n!define MUI_DIRECTORYPAGE_VARIABLE $PluginsFolder\n!insertmacro MUI_PAGE_DIRECTORY\n</pre>\n                            <p>\n                                <p>\n                                    All standard texts in the user interface are loaded from language files, which are\n                                    available for all languages supported by NSIS. So you only need to define these\n                                    texts if you want to change the default.</p>\n                                <p>\n                                    If the parameter is a text that should be different for each language, define a\n                                    language string using LangString and use $(LangStringName) as value. For a license\n                                    text in multiple languages, LicenseLangString can be used. Refer the NSIS Users\n                                    Manual for more information about installers with multiple languages.</p>\n                                <p>\n                                    In all text settings, the doublequote character (&quot;) should be escaped in the\n                                    following form: $\\&quot;</p>\n                                <h3>\n                                    <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgg\" src=\"images/closed.gif\"\n                                        onclick=\"toggle('trigger_pgg', 'toggle_pgg');\" />\n                                    General page settings</h3>\n                                <div class=\"toggle\" id=\"toggle_pgg\">\n                                    <p>\n                                        <strong>MUI_PAGE_HEADER_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the header of the page.</p>\n                                    <p>\n                                        <strong>MUI_PAGE_HEADER_SUBTEXT</strong> <span class=\"parameter\">text</span><br />\n                                        Subtext to display on the header of the page.</p>\n                                </div>\n                                <h3>\n                                    <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgw\" src=\"images/closed.gif\"\n                                        onclick=\"toggle('trigger_pgw', 'toggle_pgw');\" />\n                                    Welcome page settings</h3>\n                                <div class=\"toggle\" id=\"toggle_pgw\">\n                                    <p>\n                                        <strong>MUI_WELCOMEPAGE_TITLE</strong> <span class=\"parameter\">title</span><br />\n                                        Title to display on the top of the page.</p>\n                                    <p>\n                                        <strong>MUI_WELCOMEPAGE_TITLE_3LINES</strong><br />\n                                        Extra space for the title area.</p>\n                                    <p>\n                                        <strong>MUI_WELCOMEPAGE_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the page.</p>\n                                </div>\n                                <h3>\n                                    <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgl\" src=\"images/closed.gif\"\n                                        onclick=\"toggle('trigger_pgl', 'toggle_pgl');\" />\n                                    License page settings</h3>\n                                <div class=\"toggle\" id=\"toggle_pgl\">\n                                    <p>\n                                        <strong>MUI_LICENSEPAGE_TEXT_TOP</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the top of the page.</p>\n                                    <p>\n                                        <strong>MUI_LICENSEPAGE_TEXT_BOTTOM</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the bottom of the page.</p>\n                                    <p>\n                                        <strong>MUI_LICENSEPAGE_BUTTON</strong> <span class=\"parameter\">button_text</span><br />\n                                        Text to display on the 'I Agree' button.</p>\n                                    <p>\n                                        <strong>MUI_LICENSEPAGE_CHECKBOX</strong><br />\n                                        Display a checkbox the user has to check to agree with the license terms.</p>\n                                    <div class=\"settings\">\n                                        <p>\n                                            <strong>MUI_LICENSEPAGE_CHECKBOX_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display next to the checkbox to agree with the license terms.</p>\n                                    </div>\n                                    <p>\n                                        <strong>MUI_LICENSEPAGE_RADIOBUTTONS</strong><br />\n                                        Display two radio buttons to allow the user to choose between accepting the license\n                                        terms or not.</p>\n                                    <div class=\"settings\">\n                                        <p>\n                                            <strong>MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display next to the checkbox to accept the license terms.</p>\n                                        <p>\n                                            <strong>MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE</strong> <span class=\"parameter\">text</span><br />\n                                            Text to display next to the checkbox to decline the license terms.</p>\n                                    </div>\n                                </div>\n                                <h3>\n                                    <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgc\" src=\"images/closed.gif\"\n                                        onclick=\"toggle('trigger_pgc', 'toggle_pgc');\" />\n                                    Components page settings</h3>\n                                <div class=\"toggle\" id=\"toggle_pgc\">\n                                    <p>\n                                        <strong>MUI_COMPONENTSPAGE_TEXT_TOP</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the top of the page.</p>\n                                    <p>\n                                        <strong>MUI_COMPONENTSPAGE_TEXT_COMPLIST</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on next to the components list.</p>\n                                    <p>\n                                        <strong>MUI_COMPONENTSPAGE_TEXT_INSTTYPE</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on next to the installation type combo box.</p>\n                                    <p>\n                                        <strong>MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the of the top of the description box.</p>\n                                    <p>\n                                        <strong>MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display inside the description box when no section is selected.</p>\n                                </div>\n                                <h3>\n                                    <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgd\" src=\"images/closed.gif\"\n                                        onclick=\"toggle('trigger_pgd', 'toggle_pgd');\" />\n                                    Directory page settings</h3>\n                                <div class=\"toggle\" id=\"toggle_pgd\">\n                                    <p>\n                                        <strong>MUI_DIRECTORYPAGE_TEXT_TOP</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on top of the page.</p>\n                                    <p>\n                                        <strong>MUI_DIRECTORYPAGE_TEXT_DESTINATION</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the destination folder frame.</p>\n                                    <p>\n                                        <strong>MUI_DIRECTORYPAGE_VARIABLE</strong> <span class=\"parameter\">variable</span><br />\n                                        Variable in which to store the selected folder.<br />\n                                        <em>Default: $INSTDIR</em></p>\n                                    <p>\n                                        <strong>MUI_DIRECTORYPAGE_VERIFYONLEAVE</strong><br />\n                                        Does not disable the Next button when a folder is invalid but allows you to use\n                                        GetInstDirError in the leave function to handle an invalid folder.</p>\n                                </div>\n                                <h3>\n                                    <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgs\" src=\"images/closed.gif\"\n                                        onclick=\"toggle('trigger_pgs', 'toggle_pgs');\" />\n                                    Start Menu folder page settings</h3>\n                                <div class=\"toggle\" id=\"toggle_pgs\">\n                                    <p>\n                                        <strong>MUI_STARTMENUPAGE_TEXT_TOP</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the top of the page.</p>\n                                    <p>\n                                        <strong>MUI_STARTMENUPAGE_TEXT_CHECKBOX</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display next to the checkbox to disable the Start Menu folder creation.</p>\n                                    <p>\n                                        <strong>MUI_STARTMENUPAGE_DEFAULTFOLDER</strong> <span class=\"parameter\">folder</span><br />\n                                        The default Start Menu Folder.</p>\n                                    <p>\n                                        <strong>MUI_STARTMENUPAGE_NODISABLE</strong><br />\n                                        Do not display the checkbox to disable the creation of Start Menu shortcuts.</p>\n                                    <p>\n                                        <strong>MUI_STARTMENUPAGE_REGISTRY_ROOT</strong> <span class=\"parameter\">root</span><br />\n                                        <strong>MUI_STARTMENUPAGE_REGISTRY_KEY</strong> <span class=\"parameter\">key</span><br />\n                                        <strong>MUI_STARTMENUPAGE_REGISTRY_VALUENAME</strong> <span class=\"parameter\">value_name</span><br />\n                                        The registry key to store the Start Menu folder. The page will use it to remember\n                                        the users preference. You should also use for the uninstaller to remove the Start\n                                        Menu folders. Don't forget to remove this key during uninstallation.</p>\n                                    <p>\n                                        For the uninstaller, use the MUI_STARTMENU_GETFOLDER macro to get the Start Menu\n                                        folder:</p>\n                                    <pre>\n!insertmacro MUI_STARTMENU_GETFOLDER page_id $R0\n  Delete &quot;$SMPROGRAMS\\$R0\\Your Shortcut.lnk&quot;\n</pre>\n                                </div>\n                                <h3>\n                                    <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgi\" src=\"images/closed.gif\"\n                                        onclick=\"toggle('trigger_pgi', 'toggle_pgi');\" />\n                                    Installation page settings</h3>\n                                <div class=\"toggle\" id=\"toggle_pgi\">\n                                    <p>\n                                        <strong>MUI_INSTFILESPAGE_FINISHHEADER_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the header of the installation page when the installation has\n                                        been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).</p>\n                                    <p>\n                                        <strong>MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT</strong> <span class=\"parameter\">text</span><br />\n                                        Subtext to display on the header of the installation page when the installation\n                                        has been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).</p>\n                                    <p>\n                                        <strong>MUI_INSTFILESPAGE_ABORTHEADER_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the header of the installation page when the installation has\n                                        been aborted.</p>\n                                    <p>\n                                        <strong>MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT</strong> <span class=\"parameter\">text</span><br />\n                                        Subext to display on the header of the installation page when the installation has\n                                        been aborted.</p>\n                                </div>\n                                <h3>\n                                    <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgf\" src=\"images/closed.gif\"\n                                        onclick=\"toggle('trigger_pgf', 'toggle_pgf');\" />\n                                    Finish page settings</h3>\n                                <div class=\"toggle\" id=\"toggle_pgf\">\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_TITLE</strong> <span class=\"parameter\">title</span><br />\n                                        Title to display on the top of the page.</p>\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_TITLE_3LINES</strong><br />\n                                        Extra space for the title area.</p>\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the page.</p>\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_TEXT_LARGE</strong><br />\n                                        Extra space for the text area (if using checkboxes).</p>\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_BUTTON</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the Finish button.</p>\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_CANCEL_ENABLED</strong><br />\n                                        Enable the Cancel button so the user can skip any options displayed on the finish\n                                        page.</p>\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_TEXT_REBOOT</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the finish page when asking for a system reboot.</p>\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_TEXT_REBOOTNOW</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display next to the 'Reboot now' option button.</p>\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_TEXT_REBOOTLATER</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display next to the 'Reboot later' option button.</p>\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_REBOOTLATER_DEFAULT</strong><br />\n                                        Sets the 'Reboot later' option as the default option.</p>\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_RUN</strong> <span class=\"parameter\">exe_file</span><br />\n                                        Application which the user can select to run using a checkbox. You don't need to\n                                        put quotes around the filename when it contains spaces.</p>\n                                    <div class=\"settings\">\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_RUN_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                            Texts to display next to the 'Run program' checkbox.</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_RUN_PARAMETERS</strong> <span class=\"parameter\">parameters</span><br />\n                                            Parameters for the application to run. Don't forget to escape double quotes in the\n                                            value (use $\\&quot;).</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_RUN_NOTCHECKED</strong><br />\n                                            Do not check the 'Run program' checkbox by default</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_RUN_FUNCTION</strong> <span class=\"parameter\">function</span><br />\n                                            Call a function instead of executing an application (define MUI_FINISHPAGE_RUN without\n                                            parameters). You can use the function to execute multiple applications or you can\n                                            change the checkbox name and use it for other things.</p>\n                                    </div>\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_SHOWREADME</strong> <span class=\"parameter\">file/url</span><br />\n                                        File or website which the user can select to view using a checkbox. You don't need\n                                        to put quotes around the filename when it contains spaces.</p>\n                                    <div class=\"settings\">\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_SHOWREADME_TEXT</strong> <span class=\"parameter\">text</span><br />\n                                            Texts to display next to the 'Show Readme' checkbox.</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_SHOWREADME_NOTCHECKED</strong><br />\n                                            Do not check the 'Show Readme' checkbox by default</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_SHOWREADME_FUNCTION</strong> <span class=\"parameter\">function</span><br />\n                                            Call a function instead of showing a file (define MUI_FINISHPAGE_SHOWREADME without\n                                            parameters). You can use the function to show multiple files or you can change the\n                                            checkbox name and use it for other things.</p>\n                                    </div>\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_LINK</strong> <span class=\"parameter\">link_text</span><br />\n                                        Text for a link on the which the user can click to view a website or file.</p>\n                                    <div class=\"settings\">\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_LINK_LOCATION</strong> <span class=\"parameter\">file/url</span><br />\n                                            Website or file which the user can select to view using the link. You don't need\n                                            to put quotes around the filename when it contains spaces.</p>\n                                        <p>\n                                            <strong>MUI_FINISHPAGE_LINK_COLOR</strong> <span class=\"parameter\">(color: RRGGBB hexadecimal)</span><br />\n                                            Text color for the link on the Finish page.<br />\n                                            <em>Default: 000080</em></p>\n                                    </div>\n                                    <p>\n                                        <strong>MUI_FINISHPAGE_NOREBOOTSUPPORT</strong><br />\n                                        Disables support for the page that allows the user to reboot the system. Define\n                                        this option to save some space if you are not using the /REBOOTOK flag or SetRebootFlag.</p>\n                                </div>\n                                <h3>\n                                    <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_pgu\" src=\"images/closed.gif\"\n                                        onclick=\"toggle('trigger_pgu', 'toggle_pgu');\" />\n                                    Uninstall confirm page settings</h3>\n                                <div class=\"toggle\" id=\"toggle_pgu\">\n                                    <p>\n                                        <strong>MUI_UNCONFIRMPAGE_TEXT_TOP</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display on the top of the page.</p>\n                                    <p>\n                                        <strong>MUI_UNCONFIRMPAGE_TEXT_LOCATION</strong> <span class=\"parameter\">text</span><br />\n                                        Text to display next to the uninstall location text box.</p>\n                                </div>\n                        </div>\n                    </div>\n                    <h2>\n                        4. Language files</h2>\n                    <div>\n                        <p>\n                            Insert the Modern UI language files for the languages to want to include.</p>\n                        <pre>\n!insertmacro MUI_LANGUAGE &quot;English&quot;\n</pre>\n                        <p>\n                            The standard NSIS language files are loaded automatically, there is no need to use\n                            LoadLanguageFile.</p>\n                    </div>\n                    <h2>\n                        5. Reserve files</h2>\n                    <div>\n                        <p>\n                            If you are using solid compression, files that are required before the actual installation\n                            should be stored first in the data block, because this will make your installer\n                            start faster. Include reserve file commands for such files before your sections\n                            and functions:</p>\n                        <pre>\nReserveFile MyPlugin.dll\n!insertmacro MUI_RESERVEFILE_LANGDLL ;Language selection dialog\n...\n</pre>\n                    </div>\n                    <h1>\n                        Script code for pages</h1>\n                    <div>\n                        <p>\n                            Some pages allow you to show additional information or can be used to get user input.\n                            Here you can find the script code to use these features.</p>\n                        <h2>\n                            Components page descriptions</h2>\n                        <div>\n                            <p>\n                                The Modern UI components page has a text box in which a description can be shown\n                                when the user hovers the mouse over a component. If you don't want to use these\n                                descriptions, insert the MUI_COMPONENTSPAGE_NODESC interface setting.</p>\n                            <p>\n                                To set a description for a section, an additional parameter needs to be added to\n                                Section commmand with a unique identifier for the section. This name can later be\n                                used to set the description for this section.</p>\n                            <pre>\nSection &quot;Section Name 1&quot; Section1\n   ...\nSectionEnd\n</pre>\n                            <p>\n                                After the sections, use these macros to set the descriptions:</p>\n                            <pre>\nLangString DESC_Section1 ${LANG_ENGLISH} &quot;Description of section 1.&quot;\nLangString DESC_Section2 ${LANG_ENGLISH} &quot;Description of section 2.&quot;\n\n!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN\n  !insertmacro MUI_DESCRIPTION_TEXT ${Section1} $(DESC_Section1)\n  !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2)\n!insertmacro MUI_FUNCTION_DESCRIPTION_END\n</pre>\n                            <p>\n                                For the uninstaller, use the MUI_UNFUNCTION_DESCRIPTION_BEGIN and MUI_UNFUNCTION_DESCRIPTION_END\n                                macros.</p>\n                        </div>\n                        <h2>\n                            Start Menu folder</h2>\n                        <div>\n                            <p>\n                                Put the code to write the shortcuts (using CreateShortcut) between the MUI_STARTMENU_WRITE_BEGIN\n                                and MUI_STARTMENU_WRITE_END macros:</p>\n                            <pre>\n!insertmacro MUI_STARTMENU_WRITE_BEGIN pageid\n  ...create shortcuts...\n!insertmacro MUI_STARTMENU_WRITE_END\n</pre>\n                            <p>\n                                The page ID should be the ID of the page on which the user has selected the folder\n                                for the shortcuts you want to write.</p>\n                            <p>\n                                The variable which contains the folder and the page ID are set as parameters of\n                                the page macro.</p>\n                        </div>\n                    </div>\n                    <h1>\n                        Language selection dialog</h1>\n                    <div>\n                        <p>\n                            If you want the installer to display a language selection dialog (see the the <a\n                                href=\"../../Examples/Modern%20UI/MultiLanguage.nsi\">MultiLanguage.nsi</a> example),\n                            insert the MUI_LANGDLL_DISPLAY macro in the .onInit function:</p>\n                        <pre>\nFunction .onInit\n\n  !insertmacro MUI_LANGDLL_DISPLAY\n\nFunctionEnd\n</pre>\n                        <p>\n                            This macro can also be used in the un.onInit function.</p>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_lss\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_lss', 'toggle_lss');\" />\n                            Settings for registry storage of selected language</h3>\n                        <div class=\"toggle\" id=\"toggle_lss\">\n                            <p>\n                                To remember the user's preference, you can define a registry key. These defines\n                                should be set before inserting the installation page macro.</p>\n                            <p>\n                                <strong>MUI_LANGDLL_REGISTRY_ROOT</strong> <span class=\"parameter\">root</span><br />\n                                <strong>MUI_LANGDLL_REGISTRY_KEY</strong> <span class=\"parameter\">key</span><br />\n                                <strong>MUI_LANGDLL_REGISTRY_VALUENAME</strong> <span class=\"parameter\">value_name</span><br />\n                                The registry key to store the language. The users preference will be remembered.\n                                You can also use it for the uninstaller to display the right language. Don't forget\n                                to remove this key in the uninstaller.</p>\n                            <p>\n                                For the uninstaller, insert the MUI_UNGETLANGUAGE macro in un.onInit to get the\n                                stored language preference:</p>\n                            <pre>\nFunction un.onInit\n\n  !insertmacro MUI_UNGETLANGUAGE\n\nFunctionEnd\n</pre>\n                        </div>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_lsin\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_lsin', 'toggle_lsin');\" />\n                            Interface settings for selection dialog</h3>\n                        <div class=\"toggle\" id=\"toggle_lsin\">\n                            <p>\n                                To customize the language selection dialog interface, use these defines before inserting\n                                the MUI_LANGDLL_DISPLAY macro.</p>\n                            <p>\n                                <strong>MUI_LANGDLL_WINDOWTITLE</strong> <span class=\"parameter\">text</span><br />\n                                The window title of the language selection dialog.</p>\n                            <p>\n                                <strong>MUI_LANGDLL_INFO</strong> <span class=\"parameter\">text</span><br />\n                                The text to display on the language selection dialog.</p>\n                            <p>\n                                <strong>MUI_LANGDLL_ALWAYSSHOW</strong><br />\n                                Always show the language selection dialog, even if a language has been stored in\n                                the registry. The language stored in the registry will be selected by default.</p>\n                            <p>\n                                <strong>MUI_LANGDLL_ALLLANGUAGES</strong><br />\n                                Always show all available languages and don't filter according to their codepage.</p>\n                        </div>\n                    </div>\n                    <h1>\n                        Custom pages</h1>\n                    <div>\n                        <p>\n                            If you want add your custom pages to your installer, you can insert your own page\n                            commands between the page macros.</p>\n                        <pre>\n!insertmacro MUI_PAGE_WELCOME\nPage custom FunctionName ;Custom page\n!insertmacro MUI_PAGE_COMPONENTS\n \n;Uninstaller\n!insertmacro MUI_UNPAGE_CONFIRM\nUninstPage custom un.FunctionName ;Custom page\n!insertmacro MUI_UNPAGE_INSTFILES\n</pre>\n                        <p>\n                            Use the MUI_HEADER_TEXT macro to set the text on the page header in a page function:</p>\n                        <pre>\nLangString PAGE_TITLE ${LANG_ENGLISH} &quot;Title&quot;\nLangString PAGE_SUBTITLE ${LANG_ENGLISH} &quot;Subtitle&quot;\n\nFunction CustomPageFunction\n  !insermacro MUI_HEADER_TEXT $(PAGE_TITLE) $(PAGE_SUBTITLE)\n  ...\nFuctionEnd\n</pre>\n                    </div>\n                    <h1>\n                        Custom functions</h1>\n                    <div>\n                        <p>\n                            Interface functions provided by NSIS, like the .onGUIInit function and the page\n                            functions are automatically included by the Modern UI and filled with code to support\n                            new interface features. If you want to add additional code to these function, create\n                            a function with the custom script code in the script use the Modern UI functions\n                            call them.</p>\n                        <p>\n                            Example:</p>\n                        <pre class=\"text\">\n!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit\n\nFunction myGUIInit\n  ...\nFunctionEnd</pre>\n                        <p>\n                            Modern UI pages can also customized using custom functions.</p>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_cfg\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_cfg', 'toggle_cfg');\" />\n                            General Custom Functions</h3>\n                        <div class=\"toggle\" id=\"toggle_cfg\">\n                            <p>\n                                These defines should be set before inserting the language macros.</p>\n                            <p>\n                                <strong>MUI_CUSTOMFUNCTION_GUIINIT</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_CUSTOMFUNCTION_UNGUIINIT</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_CUSTOMFUNCTION_ABORT</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_CUSTOMFUNCTION_UNABORT</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION</strong> <span class=\"parameter\">function</span></p>\n\t\t\t\t\t\t\t<p>\n                                Mouse over functions are only available when the description macros\n\t\t\t\t\t\t\t\t(MUI_FUNCTION_DESCRIPTION_BEGIN) are used. When component page descriptions are not\n\t\t\t\t\t\t\t\tused, regular .onMouseOverSection and un.onMouseOverSection must be used.</p>\n                        </div>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_cfpg\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_cfpg', 'toggle_cfpg');\" />\n                            Page Custom Functions</h3>\n                        <div class=\"toggle\" id=\"toggle_cfpg\">\n                            <p>\n                                These defines should be set before inserting a page macro.</p>\n                            <p>\n                                <strong>MUI_PAGE_CUSTOMFUNCTION_PRE</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_PAGE_CUSTOMFUNCTION_SHOW</strong> <span class=\"parameter\">function</span><br />\n                                <strong>MUI_PAGE_CUSTOMFUNCTION_LEAVE</strong> <span class=\"parameter\">function</span><br />\n                            </p>\n                            <p>\n                                The pre function is called first and allows you to initalize variables or decide\n                                whether the page should be skipped. Then, the show function is called, which can\n                                be used to customize the interface. Finally, the user input can be validated in the\n\t\t\t\t\t\t\t\tleave function. The NSIS Users Manual provides more information about these functions.</p>\n                            <p>\n                                In the show function, the window handles of all controls on the page can be retrieved\n                                from a Modern UI variable. A list of the variables names is not yet available. For\n                                now, refer to the source files of the Modern UI 2.0. The variable declarations can\n                                be found in the first lines of the header file for a certain page.</p>\n                        </div>\n                    </div>\n                    <h1>\n                        <a name=\"examples\" id=\"examples\">Example scripts</a></h1>\n                    <div>\n                        <p>\n                            Basic: <a href=\"../../Examples/Modern%20UI/Basic.nsi\">Basic.nsi</a><br />\n                            Welcome/Finish page: <a href=\"../../Examples/Modern%20UI/WelcomeFinish.nsi\">WelcomeFinish.nsi</a><br />\n                            Multiple languages: <a href=\"../../Examples/Modern%20UI/MultiLanguage.nsi\">MultiLanguage.nsi</a><br />\n                            Header image: <a href=\"../../Examples/Modern%20UI/HeaderBitmap.nsi\">HeaderBitmap.nsi</a><br />\n                            Start Menu Folder page: <a href=\"../../Examples/Modern%20UI/StartMenu.nsi\">StartMenu.nsi</a></p>\n                    </div>\n                    <h1>\n                        Credits</h1>\n                    <div>\n                        <p>\n                            Written by Joost Verburg.<br />\n                            Icons designed by Nikos Adamamas, aka adni18.<br />\n                            Thanks to Amir Szekely, aka KiCHiK, for his work on NSIS to make this possible.</p>\n                    </div>\n                    <h1>\n                        License</h1>\n                    <div>\n                        <p>\n                            The zlib/libpng license applies to the Modern UI.</p>\n                        <h3>\n                            <img class=\"trigger\" alt=\"Open/Close section\" id=\"trigger_lic\" src=\"images/closed.gif\"\n                                onclick=\"toggle('trigger_lic', 'toggle_lic');\" />\n                            License Terms</h3>\n                        <div class=\"toggle\" id=\"toggle_lic\">\n                            <pre>\nCopyright &copy; 2002-2009 Joost Verburg\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; \n   you must not claim that you wrote the original software.\n   If you use this software in a product, an acknowledgment in the\n   product documentation would be appreciated but is not required.\n2. Altered versions must be plainly marked as such,\n   and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any distribution.\n</pre>\n                        </div>\n                    </div>\n                </div>\n            </td>\n        </tr>\n    </table>\n</body>\n</html>\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/MultiUser/Readme.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html>\n<head>\n    <title>Multi-User Header File (MultiUser.nsh)</title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\" />\n    <style type=\"text/css\">\n        td\n        {\n            padding: 5px;\n            vertical-align: top;\n            border-bottom: 1px solid black;\n        }\n    </style>\n</head>\n<body>\n    <h1>\n        Multi-User Header File (MultiUser.nsh)</h1>\n    <p>\n        <i>Installer configuration for multi-user Windows environments</i></p>\n    <h2>\n        Table of Contents</h2>\n    <ul>\n        <li><a href=\"#introduction\">Introduction</a></li>\n        <li><a href=\"#executionlevel\">Initalization and Execution Level</a>\n            <li><a href=\"#installationmode\">Installation Mode</a></ul>\n    <h2>\n        <a name=\"introduction\"></a>Introduction</h2>\n    <p>\n        Modern Windows versions support multiple users accounts on a single computer, each\n        with different privileges. For security reasons, the privileges of applications\n        can also be limited. For an installer, the <i>execution level</i> and <i>installation\n            mode</i> are important. The execution level determines the privileges of the\n        installer application. For example, to install hardware drivers, administrator privileges\n        are required. Applications can also be installed for a single user or for all users\n        on a computer, which is determined by the installation mode. Installation for all\n        users requires a higher execution level as compared with a single user setup. The\n        MultiUser.nsh header files provides the features to automatically handle all these\n        aspects related to user accounts and installer privileges.</p>\n    <p>\n        Note that all settings need to be set before including the MultiUser.nsh header\n        file.</p>\n    <h2>\n        Initialization and <a name=\"executionlevel\"></a>Execution Level&nbsp;</h2>\n    <p>\n        Before the MultiUser.nsh file is included, the MULTIUSER_EXECUTIONLEVEL define should\n        be set to one of the following values depending on the execution level that is required:</p>\n    <table>\n        <tr>\n            <td>\n                <b>Value </b>\n            </td>\n            <td>\n                <b>Description</b>\n            </td>\n            <td>\n                <b>Typical application</b>\n            </td>\n        </tr>\n        <tr>\n            <td>\n                Admin\n            </td>\n            <td>\n                Administrator privileges are required\n            </td>\n            <td>\n                Access data of all users accounts\n            </td>\n        </tr>\n        <tr>\n            <td>\n                Power\n            </td>\n            <td>\n                Power User privileges are required<br />\n                (Power Users no longer exist in Windows Vista. For Vista this is equivalent to Admin)\n            </td>\n            <td>\n                Installation for all users (writing to &quot;Program Files&quot; or HKLM registry\n                keys), driver installation\n            </td>\n        </tr>\n        <tr>\n            <td>\n                Highest\n            </td>\n            <td>\n                Request the highest possible execution level for the current user\n            </td>\n            <td>\n                Mixed-mode installer that can both be installed per-machine or per-user\n            </td>\n        </tr>\n        <tr>\n            <td>\n                Standard\n            </td>\n            <td>\n                No special rights required\n            </td>\n            <td>\n                Installation for current user only\n            </td>\n        </tr>\n    </table>\n    <p>\n        Insert the MULTIUSER_INIT and MULTIUSER_UNINT macros in the .onInit and un.onInit\n        function to verify these privileges. If no uninstaller is created in the script,\n        set MULTIUSER_NOUNINSTALL.</p>\n    <blockquote>\n        <pre>!define MULTIUSER_EXECUTIONLEVEL Highest\n;!define MULTIUSER_NOUNINSTALL ;Uncomment if no uninstaller is created\n!include MultiUser.nsh\n\n...\n\nFunction .onInit\n  !insertmacro MULTIUSER_INIT\nFunctionEnd\n\nFunction un.onInit\n  !insertmacro MULTIUSER_UNINIT\nFunctionEnd</pre>\n    </blockquote>\n    <p>\n        Whether the required privileges can be obtained depends on the user that starts\n        the installer:</p>\n    <ul>\n        <li>Windows NT 4/2000/XP/2003 give the installer the same privileges as the user itself.\n            If the privileges of the user are not sufficient (e.g. Admin level is required is\n            set but the user has no administrator rights), the macros will display an error\n            message and quit the installer. If is however possible to manually run the installer\n            with an administrator account.</li>\n        <li>Windows Vista restricts the privileges of all applications by default. Depending\n            on requested execution level, MultiUser.nsh will set the RequestExecutionLevel flag\n            to request privileges. The user will be asked for confirmation and (if necessary)\n            for an administrator password.</li>\n        <li>Windows 95/98/98 do not set any restrictions on users or applications. Administrator\n            rights are always available.</li>\n    </ul>\n    <p>\n        It is recommended to insert these initialization macros before macros that require\n        user intervention. For example, it does not make sense to ask a user for an installer\n        language if the installer will quit afterwards because the user account does not\n        have the required privileges. After the macros are inserted, the variable $MultiUser.Privileges\n        will contain the current execution level (Admin, Power, User or Guest).</p>\n    <p>\n        The following additional settings are available to customize the initialization:</p>\n    <table>\n        <tr>\n            <td>\n                <b>Setting<td>\n                    <b>Description</b>\n                </td>\n        </tr>\n        <tr>\n            <td>\n                MULTIUSER_INIT_TEXT_ADMINREQUIRED\n            </td>\n            <td>\n                Error message to be displayed when administrator rights are required but not available.\n            </td>\n        </tr>\n        <tr>\n            <td>\n                MULTIUSER_INIT_TEXT_POWERREQUIRED\n            </td>\n            <td>\n                Error message to be displayed when Power User rights are required but not available.\n            </td>\n        </tr>\n        <tr>\n            <td>\n                MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE\n            </td>\n            <td>\n                Error message to be displayed when administrator or Power User rights are required\n                because of an installation mode setting on the command line (see below) but are\n                not available.\n            </td>\n        </tr>\n        <tr>\n            <td>\n                MULTIUSER_INIT_FUNCTIONQUIT<br />\n                MULTIUSER_INIT_UNFUNCTIONQUIT\n            </td>\n            <td>\n                A custom function to be called when the installer is closed due to insufficient\n                privileges.\n            </td>\n        </tr>\n    </table>\n    <h2>\n        <a name=\"installationmode\"></a>Installation Mode</h2>\n    <p>\n        As mentioned before, applications can both be installed for a single users or for\n        all users on a computer. Applications for all users are typically installed in the\n        Program Files folder and appear in the Start Menu of every user. On the contrary,\n        applications for a single user are usually installed in the local Application Data\n        folder and only a appear in the Start Menu of the user who installed the application.</p>\n    <p>\n        By default, MultiUser.nsh will set the installation mode for a per-machine installation\n        if Administrator or Power User rights are available (this is always the case if\n        the execution level is set to Admin or Power, if Highest is set it depends on the\n        user account). For the Standard execution level the installation will always be\n        for a single user. On Windows 95/98/Me installation for a single user is not possible.</p>\n    <p>\n        The following settings are available to change the default installation mode:\n        <table>\n            <tr>\n                <td>\n                    <b>Setting</b>\n                </td>\n                <td>\n                    <b>Description</b>\n                </td>\n                </td>\n            </tr>\n            <tr>\n                <td>\n                    MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER\n                </td>\n                <td>\n                    Set default to a per-user installation, even if the rights for a per-machine installation\n                    are available.\n                </td>\n            </tr>\n            <tr>\n                <td>\n                    MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME\n                </td>\n                <td>\n                    Non-empty registry key that is created during the installation in either HKCU or\n                    HKLM. The default installation mode will automatically be set to the previously\n                    selected mode depending on the location of the key.\n                </td>\n            </tr>\n        </table>\n        <p>\n            After initialization, the variable $MultiUser.InstallMode will contain the current\n            installation mode (AllUsers or CurrentUser).\n        </p>\n        <h3>\n            Mixed-Mode Installation</h3>\n        <p>\n            For the Admin and Power levels, both a per-machine as well as a per-user installation\n            is possible. If the Highest level is set and the user is an Administrator or Power\n            User, both options are also available.</p>\n        <p>\n            Usually it's a good thing to give the user to choice between these options. For\n            users of the Modern UI version 2, a page is provided that asks the user for the\n            installation mode. To use this page, define MULTIUSER_MUI before including User.nsh.\n            Then, the MULTIUSER_PAGE_INSTALLMODE macro can be used just like a normal Modern\n            UI page (this page will automatically be skipped when running Windows 95/98/Me):</p>\n        <pre>!define MULTIUSER_EXECUTIONLEVEL Highest\n<b>!define MULTIUSER_MUI</b>\n!define MULTIUSER_INSTALLMODE_COMMANDLINE\n!include MultiUser.nsh\n!include MUI2.nsh\n\n<b>!insertmacro MULTIUSER_PAGE_INSTALLMODE</b>\n!insertmacro MUI_PAGE_DIRECTORY\n!insertmacro MUI_PAGE_INSTFILES \n\n!insertmacro MUI_LANGUAGE English\n\n...\n\nFunction .onInit\n  !insertmacro MULTIUSER_INIT\nFunctionEnd\n\nFunction un.onInit\n  !insertmacro MULTIUSER_UNINIT\nFunctionEnd\n</pre>\n        <p>\n            The MULTIUSER_INSTALLMODE_COMMANDLINE setting that also appears in this example\n            enables the installation mode to be set using the /AllUsers or /CurrentUser command\n            line parameters. This is especially useful for silent setup.</p>\n        <p>\n            The following settings can be used to customize the texts on the page (in addition\n            to the general Modern UI page settings):</p>\n        <table>\n            <tr>\n                <td>\n                    <b>Setting</b>\n                </td>\n                <td>\n                    <b>Description</b>\n                </td>\n            </tr>\n            <tr>\n                <td>\n                    MULTIUSER_INSTALLMODEPAGE_TEXT_TOP\n                </td>\n                <td>\n                    Text to display on the top of the page.\n                </td>\n            </tr>\n            <tr>\n                <td>\n                    MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS\n                </td>\n                <td>\n                    Text to display on the combo button for a per-machine installation.\n                </td>\n            </tr>\n            <tr>\n                <td>\n                    MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER\n                </td>\n                <td>\n                    Text to display on the combo button for a per-user installation.\n                </td>\n            </tr>\n        </table>\n        <h3>\n            Installation Mode Initalization</h3>\n        <p>\n            The SetShellVarContext flag (which determines the folders for e.g. shortcuts, like\n            $DESKTOP) is automatically set depending on the installation mode. In addition,\n            the following settings can be used to perform additional actions when the installation\n            mode is initialized:</p>\n        <table>\n            <tr>\n                <td>\n                    <b>Setting</b>\n                </td>\n                <td>\n                    <b>Description</b>\n                </td>\n                </td>\n            </tr>\n            <tr>\n                <td>\n                    MULTIUSER_INSTALLMODE_INSTDIR\n                </td>\n                <td>\n                    Name of the folder in which to install the application, without a path. This folder\n                    will be located in Program Files for a per-machine installation and in the local\n                    Application Data folder for a per-user installation (if supported).\n                </td>\n            </tr>\n            <tr>\n                <td>\n                    MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME\n                </td>\n                <td>\n                    Registry key from which to obtain a previously stored installation folder. It will\n                    be retrieved from HKCU for per-user and HKLM for per-machine.\n                </td>\n            </tr>\n            <tr>\n                <td>\n                    MULTIUSER_INSTALLMODE_FUNCTION<br />\n                    MULTIUSER_INSTALLMODE_UNFUNCTION\n                </td>\n                <td>\n                    A custom fuction to be called during the initialization of the installation mode\n                    to set additional installer settings that depend on the mode\n                </td>\n        </table>\n        <p>\n            To set the installation mode manually, call one of these four functions:</p>\n        <table>\n            <tr>\n                <td>\n                    <b>Function name</b>\n                </td>\n                <td>\n                    <b>Installation mode</b>\n                </td>\n            </tr>\n            <tr>\n                <td>\n                    MultiUser.InstallMode.AllUsers\n                </td>\n                <td>\n                    Installer: Per-machine installation\n                </td>\n            </tr>\n            <tr>\n                <td>\n                    MultiUser.InstallMode.CurrentUser\n                    <td>\n                        Installer: Per-user installation\n                    </td>\n            </tr>\n            <tr>\n                <td>\n                    un.MultiUser.InstallMode.AllUsers<td>\n                        Uninstaller: Per-machine installation\n                    </td>\n            </tr>\n            <tr>\n                <td>\n                    un.MultiUser.InstallMode.CurrentUser<td>\n                        Uninstaller: Per-user installation\n                    </td>\n            </tr>\n        </table>\n</body>\n</html>\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/NSISdl/License.txt",
    "content": "NSISdl 1.1 - HTTP downloading plugin for NSIS\nCopyright (C) 2001-2002 Yaroslav Faybishenko & Justin Frankel\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution."
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/NSISdl/ReadMe.txt",
    "content": "NSISdl 1.3 - HTTP downloading plugin for NSIS\n---------------------------------------------\n\nCopyright (C) 2001-2002 Yaroslav Faybishenko & Justin Frankel\n\nThis plugin can be used from NSIS to download files via http.\n\nTo connect to the internet, use the Dialer plugin.\n\nUSAGE\n-----\n\nNSISdl::download http://www.domain.com/file localfile.exe\n\nYou can also pass /TIMEOUT to set the timeout in milliseconds:\n\nNSISdl::download /TIMEOUT=30000 http://www.domain.com/file localfile.exe\n\nThe return value is pushed to the stack:\n\n  \"cancel\" if cancelled\n  \"success\" if success\n  otherwise, an error string describing the error\n\nIf you don't want the progress window to appear, use NSISdl::download_quiet.\n\nExample of usage:\n\nNSISdl::download http://www.domain.com/file localfile.exe\nPop $R0 ;Get the return value\n  StrCmp $R0 \"success\" +3\n    MessageBox MB_OK \"Download failed: $R0\"\n    Quit\n\nFor another example, see waplugin.nsi in the examples directory.\n\nPROXIES\n-------\n\nNSISdl supports only basic configurations of proxies. It doesn't support\nproxies which require authentication, automatic configuration script, etc.\nNSISdl reads the proxy configuration from Internet Explorer's registry key\nunder HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings. It\nreads and parses ProxyEnable and ProxyServer.\n\nIf you don't want NSISdl to use Internet Explorer's settings, use the\n/NOIEPROXY flag. /NOIEPROXY should be used after /TRANSLATE and\n/TIMEOUT. For example:\n\nIf you want to specify a proxy on your own, use the /PROXY flag.\n\nNSISdl::download /NOIEPROXY http://www.domain.com/file localfile.exe\nNSISdl::download /TIMEOUT=30000 /NOIEPROXY http://www.domain.com/file localfile.exe\nNSISdl::download /PROXY proxy.whatever.com http://www.domain.com/file localfile.exe\nNSISdl::download /PROXY proxy.whatever.com:8080 http://www.domain.com/file localfile.exe\n\nTRANSLATE\n---------\n\nTo translate NSISdl add the following values to the call line:\n\n/TRANSLATE2 downloading connecting second minute hour seconds minutes hours progress\n\nDefault values are:\n \n  downloading - \"Downloading %s\"\n  connecting - \"Connecting ...\"\n  second - \" (1 second remaining)\"\n  minute - \" (1 minute remaining)\"\n  hour - \" (1 hour remaining)\"\n  seconds - \" (%u seconds remaining)\"\n  minutes - \" (%u minutes remaining)\"\n  hours - \" (%u hours remaining)\"\n  progress - \"%skB (%d%%) of %skB @ %u.%01ukB/s\"\n\nThe old /TRANSLATE method still works for backward compatibility.\n\n/TRANSLATE downloading connecting second minute hour plural progress remianing\n\nDefault values are:\n\n  downloading - \"Downloading %s\"\n  connecting - \"Connecting ...\"\n  second - \"second\"\n  minute - \"minute\"\n  hour - \"hour\"\n  plural - \"s\"\n  progress - \"%dkB (%d%%) of %ukB @ %d.%01dkB/s\"\n  remaining -  \" (%d %s%s remaining)\"\n\n/TRANSLATE and /TRANSLATE2 must come before /TIMEOUT.\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/Splash/splash.txt",
    "content": "Splash.dll - small (4k), simple plugin that lets you throw \nup a splash screen in NSIS installers.\n\n--- UPDATED in 2.0b0 - will break old scripts ---\n\nTo use:\n\nCreate a .BMP file of your splash screen.\n(optional) Create a .WAV file to play while your splash screen shows.\n\nAdd the following lines to your .NSI file:\n\nFunction .onInit\n  SetOutPath $TEMP\n  File /oname=spltmp.bmp \"my_splash.bmp\"\n\n; optional\n; File /oname=spltmp.wav \"my_splashshit.wav\"\n\n  splash::show 1000 $TEMP\\spltmp\n\n  Pop $0 ; $0 has '1' if the user closed the splash screen early,\n\t ; '0' if everything closed normally, and '-1' if some error occurred.\n\n  Delete $TEMP\\spltmp.bmp\n;  Delete $TEMP\\spltmp.wav\nFunctionEnd\n\nNote that the first parameter to splash.exe is the length to show the\nscreen for (in milliseconds), and the second is the splash bitmap filename (without\nthe .bmp). The BMP file used will be this parameter.bmp, and the wave file used\n(if present) will be this parameter.wav.\n\n(If you already have an .onInit function, put that in it)\n\nNote: the return value of splash is 1 if the user closed the splash \nscreen early (pop it from the stack)\n\n-Justin\n\nConverted to a plugin DLL by Amir Szekely (kichik)\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/StartMenu/Readme.txt",
    "content": "StartMenu.dll shows a custom page that lets the user select a start menu program \nfolder to put shortcuts in.\n\nTo show the dialog use the Select function. This function has one required parameter \nwhich is the program group default name, and some more optional switches:\n  /autoadd - automatically adds the program name to the selected folder\n  /noicon - doesn't show the icon in the top left corner\n  /text [please select...] - sets the top text to something else than\n                             \"Select the Start Menu folder in which...\"\n  /lastused [folder] - sets the edit box to a specific value folder.\n                       Use this to make this plug-in remember the last\n                       folder selected by the user\n  /checknoshortcuts text - Shows a check box with the text \"text\". If\n                           the user checks this box, the return value\n                           will have > as its first character and you\n                           should not create the program group.\n  /rtl - sets the direction of every control on the selection dialog\n         to RTL. This means every text shown on the page will be\n\t justified to the right.\n\nThe order of the switches doesn't matter but the required parameter must come after\nall of them. Every switch after the required parameter will be ignored and left\non the stack.\n\nThe function pushes \"success\", \"cancel\" or an error to the stack. If there was no\nerror and the user didn't press on cancel it will push the selected folder name\nafter \"success\". If the user checked the no shortcuts checkbox the result will be\nprefixed with '>'. The function does not push the full path but only the selected\nsub-folder. It's up to you to decide if to put it in the current user or all\nusers start menu.\n\nTo set properties of the controls on the page, such as colors and fonts use Init\nand Show instead of Select. Init will push the HWND of the page on the stack,\nor an error string. For example:\n\nStartMenu::Init \"Test\"\nPop $0\nIntCmp $0 0 failed\nGetDlgItem $0 $0 1003\nSetCtlColors $0 \"\" FF0000\nStartMenu::Show\n# continue as with Select here\nfailed:\n\nLook at Example.nsi for a full example (without Init and Select).\n\nCreated by Amir Szekely (aka KiCHiK)"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/StrFunc/StrFunc.txt",
    "content": "String Functions Header File Readme\n-----------------------------------\n\nString Functions Header File contains a set of good string manipulation\nfunctions in a much simpler way to include and call in NSIS scripts.\n\nHow to use\n----------\n\n  Basic Syntax\n  ------------\n\n  Parameters are specified in this format:\n  required (required) (option1 | option2) [optional or add. options]\n  [option1 | option2]\n\n  The stars in command titles (*****) are the function usefulness in my\n  opinion. The more starts, the more useful it is. 5 stars (*****) is the\n  most useful.\n\n  Any time when is mentioned \"Default is\" means that you can use the value\n  mentioned or keep it blank, the result is the same.\n\n  If you want a certain value (e.g. a text) to be language-specific, set a\n  language string (using LangString) and define $(STRINGNAME) as value.\n\n  If you want to add ` to a string, you should always escape it using $\\`\n  because the header file macro functions use ` to separate parameters.\n\n  1. Include Header file\n  ----------------------\n\n    !include \"StrFunc.nsh\"\n\n    StrFunc.nsh has to be inside Include directory, so you don't have to\n    specify a path.\n\n    You have to put this command before any command used in this header file.\n\n  2. Defines\n  ----------\n\n    This header file contains defines that automate the life of some who\n    fear a lot of changes sometimes imposed in this header file, or who have\n    applications that put it to work at maximum capacity. Before you try\n    these, take a look at the information below:\n\n      - Every item on a define value is separated by a \"|\", and every subitem\n        (items in an item) is separated by \" \".\n\n      - Use ${StrTok} $var \"${DefineName}\" \"|\" \"$counter\" \"0\" to get every\n        item inside the define. For subitems, use ${StrTok} $var2 \"$var\" \" \"\n        \"$counter2\" \"0\" after getting the value for a desired item.\n\n      - ${StrFunc_List} is automatically made by the header file. The rest\n        is manually added to the header.\n\n    2.1 Defines List:\n    -----------------\n\n    StrFunc_List - Lists all function names currently available on StrFunc\n                   header file.\n\n    *_List       - Lists all parameter names currently available for \"*\"\n                   function. (* = function name - i.e. StrTok_List).\n\n    *_TypeList   - Lists the types of all parameters on \"*\" function.\n                   (* = function name - i.e. StrTok_List). Possible types\n                   for each parameter:\n\n                   - Output - Needs a variable to output a function result.\n\n                   - Text   - Needs text or number to be input.\n\n                   - Mixed  - Needs text, number or option to be inputed.\n                              Each subitem following the \"Mixed\" word is an\n                              option. The first option is ever the default\n                              one. Two following spaces \"  \" means that\n                              that subitem is empty.\n\n                   - Option - Needs an option to be inputed. Each subitem\n                              following the \"Option\" word is an option.\n                              The first option is ever the default one. Two\n                              following spaces \"  \" means that that subitem\n                              is empty.\n\n  3. Commands\n  -----------\n\n  Some commands have special specifications to work. Consult command's\n  documentation on \"3.3 Commands\" section.\n\n    3.1 How To Use Commands In Install Sections and Functions\n    ---------------------------------------------------------\n\n    Every command used in install sections and functions have to be called\n    first before and out of any sections and functions, and without\n    parameters.\n\n    Example:\n    --------\n\n    ${StrStr}\n    \n    3.2 How To Use Commands In Uninstall Sections and Functions\n    -----------------------------------------------------------\n\n    Commands with Uninstall Sections and Functions support have \"Un\" before\n    the words inside curly brackets \"{}\".\n\n    Example:\n    --------\n    \n    ${UnStrStr}\n\n    A complete example with both Install and Uninstall Commands:\n    ------------------------------------------------------------\n\n\n    !include \"StrFunc.nsh\"\n\n    ${StrStr} # Supportable for Install Sections and Functions\n\n    ${UnStrStr} # Supportable for Uninstall Sections and Functions\n\n    Section\n\n      ${StrStr} $0 \"OK! Now what?\" \"wh\"\n\n    SectionEnd\n\n    Section Uninstall\n\n      ${UnStrStr} $0 \"OK! Now what?\" \"wh\"\n\n    SectionEnd\n\n    3.3 Commands\n    ------------\n\n    =========================================================================\n    **                                                             ${StrCase}\n    -------------------------------------------------------------------------\n    ResultVar String Type(|L|U|T|S|<>)\n    =========================================================================\n    Converts \"String\" to \"Type\" Case. Uses LogicLib.\n\n    Parameters:\n\n      ResultVar\n      Destination where result is returned.\n\n      String\n      String to convert to \"Type\" case.\n      \n      Type\n      Type of string case to convert to:\n\n        - \"\" = Original Case (same as \"String\")\n        - L = Lower Case (this is just an example. a very simple one.)\n        - U = Upper Case (THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE.)\n        - T = Title Case (This Is Just An Example. A Very Simple One.)\n        - S = Sentence Case (This is just an example. A very simple one.)\n        - <> = Switch Case (This is just an example. A very simple one.)\n        \n      Default value is \"\" (Original Case).\n\n    Result Value -> ResultVar:\n\n      \"String\" in \"Type\" case.\n\n    Example:\n\n      ${StrCase} $0 '\"Voc\" is \"You\" in English.' \"U\"\n                    [__(_)__()___()__()__(____)_]\n\n      $0 = '\"VOC\" IS \"YOU\" IN ENGLISH.'\n\n    =========================================================================\n    *                                                               ${StrClb}\n    -------------------------------------------------------------------------\n    ResultVar String Action(|>|<|<>)\n    =========================================================================\n    Makes an action with the clipboard depending on value of parameter\n    \"Action\". Uses LogicLib.\n\n    Parameters:\n\n      String\n      If \"Action\" = \">\" or \"<>\" - String to put on the clipboard.\n\n      Action\n      Can be one of the following values:\n\n        - \"\" = Cleans the clipboard.\n        - \">\" = Set string to clipboard.\n        - \"<\" = Get string from clipboard.\n        - \"<>\" = Swap string with clipboard's.\n\n    Result Value -> ResultVar:\n\n      If \"Action\" = \"<\" or \"<>\" - String found on the clipboard.\n\n    =========================================================================\n    ***                                                        ${StrIOToNSIS}\n    -------------------------------------------------------------------------\n    ResultVar String\n    =========================================================================\n    Convert \"String\" from Install Options plugin to be supported by NSIS.\n    Escape, back-slash, carriage return, line feed and tab characters are\n    converted.\n\n    Parameters:\n\n      ResultVar\n      Destination where result is returned.\n\n      String\n      String to convert to be supportable for NSIS.\n\n    Result Value -> ResultVar:\n\n      \"String\" supportable for NSIS.\n\n    Example:\n\n      ${StrIOToNSIS} $0 \"\\r\\n\\t\\\\This is just an example\\\\\"\n                        [()()()()_______________________()]\n\n      $0 = \"$\\r$\\n$\\t\\This is just an example\\\"\n\n    =========================================================================\n    *                                                               ${StrLoc}\n    -------------------------------------------------------------------------\n    ResultVar String StrToSearchFor CounterDirection(>|<)\n    =========================================================================\n    Searches for \"StrToSearchFor\" in \"String\" and returns its location,\n    according to \"CounterDirection\".\n\n    Parameters:\n\n      ResultVar\n      Destination where result is returned.\n\n      String\n      String where to search \"StrToSearchFor\".\n\n      StrToSearchFor\n      String to search in \"String\".\n\n      CounterDirection(>|<)\n      Direction where the counter increases to. Default is \">\".\n      (> = increases from left to right, < = increases from right to left)\n\n    Result Value -> ResultVar:\n\n      Where \"StrToSearchFor\" is, according to \"OffsetDirection\".\n\n    Example: \n\n      ${StrLoc} $0 \"This is just an example\" \"just\" \"<\"\n                            (__)<<<<<<<<<<<\n\n      $0 = \"11\"\n\n    =========================================================================\n    ***                                                        ${StrNSISToIO}\n    -------------------------------------------------------------------------\n    ResultVar String\n    =========================================================================\n    Converts \"String\" from NSIS to be supported by Install Options plugin.\n    Escape, back-slash, carriage return, line feed and tab characters are\n    converted.\n\n    Parameters:\n\n      ResultVar\n      Destination where result is returned.\n\n      String\n      String to convert to be supportable for Install Options plugin.\n\n    Result Value -> ResultVar:\n\n      \"String\" supportable for Install Options plugin.\n\n    Example:\n\n      ${StrNSISToIO} $0 \"$\\r$\\n$\\t\\This is just an example\\\"\n                        [(_)(_)(_)^_______________________^]\n\n      $0 = \"\\r\\n\\t\\\\This is just an example\\\\\"\n\n    =========================================================================\n    *****                                                           ${StrRep}\n    -------------------------------------------------------------------------\n    ResultVar String StrToReplace ReplacementString\n    =========================================================================\n    Searches for all \"StrToReplace\" in \"String\" replacing those with\n    \"ReplacementString\".\n\n    Parameters:\n\n      ResultVar\n      Destination where result is returned.\n\n      String\n      String where to search \"StrToReplace\".\n\n      StrToReplaceFor\n      String to search in \"String\".\n\n      StringToBeReplacedWith\n      String to replace \"StringToReplace\" when it is found in \"String\".\n\n    Result Value -> ResultVar:\n\n      \"String\" with all occurrences of \"StringToReplace\" replaced with\n      \"ReplacementString\".\n\n    Example: \n\n      ${StrRep} $0 \"This is just an example\" \"an\" \"one\"\n                    [____________()_______]\n\n      $0 = \"This is just one example\"\n\n    =========================================================================\n    ***                                                            ${StrSort}\n    -------------------------------------------------------------------------\n    ResultVar String LeftStr CenterStr RightStr IncludeLeftStr(1|0)\n    IncludeCenterStr(1|0) IncludeRightStr(1|0)\n    =========================================================================\n    Searches for \"CenterStr\" in \"String\", and returns only the value\n    between \"LeftStr\" and \"RightStr\", including or not the \"CenterStr\" using\n    \"IncludeCenterStr\" and/or the \"LeftStr\" using \"IncludeLeftStr\" and\n    \"RightStr\" using \"IncludeRightStr\".\n\n    Parameters:\n\n      ResultVar\n      Destination where result is returned.\n\n      String\n      String where to search \"CenterStr\".\n\n      LeftStr\n      The first occurrence of \"LeftStr\" on the left of \"CenterStr\".\n      If it is an empty value, or was not found, will return\n      everything on the left of \"CenterStr\".\n\n      CenterStr\n      String to search in \"String\".\n\n      RightStr\n      The first occurrence of \"RightStr\" on the right of \"CenterStr\".\n      If it is an empty value, or was not found, will return\n      everything on the right of \"CenterStr\".\n\n      IncludeLeftStr(1|0)\n      Include or not the \"LeftStr\" in the result value. Default is 1\n      (True). (1 = True, 0 = False)\n\n      IncludeCenterStr(1|0)\n      Include or not the \"CenterStr\" in the result value. Default is 1\n      (True). (1 = True, 0 = False)\n\n      IncludeRightStr(1|0)\n      Include or not the \"RightStr\" in the result value. Default is 1\n      (True). (1 = True, 0 = False)\n\n    Result Value -> ResultVar:\n\n      String between \"LeftStr\" and \"RightStr\" of a found \"CenterStr\"\n      including or not the \"LeftStr\" and \"RightStr\" if\n      \"IncludeLeftRightStr\" is 1 and/or the \"CenterStr\" if\n      \"IncludeCenterStr\" is 1.\n\n    Example: \n\n      ${StrSort} $0 \"This is just an example\" \" just\" \"\" \"ple\" \"0\" \"0\" \"0\"\n                    [_______(___)_______]( )\n                              C           R\n\n      $0 = \"This is an exam\"\n\n    =========================================================================\n    *****                                                           ${StrStr}\n    -------------------------------------------------------------------------\n    ResultVar String StrToSearchFor\n    =========================================================================\n    Searches for \"StrToSearchFor\" in \"String\".\n\n    Parameters:\n\n      ResultVar\n      Destination where result is returned.\n\n      String\n      String where to search \"StrToSearchFor\".\n\n      StrToSearchFor\n      String to search in \"String\".\n\n    Result Value -> ResultVar:\n\n      \"StrToSearchFor\" + the string after where \"StrToSearchFor\" was found in\n      \"String\".\n\n    Example: \n\n      ${StrStr} $0 \"This is just an example\" \"just\"\n                   >>>>>>>>>{_)____________]\n\n      $0 = \"just an example\"\n\n    =========================================================================\n    *****                                                        ${StrStrAdv}\n    -------------------------------------------------------------------------\n    ResultVar String StrToSearchFor SearchDirection(>|<)\n    ResultStrDirection(>|<) DisplayStrToSearch(1|0) Loops CaseSensitive(0|1)\n    =========================================================================\n    Searches for \"StrToSearchFor\" in \"String\" in the direction specified by\n    \"SearchDirection\" and looping \"Loops\" times.\n\n    Parameters:\n\n      ResultVar\n      Destination where result is returned.\n\n      String\n      String where to search \"StrToSearchFor\".\n\n      StrToSearchFor\n      String to search in \"String\".\n\n      SearchDirection (>|<)\n      Where do you want to direct the search. Default is \">\" (to right).\n      (< = To left, > = To right)\n\n      ResultStrDirection (>|<)\n      Where the result string will be based on in relation of\n      \"StrToSearchFor\"\n      position. Default is \">\" (to right). (< = To left, > = To right)\n\n      DisplayStrToSearch (1|0)\n      Display \"StrToSearchFor\" in the result. Default is \"1\" (True).\n      (1 = True, 0 = False)\n\n      Loops\n      Number of times the code will search \"StrToSearchFor\" in \"String\" not\n      including the original execution. Default is \"0\" (1 code execution).\n\n      CaseSensitive(0|1)\n      If \"1\" the search will be case-sensitive (differentiates between cases).\n      If \"0\" it is case-insensitive (does not differentiate between cases).\n      Default is \"0\" (Case-Insensitive).\n\n\n    Result Value -> ResultVar:\n\n      \"StrToSearchFor\" if \"DisplayStrToSearch\" is 1 + the result string after\n      or before \"StrToSearchFor\", depending on \"ResultStrDirection\".\n\n    Result with Errors:\n\n      When \"StrToSearchFor\" was not found, will return an empty string.\n\n      When you put nothing in \"StrToSearchFor\", will return \"String\" and set\n      error flag.\n\n      When you put nothing in \"String\", will return an empty string and set\n      error flag.\n\n    Example: \n\n      ${StrStrAdv} $0 \"This IS really just an example\" \"IS \" \">\" \">\" \"0\" \"0\" \"1\"\n                       >>>>>( )[____________________]                       \n\n\n      $0 = \"really just an example\"\n\n    =========================================================================\n    ****                                                            ${StrTok}\n    -------------------------------------------------------------------------\n    ResultVar String Separators ResultPart[L] SkipEmptyParts(1|0)\n    =========================================================================\n    Returns the part \"ResultPart\" between two \"Separators\" inside\n    \"String\".\n\n    Parameters:\n\n      ResultVar\n      Destination where result is returned.\n\n      String\n      String where to search for \"Separators\".\n\n      Separators\n      Characters to find on \"String\".\n\n      ResultPart[L]\n      The part want to be found on \"StrToTokenize\" between two \"Separators\".\n      Can be any number, starting at 0, and \"L\" that is the last part.\n      Default is L (Last part).\n\n      SkipEmptyParts(1|0)\n      Skips empty string parts between two \"Separators\". Default is 1 (True).\n      (1 = True, 0 = False)\n\n    Result Value -> ResultVar:\n\n      \"String\" part number \"Part\" between two \"Separators\".\n\n    Examples: \n\n      1) ${StrTok} $0 \"This is, or is not, just an example\" \" ,\" \"4\" \"1\"\n                       (  ) ()  () () [_]  (  ) () (     )\n                       0    1   2  3  4    5    6  7 \n         $0 = \"not\"\n\n      2) ${StrTok} $0 \"This is, or is not, just an example\" \" ,\" \"4\" \"0\"\n                       (  ) () ^() [] ( ) ^(  ) () (     )\n                       0    1  23  4  5   67    8  9\n         $0 = \"is\"\n\n    =========================================================================\n    *                                                      ${StrTrimNewLines}\n    -------------------------------------------------------------------------\n    ResultVar String\n    =========================================================================\n    Deletes unnecessary new lines at end of \"String\".\n\n    Parameters:\n\n      ResultVar\n      Destination where result is returned.\n\n      String\n      String where to search unnecessary new lines at end of \"String\".\n\n    Result Value -> ResultVar:\n\n      \"String\" with unnecessary end new lines removed.\n\n    Example:\n\n      ${StrTrimNewLines} $0 \"$\\r$\\nThis is just an example$\\r$\\n$\\r$\\n\"\n                            [_____________________________(_)(_)(_)(_)]\n\n      $0 = \"$\\r$\\nThis is just an example\"\n\nFunctions included and not included\n--------------------------------------------------\n\n11 functions have been included\n  They are not available on Archive\n  They are on LogicLib format\n\n15 functions have not been included\n  12 were not included because of better functions\n    6 were not included because of AdvStrTok (called here as StrTok)\n      First String Part Function\n      Save on Variables Function\n      Sort Strings (1, 2 and 3) Functions\n      StrTok Function\n    2 were not included because of StrCase\n      StrLower Function\n      StrUpper Function\n    2 were not included because of StrClb\n      StrClbSet Function\n      StrClbGet Function\n    1 was not included because of NSISToIO and IOToNSIS\n      Convert / to // in Paths Function\n    1 was not included because of original String Replace Function (called\n      here as StrRep)\n      Another String Replace Function\n  2 were not included because they aren't useful anymore\n    Slash <-> Backslash Converter Function\n    Trim Function\n  1 was not included because of bugs\n    Number to String Converter Function\n\nVersion History\n---------------\n\n1.09 - 10/22/2004\n\n- Fixed stack problems involving: StrCase, StrRep, StrSort, StrTok.\n- Fixed StrClb: When \"Action\" = \"<>\", handle was wrongly outputed as\n  text.\n- Fixed StrSort, StrStrAdv documentation examples.\n- Fixed StrIOToNSIS, StrLoc, StrNSISToIO, StrRep, StrStr: sometimes\n  didn't find \"StrToSearch\" at all.\n\n1.08 - 10/12/2004\n\n- Converted all the functions to LogicLib.\n- StrSort: Totally remade and it can break old scripts. See\n  documentation for details.\n- StrTok: \"ResultPart\" has to start from 0 and it can break old scripts.\n  See documentation for details.\n- Added defines: StrFunc_List, *_List and *_TypeList.\n- Fixed StrStrAdv: Variables $R0-$R3 couldn't be used on scripts before\n  calling.\n- StrRep: Cut down some variables.\n- Arranged correctly the order of StrSort on the documentation.\n\n1.07 - 09/21/2004\n\n- Removed ${UnStrFunc} command. Now you can just include uninstall\n  functions commands like ${UnStrStr} to be supported by uninstall functions\n  and sections.\n- Added case-sensitive comparation option for StrStrAdv.\n- StrCase now uses System.dll which makes case conversions effective with\nall latin letters (i.e. ).\n- Added switch case and original case for StrCase.\n- StrClbSet and StrClbGet removed, added StrClb.\n- Made compact the most usual operations inside the header file. File size\nreduced.\n\n1.06 - 03/26/2004\n\n- StrNumToStr removed due to complex number handling on some languages.\n- Fixed the bug where the old string was attached to string returned by\n  StrCase when $R5 variable was used.\n\n1.05 - 03/17/2004\n\n- Fixed a bug with StrCase, Title Case wasn't working as should be.\n- Fixed a bug with StrStrAdv, previous fix created another bug, string not\n  returned correctly when using backwards search with \"DisplayStrToSearch\" as\n  \"0\".\n\n1.04 - 03/07/2004\n\n- Added new StrCase, removed StrLower and StrUpper.\n- Organized by name commands inside header and readme files.\n\n1.03 - 02/12/2004\n\n- Added commands support for uninstall sections and functions.\n- Fixed variables switch in \"StrLoc\" and \"StrTok\" after using these.\n\n1.02 - 02/07/2004\n\n- Fixed StrLoc.\n- Fixed Documentation about StrLoc. \"Direction\" is really \"OffsetDirection\".\n- Added my new AdvStrSort, and removed the old one.\n\n1.01 - 02/05/2004\n\n- Fixed Documentation about StrSort and StrTok.\n- Fixed StrTok default value for the string part. Now it's \"L\".\n- Fixed StrStrAdv fixed wrong search when had a combination of same\n  substrings one after another in a string.\n- Fixed StrLoc: when a string isn't found, don't return any value at all.\n\n1.00 - 02/01/2004\n\n- Added documentation.\n- Renamed header file to \"StrFunc.nsh\".\n- Added 1 function, StrLoc.\n- Modified StrStrAdv, removed some lines.\n- Fixed StrTok, 2 simple numbers made it loop everytime.\n- Fixed some small issues on the header file.\n\n0.02 - 01/24/2004\n\n- Completed StrFunc.nsh file. Need some tests and the readme.\n\n0.01 - 01/22/2004\n\n- First version to test ideas...\n\nCredits\n-------\n\n  Made by Diego Pedroso (aka deguix).\n\nFunctions Credits\n-----------------\n\n- All functions are made by Diego Pedroso on LogicLib format. They\n  are based on functions by Amir Szekely, Dave Laundon, Hendri\n  Adriaens, Nik Medved, Joost Verburg, Stuart Welch, Ximon Eighteen,\n  \"bigmac666\" and \"bluenet\". \"bluenet\"'s version of StrIOToNSIS and\n  StrNSISToIO on LogicLib format were included.\n\nLicense\n-------\n\nThis header file is provided 'as-is', without any express or implied\nwarranty. In no event will the author be held liable for any damages\narising from the use of this header file.\n\nPermission is granted to anyone to use this header file for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this header file must not be misrepresented;\n   you must not claim that you wrote the original header file.\n   If you use this header file in a product, an acknowledgment in the\n   product documentation would be appreciated but is not required.\n2. Altered versions must be plainly marked as such,\n   and must not be misrepresented as being the original header file.\n3. This notice may not be removed or altered from any distribution."
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/System/System.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html>\n<head>\n<title>NSIS System Plug-in</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\" />\n</head>\n<body>\n<h1>NSIS System Plug-in</h1>\n<p><i>&copy; brainsucker (Nik Medved), 2002</i></p>\n\n<h2>Table of Contents</h2>\n\n<ul>\n<li><a href=\"#intro\">Introduction</a></li>\n<li>\n<a href=\"#funcs\">Available Functions</a>\n<ul>\n<li><a href=\"#memfuncs\">Memory Related Functions</a></li>\n<li><a href=\"#callfuncs\">Calling Functions</a></li>\n<li><a href=\"#64bitfuncs\">64-bit Functions</a></li>\n</ul>\n</li>\n<li><a href=\"#faq\">FAQ</a></li>\n</ul>\n\n<h2><a name=\"intro\"></a>Introduction</h2>\n\n<p>The System plug-in gives developers the ability to call any exported function from any DLL. For example, you can use it to call <a href=\"http://msdn.microsoft.com/library/en-us/fileio/base/getlogicaldrivestrings.asp\">GetLogicalDriveStrings</a> to get a list of available drives on the user's computer.</p>\n\n<p>The System plug-in also allows the developer to allocate, free and copy memory; interact with COM objects and perform mathematical operations on 64-bit integers.</p>\n\n<p>Programming knowledge is highly recommended for good understanding of the System plug-in.</p>\n\n<p>The most useful System plug-in functions (Call, Get and Debug) are not available when compiling with GCC. To work around this, either download a MSVC-compiled version or write your own plugin that calls the functions you need.</p>\n\n<h4>Usage Examples From The Wiki</h4>\n\n<ul>\n<li><a href=\"http://nsis.sourceforge.net/wiki/Get_Local_Time\">Get local time</a></li>\n<li><a href=\"http://nsis.sourceforge.net/wiki/Registering_a_Palm_Com_Conduit\">Register conduits with Palm HotSync</a></li>\n<li><a href=\"http://nsis.sourceforge.net/wiki/Determining_free_memory_using_the_System_plugin\">Get free memory</a></li>\n<li><a href=\"http://nsis.sourceforge.net/wiki/REG_MULTI_SZ_Reader\">Read REG_MULTI_SZ</a></li>\n<li><a href=\"http://nsis.sourceforge.net/wiki/Get_Disk_Volume_Serial_Number\">Get disk serial number</a></li>\n<li><i><a href=\"http://nsis.sourceforge.net/Special:Search?search=System%3A%3ACall\">Search all...</a></i></li>\n</ul>\n\n<h2><a name=\"funcs\"></a>Available Functions</h2>\n\n<h3><a name=\"memfuncs\"></a>Memory Related Functions</h3>\n\n<div>\n<ul>\n\n<li>\n<b>Alloc</b> <i>SIZE</i>\n<blockquote>\n<p>Allocates <i>SIZE</i> bytes and returns a memory address on the stack.</p>\n<h4>Usage Example</h4>\n<blockquote><pre>\nSystem::<b>Alloc</b> 64\nPop $0\nDetailPrint \"64 bytes allocated at $0\"\nSystem::Free $0\n</pre></blockquote>\n</blockquote>\n</li>\n\n<li>\n<b>Copy</b> [/<i>SIZE</i>] <i>DESTINATION</i> <i>SOURCE</i>\n<blockquote>\n<p>Copies <i>SIZE</i> bytes from <i>SOURCE</i> to <i>DESTINATION</i>. If <i>SIZE</i> is not specified, <i>SOURCE</i>'s size will queried using GlobalSize. This means that if you don't allocate <i>SOURCE</i> using System::Alloc, System::Call or GlobalAlloc, you must specify <i>SIZE</i>. If <i>DESTINATION</i> is zero it will be allocated and its address will be pushed on the stack.</p>\n<h4>Usage example</h4>\n<blockquote><pre>\n# allocate a buffer and put 'test string' and an int in it\nSystem::Call \"*(&amp;t1024 'test string', i 5) i .s\"\nPop $0\n# copy to an automatically created buffer\nSystem::<b>Copy</b> 0 $0\nPop $1\n# get string and int in $1 buffer\nSystem::Call \"*$1(&amp;t1024 .r2, i .r3)\"\n# free buffer\nSystem::Free $1\n# print result\nDetailPrint $2\nDetailPrint $3\n# copy to our own buffer\nSystem::Alloc 1028\nPop $1\nSystem::<b>Copy</b> $1 $0\n# get string and int in $1 buffer\nSystem::Call \"*$1(&amp;t1024 .r2, i .r3)\"\n# free\nSystem::Free $0\nSystem::Free $1\n# print result\nDetailPrint $2\nDetailPrint $3\n</pre></blockquote>\n</blockquote>\n\n</li>\n\n<li>\n<b>Free</b> <i>ADDRESS</i>\n<blockquote>\n<p>Frees <i>ADDRESS</i>.</p>\n<h4>Usage Example</h4>\n<blockquote><pre>\nSystem::Alloc 64\nPop $0\nDetailPrint \"64 bytes allocated at $0\"\nSystem::<b>Free</b> $0\n</pre></blockquote>\n</blockquote>\n</li>\n\n<li>\n<b>Store</b> \"<i>OPERATION</i> [<i>OPERATION</i> [<i>OPERATION</i> ...]]\"\n<blockquote>\n<p>Performs stack operations. An operation can be pushing or popping a single register from the NSIS stack or pushing or popping all of the registers ($0-$9 and $R0-$R9) from System's private stack. Operations can be separated by any character.</p>\n<h4>Available Operations</h4>\n<ul>\n<li>To push $<i>#</i>, use p<i>#</i>, where <i>#</i> is a digit from 0 to 9.</li>\n<li>To pop $<i>#</i>, use r<i>#</i>, where <i>#</i> is a digit from 0 to 9.</li>\n<li>To push $R<i>#</i>, use P<i>#</i>, where <i>#</i> is a digit from 0 to 9.</li>\n<li>To pop $R<i>#</i>, use R<i>#</i>, where <i>#</i> is a digit from 0 to 9.</li>\n<li>To push $0-$9 and $R0-$R9 to System's private stack, use s or S.</li>\n<li>To pop $0-$9 and $R0-$R9 from System's private stack, use l or L.</li>\n</ul>\n<h4>Usage Examples</h4>\n<blockquote><pre>\nStrCpy $0 \"test\"\nSystem::<b>Store</b> \"p0\"\nPop $1\nDetailPrint \"$0 = $1\"\n</pre></blockquote>\n<blockquote><pre>\nStrCpy $2 \"test\"\nSystem::<b>Store</b> \"p2 R2\"\nDetailPrint \"$2 = $R2\"\n</pre></blockquote>\n<blockquote><pre>\nStrCpy $3 \"test\"\nSystem::<b>Store</b> \"s\"\nStrCpy $3 \"another test\"\nSystem::<b>Store</b> \"l\"\nDetailPrint $3\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Store</b> \"r4\" \"test\"\nDetailPrint $4\n</pre></blockquote>\n</blockquote>\n</li>\n</ul>\n\n</div>\n\n<h3><a name=\"callfuncs\"></a>Calling Functions</h3>\n\n<div>\n\n<ul>\n<li><b>Call</b> <i>PROC</i> [( <i>PARAMS</i> ) [<i>RETURN</i> [? <i>OPTIONS</i>]]]</li>\n<li><b>Get</b> <i>PROC</i> [( <i>PARAMS</i> ) [<i>RETURN</i> [? <i>OPTIONS</i>]]]\n<blockquote>\n<p>Call and get both share a common syntax. As the names suggest, Call calls and Get gets. What does it call or get? It depends on <i>PROC</i>'s value.</p>\n\n<p><i>PARAMS</i> is a list of parameters and what do to with them. You can pass data in the parameters and you can also get data from them. The parameters list is separated by commas. Each parameter is combined of three values: <i>type</i>, <i>source</i> and <i>destination</i>. <i>Type</i> can be an integer, a string, etc. <i>Source</i>, which is the source of the parameter value, can be a NSIS register ($0, $1, $INSTDIR), the NSIS stack, a concrete value (5, \"test\", etc.) or nothing (null). <i>Destination</i>, which is the destination of the parameter value after the call returns, can be a NSIS register, the NSIS stack or nothing which means no output is required. Either one of <i>source</i> or <i>destination</i> can also be a dot (`.') if it is not needed.</p>\n\n<p><i>RETURN</i> is like a single parameter definition, but <i>source</i> is only used when creating callback functions. Normally <i>source</i> is a dot.</p>\n\n<p><i>OPTIONS</i> is a list of options which control the way System plug-in behaves. Each option can be turned off by prefixing with an exclamation mark. For example: <b>?!e</b>.</p>\n\n<p><i>PARAMS</i>, <i>RETURN</i> and <i>OPTIONS</i> can be repeated many times in one Get/Call line. When repeating, a lot can be omitted, and only what you wish to change can be used. <i>Type</i>, <i>source</i> and/or <i>destination</i> can be omitted for each parameter, even the return value. Options can be added or removed. This allows you to define function prototypes and save on some typing. The <a href=\"#repeat\">last two examples</a> show this.</p>\n\n<p><i>PROC</i> can also be repeated but must be prefixed with a hash sign (`#').</p>\n\n<h4>Possible <i>PROC</i> Values and Meanings</h4>\n\n<blockquote>\n<table>\n<tr>\n<th>Value</th>\n<th>Meaning</th>\n<th>Example</th>\n</tr>\n<tr>\n<th><i>DLL</i>::<i>FUNC</i></th>\n<td><i>FUNC</i> exported from <i>DLL</i></td>\n<td><a href=\"#func\">user32::MessageBox</a></td>\n</tr>\n<tr>\n<th>::<i>ADDR</i></th>\n<td>Function located at <i>ADDR</i></td>\n<td><a href=\"#funcaddr\">see below</a></td>\n</tr>\n<tr>\n<th>*<i>ADDR</i></th>\n<td>Structure located at <i>ADDR</i></td>\n<td><a href=\"#structaddr\">see below</a></td>\n</tr>\n<tr>\n<th>*</th>\n<td>New structure</td>\n<td><a href=\"#newstruct\">see below</a></td>\n</tr>\n<tr>\n<th><i>IPTR</i>-><i>IDX</i></th>\n<td>Member indexed <i>IDX</i> from<br/>interface pointed by <i>IPTR</i></td>\n<td><a href=\"#com\">see below</a></td>\n</tr>\n<tr>\n<th>&lt;nothing&gt;</th>\n<td>New callback function</td>\n<td><a href=\"#callback\">see below</a></td>\n</tr>\n<tr>\n<th><i>PROC</i></th>\n<td><i>PROC</i> returned by Get</td>\n<td><a href=\"#get\">see below</a></td>\n</tr>\n</table>\n</blockquote>\n\n<h4>Available Parameter Types</h4>\n\n<blockquote>\n<table>\n<tr>\n<th>Type</th>\n<th>Meaning</th>\n</tr>\n<tr>\n<th>v</th>\n<td>void (generally for return)</td>\n<td></td>\n</tr>\n<tr>\n<th>i</th>\n<td>int (includes char, byte, short, handles, pointers and so on)</td>\n</tr>\n<tr>\n<th>l</th>\n<td>large integer, int64</td>\n</tr>\n<tr>\n<th>m</th>\n<td>ANSI text, string. (FYI: 'm' for multibyte string or 'w' flipped over.)</td>\n</tr>\n<tr>\n<th>t</th>\n<td>text, string (pointer to first character). <i>Like TCHAR*, it is a Unicode string in Unicode NSIS.</i></td>\n</tr>\n<tr>\n<th>w</th>\n<td>WCHAR text, Unicode string</td>\n</tr>\n<tr>\n<th>g</th>\n<td>GUID</td>\n</tr>\n<tr>\n<th>k</th>\n<td>callback</td>\n</tr>\n<tr>\n<th>&amp;v<i>N</i></th>\n<td><i>N</i> bytes padding (structures only)</td>\n</tr>\n<tr>\n<th>&amp;i<i>N</i></th>\n<td>integer of <i>N</i> bytes (structures only)</td>\n</tr>\n<tr>\n<th>&amp;l</th>\n<td>structure size (structures only)</td>\n</tr>\n<tr>\n<th>&amp;t<i>N</i></th>\n<td><i>N</i> bytes of text (structures only)</td>\n</tr>\n<tr>\n<th>&amp;w<i>N</i></th>\n<td><i>N</i> bytes of Unicode text (structures only)</td>\n</tr>\n<tr>\n<th>&amp;g<i>N</i></th>\n<td><i>N</i> bytes of GUID (structures only)</td>\n</tr>\n</table>\n<p>Additionally, each type can be prefixed with an asterisk to denote a pointer. When using an asterisk, the System plug-in still expects the value of the parameter, rather than the pointer's address. To pass a direct address, use `i' with no asterisk. A <a href=\"#pointer\">usage example</a> is available. <a href=\"#memfuncs\">Alloc</a> returns addresses and its return value should therefore be used with `i', without an asterisk.</p>\n</blockquote>\n\n<h4>Available Sources and Destinations</h4>\n\n<blockquote>\n<table>\n<tr>\n<th>Type</th>\n<th>Meaning</th>\n</tr>\n<tr>\n<th>.</th>\n<td>ignored</td>\n<td></td>\n</tr>\n<tr>\n<th><i>number</i></th>\n<td>concrete hex, decimal or octal integer value. several integers can be or'ed using the pipe symbol (`|')</td>\n</tr>\n<tr>\n<th>'<i>string</i>'<br/>\"<i>string</i>\"<br/>`<i>string</i>`</th>\n<td>concrete string value</td>\n</tr>\n<tr>\n<th><i>r0</i> through <i>r9</i></th>\n<td>$0 through $9 respectively</td>\n</tr>\n<tr>\n<th><i>r10</i> through <i>r19</i><br/><i>R0</i> through <i>R9</i></th>\n<td>$R0 through $R9 respectively</td>\n</tr>\n<tr>\n<th>c</th>\n<td>$CMDLINE</td>\n</tr>\n<tr>\n<th>d</th>\n<td>$INSTDIR</td>\n</tr>\n<tr>\n<th>o</th>\n<td>$OUTDIR</td>\n</tr>\n<tr>\n<th>e</th>\n<td>$EXEDIR</td>\n</tr>\n<tr>\n<th>a</th>\n<td>$LANGUAGE</td>\n</tr>\n<tr>\n<th>s</th>\n<td>NSIS stack</td>\n</tr>\n<tr>\n<th>n</th>\n<td>null for source, no output required for destination</td>\n</tr>\n</table>\n</blockquote>\n\n<h4>Callbacks</h4>\n\n<blockquote>\n<p>Callback functions are simply functions which are passed to a function and called back by it. They are frequently used to pass a possibly large set of data item by item. For example, <a href=\"http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Windows/WindowReference/WindowFunctions/EnumChildWindows.asp\">EnumChildWindows</a> uses a <a href=\"http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Windows/WindowReference/WindowFunctions/EnumChildProc.asp\">callback function</a>. As NSIS functions are not quite regular functions, the System plug-in provides its own mechanism to support callback functions. It allows you to create callback functions and notifies you each time a callback function was called.</p>\n\n<p>Creation of callback functions is done using <a href=\"#callfuncs\">Get</a> and the callback creation syntax. As you will not call the callbacks yourself, the source of the parameters should be omitted using a dot. When the callback is called, the destination of the parameters will be filled with the values passed on to the callback. The value the callback will return is set by the source of the return \"parameter\". The destination of the return \"parameter\" should always be set as that's where System will notify you the callback was called.</p>\n\n<blockquote><pre>System::Get \"(i .r0, i .r1) iss\"</pre></blockquote>\n\n<p>To pass a callback to a function, use the k type.</p>\n\n<blockquote><pre>System::Get \"(i .r0, i .r1) isR0\"\nPop $0\nSystem::Call \"dll::UseCallback(k r0)\"</pre></blockquote>\n\n<p>Each time the callback is called, the string callback#, where # is the number of the callback, will be placed in the destination of the return \"parameter\". The number of the first callback created is 1, the second's is 2, the third's is 3 and so on. As System is single threaded, a callback can only be called while calling another function. For example, EnumChildWindows's callback can only be called when EnumChildWindows is being called. You should therefore check for callback# after each function call that might call your callback.</p>\n\n<blockquote><pre>System::Get \"(i .r0, i .r1) isR0\"\nPop $0\nSystem::Call \"dll::UseCallback(k r0)\"\nStrCmp $R0 \"callback1\" 0 +2\nDetailPrint \"UseCallback passed ($0, $1) to the callback\"\n</pre></blockquote>\n\n<p>After you've processed the callback call, you should use <a href=\"#callfuncs\">Call</a>, passing it the value returned by <a href=\"#callfuncs\">Get</a> - the callback. This tells System to return from the callback. Destination of the return \"parameter\" must be cleared prior to calling a function, to avoid false detection of a callback call. If you've specified a source for the return \"parameter\" when the callback was created, you should fill that source with the appropriate return value. Callbacks are not automatically freed, don't forget to free it after you've finished using it.</p>\n\n<blockquote><pre>System::Get \"(i .r0, i .r1) isR0\"\nPop $0\nSystem::Call \"dll::UseCallback(k r0)\"\nloop:\n\tStrCmp $R0 \"callback1\" 0 done\n\tDetailPrint \"UseCallback passed ($0, $1) to the callback\"\n\tPush 1 # return value of the callback\n\tStrCpy $R0 \"\" # clear $R0 in case there are no more callback calls\n\tSystem::Call $0 # tell system to return from the callback\n\tGoto loop\ndone:\nSystem::Free $0\n</pre></blockquote>\n\n<p>A complete working <a href=\"#callback\">example</a> is available in the usage examples section.</p>\n\n</blockquote>\n\n<h4>Notes</h4>\n\n<blockquote>\n<ul>\n<li>To find out the index of a member in a COM interface, you need to search for the definition of this COM interface in the header files that come with Visual C/C++ or the Platform SDK. Remember the index is zero based.</li>\n<li>If a function can't be found, an `A' will be appended to its name and it will be looked up again. This is done because a lot of Windows API functions have two versions, one for ANSI strings and one for Unicode strings. The ANSI version of the function is marked with `A' and the Unicode version is marked with `W'. For example: lstrcpyA and lstrcpyW.</li>\n</ul>\n</blockquote>\n\n<h4>Available Options</h4>\n\n<blockquote>\n<table>\n<tr>\n<th>Option</th>\n<th>Meaning</th>\n</tr>\n<tr>\n<th>c</th>\n<td>cdecl calling convention (the stack restored by caller). By default stdcall calling convention is used (the stack restored by callee).</td>\n<td></td>\n</tr>\n<tr>\n<th>r</th>\n<td>Always return (for GET means you should pop result and proc, for CALL means you should pop result (at least)). By default result is returned for errors only (for GET you will pop either error result or right proc, and for CALL you will get either your return or result at defined return place).</td>\n</tr>\n<tr>\n<th>n</th>\n<td>No redefine. Whenever this proc will be used it will never be redefined either by GET or CALL. This options is never inherited to children.</td>\n</tr>\n<tr>\n<th>s</th>\n<td>Use general Stack. Whenever the first callback defined the system starts using the temporary stacks for function calls.</td>\n</tr>\n<tr>\n<th>e</th>\n<td>Call GetLastError() after procedure end and push result on stack.</td>\n</tr>\n<tr>\n<th>u</th>\n<td>Unload DLL after call (using FreeLibrary, so you'll be able to delete it for example).</td>\n</tr>\n</table>\n</blockquote>\n\n<h4>Usage Examples</h4>\n\n<blockquote><pre>\n<a name=\"func\"></a>System::<b>Call</b> \"user32::MessageBox(i $HWNDPARENT, t 'NSIS System Plug-in', t 'Test', i 0)\"\n</pre></blockquote>\n<blockquote><pre>\n<a name=\"funcaddr\"></a>System::<b>Call</b> \"kernel32::GetModuleHandle(t 'user32.dll') i .s\"\nSystem::<b>Call</b> \"kernel32::GetProcAddress(i s, t 'MessageBoxA') i .r0\"\nSystem::<b>Call</b> \"::$0(i $HWNDPARENT, t 'GetProcAddress test', t 'NSIS System Plug-in', i 0)\"\n</pre></blockquote>\n<blockquote><pre>\n<a name=\"get\"></a>System::<b>Get</b> \"user32::MessageBox(i $HWNDPARENT, t 'This is a default text', t 'Default', i 0)\"\nPop $0\nSystem::<b>Call</b> \"$0\"\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Get</b> \"user32::MessageBox(i $HWNDPARENT, t 'This is a default text', \\\n\tt 'Default', i 0x1|0x10)\"\nPop $0\nSystem::<b>Call</b> \"$0(, 'This is a System::Get test', 'NSIS System Plug-in',)\"\n</pre></blockquote>\n<blockquote><pre>\n<a name=\"pointer\"></a>System::<b>Call</b> \"advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i.r2\"\nDetailPrint \"User name - $0\"\nDetailPrint \"String length - $1\"\nDetailPrint \"Return value - $2\"\n</pre></blockquote>\n<blockquote><pre>\n<a name=\"structaddr\"></a>System::Alloc 4\nPop $0\nSystem::<b>Call</b> \"*$0(i 5)\"\nSystem::<b>Call</b> \"*$0(i .r1)\"\nDetailPrint $1\n</pre></blockquote>\n<blockquote><pre>\n<a name=\"newstruct\"></a>System::<b>Call</b> \"*(i 5) i .r0\"\nSystem::<b>Call</b> \"*$0(i .r1)\"\nDetailPrint $1\n</pre></blockquote>\n<blockquote><pre>\n<a name=\"com\"></a># defines\n!define CLSCTX_INPROC_SERVER 1\n!define CLSID_ActiveDesktop {75048700-EF1F-11D0-9888-006097DEACF9}\n!define IID_IActiveDesktop {F490EB00-1240-11D1-9888-006097DEACF9}\n# create IActiveDesktop interface\nSystem::<b>Call</b> \"ole32::CoCreateInstance( \\\n\tg '${CLSID_ActiveDesktop}', i 0, \\\n\ti ${CLSCTX_INPROC_SERVER}, \\\n\tg '${IID_IActiveDesktop}', *i .r0) i.r1\"\nStrCmp $1 0 0 end\n# call IActiveDesktop->GetWallpaper\nSystem::<b>Call</b> \"$0->4(w .r2, i ${NSIS_MAX_STRLEN}, i 0)\"\n# call IActiveDesktop->Release\nSystem::<b>Call</b> \"$0->2()\"\n# print result\nDetailPrint $2\nend:\n</pre></blockquote>\n<blockquote><pre>\nInitPluginsDir\nSetOutPath $PLUGINSDIR\nFile MyDLL.dll\nSystem::<b>Call</b> \"MyDLL::MyFunc(i 5) ? u\"\nDelete $PLUGINSDIR\\MyDLL.dll\n</pre></blockquote>\n<blockquote><pre>\n<a name=\"callback\"></a>System::<b>Get</b> \"(i.r1, i) iss\"\nPop $R0\nSystem::<b>Call</b> \"user32::EnumChildWindows(i $HWNDPARENT, k R0, i) i.s\"\nloop:\n\tPop $0\n\tStrCmp $0 \"callback1\" 0 done\n\tSystem::<b>Call</b> \"user32::GetWindowText(ir1,t.r2,i${NSIS_MAX_STRLEN})\"\n\tSystem::<b>Call</b> \"user32::GetClassName(ir1,t.r3,i${NSIS_MAX_STRLEN})\"\n\tIntFmt $1 \"0x%X\" $1\n\tDetailPrint \"$1 - [$3] $2\"\n\tPush 1 # callback's return value\n\tSystem::<b>Call</b> \"$R0\"\n\tGoto loop\ndone:\nSystem::Free $R0\n</pre></blockquote>\n<blockquote><pre>\n<a name=\"repeat\"></a>!define MB \"user32::MessageBox(i$HWNDPARENT,t,t'NSIS System Plug-in',i0)\"\nSystem::<b>Call</b> \"${MB}(,'my message',,)\"\nSystem::<b>Call</b> \"${MB}(,'another message',,) i.r0\"\nMessageBox MB_OK \"last call returned $0\"\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Call</b> \"user32::SendMessage(i $HWNDPARENT, t 'test', t 'test', i 0) i.s ? \\\n\te (,t'test replacement',,) i.r0 ? !e #user32::MessageBox\"\nDetailPrint $0\nClearErrors\nPop $0\nIfErrors good\nMessageBox MB_OK \"this message box will never be reached\"\ngood:\n</pre></blockquote>\n</blockquote>\n</li>\n</ul>\n\n</div>\n\n<h3><a name=\"64bitfuncs\"></a>64-bit Functions</h3>\n\n<div>\n\n<ul>\n\n<li>\n<b>Int64Op</b> <i>ARG1</i> <i>OP</i> [<i>ARG2</i>]\n<blockquote>\n<p>Performs <i>OP</i> on <i>ARG1</i> and optionally <i>ARG2</i> and returns the result on the stack. Both <i>ARG1</i> and <i>ARG2</i> are 64-bit integers. This means they can range between -2^63 and 2^63 - 1.</p>\n<h4>Available Operations</h4>\n<ul>\n<li>Addition -- <b>+</b></li>\n<li>Subtraction -- <b>-</b></li>\n<li>Multiplication -- <b>*</b></li>\n<li>Division -- <b>/</b></li>\n<li>Modulo -- <b>%</b></li>\n<li>Shift right -- <b>&gt;&gt;</b></li>\n<li>Shift left -- <b>&lt;&lt;</b></li>\n<li>Bitwise or -- <b>|</b></li>\n<li>Bitwise and -- <b>&amp;</b></li>\n<li>Bitwise xor -- <b>^</b></li>\n<li>Logical or -- <b>||</b></li>\n<li>Logical and -- <b>&amp;&amp;</b></li>\n<li>Less than -- <b>&lt;</b></li>\n<li>Equals -- <b>=</b></li>\n<li>Greater than -- <b>&gt;</b></li>\n<li>Bitwise not (one argument) -- <b>~</b></li>\n<li>Logical not (one argument) -- <b>!</b></li>\n</ul>\n\n<h4>Usage Examples</h4>\n\n<blockquote><pre>\nSystem::<b>Int64Op</b> 5 + 5\nPop $0\nDetailPrint \"5 + 5 = $0\" # 10\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 64 - 25\nPop $0\nDetailPrint \"64 - 25 = $0\" # 39\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 526355 * 1565487\nPop $0\nDetailPrint \"526355 * 1565487 = $0\" # 824001909885\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 5498449498849818 / 3\nPop $0\nDetailPrint \"5498449498849818 / 3 = $0\" # 1832816499616606\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 0x89498A198E4566C % 157\nPop $0\nDetailPrint \"0x89498A198E4566C % 157 = $0\" # 118\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 1 &lt;&lt; 62\nPop $0\nDetailPrint \"1 &lt;&lt; 62 = $0\" # 4611686018427387904\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 0x4000000000000000 &gt;&gt; 62\nPop $0\nDetailPrint \"0x4000000000000000 &gt;&gt; 62 = $0\" # 1\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 0xF0F0F0F | 0xF0F0FFF\nPop $0\n# IntFmt is 32-bit, this is just for the example\nIntFmt $0 \"0x%X\" $0\nDetailPrint \"0xF0F0F0F | 0xF0F0FFF = $0\" # 0xF0F0FFF\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 0x12345678 &amp; 0xF0F0F0F0\nPop $0\n# IntFmt is 32-bit, this is just for the example\nIntFmt $0 \"0x%X\" $0\nDetailPrint \"0x12345678 &amp; 0xF0F0F0F0 = $0\" # 0x10305070\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 1 ^ 0\nPop $0\nDetailPrint \"1 ^ 0 = $0\" # 1\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 1 || 0\nPop $0\nDetailPrint \"1 || 0 = $0\" # 1\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 1 &amp;&amp; 0\nPop $0\nDetailPrint \"1 &amp;&amp; 0 = $0\" # 0\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 9302157012375 &lt; 570197509190760\nPop $0\nDetailPrint \"9302157012375 &lt; 570197509190760 = $0\" # 1\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 5168 &gt; 89873\nPop $0\nDetailPrint \"5168 &gt; 89873 = $0\" # 0\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 189189 = 189189\nPop $0\nDetailPrint \"189189 = 189189 = $0\" # 1\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 156545668489 ~\nPop $0\nDetailPrint \"1 ~ = $0\" # -156545668490\n</pre></blockquote>\n<blockquote><pre>\nSystem::<b>Int64Op</b> 1 !\nPop $0\nDetailPrint \"1 ! = $0\" # 0\n</pre></blockquote>\n</blockquote>\n</li>\n\n</ul>\n\n</div>\n\n<h2><a name=\"faq\"></a>FAQ</h2>\n\n<div>\n\n<ul>\n\n<li>\n<b>Q:</b> How can I pass structs to functions?\n<blockquote>\n<p><b>A:</b> First of all, you must allocate the struct. This can be done in two ways. You can either use <a href=\"#memfuncs\">Alloc</a> or <a href=\"#callfuncs\">Call</a> with the special struct allocation syntax. Next, if you need to pass data in the struct, you must fill it with data. Then you call the function with a pointer to the struct. Finally, if you want to read data from the struct which might have been written by the called function, you must use <a href=\"#callfuncs\">Call</a> with the struct handling syntax. After all is done, it's important to remember to free the struct.</p>\n\n<h4>Allocation</h4>\n\n<blockquote><p>To allocate the struct using <a href=\"#memfuncs\">Alloc</a>, you must know the size of the struct in bytes. Therefore, it would normally be easier to use <a href=\"#callfuncs\">Call</a>. In this case it's easy to see the required size is 16 bytes, but other cases might not be that trivial. In both cases, the struct address will be located on the top of the stack and should be retrieved using Pop.</p>\n\n<blockquote><pre>\nSystem::Alloc 16\n</pre></blockquote>\n\n<blockquote><pre>\nSystem::Call \"*(i, i, i, t)i.s\"\n</pre></blockquote>\n\n</blockquote>\n\n<h4>Setting Data</h4>\n\n<blockquote><p>Setting data can be done using <a href=\"#callfuncs\">Call</a>. It can be done in the allocation stage, or in another stage using the struct handling syntax.</p>\n\n<blockquote><pre>\nSystem::Call \"*(i 5, i 2, i 513, t 'test')i.s\"\n</pre></blockquote>\n\n<blockquote><pre>\n# assuming the struct's memory address is kept in $0\nSystem::Call \"*$0(i 5, i 2, i 513, t 'test')\"\n</pre></blockquote>\n\n</blockquote>\n\n<h4>Passing to the Function</h4>\n\n<blockquote><p>As all allocation methods return an address, the type of the passed data should be an integer, an address in memory.</p>\n\n<blockquote><pre>\n# assuming the struct's memory address is kept in $0\nSystem::Call \"dll::func(i r0)\"\n</pre></blockquote>\n\n</blockquote>\n\n<h4>Reading Data</h4>\n\n<blockquote><p>Reading data from the struct can be done using the same syntax as setting it. The only difference is that the destination part of the parameter will be set and the source part will be omitted using a dot.</p>\n\n<blockquote><pre>\n# assuming the struct's memory address is kept in $0\nSystem::Call \"*$0(i .r0, i .r1, i .r2, t .r3)\"\nDetailPrint \"first int = $0\"\nDetailPrint \"second int = $1\"\nDetailPrint \"third int = $2\"\nDetailPrint \"string = $3\"\n</pre></blockquote>\n\n</blockquote>\n\n<h4>Freeing Memory</h4>\n\n<blockquote><p>Memory is freed using <a href=\"#memfuncs\">Free</a>.</p>\n\n<blockquote><pre>\n# assuming the struct's memory address is kept in $0\nSystem::Free $0\n</pre></blockquote>\n\n</blockquote>\n\n<h4>A Complete Example</h4>\n\n<blockquote><pre>\n# allocate\nSystem::Alloc 32\nPop $1\n# call\nSystem::Call \"Kernel32::GlobalMemoryStatus(i r1)\"\n# get\nSystem::Call \"*$1(i.r2, i.r3, i.r4, i.r5, i.r6, i.r7, i.r8, i.r9)\"\n# free\nSystem::Free $1\n# print\nDetailPrint \"Structure size: $2 bytes\"\nDetailPrint \"Memory load: $3%\"\nDetailPrint \"Total physical memory: $4 bytes\"\nDetailPrint \"Free physical memory: $5 bytes\"\nDetailPrint \"Total page file: $6 bytes\"\nDetailPrint \"Free page file: $7 bytes\"\nDetailPrint \"Total virtual: $8 bytes\"\nDetailPrint \"Free virtual: $9 bytes\"\n</pre></blockquote>\n\n</blockquote>\n</li>\n\n</ul>\n\n</div>\n\n</body>\n</html>\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/System/WhatsNew.txt",
    "content": "release 2.\n1. Syntax, with inline input\n2. Int64 full support (conversion/operations/comparison)\n3. Structures support\n4. Callbacks support, including multilevel callbacks\n5. Some useful routines (Alloc, Free, Copy)\n6. CDecl and StdCall calling conventions\n\nrelease 3, 22 march 2003.\n1. Custom Message Boxes (with icons etc) -> bug in case of GetModuleHandle and\ncall to FreeLibrary (sysfunc.nsh)\n2. GetFileSysTime -> No SystemTimeToTzSpecificLocalTime at win9x bug, \nchanged to use FileTimeToLocalFileTime (sysfunc.nsh)\n3. Incorrect automatic structure size (&l) bug, value actually never filled\ninto the structure (strange -> winxp takes no care of the structure size \nmembers, such as cbSize, and win98 does...) (system.c)\n4. Changed Secondary Stack Allocation behavior - now we just leave 65kb of the\nstack NSIS give to us to the NSIS itself, and use the other part as the stack\nfor our calls. (system.c)\n5. Secondary Stack Optimization - in case of no more pending callback procs -\n\"free\" the secondary stack pointer. (system.c)\n6. PlaySound(\"\", 0, 0) plays the default windows sound at win9x, so changed to\nPlaySound(NULL, 0, 0) for effective sound stopping after splash (sysfunc.nsh).\n\nrelease 4, 3 september 2003.\n1. Division by zero fatal error at Int64Op killed.\n2. bool type removed (use int instead).\n3. GUID (g) and LPWSTR (w) types added.\n4. Memory cleanup after using t (string), g (guid) and w (unicode string) added.\n5. Automatic A-letter at proc name discovery.\n6. COM optimized: new proc specification \"x->y\", where x is interface ptr, and\ny is vtable member index. For such procs Interface pointer passed as first arg\nautomatically.\n\nrelease 5, 11 september 2003.\n1. u flag - unload dll after procedure call.\n2. some changes to asm to turn on Whole Program Optimization.\n3. Dll shrunk by 1 kb.\n\nbug-fix-release, 4.06.2004\n1. System::Copy /SIZE fixed (Kichik).\n2. System::Copy with destination auto-allocation now pushes destination\naddress on stack.\n3. Callbacks fixed (Kichik's kick is awesome).\n4. Bug with proc call parts redefinition, # for example (pointed by Kichik).\n5. Bug with memory protection during callback processing (Kichik)."
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/VPatch/Readme.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<title>VPatch 3</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\" />\n<style type=\"text/css\">\n/*<![CDATA[*/\n\nbody\n        {\n        padding: 10px;\n        background-color: #F0F0F0;\n        font-family: Verdana, Arial, Helvetica, sans-serif;\n        font-size: 13px;\n        font-weight: normal;\n        text-align: left;\n        }\n\np, li\n        {\n        font-size: 13px;\n        }\n\n.center\n        {\n        text-align: center;\n        }\n\ntable\n        {\n        margin: auto;\n        font-size: 13px;\n        background-color: #FFFFFF;\n        }\n\n.maintable\n        {\n        border: 2px solid #376EAB;\n        }\n\n.parameter\n        {\n        font-weight: bold;\n        color: #6586AC;\n        }\n\n\nh1\n        {\n        font-size: 30px;\n        color: #333333;\n        font-weight: normal;\n        text-align: center;\n        margin-top: 20px;\n        }\n\nh2\n        {\n        font-size: 20px;\n        color: #7A7272;\n        font-weight: normal;\n        }\n\nh3\n        {\n        font-size: 17px;\n        font-weight: bold;\n        color: #303030;\n        }\n\npre     {\n        font-size: 13px;\n        }\n\ndiv\n        {\n        margin: 20px;\n        }\n\na:link, a:visited, a:active\n        {\n        color: #294F75;\n        text-decoration: none;\n        }\n\na:hover\n        {\n        color: #182634;\n        text-decoration: underline;\n        }\n\n/*]]>*/\n</style>\n</head>\n<body>\n<table width=\"750\" class=\"maintable\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n    <tr> \n      <td> \n        \n      <h1>VPatch 3.1</h1>\n        <div> \n          <h2>Introduction</h2>\n          <div>\n          <p>VPatch allows to create a patch file to update previous versions \n            of your software. The GenPat utility generates the patch file. The \n            plug-in can use the patch to update a file. Using a patch, you can \n            reduce the download size of your updates, because only the differences \n            between the files are included in the patch file.</p>\n          </div>\n          <h2>How to use</h2>\n          <div>\n          <h3>Generate the patch file</h3>\n          <div>\n          <p>Make sure you have the source file (original version) and the target \n            file (version to update to). For example, DATA.DTA (currently on user \n            system) and DATA_20.DTA (version 2.0 of this data file). Now call \n            the command line tool GenPat.exe:</p>\n          <pre>\nGENPAT oldfile.txt newfile.txt patch.pat\n</pre>\n          <p>Now, the patch will be generated, this will take some time.</p>\n            <p>Using the /B=(BlockSize) parameter of the GenPat utility (put it \n              after the filenames), you can use a different block size. A smaller \n              block size may result in a smaller patch, but the generation will \n              take more time (the default blocksize is 64).</p>\n            <p>If you have trouble using this command-line utility, you can download \n              a GUI (graphical user interface) for VPatch from its own website: \n              <a href=\"http://www.tibed.net/vpatch\">http://www.tibed.net/vpatch</a>.</p>\n          </div>\n          <h3>Update the file during installation</h3>\n          <div>\n          <p>Use the VPatch plug-in to update a file using a patch file:</p>\n          <pre>\nvpatch::vpatchfile \"patch.pat\" \"oldfile.txt\" \"temporary_newfile.txt\"\n</pre>\n          <p>The result of the patch operating will be added to the stack and \n            can be one of the following texts:</p>\n          <ul>\n            <li>OK</li>\n            <li>OK, new version already installed</li>\n            <li>An error occurred while patching</li>\n            <li>Patch data is invalid or corrupt</li>\n            <li>No suitable patches were found</li>\n          </ul>\n            <p>Check <a href=\"../../Examples/VPatch/example.nsi\">example.nsi</a> for an example. You \n              should check whether the stack string starts with &quot;OK&quot; \n              because then the patch has succeeded and you can rename &quot;temporary_newfile.txt&quot; \n              to &quot;oldfile.txt&quot; to replace the original, if you want.</p>\n          </div>\n          <h3>Multiple patches in one file</h3>\n          <div>\n          <p>GenPat appends a patch to the file you specified. If there is already \n            a patch for the same original file, with the same CRC/MD5, in the patch file,\n            the patch will be replaced. For example, if you want to be able to upgrade\n            version 1 and 2 to version 3, you can put a 1 &gt; 3 and 2 &gt; 3 patch in \n            one file.</p>\n          <p>You can also put patches for different files in one patch file, for \n            example, a patch from file A version 1 to file A version 2 and a patch \n            from file B version 1 to file B version 2. Just call the plug-in multiple \n            times with the same patch file. It will automatically select the right \n            patch (based on the file CRC).</p>\n          </div>\n          <h3>Patch generator (GenPat) exit codes</h3>\n          <div>\n            <p>In version 3 the following exit codes (known as error levels in \n              the DOS period) can be returned by GenPat. GenPat will return an \n              exit code based on success of the patch generation. Here is a list \n              of the possible exit codes:</p>\n            <table width=\"547\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n              <tr> \n                <td><b>Exit code</b></td>\n                <td><b>Description</b></td>\n              </tr>\n              <tr> \n                <td>0</td>\n                <td>Success</td>\n              </tr>\n              <tr> \n                <td>1</td>\n                <td>Arguments missing</td>\n              </tr>\n              <tr> \n                <td>2</td>\n                <td>Other error</td>\n              </tr>\n              <tr>\n                <td>3</td>\n                <td>Source file already has a patch in specified patch file (ERROR), \n                  use /R switch to override</td>\n              </tr>\n            </table>\n            <p>These exit codes can be useful when you generate patch files through \n              a NSIS script.</p>\n        </div>\n        </div>\n        </div>\n        <div>\n          <h2>Source code</h2>\n          <div>\n          <p>Source code is available in the original package and in the SVN repository of NSIS.</p>\n          <h3>NSIS plug-in (C++)</h3>\n          <div>\n          <p>The source of the NSIS plug-in that applies patches can be found \n            in the Source\\Plugin folder.</p>\n          </div>\n          <h3>Patch Generator (C++)</h3>\n          <div>\n            <p>The most interesting part of VPatch, the actual patch generation \n              algorithm, can be found in Source\\GenPat\\PatchGenerator.cpp. The \n              header of that file contains a brief explanation of the algorithm \n              as well.</p>\n          </div>\n          <h3>User interface (Delphi)</h3>\n          <div>\n          <p>A user interface is included as well, which you will have to build \n            yourself because the GUI executable was too large to include. Besides \n            Borland Delphi 6 or higher (you can use the freely available Personal \n            edition), you will also need to install the <a href=\n\"http://www.delphi-gems.com\">VirtualTreeView</a> component by Mike Lischke.</p>\n          </div>\n          </div>\n          <h2>Version history</h2>\n          <div>\n          <ul>\n            <li>3.1 \n              <ul>\n                <li>GenPat now compiles on POSIX platforms (MinGW/GCC), Visual \n                  C++ 6 and Borland C++.</li>\n                <li>More test cases to verify functionality of GenPat.</li>\n              </ul>\n            </li>\n            <li>3.0 \n              <ul>\n                <li><b>Final</b>: Updates to the GUI, installer</li>\n                <li><b>RC8</b>: GenPat will now flag replacement of a patch (e.g. \n                  the source file has the same contents as a previous patch inside \n                  a patch file) as an error. You can specifically allow it using \n                  the /R switch. Added license to source files.</li>\n                <li><b>RC7</b>: Fixed critical bug in GenPat with multiple patches \n                  in a single file. Fixed serious bug in stand-alone EXE runtime: \n                  process kept on running forever. Included case testing through \n                  a Python script to test common usage (and prevent bugs like \n                  the one in GenPat in the future).</li>\n                <li><b>RC6</b>: Upgraded to non-beta compiler. Added /A switch \n                  to change block match limit and /O to deactivate the limit. \n                  Updated GUI to support the /O switch.</li>\n                <li><b>RC4a to RC5a</b>: input block size is now checked for power \n                  of 2 and fixed if incorrect. When patch file does not yet exist, \n                  no longer forgets to create the header. No longer tries to allocate \n                  memory when there are no chunks. Fixed memory leaks.</li>\n                <li>Target file date is now preserved inside a patch and restored \n                  on the user system.</li>\n                <li>MD5 checksums are now used instead of CRC32 checksums, unless \n                  existing patches in a file already are in CRC32 mode.</li>\n                <li>The patch generator, GenPat, has been completely rewritten \n                  in C++. It no longer needs to keep the entire files in memory, \n                  instead memory usage is a certain percentage of the source file \n                  size. The percentage is based on the block size, larger block \n                  sizes will reduce memory usage.</li>\n                <li>All runtimes now share a common codebase, perform proper error \n                  checking and don't leave behind files if the input file was \n                  already up to date.</li>\n                <li>Bug Fix: The patch generator algorithm no longer reduces to \n                  a quadratic runtime if there are many blocks with the same content \n                  in the files to patch.</li>\n                <li>Bug Fix: The documentation of the command-line utilities was \n                  incorrect and no warnings would be given by the runtimes, causing \n                  the patch not to work (this does not apply to NSIS patches).</li>\n              </ul>\n            </li>\n            <li>2.1 \n              <ul>\n                <li>Added argument checking and error handling to GenPat. Now \n                  returns exit codes as well to indicate success/failure (and \n                  the reason for failure). Only GenPat has changed in this version \n                  compared to 2.0 final.</li>\n                <li>Bug Fix: GenPat no longer gives an Access Violation when attempting \n                  to patch a file smaller than 64 bytes into a file larger than \n                  64 bytes.</li>\n              </ul>\n            </li>\n            <li>2.0 final \n              <ul>\n                <li>Cleaned up source code for the patch generator, which is now \n                  included (this code is written in Borland Delphi 6 and compiles \n                  with the freely available Personal edition).</li>\n              </ul>\n            </li>\n            <li>2.0 beta 2 \n              <ul>\n                <li>All new algorithm used in the patch generator: much faster \n                  (up to 90%) while using smaller block sizes (higher compression)</li>\n                <li>Created a NSIS 2 plugin</li>\n                <li>Works with small files</li>\n                <li>Replaces existing patch in file if original file CRC is identical</li>\n              </ul>\n            </li>\n          </ul>\n          </div>\n          <h2>Credits</h2>\n          <div>\n          <p>Written by Koen van de Sande<br />\n            C plug-in initially by Edgewize, updated by Koen van de Sande<br />\n            New documentation and example by Joost Verburg and Koen van de Sande</p>\n          </div>\n          <h2>License</h2>\n          <div>\n          <pre>\nCopyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute\nit freely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; \n   you must not claim that you wrote the original software.\n   If you use this software in a product, an acknowledgment in the\n   product documentation would be appreciated but is not required.\n2. Altered versions must be plainly marked as such,\n   and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any distribution.\n</pre>\n</div>\n        </div>\n      </td>\n</tr>\n</table>\n</body>\n</html>\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/makensisw/License.txt",
    "content": "Copyright (c) 2002 Robert Rainwater <rrainwater@yahoo.com>\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/makensisw/Readme.txt",
    "content": "----------------------------------------------------\nMakeNSISW - MakeNSIS Windows Wrapper\n----------------------------------------------------\n\n\nAbout MakeNSISW\n---------------\nMakeNSISW is a wrapper for the MakeNSIS that is distributed with\nNSIS (http://www.nullsoft.com/free/nsis/).  MakeNSISW allows you \nto compile NSIS scripts using a Windows GUI interface.  To install\nMakeNSISW, compile the source using Visual C++ or Mingw.\n\n\nRequirements\n------------\nMakeNSISW requires NSIS be installed on your system.  The default \ndirectory for this installation is $PROGRAMFILES\\NSIS\\Contrib\\MakeNSISW.\n\n\nUsage:\n------\nIf you installed the Shell Extensions option during the installation, then\nall that is required is that you choose 'Compile NSI' from the right-\nclick menu on a NSIS script.  This will invoke MakeNSISW.\n\nThe format of the parameters when calling MakeNSISW from the commandline is:\n  makensisw [options] [script.nsi | - [...]]\n\nFor the options, please see the MakeNSIS documentation.\n\n\nShortcut Keys\n-------------\nCtrl+A: Select All text\nCtrl+B: Open Script Folder\nCtrl+C: Copy selected text\nCtrl+D: Opens the Define Symbols dialog\nCtrl+E: Edits the script\nCtrl+F: Find text\nCtrl+L: Load a script\nCtrl+R: Recompiles the script\nCtrl+T: Tests the installer\nCtrl+W: Clear Log Window\nAlt+X: Exits the application\nF1: View Documentation\n\n\nVersion History\n---------------\n0.1\n - Initial Release\n\n0.2\n - Added ability to save output and copy output\n\n0.3\n - Added option to recompile script (F2 or File|Recompile)\n - Added Help Menu\n - Return code is now always set\n - Added Accelerator key support for Exit and Recompile\n - No longer uses NSIS's version string\n - Made clearer status message in title bar\n - Disabled menu/accelerator functions during compile\n\n0.4\n - Fixed Copy Selected bug\n\n0.5\n - Minor Makefile changes (mingw)\n - Moved strings into global strings to make editing easier\n - Added Clear Log Command under Edit menu\n - Recompile no longer clears the log window (use F5)\n - Close is now the default button when you hit enter\n - added VC++ project, updated resources to work with VC++\n - rearranged directory structure\n - makefiles now target ../../makensisw.exe\n - removed makensisw home link in help menu (hope this is ok,\n   doesn't really seem needed to me)\n - made display use a fixed width font (Some people may not like\n   this, but I do)\n - added 'test' button (peeks output for 'Output' line)\n - made it so that the log shows the most recent 32k.\n - made it so that the log always clears on a recompile.\n - compiled with VC++ so no longer needs msvcrt.dll\n - made the compiler name be a full path (for more flexibility)\n\n0.6\n - print correct usage if unable to execute compiler\n - removed mingw warnings\n - set title/branding before errors\n - some docs changes\n - Added Edit|Edit Script function\n\n0.7\n - Edit Script should now work for output>32k\n - Added resize support (thanks to felfert)\n - Added window position saving (thanks to felfert)\n - Disable some items when exec of makensis failed\n\n0.8\n - Added window size constraints (thanks to bcheck)\n - Cleaned up the resource file\n\n0.9\n - Removed global strings (moved into #defines)\n - Some GUI changes\n - No longer focused Close button (its default anyways)\n - Fixed resize bug on minimize/restore (thanks to felfert)\n - Made window placement stored in HKLM instead of HKCU, cause\n   I hate things that get littered in HKCU.\n\n1.0\n - Fixed bug with large output causing crash\n\n1.1\n - Crash may actually be fixed\n\n1.2\n - XP visual style support\n\n1.3\n - Added Documentation menu item\n - Fix GUI problem with About dialog\n\n1.4\n - Edit Script command will now work with or without file associations\n - Added default filename for save dialog\n - Use standard fonts\n - Documentation menuitem caused recompile\n\n1.5\n - Fixed Copy All function\n\n1.6\n - Reduced size from 44k to 12k (kichik)\n - Editbox not limited to 32k (now using richedit control)\n - Made the log window font-size smaller.\n\n1.7\n - Added check for warnings\n - Added sound for sucessfull compilations\n - Update home page and documentation menu items to Sourceforge page\n\n1.8\n - Contents of log window are now streamed in\n - Empty log window check (to prevent random crashes)\n\n1.9\n - Text always scrolls to bottom (kichik)\n - Updated link to new docs\n - Makensisw now takes the same parameters as makensis.exe\n - Fixed some random crashes\n - Drag and Drop Support into the Makensisw window\n - Updated icon to more sexy one\n - Added Load Script option on File menu\n - Added Search Dialog (Ctrl+F) (kichik)\n - Added Select All (Ctrl+A), Copy (Ctrl+C), Exit (Alt+X) keys\n - Branding text now reflects NSIS version\n - Added some simple tool tips\n - Added Context Menu in log window\n - Added resize gripper\n - Ctrl+L loads a script\n - Added Clear Log (Ctrl+W)\n - Browse Script (Ctrl+B) launches explorer in script directory\n - Check for Update command\n - Added link to the NSIS Forum under Help menu\n - Bunch of other stuff not worth mentioning\n - Define Symbols menu (Ctrl+D)\n\n2.0\n - Improved user interface\n - Define Symbols is available even if a script is not loaded\n - Defined Symbols are saved on exit and reloaded on start\n - Added NSIS Update menu\n - Added toolbar for commonly used menus\n - Made the Toolbar style flat\n - Added option for compile & run\n - Added compressor setting option\n - Added support for lzma compression\n - Added named Symbols sets.\n\n2.1\n - Added \"Cancel compilation\" menu item\n\n2.2\n- Settings saved in HKCU instead of HKLM\n- Added menu accelerators to MRU list\n\n2.3\n- Escape button closes MakeNSISw\n\n2.3.1\n- Fixed broken command line parameter handling\n \nCopyright Information\n---------------------\nCopyright (c) 2002 Robert Rainwater\nContributors: Justin Frankel, Fritz Elfert, Amir Szekely, Sunil Kamath, Joost Verburg\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n  1. The origin of this software must not be misrepresented; you must not\n     claim that you wrote the original software. If you use this software\n     in a product, an acknowledgment in the product documentation would be\n     appreciated but is not required.\n  2. Altered source versions must be plainly marked as such, and must not be\n     misrepresented as being the original software.\n  3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/nsDialogs/Readme.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n<head>\n<title>nsDialogs</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\">\n<style type=\"text/css\">\nb\n{\n\tcolor: red;\n}\ncode\n{\n\tmargin-left: 20px;\n\tpadding: 7px;\n\tbackground-color: rgb(240,240,240);\n}\n</style>\n</head>\n<body>\n\n<h1>NSIS nsDialogs Plug-in</h1>\n<p><i>Next generation of user interface design</i></p>\n\n<h2>Table of Contents</h2>\n\n<ul>\n<li><a href=\"#intro\">Introduction</a></li>\n<li>\n<a href=\"#step\">Step-by-Step Tutorial</a>\n<ul>\n<li><a href=\"#step-basic\">Basic Script</a></li>\n<li><a href=\"#step-page\">Custom Page</a></li>\n<li><a href=\"#step-create\">Creating Page</a></li>\n<li><a href=\"#step-show\">Showing Page</a></li>\n<li><a href=\"#step-add\">Adding Controls</a></li>\n<li><a href=\"#step-state\">Control State</a></li>\n<li><a href=\"#step-notify\">Real-time Notification</a></li>\n<li><a href=\"#step-memory\">Memory</a></li>\n</ul>\n</li>\n<li>\n<a href=\"#ref\">Function Reference</a>\n<ul>\n<li><a href=\"#ref-create\">Create</a></li>\n<li><a href=\"#ref-createcontrol\">CreateControl</a></li>\n<li><a href=\"#ref-show\">Show</a></li>\n<li><a href=\"#ref-selectfiledialog\">SelectFileDialog</a></li>\n<li><a href=\"#ref-selectfolderdialog\">SelectFolderDialog</a></li>\n<li><a href=\"#ref-setrtl\">SetRTL</a></li>\n<li><a href=\"#ref-getuserdata\">GetUserData</a></li>\n<li><a href=\"#ref-setuserdata\">SetUserData</a></li>\n<li><a href=\"#ref-onback\">OnBack</a></li>\n<li><a href=\"#ref-onchange\">OnChange</a></li>\n<li><a href=\"#ref-onclick\">OnClick</a></li>\n<li><a href=\"#ref-onnotify\">OnNotify</a></li>\n<li><a href=\"#ref-createtimer\">CreateTimer</a></li>\n<li><a href=\"#ref-killtimer\">KillTimer</a></li>\n</ul>\n</li>\n<li>\n<a href=\"#mref\">Macro Reference</a>\n<ul>\n<li><a href=\"#mref-create\">NSD_Create*</a></li>\n<li><a href=\"#mref-onback\">NSD_OnBack</a></li>\n<li><a href=\"#mref-onchange\">NSD_OnChange</a></li>\n<li><a href=\"#mref-onclick\">NSD_OnClick</a></li>\n<li><a href=\"#mref-onnotify\">NSD_OnNotify</a></li>\n<li><a href=\"#mref-createtimer\">NSD_CreateTimer</a></li>\n<li><a href=\"#mref-killtimer\">NSD_KillTimer</a></li>\n<li><a href=\"#mref-addstyle\">NSD_AddStyle</a></li>\n<li><a href=\"#mref-addexstyle\">NSD_AddExStyle</a></li>\n<li><a href=\"#mref-gettext\">NSD_GetText</a></li>\n<li><a href=\"#mref-settext\">NSD_SetText</a></li>\n<li><a href=\"#mref-settextlimit\">NSD_SetTextLimit</a></li>\n<li><a href=\"#mref-getstate\">NSD_GetState</a></li>\n<li><a href=\"#mref-setstate\">NSD_SetState</a></li>\n<li><a href=\"#mref-check\">NSD_Check</a></li>\n<li><a href=\"#mref-uncheck\">NSD_Uncheck</a></li>\n<li><a href=\"#mref-cbaddstring\">NSD_CB_AddString</a></li>\n<li><a href=\"#mref-cbselectstring\">NSD_CB_SelectString</a></li>\n<li><a href=\"#mref-lbaddstring\">NSD_LB_AddString</a></li>\n<li><a href=\"#mref-lbdelstring\">NSD_LB_DelString</a></li>\n<li><a href=\"#mref-lbclear\">NSD_LB_Clear</a></li>\n<li><a href=\"#mref-lbgetcount\">NSD_LB_GetCount</a></li>\n<li><a href=\"#mref-lbselectstring\">NSD_LB_SelectString</a></li>\n<li><a href=\"#mref-lbgetselection\">NSD_LB_GetSelection</a></li>\n<li><a href=\"#mref-setfocus\">NSD_SetFocus</a></li>\n<li><a href=\"#mref-setimage\">NSD_SetImage</a></li>\n<li><a href=\"#mref-setsimage\">NSD_SetStretchedImage</a></li>\n<li><a href=\"#mref-seticon\">NSD_SetIcon</a></li>\n<li><a href=\"#mref-seticonfrominstaller\">NSD_SetIconFromInstaller</a></li>\n<li><a href=\"#mref-clearimage\">NSD_ClearImage</a></li>\n<li><a href=\"#mref-clearicon\">NSD_ClearIcon</a></li>\n<li><a href=\"#mref-freeimage\">NSD_FreeImage</a></li>\n<li><a href=\"#mref-freeicon\">NSD_FreeIcon</a></li>\n</ul>\n</li>\n<li><a href=\"#faq\">FAQ</a></li>\n</ul>\n\n<h2><a name=\"intro\"></a>Introduction</h2>\n\n<p>nsDialogs allows creation of custom pages in the installer. On top of the built-in pages, nsDialogs can create pages with any type of controls in any order and arrangement. It can create everything from a simple page with one label to form which reacts to user's actions. <a href=\"../Modern UI 2/Readme.html\">Modern UI 2</a>, for example, uses nsDialogs to create the welcome and finish pages.</p>\n\n<p>nsDialogs is a new NSIS plug-in, introduced in version 2.29 as a replacement for <a href=\"../InstallOptions/Readme.html\">InstallOptions</a>. nsDialogs doesn't use INI files, so it's way faster than InstallOptions. Integration with the script is tighter and more natural - creating controls is done using plug-in functions and notification is done by directly calling a function in the script. Unlike InstallOptions, there isn't a predefined set of available control type and by providing a lower level access to Windows API, every type of control can be created and pages can be more customizable.</p>\n\n<p>The same thing that makes nsDialogs more flexible can also make it more complicated for users with no knowledge of Win32 API. This is solved by creating a library of predefined functions, defined in script, that allow creation and handling of controls. This way, novices get easy access to the flexibility, while advanced users still get access to the core functionality by modifying the library or simply avoid using it.</p>\n\n<h2><a name=\"step\"></a>Step-by-Step Tutorial</h2>\n\n<h3><a name=\"step-basic\"></a>Basic Script</h3>\n\n<p>Before using nsDialogs, lets first create a basic script as our skeleton.</p>\n\n<blockquote><pre>Name nsDialogs\nOutFile nsDialogs.exe\n\nXPStyle on\n\nPage instfiles\n\nSection\n\n\tDetailPrint \"hello world\"\n\nSectionEnd</pre></blockquote>\n\n<h3><a name=\"step-page\"></a>Custom Page</h3>\n\n<p>Next, we'll add a custom page where we can use nsDialogs. nsDialogs cannot be used in sections or any other function but a custom page's function.</p>\n\n<blockquote><pre>Name nsDialogs\nOutFile nsDialogs.exe\n\nXPStyle on\n\n<b>Page custom nsDialogsPage</b>\nPage instfiles\n\n<b>Function nsDialogsPage\nFunctionEnd</b>\n\nSection\n\n\tDetailPrint \"hello world\"\n\nSectionEnd</pre></blockquote>\n\n<h3><a name=\"step-create\"></a>Creating Page</h3>\n\n<p>Now that the foundations are laid, it's time to use nsDialogs. The first call must always be to nsDialogs::Create. It will create a new dialog in the page and return its <i>HWND</i> on the stack. The result must be popped from the stack to prevent stack corruption. If the result is <i>error</i>, the dialog couldn't be created.</p>\n\n<p>nsDialogs::Create accepts one parameter. It has a very specific function, but to keep things simple for this tutorial, it must always be 1018.</p>\n\n<p><i>HWND</i> is a number that uniquely identifies the dialog and can be used with SendMessage, SetCtlColors and Win32 API.</p>\n\n<blockquote><pre><b>!include LogicLib.nsh</b>\n\nName nsDialogs\nOutFile nsDialogs.exe\n\nXPStyle on\n\n<b>Var Dialog</b>\n\nPage custom nsDialogsPage\nPage instfiles\n\nFunction nsDialogsPage\n<b>\n\tnsDialogs::Create 1018\n\tPop $Dialog\n\n\t${If} $Dialog == error\n\t\tAbort\n\t${EndIf}\n</b>\nFunctionEnd\n\nSection\n\n\tDetailPrint \"hello world\"\n\nSectionEnd</pre></blockquote>\n\n<h3><a name=\"step-show\"></a>Showing Page</h3>\n\n<p>Now that the page is created, it's time to show it. This is done with nsDialogs::Show. This function will not return until the user clicks Next, Back or Cancel.</p>\n\n<blockquote><pre>!include LogicLib.nsh\n\nName nsDialogs\nOutFile nsDialogs.exe\n\nXPStyle on\n\nVar Dialog\n\nPage custom nsDialogsPage\nPage instfiles\n\nFunction nsDialogsPage\n\tnsDialogs::Create 1018\n\tPop $Dialog\n\n\t${If} $Dialog == error\n\t\tAbort\n\t${EndIf}\n<b>\n\tnsDialogs::Show\n</b>\nFunctionEnd\n\nSection\n\n\tDetailPrint \"hello world\"\n\nSectionEnd</pre></blockquote>\n\n<h3><a name=\"step-add\"></a>Adding Controls</h3>\n\n<p>Compiling the last script and running it results in an empty page which is not very useful. So now we'll add some controls to it to. To do so, we'll use <a href=\"#mref-create\">${NSD_Create*}</a> macros from nsDialogs.nsh. Each of those macros takes 5 parameters - x, y, width, height and text. Each macro also returns one value on the stack, which is the new control's HWND. Like the dialogs HWND, it must be popped from the stack and saved.</p>\n\n<p>Each of the measurements that the macros take can use one of three unit types - pixels, dialog units or percentage of the dialog's size. It can also be negative to indicate it should be measured from the end. To use dialog units, the measurement must be suffixed with the letter <i>u</i>. To use percentage, the measurement must be suffixed with the percentage sign - <i>%</i>. Any other suffix, or no suffix, means pixels.</p>\n\n<p>Dialog units allow creation of dialogs that scale well when different fonts or DPI is used. Its size in pixels is determined on runtime based on the font and the DPI. For example, standard pages in the classic NSIS user interface are 266 dialog units wide and 130 dialog units high. Pages in Modern UI are 300 dialogs units wide and 140 dialog units high. In different resolutions, using different fonts or DPI settings, the dialogs will always have the same size in dialog units, but different size in pixels.</p>\n\n<blockquote><pre><b>!include nsDialogs.nsh</b>\n!include LogicLib.nsh\n\nName nsDialogs\nOutFile nsDialogs.exe\n\nXPStyle on\n\nVar Dialog\n<b>Var Label\nVar Text</b>\n\nPage custom nsDialogsPage\nPage instfiles\n\nFunction nsDialogsPage\n\n\tnsDialogs::Create 1018\n\tPop $Dialog\n\n\t${If} $Dialog == error\n\t\tAbort\n\t${EndIf}\n<b>\n\t${NSD_CreateLabel} 0 0 100% 12u \"Hello, welcome to nsDialogs!\"\n\tPop $Label\n\n\t${NSD_CreateText} 0 13u 100% -13u \"Type something here...\"\n\tPop $Text\n</b>\n\tnsDialogs::Show\n\nFunctionEnd\n\nSection\n\n\tDetailPrint \"hello world\"\n\nSectionEnd</pre></blockquote>\n\n<p>Available control types that can be created with <a href=\"#mref-create\">${NSD_Create*}</a> are:</p>\n\n<ul>\n<li>HLine</li>\n<li>VLine</li>\n<li>Label</li>\n<li>Icon</li>\n<li>Bitmap</li>\n<li>BrowseButton</li>\n<li>Link</li>\n<li>Button</li>\n<li>GroupBox</li>\n<li>CheckBox</li>\n<li>RadioButton</li>\n<li>Text</li>\n<li>Password</li>\n<li>Number</li>\n<li>FileRequest</li>\n<li>DirRequest</li>\n<li>ComboBox</li>\n<li>DropList</li>\n<li>ListBox</li>\n<li>ProgressBar</li>\n</ul>\n\n<h3><a name=\"step-state\"></a>Control State</h3>\n\n<p>Now that we have some controls that the user can interact with, it's time to see what the user actually does with them. For that, we'll first add a <i>leave callback</i> function to our page. In that function, we'll query the state of the text control we've created and display it to the user. To do so, we'll use the <a href=\"#mref-gettext\">${NSD_GetText}</a> macro. Use the <a href=\"#mref-getstate\">${NSD_GetState}</a> macro for RadioButton and CheckBox controls.</p>\n\n<p>Note that not all controls support <a href=\"#mref-gettext\">${NSD_GetText}</a> and some require special handling with specific messages defined in WinMessages.nsh. For example, the ListBox control requires usage of <i>LB_GETCURSEL</i> and <i>LB_GETTEXT</i>. With time, the library of macros in nsDialogs.nsh will fill with more and more macros that'll handle more cases like this.</p>\n\n<blockquote><pre>!include nsDialogs.nsh\n!include LogicLib.nsh\n\nName nsDialogs\nOutFile nsDialogs.exe\n\nXPStyle on\n\nVar Dialog\nVar Label\nVar Text\n\nPage custom nsDialogsPage <b>nsDialogsPageLeave</b>\nPage instfiles\n\nFunction nsDialogsPage\n\n\tnsDialogs::Create 1018\n\tPop $Dialog\n\n\t${If} $Dialog == error\n\t\tAbort\n\t${EndIf}\n\n\t${NSD_CreateLabel} 0 0 100% 12u \"Hello, welcome to nsDialogs!\"\n\tPop $Label\n\n\t${NSD_CreateText} 0 13u 100% -13u \"Type something here...\"\n\tPop $Text\n\n\tnsDialogs::Show\n\nFunctionEnd\n\n<b>Function nsDialogsPageLeave\n\n\t${NSD_GetText} $Text $0\n\tMessageBox MB_OK \"You typed:$\\n$\\n$0\"\n\nFunctionEnd</b>\n\nSection\n\n\tDetailPrint \"hello world\"\n\nSectionEnd</pre></blockquote>\n\n<h3><a name=\"step-notify\"></a>Real-time Notification</h3>\n\n<p>One of the more exciting new features of nsDialogs is callback function notification of changes to the dialog. nsDialogs can call a function defined in a script in response to a user action such as changing of a text field or click of a button. To make nsDialogs notify us of events, we'll use <a href=\"#mref-onclick\">${NSD_OnClick}</a> and <a href=\"#mref-onchange\">${NSD_OnChange}</a>. Not every control supports both of the events. For example, there is nothing to notify about label changes, only clicks.</p>\n\n<p>When the callback function is called, the control's HWND will be waiting on the stack and must be popped to prevent stack corruption. In this simple example, this is not so useful. But in case of a bigger script where several controls are associated with the same callback function, the HWND can shed some light on which control originated the event.</p>\n\n<p>The new example will respond to the user type <i>hello</i> in the text box.</p>\n\n<blockquote><pre>!include nsDialogs.nsh\n!include LogicLib.nsh\n\nName nsDialogs\nOutFile nsDialogs.exe\n\nXPStyle on\n\nVar Dialog\nVar Label\nVar Text\n\nPage custom nsDialogsPage nsDialogsPageLeave\nPage instfiles\n\nFunction nsDialogsPage\n\n\tnsDialogs::Create 1018\n\tPop $Dialog\n\n\t${If} $Dialog == error\n\t\tAbort\n\t${EndIf}\n\n\t${NSD_CreateLabel} 0 0 100% 12u \"Hello, welcome to nsDialogs!\"\n\tPop $Label\n\n\t${NSD_CreateText} 0 13u 100% -13u \"Type something here...\"\n\tPop $Text\n\t<b>${NSD_OnChange} $Text nsDialogsPageTextChange</b>\n\n\tnsDialogs::Show\n\nFunctionEnd\n\nFunction nsDialogsPageLeave\n\n\t${NSD_GetText} $Text $0\n\tMessageBox MB_OK \"You typed:$\\n$\\n$0\"\n\nFunctionEnd\n\n<b>Function nsDialogsPageTextChange\n\n\tPop $1 # $1 == $ Text\n\n\t${NSD_GetText} $Text $0\n\n\t${If} $0 == \"hello\"\n\n\t\tMessageBox MB_OK \"right back at ya!\"\n\n\t${EndIf}\n\nFunctionEnd</b>\n\nSection\n\n\tDetailPrint \"hello world\"\n\nSectionEnd</pre></blockquote>\n\n<h3><a name=\"step-memory\"></a>Memory</h3>\n\n<p>So far we have a page that has some basic input controls. But what happens when the user goes to the next page and comes back? With the current code, the user's input will not be remembered. To remember, we'll use the already present leave callback function to store the user's choice in variables and pass these values when creating the controls the next time. For a better example, we'll also add a checkbox to the page and use <a href=\"#mref-getstate\">${NSD_GetState}</a> and <a href=\"#mref-setstate\">${NSD_SetState}</a> to get and set its state.</p>\n\n<p>For clarity, we'll remove some of the notifications from the previous step.</p>\n\n<blockquote><pre>!include nsDialogs.nsh\n!include LogicLib.nsh\n\nName nsDialogs\nOutFile nsDialogs.exe\n\nXPStyle on\n\nVar Dialog\nVar Label\nVar Text\n<b>Var Text_State\nVar Checkbox\nVar Checkbox_State</b>\n\nPage custom nsDialogsPage nsDialogsPageLeave\n<b>Page license</b>\nPage instfiles\n\n<b>Function .onInit\n\n\tStrCpy $Text_State \"Type something here...\"\n\nFunctionEnd</b>\n\nFunction nsDialogsPage\n\n\tnsDialogs::Create 1018\n\tPop $Dialog\n\n\t${If} $Dialog == error\n\t\tAbort\n\t${EndIf}\n\n\t${NSD_CreateLabel} 0 0 100% 12u \"Hello, welcome to nsDialogs!\"\n\tPop $Label\n\n\t${NSD_CreateText} 0 13u 100% <b>12u $Text_State</b>\n\tPop $Text\n\n\t<b>${NSD_CreateCheckbox} 0 30u 100% 10u \"&amp;Something\"\n\tPop $Checkbox\n\n\t${If} $Checkbox_State == ${BST_CHECKED}\n\t\t${NSD_Check} $Checkbox\n\t${EndIf}\n\n\t# alternative for the above ${If}:\n\t#${NSD_SetState} $Checkbox_State</b>\n\n\tnsDialogs::Show\n\nFunctionEnd\n\nFunction nsDialogsPageLeave\n\n\t${NSD_GetText} $Text <b>$Text_State</b>\n\t<b>${NSD_GetState} $Checkbox $Checkbox_State</b>\n\nFunctionEnd\n\nSection\n\n\tDetailPrint \"hello world\"\n\nSectionEnd</pre></blockquote>\n\n<h2><a name=\"ref\"></a>Function Reference</h2>\n\n<h3><a name=\"ref-create\"></a>Create</h3>\n\n<p><code>nsDialogs::Create <i>rect</i></code></p>\n\n<p>Creates a new dialog. <i>rect</i> specific the identifier of the control whose location will be mimiced. This should usually be 1018, which is control mimiced for creation of built-in pages. The Modern UI also has control 1040 for the welcome and the finish page.</p>\n\n<p>Returns the new dialog's HWND on the stack or <i>error</i>.</p>\n\n<h3><a name=\"ref-createcontrol\"></a>CreateControl</h3>\n\n<p><code>nsDialogs::CreateControl <i>class</i> <i>style</i> <i>extended_style</i> <i>x</i> <i>y</i> <i>width</i> <i>height</i> <i>text</i></code></p>\n\n<p>Create a new control in the current dialog. A dialog must exist for this to work, so nsDialogs::Create must be called prior to this function.</p>\n\n<p>Returns the new dialog's HWND on the stack or <i>error</i>.</p>\n\n<h3><a name=\"ref-show\"></a>Show</h3>\n\n<p><code>nsDialogs::Show</code></p>\n\n<p>Displays the page. Call this once finished with nsDialogs::Create, nsDialogs::CreateControl and the rest.</p>\n\n<p>Returns nothing.</p>\n\n<h3><a name=\"ref-selectfiledialog\"></a>SelectFileDialog</h3>\n\n<p><code>nsDialogs::SelectFileDialog <i>mode</i> <i>initial_selection</i> <i>filter</i></code></p>\n\n<p>Displays a file selection dialog to the user. If <i>mode</i> is set to <i>save</i>, displays a file save dialog. If <i>mode</i> is set to <i>open</i>, displays a file open dialog. <i>filter</i> is a list of available file filters separated by pipes. If an empty string is passed, the default is used - <i>All Files|*.*</i>.</p>\n\n<p><i>initial_selection</i> can be used to provide the user with a default file to look for and/or a default folder to look in. If <i>initial_selection</i> is empty no default filename will be provided for the user and the dialog will start in the current working directory. If <i>initial_selection</i> specifies just a filename, for example \"test.exe\", the dialog will be set up to look for a file called test.exe in the current working directory. If <i>initial_selection</i> specifies just a directory, for example \"C:\\Program Files\", the dialog starts in the provided directory with no file name provided. If <i>initial_selection</i> specifies a directory and a filename, for example \"C:\\Windows\\System32\\calc.exe\", the dialog will be set up to look for a file called calc.exe in the directory C:\\Windows\\System32.</p>\n\n<p>Returns the selected file on the stack or an empty string if the user canceled the operation.</p>\n\n<h3><a name=\"ref-selectfolderdialog\"></a>SelectFolderDialog</h3>\n\n<p><code>nsDialogs::SelectFolderDialog <i>title</i> <i>initial_selection</i></code></p>\n\n<p>Displays a directory selection dialog to the user.</p>\n\n<p>Returns the selected directory on the stack or \"error\" in case the user canceled the operation or an error occured.</p>\n\n<h3><a name=\"ref-setrtl\"></a>SetRTL</h3>\n\n<p><code>nsDialogs::SetRTL <i>rtl_setting</i></code></p>\n\n<p>Sets right-to-left mode on or off. If <i>rtl_setting</i> is 0, it's set to off. If <i>rtl_setting</i> is 1, it's set to on. This function must be called before any calls to nsDialogs::CreateControl.</p>\n\n<p>Returns nothing.</p>\n\n<h3><a name=\"ref-getuserdata\"></a>GetUserData</h3>\n\n<p><code>nsDialogs::GetUserData <i>control_HWND</i></code></p>\n\n<p>Returns user data associated with the control on the stack.  Use nsDialogs::SetUserData to set this data.</p>\n\n<h3><a name=\"ref-setuserdata\"></a>SetUserData</h3>\n\n<p><code>nsDialogs::SetUserData <i>control_HWND</i> <i>data</i></code></p>\n\n<p>Associates <i>data</i> with the control. Use nsDialogs::GetUserData to get this data.</p>\n\n<p>Returns nothing.</p>\n\n<h3><a name=\"ref-onback\"></a>OnBack</h3>\n\n<p><code>nsDialogs::OnBack <i>function_address</i></code></p>\n\n<p>Sets the callback function for the Back button. This function will be called when the user clicks the back button. Call Abort in this function to prevent the user from going back to the last page.</p>\n\n<p>Use GetFunctionAddress to get the address of the desired callback function.</p>\n\n<p>Returns nothing.</p>\n\n<h3><a name=\"ref-onchange\"></a>OnChange</h3>\n\n<p><code>nsDialogs::OnChange <i>control_HWND</i> <i>function_address</i></code></p>\n\n<p>Sets a change notification callback function for the given control. Whenever the control changes, the function will be called and the control's HWND will be waiting on its stack.</p>\n\n<p>Use GetFunctionAddress to get the address of the desired callback function.</p>\n\n<p>Returns nothing.</p>\n\n<h3><a name=\"ref-onclick\"></a>OnClick</h3>\n\n<p><code>nsDialogs::OnClick <i>control_HWND</i> <i>function_address</i></code></p>\n\n<p>Sets a click notification callback function for the given control. Whenever the control is clicked, the function will be called and the control's HWND will be waiting on its stack.</p>\n\n<p>Use GetFunctionAddress to get the address of the desired callback function.</p>\n\n<p>Returns nothing.</p>\n\n<h3><a name=\"ref-onnotify\"></a>OnNotify</h3>\n\n<p><code>nsDialogs::OnNotify <i>control_HWND</i> <i>function_address</i></code></p>\n\n<p>Sets a notification callback function for the given control. Whenever the control receives the WM_NOTIFY message, the function will be called and the control's HWND, notification code and a pointer to the MNHDR structure will be waiting on its stack.</p>\n\n<p>Use GetFunctionAddress to get the address of the desired callback function.</p>\n\n<p>Returns nothing.</p>\n\n<h3><a name=\"ref-createtimer\"></a>CreateTimer</h3>\n\n<p><code>nsDialogs::CreateTimer <i>function_address</i> <i>timer_interval</i></code></p>\n\n<p>Sets a timer that'd call the callback function for the given control every in a constant interval. Interval times are specified in milliseconds.</p>\n\n<p>Use GetFunctionAddress to get the address of the desired callback function.</p>\n\n<p>Returns nothing.</p>\n\n<h3><a name=\"ref-killtimer\"></a>KillTimer</h3>\n\n<p><code>nsDialogs::KillTimer <i>function_address</i></code></p>\n\n<p>Kills a previously set timer.</p>\n\n<p>Use GetFunctionAddress to get the address of the desired callback function.</p>\n\n<p>Returns nothing.</p>\n\n<h2><a name=\"mref\"></a>Macro Reference</h2>\n\n<p>nsDialogs.nsh contains a lot of macros that can make nsDialogs usage a lot easier. Below is a description of each of those macros including purpose, syntax, input and output.</p>\n\n<h3><a name=\"mref-create\"></a>NSD_Create*</h3>\n\n<p><code>${NSD_Create*} <i>x</i> <i>y</i> <i>width</i> <i>height</i> <i>text</i></code></p>\n\n<p>Create a new control in the current dialog. A dialog must exist for this to work, so nsDialogs::Create must be called prior to this function.</p>\n\n<p>Available variants:</p>\n\n<ul>\n<li>${NSD_CreateHLine}</li>\n<li>${NSD_CreateVLine}</li>\n<li>${NSD_CreateLabel}</li>\n<li>${NSD_CreateIcon}</li>\n<li>${NSD_CreateBitmap}</li>\n<li>${NSD_CreateBrowseButton}</li>\n<li>${NSD_CreateLink}</li>\n<li>${NSD_CreateButton}</li>\n<li>${NSD_CreateGroupBox}</li>\n<li>${NSD_CreateCheckBox}</li>\n<li>${NSD_CreateRadioButton}</li>\n<li>${NSD_CreateText}</li>\n<li>${NSD_CreatePassword}</li>\n<li>${NSD_CreateNumber}</li>\n<li>${NSD_CreateFileRequest}</li>\n<li>${NSD_CreateDirRequest}</li>\n<li>${NSD_CreateComboBox}</li>\n<li>${NSD_CreateDropList}</li>\n<li>${NSD_CreateListBox}</li>\n<li>${NSD_CreateProgressBar}</li>\n</ul>\n\n<p>Returns the new dialog's HWND on the stack or error.</p>\n\n<h3><a name=\"mref-onback\"></a>NSD_OnBack</h3>\n\n<p><code>${NSD_OnBack} <i>function_address</i></code></p>\n\n<p>See <a href=\"#ref-onback\">OnBack</a> for more details.</p>\n\n<p></p>\n\n<h3><a name=\"mref-onchange\"></a>NSD_OnChange</h3>\n\n<p><code>${NSD_OnChange} <i>control_HWND</i> <i>function_address</i></code></p>\n\n<p>See <a href=\"#ref-onchange\">OnChange</a> for more details.</p>\n\n<p>See <a href=\"#step-notify\">Real-time Notification</a> for usage example.</p>\n\n<h3><a name=\"mref-onclick\"></a>NSD_OnClick</h3>\n\n<p><code>${NSD_OnClick} <i>control_HWND</i> <i>function_address</i></code></p>\n\n<p>See <a href=\"#ref-onclick\">OnClick</a> for more details.</p>\n\n<h3><a name=\"mref-onnotify\"></a>NSD_OnNotify</h3>\n\n<p><code>${NSD_OnNotify} <i>control_HWND</i> <i>function_address</i></code></p>\n\n<p>See <a href=\"#ref-onnotify\">OnNotify</a> for more details.</p>\n\n<h3><a name=\"mref-createtimer\"></a>NSD_CreateTimer</h3>\n\n<p><code>${NSD_CreateTimer} <i>function_address</i> <i>timer_interval</i></code></p>\n\n<p>See <a href=\"#ref-createtimer\">CreateTimer</a> for more details.</p>\n\n<h3><a name=\"mref-killtimer\"></a>NSD_KillTimer</h3>\n\n<p><code>${NSD_KillTimer} <i>function_address</i></code></p>\n\n<p>See <a href=\"#ref-killtimer\">KillTimer</a> for more details.</p>\n\n<h3><a name=\"mref-addstyle\"></a>NSD_AddStyle</h3>\n\n<p><code>${NSD_AddStyle} <i>control_HWND</i> <i>style</i></code></p>\n\n<p>Adds one or more window style to a control. Multiple styles should be separated with pipes `|'.</p>\n\n<p>See MSDN for style description.</p>\n\n<h3><a name=\"mref-addexstyle\"></a>NSD_AddExStyle</h3>\n\n<p><code>${NSD_AddExStyle} <i>control_HWND</i> <i>style</i></code></p>\n\n<p>Adds one or more extended window style to a control. Multiple styles should be separated with pipes `|'.</p>\n\n<p>See MSDN for style description.</p>\n\n<h3><a name=\"mref-gettext\"></a>NSD_GetText</h3>\n\n<p><code>${NSD_GetText} <i>control_HWND</i> <i>output_variable</i></code></p>\n\n<p>Retrieves the text of a control and stores it into <i>output_variable</i>. Especially useful for textual controls.</p>\n\n<p>See <a href=\"#step-state\">Control State</a> for usage example.</p>\n\n<h3><a name=\"mref-settext\"></a>NSD_SetText</h3>\n\n<p><code>${NSD_SetText} <i>control_HWND</i> <i>text</i></code></p>\n\n<p>Sets the text of a control.</p>\n\n<h3><a name=\"mref-settextlimit\"></a>NSD_SetTextLimit</h3>\n\n<p><code>${NSD_SetTextLimit} <i>control_HWND</i> <i>limit</i></code></p>\n\n<p>Sets input size limit for a text control.</p>\n\n<h3><a name=\"mref-getstate\"></a>NSD_GetState</h3>\n\n<p><code>${NSD_GetState} <i>control_HWND</i> <i>output_variable</i></code></p>\n\n<p>Retrieves the state of a check box or a radio button control. Possible outputs are ${BST_CHECKED} and ${BST_UNCHECKED}.</p>\n\n<p>See <a href=\"#step-memory\">Memory</a> for usage example.</p>\n\n<h3><a name=\"mref-setstate\"></a>NSD_SetState</h3>\n\n<p><code>${NSD_SetState} <i>control_HWND</i> <i>state</i></code></p>\n\n<p>Sets the state of a check box or a radio button control. Possible values for <i>state</i> are ${BST_CHECKED} and ${BST_UNCHECKED}.</p>\n\n<p>See <a href=\"#step-memory\">Memory</a> for usage example.</p>\n\n<h3><a name=\"mref-check\"></a>NSD_Check</h3>\n\n<p><code>${NSD_Check} <i>control_HWND</i></code></p>\n\n<p>Checks a check box or a radio button control. Same as calling ${NSD_SetState} with ${BST_CHECKED}.</p>\n\n<h3><a name=\"mref-uncheck\"></a>NSD_Uncheck</h3>\n\n<p><code>${NSD_Uncheck} <i>control_HWND</i></code></p>\n\n<p>Unchecks a check box or a radio button control. Same as calling ${NSD_SetState} with ${BST_UNCHECKED}.</p>\n\n<p>See <a href=\"#step-memory\">Memory</a> for usage example.</p>\n\n<h3><a name=\"mref-cbaddstring\"></a>NSD_CB_AddString</h3>\n\n<p><code>${NSD_CB_AddString} <i>combo_HWND</i> <i>string</i></code></p>\n\n<p>Adds a string to a combo box.</p>\n\n<h3><a name=\"mref-cbselectstring\"></a>NSD_CB_SelectString</h3>\n\n<p><code>${NSD_CB_SelectString} <i>combo_HWND</i> <i>string</i></code></p>\n\n<p>Selects a string in a combo box.</p>\n\n<h3><a name=\"mref-lbaddstring\"></a>NSD_LB_AddString</h3>\n\n<p><code>${NSD_LB_AddString} <i>listbox_HWND</i> <i>string</i></code></p>\n\n<p>Adds a string to a list box.</p>\n\n<h3><a name=\"mref-lbdelstring\"></a>NSD_LB_DelString</h3>\n\n<p><code>${NSD_LB_DelString} <i>listbox_HWND</i> <i>string</i></code></p>\n\n<p>Deletes a string from a list box.</p>\n\n<h3><a name=\"mref-lbcleqar\">NSD_LB_Clear</a></h3>\n\n<p><code>${NSD_LB_Clear} <i>listbox_HWND</i></code></p>\n\n<p>Deletes all strings from a list box.</p>\n\n<h3><a name=\"mref-lbgetcount\">NSD_LB_GetCount</a></h3>\n\n<p><code>${NSD_LB_GetCount} <i>listbox_HWND</i> <i>output_variable</i></code></p>\n\n<p>Retrieves the number of strings from a list box.</p>\n\n<h3><a name=\"mref-lbselectstring\"></a>NSD_LB_SelectString</h3>\n\n<p><code>${NSD_LB_SelectString} <i>listbox_HWND</i> <i>string</i></code></p>\n\n<p>Selects a string in a list box.</p>\n\n<h3><a name=\"mref-lbgetselection\">NSD_LB_GetSelection</a></h3>\n\n<p><code>${NSD_LB_GetSelection} <i>listbox_HWND</i> <i>output_variable</i></code></p>\n\n<p>Retrieves the selected stringed from a list box. Returns an empty string if no string is selected.</p>\n\n<h3><a name=\"mref-setfocus\"></a>NSD_SetFocus</h3>\n\n<p><code>${NSD_SetFocus} <i>control_HWND</i></code></p>\n\n<p>Sets focus to a control.</p>\n\n<h3><a name=\"mref-setimage\"></a>NSD_SetImage</h3>\n\n<p><code>${NSD_SetImage} <i>control_HWND</i> <i>image_path</i> <i>output_variable</i></code></p>\n\n<p>Loads a bitmap from <i>image_path</i> and displays it on <i>control_HWND</i> created by <a href=\"#mref-create\">${NSD_CreateBitmap}</a>. The image handle is stored in <i>output_variable</i> and should be freed using <a href=\"#mref-freeimage\">${NSD_FreeImage}</a> once no longer necessary.</p>\n\n<p>The image must be extracted to the user's computer prior to calling this macro. A good place to extract images is $PLUGINSDIR.</p>\n\n<blockquote><pre>!include nsDialogs.nsh\n\nName nsDialogs\nOutFile nsDialogs.exe\n\nXPStyle on\n\nPage custom nsDialogsImage\nPage instfiles\n\nVar Dialog\nVar Image\nVar ImageHandle\n\nFunction .onInit\n\n\tInitPluginsDir\n\tFile /oname=$PLUGINSDIR\\image.bmp \"${NSISDIR}\\Contrib\\Graphics\\Header\\nsis-r.bmp\"\n\nFunctionEnd\n\nFunction nsDialogsImage\n\n\tnsDialogs::Create 1018\n\tPop $Dialog\n\n\t${If} $Dialog == error\n\t\tAbort\n\t${EndIf}\n\n\t${NSD_CreateBitmap} 0 0 100% 100% \"\"\n\tPop $Image\n\t${NSD_SetImage} $Image $PLUGINSDIR\\image.bmp $ImageHandle\n\n\tnsDialogs::Show\n\n\t${NSD_FreeImage} $ImageHandle\n\nFunctionEnd\n\nSection\nSectionEnd</pre></blockquote>\n\n<h3><a name=\"mref-setsimage\"></a>NSD_SetStretchedImage</h3>\n\n<p><code>${NSD_SetStretchedImage} <i>control_HWND</i> <i>image_path</i> <i>output_variable</i></code></p>\n\n<p>Loads and displays a bitmap just like <a href=\"#mref-setimage\">${NSD_SetImage}</a>, but stretched the image to fit the control.</p>\n\n<h3><a name=\"mref-seticon\"></a>NSD_SetIcon</h3>\n\n<p><code>${NSD_SetIcon} <i>control_HWND</i> <i>image_path</i> <i>output_variable</i></code></p>\n\n<p>Same as <a href=\"#mref-setimage\">${NSD_SetImage}</a>, but used for loading and setting an icon in a control created by <a href=\"#mref-create\">${NSD_CreateIcon}</a>. The image handle is stored in <i>output_variable</i> and should be freed using <a href=\"#mref-freeicon\">${NSD_FreeIcon}</a> once no longer necessary.</p>\n\n<h3><a name=\"mref-seticonfrominstaller\"></a>NSD_SetIconFromInstaller</h3>\n\n<p><code>${NSD_SetIconFromInstaller} <i>control_HWND</i> <i>output_variable</i></code></p>\n\n<p>Loads the icon used in the isntaller and displays it on <i>control_HWND</i> created by <a href=\"#mref-create\">${NSD_CreateIcon}</a>. The image handle is stored in <i>output_variable</i> and should be freed using <a href=\"#mref-freeicon\">${NSD_FreeIcon}</a> once no longer necessary.</p>\n\n<h3><a name=\"mref-clearimage\"></a>NSD_ClearImage</h3>\n\n<p><code>${NSD_ClearImage} <i>control_HWND</i></code></p>\n\n<p>Clears an image from a control.</p>\n\n<h3><a name=\"mref-clearicon\"></a>NSD_ClearIcon</h3>\n\n<p><code>${NSD_ClearIcon} <i>control_HWND</i></code></p>\n\n<p>Clears an icon from a control.</p>\n\n<h3><a name=\"mref-freeimage\"></a>NSD_FreeImage</h3>\n\n<p><code>${NSD_FreeImage} <i>image_handle</i></code></p>\n\n<p>Frees an image handle previously loaded with <a href=\"#mref-setimage\">${NSD_SetImage}</a> or <a href=\"#mref-setsimage\">${NSD_SetStretchedImage}</a>.</p>\n\n<h3><a name=\"mref-freeicon\"></a>NSD_FreeIcon</h3>\n\n<p><code>${NSD_FreeIcon} <i>icon_handle</i></code></p>\n\n<p>Frees an icon handle previously loaded with <a href=\"#mref-seticon\">${NSD_SetIcon}</a> or <a href=\"#mref-seticonfrominstaller\">${NSD_SetIconFromInstaller}</a>.</p>\n\n\n<h2><a name=\"faq\"></a>FAQ</h2>\n\n<div>\n\n<ul>\n\n<li>\n<b>Q:</b> Can nsDialogs handle InstallOptions INI files?\n<blockquote>\n<p><b>A:</b> nsDialogs.nsh contains a function called <i>CreateDialogFromINI</i> that can create nsDialogs' dialog from an INI file. It can handle every type of control InstallOptions supports, but doesn't handle the flags or notification yet. <i>Examples\\nsDialogs\\InstallOptions.nsi</i> shows a usage example of this function.</p><p>In the future there'll also be a function that creates the script itself.\n</blockquote>\n</li>\n\n</ul>\n\n</div>\n\n</body>\n</html>\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Docs/nsExec/nsExec.txt",
    "content": "nsExec\n------\nnsExec will execute command-line based programs and capture the output\nwithout opening a dos box.\n\n\nUsage\n-----\nnsExec::Exec [/OEM] [/TIMEOUT=x] path\n\n-or-\n\nnsExec::ExecToLog [/OEM] [/TIMEOUT=x] path\n\n-or-\n\nnsExec::ExecToStack [/OEM] [/TIMEOUT=x] path\n\nAll functions are the same except ExecToLog will print the output\nto the log window and ExecToStack will push up to ${NSIS_MAX_STRLEN}\ncharacters of output onto the stack after the return value.\n\nUse the /OEM switch to convert the output text from OEM to ANSI.\n\nThe timeout value is optional.  The timeout is the time in\nmilliseconds nsExec will wait for output.  If output from the\nprocess is received, the timeout value is reset and it will\nagain wait for more output using the timeout value.  See Return \nValue for how to check if there was a timeout.\n\nTo ensure that command are executed without problems on all windows versions,\nis recommended to use the following syntax:\n\n   nsExec::ExecToStack [OPTIONS] '\"PATH\" param1 param2 paramN'\n\nThis way the application path may contain non 8.3 paths (with spaces)\n\nReturn Value\n------------\nIf nsExec is unable to execute the process, it will return \"error\"\non the top of the stack, if the process timed out it will return\n\"timeout\", else it will return the return code from the\nexecuted process.\n\n\nCopyright Info\n--------------\nCopyright (c) 2002 Robert Rainwater\nThanks to Justin Frankel and Amir Szekely"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/AdvSplash/Example.nsi",
    "content": "Name \"AdvSplash.dll test\"\n\nOutFile \"AdvSplash Test.exe\"\n\nXPStyle on\n\nFunction .onInit\n        # the plugins dir is automatically deleted when the installer exits\n        InitPluginsDir\n        File /oname=$PLUGINSDIR\\splash.bmp \"${NSISDIR}\\Contrib\\Graphics\\Header\\nsis.bmp\"\n        #optional\n        #File /oname=$PLUGINSDIR\\splash.wav \"C:\\myprog\\sound.wav\"\n\n        MessageBox MB_OK \"Fading\"\n\n        advsplash::show 1000 600 400 -1 $PLUGINSDIR\\splash\n\n        Pop $0          ; $0 has '1' if the user closed the splash screen early,\n                        ; '0' if everything closed normally, and '-1' if some error occurred.\n\n        MessageBox MB_OK \"Transparency\"\n        File /oname=$PLUGINSDIR\\splash.bmp \"${NSISDIR}\\Contrib\\Graphics\\Wizard\\orange-uninstall.bmp\"\n        advsplash::show 2000 0 0 0x1856B1 $PLUGINSDIR\\splash\n        Pop $0 \n\n        MessageBox MB_OK \"Transparency/Fading\"\n        File /oname=$PLUGINSDIR\\splash.bmp \"${NSISDIR}\\Contrib\\Graphics\\Wizard\\llama.bmp\"\n        advsplash::show 1000 600 400 0x04025C $PLUGINSDIR\\splash\n        Pop $0 \n\n        Delete $PLUGINSDIR\\splash.bmp\nFunctionEnd\n\nSection\nSectionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Banner/Example.nsi",
    "content": "# Look at Readme.txt for usage alongside with the Modern UI\n\n!include \"WinMessages.nsh\"\n\nName \"Banner.dll test\"\n\nOutFile \"Banner Test.exe\"\n\nShowInstDetails show\n\nFunction .onInit\n\tBanner::show \"Calculating important stuff...\"\n\n\tBanner::getWindow\n\tPop $1\n\n\tagain:\n\t\tIntOp $0 $0 + 1\n\t\tSleep 1\n\t\tStrCmp $0 100 0 again\n\n\tGetDlgItem $2 $1 1030\n\tSendMessage $2 ${WM_SETTEXT} 0 \"STR:Calculating more important stuff...\"\n\n\tagain2:\n\t\tIntOp $0 $0 + 1\n\t\tSleep 1\n\t\tStrCmp $0 200 0 again2\n\n\tBanner::destroy\nFunctionEnd\n\nSection\n\tDetailPrint \"Using previous calculations to quickly calculate 1*2000...\"\n\tSleep 1000\n\tDetailPrint \"Eureka! It's $0!!!\"\n\tDetailPrint \"\"\nSectionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/BgImage/Example.nsi",
    "content": "Name \"BgImage.dll test\"\n\nOutFile \"BgImage Test.exe\"\n\nXPStyle on\n\n!define DEBUG\n!macro GetReturnValue\n!ifdef DEBUG\n\tPop $R9\n\tStrCmp $R9 success +2\n\t\tDetailPrint \"Error: $R9\"\n!endif\n!macroend\n\nFunction .onGUIInit\n\t# the plugins dir is automatically deleted when the installer exits\n\tInitPluginsDir\n\t# lets extract some bitmaps...\n\tFile /oname=$PLUGINSDIR\\1.bmp \"${NSISDIR}\\Contrib\\Graphics\\Wizard\\llama.bmp\"\n\tFile /oname=$PLUGINSDIR\\2.bmp \"${NSISDIR}\\Contrib\\Graphics\\Checks\\modern.bmp\"\n\n!ifdef DEBUG\n\t# turn return values on if in debug mode\n\tBgImage::SetReturn on\n!endif\n\n\t# set the initial background for images to be drawn on\n\t# we will use a gradient from drak green to dark red\n\tBgImage::SetBg /GRADIENT 0 0x80 0 0x80 0 0\n\t!insertmacro GetReturnValue\n\t# add an image @ (150,0)\n\tBgImage::AddImage $PLUGINSDIR\\2.bmp 150 0\n\t!insertmacro GetReturnValue\n\t# add the same image only transparent (magenta wiped) @ (150,16)\n\tBgImage::AddImage /TRANSPARENT 255 0 255 $PLUGINSDIR\\2.bmp 150 16\n\t!insertmacro GetReturnValue\n\t# create the font for the following text\n\tCreateFont $R0 \"Comic Sans MS\" 50 700\n\t# add a blue shadow for the text\n\tBgImage::AddText \"Testing 1... 2... 3...\" $R0 0 0 255 48 48 798 198\n\t!insertmacro GetReturnValue\n\t# add a green shadow for the text\n\tBgImage::AddText \"Testing 1... 2... 3...\" $R0 0 255 0 52 52 802 202\n\t!insertmacro GetReturnValue\n\t# add the text\n\tBgImage::AddText \"Testing 1... 2... 3...\" $R0 255 0 0 50 50 800 200\n\t!insertmacro GetReturnValue\n\t# show our creation to the world!\n\tBgImage::Redraw\n\t# Refresh doesn't return any value\n\t\nFunctionEnd\n\nShowInstDetails show\n\nSection\n\t# play some sounds\n\tFindFirst $0 $1 $WINDIR\\Media\\*.wav\n\tStrCmp $0 \"\" skipSound\n\t\tmoreSounds:\n\t\tStrCmp $1 \"\" noMoreSounds\n\t\t\tBgImage::Sound /WAIT $WINDIR\\Media\\$1\n\t\t\t# Sound doesn't return any value either\n\t\t\tMessageBox MB_YESNO \"Another sound?\" IDNO noMoreSounds\n\t\t\t\tFindNext $0 $1\n\t\t\t\tGoto moreSounds\n\n\tnoMoreSounds:\n\t\tFindClose $0\n\tskipSound:\n\n\t# change the background image to Mike, tiled\n\tBgImage::SetBg /TILED $PLUGINSDIR\\1.bmp\n\t!insertmacro GetReturnValue\n\t# we have to redraw to reflect the changes\n\tBgImage::Redraw\n\n\tMessageBox MB_OK \"Mike the llama\"\n\n\t# clear everything\n\tBgImage::Clear\n\t# Clear doesn't return any value\n\t# set another gradient\n\tBgImage::SetBg /GRADIENT 0xFF 0xFA 0xBA 0xAA 0xA5 0x65\n\t!insertmacro GetReturnValue\n\t# add some text\n\tBgImage::AddText \"A Desert for Mike\" $R0 0 0 0 50 50 800 150\n\t!insertmacro GetReturnValue\n\t# add mike as an image\n\tBgImage::AddImage $PLUGINSDIR\\1.bmp 50 150\n\t!insertmacro GetReturnValue\n\t# again, we have to call redraw to reflect changes\n\tBgImage::Redraw\nSectionEnd\n\nFunction .onGUIEnd\n\tBgImage::Destroy\n\t# Destroy doesn't return any value\nFunctionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/FileFunc.ini",
    "content": "[Settings]\nNumFields=11\nNextButtonText=&Enter\n\n[Field 1]\nType=Droplist\nFlags=NOTIFY\nState=\"  1. Locate\"\nListItems=|  1. Locate|  2. GetSize                 (file)|                                   (directory)|                                   (no size, no subdir)|  3. DriveSpace|  4. GetDrives             (by type)|                                   (all by letter)|  5. GetTime                (local time)|                                   (file time)|  6. GetFileAttributes|  7. GetFileVersion|  8. GetExeName|  9. GetExePath|10. GetParameters|11. GetOptions|12. GetRoot|13. GetParent|14. GetFileName|15. GetBaseName|16. GetFileExt|17. BannerTrimPath|18. DirState|19. RefreshShellIcons\nLeft=44\nRight=190\nTop=1\nBottom=210\n\n[Field 2]\nType=FileRequest\nLeft=44\nRight=-10\nTop=22\nBottom=33\n\n[Field 3]\nType=DirRequest\nLeft=44\nRight=-10\nTop=22\nBottom=33\n\n[Field 4]\nType=Text\nLeft=44\nRight=-10\nTop=36\nBottom=49\n\n[Field 5]\nType=Text\nState=LocateCallback\nLeft=44\nRight=232\nTop=53\nBottom=66\n\n[Field 6]\nType=Button\nText=view\nFlags=NOTIFY\nLeft=236\nRight=255\nTop=54\nBottom=65\n\n[Field 7]\nType=Text\nFlags=MULTILINE|VSCROLL|HSCROLL|READONLY\nLeft=44\nRight=-10\nTop=73\nBottom=128\n\n[Field 8]\nType=Label\nText=Path\nLeft=10\nRight=43\nTop=24\nBottom=36\n\n[Field 9]\nType=Label\nText=Options\nLeft=10\nRight=43\nTop=40\nBottom=52\n\n[Field 10]\nType=Label\nText=Function\nLeft=10\nRight=44\nTop=56\nBottom=67\n\n[Field 11]\nType=Label\nText=Result:\nLeft=12\nRight=42\nTop=94\nBottom=102\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/FileFunc.nsi",
    "content": ";_____________________________________________________________________________\n;\n;                          File Functions\n;_____________________________________________________________________________\n;\n; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)\n\nName \"File Functions\"\nOutFile \"FileFunc.exe\"\nCaption \"$(^Name)\"\nXPStyle on\nRequestExecutionLevel user\n\n!include \"WinMessages.nsh\"\n!include \"FileFunc.nsh\"\n\nVar INI\nVar HWND\nVar STATE\nVar FUNCTION\nVar LOCATE1\nVar LOCATE2\nVar GETSIZE1\nVar GETSIZE2\nVar GETSIZE3\nVar GETSIZE4\nVar GETSIZE5\nVar GETSIZE6\nVar DRIVESPACE1\nVar DRIVESPACE2\nVar GETDRIVES1\nVar GETTIME1\nVar GETTIME2\nVar GETFILEATTRIBUTES1\nVar GETFILEATTRIBUTES2\nVar GETFILEVERSION1\nVar GETOPTIONS1\nVar GETOPTIONS2\nVar GETROOT1\nVar GETPARENT1\nVar GETFILENAME1\nVar GETBASENAME1\nVar GETFILEEXT1\nVar BANNERTRIMPATH1\nVar BANNERTRIMPATH2\nVar DIRSTATE1\n\nPage Custom ShowCustom LeaveCustom\n\nFunction ShowCustom\n\tInstallOptions::initDialog \"$INI\"\n\tPop $hwnd\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1206\n\tEnableWindow $1 0\n\tSendMessage $1 ${WM_ENABLE} 1 0\n\tStrCpy $LOCATE1 $DOCUMENTS\n\tStrCpy $LOCATE2 '/L=FD /M=*.* /S=0B /G=1 /B=0'\n\tStrCpy $GETSIZE1 '$WINDIR'\n\tStrCpy $GETSIZE2 '/M=Explorer.exe /S=0K /G=0'\n\tStrCpy $GETSIZE3 '$PROGRAMFILES\\Common Files'\n\tStrCpy $GETSIZE4 '/S=0M'\n\tStrCpy $GETSIZE5 '$WINDIR'\n\tStrCpy $GETSIZE6 '/G=0'\n\tStrCpy $DRIVESPACE1 'C:\\'\n\tStrCpy $DRIVESPACE2 '/D=F /S=M'\n\tStrCpy $GETDRIVES1 'FDD+CDROM'\n\tStrCpy $GETTIME1 '$WINDIR\\Explorer.exe'\n\tStrCpy $GETTIME2 'C'\n\tStrCpy $GETFILEATTRIBUTES1 'C:\\IO.SYS'\n\tStrCpy $GETFILEATTRIBUTES2 'ALL'\n\tStrCpy $GETFILEVERSION1 '$WINDIR\\Explorer.exe'\n\tStrCpy $GETOPTIONS1 '/SILENT=yes /INSTDIR=\"$PROGRAMFILES\\Common Files\"'\n\tStrCpy $GETOPTIONS2 '/INSTDIR='\n\tStrCpy $GETROOT1 'C:\\path\\file.dll'\n\tStrCpy $GETPARENT1 'C:\\path\\file.dll'\n\tStrCpy $GETFILENAME1 'C:\\path\\file.dll'\n\tStrCpy $GETBASENAME1 'C:\\path\\file.dll'\n\tStrCpy $GETFILEEXT1 'C:\\path\\file.dll'\n\tStrCpy $BANNERTRIMPATH1 'C:\\Server\\Documents\\Terminal\\license.htm'\n\tStrCpy $BANNERTRIMPATH2 '34A'\n\tStrCpy $DIRSTATE1 '$TEMP'\n\n\tGetDlgItem $1 $HWND 1203\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$LOCATE1\"\n\tGetDlgItem $1 $HWND 1205\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$LOCATE2\"\n\tInstallOptions::show\n\tPop $0\nFunctionEnd\n\nFunction LeaveCustom\n\tReadINIStr $STATE $INI \"Field 1\" \"State\"\n\tReadINIStr $R1 $INI \"Field 2\" \"State\"\n\tReadINIStr $R2 $INI \"Field 3\" \"State\"\n\tReadINIStr $R3 $INI \"Field 4\" \"State\"\n\tReadINIStr $R4 $INI \"Field 5\" \"State\"\n\tReadINIStr $0 $INI \"Settings\" \"State\"\n\tStrCmp $0 6 view\n\tStrCmp $0 0 Enter\n\tgoto main\n\n\tview:\n\tStrCpy $0 '$$'\n\tStrCpy $1 'n'\n\tStrCpy $2 'r'\n\tStrCmp $R4 \"LocateCallback\" 0 +3\n\tStrCpy $R0 `Function LocateCallback$\\r$\\n\tMessageBox MB_OKCANCEL '$0$$R9    \"path\\name\"=[$$R9]$0\\$1$0$$R8    \"path\"          =[$$R8]$0\\$1$0$$R7    \"name\"        =[$$R7]$0\\$1$0$$R6    \"size\"           =[$$R6]' IDOK +2$\\r$\\n\tStrCpy $$R0 StopLocate$\\r$\\n$\\r$\\n\tPush $$R0$\\r$\\nFunctionEnd`\n\tgoto send\n\tStrCmp $R4 \"GetDrivesCallback\" 0 error\n\tStrCpy $R0 `Function GetDrivesCallback$\\r$\\n\tMessageBox MB_OKCANCEL '$0$$9    \"drive letter\"=[$$9]$0\\$1$0$$8    \"drive type\" =[$$8]' IDOK +2$\\r$\\n\tStrCpy $$R0 StopGetDrives$\\r$\\n\tStrCpy $$R5 '$$R5$$9  [$$8 Drive]$$\\$2$$\\$1'$\\r$\\n$\\r$\\n\tPush $$R0$\\r$\\nFunctionEnd`\n\tgoto send\n\n\tmain:\n\tStrCmp $FUNCTION '' DefaultSend\n\tStrCmp $FUNCTION Locate 0 +4\n\tStrCpy $LOCATE1 $R2\n\tStrCpy $LOCATE2 $R3\n\tgoto DefaultSend\n\tStrCmp $FUNCTION GetSize1 0 +4\n\tStrCpy $GETSIZE1 $R2\n\tStrCpy $GETSIZE2 $R3\n\tgoto DefaultSend\n\tStrCmp $FUNCTION GetSize2 0 +4\n\tStrCpy $GETSIZE3 $R2\n\tStrCpy $GETSIZE4 $R3\n\tgoto DefaultSend\n\tStrCmp $FUNCTION GetSize3 0 +4\n\tStrCpy $GETSIZE5 $R2\n\tStrCpy $GETSIZE6 $R3\n\tgoto DefaultSend\n\tStrCmp $FUNCTION DriveSpace 0 +4\n\tStrCpy $DRIVESPACE1 $R1\n\tStrCpy $DRIVESPACE2 $R3\n\tgoto DefaultSend\n\tStrCmp $FUNCTION GetDrives 0 +3\n\tStrCpy $GETDRIVES1 $R1\n\tgoto DefaultSend\n\tStrCmp $FUNCTION GetTime 0 +4\n\tStrCpy $GETTIME1 $R1\n\tStrCpy $GETTIME2 $R3\n\tgoto DefaultSend\n\tStrCmp $FUNCTION GetFileAttributes 0 +4\n\tStrCpy $GETFILEATTRIBUTES1 $R1\n\tStrCpy $GETFILEATTRIBUTES2 $R3\n\tgoto DefaultSend\n\tStrCmp $FUNCTION GetFileVersion 0 +3\n\tStrCpy $GETFILEVERSION1 $R1\n\tgoto DefaultSend\n\tStrCmp $FUNCTION GetOptions 0 +4\n\tStrCpy $GETOPTIONS1 $R1\n\tStrCpy $GETOPTIONS2 $R3\n\tgoto DefaultSend\n\tStrCmp $FUNCTION GetRoot 0 +3\n\tStrCpy $GETROOT1 $R1\n\tgoto DefaultSend\n\tStrCmp $FUNCTION GetParent 0 +3\n\tStrCpy $GETPARENT1 $R1\n\tgoto DefaultSend\n\tStrCmp $FUNCTION GetFileName 0 +3\n\tStrCpy $GETFILENAME1 $R1\n\tgoto DefaultSend\n\tStrCmp $FUNCTION GetBaseName 0 +3\n\tStrCpy $GETBASENAME1 $R1\n\tgoto DefaultSend\n\tStrCmp $FUNCTION GetFileExt 0 +3\n\tStrCpy $GETFILEEXT1 $R1\n\tgoto DefaultSend\n\tStrCmp $FUNCTION BannerTrimPath 0 +4\n\tStrCpy $BANNERTRIMPATH1 $R1\n\tStrCpy $BANNERTRIMPATH2 $R3\n\tgoto DefaultSend\n\tStrCmp $FUNCTION DirState 0 +2\n\tStrCpy $DIRSTATE1 $R2\n\n\tDefaultSend:\n\tGetDlgItem $1 $HWND 1201\n\tEnableWindow $1 1\n\tShowWindow $1 0\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1202\n\tEnableWindow $1 1\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1203\n\tEnableWindow $1 1\n\tShowWindow $1 0\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1204\n\tEnableWindow $1 1\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1205\n\tEnableWindow $1 1\n\tGetDlgItem $1 $HWND 1206\n\tShowWindow $1 0\n\tEnableWindow $1 0\n\tGetDlgItem $1 $HWND 1207\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1208\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\n\tReadINIStr $0 $INI \"Field 1\" \"State\"\n\tStrCmp $0 \"  1. Locate\" 0 GetSize1Send\n\tStrCpy $FUNCTION Locate\n\tGetDlgItem $1 $HWND 1203\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$LOCATE1\"\n\tGetDlgItem $1 $HWND 1204\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$LOCATE2\"\n\tGetDlgItem $1 $HWND 1206\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:LocateCallback\"\n\tGetDlgItem $1 $HWND 1207\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Path\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Options\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Function\"\n\tabort\n\n\tGetSize1Send:\n\tStrCmp $0 \"  2. GetSize                 (file)\" 0 GetSize2Send\n\tStrCpy $FUNCTION 'GetSize1'\n\tGetDlgItem $1 $HWND 1203\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETSIZE1\"\n\tGetDlgItem $1 $HWND 1204\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETSIZE2\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:File\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Options\"\n\tAbort\n\n\tGetSize2Send:\n\tStrCmp $0 \"                                   (directory)\" 0 GetSize3Send\n\tStrCpy $FUNCTION 'GetSize2'\n\tGetDlgItem $1 $HWND 1203\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETSIZE3\"\n\tGetDlgItem $1 $HWND 1204\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETSIZE4\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Directory\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Options\"\n\tAbort\n\n\tGetSize3Send:\n\tStrCmp $0 \"                                   (no size, no subdir)\" 0 DriveSpaceSend\n\tStrCpy $FUNCTION 'GetSize3'\n\tGetDlgItem $1 $HWND 1203\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETSIZE5\"\n\tGetDlgItem $1 $HWND 1204\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETSIZE6\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Directory\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Options\"\n\tAbort\n\n\tDriveSpaceSend:\n\tStrCmp $0 \"  3. DriveSpace\" 0 GetDrivesSend\n\tStrCpy $FUNCTION DriveSpace\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$DRIVESPACE1\"\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tEnableWindow $1 0\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$DRIVESPACE2\"\n\tGetDlgItem $1 $HWND 1206\n\tShowWindow $1 0\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1207\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Drive\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Options\"\n\tabort\n\n\tGetDrivesSend:\n\tStrCmp $0 \"  4. GetDrives             (by type)\" 0 GetDrives2Send\n\tStrCpy $FUNCTION GetDrives\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETDRIVES1\"\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tEnableWindow $1 0\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1206\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:GetDrivesCallback\"\n\tGetDlgItem $1 $HWND 1207\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Option\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Function\"\n\tabort\n\n\tGetDrives2Send:\n\tStrCmp $0 \"                                   (all by letter)\" 0 GetTime1Send\n\tStrCpy $FUNCTION ''\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tEnableWindow $1 0\n\tSendMessage $1 ${WM_ENABLE} 1 0\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:ALL\"\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tEnableWindow $1 0\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1206\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:GetDrivesCallback\"\n\tGetDlgItem $1 $HWND 1207\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Option\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Function\"\n\tabort\n\n\tGetTime1Send:\n\tStrCmp $0 \"  5. GetTime                (local time)\" 0 GetTime2Send\n\tStrCpy $FUNCTION ''\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tEnableWindow $1 0\n\tSendMessage $1 ${WM_ENABLE} 1 0\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tEnableWindow $1 0\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 1\n\tEnableWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:L\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Option\"\n\tAbort\n\n\tGetTime2Send:\n\tStrCmp $0 \"                                   (file time)\" 0 GetFileAttributesSend\n\tStrCpy $FUNCTION GetTime\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETTIME1\"\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETTIME2\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:File\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Option\"\n\tAbort\n\n\tGetFileAttributesSend:\n\tStrCmp $0 \"  6. GetFileAttributes\" 0 GetFileVersionSend\n\tStrCpy $FUNCTION GetFileAttributes\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETFILEATTRIBUTES1\"\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETFILEATTRIBUTES2\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Path\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Attrib\"\n\tAbort\n\n\tGetFileVersionSend:\n\tStrCmp $0 \"  7. GetFileVersion\" 0 GetCmdSend\n\tStrCpy $FUNCTION GetFileVersion\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETFILEVERSION1\"\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:File\"\n\tAbort\n\n\tGetCmdSend:\n\tStrCmp $0 \"  8. GetExeName\" +3\n\tStrCmp $0 \"  9. GetExePath\" +2\n\tStrCmp $0 \"10. GetParameters\" 0 GetOptionsSend\n\tStrCpy $FUNCTION ''\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 0\n\tAbort\n\n\tGetOptionsSend:\n\tStrCmp $0 \"11. GetOptions\" 0 GetRootSend\n\tStrCpy $FUNCTION GetOptions\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETOPTIONS1\"\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tEnableWindow $1 0\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETOPTIONS2\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Parameters\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Option\"\n\tAbort\n\n\tGetRootSend:\n\tStrCmp $0 \"12. GetRoot\" 0 GetParentSend\n\tStrCpy $FUNCTION GetRoot\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETROOT1\"\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:FullPath\"\n\tAbort\n\n\tGetParentSend:\n\tStrCmp $0 \"13. GetParent\" 0 GetFileNameSend\n\tStrCpy $FUNCTION GetParent\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETPARENT1\"\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:PathString\"\n\tAbort\n\n\tGetFileNameSend:\n\tStrCmp $0 \"14. GetFileName\" 0 GetBaseNameSend\n\tStrCpy $FUNCTION GetFileName\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETFILENAME1\"\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:PathString\"\n\tAbort\n\n\tGetBaseNameSend:\n\tStrCmp $0 \"15. GetBaseName\" 0 GetFileExtSend\n\tStrCpy $FUNCTION GetBaseName\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETBASENAME1\"\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:FileString\"\n\tAbort\n\n\tGetFileExtSend:\n\tStrCmp $0 \"16. GetFileExt\" 0 BannerTrimPathSend\n\tStrCpy $FUNCTION GetFileExt\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$GETFILEEXT1\"\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:FileString\"\n\tAbort\n\n\tBannerTrimPathSend:\n\tStrCmp $0 \"17. BannerTrimPath\" 0 DirStateSend\n\tStrCpy $FUNCTION BannerTrimPath\n\tGetDlgItem $1 $HWND 1201\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$BANNERTRIMPATH1\"\n\tGetDlgItem $1 $HWND 1202\n\tShowWindow $1 1\n\tEnableWindow $1 0\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$BANNERTRIMPATH2\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:PathString\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Option\"\n\tAbort\n\n\tDirStateSend:\n\tStrCmp $0 \"18. DirState\" 0 RefreshShellIconsSend\n\tStrCpy $FUNCTION DirState\n\tGetDlgItem $1 $HWND 1203\n\tShowWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$DIRSTATE1\"\n\tGetDlgItem $1 $HWND 1204\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Directory\"\n\tAbort\n\n\tRefreshShellIconsSend:\n\tStrCmp $0 \"19. RefreshShellIcons\" 0 Abort\n\tStrCpy $FUNCTION ''\n\tGetDlgItem $1 $HWND 1205\n\tShowWindow $1 0\n\n\tAbort:\n\tAbort\n\n;=Enter=\n\tEnter:\n\tStrCpy $R0 ''\n\tStrCpy $R5 ''\n\n\tStrCmp $STATE \"  1. Locate\" Locate\n\tStrCmp $STATE \"  2. GetSize                 (file)\" GetSize\n\tStrCmp $STATE \"                                   (directory)\" GetSize\n\tStrCmp $STATE \"                                   (no size, no subdir)\" GetSize\n\tStrCmp $STATE \"  3. DriveSpace\" DriveSpace\n\tStrCmp $STATE \"  4. GetDrives             (by type)\" GetDrives\n\tStrCmp $STATE \"                                   (all by letter)\" GetDrives\n\tStrCmp $STATE \"  5. GetTime                (local time)\" GetTime\n\tStrCmp $STATE \"                                   (file time)\" GetTime\n\tStrCmp $STATE \"  6. GetFileAttributes\" GetFileAttributes\n\tStrCmp $STATE \"  7. GetFileVersion\" GetFileVersion\n\tStrCmp $STATE \"  8. GetExeName\" GetExeName\n\tStrCmp $STATE \"  9. GetExePath\" GetExePath\n\tStrCmp $STATE \"10. GetParameters\" GetParameters\n\tStrCmp $STATE \"11. GetOptions\" GetOptions\n\tStrCmp $STATE \"12. GetRoot\" GetRoot\n\tStrCmp $STATE \"13. GetParent\" GetParent\n\tStrCmp $STATE \"14. GetFileName\" GetFileName\n\tStrCmp $STATE \"15. GetBaseName\" GetBaseName\n\tStrCmp $STATE \"16. GetFileExt\" GetFileExt\n\tStrCmp $STATE \"17. BannerTrimPath\" BannerTrimPath\n\tStrCmp $STATE \"18. DirState\" DirState\n\tStrCmp $STATE \"19. RefreshShellIcons\" RefreshShellIcons\n\tAbort\n\n\tLocate:\n\t${Locate} \"$R2\" \"$R3\" \"LocateCallback\"\n\tIfErrors error\n\tStrCmp $R0 StopLocate 0 +3\n\tStrCpy $R0 'stopped'\n\tgoto send\n\tStrCpy $R0 'done'\n\tgoto send\n\n\tGetSize:\n\t${GetSize} \"$R2\" \"$R3\" $0 $1 $2\n\tIfErrors error\n\tStrCpy $R0 \"Size=$0$\\r$\\nFiles=$1$\\r$\\nFolders=$2\"\n\tgoto send\n\n\tDriveSpace:\n\t${DriveSpace} \"$R1\" \"$R3\" $0\n\tIfErrors error\n\tStrCpy $R0 \"$0\"\n\tgoto send\n\n\tGetDrives:\n\t${GetDrives} \"$R1\" \"GetDrivesCallback\"\n\tStrCmp $R0 StopGetDrives 0 +3\n\tStrCpy $R0 '$R5stopped'\n\tgoto send\n\tStrCpy $R0 '$R5done'\n\tgoto send\n\n\tGetTime:\n\t${GetTime} \"$R1\" \"$R3\" $0 $1 $2 $3 $4 $5 $6\n\tIfErrors error\n\tStrCpy $R0 'Date=$0/$1/$2 ($3)$\\r$\\nTime=$4:$5:$6'\n\tgoto send\n\n\tGetFileAttributes:\n\t${GetFileAttributes} \"$R1\" \"$R3\" $0\n\tIfErrors error\n\tStrCpy $R0 '$0'\n\tgoto send\n\n\tGetFileVersion:\n\t${GetFileVersion} \"$R1\" $0\n\tIfErrors error\n\tStrCpy $R0  '$0'\n\tgoto send\n\n\tGetExeName:\n\t${GetExeName} $0\n\tStrCpy $R0 '$0'\n\tgoto send\n\n\tGetExePath:\n\t${GetExePath} $0\n\tStrCpy $R0 '$0'\n\tgoto send\n\n\tGetParameters:\n\t${GetParameters} $0\n\tStrCpy $R0 '$0'\n\tStrCmp $R0 '' 0 send\n\tStrCpy $R0 'no parameters'\n\tgoto send\n\n\tGetOptions:\n\t${GetOptions} \"$R1\" \"$R3\" $0\n\tIfErrors error\n\tStrCpy $R0  '$0'\n\tgoto send\n\n\tGetRoot:\n\t${GetRoot} \"$R1\" $0\n\tStrCpy $R0  '$0'\n\tgoto send\n\n\tGetParent:\n\t${GetParent} \"$R1\" $0\n\tStrCpy $R0  '$0'\n\tgoto send\n\n\tGetFileName:\n\t${GetFileName} \"$R1\" $0\n\tStrCpy $R0  '$0'\n\tgoto send\n\n\tGetBaseName:\n\t${GetBaseName} \"$R1\" $0\n\tStrCpy $R0  '$0'\n\tgoto send\n\n\tGetFileExt:\n\t${GetFileExt} \"$R1\" $0\n\tStrCpy $R0  '$0'\n\tgoto send\n\n\tBannerTrimPath:\n\t${BannerTrimPath} \"$R1\" \"$R3\" $0\n\tStrCpy $R0  '$0'\n\tgoto send\n\n\tDirState:\n\t${DirState} \"$R2\" $0\n\tStrCpy $R0  '$0'\n\tgoto send\n\n\tRefreshShellIcons:\n\t${RefreshShellIcons}\n\tStrCpy $R0 'done'\n\tgoto send\n\n\terror:\n\tStrCpy $R0 'error'\n\n\tsend:\n\tGetDlgItem $1 $HWND 1208\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$R0\"\n\n\tabort\nFunctionEnd\n\nFunction LocateCallback\n\tMessageBox MB_OKCANCEL '$$R9    \"path\\name\"=[$R9]$\\n$$R8    \"path\"          =[$R8]$\\n$$R7    \"name\"        =[$R7]$\\n$$R6    \"size\"           =[$R6]' IDOK +2\n\tStrCpy $R0 StopLocate\n\n\tPush $R0\nFunctionEnd\n\nFunction GetDrivesCallback\n\tMessageBox MB_OKCANCEL '$$9    \"drive letter\"=[$9]$\\n$$8    \"drive type\" =[$8]' IDOK +2\n\tStrCpy $R0 StopGetDrives\n\tStrCpy $R5 '$R5$9  [$8 Drive]$\\r$\\n'\n\n\tPush $R0\nFunctionEnd\n\nFunction .onInit\n\tInitPluginsDir\n\tGetTempFileName $INI $PLUGINSDIR\n\tFile /oname=$INI \"FileFunc.ini\"\nFunctionEnd\n\nPage instfiles\n\nSection \"Empty\"\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/FileFuncTest.nsi",
    "content": ";_____________________________________________________________________________\n;\n;                          File Functions Test\n;_____________________________________________________________________________\n;\n; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)\n\nName \"File Functions Test\"\nOutFile \"FileFuncTest.exe\"\nCaption \"$(^Name)\"\nShowInstDetails show\nXPStyle on\nRequestExecutionLevel user\n\nVar FUNCTION\nVar OUT1\nVar OUT2\nVar OUT3\nVar OUT4\nVar OUT5\nVar OUT6\nVar OUT7\n\n!include \"FileFunc.nsh\"\n!include \"LogicLib.nsh\"\n\n;############### INSTALL ###############\n\n!define StackVerificationStart `!insertmacro StackVerificationStart`\n!macro StackVerificationStart _FUNCTION\n\tStrCpy $FUNCTION ${_FUNCTION}\n\tCall StackVerificationStart\n!macroend\n\n!define StackVerificationEnd `!insertmacro StackVerificationEnd`\n!macro StackVerificationEnd\n\tCall StackVerificationEnd\n!macroend\n\nFunction StackVerificationStart\n\tStrCpy $0 !0\n\tStrCpy $1 !1\n\tStrCpy $2 !2\n\tStrCpy $3 !3\n\tStrCpy $4 !4\n\tStrCpy $5 !5\n\tStrCpy $6 !6\n\tStrCpy $7 !7\n\tStrCpy $8 !8\n\tStrCpy $9 !9\n\tStrCpy $R0 !R0\n\tStrCpy $R1 !R1\n\tStrCpy $R2 !R2\n\tStrCpy $R3 !R3\n\tStrCpy $R4 !R4\n\tStrCpy $R5 !R5\n\tStrCpy $R6 !R6\n\tStrCpy $R7 !R7\n\tStrCpy $R8 !R8\n\tStrCpy $R9 !R9\nFunctionEnd\n\nFunction StackVerificationEnd\n\tIfErrors +3\n\tDetailPrint 'PASSED $FUNCTION no errors'\n\tgoto +2\n\tDetailPrint 'FAILED   $FUNCTION error'\n\n\tStrCmp $0 '!0' 0 error\n\tStrCmp $1 '!1' 0 error\n\tStrCmp $2 '!2' 0 error\n\tStrCmp $3 '!3' 0 error\n\tStrCmp $4 '!4' 0 error\n\tStrCmp $5 '!5' 0 error\n\tStrCmp $6 '!6' 0 error\n\tStrCmp $7 '!7' 0 error\n\tStrCmp $8 '!8' 0 error\n\tStrCmp $9 '!9' 0 error\n\tStrCmp $R0 '!R0' 0 error\n\tStrCmp $R1 '!R1' 0 error\n\tStrCmp $R2 '!R2' 0 error\n\tStrCmp $R3 '!R3' 0 error\n\tStrCmp $R4 '!R4' 0 error\n\tStrCmp $R5 '!R5' 0 error\n\tStrCmp $R6 '!R6' 0 error\n\tStrCmp $R7 '!R7' 0 error\n\tStrCmp $R8 '!R8' 0 error\n\tStrCmp $R9 '!R9' 0 error\n\tDetailPrint 'PASSED $FUNCTION stack'\n\tgoto end\n\n\terror:\n\tDetailPrint 'FAILED   $FUNCTION stack'\n;\tMessageBox MB_OKCANCEL '$$0={$0}$\\n$$1={$1}$\\n$$2={$2}$\\n$$3={$3}$\\n$$4={$4}$\\n$$5={$5}$\\n$$6={$6}$\\n$$7={$7}$\\n$$8={$8}$\\n$$9={$9}$\\n$$R0={$R0}$\\n$$R1={$R1}$\\n$$R2={$R2}$\\n$$R3={$R3}$\\n$$R4={$R4}$\\n$$R5={$R5}$\\n$$R6={$R6}$\\n$$R7={$R7}$\\n$$R8={$R8}$\\n$$R9={$R9}' IDOK +2\n;\tquit\n\n\tend:\nFunctionEnd\n\n\n\nSection Locate\n\t${StackVerificationStart} Locate\n\n\t${Locate} '$DOCUMENTS' '/L=FD /M=*.* /S=0B /G=0' 'LocateCallback'\n\n\t${StackVerificationEnd}\nSectionEnd\n\nFunction LocateCallback\n;\tMessageBox MB_YESNO '$$0={$0}$\\n$$1={$1}$\\n$$2={$2}$\\n$$3={$3}$\\n$$4={$4}$\\n$$5={$5}$\\n$$6={$6}$\\n$$7={$7}$\\n$$8={$8}$\\n$$9={$9}$\\n$$R0={$R0}$\\n$$R1={$R1}$\\n$$R2={$R2}$\\n$$R3={$R3}$\\n$$R4={$R4}$\\n$$R5={$R5}$\\n$$R6={$R6}$\\n$$R7={$R7}$\\n$$R8={$R8}$\\n$$R9={$R9}$\\n$\\nContinue?' IDYES +2\n;\tStrCpy $0 StopLocate\n\n\tPush $0\nFunctionEnd\n\n\nSection GetSize\n\t${StackVerificationStart} GetSize\n\n\t${GetSize} '$WINDIR' '/M=Explorer.exe /S=0K /G=0' $OUT1 $OUT2 $OUT3\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection DriveSpace\n\t${StackVerificationStart} DriveSpace\n\n\t${DriveSpace} 'C:\\' '/D=F /S=M' $OUT1\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection GetDrives\n\t${StackVerificationStart} GetDrives\n\n\t${GetDrives} 'FDD+CDROM' 'GetDrivesCallback'\n\n\t${StackVerificationEnd}\nSectionEnd\n\nFunction GetDrivesCallback\n;\tMessageBox MB_YESNO '$$0={$0}$\\n$$1={$1}$\\n$$2={$2}$\\n$$3={$3}$\\n$$4={$4}$\\n$$5={$5}$\\n$$6={$6}$\\n$$7={$7}$\\n$$8={$8}$\\n$$9={$9}$\\n$$R0={$R0}$\\n$$R1={$R1}$\\n$$R2={$R2}$\\n$$R3={$R3}$\\n$$R4={$R4}$\\n$$R5={$R5}$\\n$$R6={$R6}$\\n$$R7={$R7}$\\n$$R8={$R8}$\\n$$R9={$R9}$\\n$\\nContinue?' IDYES +2\n;\tStrCpy $0 StopGetDrives\n\n\tPush $0\nFunctionEnd\n\n\nSection GetTime\n\t${StackVerificationStart} GetTime\n\n\t${GetTime} '' 'L' $OUT1 $OUT2 $OUT3 $OUT4 $OUT5 $OUT6 $OUT7\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection GetFileAttributes\n\t${StackVerificationStart} GetFileAttributes\n\n\t${GetFileAttributes} '$WINDIR\\explorer.exe' 'ALL' $OUT1\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection GetFileVersion\n\t${StackVerificationStart} GetFileVersion\n\n\t${GetFileVersion} '$WINDIR\\explorer.exe' $OUT1\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection GetExeName\n\t${StackVerificationStart} GetExeName\n\n\t${GetExeName} $OUT1\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection GetExePath\n\t${StackVerificationStart} GetExePath\n\n\t${GetExePath} $OUT1\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection GetParameters\n\t${StackVerificationStart} GetParameters\n\n\t# basic stuff\n\n\tStrCpy $CMDLINE '\"$PROGRAMFILES\\Something\\Hello.exe\"'\n\t${GetParameters} $OUT1\n\tStrCpy $CMDLINE '\"$PROGRAMFILES\\Something\\Hello.exe\" test'\n\t${GetParameters} $OUT2\n\tStrCpy $CMDLINE '\"$PROGRAMFILES\\Something\\Hello.exe\" \"test\"'\n\t${GetParameters} $OUT3\n\tStrCpy $CMDLINE 'C:\\Hello.exe'\n\t${GetParameters} $OUT4\n\tStrCpy $CMDLINE 'C:\\Hello.exe test'\n\t${GetParameters} $OUT5\n\tStrCpy $CMDLINE 'C:\\Hello.exe \"test\"'\n\t${GetParameters} $OUT6\n\tStrCpy $CMDLINE 'C:\\Hello.exe       test test  '\n\t${GetParameters} $OUT7\n\n\t${If} $OUT1 != \"\"\n\t${OrIf} $OUT2 != \"test\"\n\t${OrIf} $OUT3 != '\"test\"'\n\t${OrIf} $OUT4 != \"\"\n\t${OrIf} $OUT5 != \"test\"\n\t${OrIf} $OUT6 != '\"test\"'\n\t${OrIf} $OUT7 != 'test test'\n\t\tSetErrors\n\t${EndIf}\n\n\t# some corner cases\n\n\tStrCpy $CMDLINE ''\n\t${GetParameters} $OUT1\n\tStrCpy $CMDLINE '\"'\n\t${GetParameters} $OUT2\n\tStrCpy $CMDLINE '\"\"'\n\t${GetParameters} $OUT3\n\tStrCpy $CMDLINE '\"\" test'\n\t${GetParameters} $OUT4\n\tStrCpy $CMDLINE ' test'\n\t${GetParameters} $OUT5\n\tStrCpy $CMDLINE '  test' # left over bug(?) from old GetParameters\n\t                         # it starts looking for ' ' from the third char\n\t${GetParameters} $OUT6\n\tStrCpy $CMDLINE ' '\n\t${GetParameters} $OUT7\n\n\t${If} $OUT1 != \"\"\n\t${OrIf} $OUT2 != \"\"\n\t${OrIf} $OUT3 != \"\"\n\t${OrIf} $OUT4 != \"\"\n\t${OrIf} $OUT5 != \"\"\n\t${OrIf} $OUT6 != \"\"\n\t${OrIf} $OUT7 != \"\"\n\t\tSetErrors\n\t${EndIf}\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection GetOptions\n\t${StackVerificationStart} GetOptions\n\n\t${GetOptions} '/INSTDIR=C:\\Program Files\\Common Files /SILENT=yes' '/INSTDIR=' $OUT1\n\tStrCmp $OUT1 'C:\\Program Files\\Common Files' 0 error\n\n\t${GetOptions} '-TMP=temp.tmp -INSTDIR=\"C:/Program Files/Common Files\" -SILENT=yes' '-INSTDIR=' $OUT1\n\tStrCmp $OUT1 'C:/Program Files/Common Files' 0 error\n\n\t${GetOptions} \"/INSTDIR='C:/Program Files/Common Files' /SILENT=yes\" '/INSTDIR=' $OUT1\n\tStrCmp $OUT1 'C:/Program Files/Common Files' 0 error\n\n\tStrCpy $OUT1 '/INSTDIR=`C:/Program Files/Common Files` /SILENT=yes'\n\t${GetOptions} '$OUT1' '/INSTDIR=' $OUT1\n\tStrCmp $OUT1 'C:/Program Files/Common Files' 0 error\n\n\t${GetOptions} '/SILENT=yes /INSTDIR=C:\\Program Files\\Common Files' '/INSTDIR=' $OUT1\n\tStrCmp $OUT1 'C:\\Program Files\\Common Files' 0 error\n\n\t${GetOptions} \"/INSTDIR=common directory: 'C:\\Program Files\\Common Files' /SILENT=yes\" '/INSTDIR=' $OUT1\n\tStrCmp $OUT1 \"common directory: 'C:\\Program Files\\Common Files'\" 0 error\n\n\t${GetOptions} '/INSTDIR=WxxxW /SILENT=yes' '/INSTDIR=' $OUT1\n\tStrCmp $OUT1 'WxxxW' 0 error\n\n\t${GetOptions} \"/Prm='/D=True' /D=1\" '/D=' $OUT1\n\tStrCmp $OUT1 \"1\" 0 error\n\n\t${GetOptions} \"/D=1 /Prm='/D=True'\" '/Prm=' $OUT1\n\tStrCmp $OUT1 \"/D=True\" 0 error\n\n\t${GetOptions} `/D=1 /Prm='/D=\"True\" /S=\"/Temp\"'` '/Prm=' $OUT1\n\tStrCmp $OUT1 '/D=\"True\" /S=\"/Temp\"' 0 error\n\n\t${GetOptions} `/INSTDIR='\"C:/Program Files/Common Files\"' /SILENT=yes` '/INSTDIR=' $OUT1\n\tStrCmp $OUT1 '\"C:/Program Files/Common Files\"' 0 error\n\n\t${GetOptions} `/INSTDIR='\"C:/Program Files/Common Files\"' /SILENT=yes` '/INSTDIR*=' $OUT1\n\tIfErrors 0 error\n\tStrCmp $OUT1 '' 0 error\n\n\t${GetOptions} `/INSTDIR=\"C:/Program Files/Common Files\" /SILENT=yes` '' $OUT1\n\tIfErrors 0 error\n\tStrCmp $OUT1 '' 0 error\n\n\t${GetOptionsS} '/INSTDIR=C:\\Program Files\\Common Files /SILENT' '/SILENT' $OUT1\n\tIfErrors error\n\tStrCmp $OUT1 '' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection GetOptionsS\n\t${StackVerificationStart} GetOptionsS\n\n\t${GetOptionsS} '/INSTDIR=C:\\Program Files\\Common Files /SILENT=yes' '/INSTDIR=' $OUT1\n\tIfErrors error\n\tStrCmp $OUT1 'C:\\Program Files\\Common Files' 0 error\n\n\t${GetOptionsS} '/INSTDIR=C:\\Program Files\\Common Files /SILENT=yes' '/Instdir=' $OUT1\n\tIfErrors 0 error\n\tStrCmp $OUT1 '' 0 error\n\n\t${GetOptionsS} '/INSTDIR=C:\\Program Files\\Common Files /SILENT' '/SILENT' $OUT1\n\tIfErrors error\n\tStrCmp $OUT1 '' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection GetRoot\n\t${StackVerificationStart} GetRoot\n\n\t${GetRoot} 'C:\\Program Files\\NSIS' $OUT1\n\tStrCmp $OUT1 'C:' 0 error\n\n\t${GetRoot} '\\\\SuperPimp\\NSIS\\Source\\exehead\\Ui.c' $OUT1\n\tStrCmp $OUT1 '\\\\SuperPimp\\NSIS' 0 error\n\n\t${GetRoot} '\\\\Program Files\\NSIS' $OUT1\n\tStrCmp $OUT1 '\\\\Program Files\\NSIS' 0 error\n\n\t${GetRoot} '\\\\Program Files\\NSIS\\' $OUT1\n\tStrCmp $OUT1 '\\\\Program Files\\NSIS' 0 error\n\n\t${GetRoot} '\\\\Program Files\\NSIS\\Source\\exehead\\Ui.c' $OUT1\n\tStrCmp $OUT1 '\\\\Program Files\\NSIS' 0 error\n\n\t${GetRoot} '\\Program Files\\NSIS' $OUT1\n\tStrCmp $OUT1 '' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection GetParent\n\t${StackVerificationStart} GetParent\n\n\t${GetParent} 'C:\\Program Files\\Winamp\\uninstwa.exe' $OUT1\n\tStrCmp $OUT1 'C:\\Program Files\\Winamp' 0 error\n\n\t${GetParent} 'C:\\Program Files\\Winamp\\plugins' $OUT1\n\tStrCmp $OUT1 'C:\\Program Files\\Winamp' 0 error\n\n\t${GetParent} 'C:\\Program Files\\Winamp\\plugins\\' $OUT1\n\tStrCmp $OUT1 'C:\\Program Files\\Winamp' 0 error\n\n\t${GetParent} 'C:\\' $OUT1\n\tStrCmp $OUT1 '' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection GetFileName\n\t${StackVerificationStart} GetFileName\n\n\t${GetFileName} 'C:\\Program Files\\Winamp\\uninstwa.exe' $OUT1\n\tStrCmp $OUT1 'uninstwa.exe' 0 error\n\n\t${GetFileName} 'uninstwa.exe' $OUT1\n\tStrCmp $OUT1 'uninstwa.exe' 0 error\n\n\t${GetFileName} 'C:\\Program Files\\Winamp\\plugins' $OUT1\n\tStrCmp $OUT1 'plugins' 0 error\n\n\t${GetFileName} 'C:\\Program Files\\Winamp\\plugins\\' $OUT1\n\tStrCmp $OUT1 'plugins' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection GetBaseName\n\t${StackVerificationStart} GetBaseName\n\n\t${GetBaseName} 'C:\\Program Files\\Winamp\\uninstwa.exe' $OUT1\n\tStrCmp $OUT1 'uninstwa' 0 error\n\n\t${GetBaseName} 'uninstwa.exe' $OUT1\n\tStrCmp $OUT1 'uninstwa' 0 error\n\n\t${GetBaseName} 'C:\\Program Files\\Winamp\\plugins' $OUT1\n\tStrCmp $OUT1 'plugins' 0 error\n\n\t${GetBaseName} 'C:\\Program Files\\Winamp\\plugins\\' $OUT1\n\tStrCmp $OUT1 '' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection GetFileExt\n\t${StackVerificationStart} GetFileExt\n\n\t${GetFileExt} 'C:\\Program Files\\Winamp\\uninstwa.exe' $OUT1\n\tStrCmp $OUT1 'exe' 0 error\n\n\t${GetFileExt} 'uninstwa.exe' $OUT1\n\tStrCmp $OUT1 'exe' 0 error\n\n\t${GetFileExt} 'C:\\Program Files\\Winamp\\plugins' $OUT1\n\tStrCmp $OUT1 '' 0 error\n\n\t${GetFileExt} 'C:\\Program Files\\Winamp\\plugins\\' $OUT1\n\tStrCmp $OUT1 '' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection BannerTrimPath\n\t${StackVerificationStart} BannerTrimPath\n\n\t${BannerTrimPath} 'C:\\Server\\Documents\\Terminal\\license.htm' '35A' $OUT1\n\tStrCmp $OUT1 'C:\\Server\\...\\Terminal\\license.htm' 0 error\n\n\t${BannerTrimPath} 'C:\\12\\3456\\789' '3A' $OUT1\n\tStrCmp $OUT1 '' 0 error\n\n\t${BannerTrimPath} 'C:\\12\\3456\\789' '4A' $OUT1\n\tStrCmp $OUT1 'C...' 0 error\n\n\t${BannerTrimPath} 'C:\\12\\3456\\789' '11A' $OUT1\n\tStrCmp $OUT1 'C:\\12\\...' 0 error\n\n\t${BannerTrimPath} 'C:\\12\\3456\\789' '13A' $OUT1\n\tStrCmp $OUT1 'C:\\12\\...\\789' 0 error\n\n\t${BannerTrimPath} 'C:\\12\\3456\\789' '14A' $OUT1\n\tStrCmp $OUT1 'C:\\12\\3456\\789' 0 error\n\n\t${BannerTrimPath} 'C:\\12\\3456\\789' '14A' $OUT1\n\tStrCmp $OUT1 'C:\\12\\3456\\789' 0 error\n\n\t${BannerTrimPath} 'C:\\12\\3456\\789' '11B' $OUT1\n\tStrCmp $OUT1 'C:\\12\\...' 0 error\n\n\t${BannerTrimPath} 'C:\\12\\3456\\789' '5B' $OUT1\n\tStrCmp $OUT1 'C:...' 0 error\n\n\t${BannerTrimPath} 'C:\\12\\3456\\789' '5B' $OUT1\n\tStrCmp $OUT1 'C:...' 0 error\n\n\t${BannerTrimPath} 'C:\\12\\3456\\789' '11C' $OUT1\n\tStrCmp $OUT1 'C:\\12\\34...' 0 error\n\n\t${BannerTrimPath} 'C:\\12\\3456\\789' '9D' $OUT1\n\tStrCmp $OUT1 'C:\\12\\...' 0 error\n\n\t${BannerTrimPath} 'C:\\12\\3456\\789' '10D' $OUT1\n\tStrCmp $OUT1 'C:\\...\\789' 0 error\n\n\t${BannerTrimPath} 'C:\\12\\3456\\789' '11D' $OUT1\n\tStrCmp $OUT1 'C:\\1...\\789' 0 error\n\n\t${BannerTrimPath} '123456789' '5D' $OUT1\n\tStrCmp $OUT1 '12...' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection DirState\n\t${StackVerificationStart} DirState\n\n\t${DirState} '$TEMP' $OUT1\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection RefreshShellIcons\n\t${StackVerificationStart} RefreshShellIcons\n\n\t${RefreshShellIcons}\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WriteUninstaller\n\tgoto +2\n\tWriteUninstaller '$EXEDIR\\un.FileFuncTest.exe'\nSectionEnd\n\n\n\n;############### UNINSTALL ###############\n\nSection un.Uninstall\n\t${Locate} '$DOCUMENTS' '/L=FD /M=*.* /S=0B /G=0' 'un.LocateCallback'\n\t${GetSize} '$WINDIR' '/M=Explorer.exe /S=0K /G=0' $OUT1 $OUT2 $OUT3\n\t${DriveSpace} 'C:\\' '/D=F /S=M' $OUT1\n\t${GetDrives} 'FDD+CDROM' 'un.GetDrivesCallback'\n\t${GetTime} '' 'L' $OUT1 $OUT2 $OUT3 $OUT4 $OUT5 $OUT6 $OUT7\n\t${GetFileAttributes} '$WINDIR\\explorer.exe' 'ALL' $OUT1\n\t${GetFileVersion} '$WINDIR\\explorer.exe' $OUT1\n\t${GetExeName} $OUT1\n\t${GetExePath} $OUT1\n\t${GetParameters} $OUT1\n\t${GetOptions} '/INSTDIR=C:\\Program Files\\Common Files /SILENT=yes' '/INSTDIR=' $OUT1\n\t${GetOptionsS} '/INSTDIR=C:\\Program Files\\Common Files /SILENT=yes' '/INSTDIR=' $OUT1\n\t${GetRoot} 'C:\\Program Files\\NSIS' $OUT1\n\t${GetParent} 'C:\\Program Files\\Winamp\\uninstwa.exe' $OUT1\n\t${GetFileName} 'C:\\Program Files\\Winamp\\uninstwa.exe' $OUT1\n\t${GetBaseName} 'C:\\Program Files\\Winamp\\uninstwa.exe' $OUT1\n\t${GetFileExt} 'C:\\Program Files\\Winamp\\uninstwa.exe' $OUT1\n\t${BannerTrimPath} 'C:\\Server\\Documents\\Terminal\\license.htm' '35A' $OUT1\n\t${DirState} '$TEMP' $OUT1\n\t${RefreshShellIcons}\nSectionEnd\n\nFunction un.LocateCallback\n\tPush $0\nFunctionEnd\n\nFunction un.GetDrivesCallback\n\tPush $0\nFunctionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/InstallOptions/test.ini",
    "content": "[Settings]\nNumFields=8\n\n[Field 1]\nType=GroupBox\nLeft=0\nRight=-1\nTop=0\nBottom=-5\nText=\" This is a group box... \"\n\n[Field 2]\nType=checkbox\nText=Install support for X\nLeft=10\nRight=-10\nTop=17\nBottom=25\nState=0\nFlags=GROUP\n\n[Field 3]\nType=checkbox\nText=Install support for Y\nLeft=10\nRight=-10\nTop=30\nBottom=38\nState=1\nFlags=NOTABSTOP\n\n[Field 4]\nType=checkbox\nText=Install support for Z\nLeft=10\nRight=-10\nTop=43\nBottom=51\nState=0\nFlags=NOTABSTOP\n\n[Field 5]\nType=FileRequest\nState=C:\\poop.poop\nLeft=10\nRight=-10\nTop=56\nBottom=68\nFilter=Poop Files|*.poop|All files|*.*\nFlags=GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY\n\n[Field 6]\nType=DirRequest\nLeft=10\nRight=-10\nTop=73\nBottom=85\nText=Select a directory...\nState=C:\\Program Files\\NSIS\n\n[Field 7]\nType=Label\nLeft=10\nRight=-10\nTop=90\nBottom=98\nText=This is a label...\n\n[Field 8]\nType=Text\nLeft=10\nRight=-10\nTop=98\nBottom=120\nState=\"Multiline\\r\\nedit...\"\nFlags=MULTILINE|VSCROLL|WANTRETURN"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/InstallOptions/test.nsi",
    "content": ";InstallOptions Test Script\n;Written by Joost Verburg\n;--------------------------\n\n!define TEMP1 $R0 ;Temp variable\n\n;The name of the installer\nName \"InstallOptions Test\"\n\n;The file to write\nOutFile \"Test.exe\"\n\n; Show install details\nShowInstDetails show\n\n;Things that need to be extracted on startup (keep these lines before any File command!)\n;Only useful for BZIP2 compression\n;Use ReserveFile for your own InstallOptions INI files too!\n\nReserveFile \"${NSISDIR}\\Plugins\\InstallOptions.dll\"\nReserveFile \"test.ini\"\n\n;Order of pages\nPage custom SetCustom ValidateCustom \": Testing InstallOptions\" ;Custom page. InstallOptions gets called in SetCustom.\nPage instfiles\n\nSection \"Components\"\n\n  ;Get Install Options dialog user input\n\n  ReadINIStr ${TEMP1} \"$PLUGINSDIR\\test.ini\" \"Field 2\" \"State\"\n  DetailPrint \"Install X=${TEMP1}\"\n  ReadINIStr ${TEMP1} \"$PLUGINSDIR\\test.ini\" \"Field 3\" \"State\"\n  DetailPrint \"Install Y=${TEMP1}\"\n  ReadINIStr ${TEMP1} \"$PLUGINSDIR\\test.ini\" \"Field 4\" \"State\"\n  DetailPrint \"Install Z=${TEMP1}\"\n  ReadINIStr ${TEMP1} \"$PLUGINSDIR\\test.ini\" \"Field 5\" \"State\"\n  DetailPrint \"File=${TEMP1}\"\n  ReadINIStr ${TEMP1} \"$PLUGINSDIR\\test.ini\" \"Field 6\" \"State\"\n  DetailPrint \"Dir=${TEMP1}\"\n  ReadINIStr ${TEMP1} \"$PLUGINSDIR\\test.ini\" \"Field 8\" \"State\"\n  DetailPrint \"Info=${TEMP1}\"\n  \nSectionEnd\n\nFunction .onInit\n\n  ;Extract InstallOptions files\n  ;$PLUGINSDIR will automatically be removed when the installer closes\n  \n  InitPluginsDir\n  File /oname=$PLUGINSDIR\\test.ini \"test.ini\"\n  \nFunctionEnd\n\nFunction SetCustom\n\n  ;Display the InstallOptions dialog\n\n  Push ${TEMP1}\n\n    InstallOptions::dialog \"$PLUGINSDIR\\test.ini\"\n    Pop ${TEMP1}\n  \n  Pop ${TEMP1}\n\nFunctionEnd\n\nFunction ValidateCustom\n\n  ReadINIStr ${TEMP1} \"$PLUGINSDIR\\test.ini\" \"Field 2\" \"State\"\n  StrCmp ${TEMP1} 1 done\n  \n  ReadINIStr ${TEMP1} \"$PLUGINSDIR\\test.ini\" \"Field 3\" \"State\"\n  StrCmp ${TEMP1} 1 done\n\n  ReadINIStr ${TEMP1} \"$PLUGINSDIR\\test.ini\" \"Field 4\" \"State\"\n  StrCmp ${TEMP1} 1 done\n    MessageBox MB_ICONEXCLAMATION|MB_OK \"You must select at least one install option!\"\n    Abort\n\n  done:\n  \nFunctionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/InstallOptions/testimgs.ini",
    "content": "[Settings]\nNumFields=8\n\n[Field 1]\nType=GroupBox\nLeft=0\nRight=-1\nTop=0\nBottom=-5\nText=\" Images \"\n\n[Field 2]\nType=Bitmap\nLeft=10\nRight=-10\nTop=10\nBottom=30\nFlags=TRANSPARENT\n\n[Field 3]\nType=Bitmap\nLeft=10\nRight=-10\nTop=35\nBottom=45\nFlags=TRANSPARENT\n\n[Field 4]\nType=Bitmap\nLeft=10\nRight=-10\nTop=50\nBottom=70\nFlags=RESIZETOFIT|TRANSPARENT\n\n[Field 5]\nType=Bitmap\nLeft=10\nRight=-10\nTop=75\nBottom=95\nFlags=RESIZETOFIT|TRANSPARENT\n\n[Field 6]\nType=Icon\nLeft=10\nRight=40\nTop=100\nBottom=120\n\n[Field 7]\nType=Icon\nLeft=50\nRight=80\nTop=100\nBottom=120\n\n[Field 8]\nType=Label\nLeft=10\nRight=-10\nTop=10\nBottom=-10\nText=ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ\n\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/InstallOptions/testimgs.nsi",
    "content": ";InstallOptions Test Script\n;Written by Joost Verburg\n;--------------------------\n\n;The name of the installer\nName \"InstallOptions Test\"\n\n;The file to write\nOutFile \"Test.exe\"\n\n; Show install details\nShowInstDetails show\n\n;Things that need to be extracted on startup (keep these lines before any File command!)\n;Only useful for BZIP2 compression\n;Use ReserveFile for your own InstallOptions INI files too!\n\nReserveFile \"${NSISDIR}\\Plugins\\InstallOptions.dll\"\nReserveFile \"testimgs.ini\"\nReserveFile \"${NSISDIR}\\Contrib\\Graphics\\Checks\\colorful.bmp\"\nReserveFile \"${NSISDIR}\\Contrib\\Graphics\\Checks\\modern.bmp\"\nReserveFile \"${NSISDIR}\\Contrib\\Graphics\\Icons\\pixel-install.ico\"\n\n;Order of pages\nPage custom SetCustom \"\" \": Testing InstallOptions\" ;Custom page. InstallOptions gets called in SetCustom.\nPage instfiles\n\nSection  \nSectionEnd\n\nFunction .onInit\n\n  ;Extract InstallOptions files\n  ;$PLUGINSDIR will automatically be removed when the installer closes\n  \n  InitPluginsDir\n  File /oname=$PLUGINSDIR\\testimgs.ini \"testimgs.ini\"\n  File /oname=$PLUGINSDIR\\image.bmp \"${NSISDIR}\\Contrib\\Graphics\\Checks\\colorful.bmp\"\n  File /oname=$PLUGINSDIR\\image2.bmp \"${NSISDIR}\\Contrib\\Graphics\\Checks\\modern.bmp\"\n  File /oname=$PLUGINSDIR\\icon.ico \"${NSISDIR}\\Contrib\\Graphics\\Icons\\pixel-install.ico\"\n\n  ;Write image paths to the INI file\n\n  WriteINIStr $PLUGINSDIR\\testimgs.ini \"Field 2\" \"Text\" $PLUGINSDIR\\image.bmp\n  WriteINIStr $PLUGINSDIR\\testimgs.ini \"Field 3\" \"Text\" $PLUGINSDIR\\image2.bmp\n  WriteINIStr $PLUGINSDIR\\testimgs.ini \"Field 4\" \"Text\" $PLUGINSDIR\\image.bmp\n  WriteINIStr $PLUGINSDIR\\testimgs.ini \"Field 5\" \"Text\" $PLUGINSDIR\\image2.bmp\n  WriteINIStr $PLUGINSDIR\\testimgs.ini \"Field 6\" \"Text\" $PLUGINSDIR\\icon.ico\n  ;No Text for Field 7 so it'll show the installer's icon\n  \nFunctionEnd\n\nFunction SetCustom\n\n  ;Display the InstallOptions dialog\n  InstallOptions::dialog \"$PLUGINSDIR\\testimgs.ini\"\n  Pop $0\n\nFunctionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/InstallOptions/testlink.ini",
    "content": "[Settings]\nNumFields=5\n\n[Field 1]\nType=Label\nLeft=10\nRight=-40\nTop=10\nBottom=18\nText=This custom page demonstrates the \"Link\" control\n\n[Field 2]\nType=Link\nLeft=20\nRight=-40\nTop=40\nBottom=50\nText=* Run notepad\n\n[Field 3]\nType=Link\nLeft=20\nRight=-40\nTop=55\nBottom=65\nState=mailto:someone@anywhere.com\nText=* Send E-mail\n\n[Field 4]\nType=Link\nLeft=20\nRight=-40\nTop=70\nBottom=80\nState=http://nsis.sourceforge.net/\nText=* Homepage http://nsis.sourceforge.net/\n\n[Field 5]\nType=Text\nLeft=20\nRight=-40\nTop=85\nBottom=98\nState=Just to test proper interaction with the other fields\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/InstallOptions/testlink.nsi",
    "content": ";InstallOptions Test Script\n;Written by Ramon\n;This script demonstrates the power of the new control \"LINK\"\n;that allows you to execute files, send mails, open wepsites, etc.\n;--------------------------\n\n!define TEMP1 $R0 ;Temp variable\n\n;The name of the installer\nName \"InstallOptions Test Link\"\n\n;The file to write\nOutFile \"TestLink.exe\"\n\n; Show install details\nShowInstDetails show\n\n;Things that need to be extracted on startup (keep these lines before any File command!)\n;Only useful for BZIP2 compression\n;Use ReserveFile for your own InstallOptions INI files too!\n\nReserveFile \"${NSISDIR}\\Plugins\\InstallOptions.dll\"\nReserveFile \"testlink.ini\"\n\n;Order of pages\nPage custom SetCustom\nPage instfiles\n\nSection \"Components\"\n\n  ;Get Install Options dialog user input\n\nSectionEnd\n\nFunction .onInit\n\n  ;Extract InstallOptions files\n  ;$PLUGINSDIR will automatically be removed when the installer closes\n  \n  InitPluginsDir\n  File /oname=$PLUGINSDIR\\test.ini \"testlink.ini\"\n  WriteIniStr $PLUGINSDIR\\test.ini \"Field 2\" \"State\" \"$WINDIR\\Notepad.exe\"\n  \nFunctionEnd\n\nFunction SetCustom\n\n  ;Display the InstallOptions dialog\n\n  Push ${TEMP1}\n\n    InstallOptions::dialog \"$PLUGINSDIR\\test.ini\"\n    Pop ${TEMP1}\n  \n  Pop ${TEMP1}\n\nFunctionEnd\n\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/InstallOptions/testnotify.ini",
    "content": "[Settings]\nNumFields=11\n\n[Field 1]\nType=Groupbox\nText=\"This is a group box...\"\nLeft=0\nRight=-1\nTop=0\nBottom=-4\n\n[Field 2]\nType=Checkbox\nText=Install support for X\nFlags=NOTIFY\nState=1\nLeft=10\nRight=100\nTop=17\nBottom=25\n\n[Field 3]\nType=Checkbox\nText=Install support for Y\nState=0\nLeft=10\nRight=100\nTop=30\nBottom=38\n\n[Field 4]\nType=Checkbox\nText=Install support for Z\nFlags=RIGHT\nState=0\nLeft=10\nRight=100\nTop=43\nBottom=51\n\n[Field 5]\nType=FileRequest\nFlags=GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY\nState=C:\\poop.poop\nFilter=Poop Files|*.poop|All files|*.*\nLeft=10\nRight=-10\nTop=56\nBottom=69\n\n[Field 6]\nType=DirRequest\nText=Select a directory...\nState=C:\\Program Files\\NSIS\nLeft=10\nRight=-10\nTop=74\nBottom=87\n\n[Field 7]\nType=Label\nText=This is a label...\nLeft=10\nRight=-10\nTop=89\nBottom=97\n\n[Field 8]\nType=Text\nFlags=MULTILINE|VSCROLL|WANTRETURN|NOWORDWRAP\nState=\"Multiline\\r\\nedit...\"\nLeft=10\nRight=-10\nTop=97\nBottom=118\nMinLen=1\nValidateText=Please enter some text before proceeding.\n\n[Field 9]\nType=Button\nFlags=NOTIFY\nText=&Clear\nLeft=-60\nRight=-10\nTop=19\nBottom=33\n\n[Field 10]\nType=Button\nText=&Email\nState=mailto:someone@anywhere.com\nLeft=-60\nRight=-10\nTop=35\nBottom=49\n\n[Field 11]\nType=DROPLIST\nListItems=Show|Hide\nState=Show\nFlags=NOTIFY\nLeft=120\nRight=-80\nTop=20\nBottom=56\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/InstallOptions/testnotify.nsi",
    "content": "; InstallOptions script demonstrating custom buttons\n;----------------------------------------------------\n\n!include WinMessages.nsh\n\n; The name of the installer\nName \"InstallOptions Test\"\n\n; The file to write\nOutFile \"TestNotify.exe\"\n\n; Show install details\nShowInstDetails show\n\n; Called before anything else as installer initialises\nFunction .onInit\n\n  ; Extract InstallOptions files\n  ; $PLUGINSDIR will automatically be removed when the installer closes\n  InitPluginsDir\n  File /oname=$PLUGINSDIR\\test.ini \"testnotify.ini\"\n\nFunctionEnd\n\n; Our custom page\nPage custom ShowCustom LeaveCustom \": Testing InstallOptions\"\n\nFunction ShowCustom\n\n  ; Initialise the dialog but don't show it yet\n  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 \"Test the right-to-left version?\" IDNO +2\n    WriteINIStr \"$PLUGINSDIR\\test.ini\" \"Settings\" \"RTL\" \"1\"\n  InstallOptions::initDialog \"$PLUGINSDIR\\test.ini\"\n  ; In this mode InstallOptions returns the window handle so we can use it\n  Pop $0\n  ; Now show the dialog and wait for it to finish\n  InstallOptions::show\n  ; Finally fetch the InstallOptions status value (we don't care what it is though)\n  Pop $0\n\nFunctionEnd\n\nFunction LeaveCustom\n\n  ; At this point the user has either pressed Next or one of our custom buttons\n  ; We find out which by reading from the INI file\n  ReadINIStr $0 \"$PLUGINSDIR\\test.ini\" \"Settings\" \"State\"\n  StrCmp $0 0 validate  ; Next button?\n  StrCmp $0 2 supportx  ; \"Install support for X\"?\n  StrCmp $0 9 clearbtn  ; \"Clear\" button?\n  StrCmp $0 11 droplist ; \"Show|Hide\" drop-list?\n  Abort ; Return to the page\n\nsupportx:\n  ; Make the FileRequest field depend on the first checkbox\n  ReadINIStr $0 \"$PLUGINSDIR\\test.ini\" \"Field 2\" \"State\"\n  ReadINIStr $1 \"$PLUGINSDIR\\test.ini\" \"Field 5\" \"HWND\"\n  EnableWindow $1 $0\n  ReadINIStr $1 \"$PLUGINSDIR\\test.ini\" \"Field 5\" \"HWND2\"\n  EnableWindow $1 $0\n  ; Add the disabled flag too so when we return to this page it's disabled again\n  StrCmp $0 0 0 +3\n\n    WriteINIStr \"$PLUGINSDIR\\test.ini\" \"Field 5\" \"Flags\" \"GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY|DISABLED\"\n    Goto +2\n\n    WriteINIStr \"$PLUGINSDIR\\test.ini\" \"Field 5\" \"Flags\" \"GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY\"\n  Abort ; Return to the page\n\nclearbtn:\n  ; Clear all text fields\n  ReadINIStr $1 \"$PLUGINSDIR\\test.ini\" \"Field 5\" \"HWND\"\n  SendMessage $1 ${WM_SETTEXT} 0 \"STR:\"\n  ReadINIStr $1 \"$PLUGINSDIR\\test.ini\" \"Field 6\" \"HWND\"\n  SendMessage $1 ${WM_SETTEXT} 0 \"STR:\"\n  ReadINIStr $1 \"$PLUGINSDIR\\test.ini\" \"Field 8\" \"HWND\"\n  SendMessage $1 ${WM_SETTEXT} 0 \"STR:\"\n  Abort ; Return to the page\n\ndroplist:\n  ; Make the DirRequest field depend on the droplist\n  ReadINIStr $0 \"$PLUGINSDIR\\test.ini\" \"Field 11\" \"State\"\n  StrCmp $0 \"Show\" +3\n    StrCpy $0 0\n  Goto +2\n    StrCpy $0 1\n  ReadINIStr $1 \"$PLUGINSDIR\\test.ini\" \"Field 6\" \"HWND\"\n  EnableWindow $1 $0\n  ReadINIStr $1 \"$PLUGINSDIR\\test.ini\" \"Field 6\" \"HWND2\"\n  EnableWindow $1 $0\n  ; Add the disabled flag too so when we return to this page it's disabled again\n  StrCmp $0 0 0 +3\n\n    WriteINIStr \"$PLUGINSDIR\\test.ini\" \"Field 6\" \"Flags\" \"DISABLED\"\n    Goto +2\n\n    WriteINIStr \"$PLUGINSDIR\\test.ini\" \"Field 6\" \"Flags\" \"\"\n  Abort ; Return to the page\n\nvalidate:\n  ; At this point we know the Next button was pressed, so perform any validation\n  ReadINIStr $0 \"$PLUGINSDIR\\test.ini\" \"Field 2\" \"State\"\n  StrCmp $0 1 done\n  ReadINIStr $0 \"$PLUGINSDIR\\test.ini\" \"Field 3\" \"State\"\n  StrCmp $0 1 done\n  ReadINIStr $0 \"$PLUGINSDIR\\test.ini\" \"Field 4\" \"State\"\n  StrCmp $0 1 done\n    MessageBox MB_ICONEXCLAMATION|MB_OK \"You must select at least one install option!\"\n    Abort\ndone:\n\nFunctionEnd\n\n; Installation page\nPage instfiles\n\nSection\n\n  ;Get Install Options dialog user input\n  ReadINIStr $0 \"$PLUGINSDIR\\test.ini\" \"Field 2\" \"State\"\n  DetailPrint \"Install X=$0\"\n  ReadINIStr $0 \"$PLUGINSDIR\\test.ini\" \"Field 3\" \"State\"\n  DetailPrint \"Install Y=$0\"\n  ReadINIStr $0 \"$PLUGINSDIR\\test.ini\" \"Field 4\" \"State\"\n  DetailPrint \"Install Z=$0\"\n  ReadINIStr $0 \"$PLUGINSDIR\\test.ini\" \"Field 5\" \"State\"\n  DetailPrint \"File=$0\"\n  ReadINIStr $0 \"$PLUGINSDIR\\test.ini\" \"Field 6\" \"State\"\n  DetailPrint \"Dir=$0\"\n  ReadINIStr $0 \"$PLUGINSDIR\\test.ini\" \"Field 8\" \"State\"\n  DetailPrint \"Info=$0\"\n\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Library.nsi",
    "content": "# This example tests the compile time aspect of the Library macros\n# more than the runtime aspect. It is more of a syntax example,\n# rather than a usage example.\n\n!include \"Library.nsh\"\n\nName \"Library Test\"\nOutFile \"Library Test.exe\"\n\nInstallDir \"$TEMP\\Library Test\"\n\nPage directory\nPage instfiles\n\nXPStyle on\n\nRequestExecutionLevel user\n\n!define TestDLL '\"${NSISDIR}\\Plugins\\LangDLL.dll\"'\n!define TestEXE '\"${NSISDIR}\\Contrib\\UIs\\default.exe\"'\n\nSection\n\n!insertmacro InstallLib DLL       NOTSHARED REBOOT_PROTECTED      ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib DLL       NOTSHARED NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib DLL       NOTSHARED REBOOT_NOTPROTECTED   ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib DLL       NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n\n!insertmacro InstallLib REGDLL    NOTSHARED REBOOT_PROTECTED      ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib REGDLL    NOTSHARED NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib REGDLL    NOTSHARED REBOOT_NOTPROTECTED   ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib REGDLL    NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n\n!insertmacro InstallLib TLB       NOTSHARED REBOOT_PROTECTED      ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib TLB       NOTSHARED NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib TLB       NOTSHARED REBOOT_NOTPROTECTED   ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib TLB       NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n\n!insertmacro InstallLib REGDLLTLB NOTSHARED REBOOT_PROTECTED      ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib REGDLLTLB NOTSHARED NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib REGDLLTLB NOTSHARED REBOOT_NOTPROTECTED   ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib REGDLLTLB NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n\n!insertmacro InstallLib DLL       $0        REBOOT_PROTECTED      ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib DLL       $0        NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib DLL       $0        REBOOT_NOTPROTECTED   ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib DLL       $0        NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n\n!insertmacro InstallLib REGDLL    $0        REBOOT_PROTECTED      ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib REGDLL    $0        NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib REGDLL    $0        REBOOT_NOTPROTECTED   ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib REGDLL    $0        NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n\n!insertmacro InstallLib TLB       $0        REBOOT_PROTECTED      ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib TLB       $0        NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib TLB       $0        REBOOT_NOTPROTECTED   ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib TLB       $0        NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n\n!insertmacro InstallLib REGDLLTLB $0        REBOOT_PROTECTED      ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib REGDLLTLB $0        NOREBOOT_PROTECTED    ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib REGDLLTLB $0        REBOOT_NOTPROTECTED   ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n!insertmacro InstallLib REGDLLTLB $0        NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\\test.dll $INSTDIR\n\n!insertmacro InstallLib REGEXE    $0        REBOOT_PROTECTED      ${TestEXE} $INSTDIR\\test.exe $INSTDIR\n!insertmacro InstallLib REGEXE    $0        NOREBOOT_PROTECTED    ${TestEXE} $INSTDIR\\test.exe $INSTDIR\n!insertmacro InstallLib REGEXE    $0        REBOOT_NOTPROTECTED   ${TestEXE} $INSTDIR\\test.exe $INSTDIR\n!insertmacro InstallLib REGEXE    $0        NOREBOOT_NOTPROTECTED ${TestEXE} $INSTDIR\\test.exe $INSTDIR\n\nWriteUninstaller $INSTDIR\\uninstall.exe\n\nSectionEnd\n\nSection uninstall\n\n!insertmacro UninstallLib DLL       NOTSHARED NOREMOVE               $INSTDIR\\test.dll\n!insertmacro UninstallLib DLL       NOTSHARED REBOOT_PROTECTED       $INSTDIR\\test.dll\n!insertmacro UninstallLib DLL       NOTSHARED NOREBOOT_PROTECTED     $INSTDIR\\test.dll\n!insertmacro UninstallLib DLL       NOTSHARED REBOOT_NOTPROTECTED    $INSTDIR\\test.dll\n!insertmacro UninstallLib DLL       NOTSHARED NOREBOOT_NOTPROTECTED  $INSTDIR\\test.dll\n\n!insertmacro UninstallLib REGDLL    NOTSHARED NOREMOVE               $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLL    NOTSHARED REBOOT_PROTECTED       $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLL    NOTSHARED NOREBOOT_PROTECTED     $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLL    NOTSHARED REBOOT_NOTPROTECTED    $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLL    NOTSHARED NOREBOOT_NOTPROTECTED  $INSTDIR\\test.dll\n\n!insertmacro UninstallLib TLB       NOTSHARED NOREMOVE               $INSTDIR\\test.dll\n!insertmacro UninstallLib TLB       NOTSHARED REBOOT_PROTECTED       $INSTDIR\\test.dll\n!insertmacro UninstallLib TLB       NOTSHARED NOREBOOT_PROTECTED     $INSTDIR\\test.dll\n!insertmacro UninstallLib TLB       NOTSHARED REBOOT_NOTPROTECTED    $INSTDIR\\test.dll\n!insertmacro UninstallLib TLB       NOTSHARED NOREBOOT_NOTPROTECTED  $INSTDIR\\test.dll\n\n!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREMOVE               $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLLTLB NOTSHARED REBOOT_PROTECTED       $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREBOOT_PROTECTED     $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLLTLB NOTSHARED REBOOT_NOTPROTECTED    $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREBOOT_NOTPROTECTED  $INSTDIR\\test.dll\n\n!insertmacro UninstallLib DLL       SHARED    NOREMOVE               $INSTDIR\\test.dll\n!insertmacro UninstallLib DLL       SHARED    REBOOT_PROTECTED       $INSTDIR\\test.dll\n!insertmacro UninstallLib DLL       SHARED    NOREBOOT_PROTECTED     $INSTDIR\\test.dll\n!insertmacro UninstallLib DLL       SHARED    REBOOT_NOTPROTECTED    $INSTDIR\\test.dll\n!insertmacro UninstallLib DLL       SHARED    NOREBOOT_NOTPROTECTED  $INSTDIR\\test.dll\n\n!insertmacro UninstallLib REGDLL    SHARED    NOREMOVE               $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLL    SHARED    REBOOT_PROTECTED       $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLL    SHARED    NOREBOOT_PROTECTED     $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLL    SHARED    REBOOT_NOTPROTECTED    $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLL    SHARED    NOREBOOT_NOTPROTECTED  $INSTDIR\\test.dll\n\n!insertmacro UninstallLib TLB       SHARED    NOREMOVE               $INSTDIR\\test.dll\n!insertmacro UninstallLib TLB       SHARED    REBOOT_PROTECTED       $INSTDIR\\test.dll\n!insertmacro UninstallLib TLB       SHARED    NOREBOOT_PROTECTED     $INSTDIR\\test.dll\n!insertmacro UninstallLib TLB       SHARED    REBOOT_NOTPROTECTED    $INSTDIR\\test.dll\n!insertmacro UninstallLib TLB       SHARED    NOREBOOT_NOTPROTECTED  $INSTDIR\\test.dll\n\n!insertmacro UninstallLib REGDLLTLB SHARED    NOREMOVE               $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLLTLB SHARED    REBOOT_PROTECTED       $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLLTLB SHARED    NOREBOOT_PROTECTED     $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLLTLB SHARED    REBOOT_NOTPROTECTED    $INSTDIR\\test.dll\n!insertmacro UninstallLib REGDLLTLB SHARED    NOREBOOT_NOTPROTECTED  $INSTDIR\\test.dll\n\n!insertmacro UninstallLib REGEXE    SHARED    NOREMOVE               $INSTDIR\\test.exe\n!insertmacro UninstallLib REGEXE    SHARED    REBOOT_PROTECTED       $INSTDIR\\test.exe\n!insertmacro UninstallLib REGEXE    SHARED    NOREBOOT_PROTECTED     $INSTDIR\\test.exe\n!insertmacro UninstallLib REGEXE    SHARED    REBOOT_NOTPROTECTED    $INSTDIR\\test.exe\n!insertmacro UninstallLib REGEXE    SHARED    NOREBOOT_NOTPROTECTED  $INSTDIR\\test.exe\n\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/LogicLib.nsi",
    "content": "!verbose 2\n\nName \"NSIS LogicLib Example\"\nOutFile \"LogicLib.exe\"\nShowInstDetails show\nRequestExecutionLevel user\n\n!include \"LogicLib.nsh\"\n\n;!undef LOGICLIB_VERBOSITY\n;!define LOGICLIB_VERBOSITY 4   ; For debugging - watch what logiclib does with your code!\n\nPage components \"\" \"\" ComponentsLeave\nPage instfiles\n\nSection /o \"Run tests\" TESTS\n\n  ; kinds of if other than \"value1 comparison value2\"\n  ClearErrors\n  FindFirst $R1 $R2 \"$PROGRAMFILES\\*\"\n  ${Unless} ${Errors}\n    ${Do}\n      ${Select} $R2\n        ${Case2} \".\" \"..\"\n          ; Do nothing\n        ${CaseElse}\n          DetailPrint \"Found $PROGRAMFILES\\$R2\"\n      ${EndSelect}\n      FindNext $R1 $R2\n    ${LoopUntil} ${Errors}\n    FindClose $R1\n  ${EndUnless}\n\n  ${If} ${FileExists} \"${__FILE__}\"\n    DetailPrint 'Source file \"${__FILE__}\" still exists'\n  ${Else}\n    DetailPrint 'Source file \"${__FILE__}\" has gone'\n  ${EndIf}\n\n  ; if..endif\n  StrCpy $R1 1\n  StrCpy $R2 \"\"\n  ${If} $R1 = 1\n    StrCpy $R2 $R2A\n  ${EndIf}\n  ${If} $R1 = 2\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} $R1 < 2\n    StrCpy $R2 $R2C\n  ${EndIf}\n  ${If} $R1 < -2\n    StrCpy $R2 $R2D\n  ${EndIf}\n  ${If} $R1 > 2\n    StrCpy $R2 $R2E\n  ${EndIf}\n  ${If} $R1 > -2\n    StrCpy $R2 $R2F\n  ${EndIf}\n  ${If} $R1 <> 1\n    StrCpy $R2 $R2G\n  ${EndIf}\n  ${If} $R1 <> 2\n    StrCpy $R2 $R2H\n  ${EndIf}\n  ${If} $R1 >= 2\n    StrCpy $R2 $R2I\n  ${EndIf}\n  ${If} $R1 >= -2\n    StrCpy $R2 $R2J\n  ${EndIf}\n  ${If} $R1 <= 2\n    StrCpy $R2 $R2K\n  ${EndIf}\n  ${If} $R1 <= -2\n    StrCpy $R2 $R2L\n  ${EndIf}\n  ${If} $R2 == \"ACFHJK\"\n    DetailPrint \"PASSED If..EndIf test\"\n  ${Else}\n    DetailPrint \"FAILED If..EndIf test\"\n  ${EndIf}\n\n  ; if..elseif..else..endif\n  StrCpy $R1 A\n  StrCpy $R2 \"\"\n  ${If} $R1 == A\n    StrCpy $R2 $R2A\n  ${ElseIf} $R1 == B\n    StrCpy $R2 $R2B\n  ${ElseUnless} $R1 != C\n    StrCpy $R2 $R2C\n  ${Else}\n    StrCpy $R2 $R2D\n  ${EndIf}\n  ${If} $R1 == D\n    StrCpy $R2 $R2D\n  ${ElseIf} $R1 == A\n    StrCpy $R2 $R2A\n  ${ElseUnless} $R1 != B\n    StrCpy $R2 $R2B\n  ${Else}\n    StrCpy $R2 $R2C\n  ${EndIf}\n  ${If} $R1 == C\n    StrCpy $R2 $R2C\n  ${ElseIf} $R1 == D\n    StrCpy $R2 $R2D\n  ${ElseUnless} $R1 != A\n    StrCpy $R2 $R2A\n  ${Else}\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} $R1 == B\n    StrCpy $R2 $R2B\n  ${ElseIf} $R1 == C\n    StrCpy $R2 $R2C\n  ${ElseUnless} $R1 != D\n    StrCpy $R2 $R2D\n  ${Else}\n    StrCpy $R2 $R2A\n  ${EndIf}\n  ${If} $R2 == \"$R1$R1$R1$R1\"\n    DetailPrint \"PASSED If..ElseIf..Else..EndIf test\"\n  ${Else}\n    DetailPrint \"FAILED If..ElseIf..Else..EndIf test\"\n  ${EndIf}\n\n  ; if..andif..orif..endif\n  StrCpy $R2 \"\"\n  ${If} 1 = 1\n  ${AndIf} 2 = 2\n    StrCpy $R2 $R2A\n  ${Else}\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 1 = 1\n  ${AndIf} 2 = 3\n    StrCpy $R2 $R2B\n  ${Else}\n    StrCpy $R2 $R2A\n  ${EndIf}\n  ${If} 1 = 2\n  ${AndIf} 2 = 2\n    StrCpy $R2 $R2B\n  ${Else}\n    StrCpy $R2 $R2A\n  ${EndIf}\n  ${If} 1 = 2\n  ${AndIf} 2 = 3\n    StrCpy $R2 $R2B\n  ${Else}\n    StrCpy $R2 $R2A\n  ${EndIf}\n\n  ${If} 1 = 1\n  ${OrIf} 2 = 2\n    StrCpy $R2 $R2A\n  ${Else}\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 1 = 1\n  ${OrIf} 2 = 3\n    StrCpy $R2 $R2A\n  ${Else}\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 1 = 2\n  ${OrIf} 2 = 2\n    StrCpy $R2 $R2A\n  ${Else}\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 1 = 2\n  ${OrIf} 2 = 3\n    StrCpy $R2 $R2B\n  ${Else}\n    StrCpy $R2 $R2A\n  ${EndIf}\n\n  ${If} 1 = 1\n  ${AndIf} 2 = 2\n  ${OrIf} 3 = 3\n    StrCpy $R2 $R2A\n  ${Else}\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 1 = 1\n  ${AndIf} 2 = 3\n  ${OrIf} 3 = 3\n    StrCpy $R2 $R2A\n  ${Else}\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 1 = 2\n  ${AndIf} 2 = 2\n  ${OrIf} 3 = 3\n    StrCpy $R2 $R2A\n  ${Else}\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 1 = 2\n  ${AndIf} 2 = 3\n  ${OrIf} 3 = 3\n    StrCpy $R2 $R2A\n  ${Else}\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 1 = 1\n  ${AndIf} 2 = 2\n  ${OrIf} 3 = 4\n    StrCpy $R2 $R2A\n  ${Else}\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 1 = 1\n  ${AndIf} 2 = 3\n  ${OrIf} 3 = 4\n    StrCpy $R2 $R2B\n  ${Else}\n    StrCpy $R2 $R2A\n  ${EndIf}\n  ${If} 1 = 2\n  ${AndIf} 2 = 2\n  ${OrIf} 3 = 4\n    StrCpy $R2 $R2B\n  ${Else}\n    StrCpy $R2 $R2A\n  ${EndIf}\n  ${If} 1 = 2\n  ${AndIf} 2 = 3\n  ${OrIf} 3 = 4\n    StrCpy $R2 $R2B\n  ${Else}\n    StrCpy $R2 $R2A\n  ${EndIf}\n\n  ${If} 1 = 1\n  ${OrIf} 2 = 2\n  ${AndIf} 3 = 3\n    StrCpy $R2 $R2A\n  ${Else}\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 1 = 1\n  ${OrIf} 2 = 3\n  ${AndIf} 3 = 3\n    StrCpy $R2 $R2A\n  ${Else}\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 1 = 2\n  ${OrIf} 2 = 2\n  ${AndIf} 3 = 3\n    StrCpy $R2 $R2A\n  ${Else}\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 1 = 2\n  ${OrIf} 2 = 3\n  ${AndIf} 3 = 3\n    StrCpy $R2 $R2B\n  ${Else}\n    StrCpy $R2 $R2A\n  ${EndIf}\n  ${If} 1 = 1\n  ${OrIf} 2 = 2\n  ${AndIf} 3 = 4\n    StrCpy $R2 $R2B\n  ${Else}\n    StrCpy $R2 $R2A\n  ${EndIf}\n  ${If} 1 = 1\n  ${OrIf} 2 = 3\n  ${AndIf} 3 = 4\n    StrCpy $R2 $R2B\n  ${Else}\n    StrCpy $R2 $R2A\n  ${EndIf}\n  ${If} 1 = 2\n  ${OrIf} 2 = 2\n  ${AndIf} 3 = 4\n    StrCpy $R2 $R2B\n  ${Else}\n    StrCpy $R2 $R2A\n  ${EndIf}\n  ${If} 1 = 2\n  ${OrIf} 2 = 3\n  ${AndIf} 3 = 4\n    StrCpy $R2 $R2B\n  ${Else}\n    StrCpy $R2 $R2A\n  ${EndIf}\n\n  ${If} $R2 == \"AAAAAAAAAAAAAAAAAAAAAAAA\"\n    DetailPrint \"PASSED If..AndIf..OrIf..Else..EndIf test\"\n  ${Else}\n    DetailPrint \"FAILED If..AndIf..OrIf..Else..EndIf test\"\n  ${EndIf}\n\n  ; ifthen..|..|\n  StrCpy $R1 1\n  StrCpy $R2 \"\"\n  ${IfThen} $R1 = 1 ${|} StrCpy $R2 $R2A ${|}\n  ${IfThen} $R1 = 2 ${|} StrCpy $R2 $R2B ${|}\n  ${IfNotThen} $R1 = 1 ${|} StrCpy $R2 $R2C ${|}\n  ${IfNotThen} $R1 = 2 ${|} StrCpy $R2 $R2D ${|}\n  ${If} $R2 == \"AD\"\n    DetailPrint \"PASSED IfThen test\"\n  ${Else}\n    DetailPrint \"FAILED IfThen test\"\n  ${EndIf}\n\n  ; ifcmd..||..| and if/unless cmd\n  StrCpy $R2 \"\"\n  ${IfCmd} MessageBox MB_YESNO \"Please click Yes\" IDYES ${||} StrCpy $R2 $R2A ${|}\n  ${Unless} ${Cmd} `MessageBox MB_YESNO|MB_DEFBUTTON2 \"Please click No\" IDYES`\n    StrCpy $R2 $R2B\n  ${EndUnless}\n  ${If} $R2 == \"AB\"\n    DetailPrint \"PASSED IfCmd/If Cmd test\"\n  ${Else}\n    DetailPrint \"FAILED IfCmd/If Cmd test\"\n  ${EndIf}\n\n  ; select..case..case2..case3..case4..case5..caseelse..endselect\n  StrCpy $R1 1\n  StrCpy $R2 \"\"\n  ${Select} $R1\n    ${Case} \"1\"\n      StrCpy $R2 $R2A\n    ${Case} \"2\"\n      StrCpy $R2 $R2B\n    ${Case2} \"3\" \"4\"\n      StrCpy $R2 $R2C\n    ${CaseElse}\n      StrCpy $R2 $R2D\n  ${EndSelect}\n  ${Select} $R1\n    ${Case} \"2\"\n      StrCpy $R2 $R2A\n    ${Case} \"3\"\n      StrCpy $R2 $R2B\n    ${Case2} \"4\" \"5\"\n      StrCpy $R2 $R2C\n    ${CaseElse}\n      StrCpy $R2 $R2D\n  ${EndSelect}\n  ${Select} $R1\n    ${Case} \"3\"\n      StrCpy $R2 $R2A\n    ${Case} \"4\"\n      StrCpy $R2 $R2B\n    ${Case2} \"5\" \"1\"\n      StrCpy $R2 $R2C\n    ${CaseElse}\n      StrCpy $R2 $R2D\n  ${EndSelect}\n  ${Select} $R1\n    ${Case} \"4\"\n      StrCpy $R2 $R2A\n    ${Case} \"5\"\n      StrCpy $R2 $R2B\n    ${Case2} \"1\" \"2\"\n      StrCpy $R2 $R2C\n    ${CaseElse}\n      StrCpy $R2 $R2D\n  ${EndSelect}\n  ${If} $R2 == \"ADCC\"\n    DetailPrint \"PASSED Select..Case*..EndSelect test\"\n  ${Else}\n    DetailPrint \"FAILED Select..Case*..EndSelect test\"\n  ${EndIf}\n\n  ; switch..case..caseelse..endswitch\n  StrCpy $R2 \"\"\n  ${For} $R1 1 10\n    ${Switch} $R1\n      ${Case} 3\n        StrCpy $R2 $R2A\n      ${Case} 4\n        StrCpy $R2 $R2B\n        ${Break}\n      ${Case} 5\n        StrCpy $R2 $R2C\n    ${EndSwitch}\n    ${Switch} $R1\n      ${Case} 1\n        StrCpy $R2 $R2D\n      ${Default}\n        StrCpy $R2 $R2E\n        ${Break}\n      ${Case} 2\n        StrCpy $R2 $R2F\n    ${EndSwitch}\n    ${Switch} $R1\n      ${Case} 6\n      ${Case} 7\n        StrCpy $R2 $R2G\n        ${If} $R1 = 6\n      ${Case} 8\n          StrCpy $R2 $R2H\n          ${Switch} $R1\n            ${Case} 6\n              StrCpy $R2 $R2I\n              ${Break}\n            ${Case} 8\n              StrCpy $R2 $R2J\n          ${EndSwitch}\n        ${EndIf}\n        StrCpy $R2 $R2K\n        ${Break}\n      ${Default}\n        StrCpy $R2 $R2L\n      ${Case} 9\n        StrCpy $R2 $R2M\n    ${EndSwitch}\n  ${Next}\n  ${If} $R2 == \"DELMFLMABELMBELMCELMEGHIKEGKEHJKEMELM\"\n    DetailPrint \"PASSED Switch..Case*..EndSwitch test\"\n  ${Else}\n    DetailPrint \"FAILED Switch..Case*..EndSwitch test\"\n  ${EndIf}\n\n  ; for[each]..exitfor..next\n  StrCpy $R2 \"\"\n  ${For} $R1 1 5\n    StrCpy $R2 $R2$R1\n  ${Next}\n  ${ForEach} $R1 10 1 - 1\n    StrCpy $R2 $R2$R1\n  ${Next}\n  ${For} $R1 1 0\n    StrCpy $R2 $R2$R1\n  ${Next}\n  ${If} $R2 == \"1234510987654321\"\n    DetailPrint \"PASSED For[Each]..Next test\"\n  ${Else}\n    DetailPrint \"FAILED For[Each]..Next test\"\n  ${EndIf}\n\n  ; do..loop\n  StrCpy $R1 0\n  Call DoLoop\n  ${If} $R1 == 5\n    DetailPrint \"PASSED Do..Loop test\"\n  ${Else}\n    DetailPrint \"FAILED Do..Loop test\"\n  ${EndIf}\n\n  ; do..exitdo..loop\n  StrCpy $R1 0\n  StrCpy $R2 \"\"\n  ${Do}\n    StrCpy $R2 $R2$R1\n    IntOp $R1 $R1 + 1\n    ${If} $R1 > 10\n      ${ExitDo}\n    ${EndIf}\n  ${Loop}\n  ${If} $R2 == \"012345678910\"\n    DetailPrint \"PASSED Do..ExitDo..Loop test\"\n  ${Else}\n    DetailPrint \"FAILED Do..ExitDo..Loop test\"\n  ${EndIf}\n\n  ; do..exitdo..loopuntil\n  StrCpy $R1 0\n  StrCpy $R2 \"\"\n  ${Do}\n    StrCpy $R2 $R2$R1\n    IntOp $R1 $R1 + 1\n  ${LoopUntil} $R1 >= 5\n  ${If} $R2 == \"01234\"\n    DetailPrint \"PASSED Do..ExitDo..LoopUntil test\"\n  ${Else}\n    DetailPrint \"FAILED Do..ExitDo..LoopUntil test\"\n  ${EndIf}\n\n  ; dountil..exitdo..loop\n  StrCpy $R1 0\n  StrCpy $R2 \"\"\n  ${DoUntil} $R1 >= 5\n    StrCpy $R2 $R2$R1\n    IntOp $R1 $R1 + 1\n  ${Loop}\n  ${If} $R2 == \"01234\"\n    DetailPrint \"PASSED DoUntil..ExitDo..Loop test\"\n  ${Else}\n    DetailPrint \"FAILED DoUntil..ExitDo..Loop test\"\n  ${EndIf}\n\n  ; nested do test\n  StrCpy $R1 0\n  StrCpy $R2 0\n  StrCpy $R3 \"\"\n  ${Do}\n    StrCpy $R3 $R3$R1$R2\n    IntOp $R1 $R1 + 1\n    ${If} $R1 > 5\n      ${ExitDo}\n    ${EndIf}\n    StrCpy $R2 0\n    ${Do}\n      StrCpy $R3 $R3$R1$R2\n      IntOp $R2 $R2 + 1\n      ${If} $R2 >= 5\n        ${ExitDo}\n      ${EndIf}\n    ${Loop}\n  ${Loop}\n  ${If} $R3 == \"00101112131415202122232425303132333435404142434445505152535455\"\n    DetailPrint \"PASSED nested Do test\"\n  ${Else}\n    DetailPrint \"FAILED nested Do test\"\n  ${EndIf}\n\n  ; while..exitwhile..endwhile (exact replica of dowhile..enddo}\n  StrCpy $R1 0\n  StrCpy $R2 \"\"\n  ${While} $R1 < 5\n    StrCpy $R2 $R2$R1\n    IntOp $R1 $R1 + 1\n  ${EndWhile}\n  ${If} $R2 == \"01234\"\n    DetailPrint \"PASSED While..ExitWhile..EndWhile test\"\n  ${Else}\n    DetailPrint \"FAILED While..ExitWhile..EndWhile test\"\n  ${EndIf}\n\n  ; Unsigned integer tests\n  StrCpy $R2 \"\"\n  ${If} -1 < 1\n    StrCpy $R2 $R2A\n  ${EndIf}\n  ${If} -1 U< 1\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 0xFFFFFFFF > 1\n    StrCpy $R2 $R2C\n  ${EndIf}\n  ${If} 0xFFFFFFFF U> 1\n    StrCpy $R2 $R2D\n  ${EndIf}\n  ${If} $R2 == \"AD\"\n    DetailPrint \"PASSED unsigned integer test\"\n  ${Else}\n    DetailPrint \"FAILED unsigned integer test\"\n  ${EndIf}\n\n  ; 64-bit integer tests (uses System.dll)\n  StrCpy $R2 \"\"\n  ${If} 0x100000000 L= 4294967296\n    StrCpy $R2 $R2A\n  ${EndIf}\n  ${If} 0x100000000 L< 0x200000000\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} 0x500000000 L>= 0x500000000\n    StrCpy $R2 $R2C\n  ${EndIf}\n  ${If} $R2 == \"ABC\"\n    DetailPrint \"PASSED 64-bit integer test\"\n  ${Else}\n    DetailPrint \"FAILED 64-bit integer test\"\n  ${EndIf}\n\n  ; Extra string tests (uses System.dll)\n  StrCpy $R2 \"\"\n  ${If} \"A\" S< \"B\"\n    StrCpy $R2 $R2A\n  ${EndIf}\n  ${If} \"b\" S> \"A\"\n    StrCpy $R2 $R2B\n  ${EndIf}\n  ${If} \"a\" S<= \"B\"\n    StrCpy $R2 $R2C\n  ${EndIf}\n  ${If} \"B\" S< \"B\"\n    StrCpy $R2 $R2D\n  ${EndIf}\n  ${If} \"A\" S== \"A\"\n    StrCpy $R2 $R2E\n  ${EndIf}\n  ${If} \"A\" S== \"a\"\n    StrCpy $R2 $R2F\n  ${EndIf}\n  ${If} \"A\" S!= \"a\"\n    StrCpy $R2 $R2G\n  ${EndIf}\n  ${If} $R2 == \"ABCEG\"\n    DetailPrint \"PASSED extra string test\"\n  ${Else}\n    DetailPrint \"FAILED extra string test\"\n  ${EndIf}\n\nSectionEnd\n\nFunction ComponentsLeave\n  ; Section flags tests (requires sections.nsh be included)\n  ${Unless} ${SectionIsSelected} ${TESTS}\n    MessageBox MB_OK \"Please select the component\"\n    Abort\n  ${EndIf}\nFunctionEnd\n\nFunction DoLoop\n\n  ${Do}\n    IntOp $R1 $R1 + 1\n    ${If} $R1 == 5\n      Return\n    ${EndIf}\n  ${Loop}\n\nFunctionEnd\n\n!verbose 3\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Math/math.nsi",
    "content": "; This is just an example of Math plugin\n; \n; (c) brainsucker, 2002\n; (r) BSForce\n\nName \"Math Plugin Example\"\nOutFile \"math.exe\"\nShowInstDetails show\nXPStyle on\n\nSection \"ThisNameIsIgnoredSoWhyBother?\"\n    Math::Script 'SaR(s,fa,ra, i,f,r,e,p) (i=0;#{i<l(fa),e=l(f=fa[i]);r=ra[i];p=0;#{p<l(s),#[s[p,p+e-1]==f,s=(s[,p-1])+r+(s[p+e,]);p+=l(r), p++]}; i++}; s);'\n    Math::Script \"TQ(s) (s = s(NS); #[s[0]=='$\\\"',s=s[1,]]; #[s[-1]=='$\\\"',s=s[,-2]]; NS = s)\"\n    Math::Script \"P(s,e, p,i) (p=-1;i=0; #{(i<l(s))&&(p<0), #[s[i,i+l(e)-1]==e, p=i]; i++}; p)\"\n    Math::Script \"DL(s) (s=s(NS); p=P(s,'\\r\\n'); #[p>=0, (NS=s[p+4,]; NS=#[p>0,s[,p-1],'']), (NS='';NS=s)])\"\n\n    Math::Script \"a = 'Hello \\r\\n World \\r\\n!!!'; a = SaR(a,{'\\r','\\n'},{'$\\r','$\\n'}); R0 = a\"\n    Math::Script \"NS = '$\\\"In quotes$\\\"'; TQ(); R1=NS; R3=P(s(R1),'qu')\"\n    Math::Script \"NS = 'No quotes'; TQ(); R2=NS\"\n    Math::Script \"NS='123\\r\\n456\\r\\n789'; DL(); R4=NS; DL(); R5=NS; DL(); R6=NS; R7=NS\"\n\n\n    DetailPrint \"'$R0'\"\n    DetailPrint \"'$R1'\"\n    DetailPrint \"'$R2'\"\n    DetailPrint \"'$R3'\"\n    DetailPrint \"'$R4'\"\n    DetailPrint \"'$R5'\"\n    DetailPrint \"'$R6'\"\n    DetailPrint \"'$R7'\"\nSectionEnd \n\n; eof\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Math/mathtest.ini",
    "content": "[Settings]\nNumFields=10\nNextButtonText=Execute\nCancelButtonText=Quit\nBackButtonText=Readme\n\n[Field 1]\nType=label\nText=Enter your script here:\nLeft=0\nRight=-1\nTop=0\nBottom=8\n\n[Field 2]\nType=text\nLeft=0\nRight=-1\nTop=9\nBottom=55\nflags=MULTILINE|WANTRETURN|HSCROLL\nState=\"\"\n\n[Field 3]\nType=text\nLeft=53\nRight=175\nTop=56\nBottom=140\nflags=MULTILINE|READONLY\nState=\"\"\n\n[Field 4]\nType=text\nLeft=175\nRight=-1\nTop=56\nBottom=140\nflags=MULTILINE|READONLY\nState=\"\"\n\n[Field 5]\nType=RadioButton\nLeft=0\nRight=-1\nTop=70\nBottom=80\nflags=GROUP\nText=\"Your script\"\nState=1\n\n[Field 6]\nType=RadioButton\nLeft=0\nRight=-1\nTop=80\nBottom=90\nflags=\nText=\"Sample 1\"\nState=0\n\n[Field 7]\nType=RadioButton\nLeft=0\nRight=-1\nTop=90\nBottom=100\nflags=\nText=\"Sample 2\"\nState=0\n\n[Field 8]\nType=RadioButton\nLeft=0\nRight=-1\nTop=100\nBottom=110\nflags=\nText=\"Sample 3\"\nState=0\n\n[Field 9]\nType=RadioButton\nLeft=0\nRight=-1\nTop=110\nBottom=120\nflags=\nText=\"Sample 4\"\nState=0\n\n[Field 10]\nType=RadioButton\nLeft=0\nRight=-1\nTop=120\nBottom=130\nflags=\nText=\"Sample 5\"\nState=0\n\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Math/mathtest.nsi",
    "content": ";NSIS Modern User Interface version 1.65\n;InstallOptions Example Script\n;Written by Joost Verburg\n\n  !define MUI_BUTTONTEXT_NEXT      \"Execute\"\n\n;---------------------\n;Include Modern UI\n\n  !include \"MUI.nsh\"\n\n;--------------------------------\n;Product Info\n\nName \"Math::Script Test\"\n\n;--------------------------------\n;Configuration\n\n  ;General\n  OutFile \"MathTest.exe\"\n\n;--------------------------------\n;Variables\n\n  Var TEMP1\n  Var TEMP2\n  Var TEMP3\n\n;--------------------------------\n;Pages\n\n  !insertmacro MUI_PAGE_LICENSE \"mathtest.txt\"\n  Page custom ScriptPageEnter\n  Page instfiles\n \n;--------------------------------\n;Modern UI Configuration\n\n;  !define MUI_ABORTWARNING\n  \n;--------------------------------\n;Languages\n \n  !insertmacro MUI_LANGUAGE \"English\"\n\n;--------------------------------\n;Reserve Files\n  \n  ;Things that need to be extracted on first (keep these lines before any File command!)\n  ;Only for BZIP2 compression\n  \n  ReserveFile \"MathTest.ini\"\n  !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS\n\n;--------------------------------\n;Installer Functions\n\nLangString SCRIPTSAMPLE0 ${LANG_ENGLISH} \"r0 = 'Hello'; r1 = 'Math::Script'\\r\\nr0 += ' from the ' + r1 + '!'; r1=''\"\nLangString SCRIPTSAMPLE1 ${LANG_ENGLISH} \"a =0; b=1.0\\r\\n#{a++ < 100, b *= a}\\r\\nr0 = a; R0 = b; R1 = ff(b, 15)\\r\\nr1 = (a-1) + '! = ' + b\"\nLangString SCRIPTSAMPLE2 ${LANG_ENGLISH} 'pi=3.14159; \\r\\nangle = pi/4;\\r\\ntext = \"x = \" + ff(angle,16+3) \\r\\nr0 = text +=  \", sin x = \" + sin(angle)'\nLangString SCRIPTSAMPLE3 ${LANG_ENGLISH} \"v1 = 123.456;  v2 = 123456789.1011\\r\\nr0 = v1; r1 = v2\\r\\nr2 = ff(v1, 3); r3 = ff(v2, 3); r4 = ff(v1, 3+16); r5 = ff(v2, 3+16)\\r\\nr6 = ff(v1, 3+32); r7 = ff(v2, 3+32); r8 = ff(v1, 3+32+64); r9 = ff(v2, 3+32+64)\\r\\n\"\nLangString SCRIPTSAMPLE4 ${LANG_ENGLISH} \"a = 10000; b = 0; #{--a > 0, b+= a}; r0 = a; r1 = b\\r\\nz = 1.55; r2 = #[z > 1.5, 'Its greater', 'Its lower']\\r\\nz = 1.45; r3 = #[z > 1.5, 'Its greater', 'Its lower']\"\nLangString SCRIPTSAMPLE5 ${LANG_ENGLISH} 'r0 = \"123a123\"\\r\\nr1 = r0; \\r\\nr2 = s(r0); r3 = f(r0); r4 = i(r0); r5 = l(r0)' \n\nFunction .onInit\n\n  ;Extract InstallOptions INI files\n  !insertmacro MUI_INSTALLOPTIONS_EXTRACT \"MathTest.ini\"\n\n  Strcpy \"$TEMP1\" \"$(SCRIPTSAMPLE0)\"\n  !insertmacro MUI_INSTALLOPTIONS_WRITE \"MathTest.ini\" \"Field 2\" \"State\" $TEMP1\n  \nFunctionEnd\n\nLangString TEXT_IO_TITLE ${LANG_ENGLISH} \"MathTest Script Page\"\nLangString TEXT_IO_SUBTITLE ${LANG_ENGLISH} \"Try your scripting capapibilites or test one of sample scripts\"\n\n\nFunction DumpVariables\n  Strcpy \"$TEMP1\" \"$$0='$0'\\r\\n$$1='$1'\\r\\n$$2='$2'\\r\\n$$3='$3'\\r\\n$$4='$4'\\r\\n$$5='$5'\\r\\n$$6='$6'\\r\\n$$7='$7'\\r\\n$$8='$8'\\r\\n$$9='$9'\"\n  !insertmacro MUI_INSTALLOPTIONS_WRITE \"MathTest.ini\" \"Field 3\" \"State\" $TEMP1  \n  Strcpy \"$TEMP1\" \"$$R0='$R0'\\r\\n$$R1='$R1'\\r\\n$$R2='$R2'\\r\\n$$R3='$R3'\\r\\n$$R4='$R4'\\r\\n$$R5='$R5'\\r\\n$$R6='$R6'\\r\\n$$R7='$R7'\\r\\n$$R8='$R8'\\r\\n$$R9='$R9'\"\n  !insertmacro MUI_INSTALLOPTIONS_WRITE \"MathTest.ini\" \"Field 4\" \"State\" $TEMP1  \nFunctionEnd\n\nFunction ClearVariables\n  Math::Script \"r0=r1=r2=r3=r4=r5=r6=r7=r8=r9=R0=R1=R2=R3=R4=R5=R6=R7=R8=R9=''\"\nFunctionEnd\n\nFunction GetLine\n  push $TEMP1\n  Math::Script \"mtsDL()\"\n  pop $TEMP2\n  pop $TEMP1\nFunctionEnd\n\nFunction ExecuteScript\n  !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 \"MathTest.ini\" \"Field 2\" \"State\" \n\n  Math::Script \"mtsTQ(s) (s = s(NS); #[s[0]=='$\\\"',s=s[1,]]; #[s[-1]=='$\\\"',s=s[,-2]]; NS = s)\"\n  Math::Script \"mtsP(s,e, p,i) (p=-1;i=0; #{(i<l(s))&&(p<0), #[s[i,i+l(e)-1]==e, p=i]; i++}; p)\"\n  Math::Script \"mtsDL(s) (s=s(NS); p=mtsP(s,'\\r\\n'); #[p>=0, (NS=s[p+4,]; NS=#[p>0,s[,p-1],'']), (NS='';NS=s)])\"\n\n  push  $TEMP1\n  ; remove \"\"\n  Math::Script \"mtsTQ()\"\n  pop   $TEMP1\n\n  ; script at $TEMP1\nGo:\n   StrLen $TEMP3 $TEMP1\n   IntCmp $TEMP3 0 End\n   ; get single line to $TEMP2\n   Call GetLine\n;   MessageBox MB_OK \"'$TEMP2'      '$TEMP1'\"\n   Math::Script \"$TEMP2\"\n   goto Go\nEnd:\n   Math::Script \"\"\nFunctionEnd\n\nFunction ScriptPageEnter\n      \n  !insertmacro MUI_HEADER_TEXT \"$(TEXT_IO_TITLE)\" \"$(TEXT_IO_SUBTITLE)\"\n\nAgain:\n  Call ClearVariables\n  Call ExecuteScript\n  Call DumpVariables\n\n  !insertmacro MUI_INSTALLOPTIONS_DISPLAY_RETURN \"mathtest.ini\"\n  pop $TEMP3\n\n  !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 \"MathTest.ini\" \"Field 5\" \"State\"\n  IntCmp $TEMP1 1 Test\n\n  Strcpy \"$TEMP2\" \"$(SCRIPTSAMPLE1)\"\n  !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 \"MathTest.ini\" \"Field 6\" \"State\"\n  IntCmp $TEMP1 1 Write\n\n  Strcpy \"$TEMP2\" \"$(SCRIPTSAMPLE2)\"\n  !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 \"MathTest.ini\" \"Field 7\" \"State\"\n  IntCmp $TEMP1 1 Write\n\n  Strcpy \"$TEMP2\" \"$(SCRIPTSAMPLE3)\"\n  !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 \"MathTest.ini\" \"Field 8\" \"State\"\n  IntCmp $TEMP1 1 Write\n\n  Strcpy \"$TEMP2\" \"$(SCRIPTSAMPLE4)\"\n  !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 \"MathTest.ini\" \"Field 9\" \"State\"\n  IntCmp $TEMP1 1 Write\n\n  Strcpy \"$TEMP2\" \"$(SCRIPTSAMPLE5)\"\n\nWrite:\n  !insertmacro MUI_INSTALLOPTIONS_WRITE \"MathTest.ini\" \"Field 2\" \"State\" \"$TEMP2\"\n  !insertmacro MUI_INSTALLOPTIONS_WRITE \"MathTest.ini\" \"Field 5\" \"State\" \"1\"\n  !insertmacro MUI_INSTALLOPTIONS_WRITE \"MathTest.ini\" \"Field 6\" \"State\" \"0\"\n  !insertmacro MUI_INSTALLOPTIONS_WRITE \"MathTest.ini\" \"Field 7\" \"State\" \"0\"\n  !insertmacro MUI_INSTALLOPTIONS_WRITE \"MathTest.ini\" \"Field 8\" \"State\" \"0\"\n  !insertmacro MUI_INSTALLOPTIONS_WRITE \"MathTest.ini\" \"Field 9\" \"State\" \"0\"\n  !insertmacro MUI_INSTALLOPTIONS_WRITE \"MathTest.ini\" \"Field 10\" \"State\" \"0\"\n\nTest:\n  Strcmp $TEMP3 \"success\" Again\n\nFunctionEnd\n\nSection \"Dummy Section\" SecDummy  \nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Math/mathtest.txt",
    "content": "Math Tester.\n\nThis demo allows you to test your Math::Script expressions without need to compile anything. Just enter your expressions into multiline editbox (every single line is a separate call to Math::Script) or select one of sample expressions and press Execute.\n\nEvery call to Math::Script can accept up to 1kb of script, but this demo is limited to the summ of 1 kb at all lines. And... watch your scripts. No.... Watch your errors at scripts!\n\n(c) Brainsucker, 2003.\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Memento.nsi",
    "content": "!include LogicLib.nsh\n!include Memento.nsh\n\nName Memento\nOutFile Memento.exe\n\nXPStyle on\n\nShowInstDetails show\n\nPage components\nPage instfiles\n\nRequestExecutionLevel user\n\n# settings\n\n!define MEMENTO_REGISTRY_ROOT HKCU\n!define MEMENTO_REGISTRY_KEY \"Software\\NSIS\\Memento Test\"\n\n# restore\n\nFunction .onInit\n\n  ${If} ${Cmd} `MessageBox MB_YESNO \"Would you like to load an example state?\" IDYES`\n    \n\tDeleteRegKey  HKCU \"Software\\NSIS\\Memento Test\"\n\n\tWriteRegStr   HKCU \"Software\\NSIS\\Memento Test\" MementoSectionUsed \"\"\n\tWriteRegDWORD HKCU \"Software\\NSIS\\Memento Test\" MementoSection_sec_horse   1\n\tWriteRegDWORD HKCU \"Software\\NSIS\\Memento Test\" MementoSection_sec_chicken 1\n\tWriteRegDWORD HKCU \"Software\\NSIS\\Memento Test\" MementoSection_sec_donkey  0\n\tWriteRegDWORD HKCU \"Software\\NSIS\\Memento Test\" MementoSection_sec_croc    0\n\n  ${EndIf}\n\n  ${MementoSectionRestore}\n\nFunctionEnd\n\n# sections\n\n${MementoSection} horse sec_horse\n${MementoSectionEnd}\n\n${MementoSection} donkey sec_donkey\n${MementoSectionEnd}\n\n${MementoSection} chicken sec_chicken\n${MementoSectionEnd}\n\nSectionGroup /e group\n\n  SectionGroup /e group\n\n    ${MementoSection} croc sec_croc\n    ${MementoSectionEnd}\n\n    ${MementoSection} cow sec_cow\n    ${MementoSectionEnd}\n\n  SectionGroupEnd\n\nSectionGroupEnd\n\n${MementoUnselectedSection} dinosaur sec_dinosaur\n${MementoSectionEnd}\n\n# done...\n\n${MementoSectionDone}\n\n# save\n\nFunction .onInstSuccess\n\n  ${MementoSectionSave}\n\nFunctionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Modern UI/Basic.nsi",
    "content": ";NSIS Modern User Interface\n;Basic Example Script\n;Written by Joost Verburg\n\n;--------------------------------\n;Include Modern UI\n\n  !include \"MUI2.nsh\"\n\n;--------------------------------\n;General\n\n  ;Name and file\n  Name \"Modern UI Test\"\n  OutFile \"Basic.exe\"\n\n  ;Default installation folder\n  InstallDir \"$LOCALAPPDATA\\Modern UI Test\"\n  \n  ;Get installation folder from registry if available\n  InstallDirRegKey HKCU \"Software\\Modern UI Test\" \"\"\n\n  ;Request application privileges for Windows Vista\n  RequestExecutionLevel user\n\n;--------------------------------\n;Interface Settings\n\n  !define MUI_ABORTWARNING\n\n;--------------------------------\n;Pages\n\n  !insertmacro MUI_PAGE_LICENSE \"${NSISDIR}\\Docs\\Modern UI\\License.txt\"\n  !insertmacro MUI_PAGE_COMPONENTS\n  !insertmacro MUI_PAGE_DIRECTORY\n  !insertmacro MUI_PAGE_INSTFILES\n  \n  !insertmacro MUI_UNPAGE_CONFIRM\n  !insertmacro MUI_UNPAGE_INSTFILES\n  \n;--------------------------------\n;Languages\n \n  !insertmacro MUI_LANGUAGE \"English\"\n\n;--------------------------------\n;Installer Sections\n\nSection \"Dummy Section\" SecDummy\n\n  SetOutPath \"$INSTDIR\"\n  \n  ;ADD YOUR OWN FILES HERE...\n  \n  ;Store installation folder\n  WriteRegStr HKCU \"Software\\Modern UI Test\" \"\" $INSTDIR\n  \n  ;Create uninstaller\n  WriteUninstaller \"$INSTDIR\\Uninstall.exe\"\n\nSectionEnd\n\n;--------------------------------\n;Descriptions\n\n  ;Language strings\n  LangString DESC_SecDummy ${LANG_ENGLISH} \"A test section.\"\n\n  ;Assign language strings to sections\n  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN\n    !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy)\n  !insertmacro MUI_FUNCTION_DESCRIPTION_END\n\n;--------------------------------\n;Uninstaller Section\n\nSection \"Uninstall\"\n\n  ;ADD YOUR OWN FILES HERE...\n\n  Delete \"$INSTDIR\\Uninstall.exe\"\n\n  RMDir \"$INSTDIR\"\n\n  DeleteRegKey /ifempty HKCU \"Software\\Modern UI Test\"\n\nSectionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Modern UI/HeaderBitmap.nsi",
    "content": ";NSIS Modern User Interface\n;Header Bitmap Example Script\n;Written by Joost Verburg\n\n;--------------------------------\n;Include Modern UI\n\n  !include \"MUI2.nsh\"\n\n;--------------------------------\n;General\n\n  ;Name and file\n  Name \"Modern UI Test\"\n  OutFile \"HeaderBitmap.exe\"\n\n  ;Default installation folder\n  InstallDir \"$LOCALAPPDATA\\Modern UI Test\"\n  \n  ;Get installation folder from registry if available\n  InstallDirRegKey HKCU \"Software\\Modern UI Test\" \"\"\n\n  ;Request application privileges for Windows Vista\n  RequestExecutionLevel user\n\n;--------------------------------\n;Interface Configuration\n\n  !define MUI_HEADERIMAGE\n  !define MUI_HEADERIMAGE_BITMAP \"${NSISDIR}\\Contrib\\Graphics\\Header\\nsis.bmp\" ; optional\n  !define MUI_ABORTWARNING\n\n;--------------------------------\n;Pages\n\n  !insertmacro MUI_PAGE_LICENSE \"${NSISDIR}\\Docs\\Modern UI\\License.txt\"\n  !insertmacro MUI_PAGE_COMPONENTS\n  !insertmacro MUI_PAGE_DIRECTORY\n  !insertmacro MUI_PAGE_INSTFILES\n  \n  !insertmacro MUI_UNPAGE_CONFIRM\n  !insertmacro MUI_UNPAGE_INSTFILES\n  \n;--------------------------------\n;Languages\n \n  !insertmacro MUI_LANGUAGE \"English\"\n\n;--------------------------------\n;Installer Sections\n\nSection \"Dummy Section\" SecDummy\n\n  SetOutPath \"$INSTDIR\"\n  \n  ;ADD YOUR OWN FILES HERE...\n  \n  ;Store installation folder\n  WriteRegStr HKCU \"Software\\Modern UI Test\" \"\" $INSTDIR\n  \n  ;Create uninstaller\n  WriteUninstaller \"$INSTDIR\\Uninstall.exe\"\n\nSectionEnd\n\n;--------------------------------\n;Descriptions\n\n  ;Language strings\n  LangString DESC_SecDummy ${LANG_ENGLISH} \"A test section.\"\n\n  ;Assign language strings to sections\n  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN\n    !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy)\n  !insertmacro MUI_FUNCTION_DESCRIPTION_END\n \n;--------------------------------\n;Uninstaller Section\n\nSection \"Uninstall\"\n\n  ;ADD YOUR OWN FILES HERE...\n\n  Delete \"$INSTDIR\\Uninstall.exe\"\n\n  RMDir \"$INSTDIR\"\n\n  DeleteRegKey /ifempty HKCU \"Software\\Modern UI Test\"\n\nSectionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Modern UI/MultiLanguage.nsi",
    "content": ";NSIS Modern User Interface\n;Multilingual Example Script\n;Written by Joost Verburg\n\n;--------------------------------\n;Include Modern UI\n\n  !include \"MUI2.nsh\"\n\n;--------------------------------\n;General\n\n  ;Name and file\n  Name \"Modern UI Test\"\n  OutFile \"MultiLanguage.exe\"\n\n  ;Default installation folder\n  InstallDir \"$LOCALAPPDATA\\Modern UI Test\"\n  \n  ;Get installation folder from registry if available\n  InstallDirRegKey HKCU \"Software\\Modern UI Test\" \"\"\n\n  ;Request application privileges for Windows Vista\n  RequestExecutionLevel user\n\n;--------------------------------\n;Interface Settings\n\n  !define MUI_ABORTWARNING\n\n;--------------------------------\n;Language Selection Dialog Settings\n\n  ;Remember the installer language\n  !define MUI_LANGDLL_REGISTRY_ROOT \"HKCU\" \n  !define MUI_LANGDLL_REGISTRY_KEY \"Software\\Modern UI Test\" \n  !define MUI_LANGDLL_REGISTRY_VALUENAME \"Installer Language\"\n\n;--------------------------------\n;Pages\n\n  !insertmacro MUI_PAGE_LICENSE \"${NSISDIR}\\Docs\\Modern UI\\License.txt\"\n  !insertmacro MUI_PAGE_COMPONENTS\n  !insertmacro MUI_PAGE_DIRECTORY\n  !insertmacro MUI_PAGE_INSTFILES\n  \n  !insertmacro MUI_UNPAGE_CONFIRM\n  !insertmacro MUI_UNPAGE_INSTFILES\n\n;--------------------------------\n;Languages\n\n  !insertmacro MUI_LANGUAGE \"English\" ;first language is the default language\n  !insertmacro MUI_LANGUAGE \"French\"\n  !insertmacro MUI_LANGUAGE \"German\"\n  !insertmacro MUI_LANGUAGE \"Spanish\"\n  !insertmacro MUI_LANGUAGE \"SpanishInternational\"\n  !insertmacro MUI_LANGUAGE \"SimpChinese\"\n  !insertmacro MUI_LANGUAGE \"TradChinese\"\n  !insertmacro MUI_LANGUAGE \"Japanese\"\n  !insertmacro MUI_LANGUAGE \"Korean\"\n  !insertmacro MUI_LANGUAGE \"Italian\"\n  !insertmacro MUI_LANGUAGE \"Dutch\"\n  !insertmacro MUI_LANGUAGE \"Danish\"\n  !insertmacro MUI_LANGUAGE \"Swedish\"\n  !insertmacro MUI_LANGUAGE \"Norwegian\"\n  !insertmacro MUI_LANGUAGE \"NorwegianNynorsk\"\n  !insertmacro MUI_LANGUAGE \"Finnish\"\n  !insertmacro MUI_LANGUAGE \"Greek\"\n  !insertmacro MUI_LANGUAGE \"Russian\"\n  !insertmacro MUI_LANGUAGE \"Portuguese\"\n  !insertmacro MUI_LANGUAGE \"PortugueseBR\"\n  !insertmacro MUI_LANGUAGE \"Polish\"\n  !insertmacro MUI_LANGUAGE \"Ukrainian\"\n  !insertmacro MUI_LANGUAGE \"Czech\"\n  !insertmacro MUI_LANGUAGE \"Slovak\"\n  !insertmacro MUI_LANGUAGE \"Croatian\"\n  !insertmacro MUI_LANGUAGE \"Bulgarian\"\n  !insertmacro MUI_LANGUAGE \"Hungarian\"\n  !insertmacro MUI_LANGUAGE \"Thai\"\n  !insertmacro MUI_LANGUAGE \"Romanian\"\n  !insertmacro MUI_LANGUAGE \"Latvian\"\n  !insertmacro MUI_LANGUAGE \"Macedonian\"\n  !insertmacro MUI_LANGUAGE \"Estonian\"\n  !insertmacro MUI_LANGUAGE \"Turkish\"\n  !insertmacro MUI_LANGUAGE \"Lithuanian\"\n  !insertmacro MUI_LANGUAGE \"Slovenian\"\n  !insertmacro MUI_LANGUAGE \"Serbian\"\n  !insertmacro MUI_LANGUAGE \"SerbianLatin\"\n  !insertmacro MUI_LANGUAGE \"Arabic\"\n  !insertmacro MUI_LANGUAGE \"Farsi\"\n  !insertmacro MUI_LANGUAGE \"Hebrew\"\n  !insertmacro MUI_LANGUAGE \"Indonesian\"\n  !insertmacro MUI_LANGUAGE \"Mongolian\"\n  !insertmacro MUI_LANGUAGE \"Luxembourgish\"\n  !insertmacro MUI_LANGUAGE \"Albanian\"\n  !insertmacro MUI_LANGUAGE \"Breton\"\n  !insertmacro MUI_LANGUAGE \"Belarusian\"\n  !insertmacro MUI_LANGUAGE \"Icelandic\"\n  !insertmacro MUI_LANGUAGE \"Malay\"\n  !insertmacro MUI_LANGUAGE \"Bosnian\"\n  !insertmacro MUI_LANGUAGE \"Kurdish\"\n  !insertmacro MUI_LANGUAGE \"Irish\"\n  !insertmacro MUI_LANGUAGE \"Uzbek\"\n  !insertmacro MUI_LANGUAGE \"Galician\"\n  !insertmacro MUI_LANGUAGE \"Afrikaans\"\n  !insertmacro MUI_LANGUAGE \"Catalan\"\n  !insertmacro MUI_LANGUAGE \"Esperanto\"\n\n;--------------------------------\n;Reserve Files\n  \n  ;If you are using solid compression, files that are required before\n  ;the actual installation should be stored first in the data block,\n  ;because this will make your installer start faster.\n  \n  !insertmacro MUI_RESERVEFILE_LANGDLL\n\n;--------------------------------\n;Installer Sections\n\nSection \"Dummy Section\" SecDummy\n\n  SetOutPath \"$INSTDIR\"\n  \n  ;ADD YOUR OWN FILES HERE...\n  \n  ;Store installation folder\n  WriteRegStr HKCU \"Software\\Modern UI Test\" \"\" $INSTDIR\n  \n  ;Create uninstaller\n  WriteUninstaller \"$INSTDIR\\Uninstall.exe\"\n\nSectionEnd\n\n;--------------------------------\n;Installer Functions\n\nFunction .onInit\n\n  !insertmacro MUI_LANGDLL_DISPLAY\n\nFunctionEnd\n\n;--------------------------------\n;Descriptions\n\n  ;USE A LANGUAGE STRING IF YOU WANT YOUR DESCRIPTIONS TO BE LANGAUGE SPECIFIC\n\n  ;Assign descriptions to sections\n  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN\n    !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} \"A test section.\"\n  !insertmacro MUI_FUNCTION_DESCRIPTION_END\n\n \n;--------------------------------\n;Uninstaller Section\n\nSection \"Uninstall\"\n\n  ;ADD YOUR OWN FILES HERE...\n\n  Delete \"$INSTDIR\\Uninstall.exe\"\n\n  RMDir \"$INSTDIR\"\n\n  DeleteRegKey /ifempty HKCU \"Software\\Modern UI Test\"\n\nSectionEnd\n\n;--------------------------------\n;Uninstaller Functions\n\nFunction un.onInit\n\n  !insertmacro MUI_UNGETLANGUAGE\n  \nFunctionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Modern UI/StartMenu.nsi",
    "content": ";NSIS Modern User Interface\n;Start Menu Folder Selection Example Script\n;Written by Joost Verburg\n\n;--------------------------------\n;Include Modern UI\n\n  !include \"MUI2.nsh\"\n\n;--------------------------------\n;General\n\n  ;Name and file\n  Name \"Modern UI Test\"\n  OutFile \"StartMenu.exe\"\n\n  ;Default installation folder\n  InstallDir \"$LOCALAPPDATA\\Modern UI Test\"\n  \n  ;Get installation folder from registry if available\n  InstallDirRegKey HKCU \"Software\\Modern UI Test\" \"\"\n\n  ;Request application privileges for Windows Vista\n  RequestExecutionLevel user\n\n;--------------------------------\n;Variables\n\n  Var StartMenuFolder\n\n;--------------------------------\n;Interface Settings\n\n  !define MUI_ABORTWARNING\n\n;--------------------------------\n;Pages\n\n  !insertmacro MUI_PAGE_LICENSE \"${NSISDIR}\\Docs\\Modern UI\\License.txt\"\n  !insertmacro MUI_PAGE_COMPONENTS\n  !insertmacro MUI_PAGE_DIRECTORY\n  \n  ;Start Menu Folder Page Configuration\n  !define MUI_STARTMENUPAGE_REGISTRY_ROOT \"HKCU\" \n  !define MUI_STARTMENUPAGE_REGISTRY_KEY \"Software\\Modern UI Test\" \n  !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME \"Start Menu Folder\"\n  \n  !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder\n  \n  !insertmacro MUI_PAGE_INSTFILES\n  \n  !insertmacro MUI_UNPAGE_CONFIRM\n  !insertmacro MUI_UNPAGE_INSTFILES\n\n;--------------------------------\n;Languages\n \n  !insertmacro MUI_LANGUAGE \"English\"\n\n;--------------------------------\n;Installer Sections\n\nSection \"Dummy Section\" SecDummy\n\n  SetOutPath \"$INSTDIR\"\n  \n  ;ADD YOUR OWN FILES HERE...\n  \n  ;Store installation folder\n  WriteRegStr HKCU \"Software\\Modern UI Test\" \"\" $INSTDIR\n  \n  ;Create uninstaller\n  WriteUninstaller \"$INSTDIR\\Uninstall.exe\"\n  \n  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application\n    \n    ;Create shortcuts\n    CreateDirectory \"$SMPROGRAMS\\$StartMenuFolder\"\n    CreateShortCut \"$SMPROGRAMS\\$StartMenuFolder\\Uninstall.lnk\" \"$INSTDIR\\Uninstall.exe\"\n  \n  !insertmacro MUI_STARTMENU_WRITE_END\n\nSectionEnd\n\n;--------------------------------\n;Descriptions\n\n  ;Language strings\n  LangString DESC_SecDummy ${LANG_ENGLISH} \"A test section.\"\n\n  ;Assign language strings to sections\n  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN\n    !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy)\n  !insertmacro MUI_FUNCTION_DESCRIPTION_END\n \n;--------------------------------\n;Uninstaller Section\n\nSection \"Uninstall\"\n\n  ;ADD YOUR OWN FILES HERE...\n\n  Delete \"$INSTDIR\\Uninstall.exe\"\n\n  RMDir \"$INSTDIR\"\n  \n  !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder\n    \n  Delete \"$SMPROGRAMS\\$StartMenuFolder\\Uninstall.lnk\"\n  RMDir \"$SMPROGRAMS\\$StartMenuFolder\"\n  \n  DeleteRegKey /ifempty HKCU \"Software\\Modern UI Test\"\n\nSectionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Modern UI/WelcomeFinish.nsi",
    "content": ";NSIS Modern User Interface\n;Welcome/Finish Page Example Script\n;Written by Joost Verburg\n\n;--------------------------------\n;Include Modern UI\n\n  !include \"MUI2.nsh\"\n\n;--------------------------------\n;General\n\n  ;Name and file\n  Name \"Modern UI Test\"\n  OutFile \"WelcomeFinish.exe\"\n\n  ;Default installation folder\n  InstallDir \"$LOCALAPPDATA\\Modern UI Test\"\n\n  ;Get installation folder from registry if available\n  InstallDirRegKey HKCU \"Software\\Modern UI Test\" \"\"\n\n  ;Request application privileges for Windows Vista\n  RequestExecutionLevel user\n\n;--------------------------------\n;Interface Settings\n\n  !define MUI_ABORTWARNING\n\n;--------------------------------\n;Pages\n\n  !insertmacro MUI_PAGE_WELCOME\n  !insertmacro MUI_PAGE_LICENSE \"${NSISDIR}\\Docs\\Modern UI\\License.txt\"\n  !insertmacro MUI_PAGE_COMPONENTS\n  !insertmacro MUI_PAGE_DIRECTORY\n  !insertmacro MUI_PAGE_INSTFILES\n  !insertmacro MUI_PAGE_FINISH\n\n  !insertmacro MUI_UNPAGE_WELCOME\n  !insertmacro MUI_UNPAGE_CONFIRM\n  !insertmacro MUI_UNPAGE_INSTFILES\n  !insertmacro MUI_UNPAGE_FINISH\n\n;--------------------------------\n;Languages\n\n  !insertmacro MUI_LANGUAGE \"English\"\n\n;--------------------------------\n;Installer Sections\n\nSection \"Dummy Section\" SecDummy\n\n  SetOutPath \"$INSTDIR\"\n\n  ;ADD YOUR OWN FILES HERE...\n\n  ;Store installation folder\n  WriteRegStr HKCU \"Software\\Modern UI Test\" \"\" $INSTDIR\n\n  ;Create uninstaller\n  WriteUninstaller \"$INSTDIR\\Uninstall.exe\"\n\nSectionEnd\n\n;--------------------------------\n;Descriptions\n\n  ;Language strings\n  LangString DESC_SecDummy ${LANG_ENGLISH} \"A test section.\"\n\n  ;Assign language strings to sections\n  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN\n    !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy)\n  !insertmacro MUI_FUNCTION_DESCRIPTION_END\n\n;--------------------------------\n;Uninstaller Section\n\nSection \"Uninstall\"\n\n  ;ADD YOUR OWN FILES HERE...\n\n  Delete \"$INSTDIR\\Uninstall.exe\"\n\n  RMDir \"$INSTDIR\"\n\n  DeleteRegKey /ifempty HKCU \"Software\\Modern UI Test\"\n\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Plugin/exdll-vs2008.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 10.00\n# Visual Studio 2008\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"exdll\", \"exdll.vcproj\", \"{5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Win32 = Debug|Win32\n\t\tRelease|Win32 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Release|Win32.Build.0 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Plugin/exdll-vs2008.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\n<VisualStudioProject\n\tProjectType=\"Visual C++\"\n\tVersion=\"9,00\"\n\tName=\"exdll\"\n\tProjectGUID=\"{5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}\"\n\tRootNamespace=\"exdll\"\n\tTargetFrameworkVersion=\"0\"\n\t>\n\t<Platforms>\n\t\t<Platform\n\t\t\tName=\"Win32\"\n\t\t/>\n\t</Platforms>\n\t<ToolFiles>\n\t</ToolFiles>\n\t<Configurations>\n\t\t<Configuration\n\t\t\tName=\"Release|Win32\"\n\t\t\tOutputDirectory=\".\\Release\"\n\t\t\tIntermediateDirectory=\".\\Release\"\n\t\t\tConfigurationType=\"2\"\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC60.vsprops\"\n\t\t\tUseOfMFC=\"0\"\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\n\t\t\tCharacterSet=\"2\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\n\t\t\t\tMkTypLibCompatible=\"true\"\n\t\t\t\tSuppressStartupBanner=\"true\"\n\t\t\t\tTargetEnvironment=\"1\"\n\t\t\t\tTypeLibraryName=\".\\Release/exdll.tlb\"\n\t\t\t\tHeaderFileName=\"\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tOptimization=\"1\"\n\t\t\t\tInlineFunctionExpansion=\"0\"\n\t\t\t\tAdditionalIncludeDirectories=\".\"\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG;WIN32;_WINDOWS;_USRDLL;EXDLL_EXPORTS;NSISCALL=__stdcall\"\n\t\t\t\tStringPooling=\"true\"\n\t\t\t\tRuntimeLibrary=\"2\"\n\t\t\t\tBufferSecurityCheck=\"false\"\n\t\t\t\tEnableFunctionLevelLinking=\"true\"\n\t\t\t\tPrecompiledHeaderFile=\".\\Release/exdll.pch\"\n\t\t\t\tAssemblerListingLocation=\".\\Release/\"\n\t\t\t\tObjectFile=\".\\Release/\"\n\t\t\t\tProgramDataBaseFileName=\".\\Release/\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tSuppressStartupBanner=\"true\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\n\t\t\t\tCulture=\"1033\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLinkerTool\"\n\t\t\t\tAdditionalDependencies=\"odbc32.lib odbccp32.lib nsis\\pluginapi.lib\"\n\t\t\t\tOutputFile=\".\\Release/exdll.dll\"\n\t\t\t\tLinkIncremental=\"1\"\n\t\t\t\tSuppressStartupBanner=\"true\"\n\t\t\t\tIgnoreAllDefaultLibraries=\"true\"\n\t\t\t\tIgnoreDefaultLibraryNames=\"libc.lib\"\n\t\t\t\tProgramDatabaseFile=\".\\Release/exdll.pdb\"\n\t\t\t\tOptimizeForWindows98=\"1\"\n\t\t\t\tEntryPointSymbol=\"DllMain\"\n\t\t\t\tRandomizedBaseAddress=\"1\"\n\t\t\t\tDataExecutionPrevention=\"0\"\n\t\t\t\tImportLibrary=\".\\Release/exdll.lib\"\n\t\t\t\tTargetMachine=\"1\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManifestTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t\tSuppressStartupBanner=\"true\"\n\t\t\t\tOutputFile=\".\\Release/exdll.bsc\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCAppVerifierTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t\t<Configuration\n\t\t\tName=\"Debug|Win32\"\n\t\t\tOutputDirectory=\".\\Debug\"\n\t\t\tIntermediateDirectory=\".\\Debug\"\n\t\t\tConfigurationType=\"2\"\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC60.vsprops\"\n\t\t\tUseOfMFC=\"0\"\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\n\t\t\tCharacterSet=\"2\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\n\t\t\t\tMkTypLibCompatible=\"true\"\n\t\t\t\tSuppressStartupBanner=\"true\"\n\t\t\t\tTargetEnvironment=\"1\"\n\t\t\t\tTypeLibraryName=\".\\Debug/exdll.tlb\"\n\t\t\t\tHeaderFileName=\"\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tOptimization=\"0\"\n\t\t\t\tAdditionalIncludeDirectories=\".\"\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG;WIN32;_WINDOWS;_USRDLL;EXDLL_EXPORTS;NSISCALL=__stdcall\"\n\t\t\t\tMinimalRebuild=\"true\"\n\t\t\t\tBasicRuntimeChecks=\"0\"\n\t\t\t\tRuntimeLibrary=\"3\"\n\t\t\t\tBufferSecurityCheck=\"false\"\n\t\t\t\tPrecompiledHeaderFile=\".\\Debug/exdll.pch\"\n\t\t\t\tAssemblerListingLocation=\".\\Debug/\"\n\t\t\t\tObjectFile=\".\\Debug/\"\n\t\t\t\tProgramDataBaseFileName=\".\\Debug/\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tSuppressStartupBanner=\"true\"\n\t\t\t\tDebugInformationFormat=\"4\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\n\t\t\t\tCulture=\"1033\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLinkerTool\"\n\t\t\t\tAdditionalDependencies=\"odbc32.lib odbccp32.lib nsis\\pluginapi.lib\"\n\t\t\t\tOutputFile=\".\\Debug/exdll.dll\"\n\t\t\t\tLinkIncremental=\"2\"\n\t\t\t\tSuppressStartupBanner=\"true\"\n\t\t\t\tIgnoreAllDefaultLibraries=\"true\"\n\t\t\t\tIgnoreDefaultLibraryNames=\"\"\n\t\t\t\tGenerateDebugInformation=\"true\"\n\t\t\t\tProgramDatabaseFile=\".\\Debug/exdll.pdb\"\n\t\t\t\tEntryPointSymbol=\"DllMain\"\n\t\t\t\tRandomizedBaseAddress=\"1\"\n\t\t\t\tDataExecutionPrevention=\"0\"\n\t\t\t\tImportLibrary=\".\\Debug/exdll.lib\"\n\t\t\t\tTargetMachine=\"1\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManifestTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t\tSuppressStartupBanner=\"true\"\n\t\t\t\tOutputFile=\".\\Debug/exdll.bsc\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCAppVerifierTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t</Configurations>\n\t<References>\n\t</References>\n\t<Files>\n\t\t<Filter\n\t\t\tName=\"Source Files\"\n\t\t\tFilter=\"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"exdll.c\"\n\t\t\t\t>\n\t\t\t\t<FileConfiguration\n\t\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t\t>\n\t\t\t\t\t<Tool\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"\"\n\t\t\t\t\t\tPreprocessorDefinitions=\"\"\n\t\t\t\t\t/>\n\t\t\t\t</FileConfiguration>\n\t\t\t\t<FileConfiguration\n\t\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t\t>\n\t\t\t\t\t<Tool\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"\"\n\t\t\t\t\t\tPreprocessorDefinitions=\"\"\n\t\t\t\t\t/>\n\t\t\t\t</FileConfiguration>\n\t\t\t</File>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Header Files\"\n\t\t\tFilter=\"h;hpp;hxx;hm;inl\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"nsis\\pluginapi.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Resource Files\"\n\t\t\tFilter=\"ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe\"\n\t\t\t>\n\t\t</Filter>\n\t</Files>\n\t<Globals>\n\t</Globals>\n</VisualStudioProject>\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Plugin/exdll.c",
    "content": "#include <windows.h>\n#include <nsis/pluginapi.h> // nsis plugin\n\nHINSTANCE g_hInstance;\n\nHWND g_hwndParent;\n\nvoid __declspec(dllexport) myFunction(HWND hwndParent, int string_size, \n                                      char *variables, stack_t **stacktop,\n                                      extra_parameters *extra)\n{\n  g_hwndParent=hwndParent;\n\n  EXDLL_INIT();\n\n\n  // note if you want parameters from the stack, pop them off in order.\n  // i.e. if you are called via exdll::myFunction file.dat poop.dat\n  // calling popstring() the first time would give you file.dat,\n  // and the second time would give you poop.dat. \n  // you should empty the stack of your parameters, and ONLY your\n  // parameters.\n\n  // do your stuff here\n  {\n    char buf[1024];\n    wsprintf(buf,\"$0=%s\\n\",getuservariable(INST_0));\n    MessageBox(g_hwndParent,buf,0,MB_OK);\n  }\n}\n\n\n\nBOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)\n{\n  g_hInstance=hInst;\n\treturn TRUE;\n}\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Plugin/exdll.dpr",
    "content": "{\n  NSIS ExDLL example\n  (C) 2001 - Peter Windridge\n\n  Fixed and formatted by Brett Dever\n  http://editor.nfscheats.com/\n\n  Tested in Delphi 7.0\n}\n\nlibrary exdll;\n\nuses Windows;\n\ntype\n  VarConstants = (\n    INST_0,\n    INST_1,       // $1\n    INST_2,       // $2\n    INST_3,       // $3\n    INST_4,       // $4\n    INST_5,       // $5\n    INST_6,       // $6\n    INST_7,       // $7\n    INST_8,       // $8\n    INST_9,       // $9\n    INST_R0,      // $R0\n    INST_R1,      // $R1\n    INST_R2,      // $R2\n    INST_R3,      // $R3\n    INST_R4,      // $R4\n    INST_R5,      // $R5\n    INST_R6,      // $R6\n    INST_R7,      // $R7\n    INST_R8,      // $R8\n    INST_R9,      // $R9\n    INST_CMDLINE, // $CMDLINE\n    INST_INSTDIR, // $INSTDIR\n    INST_OUTDIR,  // $OUTDIR\n    INST_EXEDIR,  // $EXEDIR\n    INST_LANG,    // $LANGUAGE\n    __INST_LAST\n    );\n  TVariableList = INST_0..__INST_LAST;\n  pstack_t = ^stack_t;\n  stack_t = record\n    next: pstack_t;\n    text: PChar;\n  end;\n\nvar\n  g_stringsize: integer;\n  g_stacktop: ^pstack_t;\n  g_variables: PChar;\n  g_hwndParent: HWND;\n\nfunction PopString(): string;\nvar\n  th: pstack_t;\nbegin\n  if integer(g_stacktop^) <> 0 then begin\n    th := g_stacktop^;\n    Result := PChar(@th.text);\n    g_stacktop^ := th.next;\n    GlobalFree(HGLOBAL(th));\n  end;\nend;\n\nprocedure PushString(const str: string='');\nvar\n  th: pstack_t;\nbegin\n  if integer(g_stacktop) <> 0 then begin\n    th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize));\n    lstrcpyn(@th.text, PChar(str), g_stringsize);\n    th.next := g_stacktop^;\n    g_stacktop^ := th;\n  end;\nend;\n\nfunction GetUserVariable(const varnum: TVariableList): string;\nbegin\n  if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then\n    Result := g_variables + integer(varnum) * g_stringsize\n  else\n    Result := '';\nend;\n\nprocedure SetUserVariable(const varnum: TVariableList; const value: string);\nbegin\n  if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then\n    lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value))\nend;\n\nprocedure NSISDialog(const text, caption: string; const buttons: integer);\nbegin\n  MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons);\nend;\n\nprocedure ex_dll(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;\nbegin\n  // setup global variables\n  g_stringsize := string_size;\n  g_hwndParent := hwndParent;\n  g_stacktop := stacktop;\n  g_variables := variables;\n  // end global variable setup\n\n  NSISDialog(GetUserVariable(INST_0), 'The value of $0', MB_OK);\n  NSISDialog(PopString, 'pop', MB_OK);\n  PushString('Hello, this is a push');\n  SetUserVariable(INST_0, 'This is user var $0');\nend;\n\nexports ex_dll;\n\nbegin\nend.\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Plugin/exdll.dsp",
    "content": "# Microsoft Developer Studio Project File - Name=\"exdll\" - Package Owner=<4>\n# Microsoft Developer Studio Generated Build File, Format Version 6.00\n# ** DO NOT EDIT **\n\n# TARGTYPE \"Win32 (x86) Dynamic-Link Library\" 0x0102\n\nCFG=exdll - Win32 Debug\n!MESSAGE This is not a valid makefile. To build this project using NMAKE,\n!MESSAGE use the Export Makefile command and run\n!MESSAGE \n!MESSAGE NMAKE /f \"exdll.mak\".\n!MESSAGE \n!MESSAGE You can specify a configuration when running NMAKE\n!MESSAGE by defining the macro CFG on the command line. For example:\n!MESSAGE \n!MESSAGE NMAKE /f \"exdll.mak\" CFG=\"exdll - Win32 Debug\"\n!MESSAGE \n!MESSAGE Possible choices for configuration are:\n!MESSAGE \n!MESSAGE \"exdll - Win32 Release\" (based on \"Win32 (x86) Dynamic-Link Library\")\n!MESSAGE \"exdll - Win32 Debug\" (based on \"Win32 (x86) Dynamic-Link Library\")\n!MESSAGE \n\n# Begin Project\n# PROP AllowPerConfigDependencies 0\n# PROP Scc_ProjName \"\"\n# PROP Scc_LocalPath \"\"\nCPP=cl.exe\nMTL=midl.exe\nRSC=rc.exe\n\n!IF  \"$(CFG)\" == \"exdll - Win32 Release\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"Release\"\n# PROP BASE Intermediate_Dir \"Release\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"Release\"\n# PROP Intermediate_Dir \"Release\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /D \"_USRDLL\" /D \"EXDLL_EXPORTS\" /YX /FD /c\n# ADD CPP /nologo /MT /W3 /GX /O1 /I \".\" /D \"NDEBUG\" /D \"WIN32\" /D \"_WINDOWS\" /D \"_MBCS\" /D \"_USRDLL\" /D \"EXDLL_EXPORTS\" /D NSISCALL=__stdcall /YX /FD /c\n# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\n# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n# ADD RSC /l 0x409 /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib nsis\\pluginapi.lib /nologo /entry:\"DllMain\" /dll /machine:I386 /nodefaultlib /out:\"../../Plugins/exdll.dll\" /opt:nowin98\n# SUBTRACT LINK32 /pdb:none\n\n!ELSEIF  \"$(CFG)\" == \"exdll - Win32 Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 1\n# PROP BASE Output_Dir \"Debug\"\n# PROP BASE Intermediate_Dir \"Debug\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"Debug\"\n# PROP Intermediate_Dir \"Debug\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /D \"_USRDLL\" /D \"EXDLL_EXPORTS\" /YX /FD /GZ /c\n# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I \".\" /D \"_DEBUG\" /D \"WIN32\" /D \"_WINDOWS\" /D \"_MBCS\" /D \"_USRDLL\" /D \"EXDLL_EXPORTS\" /D NSISCALL=__stdcall /YX /FD /GZ /c\n# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\n# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\n# ADD RSC /l 0x409 /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib nsis\\pluginapi.lib /nologo /dll /debug /machine:I386 /pdbtype:sept\n\n!ENDIF \n\n# Begin Target\n\n# Name \"exdll - Win32 Release\"\n# Name \"exdll - Win32 Debug\"\n# Begin Group \"Source Files\"\n\n# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\n# Begin Source File\n\nSOURCE=.\\exdll.c\n# End Source File\n# End Group\n# Begin Group \"Header Files\"\n\n# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\n# Begin Source File\n\nSOURCE=.\\nsis\\pluginapi.h\n# End Source File\n# End Group\n# Begin Group \"Resource Files\"\n\n# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe\"\n# End Group\n# End Target\n# End Project\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Plugin/exdll.dsw",
    "content": "Microsoft Developer Studio Workspace File, Format Version 6.00\n# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\n\n###############################################################################\n\nProject: \"exdll\"=.\\exdll.dsp - Package Owner=<4>\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<4>\n{{{\n}}}\n\n###############################################################################\n\nGlobal:\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<3>\n{{{\n}}}\n\n###############################################################################\n\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Plugin/exdll_with_unit.dpr",
    "content": "{\n  NSIS ExDLL2 example\n  Original is ExDLL\n  (C) 2001 - Peter Windridge\n\n  Changed with delphi unit nsis.pas\n  by bernhard mayer\n\n  Tested in Delphi 7.0\n}\n\nlibrary exdll;\n\nuses\n  nsis, windows;\n\nprocedure ex_dll(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;\nbegin\n  // set up global variables\n  Init(hwndParent, string_size, variables, stacktop);\n\n  NSISDialog(GetUserVariable(INST_0), 'The value of $0', MB_OK);\n  NSISDialog(PopString, 'pop', MB_OK);\n  PushString('Hello, this is a push');\n  SetUserVariable(INST_0, 'This is user var $0');\nend;\n\nexports ex_dll;\n\nbegin\nend.\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Plugin/extdll.inc",
    "content": ";################################################################\n; ExtDLL header for MASM32\n;\n; Author: Ramon\n;\n; Obs: This header must be included after windows.inc and kernel32.inc\n;      because it need the prototypes for lstrcpy, lstrcpyn, \n;      GlobalAlloc and GlobalFree\n;\n;################################################################\nstack_t struct\n  next dd ?\n  text dd ? ; 1 DUP(?) ; this should be the length of string_size\nstack_t ends\n\n.const\n; For page showing plug-ins\nWM_NOTIFY_OUTER_NEXT   equ (WM_USER+0x8)\nWM_NOTIFY_CUSTOM_READY equ (WM_USER+0xd)\nNOTIFY_BYE_BYE         equ 'x'\n\nINST_0 EQU 0         ; $0\nINST_1 EQU 1         ; $1\nINST_2 EQU 2         ; $2\nINST_3 EQU 3         ; $3\nINST_4 EQU 4         ; $4\nINST_5 EQU 5         ; $5\nINST_6 EQU 6         ; $6\nINST_7 EQU 7         ; $7\nINST_8 EQU 8         ; $8\nINST_9 EQU 9         ; $9\nINST_R0 EQU 10        ; $R0\nINST_R1 EQU 11        ; $R1\nINST_R2 EQU 12        ; $R2\nINST_R3 EQU 13        ; $R3\nINST_R4 EQU 14        ; $R4\nINST_R5 EQU 15        ; $R5\nINST_R6 EQU 16        ; $R6\nINST_R7 EQU 17        ; $R7\nINST_R8 EQU 18        ; $R8\nINST_R9 EQU 19        ; $R9\nINST_CMDLINE EQU 20   ; $CMDLINE\nINST_INSTDIR EQU 21   ; $INSTDIR\nINST_OUTDIR EQU 22    ; $OUTDIR\nINST_EXEDIR EQU 23    ; $EXEDIR\nINST_LANG EQU 24      ; $LANGUAGE\n__INST_LAST EQU 25\n\n.data?\ng_stringsize dd ?\ng_stacktop dd ?\ng_variables dd ?\n\nm2m MACRO M1, M2\n      push M2\n      pop  M1\nENDM\n\nEXDLL_INIT MACRO\n      m2m g_stringsize, string_size\n      m2m g_stacktop, stacktop\n      m2m g_variables, variables\nENDM\n\n.code\n\n; utility functions (not required but often useful)\npopstring proc uses edi pStr:DWORD\n\n  LOCAL th:DWORD\n\n  mov edi, g_stacktop\n  cmp edi, 0\n  jz  STACK_ERR\n  mov edi, [edi]\n  cmp edi, 0\n  jz  STACK_ERR\n\n  ASSUME edi:PTR stack_t\n  invoke lstrcpy, pStr, ADDR [edi].text\n  mov th , edi\n  mov edi, [edi].next\n  mov eax, g_stacktop\n  mov [eax], edi\n  invoke GlobalFree, th\n  ASSUME edi:PTR NOTHING\n  mov eax, 0\n  ret\n  \nSTACK_ERR:\n  mov eax, 1\n  ret\n\npopstring endp\n\npushstring proc uses edi pStr:DWORD\n\n  cmp g_stacktop, 0\n  jz  STACK_ERR\n\n  mov eax, sizeof stack_t\n  add eax, g_stringsize\n  invoke GlobalAlloc, GPTR, eax\n\n  mov edi, eax\n  assume edi:PTR stack_t\n\n  invoke lstrcpyn, ADDR [edi].text, pStr, g_stringsize\n  mov eax, g_stacktop\n  push DWORD PTR[eax]\n  mov [eax], edi\n  pop eax\n  ;lea edi, [edi].next ; Not needed [edi].next == edi\n  mov DWORD PTR[edi], eax\n  ASSUME edi:PTR NOTHING\n\nSTACK_ERR:\n  ret\n\npushstring endp\n\ngetuservariable proc varnum:DWORD\n\n  .if varnum < 0 || varnum >= __INST_LAST\n    xor eax, eax\n  .else\n    mov eax, varnum\n    imul eax, g_stringsize\n    add eax, g_variables\n  .endif\n  ret\n\ngetuservariable endp\n\nsetuservariable proc varnum:DWORD, var:DWORD\n\n  .if (var != NULL && varnum >= 0 && varnum < __INST_LAST)\n    mov eax, varnum\n    imul eax, g_stringsize\n    add eax, g_variables\n    invoke lstrcpy, eax, var\n  .endif\n  ret\n\nsetuservariable endp\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Plugin/nsis/api.h",
    "content": "/*\n * apih\n * \n * This file is a part of NSIS.\n * \n * Copyright (C) 1999-2009 Nullsoft and Contributors\n * \n * Licensed under the zlib/libpng license (the \"License\");\n * you may not use this file except in compliance with the License.\n * \n * Licence details can be found in the file COPYING.\n * \n * This software is provided 'as-is', without any express or implied\n * warranty.\n */\n\n#ifndef _NSIS_EXEHEAD_API_H_\n#define _NSIS_EXEHEAD_API_H_\n\n// Starting with NSIS 2.42, you can check the version of the plugin API in exec_flags->plugin_api_version\n// The format is 0xXXXXYYYY where X is the major version and Y is the minor version (MAKELONG(y,x))\n// When doing version checks, always remember to use >=, ex: if (pX->exec_flags->plugin_api_version >= NSISPIAPIVER_1_0) {}\n\n#define NSISPIAPIVER_1_0 0x00010000\n#define NSISPIAPIVER_CURR NSISPIAPIVER_1_0\n\n// NSIS Plug-In Callback Messages\nenum NSPIM \n{\n\tNSPIM_UNLOAD,    // This is the last message a plugin gets, do final cleanup\n\tNSPIM_GUIUNLOAD, // Called after .onGUIEnd\n};\n\n// Prototype for callbacks registered with extra_parameters->RegisterPluginCallback()\n// Return NULL for unknown messages\n// Should always be __cdecl for future expansion possibilities\ntypedef UINT_PTR (*NSISPLUGINCALLBACK)(enum NSPIM);\n\n// extra_parameters data structures containing other interesting stuff\n// but the stack, variables and HWND passed on to plug-ins.\ntypedef struct\n{\n  int autoclose;\n  int all_user_var;\n  int exec_error;\n  int abort;\n  int exec_reboot; // NSIS_SUPPORT_REBOOT\n  int reboot_called; // NSIS_SUPPORT_REBOOT\n  int XXX_cur_insttype; // depreacted\n  int plugin_api_version; // see NSISPIAPIVER_CURR\n                          // used to be XXX_insttype_changed\n  int silent; // NSIS_CONFIG_SILENT_SUPPORT\n  int instdir_error;\n  int rtl;\n  int errlvl;\n  int alter_reg_view;\n  int status_update;\n} exec_flags_t;\n\n#ifndef NSISCALL\n#  define NSISCALL __stdcall\n#endif\n\ntypedef struct {\n  exec_flags_t *exec_flags;\n  int (NSISCALL *ExecuteCodeSegment)(int, HWND);\n  void (NSISCALL *validate_filename)(char *);\n  int (NSISCALL *RegisterPluginCallback)(HMODULE, NSISPLUGINCALLBACK); // returns 0 on success, 1 if already registered and < 0 on errors\n} extra_parameters;\n\n// Definitions for page showing plug-ins\n// See Ui.c to understand better how they're used\n\n// sent to the outer window to tell it to go to the next inner window\n#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8)\n\n// custom pages should send this message to let NSIS know they're ready\n#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd)\n\n// sent as wParam with WM_NOTIFY_OUTER_NEXT when user cancels - heed its warning\n#define NOTIFY_BYE_BYE 'x'\n\n#endif /* _PLUGIN_H_ */\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Plugin/nsis/pluginapi.h",
    "content": "#ifndef ___NSIS_PLUGIN__H___\n#define ___NSIS_PLUGIN__H___\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"api.h\"\n\n#ifndef NSISCALL\n#  define NSISCALL __stdcall\n#endif\n\n#define EXDLL_INIT()           {  \\\n        g_stringsize=string_size; \\\n        g_stacktop=stacktop;      \\\n        g_variables=variables; }\n\ntypedef struct _stack_t {\n  struct _stack_t *next;\n  char text[1]; // this should be the length of string_size\n} stack_t;\n\nenum\n{\nINST_0,         // $0\nINST_1,         // $1\nINST_2,         // $2\nINST_3,         // $3\nINST_4,         // $4\nINST_5,         // $5\nINST_6,         // $6\nINST_7,         // $7\nINST_8,         // $8\nINST_9,         // $9\nINST_R0,        // $R0\nINST_R1,        // $R1\nINST_R2,        // $R2\nINST_R3,        // $R3\nINST_R4,        // $R4\nINST_R5,        // $R5\nINST_R6,        // $R6\nINST_R7,        // $R7\nINST_R8,        // $R8\nINST_R9,        // $R9\nINST_CMDLINE,   // $CMDLINE\nINST_INSTDIR,   // $INSTDIR\nINST_OUTDIR,    // $OUTDIR\nINST_EXEDIR,    // $EXEDIR\nINST_LANG,      // $LANGUAGE\n__INST_LAST\n};\n\nextern unsigned int g_stringsize;\nextern stack_t **g_stacktop;\nextern char *g_variables;\n\nint NSISCALL popstring(char *str); // 0 on success, 1 on empty stack\nint NSISCALL popstringn(char *str, int maxlen); // with length limit, pass 0 for g_stringsize\nint NSISCALL popint(); // pops an integer\nint NSISCALL popint_or(); // with support for or'ing (2|4|8)\nint NSISCALL myatoi(const char *s); // converts a string to an integer\nunsigned NSISCALL myatou(const char *s); // converts a string to an unsigned integer, decimal only\nint NSISCALL myatoi_or(const char *s); // with support for or'ing (2|4|8)\nvoid NSISCALL pushstring(const char *str);\nvoid NSISCALL pushint(int value);\nchar * NSISCALL getuservariable(const int varnum);\nvoid NSISCALL setuservariable(const int varnum, const char *var);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif//!___NSIS_PLUGIN__H___\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Plugin/nsis.pas",
    "content": "{\n    Original Code from\n    (C) 2001 - Peter Windridge\n\n    Code in seperate unit and some changes\n    2003 by Bernhard Mayer\n\n    Fixed and formatted by Brett Dever\n    http://editor.nfscheats.com/\n\n    simply include this unit in your plugin project and export\n    functions as needed\n}\n\nunit nsis;\n\ninterface\n\nuses\n  windows, CommCtrl, SysUtils;\n\ntype\n  VarConstants = (\n    INST_0,       // $0\n    INST_1,       // $1\n    INST_2,       // $2\n    INST_3,       // $3\n    INST_4,       // $4\n    INST_5,       // $5\n    INST_6,       // $6\n    INST_7,       // $7\n    INST_8,       // $8\n    INST_9,       // $9\n    INST_R0,      // $R0\n    INST_R1,      // $R1\n    INST_R2,      // $R2\n    INST_R3,      // $R3\n    INST_R4,      // $R4\n    INST_R5,      // $R5\n    INST_R6,      // $R6\n    INST_R7,      // $R7\n    INST_R8,      // $R8\n    INST_R9,      // $R9\n    INST_CMDLINE, // $CMDLINE\n    INST_INSTDIR, // $INSTDIR\n    INST_OUTDIR,  // $OUTDIR\n    INST_EXEDIR,  // $EXEDIR\n    INST_LANG,    // $LANGUAGE\n    __INST_LAST\n    );\n  TVariableList = INST_0..__INST_LAST;\n\n  TExecuteCodeSegment = function (const funct_id: Integer; const parent: HWND): Integer;  stdcall;\n  Tvalidate_filename = procedure (const filename: PChar); cdecl;\n  TRegisterPluginCallback = function (const unknow: Integer; const uknown2: Integer): Integer; cdecl;\n\n  pexec_flags_t = ^exec_flags_t;\n  exec_flags_t = record\n    autoclose: Integer;\n    all_user_var: Integer;\n    exec_error: Integer;\n    abort: Integer;\n    exec_reboot: Integer;\n    reboot_called: Integer;\n    XXX_cur_insttype: Integer;\n    plugin_api_version: Integer;\n    silent: Integer;\n    instdir_error: Integer;\n    rtl: Integer;\n    errlvl: Integer;\n    alter_reg_view: Integer;\n    status_update: Integer;\n  end;\n\n  pextrap_t = ^extrap_t;\n  extrap_t = record\n    exec_flags: Pointer; // exec_flags_t;\n    exec_code_segment: Pointer; //  TFarProc;\n    validate_filename: Pointer; // Tvalidate_filename;\n    RegisterPluginCallback: Pointer; //TRegisterPluginCallback;\n  end;\n\n  pstack_t = ^stack_t;\n  stack_t = record\n    next: pstack_t;\n    text: PChar;\n  end;\n\nvar\n  g_stringsize: integer;\n  g_stacktop: ^pstack_t;\n  g_variables: PChar;\n  g_hwndParent: HWND;\n  g_hwndList: HWND;\n  g_hwndLogList: HWND;\n\n  g_extraparameters: pextrap_t;\n  func : TExecuteCodeSegment;\n  extrap : extrap_t;\n\nprocedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer; const extraparameters: pointer = nil);\n\nfunction LogMessage(Msg : String): BOOL;\nfunction Call(NSIS_func : String) : Integer;\nfunction PopString(): string;\nprocedure PushString(const str: string='');\nfunction GetUserVariable(const varnum: TVariableList): string;\nprocedure SetUserVariable(const varnum: TVariableList; const value: string);\nprocedure NSISDialog(const text, caption: string; const buttons: integer);\n\nimplementation\n\nprocedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer; const extraparameters: pointer = nil);\nbegin\n  g_stringsize := string_size;\n  g_hwndParent := hwndParent;\n  g_stacktop   := stacktop;\n  g_variables  := variables;\n  g_hwndList := 0;\n  g_hwndList := FindWindowEx(FindWindowEx(g_hwndParent, 0, '#32770', nil), 0,'SysListView32', nil);\n  g_extraparameters := extraparameters;\n  extrap := g_extraparameters^;\nend;\n\nfunction Call(NSIS_func : String) : Integer;\nvar\n  NSISFun: Integer; //The ID of nsis function\nbegin\n  Result := 0;\n  NSISFun := StrToIntDef(NSIS_func, 0);\n  if (NSISFun <> 0) and (g_extraparameters <> nil) then\n    begin\n    @func := extrap.exec_code_segment;\n    NSISFun := NSISFun - 1;\n    Result := func(NSISFun, g_hwndParent);\n    end;\nend;\n\nfunction LogMessage(Msg : String): BOOL;\nvar\n  ItemCount : Integer;\n  item: TLVItem;\nbegin\n  Result := FAlse;\n  if g_hwndList = 0 then exit;\n  FillChar( item, sizeof(item), 0 );\n  ItemCount := SendMessage(g_hwndList, LVM_GETITEMCOUNT, 0, 0);\n  item.iItem := ItemCount;\n  item.mask := LVIF_TEXT;\n  item.pszText := PAnsiChar(Msg);\n  ListView_InsertItem(g_hwndList, item );\n  ListView_EnsureVisible(g_hwndList, ItemCount, TRUE);\nend;\n\nfunction PopString(): string;\nvar\n  th: pstack_t;\nbegin\n  if integer(g_stacktop^) <> 0 then begin\n    th := g_stacktop^;\n    Result := PChar(@th.text);\n    g_stacktop^ := th.next;\n    GlobalFree(HGLOBAL(th));\n  end;\nend;\n\nprocedure PushString(const str: string='');\nvar\n  th: pstack_t;\nbegin\n  if integer(g_stacktop) <> 0 then begin\n    th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize));\n    lstrcpyn(@th.text, PChar(str), g_stringsize);\n    th.next := g_stacktop^;\n    g_stacktop^ := th;\n  end;\nend;\n\nfunction GetUserVariable(const varnum: TVariableList): string;\nbegin\n  if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then\n    Result := g_variables + integer(varnum) * g_stringsize\n  else\n    Result := '';\nend;\n\nprocedure SetUserVariable(const varnum: TVariableList; const value: string);\nbegin\n  if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then\n    lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value))\nend;\n\nprocedure NSISDialog(const text, caption: string; const buttons: integer);\nbegin\n  MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons);\nend;\n\nbegin\n\nend.\n\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/Splash/Example.nsi",
    "content": "Name \"Splash.dll test\"\n\nOutFile \"Splash Test.exe\"\n\nXPStyle on\n\nFunction .onInit\n\t# the plugins dir is automatically deleted when the installer exits\n\tInitPluginsDir\n\tFile /oname=$PLUGINSDIR\\splash.bmp \"${NSISDIR}\\Contrib\\Graphics\\Wizard\\orange-nsis.bmp\"\n\t#optional\n\t#File /oname=$PLUGINSDIR\\splash.wav \"C:\\myprog\\sound.wav\"\n\n\tsplash::show 1000 $PLUGINSDIR\\splash\n\n\tPop $0 ; $0 has '1' if the user closed the splash screen early,\n\t\t\t; '0' if everything closed normally, and '-1' if some error occurred.\nFunctionEnd\n\nSection\nSectionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/StartMenu/Example.nsi",
    "content": "Name \"StartMenu.dll test\"\n\nOutFile \"StartMenu Test.exe\"\n\nXPStyle on\n\nPage directory\nDirText \"This installer will create some shortcuts to MakeNSIS in the start menu.$\\nFor this it needs NSIS's path.\" \\\n  \"Please specify the path in which you have installed NSIS:\"\nInstallDir \"${NSISDIR}\"\nFunction .onVerifyInstDir\n\tIfFileExists $INSTDIR\\makensis.exe +2\n\t\tAbort\nFunctionEnd\n\nPage custom StartMenuGroupSelect \"\" \": Start Menu Folder\"\nFunction StartMenuGroupSelect\n\tPush $R1\n\n\tStartMenu::Select /checknoshortcuts \"Don't create a start menu folder\" /autoadd /lastused $R0 \"StartMenu.dll test\"\n\tPop $R1\n\n\tStrCmp $R1 \"success\" success\n\tStrCmp $R1 \"cancel\" done\n\t\t; error\n\t\tMessageBox MB_OK $R1\n\t\tStrCpy $R0 \"StartMenu.dll test\" # use default\n\t\tReturn\n\tsuccess:\n\tPop $R0\n\n\tdone:\n\tPop $R1\nFunctionEnd\n\nPage instfiles\nSection\n\t# this part is only necessary if you used /checknoshortcuts\n\tStrCpy $R1 $R0 1\n\tStrCmp $R1 \">\" skip\n\n\t\tCreateDirectory $SMPROGRAMS\\$R0\n\t\tCreateShortCut $SMPROGRAMS\\$R0\\MakeNSISw.lnk $INSTDIR\\makensisw.exe\n\n\t\tSetShellVarContext All\n\t\tCreateDirectory $SMPROGRAMS\\$R0\n\t\tCreateShortCut \"$SMPROGRAMS\\$R0\\All users MakeNSISw.lnk\" $INSTDIR\\makensisw.exe\n\n\tskip:\nSectionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/StrFunc.nsi",
    "content": "Name \"NSIS StrFunc Example\"\nOutFile \"StrFunc.exe\"\nShowInstDetails show\nShowUninstDetails show\nXPStyle on\nRequestExecutionLevel user\n\n!include \"StrFunc.nsh\"\n\n# Declare used functions\n${StrCase}\n${StrClb}\n${StrIOToNSIS}\n${StrLoc}\n${StrNSISToIO}\n${StrRep}\n${StrStr}\n${StrStrAdv}\n${StrTok}\n${StrTrimNewLines}\n${StrSort}\n\n${UnStrCase}\n${UnStrClb}\n${UnStrIOToNSIS}\n${UnStrLoc}\n${UnStrNSISToIO}\n${UnStrRep}\n${UnStrStr}\n${UnStrStrAdv}\n${UnStrTok}\n${UnStrTrimNewLines}\n${UnStrSort}\n\n!macro StackVerificationStart\n  StrCpy $0 S0\n  StrCpy $1 S1\n  StrCpy $2 S2\n  StrCpy $3 S3\n  StrCpy $4 S4\n  StrCpy $5 S5\n  StrCpy $6 S6\n  StrCpy $7 S7\n  StrCpy $8 S8\n  StrCpy $9 S9\n  StrCpy $R0 SR0\n  StrCpy $R1 SR1\n  StrCpy $R2 SR2\n  StrCpy $R3 SR3\n  StrCpy $R4 SR4\n  StrCpy $R5 SR5\n  StrCpy $R6 SR6\n  StrCpy $R7 SR7\n  StrCpy $R8 SR8\n  StrCpy $R9 SR9\n!macroend\n\n!macro StackVerificationEnd\n  ClearErrors\n  ${If} $1 != \"S1\"\n  ${OrIf} $2 != \"S2\"\n  ${OrIf} $3 != \"S3\"\n  ${OrIf} $4 != \"S4\"\n  ${OrIf} $5 != \"S5\"\n  ${OrIf} $6 != \"S6\"\n  ${OrIf} $7 != \"S7\"\n  ${OrIf} $8 != \"S8\"\n  ${OrIf} $9 != \"S9\"\n  ${OrIf} $R0 != \"SR0\"\n  ${OrIf} $R1 != \"SR1\"\n  ${OrIf} $R2 != \"SR2\"\n  ${OrIf} $R3 != \"SR3\"\n  ${OrIf} $R4 != \"SR4\"\n  ${OrIf} $R5 != \"SR5\"\n  ${OrIf} $R6 != \"SR6\"\n  ${OrIf} $R7 != \"SR7\"\n  ${OrIf} $R8 != \"SR8\"\n  ${OrIf} $R9 != \"SR9\"\n    SetErrors\n  ${EndIf}\n!macroend\n\nSection\n\n  # Test case conversion\n  !insertmacro StackVerificationStart\n  ${StrCase} $0 \"This is just an example. A very simple one.\" \"\"\n  StrCmp $0 \"This is just an example. A very simple one.\" 0 strcaseerror\n  ${StrCase} $0 \"THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE.\" \"S\"\n  StrCmp $0 \"This is just an example. A very simple one.\" 0 strcaseerror\n  ${StrCase} $0 \"This is just an example. A very simple one.\" \"L\"\n  StrCmp $0 \"this is just an example. a very simple one.\" 0 strcaseerror\n  ${StrCase} $0 \"This is just an example. A very simple one.\" \"U\"\n  StrCmp $0 \"THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE.\" 0 strcaseerror\n  ${StrCase} $0 \"This is just an example. A very simple one.\" \"T\"\n  StrCmp $0 \"This Is Just An Example. A Very Simple One.\" 0 strcaseerror\n  ${StrCase} $0 \"This is just an example. A very simple one.\" \"<>\"\n  StrCmp $0 \"tHIS IS JUST AN EXAMPLE. a VERY SIMPLE ONE.\" 0 strcaseerror\n  ${StrCase} $0 \"123456789!@#%^&*()-_=+[]{};:,./<>?\" \"S\"\n  StrCmp $0 \"123456789!@#%^&*()-_=+[]{};:,./<>?\" 0 strcaseerror\n  ${StrCase} $0 \"123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#%^&*()abcdefghijklmnopqrstuvwxyz-_=+[]{};:,./<>?\" \"<>\"\n  StrCmp $0 \"123456789abcdefghijklmnopqrstuvwxyz!@#%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ-_=+[]{};:,./<>?\" 0 strcaseerror\n  ${StrCase} $0 \"what about taking a shower tomorrow? it's late to do so now! try to sleep now. Good Night!\" \"S\"\n  StrCmp $0 \"What about taking a shower tomorrow? It's late to do so now! Try to sleep now. Good night!\" 0 strcaseerror\n  !insertmacro StackVerificationEnd\n  IfErrors strcaseerror\n\n  DetailPrint \"PASSED StrCase test\"\n  Goto +2\nstrcaseerror:\n  DetailPrint \"FAILED StrCase test\"\n\n  # Test clipboard function\n  !insertmacro StackVerificationStart\n  ${StrClb} $0 \"StrFunc clipboard test\" \">\"\n  StrCmp $0 \"\" 0 strclberror\n  ${StrClb} $0 \"StrFunc clipboard test #2\" \"<>\"\n  StrCmp $0 \"StrFunc clipboard test\" 0 strclberror\n  ${StrClb} $0 \"\" \"<\"\n  StrCmp $0 \"StrFunc clipboard test #2\" 0 strclberror\n  ${StrClb} $0 \"\" \"\"\n  StrCmp $0 \"\" 0 strclberror\n  !insertmacro StackVerificationEnd\n  IfErrors strclberror\n\n  DetailPrint \"PASSED StrClb test\"\n  Goto +2\nstrclberror:\n  DetailPrint \"FAILED StrClb test\"\n\n  # Test IO functions\n  !insertmacro StackVerificationStart\n  !macro testio str\n  ${StrNSISToIO} $0 \"${str}\"\n  ${StrIOToNSIS} $0 $0\n  StrCmp $0 \"${str}\" 0 ioerror\n  !macroend\n  !insertmacro testio \"$\\rtest$\\n\"\n  !insertmacro testio \"test$\\n\"\n  !insertmacro testio \"$\\rtest\"\n  !insertmacro testio \"test\"\n  !insertmacro testio \"$\\r\\$\\t$\\n\"\n  !insertmacro testio \"$\\r \\ $\\t $\\n $$\"\n  !insertmacro testio \"\"\n  !insertmacro testio \" \"\n  !insertmacro StackVerificationEnd\n  IfErrors ioerror\n\n  DetailPrint \"PASSED StrNSISToIO/StrIOToNSIS test\"\n  Goto +2\nioerror:\n  DetailPrint \"FAILED StrNSISToIO/StrIOToNSIS test\"\n\n  # Test string search functions\n  !insertmacro StackVerificationStart\n  ${StrLoc} $0 \"This is just an example\" \"just\" \"<\"\n  StrCmp $0 \"11\" 0 strlocerror\n  ${StrLoc} $0 a abc <\n  StrCmp $0 \"\" 0 strlocerror\n  ${StrLoc} $0 a abc >\n  StrCmp $0 \"\" 0 strlocerror\n  ${StrLoc} $0 abc a >\n  StrCmp $0 \"0\" 0 strlocerror\n  ${StrLoc} $0 abc b >\n  StrCmp $0 \"1\" 0 strlocerror\n  ${StrLoc} $0 abc c >\n  StrCmp $0 \"2\" 0 strlocerror\n  ${StrLoc} $0 abc a <\n  StrCmp $0 \"2\" 0 strlocerror\n  ${StrLoc} $0 abc b <\n  StrCmp $0 \"1\" 0 strlocerror\n  ${StrLoc} $0 abc c <\n  StrCmp $0 \"0\" 0 strlocerror\n  ${StrLoc} $0 abc d <\n  StrCmp $0 \"\" 0 strlocerror\n  !insertmacro StackVerificationEnd\n  IfErrors strlocerror\n  \n  DetailPrint \"PASSED StrLoc test\"\n  Goto +2\nstrlocerror:\n  DetailPrint \"FAILED StrLoc test\"\n\n  # Test string replacement\n  !insertmacro StackVerificationStart\n  ${StrRep} $0 \"This is just an example\" \"an\" \"one\"\n  StrCmp $0 \"This is just one example\" 0 strreperror\n  ${StrRep} $0 \"test... test... 1 2 3...\" \"test\" \"testing\"\n  StrCmp $0 \"testing... testing... 1 2 3...\" 0 strreperror\n  ${StrRep} $0 \"\" \"test\" \"testing\"\n  StrCmp $0 \"\" 0 strreperror\n  ${StrRep} $0 \"test\" \"test\" \"testing\"\n  StrCmp $0 \"testing\" 0 strreperror\n  ${StrRep} $0 \"test\" \"test\" \"\"\n  StrCmp $0 \"\" 0 strreperror\n  ${StrRep} $0 \"test\" \"\" \"abc\"\n  StrCmp $0 \"test\" 0 strreperror\n  ${StrRep} $0 \"test\" \"\" \"\"\n  StrCmp $0 \"test\" 0 strreperror\n  !insertmacro StackVerificationEnd\n  IfErrors strreperror\n  \n  DetailPrint \"PASSED StrRep test\"\n  Goto +2\nstrreperror:\n  DetailPrint \"FAILED StrRep test\"\n\n  # Test sorting\n  !insertmacro StackVerificationStart\n  ${StrSort} $0 \"This is just an example\" \"\" \" just\" \"ple\" \"0\" \"0\" \"0\"\n  StrCmp $0 \"This is an exam\" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \" \" \"j\" \" \" \"0\" \"\" \"0\"\n  StrCmp $0 \"just\" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \"\" \"j\" \"\" \"0\" \"1\" \"0\"\n  StrCmp $0 \"This is just an example\" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \" \" \"us\" \"\" \"0\" \"1\" \"0\"\n  StrCmp $0 \"just an example\" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \"\" \"u\" \" \" \"0\" \"1\" \"0\"\n  StrCmp $0 \"This is just\" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \" \" \"just\" \" \" \"0\" \"1\" \"0\"\n  StrCmp $0 \"just\" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \" \" \"t\" \" \" \"0\" \"1\" \"0\"\n  StrCmp $0 \"This\" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \" \" \"le\" \" \" \"0\" \"1\" \"0\"\n  StrCmp $0 \"example\" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \" \" \"le\" \" \" \"1\" \"0\" \"0\"\n  StrCmp $0 \" examp\" 0 strsorterror\n  ${StrSort} $0 \"an error has occurred\" \" \" \"e\" \" \" \"0\" \"1\" \"0\"\n  StrCmp $0 \"error\" 0 strsorterror\n  ${StrSort} $0 \"\" \" \" \"something\" \" \" \"0\" \"1\" \"0\"\n  StrCmp $0 \"\" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \" \" \"j\" \" \" \"\" \"\" \"\"\n  StrCmp $0 \" just \" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \" \" \"j\" \" \" \"1\" \"0\" \"1\"\n  StrCmp $0 \" ust \" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \"\" \"j\" \"\" \"0\" \"0\" \"1\"\n  StrCmp $0 \"This is ust an example\" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \" \" \"us\" \"\" \"1\" \"0\" \"0\"\n  StrCmp $0 \" jt an example\" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \"\" \"u\" \" \" \"0\" \"0\" \"1\"\n  StrCmp $0 \"This is jst \" 0 strsorterror\n  ${StrSort} $0 \"This is just an example\" \" \" \"just\" \" \" \"1\" \"0\" \"1\"\n  StrCmp $0 \"  \" 0 strsorterror\n  ${StrSort} $0 \"an error has occurred\" \" \" \"e\" \"h\" \"1\" \"0\" \"0\"\n  StrCmp $0 \" rror \" 0 strsorterror\n  ${StrSort} $0 \"\" \" \" \"something\" \" \" \"1\" \"0\" \"1\"\n  StrCmp $0 \"\" 0 strsorterror\n  !insertmacro StackVerificationEnd\n  IfErrors strsorterror\n  \n  DetailPrint \"PASSED StrSort test\"\n  Goto +2\nstrsorterror:\n  DetailPrint \"FAILED StrSort test\"\n\n  !insertmacro StackVerificationStart\n  ${StrStr} $0 \"abcefghijklmnopqrstuvwxyz\" \"g\"\n  StrCmp $0 \"ghijklmnopqrstuvwxyz\" 0 strstrerror\n  ${StrStr} $0 \"abcefghijklmnopqrstuvwxyz\" \"ga\"\n  StrCmp $0 \"\" 0 strstrerror\n  ${StrStr} $0 \"abcefghijklmnopqrstuvwxyz\" \"\"\n  StrCmp $0 \"abcefghijklmnopqrstuvwxyz\" 0 strstrerror\n  ${StrStr} $0 \"a\" \"abcefghijklmnopqrstuvwxyz\"\n  StrCmp $0 \"\" 0 strstrerror\n  !insertmacro StackVerificationEnd\n  IfErrors strstrerror\n  \n  DetailPrint \"PASSED StrStr test\"\n  Goto +2\nstrstrerror:\n  DetailPrint \"FAILED StrStr test\"\n\n  !insertmacro StackVerificationStart\n  ${StrStrAdv} $0 \"abcabcabc\" \"a\" \">\" \">\" \"1\" \"0\" \"0\"\n  StrCmp $0 \"abcabcabc\" 0 strstradverror\n  ${StrStrAdv} $0 \"abcabcabc\" \"a\" \">\" \">\" \"1\" \"1\" \"0\"\n  StrCmp $0 \"abcabc\" 0 strstradverror\n  ${StrStrAdv} $0 \"abcabcabc\" \"a\" \">\" \">\" \"1\" \"2\" \"0\"\n  StrCmp $0 \"abc\" 0 strstradverror\n  ${StrStrAdv} $0 \"abcabcabc\" \"a\" \">\" \">\" \"1\" \"3\" \"0\"\n  StrCmp $0 \"\" 0 strstradverror\n  ${StrStrAdv} $0 \"abcabcabc\" \"abc\" \">\" \"<\" \"1\" \"1\" \"0\"\n  StrCmp $0 \"abcabc\" 0 strstradverror\n  ${StrStrAdv} $0 \"abcabcabc\" \"abc\" \">\" \"<\" \"0\" \"1\" \"0\"\n  StrCmp $0 \"abc\" 0 strstradverror\n  ${StrStrAdv} $0 \"abcabcabc\" \"abc\" \"<\" \"<\" \"1\" \"0\" \"0\"\n  StrCmp $0 \"abcabcabc\" 0 strstradverror\n  ${StrStrAdv} $0 \"abcabcabc\" \"abc\" \"<\" \"<\" \"0\" \"0\" \"0\"\n  StrCmp $0 \"abcabc\" 0 strstradverror\n  ${StrStrAdv} $0 \"abcabcabc\" \"abc\" \"<\" \">\" \"0\" \"0\" \"0\"\n  StrCmp $0 \"\" 0 strstradverror\n  ${StrStrAdv} $0 \"abcabcabc\" \"abc\" \"<\" \">\" \"0\" \"1\" \"0\"\n  StrCmp $0 \"abc\" 0 strstradverror\n  ${StrStrAdv} $0 \"ABCabcabc\" \"a\" \">\" \">\" \"1\" \"0\" \"1\"\n  StrCmp $0 \"abcabc\" 0 strstradverror\n  ${StrStrAdv} $0 \"ABCabcabc\" \"a\" \">\" \">\" \"1\" \"1\" \"1\"\n  StrCmp $0 \"abc\" 0 strstradverror\n  ${StrStrAdv} $0 \"ABCabcabc\" \"a\" \">\" \">\" \"1\" \"2\" \"1\"\n  StrCmp $0 \"\" 0 strstradverror\n  ${StrStrAdv} $0 \"ABCabcabc\" \"a\" \">\" \">\" \"1\" \"3\" \"1\"\n  StrCmp $0 \"\" 0 strstradverror\n  ${StrStrAdv} $0 \"ABCabcabc\" \"abc\" \">\" \"<\" \"1\" \"1\" \"1\"\n  StrCmp $0 \"ABCabcabc\" 0 strstradverror\n  ${StrStrAdv} $0 \"ABCabcabc\" \"abc\" \">\" \"<\" \"0\" \"1\" \"1\"\n  StrCmp $0 \"ABCabc\" 0 strstradverror\n  ${StrStrAdv} $0 \"ABCabcabc\" \"abc\" \"<\" \"<\" \"1\" \"0\" \"1\"\n  StrCmp $0 \"ABCabcabc\" 0 strstradverror\n  ${StrStrAdv} $0 \"ABCabcabc\" \"abc\" \"<\" \"<\" \"0\" \"0\" \"1\"\n  StrCmp $0 \"ABCabc\" 0 strstradverror\n  ${StrStrAdv} $0 \"ABCabcabc\" \"abc\" \"<\" \">\" \"0\" \"0\" \"1\"\n  StrCmp $0 \"\" 0 strstradverror\n  ${StrStrAdv} $0 \"ABCabcabc\" \"abc\" \"<\" \">\" \"0\" \"1\" \"1\"\n  StrCmp $0 \"abc\" 0 strstradverror\n  !insertmacro StackVerificationEnd\n  IfErrors strstradverror\n  \n  DetailPrint \"PASSED StrStrAdv test\"\n  Goto +2\nstrstradverror:\n  DetailPrint \"FAILED StrStrAdv test\"\n\n  # Test tokenizer\n  !insertmacro StackVerificationStart\n  ${StrTok} $0 \"This is, or is not, just an example\" \" ,\" \"4\" \"1\"\n  StrCmp $0 \"not\" 0 strtokerror\n  ${StrTok} $0 \"This is, or is not, just an example\" \" ,\" \"4\" \"0\"\n  StrCmp $0 \"is\" 0 strtokerror\n  ${StrTok} $0 \"This is, or is not, just an example\" \" ,\" \"152\" \"0\"\n  StrCmp $0 \"\" 0 strtokerror\n  ${StrTok} $0 \"This is, or is not, just an example\" \" ,\" \"\" \"0\"\n  StrCmp $0 \"example\" 0 strtokerror\n  ${StrTok} $0 \"This is, or is not, just an example\" \" ,\" \"L\" \"0\"\n  StrCmp $0 \"example\" 0 strtokerror\n  ${StrTok} $0 \"This is, or is not, just an example\" \" ,\" \"0\" \"0\"\n  StrCmp $0 \"This\" 0 strtokerror\n  !insertmacro StackVerificationEnd\n  IfErrors strtokerror\n  \n  DetailPrint \"PASSED StrTok test\"\n  Goto +2\nstrtokerror:\n  DetailPrint \"FAILED StrTok test\"\n\n  # Test trim new lines\n  !insertmacro StackVerificationStart\n  ${StrTrimNewLines} $0 \"$\\r$\\ntest$\\r$\\ntest$\\r$\\n\"\n  StrCmp $0 \"$\\r$\\ntest$\\r$\\ntest\" 0 strtrimnewlineserror\n  !insertmacro StackVerificationEnd\n  IfErrors strtrimnewlineserror\n\n  DetailPrint \"PASSED StrTrimNewLines test\"\n  Goto +2\nstrtrimnewlineserror:\n  DetailPrint \"FAILED StrTrimNewLines test\"\n\n  WriteUninstaller $EXEDIR\\UnStrFunc.exe\n  \n  Exec $EXEDIR\\UnStrFunc.exe\n\nSectionEnd\n\nSection Uninstall\n\n  # Test case conversion\n  !insertmacro StackVerificationStart\n  ${UnStrCase} $0 \"This is just an example. A very simple one.\" \"\"\n  StrCmp $0 \"This is just an example. A very simple one.\" 0 strcaseerror\n  ${UnStrCase} $0 \"THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE.\" \"S\"\n  StrCmp $0 \"This is just an example. A very simple one.\" 0 strcaseerror\n  ${UnStrCase} $0 \"This is just an example. A very simple one.\" \"L\"\n  StrCmp $0 \"this is just an example. a very simple one.\" 0 strcaseerror\n  ${UnStrCase} $0 \"This is just an example. A very simple one.\" \"U\"\n  StrCmp $0 \"THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE.\" 0 strcaseerror\n  ${UnStrCase} $0 \"This is just an example. A very simple one.\" \"T\"\n  StrCmp $0 \"This Is Just An Example. A Very Simple One.\" 0 strcaseerror\n  ${UnStrCase} $0 \"This is just an example. A very simple one.\" \"<>\"\n  StrCmp $0 \"tHIS IS JUST AN EXAMPLE. a VERY SIMPLE ONE.\" 0 strcaseerror\n  ${UnStrCase} $0 \"123456789!@#%^&*()-_=+[]{};:,./<>?\" \"S\"\n  StrCmp $0 \"123456789!@#%^&*()-_=+[]{};:,./<>?\" 0 strcaseerror\n  ${UnStrCase} $0 \"123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#%^&*()abcdefghijklmnopqrstuvwxyz-_=+[]{};:,./<>?\" \"<>\"\n  StrCmp $0 \"123456789abcdefghijklmnopqrstuvwxyz!@#%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ-_=+[]{};:,./<>?\" 0 strcaseerror\n  ${UnStrCase} $0 \"what about taking a shower tomorrow? it's late to do so now! try to sleep now. Good Night!\" \"S\"\n  StrCmp $0 \"What about taking a shower tomorrow? It's late to do so now! Try to sleep now. Good night!\" 0 strcaseerror\n  !insertmacro StackVerificationEnd\n  IfErrors strcaseerror\n\n  DetailPrint \"PASSED StrCase test\"\n  Goto +2\nstrcaseerror:\n  DetailPrint \"FAILED StrCase test\"\n\n  # Test clipboard function\n  !insertmacro StackVerificationStart\n  ${UnStrClb} $0 \"StrFunc clipboard test\" \">\"\n  StrCmp $0 \"\" 0 strclberror\n  ${UnStrClb} $0 \"StrFunc clipboard test #2\" \"<>\"\n  StrCmp $0 \"StrFunc clipboard test\" 0 strclberror\n  ${UnStrClb} $0 \"\" \"<\"\n  StrCmp $0 \"StrFunc clipboard test #2\" 0 strclberror\n  ${UnStrClb} $0 \"\" \"\"\n  StrCmp $0 \"\" 0 strclberror\n  !insertmacro StackVerificationEnd\n  IfErrors strclberror\n\n  DetailPrint \"PASSED StrClb test\"\n  Goto +2\nstrclberror:\n  DetailPrint \"FAILED StrClb test\"\n\n  # Test IO functions\n  !insertmacro StackVerificationStart\n  !macro untestio str\n  ${UnStrNSISToIO} $0 \"${str}\"\n  ${UnStrIOToNSIS} $0 $0\n  StrCmp $0 \"${str}\" 0 ioerror\n  !macroend\n  !insertmacro untestio \"$\\rtest$\\n\"\n  !insertmacro untestio \"test$\\n\"\n  !insertmacro untestio \"$\\rtest\"\n  !insertmacro untestio \"test\"\n  !insertmacro untestio \"$\\r\\$\\t$\\n\"\n  !insertmacro untestio \"$\\r \\ $\\t $\\n $$\"\n  !insertmacro untestio \"\"\n  !insertmacro untestio \" \"\n  !insertmacro StackVerificationEnd\n  IfErrors ioerror\n\n  DetailPrint \"PASSED StrNSISToIO/StrIOToNSIS test\"\n  Goto +2\nioerror:\n  DetailPrint \"FAILED StrNSISToIO/StrIOToNSIS test\"\n\n  # Test string search functions\n  !insertmacro StackVerificationStart\n  ${UnStrLoc} $0 \"This is just an example\" \"just\" \"<\"\n  StrCmp $0 \"11\" 0 strlocerror\n  ${UnStrLoc} $0 a abc <\n  StrCmp $0 \"\" 0 strlocerror\n  ${UnStrLoc} $0 a abc >\n  StrCmp $0 \"\" 0 strlocerror\n  ${UnStrLoc} $0 abc a >\n  StrCmp $0 \"0\" 0 strlocerror\n  ${UnStrLoc} $0 abc b >\n  StrCmp $0 \"1\" 0 strlocerror\n  ${UnStrLoc} $0 abc c >\n  StrCmp $0 \"2\" 0 strlocerror\n  ${UnStrLoc} $0 abc a <\n  StrCmp $0 \"2\" 0 strlocerror\n  ${UnStrLoc} $0 abc b <\n  StrCmp $0 \"1\" 0 strlocerror\n  ${UnStrLoc} $0 abc c <\n  StrCmp $0 \"0\" 0 strlocerror\n  ${UnStrLoc} $0 abc d <\n  StrCmp $0 \"\" 0 strlocerror\n  !insertmacro StackVerificationEnd\n  IfErrors strlocerror\n\n  DetailPrint \"PASSED StrLoc test\"\n  Goto +2\nstrlocerror:\n  DetailPrint \"FAILED StrLoc test\"\n\n  # Test string replacement\n  !insertmacro StackVerificationStart\n  ${UnStrRep} $0 \"This is just an example\" \"an\" \"one\"\n  StrCmp $0 \"This is just one example\" 0 strreperror\n  ${UnStrRep} $0 \"test... test... 1 2 3...\" \"test\" \"testing\"\n  StrCmp $0 \"testing... testing... 1 2 3...\" 0 strreperror\n  ${UnStrRep} $0 \"\" \"test\" \"testing\"\n  StrCmp $0 \"\" 0 strreperror\n  ${UnStrRep} $0 \"test\" \"test\" \"testing\"\n  StrCmp $0 \"testing\" 0 strreperror\n  ${UnStrRep} $0 \"test\" \"test\" \"\"\n  StrCmp $0 \"\" 0 strreperror\n  ${UnStrRep} $0 \"test\" \"\" \"abc\"\n  StrCmp $0 \"test\" 0 strreperror\n  ${UnStrRep} $0 \"test\" \"\" \"\"\n  StrCmp $0 \"test\" 0 strreperror\n  !insertmacro StackVerificationEnd\n  IfErrors strreperror\n\n  DetailPrint \"PASSED StrRep test\"\n  Goto +2\nstrreperror:\n  DetailPrint \"FAILED StrRep test\"\n\n  # Test sorting\n  !insertmacro StackVerificationStart\n  ${UnStrSort} $0 \"This is just an example\" \"\" \" just\" \"ple\" \"0\" \"0\" \"0\"\n  StrCmp $0 \"This is an exam\" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \" \" \"j\" \" \" \"0\" \"\" \"0\"\n  StrCmp $0 \"just\" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \"\" \"j\" \"\" \"0\" \"1\" \"0\"\n  StrCmp $0 \"This is just an example\" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \" \" \"us\" \"\" \"0\" \"1\" \"0\"\n  StrCmp $0 \"just an example\" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \"\" \"u\" \" \" \"0\" \"1\" \"0\"\n  StrCmp $0 \"This is just\" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \" \" \"just\" \" \" \"0\" \"1\" \"0\"\n  StrCmp $0 \"just\" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \" \" \"t\" \" \" \"0\" \"1\" \"0\"\n  StrCmp $0 \"This\" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \" \" \"le\" \" \" \"0\" \"1\" \"0\"\n  StrCmp $0 \"example\" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \" \" \"le\" \" \" \"1\" \"0\" \"0\"\n  StrCmp $0 \" examp\" 0 strsorterror\n  ${UnStrSort} $0 \"an error has occurred\" \" \" \"e\" \" \" \"0\" \"1\" \"0\"\n  StrCmp $0 \"error\" 0 strsorterror\n  ${UnStrSort} $0 \"\" \" \" \"something\" \" \" \"0\" \"1\" \"0\"\n  StrCmp $0 \"\" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \" \" \"j\" \" \" \"\" \"\" \"\"\n  StrCmp $0 \" just \" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \" \" \"j\" \" \" \"1\" \"0\" \"1\"\n  StrCmp $0 \" ust \" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \"\" \"j\" \"\" \"0\" \"0\" \"1\"\n  StrCmp $0 \"This is ust an example\" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \" \" \"us\" \"\" \"1\" \"0\" \"0\"\n  StrCmp $0 \" jt an example\" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \"\" \"u\" \" \" \"0\" \"0\" \"1\"\n  StrCmp $0 \"This is jst \" 0 strsorterror\n  ${UnStrSort} $0 \"This is just an example\" \" \" \"just\" \" \" \"1\" \"0\" \"1\"\n  StrCmp $0 \"  \" 0 strsorterror\n  ${UnStrSort} $0 \"an error has occurred\" \" \" \"e\" \"h\" \"1\" \"0\" \"0\"\n  StrCmp $0 \" rror \" 0 strsorterror\n  ${UnStrSort} $0 \"\" \" \" \"something\" \" \" \"1\" \"0\" \"1\"\n  StrCmp $0 \"\" 0 strsorterror\n  !insertmacro StackVerificationEnd\n  IfErrors strsorterror\n\n  DetailPrint \"PASSED StrSort test\"\n  Goto +2\nstrsorterror:\n  DetailPrint \"FAILED StrSort test\"\n\n  !insertmacro StackVerificationStart\n  ${UnStrStr} $0 \"abcefghijklmnopqrstuvwxyz\" \"g\"\n  StrCmp $0 \"ghijklmnopqrstuvwxyz\" 0 strstrerror\n  ${UnStrStr} $0 \"abcefghijklmnopqrstuvwxyz\" \"ga\"\n  StrCmp $0 \"\" 0 strstrerror\n  ${UnStrStr} $0 \"abcefghijklmnopqrstuvwxyz\" \"\"\n  StrCmp $0 \"abcefghijklmnopqrstuvwxyz\" 0 strstrerror\n  ${UnStrStr} $0 \"a\" \"abcefghijklmnopqrstuvwxyz\"\n  StrCmp $0 \"\" 0 strstrerror\n  !insertmacro StackVerificationEnd\n  IfErrors strstrerror\n\n  DetailPrint \"PASSED StrStr test\"\n  Goto +2\nstrstrerror:\n  DetailPrint \"FAILED StrStr test\"\n\n  !insertmacro StackVerificationStart\n  ${UnStrStrAdv} $0 \"abcabcabc\" \"a\" \">\" \">\" \"1\" \"0\" \"0\"\n  StrCmp $0 \"abcabcabc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"abcabcabc\" \"a\" \">\" \">\" \"1\" \"1\" \"0\"\n  StrCmp $0 \"abcabc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"abcabcabc\" \"a\" \">\" \">\" \"1\" \"2\" \"0\"\n  StrCmp $0 \"abc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"abcabcabc\" \"a\" \">\" \">\" \"1\" \"3\" \"0\"\n  StrCmp $0 \"\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"abcabcabc\" \"abc\" \">\" \"<\" \"1\" \"1\" \"0\"\n  StrCmp $0 \"abcabc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"abcabcabc\" \"abc\" \">\" \"<\" \"0\" \"1\" \"0\"\n  StrCmp $0 \"abc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"abcabcabc\" \"abc\" \"<\" \"<\" \"1\" \"0\" \"0\"\n  StrCmp $0 \"abcabcabc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"abcabcabc\" \"abc\" \"<\" \"<\" \"0\" \"0\" \"0\"\n  StrCmp $0 \"abcabc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"abcabcabc\" \"abc\" \"<\" \">\" \"0\" \"0\" \"0\"\n  StrCmp $0 \"\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"abcabcabc\" \"abc\" \"<\" \">\" \"0\" \"1\" \"0\"\n  StrCmp $0 \"abc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"ABCabcabc\" \"a\" \">\" \">\" \"1\" \"0\" \"1\"\n  StrCmp $0 \"abcabc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"ABCabcabc\" \"a\" \">\" \">\" \"1\" \"1\" \"1\"\n  StrCmp $0 \"abc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"ABCabcabc\" \"a\" \">\" \">\" \"1\" \"2\" \"1\"\n  StrCmp $0 \"\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"ABCabcabc\" \"a\" \">\" \">\" \"1\" \"3\" \"1\"\n  StrCmp $0 \"\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"ABCabcabc\" \"abc\" \">\" \"<\" \"1\" \"1\" \"1\"\n  StrCmp $0 \"ABCabcabc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"ABCabcabc\" \"abc\" \">\" \"<\" \"0\" \"1\" \"1\"\n  StrCmp $0 \"ABCabc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"ABCabcabc\" \"abc\" \"<\" \"<\" \"1\" \"0\" \"1\"\n  StrCmp $0 \"ABCabcabc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"ABCabcabc\" \"abc\" \"<\" \"<\" \"0\" \"0\" \"1\"\n  StrCmp $0 \"ABCabc\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"ABCabcabc\" \"abc\" \"<\" \">\" \"0\" \"0\" \"1\"\n  StrCmp $0 \"\" 0 strstradverror\n  ${UnStrStrAdv} $0 \"ABCabcabc\" \"abc\" \"<\" \">\" \"0\" \"1\" \"1\"\n  StrCmp $0 \"abc\" 0 strstradverror\n  !insertmacro StackVerificationEnd\n  IfErrors strstradverror\n\n  DetailPrint \"PASSED StrStrAdv test\"\n  Goto +2\nstrstradverror:\n  DetailPrint \"FAILED StrStrAdv test\"\n\n  # Test tokenizer\n  !insertmacro StackVerificationStart\n  ${UnStrTok} $0 \"This is, or is not, just an example\" \" ,\" \"4\" \"1\"\n  StrCmp $0 \"not\" 0 strtokerror\n  ${UnStrTok} $0 \"This is, or is not, just an example\" \" ,\" \"4\" \"0\"\n  StrCmp $0 \"is\" 0 strtokerror\n  ${UnStrTok} $0 \"This is, or is not, just an example\" \" ,\" \"152\" \"0\"\n  StrCmp $0 \"\" 0 strtokerror\n  ${UnStrTok} $0 \"This is, or is not, just an example\" \" ,\" \"\" \"0\"\n  StrCmp $0 \"example\" 0 strtokerror\n  ${UnStrTok} $0 \"This is, or is not, just an example\" \" ,\" \"L\" \"0\"\n  StrCmp $0 \"example\" 0 strtokerror\n  ${UnStrTok} $0 \"This is, or is not, just an example\" \" ,\" \"0\" \"0\"\n  StrCmp $0 \"This\" 0 strtokerror\n  !insertmacro StackVerificationEnd\n  IfErrors strtokerror\n\n  DetailPrint \"PASSED StrTok test\"\n  Goto +2\nstrtokerror:\n  DetailPrint \"FAILED StrTok test\"\n\n  # Test trim new lines\n  !insertmacro StackVerificationStart\n  ${UnStrTrimNewLines} $0 \"$\\r$\\ntest$\\r$\\ntest$\\r$\\n\"\n  StrCmp $0 \"$\\r$\\ntest$\\r$\\ntest\" 0 strtrimnewlineserror\n  !insertmacro StackVerificationEnd\n  IfErrors strtrimnewlineserror\n\n  DetailPrint \"PASSED StrTrimNewLines test\"\n  Goto +2\nstrtrimnewlineserror:\n  DetailPrint \"FAILED StrTrimNewLines test\"\n\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/System/SysFunc.nsh",
    "content": "; Some useful functions based on System plugin\n; \n; (c) brainsucker, 2002\n; (r) BSForce\n\n; Check for double includes\n!ifndef SysFunc.NSH.Included\n!define SysFunc.NSH.Included\n\n!include \"${NSISDIR}\\Examples\\System\\System.nsh\"\n\n!verbose 3      ; For WinMessages especially\n  !include \"WinMessages.nsh\"\n!verbose 4\n\n; ================= GetInstallerExeName implementation =================\n\n; Adopted Get Parameter function -> now it gets full installer.exe path\n; input - nothing, output -> full path at the top of the stack\nFunction GetInstallerExeName\n   Push $R0\n   Push $R1\n   Push $R2\n   StrCpy $R0 $CMDLINE 1\n   StrCpy $R1 '\"'\n   StrCpy $R2 1\n   StrCmp $R0 '\"' loop\n     StrCpy $R1 ' ' ; we're scanning for a space instead of a quote\n   loop:\n     StrCpy $R0 $CMDLINE 1 $R2\n     StrCmp $R0 $R1 loop2\n     StrCmp $R0 \"\" loop2\n     IntOp $R2 $R2 + 1\n     Goto loop\n   loop2:\n\n   ; Ok, have we found last exename character or string end?\n   StrCmp $R0 \"\" \"\" +2\n        IntOp $R2 $R2 - 1       ; last exename char\n   StrCmp $R1 ' ' +3    ; was first character the '\"', or something other?\n        StrCpy $R1 1    ; it was quote\n        Goto +2\n        StrCpy $R1 0    \n   IntOp $R2 $R2 - $R1\n   StrCpy $R0 $CMDLINE $R2 $R1  \n\n   SearchPath $R0 $R0      ; expand file name to full path\n\n   Pop $R2\n   Pop $R1\n   Exch $R0\nFunctionEnd\n\n; ================= systemGetFileSysTime implementation =================\n\n!macro smGetFileSysTime FILENAME\n        Push ${FILENAME}\n        Call systemGetFileSysTime\n        Pop  $R0\n!macroend\n\n; -----------------------------------------------------------------\n; systemGetFileSysTime (params on stack):\n;       FILENAME        -       name of file to get file time\n; returns to stack (SYSTEMTIME struct addr)\n; -----------------------------------------------------------------\n\n; uses original method from NSIS\nFunction systemGetFileSysTime\n    System::Store \"s r1\"\n\n    StrCpy $R0 0     \n\n    ; create WIN32_FIND_DATA struct\n    System::Call '*${stWIN32_FIND_DATA} .r2'\n\n    ; Find file info\n    System::Call '${sysFindFirstFile}(r1, r2) .r3'\n\n    ; ok?\n    IntCmp $3 ${INVALID_HANDLE_VALUE} sgfst_exit\n\n    ; close file search\n    System::Call '${sysFindClose}(r3)'\n\n    ; Create systemtime struct for local time\n    System::Call '*${stSYSTEMTIME} .R0'\n\n    ; Get File time\n    System::Call '*$2${stWIN32_FIND_DATA} (,,, .r3)'\n\n    ; Convert file time (UTC) to local file time\n    System::Call '${sysFileTimeToLocalFileTime}(r3, .r1)'\n\n    ; Convert file time to system time\n    System::Call '${sysFileTimeToSystemTime}(r1, R0)'\n\nsgfst_exit:\n    ; free used memory for WIN32_FIND_DATA struct\n    System::Free $2    \n\n    System::Store \"P0 l\"\nFunctionEnd\n\n; ================= systemMessageBox implementation =================\n\n; return to $R0\n!macro smMessageBox MODULE MSG CAPTION STYLE ICON\n     Push \"${ICON}\"\n     Push \"${STYLE}\"\n     Push \"${CAPTION}\"\n     Push \"${MSG}\"\n     Push \"${MODULE}\"\n     Call systemMessageBox\n     Pop $R0\n!macroend\n\n; -----------------------------------------------------------------\n; systemMessageBox (params on stack):\n;       Module: either handle (\"i HANDLE\", HANDLE could be 0) or \"modulename\" \n;       Msg: text of message\n;       Caption: caption of message box window\n;       Style: style, buttons etc\n;       Icon: either icon handle (\"i HANDLE\") or resource name \n; returns to stack\n; -----------------------------------------------------------------\nFunction systemMessageBox\n     System::Store \"s r2r3r4r5r6\"\n\n     ; may be Module is module handle?\n     StrCpy $1 $2\n     IntCmp $1 0 0 smbnext smbnext\n\n\t ; Get module handle\n\t System::Call '${sysGetModuleHandle}($2) .r1'\n\t IntCmp $1 0 loadlib libnotloaded libnotloaded\n\nloadlib:\n     ; Load module and get handle\n     System::Call '${sysLoadLibrary}($2) .r1'\n     IntCmp $1 0 0 smbnext smbnext\n\nlibnotloaded:\n\t ; Indicate that LoadLibrary wasn't used\n\t StrCpy $2 1\n\nsmbnext:\n     ; Create MSGBOXPARAMS structure\n     System::Call '*${stMSGBOXPARAMS}(, $HWNDPARENT, r1, r3, r4, \"$5|${MB_USERICON}\", $6, _) .r0'\n     ; call MessageBoxIndirect\n     System::Call '${sysMessageBoxIndirect}(r0) .R0'\n     ; free MSGBOXPARAMS structure\n\n     System::Free $0\n\n     ; have we used load library at start?\n     IntCmp $2 0 0 smbskipfree smbskipfree\n     ; No, then free the module\n     System::Call '${sysFreeLibrary}(r1)'\n\nsmbskipfree:\n     System::Store \"P0 l\"   \nFunctionEnd\n\n; ================= systemSplash implementation =================\n\n; returns to $R0\n!macro smSystemSplash DELAY FILE\n    Push ${FILE}\n    Push ${DELAY}\n    call systemSplash\n    Pop $R0    \n!macroend\n\n; -----------------------------------------------------------------\n; systemSplash (params on stack):\n;       Delay - time in ms to show the splash\n;       File - bitmap (& audio) file name (without extension)\n; returns to stack\n; -----------------------------------------------------------------\n\nFunction _systemSplashWndCB\n   ; Callback receives 4 values\n   System::Store \"s r2r5r7r9\"\n\n   ; Message branching\n   IntCmp $5 ${WM_CLOSE} m_Close\n   IntCmp $5 ${WM_TIMER} m_Timer\n   IntCmp $5 ${WM_LBUTTONDOWN} m_Lbtn\n   IntCmp $5 ${WM_CREATE} m_Create\n   IntCmp $5 ${WM_PAINT} m_Paint\n   goto default\n\nm_Create:\n   ; Create structures\n   System::Call \"*${stRECT} (_) .R8\"\n   System::Call \"*${stBITMAP} (_, &l0 .R7) .R9\"\n\n   ; Get bitmap info\n   System::Call \"${sysGetObject} (r6, R7, R9)\" \n   \n   ; Get desktop info\n   System::Call \"${sysSystemParametersInfo} (${SPI_GETWORKAREA}, 0, R8, 0)\" \n\n   ; Style (callbacked)\n   System::Call \"${sysSetWindowLong} (r2, ${GWL_STYLE}, 0) .s\" \n   !insertmacro SINGLE_CALLBACK 5 $R7 1 _systemSplashWndCB\n\n   ; Calculate and set window pos\n\n   ; Get bmWidth(R2) and bmHeight(R3)\n   System::Call \"*$R9${stBITMAP} (,.R2,.R3)\"\n   ; Get left(R4), top(R5), right(R6), bottom(R7)\n   System::Call \"*$R8${stRECT} (.R4,.R5,.R6,.R7)\"\n\n   ; Left pos\n   IntOp $R0 $R6 - $R4\n   IntOp $R0 $R0 - $R2\n   IntOp $R0 $R0 / 2\n   IntOp $R0 $R0 + $R4\n\n   ; Top pos\n   IntOp $R1 $R7 - $R5\n   IntOp $R1 $R1 - $R3\n   IntOp $R1 $R1 / 2\n   IntOp $R1 $R1 + $R5\n\n   System::Call \"${sysSetWindowPos} (r2, 0, R0, R1, R2, R3, ${SWP_NOZORDER}) .s\" \n   !insertmacro SINGLE_CALLBACK 6 $R7 1 _systemSplashWndCB\n\n   ; Show window\n   System::Call \"${sysShowWindow} (r2, ${SW_SHOW}) .s\" \n   !insertmacro SINGLE_CALLBACK 7 $R7 1 _systemSplashWndCB\n\n   ; Set Timer\n   System::Call \"${sysSetTimer} (r2, 1, r8,)\"\n\n   ; Free used memory\n   System::Free $R8\n   System::Free $R9\n\n   StrCpy $R0 0\n   goto exit\n\nm_Paint:\n   ; Create structures\n   System::Call \"*${stRECT} (_) .R8\"\n   System::Call \"*${stPAINTSTRUCT} (_) .R9\"\n\n   ; Begin Paint\n   System::Call \"${sysBeginPaint} (r2, R9) .R7\"\n\n   ; CreateCompatibleDC\n   System::Call \"${sysCreateCompatibleDC} (R7) .R6\"\n\n   ; GetClientRect\n   System::Call \"${sysGetClientRect} (r2, R8)\"\n  \n   ; Select new bitmap\n   System::Call \"${sysSelectObject} (R6, r6) .R5\"\n\n   ; Get left(R0), top(R1), right(R2), bottom(R3)\n   System::Call \"*$R8${stRECT} (.R0,.R1,.R2,.R3)\"\n     \n   ; width=right-left  \n   IntOp $R2 $R2 - $R0\n   ; height=bottom-top\n   IntOp $R3 $R3 - $R1\n\n   System::Call \"${sysBitBlt} (R7, R0, R1, R2, R3, R6, 0, 0, ${SRCCOPY})\" \n\n   ; Select old bitmap\n   System::Call \"${sysSelectObject} (R6, R5)\"\n   \n   ; Delete compatible DC\n   System::Call \"${sysDeleteDC} (R6)\"\n\n   ; End Paint\n   System::Call \"${sysEndPaint} (r2, R9)\"\n\n   ; Free used memory\n   System::Free $R8\n   System::Free $R9\n\n   StrCpy $R0 0\n   goto exit\n\nm_Timer:\nm_Lbtn:\n   StrCpy $4 0\n   IntCmp $5 ${WM_TIMER} destroy\n        StrCpy $4 1\n\ndestroy:\n   System::Call \"${sysDestroyWindow} (r2) .s\"\n   !insertmacro SINGLE_CALLBACK 12 $R4 1 _systemSplashWndCB\n\ndefault:\n   ; Default\n   System::Call \"${sysDefWindowProc} (r2, r5, r7, r9) .s\"\n   !insertmacro SINGLE_CALLBACK 14 $R0 1 _systemSplashWndCB\n   goto exit\n\nm_Close:\n   StrCpy $R0 0\n   goto exit\n\nexit:\n   ; Restore\n   System::Store \"p4P0 l R0r4\"\n\n   ; Return from callback\n   System::Call \"$3\" $R0\nFunctionEnd\n\nFunction systemSplash\n\n   ; Save registers and get input \n   System::Store \"s r8r9\"\n\n   ; Get module instance\n   System::Call \"${sysGetModuleHandle} (i) .r7\"\n\n   ; Get arrow cursor\n   System::Call \"${sysLoadCursor} (0, i ${IDC_ARROW}) .R9\" \n\n   ; Get callback\n   System::Get \"${sysWNDPROC}\"\n   Pop $3\n\n   ; Create window class\n   System::Call \"*${stWNDCLASS} (0,r3,0,0,r7,0,R9,0,i 0,'_sp') .R9\"\n\n   ; Register window class\n   System::Call \"${sysRegisterClass} (R9) .R9\"\n   IntCmp $R9 0 errorexit ; Class registered ok?\n\n   ; Load Image (LR_CREATEDIBSECTION|LR_LOADFROMFILE = 0x2010)\n   System::Call '${sysLoadImage} (, s, ${IMAGE_BITMAP}, 0, 0, ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) .r6' \"$9.bmp\"\n   IntCmp $6 0 errorexit        ; Image loaded ok?\n\n   ; Start the sound (SND_ASYNC|SND_FILENAME|SND_NODEFAULT = 0x20003)\n   System::Call \"${sysPlaySound} (s,,${SND_ASYNC}|${SND_FILENAME}|${SND_NODEFAULT})\" \"$9.wav\" \n\n   ; Create window\n   System::Call \"${sysCreateWindowEx} (${WS_EX_TOOLWINDOW}, s, s,,,,,, $HWNDPARENT,,r7,) .s\" \"_sp\" \"_sp\" \n   !insertmacro SINGLE_CALLBACK 1 $5 1 _systemSplashWndCB\n\n   ; Create MSG struct\n   System::Call \"*${stMSG} (_) i.R9\"\n\n   ; -------------------------\nrepeat:\n        ; Check for window\n        System::Call \"${sysIsWindow} (r5) .s\"\n        !insertmacro SINGLE_CALLBACK 2 $R8 1 _systemSplashWndCB\n        IntCmp $R8 0 finish\n\n        ; Get message\n        System::Call \"${sysGetMessage} (R9, r5,_) .s\"\n        !insertmacro SINGLE_CALLBACK 3 $R8 1 _systemSplashWndCB\n        IntCmp $R8 0 finish\n\n        ; Dispatch message\n        System::Call \"${sysDispatchMessage} (R9) .s\"\n        !insertmacro SINGLE_CALLBACK 4 $R8 1 _systemSplashWndCB\n\n        ; Repeat dispatch cycle\n        goto repeat\n   ; -------------------------\n\nfinish:\n   ; Stop the sound\n   System::Call \"${sysPlaySound} (i 0, i 0, i 0)\"\n\n   ; Delete bitmap object\n   System::Call \"${sysDeleteObject} (r6)\"\n\n   ; Delete the callback queue\n   System::Free $3\n\n   ; Dialog return\n   StrCpy $R0 $4\n   goto exit\n\n; Exit in case of error\nerrorexit:\n   StrCpy $R0 -1\n   goto exit\n\nexit:\n   ; Restore register and put output\n   System::Store \"P0 l\"\nFunctionEnd\n\n!verbose 4\n\n!endif"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/System/System.nsh",
    "content": "; Some useful functions, structures, constants\n; \n; (c) brainsucker, 2002\n; (r) BSForce\n\n; Check for double includes\n!ifndef System.NSH.Included\n!define System.NSH.Included\n\n!verbose 3\n\n; ------------- Functions --------------\n\n; LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);\n!define sysWNDPROC \"(i.s, i.s, i.s, i.s) iss\"\n\n; LRESULT DefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\n!define sysDefWindowProc \"user32::DefWindowProcA(i, i, i, i) i\"\n\n!define sysMessageBox \"user32::MessageBoxA(i, t, t, i) i\"\n\n!define sysMessageBeep \"user32::MessageBeep(i) i\"\n\n!define sysMessageBoxIndirect 'user32::MessageBoxIndirectA(i) i'\n\n; HMODULE GetModuleHandle(LPCTSTR lpModuleName); \n!define sysGetModuleHandle \"kernel32::GetModuleHandleA(t) i\"\n\n; HMODULE LoadLibrary(LPCTSTR lpFileName);\n!define sysLoadLibrary \"kernel32::LoadLibraryA(t) i\"\n\n; BOOL FreeLibrary(HMODULE hModule);\n!define sysFreeLibrary \"kernel32::FreeLibrary(i) i\"\n\n; HCURSOR LoadCursor(HINSTANCE hInstance, LPCTSTR lpCursorName);\n!define sysLoadCursor \"user32::LoadCursorA(i, t) i\"\n\n; ATOM RegisterClass(CONST WNDCLASS *lpWndClass);\n!define sysRegisterClass \"user32::RegisterClassA(i) i\"\n\n; HANDLE LoadImage(HINSTANCE hinst, LPCTSTR lpszName, UINT uType,\n;       int cxDesired, int cyDesired, UINT fuLoad);\n!define sysLoadImage \"user32::LoadImageA(i, t, i, i, i, i) i\"\n\n; BOOL PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);\n!define sysPlaySound \"winmm.dll::PlaySoundA(t, i, i) i\"\n\n; HWND CreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName,\n;       DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent,\n;       HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);\n!define sysCreateWindowEx \"user32::CreateWindowExA(i, t, t, i, i, i, i, i, i, i, i, i) i\"\n\n; BOOL IsWindow(HWND hWnd);\n!define sysIsWindow \"user32::IsWindow(i) i\"\n\n; LONG SetWindowLong(HWND hWnd, int nIndex, LONG dwNewLong);\n!define sysSetWindowLong \"user32::SetWindowLongA(i, i, i) i\"\n\n; BOOL SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);\n!define sysSetWindowPos \"user32::SetWindowPos(i, i, i, i, i, i, i) i\"\n\n; BOOL ShowWindow(HWND hWnd, int nCmdShow);\n!define sysShowWindow \"user32::ShowWindow(i, i) i\"\n\n; BOOL DestroyWindow(HWND hWnd);\n!define sysDestroyWindow \"user32::DestroyWindow(i) i\"\n\n; BOOL GetClientRect(HWND hWnd, LPRECT lpRect);\n!define sysGetClientRect \"user32::GetClientRect(i, i) i\"\n\n; BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);\n!define sysGetMessage \"user32::GetMessageA(i, i, i, i) i\"\n\n; LRESULT DispatchMessage(CONST MSG *lpmsg);\n!define sysDispatchMessage \"user32::DispatchMessageA(i) i\"\n\n; BOOL DeleteObject(HGDIOBJ hObject);\n!define sysDeleteObject \"gdi32::DeleteObject(i) i\"\n\n; int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject);\n!define sysGetObject \"gdi32::GetObjectA(i, i, i) i\"\n\n; HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);\n!define sysSelectObject \"gdi32::SelectObject(i, i) i\"\n\n; HDC CreateCompatibleDC(HDC hdc);\n!define sysCreateCompatibleDC \"gdi32::CreateCompatibleDC(i) i\"\n\n; BOOL DeleteDC(HDC hdc);\n!define sysDeleteDC \"gdi32::DeleteDC(i) i\"\n\n; BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, \n;       HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop);\n!define sysBitBlt \"gdi32::BitBlt(i, i, i, i, i, i, i, i, i) i\"\n\n; proposed by abgandar\n; int AddFontResource(LPCTSTR lpszFilename);\n!define sysAddFontResource \"gdi32::AddFontResourceA(t) i\"\n\n; HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint);\n!define sysBeginPaint \"user32::BeginPaint(i, i) i\"\n\n; BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint);\n!define sysEndPaint \"user32::EndPaint(i, i) i\"\n\n; BOOL SystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);\n!define sysSystemParametersInfo \"user32::SystemParametersInfoA(i, i, i, i) i\"\n\n; UINT_PTR SetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);\n!define sysSetTimer \"user32::SetTimer(i, i, i, k) i\"\n\n!define sysGetLogicalDriveStrings 'kernel32::GetLogicalDriveStringsA(i, i) i'\n\n!define sysGetDiskFreeSpaceEx 'kernel32::GetDiskFreeSpaceExA(t, *l, *l, *l) i'\n\n; UINT GetDriveType(LPCTSTR lpRootPathName);\n!define sysGetDriveType 'kernel32::GetDriveTypeA(t) i'\n\n; HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData);\n!define sysFindFirstFile 'kernel32::FindFirstFileA(t, i) i'\n\n; BOOL FindClose(HANDLE hFindFile);\n!define sysFindClose 'kernel32::FindClose(i) i'\n\n; BOOL FileTimeToSystemTime(CONST FILETIME *lpFileTime, \n; LPSYSTEMTIME lpSystemTime);\n!define sysFileTimeToSystemTime 'kernel32::FileTimeToSystemTime(*l, i) i'\n\n; BOOL FileTimeToLocalFileTime(\n;       CONST FILETIME *lpFileTime, \n;       LPFILETIME lpLocalFileTime);\n!define sysFileTimeToLocalFileTime 'kernel32::FileTimeToLocalFileTime(*l, *l) i'\n\n; BOOL SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION lpTimeZone, \n; LPSYSTEMTIME lpUniversalTime, LPSYSTEMTIME lpLocalTime);\n!define sysSystemTimeToTzSpecificLocalTime 'kernel32::SystemTimeToTzSpecificLocalTime(i, i, i) i'\n\n!define syslstrlen 'kernel32::lstrlenA(t) i'\n\n; int wsprintf(LPTSTR lpOut, LPCTSTR lpFmt, ...);\n!define syswsprintf \"user32::wsprintfA(t, t) i ? c\" \n\n; ------------- Structures --------------\n\n; typedef struct _WNDCLASS { \n;               UINT       style; \n;               WNDPROC    lpfnWndProc; \n;               int        cbClsExtra; \n;               int        cbWndExtra; \n;               HINSTANCE  hInstance; \n;               HICON      hIcon; \n;               HCURSOR    hCursor; \n;               HBRUSH     hbrBackground;\n;               LPCTSTR    lpszMenuName; \n;               LPCTSTR    lpszClassName; \n; } WNDCLASS, *PWNDCLASS; \n!define stWNDCLASS \"(i, k, i, i, i, i, i, i, t, t) i\"\n\n; typedef struct tagMSG {\n;   HWND   hwnd; \n;   UINT   message; \n;   WPARAM wParam; \n;   LPARAM lParam; \n;   DWORD  time; \n;   POINT  pt;  -> will be presented as two separate px and py\n; } MSG, *PMSG;\n!define stMSG \"(i, i, i, i, i, i, i) i\"\n\n; typedef struct tagBITMAP {\n;   LONG   bmType; \n;   LONG   bmWidth; \n;   LONG   bmHeight; \n;   LONG   bmWidthBytes; \n;   WORD   bmPlanes; \n;   WORD   bmBitsPixel; \n;   LPVOID bmBits; \n; } BITMAP, *PBITMAP; \n!define stBITMAP \"(i, i, i, i, i, i, i) i\"\n\n; typedef struct _RECT { \n;   LONG left; \n;   LONG top; \n;   LONG right; \n;   LONG bottom; \n; } RECT, *PRECT; \n!define stRECT \"(i, i, i, i) i\"\n\n; typedef struct tagPAINTSTRUCT { \n;   HDC  hdc; \n;   BOOL fErase; \n;   RECT rcPaint; (rcl, rct, rcr, rcb)\n;   BOOL fRestore; \n;   BOOL fIncUpdate; \n;   BYTE rgbReserved[32]; \n; } PAINTSTRUCT, *PPAINTSTRUCT; \n!define stPAINTSTRUCT \"(i, i, i, i, i, i, i, i, &v32) i\"\n\n; typedef struct { \n;  UINT      cbSize; \n;  HWND      hwndOwner; \n;  HINSTANCE hInstance; \n;  LPCTSTR   lpszText; \n;  LPCTSTR   lpszCaption; \n;  DWORD     dwStyle; \n;  LPCTSTR   lpszIcon; \n;  DWORD_PTR dwContextHelpId; \n;  MSGBOXCALLBACK lpfnMsgBoxCallback; \n;  DWORD     dwLanguageId; \n; } MSGBOXPARAMS, *PMSGBOXPARAMS; \n!define stMSGBOXPARAMS '(&l4, i, i, t, t, i, t, i, k, i) i'\n\n; typedef struct _SYSTEMTIME { \n;    WORD wYear; \n;    WORD wMonth; \n;    WORD wDayOfWeek; \n;    WORD wDay; \n;    WORD wHour; \n;    WORD wMinute; \n;    WORD wSecond; \n;    WORD wMilliseconds; \n; } SYSTEMTIME, *PSYSTEMTIME; \n!define stSYSTEMTIME '(&i2, &i2, &i2, &i2, &i2, &i2, &i2, &i2) i'\n\n; Maximal windows path\n!define MAX_PATH          260\n\n; typedef struct _WIN32_FIND_DATA {\n;  DWORD    dwFileAttributes; \n;  FILETIME ftCreationTime; \n;  FILETIME ftLastAccessTime; \n;  FILETIME ftLastWriteTime; \n;  DWORD    nFileSizeHigh; \n;  DWORD    nFileSizeLow; \n;  DWORD    dwReserved0; \n;  DWORD    dwReserved1; \n;  TCHAR    cFileName[ MAX_PATH ]; \n;  TCHAR    cAlternateFileName[ 14 ]; \n; } WIN32_FIND_DATA, *PWIN32_FIND_DATA; \n!define stWIN32_FIND_DATA '(i, l, l, l, i, i, i, i, &t${MAX_PATH}, &t14) i'\n\n; ------------- Constants --------------\n\n; == Other ==\n!define INVALID_HANDLE_VALUE -1\n\n; == Cursors ==\n\n!define IDC_ARROW           32512\n!define IDC_IBEAM           32513\n!define IDC_WAIT            32514\n!define IDC_CROSS           32515\n!define IDC_UPARROW         32516\n!define IDC_SIZE            32640  \n!define IDC_ICON            32641  \n!define IDC_SIZENWSE        32642\n!define IDC_SIZENESW        32643\n!define IDC_SIZEWE          32644\n!define IDC_SIZENS          32645\n!define IDC_SIZEALL         32646\n!define IDC_NO              32648 \n!define IDC_HAND            32649\n!define IDC_APPSTARTING     32650 \n!define IDC_HELP            32651\n\n; == Images ==\n\n!define IMAGE_BITMAP        0\n!define IMAGE_ICON          1\n!define IMAGE_CURSOR        2\n!define IMAGE_ENHMETAFILE   3\n\n!define LR_DEFAULTCOLOR     0x0000\n!define LR_MONOCHROME       0x0001\n!define LR_COLOR            0x0002\n!define LR_COPYRETURNORG    0x0004\n!define LR_COPYDELETEORG    0x0008\n!define LR_LOADFROMFILE     0x0010\n!define LR_LOADTRANSPARENT  0x0020\n!define LR_DEFAULTSIZE      0x0040\n!define LR_VGACOLOR         0x0080\n!define LR_LOADMAP3DCOLORS  0x1000\n!define LR_CREATEDIBSECTION 0x2000\n!define LR_COPYFROMRESOURCE 0x4000\n!define LR_SHARED           0x8000\n\n; == Sounds ==\n\n!define SND_SYNC            0x0000  \n!define SND_ASYNC           0x0001  \n!define SND_NODEFAULT       0x0002  \n!define SND_MEMORY          0x0004  \n!define SND_LOOP            0x0008  \n!define SND_NOSTOP          0x0010  \n\n!define SND_NOWAIT      0x00002000\n!define SND_ALIAS       0x00010000 \n!define SND_ALIAS_ID    0x00110000 \n!define SND_FILENAME    0x00020000\n!define SND_RESOURCE    0x00040004 \n!define SND_PURGE           0x0040  \n!define SND_APPLICATION     0x0080  \n\n; == Windows ==\n\n!define WS_OVERLAPPED       0x00000000\n!define WS_POPUP            0x80000000\n!define WS_CHILD            0x40000000\n!define WS_MINIMIZE         0x20000000\n!define WS_VISIBLE          0x10000000\n!define WS_DISABLED         0x08000000\n!define WS_CLIPSIBLINGS     0x04000000\n!define WS_CLIPCHILDREN     0x02000000\n!define WS_MAXIMIZE         0x01000000\n!define WS_CAPTION          0x00C00000    \n!define WS_BORDER           0x00800000\n!define WS_DLGFRAME         0x00400000\n!define WS_VSCROLL          0x00200000\n!define WS_HSCROLL          0x00100000\n!define WS_SYSMENU          0x00080000\n!define WS_THICKFRAME       0x00040000\n!define WS_GROUP            0x00020000\n!define WS_TABSTOP          0x00010000\n!define WS_MINIMIZEBOX      0x00020000\n!define WS_MAXIMIZEBOX      0x00010000\n!define WS_TILED            ${WS_OVERLAPPED}\n!define WS_ICONIC           ${WS_MINIMIZE}\n!define WS_SIZEBOX          ${WS_THICKFRAME}\n!define WS_OVERLAPPEDWINDOW 0x00CF0000\n!define WS_TILEDWINDOW      ${WS_OVERLAPPEDWINDOW}\n!define WS_POPUPWINDOW      0x80880000\n!define WS_CHILDWINDOW      ${WS_CHILD}\n!define WS_EX_DLGMODALFRAME     0x00000001\n!define WS_EX_NOPARENTNOTIFY    0x00000004\n!define WS_EX_TOPMOST           0x00000008\n!define WS_EX_ACCEPTFILES       0x00000010\n!define WS_EX_TRANSPARENT       0x00000020\n!define WS_EX_MDICHILD          0x00000040\n!define WS_EX_TOOLWINDOW        0x00000080\n!define WS_EX_WINDOWEDGE        0x00000100\n!define WS_EX_CLIENTEDGE        0x00000200\n!define WS_EX_CONTEXTHELP       0x00000400\n!define WS_EX_RIGHT             0x00001000\n!define WS_EX_LEFT              0x00000000\n!define WS_EX_RTLREADING        0x00002000\n!define WS_EX_LTRREADING        0x00000000\n!define WS_EX_LEFTSCROLLBAR     0x00004000\n!define WS_EX_RIGHTSCROLLBAR    0x00000000\n!define WS_EX_CONTROLPARENT     0x00010000\n!define WS_EX_STATICEDGE        0x00020000\n!define WS_EX_APPWINDOW         0x00040000\n!define WS_EX_OVERLAPPEDWINDOW  0x00000300\n!define WS_EX_PALETTEWINDOW     0x00000188\n!define WS_EX_LAYERED           0x00080000\n!define WS_EX_NOINHERITLAYOUT   0x00100000 \n!define WS_EX_LAYOUTRTL         0x00400000 \n!define WS_EX_COMPOSITED        0x02000000\n!define WS_EX_NOACTIVATE        0x08000000\n\n\n; == System Parameters Info ==\n\n!define SPI_GETWORKAREA             0x0030\n\n; == Window Long Offsets ==\n\n!define GWL_WNDPROC         -4\n!define GWL_HINSTANCE       -6\n!define GWL_HWNDPARENT      -8\n!define GWL_STYLE           -16\n!define GWL_EXSTYLE         -20\n!define GWL_USERDATA        -21\n!define GWL_ID              -12\n\n; == Window swap ==\n\n!define SWP_NOSIZE          0x0001\n!define SWP_NOMOVE          0x0002\n!define SWP_NOZORDER        0x0004\n!define SWP_NOREDRAW        0x0008\n!define SWP_NOACTIVATE      0x0010\n!define SWP_FRAMECHANGED    0x0020  \n!define SWP_SHOWWINDOW      0x0040\n!define SWP_HIDEWINDOW      0x0080\n!define SWP_NOCOPYBITS      0x0100\n!define SWP_NOOWNERZORDER   0x0200  \n!define SWP_NOSENDCHANGING  0x0400  \n\n!define SWP_DRAWFRAME       ${SWP_FRAMECHANGED}\n!define SWP_NOREPOSITION    ${SWP_NOOWNERZORDER}\n!define SWP_DEFERERASE      0x2000\n!define SWP_ASYNCWINDOWPOS  0x4000\n\n; == Bit Copy ==\n\n!define SRCCOPY             0x00CC0020 \n!define SRCPAINT            0x00EE0086 \n!define SRCAND              0x008800C6 \n!define SRCINVERT           0x00660046 \n!define SRCERASE            0x00440328 \n!define NOTSRCCOPY          0x00330008 \n!define NOTSRCERASE         0x001100A6 \n!define MERGECOPY           0x00C000CA \n!define MERGEPAINT          0x00BB0226 \n!define PATCOPY             0x00F00021 \n!define PATPAINT            0x00FB0A09 \n!define PATINVERT           0x005A0049 \n!define DSTINVERT           0x00550009 \n!define BLACKNESS           0x00000042 \n!define WHITENESS           0x00FF0062 \n\n; == Message Box ==\n\n!define MB_OK                       0x00000000\n!define MB_OKCANCEL                 0x00000001\n!define MB_ABORTRETRYIGNORE         0x00000002\n!define MB_YESNOCANCEL              0x00000003\n!define MB_YESNO                    0x00000004\n!define MB_RETRYCANCEL              0x00000005\n!define MB_CANCELTRYCONTINUE        0x00000006\n!define MB_ICONHAND                 0x00000010\n!define MB_ICONQUESTION             0x00000020\n!define MB_ICONEXCLAMATION          0x00000030\n!define MB_ICONASTERISK             0x00000040\n!define MB_USERICON                 0x00000080\n!define MB_ICONWARNING              ${MB_ICONEXCLAMATION}\n!define MB_ICONERROR                ${MB_ICONHAND}\n\n!define MB_ICONINFORMATION          ${MB_ICONASTERISK}\n!define MB_ICONSTOP                 ${MB_ICONHAND}\n\n!define MB_DEFBUTTON1               0x00000000\n!define MB_DEFBUTTON2               0x00000100\n!define MB_DEFBUTTON3               0x00000200\n!define MB_DEFBUTTON4               0x00000300\n\n!define MB_APPLMODAL                0x00000000\n!define MB_SYSTEMMODAL              0x00001000\n!define MB_TASKMODAL                0x00002000\n!define MB_HELP                     0x00004000\n\n!define MB_NOFOCUS                  0x00008000\n!define MB_SETFOREGROUND            0x00010000\n!define MB_DEFAULT_DESKTOP_ONLY     0x00020000\n\n!define MB_TOPMOST                  0x00040000\n!define MB_RIGHT                    0x00080000\n!define MB_RTLREADING               0x00100000\n\n; == Drive type constants ==\n\n!define DRIVE_UNKNOWN     0\n!define DRIVE_NO_ROOT_DIR 1\n!define DRIVE_REMOVABLE   2\n!define DRIVE_FIXED       3\n!define DRIVE_REMOTE      4\n!define DRIVE_CDROM       5\n!define DRIVE_RAMDISK     6\n\n; == Callbacks ==\n\n!macro SINGLE_CALLBACK CHKN RES INDEX FUNC\nCheckCB_${CHKN}:\n        Pop ${RES}\n        StrCmp ${RES} \"callback${INDEX}\" 0 ExitCB_${CHKN}\n        Call ${FUNC}\n        Goto CheckCB_${CHKN}\nExitCB_${CHKN}:\n!macroend\n\n!verbose 4\n\n!endif"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/System/System.nsi",
    "content": "; This is just an example of System Plugin\n; \n; (c) brainsucker, 2002\n; (r) BSForce\n\nName \"System Plugin Example\"\nOutFile \"System.exe\"\n\n!include \"SysFunc.nsh\"\n\nSection \"ThisNameIsIgnoredSoWhyBother?\"\n     SetOutPath $TEMP\n\n     ; ----- Sample 1 ----- Message box with custom icon -----\n\n     ; there are no default beeps for custom message boxes, use sysMessageBeep\n     ; in case you need it (see next message box example)\n     !insertmacro smMessageBox \"i 0\" \"Message box with custom icon!\" \"System Example 1a\" ${MB_OK} \"i 103\"\n     ; i 0 - installer exe as module\n     ; i 103 - icon ID\n\n     ; The same example but using icon from resource.dll.\n     ; You could use this dll for storing your resources, just replace FAR icon\n     ; with something you really need.   \n     File \"Resource.dll\"\n     System::Call '${sysMessageBeep} (${MB_ICONHAND})'  ; custom beep\n     !insertmacro smMessageBox \"`$TEMP\\resource.dll`\" \"Message box with custom icon from resource.dll!\" \"System Example 1b\" ${MB_OKCANCEL} \"i 103\"\n     Delete $TEMP\\resource.dll\n\n     ; ----- Sample 2 ----- Fixed disks size/space -----\n\n     StrCpy $7 '               Disk,                Size,                Free,                Free for user:$\\n$\\n'\n\n     ; Memory for paths   \n     System::Alloc 1024\n     Pop $1\n     ; Get drives   \n     System::Call '${sysGetLogicalDriveStrings}(1024, r1)'\nenumok:\n     ; One more drive?   \n     System::Call '${syslstrlen}(i r1) .r2'\n     IntCmp $2 0 enumex\n\n     ; Is it DRIVE_FIXED?\n     System::Call '${sysGetDriveType} (i r1) .r3'\n     StrCmp $3 ${DRIVE_FIXED} 0 enumnext\n\n     ; Drive space   \n     System::Call '${sysGetDiskFreeSpaceEx}(i r1, .r3, .r4, .r5)'\n\n     ; Pretty KBs will be saved on stack\n     System::Int64Op $3 / 1048576\n     System::Int64Op $5 / 1048576\n     System::Int64Op $4 / 1048576\n\n     ; Get pretty drive path string   \n     System::Call '*$1(&t1024 .r6)'\n     System::Call '${syswsprintf} (.r7, \"%s%20s    %20s mb    %20s mb    %20s mb$\\n\", tr7, tr6, ts, ts, ts)'\n\nenumnext:\n     ; Next drive path       \n     IntOp $1 $1 + $2\n     IntOp $1 $1 + 1\n     goto enumok   \nenumex: ; End of drives or user cancel\n     ; Free memory for paths   \n     System::Free $1   \n\n     ; Message box      \n     System::Call '${sysMessageBox}($HWNDPARENT, s, \"System Example 2\", ${MB_OKCANCEL})' \"$7\"\n\n     ; ----- Sample 3 ----- Direct proc defenition -----\n\n     ; Direct specification demo\n     System::Call 'user32::MessageBoxA(i $HWNDPARENT, t \"Just direct MessageBoxA specification demo ;)\", t \"System Example 3\", i ${MB_OK}) i.s'\n     Pop $0\n\n     ; ----- Sample 4 ----- Int64, mixed definition demo -----\n\n     ; Long int demo\n     StrCpy $2 \"12312312\"\n     StrCpy $3 \"12345678903\"\n     System::Int64Op $2 \"*\" $3\n     Pop $4\n\n     ; Cdecl demo (uses 3 defenitions (simple example))\n     System::Call \"${syswsprintf}(.R1, s,,, t, ir0) .R0 (,,tr2,tr3,$4_)\" \"Int64 ops and strange defenition demo, %s x %s == %s, and previous msgbox result = %d\"\n     MessageBox MB_OKCANCEL \"Cool: '$R1'\"\n\n     ; ----- Sample 5 ----- Small structure example -----\n\n     ; Create & Fill structure\n     System::Call \"*(i 123123123, &t10 'Hello', &i1 0x123dd, &i2 0xffeeddccaa) i.s\"\n     Pop $1\n     ; Read data from structure   \n     System::Call \"*$1(i .r2, &t10 .r3, &i1 .r4, &i2 .r5, &l0 .r6)\"\n     ; Show data and delete structure\n     MessageBox MB_OK \"Structure example: $\\nint == $2 $\\nstring == $3 $\\nbyte == $4 $\\nshort == $5 $\\nsize == $6\"\n     System::Free $1\n\n     ; ----- Sample 6 ----- systemGetFileSysTime demo -----\n     Call       GetInstallerExeName\n     pop        $0\n\n     !insertmacro smGetFileSysTime $0\n     System::Call '*$R0${stSYSTEMTIME}(.r1, .r2, .r3, .r4, .r5, .r6, .r7, .r8)'\n \n     MessageBox MB_OK \"GetFileSysTime example: file '$0', year $1, month $2, dow $3, day $4, hour $5, min $6, sec $7, ms $8\"     \n\n     ; free memory from SYSTEMTIME\n     System::Free $R0   \n\n     ; ----- Sample 7 ----- systemSplash -> Callbacks demonstration -----\n\n     ; Logo\n     File /oname=spltmp.bmp \"${NSISDIR}\\Contrib\\Graphics\\Header\\orange-nsis.bmp\"\n;     File /oname=spltmp.wav \"d:\\Windows\\Media\\tada.wav\"\n\n     ; I. systemSplash variant\n     !insertmacro smSystemSplash 2000 \"$TEMP\\spltmp\"\n\n     ; II. Splash Plugin variant\n;    splash::show 2000 $TEMP\\spltmp\n;    Pop $R0 ; $R0 has '1' if the user closed the splash screen early,\n\n     ; remove logo\n     Delete $TEMP\\spltmp.bmp\n;     Delete $TEMP\\spltmp.wav\n\n     ; Display splash result\n     pop $0\n     MessageBox MB_OK \"Splash (callbacks) demo result $R0\"\n\nSectionEnd \n\n; eof\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/TextFunc.ini",
    "content": "[Settings]\nNumFields=15\nNextButtonText=&Enter\n\n[Field 1]\nType=Droplist\nFlags=NOTIFY\nState=1. LineFind\nListItems=1. LineFind|2. LineRead|3. FileReadFromEnd|4. LineSum|5. FileJoin|6. TextCompare|7. ConfigRead|8. ConfigWrite|9. FileRecode\nLeft=44\nRight=139\nTop=9\nBottom=100\n\n[Field 2]\nType=FileRequest\nLeft=44\nRight=-17\nTop=30\nBottom=41\n\n[Field 3]\nType=FileRequest\nLeft=44\nRight=-17\nTop=46\nBottom=57\n\n[Field 4]\nType=FileRequest\nState=3:-1\nLeft=44\nRight=-17\nTop=62\nBottom=75\n\n[Field 5]\nType=Droplist\nFlags=NOTIFY\nState=Example1  (delete first two symbols)\nListItems=Example1  (delete first two symbols)|Example2  (show changed lines)|Example3  (delete lines)|Example4  (insert lines)|Example5  (replace in file - WordFunc.nsh required)|Example6  (line string to cut or delete)|Example7  (read lines)\nLeft=44\nRight=-36\nTop=81\nBottom=155\n\n[Field 6]\nType=Droplist\nFlags=NOTIFY\nState=Example1  (Different or Equal)\nListItems=Example1  (Different or Equal)|Example2  (Compare line-by-line - Different)|Example3  (Compare line-by-line - Equal)|Example4  (Compare all lines - Different)|Example5  (Compare all lines - Equal)\nLeft=44\nRight=-36\nTop=81\nBottom=140\n\n[Field 7]\nType=Droplist\nState=FileReadFromEndCallback\nListItems=FileReadFromEndCallback\nLeft=44\nRight=-36\nTop=81\nBottom=92\n\n[Field 8]\nType=Text\nFlags=READONLY\nLeft=9\nRight=-36\nTop=108\nBottom=120\n\n[Field 9]\nType=Button\nText=Edit\nFlags=NOTIFY\nLeft=234\nRight=256\nTop=81\nBottom=92\n\n[Field 10]\nType=Button\nText=Log\nFlags=NOTIFY|DISABLED\nLeft=234\nRight=256\nTop=108\nBottom=120\n\n[Field 11]\nType=Label\nText=InputFile\nLeft=10\nRight=43\nTop=32\nBottom=44\n\n[Field 12]\nType=Label\nText=OutputFile\nLeft=10\nRight=43\nTop=48\nBottom=60\n\n[Field 13]\nType=Label\nText=Range\nLeft=10\nRight=44\nTop=65\nBottom=75\n\n[Field 14]\nType=Label\nText=Function\nLeft=10\nRight=43\nTop=81\nBottom=92\n\n[Field 15]\nType=Label\nText=Result:\nLeft=10\nRight=229\nTop=97\nBottom=105\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/TextFunc.nsi",
    "content": ";_____________________________________________________________________________\n;\n;                          Text Functions\n;_____________________________________________________________________________\n;\n; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)\n\nName \"Text Functions\"\nOutFile \"TextFunc.exe\"\nCaption \"$(^Name)\"\nXPStyle on\nRequestExecutionLevel user\n\n!include \"WinMessages.nsh\"\n!include \"TextFunc.nsh\"\n\nVar HWND\nVar INI\nVar LOG\nVar PROJECT\nVar CALLBACK\nVar VIEW\nVar FUNCTION\nVar LINEFIND1\nVar LINEFIND2\nVar LINEFIND3\nVar LINEREAD1\nVar LINEREAD2\nVar FILEREADFROMEND1\nVar LINESUM1\nVar FILEJOIN1\nVar FILEJOIN2\nVar FILEJOIN3\nVar TEXTCOMPARE1\nVar TEXTCOMPARE2\nVar TEXTCOMPARE3\nVar CONFIGREAD1\nVar CONFIGREAD2\nVar CONFIGWRITE1\nVar CONFIGWRITE2\nVar CONFIGWRITE3\nVar FILERECODE1\nVar FILERECODE2\n\nPage Custom ShowCustom LeaveCustom\n\nFunction ShowCustom\n\tInstallOptions::initDialog \"$INI\"\n\tPop $hwnd\n\tGetDlgItem $0 $HWND 1206\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1208\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1209\n\tShowWindow $0 0\n\tStrCpy $FUNCTION LineFind\n\tStrCpy $LINEREAD2 10\n\tStrCpy $TEXTCOMPARE3 FastDiff\n\tStrCpy $CONFIGREAD1 \"$WINDIR\\system.ini\"\n\tStrCpy $CONFIGREAD2 \"shell=\"\n\tStrCpy $FILERECODE2 CharToOem\n\tInstallOptions::show\n\tPop $0\nFunctionEnd\n\nFunction LeaveCustom\n\tReadINIStr $0 $INI \"Settings\" \"State\"\n \tReadINIStr $R0 $INI \"Field 1\" \"State\" \t\n\tReadINIStr $R1 $INI \"Field 2\" \"State\"\n \tReadINIStr $R2 $INI \"Field 3\" \"State\"\n \tReadINIStr $R3 $INI \"Field 4\" \"State\"\n \tReadINIStr $R4 $INI \"Field 5\" \"State\"\n \tReadINIStr $R5 $INI \"Field 6\" \"State\"\n\tStrCpy $R4 $R4 8\n\tStrCpy $R5 $R5 8\n\tStrCpy $6 0\n\tStrCpy $7 '$${'\n\tStrCpy $8 'r'\n\tStrCpy $9 'n'\n\n\tStrCmp $0 10 Log\n\tStrCmp $0 9 ViewOrEdit\n\tStrCmp $0 0 Enter\n\tgoto MainSend\n\n\tLog:\n\tExec 'notepad.exe $LOG'\n\tAbort\n\n\tViewOrEdit:\n\tStrCmp $FUNCTION FileReadFromEnd 0 Edit\n\tStrCmp $VIEW '' 0 ViewFileReadFromEndCallback\n\tGetTempFileName $VIEW $PLUGINSDIR\n\tStrCpy $7 '$$'\n\tFileOpen $0 $VIEW w\n\tFileWrite $0 `Function FileReadFromEndCallback$\\r$\\n`\n\tFileWrite $0 `\tMessageBox MB_OKCANCEL '$7$$9       \"Line\"=[$$9]$7\\$9$7$$8           \"#\"=[$$8]$7\\$9$7$$7          \"-#\"=[$$7]' IDOK +2$\\r$\\n`\n\tFileWrite $0 `\tStrCpy $$R0 StopFileReadFromEnd$\\r$\\n$\\r$\\n`\n\tFileWrite $0 `\tPush $$R0$\\r$\\n`\n\tFileWrite $0 `FunctionEnd$\\r$\\n`\n\tFileClose $0\n\tStrCpy $7 '$${'\n\tSetFileAttributes $VIEW READONLY\n\tViewFileReadFromEndCallback:\n\tExec 'notepad.exe $VIEW'\n\tAbort\n\n\tEdit:\n\tStrCmp $CALLBACK '' +5\n\tStrCmp $6$R6 '0$R0$R4$R5' showproject\n\tStrCmp $R6 '$R0$R4$R5' +3\n\tDelete $CALLBACK\n\tStrCpy $CALLBACK ''\n\tStrCpy $R6 '$R0$R4$R5'\n\n\t#Project#\n\tStrCmp $6$R0 \"01. LineFind\" 0 +5\n\tIfFileExists $CALLBACK +2\n\tGetTempFileName $CALLBACK $PLUGINSDIR\n\tFileOpen $0 $CALLBACK w\n\tgoto function\n\tIfFileExists $PROJECT +2\n\tGetTempFileName $PROJECT $PLUGINSDIR\n\tFileOpen $0 $PROJECT w\n\n\t#Name#\n\tFileWrite $0 'Name \"$FUNCTION\"$\\r$\\n'\n\tFileWrite $0 'OutFile \"$PROJECT.exe\"$\\r$\\n$\\r$\\n'\n\n\t#!include#\n\tStrCmp $R0$R4 '1. LineFindExample5' 0 TextFuncInclude\n\tIfFileExists '$EXEDIR\\WordFunc.nsh' 0 +3\n\tFileWrite $0 '!include \"$EXEDIR\\WordFunc.nsh\"$\\r$\\n'\n\tgoto +2\n\tFileWrite $0 '!include \"WordFunc.nsh\"$\\r$\\n'\n\tFileWrite $0 '!insertmacro WordFind$\\r$\\n'\n\tFileWrite $0 '!insertmacro WordFindS$\\r$\\n'\n\tFileWrite $0 '!insertmacro WordFind2X$\\r$\\n'\n\tFileWrite $0 '!insertmacro WordFind2XS$\\r$\\n'\n\tFileWrite $0 '!insertmacro WordFind3X$\\r$\\n'\n\tFileWrite $0 '!insertmacro WordFind3XS$\\r$\\n'\n\tFileWrite $0 '!insertmacro WordReplace$\\r$\\n'\n\tFileWrite $0 '!insertmacro WordReplaceS$\\r$\\n'\n\tFileWrite $0 '!insertmacro WordAdd$\\r$\\n'\n\tFileWrite $0 '!insertmacro WordAddS$\\r$\\n'\n\tFileWrite $0 '!insertmacro WordInsert$\\r$\\n'\n\tFileWrite $0 '!insertmacro WordInsertS$\\r$\\n'\n\tFileWrite $0 '!insertmacro StrFilter$\\r$\\n'\n\tFileWrite $0 '!insertmacro StrFilterS$\\r$\\n'\n\tTextFuncInclude:\n\tIfFileExists '$EXEDIR\\TextFunc.nsh' 0 +3\n\tFileWrite $0 '!include \"$EXEDIR\\TextFunc.nsh\"$\\r$\\n'\n\tgoto +2\n\tFileWrite $0 '!include \"TextFunc.nsh\"$\\r$\\n'\n\tFileWrite $0 '!insertmacro $FUNCTION$\\r$\\n'\n\tStrCmp $FUNCTION TextCompare +2\n\tFileWrite $0 '!insertmacro TrimNewLines$\\r$\\n'\n\n\t#Section#\n\tFileWrite $0 '$\\r$\\nSection -empty$\\r$\\n'\n\tFileWrite $0 'SectionEnd$\\r$\\n$\\r$\\n'\n\n\t#Function .onInit#\n\tFileWrite $0 'Function .onInit$\\r$\\n'\n\tStrCmp $R0$R5 \"6. TextCompareExample1\" 0 TextCompareExample235\n\tFileWrite $0 '\tStrCpy $$R0 \"\"$\\r$\\n'\n\tFileWrite $0 '\t$7TextCompare} \"$R1\" \"$R2\" \"$R3\" \"$R5\"$\\r$\\n'\n\tFileWrite $0 '\tIfErrors error$\\r$\\n'\n\tFileWrite $0 '\tStrCmp $$R0 NotEqual 0 +2$\\r$\\n'\n\tFileWrite $0 '\tMessageBox MB_OK \"             Files differ\" IDOK +2$\\r$\\n'\n\tFileWrite $0 '\tMessageBox MB_OK \"           Files identical\"$\\r$\\n'\n\tFileWrite $0 '\tgoto end$\\r$\\n$\\r$\\n'\n\tgoto endoninit\n\tTextCompareExample235:\n\tStrCmp $R0$R5 \"6. TextCompareExample2\" +3\n\tStrCmp $R0$R5 \"6. TextCompareExample3\" +2\n\tStrCmp $R0$R5 \"6. TextCompareExample5\" 0 TextCompareExample4\n\tFileWrite $0 '\tStrCpy $$R0 \"$R1\"$\\r$\\n'\n\tFileWrite $0 '\tStrCpy $$R1 \"$R2\"$\\r$\\n$\\r$\\n'\n\tFileWrite $0 '\tGetTempFileName $$R2$\\r$\\n'\n\tFileWrite $0 '\tFileOpen $$R3 $$R2 w$\\r$\\n'\n\tFileWrite $0 '\tFileWrite $$R3 \"$$R0 | $$R1$$\\$8$$\\$9\"$\\r$\\n'\n\tFileWrite $0 '\t$7TextCompare} \"$$R0\" \"$$R1\" \"$R3\" \"$R5\"$\\r$\\n'\n\tFileWrite $0 '\tIfErrors error$\\r$\\n'\n\tFileWrite $0 '\tExec \"notepad.exe $$R2\"$\\r$\\n'\n\tFileWrite $0 '\tgoto end$\\r$\\n$\\r$\\n'\n\tgoto endoninit\n\tTextCompareExample4:\n\tStrCmp $R0$R5 \"6. TextCompareExample4\" 0 LineFindExample123456\n\tFileWrite $0 '\tStrCpy $$R0 \"$R1\"$\\r$\\n'\n\tFileWrite $0 '\tStrCpy $$R1 \"$R2\"$\\r$\\n$\\r$\\n'\n\tFileWrite $0 '\tGetTempFileName $$R2$\\r$\\n'\n\tFileWrite $0 '\tFileOpen $$R3 $$R2 w$\\r$\\n'\n\tFileWrite $0 '\tFileWrite $$R3 \"$$R0 | $$R1$$\\$8$$\\$9\"$\\r$\\n'\n\tFileWrite $0 '\t$7TextCompare} \"$$R0\" \"$$R1\" \"$R3\" \"$R5\"$\\r$\\n'\n\tFileWrite $0 '\tIfErrors error$\\r$\\n'\n\tFileWrite $0 '\tFileWrite $$R3 \"$$\\$8$$\\$9$$R1 | $$R0$$\\$8$$\\$9\"$\\r$\\n'\n\tFileWrite $0 '\t$7TextCompare} \"$$R1\" \"$$R0\" \"$R3\" \"$R5\"$\\r$\\n'\n\tFileWrite $0 '\tFileClose $$R3$\\r$\\n'\n\tFileWrite $0 '\tIfErrors error$\\r$\\n'\n\tFileWrite $0 '\tExec \"notepad.exe $$R2\"$\\r$\\n$\\r$\\n'\n\tFileWrite $0 '\tgoto end$\\r$\\n$\\r$\\n'\n\tgoto endoninit\n\tLineFindExample123456:\n\tFileWrite $0 '\t$7$FUNCTION} \"$R1\" \"$R2\" \"$R3\" \"$R4\"$\\r$\\n'\n\tFileWrite $0 '\tIfErrors error$\\r$\\n'\n\tFileWrite $0 '\tMessageBox MB_YESNO \"          Open output file?\" IDNO end$\\r$\\n'\n\tFileWrite $0 '\tStrCmp \"$R2\" \"\" 0 +3$\\r$\\n'\n\tFileWrite $0 `\tExec 'notepad.exe \"$R1\"'$\\r$\\n`\n\tFileWrite $0 '\tgoto end$\\r$\\n'\n\tFileWrite $0 '\tSearchPath $$R2 \"$R2\"$\\r$\\n'\n\tFileWrite $0 `\tExec 'notepad.exe \"$$R2\"'$\\r$\\n`\n\tFileWrite $0 '\tgoto end$\\r$\\n$\\r$\\n'\n\tendoninit:\n\tFileWrite $0 '\terror:$\\r$\\n'\n\tFileWrite $0 '\tMessageBox MB_OK \"Error\"$\\r$\\n$\\r$\\n'\n\tFileWrite $0 '\tend:$\\r$\\n'\n\tFileWrite $0 '\tQuit$\\r$\\n'\n\tFileWrite $0 'FunctionEnd$\\r$\\n$\\r$\\n'\n\t#FunctionEnd#\n\n\n\t#Function CallBack#\n\tStrCmp $CALLBACK '' 0 close\n\tfunction:\n\tStrCmp $R0 '1. LineFind' 0 +8\n\tFileWrite $0 'Function $R4$\\r$\\n'\n\tStrCmp $R4 \"Example1\" Example1LF\n\tStrCmp $R4 \"Example2\" Example2LF\n\tStrCmp $R4 \"Example3\" Example3LF\n\tStrCmp $R4 \"Example4\" Example4LF\n\tStrCmp $R4 \"Example5\" Example5LF\n\tStrCmp $R4 \"Example6\" Example6LF\n\n\tFileWrite $0 'Function $R5$\\r$\\n'\n\tStrCmp $R5 \"Example1\" Example1TC\n\tStrCmp $R5 \"Example2\" Example2TC\n\tStrCmp $R5 \"Example3\" Example3TC\n\tStrCmp $R5 \"Example4\" Example4TC\n\tStrCmp $R5 \"Example5\" Example3TC\n\n\tExample1LF:\n\tFileWrite $0 \"\t$7TrimNewLines} '$$R9' $$R9$\\r$\\n\"\n\tFileWrite $0 \"\tStrCpy $$R9 $$R9 '' 2       ;delete first two symbols$\\r$\\n\"\n\tFileWrite $0 \"\tStrCpy $$R9 '$$R9$$\\$8$$\\$9'$\\r$\\n$\\r$\\n\"\n\tgoto endwrite\n\tExample2LF:\n\tFileWrite $0 \"\t$7TrimNewLines} '$$R9' $$R9$\\r$\\n\"\n\tFileWrite $0 \"\tStrCpy $$R9 '$$R9   ~Changed line ($$R8)~$$\\$8$$\\$9'$\\r$\\n$\\r$\\n\"\n\tgoto endwrite\n\tExample3LF:\n\tFileWrite $0 \"\tStrCpy $$0 SkipWrite$\\r$\\n$\\r$\\n\"\n\tgoto endwrite\n\tExample4LF:\n\tFileWrite $0 \"\tFileWrite $$R4 '---First Line---$$\\$8$$\\$9'$\\r$\\n\"\n\tFileWrite $0 \"\tFileWrite $$R4 '---Second Line ...---$$\\$8$$\\$9'$\\r$\\n$\\r$\\n\"\n\tgoto endwrite\n\tExample5LF:\n\tFileWrite $0 \"\t; You can use:$\\r$\\n\"\n\tFileWrite $0 \"\t; $7WordFind}|$7WordFindS}|$7WordFind2X}|$7WordFind2XS}|$\\r$\\n\"\n\tFileWrite $0 \"\t; $7WordFind3X}|$7WordFind3XS}|$7WordReplace}|$7WordReplaceS}|$\\r$\\n\"\n\tFileWrite $0 \"\t; $7WordAdd}|$7WordAddS}|$7WordInsert}|$7WordInsertS}|$\\r$\\n\"\n\tFileWrite $0 \"\t; $7StrFilter}|$7StrFilterS}$\\r$\\n$\\r$\\n\"\n\tFileWrite $0 \"\t$7WordReplace} '$$R9' ' ' '_' '+*' $$R9$\\r$\\n$\\r$\\n\"\n\tgoto endwrite\n\tExample6LF:\n\tFileWrite $0 '\t;(Cut lines from a line to another line (also including that line))$\\r$\\n'\n\tFileWrite $0 '\tStrCmp $$R0 finish stop$\\r$\\n'\n\tFileWrite $0 '\tStrCmp $$R0 start finish$\\r$\\n'\n\tFileWrite $0 '\tStrCmp $$R9 \"Start Line$$\\$8$$\\$9\" 0 skip$\\r$\\n'\n\tFileWrite $0 '\tStrCpy $$R0 start$\\r$\\n'\n\tFileWrite $0 '\tStrCpy $$R1 $$R9$\\r$\\n'\n\tFileWrite $0 '\tgoto code$\\r$\\n'\n\tFileWrite $0 '\tfinish:$\\r$\\n'\n\tFileWrite $0 '\tStrCmp $$R9 \"Finish Line$$\\$8$$\\$9\" 0 code$\\r$\\n'\n\tFileWrite $0 '\tStrCpy $$R0 finish$\\r$\\n'\n\tFileWrite $0 '\tStrCpy $$R2 $$R8$\\r$\\n'\n\tFileWrite $0 '\tgoto code$\\r$\\n'\n\tFileWrite $0 '\tskip:$\\r$\\n'\n\tFileWrite $0 '\tStrCpy $$0 SkipWrite$\\r$\\n'\n\tFileWrite $0 '\tgoto output$\\r$\\n'\n\tFileWrite $0 '\tstop:$\\r$\\n'\n\tFileWrite $0 '\tStrCpy $$0 StopLineFind$\\r$\\n'\n\tFileWrite $0 '\tgoto output$\\r$\\n$\\r$\\n'\n\tFileWrite $0 '\t;;(Delete lines from a line to another line (also including that line))$\\r$\\n'\n\tFileWrite $0 '\t; StrCmp $$R0 finish code$\\r$\\n'\n\tFileWrite $0 '\t; StrCmp $$R0 start finish$\\r$\\n'\n\tFileWrite $0 '\t; StrCmp $$R9 \"Start Line$$\\$8$$\\$9\" 0 code$\\r$\\n'\n\tFileWrite $0 '\t; StrCpy $$R0 start$\\r$\\n'\n\tFileWrite $0 '\t; StrCpy $$R1 $$R8$\\r$\\n'\n\tFileWrite $0 '\t; goto skip$\\r$\\n'\n\tFileWrite $0 '\t; finish:$\\r$\\n'\n\tFileWrite $0 '\t; StrCmp $$R9 \"Finish Line$$\\$8$$\\$9\" 0 skip$\\r$\\n'\n\tFileWrite $0 '\t; StrCpy $$R0 finish$\\r$\\n'\n\tFileWrite $0 '\t; StrCpy $$R2 $$R8$\\r$\\n'\n\tFileWrite $0 '\t; skip:$\\r$\\n'\n\tFileWrite $0 '\t; StrCpy $$0 SkipWrite$\\r$\\n'\n\tFileWrite $0 '\t; goto output$\\r$\\n$\\r$\\n'\n\tFileWrite $0 '\tcode:$\\r$\\n'\n\tFileWrite $0 '\t;...$\\r$\\n$\\r$\\n'\n\tFileWrite $0 '\toutput:$\\r$\\n'\n\tgoto endwrite\n\tExample1TC:\n\tFileWrite $0 \"\tStrCpy $$R0 NotEqual$\\r$\\n\"\n\tFileWrite $0 \"\tStrCpy $$0 StopTextCompare$\\r$\\n$\\r$\\n\"\n\tgoto endwrite\n\tExample2TC:\n\tFileWrite $0 \"\tFileWrite $$R3 '$$8=$$9'$\\r$\\n\"\n\tFileWrite $0 \"\tFileWrite $$R3 '$$6=$$7$$\\$8$$\\$9'$\\r$\\n$\\r$\\n\"\n\tgoto endwrite\n\tExample3TC:\n\tFileWrite $0 \"\tFileWrite $$R3 '$$8|$$6=$$9'$\\r$\\n$\\r$\\n\"\n\tgoto endwrite\n\tExample4TC:\n\tFileWrite $0 \"\tFileWrite $$R3 '$$8=$$9'$\\r$\\n$\\r$\\n\"\n\tgoto endwrite\n\tendwrite:\n\tFileWrite $0 '\tPush $$0$\\r$\\n'\n\tFileWrite $0 'FunctionEnd$\\r$\\n'\n\tclose:\n\tFileClose $0\n\tgoto $6\n\t#FunctionEnd#\n\n\tshowproject:\n\tStrCmp $R0 '1. LineFind' 0 +3\n\tExecWait 'notepad.exe $CALLBACK'\n\tgoto +4\n\tSetFileAttributes $PROJECT READONLY\n\tExecWait 'notepad.exe $PROJECT'\n\tSetFileAttributes $PROJECT NORMAL\n\tAbort\n\n\tMainSend:\n\tGetDlgItem $0 $HWND 1210\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $0 $HWND 1203\n\tShowWindow $0 1\n\tEnableWindow $0 1\n\tGetDlgItem $0 $HWND 1204\n\tShowWindow $0 1\n\tEnableWindow $0 1\n\tGetDlgItem $0 $HWND 1205\n\tEnableWindow $0 1\n\tGetDlgItem $0 $HWND 1206\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1207\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1208\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1209\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1211\n\tEnableWindow $0 1\n\n\tStrCmp $FUNCTION LineFind 0 +5\n\tStrCpy $LINEFIND1 $R1\n\tStrCpy $LINEFIND2 $R2\n\tStrCpy $LINEFIND3 $R3\n\tgoto LineFindSend\n\tStrCmp $FUNCTION LineRead 0 +4\n\tStrCpy $LINEREAD1 $R1\n\tStrCpy $LINEREAD2 $R2\n\tgoto LineFindSend\n\tStrCmp $FUNCTION FileReadFromEnd 0 +3\n\tStrCpy $FILEREADFROMEND1 $R1\n\tgoto LineFindSend\n\tStrCmp $FUNCTION LineSum 0 +3\n\tStrCpy $LINESUM1 $R1\n\tgoto LineFindSend\n\tStrCmp $FUNCTION FileJoin 0 +5\n\tStrCpy $FILEJOIN1 $R1\n\tStrCpy $FILEJOIN2 $R2\n\tStrCpy $FILEJOIN3 $R3\n\tgoto LineFindSend\n\tStrCmp $FUNCTION TextCompare 0 +5\n\tStrCpy $TEXTCOMPARE1 $R1\n\tStrCpy $TEXTCOMPARE2 $R2\n\tStrCpy $TEXTCOMPARE3 $R3\n\tgoto LineFindSend\n\tStrCmp $FUNCTION ConfigRead 0 +4\n\tStrCpy $CONFIGREAD1 $R1\n\tStrCpy $CONFIGREAD2 $R2\n\tgoto LineFindSend\n\tStrCmp $FUNCTION ConfigWrite 0 +5\n\tStrCpy $CONFIGWRITE1 $R1\n\tStrCpy $CONFIGWRITE2 $R2\n\tStrCpy $CONFIGWRITE3 $R3\n\tgoto LineFindSend\n\tStrCmp $FUNCTION FileRecode 0 +3\n\tStrCpy $FILERECODE1 $R1\n\tStrCpy $FILERECODE2 $R2\n\n\tLineFindSend:\n\tStrCmp $R0 \"1. LineFind\" 0 LineReadSend\n\tStrCmp $FUNCTION LineFind 0 LineFindSend2\n\tStrCmp $R4 \"Example1\" 0 +3\n\tStrCpy $LINEFIND3 \"3:-1\"\n\tgoto LineFindSend2\n\tStrCmp $R4 \"Example2\" 0 +3\n\tStrCpy $LINEFIND3 \"{5:12 15 -6:-5 -1}\"\n\tgoto LineFindSend2\n\tStrCmp $R4 \"Example3\" 0 +3\n\tStrCpy $LINEFIND3 \"2:3 10:-5 -3:-2\"\n\tgoto LineFindSend2\n\tStrCmp $R4 \"Example4\" 0 +3\n\tStrCpy $LINEFIND3 \"10\"\n\tgoto LineFindSend2\n\tStrCmp $R4 \"Example5\" 0 +3\n\tStrCpy $LINEFIND3 \"1:-1\"\n\tgoto LineFindSend2\n\tStrCmp $R4 \"Example6\" 0 +3\n\tStrCpy $LINEFIND3 \"\"\n\tgoto LineFindSend2\n\tStrCmp $R4 \"Example7\" 0 +2\n\tStrCpy $LINEFIND3 \"1:-1\"\n\n\tLineFindSend2:\n\tStrCpy $FUNCTION LineFind\n\tStrCmp $LINEFIND2 '/NUL' 0 +2\n\tStrCpy $LINEFIND2 ''\n\tGetDlgItem $0 $HWND 1201\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$LINEFIND1\"\n\tGetDlgItem $0 $HWND 1203\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$LINEFIND2\"\n\tGetDlgItem $0 $HWND 1205\n\tShowWindow $0 1\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$LINEFIND3\"\n\tGetDlgItem $0 $HWND 1207\n\tShowWindow $0 1\n\tGetDlgItem $0 $HWND 1211\n\tShowWindow $0 1\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:Edit\"\n\tGetDlgItem $0 $HWND 1212\n\tShowWindow $0 1\n\tStrCmp $LOG '' +2\n\tEnableWindow $0 1\n\tGetDlgItem $0 $HWND 1213\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:InputFile\"\n\tGetDlgItem $0 $HWND 1214\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:OutputFile\"\n\tGetDlgItem $0 $HWND 1215\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:Range\"\n\tGetDlgItem $0 $HWND 1216\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:Function\"\n\n\tStrCmp $R4 \"Example7\" 0 +9\n\tGetDlgItem $0 $HWND 1203\n\tEnableWindow $0 0\n\tSendMessage $0 ${WM_ENABLE} 1 0\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:/NUL\"\n\tGetDlgItem $0 $HWND 1204\n\tEnableWindow $0 0\n\tGetDlgItem $0 $HWND 1211\n\tEnableWindow $0 0\n\tabort\n\n\n\tLineReadSend:\n\tStrCmp $R0 \"2. LineRead\" 0 FileReadFromEndSend\n\tStrCpy $FUNCTION LineRead\n\tGetDlgItem $0 $HWND 1201\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$LINEREAD1\"\n\tGetDlgItem $0 $HWND 1203\n\tShowWindow $0 1\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$LINEREAD2\"\n\tGetDlgItem $0 $HWND 1204\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1205\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1211\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1212\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1213\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:InputFile\"\n\tGetDlgItem $0 $HWND 1214\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:Line #\"\n\tGetDlgItem $0 $HWND 1215\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $0 $HWND 1216\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tAbort\n\n\tFileReadFromEndSend:\n\tStrCmp $R0 \"3. FileReadFromEnd\" 0 LineSumSend\n\tStrCpy $FUNCTION FileReadFromEnd\n\tGetDlgItem $0 $HWND 1201\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$FILEREADFROMEND1\"\n\tGetDlgItem $0 $HWND 1203\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1204\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1205\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1209\n\tShowWindow $0 1\n\tGetDlgItem $0 $HWND 1211\n\tShowWindow $0 1\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:View\"\n\tGetDlgItem $0 $HWND 1212\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1213\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:InputFile\"\n\tGetDlgItem $0 $HWND 1214\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $0 $HWND 1215\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $0 $HWND 1216\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:Function\"\n\tAbort\n\n\tLineSumSend:\n\tStrCmp $R0 \"4. LineSum\" 0 FileJoinSend\n\tStrCpy $FUNCTION LineSum\n\tGetDlgItem $0 $HWND 1201\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$LINESUM1\"\n\tGetDlgItem $0 $HWND 1203\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1204\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1205\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1211\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1212\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1213\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:InputFile\"\n\tGetDlgItem $0 $HWND 1214\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $0 $HWND 1215\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $0 $HWND 1216\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tAbort\n\n\tFileJoinSend:\n\tStrCmp $R0 \"5. FileJoin\" 0 TextCompareSend\n\tStrCpy $FUNCTION FileJoin\n\tGetDlgItem $0 $HWND 1201\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$FILEJOIN1\"\n\tGetDlgItem $0 $HWND 1203\n\tShowWindow $0 1\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$FILEJOIN2\"\n\tGetDlgItem $0 $HWND 1204\n\tShowWindow $0 1\n\tGetDlgItem $0 $HWND 1205\n\tShowWindow $0 1\n\tEnableWindow $0 1\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$FILEJOIN3\"\n\tGetDlgItem $0 $HWND 1206\n\tShowWindow $0 1\n\tGetDlgItem $0 $HWND 1211\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1212\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1213\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:InputFile1\"\n\tGetDlgItem $0 $HWND 1214\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:InputFile2\"\n\tGetDlgItem $0 $HWND 1215\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:OutputFile\"\n\tGetDlgItem $0 $HWND 1216\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tAbort\n\n\tTextCompareSend:\n\tStrCmp $R0 \"6. TextCompare\" 0 ConfigReadSend\n\tStrCmp $FUNCTION TextCompare 0 TextCompareSend2\n\tStrCmp $R5 \"Example1\" 0 +3\n\tStrCpy $TEXTCOMPARE3 \"FastDiff\"\n\tgoto TextCompareSend2\n\tStrCmp $R5 \"Example2\" 0 +3\n\tStrCpy $TEXTCOMPARE3 \"FastDiff\"\n\tgoto TextCompareSend2\n\tStrCmp $R5 \"Example3\" 0 +3\n\tStrCpy $TEXTCOMPARE3 \"FastEqual\"\n\tgoto TextCompareSend2\n\tStrCmp $R5 \"Example4\" 0 +3\n\tStrCpy $TEXTCOMPARE3 \"SlowDiff\"\n\tgoto TextCompareSend2\n\tStrCmp $R5 \"Example5\" 0 +2\n\tStrCpy $TEXTCOMPARE3 \"SlowEqual\"\n\n\tTextCompareSend2:\n\tStrCpy $FUNCTION TextCompare\n\tGetDlgItem $0 $HWND 1201\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$TEXTCOMPARE1\"\n\tGetDlgItem $0 $HWND 1203\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$TEXTCOMPARE2\"\n\tGetDlgItem $0 $HWND 1204\n\tShowWindow $0 1\n\tGetDlgItem $0 $HWND 1205\n\tShowWindow $0 1\n\tEnableWindow $0 0\n\tSendMessage $0 ${WM_ENABLE} 1 0\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$TEXTCOMPARE3\"\n\tGetDlgItem $0 $HWND 1208\n\tShowWindow $0 1\n\tGetDlgItem $0 $HWND 1211\n\tShowWindow $0 1\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:View\"\n\tGetDlgItem $0 $HWND 1212\n\tShowWindow $0 1\n\tGetDlgItem $0 $HWND 1213\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:TextFile1\"\n\tGetDlgItem $0 $HWND 1214\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:TextFile2\"\n\tGetDlgItem $0 $HWND 1215\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:Option\"\n\tGetDlgItem $0 $HWND 1216\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:Function\"\n\tabort\n\n\tConfigReadSend:\n\tStrCmp $R0 \"7. ConfigRead\" 0 ConfigWriteSend\n\tStrCpy $FUNCTION ConfigRead\n\tGetDlgItem $0 $HWND 1201\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$CONFIGREAD1\"\n\tGetDlgItem $0 $HWND 1203\n\tShowWindow $0 1\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$CONFIGREAD2\"\n\tGetDlgItem $0 $HWND 1204\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1205\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1211\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1212\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1213\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:InputFile\"\n\tGetDlgItem $0 $HWND 1214\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:Entry\"\n\tGetDlgItem $0 $HWND 1215\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $0 $HWND 1216\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tAbort\n\n\tConfigWriteSend:\n\tStrCmp $R0 \"8. ConfigWrite\" 0 FileRecodeSend\n\tStrCpy $FUNCTION ConfigWrite\n\tGetDlgItem $0 $HWND 1201\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$CONFIGWRITE1\"\n\tGetDlgItem $0 $HWND 1203\n\tShowWindow $0 1\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$CONFIGWRITE2\"\n\tGetDlgItem $0 $HWND 1204\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1205\n\tShowWindow $0 1\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$CONFIGWRITE3\"\n\tGetDlgItem $0 $HWND 1211\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1212\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1213\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:InputFile\"\n\tGetDlgItem $0 $HWND 1214\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:Entry\"\n\tGetDlgItem $0 $HWND 1215\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:Value\"\n\tGetDlgItem $0 $HWND 1216\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tAbort\n\n\tFileRecodeSend:\n\tStrCmp $R0 \"9. FileRecode\" 0 Abort\n\tStrCpy $FUNCTION FileRecode\n\tGetDlgItem $0 $HWND 1201\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$FILERECODE1\"\n\tGetDlgItem $0 $HWND 1203\n\tShowWindow $0 1\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:$FILERECODE2\"\n\tGetDlgItem $0 $HWND 1204\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1205\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1211\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1212\n\tShowWindow $0 0\n\tGetDlgItem $0 $HWND 1213\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:InputFile\"\n\tGetDlgItem $0 $HWND 1214\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:Format\"\n\tGetDlgItem $0 $HWND 1215\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $0 $HWND 1216\n\tSendMessage $0 ${WM_SETTEXT} 1 \"STR:\"\n\tAbort\n\n;=Enter=\n\tEnter:\n\tStrCmp $R1 '' 0 +3\n\tStrCpy $0 'Choose InputFile'\n\tgoto send\n\tIfFileExists $R1 +3\n\tStrCpy $0 'InputFile is not exist'\n\tgoto send\n\n\tStrCmp $R0 \"1. LineFind\" LineFindRead\n\tStrCmp $R0 \"2. LineRead\" LineRead\n\tStrCmp $R0 \"3. FileReadFromEnd\" FileReadFromEnd\n\tStrCmp $R0 \"4. LineSum\" LineSum\n\tStrCmp $R0 \"5. FileJoin\" FileJoin\n\tStrCmp $R0 \"6. TextCompare\" LineFind-TextCompare\n\tStrCmp $R0 \"7. ConfigRead\" ConfigRead\n\tStrCmp $R0 \"8. ConfigWrite\" ConfigWrite\n\tStrCmp $R0 \"9. FileRecode\" FileRecode\n\tAbort\n\n\tLineFindRead:\n\tStrCmp $R4 \"Example7\" 0 LineFind-TextCompare\n\t${LineFind} '$R1' '/NUL' '$R3' LineFindCallback\n\tIfErrors error\n\tStrCmp $R0 StopLineFind 0 done\n\tStrCpy $0 'stopped'\n\tgoto send\n\n\tLineFind-TextCompare:\n\tGetLabelAddress $6 LineFindBack\n\tgoto Edit\n\tLineFindBack:\n\tFileClose $0\n\tStrCmp $R0 \"6. TextCompare\" Compile\n\tStrCmp $CALLBACK '' Compile\n\t${FileJoin} \"$PROJECT\" \"$CALLBACK\" \"\"\n\n\tCompile:\n\tStrCmp $LOG '' 0 +4\n\tGetTempFileName $LOG $PLUGINSDIR\n\tGetDlgItem $0 $HWND 1212\n\tEnableWindow $0 1\n\tReadRegStr $0 HKLM \"SOFTWARE\\NSIS\" \"\"\n\tIfErrors 0 +2\n\tStrCpy $0 \"${NSISDIR}\"\n\tnsExec::Exec '\"$0\\makensis.exe\" /O$LOG $PROJECT'\n\tPop $0\n\tStrCmp $0 0 0 +6\n\tExecWait '$PROJECT.exe' $0\n\tDelete $PROJECT\n\tDelete $PROJECT.exe\n\tStrCpy $PROJECT ''\n\tgoto done\n\tMessageBox MB_YESNO|MB_ICONEXCLAMATION \"Compile error. Open log?\" IDNO +2\n\tExec 'notepad.exe $LOG'\n\tStrCpy $0 \"Compile Error\"\n\tgoto send\n\n\tLineRead:\n\t${LineRead} \"$R1\" \"$R2\" $0\n\tIfErrors error send\n\n\tFileReadFromEnd:\n\t${FileReadFromEnd} \"$R1\" \"FileReadFromEndCallback\"\n\tIfErrors error\n\tStrCmp $R0 StopFileReadFromEnd 0 done\n\tStrCpy $0 'stopped'\n\tgoto send\n\n\tLineSum:\n\t${LineSum} \"$R1\" $0\n\tIfErrors error send\n\n\tFileJoin:\n\t${FileJoin} \"$R1\" \"$R2\" \"$R3\"\n\tIfErrors error\n\tMessageBox MB_YESNO \"          Open output file?\" IDNO done\n\tStrCmp $R3 '' 0 +3\n\tExec '\"notepad.exe\" \"$R1\"'\n\tgoto done\n\tExec '\"notepad.exe\" \"$R3\"'\n\tgoto done\n\n\tConfigRead:\n\t${ConfigRead} \"$R1\" \"$R2\" $0\n\tIfErrors error send\n\n\tConfigWrite:\n\t${ConfigWrite} \"$R1\" \"$R2\" \"$R3\" $0\n\tIfErrors error\n\tMessageBox MB_YESNO \"          Open output file?\" IDNO send\n\tExec '\"notepad.exe\" \"$R1\"'\n\tgoto send\n\n\tFileRecode:\n\t${FileRecode} \"$R1\" \"$R2\"\n\tIfErrors error\n\tMessageBox MB_YESNO \"          Open output file?\" IDNO done\n\tExec '\"notepad.exe\" \"$R1\"'\n\tgoto done\n\n\terror:\n\tStrCpy $0 'error'\n\tgoto send\n\n\tdone:\n\tStrCpy $0 'Done'\n\n\tsend:\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$0\"\n\n\tabort:\n\tAbort\nFunctionEnd\n\nFunction LineFindCallback\n\tMessageBox MB_OKCANCEL '$$R9       \"Line\"=[$R9]$\\n$$R8           \"#\"=[$R8]$\\n$$R7          \"-#\"=[$R7]$\\n$$R6   \"Range\"=[$R6]$\\n$$R5     \"Read\"=[$R5]$\\n$$R4     \"Write\"=[$R4]' IDOK +2\n\tStrCpy $R0 StopLineFind\n\n\tPush $R0\nFunctionEnd\n\nFunction FileReadFromEndCallback\n\tMessageBox MB_OKCANCEL '$$9       \"Line\"=[$9]$\\n$$8           \"#\"=[$8]$\\n$$7          \"-#\"=[$7]' IDOK +2\n\tStrCpy $R0 StopFileReadFromEnd\n\n\tPush $R0\nFunctionEnd\n\nFunction .onInit\n\tInitPluginsDir\n\tGetTempFileName $INI $PLUGINSDIR\n\tFile /oname=$INI \"TextFunc.ini\"\nFunctionEnd\n\nPage instfiles\n\nSection -Empty\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/TextFuncTest.nsi",
    "content": ";_____________________________________________________________________________\n;\n;                          Text Functions Test\n;_____________________________________________________________________________\n;\n; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)\n\nName \"Text Functions Test\"\nOutFile \"TextFuncTest.exe\"\nCaption \"$(^Name)\"\nShowInstDetails show\nXPStyle on\nRequestExecutionLevel user\n\nVar FUNCTION\nVar TEMPFILE1\nVar TEMPFILE2\nVar TEMPFILE3\nVar HANDLE\nVar OUT\n\n!include \"TextFunc.nsh\"\n\n;############### INSTALL ###############\n\n!define StackVerificationStart `!insertmacro StackVerificationStart`\n!macro StackVerificationStart _FUNCTION\n\tStrCpy $FUNCTION ${_FUNCTION}\n\tCall StackVerificationStart\n!macroend\n\n!define StackVerificationEnd `!insertmacro StackVerificationEnd`\n!macro StackVerificationEnd\n\tCall StackVerificationEnd\n!macroend\n\nFunction StackVerificationStart\n\tStrCpy $0 !0\n\tStrCpy $1 !1\n\tStrCpy $2 !2\n\tStrCpy $3 !3\n\tStrCpy $4 !4\n\tStrCpy $5 !5\n\tStrCpy $6 !6\n\tStrCpy $7 !7\n\tStrCpy $8 !8\n\tStrCpy $9 !9\n\tStrCpy $R0 !R0\n\tStrCpy $R1 !R1\n\tStrCpy $R2 !R2\n\tStrCpy $R3 !R3\n\tStrCpy $R4 !R4\n\tStrCpy $R5 !R5\n\tStrCpy $R6 !R6\n\tStrCpy $R7 !R7\n\tStrCpy $R8 !R8\n\tStrCpy $R9 !R9\nFunctionEnd\n\nFunction StackVerificationEnd\n\tIfErrors +3\n\tDetailPrint 'PASSED $FUNCTION no errors'\n\tgoto +2\n\tDetailPrint 'FAILED   $FUNCTION error'\n\n\tStrCmp $0 '!0' 0 error\n\tStrCmp $1 '!1' 0 error\n\tStrCmp $2 '!2' 0 error\n\tStrCmp $3 '!3' 0 error\n\tStrCmp $4 '!4' 0 error\n\tStrCmp $5 '!5' 0 error\n\tStrCmp $6 '!6' 0 error\n\tStrCmp $7 '!7' 0 error\n\tStrCmp $8 '!8' 0 error\n\tStrCmp $9 '!9' 0 error\n\tStrCmp $R0 '!R0' 0 error\n\tStrCmp $R1 '!R1' 0 error\n\tStrCmp $R2 '!R2' 0 error\n\tStrCmp $R3 '!R3' 0 error\n\tStrCmp $R4 '!R4' 0 error\n\tStrCmp $R5 '!R5' 0 error\n\tStrCmp $R6 '!R6' 0 error\n\tStrCmp $R7 '!R7' 0 error\n\tStrCmp $R8 '!R8' 0 error\n\tStrCmp $R9 '!R9' 0 error\n\tDetailPrint 'PASSED $FUNCTION stack'\n\tgoto end\n\n\terror:\n\tDetailPrint 'FAILED   $FUNCTION stack'\n;\tMessageBox MB_OKCANCEL '$$0={$0}$\\n$$1={$1}$\\n$$2={$2}$\\n$$3={$3}$\\n$$4={$4}$\\n$$5={$5}$\\n$$6={$6}$\\n$$7={$7}$\\n$$8={$8}$\\n$$9={$9}$\\n$$R0={$R0}$\\n$$R1={$R1}$\\n$$R2={$R2}$\\n$$R3={$R3}$\\n$$R4={$R4}$\\n$$R5={$R5}$\\n$$R6={$R6}$\\n$$R7={$R7}$\\n$$R8={$R8}$\\n$$R9={$R9}' IDOK +2\n;\tquit\n\n\tend:\nFunctionEnd\n\n\n\nSection CreateTestFile\n\tGetTempFileName $TEMPFILE1\n\tFileOpen $HANDLE $TEMPFILE1 w\n\tFileWrite $HANDLE '1A=a$\\r$\\n'\n\tFileWrite $HANDLE '2B=b$\\r$\\n'\n\tFileWrite $HANDLE '3C=c$\\r$\\n'\n\tFileWrite $HANDLE '4D=d$\\r$\\n'\n\tFileWrite $HANDLE '5E=e$\\r$\\n'\n\tFileClose $HANDLE\n\tGetTempFileName $TEMPFILE2\n\tGetTempFileName $TEMPFILE3\nSectionEnd\n\n\nSection LineFind\n\t${StackVerificationStart} LineFind\n\n\t${LineFind} '$TEMPFILE1' '/NUL' '1:-4 3 -1' 'LineFindCallback1'\n\tIfErrors error\n\tStrCmp $OUT '|1:2|-5|1|1A=a$\\r$\\n|1:2|-4|2|2B=b$\\r$\\n|3:3|-3|3|3C=c$\\r$\\n' 0 error\n\n\tStrCpy $OUT ''\n\tSetDetailsPrint none\n\t${LineFind} '$TEMPFILE1' '$TEMPFILE2' '1:-1' 'LineFindCallback2'\n\tSetDetailsPrint both\n\tIfErrors error\n\tStrCmp $OUT '|1:-1||1|1A=a$\\r$\\n|1:-1||2|4D=d$\\r$\\n|1:-1||3|3C=c$\\r$\\n|1:-1||4|2B=B$\\r$\\n|1:-1||5|5E=e$\\r$\\n' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\nFunction LineFindCallback1\n\tStrCpy $OUT '$OUT|$R6|$R7|$R8|$R9'\n\tStrCmp $R8 3 0 +2\n\tStrCpy $0 StopLineFind\n\n\tPush $0\nFunctionEnd\n\nFunction LineFindCallback2\n\tStrCmp $R8 2 0 +2\n\tStrCpy $R9 '4D=d$\\r$\\n'\n\tStrCmp $R8 4 0 +2\n\tStrCpy $R9 '2B=B$\\r$\\n'\n\n\tStrCpy $OUT '$OUT|$R6|$R7|$R8|$R9'\n\n\tPush $0\nFunctionEnd\n\n\nSection LineRead\n\t${StackVerificationStart} LineRead\n\n\t${LineRead} '$TEMPFILE1' '-1' $OUT\n\tIfErrors error\n\tStrCmp $OUT '5E=e$\\r$\\n' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection FileReadFromEnd\n\t${StackVerificationStart} FileReadFromEnd\n\n\tStrCpy $OUT ''\n\t${FileReadFromEnd} '$TEMPFILE1' 'FileReadFromEndCallback'\n\tIfErrors error\n\tStrCmp $OUT '|-1|5|5E=e$\\r$\\n|-2|4|4D=d$\\r$\\n|-3|3|3C=c$\\r$\\n|-4|2|2B=b$\\r$\\n' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\nFunction FileReadFromEndCallback\n\tStrCpy $OUT '$OUT|$7|$8|$9'\n\tStrCmp $8 2 0 +2\n\tStrCpy $0 StopFileReadFromEnd\n\n\tPush $0\nFunctionEnd\n\n\nSection LineSum\n\t${StackVerificationStart} LineSum\n\n\t${LineSum} '$TEMPFILE1' $OUT\n\tIfErrors error\n\tStrCmp $OUT '5' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection FileJoin\n\t${StackVerificationStart} FileJoin\n\n\tSetDetailsPrint none\n\t${FileJoin} '$TEMPFILE1' '$TEMPFILE2' '$TEMPFILE3'\n\tSetDetailsPrint both\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection TextCompare\n\t${StackVerificationStart} TextCompare\n\n\tStrCpy $OUT ''\n\t${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'FastDiff' 'TextCompareCallback'\n\tStrCmp $OUT '|2|4D=d$\\r$\\n|2|2B=b$\\r$\\n|4|2B=B$\\r$\\n|4|4D=d$\\r$\\n' 0 error\n\n\tStrCpy $OUT ''\n\t${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'FastEqual' 'TextCompareCallback'\n\tStrCmp $OUT '|1|1A=a$\\r$\\n|1|1A=a$\\r$\\n|3|3C=c$\\r$\\n|3|3C=c$\\r$\\n|5|5E=e$\\r$\\n|5|5E=e$\\r$\\n' 0 error\n\n\tStrCpy $OUT ''\n\t${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'SlowDiff' 'TextCompareCallback'\n\tStrCmp $OUT '' 0 error\n\n\tStrCpy $OUT ''\n\t${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'SlowEqual' 'TextCompareCallback'\n\tStrCmp $OUT '|1|1A=a$\\r$\\n|1|1A=a$\\r$\\n|4|2B=B$\\r$\\n|2|2B=b$\\r$\\n|3|3C=c$\\r$\\n|3|3C=c$\\r$\\n|2|4D=d$\\r$\\n|4|4D=d$\\r$\\n|5|5E=e$\\r$\\n|5|5E=e$\\r$\\n' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\nSection TextCompareS\n\t${StackVerificationStart} TextCompareS\n\n\tStrCpy $OUT ''\n\t${TextCompareS} '$TEMPFILE1' '$TEMPFILE2' 'SlowDiff' 'TextCompareCallback'\n\tStrCmp $OUT '|||2|2B=b$\\r$\\n' 0 error\n\n\tStrCpy $OUT ''\n\t${TextCompareS} '$TEMPFILE1' '$TEMPFILE2' 'SlowEqual' 'TextCompareCallback'\n\tStrCmp $OUT '|1|1A=a$\\r$\\n|1|1A=a$\\r$\\n|3|3C=c$\\r$\\n|3|3C=c$\\r$\\n|2|4D=d$\\r$\\n|4|4D=d$\\r$\\n|5|5E=e$\\r$\\n|5|5E=e$\\r$\\n' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\nFunction TextCompareCallback\n\tStrCpy $OUT '$OUT|$6|$7|$8|$9'\n\n\tPush $0\nFunctionEnd\n\n\nSection ConfigRead\n\t${StackVerificationStart} ConfigRead\n\n\t${ConfigRead} '$TEMPFILE1' '3c=' $OUT\n\tStrCmp $OUT 'c' 0 error\n\n\t${ConfigRead} '$TEMPFILE1' '6F=' $OUT\n\tStrCmp $OUT '' 0 error\n\n\t${ConfigRead} '$TEMPFILE1' 'FF=' $OUT\n\tIfErrors 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection ConfigReadS\n\t${StackVerificationStart} ConfigReadS\n\n\t${ConfigReadS} '$TEMPFILE1' '3C=' $OUT\n\tStrCmp $OUT 'c' 0 error\n\n\t${ConfigReadS} '$TEMPFILE1' '3c=' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT '' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection ConfigWrite\n\t${StackVerificationStart} ConfigWrite\n\n\t${ConfigWrite} '$TEMPFILE1' '5E=' 'e**' $OUT\n\tStrCmp $OUT 'CHANGED' 0 error\n\n\t${ConfigWrite} '$TEMPFILE1' '2B=' '' $OUT\n\tStrCmp $OUT 'DELETED' 0 error\n\n\t${ConfigWrite} '$TEMPFILE1' '3c=' 'c' $OUT\n\tStrCmp $OUT 'SAME' 0 error\n\n\t${ConfigWrite} '$TEMPFILE1' '6F=' '*' $OUT\n\tStrCmp $OUT 'ADDED' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection ConfigWriteS\n\t${StackVerificationStart} ConfigWriteS\n\n\t${ConfigWriteS} '$TEMPFILE1' '5e=' 'e**' $OUT\n\tStrCmp $OUT 'ADDED' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection FileRecode\n\t${StackVerificationStart} FileRecode\n\n\t${FileRecode} '$TEMPFILE1' 'CharToOem'\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection TrimNewLines\n\t${StackVerificationStart} TrimNewLines\n\n\t${TrimNewLines} 'Text Line$\\r$\\n' $OUT\n\tStrCmp $OUT 'Text Line' 0 error\n\n\t${TrimNewLines} 'Text Line' $OUT\n\tStrCmp $OUT 'Text Line' 0 error\n\n\t${TrimNewLines} 'Text Line$\\n' $OUT\n\tStrCmp $OUT 'Text Line' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WriteUninstaller\n\tSetDetailsPrint none\n\tDelete $TEMPFILE1\n\tDelete $TEMPFILE2\n\tDelete $TEMPFILE3\n\tSetDetailsPrint both\n\tgoto +2\n\tWriteUninstaller '$EXEDIR\\un.TextFuncTest.exe'\nSectionEnd\n\n\n\n;############### UNINSTALL ###############\n\nSection un.Uninstall\n\t${LineFind} '$TEMPFILE1' '/NUL' '1:-1' 'un.LineFindCallback'\n\t${LineRead} '$TEMPFILE1' '-1' $OUT\n\t${FileReadFromEnd} '$TEMPFILE1' 'un.FileReadFromEndCallback'\n\t${LineSum} '$TEMPFILE1' $OUT\n\t${FileJoin} '$TEMPFILE1' '$TEMPFILE2' '$TEMPFILE3'\n\t${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'FastDiff' 'un.TextCompareCallback'\n\t${TextCompareS} '$TEMPFILE1' '$TEMPFILE2' 'FastDiff' 'un.TextCompareCallback'\n\t${ConfigRead} '$TEMPFILE1' '3c=' $OUT\n\t${ConfigReadS} '$TEMPFILE1' '3c=' $OUT\n\t${ConfigWrite} '$TEMPFILE1' '5E=' 'e**' $OUT\n\t${ConfigWriteS} '$TEMPFILE1' '5E=' 'e**' $OUT\n\t${FileRecode} '$TEMPFILE1' 'CharToOem'\n\t${TrimNewLines} 'Text Line$\\r$\\n' $OUT\nSectionEnd\n\nFunction un.LineFindCallback\n\tPush $0\nFunctionEnd\n\nFunction un.FileReadFromEndCallback\n\tPush $0\nFunctionEnd\n\nFunction un.TextCompareCallback\n\tPush $0\nFunctionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/UserInfo/UserInfo.nsi",
    "content": "Name \"UserInfo.dll test\"\nOutFile UserInfo.exe\n\n!define REALMSG \"$\\nOriginal non-restricted account type: $2\"\n\nSection\n\tClearErrors\n\tUserInfo::GetName\n\tIfErrors Win9x\n\tPop $0\n\tUserInfo::GetAccountType\n\tPop $1\n\t# GetOriginalAccountType will check the tokens of the original user of the\n\t# current thread/process. If the user tokens were elevated or limited for\n\t# this process, GetOriginalAccountType will return the non-restricted\n\t# account type.\n\t# On Vista with UAC, for example, this is not the same value when running\n\t# with `RequestExecutionLevel user`. GetOriginalAccountType will return\n\t# \"admin\" while GetAccountType will return \"user\".\n\tUserInfo::GetOriginalAccountType\n\tPop $2\n\tStrCmp $1 \"Admin\" 0 +3\n\t\tMessageBox MB_OK 'User \"$0\" is in the Administrators group${REALMSG}'\n\t\tGoto done\n\tStrCmp $1 \"Power\" 0 +3\n\t\tMessageBox MB_OK 'User \"$0\" is in the Power Users group${REALMSG}'\n\t\tGoto done\n\tStrCmp $1 \"User\" 0 +3\n\t\tMessageBox MB_OK 'User \"$0\" is just a regular user${REALMSG}'\n\t\tGoto done\n\tStrCmp $1 \"Guest\" 0 +3\n\t\tMessageBox MB_OK 'User \"$0\" is a guest${REALMSG}'\n\t\tGoto done\n\tMessageBox MB_OK \"Unknown error\"\n\tGoto done\n\n\tWin9x:\n\t\t# This one means you don't need to care about admin or\n\t\t# not admin because Windows 9x doesn't either\n\t\tMessageBox MB_OK \"Error! This DLL can't run under Windows 9x!\"\n\n\tdone:\nSectionEnd\n\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/UserVars.nsi",
    "content": "; UserVars.nsi\n;\n; This script shows you how to declare and user variables.\n\n;--------------------------------\n\n  Name \"User Variables Text\"\n  OutFile \"UserVars.exe\"\n  \n  InstallDir \"$PROGRAMFILES\\User Variables Test\"\n  \n  RequestExecutionLevel admin\n  \n;--------------------------------\n\n  ;Pages\n  Page directory\n  Page instfiles\n  \n  UninstPage uninstConfirm\n  UninstPage instfiles\n\n;--------------------------------\n; Declaration of user variables (Var command), allowed charaters for variables names : [a-z][A-Z][0-9] and '_'\n\n  Var \"Name\"\n  Var \"Serial\"\n  Var \"Info\"\n\n;--------------------------------\n; Installer\n\nSection \"Dummy Section\" SecDummy\n\n     StrCpy $0 \"Admin\"\n     StrCpy \"$Name\" $0\n     StrCpy \"$Serial\" \"12345\"\n     MessageBox MB_OK \"User Name: $Name $\\n$\\nSerial Number: $Serial\"\n\n     CreateDirectory $INSTDIR\n     WriteUninstaller \"$INSTDIR\\Uninst.exe\"\n     \nSectionEnd\n\nSection \"Another Section\"\n\n     Var /GLOBAL \"AnotherVar\"\n\n     StrCpy $AnotherVar \"test\"\n\nSectionEnd\n\n;--------------------------------\n; Uninstaller\n\nSection \"Uninstall\"\n\n     StrCpy $Info \"User variables test uninstalled successfully.\"\n     Delete \"$INSTDIR\\Uninst.exe\"\n     RmDir $INSTDIR\n\nSectionEnd\n\nFunction un.OnUninstSuccess\n\n     HideWindow\n     MessageBox MB_OK \"$Info\"\n     \nFunctionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/VPatch/example.nsi",
    "content": ";VPatch example\n;Written by Joost Verburg\n\n;--------------------------------\n\n; The name of the installer\nName \"VPatch Test\"\n\n; The file to write\nOutFile \"vpatchtest.exe\"\n\n; The default installation directory\nInstallDir \"$PROGRAMFILES\\VPatch Test\"\n\n; The text to prompt the user to enter a directory\nDirText \"Choose a folder in which to install the VPatch Test!\"\n\n; Show details\nShowInstDetails show\n\n;--------------------------------\n;  The normal way to use VPatch\n;--------------------------------\n!include \"VPatchLib.nsh\"\n\nSection \"Update file\"\n  ; Set output path to the installation directory\n  SetOutPath $INSTDIR\n\n  ; Extract the old file under name 'updatefile.txt'\n  File /oname=updatefile.txt oldfile.txt\n  \n  ; Update the file - it will be replaced with the new version\n  DetailPrint \"Updating updatefile.txt using patch...\"\n  !insertmacro VPatchFile \"patch.pat\" \"$INSTDIR\\updatefile.txt\" \"$INSTDIR\\temporaryfile.txt\"\n  \nSectionEnd\n\n;-------------------------------\n;  The hard way to use VPatch\n;-------------------------------\nSection \"New version in separate file\"\n\n  ; Set output path to the installation directory\n  SetOutPath $INSTDIR\n  \n  ; Extract the old file\n  File oldfile.txt\n \n  ; Extract the patch to the plug-ins folder (temporary)\n  InitPluginsDir\n  File /oname=$PLUGINSDIR\\patch.pat patch.pat\n  \n  ; Update the old file to the new file using the patch\n  DetailPrint \"Updating oldfile.txt using patch to newfile.txt...\"\n  vpatch::vpatchfile \"$PLUGINSDIR\\patch.pat\" \"$INSTDIR\\oldfile.txt\" \"$INSTDIR\\newfile.txt\"\n  \n  ; Show result\n  Pop $R0\n  DetailPrint \"Result: $R0\"\n  \nSectionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/VPatch/newfile.txt",
    "content": "*** THIS IS A TEST FILE FOR THE VPATCH EXAMPLE ***\n*** COMPILE EXAMPLE.NSI TO TEST ***\n\nnewfile - vpatch\n\n67890 - GHIJKL"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/VPatch/oldfile.txt",
    "content": "*** THIS IS A TEST FILE FOR THE VPATCH EXAMPLE ***\n*** COMPILE EXAMPLE.NSI TO TEST ***\n\noldfile - vpatch\n\n12345 - ABCDEF"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/VersionInfo.nsi",
    "content": "; VersionInfo.nsi\n;\n; This script shows you how to add version information to an installer.\n; Windows shows this information on the Version tab of the File properties.\n\n;--------------------------------\n\nName \"Version Info\"\n\nOutFile \"VersionInfo.exe\"\n\nLoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\English.nlf\"\n;--------------------------------\n;Version Information\n\n  VIProductVersion \"1.2.3.4\"\n  VIAddVersionKey /LANG=${LANG_ENGLISH} \"ProductName\" \"Test Application\"\n  VIAddVersionKey /LANG=${LANG_ENGLISH} \"Comments\" \"A test comment\"\n  VIAddVersionKey /LANG=${LANG_ENGLISH} \"CompanyName\" \"Fake company\"\n  VIAddVersionKey /LANG=${LANG_ENGLISH} \"LegalTrademarks\" \"Test Application is a trademark of Fake company\"\n  VIAddVersionKey /LANG=${LANG_ENGLISH} \"LegalCopyright\" \"Copyright Fake company\"\n  VIAddVersionKey /LANG=${LANG_ENGLISH} \"FileDescription\" \"Test Application\"\n  VIAddVersionKey /LANG=${LANG_ENGLISH} \"FileVersion\" \"1.2.3\"\n\n;--------------------------------\n\nSection \"\"\n\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/WordFunc.ini",
    "content": "[Settings]\nNumFields=13\nNextButtonText=&Enter\n\n[Field 1]\nType=Droplist\nFlags=NOTIFY\nState=1. WordFind        (Find word by number)\nListItems=1. WordFind        (Find word by number)|                           (Delimiter exclude)|                           (Sum of words)|                           (Sum of delimiters)|                           (Find word number)|                           ( }} )|                           ( {} )|                           ( *} )|2. WordFind2X|3. WordReplace (Replace)|                           (Delete)|                           (Multiple-replace)|4. WordAdd        (Add)|                           (Delete) |5. WordInsert|6. StrFilter           (UpperCase)|                           (LowerCase)|                           (Filter)|7. VersionCompare|8. VersionConvert\nLeft=44\nRight=190\nTop=10\nBottom=191\n\n[Field 2]\nType=Text\nState=C:\\io.sys|C:\\logo.sys|C:\\Program Files|C:\\WINDOWS\nLeft=44\nRight=-10\nTop=30\nBottom=41\n\n[Field 3]\nType=Text\nState=|C:\\\nLeft=44\nRight=-10\nTop=46\nBottom=59\n\n[Field 4]\nType=Text\nFlags=DISABLED\nLeft=44\nRight=-10\nTop=62\nBottom=75\n\n[Field 5]\nType=Text\nState=-4\nLeft=44\nRight=-10\nTop=80\nBottom=92\n\n[Field 6]\nType=Text\nLeft=10\nRight=-30\nTop=108\nBottom=120\n\n[Field 7]\nType=Text\nLeft=-22\nRight=-10\nTop=108\nBottom=120\n\n[Field 8]\nType=Label\nText=String\nLeft=10\nRight=43\nTop=32\nBottom=44\n\n[Field 9]\nType=Label\nText=Delimiter\nLeft=10\nRight=43\nTop=48\nBottom=60\n\n[Field 10]\nType=Label\nLeft=10\nRight=44\nTop=65\nBottom=76\n\n[Field 11]\nType=Label\nText=Word #\nLeft=10\nRight=43\nTop=81\nBottom=94\n\n[Field 12]\nType=Label\nText=Result (Word):\nLeft=10\nRight=236\nTop=97\nBottom=110\n\n[Field 13]\nType=Label\nText=EL\nLeft=-21\nRight=-10\nTop=97\nBottom=110\n\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/WordFunc.nsi",
    "content": ";_____________________________________________________________________________\n;\n;                          Word Functions\n;_____________________________________________________________________________\n;\n; 2005 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)\n\nName \"Word Functions\"\nOutFile \"WordFunc.exe\"\nCaption \"$(^Name)\"\nXPStyle on\nRequestExecutionLevel user\n\nVar INI\nVar HWND\nVar STATE\n\n!include \"WinMessages.nsh\"\n!include \"WordFunc.nsh\"\n\nPage Custom ShowCustom LeaveCustom\n\nFunction ShowCustom\n\tInstallOptions::initDialog \"$INI\"\n\tPop $hwnd\n\tInstallOptions::show\n\tPop $0\nFunctionEnd\n\nFunction LeaveCustom\n\tReadINIStr $0 $INI \"Settings\" \"State\"\n\tStrCmp $0 0 Enter\n\n\tGetDlgItem $1 $HWND 1202\n\tEnableWindow $1 1\n\tGetDlgItem $1 $HWND 1203\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1204\n\tShowWindow $1 1\n\tGetDlgItem $1 $HWND 1206\n\tEnableWindow $1 1\n\tGetDlgItem $1 $HWND 1205\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1206\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\n\tReadINIStr $0 $INI \"Field 1\" \"State\"\n\tStrCmp $0 \"1. WordFind        (Find word by number)\" 0 WordFind2Send\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:|C:\\\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:-4\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Word #\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (Word):\"\n\tgoto WordFindSend\n\n\tWordFind2Send:\n\tStrCmp $0 \"                           (Delimiter exclude)\" 0 WordFind3Send\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:|C:\\\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:E-2{\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Word #\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (Before{ or }after delimiter):\"\n\tgoto WordFindSend\n\n\tWordFind3Send:\n\tStrCmp $0 \"                           (Sum of words)\" 0 WordFind4Send\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:|C:\\\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:#\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Option\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (Sum of words):\"\n\tgoto WordFindSend\n\n\tWordFind4Send:\n\tStrCmp $0 \"                           (Sum of delimiters)\" 0 WordFind5Send\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:|\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:E*\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Option\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (Sum of delimiters):\"\n\tgoto WordFindSend\n\n\tWordFind5Send:\n\tStrCmp $0 \"                           (Find word number)\" 0 WordFind6Send\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:|C:\\\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:/Program Files\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:/Word\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (Word #):\"\n\tgoto WordFindSend\n\n\tWordFind6Send:\n\tStrCmp $0 \"                           ( }} )\" 0 WordFind7Send\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:|C:\\\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:E+2}}\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Word #\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (Before{{ or }}after word):\"\n\tgoto WordFindSend\n\n\tWordFind7Send:\n\tStrCmp $0 \"                           ( {} )\" 0 WordFind8Send\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:|C:\\\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:+2{}\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Word #\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (Without word):\"\n\tgoto WordFindSend\n\n\tWordFind8Send:\n\tStrCmp $0 \"                           ( *} )\" 0 WordFind2XSend\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:|C:\\\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:E+2*}\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Word #\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (Before{* or *}after word with word):\"\n\tgoto WordFindSend\n\n\tWordFind2XSend:\n\tStrCmp $0 \"2. WordFind2X\" 0 WordReplace1Send\n\tGetDlgItem $1 $HWND 1201\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:[C:\\io.sys];[C:\\logo.sys];[C:\\WINDOWS]\"\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:[C:\\\"\n\tGetDlgItem $1 $HWND 1203\n\tEnableWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:];\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:E+2\"\n\tGetDlgItem $1 $HWND 1207\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:String\"\n\tGetDlgItem $1 $HWND 1208\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Delimiter1\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Delimiter2\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Word #\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (Word):\"\n\tabort\n\n\tWordReplace1Send:\n\tStrCmp $0 \"3. WordReplace (Replace)\" 0 WordReplace2Send\n\tGetDlgItem $1 $HWND 1201\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:C:\\io.sys|C:\\logo.sys|C:\\WINDOWS\"\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:SYS\"\n\tGetDlgItem $1 $HWND 1203\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:bmp\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:+2\"\n\tgoto WordReplaceSend\n\n\tWordReplace2Send:\n\tStrCmp $0 \"                           (Delete)\" 0 WordReplace3Send\n\tGetDlgItem $1 $HWND 1201\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:C:\\io.sys|C:\\logo.sys|C:\\WINDOWS\"\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:SYS\"\n\tGetDlgItem $1 $HWND 1203\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:E+\"\n\tgoto WordReplaceSend\n\n\tWordReplace3Send:\n\tStrCmp $0 \"                           (Multiple-replace)\" 0 WordAdd1Send\n\tGetDlgItem $1 $HWND 1201\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:C:\\io.sys||||||C:\\logo.sys|||C:\\WINDOWS\"\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:|\"\n\tGetDlgItem $1 $HWND 1203\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:|\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:+1*\"\n\tgoto WordReplaceSend\n\n\tWordAdd1Send:\n\tStrCmp $0 \"4. WordAdd        (Add)\" 0 WordAdd2Send\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:+C:\\WINDOWS|C:\\config.sys|C:\\IO.SYS\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (String1 + String2):\"\n\tgoto WordAddSend\n\n\tWordAdd2Send:\n\tStrCmp $0 \"                           (Delete) \" 0 WordInsertSend\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:E-C:\\WINDOWS|C:\\config.sys|C:\\IO.SYS\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (String1 - String2):\"\n\tgoto WordAddSend\n\n\tWordInsertSend:\n\tStrCmp $0 \"5. WordInsert\" 0 StrFilter1Send\n\tGetDlgItem $1 $HWND 1201\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:C:\\io.sys|C:\\WINDOWS\"\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:|\"\n\tGetDlgItem $1 $HWND 1203\n\tEnableWindow $1 1\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:C:\\logo.sys\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:E+2\"\n\tGetDlgItem $1 $HWND 1207\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:String\"\n\tGetDlgItem $1 $HWND 1208\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Delimiter\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Word\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Word #\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result:\"\n\tabort\n\n\tStrFilter1Send:\n\tStrCmp $0 \"6. StrFilter           (UpperCase)\" 0 StrFilter2Send\n\tGetDlgItem $1 $HWND 1201\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:123abc 456DEF 7890|%#\"\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:+\"\n\tGetDlgItem $1 $HWND 1203\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (String in uppercase):\"\n\tgoto StrFilterSend\n\n\tStrFilter2Send:\n\tStrCmp $0 \"                           (LowerCase)\" 0 StrFilter3Send\n\tGetDlgItem $1 $HWND 1201\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:123abc 456DEF 7890|%#\"\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:-\"\n\tGetDlgItem $1 $HWND 1203\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:ef\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (String in lowercase except EF):\"\n\tgoto StrFilterSend\n\n\tStrFilter3Send:\n\tStrCmp $0 \"                           (Filter)\" 0 VersionCompareSend\n\tGetDlgItem $1 $HWND 1201\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:123abc 456DEF 7890|%#\"\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:+12\"\n\tGetDlgItem $1 $HWND 1203\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:b\"\n\tGetDlgItem $1 $HWND 1204\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:def\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (String Digits + Letters + b - def):\"\n\tgoto StrFilterSend\n\n\tVersionCompareSend:\n\tStrCmp $0 \"7. VersionCompare\" 0 VersionConvertSend\n\tGetDlgItem $1 $HWND 1201\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:1.1.1.9\"\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:1.1.1.01\"\n\tGetDlgItem $1 $HWND 1203\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1204\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1206\n\tEnableWindow $1 0\n\tGetDlgItem $1 $HWND 1207\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Version1\"\n\tGetDlgItem $1 $HWND 1208\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Version2\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (0-equal 1-newer 2-older):\"\n\tabort\n\n\tVersionConvertSend:\n\tStrCmp $0 \"8. VersionConvert\" 0 Abort\n\tGetDlgItem $1 $HWND 1201\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:9.0c\"\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1203\n\tShowWindow $1 0\n\tGetDlgItem $1 $HWND 1204\n\tShowWindow $1 0\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1206\n\tEnableWindow $1 0\n\tGetDlgItem $1 $HWND 1207\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Version\"\n\tGetDlgItem $1 $HWND 1208\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:CharList\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result (numerical version format):\"\n\tabort\n\n\tAbort:\n\tAbort\n\n\tWordFindSend:\n\tGetDlgItem $1 $HWND 1203\n\tEnableWindow $1 0\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1201\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:C:\\io.sys|C:\\logo.sys|C:\\Program Files|C:\\WINDOWS\"\n\tGetDlgItem $1 $HWND 1207\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:String\"\n\tGetDlgItem $1 $HWND 1208\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Delimiter\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tAbort\n\n\tWordReplaceSend:\n\tGetDlgItem $1 $HWND 1203\n\tEnableWindow $1 1\n\tGetDlgItem $1 $HWND 1207\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:String\"\n\tGetDlgItem $1 $HWND 1208\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Replace it\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:         with\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Word #\"\n\tGetDlgItem $1 $HWND 1211\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Result:\"\n\tAbort\n\n\tWordAddSend:\n\tGetDlgItem $1 $HWND 1203\n\tEnableWindow $1 0\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1201\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:C:\\io.sys|C:\\logo.sys|C:\\WINDOWS\"\n\tGetDlgItem $1 $HWND 1202\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:|\"\n\tGetDlgItem $1 $HWND 1207\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:String1\"\n\tGetDlgItem $1 $HWND 1208\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Delimiter\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:String2\"\n\tAbort\n\n\tStrFilterSend:\n\tGetDlgItem $1 $HWND 1203\n\tEnableWindow $1 1\n\tGetDlgItem $1 $HWND 1206\n\tEnableWindow $1 0\n\tGetDlgItem $1 $HWND 1207\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:String\"\n\tGetDlgItem $1 $HWND 1208\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Filter\"\n\tGetDlgItem $1 $HWND 1209\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Include\"\n\tGetDlgItem $1 $HWND 1210\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:Exclude\"\n\tAbort\n\n;=Enter=\n\tEnter:\n\tStrCpy $0 ''\n\tReadINIStr $STATE $INI \"Field 1\" \"State\"\n\tReadINIStr $R1 $INI \"Field 2\" \"State\"\n\tReadINIStr $R2 $INI \"Field 3\" \"State\"\n\tReadINIStr $R3 $INI \"Field 4\" \"State\"\n\tReadINIStr $R4 $INI \"Field 5\" \"State\"\n\n\tStrCmp $STATE \"1. WordFind        (Find word by number)\" WordFind\n\tStrCmp $STATE \"                           (Delimiter exclude)\" WordFind\n\tStrCmp $STATE \"                           (Find in string)\" WordFind\n\tStrCmp $STATE \"                           (Sum of words)\" WordFind\n\tStrCmp $STATE \"                           (Sum of delimiters)\" WordFind\n\tStrCmp $STATE \"                           (Find word number)\" WordFind\n\tStrCmp $STATE \"                           ( }} )\" WordFind\n\tStrCmp $STATE \"                           ( {} )\" WordFind\n\tStrCmp $STATE \"                           ( *} )\" WordFind\n\tStrCmp $STATE \"2. WordFind2X\" WordFind2X\n\tStrCmp $STATE \"3. WordReplace (Replace)\" WordReplace\n\tStrCmp $STATE \"                           (Delete)\" WordReplace\n\tStrCmp $STATE \"                           (Multiple-replace)\" WordReplace\n\tStrCmp $STATE \"4. WordAdd        (Add)\" WordAdd\n\tStrCmp $STATE \"                           (Delete) \" WordAdd\n\tStrCmp $STATE \"5. WordInsert\" WordInsert\n\tStrCmp $STATE \"6. StrFilter           (UpperCase)\" StrFilter\n\tStrCmp $STATE \"                           (LowerCase)\" StrFilter\n\tStrCmp $STATE \"                           (Filter)\" StrFilter\n\tStrCmp $STATE \"7. VersionCompare\" VersionCompare\n\tStrCmp $STATE \"8. VersionConvert\" VersionConvert\n\tAbort\n\n\tWordFind:\n\t${WordFind} \"$R1\" \"$R2\" \"$R4\" $R0\n\tIfErrors 0 Send\n\tStrCpy $0 $R0\n\tStrCmp $R0 3 0 +3\n\tStrCpy $3 '\"+1\" \"-1\" \"+1}\" \"+1{\" \"#\" \"/word\"'\n\tgoto error3\n\tStrCmp $R0 2 0 error1\n\tStrCpy $R4 $R4 '' 1\n\tStrCpy $1 $R4 1\n\tStrCmp $1 / 0 error2\n\tStrCpy $R4 $R4 '' 1\n\tStrCpy $R0 '\"$R4\" no such word.'\n\tgoto Send\n\n\tWordFind2X:\n\t${WordFind2X} \"$R1\" \"$R2\" \"$R3\" \"$R4\" $R0\n\tIfErrors 0 Send\n\tStrCpy $0 $R0\n\tStrCmp $R0 3 0 +3\n\tStrCpy $3 '\"+1\" \"-1\"'\n\tgoto error3\n\tStrCmp $R0 2 +3\n\tStrCpy $R0 '\"$R2...$R3\" no words found.'\n\tgoto Send\n\tStrCpy $R4 $R4 '' 1\n\tStrCpy $1 $R4 1\n\tStrCmp $1 / 0 +2\n\tStrCpy $R4 $R4 '' 1\n\tStrCpy $R0 '\"$R4\" no such word.'\n\tgoto Send\n\n\tWordReplace:\n\t${WordReplace} \"$R1\" \"$R2\" \"$R3\" \"$R4\" $R0\n\tIfErrors 0 Send\n\tStrCpy $0 $R0\n\tStrCmp $R0 3 0 +3\n\tStrCpy $3 '\"+1\" \"+1*\" \"+\" \"+*\" \"{}\"'\n\tgoto error3\n\tStrCmp $R0 2 0 error1\n\tStrCpy $R4 $R4 '' 1\n\tgoto error2\n\n\tWordAdd:\n\t${WordAdd} \"$R1\" \"$R2\" \"$R4\" $R0\n\tIfErrors 0 Send\n\tStrCpy $0 $R0\n\tStrCmp $R0 3 0 error1empty\n\tStrCpy $3 '\"+text\" \"-text\"'\n\tgoto error3\n\n\tWordInsert:\n\t${WordInsert} \"$R1\" \"$R2\" \"$R3\" \"$R4\" $R0\n\tIfErrors 0 Send\n\tStrCpy $0 $R0\n\tStrCmp $R0 3 0 +3\n\tStrCpy $3 '\"+1\" \"-1\"'\n\tgoto error3\n\tStrCmp $R0 2 0 error1empty\n\tStrCpy $R4 $R4 '' 1\n\tgoto error2\n\n\tStrFilter:\n\t${StrFilter} \"$R1\" \"$R2\" \"$R3\" \"$R4\" $R0\n\tIfErrors 0 Send\n\tStrCpy $R0 'Syntax error'\n\tgoto Send\n\n\tVersionCompare:\n\t${VersionCompare} \"$R1\" \"$R2\" $R0\n\tgoto Send\n\n\tVersionConvert:\n\t${VersionConvert} \"$R1\" \"$R2\" $R0\n\tgoto Send\n\n\terror3:\n\tStrCpy $R0 '\"$R4\" syntax error ($3)'\n\tgoto Send\n\terror2:\n\tStrCpy $R0 '\"$R4\" no such word number'\n\tgoto Send\n\terror1empty:\n\tStrCpy $R0 '\"$R2\" delimiter is empty'\n\tgoto Send\n\terror1:\n\tStrCpy $R0 '\"$R2\" delimiter not found in string'\n\tgoto Send\n\n\tSend:\n\tGetDlgItem $1 $HWND 1205\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$R0\"\n\tGetDlgItem $1 $HWND 1206\n\tSendMessage $1 ${WM_SETTEXT} 1 \"STR:$0\"\n\tabort\nFunctionEnd\n\nFunction .onInit\n\tInitPluginsDir\n\tGetTempFileName $INI $PLUGINSDIR\n\tFile /oname=$INI \"WordFunc.ini\"\nFunctionEnd\n\nPage instfiles\n\nSection \"Empty\"\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/WordFuncTest.nsi",
    "content": ";_____________________________________________________________________________\n;\n;                          Word Functions Test\n;_____________________________________________________________________________\n;\n; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)\n\nName \"Word Functions Test\"\nOutFile \"WordFuncTest.exe\"\nCaption \"$(^Name)\"\nShowInstDetails show\nXPStyle on\nRequestExecutionLevel user\n\nVar FUNCTION\nVar OUT\n\n!include \"WordFunc.nsh\"\n\n;############### INSTALL ###############\n\n!define StackVerificationStart `!insertmacro StackVerificationStart`\n!macro StackVerificationStart _FUNCTION\n\tStrCpy $FUNCTION ${_FUNCTION}\n\tCall StackVerificationStart\n!macroend\n\n!define StackVerificationEnd `!insertmacro StackVerificationEnd`\n!macro StackVerificationEnd\n\tCall StackVerificationEnd\n!macroend\n\nFunction StackVerificationStart\n\tStrCpy $0 !0\n\tStrCpy $1 !1\n\tStrCpy $2 !2\n\tStrCpy $3 !3\n\tStrCpy $4 !4\n\tStrCpy $5 !5\n\tStrCpy $6 !6\n\tStrCpy $7 !7\n\tStrCpy $8 !8\n\tStrCpy $9 !9\n\tStrCpy $R0 !R0\n\tStrCpy $R1 !R1\n\tStrCpy $R2 !R2\n\tStrCpy $R3 !R3\n\tStrCpy $R4 !R4\n\tStrCpy $R5 !R5\n\tStrCpy $R6 !R6\n\tStrCpy $R7 !R7\n\tStrCpy $R8 !R8\n\tStrCpy $R9 !R9\nFunctionEnd\n\nFunction StackVerificationEnd\n\tIfErrors +3\n\tDetailPrint 'PASSED $FUNCTION no errors'\n\tgoto +2\n\tDetailPrint 'FAILED   $FUNCTION error'\n\n\tStrCmp $0 '!0' 0 error\n\tStrCmp $1 '!1' 0 error\n\tStrCmp $2 '!2' 0 error\n\tStrCmp $3 '!3' 0 error\n\tStrCmp $4 '!4' 0 error\n\tStrCmp $5 '!5' 0 error\n\tStrCmp $6 '!6' 0 error\n\tStrCmp $7 '!7' 0 error\n\tStrCmp $8 '!8' 0 error\n\tStrCmp $9 '!9' 0 error\n\tStrCmp $R0 '!R0' 0 error\n\tStrCmp $R1 '!R1' 0 error\n\tStrCmp $R2 '!R2' 0 error\n\tStrCmp $R3 '!R3' 0 error\n\tStrCmp $R4 '!R4' 0 error\n\tStrCmp $R5 '!R5' 0 error\n\tStrCmp $R6 '!R6' 0 error\n\tStrCmp $R7 '!R7' 0 error\n\tStrCmp $R8 '!R8' 0 error\n\tStrCmp $R9 '!R9' 0 error\n\tDetailPrint 'PASSED $FUNCTION stack'\n\tgoto end\n\n\terror:\n\tDetailPrint 'FAILED   $FUNCTION stack'\n;\tMessageBox MB_OKCANCEL '$$0={$0}$\\n$$1={$1}$\\n$$2={$2}$\\n$$3={$3}$\\n$$4={$4}$\\n$$5={$5}$\\n$$6={$6}$\\n$$7={$7}$\\n$$8={$8}$\\n$$9={$9}$\\n$$R0={$R0}$\\n$$R1={$R1}$\\n$$R2={$R2}$\\n$$R3={$R3}$\\n$$R4={$R4}$\\n$$R5={$R5}$\\n$$R6={$R6}$\\n$$R7={$R7}$\\n$$R8={$R8}$\\n$$R9={$R9}' IDOK +2\n;\tquit\n\n\tend:\nFunctionEnd\n\n\n\nSection WordFind\n\t${StackVerificationStart} WordFind\n\n\t${WordFind} '||io.sys|||Program Files|||WINDOWS' '||' '-02' $OUT\n\tStrCmp $OUT '|Program Files' 0 error\n\n\t${WordFind} '||io.sys||||Program Files||||WINDOWS' '||' '-2' $OUT\n\tStrCmp $OUT 'Program Files' 0 error\n\n\t${WordFind} 'C:\\io.sys|||logo.sys|||WINDOWS' '||' '-2}' $OUT\n\tStrCmp $OUT '|logo.sys|||WINDOWS' 0 error\n\n\t${WordFind} 'C:\\io.sys|||logo.sys|||WINDOWS' '||' '#' $OUT\n\tStrCmp $OUT '3' 0 error\n\n\t${WordFind} 'C:\\io.sys|||logo.sys|||WINDOWS' '||' '*' $OUT\n\tStrCmp $OUT '2' 0 error\n\n\t${WordFind} 'C:\\io.sys|||Program Files|||WINDOWS' '||' '/|Program Files' $OUT\n\tStrCmp $OUT '2' 0 error\n\n\t${WordFind} 'C:\\io.sys|||logo.sys|||WINDOWS' '||' '+2}}' $OUT\n\tStrCmp $OUT '|||WINDOWS' 0 error\n\n\t${WordFind} 'C:\\io.sys|||logo.sys|||WINDOWS' '||' '+2{}' $OUT\n\tStrCmp $OUT 'C:\\io.sys|||WINDOWS' 0 error\n\n\t${WordFind} 'C:\\io.sys|||logo.sys|||WINDOWS' '||' '+2*}' $OUT\n\tStrCmp $OUT '|logo.sys|||WINDOWS' 0 error\n\n\t${WordFind} 'C:\\\\Program Files\\\\NSIS\\\\NSIS.chm' '\\' '-2{*' $OUT\n\tStrCmp $OUT 'C:\\\\Program Files\\\\NSIS' 0 error\n\n\t${WordFind} 'C:\\io.sys|||Program Files|||WINDOWS|||' '||' '-1' $OUT\n\tStrCmp $OUT '|' 0 error\n\n\t${WordFind} '||C:\\io.sys|||logo.sys|||WINDOWS||' '||' '-1}' $OUT\n\tStrCmp $OUT '' 0 error\n\n\t${WordFind} '||C:\\io.sys|||logo.sys|||WINDOWS||' '||' '+1{' $OUT\n\tStrCmp $OUT '' 0 error\n\n\t${WordFind} 'C:\\io.sys|||logo.sys' '_' 'E+1' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT 1 0 error\n\n\t${WordFind} 'C:\\io.sys|||logo.sys|||' '\\' 'E+3' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT 2 0 error\n\n\t${WordFind} 'C:\\io.sys|||logo.sys' '\\' 'E1' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT 3 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WordFindS\n\t${StackVerificationStart} WordFindS\n\n\t${WordFindS} 'C:\\io.sys|||Program Files|||WINDOWS' '||' '/|PROGRAM FILES' $OUT\n\tStrCmp $OUT 'C:\\io.sys|||Program Files|||WINDOWS' 0 error\n\n\t${WordFindS} 'C:\\io.sys|||Program Files|||WINDOWS' '||' '/|Program Files' $OUT\n\tStrCmp $OUT '2' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WordFind2X\n\t${StackVerificationStart} WordFind2X\n\n\t${WordFind2X} '[C:\\io.sys];[C:\\logo.sys];[C:\\WINDOWS]' '[C:\\' '];' '+2' $OUT\n\tStrCmp $OUT 'logo.sys' 0 error\n\n\t${WordFind2X} 'C:\\WINDOWS C:\\io.sys C:\\logo.sys' '\\' '.' '-1' $OUT\n\tStrCmp $OUT 'logo' 0 error\n\n\t${WordFind2X} 'C:\\WINDOWS C:\\io.sys C:\\logo.sys' '\\' '.' '-1{{' $OUT\n\tStrCmp $OUT 'C:\\WINDOWS C:\\io.sys C:' 0 error\n\n\t${WordFind2X} 'C:\\WINDOWS C:\\io.sys C:\\logo.sys' '\\' '.' '-1{}' $OUT\n\tStrCmp $OUT 'C:\\WINDOWS C:\\io.sys C:sys' 0 error\n\n\t${WordFind2X} 'C:\\WINDOWS C:\\io.sys C:\\logo.sys' '\\' '.' '-1{*' $OUT\n\tStrCmp $OUT 'C:\\WINDOWS C:\\io.sys C:\\logo.' 0 error\n\n\t${WordFind2X} 'C:\\WINDOWS C:\\io.sys C:\\logo.sys' '\\' '.' '/logo' $OUT\n\tStrCmp $OUT '2' 0 error\n\n\t${WordFind2X} '||a||b||c' '||' '||' 'E+1' $OUT\n\tStrCmp $OUT 'a' 0 error\n\n\t${WordFind2X} '[io.sys];[C:\\logo.sys]' '\\' '];' 'E+1' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT 1 0 error\n\n\t${WordFind2X} '[io.sys];[C:\\logo.sys]' '[' '];' 'E+2' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT 2 0 error\n\n\t${WordFind2X} '[io.sys];[C:\\logo.sys]' '\\' '];' 'E2' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT 3 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WordFind2XS\n\t${StackVerificationStart} WordFind2XS\n\n\t${WordFind2XS} 'C:\\WINDOWS C:\\io.sys C:\\logo.sys' '\\' '.' '/LOGO' $OUT\n\tStrCmp $OUT 'C:\\WINDOWS C:\\io.sys C:\\logo.sys' 0 error\n\n\t${WordFind2XS} 'C:\\WINDOWS C:\\io.sys C:\\logo.sys' '\\' '.' '/logo' $OUT\n\tStrCmp $OUT '2' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WordFind3X\n\t${StackVerificationStart} WordFind3X\n\n\t${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT\n\tStrCmp $OUT '1.AAB' 0 error\n\n\t${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1' $OUT\n\tStrCmp $OUT '2.BAA' 0 error\n\n\t${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{{' $OUT\n\tStrCmp $OUT '[1.AAB];' 0 error\n\n\t${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{}' $OUT\n\tStrCmp $OUT '[1.AAB];[3.BBB];' 0 error\n\n\t${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{*' $OUT\n\tStrCmp $OUT '[1.AAB];[2.BAA];' 0 error\n\n\t${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '/2.BAA' $OUT\n\tStrCmp $OUT '2' 0 error\n\n\t${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'XX' '];' 'E+1' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT '1' 0 error\n\n\t${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' 'E+3' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT '2' 0 error\n\n\t${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' 'E3' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT '3' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WordFind3XS\n\t${StackVerificationStart} WordFind3XS\n\n\t${WordFind3XS} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '/2.baa' $OUT\n\tStrCmp $OUT '[1.AAB];[2.BAA];[3.BBB];' 0 error\n\n\t${WordFind3XS} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '/2.BAA' $OUT\n\tStrCmp $OUT '2' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WordReplace\n\t${StackVerificationStart} WordReplace\n\n\t${WordReplace} 'C:\\io.sys C:\\logo.sys C:\\WINDOWS' 'SYS' 'bmp' '+2' $OUT\n\tStrCmp $OUT 'C:\\io.sys C:\\logo.bmp C:\\WINDOWS' 0 error\n\n\t${WordReplace} 'C:\\io.sys C:\\logo.sys C:\\WINDOWS' 'SYS' '' '+' $OUT\n\tStrCmp $OUT 'C:\\io. C:\\logo. C:\\WINDOWS' 0 error\n\n\t${WordReplace} 'C:\\io.sys C:\\logo.sys C:\\WINDOWS' 'C:\\io.sys' '' '+' $OUT\n\tStrCmp $OUT ' C:\\logo.sys C:\\WINDOWS' 0 error\n\n\t${WordReplace} 'C:\\io.sys      C:\\logo.sys   C:\\WINDOWS' ' ' ' ' '+1*' $OUT\n\tStrCmp $OUT 'C:\\io.sys C:\\logo.sys   C:\\WINDOWS' 0 error\n\n\t${WordReplace} 'C:\\io.sys C:\\logo.sysSYSsys C:\\WINDOWS' 'sys' 'bmp' '+*' $OUT\n\tStrCmp $OUT 'C:\\io.bmp C:\\logo.bmp C:\\WINDOWS' 0 error\n\n\t${WordReplace} 'SYSsysC:\\io.sys C:\\logo.sys C:\\WINDOWSsysSYSsys' 'sys' '|' '{' $OUT\n\tStrCmp $OUT '||C:\\io.sys C:\\logo.sys C:\\WINDOWSsysSYSsys' 0 error\n\n\t${WordReplace} 'SYSsysC:\\io.sys C:\\logo.sys C:\\WINDOWSsysSYSsys' 'sys' '|' '}' $OUT\n\tStrCmp $OUT 'SYSsysC:\\io.sys C:\\logo.sys C:\\WINDOWS|||' 0 error\n\n\t${WordReplace} 'SYSsysC:\\io.sys C:\\logo.sys C:\\WINDOWSsysSYSsys' 'sys' '|' '{}' $OUT\n\tStrCmp $OUT '||C:\\io.sys C:\\logo.sys C:\\WINDOWS|||' 0 error\n\n\t${WordReplace} 'SYSsysC:\\io.sys C:\\logo.sys C:\\WINDOWSsysSYSsys' 'sys' '|' '{*' $OUT\n\tStrCmp $OUT '|C:\\io.sys C:\\logo.sys C:\\WINDOWSsysSYSsys' 0 error\n\n\t${WordReplace} 'SYSsysC:\\io.sys C:\\logo.sys C:\\WINDOWSsysSYSsys' 'sys' '|' '}*' $OUT\n\tStrCmp $OUT 'SYSsysC:\\io.sys C:\\logo.sys C:\\WINDOWS|' 0 error\n\n\t${WordReplace} 'SYSsysC:\\io.sys C:\\logo.sys C:\\WINDOWSsysSYSsys' 'sys' '|' '{}*' $OUT\n\tStrCmp $OUT '|C:\\io.sys C:\\logo.sys C:\\WINDOWS|' 0 error\n\n\t${WordReplace} 'sysSYSsysC:\\io.sys C:\\logo.sys C:\\WINDOWSsysSYSsys' 'sys' '|' '{}*' $OUT\n\tStrCmp $OUT '|C:\\io.sys C:\\logo.sys C:\\WINDOWS|' 0 error\n\n\t${WordReplace} 'C:\\io.sys C:\\logo.sys' '#sys' '|sys|' 'E+1' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT '1' 0 error\n\n\t${WordReplace} 'C:\\io.sys C:\\logo.sys' '.sys' '|sys|' 'E+3' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT '2' 0 error\n\n\t${WordReplace} 'C:\\io.sys C:\\logo.sys' '.sys' '|sys|' 'E3' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT '3' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WordReplaceS\n\t${StackVerificationStart} WordReplaceS\n\n\t${WordReplaceS} 'C:\\io.sys C:\\logo.sys C:\\WINDOWS' 'SYS' 'bmp' '+2' $OUT\n\tStrCmp $OUT 'C:\\io.sys C:\\logo.sys C:\\WINDOWS' 0 error\n\n\t${WordReplaceS} 'C:\\io.sys C:\\logo.sys C:\\WINDOWS' 'sys' 'bmp' '+2' $OUT\n\tStrCmp $OUT 'C:\\io.sys C:\\logo.bmp C:\\WINDOWS' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WordAdd\n\t${StackVerificationStart} WordAdd\n\n\t${WordAdd} 'C:\\io.sys C:\\WINDOWS' ' ' '+C:\\WINDOWS C:\\config.sys' $OUT\n\tStrCmp $OUT 'C:\\io.sys C:\\WINDOWS C:\\config.sys' 0 error\n\n\t${WordAdd} 'C:\\io.sys C:\\logo.sys C:\\WINDOWS' ' ' '-C:\\WINDOWS C:\\config.sys C:\\IO.SYS' $OUT\n\tStrCmp $OUT 'C:\\logo.sys' 0 error\n\n\t${WordAdd} 'C:\\io.sys' ' ' '+C:\\WINDOWS C:\\config.sys C:\\IO.SYS' $OUT\n\tStrCmp $OUT 'C:\\io.sys C:\\WINDOWS C:\\config.sys' 0 error\n\n\t${WordAdd} 'C:\\io.sys C:\\logo.sys C:\\WINDOWS' ' ' '-C:\\WINDOWS' $OUT\n\tStrCmp $OUT 'C:\\io.sys C:\\logo.sys' 0 error\n\n\t${WordAdd} 'C:\\io.sys C:\\logo.sys' ' ' '+C:\\logo.sys' $OUT\n\tStrCmp $OUT 'C:\\io.sys C:\\logo.sys' 0 error\n\n\t${WordAdd} 'C:\\io.sys C:\\logo.sys' ' ' 'E-' $OUT\n\tStrCmp $OUT 'C:\\io.sys C:\\logo.sys' 0 error\n\tIfErrors error\n\n\t${WordAdd} 'C:\\io.sys C:\\logo.sys' '' 'E-C:\\logo.sys' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT '1' 0 error\n\n\t${WordAdd} 'C:\\io.sys C:\\logo.sys' '' 'EC:\\logo.sys' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT '3' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WordAddS\n\t${StackVerificationStart} WordAddS\n\n\t${WordAddS} 'C:\\io.sys C:\\WINDOWS' ' ' '+C:\\windows C:\\config.sys' $OUT\n\tStrCmp $OUT 'C:\\io.sys C:\\WINDOWS C:\\windows C:\\config.sys' 0 error\n\n\t${WordAddS} 'C:\\io.sys C:\\WINDOWS' ' ' '+C:\\WINDOWS C:\\config.sys' $OUT\n\tStrCmp $OUT 'C:\\io.sys C:\\WINDOWS C:\\config.sys' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WordInsert\n\t${StackVerificationStart} WordInsert\n\n\t${WordInsert} 'C:\\io.sys C:\\WINDOWS' ' ' 'C:\\logo.sys' '-2' $OUT\n\tStrCmp $OUT 'C:\\io.sys C:\\logo.sys C:\\WINDOWS' 0 error\n\n\t${WordInsert} 'C:\\io.sys' ' ' 'C:\\WINDOWS' '+2' $OUT\n\tStrCmp $OUT 'C:\\io.sys C:\\WINDOWS' 0 error\n\n\t${WordInsert} '' ' ' 'C:\\WINDOWS' '+1' $OUT\n\tStrCmp $OUT 'C:\\WINDOWS ' 0 error\n\n\t${WordInsert} 'C:\\io.sys C:\\logo.sys' '' 'C:\\logo.sys' 'E+1' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT '1' 0 error\n\n\t${WordInsert} 'C:\\io.sys C:\\logo.sys' ' ' 'C:\\logo.sys' 'E+4' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT '2' 0 error\n\n\t${WordInsert} 'C:\\io.sys C:\\logo.sys' '' 'C:\\logo.sys' 'E1' $OUT\n\tIfErrors 0 error\n\tStrCmp $OUT '3' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WordInsertS\n\t${StackVerificationStart} WordInsertS\n\n\t${WordInsertS} 'C:\\io.sys x C:\\logo.sys' ' X ' 'C:\\NTLDR' '+2' $OUT\n\tStrCmp $OUT 'C:\\io.sys x C:\\logo.sys X C:\\NTLDR' 0 error\n\n\t${WordInsertS} 'C:\\io.sys x C:\\logo.sys' ' x ' 'C:\\NTLDR' '+2' $OUT\n\tStrCmp $OUT 'C:\\io.sys x C:\\NTLDR x C:\\logo.sys' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection StrFilter\n\t${StackVerificationStart} StrFilter\n\n\t${StrFilter} '123abc 456DEF 7890|%#' '+' '' '' $OUT\n\tIfErrors error\n\tStrCmp $OUT '123ABC 456DEF 7890|%#' 0 error\n\n\t${StrFilter} '123abc 456DEF 7890|%#' '-' 'ef' '' $OUT\n\tIfErrors error\n\tStrCmp $OUT '123abc 456dEF 7890|%#' 0 error\n\n\t${StrFilter} '123abc 456DEF 7890|%#' '2' '|%' '' $OUT\n\tIfErrors error\n\tStrCmp $OUT 'abcDEF|%' 0 error\n\n\t${StrFilter} '123abc 456DEF 7890|%#' '13' 'af' '4590' $OUT\n\tIfErrors error\n\tStrCmp $OUT '123a 6F 78|%#' 0 error\n\n\t${StrFilter} '123abc 456DEF 7890|%#' '+12' 'b' 'def' $OUT\n\tIfErrors error\n\tStrCmp $OUT '123AbC4567890' 0 error\n\n\t${StrFilter} '123abc 456DEF 7890|%#' '+12' 'b' 'def' $OUT\n\tIfErrors error\n\tStrCmp $OUT '123AbC4567890' 0 error\n\n\t${StrFilter} '123abc 456DEF 7890|%#' '123' 'b' 'def' $OUT\n\tIfErrors 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection StrFilterS\n\t${StackVerificationStart} StrFilterS\n\n\t${StrFilterS} '123abc 456DEF 7890|%#' '13' 'af' '4590' $OUT\n\tIfErrors error\n\tStrCmp $OUT '123a 6 78|%#' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection VersionCompare\n\t${StackVerificationStart} VersionCompare\n\n\t${VersionCompare} '1.1.1.9' '1.1.1.01' $OUT\n\tStrCmp $OUT '1' 0 error\n\n\t${VersionCompare} '1.1.1.1' '1.1.1.10' $OUT\n\tStrCmp $OUT '2' 0 error\n\n\t${VersionCompare} '91.1.1.1' '101.1.1.9' $OUT\n\tStrCmp $OUT '2' 0 error\n\n\t${VersionCompare} '1.1.1.1' '1.1.1.1' $OUT\n\tStrCmp $OUT '0' 0 error\n\n\t${VersionCompare} '1.1.1.9' '1.1.1.10' $OUT\n\tStrCmp $OUT '2' 0 error\n\n\t${VersionCompare} '1.1.1.0' '1.1.1' $OUT\n\tStrCmp $OUT '0' 0 error\n\n\t${VersionCompare} '1.1.0.0' '1.1' $OUT\n\tStrCmp $OUT '0' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection VersionConvert\n\t${StackVerificationStart} VersionConvert\n\n\t${VersionConvert} '9.0a' '' $OUT\n\tStrCmp $OUT '9.0.01' 0 error\n\n\t${VersionConvert} '9.0c' '' $OUT\n\tStrCmp $OUT '9.0.03' 0 error\n\n\t${VersionConvert} '0.15c-9m' '' $OUT\n\tStrCmp $OUT '0.15.03.9.13' 0 error\n\n\t${VersionConvert} '0.15c+' 'abcdefghijklmnopqrstuvwxyz+' $OUT\n\tStrCmp $OUT '0.15.0327' 0 error\n\n\t${VersionConvert} '0.0xa12.x.ax|.|.|x|a|.3|a.4.||5.|' '' $OUT\n\tStrCmp $OUT '0.0.2401.12.24.0124.24.01.3.01.4.5' 0 error\n\n\tgoto +2\n\terror:\n\tSetErrors\n\n\t${StackVerificationEnd}\nSectionEnd\n\n\nSection WriteUninstaller\n\tgoto +2\n\tWriteUninstaller '$EXEDIR\\un.WordFuncTest.exe'\nSectionEnd\n\n\n\n;############### UNINSTALL ###############\n\nSection un.Uninstall\n\t${WordFind} 'C:\\io.sys C:\\Program Files C:\\WINDOWS' ' C:\\' '-02' $OUT\n\t${WordFindS} 'C:\\io.sys C:\\Program Files C:\\WINDOWS' ' C:\\' '-02' $OUT\n\t${WordFind2X} '[C:\\io.sys];[C:\\logo.sys];[C:\\WINDOWS]' '[C:\\' '];' '+2' $OUT\n\t${WordFind2XS} '[C:\\io.sys];[C:\\logo.sys];[C:\\WINDOWS]' '[C:\\' '];' '+2' $OUT\n\t${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT\n\t${WordFind3XS} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT\n\t${WordReplace} 'C:\\io.sys C:\\logo.sys C:\\WINDOWS' 'SYS' 'bmp' '+2' $OUT\n\t${WordReplaceS} 'C:\\io.sys C:\\logo.sys C:\\WINDOWS' 'SYS' 'bmp' '+2' $OUT\n\t${WordAdd} 'C:\\io.sys C:\\WINDOWS' ' ' '+C:\\WINDOWS C:\\config.sys' $OUT\n\t${WordAddS} 'C:\\io.sys C:\\WINDOWS' ' ' '+C:\\WINDOWS C:\\config.sys' $OUT\n\t${WordInsert} 'C:\\io.sys C:\\WINDOWS' ' ' 'C:\\logo.sys' '-2' $OUT\n\t${WordInsertS} 'C:\\io.sys C:\\WINDOWS' ' ' 'C:\\logo.sys' '-2' $OUT\n\t${StrFilter} '123abc 456DEF 7890|%#' '+' '' '' $OUT\n\t${StrFilterS} '123abc 456DEF 7890|%#' '+' '' '' $OUT\n\t${VersionCompare} '1.1.1.9' '1.1.1.01' $OUT\n\t${VersionConvert} '9.0a' '' $OUT\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/bigtest.nsi",
    "content": "; bigtest.nsi\n;\n; This script attempts to test most of the functionality of the NSIS exehead.\n\n;--------------------------------\n\n!ifdef HAVE_UPX\n!packhdr tmp.dat \"upx\\upx -9 tmp.dat\"\n!endif\n\n!ifdef NOCOMPRESS\nSetCompress off\n!endif\n\n;--------------------------------\n\nName \"BigNSISTest\"\nCaption \"NSIS Big Test\"\nIcon \"${NSISDIR}\\Contrib\\Graphics\\Icons\\nsis1-install.ico\"\nOutFile \"bigtest.exe\"\n\nSetDateSave on\nSetDatablockOptimize on\nCRCCheck on\nSilentInstall normal\nBGGradient 000000 800000 FFFFFF\nInstallColors FF8080 000030\nXPStyle on\n\nInstallDir \"$PROGRAMFILES\\NSISTest\\BigNSISTest\"\nInstallDirRegKey HKLM \"Software\\NSISTest\\BigNSISTest\" \"Install_Dir\"\n\nCheckBitmap \"${NSISDIR}\\Contrib\\Graphics\\Checks\\classic-cross.bmp\"\n\nLicenseText \"A test text, make sure it's all there\"\nLicenseData \"bigtest.nsi\"\n\nRequestExecutionLevel admin\n\n;--------------------------------\n\nPage license\nPage components\nPage directory\nPage instfiles\n\nUninstPage uninstConfirm\nUninstPage instfiles\n\n;--------------------------------\n\n!ifndef NOINSTTYPES ; only if not defined\n  InstType \"Most\"\n  InstType \"Full\"\n  InstType \"More\"\n  InstType \"Base\"\n  ;InstType /NOCUSTOM\n  ;InstType /COMPONENTSONLYONCUSTOM\n!endif\n\nAutoCloseWindow false\nShowInstDetails show\n\n;--------------------------------\n\nSection \"\" ; empty string makes it hidden, so would starting with -\n\n  ; write reg info\n  StrCpy $1 \"POOOOOOOOOOOP\"\n  DetailPrint \"I like to be able to see what is going on (debug) $1\"\n  WriteRegStr HKLM SOFTWARE\\NSISTest\\BigNSISTest \"Install_Dir\" \"$INSTDIR\"\n\n  ; write uninstall strings\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\BigNSISTest\" \"DisplayName\" \"BigNSISTest (remove only)\"\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\BigNSISTest\" \"UninstallString\" '\"$INSTDIR\\bt-uninst.exe\"'\n\n  SetOutPath $INSTDIR\n  File /a \"silent.nsi\"\n  CreateDirectory \"$INSTDIR\\MyProjectFamily\\MyProject\" ; 2 recursively create a directory for fun.\n  WriteUninstaller \"bt-uninst.exe\"\n  \n  Nop ; for fun\n\nSectionEnd\n\nSection \"TempTest\"\n\nSectionIn 1 2 3\n  Start: MessageBox MB_OK \"Start:\"\n\n  MessageBox MB_YESNO \"Goto MyLabel\" IDYES MyLabel\n\n  MessageBox MB_OK \"Right before MyLabel:\"\n\n  MyLabel: MessageBox MB_OK \"MyLabel:\"\n  \n  MessageBox MB_OK \"Right after MyLabel:\"\n\n  MessageBox MB_YESNO \"Goto Start:?\" IDYES Start\n\nSectionEnd\n\nSectionGroup /e SectionGroup1\n\nSection \"Test Registry/INI functions\"\n\nSectionIn 1 4 3\n\n  WriteRegStr HKLM SOFTWARE\\NSISTest\\BigNSISTest \"StrTest_INSTDIR\" \"$INSTDIR\"\n  WriteRegDword HKLM SOFTWARE\\NSISTest\\BigNSISTest \"DwordTest_0xDEADBEEF\" 0xdeadbeef\n  WriteRegDword HKLM SOFTWARE\\NSISTest\\BigNSISTest \"DwordTest_123456\" 123456\n  WriteRegDword HKLM SOFTWARE\\NSISTest\\BigNSISTest \"DwordTest_0123\" 0123\n  WriteRegBin HKLM SOFTWARE\\NSISTest\\BigNSISTest \"BinTest_deadbeef01f00dbeef\" \"DEADBEEF01F00DBEEF\"\n  StrCpy $8 \"$SYSDIR\\IniTest\"\n  WriteINIStr \"$INSTDIR\\test.ini\"  \"MySection\" \"Value1\" $8\n  WriteINIStr \"$INSTDIR\\test.ini\"  \"MySectionIni\" \"Value1\" $8\n  WriteINIStr \"$INSTDIR\\test.ini\"  \"MySectionIni\" \"Value2\" $8\n  WriteINIStr \"$INSTDIR\\test.ini\"  \"IniOn\" \"Value1\" $8\n\n  Call MyFunctionTest\n\n  DeleteINIStr \"$INSTDIR\\test.ini\" \"IniOn\" \"Value1\"\n  DeleteINISec \"$INSTDIR\\test.ini\" \"MySectionIni\"\n\n  ReadINIStr $1 \"$INSTDIR\\test.ini\" \"MySectionIni\" \"Value1\"\n  StrCmp $1 \"\" INIDelSuccess\n    MessageBox MB_OK \"DeleteINISec failed\"\n  INIDelSuccess:\n\n  ClearErrors\n  ReadRegStr $1 HKCR \"software\\microsoft\" xyz_cc_does_not_exist\n  IfErrors 0 NoError\n    MessageBox MB_OK \"could not read from HKCR\\software\\microsoft\\xyz_cc_does_not_exist\"\n    Goto ErrorYay\n  NoError:\n    MessageBox MB_OK \"read '$1' from HKCR\\software\\microsoft\\xyz_cc_does_not_exist\"\n  ErrorYay:\n  \nSectionEnd\n\nSection \"Test CreateShortCut\"\n\n  SectionIn 1 2 3\n\n  Call CSCTest\n\nSectionEnd\n\nSectionGroup Group2\n\nSection \"Test Branching\" \n  \n  BeginTestSection:\n  SectionIn 1 2 3\n \n  SetOutPath $INSTDIR\n\n  IfFileExists \"$INSTDIR\\LogicLib.nsi\" 0 BranchTest69\n    \n    MessageBox MB_YESNO|MB_ICONQUESTION \"Would you like to overwrite $INSTDIR\\LogicLib.nsi?\" IDNO NoOverwrite ; skipped if file doesn't exist\n\n    BranchTest69:\n  \n    SetOverwrite ifnewer ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS\n\n  NoOverwrite:\n\n  File \"LogicLib.nsi\" ; skipped if answered no\n  SetOverwrite try ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS\n\n  MessageBox MB_YESNO|MB_ICONQUESTION \"Would you like to skip the rest of this section?\" IDYES EndTestBranch\n  MessageBox MB_YESNO|MB_ICONQUESTION \"Would you like to go back to the beginning of this section?\" IDYES BeginTestSection\n  MessageBox MB_YESNO|MB_ICONQUESTION \"Would you like to hide the installer and wait five seconds?\" IDNO NoHide\n\n    HideWindow\n    Sleep 5000\n    BringToFront\n\n  NoHide:\n\n  MessageBox MB_YESNO|MB_ICONQUESTION \"Would you like to call the function 5 times?\" IDNO NoRecurse\n\n    StrCpy $1 \"x\"\n\n  LoopTest: \n      \n    Call myfunc\n    StrCpy $1 \"x$1\"\n    StrCmp $1 \"xxxxxx\" 0 LoopTest\n      \n  NoRecurse:\n\n  EndTestBranch:\n\nSectionEnd\n\nSectionGroupEnd\n\nSection \"Test CopyFiles\"\n\n  SectionIn 1 2 3\n\n  SetOutPath $INSTDIR\\cpdest\n  CopyFiles \"$WINDIR\\*.ini\" \"$INSTDIR\\cpdest\" 0\n\nSectionEnd\n\nSectionGroupEnd\n\nSection \"Test Exec functions\" TESTIDX\n\n  SectionIn 1 2 3\n  \n  SearchPath $1 notepad.exe\n\n  MessageBox MB_OK \"notepad.exe=$1\"\n  Exec '\"$1\"'\n  ExecShell \"open\" '\"$INSTDIR\"'\n  Sleep 500\n  BringToFront\n\nSectionEnd\n\nSection \"Test ActiveX control registration\"\n\n  SectionIn 2\n\n  UnRegDLL \"$SYSDIR\\spin32.ocx\"\n  Sleep 1000\n  RegDLL \"$SYSDIR\\spin32.ocx\"\n  Sleep 1000\n  \nSectionEnd\n\n;--------------------------------\n\nFunction \"CSCTest\"\n  \n  CreateDirectory \"$SMPROGRAMS\\Big NSIS Test\"\n  SetOutPath $INSTDIR ; for working directory\n  CreateShortCut \"$SMPROGRAMS\\Big NSIS Test\\Uninstall BIG NSIS Test.lnk\" \"$INSTDIR\\bt-uninst.exe\" ; use defaults for parameters, icon, etc.\n  ; this one will use notepad's icon, start it minimized, and give it a hotkey (of Ctrl+Shift+Q)\n  CreateShortCut \"$SMPROGRAMS\\Big NSIS Test\\silent.nsi.lnk\" \"$INSTDIR\\silent.nsi\" \"\" \"$WINDIR\\notepad.exe\" 0 SW_SHOWMINIMIZED CONTROL|SHIFT|Q\n  CreateShortCut \"$SMPROGRAMS\\Big NSIS Test\\TheDir.lnk\" \"$INSTDIR\\\" \"\" \"\" 0 SW_SHOWMAXIMIZED CONTROL|SHIFT|Z\n\nFunctionEnd\n\nFunction myfunc\n\n  StrCpy $2 \"MyTestVar=$1\"\n  MessageBox MB_OK \"myfunc: $2\"\n\nFunctionEnd\n\nFunction MyFunctionTest\n\n  ReadINIStr $1 \"$INSTDIR\\test.ini\" \"MySectionIni\" \"Value1\"\n  StrCmp $1 $8 NoFailedMsg\n    MessageBox MB_OK \"WriteINIStr failed\"\n  \n  NoFailedMsg:\n\nFunctionEnd\n\nFunction .onSelChange\n\n  SectionGetText ${TESTIDX} $0\n  StrCmp $0 \"\" e\n    SectionSetText ${TESTIDX} \"\"\n  Goto e2\ne:\n  SectionSetText ${TESTIDX} \"TextInSection\"\ne2:\n\nFunctionEnd\n\n;--------------------------------\n\n; Uninstaller\n\nUninstallText \"This will uninstall example2. Hit next to continue.\"\nUninstallIcon \"${NSISDIR}\\Contrib\\Graphics\\Icons\\nsis1-uninstall.ico\"\n\nSection \"Uninstall\"\n\n  DeleteRegKey HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\BigNSISTest\"\n  DeleteRegKey HKLM \"SOFTWARE\\NSISTest\\BigNSISTest\"\n  Delete \"$INSTDIR\\silent.nsi\"\n  Delete \"$INSTDIR\\LogicLib.nsi\"\n  Delete \"$INSTDIR\\bt-uninst.exe\"\n  Delete \"$INSTDIR\\test.ini\"\n  Delete \"$SMPROGRAMS\\Big NSIS Test\\*.*\"\n  RMDir \"$SMPROGRAMS\\BiG NSIS Test\"\n  \n  MessageBox MB_YESNO|MB_ICONQUESTION \"Would you like to remove the directory $INSTDIR\\cpdest?\" IDNO NoDelete\n    Delete \"$INSTDIR\\cpdest\\*.*\"\n    RMDir \"$INSTDIR\\cpdest\" ; skipped if no\n  NoDelete:\n  \n  RMDir \"$INSTDIR\\MyProjectFamily\\MyProject\"\n  RMDir \"$INSTDIR\\MyProjectFamily\"\n  RMDir \"$INSTDIR\"\n\n  IfFileExists \"$INSTDIR\" 0 NoErrorMsg\n    MessageBox MB_OK \"Note: $INSTDIR could not be removed!\" IDOK 0 ; skipped if file doesn't exist\n  NoErrorMsg:\n\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/example1.nsi",
    "content": "; example1.nsi\n;\n; This script is perhaps one of the simplest NSIs you can make. All of the\n; optional settings are left to their default settings. The installer simply \n; prompts the user asking them where to install, and drops a copy of example1.nsi\n; there. \n\n;--------------------------------\n\n; The name of the installer\nName \"Example1\"\n\n; The file to write\nOutFile \"example1.exe\"\n\n; The default installation directory\nInstallDir $DESKTOP\\Example1\n\n; Request application privileges for Windows Vista\nRequestExecutionLevel user\n\n;--------------------------------\n\n; Pages\n\nPage directory\nPage instfiles\n\n;--------------------------------\n\n; The stuff to install\nSection \"\" ;No components page, name is not important\n\n  ; Set output path to the installation directory.\n  SetOutPath $INSTDIR\n  \n  ; Put file there\n  File example1.nsi\n  \nSectionEnd ; end the section\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/example2.nsi",
    "content": "; example2.nsi\n;\n; This script is based on example1.nsi, but it remember the directory, \n; has uninstall support and (optionally) installs start menu shortcuts.\n;\n; It will install example2.nsi into a directory that the user selects,\n\n;--------------------------------\n\n; The name of the installer\nName \"Example2\"\n\n; The file to write\nOutFile \"example2.exe\"\n\n; The default installation directory\nInstallDir $PROGRAMFILES\\Example2\n\n; Registry key to check for directory (so if you install again, it will \n; overwrite the old one automatically)\nInstallDirRegKey HKLM \"Software\\NSIS_Example2\" \"Install_Dir\"\n\n; Request application privileges for Windows Vista\nRequestExecutionLevel admin\n\n;--------------------------------\n\n; Pages\n\nPage components\nPage directory\nPage instfiles\n\nUninstPage uninstConfirm\nUninstPage instfiles\n\n;--------------------------------\n\n; The stuff to install\nSection \"Example2 (required)\"\n\n  SectionIn RO\n  \n  ; Set output path to the installation directory.\n  SetOutPath $INSTDIR\n  \n  ; Put file there\n  File \"example2.nsi\"\n  \n  ; Write the installation path into the registry\n  WriteRegStr HKLM SOFTWARE\\NSIS_Example2 \"Install_Dir\" \"$INSTDIR\"\n  \n  ; Write the uninstall keys for Windows\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Example2\" \"DisplayName\" \"NSIS Example2\"\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Example2\" \"UninstallString\" '\"$INSTDIR\\uninstall.exe\"'\n  WriteRegDWORD HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Example2\" \"NoModify\" 1\n  WriteRegDWORD HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Example2\" \"NoRepair\" 1\n  WriteUninstaller \"uninstall.exe\"\n  \nSectionEnd\n\n; Optional section (can be disabled by the user)\nSection \"Start Menu Shortcuts\"\n\n  CreateDirectory \"$SMPROGRAMS\\Example2\"\n  CreateShortCut \"$SMPROGRAMS\\Example2\\Uninstall.lnk\" \"$INSTDIR\\uninstall.exe\" \"\" \"$INSTDIR\\uninstall.exe\" 0\n  CreateShortCut \"$SMPROGRAMS\\Example2\\Example2 (MakeNSISW).lnk\" \"$INSTDIR\\example2.nsi\" \"\" \"$INSTDIR\\example2.nsi\" 0\n  \nSectionEnd\n\n;--------------------------------\n\n; Uninstaller\n\nSection \"Uninstall\"\n  \n  ; Remove registry keys\n  DeleteRegKey HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Example2\"\n  DeleteRegKey HKLM SOFTWARE\\NSIS_Example2\n\n  ; Remove files and uninstaller\n  Delete $INSTDIR\\example2.nsi\n  Delete $INSTDIR\\uninstall.exe\n\n  ; Remove shortcuts, if any\n  Delete \"$SMPROGRAMS\\Example2\\*.*\"\n\n  ; Remove directories used\n  RMDir \"$SMPROGRAMS\\Example2\"\n  RMDir \"$INSTDIR\"\n\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/gfx.nsi",
    "content": "; gfx.nsi\n;\n; This script shows some examples of using all of the new\n; graphic related additions introduced in NSIS 2\n;\n; Written by Amir Szkeley 22nd July 2002\n\n;--------------------------------\n\n!macro BIMAGE IMAGE PARMS\n\tPush $0\n\tGetTempFileName $0\n\tFile /oname=$0 \"${IMAGE}\"\n\tSetBrandingImage ${PARMS} $0\n\tDelete $0\n\tPop $0\n!macroend\n\n;--------------------------------\n\nName \"Graphical effects\"\n\nOutFile \"gfx.exe\"\n\n; Adds an XP manifest to the installer\nXPStyle on\n\n; Add branding image to the installer (an image placeholder on the side).\n; It is not enough to just add the placeholder, we must set the image too...\n; We will later set the image in every pre-page function.\n; We can also set just one persistent image in .onGUIInit\nAddBrandingImage left 100\n\n; Sets the font of the installer\nSetFont \"Comic Sans MS\" 8\n\n; Just to make it three pages...\nSubCaption 0 \": Yet another page...\"\nSubCaption 2 \": Yet another page...\"\nLicenseText \"License page\"\nLicenseData \"gfx.nsi\"\nDirText \"Lets make a third page!\"\n\n; Install dir\nInstallDir \"${NSISDIR}\\Examples\"\n\n; Request application privileges for Windows Vista\nRequestExecutionLevel user\n\n;--------------------------------\n\n; Pages\nPage license licenseImage\nPage custom customPage\nPage directory dirImage\nPage instfiles instImage\n\n;--------------------------------\n\nSection \"\"\n\t; You can also use the BI_NEXT macro here...\n\tMessageBox MB_YESNO \"We can change the branding image from within a section too!$\\nDo you want me to change it?\" IDNO done\n\t\t!insertmacro BIMAGE \"${NSISDIR}\\Contrib\\Graphics\\Wizard\\nsis.bmp\" \"\"\n\tdone:\n\tWriteUninstaller uninst.exe\nSectionEnd\n\n;--------------------------------\n\nFunction licenseImage\n\t!insertmacro BIMAGE \"${NSISDIR}\\Contrib\\Graphics\\Header\\nsis.bmp\" /RESIZETOFIT\n\tMessageBox MB_YESNO 'Would you like to skip the license page?' IDNO no\n\t\tAbort\n\tno:\nFunctionEnd\n\nFunction customPage\n\t!insertmacro BIMAGE \"${NSISDIR}\\Contrib\\Graphics\\Checks\\modern.bmp\" /RESIZETOFIT\n\tMessageBox MB_OK 'This is a nice custom \"page\" with yet another image :P'\n\t#insert install options/start menu/<insert plugin name here> here\nFunctionEnd\n\nFunction dirImage\n\t!insertmacro BIMAGE \"${NSISDIR}\\Contrib\\Graphics\\Header\\win.bmp\" /RESIZETOFIT\nFunctionEnd\n\nFunction instImage\n\t!insertmacro BIMAGE \"${NSISDIR}\\Contrib\\Graphics\\Wizard\\llama.bmp\" /RESIZETOFIT\nFunctionEnd\n\n;--------------------------------\n\n; Uninstall pages\n\nUninstPage uninstConfirm un.uninstImage\nUninstPage custom un.customPage\nUninstPage instfiles un.instImage\n\nFunction un.uninstImage\n\t!insertmacro BIMAGE \"${NSISDIR}\\Contrib\\Graphics\\Checks\\modern.bmp\" /RESIZETOFIT\nFunctionEnd\n\nFunction un.customPage\n\t!insertmacro BIMAGE \"${NSISDIR}\\Contrib\\Graphics\\Header\\win.bmp\" /RESIZETOFIT\n\tMessageBox MB_OK 'This is a nice uninstaller custom \"page\" with yet another image :P'\n\t#insert install options/start menu/<insert plugin name here> here\nFunctionEnd\n\nFunction un.instImage\n\t!insertmacro BIMAGE \"${NSISDIR}\\Contrib\\Graphics\\Wizard\\llama.bmp\" /RESIZETOFIT\nFunctionEnd\n\n;--------------------------------\n\n; Uninstaller\n\n; Another page for uninstaller\nUninstallText \"Another page...\"\n\nSection uninstall\n\tMessageBox MB_OK \"Bla\"\nSectionEnd\n\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/languages.nsi",
    "content": "; languages.nsi\n;\n; This is an example of a multilingual installer\n; The user can select the language on startup\n\n;--------------------------------\n\nOutFile languages.exe\n\nXPStyle on\n\nRequestExecutionLevel user\n\n;--------------------------------\n\nPage license\nPage components\nPage instfiles\n\n;--------------------------------\n\n; First is default\nLoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\English.nlf\"\nLoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\Dutch.nlf\"\nLoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\French.nlf\"\nLoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\German.nlf\"\nLoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\Korean.nlf\"\nLoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\Russian.nlf\"\nLoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\Spanish.nlf\"\nLoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\Swedish.nlf\"\nLoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\TradChinese.nlf\"\nLoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\SimpChinese.nlf\"\nLoadLanguageFile \"${NSISDIR}\\Contrib\\Language files\\Slovak.nlf\"\n\n; License data\n; Not exactly translated, but it shows what's needed\nLicenseLangString myLicenseData ${LANG_ENGLISH} \"bigtest.nsi\"\nLicenseLangString myLicenseData ${LANG_DUTCH} \"waplugin.nsi\"\nLicenseLangString myLicenseData ${LANG_FRENCH} \"example1.nsi\"\nLicenseLangString myLicenseData ${LANG_GERMAN} \"example2.nsi\"\nLicenseLangString myLicenseData ${LANG_KOREAN} \"gfx.nsi\"\nLicenseLangString myLicenseData ${LANG_RUSSIAN} \"languages.nsi\"\nLicenseLangString myLicenseData ${LANG_SPANISH} \"LogicLib.nsi\"\nLicenseLangString myLicenseData ${LANG_SWEDISH} \"makensis.nsi\"\nLicenseLangString myLicenseData ${LANG_TRADCHINESE} \"one-section.nsi\"\nLicenseLangString myLicenseData ${LANG_SIMPCHINESE} \"primes.nsi\"\nLicenseLangString myLicenseData ${LANG_SLOVAK} \"silent.nsi\"\n\nLicenseData $(myLicenseData)\n\n; Set name using the normal interface (Name command)\nLangString Name ${LANG_ENGLISH} \"English\"\nLangString Name ${LANG_DUTCH} \"Dutch\"\nLangString Name ${LANG_FRENCH} \"French\"\nLangString Name ${LANG_GERMAN} \"German\"\nLangString Name ${LANG_KOREAN} \"Korean\"\nLangString Name ${LANG_RUSSIAN} \"Russian\"\nLangString Name ${LANG_SPANISH} \"Spanish\"\nLangString Name ${LANG_SWEDISH} \"Swedish\"\nLangString Name ${LANG_TRADCHINESE} \"Traditional Chinese\"\nLangString Name ${LANG_SIMPCHINESE} \"Simplified Chinese\"\nLangString Name ${LANG_SLOVAK} \"Slovak\"\n\nName $(Name)\n\n; Directly change the inner lang strings (Same as ComponentText)\nLangString ^ComponentsText ${LANG_ENGLISH} \"English component page\"\nLangString ^ComponentsText ${LANG_DUTCH} \"Dutch component page\"\nLangString ^ComponentsText ${LANG_FRENCH} \"French component page\"\nLangString ^ComponentsText ${LANG_GERMAN} \"German component page\"\nLangString ^ComponentsText ${LANG_KOREAN} \"Korean component page\"\nLangString ^ComponentsText ${LANG_RUSSIAN} \"Russian component page\"\nLangString ^ComponentsText ${LANG_SPANISH} \"Spanish component page\"\nLangString ^ComponentsText ${LANG_SWEDISH} \"Swedish component page\"\nLangString ^ComponentsText ${LANG_TRADCHINESE} \"Traditional Chinese component page\"\nLangString ^ComponentsText ${LANG_SIMPCHINESE} \"Simplified Chinese component page\"\nLangString ^ComponentsText ${LANG_SLOVAK} \"Slovak component page\"\n\n; Set one text for all languages (simply don't use a LangString)\nCompletedText \"Languages example completed\"\n\n; A LangString for the section name\nLangString Sec1Name ${LANG_ENGLISH} \"English section #1\"\nLangString Sec1Name ${LANG_DUTCH} \"Dutch section #1\"\nLangString Sec1Name ${LANG_FRENCH} \"French section #1\"\nLangString Sec1Name ${LANG_GERMAN} \"German section #1\"\nLangString Sec1Name ${LANG_KOREAN} \"Korean section #1\"\nLangString Sec1Name ${LANG_RUSSIAN} \"Russian section #1\"\nLangString Sec1Name ${LANG_SPANISH} \"Spanish section #1\"\nLangString Sec1Name ${LANG_SWEDISH} \"Swedish section #1\"\nLangString Sec1Name ${LANG_TRADCHINESE} \"Trandional Chinese section #1\"\nLangString Sec1Name ${LANG_SIMPCHINESE} \"Simplified Chinese section #1\"\nLangString Sec1Name ${LANG_SLOVAK} \"Slovak section #1\"\n\n; A multilingual message\nLangString Message ${LANG_ENGLISH} \"English message\"\nLangString Message ${LANG_DUTCH} \"Dutch message\"\nLangString Message ${LANG_FRENCH} \"French message\"\nLangString Message ${LANG_GERMAN} \"German message\"\nLangString Message ${LANG_KOREAN} \"Korean message\"\nLangString Message ${LANG_RUSSIAN} \"Russian message\"\nLangString Message ${LANG_SPANISH} \"Spanish message\"\nLangString Message ${LANG_SWEDISH} \"Swedish message\"\nLangString Message ${LANG_TRADCHINESE} \"Trandional Chinese message\"\nLangString Message ${LANG_SIMPCHINESE} \"Simplified Chinese message\"\nLangString Message ${LANG_SLOVAK} \"Slovak message\"\n\n;--------------------------------\n\n;Section names set by Language strings\n;It works with ! too\nSection !$(Sec1Name) sec1\n\tMessageBox MB_OK $(Message)\nSectionEnd\n\n; The old, slow, wasteful way\n; Look at this section and see why LangString is so much easier\nSection \"Section number two\"\n\tStrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2\n\t\tMessageBox MB_OK \"Installing English stuff\"\n\tStrCmp $LANGUAGE ${LANG_DUTCH} 0 +2\n\t\tMessageBox MB_OK \"Installing Dutch stuff\"\n\tStrCmp $LANGUAGE ${LANG_FRENCH} 0 +2\n\t\tMessageBox MB_OK \"Installing French stuff\"\n\tStrCmp $LANGUAGE ${LANG_GERMAN} 0 +2\n\t\tMessageBox MB_OK \"Installing German stuff\"\n\tStrCmp $LANGUAGE ${LANG_KOREAN} 0 +2\n\t\tMessageBox MB_OK \"Installing Korean stuff\"\n\tStrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +2\n\t\tMessageBox MB_OK \"Installing Russian stuff\"\n\tStrCmp $LANGUAGE ${LANG_SPANISH} 0 +2\n\t\tMessageBox MB_OK \"Installing Spanish stuff\"\n\tStrCmp $LANGUAGE ${LANG_SWEDISH} 0 +2\n\t\tMessageBox MB_OK \"Installing Swedish stuff\"\n\tStrCmp $LANGUAGE ${LANG_TRADCHINESE} 0 +2\n\t\tMessageBox MB_OK \"Installing Traditional Chinese stuff\"\n\tStrCmp $LANGUAGE ${LANG_SIMPCHINESE} 0 +2\n\t\tMessageBox MB_OK \"Installing Simplified Chinese stuff\"\n\tStrCmp $LANGUAGE ${LANG_SLOVAK} 0 +2\n\t\tMessageBox MB_OK \"Installing Slovak stuff\"\nSectionEnd\n\n;--------------------------------\n\nFunction .onInit\n\n\t;Language selection dialog\n\n\tPush \"\"\n\tPush ${LANG_ENGLISH}\n\tPush English\n\tPush ${LANG_DUTCH}\n\tPush Dutch\n\tPush ${LANG_FRENCH}\n\tPush French\n\tPush ${LANG_GERMAN}\n\tPush German\n\tPush ${LANG_KOREAN}\n\tPush Korean\n\tPush ${LANG_RUSSIAN}\n\tPush Russian\n\tPush ${LANG_SPANISH}\n\tPush Spanish\n\tPush ${LANG_SWEDISH}\n\tPush Swedish\n\tPush ${LANG_TRADCHINESE}\n\tPush \"Traditional Chinese\"\n\tPush ${LANG_SIMPCHINESE}\n\tPush \"Simplified Chinese\"\n\tPush ${LANG_SLOVAK}\n\tPush Slovak\n\tPush A ; A means auto count languages\n\t       ; for the auto count to work the first empty push (Push \"\") must remain\n\tLangDLL::LangDialog \"Installer Language\" \"Please select the language of the installer\"\n\n\tPop $LANGUAGE\n\tStrCmp $LANGUAGE \"cancel\" 0 +2\n\t\tAbort\nFunctionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/makensis.nsi",
    "content": ";NSIS Setup Script\n;--------------------------------\n\n!ifndef VERSION\n  !define VERSION 'anonymous-build'\n!endif\n\n;--------------------------------\n;Configuration\n\n!ifdef OUTFILE\n  OutFile \"${OUTFILE}\"\n!else\n  OutFile ..\\nsis-${VERSION}-setup.exe\n!endif\n\nSetCompressor /SOLID lzma\n\nInstType \"Full\"\nInstType \"Lite\"\nInstType \"Minimal\"\n\nInstallDir $PROGRAMFILES\\NSIS\nInstallDirRegKey HKLM Software\\NSIS \"\"\n\nRequestExecutionLevel admin\n\n;--------------------------------\n;Header Files\n\n!include \"MUI2.nsh\"\n!include \"Sections.nsh\"\n!include \"LogicLib.nsh\"\n!include \"Memento.nsh\"\n!include \"WordFunc.nsh\"\n\n;--------------------------------\n;Functions\n\n!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD\n\n  !insertmacro VersionCompare\n\n!endif\n\n;--------------------------------\n;Definitions\n\n!define SHCNE_ASSOCCHANGED 0x8000000\n!define SHCNF_IDLIST 0\n\n;--------------------------------\n;Configuration\n\n;Names\nName \"NSIS\"\nCaption \"NSIS ${VERSION} Setup\"\n\n;Memento Settings\n!define MEMENTO_REGISTRY_ROOT HKLM\n!define MEMENTO_REGISTRY_KEY \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\"\n\n;Interface Settings\n!define MUI_ABORTWARNING\n\n!define MUI_HEADERIMAGE\n!define MUI_WELCOMEFINISHPAGE_BITMAP \"${NSISDIR}\\Contrib\\Graphics\\Wizard\\nsis.bmp\"\n\n!define MUI_COMPONENTSPAGE_SMALLDESC\n\n;Pages\n!define MUI_WELCOMEPAGE_TITLE \"Welcome to the NSIS ${VERSION} Setup Wizard\"\n!define MUI_WELCOMEPAGE_TEXT \"This wizard will guide you through the installation of NSIS (Nullsoft Scriptable Install System) ${VERSION}, the next generation of the Windows installer and uninstaller system that doesn't suck and isn't huge.$\\r$\\n$\\r$\\nNSIS 2 includes a new Modern User Interface, LZMA compression, support for multiple languages and an easy plug-in system.$\\r$\\n$\\r$\\n$_CLICK\"\n\n!insertmacro MUI_PAGE_WELCOME\n!insertmacro MUI_PAGE_LICENSE \"..\\COPYING\"\n!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD\nPage custom PageReinstall PageLeaveReinstall\n!endif\n!insertmacro MUI_PAGE_COMPONENTS\n!insertmacro MUI_PAGE_DIRECTORY\n!insertmacro MUI_PAGE_INSTFILES\n\n!define MUI_FINISHPAGE_LINK \"Visit the NSIS site for the latest news, FAQs and support\"\n!define MUI_FINISHPAGE_LINK_LOCATION \"http://nsis.sf.net/\"\n\n!define MUI_FINISHPAGE_RUN \"$INSTDIR\\NSIS.exe\"\n!define MUI_FINISHPAGE_NOREBOOTSUPPORT\n\n!define MUI_FINISHPAGE_SHOWREADME\n!define MUI_FINISHPAGE_SHOWREADME_TEXT \"Show release notes\"\n!define MUI_FINISHPAGE_SHOWREADME_FUNCTION ShowReleaseNotes\n\n!insertmacro MUI_PAGE_FINISH\n\n!insertmacro MUI_UNPAGE_CONFIRM\n!insertmacro MUI_UNPAGE_INSTFILES\n\n;--------------------------------\n;Languages\n\n!insertmacro MUI_LANGUAGE \"English\"\n\n;--------------------------------\n;Installer Sections\n\n${MementoSection} \"NSIS Core Files (required)\" SecCore\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing NSIS Core Files...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1 2 3 RO\n  SetOutPath $INSTDIR\n  RMDir /r $SMPROGRAMS\\NSIS\n\n  SetOverwrite on\n  File ..\\makensis.exe\n  File ..\\makensisw.exe\n  File ..\\COPYING\n  File ..\\NSIS.chm\n  File ..\\NSIS.exe\n  File /nonfatal ..\\NSIS.exe.manifest\n\n  IfFileExists $INSTDIR\\nsisconf.nsi \"\" +2\n  Rename $INSTDIR\\nsisconf.nsi $INSTDIR\\nsisconf.nsh\n  SetOverwrite off\n  File ..\\nsisconf.nsh\n  SetOverwrite on\n\n  SetOutPath $INSTDIR\\Stubs\n  File ..\\Stubs\\bzip2\n  File ..\\Stubs\\bzip2_solid\n  File ..\\Stubs\\lzma\n  File ..\\Stubs\\lzma_solid\n  File ..\\Stubs\\zlib\n  File ..\\Stubs\\zlib_solid\n  File ..\\Stubs\\uninst\n\n  SetOutPath $INSTDIR\\Include\n  File ..\\Include\\WinMessages.nsh\n  File ..\\Include\\Sections.nsh\n  File ..\\Include\\Library.nsh\n  File ..\\Include\\UpgradeDLL.nsh\n  File ..\\Include\\LogicLib.nsh\n  File ..\\Include\\StrFunc.nsh\n  File ..\\Include\\Colors.nsh\n  File ..\\Include\\FileFunc.nsh\n  File ..\\Include\\TextFunc.nsh\n  File ..\\Include\\WordFunc.nsh\n  File ..\\Include\\WinVer.nsh\n  File ..\\Include\\x64.nsh\n  File ..\\Include\\Memento.nsh\n  File ..\\Include\\LangFile.nsh\n  File ..\\Include\\InstallOptions.nsh\n  File ..\\Include\\MultiUser.nsh\n  File ..\\Include\\VB6RunTime.nsh\n  File ..\\Include\\Util.nsh\n  File ..\\Include\\WinCore.nsh\n\n  SetOutPath $INSTDIR\\Include\\Win\n  File ..\\Include\\Win\\WinDef.nsh\n  File ..\\Include\\Win\\WinError.nsh\n  File ..\\Include\\Win\\WinNT.nsh\n  File ..\\Include\\Win\\WinUser.nsh\n\n  SetOutPath $INSTDIR\\Docs\\StrFunc\n  File ..\\Docs\\StrFunc\\StrFunc.txt\n\n  SetOutPath $INSTDIR\\Docs\\MultiUser\n  File ..\\Docs\\MultiUser\\Readme.html\n\n  SetOutPath $INSTDIR\\Docs\\makensisw\n  File ..\\Docs\\makensisw\\*.txt\n\n  SetOutPath $INSTDIR\\Menu\n  File ..\\Menu\\*.html\n  SetOutPath $INSTDIR\\Menu\\images\n  File ..\\Menu\\images\\header.gif\n  File ..\\Menu\\images\\line.gif\n  File ..\\Menu\\images\\site.gif\n\n  Delete $INSTDIR\\makensis.htm\n  Delete $INSTDIR\\Docs\\*.html\n  Delete $INSTDIR\\Docs\\style.css\n  RMDir $INSTDIR\\Docs\n\n  SetOutPath $INSTDIR\\Bin\n  File ..\\Bin\\LibraryLocal.exe\n  File ..\\Bin\\RegTool.bin\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\TypeLib.dll\n\n  ReadRegStr $R0 HKCR \".nsi\" \"\"\n  StrCmp $R0 \"NSISFile\" 0 +2\n    DeleteRegKey HKCR \"NSISFile\"\n\n  WriteRegStr HKCR \".nsi\" \"\" \"NSIS.Script\"\n  WriteRegStr HKCR \"NSIS.Script\" \"\" \"NSIS Script File\"\n  WriteRegStr HKCR \"NSIS.Script\\DefaultIcon\" \"\" \"$INSTDIR\\makensisw.exe,1\"\n  ReadRegStr $R0 HKCR \"NSIS.Script\\shell\\open\\command\" \"\"\n  StrCmp $R0 \"\" 0 no_nsiopen\n    WriteRegStr HKCR \"NSIS.Script\\shell\" \"\" \"open\"\n    WriteRegStr HKCR \"NSIS.Script\\shell\\open\\command\" \"\" 'notepad.exe \"%1\"'\n  no_nsiopen:\n  WriteRegStr HKCR \"NSIS.Script\\shell\\compile\" \"\" \"Compile NSIS Script\"\n  WriteRegStr HKCR \"NSIS.Script\\shell\\compile\\command\" \"\" '\"$INSTDIR\\makensisw.exe\" \"%1\"'\n  WriteRegStr HKCR \"NSIS.Script\\shell\\compile-compressor\" \"\" \"Compile NSIS Script (Choose Compressor)\"\n  WriteRegStr HKCR \"NSIS.Script\\shell\\compile-compressor\\command\" \"\" '\"$INSTDIR\\makensisw.exe\" /ChooseCompressor \"%1\"'\n\n  ReadRegStr $R0 HKCR \".nsh\" \"\"\n  StrCmp $R0 \"NSHFile\" 0 +2\n    DeleteRegKey HKCR \"NSHFile\"\n\n  WriteRegStr HKCR \".nsh\" \"\" \"NSIS.Header\"\n  WriteRegStr HKCR \"NSIS.Header\" \"\" \"NSIS Header File\"\n  WriteRegStr HKCR \"NSIS.Header\\DefaultIcon\" \"\" \"$INSTDIR\\makensisw.exe,1\"\n  ReadRegStr $R0 HKCR \"NSIS.Header\\shell\\open\\command\" \"\"\n  StrCmp $R0 \"\" 0 no_nshopen\n    WriteRegStr HKCR \"NSIS.Header\\shell\" \"\" \"open\"\n    WriteRegStr HKCR \"NSIS.Header\\shell\\open\\command\" \"\" 'notepad.exe \"%1\"'\n  no_nshopen:\n\n  System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)'\n\n${MementoSectionEnd}\n\n${MementoSection} \"Script Examples\" SecExample\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Script Examples...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1 2\n  SetOutPath $INSTDIR\\Examples\n  File ..\\Examples\\makensis.nsi\n  File ..\\Examples\\example1.nsi\n  File ..\\Examples\\example2.nsi\n  File ..\\Examples\\viewhtml.nsi\n  File ..\\Examples\\waplugin.nsi\n  File ..\\Examples\\bigtest.nsi\n  File ..\\Examples\\primes.nsi\n  File ..\\Examples\\rtest.nsi\n  File ..\\Examples\\gfx.nsi\n  File ..\\Examples\\one-section.nsi\n  File ..\\Examples\\languages.nsi\n  File ..\\Examples\\Library.nsi\n  File ..\\Examples\\VersionInfo.nsi\n  File ..\\Examples\\UserVars.nsi\n  File ..\\Examples\\LogicLib.nsi\n  File ..\\Examples\\silent.nsi\n  File ..\\Examples\\StrFunc.nsi\n  File ..\\Examples\\FileFunc.nsi\n  File ..\\Examples\\FileFunc.ini\n  File ..\\Examples\\FileFuncTest.nsi\n  File ..\\Examples\\TextFunc.nsi\n  File ..\\Examples\\TextFunc.ini\n  File ..\\Examples\\TextFuncTest.nsi\n  File ..\\Examples\\WordFunc.nsi\n  File ..\\Examples\\WordFunc.ini\n  File ..\\Examples\\WordFuncTest.nsi\n  File ..\\Examples\\Memento.nsi\n\n  SetOutPath $INSTDIR\\Examples\\Plugin\n  File ..\\Examples\\Plugin\\exdll.c\n  File ..\\Examples\\Plugin\\exdll.dpr\n  File ..\\Examples\\Plugin\\exdll.dsp\n  File ..\\Examples\\Plugin\\exdll.dsw\n  File ..\\Examples\\Plugin\\exdll_with_unit.dpr\n  File ..\\Examples\\Plugin\\exdll-vs2008.sln\n  File ..\\Examples\\Plugin\\exdll-vs2008.vcproj\n  File ..\\Examples\\Plugin\\extdll.inc\n  File ..\\Examples\\Plugin\\nsis.pas\n\n  SetOutPath $INSTDIR\\Examples\\Plugin\\nsis\n  File ..\\Examples\\Plugin\\nsis\\pluginapi.h\n  File ..\\Examples\\Plugin\\nsis\\pluginapi.lib\n  File ..\\Examples\\Plugin\\nsis\\api.h\n\n${MementoSectionEnd}\n\n!ifndef NO_STARTMENUSHORTCUTS\n${MementoSection} \"Start Menu and Desktop Shortcuts\" SecShortcuts\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Start Menu and Desktop Shortcuts...\"\n  SetDetailsPrint listonly\n\n!else\n${MementoSection} \"Desktop Shortcut\" SecShortcuts\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Desktop Shortcut...\"\n  SetDetailsPrint listonly\n\n!endif\n  SectionIn 1 2\n  SetOutPath $INSTDIR\n!ifndef NO_STARTMENUSHORTCUTS\n  CreateShortCut \"$SMPROGRAMS\\NSIS.lnk\" \"$INSTDIR\\NSIS.exe\"\n!endif\n\n  CreateShortCut \"$DESKTOP\\NSIS.lnk\" \"$INSTDIR\\NSIS.exe\"\n\n${MementoSectionEnd}\n\nSectionGroup \"User Interfaces\" SecInterfaces\n\n${MementoSection} \"Modern User Interface\" SecInterfacesModernUI\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing User Interfaces | Modern User Interface...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1 2\n\n  SetOutPath \"$INSTDIR\\Examples\\Modern UI\"\n  File \"..\\Examples\\Modern UI\\Basic.nsi\"\n  File \"..\\Examples\\Modern UI\\HeaderBitmap.nsi\"\n  File \"..\\Examples\\Modern UI\\MultiLanguage.nsi\"\n  File \"..\\Examples\\Modern UI\\StartMenu.nsi\"\n  File \"..\\Examples\\Modern UI\\WelcomeFinish.nsi\"\n\n  SetOutPath \"$INSTDIR\\Contrib\\Modern UI\"\n  File \"..\\Contrib\\Modern UI\\System.nsh\"\n  File \"..\\Contrib\\Modern UI\\ioSpecial.ini\"\n\n  SetOutPath \"$INSTDIR\\Docs\\Modern UI\"\n  File \"..\\Docs\\Modern UI\\Readme.html\"\n  File \"..\\Docs\\Modern UI\\Changelog.txt\"\n  File \"..\\Docs\\Modern UI\\License.txt\"\n\n  SetOutPath \"$INSTDIR\\Docs\\Modern UI\\images\"\n  File \"..\\Docs\\Modern UI\\images\\header.gif\"\n  File \"..\\Docs\\Modern UI\\images\\screen1.png\"\n  File \"..\\Docs\\Modern UI\\images\\screen2.png\"\n  File \"..\\Docs\\Modern UI\\images\\open.gif\"\n  File \"..\\Docs\\Modern UI\\images\\closed.gif\"\n\n  SetOutPath $INSTDIR\\Contrib\\UIs\n  File \"..\\Contrib\\UIs\\modern.exe\"\n  File \"..\\Contrib\\UIs\\modern_headerbmp.exe\"\n  File \"..\\Contrib\\UIs\\modern_headerbmpr.exe\"\n  File \"..\\Contrib\\UIs\\modern_nodesc.exe\"\n  File \"..\\Contrib\\UIs\\modern_smalldesc.exe\"\n\n  SetOutPath $INSTDIR\\Include\n  File \"..\\Include\\MUI.nsh\"\n\n  SetOutPath \"$INSTDIR\\Contrib\\Modern UI 2\"\n  File \"..\\Contrib\\Modern UI 2\\Deprecated.nsh\"\n  File \"..\\Contrib\\Modern UI 2\\Interface.nsh\"\n  File \"..\\Contrib\\Modern UI 2\\Localization.nsh\"\n  File \"..\\Contrib\\Modern UI 2\\MUI2.nsh\"\n  File \"..\\Contrib\\Modern UI 2\\Pages.nsh\"\n\n  SetOutPath \"$INSTDIR\\Contrib\\Modern UI 2\\Pages\"\n  File \"..\\Contrib\\Modern UI 2\\Pages\\Components.nsh\"\n  File \"..\\Contrib\\Modern UI 2\\Pages\\Directory.nsh\"\n  File \"..\\Contrib\\Modern UI 2\\Pages\\Finish.nsh\"\n  File \"..\\Contrib\\Modern UI 2\\Pages\\InstallFiles.nsh\"\n  File \"..\\Contrib\\Modern UI 2\\Pages\\License.nsh\"\n  File \"..\\Contrib\\Modern UI 2\\Pages\\StartMenu.nsh\"\n  File \"..\\Contrib\\Modern UI 2\\Pages\\UninstallConfirm.nsh\"\n  File \"..\\Contrib\\Modern UI 2\\Pages\\Welcome.nsh\"\n\n  SetOutPath \"$INSTDIR\\Docs\\Modern UI 2\"\n  File \"..\\Docs\\Modern UI 2\\Readme.html\"\n  File \"..\\Docs\\Modern UI 2\\License.txt\"\n\n  SetOutPath \"$INSTDIR\\Docs\\Modern UI 2\\images\"\n  File \"..\\Docs\\Modern UI 2\\images\\header.gif\"\n  File \"..\\Docs\\Modern UI 2\\images\\screen1.png\"\n  File \"..\\Docs\\Modern UI 2\\images\\screen2.png\"\n  File \"..\\Docs\\Modern UI 2\\images\\open.gif\"\n  File \"..\\Docs\\Modern UI 2\\images\\closed.gif\"\n\n  SetOutPath $INSTDIR\\Include\n  File \"..\\Include\\MUI2.nsh\"\n\n${MementoSectionEnd}\n\n${MementoSection} \"Default User Interface\" SecInterfacesDefaultUI\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing User Interfaces | Default User Interface...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath \"$INSTDIR\\Contrib\\UIs\"\n  File \"..\\Contrib\\UIs\\default.exe\"\n\n${MementoSectionEnd}\n\n${MementoSection} \"Tiny User Interface\" SecInterfacesTinyUI\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing User Interfaces | Tiny User Interface...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath \"$INSTDIR\\Contrib\\UIs\"\n  File \"..\\Contrib\\UIs\\sdbarker_tiny.exe\"\n\n${MementoSectionEnd}\n\nSectionGroupEnd\n\n${MementoSection} \"Graphics\" SecGraphics\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Graphics...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  Delete $INSTDIR\\Contrib\\Icons\\*.ico\n  Delete $INSTDIR\\Contrib\\Icons\\*.bmp\n  RMDir $INSTDIR\\Contrib\\Icons\n  SetOutPath $INSTDIR\\Contrib\\Graphics\n  File /r \"..\\Contrib\\Graphics\\*.ico\"\n  File /r \"..\\Contrib\\Graphics\\*.bmp\"\n${MementoSectionEnd}\n\n${MementoSection} \"Language Files\" SecLangFiles\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Language Files...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath \"$INSTDIR\\Contrib\\Language files\"\n  File \"..\\Contrib\\Language files\\*.nlf\"\n\n  SetOutPath $INSTDIR\\Bin\n  File ..\\Bin\\MakeLangID.exe\n\n  !insertmacro SectionFlagIsSet ${SecInterfacesModernUI} ${SF_SELECTED} mui nomui\n  mui:\n    SetOutPath \"$INSTDIR\\Contrib\\Language files\"\n    File \"..\\Contrib\\Language files\\*.nsh\"\n  nomui:\n\n${MementoSectionEnd}\n\nSectionGroup \"Tools\" SecTools\n\n${MementoSection} \"Zip2Exe\" SecToolsZ2E\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Tools | Zip2Exe...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Bin\n  File ..\\Bin\\zip2exe.exe\n  SetOutPath $INSTDIR\\Contrib\\zip2exe\n  File ..\\Contrib\\zip2exe\\Base.nsh\n  File ..\\Contrib\\zip2exe\\Modern.nsh\n  File ..\\Contrib\\zip2exe\\Classic.nsh\n\n${MementoSectionEnd}\n\nSectionGroupEnd\n\nSectionGroup \"Plug-ins\" SecPluginsPlugins\n\n${MementoSection} \"Banner\" SecPluginsBanner\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | Banner...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\Banner.dll\n  SetOutPath $INSTDIR\\Docs\\Banner\n  File ..\\Docs\\Banner\\Readme.txt\n  SetOutPath $INSTDIR\\Examples\\Banner\n  File ..\\Examples\\Banner\\Example.nsi\n${MementoSectionEnd}\n\n${MementoSection} \"Language DLL\" SecPluginsLangDLL\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | Language DLL...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\LangDLL.dll\n${MementoSectionEnd}\n\n${MementoSection} \"nsExec\" SecPluginsnsExec\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | nsExec...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\nsExec.dll\n  SetOutPath $INSTDIR\\Docs\\nsExec\n  File ..\\Docs\\nsExec\\nsExec.txt\n  SetOutPath $INSTDIR\\Examples\\nsExec\n  File ..\\Examples\\nsExec\\test.nsi\n${MementoSectionEnd}\n\n${MementoSection} \"Splash\" SecPluginsSplash\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | Splash...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\splash.dll\n  SetOutPath $INSTDIR\\Docs\\Splash\n  File ..\\Docs\\Splash\\splash.txt\n  SetOutPath $INSTDIR\\Examples\\Splash\n  File ..\\Examples\\Splash\\Example.nsi\n${MementoSectionEnd}\n\n${MementoSection} \"AdvSplash\" SecPluginsSplashT\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | AdvSplash...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\advsplash.dll\n  SetOutPath $INSTDIR\\Docs\\AdvSplash\n  File ..\\Docs\\AdvSplash\\advsplash.txt\n  SetOutPath $INSTDIR\\Examples\\AdvSplash\n  File ..\\Examples\\AdvSplash\\Example.nsi\n${MementoSectionEnd}\n\n${MementoSection} \"BgImage\" SecPluginsBgImage\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | BgImage...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\BgImage.dll\n  SetOutPath $INSTDIR\\Docs\\BgImage\n  File ..\\Docs\\BgImage\\BgImage.txt\n  SetOutPath $INSTDIR\\Examples\\BgImage\n  File ..\\Examples\\BgImage\\Example.nsi\n${MementoSectionEnd}\n\n${MementoSection} \"InstallOptions\" SecPluginsIO\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | InstallOptions...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\InstallOptions.dll\n  SetOutPath $INSTDIR\\Docs\\InstallOptions\n  File ..\\Docs\\InstallOptions\\Readme.html\n  File ..\\Docs\\InstallOptions\\Changelog.txt\n  SetOutPath $INSTDIR\\Examples\\InstallOptions\n  File ..\\Examples\\InstallOptions\\test.ini\n  File ..\\Examples\\InstallOptions\\test.nsi\n  File ..\\Examples\\InstallOptions\\testimgs.ini\n  File ..\\Examples\\InstallOptions\\testimgs.nsi\n  File ..\\Examples\\InstallOptions\\testlink.ini\n  File ..\\Examples\\InstallOptions\\testlink.nsi\n  File ..\\Examples\\InstallOptions\\testnotify.ini\n  File ..\\Examples\\InstallOptions\\testnotify.nsi\n${MementoSectionEnd}\n\n${MementoSection} \"nsDialogs\" SecPluginsDialogs\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | nsDialogs...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\nsDialogs.dll\n  SetOutPath $INSTDIR\\Examples\\nsDialogs\n  File ..\\Examples\\nsDialogs\\example.nsi\n  File ..\\Examples\\nsDialogs\\InstallOptions.nsi\n  File ..\\Examples\\nsDialogs\\timer.nsi\n  File ..\\Examples\\nsDialogs\\welcome.nsi\n  SetOutPath $INSTDIR\\Include\n  File ..\\Include\\nsDialogs.nsh\n  SetOutPath $INSTDIR\\Docs\\nsDialogs\n  File ..\\Docs\\nsDialogs\\Readme.html\n${MementoSectionEnd}\n\n${MementoSection} \"Math\" SecPluginsMath\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | Math...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\Math.dll\n  SetOutPath $INSTDIR\\Docs\\Math\n  File ..\\Docs\\Math\\Math.txt\n  SetOutPath $INSTDIR\\Examples\\Math\n  File ..\\Examples\\Math\\math.nsi\n  File ..\\Examples\\Math\\mathtest.txt\n  File ..\\Examples\\Math\\mathtest.nsi\n  File ..\\Examples\\Math\\mathtest.ini\n\n${MementoSectionEnd}\n\n${MementoSection} \"NSISdl\" SecPluginsNSISDL\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | NSISdl...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\nsisdl.dll\n  SetOutPath $INSTDIR\\Docs\\NSISdl\n  File ..\\Docs\\NSISdl\\ReadMe.txt\n  File ..\\Docs\\NSISdl\\License.txt\n${MementoSectionEnd}\n\n${MementoSection} \"System\" SecPluginsSystem\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | System...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\System.dll\n  SetOutPath $INSTDIR\\Docs\\System\n  File ..\\Docs\\System\\System.html\n  File ..\\Docs\\System\\WhatsNew.txt\n  SetOutPath $INSTDIR\\Examples\\System\n  File ..\\Examples\\System\\Resource.dll\n  File ..\\Examples\\System\\SysFunc.nsh\n  File ..\\Examples\\System\\System.nsh\n  File ..\\Examples\\System\\System.nsi\n${MementoSectionEnd}\n\n${MementoSection} \"StartMenu\" SecPluginsStartMenu\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | StartMenu...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\StartMenu.dll\n  SetOutPath $INSTDIR\\Docs\\StartMenu\n  File ..\\Docs\\StartMenu\\Readme.txt\n  SetOutPath $INSTDIR\\Examples\\StartMenu\n  File ..\\Examples\\StartMenu\\Example.nsi\n${MementoSectionEnd}\n\n${MementoSection} \"UserInfo\" SecPluginsUserInfo\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | UserInfo...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\UserInfo.dll\n  SetOutPath $INSTDIR\\Examples\\UserInfo\n  File ..\\Examples\\UserInfo\\UserInfo.nsi\n${MementoSectionEnd}\n\n${MementoSection} \"Dialer\" SecPluginsDialer\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | Dialer...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\Dialer.dll\n  SetOutPath $INSTDIR\\Docs\\Dialer\n  File ..\\Docs\\Dialer\\Dialer.txt\n${MementoSectionEnd}\n\n${MementoSection} \"VPatch\" SecPluginsVPatch\n\n  SetDetailsPrint textonly\n  DetailPrint \"Installing Plug-ins | VPatch...\"\n  SetDetailsPrint listonly\n\n  SectionIn 1\n\n  SetOutPath $INSTDIR\\Plugins\n  File ..\\Plugins\\VPatch.dll\n  SetOutPath $INSTDIR\\Examples\\VPatch\n  File ..\\Examples\\VPatch\\example.nsi\n  File ..\\Examples\\VPatch\\oldfile.txt\n  File ..\\Examples\\VPatch\\newfile.txt\n  File ..\\Examples\\VPatch\\patch.pat\n  SetOutPath $INSTDIR\\Docs\\VPatch\n  File ..\\Docs\\VPatch\\Readme.html\n  SetOutPath $INSTDIR\\Bin\n  File ..\\Bin\\GenPat.exe\n  SetOutPath $INSTDIR\\Include\n  File ..\\Include\\VPatchLib.nsh\n${MementoSectionEnd}\n\n${MementoSectionDone}\n\nSectionGroupEnd\n\nSection -post\n\n  ; When Modern UI is installed:\n  ; * Always install the English language file\n  ; * Always install default icons / bitmaps\n\n  !insertmacro SectionFlagIsSet ${SecInterfacesModernUI} ${SF_SELECTED} mui nomui\n\n    mui:\n\n    SetDetailsPrint textonly\n    DetailPrint \"Configuring Modern UI...\"\n    SetDetailsPrint listonly\n\n    !insertmacro SectionFlagIsSet ${SecLangFiles} ${SF_SELECTED} langfiles nolangfiles\n\n      nolangfiles:\n\n      SetOutPath \"$INSTDIR\\Contrib\\Language files\"\n      File \"..\\Contrib\\Language files\\English.nlf\"\n      SetOutPath \"$INSTDIR\\Contrib\\Language files\"\n      File \"..\\Contrib\\Language files\\English.nsh\"\n\n    langfiles:\n\n    !insertmacro SectionFlagIsSet ${SecGraphics} ${SF_SELECTED} graphics nographics\n\n      nographics:\n\n      SetOutPath $INSTDIR\\Contrib\\Graphics\n      SetOutPath $INSTDIR\\Contrib\\Graphics\\Checks\n      File \"..\\Contrib\\Graphics\\Checks\\modern.bmp\"\n      SetOutPath $INSTDIR\\Contrib\\Graphics\\Icons\n      File \"..\\Contrib\\Graphics\\Icons\\modern-install.ico\"\n      File \"..\\Contrib\\Graphics\\Icons\\modern-uninstall.ico\"\n      SetOutPath $INSTDIR\\Contrib\\Graphics\\Header\n      File \"..\\Contrib\\Graphics\\Header\\nsis.bmp\"\n      SetOutPath $INSTDIR\\Contrib\\Graphics\\Wizard\n      File \"..\\Contrib\\Graphics\\Wizard\\win.bmp\"\n\n    graphics:\n\n  nomui:\n\n  SetDetailsPrint textonly\n  DetailPrint \"Creating Registry Keys...\"\n  SetDetailsPrint listonly\n\n  SetOutPath $INSTDIR\n\n  WriteRegStr HKLM \"Software\\NSIS\" \"\" $INSTDIR\n!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD\n  WriteRegDword HKLM \"Software\\NSIS\" \"VersionMajor\" \"${VER_MAJOR}\"\n  WriteRegDword HKLM \"Software\\NSIS\" \"VersionMinor\" \"${VER_MINOR}\"\n  WriteRegDword HKLM \"Software\\NSIS\" \"VersionRevision\" \"${VER_REVISION}\"\n  WriteRegDword HKLM \"Software\\NSIS\" \"VersionBuild\" \"${VER_BUILD}\"\n!endif\n\n  WriteRegExpandStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\" \"UninstallString\" '\"$INSTDIR\\uninst-nsis.exe\"'\n  WriteRegExpandStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\" \"InstallLocation\" \"$INSTDIR\"\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\" \"DisplayName\" \"Nullsoft Install System\"\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\" \"DisplayIcon\" \"$INSTDIR\\NSIS.exe,0\"\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\" \"DisplayVersion\" \"${VERSION}\"\n!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD\n  WriteRegDWORD HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\" \"VersionMajor\" \"${VER_MAJOR}\"\n  WriteRegDWORD HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\" \"VersionMinor\" \"${VER_MINOR}.${VER_REVISION}\"\n!endif\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\" \"URLInfoAbout\" \"http://nsis.sourceforge.net/\"\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\" \"HelpLink\" \"http://nsis.sourceforge.net/Support\"\n  WriteRegDWORD HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\" \"NoModify\" \"1\"\n  WriteRegDWORD HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\" \"NoRepair\" \"1\"\n\n  WriteUninstaller $INSTDIR\\uninst-nsis.exe\n\n  ${MementoSectionSave}\n\n  SetDetailsPrint both\n\nSectionEnd\n\n;--------------------------------\n;Descriptions\n\n!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecCore} \"The core files required to use NSIS (compiler etc.)\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecExample} \"Example installation scripts that show you how to use NSIS\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecShortcuts} \"Adds icons to your start menu and your desktop for easy access\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfaces} \"User interface designs that can be used to change the installer look and feel\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfacesModernUI} \"A modern user interface like the wizards of recent Windows versions\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfacesDefaultUI} \"The default NSIS user interface which you can customize to make your own UI\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfacesTinyUI} \"A tiny version of the default user interface\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecTools} \"Tools that help you with NSIS development\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecToolsZ2E} \"A utility that converts a ZIP file to a NSIS installer\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecGraphics} \"Icons, checkbox images and other graphics\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecLangFiles} \"Language files used to support multiple languages in an installer\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsPlugins} \"Useful plugins that extend NSIS's functionality\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsBanner} \"Plugin that lets you show a banner before installation starts\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsLangDLL} \"Plugin that lets you add a language select dialog to your installer\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsnsExec} \"Plugin that executes console programs and prints its output in the NSIS log window or hides it\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsSplash} \"Splash screen add-on that lets you add a splash screen to an installer\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsSplashT} \"Splash screen add-on with transparency support that lets you add a splash screen to an installer\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsSystem} \"Plugin that lets you call Win32 API or external DLLs\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsMath} \"Plugin that lets you evaluate complicated mathematical expressions\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsDialer} \"Plugin that provides internet connection functions\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsIO} \"Plugin that lets you add custom pages to an installer\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsDialogs} \"Plugin that lets you add custom pages to an installer\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsStartMenu} \"Plugin that lets the user select the start menu folder\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsBgImage} \"Plugin that lets you show a persistent background image plugin and play sounds\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsUserInfo} \"Plugin that that gives you the user name and the user account type\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsNSISDL} \"Plugin that lets you create a web based installer\"\n  !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsVPatch} \"Plugin that lets you create patches to upgrade older files\"\n!insertmacro MUI_FUNCTION_DESCRIPTION_END\n\n;--------------------------------\n;Installer Functions\n\nFunction .onInit\n\n  ${MementoSectionRestore}\n\nFunctionEnd\n\n!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD\n\nVar ReinstallPageCheck\n\nFunction PageReinstall\n\n  ReadRegStr $R0 HKLM \"Software\\NSIS\" \"\"\n\n  ${If} $R0 == \"\"\n    Abort\n  ${EndIf}\n\n  ReadRegDWORD $R0 HKLM \"Software\\NSIS\" \"VersionMajor\"\n  ReadRegDWORD $R1 HKLM \"Software\\NSIS\" \"VersionMinor\"\n  ReadRegDWORD $R2 HKLM \"Software\\NSIS\" \"VersionRevision\"\n  ReadRegDWORD $R3 HKLM \"Software\\NSIS\" \"VersionBuild\"\n  StrCpy $R0 $R0.$R1.$R2.$R3\n\n  ${VersionCompare} ${VER_MAJOR}.${VER_MINOR}.${VER_REVISION}.${VER_BUILD} $R0 $R0\n  ${If} $R0 == 0\n    StrCpy $R1 \"NSIS ${VERSION} is already installed. Select the operation you want to perform and click Next to continue.\"\n    StrCpy $R2 \"Add/Reinstall components\"\n    StrCpy $R3 \"Uninstall NSIS\"\n    !insertmacro MUI_HEADER_TEXT \"Already Installed\" \"Choose the maintenance option to perform.\"\n    StrCpy $R0 \"2\"\n  ${ElseIf} $R0 == 1\n    StrCpy $R1 \"An older version of NSIS is installed on your system. It's recommended that you uninstall the current version before installing. Select the operation you want to perform and click Next to continue.\"\n    StrCpy $R2 \"Uninstall before installing\"\n    StrCpy $R3 \"Do not uninstall\"\n    !insertmacro MUI_HEADER_TEXT \"Already Installed\" \"Choose how you want to install NSIS.\"\n    StrCpy $R0 \"1\"\n  ${ElseIf} $R0 == 2\n    StrCpy $R1 \"A newer version of NSIS is already installed! It is not recommended that you install an older version. If you really want to install this older version, it's better to uninstall the current version first. Select the operation you want to perform and click Next to continue.\"\n    StrCpy $R2 \"Uninstall before installing\"\n    StrCpy $R3 \"Do not uninstall\"\n    !insertmacro MUI_HEADER_TEXT \"Already Installed\" \"Choose how you want to install NSIS.\"\n    StrCpy $R0 \"1\"\n  ${Else}\n    Abort\n  ${EndIf}\n\n  nsDialogs::Create 1018\n  Pop $R4\n\n  ${NSD_CreateLabel} 0 0 100% 24u $R1\n  Pop $R1\n\n  ${NSD_CreateRadioButton} 30u 50u -30u 8u $R2\n  Pop $R2\n  ${NSD_OnClick} $R2 PageReinstallUpdateSelection\n\n  ${NSD_CreateRadioButton} 30u 70u -30u 8u $R3\n  Pop $R3\n  ${NSD_OnClick} $R3 PageReinstallUpdateSelection\n\n  ${If} $ReinstallPageCheck != 2\n    SendMessage $R2 ${BM_SETCHECK} ${BST_CHECKED} 0\n  ${Else}\n    SendMessage $R3 ${BM_SETCHECK} ${BST_CHECKED} 0\n  ${EndIf}\n\n  ${NSD_SetFocus} $R2\n\n  nsDialogs::Show\n\nFunctionEnd\n\nFunction PageReinstallUpdateSelection\n\n  Pop $R1\n\n  ${NSD_GetState} $R2 $R1\n\n  ${If} $R1 == ${BST_CHECKED}\n    StrCpy $ReinstallPageCheck 1\n  ${Else}\n    StrCpy $ReinstallPageCheck 2\n  ${EndIf}\n\nFunctionEnd\n\nFunction PageLeaveReinstall\n\n  ${NSD_GetState} $R2 $R1\n\n  StrCmp $R0 \"1\" 0 +2\n    StrCmp $R1 \"1\" reinst_uninstall reinst_done\n\n  StrCmp $R0 \"2\" 0 +3\n    StrCmp $R1 \"1\" reinst_done reinst_uninstall\n\n  reinst_uninstall:\n  ReadRegStr $R1 HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\" \"UninstallString\"\n\n  ;Run uninstaller\n  HideWindow\n\n    ClearErrors\n    ExecWait '$R1 _?=$INSTDIR'\n\n    IfErrors no_remove_uninstaller\n    IfFileExists \"$INSTDIR\\makensis.exe\" no_remove_uninstaller\n\n      Delete $R1\n      RMDir $INSTDIR\n\n    no_remove_uninstaller:\n\n  StrCmp $R0 \"2\" 0 +2\n    Quit\n\n  BringToFront\n\n  reinst_done:\n\nFunctionEnd\n\n!endif # VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD\n\nFunction ShowReleaseNotes\n  ${If} ${FileExists} $WINDIR\\hh.exe\n    StrCpy $0 $WINDIR\\hh.exe\n    Exec '\"$0\" mk:@MSITStore:$INSTDIR\\NSIS.chm::/SectionF.1.html'\n  ${Else}\n    SearchPath $0 hh.exe\n    ${If} ${FileExists} $0\n      Exec '\"$0\" mk:@MSITStore:$INSTDIR\\NSIS.chm::/SectionF.1.html'\n    ${Else}\n      ExecShell \"open\" \"http://nsis.sourceforge.net/Docs/AppendixF.html#F.1\"\n    ${EndIf}\n  ${EndIf}\nFunctionEnd\n\n;--------------------------------\n;Uninstaller Section\n\nSection Uninstall\n\n  SetDetailsPrint textonly\n  DetailPrint \"Uninstalling NSI Development Shell Extensions...\"\n  SetDetailsPrint listonly\n\n  IfFileExists $INSTDIR\\makensis.exe nsis_installed\n    MessageBox MB_YESNO \"It does not appear that NSIS is installed in the directory '$INSTDIR'.$\\r$\\nContinue anyway (not recommended)?\" IDYES nsis_installed\n    Abort \"Uninstall aborted by user\"\n  nsis_installed:\n\n  SetDetailsPrint textonly\n  DetailPrint \"Deleting Registry Keys...\"\n  SetDetailsPrint listonly\n\n  ReadRegStr $R0 HKCR \".nsi\" \"\"\n  StrCmp $R0 \"NSIS.Script\" 0 +2\n    DeleteRegKey HKCR \".nsi\"\n\n  ReadRegStr $R0 HKCR \".nsh\" \"\"\n  StrCmp $R0 \"NSIS.Header\" 0 +2\n    DeleteRegKey HKCR \".nsh\"\n\n  DeleteRegKey HKCR \"NSIS.Script\"\n  DeleteRegKey HKCR \"NSIS.Header\"\n\n  System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)'\n\n  DeleteRegKey HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NSIS\"\n  DeleteRegKey HKLM \"Software\\NSIS\"\n\n  SetDetailsPrint textonly\n  DetailPrint \"Deleting Files...\"\n  SetDetailsPrint listonly\n\n  Delete $SMPROGRAMS\\NSIS.lnk\n  Delete $DESKTOP\\NSIS.lnk\n  Delete $INSTDIR\\makensis.exe\n  Delete $INSTDIR\\makensisw.exe\n  Delete $INSTDIR\\NSIS.exe\n  Delete $INSTDIR\\license.txt\n  Delete $INSTDIR\\COPYING\n  Delete $INSTDIR\\uninst-nsis.exe\n  Delete $INSTDIR\\nsisconf.nsi\n  Delete $INSTDIR\\nsisconf.nsh\n  Delete $INSTDIR\\NSIS.chm\n  RMDir /r $INSTDIR\\Bin\n  RMDir /r $INSTDIR\\Contrib\n  RMDir /r $INSTDIR\\Docs\n  RMDir /r $INSTDIR\\Examples\n  RMDir /r $INSTDIR\\Include\n  RMDir /r $INSTDIR\\Menu\n  RMDir /r $INSTDIR\\Plugins\n  RMDir /r $INSTDIR\\Stubs\n  RMDir $INSTDIR\n\n  SetDetailsPrint both\n\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/nsDialogs/InstallOptions.nsi",
    "content": "!include LogicLib.nsh\n!include WinMessages.nsh\n\nName \"nsDialogs IO\"\nOutFile \"nsDialogs IO.exe\"\n\nPage custom nsDialogsIO UpdateINIState\nPage instfiles\n\nXPStyle on\n\nShowInstDetails show\n\n!include nsDialogs.nsh\n!insertmacro NSD_FUNCTION_INIFILE\n\nFunction nsDialogsIO\n\n\tInitPluginsDir\n\tFile /oname=$PLUGINSDIR\\io.ini \"${NSISDIR}\\Examples\\InstallOptions\\test.ini\"\n\n\t${If} ${Cmd} `MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 \"Test the right-to-left version?\" IDYES`\n\t\tWriteINIStr $PLUGINSDIR\\io.ini Settings RTL 1\n\t${EndIf}\n\n\tStrCpy $0 $PLUGINSDIR\\io.ini\n\n\tCall CreateDialogFromINI\n\nFunctionEnd\n\nSection\n\n  ReadINIStr $0 \"$PLUGINSDIR\\io.ini\" \"Field 2\" \"State\"\n  DetailPrint \"Install X=$0\"\n  ReadINIStr $0 \"$PLUGINSDIR\\io.ini\" \"Field 3\" \"State\"\n  DetailPrint \"Install Y=$0\"\n  ReadINIStr $0 \"$PLUGINSDIR\\io.ini\" \"Field 4\" \"State\"\n  DetailPrint \"Install Z=$0\"\n  ReadINIStr $0 \"$PLUGINSDIR\\io.ini\" \"Field 5\" \"State\"\n  DetailPrint \"File=$0\"\n  ReadINIStr $0 \"$PLUGINSDIR\\io.ini\" \"Field 6\" \"State\"\n  DetailPrint \"Dir=$0\"\n  ReadINIStr $0 \"$PLUGINSDIR\\io.ini\" \"Field 8\" \"State\"\n  DetailPrint \"Info=$0\"\n\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/nsDialogs/example.nsi",
    "content": "!include nsDialogs.nsh\n!include LogicLib.nsh\n\nName \"nsDialogs Example\"\nOutFile \"nsDialogs Example.exe\"\n\nXPStyle on\n\nPage license\nPage custom nsDialogsPage\n\nVar BUTTON\nVar EDIT\nVar CHECKBOX\n\nFunction nsDialogsPage\n\n\tnsDialogs::Create 1018\n\tPop $0\n\n\tGetFunctionAddress $0 OnBack\n\tnsDialogs::OnBack $0\n\n\t${NSD_CreateButton} 0 0 100% 12u Test\n\tPop $BUTTON\n\tGetFunctionAddress $0 OnClick\n\tnsDialogs::OnClick $BUTTON $0\n\n\t${NSD_CreateText} 0 35 100% 12u hello\n\tPop $EDIT\n\tGetFunctionAddress $0 OnChange\n\tnsDialogs::OnChange $EDIT $0\n\n\t${NSD_CreateCheckbox} 0 -50 100% 8u Test\n\tPop $CHECKBOX\n\tGetFunctionAddress $0 OnCheckbox\n\tnsDialogs::OnClick $CHECKBOX $0\n\n\t${NSD_CreateLabel} 0 40u 75% 40u \"* Type `hello there` above.$\\n* Click the button.$\\n* Check the checkbox.$\\n* Hit the Back button.\"\n\tPop $0\n\n\tnsDialogs::Show\n\nFunctionEnd\n\nFunction OnClick\n\n\tPop $0 # HWND\n\n\tMessageBox MB_OK clicky\n\nFunctionEnd\n\nFunction OnChange\n\n\tPop $0 # HWND\n\n\tSystem::Call user32::GetWindowText(i$EDIT,t.r0,i${NSIS_MAX_STRLEN})\n\n\t${If} $0 == \"hello there\"\n\t\tMessageBox MB_OK \"right back at ya\"\n\t${EndIf}\n\nFunctionEnd\n\nFunction OnBack\n\n\tMessageBox MB_YESNO \"are you sure?\" IDYES +2\n\tAbort\n\nFunctionEnd\n\nFunction OnCheckbox\n\n\tPop $0 # HWND\n\n\tMessageBox MB_OK \"checkbox clicked\"\n\nFunctionEnd\n\nSection\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/nsDialogs/timer.nsi",
    "content": "!include LogicLib.nsh\n!include nsDialogs.nsh\n\nName \"nsDialogs Timer Example\"\nOutFile \"nsDialogs Timer Example.exe\"\nXPStyle on\n\nVar DIALOG\nVar TEXT\nVar PROGBAR\nVar PROGBAR2\nVar PROGBAR3\nVar BUTTON\nVar BUTTON2\n\nPage custom nsDialogsPage\n\nFunction OnTimer\n\n  \tSendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1\n\t${If} $1 = 100\n\t\tSendMessage $PROGBAR ${PBM_SETPOS} 0 0\n\t${Else}\n\t\tSendMessage $PROGBAR ${PBM_DELTAPOS} 10 0\n\t${EndIf}\n\nFunctionEnd\n\nFunction OnTimer2\n\n  \tSendMessage $PROGBAR2 ${PBM_GETPOS} 0 0 $1\n\t${If} $1 = 100\n\t\tSendMessage $PROGBAR2 ${PBM_SETPOS} 0 0\n\t${Else}\n\t\tSendMessage $PROGBAR2 ${PBM_DELTAPOS} 5 0\n\t${EndIf}\n\nFunctionEnd\n\nFunction OnTimer3\n\n  \tSendMessage $PROGBAR3 ${PBM_GETPOS} 0 0 $1\n\t${If} $1 >= 100\n\t\t${NSD_KillTimer} OnTimer3\n \t\tMessageBox MB_OK \"Timer 3 killed\"\n\t${Else}\n\t\tSendMessage $PROGBAR3 ${PBM_DELTAPOS} 2 0\n\t${EndIf}\n\nFunctionEnd\n\nFunction OnClick\n\n\tPop $0\n\n\t${NSD_KillTimer} OnTimer\n\nFunctionEnd\n\nFunction OnClick2\n\n\tPop $0\n\n\t${NSD_KillTimer} OnTimer2\n\nFunctionEnd\n\nFunction nsDialogsPage\n\n\tnsDialogs::Create 1018\n\tPop $DIALOG\n\n\t${NSD_CreateLabel} 0u 0u 100% 9u \"nsDialogs timer example\"\n\tPop $TEXT\n\n\t${NSD_CreateProgressBar} 0u 10u 100% 12u \"\"\n\tPop $PROGBAR\n\n\t${NSD_CreateButton} 0u 25u 100u 14u \"Kill Timer 1\"\n\tPop $BUTTON\n\t${NSD_OnClick} $BUTTON OnClick\n\n\t${NSD_CreateProgressBar} 0u 52u 100% 12u \"\"\n\tPop $PROGBAR2\n\n\t${NSD_CreateButton} 0u 67u 100u 14u \"Kill Timer 2\"\n\tPop $BUTTON2\n\t${NSD_OnClick} $BUTTON2 OnClick2\n\n\t${NSD_CreateProgressBar} 0u 114u 100% 12u \"\"\n\tPop $PROGBAR3\n\n\t${NSD_CreateTimer} OnTimer 1000\n\t${NSD_CreateTimer} OnTimer2 100\n\t${NSD_CreateTimer} OnTimer3 200\n\n\tnsDialogs::Show\n\nFunctionEnd\n\nSection\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/nsDialogs/welcome.nsi",
    "content": "!include MUI.nsh\n!include LogicLib.nsh\n!include WinMessages.nsh\n!include FileFunc.nsh\n\nName \"nsDialogs Welcome\"\nOutFile \"nsDialogs Welcome.exe\"\n\nPage custom nsDialogsWelcome\nPage custom nsDialogsDirectory\n!insertmacro MUI_PAGE_INSTFILES\n\n!insertmacro MUI_LANGUAGE English\n\n!define WS_EX_CLIENTEDGE    0x00000200\n\n!define WS_CHILD            0x40000000\n!define WS_VISIBLE          0x10000000\n!define WS_DISABLED         0x08000000\n!define WS_CLIPSIBLINGS     0x04000000\n!define WS_MAXIMIZE         0x01000000\n!define WS_VSCROLL          0x00200000\n!define WS_HSCROLL          0x00100000\n!define WS_GROUP            0x00020000\n!define WS_TABSTOP          0x00010000\n\n!define ES_LEFT             0x00000000\n!define ES_CENTER           0x00000001\n!define ES_RIGHT            0x00000002\n!define ES_MULTILINE        0x00000004\n!define ES_UPPERCASE        0x00000008\n!define ES_LOWERCASE        0x00000010\n!define ES_PASSWORD         0x00000020\n!define ES_AUTOVSCROLL      0x00000040\n!define ES_AUTOHSCROLL      0x00000080\n!define ES_NOHIDESEL        0x00000100\n!define ES_OEMCONVERT       0x00000400\n!define ES_READONLY         0x00000800\n!define ES_WANTRETURN       0x00001000\n!define ES_NUMBER           0x00002000\n\n!define SS_LEFT             0x00000000\n!define SS_CENTER           0x00000001\n!define SS_RIGHT            0x00000002\n!define SS_ICON             0x00000003\n!define SS_BLACKRECT        0x00000004\n!define SS_GRAYRECT         0x00000005\n!define SS_WHITERECT        0x00000006\n!define SS_BLACKFRAME       0x00000007\n!define SS_GRAYFRAME        0x00000008\n!define SS_WHITEFRAME       0x00000009\n!define SS_USERITEM         0x0000000A\n!define SS_SIMPLE           0x0000000B\n!define SS_LEFTNOWORDWRAP   0x0000000C\n!define SS_OWNERDRAW        0x0000000D\n!define SS_BITMAP           0x0000000E\n!define SS_ENHMETAFILE      0x0000000F\n!define SS_ETCHEDHORZ       0x00000010\n!define SS_ETCHEDVERT       0x00000011\n!define SS_ETCHEDFRAME      0x00000012\n!define SS_TYPEMASK         0x0000001F\n!define SS_REALSIZECONTROL  0x00000040\n!define SS_NOPREFIX         0x00000080\n!define SS_NOTIFY           0x00000100\n!define SS_CENTERIMAGE      0x00000200\n!define SS_RIGHTJUST        0x00000400\n!define SS_REALSIZEIMAGE    0x00000800\n!define SS_SUNKEN           0x00001000\n!define SS_EDITCONTROL      0x00002000\n!define SS_ENDELLIPSIS      0x00004000\n!define SS_PATHELLIPSIS     0x00008000\n!define SS_WORDELLIPSIS     0x0000C000\n!define SS_ELLIPSISMASK     0x0000C000\n\n!define BS_PUSHBUTTON       0x00000000\n!define BS_DEFPUSHBUTTON    0x00000001\n!define BS_CHECKBOX         0x00000002\n!define BS_AUTOCHECKBOX     0x00000003\n!define BS_RADIOBUTTON      0x00000004\n!define BS_3STATE           0x00000005\n!define BS_AUTO3STATE       0x00000006\n!define BS_GROUPBOX         0x00000007\n!define BS_USERBUTTON       0x00000008\n!define BS_AUTORADIOBUTTON  0x00000009\n!define BS_PUSHBOX          0x0000000A\n!define BS_OWNERDRAW        0x0000000B\n!define BS_TYPEMASK         0x0000000F\n!define BS_LEFTTEXT         0x00000020\n!define BS_TEXT             0x00000000\n!define BS_ICON             0x00000040\n!define BS_BITMAP           0x00000080\n!define BS_LEFT             0x00000100\n!define BS_RIGHT            0x00000200\n!define BS_CENTER           0x00000300\n!define BS_TOP              0x00000400\n!define BS_BOTTOM           0x00000800\n!define BS_VCENTER          0x00000C00\n!define BS_PUSHLIKE         0x00001000\n!define BS_MULTILINE        0x00002000\n!define BS_NOTIFY           0x00004000\n!define BS_FLAT             0x00008000\n!define BS_RIGHTBUTTON      ${BS_LEFTTEXT}\n\n!define LR_DEFAULTCOLOR     0x0000\n!define LR_MONOCHROME       0x0001\n!define LR_COLOR            0x0002\n!define LR_COPYRETURNORG    0x0004\n!define LR_COPYDELETEORG    0x0008\n!define LR_LOADFROMFILE     0x0010\n!define LR_LOADTRANSPARENT  0x0020\n!define LR_DEFAULTSIZE      0x0040\n!define LR_VGACOLOR         0x0080\n!define LR_LOADMAP3DCOLORS  0x1000\n!define LR_CREATEDIBSECTION 0x2000\n!define LR_COPYFROMRESOURCE 0x4000\n!define LR_SHARED           0x8000\n\n!define IMAGE_BITMAP        0\n!define IMAGE_ICON          1\n!define IMAGE_CURSOR        2\n!define IMAGE_ENHMETAFILE   3\n\nVar DIALOG\nVar HEADLINE\nVar TEXT\nVar IMAGECTL\nVar IMAGE\nVar DIRECTORY\nVar FREESPACE\n\nVar HEADLINE_FONT\n\nFunction .onInit\n\n\tCreateFont $HEADLINE_FONT \"$(^Font)\" \"14\" \"700\"\n\n\tInitPluginsDir\n\tFile /oname=$PLUGINSDIR\\welcome.bmp \"${NSISDIR}\\Contrib\\Graphics\\Wizard\\orange-nsis.bmp\"\n\nFunctionEnd\n\nFunction HideControls\n\n    LockWindow on\n    GetDlgItem $0 $HWNDPARENT 1028\n    ShowWindow $0 ${SW_HIDE}\n\n    GetDlgItem $0 $HWNDPARENT 1256\n    ShowWindow $0 ${SW_HIDE}\n\n    GetDlgItem $0 $HWNDPARENT 1035\n    ShowWindow $0 ${SW_HIDE}\n\n    GetDlgItem $0 $HWNDPARENT 1037\n    ShowWindow $0 ${SW_HIDE}\n\n    GetDlgItem $0 $HWNDPARENT 1038\n    ShowWindow $0 ${SW_HIDE}\n\n    GetDlgItem $0 $HWNDPARENT 1039\n    ShowWindow $0 ${SW_HIDE}\n\n    GetDlgItem $0 $HWNDPARENT 1045\n    ShowWindow $0 ${SW_NORMAL}\n    LockWindow off\n\nFunctionEnd\n\nFunction ShowControls\n\n    LockWindow on\n    GetDlgItem $0 $HWNDPARENT 1028\n    ShowWindow $0 ${SW_NORMAL}\n\n    GetDlgItem $0 $HWNDPARENT 1256\n    ShowWindow $0 ${SW_NORMAL}\n\n    GetDlgItem $0 $HWNDPARENT 1035\n    ShowWindow $0 ${SW_NORMAL}\n\n    GetDlgItem $0 $HWNDPARENT 1037\n    ShowWindow $0 ${SW_NORMAL}\n\n    GetDlgItem $0 $HWNDPARENT 1038\n    ShowWindow $0 ${SW_NORMAL}\n\n    GetDlgItem $0 $HWNDPARENT 1039\n    ShowWindow $0 ${SW_NORMAL}\n\n    GetDlgItem $0 $HWNDPARENT 1045\n    ShowWindow $0 ${SW_HIDE}\n    LockWindow off\n\nFunctionEnd\n\nFunction nsDialogsWelcome\n\n\tnsDialogs::Create 1044\n\tPop $DIALOG\n\n\tnsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_BITMAP} 0 0 0 109u 193u \"\"\n\tPop $IMAGECTL\n\n\tStrCpy $0 $PLUGINSDIR\\welcome.bmp\n\tSystem::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'\n\tPop $IMAGE\n\t\n\tSendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE\n\n\tnsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 120u 10u -130u 20u \"Welcome to nsDialogs!\"\n\tPop $HEADLINE\n\n\tSendMessage $HEADLINE ${WM_SETFONT} $HEADLINE_FONT 0\n\n\tnsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 120u 32u -130u -32u \"nsDialogs is the next generation of user interfaces in NSIS. It gives the developer full control over custom pages. Some of the features include control text containing variables, callbacks directly into script functions and creation of any type of control. Create boring old edit boxes or load some external library and create custom controls with no need of creating your own plug-in.$\\r$\\n$\\r$\\nUnlike InstallOptions, nsDialogs doesn't use INI files to communicate with the script. By interacting directly with the script, nsDialogs can perform much faster without the need of costly, old and inefficient INI operations. Direct interaction also allows direct calls to functions defined in the script and removes the need of conversion functions like Io2Nsis.$\\r$\\n$\\r$\\nHit the Next button to see how it all fits into a mock directory page.\"\n\tPop $TEXT\n\n\tSetCtlColors $DIALOG \"\" 0xffffff\n\tSetCtlColors $HEADLINE \"\" 0xffffff\n\tSetCtlColors $TEXT \"\" 0xffffff\n\n\tCall HideControls\n\n\tnsDialogs::Show\n\n\tCall ShowControls\n\n\tSystem::Call gdi32::DeleteObject(i$IMAGE)\n\nFunctionEnd\n\n!define SHACF_FILESYSTEM 1\n\nFunction nsDialogsDirectory\n\n\t!insertmacro MUI_HEADER_TEXT \"Choose Install Location\" \"Choose the folder in which to install $(^NameDA).\"\n\n\tGetDlgItem $0 $HWNDPARENT 1\n\tEnableWindow $0 0\n\n\tnsDialogs::Create 1018\n\tPop $DIALOG\n\n\tnsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_CENTER} 0 0 0 100% 30 \"Directory page\"\n\tPop $HEADLINE\n\n\tSendMessage $HEADLINE ${WM_SETFONT} $HEADLINE_FONT 0\n\n\tnsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 0 30 100% 40 \"Select the installation directory of NSIS to continue. $_CLICK\"\n\tPop $TEXT\n\n\tnsDialogs::CreateControl EDIT ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${ES_AUTOHSCROLL}|${WS_TABSTOP} ${WS_EX_CLIENTEDGE} 0 75 100% 12u \"\"\n\tPop $DIRECTORY\n\n\tSendMessage $HWNDPARENT ${WM_NEXTDLGCTL} $DIRECTORY 1\n\n\tGetFunctionAddress $0 DirChange\n\tnsDialogs::OnChange $DIRECTORY $0\n\n\tSystem::Call shlwapi::SHAutoComplete(i$DIRECTORY,i${SHACF_FILESYSTEM})\n\n\tnsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 0 -10u 100% 10u \"\"\n\tPop $FREESPACE\n\n\tCall UpdateFreeSpace\n\n\tnsDialogs::Show\n\nFunctionEnd\n\nFunction UpdateFreeSpace\n\n\t${GetRoot} $INSTDIR $0\n\tStrCpy $1 \" bytes\"\n\n\tSystem::Call kernel32::GetDiskFreeSpaceEx(tr0,*l,*l,*l.r0)\n\n\t${If} $0 > 1024\n\t${OrIf} $0 < 0\n\t\tSystem::Int64Op $0 / 1024\n\t\tPop $0\n\t\tStrCpy $1 \"kb\"\n\t\t${If} $0 > 1024\n\t\t${OrIf} $0 < 0\n\t\t\tSystem::Int64Op $0 / 1024\n\t\t\tPop $0\n\t\t\tStrCpy $1 \"mb\"\n\t\t\t${If} $0 > 1024\n\t\t\t${OrIf} $0 < 0\n\t\t\t\tSystem::Int64Op $0 / 1024\n\t\t\t\tPop $0\n\t\t\t\tStrCpy $1 \"gb\"\n\t\t\t${EndIf}\n\t\t${EndIf}\n\t${EndIf}\n\n\tSendMessage $FREESPACE ${WM_SETTEXT} 0 \"STR:Free space: $0$1\"\n\nFunctionEnd\n\nFunction DirChange\n\n\tPop $0 # dir hwnd\n\n\tGetDlgItem $0 $HWNDPARENT 1\n\n\tSystem::Call user32::GetWindowText(i$DIRECTORY,t.d,i${NSIS_MAX_STRLEN})\n\n\t${If} ${FileExists} $INSTDIR\\makensis.exe\n\t\tEnableWindow $0 1\n\t${Else}\n\t\tEnableWindow $0 0\n\t${EndIf}\n\n\tCall UpdateFreeSpace\n\nFunctionEnd\n\nSection\nSectionEnd\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/nsExec/test.nsi",
    "content": "Name \"nsExec Test\"\n\nOutFile \"nsExec Test.exe\"\n\nShowInstDetails show\n\nSection \"Silent MakeNSIS\"\n\tnsExec::Exec '\"${NSISDIR}\\makensis.exe\"'\n\tPop $0 # return value/error/timeout\n\tDetailPrint \"\"\n\tDetailPrint \"       Return value: $0\"\n\tDetailPrint \"\"\nSectionEnd\n\nSection \"MakeNSIS commands help\"\n\tnsExec::ExecToLog '\"${NSISDIR}\\makensis.exe\" /CMDHELP'\n\tPop $0 # return value/error/timeout\n\tDetailPrint \"\"\n\tDetailPrint \"       Return value: $0\"\n\tDetailPrint \"\"\nSectionEnd\n\nSection \"Output to variable\"\n\tnsExec::ExecToStack '\"${NSISDIR}\\makensis.exe\" /VERSION'\n\tPop $0 # return value/error/timeout\n\tPop $1 # printed text, up to ${NSIS_MAX_STRLEN}\n\tDetailPrint '\"${NSISDIR}\\makensis.exe\" /VERSION printed: $1'\n\tDetailPrint \"\"\n\tDetailPrint \"       Return value: $0\"\n\tDetailPrint \"\"\nSectionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/one-section.nsi",
    "content": "; one-section.nsi\n;\n; This example demonstrates how to control section selection.\n; It allows only one of the sections of a group to be selected.\n\n;--------------------------------\n\n; Section define/macro header file\n; See this header file for more info\n\n!include \"Sections.nsh\"\n\n;--------------------------------\n\nName \"One Section\"\nOutFile \"one-section.exe\"\nRequestExecutionLevel user\n\n;--------------------------------\n\n; Pages\n\nPage components\n\n;--------------------------------\n\n; Sections\n\nSection !Required\n  SectionIn RO\nSectionEnd\n\nSection \"Group 1 - Option 1\" g1o1\nSectionEnd\n\nSection /o \"Group 1 - Option 2\" g1o2\nSectionEnd\n\nSection /o \"Group 1 - Option 3\" g1o3\nSectionEnd\n\nSection \"Group 2 - Option 1\" g2o1\nSectionEnd\n\nSection /o \"Group 2 - Option 2\" g2o2\nSectionEnd\n\nSection /o \"Group 2 - Option 3\" g2o3\nSectionEnd\n\n;--------------------------------\n\n; Functions\n\n; $1 stores the status of group 1\n; $2 stores the status of group 2\n\nFunction .onInit\n\n  StrCpy $1 ${g1o1} ; Group 1 - Option 1 is selected by default\n  StrCpy $2 ${g2o1} ; Group 2 - Option 1 is selected by default\n\nFunctionEnd\n\nFunction .onSelChange\n\n  !insertmacro StartRadioButtons $1\n    !insertmacro RadioButton ${g1o1}\n    !insertmacro RadioButton ${g1o2}\n    !insertmacro RadioButton ${g1o3}\n  !insertmacro EndRadioButtons\n\t\n  !insertmacro StartRadioButtons $2\n    !insertmacro RadioButton ${g2o1}\n    !insertmacro RadioButton ${g2o2}\n    !insertmacro RadioButton ${g2o3}\n  !insertmacro EndRadioButtons\n\t\nFunctionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/primes.nsi",
    "content": "; primes.nsi\n;\n; This is an example of the possibities of the NSIS Script language.\n; It calculates prime numbers.\n\n;--------------------------------\n\nName \"primes\"\nAllowRootDirInstall true\nOutFile \"primes.exe\"\nCaption \"Prime number generator\"\nShowInstDetails show\nAllowRootDirInstall true\nInstallDir \"$EXEDIR\"\nRequestExecutionLevel user\n\nDirText \"Select a directory to write primes.txt. $_CLICK\"\n\n;--------------------------------\n\n;Pages\n\nPage directory\nPage instfiles\n\n;--------------------------------\n\nSection \"\"\n  SetOutPath $INSTDIR\n  Call DoPrimes \nSectionEnd\n\n;--------------------------------\n\nFunction DoPrimes\n\n; we put this in here so it doesn't update the progress bar (faster)\n\n!define PPOS $0 ; position in prime searching\n!define PDIV $1 ; divisor\n!define PMOD $2 ; the result of the modulus\n!define PCNT $3 ; count of how many we've printed\n  FileOpen $9 $INSTDIR\\primes.txt w\n\n  DetailPrint \"2 is prime!\"\n  FileWrite $9 \"2 is prime!$\\r$\\n\"\n  DetailPrint \"3 is prime!\"\n  FileWrite $9 \"3 is prime!$\\r$\\n\"\n  Strcpy ${PPOS} 3\n  Strcpy ${PCNT} 2\nouterloop:\n   StrCpy ${PDIV} 3\n   innerloop:\n     IntOp ${PMOD} ${PPOS} % ${PDIV}\n     IntCmp ${PMOD} 0 notprime\n     IntOp ${PDIV} ${PDIV} + 2\n     IntCmp ${PDIV} ${PPOS} 0 innerloop 0\n       DetailPrint \"${PPOS} is prime!\"\n       FileWrite $9 \"${PPOS} is prime!$\\r$\\n\"\n       IntOp ${PCNT} ${PCNT} + 1\n       IntCmp ${PCNT} 100 0 innerloop\n       StrCpy ${PCNT} 0\n       MessageBox MB_YESNO \"Process more?\" IDNO stop\n     notprime:\n       IntOp ${PPOS} ${PPOS} + 2\n     Goto outerloop\n   stop:\n  FileClose $9\n  \nFunctionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/rtest.nsi",
    "content": "; rtest.nsi\n;\n; This script tests some advanced NSIS functions.\n\n;--------------------------------\n\nName \"rtest\"\nOutFile \"rtest.exe\"\n\nComponentText \"Select tests!\"\nShowInstDetails show\n\nRequestExecutionLevel user\n\n;--------------------------------\n\nSection \"Test 1\"\n\n  StrCpy $R0 \"a\"\n  \n  GetFunctionAddress $R1 test1\n  Call $R1\n  \n  StrCmp $R0 \"a182345678\" success\n  \n  DetailPrint \"Test 1 failed (output: $R0)\"\n  Goto end\n  \n  success:\n  DetailPrint \"Test 1 succeded (output: $R0)\"\n  \n  end:\n  \nSectionEnd\n\nFunction test1\n\n  GetLabelAddress $9 skip\n  \n  IntOp $9 $9 - 1\n  StrCpy $R0 $R01\n  \n  Call $9\n  \n  StrCpy $R0 $R02\n  StrCpy $R0 $R03\n  StrCpy $R0 $R04\n  StrCpy $R0 $R05\n  StrCpy $R0 $R06\n  StrCpy $R0 $R07\n  StrCpy $R0 $R08\n  \n  skip:\n  \nFunctionEnd\n\n;--------------------------------\n\nSection \"Test 2\"\n\n  StrCpy $R0 \"0\"\n  StrCpy $R1 \"11\"\n  \n  Call test2\n  \n  StrCmp $R1 \"11,10,9,8,7,6,5,4,3,2,1\" success\n  \n  DetailPrint \"Test 2 failed (output: $R1)\"\n  Goto end\n  \n  success:\n  DetailPrint \"Test 2 succeded (output: $R1)\"\n  \n  end:\n\nSectionEnd\n\nFunction test2\n\n  IntOp $R0 $R0 + 1\n  IntCmp $R0 10 done\n  \n  Push $R0\n  \n  GetFunctionAddress $R2 test2\n  Call $R2\n  \n  Pop $R0\n  \n  done:\n  StrCpy $R1 \"$R1,$R0\"\n  \nFunctionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/silent.nsi",
    "content": "# This example shows how to handle silent installers.\n# In short, you need IfSilent and the /SD switch for MessageBox to make your installer\n# really silent when the /S switch is used.\n\nName \"Silent\"\nOutFile \"silent.exe\"\nRequestExecutionLevel user\n\n# uncomment the following line to make the installer silent by default.\n; SilentInstall silent\n\nFunction .onInit\n  # `/SD IDYES' tells MessageBox to automatically choose IDYES if the installer is silent\n  # in this case, the installer can only be silent if the user used the /S switch or if\n  # you've uncommented line number 5\n  MessageBox MB_YESNO|MB_ICONQUESTION \"Would you like the installer to be silent from now on?\" \\\n    /SD IDYES IDNO no IDYES yes\n\n  # SetSilent can only be used in .onInit and doesn't work well along with `SetSilent silent'\n\n  yes:\n    SetSilent silent\n    Goto done\n  no:\n    SetSilent normal\n  done:\nFunctionEnd\n\nSection\n  IfSilent 0 +2\n    MessageBox MB_OK|MB_ICONINFORMATION 'This is a \"silent\" installer'\n\n  # there is no need to use IfSilent for this one because the /SD switch takes care of that\n  MessageBox MB_OK|MB_ICONINFORMATION \"This is not a silent installer\" /SD IDOK\n\n  # when `SetOverwrite on' (which is the default) is used, the installer will show a message\n  # if it can't open a file for writing. On silent installers, the ignore option will be\n  # automatically selected. if `AllowSkipFiles off' (default is on) was used, there is no\n  # ignore option and the cancel option will be automatically selected.\n\n  # on is default\n  ; AllowSkipFiles on\n\n  # lock file\n  FileOpen $0 $TEMP\\silentOverwrite w\n  # try to extract - will fail\n  File /oname=$TEMP\\silentOverwrite silent.nsi\n  # unlcok\n  FileClose $0\n\n  # this will always show on silent installers because ignore is the option automatically\n  # selected when a file can't be opened for writing on a silent installer\n  MessageBox MB_OK|MB_ICONINFORMATION \"This message box always shows if the installer is silent\"\n\n  AllowSkipFiles off\n\n  # lock file\n  FileOpen $0 $TEMP\\silentOverwrite w\n  # try to extract - will fail\n  File /oname=$TEMP\\silentOverwrite silent.nsi\n  # unlcok\n  FileClose $0\nSectionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/viewhtml.nsi",
    "content": "; viewhtml.nsi\n;\n; This script creates a silent installer which extracts one (or more) HTML\n; files to a temporary directory, opens Internet Explorer to view the file(s),\n; and when Internet Explorer has quit, deletes the file(s).\n\n;--------------------------------\n\n; The name of the installer (not really used in a silent install)\nName \"ViewHTML\"\n\n; Set to silent mode\nSilentInstall silent\n\n; The file to write\nOutFile \"viewhtml.exe\"\n\n; Request application privileges for Windows Vista\nRequestExecutionLevel user\n\n;--------------------------------\n\n; The stuff to install\nSection \"\"\n\n  ; Get a temporary filename (in the Windows Temp directory)\n  GetTempFileName $R0\n  \n  ; Extract file\n  ; Lets skip this one, it's not built to be showin in IE\n  ; File /oname=$R0 \"..\\Menu\\compiler.html\"\n  ; and write our own! :)\n  FileOpen $0 $R0 \"w\"\n  FileWrite $0 \"<HTML><BODY><H1>HTML page for viewhtml.nsi</H1></BODY></HTML>\"\n  FileClose $0\n  \n  ; View file\n  ExecWait '\"$PROGRAMFILES\\Internet Explorer\\iexplore.exe\" \"$R0\"'\n\n  ; Note: another way of doing this would be to use ExecShell, but then you\n  ; really couldn't get away with deleting the files. Here is the ExecShell\n  ; line that you would want to use:\n  ;\n  ; ExecShell \"open\" '\"$R0\"'\n  ;\n  ; The advantage of this way is that it would use the default browser to\n  ; open the HTML.\n  ;\n  \n  ; Delete the files (on reboot if file is in use)\n  Delete /REBOOTOK $R0\n\nSectionEnd"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Examples/waplugin.nsi",
    "content": "; waplugin.nsi\n;\n; This script will generate an installer that installs a Winamp 2 plug-in.\n;\n; This installer will automatically alert the user that installation was\n; successful, and ask them whether or not they would like to make the \n; plug-in the default and run Winamp.\n\n;--------------------------------\n\n; Uncomment the next line to enable auto Winamp download\n; !define WINAMP_AUTOINSTALL\n\n; The name of the installer\nName \"TinyVis Plug-in\"\n\n; The file to write\nOutFile \"waplugin.exe\"\n\n; The default installation directory\nInstallDir $PROGRAMFILES\\Winamp\n\n; detect winamp path from uninstall string if available\nInstallDirRegKey HKLM \\\n                 \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Winamp\" \\\n                 \"UninstallString\"\n\n; The text to prompt the user to enter a directory\nDirText \"Please select your Winamp path below (you will be able to proceed when Winamp is detected):\"\n# currently doesn't work - DirShow hide\n\n; automatically close the installer when done.\nAutoCloseWindow true\n\n; hide the \"show details\" box\nShowInstDetails nevershow\n\n; Request application privileges for Windows Vista\nRequestExecutionLevel admin\n\n;--------------------------------\n\n;Pages\n\nPage directory\nPage instfiles\n\n;--------------------------------\n\n; The stuff to install\n\nSection \"\"\n\n!ifdef WINAMP_AUTOINSTALL\n  Call MakeSureIGotWinamp\n!endif\n\n  Call QueryWinampVisPath\n  SetOutPath $1\n\n  ; File to extract\n  #File \"C:\\program files\\winamp\\plugins\\vis_nsfs.dll\"\n  File /oname=vis_nsfs.dll \"${NSISDIR}\\Plugins\\TypeLib.dll\" # dummy plug-in\n\n  ; prompt user, and if they select no, go to NoWinamp\n  MessageBox MB_YESNO|MB_ICONQUESTION \\\n             \"The plug-in was installed. Would you like to run Winamp now with TinyVis as the default plug-in?\" \\\n             IDNO NoWinamp\n    WriteINIStr \"$INSTDIR\\Winamp.ini\" \"Winamp\" \"visplugin_name\" \"vis_nsfs.dll\"\n    WriteINIStr \"$INSTDIR\\Winamp.ini\" \"Winamp\" \"visplugin_num\" \"0\"\n    Exec '\"$INSTDIR\\Winamp.exe\"'\n  NoWinamp:\n  \nSectionEnd\n\n;--------------------------------\n\nFunction .onVerifyInstDir\n\n!ifndef WINAMP_AUTOINSTALL\n\n  ;Check for Winamp installation\n\n  IfFileExists $INSTDIR\\Winamp.exe Good\n    Abort\n  Good:\n\n!endif ; WINAMP_AUTOINSTALL\n\nFunctionEnd\n\nFunction QueryWinampVisPath ; sets $1 with vis path\n\n  StrCpy $1 $INSTDIR\\Plugins\n  ; use DSPDir instead of VISDir to get DSP plugins directory\n  ReadINIStr $9 $INSTDIR\\winamp.ini Winamp VisDir \n  StrCmp $9 \"\" End\n  IfFileExists $9 0 End\n    StrCpy $1 $9 ; update dir\n  End:\n  \nFunctionEnd\n\n!ifdef WINAMP_AUTOINSTALL\n\nFunction GetWinampInstPath\n\n  Push $0\n  Push $1\n  Push $2\n  ReadRegStr $0 HKLM \\\n     \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Winamp\" \\ \n     \"UninstallString\"\n  StrCmp $0 \"\" fin\n\n    StrCpy $1 $0 1 0 ; get firstchar\n    StrCmp $1 '\"' \"\" getparent \n      ; if first char is \", let's remove \"'s first.\n      StrCpy $0 $0 \"\" 1\n      StrCpy $1 0\n      rqloop:\n        StrCpy $2 $0 1 $1\n        StrCmp $2 '\"' rqdone\n        StrCmp $2 \"\" rqdone\n        IntOp $1 $1 + 1\n        Goto rqloop\n      rqdone:\n      StrCpy $0 $0 $1\n    getparent:\n    ; the uninstall string goes to an EXE, let's get the directory.\n    StrCpy $1 -1\n    gploop:\n      StrCpy $2 $0 1 $1\n      StrCmp $2 \"\" gpexit\n      StrCmp $2 \"\\\" gpexit\n      IntOp $1 $1 - 1\n      Goto gploop\n    gpexit:\n    StrCpy $0 $0 $1\n\n    StrCmp $0 \"\" fin\n    IfFileExists $0\\winamp.exe fin\n      StrCpy $0 \"\"\n  fin:\n  Pop $2\n  Pop $1\n  Exch $0\n  \nFunctionEnd\n\nFunction MakeSureIGotWinamp\n\n  Call GetWinampInstPath\n  \n  Pop $0\n  StrCmp $0 \"\" getwinamp\n    Return\n    \n  getwinamp:\n  \n  Call ConnectInternet ;Make an internet connection (if no connection available)\n  \n  StrCpy $2 \"$TEMP\\Winamp Installer.exe\"\n  NSISdl::download http://download.nullsoft.com/winamp/client/winamp281_lite.exe $2\n  Pop $0\n  StrCmp $0 success success\n    SetDetailsView show\n    DetailPrint \"download failed: $0\"\n    Abort\n  success:\n    ExecWait '\"$2\" /S'\n    Delete $2\n    Call GetWinampInstPath\n    Pop $0\n    StrCmp $0 \"\" skip\n    StrCpy $INSTDIR $0\n  skip:\n  \nFunctionEnd\n\nFunction ConnectInternet\n\n  Push $R0\n    \n    ClearErrors\n    Dialer::AttemptConnect\n    IfErrors noie3\n    \n    Pop $R0\n    StrCmp $R0 \"online\" connected\n      MessageBox MB_OK|MB_ICONSTOP \"Cannot connect to the internet.\"\n      Quit\n    \n    noie3:\n  \n    ; IE3 not installed\n    MessageBox MB_OK|MB_ICONINFORMATION \"Please connect to the internet now.\"\n    \n    connected:\n  \n  Pop $R0\n  \nFunctionEnd\n\n!endif ; WINAMP_AUTOINSTALL"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/Colors.nsh",
    "content": "!ifndef COLORS_NSH\n!define COLORS_NSH\n\n!verbose push\n!verbose 3\n\n# Squad\n# Rob Segal\n# Joel\n# Yathosho\n\n\n# Predefined HTML Hex colors\n!define WHITE \"FFFFFF\"\n!define BLACK \"000000\"\n!define YELLOW \"FFFF00\"\n!define RED \"FF0000\"\n!define GREEN \"00FF00\"\n!define BLUE \"0000FF\"\n!define MAGENTA \"FF00FF\"\n!define CYAN \"00FFFF\"\n\n# Function to convert red , green and blue integer values to HTML Hex format\n!define RGB '!insertmacro rgb2hex'\n\n# Function to convert red, green and blue integer values to Hexadecimal (0xRRGGBB) format\n!define HEX '!insertmacro rgb2hex2'\n\n# Function to get the r value from a RGB number\n!define GetRvalue '!insertmacro redvalue'\n\n# Function to get the g value from a RGB number\n!define GetGvalue '!insertmacro greenvalue'\n\n# Function to get the b value from a RGB number\n!define GetBvalue '!insertmacro bluevalue'\n\n# Function to get the r value from a Hex number\n!define GetRvalueX '!insertmacro bluevalue'\n\n# Function to get the g value from a Hex number\n!define GetGvalueX '!insertmacro greenvalue'\n\n# Function to get the r value from a HEX number\n!define GetBvalueX '!insertmacro redvalue'\n\n!macro rgb2hex output R G B\nIntFmt \"${output}\" \"%02X\" \"${R}\"\nIntFmt \"${output}\" \"${output}%02X\" \"${G}\"\nIntFmt \"${output}\" \"${output}%02X\" \"${B}\"\n!macroend\n\n!macro rgb2hex2 output R G B\nIntFmt \"${output}\" \"%02X\" \"${B}\"\nIntFmt \"${output}\" \"${output}%02X\" \"${G}\"\nIntFmt \"${output}\" \"${output}%02X\" \"${R}\"\n!macroend\n\n!macro redvalue output hexval\nStrCpy ${output} ${hexval} 2 0\nIntFmt \"${output}\" \"%02i\" \"0x${output}\"\n!macroend\n\n!macro greenvalue output hexval\nStrCpy ${output} ${hexval} 2 2\nIntFmt \"${output}\" \"%02i\" \"0x${output}\"\n!macroend\n\n!macro bluevalue output hexval\nStrCpy ${output} ${hexval} 2 4\nIntFmt \"${output}\" \"%02i\" \"0x${output}\"\n!macroend\n\n!verbose pop\n!endif"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/FileFunc.nsh",
    "content": "/*\n_____________________________________________________________________________\n\n                       File Functions Header v3.4\n_____________________________________________________________________________\n\n 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)\n\n See documentation for more information about the following functions.\n\n Usage in script:\n 1. !include \"FileFunc.nsh\"\n 2. [Section|Function]\n      ${FileFunction} \"Param1\" \"Param2\" \"...\" $var\n    [SectionEnd|FunctionEnd]\n\n\n FileFunction=[Locate|GetSize|DriveSpace|GetDrives|GetTime|GetFileAttributes|\n               GetFileVersion|GetExeName|GetExePath|GetParameters|GetOptions|\n               GetOptionsS|GetRoot|GetParent|GetFileName|GetBaseName|GetFileExt|\n               BannerTrimPath|DirState|RefreshShellIcons]\n\n_____________________________________________________________________________\n\n                       Thanks to:\n_____________________________________________________________________________\n\nGetSize\n\tKiCHiK (Function \"FindFiles\")\nDriveSpace\n\tsunjammer (Function \"CheckSpaceFree\")\nGetDrives\n\tdeguix (Based on his idea of Function \"DetectDrives\")\nGetTime\n\tTakhir (Script \"StatTest\") and deguix (Function \"FileModifiedDate\")\nGetFileVersion\n\tKiCHiK (Based on his example for command \"GetDLLVersion\")\nGetParameters\n\tsunjammer (Based on his Function \"GetParameters\")\nGetRoot\n\tKiCHiK (Based on his Function \"GetRoot\")\nGetParent\n\tsunjammer (Based on his Function \"GetParent\")\nGetFileName\n\tKiCHiK (Based on his Function \"GetFileName\")\nGetBaseName\n\tcomperio (Based on his idea of Function \"GetBaseName\")\nGetFileExt\n\topher (author)\nRefreshShellIcons\n\tjerome tremblay (author)\n*/\n\n\n;_____________________________________________________________________________\n;\n;                         Macros\n;_____________________________________________________________________________\n;\n; Change log window verbosity (default: 3=no script)\n;\n; Example:\n; !include \"FileFunc.nsh\"\n; !insertmacro Locate\n; ${FILEFUNC_VERBOSE} 4   # all verbosity\n; !insertmacro VersionCompare\n; ${FILEFUNC_VERBOSE} 3   # no script\n\n!ifndef FILEFUNC_INCLUDED\n!define FILEFUNC_INCLUDED\n\n!include Util.nsh\n\n!verbose push\n!verbose 3\n!ifndef _FILEFUNC_VERBOSE\n\t!define _FILEFUNC_VERBOSE 3\n!endif\n!verbose ${_FILEFUNC_VERBOSE}\n!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`\n!verbose pop\n\n!macro FILEFUNC_VERBOSE _VERBOSE\n\t!verbose push\n\t!verbose 3\n\t!undef _FILEFUNC_VERBOSE\n\t!define _FILEFUNC_VERBOSE ${_VERBOSE}\n\t!verbose pop\n!macroend\n\n!macro LocateCall _PATH _OPTIONS _FUNC\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush $0\n\tPush `${_PATH}`\n\tPush `${_OPTIONS}`\n\tGetFunctionAddress $0 `${_FUNC}`\n\tPush `$0`\n\t${CallArtificialFunction} Locate_\n\tPop $0\n\t!verbose pop\n!macroend\n\n!macro GetSizeCall _PATH _OPTIONS _RESULT1 _RESULT2 _RESULT3\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_PATH}`\n\tPush `${_OPTIONS}`\n\t${CallArtificialFunction} GetSize_\n\tPop ${_RESULT1}\n\tPop ${_RESULT2}\n\tPop ${_RESULT3}\n\t!verbose pop\n!macroend\n\n!macro DriveSpaceCall _DRIVE _OPTIONS _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_DRIVE}`\n\tPush `${_OPTIONS}`\n\t${CallArtificialFunction} DriveSpace_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro GetDrivesCall _DRV _FUNC\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush $0\n\tPush `${_DRV}`\n\tGetFunctionAddress $0 `${_FUNC}`\n\tPush `$0`\n\t${CallArtificialFunction} GetDrives_\n\tPop $0\n\t!verbose pop\n!macroend\n\n!macro GetTimeCall _FILE _OPTION _RESULT1 _RESULT2 _RESULT3 _RESULT4 _RESULT5 _RESULT6 _RESULT7\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_FILE}`\n\tPush `${_OPTION}`\n\t${CallArtificialFunction} GetTime_\n\tPop ${_RESULT1}\n\tPop ${_RESULT2}\n\tPop ${_RESULT3}\n\tPop ${_RESULT4}\n\tPop ${_RESULT5}\n\tPop ${_RESULT6}\n\tPop ${_RESULT7}\n\t!verbose pop\n!macroend\n\n!macro GetFileAttributesCall _PATH _ATTR _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_PATH}`\n\tPush `${_ATTR}`\n\t${CallArtificialFunction} GetFileAttributes_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro GetFileVersionCall _FILE _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_FILE}`\n\t${CallArtificialFunction} GetFileVersion_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro GetExeNameCall _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t${CallArtificialFunction} GetExeName_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro GetExePathCall _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t${CallArtificialFunction} GetExePath_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro GetParametersCall _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t${CallArtificialFunction} GetParameters_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro GetOptionsCall _PARAMETERS _OPTION _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_PARAMETERS}`\n\tPush `${_OPTION}`\n\t${CallArtificialFunction} GetOptions_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro GetOptionsSCall _PARAMETERS _OPTION _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_PARAMETERS}`\n\tPush `${_OPTION}`\n\t${CallArtificialFunction} GetOptionsS_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro GetRootCall _FULLPATH _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_FULLPATH}`\n\t${CallArtificialFunction} GetRoot_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro GetParentCall _PATHSTRING _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_PATHSTRING}`\n\t${CallArtificialFunction} GetParent_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro GetFileNameCall _PATHSTRING _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_PATHSTRING}`\n\t${CallArtificialFunction} GetFileName_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro GetBaseNameCall _FILESTRING _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_FILESTRING}`\n\t${CallArtificialFunction} GetBaseName_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro GetFileExtCall _FILESTRING _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_FILESTRING}`\n\t${CallArtificialFunction} GetFileExt_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro BannerTrimPathCall _PATH _LENGHT _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_PATH}`\n\tPush `${_LENGHT}`\n\t${CallArtificialFunction} BannerTrimPath_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro DirStateCall _PATH _RESULT\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\tPush `${_PATH}`\n\t${CallArtificialFunction} DirState_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro RefreshShellIconsCall\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t${CallArtificialFunction} RefreshShellIcons_\n\t!verbose pop\n!macroend\n\n!define Locate `!insertmacro LocateCall`\n!define un.Locate `!insertmacro LocateCall`\n\n!macro Locate\n!macroend\n\n!macro un.Locate\n!macroend\n\n!macro Locate_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\t\n\tExch $2\n\tExch\n\tExch $1\n\tExch\n\tExch 2\n\tExch $0\n\tExch 2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $8\n\tPush $9\n\tPush $R6\n\tPush $R7\n\tPush $R8\n\tPush $R9\n\tClearErrors\n\n\tStrCpy $3 ''\n\tStrCpy $4 ''\n\tStrCpy $5 ''\n\tStrCpy $6 ''\n\tStrCpy $7 ''\n\tStrCpy $8 0\n\tStrCpy $R7 ''\n\n\tStrCpy $R9 $0 1 -1\n\tStrCmp $R9 '\\' 0 +3\n\tStrCpy $0 $0 -1\n\tgoto -3\n\tIfFileExists '$0\\*.*' 0 FileFunc_Locate_error\n\n\tFileFunc_Locate_option:\n\tStrCpy $R9 $1 1\n\tStrCpy $1 $1 '' 1\n\tStrCmp $R9 ' ' -2\n\tStrCmp $R9 '' FileFunc_Locate_sizeset\n\tStrCmp $R9 '/' 0 -4\n\tStrCpy $9 -1\n\tIntOp $9 $9 + 1\n\tStrCpy $R9 $1 1 $9\n\tStrCmp $R9 '' +2\n\tStrCmp $R9 '/' 0 -3\n\tStrCpy $R8 $1 $9\n\tStrCpy $R8 $R8 '' 2\n\tStrCpy $R9 $R8 '' -1\n\tStrCmp $R9 ' ' 0 +3\n\tStrCpy $R8 $R8 -1\n\tgoto -3\n\tStrCpy $R9 $1 2\n\tStrCpy $1 $1 '' $9\n\n\tStrCmp $R9 'L=' 0 FileFunc_Locate_mask\n\tStrCpy $3 $R8\n\tStrCmp $3 '' +6\n\tStrCmp $3 'FD' +5\n\tStrCmp $3 'F' +4\n\tStrCmp $3 'D' +3\n\tStrCmp $3 'DE' +2\n\tStrCmp $3 'FDE' 0 FileFunc_Locate_error\n\tgoto FileFunc_Locate_option\n\n\tFileFunc_Locate_mask:\n\tStrCmp $R9 'M=' 0 FileFunc_Locate_size\n\tStrCpy $4 $R8\n\tgoto FileFunc_Locate_option\n\n\tFileFunc_Locate_size:\n\tStrCmp $R9 'S=' 0 FileFunc_Locate_gotosubdir\n\tStrCpy $6 $R8\n\tgoto FileFunc_Locate_option\n\n\tFileFunc_Locate_gotosubdir:\n\tStrCmp $R9 'G=' 0 FileFunc_Locate_banner\n\tStrCpy $7 $R8\n\tStrCmp $7 '' +3\n\tStrCmp $7 '1' +2\n\tStrCmp $7 '0' 0 FileFunc_Locate_error\n\tgoto FileFunc_Locate_option\n\n\tFileFunc_Locate_banner:\n\tStrCmp $R9 'B=' 0 FileFunc_Locate_error\n\tStrCpy $R7 $R8\n\tStrCmp $R7 '' +3\n\tStrCmp $R7 '1' +2\n\tStrCmp $R7 '0' 0 FileFunc_Locate_error\n\tgoto FileFunc_Locate_option\n\n\tFileFunc_Locate_sizeset:\n\tStrCmp $6 '' FileFunc_Locate_default\n\tStrCpy $9 0\n\tStrCpy $R9 $6 1 $9\n\tStrCmp $R9 '' +4\n\tStrCmp $R9 ':' +3\n\tIntOp $9 $9 + 1\n\tgoto -4\n\tStrCpy $5 $6 $9\n\tIntOp $9 $9 + 1\n\tStrCpy $1 $6 1 -1\n\tStrCpy $6 $6 -1 $9\n\tStrCmp $5 '' +2\n\tIntOp $5 $5 + 0\n\tStrCmp $6 '' +2\n\tIntOp $6 $6 + 0\n\n\tStrCmp $1 'B' 0 +3\n\tStrCpy $1 1\n\tgoto FileFunc_Locate_default\n\tStrCmp $1 'K' 0 +3\n\tStrCpy $1 1024\n\tgoto FileFunc_Locate_default\n\tStrCmp $1 'M' 0 +3\n\tStrCpy $1 1048576\n\tgoto FileFunc_Locate_default\n\tStrCmp $1 'G' 0 FileFunc_Locate_error\n\tStrCpy $1 1073741824\n\n\tFileFunc_Locate_default:\n\tStrCmp $3 '' 0 +2\n\tStrCpy $3 'FD'\n\tStrCmp $4 '' 0 +2\n\tStrCpy $4 '*.*'\n\tStrCmp $7 '' 0 +2\n\tStrCpy $7 '1'\n\tStrCmp $R7 '' 0 +2\n\tStrCpy $R7 '0'\n\tStrCpy $7 'G$7B$R7'\n\n\tStrCpy $8 1\n\tPush $0\n\tSetDetailsPrint textonly\n\n\tFileFunc_Locate_nextdir:\n\tIntOp $8 $8 - 1\n\tPop $R8\n\n\tStrCpy $9 $7 2 2\n\tStrCmp $9 'B0' +3\n\tGetLabelAddress $9 FileFunc_Locate_findfirst\n\tgoto call\n\tDetailPrint 'Search in: $R8'\n\n\tFileFunc_Locate_findfirst:\n\tFindFirst $0 $R7 '$R8\\$4'\n\tIfErrors FileFunc_Locate_subdir\n\tStrCmp $R7 '.' 0 FileFunc_Locate_dir\n\tFindNext $0 $R7\n\tStrCmp $R7 '..' 0 FileFunc_Locate_dir\n\tFindNext $0 $R7\n\tIfErrors 0 FileFunc_Locate_dir\n\tFindClose $0\n\tgoto FileFunc_Locate_subdir\n\n\tFileFunc_Locate_dir:\n\tIfFileExists '$R8\\$R7\\*.*' 0 FileFunc_Locate_file\n\tStrCpy $R6 ''\n\tStrCmp $3 'DE' +4\n\tStrCmp $3 'FDE' +3\n\tStrCmp $3 'FD' FileFunc_Locate_precall\n\tStrCmp $3 'F' FileFunc_Locate_findnext FileFunc_Locate_precall\n\tFindFirst $9 $R9 '$R8\\$R7\\*.*'\n\tStrCmp $R9 '.' 0 +4\n\tFindNext $9 $R9\n\tStrCmp $R9 '..' 0 +2\n\tFindNext $9 $R9\n\tFindClose $9\n\tIfErrors FileFunc_Locate_precall FileFunc_Locate_findnext\n\n\tFileFunc_Locate_file:\n\tStrCmp $3 'FDE' +3\n\tStrCmp $3 'FD' +2\n\tStrCmp $3 'F' 0 FileFunc_Locate_findnext\n\tStrCpy $R6 0\n\tStrCmp $5$6 '' FileFunc_Locate_precall\n\tFileOpen $9 '$R8\\$R7' r\n\tIfErrors +3\n\tFileSeek $9 0 END $R6\n\tFileClose $9\n\tSystem::Int64Op $R6 / $1\n\tPop $R6\n\tStrCmp $5 '' +2\n\tIntCmp $R6 $5 0 FileFunc_Locate_findnext\n\tStrCmp $6 '' +2\n\tIntCmp $R6 $6 0 0 FileFunc_Locate_findnext\n\n\tFileFunc_Locate_precall:\n\tStrCpy $9 0\n\tStrCpy $R9 '$R8\\$R7'\n\n\tcall:\n\tPush $0\n\tPush $1\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $8\n\tPush $9\n\tPush $R7\n\tPush $R8\n\tStrCmp $9 0 +4\n\tStrCpy $R6 ''\n\tStrCpy $R7 ''\n\tStrCpy $R9 ''\n\tCall $2\n\tPop $R9\n\tPop $R8\n\tPop $R7\n\tPop $9\n\tPop $8\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\n\tIfErrors 0 +3\n\tFindClose $0\n\tgoto FileFunc_Locate_error\n\tStrCmp $R9 'StopLocate' 0 +3\n\tFindClose $0\n\tgoto FileFunc_Locate_clearstack\n\tgoto $9\n\n\tFileFunc_Locate_findnext:\n\tFindNext $0 $R7\n\tIfErrors 0 FileFunc_Locate_dir\n\tFindClose $0\n\n\tFileFunc_Locate_subdir:\n\tStrCpy $9 $7 2\n\tStrCmp $9 'G0' FileFunc_Locate_end\n\tFindFirst $0 $R7 '$R8\\*.*'\n\tStrCmp $R7 '.' 0 FileFunc_Locate_pushdir\n\tFindNext $0 $R7\n\tStrCmp $R7 '..' 0 FileFunc_Locate_pushdir\n\tFindNext $0 $R7\n\tIfErrors 0 FileFunc_Locate_pushdir\n\tFindClose $0\n\tStrCmp $8 0 FileFunc_Locate_end FileFunc_Locate_nextdir\n\n\tFileFunc_Locate_pushdir:\n\tIfFileExists '$R8\\$R7\\*.*' 0 +3\n\tPush '$R8\\$R7'\n\tIntOp $8 $8 + 1\n\tFindNext $0 $R7\n\tIfErrors 0 FileFunc_Locate_pushdir\n\tFindClose $0\n\tStrCmp $8 0 FileFunc_Locate_end FileFunc_Locate_nextdir\n\n\tFileFunc_Locate_error:\n\tSetErrors\n\n\tFileFunc_Locate_clearstack:\n\tStrCmp $8 0 FileFunc_Locate_end\n\tIntOp $8 $8 - 1\n\tPop $R8\n\tgoto FileFunc_Locate_clearstack\n\n\tFileFunc_Locate_end:\n\tSetDetailsPrint both\n\tPop $R9\n\tPop $R8\n\tPop $R7\n\tPop $R6\n\tPop $9\n\tPop $8\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\n\t!verbose pop\n!macroend\n\n!define GetSize `!insertmacro GetSizeCall`\n!define un.GetSize `!insertmacro GetSizeCall`\n\n!macro GetSize\n!macroend\n\n!macro un.GetSize\n!macroend\n\n!macro GetSize_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $8\n\tPush $9\n\tPush $R3\n\tPush $R4\n\tPush $R5\n\tPush $R6\n\tPush $R7\n\tPush $R8\n\tPush $R9\n\tClearErrors\n\n\tStrCpy $R9 $0 1 -1\n\tStrCmp $R9 '\\' 0 +3\n\tStrCpy $0 $0 -1\n\tgoto -3\n\tIfFileExists '$0\\*.*' 0 FileFunc_GetSize_error\n\n\tStrCpy $3 ''\n\tStrCpy $4 ''\n\tStrCpy $5 ''\n\tStrCpy $6 ''\n\tStrCpy $8 0\n\tStrCpy $R3 ''\n\tStrCpy $R4 ''\n\tStrCpy $R5 ''\n\n\tFileFunc_GetSize_option:\n\tStrCpy $R9 $1 1\n\tStrCpy $1 $1 '' 1\n\tStrCmp $R9 ' ' -2\n\tStrCmp $R9 '' FileFunc_GetSize_sizeset\n\tStrCmp $R9 '/' 0 -4\n\n\tStrCpy $9 -1\n\tIntOp $9 $9 + 1\n\tStrCpy $R9 $1 1 $9\n\tStrCmp $R9 '' +2\n\tStrCmp $R9 '/' 0 -3\n\tStrCpy $8 $1 $9\n\tStrCpy $8 $8 '' 2\n\tStrCpy $R9 $8 '' -1\n\tStrCmp $R9 ' ' 0 +3\n\tStrCpy $8 $8 -1\n\tgoto -3\n\tStrCpy $R9 $1 2\n\tStrCpy $1 $1 '' $9\n\n\tStrCmp $R9 'M=' 0 FileFunc_GetSize_size\n\tStrCpy $4 $8\n\tgoto FileFunc_GetSize_option\n\n\tFileFunc_GetSize_size:\n\tStrCmp $R9 'S=' 0 FileFunc_GetSize_gotosubdir\n\tStrCpy $6 $8\n\tgoto FileFunc_GetSize_option\n\n\tFileFunc_GetSize_gotosubdir:\n\tStrCmp $R9 'G=' 0 FileFunc_GetSize_error\n\tStrCpy $7 $8\n\tStrCmp $7 '' +3\n\tStrCmp $7 '1' +2\n\tStrCmp $7 '0' 0 FileFunc_GetSize_error\n\tgoto FileFunc_GetSize_option\n\n\tFileFunc_GetSize_sizeset:\n\tStrCmp $6 '' FileFunc_GetSize_default\n\tStrCpy $9 0\n\tStrCpy $R9 $6 1 $9\n\tStrCmp $R9 '' +4\n\tStrCmp $R9 ':' +3\n\tIntOp $9 $9 + 1\n\tgoto -4\n\tStrCpy $5 $6 $9\n\tIntOp $9 $9 + 1\n\tStrCpy $1 $6 1 -1\n\tStrCpy $6 $6 -1 $9\n\tStrCmp $5 '' +2\n\tIntOp $5 $5 + 0\n\tStrCmp $6 '' +2\n\tIntOp $6 $6 + 0\n\n\tStrCmp $1 'B' 0 +4\n\tStrCpy $1 1\n\tStrCpy $2 bytes\n\tgoto FileFunc_GetSize_default\n\tStrCmp $1 'K' 0 +4\n\tStrCpy $1 1024\n\tStrCpy $2 Kb\n\tgoto FileFunc_GetSize_default\n\tStrCmp $1 'M' 0 +4\n\tStrCpy $1 1048576\n\tStrCpy $2 Mb\n\tgoto FileFunc_GetSize_default\n\tStrCmp $1 'G' 0 FileFunc_GetSize_error\n\tStrCpy $1 1073741824\n\tStrCpy $2 Gb\n\n\tFileFunc_GetSize_default:\n\tStrCmp $4 '' 0 +2\n\tStrCpy $4 '*.*'\n\tStrCmp $7 '' 0 +2\n\tStrCpy $7 '1'\n\n\tStrCpy $8 1\n\tPush $0\n\tSetDetailsPrint textonly\n\n\tFileFunc_GetSize_nextdir:\n\tIntOp $8 $8 - 1\n\tPop $R8\n\tFindFirst $0 $R7 '$R8\\$4'\n\tIfErrors FileFunc_GetSize_show\n\tStrCmp $R7 '.' 0 FileFunc_GetSize_dir\n\tFindNext $0 $R7\n\tStrCmp $R7 '..' 0 FileFunc_GetSize_dir\n\tFindNext $0 $R7\n\tIfErrors 0 FileFunc_GetSize_dir\n\tFindClose $0\n\tgoto FileFunc_GetSize_show\n\n\tFileFunc_GetSize_dir:\n\tIfFileExists '$R8\\$R7\\*.*' 0 FileFunc_GetSize_file\n\tIntOp $R5 $R5 + 1\n\tgoto FileFunc_GetSize_findnext\n\n\tFileFunc_GetSize_file:\n\tStrCpy $R6 0\n\tStrCmp $5$6 '' 0 +3\n\tIntOp $R4 $R4 + 1\n\tgoto FileFunc_GetSize_findnext\n\tFileOpen $9 '$R8\\$R7' r\n\tIfErrors +3\n\tFileSeek $9 0 END $R6\n\tFileClose $9\n\tStrCmp $5 '' +2\n\tIntCmp $R6 $5 0 FileFunc_GetSize_findnext\n\tStrCmp $6 '' +2\n\tIntCmp $R6 $6 0 0 FileFunc_GetSize_findnext\n\tIntOp $R4 $R4 + 1\n\tSystem::Int64Op $R3 + $R6\n\tPop $R3\n\n\tFileFunc_GetSize_findnext:\n\tFindNext $0 $R7\n\tIfErrors 0 FileFunc_GetSize_dir\n\tFindClose $0\n\n\tFileFunc_GetSize_show:\n\tStrCmp $5$6 '' FileFunc_GetSize_nosize\n\tSystem::Int64Op $R3 / $1\n\tPop $9\n\tDetailPrint 'Size:$9 $2  Files:$R4  Folders:$R5'\n\tgoto FileFunc_GetSize_subdir\n\tFileFunc_GetSize_nosize:\n\tDetailPrint 'Files:$R4  Folders:$R5'\n\n\tFileFunc_GetSize_subdir:\n\tStrCmp $7 0 FileFunc_GetSize_preend\n\tFindFirst $0 $R7 '$R8\\*.*'\n\tStrCmp $R7 '.' 0 FileFunc_GetSize_pushdir\n\tFindNext $0 $R7\n\tStrCmp $R7 '..' 0 FileFunc_GetSize_pushdir\n\tFindNext $0 $R7\n\tIfErrors 0 FileFunc_GetSize_pushdir\n\tFindClose $0\n\tStrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir\n\n\tFileFunc_GetSize_pushdir:\n\tIfFileExists '$R8\\$R7\\*.*' 0 +3\n\tPush '$R8\\$R7'\n\tIntOp $8 $8 + 1\n\tFindNext $0 $R7\n\tIfErrors 0 FileFunc_GetSize_pushdir\n\tFindClose $0\n\tStrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir\n\n\tFileFunc_GetSize_preend:\n\tStrCmp $R3 '' FileFunc_GetSize_nosizeend\n\tSystem::Int64Op $R3 / $1\n\tPop $R3\n\tFileFunc_GetSize_nosizeend:\n\tStrCpy $2 $R4\n\tStrCpy $1 $R5\n\tStrCpy $0 $R3\n\tgoto FileFunc_GetSize_end\n\n\tFileFunc_GetSize_error:\n\tSetErrors\n\tStrCpy $0 ''\n\tStrCpy $1 ''\n\tStrCpy $2 ''\n\n\tFileFunc_GetSize_end:\n\tSetDetailsPrint both\n\tPop $R9\n\tPop $R8\n\tPop $R7\n\tPop $R6\n\tPop $R5\n\tPop $R4\n\tPop $R3\n\tPop $9\n\tPop $8\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tExch $2\n\tExch\n\tExch $1\n\tExch 2\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define DriveSpace `!insertmacro DriveSpaceCall`\n!define un.DriveSpace `!insertmacro DriveSpaceCall`\n\n!macro DriveSpace\n!macroend\n\n!macro un.DriveSpace\n!macroend\n\n!macro DriveSpace_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tClearErrors\n\n\tStrCpy $2 $0 1 -1\n\tStrCmp $2 '\\' 0 +3\n\tStrCpy $0 $0 -1\n\tgoto -3\n\tIfFileExists '$0\\NUL' 0 FileFunc_DriveSpace_error\n\n\tStrCpy $5 ''\n\tStrCpy $6 ''\n\n\tFileFunc_DriveSpace_option:\n\tStrCpy $2 $1 1\n\tStrCpy $1 $1 '' 1\n\tStrCmp $2 ' ' -2\n\tStrCmp $2 '' FileFunc_DriveSpace_default\n\tStrCmp $2 '/' 0 -4\n\tStrCpy $3 -1\n\tIntOp $3 $3 + 1\n\tStrCpy $2 $1 1 $3\n\tStrCmp $2 '' +2\n\tStrCmp $2 '/' 0 -3\n\tStrCpy $4 $1 $3\n\tStrCpy $4 $4 '' 2\n\tStrCpy $2 $4 1 -1\n\tStrCmp $2 ' ' 0 +3\n\tStrCpy $4 $4 -1\n\tgoto -3\n\tStrCpy $2 $1 2\n\tStrCpy $1 $1 '' $3\n\n\tStrCmp $2 'D=' 0 FileFunc_DriveSpace_unit\n\tStrCpy $5 $4\n\tStrCmp $5 '' +4\n\tStrCmp $5 'T' +3\n\tStrCmp $5 'O' +2\n\tStrCmp $5 'F' 0 FileFunc_DriveSpace_error\n\tgoto FileFunc_DriveSpace_option\n\n\tFileFunc_DriveSpace_unit:\n\tStrCmp $2 'S=' 0 FileFunc_DriveSpace_error\n\tStrCpy $6 $4\n\tgoto FileFunc_DriveSpace_option\n\n\tFileFunc_DriveSpace_default:\n\tStrCmp $5 '' 0 +2\n\tStrCpy $5 'T'\n\tStrCmp $6 '' 0 +3\n\tStrCpy $6 '1'\n\tgoto FileFunc_DriveSpace_getspace\n\n\tStrCmp $6 'B' 0 +3\n\tStrCpy $6 1\n\tgoto FileFunc_DriveSpace_getspace\n\tStrCmp $6 'K' 0 +3\n\tStrCpy $6 1024\n\tgoto FileFunc_DriveSpace_getspace\n\tStrCmp $6 'M' 0 +3\n\tStrCpy $6 1048576\n\tgoto FileFunc_DriveSpace_getspace\n\tStrCmp $6 'G' 0 FileFunc_DriveSpace_error\n\tStrCpy $6 1073741824\n\n\tFileFunc_DriveSpace_getspace:\n\tSystem::Call 'kernel32::GetDiskFreeSpaceExA(t, *l, *l, *l)i(r0,.r2,.r3,.)'\n\n\tStrCmp $5 T 0 +3\n\tStrCpy $0 $3\n\tgoto FileFunc_DriveSpace_getsize\n\tStrCmp $5 O 0 +4\n\tSystem::Int64Op $3 - $2\n\tPop $0\n\tgoto FileFunc_DriveSpace_getsize\n\tStrCmp $5 F 0 +2\n\tStrCpy $0 $2\n\n\tFileFunc_DriveSpace_getsize:\n\tSystem::Int64Op $0 / $6\n\tPop $0\n\tgoto FileFunc_DriveSpace_end\n\n\tFileFunc_DriveSpace_error:\n\tSetErrors\n\tStrCpy $0 ''\n\n\tFileFunc_DriveSpace_end:\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define GetDrives `!insertmacro GetDrivesCall`\n!define un.GetDrives `!insertmacro GetDrivesCall`\n\n!macro GetDrives\n!macroend\n\n!macro un.GetDrives\n!macroend\n\n!macro GetDrives_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $8\n\tPush $9\n\n\tSystem::Alloc 1024\n\tPop $2\n\tSystem::Call 'kernel32::GetLogicalDriveStringsA(i,i) i(1024, r2)'\n\n\tStrCmp $0 ALL FileFunc_GetDrives_drivestring\n\tStrCmp $0 '' 0 FileFunc_GetDrives_typeset\n\tStrCpy $0 ALL\n\tgoto FileFunc_GetDrives_drivestring\n\n\tFileFunc_GetDrives_typeset:\n\tStrCpy $6 -1\n\tIntOp $6 $6 + 1\n\tStrCpy $8 $0 1 $6\n\tStrCmp $8$0 '' FileFunc_GetDrives_enumex\n\tStrCmp $8 '' +2\n\tStrCmp $8 '+' 0 -4\n\tStrCpy $8 $0 $6\n\tIntOp $6 $6 + 1\n\tStrCpy $0 $0 '' $6\n\n\tStrCmp $8 'FDD' 0 +3\n\tStrCpy $6 2\n\tgoto FileFunc_GetDrives_drivestring\n\tStrCmp $8 'HDD' 0 +3\n\tStrCpy $6 3\n\tgoto FileFunc_GetDrives_drivestring\n\tStrCmp $8 'NET' 0 +3\n\tStrCpy $6 4\n\tgoto FileFunc_GetDrives_drivestring\n\tStrCmp $8 'CDROM' 0 +3\n\tStrCpy $6 5\n\tgoto FileFunc_GetDrives_drivestring\n\tStrCmp $8 'RAM' 0 FileFunc_GetDrives_typeset\n\tStrCpy $6 6\n\n\tFileFunc_GetDrives_drivestring:\n\tStrCpy $3 $2\n\n\tFileFunc_GetDrives_enumok:\n\tSystem::Call 'kernel32::lstrlenA(t) i(i r3) .r4'\n\tStrCmp $4$0 '0ALL' FileFunc_GetDrives_enumex\n\tStrCmp $4 0 FileFunc_GetDrives_typeset\n\tSystem::Call 'kernel32::GetDriveTypeA(t) i(i r3) .r5'\n\n\tStrCmp $0 ALL +2\n\tStrCmp $5 $6 FileFunc_GetDrives_letter FileFunc_GetDrives_enumnext\n\tStrCmp $5 2 0 +3\n\tStrCpy $8 FDD\n\tgoto FileFunc_GetDrives_letter\n\tStrCmp $5 3 0 +3\n\tStrCpy $8 HDD\n\tgoto FileFunc_GetDrives_letter\n\tStrCmp $5 4 0 +3\n\tStrCpy $8 NET\n\tgoto FileFunc_GetDrives_letter\n\tStrCmp $5 5 0 +3\n\tStrCpy $8 CDROM\n\tgoto FileFunc_GetDrives_letter\n\tStrCmp $5 6 0 FileFunc_GetDrives_enumex\n\tStrCpy $8 RAM\n\n\tFileFunc_GetDrives_letter:\n\tSystem::Call '*$3(&t1024 .r9)'\n\n\tPush $0\n\tPush $1\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $8\n\tCall $1\n\tPop $9\n\tPop $8\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\tStrCmp $9 'StopGetDrives' FileFunc_GetDrives_enumex\n\n\tFileFunc_GetDrives_enumnext:\n\tIntOp $3 $3 + $4\n\tIntOp $3 $3 + 1\n\tgoto FileFunc_GetDrives_enumok\n\n\tFileFunc_GetDrives_enumex:\n\tSystem::Free $2\n\n\tPop $9\n\tPop $8\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\t\n\t!verbose pop\n!macroend\n\n!define GetTime `!insertmacro GetTimeCall`\n!define un.GetTime `!insertmacro GetTimeCall`\n\n!macro GetTime\n!macroend\n\n!macro un.GetTime\n!macroend\n\n!macro GetTime_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tClearErrors\n\n\tStrCmp $1 'L' FileFunc_GetTime_gettime\n\tStrCmp $1 'A' FileFunc_GetTime_getfile\n\tStrCmp $1 'C' FileFunc_GetTime_getfile\n\tStrCmp $1 'M' FileFunc_GetTime_getfile\n\tStrCmp $1 'LS' FileFunc_GetTime_gettime\n\tStrCmp $1 'AS' FileFunc_GetTime_getfile\n\tStrCmp $1 'CS' FileFunc_GetTime_getfile\n\tStrCmp $1 'MS' FileFunc_GetTime_getfile\n\tgoto FileFunc_GetTime_error\n\n\tFileFunc_GetTime_getfile:\n\tIfFileExists $0 0 FileFunc_GetTime_error\n\tSystem::Call '*(i,l,l,l,i,i,i,i,&t260,&t14) i .r6'\n\tSystem::Call 'kernel32::FindFirstFileA(t,i)i(r0,r6) .r2'\n\tSystem::Call 'kernel32::FindClose(i)i(r2)'\n\n\tFileFunc_GetTime_gettime:\n\tSystem::Call '*(&i2,&i2,&i2,&i2,&i2,&i2,&i2,&i2) i .r7'\n\tStrCmp $1 'L' 0 FileFunc_GetTime_systemtime\n\tSystem::Call 'kernel32::GetLocalTime(i)i(r7)'\n\tgoto FileFunc_GetTime_convert\n\tFileFunc_GetTime_systemtime:\n\tStrCmp $1 'LS' 0 FileFunc_GetTime_filetime\n\tSystem::Call 'kernel32::GetSystemTime(i)i(r7)'\n\tgoto FileFunc_GetTime_convert\n\n\tFileFunc_GetTime_filetime:\n\tSystem::Call '*$6(i,l,l,l,i,i,i,i,&t260,&t14)i(,.r4,.r3,.r2)'\n\tSystem::Free $6\n\tStrCmp $1 'A' 0 +3\n\tStrCpy $2 $3\n\tgoto FileFunc_GetTime_tolocal\n\tStrCmp $1 'C' 0 +3\n\tStrCpy $2 $4\n\tgoto FileFunc_GetTime_tolocal\n\tStrCmp $1 'M' FileFunc_GetTime_tolocal\n\n\tStrCmp $1 'AS' FileFunc_GetTime_tosystem\n\tStrCmp $1 'CS' 0 +3\n\tStrCpy $3 $4\n\tgoto FileFunc_GetTime_tosystem\n\tStrCmp $1 'MS' 0 +3\n\tStrCpy $3 $2\n\tgoto FileFunc_GetTime_tosystem\n\n\tFileFunc_GetTime_tolocal:\n\tSystem::Call 'kernel32::FileTimeToLocalFileTime(*l,*l)i(r2,.r3)'\n\tFileFunc_GetTime_tosystem:\n\tSystem::Call 'kernel32::FileTimeToSystemTime(*l,i)i(r3,r7)'\n\n\tFileFunc_GetTime_convert:\n\tSystem::Call '*$7(&i2,&i2,&i2,&i2,&i2,&i2,&i2,&i2)i(.r5,.r6,.r4,.r0,.r3,.r2,.r1,)'\n\tSystem::Free $7\n\n\tIntCmp $0 9 0 0 +2\n\tStrCpy $0 '0$0'\n\tIntCmp $1 9 0 0 +2\n\tStrCpy $1 '0$1'\n\tIntCmp $2 9 0 0 +2\n\tStrCpy $2 '0$2'\n\tIntCmp $6 9 0 0 +2\n\tStrCpy $6 '0$6'\n\n\tStrCmp $4 0 0 +3\n\tStrCpy $4 Sunday\n\tgoto FileFunc_GetTime_end\n\tStrCmp $4 1 0 +3\n\tStrCpy $4 Monday\n\tgoto FileFunc_GetTime_end\n\tStrCmp $4 2 0 +3\n\tStrCpy $4 Tuesday\n\tgoto FileFunc_GetTime_end\n\tStrCmp $4 3 0 +3\n\tStrCpy $4 Wednesday\n\tgoto FileFunc_GetTime_end\n\tStrCmp $4 4 0 +3\n\tStrCpy $4 Thursday\n\tgoto FileFunc_GetTime_end\n\tStrCmp $4 5 0 +3\n\tStrCpy $4 Friday\n\tgoto FileFunc_GetTime_end\n\tStrCmp $4 6 0 FileFunc_GetTime_error\n\tStrCpy $4 Saturday\n\tgoto FileFunc_GetTime_end\n\n\tFileFunc_GetTime_error:\n\tSetErrors\n\tStrCpy $0 ''\n\tStrCpy $1 ''\n\tStrCpy $2 ''\n\tStrCpy $3 ''\n\tStrCpy $4 ''\n\tStrCpy $5 ''\n\tStrCpy $6 ''\n\n\tFileFunc_GetTime_end:\n\tPop $7\n\tExch $6\n\tExch\n\tExch $5\n\tExch 2\n\tExch $4\n\tExch 3\n\tExch $3\n\tExch 4\n\tExch $2\n\tExch 5\n\tExch $1\n\tExch 6\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define GetFileAttributes `!insertmacro GetFileAttributesCall`\n!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`\n\n!macro GetFileAttributes\n!macroend\n\n!macro un.GetFileAttributes\n!macroend\n\n!macro GetFileAttributes_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\n\tSystem::Call 'kernel32::GetFileAttributes(t r0)i .r2'\n\tStrCmp $2 -1 FileFunc_GetFileAttributes_error\n\tStrCpy $3 ''\n\n\tIntOp $0 $2 & 0x4000\n\tIntCmp $0 0 +2\n\tStrCpy $3 'ENCRYPTED|'\n\n\tIntOp $0 $2 & 0x2000\n\tIntCmp $0 0 +2\n\tStrCpy $3 'NOT_CONTENT_INDEXED|$3'\n\n\tIntOp $0 $2 & 0x1000\n\tIntCmp $0 0 +2\n\tStrCpy $3 'OFFLINE|$3'\n\n\tIntOp $0 $2 & 0x0800\n\tIntCmp $0 0 +2\n\tStrCpy $3 'COMPRESSED|$3'\n\n\tIntOp $0 $2 & 0x0400\n\tIntCmp $0 0 +2\n\tStrCpy $3 'REPARSE_POINT|$3'\n\n\tIntOp $0 $2 & 0x0200\n\tIntCmp $0 0 +2\n\tStrCpy $3 'SPARSE_FILE|$3'\n\n\tIntOp $0 $2 & 0x0100\n\tIntCmp $0 0 +2\n\tStrCpy $3 'TEMPORARY|$3'\n\n\tIntOp $0 $2 & 0x0080\n\tIntCmp $0 0 +2\n\tStrCpy $3 'NORMAL|$3'\n\n\tIntOp $0 $2 & 0x0040\n\tIntCmp $0 0 +2\n\tStrCpy $3 'DEVICE|$3'\n\n\tIntOp $0 $2 & 0x0020\n\tIntCmp $0 0 +2\n\tStrCpy $3 'ARCHIVE|$3'\n\n\tIntOp $0 $2 & 0x0010\n\tIntCmp $0 0 +2\n\tStrCpy $3 'DIRECTORY|$3'\n\n\tIntOp $0 $2 & 0x0004\n\tIntCmp $0 0 +2\n\tStrCpy $3 'SYSTEM|$3'\n\n\tIntOp $0 $2 & 0x0002\n\tIntCmp $0 0 +2\n\tStrCpy $3 'HIDDEN|$3'\n\n\tIntOp $0 $2 & 0x0001\n\tIntCmp $0 0 +2\n\tStrCpy $3 'READONLY|$3'\n\n\tStrCpy $0 $3 -1\n\tStrCmp $1 '' FileFunc_GetFileAttributes_end\n\tStrCmp $1 'ALL' FileFunc_GetFileAttributes_end\n\n\tFileFunc_GetFileAttributes_attrcmp:\n\tStrCpy $5 0\n\tIntOp $5 $5 + 1\n\tStrCpy $4 $1 1 $5\n\tStrCmp $4 '' +2\n\tStrCmp $4 '|'  0 -3\n\tStrCpy $2 $1 $5\n\tIntOp $5 $5 + 1\n\tStrCpy $1 $1 '' $5\n\tStrLen $3 $2\n\tStrCpy $5 -1\n\tIntOp $5 $5 + 1\n\tStrCpy $4 $0 $3 $5\n\tStrCmp $4 '' FileFunc_GetFileAttributes_notfound\n\tStrCmp $4 $2 0 -3\n\tStrCmp $1 '' 0 FileFunc_GetFileAttributes_attrcmp\n\tStrCpy $0 1\n\tgoto FileFunc_GetFileAttributes_end\n\n\tFileFunc_GetFileAttributes_notfound:\n\tStrCpy $0 0\n\tgoto FileFunc_GetFileAttributes_end\n\n\tFileFunc_GetFileAttributes_error:\n\tSetErrors\n\tStrCpy $0 ''\n\n\tFileFunc_GetFileAttributes_end:\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tExch $0\n\t\t\n\t!verbose pop\n!macroend\n\n!define GetFileVersion `!insertmacro GetFileVersionCall`\n!define un.GetFileVersion `!insertmacro GetFileVersionCall`\n\n!macro GetFileVersion\n!macroend\n\n!macro un.GetFileVersion\n!macroend\n\n!macro GetFileVersion_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tExch $0\n\tPush $1\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tClearErrors\n\n\tGetDllVersion '$0' $1 $2\n\tIfErrors FileFunc_GetFileVersion_error\n\tIntOp $3 $1 >> 16\n\tIntOp $3 $3 & 0x0000FFFF\n\tIntOp $4 $1 & 0x0000FFFF\n\tIntOp $5 $2 >> 16\n\tIntOp $5 $5 & 0x0000FFFF\n\tIntOp $6 $2 & 0x0000FFFF\n\tStrCpy $0 '$3.$4.$5.$6'\n\tgoto FileFunc_GetFileVersion_end\n\n\tFileFunc_GetFileVersion_error:\n\tSetErrors\n\tStrCpy $0 ''\n\n\tFileFunc_GetFileVersion_end:\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define GetExeName `!insertmacro GetExeNameCall`\n!define un.GetExeName `!insertmacro GetExeNameCall`\n\n!macro GetExeName\n!macroend\n\n!macro un.GetExeName\n!macroend\n\n!macro GetExeName_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tPush $0\n\tPush $1\n\tPush $2\n\tSystem::Call 'kernel32::GetModuleFileNameA(i 0, t .r0, i 1024)'\n\tSystem::Call 'kernel32::GetLongPathNameA(t r0, t .r1, i 1024)i .r2'\n\tStrCmp $2 error +2\n\tStrCpy $0 $1\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define GetExePath `!insertmacro GetExePathCall`\n!define un.GetExePath `!insertmacro GetExePathCall`\n\n!macro GetExePath\n!macroend\n\n!macro un.GetExePath\n!macroend\n\n!macro GetExePath_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tPush $0\n\tPush $1\n\tPush $2\n\tStrCpy $0 $EXEDIR\n\tSystem::Call 'kernel32::GetLongPathNameA(t r0, t .r1, i 1024)i .r2'\n\tStrCmp $2 error +2\n\tStrCpy $0 $1\n\tPop $2\n\tPop $1\n\tExch $0\n\t\n\t!verbose pop\n!macroend\n\n!define GetParameters `!insertmacro GetParametersCall`\n!define un.GetParameters `!insertmacro GetParametersCall`\n\n!macro GetParameters\n!macroend\n\n!macro un.GetParameters\n!macroend\n\n!macro GetParameters_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\t;cmdline-check\n\tStrCmp $CMDLINE \"\" 0 +3\n\tPush \"\"\n\tReturn\n\n\t;vars\n\tPush $0  ;tmp\n\tPush $1  ;length\n\tPush $2  ;parameter offset\n\tPush $3  ;separator\n\n\t;length/offset\n\tStrLen $1 $CMDLINE\n\tStrCpy $2 2  ;start with third character\n\n\t;separator\n\tStrCpy $3 $CMDLINE 1 ;first character\n\tStrCmp $3 '\"' +2\n\tStrCpy $3 ' '\n\n\tFileFunc_GetParameters_token:  ;finding second separator\n\tIntCmp $2 $1 FileFunc_GetParameters_strip 0 FileFunc_GetParameters_strip\n\tStrCpy $0 $CMDLINE 1 $2\n\tIntOp $2 $2 + 1\n\tStrCmp $3 $0 0 FileFunc_GetParameters_token\n\n\tFileFunc_GetParameters_strip:  ;strip white space\n\tIntCmp $2 $1 FileFunc_GetParameters_copy 0 FileFunc_GetParameters_copy\n\tStrCpy $0 $CMDLINE 1 $2\n\tStrCmp $0 ' ' 0 FileFunc_GetParameters_copy\n\tIntOp $2 $2 + 1\n\tGoto FileFunc_GetParameters_strip\n\n\tFileFunc_GetParameters_copy:\n\tStrCpy $0 $CMDLINE \"\" $2\n\n\t;strip white spaces from end\n\tFileFunc_GetParameters_rstrip:\n\tStrCpy $1 $0 1 -1\n\tStrCmp $1 ' ' 0 FileFunc_GetParameters_done\n\tStrCpy $0 $0 -1\n\tGoto FileFunc_GetParameters_rstrip\n\n\tFileFunc_GetParameters_done:\n\tPop $3\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!macro GetOptionsBody _FILEFUNC_S\n\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tClearErrors\n\n\tStrCpy $2 $1 '' 1\n\tStrCpy $1 $1 1\n\tStrLen $3 $2\n\tStrCpy $7 0\n\n\tFileFunc_GetOptions${_FILEFUNC_S}_begin:\n\tStrCpy $4 -1\n\tStrCpy $6 ''\n\n\tFileFunc_GetOptions${_FILEFUNC_S}_quote:\n\tIntOp $4 $4 + 1\n\tStrCpy $5 $0 1 $4\n\tStrCmp${_FILEFUNC_S} $5$7 '0' FileFunc_GetOptions${_FILEFUNC_S}_notfound\n\tStrCmp${_FILEFUNC_S} $5 '' FileFunc_GetOptions${_FILEFUNC_S}_trimright\n\tStrCmp${_FILEFUNC_S} $5 '\"' 0 +7\n\tStrCmp${_FILEFUNC_S} $6 '' 0 +3\n\tStrCpy $6 '\"'\n\tgoto FileFunc_GetOptions${_FILEFUNC_S}_quote\n\tStrCmp${_FILEFUNC_S} $6 '\"' 0 +3\n\tStrCpy $6 ''\n\tgoto FileFunc_GetOptions${_FILEFUNC_S}_quote\n\tStrCmp${_FILEFUNC_S} $5 `'` 0 +7\n\tStrCmp${_FILEFUNC_S} $6 `` 0 +3\n\tStrCpy $6 `'`\n\tgoto FileFunc_GetOptions${_FILEFUNC_S}_quote\n\tStrCmp${_FILEFUNC_S} $6 `'` 0 +3\n\tStrCpy $6 ``\n\tgoto FileFunc_GetOptions${_FILEFUNC_S}_quote\n\tStrCmp${_FILEFUNC_S} $5 '`' 0 +7\n\tStrCmp${_FILEFUNC_S} $6 '' 0 +3\n\tStrCpy $6 '`'\n\tgoto FileFunc_GetOptions${_FILEFUNC_S}_quote\n\tStrCmp${_FILEFUNC_S} $6 '`' 0 +3\n\tStrCpy $6 ''\n\tgoto FileFunc_GetOptions${_FILEFUNC_S}_quote\n\tStrCmp${_FILEFUNC_S} $6 '\"' FileFunc_GetOptions${_FILEFUNC_S}_quote\n\tStrCmp${_FILEFUNC_S} $6 `'` FileFunc_GetOptions${_FILEFUNC_S}_quote\n\tStrCmp${_FILEFUNC_S} $6 '`' FileFunc_GetOptions${_FILEFUNC_S}_quote\n\tStrCmp${_FILEFUNC_S} $5 $1 0 FileFunc_GetOptions${_FILEFUNC_S}_quote\n\tStrCmp${_FILEFUNC_S} $7 0 FileFunc_GetOptions${_FILEFUNC_S}_trimleft FileFunc_GetOptions${_FILEFUNC_S}_trimright\n\n\tFileFunc_GetOptions${_FILEFUNC_S}_trimleft:\n\tIntOp $4 $4 + 1\n\tStrCpy $5 $0 $3 $4\n\tStrCmp${_FILEFUNC_S} $5 '' FileFunc_GetOptions${_FILEFUNC_S}_notfound\n\tStrCmp${_FILEFUNC_S} $5 $2 0 FileFunc_GetOptions${_FILEFUNC_S}_quote\n\tIntOp $4 $4 + $3\n\tStrCpy $0 $0 '' $4\n\tStrCpy $4 $0 1\n\tStrCmp${_FILEFUNC_S} $4 ' ' 0 +3\n\tStrCpy $0 $0 '' 1\n\tgoto -3\n\tStrCpy $7 1\n\tgoto FileFunc_GetOptions${_FILEFUNC_S}_begin\n\n\tFileFunc_GetOptions${_FILEFUNC_S}_trimright:\n\tStrCpy $0 $0 $4\n\tStrCpy $4 $0 1 -1\n\tStrCmp${_FILEFUNC_S} $4 ' ' 0 +3\n\tStrCpy $0 $0 -1\n\tgoto -3\n\tStrCpy $3 $0 1\n\tStrCpy $4 $0 1 -1\n\tStrCmp${_FILEFUNC_S} $3 $4 0 FileFunc_GetOptions${_FILEFUNC_S}_end\n\tStrCmp${_FILEFUNC_S} $3 '\"' +3\n\tStrCmp${_FILEFUNC_S} $3 `'` +2\n\tStrCmp${_FILEFUNC_S} $3 '`' 0 FileFunc_GetOptions${_FILEFUNC_S}_end\n\tStrCpy $0 $0 -1 1\n\tgoto FileFunc_GetOptions${_FILEFUNC_S}_end\n\n\tFileFunc_GetOptions${_FILEFUNC_S}_notfound:\n\tSetErrors\n\tStrCpy $0 ''\n\n\tFileFunc_GetOptions${_FILEFUNC_S}_end:\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tExch $0\n\n!macroend\n\n!define GetOptions `!insertmacro GetOptionsCall`\n!define un.GetOptions `!insertmacro GetOptionsCall`\n\n!macro GetOptions\n!macroend\n\n!macro un.GetOptions\n!macroend\n\n!macro GetOptions_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\n\t!insertmacro GetOptionsBody ''\n\n\t!verbose pop\n!macroend\n\n!define GetOptionsS `!insertmacro GetOptionsSCall`\n!define un.GetOptionsS `!insertmacro GetOptionsSCall`\n\n!macro GetOptionsS\n!macroend\n\n!macro un.GetOptionsS\n!macroend\n\n!macro GetOptionsS_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\n\t!insertmacro GetOptionsBody 'S'\n\n\t!verbose pop\n!macroend\n\n!define GetRoot `!insertmacro GetRootCall`\n!define un.GetRoot `!insertmacro GetRootCall`\n\n!macro GetRoot\n!macroend\n\n!macro un.GetRoot\n!macroend\n\n!macro GetRoot_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tExch $0\n\tPush $1\n\tPush $2\n\tPush $3\n\n\tStrCpy $1 $0 2\n\tStrCmp $1 '\\\\' FileFunc_GetRoot_UNC\n\tStrCpy $2 $1 1 1\n\tStrCmp $2 ':' 0 FileFunc_GetRoot_empty\n\tStrCpy $0 $1\n\tgoto FileFunc_GetRoot_end\n\n\tFileFunc_GetRoot_UNC:\n\tStrCpy $2 1\n\tStrCpy $3 ''\n\n\tFileFunc_GetRoot_loop:\n\tIntOp $2 $2 + 1\n\tStrCpy $1 $0 1 $2\n\tStrCmp $1$3 '' FileFunc_GetRoot_empty\n\tStrCmp $1 '' +5\n\tStrCmp $1 '\\' 0 FileFunc_GetRoot_loop\n\tStrCmp $3 '1' +3\n\tStrCpy $3 '1'\n\tgoto FileFunc_GetRoot_loop\n\tStrCpy $0 $0 $2\n\tStrCpy $2 $0 1 -1\n\tStrCmp $2 '\\' 0 FileFunc_GetRoot_end\n\n\tFileFunc_GetRoot_empty:\n\tStrCpy $0 ''\n\n\tFileFunc_GetRoot_end:\n\tPop $3\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define GetParent `!insertmacro GetParentCall`\n!define un.GetParent `!insertmacro GetParentCall`\n\n!macro GetParent\n!macroend\n\n!macro un.GetParent\n!macroend\n\n!macro GetParent_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tExch $0\n\tPush $1\n\tPush $2\n\n\tStrCpy $2 $0 1 -1\n\tStrCmp $2 '\\' 0 +3\n\tStrCpy $0 $0 -1\n\tgoto -3\n\n\tStrCpy $1 0\n\tIntOp $1 $1 - 1\n\tStrCpy $2 $0 1 $1\n\tStrCmp $2 '\\' +2\n\tStrCmp $2 '' 0 -3\n\tStrCpy $0 $0 $1\n\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define GetFileName `!insertmacro GetFileNameCall`\n!define un.GetFileName `!insertmacro GetFileNameCall`\n\n!macro GetFileName\n!macroend\n\n!macro un.GetFileName\n!macroend\n\n!macro GetFileName_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tExch $0\n\tPush $1\n\tPush $2\n\n\tStrCpy $2 $0 1 -1\n\tStrCmp $2 '\\' 0 +3\n\tStrCpy $0 $0 -1\n\tgoto -3\n\n\tStrCpy $1 0\n\tIntOp $1 $1 - 1\n\tStrCpy $2 $0 1 $1\n\tStrCmp $2 '' FileFunc_GetFileName_end\n\tStrCmp $2 '\\' 0 -3\n\tIntOp $1 $1 + 1\n\tStrCpy $0 $0 '' $1\n\n\tFileFunc_GetFileName_end:\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define GetBaseName `!insertmacro GetBaseNameCall`\n!define un.GetBaseName `!insertmacro GetBaseNameCall`\n\n!macro GetBaseName\n!macroend\n\n!macro un.GetBaseName\n!macroend\n\n!macro GetBaseName_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tExch $0\n\tPush $1\n\tPush $2\n\tPush $3\n\n\tStrCpy $1 0\n\tStrCpy $3 ''\n\n\tFileFunc_GetBaseName_loop:\n\tIntOp $1 $1 - 1\n\tStrCpy $2 $0 1 $1\n\tStrCmp $2 '' FileFunc_GetBaseName_trimpath\n\tStrCmp $2 '\\' FileFunc_GetBaseName_trimpath\n\tStrCmp $3 'noext' FileFunc_GetBaseName_loop\n\tStrCmp $2 '.' 0 FileFunc_GetBaseName_loop\n\tStrCpy $0 $0 $1\n\tStrCpy $3 'noext'\n\tStrCpy $1 0\n\tgoto FileFunc_GetBaseName_loop\n\n\tFileFunc_GetBaseName_trimpath:\n\tStrCmp $1 -1 FileFunc_GetBaseName_empty\n\tIntOp $1 $1 + 1\n\tStrCpy $0 $0 '' $1\n\tgoto FileFunc_GetBaseName_end\n\n\tFileFunc_GetBaseName_empty:\n\tStrCpy $0 ''\n\n\tFileFunc_GetBaseName_end:\n\tPop $3\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define GetFileExt `!insertmacro GetFileExtCall`\n!define un.GetFileExt `!insertmacro GetFileExtCall`\n\n!macro GetFileExt\n!macroend\n\n!macro un.GetFileExt\n!macroend\n\n!macro GetFileExt_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tExch $0\n\tPush $1\n\tPush $2\n\n\tStrCpy $1 0\n\n\tFileFunc_GetFileExt_loop:\n\tIntOp $1 $1 - 1\n\tStrCpy $2 $0 1 $1\n\tStrCmp $2 '' FileFunc_GetFileExt_empty\n\tStrCmp $2 '\\' FileFunc_GetFileExt_empty\n\tStrCmp $2 '.' 0 FileFunc_GetFileExt_loop\n\n\tStrCmp $1 -1 FileFunc_GetFileExt_empty\n\tIntOp $1 $1 + 1\n\tStrCpy $0 $0 '' $1\n\tgoto FileFunc_GetFileExt_end\n\n\tFileFunc_GetFileExt_empty:\n\tStrCpy $0 ''\n\n\tFileFunc_GetFileExt_end:\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define BannerTrimPath `!insertmacro BannerTrimPathCall`\n!define un.BannerTrimPath `!insertmacro BannerTrimPathCall`\n\n!macro BannerTrimPath\n!macroend\n\n!macro un.BannerTrimPath\n!macroend\n\n!macro BannerTrimPath_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tPush $2\n\tPush $3\n\tPush $4\n\n\tStrCpy $3 $1 1 -1\n\tIntOp $1 $1 + 0\n\tStrLen $2 $0\n\tIntCmp $2 $1 FileFunc_BannerTrimPath_end FileFunc_BannerTrimPath_end\n\tIntOp $1 $1 - 3\n\tIntCmp $1 0 FileFunc_BannerTrimPath_empty FileFunc_BannerTrimPath_empty\n\tStrCmp $3 'A' FileFunc_BannerTrimPath_A-trim\n\tStrCmp $3 'B' FileFunc_BannerTrimPath_B-trim\n\tStrCmp $3 'C' FileFunc_BannerTrimPath_C-trim\n\tStrCmp $3 'D' FileFunc_BannerTrimPath_D-trim\n\n\tFileFunc_BannerTrimPath_A-trim:\n\tStrCpy $3 $0 1 1\n\tStrCpy $2 0\n\tStrCmp $3 ':' 0 +2\n\tIntOp $2 $2 + 2\n\n\tFileFunc_BannerTrimPath_loopleft:\n\tIntOp $2 $2 + 1\n\tStrCpy $3 $0 1 $2\n\tStrCmp $2 $1 FileFunc_BannerTrimPath_C-trim\n\tStrCmp $3 '\\' 0 FileFunc_BannerTrimPath_loopleft\n\tStrCpy $3 $0 $2\n\tIntOp $2 $2 - $1\n\tIntCmp $2 0 FileFunc_BannerTrimPath_B-trim 0 FileFunc_BannerTrimPath_B-trim\n\n\tFileFunc_BannerTrimPath_loopright:\n\tIntOp $2 $2 + 1\n\tStrCpy $4 $0 1 $2\n\tStrCmp $2 0 FileFunc_BannerTrimPath_B-trim\n\tStrCmp $4 '\\' 0 FileFunc_BannerTrimPath_loopright\n\tStrCpy $4 $0 '' $2\n\tStrCpy $0 '$3\\...$4'\n\tgoto FileFunc_BannerTrimPath_end\n\n\tFileFunc_BannerTrimPath_B-trim:\n\tStrCpy $2 $1\n\tIntOp $2 $2 - 1\n\tStrCmp $2 -1 FileFunc_BannerTrimPath_C-trim\n\tStrCpy $3 $0 1 $2\n\tStrCmp $3 '\\' 0 -3\n\tStrCpy $0 $0 $2\n\tStrCpy $0 '$0\\...'\n\tgoto FileFunc_BannerTrimPath_end\n\n\tFileFunc_BannerTrimPath_C-trim:\n\tStrCpy $0 $0 $1\n\tStrCpy $0 '$0...'\n\tgoto FileFunc_BannerTrimPath_end\n\n\tFileFunc_BannerTrimPath_D-trim:\n\tStrCpy $3 -1\n\tIntOp $3 $3 - 1\n\tStrCmp $3 -$2 FileFunc_BannerTrimPath_C-trim\n\tStrCpy $4 $0 1 $3\n\tStrCmp $4 '\\' 0 -3\n\tStrCpy $4 $0 '' $3\n\tIntOp $3 $1 + $3\n\tIntCmp $3 2 FileFunc_BannerTrimPath_C-trim FileFunc_BannerTrimPath_C-trim\n\tStrCpy $0 $0 $3\n\tStrCpy $0 '$0...$4'\n\tgoto FileFunc_BannerTrimPath_end\n\n\tFileFunc_BannerTrimPath_empty:\n\tStrCpy $0 ''\n\n\tFileFunc_BannerTrimPath_end:\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define DirState `!insertmacro DirStateCall`\n!define un.DirState `!insertmacro DirStateCall`\n\n!macro DirState\n!macroend\n\n!macro un.DirState\n!macroend\n\n!macro DirState_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tExch $0\n\tPush $1\n\tClearErrors\n\n\tFindFirst $1 $0 '$0\\*.*'\n\tIfErrors 0 +3\n\tStrCpy $0 -1\n\tgoto FileFunc_DirState_end\n\tStrCmp $0 '.' 0 +4\n\tFindNext $1 $0\n\tStrCmp $0 '..' 0 +2\n\tFindNext $1 $0\n\tFindClose $1\n\tIfErrors 0 +3\n\tStrCpy $0 0\n\tgoto FileFunc_DirState_end\n\tStrCpy $0 1\n\n\tFileFunc_DirState_end:\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define RefreshShellIcons `!insertmacro RefreshShellIconsCall`\n!define un.RefreshShellIcons `!insertmacro RefreshShellIconsCall`\n\n!macro RefreshShellIcons\n!macroend\n\n!macro un.RefreshShellIcons\n!macroend\n\n!macro RefreshShellIcons_\n\t!verbose push\n\t!verbose ${_FILEFUNC_VERBOSE}\n\t\n\tSystem::Call 'shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)'\n\n\t!verbose pop\n!macroend\n\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/InstallOptions.nsh",
    "content": "/*\n\nInstallOptions.nsh\nMacros and conversion functions for InstallOptions\n\n*/\n\n!ifndef ___NSIS__INSTALL_OPTIONS__NSH___\n!define ___NSIS__INSTALL_OPTIONS__NSH___\n\n!include LogicLib.nsh\n\n!macro INSTALLOPTIONS_FUNCTION_READ_CONVERT\n  !insertmacro INSTALLOPTIONS_FUNCTION_IO2NSIS \"\"\n!macroend\n\n!macro INSTALLOPTIONS_UNFUNCTION_READ_CONVERT\n  !insertmacro INSTALLOPTIONS_FUNCTION_IO2NSIS un.\n!macroend\n\n!macro INSTALLOPTIONS_FUNCTION_WRITE_CONVERT\n  !insertmacro INSTALLOPTIONS_FUNCTION_NSIS2IO \"\"\n!macroend\n\n!macro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT\n  !insertmacro INSTALLOPTIONS_FUNCTION_NSIS2IO un.\n!macroend\n\n!macro INSTALLOPTIONS_FUNCTION_NSIS2IO UNINSTALLER_FUNCPREFIX\n\n  ; Convert an NSIS string to a form suitable for use by InstallOptions\n  ; Usage:\n  ;   Push <NSIS-string>\n  ;   Call Nsis2Io\n  ;   Pop <IO-string>\n\n  Function ${UNINSTALLER_FUNCPREFIX}Nsis2Io\n\n    Exch $0 ; The source\n    Push $1 ; The output\n    Push $2 ; Temporary char\n    Push $3 ; Length\n    Push $4 ; Loop index\n    StrCpy $1 \"\" ; Initialise the output\n\n    StrLen $3 $0\n    IntOp $3 $3 - 1\n\n    ${For} $4 0 $3\n      StrCpy $2 $0 1 $4\n      ${If}     $2 == '\\'\n        StrCpy $2 '\\\\'\n      ${ElseIf} $2 == '$\\r'\n        StrCpy $2 '\\r'\n      ${ElseIf} $2 == '$\\n'\n        StrCpy $2 '\\n'\n      ${ElseIf} $2 == '$\\t'\n        StrCpy $2 '\\t'\n      ${EndIf}\n      StrCpy $1 $1$2\n    ${Next}\n\n    StrCpy $0 $1\n    Pop $4\n    Pop $3\n    Pop $2\n    Pop $1\n    Exch $0\n\n  FunctionEnd\n\n!macroend\n\n!macro INSTALLOPTIONS_FUNCTION_IO2NSIS UNINSTALLER_FUNCPREFIX\n\n  ; Convert an InstallOptions string to a form suitable for use by NSIS\n  ; Usage:\n  ;   Push <IO-string>\n  ;   Call Io2Nsis\n  ;   Pop <NSIS-string>\n\n  Function ${UNINSTALLER_FUNCPREFIX}Io2Nsis\n\n    Exch $0 ; The source\n    Push $1 ; The output\n    Push $2 ; Temporary char\n    Push $3 ; Length\n    Push $4 ; Loop index\n    StrCpy $1 \"\" ; Initialise the output\n\n    StrLen $3 $0\n    IntOp $3 $3 - 1\n\n    ${For} $4 0 $3\n      StrCpy $2 $0 2 $4\n      ${If}     $2 == '\\\\'\n        StrCpy $2 '\\'\n        IntOp $4 $4 + 1\n      ${ElseIf} $2 == '\\r'\n        StrCpy $2 '$\\r'\n        IntOp $4 $4 + 1\n      ${ElseIf} $2 == '\\n'\n        StrCpy $2 '$\\n'\n        IntOp $4 $4 + 1\n      ${ElseIf} $2 == '\\t'\n        StrCpy $2 '$\\t'\n        IntOp $4 $4 + 1\n      ${EndIf}\n      StrCpy $2 $2 1\n      StrCpy $1 $1$2\n    ${Next}\n\n    StrCpy $0 $1\n    Pop $4\n    Pop $3\n    Pop $2\n    Pop $1\n    Exch $0\n\n  FunctionEnd\n\n!macroend\n\n!macro INSTALLOPTIONS_EXTRACT FILE\n\n  InitPluginsDir\n  File \"/oname=$PLUGINSDIR\\${FILE}\" \"${FILE}\"\n  !insertmacro INSTALLOPTIONS_WRITE \"${FILE}\" \"Settings\" \"RTL\" \"$(^RTL)\"\n\n  !verbose pop\n\n!macroend\n\n!macro INSTALLOPTIONS_EXTRACT_AS FILE FILENAME\n\n  InitPluginsDir\n  File \"/oname=$PLUGINSDIR\\${FILENAME}\" \"${FILE}\"\n  !insertmacro INSTALLOPTIONS_WRITE \"${FILENAME}\" \"Settings\" \"RTL\" \"$(^RTL)\"\n\n!macroend\n\n!macro INSTALLOPTIONS_DISPLAY FILE\n\n  Push $0\n\n  InstallOptions::dialog \"$PLUGINSDIR\\${FILE}\"\n  Pop $0\n\n  Pop $0\n\n!macroend\n\n!macro INSTALLOPTIONS_DISPLAY_RETURN FILE\n\n  InstallOptions::dialog \"$PLUGINSDIR\\${FILE}\"\n\n!macroend\n\n!macro INSTALLOPTIONS_INITDIALOG FILE\n\n  InstallOptions::initDialog \"$PLUGINSDIR\\${FILE}\"\n\n!macroend\n\n!macro INSTALLOPTIONS_SHOW\n\n  Push $0\n\n  InstallOptions::show\n  Pop $0\n\n  Pop $0\n\n!macroend\n\n!macro INSTALLOPTIONS_SHOW_RETURN\n\n  InstallOptions::show\n\n!macroend\n\n!macro INSTALLOPTIONS_READ VAR FILE SECTION KEY\n\n  ReadIniStr ${VAR} \"$PLUGINSDIR\\${FILE}\" \"${SECTION}\" \"${KEY}\"\n\n!macroend\n\n!macro INSTALLOPTIONS_WRITE FILE SECTION KEY VALUE\n\n  WriteIniStr \"$PLUGINSDIR\\${FILE}\" \"${SECTION}\" \"${KEY}\" \"${VALUE}\"\n\n!macroend\n\n!macro INSTALLOPTIONS_READ_CONVERT VAR FILE SECTION KEY\n\n  ReadIniStr ${VAR} \"$PLUGINSDIR\\${FILE}\" \"${SECTION}\" \"${KEY}\"\n  Push ${VAR}\n  Call Io2Nsis\n  Pop ${VAR}\n\n!macroend\n\n!macro INSTALLOPTIONS_READ_UNCONVERT VAR FILE SECTION KEY\n\n  ReadIniStr ${VAR} \"$PLUGINSDIR\\${FILE}\" \"${SECTION}\" \"${KEY}\"\n  Push ${VAR}\n  Call un.Io2Nsis\n  Pop ${VAR}\n\n!macroend\n\n!macro INSTALLOPTIONS_WRITE_CONVERT FILE SECTION KEY VALUE\n\n  Push $0\n  StrCpy $0 \"${VALUE}\"\n  Push $0\n  Call Nsis2Io\n  Pop $0\n  \n  WriteIniStr \"$PLUGINSDIR\\${FILE}\" \"${SECTION}\" \"${KEY}\" $0\n\n  Pop $0\n\n!macroend\n  \n!macro INSTALLOPTIONS_WRITE_UNCONVERT FILE SECTION KEY VALUE\n\n  Push $0\n  StrCpy $0 \"${VALUE}\"\n  Push $0\n  Call un.Nsis2Io\n  Pop $0\n  \n  WriteIniStr \"$PLUGINSDIR\\${FILE}\" \"${SECTION}\" \"${KEY}\" $0\n\n  Pop $0\n\n!macroend\n\n!endif # ___NSIS__INSTALL_OPTIONS__NSH___\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/LangFile.nsh",
    "content": "/*\n\nLangFile.nsh\n\nHeader file to create langauge files that can be\nincluded with a single command.\n\nCopyright 2008-2009 Joost Verburg\n\n* Either LANGFILE_INCLUDE or LANGFILE_INCLUDE_WITHDEFAULT\n  can be called from the script to include a language\n  file.\n\n  - LANGFILE_INCLUDE takes the language file name as parameter.\n  - LANGFILE_INCLUDE_WITHDEFAULT takes as additional second\n    parameter the default language file to load missing strings\n    from.\n\n* A language file start with:\n  !insertmacro LANGFILE_EXT \"English\"\n  using the same name as the standard NSIS language file.\n\n* Language strings in the language file have the format:\n  ${LangFileString} LANGSTRING_NAME \"Text\"\n\n*/\n\n!ifndef LANGFILE_INCLUDED\n!define LANGFILE_INCLUDED\n\n!macro LANGFILE_INCLUDE FILENAME\n\n  ;Called from script: include a langauge file\n\n  !ifdef LangFileString\n    !undef LangFileString\n  !endif\n\n  !define LangFileString \"!insertmacro LANGFILE_SETSTRING\"\n\n  !define LANGFILE_SETNAMES\n  !include \"${FILENAME}\"\n  !undef LANGFILE_SETNAMES\n\n  ;Create language strings\n\n  !undef LangFileString\n  !define LangFileString \"!insertmacro LANGFILE_LANGSTRING\"\n  !include \"${FILENAME}\"\n\n!macroend\n\n!macro LANGFILE_INCLUDE_WITHDEFAULT FILENAME FILENAME_DEFAULT\n\n  ;Called from script: include a langauge file\n  ;Obtains missing strings from a default file\n\n  !ifdef LangFileString\n    !undef LangFileString\n  !endif\n\n  !define LangFileString \"!insertmacro LANGFILE_SETSTRING\"\n\n  !define LANGFILE_SETNAMES\n  !include \"${FILENAME}\"\n  !undef LANGFILE_SETNAMES\n\n  ;Include default language for missing strings\n  !include \"${FILENAME_DEFAULT}\"\n  \n  ;Create language strings\n  !undef LangFileString\n  !define LangFileString \"!insertmacro LANGFILE_LANGSTRING\"\n  !include \"${FILENAME_DEFAULT}\"\n\n!macroend\n\n!macro LANGFILE IDNAME NAME\n\n  ;Start of standard NSIS language file\n\n  !ifdef LANGFILE_SETNAMES\n\n    !ifdef LANGFILE_IDNAME\n      !undef LANGFILE_IDNAME\n    !endif\n\n    !define LANGFILE_IDNAME \"${IDNAME}\"\n\n    !ifndef \"LANGFILE_${IDNAME}_NAME\"\n      !define \"LANGFILE_${IDNAME}_NAME\" \"${NAME}\"\n    !endif\n\n  !endif\n\n!macroend\n\n!macro LANGFILE_EXT IDNAME\n\n  ;Start of installer language file\n  \n  !ifdef LANGFILE_SETNAMES\n\n    !ifdef LANGFILE_IDNAME\n      !undef LANGFILE_IDNAME\n    !endif\n\n    !define LANGFILE_IDNAME \"${IDNAME}\"\n\n  !endif\n\n!macroend\n\n!macro LANGFILE_SETSTRING NAME VALUE\n\n  ;Set define with translated string\n\n  !ifndef ${NAME}\n    !define \"${NAME}\" \"${VALUE}\"\n  !endif\n\n!macroend\n\n!macro LANGFILE_LANGSTRING NAME DUMMY\n\n  ;Create a language string from a define and undefine\n\n  LangString \"${NAME}\" \"${LANG_${LANGFILE_IDNAME}}\" \"${${NAME}}\"\n  !undef \"${NAME}\"\n\n!macroend\n\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/Library.nsh",
    "content": "#\n# Library.nsh\n#\n# A system for the installation and uninstallation of dynamic\n# link libraries (DLL) and type libraries (TLB). Using this\n# system you can handle the complete setup with one single\n# line of code:\n#\n#  * File copying\n#  * File copying on reboot\n#  * Version checks\n#  * Registration and unregistration\n#  * Registration and unregistration on reboot\n#  * Shared DLL counting\n#  * Windows File Protection checks\n#\n# For more information, read appendix B in the documentation.\n#\n\n!verbose push\n!verbose 3\n\n!ifndef LIB_INCLUDED\n\n!define LIB_INCLUDED\n\n!ifndef SHCNE_ASSOCCHANGED\n  !define SHCNE_ASSOCCHANGED 0x08000000\n!endif\n!ifndef SHCNF_IDLIST\n  !define SHCNF_IDLIST 0x0000\n!endif\n\n!define REGTOOL_VERSION v3\n!define REGTOOL_KEY NSIS.Library.RegTool.${REGTOOL_VERSION}\n\n!include LogicLib.nsh\n!include x64.nsh\n\n### GetParent macro, don't pass $1 or $2 as INTPUT or OUTPUT\n!macro __InstallLib_Helper_GetParent INPUT OUTPUT\n\n  # Copied from FileFunc.nsh\n\n  StrCpy ${OUTPUT} ${INPUT}\n\n  Push $1\n  Push $2\n\n  StrCpy $2 ${OUTPUT} 1 -1\n  StrCmp $2 '\\' 0 +3\n  StrCpy ${OUTPUT} ${OUTPUT} -1\n  goto -3\n\n  StrCpy $1 0\n  IntOp $1 $1 - 1\n  StrCpy $2 ${OUTPUT} 1 $1\n  StrCmp $2 '\\' +2\n  StrCmp $2 '' 0 -3\n  StrCpy ${OUTPUT} ${OUTPUT} $1\n\n  Pop $2\n  Pop $1\n\n!macroend\n\n### Initialize session id (GUID)\n!macro __InstallLib_Helper_InitSession\n\n  !ifndef __InstallLib_SessionGUID_Defined\n\n    !define __InstallLib_SessionGUID_Defined\n\n    Var /GLOBAL __INSTALLLLIB_SESSIONGUID\n\n  !endif\n\n  !define __InstallLib_Helper_InitSession_Label \"Library_${__FILE__}${__LINE__}\"\n\n  StrCmp $__INSTALLLLIB_SESSIONGUID '' 0 \"${__InstallLib_Helper_InitSession_Label}\"\n\n    System::Call 'ole32::CoCreateGuid(g .s)'\n    Pop $__INSTALLLLIB_SESSIONGUID\n\n  \"${__InstallLib_Helper_InitSession_Label}:\"\n\n  !undef __InstallLib_Helper_InitSession_Label\n\n!macroend\n\n### Add a RegTool entry to register after reboot\n!macro __InstallLib_Helper_AddRegToolEntry mode filename tempdir\n\n  Push $R0\n  Push $R1\n  Push $R2\n  Push $R3\n\n  ;------------------------\n  ;Copy the parameters\n\n  Push \"${filename}\"\n  Push \"${tempdir}\"\n\n  Pop $R2 ; temporary directory\n  Pop $R1 ; file name to register\n\n  ;------------------------\n  ;Initialize session id\n\n  !insertmacro __InstallLib_Helper_InitSession\n\n  ;------------------------\n  ;Advance counter\n\n  StrCpy $R0 0\n  ReadRegDWORD $R0 HKLM \"Software\\${REGTOOL_KEY}\\$__INSTALLLLIB_SESSIONGUID\" \"count\"\n  IntOp $R0 $R0 + 1\n  WriteRegDWORD HKLM \"Software\\${REGTOOL_KEY}\\$__INSTALLLLIB_SESSIONGUID\" \"count\" \"$R0\"\n\n  ;------------------------\n  ;Setup RegTool\n\n  ReadRegStr $R3 HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce\" \"${REGTOOL_KEY}\"\n  StrCpy $R3 $R3 -4 1\n  IfFileExists $R3 +3\n\n    File /oname=$R2\\${REGTOOL_KEY}.$__INSTALLLLIB_SESSIONGUID.exe \"${NSISDIR}\\Bin\\RegTool.bin\"\n    WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce\" \\\n      \"${REGTOOL_KEY}\" '\"$R2\\${REGTOOL_KEY}.$__INSTALLLLIB_SESSIONGUID.exe\" /S'\n\n  ;------------------------\n  ;Add RegTool entry\n\n  WriteRegStr HKLM \"Software\\${REGTOOL_KEY}\\$__INSTALLLLIB_SESSIONGUID\" \"$R0.file\" \"$R1\"\n  WriteRegStr HKLM \"Software\\${REGTOOL_KEY}\\$__INSTALLLLIB_SESSIONGUID\" \"$R0.mode\" \"${mode}\"\n\n  Pop $R3\n  Pop $R2\n  Pop $R1\n  Pop $R0\n\n!macroend\n\n### Get library version\n!macro __InstallLib_Helper_GetVersion TYPE FILE\n\n  !tempfile LIBRARY_TEMP_NSH\n\n  !ifdef NSIS_WIN32_MAKENSIS\n\n    !execute '\"${NSISDIR}\\Bin\\LibraryLocal.exe\" \"${TYPE}\" \"${FILE}\" \"${LIBRARY_TEMP_NSH}\"'\n\n  !else\n\n    !execute 'LibraryLocal \"${TYPE}\" \"${FILE}\" \"${LIBRARY_TEMP_NSH}\"'\n\n    !if ${TYPE} == 'T'\n\n      !warning \"LibraryLocal currently supports TypeLibs version detection on Windows only\"\n\n    !endif\n\n  !endif\n\n  !include \"${LIBRARY_TEMP_NSH}\"\n  !delfile \"${LIBRARY_TEMP_NSH}\"\n  !undef LIBRARY_TEMP_NSH\n\n!macroend\n\n### Install library\n!macro InstallLib libtype shared install localfile destfile tempbasedir\n\n  !verbose push\n  !verbose 3\n\n  Push $R0\n  Push $R1\n  Push $R2\n  Push $R3\n  Push $R4\n  Push $R5\n\n  ;------------------------\n  ;Define\n\n  !define INSTALLLIB_UNIQUE \"${__FILE__}${__LINE__}\"\n\n  !define INSTALLLIB_LIBTYPE_${libtype}\n  !define INSTALLLIB_LIBTYPE_SET INSTALLLIB_LIBTYPE_${libtype}\n  !define INSTALLLIB_SHARED_${shared}\n  !define INSTALLLIB_SHARED_SET INSTALLLIB_SHARED_${shared}\n  !define INSTALLLIB_INSTALL_${install}\n  !define INSTALLLIB_INSTALL_SET INSTALLLIB_INSTALL_${install}\n\n  ;------------------------\n  ;Validate\n\n  !ifndef INSTALLLIB_LIBTYPE_DLL & INSTALLLIB_LIBTYPE_REGDLL & INSTALLLIB_LIBTYPE_TLB & \\\n    INSTALLLIB_LIBTYPE_REGDLLTLB & INSTALLLIB_LIBTYPE_REGEXE\n    !error \"InstallLib: Incorrect setting for parameter: libtype\"\n  !endif\n\n  !ifndef INSTALLLIB_INSTALL_REBOOT_PROTECTED & INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED & \\\n    INSTALLLIB_INSTALL_NOREBOOT_PROTECTED & INSTALLLIB_INSTALL_NOREBOOT_NOTPROTECTED\n    !error \"InstallLib: Incorrect setting for parameter: install\"\n  !endif\n\n  ;------------------------\n  ;x64 settings\n\n  !ifdef LIBRARY_X64\n\n    ${DisableX64FSRedirection}\n\n  !endif\n\n  ;------------------------\n  ;Copy the parameters used on run-time to a variable\n  ;This allows the usage of variables as parameter\n\n  StrCpy $R4 \"${destfile}\"\n  StrCpy $R5 \"${tempbasedir}\"\n\n  ;------------------------\n  ;Shared library count\n\n  !ifndef INSTALLLIB_SHARED_NOTSHARED\n\n    StrCmp ${shared} \"\" 0 \"installlib.noshareddllincrease_${INSTALLLIB_UNIQUE}\"\n\n      !ifdef LIBRARY_X64\n\n        SetRegView 64\n\n      !endif\n\n      ReadRegDword $R0 HKLM Software\\Microsoft\\Windows\\CurrentVersion\\SharedDLLs $R4\n      ClearErrors\n      IntOp $R0 $R0 + 1\n      WriteRegDWORD HKLM Software\\Microsoft\\Windows\\CurrentVersion\\SharedDLLs $R4 $R0\n\n      !ifdef LIBRARY_X64\n\n        SetRegView lastused\n\n      !endif\n\n    \"installlib.noshareddllincrease_${INSTALLLIB_UNIQUE}:\"\n\n  !endif\n\n  ;------------------------\n  ;Check Windows File Protection\n\n  !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_NOREBOOT_PROTECTED\n\n    !define LIBRARY_DEFINE_DONE_LABEL\n\n    System::Call \"sfc::SfcIsFileProtected(i 0, w R4) i.R0\"\n\n      StrCmp $R0 \"error\" \"installlib.notprotected_${INSTALLLIB_UNIQUE}\"\n      StrCmp $R0 \"0\" \"installlib.notprotected_${INSTALLLIB_UNIQUE}\"\n\n    Goto \"installlib.done_${INSTALLLIB_UNIQUE}\"\n\n    \"installlib.notprotected_${INSTALLLIB_UNIQUE}:\"\n\n  !endif\n\n  ;------------------------\n  ;Check file\n\n  IfFileExists $R4 0 \"installlib.copy_${INSTALLLIB_UNIQUE}\"\n\n  ;------------------------\n  ;Get version information\n\n  !ifndef LIBRARY_IGNORE_VERSION\n\n    !insertmacro __InstallLib_Helper_GetVersion D \"${LOCALFILE}\"\n\n    !ifdef LIBRARY_VERSION_FILENOTFOUND\n      !error \"InstallLib: The library ${LOCALFILE} could not be found.\"\n    !endif\n\n    !ifndef LIBRARY_VERSION_NONE\n\n      !define LIBRARY_DEFINE_UPGRADE_LABEL\n      !define LIBRARY_DEFINE_REGISTER_LABEL\n\n      StrCpy $R0 ${LIBRARY_VERSION_HIGH}\n      StrCpy $R1 ${LIBRARY_VERSION_LOW}\n\n      GetDLLVersion $R4 $R2 $R3\n\n      !undef LIBRARY_VERSION_HIGH\n      !undef LIBRARY_VERSION_LOW\n\n      !ifndef INSTALLLIB_LIBTYPE_TLB & INSTALLLIB_LIBTYPE_REGDLLTLB\n\n        IntCmpU $R0 $R2 0 \"installlib.register_${INSTALLLIB_UNIQUE}\" \"installlib.upgrade_${INSTALLLIB_UNIQUE}\"\n        IntCmpU $R1 $R3 \"installlib.register_${INSTALLLIB_UNIQUE}\" \"installlib.register_${INSTALLLIB_UNIQUE}\" \\\n          \"installlib.upgrade_${INSTALLLIB_UNIQUE}\"\n\n      !else\n\n        !insertmacro __InstallLib_Helper_GetVersion T \"${LOCALFILE}\"\n\n        !ifdef LIBRARY_VERSION_FILENOTFOUND\n          !error \"InstallLib: The library ${LOCALFILE} could not be found.\"\n        !endif\n\n        !ifndef LIBRARY_VERSION_NONE\n\n          IntCmpU $R0 $R2 0 \"installlib.register_${INSTALLLIB_UNIQUE}\" \"installlib.upgrade_${INSTALLLIB_UNIQUE}\"\n          IntCmpU $R1 $R3 0 \"installlib.register_${INSTALLLIB_UNIQUE}\" \\\n            \"installlib.upgrade_${INSTALLLIB_UNIQUE}\"\n\n        !else\n\n          IntCmpU $R0 $R2 0 \"installlib.register_${INSTALLLIB_UNIQUE}\" \"installlib.upgrade_${INSTALLLIB_UNIQUE}\"\n          IntCmpU $R1 $R3 \"installlib.register_${INSTALLLIB_UNIQUE}\" \"installlib.register_${INSTALLLIB_UNIQUE}\" \\\n            \"installlib.upgrade_${INSTALLLIB_UNIQUE}\"\n\n        !endif\n\n      !endif\n\n    !else\n\n      !undef LIBRARY_VERSION_NONE\n\n      !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB\n\n        !insertmacro __InstallLib_Helper_GetVersion T \"${LOCALFILE}\"\n\n      !endif\n\n    !endif\n\n    !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB\n\n      !ifndef LIBRARY_VERSION_NONE\n\n        !ifndef LIBRARY_DEFINE_UPGRADE_LABEL\n\n          !define LIBRARY_DEFINE_UPGRADE_LABEL\n\n        !endif\n\n        !ifndef LIBRARY_DEFINE_REGISTER_LABEL\n\n          !define LIBRARY_DEFINE_REGISTER_LABEL\n\n        !endif\n\n        StrCpy $R0 ${LIBRARY_VERSION_HIGH}\n        StrCpy $R1 ${LIBRARY_VERSION_LOW}\n\n        TypeLib::GetLibVersion $R4\n        Pop $R3\n        Pop $R2\n\n        IntCmpU $R0 $R2 0 \"installlib.register_${INSTALLLIB_UNIQUE}\" \"installlib.upgrade_${INSTALLLIB_UNIQUE}\"\n        IntCmpU $R1 $R3 \"installlib.register_${INSTALLLIB_UNIQUE}\" \"installlib.register_${INSTALLLIB_UNIQUE}\" \\\n          \"installlib.upgrade_${INSTALLLIB_UNIQUE}\"\n\n        !undef LIBRARY_VERSION_HIGH\n        !undef LIBRARY_VERSION_LOW\n\n      !else\n\n        !undef LIBRARY_VERSION_NONE\n\n      !endif\n\n    !endif\n\n  !endif\n\n  ;------------------------\n  ;Upgrade\n\n  !ifdef LIBRARY_DEFINE_UPGRADE_LABEL\n\n    !undef LIBRARY_DEFINE_UPGRADE_LABEL\n\n    \"installlib.upgrade_${INSTALLLIB_UNIQUE}:\"\n\n  !endif\n\n  ;------------------------\n  ;Copy\n\n  !ifdef INSTALLLIB_INSTALL_NOREBOOT_PROTECTED | INSTALLLIB_INSTALL_NOREBOOT_NOTPROTECTED\n\n    \"installlib.copy_${INSTALLLIB_UNIQUE}:\"\n\n    StrCpy $R0 $R4\n    Call \":installlib.file_${INSTALLLIB_UNIQUE}\"\n\n  !else\n\n    !ifndef LIBRARY_DEFINE_REGISTER_LABEL\n\n      !define LIBRARY_DEFINE_REGISTER_LABEL\n\n    !endif\n\n    !ifndef LIBRARY_DEFINE_DONE_LABEL\n\n      !define LIBRARY_DEFINE_DONE_LABEL\n\n    !endif\n\n    ClearErrors\n\n    StrCpy $R0 $R4\n    Call \":installlib.file_${INSTALLLIB_UNIQUE}\"\n\n    IfErrors 0 \"installlib.register_${INSTALLLIB_UNIQUE}\"\n\n    SetOverwrite lastused\n\n    ;------------------------\n    ;Copy on reboot\n\n    GetTempFileName $R0 $R5\n    Call \":installlib.file_${INSTALLLIB_UNIQUE}\"\n    Rename /REBOOTOK $R0 $R4\n\n    ;------------------------\n    ;Register on reboot\n\n    Call \":installlib.regonreboot_${INSTALLLIB_UNIQUE}\"\n\n    Goto \"installlib.done_${INSTALLLIB_UNIQUE}\"\n\n    \"installlib.copy_${INSTALLLIB_UNIQUE}:\"\n      StrCpy $R0 $R4\n      Call \":installlib.file_${INSTALLLIB_UNIQUE}\"\n\n  !endif\n\n  ;------------------------\n  ;Register\n\n  !ifdef LIBRARY_DEFINE_REGISTER_LABEL\n\n    !undef LIBRARY_DEFINE_REGISTER_LABEL\n\n    \"installlib.register_${INSTALLLIB_UNIQUE}:\"\n\n  !endif\n\n  !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB | INSTALLLIB_LIBTYPE_REGEXE\n\n    !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED\n\n      IfRebootFlag 0 \"installlib.regnoreboot_${INSTALLLIB_UNIQUE}\"\n\n        Call \":installlib.regonreboot_${INSTALLLIB_UNIQUE}\"\n\n        Goto \"installlib.registerfinish_${INSTALLLIB_UNIQUE}\"\n\n      \"installlib.regnoreboot_${INSTALLLIB_UNIQUE}:\"\n\n    !endif\n\n    !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB\n\n      TypeLib::Register $R4\n\n    !endif\n\n    !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB\n\n      !ifndef LIBRARY_X64\n\n        RegDll $R4\n\n      !else\n\n        ExecWait '\"$SYSDIR\\regsvr32.exe\" /s \"$R4\"'\n\n      !endif\n\n    !endif\n\n    !ifdef INSTALLLIB_LIBTYPE_REGEXE\n\n      ExecWait '\"$R4\" /regserver'\n\n    !endif\n\n    !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED\n\n      \"installlib.registerfinish_${INSTALLLIB_UNIQUE}:\"\n\n    !endif\n\n  !endif\n\n  !ifdef LIBRARY_SHELL_EXTENSION\n\n    System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)'\n\n  !endif\n\n  !ifdef LIBRARY_COM\n\n    System::Call 'Ole32::CoFreeUnusedLibraries()'\n\n  !endif\n\n  ;------------------------\n  ;Done\n\n  !ifdef LIBRARY_DEFINE_DONE_LABEL\n\n    !undef LIBRARY_DEFINE_DONE_LABEL\n\n  \"installlib.done_${INSTALLLIB_UNIQUE}:\"\n\n  !endif\n\n  Pop $R5\n  Pop $R4\n  Pop $R3\n  Pop $R2\n  Pop $R1\n  Pop $R0\n\n  ;------------------------\n  ;End\n\n  Goto \"installlib.end_${INSTALLLIB_UNIQUE}\"\n\n  ;------------------------\n  ;Extract\n\n  !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED\n\n    SetOverwrite try\n\n  !else\n\n    SetOverwrite on\n\n  !endif\n\n  \"installlib.file_${INSTALLLIB_UNIQUE}:\"\n    SetFileAttributes $R0 FILE_ATTRIBUTE_NORMAL\n    ClearErrors\n    File /oname=$R0 \"${LOCALFILE}\"\n    Return\n\n  SetOverwrite lastused\n\n  ;------------------------\n  ;Register on reboot\n\n  !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED\n\n    \"installlib.regonreboot_${INSTALLLIB_UNIQUE}:\"\n\n      !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB\n        !ifndef LIBRARY_X64\n          !insertmacro __InstallLib_Helper_AddRegToolEntry 'D' \"$R4\" \"$R5\"\n        !else\n          !insertmacro __InstallLib_Helper_AddRegToolEntry 'DX' \"$R4\" \"$R5\"\n        !endif\n      !endif\n\n      !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB\n        !insertmacro __InstallLib_Helper_AddRegToolEntry 'T' \"$R4\" \"$R5\"\n      !endif\n\n      !ifdef INSTALLLIB_LIBTYPE_REGEXE\n        !insertmacro __InstallLib_Helper_AddRegToolEntry 'E' \"$R4\" \"$R5\"\n      !endif\n\n      Return\n\n  !endif\n\n  ;------------------------\n  ;End label\n\n  \"installlib.end_${INSTALLLIB_UNIQUE}:\"\n\n  !ifdef LIBRARY_X64\n\n    ${EnableX64FSRedirection}\n\n  !endif\n\n  ;------------------------\n  ;Undefine\n\n  !undef INSTALLLIB_UNIQUE\n\n  !undef ${INSTALLLIB_LIBTYPE_SET}\n  !undef INSTALLLIB_LIBTYPE_SET\n  !undef ${INSTALLLIB_SHARED_SET}\n  !undef INSTALLLIB_SHARED_SET\n  !undef ${INSTALLLIB_INSTALL_SET}\n  !undef INSTALLLIB_INSTALL_SET\n\n  !verbose pop\n\n!macroend\n\n### Uninstall library\n!macro UnInstallLib libtype shared uninstall file\n\n  !verbose push\n  !verbose 3\n\n  Push $R0\n  Push $R1\n\n  ;------------------------\n  ;Define\n\n  !define UNINSTALLLIB_UNIQUE \"${__FILE__}${__LINE__}\"\n\n  !define UNINSTALLLIB_LIBTYPE_${libtype}\n  !define UNINSTALLLIB_LIBTYPE_SET UNINSTALLLIB_LIBTYPE_${libtype}\n  !define UNINSTALLLIB_SHARED_${shared}\n  !define UNINSTALLLIB_SHARED_SET UNINSTALLLIB_SHARED_${shared}\n  !define UNINSTALLLIB_UNINSTALL_${uninstall}\n  !define UNINSTALLLIB_UNINSTALL_SET UNINSTALLLIB_UNINSTALL_${uninstall}\n\n  ;------------------------\n  ;Validate\n\n  !ifndef UNINSTALLLIB_LIBTYPE_DLL & UNINSTALLLIB_LIBTYPE_REGDLL & UNINSTALLLIB_LIBTYPE_TLB & \\\n    UNINSTALLLIB_LIBTYPE_REGDLLTLB & UNINSTALLLIB_LIBTYPE_REGEXE\n    !error \"UnInstallLib: Incorrect setting for parameter: libtype\"\n  !endif\n\n  !ifndef UNINSTALLLIB_SHARED_NOTSHARED & UNINSTALLLIB_SHARED_SHARED\n    !error \"UnInstallLib: Incorrect setting for parameter: shared\"\n  !endif\n\n  !ifndef UNINSTALLLIB_UNINSTALL_NOREMOVE & UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED & \\\n    UNINSTALLLIB_UNINSTALL_REBOOT_NOTPROTECTED & UNINSTALLLIB_UNINSTALL_NOREBOOT_PROTECTED & \\\n    UNINSTALLLIB_UNINSTALL_NOREBOOT_NOTPROTECTED\n    !error \"UnInstallLib: Incorrect setting for parameter: uninstall\"\n  !endif\n\n  ;------------------------\n  ;x64 settings\n\n  !ifdef LIBRARY_X64\n\n    ${DisableX64FSRedirection}\n\n  !endif\n\n  ;------------------------\n  ;Copy the parameters used on run-time to a variable\n  ;This allows the usage of variables as parameter\n\n  StrCpy $R1 \"${file}\"\n\n  ;------------------------\n  ;Shared library count\n\n  !ifdef UNINSTALLLIB_SHARED_SHARED\n\n    !define UNINSTALLLIB_DONE_LABEL\n\n    !ifdef LIBRARY_X64\n\n      SetRegView 64\n\n    !endif\n\n    ReadRegDword $R0 HKLM Software\\Microsoft\\Windows\\CurrentVersion\\SharedDLLs $R1\n    StrCmp $R0 \"\" \"uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}\"\n\n    IntOp $R0 $R0 - 1\n    IntCmp $R0 0 \"uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}\" \\\n      \"uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}\" \"uninstalllib.shareddllinuse_${UNINSTALLLIB_UNIQUE}\"\n\n    \"uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}:\"\n      DeleteRegValue HKLM Software\\Microsoft\\Windows\\CurrentVersion\\SharedDLLs $R1\n      !ifndef UNINSTALLLIB_SHARED_SHAREDNOREMOVE\n        Goto \"uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}\"\n      !endif\n\n    \"uninstalllib.shareddllinuse_${UNINSTALLLIB_UNIQUE}:\"\n      WriteRegDWORD HKLM Software\\Microsoft\\Windows\\CurrentVersion\\SharedDLLs $R1 $R0\n\n        !ifdef LIBRARY_X64\n\n          SetRegView lastused\n\n        !endif\n\n      Goto \"uninstalllib.done_${UNINSTALLLIB_UNIQUE}\"\n\n    \"uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}:\"\n\n    !ifdef LIBRARY_X64\n\n      SetRegView lastused\n\n    !endif\n\n  !endif\n\n  ;------------------------\n  ;Remove\n\n  !ifndef UNINSTALLLIB_UNINSTALL_NOREMOVE\n\n    ;------------------------\n    ;Check Windows File Protection\n\n    !ifdef UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED | UNINSTALLLIB_UNINSTALL_NOREBOOT_PROTECTED\n\n      !ifndef UNINSTALLLIB_DONE_LABEL\n\n        !define UNINSTALLLIB_DONE_LABEL\n\n      !endif\n\n      System::Call \"sfc::SfcIsFileProtected(i 0, w $R1) i.R0\"\n\n        StrCmp $R0 \"error\" \"uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}\"\n        StrCmp $R0 \"0\" \"uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}\"\n\n      Goto \"uninstalllib.done_${UNINSTALLLIB_UNIQUE}\"\n\n      \"uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}:\"\n\n    !endif\n\n    ;------------------------\n    ;Unregister\n\n    !ifdef UNINSTALLLIB_LIBTYPE_REGDLL | UNINSTALLLIB_LIBTYPE_REGDLLTLB\n\n      !ifndef LIBRARY_X64\n\n        UnRegDLL $R1\n\n      !else\n\n        ExecWait '\"$SYSDIR\\regsvr32.exe\" /s /u \"$R1\"'\n\n      !endif\n\n    !endif\n\n    !ifdef UNINSTALLLIB_LIBTYPE_REGEXE\n\n      ExecWait '\"$R1\" /unregserver'\n\n    !endif\n\n    !ifdef UNINSTALLLIB_LIBTYPE_TLB | UNINSTALLLIB_LIBTYPE_REGDLLTLB\n\n      TypeLib::UnRegister $R1\n\n    !endif\n\n    !ifdef LIBRARY_SHELL_EXTENSION\n\n      System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)'\n\n    !endif\n\n    !ifdef LIBRARY_COM\n\n      System::Call 'Ole32::CoFreeUnusedLibraries()'\n\n    !endif\n\n    ;------------------------\n    ;Delete\n\n    Delete $R1\n\n    !ifdef UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED | UNINSTALLLIB_UNINSTALL_REBOOT_NOTPROTECTED\n\n      ${If} ${FileExists} $R1\n        # File is in use, can't just delete.\n        # Move file to another location before using Delete /REBOOTOK. This way, if\n        #  the user installs a new version of the DLL, it won't be deleted after\n        #  reboot. See bug #1097642 for more information on this.\n\n        # Try moving to $TEMP.\n        GetTempFileName $R0\n        Delete $R0\n        Rename $R1 $R0\n\n        ${If} ${FileExists} $R1\n          # Still here, delete temporary file, in case the file was copied\n          #  and not deleted. This happens when moving from network drives,\n          #  for example.\n          Delete $R0\n\n          # Try moving to directory containing the file.\n          !insertmacro __InstallLib_Helper_GetParent $R1 $R0\n          GetTempFileName $R0 $R0\n          Delete $R0\n          Rename $R1 $R0\n\n          ${If} ${FileExists} $R1\n            # Still here, delete temporary file.\n            Delete $R0\n\n            # Give up moving, simply Delete /REBOOTOK the file.\n            StrCpy $R0 $R1\n          ${EndIf}\n        ${EndIf}\n\n        # Delete the moved file.\n        Delete /REBOOTOK $R0\n      ${EndIf}\n\n    !endif\n\n  !endif\n\n  ;------------------------\n  ;Done\n\n  !ifdef UNINSTALLLIB_DONE_LABEL\n\n    !undef UNINSTALLLIB_DONE_LABEL\n\n    \"uninstalllib.done_${UNINSTALLLIB_UNIQUE}:\"\n\n  !endif\n\n  !ifdef LIBRARY_X64\n\n    ${EnableX64FSRedirection}\n\n  !endif\n\n  Pop $R1\n  Pop $R0\n\n  ;------------------------\n  ;Undefine\n\n  !undef UNINSTALLLIB_UNIQUE\n\n  !undef ${UNINSTALLLIB_LIBTYPE_SET}\n  !undef UNINSTALLLIB_LIBTYPE_SET\n  !undef ${UNINSTALLLIB_SHARED_SET}\n  !undef UNINSTALLLIB_SHARED_SET\n  !undef ${UNINSTALLLIB_UNINSTALL_SET}\n  !undef UNINSTALLLIB_UNINSTALL_SET\n\n  !verbose pop\n\n!macroend\n\n!endif\n\n!verbose pop\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/LogicLib.nsh",
    "content": "; NSIS LOGIC LIBRARY - LogicLib.nsh\n; Version 2.6 - 08/12/2007\n; By dselkirk@hotmail.com\n; and eccles@users.sf.net\n; with IfNot support added by Message\n;\n; Questions/Comments -\n; See http://forums.winamp.com/showthread.php?s=&postid=1116241\n;\n; Description:\n;   Provides the use of various logic statements within NSIS.\n;\n; Usage:\n;   The following \"statements\" are available:\n;       If|IfNot|Unless..{ElseIf|ElseIfNot|ElseUnless}..[Else]..EndIf|EndUnless\n;         - Conditionally executes a block of statements, depending on the value\n;           of an expression. IfNot and Unless are equivalent and\n;           interchangeable, as are ElseIfNot and ElseUnless.\n;       AndIf|AndIfNot|AndUnless|OrIf|OrIfNot|OrUnless\n;         - Adds any number of extra conditions to If, IfNot, Unless, ElseIf,\n;           ElseIfNot and ElseUnless statements.\n;       IfThen|IfNotThen..|..|\n;         - Conditionally executes an inline statement, depending on the value\n;           of an expression.\n;       IfCmd..||..|\n;         - Conditionally executes an inline statement, depending on a true\n;           value of the provided NSIS function.\n;       Select..{Case[2|3|4|5]}..[CaseElse|Default]..EndSelect\n;         - Executes one of several blocks of statements, depending on the value\n;           of an expression.\n;       Switch..{Case|CaseElse|Default}..EndSwitch\n;         - Jumps to one of several labels, depending on the value of an\n;           expression.\n;       Do[While|Until]..{ExitDo|Continue|Break}..Loop[While|Until]\n;         - Repeats a block of statements until stopped, or depending on the\n;           value of an expression.\n;       While..{ExitWhile|Continue|Break}..EndWhile\n;         - An alias for DoWhile..Loop (for backwards-compatibility)\n;       For[Each]..{ExitFor|Continue|Break}..Next\n;         - Repeats a block of statements varying the value of a variable.\n;\n;   The following \"expressions\" are available:\n;       Standard (built-in) string tests (which are case-insensitive):\n;         a == b; a != b\n;       Additional case-insensitive string tests (using System.dll):\n;         a S< b; a S>= b; a S> b; a S<= b\n;       Case-sensitive string tests:\n;         a S== b; a S!= b\n;       Standard (built-in) signed integer tests:\n;         a = b; a <> b; a < b; a >= b; a > b; a <= b\n;       Standard (built-in) unsigned integer tests:\n;         a U< b; a U>= b; a U> b; a U<= b\n;       64-bit integer tests (using System.dll):\n;         a L= b; a L<> b; a L< b; a L>= b; a L> b; a L<= b\n;       Built-in NSIS flag tests:\n;         ${Abort}; ${Errors}; ${RebootFlag}; ${Silent}\n;       Built-in NSIS other tests:\n;         ${FileExists} a\n;       Any conditional NSIS instruction test:\n;         ${Cmd} a\n;       Section flag tests:\n;         ${SectionIsSelected} a; ${SectionIsSectionGroup} a;\n;         ${SectionIsSectionGroupEnd} a; ${SectionIsBold} a;\n;         ${SectionIsReadOnly} a; ${SectionIsExpanded} a;\n;         ${SectionIsPartiallySelected} a\n;\n; Examples:\n;   See LogicLib.nsi in the Examples folder for lots of example usage.\n\n!verbose push\n!verbose 3\n!ifndef LOGICLIB_VERBOSITY\n  !define LOGICLIB_VERBOSITY 3\n!endif\n!define _LOGICLIB_VERBOSITY ${LOGICLIB_VERBOSITY}\n!undef LOGICLIB_VERBOSITY\n!verbose ${_LOGICLIB_VERBOSITY}\n\n!ifndef LOGICLIB\n  !define LOGICLIB\n  !define | \"'\"\n  !define || \"' '\"\n  !define LOGICLIB_COUNTER 0\n\n  !include Sections.nsh\n\n  !macro _LOGICLIB_TEMP\n    !ifndef _LOGICLIB_TEMP\n      !define _LOGICLIB_TEMP\n      Var /GLOBAL _LOGICLIB_TEMP  ; Temporary variable to aid the more elaborate logic tests\n    !endif\n  !macroend\n\n  !macro _IncreaseCounter\n    !define _LOGICLIB_COUNTER ${LOGICLIB_COUNTER}\n    !undef LOGICLIB_COUNTER\n    !define /math LOGICLIB_COUNTER ${_LOGICLIB_COUNTER} + 1\n    !undef _LOGICLIB_COUNTER\n  !macroend\n\n  !macro _PushLogic\n    !insertmacro _PushScope Logic _LogicLib_Label_${LOGICLIB_COUNTER}\n    !insertmacro _IncreaseCounter\n  !macroend\n\n  !macro _PopLogic\n    !insertmacro _PopScope Logic\n  !macroend\n\n  !macro _PushScope Type label\n    !ifdef _${Type}                                       ; If we already have a statement\n      !define _Cur${Type} ${_${Type}}\n      !undef _${Type}\n      !define _${Type} ${label}\n      !define ${_${Type}}Prev${Type} ${_Cur${Type}}       ; Save the current logic\n      !undef _Cur${Type}\n    !else\n      !define _${Type} ${label}                           ; Initialise for first statement\n    !endif\n  !macroend\n\n  !macro _PopScope Type\n    !ifndef _${Type}\n      !error \"Cannot use _Pop${Type} without a preceding _Push${Type}\"\n    !endif\n    !ifdef ${_${Type}}Prev${Type}                         ; If a previous statment was active then restore it\n      !define _Cur${Type} ${_${Type}}\n      !undef _${Type}\n      !define _${Type} ${${_Cur${Type}}Prev${Type}}\n      !undef ${_Cur${Type}}Prev${Type}\n      !undef _Cur${Type}\n    !else\n      !undef _${Type}\n    !endif\n  !macroend\n\n  ; String tests\n  !macro _== _a _b _t _f\n    StrCmp `${_a}` `${_b}` `${_t}` `${_f}`\n  !macroend\n\n  !macro _!= _a _b _t _f\n    !insertmacro _== `${_a}` `${_b}` `${_f}` `${_t}`\n  !macroend\n\n  ; Case-sensitive string tests\n  !macro _S== _a _b _t _f\n    StrCmpS `${_a}` `${_b}` `${_t}` `${_f}`\n  !macroend\n\n  !macro _S!= _a _b _t _f\n    !insertmacro _S== `${_a}` `${_b}` `${_f}` `${_t}`\n  !macroend\n\n  ; Extra string tests (cannot do these case-sensitively - I tried and lstrcmp still ignored the case)\n  !macro _StrCmpI _a _b _e _l _m\n    !insertmacro _LOGICLIB_TEMP\n    System::Call `kernel32::lstrcmpiA(ts, ts) i.s` `${_a}` `${_b}`\n    Pop $_LOGICLIB_TEMP\n    IntCmp $_LOGICLIB_TEMP 0 `${_e}` `${_l}` `${_m}`\n  !macroend\n\n  !macro _S< _a _b _t _f\n    !insertmacro _StrCmpI `${_a}` `${_b}` `${_f}` `${_t}` `${_f}`\n  !macroend\n\n  !macro _S>= _a _b _t _f\n    !insertmacro _S< `${_a}` `${_b}` `${_f}` `${_t}`\n  !macroend\n\n  !macro _S> _a _b _t _f\n    !insertmacro _StrCmpI `${_a}` `${_b}` `${_f}` `${_f}` `${_t}`\n  !macroend\n\n  !macro _S<= _a _b _t _f\n    !insertmacro _S> `${_a}` `${_b}` `${_f}` `${_t}`\n  !macroend\n\n  ; Integer tests\n  !macro _= _a _b _t _f\n    IntCmp `${_a}` `${_b}` `${_t}` `${_f}` `${_f}`\n  !macroend\n\n  !macro _<> _a _b _t _f\n    !insertmacro _= `${_a}` `${_b}` `${_f}` `${_t}`\n  !macroend\n\n  !macro _< _a _b _t _f\n    IntCmp `${_a}` `${_b}` `${_f}` `${_t}` `${_f}`\n  !macroend\n\n  !macro _>= _a _b _t _f\n    !insertmacro _< `${_a}` `${_b}` `${_f}` `${_t}`\n  !macroend\n\n  !macro _> _a _b _t _f\n    IntCmp `${_a}` `${_b}` `${_f}` `${_f}` `${_t}`\n  !macroend\n\n  !macro _<= _a _b _t _f\n    !insertmacro _> `${_a}` `${_b}` `${_f}` `${_t}`\n  !macroend\n\n  ; Unsigned integer tests (NB: no need for extra equality tests)\n  !macro _U< _a _b _t _f\n    IntCmpU `${_a}` `${_b}` `${_f}` `${_t}` `${_f}`\n  !macroend\n\n  !macro _U>= _a _b _t _f\n    !insertmacro _U< `${_a}` `${_b}` `${_f}` `${_t}`\n  !macroend\n\n  !macro _U> _a _b _t _f\n    IntCmpU `${_a}` `${_b}` `${_f}` `${_f}` `${_t}`\n  !macroend\n\n  !macro _U<= _a _b _t _f\n    !insertmacro _U> `${_a}` `${_b}` `${_f}` `${_t}`\n  !macroend\n\n  ; Int64 tests\n  !macro _Int64Cmp _a _o _b _t _f\n    !insertmacro _LOGICLIB_TEMP\n    System::Int64Op `${_a}` `${_o}` `${_b}`\n    Pop $_LOGICLIB_TEMP\n    !insertmacro _= $_LOGICLIB_TEMP 0 `${_f}` `${_t}`\n  !macroend\n\n  !macro _L= _a _b _t _f\n    !insertmacro _Int64Cmp `${_a}` = `${_b}` `${_t}` `${_f}`\n  !macroend\n\n  !macro _L<> _a _b _t _f\n    !insertmacro _L= `${_a}` `${_b}` `${_f}` `${_t}`\n  !macroend\n\n  !macro _L< _a _b _t _f\n    !insertmacro _Int64Cmp `${_a}` < `${_b}` `${_t}` `${_f}`\n  !macroend\n\n  !macro _L>= _a _b _t _f\n    !insertmacro _L< `${_a}` `${_b}` `${_f}` `${_t}`\n  !macroend\n\n  !macro _L> _a _b _t _f\n    !insertmacro _Int64Cmp `${_a}` > `${_b}` `${_t}` `${_f}`\n  !macroend\n\n  !macro _L<= _a _b _t _f\n    !insertmacro _L> `${_a}` `${_b}` `${_f}` `${_t}`\n  !macroend\n\n  ; Flag tests\n  !macro _Abort _a _b _t _f\n    IfAbort `${_t}` `${_f}`\n  !macroend\n  !define Abort `\"\" Abort \"\"`\n\n  !macro _Errors _a _b _t _f\n    IfErrors `${_t}` `${_f}`\n  !macroend\n  !define Errors `\"\" Errors \"\"`\n\n  !macro _FileExists _a _b _t _f\n    IfFileExists `${_b}` `${_t}` `${_f}`\n  !macroend\n  !define FileExists `\"\" FileExists`\n\n  !macro _RebootFlag _a _b _t _f\n    IfRebootFlag `${_t}` `${_f}`\n  !macroend\n  !define RebootFlag `\"\" RebootFlag \"\"`\n\n  !macro _Silent _a _b _t _f\n    IfSilent `${_t}` `${_f}`\n  !macroend\n  !define Silent `\"\" Silent \"\"`\n\n  ; \"Any instruction\" test\n  !macro _Cmd _a _b _t _f\n    !define _t=${_t}\n    !ifdef _t=                                            ; If no true label then make one\n      !define __t _LogicLib_Label_${LOGICLIB_COUNTER}\n      !insertmacro _IncreaseCounter\n    !else\n      !define __t ${_t}\n    !endif\n    ${_b} ${__t}\n    !define _f=${_f}\n    !ifndef _f=                                           ; If a false label then go there\n      Goto ${_f}\n    !endif\n    !undef _f=${_f}\n    !ifdef _t=                                            ; If we made our own true label then place it\n      ${__t}:\n    !endif\n    !undef __t\n    !undef _t=${_t}\n  !macroend\n  !define Cmd `\"\" Cmd`\n\n  ; Section flag test\n  !macro _SectionFlagIsSet _a _b _t _f\n    !insertmacro _LOGICLIB_TEMP\n    SectionGetFlags `${_b}` $_LOGICLIB_TEMP\n    IntOp $_LOGICLIB_TEMP $_LOGICLIB_TEMP & `${_a}`\n    !insertmacro _= $_LOGICLIB_TEMP `${_a}` `${_t}` `${_f}`\n  !macroend\n  !define SectionIsSelected `${SF_SELECTED} SectionFlagIsSet`\n  !define SectionIsSubSection `${SF_SUBSEC} SectionFlagIsSet`\n  !define SectionIsSubSectionEnd `${SF_SUBSECEND} SectionFlagIsSet`\n  !define SectionIsSectionGroup `${SF_SECGRP} SectionFlagIsSet`\n  !define SectionIsSectionGroupEnd `${SF_SECGRPEND} SectionFlagIsSet`\n  !define SectionIsBold `${SF_BOLD} SectionFlagIsSet`\n  !define SectionIsReadOnly `${SF_RO} SectionFlagIsSet`\n  !define SectionIsExpanded `${SF_EXPAND} SectionFlagIsSet`\n  !define SectionIsPartiallySelected `${SF_PSELECTED} SectionFlagIsSet`\n\n  !define IfCmd `!insertmacro _IfThen \"\" Cmd ${|}`\n\n  !macro _If _c _a _o _b\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !insertmacro _PushLogic\n    !define ${_Logic}If\n    !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER}                    ; Get a label for the Else\n    !insertmacro _IncreaseCounter\n    !define _c=${_c}\n    !ifdef _c=true                                        ; If is true\n      !insertmacro _${_o} `${_a}` `${_b}` \"\" ${${_Logic}Else}\n    !else                                                 ; If condition is false\n      !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} \"\"\n    !endif\n    !undef _c=${_c}\n    !verbose pop\n  !macroend\n  !define If     `!insertmacro _If true`\n  !define Unless `!insertmacro _If false`\n  !define IfNot  `!insertmacro _If false`\n\n  !macro _And _c _a _o _b\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !ifndef _Logic | ${_Logic}If\n      !error \"Cannot use And without a preceding If or IfNot/Unless\"\n    !endif\n    !ifndef ${_Logic}Else\n      !error \"Cannot use And following an Else\"\n    !endif\n    !define _c=${_c}\n    !ifdef _c=true                                        ; If is true\n      !insertmacro _${_o} `${_a}` `${_b}` \"\" ${${_Logic}Else}\n    !else                                                 ; If condition is false\n      !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} \"\"\n    !endif\n    !undef _c=${_c}\n    !verbose pop\n  !macroend\n  !define AndIf     `!insertmacro _And true`\n  !define AndUnless `!insertmacro _And false`\n  !define AndIfNot  `!insertmacro _And false`\n\n  !macro _Or _c _a _o _b\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !ifndef _Logic | ${_Logic}If\n      !error \"Cannot use Or without a preceding If or IfNot/Unless\"\n    !endif\n    !ifndef ${_Logic}Else\n      !error \"Cannot use Or following an Else\"\n    !endif\n    !define _label _LogicLib_Label_${LOGICLIB_COUNTER}                           ; Skip this test as we already\n    !insertmacro _IncreaseCounter\n    Goto ${_label}                                        ; have a successful result\n    ${${_Logic}Else}:                                     ; Place the Else label\n    !undef ${_Logic}Else                                  ; and remove it\n    !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER}                    ; Get a label for the next Else and perform the new If\n    !insertmacro _IncreaseCounter\n    !define _c=${_c}\n    !ifdef _c=true                                        ; If is true\n      !insertmacro _${_o} `${_a}` `${_b}` \"\" ${${_Logic}Else}\n    !else                                                 ; If condition is false\n      !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} \"\"\n    !endif\n    !undef _c=${_c}\n    ${_label}:\n    !undef _label\n    !verbose pop\n  !macroend\n  !define OrIf     `!insertmacro _Or true`\n  !define OrUnless `!insertmacro _Or false`\n  !define OrIfNot  `!insertmacro _Or false`\n\n  !macro _Else\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !ifndef _Logic | ${_Logic}If\n      !error \"Cannot use Else without a preceding If or IfNot/Unless\"\n    !endif\n    !ifndef ${_Logic}Else\n      !error \"Cannot use Else following an Else\"\n    !endif\n    !ifndef ${_Logic}EndIf                                ; First Else for this If?\n      !define ${_Logic}EndIf _LogicLib_Label_${LOGICLIB_COUNTER}                 ; Get a label for the EndIf\n      !insertmacro _IncreaseCounter\n    !endif\n    Goto ${${_Logic}EndIf}                                ; Go to the EndIf\n    ${${_Logic}Else}:                                     ; Place the Else label\n    !undef ${_Logic}Else                                  ; and remove it\n    !verbose pop\n  !macroend\n  !define Else `!insertmacro _Else`\n\n  !macro _ElseIf _c _a _o _b\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    ${Else}                                               ; Perform the Else\n    !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER}                    ; Get a label for the next Else and perform the new If\n    !insertmacro _IncreaseCounter\n    !define _c=${_c}\n    !ifdef _c=true                                        ; If is true\n      !insertmacro _${_o} `${_a}` `${_b}` \"\" ${${_Logic}Else}\n    !else                                                 ; If condition is false\n      !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} \"\"\n    !endif\n    !undef _c=${_c}\n    !verbose pop\n  !macroend\n  !define ElseIf     `!insertmacro _ElseIf true`\n  !define ElseUnless `!insertmacro _ElseIf false`\n  !define ElseIfNot  `!insertmacro _ElseIf false`\n\n  !macro _EndIf _n\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !ifndef _Logic | ${_Logic}If\n      !error \"Cannot use End${_n} without a preceding If or IfNot/Unless\"\n    !endif\n    !ifdef ${_Logic}Else\n      ${${_Logic}Else}:                                   ; Place the Else label\n      !undef ${_Logic}Else                                ; and remove it\n    !endif\n    !ifdef ${_Logic}EndIf\n      ${${_Logic}EndIf}:                                  ; Place the EndIf\n      !undef ${_Logic}EndIf                               ; and remove it\n    !endif\n    !undef ${_Logic}If\n    !insertmacro _PopLogic\n    !verbose pop\n  !macroend\n  !define EndIf     `!insertmacro _EndIf If`\n  !define EndUnless `!insertmacro _EndIf Unless`\n\n  !macro _IfThen _a _o _b _t\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    ${If} `${_a}` `${_o}` `${_b}`\n      ${_t}\n    ${EndIf}\n    !verbose pop\n  !macroend\n  !define IfThen `!insertmacro _IfThen`\n\n  !macro _IfNotThen _a _o _b _t\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    ${IfNot} `${_a}` `${_o}` `${_b}`\n      ${_t}\n    ${EndIf}\n    !verbose pop\n  !macroend\n  !define IfNotThen `!insertmacro _IfNotThen`\n\n  !macro _ForEach _v _f _t _o _s\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    StrCpy \"${_v}\" \"${_f}\"                                ; Assign the initial value\n    Goto +2                                               ; Skip the loop expression for the first iteration\n    !define _DoLoopExpression `IntOp \"${_v}\" \"${_v}\" \"${_o}\" \"${_s}\"` ; Define the loop expression\n    !define _o=${_o}\n    !ifdef _o=+                                           ; Check the loop expression operator\n      !define __o >                                       ; to determine the correct loop condition\n    !else ifdef _o=-\n      !define __o <\n    !else\n      !error \"Unsupported ForEach step operator (must be + or -)\"\n    !endif\n    !undef _o=${_o}\n    !insertmacro _Do For false `${_v}` `${__o}` `${_t}`   ; Let Do do the rest\n    !undef __o\n    !verbose pop\n  !macroend\n  !define ForEach `!insertmacro _ForEach`\n\n  !macro _For _v _f _t\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    ${ForEach} `${_v}` `${_f}` `${_t}` + 1                ; Pass on to ForEach\n    !verbose pop\n  !macroend\n  !define For `!insertmacro _For`\n\n  !define ExitFor `!insertmacro _Goto ExitFor For`\n\n  !define Next      `!insertmacro _Loop For Next \"\" \"\" \"\" \"\"`\n\n  !define While     `!insertmacro _Do While true`\n\n  !define ExitWhile `!insertmacro _Goto ExitWhile While`\n\n  !define EndWhile  `!insertmacro _Loop While EndWhile \"\" \"\" \"\" \"\"`\n\n  !macro _Do _n _c _a _o _b\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !insertmacro _PushLogic\n    !define ${_Logic}${_n} _LogicLib_Label_${LOGICLIB_COUNTER}                   ; Get a label for the start of the loop\n    !insertmacro _IncreaseCounter\n    ${${_Logic}${_n}}:\n    !insertmacro _PushScope Exit${_n} _LogicLib_Label_${LOGICLIB_COUNTER}        ; Get a label for the end of the loop\n    !insertmacro _IncreaseCounter\n    !insertmacro _PushScope Break ${_Exit${_n}}           ; Break goes to the end of the loop\n    !ifdef _DoLoopExpression\n      ${_DoLoopExpression}                                ; Special extra parameter for inserting code\n      !undef _DoLoopExpression                            ; between the Continue label and the loop condition\n    !endif\n    !define _c=${_c}\n    !ifdef _c=                                            ; No starting condition\n      !insertmacro _PushScope Continue _LogicLib_Label_${LOGICLIB_COUNTER}       ; Get a label for Continue at the end of the loop\n      !insertmacro _IncreaseCounter\n    !else\n      !insertmacro _PushScope Continue ${${_Logic}${_n}}  ; Continue goes to the start of the loop\n      !ifdef _c=true                                      ; If is true\n        !insertmacro _${_o} `${_a}` `${_b}` \"\" ${_Exit${_n}}\n      !else                                               ; If condition is false\n        !insertmacro _${_o} `${_a}` `${_b}` ${_Exit${_n}} \"\"\n      !endif\n    !endif\n    !undef _c=${_c}\n    !define ${_Logic}Condition ${_c}                      ; Remember the condition used\n    !verbose pop\n  !macroend\n  !define Do      `!insertmacro _Do Do \"\" \"\" \"\" \"\"`\n  !define DoWhile `!insertmacro _Do Do true`\n  !define DoUntil `!insertmacro _Do Do false`\n\n  !macro _Goto _n _s\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !ifndef _${_n}\n      !error \"Cannot use ${_n} without a preceding ${_s}\"\n    !endif\n    Goto ${_${_n}}\n    !verbose pop\n  !macroend\n  !define ExitDo   `!insertmacro _Goto ExitDo Do`\n\n  !macro _Loop _n _e _c _a _o _b\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !ifndef _Logic | ${_Logic}${_n}\n      !error \"Cannot use ${_e} without a preceding ${_n}\"\n    !endif\n    !define _c=${${_Logic}Condition}\n    !ifdef _c=                                            ; If Do had no condition place the Continue label\n      ${_Continue}:\n    !endif\n    !undef _c=${${_Logic}Condition}\n    !define _c=${_c}\n    !ifdef _c=                                            ; No ending condition\n      Goto ${${_Logic}${_n}}\n    !else ifdef _c=true                                   ; If condition is true\n      !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}${_n}} ${_Exit${_n}}\n    !else                                                 ; If condition is false\n      !insertmacro _${_o} `${_a}` `${_b}` ${_Exit${_n}} ${${_Logic}${_n}}\n    !endif\n    !undef _c=${_c}\n    Goto ${_Continue}                                     ; Just to ensure it is referenced at least once\n\tGoto ${_Exit${_n}}                                    ; Just to ensure it is referenced at least once\n    ${_Exit${_n}}:                                        ; Place the loop exit point\n    !undef ${_Logic}Condition\n    !insertmacro _PopScope Continue\n    !insertmacro _PopScope Break\n    !insertmacro _PopScope Exit${_n}\n    !undef ${_Logic}${_n}\n    !insertmacro _PopLogic\n    !verbose pop\n  !macroend\n  !define Loop      `!insertmacro _Loop Do Loop \"\" \"\" \"\" \"\"`\n  !define LoopWhile `!insertmacro _Loop Do LoopWhile true`\n  !define LoopUntil `!insertmacro _Loop Do LoopUntil false`\n\n  !define Continue `!insertmacro _Goto Continue \"For or Do or While\"`\n  !define Break    `!insertmacro _Goto Break \"For or Do or While\"`\n\n  !macro _Select _a\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !insertmacro _PushLogic\n    !define ${_Logic}Select `${_a}`                       ; Remember the left hand side of the comparison\n    !verbose pop\n  !macroend\n  !define Select `!insertmacro _Select`\n\n  !macro _Select_CaseElse\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !ifndef _Logic | ${_Logic}Select\n      !error \"Cannot use Case without a preceding Select\"\n    !endif\n    !ifdef ${_Logic}EndSelect                             ; This is set only after the first case\n      !ifndef ${_Logic}Else\n        !error \"Cannot use Case following a CaseElse\"\n      !endif\n      Goto ${${_Logic}EndSelect}                          ; Go to the EndSelect\n      ${${_Logic}Else}:                                   ; Place the Else label\n      !undef ${_Logic}Else                                ; and remove it\n    !else\n      !define ${_Logic}EndSelect _LogicLib_Label_${LOGICLIB_COUNTER}             ; Get a label for the EndSelect\n      !insertmacro _IncreaseCounter\n    !endif\n    !verbose pop\n  !macroend\n  !define CaseElse `!insertmacro _CaseElse`\n  !define Case_Else `!insertmacro _CaseElse`              ; Compatibility with 2.2 and earlier\n  !define Default `!insertmacro _CaseElse`                ; For the C-minded\n\n  !macro _Select_Case _a\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    ${CaseElse}                                           ; Perform the CaseElse\n    !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER}                    ; Get a label for the next Else and perform the new Case\n    !insertmacro _IncreaseCounter\n    !insertmacro _== `${${_Logic}Select}` `${_a}` \"\" ${${_Logic}Else}\n    !verbose pop\n  !macroend\n  !define Case `!insertmacro _Case`\n\n  !macro _Case2 _a _b\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    ${CaseElse}                                           ; Perform the CaseElse\n    !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER}                    ; Get a label for the next Else and perform the new Case\n    !insertmacro _IncreaseCounter\n    !insertmacro _== `${${_Logic}Select}` `${_a}` +2 \"\"\n    !insertmacro _== `${${_Logic}Select}` `${_b}` \"\" ${${_Logic}Else}\n    !verbose pop\n  !macroend\n  !define Case2 `!insertmacro _Case2`\n\n  !macro _Case3 _a _b _c\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    ${CaseElse}                                           ; Perform the CaseElse\n    !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER}                    ; Get a label for the next Else and perform the new Case\n    !insertmacro _IncreaseCounter\n    !insertmacro _== `${${_Logic}Select}` `${_a}` +3 \"\"\n    !insertmacro _== `${${_Logic}Select}` `${_b}` +2 \"\"\n    !insertmacro _== `${${_Logic}Select}` `${_c}` \"\" ${${_Logic}Else}\n    !verbose pop\n  !macroend\n  !define Case3 `!insertmacro _Case3`\n\n  !macro _Case4 _a _b _c _d\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    ${CaseElse}                                           ; Perform the CaseElse\n    !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER}                    ; Get a label for the next Else and perform the new Case\n    !insertmacro _IncreaseCounter\n    !insertmacro _== `${${_Logic}Select}` `${_a}` +4 \"\"\n    !insertmacro _== `${${_Logic}Select}` `${_b}` +3 \"\"\n    !insertmacro _== `${${_Logic}Select}` `${_c}` +2 \"\"\n    !insertmacro _== `${${_Logic}Select}` `${_d}` \"\" ${${_Logic}Else}\n    !verbose pop\n  !macroend\n  !define Case4 `!insertmacro _Case4`\n\n  !macro _Case5 _a _b _c _d _e\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    ${CaseElse}                                           ; Perform the CaseElse\n    !define ${_Logic}Else _LogicLib_Label_${LOGICLIB_COUNTER}                    ; Get a label for the next Else and perform the new Case\n    !insertmacro _IncreaseCounter\n    !insertmacro _== `${${_Logic}Select}` `${_a}` +5 \"\"\n    !insertmacro _== `${${_Logic}Select}` `${_b}` +4 \"\"\n    !insertmacro _== `${${_Logic}Select}` `${_c}` +3 \"\"\n    !insertmacro _== `${${_Logic}Select}` `${_d}` +2 \"\"\n    !insertmacro _== `${${_Logic}Select}` `${_e}` \"\" ${${_Logic}Else}\n    !verbose pop\n  !macroend\n  !define Case5 `!insertmacro _Case5`\n\n  !macro _EndSelect\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !ifndef _Logic | ${_Logic}Select\n      !error \"Cannot use EndSelect without a preceding Select\"\n    !endif\n    !ifdef ${_Logic}Else\n      ${${_Logic}Else}:                                   ; Place the Else label\n      !undef ${_Logic}Else                                ; and remove it\n    !endif\n    !ifdef ${_Logic}EndSelect                             ; This won't be set if there weren't any cases\n      ${${_Logic}EndSelect}:                              ; Place the EndSelect\n      !undef ${_Logic}EndSelect                           ; and remove it\n    !endif\n    !undef ${_Logic}Select\n    !insertmacro _PopLogic\n    !verbose pop\n  !macroend\n  !define EndSelect `!insertmacro _EndSelect`\n\n  !macro _Switch _a\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !insertmacro _PushLogic\n    !insertmacro _PushScope Switch ${_Logic}              ; Keep a separate stack for switch data\n    !insertmacro _PushScope Break _LogicLib_Label_${LOGICLIB_COUNTER}            ; Get a lable for beyond the end of the switch\n    !insertmacro _IncreaseCounter\n    !define ${_Switch}Var `${_a}`                         ; Remember the left hand side of the comparison\n    !tempfile ${_Switch}Tmp                               ; Create a temporary file\n    !define ${_Logic}Switch _LogicLib_Label_${LOGICLIB_COUNTER}                  ; Get a label for the end of the switch\n    !insertmacro _IncreaseCounter\n    Goto ${${_Logic}Switch}                               ; and go there\n    !verbose pop\n  !macroend\n  !define Switch `!insertmacro _Switch`\n\n  !macro _Case _a\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !ifdef _Logic & ${_Logic}Select                       ; Check for an active Select\n      !insertmacro _Select_Case `${_a}`\n    !else ifndef _Switch                                  ; If not then check for an active Switch\n      !error \"Cannot use Case without a preceding Select or Switch\"\n    !else\n      !define _label _LogicLib_Label_${LOGICLIB_COUNTER}                         ; Get a label for this case,\n      !insertmacro _IncreaseCounter\n      ${_label}:                                          ; place it and add it's check to the temp file\n      !appendfile \"${${_Switch}Tmp}\" `!insertmacro _== $\\`${${_Switch}Var}$\\` $\\`${_a}$\\` ${_label} \"\"$\\n`\n      !undef _label\n    !endif\n    !verbose pop\n  !macroend\n\n  !macro _CaseElse\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !ifdef _Logic & ${_Logic}Select                       ; Check for an active Select\n      !insertmacro _Select_CaseElse\n    !else ifndef _Switch                                  ; If not then check for an active Switch\n      !error \"Cannot use Case without a preceding Select or Switch\"\n    !else ifdef ${_Switch}Else                            ; Already had a default case?\n      !error \"Cannot use CaseElse following a CaseElse\"\n    !else\n      !define ${_Switch}Else _LogicLib_Label_${LOGICLIB_COUNTER}                 ; Get a label for the default case,\n      !insertmacro _IncreaseCounter\n      ${${_Switch}Else}:                                  ; and place it\n    !endif\n    !verbose pop\n  !macroend\n\n  !macro _EndSwitch\n    !verbose push\n    !verbose ${LOGICLIB_VERBOSITY}\n    !ifndef _Logic | ${_Logic}Switch\n      !error \"Cannot use EndSwitch without a preceding Switch\"\n    !endif\n    Goto ${_Break}                                        ; Skip the jump table\n    ${${_Logic}Switch}:                                   ; Place the end of the switch\n    !undef ${_Logic}Switch\n    !include \"${${_Switch}Tmp}\"                           ; Include the jump table\n    !delfile \"${${_Switch}Tmp}\"                           ; and clear it up\n    !ifdef ${_Switch}Else                                 ; Was there a default case?\n      Goto ${${_Switch}Else}                              ; then go there if all else fails\n      !undef ${_Switch}Else\n    !endif\n    !undef ${_Switch}Tmp\n    !undef ${_Switch}Var\n    ${_Break}:                                            ; Place the break label\n    !insertmacro _PopScope Break\n    !insertmacro _PopScope Switch\n    !insertmacro _PopLogic\n    !verbose pop\n  !macroend\n  !define EndSwitch `!insertmacro _EndSwitch`\n\n!endif ; LOGICLIB\n!verbose 3\n!define LOGICLIB_VERBOSITY ${_LOGICLIB_VERBOSITY}\n!undef _LOGICLIB_VERBOSITY\n!verbose pop\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/MUI.nsh",
    "content": "!include \"${NSISDIR}\\Contrib\\Modern UI\\System.nsh\""
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/MUI2.nsh",
    "content": "!include \"${NSISDIR}\\Contrib\\Modern UI 2\\MUI2.nsh\""
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/Memento.nsh",
    "content": "!verbose push\n!verbose 3\n\n!include LogicLib.nsh\n!include Sections.nsh\n\n!ifndef ___MEMENTO_NSH___\n!define ___MEMENTO_NSH___\n\n#####################################\n### Memento                       ###\n#####################################\n\n/*\n\nMemento is a set of macros that allow installers to remember user selection\nacross separate runs of the installer. Currently, it can remember the state\nof sections and mark new sections as bold. In the future, it'll integrate\nInstallOptions and maybe even the Modern UI.\n\nA usage example can be found in `Examples\\Memento.nsi`.\n\n*/\n\n#####################################\n### Usage Instructions            ###\n#####################################\n\n/*\n\n1. Declare usage of Memento by including Memento.nsh at the top of the script.\n\n      !include Memento.nsh\n\n2. Define MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY with the a registry key\n   where sections' state should be saved.\n\n      !define MEMENTO_REGISTRY_ROOT HKLM\n      !define MEMENTO_REGISTRY_KEY \\\n                Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\MyProgram\n\n3. Replace Section with ${MementoSection} and SectionEnd with ${MementoSectionEnd}\n   for sections that whose state should be remembered by Memento.\n\n   For sections that should be unselected by default, use ${MementoSection}'s\n   brother - ${MementoUnselectedSection}.\n\n   Sections that don't already have an identifier must be assigned one.\n\n   Section identifiers must stay the same across different versions of the\n   installer or their state will be forgotten.\n\n4. Use ${MementoSectionDone} after the last ${MementoSection}.\n\n5. Add a call to ${MementoSectionRestore} to .onInit to restore the state\n   of all sections from the registry.\n\n      Function .onInit\n\n        ${MementoSectionRestore}\n\n      FunctionEnd\n\n6. Add a call to ${MementoSectionSave} to .onInstSuccess to save the state\n   of all sections to the registry.\n\n      Function .onInstSuccess\n\n        ${MementoSectionSave}\n\n      FunctionEnd\n\n7. Tattoo the location of the chosen registry key on your arm.\n\n*/\n\n#####################################\n### User API                      ###\n#####################################\n\n;\n; ${MementoSection}\n;\n;   Defines a section whose state is remembered by Memento.\n;\n;   Usage is similar to Section.\n;\n;     ${MementoSection} \"name\" \"some_id\"\n;\n\n!define MementoSection \"!insertmacro MementoSection\"\n\n;\n; ${MementoSectionEnd}\n;\n;   Ends a section previously opened using ${MementoSection}.\n;\n;   Usage is similar to SectionEnd.\n;\n;     ${MementoSection} \"name\" \"some_id\"\n;        # some code...\n;     ${MementoSectionEnd}\n;\n\n;\n; ${MementoUnselectedSection}\n;\n;   Defines a section whose state is remembered by Memento and is\n;   unselected by default.\n;\n;   Usage is similar to Section with the /o switch.\n;\n;     ${MementoUnselectedSection} \"name\" \"some_id\"\n;\n\n!define MementoUnselectedSection \"!insertmacro MementoUnselectedSection\"\n\n;\n; ${MementoSectionEnd}\n;\n;   Ends a section previously opened using ${MementoSection}.\n;\n;   Usage is similar to SectionEnd.\n;\n;     ${MementoSection} \"name\" \"some_id\"\n;        # some code...\n;     ${MementoSectionEnd}\n;\n\n!define MementoSectionEnd \"!insertmacro MementoSectionEnd\"\n\n;\n; ${MementoSectionDone}\n;\n;   Used after all ${MementoSection} have been set.\n;\n;     ${MementoSection} \"name1\" \"some_id1\"\n;        # some code...\n;     ${MementoSectionEnd}\n;\n;     ${MementoSection} \"name2\" \"some_id2\"\n;        # some code...\n;     ${MementoSectionEnd}\n;\n;     ${MementoSection} \"name3\" \"some_id3\"\n;        # some code...\n;     ${MementoSectionEnd}\n;\n;     ${MementoSectionDone}\n;\n\n!define MementoSectionDone \"!insertmacro MementoSectionDone\"\n\n;\n; ${MementoSectionRestore}\n;\n;   Restores the state of all Memento sections from the registry.\n;\n;   Commonly used in .onInit.\n;\n;     Function .onInit\n;\n;       ${MementoSectionRestore}\n;\n;     FunctionEnd\n;\n\n!define MementoSectionRestore \"!insertmacro MementoSectionRestore\"\n\n;\n; ${MementoSectionSave}\n;\n;   Saves the state of all Memento sections to the registry.\n;\n;   Commonly used in .onInstSuccess.\n;\n;     Function .onInstSuccess\n;\n;       ${MementoSectionSave}\n;\n;     FunctionEnd\n;\n\n!define MementoSectionSave \"!insertmacro MementoSectionSave\"\n\n\n#####################################\n### Internal Defines              ###\n#####################################\n\n!define __MementoSectionIndex 1\n\n#####################################\n### Internal Macros               ###\n#####################################\n\n!macro __MementoCheckSettings\n\n  !ifndef MEMENTO_REGISTRY_ROOT | MEMENTO_REGISTRY_KEY\n\n    !error \"MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY must be defined before using any of Memento's macros\"\n\n  !endif\n\n!macroend\n\n!macro __MementoSection flags name id\n\n  !insertmacro __MementoCheckSettings\n\n  !ifndef __MementoSectionIndex\n\n    !error \"MementoSectionDone already used!\"\n\n  !endif\n\n  !define __MementoSectionLastSectionId `${id}`\n\n  !verbose pop\n\n  Section ${flags} `${name}` `${id}`\n\n  !verbose push\n  !verbose 3\n\n!macroend\n\n#####################################\n### User Macros                   ###\n#####################################\n\n!macro MementoSection name id\n\n  !verbose push\n  !verbose 3\n\n  !insertmacro __MementoSection \"\" `${name}` `${id}`\n\n  !verbose pop\n\n!macroend\n\n!macro MementoUnselectedSection name id\n\n  !verbose push\n  !verbose 3\n\n  !insertmacro __MementoSection /o `${name}` `${id}`\n\n  !define __MementoSectionUnselected\n\n  !verbose pop\n\n!macroend\n\n!macro MementoSectionEnd\n\n  SectionEnd\n\n  !verbose push\n  !verbose 3\n\n  !insertmacro __MementoCheckSettings\n\n  !ifndef __MementoSectionIndex\n\n    !error \"MementoSectionDone already used!\"\n\n  !endif\n\n  !define /MATH __MementoSectionIndexNext \\\n      ${__MementoSectionIndex} + 1\n\n  Function __MementoSectionMarkNew${__MementoSectionIndex}\n\n    ClearErrors\n    ReadRegDWORD $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}`\n\n    ${If} ${Errors}\n\n      !insertmacro SetSectionFlag `${${__MementoSectionLastSectionId}}` ${SF_BOLD}\n\n    ${EndIf}\n\n    GetFunctionAddress $0 __MementoSectionMarkNew${__MementoSectionIndexNext}\n    Goto $0\n\n  FunctionEnd\n\n  Function __MementoSectionRestoreStatus${__MementoSectionIndex}\n\n    ClearErrors\n    ReadRegDWORD $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}`\n\n    !ifndef __MementoSectionUnselected\n\n      ${If} ${Errors}\n      ${OrIf} $0 != 0\n\n        !insertmacro SelectSection `${${__MementoSectionLastSectionId}}`\n\n      ${Else}\n\n        !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}`\n\n      ${EndIf}\n\n    !else\n\n      !undef __MementoSectionUnselected\n\n      ${If} ${Errors}\n      ${OrIf} $0 == 0\n\n        !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}`\n\n      ${Else}\n\n        !insertmacro SelectSection `${${__MementoSectionLastSectionId}}`\n\n      ${EndIf}\n\n    !endif\n\n    GetFunctionAddress $0 __MementoSectionRestoreStatus${__MementoSectionIndexNext}\n    Goto $0\n\n  FunctionEnd\n\n  Function __MementoSectionSaveStatus${__MementoSectionIndex}\n\n    ${If} ${SectionIsSelected} `${${__MementoSectionLastSectionId}}`\n\n      WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}` 1\n\n    ${Else}\n\n      WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}` 0\n\n    ${EndIf}\n\n    GetFunctionAddress $0 __MementoSectionSaveStatus${__MementoSectionIndexNext}\n    Goto $0\n\n  FunctionEnd\n\n  !undef __MementoSectionIndex\n  !define __MementoSectionIndex ${__MementoSectionIndexNext}\n  !undef __MementoSectionIndexNext\n\n  !undef __MementoSectionLastSectionId\n\n  !verbose pop\n\n!macroend\n\n!macro MementoSectionDone\n\n  !verbose push\n  !verbose 3\n\n  !insertmacro __MementoCheckSettings\n\n  Function __MementoSectionMarkNew${__MementoSectionIndex}\n  FunctionEnd\n\n  Function __MementoSectionRestoreStatus${__MementoSectionIndex}\n  FunctionEnd\n\n  Function __MementoSectionSaveStatus${__MementoSectionIndex}\n  FunctionEnd\n\n  !undef __MementoSectionIndex\n\n  !verbose pop\n\n!macroend\n\n!macro MementoSectionRestore\n\n  !verbose push\n  !verbose 3\n\n  !insertmacro __MementoCheckSettings\n\n  Push $0\n  Push $1\n  Push $2\n  Push $3\n\n    # check for first usage\n\n    ClearErrors\n\n    ReadRegStr $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` MementoSectionUsed\n\n    ${If} ${Errors}\n\n      # use script defaults on first run\n      Goto done\n\n    ${EndIf}\n\n    # mark new components in bold\n    \n    Call __MementoSectionMarkNew1\n\n    # mark section groups in bold\n\n    StrCpy $0 0\n    StrCpy $1 \"\"\n    StrCpy $2 \"\"\n    StrCpy $3 \"\"\n\n    loop:\n\n      ClearErrors\n\n      ${If} ${SectionIsBold} $0\n\n        ${If} $1 != \"\"\n\n          !insertmacro SetSectionFlag $1 ${SF_BOLD}\n\n        ${EndIf}\n\n        ${If} $2 != \"\"\n\n          !insertmacro SetSectionFlag $2 ${SF_BOLD}\n\n        ${EndIf}\n\n        ${If} $3 != \"\"\n\n          !insertmacro SetSectionFlag $3 ${SF_BOLD}\n\n        ${EndIf}\n\n      ${ElseIf} ${Errors}\n\n        Goto loop_end\n\n      ${EndIf}\n\n      ${If} ${SectionIsSectionGroup} $0\n\n        ${If} $1 == \"\"\n\n          StrCpy $1 $0\n\n        ${ElseIf} $2 == \"\"\n\n          StrCpy $2 $0\n\n        ${ElseIf} $3 == \"\"\n\n          StrCpy $3 $0\n\n        ${EndIf}\n\n      ${EndIf}\n\n      ${If} ${SectionIsSectionGroupEnd} $0\n\n        ${If} $3 != \"\"\n\n          StrCpy $3 \"\"\n\n        ${ElseIf} $2 != \"\"\n\n          StrCpy $2 \"\"\n\n        ${ElseIf} $1 != \"\"\n\n          StrCpy $1 \"\"\n\n        ${EndIf}\n\n      ${EndIf}\n\n      IntOp $0 $0 + 1\n\n    Goto loop\n    loop_end:\n\n    # restore sections' status\n\n    Call __MementoSectionRestoreStatus1\n\n  # all done\n\n  done:\n\n  Pop $3\n  Pop $2\n  Pop $1\n  Pop $0\n\n  !verbose pop\n\n!macroend\n\n!macro MementoSectionSave\n\n  !verbose push\n  !verbose 3\n\n  !insertmacro __MementoCheckSettings\n\n  Push $0\n\n    WriteRegStr ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` MementoSectionUsed \"\"\n  \n    Call __MementoSectionSaveStatus1\n\n  Pop $0\n\n  !verbose pop\n\n!macroend\n\n\n\n!endif # ___MEMENTO_NSH___\n\n!verbose pop\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/MultiUser.nsh",
    "content": "/*\n\nMultiUser.nsh\n\nInstaller configuration for multi-user Windows environments\n\nCopyright 2008-2009 Joost Verburg\n\n*/\n\n!ifndef MULTIUSER_INCLUDED\n!define MULTIUSER_INCLUDED\n!verbose push\n!verbose 3\n\n;Standard NSIS header files\n\n!ifdef MULTIUSER_MUI\n  !include MUI2.nsh\n!endif\n!include nsDialogs.nsh\n!include LogicLib.nsh\n!include WinVer.nsh\n!include FileFunc.nsh\n\n;Variables\n\nVar MultiUser.Privileges\nVar MultiUser.InstallMode\n\n;Command line installation mode setting\n\n!ifdef MULTIUSER_INSTALLMODE_COMMANDLINE\n  !include StrFunc.nsh\n  !ifndef StrStr_INCLUDED\n    ${StrStr}\n  !endif\n  !ifndef MULTIUSER_NOUNINSTALL\n    !ifndef UnStrStr_INCLUDED\n      ${UnStrStr}\n    !endif\n  !endif\n  \n  Var MultiUser.Parameters\n  Var MultiUser.Result\n!endif\n\n;Installation folder stored in registry\n\n!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME\n  Var MultiUser.InstDir\n!endif\n\n!ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME\n  Var MultiUser.DefaultKeyValue\n!endif\n\n;Windows Vista UAC setting\n\n!if \"${MULTIUSER_EXECUTIONLEVEL}\" == Admin\n  RequestExecutionLevel admin\n  !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS\n!else if \"${MULTIUSER_EXECUTIONLEVEL}\" == Power\n  RequestExecutionLevel admin\n  !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS\n!else if \"${MULTIUSER_EXECUTIONLEVEL}\" == Highest\n  RequestExecutionLevel highest\n  !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS\n!else\n  RequestExecutionLevel user\n!endif\n\n/*\n\nInstall modes\n\n*/\n\n!macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX\n\n  ;Install mode initialization - per-machine\n\n  ${ifnot} ${IsNT}\n    ${orif} $MultiUser.Privileges == \"Admin\"\n    ${orif} $MultiUser.Privileges == \"Power\"\n  \n    StrCpy $MultiUser.InstallMode AllUsers\n  \n    SetShellVarContext all\n  \n    !if \"${UNINSTALLER_PREFIX}\" != UN\n      ;Set default installation location for installer\n      !ifdef MULTIUSER_INSTALLMODE_INSTDIR\n        StrCpy $INSTDIR \"$PROGRAMFILES\\${MULTIUSER_INSTALLMODE_INSTDIR}\"\n      !endif\n    !endif\n  \n    !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME\n  \n      ReadRegStr $MultiUser.InstDir HKLM \"${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}\" \"${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}\"\n  \n      ${if} $MultiUser.InstDir != \"\"\n        StrCpy $INSTDIR $MultiUser.InstDir\n      ${endif}\n  \n    !endif\n  \n    !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION\n      Call \"${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}\"\n    !endif\n    \n  ${endif}\n\n!macroend\n\n!macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX\n\n  ;Install mode initialization - per-user\n  \n  ${if} ${IsNT}  \n  \n    StrCpy $MultiUser.InstallMode CurrentUser\n    \n    SetShellVarContext current\n  \n    !if \"${UNINSTALLER_PREFIX}\" != UN\n      ;Set default installation location for installer  \n      !ifdef MULTIUSER_INSTALLMODE_INSTDIR\n        ${if} ${AtLeastWin2000}\n          StrCpy $INSTDIR \"$LOCALAPPDATA\\${MULTIUSER_INSTALLMODE_INSTDIR}\"\n        ${else}\n          StrCpy $INSTDIR \"$PROGRAMFILES\\${MULTIUSER_INSTALLMODE_INSTDIR}\"\n        ${endif}\n      !endif\n    !endif\n  \n    !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME\n  \n      ReadRegStr $MultiUser.InstDir HKCU \"${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}\" \"${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}\"\n  \n      ${if} $MultiUser.InstDir != \"\"\n        StrCpy $INSTDIR $MultiUser.InstDir\n      ${endif}\n  \n    !endif\n  \n    !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION\n      Call \"${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}\"\n    !endif\n  \n  ${endif}\n\n!macroend\n\nFunction MultiUser.InstallMode.AllUsers\n  !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS \"\" \"\"\nFunctionEnd\n\nFunction MultiUser.InstallMode.CurrentUser\n  !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER \"\" \"\"\nFunctionEnd\n\n!ifndef MULTIUSER_NOUNINSTALL\n\nFunction un.MultiUser.InstallMode.AllUsers\n  !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS UN .un\nFunctionEnd\n\nFunction un.MultiUser.InstallMode.CurrentUser\n  !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER UN .un\nFunctionEnd\n\n!endif\n\n/*\n\nInstaller/uninstaller initialization\n\n*/\n\n!macro MULTIUSER_INIT_QUIT UNINSTALLER_FUNCPREFIX\n\n  !ifdef MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT\n    Call \"${MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUCTIONQUIT}\n  !else\n    Quit\n  !endif\n\n!macroend\n\n!macro MULTIUSER_INIT_TEXTS\n\n  !ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED\n    !define MULTIUSER_INIT_TEXT_ADMINREQUIRED \"$(^Caption) requires administrator priviledges.\"\n  !endif\n\n  !ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED\n    !define MULTIUSER_INIT_TEXT_POWERREQUIRED \"$(^Caption) requires at least Power User priviledges.\"\n  !endif\n\n  !ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE\n    !define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE \"Your user account does not have sufficient privileges to install $(^Name) for all users of this compuetr.\"\n  !endif\n\n!macroend\n\n!macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX\n\n  ;Installer initialization - check privileges and set install mode\n\n  !insertmacro MULTIUSER_INIT_TEXTS\n\n  UserInfo::GetAccountType\n  Pop $MultiUser.Privileges\n  \n  ${if} ${IsNT}\n  \n    ;Check privileges\n  \n    !if \"${MULTIUSER_EXECUTIONLEVEL}\" == Admin\n  \n      ${if} $MultiUser.Privileges != \"Admin\"\n        MessageBox MB_OK|MB_ICONSTOP \"${MULTIUSER_INIT_TEXT_ADMINREQUIRED}\"\n        !insertmacro MULTIUSER_INIT_QUIT \"${UNINSTALLER_FUNCPREFIX}\"\n      ${endif}\n  \n    !else if \"${MULTIUSER_EXECUTIONLEVEL}\" == Power\n  \n      ${if} $MultiUser.Privileges != \"Power\"\n        ${andif} $MultiUser.Privileges != \"Admin\"\n        ${if} ${AtMostWinXP}\n           MessageBox MB_OK|MB_ICONSTOP \"${MULTIUSER_INIT_TEXT_POWERREQUIRED}\"\n        ${else}\n           MessageBox MB_OK|MB_ICONSTOP \"${MULTIUSER_INIT_TEXT_ADMINREQUIRED}\"\n        ${endif}        \n        !insertmacro MULTIUSER_INIT_QUIT \"${UNINSTALLER_FUNCPREFIX}\"\n      ${endif}\n  \n    !endif\n    \n    !ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS\n    \n      ;Default to per-machine installation if possible\n    \n      ${if} $MultiUser.Privileges == \"Admin\"\n        ${orif} $MultiUser.Privileges == \"Power\"\n        !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER\n          Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers\n        !else\n          Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser\n        !endif\n\n        !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME\n\n          ;Set installation mode to setting from a previous installation\n\n          !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER\n            ReadRegStr $MultiUser.DefaultKeyValue HKLM \"${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}\" \"${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}\"\n            ${if} $MultiUser.DefaultKeyValue == \"\"\n              ReadRegStr $MultiUser.DefaultKeyValue HKCU \"${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}\" \"${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}\"\n              ${if} $MultiUser.DefaultKeyValue != \"\"\n                Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser\n              ${endif}\n            ${endif}\n          !else\n            ReadRegStr $MultiUser.DefaultKeyValue HKCU \"${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}\" \"${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}\"\n            ${if} $MultiUser.DefaultKeyValue == \"\"\n              ReadRegStr $MultiUser.DefaultKeyValue HKLM \"${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}\" \"${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}\"\n              ${if} $MultiUser.DefaultKeyValue != \"\"\n                Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers\n              ${endif}\n            ${endif}\n          !endif\n\n        !endif\n\n      ${else}\n        Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser\n      ${endif}\n    \n    !else\n\n      Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser\n\n    !endif  \n  \n    !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE\n    \n      ;Check for install mode setting on command line\n\n      ${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters\n  \n      ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters \"/CurrentUser\"    \n    \n      ${if} $MultiUser.Result != \"\"\n        Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser\n      ${endif}    \n  \n      ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters \"/AllUsers\"    \n    \n      ${if} $MultiUser.Result != \"\"\n        ${if} $MultiUser.Privileges == \"Admin\"\n          ${orif} $MultiUser.Privileges == \"Power\"\n          Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers\n        ${else}\n          MessageBox MB_OK|MB_ICONSTOP \"${MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE}\"\n        ${endif}\n      ${endif}\n  \n    !endif\n    \n  ${else}\n  \n    ;Not running Windows NT, per-user installation not supported\n    \n    Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers\n  \n  ${endif}\n\n!macroend\n\n!macro MULTIUSER_INIT\n  !verbose push\n  !verbose 3\n  \n  !insertmacro MULTIUSER_INIT_CHECKS \"\" \"\"\n  \n  !verbose pop \n!macroend\n\n!ifndef MULTIUSER_NOUNINSTALL\n\n!macro MULTIUSER_UNINIT\n  !verbose push\n  !verbose 3\n  \n  !insertmacro MULTIUSER_INIT_CHECKS Un un.\n  \n  !verbose pop \n!macroend\n\n!endif\n\n/*\n\nModern UI 2 page\n\n*/\n\n!ifdef MULTIUSER_MUI\n\n!macro MULTIUSER_INSTALLMODEPAGE_INTERFACE\n\n  !ifndef MULTIUSER_INSTALLMODEPAGE_INTERFACE\n    !define MULTIUSER_INSTALLMODEPAGE_INTERFACE\n    Var MultiUser.InstallModePage\n    \n    Var MultiUser.InstallModePage.Text\n    \n    Var MultiUser.InstallModePage.AllUsers\n    Var MultiUser.InstallModePage.CurrentUser\n    \n    Var MultiUser.InstallModePage.ReturnValue\n  !endif\n\n!macroend\n\n!macro MULTIUSER_PAGEDECLARATION_INSTALLMODE\n\n  !insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE \"\"\n  !insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE\n\n  !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_TOP \"$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)\"\n  !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS \"$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)\"\n  !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER \"$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)\"  \n\n  PageEx custom\n\n    PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}\n\n    Caption \" \"\n\n  PageExEnd\n\n  !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}\n\n  !undef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP\n  !undef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS\n  !undef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER\n\n!macroend\n\n!macro MULTIUSER_PAGE_INSTALLMODE\n\n  ;Modern UI page for install mode\n\n  !verbose push\n  !verbose 3\n  \n  !ifndef MULTIUSER_EXECUTIONLEVEL_ALLUSERS\n    !error \"A mixed-mode installation requires MULTIUSER_EXECUTIONLEVEL to be set to Admin, Power or Highest.\"\n  !endif\n  \n  !insertmacro MUI_PAGE_INIT\n  !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE\n  \n  !verbose pop\n\n!macroend\n\n!macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE\n\n  ;Page functions of Modern UI page\n\n  Function \"${PRE}\"\n  \n    ${ifnot} ${IsNT}\n      Abort\n    ${endif}\n  \n    ${if} $MultiUser.Privileges != \"Power\"\n      ${andif} $MultiUser.Privileges != \"Admin\"\n      Abort\n    ${endif}\n    \n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\n    !insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE)\n    \n    nsDialogs::Create 1018\n    Pop $MultiUser.InstallModePage\n\n    ${NSD_CreateLabel} 0u 0u 300u 20u \"${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}\"\n    Pop $MultiUser.InstallModePage.Text\n\n    ${NSD_CreateRadioButton} 20u 50u 280u 10u \"${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}\"\n    Pop $MultiUser.InstallModePage.AllUsers\n    \n    ${NSD_CreateRadioButton} 20u 70u 280u 10u \"${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}\"\n    Pop $MultiUser.InstallModePage.CurrentUser\n    \n    ${if} $MultiUser.InstallMode == \"AllUsers\"\n      SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0\n    ${else}\n      SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0\n    ${endif}\n    \n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\n    nsDialogs::Show\n    \n  FunctionEnd\n\n  Function \"${LEAVE}\"\n     SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue\n     \n     ${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED}\n        Call MultiUser.InstallMode.AllUsers\n     ${else}\n        Call MultiUser.InstallMode.CurrentUser\n     ${endif}\n  \n    !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\n  FunctionEnd\n\n!macroend\n\n!endif\n\n!verbose pop\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/Sections.nsh",
    "content": "; Sections.nsh\n;\n; Defines and macros for section control\n;\n; Include in your script using:\n; !include \"Sections.nsh\"\n\n;--------------------------------\n\n!ifndef SECTIONS_INCLUDED\n\n!define SECTIONS_INCLUDED\n\n;--------------------------------\n\n; Generic section defines\n\n# section or section group is selected\n!define SF_SELECTED   1\n# section group\n!define SF_SECGRP     2\n!define SF_SUBSEC     2  # deprecated\n# section group end marker\n!define SF_SECGRPEND  4\n!define SF_SUBSECEND  4  # deprecated\n# bold text (Section !blah)\n!define SF_BOLD       8\n# read only (SectionIn RO)\n!define SF_RO         16\n# expanded section group (SectionGroup /e blah)\n!define SF_EXPAND     32\n# section group is partially selected\n!define SF_PSELECTED  64  # internal\n# internal\n!define SF_TOGGLED    128 # internal\n!define SF_NAMECHG    256 # internal\n\n# mask to toggle off the selected flag\n!define SECTION_OFF   0xFFFFFFFE\n\n;--------------------------------\n\n; Select / unselect / reserve section\n\n!macro SelectSection SECTION\n\n  Push $0\n  Push $1\n    StrCpy $1 \"${SECTION}\"\n    SectionGetFlags $1 $0\n    IntOp $0 $0 | ${SF_SELECTED}\n    SectionSetFlags $1 $0\n  Pop $1\n  Pop $0\n\n!macroend\n\n!macro UnselectSection SECTION\n\n  Push $0\n  Push $1\n    StrCpy $1 \"${SECTION}\"\n    SectionGetFlags $1 $0\n    IntOp $0 $0 & ${SECTION_OFF}\n    SectionSetFlags $1 $0\n  Pop $1\n  Pop $0\n\n!macroend\n\n; If section selected, will unselect, if unselected, will select\n\n!macro ReverseSection SECTION\n\n  Push $0\n  Push $1\n    StrCpy $1 \"${SECTION}\"\n    SectionGetFlags $1 $0\n    IntOp $0 $0 ^ ${SF_SELECTED}\n    SectionSetFlags $1 $0\n  Pop $1\n  Pop $0\n\n!macroend\n\n;--------------------------------\n\n; Macros for mutually exclusive section selection\n; Written by Tim Gallagher\n;\n; See one-section.nsi for an example of usage\n\n; Starts the Radio Button Block\n; You should pass a variable that keeps the selected section\n; as the first parameter for this macro. This variable should\n; be initialized to the default section's index.\n;\n; As this macro uses $R0 and $R1 you can't use those two as the\n; varible which will keep the selected section.\n\n!macro StartRadioButtons var\n\n  !define StartRadioButtons_Var \"${var}\"\n\n  Push $R0\n  \n   SectionGetFlags \"${StartRadioButtons_Var}\" $R0\n   IntOp $R0 $R0 & ${SECTION_OFF}\n   SectionSetFlags \"${StartRadioButtons_Var}\" $R0\n   \n  Push $R1\n  \n    StrCpy $R1 \"${StartRadioButtons_Var}\"\n   \n!macroend\n\n; A radio button\n\n!macro RadioButton SECTION_NAME\n\n  SectionGetFlags ${SECTION_NAME} $R0\n  IntOp $R0 $R0 & ${SF_SELECTED}\n  IntCmp $R0 ${SF_SELECTED} 0 +2 +2\n  StrCpy \"${StartRadioButtons_Var}\" ${SECTION_NAME}\n\n!macroend\n\n; Ends the radio button block\n\n!macro EndRadioButtons\n  \n  StrCmp $R1 \"${StartRadioButtons_Var}\" 0 +4 ; selection hasn't changed\n    SectionGetFlags \"${StartRadioButtons_Var}\" $R0\n    IntOp $R0 $R0 | ${SF_SELECTED}\n    SectionSetFlags \"${StartRadioButtons_Var}\" $R0\n\n  Pop $R1\n  Pop $R0\n  \n  !undef StartRadioButtons_Var\n\n!macroend\n\n;--------------------------------\n\n; These are two macros you can use to set a Section in an InstType\n; or clear it from an InstType.\n;\n; Written by Robert Kehl\n;\n; For details, see http://nsis.sourceforge.net/wiki/SetSectionInInstType%2C_ClearSectionInInstType\n;\n; Use the defines below for the WANTED_INSTTYPE paramter.\n\n!define INSTTYPE_1 1\n!define INSTTYPE_2 2\n!define INSTTYPE_3 4\n!define INSTTYPE_4 8\n!define INSTTYPE_5 16\n!define INSTTYPE_6 32\n!define INSTTYPE_7 64\n!define INSTTYPE_8 128\n!define INSTTYPE_9 256\n!define INSTTYPE_10 512\n!define INSTTYPE_11 1024\n!define INSTTYPE_12 2048\n!define INSTTYPE_13 4096\n!define INSTTYPE_14 8192\n!define INSTTYPE_15 16384\n!define INSTTYPE_16 32768\n!define INSTTYPE_17 65536\n!define INSTTYPE_18 131072\n!define INSTTYPE_19 262144\n!define INSTTYPE_20 524288\n!define INSTTYPE_21 1048576\n!define INSTTYPE_22 2097152\n!define INSTTYPE_23 4194304\n!define INSTTYPE_24 8388608\n!define INSTTYPE_25 16777216\n!define INSTTYPE_26 33554432\n!define INSTTYPE_27 67108864\n!define INSTTYPE_28 134217728\n!define INSTTYPE_29 268435456\n!define INSTTYPE_30 536870912\n!define INSTTYPE_31 1073741824\n!define INSTTYPE_32 2147483648\n\n!macro SetSectionInInstType SECTION_NAME WANTED_INSTTYPE\n\n  Push $0\n  Push $1\n    StrCpy $1 \"${SECTION_NAME}\"\n    SectionGetInstTypes $1 $0\n    IntOp $0 $0 | ${WANTED_INSTTYPE}\n    SectionSetInstTypes $1 $0\n  Pop $1\n  Pop $0\n\n!macroend\n\n!macro ClearSectionInInstType SECTION_NAME WANTED_INSTTYPE\n\n  Push $0\n  Push $1\n  Push $2\n    StrCpy $2 \"${SECTION_NAME}\"\n    SectionGetInstTypes $2 $0\n    StrCpy $1 ${WANTED_INSTTYPE}\n    IntOp $1 $1 ~\n    IntOp $0 $0 & $1\n    SectionSetInstTypes $2 $0\n  Pop $2\n  Pop $1\n  Pop $0\n\n!macroend\n\n;--------------------------------\n\n; Set / clear / check bits in a section's flags\n; Written by derekrprice\n\n; Set one or more bits in a sections's flags\n\n!macro SetSectionFlag SECTION BITS\n\n  Push $R0\n  Push $R1\n    StrCpy $R1 \"${SECTION}\"\n    SectionGetFlags $R1 $R0\n    IntOp $R0 $R0 | \"${BITS}\"\n    SectionSetFlags $R1 $R0\n  Pop $R1\n  Pop $R0\n \n!macroend\n\n; Clear one or more bits in section's flags\n\n!macro ClearSectionFlag SECTION BITS\n\n  Push $R0\n  Push $R1\n  Push $R2\n    StrCpy $R2 \"${SECTION}\"\n    SectionGetFlags $R2 $R0\n    IntOp $R1 \"${BITS}\" ~\n    IntOp $R0 $R0 & $R1\n    SectionSetFlags $R2 $R0\n  Pop $R2\n  Pop $R1\n  Pop $R0\n\n!macroend\n\n; Check if one or more bits in section's flags are set\n; If they are, jump to JUMPIFSET\n; If not, jump to JUMPIFNOTSET\n\n!macro SectionFlagIsSet SECTION BITS JUMPIFSET JUMPIFNOTSET\n\tPush $R0\n\tSectionGetFlags \"${SECTION}\" $R0\n\tIntOp $R0 $R0 & \"${BITS}\"\n\tIntCmp $R0 \"${BITS}\" +3\n\tPop $R0\n\tStrCmp \"\" \"${JUMPIFNOTSET}\" +3 \"${JUMPIFNOTSET}\"\n\tPop $R0\n\tGoto \"${JUMPIFSET}\"\n!macroend\n\n;--------------------------------\n\n!endif"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/StrFunc.nsh",
    "content": "/*\no-----------------------------------------------------------------------------o\n|String Functions Header File 1.09                                            |\n(-----------------------------------------------------------------------------)\n| By deguix                                     / A Header file for NSIS 2.01 |\n| <cevo_deguix@yahoo.com.br>                   -------------------------------|\n|                                                                             |\n|    This header file contains NSIS functions for string manipulation.        |\no-----------------------------------------------------------------------------o\n*/\n\n!verbose push\n!verbose 3\n!ifndef STRFUNC_VERBOSITY\n  !define STRFUNC_VERBOSITY 3\n!endif\n!define _STRFUNC_VERBOSITY ${STRFUNC_VERBOSITY}\n!undef STRFUNC_VERBOSITY\n!verbose ${_STRFUNC_VERBOSITY}\n\n!include LogicLib.nsh\n\n!ifndef STRFUNC\n\n  !define FALSE 0\n  !define TRUE 1\n\n  ;Header File Identification\n\n  !define STRFUNC `String Functions Header File`\n  !define STRFUNC_SHORT `StrFunc`\n  !define STRFUNC_CREDITS `2004 Diego Pedroso`\n\n  ;Header File Version\n\n  !define STRFUNC_VERMAJ 1\n  !define STRFUNC_VERMED 09\n ;!define STRFUNC_VERMIN 0\n ;!define STRFUNC_VERBLD 0\n\n  !define STRFUNC_VER `${STRFUNC_VERMAJ}.${STRFUNC_VERMED}`\n\n  ;Header File Init Message Prefix and Postfix\n\n  !define STRFUNC_INITMSGPRE `----------------------------------------------------------------------$\\r$\\n`\n  !define STRFUNC_INITMSGPOST `$\\r$\\n----------------------------------------------------------------------$\\r$\\n`\n\n  ;Header File Init Message\n\n  !verbose push\n  !verbose 4\n  !echo `${STRFUNC_INITMSGPRE}NSIS ${STRFUNC} ${STRFUNC_VER} - Copyright ${STRFUNC_CREDITS}${STRFUNC_INITMSGPOST}`\n  !verbose pop\n\n  ;Header File Function Init Message Prefix and Postfix\n\n  !define STRFUNC_FUNCMSGPRE ``\n  !define STRFUNC_FUNCMSGPOST ``\n  \n  ;Header File Function Macros\n\n  !macro STRFUNC_FUNCLIST_INSERT Name\n    !ifdef StrFunc_List\n      !define StrFunc_List2 `${StrFunc_List}`\n      !undef StrFunc_List\n      !define StrFunc_List `${StrFunc_List2}|${Name}`\n      !undef StrFunc_List2\n    !else\n      !define StrFunc_List `${Name}`\n    !endif\n  !macroend\n\n  !macro STRFUNC_DEFFUNC Name\n    !insertmacro STRFUNC_FUNCLIST_INSERT ${Name}\n  \n    !define `${Name}` `!insertmacro FUNCTION_STRING_${Name}`\n    !define `Un${Name}` `!insertmacro FUNCTION_STRING_Un${Name}`\n  !macroend\n  \n  !macro STRFUNC_FUNC ShortName Credits\n    !verbose push\n    !verbose 4\n\n    !ifndef `Un${ShortName}`\n      !echo `${STRFUNC_FUNCMSGPRE}$ {Un${ShortName}} - Copyright ${Credits}${STRFUNC_FUNCMSGPOST}`\n      !verbose pop\n      !define `Un${ShortName}` `!insertmacro FUNCTION_STRING_Un${ShortName}_Call`\n      !define `Un${ShortName}_INCLUDED`\n      Function `un.${ShortName}`\n    !else\n      !echo `${STRFUNC_FUNCMSGPRE}$ {${ShortName}} - Copyright ${Credits}${STRFUNC_FUNCMSGPOST}`\n      !verbose pop\n      !undef `${ShortName}`\n      !define `${ShortName}` `!insertmacro FUNCTION_STRING_${ShortName}_Call`\n      !define `${ShortName}_INCLUDED`\n      Function `${ShortName}`\n    !endif\n  !macroend\n\n  ;Function Names Startup Definition\n\n  !insertmacro STRFUNC_DEFFUNC StrCase\n  !define StrCase_List `ResultVar|String|Type`\n  !define StrCase_TypeList `Output|Text|Option  U L T S <>`\n  !macro `FUNCTION_STRING_UnStrCase`\n    !undef UnStrCase\n    !insertmacro FUNCTION_STRING_StrCase\n  !macroend\n  \n  !insertmacro STRFUNC_DEFFUNC StrClb\n  !define StrClb_List `ResultVar|String|Action`\n  !define StrClb_TypeList `Output|Text|Option  > < <>`\n  !macro `FUNCTION_STRING_UnStrClb`\n    !undef UnStrClb\n    !insertmacro FUNCTION_STRING_StrClb\n  !macroend\n\n  !insertmacro STRFUNC_DEFFUNC StrIOToNSIS\n  !define StrIOToNSIS_List `ResultVar|String`\n  !define StrIOToNSIS_TypeList `Output|Text`\n  !macro `FUNCTION_STRING_UnStrIOToNSIS`\n    !undef UnStrIOToNSIS\n    !insertmacro FUNCTION_STRING_StrIOToNSIS\n  !macroend\n\n  !insertmacro STRFUNC_DEFFUNC StrLoc\n  !define StrLoc_List `ResultVar|String|StrToSearchFor|CounterDirection`\n  !define StrLoc_TypeList `Output|Text|Text|Option > <`\n  !macro `FUNCTION_STRING_UnStrLoc`\n    !undef UnStrLoc\n    !insertmacro FUNCTION_STRING_StrLoc\n  !macroend\n\n  !insertmacro STRFUNC_DEFFUNC StrNSISToIO\n  !define StrNSISToIO_List `ResultVar|String`\n  !define StrNSISToIO_TypeList `Output|Text`\n  !macro `FUNCTION_STRING_UnStrNSISToIO`\n    !undef UnStrNSISToIO\n    !insertmacro FUNCTION_STRING_StrNSISToIO\n  !macroend\n\n  !insertmacro STRFUNC_DEFFUNC StrRep\n  !define StrRep_List `ResultVar|String|StrToReplace|ReplacementString`\n  !define StrRep_TypeList `Output|Text|Text|Text`\n  !macro `FUNCTION_STRING_UnStrRep`\n    !undef UnStrRep\n    !insertmacro FUNCTION_STRING_StrRep\n  !macroend\n\n  !insertmacro STRFUNC_DEFFUNC StrSort\n  !define StrSort_List `ResultVar|String|LeftStr|CenterStr|RightStr|IncludeLeftStr|IncludeCenterStr|IncludeRightStr`\n  !define StrSort_TypeList `Output|Text|Text|Text|Text|Option 1 0|Option 1 0|Option 1 0`\n  !macro `FUNCTION_STRING_UnStrSort`\n    !undef UnStrSort\n    !insertmacro FUNCTION_STRING_StrSort\n  !macroend\n\n  !insertmacro STRFUNC_DEFFUNC StrStr\n  !define StrStr_List `ResultVar|String|StrToSearchFor`\n  !define StrStr_TypeList `Output|Text|Text`\n  !macro `FUNCTION_STRING_UnStrStr`\n    !undef UnStrStr\n    !insertmacro FUNCTION_STRING_StrStr\n  !macroend\n\n  !insertmacro STRFUNC_DEFFUNC StrStrAdv\n  !define StrStrAdv_List `ResultVar|String|StrToSearchFor|SearchDirection|ResultStrDirection|DisplayStrToSearch|Loops|CaseSensitive`\n  !define StrStrAdv_TypeList `Output|Text|Text|Option > <|Option > <|Option 1 0|Text|Option 0 1`\n  !macro `FUNCTION_STRING_UnStrStrAdv`\n    !undef UnStrStrAdv\n    !insertmacro FUNCTION_STRING_StrStrAdv\n  !macroend\n\n  !insertmacro STRFUNC_DEFFUNC StrTok\n  !define StrTok_List `ResultVar|String|Separators|ResultPart|SkipEmptyParts`\n  !define StrTok_TypeList `Output|Text|Text|Mixed L|Option 1 0`\n  !macro `FUNCTION_STRING_UnStrTok`\n    !undef UnStrTok\n    !insertmacro FUNCTION_STRING_StrTok\n  !macroend\n\n  !insertmacro STRFUNC_DEFFUNC StrTrimNewLines\n  !define StrTrimNewLines_List `ResultVar|String`\n  !define StrTrimNewLines_TypeList `Output|Text`\n  !macro `FUNCTION_STRING_UnStrTrimNewLines`\n    !undef UnStrTrimNewLines\n    !insertmacro FUNCTION_STRING_StrTrimNewLines\n  !macroend\n\n  ;Function Codes for Install and Uninstall\n\n  # Function StrCase\n  ################\n\n  !macro FUNCTION_STRING_StrCase\n    !insertmacro STRFUNC_FUNC `StrCase` `2004 Diego Pedroso - Based on functions by Dave Laundon`\n\n    /*After this point:\n      ------------------------------------------\n       $0 = String (input)\n       $1 = Type (input)\n       $2 = StrLength (temp)\n       $3 = StartChar (temp)\n       $4 = EndChar (temp)\n       $5 = ResultStr (temp)\n       $6 = CurrentChar (temp)\n       $7 = LastChar (temp)\n       $8 = Temp (temp)*/\n\n      ;Get input from user\n      Exch $1\n      Exch\n      Exch $0\n      Exch\n      Push $2\n      Push $3\n      Push $4\n      Push $5\n      Push $6\n      Push $7\n      Push $8\n\n      ;Initialize variables\n      StrCpy $2 \"\"\n      StrCpy $3 \"\"\n      StrCpy $4 \"\"\n      StrCpy $5 \"\"\n      StrCpy $6 \"\"\n      StrCpy $7 \"\"\n      StrCpy $8 \"\"\n\n      ;Upper and lower cases are simple to use\n      ${If} $1 == \"U\"\n\n        ;Upper Case System:\n        ;------------------\n        ; Convert all characters to upper case.\n\n        System::Call \"User32::CharUpper(t r0 r5)i\"\n        Goto StrCase_End\n      ${ElseIf} $1 == \"L\"\n\n        ;Lower Case System:\n        ;------------------\n        ; Convert all characters to lower case.\n\n        System::Call \"User32::CharLower(t r0 r5)i\"\n        Goto StrCase_End\n      ${EndIf}\n\n      ;For the rest of cases:\n      ;Get \"String\" length\n      StrLen $2 $0\n\n      ;Make a loop until the end of \"String\"\n      ${For} $3 0 $2\n        ;Add 1 to \"EndChar\" counter also\n        IntOp $4 $3 + 1\n\n        # Step 1: Detect one character at a time\n\n        ;Remove characters before \"StartChar\" except when\n        ;\"StartChar\" is the first character of \"String\"\n        ${If} $3 <> 0\n          StrCpy $6 $0 `` $3\n        ${EndIf}\n\n        ;Remove characters after \"EndChar\" except when\n        ;\"EndChar\" is the last character of \"String\"\n        ${If} $4 <> $2\n          ${If} $3 = 0\n            StrCpy $6 $0 1\n          ${Else}\n            StrCpy $6 $6 1\n          ${EndIf}\n        ${EndIf}\n\n        # Step 2: Convert to the advanced case user chose:\n\n        ${If} $1 == \"T\"\n\n          ;Title Case System:\n          ;------------------\n          ; Convert all characters after a non-alphabetic character to upper case.\n          ; Else convert to lower case.\n\n          ;Use \"IsCharAlpha\" for the job\n          System::Call \"*(&t1 r7) i .r8\"\n          System::Call \"*$8(&i1 .r7)\"\n          System::Free $8\n          System::Call \"user32::IsCharAlpha(i r7) i .r8\"\n          \n          ;Verify \"IsCharAlpha\" result and convert the character\n          ${If} $8 = 0\n            System::Call \"User32::CharUpper(t r6 r6)i\"\n          ${Else}\n            System::Call \"User32::CharLower(t r6 r6)i\"\n          ${EndIf}\n        ${ElseIf} $1 == \"S\"\n\n          ;Sentence Case System:\n          ;------------------\n          ; Convert all characters after a \".\", \"!\" or \"?\" character to upper case.\n          ; Else convert to lower case. Spaces or tabs after these marks are ignored.\n\n          ;Detect current characters and ignore if necessary\n          ${If} $6 == \" \"\n          ${OrIf} $6 == \"$\\t\"\n            Goto IgnoreLetter\n          ${EndIf}\n\n          ;Detect last characters and convert\n          ${If} $7 == \".\"\n          ${OrIf} $7 == \"!\"\n          ${OrIf} $7 == \"?\"\n          ${OrIf} $7 == \"\"\n            System::Call \"User32::CharUpper(t r6 r6)i\"\n          ${Else}\n            System::Call \"User32::CharLower(t r6 r6)i\"\n          ${EndIf}\n        ${ElseIf} $1 == \"<>\"\n\n          ;Switch Case System:\n          ;------------------\n          ; Switch all characters cases to their inverse case.\n\n          ;Use \"IsCharUpper\" for the job\n          System::Call \"*(&t1 r6) i .r8\"\n          System::Call \"*$8(&i1 .r7)\"\n          System::Free $8\n          System::Call \"user32::IsCharUpper(i r7) i .r8\"\n          \n          ;Verify \"IsCharUpper\" result and convert the character\n          ${If} $8 = 0\n            System::Call \"User32::CharUpper(t r6 r6)i\"\n          ${Else}\n            System::Call \"User32::CharLower(t r6 r6)i\"\n          ${EndIf}\n        ${EndIf}\n\n        ;Write the character to \"LastChar\"\n        StrCpy $7 $6\n\n        IgnoreLetter:\n        ;Add this character to \"ResultStr\"\n        StrCpy $5 `$5$6`\n      ${Next}\n\n      StrCase_End:\n\n    /*After this point:\n      ------------------------------------------\n       $0 = OutVar (output)*/\n\n      ; Copy \"ResultStr\" to \"OutVar\"\n      StrCpy $0 $5\n\n      ;Return output to user\n      Pop $8\n      Pop $7\n      Pop $6\n      Pop $5\n      Pop $4\n      Pop $3\n      Pop $2\n      Pop $1\n      Exch $0\n    FunctionEnd\n\n  !macroend\n\n  !macro FUNCTION_STRING_StrClb\n    !insertmacro STRFUNC_FUNC `StrClb` `2004 Diego Pedroso - Based on functions by Nik Medved`\n\n    /*After this point:\n      ------------------------------------------\n       $0 = String (input)\n       $1 = Action (input)\n       $2 = Lock/Unlock (temp)\n       $3 = Temp (temp)\n       $4 = Temp2 (temp)*/\n\n      ;Get input from user\n\n      Exch $1\n      Exch\n      Exch $0\n      Exch\n      Push $2\n      Push $3\n      Push $4\n      \n      StrCpy $2 \"\"\n      StrCpy $3 \"\"\n      StrCpy $4 \"\"\n\n      ;Open the clipboard to do the operations the user chose (kichik's fix)\n      System::Call 'user32::OpenClipboard(i $HWNDPARENT)'\n\n      ${If} $1 == \">\" ;Set\n\n        ;Step 1: Clear the clipboard\n        System::Call 'user32::EmptyClipboard()'\n\n        ;Step 2: Allocate global heap\n        StrLen $2 $0\n        IntOp $2 $2 + 1\n        System::Call 'kernel32::GlobalAlloc(i 2, i r2) i.r2'\n\n        ;Step 3: Lock the handle\n        System::Call 'kernel32::GlobalLock(i r2) i.r3'\n\n        ;Step 4: Copy the text to locked clipboard buffer\n        System::Call 'kernel32::lstrcpyA(i r3, t r0)'\n\n        ;Step 5: Unlock the handle again\n        System::Call 'kernel32::GlobalUnlock(i r2)'\n\n        ;Step 6: Set the information to the clipboard\n        System::Call 'user32::SetClipboardData(i 1, i r2)'\n\n        StrCpy $0 \"\"\n\n      ${ElseIf} $1 == \"<\" ;Get\n\n        ;Step 1: Get clipboard data\n        System::Call 'user32::GetClipboardData(i 1) i .r2'\n\n        ;Step 2: Lock and copy data (kichik's fix)\n        System::Call 'kernel32::GlobalLock(i r2) t .r0'\n\n        ;Step 3: Unlock (kichik's fix)\n        System::Call 'kernel32::GlobalUnlock(i r2)'\n\n      ${ElseIf} $1 == \"<>\" ;Swap\n\n        ;Step 1: Get clipboard data\n        System::Call 'user32::GetClipboardData(i 1) i .r2'\n\n        ;Step 2: Lock and copy data (kichik's fix)\n        System::Call 'kernel32::GlobalLock(i r2) t .r4'\n\n        ;Step 3: Unlock (kichik's fix)\n        System::Call 'kernel32::GlobalUnlock(i r2)'\n\n        ;Step 4: Clear the clipboard\n        System::Call 'user32::EmptyClipboard()'\n\n        ;Step 5: Allocate global heap\n        StrLen $2 $0\n        IntOp $2 $2 + 1\n        System::Call 'kernel32::GlobalAlloc(i 2, i r2) i.r2'\n\n        ;Step 6: Lock the handle\n        System::Call 'kernel32::GlobalLock(i r2) i.r3'\n\n        ;Step 7: Copy the text to locked clipboard buffer\n        System::Call 'kernel32::lstrcpyA(i r3, t r0)'\n\n        ;Step 8: Unlock the handle again\n        System::Call 'kernel32::GlobalUnlock(i r2)'\n\n        ;Step 9: Set the information to the clipboard\n        System::Call 'user32::SetClipboardData(i 1, i r2)'\n        \n        StrCpy $0 $4\n      ${Else} ;Clear\n\n        ;Step 1: Clear the clipboard\n        System::Call 'user32::EmptyClipboard()'\n\n        StrCpy $0 \"\"\n      ${EndIf}\n\n      ;Close the clipboard\n      System::Call 'user32::CloseClipboard()'\n\n    /*After this point:\n      ------------------------------------------\n       $0 = OutVar (output)*/\n\n      ;Return result to user\n      Pop $4\n      Pop $3\n      Pop $2\n      Pop $1\n      Exch $0\n    FunctionEnd\n\n  !macroend\n\n  # Function StrIOToNSIS\n  ####################\n\n  !macro FUNCTION_STRING_StrIOToNSIS\n    !insertmacro STRFUNC_FUNC `StrIOToNSIS` `2004 \"bluenet\" - Based on functions by Amir Szekely, Joost Verburg, Dave Laundon and Diego Pedroso`\n\n    /*After this point:\n      ------------------------------------------\n       $R0 = String (input/output)\n       $R1 = StartCharPos (temp)\n       $R2 = StrLen (temp)\n       $R3 = TempStr (temp)\n       $R4 = TempRepStr (temp)*/\n\n      ;Get input from user\n      Exch $R0\n      Push $R1\n      Push $R2\n      Push $R3\n      Push $R4\n      \n      ;Get \"String\" length\n      StrLen $R2 $R0\n\n      ;Loop until \"String\" end is reached\n      ${For} $R1 0 $R2\n        ;Get the next \"String\" characters\n        StrCpy $R3 $R0 2 $R1\n        \n        ;Detect if current character is:\n        ${If} $R3 == \"\\\\\" ;Back-slash\n          StrCpy $R4 \"\\\"\n        ${ElseIf} $R3 == \"\\r\" ;Carriage return\n          StrCpy $R4 \"$\\r\"\n        ${ElseIf} $R3 == \"\\n\" ;Line feed\n          StrCpy $R4 \"$\\n\"\n        ${ElseIf} $R3 == \"\\t\" ;Tab\n          StrCpy $R4 \"$\\t\"\n        ${Else} ;Anything else\n          StrCpy $R4 \"\"\n        ${EndIf}\n\n        ;Detect if \"TempRepStr\" is not empty\n        ${If} $R4 != \"\"\n          ;Replace the old characters with the new one\n          StrCpy $R3 $R0 $R1\n          IntOp $R1 $R1 + 2\n          StrCpy $R0 $R0 \"\" $R1\n          StrCpy $R0 \"$R3$R4$R0\"\n          IntOp $R2 $R2 - 1 ;Decrease \"StrLen\"\n          IntOp $R1 $R1 - 2 ;Go back to the next character\n        ${EndIf}\n      ${Next}\n      Pop $R4\n      Pop $R3\n      Pop $R2\n      Pop $R1\n      Exch $R0\n    FunctionEnd\n  !macroend\n\n  # Function StrLoc\n  ###############\n\n  !macro FUNCTION_STRING_StrLoc\n    !insertmacro STRFUNC_FUNC `StrLoc` `2004 Diego Pedroso - Based on functions by Ximon Eighteen`\n\n    /*After this point:\n      ------------------------------------------\n       $R0 = OffsetDirection (input)\n       $R1 = StrToSearch (input)\n       $R2 = String (input)\n       $R3 = StrToSearchLen (temp)\n       $R4 = StrLen (temp)\n       $R5 = StartCharPos (temp)\n       $R6 = TempStr (temp)*/\n\n      ;Get input from user\n      Exch $R0\n      Exch\n      Exch $R1\n      Exch 2\n      Exch $R2\n      Push $R3\n      Push $R4\n      Push $R5\n      Push $R6\n\n      ;Get \"String\" and \"StrToSearch\" length\n      StrLen $R3 $R1\n      StrLen $R4 $R2\n      ;Start \"StartCharPos\" counter\n      StrCpy $R5 0\n\n      ;Loop until \"StrToSearch\" is found or \"String\" reaches its end\n      ${Do}\n        ;Remove everything before and after the searched part (\"TempStr\")\n        StrCpy $R6 $R2 $R3 $R5\n\n        ;Compare \"TempStr\" with \"StrToSearch\"\n        ${If} $R6 == $R1\n          ${If} $R0 == `<`\n            IntOp $R6 $R3 + $R5\n            IntOp $R0 $R4 - $R6\n          ${Else}\n            StrCpy $R0 $R5\n          ${EndIf}\n          ${ExitDo}\n        ${EndIf}\n        ;If not \"StrToSearch\", this could be \"String\" end\n        ${If} $R5 >= $R4\n          StrCpy $R0 ``\n          ${ExitDo}\n        ${EndIf}\n        ;If not, continue the loop\n        IntOp $R5 $R5 + 1\n      ${Loop}\n\n      ;Return output to user\n      Pop $R6\n      Pop $R5\n      Pop $R4\n      Pop $R3\n      Pop $R2\n      Exch\n      Pop $R1\n      Exch $R0\n    FunctionEnd\n\n  !macroend\n\n  # Function StrNSISToIO\n  ####################\n\n  !macro FUNCTION_STRING_StrNSISToIO\n    !insertmacro STRFUNC_FUNC `StrNSISToIO` `2004 \"bluenet\" - Based on functions by Amir Szekely, Joost Verburg, Dave Laundon and Diego Pedroso`\n\n    /*After this point:\n      ------------------------------------------\n       $R0 = String (input/output)\n       $R1 = StartCharPos (temp)\n       $R2 = StrLen (temp)\n       $R3 = TempStr (temp)\n       $R4 = TempRepStr (temp)*/\n\n      ;Get input from user\n      Exch $R0\n      Push $R1\n      Push $R2\n      Push $R3\n      Push $R4\n      \n      ;Get \"String\" length\n      StrLen $R2 $R0\n\n      ;Loop until \"String\" end is reached\n      ${For} $R1 0 $R2\n        ;Get the next \"String\" character\n        StrCpy $R3 $R0 1 $R1\n\n        ;Detect if current character is:\n        ${If} $R3 == \"$\\r\" ;Back-slash\n          StrCpy $R4 \"\\r\"\n        ${ElseIf} $R3 == \"$\\n\" ;Carriage return\n          StrCpy $R4 \"\\n\"\n        ${ElseIf} $R3 == \"$\\t\" ;Line feed\n          StrCpy $R4 \"\\t\"\n        ${ElseIf} $R3 == \"\\\" ;Tab\n          StrCpy $R4 \"\\\\\"\n        ${Else} ;Anything else\n          StrCpy $R4 \"\"\n        ${EndIf}\n\n        ;Detect if \"TempRepStr\" is not empty\n        ${If} $R4 != \"\"\n          ;Replace the old character with the new ones\n          StrCpy $R3 $R0 $R1\n          IntOp $R1 $R1 + 1\n          StrCpy $R0 $R0 \"\" $R1\n          StrCpy $R0 \"$R3$R4$R0\"\n          IntOp $R2 $R2 + 1 ;Increase \"StrLen\"\n        ${EndIf}\n      ${Next}\n\n      ;Return output to user\n      Pop $R4\n      Pop $R3\n      Pop $R2\n      Pop $R1\n      Exch $R0\n    FunctionEnd\n  !macroend\n\n  # Function StrRep\n  ###############\n\n  !macro FUNCTION_STRING_StrRep\n    !insertmacro STRFUNC_FUNC `StrRep` `2004 Diego Pedroso - Based on functions by Hendri Adriaens`\n\n    /*After this point:\n      ------------------------------------------\n       $R0 = ReplacementString (input)\n       $R1 = StrToSearch (input)\n       $R2 = String (input)\n       $R3 = RepStrLen (temp)\n       $R4 = StrToSearchLen (temp)\n       $R5 = StrLen (temp)\n       $R6 = StartCharPos (temp)\n       $R7 = TempStrL (temp)\n       $R8 = TempStrR (temp)*/\n\n      ;Get input from user\n      Exch $R0\n      Exch\n      Exch $R1\n      Exch\n      Exch 2\n      Exch $R2\n      Push $R3\n      Push $R4\n      Push $R5\n      Push $R6\n      Push $R7\n      Push $R8\n\n      ;Return \"String\" if \"StrToSearch\" is \"\"\n      ${IfThen} $R1 == \"\" ${|} Goto Done ${|}\n\n      ;Get \"ReplacementString\", \"String\" and \"StrToSearch\" length\n      StrLen $R3 $R0\n      StrLen $R4 $R1\n      StrLen $R5 $R2\n      ;Start \"StartCharPos\" counter\n      StrCpy $R6 0\n\n      ;Loop until \"StrToSearch\" is found or \"String\" reaches its end\n      ${Do}\n        ;Remove everything before and after the searched part (\"TempStrL\")\n        StrCpy $R7 $R2 $R4 $R6\n\n        ;Compare \"TempStrL\" with \"StrToSearch\"\n        ${If} $R7 == $R1\n          ;Split \"String\" to replace the string wanted\n          StrCpy $R7 $R2 $R6 ;TempStrL\n\n          ;Calc: \"StartCharPos\" + \"StrToSearchLen\" = EndCharPos\n          IntOp $R8 $R6 + $R4\n\n          StrCpy $R8 $R2 \"\" $R8 ;TempStrR\n\n          ;Insert the new string between the two separated parts of \"String\"\n          StrCpy $R2 $R7$R0$R8\n          ;Now calculate the new \"StrLen\" and \"StartCharPos\"\n          StrLen $R5 $R2\n          IntOp $R6 $R6 + $R3\n          ${Continue}\n        ${EndIf}\n\n        ;If not \"StrToSearch\", this could be \"String\" end\n        ${IfThen} $R6 >= $R5 ${|} ${ExitDo} ${|}\n        ;If not, continue the loop\n        IntOp $R6 $R6 + 1\n      ${Loop}\n\n      Done:\n\n    /*After this point:\n      ------------------------------------------\n       $R0 = OutVar (output)*/\n\n      ;Return output to user\n      StrCpy $R0 $R2\n      Pop $R8\n      Pop $R7\n      Pop $R6\n      Pop $R5\n      Pop $R4\n      Pop $R3\n      Pop $R2\n      Pop $R1\n      Exch $R0\n    FunctionEnd\n\n  !macroend\n\n  # Function StrSort\n  ################\n\n  !macro FUNCTION_STRING_StrSort\n    !insertmacro STRFUNC_FUNC `StrSort` `2004 Diego Pedroso - Based on functions by Stuart Welch`\n\n    /*After this point:\n      ------------------------------------------\n       $R0 = String (input)\n       $R1 = LeftStr (input)\n       $R2 = CenterStr (input)\n       $R3 = RightStr (input)\n       $R4 = IncludeLeftStr (input)\n       $R5 = IncludeCenterStr (input)\n       $R6 = IncludeRightStr (input)\n\n       $0 = StrLen (temp)\n       $1 = LeftStrLen (temp)\n       $2 = CenterStrLen (temp)\n       $3 = RightStrLen (temp)\n       $4 = StartPos (temp)\n       $5 = EndPos (temp)\n       $6 = StartCharPos (temp)\n       $7 = EndCharPos (temp)\n       $8 = TempStr (temp)*/\n\n      ;Get input from user\n      Exch $R6\n      Exch\n      Exch $R5\n      Exch\n      Exch 2\n      Exch $R4\n      Exch 2\n      Exch 3\n      Exch $R3\n      Exch 3\n      Exch 4\n      Exch $R2\n      Exch 4\n      Exch 5\n      Exch $R1\n      Exch 5\n      Exch 6\n      Exch $R0\n      Exch 6\n      Push $0\n      Push $1\n      Push $2\n      Push $3\n      Push $4\n      Push $5\n      Push $6\n      Push $7\n      Push $8\n\n      ;Parameter defaults\n      ${IfThen} $R4 == `` ${|} StrCpy $R4 `1` ${|}\n      ${IfThen} $R5 == `` ${|} StrCpy $R5 `1` ${|}\n      ${IfThen} $R6 == `` ${|} StrCpy $R6 `1` ${|}\n\n      ;Get \"String\", \"CenterStr\", \"LeftStr\" and \"RightStr\" length\n      StrLen $0 $R0\n      StrLen $1 $R1\n      StrLen $2 $R2\n      StrLen $3 $R3\n      ;Start \"StartCharPos\" counter\n      StrCpy $6 0\n      ;Start \"EndCharPos\" counter based on \"CenterStr\" length\n      IntOp $7 $6 + $2\n\n      ;Loop until \"CenterStr\" is found or \"String\" reaches its end\n      ${Do}\n        ;Remove everything before and after the searched part (\"TempStr\")\n        StrCpy $8 $R0 $2 $6\n\n        ;Compare \"TempStr\" with \"CenterStr\"\n        ${IfThen} $8 == $R2 ${|} ${ExitDo} ${|}\n        ;If not, this could be \"String\" end\n        ${IfThen} $7 >= $0 ${|} Goto Done ${|}\n        ;If not, continue the loop\n        IntOp $6 $6 + 1\n        IntOp $7 $7 + 1\n      ${Loop}\n\n      # \"CenterStr\" was found\n\n      ;Remove \"CenterStr\" from \"String\" if the user wants\n      ${If} $R5 = ${FALSE}\n        StrCpy $8 $R0 $6\n        StrCpy $R0 $R0 `` $7\n        StrCpy $R0 $8$R0\n      ${EndIf}\n\n      ;\"StartPos\" and \"EndPos\" will record \"CenterStr\" coordinates for now\n      StrCpy $4 $6\n      StrCpy $5 $7\n      ;\"StartCharPos\" and \"EndCharPos\" should be before \"CenterStr\"\n      IntOp $6 $6 - $1\n      IntOp $7 $6 + $1\n\n      ;Loop until \"LeftStr\" is found or \"String\" reaches its start\n      ${Do}\n        ;Remove everything before and after the searched part (\"TempStr\")\n        StrCpy $8 $R0 $1 $6\n\n        ;If \"LeftStr\" is empty\n        ${If} $R1 == ``\n          StrCpy $6 0\n          StrCpy $7 0\n          ${ExitDo}\n        ${EndIf}\n\n        ;Compare \"TempStr\" with \"LeftStr\"\n        ${IfThen} $8 == $R1 ${|} ${ExitDo} ${|}\n        ;If not, this could be \"String\" start\n        ${IfThen} $6 <= 0 ${|} ${ExitDo} ${|}\n        ;If not, continue the loop\n        IntOp $6 $6 - 1\n        IntOp $7 $7 - 1\n      ${Loop}\n\n      # \"LeftStr\" is found or \"String\" start was reached\n\n      ;Remove \"LeftStr\" from \"String\" if the user wants\n      ${If} $R4 = ${FALSE}\n        IntOp $6 $6 + $1\n      ${EndIf}\n\n      ;Record \"LeftStr\" first character position on \"TempStr\" (temporarily)\n      StrCpy $8 $6\n\n      ;\"StartCharPos\" and \"EndCharPos\" should be after \"CenterStr\"\n      ${If} $R5 = ${FALSE}\n        StrCpy $6 $4\n      ${Else}\n        IntOp $6 $4 + $2\n      ${EndIf}\n      IntOp $7 $6 + $3\n      \n      ;Record \"LeftStr\" first character position on \"StartPos\"\n      StrCpy $4 $8\n\n      ;Loop until \"RightStr\" is found or \"String\" reaches its end\n      ${Do}\n        ;Remove everything before and after the searched part (\"TempStr\")\n        StrCpy $8 $R0 $3 $6\n\n        ;If \"RightStr\" is empty\n        ${If} $R3 == ``\n          StrCpy $6 $0\n          StrCpy $7 $0\n          ${ExitDo}\n        ${EndIf}\n\n        ;Compare \"TempStr\" with \"RightStr\"\n        ${IfThen} $8 == $R3 ${|} ${ExitDo} ${|}\n        ;If not, this could be \"String\" end\n        ${IfThen} $7 >= $0 ${|} ${ExitDo} ${|}\n        ;If not, continue the loop\n        IntOp $6 $6 + 1\n        IntOp $7 $7 + 1\n      ${Loop}\n\n      ;Remove \"RightStr\" from \"String\" if the user wants\n      ${If} $R6 = ${FALSE}\n        IntOp $7 $7 - $3\n      ${EndIf}\n\n      ;Record \"RightStr\" last character position on \"StartPos\"\n      StrCpy $5 $7\n\n      ;As the positionment is relative...\n      IntOp $5 $5 - $4\n\n      ;Write the string and finish the job\n      StrCpy $R0 $R0 $5 $4\n      Goto +2\n\n      Done:\n      StrCpy $R0 ``\n\n    /*After this point:\n      ------------------------------------------\n       $R0 = OutVar (output)*/\n\n      ;Return output to user\n      Pop $8\n      Pop $7\n      Pop $6\n      Pop $5\n      Pop $4\n      Pop $3\n      Pop $2\n      Pop $1\n      Pop $0\n      Pop $R6\n      Pop $R5\n      Pop $R4\n      Pop $R3\n      Pop $R2\n      Pop $R1\n      Exch $R0\n    FunctionEnd\n\n  !macroend\n  \n  # Function StrStr\n  ###############\n\n  !macro FUNCTION_STRING_StrStr\n    !insertmacro STRFUNC_FUNC `StrStr` `2004 Diego Pedroso - Based on functions by Ximon Eighteen`\n\n    /*After this point:\n      ------------------------------------------\n       $R0 = StrToSearch (input)\n       $R1 = String (input)\n       $R2 = StrToSearchLen (temp)\n       $R3 = StrLen (temp)\n       $R4 = StartCharPos (temp)\n       $R5 = TempStr (temp)*/\n\n      ;Get input from user\n      Exch $R0\n      Exch\n      Exch $R1\n      Push $R2\n      Push $R3\n      Push $R4\n      Push $R5\n\n      ;Get \"String\" and \"StrToSearch\" length\n      StrLen $R2 $R0\n      StrLen $R3 $R1\n      ;Start \"StartCharPos\" counter\n      StrCpy $R4 0\n\n      ;Loop until \"StrToSearch\" is found or \"String\" reaches its end\n      ${Do}\n        ;Remove everything before and after the searched part (\"TempStr\")\n        StrCpy $R5 $R1 $R2 $R4\n\n        ;Compare \"TempStr\" with \"StrToSearch\"\n        ${IfThen} $R5 == $R0 ${|} ${ExitDo} ${|}\n        ;If not \"StrToSearch\", this could be \"String\" end\n        ${IfThen} $R4 >= $R3 ${|} ${ExitDo} ${|}\n        ;If not, continue the loop\n        IntOp $R4 $R4 + 1\n      ${Loop}\n\n    /*After this point:\n      ------------------------------------------\n       $R0 = OutVar (output)*/\n\n      ;Remove part before \"StrToSearch\" on \"String\" (if there has one)\n      StrCpy $R0 $R1 `` $R4\n\n      ;Return output to user\n      Pop $R5\n      Pop $R4\n      Pop $R3\n      Pop $R2\n      Pop $R1\n      Exch $R0\n    FunctionEnd\n\n  !macroend\n\n  # Function StrStrAdv\n  ##################\n\n  !macro FUNCTION_STRING_StrStrAdv\n    !insertmacro STRFUNC_FUNC `StrStrAdv` `2003-2004 Diego Pedroso`\n\n    /*After this point:\n      ------------------------------------------\n       $0 = String (input)\n       $1 = StringToSearch (input)\n       $2 = DirectionOfSearch (input)\n       $3 = DirectionOfReturn (input)\n       $4 = ShowStrToSearch (input)\n       $5 = NumLoops (input)\n       $6 = CaseSensitive (input)\n       $7 = StringLength (temp)\n       $8 = StrToSearchLength (temp)\n       $9 = CurrentLoop (temp)\n       $R0 = EndCharPos (temp)\n       $R1 = StartCharPos (temp)\n       $R2 = OutVar (output)\n       $R3 = Temp (temp)*/\n\n      ;Get input from user\n\n      Exch $6\n      Exch\n      Exch $5\n      Exch\n      Exch 2\n      Exch $4\n      Exch 2\n      Exch 3\n      Exch $3\n      Exch 3\n      Exch 4\n      Exch $2\n      Exch 4\n      Exch 5\n      Exch $1\n      Exch 5\n      Exch 6\n      Exch $0\n      Exch 6\n      Push $7\n      Push $8\n      Push $9\n      Push $R3\n      Push $R2\n      Push $R1\n      Push $R0\n\n      ; Clean $R0-$R3 variables\n      StrCpy $R0 \"\"\n      StrCpy $R1 \"\"\n      StrCpy $R2 \"\"\n      StrCpy $R3 \"\"\n\n      ; Verify if we have the correct values on the variables\n      ${If} $0 == ``\n        SetErrors ;AdvStrStr_StrToSearch not found\n        Goto AdvStrStr_End\n      ${EndIf}\n\n      ${If} $1 == ``\n        SetErrors ;No text to search\n        Goto AdvStrStr_End\n      ${EndIf}\n\n      ${If} $2 != <\n        StrCpy $2 >\n      ${EndIf}\n\n      ${If} $3 != <\n        StrCpy $3 >\n      ${EndIf}\n\n      ${If} $4 <> 0\n        StrCpy $4 1\n      ${EndIf}\n\n      ${If} $5 <= 0\n        StrCpy $5 0\n      ${EndIf}\n\n      ${If} $6 <> 1\n        StrCpy $6 0\n      ${EndIf}\n\n      ; Find \"AdvStrStr_String\" length\n      StrLen $7 $0\n\n      ; Then find \"AdvStrStr_StrToSearch\" length\n      StrLen $8 $1\n\n      ; Now set up basic variables\n\n      ${If} $2 == <\n        IntOp $R1 $7 - $8\n        StrCpy $R2 $7\n      ${Else}\n        StrCpy $R1 0\n        StrCpy $R2 $8\n      ${EndIf}\n\n      StrCpy $9 0 ; First loop\n\n      ;Let's begin the search\n\n      ${Do}\n        ; Step 1: If the starting or ending numbers are negative\n        ;         or more than AdvStrStr_StringLen, we return\n        ;         error\n\n        ${If} $R1 < 0\n          StrCpy $R1 ``\n          StrCpy $R2 ``\n          StrCpy $R3 ``\n          SetErrors ;AdvStrStr_StrToSearch not found\n          Goto AdvStrStr_End\n        ${ElseIf} $R2 > $7\n          StrCpy $R1 ``\n          StrCpy $R2 ``\n          StrCpy $R3 ``\n          SetErrors ;AdvStrStr_StrToSearch not found\n          Goto AdvStrStr_End\n        ${EndIf}\n\n        ; Step 2: Start the search depending on\n        ;         AdvStrStr_DirectionOfSearch. Chop down not needed\n        ;         characters.\n\n        ${If} $R1 <> 0\n          StrCpy $R3 $0 `` $R1\n        ${EndIf}\n\n        ${If} $R2 <> $7\n          ${If} $R1 = 0\n            StrCpy $R3 $0 $8\n          ${Else}\n            StrCpy $R3 $R3 $8\n          ${EndIf}\n        ${EndIf}\n\n        ; Step 3: Make sure that's the string we want\n\n        ; Case-Sensitive Support <- Use \"AdvStrStr_Temp\"\n        ; variable because it won't be used anymore\n\n        ${If} $6 == 1\n          System::Call `kernel32::lstrcmpA(ts, ts) i.s` `$R3` `$1`\n          Pop $R3\n          ${If} $R3 = 0\n            StrCpy $R3 1 ; Continue\n          ${Else}\n            StrCpy $R3 0 ; Break\n          ${EndIf}\n        ${Else}\n          ${If} $R3 == $1\n            StrCpy $R3 1 ; Continue\n          ${Else}\n            StrCpy $R3 0 ; Break\n          ${EndIf}\n        ${EndIf}\n\n        ; After the comparasion, confirm that it is the\n        ; value we want.\n\n        ${If} $R3 = 1\n\n          ;We found it, return except if the user has set up to\n          ;search for another one:\n          ${If} $9 >= $5\n\n            ;Now, let's see if the user wants\n            ;AdvStrStr_StrToSearch to appear:\n            ${If} $4 == 0\n              ;Return depends on AdvStrStr_DirectionOfReturn\n              ${If} $3 == <\n                ; RTL\n                StrCpy $R0 $0 $R1\n              ${Else}\n                ; LTR\n                StrCpy $R0 $0 `` $R2\n              ${EndIf}\n              ${Break}\n            ${Else}\n              ;Return depends on AdvStrStr_DirectionOfReturn\n              ${If} $3 == <\n                ; RTL\n                StrCpy $R0 $0 $R2\n              ${Else}\n                ; LTR\n                StrCpy $R0 $0 `` $R1\n              ${EndIf}\n              ${Break}\n            ${EndIf}\n          ${Else}\n            ;If the user wants to have more loops, let's do it so!\n            IntOp $9 $9 + 1\n\n            ${If} $2 == <\n              IntOp $R1 $R1 - 1\n              IntOp $R2 $R2 - 1\n            ${Else}\n              IntOp $R1 $R1 + 1\n              IntOp $R2 $R2 + 1\n            ${EndIf}\n          ${EndIf}\n        ${Else}\n          ; Step 4: We didn't find it, so do steps 1 thru 3 again\n\n          ${If} $2 == <\n            IntOp $R1 $R1 - 1\n            IntOp $R2 $R2 - 1\n          ${Else}\n            IntOp $R1 $R1 + 1\n            IntOp $R2 $R2 + 1\n          ${EndIf}\n        ${EndIf}\n      ${Loop}\n\n      AdvStrStr_End:\n\n      ;Add 1 to AdvStrStr_EndCharPos to be supportable\n      ;by \"StrCpy\"\n\n      IntOp $R2 $R2 - 1\n\n      ;Return output to user\n\n      Exch $R0\n      Exch\n      Pop $R1\n      Exch\n      Pop $R2\n      Exch\n      Pop $R3\n      Exch\n      Pop $9\n      Exch\n      Pop $8\n      Exch\n      Pop $7\n      Exch\n      Pop $6\n      Exch\n      Pop $5\n      Exch\n      Pop $4\n      Exch\n      Pop $3\n      Exch\n      Pop $2\n      Exch\n      Pop $1\n      Exch\n      Pop $0\n\n    FunctionEnd\n\n  !macroend\n\n  # Function StrTok\n  ###############\n\n  !macro FUNCTION_STRING_StrTok\n    !insertmacro STRFUNC_FUNC `StrTok` `2004 Diego Pedroso - Based on functions by \"bigmac666\"`\n    /*After this point:\n      ------------------------------------------\n       $0 = SkipEmptyParts (input)\n       $1 = ResultPart (input)\n       $2 = Separators (input)\n       $3 = String (input)\n       $4 = StrToSearchLen (temp)\n       $5 = StrLen (temp)\n       $6 = StartCharPos (temp)\n       $7 = TempStr (temp)\n       $8 = CurrentLoop\n       $9 = CurrentSepChar\n       $R0 = CurrentSepCharNum\n       */\n\n      ;Get input from user\n      Exch $0\n      Exch\n      Exch $1\n      Exch\n      Exch 2\n      Exch $2\n      Exch 2\n      Exch 3\n      Exch $3\n      Exch 3\n      Push $4\n      Push $5\n      Push $6\n      Push $7\n      Push $8\n      Push $9\n      Push $R0\n\n      ;Parameter defaults\n      ${IfThen} $2 == `` ${|} StrCpy $2 `|` ${|}\n      ${IfThen} $1 == `` ${|} StrCpy $1 `L` ${|}\n      ${IfThen} $0 == `` ${|} StrCpy $0 `0` ${|}\n\n      ;Get \"String\" and \"StrToSearch\" length\n      StrLen $4 $2\n      StrLen $5 $3\n      ;Start \"StartCharPos\" and \"ResultPart\" counters\n      StrCpy $6 0\n      StrCpy $8 -1\n\n      ;Loop until \"ResultPart\" is met, \"StrToSearch\" is found or\n      ;\"String\" reaches its end\n      ResultPartLoop: ;\"CurrentLoop\" Loop\n\n        ;Increase \"CurrentLoop\" counter\n        IntOp $8 $8 + 1\n\n        StrSearchLoop:\n        ${Do} ;\"String\" Loop\n          ;Remove everything before and after the searched part (\"TempStr\")\n          StrCpy $7 $3 1 $6\n\n          ;Verify if it's the \"String\" end\n          ${If} $6 >= $5\n            ;If \"CurrentLoop\" is what the user wants, remove the part\n            ;after \"TempStr\" and itself and get out of here\n            ${If} $8 == $1\n            ${OrIf} $1 == `L`\n              StrCpy $3 $3 $6\n            ${Else} ;If not, empty \"String\" and get out of here\n              StrCpy $3 ``\n            ${EndIf}\n            StrCpy $R0 `End`\n            ${ExitDo}\n          ${EndIf}\n\n          ;Start \"CurrentSepCharNum\" counter (for \"Separators\" Loop)\n          StrCpy $R0 0\n\n          ${Do} ;\"Separators\" Loop\n            ;Use one \"Separators\" character at a time\n            ${If} $R0 <> 0\n              StrCpy $9 $2 1 $R0\n            ${Else}\n              StrCpy $9 $2 1\n            ${EndIf}\n\n            ;Go to the next \"String\" char if it's \"Separators\" end\n            ${IfThen} $R0 >= $4 ${|} ${ExitDo} ${|}\n\n            ;Or, if \"TempStr\" equals \"CurrentSepChar\", then...\n            ${If} $7 == $9\n              StrCpy $7 $3 $6\n\n              ;If \"String\" is empty because this result part doesn't\n              ;contain data, verify if \"SkipEmptyParts\" is activated,\n              ;so we don't return the output to user yet\n\n              ${If} $7 == ``\n              ${AndIf} $0 = ${TRUE}\n                IntOp $6 $6 + 1\n                StrCpy $3 $3 `` $6\n                StrCpy $6 0\n                Goto StrSearchLoop\n              ${ElseIf} $8 == $1\n                StrCpy $3 $3 $6\n                StrCpy $R0 \"End\"\n                ${ExitDo}\n              ${EndIf} ;If not, go to the next result part\n              IntOp $6 $6 + 1\n              StrCpy $3 $3 `` $6\n              StrCpy $6 0\n              Goto ResultPartLoop\n            ${EndIf}\n\n            ;Increase \"CurrentSepCharNum\" counter\n            IntOp $R0 $R0 + 1\n          ${Loop}\n          ${IfThen} $R0 == \"End\" ${|} ${ExitDo} ${|}\n          \n          ;Increase \"StartCharPos\" counter\n          IntOp $6 $6 + 1\n        ${Loop}\n\n    /*After this point:\n      ------------------------------------------\n       $3 = OutVar (output)*/\n\n      ;Return output to user\n\n      Pop $R0\n      Pop $9\n      Pop $8\n      Pop $7\n      Pop $6\n      Pop $5\n      Pop $4\n      Pop $0\n      Pop $1\n      Pop $2\n      Exch $3\n    FunctionEnd\n\n  !macroend\n\n  # Function StrTrimNewLines\n  ########################\n\n  !macro FUNCTION_STRING_StrTrimNewLines\n    !insertmacro STRFUNC_FUNC `StrTrimNewLines` `2004 Diego Pedroso - Based on functions by Ximon Eighteen`\n\n    /*After this point:\n      ------------------------------------------\n       $R0 = String (input)\n       $R1 = TrimCounter (temp)\n       $R2 = Temp (temp)*/\n\n      ;Get input from user\n      Exch $R0\n      Push $R1\n      Push $R2\n      \n      ;Initialize trim counter\n      StrCpy $R1 0\n\n      loop:\n        ;Subtract to get \"String\"'s last characters\n        IntOp $R1 $R1 - 1\n\n        ;Verify if they are either $\\r or $\\n\n        StrCpy $R2 $R0 1 $R1\n        ${If} $R2 == `$\\r`\n        ${OrIf} $R2 == `$\\n`\n          Goto loop\n        ${EndIf}\n\n      ;Trim characters (if needed)\n      IntOp $R1 $R1 + 1\n      ${If} $R1 < 0\n        StrCpy $R0 $R0 $R1\n      ${EndIf}\n\n    /*After this point:\n      ------------------------------------------\n       $R0 = OutVar (output)*/\n\n      ;Return output to user\n      Pop $R2\n      Pop $R1\n      Exch $R0\n    FunctionEnd\n\n  !macroend\n\n  ;Function Calls for Install and Uninstall\n\n  !macro FUNCTION_STRING_StrCase_Call ResultVar String Type\n    !verbose push\n    !verbose 4\n    !echo `$ {StrCase} \"${ResultVar}\" \"${String}\" \"${Type}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${Type}`\n    Call StrCase\n    Pop `${ResultVar}`\n  !macroend\n  !macro FUNCTION_STRING_UnStrCase_Call ResultVar String Type\n    !verbose push\n    !verbose 4\n    !echo `$ {UnStrCase} \"${ResultVar}\" \"${String}\" \"${Type}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${Type}`\n    Call un.StrCase\n    Pop `${ResultVar}`\n  !macroend\n\n  !macro FUNCTION_STRING_StrClb_Call ResultVar String Action\n    !verbose push\n    !verbose 4\n    !echo `$ {StrClb} \"${ResultVar}\" \"${String}\" \"${Action}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${Action}`\n    Call StrClb\n    Pop `${ResultVar}`\n  !macroend\n  !macro FUNCTION_STRING_UnStrClb_Call ResultVar String Action\n    !verbose push\n    !verbose 4\n    !echo `$ {UnStrClb} \"${ResultVar}\" \"${String}\" \"${Action}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${Action}`\n    Call un.StrClb\n    Pop `${ResultVar}`\n  !macroend\n\n  !macro FUNCTION_STRING_StrIOToNSIS_Call ResultVar String\n    !verbose push\n    !verbose 4\n    !echo `$ {StrIOToNSIS} \"${ResultVar}\" \"${String}\"`\n    !verbose pop\n\n    Push `${String}`\n    Call StrIOToNSIS\n    Pop `${ResultVar}`\n  !macroend\n  !macro FUNCTION_STRING_UnStrIOToNSIS_Call ResultVar String\n    !verbose push\n    !verbose 4\n    !echo `$ {UnStrIOToNSIS} \"${ResultVar}\" \"${String}\"`\n    !verbose pop\n\n    Push `${String}`\n    Call un.StrIOToNSIS\n    Pop `${ResultVar}`\n  !macroend\n\n  !macro FUNCTION_STRING_StrLoc_Call ResultVar String StrToSearchFor OffsetDirection\n    !verbose push\n    !verbose 4\n    !echo `$ {StrLoc} \"${ResultVar}\" \"${String}\" \"${StrToSearchFor}\" \"${OffsetDirection}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${StrToSearchFor}`\n    Push `${OffsetDirection}`\n    Call StrLoc\n    Pop `${ResultVar}`\n  !macroend\n  !macro FUNCTION_STRING_UnStrLoc_Call ResultVar String StrToSearchFor OffsetDirection\n    !verbose push\n    !verbose 4\n    !echo `$ {UnStrLoc} \"${ResultVar}\" \"${String}\" \"${StrToSearchFor}\" \"${OffsetDirection}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${StrToSearchFor}`\n    Push `${OffsetDirection}`\n    Call un.StrLoc\n    Pop `${ResultVar}`\n  !macroend\n\n  !macro FUNCTION_STRING_StrNSISToIO_Call ResultVar String\n    !verbose push\n    !verbose 4\n    !echo `$ {StrNSISToIO} \"${ResultVar}\" \"${String}\"`\n    !verbose pop\n\n    Push `${String}`\n    Call StrNSISToIO\n    Pop `${ResultVar}`\n  !macroend\n  !macro FUNCTION_STRING_UnStrNSISToIO_Call ResultVar String\n    !verbose push\n    !verbose 4\n    !echo `$ {UnStrNSISToIO} \"${ResultVar}\" \"${String}\"`\n    !verbose pop\n\n    Push `${String}`\n    Call un.StrNSISToIO\n    Pop `${ResultVar}`\n  !macroend\n\n  !macro FUNCTION_STRING_StrRep_Call ResultVar String StringToReplace ReplacementString\n    !verbose push\n    !verbose 4\n    !echo `$ {StrRep} \"${ResultVar}\" \"${String}\" \"${StringToReplace}\" \"${ReplacementString}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${StringToReplace}`\n    Push `${ReplacementString}`\n    Call StrRep\n    Pop `${ResultVar}`\n  !macroend\n  !macro FUNCTION_STRING_UnStrRep_Call ResultVar String StringToReplace ReplacementString\n    !verbose push\n    !verbose 4\n    !echo `$ {UnStrRep} \"${ResultVar}\" \"${String}\" \"${StringToReplace}\" \"${ReplacementString}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${StringToReplace}`\n    Push `${ReplacementString}`\n    Call un.StrRep\n    Pop `${ResultVar}`\n  !macroend\n\n  !macro FUNCTION_STRING_StrSort_Call ResultVar String CenterStr LeftStr RightStr IncludeCenterStr IncludeLeftStr IncludeRightStr\n    !verbose push\n    !verbose 4\n    !echo `$ {StrSort} \"${ResultVar}\" \"${String}\" \"${CenterStr}\" \"${LeftStr}\" \"${RightStr}\" \"${IncludeCenterStr}\" \"${IncludeLeftStr}\" \"${IncludeRightStr}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${CenterStr}`\n    Push `${LeftStr}`\n    Push `${RightStr}`\n    Push `${IncludeCenterStr}`\n    Push `${IncludeLeftStr}`\n    Push `${IncludeRightStr}`\n    Call StrSort\n    Pop `${ResultVar}`\n  !macroend\n  !macro FUNCTION_STRING_UnStrSort_Call ResultVar String CenterStr LeftStr RightStr IncludeCenterStr IncludeLeftStr IncludeRightStr\n    !verbose push\n    !verbose 4\n    !echo `$ {UnStrSort} \"${ResultVar}\" \"${String}\" \"${CenterStr}\" \"${LeftStr}\" \"${RightStr}\" \"${IncludeCenterStr}\" \"${IncludeLeftStr}\" \"${IncludeRightStr}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${CenterStr}`\n    Push `${LeftStr}`\n    Push `${RightStr}`\n    Push `${IncludeCenterStr}`\n    Push `${IncludeLeftStr}`\n    Push `${IncludeRightStr}`\n    Call un.StrSort\n    Pop `${ResultVar}`\n  !macroend\n\n  !macro FUNCTION_STRING_StrStr_Call ResultVar String StrToSearchFor\n    !verbose push\n    !verbose 4\n    !echo `$ {StrStr} \"${ResultVar}\" \"${String}\" \"${StrToSearchFor}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${StrToSearchFor}`\n    Call StrStr\n    Pop `${ResultVar}`\n  !macroend\n  !macro FUNCTION_STRING_UnStrStr_Call ResultVar String StrToSearchFor\n    !verbose push\n    !verbose 4\n    !echo `$ {UnStrStr} \"${ResultVar}\" \"${String}\" \"${StrToSearchFor}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${StrToSearchFor}`\n    Call un.StrStr\n    Pop `${ResultVar}`\n  !macroend\n\n  !macro FUNCTION_STRING_StrStrAdv_Call ResultVar String StrToSearchFor SearchDirection ResultStrDirection DisplayStrToSearch Loops CaseSensitive\n    !verbose push\n    !verbose 4\n    !echo `$ {StrStrAdv} \"${ResultVar}\" \"${String}\" \"${StrToSearchFor}\" \"${SearchDirection}\" \"${ResultStrDirection}\" \"${DisplayStrToSearch}\" \"${Loops}\" \"${CaseSensitive}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${StrToSearchFor}`\n    Push `${SearchDirection}`\n    Push `${ResultStrDirection}`\n    Push `${DisplayStrToSearch}`\n    Push `${Loops}`\n    Push `${CaseSensitive}`\n    Call StrStrAdv\n    Pop `${ResultVar}`\n  !macroend\n  !macro FUNCTION_STRING_UnStrStrAdv_Call ResultVar String StrToSearchFor SearchDirection ResultStrDirection DisplayStrToSearch Loops CaseSensitive\n    !verbose push\n    !verbose 4\n    !echo `$ {UnStrStrAdv} \"${ResultVar}\" \"${String}\" \"${StrToSearchFor}\" \"${SearchDirection}\" \"${ResultStrDirection}\" \"${DisplayStrToSearch}\" \"${Loops}\" \"${CaseSensitive}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${StrToSearchFor}`\n    Push `${SearchDirection}`\n    Push `${ResultStrDirection}`\n    Push `${DisplayStrToSearch}`\n    Push `${Loops}`\n    Push `${CaseSensitive}`\n    Call un.StrStrAdv\n    Pop `${ResultVar}`\n  !macroend\n\n  !macro FUNCTION_STRING_StrTok_Call ResultVar String Separators ResultPart SkipEmptyParts\n    !verbose push\n    !verbose 4\n    !echo `$ {StrTok} \"${ResultVar}\" \"${String}\" \"${Separators}\" \"${ResultPart}\" \"${SkipEmptyParts}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${Separators}`\n    Push `${ResultPart}`\n    Push `${SkipEmptyParts}`\n    Call StrTok\n    Pop `${ResultVar}`\n  !macroend\n  !macro FUNCTION_STRING_UnStrTok_Call ResultVar String Separators ResultPart SkipEmptyParts\n    !verbose push\n    !verbose 4\n    !echo `$ {UnStrTok} \"${ResultVar}\" \"${String}\" \"${Separators}\" \"${ResultPart}\" \"${SkipEmptyParts}\"`\n    !verbose pop\n\n    Push `${String}`\n    Push `${Separators}`\n    Push `${ResultPart}`\n    Push `${SkipEmptyParts}`\n    Call un.StrTok\n    Pop `${ResultVar}`\n  !macroend\n\n  !macro FUNCTION_STRING_StrTrimNewLines_Call ResultVar String\n    !verbose push\n    !verbose 4\n    !echo `$ {StrTrimNewLines} \"${ResultVar}\" \"${String}\"`\n    !verbose pop\n\n    Push `${String}`\n    Call StrTrimNewLines\n    Pop `${ResultVar}`\n  !macroend\n  !macro FUNCTION_STRING_UnStrTrimNewLines_Call ResultVar String\n    !verbose push\n    !verbose 4\n    !echo `$ {UnStrTrimNewLines} \"${ResultVar}\" \"${String}\"`\n    !verbose pop\n\n    Push `${String}`\n    Call un.StrTrimNewLines\n    Pop `${ResultVar}`\n  !macroend\n\n!endif\n!verbose 3\n!define STRFUNC_VERBOSITY ${_STRFUNC_VERBOSITY}\n!undef _STRFUNC_VERBOSITY\n!verbose pop\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/TextFunc.nsh",
    "content": "/*\n_____________________________________________________________________________\n\n                       Text Functions Header v2.4\n_____________________________________________________________________________\n\n 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)\n\n See documentation for more information about the following functions.\n\n Usage in script:\n 1. !include \"TextFunc.nsh\"\n 2. [Section|Function]\n      ${TextFunction} \"File\" \"...\"  $var\n    [SectionEnd|FunctionEnd]\n\n\n TextFunction=[LineFind|LineRead|FileReadFromEnd|LineSum|FileJoin|\n               TextCompare|TextCompareS|ConfigRead|ConfigReadS|\n               ConfigWrite|ConfigWriteS|FileRecode|TrimNewLines]\n\n_____________________________________________________________________________\n\n                       Thanks to:\n_____________________________________________________________________________\n\nLineRead\n\tAfrow UK (Based on his idea of Function \"ReadFileLine\")\nLineSum\n\tAfrow UK (Based on his idea of Function \"LineCount\")\nFileJoin\n\tAfrow UK (Based on his idea of Function \"JoinFiles\")\nConfigRead\n\tvbgunz (His idea)\nConfigWrite\n\tvbgunz (His idea)\nTrimNewLines\n\tsunjammer (Based on his Function \"TrimNewLines\")\n*/\n\n\n;_____________________________________________________________________________\n;\n;                                   Macros\n;_____________________________________________________________________________\n;\n; Change log window verbosity (default: 3=no script)\n;\n; Example:\n; !include \"TextFunc.nsh\"\n; !insertmacro LineFind\n; ${TEXTFUNC_VERBOSE} 4   # all verbosity\n; !insertmacro LineSum\n; ${TEXTFUNC_VERBOSE} 3   # no script\n\n!ifndef TEXTFUNC_INCLUDED\n!define TEXTFUNC_INCLUDED\n\n!include FileFunc.nsh\n!include Util.nsh\n\n!verbose push\n!verbose 3\n!ifndef _TEXTFUNC_VERBOSE\n\t!define _TEXTFUNC_VERBOSE 3\n!endif\n!verbose ${_TEXTFUNC_VERBOSE}\n!define TEXTFUNC_VERBOSE `!insertmacro TEXTFUNC_VERBOSE`\n!verbose pop\n\n!macro TEXTFUNC_VERBOSE _VERBOSE\n\t!verbose push\n\t!verbose 3\n\t!undef _TEXTFUNC_VERBOSE\n\t!define _TEXTFUNC_VERBOSE ${_VERBOSE}\n\t!verbose pop\n!macroend\n\n!macro LineFindCall _INPUT _OUTPUT _RANGE _FUNC\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\tPush $0\n\tPush `${_INPUT}`\n\tPush `${_OUTPUT}`\n\tPush `${_RANGE}`\n\tGetFunctionAddress $0 `${_FUNC}`\n\tPush `$0`\n\t${CallArtificialFunction} LineFind_\n\tPop $0\n\t!verbose pop\n!macroend\n\n!macro LineReadCall _FILE _NUMBER _RESULT\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\tPush `${_FILE}`\n\tPush `${_NUMBER}`\n\t${CallArtificialFunction} LineRead_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro FileReadFromEndCall _FILE _FUNC\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\tPush $0\n\tPush `${_FILE}`\n\tGetFunctionAddress $0 `${_FUNC}`\n\tPush `$0`\n\t${CallArtificialFunction} FileReadFromEnd_\n\tPop $0\n\t!verbose pop\n!macroend\n\n!macro LineSumCall _FILE _RESULT\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\tPush `${_FILE}`\n\t${CallArtificialFunction} LineSum_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro FileJoinCall _FILE1 _FILE2 _FILE3\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\tPush `${_FILE1}`\n\tPush `${_FILE2}`\n\tPush `${_FILE3}`\n\t${CallArtificialFunction} FileJoin_\n\t!verbose pop\n!macroend\n\n!macro TextCompareCall _FILE1 _FILE2 _OPTION _FUNC\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\tPush $0\n\tPush `${_FILE1}`\n\tPush `${_FILE2}`\n\tPush `${_OPTION}`\n\tGetFunctionAddress $0 `${_FUNC}`\n\tPush `$0`\n\t${CallArtificialFunction} TextCompare_\n\tPop $0\n\t!verbose pop\n!macroend\n\n!macro TextCompareSCall _FILE1 _FILE2 _OPTION _FUNC\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\tPush $0\n\tPush `${_FILE1}`\n\tPush `${_FILE2}`\n\tPush `${_OPTION}`\n\tGetFunctionAddress $0 `${_FUNC}`\n\tPush `$0`\n\t${CallArtificialFunction} TextCompareS_\n\tPop $0\n\t!verbose pop\n!macroend\n\n!macro ConfigReadCall _FILE _ENTRY _RESULT\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\tPush `${_FILE}`\n\tPush `${_ENTRY}`\n\t${CallArtificialFunction} ConfigRead_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro ConfigReadSCall _FILE _ENTRY _RESULT\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\tPush `${_FILE}`\n\tPush `${_ENTRY}`\n\t${CallArtificialFunction} ConfigReadS_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro ConfigWriteCall _FILE _ENTRY _VALUE _RESULT\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\tPush `${_FILE}`\n\tPush `${_ENTRY}`\n\tPush `${_VALUE}`\n\t${CallArtificialFunction} ConfigWrite_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro ConfigWriteSCall _FILE _ENTRY _VALUE _RESULT\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\tPush `${_FILE}`\n\tPush `${_ENTRY}`\n\tPush `${_VALUE}`\n\t${CallArtificialFunction} ConfigWriteS_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro FileRecodeCall _FILE _FORMAT\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\tPush `${_FILE}`\n\tPush `${_FORMAT}`\n\t${CallArtificialFunction} FileRecode_\n\t!verbose pop\n!macroend\n\n!macro TrimNewLinesCall _FILE _RESULT\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\tPush `${_FILE}`\n\t${CallArtificialFunction} TrimNewLines_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro _TextFunc_TempFileForFile _FILE _RESULT\n\t# XXX replace with GetParent\n\tPush `${_FILE}`\n\tExch $0\n\tPush $1\n\tPush $2\n\n\tStrCpy $2 $0 1 -1\n\tStrCmp $2 '\\' 0 +3\n\tStrCpy $0 $0 -1\n\tgoto -3\n\n\tStrCpy $1 0\n\tIntOp $1 $1 - 1\n\tStrCpy $2 $0 1 $1\n\tStrCmp $2 '\\' +2\n\tStrCmp $2 '' 0 -3\n\tStrCpy $0 $0 $1\n\n\tPop $2\n\tPop $1\n\tExch $0\n\tPop ${_RESULT}\n\t# XXX\n\tStrCmp ${_RESULT} \"\" 0 +2\n\t\tStrCpy ${_RESULT} $EXEDIR\n\tGetTempFileName ${_RESULT} ${_RESULT}\n\tStrCmp ${_RESULT} \"\" 0 +2\n\t\tGetTempFileName ${_RESULT}\n\tClearErrors\n!macroend\n\n!define LineFind `!insertmacro LineFindCall`\n!define un.LineFind `!insertmacro LineFindCall`\n\n!macro LineFind\n!macroend\n\n!macro un.LineFind\n!macroend\n\n!macro LineFind_\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\n\tExch $3\n\tExch\n\tExch $2\n\tExch\n\tExch 2\n\tExch $1\n\tExch 2\n\tExch 3\n\tExch $0\n\tExch 3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $8\n\tPush $9\n\tPush $R4\n\tPush $R5\n\tPush $R6\n\tPush $R7\n\tPush $R8\n\tPush $R9\n\tClearErrors\n\n\tIfFileExists '$0' 0 TextFunc_LineFind_error\n\tStrCmp $1 '/NUL' TextFunc_LineFind_begin\n\tStrCpy $8 0\n\tIntOp $8 $8 - 1\n\tStrCpy $9 $1 1 $8\n\tStrCmp $9 \\ +2\n\tStrCmp $9 '' +3 -3\n\tStrCpy $9 $1 $8\n\tIfFileExists '$9\\*.*' 0 TextFunc_LineFind_error\n\n\tTextFunc_LineFind_begin:\n\tStrCpy $4 1\n\tStrCpy $5 -1\n\tStrCpy $6 0\n\tStrCpy $7 0\n\tStrCpy $R4 ''\n\tStrCpy $R6 ''\n\tStrCpy $R7 ''\n\tStrCpy $R8 0\n\n\tStrCpy $8 $2 1\n\tStrCmp $8 '{' 0 TextFunc_LineFind_delspaces\n\tStrCpy $2 $2 '' 1\n\tStrCpy $8 $2 1 -1\n\tStrCmp $8 '}' 0 TextFunc_LineFind_delspaces\n\tStrCpy $2 $2 -1\n\tStrCpy $R6 TextFunc_LineFind_cut\n\n\tTextFunc_LineFind_delspaces:\n\tStrCpy $8 $2 1\n\tStrCmp $8 ' ' 0 +3\n\tStrCpy $2 $2 '' 1\n\tgoto -3\n\tStrCmp $2$7 '0' TextFunc_LineFind_file\n\tStrCpy $4 ''\n\tStrCpy $5 ''\n\tStrCmp $2 '' TextFunc_LineFind_writechk\n\n\tTextFunc_LineFind_range:\n\tStrCpy $8 0\n\tStrCpy $9 $2 1 $8\n\tStrCmp $9 '' +5\n\tStrCmp $9 ' ' +4\n\tStrCmp $9 ':' +3\n\tIntOp $8 $8 + 1\n\tgoto -5\n\tStrCpy $5 $2 $8\n\tIntOp $5 $5 + 0\n\tIntOp $8 $8 + 1\n\tStrCpy $2 $2 '' $8\n\tStrCmp $4 '' 0 +2\n\tStrCpy $4 $5\n\tStrCmp $9 ':' TextFunc_LineFind_range\n\n\tIntCmp $4 0 0 +2\n\tIntCmp $5 -1 TextFunc_LineFind_goto 0 TextFunc_LineFind_growthcmp\n\tStrCmp $R7 '' 0 TextFunc_LineFind_minus2plus\n\tStrCpy $R7 0\n\tFileOpen $8 $0 r\n\tFileRead $8 $9\n\tIfErrors +3\n\tIntOp $R7 $R7 + 1\n\tGoto -3\n\tFileClose $8\n\n\tTextFunc_LineFind_minus2plus:\n\tIntCmp $4 0 +5 0 +5\n\tIntOp $4 $R7 + $4\n\tIntOp $4 $4 + 1\n\tIntCmp $4 0 +2 0 +2\n\tStrCpy $4 0\n\tIntCmp $5 -1 TextFunc_LineFind_goto 0 TextFunc_LineFind_growthcmp\n\tIntOp $5 $R7 + $5\n\tIntOp $5 $5 + 1\n\tTextFunc_LineFind_growthcmp:\n\tIntCmp $4 $5 TextFunc_LineFind_goto TextFunc_LineFind_goto\n\tStrCpy $5 $4\n\tTextFunc_LineFind_goto:\n\tgoto $7\n\n\tTextFunc_LineFind_file:\n\tStrCmp $1 '/NUL' TextFunc_LineFind_notemp\n\t!insertmacro _TextFunc_TempFileForFile $1 $R4\n\tPush $R4\n\tFileOpen $R4 $R4 w\n\tTextFunc_LineFind_notemp:\n\tFileOpen $R5 $0 r\n\tIfErrors TextFunc_LineFind_preerror\n\n\tTextFunc_LineFind_loop:\n\tIntOp $R8 $R8 + 1\n\tFileRead $R5 $R9\n\tIfErrors TextFunc_LineFind_handleclose\n\n\tTextFunc_LineFind_cmp:\n\tStrCmp $2$4$5 '' TextFunc_LineFind_writechk\n\tIntCmp $4 $R8 TextFunc_LineFind_call 0 TextFunc_LineFind_writechk\n\tStrCmp $5 -1 TextFunc_LineFind_call\n\tIntCmp $5 $R8 TextFunc_LineFind_call 0 TextFunc_LineFind_call\n\n\tGetLabelAddress $7 TextFunc_LineFind_cmp\n\tgoto TextFunc_LineFind_delspaces\n\n\tTextFunc_LineFind_call:\n\tStrCpy $7 $R9\n\tPush $0\n\tPush $1\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $R4\n\tPush $R5\n\tPush $R6\n\tPush $R7\n\tPush $R8\n\tStrCpy $R6 '$4:$5'\n\tStrCmp $R7 '' +3\n\tIntOp $R7 $R8 - $R7\n\tIntOp $R7 $R7 - 1\n\tCall $3\n\tPop $9\n\tPop $R8\n\tPop $R7\n\tPop $R6\n\tPop $R5\n\tPop $R4\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\tIfErrors TextFunc_LineFind_preerror\n\tStrCmp $9 'StopLineFind' 0 +3\n\tIntOp $6 $6 + 1\n\tgoto TextFunc_LineFind_handleclose\n\tStrCmp $1 '/NUL' TextFunc_LineFind_loop\n\tStrCmp $9 'SkipWrite' 0 +3\n\tIntOp $6 $6 + 1\n\tgoto TextFunc_LineFind_loop\n\tStrCmp $7 $R9 TextFunc_LineFind_write\n\tIntOp $6 $6 + 1\n\tgoto TextFunc_LineFind_write\n\n\tTextFunc_LineFind_writechk:\n\tStrCmp $1 '/NUL' TextFunc_LineFind_loop\n\tStrCmp $R6 TextFunc_LineFind_cut 0 TextFunc_LineFind_write\n\tIntOp $6 $6 + 1\n\tgoto TextFunc_LineFind_loop\n\n\tTextFunc_LineFind_write:\n\tFileWrite $R4 $R9\n\tgoto TextFunc_LineFind_loop\n\n\tTextFunc_LineFind_preerror:\n\tSetErrors\n\n\tTextFunc_LineFind_handleclose:\n\tStrCmp $1 '/NUL' +3\n\tFileClose $R4\n\tPop $R4\n\tFileClose $R5\n\tIfErrors TextFunc_LineFind_error\n\n\tStrCmp $1 '/NUL' TextFunc_LineFind_end\n\tStrCmp $1 '' 0 +2\n\tStrCpy $1 $0\n\tStrCmp $6 0 0 TextFunc_LineFind_rename\n\tFileOpen $7 $0 r\n\tFileSeek $7 0 END $8\n\tFileClose $7\n\tFileOpen $7 $R4 r\n\tFileSeek $7 0 END $9\n\tFileClose $7\n\tIntCmp $8 $9 0 TextFunc_LineFind_rename\n\tDelete $R4\n\tStrCmp $1 $0 TextFunc_LineFind_end\n\tCopyFiles /SILENT $0 $1\n\tgoto TextFunc_LineFind_end\n\n\tTextFunc_LineFind_rename:\n\tDelete '$EXEDIR\\$1'\n\tRename $R4 '$EXEDIR\\$1'\n\tIfErrors 0 TextFunc_LineFind_end\n\tDelete $1\n\tRename $R4 $1\n\tIfErrors 0 TextFunc_LineFind_end\n\n\tTextFunc_LineFind_error:\n\tSetErrors\n\n\tTextFunc_LineFind_end:\n\tPop $R9\n\tPop $R8\n\tPop $R7\n\tPop $R6\n\tPop $R5\n\tPop $R4\n\tPop $9\n\tPop $8\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\n\t!verbose pop\n!macroend\n\n!define LineRead `!insertmacro LineReadCall`\n!define un.LineRead `!insertmacro LineReadCall`\n\n!macro LineRead\n!macroend\n\n!macro un.LineRead\n!macroend\n\n!macro LineRead_\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tPush $2\n\tPush $3\n\tPush $4\n\tClearErrors\n\n\tIfFileExists $0 0 TextFunc_LineRead_error\n\tIntOp $1 $1 + 0\n\tIntCmp $1 0 TextFunc_LineRead_error 0 TextFunc_LineRead_plus\n\tStrCpy $4 0\n\tFileOpen $2 $0 r\n\tIfErrors TextFunc_LineRead_error\n\tFileRead $2 $3\n\tIfErrors +3\n\tIntOp $4 $4 + 1\n\tGoto -3\n\tFileClose $2\n\tIntOp $1 $4 + $1\n\tIntOp $1 $1 + 1\n\tIntCmp $1 0 TextFunc_LineRead_error TextFunc_LineRead_error\n\n\tTextFunc_LineRead_plus:\n\tFileOpen $2 $0 r\n\tIfErrors TextFunc_LineRead_error\n\tStrCpy $3 0\n\tIntOp $3 $3 + 1\n\tFileRead $2 $0\n\tIfErrors +4\n\tStrCmp $3 $1 0 -3\n\tFileClose $2\n\tgoto TextFunc_LineRead_end\n\tFileClose $2\n\n\tTextFunc_LineRead_error:\n\tSetErrors\n\tStrCpy $0 ''\n\n\tTextFunc_LineRead_end:\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define FileReadFromEnd `!insertmacro FileReadFromEndCall`\n!define un.FileReadFromEnd `!insertmacro FileReadFromEndCall`\n\n!macro FileReadFromEnd\n!macroend\n\n!macro un.FileReadFromEnd\n!macroend\n\n!macro FileReadFromEnd_\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tPush $7\n\tPush $8\n\tPush $9\n\tClearErrors\n\n\tStrCpy $7 -1\n\tStrCpy $8 0\n\tIfFileExists $0 0 TextFunc_FileReadFromEnd_error\n\tFileOpen $0 $0 r\n\tIfErrors TextFunc_FileReadFromEnd_error\n\tFileRead $0 $9\n\tIfErrors +4\n\tPush $9\n\tIntOp $8 $8 + 1\n\tgoto -4\n\tFileClose $0\n\n\tTextFunc_FileReadFromEnd_nextline:\n\tStrCmp $8 0 TextFunc_FileReadFromEnd_end\n\tPop $9\n\tPush $1\n\tPush $7\n\tPush $8\n\tCall $1\n\tPop $0\n\tPop $8\n\tPop $7\n\tPop $1\n\tIntOp $7 $7 - 1\n\tIntOp $8 $8 - 1\n\tIfErrors TextFunc_FileReadFromEnd_error\n\tStrCmp $0 'StopFileReadFromEnd' TextFunc_FileReadFromEnd_clearstack TextFunc_FileReadFromEnd_nextline\n\n\tTextFunc_FileReadFromEnd_error:\n\tSetErrors\n\n\tTextFunc_FileReadFromEnd_clearstack:\n\tStrCmp $8 0 TextFunc_FileReadFromEnd_end\n\tPop $9\n\tIntOp $8 $8 - 1\n\tgoto TextFunc_FileReadFromEnd_clearstack\n\n\tTextFunc_FileReadFromEnd_end:\n\tPop $9\n\tPop $8\n\tPop $7\n\tPop $1\n\tPop $0\n\n\t!verbose pop\n!macroend\n\n!define LineSum `!insertmacro LineSumCall`\n!define un.LineSum `!insertmacro LineSumCall`\n\n!macro LineSum\n!macroend\n\n!macro un.LineSum\n!macroend\n\n!macro LineSum_\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\n\tExch $0\n\tPush $1\n\tPush $2\n\tClearErrors\n\n\tIfFileExists $0 0 TextFunc_LineSum_error\n\tStrCpy $2 0\n\tFileOpen $0 $0 r\n\tIfErrors TextFunc_LineSum_error\n\tFileRead $0 $1\n\tIfErrors +3\n\tIntOp $2 $2 + 1\n\tGoto -3\n\tFileClose $0\n\tStrCpy $0 $2\n\tgoto TextFunc_LineSum_end\n\n\tTextFunc_LineSum_error:\n\tSetErrors\n\tStrCpy $0 ''\n\n\tTextFunc_LineSum_end:\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define FileJoin `!insertmacro FileJoinCall`\n!define un.FileJoin `!insertmacro FileJoinCall`\n\n!macro FileJoin\n!macroend\n\n!macro un.FileJoin\n!macroend\n\n!macro FileJoin_\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\n\tExch $2\n\tExch\n\tExch $1\n\tExch\n\tExch 2\n\tExch $0\n\tExch 2\n\tPush $3\n\tPush $4\n\tPush $5\n\tClearErrors\n\n\tIfFileExists $0 0 TextFunc_FileJoin_error\n\tIfFileExists $1 0 TextFunc_FileJoin_error\n\tStrCpy $3 0\n\tIntOp $3 $3 - 1\n\tStrCpy $4 $2 1 $3\n\tStrCmp $4 \\ +2\n\tStrCmp $4 '' +3 -3\n\tStrCpy $4 $2 $3\n\tIfFileExists '$4\\*.*' 0 TextFunc_FileJoin_error\n\n\tStrCmp $2 $0 0 +2\n\tStrCpy $2 ''\n\tStrCmp $2 '' 0 +3\n\tStrCpy $4 $0\n\tGoto TextFunc_FileJoin_notemp\n\t!insertmacro _TextFunc_TempFileForFile $2 $4\n\tCopyFiles /SILENT $0 $4\n\tTextFunc_FileJoin_notemp:\n\tFileOpen $3 $4 a\n\tIfErrors TextFunc_FileJoin_error\n\tFileSeek $3 -1 END\n\tFileRead $3 $5\n\tStrCmp $5 '$\\r' +3\n\tStrCmp $5 '$\\n' +2\n\tFileWrite $3 '$\\r$\\n'\n\n\t;FileWrite $3 '$\\r$\\n--Divider--$\\r$\\n'\n\n\tFileOpen $0 $1 r\n\tIfErrors TextFunc_FileJoin_error\n\tFileRead $0 $5\n\tIfErrors +3\n\tFileWrite $3 $5\n\tgoto -3\n\tFileClose $0\n\tFileClose $3\n\tStrCmp $2 '' TextFunc_FileJoin_end\n\tDelete '$EXEDIR\\$2'\n\tRename $4 '$EXEDIR\\$2'\n\tIfErrors 0 TextFunc_FileJoin_end\n\tDelete $2\n\tRename $4 $2\n\tIfErrors 0 TextFunc_FileJoin_end\n\n\tTextFunc_FileJoin_error:\n\tSetErrors\n\n\tTextFunc_FileJoin_end:\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\n\t!verbose pop\n!macroend\n\n!macro TextCompareBody _TEXTFUNC_S\n\tExch $3\n\tExch\n\tExch $2\n\tExch\n\tExch 2\n\tExch $1\n\tExch 2\n\tExch 3\n\tExch $0\n\tExch 3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $8\n\tPush $9\n\tClearErrors\n\n\tIfFileExists $0 0 TextFunc_TextCompare${_TEXTFUNC_S}_error\n\tIfFileExists $1 0 TextFunc_TextCompare${_TEXTFUNC_S}_error\n\tStrCmp $2 'FastDiff' +5\n\tStrCmp $2 'FastEqual' +4\n\tStrCmp $2 'SlowDiff' +3\n\tStrCmp $2 'SlowEqual' +2\n\tgoto TextFunc_TextCompare${_TEXTFUNC_S}_error\n\n\tFileOpen $4 $0 r\n\tIfErrors TextFunc_TextCompare${_TEXTFUNC_S}_error\n\tFileOpen $5 $1 r\n\tIfErrors TextFunc_TextCompare${_TEXTFUNC_S}_error\n\tSetDetailsPrint textonly\n\n\tStrCpy $6 0\n\tStrCpy $8 0\n\n\tTextFunc_TextCompare${_TEXTFUNC_S}_nextline:\n\tStrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_fast\n\tIntOp $8 $8 + 1\n\tFileRead $4 $9\n\tIfErrors 0 +4\n\tFileClose $4\n\tStrCpy $4 ''\n\tStrCmp${_TEXTFUNC_S} $5 '' TextFunc_TextCompare${_TEXTFUNC_S}_end\n\tStrCmp $2 'FastDiff' TextFunc_TextCompare${_TEXTFUNC_S}_fast\n\tStrCmp $2 'FastEqual' TextFunc_TextCompare${_TEXTFUNC_S}_fast TextFunc_TextCompare${_TEXTFUNC_S}_slow\n\n\tTextFunc_TextCompare${_TEXTFUNC_S}_fast:\n\tStrCmp${_TEXTFUNC_S} $5 '' TextFunc_TextCompare${_TEXTFUNC_S}_call\n\tIntOp $6 $6 + 1\n\tFileRead $5 $7\n\tIfErrors 0 +5\n\tFileClose $5\n\tStrCpy $5 ''\n\tStrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_end\n\tStrCmp $2 'FastDiff' TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_close\n\tStrCmp $2 'FastDiff' 0 +2\n\tStrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_nextline TextFunc_TextCompare${_TEXTFUNC_S}_call\n\tStrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_nextline\n\n\tTextFunc_TextCompare${_TEXTFUNC_S}_slow:\n\tStrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_close\n\tStrCpy $6 ''\n\tDetailPrint '$8. $9'\n\tFileSeek $5 0\n\n\tTextFunc_TextCompare${_TEXTFUNC_S}_slownext:\n\tFileRead $5 $7\n\tIfErrors 0 +2\n\tStrCmp $2 'SlowDiff' TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_nextline\n\tStrCmp $2 'SlowDiff' 0 +2\n\tStrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_nextline TextFunc_TextCompare${_TEXTFUNC_S}_slownext\n\tIntOp $6 $6 + 1\n\tStrCmp${_TEXTFUNC_S} $7 $9 0 TextFunc_TextCompare${_TEXTFUNC_S}_slownext\n\n\tTextFunc_TextCompare${_TEXTFUNC_S}_call:\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $8\n\tPush $9\n\tCall $3\n\tPop $0\n\tPop $9\n\tPop $8\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tStrCmp $0 'StopTextCompare' 0 TextFunc_TextCompare${_TEXTFUNC_S}_nextline\n\n\tTextFunc_TextCompare${_TEXTFUNC_S}_close:\n\tFileClose $4\n\tFileClose $5\n\tgoto TextFunc_TextCompare${_TEXTFUNC_S}_end\n\n\tTextFunc_TextCompare${_TEXTFUNC_S}_error:\n\tSetErrors\n\n\tTextFunc_TextCompare${_TEXTFUNC_S}_end:\n\tSetDetailsPrint both\n\tPop $9\n\tPop $8\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n!macroend\n\n!define TextCompare `!insertmacro TextCompareCall`\n!define un.TextCompare `!insertmacro TextCompareCall`\n\n!macro TextCompare\n!macroend\n\n!macro un.TextCompare\n!macroend\n\n!macro TextCompare_\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\n\t!insertmacro TextCompareBody ''\n\n\t!verbose pop\n!macroend\n\n!define TextCompareS `!insertmacro TextCompareSCall`\n!define un.TextCompareS `!insertmacro TextCompareSCall`\n\n!macro TextCompareS\n!macroend\n\n!macro un.TextCompareS\n!macroend\n\n!macro TextCompareS_\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\n\t!insertmacro TextCompareBody 'S'\n\n\t!verbose pop\n!macroend\n\n!macro ConfigReadBody _TEXTFUNC_S\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tPush $2\n\tPush $3\n\tPush $4\n\tClearErrors\n\n\tFileOpen $2 $0 r\n\tIfErrors TextFunc_ConfigRead${_TEXTFUNC_S}_error\n\tStrLen $0 $1\n\tStrCmp${_TEXTFUNC_S} $0 0 TextFunc_ConfigRead${_TEXTFUNC_S}_error\n\n\tTextFunc_ConfigRead${_TEXTFUNC_S}_readnext:\n\tFileRead $2 $3\n\tIfErrors TextFunc_ConfigRead${_TEXTFUNC_S}_error\n\tStrCpy $4 $3 $0\n\tStrCmp${_TEXTFUNC_S} $4 $1 0 TextFunc_ConfigRead${_TEXTFUNC_S}_readnext\n\tStrCpy $0 $3 '' $0\n\tStrCpy $4 $0 1 -1\n\tStrCmp${_TEXTFUNC_S} $4 '$\\r' +2\n\tStrCmp${_TEXTFUNC_S} $4 '$\\n' 0 TextFunc_ConfigRead${_TEXTFUNC_S}_close\n\tStrCpy $0 $0 -1\n\tgoto -4\n\n\tTextFunc_ConfigRead${_TEXTFUNC_S}_error:\n\tSetErrors\n\tStrCpy $0 ''\n\n\tTextFunc_ConfigRead${_TEXTFUNC_S}_close:\n\tFileClose $2\n\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tExch $0\n!macroend\n\n!define ConfigRead `!insertmacro ConfigReadCall`\n!define un.ConfigRead `!insertmacro ConfigReadCall`\n\n!macro ConfigRead\n!macroend\n\n!macro un.ConfigRead\n!macroend\n\n!macro ConfigRead_\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\n\t!insertmacro ConfigReadBody ''\n\n\t!verbose pop\n!macroend\n\n!define ConfigReadS `!insertmacro ConfigReadSCall`\n!define un.ConfigReadS `!insertmacro ConfigReadSCall`\n\n!macro ConfigReadS\n!macroend\n\n!macro un.ConfigReadS\n!macroend\n\n!macro ConfigReadS_\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\n\t!insertmacro ConfigReadBody 'S'\n\n\t!verbose pop\n!macroend\n\n!macro ConfigWriteBody _TEXTFUNC_S\n\tExch $2\n\tExch\n\tExch $1\n\tExch\n\tExch 2\n\tExch $0\n\tExch 2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tClearErrors\n\n\tIfFileExists $0 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_error\n\tFileOpen $3 $0 a\n\tIfErrors TextFunc_ConfigWrite${_TEXTFUNC_S}_error\n\n\tStrLen $0 $1\n\tStrCmp${_TEXTFUNC_S} $0 0 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext\n\tStrCpy $0 ''\n\tgoto TextFunc_ConfigWrite${_TEXTFUNC_S}_close\n\n\tTextFunc_ConfigWrite${_TEXTFUNC_S}_readnext:\n\tFileRead $3 $4\n\tIfErrors TextFunc_ConfigWrite${_TEXTFUNC_S}_add\n\tStrCpy $5 $4 $0\n\tStrCmp${_TEXTFUNC_S} $5 $1 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext\n\n\tStrCpy $5 0\n\tIntOp $5 $5 - 1\n\tStrCpy $6 $4 1 $5\n\tStrCmp${_TEXTFUNC_S} $6 '$\\r' -2\n\tStrCmp${_TEXTFUNC_S} $6 '$\\n' -3\n\tStrCpy $6 $4\n\tStrCmp${_TEXTFUNC_S} $5 -1 +3\n\tIntOp $5 $5 + 1\n\tStrCpy $6 $4 $5\n\n\tStrCmp${_TEXTFUNC_S} $2 '' TextFunc_ConfigWrite${_TEXTFUNC_S}_change\n\tStrCmp${_TEXTFUNC_S} $6 '$1$2' 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_change\n\tStrCpy $0 SAME\n\tgoto TextFunc_ConfigWrite${_TEXTFUNC_S}_close\n\n\tTextFunc_ConfigWrite${_TEXTFUNC_S}_change:\n\tFileSeek $3 0 CUR $5\n\tStrLen $4 $4\n\tIntOp $4 $5 - $4\n\tFileSeek $3 0 END $6\n\tIntOp $6 $6 - $5\n\n\tSystem::Alloc $6\n\tPop $0\n\tFileSeek $3 $5 SET\n\tSystem::Call 'kernel32::ReadFile(i r3, i r0, i $6, t.,)'\n\tFileSeek $3 $4 SET\n\tStrCmp${_TEXTFUNC_S} $2 '' +2\n\tFileWrite $3 '$1$2$\\r$\\n'\n\tSystem::Call 'kernel32::WriteFile(i r3, i r0, i $6, t.,)'\n\tSystem::Call 'kernel32::SetEndOfFile(i r3)'\n\tSystem::Free $0\n\tStrCmp${_TEXTFUNC_S} $2 '' +3\n\tStrCpy $0 CHANGED\n\tgoto TextFunc_ConfigWrite${_TEXTFUNC_S}_close\n\tStrCpy $0 DELETED\n\tgoto TextFunc_ConfigWrite${_TEXTFUNC_S}_close\n\n\tTextFunc_ConfigWrite${_TEXTFUNC_S}_add:\n\tStrCmp${_TEXTFUNC_S} $2 '' 0 +3\n\tStrCpy $0 SAME\n\tgoto TextFunc_ConfigWrite${_TEXTFUNC_S}_close\n\tFileSeek $3 -1 END\n\tFileRead $3 $4\n\tIfErrors +4\n\tStrCmp${_TEXTFUNC_S} $4 '$\\r' +3\n\tStrCmp${_TEXTFUNC_S} $4 '$\\n' +2\n\tFileWrite $3 '$\\r$\\n'\n\tFileWrite $3 '$1$2$\\r$\\n'\n\tStrCpy $0 ADDED\n\n\tTextFunc_ConfigWrite${_TEXTFUNC_S}_close:\n\tFileClose $3\n\tgoto TextFunc_ConfigWrite${_TEXTFUNC_S}_end\n\n\tTextFunc_ConfigWrite${_TEXTFUNC_S}_error:\n\tSetErrors\n\tStrCpy $0 ''\n\n\tTextFunc_ConfigWrite${_TEXTFUNC_S}_end:\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tExch $0\n!macroend\n\n!define ConfigWrite `!insertmacro ConfigWriteCall`\n!define un.ConfigWrite `!insertmacro ConfigWriteCall`\n\n!macro ConfigWrite\n!macroend\n\n!macro un.ConfigWrite\n!macroend\n\n!macro ConfigWrite_\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\n\t!insertmacro ConfigWriteBody ''\n\n\t!verbose pop\n!macroend\n\n!define ConfigWriteS `!insertmacro ConfigWriteSCall`\n!define un.ConfigWriteS `!insertmacro ConfigWriteSCall`\n\n!macro ConfigWriteS\n!macroend\n\n!macro un.ConfigWriteS\n!macroend\n\n!macro ConfigWriteS_\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\n\t!insertmacro ConfigWriteBody 'S'\n\n\t!verbose pop\n!macroend\n\n!define FileRecode `!insertmacro FileRecodeCall`\n!define un.FileRecode `!insertmacro FileRecodeCall`\n\n!macro FileRecode\n!macroend\n\n!macro un.FileRecode\n!macroend\n\n!macro FileRecode_\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tPush $2\n\tPush $3\n\tPush $4\n\n\tIfFileExists $0 0 TextFunc_FileRecode_error\n\tStrCmp $1 OemToChar +2\n\tStrCmp $1 CharToOem 0 TextFunc_FileRecode_error\n\n\tFileOpen $2 $0 a\n\tFileSeek $2 0 END $3\n\tSystem::Alloc $3\n\tPop $4\n\tFileSeek $2 0 SET\n\tSystem::Call 'kernel32::ReadFile(i r2, i r4, i $3, t.,)'\n\tSystem::Call 'user32::$1Buff(i r4, i r4, i $3)'\n\tFileSeek $2 0 SET\n\tSystem::Call 'kernel32::WriteFile(i r2, i r4, i $3, t.,)'\n\tSystem::Free $4\n\tFileClose $2\n\tgoto TextFunc_FileRecode_end\n\n\tTextFunc_FileRecode_error:\n\tSetErrors\n\n\tTextFunc_FileRecode_end:\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\n\t!verbose pop\n!macroend\n\n!define TrimNewLines `!insertmacro TrimNewLinesCall`\n!define un.TrimNewLines `!insertmacro TrimNewLinesCall`\n\n!macro TrimNewLines\n!macroend\n\n!macro un.TrimNewLines\n!macroend\n\n!macro TrimNewLines_\n\t!verbose push\n\t!verbose ${_TEXTFUNC_VERBOSE}\n\n\tExch $0\n\tPush $1\n\tPush $2\n\n\tStrCpy $1 0\n\tIntOp $1 $1 - 1\n\tStrCpy $2 $0 1 $1\n\tStrCmp $2 '$\\r' -2\n\tStrCmp $2 '$\\n' -3\n\tStrCmp $1 -1 +3\n\tIntOp $1 $1 + 1\n\tStrCpy $0 $0 $1\n\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/UpgradeDLL.nsh",
    "content": "/*\n\nNOTE:\n-----\nThis macro is provided for backwards compatibility with NSIS 2.0 scripts.\nIt's recommended you update your scripts to use the new Library.nsh macros.\n\n\nMacro - Upgrade DLL File\nWritten by Joost Verburg\n------------------------\n\nParameters:\nLOCALFILE\t\tLocation of the new DLL file (on the compiler system)\nDESTFILE\t\tLocation of the DLL file that should be upgraded (on the user's system)\nTEMPBASEDIR\t\tDirectory on the user's system to store a temporary file when the system has\n\t\t\t\tto be rebooted.\n\t\t\t\tFor Win9x/ME support, this should be on the same volume as DESTFILE.\n\t\t\t\tThe Windows temp directory could be located on any volume, so you cannot use\n\t\t\t\tthis directory.\n\nDefine UPGRADEDLL_NOREGISTER if you want to upgrade a DLL that does not have to be registered.\n\nNotes:\n\n* If you want to support Windows 9x/ME, you can only use short filenames (8.3).\n\n* This macro uses the GetDLLVersionLocal command to retrieve the version of local libraries.\n  This command is only supported when compiling on a Windows system.\n\n------------------------\n\nExample:\n\n!insertmacro UpgradeDLL \"dllname.dll\" \"$SYSDIR\\dllname.dll\" \"$SYSDIR\"\n\n*/\n\n!ifndef UPGRADEDLL_INCLUDED\n\n!define UPGRADEDLL_INCLUDED\n\n!macro __UpgradeDLL_Helper_AddRegToolEntry mode filename tempdir\n\n  Push $R0\n  Push $R1\n  Push $R2\n  Push $R3\n\n  ;------------------------\n  ;Copy the parameters\n\n  Push \"${filename}\"\n  Push \"${tempdir}\"\n\n  Pop $R2 ; temporary directory\n  Pop $R1 ; file name to register\n\n  ;------------------------\n  ;Advance counter\n\n  StrCpy $R0 0\n  ReadRegDWORD $R0 HKLM \"Software\\NSIS.Library.RegTool.v2\\UpgradeDLLSession\" \"count\"\n  IntOp $R0 $R0 + 1\n  WriteRegDWORD HKLM \"Software\\NSIS.Library.RegTool.v2\\UpgradeDLLSession\" \"count\" \"$R0\"\n\n  ;------------------------\n  ;Setup RegTool\n\n  ReadRegStr $R3 HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce\" \"NSIS.Library.RegTool.v2\"\n  StrCpy $R3 $R3 -4 1\n  IfFileExists $R3 +3\n\n    File /oname=$R2\\NSIS.Library.RegTool.v2.$HWNDPARENT.exe \"${NSISDIR}\\Bin\\RegTool.bin\"\n    WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce\" \\\n      \"NSIS.Library.RegTool.v2\" '\"$R2\\NSIS.Library.RegTool.v2.$HWNDPARENT.exe\" /S'\n\n  ;------------------------\n  ;Add RegTool entry\n\n  WriteRegStr HKLM \"Software\\NSIS.Library.RegTool.v2\\UpgradeDLLSession\" \"$R0.file\" \"$R1\"\n  WriteRegStr HKLM \"Software\\NSIS.Library.RegTool.v2\\UpgradeDLLSession\" \"$R0.mode\" \"${mode}\"\n\n  Pop $R3\n  Pop $R2\n  Pop $R1\n  Pop $R0\n\n!macroend\n\n!macro UpgradeDLL LOCALFILE DESTFILE TEMPBASEDIR\n\n  Push $R0\n  Push $R1\n  Push $R2\n  Push $R3\n  Push $R4\n  Push $R5\n\n  !define UPGRADEDLL_UNIQUE \"${__FILE__}${__LINE__}\"\n\n  SetOverwrite try\n\n  ;------------------------\n  ;Copy the parameters used on run-time to a variable\n  ;This allows the usage of variables as paramter\n\n  StrCpy $R4 \"${DESTFILE}\"\n  StrCpy $R5 \"${TEMPBASEDIR}\"\n\n  ;------------------------\n  ;Get version information\n\n  IfFileExists $R4 0 \"upgradedll.copy_${UPGRADEDLL_UNIQUE}\"\n\n  ClearErrors\n    GetDLLVersionLocal \"${LOCALFILE}\" $R0 $R1\n    GetDLLVersion $R4 $R2 $R3\n  IfErrors \"upgradedll.upgrade_${UPGRADEDLL_UNIQUE}\"\n\n  IntCmpU $R0 $R2 0 \"upgradedll.done_${UPGRADEDLL_UNIQUE}\" \"upgradedll.upgrade_${UPGRADEDLL_UNIQUE}\"\n  IntCmpU $R1 $R3 \"upgradedll.done_${UPGRADEDLL_UNIQUE}\" \"upgradedll.done_${UPGRADEDLL_UNIQUE}\" \\\n    \"upgradedll.upgrade_${UPGRADEDLL_UNIQUE}\"\n\n  ;------------------------\n  ;Upgrade\n\n  \"upgradedll.upgrade_${UPGRADEDLL_UNIQUE}:\"\n    !ifndef UPGRADEDLL_NOREGISTER\n      ;Unregister the DLL\n      UnRegDLL $R4\n    !endif\n\n  ;------------------------\n  ;Copy\n\n  ClearErrors\n    StrCpy $R0 $R4\n    Call \":upgradedll.file_${UPGRADEDLL_UNIQUE}\"\n  IfErrors 0 \"upgradedll.noreboot_${UPGRADEDLL_UNIQUE}\"\n\n  ;------------------------\n  ;Copy on reboot\n\n  GetTempFileName $R0 $R5\n    Call \":upgradedll.file_${UPGRADEDLL_UNIQUE}\"\n  Rename /REBOOTOK $R0 $R4\n\n  ;------------------------\n  ;Register on reboot\n\n  !insertmacro __UpgradeDLL_Helper_AddRegToolEntry 'D' $R4 $R5\n\n  Goto \"upgradedll.done_${UPGRADEDLL_UNIQUE}\"\n\n  ;------------------------\n  ;DLL does not exist\n\n  \"upgradedll.copy_${UPGRADEDLL_UNIQUE}:\"\n    StrCpy $R0 $R4\n    Call \":upgradedll.file_${UPGRADEDLL_UNIQUE}\"\n\n  ;------------------------\n  ;Register\n\n  \"upgradedll.noreboot_${UPGRADEDLL_UNIQUE}:\"\n    !ifndef UPGRADEDLL_NOREGISTER\n      RegDLL $R4\n    !endif\n\n  ;------------------------\n  ;Done\n\n  \"upgradedll.done_${UPGRADEDLL_UNIQUE}:\"\n\n  Pop $R5\n  Pop $R4\n  Pop $R3\n  Pop $R2\n  Pop $R1\n  Pop $R0\n\n  ;------------------------\n  ;End\n\n  Goto \"upgradedll.end_${UPGRADEDLL_UNIQUE}\"\n\n  ;------------------------\n  ;Extract\n\n  \"upgradedll.file_${UPGRADEDLL_UNIQUE}:\"\n    File /oname=$R0 \"${LOCALFILE}\"\n    Return\n\n  \"upgradedll.end_${UPGRADEDLL_UNIQUE}:\"\n\n  SetOverwrite lastused\n  \n  !undef UPGRADEDLL_UNIQUE\n\n!macroend\n\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/Util.nsh",
    "content": "; ---------------------\n;       Util.nsh\n; ---------------------\n;\n; Voodoo macros to make end-user usage easier. This may be documented someday.\n\n!verbose push\n!verbose 3\n\n!ifndef ___UTIL__NSH___\n!define ___UTIL__NSH___\n\n# see WinVer.nsh and *Func.nsh for usage examples\n!macro CallArtificialFunction NAME\n  !ifndef __UNINSTALL__\n    !define CallArtificialFunction_TYPE inst\n  !else\n    !define CallArtificialFunction_TYPE uninst\n  !endif\n  Call :.${NAME}${CallArtificialFunction_TYPE}\n  !ifndef ${NAME}${CallArtificialFunction_TYPE}_DEFINED\n    Goto ${NAME}${CallArtificialFunction_TYPE}_DONE\n    !define ${NAME}${CallArtificialFunction_TYPE}_DEFINED\n    .${NAME}${CallArtificialFunction_TYPE}:\n      !insertmacro ${NAME}\n    Return\n    ${NAME}${CallArtificialFunction_TYPE}_DONE:\n  !endif\n  !undef CallArtificialFunction_TYPE\n!macroend\n!define CallArtificialFunction `!insertmacro CallArtificialFunction`\n\n# for usage of artificial functions inside artificial functions\n# macro recursion is prohibited\n!macro CallArtificialFunction2 NAME\n  !ifndef __UNINSTALL__\n    !define CallArtificialFunction2_TYPE inst\n  !else\n    !define CallArtificialFunction2_TYPE uninst\n  !endif\n  Call :.${NAME}${CallArtificialFunction2_TYPE}\n  !ifndef ${NAME}${CallArtificialFunction2_TYPE}_DEFINED\n    Goto ${NAME}${CallArtificialFunction2_TYPE}_DONE\n    !define ${NAME}${CallArtificialFunction2_TYPE}_DEFINED\n    .${NAME}${CallArtificialFunction2_TYPE}:\n      !insertmacro ${NAME}\n    Return\n    ${NAME}${CallArtificialFunction2_TYPE}_DONE:\n  !endif\n  !undef CallArtificialFunction2_TYPE\n!macroend\n!define CallArtificialFunction2 `!insertmacro CallArtificialFunction2`\n\n!endif # !___UTIL__NSH___\n\n!verbose pop\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/VB6RunTime.nsh",
    "content": "/*\n\nVB6RunTime.nsh\n\nSetup of Visual Basic 6.0 run-time files, including the Oleaut32.dll security update\n\nCopyright 2008-2009 Joost Verburg\n\nTo obtain the run-time files, download and extract\nhttp://nsis.sourceforge.net/vb6runtime.zip\n\nScript code for installation:\n\n!insertmacro InstallVB6RunTime FOLDER ALREADY_INSTALLED\n\nin which FOLDER is the location of the run-time files and ALREADY_INSTALLED is the\nname of a variable that is empty when the application is installed for the first time\nand non-empty otherwise\n\nScript code for uninstallation:\n\n!insertmacro UnInstallVB6RunTime\n\nRemarks:\n\n* You may have to install additional files for such Visual Basic application to work,\n  such as OCX files for user interface controls.\n  \n* Installation of the run-time files requires Administrator or Power User privileges.\n  Use the Multi-User header file to verify whether these privileges are available.\n\n* Add a Modern UI finish page or another check (see IfRebootFlag in the NSIS Users\n  Manual) to allow the user to restart the computer when necessary.\n\n*/\n\n!ifndef VB6_INCLUDED\n!define VB6_INCLUDED\n!verbose push\n!verbose 3\n\n!include Library.nsh\n!include WinVer.nsh\n\n!macro VB6RunTimeInstall FOLDER ALREADY_INSTALLED\n\n  !insertmacro InstallLib REGDLL \"${ALREADY_INSTALLED}\" REBOOT_PROTECTED \"${FOLDER}\\msvbvm60.dll\" \"$SYSDIR\\msvbvm60.dll\" \"$SYSDIR\"\n  \n  ;The files below will only be installed on Win9x/NT4\n  \n  !insertmacro InstallLib REGDLL \"${ALREADY_INSTALLED}\" REBOOT_PROTECTED    \"${FOLDER}\\olepro32.dll\" \"$SYSDIR\\olepro32.dll\" \"$SYSDIR\"\n  !insertmacro InstallLib REGDLL \"${ALREADY_INSTALLED}\" REBOOT_PROTECTED    \"${FOLDER}\\comcat.dll\"   \"$SYSDIR\\comcat.dll\"   \"$SYSDIR\"\n  !insertmacro InstallLib DLL    \"${ALREADY_INSTALLED}\" REBOOT_PROTECTED    \"${FOLDER}\\asycfilt.dll\" \"$SYSDIR\\asycfilt.dll\" \"$SYSDIR\"\n  !insertmacro InstallLib TLB    \"${ALREADY_INSTALLED}\" REBOOT_PROTECTED    \"${FOLDER}\\stdole2.tlb\"  \"$SYSDIR\\stdole2.tlb\"  \"$SYSDIR\"\n  \n  Push $R0\n  \n  ${if} ${IsNT}\n    ${if} ${IsWinNT4}\n      ReadRegStr $R0 HKLM \"System\\CurrentControlSet\\Control\" \"ProductOptions\"\n      ${if} $R0 == \"Terminal Server\"\n        !insertmacro InstallLib REGDLL \"${ALREADY_INSTALLED}\" REBOOT_NOTPROTECTED \"${FOLDER}\\NT4TS\\oleaut32.dll\" \"$SYSDIR\\oleaut32.dll\" \"$SYSDIR\"\n      ${else}\n        !insertmacro InstallLib REGDLL \"${ALREADY_INSTALLED}\" REBOOT_NOTPROTECTED \"${FOLDER}\\NT4\\oleaut32.dll\" \"$SYSDIR\\oleaut32.dll\" \"$SYSDIR\"\n      ${endif}\n    ${endif}\n  ${else}\n    ;No Oleaut32.dll with the security update has been released for Windows 9x.\n    ;The NT4 version is used because NT4 and Win9x used to share the same 2.40 version\n    ;and version 2.40.4519.0 is reported to work fine on Win9x.\n    !insertmacro InstallLib REGDLL \"${ALREADY_INSTALLED}\" REBOOT_NOTPROTECTED \"${FOLDER}\\NT4\\oleaut32.dll\" \"$SYSDIR\\oleaut32.dll\" \"$SYSDIR\"\n  ${endif}\n  \n  Pop $R0\n\n!macroend\n\n!macro VB6RunTimeUnInstall\n\n   !insertmacro UnInstallLib REGDLL SHARED NOREMOVE \"$SYSDIR\\msvbvm60.dll\"\n   !insertmacro UnInstallLib REGDLL SHARED NOREMOVE \"$SYSDIR\\oleaut32.dll\"\n   !insertmacro UnInstallLib REGDLL SHARED NOREMOVE \"$SYSDIR\\olepro32.dll\"\n   !insertmacro UnInstallLib REGDLL SHARED NOREMOVE \"$SYSDIR\\comcat.dll\"\n   !insertmacro UnInstallLib DLL    SHARED NOREMOVE \"$SYSDIR\\asycfilt.dll\"\n   !insertmacro UnInstallLib TLB    SHARED NOREMOVE \"$SYSDIR\\stdole2.tlb\"\n\n!macroend\n\n!verbose pop\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/VPatchLib.nsh",
    "content": "; PatchLib v3.0\n; =============\n;\n; Library with macro for use with VPatch (DLL version) in NSIS 2.0.5+\n; Created by Koen van de Sande\n\n!include LogicLib.nsh\n\n!macro VPatchFile PATCHDATA SOURCEFILE TEMPFILE\n\n  Push $1\n  Push $2\n  Push $3\n  Push $4\n\n  Push ${SOURCEFILE}\n  Push ${TEMPFILE}\n\n  Pop $2 # temp file\n  Pop $3 # source file\n\n  InitPluginsDir\n  GetTempFileName $1 $PLUGINSDIR\n  File /oname=$1 ${PATCHDATA}\n\n  vpatch::vpatchfile $1 $3 $2\n  Pop $4\n  DetailPrint $4\n\n  StrCpy $4 $4 2\n  ${Unless} $4 == \"OK\"\n    SetErrors\n  ${EndIf}\n\n  ${If} ${FileExists} $2\n    Delete $3\n    Rename /REBOOTOK $2 $3\n  ${EndIf}\n\n  Delete $1\n\n  Pop $4\n  Pop $3\n  Pop $2\n  Pop $1\n\n!macroend\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/Win/WinDef.nsh",
    "content": "!ifndef __WIN_WINDEF__INC\n!define __WIN_WINDEF__INC\n!verbose push\n!verbose 3\n!ifndef __WIN_NOINC_WINDEF\n\n\n!ifndef MAX_PATH\n!define MAX_PATH 260\n!endif\n#define NULL 0\n\n\n!macro _Win_MINMAX _intcmp _j1 _j2 _outvar _a _b\n${_intcmp} \"${_a}\" \"${_b}\" ${_j1} ${_j1} ${_j2}\nStrCpy ${_outvar} \"${_a}\"\ngoto +2\nStrCpy ${_outvar} \"${_b}\"\n!macroend\n!ifndef __WIN_MS_NOMINMAX & min & max & min_u & max_u\n!define min \"!insertmacro _Win_MINMAX IntCmp +1 +3 \"\n!define max \"!insertmacro _Win_MINMAX IntCmp +3 +1 \"\n!define min_u \"!insertmacro _Win_MINMAX IntCmpU +1 +3 \"\n!define max_u \"!insertmacro _Win_MINMAX IntCmpU +3 +1 \"\n!endif\n\n!macro _Win_LOBYTE _outvar _in\nIntOp ${_outvar} \"${_in}\" & 0xFF\n!macroend\n!define LOBYTE \"!insertmacro _Win_LOBYTE \"\n\n!macro _Win_HIBYTE _outvar _in\nIntOp ${_outvar} \"${_in}\" >> 8\n${LOBYTE} ${_outvar} ${_outvar}\n!macroend\n!define HIBYTE \"!insertmacro _Win_HIBYTE \"\n\n!macro _Win_LOWORD _outvar _in\nIntOp ${_outvar} \"${_in}\" & 0xFFFF\n!macroend\n!define LOWORD \"!insertmacro _Win_LOWORD \"\n\n!macro _Win_HIWORD _outvar _in\nIntOp ${outvar} \"${_in}\" >> 16 ;sign extended :(\n${LOWORD} ${_outvar} ${outvar} ;make sure we strip off the upper word\n!macroend\n!define HIWORD \"!insertmacro _Win_HIWORD \"\n\n!macro _Win_MAKEWORD _outvar _tmpvar _lo _hi\n${LOBYTE} ${_outvar} \"${_hi}\"\n${LOBYTE} ${_tmpvar} \"${_lo}\"\nIntOp ${_outvar} ${_outvar} << 8\nIntOp ${_outvar} ${_outvar} | ${_tmpvar}\n!macroend\n!define MAKEWORD \"!insertmacro _Win_MAKEWORD \"\n\n!macro _Win_MAKELONG32 _outvar _tmpvar _wlo _whi\n${LOWORD} ${_outvar} \"${_wlo}\"\nIntOp ${_tmpvar} \"${_whi}\" << 16\nIntOp ${_outvar} ${_outvar} | ${_tmpvar}\n!macroend\n!define MAKELONG \"!insertmacro _Win_MAKELONG32 \"\n!if \"${__WIN_PTRSIZE}\" <= 4\n!define MAKEWPARAM \"${MAKELONG}\"\n!define MAKELPARAM \"${MAKELONG}\"\n!define MAKELRESULT \"${MAKELONG}\"\n!else\n!error \"Missing 64bit imp!\"\n!endif\n\n\n!endif /* __WIN_NOINC_WINDEF */\n!verbose pop\n!endif /* __WIN_WINDEF__INC */"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/Win/WinError.nsh",
    "content": "!ifndef __WIN_WINERROR__INC\n!define __WIN_WINERROR__INC\n!verbose push\n!verbose 3\n!ifndef __WIN_NOINC_WINERROR\n\n#define NO_ERROR 0\n!define ERROR_SUCCESS                 0\n!define ERROR_INVALID_FUNCTION        1    \n!define ERROR_FILE_NOT_FOUND          2\n!define ERROR_PATH_NOT_FOUND          3\n!define ERROR_TOO_MANY_OPEN_FILES     4\n!define ERROR_ACCESS_DENIED           5\n!define ERROR_INVALID_HANDLE          6\n!define ERROR_ARENA_TRASHED           7\n!define ERROR_NOT_ENOUGH_MEMORY       8    \n!define ERROR_INVALID_BLOCK           9\n!define ERROR_BAD_ENVIRONMENT         10\n!define ERROR_BAD_FORMAT              11\n!define ERROR_INVALID_ACCESS          12\n!define ERROR_INVALID_DATA            13\n!define ERROR_OUTOFMEMORY             14\n!define ERROR_INVALID_DRIVE           15\n!define ERROR_CURRENT_DIRECTORY       16\n!define ERROR_NOT_SAME_DEVICE         17\n!define ERROR_NO_MORE_FILES           18\n!define ERROR_WRITE_PROTECT           19\n!define ERROR_BAD_UNIT                20\n!define ERROR_NOT_READY               21\n!define ERROR_BAD_COMMAND             22\n!define ERROR_CRC                     23\n!define ERROR_BAD_LENGTH              24\n!define ERROR_SEEK                    25\n!define ERROR_NOT_DOS_DISK            26\n!define ERROR_SECTOR_NOT_FOUND        27\n!define ERROR_OUT_OF_PAPER            28\n!define ERROR_WRITE_FAULT             29\n!define ERROR_READ_FAULT              30\n!define ERROR_GEN_FAILURE             31\n!define ERROR_SHARING_VIOLATION       32\n!define ERROR_LOCK_VIOLATION          33\n!define ERROR_WRONG_DISK              34\n!define ERROR_SHARING_BUFFER_EXCEEDED 36\n!define ERROR_HANDLE_EOF              38\n!define ERROR_HANDLE_DISK_FULL        39\n!define ERROR_NOT_SUPPORTED           50\n\n!define SEVERITY_SUCCESS 0\n!define SEVERITY_ERROR   1\n!define E_UNEXPECTED   0x8000FFFF\n!define E_NOTIMPL      0x80004001\n!define E_OUTOFMEMORY  0x8007000E\n!define E_INVALIDARG   0x80070057\n!define E_NOINTERFACE  0x80004002\n!define E_POINTER      0x80004003\n!define E_HANDLE       0x80070006\n!define E_ABORT        0x80004004\n!define E_FAIL         0x80004005\n!define E_ACCESSDENIED 0x80070005\n!define E_PENDING      0x8000000A\n\n!endif /* __WIN_NOINC_WINERROR */\n!verbose pop\n!endif /* __WIN_WINERROR__INC */"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/Win/WinNT.nsh",
    "content": "!ifndef __WIN_WINNT__INC\n!define __WIN_WINNT__INC\n!verbose push\n!verbose 3\n!ifndef __WIN_NOINC_WINNT\n\n\n#define MINCHAR  0x80        \n#define MAXCHAR  0x7f        \n!define MINSHORT 0x8000      \n!define MAXSHORT 0x7fff      \n!define MINLONG  0x80000000  \n!define MAXLONG  0x7fffffff  \n!define MAXBYTE  0xff        \n!define MAXWORD  0xffff      \n!define MAXDWORD 0xffffffff  \n\n!ifndef WIN32_NO_STATUS \n!define STATUS_WAIT_0                    0x00000000\n!define STATUS_ABANDONED_WAIT_0          0x00000080\n!define STATUS_USER_APC                  0x000000C0\n!define STATUS_TIMEOUT                   0x00000102\n!define STATUS_PENDING                   0x00000103\n!define DBG_EXCEPTION_HANDLED            0x00010001\n!define DBG_CONTINUE                     0x00010002\n!define STATUS_SEGMENT_NOTIFICATION      0x40000005\n!define DBG_TERMINATE_THREAD             0x40010003\n!define DBG_TERMINATE_PROCESS            0x40010004\n!define DBG_CONTROL_C                    0x40010005\n!define DBG_CONTROL_BREAK                0x40010008\n!define DBG_COMMAND_EXCEPTION            0x40010009\n!define STATUS_GUARD_PAGE_VIOLATION      0x80000001\n!define STATUS_DATATYPE_MISALIGNMENT     0x80000002\n!define STATUS_BREAKPOINT                0x80000003\n!define STATUS_SINGLE_STEP               0x80000004\n!define DBG_EXCEPTION_NOT_HANDLED        0x80010001\n!define STATUS_ACCESS_VIOLATION          0xC0000005\n!define STATUS_IN_PAGE_ERROR             0xC0000006\n!define STATUS_INVALID_HANDLE            0xC0000008\n!define STATUS_NO_MEMORY                 0xC0000017\n!define STATUS_ILLEGAL_INSTRUCTION       0xC000001D\n!define STATUS_NONCONTINUABLE_EXCEPTION  0xC0000025\n!define STATUS_INVALID_DISPOSITION       0xC0000026\n!define STATUS_ARRAY_BOUNDS_EXCEEDED     0xC000008C\n!define STATUS_FLOAT_DENORMAL_OPERAND    0xC000008D\n!define STATUS_FLOAT_DIVIDE_BY_ZERO      0xC000008E\n!define STATUS_FLOAT_INEXACT_RESULT      0xC000008F\n!define STATUS_FLOAT_INVALID_OPERATION   0xC0000090\n!define STATUS_FLOAT_OVERFLOW            0xC0000091\n!define STATUS_FLOAT_STACK_CHECK         0xC0000092\n!define STATUS_FLOAT_UNDERFLOW           0xC0000093\n!define STATUS_INTEGER_DIVIDE_BY_ZERO    0xC0000094\n!define STATUS_INTEGER_OVERFLOW          0xC0000095\n!define STATUS_PRIVILEGED_INSTRUCTION    0xC0000096\n!define STATUS_STACK_OVERFLOW            0xC00000FD\n!define STATUS_CONTROL_C_EXIT            0xC000013A\n!define STATUS_FLOAT_MULTIPLE_FAULTS     0xC00002B4\n!define STATUS_FLOAT_MULTIPLE_TRAPS      0xC00002B5\n!define STATUS_REG_NAT_CONSUMPTION       0xC00002C9\n!define STATUS_SXS_EARLY_DEACTIVATION    0xC015000F\n!define STATUS_SXS_INVALID_DEACTIVATION  0xC0150010\n!endif /*WIN32_NO_STATUS*/\n\n#define MAXIMUM_WAIT_OBJECTS 64  \n\n!define DELETE                   0x00010000\n!define READ_CONTROL             0x00020000\n!define WRITE_DAC                0x00040000\n!define WRITE_OWNER              0x00080000\n!define SYNCHRONIZE              0x00100000\n!define STANDARD_RIGHTS_REQUIRED 0x000F0000\n!define STANDARD_RIGHTS_READ     ${READ_CONTROL}\n!define STANDARD_RIGHTS_WRITE    ${READ_CONTROL}\n!define STANDARD_RIGHTS_EXECUTE  ${READ_CONTROL}\n!define STANDARD_RIGHTS_ALL      0x001F0000\n!define SPECIFIC_RIGHTS_ALL      0x0000FFFF\n!define ACCESS_SYSTEM_SECURITY   0x01000000\n!define MAXIMUM_ALLOWED          0x02000000\n!define GENERIC_READ             0x80000000\n!define GENERIC_WRITE            0x40000000\n!define GENERIC_EXECUTE          0x20000000\n!define GENERIC_ALL              0x10000000\n\n!define SE_PRIVILEGE_ENABLED_BY_DEFAULT 0x00000001\n!define SE_PRIVILEGE_ENABLED            0x00000002\n!define SE_PRIVILEGE_REMOVED            0x00000004\n!define SE_PRIVILEGE_USED_FOR_ACCESS    0x80000000\n\n!define SE_CREATE_TOKEN_NAME        \"SeCreateTokenPrivilege\"\n!define SE_ASSIGNPRIMARYTOKEN_NAME  \"SeAssignPrimaryTokenPrivilege\"\n!define SE_LOCK_MEMORY_NAME         \"SeLockMemoryPrivilege\"\n!define SE_INCREASE_QUOTA_NAME      \"SeIncreaseQuotaPrivilege\"\n!define SE_UNSOLICITED_INPUT_NAME   \"SeUnsolicitedInputPrivilege\"\n!define SE_MACHINE_ACCOUNT_NAME     \"SeMachineAccountPrivilege\"\n!define SE_TCB_NAME                 \"SeTcbPrivilege\"\n!define SE_SECURITY_NAME            \"SeSecurityPrivilege\"\n!define SE_TAKE_OWNERSHIP_NAME      \"SeTakeOwnershipPrivilege\"\n!define SE_LOAD_DRIVER_NAME         \"SeLoadDriverPrivilege\"\n!define SE_SYSTEM_PROFILE_NAME      \"SeSystemProfilePrivilege\"\n!define SE_SYSTEMTIME_NAME          \"SeSystemtimePrivilege\"\n!define SE_PROF_SINGLE_PROCESS_NAME \"SeProfileSingleProcessPrivilege\"\n!define SE_INC_BASE_PRIORITY_NAME   \"SeIncreaseBasePriorityPrivilege\"\n!define SE_CREATE_PAGEFILE_NAME     \"SeCreatePagefilePrivilege\"\n!define SE_CREATE_PERMANENT_NAME    \"SeCreatePermanentPrivilege\"\n!define SE_BACKUP_NAME              \"SeBackupPrivilege\"\n!define SE_RESTORE_NAME             \"SeRestorePrivilege\"\n!define SE_SHUTDOWN_NAME            \"SeShutdownPrivilege\"\n!define SE_DEBUG_NAME               \"SeDebugPrivilege\"\n!define SE_AUDIT_NAME               \"SeAuditPrivilege\"\n!define SE_SYSTEM_ENVIRONMENT_NAME  \"SeSystemEnvironmentPrivilege\"\n!define SE_CHANGE_NOTIFY_NAME       \"SeChangeNotifyPrivilege\"\n!define SE_REMOTE_SHUTDOWN_NAME     \"SeRemoteShutdownPrivilege\"\n!define SE_UNDOCK_NAME              \"SeUndockPrivilege\"\n!define SE_SYNC_AGENT_NAME          \"SeSyncAgentPrivilege\"\n!define SE_ENABLE_DELEGATION_NAME   \"SeEnableDelegationPrivilege\"\n!define SE_MANAGE_VOLUME_NAME       \"SeManageVolumePrivilege\"\n!define SE_IMPERSONATE_NAME         \"SeImpersonatePrivilege\"\n!define SE_CREATE_GLOBAL_NAME       \"SeCreateGlobalPrivilege\"\n\n!define TOKEN_ASSIGN_PRIMARY    0x0001\n!define TOKEN_DUPLICATE         0x0002\n!define TOKEN_IMPERSONATE       0x0004\n!define TOKEN_QUERY             0x0008\n!define TOKEN_QUERY_SOURCE      0x0010\n!define TOKEN_ADJUST_PRIVILEGES 0x0020\n!define TOKEN_ADJUST_GROUPS     0x0040\n!define TOKEN_ADJUST_DEFAULT    0x0080\n!define TOKEN_ADJUST_SESSIONID  0x0100\n!define TOKEN_ALL_ACCESS_P     0xF00FF\n!define /math TOKEN_ALL_ACCESS  ${TOKEN_ALL_ACCESS_P} | ${TOKEN_ADJUST_SESSIONID}\n!define /math TOKEN_READ        ${STANDARD_RIGHTS_READ} | ${TOKEN_QUERY}\n!define TOKEN_WRITE      0x200E0 ;(STANDARD_RIGHTS_WRITE|TOKEN_ADJUST_PRIVILEGES|TOKEN_ADJUST_GROUPS|TOKEN_ADJUST_DEFAULT)\n!define TOKEN_EXECUTE    ${STANDARD_RIGHTS_EXECUTE}\n\n!define PROCESS_TERMINATE         0x0001  \n!define PROCESS_CREATE_THREAD     0x0002  \n!define PROCESS_SET_SESSIONID     0x0004  \n!define PROCESS_VM_OPERATION      0x0008  \n!define PROCESS_VM_READ           0x0010  \n!define PROCESS_VM_WRITE          0x0020  \n!define PROCESS_DUP_HANDLE        0x0040  \n!define PROCESS_CREATE_PROCESS    0x0080  \n!define PROCESS_SET_QUOTA         0x0100  \n!define PROCESS_SET_INFORMATION   0x0200  \n!define PROCESS_QUERY_INFORMATION 0x0400  \n!define PROCESS_SUSPEND_RESUME    0x0800  \n!define PROCESS_ALL_ACCESS      0x1F0FFF ;(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)\n!define THREAD_TERMINATE               0x0001  \n!define THREAD_SUSPEND_RESUME          0x0002  \n!define THREAD_GET_CONTEXT             0x0008  \n!define THREAD_SET_CONTEXT             0x0010  \n!define THREAD_SET_INFORMATION         0x0020  \n!define THREAD_QUERY_INFORMATION       0x0040  \n!define THREAD_SET_THREAD_TOKEN        0x0080\n!define THREAD_IMPERSONATE             0x0100\n!define THREAD_DIRECT_IMPERSONATION    0x0200\n!define THREAD_ALL_ACCESS            0x1F03FF ;(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)\n!define JOB_OBJECT_ASSIGN_PROCESS           0x0001\n!define JOB_OBJECT_SET_ATTRIBUTES           0x0002\n!define JOB_OBJECT_QUERY                    0x0004\n!define JOB_OBJECT_TERMINATE                0x0008\n!define JOB_OBJECT_SET_SECURITY_ATTRIBUTES  0x0010\n!define JOB_OBJECT_ALL_ACCESS             0x1F001F ;(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1F )\n!define EVENT_MODIFY_STATE      0x0002  \n!define EVENT_ALL_ACCESS 0x1F0003 ;(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) \n!define MUTANT_QUERY_STATE      0x0001\n!define MUTANT_ALL_ACCESS 0x1F0001 ;(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|MUTANT_QUERY_STATE)\n\n!define FILE_SHARE_READ   0x00000001  \n!define FILE_SHARE_WRITE  0x00000002  \n!define FILE_SHARE_DELETE 0x00000004  \n!define FILE_ATTRIBUTE_READONLY             0x00000001  \n!define FILE_ATTRIBUTE_HIDDEN               0x00000002  \n!define FILE_ATTRIBUTE_SYSTEM               0x00000004  \n!define FILE_ATTRIBUTE_DIRECTORY            0x00000010  \n!define FILE_ATTRIBUTE_ARCHIVE              0x00000020  \n!define FILE_ATTRIBUTE_DEVICE               0x00000040  \n!define FILE_ATTRIBUTE_NORMAL               0x00000080  \n!define FILE_ATTRIBUTE_TEMPORARY            0x00000100  \n!define FILE_ATTRIBUTE_SPARSE_FILE          0x00000200  \n!define FILE_ATTRIBUTE_REPARSE_POINT        0x00000400  \n!define FILE_ATTRIBUTE_COMPRESSED           0x00000800  \n!define FILE_ATTRIBUTE_OFFLINE              0x00001000  \n!define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED  0x00002000  \n!define FILE_ATTRIBUTE_ENCRYPTED            0x00004000  \n\n!define DUPLICATE_CLOSE_SOURCE 0x00000001  \n!define DUPLICATE_SAME_ACCESS  0x00000002  \n\n!define VER_PLATFORM_WIN32s             0\n!define VER_PLATFORM_WIN32_WINDOWS      1\n!define VER_PLATFORM_WIN32_NT           2\n\n!ifndef REG_SZ & NSIS_WINDOWS__NO_REGTYPES\n!define REG_NONE                 0\n!define REG_SZ                   1\n!define REG_EXPAND_SZ            2\n!define REG_BINARY               3\n!define REG_DWORD                4\n!define REG_DWORD_LITTLE_ENDIAN  4\n!define REG_DWORD_BIG_ENDIAN     5\n!define REG_LINK                 6\n!define REG_MULTI_SZ             7\n!endif\n\n\n!endif /* __WIN_NOINC_WINNT */\n!verbose pop\n!endif /* __WIN_WINNT__INC */"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/Win/WinUser.nsh",
    "content": "!ifndef __WIN_WINUSER__INC\n!define __WIN_WINUSER__INC\n!verbose push\n!verbose 3\n!ifndef __WIN_MS_NOUSER & __WIN_NOINC_WINUSER\n\n!ifndef __WIN_MS_NOVIRTUALKEYCODES\n!define VK_LBUTTON    0x01\n!define VK_RBUTTON    0x02\n!define VK_CANCEL     0x03\n!define VK_MBUTTON    0x04 /* NOT contiguous with L & RBUTTON */\n!define VK_XBUTTON1   0x05 /* NOT contiguous with L & RBUTTON */\n!define VK_XBUTTON2   0x06 /* NOT contiguous with L & RBUTTON */\n!define VK_BACK       0x08\n!define VK_TAB        0x09\n!define VK_CLEAR      0x0C\n!define VK_RETURN     0x0D\n!define VK_SHIFT      0x10\n!define VK_CONTROL    0x11\n!define VK_MENU       0x12\n!define VK_PAUSE      0x13\n!define VK_CAPITAL    0x14\n!define VK_ESCAPE     0x1B\n!define VK_CONVERT    0x1C\n!define VK_NONCONVERT 0x1D\n!define VK_ACCEPT     0x1E\n!define VK_MODECHANGE 0x1F\n!define VK_SPACE      0x20\n!define VK_PRIOR      0x21\n!define VK_NEXT       0x22\n!define VK_END        0x23\n!define VK_HOME       0x24\n!define VK_LEFT       0x25\n!define VK_UP         0x26\n!define VK_RIGHT      0x27\n!define VK_DOWN       0x28\n!define VK_SELECT     0x29\n!define VK_PRINT      0x2A\n!define VK_EXECUTE    0x2B\n!define VK_SNAPSHOT   0x2C\n!define VK_INSERT     0x2D\n!define VK_DELETE     0x2E\n!define VK_HELP       0x2F\n; VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)\n; VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)\n!define VK_LWIN           0x5B\n!define VK_RWIN           0x5C\n!define VK_APPS           0x5D\n!define VK_SLEEP          0x5F\n!define VK_NUMPAD0        0x60\n!define VK_NUMPAD1        0x61\n!define VK_NUMPAD2        0x62\n!define VK_NUMPAD3        0x63\n!define VK_NUMPAD4        0x64\n!define VK_NUMPAD5        0x65\n!define VK_NUMPAD6        0x66\n!define VK_NUMPAD7        0x67\n!define VK_NUMPAD8        0x68\n!define VK_NUMPAD9        0x69\n!define VK_MULTIPLY       0x6A\n!define VK_ADD            0x6B\n!define VK_SEPARATOR      0x6C\n!define VK_SUBTRACT       0x6D\n!define VK_DECIMAL        0x6E\n!define VK_DIVIDE         0x6F\n!define VK_F1             0x70\n!define VK_F2             0x71\n!define VK_F3             0x72\n!define VK_F4             0x73\n!define VK_F5             0x74\n!define VK_F6             0x75\n!define VK_F7             0x76\n!define VK_F8             0x77\n!define VK_F9             0x78\n!define VK_F10            0x79\n!define VK_F11            0x7A\n!define VK_F12            0x7B\n!define VK_NUMLOCK        0x90\n!define VK_SCROLL         0x91\n!define VK_OEM_NEC_EQUAL  0x92   ; '=' key on numpad\n!define VK_LSHIFT         0xA0\n!define VK_RSHIFT         0xA1\n!define VK_LCONTROL       0xA2\n!define VK_RCONTROL       0xA3\n!define VK_LMENU          0xA4\n!define VK_RMENU          0xA5\n!endif\n\n!ifndef __WIN_MS_NOWINOFFSETS\n/* in nsDialogs.nsh...\n!define GWL_STYLE           -16\n!define GWL_EXSTYLE         -20 */\n!define GWLP_WNDPROC        -4\n!define GWLP_HINSTANCE      -6\n!define GWLP_HWNDPARENT     -8\n!define GWLP_USERDATA       -21\n!define GWLP_ID             -12\n!define DWLP_MSGRESULT  0\n!define /math DWLP_DLGPROC    ${DWLP_MSGRESULT} + ${__WIN_PTRSIZE} ;DWLP_MSGRESULT + sizeof(LRESULT) \n!define /math DWLP_USER       ${DWLP_DLGPROC} + ${__WIN_PTRSIZE} ;DWLP_DLGPROC + sizeof(DLGPROC)\n!endif\n\n!ifndef __WIN_MS_NONCMESSAGES\n!define HTERROR       -2\n!define HTTRANSPARENT -1\n!define HTNOWHERE     0\n!define HTCLIENT      1\n!define HTCAPTION     2\n!define HTSYSMENU     3\n!define HTGROWBOX     4\n!define HTSIZE        ${HTGROWBOX}\n!define HTMENU        5\n!define HTHSCROLL     6\n!define HTVSCROLL     7\n!define HTMINBUTTON   8\n!define HTMAXBUTTON   9\n!define HTLEFT        10\n!define HTRIGHT       11\n!define HTTOP         12\n!define HTTOPLEFT     13\n!define HTTOPRIGHT    14\n!define HTBOTTOM      15\n!define HTBOTTOMLEFT  16\n!define HTBOTTOMRIGHT 17\n!define HTBORDER      18\n!define HTREDUCE      ${HTMINBUTTON}\n!define HTZOOM        ${HTMAXBUTTON}\n!define HTSIZEFIRST   ${HTLEFT}\n!define HTSIZELAST    ${HTBOTTOMRIGHT}\n!define HTOBJECT      19\n!define HTCLOSE       20\n!define HTHELP        21\n!endif\n\n!ifndef __WIN_MS_NOSYSCOMMANDS\n!define SC_SIZE         0xF000\n!define SC_MOVE         0xF010\n!define SC_MINIMIZE     0xF020\n!define SC_MAXIMIZE     0xF030\n!define SC_NEXTWINDOW   0xF040\n!define SC_PREVWINDOW   0xF050\n!define SC_CLOSE        0xF060\n!define SC_VSCROLL      0xF070\n!define SC_HSCROLL      0xF080\n!define SC_MOUSEMENU    0xF090\n!define SC_KEYMENU      0xF100\n!define SC_ARRANGE      0xF110\n!define SC_RESTORE      0xF120\n!define SC_TASKLIST     0xF130\n!define SC_SCREENSAVE   0xF140\n!define SC_HOTKEY       0xF150\n!define SC_DEFAULT      0xF160\n!define SC_MONITORPOWER 0xF170\n!define SC_CONTEXTHELP  0xF180\n!define SC_SEPARATOR    0xF00F\n!endif\n\n!define IDC_ARROW       32512\n!define IDC_IBEAM       32513\n!define IDC_WAIT        32514\n!define IDC_CROSS       32515\n!define IDC_UPARROW     32516\n!define IDC_SIZENWSE    32642\n!define IDC_SIZENESW    32643\n!define IDC_SIZEWE      32644\n!define IDC_SIZENS      32645\n!define IDC_SIZEALL     32646\n!define IDC_NO          32648 \n!define IDC_HAND        32649\n!define IDC_APPSTARTING 32650 \n!define IDC_HELP        32651\n\n/* in nsDialogs.nsh...\n!define IMAGE_BITMAP 0\n!define IMAGE_ICON   1\n!define IMAGE_CURSOR 2*/\n\n/* in nsDialogs.nsh...\n!define LR_DEFAULTCOLOR     0x0000\n!define LR_MONOCHROME       0x0001\n!define LR_COLOR            0x0002\n!define LR_COPYRETURNORG    0x0004\n!define LR_COPYDELETEORG    0x0008\n!define LR_LOADFROMFILE     0x0010\n!define LR_LOADTRANSPARENT  0x0020\n!define LR_DEFAULTSIZE      0x0040\n!define LR_VGACOLOR         0x0080\n!define LR_LOADMAP3DCOLORS  0x1000\n!define LR_CREATEDIBSECTION 0x2000\n!define LR_COPYFROMRESOURCE 0x4000\n!define LR_SHARED           0x8000*/\n\n!define GA_PARENT    1\n!define GA_ROOT      2\n!define GA_ROOTOWNER 3\n\n!endif /* __WIN_MS_NOUSER & __WIN_NOINC_WINUSER */\n!verbose pop\n!endif /* __WIN_WINUSER__INC */"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/WinCore.nsh",
    "content": "/*\n\nWinCore.nsh & Win\\*.nsh - Collection of common windows defines\n\n!define __WIN_NOINC_xxx to exclude a windows header file\n!define __WIN_MS_xxx to exclude specific things (The original #ifdef xxx checks can be found in the official Microsoft headers)\n\n*/\n\n!ifndef __WIN_WINDOWS__INC\n!define __WIN_WINDOWS__INC\n!verbose push\n!verbose 3\n\n\n!define __WIN_PTRSIZE 4 ;will we ever see a 64 bit version?\n\n\n!include Win\\WinDef.nsh\n!include Win\\WinError.nsh\n!include Win\\WinNT.nsh\n!include Win\\WinUser.nsh\n\n!ifndef __WIN_MS_NOWINMESSAGES\n!include WinMessages.nsh\n!endif\n\n\n\n\n\n/**************************************************\nWinBase.h\n**************************************************/\n!ifndef __WIN_NOINC_WINBASE\n!define INVALID_HANDLE_VALUE -1\n!define INVALID_FILE_SIZE 0xFFFFFFFF\n!define INVALID_SET_FILE_POINTER -1\n!define INVALID_FILE_ATTRIBUTES -1\n\n!define WAIT_FAILED 0xFFFFFFFF\n!define WAIT_OBJECT_0       0 ;((STATUS_WAIT_0 ) + 0 )\n\n!define WAIT_ABANDONED         0x80 ;((STATUS_ABANDONED_WAIT_0 ) + 0 )\n!define WAIT_ABANDONED_0       0x80 ;((STATUS_ABANDONED_WAIT_0 ) + 0 )\n\n!define DRIVE_UNKNOWN     0\n!define DRIVE_NO_ROOT_DIR 1\n!define DRIVE_REMOVABLE   2\n!define DRIVE_FIXED       3\n!define DRIVE_REMOTE      4\n!define DRIVE_CDROM       5\n!define DRIVE_RAMDISK     6\n\n!define FILE_TYPE_UNKNOWN   0x0000\n!define FILE_TYPE_DISK      0x0001\n!define FILE_TYPE_CHAR      0x0002\n!define FILE_TYPE_PIPE      0x0003\n!define FILE_TYPE_REMOTE    0x8000\n\n!define STD_INPUT_HANDLE   -10\n!define STD_OUTPUT_HANDLE  -11\n!define STD_ERROR_HANDLE   -12\n\n#define IGNORE              0       ; Ignore signal\n!define INFINITE            0xFFFFFFFF  ; Infinite timeout\n\n!endif /* __WIN_NOINC_WINBASE */\n\n\n\n\n\n/**************************************************\nWinGDI.h\n**************************************************/\n!ifndef __WIN_MS_NOGDI & __WIN_NOINC_WINGDI\n!define HORZRES       8 \n!define VERTRES       10\n!define BITSPIXEL     12\n!define LOGPIXELSX    88\n!define LOGPIXELSY    90\n!define COLORRES     108\n!define VREFRESH     116\n!define DESKTOPVERTRES 117\n!define DESKTOPHORZRES 118\n!endif /* __WIN_MS_NOGDI & __WIN_NOINC_WINGDI */\n\n\n\n\n\n/**************************************************\nWinReg.h\n**************************************************/\n!ifndef __WIN_NOINC_WINREG\n!ifndef __WIN_NOHKEY & HKEY_CLASSES_ROOT & HKEY_CURRENT_USER & HKEY_LOCAL_MACHINE & HKEY_USERS\n!define HKEY_CLASSES_ROOT        0x80000000\n!define HKEY_CURRENT_USER        0x80000001\n!define HKEY_LOCAL_MACHINE       0x80000002\n!define HKEY_USERS               0x80000003\n!define HKEY_PERFORMANCE_DATA    0x80000004\n!define HKEY_PERFORMANCE_TEXT    0x80000050\n!define HKEY_PERFORMANCE_NLSTEXT 0x80000060\n!define HKEY_CURRENT_CONFIG      0x80000005\n!define HKEY_DYN_DATA            0x80000006\n!ifndef __WIN_NOSHORTHKEY & HKCR & HKCU & HKLM\n!define HKCR ${HKEY_CLASSES_ROOT}\n!define HKCU ${HKEY_CURRENT_USER}\n!define HKLM ${HKEY_LOCAL_MACHINE}\n!endif\n!endif\n!endif /* __WIN_NOINC_WINREG */\n\n\n\n\n\n/**************************************************\nWindowsX.h\n**************************************************/\n!ifndef __WIN_NOINC_WINDOWSX\n!ifndef GET_X_LPARAM & GET_Y_LPARAM\n!macro _Win_GET_X_LPARAM _outvar _in\nIntOp ${_outvar} \"${_in}\" << 16   ;We can't just use LOWORD, we need to keep the sign,\nIntOp ${_outvar} ${_outvar} >> 16 ;so we let NSIS sign extend for us\n!macroend\n!define GET_X_LPARAM \"!insertmacro _Win_GET_X_LPARAM \"\n!macro _Win_GET_Y_LPARAM _outvar _in\nIntOp ${_outvar} \"${_in}\" >> 16\n!macroend\n!define GET_Y_LPARAM \"!insertmacro _Win_GET_Y_LPARAM \"\n!endif\n!endif /* __WIN_NOINC_WINDOWSX */\n\n\n\n\n\n/**************************************************\nShlObj.h\n**************************************************/\n!ifndef __WIN_NOINC_SHLOBJ\n!ifndef __WIN_NOSHELLFOLDERCSIDL\n!define CSIDL_DESKTOP                 0x0000\n!define CSIDL_INTERNET                0x0001 ;Internet Explorer (icon on desktop)\n!define CSIDL_PROGRAMS                0x0002 ;Start Menu\\Programs\n!define CSIDL_CONTROLS                0x0003 ;My Computer\\Control Panel\n!define CSIDL_PRINTERS                0x0004 ;My Computer\\Printers\n!define CSIDL_PERSONAL                0x0005 ;My Documents\n!define CSIDL_FAVORITES               0x0006 ;<user name>\\Favorites\n!define CSIDL_STARTUP                 0x0007 ;Start Menu\\Programs\\Startup\n!define CSIDL_RECENT                  0x0008 ;<user name>\\Recent\n!define CSIDL_SENDTO                  0x0009 ;<user name>\\SendTo\n!define CSIDL_BITBUCKET               0x000a ;<desktop>\\Recycle Bin\n!define CSIDL_STARTMENU               0x000b ;<user name>\\Start Menu\n!define CSIDL_MYDOCUMENTS             0x000c ;logical \"My Documents\" desktop icon\n!define CSIDL_MYMUSIC                 0x000d ;\"My Music\" folder\n!define CSIDL_MYVIDEO                 0x000e ;\"My Videos\" folder\n!define CSIDL_DESKTOPDIRECTORY        0x0010 ;<user name>\\Desktop\n!define CSIDL_DRIVES                  0x0011 ;My Computer\n!define CSIDL_NETWORK                 0x0012 ;Network Neighborhood\n!define CSIDL_NETHOOD                 0x0013 ;<user name>\\nethood\n!define CSIDL_FONTS                   0x0014 ;windows\\fonts\n!define CSIDL_TEMPLATES               0x0015\n!define CSIDL_COMMON_STARTMENU        0x0016 ;All Users\\Start Menu\n!define CSIDL_COMMON_PROGRAMS         0x0017 ;All Users\\Start Menu\\Programs\n!define CSIDL_COMMON_STARTUP          0x0018 ;All Users\\Startup\n!define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019 ;All Users\\Desktop\n!define CSIDL_APPDATA                 0x001a ;<user name>\\Application Data\n!define CSIDL_PRINTHOOD               0x001b ;<user name>\\PrintHood\n!define CSIDL_LOCAL_APPDATA           0x001c ;<user name>\\Local Settings\\Applicaiton Data (non roaming)\n!define CSIDL_ALTSTARTUP              0x001d ;non localized startup\n!define CSIDL_COMMON_ALTSTARTUP       0x001e ;non localized common startup\n!define CSIDL_COMMON_FAVORITES        0x001f\n!define CSIDL_INTERNET_CACHE          0x0020\n!define CSIDL_COOKIES                 0x0021\n!define CSIDL_HISTORY                 0x0022\n!define CSIDL_COMMON_APPDATA          0x0023 ;All Users\\Application Data\n!define CSIDL_WINDOWS                 0x0024 ;GetWindowsDirectory\n!define CSIDL_SYSTEM                  0x0025 ;GetSystemDirectory\n!define CSIDL_PROGRAM_FILES           0x0026 ;C:\\Program Files\n!define CSIDL_MYPICTURES              0x0027\n!define CSIDL_PROFILE                 0x0028 ;USERPROFILE\n!define CSIDL_SYSTEMX86               0x0029 ;x86 system directory on RISC\n!define CSIDL_PROGRAM_FILESX86        0x002a ;x86 C:\\Program Files on RISC\n!define CSIDL_PROGRAM_FILES_COMMON    0x002b ;C:\\Program Files\\Common\n!define CSIDL_PROGRAM_FILES_COMMONX86 0x002c ;x86 Program Files\\Common on RISC\n!define CSIDL_COMMON_TEMPLATES        0x002d ;All Users\\Templates\n!define CSIDL_COMMON_DOCUMENTS        0x002e ;All Users\\Documents\n!define CSIDL_COMMON_ADMINTOOLS       0x002f ;All Users\\Start Menu\\Programs\\Administrative Tools\n!define CSIDL_ADMINTOOLS              0x0030 ;<user name>\\Start Menu\\Programs\\Administrative Tools\n!define CSIDL_CONNECTIONS             0x0031 ;Network and Dial-up Connections\n!define CSIDL_COMMON_MUSIC            0x0035 ;All Users\\My Music\n!define CSIDL_COMMON_PICTURES         0x0036 ;All Users\\My Pictures\n!define CSIDL_COMMON_VIDEO            0x0037 ;All Users\\My Video\n!define CSIDL_RESOURCES               0x0038 ;Resource Direcotry\n!define CSIDL_RESOURCES_LOCALIZED     0x0039 ;Localized Resource Direcotry\n!define CSIDL_COMMON_OEM_LINKS        0x003a ;Links to All Users OEM specific apps\n!define CSIDL_CDBURN_AREA             0x003b ;USERPROFILE\\Local Settings\\Application Data\\Microsoft\\CD Burning\n!define CSIDL_COMPUTERSNEARME         0x003d ;Computers Near Me (computered from Workgroup membership)\n!define CSIDL_FLAG_CREATE             0x8000 ;combine with CSIDL_ value to force folder creation in SHGetFolderPath()\n!define CSIDL_FLAG_DONT_VERIFY        0x4000 ;combine with CSIDL_ value to return an unverified folder path\n!define CSIDL_FLAG_NO_ALIAS           0x1000 ;combine with CSIDL_ value to insure non-alias versions of the pidl\n!define CSIDL_FLAG_PER_USER_INIT      0x0800 ;combine with CSIDL_ value to indicate per-user init (eg. upgrade)\n!define CSIDL_FLAG_MASK               0xFF00\n!endif /* __WIN_NOSHELLFOLDERCSIDL */\n!endif /* __WIN_NOINC_SHLOBJ */\n\n\n\n\n!verbose pop\n!endif /* __WIN_WINDOWS__INC */"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/WinMessages.nsh",
    "content": "/*\n_____________________________________________________________________________\n\n                       List of common Windows Messages\n_____________________________________________________________________________\n\n 2005 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)\n\n\nUsage example:\n---------------------------------------------------\nName \"Output\"\nOutFile \"Output.exe\"\n\n!include \"WinMessages.nsh\"\n\nSection\n\tFindWindow $0 '#32770' '' $HWNDPARENT\n\tGetDlgItem $1 $0 1027\n\tSendMessage $1 ${WM_SETTEXT} 0 'STR:MyText'\nSectionEnd\n---------------------------------------------------\n\n\nPrefix  Message category\n-------------------------\nSW      ShowWindow Commands\nBM      Button control\nCB      Combo box control\nEM      Edit control\nLB      List box control\nWM      General window\nABM     Application desktop toolbar\nDBT     Device\nDM      Default push button control\nHDM     Header control\nLVM     List view control\nSB      Status bar window\nSBM     Scroll bar control\nSTM     Static control\nTCM     Tab control\nPBM     Progress bar\n-----------------------------------\n\nNOT included messages (WM_USER + X)\n-----------------------------------\nCBEM    Extended combo box control\nCDM     Common dialog box\nDL      Drag list box\nDTM     Date and time picker control\nHKM     Hot key control\nIPM     IP address control\nMCM     Month calendar control\nPGM     Pager control\nPSM     Property sheet\nRB      Rebar control\nTB      Toolbar\nTBM     Trackbar\nTTM     Tooltip control\nTVM     Tree-view control\nUDM     Up-down control\n-----------------------------------\n*/\n\n\n!ifndef WINMESSAGES_INCLUDED\n!define WINMESSAGES_INCLUDED\n!verbose push\n!verbose 3\n\n!define HWND_BROADCAST      0xFFFF\n\n#ShowWindow Commands#\n!define SW_HIDE             0\n!define SW_SHOWNORMAL       1\n!define SW_NORMAL           1\n!define SW_SHOWMINIMIZED    2\n!define SW_SHOWMAXIMIZED    3\n!define SW_MAXIMIZE         3\n!define SW_SHOWNOACTIVATE   4\n!define SW_SHOW             5\n!define SW_MINIMIZE         6\n!define SW_SHOWMINNOACTIVE  7\n!define SW_SHOWNA           8\n!define SW_RESTORE          9\n!define SW_SHOWDEFAULT      10\n!define SW_FORCEMINIMIZE    11\n!define SW_MAX              11\n\n#Button Control Messages#\n!define BM_CLICK           0x00F5\n!define BM_GETCHECK        0x00F0\n!define BM_GETIMAGE        0x00F6\n!define BM_GETSTATE        0x00F2\n!define BM_SETCHECK        0x00F1\n!define BM_SETIMAGE        0x00F7\n!define BM_SETSTATE        0x00F3\n!define BM_SETSTYLE        0x00F4\n\n!define BST_UNCHECKED      0\n!define BST_CHECKED        1\n!define BST_INDETERMINATE  2\n!define BST_PUSHED         4\n!define BST_FOCUS          8\n\n#Combo Box Messages#\n!define CB_ADDSTRING                0x0143\n!define CB_DELETESTRING             0x0144\n!define CB_DIR                      0x0145\n!define CB_FINDSTRING               0x014C\n!define CB_FINDSTRINGEXACT          0x0158\n!define CB_GETCOUNT                 0x0146\n!define CB_GETCURSEL                0x0147\n!define CB_GETDROPPEDCONTROLRECT    0x0152\n!define CB_GETDROPPEDSTATE          0x0157\n!define CB_GETDROPPEDWIDTH          0x015f\n!define CB_GETEDITSEL               0x0140\n!define CB_GETEXTENDEDUI            0x0156\n!define CB_GETHORIZONTALEXTENT      0x015d\n!define CB_GETITEMDATA              0x0150\n!define CB_GETITEMHEIGHT            0x0154\n!define CB_GETLBTEXT                0x0148\n!define CB_GETLBTEXTLEN             0x0149\n!define CB_GETLOCALE                0x015A\n!define CB_GETTOPINDEX              0x015b\n!define CB_INITSTORAGE              0x0161\n!define CB_INSERTSTRING             0x014A\n!define CB_LIMITTEXT                0x0141\n!define CB_MSGMAX                   0x015B  # 0x0162 0x0163\n!define CB_MULTIPLEADDSTRING        0x0163\n!define CB_RESETCONTENT             0x014B\n!define CB_SELECTSTRING             0x014D\n!define CB_SETCURSEL                0x014E\n!define CB_SETDROPPEDWIDTH          0x0160\n!define CB_SETEDITSEL               0x0142\n!define CB_SETEXTENDEDUI            0x0155\n!define CB_SETHORIZONTALEXTENT      0x015e\n!define CB_SETITEMDATA              0x0151\n!define CB_SETITEMHEIGHT            0x0153\n!define CB_SETLOCALE                0x0159\n!define CB_SETTOPINDEX              0x015c\n!define CB_SHOWDROPDOWN             0x014F\n\n!define CB_ERR                      -1\n\n#Edit Control Messages#\n!define EM_CANUNDO              0x00C6\n!define EM_CHARFROMPOS          0x00D7\n!define EM_EMPTYUNDOBUFFER      0x00CD\n!define EM_EXLIMITTEXT          0x0435\n!define EM_FMTLINES             0x00C8\n!define EM_GETFIRSTVISIBLELINE  0x00CE\n!define EM_GETHANDLE            0x00BD\n!define EM_GETIMESTATUS         0x00D9\n!define EM_GETLIMITTEXT         0x00D5\n!define EM_GETLINE              0x00C4\n!define EM_GETLINECOUNT         0x00BA\n!define EM_GETMARGINS           0x00D4\n!define EM_GETMODIFY            0x00B8\n!define EM_GETPASSWORDCHAR      0x00D2\n!define EM_GETRECT              0x00B2\n!define EM_GETSEL               0x00B0\n!define EM_GETTHUMB             0x00BE\n!define EM_GETWORDBREAKPROC     0x00D1\n!define EM_LIMITTEXT            0x00C5\n!define EM_LINEFROMCHAR         0x00C9\n!define EM_LINEINDEX            0x00BB\n!define EM_LINELENGTH           0x00C1\n!define EM_LINESCROLL           0x00B6\n!define EM_POSFROMCHAR          0x00D6\n!define EM_REPLACESEL           0x00C2\n!define EM_SCROLL               0x00B5\n!define EM_SCROLLCARET          0x00B7\n!define EM_SETHANDLE            0x00BC\n!define EM_SETIMESTATUS         0x00D8\n!define EM_SETLIMITTEXT         0x00C5  # Same as EM_LIMITTEXT\n!define EM_SETMARGINS           0x00D3\n!define EM_SETMODIFY            0x00B9\n!define EM_SETPASSWORDCHAR      0x00CC\n!define EM_SETREADONLY          0x00CF\n!define EM_SETRECT              0x00B3\n!define EM_SETRECTNP            0x00B4\n!define EM_SETSEL               0x00B1\n!define EM_SETTABSTOPS          0x00CB\n!define EM_SETWORDBREAKPROC     0x00D0\n!define EM_UNDO                 0x00C7\n\n#Listbox Messages#\n!define LB_ADDFILE              0x0196\n!define LB_ADDSTRING            0x0180\n!define LB_DELETESTRING         0x0182\n!define LB_DIR                  0x018D\n!define LB_FINDSTRING           0x018F\n!define LB_FINDSTRINGEXACT      0x01A2\n!define LB_GETANCHORINDEX       0x019D\n!define LB_GETCARETINDEX        0x019F\n!define LB_GETCOUNT             0x018B\n!define LB_GETCURSEL            0x0188\n!define LB_GETHORIZONTALEXTENT  0x0193\n!define LB_GETITEMDATA          0x0199\n!define LB_GETITEMHEIGHT        0x01A1\n!define LB_GETITEMRECT          0x0198\n!define LB_GETLOCALE            0x01A6\n!define LB_GETSEL               0x0187\n!define LB_GETSELCOUNT          0x0190\n!define LB_GETSELITEMS          0x0191\n!define LB_GETTEXT              0x0189\n!define LB_GETTEXTLEN           0x018A\n!define LB_GETTOPINDEX          0x018E\n!define LB_INITSTORAGE          0x01A8\n!define LB_INSERTSTRING         0x0181\n!define LB_ITEMFROMPOINT        0x01A9\n!define LB_MSGMAX               0x01A8  # 0x01B0 0x01B1\n!define LB_MULTIPLEADDSTRING    0x01B1\n!define LB_RESETCONTENT         0x0184\n!define LB_SELECTSTRING         0x018C\n!define LB_SELITEMRANGE         0x019B\n!define LB_SELITEMRANGEEX       0x0183\n!define LB_SETANCHORINDEX       0x019C\n!define LB_SETCARETINDEX        0x019E\n!define LB_SETCOLUMNWIDTH       0x0195\n!define LB_SETCOUNT             0x01A7\n!define LB_SETCURSEL            0x0186\n!define LB_SETHORIZONTALEXTENT  0x0194\n!define LB_SETITEMDATA          0x019A\n!define LB_SETITEMHEIGHT        0x01A0\n!define LB_SETLOCALE            0x01A5\n!define LB_SETSEL               0x0185\n!define LB_SETTABSTOPS          0x0192\n!define LB_SETTOPINDEX          0x0197\n\n!define LB_ERR                  -1\n\n#Window Messages#\n!define WM_ACTIVATE                     0x0006\n!define WM_ACTIVATEAPP                  0x001C\n!define WM_AFXFIRST                     0x0360\n!define WM_AFXLAST                      0x037F\n!define WM_APP                          0x8000\n!define WM_APPCOMMAND                   0x0319\n!define WM_ASKCBFORMATNAME              0x030C\n!define WM_CANCELJOURNAL                0x004B\n!define WM_CANCELMODE                   0x001F\n!define WM_CAPTURECHANGED               0x0215\n!define WM_CHANGECBCHAIN                0x030D\n!define WM_CHANGEUISTATE                0x0127\n!define WM_CHAR                         0x0102\n!define WM_CHARTOITEM                   0x002F\n!define WM_CHILDACTIVATE                0x0022\n!define WM_CLEAR                        0x0303\n!define WM_CLOSE                        0x0010\n!define WM_COMMAND                      0x0111\n!define WM_COMMNOTIFY                   0x0044  # no longer suported\n!define WM_COMPACTING                   0x0041\n!define WM_COMPAREITEM                  0x0039\n!define WM_CONTEXTMENU                  0x007B\n!define WM_CONVERTREQUESTEX             0x108\n!define WM_COPY                         0x0301\n!define WM_COPYDATA                     0x004A\n!define WM_CREATE                       0x0001\n!define WM_CTLCOLOR                     0x0019\n!define WM_CTLCOLORBTN                  0x0135\n!define WM_CTLCOLORDLG                  0x0136\n!define WM_CTLCOLOREDIT                 0x0133\n!define WM_CTLCOLORLISTBOX              0x0134\n!define WM_CTLCOLORMSGBOX               0x0132\n!define WM_CTLCOLORSCROLLBAR            0x0137\n!define WM_CTLCOLORSTATIC               0x0138\n!define WM_CUT                          0x0300\n!define WM_DDE_FIRST                    0x3E0\n!define WM_DEADCHAR                     0x0103\n!define WM_DELETEITEM                   0x002D\n!define WM_DESTROY                      0x0002\n!define WM_DESTROYCLIPBOARD             0x0307\n!define WM_DEVICECHANGE                 0x0219\n!define WM_DEVMODECHANGE                0x001B\n!define WM_DISPLAYCHANGE                0x007E\n!define WM_DRAWCLIPBOARD                0x0308\n!define WM_DRAWITEM                     0x002B\n!define WM_DROPFILES                    0x0233\n!define WM_ENABLE                       0x000A\n!define WM_ENDSESSION                   0x0016\n!define WM_ENTERIDLE                    0x0121\n!define WM_ENTERMENULOOP                0x0211\n!define WM_ENTERSIZEMOVE                0x0231\n!define WM_ERASEBKGND                   0x0014\n!define WM_EXITMENULOOP                 0x0212\n!define WM_EXITSIZEMOVE                 0x0232\n!define WM_FONTCHANGE                   0x001D\n!define WM_GETDLGCODE                   0x0087\n!define WM_GETFONT                      0x0031\n!define WM_GETHOTKEY                    0x0033\n!define WM_GETICON                      0x007F\n!define WM_GETMINMAXINFO                0x0024\n!define WM_GETOBJECT                    0x003D\n!define WM_GETTEXT                      0x000D\n!define WM_GETTEXTLENGTH                0x000E\n!define WM_HANDHELDFIRST                0x0358\n!define WM_HANDHELDLAST                 0x035F\n!define WM_HELP                         0x0053\n!define WM_HOTKEY                       0x0312\n!define WM_HSCROLL                      0x0114\n!define WM_HSCROLLCLIPBOARD             0x030E\n!define WM_ICONERASEBKGND               0x0027\n!define WM_IME_CHAR                     0x0286\n!define WM_IME_COMPOSITION              0x010F\n!define WM_IME_COMPOSITIONFULL          0x0284\n!define WM_IME_CONTROL                  0x0283\n!define WM_IME_ENDCOMPOSITION           0x010E\n!define WM_IME_KEYDOWN                  0x0290\n!define WM_IME_KEYLAST                  0x010F\n!define WM_IME_KEYUP                    0x0291\n!define WM_IME_NOTIFY                   0x0282\n!define WM_IME_REQUEST                  0x0288\n!define WM_IME_SELECT                   0x0285\n!define WM_IME_SETCONTEXT               0x0281\n!define WM_IME_STARTCOMPOSITION         0x010D\n!define WM_INITDIALOG                   0x0110\n!define WM_INITMENU                     0x0116\n!define WM_INITMENUPOPUP                0x0117\n!define WM_INPUT                        0x00FF\n!define WM_INPUTLANGCHANGE              0x0051\n!define WM_INPUTLANGCHANGEREQUEST       0x0050\n!define WM_KEYDOWN                      0x0100\n!define WM_KEYFIRST                     0x0100\n!define WM_KEYLAST                      0x0108\n!define WM_KEYUP                        0x0101\n!define WM_KILLFOCUS                    0x0008\n!define WM_LBUTTONDBLCLK                0x0203\n!define WM_LBUTTONDOWN                  0x0201\n!define WM_LBUTTONUP                    0x0202\n!define WM_MBUTTONDBLCLK                0x0209\n!define WM_MBUTTONDOWN                  0x0207\n!define WM_MBUTTONUP                    0x0208\n!define WM_MDIACTIVATE                  0x0222\n!define WM_MDICASCADE                   0x0227\n!define WM_MDICREATE                    0x0220\n!define WM_MDIDESTROY                   0x0221\n!define WM_MDIGETACTIVE                 0x0229\n!define WM_MDIICONARRANGE               0x0228\n!define WM_MDIMAXIMIZE                  0x0225\n!define WM_MDINEXT                      0x0224\n!define WM_MDIREFRESHMENU               0x0234\n!define WM_MDIRESTORE                   0x0223\n!define WM_MDISETMENU                   0x0230\n!define WM_MDITILE                      0x0226\n!define WM_MEASUREITEM                  0x002C\n!define WM_MENUCHAR                     0x0120\n!define WM_MENUCOMMAND                  0x0126\n!define WM_MENUDRAG                     0x0123\n!define WM_MENUGETOBJECT                0x0124\n!define WM_MENURBUTTONUP                0x0122\n!define WM_MENUSELECT                   0x011F\n!define WM_MOUSEACTIVATE                0x0021\n!define WM_MOUSEFIRST                   0x0200\n!define WM_MOUSEHOVER                   0x02A1\n!define WM_MOUSELAST                    0x0209  # 0x020A 0x020D\n!define WM_MOUSELEAVE                   0x02A3\n!define WM_MOUSEMOVE                    0x0200\n!define WM_MOUSEWHEEL                   0x020A\n!define WM_MOVE                         0x0003\n!define WM_MOVING                       0x0216\n!define WM_NCACTIVATE                   0x0086\n!define WM_NCCALCSIZE                   0x0083\n!define WM_NCCREATE                     0x0081\n!define WM_NCDESTROY                    0x0082\n!define WM_NCHITTEST                    0x0084\n!define WM_NCLBUTTONDBLCLK              0x00A3\n!define WM_NCLBUTTONDOWN                0x00A1\n!define WM_NCLBUTTONUP                  0x00A2\n!define WM_NCMBUTTONDBLCLK              0x00A9\n!define WM_NCMBUTTONDOWN                0x00A7\n!define WM_NCMBUTTONUP                  0x00A8\n!define WM_NCMOUSEHOVER                 0x02A0\n!define WM_NCMOUSELEAVE                 0x02A2\n!define WM_NCMOUSEMOVE                  0x00A0\n!define WM_NCPAINT                      0x0085\n!define WM_NCRBUTTONDBLCLK              0x00A6\n!define WM_NCRBUTTONDOWN                0x00A4\n!define WM_NCRBUTTONUP                  0x00A5\n!define WM_NCXBUTTONDBLCLK              0x00AD\n!define WM_NCXBUTTONDOWN                0x00AB\n!define WM_NCXBUTTONUP                  0x00AC\n!define WM_NEXTDLGCTL                   0x0028\n!define WM_NEXTMENU                     0x0213\n!define WM_NOTIFY                       0x004E\n!define WM_NOTIFYFORMAT                 0x0055\n!define WM_NULL                         0x0000\n!define WM_PAINT                        0x000F\n!define WM_PAINTCLIPBOARD               0x0309\n!define WM_PAINTICON                    0x0026\n!define WM_PALETTECHANGED               0x0311\n!define WM_PALETTEISCHANGING            0x0310\n!define WM_PARENTNOTIFY                 0x0210\n!define WM_PASTE                        0x0302\n!define WM_PENWINFIRST                  0x0380\n!define WM_PENWINLAST                   0x038F\n!define WM_POWER                        0x0048\n!define WM_POWERBROADCAST               0x0218\n!define WM_PRINT                        0x0317\n!define WM_PRINTCLIENT                  0x0318\n!define WM_QUERYDRAGICON                0x0037\n!define WM_QUERYENDSESSION              0x0011\n!define WM_QUERYNEWPALETTE              0x030F\n!define WM_QUERYOPEN                    0x0013\n!define WM_QUERYUISTATE                 0x0129\n!define WM_QUEUESYNC                    0x0023\n!define WM_QUIT                         0x0012\n!define WM_RBUTTONDBLCLK                0x0206\n!define WM_RBUTTONDOWN                  0x0204\n!define WM_RBUTTONUP                    0x0205\n!define WM_RASDIALEVENT                 0xCCCD\n!define WM_RENDERALLFORMATS             0x0306\n!define WM_RENDERFORMAT                 0x0305\n!define WM_SETCURSOR                    0x0020\n!define WM_SETFOCUS                     0x0007\n!define WM_SETFONT                      0x0030\n!define WM_SETHOTKEY                    0x0032\n!define WM_SETICON                      0x0080\n!define WM_SETREDRAW                    0x000B\n!define WM_SETTEXT                      0x000C\n!define WM_SETTINGCHANGE                0x001A  # Same as WM_WININICHANGE\n!define WM_SHOWWINDOW                   0x0018\n!define WM_SIZE                         0x0005\n!define WM_SIZECLIPBOARD                0x030B\n!define WM_SIZING                       0x0214\n!define WM_SPOOLERSTATUS                0x002A\n!define WM_STYLECHANGED                 0x007D\n!define WM_STYLECHANGING                0x007C\n!define WM_SYNCPAINT                    0x0088\n!define WM_SYSCHAR                      0x0106\n!define WM_SYSCOLORCHANGE               0x0015\n!define WM_SYSCOMMAND                   0x0112\n!define WM_SYSDEADCHAR                  0x0107\n!define WM_SYSKEYDOWN                   0x0104\n!define WM_SYSKEYUP                     0x0105\n!define WM_TABLET_FIRST                 0x02C0\n!define WM_TABLET_LAST                  0x02DF\n!define WM_THEMECHANGED                 0x031A\n!define WM_TCARD                        0x0052\n!define WM_TIMECHANGE                   0x001E\n!define WM_TIMER                        0x0113\n!define WM_UNDO                         0x0304\n!define WM_UNICHAR                      0x0109\n!define WM_UNINITMENUPOPUP              0x0125\n!define WM_UPDATEUISTATE                0x0128\n!define WM_USER                         0x400\n!define WM_USERCHANGED                  0x0054\n!define WM_VKEYTOITEM                   0x002E\n!define WM_VSCROLL                      0x0115\n!define WM_VSCROLLCLIPBOARD             0x030A\n!define WM_WINDOWPOSCHANGED             0x0047\n!define WM_WINDOWPOSCHANGING            0x0046\n!define WM_WININICHANGE                 0x001A\n!define WM_WTSSESSION_CHANGE            0x02B1\n!define WM_XBUTTONDBLCLK                0x020D\n!define WM_XBUTTONDOWN                  0x020B\n!define WM_XBUTTONUP                    0x020C\n\n\n#Application desktop toolbar#\n!define ABM_ACTIVATE         0x00000006  # lParam == TRUE/FALSE means activate/deactivate\n!define ABM_GETAUTOHIDEBAR   0x00000007\n!define ABM_GETSTATE         0x00000004\n!define ABM_GETTASKBARPOS    0x00000005\n!define ABM_NEW              0x00000000\n!define ABM_QUERYPOS         0x00000002\n!define ABM_REMOVE           0x00000001\n!define ABM_SETAUTOHIDEBAR   0x00000008  # This can fail, you MUST check the result\n!define ABM_SETPOS           0x00000003\n!define ABM_WINDOWPOSCHANGED 0x0000009\n\n#Device#\n!define DBT_APPYBEGIN                   0x0000\n!define DBT_APPYEND                     0x0001\n!define DBT_CONFIGCHANGECANCELED        0x0019\n!define DBT_CONFIGCHANGED               0x0018\n!define DBT_CONFIGMGAPI32               0x0022\n!define DBT_CONFIGMGPRIVATE             0x7FFF\n!define DBT_CUSTOMEVENT                 0x8006  # User-defined event\n!define DBT_DEVICEARRIVAL               0x8000  # System detected a new device\n!define DBT_DEVICEQUERYREMOVE           0x8001  # Wants to remove, may fail\n!define DBT_DEVICEQUERYREMOVEFAILED     0x8002  # Removal aborted\n!define DBT_DEVICEREMOVECOMPLETE        0x8004  # Device is gone\n!define DBT_DEVICEREMOVEPENDING         0x8003  # About to remove, still avail.\n!define DBT_DEVICETYPESPECIFIC          0x8005  # Type specific event\n!define DBT_DEVNODES_CHANGED            0x0007\n!define DBT_DEVTYP_DEVICEINTERFACE      0x00000005  # Device interface class\n!define DBT_DEVTYP_DEVNODE              0x00000001  # Devnode number\n!define DBT_DEVTYP_HANDLE               0x00000006  # File system handle\n!define DBT_DEVTYP_NET                  0x00000004  # Network resource\n!define DBT_DEVTYP_OEM                  0x00000000  # Oem-defined device type\n!define DBT_DEVTYP_PORT                 0x00000003  # Serial, parallel\n!define DBT_DEVTYP_VOLUME               0x00000002  # Logical volume\n!define DBT_LOW_DISK_SPACE              0x0048\n!define DBT_MONITORCHANGE               0x001B\n!define DBT_NO_DISK_SPACE               0x0047\n!define DBT_QUERYCHANGECONFIG           0x0017\n!define DBT_SHELLLOGGEDON               0x0020\n!define DBT_USERDEFINED                 0xFFFF\n!define DBT_VOLLOCKLOCKFAILED           0x8043\n!define DBT_VOLLOCKLOCKRELEASED         0x8045\n!define DBT_VOLLOCKLOCKTAKEN            0x8042\n!define DBT_VOLLOCKQUERYLOCK            0x8041\n!define DBT_VOLLOCKQUERYUNLOCK          0x8044\n!define DBT_VOLLOCKUNLOCKFAILED         0x8046\n!define DBT_VPOWERDAPI                  0x8100  # VPOWERD API for Win95\n!define DBT_VXDINITCOMPLETE             0x0023\n\n#Default push button control#\n!define DM_BITSPERPEL       0x00040000\n!define DM_COLLATE          0x00008000\n!define DM_COLOR            0x00000800\n!define DM_COPIES           0x00000100\n!define DM_DEFAULTSOURCE    0x00000200\n!define DM_DISPLAYFLAGS     0x00200000\n!define DM_DISPLAYFREQUENCY 0x00400000\n!define DM_DITHERTYPE       0x04000000\n!define DM_DUPLEX           0x00001000\n!define DM_FORMNAME         0x00010000\n!define DM_GRAYSCALE        0x00000001  # This flag is no longer valid\n!define DM_ICMINTENT        0x01000000\n!define DM_ICMMETHOD        0x00800000\n!define DM_INTERLACED       0x00000002  # This flag is no longer valid\n!define DM_LOGPIXELS        0x00020000\n!define DM_MEDIATYPE        0x02000000\n!define DM_NUP              0x00000040\n!define DM_ORIENTATION      0x00000001\n!define DM_PANNINGHEIGHT    0x10000000\n!define DM_PANNINGWIDTH     0x08000000\n!define DM_PAPERLENGTH      0x00000004\n!define DM_PAPERSIZE        0x00000002\n!define DM_PAPERWIDTH       0x00000008\n!define DM_PELSHEIGHT       0x00100000\n!define DM_PELSWIDTH        0x00080000\n!define DM_POSITION         0x00000020\n!define DM_PRINTQUALITY     0x00000400\n!define DM_SCALE            0x00000010\n!define DM_SPECVERSION      0x0320       # 0x0400 0x0401\n!define DM_TTOPTION         0x00004000\n!define DM_YRESOLUTION      0x00002000\n\n#Header control#\n!define HDM_FIRST           0x1200\n\n#List view control#\n!define LVM_FIRST           0x1000\n\n#Status bar window#\n!define SB_CONST_ALPHA      0x00000001\n!define SB_GRAD_RECT        0x00000010\n!define SB_GRAD_TRI         0x00000020\n!define SB_NONE             0x00000000\n!define SB_PIXEL_ALPHA      0x00000002\n!define SB_PREMULT_ALPHA    0x00000004\n!define SB_SIMPLEID         0x00ff\n\n#Scroll bar control#\n!define SBM_ENABLE_ARROWS           0x00E4  # Not in win3.1\n!define SBM_GETPOS                  0x00E1  # Not in win3.1\n!define SBM_GETRANGE                0x00E3  # Not in win3.1\n!define SBM_GETSCROLLINFO           0x00EA\n!define SBM_SETPOS                  0x00E0  # Not in win3.1\n!define SBM_SETRANGE                0x00E2  # Not in win3.1\n!define SBM_SETRANGEREDRAW          0x00E6  # Not in win3.1\n!define SBM_SETSCROLLINFO           0x00E9\n\n#Static control#\n!define STM_GETICON                 0x0171\n!define STM_GETIMAGE                0x0173\n!define STM_MSGMAX                  0x0174\n!define STM_ONLY_THIS_INTERFACE     0x00000001\n!define STM_ONLY_THIS_NAME          0x00000008\n!define STM_ONLY_THIS_PROTOCOL      0x00000002\n!define STM_ONLY_THIS_TYPE          0x00000004\n!define STM_SETICON                 0x0170\n!define STM_SETIMAGE                0x0172\n\n#Tab control#\n!define TCM_FIRST                   0x1300\n\n#Progress bar control#\n!define PBM_SETRANGE   0x0401\n!define PBM_SETPOS     0x0402\n!define PBM_DELTAPOS   0x0403\n!define PBM_SETSTEP    0x0404\n!define PBM_STEPIT     0x0405\n!define PBM_GETPOS     0x0408\n!define PBM_SETMARQUEE 0x040a\n\n!verbose pop\n!endif"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/WinVer.nsh",
    "content": "; ---------------------\n;      WinVer.nsh\n; ---------------------\n;\n; LogicLib extensions for handling Windows versions and service packs.\n;\n; IsNT checks if the installer is running on Windows NT family (NT4, 2000, XP, etc.)\n;\n;   ${If} ${IsNT}\n;     DetailPrint \"Running on NT. Installing Unicode enabled application.\"\n;   ${Else}\n;     DetailPrint \"Not running on NT. Installing ANSI application.\"\n;   ${EndIf}\n;\n; IsServer checks if the installer is running on a server version of Windows (NT4, 2003, 2008, etc.)\n;\n; AtLeastWin<version> checks if the installer is running on Windows version at least as specified.\n; IsWin<version> checks if the installer is running on Windows version exactly as specified.\n; AtMostWin<version> checks if the installer is running on Windows version at most as specified.\n;\n; <version> can be replaced with the following values:\n;\n;   95\n;   98\n;   ME\n;\n;   NT4\n;   2000\n;   XP\n;   2003\n;   Vista\n;   2008\n;   7\n;   2008R2\n;\n; AtLeastServicePack checks if the installer is running on Windows service pack version at least as specified.\n; IsServicePack checks if the installer is running on Windows service pack version exactly as specified.\n; AtMostServicePack checks if the installer is running on Windows service version pack at most as specified.\n;\n; Usage examples:\n;\n;   ${If} ${IsNT}\n;   DetailPrint \"Running on NT family.\"\n;   DetailPrint \"Surely not running on 95, 98 or ME.\"\n;   ${AndIf} ${AtLeastWinNT4}\n;     DetailPrint \"Running on NT4 or better. Could even be 2003.\"\n;   ${EndIf}\n;\n;   ${If} ${AtLeastWinXP}\n;     DetailPrint \"Running on XP or better.\"\n;   ${EndIf}\n;\n;   ${If} ${IsWin2000}\n;     DetailPrint \"Running on 2000.\"\n;   ${EndIf}\n;\n;   ${If} ${IsWin2000}\n;   ${AndIf} ${AtLeastServicePack} 3\n;   ${OrIf} ${AtLeastWinXP}\n;     DetailPrint \"Running Win2000 SP3 or above\"\n;   ${EndIf}\n;\n;   ${If} ${AtMostWinXP}\n;     DetailPrint \"Running on XP or older. Surely not running on Vista. Maybe 98, or even 95.\"\n;   ${EndIf}\n;\n; Warning:\n;\n;   Windows 95 and NT both use the same version number. To avoid getting NT4 misidentified\n;   as Windows 95 and vice-versa or 98 as a version higher than NT4, always use IsNT to\n;   check if running on the NT family.\n;\n;     ${If} ${AtLeastWin95}\n;     ${And} ${AtMostWinME}\n;       DetailPrint \"Running 95, 98 or ME.\"\n;       DetailPrint \"Actually, maybe it's NT4?\"\n;       ${If} ${IsNT}\n;         DetailPrint \"Yes, it's NT4! oops...\"\n;       ${Else}\n;         DetailPrint \"Nope, not NT4. phew...\"\n;       ${EndIf}\n;     ${EndIf}\n;\n;\n; Other useful extensions are:\n;\n;    * IsWin2003R2\n;    * IsStarterEdition\n;    * OSHasMediaCenter\n;    * OSHasTabletSupport\n;\n\n!verbose push\n!verbose 3\n\n!ifndef ___WINVER__NSH___\n!define ___WINVER__NSH___\n\n!include LogicLib.nsh\n!include Util.nsh\n\n# masks for our variables\n\n!define _WINVER_VERXBIT  0x00000001\n!define _WINVER_MASKVMAJ 0x7F000000\n!define _WINVER_MASKVMIN 0x00FF0000\n\n!define _WINVER_NTBIT    0x80000000\n!define _WINVER_NTMASK   0x7FFFFFFF\n!define _WINVER_NTSRVBIT 0x40000000\n!define _WINVER_MASKVBLD 0x0000FFFF\n!define _WINVER_MASKSP   0x000F0000\n\n# possible variable values for different versions\n\n!define WINVER_95_NT     0x04000000 ;4.00.0950\n!define WINVER_95        0x04000000 ;4.00.0950\n!define WINVER_98_NT     0x040a0000 ;4.10.1998\n!define WINVER_98        0x040a0000 ;4.10.1998\n;define WINVER_98SE      0x040a0000 ;4.10.2222\n!define WINVER_ME_NT     0x045a0000 ;4.90.3000\n!define WINVER_ME        0x045a0000 ;4.90.3000\n;define WINVER_NT3d51               ;3.51.1057\n!define WINVER_NT4_NT    0x84000000 ;4.00.1381\n!define WINVER_NT4       0x04000000 ;4.00.1381\n!define WINVER_2000_NT   0x85000000 ;5.00.2195\n!define WINVER_2000      0x05000000 ;5.00.2195\n!define WINVER_XP_NT     0x85010000 ;5.01.2600\n!define WINVER_XP        0x05010000 ;5.01.2600\n;define WINVER_XP64                 ;5.02.3790\n!define WINVER_2003_NT   0x85020000 ;5.02.3790\n!define WINVER_2003      0x05020000 ;5.02.3790\n!define WINVER_VISTA_NT  0x86000000 ;6.00.6000\n!define WINVER_VISTA     0x06000000 ;6.00.6000\n!define WINVER_2008_NT   0x86000001 ;6.00.6001\n!define WINVER_2008      0x06000001 ;6.00.6001\n!define WINVER_7_NT      0x86010000 ;6.01.????\n!define WINVER_7         0x06010000 ;6.01.????\n!define WINVER_2008R2_NT 0x86010001 ;6.01.????\n!define WINVER_2008R2    0x06010001 ;6.01.????\n\n\n# use this to make all nt > 9x\n\n!ifdef WINVER_NT4_OVER_W95\n  !define __WINVERTMP ${WINVER_NT4}\n  !undef WINVER_NT4\n  !define /math WINVER_NT4 ${__WINVERTMP} | ${_WINVER_VERXBIT}\n  !undef __WINVERTMP\n!endif\n\n# some definitions from header files\n\n!define OSVERSIONINFOA_SIZE   148\n!define OSVERSIONINFOEXA_SIZE 156\n!define VER_PLATFORM_WIN32_NT 2\n!define VER_NT_WORKSTATION    1\n\n!define SM_TABLETPC    86\n!define SM_MEDIACENTER 87\n!define SM_STARTER     88\n!define SM_SERVERR2    89\n\n# variable declaration\n\n!macro __WinVer_DeclareVars\n\n  !ifndef __WINVER_VARS_DECLARED\n\n    !define __WINVER_VARS_DECLARED\n\n    Var /GLOBAL __WINVERV\n    Var /GLOBAL __WINVERSP\n\n  !endif\n\n!macroend\n\n# lazy initialization macro\n\n!ifmacrondef __WinVer_Call_GetVersionEx\n\n  !macro __WinVer_Call_GetVersionEx STRUCT_SIZE\n\n    System::Call '*$0(i ${STRUCT_SIZE})'\n    System::Call kernel32::GetVersionEx(ir0)i.r3\n\n  !macroend\n\n!endif\n\n!macro __WinVer_InitVars\n  # variables\n  !insertmacro __WinVer_DeclareVars\n\n  # only calculate version once\n  StrCmp $__WINVERV \"\" _winver_noveryet\n    Return\n  _winver_noveryet:\n\n  # push used registers on the stack\n  Push $0\n  Push $1 ;maj\n  Push $2 ;min\n  Push $3 ;bld\n  Push $R0 ;temp\n\n  # allocate memory\n  System::Alloc ${OSVERSIONINFOEXA_SIZE}\n  Pop $0\n\n  # use OSVERSIONINFOEX\n  !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFOEXA_SIZE}\n\n  IntCmp $3 0 \"\" _winver_ex _winver_ex\n    # OSVERSIONINFOEX not allowed (Win9x or NT4 w/SP < 6), use OSVERSIONINFO\n    !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFOA_SIZE}\n  _winver_ex:\n\n  # get results from struct\n  System::Call '*$0(i.s,i.r1,i.r2,i.r3,i.s,&t128.s,&i2.s,&i2,&i2,&i1.s,&i1)'\n\n  # free struct\n  System::Free $0\n\n  # win9x has major and minor info in high word of dwBuildNumber - remove it\n  IntOp $3 $3 & 0xFFFF\n\n  # get dwOSVersionInfoSize\n  Pop $R0\n\n  # get dwPlatformId\n  Pop $0\n\n  # NT?\n  IntCmp $0 ${VER_PLATFORM_WIN32_NT} \"\" _winver_notnt _winver_notnt\n    IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTBIT}\n    IntOp $__WINVERV  $__WINVERV  | ${_WINVER_NTBIT}\n  _winver_notnt:\n\n  # get service pack information\n  IntCmp $0 ${VER_PLATFORM_WIN32_NT} _winver_nt \"\" _winver_nt  # win9x\n\n    # get szCSDVersion\n    Pop $0\n\n    # copy second char\n    StrCpy $0 $0 1 1\n\n    # discard invalid wServicePackMajor and wProductType\n    Pop $R0\n    Pop $R0\n\n    # switch\n    StrCmp $0 'A' \"\" +3\n      StrCpy $0 1\n      Goto _winver_sp_done\n    StrCmp $0 'B' \"\" +3\n      StrCpy $0 2\n      Goto _winver_sp_done\n    StrCmp $0 'C' \"\" +3\n      StrCpy $0 3\n      Goto _winver_sp_done\n    StrCpy $0 0\n    Goto _winver_sp_done\n\n  _winver_nt: # nt\n\n    IntCmp $R0 ${OSVERSIONINFOEXA_SIZE} \"\" _winver_sp_noex _winver_sp_noex\n\n      # discard szCSDVersion\n      Pop $0\n\n      # get wProductType\n      Exch\n      Pop $0\n\n      # is server?\n      IntCmp $0 ${VER_NT_WORKSTATION} _winver_noserver _winver_noserver \"\"\n        IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTSRVBIT}\n      _winver_noserver:\n\n      # get wServicePackMajor\n      Pop $0\n\n      # done with sp\n      Goto _winver_sp_done\n\n    _winver_sp_noex: # OSVERSIONINFO, not OSVERSIONINFOEX\n\n      ####  TODO\n      ## For IsServer to support < NT4SP6, we need to check the registry\n      ## here to see if we are a server and/or DC\n\n      # get szCSDVersion\n      Pop $0\n\n      # discard invalid wServicePackMajor and wProductType\n      Pop $R0\n      Pop $R0\n\n      # get service pack number from text\n      StrCpy $R0 $0 13\n      StrCmp $R0 \"Service Pack \" \"\" +3\n        StrCpy $0 $0 \"\" 13 # cut \"Service Pack \"\n        Goto +2\n        StrCpy $0 0 # no service pack\n\n!ifdef WINVER_NT4_OVER_W95\n      IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT}\n!endif\n\n  _winver_sp_done:\n\n  # store service pack\n  IntOp $0 $0 << 16\n  IntOp $__WINVERSP $__WINVERSP | $0\n\n  ### now for the version\n\n  # is server?\n  IntOp $0 $__WINVERSP & ${_WINVER_NTSRVBIT}\n\n  # windows xp x64?\n  IntCmp $0 0 \"\" _winver_not_xp_x64 _winver_not_xp_x64 # not server\n  IntCmp $1 5 \"\" _winver_not_xp_x64 _winver_not_xp_x64 # maj 5\n  IntCmp $2 2 \"\" _winver_not_xp_x64 _winver_not_xp_x64 # min 2\n    # change XP x64 from 5.2 to 5.1 so it's still XP\n    StrCpy $2 1\n  _winver_not_xp_x64:\n\n  # server 2008?\n  IntCmp $0 0 _winver_not_ntserver # server\n  IntCmp 6 $1 \"\" \"\" _winver_not_ntserver # maj 6\n    # extra bit so Server 2008 comes after Vista SP1 that has the same minor version, same for Win7 vs 2008R2\n    IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT}\n  _winver_not_ntserver:\n\n  # pack version\n  IntOp $1 $1 << 24 # VerMajor\n  IntOp $__WINVERV $__WINVERV | $1\n  IntOp $0 $2 << 16\n  IntOp $__WINVERV $__WINVERV | $0 # VerMinor\n  IntOp $__WINVERSP $__WINVERSP | $3 # VerBuild\n\n  # restore registers\n  Pop $R0\n  Pop $3\n  Pop $2\n  Pop $1\n  Pop $0\n\n!macroend\n\n# version comparison LogicLib macros\n\n!macro _WinVerAtLeast _a _b _t _f\n  !insertmacro _LOGICLIB_TEMP\n  ${CallArtificialFunction} __WinVer_InitVars\n  IntOp $_LOGICLIB_TEMP $__WINVERV & ${_WINVER_NTMASK}\n  !insertmacro _>= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}`\n!macroend\n!macro _WinVerIs _a _b _t _f\n  ${CallArtificialFunction} __WinVer_InitVars\n  !insertmacro _= $__WINVERV `${_b}` `${_t}` `${_f}`\n!macroend\n!macro _WinVerAtMost _a _b _t _f\n  !insertmacro _LOGICLIB_TEMP\n  ${CallArtificialFunction} __WinVer_InitVars\n  IntOp $_LOGICLIB_TEMP $__WINVERV & ${_WINVER_NTMASK}\n  !insertmacro _<= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}`\n!macroend\n\n!macro __WinVer_DefineOSTest Test OS Suffix\n  !define ${Test}Win${OS} `\"\" WinVer${Test} ${WINVER_${OS}${Suffix}}`\n!macroend\n\n!macro __WinVer_DefineOSTests Test Suffix\n  !insertmacro __WinVer_DefineOSTest ${Test} 95     '${Suffix}'\n  !insertmacro __WinVer_DefineOSTest ${Test} 98     '${Suffix}'\n  !insertmacro __WinVer_DefineOSTest ${Test} ME     '${Suffix}'\n  !insertmacro __WinVer_DefineOSTest ${Test} NT4    '${Suffix}'\n  !insertmacro __WinVer_DefineOSTest ${Test} 2000   '${Suffix}'\n  !insertmacro __WinVer_DefineOSTest ${Test} XP     '${Suffix}'\n  !insertmacro __WinVer_DefineOSTest ${Test} 2003   '${Suffix}'\n  !insertmacro __WinVer_DefineOSTest ${Test} VISTA  '${Suffix}'\n  !insertmacro __WinVer_DefineOSTest ${Test} 2008   '${Suffix}'\n  !insertmacro __WinVer_DefineOSTest ${Test} 7      '${Suffix}'\n  !insertmacro __WinVer_DefineOSTest ${Test} 2008R2 '${Suffix}'\n!macroend\n\n!insertmacro __WinVer_DefineOSTests AtLeast \"\"\n!insertmacro __WinVer_DefineOSTests Is _NT\n!insertmacro __WinVer_DefineOSTests AtMost \"\"\n\n# version feature LogicLib macros\n\n!macro _IsNT _a _b _t _f\n  !insertmacro _LOGICLIB_TEMP\n  ${CallArtificialFunction} __WinVer_InitVars\n  IntOp $_LOGICLIB_TEMP $__WINVERSP & ${_WINVER_NTBIT}\n  !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}`\n!macroend\n!define IsNT `\"\" IsNT \"\"`\n\n!macro _IsServerOS _a _b _t _f\n  !insertmacro _LOGICLIB_TEMP\n  ${CallArtificialFunction} __WinVer_InitVars\n  IntOp $_LOGICLIB_TEMP $__WINVERSP & ${_WINVER_NTSRVBIT}\n  !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}`\n!macroend\n!define IsServerOS `\"\" IsServerOS \"\"`\n\n# service pack macros\n\n!macro _WinVer_GetServicePackLevel OUTVAR\n  ${CallArtificialFunction} __WinVer_InitVars\n  IntOp ${OUTVAR} $__WINVERSP & ${_WINVER_MASKSP}\n  IntOp ${OUTVAR} ${OUTVAR} >> 16\n!macroend\n!define WinVerGetServicePackLevel '!insertmacro _WinVer_GetServicePackLevel '\n\n!macro _AtLeastServicePack _a _b _t _f\n  !insertmacro _LOGICLIB_TEMP\n  ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP\n  !insertmacro _>= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}`\n!macroend\n!define AtLeastServicePack `\"\" AtLeastServicePack`\n\n!macro _AtMostServicePack _a _b _t _f\n  !insertmacro _LOGICLIB_TEMP\n  ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP\n  !insertmacro _<= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}`\n!macroend\n!define AtMostServicePack `\"\" AtMostServicePack`\n\n!macro _IsServicePack _a _b _t _f\n  !insertmacro _LOGICLIB_TEMP\n  ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP\n  !insertmacro _= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}`\n!macroend\n!define IsServicePack `\"\" IsServicePack`\n\n# special feature LogicLib macros\n\n!macro _WinVer_SysMetricCheck m _b _t _f\n  !insertmacro _LOGICLIB_TEMP\n  System::Call user32::GetSystemMetrics(i${m})i.s\n  pop $_LOGICLIB_TEMP\n  !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}`\n!macroend\n\n!define IsWin2003R2        `${SM_SERVERR2}    WinVer_SysMetricCheck \"\"`\n!define IsStarterEdition   `${SM_STARTER}     WinVer_SysMetricCheck \"\"`\n!define OSHasMediaCenter   `${SM_MEDIACENTER} WinVer_SysMetricCheck \"\"`\n!define OSHasTabletSupport `${SM_TABLETPC}    WinVer_SysMetricCheck \"\"`\n\n# version retrieval macros\n\n!macro __WinVer_GetVer var rshift mask outvar\n  ${CallArtificialFunction} __WinVer_InitVars\n  !if \"${mask}\" != \"\"\n    IntOp ${outvar} ${var} & ${mask}\n    !if \"${rshift}\" != \"\"\n      IntOp ${outvar} ${outvar} >> ${rshift}\n    !endif\n  !else\n    IntOp ${outvar} ${var} >> ${rshift}\n  !endif\n!macroend\n\n!define WinVerGetMajor '!insertmacro __WinVer_GetVer $__WINVERV  24 ${_WINVER_MASKVMAJ}'\n!define WinVerGetMinor '!insertmacro __WinVer_GetVer $__WINVERV  16 ${_WINVER_MASKVMIN}'\n!define WinVerGetBuild '!insertmacro __WinVer_GetVer $__WINVERSP \"\" ${_WINVER_MASKVBLD}'\n\n# done\n\n!endif # !___WINVER__NSH___\n\n!verbose pop\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/WordFunc.nsh",
    "content": "/*\n_____________________________________________________________________________\n\n                       Word Functions Header v3.3\n_____________________________________________________________________________\n\n 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)\n\n See documentation for more information about the following functions.\n\n Usage in script:\n 1. !include \"WordFunc.nsh\"\n 2. [Section|Function]\n      ${WordFunction} \"Param1\" \"Param2\" \"...\" $var\n    [SectionEnd|FunctionEnd]\n\n\n WordFunction=[WordFind|WordFindS|WordFind2X|WordFind2XS|WordFind3X|WordFind3XS|\n               WordReplace|WordReplaceS|WordAdd|WordAddS|WordInsert|WordInsertS|\n               StrFilter|StrFilterS|VersionCompare|VersionConvert]\n\n_____________________________________________________________________________\n\n                       Thanks to:\n_____________________________________________________________________________\n\nWordFind3X\n\tAfrow UK (Based on his idea of Function \"StrSortLR\")\nStrFilter\n\tsunjammer (Function \"StrUpper\")\nVersionCompare\n\tAfrow UK (Based on his Function \"VersionCheckNew2\")\nVersionConvert\n\tAfrow UK (Based on his idea of Function \"CharIndexReplace\")\n*/\n\n\n;_____________________________________________________________________________\n;\n;                         Macros\n;_____________________________________________________________________________\n;\n; Change log window verbosity (default: 3=no script)\n;\n; Example:\n; !include \"WordFunc.nsh\"\n; !insertmacro WordFind\n; ${WORDFUNC_VERBOSE} 4   # all verbosity\n; !insertmacro WordReplace\n; ${WORDFUNC_VERBOSE} 3   # no script\n\n!ifndef WORDFUNC_INCLUDED\n!define WORDFUNC_INCLUDED\n\n!include Util.nsh\n\n!verbose push\n!verbose 3\n!ifndef _WORDFUNC_VERBOSE\n\t!define _WORDFUNC_VERBOSE 3\n!endif\n!verbose ${_WORDFUNC_VERBOSE}\n!define WORDFUNC_VERBOSE `!insertmacro WORDFUNC_VERBOSE`\n!verbose pop\n\n!macro WORDFUNC_VERBOSE _VERBOSE\n\t!verbose push\n\t!verbose 3\n\t!undef _WORDFUNC_VERBOSE\n\t!define _WORDFUNC_VERBOSE ${_VERBOSE}\n\t!verbose pop\n!macroend\n\n\n!macro WordFindCall _ART _STRING _DELIMITER _OPTION _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING}`\n\tPush `${_DELIMITER}`\n\tPush `${_OPTION}`\n\t${CallArtificialFunction}${_ART} WordFind_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro WordFindSCall _ART _STRING _DELIMITER _OPTION _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING}`\n\tPush `${_DELIMITER}`\n\tPush `${_OPTION}`\n\t${CallArtificialFunction}${_ART} WordFindS_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro WordFind2XCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING}`\n\tPush `${_DELIMITER1}`\n\tPush `${_DELIMITER2}`\n\tPush `${_NUMBER}`\n\t${CallArtificialFunction} WordFind2X_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro WordFind2XSCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING}`\n\tPush `${_DELIMITER1}`\n\tPush `${_DELIMITER2}`\n\tPush `${_NUMBER}`\n\t${CallArtificialFunction} WordFind2XS_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro WordFind3XCall _STRING _DELIMITER1 _CENTER _DELIMITER2 _NUMBER _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING}`\n\tPush `${_DELIMITER1}`\n\tPush `${_CENTER}`\n\tPush `${_DELIMITER2}`\n\tPush `${_NUMBER}`\n\t${CallArtificialFunction} WordFind3X_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro WordFind3XSCall _STRING _DELIMITER1 _CENTER _DELIMITER2 _NUMBER _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING}`\n\tPush `${_DELIMITER1}`\n\tPush `${_CENTER}`\n\tPush `${_DELIMITER2}`\n\tPush `${_NUMBER}`\n\t${CallArtificialFunction} WordFind3XS_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro WordReplaceCall _STRING _WORD1 _WORD2 _NUMBER _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING}`\n\tPush `${_WORD1}`\n\tPush `${_WORD2}`\n\tPush `${_NUMBER}`\n\t${CallArtificialFunction} WordReplace_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro WordReplaceSCall _STRING _WORD1 _WORD2 _NUMBER _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING}`\n\tPush `${_WORD1}`\n\tPush `${_WORD2}`\n\tPush `${_NUMBER}`\n\t${CallArtificialFunction} WordReplaceS_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro WordAddCall _STRING1 _DELIMITER _STRING2 _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING1}`\n\tPush `${_DELIMITER}`\n\tPush `${_STRING2}`\n\t${CallArtificialFunction} WordAdd_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro WordAddSCall _STRING1 _DELIMITER _STRING2 _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING1}`\n\tPush `${_DELIMITER}`\n\tPush `${_STRING2}`\n\t${CallArtificialFunction} WordAddS_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro WordInsertCall _STRING _DELIMITER _WORD _NUMBER _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING}`\n\tPush `${_DELIMITER}`\n\tPush `${_WORD}`\n\tPush `${_NUMBER}`\n\t${CallArtificialFunction} WordInsert_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro WordInsertSCall _STRING _DELIMITER _WORD _NUMBER _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING}`\n\tPush `${_DELIMITER}`\n\tPush `${_WORD}`\n\tPush `${_NUMBER}`\n\t${CallArtificialFunction} WordInsertS_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro StrFilterCall _STRING _FILTER _INCLUDE _EXCLUDE _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING}`\n\tPush `${_FILTER}`\n\tPush `${_INCLUDE}`\n\tPush `${_EXCLUDE}`\n\t${CallArtificialFunction} StrFilter_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro StrFilterSCall _STRING _FILTER _INCLUDE _EXCLUDE _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_STRING}`\n\tPush `${_FILTER}`\n\tPush `${_INCLUDE}`\n\tPush `${_EXCLUDE}`\n\t${CallArtificialFunction} StrFilterS_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro VersionCompareCall _VER1 _VER2 _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_VER1}`\n\tPush `${_VER2}`\n\t${CallArtificialFunction} VersionCompare_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro VersionConvertCall _VERSION _CHARLIST _RESULT\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\tPush `${_VERSION}`\n\tPush `${_CHARLIST}`\n\t${CallArtificialFunction} VersionConvert_\n\tPop ${_RESULT}\n\t!verbose pop\n!macroend\n\n!macro WordFindBody _WORDFUNC_S\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tExch 2\n\tExch $R0\n\tExch 2\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $8\n\tPush $9\n\tPush $R1\n\tPush $R2\n\tClearErrors\n\n\tStrCpy $9 ''\n\tStrCpy $2 $1 1\n\tStrCpy $1 $1 '' 1\n\tStrCmp $2 'E' 0 +3\n\tStrCpy $9 E\n\tgoto -4\n\n\tStrCpy $3 ''\n\tStrCmp${_WORDFUNC_S} $2 '+' +6\n\tStrCmp${_WORDFUNC_S} $2 '-' +5\n\tStrCmp${_WORDFUNC_S} $2 '/' WordFunc_WordFind${_WORDFUNC_S}_restart\n\tStrCmp${_WORDFUNC_S} $2 '#' WordFunc_WordFind${_WORDFUNC_S}_restart\n\tStrCmp${_WORDFUNC_S} $2 '*' WordFunc_WordFind${_WORDFUNC_S}_restart\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_error3\n\n\tStrCpy $4 $1 1 -1\n\tStrCmp${_WORDFUNC_S} $4 '*' +4\n\tStrCmp${_WORDFUNC_S} $4 '}' +3\n\tStrCmp${_WORDFUNC_S} $4 '{' +2\n\tgoto +4\n\tStrCpy $1 $1 -1\n\tStrCpy $3 '$4$3'\n\tgoto -7\n\tStrCmp${_WORDFUNC_S} $3 '*' WordFunc_WordFind${_WORDFUNC_S}_error3\n\tStrCmp${_WORDFUNC_S} $3 '**' WordFunc_WordFind${_WORDFUNC_S}_error3\n\tStrCmp${_WORDFUNC_S} $3 '}{' WordFunc_WordFind${_WORDFUNC_S}_error3\n\tIntOp $1 $1 + 0\n\tStrCmp${_WORDFUNC_S} $1 0 WordFunc_WordFind${_WORDFUNC_S}_error2\n\n\tWordFunc_WordFind${_WORDFUNC_S}_restart:\n\tStrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind${_WORDFUNC_S}_error1\n\tStrCpy $4 0\n\tStrCpy $5 0\n\tStrCpy $6 0\n\tStrLen $7 $0\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_loop\n\n\tWordFunc_WordFind${_WORDFUNC_S}_preloop:\n\tIntOp $6 $6 + 1\n\n\tWordFunc_WordFind${_WORDFUNC_S}_loop:\n\tStrCpy $8 $R0 $7 $6\n\tStrCmp${_WORDFUNC_S} $8$5 0 WordFunc_WordFind${_WORDFUNC_S}_error1\n\tStrLen $R2 $8\n\tIntCmp $R2 0 +2\n\tStrCmp${_WORDFUNC_S} $8 $0 +5 WordFunc_WordFind${_WORDFUNC_S}_preloop\n\tStrCmp${_WORDFUNC_S} $3 '{' WordFunc_WordFind${_WORDFUNC_S}_minus\n\tStrCmp${_WORDFUNC_S} $3 '}' WordFunc_WordFind${_WORDFUNC_S}_minus\n\tStrCmp${_WORDFUNC_S} $2 '*' WordFunc_WordFind${_WORDFUNC_S}_minus\n\tStrCmp${_WORDFUNC_S} $5 $6 WordFunc_WordFind${_WORDFUNC_S}_minus +5\n\tStrCmp${_WORDFUNC_S} $3 '{' +4\n\tStrCmp${_WORDFUNC_S} $3 '}' +3\n\tStrCmp${_WORDFUNC_S} $2 '*' +2\n\tStrCmp${_WORDFUNC_S} $5 $6 WordFunc_WordFind${_WORDFUNC_S}_nextword\n\tIntOp $4 $4 + 1\n\tStrCmp${_WORDFUNC_S} $2$4 +$1 WordFunc_WordFind${_WORDFUNC_S}_plus\n\tStrCmp${_WORDFUNC_S} $2 '/' 0 WordFunc_WordFind${_WORDFUNC_S}_nextword\n\tIntOp $8 $6 - $5\n\tStrCpy $8 $R0 $8 $5\n\tStrCmp${_WORDFUNC_S} $1 $8 0 WordFunc_WordFind${_WORDFUNC_S}_nextword\n\tStrCpy $R1 $4\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_end\n\tWordFunc_WordFind${_WORDFUNC_S}_nextword:\n\tIntOp $6 $6 + $7\n\tStrCpy $5 $6\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_loop\n\n\tWordFunc_WordFind${_WORDFUNC_S}_minus:\n\tStrCmp${_WORDFUNC_S} $2 '-' 0 WordFunc_WordFind${_WORDFUNC_S}_sum\n\tStrCpy $2 '+'\n\tIntOp $1 $4 - $1\n\tIntOp $1 $1 + 1\n\tIntCmp $1 0 WordFunc_WordFind${_WORDFUNC_S}_error2 WordFunc_WordFind${_WORDFUNC_S}_error2 WordFunc_WordFind${_WORDFUNC_S}_restart\n\tWordFunc_WordFind${_WORDFUNC_S}_sum:\n\tStrCmp${_WORDFUNC_S} $2 '#' 0 WordFunc_WordFind${_WORDFUNC_S}_sumdelim\n\tStrCpy $R1 $4\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_end\n\tWordFunc_WordFind${_WORDFUNC_S}_sumdelim:\n\tStrCmp${_WORDFUNC_S} $2 '*' 0 WordFunc_WordFind${_WORDFUNC_S}_error2\n\tStrCpy $R1 $4\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_end\n\n\tWordFunc_WordFind${_WORDFUNC_S}_plus:\n\tStrCmp${_WORDFUNC_S} $3 '' 0 +4\n\tIntOp $6 $6 - $5\n\tStrCpy $R1 $R0 $6 $5\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $3 '{' 0 +3\n\tStrCpy $R1 $R0 $6\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $3 '}' 0 +4\n\tIntOp $6 $6 + $7\n\tStrCpy $R1 $R0 '' $6\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $3 '{*' +2\n\tStrCmp${_WORDFUNC_S} $3 '*{' 0 +3\n\tStrCpy $R1 $R0 $6\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $3 '*}' +2\n\tStrCmp${_WORDFUNC_S} $3 '}*' 0 +3\n\tStrCpy $R1 $R0 '' $5\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $3 '}}' 0 +3\n\tStrCpy $R1 $R0 '' $6\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $3 '{{' 0 +3\n\tStrCpy $R1 $R0 $5\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $3 '{}' 0 WordFunc_WordFind${_WORDFUNC_S}_error3\n\tStrLen $3 $R0\n\tStrCmp${_WORDFUNC_S} $3 $6 0 +3\n\tStrCpy $0 ''\n\tgoto +2\n\tIntOp $6 $6 + $7\n\tStrCpy $8 $R0 '' $6\n\tStrCmp${_WORDFUNC_S} $4$8 1 +6\n\tStrCmp${_WORDFUNC_S} $4 1 +2 +7\n\tIntOp $6 $6 + $7\n\tStrCpy $3 $R0 $7 $6\n\tStrCmp${_WORDFUNC_S} $3 '' +2\n\tStrCmp${_WORDFUNC_S} $3 $0 -3 +3\n\tStrCpy $R1 ''\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $5 0 0 +3\n\tStrCpy $0 ''\n\tgoto +2\n\tIntOp $5 $5 - $7\n\tStrCpy $3 $R0 $5\n\tStrCpy $R1 '$3$0$8'\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_end\n\n\tWordFunc_WordFind${_WORDFUNC_S}_error3:\n\tStrCpy $R1 3\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_error\n\tWordFunc_WordFind${_WORDFUNC_S}_error2:\n\tStrCpy $R1 2\n\tgoto WordFunc_WordFind${_WORDFUNC_S}_error\n\tWordFunc_WordFind${_WORDFUNC_S}_error1:\n\tStrCpy $R1 1\n\tWordFunc_WordFind${_WORDFUNC_S}_error:\n\tStrCmp $9 'E' 0 +3\n\tSetErrors\n\n\tWordFunc_WordFind${_WORDFUNC_S}_end:\n\tStrCpy $R0 $R1\n\n\tPop $R2\n\tPop $R1\n\tPop $9\n\tPop $8\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\tExch $R0\n!macroend\n\n!define WordFind `!insertmacro WordFindCall ''`\n!define un.WordFind `!insertmacro WordFindCall ''`\n\n!macro WordFind\n!macroend\n\n!macro un.WordFind\n!macroend\n\n!macro WordFind_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro WordFindBody ''\n\n\t!verbose pop\n!macroend\n\n!define WordFindS `!insertmacro WordFindSCall ''`\n!define un.WordFindS `!insertmacro WordFindSCall ''`\n\n!macro WordFindS\n!macroend\n\n!macro un.WordFindS\n!macroend\n\n!macro WordFindS_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro WordFindBody 'S'\n\n\t!verbose pop\n!macroend\n\n!macro WordFind2XBody _WORDFUNC_S\n\tExch $2\n\tExch\n\tExch $1\n\tExch\n\tExch 2\n\tExch $0\n\tExch 2\n\tExch 3\n\tExch $R0\n\tExch 3\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $8\n\tPush $9\n\tPush $R1\n\tPush $R2\n\tClearErrors\n\n\tStrCpy $R2 ''\n\tStrCpy $3 $2 1\n\tStrCpy $2 $2 '' 1\n\tStrCmp $3 'E' 0 +3\n\tStrCpy $R2 E\n\tgoto -4\n\n\tStrCmp${_WORDFUNC_S} $3 '+' +5\n\tStrCmp${_WORDFUNC_S} $3 '-' +4\n\tStrCmp${_WORDFUNC_S} $3 '#' WordFunc_WordFind2X${_WORDFUNC_S}_restart\n\tStrCmp${_WORDFUNC_S} $3 '/' WordFunc_WordFind2X${_WORDFUNC_S}_restart\n\tgoto WordFunc_WordFind2X${_WORDFUNC_S}_error3\n\n\tStrCpy $4 $2 2 -2\n\tStrCmp${_WORDFUNC_S} $4 '{{' +9\n\tStrCmp${_WORDFUNC_S} $4 '}}' +8\n\tStrCmp${_WORDFUNC_S} $4 '{*' +7\n\tStrCmp${_WORDFUNC_S} $4 '*{' +6\n\tStrCmp${_WORDFUNC_S} $4 '*}' +5\n\tStrCmp${_WORDFUNC_S} $4 '}*' +4\n\tStrCmp${_WORDFUNC_S} $4 '{}' +3\n\tStrCpy $4 ''\n\tgoto +2\n\tStrCpy $2 $2 -2\n\tIntOp $2 $2 + 0\n\tStrCmp${_WORDFUNC_S} $2 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2\n\n\tWordFunc_WordFind2X${_WORDFUNC_S}_restart:\n\tStrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind2X${_WORDFUNC_S}_error1\n\tStrCpy $5 -1\n\tStrCpy $6 0\n\tStrCpy $7 ''\n\tStrLen $8 $0\n\tStrLen $9 $1\n\n\tWordFunc_WordFind2X${_WORDFUNC_S}_loop:\n\tIntOp $5 $5 + 1\n\n\tWordFunc_WordFind2X${_WORDFUNC_S}_delim1:\n\tStrCpy $R1 $R0 $8 $5\n\tStrCmp${_WORDFUNC_S} $R1$6 0 WordFunc_WordFind2X${_WORDFUNC_S}_error1\n\tStrCmp${_WORDFUNC_S} $R1 '' WordFunc_WordFind2X${_WORDFUNC_S}_minus\n\tStrCmp${_WORDFUNC_S} $R1 $0 +2\n\tStrCmp${_WORDFUNC_S} $7 '' WordFunc_WordFind2X${_WORDFUNC_S}_loop WordFunc_WordFind2X${_WORDFUNC_S}_delim2\n\tStrCmp${_WORDFUNC_S} $0 $1 0 +2\n\tStrCmp${_WORDFUNC_S} $7 '' 0 WordFunc_WordFind2X${_WORDFUNC_S}_delim2\n\tIntOp $7 $5 + $8\n\tStrCpy $5 $7\n\tgoto WordFunc_WordFind2X${_WORDFUNC_S}_delim1\n\n\tWordFunc_WordFind2X${_WORDFUNC_S}_delim2:\n\tStrCpy $R1 $R0 $9 $5\n\tStrCmp${_WORDFUNC_S} $R1 $1 0 WordFunc_WordFind2X${_WORDFUNC_S}_loop\n\tIntOp $6 $6 + 1\n\tStrCmp${_WORDFUNC_S} $3$6 '+$2' WordFunc_WordFind2X${_WORDFUNC_S}_plus\n\tStrCmp${_WORDFUNC_S} $3 '/' 0 WordFunc_WordFind2X${_WORDFUNC_S}_nextword\n\tIntOp $R1 $5 - $7\n\tStrCpy $R1 $R0 $R1 $7\n\tStrCmp${_WORDFUNC_S} $R1 $2 0 +3\n\tStrCpy $R1 $6\n\tgoto WordFunc_WordFind2X${_WORDFUNC_S}_end\n\tWordFunc_WordFind2X${_WORDFUNC_S}_nextword:\n\tIntOp $5 $5 + $9\n\tStrCpy $7 ''\n\tgoto WordFunc_WordFind2X${_WORDFUNC_S}_delim1\n\n\tWordFunc_WordFind2X${_WORDFUNC_S}_minus:\n\tStrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordFind2X${_WORDFUNC_S}_sum\n\tStrCpy $3 +\n\tIntOp $2 $6 - $2\n\tIntOp $2 $2 + 1\n\tIntCmp $2 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2 WordFunc_WordFind2X${_WORDFUNC_S}_error2 WordFunc_WordFind2X${_WORDFUNC_S}_restart\n\tWordFunc_WordFind2X${_WORDFUNC_S}_sum:\n\tStrCmp${_WORDFUNC_S} $3 '#' 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2\n\tStrCpy $R1 $6\n\tgoto WordFunc_WordFind2X${_WORDFUNC_S}_end\n\n\tWordFunc_WordFind2X${_WORDFUNC_S}_plus:\n\tStrCmp${_WORDFUNC_S} $4 '' 0 +4\n\tIntOp $R1 $5 - $7\n\tStrCpy $R1 $R0 $R1 $7\n\tgoto WordFunc_WordFind2X${_WORDFUNC_S}_end\n\tIntOp $5 $5 + $9\n\tIntOp $7 $7 - $8\n\tStrCmp${_WORDFUNC_S} $4 '{*' +2\n\tStrCmp${_WORDFUNC_S} $4 '*{' 0 +3\n\tStrCpy $R1 $R0 $5\n\tgoto WordFunc_WordFind2X${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $4 '*}' +2\n\tStrCmp${_WORDFUNC_S} $4 '}*' 0 +3\n\tStrCpy $R1 $R0 '' $7\n\tgoto WordFunc_WordFind2X${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $4 '}}' 0 +3\n\tStrCpy $R1 $R0 '' $5\n\tgoto WordFunc_WordFind2X${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $4 '{{' 0 +3\n\tStrCpy $R1 $R0 $7\n\tgoto WordFunc_WordFind2X${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $4 '{}' 0 WordFunc_WordFind2X${_WORDFUNC_S}_error3\n\tStrCpy $5 $R0 '' $5\n\tStrCpy $7 $R0 $7\n\tStrCpy $R1 '$7$5'\n\tgoto WordFunc_WordFind2X${_WORDFUNC_S}_end\n\n\tWordFunc_WordFind2X${_WORDFUNC_S}_error3:\n\tStrCpy $R1 3\n\tgoto WordFunc_WordFind2X${_WORDFUNC_S}_error\n\tWordFunc_WordFind2X${_WORDFUNC_S}_error2:\n\tStrCpy $R1 2\n\tgoto WordFunc_WordFind2X${_WORDFUNC_S}_error\n\tWordFunc_WordFind2X${_WORDFUNC_S}_error1:\n\tStrCpy $R1 1\n\tWordFunc_WordFind2X${_WORDFUNC_S}_error:\n\tStrCmp $R2 'E' 0 +3\n\tSetErrors\n\n\tWordFunc_WordFind2X${_WORDFUNC_S}_end:\n\tStrCpy $R0 $R1\n\n\tPop $R2\n\tPop $R1\n\tPop $9\n\tPop $8\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\tExch $R0\n!macroend\n\n!define WordFind2X `!insertmacro WordFind2XCall`\n!define un.WordFind2X `!insertmacro WordFind2XCall`\n\n!macro WordFind2X\n!macroend\n\n!macro un.WordFind2X\n!macroend\n\n!macro WordFind2X_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro WordFind2XBody ''\n\n\t!verbose pop\n!macroend\n\n!define WordFind2XS `!insertmacro WordFind2XSCall`\n!define un.WordFind2XS `!insertmacro WordFind2XSCall`\n\n!macro WordFind2XS\n!macroend\n\n!macro un.WordFind2XS\n!macroend\n\n!macro WordFind2XS_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro WordFind2XBody 'S'\n\n\t!verbose pop\n!macroend\n\n!macro WordFind3XBody _WORDFUNC_S\n\tExch $3\n\tExch\n\tExch $2\n\tExch\n\tExch 2\n\tExch $1\n\tExch 2\n\tExch 3\n\tExch $0\n\tExch 3\n\tExch 4\n\tExch $R0\n\tExch 4\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $8\n\tPush $9\n\tPush $R1\n\tPush $R2\n\tPush $R3\n\tPush $R4\n\tPush $R5\n\tClearErrors\n\n\tStrCpy $R5 ''\n\tStrCpy $4 $3 1\n\tStrCpy $3 $3 '' 1\n\tStrCmp $4 'E' 0 +3\n\tStrCpy $R5 E\n\tgoto -4\n\n\tStrCmp${_WORDFUNC_S} $4 '+' +5\n\tStrCmp${_WORDFUNC_S} $4 '-' +4\n\tStrCmp${_WORDFUNC_S} $4 '#' WordFunc_WordFind3X${_WORDFUNC_S}_restart\n\tStrCmp${_WORDFUNC_S} $4 '/' WordFunc_WordFind3X${_WORDFUNC_S}_restart\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_error3\n\n\tStrCpy $5 $3 2 -2\n\tStrCmp${_WORDFUNC_S} $5 '{{' +9\n\tStrCmp${_WORDFUNC_S} $5 '}}' +8\n\tStrCmp${_WORDFUNC_S} $5 '{*' +7\n\tStrCmp${_WORDFUNC_S} $5 '*{' +6\n\tStrCmp${_WORDFUNC_S} $5 '*}' +5\n\tStrCmp${_WORDFUNC_S} $5 '}*' +4\n\tStrCmp${_WORDFUNC_S} $5 '{}' +3\n\tStrCpy $5 ''\n\tgoto +2\n\tStrCpy $3 $3 -2\n\tIntOp $3 $3 + 0\n\tStrCmp${_WORDFUNC_S} $3 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2\n\n\tWordFunc_WordFind3X${_WORDFUNC_S}_restart:\n\tStrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind3X${_WORDFUNC_S}_error1\n\tStrCpy $6 -1\n\tStrCpy $7 0\n\tStrCpy $8 ''\n\tStrCpy $9 ''\n\tStrLen $R1 $0\n\tStrLen $R2 $1\n\tStrLen $R3 $2\n\n\tWordFunc_WordFind3X${_WORDFUNC_S}_loop:\n\tIntOp $6 $6 + 1\n\n\tWordFunc_WordFind3X${_WORDFUNC_S}_delim1:\n\tStrCpy $R4 $R0 $R1 $6\n\tStrCmp${_WORDFUNC_S} $R4$7 0 WordFunc_WordFind3X${_WORDFUNC_S}_error1\n\tStrCmp${_WORDFUNC_S} $R4 '' WordFunc_WordFind3X${_WORDFUNC_S}_minus\n\tStrCmp${_WORDFUNC_S} $R4 $0 +2\n\tStrCmp${_WORDFUNC_S} $8 '' WordFunc_WordFind3X${_WORDFUNC_S}_loop WordFunc_WordFind3X${_WORDFUNC_S}_center\n\tStrCmp${_WORDFUNC_S} $0 $1 +2\n\tStrCmp${_WORDFUNC_S} $0 $2 0 +2\n\tStrCmp${_WORDFUNC_S} $8 '' 0 WordFunc_WordFind3X${_WORDFUNC_S}_center\n\tIntOp $8 $6 + $R1\n\tStrCpy $6 $8\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_delim1\n\n\tWordFunc_WordFind3X${_WORDFUNC_S}_center:\n\tStrCmp${_WORDFUNC_S} $9 '' 0 WordFunc_WordFind3X${_WORDFUNC_S}_delim2\n\tStrCpy $R4 $R0 $R2 $6\n\tStrCmp${_WORDFUNC_S} $R4 $1 0 WordFunc_WordFind3X${_WORDFUNC_S}_loop\n\tIntOp $9 $6 + $R2\n\tStrCpy $6 $9\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_delim1\n\n\tWordFunc_WordFind3X${_WORDFUNC_S}_delim2:\n\tStrCpy $R4 $R0 $R3 $6\n\tStrCmp${_WORDFUNC_S} $R4 $2 0 WordFunc_WordFind3X${_WORDFUNC_S}_loop\n\tIntOp $7 $7 + 1\n\tStrCmp${_WORDFUNC_S} $4$7 '+$3' WordFunc_WordFind3X${_WORDFUNC_S}_plus\n\tStrCmp${_WORDFUNC_S} $4 '/' 0 WordFunc_WordFind3X${_WORDFUNC_S}_nextword\n\tIntOp $R4 $6 - $8\n\tStrCpy $R4 $R0 $R4 $8\n\tStrCmp${_WORDFUNC_S} $R4 $3 0 +3\n\tStrCpy $R4 $7\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_end\n\tWordFunc_WordFind3X${_WORDFUNC_S}_nextword:\n\tIntOp $6 $6 + $R3\n\tStrCpy $8 ''\n\tStrCpy $9 ''\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_delim1\n\n\tWordFunc_WordFind3X${_WORDFUNC_S}_minus:\n\tStrCmp${_WORDFUNC_S} $4 '-' 0 WordFunc_WordFind3X${_WORDFUNC_S}_sum\n\tStrCpy $4 +\n\tIntOp $3 $7 - $3\n\tIntOp $3 $3 + 1\n\tIntCmp $3 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2 WordFunc_WordFind3X${_WORDFUNC_S}_error2 WordFunc_WordFind3X${_WORDFUNC_S}_restart\n\tWordFunc_WordFind3X${_WORDFUNC_S}_sum:\n\tStrCmp${_WORDFUNC_S} $4 '#' 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2\n\tStrCpy $R4 $7\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_end\n\n\tWordFunc_WordFind3X${_WORDFUNC_S}_plus:\n\tStrCmp${_WORDFUNC_S} $5 '' 0 +4\n\tIntOp $R4 $6 - $8\n\tStrCpy $R4 $R0 $R4 $8\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_end\n\tIntOp $6 $6 + $R3\n\tIntOp $8 $8 - $R1\n\tStrCmp${_WORDFUNC_S} $5 '{*' +2\n\tStrCmp${_WORDFUNC_S} $5 '*{' 0 +3\n\tStrCpy $R4 $R0 $6\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $5 '*}' +2\n\tStrCmp${_WORDFUNC_S} $5 '}*' 0 +3\n\tStrCpy $R4 $R0 '' $8\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $5 '}}' 0 +3\n\tStrCpy $R4 $R0 '' $6\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $5 '{{' 0 +3\n\tStrCpy $R4 $R0 $8\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $5 '{}' 0 WordFunc_WordFind3X${_WORDFUNC_S}_error3\n\tStrCpy $6 $R0 '' $6\n\tStrCpy $8 $R0 $8\n\tStrCpy $R4 '$8$6'\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_end\n\n\tWordFunc_WordFind3X${_WORDFUNC_S}_error3:\n\tStrCpy $R4 3\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_error\n\tWordFunc_WordFind3X${_WORDFUNC_S}_error2:\n\tStrCpy $R4 2\n\tgoto WordFunc_WordFind3X${_WORDFUNC_S}_error\n\tWordFunc_WordFind3X${_WORDFUNC_S}_error1:\n\tStrCpy $R4 1\n\tWordFunc_WordFind3X${_WORDFUNC_S}_error:\n\tStrCmp $R5 'E' 0 +3\n\tSetErrors\n\n\tWordFunc_WordFind3X${_WORDFUNC_S}_end:\n\tStrCpy $R0 $R4\n\tPop $R5\n\tPop $R4\n\tPop $R3\n\tPop $R2\n\tPop $R1\n\tPop $9\n\tPop $8\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\tExch $R0\n!macroend\n\n!define WordFind3X `!insertmacro WordFind3XCall`\n!define un.WordFind3X `!insertmacro WordFind3XCall`\n\n!macro WordFind3X\n!macroend\n\n!macro un.WordFind3X\n!macroend\n\n!macro WordFind3X_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro WordFind3XBody ''\n\n\t!verbose pop\n!macroend\n\n!define WordFind3XS `!insertmacro WordFind3XSCall`\n!define un.WordFind3XS `!insertmacro WordFind3XSCall`\n\n!macro WordFind3XS\n!macroend\n\n!macro un.WordFind3XS\n!macroend\n\n!macro WordFind3XS_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro WordFind3XBody 'S'\n\n\t!verbose pop\n!macroend\n\n!macro WordReplaceBody _WORDFUNC_S\n\tExch $2\n\tExch\n\tExch $1\n\tExch\n\tExch 2\n\tExch $0\n\tExch 2\n\tExch 3\n\tExch $R0\n\tExch 3\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $8\n\tPush $9\n\tPush $R1\n\tClearErrors\n\n\tStrCpy $R1 $R0\n\tStrCpy $9 ''\n\tStrCpy $3 $2 1\n\tStrCpy $2 $2 '' 1\n\tStrCmp $3 'E' 0 +3\n\tStrCpy $9 E\n\tgoto -4\n\n\tStrCpy $4 $2 1 -1\n\tStrCpy $5 ''\n\tStrCpy $6 ''\n\tStrLen $7 $0\n\n\tStrCmp${_WORDFUNC_S} $7 0 WordFunc_WordReplace${_WORDFUNC_S}_error1\n\tStrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordReplace${_WORDFUNC_S}_error1\n\tStrCmp${_WORDFUNC_S} $3 '{' WordFunc_WordReplace${_WORDFUNC_S}_beginning\n\tStrCmp${_WORDFUNC_S} $3 '}' WordFunc_WordReplace${_WORDFUNC_S}_ending WordFunc_WordReplace${_WORDFUNC_S}_errorchk\n\n\tWordFunc_WordReplace${_WORDFUNC_S}_beginning:\n\tStrCpy $8 $R0 $7\n\tStrCmp${_WORDFUNC_S} $8 $0 0 +4\n\tStrCpy $R0 $R0 '' $7\n\tStrCpy $5 '$5$1'\n\tgoto -4\n\tStrCpy $3 $2 1\n\tStrCmp${_WORDFUNC_S} $3 '}' 0 WordFunc_WordReplace${_WORDFUNC_S}_merge\n\n\tWordFunc_WordReplace${_WORDFUNC_S}_ending:\n\tStrCpy $8 $R0 '' -$7\n\tStrCmp${_WORDFUNC_S} $8 $0 0 +4\n\tStrCpy $R0 $R0 -$7\n\tStrCpy $6 '$6$1'\n\tgoto -4\n\n\tWordFunc_WordReplace${_WORDFUNC_S}_merge:\n\tStrCmp${_WORDFUNC_S} $4 '*' 0 +5\n\tStrCmp${_WORDFUNC_S} $5 '' +2\n\tStrCpy $5 $1\n\tStrCmp${_WORDFUNC_S} $6 '' +2\n\tStrCpy $6 $1\n\tStrCpy $R0 '$5$R0$6'\n\tgoto WordFunc_WordReplace${_WORDFUNC_S}_end\n\n\tWordFunc_WordReplace${_WORDFUNC_S}_errorchk:\n\tStrCmp${_WORDFUNC_S} $3 '+' +2\n\tStrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordReplace${_WORDFUNC_S}_error3\n\n\tStrCpy $5 $2 1\n\tIntOp $2 $2 + 0\n\tStrCmp${_WORDFUNC_S} $2 0 0 WordFunc_WordReplace${_WORDFUNC_S}_one\n\tStrCmp${_WORDFUNC_S} $5 0 WordFunc_WordReplace${_WORDFUNC_S}_error2\n\tStrCpy $3 ''\n\n\tWordFunc_WordReplace${_WORDFUNC_S}_all:\n\tStrCpy $5 0\n\tStrCpy $2 $R0 $7 $5\n\tStrCmp${_WORDFUNC_S} $2 '' +4\n\tStrCmp${_WORDFUNC_S} $2 $0 +6\n\tIntOp $5 $5 + 1\n\tgoto -4\n\tStrCmp${_WORDFUNC_S} $R0 $R1 WordFunc_WordReplace${_WORDFUNC_S}_error1\n\tStrCpy $R0 '$3$R0'\n\tgoto WordFunc_WordReplace${_WORDFUNC_S}_end\n\tStrCpy $2 $R0 $5\n\tIntOp $5 $5 + $7\n\tStrCmp${_WORDFUNC_S} $4 '*' 0 +3\n\tStrCpy $6 $R0 $7 $5\n\tStrCmp${_WORDFUNC_S} $6 $0 -3\n\tStrCpy $R0 $R0 '' $5\n\tStrCpy $3 '$3$2$1'\n\tgoto WordFunc_WordReplace${_WORDFUNC_S}_all\n\n\tWordFunc_WordReplace${_WORDFUNC_S}_one:\n\tStrCpy $5 0\n\tStrCpy $8 0\n\tgoto WordFunc_WordReplace${_WORDFUNC_S}_loop\n\n\tWordFunc_WordReplace${_WORDFUNC_S}_preloop:\n\tIntOp $5 $5 + 1\n\n\tWordFunc_WordReplace${_WORDFUNC_S}_loop:\n\tStrCpy $6 $R0 $7 $5\n\tStrCmp${_WORDFUNC_S} $6$8 0 WordFunc_WordReplace${_WORDFUNC_S}_error1\n\tStrCmp${_WORDFUNC_S} $6 '' WordFunc_WordReplace${_WORDFUNC_S}_minus\n\tStrCmp${_WORDFUNC_S} $6 $0 0 WordFunc_WordReplace${_WORDFUNC_S}_preloop\n\tIntOp $8 $8 + 1\n\tStrCmp${_WORDFUNC_S} $3$8 +$2 WordFunc_WordReplace${_WORDFUNC_S}_found\n\tIntOp $5 $5 + $7\n\tgoto WordFunc_WordReplace${_WORDFUNC_S}_loop\n\n\tWordFunc_WordReplace${_WORDFUNC_S}_minus:\n\tStrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordReplace${_WORDFUNC_S}_error2\n\tStrCpy $3 +\n\tIntOp $2 $8 - $2\n\tIntOp $2 $2 + 1\n\tIntCmp $2 0 WordFunc_WordReplace${_WORDFUNC_S}_error2 WordFunc_WordReplace${_WORDFUNC_S}_error2 WordFunc_WordReplace${_WORDFUNC_S}_one\n\n\tWordFunc_WordReplace${_WORDFUNC_S}_found:\n\tStrCpy $3 $R0 $5\n\tStrCmp${_WORDFUNC_S} $4 '*' 0 +5\n\tStrCpy $6 $3 '' -$7\n\tStrCmp${_WORDFUNC_S} $6 $0 0 +3\n\tStrCpy $3 $3 -$7\n\tgoto -3\n\tIntOp $5 $5 + $7\n\tStrCmp${_WORDFUNC_S} $4 '*' 0 +3\n\tStrCpy $6 $R0 $7 $5\n\tStrCmp${_WORDFUNC_S} $6 $0 -3\n\tStrCpy $R0 $R0 '' $5\n\tStrCpy $R0 '$3$1$R0'\n\tgoto WordFunc_WordReplace${_WORDFUNC_S}_end\n\n\tWordFunc_WordReplace${_WORDFUNC_S}_error3:\n\tStrCpy $R0 3\n\tgoto WordFunc_WordReplace${_WORDFUNC_S}_error\n\tWordFunc_WordReplace${_WORDFUNC_S}_error2:\n\tStrCpy $R0 2\n\tgoto WordFunc_WordReplace${_WORDFUNC_S}_error\n\tWordFunc_WordReplace${_WORDFUNC_S}_error1:\n\tStrCpy $R0 1\n\tWordFunc_WordReplace${_WORDFUNC_S}_error:\n\tStrCmp $9 'E' +3\n\tStrCpy $R0 $R1\n\tgoto +2\n\tSetErrors\n\n\tWordFunc_WordReplace${_WORDFUNC_S}_end:\n\tPop $R1\n\tPop $9\n\tPop $8\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\tExch $R0\n!macroend\n\n!define WordReplace `!insertmacro WordReplaceCall`\n!define un.WordReplace `!insertmacro WordReplaceCall`\n\n!macro WordReplace\n!macroend\n\n!macro un.WordReplace\n!macroend\n\n!macro WordReplace_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro WordReplaceBody ''\n\n\t!verbose pop\n!macroend\n\n!define WordReplaceS `!insertmacro WordReplaceSCall`\n!define un.WordReplaceS `!insertmacro WordReplaceSCall`\n\n!macro WordReplaceS\n!macroend\n\n!macro un.WordReplaceS\n!macroend\n\n!macro WordReplaceS_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro WordReplaceBody 'S'\n\n\t!verbose pop\n!macroend\n\n!macro WordAddBody _WORDFUNC_S\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tExch 2\n\tExch $R0\n\tExch 2\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $R1\n\tClearErrors\n\n\tStrCpy $7 ''\n\tStrCpy $2 $1 1\n\tStrCmp $2 'E' 0 +4\n\tStrCpy $7 E\n\tStrCpy $1 $1 '' 1\n\tgoto -4\n\n\tStrCpy $5 0\n\tStrCpy $R1 $R0\n\tStrCpy $2 $1 '' 1\n\tStrCpy $1 $1 1\n\tStrCmp${_WORDFUNC_S} $1 '+' +2\n\tStrCmp${_WORDFUNC_S} $1 '-' 0 WordFunc_WordAdd${_WORDFUNC_S}_error3\n\n\tStrCmp${_WORDFUNC_S} $0 '' WordFunc_WordAdd${_WORDFUNC_S}_error1\n\tStrCmp${_WORDFUNC_S} $2 '' WordFunc_WordAdd${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $R0 '' 0 +5\n\tStrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $1 '+' 0 +3\n\tStrCpy $R0 $2\n\tgoto WordFunc_WordAdd${_WORDFUNC_S}_end\n\n\tWordFunc_WordAdd${_WORDFUNC_S}_loop:\n\tIntOp $5 $5 + 1\n\t!insertmacro WordFind${_WORDFUNC_S}Call 2 $2 $0 E+$5 $3\n\tIfErrors 0 WordFunc_WordAdd${_WORDFUNC_S}_/word\n\tStrCmp${_WORDFUNC_S} $3 2 +4\n\tStrCmp${_WORDFUNC_S} $3$5 11 0 +3\n\tStrCpy $3 $2\n\tgoto WordFunc_WordAdd${_WORDFUNC_S}_/word\n\tStrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_end WordFunc_WordAdd${_WORDFUNC_S}_preend\n\n\tWordFunc_WordAdd${_WORDFUNC_S}_/word:\n\t!insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E/$3 $4\n\tIfErrors +2\n\tStrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_delete WordFunc_WordAdd${_WORDFUNC_S}_loop\n\tStrCmp${_WORDFUNC_S} $1$4 '-1' +2\n\tStrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_loop +4\n\tStrCmp${_WORDFUNC_S} $R0 $3 0 WordFunc_WordAdd${_WORDFUNC_S}_loop\n\tStrCpy $R0 ''\n\tgoto WordFunc_WordAdd${_WORDFUNC_S}_end\n\tStrCmp${_WORDFUNC_S} $1$4 '+1' 0 +2\n\tStrCmp${_WORDFUNC_S} $R0 $3 WordFunc_WordAdd${_WORDFUNC_S}_loop\n\tStrCmp${_WORDFUNC_S} $R0 $R1 +3\n\tStrCpy $R1 '$R1$0$3'\n\tgoto WordFunc_WordAdd${_WORDFUNC_S}_loop\n\tStrLen $6 $0\n\tStrCpy $6 $R0 '' -$6\n\tStrCmp${_WORDFUNC_S} $6 $0 0 -4\n\tStrCpy $R1 '$R1$3'\n\tgoto WordFunc_WordAdd${_WORDFUNC_S}_loop\n\n\tWordFunc_WordAdd${_WORDFUNC_S}_delete:\n\t!insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E+$4{} $R0\n\tgoto WordFunc_WordAdd${_WORDFUNC_S}_/word\n\n\tWordFunc_WordAdd${_WORDFUNC_S}_error3:\n\tStrCpy $R1 3\n\tgoto WordFunc_WordAdd${_WORDFUNC_S}_error\n\tWordFunc_WordAdd${_WORDFUNC_S}_error1:\n\tStrCpy $R1 1\n\tWordFunc_WordAdd${_WORDFUNC_S}_error:\n\tStrCmp $7 'E' 0 WordFunc_WordAdd${_WORDFUNC_S}_end\n\tSetErrors\n\n\tWordFunc_WordAdd${_WORDFUNC_S}_preend:\n\tStrCpy $R0 $R1\n\n\tWordFunc_WordAdd${_WORDFUNC_S}_end:\n\tPop $R1\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\tExch $R0\n!macroend\n\n!define WordAdd `!insertmacro WordAddCall`\n!define un.WordAdd `!insertmacro WordAddCall`\n\n!macro WordAdd\n!macroend\n\n!macro un.WordAdd\n!macroend\n\n!macro WordAdd_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro WordAddBody ''\n\n\t!verbose pop\n!macroend\n\n!define WordAddS `!insertmacro WordAddSCall`\n!define un.WordAddS `!insertmacro WordAddSCall`\n\n!macro WordAddS\n!macroend\n\n!macro un.WordAddS\n!macroend\n\n!macro WordAddS_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro WordAddBody 'S'\n\n\t!verbose pop\n!macroend\n\n!macro WordInsertBody _WORDFUNC_S\n\tExch $2\n\tExch\n\tExch $1\n\tExch\n\tExch 2\n\tExch $0\n\tExch 2\n\tExch 3\n\tExch $R0\n\tExch 3\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $8\n\tPush $9\n\tPush $R1\n\tClearErrors\n\n\tStrCpy $5 ''\n\tStrCpy $6 $0\n\tStrCpy $7 }\n\n\tStrCpy $9 ''\n\tStrCpy $R1 $R0\n\tStrCpy $3 $2 1\n\tStrCpy $2 $2 '' 1\n\tStrCmp $3 'E' 0 +3\n\tStrCpy $9 'E'\n\tgoto -4\n\n\tStrCmp${_WORDFUNC_S} $3 '+' +2\n\tStrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordInsert${_WORDFUNC_S}_error3\n\tIntOp $2 $2 + 0\n\tStrCmp${_WORDFUNC_S} $2 0 WordFunc_WordInsert${_WORDFUNC_S}_error2\n\tStrCmp${_WORDFUNC_S} $0 '' WordFunc_WordInsert${_WORDFUNC_S}_error1\n\n\tStrCmp${_WORDFUNC_S} $2 1 0 WordFunc_WordInsert${_WORDFUNC_S}_two\n\tGetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_oneback\n\tStrCmp${_WORDFUNC_S} $3 '+' WordFunc_WordInsert${_WORDFUNC_S}_call\n\tStrCpy $7 {\n\tgoto WordFunc_WordInsert${_WORDFUNC_S}_call\n\tWordFunc_WordInsert${_WORDFUNC_S}_oneback:\n\tIfErrors 0 +2\n\tStrCpy $4 $R0\n\tStrCmp${_WORDFUNC_S} $3 '+' 0 +3\n\tStrCpy $R0 '$1$0$4'\n\tgoto WordFunc_WordInsert${_WORDFUNC_S}_end\n\tStrCpy $R0 '$4$0$1'\n\tgoto WordFunc_WordInsert${_WORDFUNC_S}_end\n\n\tWordFunc_WordInsert${_WORDFUNC_S}_two:\n\tIntOp $2 $2 - 1\n\tGetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_twoback\n\tStrCmp${_WORDFUNC_S} $3 '+' 0 WordFunc_WordInsert${_WORDFUNC_S}_call\n\tStrCpy $7 {\n\tgoto WordFunc_WordInsert${_WORDFUNC_S}_call\n\tWordFunc_WordInsert${_WORDFUNC_S}_twoback:\n\tIfErrors 0 WordFunc_WordInsert${_WORDFUNC_S}_tree\n\tStrCmp${_WORDFUNC_S} $2$4 11 0 WordFunc_WordInsert${_WORDFUNC_S}_error2\n\tStrCmp${_WORDFUNC_S} $3 '+' 0 +3\n\tStrCpy $R0 '$R0$0$1'\n\tgoto WordFunc_WordInsert${_WORDFUNC_S}_end\n\tStrCpy $R0 '$1$0$R0'\n\tgoto WordFunc_WordInsert${_WORDFUNC_S}_end\n\n\tWordFunc_WordInsert${_WORDFUNC_S}_tree:\n\tStrCpy $7 }\n\tStrCpy $5 $4\n\tIntOp $2 $2 + 1\n\tGetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_treeback\n\tStrCmp${_WORDFUNC_S} $3 '+' WordFunc_WordInsert${_WORDFUNC_S}_call\n\tStrCpy $7 {\n\tgoto WordFunc_WordInsert${_WORDFUNC_S}_call\n\tWordFunc_WordInsert${_WORDFUNC_S}_treeback:\n\tIfErrors 0 +3\n\tStrCpy $4 ''\n\tStrCpy $6 ''\n\tStrCmp${_WORDFUNC_S} $3 '+' 0 +3\n\tStrCpy $R0 '$5$0$1$6$4'\n\tgoto WordFunc_WordInsert${_WORDFUNC_S}_end\n\tStrCpy $R0 '$4$6$1$0$5'\n\tgoto WordFunc_WordInsert${_WORDFUNC_S}_end\n\n\tWordFunc_WordInsert${_WORDFUNC_S}_call:\n\t!insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E$3$2*$7 $4\n\tgoto $8\n\n\tWordFunc_WordInsert${_WORDFUNC_S}_error3:\n\tStrCpy $R0 3\n\tgoto WordFunc_WordInsert${_WORDFUNC_S}_error\n\tWordFunc_WordInsert${_WORDFUNC_S}_error2:\n\tStrCpy $R0 2\n\tgoto WordFunc_WordInsert${_WORDFUNC_S}_error\n\tWordFunc_WordInsert${_WORDFUNC_S}_error1:\n\tStrCpy $R0 1\n\tWordFunc_WordInsert${_WORDFUNC_S}_error:\n\tStrCmp $9 'E' +3\n\tStrCpy $R0 $R1\n\tgoto +2\n\tSetErrors\n\n\tWordFunc_WordInsert${_WORDFUNC_S}_end:\n\tPop $R1\n\tPop $9\n\tPop $8\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\tExch $R0\n!macroend\n\n!define WordInsert `!insertmacro WordInsertCall`\n!define un.WordInsert `!insertmacro WordInsertCall`\n\n!macro WordInsert\n!macroend\n\n!macro un.WordInsert\n!macroend\n\n!macro WordInsert_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro WordInsertBody ''\n\n\t!verbose pop\n!macroend\n\n\n!define WordInsertS `!insertmacro WordInsertSCall`\n!define un.WordInsertS `!insertmacro WordInsertSCall`\n\n!macro WordInsertS\n!macroend\n\n!macro un.WordInsertS\n!macroend\n\n!macro WordInsertS_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro WordInsertBody 'S'\n\n\t!verbose pop\n!macroend\n\n!macro StrFilterBody _WORDFUNC_S\n\tExch $2\n\tExch\n\tExch $1\n\tExch\n\tExch 2\n\tExch $0\n\tExch 2\n\tExch 3\n\tExch $R0\n\tExch 3\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\tPush $R1\n\tPush $R2\n\tPush $R3\n\tPush $R4\n\tPush $R5\n\tPush $R6\n\tPush $R7\n\tPush $R8\n\tClearErrors\n\n\tStrCpy $R2 $0 '' -3\n\tStrCmp $R2 \"eng\" WordFunc_StrFilter${_WORDFUNC_S}_eng\n\tStrCmp $R2 \"rus\" WordFunc_StrFilter${_WORDFUNC_S}_rus\n\tWordFunc_StrFilter${_WORDFUNC_S}_eng:\n\tStrCpy $4 65\n\tStrCpy $5 90\n\tStrCpy $6 97\n\tStrCpy $7 122\n\tgoto WordFunc_StrFilter${_WORDFUNC_S}_langend\n\tWordFunc_StrFilter${_WORDFUNC_S}_rus:\n\tStrCpy $4 192\n\tStrCpy $5 223\n\tStrCpy $6 224\n\tStrCpy $7 255\n\tgoto WordFunc_StrFilter${_WORDFUNC_S}_langend\n\t;...\n\n\tWordFunc_StrFilter${_WORDFUNC_S}_langend:\n\tStrCpy $R7 ''\n\tStrCpy $R8 ''\n\n\tStrCmp${_WORDFUNC_S} $2 '' 0 WordFunc_StrFilter${_WORDFUNC_S}_begin\n\n\tWordFunc_StrFilter${_WORDFUNC_S}_restart1:\n\tStrCpy $2 ''\n\tStrCpy $3 $0 1\n\tStrCmp${_WORDFUNC_S} $3 '+' +2\n\tStrCmp${_WORDFUNC_S} $3 '-' 0 +3\n\tStrCpy $0 $0 '' 1\n\tgoto +2\n\tStrCpy $3 ''\n\n\tIntOp $0 $0 + 0\n\tStrCmp${_WORDFUNC_S} $0 0 +5\n\tStrCpy $R7 $0 1 0\n\tStrCpy $R8 $0 1 1\n\tStrCpy $R2 $0 1 2\n\tStrCmp${_WORDFUNC_S} $R2 '' WordFunc_StrFilter${_WORDFUNC_S}_filter WordFunc_StrFilter${_WORDFUNC_S}_error\n\n\tWordFunc_StrFilter${_WORDFUNC_S}_restart2:\n\tStrCmp${_WORDFUNC_S} $3 '' WordFunc_StrFilter${_WORDFUNC_S}_end\n\tStrCpy $R7 ''\n\tStrCpy $R8 '+-'\n\tgoto WordFunc_StrFilter${_WORDFUNC_S}_begin\n\n\tWordFunc_StrFilter${_WORDFUNC_S}_filter:\n\tStrCmp${_WORDFUNC_S} $R7 '1' +3\n\tStrCmp${_WORDFUNC_S} $R7 '2' +2\n\tStrCmp${_WORDFUNC_S} $R7 '3' 0 WordFunc_StrFilter${_WORDFUNC_S}_error\n\n\tStrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_begin\n\tStrCmp${_WORDFUNC_S} $R7$R8 '23' +2\n\tStrCmp${_WORDFUNC_S} $R7$R8 '32' 0 +3\n\tStrCpy $R7 -1\n\tgoto WordFunc_StrFilter${_WORDFUNC_S}_begin\n\tStrCmp${_WORDFUNC_S} $R7$R8 '13' +2\n\tStrCmp${_WORDFUNC_S} $R7$R8 '31' 0 +3\n\tStrCpy $R7 -2\n\tgoto WordFunc_StrFilter${_WORDFUNC_S}_begin\n\tStrCmp${_WORDFUNC_S} $R7$R8 '12' +2\n\tStrCmp${_WORDFUNC_S} $R7$R8 '21' 0 WordFunc_StrFilter${_WORDFUNC_S}_error\n\tStrCpy $R7 -3\n\n\tWordFunc_StrFilter${_WORDFUNC_S}_begin:\n\tStrCpy $R6 0\n\tStrCpy $R1 ''\n\n\tWordFunc_StrFilter${_WORDFUNC_S}_loop:\n\tStrCpy $R2 $R0 1 $R6\n\tStrCmp${_WORDFUNC_S} $R2 '' WordFunc_StrFilter${_WORDFUNC_S}_restartchk\n\n\tStrCmp${_WORDFUNC_S} $2 '' +7\n\tStrCpy $R4 0\n\tStrCpy $R5 $2 1 $R4\n\tStrCmp${_WORDFUNC_S} $R5 '' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol\n\tStrCmp${_WORDFUNC_S} $R5 $R2 WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol\n\tIntOp $R4 $R4 + 1\n\tgoto -4\n\n\tStrCmp${_WORDFUNC_S} $1 '' +7\n\tStrCpy $R4 0\n\tStrCpy $R5 $1 1 $R4\n\tStrCmp${_WORDFUNC_S} $R5 '' +4\n\tStrCmp${_WORDFUNC_S} $R5 $R2 WordFunc_StrFilter${_WORDFUNC_S}_addsymbol\n\tIntOp $R4 $R4 + 1\n\tgoto -4\n\n\tStrCmp${_WORDFUNC_S} $R7 '1' +2\n\tStrCmp${_WORDFUNC_S} $R7 '-1' 0 +4\n\tStrCpy $R4 48\n\tStrCpy $R5 57\n\tgoto WordFunc_StrFilter${_WORDFUNC_S}_loop2\n\tStrCmp${_WORDFUNC_S} $R8 '+-' 0 +2\n\tStrCmp${_WORDFUNC_S} $3 '+' 0 +4\n\tStrCpy $R4 $4\n\tStrCpy $R5 $5\n\tgoto WordFunc_StrFilter${_WORDFUNC_S}_loop2\n\tStrCpy $R4 $6\n\tStrCpy $R5 $7\n\n\tWordFunc_StrFilter${_WORDFUNC_S}_loop2:\n\tIntFmt $R3 '%c' $R4\n\tStrCmp $R2 $R3 WordFunc_StrFilter${_WORDFUNC_S}_found\n\tStrCmp $R4 $R5 WordFunc_StrFilter${_WORDFUNC_S}_notfound\n\tIntOp $R4 $R4 + 1\n\tgoto WordFunc_StrFilter${_WORDFUNC_S}_loop2\n\n\tWordFunc_StrFilter${_WORDFUNC_S}_found:\n\tStrCmp${_WORDFUNC_S} $R8 '+-' WordFunc_StrFilter${_WORDFUNC_S}_setcase\n\tStrCmp${_WORDFUNC_S} $R7 '3' WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol\n\tStrCmp${_WORDFUNC_S} $R7 '-3' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol\n\tStrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol\n\n\tWordFunc_StrFilter${_WORDFUNC_S}_notfound:\n\tStrCmp${_WORDFUNC_S} $R8 '+-' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol\n\tStrCmp${_WORDFUNC_S} $R7 '3' 0 +2\n\tStrCmp${_WORDFUNC_S} $R5 57 WordFunc_StrFilter${_WORDFUNC_S}_addsymbol +3\n\tStrCmp${_WORDFUNC_S} $R7 '-3' 0 +5\n\tStrCmp${_WORDFUNC_S} $R5 57 WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol\n\tStrCpy $R4 48\n\tStrCpy $R5 57\n\tgoto WordFunc_StrFilter${_WORDFUNC_S}_loop2\n\tStrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol WordFunc_StrFilter${_WORDFUNC_S}_addsymbol\n\n\tWordFunc_StrFilter${_WORDFUNC_S}_setcase:\n\tStrCpy $R2 $R3\n\tWordFunc_StrFilter${_WORDFUNC_S}_addsymbol:\n\tStrCpy $R1 $R1$R2\n\tWordFunc_StrFilter${_WORDFUNC_S}_skipsymbol:\n\tIntOp $R6 $R6 + 1\n\tgoto WordFunc_StrFilter${_WORDFUNC_S}_loop\n\n\tWordFunc_StrFilter${_WORDFUNC_S}_error:\n\tSetErrors\n\tStrCpy $R0 ''\n\tgoto WordFunc_StrFilter${_WORDFUNC_S}_end\n\n\tWordFunc_StrFilter${_WORDFUNC_S}_restartchk:\n\tStrCpy $R0 $R1\n\tStrCmp${_WORDFUNC_S} $2 '' 0 WordFunc_StrFilter${_WORDFUNC_S}_restart1\n\tStrCmp${_WORDFUNC_S} $R8 '+-' 0 WordFunc_StrFilter${_WORDFUNC_S}_restart2\n\n\tWordFunc_StrFilter${_WORDFUNC_S}_end:\n\tPop $R8\n\tPop $R7\n\tPop $R6\n\tPop $R5\n\tPop $R4\n\tPop $R3\n\tPop $R2\n\tPop $R1\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tPop $0\n\tExch $R0\n!macroend\n\n!define StrFilter `!insertmacro StrFilterCall`\n!define un.StrFilter `!insertmacro StrFilterCall`\n\n!macro StrFilter\n!macroend\n\n!macro un.StrFilter\n!macroend\n\n!macro StrFilter_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro StrFilterBody ''\n\n\t!verbose pop\n!macroend\n\n\n!define StrFilterS `!insertmacro StrFilterSCall`\n!define un.StrFilterS `!insertmacro StrFilterSCall`\n\n!macro StrFilterS\n!macroend\n\n!macro un.StrFilterS\n!macroend\n\n!macro StrFilterS_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\t!insertmacro StrFilterBody 'S'\n\n\t!verbose pop\n!macroend\n\n!define VersionCompare `!insertmacro VersionCompareCall`\n!define un.VersionCompare `!insertmacro VersionCompareCall`\n\n!macro VersionCompare\n!macroend\n\n!macro un.VersionCompare\n!macroend\n\n!macro VersionCompare_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\n\tWordFunc_VersionCompare_begin:\n\tStrCpy $2 -1\n\tIntOp $2 $2 + 1\n\tStrCpy $3 $0 1 $2\n\tStrCmp $3 '' +2\n\tStrCmp $3 '.' 0 -3\n\tStrCpy $4 $0 $2\n\tIntOp $2 $2 + 1\n\tStrCpy $0 $0 '' $2\n\n\tStrCpy $2 -1\n\tIntOp $2 $2 + 1\n\tStrCpy $3 $1 1 $2\n\tStrCmp $3 '' +2\n\tStrCmp $3 '.' 0 -3\n\tStrCpy $5 $1 $2\n\tIntOp $2 $2 + 1\n\tStrCpy $1 $1 '' $2\n\n\tStrCmp $4$5 '' WordFunc_VersionCompare_equal\n\n\tStrCpy $6 -1\n\tIntOp $6 $6 + 1\n\tStrCpy $3 $4 1 $6\n\tStrCmp $3 '0' -2\n\tStrCmp $3 '' 0 +2\n\tStrCpy $4 0\n\n\tStrCpy $7 -1\n\tIntOp $7 $7 + 1\n\tStrCpy $3 $5 1 $7\n\tStrCmp $3 '0' -2\n\tStrCmp $3 '' 0 +2\n\tStrCpy $5 0\n\n\tStrCmp $4 0 0 +2\n\tStrCmp $5 0 WordFunc_VersionCompare_begin WordFunc_VersionCompare_newer2\n\tStrCmp $5 0 WordFunc_VersionCompare_newer1\n\tIntCmp $6 $7 0 WordFunc_VersionCompare_newer1 WordFunc_VersionCompare_newer2\n\n\tStrCpy $4 '1$4'\n\tStrCpy $5 '1$5'\n\tIntCmp $4 $5 WordFunc_VersionCompare_begin WordFunc_VersionCompare_newer2 WordFunc_VersionCompare_newer1\n\n\tWordFunc_VersionCompare_equal:\n\tStrCpy $0 0\n\tgoto WordFunc_VersionCompare_end\n\tWordFunc_VersionCompare_newer1:\n\tStrCpy $0 1\n\tgoto WordFunc_VersionCompare_end\n\tWordFunc_VersionCompare_newer2:\n\tStrCpy $0 2\n\n\tWordFunc_VersionCompare_end:\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!define VersionConvert `!insertmacro VersionConvertCall`\n!define un.VersionConvert `!insertmacro VersionConvertCall`\n\n!macro VersionConvert\n!macroend\n\n!macro un.VersionConvert\n!macroend\n\n!macro VersionConvert_\n\t!verbose push\n\t!verbose ${_WORDFUNC_VERBOSE}\n\n\tExch $1\n\tExch\n\tExch $0\n\tExch\n\tPush $2\n\tPush $3\n\tPush $4\n\tPush $5\n\tPush $6\n\tPush $7\n\n\tStrCmp $1 '' 0 +2\n\tStrCpy $1 'abcdefghijklmnopqrstuvwxyz'\n\tStrCpy $1 $1 99\n\n\tStrCpy $2 0\n\tStrCpy $7 'dot'\n\tgoto WordFunc_VersionConvert_loop\n\n\tWordFunc_VersionConvert_preloop:\n\tIntOp $2 $2 + 1\n\n\tWordFunc_VersionConvert_loop:\n\tStrCpy $3 $0 1 $2\n\tStrCmp $3 '' WordFunc_VersionConvert_endcheck\n\tStrCmp $3 '.' WordFunc_VersionConvert_dot\n\tStrCmp $3 '0' WordFunc_VersionConvert_digit\n\tIntCmp $3 '0' WordFunc_VersionConvert_letter WordFunc_VersionConvert_letter WordFunc_VersionConvert_digit\n\n\tWordFunc_VersionConvert_dot:\n\tStrCmp $7 'dot' WordFunc_VersionConvert_replacespecial\n\tStrCpy $7 'dot'\n\tgoto WordFunc_VersionConvert_preloop\n\n\tWordFunc_VersionConvert_digit:\n\tStrCmp $7 'letter' WordFunc_VersionConvert_insertdot\n\tStrCpy $7 'digit'\n\tgoto WordFunc_VersionConvert_preloop\n\n\tWordFunc_VersionConvert_letter:\n\tStrCpy $5 0\n\tStrCpy $4 $1 1 $5\n\tIntOp $5 $5 + 1\n\tStrCmp $4 '' WordFunc_VersionConvert_replacespecial\n\tStrCmp $4 $3 0 -3\n\tIntCmp $5 9 0 0 +2\n\tStrCpy $5 '0$5'\n\n\tStrCmp $7 'letter' +2\n\tStrCmp $7 'dot' 0 +3\n\tStrCpy $6 ''\n\tgoto +2\n\tStrCpy $6 '.'\n\n\tStrCpy $4 $0 $2\n\tIntOp $2 $2 + 1\n\tStrCpy $0 $0 '' $2\n\tStrCpy $0 '$4$6$5$0'\n\tStrLen $4 '$6$5'\n\tIntOp $2 $2 + $4\n\tIntOp $2 $2 - 1\n\tStrCpy $7 'letter'\n\tgoto WordFunc_VersionConvert_loop\n\n\tWordFunc_VersionConvert_replacespecial:\n\tStrCmp $7 'dot' 0 +3\n\tStrCpy $6 ''\n\tgoto +2\n\tStrCpy $6 '.'\n\n\tStrCpy $4 $0 $2\n\tIntOp $2 $2 + 1\n\tStrCpy $0 $0 '' $2\n\tStrCpy $0 '$4$6$0'\n\tStrLen $4 $6\n\tIntOp $2 $2 + $4\n\tIntOp $2 $2 - 1\n\tStrCpy $7 'dot'\n\tgoto WordFunc_VersionConvert_loop\n\n\tWordFunc_VersionConvert_insertdot:\n\tStrCpy $4 $0 $2\n\tStrCpy $0 $0 '' $2\n\tStrCpy $0 '$4.$0'\n\tStrCpy $7 'dot'\n\tgoto WordFunc_VersionConvert_preloop\n\n\tWordFunc_VersionConvert_endcheck:\n\tStrCpy $4 $0 1 -1\n\tStrCmp $4 '.' 0 WordFunc_VersionConvert_end\n\tStrCpy $0 $0 -1\n\tgoto -3\n\n\tWordFunc_VersionConvert_end:\n\tPop $7\n\tPop $6\n\tPop $5\n\tPop $4\n\tPop $3\n\tPop $2\n\tPop $1\n\tExch $0\n\n\t!verbose pop\n!macroend\n\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/nsDialogs.nsh",
    "content": "/*\n\nnsDialogs.nsh\nHeader file for creating custom installer pages with nsDialogs\n\n*/\n\n!ifndef NSDIALOGS_INCLUDED\n!define NSDIALOGS_INCLUDED\n!verbose push\n!verbose 3\n\n!include LogicLib.nsh\n!include WinMessages.nsh\n\n!define WS_EX_DLGMODALFRAME  0x00000001\n!define WS_EX_NOPARENTNOTIFY 0x00000004\n!define WS_EX_TOPMOST        0x00000008\n!define WS_EX_ACCEPTFILES    0x00000010\n!define WS_EX_TRANSPARENT    0x00000020\n!define WS_EX_MDICHILD       0x00000040\n!define WS_EX_TOOLWINDOW     0x00000080\n!define WS_EX_WINDOWEDGE     0x00000100\n!define WS_EX_CLIENTEDGE     0x00000200\n!define WS_EX_CONTEXTHELP    0x00000400\n!define WS_EX_RIGHT          0x00001000\n!define WS_EX_LEFT           0x00000000\n!define WS_EX_RTLREADING     0x00002000\n!define WS_EX_LTRREADING     0x00000000\n!define WS_EX_LEFTSCROLLBAR  0x00004000\n!define WS_EX_RIGHTSCROLLBAR 0x00000000\n!define WS_EX_CONTROLPARENT  0x00010000\n!define WS_EX_STATICEDGE     0x00020000\n!define WS_EX_APPWINDOW      0x00040000\n\n!define WS_CHILD             0x40000000\n!define WS_VISIBLE           0x10000000\n!define WS_DISABLED          0x08000000\n!define WS_CLIPSIBLINGS      0x04000000\n!define WS_CLIPCHILDREN      0x02000000\n!define WS_MAXIMIZE          0x01000000\n!define WS_VSCROLL           0x00200000\n!define WS_HSCROLL           0x00100000\n!define WS_GROUP             0x00020000\n!define WS_TABSTOP           0x00010000\n\n!define ES_LEFT              0x00000000\n!define ES_CENTER            0x00000001\n!define ES_RIGHT             0x00000002\n!define ES_MULTILINE         0x00000004\n!define ES_UPPERCASE         0x00000008\n!define ES_LOWERCASE         0x00000010\n!define ES_PASSWORD          0x00000020\n!define ES_AUTOVSCROLL       0x00000040\n!define ES_AUTOHSCROLL       0x00000080\n!define ES_NOHIDESEL         0x00000100\n!define ES_OEMCONVERT        0x00000400\n!define ES_READONLY          0x00000800\n!define ES_WANTRETURN        0x00001000\n!define ES_NUMBER            0x00002000\n\n!define SS_LEFT              0x00000000\n!define SS_CENTER            0x00000001\n!define SS_RIGHT             0x00000002\n!define SS_ICON              0x00000003\n!define SS_BLACKRECT         0x00000004\n!define SS_GRAYRECT          0x00000005\n!define SS_WHITERECT         0x00000006\n!define SS_BLACKFRAME        0x00000007\n!define SS_GRAYFRAME         0x00000008\n!define SS_WHITEFRAME        0x00000009\n!define SS_USERITEM          0x0000000A\n!define SS_SIMPLE            0x0000000B\n!define SS_LEFTNOWORDWRAP    0x0000000C\n!define SS_OWNERDRAW         0x0000000D\n!define SS_BITMAP            0x0000000E\n!define SS_ENHMETAFILE       0x0000000F\n!define SS_ETCHEDHORZ        0x00000010\n!define SS_ETCHEDVERT        0x00000011\n!define SS_ETCHEDFRAME       0x00000012\n!define SS_TYPEMASK          0x0000001F\n!define SS_REALSIZECONTROL   0x00000040\n!define SS_NOPREFIX          0x00000080\n!define SS_NOTIFY            0x00000100\n!define SS_CENTERIMAGE       0x00000200\n!define SS_RIGHTJUST         0x00000400\n!define SS_REALSIZEIMAGE     0x00000800\n!define SS_SUNKEN            0x00001000\n!define SS_EDITCONTROL       0x00002000\n!define SS_ENDELLIPSIS       0x00004000\n!define SS_PATHELLIPSIS      0x00008000\n!define SS_WORDELLIPSIS      0x0000C000\n!define SS_ELLIPSISMASK      0x0000C000\n\n!define BS_PUSHBUTTON        0x00000000\n!define BS_DEFPUSHBUTTON     0x00000001\n!define BS_CHECKBOX          0x00000002\n!define BS_AUTOCHECKBOX      0x00000003\n!define BS_RADIOBUTTON       0x00000004\n!define BS_3STATE            0x00000005\n!define BS_AUTO3STATE        0x00000006\n!define BS_GROUPBOX          0x00000007\n!define BS_USERBUTTON        0x00000008\n!define BS_AUTORADIOBUTTON   0x00000009\n!define BS_PUSHBOX           0x0000000A\n!define BS_OWNERDRAW         0x0000000B\n!define BS_TYPEMASK          0x0000000F\n!define BS_LEFTTEXT          0x00000020\n!define BS_TEXT              0x00000000\n!define BS_ICON              0x00000040\n!define BS_BITMAP            0x00000080\n!define BS_LEFT              0x00000100\n!define BS_RIGHT             0x00000200\n!define BS_CENTER            0x00000300\n!define BS_TOP               0x00000400\n!define BS_BOTTOM            0x00000800\n!define BS_VCENTER           0x00000C00\n!define BS_PUSHLIKE          0x00001000\n!define BS_MULTILINE         0x00002000\n!define BS_NOTIFY            0x00004000\n!define BS_FLAT              0x00008000\n!define BS_RIGHTBUTTON       ${BS_LEFTTEXT}\n\n!define CBS_SIMPLE            0x0001\n!define CBS_DROPDOWN          0x0002\n!define CBS_DROPDOWNLIST      0x0003\n!define CBS_OWNERDRAWFIXED    0x0010\n!define CBS_OWNERDRAWVARIABLE 0x0020\n!define CBS_AUTOHSCROLL       0x0040\n!define CBS_OEMCONVERT        0x0080\n!define CBS_SORT              0x0100\n!define CBS_HASSTRINGS        0x0200\n!define CBS_NOINTEGRALHEIGHT  0x0400\n!define CBS_DISABLENOSCROLL   0x0800\n!define CBS_UPPERCASE         0x2000\n!define CBS_LOWERCASE         0x4000\n\n!define LBS_NOTIFY            0x0001\n!define LBS_SORT              0x0002\n!define LBS_NOREDRAW          0x0004\n!define LBS_MULTIPLESEL       0x0008\n!define LBS_OWNERDRAWFIXED    0x0010\n!define LBS_OWNERDRAWVARIABLE 0x0020\n!define LBS_HASSTRINGS        0x0040\n!define LBS_USETABSTOPS       0x0080\n!define LBS_NOINTEGRALHEIGHT  0x0100\n!define LBS_MULTICOLUMN       0x0200\n!define LBS_WANTKEYBOARDINPUT 0x0400\n!define LBS_EXTENDEDSEL       0x0800\n!define LBS_DISABLENOSCROLL   0x1000\n!define LBS_NODATA            0x2000\n!define LBS_NOSEL             0x4000\n!define LBS_COMBOBOX          0x8000\n\n!define LR_DEFAULTCOLOR     0x0000\n!define LR_MONOCHROME       0x0001\n!define LR_COLOR            0x0002\n!define LR_COPYRETURNORG    0x0004\n!define LR_COPYDELETEORG    0x0008\n!define LR_LOADFROMFILE     0x0010\n!define LR_LOADTRANSPARENT  0x0020\n!define LR_DEFAULTSIZE      0x0040\n!define LR_VGACOLOR         0x0080\n!define LR_LOADMAP3DCOLORS  0x1000\n!define LR_CREATEDIBSECTION 0x2000\n!define LR_COPYFROMRESOURCE 0x4000\n!define LR_SHARED           0x8000\n\n!define IMAGE_BITMAP        0\n!define IMAGE_ICON          1\n!define IMAGE_CURSOR        2\n!define IMAGE_ENHMETAFILE   3\n\n!define GWL_STYLE           -16\n!define GWL_EXSTYLE         -20\n\n!define DEFAULT_STYLES ${WS_CHILD}|${WS_VISIBLE}|${WS_CLIPSIBLINGS}\n\n!define __NSD_HLine_CLASS STATIC\n!define __NSD_HLine_STYLE ${DEFAULT_STYLES}|${SS_ETCHEDHORZ}|${SS_SUNKEN}\n!define __NSD_HLine_EXSTYLE ${WS_EX_TRANSPARENT}\n\n!define __NSD_VLine_CLASS STATIC\n!define __NSD_VLine_STYLE ${DEFAULT_STYLES}|${SS_ETCHEDVERT}|${SS_SUNKEN}\n!define __NSD_VLine_EXSTYLE ${WS_EX_TRANSPARENT}\n\n!define __NSD_Label_CLASS STATIC\n!define __NSD_Label_STYLE ${DEFAULT_STYLES}|${SS_NOTIFY}\n!define __NSD_Label_EXSTYLE ${WS_EX_TRANSPARENT}\n\n!define __NSD_Icon_CLASS STATIC\n!define __NSD_Icon_STYLE ${DEFAULT_STYLES}|${SS_ICON}|${SS_NOTIFY}\n!define __NSD_Icon_EXSTYLE 0\n\n!define __NSD_Bitmap_CLASS STATIC\n!define __NSD_Bitmap_STYLE ${DEFAULT_STYLES}|${SS_BITMAP}|${SS_NOTIFY}\n!define __NSD_Bitmap_EXSTYLE 0\n\n!define __NSD_BrowseButton_CLASS BUTTON\n!define __NSD_BrowseButton_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}\n!define __NSD_BrowseButton_EXSTYLE 0\n\n!define __NSD_Link_CLASS LINK\n!define __NSD_Link_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${BS_OWNERDRAW}\n!define __NSD_Link_EXSTYLE 0\n\n!define __NSD_Button_CLASS BUTTON\n!define __NSD_Button_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}\n!define __NSD_Button_EXSTYLE 0\n\n!define __NSD_GroupBox_CLASS BUTTON\n!define __NSD_GroupBox_STYLE ${DEFAULT_STYLES}|${BS_GROUPBOX}\n!define __NSD_GroupBox_EXSTYLE ${WS_EX_TRANSPARENT}\n\n!define __NSD_CheckBox_CLASS BUTTON\n!define __NSD_CheckBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${BS_TEXT}|${BS_VCENTER}|${BS_AUTOCHECKBOX}|${BS_MULTILINE}\n!define __NSD_CheckBox_EXSTYLE 0\n\n!define __NSD_RadioButton_CLASS BUTTON\n!define __NSD_RadioButton_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${BS_TEXT}|${BS_VCENTER}|${BS_AUTORADIOBUTTON}|${BS_MULTILINE}\n!define __NSD_RadioButton_EXSTYLE 0\n\n!define __NSD_Text_CLASS EDIT\n!define __NSD_Text_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}\n!define __NSD_Text_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}\n\n!define __NSD_Password_CLASS EDIT\n!define __NSD_Password_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_PASSWORD}\n!define __NSD_Password_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}\n\n!define __NSD_Number_CLASS EDIT\n!define __NSD_Number_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_NUMBER}\n!define __NSD_Number_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}\n\n!define __NSD_FileRequest_CLASS EDIT\n!define __NSD_FileRequest_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}\n!define __NSD_FileRequest_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}\n\n!define __NSD_DirRequest_CLASS EDIT\n!define __NSD_DirRequest_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}\n!define __NSD_DirRequest_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}\n\n!define __NSD_ComboBox_CLASS COMBOBOX\n!define __NSD_ComboBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${WS_CLIPCHILDREN}|${CBS_AUTOHSCROLL}|${CBS_HASSTRINGS}|${CBS_DROPDOWN}\n!define __NSD_ComboBox_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}\n\n!define __NSD_DropList_CLASS COMBOBOX\n!define __NSD_DropList_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${WS_CLIPCHILDREN}|${CBS_AUTOHSCROLL}|${CBS_HASSTRINGS}|${CBS_DROPDOWNLIST}\n!define __NSD_DropList_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}\n\n!define __NSD_ListBox_CLASS LISTBOX\n!define __NSD_ListBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${LBS_DISABLENOSCROLL}|${LBS_HASSTRINGS}|${LBS_NOINTEGRALHEIGHT}|${LBS_NOTIFY}\n!define __NSD_ListBox_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}\n\n!define __NSD_ProgressBar_CLASS msctls_progress32\n!define __NSD_ProgressBar_STYLE ${DEFAULT_STYLES}\n!define __NSD_ProgressBar_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}\n\n!macro __NSD_DefineControl NAME\n\n\t!define NSD_Create${NAME} \"nsDialogs::CreateControl ${__NSD_${Name}_CLASS} ${__NSD_${Name}_STYLE} ${__NSD_${Name}_EXSTYLE}\"\n\n!macroend\n\n!insertmacro __NSD_DefineControl HLine\n!insertmacro __NSD_DefineControl VLine\n!insertmacro __NSD_DefineControl Label\n!insertmacro __NSD_DefineControl Icon\n!insertmacro __NSD_DefineControl Bitmap\n!insertmacro __NSD_DefineControl BrowseButton\n!insertmacro __NSD_DefineControl Link\n!insertmacro __NSD_DefineControl Button\n!insertmacro __NSD_DefineControl GroupBox\n!insertmacro __NSD_DefineControl CheckBox\n!insertmacro __NSD_DefineControl RadioButton\n!insertmacro __NSD_DefineControl Text\n!insertmacro __NSD_DefineControl Password\n!insertmacro __NSD_DefineControl Number\n!insertmacro __NSD_DefineControl FileRequest\n!insertmacro __NSD_DefineControl DirRequest\n!insertmacro __NSD_DefineControl ComboBox\n!insertmacro __NSD_DefineControl DropList\n!insertmacro __NSD_DefineControl ListBox\n!insertmacro __NSD_DefineControl ProgressBar\n\n!macro __NSD_OnControlEvent EVENT HWND FUNCTION\n\n\tPush $0\n\tPush $1\n\n\tStrCpy $1 \"${HWND}\"\n\n\tGetFunctionAddress $0 \"${FUNCTION}\"\n\tnsDialogs::On${EVENT} $1 $0\n\n\tPop $1\n\tPop $0\n\n!macroend\n\n!macro __NSD_DefineControlCallback EVENT\n\n\t!define NSD_On${EVENT} `!insertmacro __NSD_OnControlEvent ${EVENT}`\n\n!macroend\n\n!macro __NSD_OnDialogEvent EVENT FUNCTION\n\n\tPush $0\n\n\tGetFunctionAddress $0 \"${FUNCTION}\"\n\tnsDialogs::On${EVENT} $0\n\n\tPop $0\n\n!macroend\n\n!macro __NSD_DefineDialogCallback EVENT\n\n\t!define NSD_On${EVENT} `!insertmacro __NSD_OnDialogEvent ${EVENT}`\n\n!macroend\n\n!insertmacro __NSD_DefineControlCallback Click\n!insertmacro __NSD_DefineControlCallback Change\n!insertmacro __NSD_DefineControlCallback Notify\n!insertmacro __NSD_DefineDialogCallback Back\n\n!macro _NSD_CreateTimer FUNCTION INTERVAL\n\n\tPush $0\n\n\tGetFunctionAddress $0 \"${FUNCTION}\"\n\tnsDialogs::CreateTimer $0 \"${INTERVAL}\"\n\n\tPop $0\n\n!macroend\n\n!define NSD_CreateTimer `!insertmacro _NSD_CreateTimer`\n\n!macro _NSD_KillTimer FUNCTION\n\n\tPush $0\n\n\tGetFunctionAddress $0 \"${FUNCTION}\"\n\tnsDialogs::KillTimer $0\n\n\tPop $0\n\n!macroend\n\n!define NSD_KillTimer `!insertmacro _NSD_KillTimer`\n\n!macro _NSD_AddStyle CONTROL STYLE\n\n\tPush $0\n\n\tSystem::Call \"user32::GetWindowLong(i ${CONTROL}, i ${GWL_STYLE}) i .r0\"\n\tSystem::Call \"user32::SetWindowLong(i ${CONTROL}, i ${GWL_STYLE}, i $0|${STYLE})\"\n\n\tPop $0\n\n!macroend\n\n!define NSD_AddStyle \"!insertmacro _NSD_AddStyle\"\n\n!macro _NSD_AddExStyle CONTROL EXSTYLE\n\n\tPush $0\n\n\tSystem::Call \"user32::GetWindowLong(i ${CONTROL}, i ${GWL_EXSTYLE}) i .r0\"\n\tSystem::Call \"user32::SetWindowLong(i ${CONTROL}, i ${GWL_EXSTYLE}, i $0|${EXSTYLE})\"\n\n\tPop $0\n\n!macroend\n\n!define NSD_AddExStyle \"!insertmacro _NSD_AddExStyle\"\n\n!macro __NSD_GetText CONTROL VAR\n\n\tSystem::Call user32::GetWindowText(i${CONTROL},t.s,i${NSIS_MAX_STRLEN})\n\tPop ${VAR}\n\n!macroend\n\n!define NSD_GetText `!insertmacro __NSD_GetText`\n\n!macro __NSD_SetText CONTROL TEXT\n\n\tSendMessage ${CONTROL} ${WM_SETTEXT} 0 `STR:${TEXT}`\n\n!macroend\n\n!define NSD_SetText `!insertmacro __NSD_SetText`\n\n!macro _NSD_SetTextLimit CONTROL LIMIT\n\n\tSendMessage ${CONTROL} ${EM_SETLIMITTEXT} ${LIMIT} 0\n\n!macroend\n\n!define NSD_SetTextLimit \"!insertmacro _NSD_SetTextLimit\"\n\n!macro __NSD_GetState CONTROL VAR\n\n\tSendMessage ${CONTROL} ${BM_GETCHECK} 0 0 ${VAR}\n\n!macroend\n\n!define NSD_GetState `!insertmacro __NSD_GetState`\n\n!macro __NSD_SetState CONTROL STATE\n\n\tSendMessage ${CONTROL} ${BM_SETCHECK} ${STATE} 0\n\n!macroend\n\n!define NSD_SetState `!insertmacro __NSD_SetState`\n\n!macro __NSD_Check CONTROL\n\n\t${NSD_SetState} ${CONTROL} ${BST_CHECKED}\n\n!macroend\n\n!define NSD_Check `!insertmacro __NSD_Check`\n\n!macro __NSD_Uncheck CONTROL\n\n\t${NSD_SetState} ${CONTROL} ${BST_UNCHECKED}\n\n!macroend\n\n!define NSD_Uncheck `!insertmacro __NSD_Uncheck`\n\n!macro __NSD_SetFocus HWND\n\n\tSystem::Call \"user32::SetFocus(i${HWND})\"\n  \n!macroend\n\n!define NSD_SetFocus `!insertmacro __NSD_SetFocus`\n\n!macro _NSD_CB_AddString CONTROL STRING\n\n\tSendMessage ${CONTROL} ${CB_ADDSTRING} 0 `STR:${STRING}`\n\n!macroend\n\n!define NSD_CB_AddString \"!insertmacro _NSD_CB_AddString\"\n\n!macro _NSD_CB_SelectString CONTROL STRING\n\n\tSendMessage ${CONTROL} ${CB_SELECTSTRING} -1 `STR:${STRING}`\n\n!macroend\n\n!define NSD_CB_SelectString \"!insertmacro _NSD_CB_SelectString\"\n\n!macro _NSD_LB_AddString CONTROL STRING\n\n\tSendMessage ${CONTROL} ${LB_ADDSTRING} 0 `STR:${STRING}`\n\n!macroend\n\n!define NSD_LB_AddString \"!insertmacro _NSD_LB_AddString\"\n\n!macro __NSD_LB_DelString CONTROL STRING\n\n\tSendMessage ${CONTROL} ${LB_DELETESTRING} 0 `STR:${STRING}`\n\n!macroend\n\n!define NSD_LB_DelString `!insertmacro __NSD_LB_DelString`\n\n!macro __NSD_LB_Clear CONTROL VAR\n\n\tSendMessage ${CONTROL} ${LB_RESETCONTENT} 0 0 ${VAR}\n\n!macroend\n\n!define NSD_LB_Clear `!insertmacro __NSD_LB_Clear`\n\n!macro __NSD_LB_GetCount CONTROL VAR\n\n\tSendMessage ${CONTROL} ${LB_GETCOUNT} 0 0 ${VAR}\n\n!macroend\n\n!define NSD_LB_GetCount `!insertmacro __NSD_LB_GetCount`\n\n!macro _NSD_LB_SelectString CONTROL STRING\n\n\tSendMessage ${CONTROL} ${LB_SELECTSTRING} -1 `STR:${STRING}`\n\n!macroend\n\n!define NSD_LB_SelectString \"!insertmacro _NSD_LB_SelectString\"\n\n!macro __NSD_LB_GetSelection CONTROL VAR\n\n\tSendMessage ${CONTROL} ${LB_GETCURSEL} 0 0 ${VAR}\n\tSystem::Call 'user32::SendMessage(i ${CONTROL}, i ${LB_GETTEXT}, i ${VAR}, t .s)'\n\tPop ${VAR}\n\n!macroend\n\n!define NSD_LB_GetSelection `!insertmacro __NSD_LB_GetSelection`\n\n\n!macro __NSD_LoadAndSetImage _LIHINSTMODE _IMGTYPE _LIHINSTSRC _LIFLAGS CONTROL IMAGE HANDLE\n\t\n\tPush $0\n\tPush $R0\n\n\tStrCpy $R0 ${CONTROL} # in case ${CONTROL} is $0\n\t\n\t!if \"${_LIHINSTMODE}\" == \"exeresource\"\n\t\tSystem::Call 'kernel32::GetModuleHandle(i0) i.r0'\n\t\t!undef _LIHINSTSRC\n\t\t!define _LIHINSTSRC r0\n\t!endif\n\t\n\tSystem::Call 'user32::LoadImage(i ${_LIHINSTSRC}, ts, i ${_IMGTYPE}, i0, i0, i${_LIFLAGS}) i.r0' \"${IMAGE}\"\n\tSendMessage $R0 ${STM_SETIMAGE} ${_IMGTYPE} $0\n\n\tPop $R0\n\tExch $0\n\n\tPop ${HANDLE}\n\n!macroend\n\n!macro __NSD_SetIconFromExeResource CONTROL IMAGE HANDLE\n\t!insertmacro __NSD_LoadAndSetImage exeresource ${IMAGE_ICON} 0 ${LR_DEFAULTSIZE} \"${CONTROL}\" \"${IMAGE}\" ${HANDLE}\n!macroend\n\n!macro __NSD_SetIconFromInstaller CONTROL HANDLE\n\t!insertmacro __NSD_SetIconFromExeResource \"${CONTROL}\" \"#103\" ${HANDLE}\n!macroend\n\n!define NSD_SetImage `!insertmacro __NSD_LoadAndSetImage file ${IMAGE_BITMAP} 0 \"${LR_LOADFROMFILE}\"`\n!define NSD_SetBitmap `${NSD_SetImage}`\n\n!define NSD_SetIcon `!insertmacro __NSD_LoadAndSetImage file ${IMAGE_ICON} 0 \"${LR_LOADFROMFILE}|${LR_DEFAULTSIZE}\"`\n!define NSD_SetIconFromExeResource `!insertmacro __NSD_SetIconFromExeResource`\n!define NSD_SetIconFromInstaller `!insertmacro __NSD_SetIconFromInstaller`\n\n\n!macro __NSD_SetStretchedImage CONTROL IMAGE HANDLE\n\n\tPush $0\n\tPush $1\n\tPush $2\n\tPush $R0\n\n\tStrCpy $R0 ${CONTROL} # in case ${CONTROL} is $0\n\n\tStrCpy $1 \"\"\n\tStrCpy $2 \"\"\n\n\tSystem::Call '*(i, i, i, i) i.s'\n\tPop $0\n\n\t${If} $0 <> 0\n\t\n\t\tSystem::Call 'user32::GetClientRect(iR0, ir0)'\n\t\tSystem::Call '*$0(i, i, i .s, i .s)'\n\t\tSystem::Free $0\n\t\tPop $1\n\t\tPop $2\n\n\t${EndIf}\n\n\tSystem::Call 'user32::LoadImage(i0, ts, i ${IMAGE_BITMAP}, ir1, ir2, i${LR_LOADFROMFILE}) i.s' \"${IMAGE}\"\n\tPop $0\n    SendMessage $R0 ${STM_SETIMAGE} ${IMAGE_BITMAP} $0\n\n\tPop $R0\n\tPop $2\n\tPop $1\n\tExch $0\n\n\tPop ${HANDLE}\n\n!macroend\n\n!define NSD_SetStretchedImage `!insertmacro __NSD_SetStretchedImage`\n\n!macro __NSD_FreeImage IMAGE\n\n\t${If} ${IMAGE} <> 0\n\n\t\tSystem::Call gdi32::DeleteObject(is) ${IMAGE}\n\n\t${EndIf}\n\n!macroend\n\n!define NSD_FreeImage `!insertmacro __NSD_FreeImage`\n!define NSD_FreeBitmap `${NSD_FreeImage}`\n\n!macro __NSD_FreeIcon IMAGE\n\tSystem::Call user32::DestroyIcon(is) ${IMAGE}\n!macroend\n\n!define NSD_FreeIcon `!insertmacro __NSD_FreeIcon`\n\n!macro __NSD_ClearImage _IMGTYPE CONTROL\n\n\tSendMessage ${CONTROL} ${STM_SETIMAGE} ${_IMGTYPE} 0\n\n!macroend\n\n!define NSD_ClearImage `!insertmacro __NSD_ClearImage ${IMAGE_BITMAP}`\n!define NSD_ClearIcon  `!insertmacro __NSD_ClearImage ${IMAGE_ICON}`\n\n\n!define DEBUG `System::Call kernel32::OutputDebugString(ts)`\n\n!macro __NSD_ControlCase TYPE\n\n\t${Case} ${TYPE}\n\t\t${NSD_Create${TYPE}} $R3u $R4u $R5u $R6u $R7\n\t\tPop $R9\n\t\t${Break}\n\n!macroend\n\n!macro __NSD_ControlCaseEx TYPE\n\n\t${Case} ${TYPE}\n\t\tCall ${TYPE}\n\t\t${Break}\n\n!macroend\n\n!macro NSD_FUNCTION_INIFILE\n\n\t!insertmacro NSD_INIFILE \"\"\n\n!macroend\n\n!macro NSD_UNFUNCTION_INIFILE\n\n\t!insertmacro NSD_INIFILE un.\n\n!macroend\n\n!macro NSD_INIFILE UNINSTALLER_FUNCPREFIX\n\n\t;Functions to create dialogs based on old InstallOptions INI files\n\n\tFunction ${UNINSTALLER_FUNCPREFIX}CreateDialogFromINI\n\n\t\t# $0 = ini\n\n\t\tReadINIStr $R0 $0 Settings RECT\n\t\t${If} $R0 == \"\"\n\t\t\tStrCpy $R0 1018\n\t\t${EndIf}\n\n\t\tnsDialogs::Create $R0\n\t\tPop $R9\n\n\t\tReadINIStr $R0 $0 Settings RTL\n\t\tnsDialogs::SetRTL $R0\n\n\t\tReadINIStr $R0 $0 Settings NumFields\n\n\t\t${DEBUG} \"NumFields = $R0\"\n\n\t\t${For} $R1 1 $R0\n\t\t\t${DEBUG} \"Creating field $R1\"\n\t\t\tReadINIStr $R2 $0 \"Field $R1\" Type\n\t\t\t${DEBUG} \"  Type = $R2\"\n\t\t\tReadINIStr $R3 $0 \"Field $R1\" Left\n\t\t\t${DEBUG} \"  Left = $R3\"\n\t\t\tReadINIStr $R4 $0 \"Field $R1\" Top\n\t\t\t${DEBUG} \"  Top = $R4\"\n\t\t\tReadINIStr $R5 $0 \"Field $R1\" Right\n\t\t\t${DEBUG} \"  Right = $R5\"\n\t\t\tReadINIStr $R6 $0 \"Field $R1\" Bottom\n\t\t\t${DEBUG} \"  Bottom = $R6\"\n\t\t\tIntOp $R5 $R5 - $R3\n\t\t\t${DEBUG} \"  Width = $R5\"\n\t\t\tIntOp $R6 $R6 - $R4\n\t\t\t${DEBUG} \"  Height = $R6\"\n\t\t\tReadINIStr $R7 $0 \"Field $R1\" Text\n\t\t\t${DEBUG} \"  Text = $R7\"\n\t\t\t${Switch} $R2\n\t\t\t\t!insertmacro __NSD_ControlCase   HLine\n\t\t\t\t!insertmacro __NSD_ControlCase   VLine\n\t\t\t\t!insertmacro __NSD_ControlCase   Label\n\t\t\t\t!insertmacro __NSD_ControlCase   Icon\n\t\t\t\t!insertmacro __NSD_ControlCase   Bitmap\n\t\t\t\t!insertmacro __NSD_ControlCaseEx Link\n\t\t\t\t!insertmacro __NSD_ControlCase   Button\n\t\t\t\t!insertmacro __NSD_ControlCase   GroupBox\n\t\t\t\t!insertmacro __NSD_ControlCase   CheckBox\n\t\t\t\t!insertmacro __NSD_ControlCase   RadioButton\n\t\t\t\t!insertmacro __NSD_ControlCase   Text\n\t\t\t\t!insertmacro __NSD_ControlCase   Password\n\t\t\t\t!insertmacro __NSD_ControlCaseEx FileRequest\n\t\t\t\t!insertmacro __NSD_ControlCaseEx DirRequest\n\t\t\t\t!insertmacro __NSD_ControlCase   ComboBox\n\t\t\t\t!insertmacro __NSD_ControlCase   DropList\n\t\t\t\t!insertmacro __NSD_ControlCase   ListBox\n\t\t\t${EndSwitch}\n\n\t\t\tWriteINIStr $0 \"Field $R1\" HWND $R9\n\t\t${Next}\n\n\t\tnsDialogs::Show\n\n\tFunctionEnd\n\n\tFunction ${UNINSTALLER_FUNCPREFIX}UpdateINIState\n\n\t\t${DEBUG} \"Updating INI state\"\n\n\t\tReadINIStr $R0 $0 Settings NumFields\n\n\t\t${DEBUG} \"NumField = $R0\"\n\n\t\t${For} $R1 1 $R0\n\t\t\tReadINIStr $R2 $0 \"Field $R1\" HWND\n\t\t\tReadINIStr $R3 $0 \"Field $R1\" \"Type\"\n\t\t\t${Switch} $R3\n\t\t\t\t${Case} \"CheckBox\"\n\t\t\t\t${Case} \"RadioButton\"\n\t\t\t\t\t${DEBUG} \"  HWND = $R2\"\n\t\t\t\t\t${NSD_GetState} $R2 $R2\n\t\t\t\t\t${DEBUG} \"  Window selection = $R2\"\n\t\t\t\t${Break}\n\t\t\t\t${CaseElse}\n\t\t\t\t\t${DEBUG} \"  HWND = $R2\"\n\t\t\t\t\t${NSD_GetText} $R2 $R2\n\t\t\t\t\t${DEBUG} \"  Window text = $R2\"\n\t\t\t\t${Break}\n\t\t\t${EndSwitch}\n\t\t\tWriteINIStr $0 \"Field $R1\" STATE $R2\n\t\t${Next}\n\n\tFunctionEnd\n\n\tFunction ${UNINSTALLER_FUNCPREFIX}FileRequest\n\n\t\tIntOp $R5 $R5 - 15\n\t\tIntOp $R8 $R3 + $R5\n\n\t\t${NSD_CreateBrowseButton} $R8u $R4u 15u $R6u ...\n\t\tPop $R8\n\n\t\tnsDialogs::SetUserData $R8 $R1 # remember field id\n\n\t\tWriteINIStr $0 \"Field $R1\" HWND2 $R8\n\n\t\t${NSD_OnClick} $R8 ${UNINSTALLER_FUNCPREFIX}OnFileBrowseButton\n\n\t\tReadINIStr $R9 $0 \"Field $R1\" State\n\n\t\t${NSD_CreateFileRequest} $R3u $R4u $R5u $R6u $R9\n\t\tPop $R9\n\n\tFunctionEnd\n\n\tFunction ${UNINSTALLER_FUNCPREFIX}DirRequest\n\n\t\tIntOp $R5 $R5 - 15\n\t\tIntOp $R8 $R3 + $R5\n\n\t\t${NSD_CreateBrowseButton} $R8u $R4u 15u $R6u ...\n\t\tPop $R8\n\n\t\tnsDialogs::SetUserData $R8 $R1 # remember field id\n\n\t\tWriteINIStr $0 \"Field $R1\" HWND2 $R8\n\n\t\t${NSD_OnClick} $R8 ${UNINSTALLER_FUNCPREFIX}OnDirBrowseButton\n\n\t\tReadINIStr $R9 $0 \"Field $R1\" State\n\n\t\t${NSD_CreateFileRequest} $R3u $R4u $R5u $R6u $R9\n\t\tPop $R9\n\n\tFunctionEnd\n\n\tFunction ${UNINSTALLER_FUNCPREFIX}OnFileBrowseButton\n\n\t\tPop $R0\n\n\t\tnsDialogs::GetUserData $R0\n\t\tPop $R1\n\n\t\tReadINIStr $R2 $0 \"Field $R1\" HWND\n\t\tReadINIStr $R4 $0 \"Field $R1\" Filter\n\n\t\t${NSD_GetText} $R2 $R3\n\n\t\tnsDialogs::SelectFileDialog save $R3 $R4\n\t\tPop $R3\n\n\t\t${If} $R3 != \"\"\n\t\t\tSendMessage $R2 ${WM_SETTEXT} 0 STR:$R3\n\t\t${EndIf}\n\n\tFunctionEnd\n\n\tFunction ${UNINSTALLER_FUNCPREFIX}OnDirBrowseButton\n\n\t\tPop $R0\n\n\t\tnsDialogs::GetUserData $R0\n\t\tPop $R1\n\n\t\tReadINIStr $R2 $0 \"Field $R1\" HWND\n\t\tReadINIStr $R3 $0 \"Field $R1\" Text\n\n\t\t${NSD_GetText} $R2 $R4\n\n\t\tnsDialogs::SelectFolderDialog $R3 $R4\n\t\tPop $R3\n\n\t\t${If} $R3 != error\n\t\t\tSendMessage $R2 ${WM_SETTEXT} 0 STR:$R3\n\t\t${EndIf}\n\n\tFunctionEnd\n\n\tFunction ${UNINSTALLER_FUNCPREFIX}Link\n\n\t\t${NSD_CreateLink} $R3u $R4u $R5u $R6u $R7\n\t\tPop $R9\n\n\t\tnsDialogs::SetUserData $R9 $R1 # remember field id\n\n\t\t${NSD_OnClick} $R9 ${UNINSTALLER_FUNCPREFIX}OnLink\n\n\tFunctionEnd\n\n\tFunction ${UNINSTALLER_FUNCPREFIX}OnLink\n\n\t\tPop $R0\n\n\t\tnsDialogs::GetUserData $R0\n\t\tPop $R1\n\n\t\tReadINIStr $R1 $0 \"Field $R1\" STATE\n\n\t\tExecShell \"\" $R1\n\n\tFunctionEnd\n\n!macroend\n\n!verbose pop\n!endif\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Include/x64.nsh",
    "content": "; ---------------------\n;       x64.nsh\n; ---------------------\n;\n; A few simple macros to handle installations on x64 machines.\n;\n; RunningX64 checks if the installer is running on x64.\n;\n;   ${If} ${RunningX64}\n;     MessageBox MB_OK \"running on x64\"\n;   ${EndIf}\n;\n; DisableX64FSRedirection disables file system redirection.\n; EnableX64FSRedirection enables file system redirection.\n;\n;   SetOutPath $SYSDIR\n;   ${DisableX64FSRedirection}\n;   File some.dll # extracts to C:\\Windows\\System32\n;   ${EnableX64FSRedirection}\n;   File some.dll # extracts to C:\\Windows\\SysWOW64\n;\n\n!ifndef ___X64__NSH___\n!define ___X64__NSH___\n\n!include LogicLib.nsh\n\n!macro _RunningX64 _a _b _t _f\n  !insertmacro _LOGICLIB_TEMP\n  System::Call kernel32::GetCurrentProcess()i.s\n  System::Call kernel32::IsWow64Process(is,*i.s)\n  Pop $_LOGICLIB_TEMP\n  !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}`\n!macroend\n\n!define RunningX64 `\"\" RunningX64 \"\"`\n\n!macro DisableX64FSRedirection\n\n  System::Call kernel32::Wow64EnableWow64FsRedirection(i0)\n\n!macroend\n\n!define DisableX64FSRedirection \"!insertmacro DisableX64FSRedirection\"\n\n!macro EnableX64FSRedirection\n\n  System::Call kernel32::Wow64EnableWow64FsRedirection(i1)\n\n!macroend\n\n!define EnableX64FSRedirection \"!insertmacro EnableX64FSRedirection\"\n\n!endif # !___X64__NSH___\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/Menu/index.html",
    "content": "<html>\n<body link=\"#0C6E97\">\n    <div>\n        <img src=\"images/header.gif\" width=\"598\" height=\"45\"></div>\n    <table border=\"0\">\n        <tr>\n            <td width=\"20\">\n            </td>\n            <td width=\"190\" valign=\"top\">\n                <p>\n                    <font size=\"+1\" color=\"#333333\"><b>Compiler</b></font><br>\n                    <a href=\"EX:makensisw.exe\">Compile NSI scripts</a><br>\n                    <a href=\"EX:Bin\\zip2exe.exe\">Installer based on ZIP file</a><br>\n                    <br>\n                    <br>\n                    <br>\n                </p>\n                <p>\n                    <font size=\"+1\" color=\"#333333\"><b>Developer Center</b></font><br>\n                    Many more examples, tutorials, plug-ins and NSIS-releted software are available\n                    at the on-line <a href=\"EX:http://nsis.sourceforge.net/Developer_Center\">Developer Center</a>.\n                </p>\n\t\t\t\t</td>\n\t\t\t<td width=\"150\" valign=\"top\">\n\t\t\t\t<p>\n\t\t\t\t\t<font size=\"+1\" color=\"#333333\"><b>Documentation</b></font><br>\n\t\t\t\t\t<a href=\"EX:NSIS.chm\">NSIS Users Manual</a><br>\n\t\t\t\t\t<a href=\"EX:Examples\">Example scripts</a><br>\n\t\t\t\t\t<a href=\"EX:Docs\\Modern UI 2\\Readme.html\">Modern UI 2</a><br>\n\t\t\t\t\t<a href=\"EX:Docs\\MultiUser\\Readme.html\">Multi-User Header File</a><br>\n\t\t\t\t\t<a href=\"EX:Docs\\StrFunc\\StrFunc.txt\">StrFunc Header File</a></p>\n\t\t\t\t<p>\n\t\t\t\t\t<font size=\"+1\" color=\"#333333\"><b>On-line help</b></font><br>\n\t\t\t\t\t<a href=\"EX:http://forums.winamp.com/forumdisplay.php?s=&forumid=65\">Forum</a><br>\n\t\t\t\t\t<a href=\"EX:http://nsis.sourceforge.net/FAQ\">FAQ</a><br>\n\t\t\t\t\t<a href=\"EX:irc://irc.landoleet.org/nsis\">IRC Channel</a><br>\n\t\t\t\t\t<a href=\"EX:http://sourceforge.net/tracker/?group_id=22049&atid=373085\">Bug Tracker</a><br>\n\t\t\t</td>\n\t\t\t<td valign=\"top\">\n\t\t\t\t<p>\n\t\t\t\t\t<font size=\"+1\" color=\"#333333\"><b>Plug-ins</b></font><br>\n\t\t\t\t\t<a href=\"EX:Docs\\AdvSplash\\advsplash.txt\">AdvSplash</a> - splash with fade in/out<br>\n\t\t\t\t\t<a href=\"EX:Docs\\Banner\\Readme.txt\">Banner</a> - banner with custom text<br>\n\t\t\t\t\t<a href=\"EX:Docs\\BgImage\\BgImage.txt\">BgImage</a> - background image<br>\n\t\t\t\t\t<a href=\"EX:Docs\\Dialer\\Dialer.txt\">Dialer</a> - internet connection<br>\n\t\t\t\t\t<a href=\"EX:Docs\\Math\\Math.txt\">Math</a> - math operations<br>\n\t\t\t\t\t<a href=\"EX:Docs\\nsDialogs\\Readme.html\">nsDialogs</a> - custom wizard pages<br>\n\t\t\t\t\t<a href=\"EX:Docs\\nsExec\\nsExec.txt\">nsExec</a> - launch command line tools<br>\n\t\t\t\t\t<a href=\"EX:Docs\\NSISdl\\Readme.txt\">NSISdl</a> - download files<br>\n\t\t\t\t\t<a href=\"EX:Docs\\Splash\\splash.txt\">Splash</a> - splash screen<br>\n\t\t\t\t\t<a href=\"EX:Docs\\StartMenu\\Readme.txt\">StartMenu</a> - Start Menu folder selection<br>\n\t\t\t\t\t<a href=\"EX:Docs\\System\\System.html\">System</a> - Windows API calls<br>\n\t\t\t\t\t<a href=\"EX:Docs\\VPatch\\Readme.html\">VPatch</a> - update existing files</p>\n\t\t\t</td>\n        </tr>\n    </table>\n    <p>\n        <img src=\"images/line.gif\" width=\"598\" height=\"3\"></p>\n    <div align=\"right\">\n        <a href=\"EX:http://nsis.sourceforge.net/\">\n            <img src=\"images/site.gif\" width=\"200\" height=\"25\"></a></div>\n</body>\n</html>\n"
  },
  {
    "path": "tools/InstallBuilder/NSIS/nsisconf.nsh",
    "content": ";------------------------\n;DEFAULT NSIS CONFIG FILE\n;------------------------\n\n;This header file will be included when compiling any NSIS installer,\n;you can use it to add script code to every installer you compile.\n\n;This file is treated as if it is in the directory of your script.\n;When using relative paths, the files have to be in your build directory.\n\n;------------------------\n;EXAMPLES\n;------------------------\n\n;Compress installer exehead with an executable compressor (such as UPX / Petite).\n\n;Paths should be absolute to allow building from any location.\n;Note that your executable compressor should not compress the first icon.\n\n;!packhdr temp.dat '\"C:\\Program Files\\upx\\upx\" -9 -q temp.dat'\n;!packhdr temp.dat '\"C:\\Program Files\\petite\\petite\" -9 -b0 -r** -p0 -y temp.dat'\n\n;------------------------\n\n;Set default compressor\n\n;SetCompressor bzip2\n\n;------------------------\n\n;Change the default icons\n\n;Icon \"${NSISDIR}\\Contrib\\Graphics\\Icons\\arrow-install.ico\"\n;UninstallIcon \"${NSISDIR}\\Contrib\\Graphics\\Icons\\arrow-uninstall.ico\"\n\n;------------------------\n\n;Define symbols\n\n;!define COMPANYNAME \"bla\"\n\n;------------------------\n;MODERN UI\n;------------------------\n\n;The Modern UI will insert the MUI_NSISCONF macro just before processing the settings.\n;Here you can set default settings for the Modern UI.\n\n;------------------------\n\n!define MUI_INSERT_NSISCONF\n\n!macro MUI_NSISCONF\n\n  ;Example: Change the default Modern UI icons\n  \n  ;!ifndef MUI_ICON & MUI_UNICON\n  ;  !define MUI_ICON \"${NSISDIR}\\Contrib\\Graphics\\Icons\\arrow-install.ico\"\n  ;  !define MUI_UNICON \"${NSISDIR}\\Contrib\\Graphics\\Icons\\arrow-uninstall.ico\"\n  ;!endif\n  \n!macroend"
  },
  {
    "path": "tools/InstallBuilder/Program.cs",
    "content": "using System;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text.RegularExpressions;\nusing System.Windows.Forms;\nusing ICSharpCode.SharpZipLib.Zip;\n\nnamespace EVEMon.InstallBuilder\n{\n    internal static class Program\n    {\n        private static string s_sourceFilesDir;\n        private static string s_outputPath;\n        private static string s_installerDir;\n        private static string s_snapshotDir;\n        private static string s_binariesDir;\n        private static string s_solutionDir;\n        private static string s_projectDir;\n        private static string s_nsisExe;\n        private static bool s_isSnapshot;\n\n        private static FileVersionInfo s_fileVersionInfo;\n\n        /// <summary>\n        /// The main entry point for the application.\n        /// </summary>\n        /// <param name=\"args\">The args.</param>\n        /// <returns></returns>\n        [STAThread]\n        private static int Main(string[] args)\n        {\n            CheckIsSnapshot();\n\n            if (!HasVersion())\n                return 1;\n\n            if (args.Any())\n            {\n                if (args[0] == \"-version\" || args[0] == \"-v\")\n                {\n                    Console.WriteLine(s_fileVersionInfo.ProductVersion);\n                    return 0;\n                }\n\n                if (args[0] == \"-version=tc\" || args[0] == \"-v=tc\")\n                {\n                    Console.WriteLine(\"##teamcity[buildNumber '{0}']\", s_fileVersionInfo.ProductVersion);\n                    return 0;\n                }\n            }\n\n            try\n            {\n                if (CheckNsisPresent() && !s_isSnapshot)\n                {\n                    // Create the appropriate folder if it doesn't exist\n                    if (!Directory.Exists(InstallerDirectory))\n                        Directory.CreateDirectory(InstallerDirectory);\n\n                    // Create an installer in the appropriate folder\n                    Console.WriteLine(\"Starting Installer creation.\");\n                    if (BuildInstaller() != 0)\n                        return 1;\n                    Console.WriteLine(\"Installer creation finished.\");\n                    Console.WriteLine();\n                }\n\n                // Create the appropriate folder if it doesn't exist\n                string directory = s_isSnapshot ? SnapshotDirectory : BinariesDirectory;\n                if (!Directory.Exists(directory))\n                    Directory.CreateDirectory(directory);\n\n                // Create a zip file in the appropriate folder\n                string description = s_isSnapshot ? \"Snapshot\" : \"Binaries\";\n                Console.WriteLine(\"Starting {0} Zip creation.\", description);\n                if (BuildZip() != 0)\n                    return 1;\n                Console.WriteLine(\"{0} Zip creation finished.\", description);\n                Console.WriteLine(\"Done\");\n\n                if (Debugger.IsAttached)\n                    Console.ReadLine();\n\n                return 0;\n            }\n            catch (Exception ex)\n            {\n                Console.WriteLine(\"An error occurred: {0} in {1}\", ex.Message, ex.Source);\n                Console.WriteLine();\n                Console.WriteLine(ex.StackTrace);\n                if (Debugger.IsAttached)\n                    Console.ReadLine();\n                return 1;\n            }\n        }\n\n        /// <summary>\n        /// Gets the solution directory.\n        /// </summary>\n        /// <returns></returns>\n        private static string SolutionDirectory\n        {\n            get\n            {\n                if (string.IsNullOrWhiteSpace(s_solutionDir))\n                {\n                    s_solutionDir = Regex.Match(Directory.GetCurrentDirectory(), @\"[a-zA-Z]+:.*\\\\(?=tools)\",\n                        RegexOptions.Compiled | RegexOptions.IgnoreCase).ToString();\n                }\n                return s_solutionDir;\n            }\n        }\n\n        /// <summary>\n        /// Gets the project directory.\n        /// </summary>\n        /// <returns></returns>\n        private static string ProjectDirectory\n        {\n            get\n            {\n                if (string.IsNullOrWhiteSpace(s_projectDir))\n                {\n                    s_projectDir = Regex.Match(Directory.GetCurrentDirectory(), @\"[a-zA-Z]+:.*\\\\(?=bin)\",\n                        RegexOptions.Compiled | RegexOptions.IgnoreCase).ToString();\n                }\n                return s_projectDir;\n            }\n        }\n\n        /// <summary>\n        /// Gets the output path.\n        /// </summary>\n        /// <returns></returns>\n        private static string OutputPath\n        {\n            get\n            {\n                if (string.IsNullOrWhiteSpace(s_outputPath))\n                {\n                    s_outputPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase.Remove(0, ProjectDirectory.Length);\n                }\n                return s_outputPath;\n            }\n        }\n\n        /// <summary>\n        /// Gets the source files directory.\n        /// </summary>\n        /// <returns></returns>\n        private static string SourceFilesDirectory\n        {\n            get\n            {\n                if (string.IsNullOrWhiteSpace(s_sourceFilesDir))\n                {\n                    s_sourceFilesDir = Path.GetFullPath(Path.Combine(SolutionDirectory, @\"src\\EVEMon\\\", OutputPath));\n                }\n                return s_sourceFilesDir;\n            }\n        }\n\n        /// <summary>\n        /// Gets the installer directory.\n        /// </summary>\n        /// <returns></returns>\n        private static string InstallerDirectory\n        {\n            get\n            {\n                if (string.IsNullOrWhiteSpace(s_installerDir))\n                {\n                    s_installerDir = GetInstallbuilderDirectory(\"Installer\");\n                }\n                return s_installerDir;\n            }\n        }\n\n        /// <summary>\n        /// Gets the snapshot directory.\n        /// </summary>\n        /// <returns></returns>\n        private static string SnapshotDirectory\n        {\n            get\n            {\n                if (string.IsNullOrWhiteSpace(s_snapshotDir))\n                {\n                    s_snapshotDir = GetInstallbuilderDirectory(\"Snapshot\");\n                }\n                return s_snapshotDir;\n            }\n        }\n\n        /// <summary>\n        /// Gets the binaries directory.\n        /// </summary>\n        /// <returns></returns>\n        private static string BinariesDirectory\n        {\n            get\n            {\n                if (string.IsNullOrWhiteSpace(s_binariesDir))\n                {\n                    s_binariesDir = GetInstallbuilderDirectory(\"Binaries\");\n                }\n                return s_binariesDir;\n            }\n        }\n\n        /// <summary>\n        /// Gets the installbuilder directory.\n        /// </summary>\n        /// <param name=\"directory\">The directory.</param>\n        /// <returns></returns>\n        private static string GetInstallbuilderDirectory(string directory)\n            => Path.GetFullPath(\n                Regex.Replace(SourceFilesDirectory, \"Debug|Release\",\n                    Path.Combine(\"Installbuilder\", directory),\n                    RegexOptions.Compiled | RegexOptions.IgnoreCase));\n\n        /// <summary>\n        /// Checks the configuration is Snapshot.\n        /// </summary>\n        [Conditional(\"SNAPSHOT\")]\n        private static void CheckIsSnapshot()\n        {\n            s_isSnapshot = true;\n        }\n\n        /// <summary>\n        /// Checks that NSIS is present.\n        /// </summary>\n        private static bool CheckNsisPresent()\n        {\n            s_nsisExe = FindMakeNsisExe();\n            Console.WriteLine(\"NSIS : {0}\", string.IsNullOrEmpty(s_nsisExe)\n                ? \"Not Found - Installer will not be created.\"\n                : s_nsisExe);\n\n            Console.WriteLine();\n\n            Console.WriteLine(\"Project directory : {0}\", ProjectDirectory);\n            Console.WriteLine(\"Source directory : {0}\", SourceFilesDirectory);\n            if (s_isSnapshot)\n                Console.WriteLine(\"Snapshot directory : {0}\", SnapshotDirectory);\n            else\n            {\n                Console.WriteLine(\"Installer directory : {0}\", InstallerDirectory);\n                Console.WriteLine(\"Binaries directory : {0}\", BinariesDirectory);\n            }\n            Console.WriteLine();\n\n            return !string.IsNullOrEmpty(s_nsisExe);\n        }\n\n        /// <summary>\n        /// Finds the 'makensis' executable.\n        /// </summary>\n        /// <returns></returns>\n        private static string FindMakeNsisExe()\n        {\n            string path = Path.Combine(ProjectDirectory, @\"NSIS\\makensis.exe\");\n            return File.Exists(path) ? path : string.Empty;\n        }\n\n        /// <summary>\n        /// Gets true if a release version has been compiled.\n        /// </summary>\n        private static bool HasVersion()\n        {\n            try\n            {\n                s_fileVersionInfo = FileVersionInfo.GetVersionInfo(Path.Combine(SourceFilesDirectory, \"EVEMon.exe\"));\n            }\n            catch (Exception)\n            {\n                Console.WriteLine(\"A \\\"Release\\\" has to be compiled first.\");\n                Console.WriteLine(\"Install Builder will now close.\");\n                Console.ReadLine();\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Builds the zip.\n        /// </summary>\n        private static int BuildZip()\n        {\n            string directory = s_isSnapshot ? SnapshotDirectory : BinariesDirectory;\n\n            // Delete any existing files in directory\n            DeleteFiles(directory);\n\n            string filename = s_isSnapshot\n                ? string.Format(CultureInfo.InvariantCulture, \"EVEMon_{0}_{1:yyyy-MM-dd}.zip\",\n                    s_fileVersionInfo.ProductPrivatePart, DateTime.Now)\n                : string.Format(CultureInfo.InvariantCulture, \"EVEMon-binaries-{0}.zip\", s_fileVersionInfo.ProductVersion);\n\n            string zipFileName = Path.Combine(directory, filename);\n\n            string[] filenames = Directory.GetFiles(SourceFilesDirectory, \"*\", SearchOption.AllDirectories);\n\n            Stream stream = null;\n            try\n            {\n                stream = File.Create(zipFileName);\n\n                using (ZipOutputStream zipStream = new ZipOutputStream(stream))\n                {\n                    stream = null;\n                    zipStream.SetLevel(9);\n                    zipStream.UseZip64 = UseZip64.Off;\n\n                    byte[] buffer = new byte[4096];\n\n                    foreach (string file in filenames.Where(file => !file.Contains(\"vshost\") && !file.Contains(\".config\")))\n                    {\n                        string entryName = string.Format(CultureInfo.InvariantCulture, \"EVEMon\\\\{0}\",\n                            file.Remove(0, SourceFilesDirectory.Length));\n                        Console.WriteLine(\"Zipping {0}\", entryName);\n                        ZipEntry entry = new ZipEntry(entryName) { DateTime = DateTime.Now };\n\n                        zipStream.PutNextEntry(entry);\n\n                        using (FileStream fs = File.OpenRead(file))\n                        {\n                            int sourceBytes;\n                            do\n                            {\n                                sourceBytes = fs.Read(buffer, 0, buffer.Length);\n                                zipStream.Write(buffer, 0, sourceBytes);\n                            } while (sourceBytes > 0);\n                        }\n                    }\n                    zipStream.Finish();\n                }\n            }\n            catch (Exception ex)\n            {\n                Console.WriteLine(ex.Message);\n                return 1;\n            }\n            finally\n            {\n                stream?.Dispose();\n            }\n\n            return 0;\n        }\n\n        /// <summary>\n        /// Builds the installer.\n        /// </summary>\n        private static int BuildInstaller()\n        {\n            // Delete any existing files in directory\n            DeleteFiles(InstallerDirectory);\n\n            int exitCode;\n            try\n            {\n                string nsisScript = Path.Combine(ProjectDirectory, OutputPath, \"EVEMonInstallerScript.nsi\");\n                string resourcesDir = Path.Combine(SolutionDirectory, @\"src\\\\EVEMon.Common\\Resources\");\n                string appCopyright = ((AssemblyCopyrightAttribute)Attribute.GetCustomAttribute(\n                    typeof(Program).Assembly, typeof(AssemblyCopyrightAttribute))).Copyright;\n                string productName = string.Format(CultureInfo.InvariantCulture, \"/DPRODUCTNAME=\\\"{0}\\\"\", Application.ProductName);\n                string companyName = string.Format(CultureInfo.InvariantCulture, \"/DCOMPANYNAME=\\\"{0}\\\"\", Application.CompanyName);\n                string copyright = string.Format(CultureInfo.InvariantCulture, \"/DCOPYRIGHT=\\\"{0}\\\"\", appCopyright);\n                string description = string.Format(CultureInfo.InvariantCulture, \"/DDESCRIPTION=\\\"{0}\\\"\", Application.ProductName);\n                string version = string.Format(CultureInfo.InvariantCulture, \"/DVERSION={0}\", s_fileVersionInfo.ProductVersion);\n                string fullVersion = string.Format(CultureInfo.InvariantCulture, \"/DFULLVERSION={0}\",\n                    s_fileVersionInfo.FileVersion);\n                string installerDir = string.Format(CultureInfo.InvariantCulture, \"/DOUTDIR={0}\", InstallerDirectory);\n                string sourceDir = string.Format(CultureInfo.InvariantCulture, \"/DSOURCEDIR={0}\", SourceFilesDirectory);\n                string resourceDir = string.Format(CultureInfo.InvariantCulture, \"/DRESOURCESDIR={0}\", resourcesDir);\n\n                string param = string.Format(CultureInfo.InvariantCulture, \"{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}\",\n                    productName, companyName, copyright, description, version, fullVersion, installerDir, sourceDir, resourceDir,\n                    nsisScript);\n\n                Console.WriteLine(\"NSIS script : {0}\", nsisScript);\n                Console.WriteLine(\"Output directory : {0}\", InstallerDirectory);\n\n                ProcessStartInfo psi = new ProcessStartInfo(s_nsisExe, param)\n                {\n                    WorkingDirectory = ProjectDirectory,\n                    UseShellExecute = false,\n                    RedirectStandardOutput = true\n                };\n\n                using (Process makensisProcess = new Process())\n                {\n                    makensisProcess.StartInfo = psi;\n                    makensisProcess.Start();\n                    makensisProcess.ProcessorAffinity = (IntPtr)0x3;\n                    Console.WriteLine(makensisProcess.StandardOutput.ReadToEnd());\n                    makensisProcess.WaitForExit();\n                    exitCode = makensisProcess.ExitCode;\n                }\n\n                if (exitCode != 0)\n                    Console.WriteLine(\"MakeNSIS exited with errors.\");\n            }\n            catch (Exception ex)\n            {\n                Console.WriteLine(ex.Message);\n                return 1;\n            }\n\n            return exitCode;\n        }\n\n        /// <summary>\n        /// Deletes the files in the specified directory.\n        /// </summary>\n        /// <param name=\"directoryPath\">The directory path.</param>\n        private static void DeleteFiles(string directoryPath)\n        {\n            Console.WriteLine(\"Deleting all files in {0}\", directoryPath);\n\n            foreach (string file in Directory.GetFiles(directoryPath))\n            {\n                try\n                {\n                    File.Delete(file);\n                }\n                catch (ArgumentException ex)\n                {\n                    MessageBox.Show(ex.Message);\n                }\n                catch (IOException ex)\n                {\n                    MessageBox.Show(ex.Message);\n                }\n                catch (UnauthorizedAccessException ex)\n                {\n                    MessageBox.Show(ex.Message);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tools/InstallBuilder/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"InstallBuilder\")]\n[assembly: AssemblyDescription(\"Installs EVEMon on your computer\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"EVEMon Development Team\")]\n[assembly: AssemblyProduct(\"EVEMon Installer\")]\n[assembly: AssemblyCopyright(\"Copyright © 2006-2016 EVEMon Development Team\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"8d81430d-8960-4d33-9375-35b66e09bf9c\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n[assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: AssemblyInformationalVersion(\"1.0.0\")]\n\n// Neutral Language\n[assembly: NeutralResourcesLanguage(\"en-US\")]"
  },
  {
    "path": "tools/InstallBuilder/UAC.nsh",
    "content": "!ifndef UAC_HDR__INC\n!verbose push\n!verbose 3\n!ifndef UAC_VERBOSE  \n\t!define UAC_VERBOSE 3\n!endif\n!verbose ${UAC_VERBOSE}\n\n!define UAC_HDR__INC 0x00020204 ;MMmmbbrr\n\n!include LogicLib.nsh\n\n!macro _UAC_definemath def val1 op val2\n!define /math _UAC_definemath \"${val1}\" ${op} ${val2}\n!ifdef ${def}\n\t!undef ${def}\n!endif\n!define ${def} \"${_UAC_definemath}\"\n!undef _UAC_definemath\n!macroend\n\n!macro _UAC_ParseDefineFlags_orin parse outflags\n!searchparse /noerrors ${${parse}} \"\" _UAC_ParseDefineFlags_orin_f1 \"|\" _UAC_ParseDefineFlags_orin_f2\n!define _UAC_ParseDefineFlags_orin_this ${_UAC_ParseDefineFlags_orin_f1}\n!undef ${parse}\n!define ${parse} ${_UAC_ParseDefineFlags_orin_f2}\n!define _UAC_ParseDefineFlags_orin_saveout ${${outflags}}\n!undef ${outflags}\n!define /math ${outflags} \"${_UAC_ParseDefineFlags_orin_saveout}\" | \"${_UAC_ParseDefineFlags_orin_this}\"\n!undef _UAC_ParseDefineFlags_orin_saveout\n!undef _UAC_ParseDefineFlags_orin_this\n!ifdef _UAC_ParseDefineFlags_orin_f1\n\t!undef _UAC_ParseDefineFlags_orin_f1\n\t!undef _UAC_ParseDefineFlags_orin_f2\n!endif\n!macroend\n!macro _UAC_ParseDefineFlags_Begin _outdef _in\n!define _UAC_PDF${_outdef}_parse \"${_in}\"\n!define _UAC_PDF${_outdef}_flags \"\"\n!define _UAC_PDF${_outdef}_r 0\n!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags\t;0x1\n!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags\t;0x2\n!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags\t;0x4\n!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags\t;0x8\n!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags\t;0x10\n!macroend\n!macro _UAC_ParseDefineFlags_End _outdef\n!define ${_outdef} ${_UAC_PDF${_outdef}_r}\n!undef _UAC_PDF${_outdef}_r\n!undef _UAC_PDF${_outdef}_flags\n!undef _UAC_PDF${_outdef}_parse\n!macroend\n!macro _UAC_ParseDefineFlags_IncludeFlag _outdef flag\n!if ${_UAC_PDF${_outdef}_flags} & ${flag}\n\t!insertmacro _UAC_definemath _UAC_PDF${_outdef}_r ${_UAC_PDF${_outdef}_r} | ${flag}\n!endif\n!macroend\n!macro _UAC_ParseDefineFlagsToInt _outdef _in\n!insertmacro _UAC_ParseDefineFlags_Begin _UAC_ParseDefineFlagsToInt_tmp \"${_in}\"\n!define ${_outdef} ${_UAC_PDF_UAC_ParseDefineFlagsToInt_tmp_flags}\n!insertmacro _UAC_ParseDefineFlags_End _UAC_ParseDefineFlagsToInt_tmp\n!undef _UAC_ParseDefineFlagsToInt_tmp\n!macroend\n\n!macro _UAC_IncL\n!insertmacro _UAC_definemath __UAC_L \"${__UAC_L}\" + 1\n!macroend\n\n\n!macro _UAC_MakeLL_Cmp cmpop cmp pluginparams\n!insertmacro _LOGICLIB_TEMP\nUAC::_ ${pluginparams}\npop $_LOGICLIB_TEMP\n!insertmacro ${cmpop} $_LOGICLIB_TEMP ${cmp} `${_t}` `${_f}`\n!macroend\n\n\n!macro UAC_RunElevated\nUAC::_ 0\n!macroend\n!macro UAC_PageElevation_RunElevated\nUAC::_ 0\n!macroend\n/*!macro UAC_OnInitElevation_RunElevated\nUAC::_ 0\n!macroend\n!macro UAC_OnInitElevation_OnGuiInit\n!macroend*/\n\n\n!macro UAC_IsAdmin\nUAC::_ 2\n!macroend\n!define UAC_IsAdmin `\"\" UAC_IsAdmin \"\"`\n!macro _UAC_IsAdmin _a _b _t _f\n!insertmacro _UAC_MakeLL_Cmp _!= 0 2s\n!macroend\n\n\n\n!macro UAC_IsInnerInstance\nUAC::_ 3\n!macroend\n!define UAC_IsInnerInstance `\"\" UAC_IsInnerInstance \"\"`\n!macro _UAC_IsInnerInstance _a _b _t _f\n!insertmacro _UAC_MakeLL_Cmp _!= 0 3s\n!macroend\n\n!macro UAC_Notify_OnGuiInit\nUAC::_ 4\n!macroend\n!macro UAC_PageElevation_OnGuiInit\n!insertmacro UAC_Notify_OnGuiInit\n!macroend\n!macro UAC_PageElevation_OnInit\nUAC::_ 5\n${IfThen} ${Errors} ${|} Quit ${|}\n!macroend\n\n\n!define UAC_SYNCREGISTERS 0x1\n#!define UAC_SYNCSTACK     0x2\n!define UAC_SYNCOUTDIR    0x4\n!define UAC_SYNCINSTDIR   0x8\n#!define UAC_CLEARERRFLAG  0x10\n!macro UAC_AsUser_Call type name flags\npush $0\nGet${type}Address $0 ${name}\n!verbose push\n!verbose ${UAC_VERBOSE}\n!insertmacro _UAC_ParseDefineFlagsToInt _UAC_AsUser_Call__flags ${flags}\n!verbose pop\nStrCpy $0 \"1$0:${_UAC_AsUser_Call__flags}\"\n!undef _UAC_AsUser_Call__flags\nExch $0\nUAC::_\n!macroend\n\n!macro _UAC_AsUser_GenOp outvar op opparam1 opparam2\n!define _UAC_AUGOGR_ID _UAC_AUGOGR_OP${outvar}${op}${opparam1}${opparam2}\n!ifndef ${_UAC_AUGOGR_ID} ;Has this exact action been done before? \n\t!if ${outvar} == $0\n\t\t!define ${_UAC_AUGOGR_ID} $1\n\t!else\n\t\t!define ${_UAC_AUGOGR_ID} $0\n\t!endif\n\t!if \"${opparam1}\" == \"\"\n\t\t!define _UAC_AUGOGR_OPP1 ${${_UAC_AUGOGR_ID}}\n\t\t!define _UAC_AUGOGR_OPP2 ${opparam2}\n\t!else\n\t\t!define _UAC_AUGOGR_OPP1 ${opparam1}\n\t\t!define _UAC_AUGOGR_OPP2 ${${_UAC_AUGOGR_ID}}\n\t!endif\t\n\tgoto ${_UAC_AUGOGR_ID}_C\n\t${_UAC_AUGOGR_ID}_F:\n\t\t${op} ${_UAC_AUGOGR_OPP1} ${_UAC_AUGOGR_OPP2}\n\t\treturn\n\t${_UAC_AUGOGR_ID}_C:\n\t!undef _UAC_AUGOGR_OPP1\n\t!undef _UAC_AUGOGR_OPP2\n!endif\npush ${${_UAC_AUGOGR_ID}}\n!insertmacro UAC_AsUser_Call Label ${_UAC_AUGOGR_ID}_F ${UAC_SYNCREGISTERS}\nStrCpy ${outvar} ${${_UAC_AUGOGR_ID}}\npop ${${_UAC_AUGOGR_ID}}\n!undef _UAC_AUGOGR_ID\n!macroend\n\n!macro UAC_AsUser_GetSection datatype secidx outvar\n!insertmacro _UAC_AsUser_GenOp ${outvar} SectionGet${datatype} ${secidx} \"\"\n!macroend\n\n!macro UAC_AsUser_GetGlobalVar var\n!insertmacro _UAC_AsUser_GenOp ${var} StrCpy \"\" ${var}\n!macroend\n!macro UAC_AsUser_GetGlobal outvar srcvar\n!insertmacro _UAC_AsUser_GenOp ${outvar} StrCpy \"\" ${srcvar}\n!macroend\n\n\n!macro UAC_AsUser_ExecShell verb command params workdir show\n!insertmacro _UAC_IncL\ngoto _UAC_L_E_${__UAC_L}\n_UAC_L_F_${__UAC_L}:\nExecShell \"${verb}\" \"${command}\" ${params} ${show}\nreturn\n_UAC_L_E_${__UAC_L}:\n!if \"${workdir}\" != \"\"\n\tpush $outdir\n\tSetOutPath \"${workdir}\"\n!endif\n!insertmacro UAC_AsUser_Call Label _UAC_L_F_${__UAC_L} ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} #|${UAC_CLEARERRFLAG}\n!if \"${workdir}\" != \"\"\n\tpop $outdir \n\tSetOutPath $outdir\n!endif\n!macroend\n\n!verbose pop\n!endif /* UAC_HDR__INC */"
  },
  {
    "path": "tools/InstallBuilder/app.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n<startup><supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\"/></startup></configuration>\n"
  },
  {
    "path": "tools/InstallBuilder/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"SharpZipLib\" version=\"0.86.0\" targetFramework=\"net461\" />\n</packages>"
  },
  {
    "path": "tools/PatchXmlCreator/Action.cs",
    "content": "namespace EVEMon.PatchXmlCreator\n{\n    internal enum Action\n    {\n        None,\n        ReleaseAndDatafiles,\n        ReleaseOnly,\n        DatafilesOnly\n    }\n}"
  },
  {
    "path": "tools/PatchXmlCreator/DatafileControl.Designer.cs",
    "content": "namespace EVEMon.PatchXmlCreator\n{\n    partial class DatafileControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.gbDatafile = new System.Windows.Forms.GroupBox();\n            this.dtpDatafiles = new System.Windows.Forms.DateTimePicker();\n            this.lblDatafileDate = new System.Windows.Forms.Label();\n            this.lblMD5Sum = new System.Windows.Forms.Label();\n            this.lblDatafileMessage = new System.Windows.Forms.Label();\n            this.rtbDatafileMessage = new System.Windows.Forms.RichTextBox();\n            this.gbDatafile.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // gbDatafile\n            // \n            this.gbDatafile.Controls.Add(this.dtpDatafiles);\n            this.gbDatafile.Controls.Add(this.lblDatafileDate);\n            this.gbDatafile.Controls.Add(this.lblMD5Sum);\n            this.gbDatafile.Controls.Add(this.lblDatafileMessage);\n            this.gbDatafile.Controls.Add(this.rtbDatafileMessage);\n            this.gbDatafile.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbDatafile.Location = new System.Drawing.Point(0, 0);\n            this.gbDatafile.Name = \"gbDatafile\";\n            this.gbDatafile.Size = new System.Drawing.Size(398, 92);\n            this.gbDatafile.TabIndex = 17;\n            this.gbDatafile.TabStop = false;\n            this.gbDatafile.Text = \"eve-datafilename-culture-xml.gzip\";\n            this.gbDatafile.MouseCaptureChanged += new System.EventHandler(this.OnClick);\n            // \n            // dtpDatafiles\n            // \n            this.dtpDatafiles.CustomFormat = \" dd MMMM yyyy\";\n            this.dtpDatafiles.Format = System.Windows.Forms.DateTimePickerFormat.Custom;\n            this.dtpDatafiles.Location = new System.Drawing.Point(47, 18);\n            this.dtpDatafiles.Name = \"dtpDatafiles\";\n            this.dtpDatafiles.Size = new System.Drawing.Size(166, 21);\n            this.dtpDatafiles.TabIndex = 0;\n            this.dtpDatafiles.Value = new System.DateTime(2010, 1, 1, 0, 0, 0, 0);\n            // \n            // lblDatafileDate\n            // \n            this.lblDatafileDate.AutoSize = true;\n            this.lblDatafileDate.Location = new System.Drawing.Point(4, 21);\n            this.lblDatafileDate.Name = \"lblDatafileDate\";\n            this.lblDatafileDate.Size = new System.Drawing.Size(37, 13);\n            this.lblDatafileDate.TabIndex = 3;\n            this.lblDatafileDate.Text = \"Date :\";\n            // \n            // lblMD5Sum\n            // \n            this.lblMD5Sum.AutoSize = true;\n            this.lblMD5Sum.Location = new System.Drawing.Point(219, 21);\n            this.lblMD5Sum.Name = \"lblMD5Sum\";\n            this.lblMD5Sum.Size = new System.Drawing.Size(54, 13);\n            this.lblMD5Sum.TabIndex = 2;\n            this.lblMD5Sum.Text = \"MD5 Sum\";\n            this.lblMD5Sum.Click += new System.EventHandler(this.OnClick);\n            // \n            // lblDatafileMessage\n            // \n            this.lblDatafileMessage.AutoSize = true;\n            this.lblDatafileMessage.Location = new System.Drawing.Point(4, 45);\n            this.lblDatafileMessage.Name = \"lblDatafileMessage\";\n            this.lblDatafileMessage.Size = new System.Drawing.Size(56, 13);\n            this.lblDatafileMessage.TabIndex = 4;\n            this.lblDatafileMessage.Text = \"Message :\";\n            this.lblDatafileMessage.Click += new System.EventHandler(this.OnClick);\n            // \n            // rtbDatafileMessage\n            // \n            this.rtbDatafileMessage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\n                        | System.Windows.Forms.AnchorStyles.Right)));\n            this.rtbDatafileMessage.DetectUrls = false;\n            this.rtbDatafileMessage.Location = new System.Drawing.Point(63, 42);\n            this.rtbDatafileMessage.Name = \"rtbDatafileMessage\";\n            this.rtbDatafileMessage.Size = new System.Drawing.Size(329, 44);\n            this.rtbDatafileMessage.TabIndex = 1;\n            this.rtbDatafileMessage.Text = \"{0} {1} ({2}) {3} data file by the EVEMon Development Team\";\n            // \n            // DatafileControl\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.gbDatafile);\n            this.Name = \"DatafileControl\";\n            this.Size = new System.Drawing.Size(398, 92);\n            this.gbDatafile.ResumeLayout(false);\n            this.gbDatafile.PerformLayout();\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Label lblDatafileMessage;\n        protected internal System.Windows.Forms.GroupBox gbDatafile;\n        protected internal System.Windows.Forms.Label lblMD5Sum;\n        protected internal System.Windows.Forms.RichTextBox rtbDatafileMessage;\n        private System.Windows.Forms.Label lblDatafileDate;\n        protected internal System.Windows.Forms.DateTimePicker dtpDatafiles;\n\n    }\n}\n"
  },
  {
    "path": "tools/PatchXmlCreator/DatafileControl.cs",
    "content": "using System;\nusing System.Windows.Forms;\nusing EVEMon.Common.Factories;\n\nnamespace EVEMon.PatchXmlCreator\n{\n    internal partial class DatafileControl : UserControl\n    {\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public DatafileControl()\n        {\n            InitializeComponent();\n            dtpDatafiles.Font = FontFactory.GetFont(\"Tahoma\");\n            lblDatafileDate.Font = FontFactory.GetFont(\"Tahoma\");\n        }\n\n        /// <summary>\n        /// Occurs on control click.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnClick(object sender, EventArgs e)\n        {\n            Parent.Focus();\n        }\n    }\n}"
  },
  {
    "path": "tools/PatchXmlCreator/DatafileControl.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "tools/PatchXmlCreator/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage \n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given \n// a specific target and scoped to a namespace, type, member, etc.\n//\n// To add a suppression to this file, right-click the message in the \n// Error List, point to \"Suppress Message(s)\", and click \n// \"In Project Suppression File\".\n// You do not need to add suppressions to this file manually.\n\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.Helper.#ShowMessage(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1300:SpecifyMessageBoxOptions\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#SaveFile()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.DatafileControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.DateTimePicker.set_CustomFormat(System.String)\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.DatafileControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.PatchXmlCreator.Helper.ShowMessage(System.String)\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.Helper.#EnsurePrerequisites()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.Helper.#SelectAction()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.Helper.#ShowMessage(System.String)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.DateTimePicker.set_CustomFormat(System.String)\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.MessageBox.Show(System.String,System.String,System.Windows.Forms.MessageBoxButtons,System.Windows.Forms.MessageBoxIcon)\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#SaveFile()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Windows.Forms.Control.set_Text(System.String)\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#UpdateDatafilesMessage()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"bitbucket\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Datafiles\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.Helper.#SelectAction()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"datafiles\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"eve-datafilename-culture-xml\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.DatafileControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#UpdateDatafilesMessage()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.DatafileControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.Helper.#EnsurePrerequisites()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"evemon\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"gzip\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.DatafileControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"php\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"yyyy\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.DatafileControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"yyyy\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA2210:AssembliesShouldHaveValidStrongNames\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Globalization\", \"CA1303:Do not pass literals as localized parameters\", MessageId = \"EVEMon.Common.Serialization.PatchXml.SerializableDatafile.set_Message(System.String)\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#ExportDatafiles(System.Collections.Generic.ICollection`1<EVEMon.Common.Serialization.PatchXml.SerializableDatafile>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"dd\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.DatafileControl.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"EVEMon\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#ExportDatafiles(System.Collections.Generic.ICollection`1<EVEMon.Common.Serialization.PatchXml.SerializableDatafile>)\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"dd\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#InitializeComponent()\")]\n[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Naming\", \"CA2204:Literals should be spelled correctly\", MessageId = \"Exp\", Scope = \"member\", Target = \"EVEMon.PatchXmlCreator.PatchXmlCreatorWindow.#InitializeComponent()\")]\n"
  },
  {
    "path": "tools/PatchXmlCreator/Helper.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.IO;\nusing System.Text.RegularExpressions;\nusing System.Windows.Forms;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\n\nnamespace EVEMon.PatchXmlCreator\n{\n    internal static class Helper\n    {\n        private static Action s_action;\n        private static MessageBoxCustom s_msgBox;\n\n        private static string s_dataFilesDir;\n        private static string s_patchDir;\n        private static string s_sourceFilesDir;\n        private static string s_solutionDir;\n        private static string s_projectDir;\n        private static string s_outputPath;\n        \n        /// <summary>\n        /// Gets the caption.\n        /// </summary>\n        /// <value>\n        /// The caption.\n        /// </value>\n        internal static string Caption => \"Patch Xml File Creator\";\n\n        /// <summary>\n        /// Gets EVEMon execute filename.\n        /// </summary>\n        /// <value>\n        /// The EVEMon execute filename.\n        /// </value>\n        internal static string EVEMonExecFilename => \"EVEMon.exe\";\n\n        /// <summary>\n        /// Gets the solution directory.\n        /// </summary>\n        /// <returns></returns>\n        private static string GetSolutionDirectory\n        {\n            get\n            {\n                if (string.IsNullOrWhiteSpace(s_solutionDir))\n                {\n                    s_solutionDir = Regex.Match(Directory.GetCurrentDirectory(), @\"[a-zA-Z]+:.*\\\\(?=tools)\",\n                        RegexOptions.Compiled | RegexOptions.IgnoreCase).ToString();\n                }\n                return s_solutionDir;\n            }\n        }\n\n        /// <summary>\n        /// Gets the project directory.\n        /// </summary>\n        /// <returns></returns>\n        private static string GetProjectDirectory\n        {\n            get\n            {\n                if (string.IsNullOrWhiteSpace(s_projectDir))\n                {\n                    s_projectDir = Regex.Match(Directory.GetCurrentDirectory(), @\"[a-zA-Z]+:.*\\\\(?=bin)\",\n                        RegexOptions.Compiled | RegexOptions.IgnoreCase).ToString();\n                }\n                return s_projectDir;\n            }\n        }\n\n        /// <summary>\n        /// Gets the output path.\n        /// </summary>\n        /// <returns></returns>\n        internal static string GetOutputPath\n        {\n            get\n            {\n                if (string.IsNullOrWhiteSpace(s_outputPath))\n                {\n                    s_outputPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase.Remove(0, GetProjectDirectory.Length);\n                }\n                return s_outputPath;\n            }\n        }\n\n        /// <summary>\n        /// Gets the source files directory.\n        /// </summary>\n        /// <returns></returns>\n        internal static string GetSourceFilesDirectory\n        {\n            get\n            {\n                if (string.IsNullOrWhiteSpace(s_sourceFilesDir))\n                {\n                    s_sourceFilesDir = Path.GetFullPath(Path.Combine(GetSolutionDirectory, @\"src\\EVEMon\\\", GetOutputPath));\n                }\n                return s_sourceFilesDir;\n            }\n        }\n\n        /// <summary>\n        /// Gets the source files directory.\n        /// </summary>\n        /// <returns></returns>\n        internal static string GetDataFilesDirectory\n        {\n            get\n            {\n                if (string.IsNullOrWhiteSpace(s_dataFilesDir))\n                {\n                    s_dataFilesDir = Path.GetFullPath(Path.Combine(GetSolutionDirectory, @\"src\\EVEMon.Common\\Resources\"));\n                }\n                return s_dataFilesDir;\n            }\n        }\n\n        /// <summary>\n        /// Gets the patch directory.\n        /// </summary>\n        /// <returns></returns>\n        private static string GetPatchDirectory\n        {\n            get\n            {\n                if (string.IsNullOrWhiteSpace(s_patchDir))\n                {\n                    s_patchDir = Path.GetFullPath(Path.Combine(GetProjectDirectory, @\"Output\"));\n                }\n                return s_patchDir;\n            }\n        }\n\n        /// <summary>\n        /// Gets the patch file path.\n        /// </summary>\n        /// <returns></returns>\n        internal static string GetPatchFilePath => Path.Combine(GetPatchDirectory, EveMonConstants.PatchXmlFilename);\n\n        /// <summary>\n        /// Gets or sets a value indicating whether an application exit is requested.\n        /// </summary>\n        /// <value><c>true</c> if application exit is requested; otherwise, <c>false</c>.</value>\n        internal static bool ExitRequested { get; private set; }\n\n        /// <summary>\n        /// Ensures that the prerequisites to run the application are met.\n        /// </summary>\n        internal static void EnsurePrerequisites()\n        {\n            string text;\n            string eveMonExecFilePath = Path.Combine(GetSourceFilesDirectory, EVEMonExecFilename);\n\n            // Ensure that a release version of EVEMon has been created\n            if (!File.Exists(eveMonExecFilePath))\n            {\n                text = $\"An EVEMon release version has to be created first{Environment.NewLine}before you can use {Caption}.\";\n\n                ShowMessage(text);\n                return;\n            }\n\n            // Ensure that the installer file has been created\n            if (PatchXmlCreatorWindow.GetInstallerPath().Exists)\n                return;\n\n            text = $\"An EVEMon installer file has to be created first{Environment.NewLine}before you can use {Caption}.\";\n\n            ShowMessage(text);\n        }\n\n        /// <summary>\n        /// Shows the message.\n        /// </summary>\n        /// <param name=\"text\">The text.</param>\n        private static void ShowMessage(string text)\n        {\n            MessageBox.Show(text, Caption, MessageBoxButtons.OK, MessageBoxIcon.Stop);\n            ExitRequested = true;\n        }\n\n        /// <summary>\n        /// Selects the action.\n        /// </summary>\n        /// <returns></returns>\n        internal static Action SelectAction()\n        {\n            s_msgBox = new MessageBoxCustom();\n            s_msgBox.Button1.Click += OnButtonClick;\n            s_msgBox.Button2.Click += OnButtonClick;\n            s_msgBox.Button3.Click += OnButtonClick;\n            s_msgBox.Text = $\"{Caption} - Action Selector\";\n            s_msgBox.Message.Text = @\"Select an action for patch file creation.\";\n            s_msgBox.Button1.Text = @\"Datafiles Only\";\n            s_msgBox.Button2.Text = @\"Release Only\";\n            s_msgBox.Button3.Text = @\"Release && Datafiles\";\n            s_msgBox.Button1.AutoSize = true;\n            s_msgBox.Button2.AutoSize = true;\n            s_msgBox.Button3.AutoSize = true;\n            s_msgBox.PictureBox.Image = SystemIcons.Question.ToBitmap();\n            s_msgBox.CheckBox.Visible = false;\n\n            s_msgBox.ShowDialog();\n\n            if (s_action == Action.None)\n                ExitRequested = true;\n\n            return s_action;\n        }\n\n        /// <summary>\n        /// Called when a button is clicked.\n        /// </summary>\n        /// <param name=\"sender\">The sender.</param>\n        /// <param name=\"e\">The <see cref=\"System.EventArgs\"/> instance containing the event data.</param>\n        private static void OnButtonClick(object sender, EventArgs e)\n        {\n            ButtonBase button = sender as Button;\n\n            if (button == null)\n                return;\n\n            s_action = GetAction(button.Text);\n            s_msgBox.Close();\n        }\n\n        /// <summary>\n        /// Returns action based on button text.\n        /// </summary>\n        /// <param name=\"buttonText\">Text on selected button.</param>\n        /// <returns>Corresponding <see cref=\"Action\"/>.</returns>\n        private static Action GetAction(string buttonText)\n        {\n            switch (buttonText)\n            {\n                case \"Release && Datafiles\":\n                    return Action.ReleaseAndDatafiles;\n                case \"Release Only\":\n                    return Action.ReleaseOnly;\n                case \"Datafiles Only\":\n                    return Action.DatafilesOnly;\n                default:\n                    return Action.None;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tools/PatchXmlCreator/Output/patch-old.xml",
    "content": "﻿<?xml version=\"1.0\"?>\n<evemon xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <newest>\n    <date>06 November 2020</date>\n    <version>4.0.19.4983</version>\n    <md5>918ea2a2cbeb51ace24989206a8716fa</md5>\n    <url>https://forums.eveonline.com/t/evemon-4-0-19-beta-under-new-ownership-conversion-for-esi/75953</url>\n    <autopatchurl>https://github.com/peterhaneve/evemon/releases/download/4.0.19/EVEMon-install-4.0.19.exe</autopatchurl>\n    <autopatchargs>/S /AUTORUN /SKIPDOTNET</autopatchargs>\n    <additionalargs>/D=%EVEMON_EXECUTABLE_PATH%</additionalargs>\n    <message><![CDATA[# Release v4.0.19\n\n## New Features\n- Manage Plans window now shows the matching character name in the title bar\n\n## Bug Fixes\n- Auto-Updater now uses the correct URL after GitHub migration of branch names due to the United States Black Lives Matter movement\n- Remove outdated and nonfunctional EVE Gate support\n- Logitech G15 support re-enabled as it apparently is still functional on newer models of keyboards\n\n## Contributors\n- Peter Han\n- NevarrTivianne]]></message>\n  </newest>\n  <releases>\n    <release>\n      <date>06 November 2020</date>\n      <version>4.0.19.4983</version>\n      <md5>918ea2a2cbeb51ace24989206a8716fa</md5>\n      <url>https://forums.eveonline.com/t/evemon-4-0-19-beta-under-new-ownership-conversion-for-esi/75953</url>\n      <autopatchurl>https://github.com/peterhaneve/evemon/releases/download/4.0.19/EVEMon-install-4.0.19.exe</autopatchurl>\n      <autopatchargs>/S /AUTORUN /SKIPDOTNET</autopatchargs>\n      <additionalargs>/D=%EVEMON_EXECUTABLE_PATH%</additionalargs>\n      <message><![CDATA[# Release v4.0.19\n\n## New Features\n- Manage Plans window now shows the matching character name in the title bar\n\n## Bug Fixes\n- Auto-Updater now uses the correct URL after GitHub migration of branch names due to the United States Black Lives Matter movement\n- Remove outdated and nonfunctional EVE Gate support\n- Logitech G15 support re-enabled as it apparently is still functional on newer models of keyboards\n\n## Contributors\n- Peter Han\n- NevarrTivianne]]></message>\n    </release>\n  </releases>\n  <datafiles>\n    <datafile>\n      <name>eve-blueprints-en-US.xml.gzip</name>\n      <date>14 December 2020</date>\n      <md5>3a807bb1d48460c57e10ef7fddcaf619</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Invasion/1850297</url>\n      <message><![CDATA[Invasion 1.12 (1850297) blueprints data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-certificates-en-US.xml.gzip</name>\n      <date>05 June 2018</date>\n      <md5>540000f7c111354769a54fa31e57d411</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Invasion/1850297</url>\n      <message><![CDATA[Invasion 1.12 (1850297) certificates data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-geography-en-US.xml.gzip</name>\n      <date>14 December 2020</date>\n      <md5>3077e700023d84a267b744a6ee44acc7</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Invasion/1850297</url>\n      <message><![CDATA[Invasion 1.12 (1850297) geography data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-items-en-US.xml.gzip</name>\n      <date>14 December 2020</date>\n      <md5>0abab62dde07fbf0bc8eafe0811c9d18</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Invasion/1850297</url>\n      <message><![CDATA[Invasion 1.12 (1850297) items data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-masteries-en-US.xml.gzip</name>\n      <date>05 June 2018</date>\n      <md5>3668b50996fc40a0c0853fec427b5712</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Invasion/1850297</url>\n      <message><![CDATA[Invasion 1.12 (1850297) masteries data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-properties-en-US.xml.gzip</name>\n      <date>14 December 2020</date>\n      <md5>93b8499c86acdad46607c697f221970a</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Invasion/1850297</url>\n      <message><![CDATA[Invasion 1.12 (1850297) properties data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-reprocessing-en-US.xml.gzip</name>\n      <date>14 December 2020</date>\n      <md5>46b56972972a308d90c153770ce46000</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Invasion/1850297</url>\n      <message><![CDATA[Invasion 1.12 (1850297) reprocessing data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-skills-en-US.xml.gzip</name>\n      <date>14 December 2020</date>\n      <md5>84843e1f2e8946cb8f7f7588d2c72562</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Invasion/1850297</url>\n      <message><![CDATA[Invasion 1.12 (1850297) skills data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n  </datafiles>\n</evemon>"
  },
  {
    "path": "tools/PatchXmlCreator/Output/patch.xml",
    "content": "﻿<?xml version=\"1.0\"?>\n<evemon xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <newest>\n    <date>06 November 2020</date>\n    <version>4.0.19.4983</version>\n    <md5>918ea2a2cbeb51ace24989206a8716fa</md5>\n    <url>https://forums.eveonline.com/t/evemon-4-0-19-beta-under-new-ownership-conversion-for-esi/75953</url>\n    <autopatchurl>https://github.com/peterhaneve/evemon/releases/download/4.0.19/EVEMon-install-4.0.19.exe</autopatchurl>\n    <autopatchargs>/S /AUTORUN /SKIPDOTNET</autopatchargs>\n    <additionalargs>/D=%EVEMON_EXECUTABLE_PATH%</additionalargs>\n    <message><![CDATA[# Release v4.0.19\n\n## New Features\n- Manage Plans window now shows the matching character name in the title bar\n\n## Bug Fixes\n- Auto-Updater now uses the correct URL after GitHub migration of branch names due to the United States Black Lives Matter movement\n- Remove outdated and nonfunctional EVE Gate support\n- Logitech G15 support re-enabled as it apparently is still functional on newer models of keyboards\n\n## Contributors\n- Peter Han\n- NevarrTivianne]]></message>\n  </newest>\n  <releases>\n    <release>\n      <date>17 March 2021</date>\n      <version>4.0.20.4986</version>\n      <md5>76f89e810a199ff0a90aef82571ebfaf</md5>\n      <url>https://forums.eveonline.com/t/evemon-4-0-20-beta-under-new-ownership-conversion-for-esi/75953</url>\n      <autopatchurl>https://github.com/peterhaneve/evemon/releases/download/4.0.20/EVEMon-install-4.0.20.exe</autopatchurl>\n      <autopatchargs>/S /AUTORUN /SKIPDOTNET</autopatchargs>\n      <additionalargs>/D=%EVEMON_EXECUTABLE_PATH%</additionalargs>\n      <message><![CDATA[# Release v4.0.20\n\n## New Features\n- Skill injector requirements in the Skill Planner now include an estimate of the cost in the tooltip text\n\n## Bug Fixes\n- Manual workaround for missing skill information on new Fleet skills from SDE\n- Fix a potential race condition in asset lookup\n- Greatly improve speed of asset price lookups, and add Fuzzworks Market as an available provider\n\n## Contributors\n- Peter Han\n- NevarrTivianne]]></message>\n    </release>\n  </releases>\n  <datafiles>\n    <datafile>\n      <name>eve-blueprints-en-US.xml.gzip</name>\n      <date>17 March 2021</date>\n      <md5>df91ac86ac9954dfaff13ab77681a1cc</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) blueprints data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-certificates-en-US.xml.gzip</name>\n      <date>05 June 2018</date>\n      <md5>540000f7c111354769a54fa31e57d411</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) certificates data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-geography-en-US.xml.gzip</name>\n      <date>17 March 2021</date>\n      <md5>3077e700023d84a267b744a6ee44acc7</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) geography data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-items-en-US.xml.gzip</name>\n      <date>17 March 2021</date>\n      <md5>4c9cb667e22421fad8ca08777be7fd8a</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) items data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-masteries-en-US.xml.gzip</name>\n      <date>05 June 2018</date>\n      <md5>3668b50996fc40a0c0853fec427b5712</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) masteries data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-properties-en-US.xml.gzip</name>\n      <date>17 March 2021</date>\n      <md5>1f6ae9f613fd26b08d5ec206d0958d79</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) properties data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-reprocessing-en-US.xml.gzip</name>\n      <date>17 March 2021</date>\n      <md5>adb83f4fc55f61a58548dcb924a91cfe</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) reprocessing data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-skills-en-US.xml.gzip</name>\n      <date>17 March 2021</date>\n      <md5>727a781211b138cf331afed346692962</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) skills data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n  </datafiles>\n</evemon>"
  },
  {
    "path": "tools/PatchXmlCreator/PatchXmlCreator.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{E6907BAD-CDF4-4B3C-AF2E-E854D2E2D959}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>EVEMon.PatchXmlCreator</RootNamespace>\n    <AssemblyName>EVEMonPatchXmlCreator</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\n    <DebugType>full</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\">\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Action.cs\" />\n    <Compile Include=\"DatafileControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"DatafileControl.Designer.cs\">\n      <DependentUpon>DatafileControl.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"GlobalSuppressions.cs\" />\n    <Compile Include=\"Helper.cs\" />\n    <Compile Include=\"PatchXmlCreatorWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"PatchXmlCreatorWindow.Designer.cs\">\n      <DependentUpon>PatchXmlCreatorWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <EmbeddedResource Include=\"DatafileControl.resx\">\n      <DependentUpon>DatafileControl.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"PatchXmlCreatorWindow.resx\">\n      <DependentUpon>PatchXmlCreatorWindow.cs</DependentUpon>\n    </EmbeddedResource>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\EVEMon.Common\\EVEMon.Common.csproj\">\n      <Project>{C0665275-3E0B-4117-81B0-751206ED03CD}</Project>\n      <Name>EVEMon.Common</Name>\n      <Private>True</Private>\n      <Properties>SkipValidatePackageReferences=true</Properties>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"app.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PostBuildEvent>rd /s /q \"$(TargetDir)\"Resources\ndel \"$(TargetDir)\"Google*\ndel \"$(TargetDir)\"*office*\ndel \"$(TargetDir)\"*outlook*\ndel \"$(TargetDir)\"*SharpZipLib*\ndel \"$(TargetDir)\"YamlDotNet*\ndel \"$(TargetDir)\"Dropbox*\ndel \"$(TargetDir)\"OneDrive*\ndel \"$(TargetDir)\"Microsoft*\ndel \"$(TargetDir)\"Newtonsoft*\ndel \"$(TargetDir)\"Zlib*\nif exist \"$(TargetDir)\"stdole.dll del \"$(TargetDir)\"stdole.dll</PostBuildEvent>\n  </PropertyGroup>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "tools/PatchXmlCreator/PatchXmlCreatorWindow.Designer.cs",
    "content": "namespace EVEMon.PatchXmlCreator\n{\n    partial class PatchXmlCreatorWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.btnCancel = new System.Windows.Forms.Button();\n            this.btnCreate = new System.Windows.Forms.Button();\n            this.lblEVEMonReleaseDate = new System.Windows.Forms.Label();\n            this.lblVersion = new System.Windows.Forms.Label();\n            this.dtpRelease = new System.Windows.Forms.DateTimePicker();\n            this.lblEVEMonVersion = new System.Windows.Forms.Label();\n            this.gbRelease = new System.Windows.Forms.GroupBox();\n            this.btnInstallerClear = new System.Windows.Forms.Button();\n            this.btnLoadReleaseInfo = new System.Windows.Forms.Button();\n            this.lblMessage = new System.Windows.Forms.Label();\n            this.rtbReleaseMessage = new System.Windows.Forms.RichTextBox();\n            this.rtbReleaseUrl = new System.Windows.Forms.RichTextBox();\n            this.lblInstallerUrl = new System.Windows.Forms.Label();\n            this.rtbTopicUrl = new System.Windows.Forms.RichTextBox();\n            this.lblForumUrl = new System.Windows.Forms.Label();\n            this.lblMD5Sum = new System.Windows.Forms.Label();\n            this.btPaste = new System.Windows.Forms.Button();\n            this.gbDatafiles = new System.Windows.Forms.GroupBox();\n            this.lblExpVersion = new System.Windows.Forms.Label();\n            this.tbExpVersion = new System.Windows.Forms.TextBox();\n            this.btnDatafilesClear = new System.Windows.Forms.Button();\n            this.datafileControl = new EVEMon.PatchXmlCreator.DatafileControl();\n            this.btnLoadDatafileInfo = new System.Windows.Forms.Button();\n            this.lblRevision = new System.Windows.Forms.Label();\n            this.tbExpRevision = new System.Windows.Forms.TextBox();\n            this.lblExpansion = new System.Windows.Forms.Label();\n            this.rtbDatafileUrl = new System.Windows.Forms.RichTextBox();\n            this.tbExpansion = new System.Windows.Forms.TextBox();\n            this.lblUrl = new System.Windows.Forms.Label();\n            this.pnlButtons = new System.Windows.Forms.Panel();\n            this.splitContainer = new System.Windows.Forms.SplitContainer();\n            this.gbRelease.SuspendLayout();\n            this.gbDatafiles.SuspendLayout();\n            this.pnlButtons.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();\n            this.splitContainer.Panel1.SuspendLayout();\n            this.splitContainer.Panel2.SuspendLayout();\n            this.splitContainer.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // btnCancel\n            // \n            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCancel.AutoSize = true;\n            this.btnCancel.Location = new System.Drawing.Point(783, 18);\n            this.btnCancel.Name = \"btnCancel\";\n            this.btnCancel.Size = new System.Drawing.Size(75, 23);\n            this.btnCancel.TabIndex = 0;\n            this.btnCancel.Text = \"Cancel\";\n            this.btnCancel.UseVisualStyleBackColor = true;\n            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\n            // \n            // btnCreate\n            // \n            this.btnCreate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnCreate.AutoSize = true;\n            this.btnCreate.Enabled = false;\n            this.btnCreate.Location = new System.Drawing.Point(702, 18);\n            this.btnCreate.Name = \"btnCreate\";\n            this.btnCreate.Size = new System.Drawing.Size(75, 23);\n            this.btnCreate.TabIndex = 1;\n            this.btnCreate.Text = \"Create\";\n            this.btnCreate.UseVisualStyleBackColor = true;\n            this.btnCreate.Click += new System.EventHandler(this.btnCreate_Click);\n            // \n            // lblEVEMonReleaseDate\n            // \n            this.lblEVEMonReleaseDate.AutoSize = true;\n            this.lblEVEMonReleaseDate.Location = new System.Drawing.Point(5, 20);\n            this.lblEVEMonReleaseDate.Name = \"lblEVEMonReleaseDate\";\n            this.lblEVEMonReleaseDate.Size = new System.Drawing.Size(78, 13);\n            this.lblEVEMonReleaseDate.TabIndex = 2;\n            this.lblEVEMonReleaseDate.Text = \"Release Date :\";\n            this.lblEVEMonReleaseDate.Click += new System.EventHandler(this.OnClick);\n            // \n            // lblVersion\n            // \n            this.lblVersion.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblVersion.AutoSize = true;\n            this.lblVersion.Location = new System.Drawing.Point(258, 20);\n            this.lblVersion.Name = \"lblVersion\";\n            this.lblVersion.Size = new System.Drawing.Size(48, 13);\n            this.lblVersion.TabIndex = 3;\n            this.lblVersion.Text = \"Version :\";\n            this.lblVersion.Click += new System.EventHandler(this.OnClick);\n            // \n            // dtpRelease\n            // \n            this.dtpRelease.CustomFormat = \" dd MMMM yyyy\";\n            this.dtpRelease.Format = System.Windows.Forms.DateTimePickerFormat.Custom;\n            this.dtpRelease.Location = new System.Drawing.Point(86, 16);\n            this.dtpRelease.Name = \"dtpRelease\";\n            this.dtpRelease.Size = new System.Drawing.Size(166, 20);\n            this.dtpRelease.TabIndex = 4;\n            this.dtpRelease.Value = new System.DateTime(2010, 1, 1, 0, 0, 0, 0);\n            this.dtpRelease.MouseCaptureChanged += new System.EventHandler(this.OnClick);\n            // \n            // lblEVEMonVersion\n            // \n            this.lblEVEMonVersion.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\n            this.lblEVEMonVersion.BackColor = System.Drawing.SystemColors.ControlLight;\n            this.lblEVEMonVersion.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;\n            this.lblEVEMonVersion.Cursor = System.Windows.Forms.Cursors.Default;\n            this.lblEVEMonVersion.Location = new System.Drawing.Point(313, 16);\n            this.lblEVEMonVersion.Name = \"lblEVEMonVersion\";\n            this.lblEVEMonVersion.Size = new System.Drawing.Size(76, 21);\n            this.lblEVEMonVersion.TabIndex = 5;\n            this.lblEVEMonVersion.Text = \"1.0.0.0\";\n            this.lblEVEMonVersion.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n            // \n            // gbRelease\n            // \n            this.gbRelease.Controls.Add(this.btnInstallerClear);\n            this.gbRelease.Controls.Add(this.btnLoadReleaseInfo);\n            this.gbRelease.Controls.Add(this.lblMessage);\n            this.gbRelease.Controls.Add(this.rtbReleaseMessage);\n            this.gbRelease.Controls.Add(this.rtbReleaseUrl);\n            this.gbRelease.Controls.Add(this.lblInstallerUrl);\n            this.gbRelease.Controls.Add(this.rtbTopicUrl);\n            this.gbRelease.Controls.Add(this.lblForumUrl);\n            this.gbRelease.Controls.Add(this.lblEVEMonReleaseDate);\n            this.gbRelease.Controls.Add(this.lblEVEMonVersion);\n            this.gbRelease.Controls.Add(this.lblVersion);\n            this.gbRelease.Controls.Add(this.dtpRelease);\n            this.gbRelease.Controls.Add(this.lblMD5Sum);\n            this.gbRelease.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbRelease.Location = new System.Drawing.Point(10, 10);\n            this.gbRelease.Name = \"gbRelease\";\n            this.gbRelease.Size = new System.Drawing.Size(396, 211);\n            this.gbRelease.TabIndex = 6;\n            this.gbRelease.TabStop = false;\n            this.gbRelease.Text = \"Release Info\";\n            this.gbRelease.MouseCaptureChanged += new System.EventHandler(this.OnClick);\n            // \n            // btnInstallerClear\n            // \n            this.btnInstallerClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.btnInstallerClear.Location = new System.Drawing.Point(7, 182);\n            this.btnInstallerClear.Name = \"btnInstallerClear\";\n            this.btnInstallerClear.Size = new System.Drawing.Size(75, 23);\n            this.btnInstallerClear.TabIndex = 2;\n            this.btnInstallerClear.Text = \"Clear All\";\n            this.btnInstallerClear.UseVisualStyleBackColor = true;\n            this.btnInstallerClear.Click += new System.EventHandler(this.btnReleaseClear_Click);\n            // \n            // btnLoadReleaseInfo\n            // \n            this.btnLoadReleaseInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnLoadReleaseInfo.AutoSize = true;\n            this.btnLoadReleaseInfo.Location = new System.Drawing.Point(232, 183);\n            this.btnLoadReleaseInfo.Name = \"btnLoadReleaseInfo\";\n            this.btnLoadReleaseInfo.Size = new System.Drawing.Size(158, 23);\n            this.btnLoadReleaseInfo.TabIndex = 3;\n            this.btnLoadReleaseInfo.Text = \"Load info from existing patch\";\n            this.btnLoadReleaseInfo.UseVisualStyleBackColor = true;\n            this.btnLoadReleaseInfo.Click += new System.EventHandler(this.btnLoadReleaseInfo_Click);\n            // \n            // lblMessage\n            // \n            this.lblMessage.AutoSize = true;\n            this.lblMessage.Location = new System.Drawing.Point(5, 100);\n            this.lblMessage.Name = \"lblMessage\";\n            this.lblMessage.Size = new System.Drawing.Size(56, 13);\n            this.lblMessage.TabIndex = 12;\n            this.lblMessage.Text = \"Message :\";\n            this.lblMessage.Click += new System.EventHandler(this.OnClick);\n            // \n            // rtbReleaseMessage\n            // \n            this.rtbReleaseMessage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.rtbReleaseMessage.DetectUrls = false;\n            this.rtbReleaseMessage.Location = new System.Drawing.Point(7, 116);\n            this.rtbReleaseMessage.Name = \"rtbReleaseMessage\";\n            this.rtbReleaseMessage.Size = new System.Drawing.Size(383, 47);\n            this.rtbReleaseMessage.TabIndex = 11;\n            this.rtbReleaseMessage.Text = \"Type your message here.\";\n            this.rtbReleaseMessage.DoubleClick += new System.EventHandler(this.Control_DoubleClick);\n            this.rtbReleaseMessage.Enter += new System.EventHandler(this.Control_Enter);\n            this.rtbReleaseMessage.Leave += new System.EventHandler(this.Control_Leave);\n            // \n            // rtbReleaseUrl\n            // \n            this.rtbReleaseUrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.rtbReleaseUrl.DetectUrls = false;\n            this.rtbReleaseUrl.Location = new System.Drawing.Point(37, 63);\n            this.rtbReleaseUrl.Multiline = false;\n            this.rtbReleaseUrl.Name = \"rtbReleaseUrl\";\n            this.rtbReleaseUrl.Size = new System.Drawing.Size(352, 21);\n            this.rtbReleaseUrl.TabIndex = 10;\n            this.rtbReleaseUrl.Text = \"\";\n            this.rtbReleaseUrl.DoubleClick += new System.EventHandler(this.Control_DoubleClick);\n            this.rtbReleaseUrl.Enter += new System.EventHandler(this.Control_Enter);\n            this.rtbReleaseUrl.Leave += new System.EventHandler(this.Control_Leave);\n            // \n            // lblInstallerUrl\n            // \n            this.lblInstallerUrl.AutoSize = true;\n            this.lblInstallerUrl.Location = new System.Drawing.Point(5, 66);\n            this.lblInstallerUrl.Name = \"lblInstallerUrl\";\n            this.lblInstallerUrl.Size = new System.Drawing.Size(26, 13);\n            this.lblInstallerUrl.TabIndex = 9;\n            this.lblInstallerUrl.Text = \"Url :\";\n            this.lblInstallerUrl.Click += new System.EventHandler(this.OnClick);\n            // \n            // rtbTopicUrl\n            // \n            this.rtbTopicUrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.rtbTopicUrl.DetectUrls = false;\n            this.rtbTopicUrl.Location = new System.Drawing.Point(65, 40);\n            this.rtbTopicUrl.Multiline = false;\n            this.rtbTopicUrl.Name = \"rtbTopicUrl\";\n            this.rtbTopicUrl.Size = new System.Drawing.Size(324, 21);\n            this.rtbTopicUrl.TabIndex = 7;\n            this.rtbTopicUrl.Text = \"\";\n            this.rtbTopicUrl.DoubleClick += new System.EventHandler(this.Control_DoubleClick);\n            this.rtbTopicUrl.Enter += new System.EventHandler(this.Control_Enter);\n            this.rtbTopicUrl.Leave += new System.EventHandler(this.Control_Leave);\n            // \n            // lblForumUrl\n            // \n            this.lblForumUrl.AutoSize = true;\n            this.lblForumUrl.Location = new System.Drawing.Point(5, 44);\n            this.lblForumUrl.Name = \"lblForumUrl\";\n            this.lblForumUrl.Size = new System.Drawing.Size(56, 13);\n            this.lblForumUrl.TabIndex = 6;\n            this.lblForumUrl.Text = \"Topic Url :\";\n            this.lblForumUrl.Click += new System.EventHandler(this.OnClick);\n            // \n            // lblMD5Sum\n            // \n            this.lblMD5Sum.AutoSize = true;\n            this.lblMD5Sum.Dock = System.Windows.Forms.DockStyle.Right;\n            this.lblMD5Sum.Location = new System.Drawing.Point(339, 16);\n            this.lblMD5Sum.Name = \"lblMD5Sum\";\n            this.lblMD5Sum.Padding = new System.Windows.Forms.Padding(0, 70, 0, 0);\n            this.lblMD5Sum.Size = new System.Drawing.Size(54, 83);\n            this.lblMD5Sum.TabIndex = 13;\n            this.lblMD5Sum.Text = \"MD5 Sum\";\n            this.lblMD5Sum.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            // \n            // btPaste\n            // \n            this.btPaste.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.btPaste.AutoSize = true;\n            this.btPaste.Location = new System.Drawing.Point(12, 18);\n            this.btPaste.Name = \"btPaste\";\n            this.btPaste.Size = new System.Drawing.Size(117, 23);\n            this.btPaste.TabIndex = 2;\n            this.btPaste.Text = \"Paste from Clipboard\";\n            this.btPaste.UseVisualStyleBackColor = true;\n            this.btPaste.Click += new System.EventHandler(this.btPaste_Click);\n            // \n            // gbDatafiles\n            // \n            this.gbDatafiles.Controls.Add(this.lblExpVersion);\n            this.gbDatafiles.Controls.Add(this.tbExpVersion);\n            this.gbDatafiles.Controls.Add(this.btnDatafilesClear);\n            this.gbDatafiles.Controls.Add(this.datafileControl);\n            this.gbDatafiles.Controls.Add(this.btnLoadDatafileInfo);\n            this.gbDatafiles.Controls.Add(this.lblRevision);\n            this.gbDatafiles.Controls.Add(this.tbExpRevision);\n            this.gbDatafiles.Controls.Add(this.lblExpansion);\n            this.gbDatafiles.Controls.Add(this.rtbDatafileUrl);\n            this.gbDatafiles.Controls.Add(this.tbExpansion);\n            this.gbDatafiles.Controls.Add(this.lblUrl);\n            this.gbDatafiles.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.gbDatafiles.Location = new System.Drawing.Point(5, 10);\n            this.gbDatafiles.Name = \"gbDatafiles\";\n            this.gbDatafiles.Size = new System.Drawing.Size(440, 211);\n            this.gbDatafiles.TabIndex = 7;\n            this.gbDatafiles.TabStop = false;\n            this.gbDatafiles.Text = \"Data Files Info\";\n            this.gbDatafiles.GotFocus += new System.EventHandler(this.OnClick);\n            this.gbDatafiles.MouseCaptureChanged += new System.EventHandler(this.OnClick);\n            // \n            // lblExpVersion\n            // \n            this.lblExpVersion.AutoSize = true;\n            this.lblExpVersion.Location = new System.Drawing.Point(180, 43);\n            this.lblExpVersion.Name = \"lblExpVersion\";\n            this.lblExpVersion.Size = new System.Drawing.Size(48, 13);\n            this.lblExpVersion.TabIndex = 22;\n            this.lblExpVersion.Text = \"Version :\";\n            // \n            // tbExpVersion\n            // \n            this.tbExpVersion.Location = new System.Drawing.Point(229, 40);\n            this.tbExpVersion.Name = \"tbExpVersion\";\n            this.tbExpVersion.Size = new System.Drawing.Size(49, 20);\n            this.tbExpVersion.TabIndex = 19;\n            this.tbExpVersion.Text = \"Version\";\n            this.tbExpVersion.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\n            this.tbExpVersion.DoubleClick += new System.EventHandler(this.Control_DoubleClick);\n            this.tbExpVersion.Enter += new System.EventHandler(this.Control_Enter);\n            this.tbExpVersion.Leave += new System.EventHandler(this.Control_Leave);\n            // \n            // btnDatafilesClear\n            // \n            this.btnDatafilesClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\n            this.btnDatafilesClear.Location = new System.Drawing.Point(9, 182);\n            this.btnDatafilesClear.Name = \"btnDatafilesClear\";\n            this.btnDatafilesClear.Size = new System.Drawing.Size(75, 23);\n            this.btnDatafilesClear.TabIndex = 1;\n            this.btnDatafilesClear.Text = \"Clear All\";\n            this.btnDatafilesClear.UseVisualStyleBackColor = true;\n            this.btnDatafilesClear.Click += new System.EventHandler(this.btnDatafilesClear_Click);\n            // \n            // datafileControl\n            // \n            this.datafileControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.datafileControl.AutoSize = true;\n            this.datafileControl.Location = new System.Drawing.Point(9, 65);\n            this.datafileControl.Name = \"datafileControl\";\n            this.datafileControl.Size = new System.Drawing.Size(427, 91);\n            this.datafileControl.TabIndex = 21;\n            // \n            // btnLoadDatafileInfo\n            // \n            this.btnLoadDatafileInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n            this.btnLoadDatafileInfo.AutoSize = true;\n            this.btnLoadDatafileInfo.Location = new System.Drawing.Point(278, 183);\n            this.btnLoadDatafileInfo.Name = \"btnLoadDatafileInfo\";\n            this.btnLoadDatafileInfo.Size = new System.Drawing.Size(158, 23);\n            this.btnLoadDatafileInfo.TabIndex = 2;\n            this.btnLoadDatafileInfo.Text = \"Load info from existing patch\";\n            this.btnLoadDatafileInfo.UseVisualStyleBackColor = true;\n            this.btnLoadDatafileInfo.Click += new System.EventHandler(this.btnLoadDatafileInfo_Click);\n            // \n            // lblRevision\n            // \n            this.lblRevision.AutoSize = true;\n            this.lblRevision.Location = new System.Drawing.Point(292, 43);\n            this.lblRevision.Name = \"lblRevision\";\n            this.lblRevision.Size = new System.Drawing.Size(54, 13);\n            this.lblRevision.TabIndex = 19;\n            this.lblRevision.Text = \"Revision :\";\n            this.lblRevision.Click += new System.EventHandler(this.OnClick);\n            // \n            // tbExpRevision\n            // \n            this.tbExpRevision.Location = new System.Drawing.Point(346, 40);\n            this.tbExpRevision.Name = \"tbExpRevision\";\n            this.tbExpRevision.Size = new System.Drawing.Size(78, 20);\n            this.tbExpRevision.TabIndex = 20;\n            this.tbExpRevision.Text = \"Exp. Revision\";\n            this.tbExpRevision.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\n            this.tbExpRevision.DoubleClick += new System.EventHandler(this.Control_DoubleClick);\n            this.tbExpRevision.Enter += new System.EventHandler(this.Control_Enter);\n            this.tbExpRevision.Leave += new System.EventHandler(this.Control_Leave);\n            // \n            // lblExpansion\n            // \n            this.lblExpansion.AutoSize = true;\n            this.lblExpansion.Location = new System.Drawing.Point(12, 43);\n            this.lblExpansion.Name = \"lblExpansion\";\n            this.lblExpansion.Size = new System.Drawing.Size(62, 13);\n            this.lblExpansion.TabIndex = 17;\n            this.lblExpansion.Text = \"Expansion :\";\n            this.lblExpansion.Click += new System.EventHandler(this.OnClick);\n            // \n            // rtbDatafileUrl\n            // \n            this.rtbDatafileUrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.rtbDatafileUrl.DetectUrls = false;\n            this.rtbDatafileUrl.Location = new System.Drawing.Point(46, 16);\n            this.rtbDatafileUrl.Multiline = false;\n            this.rtbDatafileUrl.Name = \"rtbDatafileUrl\";\n            this.rtbDatafileUrl.Size = new System.Drawing.Size(390, 21);\n            this.rtbDatafileUrl.TabIndex = 15;\n            this.rtbDatafileUrl.Text = \"\";\n            this.rtbDatafileUrl.DoubleClick += new System.EventHandler(this.Control_DoubleClick);\n            this.rtbDatafileUrl.Enter += new System.EventHandler(this.Control_Enter);\n            this.rtbDatafileUrl.Leave += new System.EventHandler(this.Control_Leave);\n            // \n            // tbExpansion\n            // \n            this.tbExpansion.Location = new System.Drawing.Point(75, 40);\n            this.tbExpansion.Name = \"tbExpansion\";\n            this.tbExpansion.Size = new System.Drawing.Size(91, 20);\n            this.tbExpansion.TabIndex = 18;\n            this.tbExpansion.Text = \"Expansion Name\";\n            this.tbExpansion.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\n            this.tbExpansion.DoubleClick += new System.EventHandler(this.Control_DoubleClick);\n            this.tbExpansion.Enter += new System.EventHandler(this.Control_Enter);\n            this.tbExpansion.Leave += new System.EventHandler(this.Control_Leave);\n            // \n            // lblUrl\n            // \n            this.lblUrl.AutoSize = true;\n            this.lblUrl.Location = new System.Drawing.Point(13, 19);\n            this.lblUrl.Name = \"lblUrl\";\n            this.lblUrl.Size = new System.Drawing.Size(26, 13);\n            this.lblUrl.TabIndex = 14;\n            this.lblUrl.Text = \"Url :\";\n            this.lblUrl.Click += new System.EventHandler(this.OnClick);\n            // \n            // pnlButtons\n            // \n            this.pnlButtons.BackColor = System.Drawing.SystemColors.ControlLight;\n            this.pnlButtons.Controls.Add(this.btPaste);\n            this.pnlButtons.Controls.Add(this.btnCancel);\n            this.pnlButtons.Controls.Add(this.btnCreate);\n            this.pnlButtons.Dock = System.Windows.Forms.DockStyle.Bottom;\n            this.pnlButtons.Location = new System.Drawing.Point(0, 231);\n            this.pnlButtons.Name = \"pnlButtons\";\n            this.pnlButtons.Size = new System.Drawing.Size(870, 59);\n            this.pnlButtons.TabIndex = 9;\n            this.pnlButtons.Click += new System.EventHandler(this.OnClick);\n            // \n            // splitContainer\n            // \n            this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.splitContainer.Location = new System.Drawing.Point(0, 0);\n            this.splitContainer.Name = \"splitContainer\";\n            // \n            // splitContainer.Panel1\n            // \n            this.splitContainer.Panel1.Controls.Add(this.gbRelease);\n            this.splitContainer.Panel1.Padding = new System.Windows.Forms.Padding(10, 10, 5, 10);\n            this.splitContainer.Panel1.Click += new System.EventHandler(this.OnClick);\n            this.splitContainer.Panel1MinSize = 411;\n            // \n            // splitContainer.Panel2\n            // \n            this.splitContainer.Panel2.Controls.Add(this.gbDatafiles);\n            this.splitContainer.Panel2.Padding = new System.Windows.Forms.Padding(5, 10, 10, 10);\n            this.splitContainer.Panel2.Click += new System.EventHandler(this.OnClick);\n            this.splitContainer.Panel2MinSize = 455;\n            this.splitContainer.Size = new System.Drawing.Size(870, 231);\n            this.splitContainer.SplitterDistance = 411;\n            this.splitContainer.TabIndex = 10;\n            this.splitContainer.Click += new System.EventHandler(this.OnClick);\n            // \n            // PatchXmlCreatorWindow\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(870, 290);\n            this.Controls.Add(this.splitContainer);\n            this.Controls.Add(this.pnlButtons);\n            this.Name = \"PatchXmlCreatorWindow\";\n            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\n            this.Text = \"Patch Xml File Creator\";\n            this.gbRelease.ResumeLayout(false);\n            this.gbRelease.PerformLayout();\n            this.gbDatafiles.ResumeLayout(false);\n            this.gbDatafiles.PerformLayout();\n            this.pnlButtons.ResumeLayout(false);\n            this.pnlButtons.PerformLayout();\n            this.splitContainer.Panel1.ResumeLayout(false);\n            this.splitContainer.Panel2.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();\n            this.splitContainer.ResumeLayout(false);\n            this.ResumeLayout(false);\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Panel pnlButtons;\n        private System.Windows.Forms.Button btnCancel;\n        private System.Windows.Forms.Button btnCreate;\n        private System.Windows.Forms.Button btPaste;\n        private System.Windows.Forms.Button btnLoadReleaseInfo;\n        private System.Windows.Forms.Button btnLoadDatafileInfo;\n        private System.Windows.Forms.Label lblEVEMonReleaseDate;\n        private System.Windows.Forms.Label lblVersion;\n        private System.Windows.Forms.Label lblEVEMonVersion;\n        private System.Windows.Forms.Label lblForumUrl;\n        private System.Windows.Forms.Label lblInstallerUrl;\n        private System.Windows.Forms.Label lblMessage;\n        private System.Windows.Forms.Label lblUrl;\n        private System.Windows.Forms.Label lblExpansion;\n        private System.Windows.Forms.Label lblRevision;\n        private System.Windows.Forms.DateTimePicker dtpRelease;\n        private System.Windows.Forms.GroupBox gbRelease;\n        private System.Windows.Forms.GroupBox gbDatafiles;\n        private System.Windows.Forms.RichTextBox rtbDatafileUrl;\n        private System.Windows.Forms.TextBox tbExpansion;\n        private System.Windows.Forms.TextBox tbExpRevision;\n        private System.Windows.Forms.RichTextBox rtbTopicUrl;\n        private System.Windows.Forms.RichTextBox rtbReleaseUrl;\n        private System.Windows.Forms.RichTextBox rtbReleaseMessage;\n        private DatafileControl datafileControl;\n        private System.Windows.Forms.SplitContainer splitContainer;\n        private System.Windows.Forms.Button btnInstallerClear;\n        private System.Windows.Forms.Button btnDatafilesClear;\n        private System.Windows.Forms.Label lblExpVersion;\n        private System.Windows.Forms.TextBox tbExpVersion;\n        private System.Windows.Forms.Label lblMD5Sum;\n    }\n}\n"
  },
  {
    "path": "tools/PatchXmlCreator/PatchXmlCreatorWindow.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing System.Xml;\nusing EVEMon.Common;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Controls;\nusing EVEMon.Common.Data;\nusing EVEMon.Common.Factories;\nusing EVEMon.Common.Helpers;\nusing EVEMon.Common.Serialization.PatchXml;\nusing System.Net;\n\nnamespace EVEMon.PatchXmlCreator\n{\n    internal partial class PatchXmlCreatorWindow : EVEMonForm\n    {\n        #region Fields\n\n        private const string CompatibilityMessage = \"\\nNOT COMPATIBLE with EVEMon prior to version 2.2.0\";\n        private const string InstallerFilename = \"EVEMon-install-{0}.exe\";\n        private const string DateTimeFormat = \"dd MMMM yyyy\";\n        private const string DatafilesMessageFormat = \"{0} {1} ({2}) {3} data file by the EVEMon Development Team\";\n        private const string DatafileHeader = \"eve-\";\n        private const string InstallerArgs = \"/S /AUTORUN /SKIPDOTNET\";\n        private const string AdditionalArgs = \"/D=%EVEMON_EXECUTABLE_PATH%\";\n\n        private static readonly Dictionary<Control, string> s_listOfInitMessages = new Dictionary<Control, string>();\n        private static readonly List<Datafile> s_datafiles = new List<Datafile>();\n        private static readonly CultureInfo s_enUsCulture = new CultureInfo(\"en-US\");\n\n        private static FileVersionInfo s_fileVersionInfo;\n\n        private readonly Action m_action;\n\n        private Control m_activeTextBox;\n        private string m_text;\n        private bool m_init;\n\n        #endregion\n\n\n        #region Constructor\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        private PatchXmlCreatorWindow()\n        {\n            InitializeComponent();\n\n            lblEVEMonReleaseDate.Font = FontFactory.GetFont(\"Tahoma\");\n            lblVersion.Font = FontFactory.GetFont(\"Tahoma\");\n            dtpRelease.Font = FontFactory.GetFont(\"Tahoma\");\n            lblEVEMonVersion.Font = FontFactory.GetFont(\"Tahoma\");\n            gbRelease.Font = FontFactory.GetFont(\"Tahoma\", 8.25F, FontStyle.Bold);\n            lblMD5Sum.Font = FontFactory.GetFont(\"Tahoma\");\n            btnInstallerClear.Font = FontFactory.GetFont(\"Tahoma\");\n            btnLoadReleaseInfo.Font = FontFactory.GetFont(\"Tahoma\");\n            lblMessage.Font = FontFactory.GetFont(\"Tahoma\");\n            rtbReleaseMessage.Font = FontFactory.GetFont(\"Tahoma\");\n            rtbReleaseUrl.Font = FontFactory.GetFont(\"Tahoma\");\n            lblInstallerUrl.Font = FontFactory.GetFont(\"Tahoma\");\n            rtbTopicUrl.Font = FontFactory.GetFont(\"Tahoma\");\n            lblForumUrl.Font = FontFactory.GetFont(\"Tahoma\");\n            gbDatafiles.Font = FontFactory.GetFont(\"Tahoma\", FontStyle.Bold);\n            lblExpVersion.Font = FontFactory.GetFont(\"Tahoma\");\n            tbExpVersion.Font = FontFactory.GetFont(\"Tahoma\");\n            btnDatafilesClear.Font = FontFactory.GetFont(\"Tahoma\");\n            btnLoadDatafileInfo.Font = FontFactory.GetFont(\"Tahoma\");\n            lblRevision.Font = FontFactory.GetFont(\"Tahoma\");\n            tbExpRevision.Font = FontFactory.GetFont(\"Tahoma\");\n            lblExpansion.Font = FontFactory.GetFont(\"Tahoma\");\n            rtbDatafileUrl.Font = FontFactory.GetFont(\"Tahoma\");\n            tbExpansion.Font = FontFactory.GetFont(\"Tahoma\");\n            lblUrl.Font = FontFactory.GetFont(\"Tahoma\");\n            datafileControl.Font = FontFactory.GetFont(\"Tahoma\");\n\n            rtbReleaseUrl.Text = NetworkConstants.GitHubDownloadsBase;\n            rtbDatafileUrl.Text = NetworkConstants.BitBucketDatafilesBase;\n            rtbTopicUrl.Text = NetworkConstants.ForumThreadBase;\n        }\n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public PatchXmlCreatorWindow(Action action)\n            : this()\n        {\n            m_action = action;\n        }\n\n        #endregion\n\n\n        #region Events\n\n        /// <summary>\n        /// On load we create the window and update the controls.\n        /// </summary>\n        /// <param name=\"e\"></param>\n        protected override void OnLoad(EventArgs e)\n        {\n            base.OnLoad(e);\n\n            InitDatafiles();\n            CustomLayout();\n            StoreInitMessage();\n            UpdateReleaseInfo();\n            UpdateDatafilesControls();\n            UpdateCreateButtonEnabled();\n\n            MinimumSize = new Size(Width, Height);\n\n            m_init = true;\n        }\n\n        /// <summary>\n        /// Occurs when the user clicks on the form.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnClick(object sender, EventArgs e)\n        {\n            ((Control)sender).Focus();\n            btnCreate.Focus();\n        }\n\n        #endregion\n\n\n        #region Methods\n\n        /// <summary>\n        /// Get EVEMon's assembly version.\n        /// </summary>\n        /// <returns></returns>\n        private static FileVersionInfo GetAssemblyVersion()\n        {\n            if (s_fileVersionInfo != null)\n                return s_fileVersionInfo;\n\n            string path = Path.Combine(Helper.GetSourceFilesDirectory, Helper.EVEMonExecFilename);\n            return s_fileVersionInfo = FileVersionInfo.GetVersionInfo(path);\n        }\n\n        /// <summary>\n        /// Updates the info in the release section.\n        /// </summary>\n        private void UpdateReleaseInfo()\n        {\n            if (m_action == Action.DatafilesOnly)\n            {\n                LoadReleaseInfoFromFile();\n                return;\n            }\n\n            FileInfo installerFileInfo = GetInstallerPath();\n\n            // Assign info\n            var version = GetAssemblyVersion();\n            lblEVEMonVersion.Text = version.FileVersion;\n            dtpRelease.Value = installerFileInfo.LastWriteTime;\n            lblMD5Sum.Text = Util.CreateMD5From(installerFileInfo.FullName);\n            rtbReleaseUrl.Text = NetworkConstants.GitHubDownloadsBase + string.Format(\n                \"/download/{0:D}.{1:D}.{2:D}/\", version.FileMajorPart, version.FileMinorPart,\n                version.FileBuildPart);\n        }\n\n        /// <summary>\n        /// Gets the installer path.\n        /// </summary>\n        /// <returns></returns>\n        internal static FileInfo GetInstallerPath()\n        {\n            string installerFile = string.Format(CultureConstants.InvariantCulture, InstallerFilename, GetAssemblyVersion().ProductVersion);\n            string installerPath = Path.Combine(Helper.GetSourceFilesDirectory\n                .Replace(Helper.GetOutputPath, \"bin\\\\Installbuilder\\\\Installer\\\\\"), installerFile);\n            return new FileInfo(installerPath);\n        }\n\n        /// <summary>\n        /// Creates a list of the datafiles found in the release folder.\n        /// </summary>\n        private static void InitDatafiles()\n        {\n            DirectoryInfo di = new DirectoryInfo(Helper.GetDataFilesDirectory);\n            var filename = $\"{DatafileHeader}*-{s_enUsCulture.Name}{Datafile.DatafilesExtension}\";\n            FileInfo[] directoryFiles = di.GetFiles(filename);\n            foreach (FileInfo datafile in directoryFiles)\n            {\n                s_datafiles.Add(new Datafile(datafile.Name));\n            }\n        }\n\n        /// <summary>\n        /// Adds a control for each data file.\n        /// </summary>\n        private void CustomLayout()\n        {\n            int startLocation = 70;\n            const int Pad = 5;\n\n            gbDatafiles.Controls.Remove(datafileControl);\n            Height -= datafileControl.Height;\n\n            SuspendLayout();\n            try\n            {\n                foreach (Datafile datafile in s_datafiles.OrderBy(x => x.Filename))\n                {\n                    // Add a new datafile control\n                    DatafileControl newDatafileControl = new DatafileControl();\n                    gbDatafiles.Controls.Add(newDatafileControl);\n\n                    // Control info\n                    UpdateDatafileInfo(newDatafileControl, datafile);\n\n                    // Set Properties\n                    newDatafileControl.Location = new Point(9, startLocation);\n                    newDatafileControl.Font = new Font(Font, FontStyle.Regular);\n                    newDatafileControl.Anchor |= AnchorStyles.Right;\n                    newDatafileControl.Size = new Size(gbDatafiles.Width - Pad * 3, newDatafileControl.Height);\n\n                    // Calculate window height and next control point\n                    Height += datafileControl.Height + Pad;\n                    startLocation += datafileControl.Height + Pad;\n\n                    // Subscribe Events\n                    newDatafileControl.rtbDatafileMessage.Enter += Control_Enter;\n                    newDatafileControl.rtbDatafileMessage.Leave += Control_Leave;\n                    newDatafileControl.rtbDatafileMessage.DoubleClick += Control_DoubleClick;\n                }\n            }\n            finally\n            {\n                // Update the message of each data file control\n                UpdateDatafilesMessage();\n\n                ResumeLayout(false);\n            }\n\n            CenterToScreen();\n        }\n\n        /// <summary>\n        /// Updates the info in the data files section.\n        /// </summary>\n        /// <param name=\"control\"></param>\n        /// <param name=\"datafile\"></param>\n        private static void UpdateDatafileInfo(DatafileControl control, Datafile datafile)\n        {\n            // Data file info\n            FileInfo fileInfo = new FileInfo(Path.Combine(Helper.GetDataFilesDirectory, datafile.Filename));\n\n            // Assign info\n            control.gbDatafile.Text = datafile.Filename;\n            control.lblMD5Sum.Text = datafile.MD5Sum;\n            control.dtpDatafiles.Value = fileInfo.LastWriteTime;\n        }\n\n        /// <summary>\n        /// Updates the data file's header message according to the info provided.\n        /// </summary>\n        private void UpdateDatafilesMessage()\n        {\n            foreach (Datafile datafile in s_datafiles)\n            {\n                foreach (DatafileControl dfControl in gbDatafiles.Controls.OfType<DatafileControl>().Where(\n                    x => x != null && x.gbDatafile.Text == datafile.Filename))\n                {\n                    dfControl.rtbDatafileMessage.BackColor = SystemColors.Window;\n                    dfControl.rtbDatafileMessage.ForeColor = SystemColors.WindowText;\n\n                    if (m_init)\n                        EnsureHeaderMessage(dfControl.rtbDatafileMessage);\n                    else\n                    {\n                        dfControl.rtbDatafileMessage.Text = string.Format(\n                            s_enUsCulture, DatafilesMessageFormat, tbExpansion.Text, tbExpVersion.Text, tbExpRevision.Text,\n                            datafile.Filename.Replace(DatafileHeader, string.Empty)\n                                .Replace(\"-\" + s_enUsCulture.Name, string.Empty)\n                                .Replace(Datafile.DatafilesExtension, string.Empty));\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Ensures that each data file message has an appropriate message header.\n        /// </summary>\n        /// <param name=\"control\"></param>\n        private void EnsureHeaderMessage(Control control)\n        {\n            StringBuilder sb = new StringBuilder();\n\n            // Remove any existing header and text that is before the header\n            control.Text = control.Text.Contains(\"\\n\")\n                ? control.Text.Remove(0, control.Text.IndexOf(\"\\n\", StringComparison.OrdinalIgnoreCase) + 1)\n                : control.Text.Remove(0, control.Text.LastIndexOf(\"m\", StringComparison.Ordinal) + 1);\n\n            // Create the new header text\n            string headerText = string.Format(s_enUsCulture, DatafilesMessageFormat, tbExpansion.Text, tbExpVersion.Text,\n                tbExpRevision.Text,\n                control.Parent.Text.Replace(DatafileHeader, string.Empty)\n                    .Replace(\"-\" + s_enUsCulture.Name, string.Empty)\n                    .Replace(Datafile.DatafilesExtension, string.Empty));\n\n            // Check if the new header text is already present and remove it\n            if (control.Text.Contains(headerText))\n                control.Text = control.Text.Replace(headerText, string.Empty);\n\n            // Assing the remaining text to a new variable\n            string newText = control.Text;\n\n            // Add the new header text to string builder\n            sb.Append(headerText);\n\n            // Check the remaining text and add it accordingly\n            if (!string.IsNullOrEmpty(newText))\n            {\n                if (!newText.StartsWith(\"\\n\", StringComparison.OrdinalIgnoreCase))\n                    sb.AppendLine();\n\n                sb.Append(newText);\n            }\n\n            // Assing the new text to control text\n            control.Text = sb.ToString();\n        }\n\n        /// <summary>\n        /// Stores the initial texts in the text control for use in the create button enabling.\n        /// </summary>\n        private void StoreInitMessage()\n        {\n            // Store the texts from the release section excluding the update url\n            foreach (RichTextBox control in gbRelease.Controls.OfType<RichTextBox>().Where(x => x != null && x != rtbReleaseUrl))\n            {\n                s_listOfInitMessages.Add(control, control.Text);\n            }\n\n            // Store the text from the datafiles section excluding the update url\n            foreach (Control control in gbDatafiles.Controls.Cast<Control>().Where(\n                x => x != rtbDatafileUrl))\n            {\n                if (control is TextBox || control is RichTextBox)\n                    s_listOfInitMessages.Add(control, control.Text);\n\n                DatafileControl dfControl = control as DatafileControl;\n                if (dfControl != null)\n                    s_listOfInitMessages.Add(control, dfControl.rtbDatafileMessage.Text);\n            }\n        }\n\n        /// <summary>\n        /// Checks if all conditions are met to update the data file's message header.\n        /// </summary>\n        private void UpdateDatafilesControls()\n        {\n            if (m_action == Action.ReleaseOnly)\n            {\n                LoadDatafilesInfoFromFile();\n                return;\n            }\n\n            bool updateDatafilesText = true;\n\n            // Look into datafiles controls\n            foreach (TextBox control in gbDatafiles.Controls.OfType<TextBox>().Where(x => x != null))\n            {\n                control.BackColor = SystemColors.Window;\n                control.ForeColor = SystemColors.WindowText;\n\n                if (s_listOfInitMessages.FirstOrDefault(x => x.Key == control).Value == control.Text)\n                {\n                    control.ForeColor = SystemColors.Highlight;\n                    updateDatafilesText = false;\n                }\n\n                if (!string.IsNullOrEmpty(control.Text))\n                    continue;\n\n                control.BackColor = SystemColors.Highlight;\n                updateDatafilesText = false;\n            }\n\n            // If all conditions are met update the messages\n            if (updateDatafilesText)\n                UpdateDatafilesMessage();\n        }\n\n        /// <summary>\n        /// Checks if all conditions are met to enable the create button.\n        /// </summary>\n        private void UpdateCreateButtonEnabled()\n        {\n            // Look into release controls, datafiles controls and datafileControl controls\n            bool buttonEnable = ButtonEnabledFromReleaseControls() &\n                                ButtonEnabledFromDatafileControls() &\n                                ButtonEnabledFromDatafileControlControls();\n\n            // Enable/Disable Create button\n            btnCreate.Enabled = buttonEnable;\n        }\n\n        /// <summary>\n        /// \"Create\" button gets enabled from release controls.\n        /// </summary>\n        /// <returns></returns>\n        private bool ButtonEnabledFromReleaseControls()\n        {\n            bool buttonEnable = true;\n            foreach (RichTextBox control in gbRelease.Controls.OfType<RichTextBox>().Where(x => x != null))\n            {\n                control.BackColor = SystemColors.Window;\n                control.ForeColor = SystemColors.WindowText;\n\n                if (s_listOfInitMessages.FirstOrDefault(x => x.Key == control).Value == control.Text)\n                {\n                    control.ForeColor = SystemColors.Highlight;\n                    buttonEnable = false;\n                }\n\n                if (string.IsNullOrEmpty(control.Text))\n                    control.BackColor = SystemColors.Highlight;\n                else if (control == rtbReleaseMessage || (!Path.GetInvalidPathChars().Any(\n                    invalidChar => control.Text.Contains(invalidChar))))\n                {\n                    continue;\n                }\n\n                control.ForeColor = SystemColors.Highlight;\n                buttonEnable = false;\n            }\n            return buttonEnable;\n        }\n\n        /// <summary>\n        /// Create button gets enabled from datafile controls.\n        /// </summary>\n        /// <returns></returns>\n        private bool ButtonEnabledFromDatafileControls()\n        {\n            bool buttonEnable = true;\n            foreach (Control control in gbDatafiles.Controls.Cast<Control>().Where(x => x is TextBox || x is RichTextBox))\n            {\n                control.BackColor = SystemColors.Window;\n                control.ForeColor = SystemColors.WindowText;\n                if (s_listOfInitMessages.FirstOrDefault(x => x.Key == control).Value == control.Text)\n                {\n                    control.ForeColor = SystemColors.Highlight;\n                    buttonEnable = false;\n                }\n\n                if (string.IsNullOrEmpty(control.Text))\n                    control.BackColor = SystemColors.Highlight;\n                else if (control != rtbDatafileUrl || (!Path.GetInvalidPathChars().Any(\n                    invalidChar => control.Text.Contains(invalidChar)) && !control.Text.Contains(\"#\")))\n                {\n                    continue;\n                }\n\n                control.ForeColor = SystemColors.Highlight;\n                buttonEnable = false;\n            }\n            return buttonEnable;\n        }\n\n        /// <summary>\n        /// Create button gets enabled from datafile control controls.\n        /// </summary>\n        /// <returns></returns>\n        private bool ButtonEnabledFromDatafileControlControls()\n        {\n            bool buttonEnable = true;\n            foreach (DatafileControl dfControl in gbDatafiles.Controls.OfType<DatafileControl>().Where(x => x != null))\n            {\n                dfControl.rtbDatafileMessage.BackColor = SystemColors.Window;\n                dfControl.rtbDatafileMessage.ForeColor = SystemColors.WindowText;\n\n                if (dfControl.rtbDatafileMessage.Text.Contains(s_listOfInitMessages.FirstOrDefault(x => x.Key == dfControl).Value))\n                {\n                    dfControl.rtbDatafileMessage.ForeColor = SystemColors.Highlight;\n                    buttonEnable = false;\n                }\n\n                if (!string.IsNullOrEmpty(dfControl.rtbDatafileMessage.Text))\n                    continue;\n\n                dfControl.rtbDatafileMessage.BackColor = SystemColors.Highlight;\n                buttonEnable = false;\n            }\n            return buttonEnable;\n        }\n\n        /// <summary>\n        /// Deserializes the existing patch file.\n        /// </summary>\n        /// <returns></returns>\n        private static SerializablePatch TryDeserializePatchXml()\n        {\n            FileInfo file = new FileInfo(Helper.GetPatchFilePath);\n\n            SerializablePatch xmlDoc = File.Exists(file.FullName) ? Util.\n                DeserializeXmlFromFile<SerializablePatch>(file.FullName) : null;\n\n            return xmlDoc;\n        }\n\n        /// <summary>\n        /// Serializes the patch file to string.\n        /// </summary>\n        /// <returns></returns>\n        private string ExportPatchXml()\n        {\n            SerializablePatch serial = new SerializablePatch();\n\n            ExportRelease(serial.Release);\n            ExportReleases(serial.Releases);\n            ExportDatafiles(serial.Datafiles);\n\n            XmlDocument doc = (XmlDocument)Util.SerializeToXmlDocument(serial);\n            return doc != null ? Util.GetXmlStringRepresentation(doc) : string.Empty;\n        }\n\n        /// <summary>\n        /// Serializes the release info for the patch file.\n        /// </summary>\n        /// <param name=\"serialRelease\">The serial release.</param>\n        private void ExportRelease(SerializableRelease serialRelease)\n        {\n            if (GetAssemblyVersion().FileMajorPart == 2)\n            {\n                serialRelease.Date = dtpRelease.Value.ToString(DateTimeFormat, s_enUsCulture);\n                serialRelease.Version = lblEVEMonVersion.Text;\n                serialRelease.TopicAddress = rtbTopicUrl.Text;\n                serialRelease.PatchAddress = string.Concat(rtbReleaseUrl.Text,\n                    string.Format(CultureConstants.InvariantCulture, InstallerFilename, GetAssemblyVersion().ProductVersion));\n                serialRelease.MD5Sum = lblMD5Sum.Text;\n                serialRelease.InstallerArgs = InstallerArgs;\n                serialRelease.AdditionalArgs = AdditionalArgs;\n                serialRelease.Message = rtbReleaseMessage.Text.Trim();\n                return;\n            }\n\n            SerializablePatch patch = TryDeserializePatchXml();\n            if (patch == null)\n                return;\n            var release = patch.Release;\n            if ((patch.Releases?.Count ?? 0) > 0)\n                release = patch.Releases[0];\n\n            serialRelease.Date = release.Date;\n            serialRelease.Version = release.Version;\n            serialRelease.TopicAddress = release.TopicAddress;\n            serialRelease.PatchAddress = release.PatchAddress;\n            serialRelease.MD5Sum = release.MD5Sum;\n            serialRelease.InstallerArgs = release.InstallerArgs;\n            serialRelease.AdditionalArgs = release.AdditionalArgs;\n            serialRelease.Message = release.Message;\n        }\n\n        /// <summary>\n        /// Serializes the releases info for the patch file.\n        /// </summary>\n        /// <param name=\"serialReleases\">The serial releases.</param>\n        private void ExportReleases(IList<SerializableRelease> serialReleases)\n        {\n            SerializablePatch patch = TryDeserializePatchXml();\n            if (patch == null)\n                return;\n\n            foreach (SerializableRelease release in patch.Releases\n                .Where(release => Version.Parse(release.Version).Major != GetAssemblyVersion().ProductMajorPart))\n            {\n                serialReleases.Add(release);\n            }\n\n            if (patch.Releases.Any() && patch.Releases.All(release => Version.Parse(release.Version).Major != GetAssemblyVersion().ProductMajorPart))\n                return;\n\n            var serialRelease = new SerializableRelease\n            {\n                Date = dtpRelease.Value.ToString(DateTimeFormat, s_enUsCulture),\n                Version = lblEVEMonVersion.Text,\n                TopicAddress = rtbTopicUrl.Text,\n                PatchAddress = string.Concat(rtbReleaseUrl.Text,\n                    string.Format(CultureConstants.InvariantCulture, InstallerFilename, GetAssemblyVersion().ProductVersion)),\n                MD5Sum = lblMD5Sum.Text,\n                InstallerArgs = InstallerArgs,\n                AdditionalArgs = AdditionalArgs,\n                Message = rtbReleaseMessage.Text.Trim()\n            };\n            serialReleases.Add(serialRelease);\n            serialReleases.StableSort((release, serializableRelease)\n                => string.Compare(release.Version, serializableRelease.Version, StringComparison.Ordinal));\n        }\n\n        /// <summary>\n        /// Serializes the data files info for the patch file.\n        /// </summary>\n        /// <param name=\"datafiles\"></param>\n        /// <returns></returns>\n        private void ExportDatafiles(ICollection<SerializableDatafile> datafiles)\n        {\n            string url = $\"{rtbDatafileUrl.Text}{tbExpansion.Text}{Path.AltDirectorySeparatorChar}{tbExpRevision.Text}\";\n\n            foreach (Datafile datafile in s_datafiles)\n            {\n                SerializableDatafile serialDatafile = new SerializableDatafile();\n                datafiles.Add(serialDatafile);\n\n                foreach (DatafileControl dfControl in gbDatafiles.Controls.OfType<DatafileControl>().Where(\n                    x => x != null && x.gbDatafile.Text == datafile.Filename))\n                {\n                    serialDatafile.Name = dfControl.gbDatafile.Text;\n                    serialDatafile.Date = dfControl.dtpDatafiles.Value.ToString(DateTimeFormat, s_enUsCulture);\n                    serialDatafile.MD5Sum = dfControl.lblMD5Sum.Text;\n                    serialDatafile.Address = url;\n                    serialDatafile.Message = dfControl.rtbDatafileMessage.Text.Trim();\n\n                    if (!serialDatafile.Message.Contains(CompatibilityMessage))\n                        serialDatafile.Message += CompatibilityMessage;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Creates the patch xml file.\n        /// </summary>\n        private async Task SaveFileAsync()\n        {\n            string patch = ExportPatchXml();\n            string filenamePath = Helper.GetPatchFilePath;\n            string oldPatchFilePath = filenamePath.Replace(\".xml\", \"-old.xml\");\n\n            try\n            {\n                FileHelper.DeleteFile(oldPatchFilePath);\n                File.Move(filenamePath, oldPatchFilePath);\n\n                await FileHelper.OverwriteOrWarnTheUserAsync(filenamePath,\n                    async fs =>\n                    {\n                        using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))\n                        {\n                            await sw.WriteAsync(patch);\n                            await sw.FlushAsync();\n                            await fs.FlushAsync();\n                        }\n                        return true;\n                    });\n            }\n            catch (Exception exc)\n            {\n                string msgText = $\"The file failed to be created successfully.\\r\\nReason:{exc.Message}\";\n                MessageBox.Show(msgText, Helper.Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);\n                return;\n            }\n\n            MessageBox.Show(@\"The file was created successfully.\",\n                Helper.Caption, MessageBoxButtons.OK, MessageBoxIcon.Information);\n        }\n\n        /// <summary>\n        /// Loads the release info from existing patch file.\n        /// </summary>\n        /// <returns></returns>\n        private void LoadReleaseInfoFromFile()\n        {\n            SerializablePatch patch = TryDeserializePatchXml();\n            if (patch == null)\n                return;\n\n            DateTime date;\n            SerializableRelease latestRelease;\n            if (!patch.Releases.Any())\n            {\n                latestRelease = patch.Release;\n            }\n            else\n            {\n                string maxVersion = patch.Releases.Select(pi => pi.Version).Max();\n                latestRelease = patch.Releases.FirstOrDefault(pi => pi.Version == maxVersion);\n            }\n\n            if (latestRelease == null)\n                return;\n\n            if (DateTime.TryParse(latestRelease.Date, out date))\n                dtpRelease.Value = date;\n            \n            lblEVEMonVersion.Text = latestRelease.Version;\n            rtbTopicUrl.Text = latestRelease.TopicAddress;\n            rtbReleaseUrl.Text = new Uri(new Uri(latestRelease.PatchAddress), \".\").AbsoluteUri;\n            lblMD5Sum.Text = latestRelease.MD5Sum;\n            rtbReleaseMessage.Text = latestRelease.Message;\n        }\n\n        /// <summary>\n        /// Loads the datafiles info from existing patch file.\n        /// </summary>\n        private void LoadDatafilesInfoFromFile()\n        {\n            SerializablePatch patch = TryDeserializePatchXml();\n            if (patch == null)\n                return;\n\n            Uri uri = new Uri(patch.Datafiles.First().Address);\n\n            string revision = uri.Segments.Last().Replace(Path.AltDirectorySeparatorChar.ToString(), string.Empty);\n            string expansionName = WebUtility.UrlDecode(uri.Segments[2].Replace(Path.\n                AltDirectorySeparatorChar.ToString(), string.Empty));\n\n            int expansionNameLength = patch.Datafiles.First().Message.IndexOf(expansionName, StringComparison.Ordinal) +\n                                         expansionName.Length + 1;\n            string version = patch.Datafiles[0].Message.Remove(0, expansionNameLength).Split(' ').First();\n\n            Uri baseUrl = new Uri(uri, \"..\");\n\n            foreach (SerializableDatafile datafile in patch.Datafiles)\n            {\n                rtbDatafileUrl.Text = baseUrl.AbsoluteUri;\n                tbExpansion.Text = expansionName;\n                tbExpVersion.Text = version;\n                tbExpRevision.Text = revision;\n\n                foreach (DatafileControl dfControl in gbDatafiles.Controls.OfType<DatafileControl>().Where(\n                    x => x != null && x.gbDatafile.Text == datafile.Name))\n                {\n                    DateTime date;\n                    if (DateTime.TryParse(datafile.Date, out date))\n                        dfControl.dtpDatafiles.Value = date;\n\n                    dfControl.lblMD5Sum.Text = datafile.MD5Sum;\n                    dfControl.rtbDatafileMessage.Text = datafile.Message;\n                }\n            }\n        }\n\n        #endregion\n\n\n        #region Control Handlers\n\n        /// <summary>\n        /// Occurs on clicking the \"cancel\" button.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnCancel_Click(object sender, EventArgs e)\n        {\n            Close();\n        }\n\n        /// <summary>\n        /// Occurs on clicking the \"create\" button.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private async void btnCreate_Click(object sender, EventArgs e)\n        {\n            btnCancel.Text = @\"Close\";\n            await SaveFileAsync();\n        }\n\n        /// <summary>\n        /// Occurs on clicking the \"paste from clipboard\" button.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btPaste_Click(object sender, EventArgs e)\n        {\n            if (m_activeTextBox == null)\n                return;\n\n            m_activeTextBox.Text = Clipboard.GetText();\n\n            if (m_activeTextBox.Parent.Parent is DatafileControl)\n                EnsureHeaderMessage(m_activeTextBox);\n\n            m_activeTextBox = null;\n        }\n\n        /// <summary>\n        /// Occurs on clicking the \"load for existing file\" button in release section.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnLoadReleaseInfo_Click(object sender, EventArgs e)\n        {\n            LoadReleaseInfoFromFile();\n            UpdateCreateButtonEnabled();\n        }\n\n        /// <summary>\n        /// Occurs on clicking the \"load for existing file\" button in datafiles section.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnLoadDatafileInfo_Click(object sender, EventArgs e)\n        {\n            LoadDatafilesInfoFromFile();\n            UpdateCreateButtonEnabled();\n        }\n\n        /// <summary>\n        /// Occurs on clicking the \"clear all\" button in release section.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnReleaseClear_Click(object sender, EventArgs e)\n        {\n            dtpRelease.ResetText();\n            rtbTopicUrl.ResetText();\n            rtbReleaseUrl.ResetText();\n            rtbReleaseMessage.ResetText();\n\n            UpdateCreateButtonEnabled();\n        }\n\n        /// <summary>\n        /// Occurs on clicking the \"clear all\" button in datafiles section.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void btnDatafilesClear_Click(object sender, EventArgs e)\n        {\n            rtbDatafileUrl.ResetText();\n            tbExpansion.ResetText();\n            tbExpVersion.ResetText();\n            tbExpRevision.ResetText();\n\n            foreach (DatafileControl dfControl in gbDatafiles.Controls.OfType<DatafileControl>().Where(x => x != null))\n            {\n                dfControl.dtpDatafiles.ResetText();\n                dfControl.rtbDatafileMessage.ResetText();\n\n                Datafile datafile = s_datafiles.First(x => x.Filename == dfControl.gbDatafile.Text);\n\n                if (datafile != null)\n                    UpdateDatafileInfo(dfControl, datafile);\n            }\n\n            UpdateCreateButtonEnabled();\n        }\n\n        /// <summary>\n        /// Occurs on mouse double click inside a text control.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void Control_DoubleClick(object sender, EventArgs e)\n        {\n            Control control = null;\n\n            DatafileControl dfControl = sender as DatafileControl;\n            if (dfControl != null)\n                control = dfControl.rtbDatafileMessage;\n\n            RichTextBox richTextBox = sender as RichTextBox;\n            if (richTextBox != null)\n                control = richTextBox;\n\n            TextBox textBox = sender as TextBox;\n            if (textBox != null)\n                control = textBox;\n\n            if (control == null)\n                return;\n\n            m_activeTextBox = control;\n            m_text = control.Text;\n            control.Text = string.Empty;\n        }\n\n        /// <summary>\n        /// Occurs when entering a text control.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void Control_Enter(object sender, EventArgs e)\n        {\n            TextBox textBox = sender as TextBox;\n            if (textBox != null)\n                textBox.ForeColor = SystemColors.WindowText;\n\n            RichTextBox richTextBox = sender as RichTextBox;\n            if (richTextBox != null)\n                richTextBox.ForeColor = SystemColors.WindowText;\n        }\n\n        /// <summary>\n        /// Occurs when leaving a text control.\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void Control_Leave(object sender, EventArgs e)\n        {\n            Control control = null;\n\n            RichTextBox richTextBox = sender as RichTextBox;\n            if (richTextBox != null)\n                control = richTextBox;\n\n            TextBox textBox = sender as TextBox;\n            if (textBox != null)\n                control = textBox;\n\n            if (control == null)\n                return;\n\n            if (control == tbExpansion\n                || control == tbExpVersion\n                || control == tbExpRevision\n                || control.Parent.Parent is DatafileControl)\n            {\n                UpdateDatafilesControls();\n            }\n\n            if (control.Text.Length == 0)\n                control.Text = m_text;\n\n            UpdateCreateButtonEnabled();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "tools/PatchXmlCreator/PatchXmlCreatorWindow.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "tools/PatchXmlCreator/Program.cs",
    "content": "using System;\nusing System.Windows.Forms;\n\nnamespace EVEMon.PatchXmlCreator\n{\n    internal static class Program\n    {\n        /// <summary>\n        /// The main entry point for the application.\n        /// </summary>\n        [STAThread]\n        private static void Main()\n        {\n            Application.EnableVisualStyles();\n            Application.SetCompatibleTextRenderingDefault(false);\n\n            Action action = Helper.SelectAction();\n\n            // Ensure that the prerequisites for a release are met\n            if (!Helper.ExitRequested && action != Action.DatafilesOnly)\n                Helper.EnsurePrerequisites();\n\n            // When prerequisites are not met we exit before Run()\n            if (Helper.ExitRequested)\n                return;\n\n            Application.Run(new PatchXmlCreatorWindow(action));\n        }\n    }\n}"
  },
  {
    "path": "tools/PatchXmlCreator/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"PatchXMLCreator\")]\n[assembly: AssemblyDescription(\"EVEMon Patch Xml Creator\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"EVEMon Development Team\")]\n[assembly: AssemblyProduct(\"EVEMonPatchXMLCreator\")]\n[assembly: AssemblyCopyright(\"Copyright © 2010-2016, EVEMon Development Team\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"a47f6d74-da02-402c-b4a4-b6a17b736f3e\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n[assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: AssemblyInformationalVersion(\"1.0.0\")]\n\n// Neutral Language\n[assembly: NeutralResourcesLanguage(\"en-US\")]"
  },
  {
    "path": "tools/PatchXmlCreator/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.1\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace PatchXmlCreator.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"PatchXmlCreator.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tools/PatchXmlCreator/Properties/Resources.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>\n"
  },
  {
    "path": "tools/PatchXmlCreator/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.1\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace PatchXmlCreator.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"10.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tools/PatchXmlCreator/Properties/Settings.settings",
    "content": "<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>\n"
  },
  {
    "path": "tools/PatchXmlCreator/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-10.0.0.0\" newVersion=\"10.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.36.0.0\" newVersion=\"1.36.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis.Core\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.42.0.0\" newVersion=\"1.42.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n<startup><supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\" /></startup></configuration>\n"
  },
  {
    "path": "tools/ReSharper/EVEMonCodingStyle-ReSharper.xml",
    "content": "<CodeStyleSettings>\n  <CSS>\n    <FormatSettings />\n    <Naming2 />\n  </CSS>\n  <CSharp>\n    <FormatSettings>\n      <BLANK_LINES_AFTER_START_COMMENT>0</BLANK_LINES_AFTER_START_COMMENT>\n      <BLANK_LINES_AROUND_REGION>2</BLANK_LINES_AROUND_REGION>\n      <FORCE_FIXED_BRACES_STYLE>ALWAYS_ADD</FORCE_FIXED_BRACES_STYLE>\n      <FORCE_FOR_BRACES_STYLE>ALWAYS_ADD</FORCE_FOR_BRACES_STYLE>\n      <FORCE_FOREACH_BRACES_STYLE>ALWAYS_ADD</FORCE_FOREACH_BRACES_STYLE>\n      <FORCE_IFELSE_BRACES_STYLE>ONLY_FOR_MULTILINE</FORCE_IFELSE_BRACES_STYLE>\n      <FORCE_USING_BRACES_STYLE>ALWAYS_ADD</FORCE_USING_BRACES_STYLE>\n      <FORCE_WHILE_BRACES_STYLE>ALWAYS_ADD</FORCE_WHILE_BRACES_STYLE>\n      <KEEP_BLANK_LINES_IN_DECLARATIONS>1</KEEP_BLANK_LINES_IN_DECLARATIONS>\n      <MODIFIERS_ORDER IsNull=\"False\">\n        <Item>public</Item>\n        <Item>protected</Item>\n        <Item>internal</Item>\n        <Item>private</Item>\n        <Item>new</Item>\n        <Item>abstract</Item>\n        <Item>virtual</Item>\n        <Item>override</Item>\n        <Item>sealed</Item>\n        <Item>static</Item>\n        <Item>readonly</Item>\n        <Item>extern</Item>\n        <Item>unsafe</Item>\n        <Item>volatile</Item>\n      </MODIFIERS_ORDER>\n      <PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>False</PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>\n      <PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>False</PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>\n      <PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>False</PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>\n      <SIMPLE_EMBEDDED_STATEMENT_STYLE>LINE_BREAK</SIMPLE_EMBEDDED_STATEMENT_STYLE>\n      <SPACE_AFTER_TYPECAST_PARENTHESES>False</SPACE_AFTER_TYPECAST_PARENTHESES>\n      <SPACE_AROUND_MULTIPLICATIVE_OP>True</SPACE_AROUND_MULTIPLICATIVE_OP>\n      <SPACE_BEFORE_TYPEOF_PARENTHESES>False</SPACE_BEFORE_TYPEOF_PARENTHESES>\n      <SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>True</SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>\n      <WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>True</WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>\n      <WRAP_LIMIT>130</WRAP_LIMIT>\n      <WRAP_MULTIPLE_DECLARATION_STYLE>CHOP_ALWAYS</WRAP_MULTIPLE_DECLARATION_STYLE>\n      <WRAP_MULTIPLE_TYPE_PARAMEER_CONSTRAINTS_STYLE>CHOP_ALWAYS</WRAP_MULTIPLE_TYPE_PARAMEER_CONSTRAINTS_STYLE>\n    </FormatSettings>\n    <UsingsSettings />\n    <Naming2>\n      <EventHandlerPatternLong>$object$_$event$</EventHandlerPatternLong>\n      <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>\n      <OverrideDefaultSettings>True</OverrideDefaultSettings>\n      <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"TypesAndNamespaces\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"I\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"Interfaces\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"T\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"TypeParameters\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"MethodPropertyEvent\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"aaBb\" ElementKind=\"Locals\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"LocalConstants\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"aaBb\" ElementKind=\"Parameters\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"PublicFields\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"m_\" Suffix=\"\" Style=\"aaBb\" ElementKind=\"PrivateInstanceFields\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"s_\" Suffix=\"\" Style=\"aaBb\" ElementKind=\"PrivateStaticFields\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"Constants\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"PrivateConstants\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"StaticReadonly\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"s_\" Suffix=\"\" Style=\"aaBb\" ElementKind=\"PrivateStaticReadonly\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"EnumMember\" />\n      <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"Other\" />\n      <Abbreviation Text=\"ID\" />\n      <Abbreviation Text=\"NL\" />\n      <Abbreviation Text=\"DB\" />\n      <Abbreviation Text=\"NULL\" />\n      <Abbreviation Text=\"PG\" />\n      <Abbreviation Text=\"CPU\" />\n      <Abbreviation Text=\"EM\" />\n      <Abbreviation Text=\"AI\" />\n      <Abbreviation Text=\"ORE\" />\n      <Abbreviation Text=\"II\" />\n      <Abbreviation Text=\"III\" />\n      <Abbreviation Text=\"AIID\" />\n      <Abbreviation Text=\"IID\" />\n      <Abbreviation Text=\"DNAID\" />\n      <Abbreviation Text=\"EW\" />\n      <Abbreviation Text=\"IIID\" />\n      <Abbreviation Text=\"XML\" />\n      <Abbreviation Text=\"API\" />\n      <Abbreviation Text=\"XSLT\" />\n      <Abbreviation Text=\"URL\" />\n      <Abbreviation Text=\"CCP\" />\n      <Abbreviation Text=\"SP\" />\n      <Abbreviation Text=\"EFTCHR\" />\n      <Abbreviation Text=\"HTML\" />\n      <Abbreviation Text=\"EVE\" />\n      <Abbreviation Text=\"CCPXML\" />\n      <Abbreviation Text=\"BB\" />\n      <Abbreviation Text=\"PNG\" />\n      <Abbreviation Text=\"UI\" />\n      <Abbreviation Text=\"ME\" />\n      <Abbreviation Text=\"MD\" />\n      <Abbreviation Text=\"NPC\" />\n      <Abbreviation Text=\"NT\" />\n      <Abbreviation Text=\"CXI\" />\n      <Abbreviation Text=\"LCD\" />\n      <Abbreviation Text=\"LCDX\" />\n      <Abbreviation Text=\"BCAPI\" />\n      <Abbreviation Text=\"DT\" />\n      <Abbreviation Text=\"APICCP\" />\n      <Abbreviation Text=\"DESC\" />\n      <Abbreviation Text=\"ASC\" />\n      <Abbreviation Text=\"RP\" />\n      <Abbreviation Text=\"TTC\" />\n      <Abbreviation Text=\"PE\" />\n      <Abbreviation Text=\"IGB\" />\n      <Abbreviation Text=\"OK\" />\n      <Abbreviation Text=\"CSV\" />\n      <Abbreviation Text=\"UTC\" />\n      <Abbreviation Text=\"EFT\" />\n      <Abbreviation Text=\"URI\" />\n      <Abbreviation Text=\"RGB\" />\n      <Abbreviation Text=\"DNA\" />\n    </Naming2>\n  </CSharp>\n  <HTML>\n    <FormatSettings />\n  </HTML>\n  <JavaScript>\n    <FormatSettings />\n    <Naming2 />\n  </JavaScript>\n  <VB>\n    <FormatSettings />\n    <ImportsSettings />\n    <Naming2>\n      <EventHandlerPatternLong>$object$_$event$</EventHandlerPatternLong>\n      <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>\n    </Naming2>\n  </VB>\n  <Web>\n    <Naming2 />\n  </Web>\n  <XML>\n    <FormatSettings />\n  </XML>\n  <Xaml>\n    <Naming2 />\n  </Xaml>\n  <GenerateMemberBody />\n  <Naming2>\n    <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>\n    <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>\n    <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"TypesAndNamespaces\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"I\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"Interfaces\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"T\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"TypeParameters\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"MethodPropertyEvent\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"aaBb\" ElementKind=\"Locals\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"aaBb\" ElementKind=\"LocalConstants\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"aaBb\" ElementKind=\"Parameters\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"PublicFields\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"_\" Suffix=\"\" Style=\"aaBb\" ElementKind=\"PrivateInstanceFields\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"_\" Suffix=\"\" Style=\"aaBb\" ElementKind=\"PrivateStaticFields\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"Constants\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"PrivateConstants\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"StaticReadonly\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"PrivateStaticReadonly\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"EnumMember\" />\n    <PredefinedRule Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" ElementKind=\"Other\" />\n  </Naming2>\n</CodeStyleSettings>"
  },
  {
    "path": "tools/ReSharper/EVEMonCodingStyle-ReSharper6.1.DotSettings",
    "content": "﻿<wpf:ResourceDictionary xml:space=\"preserve\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:s=\"clr-namespace:System;assembly=mscorlib\" xmlns:ss=\"urn:shemas-jetbrains-com:settings-storage-xaml\" xmlns:wpf=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">\n\t<s:Int64 x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/BLANK_LINES_AFTER_START_COMMENT/@EntryValue\">0</s:Int64>\n\t<s:Int64 x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/BLANK_LINES_AROUND_REGION/@EntryValue\">2</s:Int64>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/FORCE_FIXED_BRACES_STYLE/@EntryValue\">ALWAYS_ADD</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/FORCE_FOR_BRACES_STYLE/@EntryValue\">ALWAYS_ADD</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/FORCE_FOREACH_BRACES_STYLE/@EntryValue\">ALWAYS_ADD</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/FORCE_IFELSE_BRACES_STYLE/@EntryValue\">ONLY_FOR_MULTILINE</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/FORCE_USING_BRACES_STYLE/@EntryValue\">ALWAYS_ADD</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/FORCE_WHILE_BRACES_STYLE/@EntryValue\">ALWAYS_ADD</s:String>\n\t<s:Int64 x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue\">1</s:Int64>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE/@EntryValue\">False</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE/@EntryValue\">False</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE/@EntryValue\">False</s:Boolean>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/SIMPLE_EMBEDDED_STATEMENT_STYLE/@EntryValue\">LINE_BREAK</s:String>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_AFTER_TYPECAST_PARENTHESES/@EntryValue\">False</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_AROUND_MULTIPLICATIVE_OP/@EntryValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_TYPEOF_PARENTHESES/@EntryValue\">False</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES/@EntryValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT/@EntryValue\">True</s:Boolean>\n\t<s:Int64 x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_LIMIT/@EntryValue\">130</s:Int64>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_MULTIPLE_DECLARATION_STYLE/@EntryValue\">CHOP_ALWAYS</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_MULTIPLE_TYPE_PARAMEER_CONSTRAINTS_STYLE/@EntryValue\">CHOP_ALWAYS</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=API/@EntryIndexedValue\">API</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BB/@EntryIndexedValue\">BB</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BCAPI/@EntryIndexedValue\">BCAPI</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CCP/@EntryIndexedValue\">CCP</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CCPXML/@EntryIndexedValue\">CCPXML</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CPU/@EntryIndexedValue\">CPU</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DB/@EntryIndexedValue\">DB</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EFTCHR/@EntryIndexedValue\">EFTCHR</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EVE/@EntryIndexedValue\">EVE</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HTML/@EntryIndexedValue\">HTML</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ID/@EntryIndexedValue\">ID</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IGB/@EntryIndexedValue\">IGB</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=II/@EntryIndexedValue\">II</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=III/@EntryIndexedValue\">III</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IO/@EntryIndexedValue\">IO</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LCD/@EntryIndexedValue\">LCD</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LCDX/@EntryIndexedValue\">LCDX</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MD/@EntryIndexedValue\">MD</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NPC/@EntryIndexedValue\">NPC</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PNG/@EntryIndexedValue\">PNG</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RGB/@EntryIndexedValue\">RGB</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SP/@EntryIndexedValue\">SP</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TTC/@EntryIndexedValue\">TTC</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=UI/@EntryIndexedValue\">UI</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=URL/@EntryIndexedValue\">URL</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=XML/@EntryIndexedValue\">XML</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=XSLT/@EntryIndexedValue\">XSLT</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Constants/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=EnumMember/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Interfaces/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"I\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=LocalConstants/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Locals/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"aaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=MethodPropertyEvent/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Other/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Parameters/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"aaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateConstants/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"m_\" Suffix=\"\" Style=\"aaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticFields/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"s_\" Suffix=\"\" Style=\"aaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticReadonly/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"s_\" Suffix=\"\" Style=\"aaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PublicFields/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=StaticReadonly/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=TypeParameters/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"T\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=TypesAndNamespaces/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:Boolean x:Key=\"/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue\">True</s:Boolean></wpf:ResourceDictionary>"
  },
  {
    "path": "tools/ReSharper/EVEMonCodingStyle-ReSharper9.x.DotSettings",
    "content": "﻿<wpf:ResourceDictionary xml:space=\"preserve\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:s=\"clr-namespace:System;assembly=mscorlib\" xmlns:ss=\"urn:shemas-jetbrains-com:settings-storage-xaml\" xmlns:wpf=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">\n\t<s:Int64 x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/BLANK_LINES_AFTER_START_COMMENT/@EntryValue\">0</s:Int64>\n\t<s:Int64 x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/BLANK_LINES_AROUND_REGION/@EntryValue\">2</s:Int64>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/FORCE_FIXED_BRACES_STYLE/@EntryValue\">ALWAYS_ADD</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/FORCE_FOR_BRACES_STYLE/@EntryValue\">ALWAYS_ADD</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/FORCE_FOREACH_BRACES_STYLE/@EntryValue\">ALWAYS_ADD</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/FORCE_IFELSE_BRACES_STYLE/@EntryValue\">ONLY_FOR_MULTILINE</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/FORCE_USING_BRACES_STYLE/@EntryValue\">ALWAYS_ADD</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/FORCE_WHILE_BRACES_STYLE/@EntryValue\">ALWAYS_ADD</s:String>\n\t<s:Int64 x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue\">1</s:Int64>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE/@EntryValue\">False</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE/@EntryValue\">False</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE/@EntryValue\">False</s:Boolean>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/SIMPLE_EMBEDDED_STATEMENT_STYLE/@EntryValue\">LINE_BREAK</s:String>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_AFTER_TYPECAST_PARENTHESES/@EntryValue\">False</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_AROUND_MULTIPLICATIVE_OP/@EntryValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_TYPEOF_PARENTHESES/@EntryValue\">False</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES/@EntryValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT/@EntryValue\">True</s:Boolean>\n\t<s:Int64 x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_LIMIT/@EntryValue\">130</s:Int64>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_MULTIPLE_DECLARATION_STYLE/@EntryValue\">CHOP_ALWAYS</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_MULTIPLE_TYPE_PARAMEER_CONSTRAINTS_STYLE/@EntryValue\">CHOP_ALWAYS</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=API/@EntryIndexedValue\">API</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BB/@EntryIndexedValue\">BB</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BCAPI/@EntryIndexedValue\">BCAPI</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CCP/@EntryIndexedValue\">CCP</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CCPXML/@EntryIndexedValue\">CCPXML</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CPU/@EntryIndexedValue\">CPU</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DB/@EntryIndexedValue\">DB</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EFTCHR/@EntryIndexedValue\">EFTCHR</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EVE/@EntryIndexedValue\">EVE</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HTML/@EntryIndexedValue\">HTML</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ID/@EntryIndexedValue\">ID</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IGB/@EntryIndexedValue\">IGB</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=II/@EntryIndexedValue\">II</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=III/@EntryIndexedValue\">III</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IO/@EntryIndexedValue\">IO</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LCD/@EntryIndexedValue\">LCD</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LCDX/@EntryIndexedValue\">LCDX</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MD/@EntryIndexedValue\">MD</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NPC/@EntryIndexedValue\">NPC</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PNG/@EntryIndexedValue\">PNG</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RGB/@EntryIndexedValue\">RGB</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SP/@EntryIndexedValue\">SP</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TTC/@EntryIndexedValue\">TTC</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=UI/@EntryIndexedValue\">UI</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=URL/@EntryIndexedValue\">URL</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=XML/@EntryIndexedValue\">XML</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=XSLT/@EntryIndexedValue\">XSLT</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Constants/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=EnumMember/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Interfaces/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"I\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=LocalConstants/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Locals/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"aaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=MethodPropertyEvent/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Other/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Parameters/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"aaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateConstants/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"m_\" Suffix=\"\" Style=\"aaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticFields/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"s_\" Suffix=\"\" Style=\"aaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticReadonly/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"s_\" Suffix=\"\" Style=\"aaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PublicFields/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=StaticReadonly/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=TypeParameters/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"T\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=TypesAndNamespaces/@EntryIndexedValue\">&lt;Policy Inspect=\"True\" Prefix=\"\" Suffix=\"\" Style=\"AaBb\" /&gt;</s:String>\n\t<s:Boolean x:Key=\"/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EAddAccessorOwnerDeclarationBracesMigration/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateThisQualifierSettings/@EntryIndexedValue\">True</s:Boolean></wpf:ResourceDictionary>"
  },
  {
    "path": "tools/ResFileCreator/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace EVEMon.ResFileCreator\n{\n    internal static class Program\n    {\n        private static readonly Dictionary<string, object> s_dictionary = new Dictionary<string, object>();\n        private static string s_resScriptfile;\n        private static string s_rcexe;\n        private static string s_solutionDir;\n        private static string s_projectDir;\n\n        /// <summary>\n        /// The main entry point for the application.\n        /// </summary>\n        /// <returns></returns>\n        [STAThread]\n        private static void Main()\n        {\n            s_rcexe = FindRcExe();\n            if (string.IsNullOrEmpty(s_rcexe))\n            {\n                Console.WriteLine(\"RC.exe : Not Found - Resource file will not be created.\");\n                return;\n            }\n\n            ParserAssemblyInfo();\n\n            if (!GenerateRcFile())\n                return;\n\n            CreateResFile();\n            File.Delete(s_resScriptfile);\n        }\n\n        /// <summary>\n        /// Parsers the assembly info.\n        /// </summary>\n        private static void ParserAssemblyInfo()\n        {\n            Directory.SetCurrentDirectory(GetSolutionDirectory());\n\n            string assemblyInfoFileContent = File.ReadAllText(Path.GetFullPath(@\"src\\EVEMon\\Properties\\AssemblyInfo.cs\"));\n            s_dictionary[\"AssemblyTitle\"] = GetValueOf(assemblyInfoFileContent, \"AssemblyTitle\");\n\n            assemblyInfoFileContent = File.ReadAllText(Path.GetFullPath(@\"SharedAssemblyInfo.cs\"));\n            s_dictionary[\"AssemblyDescription\"] = GetValueOf(assemblyInfoFileContent, \"AssemblyDescription\");\n            s_dictionary[\"AssemblyCompany\"] = GetValueOf(assemblyInfoFileContent, \"AssemblyCompany\");\n            s_dictionary[\"AssemblyProduct\"] = GetValueOf(assemblyInfoFileContent, \"AssemblyProduct\");\n            s_dictionary[\"AssemblyCopyright\"] = GetValueOf(assemblyInfoFileContent, \"AssemblyCopyright\");\n            s_dictionary[\"AssemblyFileVersion\"] = GetValueOf(assemblyInfoFileContent, \"AssemblyFileVersion\");\n            s_dictionary[\"AssemblyInformationalVersion\"] = GetValueOf(assemblyInfoFileContent, \"AssemblyInformationalVersion\");\n        }\n\n        /// <summary>\n        /// Gets the value of the specified key.\n        /// </summary>\n        /// <param name=\"assemblyInfoFileContent\">Content of the assembly information file.</param>\n        /// <param name=\"key\">The key.</param>\n        /// <returns></returns>\n        private static string GetValueOf(string assemblyInfoFileContent, string key)\n        {\n            int index = assemblyInfoFileContent.IndexOf(key, StringComparison.Ordinal) + key.Length;\n            string substring = assemblyInfoFileContent.Substring(index);\n            int length = substring.IndexOf(\")\", StringComparison.Ordinal) - 1;\n            string value = assemblyInfoFileContent.Substring(index, length)\n                .Replace(\"(\\\"\", string.Empty).Replace(\"\\\")\", string.Empty);\n            return value;\n        }\n\n        /// <summary>\n        /// Generates the rc file.\n        /// </summary>\n        /// <returns></returns>\n        private static bool GenerateRcFile()\n        {\n            s_resScriptfile = Path.GetFullPath(string.Format(CultureInfo.InvariantCulture,\n                \"src\\\\EVEMon\\\\{0}.rc\", s_dictionary[\"AssemblyTitle\"]));\n\n            StringBuilder sb = new StringBuilder();\n\n            AddIcons(sb);\n            AddManifest(sb);\n            AddVersionInfo(sb);\n\n            try\n            {\n                File.WriteAllText(s_resScriptfile, sb.ToString(), Encoding.Default);\n            }\n            catch (IOException ex)\n            {\n                Console.WriteLine(ex.Message);\n                return false;\n            }\n\n            Console.WriteLine(\"Resource script file created successfully.\");\n            return true;\n        }\n\n        /// <summary>\n        /// Adds the version info.\n        /// </summary>\n        /// <param name=\"sb\">The sb.</param>\n        private static void AddVersionInfo(StringBuilder sb)\n        {\n            string commaFileVersion = s_dictionary[\"AssemblyFileVersion\"].ToString().Replace(\".\", \",\");\n\n            sb\n                .AppendLine(\"// Version\")\n                .AppendLine(\"1 VERSIONINFO\")\n                .AppendLine($\" FILEVERSION {commaFileVersion}\")\n                .AppendLine($\" PRODUCTVERSION {commaFileVersion}\")\n                .AppendLine(\" FILEFLAGSMASK 0x3fL\")\n                .AppendLine(\"#ifdef _DEBUG\")\n                .AppendLine(\" FILEFLAGS 0x1L\")\n                .AppendLine(\"#else\")\n                .AppendLine(\" FILEFLAGS 0x0L\")\n                .AppendLine(\"#endif\")\n                .AppendLine(\" FILEOS 0x40004L\")\n                .AppendLine(\" FILETYPE 0x0L\")\n                .AppendLine(\" FILESUBTYPE 0x0L\")\n\n                .AppendLine(\"BEGIN\")\n                .AppendLine(\"    BLOCK \\\"StringFileInfo\\\"\")\n                .AppendLine(\"    BEGIN\")\n                .AppendLine(\"        BLOCK \\\"000004b0\\\"\")\n                .AppendLine(\"        BEGIN\")\n                .AppendLine($\"            VALUE \\\"CompanyName\\\", \\\"{s_dictionary[\"AssemblyCompany\"]}\\\"\")\n                .AppendLine($\"            VALUE \\\"FileDescription\\\", \\\"{s_dictionary[\"AssemblyTitle\"]}\\\"\")\n                .AppendLine($\"            VALUE \\\"FileVersion\\\", \\\"{s_dictionary[\"AssemblyFileVersion\"]}\\\"\")\n                .AppendLine($\"            VALUE \\\"InternalName\\\", \\\"{s_dictionary[\"AssemblyProduct\"]}.exe\\\"\")\n                .AppendLine($\"            VALUE \\\"LegalCopyright\\\", \\\"{s_dictionary[\"AssemblyCopyright\"]}\\\"\")\n                .AppendLine($\"            VALUE \\\"OriginalFilename\\\", \\\"{s_dictionary[\"AssemblyProduct\"]}.exe\\\"\")\n                .AppendLine($\"            VALUE \\\"ProductName\\\", \\\"{s_dictionary[\"AssemblyProduct\"]}\\\"\")\n                .AppendLine($\"            VALUE \\\"ProductVersion\\\", \\\"{s_dictionary[\"AssemblyInformationalVersion\"]}\\\"\")\n                .AppendLine(\"        END\")\n                .AppendLine(\"    END\")\n                .AppendLine(\"    BLOCK \\\"VarFileInfo\\\"\")\n                .AppendLine(\"    BEGIN\")\n                .AppendLine(\"        VALUE \\\"Translation\\\", 0x000, 1200\")\n                .AppendLine(\"    END\")\n                .AppendLine(\"END\");\n        }\n\n        /// <summary>\n        /// Adds the manifest.\n        /// </summary>\n        /// <param name=\"sb\">The sb.</param>\n        private static void AddManifest(StringBuilder sb)\n        {\n            const string ManifestFile = @\"src\\EVEMon\\\\app.manifest\";\n\n            if (!File.Exists(ManifestFile))\n                return;\n\n            sb\n                .AppendLine(\"// Manifest\")\n                .AppendLine($\"1 24 \\\"{ManifestFile}\\\"\");\n        }\n\n        /// <summary>\n        /// Adds the icons.\n        /// </summary>\n        /// <param name=\"sb\">The sb.</param>\n        private static void AddIcons(StringBuilder sb)\n        {\n            const string IconsDir = @\"src\\EVEMon.Common\\Resources\\Icons\";\n            List<string> iconFilesPath = new List<string>();\n\n            if (Directory.Exists(IconsDir))\n                iconFilesPath = Directory.GetFiles(IconsDir, \"EVEMon.ico\", SearchOption.AllDirectories).ToList();\n\n            if (!iconFilesPath.Any())\n                return;\n\n            int count = 1;\n            string iconEVEMon = iconFilesPath.FirstOrDefault(file => file.Contains(\"EVEMon.ico\"));\n\n            sb.AppendLine(\"// Icon\");\n            if (iconEVEMon != null)\n            {\n                sb.AppendLine($\"{count} ICON \\\"{iconEVEMon}\\\"\");\n                count++;\n                iconFilesPath.Remove(iconEVEMon);\n            }\n\n            foreach (string iconFilePath in iconFilesPath)\n            {\n                sb.AppendLine($\"{count} ICON \\\"{iconFilePath}\\\"\");\n                count++;\n            }\n\n            sb.AppendLine();\n        }\n\n        /// <summary>\n        /// Creates the resource file.\n        /// </summary>\n        private static void CreateResFile()\n        {\n            ProcessStartInfo startInfo = new ProcessStartInfo\n            {\n                FileName = s_rcexe,\n                Arguments = string.Format(CultureInfo.InvariantCulture, \"/v /nologo /r \\\"{0}\\\"\", s_resScriptfile),\n                UseShellExecute = false,\n                RedirectStandardOutput = true\n            };\n\n            int exitCode;\n            using (Process makeResProcess = new Process())\n            {\n                makeResProcess.StartInfo = startInfo;\n                makeResProcess.Start();\n                makeResProcess.WaitForExit();\n                exitCode = makeResProcess.ExitCode;\n\n                if (Debugger.IsAttached)\n                {\n                    Console.WriteLine();\n                    Console.WriteLine(makeResProcess.StandardOutput.ReadToEnd());\n                }\n            }\n\n            Console.Write(exitCode != 0\n                ? \"Resource Compiler exited with errors.\"\n                : \"Resource file compiled successfully.\");\n        }\n\n        /// <summary>\n        /// Finds the rc executable.\n        /// </summary>\n        /// <returns></returns>\n        private static string FindRcExe()\n        {\n            // Lookup for 'RC.exe' for the particular process architecture\n            string architecture = Environment.Is64BitProcess ? \"x64\" : \"x86\";\n            string filePath = Path.Combine(GetProjectDirectory(), @\"Dependencies\\ResCompiler\\\", architecture, \"rc.exe\");\n\n            return File.Exists(filePath) ? filePath : null;\n        }\n\n        /// <summary>\n        /// Gets the solution directory.\n        /// </summary>\n        /// <returns></returns>\n        private static string GetSolutionDirectory()\n        {\n            if (string.IsNullOrWhiteSpace(s_solutionDir))\n            {\n                s_solutionDir = Regex.Match(Directory.GetCurrentDirectory(), @\"[a-zA-Z]+:.*\\\\(?=tools)\",\n                                            RegexOptions.Compiled | RegexOptions.IgnoreCase).ToString();\n            }\n            return s_solutionDir;\n        }\n\n        /// <summary>\n        /// Gets the project directory.\n        /// </summary>\n        /// <returns></returns>\n        private static string GetProjectDirectory()\n        {\n            if (string.IsNullOrWhiteSpace(s_projectDir))\n            {\n                s_projectDir = Regex.Match(Directory.GetCurrentDirectory(), @\"[a-zA-Z]+:.*\\\\(?=bin)\",\n                                            RegexOptions.Compiled | RegexOptions.IgnoreCase).ToString();\n            }\n            return s_projectDir;\n        }\n    }\n}\n"
  },
  {
    "path": "tools/ResFileCreator/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ResFileCreator\")]\n[assembly: AssemblyDescription(\"EVEMon Resource File Creator\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"EVEMon Development Team\")]\n[assembly: AssemblyProduct(\"EVEMonResFileCreator\")]\n[assembly: AssemblyCopyright(\"Copyright © 2013-2016, EVEMon Development Team\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"26ae6b8c-1f80-408c-8fa8-67149895a25a\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n[assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: AssemblyInformationalVersion(\"1.0.0\")]\n\n// Neutral Language\n[assembly: NeutralResourcesLanguage(\"en-US\")]"
  },
  {
    "path": "tools/ResFileCreator/ResFileCreator.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{87682BB1-CCE5-4CA4-BDE8-1A2ACF0B3CE0}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>EVEMon.ResFileCreator</RootNamespace>\n    <AssemblyName>EVEMonResFileCreator</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\n    <DebugType>full</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"GlobalSuppressions.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"app.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PostBuildEvent>\n    </PostBuildEvent>\n  </PropertyGroup>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "tools/ResFileCreator/app.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n<startup><supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\"/></startup></configuration>\n"
  },
  {
    "path": "tools/XmlGenerator/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <section name=\"entityFramework\" type=\"System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" requirePermission=\"false\" />\n    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->\n  </configSections>\n  <startup>\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\" />\n  </startup>\n  <connectionStrings>\n    <clear />\n    <add name=\"EveStaticData\" connectionString=\"Data Source=..\\..\\sqlite-latest.sqlite\" providerName=\"System.Data.SQLite.EF6\" />\n  </connectionStrings>\n  <entityFramework>\n    <defaultConnectionFactory type=\"System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework\" />\n    <providers>\n      <provider invariantName=\"System.Data.SqlClient\" type=\"System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer\" />\n      <provider invariantName=\"System.Data.SQLite\" type=\"System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6\" />\n    </providers>\n  </entityFramework>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-10.0.0.0\" newVersion=\"10.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.36.0.0\" newVersion=\"1.36.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Google.Apis.Core\" publicKeyToken=\"4b01fa6e34db77ab\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.42.0.0\" newVersion=\"1.42.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <system.data>\n    <DbProviderFactories>\n      <add name=\"SQLite Data Provider (Entity Framework 6)\" invariant=\"System.Data.SQLite.EF6\" description=\".NET Framework Data Provider for SQLite (Entity Framework 6)\" type=\"System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6\" />\n      <add name=\"SQLite Data Provider\" invariant=\"System.Data.SQLite\" description=\".NET Framework Data Provider for SQLite\" type=\"System.Data.SQLite.SQLiteFactory, System.Data.SQLite\" />\n    </DbProviderFactories>\n  </system.data>\n</configuration>"
  },
  {
    "path": "tools/XmlGenerator/Collections/BagCollection.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing EVEMon.Common.Extensions;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.Collections\n{\n    /// <summary>\n    /// A dictionary-based implementation.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public sealed class BagCollection<T> : IEnumerable<T>\n        where T : IHasID\n    {\n        private readonly Dictionary<long, T> m_items;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BagCollection{T}\" /> class.\n        /// </summary>\n        /// <param name=\"collection\">The list.</param>\n        /// <exception cref=\"System.ArgumentNullException\">collection</exception>\n        public BagCollection(IndexedCollection<T> collection)\n        {\n            collection.ThrowIfNull(nameof(collection));\n\n            m_items = new Dictionary<long, T>();\n\n            foreach (T item in collection.Items)\n            {\n                m_items[item.ID] = item;\n            }\n        }\n\n        /// <summary>\n        /// Determines whether the specified id has value.\n        /// </summary>\n        /// <param name=\"id\">The id.</param>\n        /// <returns>\n        /// \t<c>true</c> if the specified id has value; otherwise, <c>false</c>.\n        /// </returns>\n        public bool HasValue(long id) => m_items.ContainsKey(id);\n\n        /// <summary>\n        /// Gets or sets the <see cref=\"T\"/> with the specified id.\n        /// </summary>\n        /// <value></value>\n        public T this[long id] => m_items[id];\n\n        /// <summary>\n        /// Gets the enumerator.\n        /// </summary>\n        /// <returns></returns>\n        public IEnumerator<T> GetEnumerator() => ((IEnumerable<T>)m_items.Values).GetEnumerator();\n\n        /// <summary>\n        /// Returns an enumerator that iterates through a collection.\n        /// </summary>\n        /// <returns>\n        /// An <see cref=\"T:System.Collections.IEnumerator\"/> object that can be used to iterate through the collection.\n        /// </returns>\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n\n\n\t/// <summary>\n\t/// A dictionary-based implementation.\n\t/// </summary>\n\t/// <typeparam name=\"T\"></typeparam>\n\tpublic sealed class LongBagCollection<T> : IEnumerable<T>\n\t\twhere T : IHasLongID\n\t{\n\t\tprivate readonly Dictionary<long, T> m_items;\n\n\t\t/// <summary>\n\t\t/// Initializes a new instance of the <see cref=\"BagCollection{T}\" /> class.\n\t\t/// </summary>\n\t\t/// <param name=\"collection\">The list.</param>\n\t\t/// <exception cref=\"System.ArgumentNullException\">collection</exception>\n\t\tpublic LongBagCollection(LongIndexedCollection<T> collection)\n\t\t{\n\t\t\tcollection.ThrowIfNull(nameof(collection));\n\n\t\t\tm_items = new Dictionary<long, T>();\n\n\t\t\tforeach (T item in collection.Items)\n\t\t\t{\n\t\t\t\tm_items[item.ID] = item;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Determines whether the specified id has value.\n\t\t/// </summary>\n\t\t/// <param name=\"id\">The id.</param>\n\t\t/// <returns>\n\t\t/// \t<c>true</c> if the specified id has value; otherwise, <c>false</c>.\n\t\t/// </returns>\n\t\tpublic bool HasValue(long id) => m_items.ContainsKey(id);\n\n\t\t/// <summary>\n\t\t/// Gets or sets the <see cref=\"T\"/> with the specified id.\n\t\t/// </summary>\n\t\t/// <value></value>\n\t\tpublic T this[long id] => m_items[id];\n\n\t\t/// <summary>\n\t\t/// Gets the enumerator.\n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic IEnumerator<T> GetEnumerator() => ((IEnumerable<T>)m_items.Values).GetEnumerator();\n\n\t\t/// <summary>\n\t\t/// Returns an enumerator that iterates through a collection.\n\t\t/// </summary>\n\t\t/// <returns>\n\t\t/// An <see cref=\"T:System.Collections.IEnumerator\"/> object that can be used to iterate through the collection.\n\t\t/// </returns>\n\t\tIEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n\t}\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Collections/IndexedCollection.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.Collections\n{\n    /// <summary>\n    /// A collection of indexed items.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public sealed class IndexedCollection<T> : IEnumerable<T>\n        where T : IHasID\n    {\n        private readonly Collection<T> m_items; \n\n        /// <summary>\n        /// Constructor.\n        /// </summary>\n        public IndexedCollection()\n        {\n            m_items = new Collection<T>();\n        }\n\n        /// <summary>\n        /// List of items in the collection.\n        /// </summary>\n        [XmlElement(\"item\")]\n        public Collection<T> Items => m_items;\n\n        /// <summary>\n        /// Converts collection to a BagCollection.\n        /// </summary>\n        /// <returns>BagCollection of type T</returns>\n        public BagCollection<T> ToBag() => new BagCollection<T>(this);\n\n        /// <summary>\n        /// Gets the enumerator.\n        /// </summary>\n        /// <returns></returns>\n        public IEnumerator<T> GetEnumerator() => m_items.GetEnumerator();\n\n        /// <summary>\n        /// Returns an enumerator that iterates through a collection.\n        /// </summary>\n        /// <returns>\n        /// An <see cref=\"T:System.Collections.IEnumerator\"/> object that can be used to iterate through the collection.\n        /// </returns>\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n\n\t/// <summary>\n\t/// A collection of indexed items.\n\t/// </summary>\n\t/// <typeparam name=\"T\"></typeparam>\n\tpublic sealed class LongIndexedCollection<T> : IEnumerable<T>\n\t\twhere T : IHasLongID\n\t{\n\t\tprivate readonly Collection<T> m_items;\n\n\t\t/// <summary>\n\t\t/// Constructor.\n\t\t/// </summary>\n\t\tpublic LongIndexedCollection()\n\t\t{\n\t\t\tm_items = new Collection<T>();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// List of items in the collection.\n\t\t/// </summary>\n\t\t[XmlElement(\"item\")]\n\t\tpublic Collection<T> Items => m_items;\n\n\t\t/// <summary>\n\t\t/// Converts collection to a BagCollection.\n\t\t/// </summary>\n\t\t/// <returns>BagCollection of type T</returns>\n\t\tpublic LongBagCollection<T> ToBag() => new LongBagCollection<T>(this);\n\n\t\t/// <summary>\n\t\t/// Gets the enumerator.\n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic IEnumerator<T> GetEnumerator() => m_items.GetEnumerator();\n\n\t\t/// <summary>\n\t\t/// Returns an enumerator that iterates through a collection.\n\t\t/// </summary>\n\t\t/// <returns>\n\t\t/// An <see cref=\"T:System.Collections.IEnumerator\"/> object that can be used to iterate through the collection.\n\t\t/// </returns>\n\t\tIEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n\t}\n\n}"
  },
  {
    "path": "tools/XmlGenerator/Collections/RelationSetCollection.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing EVEMon.Common.Extensions;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.Collections\n{\n    public sealed class RelationSetCollection<T> : IEnumerable<T>\n        where T : class, IRelation\n    {\n        /// <summary>\n        /// Used to generate a unique, comparable key for the internal dictionary.\n        /// </summary>\n        private struct Relation : IRelation\n        {\n            int Left { get; set; }\n            int Center { get; set; }\n            int Right { get; set; }\n\n            int IRelation.Left => Left;\n\n            int IRelation.Center => Center;\n\n            int IRelation.Right => Right;\n\n            public Relation(int left, int center, int right)\n            {\n                Left = left;\n                Center = center;\n                Right = right;\n            }\n\n            public override bool Equals(object obj)\n            {\n                if (obj != null && obj is Relation r)\n                {\n                    return r.Left == Left && r.Center == Center && r.Right == Right;\n                }\n\n                return false;\n            }\n\n            public override int GetHashCode()\n            {\n                unchecked\n                {\n                    int hash = 17;\n                    hash = hash * 23 + Left.GetHashCode();\n                    hash = hash * 23 + Center.GetHashCode();\n                    hash = hash * 23 + Right.GetHashCode();\n                    return hash;\n                }\n            }\n        }\n\n        private readonly Dictionary<Relation, T> m_dictionary;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"RelationSetCollection{T}\" /> class.\n        /// </summary>\n        /// <param name=\"src\">The SRC.</param>\n        /// <exception cref=\"System.ArgumentNullException\">src</exception>\n        public RelationSetCollection(IEnumerable<T> src)\n        {\n            src.ThrowIfNull(nameof(src));\n\n            m_dictionary = new Dictionary<Relation, T>();\n            foreach (T item in src)\n            {\n                m_dictionary[GetKey(item)] = item;\n            }\n        }\n\n        /// <summary>\n        /// Determines whether [contains] [the specified left].\n        /// </summary>\n        /// <param name=\"left\">The left.</param>\n        /// <param name=\"center\">The center.</param>\n        /// <param name=\"right\">The right.</param>\n        /// <returns>\n        ///   <c>true</c> if [contains] [the specified left]; otherwise, <c>false</c>.\n        /// </returns>\n        public bool Contains(int left, int center, int right) \n            => m_dictionary.ContainsKey(GetKey(left, center, right));\n\n        /// <summary>\n        /// Determines whether the collection contains the specified item, based on the <see cref=\"IRelation\"/> properties of the input.\n        /// </summary>\n        /// <param name=\"relation\">The identifying properties of the item to check for.</param>\n        /// <returns></returns>\n        public bool Contains(IRelation relation)\n            => m_dictionary.ContainsKey(GetKey(relation));\n\n        /// <summary>\n        /// Gets the specified left.\n        /// </summary>\n        /// <param name=\"left\">The left.</param>\n        /// <param name=\"center\">The center.</param>\n        /// <param name=\"right\">The right.</param>\n        /// <returns></returns>\n        public T Get(int left, int center, int right)\n        {\n            T value;\n            m_dictionary.TryGetValue(GetKey(left, center, right), out value);\n            return value;\n        }\n\n        /// <summary>\n        /// Gets the specified item from the collection based on the <see cref=\"IRelation\"/> properties of the input.\n        /// </summary>\n        /// <param name=\"relation\">The identifying properties of the item to get.</param>\n        /// <returns></returns>\n        public T Get(IRelation relation)\n            => Get(relation.Left, relation.Center, relation.Right);\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <param name=\"relation\">The relation.</param>\n        /// <returns></returns>\n        private static Relation GetKey(IRelation relation)\n            => GetKey(relation.Left, relation.Center, relation.Right);\n\n        /// <summary>\n        /// Gets the key.\n        /// </summary>\n        /// <param name=\"left\">The left.</param>\n        /// <param name=\"center\">The center.</param>\n        /// <param name=\"right\">The right.</param>\n        /// <returns></returns>\n        private static Relation GetKey(int left, int center, int right)\n            => new Relation(left, center, right);\n\n        /// <summary>\n        /// Gets the enumerator.\n        /// </summary>\n        /// <returns></returns>\n        public IEnumerator<T> GetEnumerator() => ((IEnumerable<T>)m_dictionary.Values).GetEnumerator();\n\n        /// <summary>\n        /// Returns an enumerator that iterates through a collection.\n        /// </summary>\n        /// <returns>\n        /// An <see cref=\"T:System.Collections.IEnumerator\"/> object that can be used to iterate through the collection.\n        /// </returns>\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Datafiles/Blueprints.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Datafiles;\nusing EVEMon.XmlGenerator.Interfaces;\nusing EVEMon.XmlGenerator.Providers;\nusing EVEMon.XmlGenerator.StaticData;\nusing EVEMon.XmlGenerator.Utils;\n\nnamespace EVEMon.XmlGenerator.Datafiles\n{\n    internal static class Blueprints\n    {\n        private static List<InvMarketGroups> s_injectedMarketGroups;\n        private static List<InvTypes> s_nullMarketBlueprints;\n\n        /// <summary>\n        /// Generate the skills datafile.\n        /// </summary>\n        internal static void GenerateDatafile()\n        {\n            Stopwatch stopwatch = Stopwatch.StartNew();\n            Util.ResetCounters();\n\n            Console.WriteLine();\n            Console.Write(@\"Generating blueprints datafile... \");\n\n            // Configure blueprints with Null market group\n            ConfigureNullMarketBlueprint();\n\n            Dictionary<int, SerializableBlueprintMarketGroup> groups = new Dictionary<int, SerializableBlueprintMarketGroup>();\n\n            // Export blueprint groups           \n            CreateMarketGroups(groups);\n\n            // Create the parent-children groups relations\n            foreach (SerializableBlueprintMarketGroup group in groups.Values)\n            {\n                IEnumerable<SerializableBlueprintMarketGroup> children = Database.InvMarketGroupsTable.Concat(\n                    s_injectedMarketGroups).Where(x => x.ParentID == group.ID).Select(\n                        x => groups[x.ID]).OrderBy(x => x.Name);\n\n                group.SubGroups.AddRange(children);\n            }\n\n            // Sort groups\n            IEnumerable<SerializableBlueprintMarketGroup> blueprintGroups = Database.InvMarketGroupsTable.Concat(\n                s_injectedMarketGroups).Where(x => x.ParentID == DBConstants.BlueprintsMarketGroupID).Select(\n                    x => groups[x.ID]).OrderBy(x => x.Name);\n\n            // Reset the custom market groups\n            s_nullMarketBlueprints.ForEach(srcItem => srcItem.MarketGroupID = null);\n            Database.InvTypesTable\n                .Where(item => Database.InvGroupsTable[item.GroupID].CategoryID == DBConstants.AncientRelicsCategoryID)\n                .ToList()\n                .ForEach(x => x.MarketGroupID = DBConstants.AncientRelicsMarketGroupID);\n\n            // Serialize\n            BlueprintsDatafile datafile = new BlueprintsDatafile();\n            datafile.MarketGroups.AddRange(blueprintGroups);\n\n            Util.DisplayEndTime(stopwatch);\n\n            // DEBUG: Find which blueprints have not been generated\n            if (Debugger.IsAttached)\n            {\n                var blueprintIds = groups.Values.SelectMany(x => x.Blueprints).Select(y => y.ID).ToList();\n                // Some typeIDs are present in blueprints.yaml but not in typeIDs.yaml (glorious CCP)\n                // https://forums-archive.eveonline.com/message/6914995/#post6914995\n                var diff = Database.IndustryBlueprintsTable.Where(blueprint => Database.InvTypesTable.HasValue(blueprint.ID)\n                && !blueprintIds.Contains(blueprint.ID)).ToList();\n\n                if (diff.Any())\n                    Console.WriteLine(\"{0} blueprints were not generated.\", diff.Count);\n            }\n\n            Util.SerializeXml(datafile, DatafileConstants.BlueprintsDatafile);\n        }\n\n        /// <summary>\n        /// Creates the market groups.\n        /// </summary>\n        /// <param name=\"groups\">The groups.</param>\n        private static void CreateMarketGroups(IDictionary<int, SerializableBlueprintMarketGroup> groups)\n        {\n            foreach (InvMarketGroups marketGroup in Database.InvMarketGroupsTable.Concat(s_injectedMarketGroups))\n            {\n                SerializableBlueprintMarketGroup group = new SerializableBlueprintMarketGroup\n                {\n                    ID = marketGroup.ID,\n                    Name = marketGroup.Name,\n                };\n\n                groups[marketGroup.ID] = group;\n\n                // Add the items in this group\n                List<SerializableBlueprint> blueprints = new List<SerializableBlueprint>();\n                foreach (InvTypes item in Database.InvTypesTable.Where(\n                    item => item.MarketGroupID.GetValueOrDefault() == marketGroup.ID &&\n                            (Database.InvGroupsTable[item.GroupID].CategoryID == DBConstants.BlueprintCategoryID ||\n                             Database.InvGroupsTable[item.GroupID].CategoryID == DBConstants.AncientRelicsCategoryID)))\n                {\n                    CreateBlueprint(item, blueprints);\n                }\n\n                // Store the items\n                group.Blueprints.AddRange(blueprints.OrderBy(x => x.Name));\n            }\n        }\n\n        /// <summary>\n        /// Configures the null market blueprint.\n        /// </summary>\n        private static void ConfigureNullMarketBlueprint()\n        {\n            // Create custom market groups that don't exist in EVE\n            s_injectedMarketGroups = new List<InvMarketGroups>\n            {\n                new InvMarketGroups\n                {\n                    Name = \"Various Non-Market\",\n                    Description = \"Various blueprints not in EVE market\",\n                    ID = DBConstants.BlueprintRootNonMarketGroupID,\n                    ParentID = DBConstants.BlueprintsMarketGroupID,\n                    IconID = DBConstants.UnknownBlueprintBackdropIconID\n                },\n                new InvMarketGroups\n                {\n                    Name = \"Tech I\",\n                    Description = \"Tech I blueprints not in EVE market\",\n                    ID = DBConstants.BlueprintTechINonMarketGroupID,\n                    ParentID = DBConstants.BlueprintRootNonMarketGroupID,\n                    IconID = DBConstants.UnknownBlueprintBackdropIconID\n                },\n                new InvMarketGroups\n                {\n                    Name = \"Tech II\",\n                    Description = \"Tech II blueprints not in EVE market\",\n                    ID = DBConstants.BlueprintTechIINonMarketGroupID,\n                    ParentID = DBConstants.BlueprintRootNonMarketGroupID,\n                    IconID = DBConstants.UnknownBlueprintBackdropIconID\n                },\n                new InvMarketGroups\n                {\n                    Name = \"Storyline\",\n                    Description = \"Storyline blueprints not in EVE market\",\n                    ID = DBConstants.BlueprintStorylineNonMarketGroupID,\n                    ParentID = DBConstants.BlueprintRootNonMarketGroupID,\n                    IconID = DBConstants.UnknownBlueprintBackdropIconID\n                },\n                new InvMarketGroups\n                {\n                    Name = \"Faction\",\n                    Description = \"Faction blueprints not in EVE market\",\n                    ID = DBConstants.BlueprintFactionNonMarketGroupID,\n                    ParentID = DBConstants.BlueprintRootNonMarketGroupID,\n                    IconID = DBConstants.UnknownBlueprintBackdropIconID\n                },\n                new InvMarketGroups\n                {\n                    Name = \"Officer\",\n                    Description = \"Officer blueprints not in EVE market\",\n                    ID = DBConstants.BlueprintOfficerNonMarketGroupID,\n                    ParentID = DBConstants.BlueprintRootNonMarketGroupID,\n                    IconID = DBConstants.UnknownBlueprintBackdropIconID\n                },\n                new InvMarketGroups\n                {\n                    Name = \"Tech III\",\n                    Description = \"Tech III blueprints not in EVE market\",\n                    ID = DBConstants.BlueprintTechIIINonMarketGroupID,\n                    ParentID = DBConstants.BlueprintRootNonMarketGroupID,\n                    IconID = DBConstants.UnknownBlueprintBackdropIconID\n                },\n                new InvMarketGroups\n                {\n                    Name = \"Research Equipment\",\n                    Description = \"Items that can be invented to a Tech III blueprint not in EVE market\",\n                    ID = DBConstants.ResearchEquipmentNonMarketGroupID,\n                    ParentID = DBConstants.BlueprintRootNonMarketGroupID,\n                    IconID = DBConstants.UnknownBlueprintBackdropIconID\n                }\n            };\n\n            s_nullMarketBlueprints = Database.InvTypesTable\n                .Where(item => item.MarketGroupID == null &&\n                               Database.InvGroupsTable[item.GroupID].CategoryID == DBConstants.BlueprintCategoryID).ToList();\n\n            // Set ancient relics to research equipment custom market group\n            Database.InvTypesTable\n                .Where(item => Database.InvGroupsTable[item.GroupID].CategoryID == DBConstants.AncientRelicsCategoryID)\n                .ToList()\n                .ForEach(x => x.MarketGroupID = DBConstants.ResearchEquipmentNonMarketGroupID);\n\n            // Set the market group of the blueprints with NULL MarketGroupID to custom market groups\n            foreach (InvTypes item in s_nullMarketBlueprints)\n            {\n                // Set some blueprints to market groups manually\n                SetMarketGroupManually(item);\n\n                // Set some blueprints to custom market groups according to their metagroup\n                SetMarketGroupFromMetaGroup(item);\n\n                if (item.MarketGroupID == null)\n                    item.MarketGroupID = DBConstants.BlueprintTechINonMarketGroupID;\n            }\n        }\n\n        /// <summary>\n        /// Sets the market group.\n        /// </summary>\n        /// <param name=\"item\">The item.</param>\n        private static void SetMarketGroupManually(InvTypes item)\n        {\n            switch (item.ID)\n            {\n                case DBConstants.WildMinerIBlueprintID:\n                case DBConstants.AlphaDataAnalyzerIBlueprintID:\n                case DBConstants.DaemonDataAnalyzerIBlueprintID:\n                case DBConstants.CodexDataAnalyzerIBlueprintID:\n                case DBConstants.CropGasCloudHarvesterBlueprintID:\n                case DBConstants.Dual1000mmScoutIAcceleratorCannonBlueprintID:\n                case DBConstants.HabitatMinerIBlueprintID:\n                case DBConstants.LibramDataAnalyzerIBlueprintID:\n                case DBConstants.LimosCitadelCruiseLauncherIBlueprintID:\n                case DBConstants.MagpieMobileTractorUnitBlueprintID:\n                case DBConstants.PackratMobileTractorUnitBlueprintID:\n                case DBConstants.PlowGascloudHarvesterBlueprintID:\n                case DBConstants.ShockLimosCitadelTorpedoBayIBlueprintID:\n                case DBConstants.WetuMobileDepotBlueprintID:\n                case DBConstants.YurtMobileDepotBlueprintID:\n                    item.MarketGroupID = DBConstants.BlueprintStorylineNonMarketGroupID;\n                    break;\n\n                case DBConstants.AsteroBlueprintID:\n                case DBConstants.BarghestBlueprintID:\n                case DBConstants.CambionBlueprintID:\n                case DBConstants.ChremoasBlueprintID:\n                case DBConstants.EtanaBlueprintID:\n                case DBConstants.GarmurBlueprintID:\n                case DBConstants.MaliceBlueprintID:\n                case DBConstants.MorachaBlueprintID:\n                case DBConstants.NestorBlueprintID:\n                case DBConstants.OrthrusBlueprintID:\n                case DBConstants.PolicePursuitCometBlueprintID:\n                case DBConstants.ScorpionIshukoneWatchBlueprintID:\n                case DBConstants.ShadowBlueprintID:\n                case DBConstants.StratiosBlueprintID:\n                case DBConstants.StratiosEmergencyResponderBlueprintID:\n                case DBConstants.UtuBlueprintID:\n                case DBConstants.VangelBlueprintID:\n                case DBConstants.WhiptailBlueprintID:\n                case DBConstants.AdrestiaBlueprintID:\n                case DBConstants.EchelonBlueprintID:\n                case DBConstants.ImperialNavySlicerBlueprintID:\n                case DBConstants.CaldariNavyHookbillBlueprintID:\n                case DBConstants.FederationNavyCometBlueprintID:\n                case DBConstants.RepublicFleetFiretailBlueprintID:\n                case DBConstants.NightmareBlueprintID:\n                case DBConstants.MacharielBlueprintID:\n                case DBConstants.DramielBlueprintID:\n                case DBConstants.CruorBlueprintID:\n                case DBConstants.SuccubusBlueprintID:\n                case DBConstants.DaredevilBlueprintID:\n                case DBConstants.CynabalBlueprintID:\n                case DBConstants.AshimmuBlueprintID:\n                case DBConstants.PhantasmBlueprintID:\n                case DBConstants.GorusShuttleBlueprintID:\n                case DBConstants.GuristasShuttleBlueprintID:\n                case DBConstants.GallenteMiningLaserBlueprintID:\n                case DBConstants.InterbusShuttleBlueprintID:\n                case DBConstants.FrekiBlueprintID:\n                case DBConstants.MimirBlueprintID:\n                    item.MarketGroupID = DBConstants.BlueprintFactionNonMarketGroupID;\n                    break;\n\n                case DBConstants.BladeBlueprintID:\n                case DBConstants.BlazeLBlueprintID:\n                case DBConstants.BlazeMBlueprintID:\n                case DBConstants.BlazeSBlueprintID:\n                case DBConstants.BoltLBlueprintID:\n                case DBConstants.BoltMBlueprintID:\n                case DBConstants.BoltSBlueprintID:\n                case DBConstants.CapitalRemoteCapacitorTransmitterIIBlueprintID:\n                case DBConstants.CapitalRemoteShieldBoosterIIBlueprintID:\n                case DBConstants.ChameleonBlueprintID:\n                case DBConstants.DaggerBlueprintID:\n                case DBConstants.DesolationLBlueprintID:\n                case DBConstants.DesolationMBlueprintID:\n                case DBConstants.DesolationSBlueprintID:\n                case DBConstants.DroneDamageRigIIBlueprintID:\n                case DBConstants.ErinyeBlueprintID:\n                case DBConstants.GathererBlueprintID:\n                case DBConstants.HighGradeAscendancyAlphaBlueprintID:\n                case DBConstants.HighGradeAscendancyBetaBlueprintID:\n                case DBConstants.HighGradeAscendancyGammaBlueprintID:\n                case DBConstants.HighGradeAscendancyDeltaBlueprintID:\n                case DBConstants.HighGradeAscendancyEpsilonBlueprintID:\n                case DBConstants.HighGradeAscendancyOmegaBlueprintID:\n                case DBConstants.KisharBlueprintID:\n                case DBConstants.LuxLBlueprintID:\n                case DBConstants.LuxMBlueprintID:\n                case DBConstants.LuxSBlueprintID:\n                case DBConstants.MackinawOREDevelopmentEditionBlueprintID:\n                case DBConstants.MediumEWDroneRangeAugmentorIIBlueprintID:\n                case DBConstants.MidGradeAscenancyAlphaBlueprintID:\n                case DBConstants.MidGradeAscenancyBetaBlueprintID:\n                case DBConstants.MidGradeAscenancyGammaBlueprintID:\n                case DBConstants.MidGradeAscenancyDeltaBlueprintID:\n                case DBConstants.MidGradeAscenancyEpsilonBlueprintID:\n                case DBConstants.MidGradeAscenancyOmegaBlueprintID:\n                case DBConstants.MinerIIChinaBlueprintID:\n                case DBConstants.MiningLaserOptimizationIIBlueprintID:\n                case DBConstants.MiningLaserRangeIIBlueprintID:\n                case DBConstants.ReconProbeLauncherIIBlueprintID:\n                case DBConstants.ScanProbeLauncherIIBlueprintID:\n                case DBConstants.ShieldTransporterRigIIBlueprintID:\n                case DBConstants.ShockLBlueprintID:\n                case DBConstants.ShockMBlueprintID:\n                case DBConstants.ShockSBlueprintID:\n                case DBConstants.SmallEWDroneRangeAugmentorIIBlueprintID:\n                case DBConstants.StormLBlueprintID:\n                case DBConstants.StormMBlueprintID:\n                case DBConstants.StormSBlueprintID:\n                case DBConstants.TalismanAlphaBlueprintID:\n                    item.MarketGroupID = DBConstants.BlueprintTechIINonMarketGroupID;\n                    break;\n\n                case DBConstants.LegionBlueprintID:\n                case DBConstants.LegionDefensiveAdaptiveAugmenterBlueprintID:\n                case DBConstants.LegionElectronicsEnergyParasiticComplexBlueprintID:\n                case DBConstants.LegionEngineeringPowerCoreMultiplierBlueprintID:\n                case DBConstants.LegionOffensiveDroneSynthesisProjectorBlueprintID:\n                case DBConstants.LegionPropulsionChassisOptimizationBlueprintID:\n                case DBConstants.LokiBlueprintID:\n                case DBConstants.LokiDefensiveAdaptiveShieldingBlueprintID:\n                case DBConstants.LokiElectronicsImmobilityDriversBlueprintID:\n                case DBConstants.LokiEngineeringPowerCoreMultiplierBlueprintID:\n                case DBConstants.LokiOffensiveTurretConcurrenceRegistryBlueprintID:\n                case DBConstants.LokiPropulsionChassisOptimizationBlueprintID:\n                case DBConstants.ProteusBlueprintID:\n                case DBConstants.ProteusDefensiveAdaptiveAugmenterBlueprintID:\n                case DBConstants.ProteusElectronicsFrictionExtensionProcessorBlueprintID:\n                case DBConstants.ProteusEngineeringPowerCoreMultiplierBlueprintID:\n                case DBConstants.ProteusOffensiveDissonicEncodingPlatformBlueprintID:\n                case DBConstants.ProteusPropulsionWakeLimiterBlueprintID:\n                case DBConstants.TenguBlueprintID:\n                case DBConstants.TenguDefensiveAdaptiveShieldingBlueprintID:\n                case DBConstants.TenguElectronicsObfuscationManifoldBlueprintID:\n                case DBConstants.TenguEngineeringPowerCoreMultiplierBlueprintID:\n                case DBConstants.TenguOffensiveAcceleratedEjectionBayBlueprintID:\n                case DBConstants.TenguPropulsionIntercalatedNanofibersBlueprintID:\n                    item.MarketGroupID = DBConstants.BlueprintTechIIINonMarketGroupID;\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Sets the market group from meta group.\n        /// </summary>\n        /// <param name=\"item\">The item.</param>\n        private static void SetMarketGroupFromMetaGroup(InvTypes item)\n        {\n            // Guard in case an item of blueprint type is not contained in the blueprints table (glorious CCP)\n            if (!Database.IndustryBlueprintsTable.HasValue(item.ID))\n                return;\n\n            var blueprint = Database.IndustryBlueprintsTable[item.ID];\n\n            var productTypeID = Database.IndustryActivityProductsTable.Where(\n                x => x.BlueprintTypeID == item.ID &&\n                x.ActivityID == (int)BlueprintActivity.Manufacturing).Select(\n                    x => x.ProductTypeID).SingleOrDefault();\n\n            int relation = Database.InvMetaTypesTable.Where(\n                x => x.ItemID == productTypeID).Select(\n                    x => x.MetaGroupID).FirstOrDefault();\n\n            switch (relation)\n            {\n                case DBConstants.TechIIMetaGroupID:\n                    item.MarketGroupID = DBConstants.BlueprintTechIINonMarketGroupID;\n                    break;\n                case DBConstants.StorylineMetaGroupID:\n                    item.MarketGroupID = DBConstants.BlueprintStorylineNonMarketGroupID;\n                    break;\n                case DBConstants.FactionMetaGroupID:\n                    item.MarketGroupID = DBConstants.BlueprintFactionNonMarketGroupID;\n                    break;\n                case DBConstants.OfficerMetaGroupID:\n                    item.MarketGroupID = DBConstants.BlueprintOfficerNonMarketGroupID;\n                    break;\n                case DBConstants.TechIIIMetaGroupID:\n                    item.MarketGroupID = DBConstants.BlueprintTechIIINonMarketGroupID;\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Add properties to a blueprint.\n        /// </summary>\n        /// <param name=\"srcBlueprint\"></param>\n        /// <param name=\"blueprintsGroup\"></param>\n        /// <returns></returns>\n        private static void CreateBlueprint(InvTypes srcBlueprint, ICollection<SerializableBlueprint> blueprintsGroup)\n        {\n            Util.UpdatePercentDone(Database.BlueprintsTotalCount);\n\n            // Guard in case an item of blueprint type is not contained in the blueprints table (glorious CCP)\n            if (!Database.IndustryBlueprintsTable.HasValue(srcBlueprint.ID))\n                return;\n\n            var blueprintType = Database.IndustryBlueprintsTable[srcBlueprint.ID];\n\n            var productType = Database.IndustryActivityProductsTable.Where(\n                x => x.BlueprintTypeID == srcBlueprint.ID &&\n                x.ActivityID == (int)BlueprintActivity.Manufacturing)\n                .SingleOrDefault();\n\n            var tempActivity = new IndustryActivity() { BlueprintTypeID = srcBlueprint.ID, ActivityID = (int)BlueprintActivity.Manufacturing };\n            var productionTime = Database.IndustryActivityTable.Get(tempActivity)?.Time;\n\n            tempActivity.ActivityID = (int)BlueprintActivity.ResearchingMaterialEfficiency;\n            var researchProductivityTime = Database.IndustryActivityTable.Get(tempActivity)?.Time;\n\n            tempActivity.ActivityID = (int)BlueprintActivity.ResearchingMaterialEfficiency;\n            var researchMaterialTime = Database.IndustryActivityTable.Get(tempActivity)?.Time;\n\n            tempActivity.ActivityID = (int)BlueprintActivity.Copying;\n            var researchCopyTime = Database.IndustryActivityTable.Get(tempActivity)?.Time;\n\n            tempActivity.ActivityID = (int)BlueprintActivity.Invention;\n            var inventionTime = Database.IndustryActivityTable.Get(tempActivity)?.Time;\n\n            tempActivity.ActivityID = (int)BlueprintActivity.ReverseEngineering;\n            var reverseEngineeringTime = Database.IndustryActivityTable.Get(tempActivity)?.Time;\n\n            tempActivity.ActivityID = (int)BlueprintActivity.Reactions;\n            var reactionTime = Database.IndustryActivityTable.Get(tempActivity)?.Time;\n\n\n\n            // Creates the blueprint with base informations\n            SerializableBlueprint blueprint = new SerializableBlueprint\n            {\n                ID = srcBlueprint.ID,\n                Name = srcBlueprint.Name,\n                Icon = srcBlueprint.IconID.HasValue\n                    ? Database.EveIconsTable[srcBlueprint.IconID.Value].Icon\n                    : string.Empty,\n                ProduceItemID = (productType?.ProductTypeID).GetValueOrDefault(),\n                ProductionTime = productionTime.GetValueOrDefault(),\n                ResearchProductivityTime = researchProductivityTime.GetValueOrDefault(),\n                ResearchMaterialTime = researchMaterialTime.GetValueOrDefault(),\n                ResearchCopyTime = researchCopyTime.GetValueOrDefault(),\n                InventionTime = inventionTime.GetValueOrDefault(),\n                ReverseEngineeringTime = reverseEngineeringTime.GetValueOrDefault(),\n                ReactionTime = reactionTime.GetValueOrDefault(),\n                MaxProductionLimit = blueprintType.MaxProductionLimit,\n            };\n\n            // Metagroup\n            SetBlueprintMetaGroup(srcBlueprint, blueprint);\n\n            // Export item requirements\n            GetRequirements(srcBlueprint, blueprint);\n\n            // Look for the tech 2 or tech 3 variations that this blueprint invents\n            GetInventingItems(srcBlueprint, blueprint);\n\n            // Look for reaction output\n            GetReactionItems(srcBlueprint, blueprint);\n\n            // Add this item\n            blueprintsGroup.Add(blueprint);\n        }\n\n        /// <summary>\n        /// Gets the reaction items.\n        /// </summary>\n        private static void GetReactionItems(InvTypes srcBlueprint, SerializableBlueprint blueprint)\n        {\n            if (Database.IndustryActivityTable.Contains(new IndustryActivity()\n            {\n                ActivityID = (int)BlueprintActivity.Reactions,\n                BlueprintTypeID = srcBlueprint.ID\n            }))\n            {\n                var outcome = Database.IndustryActivityProductsTable.SingleOrDefault(x =>\n                 (x.ActivityID == (int)BlueprintActivity.Reactions || x.ActivityID == (int)BlueprintActivity.SimpleReactions)\n                 && x.BlueprintTypeID == srcBlueprint.ID);\n\n                if (outcome?.Quantity != null)\n                    blueprint.ReactionOutcome = new SerializableMaterialQuantity()\n                    {\n                        ID = outcome.ProductTypeID,\n                        Quantity = outcome.Quantity.Value\n                    };\n            }\n\n            if (Database.IndustryActivityTable.Contains(new IndustryActivity()\n            {\n                ActivityID = (int)BlueprintActivity.SimpleReactions,\n                BlueprintTypeID = srcBlueprint.ID\n            }))\n            {\n                var outcome = Database.IndustryActivityProductsTable.SingleOrDefault(x =>\n                 (x.ActivityID == (int)BlueprintActivity.Reactions || x.ActivityID == (int)BlueprintActivity.SimpleReactions)\n                 && x.BlueprintTypeID == srcBlueprint.ID);\n\n                if (outcome?.Quantity != null)\n                    blueprint.ReactionOutcome = new SerializableMaterialQuantity()\n                    {\n                        ID = outcome.ProductTypeID,\n                        Quantity = outcome.Quantity.Value\n                    };\n            }\n        }\n\n        /// <summary>\n        /// Gets the inventing items.\n        /// </summary>\n        /// <param name=\"srcBlueprint\">The source blueprint.</param>\n        /// <param name=\"blueprint\">The blueprint.</param>\n        private static void GetInventingItems(InvTypes srcBlueprint, SerializableBlueprint blueprint)\n        {\n            foreach (var requirement in Database.IndustryActivityProbabilitiesTable.Where(x =>\n                 x.BlueprintTypeID == srcBlueprint.ID &&\n                 Database.IndustryBlueprintsTable.HasValue(x.ProductTypeID) &&\n                 (x.ActivityID == (int)BlueprintActivity.Invention ||\n                 x.ActivityID == (int)BlueprintActivity.ReverseEngineering)))\n            {\n                blueprint.InventionTypeIDs.Add(requirement.ProductTypeID, requirement.Probability.GetValueOrDefault());\n            }\n        }\n\n        /// <summary>\n        /// Sets the blueprint meta group.\n        /// </summary>\n        /// <param name=\"srcBlueprint\">The SRC blueprint.</param>\n        /// <param name=\"blueprint\">The blueprint.</param>\n        private static void SetBlueprintMetaGroup(InvTypes srcBlueprint, SerializableBlueprint blueprint)\n        {\n            var productTypeID = Database.IndustryActivityProductsTable.Where(\n                x => x.BlueprintTypeID == srcBlueprint.ID &&\n                x.ActivityID == (int)BlueprintActivity.Manufacturing).Select(\n                    x => x.ProductTypeID).SingleOrDefault();\n\n            foreach (InvMetaTypes relation in Database.InvMetaTypesTable.Where(\n                x => x.ItemID == productTypeID))\n            {\n                switch (relation.MetaGroupID)\n                {\n                    default:\n                        blueprint.MetaGroup = ItemMetaGroup.T1;\n                        break;\n                    case DBConstants.TechIIMetaGroupID:\n                        blueprint.MetaGroup = ItemMetaGroup.T2;\n                        break;\n                    case DBConstants.StorylineMetaGroupID:\n                        blueprint.MetaGroup = ItemMetaGroup.Storyline;\n                        break;\n                    case DBConstants.FactionMetaGroupID:\n                        blueprint.MetaGroup = ItemMetaGroup.Faction;\n                        break;\n                    case DBConstants.OfficerMetaGroupID:\n                        blueprint.MetaGroup = ItemMetaGroup.Officer;\n                        break;\n                    case DBConstants.DeadspaceMetaGroupID:\n                        blueprint.MetaGroup = ItemMetaGroup.Deadspace;\n                        break;\n                    case DBConstants.TechIIIMetaGroupID:\n                        blueprint.MetaGroup = ItemMetaGroup.T3;\n                        break;\n                }\n            }\n\n            // Metagroup for the custom market groups\n            switch (srcBlueprint.MarketGroupID)\n            {\n                case DBConstants.BlueprintStorylineNonMarketGroupID:\n                    blueprint.MetaGroup = ItemMetaGroup.Storyline;\n                    break;\n                case DBConstants.BlueprintFactionNonMarketGroupID:\n                    blueprint.MetaGroup = ItemMetaGroup.Faction;\n                    break;\n                case DBConstants.BlueprintOfficerNonMarketGroupID:\n                    blueprint.MetaGroup = ItemMetaGroup.Officer;\n                    break;\n                case DBConstants.BlueprintTechIIINonMarketGroupID:\n                    blueprint.MetaGroup = ItemMetaGroup.T3;\n                    break;\n                case DBConstants.BlueprintTechIINonMarketGroupID:\n                    blueprint.MetaGroup = ItemMetaGroup.T2;\n                    break;\n            }\n\n            if (blueprint.MetaGroup == ItemMetaGroup.None)\n                blueprint.MetaGroup = ItemMetaGroup.T1;\n        }\n\n        /// <summary>\n        /// Get's the item requirements. \n        /// </summary>\n        /// <param name=\"srcBlueprint\"></param>\n        /// <param name=\"blueprint\"></param>\n        private static void GetRequirements(IHasID srcBlueprint, SerializableBlueprint blueprint)\n        {\n            List<SerializablePrereqSkill> prerequisiteSkills = new List<SerializablePrereqSkill>();\n            List<SerializableRequiredMaterial> requiredMaterials = new List<SerializableRequiredMaterial>();\n\n            // Find required skills\n            foreach (var requirement in Database.IndustryActivitySkillsTable\n                .Where(x => x.BlueprintTypeID == srcBlueprint.ID))\n            {\n                if (requirement.Level.HasValue)\n                {\n                    prerequisiteSkills.Add(new SerializablePrereqSkill\n                    {\n                        ID = requirement.SkillID,\n                        Level = requirement.Level.Value,\n                        Activity = requirement.ActivityID\n                    });\n                }\n            }\n\n            // Find required materials\n            foreach (var requirement in Database.IndustryActivityMaterialsTable\n                .Where(x => x.BlueprintTypeID == srcBlueprint.ID))\n            {\n                if (requirement.Quantity.HasValue)\n                {\n                    requiredMaterials.Add(new SerializableRequiredMaterial\n                    {\n                        ID = requirement.MaterialTypeID,\n                        Quantity = requirement.Quantity.Value,\n                        Activity = requirement.ActivityID,\n                    });\n                }\n            }\n\n            // Add prerequisite skills to item\n            blueprint.PrereqSkill.AddRange(prerequisiteSkills.OrderBy(x => x.Activity));\n\n            // Add required materials to item\n            blueprint.ReqMaterial.AddRange(requiredMaterials.OrderBy(x => x.Activity));\n        }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Datafiles/Certificates.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Datafiles;\nusing EVEMon.XmlGenerator.Interfaces;\nusing EVEMon.XmlGenerator.Providers;\nusing EVEMon.XmlGenerator.StaticData;\nusing EVEMon.XmlGenerator.Utils;\n\nnamespace EVEMon.XmlGenerator.Datafiles\n{\n    internal static class Certificates\n    {\n        /// <summary>\n        /// Generate the certificates datafile.\n        /// </summary>        \n        internal static void GenerateDatafile()\n        {\n            Stopwatch stopwatch = Stopwatch.StartNew();\n            Util.ResetCounters();\n\n            Console.WriteLine();\n            Console.Write(@\"Generating certificates datafile... \");\n\n            // Export certificates groups\n            List<SerializableCertificateGroup> listOfCertGroups = new List<SerializableCertificateGroup>();\n\n            foreach (InvGroups group in Database.CrtCertificatesTable.GroupBy(x => x.GroupID)\n                .Select(x => Database.InvGroupsTable[x.Key]).OrderBy(x => x.Name))\n            {\n                SerializableCertificateGroup crtGroup = new SerializableCertificateGroup\n                {\n                    ID = group.ID,\n                    Name = group.Name,\n                    Description = group.Description\n                };\n\n                // Add classes to categories\n                crtGroup.Classes.AddRange(ExportCertificateClasses(group).OrderBy(x => x.Name));\n\n                //// Add category\n                listOfCertGroups.Add(crtGroup);\n            }\n\n            // Serialize\n            CertificatesDatafile datafile = new CertificatesDatafile();\n            datafile.Groups.AddRange(listOfCertGroups);\n\n            Util.DisplayEndTime(stopwatch);\n\n            Util.SerializeXml(datafile, DatafileConstants.CertificatesDatafile);\n        }\n\n        /// <summary>\n        /// Exports the certificates classes.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <returns></returns>\n        private static IEnumerable<SerializableCertificateClass> ExportCertificateClasses(IHasID group)\n        {\n            List<SerializableCertificateClass> listOfCertClasses = new List<SerializableCertificateClass>();\n\n            // Exclude unused classes\n            foreach (CrtClasses certClass in Database.CrtClassesTable)\n            {\n                Util.UpdatePercentDone(Database.CertificatesTotalCount);\n\n                SerializableCertificateClass crtClass = new SerializableCertificateClass\n                {\n                    ID = certClass.ID,\n                    Name = certClass.ClassName,\n                    Description = certClass.Description\n                };\n\n                // Export certificate\n                SerializableCertificate certificate = Database.CrtCertificatesTable\n                    .Where(x => x.ClassID == certClass.ID && x.GroupID == group.ID).Select(ExportCertificate).FirstOrDefault();\n\n                if (certificate == null)\n                    continue;\n\n                // Add certificate to class\n                crtClass.Certificate = certificate;\n\n                // Add certificate class to classes\n                listOfCertClasses.Add(crtClass);\n            }\n            return listOfCertClasses;\n        }\n\n        /// <summary>\n        /// Exports the certificate.\n        /// </summary>\n        /// <param name=\"certificate\">The certificate.</param>\n        private static SerializableCertificate ExportCertificate(CrtCertificates certificate)\n        {\n\n            SerializableCertificate crtCertificate = new SerializableCertificate\n            {\n                ID = certificate.ID,\n                Description = certificate.Description\n            };\n\n            // Export prerequesities\n            IEnumerable<SerializableCertificatePrerequisite> listOfPrereq = Database.CrtRelationshipsTable\n                .Where(x => x.ChildID == certificate.ID && x.ParentLevel != 0)\n                .Select(relationship => new SerializableCertificatePrerequisite\n                {\n                    ID = Database.InvTypesTable[relationship.ParentTypeID].ID,\n                    Skill = Database.InvTypesTable[relationship.ParentTypeID].Name,\n                    Level = relationship.ParentLevel.ToString(CultureInfo.InvariantCulture),\n                    Grade = (CertificateGrade)Enum.ToObject(typeof(CertificateGrade), relationship.Grade),\n                });\n\n            //Add prerequisites to certificate\n            crtCertificate.Prerequisites.AddRange(listOfPrereq.OrderBy(x => x.Grade));\n\n            // Add recommendations to certificate\n            IEnumerable<SerializableCertificateRecommendation> listOfRecommendations = Database.CrtRecommendationsTable.Where(\n                x => x.CertificateID == certificate.ID)\n                .Select(recommendation => new SerializableCertificateRecommendation\n                {\n                    ID = recommendation.ShipTypeID,\n                    ShipName = Database.InvTypesTable[recommendation.ShipTypeID].Name,\n                });\n\n            crtCertificate.Recommendations.AddRange(listOfRecommendations);\n\n            // Add certificate\n            return crtCertificate;\n        }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Datafiles/Geography.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Datafiles;\nusing EVEMon.XmlGenerator.Interfaces;\nusing EVEMon.XmlGenerator.Providers;\nusing EVEMon.XmlGenerator.StaticData;\nusing EVEMon.XmlGenerator.Utils;\n\nnamespace EVEMon.XmlGenerator.Datafiles\n{\n    internal static class Geography\n    {\n        private const double BaseDistance = 1.0E14;\n\n        private static Dictionary<int, IGrouping<int, InvItems>> Planets;\n\n        /// <summary>\n        /// Generates the geography datafile.\n        /// </summary>\n        internal static void GenerateDatafile()\n        {\n            Stopwatch stopwatch = Stopwatch.StartNew();\n            Util.ResetCounters();\n\n            Console.WriteLine();\n            Console.Write(@\"Generating geography datafile... \");\n\n            // Get the planets out of InvItems so we don't have to iterate all of them each time\n            Planets = Database.InvItemsTable.Where(x =>\n            Database.MapSolarSystemsTable.HasValue(x.LocationID) // item location is a solar system\n            && Database.InvTypesTable.HasValue(x.TypeID) // item has a valid type (CCP...)\n            && Database.InvTypesTable[x.TypeID].GroupID == 7) // type group is planet\n            .GroupBy(x => x.LocationID)\n            .ToDictionary(x => x.Key, x => x);\n\n            // Regions\n            IEnumerable<SerializableRegion> regions = Database.MapRegionsTable.Select(\n                srcRegion =>\n                {\n                    Util.UpdatePercentDone(Database.GeographyTotalCount);\n                    SerializableRegion region = new SerializableRegion\n                    {\n                        ID = srcRegion.ID,\n                        Name = srcRegion.Name\n                    };\n\n                    // Constellations\n                    region.Constellations.AddRange(ExportConstellations(srcRegion).OrderBy(x => x.Name));\n                    return region;\n                });\n\n            // Jumps\n            IEnumerable<SerializableJump> jumps = Database.MapSolarSystemJumpsTable.Where(srcJump => srcJump.A < srcJump.B)\n                .Select(srcJump => new SerializableJump\n                {\n                    FirstSystemID = srcJump.A,\n                    SecondSystemID = srcJump.B\n                });\n\n            // Serialize\n            GeoDatafile datafile = new GeoDatafile();\n            datafile.Regions.AddRange(regions.OrderBy(x => x.Name));\n            datafile.Jumps.AddRange(jumps);\n\n            Util.DisplayEndTime(stopwatch);\n\n            Util.SerializeXml(datafile, DatafileConstants.GeographyDatafile);\n        }\n\n        /// <summary>\n        /// Exports the constellations.\n        /// </summary>\n        /// <param name=\"srcRegion\">The source region.</param>\n        /// <returns></returns>\n        private static IEnumerable<SerializableConstellation> ExportConstellations(IHasID srcRegion)\n            => Database.MapConstellationsTable.Where(x => x.RegionID == srcRegion.ID)\n                .Select(srcConstellation =>\n                {\n                    SerializableConstellation constellation = new SerializableConstellation\n                    {\n                        ID = srcConstellation.ID,\n                        Name = srcConstellation.Name\n                    };\n\n                    // Systems\n                    constellation.Systems.AddRange(ExportSystems(srcConstellation).OrderBy(x => x.Name));\n                    return constellation;\n                });\n\n        /// <summary>\n        /// Exports the systems.\n        /// </summary>\n        /// <param name=\"srcConstellation\">The source constellation.</param>\n        /// <returns></returns>\n        private static IEnumerable<SerializableSolarSystem> ExportSystems(IHasID srcConstellation)\n            => Database.MapSolarSystemsTable.Where(x => x.ConstellationID == srcConstellation.ID)\n                .Select(srcSystem =>\n                {\n                    SerializableSolarSystem system = new SerializableSolarSystem\n                    {\n                        ID = srcSystem.ID,\n                        Name = srcSystem.Name,\n                        X = (int)(srcSystem.X / BaseDistance),\n                        Y = (int)(srcSystem.Y / BaseDistance),\n                        Z = (int)(srcSystem.Z / BaseDistance),\n                        SecurityLevel = srcSystem.SecurityLevel\n                    };\n\n                    // Planets\n                    system.Planets.AddRange(ExportPlanets(srcSystem));\n                    // Stations\n                    system.Stations.AddRange(ExportStations(srcSystem).OrderBy(x => x.Name));\n                    return system;\n                });\n\n        /// <summary>\n        /// Exports the planets.\n        /// </summary>\n        /// <param name=\"srcSystem\">The SRC system.</param>\n        /// <returns></returns>\n        private static IEnumerable<SerializablePlanet> ExportPlanets(IHasID srcSystem)\n            => Planets.ContainsKey(srcSystem.ID) ? Planets[srcSystem.ID].Select(srcPlanet =>\n            {\n                SerializablePlanet planet = new SerializablePlanet\n                {\n                    ID = srcPlanet.ID,\n                    Name = Database.InvNamesTable[srcPlanet.ID].Name,\n                    TypeID = srcPlanet.TypeID\n                };\n                return planet;\n            }) : new SerializablePlanet[0];\n\n        /// <summary>\n        /// Exports the stations.\n        /// </summary>\n        /// <param name=\"srcSystem\">The SRC system.</param>\n        /// <returns></returns>\n        private static IEnumerable<SerializableStation> ExportStations(IHasID srcSystem)\n            => Database.StaStationsTable.Where(x => x.SolarSystemID == srcSystem.ID)\n                .Select(srcStation =>\n                {\n                    SerializableStation station = new SerializableStation\n                    {\n                        ID = srcStation.ID,\n                        Name = srcStation.Name,\n                        CorporationID = srcStation.CorporationID,\n                        CorporationName = Database.InvNamesTable[srcStation.CorporationID].Name,\n                        ReprocessingEfficiency = srcStation.ReprocessingEfficiency,\n                        ReprocessingStationsTake = srcStation.ReprocessingStationsTake\n                    };\n\n                    // Agents\n                    station.Agents.AddRange(ExportAgents(srcStation));\n                    return station;\n                });\n\n        /// <summary>\n        /// Exports the agents.\n        /// </summary>\n        /// <param name=\"srcStation\">The station.</param>\n        /// <returns></returns>\n        private static IEnumerable<SerializableAgent> ExportAgents(IHasLongID srcStation)\n            => Database.AgtAgentsTable\n                .Where(x => x.LocationID == srcStation.ID)\n                .Select(agent => new SerializableAgent\n                {\n                    ID = agent.ID,\n                    Level = agent.Level,\n                    Quality = agent.Quality,\n                    Name = Database.InvNamesTable[agent.ID].Name,\n                    DivisionName = Database.CrpNPCDivisionsTable[agent.DivisionID].DivisionName,\n                    AgentType = Database.AgtAgentTypesTable[agent.AgentTypeID].AgentType,\n                    ResearchSkillID = Database.AgtResearchAgentsTable.Any(x => x.ID == agent.ID)\n                        ? Database.AgtResearchAgentsTable[agent.ID].ResearchSkillID\n                        : 0,\n                    LocatorService = agent.IsLocator\n                });\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Datafiles/Items.cs",
    "content": "﻿using EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Datafiles;\nusing EVEMon.XmlGenerator.Extensions;\nusing EVEMon.XmlGenerator.Interfaces;\nusing EVEMon.XmlGenerator.Providers;\nusing EVEMon.XmlGenerator.StaticData;\nusing EVEMon.XmlGenerator.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\n\nnamespace EVEMon.XmlGenerator.Datafiles\n{\n    internal static class Items\n\t{\n\t\tprivate static List<InvMarketGroups> s_injectedMarketGroups;\n\t\tprivate static List<InvTypes> s_nullMarketItems;\n\n        private static IDictionary<int, IGrouping<int, DgmTypeAttributes>> s_dgmTypeAttributesPerItem;\n        private static IDictionary<int, IGrouping<int, InvTypes>> s_invTypesPerMarketGroup;\n        private static ISet<int> s_factionMarketGroups;\n\n\t\t/// <summary>\n\t\t/// Generate the items datafile.\n\t\t/// </summary>\n\t\tinternal static void GenerateDatafile()\n\t\t{\n\t\t\tStopwatch stopwatch = Stopwatch.StartNew();\n\t\t\tUtil.ResetCounters();\n\n\t\t\tConsole.WriteLine();\n\t\t\tConsole.Write(@\"Generating items datafile... \");\n\n            // Move non existing makret group to custom market group\n            ConfigureNonExistingMarketGroupItems();\n\n\t\t\t// Create custom market groups that do not exist in EVE\n\t\t\tConfigureNullMarketItems();\n\n            // Prepare lookup tables (after configuring the non-existent/null market group items)\n            s_invTypesPerMarketGroup = Database.InvTypesTable.GroupBy(x => x.MarketGroupID.\n                GetValueOrDefault()).ToDictionary(x => x.Key);\n            s_dgmTypeAttributesPerItem = Database.DgmTypeAttributesTable.GroupBy(x => x.ItemID).\n                ToDictionary(x => x.Key);\n            var factionGroups = DBConstants.FactionMarketGroupIDs;\n            s_factionMarketGroups = new HashSet<int>(Database.InvMarketGroupsTable.Where(\n                group => factionGroups.Contains(group.ID) || (group.ParentID.HasValue &&\n                factionGroups.Contains(group.ParentID.Value))).Select(x => x.ID));\n\n            // Create the market groups\n            var groups = new Dictionary<int, SerializableMarketGroup>();\n            CreateMarketGroups(groups);\n\n\t\t\t// Create the parent-children groups relations\n\t\t\tforeach (SerializableMarketGroup group in groups.Values)\n\t\t\t{\n\t\t\t\tvar children = Database.InvMarketGroupsTable.Concat(s_injectedMarketGroups).\n                    Where(x => x.ParentID.GetValueOrDefault() == group.ID).Select(x =>\n                    groups[x.ID]).OrderBy(x => x.Name);\n\n\t\t\t\tgroup.SubGroups.AddRange(children);\n\t\t\t}\n\n\t\t\t// Pick the family\n\t\t\tSetItemFamilyByMarketGroup(groups[DBConstants.BlueprintsMarketGroupID],\n                ItemFamily.Blueprint);\n\t\t\tSetItemFamilyByMarketGroup(groups[DBConstants.ShipsMarketGroupID],\n                ItemFamily.Ship);\n\t\t\tSetItemFamilyByMarketGroup(groups[DBConstants.ImplantsMarketGroupID],\n                ItemFamily.Implant);\n\t\t\tSetItemFamilyByMarketGroup(groups[DBConstants.DronesMarketGroupID],\n                ItemFamily.Drone);\n\t\t\tSetItemFamilyByMarketGroup(groups[DBConstants.StarbaseStructuresMarketGroupID],\n                ItemFamily.StarbaseStructure);\n\n\t\t\t// Sort groups\n\t\t\tvar rootGroups = Database.InvMarketGroupsTable.Concat(s_injectedMarketGroups).Where(\n\t\t\t\tx => !x.ParentID.HasValue).Select(x => groups[x.ID]).OrderBy(x => x.Name);\n\n\t\t\t// Reset the custom market groups\n\t\t\ts_nullMarketItems.ForEach(srcItem => srcItem.MarketGroupID = null);\n\n\t\t\t// Serialize\n\t\t\tItemsDatafile datafile = new ItemsDatafile();\n\t\t\tdatafile.MarketGroups.AddRange(rootGroups);\n\n\t\t\tUtil.DisplayEndTime(stopwatch);\n\n\t\t\t// DEBUG: Find which items have not been generated\n\t\t\tif (Debugger.IsAttached)\n\t\t\t{\n\t\t\t\tvar itemids = groups.Values.SelectMany(x => x.Items).Select(y => y.ID).ToList();\n\t\t\t\tvar diff = Database.InvTypesTable.Where(item => !itemids.Contains(item.ID)).ToList();\n\n\t\t\t\tif (diff.Any())\n\t\t\t\t\tConsole.WriteLine(\"{0} items were not generated.\", diff.Count);\n\t\t\t}\n\n\t\t\tUtil.SerializeXml(datafile, DatafileConstants.ItemsDatafile);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Creates the market groups.\n\t\t/// </summary>\n\t\t/// <param name=\"groups\">The groups.</param>\n\t\tprivate static void CreateMarketGroups(IDictionary<int, SerializableMarketGroup> groups)\n\t\t{\n            foreach (InvMarketGroups marketGroup in Database.InvMarketGroupsTable.Concat(\n                s_injectedMarketGroups))\n\t\t\t{\n\t\t\t\tvar group = new SerializableMarketGroup\n                {\n                    ID = marketGroup.ID, Name = marketGroup.Name\n                };\n\t\t\t\tgroups[marketGroup.ID] = group;\n\n\t\t\t\t// Add the items in this group; excluding implants which are added below\n\t\t\t\tvar items = new List<SerializableItem>();\n                if (s_invTypesPerMarketGroup.ContainsKey(marketGroup.ID))\n                {\n                    bool validGroup = marketGroup.ParentID != DBConstants.RootNonMarketGroupID;\n                    foreach (var srcItem in s_invTypesPerMarketGroup[marketGroup.ID])\n                    {\n                        if (!srcItem.Generated && (validGroup || Database.InvGroupsTable[\n                            srcItem.GroupID].CategoryID != DBConstants.ImplantCategoryID ||\n                            srcItem.GroupID == DBConstants.CyberLearningImplantsGroupID))\n                            CreateItem(srcItem, items);\n                    }\n                }\n\n\t\t\t\t// Store the items\n\t\t\t\tgroup.Items.AddRange(items.OrderBy(x => x.Name));\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Configures the null market items.\n\t\t/// </summary>\n\t\tprivate static void ConfigureNullMarketItems()\n\t\t{\n\t\t\ts_injectedMarketGroups = new List<InvMarketGroups>\n\t\t\t{\n\t\t\t\tnew InvMarketGroups\n\t\t\t\t{\n\t\t\t\t\tName = \"Unique Designs\",\n\t\t\t\t\tDescription = \"Ships of a unique design\",\n\t\t\t\t\tID = DBConstants.UniqueDesignsRootNonMarketGroupID,\n\t\t\t\t\tParentID = DBConstants.ShipsMarketGroupID,\n\t\t\t\t\tIconID = DBConstants.UnknownShipIconID\n\t\t\t\t},\n\t\t\t\tnew InvMarketGroups\n\t\t\t\t{\n\t\t\t\t\tName = \"Various Non-Market\",\n\t\t\t\t\tDescription = \"Non-Market Items\",\n\t\t\t\t\tID = DBConstants.RootNonMarketGroupID,\n\t\t\t\t\tParentID = null,\n\t\t\t\t\tIconID = DBConstants.UnknownIconID\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Add all items with null market group\n\t\t\ts_nullMarketItems = Database.InvTypesTable.Where(x => x.MarketGroupID == null).ToList();\n\n\t\t\t// Set some attributes to items because their MarketGroupID is NULL\n\t\t\tforeach (InvTypes srcItem in s_nullMarketItems)\n\t\t\t{\n\t\t\t\t// Set all items to market groups manually\n\t\t\t\tsrcItem.MarketGroupID = DBConstants.RootNonMarketGroupID;\n\n\t\t\t\t// Set some ships market group and race\n\t\t\t\tswitch (srcItem.ID)\n\t\t\t\t{\n\t\t\t\t\tcase DBConstants.CapsuleID:\n\t\t\t\t\t\tsrcItem.MarketGroupID = DBConstants.UniqueDesignsRootNonMarketGroupID;\n\t\t\t\t\t\tsrcItem.RaceID = (int)Race.All;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Configures the non existing market group items.\n\t\t/// </summary>\n\t\tprivate static void ConfigureNonExistingMarketGroupItems()\n\t\t{\n\t\t\tvar items = Database.InvTypesTable.Where(x => x.MarketGroupID != null && Database.\n                InvMarketGroupsTable.All(y => y.ID != x.MarketGroupID)).ToList();\n\n\t\t\tforeach (var item in items)\n\t\t\t{\n\t\t\t\titem.MarketGroupID = DBConstants.RootNonMarketGroupID;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Add properties to an item.\n\t\t/// </summary>\n\t\t/// <param name=\"srcItem\"></param>\n\t\t/// <param name=\"groupItems\"></param>\n\t\t/// <returns></returns>\n\t\tprivate static void CreateItem(InvTypes srcItem, ICollection<SerializableItem> groupItems)\n\t\t{\n\t\t\tUtil.UpdatePercentDone(Database.ItemsTotalCount);\n\n\t\t\tsrcItem.Generated = true;\n\n\t\t\tInvGroups itemGroup = Database.InvGroupsTable[srcItem.GroupID];\n\n            // Creates the item with base information\n            var categories = Database.InvCategoriesTable;\n            int cID = itemGroup.CategoryID;\n            SerializableItem item = new SerializableItem\n\t\t\t{\n\t\t\t\tID = srcItem.ID,\n\t\t\t\tName = srcItem.Name,\n\t\t\t\tDescription = srcItem.Description ?? string.Empty,\n\t\t\t\tIcon = srcItem.IconID.HasValue ? Database.EveIconsTable[srcItem.IconID.\n                    Value].Icon : string.Empty,\n\t\t\t\tPortionSize = srcItem.PortionSize,\n\t\t\t\tMetaGroup = ItemMetaGroup.None,\n\t\t\t\tGroup = itemGroup.Name,\n\t\t\t\tCategory = categories.HasValue(cID) ? Database.InvCategoriesTable[cID].Name :\n                    \"\",\n\t\t\t\tRace = (Race)Enum.ToObject(typeof(Race), srcItem.RaceID ?? 0)\n\t\t\t};\n\n            // Set race to Faction if item race is Jovian or belongs to a Faction market group\n            if (item.Race == Race.Jove || (srcItem.MarketGroupID.HasValue &&\n                    s_factionMarketGroups.Contains(srcItem.MarketGroupID.Value)))\n\t\t\t\titem.Race = Race.Faction;\n\n\t\t\t// Add traits\n\t\t\tAddTraits(srcItem, item);\n\n\t\t\t// Add the properties and prereqs\n\t\t\tAddItemPropsAndPrereq(srcItem, item);\n\n\t\t\t// Metagroup\n\t\t\tAddMetaGroup(srcItem, item);\n\n            // Look for slots\n            var typeEffects = Database.DgmTypeEffectsTable;\n            if (typeEffects.Contains(srcItem.ID, 0, DBConstants.LowSlotEffectID))\n\t\t\t\titem.Slot = ItemSlot.Low;\n\t\t\telse if (typeEffects.Contains(srcItem.ID, 0, DBConstants.MedSlotEffectID))\n\t\t\t\titem.Slot = ItemSlot.Medium;\n\t\t\telse if (typeEffects.Contains(srcItem.ID, 0, DBConstants.HiSlotEffectID))\n\t\t\t\titem.Slot = ItemSlot.High;\n\t\t\telse\n\t\t\t\titem.Slot = ItemSlot.NoSlot;\n\n\t\t\t// Add reaction info for reactions\n\t\t\tif (Database.InvGroupsTable[srcItem.GroupID].CategoryID == DBConstants.\n                    ReactionCategoryID)\n\t\t\t\tAddReactionInfo(srcItem, item);\n\n\t\t\t// Add fuel info for control towers\n\t\t\tif (srcItem.GroupID == DBConstants.ControlTowerGroupID)\n\t\t\t\tAddControlTowerFuelInfo(srcItem, item);\n\n\t\t\t// Add this item\n\t\t\tgroupItems.Add(item);\n\n\t\t\t// If the current item is not in a market group then we are done\n\t\t\tif (srcItem.MarketGroupID != DBConstants.RootNonMarketGroupID)\n\t\t\t    // Look for variations which are not in any market group\n\t\t\t    foreach (var variation in Database.InvMetaTypesTable)\n                    if (variation.ParentItemID == srcItem.ID)\n                    {\n                        var variationItem = Database.InvTypesTable[variation.ItemID];\n                        if (variationItem.Published && variationItem.MarketGroupID ==\n                            DBConstants.RootNonMarketGroupID)\n                        {\n                            variationItem.RaceID = (int)Race.Faction;\n                            CreateItem(variationItem, groupItems);\n                        }\n                    }\n\t\t}\n\n        /// <summary>\n        /// Appends formatted bonuses to the output text.\n        /// </summary>\n        /// <param name=\"bonuses\">The list of bonuses to apply.</param>\n        /// <param name=\"buffer\">The location to place the text.</param>\n        /// <returns>The number of bonuses added in this way.</returns>\n        private static int AddBonuses(IEnumerable<InvTraits> bonuses, StringBuilder buffer)\n        {\n            int count = 0;\n            foreach (InvTraits bonus in bonuses)\n            {\n                // 5\n                if (bonus.bonus.HasValue)\n                    buffer.Append(bonus.bonus);\n                // %\n                if (bonus.UnitID.HasValue)\n                    buffer.Append(Database.EveUnitsTable[bonus.UnitID.Value].DisplayName).Append(' ');\n                // bonus to Small Energy Turret damage\n                buffer.AppendLine(bonus.BonusText);\n                count++;\n            }\n            if (count > 0)\n                buffer.AppendLine();\n            return count;\n        }\n\n\t\t/// <summary>\n\t\t/// Adds the traits.\n\t\t/// </summary>\n\t\t/// <param name=\"srcItem\">The source item.</param>\n\t\t/// <param name=\"item\">The item.</param>\n\t\tprivate static void AddTraits(InvTypes srcItem, SerializableItem item)\n\t\t{\n\t\t\tif (Database.InvGroupsTable[srcItem.GroupID].CategoryID != DBConstants.ShipCategoryID)\n\t\t\t\treturn;\n\n\t\t\tvar skillBonusesText = new StringBuilder(512);\n\t\t\tvar roleBonusesText = new StringBuilder(512);\n\t\t\tvar miscBonusesText = new StringBuilder(512);\n            int numSkillBonuses = 0, numRoleBonuses, numMiscBonuses;\n\n            // Group by the bonusing skill\n            foreach (var bonuses in Database.InvTraitsTable.Where(x => x.typeID ==\n                srcItem.ID && x.skillID > 0).GroupBy(x => x.skillID))\n            {\n                int skillID = bonuses.Key ?? 0;\n                skillBonusesText.Append(Database.InvTypesTable[skillID].Name);\n                skillBonusesText.AppendLine(\" bonuses (per skill level):\");\n\n                numSkillBonuses += AddBonuses(bonuses, skillBonusesText);\n            }\n            skillBonusesText.AppendLine();\n\n            // Find the role bonuses\n            var RoleBonuses = Database.InvTraitsTable.Where(x => x.typeID == srcItem.ID &&\n                x.skillID == -1);\n            roleBonusesText.AppendLine(\"Role bonus:\");\n            numRoleBonuses = AddBonuses(RoleBonuses, roleBonusesText);\n\n\t\t\t// Find the misc bonuses\n\t\t\tvar MiscBonuses = Database.InvTraitsTable.Where(x => x.typeID == srcItem.ID &&\n                x.skillID == -2);\n\t\t\tmiscBonusesText.AppendLine(\"Misc bonus:\");\n            numMiscBonuses = AddBonuses(MiscBonuses, miscBonusesText);\n\n            // For any T3 destroyer, we need to deal with CCP being horrific cheats. The 'ship\n            // traits' are actually derived through some epic hacking from some hidden items.\n            // Hard coding some things in the short term, but need to make this MOAR BETTER.\n#if false\n            List<long> T3DIDs = new List<long> { 34562, 35683, 34317, 34828 };\n\t\t\tif (T3DIDs.Contains(item.ID))\n\t\t\t{\n\t\t\t\tDictionary<string, int> T3DModeInfo = new Dictionary<string, int>();\n\t\t\t\tT3DModeInfo.Add(\"Sharpshooter\", 0);\n\t\t\t\tT3DModeInfo.Add(\"Defense\", 0);\n\t\t\t\tT3DModeInfo.Add(\"Propulsion\", 0);\n\n\t\t\t\t// Determine which T3D we have, and get the relevant sub-item IDs\n\t\t\t\tswitch (item.ID)\n\t\t\t\t{\n\t\t\t\t\tcase 34562:\n\t\t\t\t\t\t// Svipul\n\t\t\t\t\t\tT3DModeInfo[\"Sharpshooter\"] = 34570;\n\t\t\t\t\t\tT3DModeInfo[\"Propulsion\"] = 34566;\n\t\t\t\t\t\tT3DModeInfo[\"Defense\"] = 34564;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 35683:\n\t\t\t\t\t\t// Hecate\n\t\t\t\t\t\tT3DModeInfo[\"Sharpshooter\"] = 35688;\n\t\t\t\t\t\tT3DModeInfo[\"Propulsion\"] = 35687;\n\t\t\t\t\t\tT3DModeInfo[\"Defense\"] = 35686;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 34317:\n\t\t\t\t\t\t// Confessor\n\t\t\t\t\t\tT3DModeInfo[\"Sharpshooter\"] = 34321;\n\t\t\t\t\t\tT3DModeInfo[\"Propulsion\"] = 34323;\n\t\t\t\t\t\tT3DModeInfo[\"Defense\"] = 34319;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 34828:\n\t\t\t\t\t\t// Jackdaw\n\t\t\t\t\t\tT3DModeInfo[\"Sharpshooter\"] = 35678;\n\t\t\t\t\t\tT3DModeInfo[\"Propulsion\"] = 35677;\n\t\t\t\t\t\tT3DModeInfo[\"Defense\"] = 35676;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n                foreach (var T3DMode in T3DModeInfo)\n                {\n                    int id = T3DMode.Value;\n                    if (id > 0)\n                    {\n                        var DBRecord = Database.InvTypesTable[id];\n                        miscBonusesText.Append(T3DMode.Key).AppendLine(\" Mode:\");\n                        miscBonusesText.AppendLine(DBRecord.Description).AppendLine();\n                    }\n\t\t\t\t}\n\t\t\t}\n#endif\n            // Skip if no bonuses\n            if (numSkillBonuses > 0 || numRoleBonuses > 0 || numMiscBonuses > 0)\n            {\n                var sb = new StringBuilder(1024);\n                sb.AppendLine().AppendLine().AppendLine(\"--- Traits ---\");\n                if (numSkillBonuses > 0)\n                    sb.Append(skillBonusesText.ToString());\n                if (numRoleBonuses > 0)\n                    sb.Append(roleBonusesText.ToString());\n                if (numMiscBonuses > 0)\n                    sb.Append(miscBonusesText.ToString());\n\n                // Add to item description\n                item.Description += sb.ToString();\n            }\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Adds the control tower fuel info.\n\t\t/// </summary>\n\t\t/// <param name=\"srcItem\">The source item.</param>\n\t\t/// <param name=\"item\">The item.</param>\n\t\tprivate static void AddControlTowerFuelInfo(IHasID srcItem, SerializableItem item)\n\t\t{\n\t\t\tvar controlTowerResourcesTable = Database.InvControlTowerResourcesTable.Join(\n                Database.InvControlTowerResourcePurposesTable, ctr => ctr.PurposeID,\n                ctrp => ctrp.ID, (ctr, ctrp) => new { ctr, ctrp }).Where(x =>\n                x.ctr.ID == srcItem.ID).Select(resource => new SerializableControlTowerFuel\n\t\t\t\t{\n\t\t\t\t\tID = resource.ctr.ResourceID,\n\t\t\t\t\tPurpose = resource.ctrp.PurposeName,\n\t\t\t\t\tQuantity = resource.ctr.Quantity,\n\t\t\t\t\tMinSecurityLevel = resource.ctr.MinSecurityLevel.HasValue ? resource.ctr.\n                        MinSecurityLevel.Value.ToString(CultureInfo.InvariantCulture) : string.Empty,\n\t\t\t\t\tFactionID = resource.ctr.FactionID.HasValue ? resource.ctr.FactionID.Value.\n                        ToString(CultureInfo.InvariantCulture) : string.Empty,\n\t\t\t\t\tFactionName = resource.ctr.FactionID.HasValue ? Database.ChrFactionsTable[\n                        resource.ctr.FactionID.Value].FactionName : string.Empty\n\t\t\t\t});\n\n\t\t\titem.ControlTowerFuelInfo.AddRange(controlTowerResourcesTable);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Adds the reaction info.\n\t\t/// </summary>\n\t\t/// <param name=\"srcItem\">The source item.</param>\n\t\t/// <param name=\"item\">The item.</param>\n\t\tprivate static void AddReactionInfo(IHasID srcItem, SerializableItem item)\n\t\t{\n            foreach (var srcReaction in Database.InvTypeReactionsTable)\n                if (srcReaction.ID == srcItem.ID)\n                {\n                    int reactionTypeID = srcReaction.TypeID;\n                    long multiplier = (Database.DgmTypeAttributesTable.FirstOrDefault(x =>\n                        x.ItemID == reactionTypeID && x.AttributeID == DBConstants.\n                        MoonMiningAmountPropertyID)?.GetInt64Value) ?? 1L, qty = srcReaction.\n                        Quantity;\n                    item.ReactionInfo.Add(new SerializableReactionInfo\n                    {\n                        ID = srcReaction.TypeID,\n                        IsInput = srcReaction.Input,\n                        Quantity = multiplier > 0L ? qty * multiplier : qty\n                    });\n                }\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Adds the meta group.\n\t\t/// </summary>\n\t\t/// <param name=\"srcItem\">The source item.</param>\n\t\t/// <param name=\"item\">The serializable item.</param>\n\t\tprivate static void AddMetaGroup(IHasID srcItem, SerializableItem item)\n\t\t{\n\t\t\tforeach (InvMetaTypes relation in Database.InvMetaTypesTable.Where(x => x.ItemID == srcItem.ID))\n\t\t\t\tswitch (relation.MetaGroupID)\n\t\t\t\t{\n\t\t\t\t\tcase DBConstants.TechIMetaGroupID:\n\t\t\t\t\t\titem.MetaGroup = ItemMetaGroup.T1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase DBConstants.TechIIMetaGroupID:\n\t\t\t\t\t\titem.MetaGroup = ItemMetaGroup.T2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase DBConstants.StorylineMetaGroupID:\n\t\t\t\t\t\titem.MetaGroup = ItemMetaGroup.Storyline;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase DBConstants.FactionMetaGroupID:\n\t\t\t\t\t\titem.MetaGroup = ItemMetaGroup.Faction;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase DBConstants.OfficerMetaGroupID:\n\t\t\t\t\t\titem.MetaGroup = ItemMetaGroup.Officer;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase DBConstants.DeadspaceMetaGroupID:\n\t\t\t\t\t\titem.MetaGroup = ItemMetaGroup.Deadspace;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase DBConstants.TechIIIMetaGroupID:\n\t\t\t\t\t\titem.MetaGroup = ItemMetaGroup.T3;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\titem.MetaGroup = ItemMetaGroup.None;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tif (item.MetaGroup == ItemMetaGroup.None)\n\t\t\t\titem.MetaGroup = ItemMetaGroup.T1;\n\t\t}\n\n        /// <summary>\n        /// Adds a single item property to the list if it is found in the list of recognized\n        /// property IDs.\n        /// </summary>\n        /// <param name=\"ids\">The property IDs to search.</param>\n        /// <param name=\"attrib\">The attribute to add.</param>\n        /// <param name=\"props\">The property list to add the attribute, if found.</param>\n        /// <returns>true if the attribute was found and added, or false otherwise.</returns>\n        private static bool AddItemProp(IReadOnlyCollection<int> ids, DgmTypeAttributes attrib,\n            IList<SerializablePropertyValue> props)\n        {\n            int id = attrib.AttributeID, index = ids.IndexOf(id);\n            if (index >= 0)\n            {\n                // Index was found in the list of known IDs\n                long propInt64Value = attrib.GetInt64Value;\n                var invGroups = Database.InvGroupsTable;\n                props.Add(new SerializablePropertyValue\n                {\n                    ID = id,\n                    Value = invGroups.HasValue(propInt64Value) ? invGroups[propInt64Value].Name :\n                        string.Empty\n                });\n            }\n            return index > -1;\n        }\n\n\t\t/// <summary>\n\t\t/// Adds the item properties and prerequisites.\n\t\t/// </summary>\n\t\t/// <param name=\"srcItem\">The source item.</param>\n\t\t/// <param name=\"item\">The serializable item.</param>\n\t\t/// <returns></returns>\n\t\tprivate static void AddItemPropsAndPrereq(InvTypes srcItem, SerializableItem item)\n\t\t{\n            long[] prereqSkills = new long[DBConstants.RequiredSkillPropertyIDs.Count];\n            long[] prereqLevels = new long[DBConstants.RequiredSkillPropertyIDs.Count];\n\t\t\tvar props = new List<SerializablePropertyValue>();\n\t\t\tdouble warpSpeedMultiplier = 1.0;\n            if (s_dgmTypeAttributesPerItem.ContainsKey(srcItem.ID))\n                foreach (DgmTypeAttributes srcProp in s_dgmTypeAttributesPerItem[srcItem.ID])\n                {\n                    long propValue = srcProp.GetInt64Value;\n                    int id = srcProp.AttributeID;\n                    // Is it a prereq skill?\n                    int prereqIndex = DBConstants.RequiredSkillPropertyIDs.IndexOf(id);\n                    if (prereqIndex > -1)\n                    {\n                        prereqSkills[prereqIndex] = propValue;\n                        continue;\n                    }\n                    // Is it a prereq level?\n                    prereqIndex = DBConstants.RequiredSkillLevelPropertyIDs.IndexOf(id);\n                    if (prereqIndex > -1)\n                    {\n                        prereqLevels[prereqIndex] = propValue;\n                        continue;\n                    }\n                    // Recognized group? Includes Launcher, CanFitShip, ModuleShip,\n                    // SpecialisationAsteroid, Reaction, and PosCargobayAccept\n                    if (AddItemProp(DBConstants.LauncherGroupPropertyIDs, srcProp, props) ||\n                        AddItemProp(DBConstants.ChargeGroupPropertyIDs, srcProp, props) ||\n                        AddItemProp(DBConstants.CanFitShipGroupPropertyIDs, srcProp, props) ||\n                        AddItemProp(DBConstants.ModuleShipGroupPropertyIDs, srcProp, props) ||\n                        AddItemProp(DBConstants.SpecialisationAsteroidGroupPropertyIDs, srcProp, props) ||\n                        AddItemProp(DBConstants.ReactionGroupPropertyIDs, srcProp, props) ||\n                        AddItemProp(DBConstants.PosCargobayAcceptGroupPropertyIDs, srcProp, props))\n                        continue;\n                    // Get the warp speed multiplier\n                    if (id == DBConstants.WarpSpeedMultiplierPropertyID && srcProp.ValueFloat != null)\n                        warpSpeedMultiplier = srcProp.ValueFloat.Value;\n                    // Calculate and add the ships warp speed\n                    if (id == DBConstants.ShipWarpSpeedPropertyID)\n                    {\n                        props.Add(new SerializablePropertyValue\n                        {\n                            ID = id,\n                            Value = warpSpeedMultiplier.ToString(CultureConstants.InvariantCulture)\n                        });\n                        // Also add packaged volume as a prop as only ships have 'ship warp speed' attribute\n                        props.Add(new SerializablePropertyValue\n                        {\n                            ID = Properties.PackagedVolumePropertyID,\n                            Value = GetPackagedVolume(srcItem.GroupID).ToString(CultureConstants.InvariantCulture)\n                        });\n                    }\n                    // Other properties\n                    props.Add(new SerializablePropertyValue { ID = id, Value = srcProp.FormatPropertyValue() });\n                    AddMetaData(item, propValue, srcProp);\n                }\n\n\t\t\tCompleteItemPropertiesAddition(srcItem, props);\n\t\t\t// Add properties info to item\n\t\t\titem.Properties.AddRange(props);\n\n\t\t\t// Prerequisites completion\n\t\t\tvar prereqs = new List<SerializablePrerequisiteSkill>();\n\t\t\tfor (int i = 0; i < prereqSkills.Length; i++)\n\t\t\t{\n\t\t\t\tif (prereqSkills[i] != 0)\n\t\t\t\t\tprereqs.Add(new SerializablePrerequisiteSkill { ID = prereqSkills[i], Level = prereqLevels[i] });\n\t\t\t}\n\n\t\t\t// Add prerequisite skills info to item\n\t\t\titem.PrerequisiteSkills.AddRange(prereqs);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Adds the meta data.\n\t\t/// </summary>\n\t\t/// <param name=\"item\">The item.</param>\n\t\t/// <param name=\"propInt64Value\">The prop int value.</param>\n\t\t/// <param name=\"srcProp\">The SRC prop.</param>\n\t\tprivate static void AddMetaData(SerializableItem item, long propInt64Value, DgmTypeAttributes srcProp)\n\t\t{\n\t\t\t// Is metalevel property ?\n            switch (srcProp.AttributeID)\n            {\n                case DBConstants.MetaLevelPropertyID:\n                    item.MetaLevel = propInt64Value;\n                    break;\n                // Is techlevel property ?\n                case DBConstants.TechLevelPropertyID:\n                    switch (propInt64Value)\n                    {\n                        case DBConstants.TechLevelII:\n                            item.MetaGroup = ItemMetaGroup.T2;\n                            break;\n                        case DBConstants.TechLevelIII:\n                            item.MetaGroup = ItemMetaGroup.T3;\n                            break;\n                        default:\n                            item.MetaGroup = ItemMetaGroup.T1;\n                            break;\n                    }\n                    break;\n                // Is metagroup property ?\n                case DBConstants.MetaGroupPropertyID:\n                    switch (propInt64Value)\n                    {\n                        case DBConstants.StorylineMetaGroupID:\n                            item.MetaGroup = ItemMetaGroup.Storyline;\n                            break;\n                        case DBConstants.FactionMetaGroupID:\n                            item.MetaGroup = ItemMetaGroup.Faction;\n                            break;\n                        case DBConstants.OfficerMetaGroupID:\n                            item.MetaGroup = ItemMetaGroup.Officer;\n                            break;\n                        case DBConstants.DeadspaceMetaGroupID:\n                            item.MetaGroup = ItemMetaGroup.Deadspace;\n                            break;\n                        default:\n                            item.MetaGroup = ItemMetaGroup.None;\n                            break;\n                    }\n                    break;\n                default:\n                    break;\n            }\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Completes the item properties addition.\n\t\t/// </summary>\n\t\t/// <param name=\"srcItem\">The SRC item.</param>\n\t\t/// <param name=\"props\">The props.</param>\n\t\tprivate static void CompleteItemPropertiesAddition(InvTypes srcItem, ICollection<SerializablePropertyValue> props)\n\t\t{\n\t\t\t// Ensures there is a mass and add it to prop\n\t\t\tif (Math.Abs(srcItem.Mass) > double.Epsilon)\n\t\t\t\tprops.Add(new SerializablePropertyValue\n\t\t\t\t{\n\t\t\t\t\tID = DBConstants.MassPropertyID,\n\t\t\t\t\tValue = srcItem.Mass.ToString(CultureConstants.InvariantCulture)\n\t\t\t\t});\n\n\t\t\t// Ensures there is a cargo capacity and add it to prop\n\t\t\tif (Math.Abs(srcItem.Capacity) > double.Epsilon)\n\t\t\t\tprops.Add(new SerializablePropertyValue\n\t\t\t\t{\n\t\t\t\t\tID = DBConstants.CargoCapacityPropertyID,\n\t\t\t\t\tValue = srcItem.Capacity.ToString(CultureConstants.InvariantCulture)\n\t\t\t\t});\n\n\t\t\t// Ensures there is a volume and add it to prop\n\t\t\tif (Math.Abs(srcItem.Volume) > double.Epsilon)\n\t\t\t\tprops.Add(new SerializablePropertyValue\n\t\t\t\t{\n\t\t\t\t\tID = DBConstants.VolumePropertyID,\n\t\t\t\t\tValue = srcItem.Volume.ToString(CultureConstants.InvariantCulture)\n\t\t\t\t});\n\n\t\t\t// Add unit to refine prop where applicable\n\t\t\tif (Database.InvGroupsTable[srcItem.GroupID].CategoryID == DBConstants.AsteroidCategoryID)\n\t\t\t\tprops.Add(new SerializablePropertyValue\n\t\t\t\t{\n\t\t\t\t\tID = Properties.UnitsToRefinePropertyID,\n\t\t\t\t\tValue = srcItem.PortionSize.ToString(CultureInfo.InvariantCulture)\n\t\t\t\t});\n\n\t\t\t// Add base price as a prop\n\t\t\tprops.Add(new SerializablePropertyValue\n\t\t\t{\n\t\t\t\tID = Properties.BasePricePropertyID,\n\t\t\t\tValue = srcItem.BasePrice.FormatDecimal()\n\t\t\t});\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Gets the packaged volume of a ship.\n\t\t/// </summary>\n\t\t/// <param name=\"groupID\">The group ID.</param>\n\t\t/// <returns></returns>\n\t\tprivate static int GetPackagedVolume(int groupID)\n\t\t{\n\t\t\tswitch (groupID)\n\t\t\t{\n\t\t\t\tcase DBConstants.FrigateGroupID:\n\t\t\t\tcase DBConstants.RookieShipGroupID:\n\t\t\t\tcase DBConstants.AssaultFrigateGroupID:\n\t\t\t\tcase DBConstants.CovertOpsGroupID:\n\t\t\t\tcase DBConstants.InterceptorGroupID:\n\t\t\t\tcase DBConstants.StealthBomberGroupID:\n\t\t\t\tcase DBConstants.ElectronicAttackShipGroupID:\n\t\t\t\tcase DBConstants.ExpeditionFrigateGroupID:\n\t\t\t\t\treturn 2500;\n\t\t\t\tcase DBConstants.MiningBargeGroupID:\n\t\t\t\tcase DBConstants.ExhumerGroupID:\n\t\t\t\t\treturn 3750;\n\t\t\t\tcase DBConstants.DestroyerGroupID:\n\t\t\t\tcase DBConstants.InterdictorGroupID:\n\t\t\t\tcase DBConstants.StrategicCruiserGroupID:\n\t\t\t\tcase DBConstants.TacticalDestroyerGroupID:\n\t\t\t\t\treturn 5000;\n\t\t\t\tcase DBConstants.CruiserGroupID:\n\t\t\t\tcase DBConstants.HeavyAssaultCruiserGroupID:\n\t\t\t\tcase DBConstants.LogisticsGroupID:\n\t\t\t\tcase DBConstants.ForceReconShipGroupID:\n\t\t\t\tcase DBConstants.HeavyInterdictorCruiserGroupID:\n\t\t\t\tcase DBConstants.CombatReconShipGroupID:\n\t\t\t\t\treturn 10000;\n\t\t\t\tcase DBConstants.CombatBattlecruiserGroupID:\n\t\t\t\tcase DBConstants.CommandShipGroupID:\n\t\t\t\tcase DBConstants.AttackBattlecruiserGroupID:\n\t\t\t\t\treturn 15000;\n\t\t\t\tcase DBConstants.IndustrialGroupID:\n\t\t\t\tcase DBConstants.DeepSpaceTransportGroupID:\n\t\t\t\tcase DBConstants.BlockadeRunnerGroupID:\n\t\t\t\t\treturn 20000;\n\t\t\t\tcase DBConstants.BattleshipGroupID:\n\t\t\t\tcase DBConstants.EliteBattleshipGroupID:\n\t\t\t\tcase DBConstants.BlackOpsGroupID:\n\t\t\t\tcase DBConstants.MarauderGroupID:\n\t\t\t\t\treturn 50000;\n\t\t\t\tcase DBConstants.IndustrialCommandShipGroupID:\n\t\t\t\t\treturn 500000;\n\t\t\t\tcase DBConstants.DreadnoughtGroupID:\n\t\t\t\tcase DBConstants.FreighterGroupID:\n\t\t\t\tcase DBConstants.CarrierGroupID:\n\t\t\t\tcase DBConstants.SupercarrierGroupID:\n\t\t\t\tcase DBConstants.CapitalIndustrialShipGroupID:\n\t\t\t\tcase DBConstants.JumpFreighterGroupID:\n\t\t\t\t\treturn 1000000;\n\t\t\t\tcase DBConstants.TitanGroupID:\n\t\t\t\t\treturn 10000000;\n                default:\n                    return 500;\n            }\n        }\n\n\t\t/// <summary>\n\t\t/// Sets the item family according to its market group\n\t\t/// </summary>\n\t\t/// <param name=\"group\"></param>\n\t\t/// <param name=\"itemFamily\"></param>\n\t\tprivate static void SetItemFamilyByMarketGroup(SerializableMarketGroup group, ItemFamily itemFamily)\n\t\t{\n\t\t\tforeach (SerializableItem item in group.Items)\n\t\t\t\titem.Family = itemFamily;\n\n\t\t\tforeach (SerializableMarketGroup childGroup in group.SubGroups)\n\t\t\t\tSetItemFamilyByMarketGroup(childGroup, itemFamily);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Datafiles/Masteries.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Datafiles;\nusing EVEMon.XmlGenerator.Providers;\nusing EVEMon.XmlGenerator.StaticData;\nusing EVEMon.XmlGenerator.Utils;\n\nnamespace EVEMon.XmlGenerator.Datafiles\n{\n    internal static class Masteries\n    {\n        /// <summary>\n        /// Generate the masteries datafile.\n        /// </summary>        \n        internal static void GenerateDatafile()\n        {\n            Stopwatch stopwatch = Stopwatch.StartNew();\n            Util.ResetCounters();\n\n            Console.WriteLine();\n            Console.Write(@\"Generating masteries datafile... \");\n\n            // Export the mastery ships\n            List<SerializableMasteryShip> listOfMasteryShips = new List<SerializableMasteryShip>();\n\n            foreach (IGrouping<int, DgmTypeMasteries> typeMastery in Database.DgmTypeMasteriesTable.GroupBy(x=> x.ItemID))\n            {\n                SerializableMasteryShip masteryShip = new SerializableMasteryShip\n                {\n                    ID = typeMastery.Key,\n                    Name = Database.InvTypesTable[typeMastery.Key].Name\n                };\n\n                // Add masteries to mastery ship\n                masteryShip.Masteries.AddRange(ExportMasteries(typeMastery).OrderBy(x => x.Grade));\n\n                // Add mastery ship\n                listOfMasteryShips.Add(masteryShip);\n            }\n\n            // Serialize\n            MasteriesDatafile datafile = new MasteriesDatafile();\n            datafile.MasteryShips.AddRange(listOfMasteryShips);\n\n            Util.DisplayEndTime(stopwatch);\n\n            Util.SerializeXml(datafile, DatafileConstants.MasteriesDatafile);\n        }\n\n        /// <summary>\n        /// Exports the masteries.\n        /// </summary>\n        /// <param name=\"typeMasteries\">The type masteries.</param>\n        /// <returns></returns>\n        private static IEnumerable<SerializableMastery> ExportMasteries(IGrouping<int, DgmTypeMasteries> typeMasteries)\n        {\n            List<SerializableMastery> listOfMasteries = new List<SerializableMastery>();\n\n            foreach (DgmMasteries typeMastery in typeMasteries.Select(x => Database.DgmMasteriesTable[x.MasteryID]))\n            {\n                Util.UpdatePercentDone(Database.MasteriesTotalCount);\n\n                int grade = typeMastery.Grade + 1;\n\n                SerializableMastery mastery;\n                if (listOfMasteries.All(x=> x.Grade != grade))\n                {\n                    mastery = new SerializableMastery { Grade = grade };\n                    listOfMasteries.Add(mastery);\n                }\n                else\n                    mastery = listOfMasteries.First(x => x.Grade == grade);\n\n                SerializableMasteryCertificate masteryCertificate = new SerializableMasteryCertificate\n                {\n                    ID = typeMastery.CertificateID,\n                    ClassName =\n                        Database.CrtClassesTable[Database.CrtCertificatesTable[typeMastery.CertificateID].ClassID].ClassName\n                };\n\n                mastery.Certificates.Add(masteryCertificate);\n            }\n\n            return listOfMasteries;\n        }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/Datafiles/Properties.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Serialization.Datafiles;\nusing EVEMon.XmlGenerator.Interfaces;\nusing EVEMon.XmlGenerator.Providers;\nusing EVEMon.XmlGenerator.StaticData;\nusing EVEMon.XmlGenerator.Utils;\n\nnamespace EVEMon.XmlGenerator.Datafiles\n{\n    internal static class Properties\n    {\n        private static List<EveUnits> s_injectedUnits;\n        private static List<DgmAttributeTypes> s_injectedProperties;\n\n        /// <summary>\n        /// Gets the base price property ID.\n        /// </summary>\n        internal static int BasePricePropertyID { get; private set; }\n\n        /// <summary>\n        /// Gets the packaged volume property ID.\n        /// </summary>\n        internal static int PackagedVolumePropertyID { get; private set; }\n\n        /// <summary>\n        /// Gets the units to refine property ID.\n        /// </summary>\n        internal static int UnitsToRefinePropertyID { get; private set; }\n\n        /// <summary>\n        /// Generate the properties datafile.\n        /// </summary>\n        internal static void GenerateDatafile()\n        {\n            Stopwatch stopwatch = Stopwatch.StartNew();\n            Util.ResetCounters();\n\n            Console.WriteLine();\n            Console.Write(@\"Generating properties datafile... \");\n\n            ConfigureNullCategoryProperties();\n\n            IEnumerable<SerializablePropertyCategory> categories = ExportAttributeCategories();\n\n            // Sort groups\n            string[] orderedGroupNames =\n            {\n                DBConstants.GeneralCategoryName, \"Fitting\", \"Drones\", \"Structure\", \"Hangers & Bays\", \"Armor\", \"Shield\",\n                \"Capacitor\", \"Targeting\", DBConstants.PropulsionCategoryName, \"Turrets\", \"Missile\", \"Remote Assistance\",\n                \"Fighter Attributes\", \"EW - Energy Neutralizing\", \"EW - Remote Electronic Counter Measures\", \"EW - Resistance\",\n                \"EW - Sensor Dampening\", \"EW - Target Jamming\", \"EW - Target Painting\", \"EW - Tracking Disruption\",\n                \"EW - Warp Scrambling\", \"EW - Webbing\", \"Loot\", \"Miscellaneous\", \"NULL\", \"AI\", \"Graphics\"\n            };\n\n            // Serialize\n            PropertiesDatafile datafile = new PropertiesDatafile();\n            datafile.Categories.AddRange(categories.OrderBy(x => orderedGroupNames.IndexOf(x.Name)));\n\n            Util.DisplayEndTime(stopwatch);\n\n            Util.SerializeXml(datafile, DatafileConstants.PropertiesDatafile);\n        }\n\n        /// <summary>\n        /// Configures the null category properties.\n        /// </summary>\n        private static void ConfigureNullCategoryProperties()\n        {\n            // Create EVEMon custom units\n            int newUnitID = Database.EveUnitsTable.Last().ID;\n            s_injectedUnits = new List<EveUnits>();\n\n            EveUnits warpSpeedUnit = new EveUnits\n            {\n                ID = ++newUnitID,\n                Name = \"Warp Speed\",\n                DisplayName = \"AU/s\",\n                Description = \"Astronomical Unit per second.\"\n            };\n            s_injectedUnits.Add(warpSpeedUnit);\n\n            EveUnits perHourUnit = new EveUnits\n            {\n                ID = ++newUnitID,\n                Name = DBConstants.ConsumptionRatePropertyName,\n                DisplayName = \"per hour\",\n                Description = \"Used to describe the consumption rate.\"\n            };\n            s_injectedUnits.Add(perHourUnit);\n\n            // Create EVEMon custom properties\n            int newPropID = Database.DgmAttributeTypesTable.Last().ID;\n            PackagedVolumePropertyID = ++newPropID;\n            UnitsToRefinePropertyID = ++newPropID;\n            BasePricePropertyID = ++newPropID;\n\n            s_injectedProperties = new List<DgmAttributeTypes>\n            {\n                new DgmAttributeTypes\n                {\n                    ID = PackagedVolumePropertyID,\n                    Name = \"packagedVolume\",\n                    Description = \"The packaged volume of a ship.\",\n                    IconID = 67,\n                    DefaultValue = \"0\",\n                    Published = true,\n                    DisplayName = DBConstants.PackagedVolumePropertyName,\n                    UnitID = 9,\n                    HigherIsBetter = true,\n                    CategoryID = 4\n                },\n                new DgmAttributeTypes\n                {\n                    ID = UnitsToRefinePropertyID,\n                    Name = \"unitToRefine\",\n                    Description = \"The units required to perform the refining process.\",\n                    IconID = 0,\n                    DefaultValue = \"0\",\n                    Published = true,\n                    DisplayName = \"Units to Refine\",\n                    UnitID = null,\n                    HigherIsBetter = false,\n                    CategoryID = 7\n                },\n                new DgmAttributeTypes\n                {\n                    ID = BasePricePropertyID,\n                    Name = \"basePrice\",\n                    Description = \"The price from NPC vendors (does not mean there is any).\",\n                    IconID = 67,\n                    DefaultValue = \"0\",\n                    Published = true,\n                    DisplayName = \"Base Price\",\n                    UnitID = 133,\n                    HigherIsBetter = true,\n                    CategoryID = 7\n                },\n                new DgmAttributeTypes\n                {\n                    ID = ++newPropID,\n                    Name = \"consumptionRate\",\n                    Description =\n                        \"The rate of the given resource type needed to be consumed for each activation cycle of this structure.\",\n                    IconID = 0,\n                    DefaultValue = \"0\",\n                    Published = true,\n                    DisplayName = DBConstants.ConsumptionRatePropertyName,\n                    UnitID = perHourUnit.ID,\n                    HigherIsBetter = false,\n                    CategoryID = 7\n                }\n            };\n\n            // Set attributes with CategoryID 'NULL\" to NULL category\n            foreach (DgmAttributeTypes attribute in Database.DgmAttributeTypesTable.Where(x => x.CategoryID == null))\n            {\n                attribute.CategoryID = attribute.Published\n                    ? DBConstants.MiscellaneousAttributeCategoryID\n                    : DBConstants.NullAtributeCategoryID;\n            }\n\n            // Assign injected properties units\n            Database.DgmAttributeTypesTable[DBConstants.ShipWarpSpeedPropertyID].UnitID = warpSpeedUnit.ID;\n\n            // Change some display names and default values\n            Database.DgmAttributeCategoriesTable[DBConstants.SpeedAtributeCategoryID].Name = DBConstants.PropulsionCategoryName;\n\n            Database.DgmAttributeTypesTable[DBConstants.StructureHitpointsPropertyID].DisplayName = \"Structure HP\";\n            Database.DgmAttributeTypesTable[DBConstants.ShieldHitpointsPropertyID].DisplayName = \"Shield HP\";\n            Database.DgmAttributeTypesTable[DBConstants.ArmorHitpointsPropertyID].DisplayName = \"Armor HP\";\n            Database.DgmAttributeTypesTable[DBConstants.CargoCapacityPropertyID].DisplayName = \"Cargo Capacity\";\n            Database.DgmAttributeTypesTable[DBConstants.CPUOutputPropertyID].DisplayName = \"CPU\";\n            Database.DgmAttributeTypesTable[DBConstants.PGOutputPropertyID].DisplayName = \"Powergrid\";\n\n            // Shield\n            Database.DgmAttributeTypesTable[DBConstants.ShieldEMResistancePropertyID].DisplayName = \"EM Resistance\";\n            Database.DgmAttributeTypesTable[DBConstants.ShieldExplosiveResistancePropertyID].DisplayName = \"Explosive Resistance\";\n            Database.DgmAttributeTypesTable[DBConstants.ShieldKineticResistancePropertyID].DisplayName = \"Kinetic Resistance\";\n            Database.DgmAttributeTypesTable[DBConstants.ShieldThermalResistancePropertyID].DisplayName = \"Thermal Resistance\";\n\n            // Armor\n            Database.DgmAttributeTypesTable[DBConstants.ArmorEMResistancePropertyID].DisplayName = \"EM Resistance\";\n            Database.DgmAttributeTypesTable[DBConstants.ArmorExplosiveResistancePropertyID].DisplayName = \"Explosive Resistance\";\n            Database.DgmAttributeTypesTable[DBConstants.ArmorKineticResistancePropertyID].DisplayName = \"Kinetic Resistance\";\n            Database.DgmAttributeTypesTable[DBConstants.ArmorThermalResistancePropertyID].DisplayName = \"Thermal Resistance\";\n\n            // Hull\n            Database.DgmAttributeTypesTable[DBConstants.HullEMResistancePropertyID].DisplayName = \"EM Resistance\";\n            Database.DgmAttributeTypesTable[DBConstants.HullExplosiveResistancePropertyID].DisplayName = \"Explosive Resistance\";\n            Database.DgmAttributeTypesTable[DBConstants.HullKineticResistancePropertyID].DisplayName = \"Kinetic Resistance\";\n            Database.DgmAttributeTypesTable[DBConstants.HullThermalResistancePropertyID].DisplayName = \"Thermal Resistance\";\n\n            // Items attribute\n            Database.DgmAttributeTypesTable[DBConstants.CPUNeedPropertyID].DisplayName = \"CPU Usage\";\n            Database.DgmAttributeTypesTable[DBConstants.ShieldTransferRangePropertyID].DisplayName = \"Shield Transfer Range\";\n            Database.DgmAttributeTypesTable[DBConstants.CPUOutputBonusPropertyID].DisplayName = \"CPU Output Bonus\";\n            Database.DgmAttributeTypesTable[DBConstants.CPUPenaltyPercentPropertyID].DisplayName = \"CPU Penalty\";\n\n            // Changing the categoryID for some attributes \n            Database.DgmAttributeTypesTable[DBConstants.UpgradeCapacityPropertyID].CategoryID =\n                DBConstants.FittingAtributeCategoryID;\n            Database.DgmAttributeTypesTable[DBConstants.RigSizePropertyID].CategoryID = DBConstants.FittingAtributeCategoryID;\n            Database.DgmAttributeTypesTable[DBConstants.MaxSubSystemsPropertyID].CategoryID =\n                DBConstants.FittingAtributeCategoryID;\n            Database.DgmAttributeTypesTable[DBConstants.FitsToShipTypePropertyID].CategoryID =\n                DBConstants.FittingAtributeCategoryID;\n            Database.DgmAttributeTypesTable[DBConstants.ShipMaintenanceBayCapacityPropertyID].CategoryID =\n                DBConstants.StructureAtributeCategoryID;\n            Database.DgmAttributeTypesTable[DBConstants.TurretHardPointModifierPropertyID].CategoryID =\n                DBConstants.StructureAtributeCategoryID;\n            Database.DgmAttributeTypesTable[DBConstants.LauncherHardPointModifierPropertyID].CategoryID =\n                DBConstants.StructureAtributeCategoryID;\n            Database.DgmAttributeTypesTable[DBConstants.HiSlotModifierPropertyID].CategoryID =\n                DBConstants.StructureAtributeCategoryID;\n            Database.DgmAttributeTypesTable[DBConstants.MedSlotModifierPropertyID].CategoryID =\n                DBConstants.StructureAtributeCategoryID;\n            Database.DgmAttributeTypesTable[DBConstants.LowSlotModifierPropertyID].CategoryID =\n                DBConstants.StructureAtributeCategoryID;\n            Database.DgmAttributeTypesTable[DBConstants.ShipWarpSpeedPropertyID].CategoryID =\n                DBConstants.SpeedAtributeCategoryID;\n\n            // Changing HigherIsBetter to false (CCP has this wrong?)\n            Database.DgmAttributeTypesTable[DBConstants.PGNeedPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.CPUNeedPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.VolumePropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.AgilityPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.MassPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.CapacitorNeedPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.CapacitorRechargeRatePropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.CapacitorRechargeRateMultiplierPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.ShieldRechargeRatePropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.SignatureRadiusPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.CloakingTargetingDelayPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.CPUPenaltyPercentPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.UpgradeCostPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.DroneBandwidthUsedPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.AITargetSwitchTimerPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.AnchoringDelayPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.UnanchoringDelayPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.OnliningDelayPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.IceHarvestCycleBonusPropertyID].HigherIsBetter = false;\n            Database.DgmAttributeTypesTable[DBConstants.ModuleReactivationDelayPropertyID].HigherIsBetter = false;\n\n            // Changing the categoryID for those attributes that their names do not start with a capital letter \n            foreach (DgmAttributeTypes attribute in Database.DgmAttributeTypesTable.Where(x => x.CategoryID != null)\n                .Select(attribute =>\n                    new\n                    {\n                        attribute,\n                        name = string.IsNullOrEmpty(attribute.DisplayName) ? attribute.Name : attribute.DisplayName\n                    })\n                .Where(\n                    att => !string.IsNullOrEmpty(att.name) &&\n                        Regex.IsMatch(att.name.Substring(0, 1), \"[a-z]\", RegexOptions.Compiled | RegexOptions.CultureInvariant) &&\n                        att.attribute.CategoryID != DBConstants.MiscellaneousAttributeCategoryID &&\n                        att.attribute.CategoryID != DBConstants.NullAtributeCategoryID).Select(att => att.attribute))\n            {\n                attribute.CategoryID = DBConstants.NullAtributeCategoryID;\n            }\n        }\n\n        /// <summary>\n        /// Exports the attribute categories.\n        /// </summary>\n        /// <returns></returns>\n        private static IEnumerable<SerializablePropertyCategory> ExportAttributeCategories()\n        {\n            List<SerializablePropertyCategory> categories = new List<SerializablePropertyCategory>();\n\n            // Export attribute categories\n            List<SerializableProperty> gProperties = new List<SerializableProperty>();\n            foreach (DgmAttributeCategories srcCategory in Database.DgmAttributeCategoriesTable)\n            {\n                List<SerializableProperty> properties = new List<SerializableProperty>();\n                SerializablePropertyCategory category = new SerializablePropertyCategory\n                {\n                    ID = srcCategory.ID,\n                    Description = srcCategory.Description,\n                    Name = srcCategory.Name\n                };\n                categories.Add(category);\n\n                // Export attributes\n                foreach (DgmAttributeTypes srcProp in Database.DgmAttributeTypesTable.Concat(s_injectedProperties).Where(\n                    x => x.CategoryID == category.ID))\n                {\n                    Util.UpdatePercentDone(Database.PropertiesTotalCount);\n\n                    SerializableProperty prop = new SerializableProperty();\n                    properties.Add(prop);\n\n                    prop.ID = srcProp.ID;\n                    prop.DefaultValue = srcProp.DefaultValue;\n                    prop.Description = srcProp.Description;\n                    prop.HigherIsBetter = srcProp.HigherIsBetter;\n                    prop.Name = !string.IsNullOrEmpty(srcProp.DisplayName)\n                        ? srcProp.DisplayName\n                        : !string.IsNullOrEmpty(srcProp.Name)\n                            ? srcProp.Name\n                            : string.Empty;\n\n                    // Unit\n                    prop.UnitID = srcProp.UnitID.GetValueOrDefault();\n                    prop.Unit = srcProp.UnitID.HasValue\n                        ? Database.EveUnitsTable.Concat(s_injectedUnits).First(\n                            x => x.ID == srcProp.UnitID.Value).DisplayName\n                        : string.Empty;\n\n                    // Icon\n                    prop.Icon = srcProp.IconID.HasValue ? Database.EveIconsTable[srcProp.IconID.Value].Icon : string.Empty;\n\n                    // Reordering some properties\n                    ReorderProperties(gProperties, prop, srcProp, properties);\n                }\n\n                category.Properties.AddRange(properties);\n            }\n\n            // New category ID\n            int newCategoryID = Database.DgmAttributeCategoriesTable.Last().ID;\n\n            // We insert custom categories\n            SerializablePropertyCategory general = new SerializablePropertyCategory\n            {\n                ID = ++newCategoryID,\n                Name = DBConstants.GeneralCategoryName,\n                Description = \"General information\"\n            };\n            general.Properties.AddRange(gProperties);\n            categories.Insert(0, general);\n\n            return categories;\n        }\n\n        /// <summary>\n        /// Reorders the properties.\n        /// </summary>\n        /// <param name=\"gProperties\">The properties in general category.</param>\n        /// <param name=\"prop\">The prop.</param>\n        /// <param name=\"srcProp\">The source prop.</param>\n        /// <param name=\"properties\">The properties.</param>\n        private static void ReorderProperties(IList<SerializableProperty> gProperties,\n            SerializableProperty prop, IHasID srcProp, IList<SerializableProperty> properties)\n        {\n            int index = properties.IndexOf(prop);\n\n            if (srcProp.ID == PackagedVolumePropertyID)\n            {\n                properties.Insert(4, prop);\n                properties.RemoveAt(index + 1);\n                return;\n            }\n\n            if (srcProp.ID == BasePricePropertyID)\n            {\n                gProperties.Insert(0, prop);\n                properties.RemoveAt(index);\n                return;\n            }\n\n            switch (srcProp.ID)\n            {\n                case DBConstants.StructureHitpointsPropertyID:\n                    properties.Insert(0, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n                case DBConstants.CargoCapacityPropertyID:\n                    properties.Insert(1, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n                case DBConstants.CPUOutputPropertyID:\n                    properties.Insert(0, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n                case DBConstants.VolumePropertyID:\n                    properties.Insert(3, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n                case DBConstants.TechLevelPropertyID:\n                    gProperties.Insert(0, prop);\n                    properties.RemoveAt(index);\n                    break;\n                case DBConstants.ShieldRechargeRatePropertyID:\n                    properties.Insert(6, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n                case DBConstants.CapacitorCapacityPropertyID:\n                    properties.Insert(0, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n                case DBConstants.ScanResolutionPropertyID:\n                    properties.Insert(4, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n                case DBConstants.MetaLevelPropertyID:\n                    gProperties.Insert(1, prop);\n                    properties.RemoveAt(index);\n                    break;\n                case DBConstants.HullEMResistancePropertyID:\n                    properties.Insert(5, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n                case DBConstants.HullExplosiveResistancePropertyID:\n                    properties.Insert(6, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n                case DBConstants.HullKineticResistancePropertyID:\n                    properties.Insert(7, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n                case DBConstants.HullThermalResistancePropertyID:\n                    properties.Insert(8, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n                case DBConstants.UpgradeCapacityPropertyID:\n                    properties.Insert(2, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n                case DBConstants.RigSlotsPropertyID:\n                    properties.Insert(10, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n                case DBConstants.RigSizePropertyID:\n                    properties.Insert(11, prop);\n                    properties.RemoveAt(index + 1);\n                    break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Datafiles/Reprocessing.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Serialization.Datafiles;\nusing EVEMon.XmlGenerator.Providers;\nusing EVEMon.XmlGenerator.Utils;\n\nnamespace EVEMon.XmlGenerator.Datafiles\n{\n    internal static class Reprocessing\n    {\n        /// <summary>\n        /// Generates the reprocessing datafile.\n        /// </summary>\n        internal static void GenerateDatafile()\n        {\n            Stopwatch stopwatch = Stopwatch.StartNew();\n            Util.ResetCounters();\n\n            Console.WriteLine();\n            Console.Write(@\"Generating reprocessing datafile... \");\n\n            List<SerializableItemMaterials> types = new List<SerializableItemMaterials>();\n\n            foreach (int typeID in Database.InvTypesTable.Where(x => x.Generated).Select(x => x.ID))\n            {\n                Util.UpdatePercentDone(Database.ReprocessingTotalCount);\n\n                List<SerializableMaterialQuantity> materials = Database.InvTypeMaterialsTable.Where(\n                    x => x.ID == typeID).Select(\n                        srcMaterial => new SerializableMaterialQuantity\n                        {\n                            ID = srcMaterial.MaterialTypeID,\n                            Quantity = srcMaterial.Quantity\n                        }).ToList();\n\n                if (!materials.Any())\n                    continue;\n\n                SerializableItemMaterials itemMaterials = new SerializableItemMaterials { ID = typeID };\n                itemMaterials.Materials.AddRange(materials.OrderBy(x => x.ID));\n                types.Add(itemMaterials);\n            }\n\n            // Serialize\n            ReprocessingDatafile datafile = new ReprocessingDatafile();\n            datafile.Items.AddRange(types);\n\n            Util.DisplayEndTime(stopwatch);\n\n            Util.SerializeXml(datafile, DatafileConstants.ReprocessingDatafile);\n        }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Datafiles/Skills.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.Common.Constants;\nusing EVEMon.Common.Enumerations;\nusing EVEMon.Common.Serialization.Datafiles;\nusing EVEMon.XmlGenerator.Interfaces;\nusing EVEMon.XmlGenerator.Providers;\nusing EVEMon.XmlGenerator.StaticData;\nusing EVEMon.XmlGenerator.Utils;\n\nnamespace EVEMon.XmlGenerator.Datafiles\n{\n    internal static class Skills\n    {\n        /// <summary>\n        /// Generate the skills datafile.\n        /// </summary>\n        internal static void GenerateDatafile()\n        {\n            Stopwatch stopwatch = Stopwatch.StartNew();\n            Util.ResetCounters();\n\n            Console.WriteLine();\n            Console.Write(@\"Generating skills datafile... \");\n\n            // Export skill groups\n            List<SerializableSkillGroup> listOfSkillGroups = new List<SerializableSkillGroup>();\n\n            foreach (InvGroups group in Database.InvGroupsTable.Where(\n                x => x.CategoryID == DBConstants.SkillCategoryID && x.ID != DBConstants.FakeSkillsGroupID).OrderBy(x => x.Name))\n            {\n                SerializableSkillGroup skillGroup = new SerializableSkillGroup\n                {\n                    ID = group.ID,\n                    Name = group.Name,\n                };\n\n                // Add skills in skill group\n                skillGroup.Skills.AddRange(ExportSkillsInGroup(group).OrderBy(x => x.Name));\n\n                // Add skill group\n                listOfSkillGroups.Add(skillGroup);\n            }\n\n            // Serialize\n            SkillsDatafile datafile = new SkillsDatafile();\n            datafile.SkillGroups.AddRange(listOfSkillGroups);\n\n            Util.DisplayEndTime(stopwatch);\n\n            Util.SerializeXml(datafile, DatafileConstants.SkillsDatafile);\n        }\n\n        /// <summary>\n        /// Exports the skills in the skill group.\n        /// </summary>\n        /// <param name=\"group\">The group.</param>\n        /// <returns></returns>\n        private static IEnumerable<SerializableSkill> ExportSkillsInGroup(IHasID group)\n        {\n            List<SerializableSkill> listOfSkillsInGroup = new List<SerializableSkill>();\n\n            var alphaLimit = HoboleaksAlphaSkills.GetAlphaSkillLimits();\n            var l5 = new SerializableSkillPrerequisite()\n            {\n                ID = 3348, // Leadership\n                Level = 5,\n                Name = Database.InvTypesTable[3348].Name\n            };\n\n            foreach (InvTypes skill in Database.InvTypesTable.Where(x => x.GroupID == group.ID))\n            {\n                Util.UpdatePercentDone(Database.SkillsTotalCount);\n\n                int skillID = skill.ID;\n                SerializableSkill singleSkill = new SerializableSkill\n                {\n                    ID = skillID,\n                    Name = skill.Name,\n                    Description = skill.Description,\n                    Public = skill.Published,\n                    Cost = (long)skill.BasePrice,\n                    AlphaLimit = (alphaLimit.ContainsKey(skill.ID)) ? alphaLimit[skill.ID] : 0,\n                };\n\n                // Export skill atributes\n                Dictionary<int, long> skillAttributes = Database.DgmTypeAttributesTable.Where(\n                    x => x.ItemID == skill.ID).ToDictionary(\n                        attribute => attribute.AttributeID, attribute => attribute.GetInt64Value);\n\n                singleSkill.Rank = skillAttributes.ContainsKey(DBConstants.SkillTimeConstantPropertyID) &&\n                                   skillAttributes[DBConstants.SkillTimeConstantPropertyID] > 0\n                    ? skillAttributes[DBConstants.SkillTimeConstantPropertyID]\n                    : 1;\n\n                singleSkill.PrimaryAttribute = skillAttributes.ContainsKey(DBConstants.PrimaryAttributePropertyID)\n                    ? IntToEveAttribute(skillAttributes[DBConstants.PrimaryAttributePropertyID])\n                    : EveAttribute.None;\n                singleSkill.SecondaryAttribute = skillAttributes.ContainsKey(DBConstants.SecondaryAttributePropertyID)\n                    ? IntToEveAttribute(\n                        skillAttributes[DBConstants.SecondaryAttributePropertyID])\n                    : EveAttribute.None;\n\n                // Export prerequisites\n                List<SerializableSkillPrerequisite> listOfPrerequisites = new List<SerializableSkillPrerequisite>();\n\n                for (int i = 0; i < DBConstants.RequiredSkillPropertyIDs.Count; i++)\n                {\n                    if (!skillAttributes.ContainsKey(DBConstants.RequiredSkillPropertyIDs[i]) ||\n                        !skillAttributes.ContainsKey(DBConstants.RequiredSkillLevelPropertyIDs[i]))\n                        continue;\n\n                    InvTypes prereqSkill = Database.InvTypesTable[skillAttributes[DBConstants.RequiredSkillPropertyIDs[i]]];\n\n                    SerializableSkillPrerequisite preReq = new SerializableSkillPrerequisite\n                    {\n                        ID = prereqSkill.ID,\n                        Level =\n                            skillAttributes[DBConstants.RequiredSkillLevelPropertyIDs[i]],\n                        Name = prereqSkill.Name\n                    };\n\n                    // Add prerequisites\n                    listOfPrerequisites.Add(preReq);\n                }\n\n                // Add prerequesites to skill\n                singleSkill.SkillPrerequisites.AddRange(listOfPrerequisites);\n\n                // Hack: Fleet formation skills have all NULL attributes. CCPlease.\n                if (skillID == DBConstants.FleetCoordinationSkillID)\n                {\n                    singleSkill.Description = \"Advanced fleet support skill allowing commanders to increase the size and spread of their fleet formations. Unlocks additional formation scaling options at each level of training.\";\n                    singleSkill.Rank = 8;\n                    singleSkill.Cost = 40000000L;\n                    singleSkill.PrimaryAttribute = EveAttribute.Charisma;\n                    singleSkill.SecondaryAttribute = EveAttribute.Willpower;\n                    singleSkill.AlphaLimit = 0;\n                    singleSkill.SkillPrerequisites.Add(l5);\n                    singleSkill.SkillPrerequisites.Add(new SerializableSkillPrerequisite()\n                    {\n                        ID = DBConstants.FleetFormationsSkillID,\n                        Level = 1,\n                        Name = Database.InvTypesTable[DBConstants.FleetFormationsSkillID].Name\n                    });\n                }\n                else if (skillID == DBConstants.FleetFormationsSkillID)\n                {\n                    singleSkill.Description = \"Fleet support skill allowing commanders to organize and warp fleets in formation. Unlocks additional formation types at each level of training.\";\n                    singleSkill.Rank = 5;\n                    singleSkill.Cost = 40000000L;\n                    singleSkill.PrimaryAttribute = EveAttribute.Charisma;\n                    singleSkill.SecondaryAttribute = EveAttribute.Willpower;\n                    singleSkill.AlphaLimit = 0;\n                    singleSkill.SkillPrerequisites.Add(l5);\n                }\n\n                // Add skill\n                listOfSkillsInGroup.Add(singleSkill);\n            }\n            return listOfSkillsInGroup;\n        }\n\n        /// <summary>\n        /// Gets the Eve attribute.\n        /// </summary>        \n        private static EveAttribute IntToEveAttribute(long attributeValue)\n        {\n            switch (attributeValue)\n            {\n                case DBConstants.CharismaPropertyID:\n                    return EveAttribute.Charisma;\n                case DBConstants.IntelligencePropertyID:\n                    return EveAttribute.Intelligence;\n                case DBConstants.MemoryPropertyID:\n                    return EveAttribute.Memory;\n                case DBConstants.PerceptionPropertyID:\n                    return EveAttribute.Perception;\n                case DBConstants.WillpowerPropertyID:\n                    return EveAttribute.Willpower;\n                default:\n                    return EveAttribute.None;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Extensions/StringCleaning.cs",
    "content": "﻿using System;\nusing System.Globalization;\nusing System.Text.RegularExpressions;\nusing EVEMon.Common.Extensions;\nusing EVEMon.XmlGenerator.StaticData;\n\nnamespace EVEMon.XmlGenerator.Extensions\n{\n    /// <summary>\n    /// Series of extension methods to cleanup and format strings for use in the data files.\n    /// </summary>\n    public static class StringCleaning\n    {\n        /// <summary>\n        /// Cleans up and normalizes a string by passing it through the following filters.\n        /// </summary>\n        /// <param name=\"input\"><c>string</c> to be cleaned.</param>\n        /// <returns>cleaned <c>string</c></returns>\n        public static string Clean(this string input)\n        {\n            if (string.IsNullOrEmpty(input))\n                return string.Empty;\n\n            string output = input.TrimWhitespace();\n            output = output.ReplaceTabs();\n            output = output.ReplaceHtmlLineBreaks();\n            output = output.CleanXmlTags();\n            output = output.CollapseSpaces();\n            output = output.Normalize();\n\n            return output;\n        }\n\n        /// <summary>\n        /// Colapses any sequence of spaces into a single space.\n        /// </summary>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        private static string CollapseSpaces(this string input) \n            => Regex.Replace(input, @\"[ ]{2,}\", m => @\" \", RegexOptions.Compiled);\n\n        /// <summary>\n        /// Replaces the HTML line breaks.\n        /// </summary>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        private static string ReplaceHtmlLineBreaks(this string input)\n            => Regex.Replace(input, @\"<br+?>|<br\\s?/+?>\", m => Environment.NewLine,\n                    RegexOptions.Singleline | RegexOptions.Compiled);\n\n        /// <summary>\n        /// Removes any text between opposing angle brackets (i.e. XML or HTML tags).\n        /// </summary>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        // Remove markup\n        private static string CleanXmlTags(this string input)\n            => Regex.Replace(input, \"<.+?>\",\n                m => string.Empty, RegexOptions.Singleline | RegexOptions.Compiled);\n\n        /// <summary>\n        /// Switches any occurance of a tab with a single space.\n        /// </summary>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        // Replace tab characters with spaces\n        private static string ReplaceTabs(this string input) => input.Replace('\\t', ' ');\n\n        /// <summary>\n        /// Trims whitespace from the beginning and end of a string.\n        /// </summary>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        private static string TrimWhitespace(this string input)\n        {\n            // Fix space before a dot (yes, there are those in descriptions)\n            string output = input.Replace(\" .\", \".\");\n\n            // Remove whitespace from the beginning and end of a string\n            return output.Trim();\n        }\n\n        /// <summary>\n        /// Formats a properties value in a human friendly manner.\n        /// </summary>\n        /// <param name=\"property\">The property.</param>\n        /// <returns></returns>\n        /// <exception cref=\"System.ArgumentNullException\">property</exception>\n        public static string FormatPropertyValue(this DgmTypeAttributes property)\n        {\n            property.ThrowIfNull(nameof(property));\n\n            // Is it actually an integer stored as a float?\n            if (property.ValueFloat.HasValue &&\n                Math.Abs(Math.Truncate(property.ValueFloat.Value) - property.ValueFloat.Value) < float.Epsilon)\n                return Convert.ToInt64(property.ValueFloat.Value).ToString(CultureInfo.InvariantCulture);\n\n            return property.ValueInt64.HasValue ? property.ValueInt64.ToString() : property.ValueFloat.ToString();\n        }\n\n        /// <summary>\n        /// Formats a decimal in a human friendly manner.\n        /// </summary>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        // Is it actually an integer stored as a double?\n        public static string FormatDecimal(this decimal input)\n            => Math.Truncate(input) == input\n                ? Convert.ToInt64(input).ToString(CultureInfo.InvariantCulture)\n                : input.ToString(CultureInfo.InvariantCulture);\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/Interfaces/IHasId.cs",
    "content": "﻿namespace EVEMon.XmlGenerator.Interfaces\n{\n    /// <summary>\n    /// Implementors have an ID attribute\n    /// </summary>\n    public interface IHasID\n    {\n        int ID { get; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/Interfaces/IHasLongId.cs",
    "content": "﻿namespace EVEMon.XmlGenerator.Interfaces\n{\n    /// <summary>\n    /// Implementors have an ID attribute\n    /// </summary>\n    public interface IHasLongID\n    {\n        long ID { get; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/Interfaces/IRelation.cs",
    "content": "﻿namespace EVEMon.XmlGenerator.Interfaces\n{\n    /// <summary>\n    /// Implementors support two components, a left hand side and a right hand side that are related.\n    /// </summary>\n    public interface IRelation\n    {\n        /// <summary>\n        /// Gets the left column value.\n        /// </summary>\n        /// <value>The left.</value>\n        int Left { get; }\n\n        /// <summary>\n        /// Gets the center column value.\n        /// </summary>\n        /// <value>\n        /// The center.\n        /// </value>\n        int Center { get; }\n\n        /// <summary>\n        /// Gets the right column value.\n        /// </summary>\n        /// <value>\n        /// The right.\n        /// </value>\n        int Right { get; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/Models/EveStaticData.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System.Data.Entity;\n\n    public partial class EveStaticData : DbContext\n    {\n        public EveStaticData()\n            : base(\"name=EveStaticData\")\n        {\n        }\n\n        public virtual DbSet<agtAgents> agtAgents { get; set; }\n        public virtual DbSet<agtAgentTypes> agtAgentTypes { get; set; }\n        public virtual DbSet<agtResearchAgents> agtResearchAgents { get; set; }\n        public virtual DbSet<chrAncestries> chrAncestries { get; set; }\n        public virtual DbSet<chrAttributes> chrAttributes { get; set; }\n        public virtual DbSet<chrBloodlines> chrBloodlines { get; set; }\n        public virtual DbSet<chrFactions> chrFactions { get; set; }\n        public virtual DbSet<chrRaces> chrRaces { get; set; }\n        public virtual DbSet<crpActivities> crpActivities { get; set; }\n        public virtual DbSet<crpNPCCorporationDivisions> crpNPCCorporationDivisions { get; set; }\n        public virtual DbSet<crpNPCCorporationResearchFields> crpNPCCorporationResearchFields { get; set; }\n        public virtual DbSet<crpNPCCorporations> crpNPCCorporations { get; set; }\n        public virtual DbSet<crpNPCCorporationTrades> crpNPCCorporationTrades { get; set; }\n        public virtual DbSet<crpNPCDivisions> crpNPCDivisions { get; set; }\n        public virtual DbSet<dgmAttributeCategories> dgmAttributeCategories { get; set; }\n        public virtual DbSet<dgmAttributeTypes> dgmAttributeTypes { get; set; }\n        public virtual DbSet<dgmEffects> dgmEffects { get; set; }\n        public virtual DbSet<dgmExpressions> dgmExpressions { get; set; }\n        public virtual DbSet<dgmTypeAttributes> dgmTypeAttributes { get; set; }\n        public virtual DbSet<dgmTypeEffects> dgmTypeEffects { get; set; }\n        public virtual DbSet<eveGraphics> eveGraphics { get; set; }\n        public virtual DbSet<eveIcons> eveIcons { get; set; }\n        public virtual DbSet<eveUnits> eveUnits { get; set; }\n        public virtual DbSet<industryActivity> industryActivity { get; set; }\n        public virtual DbSet<industryActivityMaterials> industryActivityMaterials { get; set; }\n        public virtual DbSet<industryActivityProbabilities> industryActivityProbabilities { get; set; }\n        public virtual DbSet<industryActivityProducts> industryActivityProducts { get; set; }\n        public virtual DbSet<industryActivitySkills> industryActivitySkills { get; set; }\n        public virtual DbSet<industryBlueprints> industryBlueprints { get; set; }\n        public virtual DbSet<invCategories> invCategories { get; set; }\n        public virtual DbSet<invContrabandTypes> invContrabandTypes { get; set; }\n        public virtual DbSet<invControlTowerResourcePurposes> invControlTowerResourcePurposes { get; set; }\n        public virtual DbSet<invControlTowerResources> invControlTowerResources { get; set; }\n        public virtual DbSet<invFlags> invFlags { get; set; }\n        public virtual DbSet<invGroups> invGroups { get; set; }\n        public virtual DbSet<invItems> invItems { get; set; }\n        public virtual DbSet<invMarketGroups> invMarketGroups { get; set; }\n        public virtual DbSet<invMetaGroups> invMetaGroups { get; set; }\n        public virtual DbSet<invMetaTypes> invMetaTypes { get; set; }\n        public virtual DbSet<invNames> invNames { get; set; }\n        public virtual DbSet<invPositions> invPositions { get; set; }\n        public virtual DbSet<invTraits> invTraits { get; set; }\n        public virtual DbSet<invTypeMaterials> invTypeMaterials { get; set; }\n        public virtual DbSet<invTypeReactions> invTypeReactions { get; set; }\n        public virtual DbSet<invTypes> invTypes { get; set; }\n        public virtual DbSet<invUniqueNames> invUniqueNames { get; set; }\n        public virtual DbSet<mapCelestialStatistics> mapCelestialStatistics { get; set; }\n        public virtual DbSet<mapConstellationJumps> mapConstellationJumps { get; set; }\n        public virtual DbSet<mapConstellations> mapConstellations { get; set; }\n        public virtual DbSet<mapDenormalize> mapDenormalize { get; set; }\n        public virtual DbSet<mapJumps> mapJumps { get; set; }\n        public virtual DbSet<mapLandmarks> mapLandmarks { get; set; }\n        public virtual DbSet<mapLocationScenes> mapLocationScenes { get; set; }\n        public virtual DbSet<mapLocationWormholeClasses> mapLocationWormholeClasses { get; set; }\n        public virtual DbSet<mapRegionJumps> mapRegionJumps { get; set; }\n        public virtual DbSet<mapRegions> mapRegions { get; set; }\n        public virtual DbSet<mapSolarSystemJumps> mapSolarSystemJumps { get; set; }\n        public virtual DbSet<mapSolarSystems> mapSolarSystems { get; set; }\n        public virtual DbSet<mapUniverse> mapUniverse { get; set; }\n        public virtual DbSet<planetSchematics> planetSchematics { get; set; }\n        public virtual DbSet<planetSchematicsPinMap> planetSchematicsPinMap { get; set; }\n        public virtual DbSet<planetSchematicsTypeMap> planetSchematicsTypeMap { get; set; }\n        public virtual DbSet<ramActivities> ramActivities { get; set; }\n        public virtual DbSet<ramAssemblyLineStations> ramAssemblyLineStations { get; set; }\n        public virtual DbSet<ramAssemblyLineTypeDetailPerCategory> ramAssemblyLineTypeDetailPerCategory { get; set; }\n        public virtual DbSet<ramAssemblyLineTypeDetailPerGroup> ramAssemblyLineTypeDetailPerGroup { get; set; }\n        public virtual DbSet<ramAssemblyLineTypes> ramAssemblyLineTypes { get; set; }\n        public virtual DbSet<ramInstallationTypeContents> ramInstallationTypeContents { get; set; }\n        public virtual DbSet<sknLicenses> sknLicenses { get; set; }\n        public virtual DbSet<sknMaterials> sknMaterials { get; set; }\n        public virtual DbSet<sknSkins> sknSkins { get; set; }\n        public virtual DbSet<staOperations> staOperations { get; set; }\n        public virtual DbSet<staOperationServices> staOperationServices { get; set; }\n        public virtual DbSet<staServices> staServices { get; set; }\n        public virtual DbSet<staStations> staStations { get; set; }\n        public virtual DbSet<staStationTypes> staStationTypes { get; set; }\n        public virtual DbSet<translationTables> translationTables { get; set; }\n        public virtual DbSet<trnTranslationColumns> trnTranslationColumns { get; set; }\n        public virtual DbSet<trnTranslationLanguages> trnTranslationLanguages { get; set; }\n        public virtual DbSet<trnTranslations> trnTranslations { get; set; }\n        public virtual DbSet<warCombatZones> warCombatZones { get; set; }\n        public virtual DbSet<warCombatZoneSystems> warCombatZoneSystems { get; set; }\n\n        protected override void OnModelCreating(DbModelBuilder modelBuilder)\n        {\n            modelBuilder.Entity<agtAgentTypes>()\n                .Property(e => e.agentType)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<chrAttributes>()\n                .Property(e => e.attributeName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<chrAttributes>()\n                .Property(e => e.description)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<chrFactions>()\n                .Property(e => e.factionName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<chrFactions>()\n                .Property(e => e.description)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<chrRaces>()\n                .Property(e => e.raceName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<chrRaces>()\n                .Property(e => e.description)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<chrRaces>()\n                .Property(e => e.shortDescription)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<crpNPCCorporations>()\n                .Property(e => e.size)\n                .IsFixedLength()\n                .IsUnicode(false);\n\n            modelBuilder.Entity<crpNPCCorporations>()\n                .Property(e => e.extent)\n                .IsFixedLength()\n                .IsUnicode(false);\n\n            modelBuilder.Entity<dgmAttributeTypes>()\n                .Property(e => e.attributeName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<dgmAttributeTypes>()\n                .Property(e => e.description)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<dgmAttributeTypes>()\n                .Property(e => e.displayName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<dgmEffects>()\n                .Property(e => e.effectName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<dgmEffects>()\n                .Property(e => e.description)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<dgmEffects>()\n                .Property(e => e.guid)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<dgmEffects>()\n                .Property(e => e.displayName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<dgmEffects>()\n                .Property(e => e.sfxName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<dgmEffects>()\n                .Property(e => e.modifierInfo)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<dgmExpressions>()\n                .Property(e => e.expressionValue)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<dgmExpressions>()\n                .Property(e => e.description)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<dgmExpressions>()\n                .Property(e => e.expressionName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<eveGraphics>()\n                .Property(e => e.graphicFile)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<eveGraphics>()\n                .Property(e => e.graphicType)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<eveGraphics>()\n                .Property(e => e.gfxRaceID)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<eveGraphics>()\n                .Property(e => e.colorScheme)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<eveGraphics>()\n                .Property(e => e.sofHullName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<eveIcons>()\n                .Property(e => e.iconFile)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<eveUnits>()\n                .Property(e => e.unitName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<eveUnits>()\n                .Property(e => e.displayName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<eveUnits>()\n                .Property(e => e.description)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<invControlTowerResourcePurposes>()\n                .Property(e => e.purposeText)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<invFlags>()\n                .Property(e => e.flagName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<invFlags>()\n                .Property(e => e.flagText)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<invTypes>()\n                .Property(e => e.basePrice);\n\n            modelBuilder.Entity<mapCelestialStatistics>()\n                .Property(e => e.spectralClass)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<mapLandmarks>()\n                .Property(e => e.landmarkName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<mapLandmarks>()\n                .Property(e => e.description)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<mapSolarSystems>()\n                .Property(e => e.securityClass)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<mapUniverse>()\n                .Property(e => e.universeName)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<ramActivities>()\n                .Property(e => e.iconNo)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<trnTranslationLanguages>()\n                .Property(e => e.languageID)\n                .IsUnicode(false);\n\n            modelBuilder.Entity<trnTranslations>()\n                .Property(e => e.languageID)\n                .IsUnicode(false);\n        }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/agtAgentTypes.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class agtAgentTypes\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int agentTypeID { get; set; }\n\n        [StringLength(50)]\n        public string agentType { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/agtAgents.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n\n    public partial class agtAgents\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int agentID { get; set; }\n\n        public int? divisionID { get; set; }\n\n        public int? corporationID { get; set; }\n\n        public int? locationID { get; set; }\n\n        public int? level { get; set; }\n\n        public int? quality { get; set; }\n\n        public int? agentTypeID { get; set; }\n\n        public bool? isLocator { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/agtResearchAgents.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class agtResearchAgents\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int agentID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int typeID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/certCerts.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class certCerts\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int certId { get; set; }\n\n        public int? groupID { get; set; }\n\n\t\t[StringLength(255)]\n        public string name { get; set; }\n\n        [StringLength(500)]\n        public string description { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/chrAncestries.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class chrAncestries\n    {\n        [Key]\n        public byte ancestryID { get; set; }\n\n        [StringLength(100)]\n        public string ancestryName { get; set; }\n\n        public byte? bloodlineID { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n\n        public byte? perception { get; set; }\n\n        public byte? willpower { get; set; }\n\n        public byte? charisma { get; set; }\n\n        public byte? memory { get; set; }\n\n        public byte? intelligence { get; set; }\n\n        public int? iconID { get; set; }\n\n        [StringLength(500)]\n        public string shortDescription { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/chrAttributes.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class chrAttributes\n    {\n        [Key]\n        public byte attributeID { get; set; }\n\n        [StringLength(100)]\n        public string attributeName { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n\n        public int? iconID { get; set; }\n\n        [StringLength(500)]\n        public string shortDescription { get; set; }\n\n        [StringLength(500)]\n        public string notes { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/chrBloodlines.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class chrBloodlines\n    {\n        [Key]\n        public byte bloodlineID { get; set; }\n\n        [StringLength(100)]\n        public string bloodlineName { get; set; }\n\n        public byte? raceID { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n\n        [StringLength(1000)]\n        public string maleDescription { get; set; }\n\n        [StringLength(1000)]\n        public string femaleDescription { get; set; }\n\n        public int? shipTypeID { get; set; }\n\n        public int? corporationID { get; set; }\n\n        public byte? perception { get; set; }\n\n        public byte? willpower { get; set; }\n\n        public byte? charisma { get; set; }\n\n        public byte? memory { get; set; }\n\n        public byte? intelligence { get; set; }\n\n        public int? iconID { get; set; }\n\n        [StringLength(500)]\n        public string shortDescription { get; set; }\n\n        [StringLength(500)]\n        public string shortMaleDescription { get; set; }\n\n        [StringLength(500)]\n        public string shortFemaleDescription { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/chrFactions.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class chrFactions\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int factionID { get; set; }\n\n        [StringLength(100)]\n        public string factionName { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n\n        public int? raceIDs { get; set; }\n\n        public int? solarSystemID { get; set; }\n\n        public int? corporationID { get; set; }\n\n        public double? sizeFactor { get; set; }\n\n        public int? stationCount { get; set; }\n\n        public int? stationSystemCount { get; set; }\n\n        public int? militiaCorporationID { get; set; }\n\n        public int? iconID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/chrRaces.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class chrRaces\n    {\n        [Key]\n        public byte raceID { get; set; }\n\n        [StringLength(100)]\n        public string raceName { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n\n        public int? iconID { get; set; }\n\n        [StringLength(500)]\n        public string shortDescription { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/cloneStates.cs",
    "content": "﻿using Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\n\nnamespace EVEMon.XmlGenerator.Models\n{\n    [JsonObject(MemberSerialization.OptIn)]\n    internal sealed class cloneStates\n    {\n        [JsonProperty]\n        public Dictionary<int, int> skills { get; set;  }\n\n        [JsonProperty]\n        public string internalDescription { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/crpActivities.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class crpActivities\n    {\n        [Key]\n        public byte activityID { get; set; }\n\n        [StringLength(100)]\n        public string activityName { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/crpNPCCorporationDivisions.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class crpNPCCorporationDivisions\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int corporationID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        public byte divisionID { get; set; }\n\n        public byte? size { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/crpNPCCorporationResearchFields.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class crpNPCCorporationResearchFields\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int skillID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int corporationID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/crpNPCCorporationTrades.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class crpNPCCorporationTrades\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int corporationID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int typeID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/crpNPCCorporations.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class crpNPCCorporations\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int corporationID { get; set; }\n\n        [StringLength(1)]\n        public string size { get; set; }\n\n        [StringLength(1)]\n        public string extent { get; set; }\n\n        public int? solarSystemID { get; set; }\n\n        public int? investorID1 { get; set; }\n\n        public byte? investorShares1 { get; set; }\n\n        public int? investorID2 { get; set; }\n\n        public byte? investorShares2 { get; set; }\n\n        public int? investorID3 { get; set; }\n\n        public byte? investorShares3 { get; set; }\n\n        public int? investorID4 { get; set; }\n\n        public byte? investorShares4 { get; set; }\n\n        public int? friendID { get; set; }\n\n        public int? enemyID { get; set; }\n\n        public long? publicShares { get; set; }\n\n        public int? initialPrice { get; set; }\n\n        public double? minSecurity { get; set; }\n\n        public bool? scattered { get; set; }\n\n        public byte? fringe { get; set; }\n\n        public byte? corridor { get; set; }\n\n        public byte? hub { get; set; }\n\n        public byte? border { get; set; }\n\n        public int? factionID { get; set; }\n\n        public double? sizeFactor { get; set; }\n\n        public short? stationCount { get; set; }\n\n        public short? stationSystemCount { get; set; }\n\n        [StringLength(4000)]\n        public string description { get; set; }\n\n        public int? iconID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/crpNPCDivisions.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class crpNPCDivisions\n    {\n        [Key]\n        public byte divisionID { get; set; }\n\n        [StringLength(100)]\n        public string divisionName { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n\n        [StringLength(100)]\n        public string leaderType { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/crtCertificates.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class crtCertificates\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int certificateID { get; set; }\n\n        public short? groupID { get; set; }\n\n        public int? classID { get; set; }\n\n        public byte? grade { get; set; }\n\n        public int? corpID { get; set; }\n\n        public int? iconID { get; set; }\n\n        [StringLength(500)]\n        public string description { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/crtClasses.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class crtClasses\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int classID { get; set; }\n\n        [StringLength(500)]\n        public string description { get; set; }\n\n        [StringLength(256)]\n        public string className { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/crtRecommendations.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class crtRecommendations\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int recommendationID { get; set; }\n\n        public int? shipTypeID { get; set; }\n\n        public int? certificateID { get; set; }\n\n        public byte recommendationLevel { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/crtRelationships.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class crtRelationships\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int relationshipID { get; set; }\n\n        public int? parentID { get; set; }\n\n        public int? parentTypeID { get; set; }\n\n        public byte? parentLevel { get; set; }\n\n        public int? childID { get; set; }\n\n        public byte? grade { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/dgmAttributeCategories.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class dgmAttributeCategories\n    {\n        [Key]\n        public byte categoryID { get; set; }\n\n        [StringLength(50)]\n        public string categoryName { get; set; }\n\n        [StringLength(200)]\n        public string categoryDescription { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/dgmAttributeTypes.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class dgmAttributeTypes\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int attributeID { get; set; }\n\n        [StringLength(100)]\n        public string attributeName { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n\n        public int? iconID { get; set; }\n\n        public double? defaultValue { get; set; }\n\n        public bool? published { get; set; }\n\n        [StringLength(100)]\n        public string displayName { get; set; }\n\n        public int? unitID { get; set; }\n\n        public bool? stackable { get; set; }\n\n        public bool? highIsGood { get; set; }\n\n        public int? categoryID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/dgmEffects.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class dgmEffects\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public short effectID { get; set; }\n\n        [StringLength(400)]\n        public string effectName { get; set; }\n\n        public short? effectCategory { get; set; }\n\n        public int? preExpression { get; set; }\n\n        public int? postExpression { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n\n        [StringLength(60)]\n        public string guid { get; set; }\n\n        public int? iconID { get; set; }\n\n        public bool? isOffensive { get; set; }\n\n        public bool? isAssistance { get; set; }\n\n        public short? durationAttributeID { get; set; }\n\n        public short? trackingSpeedAttributeID { get; set; }\n\n        public short? dischargeAttributeID { get; set; }\n\n        public short? rangeAttributeID { get; set; }\n\n        public short? falloffAttributeID { get; set; }\n\n        public bool? disallowAutoRepeat { get; set; }\n\n        public bool? published { get; set; }\n\n        [StringLength(100)]\n        public string displayName { get; set; }\n\n        public bool? isWarpSafe { get; set; }\n\n        public bool? rangeChance { get; set; }\n\n        public bool? electronicChance { get; set; }\n\n        public bool? propulsionChance { get; set; }\n\n        public byte? distribution { get; set; }\n\n        [StringLength(20)]\n        public string sfxName { get; set; }\n\n        public short? npcUsageChanceAttributeID { get; set; }\n\n        public short? npcActivationChanceAttributeID { get; set; }\n\n        public short? fittingUsageChanceAttributeID { get; set; }\n\n        public string modifierInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/dgmExpressions.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class dgmExpressions\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int expressionID { get; set; }\n\n        public int? operandID { get; set; }\n\n        public int? arg1 { get; set; }\n\n        public int? arg2 { get; set; }\n\n        [StringLength(100)]\n        public string expressionValue { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n\n        [StringLength(500)]\n        public string expressionName { get; set; }\n\n        public int? expressionTypeID { get; set; }\n\n        public short? expressionGroupID { get; set; }\n\n        public short? expressionAttributeID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/dgmMasteries.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class dgmMasteries\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int masteryID { get; set; }\n\n        public int certificateID { get; set; }\n\n        public byte grade { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/dgmTraits.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class dgmTraits\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int traitID { get; set; }\n\n        [Required]\n        [StringLength(500)]\n        public string bonusText { get; set; }\n\n        public byte? unitID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/dgmTypeAttributes.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class dgmTypeAttributes\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int typeID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public short attributeID { get; set; }\n\n        public int? valueInt { get; set; }\n\n        public double? valueFloat { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/dgmTypeEffects.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class dgmTypeEffects\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int typeID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public short effectID { get; set; }\n\n        public bool? isDefault { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/dgmTypeMasteries.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class dgmTypeMasteries\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int typeID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public short masteryID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/dgmTypeTraits.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class dgmTypeTraits\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int typeID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int parentTypeID { get; set; }\n\n        [Key]\n        [Column(Order = 2)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int traitID { get; set; }\n\n        public double? bonus { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/eveGraphics.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class eveGraphics\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int graphicID { get; set; }\n\n        [Required]\n        [StringLength(500)]\n        public string graphicFile { get; set; }\n\n        [Required]\n        public string description { get; set; }\n\n        public bool obsolete { get; set; }\n\n        [StringLength(100)]\n        public string graphicType { get; set; }\n\n        public bool? collidable { get; set; }\n\n        public int? directoryID { get; set; }\n\n        [Required]\n        [StringLength(64)]\n        public string graphicName { get; set; }\n\n        [StringLength(255)]\n        public string gfxRaceID { get; set; }\n\n        [StringLength(255)]\n        public string colorScheme { get; set; }\n\n        [StringLength(64)]\n        public string sofHullName { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/eveIcons.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class eveIcons\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int iconID { get; set; }\n\n        [Required]\n        [StringLength(500)]\n        public string iconFile { get; set; }\n\n        [Required]\n        public string description { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/eveUnits.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class eveUnits\n    {\n        [Key]\n        public byte unitID { get; set; }\n\n        [StringLength(100)]\n        public string unitName { get; set; }\n\n        [StringLength(50)]\n        public string displayName { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/industryActivity.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.XmlGenerator.Models\n{\n    [Table(\"industryActivity\")]\n    public partial class industryActivity\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int typeID { get; set; }\n\n        public int activityID { get; set; }\n\n        public int? time { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/industryActivityMaterials.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.XmlGenerator.Models\n{\n\tpublic partial class industryActivityMaterials\n\t{\n\t\t[Key]\n\t\t[DatabaseGenerated(DatabaseGeneratedOption.None)]\n\t\tpublic int? typeID { get; set; }\n\n\t\tpublic int? activityID { get; set; }\n\n\t\tpublic int? materialTypeID { get; set; }\n\n\t\tpublic int? quantity { get; set; }\n\t}\n}\n\n\n"
  },
  {
    "path": "tools/XmlGenerator/Models/industryActivityProbabilities.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.XmlGenerator.Models\n{\n\tpublic partial class industryActivityProbabilities\n\t{\n\t\t[Key]\n\t\t[DatabaseGenerated(DatabaseGeneratedOption.None)]\n\t\tpublic int? typeID { get; set; }\n\n\t\tpublic int? activityID { get; set; }\n\n\t\tpublic int? productTypeID { get; set; }\n\n\t\tpublic decimal? probability { get; set; }\n\t}\n}\n\n\n"
  },
  {
    "path": "tools/XmlGenerator/Models/industryActivityProducts.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.XmlGenerator.Models\n{\n\tpublic partial class industryActivityProducts\n\t{\n\t\t[Key]\n\t\t[DatabaseGenerated(DatabaseGeneratedOption.None)]\n\t\tpublic int? typeID { get; set; }\n\n\t\tpublic int? activityID { get; set; }\n\n\t\tpublic int? productTypeID { get; set; }\n\n\t\tpublic int? quantity { get; set; }\n\t}\n}\n\n\n"
  },
  {
    "path": "tools/XmlGenerator/Models/industryActivityRaces.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.XmlGenerator.Models\n{\n\tpublic partial class industryActivityRaces\n\t{\n\t\t[Key]\n\t\t[DatabaseGenerated(DatabaseGeneratedOption.None)]\n\t\tpublic int? typeID { get; set; }\n\n\t\tpublic int? activityID { get; set; }\n\n\t\tpublic int? productTypeID { get; set; }\n\n\t\tpublic int? raceID { get; set; }\n\t}\n}\n\n\n"
  },
  {
    "path": "tools/XmlGenerator/Models/industryActivitySkills.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.XmlGenerator.Models\n{\n\tpublic partial class industryActivitySkills\n\t{\n\t\t[Key]\n\t\t[DatabaseGenerated(DatabaseGeneratedOption.None)]\n\t\tpublic int? typeID { get; set; }\n\n\t\tpublic int? activityID { get; set; }\n\n\t\tpublic int? skillID { get; set; }\n\n\t\tpublic int? level { get; set; }\n\t}\n}\n\n\n"
  },
  {
    "path": "tools/XmlGenerator/Models/industryBlueprints.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace EVEMon.XmlGenerator.Models\n{\n\tpublic partial class industryBlueprints\n\t{\n\t\t[Key]\n\t\t[DatabaseGenerated(DatabaseGeneratedOption.None)]\n\t\tpublic int typeID { get; set; }\n\n\t\tpublic int maxProductionLimit { get; set; }\n\t}\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invCategories.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invCategories\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int categoryID { get; set; }\n\n        [StringLength(100)]\n        public string categoryName { get; set; }\n\n        public int? iconID { get; set; }\n\n        public bool? published { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invContrabandTypes.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invContrabandTypes\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int factionID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int typeID { get; set; }\n\n        public double? standingLoss { get; set; }\n\n        public double? confiscateMinSec { get; set; }\n\n        public double? fineByValue { get; set; }\n\n        public double? attackMinSec { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invControlTowerResourcePurposes.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invControlTowerResourcePurposes\n    {\n        [Key]\n        public byte purpose { get; set; }\n\n        [StringLength(100)]\n        public string purposeText { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invControlTowerResources.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invControlTowerResources\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int controlTowerTypeID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int resourceTypeID { get; set; }\n\n        public int? purpose { get; set; }\n\n        public int? quantity { get; set; }\n\n        public double? minSecurityLevel { get; set; }\n\n        public int? factionID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invFlags.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invFlags\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public short flagID { get; set; }\n\n        [StringLength(200)]\n        public string flagName { get; set; }\n\n        [StringLength(100)]\n        public string flagText { get; set; }\n\n        public int? orderID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invGroups.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invGroups\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int groupID { get; set; }\n\n        public int? categoryID { get; set; }\n\n        [StringLength(100)]\n        public string groupName { get; set; }\n\n        public int? iconID { get; set; }\n\n        public bool? useBasePrice { get; set; }\n\n        public bool? anchored { get; set; }\n\n        public bool? anchorable { get; set; }\n\n        public bool? fittableNonSingleton { get; set; }\n\n        public bool? published { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invItems.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invItems\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public long itemID { get; set; }\n\n        public int typeID { get; set; }\n\n        public int ownerID { get; set; }\n\n        public long locationID { get; set; }\n\n        public short flagID { get; set; }\n\n        public int quantity { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invMarketGroups.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invMarketGroups\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int marketGroupID { get; set; }\n\n        public int? parentGroupID { get; set; }\n\n        [StringLength(100)]\n        public string marketGroupName { get; set; }\n\n        [StringLength(3000)]\n        public string description { get; set; }\n\n        public int? iconID { get; set; }\n\n        public bool? hasTypes { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invMetaGroups.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invMetaGroups\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public short metaGroupID { get; set; }\n\n        [StringLength(100)]\n        public string metaGroupName { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n\n        public int? iconID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invMetaTypes.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invMetaTypes\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int typeID { get; set; }\n\n        public int? parentTypeID { get; set; }\n\n        public int? metaGroupID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invNames.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invNames\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public long itemID { get; set; }\n\n        [Required]\n        [StringLength(200)]\n        public string itemName { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invPositions.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invPositions\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public long itemID { get; set; }\n\n        public double x { get; set; }\n\n        public double y { get; set; }\n\n        public double z { get; set; }\n\n        public float? yaw { get; set; }\n\n        public float? pitch { get; set; }\n\n        public float? roll { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invTraits.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invTraits\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int traitID { get; set; }\n\n\t\tpublic int? typeID { get; set; }\n\n\t\tpublic int? skillID { get; set; }\n\n\t\tpublic float? bonus { get; set; }\n\n        [Required]\n        [StringLength(500)]\n        public string BonusText { get; set; }\n\n        public int? unitID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invTypeMaterials.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invTypeMaterials\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int typeID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int materialTypeID { get; set; }\n\n        public int quantity { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invTypeReactions.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invTypeReactions\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int reactionTypeID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        public bool input { get; set; }\n\n        [Key]\n        [Column(Order = 2)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int typeID { get; set; }\n\n        public int? quantity { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invTypes.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n\n    public partial class invTypes\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int typeID { get; set; }\n\n        public int? groupID { get; set; }\n\n        [StringLength(100)]\n        public string typeName { get; set; }\n\n        [StringLength(3000)]\n        public string description { get; set; }\n\n        public double? mass { get; set; }\n\n        public double? volume { get; set; }\n\n        public double? capacity { get; set; }\n\n        public int? portionSize { get; set; }\n\n        public int? raceID { get; set; }\n\n        [Column(TypeName = \"DECIMAL\")]\n        public decimal? basePrice { get; set; }\n\n        public bool? published { get; set; }\n\n        public int? marketGroupID { get; set; }\n\n        public int? graphicID { get; set; }\n\n        public int? iconID { get; set; }\n\n        public int? soundID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/invUniqueNames.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class invUniqueNames\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int itemID { get; set; }\n\n        [Required]\n        [StringLength(200)]\n        public string itemName { get; set; }\n\n        public int? groupID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/mapCelestialStatistics.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class mapCelestialStatistics\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int celestialID { get; set; }\n\n        public double? temperature { get; set; }\n\n        [StringLength(10)]\n        public string spectralClass { get; set; }\n\n        public double? luminosity { get; set; }\n\n        public double? age { get; set; }\n\n        public double? life { get; set; }\n\n        public double? orbitRadius { get; set; }\n\n        public double? eccentricity { get; set; }\n\n        public double? massDust { get; set; }\n\n        public double? massGas { get; set; }\n\n        public bool? fragmented { get; set; }\n\n        public double? density { get; set; }\n\n        public double? surfaceGravity { get; set; }\n\n        public double? escapeVelocity { get; set; }\n\n        public double? orbitPeriod { get; set; }\n\n        public double? rotationRate { get; set; }\n\n        public bool? locked { get; set; }\n\n        public double? pressure { get; set; }\n\n        public double? radius { get; set; }\n\n        public double? mass { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/mapConstellationJumps.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class mapConstellationJumps\n    {\n        public int? fromRegionID { get; set; }\n\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int fromConstellationID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int toConstellationID { get; set; }\n\n        public int? toRegionID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/mapConstellations.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class mapConstellations\n    {\n        public int? regionID { get; set; }\n\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int constellationID { get; set; }\n\n        [StringLength(100)]\n        public string constellationName { get; set; }\n\n        public double? x { get; set; }\n\n        public double? y { get; set; }\n\n        public double? z { get; set; }\n\n        public double? xMin { get; set; }\n\n        public double? xMax { get; set; }\n\n        public double? yMin { get; set; }\n\n        public double? yMax { get; set; }\n\n        public double? zMin { get; set; }\n\n        public double? zMax { get; set; }\n\n        public int? factionID { get; set; }\n\n        public double? radius { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/mapDenormalize.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    [Table(\"mapDenormalize\")]\n    public partial class mapDenormalize\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int itemID { get; set; }\n\n        public int? typeID { get; set; }\n\n        public int? groupID { get; set; }\n\n        public int? solarSystemID { get; set; }\n\n        public int? constellationID { get; set; }\n\n        public int? regionID { get; set; }\n\n        public int? orbitID { get; set; }\n\n        public double? x { get; set; }\n\n        public double? y { get; set; }\n\n        public double? z { get; set; }\n\n        public double? radius { get; set; }\n\n        [StringLength(100)]\n        public string itemName { get; set; }\n\n        public double? security { get; set; }\n\n        public byte? celestialIndex { get; set; }\n\n        public byte? orbitIndex { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/mapJumps.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class mapJumps\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int stargateID { get; set; }\n\n        public int? celestialID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/mapLandmarks.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class mapLandmarks\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public short landmarkID { get; set; }\n\n        [StringLength(100)]\n        public string landmarkName { get; set; }\n\n        [StringLength(7000)]\n        public string description { get; set; }\n\n        public int? locationID { get; set; }\n\n        public double? x { get; set; }\n\n        public double? y { get; set; }\n\n        public double? z { get; set; }\n\n        public double? radius { get; set; }\n\n        public int? iconID { get; set; }\n\n        public byte? importance { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/mapLocationScenes.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class mapLocationScenes\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int locationID { get; set; }\n\n        public int? graphicID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/mapLocationWormholeClasses.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class mapLocationWormholeClasses\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int locationID { get; set; }\n\n        public byte? wormholeClassID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/mapRegionJumps.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class mapRegionJumps\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int fromRegionID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int toRegionID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/mapRegions.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class mapRegions\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int regionID { get; set; }\n\n        [StringLength(100)]\n        public string regionName { get; set; }\n\n        public double? x { get; set; }\n\n        public double? y { get; set; }\n\n        public double? z { get; set; }\n\n        public double? xMin { get; set; }\n\n        public double? xMax { get; set; }\n\n        public double? yMin { get; set; }\n\n        public double? yMax { get; set; }\n\n        public double? zMin { get; set; }\n\n        public double? zMax { get; set; }\n\n        public int? factionID { get; set; }\n\n        public double? radius { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/mapSolarSystemJumps.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class mapSolarSystemJumps\n    {\n        public int? fromRegionID { get; set; }\n\n        public int? fromConstellationID { get; set; }\n\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int fromSolarSystemID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int toSolarSystemID { get; set; }\n\n        public int? toConstellationID { get; set; }\n\n        public int? toRegionID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/mapSolarSystems.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class mapSolarSystems\n    {\n        public int? regionID { get; set; }\n\n        public int? constellationID { get; set; }\n\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int solarSystemID { get; set; }\n\n        [StringLength(100)]\n        public string solarSystemName { get; set; }\n\n        public double? x { get; set; }\n\n        public double? y { get; set; }\n\n        public double? z { get; set; }\n\n        public double? xMin { get; set; }\n\n        public double? xMax { get; set; }\n\n        public double? yMin { get; set; }\n\n        public double? yMax { get; set; }\n\n        public double? zMin { get; set; }\n\n        public double? zMax { get; set; }\n\n        public double? luminosity { get; set; }\n\n        public bool? border { get; set; }\n\n        public bool? fringe { get; set; }\n\n        public bool? corridor { get; set; }\n\n        public bool? hub { get; set; }\n\n        public bool? international { get; set; }\n\n        public bool? regional { get; set; }\n\n        public bool? constellation { get; set; }\n\n        public double? security { get; set; }\n\n        public int? factionID { get; set; }\n\n        public double? radius { get; set; }\n\n        public int? sunTypeID { get; set; }\n\n        [StringLength(2)]\n        public string securityClass { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/mapUniverse.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    [Table(\"mapUniverse\")]\n    public partial class mapUniverse\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int universeID { get; set; }\n\n        [StringLength(100)]\n        public string universeName { get; set; }\n\n        public double? x { get; set; }\n\n        public double? y { get; set; }\n\n        public double? z { get; set; }\n\n        public double? xMin { get; set; }\n\n        public double? xMax { get; set; }\n\n        public double? yMin { get; set; }\n\n        public double? yMax { get; set; }\n\n        public double? zMin { get; set; }\n\n        public double? zMax { get; set; }\n\n        public double? radius { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/planetSchematics.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class planetSchematics\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public short schematicID { get; set; }\n\n        [StringLength(255)]\n        public string schematicName { get; set; }\n\n        public int? cycleTime { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/planetSchematicsPinMap.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    [Table(\"planetSchematicsPinMap\")]\n    public partial class planetSchematicsPinMap\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public short schematicID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int pinTypeID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/planetSchematicsTypeMap.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    [Table(\"planetSchematicsTypeMap\")]\n    public partial class planetSchematicsTypeMap\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public short schematicID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int typeID { get; set; }\n\n        public short? quantity { get; set; }\n\n        public bool? isInput { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/ramActivities.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class ramActivities\n    {\n        [Key]\n        public byte activityID { get; set; }\n\n        [StringLength(100)]\n        public string activityName { get; set; }\n\n        [StringLength(5)]\n        public string iconNo { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n\n        public bool? published { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/ramAssemblyLineStations.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class ramAssemblyLineStations\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int stationID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        public byte assemblyLineTypeID { get; set; }\n\n        public byte? quantity { get; set; }\n\n        public int? stationTypeID { get; set; }\n\n        public int? ownerID { get; set; }\n\n        public int? solarSystemID { get; set; }\n\n        public int? regionID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/ramAssemblyLineTypeDetailPerCategory.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    [Table(\"ramAssemblyLineTypeDetailPerCategory\")]\n    public partial class ramAssemblyLineTypeDetailPerCategory\n    {\n        [Key]\n        [Column(Order = 0)]\n        public byte assemblyLineTypeID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int categoryID { get; set; }\n\n        public double? timeMultiplier { get; set; }\n\n        public double? materialMultiplier { get; set; }\n\n        public double? costMultiplier { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/ramAssemblyLineTypeDetailPerGroup.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    [Table(\"ramAssemblyLineTypeDetailPerGroup\")]\n    public partial class ramAssemblyLineTypeDetailPerGroup\n    {\n        [Key]\n        [Column(Order = 0)]\n        public byte assemblyLineTypeID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int groupID { get; set; }\n\n        public double? timeMultiplier { get; set; }\n\n        public double? materialMultiplier { get; set; }\n\n        public double? costMultiplier { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/ramAssemblyLineTypes.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class ramAssemblyLineTypes\n    {\n        [Key]\n        public byte assemblyLineTypeID { get; set; }\n\n        [StringLength(100)]\n        public string assemblyLineTypeName { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n\n        public double? baseTimeMultiplier { get; set; }\n\n        public double? baseMaterialMultiplier { get; set; }\n\n        public double? baseCostMultiplier { get; set; }\n\n        public double? volume { get; set; }\n\n        public byte? activityID { get; set; }\n\n        public double? minCostPerHour { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/ramInstallationTypeContents.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class ramInstallationTypeContents\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int installationTypeID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        public byte assemblyLineTypeID { get; set; }\n\n        public byte? quantity { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/sknLicenses.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class sknLicenses\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int licenseTypeID { get; set; }\n\n        public int skinID { get; set; }\n\n        public int duration { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/sknMaterials.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class sknMaterials\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int skinMaterialID { get; set; }\n\n        public int materialSetID { get; set; }\n\n        public int displayNameID { get; set; }\n\n        [Required]\n        [StringLength(255)]\n        public string material { get; set; }\n\n        [StringLength(6)]\n        public string colorHull { get; set; }\n\n        [StringLength(6)]\n        public string colorWindow { get; set; }\n\n        [StringLength(6)]\n        public string colorPrimary { get; set; }\n\n        [StringLength(6)]\n        public string colorSecondary { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/sknSkins.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class sknSkins\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int skinID { get; set; }\n\n        [Required]\n        [StringLength(100)]\n        public string internalName { get; set; }\n\n        public int? skinMaterialID { get; set; }\n\n        public int? typeID { get; set; }\n\n        public bool allowCCPDevs { get; set; }\n\n        public bool visibleSerenity { get; set; }\n\n        public bool visibleTranquility { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/staOperationServices.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class staOperationServices\n    {\n        [Key]\n        [Column(Order = 0)]\n        public byte operationID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int serviceID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/staOperations.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class staOperations\n    {\n        public byte? activityID { get; set; }\n\n        [Key]\n        public byte operationID { get; set; }\n\n        [StringLength(100)]\n        public string operationName { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n\n        public byte? fringe { get; set; }\n\n        public byte? corridor { get; set; }\n\n        public byte? hub { get; set; }\n\n        public byte? border { get; set; }\n\n        public byte? ratio { get; set; }\n\n        public int? caldariStationTypeID { get; set; }\n\n        public int? minmatarStationTypeID { get; set; }\n\n        public int? amarrStationTypeID { get; set; }\n\n        public int? gallenteStationTypeID { get; set; }\n\n        public int? joveStationTypeID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/staServices.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class staServices\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int serviceID { get; set; }\n\n        [StringLength(100)]\n        public string serviceName { get; set; }\n\n        [StringLength(1000)]\n        public string description { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/staStationTypes.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class staStationTypes\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int stationTypeID { get; set; }\n\n        public double? dockEntryX { get; set; }\n\n        public double? dockEntryY { get; set; }\n\n        public double? dockEntryZ { get; set; }\n\n        public double? dockOrientationX { get; set; }\n\n        public double? dockOrientationY { get; set; }\n\n        public double? dockOrientationZ { get; set; }\n\n        public byte? operationID { get; set; }\n\n        public byte? officeSlots { get; set; }\n\n        public double? reprocessingEfficiency { get; set; }\n\n        public bool? conquerable { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/staStations.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class staStations\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public long stationID { get; set; }\n\n        public double? security { get; set; }\n\n        public double? dockingCostPerVolume { get; set; }\n\n        public double? maxShipVolumeDockable { get; set; }\n\n        public int? officeRentalCost { get; set; }\n\n        public int? operationID { get; set; }\n\n        public int? stationTypeID { get; set; }\n\n        public int? corporationID { get; set; }\n\n        public int? solarSystemID { get; set; }\n\n        public int? constellationID { get; set; }\n\n        public int? regionID { get; set; }\n\n        [StringLength(100)]\n        public string stationName { get; set; }\n\n        public double? x { get; set; }\n\n        public double? y { get; set; }\n\n        public double? z { get; set; }\n\n        public double? reprocessingEfficiency { get; set; }\n\n        public double? reprocessingStationsTake { get; set; }\n\n        public int? reprocessingHangarFlag { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/translationTables.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class translationTables\n    {\n        [Key]\n        [Column(Order = 0)]\n        [StringLength(200)]\n        public string sourceTable { get; set; }\n\n        [StringLength(200)]\n        public string destinationTable { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [StringLength(200)]\n        public string translatedKey { get; set; }\n\n        public int? tcGroupID { get; set; }\n\n        public int? tcID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/trnTranslationColumns.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class trnTranslationColumns\n    {\n        public short? tcGroupID { get; set; }\n\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public short tcID { get; set; }\n\n        [Required]\n        [StringLength(256)]\n        public string tableName { get; set; }\n\n        [Required]\n        [StringLength(128)]\n        public string columnName { get; set; }\n\n        [StringLength(128)]\n        public string masterID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/trnTranslationLanguages.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class trnTranslationLanguages\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int numericLanguageID { get; set; }\n\n        [StringLength(50)]\n        public string languageID { get; set; }\n\n        [StringLength(200)]\n        public string languageName { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/trnTranslations.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class trnTranslations\n    {\n        [Key]\n        [Column(Order = 0)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public short tcID { get; set; }\n\n        [Key]\n        [Column(Order = 1)]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int keyID { get; set; }\n\n        [Key]\n        [Column(Order = 2)]\n        [StringLength(50)]\n        public string languageID { get; set; }\n\n        [Required]\n        public string text { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/warCombatZoneSystems.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class warCombatZoneSystems\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int solarSystemID { get; set; }\n\n        public int? combatZoneID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Models/warCombatZones.cs",
    "content": "namespace EVEMon.XmlGenerator.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.ComponentModel.DataAnnotations.Schema;\n    using System.Data.Entity.Spatial;\n\n    public partial class warCombatZones\n    {\n        [Key]\n        [DatabaseGenerated(DatabaseGeneratedOption.None)]\n        public int combatZoneID { get; set; }\n\n        [StringLength(100)]\n        public string combatZoneName { get; set; }\n\n        public int? factionID { get; set; }\n\n        public int? centerSystemID { get; set; }\n\n        [StringLength(500)]\n        public string description { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Program.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.Threading;\nusing EVEMon.XmlGenerator.Datafiles;\nusing EVEMon.XmlGenerator.Providers;\nusing EVEMon.XmlGenerator.Utils;\nusing EVEMon.XmlGenerator.Xmlfiles;\n\nnamespace EVEMon.XmlGenerator\n{\n    internal static class Program\n    {\n        /// <summary>\n        /// The main entry point for the application.\n        /// </summary>\n        /// <returns></returns>\n        [STAThread]\n        private static void Main()\n        {\n            Stopwatch stopwatch = Stopwatch.StartNew();\n\n            // Setting a standard format for the generated files\n            Thread.CurrentThread.CurrentCulture = new CultureInfo(\"en-US\");\n\n            // Create tables from database\n            Database.CreateTables();\n\n            Console.WriteLine();\n\n            // Generate datafiles\n            Properties.GenerateDatafile();\n            Skills.GenerateDatafile();\n\n            //Masteries.GenerateDatafile();\n\n            Geography.GenerateDatafile();\n            Blueprints.GenerateDatafile();\n\t\t\tItems.GenerateDatafile(); // Requires GenerateProperties()\n            Reprocessing.GenerateDatafile(); // Requires GenerateItems()\n\n            // Generate MD5 Sums file\n            Util.CreateMD5SumsFile(\"MD5Sums.txt\");\n\n            // Generate support xml files\n            Flags.GenerateXmlfile();\n\n            Console.WriteLine(@\"Generating files completed in {0:g}\", stopwatch.Elapsed);\n            Console.WriteLine();\n            Console.Write(@\"Press any key to exit.\");\n            Console.ReadKey(true);\n        }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"XmlGenerator\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"EVEMon Development Team\")]\n[assembly: AssemblyProduct(\"EVEMonXmlGenerator\")]\n[assembly: AssemblyCopyright(\"Copyright © 2009-2016, EVEMon Development Team\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"0841083a-b601-4552-932c-2029117dd011\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n[assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: AssemblyInformationalVersion(\"1.0.0\")]\n\n// Neutral Language\n[assembly: NeutralResourcesLanguage(\"en-US\")]"
  },
  {
    "path": "tools/XmlGenerator/Providers/Database.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Globalization;\nusing System.Linq;\nusing EVEMon.Common.Constants;\nusing EVEMon.XmlGenerator.Collections;\nusing EVEMon.XmlGenerator.Extensions;\nusing EVEMon.XmlGenerator.Models;\nusing EVEMon.XmlGenerator.StaticData;\nusing EVEMon.XmlGenerator.Utils;\nusing System.Data.SQLite;\n\nnamespace EVEMon.XmlGenerator.Providers\n{\n    public static class Database\n    {\n        private static readonly EveStaticData s_context = new EveStaticData();\n\n        private static DateTime s_startTime;\n        private static string s_text = string.Empty;\n        private static int s_totalTablesCount;\n\n        #region Properties\n\n        /// <summary>\n        /// Gets the properties total count.\n        /// </summary>\n        /// <value>\n        /// The properties total count.\n        /// </value>\n        internal static int PropertiesTotalCount { get; private set; }\n\n        /// <summary>\n        /// Gets the items total count.\n        /// </summary>\n        /// <value>\n        /// The items total count.\n        /// </value>\n        internal static int ItemsTotalCount { get; private set; }\n\n        /// <summary>\n        /// Gets the skills total count.\n        /// </summary>\n        /// <value>\n        /// The skills total count.\n        /// </value>\n        internal static int SkillsTotalCount { get; private set; }\n\n        /// <summary>\n        /// Gets the certificates total count.\n        /// </summary>\n        /// <value>\n        /// The certificates total count.\n        /// </value>\n        internal static int CertificatesTotalCount { get; private set; }\n\n        /// <summary>\n        /// Gets the blueprints total count.\n        /// </summary>\n        /// <value>\n        /// The blueprints total count.\n        /// </value>\n        internal static int BlueprintsTotalCount { get; private set; }\n\n        /// <summary>\n        /// Gets the geography total count.\n        /// </summary>\n        /// <value>\n        /// The geography total count.\n        /// </value>\n        internal static int GeographyTotalCount { get; private set; }\n\n        /// <summary>\n        /// Gets the reprocessing total count.\n        /// </summary>\n        /// <value>\n        /// The reprocessing total count.\n        /// </value>\n        internal static int ReprocessingTotalCount { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the agt agents table.\n        /// </summary>\n        /// <value>The agt agents table.</value>\n        internal static BagCollection<AgtAgents> AgtAgentsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the agt agent types table.\n        /// </summary>\n        /// <value>The agt agent types table.</value>\n        internal static BagCollection<AgtAgentTypes> AgtAgentTypesTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the agt research agents table.\n        /// </summary>\n        /// <value>The agt research agents table.</value>\n        internal static BagCollection<AgtResearchAgents> AgtResearchAgentsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the chr factions table.\n        /// </summary>\n        /// <value>The chr factions table.</value>\n        internal static BagCollection<ChrFactions> ChrFactionsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the crp NPC divisions table.\n        /// </summary>\n        /// <value>The crp NPC divisions table.</value>\n        internal static BagCollection<CrpNPCDivisions> CrpNPCDivisionsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the dgm attribute categories table.\n        /// </summary>\n        /// <value>The dgm attribute categories table.</value>\n        internal static BagCollection<DgmAttributeCategories> DgmAttributeCategoriesTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the dgm attribute types table.\n        /// </summary>\n        /// <value>The dgm attribute types table.</value>\n        internal static BagCollection<DgmAttributeTypes> DgmAttributeTypesTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the dgm type attributes table.\n        /// </summary>\n        /// <value>The type attributes table.</value>\n        internal static RelationSetCollection<DgmTypeAttributes> DgmTypeAttributesTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the dgm type effects table.\n        /// </summary>\n        /// <value>The dgm type effects table.</value>\n        internal static RelationSetCollection<DgmTypeEffects> DgmTypeEffectsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the eve icons table.\n        /// </summary>\n        /// <value>The eve icons table.</value>\n        internal static BagCollection<EveIcons> EveIconsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the eve units table.\n        /// </summary>\n        /// <value>The eve units table.</value>\n        internal static BagCollection<EveUnits> EveUnitsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the industry activity table.\n        /// </summary>\n        /// <value>The industry activity.</value>\n        internal static RelationSetCollection<IndustryActivity> IndustryActivityTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the industry activity materials table.\n        /// </summary>\n        /// <value>The industry activity material.</value>\n        internal static RelationSetCollection<IndustryActivityMaterials> IndustryActivityMaterialsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the industry activity probabilities table.\n        /// </summary>\n        /// <value>The industry activity probability.</value>\n        internal static RelationSetCollection<IndustryActivityProbabilities> IndustryActivityProbabilitiesTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the industry activity products table.\n        /// </summary>\n        /// <value>The industry activity product.</value>\n        internal static RelationSetCollection<IndustryActivityProducts> IndustryActivityProductsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the industry activity skills table.\n        /// </summary>\n        /// <value>The industry activity skill.</value>\n        internal static RelationSetCollection<IndustryActivitySkills> IndustryActivitySkillsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the industry blueprints table.\n        /// </summary>\n        /// <value>The industry blueprint.</value>\n        internal static BagCollection<IndustryBlueprints> IndustryBlueprintsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the inv items table.\n        /// </summary>\n        /// <value>The inv items table.</value>\n        internal static BagCollection<InvItems> InvItemsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the inv names table.\n        /// </summary>\n        /// <value>The inv names table.</value>\n        internal static BagCollection<InvNames> InvNamesTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the dgm attribute types table.\n        /// </summary>\n        /// <value>The dgm attribute types table.</value>\n        internal static BagCollection<InvTraits> InvTraitsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the inv categories table.\n        /// </summary>\n        /// <value>The inv categories table.</value>\n        internal static BagCollection<InvCategories> InvCategoriesTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the inv control tower resource purposes table.\n        /// </summary>\n        /// <value>The inv control tower resource purposes table.</value>\n        internal static BagCollection<InvControlTowerResourcePurposes> InvControlTowerResourcePurposesTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the inv control tower resources table.\n        /// </summary>\n        /// <value>The inv control tower resource table.</value>\n        internal static List<InvControlTowerResources> InvControlTowerResourcesTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the inv flag table.\n        /// </summary>\n        /// <value>The inv flags table.</value>\n        internal static BagCollection<InvFlags> InvFlagsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the inv group table.\n        /// </summary>\n        /// <value>The inv groups table.</value>\n        internal static BagCollection<InvGroups> InvGroupsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the inv market group table.\n        /// </summary>\n        /// <value>The inv market groups table.</value>\n        internal static BagCollection<InvMarketGroups> InvMarketGroupsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the inv meta type table.\n        /// </summary>\n        /// <value>The inv meta types table.</value>\n        internal static RelationSetCollection<InvMetaTypes> InvMetaTypesTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the inv type table.\n        /// </summary>\n        /// <value>The inv types table.</value>\n        internal static BagCollection<InvTypes> InvTypesTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the inv type materials table.\n        /// </summary>\n        /// <value>The inv type materials table.</value>\n        internal static List<InvTypeMaterials> InvTypeMaterialsTable { get; private set; }\n\n        /// <summary>\n        /// Gets the inv type reactions table.\n        /// </summary>\n        internal static List<InvTypeReactions> InvTypeReactionsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the map regions table.\n        /// </summary>\n        /// <value>The map regions table.</value>\n        internal static BagCollection<MapRegions> MapRegionsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the map constellations table.\n        /// </summary>\n        /// <value>The map constellations table.</value>\n        internal static BagCollection<MapConstellations> MapConstellationsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the map solar system table.\n        /// </summary>\n        /// <value>The map solar systems table.</value>\n        internal static BagCollection<MapSolarSystems> MapSolarSystemsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the sta stations table.\n        /// </summary>\n        /// <value>The sta station table.</value>\n        internal static LongBagCollection<StaStations> StaStationsTable { get; private set; }\n\n        /// <summary>\n        /// Gets or sets the map solar system jump table.\n        /// </summary>\n        /// <value>The map solar system jumps table.</value>\n        internal static List<MapSolarSystemsJump> MapSolarSystemJumpsTable { get; private set; }\n\n        #endregion\n\n\n        #region Database Connection Methods\n\n        /// <summary>\n        /// Creates the connection to the SQL Database.\n        /// </summary>\n        /// <returns></returns>\n        private static SQLiteConnection CreateConnection()\n        {\n            s_text = \"Connecting to SQL Server... \";\n            Console.Write(s_text);\n\n            // Initialize the SQL Connection\n            SQLiteConnection connection = GetConnection(\"EveStaticData\");\n\n            try\n            {\n                connection.Open();\n\n                Console.SetCursorPosition(Console.CursorLeft - s_text.Length, Console.CursorTop);\n                Console.WriteLine(@\"Connection to SQL Server: Successful\");\n                Console.WriteLine();\n            }\n            catch (Exception ex)\n            {\n                Console.SetCursorPosition(Console.CursorLeft - s_text.Length, Console.CursorTop);\n                Console.WriteLine(@\"Connection to SQL Server: Failed\");\n                Console.WriteLine(@\"Reason: {0}\", ex.Message);\n                Console.Write(@\"Press any key to exit.\");\n                Console.ReadLine();\n                Environment.Exit(-1);\n            }\n\n            return connection;\n        }\n\n        /// <summary>\n        /// Gets the connection.\n        /// </summary>\n        /// <param name=\"connectionName\">Name of the connection.</param>\n        /// <returns></returns>\n        private static SQLiteConnection GetConnection(string connectionName)\n        {\n            ConnectionStringSettings connectionStringSetting = ConfigurationManager.ConnectionStrings[connectionName];\n            if (connectionStringSetting != null)\n                return new SQLiteConnection(connectionStringSetting.ConnectionString);\n\n            Console.SetCursorPosition(Console.CursorLeft - s_text.Length, Console.CursorTop);\n            Console.WriteLine(@\"Can not find conection string with name: {0}\", connectionName);\n            Console.Write(@\"Press any key to exit.\");\n            Console.ReadLine();\n            Environment.Exit(-1);\n            return null;\n        }\n\n        #endregion\n\n\n        #region Table Creation Methods\n\n        /// <summary>\n        /// Creates the tables from database.\n        /// </summary>\n        internal static void CreateTables()\n        {\n            s_totalTablesCount = Util.GetCountOfTypesInNamespace(\"EVEMon.XmlGenerator.StaticData\");\n\n            SQLiteConnection connection = CreateConnection();\n\n            // Data dumps are available from CCP\n            Console.Write(@\"Loading data from '{0}' database... \", connection.Database);\n\n            s_startTime = DateTime.Now;\n\n            Util.UpdatePercentDone(0);\n\n            AgtAgentsTable = Agents();\n            Util.UpdateProgress(s_totalTablesCount);\n            AgtAgentTypesTable = AgentTypes();\n            Util.UpdateProgress(s_totalTablesCount);\n            AgtResearchAgentsTable = ResearchAgents();\n            Util.UpdateProgress(s_totalTablesCount);\n            ChrFactionsTable = Factions();\n            Util.UpdateProgress(s_totalTablesCount);\n            CrpNPCDivisionsTable = NPCDivisions();\n            Util.UpdateProgress(s_totalTablesCount);\n            DgmAttributeCategoriesTable = AttributeCategories();\n            Util.UpdateProgress(s_totalTablesCount);\n            DgmAttributeTypesTable = AttributeTypes();\n            Util.UpdateProgress(s_totalTablesCount);\n            InvTraitsTable = Traits();\n            Util.UpdateProgress(s_totalTablesCount);\n            DgmTypeAttributesTable = TypeAttributes();\n            Util.UpdateProgress(s_totalTablesCount);\n            DgmTypeEffectsTable = TypeEffects();\n            Util.UpdateProgress(s_totalTablesCount);\n\n\t\t\t// Find out what this used to be and find a way around it... Is it even useful?\n\t\t\t//DgmTypeTraitsTable = TypeTraits();\n            //Util.UpdateProgress(s_totalTablesCount);\n\n            EveIconsTable = Icons();\n            Util.UpdateProgress(s_totalTablesCount);\n            EveUnitsTable = Units();\n            Util.UpdateProgress(s_totalTablesCount);\n\n            // New industry tables\n            IndustryActivityTable = IndustryActivity();\n            Util.UpdateProgress(s_totalTablesCount);\n            IndustryActivityMaterialsTable = IndustryActivityMaterials();\n            Util.UpdateProgress(s_totalTablesCount);\n            IndustryActivityProbabilitiesTable = IndustryActivityProbabilities();\n            Util.UpdateProgress(s_totalTablesCount);\n            IndustryActivityProductsTable = IndustryActivityProducts();\n            Util.UpdateProgress(s_totalTablesCount);\n            IndustryActivitySkillsTable = IndustryActivitySkills();\n            Util.UpdateProgress(s_totalTablesCount);\n            IndustryBlueprintsTable = IndustryBlueprints();\n            Util.UpdateProgress(s_totalTablesCount);\n\n            InvCategoriesTable = Categories();\n            Util.UpdateProgress(s_totalTablesCount);\n            InvControlTowerResourcePurposesTable = ControlTowerResourcePurposes();\n            Util.UpdateProgress(s_totalTablesCount);\n            InvControlTowerResourcesTable = ControlTowerResources();\n            Util.UpdateProgress(s_totalTablesCount);\n            InvFlagsTable = Flags();\n            Util.UpdateProgress(s_totalTablesCount);\n            InvGroupsTable = Groups();\n            Util.UpdateProgress(s_totalTablesCount);\n            InvItemsTable = Items();\n            Util.UpdateProgress(s_totalTablesCount);\n            InvMarketGroupsTable = MarketGroups();\n            Util.UpdateProgress(s_totalTablesCount);\n            InvMetaTypesTable = MetaTypes();\n            Util.UpdateProgress(s_totalTablesCount);\n            InvNamesTable = Names();\n            Util.UpdateProgress(s_totalTablesCount);\n            InvTypeMaterialsTable = TypeMaterials();\n            Util.UpdateProgress(s_totalTablesCount);\n            InvTypeReactionsTable = TypeReactions();\n            Util.UpdateProgress(s_totalTablesCount);\n            InvTypesTable = Types();\n            Util.UpdateProgress(s_totalTablesCount);\n            MapConstellationsTable = Constellations();\n            Util.UpdateProgress(s_totalTablesCount);\n            MapRegionsTable = Regions();\n            Util.UpdateProgress(s_totalTablesCount);\n            MapSolarSystemJumpsTable = SolarSystemsJumps();\n            Util.UpdateProgress(s_totalTablesCount);\n            MapSolarSystemsTable = SolarSystems();\n            Util.UpdateProgress(s_totalTablesCount);\n\n            StaStationsTable = Stations();\n            Util.UpdateProgress(s_totalTablesCount);\n\n            Console.WriteLine(@\" in {0}\", DateTime.Now.Subtract(s_startTime).ToString(\"g\", CultureConstants.DefaultCulture));\n        }\n\n        /// <summary>\n        /// Agent Agents.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Agent Agents.</returns>\n        private static BagCollection<AgtAgents> Agents()\n        {\n            IndexedCollection<AgtAgents> collection = new IndexedCollection<AgtAgents>();\n\n            foreach (agtAgents agent in s_context.agtAgents)\n            {\n                AgtAgents item = new AgtAgents\n                {\n                    ID = agent.agentID,\n                };\n\n                if (agent.divisionID.HasValue)\n                    item.DivisionID = agent.divisionID.Value;\n\n                if (agent.locationID.HasValue)\n                    item.LocationID = agent.locationID.Value;\n\n                if (agent.level.HasValue)\n                    item.Level = agent.level.Value;\n\n                if (agent.quality.HasValue)\n                    item.Quality = agent.quality.Value;\n\n                if (agent.agentTypeID.HasValue)\n                    item.AgentTypeID = agent.agentTypeID.Value;\n\n                if (agent.isLocator.HasValue)\n                    item.IsLocator = agent.isLocator.Value;\n\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Agent Agent Types.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Agent Agent Types.</returns>\n        private static BagCollection<AgtAgentTypes> AgentTypes()\n        {\n            IndexedCollection<AgtAgentTypes> collection = new IndexedCollection<AgtAgentTypes>();\n\n            foreach (AgtAgentTypes item in s_context.agtAgentTypes.Select(\n                agentType => new AgtAgentTypes\n                {\n                    ID = agentType.agentTypeID,\n                    AgentType = agentType.agentType\n                }))\n            {\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Agent Research Agents.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Agent Research Agents.</returns>\n        private static BagCollection<AgtResearchAgents> ResearchAgents()\n        {\n            IndexedCollection<AgtResearchAgents> collection = new IndexedCollection<AgtResearchAgents>();\n\n            foreach (AgtResearchAgents item in s_context.agtResearchAgents.Select(\n                researchAgent => new AgtResearchAgents\n                {\n                    ID = researchAgent.agentID,\n                    ResearchSkillID = researchAgent.typeID\n                }))\n            {\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Character Factions.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Character Factions.</returns>\n        private static BagCollection<ChrFactions> Factions()\n        {\n            IndexedCollection<ChrFactions> collection = new IndexedCollection<ChrFactions>();\n\n            foreach (chrFactions faction in s_context.chrFactions)\n            {\n                ChrFactions item = new ChrFactions\n                {\n                    ID = faction.factionID,\n                    FactionName = faction.factionName,\n                    Description = faction.description,\n                    MilitiaCorporationID = faction.militiaCorporationID,\n                };\n\n                item.Description = item.Description.Clean();\n\n                if (faction.raceIDs.HasValue)\n                    item.RaceID = faction.raceIDs.Value;\n\n                if (faction.solarSystemID.HasValue)\n                    item.SolarSystemID = faction.solarSystemID.Value;\n\n                if (faction.corporationID.HasValue)\n                    item.CorporationID = faction.corporationID.Value;\n\n                if (faction.sizeFactor.HasValue)\n                    item.SizeFactor = faction.sizeFactor.Value;\n\n\t\t\t\t// TODO - Fix these...\n                if (faction.stationCount.HasValue)\n                    item.StationCount = (short)faction.stationCount.Value;\n\n                if (faction.stationSystemCount.HasValue)\n                    item.StationSystemCount = (short)faction.stationSystemCount.Value;\n\n                if (faction.iconID.HasValue)\n                    item.IconID = faction.iconID.Value;\n\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Corporation NPC Divisions.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Corporation NPC Divisions.</returns>\n        private static BagCollection<CrpNPCDivisions> NPCDivisions()\n        {\n            var collection = new IndexedCollection<CrpNPCDivisions>();\n            var items = collection.Items;\n\n            foreach (CrpNPCDivisions item in s_context.crpNPCDivisions.Select(\n                npcDivision => new CrpNPCDivisions\n                {\n                    ID = npcDivision.divisionID,\n                    DivisionName = npcDivision.divisionName\n                }))\n            {\n                items.Add(item);\n            }\n\n            // Looks like some new divisions were forgotten in the SDE\n            for (int i = 18; i <= 30; i++)\n                items.Add(new CrpNPCDivisions\n                {\n                    ID = i, DivisionName = \"Unknown\"\n                });\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Dogma Attribute categories.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Dogma Attribute Categories.</returns>\n        private static BagCollection<DgmAttributeCategories> AttributeCategories()\n        {\n            IndexedCollection<DgmAttributeCategories> collection = new IndexedCollection<DgmAttributeCategories>();\n\n            foreach (DgmAttributeCategories item in s_context.dgmAttributeCategories.Select(\n                category => new DgmAttributeCategories\n                {\n                    ID = category.categoryID,\n                    Description = category.categoryDescription,\n                    Name = category.categoryName\n                }))\n            {\n                item.Description = item.Description.Clean();\n                item.Name = item.Name.Clean();\n\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Dogma Attribute Types.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Dogma Attribute Types.</returns>\n        private static BagCollection<DgmAttributeTypes> AttributeTypes()\n        {\n            IndexedCollection<DgmAttributeTypes> collection = new IndexedCollection<DgmAttributeTypes>();\n\n            foreach (dgmAttributeTypes attribute in s_context.dgmAttributeTypes)\n            {\n                DgmAttributeTypes item = new DgmAttributeTypes\n                {\n                    ID = attribute.attributeID,\n                    CategoryID = attribute.categoryID,\n                    Description = attribute.description,\n                    DisplayName = attribute.displayName,\n                    IconID = attribute.iconID,\n                    Name = attribute.attributeName,\n                    UnitID = attribute.unitID,\n                };\n\n                item.Description = item.Description.Clean();\n                item.DisplayName = item.DisplayName.Clean();\n                item.Name = item.Name.Clean();\n\n                if (attribute.defaultValue.HasValue)\n                    item.DefaultValue = attribute.defaultValue.Value.ToString(CultureInfo.InvariantCulture);\n\n                if (attribute.published.HasValue)\n                    item.Published = attribute.published.Value;\n\n                if (attribute.highIsGood.HasValue)\n                    item.HigherIsBetter = attribute.highIsGood.Value;\n\n                collection.Items.Add(item);\n            }\n\n            // Set properties total count\n            PropertiesTotalCount = collection.Items.Count;\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Dogma Traits.\n        /// </summary>\n        /// <returns></returns>\n        private static BagCollection<InvTraits> Traits()\n        {\n            IndexedCollection<InvTraits> collection = new IndexedCollection<InvTraits>();\n\n            foreach (InvTraits item in s_context.invTraits.Select(\n                trait => new InvTraits\n                {\n                    ID = trait.traitID,\n\t\t\t\t\tskillID = trait.skillID,\n\t\t\t\t\ttypeID = trait.typeID,\n\t\t\t\t\tbonus = trait.bonus,\n                    BonusText = trait.BonusText,\n                    UnitID = trait.unitID\n                }))\n            {\n                item.BonusText = item.BonusText.Clean();\n\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Dogma Type Attributes.\n        /// </summary>\n        /// <returns><c>RelationSetCollection</c> of attributes for types.</returns>\n        private static RelationSetCollection<DgmTypeAttributes> TypeAttributes()\n        {\n            IEnumerable<DgmTypeAttributes> list = s_context.dgmTypeAttributes.Select(\n                typeAttribute => new DgmTypeAttributes\n                {\n                    AttributeID = typeAttribute.attributeID,\n                    ItemID = typeAttribute.typeID,\n                    ValueFloat = typeAttribute.valueFloat,\n                    ValueInt64 = typeAttribute.valueInt\n                }).ToList();\n\n            return new RelationSetCollection<DgmTypeAttributes>(list);\n        }\n\n        /// <summary>\n        /// Dogma Type Effects.\n        /// </summary>\n        /// <returns><c>RelationSetCollection</c> of Types and Effects.</returns>\n        private static RelationSetCollection<DgmTypeEffects> TypeEffects()\n        {\n            List<DgmTypeEffects> list = s_context.dgmTypeEffects.Select(\n                typeEffect => new DgmTypeEffects\n                {\n                    EffectID = typeEffect.effectID,\n                    ItemID = typeEffect.typeID\n                }).ToList();\n\n            return new RelationSetCollection<DgmTypeEffects>(list);\n        }\n\n        /// <summary>\n        /// EVE Icons.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of EVE icons.</returns>\n        private static BagCollection<EveIcons> Icons()\n        {\n            IndexedCollection<EveIcons> collection = new IndexedCollection<EveIcons>();\n\n            foreach (EveIcons item in s_context.eveIcons.Select(\n                icon => new EveIcons\n                {\n                    ID = icon.iconID,\n                    Icon = icon.iconFile\n                }))\n            {\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// EVE Units.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of EVE Units.</returns>\n        private static BagCollection<EveUnits> Units()\n        {\n            IndexedCollection<EveUnits> collection = new IndexedCollection<EveUnits>();\n\n            foreach (EveUnits item in s_context.eveUnits.Select(\n                unit => new EveUnits\n                {\n                    Description = unit.description,\n                    DisplayName = unit.displayName,\n                    ID = unit.unitID,\n                    Name = unit.unitName\n                }))\n            {\n                item.Description = item.Description.Clean();\n                item.DisplayName = item.DisplayName.Clean();\n\n                collection.Items.Add(item);\n            }\n            \n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Industry Activity.\n        /// </summary>\n        /// <returns><c>RelationSetCollection</c> of industry activities</returns>\n        private static RelationSetCollection<IndustryActivity> IndustryActivity()\n        {\n            IEnumerable<IndustryActivity> list = s_context.industryActivity.Select(x =>\n            new IndustryActivity()\n            {\n                ActivityID = x.activityID,\n                BlueprintTypeID = x.typeID,\n                Time = x.time\n            });\n\n            return new RelationSetCollection<IndustryActivity>(list);\n        }\n\n        /// <summary>\n        /// Industry Activity Materials.\n        /// </summary>\n        /// <returns><c>RelationSetCollection</c> of industry activity materials</returns>\n        private static RelationSetCollection<IndustryActivityMaterials> IndustryActivityMaterials()\n        {\n            IEnumerable<IndustryActivityMaterials> list = s_context.industryActivityMaterials\n                .Where(x => x.activityID.HasValue && x.typeID.HasValue && x.materialTypeID.HasValue)\n                .Select(x => new IndustryActivityMaterials()\n                {\n                    ActivityID = x.activityID.Value,\n                    BlueprintTypeID = x.typeID.Value,\n                    MaterialTypeID = x.materialTypeID.Value,\n                    Quantity = x.quantity\n                });\n            return new RelationSetCollection<IndustryActivityMaterials>(list);\n        }\n\n        /// <summary>\n        /// Industry Activity Probabilities.\n        /// </summary>\n        /// <returns><c>RelationSetCollection</c> of industry activity probabilities</returns>\n        private static RelationSetCollection<IndustryActivityProbabilities> IndustryActivityProbabilities()\n        {\n            IEnumerable<IndustryActivityProbabilities> list = s_context.industryActivityProbabilities\n                .Where(x => x.activityID.HasValue && x.typeID.HasValue && x.productTypeID.HasValue)\n                .Select(x => new IndustryActivityProbabilities()\n                {\n                    ActivityID = x.activityID.Value,\n                    BlueprintTypeID = x.typeID.Value,\n                    ProductTypeID = x.productTypeID.Value,\n                    Probability = x.probability\n                });\n\n            return new RelationSetCollection<IndustryActivityProbabilities>(list);\n        }\n\n        /// <summary>\n        /// Industry Activity Products.\n        /// </summary>\n        /// <returns><c>RelationSetCollection</c> of industry activity products</returns>\n        private static RelationSetCollection<IndustryActivityProducts> IndustryActivityProducts()\n        {\n            IEnumerable<IndustryActivityProducts> list = s_context.industryActivityProducts\n                .Where(x => x.activityID.HasValue && x.typeID.HasValue && x.productTypeID.HasValue)\n                .Select(x => new IndustryActivityProducts()\n                {\n                    ActivityID = x.activityID.Value,\n                    BlueprintTypeID = x.typeID.Value,\n                    ProductTypeID = x.productTypeID.Value,\n                    Quantity = x.quantity\n                });\n\n            return new RelationSetCollection<IndustryActivityProducts>(list);\n        }\n\n        /// <summary>\n        /// Industry Activity Skills.\n        /// </summary>\n        /// <returns><c>RelationSetCollection</c> of industry activity skills</returns>\n        private static RelationSetCollection<IndustryActivitySkills> IndustryActivitySkills()\n        {\n            IEnumerable<IndustryActivitySkills> list = s_context.industryActivitySkills\n                .Where(x => x.activityID.HasValue && x.typeID.HasValue && x.skillID.HasValue)\n                .Select(x => new IndustryActivitySkills()\n                {\n                    ActivityID = x.activityID.Value,\n                    BlueprintTypeID = x.typeID.Value,\n                    SkillID = x.skillID.Value,\n                    Level = x.level\n                });\n\n            return new RelationSetCollection<IndustryActivitySkills>(list);\n        }\n\n        /// <summary>\n        /// Industry Blueprints.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of industry blueprints.</returns>\n        private static BagCollection<IndustryBlueprints> IndustryBlueprints()\n        {\n            IndexedCollection<IndustryBlueprints> collection = new IndexedCollection<IndustryBlueprints>();\n\n            foreach (industryBlueprints blueprint in s_context.industryBlueprints)\n            {\n                IndustryBlueprints item = new IndustryBlueprints\n                {\n                    ID = blueprint.typeID,\n                    MaxProductionLimit = blueprint.maxProductionLimit\n                };\n\n                collection.Items.Add(item);\n            }\n\n            BlueprintsTotalCount = collection.Items.Count;\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Inventory Categories.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Inventory Categories.</returns>\n        private static BagCollection<InvCategories> Categories()\n        {\n            IndexedCollection<InvCategories> collection = new IndexedCollection<InvCategories>();\n\n            foreach (invCategories category in s_context.invCategories)\n            {\n                InvCategories item = new InvCategories\n                {\n                    ID = category.categoryID,\n                    Name = category.categoryName,\n                    IconID = category.iconID\n                };\n\n                if (category.published.HasValue)\n                    item.Published = category.published.Value;\n\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Inventory Control Tower Resource Purposes.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Inventory Control Tower Resource Purposes.</returns>\n        private static BagCollection<InvControlTowerResourcePurposes> ControlTowerResourcePurposes()\n        {\n            IndexedCollection<InvControlTowerResourcePurposes> collection =\n                new IndexedCollection<InvControlTowerResourcePurposes>();\n\n            foreach (InvControlTowerResourcePurposes item in s_context.invControlTowerResourcePurposes.Select(\n                resource => new InvControlTowerResourcePurposes\n                {\n                    ID = resource.purpose,\n                    PurposeName = resource.purposeText,\n                }))\n            {\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Inventory Control Tower Resources.\n        /// </summary>\n        /// <returns><c>List</c> of Inventory Control Tower Resources .</returns>\n        private static List<InvControlTowerResources> ControlTowerResources()\n        {\n            List<InvControlTowerResources> list = new List<InvControlTowerResources>();\n\n            foreach (invControlTowerResources resource in s_context.invControlTowerResources)\n            {\n                InvControlTowerResources item = new InvControlTowerResources\n                {\n                    ID = resource.controlTowerTypeID,\n                    ResourceID = resource.resourceTypeID,\n                    MinSecurityLevel = resource.minSecurityLevel,\n                    FactionID = resource.factionID,\n                };\n\n                if (resource.purpose.HasValue)\n                    item.PurposeID = resource.purpose.Value;\n\n                if (resource.quantity.HasValue)\n                    item.Quantity = resource.quantity.Value;\n\n                list.Add(item);\n            }\n\n            return list;\n        }\n\n        /// <summary>\n        /// Inventory Flags.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Inventory Flags.</returns>\n        private static BagCollection<InvFlags> Flags()\n        {\n            IndexedCollection<InvFlags> collection = new IndexedCollection<InvFlags>();\n\n            foreach (InvFlags item in s_context.invFlags.Select(\n                flag => new InvFlags\n                {\n                    ID = flag.flagID,\n                    Name = flag.flagName,\n                    Text = flag.flagText,\n                }))\n            {\n                item.Text = item.Text.Clean();\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Inventory Groups.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Inventory Groups.</returns>\n        private static BagCollection<InvGroups> Groups()\n        {\n            IndexedCollection<InvGroups> collection = new IndexedCollection<InvGroups>();\n\n            foreach (invGroups group in s_context.invGroups)\n            {\n                InvGroups item = new InvGroups\n                {\n                    ID = group.groupID,\n                    Name = group.groupName,\n\t\t\t\t\tUseBasePrice = group.useBasePrice,\n\t\t\t\t\tAnchored = group.anchored,\n\t\t\t\t\tAnchorable = group.anchorable,\n\t\t\t\t\tFittableNonSingleton = group.fittableNonSingleton\n                };\n\n                if (group.published.HasValue)\n                    item.Published = group.published.Value;\n\n                if (group.categoryID.HasValue)\n                    item.CategoryID = group.categoryID.Value;\n\n                collection.Items.Add(item);\n            }\n\n            // CCPLease missing groups\n            collection.Items.Add(new InvGroups() {\n                ID = 4052, Name = \"Jump Filament Blueprint\", Anchorable = false,\n                Anchored = false, FittableNonSingleton = false, Published = false\n            });\n            collection.Items.Add(new InvGroups() {\n                ID = 4053, Name = \"Irregular Capsule\", Anchorable = false,\n                Anchored = false, FittableNonSingleton = false, Published = false\n            });\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Inventory Items.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Inventory Items.</returns>\n        private static BagCollection<InvItems> Items()\n        {\n            IndexedCollection<InvItems> collection = new IndexedCollection<InvItems>();\n\n            foreach (InvItems item in s_context.invItems.Select(\n                item => new InvItems\n                {\n                    ID = (int)item.itemID,\n                    FlagID = (int)item.flagID,\n                    LocationID = (int)item.locationID,\n                    OwnerID = item.ownerID,\n                    Quantity = item.quantity,\n                    TypeID = item.typeID\n                }))\n            {\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Inventory Market Groups.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Market Groups available on the market.</returns>\n        private static BagCollection<InvMarketGroups> MarketGroups()\n        {\n            IndexedCollection<InvMarketGroups> collection = new IndexedCollection<InvMarketGroups>();\n\n            foreach (InvMarketGroups item in s_context.invMarketGroups.Select(\n                marketGroup => new InvMarketGroups\n                {\n                    ID = marketGroup.marketGroupID,\n                    Description = marketGroup.description,\n                    IconID = marketGroup.iconID,\n                    Name = marketGroup.marketGroupName,\n                    ParentID = marketGroup.parentGroupID\n                }))\n            {\n                item.Description = item.Description.Clean();\n\n                collection.Items.Add(item);\n            }\n\n            // CCPLease missing market groups\n            collection.Items.Add(new InvMarketGroups()\n            {\n                ID = 2763, Name = \"Mobile Cynosural Beacons\", ParentID = 404,\n                Description = \"\", IconID = 0\n            });\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Inventory Meta Types.\n        /// </summary>\n        /// <returns><c>RelationSetCollection</c> parent-child relationships between types.</returns>\n        private static RelationSetCollection<InvMetaTypes> MetaTypes()\n        {\n            List<InvMetaTypes> list = new List<InvMetaTypes>();\n\n            foreach (invMetaTypes metaType in s_context.invMetaTypes)\n            {\n                InvMetaTypes item = new InvMetaTypes\n                {\n                    ItemID = metaType.typeID\n                };\n\n                if (metaType.metaGroupID.HasValue)\n                    item.MetaGroupID = Convert.ToInt32(metaType.metaGroupID, CultureInfo.InvariantCulture);\n\n                if (metaType.parentTypeID.HasValue)\n                    item.ParentItemID = Convert.ToInt32(metaType.parentTypeID, CultureInfo.InvariantCulture);\n                list.Add(item);\n            }\n            return new RelationSetCollection<InvMetaTypes>(list);\n        }\n\n        /// <summary>\n        /// Inventory Names.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Inventory Names.</returns>\n        private static BagCollection<InvNames> Names()\n        {\n            IndexedCollection<InvNames> collection = new IndexedCollection<InvNames>();\n\n            foreach (InvNames item in s_context.invNames.Select(\n                name => new InvNames\n                {\n                    ID = (int)name.itemID,\n                    Name = name.itemName\n                }))\n            {\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Inventory Materials.\n        /// </summary>\n        /// <returns>List of Materials.</returns>\n        private static List<InvTypeMaterials> TypeMaterials()\n            => s_context.invTypeMaterials.Select(\n                material => new InvTypeMaterials\n                {\n                    ID = material.typeID,\n                    MaterialTypeID = material.materialTypeID,\n                    Quantity = material.quantity\n                }).ToList();\n\n        /// <summary>\n        /// Inventory Type Reactions.\n        /// </summary>\n        /// <returns>List of reaction info.</returns>\n        private static List<InvTypeReactions> TypeReactions()\n        {\n            List<InvTypeReactions> list = new List<InvTypeReactions>();\n\n            foreach (invTypeReactions reaction in s_context.invTypeReactions)\n            {\n                InvTypeReactions item = new InvTypeReactions\n                {\n                    ID = reaction.reactionTypeID,\n                    Input = reaction.input,\n                    TypeID = reaction.typeID,\n                };\n\n                if (reaction.quantity.HasValue)\n                    item.Quantity = reaction.quantity.Value;\n\n                list.Add(item);\n            }\n\n            return list;\n        }\n\n        /// <summary>\n        /// Inventory Types.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of items from the Inventory.</returns>\n        private static BagCollection<InvTypes> Types()\n        {\n            IndexedCollection<InvTypes> collection = new IndexedCollection<InvTypes>();\n\n            foreach (invTypes type in s_context.invTypes)\n            {\n                InvTypes item = new InvTypes\n                {\n                    ID = type.typeID,\n                    Description = type.description,\n                    MarketGroupID = type.marketGroupID,\n                    Name = type.typeName,\n                    RaceID = type.raceID\n                };\n                item.Description = item.Description.Clean();\n\n                if (type.basePrice.HasValue)\n                    item.BasePrice = type.basePrice.Value;\n\n                if (type.capacity.HasValue)\n                    item.Capacity = type.capacity.Value;\n\n                if (type.groupID.HasValue)\n                    item.GroupID = type.groupID.Value;\n\n                if (type.mass.HasValue)\n                    item.Mass = type.mass.Value;\n\n                if (type.published.HasValue)\n                    item.Published = type.published.Value;\n\n                if (type.volume.HasValue)\n                    item.Volume = type.volume.Value;\n\n                if (type.portionSize.HasValue)\n                    item.PortionSize = type.portionSize.Value;\n\n                collection.Items.Add(item);\n            }\n\n            // Set items total count\n            ItemsTotalCount = ReprocessingTotalCount = collection.Items.Count;\n\n            // Set skills total count\n            SkillsTotalCount = collection.Items.Count(item => item.GroupID != DBConstants.\n                FakeSkillsGroupID && InvGroupsTable[item.GroupID].CategoryID ==\n                DBConstants.SkillCategoryID);\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Map Constellations.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Map Constellations.</returns>\n        /// <remarks>Constallations in the EVE Universe.</remarks>\n        private static BagCollection<MapConstellations> Constellations()\n        {\n            IndexedCollection<MapConstellations> collection = new IndexedCollection<MapConstellations>();\n\n            foreach (mapConstellations constellation in s_context.mapConstellations)\n            {\n                MapConstellations item = new MapConstellations\n                {\n                    ID = constellation.constellationID,\n                    Name = constellation.constellationName,\n                };\n\n                if (constellation.regionID.HasValue)\n                    item.RegionID = constellation.regionID.Value;\n\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Map Regions.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Map Regions.</returns>\n        /// <remarks>Regions in the EVE Universe.</remarks>\n        private static BagCollection<MapRegions> Regions()\n        {\n            IndexedCollection<MapRegions> collection = new IndexedCollection<MapRegions>();\n\n            foreach (MapRegions item in s_context.mapRegions.Select(\n                region => new MapRegions\n                {\n                    ID = region.regionID,\n                    Name = region.regionName,\n                    FactionID = region.factionID\n                }))\n            {\n                collection.Items.Add(item);\n            }\n\n            GeographyTotalCount = collection.Items.Count;\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Map Solar Systems Jump.\n        /// </summary>\n        /// <returns><c>List</c> of Map Solar Systems Jump.</returns>\n        /// <remarks>Jumps between two solar systems in the EVE Universe.</remarks>\n        private static List<MapSolarSystemsJump> SolarSystemsJumps()\n            => s_context.mapSolarSystemJumps.Select(\n                jump => new MapSolarSystemsJump\n                {\n                    A = jump.fromSolarSystemID,\n                    B = jump.toSolarSystemID\n                }).ToList();\n\n        /// <summary>\n        /// Map Solar Systems.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Map Solar Systems.</returns>\n        private static BagCollection<MapSolarSystems> SolarSystems()\n        {\n            IndexedCollection<MapSolarSystems> collection = new IndexedCollection<MapSolarSystems>();\n\n            foreach (mapSolarSystems solarsystem in s_context.mapSolarSystems)\n            {\n                MapSolarSystems item = new MapSolarSystems\n                {\n                    ID = solarsystem.solarSystemID,\n                    Name = solarsystem.solarSystemName\n                };\n\n                if (solarsystem.constellationID.HasValue)\n                    item.ConstellationID = solarsystem.constellationID.Value;\n\n                if (solarsystem.security.HasValue)\n                    item.SecurityLevel = (float)solarsystem.security.Value;\n\n                if (solarsystem.x.HasValue)\n                    item.X = solarsystem.x.Value;\n\n                if (solarsystem.y.HasValue)\n                    item.Y = solarsystem.y.Value;\n\n                if (solarsystem.z.HasValue)\n                    item.Z = solarsystem.z.Value;\n\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        /// <summary>\n        /// Station Stations.\n        /// </summary>\n        /// <returns><c>BagCollection</c> of Station Stations.</returns>\n        /// <remarks>Stations in the EVE Universe.</remarks>\n        private static LongBagCollection<StaStations> Stations()\n        {\n            LongIndexedCollection<StaStations> collection = new LongIndexedCollection<StaStations>();\n\n            foreach (staStations station in s_context.staStations)\n            {\n                StaStations item = new StaStations\n                {\n                    ID = station.stationID,\n                    Name = station.stationName,\n                };\n\n                if (station.reprocessingEfficiency.HasValue)\n                    item.ReprocessingEfficiency = (float)station.reprocessingEfficiency.Value;\n\n                if (station.reprocessingStationsTake.HasValue)\n                    item.ReprocessingStationsTake = (float)station.reprocessingStationsTake.Value;\n\n                if (station.security.HasValue)\n                    item.SecurityLevel = station.security.Value;\n\n                if (station.solarSystemID.HasValue)\n                    item.SolarSystemID = station.solarSystemID.Value;\n\n                if (station.corporationID.HasValue)\n                    item.CorporationID = station.corporationID.Value;\n\n                collection.Items.Add(item);\n            }\n\n            return collection.ToBag();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/Providers/HoboleaksAlphaSkills.cs",
    "content": "﻿using EVEMon.XmlGenerator.Models;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Net;\n\nnamespace EVEMon.XmlGenerator.Providers {\n    // Fetches the max alpha skills from a new location to make it not hard coded!\n\tinternal static class HoboleaksAlphaSkills\n    {\n        public static IDictionary<int, int> GetAlphaSkillLimits()\n        {\n            var request = WebRequest.CreateHttp(\"http://sde.hoboleaks.space/tq/clonestates.json\");\n            var result = new Dictionary<int, int>(256);\n            IDictionary<int, cloneStates> raw;\n            using (var response = request.GetResponse())\n            {\n                var stream = response.GetResponseStream();\n                var serializer = new JsonSerializer() { MaxDepth = 4 };\n                using (var reader = new JsonTextReader(new StreamReader(stream)))\n                {\n                    raw = serializer.Deserialize<Dictionary<int, cloneStates>>(reader);\n                }\n            }\n            foreach (var pair in raw)\n            {\n                foreach (var skillLevel in pair.Value.skills)\n                {\n                    int id = skillLevel.Key;\n                    if (result.TryGetValue(id, out int existing))\n                        result[id] = Math.Max(existing, skillLevel.Value);\n                    else\n                        result.Add(id, skillLevel.Value);\n                }\n            }\n            return result;\n        }\n\t}\n}\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/AgtAgentTypes.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class AgtAgentTypes : IHasID\n    {\n        [XmlElement(\"agentTypeID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"agentType\")]\n        public string AgentType { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/AgtAgents.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class AgtAgents : IHasID\n    {\n        [XmlElement(\"agentID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"divisionID\")]\n        public int DivisionID { get; set; }\n\n        [XmlElement(\"locationID\")]\n        public int LocationID { get; set; }\n\n        [XmlElement(\"level\")]\n        public int Level { get; set; }\n\n        [XmlElement(\"quality\")]\n        public int Quality { get; set; }\n\n        [XmlElement(\"agentTypeID\")]\n        public int AgentTypeID { get; set; }\n\n        [XmlElement(\"isLocator\")]\n        public bool IsLocator { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/AgtResearchAgents.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class AgtResearchAgents : IHasID\n    {\n        [XmlElement(\"agentID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"typeID\")]\n        public int ResearchSkillID { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/ChrFactions.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class ChrFactions : IHasID\n    {\n        [XmlElement(\"factionID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"factionName\")]\n        public string FactionName { get; set; }\n\n        [XmlElement(\"description\")]\n        public string Description { get; set; }\n\n        [XmlElement(\"raceID\")]\n        public int RaceID { get; set; }\n\n        [XmlElement(\"solarSystemID\")]\n        public int SolarSystemID { get; set; }\n\n        [XmlElement(\"corporationID\")]\n        public int CorporationID { get; set; }\n\n        [XmlElement(\"sizeFactor\")]\n        public double SizeFactor { get; set; }\n\n        [XmlElement(\"stationCount\")]\n        public short StationCount { get; set; }\n\n        [XmlElement(\"stationSystemCount\")]\n        public short StationSystemCount { get; set; }\n\n        [XmlElement(\"militiaCorporationID\")]\n        public int? MilitiaCorporationID { get; set; }\n\n        [XmlElement(\"iconID\")]\n        public int IconID { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/CrpNPCDivisions.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class CrpNPCDivisions : IHasID\n    {\n        [XmlElement(\"divisionID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"divisionName\")]\n        public string DivisionName { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/CrtCertificates.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class CrtCertificates : IHasID\n    {\n        [XmlElement(\"certificateID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"groupID\")]\n        public int GroupID { get; set; }\n\n        [XmlElement(\"classID\")]\n        public int ClassID { get; set; }\n\n        [XmlElement(\"grade\")]\n        public int Grade { get; set; }\n\n        [XmlElement(\"description\")]\n        public string Description { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/CrtClasses.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class CrtClasses : IHasID\n    {\n        [XmlElement(\"classID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"description\")]\n        public string Description { get; set; }\n\n        [XmlElement(\"className\")]\n        public string ClassName { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/CrtRecommendations.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class CrtRecommendations : IHasID\n    {\n        [XmlElement(\"recommendationID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"shipTypeID\")]\n        public int ShipTypeID { get; set; }\n\n        [XmlElement(\"certificateID\")]\n        public int CertificateID { get; set; }\n\n        [XmlElement(\"recommendationLevel\")]\n        public int Level { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/CrtRelationships.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class CrtRelationships : IHasID\n    {\n        [XmlElement(\"relationshipID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"parentID\")]\n        public int? ParentID { get; set; }\n\n        [XmlElement(\"parentTypeID\")]\n        public int ParentTypeID { get; set; }\n\n        [XmlElement(\"parentLevel\")]\n        public int ParentLevel { get; set; }\n\n        [XmlElement(\"childID\")]\n        public int ChildID { get; set; }\n\n        [XmlElement(\"grade\")]\n        public short Grade { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/DgmAttributeCategories.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class DgmAttributeCategories : IHasID\n    {\n        [XmlElement(\"categoryID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"categoryName\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"categoryDescription\")]\n        public string Description { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/DgmAttributeTypes.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class DgmAttributeTypes : IHasID\n    {\n        [XmlElement(\"attributeID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"description\")]\n        public string Description { get; set; }\n\n        [XmlElement(\"attributeName\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"displayName\")]\n        public string DisplayName { get; set; }\n\n        [XmlElement(\"defaultValue\")]\n        public string DefaultValue { get; set; }\n\n        [XmlElement(\"iconID\")]\n        public int? IconID { get; set; }\n\n        [XmlElement(\"published\")]\n        public bool Published { get; set; }\n\n        [XmlElement(\"unitID\")]\n        public int? UnitID { get; set; }\n\n        [XmlElement(\"categoryID\")]\n        public int? CategoryID { get; set; }\n\n        [XmlElement(\"highIsGood\")]\n        public bool HigherIsBetter { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/DgmMasteries.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class DgmMasteries : IHasID\n    {\n        [XmlElement(\"masteryID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"certificateID\")]\n        public int CertificateID { get; set; }\n\n        [XmlElement(\"grade\")]\n        public short Grade { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/DgmTraits.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class DgmTraits : IHasID\n    {\n        [XmlElement(\"traitID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"bonusText\")]\n        public string BonusText { get; set; }\n\n        [XmlElement(\"unitID\")]\n        public int? UnitID { get; set; }\n\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/DgmTypeAttributes.cs",
    "content": "﻿using System;\nusing System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class DgmTypeAttributes : IRelation\n    {\n        [XmlElement(\"typeID\")]\n        public int ItemID { get; set; }\n\n        [XmlElement(\"attributeID\")]\n        public int AttributeID { get; set; }\n\n        [XmlElement(\"valueInt\")]\n        public long? ValueInt64 { get; set; }\n\n        [XmlElement(\"valueFloat\")]\n        public double? ValueFloat { get; set; }\n\n        /// <summary>\n        /// Returns the value as an integer. \n        /// Some integer values are actually stored as floats in the DB, hence this trick.\n        /// </summary>\n        /// <returns></returns>\n        [XmlIgnore]\n        internal long GetInt64Value => ValueFloat.HasValue ? Convert.ToInt64(ValueFloat.Value) : ValueInt64.HasValue ? ValueInt64.Value : 0;\n\n\n        #region IRelation Members\n\n        /// <summary>\n        /// Gets the left column value.\n        /// </summary>\n        /// <value>The left.</value>\n        int IRelation.Left => ItemID;\n\n        /// <summary>\n        /// Gets the center column value.\n        /// </summary>\n        /// <value>\n        /// The center.\n        /// </value>\n        int IRelation.Center => 0;\n\n        /// <summary>\n        /// Gets the right column value.\n        /// </summary>\n        /// <value>The right.</value>\n        int IRelation.Right => AttributeID;\n\n        #endregion\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/DgmTypeEffects.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class DgmTypeEffects : IRelation\n    {\n        [XmlElement(\"typeID\")]\n        public int ItemID { get; set; }\n\n        [XmlElement(\"effectID\")]\n        public int EffectID { get; set; }\n\n\n        #region IRelation Members\n\n        /// <summary>\n        /// Gets the left column value.\n        /// </summary>\n        /// <value>The left.</value>\n        int IRelation.Left => ItemID;\n\n        /// <summary>\n        /// Gets the center column value.\n        /// </summary>\n        /// <value>\n        /// The center.\n        /// </value>\n        int IRelation.Center => 0;\n\n        /// <summary>\n        /// Gets the right column value.\n        /// </summary>\n        /// <value>The right.</value>\n        int IRelation.Right => EffectID;\n\n        #endregion\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/DgmTypeMasteries.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class DgmTypeMasteries : IRelation\n    {\n        [XmlElement(\"typeID\")]\n        public int ItemID { get; set; }\n\n        [XmlElement(\"masteryID\")]\n        public int MasteryID { get; set; }\n\n\n        #region IRelation Members\n\n        /// <summary>\n        /// Gets the left column value.\n        /// </summary>\n        /// <value>The left.</value>\n        int IRelation.Left => ItemID;\n\n        /// <summary>\n        /// Gets the center column value.\n        /// </summary>\n        /// <value>\n        /// The center.\n        /// </value>\n        int IRelation.Center => 0;\n\n        /// <summary>\n        /// Gets the right column value.\n        /// </summary>\n        /// <value>The right.</value>\n        int IRelation.Right => MasteryID;\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/DgmTypeTraits.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class DgmTypeTraits : IRelation\n    {\n        [XmlElement(\"typeID\")]\n        public int ItemID { get; set; }\n\n        [XmlElement(\"parentTypeID\")]\n        public int ParentItemID { get; set; }\n\n        [XmlElement(\"traitID\")]\n        public int TraitID { get; set; }\n\n        [XmlElement(\"bonus\")]\n        public double? Bonus { get; set; }\n\n\n        #region IRelation Members\n\n        /// <summary>\n        /// Gets the left column value.\n        /// </summary>\n        /// <value>The left.</value>\n        int IRelation.Left => ItemID;\n\n        /// <summary>\n        /// Gets the center column value.\n        /// </summary>\n        /// <value>\n        /// The center.\n        /// </value>\n        int IRelation.Center => ParentItemID;\n\n        /// <summary>\n        /// Gets the right column value.\n        /// </summary>\n        /// <value>The right.</value>\n        int IRelation.Right => TraitID;\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/EveIcons.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class EveIcons : IHasID\n    {\n        [XmlElement(\"iconID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"iconFile\")]\n        public string Icon { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/EveUnits.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class EveUnits : IHasID\n    {\n        [XmlElement(\"unitID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"unitName\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"displayName\")]\n        public string DisplayName { get; set; }\n\n        [XmlElement(\"description\")]\n        public string Description { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/IndustryActivity.cs",
    "content": "﻿using EVEMon.XmlGenerator.Interfaces;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class IndustryActivity : IRelation\n\t{\n\t\t[XmlElement(\"typeID\")]\n        public int BlueprintTypeID { get; set; }\n\n        [XmlElement(\"activityID\")]\n\t\tpublic int ActivityID { get; set; }\n\n        [XmlElement(\"time\")]\n\t\tpublic int? Time { get; set; }\n\n        #region IRelation Members\n\n        /// <summary>\n        /// Gets the left column value.\n        /// </summary>\n        /// <value>The left.</value>\n        int IRelation.Left => BlueprintTypeID;\n\n        /// <summary>\n        /// Gets the center column value.\n        /// </summary>\n        /// <value>\n        /// The center.\n        /// </value>\n        int IRelation.Center => 0;\n\n        /// <summary>\n        /// Gets the right column value.\n        /// </summary>\n        /// <value>The right.</value>\n        int IRelation.Right => ActivityID;\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/IndustryActivityMaterials.cs",
    "content": "﻿using EVEMon.XmlGenerator.Interfaces;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class IndustryActivityMaterials : IRelation\n\t{\n        [XmlElement(\"typeID\")]\n\t\tpublic int BlueprintTypeID { get; set; }\n\n        [XmlElement(\"activityID\")]\n\t\tpublic int ActivityID { get; set; }\n\n        [XmlElement(\"materialTypeID\")]\n\t\tpublic int MaterialTypeID { get; set; }\n\n        [XmlElement(\"quantity\")]\n\t\tpublic int? Quantity { get; set; }\n\n        #region IRelation Members\n\n        /// <summary>\n        /// Gets the left column value.\n        /// </summary>\n        /// <value>The left.</value>\n        int IRelation.Left => BlueprintTypeID;\n\n        /// <summary>\n        /// Gets the center column value.\n        /// </summary>\n        /// <value>\n        /// The center.\n        /// </value>\n        int IRelation.Center => ActivityID;\n\n        /// <summary>\n        /// Gets the right column value.\n        /// </summary>\n        /// <value>The right.</value>\n        int IRelation.Right => MaterialTypeID;\n\n        #endregion\n    }\n}\n\n\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/IndustryActivityProbabilities.cs",
    "content": "﻿using EVEMon.XmlGenerator.Interfaces;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class IndustryActivityProbabilities : IRelation\n\t{\n\t\t[XmlElement(\"typeID\")]\n\t\tpublic int BlueprintTypeID { get; set; }\n\n        [XmlElement(\"activityID\")]\n\t\tpublic int ActivityID { get; set; }\n\n        [XmlElement(\"productTypeID\")]\n\t\tpublic int ProductTypeID { get; set; }\n\n        [XmlElement(\"probability\")]\n\t\tpublic decimal? Probability { get; set; }\n\n        #region IRelation Members\n\n        /// <summary>\n        /// Gets the left column value.\n        /// </summary>\n        /// <value>The left.</value>\n        int IRelation.Left => BlueprintTypeID;\n\n        /// <summary>\n        /// Gets the center column value.\n        /// </summary>\n        /// <value>\n        /// The center.\n        /// </value>\n        int IRelation.Center => ActivityID;\n\n        /// <summary>\n        /// Gets the right column value.\n        /// </summary>\n        /// <value>The right.</value>\n        int IRelation.Right => ProductTypeID;\n\n        #endregion\n    }\n}\n\n\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/IndustryActivityProducts.cs",
    "content": "﻿using EVEMon.XmlGenerator.Interfaces;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class IndustryActivityProducts : IRelation\n\t{\n        [XmlElement(\"typeID\")]\n        public int BlueprintTypeID { get; set; }\n\n        [XmlElement(\"activityID\")]\n        public int ActivityID { get; set; }\n\n        [XmlElement(\"productTypeID\")]\n        public int ProductTypeID { get; set; }\n\n        [XmlElement(\"quantity\")]\n        public int? Quantity { get; set; }\n\n        #region IRelation Members\n\n        /// <summary>\n        /// Gets the left column value.\n        /// </summary>\n        /// <value>The left.</value>\n        int IRelation.Left => BlueprintTypeID;\n\n        /// <summary>\n        /// Gets the center column value.\n        /// </summary>\n        /// <value>\n        /// The center.\n        /// </value>\n        int IRelation.Center => ActivityID;\n\n        /// <summary>\n        /// Gets the right column value.\n        /// </summary>\n        /// <value>The right.</value>\n        int IRelation.Right => ProductTypeID;\n\n        #endregion\n    }\n}\n\n\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/IndustryActivitySkills.cs",
    "content": "﻿using EVEMon.XmlGenerator.Interfaces;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class IndustryActivitySkills : IRelation\n\t{\n        [XmlElement(\"typeID\")]\n        public int BlueprintTypeID { get; set; }\n\n        [XmlElement(\"activityID\")]\n        public int ActivityID { get; set; }\n\n        [XmlElement(\"skillID\")]\n        public int SkillID { get; set; }\n\n        [XmlElement(\"level\")]\n\t\tpublic int? Level { get; set; }\n\n        #region IRelation Members\n\n        /// <summary>\n        /// Gets the left column value.\n        /// </summary>\n        /// <value>The left.</value>\n        int IRelation.Left => BlueprintTypeID;\n\n        /// <summary>\n        /// Gets the center column value.\n        /// </summary>\n        /// <value>\n        /// The center.\n        /// </value>\n        int IRelation.Center => ActivityID;\n\n        /// <summary>\n        /// Gets the right column value.\n        /// </summary>\n        /// <value>The right.</value>\n        int IRelation.Right => SkillID;\n\n        #endregion\n    }\n}\n\n\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/IndustryBlueprints.cs",
    "content": "﻿using EVEMon.XmlGenerator.Interfaces;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class IndustryBlueprints : IHasID\n\t{\n\t\t[XmlElement(\"typeID\")]\n\t\tpublic int ID { get; set; }\n\n        [XmlElement(\"maxProductionLimit\")]\n\t\tpublic int MaxProductionLimit { get; set; }\n\t}\n}\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/InvCategories.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class InvCategories : IHasID\n    {\n        [XmlElement(\"categoryID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"categoryName\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"iconID\")]\n        public int? IconID { get; set; }\n\n        [XmlElement(\"published\")]\n        public bool Published { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/InvControlTowerResourcePurposes.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class InvControlTowerResourcePurposes : IHasID\n    {\n        [XmlElement(\"purpose\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"purposeText\")]\n        public string PurposeName { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/InvControlTowerResources.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class InvControlTowerResources : IHasID\n    {\n        [XmlElement(\"controlTowerTypeID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"resourceTypeID\")]\n        public int ResourceID { get; set; }\n\n        [XmlElement(\"purposeID\")]\n        public int PurposeID { get; set; }\n\n        [XmlElement(\"quantity\")]\n        public long Quantity { get; set; }\n\n        [XmlElement(\"minSecurityLevel\")]\n        public double? MinSecurityLevel { get; set; }\n\n        [XmlElement(\"factionID\")]\n        public int? FactionID { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/InvFlags.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class InvFlags : IHasID\n    {\n        [XmlElement(\"flagID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"flagName\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"flagText\")]\n        public string Text { get; set; }\n\n        [XmlElement(\"orderID\")]\n        public short OrderID { get; set; }\n\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/InvGroups.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class InvGroups : IHasID\n    {\n        [XmlElement(\"groupID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"categoryID\")]\n        public int CategoryID { get; set; }\n\n        [XmlElement(\"groupName\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"decription\")]\n        public string Description { get; set; }\n\n        [XmlElement(\"published\")]\n        public bool? Published { get; set; }\n\n\t\tpublic bool? UseBasePrice { get; set; }\n\t\tpublic bool? Anchored { get; set; }\n\t\tpublic bool? Anchorable { get; set; }\n\t\tpublic bool? FittableNonSingleton { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/InvItems.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class InvItems : IHasID\n    {\n        [XmlElement(\"itemID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"typeID\")]\n        public int TypeID { get; set; }\n\n        [XmlElement(\"ownerID\")]\n        public int OwnerID { get; set; }\n\n        [XmlElement(\"locationID\")]\n        public int LocationID { get; set; }\n\n        [XmlElement(\"flagID\")]\n        public int FlagID { get; set; }\n\n        [XmlElement(\"quantity\")]\n        public int Quantity { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/InvMarketGroups.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class InvMarketGroups : IHasID\n    {\n        [XmlElement(\"marketGroupID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"marketGroupName\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"parentGroupID\")]\n        public int? ParentID { get; set; }\n\n        [XmlElement(\"iconID\")]\n        public int? IconID { get; set; }\n\n        [XmlElement(\"description\")]\n        public string Description { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/InvMetaTypes.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class InvMetaTypes : IRelation\n    {\n        [XmlElement(\"typeID\")]\n        public int ItemID { get; set; }\n\n        [XmlElement(\"parentTypeID\")]\n        public int ParentItemID { get; set; }\n\n        [XmlElement(\"metaGroupID\")]\n        public int MetaGroupID { get; set; }\n\n\n        #region IRelation Members\n\n        /// <summary>\n        /// Gets the left column value.\n        /// </summary>\n        /// <value>The left.</value>\n        int IRelation.Left => ItemID;\n\n        /// <summary>\n        /// Gets the center column value.\n        /// </summary>\n        /// <value>\n        /// The center.\n        /// </value>\n        int IRelation.Center => ParentItemID;\n\n        /// <summary>\n        /// Gets the right.\n        /// </summary>\n        /// <value>The right column value.</value>\n        int IRelation.Right => MetaGroupID;\n\n        #endregion\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/InvNames.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class InvNames : IHasID\n    {\n        [XmlElement(\"itemID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"itemName\")]\n        public string Name { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/InvTraits.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class InvTraits : IHasID\n    {\n        [XmlElement(\"traitID\")]\n        public int ID { get; set; }\n\n\t\t[XmlElement(\"skillID\")]\n\t\tpublic int? skillID { get; set; }\n\n\t\t[XmlElement(\"typeID\")]\n\t\tpublic int? typeID { get; set; }\n\n\t\tpublic double? bonus { get; set; }\n\n        [XmlElement(\"bonusText\")]\n        public string BonusText { get; set; }\n\n        [XmlElement(\"unitID\")]\n        public int? UnitID { get; set; }\n    }\n}\n"
  },
  {
    "path": "tools/XmlGenerator/StaticData/InvTypeMaterials.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class InvTypeMaterials : IHasID\n    {\n        [XmlElement(\"typeID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"materialTypeID\")]\n        public int MaterialTypeID { get; set; }\n\n        [XmlElement(\"quantity\")]\n        public int Quantity { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/InvTypeReactions.cs",
    "content": "using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class InvTypeReactions : IHasID\n    {\n        [XmlElement(\"reactionTypeID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"input\")]\n        public bool Input { get; set; }\n\n        [XmlElement(\"typeID\")]\n        public int TypeID { get; set; }\n\n        [XmlElement(\"quantity\")]\n        public int Quantity { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/InvTypes.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class InvTypes : IHasID\n    {\n        [XmlElement(\"typeID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"groupID\")]\n        public int GroupID { get; set; }\n\n        [XmlElement(\"iconID\")]\n        public int? IconID { get; set; }\n\n        [XmlElement(\"typeName\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"description\")]\n        public string Description { get; set; }\n\n        [XmlElement(\"mass\")]\n        public double Mass { get; set; }\n\n        [XmlElement(\"volume\")]\n        public double Volume { get; set; }\n\n        [XmlElement(\"capacity\")]\n        public double Capacity { get; set; }\n\n        [XmlElement(\"portionSize\")]\n        public int PortionSize { get; set; }\n\n        [XmlElement(\"raceID\")]\n        public int? RaceID { get; set; }\n\n        [XmlElement(\"marketGroupID\")]\n        public int? MarketGroupID { get; set; }\n\n        [XmlElement(\"basePrice\")]\n        public decimal BasePrice { get; set; }\n\n        [XmlElement(\"published\")]\n        public bool Published { get; set; }\n\n        [XmlIgnore]\n        public bool Generated { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/MapConstellations.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class MapConstellations : IHasID\n    {\n        [XmlElement(\"constellationID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"constellationName\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"regionID\")]\n        public int RegionID { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/MapRegions.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class MapRegions : IHasID\n    {\n        [XmlElement(\"regionID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"regionName\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"factionID\")]\n        public int? FactionID { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/MapSolarSystems.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class MapSolarSystems : IHasID\n    {\n        [XmlElement(\"solarSystemID\")]\n        public int ID { get; set; }\n\n        [XmlElement(\"solarSystemName\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"security\")]\n        public float SecurityLevel { get; set; }\n\n        [XmlElement(\"constellationID\")]\n        public int ConstellationID { get; set; }\n\n        [XmlElement(\"x\")]\n        public double X { get; set; }\n\n        [XmlElement(\"y\")]\n        public double Y { get; set; }\n\n        [XmlElement(\"z\")]\n        public double Z { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/MapSolarSystemsJump.cs",
    "content": "﻿using System.Xml.Serialization;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class MapSolarSystemsJump\n    {\n        [XmlElement(\"fromSolarSystemID\")]\n        public int A { get; set; }\n\n        [XmlElement(\"toSolarSystemID\")]\n        public int B { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/StaticData/StaStations.cs",
    "content": "﻿using System.Xml.Serialization;\nusing EVEMon.XmlGenerator.Interfaces;\n\nnamespace EVEMon.XmlGenerator.StaticData\n{\n    public sealed class StaStations : IHasLongID\n    {\n        [XmlElement(\"stationID\")]\n        public long ID { get; set; }\n\n        [XmlElement(\"stationName\")]\n        public string Name { get; set; }\n\n        [XmlElement(\"security\")]\n        public double SecurityLevel { get; set; }\n\n        [XmlElement(\"corporationID\")]\n        public int CorporationID { get; set; }\n\n        [XmlElement(\"solarSystemID\")]\n        public int SolarSystemID { get; set; }\n\n        [XmlElement(\"reprocessingEfficiency\")]\n        public float ReprocessingEfficiency { get; set; }\n\n        [XmlElement(\"reprocessingStationsTake\")]\n        public float ReprocessingStationsTake { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/Utils/Util.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing System.Xml.Serialization;\nusing EVEMon.Common.Data;\n\nnamespace EVEMon.XmlGenerator.Utils\n{\n    public static class Util\n    {\n        private static string s_text;\n        private static string s_solutionDir;\n        private static string s_outputPath;\n        private static string s_projectDir;\n        private static int s_counter;\n        private static int s_tablesCount;\n        private static int s_percentOld;\n\n\n        /// <summary>\n        /// Serializes a XML file to EVEMon.Common\\Resources.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"datafile\">The datafile.</param>\n        /// <param name=\"filename\">The filename.</param>\n        internal static void SerializeXml<T>(T datafile, string filename)\n        {\n            string path = Path.Combine(GetSolutionDirectory(), @\"src\\EVEMon.Common\\Resources\", filename);\n\n            FileStream stream = Common.Util.GetFileStream(path, FileMode.Create, FileAccess.Write);\n\n            using (GZipStream zstream = new GZipStream(stream, CompressionMode.Compress))\n            {\n                XmlSerializer serializer = new XmlSerializer(typeof(T));\n                serializer.Serialize(zstream, datafile);\n                zstream.Flush();\n            }\n\n            Console.WriteLine(@\"-----------------------------------------------\");\n            Console.WriteLine(@\"Updated : {0}\", filename);\n            Console.WriteLine(@\"-----------------------------------------------\");\n\n            // As long as EVEMon.Common is not rebuilt, files are not updated in output directories\n            Copy(path, Path.Combine(GetSolutionDirectory(), @\"src\\EVEMon.Common\\\", GetOutputPath(), \"Resources\", filename));\n\n            // Update the file in the settings directory\n            string appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);\n            Copy(path, Path.Combine(appData, \"EVEMon\", filename));\n\n            Console.WriteLine();\n        }\n\n        /// <summary>\n        /// Serializes a XML file to EVEMon.Common\\Serialization.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"serial\">The serial.</param>\n        /// <param name=\"xmlRootName\">Name of the xml root.</param>\n        /// <param name=\"filename\">The filename.</param>\n        internal static void SerializeXmlTo<T>(T serial, string xmlRootName, string filename)\n        {\n            string path = Path.Combine(GetSolutionDirectory(), @\"src\\EVEMon.Common\\Serialization\", filename);\n            using (FileStream stream = Common.Util.GetFileStream(path, FileMode.Create, FileAccess.Write))\n            {\n                XmlSerializer serializer = new XmlSerializer(typeof(T), new XmlRootAttribute(xmlRootName));\n                serializer.Serialize(stream, serial);\n                stream.Flush();\n            }\n\n            Console.WriteLine();\n        }\n\n        /// <summary>\n        /// Creates one file alongside the resources file containing\n        /// the MD5 sums for each resource.\n        /// </summary>\n        /// <param name=\"filename\">The filename.</param>\n        /// <exception cref=\"System.IO.FileNotFoundException\"></exception>\n        internal static void CreateMD5SumsFile(string filename)\n        {\n            ResetCounters();\n\n            Console.WriteLine();\n\n            string resourcesPath = Path.Combine(GetSolutionDirectory(), @\"src\\EVEMon.Common\\Resources\");\n            string md5SumsFileFullPath = Path.Combine(resourcesPath, filename);\n\n            using (StreamWriter md5SumsFile = File.CreateText(md5SumsFileFullPath))\n            {\n                foreach (string file in Datafile.GetFilesFrom(resourcesPath, Datafile.DatafilesExtension))\n                {\n                    FileInfo datafile = new FileInfo(file);\n                    if (!datafile.Exists)\n                        throw new FileNotFoundException($\"{file} not found!\");\n\n                    string line = $\"{Common.Util.CreateMD5From(file)} *{datafile.Name}\";\n                    md5SumsFile.WriteLine(line);\n                }\n            }\n\n            Console.WriteLine(@\"MD5Sums file created successfully\");\n            Console.WriteLine();\n        }\n\n        /// <summary>\n        /// Copies a file from source to destination.\n        /// </summary>\n        /// <param name=\"srcFile\">Fully qualified source filename</param>\n        /// <param name=\"destFile\">Fully quallified destination filename</param>\n        private static void Copy(string srcFile, string destFile)\n        {\n            try\n            {\n                FileInfo fi = new FileInfo(destFile);\n                if (fi.Directory == null)\n                    return;\n\n                if (fi.Directory.Exists && fi.Directory.Parent != null && fi.Directory.Parent.Parent != null)\n                {\n                    File.Copy(srcFile, destFile, true);\n                    Console.WriteLine(@\"*** {0}\\{1}\\{2}\", fi.Directory.Parent.Parent.Name, fi.Directory.Parent.Name,\n                        fi.Directory.Name);\n                }\n                else\n                {\n                    Trace.WriteLine($\"{fi.Directory.FullName} doesn't exist, copy failed\");\n                }\n            }\n            catch (IOException exc)\n            {\n                Trace.WriteLine(exc);\n            }\n            catch (UnauthorizedAccessException exc)\n            {\n                Trace.WriteLine(exc);\n            }\n        }\n\n\n        #region Helper Methods\n\n        /// <summary>\n        /// Gets the solution directory.\n        /// </summary>\n        /// <returns></returns>\n        private static string GetSolutionDirectory()\n        {\n            if (string.IsNullOrWhiteSpace(s_solutionDir))\n                s_solutionDir = Regex.Match(Directory.GetCurrentDirectory(), @\"[a-zA-Z]+:.*\\\\(?=tools)\",\n                    RegexOptions.Compiled | RegexOptions.IgnoreCase).ToString();\n            return s_solutionDir;\n        }\n\n        /// <summary>\n        /// Gets the project directory.\n        /// </summary>\n        /// <returns></returns>\n        private static string GetProjectDirectory()\n        {\n            if (string.IsNullOrWhiteSpace(s_projectDir))\n            {\n                s_projectDir = Regex.Match(Directory.GetCurrentDirectory(), @\"[a-zA-Z]+:.*\\\\(?=bin)\",\n                    RegexOptions.Compiled | RegexOptions.IgnoreCase).ToString();\n            }\n            return s_projectDir;\n        }\n\n        /// <summary>\n        /// Gets the output path.\n        /// </summary>\n        private static string GetOutputPath()\n        {\n            if (string.IsNullOrWhiteSpace(s_outputPath))\n            {\n                s_outputPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase.Remove(0, GetProjectDirectory().Length);\n            }\n            return s_outputPath;\n        }\n\n        /// <summary>\n        /// Resets the counters.\n        /// </summary>\n        internal static void ResetCounters()\n        {\n            if (Debugger.IsAttached)\n                Console.WriteLine(s_counter);\n\n            s_counter = 0;\n            s_percentOld = -1;\n            s_text = string.Empty;\n        }\n\n        /// <summary>\n        /// Updates the percantage done of the datafile generating procedure.\n        /// </summary>\n        /// <param name=\"totalCount\">The total count.</param>\n        internal static void UpdatePercentDone(double totalCount)\n        {\n            s_counter++;\n            double percent = totalCount > 0d ? s_counter / totalCount : 0d;\n            int percentRounded = (int)(percent * 100);\n\n            if (s_counter != 1 && s_percentOld >= percentRounded)\n                return;\n\n            s_percentOld = percentRounded;\n\n            if (!string.IsNullOrEmpty(s_text))\n                Console.SetCursorPosition(Console.CursorLeft - s_text.Length, Console.CursorTop);\n\n            s_text = $\"{percent:P0}\";\n            Console.Write(s_text);\n        }\n\n        /// <summary>\n        /// Updates the progress of data loaded from SQL server.\n        /// </summary>\n        /// <param name=\"totalCount\">The total count.</param>\n        internal static void UpdateProgress(int totalCount)\n        {\n            if (!string.IsNullOrEmpty(s_text))\n                Console.SetCursorPosition(Console.CursorLeft - s_text.Length, Console.CursorTop);\n\n            s_tablesCount++;\n            s_text = $\"{s_tablesCount / (double)totalCount:P0}\";\n            Console.Write(s_text);\n        }\n\n        /// <summary>\n        /// Gets the count of types in a specified namespace.\n        /// </summary>\n        /// <param name=\"nameSpace\">The namespace.</param>\n        /// <returns></returns>\n        internal static int GetCountOfTypesInNamespace(string nameSpace)\n            => typeof(Program).Assembly.GetTypes().Count(type => type.Namespace == nameSpace);\n\n        /// <summary>\n        /// Displays the end time.\n        /// </summary>\n        /// <param name=\"stopwatch\">The stopwatch.</param>\n        internal static void DisplayEndTime(Stopwatch stopwatch)\n        {\n            Console.WriteLine(@\" in {0:g}\", stopwatch.Elapsed);\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/XmlGenerator.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{9366D54A-B516-4A1D-987B-B1BCE31D2A72}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>EVEMon.XmlGenerator</RootNamespace>\n    <AssemblyName>EVEMonXmlGenerator</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <SolutionDir Condition=\"$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'\">..\\..\\</SolutionDir>\n    <RestorePackages>true</RestorePackages>\n    <TargetFrameworkProfile />\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\n    <DebugType>full</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\n    <DefineConstants>TRACE</DefineConstants>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <DefineConstants>TRACE</DefineConstants>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Snapshot|AnyCPU'\">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <DefineConstants>TRACE</DefineConstants>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\EntityFramework.6.2.0\\lib\\net45\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\EntityFramework.6.2.0\\lib\\net45\\EntityFramework.SqlServer.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Newtonsoft.Json.10.0.3\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Data.SQLite, Version=1.0.108.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\System.Data.SQLite.Core.1.0.108.0\\lib\\net46\\System.Data.SQLite.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Data.SQLite.EF6, Version=1.0.108.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\System.Data.SQLite.EF6.1.0.108.0\\lib\\net46\\System.Data.SQLite.EF6.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Data.SQLite.Linq, Version=1.0.108.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\System.Data.SQLite.Linq.1.0.108.0\\lib\\net46\\System.Data.SQLite.Linq.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Security\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Collections\\BagCollection.cs\" />\n    <Compile Include=\"Interfaces\\IHasLongId.cs\" />\n    <Compile Include=\"Models\\cloneStates.cs\" />\n    <Compile Include=\"Models\\industryActivitySkills.cs\" />\n    <Compile Include=\"Models\\industryActivityRaces.cs\" />\n    <Compile Include=\"Models\\industryActivityProducts.cs\" />\n    <Compile Include=\"Models\\industryActivityProbabilities.cs\" />\n    <Compile Include=\"Models\\industryActivityMaterials.cs\" />\n    <Compile Include=\"Models\\industryActivity.cs\" />\n    <Compile Include=\"Models\\industryBlueprints.cs\" />\n    <Compile Include=\"Providers\\Database.cs\" />\n    <Compile Include=\"Datafiles\\Blueprints.cs\" />\n    <Compile Include=\"Datafiles\\Geography.cs\" />\n    <Compile Include=\"Datafiles\\Items.cs\" />\n    <Compile Include=\"Datafiles\\Properties.cs\" />\n    <Compile Include=\"Datafiles\\Reprocessing.cs\" />\n    <Compile Include=\"Datafiles\\Skills.cs\" />\n    <Compile Include=\"Models\\agtAgents.cs\" />\n    <Compile Include=\"Models\\agtAgentTypes.cs\" />\n    <Compile Include=\"Models\\agtResearchAgents.cs\" />\n    <Compile Include=\"Models\\chrAncestries.cs\" />\n    <Compile Include=\"Models\\chrAttributes.cs\" />\n    <Compile Include=\"Models\\chrBloodlines.cs\" />\n    <Compile Include=\"Models\\chrFactions.cs\" />\n    <Compile Include=\"Models\\chrRaces.cs\" />\n    <Compile Include=\"Models\\crpActivities.cs\" />\n    <Compile Include=\"Models\\crpNPCCorporationDivisions.cs\" />\n    <Compile Include=\"Models\\crpNPCCorporationResearchFields.cs\" />\n    <Compile Include=\"Models\\crpNPCCorporations.cs\" />\n    <Compile Include=\"Models\\crpNPCCorporationTrades.cs\" />\n    <Compile Include=\"Models\\crpNPCDivisions.cs\" />\n    <Compile Include=\"Models\\certCerts.cs\" />\n    <Compile Include=\"Models\\dgmAttributeCategories.cs\" />\n    <Compile Include=\"Models\\dgmAttributeTypes.cs\" />\n    <Compile Include=\"Models\\dgmEffects.cs\" />\n    <Compile Include=\"Models\\dgmExpressions.cs\" />\n    <Compile Include=\"Models\\invTraits.cs\" />\n    <Compile Include=\"Models\\dgmTypeAttributes.cs\" />\n    <Compile Include=\"Models\\dgmTypeEffects.cs\" />\n    <Compile Include=\"Models\\eveGraphics.cs\" />\n    <Compile Include=\"Models\\eveIcons.cs\" />\n    <Compile Include=\"Models\\EveStaticData.cs\" />\n    <Compile Include=\"Models\\eveUnits.cs\" />\n    <Compile Include=\"Models\\invCategories.cs\" />\n    <Compile Include=\"Models\\invContrabandTypes.cs\" />\n    <Compile Include=\"Models\\invControlTowerResourcePurposes.cs\" />\n    <Compile Include=\"Models\\invControlTowerResources.cs\" />\n    <Compile Include=\"Models\\invFlags.cs\" />\n    <Compile Include=\"Models\\invGroups.cs\" />\n    <Compile Include=\"Models\\invItems.cs\" />\n    <Compile Include=\"Models\\invMarketGroups.cs\" />\n    <Compile Include=\"Models\\invMetaGroups.cs\" />\n    <Compile Include=\"Models\\invMetaTypes.cs\" />\n    <Compile Include=\"Models\\invNames.cs\" />\n    <Compile Include=\"Models\\invPositions.cs\" />\n    <Compile Include=\"Models\\invTypeMaterials.cs\" />\n    <Compile Include=\"Models\\invTypeReactions.cs\" />\n    <Compile Include=\"Models\\invTypes.cs\" />\n    <Compile Include=\"Models\\invUniqueNames.cs\" />\n    <Compile Include=\"Models\\mapCelestialStatistics.cs\" />\n    <Compile Include=\"Models\\mapConstellationJumps.cs\" />\n    <Compile Include=\"Models\\mapConstellations.cs\" />\n    <Compile Include=\"Models\\mapDenormalize.cs\" />\n    <Compile Include=\"Models\\mapJumps.cs\" />\n    <Compile Include=\"Models\\mapLandmarks.cs\" />\n    <Compile Include=\"Models\\mapLocationScenes.cs\" />\n    <Compile Include=\"Models\\mapLocationWormholeClasses.cs\" />\n    <Compile Include=\"Models\\mapRegionJumps.cs\" />\n    <Compile Include=\"Models\\mapRegions.cs\" />\n    <Compile Include=\"Models\\mapSolarSystemJumps.cs\" />\n    <Compile Include=\"Models\\mapSolarSystems.cs\" />\n    <Compile Include=\"Models\\mapUniverse.cs\" />\n    <Compile Include=\"Models\\planetSchematics.cs\" />\n    <Compile Include=\"Models\\planetSchematicsPinMap.cs\" />\n    <Compile Include=\"Models\\planetSchematicsTypeMap.cs\" />\n    <Compile Include=\"Models\\ramActivities.cs\" />\n    <Compile Include=\"Models\\ramAssemblyLineStations.cs\" />\n    <Compile Include=\"Models\\ramAssemblyLineTypeDetailPerCategory.cs\" />\n    <Compile Include=\"Models\\ramAssemblyLineTypeDetailPerGroup.cs\" />\n    <Compile Include=\"Models\\ramAssemblyLineTypes.cs\" />\n    <Compile Include=\"Models\\ramInstallationTypeContents.cs\" />\n    <Compile Include=\"Models\\sknLicenses.cs\" />\n    <Compile Include=\"Models\\sknMaterials.cs\" />\n    <Compile Include=\"Models\\sknSkins.cs\" />\n    <Compile Include=\"Models\\staOperations.cs\" />\n    <Compile Include=\"Models\\staOperationServices.cs\" />\n    <Compile Include=\"Models\\staServices.cs\" />\n    <Compile Include=\"Models\\staStations.cs\" />\n    <Compile Include=\"Models\\staStationTypes.cs\" />\n    <Compile Include=\"Models\\translationTables.cs\" />\n    <Compile Include=\"Models\\trnTranslationColumns.cs\" />\n    <Compile Include=\"Models\\trnTranslationLanguages.cs\" />\n    <Compile Include=\"Models\\trnTranslations.cs\" />\n    <Compile Include=\"Models\\warCombatZones.cs\" />\n    <Compile Include=\"Models\\warCombatZoneSystems.cs\" />\n    <Compile Include=\"Providers\\HoboleaksAlphaSkills.cs\" />\n    <Compile Include=\"StaticData\\ChrFactions.cs\" />\n    <Compile Include=\"StaticData\\CrtCertificates.cs\" />\n    <Compile Include=\"StaticData\\CrtRecommendations.cs\" />\n    <Compile Include=\"StaticData\\CrtRelationships.cs\" />\n    <Compile Include=\"StaticData\\DgmMasteries.cs\" />\n    <Compile Include=\"StaticData\\IndustryActivity.cs\" />\n    <Compile Include=\"StaticData\\IndustryActivityMaterials.cs\" />\n    <Compile Include=\"StaticData\\IndustryActivityProbabilities.cs\" />\n    <Compile Include=\"StaticData\\IndustryActivityProducts.cs\" />\n    <Compile Include=\"StaticData\\IndustryActivitySkills.cs\" />\n    <Compile Include=\"StaticData\\IndustryBlueprints.cs\" />\n    <Compile Include=\"StaticData\\InvItems.cs\" />\n    <Compile Include=\"StaticData\\InvTraits.cs\" />\n    <Compile Include=\"StaticData\\InvControlTowerResources.cs\" />\n    <Compile Include=\"StaticData\\InvControlTowerResourcePurposes.cs\" />\n    <Compile Include=\"StaticData\\InvFlags.cs\" />\n    <Compile Include=\"StaticData\\InvTypeReactions.cs\" />\n    <Compile Include=\"Xmlfiles\\Flags.cs\" />\n    <Compile Include=\"GlobalSuppressions.cs\" />\n    <Compile Include=\"Interfaces\\IHasId.cs\" />\n    <Compile Include=\"Collections\\RelationSetCollection.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Interfaces\\IRelation.cs\" />\n    <Compile Include=\"StaticData\\AgtAgents.cs\" />\n    <Compile Include=\"StaticData\\AgtAgentTypes.cs\" />\n    <Compile Include=\"StaticData\\AgtResearchAgents.cs\" />\n    <Compile Include=\"StaticData\\CrpNPCDivisions.cs\" />\n    <Compile Include=\"StaticData\\InvCategories.cs\" />\n    <Compile Include=\"StaticData\\InvNames.cs\" />\n    <Compile Include=\"StaticData\\InvTypeMaterials.cs\" />\n    <Compile Include=\"Extensions\\StringCleaning.cs\" />\n    <Compile Include=\"Utils\\Util.cs\" />\n    <Compile Include=\"StaticData\\DgmAttributeTypes.cs\" />\n    <Compile Include=\"StaticData\\DgmAttributeCategories.cs\" />\n    <Compile Include=\"StaticData\\DgmTypeAttributes.cs\" />\n    <Compile Include=\"StaticData\\DgmTypeEffects.cs\" />\n    <Compile Include=\"StaticData\\EveIcons.cs\" />\n    <Compile Include=\"StaticData\\EveUnits.cs\" />\n    <Compile Include=\"StaticData\\InvGroups.cs\" />\n    <Compile Include=\"StaticData\\InvMarketGroups.cs\" />\n    <Compile Include=\"StaticData\\InvMetaTypes.cs\" />\n    <Compile Include=\"StaticData\\InvTypes.cs\" />\n    <Compile Include=\"StaticData\\MapConstellations.cs\" />\n    <Compile Include=\"StaticData\\MapRegions.cs\" />\n    <Compile Include=\"StaticData\\MapSolarSystems.cs\" />\n    <Compile Include=\"StaticData\\MapSolarSystemsJump.cs\" />\n    <Compile Include=\"StaticData\\StaStations.cs\" />\n    <Compile Include=\"Collections\\IndexedCollection.cs\" />\n    <Compile Include=\"Xmlfiles\\Serialization\\SerialiazableRowset.cs\" />\n    <Compile Include=\"Xmlfiles\\Serialization\\SerializableInvFlagsRow.cs\" />\n    <Compile Include=\"Xmlfiles\\Serialization\\SerializableRoot.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\EVEMon.Common\\EVEMon.Common.csproj\">\n      <Project>{C0665275-3E0B-4117-81B0-751206ED03CD}</Project>\n      <Name>EVEMon.Common</Name>\n      <Private>True</Private>\n      <Properties>SkipValidatePackageReferences=true</Properties>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"App.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Service Include=\"{508349B6-6B84-4DF5-91F0-309BEEBAD82D}\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n    <None Include=\"sqlite-latest.sqlite\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PostBuildEvent>rd /s /q \"$(TargetDir)\"Resources\ndel \"$(TargetDir)\"Google*\ndel \"$(TargetDir)\"*office*\ndel \"$(TargetDir)\"*outlook*\ndel \"$(TargetDir)\"*SharpZipLib*\ndel \"$(TargetDir)\"YamlDotNet*\ndel \"$(TargetDir)\"Dropbox*\ndel \"$(TargetDir)\"OneDrive*\ndel \"$(TargetDir)\"Microsoft*\ndel \"$(TargetDir)\"Zlib*\nif exist \"$(TargetDir)\"stdole.dll del \"$(TargetDir)\"stdole.dll</PostBuildEvent>\n  </PropertyGroup>\n  <Import Project=\"..\\..\\packages\\System.Data.SQLite.Core.1.0.108.0\\build\\net46\\System.Data.SQLite.Core.targets\" Condition=\"Exists('..\\..\\packages\\System.Data.SQLite.Core.1.0.108.0\\build\\net46\\System.Data.SQLite.Core.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\..\\packages\\System.Data.SQLite.Core.1.0.108.0\\build\\net46\\System.Data.SQLite.Core.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\packages\\System.Data.SQLite.Core.1.0.108.0\\build\\net46\\System.Data.SQLite.Core.targets'))\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "tools/XmlGenerator/Xmlfiles/Flags.cs",
    "content": "using System;\nusing System.Diagnostics;\nusing System.Linq;\nusing EVEMon.Common.Collections;\nusing EVEMon.XmlGenerator.Providers;\nusing EVEMon.XmlGenerator.Utils;\nusing EVEMon.XmlGenerator.Xmlfiles.Serialization;\n\nnamespace EVEMon.XmlGenerator.Xmlfiles\n{\n    public static class Flags\n    {\n        internal static void GenerateXmlfile()\n        {\n            Stopwatch stopwatch = Stopwatch.StartNew();\n\n            Console.WriteLine();\n            Console.Write(@\"Generating Flags Xml file\");\n\n            SerializableRoot<SerializableInvFlagsRow> flags = new SerializableRoot<SerializableInvFlagsRow>\n            {\n                Rowset = new SerialiazableRowset<SerializableInvFlagsRow>\n                {\n                    Name = \"flags\",\n                    Key = \"flagID\",\n                    Columns = \"flagID,flagName,flagText\"\n                }\n            };\n\n            flags.Rowset.Rows.AddRange(Database.InvFlagsTable.Select(\n                flag => new SerializableInvFlagsRow\n                {\n                    ID = flag.ID,\n                    Name = flag.Name,\n                    Text = flag.Text\n                }));\n\n            Util.DisplayEndTime(stopwatch);\n            Console.WriteLine();\n\n            // Serialize\n            Util.SerializeXmlTo(flags, \"invFlags\", \"Flags.xml\");\n        }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/Xmlfiles/Serialization/SerialiazableRowset.cs",
    "content": "using System.Collections.ObjectModel;\nusing System.Xml.Serialization;\n\nnamespace EVEMon.XmlGenerator.Xmlfiles.Serialization\n{\n    public class SerialiazableRowset<T>\n    {\n        private readonly Collection<T> m_rows;\n\n        public SerialiazableRowset()\n        {\n            m_rows = new Collection<T>();\n        }\n        \n        [XmlAttribute(\"name\")]\n        public string Name { get; set; }\n\n        [XmlAttribute(\"key\")]\n        public string Key { get; set; }\n\n        [XmlAttribute(\"columns\")]\n        public string Columns { get; set; }\n\n        [XmlElement(\"row\")]\n        public Collection<T> Rows => m_rows;\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/Xmlfiles/Serialization/SerializableInvFlagsRow.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.XmlGenerator.Xmlfiles.Serialization\n{\n    public class SerializableInvFlagsRow\n    {\n        [XmlAttribute(\"flagID\")]\n        public int ID { get; set; }\n\n        [XmlAttribute(\"flagName\")]\n        public string Name { get; set; }\n\n        [XmlAttribute(\"flagText\")]\n        public string Text { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/Xmlfiles/Serialization/SerializableRoot.cs",
    "content": "using System.Xml.Serialization;\n\nnamespace EVEMon.XmlGenerator.Xmlfiles.Serialization\n{\n    public class SerializableRoot<T>\n    {\n        [XmlElement(\"rowset\")]\n        public SerialiazableRowset<T> Rowset { get; set; }\n    }\n}"
  },
  {
    "path": "tools/XmlGenerator/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"6.2.0\" targetFramework=\"net461\" />\n  <package id=\"Newtonsoft.Json\" version=\"10.0.3\" targetFramework=\"net461\" />\n  <package id=\"System.Data.SQLite\" version=\"1.0.108.0\" targetFramework=\"net461\" />\n  <package id=\"System.Data.SQLite.Core\" version=\"1.0.108.0\" targetFramework=\"net461\" />\n  <package id=\"System.Data.SQLite.EF6\" version=\"1.0.108.0\" targetFramework=\"net461\" />\n  <package id=\"System.Data.SQLite.Linq\" version=\"1.0.108.0\" targetFramework=\"net461\" />\n</packages>"
  },
  {
    "path": "updates/patch.xml",
    "content": "﻿<?xml version=\"1.0\"?>\n<evemon xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <newest>\n    <date>06 November 2020</date>\n    <version>4.0.19.4983</version>\n    <md5>918ea2a2cbeb51ace24989206a8716fa</md5>\n    <url>https://forums.eveonline.com/t/evemon-4-0-19-beta-under-new-ownership-conversion-for-esi/75953</url>\n    <autopatchurl>https://github.com/peterhaneve/evemon/releases/download/4.0.19/EVEMon-install-4.0.19.exe</autopatchurl>\n    <autopatchargs>/S /AUTORUN /SKIPDOTNET</autopatchargs>\n    <additionalargs>/D=%EVEMON_EXECUTABLE_PATH%</additionalargs>\n    <message><![CDATA[# Release v4.0.19\n\n## New Features\n- Manage Plans window now shows the matching character name in the title bar\n\n## Bug Fixes\n- Auto-Updater now uses the correct URL after GitHub migration of branch names due to the United States Black Lives Matter movement\n- Remove outdated and nonfunctional EVE Gate support\n- Logitech G15 support re-enabled as it apparently is still functional on newer models of keyboards\n\n## Contributors\n- Peter Han\n- NevarrTivianne]]></message>\n  </newest>\n  <releases>\n    <release>\n      <date>17 March 2021</date>\n      <version>4.0.20.4986</version>\n      <md5>76f89e810a199ff0a90aef82571ebfaf</md5>\n      <url>https://forums.eveonline.com/t/evemon-4-0-20-beta-under-new-ownership-conversion-for-esi/75953</url>\n      <autopatchurl>https://github.com/peterhaneve/evemon/releases/download/4.0.20/EVEMon-install-4.0.20.exe</autopatchurl>\n      <autopatchargs>/S /AUTORUN /SKIPDOTNET</autopatchargs>\n      <additionalargs>/D=%EVEMON_EXECUTABLE_PATH%</additionalargs>\n      <message><![CDATA[# Release v4.0.20\n\n## New Features\n- Skill injector requirements in the Skill Planner now include an estimate of the cost in the tooltip text\n\n## Bug Fixes\n- Manual workaround for missing skill information on new Fleet skills from SDE\n- Fix a potential race condition in asset lookup\n- Greatly improve speed of asset price lookups, and add Fuzzworks Market as an available provider\n\n## Contributors\n- Peter Han\n- NevarrTivianne]]></message>\n    </release>\n  </releases>\n  <datafiles>\n    <datafile>\n      <name>eve-blueprints-en-US.xml.gzip</name>\n      <date>17 March 2021</date>\n      <md5>df91ac86ac9954dfaff13ab77681a1cc</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) blueprints data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-certificates-en-US.xml.gzip</name>\n      <date>05 June 2018</date>\n      <md5>540000f7c111354769a54fa31e57d411</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) certificates data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-geography-en-US.xml.gzip</name>\n      <date>17 March 2021</date>\n      <md5>3077e700023d84a267b744a6ee44acc7</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) geography data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-items-en-US.xml.gzip</name>\n      <date>17 March 2021</date>\n      <md5>4c9cb667e22421fad8ca08777be7fd8a</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) items data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-masteries-en-US.xml.gzip</name>\n      <date>05 June 2018</date>\n      <md5>3668b50996fc40a0c0853fec427b5712</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) masteries data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-properties-en-US.xml.gzip</name>\n      <date>17 March 2021</date>\n      <md5>1f6ae9f613fd26b08d5ec206d0958d79</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) properties data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-reprocessing-en-US.xml.gzip</name>\n      <date>17 March 2021</date>\n      <md5>adb83f4fc55f61a58548dcb924a91cfe</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) reprocessing data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n    <datafile>\n      <name>eve-skills-en-US.xml.gzip</name>\n      <date>17 March 2021</date>\n      <md5>727a781211b138cf331afed346692962</md5>\n      <url>https://peterhaneve.github.io/evemon-datafiles/Reign/1885884</url>\n      <message><![CDATA[Reign 1.0 (1885884) skills data file by the EVEMon Development Team\nNOT COMPATIBLE with EVEMon prior to version 2.2.0]]></message>\n    </datafile>\n  </datafiles>\n</evemon>"
  }
]